diff --git a/gajim/config.py b/gajim/config.py index b31d19281..9092fe727 100644 --- a/gajim/config.py +++ b/gajim/config.py @@ -30,19 +30,6 @@ from gi.repository import Gtk from gi.repository import GObject -from gajim.common import app -from gajim.common import passwords -from gajim.common.i18n import _ - -from gajim import dialogs - -from gajim import gui_menu_builder - -from gajim.gtk.dialogs import ConfirmationDialog -from gajim.gtk.dialogs import ConfirmationDialogDoubleRadio -from gajim.gtk.dialogs import ErrorDialog -from gajim.gtk.util import get_builder - class FakeDataForm(Gtk.Table): """ @@ -94,131 +81,3 @@ class FakeDataForm(Gtk.Table): for name in self.entries: self.infos[name] = self.entries[name].get_text() return self.infos - -#---------- RemoveAccountWindow class -------------# -class RemoveAccountWindow: - """ - Ask for removing from gajim only or from gajim and server too and do - removing of the account given - """ - - def on_remove_account_window_destroy(self, widget): - if self.account in app.interface.instances: - del app.interface.instances[self.account]['remove_account'] - - def on_cancel_button_clicked(self, widget): - self.window.destroy() - - def __init__(self, account): - self.account = account - xml = get_builder('remove_account_window.ui') - self.window = xml.get_object('remove_account_window') - active_window = app.app.get_active_window() - self.window.set_transient_for(active_window) - self.remove_and_unregister_radiobutton = xml.get_object( - 'remove_and_unregister_radiobutton') - self.window.set_title(_('Removing %s account') % self.account) - xml.connect_signals(self) - self.window.show_all() - - def on_remove_button_clicked(self, widget): - def remove(): - if self.account in app.connections and \ - app.connections[self.account].connected and \ - not self.remove_and_unregister_radiobutton.get_active(): - # change status to offline only if we will not remove this JID from - # server - app.connections[self.account].change_status('offline', 'offline') - if self.remove_and_unregister_radiobutton.get_active(): - if not self.account in app.connections: - ErrorDialog( - _('Account is disabled'), - _('To unregister from a server, account must be ' - 'enabled.'), - transient_for=self.window) - return - if not app.connections[self.account].password: - def on_ok(passphrase, checked): - if passphrase == -1: - # We don't remove account cause we canceled pw window - return - app.connections[self.account].password = passphrase - app.connections[self.account].unregister_account( - self._on_remove_success) - - dialogs.PassphraseDialog( - _('Password Required'), - _('Enter your password for account %s') % self.account, - _('Save password'), ok_handler=on_ok, - transient_for=self.window) - return - app.connections[self.account].unregister_account( - self._on_remove_success) - else: - self._on_remove_success(True) - - if self.account in app.connections and \ - app.connections[self.account].connected: - ConfirmationDialog( - _('Account "%s" is connected to the server') % self.account, - _('If you remove it, the connection will be lost.'), - on_response_ok=remove, - transient_for=self.window) - else: - remove() - - def on_remove_responce_ok(self, is_checked): - if is_checked[0]: - self._on_remove_success(True) - - def _on_remove_success(self, res): - # action of unregistration has failed, we don't remove the account - # Error message is send by connect_and_auth() - if not res: - ConfirmationDialogDoubleRadio( - _('Connection to server %s failed') % self.account, - _('What would you like to do?'), - _('Remove only from Gajim'), - _('Don\'t remove anything. I\'ll try again later'), - on_response_ok=self.on_remove_responce_ok, is_modal=False, - transient_for=self.window) - return - # Close all opened windows - app.interface.roster.close_all(self.account, force=True) - if self.account in app.connections: - app.connections[self.account].disconnect(reconnect=False) - app.connections[self.account].cleanup() - del app.connections[self.account] - app.logger.remove_roster(app.get_jid_from_account(self.account)) - # Delete password must be before del_per() because it calls set_per() - # which would recreate the account with defaults values if not found - passwords.delete_password(self.account) - app.config.del_per('accounts', self.account) - del app.interface.instances[self.account] - if self.account in app.nicks: - del app.interface.minimized_controls[self.account] - del app.nicks[self.account] - del app.block_signed_in_notifications[self.account] - del app.groups[self.account] - app.contacts.remove_account(self.account) - del app.gc_connected[self.account] - del app.automatic_rooms[self.account] - del app.to_be_removed[self.account] - del app.newly_added[self.account] - del app.sleeper_state[self.account] - del app.last_message_time[self.account] - del app.status_before_autoaway[self.account] - del app.gajim_optional_features[self.account] - del app.caps_hash[self.account] - if len(app.connections) >= 2: # Do not merge accounts if only one exists - app.interface.roster.regroup = app.config.get('mergeaccounts') - else: - app.interface.roster.regroup = False - app.interface.roster.setup_and_draw_roster() - app.app.remove_account_actions(self.account) - gui_menu_builder.build_accounts_menu() - - window = app.get_app_window('AccountsWindow') - if window is not None: - window.remove_account(self.account) - self.window.destroy() diff --git a/gajim/data/gui/remove_account_window.ui b/gajim/data/gui/remove_account_window.ui index c1e18e3e3..8efbbaff2 100644 --- a/gajim/data/gui/remove_account_window.ui +++ b/gajim/data/gui/remove_account_window.ui @@ -1,119 +1,115 @@ - + - - - True - False - gtk-delete - + False - 6 + 18 dialog - + + + + True False - 3 vertical - 6 + 18 - + True False - 6 + start + What do you want to do? + True + + + + False + True + 0 + + + + + True + False + 12 - + True False - gtk-dialog-question + user-trash 6 False - False + True 0 - + True False - 0 - none + vertical + 6 - + + Remove account _only from Gajim True - False - 12 - 6 - vertical - 6 - - - Remove account _only from Gajim - True - True - False - True - 0 - True - True - - - False - False - 0 - - - - - Remove account from Gajim and from _server - True - True - False - True - 0 - True - remove_only_radiobutton - - - False - False - 1 - - + True + False + start + True + True + True + + False + True + 0 + - - + + + Remove account from Gajim and from _server True - False - <b>What do you want to do?</b> - True + True + False + start + True + True + True + remove_only_radiobutton + + False + False + 1 + False - False + True 1 False - False - 0 + True + 1 - + True False - 6 12 end @@ -139,9 +135,11 @@ True True False - image1 True + False @@ -153,7 +151,7 @@ False False - 1 + 2 diff --git a/gajim/gtk/accounts.py b/gajim/gtk/accounts.py index aab4bb4f8..48f52fd5b 100644 --- a/gajim/gtk/accounts.py +++ b/gajim/gtk/accounts.py @@ -30,12 +30,14 @@ from gajim.common.const import OptionKind from gajim.common.const import OptionType from gajim import gui_menu_builder -from gajim import config +from gajim.dialogs import PassphraseDialog from gajim.options_dialog import OptionsDialog from gajim.options_dialog import OptionsBox from gajim.gtk.dialogs import ConfirmationDialog +from gajim.gtk.dialogs import ConfirmationDialogDoubleRadio +from gajim.gtk.dialogs import ErrorDialog from gajim.gtk.dialogs import YesNoDialog from gajim.gtk.util import get_icon_name from gajim.gtk.util import get_builder @@ -220,7 +222,7 @@ class AccountsWindow(Gtk.ApplicationWindow): if account not in app.interface.instances: app.interface.instances[account] = {} app.interface.instances[account]['remove_account'] = \ - config.RemoveAccountWindow(account) + RemoveAccountWindow(account) if win_opened: ConfirmationDialog( _('You have opened chat in account %s') % account, @@ -811,3 +813,131 @@ class LoginDialog(OptionsDialog): savepass = app.config.get_per('accounts', self.account, 'savepass') if not savepass: passwords.delete_password(self.account) + + +class RemoveAccountWindow: + """ + Ask whether to remove from gajim only or both from gajim and the server, + then remove the account given + """ + + def on_remove_account_window_destroy(self, widget): + if self.account in app.interface.instances: + del app.interface.instances[self.account]['remove_account'] + + def on_cancel_button_clicked(self, widget): + self._ui.remove_account_window.destroy() + + def __init__(self, account): + self.account = account + self._ui = get_builder('remove_account_window.ui') + active_window = app.app.get_active_window() + self._ui.remove_account_window.set_transient_for(active_window) + self._ui.remove_account_window.set_title(_('Removing account %s') % self.account) + self._ui.connect_signals(self) + self._ui.remove_account_window.show_all() + + def on_remove_button_clicked(self, widget): + def remove(): + if self.account in app.connections and \ + app.connections[self.account].connected and \ + not self._ui.remove_and_unregister_radiobutton.get_active(): + # change status to offline only if we will not remove this JID from + # server + app.connections[self.account].change_status('offline', 'offline') + if self._ui.remove_and_unregister_radiobutton.get_active(): + if not self.account in app.connections: + ErrorDialog( + _('Account is disabled'), + _('To unregister from a server, the account must be ' + 'enabled.'), + transient_for=self._ui.remove_account_window) + return + if not app.connections[self.account].password: + def on_ok(passphrase, checked): + if passphrase == -1: + # We don't remove account cause we canceled pw window + return + app.connections[self.account].password = passphrase + app.connections[self.account].unregister_account( + self._on_remove_success) + + PassphraseDialog( + _('Password required'), + _('Enter your password for account %s') % self.account, + _('Save password'), ok_handler=on_ok, + transient_for=self._ui.remove_account_window) + return + app.connections[self.account].unregister_account( + self._on_remove_success) + else: + self._on_remove_success(True) + + if self.account in app.connections and \ + app.connections[self.account].connected: + ConfirmationDialog( + _('Account "%s" is connected to the server') % self.account, + _('If you remove it, the connection will be lost.'), + on_response_ok=remove, + transient_for=self._ui.remove_account_window) + else: + remove() + + def on_remove_response_ok(self, is_checked): + if is_checked[0]: + self._on_remove_success(True) + + def _on_remove_success(self, res): + # action of unregistration has failed, we don't remove the account + # Error message is send by connect_and_auth() + if not res: + ConfirmationDialogDoubleRadio( + _('Connection to server %s failed') % self.account, + _('What would you like to do?'), + _('Remove only from Gajim'), + _('Don\'t remove anything. I\'ll try again later'), + on_response_ok=self.on_remove_response_ok, is_modal=False, + transient_for=self._ui.remove_account_window) + return + # Close all opened windows + app.interface.roster.close_all(self.account, force=True) + if self.account in app.connections: + app.connections[self.account].disconnect(reconnect=False) + app.connections[self.account].cleanup() + del app.connections[self.account] + app.logger.remove_roster(app.get_jid_from_account(self.account)) + # Delete password must be before del_per() because it calls set_per() + # which would recreate the account with defaults values if not found + passwords.delete_password(self.account) + app.config.del_per('accounts', self.account) + del app.interface.instances[self.account] + if self.account in app.nicks: + del app.interface.minimized_controls[self.account] + del app.nicks[self.account] + del app.block_signed_in_notifications[self.account] + del app.groups[self.account] + app.contacts.remove_account(self.account) + del app.gc_connected[self.account] + del app.automatic_rooms[self.account] + del app.to_be_removed[self.account] + del app.newly_added[self.account] + del app.sleeper_state[self.account] + del app.last_message_time[self.account] + del app.status_before_autoaway[self.account] + del app.gajim_optional_features[self.account] + del app.caps_hash[self.account] + if len(app.connections) >= 2: # Do not merge accounts if only one exists + app.interface.roster.regroup = app.config.get('mergeaccounts') + else: + app.interface.roster.regroup = False + app.interface.roster.setup_and_draw_roster() + app.app.remove_account_actions(self.account) + gui_menu_builder.build_accounts_menu() + + window = app.get_app_window('AccountsWindow') + if window is not None: + window.remove_account(self.account) + self._ui.remove_account_window.destroy() + + def destroy(self): + self._ui.remove_account_window.destroy()