Philipp Hörist pushed to branch mainwindow at gajim / gajim
Commits: 827a5008 by lovetox at 2021-04-29T11:13:26+02:00 Fix Enabling/Disabling Accounts
- - - - -
12 changed files:
- gajim/gtk/account_page.py - gajim/gtk/account_side_bar.py - gajim/gtk/accounts.py - gajim/gtk/chat_list.py - gajim/gtk/chat_list_stack.py - gajim/gtk/chat_page.py - gajim/gtk/chat_stack.py - gajim/gtk/controls/groupchat.py - gajim/gtk/main.py - gajim/gtk/main_stack.py - gajim/gtk/roster.py - gajim/gui_interface.py
Changes:
===================================== gajim/gtk/account_page.py ===================================== @@ -19,13 +19,13 @@ from gajim.common import ged from gajim.common.const import AvatarSize from gajim.common.i18n import _ -from gajim.common.nec import EventHelper
from .roster import Roster from .status_selector import StatusSelector from .notification_manager import NotificationManager from .util import get_builder from .util import open_window +from .util import EventHelper
ROSTER_MENU_DICT = { 'show-offline': _('Show Offline Contacts'),
===================================== gajim/gtk/account_side_bar.py ===================================== @@ -35,7 +35,10 @@ def add_account(self, account): self.add(Account(account))
def remove_account(self, account): - pass + for row in self.get_children(): + if row.account == account: + row.destroy() + return
@staticmethod def _on_row_activated(_listbox, row): @@ -97,6 +100,7 @@ def __init__(self, account): self._contact.connect('avatar-update', self._on_avatar_update) self._contact.connect('presence-update', self._on_presence_update)
+ self.connect('destroy', self._on_destroy) self._update_image()
def _on_presence_update(self, _contact, _signal_name): @@ -110,3 +114,7 @@ def _update_image(self): self.get_scale_factor(), style='round-corners') self.set_from_surface(surface) + + def _on_destroy(self, *args): + self._contact.disconnect_all_from_obj(self) + app.check_finalize(self)
===================================== gajim/gtk/accounts.py ===================================== @@ -23,6 +23,7 @@ from gi.repository import GObject
from gajim.common import app +from gajim.common import ged from gajim.common import passwords from gajim.common.i18n import _ from gajim.common.i18n import Q_ @@ -535,9 +536,19 @@ def _set_label(self, active): self._switch_state_label.set_text(text)
def _on_enable_switch(self, switch, state, account): + def _on_disconnect(event): + if event.account != account: + return + app.ged.remove_event_handler('account-disconnected', + ged.CORE, + _on_disconnect) + app.interface.disable_account(account) + def _disable(): + app.ged.register_event_handler('account-disconnected', + ged.CORE, + _on_disconnect) app.connections[account].change_status('offline', 'offline') - app.interface.disable_account(account) switch.set_state(state) self._set_label(state)
===================================== gajim/gtk/chat_list.py ===================================== @@ -168,6 +168,12 @@ def remove_chat(self, account, jid): self.remove(row) row.destroy()
+ def remove_chats_for_account(self, account): + for row_account, jid in list(self._chats.keys()): + if row_account != account: + continue + self.remove_chat(account, jid) + def get_selected_chat(self): row = self.get_selected_row() if row is None:
===================================== gajim/gtk/chat_list_stack.py ===================================== @@ -102,12 +102,17 @@ def get_chatlist(self, workspace_id): return self._chat_lists[workspace_id]
def get_selected_chat(self): + chat_list = self.get_current_chat_list() + if chat_list is None: + return None + return chat_list.get_selected_chat() + + def get_current_chat_list(self): workspace_id = self.get_visible_child_name() if workspace_id == 'empty': return None
- chat_list = self._chat_lists[workspace_id] - return chat_list.get_selected_chat() + return self._chat_lists[workspace_id]
def is_chat_active(self, account, jid): chat = self.get_selected_chat() @@ -202,6 +207,11 @@ def remove_chat(self, workspace_id, account, jid): self.store_open_chats(workspace_id) self.emit('chat-removed', account, jid, type_)
+ def remove_chats_for_account(self, account): + for workspace_id, chat_list in self._chat_lists.items(): + chat_list.remove_chats_for_account(account) + self.store_open_chats(workspace_id) + def _find_chat(self, account, jid): for chat_list in self._chat_lists.values(): if chat_list.contains_chat(account, jid):
===================================== gajim/gtk/chat_page.py ===================================== @@ -235,6 +235,14 @@ def _on_chat_removed(self, _chat_list, account, jid, type_): client = app.get_client(account) client.get_module('MUC').leave(jid)
+ def remove_chats_for_account(self, account): + chat_list = self._chat_list_stack.get_current_chat_list() + if chat_list is not None: + chat_list.unselect_all() + + self._chat_list_stack.remove_chats_for_account(account) + self._chat_stack.remove_chats_for_account(account) + def get_control(self, account, jid): return self._chat_stack.get_control(account, jid)
===================================== gajim/gtk/chat_stack.py ===================================== @@ -91,3 +91,9 @@ def clear(self): def process_event(self, event): control = self.get_control(event.account, event.jid) control.process_event(event) + + def remove_chats_for_account(self, account): + for chat_account, jid in list(self._controls.keys()): + if chat_account != account: + continue + self.remove_chat(account, jid)
===================================== gajim/gtk/controls/groupchat.py ===================================== @@ -1273,12 +1273,6 @@ def shutdown(self, reason=None): app.plugin_manager.remove_gui_extension_point( 'groupchat_control', self)
- # They can already be removed by the destroy function - # TODO remove - if self.room_jid in app.contacts.get_gc_list(self.account): - app.contacts.remove_room(self.account, self.room_jid) - del app.gc_connected[self.account][self.room_jid] - self.roster.destroy() self.roster = None
===================================== gajim/gtk/main.py ===================================== @@ -74,6 +74,8 @@ def __init__(self): ('muc-disco-update', ged.GUI1, self._on_event), ('our-show', ged.GUI1, self._on_our_show), ('signed-in', ged.GUI1, self._on_signed_in), + ('account-enabled', ged.GUI1, self._on_account_enabled), + ('account-disabled', ged.GUI1, self._on_account_disabled), ])
self._load_chats() @@ -81,6 +83,17 @@ def __init__(self): self._add_actions2() self.show_all()
+ def _on_account_enabled(self, event): + self._account_side_bar.add_account(event.account) + self._main_stack.add_account_page(event.account) + + def _on_account_disabled(self, event): + workspace_id = self._workspace_side_bar.get_first_workspace() + self.activate_workspace(workspace_id) + self._account_side_bar.remove_account(event.account) + self._main_stack.remove_account_page(event.account) + self._main_stack.remove_chats_for_account(event.account) + @staticmethod def _on_our_show(event): if event.show == 'offline':
===================================== gajim/gtk/main_stack.py ===================================== @@ -24,13 +24,25 @@ class MainStack(Gtk.Stack): def __init__(self): Gtk.Stack.__init__(self)
+ self.add_named(Gtk.Box(), 'empty') + self._chat_page = ChatPage() self._chat_page.connect('chat-selected', self._on_chat_selected) self.add_named(self._chat_page, 'chats')
for account in list(app.connections.keys()): - account_page = AccountPage(account) - self.add_named(account_page, account) + self.add_account_page(account) + + def add_account_page(self, account): + account_page = AccountPage(account) + self.add_named(account_page, account) + + def remove_account_page(self, account): + account_page = self.get_child_by_name(account) + account_page.destroy() + + def remove_chats_for_account(self, account): + self._chat_page.remove_chats_for_account(account)
def show_chats(self, workspace_id): self._chat_page.show_workspace_chats(workspace_id) @@ -46,7 +58,10 @@ def get_chat_page(self): return self.get_child_by_name('chats')
def process_event(self, event): + empty_box = self.get_child_by_name('empty') for page in self.get_children(): + if page is empty_box: + continue page.process_event(event)
def _on_chat_selected(self, *args):
===================================== gajim/gtk/roster.py ===================================== @@ -615,8 +615,8 @@ def _on_destroy(self, _roster): self._group_refs.clear() self._unset_model() self._roster = None + self._enable_sort(False) self._store.clear() - self._store.reset_default_sort_func() self._store = None # self._tooltip.destroy() # self._tooltip = None
===================================== gajim/gui_interface.py ===================================== @@ -1417,12 +1417,16 @@ def enable_account(self, account): 'name') app.block_signed_in_notifications[account] = True app.last_message_time[account] = {} - # refresh roster
- gui_menu_builder.build_accounts_menu() - app.connections[account].change_status('online', '') app.settings.set_account_setting(account, 'active', True) + gui_menu_builder.build_accounts_menu() app.app.update_app_actions_state() + + app.nec.push_incoming_event(NetworkEvent( + 'account-enabled', + account=account)) + + app.connections[account].change_status('online', '') window = get_app_window('AccountsWindow') if window is not None: GLib.idle_add(window.enable_account, account, True) @@ -1435,6 +1439,15 @@ def disable_account(self, account): continue win.destroy()
+ app.settings.set_account_setting(account, 'roster_version', '') + app.settings.set_account_setting(account, 'active', False) + gui_menu_builder.build_accounts_menu() + app.app.update_app_actions_state() + + app.nec.push_incoming_event(NetworkEvent( + 'account-disabled', + account=account)) + if account == app.ZEROCONF_ACC_NAME: app.connections[account].disable_account() app.connections[account].cleanup() @@ -1450,11 +1463,6 @@ def disable_account(self, account): del app.newly_added[account] del app.last_message_time[account]
- app.settings.set_account_setting(account, 'roster_version', '') - gui_menu_builder.build_accounts_menu() - app.settings.set_account_setting(account, 'active', False) - app.app.update_app_actions_state() - def remove_account(self, account): if app.settings.get_account_setting(account, 'active'): self.disable_account(account)
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/commit/827a500840a2c6a5ffd75b6bd32ab5fc5...