Philipp Hörist pushed to branch master at gajim / gajim
Commits: bfa05b72 by Philipp Hörist at 2023-01-05T20:05:13+01:00 chore: Update .gitignore
- - - - - 5a9012d7 by Philipp Hörist at 2023-01-05T20:31:53+01:00 refactor: Plugins: Move plugin events into own module
This avoids import cycles
- - - - - 015662ba by Philipp Hörist at 2023-01-05T20:55:32+01:00 refactor: Plugins: Use relative imports
This avoids import circles
- - - - - 7c1a0047 by Philipp Hörist at 2023-01-05T21:14:11+01:00 refactor: Rows: Move click handler into message module
This avoids import circles
- - - - -
11 changed files:
- .gitignore - gajim/common/events.py - gajim/gtk/conversation/rows/message.py - gajim/gtk/conversation/rows/widgets.py - gajim/gtk/plugins.py - + gajim/plugins/events.py - gajim/plugins/gajimplugin.py - gajim/plugins/helpers.py - gajim/plugins/manifest.py - gajim/plugins/pluginmanager.py - gajim/plugins/repository.py
Changes:
===================================== .gitignore ===================================== @@ -33,3 +33,5 @@ node_modules/ # IDE files
.vscode +*.sublime-project +*.sublime-workspace
===================================== gajim/common/events.py ===================================== @@ -45,7 +45,6 @@ if typing.TYPE_CHECKING: from gajim.common.client import Client from gajim.common.modules.httpupload import HTTPFileTransfer - from gajim.plugins.manifest import PluginManifest
ChatListEventT = Union[ 'MessageReceived', @@ -451,18 +450,6 @@ class RosterPush(ApplicationEvent): item: RosterItem
-@dataclass -class PluginAdded(ApplicationEvent): - name: str = field(init=False, default='plugin-added') - manifest: PluginManifest - - -@dataclass -class PluginRemoved(ApplicationEvent): - name: str = field(init=False, default='plugin-removed') - manifest: PluginManifest - - @dataclass class SearchFormReceivedEvent(ApplicationEvent): name: str = field(init=False, default='search-form-received')
===================================== gajim/gtk/conversation/rows/message.py ===================================== @@ -43,9 +43,11 @@ from gajim.common.modules.contacts import GroupchatContact from gajim.common.modules.contacts import GroupchatParticipant from gajim.common.types import ChatContactT +from gajim.gtk.menus import get_chat_row_menu
from ...preview import PreviewWidget from ...util import format_fingerprint +from ...util import GajimPopover from ..message_widget import MessageWidget from .base import BaseRow from .widgets import AvatarBox @@ -186,7 +188,7 @@ def __init__(self, self._bottom_box.set_halign(Gtk.Align.END) self._message_widget.set_direction(Gtk.TextDirection.RTL)
- more_menu_button = MoreMenuButton(self, self._contact, name) + more_menu_button = MoreMenuButton(self._on_more_menu_button_clicked) self._bottom_box.pack_end(more_menu_button, False, True, 0)
self.grid.attach(self._avatar_box, 0, 0, 1, 2) @@ -195,6 +197,19 @@ def __init__(self,
self.show_all()
+ def _on_more_menu_button_clicked(self, button: Gtk.Button) -> None: + menu = get_chat_row_menu( + self._contact, + self.name, + self.get_text(), + self.timestamp, + self.message_id, + self.stanza_id, + self.log_line_id) + + popover = GajimPopover(menu, relative_to=button) + popover.popup() + def enable_selection_mode(self) -> None: if isinstance(self._message_widget, MessageWidget): self._message_widget.set_selectable(False)
===================================== gajim/gtk/conversation/rows/widgets.py ===================================== @@ -14,8 +14,9 @@
from __future__ import annotations
+from typing import Any +from typing import Callable from typing import Optional -from typing import TYPE_CHECKING
from datetime import datetime
@@ -31,10 +32,6 @@ from gajim.common.modules.contacts import GroupchatContact from gajim.common.types import ChatContactT
-if TYPE_CHECKING: - from .message import MessageRow - -from ...menus import get_chat_row_menu from ...menus import get_groupchat_participant_menu from ...util import GajimPopover from ...util import get_cursor @@ -52,11 +49,7 @@ def __init__(self) -> None:
@wrap_with_event_box class MoreMenuButton(Gtk.Button): - def __init__(self, - row: MessageRow, - contact: ChatContactT, - name: str - ) -> None: + def __init__(self, on_click_handler: Callable[[Gtk.Button], Any]) -> None:
Gtk.Button.__init__(self) self.set_valign(Gtk.Align.START) @@ -66,27 +59,10 @@ def __init__(self,
self.get_style_context().add_class('conversation-more-button')
- self._row = row - self._contact = contact - self._name = name - image = Gtk.Image.new_from_icon_name( 'feather-more-horizontal-symbolic', Gtk.IconSize.BUTTON) self.add(image) - self.connect('clicked', self._on_click) - - def _on_click(self, _button: Gtk.Button) -> None: - menu = get_chat_row_menu( - self._contact, - self._name, - self._row.get_text(), - self._row.timestamp, - self._row.message_id, - self._row.stanza_id, - self._row.log_line_id) - - popover = GajimPopover(menu, relative_to=self) - popover.popup() + self.connect('clicked', on_click_handler)
class DateTimeLabel(Gtk.Label):
===================================== gajim/gtk/plugins.py ===================================== @@ -30,8 +30,6 @@ from gajim.common import app from gajim.common import configpaths from gajim.common import ged -from gajim.common.events import PluginAdded -from gajim.common.events import PluginRemoved from gajim.common.exceptions import PluginsystemError from gajim.common.helpers import open_uri from gajim.common.i18n import _ @@ -43,6 +41,8 @@ from gajim.gui.filechoosers import ArchiveChooserDialog from gajim.gui.util import EventHelper from gajim.gui.util import load_icon_pixbuf +from gajim.plugins.events import PluginAdded +from gajim.plugins.events import PluginRemoved from gajim.plugins.helpers import GajimPluginActivateException from gajim.plugins.manifest import PluginManifest
===================================== gajim/plugins/events.py ===================================== @@ -0,0 +1,33 @@ +# This file is part of Gajim. +# +# Gajim is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Gajim is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Gajim. If not, see http://www.gnu.org/licenses/. + +from dataclasses import dataclass +from dataclasses import field + +from gajim.common.events import ApplicationEvent + +from .manifest import PluginManifest + + +@dataclass +class PluginAdded(ApplicationEvent): + name: str = field(init=False, default='plugin-added') + manifest: PluginManifest + + +@dataclass +class PluginRemoved(ApplicationEvent): + name: str = field(init=False, default='plugin-removed') + manifest: PluginManifest
===================================== gajim/plugins/gajimplugin.py ===================================== @@ -25,7 +25,8 @@ from gajim.common.ged import HandlerFuncT from gajim.common.modules.base import BaseModule from gajim.common.types import PluginExtensionPoints -from gajim.plugins.manifest import PluginManifest + +from .manifest import PluginManifest
log = logging.getLogger('gajim.p.plugin')
===================================== gajim/plugins/helpers.py ===================================== @@ -18,7 +18,9 @@
from gajim.common import configpaths from gajim.gui.builder import Builder -from gajim.plugins import plugins_i18n + +from .plugins_i18n import _ +from .plugins_i18n import DOMAIN
class GajimPluginActivateException(Exception): @@ -30,8 +32,8 @@ class GajimPluginActivateException(Exception): def get_builder(file_name: str, widgets: Optional[list[str]] = None) -> Builder: return Builder(file_name, # pyright: ignore widgets, - domain=plugins_i18n.DOMAIN, - gettext_=plugins_i18n._) + domain=DOMAIN, + gettext_=_)
def is_shipped_plugin(path: Path) -> bool:
===================================== gajim/plugins/manifest.py ===================================== @@ -26,8 +26,9 @@ from packaging.version import Version as V
import gajim -from gajim.plugins.helpers import is_shipped_plugin -from gajim.plugins.plugins_i18n import _ as p_ + +from .helpers import is_shipped_plugin +from .plugins_i18n import _ as p_
BLOCKED_PLUGINS = [ 'appindicator_integration',
===================================== gajim/plugins/pluginmanager.py ===================================== @@ -33,16 +33,17 @@ from gajim.common import configpaths from gajim.common import modules from gajim.common.client import Client -from gajim.common.events import PluginAdded -from gajim.common.events import PluginRemoved from gajim.common.exceptions import PluginsystemError from gajim.common.i18n import _ from gajim.common.util.classes import Singleton -from gajim.plugins.gajimplugin import GajimPlugin -from gajim.plugins.gajimplugin import GajimPluginException -from gajim.plugins.helpers import GajimPluginActivateException -from gajim.plugins.helpers import is_shipped_plugin -from gajim.plugins.manifest import PluginManifest + +from .events import PluginAdded +from .events import PluginRemoved +from .gajimplugin import GajimPlugin +from .gajimplugin import GajimPluginException +from .helpers import GajimPluginActivateException +from .helpers import is_shipped_plugin +from .manifest import PluginManifest
log = logging.getLogger('gajim.p.manager')
===================================== gajim/plugins/repository.py ===================================== @@ -29,7 +29,8 @@ from gajim.common import configpaths from gajim.common.helpers import Observable from gajim.common.util.http import create_http_request -from gajim.plugins.manifest import PluginManifest + +from .manifest import PluginManifest
log = logging.getLogger('gajim.p.repository')
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/compare/b81e8ac8d72ae21e1ffc5095929e34a9...