Philipp Hörist pushed to branch unify-control at gajim / gajim
Commits: f47e790f by lovetox at 2022-08-07T13:50:12+02:00 fix: Remove ControlStack and rework all methods using it
- - - - - 77f81d8b by lovetox at 2022-08-07T14:47:12+02:00 fix: Make control init work
- - - - -
16 changed files:
- gajim/gtk/application.py - gajim/gtk/chat_action_processor.py - gajim/gtk/chat_list.py - gajim/gtk/chat_page.py - gajim/gtk/chat_stack.py - gajim/gtk/control.py - − gajim/gtk/control_stack.py - gajim/gtk/conversation/jump_to_end_button.py - gajim/gtk/groupchat_roster.py - gajim/gtk/main.py - gajim/gtk/message_actions_box.py - gajim/gtk/preferences.py - gajim/gtk/search_view.py - gajim/gtk/types.py - gajim/gui_interface.py - pyrightconfig.json
Changes:
===================================== gajim/gtk/application.py ===================================== @@ -787,14 +787,14 @@ def _on_remove_history_action(_action: Gio.SimpleAction, params: structs.RemoveHistoryActionParams ) -> None: def _remove() -> None: + app.storage.archive.remove_history(params.account, params.jid) + control = app.window.get_control() if params.jid is not None: - app.storage.archive.remove_history(params.account, params.jid) - control = app.window.get_control(params.account, params.jid) - if control is not None: - control.reset_view() - else: - for control in app.window.get_controls(params.account): - control.reset_view() + if not control.is_loaded(params.account, params.jid): + return + + control.reset_view() + ConfirmationDialog( _('Remove Chat History'), _('Remove Chat History?'),
===================================== gajim/gtk/chat_action_processor.py ===================================== @@ -122,11 +122,13 @@ def _replace_text(self, selected_action: str) -> None: self._buf.insert(start_iter, selected_action)
def _get_commands(self) -> list[str]: + # TODO + return [] + commands: list[str] = [] assert self._account assert self._contact - control = app.window.get_control(self._account, self._contact.jid) - assert control is not None + control = app.window.get_control() for command in control.list_commands(): for name in command.names: commands.append(name)
===================================== gajim/gtk/chat_list.py ===================================== @@ -819,8 +819,10 @@ def _get_unread_string(count: int) -> str: return '999+'
def add_unread(self, text: str) -> None: - control = app.window.get_control(self.account, self.jid) - if self.is_active and control is not None and control.get_autoscroll(): + control = app.window.get_control() + if (self.is_active and + control.is_loaded(self.account, self.jid) and + control.get_autoscroll()): return
self._unread_count += 1
===================================== gajim/gtk/chat_page.py ===================================== @@ -35,7 +35,6 @@ from .chat_list import ChatList from .chat_list_stack import ChatListStack from .chat_stack import ChatStack -from .control_stack import ControlStack from .search_view import SearchView from .types import ControlT
@@ -61,7 +60,7 @@ def __init__(self): self._chat_stack = ChatStack() self._ui.right_grid_overlay.add(self._chat_stack)
- self._control_stack = self._chat_stack.get_control_stack() + self._chat_control = self._chat_stack.get_chat_control()
self._search_view = SearchView() self._search_view.connect('hide-search', self._on_search_hide) @@ -124,9 +123,6 @@ def get_chat_list_stack(self) -> ChatListStack: def get_chat_stack(self) -> ChatStack: return self._chat_stack
- def get_control_stack(self) -> ControlStack: - return self._control_stack - @staticmethod def _on_start_chat_clicked(_button: Gtk.Button) -> None: app.app.activate_action('start-chat', GLib.Variant('s', '')) @@ -166,9 +162,10 @@ def _on_search_history(self, _action: Gio.SimpleAction, _param: Literal[None]) -> None:
- control = self.get_active_control() - if control is not None: - self._search_view.set_context(control.account, control.contact.jid) + if self._chat_control.has_active_chat(): + self._search_view.set_context(self._chat_control.account, + self._chat_control.contact.jid) + self._search_view.clear() self._search_revealer.set_reveal_child(True) self._search_view.set_focus() @@ -232,16 +229,6 @@ def add_chat_for_workspace(self, self._chat_list_stack.select_chat(account, jid) return
- if type_ == 'groupchat': - self._control_stack.add_group_chat(account, jid) - elif type_ == 'pm': - if not self._startup_finished: - # TODO: Currently we can’t load private chats at start - # because the Contacts dont exist yet - return - self._control_stack.add_private_chat(account, jid) - else: - self._control_stack.add_chat(account, jid) self._chat_list_stack.add_chat(workspace_id, account, jid, type_, pinned)
@@ -285,7 +272,8 @@ def remove_chat(self, account: str, jid: JID) -> None:
def _on_chat_removed(self, _chat_list: ChatList, account: str, jid: JID, type_: str) -> None: - self._control_stack.remove_chat(account, jid) + + self._chat_control.clear() if type_ == 'groupchat': client = app.get_client(account) client.get_module('MUC').leave(jid) @@ -296,23 +284,12 @@ def remove_chats_for_account(self, account: str) -> None: chat_list.unselect_all()
self._chat_list_stack.remove_chats_for_account(account) - self._control_stack.remove_chats_for_account(account) - - def get_control(self, account: str, jid: JID) -> Optional[ControlT]: - return self._control_stack.get_control(account, jid) - - def get_active_control(self) -> Optional[ControlT]: - chat = self._chat_list_stack.get_selected_chat() - if chat is None: - return None - return self.get_control(chat.account, chat.jid) - - def is_chat_loaded(self, account: str, jid: JID) -> bool: - return self._control_stack.is_chat_loaded(account, jid) + if self._chat_control.has_active_chat(): + if self._chat_control.contact.account == account: + self._chat_control.clear()
- def get_controls(self, account: Optional[str] - ) -> Generator[ControlT, None, None]: - return self._control_stack.get_controls(account) + def get_control(self) -> ControlT: + return self._chat_control
def hide_search(self) -> bool: if self._search_revealer.get_reveal_child():
===================================== gajim/gtk/chat_stack.py ===================================== @@ -44,8 +44,7 @@ from .chat_banner import ChatBanner from .chat_function_page import ChatFunctionPage from .const import TARGET_TYPE_URI_LIST -from .control_stack import ControlStack -from .controls.groupchat import GroupchatControl +from .control import ChatControl from .message_actions_box import MessageActionsBox from .util import EventHelper, open_window
@@ -70,13 +69,13 @@ def __init__(self): self.add_named(self._chat_function_page, 'function')
self._chat_banner = ChatBanner() - self._control_stack = ControlStack() + self._chat_control = ChatControl() self._message_action_box = MessageActionsBox()
box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) box.add(self._chat_banner) box.add(Gtk.Separator()) - box.add(self._control_stack) + box.add(self._chat_control) box.add(Gtk.Separator()) box.add(self._message_action_box)
@@ -139,8 +138,8 @@ def process_escape(self) -> bool: return True return False
- def get_control_stack(self) -> ControlStack: - return self._control_stack + def get_chat_control(self) -> ChatControl: + return self._chat_control
def get_message_action_box(self) -> MessageActionsBox: return self._message_action_box @@ -157,7 +156,7 @@ def show_chat(self, account: str, jid: JID) -> None: self._current_contact = client.get_module('Contacts').get_contact(jid)
self._chat_banner.switch_contact(account, jid) - self._control_stack.show_chat(account, jid) + self._chat_control.switch_contact(self._current_contact) self._message_action_box.switch_contact(self._current_contact)
self._update_base_actions(self._current_contact) @@ -409,7 +408,6 @@ def _on_action(self, account = contact.account client = app.get_client(account) jid = contact.jid - current_control = self._control_stack.get_current_control()
if action_name == 'send-message': self._on_send_message() @@ -442,8 +440,7 @@ def _on_action(self, open_window('AddContact', account=account, jid=jid)
elif action_name == 'clear-chat': - assert current_control is not None - current_control.reset_view() + self._chat_control.reset_view()
elif action_name == 'show-contact-info': if isinstance(contact, GroupchatContact): @@ -466,7 +463,6 @@ def _on_action(self, self._show_chat_function_page('change-nickname')
elif action_name == 'muc-execute-command': - assert isinstance(current_control, GroupchatControl) nick = None if param is not None: nick = param.get_string() @@ -477,13 +473,11 @@ def _on_action(self, open_window('AdHocCommands', account=account, jid=jid)
elif action_name == 'muc-kick': - assert isinstance(current_control, GroupchatControl) assert param is not None kick_nick = param.get_string() self._show_chat_function_page('kick', data=kick_nick)
elif action_name == 'muc-ban': - assert isinstance(current_control, GroupchatControl) assert param is not None ban_jid = param.get_string() self._show_chat_function_page('ban', data=ban_jid) @@ -519,9 +513,8 @@ def _on_drag_data_received(self,
# TODO: Contact drag and drop for invitations (AdHoc MUC/MUC) if target_type == TARGET_TYPE_URI_LIST: - control = app.window.get_active_control() - if control is not None: - control.drag_data_file_transfer(selection) + if self._chat_control.has_active_chat(): + self._chat_control.drag_data_file_transfer(selection)
def _on_drag_leave(self, _widget: Gtk.Widget, @@ -569,17 +562,13 @@ def _on_function_message(self, _function_page: ChatFunctionPage, message: str ) -> None: - control = self._control_stack.get_current_control() - assert control is not None - control.add_info_message(message) + + self._chat_control.add_info_message(message)
def _on_send_message(self) -> None: self._message_action_box.msg_textview.replace_emojis() message = self._message_action_box.msg_textview.get_text()
- control = self._control_stack.get_current_control() - assert control is not None - contact = self._current_contact assert contact is not None
@@ -588,7 +577,7 @@ def _on_send_message(self) -> None: self.sendmessage = True app.plugin_manager.extension_point( 'send_message' + encryption, - control) + self._chat_control) if not self.sendmessage: return
@@ -622,7 +611,7 @@ def _on_send_message(self) -> None: type_=type_, chatstate=chatstate, label=label, - control=control, + control=self._chat_control, correct_id=correct_id)
client.send_message(message_) @@ -647,12 +636,12 @@ def clear(self) -> None: self.set_visible_child_name('empty') self._chat_banner.clear() self._message_action_box.clear() - self._control_stack.clear() + self._chat_control.clear()
def process_event(self, event: Any) -> None: if isinstance(event, MucDiscoUpdate): self._on_muc_disco_update(event) - self._control_stack.process_event(event) + self._chat_control.process_event(event) self._message_action_box.process_event(event)
===================================== gajim/gtk/control.py ===================================== @@ -22,7 +22,6 @@ import os import logging import time -import uuid
from gi.repository import Gtk from gi.repository import GLib @@ -36,11 +35,9 @@
from gajim.common import app from gajim.common import events -from gajim.common import ged from gajim.common import helpers from gajim.common.helpers import message_needs_highlight from gajim.common.helpers import get_file_path_from_dnd_dropped_uri -from gajim.common.helpers import event_filter from gajim.common.helpers import to_user_string from gajim.common.i18n import _ from gajim.common.ged import EventHelper @@ -66,33 +63,24 @@ from gajim.gui.groupchat_roster import GroupchatRoster from gajim.gui.groupchat_state import GroupchatState
-log = logging.getLogger('gajim.gui.controls.base') +log = logging.getLogger('gajim.gui.control')
class ChatControl(EventHelper): - - _type: Optional[ControlType] = None - - def __init__(self, widget_name: str, account: str, jid: JID) -> None: + def __init__(self) -> None: EventHelper.__init__(self)
self.handlers: dict[int, Any] = {}
- self.account = account - - self._client = app.get_client(account) - - groupchat = self._type != ControlType.CHAT - self.contact = self._client.get_module('Contacts').get_contact( - jid, groupchat=groupchat) - - self.control_id: str = str(uuid.uuid4()) + self.account = None + self.contact = None + self._client = None
self.xml = get_builder('chat_control.ui') self.widget = cast(Gtk.Box, self.xml.get_object('control_box'))
# Create ConversationView and connect signals - self.conversation_view = ConversationView(self.account, self.contact) + self.conversation_view = ConversationView()
self._scrolled_view = ScrolledView() self._scrolled_view.add(self.conversation_view) @@ -100,7 +88,7 @@ def __init__(self, widget_name: str, account: str, jid: JID) -> None:
self.xml.conv_view_overlay.add(self._scrolled_view)
- self._jump_to_end_button = JumpToEndButton(self.contact) + self._jump_to_end_button = JumpToEndButton() self._jump_to_end_button.connect('clicked', self._on_jump_to_end) self.xml.conv_view_overlay.add_overlay(self._jump_to_end_button)
@@ -115,12 +103,6 @@ def __init__(self, widget_name: str, account: str, jid: JID) -> None: # XEP-0333 Chat Markers self.last_msg_id: Optional[str] = None
- # XEP-0172 User Nickname - # TODO: - self.user_nick: Optional[str] = None - - self._client.get_module('Chatstate').set_active(self.contact) - self.encryption: Optional[str] = self.get_encryption_state() self.conversation_view.encryption_enabled = self.encryption is not None
@@ -151,12 +133,33 @@ def __init__(self, widget_name: str, account: str, jid: JID) -> None:
# self._set_control_inactive()
+ def is_loaded(self, account: str, jid: JID) -> bool: + if self.contact is None: + return False + return self.contact.account == account and self.contact.jid == jid + + def has_active_chat(self) -> bool: + return self.contact is not None + + def clear(self) -> None: + self.contact.disconnect_all_from_obj(self) + self.contact = None + self._clinet = None + self.account = None + self.reset_view() + def switch_contact(self, contact: Union[BareContact, GroupchatContact, GroupchatParticipant]) -> None:
self.contact.disconnect_all_from_obj(self) self.contact = contact + self.account = contact.account + + self._client = app.get_client(contact.account) + + self._jump_to_end_button.switch_contact(contact) + self.conversation_view.switch_contact(contact)
if isinstance(self.contact, GroupchatParticipant): self.contact.multi_connect({ @@ -184,6 +187,8 @@ def switch_contact(self, contact: Union[BareContact, 'room-subject': self._on_room_subject, })
+ self._client.get_module('Chatstate').set_active(self.contact) + def process_event(self, event: events.ApplicationEvent) -> None: if event.account != self.account: return @@ -338,7 +343,7 @@ def get_our_nick(self) -> str:
def _allow_add_message(self) -> bool: # Only add messages if the view is already populated - return self.is_chat_loaded and self._scrolled_view.get_lower_complete() + return self._chat_loaded and self._scrolled_view.get_lower_complete()
def add_info_message(self, text: str) -> None: self.conversation_view.add_info_message(text) @@ -491,10 +496,6 @@ def load_messages(self) -> None:
self.fetch_n_lines_history(self._scrolled_view, True, 20)
- @property - def is_chat_loaded(self) -> bool: - return self._chat_loaded - def reset_view(self) -> None: self._chat_loaded = False self.conversation_view.clear()
===================================== gajim/gtk/control_stack.py deleted ===================================== @@ -1,137 +0,0 @@ -# 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; version 3 only. -# -# 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 typing import Any -from typing import Optional -from typing import Generator - -import logging - -from gi.repository import Gtk - -from nbxmpp import JID - -from .controls.chat import ChatControl -from .controls.groupchat import GroupchatControl -from .controls.private import PrivateChatControl - -from .types import ControlT - -log = logging.getLogger('gajim.gui.controlstack') - - -class ControlStack(Gtk.Stack): - def __init__(self): - Gtk.Stack.__init__(self) - self.set_vexpand(True) - self.set_hexpand(True) - - self.add_named(Gtk.Box(), 'empty') - - self.show_all() - self._controls: dict[tuple[str, JID], ControlT] = {} - self._current_control: Optional[ControlT] = None - - def get_control(self, account: str, jid: JID) -> Optional[ControlT]: - try: - return self._controls[(account, jid)] - except KeyError: - return None - - def get_current_control(self) -> Optional[ControlT]: - return self._current_control - - def get_controls(self, account: Optional[str] - ) -> Generator[ControlT, None, None]: - if account is None: - for control in self._controls.values(): - yield control - return - - for key, control in self._controls.items(): - if key[0] == account: - yield control - - def add_chat(self, account: str, jid: JID) -> None: - if self._controls.get((account, jid)) is not None: - # Control is already in the Stack - return - - chat_control = ChatControl(account, jid) - self._controls[(account, jid)] = chat_control - self.add_named(chat_control.widget, f'{account}:{jid}') - chat_control.widget.show_all() - - def add_group_chat(self, account: str, jid: JID) -> None: - if self._controls.get((account, jid)) is not None: - return - - control = GroupchatControl(account, jid) - self._controls[(account, jid)] = control - self.add_named(control.widget, f'{account}:{jid}') - control.widget.show_all() - - def add_private_chat(self, account: str, jid: JID) -> None: - control = PrivateChatControl(account, jid) - self._controls[(account, jid)] = control - self.add_named(control.widget, f'{account}:{jid}') - control.widget.show_all() - - def remove_chat(self, account: str, jid: JID) -> None: - control = self._controls.pop((account, jid)) - self.remove(control.widget) - control.shutdown() - - def show_chat(self, account: str, jid: JID) -> None: - new_name = f'{account}:{jid}' - current_name = self.get_visible_child_name() - assert current_name is not None - - if current_name == new_name: - return - - control = self.get_control(account, jid) - if control is None: - log.warning('No Control found for %s, %s', account, jid) - return - - if self._current_control is not None: - self._current_control.reset_view() - - control.load_messages() - self._current_control = control - - self.set_visible_child_name(new_name) - - def is_chat_loaded(self, account: str, jid: JID) -> bool: - control = self.get_control(account, jid) - if control is None: - return False - return control.is_chat_loaded - - def clear(self) -> None: - self.set_visible_child_name('empty') - self._current_control = None - - def process_event(self, event: Any) -> None: - control = self.get_control(event.account, event.jid) - if control is None: - return - control.process_event(event) - - def remove_chats_for_account(self, account: str) -> None: - for chat_account, jid in list(self._controls.keys()): - if chat_account != account: - continue - self.remove_chat(account, jid)
===================================== gajim/gtk/conversation/jump_to_end_button.py ===================================== @@ -36,15 +36,13 @@ class JumpToEndButton(Gtk.Overlay): ()), }
- def __init__(self, contact: ContactT) -> None: + def __init__(self) -> None: Gtk.Overlay.__init__(self) self.set_halign(Gtk.Align.END) self.set_valign(Gtk.Align.END) self.set_margin_end(6) self.set_margin_bottom(12)
- self._contact = contact - icon = Gtk.Image.new_from_icon_name( 'go-bottom-symbolic', Gtk.IconSize.BUTTON) icon.set_margin_start(4) @@ -59,13 +57,7 @@ def __init__(self, contact: ContactT) -> None: self.add(button)
self._unread_label = Gtk.Label() - self._unread_label.get_style_context().add_class( - 'unread-counter') - - if isinstance(contact, GroupchatContact) and not contact.can_notify(): - self._unread_label.get_style_context().add_class( - 'unread-counter-silent') - + self._unread_label.get_style_context().add_class('unread-counter') self._unread_label.set_no_show_all(True) self._unread_label.set_halign(Gtk.Align.END) self._unread_label.set_valign(Gtk.Align.START) @@ -76,6 +68,14 @@ def __init__(self, contact: ContactT) -> None: self._count = 0 self.set_no_show_all(True)
+ def switch_contact(self, contact: ContactT) -> None: + if isinstance(contact, GroupchatContact) and not contact.can_notify(): + self._unread_label.get_style_context().add_class( + 'unread-counter-silent') + else: + self._unread_label.get_style_context().remove_class( + 'unread-counter-silent') + def _on_jump_clicked(self, _button: Gtk.Button) -> None: self.reset_unread_count() self.emit('clicked')
===================================== gajim/gtk/groupchat_roster.py ===================================== @@ -42,7 +42,7 @@ from .menus import get_groupchat_roster_menu from .tooltips import GCTooltip from .builder import get_builder -from .types import GroupchatControlT +from .types import ControlT from .util import EventHelper
@@ -75,7 +75,7 @@ class GroupchatRoster(Gtk.ScrolledWindow, EventHelper): def __init__(self, account: str, room_jid: str, - control: GroupchatControlT + control: ControlT ) -> None: Gtk.ScrolledWindow.__init__(self) EventHelper.__init__(self) @@ -84,7 +84,6 @@ def __init__(self, self._account = account self.room_jid = room_jid self._control = control - self._control_id = control.control_id self._tooltip = GCTooltip() self._group_chat_contact = cast(GroupchatContact, control.contact) self._group_chat_contact.connect(
===================================== gajim/gtk/main.py ===================================== @@ -409,8 +409,8 @@ def _on_action(self, if action_name == 'escape' and chat_stack.process_escape(): return None
- control = self.get_active_control() - if control is not None: + control = self.get_control() + if control.has_active_chat(): if action_name == 'change-nickname': app.window.activate_action('muc-change-nickname', None) return None @@ -487,8 +487,8 @@ def _on_window_motion_notify(self, _widget: Gtk.ApplicationWindow, _event: Gdk.EventMotion ) -> None: - control = self.get_active_control() - if control is None: + control = self.get_control() + if not control.has_active_chat(): return
if self.get_property('has-toplevel-focus'): @@ -759,18 +759,8 @@ def add_app_message(self, message: Optional[str] = None) -> None: self._app_page.add_app_message(category, message)
- def get_control(self, account: str, jid: JID) -> Optional[ControlT]: - return self._chat_page.get_control(account, jid) - - def get_controls(self, account: Optional[str] = None - ) -> Generator[ControlT, None, None]: - return self._chat_page.get_controls(account) - - def get_active_control(self) -> Optional[ControlT]: - return self._chat_page.get_active_control() - - def is_chat_loaded(self, account: str, jid: JID) -> bool: - return self._chat_page.is_chat_loaded(account, jid) + def get_control(self) -> ControlT: + return self._chat_page.get_control()
def chat_exists(self, account: str, jid: JID) -> bool: return self._chat_page.chat_exists(account, jid) @@ -805,6 +795,8 @@ def get_chat_unread_count(self,
def mark_as_read(self, account: str, jid: JID, send_marker: bool = True) -> None: + # TODO + return set_urgency_hint(self, False) control = self.get_control(account, jid) if control is not None: @@ -824,8 +816,8 @@ def _on_window_active(self, return
set_urgency_hint(self, False) - control = self.get_active_control() - if control is None: + control = self.get_control() + if not control.has_active_chat(): return
if control.get_autoscroll(): @@ -933,6 +925,9 @@ def _on_message_received(self, event: events.MessageReceived) -> None: self._main_stack.process_event(event)
def _on_read_state_sync(self, event: events.ReadStateSync) -> None: + # TODO + return + if event.is_muc_pm: jid = JID.from_string(event.jid.bare) else:
===================================== gajim/gtk/message_actions_box.py ===================================== @@ -318,7 +318,7 @@ def _change_encryption(self, # TODO: Add GUI error here return
- if not plugin.activate_encryption(app.window.get_active_control()): + if not plugin.activate_encryption(app.window.get_control()): return
self._set_encryption_state(new_state) @@ -360,7 +360,7 @@ def _on_encryption_details_clicked(self, _button: Gtk.Button) -> None: contact = self.get_current_contact() encryption = contact.settings.get('encryption') app.plugin_manager.extension_point( - f'encryption_dialog{encryption}', app.window.get_active_control()) + f'encryption_dialog{encryption}', app.window.get_control())
def _set_settings_menu(self, contact: ChatContactT) -> None: if isinstance(contact, GroupchatContact): @@ -559,8 +559,8 @@ def _on_msg_textview_key_press_event(self, return True
if event.keyval in (Gdk.KEY_Page_Down, Gdk.KEY_Page_Up): - control = app.window.get_active_control() - if control is not None: + control = app.window.get_control() + if control.has_active_chat(): control.conversation_view.event(event) return True
===================================== gajim/gtk/preferences.py ===================================== @@ -40,7 +40,6 @@ from .const import Setting from .const import SettingKind from .const import SettingType -from .controls.groupchat import GroupchatControl from .dialogs import DialogButton from .dialogs import ConfirmationDialog from .emoji_chooser import emoji_chooser @@ -320,6 +319,8 @@ def _speller_available() -> bool:
@staticmethod def _on_use_speller(value: bool, *args: Any) -> None: + # TODO + return if not value: return
@@ -401,17 +402,19 @@ def __init__(self, *args: Any) -> None:
@staticmethod def _on_sort_by_show_in_muc(_value: bool, *args: Any) -> None: + # TODO + return for ctrl in app.window.get_controls(): if ctrl.is_groupchat: - assert isinstance(ctrl, GroupchatControl) if ctrl.roster is not None: ctrl.roster.invalidate_sort()
@staticmethod def _on_show_status_in_roster(_value: bool, *args: Any) -> None: + # TODO + return for ctrl in app.window.get_controls(): if ctrl.is_groupchat: - assert isinstance(ctrl, GroupchatControl) if ctrl.roster is not None: ctrl.roster.draw_contacts()
@@ -755,6 +758,8 @@ def _on_emoticons_theme(self, *args: Any) -> None:
@staticmethod def _toggle_emoticons() -> None: + # TODO + return for ctrl in app.window.get_controls(): ctrl.toggle_emoticons()
===================================== gajim/gtk/search_view.py ===================================== @@ -307,8 +307,8 @@ def _select_date(self, self._ui.calendar.select_day(date.day)
def _scroll_to_date(self, date: datetime) -> None: - control = app.window.get_active_control() - if control is None: + control = app.window.get_control() + if not control.has_active_chat(): return if control.contact.jid == self._jid: meta_row = app.storage.archive.get_first_message_meta_for_date( @@ -336,8 +336,8 @@ def _get_accounts() -> dict[int, str]:
@staticmethod def _on_row_activated(_listbox: SearchView, row: ResultRow) -> None: - control = app.window.get_active_control() - if control is not None: + control = app.window.get_control() + if control.has_active_chat(): if control.contact.jid == row.jid: control.scroll_to_message(row.log_line_id, row.timestamp) return @@ -346,8 +346,8 @@ def _on_row_activated(_listbox: SearchView, row: ResultRow) -> None: # TODO: type 'pm' is KindConstant.CHAT_MSG_RECV, too jid = JID.from_string(row.jid) app.window.add_chat(row.account, jid, row.type, select=True) - control = app.window.get_active_control() - if control is not None: + control = app.window.get_control() + if control.has_active_chat(): control.scroll_to_message(row.log_line_id, row.timestamp)
def set_focus(self) -> None:
===================================== gajim/gtk/types.py ===================================== @@ -19,10 +19,7 @@
if TYPE_CHECKING: - from .controls.base import BaseControl - from .controls.chat import ChatControl - from .controls.private import PrivateChatControl - from .controls.groupchat import GroupchatControl + from .control import ChatControl from .conversation.message_widget import MessageWidget # noqa: F401 from .conversation.view import ConversationView # noqa: F401 from .conversation.rows.call import CallRow # noqa: F401 @@ -39,13 +36,6 @@ from .conversation.rows.scroll_hint import ScrollHintRow # noqa: F401
-ControlT = Union[ - 'BaseControl', - 'ChatControl', - 'PrivateChatControl', - 'GroupchatControl' -] - -GroupchatControlT = Union['GroupchatControl'] +ControlT = Union['ChatControl']
ConversationViewT = Union['ConversationView']
===================================== gajim/gui_interface.py ===================================== @@ -403,13 +403,12 @@ def start_file_transfer(self, if method is None: return
- current_control = app.window.get_active_control() - if current_control is None: + if app.window.get_control().has_active_chat(): return
if path is None: if method == 'httpupload': - self.send_httpupload(current_control) + self.send_httpupload(control) return if method == 'jingle': self.instances['file_transfers'].show_file_send_request( @@ -417,7 +416,7 @@ def start_file_transfer(self, return
if method == 'httpupload': - self.send_httpupload(current_control, path) + self.send_httpupload(control, path) else: assert isinstance(contact, BareContact) send_callback = partial( @@ -457,6 +456,7 @@ def start_chat_from_jid(account: str, jid: str, message: Optional[str] = None ) -> None: + # TODO jid_ = JID.from_string(jid) if app.window.chat_exists(account, jid_): app.window.select_chat(account, jid_)
===================================== pyrightconfig.json ===================================== @@ -41,7 +41,7 @@ "gajim/common/sound.py", "gajim/common/storage/", "gajim/common/task_manager.py", - "gajim/gtk/controls/private.py", + "gajim/gtk/control.py", "gajim/gtk/conversation", "gajim/gtk/about.py", "gajim/gtk/account_page.py", @@ -65,7 +65,6 @@ "gajim/gtk/chat_list.py", "gajim/gtk/chat_page.py", "gajim/gtk/chat_stack.py", - "gajim/gtk/control_stack.py", "gajim/gtk/const.py", "gajim/gtk/contact_info.py", "gajim/gtk/contact_settings.py",
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/compare/c91a3813fc7d0ecc942653b1d5da322b...