gajim.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2026
October
September
August
July
June
May
April
March
February
January
2025
December
November
October
September
August
July
June
May
April
March
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
List overview
Download
Commits
January 2022
----- 2026 -----
October 2026
September 2026
August 2026
July 2026
June 2026
May 2026
April 2026
March 2026
February 2026
January 2026
----- 2025 -----
December 2025
November 2025
October 2025
September 2025
August 2025
July 2025
June 2025
May 2025
April 2025
March 2025
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
commits@gajim.org
1 participants
161 discussions
Start a n
N
ew thread
[Git][gajim/gajim][master] 9 commits: ContactInfo: Typing
by Daniel Brötzmann (@wurstsalat)
17 Jan '22
17 Jan '22
Daniel Brötzmann pushed to branch master at gajim / gajim Commits: d3cbee3d by wurstsalat at 2022-01-17T23:10:03+01:00 ContactInfo: Typing - - - - - 8a234780 by wurstsalat at 2022-01-17T23:10:03+01:00 ChatList: Typing - - - - - fc9c10e8 by wurstsalat at 2022-01-17T23:10:03+01:00 Builder: Typing - - - - - bf46e905 by wurstsalat at 2022-01-17T23:10:03+01:00 BlockingList: Typing - - - - - 33ebe5ad by wurstsalat at 2022-01-17T23:10:03+01:00 Update pyrightconfig - - - - - a707c654 by wurstsalat at 2022-01-17T23:10:03+01:00 Settings: Typing - - - - - f491b665 by wurstsalat at 2022-01-17T23:10:03+01:00 Preferences: Typing - - - - - 9b77c047 by wurstsalat at 2022-01-17T23:10:03+01:00 Accounts: Typing - - - - - 03795a07 by wurstsalat at 2022-01-17T23:11:52+01:00 SearchView: Rename 'Search Everywhere' to 'Search all Chats' - - - - - 11 changed files: - gajim/common/zeroconf/connection_zeroconf.py - gajim/data/gui/search_view.ui - gajim/gtk/accounts.py - gajim/gtk/blocking.py - gajim/gtk/builder.py - gajim/gtk/chat_list.py - gajim/gtk/const.py - gajim/gtk/contact_info.py - gajim/gtk/preferences.py - gajim/gtk/settings.py - pyrightconfig.json Changes: ===================================== gajim/common/zeroconf/connection_zeroconf.py ===================================== @@ -465,7 +465,7 @@ def reannounce(self): app.ZEROCONF_ACC_NAME, 'zeroconf_email') self.connection.reannounce(txt) - def update_details(self): + def update_details(self) -> None: if self.connection: port = app.settings.get_account_setting(app.ZEROCONF_ACC_NAME, 'custom_port') ===================================== gajim/data/gui/search_view.ui ===================================== @@ -192,7 +192,7 @@ </child> <child> <object class="GtkCheckButton" id="search_checkbutton"> - <property name="label" translatable="yes">Search everywhere</property> + <property name="label" translatable="yes">Search all Chats</property> <property name="visible">True</property> <property name="can-focus">True</property> <property name="receives-default">False</property> ===================================== gajim/gtk/accounts.py ===================================== @@ -15,6 +15,7 @@ from __future__ import annotations from typing import Any +from typing import cast import sys import locale @@ -29,16 +30,20 @@ from gajim.common import app from gajim.common import ged from gajim.common import passwords +from gajim.common.events import AccountDisonnected from gajim.common.i18n import _ from gajim.common.i18n import Q_ +from gajim.common.zeroconf.connection_zeroconf import ConnectionZeroconf from .dialogs import DialogButton from .dialogs import ConfirmationDialog from .const import Setting from .const import SettingKind from .const import SettingType +from .controls.base import BaseControl from .settings import SettingsDialog from .settings import SettingsBox +from .settings import PopoverSetting from .util import open_window @@ -55,8 +60,8 @@ def __init__(self) -> None: self.set_default_size(700, 550) self.set_resizable(True) self.set_title(_('Accounts')) - self._need_relogin = {} - self._accounts = {} + self._need_relogin: dict[str, list[str]] = {} + self._accounts: dict[str, Account] = {} self._menu = AccountMenu() self._settings = Settings() @@ -121,7 +126,9 @@ def _relog(self, account: str) -> None: return if account == app.ZEROCONF_ACC_NAME: - app.connections[app.ZEROCONF_ACC_NAME].update_details() + zeroconf_conn = cast( + ConnectionZeroconf, app.connections[app.ZEROCONF_ACC_NAME]) + zeroconf_conn.update_details() return def relog(): @@ -141,13 +148,23 @@ def relog(): transient_for=self).show() @staticmethod - def _get_relogin_settings(account: str) -> list[Any]: + def _get_relogin_settings(account: str) -> list[str]: if account == app.ZEROCONF_ACC_NAME: - settings = ['zeroconf_first_name', 'zeroconf_last_name', - 'zeroconf_jabber_id', 'zeroconf_email'] + settings = [ + 'zeroconf_first_name', + 'zeroconf_last_name', + 'zeroconf_jabber_id', + 'zeroconf_email' + ] else: - settings = ['client_cert', 'proxy', 'resource', - 'use_custom_host', 'custom_host', 'custom_port'] + settings = [ + 'client_cert', + 'proxy', + 'resource', + 'use_custom_host', + 'custom_host', + 'custom_port' + ] values: list[Any] = [] for setting in settings: @@ -195,18 +212,18 @@ def __init__(self): self.get_style_context().add_class('accounts-settings') self.add(self._stack) - self._page_signal_ids = {} - self._pages = defaultdict(list) + self._page_signal_ids: dict[GenericSettingPage, int] = {} + self._pages: dict[str, list[GenericSettingPage]] = defaultdict(list) - def add_page(self, page): + def add_page(self, page: GenericSettingPage) -> None: self._pages[page.account].append(page) - self._stack.add_named(page, '%s-%s' % (page.account, page.name)) + self._stack.add_named(page, f'{page.account}-{page.name}') self._page_signal_ids[page] = page.connect_signal(self._stack) - def set_page(self, name): + def set_page(self, name: str) -> None: self._stack.set_visible_child_name(name) - def remove_account(self, account): + def remove_account(self, account: str) -> None: for page in self._pages[account]: signal_id = self._page_signal_ids[page] del self._page_signal_ids[page] @@ -215,10 +232,11 @@ def remove_account(self, account): page.destroy() del self._pages[account] - def update_proxy_list(self, account): + def update_proxy_list(self, account: str) -> None: for page in self._pages[account]: if page.name != 'connection': continue + assert isinstance(page, ConnectionPage) page.update_proxy_entries() @@ -228,7 +246,7 @@ class AccountMenu(Gtk.Box): 'menu-activated': (GObject.SignalFlags.RUN_FIRST, None, (str, str)), } - def __init__(self): + def __init__(self) -> None: Gtk.Box.__init__(self) self.set_hexpand(False) self.set_size_request(160, -1) @@ -251,33 +269,42 @@ def __init__(self): self.add(self._stack) @staticmethod - def _sort_func(row1, row2): + def _sort_func(row1: AccountRow, row2: AccountRow) -> int: if row1.label == 'Local': return -1 return locale.strcoll(row1.label.lower(), row2.label.lower()) - def add_account(self, row): + def add_account(self, row: AccountRow) -> None: self._accounts_listbox.add(row) sub_menu = AccountSubMenu(row.account) - self._stack.add_named(sub_menu, '%s-menu' % row.account) + self._stack.add_named(sub_menu, f'{row.account}-menu') sub_menu.connect('row-activated', self._on_sub_menu_row_activated) - def remove_account(self, row): + def remove_account(self, row: AccountRow) -> None: if self._stack.get_visible_child_name() != 'accounts': # activate 'back' button - self._stack.get_visible_child().get_row_at_index(1).emit('activate') + listbox = cast(Gtk.ListBox, self._stack.get_visible_child()) + back_row = cast(Gtk.ListBoxRow, listbox.get_row_at_index(1)) + back_row.emit('activate') self._accounts_listbox.remove(row) sub_menu = self._stack.get_child_by_name('%s-menu' % row.account) self._stack.remove(sub_menu) row.destroy() sub_menu.destroy() - def _on_account_row_activated(self, _listbox, row): + def _on_account_row_activated(self, + _listbox: Gtk.ListBox, + row: AccountRow + ) -> None: self._stack.set_visible_child_name('%s-menu' % row.account) - self._stack.get_visible_child().get_row_at_index(2).emit('activate') + listbox = cast(Gtk.ListBox, self._stack.get_visible_child()) + listbox_row = cast(Gtk.ListBoxRow, listbox.get_row_at_index(2)) + listbox_row.emit('activate') - def _on_sub_menu_row_activated(self, listbox, row): + def _on_sub_menu_row_activated(self, + listbox: AccountSubMenu, + row: MenuItem) -> None: if row.name == 'back': self._stack.set_visible_child_full( 'accounts', Gtk.StackTransitionType.OVER_RIGHT) @@ -288,11 +315,12 @@ def _on_sub_menu_row_activated(self, listbox, row): else: self.emit('menu-activated', listbox.account, - '%s-%s' % (listbox.account, row.name)) + f'{listbox.account}-{row.name}') - def update_account_label(self, account): + def update_account_label(self, account: str) -> None: self._accounts_listbox.invalidate_sort() - sub_menu = self._stack.get_child_by_name('%s-menu' % account) + sub_menu = cast( + AccountSubMenu, self._stack.get_child_by_name(f'{account}-menu')) sub_menu.update() @@ -302,7 +330,7 @@ class AccountSubMenu(Gtk.ListBox): 'update': (GObject.SignalFlags.RUN_FIRST, None, (str,)) } - def __init__(self, account): + def __init__(self, account: str) -> None: Gtk.ListBox.__init__(self) self.set_vexpand(True) self.set_hexpand(True) @@ -320,15 +348,15 @@ def __init__(self, account): self.add(RemoveMenuItem()) @property - def account(self): + def account(self) -> str: return self._account - def update(self): + def update(self) -> None: self.emit('update', self._account) class MenuItem(Gtk.ListBoxRow): - def __init__(self, name): + def __init__(self, name: str) -> None: Gtk.ListBoxRow.__init__(self) self._name = name self._box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, @@ -338,12 +366,12 @@ def __init__(self, name): self.add(self._box) @property - def name(self): + def name(self) -> str: return self._name class RemoveMenuItem(MenuItem): - def __init__(self): + def __init__(self) -> None: super().__init__('remove') self._label.set_text(_('Remove')) image = Gtk.Image.new_from_icon_name('user-trash-symbolic', @@ -357,7 +385,7 @@ def __init__(self): class AccountLabelMenuItem(MenuItem): - def __init__(self, parent, account): + def __init__(self, parent: AccountSubMenu, account: str) -> None: super().__init__('account-label') self._update_account_label(parent, account) @@ -378,13 +406,16 @@ def __init__(self, parent, account): parent.connect('update', self._update_account_label) - def _update_account_label(self, _listbox, account): + def _update_account_label(self, + _listbox: Gtk.ListBox, + account: str + ) -> None: account_label = app.get_account_label(account) self._label.set_text(account_label) class BackMenuItem(MenuItem): - def __init__(self): + def __init__(self) -> None: super().__init__('back') self.set_selectable(False) @@ -399,7 +430,7 @@ def __init__(self): class PageMenuItem(MenuItem): - def __init__(self, name, label): + def __init__(self, name: str, label: str) -> None: super().__init__(name) if name == 'general': @@ -421,7 +452,11 @@ def __init__(self, name, label): class Account: - def __init__(self, account, menu, settings): + def __init__(self, + account: str, + menu: AccountMenu, + settings: Settings + ) -> None: self._account = account self._menu = menu self._settings = settings @@ -437,40 +472,40 @@ def __init__(self, account, menu, settings): self._account_row = AccountRow(account) self._menu.add_account(self._account_row) - def select(self): + def select(self) -> None: self._account_row.emit('activate') - def show(self): + def show(self) -> None: self._menu.show_all() self._settings.show_all() self.select() - def remove(self): + def remove(self) -> None: self._menu.remove_account(self._account_row) self._settings.remove_account(self._account) - def update_account_label(self): + def update_account_label(self) -> None: self._account_row.update_account_label() self._menu.update_account_label(self._account) - def enable_account(self, state): + def enable_account(self, state: bool) -> None: self._account_row.enable_account(state) @property - def menu(self): + def menu(self) -> AccountMenu: return self._menu @property - def account(self): + def account(self) -> str: return self._account @property - def settings(self): + def settings(self) -> str: return self._account class AccountRow(Gtk.ListBoxRow): - def __init__(self, account): + def __init__(self, account: str) -> None: Gtk.ListBoxRow.__init__(self) self.set_selectable(False) @@ -522,26 +557,30 @@ def __init__(self, account): self.add(box) @property - def account(self): + def account(self) -> str: return self._account @property - def label(self): + def label(self) -> str: return self._label.get_text() - def update_account_label(self): + def update_account_label(self) -> None: self._label.set_text(app.get_account_label(self._account)) - def enable_account(self, state): + def enable_account(self, state: bool) -> None: self._switch.set_state(state) self._set_label(state) - def _set_label(self, active): + def _set_label(self, active: bool) -> None: text = Q_('?switch:On') if active else Q_('?switch:Off') self._switch_state_label.set_text(text) - def _on_enable_switch(self, switch, state, account): - def _on_disconnect(event): + def _on_enable_switch(self, + switch: Gtk.Switch, + state: bool, + account: str + ) -> int: + def _on_disconnect(event: AccountDisonnected) -> None: if event.account != account: return app.ged.remove_event_handler('account-disconnected', @@ -549,7 +588,7 @@ def _on_disconnect(event): _on_disconnect) app.interface.disable_account(account) - def _disable(): + def _disable() -> None: app.ged.register_event_handler('account-disconnected', ged.CORE, _on_disconnect) @@ -564,6 +603,7 @@ def _disable(): if (account in app.connections and not app.connections[account].state.is_disconnected): # Connecting or connected + window = cast(Gtk.Window, self.get_toplevel()) ConfirmationDialog( _('Disable Account'), _('Account %s is still connected') % account, @@ -573,7 +613,7 @@ def _disable(): DialogButton.make('Remove', text=_('_Disable Account'), callback=_disable)], - transient_for=self.get_toplevel()).show() + transient_for=window).show() return Gdk.EVENT_STOP if state: @@ -585,7 +625,7 @@ def _disable(): class AddNewAccountPage(Gtk.Box): - def __init__(self): + def __init__(self) -> None: Gtk.Box.__init__(self, orientation=Gtk.Orientation.VERTICAL, spacing=18) @@ -597,7 +637,7 @@ def __init__(self): 'org.gajim.Gajim-symbolic', 100, self.get_scale_factor(), - 0) + Gtk.IconLookupFlags.FORCE_SIZE) self.add(Gtk.Image.new_from_pixbuf(pixbuf)) button = Gtk.Button(label=_('Add Account')) @@ -608,7 +648,10 @@ def __init__(self): class GenericSettingPage(Gtk.Box): - def __init__(self, account, settings): + + name = '' + + def __init__(self, account: str, settings: list[Setting]) -> None: Gtk.Box.__init__(self, orientation=Gtk.Orientation.VERTICAL, spacing=12) self.set_valign(Gtk.Align.START) self.set_vexpand(True) @@ -626,11 +669,11 @@ def __init__(self, account, settings): self.pack_end(self.listbox, True, True, 0) - def connect_signal(self, stack): + def connect_signal(self, stack: Gtk.Stack) -> int: return stack.connect('notify::visible-child', self._on_visible_child_changed) - def _on_visible_child_changed(self, stack, _param): + def _on_visible_child_changed(self, stack: Gtk.Stack, _param: Any) -> None: if self == stack.get_visible_child(): self.listbox.update_states() @@ -639,7 +682,7 @@ class GeneralPage(GenericSettingPage): name = 'general' - def __init__(self, account): + def __init__(self, account: str) -> None: settings = [ Setting(SettingKind.ENTRY, _('Label'), @@ -689,15 +732,16 @@ def __init__(self, account): ] GenericSettingPage.__init__(self, account, settings) - def _on_account_name_change(self, *args): - self.get_toplevel().update_account_label(self.account) + def _on_account_name_change(self, *args: Any) -> None: + window = cast(AccountsWindow, self.get_toplevel()) + window.update_account_label(self.account) class PrivacyPage(GenericSettingPage): name = 'privacy' - def __init__(self, account): + def __init__(self, account: str) -> None: self._account = account history_max_age = { @@ -792,27 +836,28 @@ def __init__(self, account): GenericSettingPage.__init__(self, account, settings) @staticmethod - def _reset_send_chatstate(button): + def _reset_send_chatstate(button: Gtk.Button) -> None: button.set_sensitive(False) app.settings.set_contact_settings('send_chatstate', None) @staticmethod - def _reset_gc_send_chatstate(button): + def _reset_gc_send_chatstate(button: Gtk.Button) -> None: button.set_sensitive(False) app.settings.set_group_chat_settings('send_chatstate', None) - def _send_read_marker(self, state, _data): + def _send_read_marker(self, state: bool, _data: Any) -> None: app.settings.set_account_setting( self._account, 'send_marker_default', state) app.settings.set_account_setting( self._account, 'gc_send_marker_private_default', state) - def _reset_send_read_marker(self, button): + def _reset_send_read_marker(self, button: Gtk.Button) -> None: button.set_sensitive(False) app.settings.set_contact_settings('send_marker', None) app.settings.set_group_chat_settings( 'send_marker', None, context='private') for ctrl in app.window.get_controls(account=self._account): + assert not isinstance(ctrl, BaseControl) ctrl.update_actions() @@ -820,7 +865,7 @@ class ConnectionPage(GenericSettingPage): name = 'connection' - def __init__(self, account): + def __init__(self, account: str) -> None: settings = [ Setting(SettingKind.POPOVER, _('Proxy'), @@ -853,22 +898,23 @@ def __init__(self, account): GenericSettingPage.__init__(self, account, settings) @staticmethod - def _get_proxies(): + def _get_proxies() -> dict[str, str]: return {proxy: proxy for proxy in app.settings.get_proxies()} @staticmethod - def _on_proxy_edit(*args): + def _on_proxy_edit(*args: Any) -> None: open_window('ManageProxies') - def update_proxy_entries(self): - self.listbox.get_setting('proxy').update_entries(self._get_proxies()) + def update_proxy_entries(self) -> None: + popover_row = cast(PopoverSetting, self.listbox.get_setting('proxy')) + popover_row.update_entries(self._get_proxies()) class AdvancedPage(GenericSettingPage): name = 'advanced' - def __init__(self, account): + def __init__(self, account: str) -> None: settings = [ Setting(SettingKind.SWITCH, _('Contact Information'), @@ -897,7 +943,7 @@ class ZeroConfPage(GenericSettingPage): name = 'general' - def __init__(self, account): + def __init__(self, account: str) -> None: settings = [ Setting(SettingKind.DIALOG, _('Profile'), @@ -922,7 +968,7 @@ def __init__(self, account): class ZeroconfProfileDialog(SettingsDialog): - def __init__(self, account, parent): + def __init__(self, account: str, parent: Gtk.Window) -> None: settings = [ Setting(SettingKind.ENTRY, _('First Name'), @@ -943,7 +989,7 @@ def __init__(self, account, parent): class PriorityDialog(SettingsDialog): - def __init__(self, account, parent): + def __init__(self, account: str, parent: Gtk.Window) -> None: neg_priority = app.settings.get('enable_negative_priority') if neg_priority: @@ -969,7 +1015,7 @@ def __init__(self, account, parent): self.connect('destroy', self.on_destroy) - def on_destroy(self, *args): + def on_destroy(self, *args: Any) -> None: # Update priority if self.account not in app.connections: return @@ -979,7 +1025,7 @@ def on_destroy(self, *args): class CutstomHostnameDialog(SettingsDialog): - def __init__(self, account, parent): + def __init__(self, account: str, parent: Gtk.Window) -> None: type_values = ('START TLS', 'DIRECT TLS', 'PLAIN') @@ -1008,7 +1054,7 @@ def __init__(self, account, parent): class CertificateDialog(SettingsDialog): - def __init__(self, account, parent): + def __init__(self, account: str, parent: Gtk.Window) -> None: settings = [ Setting(SettingKind.FILECHOOSER, _('Client Certificate'), @@ -1024,7 +1070,7 @@ def __init__(self, account, parent): class LoginDialog(SettingsDialog): - def __init__(self, account, parent): + def __init__(self, account: str, parent: Gtk.Window) -> None: settings = [ Setting(SettingKind.ENTRY, _('Password'), @@ -1033,7 +1079,8 @@ def __init__(self, account, parent): Setting(SettingKind.SWITCH, _('Save Password'), SettingType.ACCOUNT_CONFIG, 'savepass', - enabled_func=lambda: not app.settings.get('use_keyring') or passwords.KEYRING_AVAILABLE), + enabled_func=(lambda: not app.settings.get('use_keyring') + or passwords.KEYRING_AVAILABLE)), Setting(SettingKind.CHANGEPASSWORD, _('Change Password'), SettingType.DIALOG, callback=self.on_password_change, @@ -1048,10 +1095,10 @@ def __init__(self, account, parent): self.connect('destroy', self.on_destroy) - def on_password_change(self, new_password, _data): + def on_password_change(self, new_password: str, _data: Any) -> None: passwords.save_password(self.account, new_password) - def on_destroy(self, *args): + def on_destroy(self, *args: Any) -> None: savepass = app.settings.get_account_setting(self.account, 'savepass') if not savepass: passwords.delete_password(self.account) ===================================== gajim/gtk/blocking.py ===================================== @@ -12,13 +12,18 @@ # 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 cast + import logging -from nbxmpp.errors import StanzaError from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GLib +from nbxmpp.errors import StanzaError +from nbxmpp.protocol import JID +from nbxmpp.task import Task + from gajim.common import app from gajim.common.i18n import _ from gajim.common.helpers import to_user_string @@ -30,7 +35,7 @@ class BlockingList(Gtk.ApplicationWindow): - def __init__(self, account): + def __init__(self, account: str) -> None: Gtk.ApplicationWindow.__init__(self) self.set_application(app.app) self.set_position(Gtk.WindowPosition.CENTER) @@ -40,8 +45,8 @@ def __init__(self, account): self.connect_after('key-press-event', self._on_key_press) self.account = account - self._con = app.connections[account] - self._prev_blocked_jids = set() + self._client = app.get_client(account) + self._prev_blocked_jids: set[JID] = set() self._ui = get_builder('blocking_list.ui') self.add(self._ui.blocking_grid) @@ -55,36 +60,36 @@ def __init__(self, account): self._activate_spinner() - self._con.get_module('Blocking').request_blocking_list( + self._client.get_module('Blocking').request_blocking_list( callback=self._on_blocking_list_received) - def _show_error(self, error): + def _show_error(self, error: str) -> None: dialog = HigDialog( self, Gtk.MessageType.INFO, Gtk.ButtonsType.OK, _('Error!'), GLib.markup_escape_text(error)) dialog.popup() - def _on_blocking_list_received(self, task): + def _on_blocking_list_received(self, task: Task) -> None: try: - blocking_list = task.finish() + blocking_list = cast(set[JID], task.finish()) except StanzaError as error: self._set_grid_state(False) self._show_error(to_user_string(error)) return - self._prev_blocked_jids = set(blocking_list) + self._prev_blocked_jids = blocking_list self._ui.blocking_store.clear() for jid in blocking_list: - self._ui.blocking_store.append((str(jid),)) + self._ui.blocking_store.append([str(jid)]) self._set_grid_state(True) self._disable_spinner() - def _on_save_result(self, task): + def _on_save_result(self, task: Task): try: - _successful = task.finish() + _successful = cast(bool, task.finish()) except StanzaError as error: self._show_error(to_user_string(error)) self._disable_spinner() @@ -93,44 +98,51 @@ def _on_save_result(self, task): self.destroy() - def _set_grid_state(self, state): + def _set_grid_state(self, state: bool) -> None: self._ui.blocking_grid.set_sensitive(state) - def _jid_edited(self, _renderer, path, new_text): + def _jid_edited(self, + _renderer: Gtk.CellRendererText, + path: str, + new_text: str + ) -> None: iter_ = self._ui.blocking_store.get_iter(path) self._ui.blocking_store.set_value(iter_, 0, new_text) - def _on_add(self, _button): + def _on_add(self, _button: Gtk.ToolButton) -> None: self._ui.blocking_store.append(['']) - def _on_remove(self, _button): - mod, paths = self._ui.block_view.get_selection().get_selected_rows() + def _on_remove(self, _button: Gtk.ToolButton) -> None: + selected_rows = self._ui.block_view.get_selection().get_selected_rows() + if selected_rows is None: + return + mod, paths = selected_rows for path in paths: iter_ = mod.get_iter(path) self._ui.blocking_store.remove(iter_) - def _on_save(self, _button): + def _on_save(self, _button: Gtk.Button) -> None: self._activate_spinner() self._set_grid_state(False) - blocked_jids = set() + blocked_jids: set[JID] = set() for item in self._ui.blocking_store: - blocked_jids.add(item[0].lower()) + blocked_jids.add(JID.from_string(item[0].lower())) unblock_jids = self._prev_blocked_jids - blocked_jids block_jids = blocked_jids - self._prev_blocked_jids - self._con.get_module('Blocking').update_blocking_list( + self._client.get_module('Blocking').update_blocking_list( block_jids, unblock_jids, callback=self._on_save_result) - def _activate_spinner(self): + def _activate_spinner(self) -> None: self._spinner.show() self._spinner.start() - def _disable_spinner(self): + def _disable_spinner(self) -> None: self._spinner.hide() self._spinner.stop() - def _on_key_press(self, _widget, event): + def _on_key_press(self, _widget: Gtk.Widget, event: Gdk.EventKey) -> None: if event.keyval == Gdk.KEY_Escape: self.destroy() ===================================== gajim/gtk/builder.py ===================================== @@ -86,5 +86,5 @@ def get(self, name: str) -> Any: return self._builder.get_object(name) -def get_builder(file_name, widgets=None): +def get_builder(file_name: str, widgets: Optional[list[str]] = None) -> Builder: return Builder(file_name, widgets) ===================================== gajim/gtk/chat_list.py ===================================== @@ -32,20 +32,11 @@ from gajim.common import app from gajim.common import ged +from gajim.common import events from gajim.common.const import AvatarSize from gajim.common.const import Direction from gajim.common.const import KindConstant from gajim.common.const import RowHeaderType -from gajim.common.events import ApplicationEvent -from gajim.common.events import BookmarksReceived -from gajim.common.events import FileRequestReceivedEvent -from gajim.common.events import JingleRequestReceived -from gajim.common.events import MessageUpdated -from gajim.common.events import MessageSent -from gajim.common.events import MessageReceived -from gajim.common.events import MamMessageReceived -from gajim.common.events import GcMessageReceived -from gajim.common.events import PresenceReceived from gajim.common.i18n import _ from gajim.common.helpers import get_groupchat_name from gajim.common.helpers import get_group_chat_nick @@ -63,7 +54,9 @@ log = logging.getLogger('gajim.gui.chatlist') -MessageEventT = Union[MessageReceived, GcMessageReceived, MamMessageReceived] +MessageEventT = Union[events.MessageReceived, + events.GcMessageReceived, + events.MamMessageReceived] class ChatList(Gtk.ListBox, EventHelper): @@ -375,20 +368,20 @@ def update_time(self) -> None: for _key, row in self._chats.items(): row.update_time() - def process_event(self, event: ApplicationEvent) -> None: - if event.name in ('message-received', - 'mam-message-received', - 'gc-message-received'): + def process_event(self, event: events.ApplicationEvent) -> None: + if isinstance(event, (events.MessageReceived, + events.MamMessageReceived, + events.GcMessageReceived)): self._on_message_received(event) - elif event.name == 'message-updated': + elif isinstance(event, events.MessageUpdated): self._on_message_updated(event) - elif event.name == 'presence-received': + elif isinstance(event, events.PresenceReceived): self._on_presence_received(event) - elif event.name == 'message-sent': + elif isinstance(event, events.MessageSent): self._on_message_sent(event) - elif event.name == 'jingle-request-received': + elif isinstance(event, events.JingleRequestReceived): self._on_jingle_request_received(event) - elif event.name == 'file-request-received': + elif isinstance(event, events.FileRequestReceivedEvent): self._on_file_request_received(event) else: log.warning('Unhandled Event: %s', event.name) @@ -434,7 +427,7 @@ def _get_nick_for_received_message(event: MessageEventT) -> str: nick = '' return nick - def _on_message_updated(self, event: MessageUpdated) -> None: + def _on_message_updated(self, event: events.MessageUpdated) -> None: row = self._chats.get((event.account, JID.from_string(event.jid))) if row is None: return @@ -451,7 +444,7 @@ def _on_message_updated(self, event: MessageUpdated) -> None: event.properties.moderation.reason) row.set_message_text(text) - def _on_message_sent(self, event: MessageSent) -> None: + def _on_message_sent(self, event: events.MessageSent) -> None: msgtext = event.message if not msgtext: return @@ -477,14 +470,14 @@ def _on_message_sent(self, event: MessageSent) -> None: additional_data=event.additional_data) self.invalidate_sort() - def _on_presence_received(self, event: PresenceReceived) -> None: + def _on_presence_received(self, event: events.PresenceReceived) -> None: row = self._chats.get((event.account, JID.from_string(event.jid))) if row is None: return row.update_avatar() def _on_jingle_request_received(self, - event: JingleRequestReceived + event: events.JingleRequestReceived ) -> None: content_types: list[str] = [] for item in event.contents: @@ -500,7 +493,7 @@ def _on_jingle_request_received(self, _('Call'), icon_name='call-start-symbolic') def _on_file_request_received(self, - event: FileRequestReceivedEvent + event: events.FileRequestReceivedEvent ) -> None: row = self._chats.get((event.account, JID.from_string(event.jid))) if row is None: @@ -534,7 +527,7 @@ def _on_account_changed(self, *args: Any) -> None: for row in rows: row.update_account_identifier() - def _on_bookmarks_received(self, _event: BookmarksReceived) -> None: + def _on_bookmarks_received(self, _event: events.BookmarksReceived) -> None: rows = cast(list[ChatRow], self.get_children()) for row in rows: row.update_name() @@ -674,7 +667,7 @@ def header(self) -> Optional[RowHeaderType]: return header.type @header.setter - def header(self, type_: RowHeaderType) -> None: + def header(self, type_: Optional[RowHeaderType]) -> None: if type_ == self.header: return if type_ is None: @@ -822,7 +815,7 @@ def _get_unread_string(count: int) -> str: def add_unread(self, text: str) -> None: control = app.window.get_control(self.account, self.jid) - if self.is_active and control.get_autoscroll(): + if self.is_active and control is not None and control.get_autoscroll(): return self._unread_count += 1 ===================================== gajim/gtk/const.py ===================================== @@ -14,16 +14,36 @@ # Constants for the gtk module +from __future__ import annotations + +from typing import Any +from typing import Callable +from typing import NamedTuple +from typing import Optional + from collections import namedtuple from enum import Enum from enum import IntEnum from enum import unique +from gajim.common.setting_values import AllSettingsT + Filter = namedtuple('Filter', 'name pattern default') -Setting = namedtuple('Setting', 'kind label type value name callback data desc ' - 'bind inverted enabled_func props') -Setting.__new__.__defaults__ = (None,) * len(Setting._fields) # type: ignore + +class Setting(NamedTuple): + kind: SettingKind + label: str + type: SettingType + value: Optional[AllSettingsT] = None + name: Optional[str] = None + callback: Optional[Callable[..., None]] = None + data: Optional[Any] = None + desc: Optional[str] = None + bind: Optional[str] = None + inverted: Optional[bool] = None + enabled_func: Optional[Callable[..., bool]] = None + props: Optional[dict[str, Any]] = None DEFAULT_WORKSPACE_COLOR = 'rgb(191,15,167)' ===================================== gajim/gtk/contact_info.py ===================================== @@ -16,12 +16,14 @@ from typing import Optional from typing import Union +from typing import cast import logging from enum import IntEnum from gi.repository import Gtk from gi.repository import Gdk +from gi.repository import GdkPixbuf from gi.repository import GObject from nbxmpp.task import Task @@ -210,6 +212,7 @@ def _fill_groups_page(self, contact: BareContact) -> None: return model = self._ui.groups_treeview.get_model() + assert isinstance(model, Gtk.ListStore) model.set_sort_column_id(Column.GROUP_NAME, Gtk.SortType.ASCENDING) groups = self._client.get_module('Roster').get_groups() for group in groups: @@ -247,7 +250,7 @@ def _query_device(self, contact: ResourceContact) -> None: def _on_vcard_received(self, task: Task) -> None: try: - vcard = task.finish() + vcard = cast(VCard, task.finish()) except StanzaError as err: log.info('Error loading VCard: %s', err) vcard = VCard() @@ -262,6 +265,8 @@ def _load_avatar(self) -> None: surface_2 = self.contact.get_avatar(AvatarSize.VCARD_HEADER, scale, add_show=False) + assert not isinstance(surface_1, GdkPixbuf.Pixbuf) + assert not isinstance(surface_2, GdkPixbuf.Pixbuf) self._ui.avatar_image.set_from_surface(surface_1) self._ui.header_image.set_from_surface(surface_2) @@ -269,7 +274,7 @@ def _set_os_info(self, task: Task) -> None: self._tasks.remove(task) try: - result = task.finish() + result = cast(SoftwareVersionResult, task.finish()) except Exception as err: log.warning('Could not retrieve software version: %s', err) result = None @@ -282,7 +287,7 @@ def _set_entity_time(self, task: Task) -> None: self._tasks.remove(task) try: - entity_time = task.finish() + entity_time = cast(str, task.finish()) except Exception as err: log.warning('Could not retrieve entity time: %s', err) entity_time = None @@ -373,13 +378,15 @@ def _on_group_name_edited(self, model = self._ui.groups_treeview.get_model() assert model is not None + assert isinstance(model, Gtk.ListStore) selected_iter_ = model.get_iter(path) old_name = model[selected_iter_][Column.GROUP_NAME] # Check if group already exists iter_ = model.get_iter_first() while iter_: - if model.get_value(iter_, Column.GROUP_NAME) == new_name: + group_name = model.get_value(iter_, Column.GROUP_NAME).get_string() + if group_name == new_name: return iter_ = model.iter_next(iter_) @@ -418,7 +425,9 @@ def _on_group_toggled(self, iter_ = model.get_iter_first() while iter_: if model.get_value(iter_, Column.IN_GROUP): - groups.add(model.get_value(iter_, Column.GROUP_NAME)) + group_name = model.get_value( + iter_, Column.GROUP_NAME).get_string() + groups.add(group_name) iter_ = model.iter_next(iter_) self._client.get_module('Roster').set_groups(self.contact.jid, groups) @@ -427,11 +436,13 @@ def _on_group_add_button_clicked(self, _widget: Gtk.Button) -> None: default_name = _('New Group') model = self._ui.groups_treeview.get_model() assert model is not None + assert isinstance(model, Gtk.ListStore) # Check if default_name group already exists iter_ = model.get_iter_first() while iter_: - if model.get_value(iter_, Column.GROUP_NAME) == default_name: + group_name = model.get_value(iter_, Column.GROUP_NAME).get_string() + if group_name == default_name: default_name += '_' iter_ = model.iter_next(iter_) ===================================== gajim/gtk/preferences.py ===================================== @@ -35,11 +35,14 @@ from gajim.common.multimedia_helpers import VideoInputManager from gajim.common.events import StyleChanged from gajim.common.events import ThemeUpdate +from gajim.common.setting_values import AllSettings from .const import Setting from .const import SettingKind from .const import SettingType +from .controls.groupchat import GroupchatControl from .emoji_chooser import emoji_chooser +from .settings import PopoverSetting from .settings import SettingsBox from .settings import SettingsDialog from .sidebar_switcher import SideBarSwitcher @@ -68,7 +71,7 @@ def __init__(self) -> None: self._ui = get_builder('preferences.ui') self._video_preview: Optional[VideoPreview] = None - self._prefs = {} + self._prefs: dict[str, PreferenceBox] = {} side_bar_switcher = SideBarSwitcher() side_bar_switcher.set_stack(self._ui.stack) @@ -142,10 +145,12 @@ def _on_features_clicked(_widget: Gtk.InfoBar, open_window('Features') def update_theme_list(self) -> None: - self._prefs['themes'].update_theme_list() + themes = cast(Themes, self._prefs['themes']) + themes.update_theme_list() def update_proxy_list(self) -> None: - self._prefs['miscellaneous'].update_proxy_list() + miscellaneous = cast(Miscellaneous, self._prefs['miscellaneous']) + miscellaneous.update_proxy_list() @staticmethod def _check_emoji_theme() -> None: @@ -333,13 +338,17 @@ def __init__(self, *args: Any) -> None: def _on_sort_by_show_in_muc(_value: bool, *args: Any) -> None: for ctrl in app.window.get_controls(): if ctrl.is_groupchat: - ctrl.roster.invalidate_sort() + 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: for ctrl in app.window.get_controls(): if ctrl.is_groupchat: - ctrl.roster.draw_contacts() + assert isinstance(ctrl, GroupchatControl) + if ctrl.roster is not None: + ctrl.roster.draw_contacts() @staticmethod def _reset_join_left(button: Gtk.Button) -> None: @@ -648,7 +657,8 @@ def _get_theme_items() -> list[str]: return theme_items def update_theme_list(self) -> None: - self.get_setting('roster_theme').update_entries(self._get_theme_items()) + popover_row = cast(PopoverSetting, self.get_setting('roster_theme')) + popover_row.update_entries(self._get_theme_items()) def _on_edit_themes(self, _button: Gtk.Button) -> None: open_window('Themes', transient=self.get_toplevel()) @@ -874,8 +884,8 @@ def _create_av_combo_items(items_dict: dict[str, str]) -> dict[str, str]: class Miscellaneous(PreferenceBox): def __init__(self, pref_window: Preferences) -> None: - self._hints_list = [ - 'start_chat', + self._hints_list: list[AllSettings] = [ + 'show_help_start_chat', ] settings = [ @@ -919,17 +929,18 @@ def _on_proxy_edit(*args: Any) -> None: open_window('ManageProxies') def update_proxy_list(self) -> None: - self.get_setting('global_proxy').update_entries(self._get_proxies()) + popover_row = cast(PopoverSetting, self.get_setting('global_proxy')) + popover_row.update_entries(self._get_proxies()) def _check_hints_reset(self) -> bool: for hint in self._hints_list: - if app.settings.get(f'show_help_{hint}') is False: + if app.settings.get(hint) is False: return True return False def _on_reset_hints(self, button: Gtk.Button) -> None: for hint in self._hints_list: - app.settings.set(f'show_help_{hint}', True) + app.settings.set(hint, True) button.set_sensitive(False) ===================================== gajim/gtk/settings.py ===================================== @@ -14,26 +14,48 @@ # You should have received a copy of the GNU General Public License # along with Gajim. If not, see <
http://www.gnu.org/licenses/
>. +from __future__ import annotations + +from typing import Any +from typing import Callable +from typing import Optional +from typing import Union +from typing import cast + +import logging + from gi.repository import Gtk from gi.repository import GLib from gi.repository import Gdk from gi.repository import Pango +from nbxmpp.protocol import JID + from gajim.common import app from gajim.common import passwords from gajim.common.i18n import _ from gajim.common.i18n import Q_ +from gajim.common.setting_values import AllSettingsT from .util import get_image_button from .util import MaxWidthComboBoxText from .util import open_window +from .const import Setting from .const import SettingKind from .const import SettingType +log = logging.getLogger('gajim.gui.settings') + class SettingsDialog(Gtk.ApplicationWindow): - def __init__(self, parent, title, flags, settings, account, - extend=None): + def __init__(self, + parent: Gtk.Window, + title: str, + flags: Gtk.DialogFlags, + settings: list[Setting], + account: str, + extend: Optional[dict[SettingKind, GenericSetting]] = None + ) -> None: Gtk.ApplicationWindow.__init__(self) self.set_application(app.app) self.set_show_menubar(False) @@ -62,23 +84,27 @@ def __init__(self, parent, title, flags, settings, account, self.show_all() self.connect_after('key-press-event', self.on_key_press) - def on_key_press(self, _widget, event): + def on_key_press(self, _widget: Gtk.Widget, event: Gdk.EventKey) -> None: if event.keyval == Gdk.KEY_Escape: self.destroy() - def get_setting(self, name): + def get_setting(self, name: str): return self.listbox.get_setting(name) class SettingsBox(Gtk.ListBox): - def __init__(self, account=None, jid=None, extend=None): + def __init__(self, + account: Optional[str] = None, + jid: Optional[str] = None, + extend: Optional[dict[SettingKind, GenericSetting]] = None + ) -> None: Gtk.ListBox.__init__(self) self.get_style_context().add_class('settings-box') self.account = account self.jid = jid - self.named_settings = {} + self.named_settings: dict[str, GenericSetting] = {} - self.map = { + self.map: dict[SettingKind, GenericSetting] = { SettingKind.SWITCH: SwitchSetting, SettingKind.SPIN: SpinSetting, SettingKind.DIALOG: DialogSetting, @@ -107,16 +133,16 @@ def __init__(self, account=None, jid=None, extend=None): self.connect('destroy', self.__on_destroy) @staticmethod - def __on_destroy(widget): + def __on_destroy(widget: SettingsBox) -> None: app.check_finalize(widget) for row in widget.get_children(): app.check_finalize(row) @staticmethod - def on_row_activated(_listbox, row): + def on_row_activated(_listbox: SettingsBox, row: GenericSetting) -> None: row.on_row_activated() - def add_setting(self, setting): + def add_setting(self, setting: Setting) -> None: if not isinstance(setting, Gtk.ListBoxRow): if setting.props is not None: listitem = self.map[setting.kind](self.account, @@ -132,28 +158,29 @@ def add_setting(self, setting): self.named_settings[setting.name] = listitem self.add(listitem) - def get_setting(self, name): + def get_setting(self, name: str) -> GenericSetting: return self.named_settings[name] - def update_states(self): - for row in self.get_children(): + def update_states(self) -> None: + for row in cast(list[GenericSetting], self.get_children()): row.update_activatable() class GenericSetting(Gtk.ListBoxRow): def __init__(self, - account, - jid, - label, - type_, - value, - name, - callback, - data, - desc, - bind, - inverted, - enabled_func): + account: str, + jid: JID, + label: str, + type_: SettingType, + value: AllSettingsT, + name: Optional[str], + callback: Optional[Callable[..., None]] = None, + data: Optional[Any] = None, + desc: Optional[str] = None, + bind: Optional[str] = None, + inverted: bool = False, + enabled_func: Optional[Callable[..., bool]] = None + ) -> None: Gtk.ListBoxRow.__init__(self) self._grid = Gtk.Grid() @@ -207,7 +234,7 @@ def __init__(self, self._bind_sensitive_state() - def _bind_sensitive_state(self): + def _bind_sensitive_state(self) -> None: if self.bind is None: return @@ -236,7 +263,11 @@ def _bind_sensitive_state(self): value = not value self.set_sensitive(value) - def _parse_bind(self): + def _parse_bind(self) -> tuple[SettingType, + str, + Optional[str], + Optional[JID]]: + assert self.bind is not None if '::' not in self.bind: return SettingType.CONFIG, self.bind, None, None @@ -258,7 +289,11 @@ def get_value(self): self.jid) @staticmethod - def __get_value(type_, value, account, jid): + def __get_value(type_: SettingType, + value: AllSettingsT, + account: str, + jid: JID + ) -> Optional[AllSettingsT]: if value is None: return None if type_ == SettingType.VALUE: @@ -284,20 +319,23 @@ def __get_value(type_, value, account, jid): return app.settings.get_account_setting(account, value) if type_ == SettingType.ACTION: + assert isinstance(value, str) if value.startswith('-'): return account + value return value raise ValueError('Wrong SettingType?') - def set_value(self, state): + def set_value(self, state: AllSettingsT) -> None: if self.type_ == SettingType.CONFIG: app.settings.set(self.value, state) elif self.type_ == SettingType.ACCOUNT_CONFIG: if self.value == 'password': + assert isinstance(state, str) passwords.save_password(self.account, state) if self.value == 'no_log_for': + assert isinstance(state, bool) self.set_no_log_for(self.account, state) else: app.settings.set_account_setting(self.account, @@ -316,7 +354,7 @@ def set_value(self, state): self.callback(state, self.data) @staticmethod - def set_no_log_for(account, state): + def set_no_log_for(account: str, state: bool) -> None: no_log = app.settings.get_account_setting(account, 'no_log_for').split() if state and account in no_log: no_log.remove(account) @@ -326,10 +364,10 @@ def set_no_log_for(account, state): 'no_log_for', ' '.join(no_log)) - def on_row_activated(self): + def on_row_activated(self) -> None: raise NotImplementedError - def update_activatable(self): + def update_activatable(self) -> None: if self.enabled_func is None: return @@ -337,11 +375,15 @@ def update_activatable(self): self.set_activatable(enabled_func_value) self.set_sensitive(enabled_func_value) - def _add_action_button(self, kwargs): - icon_name = kwargs.get('button-icon-name') - button_text = kwargs.get('button-text') - tooltip_text = kwargs.get('button-tooltip') or '' - style = kwargs.get('button-style') + def _add_action_button(self, + kwargs: dict[str, Union[str, + Callable[..., None], + None]] + ) -> None: + icon_name = cast(str, kwargs.get('button-icon-name')) + button_text = cast(str, kwargs.get('button-text')) + tooltip_text = cast(str, kwargs.get('button-tooltip') or '') + style = cast(str, kwargs.get('button-style')) if icon_name is not None: button = Gtk.Button.new_from_icon_name(icon_name, Gtk.IconSize.MENU) @@ -356,18 +398,21 @@ def _add_action_button(self, kwargs): for css_class in style.split(' '): button.get_style_context().add_class(css_class) - button.connect('clicked', kwargs['button-callback']) + callback = kwargs['button-callback'] + assert isinstance(callback, Callable) + button.connect('clicked', callback) button.set_tooltip_text(tooltip_text) self.setting_box.add(button) class SwitchSetting(GenericSetting): - def __init__(self, *args, **kwargs): + def __init__(self, *args: Any, **kwargs: Any) -> None: GenericSetting.__init__(self, *args) self.switch = Gtk.Switch() if self.type_ == SettingType.ACTION: - self.switch.set_action_name('app.%s' % self.setting_value) + self.switch.set_action_name(f'app.{self.setting_value}') + assert isinstance(self.setting_value, str) state = app.app.get_action_state(self.setting_value) self.switch.set_active(state.get_boolean()) else: @@ -392,22 +437,22 @@ def __init__(self, *args, **kwargs): self.show_all() - def on_row_activated(self): + def on_row_activated(self) -> None: state = self.switch.get_active() self.switch.set_active(not state) - def on_switch(self, switch, *args): + def on_switch(self, switch: Gtk.Switch, *args: Any) -> None: value = switch.get_active() self.set_value(value) self._set_label(value) - def _set_label(self, active): + def _set_label(self, active: bool) -> None: text = Q_('?switch:On') if active else Q_('?switch:Off') self._switch_state_label.set_text(text) class EntrySetting(GenericSetting): - def __init__(self, *args): + def __init__(self, *args: Any) -> None: GenericSetting.__init__(self, *args) self.entry = Gtk.Entry() @@ -422,6 +467,7 @@ def __init__(self, *args): self.setting_box.pack_end(self.entry, True, True, 0) + assert isinstance(self.value, str) app.settings.connect_signal(self.value, self._on_setting_changed, account=self.account, @@ -431,25 +477,26 @@ def __init__(self, *args): self.show_all() - def _on_setting_changed(self, value, *args): + def _on_setting_changed(self, value: str, *args: Any) -> None: self.entry.set_text(value) - def _on_destroy(self, *args): + def _on_destroy(self, *args: Any) -> None: app.settings.disconnect_signals(self) - def on_text_change(self, *args): + def on_text_change(self, *args: Any) -> None: text = self.entry.get_text() self.set_value(text) - def on_row_activated(self): + def on_row_activated(self) -> None: self.entry.grab_focus() class ColorSetting(GenericSetting): - def __init__(self, *args): + def __init__(self, *args: Any) -> None: GenericSetting.__init__(self, *args) rgba = Gdk.RGBA() + assert isinstance(self.setting_value, str) rgba.parse(self.setting_value) self.color_button = Gtk.ColorButton() self.color_button.set_rgba(rgba) @@ -459,6 +506,7 @@ def __init__(self, *args): self.setting_box.pack_end(self.color_button, True, True, 0) + assert isinstance(self.value, str) app.settings.connect_signal(self.value, self._on_setting_changed, account=self.account, @@ -468,25 +516,25 @@ def __init__(self, *args): self.show_all() - def _on_setting_changed(self, value, *args): + def _on_setting_changed(self, value: str, *args: Any) -> None: rgba = Gdk.RGBA() rgba.parse(value) self.color_button.set_rgba(rgba) - def _on_destroy(self, *args): + def _on_destroy(self, *args: Any) -> None: app.settings.disconnect_signals(self) - def on_color_set(self, button): + def on_color_set(self, button: Gtk.ColorButton) -> None: rgba = button.get_rgba() self.set_value(rgba.to_string()) app.css_config.refresh() - def on_row_activated(self): + def on_row_activated(self) -> None: self.color_button.grab_focus() class DialogSetting(GenericSetting): - def __init__(self, *args, dialog): + def __init__(self, *args: Any, dialog: SettingsDialog) -> None: GenericSetting.__init__(self, *args) self.dialog = dialog @@ -497,24 +545,26 @@ def __init__(self, *args, dialog): self.show_all() - def show_dialog(self, parent): + def show_dialog(self, parent: Gtk.Window) -> None: if self.dialog: dialog = self.dialog(self.account, parent) dialog.connect('destroy', self.on_destroy) - def on_destroy(self, *args): + def on_destroy(self, *args: Any) -> None: self.setting_value.set_text(self.get_setting_value()) - def get_setting_value(self): + def get_setting_value(self) -> str: self.setting_value.hide() return '' - def on_row_activated(self): - self.show_dialog(self.get_toplevel()) + def on_row_activated(self) -> None: + window = self.get_toplevel() + assert isinstance(window, Gtk.Window) + self.show_dialog(window) class SpinSetting(GenericSetting): - def __init__(self, *args, range_): + def __init__(self, *args: Any, range_: tuple[float, float]) -> None: GenericSetting.__init__(self, *args) lower, upper = range_ @@ -529,7 +579,9 @@ def __init__(self, *args, range_): self.spin.set_adjustment(adjustment) self.spin.set_numeric(True) self.spin.set_update_policy(Gtk.SpinButtonUpdatePolicy.IF_VALID) - self.spin.set_value(self.setting_value) + + assert self.setting_value is not None + self.spin.set_value(float(self.setting_value)) self.spin.set_halign(Gtk.Align.FILL) self.spin.set_valign(Gtk.Align.CENTER) self.spin.connect('notify::value', self.on_value_change) @@ -538,16 +590,16 @@ def __init__(self, *args, range_): self.show_all() - def on_row_activated(self): + def on_row_activated(self) -> None: self.spin.grab_focus() - def on_value_change(self, spin, *args): + def on_value_change(self, spin: Gtk.SpinButton, *args: Any) -> None: value = spin.get_value_as_int() self.set_value(value) class FileChooserSetting(GenericSetting): - def __init__(self, *args, filefilter): + def __init__(self, *args: Any, filefilter: tuple[str, str]) -> None: GenericSetting.__init__(self, *args) button = Gtk.FileChooserButton(title=self.label, @@ -556,8 +608,10 @@ def __init__(self, *args, filefilter): # GTK Bug: The FileChooserButton expands without limit # get the label and use set_max_wide_chars() - label = button.get_children()[0].get_children()[0].get_children()[1] - label.set_max_width_chars(20) + inner_button = cast(Gtk.Button, button.get_children()[0]) + inner_box = cast(Gtk.Box, inner_button.get_children()[0]) + inner_label = cast(Gtk.Label, inner_box.get_children()[1]) + inner_label.set_max_width_chars(20) if filefilter: name, pattern = filefilter @@ -573,6 +627,7 @@ def __init__(self, *args, filefilter): button.add_filter(filter_) if self.setting_value: + assert isinstance(self.setting_value, str) button.set_filename(self.setting_value) button.connect('selection-changed', self.on_select) @@ -584,28 +639,31 @@ def __init__(self, *args, filefilter): self.show_all() - def on_select(self, filechooser): + def on_select(self, filechooser: Gtk.FileChooser) -> None: self.set_value(filechooser.get_filename() or '') - def on_row_activated(self): + def on_row_activated(self) -> None: pass class CallbackSetting(GenericSetting): - def __init__(self, *args, callback): + def __init__(self, *args: Any, callback: Callable[..., Any]) -> None: GenericSetting.__init__(self, *args) self.callback = callback self.show_all() - def on_row_activated(self): + def on_row_activated(self) -> None: self.callback() class ActionSetting(GenericSetting): - def __init__(self, *args, account): + def __init__(self, *args: Any, account: str) -> None: GenericSetting.__init__(self, *args) - action_name = '%s%s' % (account, self.value) + action_name = f'{account}{self.value}' self.action = app.app.lookup_action(action_name) + if self.action is None: + log.error('Action not found: %s', action_name) + return self.variant = GLib.Variant.new_string(account) self.on_enable() @@ -614,27 +672,34 @@ def __init__(self, *args, account): 'notify::enabled', self.on_enable) self.connect('destroy', self._on_destroy) - def _on_destroy(self, *args): - self.action.disconnect(self._handler_id) + def _on_destroy(self, *args: Any) -> None: + if self.action is not None: + self.action.disconnect(self._handler_id) - def on_enable(self, *args): - self.set_sensitive(self.action.get_enabled()) + def on_enable(self, *args: Any) -> None: + if self.action is not None: + self.set_sensitive(self.action.get_enabled()) - def on_row_activated(self): - self.action.activate(self.variant) + def on_row_activated(self) -> None: + if self.action is not None: + self.action.activate(self.variant) class LoginSetting(DialogSetting): - def __init__(self, *args, **kwargs): + def __init__(self, *args: Any, **kwargs: Any) -> None: DialogSetting.__init__(self, *args, **kwargs) - def get_setting_value(self): + def get_setting_value(self) -> str: jid = app.get_jid_from_account(self.account) return jid class PopoverSetting(GenericSetting): - def __init__(self, *args, entries, **kwargs): + def __init__(self, + *args: Any, + entries: Union[list[str], dict[str, str]], + **kwargs: Any + ) -> None: GenericSetting.__init__(self, *args) self._entries = self._convert_to_dict(entries) @@ -644,7 +709,7 @@ def __init__(self, *args, entries, **kwargs): box.set_halign(Gtk.Align.END) box.set_hexpand(True) - self._default_text = kwargs.get('default-text') + self._default_text = cast(str, kwargs.get('default-text')) self._current_label = Gtk.Label() self._current_label.set_valign(Gtk.Align.CENTER) @@ -683,6 +748,7 @@ def __init__(self, *args, entries, **kwargs): text = self._entries.get(self.setting_value, self._default_text or '') self._current_label.set_text(text) + assert isinstance(self.value, str) app.settings.connect_signal(self.value, self._on_setting_changed, account=self.account, @@ -693,19 +759,20 @@ def __init__(self, *args, entries, **kwargs): self.show_all() @staticmethod - def _convert_to_dict(entries): + def _convert_to_dict(entries: Union[list[Any], dict[Any, Any]] + ) -> dict[Any, Any]: if isinstance(entries, list): entries = {key: key for key in entries} return entries - def _on_setting_changed(self, value, *args): + def _on_setting_changed(self, value: str, *args: Any) -> None: text = self._entries.get(value) if text is None: text = self._default_text or '' self._current_label.set_text(text) - def _add_menu_entries(self): + def _add_menu_entries(self) -> None: if self._default_text is not None: self._menu_listbox.add(PopoverRow(self._default_text, '')) @@ -714,38 +781,44 @@ def _add_menu_entries(self): self._menu_listbox.show_all() - def _on_menu_row_activated(self, listbox, row): + def _on_menu_row_activated(self, + listbox: Gtk.ListBox, + row: PopoverRow + ) -> None: listbox.unselect_all() self._popover.popdown() self.set_value(row.value) - def on_row_activated(self): + def on_row_activated(self) -> None: self._popover.popup() - def update_entries(self, entries): + def update_entries(self, entries: Union[list[str], dict[str, str]]) -> None: self._entries = self._convert_to_dict(entries) self._menu_listbox.foreach(self._menu_listbox.remove) self._add_menu_entries() - def _on_destroy(self, *args): + def _on_destroy(self, *args: Any) -> None: self._popover.destroy() app.settings.disconnect_signals(self) class PopoverRow(Gtk.ListBoxRow): - def __init__(self, label, value): + def __init__(self, label: str, value: str) -> None: Gtk.ListBoxRow.__init__(self) self.label = label self.value = value - label = Gtk.Label(label=label) - label.set_xalign(0) - self.add(label) + row_label = Gtk.Label(label=label) + row_label.set_xalign(0) + self.add(row_label) class ComboSetting(GenericSetting): - def __init__(self, *args, combo_items): + def __init__(self, + *args: Any, + combo_items: list[Union[str, tuple[str, str]]] + ) -> None: GenericSetting.__init__(self, *args) self.combo = MaxWidthComboBoxText() @@ -765,18 +838,20 @@ def __init__(self, *args, combo_items): self.setting_box.pack_start(self.combo, True, True, 0) self.show_all() - def on_value_change(self, combo): - self.set_value(combo.get_active_id()) + def on_value_change(self, combo: Gtk.ComboBox) -> None: + active_id = combo.get_active_id() + if active_id is not None: + self.set_value(active_id) - def on_row_activated(self): + def on_row_activated(self) -> None: pass class PrioritySetting(DialogSetting): - def __init__(self, *args, **kwargs): + def __init__(self, *args: Any, **kwargs: Any) -> None: DialogSetting.__init__(self, *args, **kwargs) - def get_setting_value(self): + def get_setting_value(self) -> str: adjust = app.settings.get_account_setting( self.account, 'adjust_priority_with_status') if adjust: @@ -787,24 +862,24 @@ def get_setting_value(self): class CutstomHostnameSetting(DialogSetting): - def __init__(self, *args, **kwargs): + def __init__(self, *args: Any, **kwargs: Any) -> None: DialogSetting.__init__(self, *args, **kwargs) - def get_setting_value(self): + def get_setting_value(self) -> str: custom = app.settings.get_account_setting(self.account, 'use_custom_host') return Q_('?switch:On') if custom else Q_('?switch:Off') class ChangePasswordSetting(DialogSetting): - def __init__(self, *args, **kwargs): + def __init__(self, *args: Any, **kwargs: Any) -> None: DialogSetting.__init__(self, *args, **kwargs) - def show_dialog(self, parent): + def show_dialog(self, parent: Gtk.Window) -> None: parent.destroy() open_window('ChangePassword', account=self.account) - def update_activatable(self): + def update_activatable(self) -> None: activatable = False if self.account in app.connections: con = app.connections[self.account] @@ -814,36 +889,36 @@ def update_activatable(self): class CutstomAutoAwaySetting(DialogSetting): - def __init__(self, *args, **kwargs): + def __init__(self, *args: Any, **kwargs: Any) -> None: DialogSetting.__init__(self, *args, **kwargs) - def get_setting_value(self): + def get_setting_value(self) -> str: value = app.settings.get('autoaway') return Q_('?switch:On') if value else Q_('?switch:Off') class CutstomAutoExtendedAwaySetting(DialogSetting): - def __init__(self, *args, **kwargs): + def __init__(self, *args: Any, **kwargs: Any) -> None: DialogSetting.__init__(self, *args, **kwargs) - def get_setting_value(self): + def get_setting_value(self) -> str: value = app.settings.get('autoxa') return Q_('?switch:On') if value else Q_('?switch:Off') class CustomStunServerSetting(DialogSetting): - def __init__(self, *args, **kwargs): + def __init__(self, *args: Any, **kwargs: Any) -> None: DialogSetting.__init__(self, *args, **kwargs) - def get_setting_value(self): + def get_setting_value(self) -> str: value = app.settings.get('use_stun_server') return Q_('?switch:On') if value else Q_('?switch:Off') class NotificationsSetting(DialogSetting): - def __init__(self, *args, **kwargs): + def __init__(self, *args: Any, **kwargs: Any) -> None: DialogSetting.__init__(self, *args, **kwargs) - def get_setting_value(self): + def get_setting_value(self) -> str: value = app.settings.get('show_notifications') return Q_('?switch:On') if value else Q_('?switch:Off') ===================================== pyrightconfig.json ===================================== @@ -22,7 +22,9 @@ "gajim/gtk/account_side_bar.py", "gajim/gtk/app_page.py", "gajim/gtk/app_side_bar.py", + "gajim/gtk/blocking.py", "gajim/gtk/bookmarks.py", + "gajim/gtk/builder.py", "gajim/gtk/call_widget.py", "gajim/gtk/chat_filter.py", "gajim/gtk/chat_list_stack.py", View it on GitLab:
https://dev.gajim.org/gajim/gajim/-/compare/82f5e93fe1f9e1be548320bcb45a7bb…
-- View it on GitLab:
https://dev.gajim.org/gajim/gajim/-/compare/82f5e93fe1f9e1be548320bcb45a7bb…
You're receiving this email because of your account on
dev.gajim.org
.
1
0
0
0
[Git][gajim/gajim][master] 4 commits: Remove unused module
by Philipp Hörist (@lovetox)
17 Jan '22
17 Jan '22
Philipp Hörist pushed to branch master at gajim / gajim Commits: fae812bc by lovetox at 2022-01-17T17:02:17+01:00 Remove unused module - - - - - 025777b3 by lovetox at 2022-01-17T17:02:17+01:00 FileTransfersWindow: Simplify code - - - - - 48f0c1a3 by lovetox at 2022-01-17T17:02:17+01:00 JingleContent: Add type annotations - - - - - 82f5e93f by lovetox at 2022-01-17T17:02:17+01:00 Events: Move logic from FileRequestReceivedEvent to JingleFT module - - - - - 6 changed files: - − gajim/common/dh.py - gajim/common/events.py - gajim/common/jingle_content.py - gajim/common/jingle_ft.py - gajim/gtk/filetransfer.py - pyrightconfig.json Changes: ===================================== gajim/common/dh.py deleted ===================================== @@ -1,229 +0,0 @@ -# Copyright (C) 2007-2014 Yann Leboulanger <asterix AT
lagaule.org
> -# Copyright (C) 2008 Brendan Taylor <whateley AT
gmail.com
> -# -# 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/
>. - -""" -This module defines a number of constants; specifically, large primes suitable -for use with the Diffie-Hellman key exchange - -These constants have been obtained from RFC2409 and RFC3526. -""" - -import string - -generators = [ - None, # one to get the right offset - 2, - 2, - None, - None, - 2, - None, - None, - None, - None, - None, - None, - None, - None, - 2, # group 14 - 2, - 2, - 2, - 2 -] - -_HEX_PRIMES = [ - None, - - # group 1 - '''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 - 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD - EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 - E485B576 625E7EC6 F44C42E9 A63A3620 FFFFFFFF FFFFFFFF''', - - # group 2 - '''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 - 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD - EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 - E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED - EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE65381 - FFFFFFFF FFFFFFFF''', - - # XXX how do I obtain these? - None, - None, - - # group 5 - '''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 - 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD - EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 - E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED - EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D - C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F - 83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D - 670C354E 4ABC9804 F1746C08 CA237327 FFFFFFFF FFFFFFFF''', - - None, - None, - None, - None, - None, - None, - None, - None, - - # group 14 - '''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 - 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD - EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 - E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED - EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D - C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F - 83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D - 670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B - E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9 - DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510 - 15728E5A 8AACAA68 FFFFFFFF FFFFFFFF''', - - # group 15 - '''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 - 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD - EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 - E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED - EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D - C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F - 83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D - 670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B - E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9 - DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510 - 15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64 - ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7 - ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B - F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C - BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31 - 43DB5BFC E0FD108E 4B82D120 A93AD2CA FFFFFFFF FFFFFFFF''', - - # group 16 - '''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 - 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD - EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 - E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED - EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D - C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F - 83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D - 670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B - E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9 - DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510 - 15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64 - ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7 - ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B - F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C - BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31 - 43DB5BFC E0FD108E 4B82D120 A9210801 1A723C12 A787E6D7 - 88719A10 BDBA5B26 99C32718 6AF4E23C 1A946834 B6150BDA - 2583E9CA 2AD44CE8 DBBBC2DB 04DE8EF9 2E8EFC14 1FBECAA6 - 287C5947 4E6BC05D 99B2964F A090C3A2 233BA186 515BE7ED - 1F612970 CEE2D7AF B81BDD76 2170481C D0069127 D5B05AA9 - 93B4EA98 8D8FDDC1 86FFB7DC 90A6C08F 4DF435C9 34063199 - FFFFFFFF FFFFFFFF''', - - # group 17 - '''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 29024E08 - 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD EF9519B3 CD3A431B - 302B0A6D F25F1437 4FE1356D 6D51C245 E485B576 625E7EC6 F44C42E9 - A637ED6B 0BFF5CB6 F406B7ED EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 - 49286651 ECE45B3D C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 - FD24CF5F 83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D - 670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B E39E772C - 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9 DE2BCBF6 95581718 - 3995497C EA956AE5 15D22618 98FA0510 15728E5A 8AAAC42D AD33170D - 04507A33 A85521AB DF1CBA64 ECFB8504 58DBEF0A 8AEA7157 5D060C7D - B3970F85 A6E1E4C7 ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 - 1AD2EE6B F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C - BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31 43DB5BFC - E0FD108E 4B82D120 A9210801 1A723C12 A787E6D7 88719A10 BDBA5B26 - 99C32718 6AF4E23C 1A946834 B6150BDA 2583E9CA 2AD44CE8 DBBBC2DB - 04DE8EF9 2E8EFC14 1FBECAA6 287C5947 4E6BC05D 99B2964F A090C3A2 - 233BA186 515BE7ED 1F612970 CEE2D7AF B81BDD76 2170481C D0069127 - D5B05AA9 93B4EA98 8D8FDDC1 86FFB7DC 90A6C08F 4DF435C9 34028492 - 36C3FAB4 D27C7026 C1D4DCB2 602646DE C9751E76 3DBA37BD F8FF9406 - AD9E530E E5DB382F 413001AE B06A53ED 9027D831 179727B0 865A8918 - DA3EDBEB CF9B14ED 44CE6CBA CED4BB1B DB7F1447 E6CC254B 33205151 - 2BD7AF42 6FB8F401 378CD2BF 5983CA01 C64B92EC F032EA15 D1721D03 - F482D7CE 6E74FEF6 D55E702F 46980C82 B5A84031 900B1C9E 59E7C97F - BEC7E8F3 23A97A7E 36CC88BE 0F1D45B7 FF585AC5 4BD407B2 2B4154AA - CC8F6D7E BF48E1D8 14CC5ED2 0F8037E0 A79715EE F29BE328 06A1D58B - B7C5DA76 F550AA3D 8A1FBFF0 EB19CCB1 A313D55C DA56C9EC 2EF29632 - 387FE8D7 6E3C0468 043E8F66 3F4860EE 12BF2D5B 0B7474D6 E694F91E - 6DCC4024 FFFFFFFF FFFFFFFF''', - - # group 18 - '''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 - 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD - EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 - E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED - EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D - C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F - 83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D - 670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B - E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9 - DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510 - 15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64 - ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7 - ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B - F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C - BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31 - 43DB5BFC E0FD108E 4B82D120 A9210801 1A723C12 A787E6D7 - 88719A10 BDBA5B26 99C32718 6AF4E23C 1A946834 B6150BDA - 2583E9CA 2AD44CE8 DBBBC2DB 04DE8EF9 2E8EFC14 1FBECAA6 - 287C5947 4E6BC05D 99B2964F A090C3A2 233BA186 515BE7ED - 1F612970 CEE2D7AF B81BDD76 2170481C D0069127 D5B05AA9 - 93B4EA98 8D8FDDC1 86FFB7DC 90A6C08F 4DF435C9 34028492 - 36C3FAB4 D27C7026 C1D4DCB2 602646DE C9751E76 3DBA37BD - F8FF9406 AD9E530E E5DB382F 413001AE B06A53ED 9027D831 - 179727B0 865A8918 DA3EDBEB CF9B14ED 44CE6CBA CED4BB1B - DB7F1447 E6CC254B 33205151 2BD7AF42 6FB8F401 378CD2BF - 5983CA01 C64B92EC F032EA15 D1721D03 F482D7CE 6E74FEF6 - D55E702F 46980C82 B5A84031 900B1C9E 59E7C97F BEC7E8F3 - 23A97A7E 36CC88BE 0F1D45B7 FF585AC5 4BD407B2 2B4154AA - CC8F6D7E BF48E1D8 14CC5ED2 0F8037E0 A79715EE F29BE328 - 06A1D58B B7C5DA76 F550AA3D 8A1FBFF0 EB19CCB1 A313D55C - DA56C9EC 2EF29632 387FE8D7 6E3C0468 043E8F66 3F4860EE - 12BF2D5B 0B7474D6 E694F91E 6DBE1159 74A3926F 12FEE5E4 - 38777CB6 A932DF8C D8BEC4D0 73B931BA 3BC832B6 8D9DD300 - 741FA7BF 8AFC47ED 2576F693 6BA42466 3AAB639C 5AE4F568 - 3423B474 2BF1C978 238F16CB E39D652D E3FDB8BE FC848AD9 - 22222E04 A4037C07 13EB57A8 1A23F0C7 3473FC64 6CEA306B - 4BCBC886 2F8385DD FA9D4B7F A2C087E8 79683303 ED5BDD3A - 062B3CF5 B3A278A6 6D2A13F8 3F44F82D DF310EE0 74AB6A36 - 4597E899 A0255DC1 64F31CC5 0846851D F9AB4819 5DED7EA1 - B1D510BD 7EE74D73 FAF36BC3 1ECFA268 359046F4 EB879F92 - 4009438B 481C6CD7 889A002E D5EE382B C9190DA6 FC026E47 - 9558E447 5677E9AA 9E3050E2 765694DF C81F56E8 80B96E71 - 60C980DD 98EDD3DF FFFFFFFF FFFFFFFF''' -] - -_ALL_ASCII = ''.join(map(chr, range(256))) - -def hex_to_decimal(stripee): - if not stripee: - return None - - return int(stripee.translate(_ALL_ASCII).translate( - str.maketrans("", "", string.whitespace)), 16) - -primes = list(map(hex_to_decimal, _HEX_PRIMES)) ===================================== gajim/common/events.py ===================================== @@ -23,21 +23,18 @@ from dataclasses import dataclass from dataclasses import field -from nbxmpp.namespaces import Namespace from nbxmpp.protocol import JID from nbxmpp.structs import LocationData from nbxmpp.structs import RosterItem from nbxmpp.structs import TuneData from nbxmpp.const import InviteType -from gajim.common import app from gajim.common.file_props import FileProp +from gajim.common.const import KindConstant +from gajim.common.helpers import AdditionalDataDict if typing.TYPE_CHECKING: - from gajim.common.helpers import AdditionalDataDict - from gajim.common.const import KindConstant from gajim.common.client import Client - from gajim.common.jingle_session import JingleSession @dataclass @@ -138,7 +135,7 @@ class MessageSent(ApplicationEvent): message_id: str chatstate: Optional[str] timestamp: float - additional_data: 'AdditionalDataDict' + additional_data: AdditionalDataDict label: Optional[str] correct_id: Optional[str] play_sound: bool @@ -361,11 +358,11 @@ class MamMessageReceived(ApplicationEvent): jid: str msgtxt: str properties: Any - additional_data: 'AdditionalDataDict' + additional_data: AdditionalDataDict unique_id: str stanza_id: str archive_jid: str - kind: 'KindConstant' + kind: KindConstant @dataclass @@ -377,7 +374,7 @@ class MessageReceived(ApplicationEvent): jid: str msgtxt: str properties: Any - additional_data: 'AdditionalDataDict' + additional_data: AdditionalDataDict unique_id: str stanza_id: str fjid: str @@ -489,7 +486,7 @@ class JingleEvent(ApplicationEvent): jid: str sid: str resource: str - jingle_session: JingleSession + jingle_session: Any @dataclass @@ -650,83 +647,8 @@ class FileRequestReceivedEvent(ApplicationEvent): name: str = field(init=False, default='file-request-received') conn: 'Client' stanza: Any - jingle_content: Any - FT_content: Any - id_: str = field(init=False) - fjid: str = field(init=False) - account: str = field(init=False) - jid: str = field(init=False) - file_props: FileProp = field(init=False) - - def __post_init__(self): - from gajim.common.jingle_transport import JingleTransportSocks5 - from gajim.common.file_props import FilesProp - self.id_ = self.stanza.getID() - self.fjid = self.conn.get_module('Bytestream')._ft_get_from( - self.stanza) - self.account = self.conn.name - self.jid = app.get_jid_without_resource(self.fjid) - if not self.jingle_content: - return - secu = self.jingle_content.getTag('security') - self.FT_content.use_security = bool(secu) - if secu: - fingerprint = secu.getTag('fingerprint') - if fingerprint: - self.FT_content.x509_fingerprint = fingerprint.getData() - if not self.FT_content.transport: - self.FT_content.transport = JingleTransportSocks5() - self.FT_content.transport.set_our_jid( - self.FT_content.session.ourjid) - self.FT_content.transport.set_connection( - self.FT_content.session.connection) - sid = self.stanza.getTag('jingle').getAttr('sid') - self.file_props = FilesProp.getNewFileProp(self.conn.name, sid) - self.file_props.transport_sid = self.FT_content.transport.sid - self.FT_content.file_props = self.file_props - self.FT_content.transport.set_file_props(self.file_props) - self.file_props.streamhosts.extend( - self.FT_content.transport.remote_candidates) - for host in self.file_props.streamhosts: - host['initiator'] = self.FT_content.session.initiator - host['target'] = self.FT_content.session.responder - self.file_props.session_type = 'jingle' - self.file_props.stream_methods = Namespace.BYTESTREAM - desc = self.jingle_content.getTag('description') - if self.jingle_content.getAttr('creator') == 'initiator': - file_tag = desc.getTag('file') - self.file_props.sender = self.fjid - self.file_props.receiver = self.conn.get_own_jid() - else: - file_tag = desc.getTag('file') - hash_ = file_tag.getTag('hash') - hash_ = hash_.getData() if hash_ else None - file_name = file_tag.getTag('name') - file_name = file_name.getData() if file_name else None - pjid = app.get_jid_without_resource(self.fjid) - file_info = self.conn.get_module('Jingle').get_file_info( - pjid, hash_=hash_, name=file_name, account=self.conn.name) - self.file_props.file_name = file_info['file-name'] - self.file_props.sender = self.conn.get_own_jid() - self.file_props.receiver = self.fjid - self.file_props.type_ = 's' - for child in file_tag.getChildren(): - name = child.getName() - val = child.getData() - if val is None: - continue - if name == 'name': - self.file_props.name = val - if name == 'size': - self.file_props.size = int(val) - if name == 'hash': - self.file_props.algo = child.getAttr('algo') - self.file_props.hash_ = val - if name == 'date': - self.file_props.date = val - - self.file_props.request_id = self.id_ - file_desc_tag = file_tag.getTag('desc') - if file_desc_tag is not None: - self.file_props.desc = file_desc_tag.getData() - self.file_props.transfered_size = [] + id_: str + fjid: str + account: str + jid: str + file_props: FileProp ===================================== gajim/common/jingle_content.py ===================================== @@ -16,8 +16,11 @@ Handles Jingle contents (XEP 0166) """ -from typing import Any # pylint: disable=unused-import -from typing import Dict # pylint: disable=unused-import +from __future__ import annotations + +import typing +from typing import Any +from typing import Optional import nbxmpp from nbxmpp.namespaces import Namespace @@ -27,7 +30,13 @@ from gajim.common.jingle_xtls import SELF_SIGNED_CERTIFICATE from gajim.common.jingle_xtls import load_cert_file -contents = {} # type: Dict[str, Any] +if typing.TYPE_CHECKING: + from gajim.common.jingle_transport import JingleTransport + from gajim.common.jingle_session import JingleSession + + +contents: dict[str, Any] = {} + def get_jingle_content(node): namespace = node.getNamespace() @@ -46,7 +55,11 @@ class JingleContent: An abstraction of content in Jingle sessions """ - def __init__(self, session, transport, senders): + def __init__(self, + session: JingleSession, + transport: Optional[JingleTransport], + senders: Optional[str]) -> None: + self.session = session self.transport = transport # will be filled by JingleSession.add_content() @@ -68,7 +81,7 @@ def __init__(self, session, transport, senders): # These were found by the Politie self.file_props = None - self.use_security = None + self.use_security: Optional[bool] = None self.callbacks = { # these are called when *we* get stanzas ===================================== gajim/common/jingle_ft.py ===================================== @@ -16,6 +16,11 @@ Handles Jingle File Transfer (XEP 0234) """ +from __future__ import annotations + +import typing +from typing import Optional + import logging import threading import time @@ -27,16 +32,27 @@ from gajim.common import app from gajim.common import configpaths -from gajim.common.const import KindConstant from gajim.common import jingle_xtls -from gajim.common.jingle_content import contents, JingleContent -from gajim.common.jingle_transport import JingleTransportSocks5, TransportType from gajim.common import helpers +from gajim.common.const import KindConstant from gajim.common.helpers import AdditionalDataDict from gajim.common.events import FileRequestReceivedEvent -from gajim.common.jingle_ftstates import ( - StateInitialized, StateCandSent, StateCandReceived, StateTransfering, - StateCandSentAndRecv, StateTransportReplace) +from gajim.common.file_props import FileProp +from gajim.common.file_props import FilesProp +from gajim.common.jingle_content import contents +from gajim.common.jingle_content import JingleContent +from gajim.common.jingle_transport import JingleTransportSocks5 +from gajim.common.jingle_transport import TransportType +from gajim.common.jingle_ftstates import StateInitialized +from gajim.common.jingle_ftstates import StateCandSent +from gajim.common.jingle_ftstates import StateCandReceived +from gajim.common.jingle_ftstates import StateTransfering +from gajim.common.jingle_ftstates import StateCandSentAndRecv +from gajim.common.jingle_ftstates import StateTransportReplace + +if typing.TYPE_CHECKING: + from gajim.common.jingle_session import JingleSession + from gajim.common.jingle_transport import JingleTransport log = logging.getLogger('gajim.c.jingle_ft') @@ -59,8 +75,13 @@ class State(IntEnum): class JingleFileTransfer(JingleContent): - def __init__(self, session, transport=None, file_props=None, - use_security=False, senders=None): + def __init__(self, + session: JingleSession, + transport: Optional[JingleTransport] = None, + file_props: Optional[FileProp] = None, + use_security: bool = False, + senders: Optional[str] = None): + JingleContent.__init__(self, session, transport, senders) log.info("transport value: %s", transport) # events we might be interested in @@ -131,11 +152,7 @@ def __state_changed(self, nextstate, args=None): def __on_session_initiate(self, stanza, content, error, action): log.debug("Jingle FT request received") - app.ged.raise_event( - FileRequestReceivedEvent(conn=self.session.connection, - stanza=stanza, - jingle_content=content, - FT_content=self)) + self._raise_event(stanza, content) account = self.session.connection.name jid = self.session.connection.get_module('Bytestream')._ft_get_from( @@ -158,6 +175,89 @@ def __on_session_initiate(self, stanza, content, error, action): self.session.approve_content(self.media, self.name) self.session.accept_session() + def _raise_event(self, stanza, content): + con = self.session.connection + id_ = stanza.getID() + fjid = con.get_module('Bytestream')._ft_get_from(stanza) + account = con.name + jid = app.get_jid_without_resource(fjid) + + if not content: + return + + secu = content.getTag('security') + self.use_security = bool(secu) + if secu: + fingerprint = secu.getTag('fingerprint') + if fingerprint: + self.x509_fingerprint = fingerprint.getData() + + if not self.transport: + self.transport = JingleTransportSocks5() + self.transport.set_our_jid(self.session.ourjid) + self.transport.set_connection(con) + + sid = stanza.getTag('jingle').getAttr('sid') + file_props = FilesProp.getNewFileProp(account, sid) + file_props.transport_sid = self.transport.sid + + self.transport.set_file_props(file_props) + file_props.streamhosts.extend(self.transport.remote_candidates) + + for host in file_props.streamhosts: + host['initiator'] = self.session.initiator + host['target'] = self.session.responder + + file_props.session_type = 'jingle' + desc = content.getTag('description') + if content.getAttr('creator') == 'initiator': + file_tag = desc.getTag('file') + file_props.sender = fjid + file_props.receiver = str(con.get_own_jid()) + else: + file_tag = desc.getTag('file') + hash_ = file_tag.getTag('hash') + hash_ = hash_.getData() if hash_ else None + file_name = file_tag.getTag('name') + file_name = file_name.getData() if file_name else None + pjid = app.get_jid_without_resource(fjid) + file_info = con.get_module('Jingle').get_file_info( + pjid, hash_=hash_, name=file_name, account=account) + file_props.file_name = file_info['file-name'] + file_props.sender = str(con.get_own_jid()) + file_props.receiver = fjid + file_props.type_ = 's' + + for child in file_tag.getChildren(): + name = child.getName() + val = child.getData() + if val is None: + continue + if name == 'name': + file_props.name = val + if name == 'size': + file_props.size = int(val) + if name == 'hash': + file_props.algo = child.getAttr('algo') + file_props.hash_ = val + if name == 'date': + file_props.date = val + + file_props.request_id = id_ + file_desc_tag = file_tag.getTag('desc') + if file_desc_tag is not None: + file_props.desc = file_desc_tag.getData() + file_props.transfered_size = [] + + app.ged.raise_event(FileRequestReceivedEvent( + conn=con, + stanza=stanza, + id_=id_, + fjid=fjid, + account=account, + jid=jid, + file_props=file_props)) + def __on_session_initiate_sent(self, stanza, content, error, action): pass ===================================== gajim/gtk/filetransfer.py ===================================== @@ -247,8 +247,7 @@ def _file_request_error(self, event): text=text)) def _file_request_received(self, event): - account = event.conn.name - client = app.get_client(account) + client = app.get_client(event.account) contact = client.get_module('Contacts').get_contact(event.jid) if event.file_props.session_type == 'jingle': @@ -258,7 +257,7 @@ def _file_request_received(self, event): request = description.getTag('request') if request: # If we get a request instead - self.add_transfer(account, contact, event.file_props) + self.add_transfer(event.account, contact, event.file_props) return if app.window.is_chat_active(event.account, event.jid): @@ -266,7 +265,7 @@ def _file_request_received(self, event): text = _('%s wants to send you a file') % contact.name app.ged.raise_event( - Notification(account=account, + Notification(account=event.account, jid=event.jid, type='file-transfer', sub_type='file-request-received', ===================================== pyrightconfig.json ===================================== @@ -6,6 +6,7 @@ "gajim/common/cert_store.py", "gajim/common/configpaths.py", "gajim/common/const.py", + "gajim/common/events.py", "gajim/common/exceptions.py", "gajim/common/filetransfer.py", "gajim/common/ged.py", View it on GitLab:
https://dev.gajim.org/gajim/gajim/-/compare/e6624be91179f21a70686c20b2c3ee0…
-- View it on GitLab:
https://dev.gajim.org/gajim/gajim/-/compare/e6624be91179f21a70686c20b2c3ee0…
You're receiving this email because of your account on
dev.gajim.org
.
1
0
0
0
[Git][gajim/gajim][master] VCardGrid: Typing
by Daniel Brötzmann (@wurstsalat)
15 Jan '22
15 Jan '22
Daniel Brötzmann pushed to branch master at gajim / gajim Commits: e6624be9 by wurstsalat at 2022-01-16T00:19:39+01:00 VCardGrid: Typing - - - - - 1 changed file: - gajim/gtk/vcard_grid.py Changes: ===================================== gajim/gtk/vcard_grid.py ===================================== @@ -12,6 +12,9 @@ # 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 + import datetime from gi.repository import Gdk @@ -19,6 +22,8 @@ from gi.repository import Gtk from gi.repository import GObject +from nbxmpp.modules.vcard4 import VCard + from gajim.common.i18n import _ from gajim.common.i18n import Q_ from gajim.common.const import URIType @@ -66,7 +71,7 @@ } -DEFAULT_KWARGS = { +DEFAULT_KWARGS: dict[str, Any] = { 'fn': {'value': ''}, 'bday': {'value': '', 'value_type': 'date'}, 'gender': {'sex': '', 'identity': ''}, @@ -126,7 +131,7 @@ class VCardGrid(Gtk.Grid): - def __init__(self, account): + def __init__(self, account: str) -> None: Gtk.Grid.__init__(self) self._callbacks = { @@ -152,15 +157,15 @@ def __init__(self, account): self.set_halign(Gtk.Align.CENTER) self._account = account - self._row_count = 0 - self._vcard = None + self._row_count: int = 0 + self._vcard: Optional[VCard] = None self._props = [] - def set_editable(self, enabled): + def set_editable(self, enabled: bool) -> None: for prop in self._props: prop.set_editable(enabled) - def set_vcard(self, vcard): + def set_vcard(self, vcard: VCard) -> None: self.clear() self._vcard = vcard @@ -171,16 +176,16 @@ def set_vcard(self, vcard): self.add_property(prop) - def get_vcard(self): + def get_vcard(self) -> Optional[VCard]: return self._vcard - def validate(self): + def validate(self) -> None: for prop in list(self._props): base_prop = prop.get_base_property() if base_prop.is_empty: self.remove_property(prop) - def add_new_property(self, name): + def add_new_property(self, name: str) -> None: kwargs = DEFAULT_KWARGS[name] prop = self._vcard.add_property(name, **kwargs) self.add_property(prop, editable=True) @@ -201,7 +206,7 @@ def remove_property(self, prop): self._props.remove(prop) self._vcard.remove_property(prop.get_base_property()) - def clear(self): + def clear(self) -> None: self._vcard = None self._row_count = 0 for prop in list(self._props): @@ -209,12 +214,12 @@ def clear(self): self._props = [] - def sort(self): + def sort(self) -> None: self.set_vcard(self._vcard) class DescriptionLabel(Gtk.Label): - def __init__(self, value): + def __init__(self, value: str) -> None: Gtk.Label.__init__(self, label=LABEL_DICT[value]) if value == 'adr': self.set_valign(Gtk.Align.START) @@ -231,7 +236,7 @@ class ValueLabel(Gtk.Label): def __init__(self, prop, account): Gtk.Label.__init__(self) self._prop = prop - self._uri = None + self._uri: Optional[str] = None self._account = account self.set_selectable(True) self.set_xalign(0) @@ -245,7 +250,7 @@ def __init__(self, prop, account): else: self.set_value(prop.value) - def set_value(self, value): + def set_value(self, value: str) -> None: if self._prop.name == 'email': self._uri = URI(type=URIType.MAIL, data=value) self.set_markup(value) @@ -257,7 +262,7 @@ def set_value(self, value): else: self.set_text(value) - def set_markup(self, text): + def set_markup(self, text: str) -> None: if not text: self.set_text('') return @@ -265,7 +270,7 @@ def set_markup(self, text): GLib.markup_escape_text(text), GLib.markup_escape_text(text))) - def _on_activate_link(self, _label, _value): + def _on_activate_link(self, _label: Gtk.Label, _value: str) -> int: open_uri(self._uri, self._account) return Gdk.EVENT_STOP @@ -283,7 +288,7 @@ def __init__(self, prop): self.set_text(prop.sex) - def set_text(self, value): + def set_text(self, value: str) -> None: if not value or value == '-': super().set_text('') else: @@ -303,7 +308,7 @@ def __init__(self, prop): self.set_text(prop.identity) - def set_text(self, value): + def set_text(self, value: str) -> None: super().set_text('' if not value else value) @@ -359,7 +364,11 @@ def __init__(self, prop): self.show_all() - def _on_text_changed(self, entry, _param, field): + def _on_text_changed(self, + entry: Gtk.Entry, + _param: Any, + field: str + ) -> None: self.emit('field-changed', field, entry.get_text()) @@ -378,7 +387,7 @@ def __init__(self, prop, type_): value = values[0] self.set_text(value) - def set_text(self, value): + def set_text(self, value: str) -> None: self.set_visible(bool(value)) super().set_text(value) @@ -387,14 +396,14 @@ class AdrBoxReadOnly(Gtk.Box): def __init__(self, prop): Gtk.Box.__init__(self, orientation=Gtk.Orientation.VERTICAL, spacing=6) - self._labels = {} + self._labels: dict[str, AdrLabel] = {} for field in ADR_FIELDS: label = AdrLabel(prop, field) self._labels[field] = label self.add(label) - def set_field(self, field, value): + def set_field(self, field: str, value: str) -> None: self._labels[field].set_text(value) @@ -414,11 +423,11 @@ def __init__(self, prop): self.get_buffer().set_text(prop.value) self.get_buffer().connect('notify::text', self._on_text_changed) - def get_text(self): + def get_text(self) -> str: start_iter, end_iter = self.get_buffer().get_bounds() return self.get_buffer().get_text(start_iter, end_iter, False) - def _on_text_changed(self, _buffer, _param): + def _on_text_changed(self, _buffer: Gtk.TextBuffer, _param: Any) -> None: self._prop.value = self.get_text() @@ -443,7 +452,10 @@ def __init__(self, parameters): self.connect('notify::active-id', self._on_active_id_changed) - def _on_active_id_changed(self, _combobox, _param): + def _on_active_id_changed(self, + _combobox: Gtk.ComboBox, + _param: Any + ) -> None: type_ = self.get_active_id() if type_ == '-': self._parameters.remove_types(['work', 'home']) @@ -456,7 +468,7 @@ def _on_active_id_changed(self, _combobox, _param): self._parameters.add_types(['home']) self._parameters.remove_types(['work']) - def get_text(self): + def get_text(self) -> str: type_value = self.get_active_id() if type_value == '-': return '' @@ -496,15 +508,15 @@ class VCardProperty: def __init__(self, prop): self._prop = prop - self._second_column = [] - self._third_column = [] + self._second_column: list[Gtk.Widget] = [] + self._third_column: list[Gtk.Widget] = [] self._desc_label = DescriptionLabel(prop.name) self._remove_button = RemoveButton() self._remove_button.connect('clicked', self._on_remove_clicked) - self._edit_widgets = [self._remove_button] - self._read_widgets = [] + self._edit_widgets: list[Gtk.Widget] = [self._remove_button] + self._read_widgets: list[Gtk.Widget] = [] if prop.name in PROPERTIES_WITH_TYPE: self._type_combobox = TypeComboBox(prop.parameters) @@ -525,38 +537,38 @@ def __init__(self, prop): self._second_column.extend([self._type_combobox, self._type_image]) @staticmethod - def _get_icon_name(type_): + def _get_icon_name(type_: str) -> Optional[str]: if type_ == 'home': return 'feather-home' if type_ == 'work': return 'feather-briefcase' return None - def _on_type_changed(self, _combobox, _param): + def _on_type_changed(self, _combobox: Gtk.ComboBox, _param: Any) -> None: type_ = self._type_combobox.get_active_id() icon_name = self._get_icon_name(type_) self._type_image.set_from_icon_name(icon_name, Gtk.IconSize.MENU) self._type_image.set_tooltip_text(TYPE_VALUES[type_]) - def _on_remove_clicked(self, button): + def _on_remove_clicked(self, button: Gtk.Button) -> None: button.get_parent().remove_property(self) @property - def row_number(self): + def row_number(self) -> int: grid = self._desc_label.get_parent() return grid.child_get_property(self._desc_label, 'top-attach') def get_base_property(self): return self._prop - def set_editable(self, enabled): + def set_editable(self, enabled: bool) -> None: for widget in self._edit_widgets: widget.set_visible(enabled) for widget in self._read_widgets: widget.set_visible(not enabled) - def add_to_grid(self, grid, row_number): + def add_to_grid(self, grid: Gtk.Grid, row_number: int) -> None: # child, left, top, width, height grid.attach(self._desc_label, 0, row_number, 1, 1) @@ -583,7 +595,7 @@ def __init__(self, prop, account): self._third_column = [self._value_entry, self._value_label] - def _on_text_changed(self, entry, _param): + def _on_text_changed(self, entry: Gtk.Entry, _param: Any) -> None: text = entry.get_text() if self._prop.name == 'org': self._prop.values = [text] @@ -662,12 +674,12 @@ def __init__(self, prop, account): self._third_column = [self._box, self._value_label] - def _on_text_changed(self, entry, _param): + def _on_text_changed(self, entry: Gtk.Entry, _param: Any) -> None: text = entry.get_text() self._prop.value = text self._value_label.set_value(text) - def _on_calendar_button_clicked(self, _widget): + def _on_calendar_button_clicked(self, _button: Gtk.Button) -> None: birthday = self._value_entry.get_text() if not birthday: return @@ -679,8 +691,8 @@ def _on_calendar_button_clicked(self, _widget): self.calendar.select_month(month, date.year) self.calendar.select_day(date.day) - def _on_calendar_day_selected(self, _widget): - year, month, day = self.calendar.get_date() # Integers + def _on_calendar_day_selected(self, _calendar: Gtk.Calendar) -> None: + year, month, day = self.calendar.get_date() month = python_month(month) date_str = datetime.date(year, month, day).strftime('%Y-%m-%d') self._value_entry.set_text(date_str) @@ -712,7 +724,7 @@ def __init__(self, prop, _account): self._third_column = [self._scrolled_window, self._copy_button] - def _on_copy_clicked(self, _button): + def _on_copy_clicked(self, _button: Gtk.Button) -> None: clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) clipboard.set_text(self._value_text_view.get_text(), -1) @@ -748,14 +760,18 @@ def __init__(self, prop, _account): self._third_column = [value_box, label_box] - def _on_text_changed(self, entry, _param): + def _on_text_changed(self, entry: Gtk.Entry, _param: Any) -> None: text = entry.get_text() self._prop.identity = text self._identity_label.set_text(text) - def _on_active_id_changed(self, combobox, _param): + def _on_active_id_changed(self, + combobox: Gtk.ComboBox, + _param: Any + ) -> None: sex = combobox.get_active_id() self._prop.sex = None if sex == '-' else sex + assert sex is not None self._sex_label.set_text(sex) View it on GitLab:
https://dev.gajim.org/gajim/gajim/-/commit/e6624be91179f21a70686c20b2c3ee09…
-- View it on GitLab:
https://dev.gajim.org/gajim/gajim/-/commit/e6624be91179f21a70686c20b2c3ee09…
You're receiving this email because of your account on
dev.gajim.org
.
1
0
0
0
[Git][gajim/gajim][master] 2 commits: Utils: Typing
by Daniel Brötzmann (@wurstsalat)
15 Jan '22
15 Jan '22
Daniel Brötzmann pushed to branch master at gajim / gajim Commits: 009e40a3 by wurstsalat at 2022-01-15T19:43:46+01:00 Utils: Typing - - - - - b6ec8af6 by wurstsalat at 2022-01-15T20:24:20+01:00 XMLConsole: Typing - - - - - 2 changed files: - gajim/gtk/util.py - gajim/gtk/xml_console.py Changes: ===================================== gajim/gtk/util.py ===================================== @@ -18,8 +18,6 @@ from __future__ import annotations from typing import Any -from typing import List -from typing import Tuple from typing import Optional from typing import Union @@ -31,6 +29,7 @@ from functools import wraps from functools import lru_cache from pathlib import Path +from re import Match try: from PIL import Image @@ -73,8 +72,8 @@ class NickCompletionGenerator: def __init__(self, self_nick: str) -> None: self.nick = self_nick - self.sender_list: List[str] = [] - self.attention_list: List[str] = [] + self.sender_list: list[str] = [] + self.attention_list: list[str] = [] def change_nick(self, new_nick: str) -> None: self.nick = new_nick @@ -116,8 +115,8 @@ def contact_renamed(self, contact_old: str, contact_new: str) -> None: if contact == contact_old: lst[idx] = contact_new - def generate_suggestions(self, nicks: List[str], - beginning: str) -> List[str]: + def generate_suggestions(self, nicks: list[str], + beginning: str) -> list[str]: """ Generate the order of suggested MUC autocompletions @@ -442,13 +441,13 @@ def convert_rgb_to_hex(rgb_string: str) -> str: @lru_cache(maxsize=1024) -def convert_rgb_string_to_float(rgb_string: str) -> Tuple[float, float, float]: +def convert_rgb_string_to_float(rgb_string: str) -> tuple[float, float, float]: rgba = Gdk.RGBA() rgba.parse(rgb_string) return (rgba.red, rgba.green, rgba.blue) -def rgba_to_float(rgba: Gdk.RGBA) -> Tuple[float, float, float]: +def rgba_to_float(rgba: Gdk.RGBA) -> tuple[float, float, float]: return (rgba.red, rgba.green, rgba.blue) @@ -475,8 +474,9 @@ def get_primary_accel_mod() -> Optional[Gdk.ModifierType]: return Gtk.accelerator_parse("<Primary>")[1] -def get_hardware_key_codes(keyval: int) -> List[int]: - keymap = Gdk.Keymap.get_for_display(Gdk.Display.get_default()) +def get_hardware_key_codes(keyval: int) -> list[int]: + display = Gdk.Display.get_default() + keymap = Gdk.Keymap.get_for_display(display) valid, key_map_keys = keymap.get_entries_for_keyval(keyval) if not valid: @@ -556,7 +556,7 @@ def format_fingerprint(fingerprint: str) -> str: return buf.rstrip().upper() -def find_widget(name: str, container: Gtk.Widget) -> Optional[Gtk.Widget]: +def find_widget(name: str, container: Gtk.Container) -> Optional[Gtk.Widget]: for child in container.get_children(): if Gtk.Buildable.get_name(child) == name: return child @@ -566,7 +566,7 @@ def find_widget(name: str, container: Gtk.Widget) -> Optional[Gtk.Widget]: class MultiLineLabel(Gtk.Label): - def __init__(self, *args: Any, **kwargs: any) -> None: + def __init__(self, *args: Any, **kwargs: Any) -> None: Gtk.Label.__init__(self, *args, **kwargs) self.set_line_wrap(True) self.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR) @@ -583,7 +583,7 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: def set_max_size(self, size: int) -> None: self._max_width = size - def do_get_preferred_width(self) -> Tuple[int, int]: + def do_get_preferred_width(self) -> tuple[int, int]: minimum_width, natural_width = Gtk.ComboBoxText.do_get_preferred_width( self) @@ -594,7 +594,7 @@ def do_get_preferred_width(self) -> Tuple[int, int]: return minimum_width, natural_width -def text_to_color(text: str) -> Tuple[float, float, float]: +def text_to_color(text: str) -> tuple[float, float, float]: if app.css_config.prefer_dark: background = (0, 0, 0) # RGB (0, 0, 0) black else: @@ -658,7 +658,7 @@ def get_pixbuf_from_data(file_data: bytes) -> Optional[GdkPixbuf.Pixbuf]: return pixbuf -def scale_with_ratio(size: int, width: int, height: int) -> Tuple[int, int]: +def scale_with_ratio(size: int, width: int, height: int) -> tuple[int, int]: if height == width: return size, size if height > width: @@ -721,7 +721,7 @@ def load_pixbuf(path: Union[str, Path], return None -def get_thumbnail_size(pixbuf: GdkPixbuf.Pixbuf, size: int) -> Tuple[int, int]: +def get_thumbnail_size(pixbuf: GdkPixbuf.Pixbuf, size: int) -> tuple[int, int]: # Calculates the new thumbnail size while preserving the aspect ratio image_width = pixbuf.get_width() image_height = pixbuf.get_height() @@ -742,9 +742,10 @@ def get_thumbnail_size(pixbuf: GdkPixbuf.Pixbuf, size: int) -> Tuple[int, int]: def make_href_markup(string: str) -> str: url_color = app.css_config.get_value('.gajim-url', StyleAttr.COLOR) + assert isinstance(url_color, str) color = convert_rgb_to_hex(url_color) - def _to_href(match): + def _to_href(match: Match) -> str: url = match.group() if '://' not in url: url = 'https://' + url @@ -754,8 +755,8 @@ def _to_href(match): return URL_REGEX.sub(_to_href, string) -def get_app_windows(account: str) -> List[Gtk.Window]: - windows = [] +def get_app_windows(account: str) -> list[Gtk.Window]: + windows: list[Gtk.Window] = [] for win in app.app.get_windows(): if hasattr(win, 'account'): if win.account == account: @@ -800,12 +801,12 @@ def __init__(self): CommonEventHelper.__init__(self) self.connect('destroy', self.__on_destroy) # pylint: disable=no-member - def __on_destroy(self, *args): + def __on_destroy(self, *args: Any) -> None: self.unregister_events() -def check_destroy(widget): - def _destroy(*args): +def check_destroy(widget: Gtk.Widget) -> None: + def _destroy(*args: Any) -> None: print('DESTROYED', args) widget.connect('destroy', _destroy) ===================================== gajim/gtk/xml_console.py ===================================== @@ -13,9 +13,8 @@ # along with Gajim. If not, see <
http://www.gnu.org/licenses/
>. from typing import Any -from typing import List from typing import Optional -from typing import Tuple +from typing import Union import time @@ -27,6 +26,8 @@ from gajim.common import app from gajim.common import ged +from gajim.common.events import StanzaReceived +from gajim.common.events import StanzaSent from gajim.common.const import Direction from gajim.common.i18n import _ @@ -237,15 +238,17 @@ def _on_paste_last(self, *args: Any) -> None: self._ui.input_entry.grab_focus() def _on_input(self, button: Gtk.ToggleButton) -> None: + child2 = self._ui.paned.get_child2() + assert child2 is not None if button.get_active(): - self._ui.paned.get_child2().show() + child2.show() self._ui.send.show() self._ui.paste.show() self._combo.show() self._ui.menubutton.show() self._ui.input_entry.grab_focus() else: - self._ui.paned.get_child2().hide() + child2.hide() self._ui.send.hide() self._ui.paste.hide() self._combo.hide() @@ -303,9 +306,9 @@ def _find(self, direction: Direction) -> None: self.last_search = search_str @staticmethod - def _get_accounts() -> List[Tuple[str, str]]: + def _get_accounts() -> list[tuple[Optional[str], str]]: accounts = app.get_accounts_sorted() - combo_accounts = [] + combo_accounts: list[tuple[Optional[str], str]] = [] for account in accounts: label = app.get_account_label(account) combo_accounts.append((account, label)) @@ -368,6 +371,8 @@ def _on_setting(self, value: bool, data: str) -> None: value = not value table = self._ui.sourceview.get_buffer().get_tag_table() tag = table.lookup(data) + if tag is None: + return if data in ('incoming', 'outgoing'): if value: tag.set_priority(table.get_size() - 1) @@ -375,19 +380,22 @@ def _on_setting(self, value: bool, data: str) -> None: tag.set_priority(0) tag.set_property('invisible', value) - def _nec_stanza_received(self, event): + def _nec_stanza_received(self, event: StanzaReceived): if self.selected_account is not None: if event.account != self.selected_account: return self._print_stanza(event, 'incoming') - def _nec_stanza_sent(self, event): + def _nec_stanza_sent(self, event: StanzaSent): if self.selected_account is not None: if event.account != self.selected_account: return self._print_stanza(event, 'outgoing') - def _print_stanza(self, event, kind): + def _print_stanza(self, + event: Union[StanzaReceived, StanzaSent], + kind: str + ) -> None: if event.account == 'AccountWizard': account_label = 'Account Wizard' else: View it on GitLab:
https://dev.gajim.org/gajim/gajim/-/compare/e546be1c9fe4d81001d8c543a519017…
-- View it on GitLab:
https://dev.gajim.org/gajim/gajim/-/compare/e546be1c9fe4d81001d8c543a519017…
You're receiving this email because of your account on
dev.gajim.org
.
1
0
0
0
[Git][gajim/gajim][master] 2 commits: Preferences: Typing
by Daniel Brötzmann (@wurstsalat)
15 Jan '22
15 Jan '22
Daniel Brötzmann pushed to branch master at gajim / gajim Commits: f43f63db by wurstsalat at 2022-01-15T19:07:18+01:00 Preferences: Typing - - - - - e546be1c by wurstsalat at 2022-01-15T19:07:37+01:00 ChatControl: Fix trailing whitespace - - - - - 2 changed files: - gajim/gtk/controls/chat.py - gajim/gtk/preferences.py Changes: ===================================== gajim/gtk/controls/chat.py ===================================== @@ -82,7 +82,7 @@ class ChatControl(BaseControl): # Set a command host to bound to. Every command given through a chat will be # processed with this command host. - COMMAND_HOST: ClassVar[Type[CommandHost]] = ChatCommands + COMMAND_HOST: ClassVar[Type[CommandHost]] = ChatCommands def __init__(self, account: str, jid: JID) -> None: BaseControl.__init__(self, ===================================== gajim/gtk/preferences.py ===================================== @@ -16,6 +16,7 @@ from typing import Any from typing import Optional from typing import cast +from typing import Type import logging import sys @@ -77,7 +78,7 @@ def __init__(self) -> None: self._check_emoji_theme() - prefs = [ + prefs: list[tuple[str, Type[PreferenceBox]]] = [ ('window_behaviour', WindowBehaviour), ('chats', Chats), ('group_chats', GroupChats), @@ -111,7 +112,7 @@ def __init__(self) -> None: def get_ui(self): return self._ui - def _add_prefs(self, prefs): + def _add_prefs(self, prefs: list[tuple[str, Type[PreferenceBox]]]): for ui_name, klass in prefs: pref_box = getattr(self._ui, ui_name) if ui_name == 'video' and sys.platform == 'win32': @@ -262,6 +263,8 @@ def _on_use_speller(value: bool, *args: Any) -> None: gspell_lang = Gspell.language_lookup(lang) if gspell_lang is None: gspell_lang = Gspell.language_get_default() + if gspell_lang is None: + return app.settings.set('speller_language', gspell_lang.get_code()) for ctrl in app.window.get_controls(): ctrl.set_speller() @@ -855,7 +858,8 @@ def _on_video_input_changed(_value: str, *args: Any) -> None: def _toggle_live_preview(value: bool, *args: Any) -> None: pref_win = cast(Preferences, get_app_window('Preferences')) preview = pref_win.get_video_preview() - preview.toggle_preview(value) + if preview is not None: + preview.toggle_preview(value) @staticmethod def _create_av_combo_items(items_dict: dict[str, str]) -> dict[str, str]: View it on GitLab:
https://dev.gajim.org/gajim/gajim/-/compare/33dba187224b2e1e290b252cdc55793…
-- View it on GitLab:
https://dev.gajim.org/gajim/gajim/-/compare/33dba187224b2e1e290b252cdc55793…
You're receiving this email because of your account on
dev.gajim.org
.
1
0
0
0
[Git][gajim/gajim][master] 2 commits: MessageInputTextView: Typing
by Daniel Brötzmann (@wurstsalat)
15 Jan '22
15 Jan '22
Daniel Brötzmann pushed to branch master at gajim / gajim Commits: d63ccc0c by wurstsalat at 2022-01-15T18:54:48+01:00 MessageInputTextView: Typing - - - - - 33dba187 by wurstsalat at 2022-01-15T18:56:30+01:00 GroupchatControl: Fix variable - - - - - 2 changed files: - gajim/gtk/controls/groupchat.py - gajim/gtk/message_input.py Changes: ===================================== gajim/gtk/controls/groupchat.py ===================================== @@ -1465,12 +1465,12 @@ def _on_message_textview_key_press_event(self, ) -> bool: # pylint: disable=too-many-nested-blocks res = BaseControl._on_message_textview_key_press_event( - self, widget, event) + self, textview, event) if res: return True if event.keyval == Gdk.KEY_Tab: # TAB - message_buffer = widget.get_buffer() + message_buffer = textview.get_buffer() start_iter, end_iter = message_buffer.get_bounds() cursor_position = message_buffer.get_insert() end_iter = message_buffer.get_iter_at_mark(cursor_position) ===================================== gajim/gtk/message_input.py ===================================== @@ -17,17 +17,17 @@ # 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 Dict -from typing import List -from typing import Tuple +from typing import Any from gi.repository import Gtk from gi.repository import Gdk +from gi.repository import GdkPixbuf from gi.repository import GLib from gi.repository import Pango from gajim.common import app from gajim.common.styling import process +from gajim.common.styling import PlainBlock from .util import scroll_to_end @@ -36,7 +36,7 @@ UNDO_LIMIT: int = 20 -FORMAT_CHARS: Dict[str, str] = { +FORMAT_CHARS: dict[str, str] = { 'bold': '*', 'italic': '_', 'strike': '~', @@ -63,7 +63,7 @@ def __init__(self) -> None: self.drag_dest_unset() - self._undo_list: List[str] = [] + self._undo_list: list[str] = [] self.undo_pressed: bool = False self.get_buffer().create_tag('strong', weight=Pango.Weight.BOLD) @@ -77,7 +77,7 @@ def __init__(self) -> None: self.connect('focus-out-event', self._on_focus_out) self.connect('destroy', self._on_destroy) - def _on_destroy(self, *args): + def _on_destroy(self, _widget: Gtk.Widget) -> None: # We restore the TextView’s drag destination to avoid a GTK warning # when closing the control. BaseControl.shutdown() calls destroy() # on the control’s main box, causing GTK to recursively destroy the @@ -88,13 +88,19 @@ def _on_destroy(self, *args): None, Gdk.DragAction.DEFAULT) - def _on_focus_in(self, _widget, _event): + def _on_focus_in(self, + _widget: Gtk.Widget, + _event: Gdk.EventFocus + ) -> bool: self.toggle_speller(True) scrolled = self.get_parent() scrolled.get_style_context().add_class('message-input-focus') return False - def _on_focus_out(self, _widget, _event): + def _on_focus_out(self, + _widget: Gtk.Widget, + _event: Gdk.EventFocus + ) -> bool: scrolled = self.get_parent() scrolled.get_style_context().remove_class('message-input-focus') if not self.has_text(): @@ -114,7 +120,7 @@ def _on_text_changed(self, buf: Gtk.TextBuffer) -> None: self._clear_tags() result = process(text) for block in result.blocks: - if block.name == 'plain': + if isinstance(block, PlainBlock): for span in block.spans: start_iter = buf.get_iter_at_offset(span.start) end_iter = buf.get_iter_at_offset(span.end) @@ -156,7 +162,7 @@ def _after_paste_clipboard(textview: Gtk.TextView) -> None: if iter_.get_offset() == buf.get_end_iter().get_offset(): GLib.idle_add(scroll_to_end, textview.get_parent()) - def _get_active_iters(self) -> Tuple[Gtk.TextIter, Gtk.TextIter]: + def _get_active_iters(self) -> tuple[Gtk.TextIter, Gtk.TextIter]: buf = self.get_buffer() return_val = buf.get_selection_bounds() if return_val: # if something is selected @@ -213,7 +219,7 @@ def replace_emojis(self) -> None: if not theme or theme == 'font': return - def _replace(anchor): + def _replace(anchor: Gtk.TextChildAnchor) -> None: if anchor is None: return image = anchor.get_widgets()[0] @@ -228,14 +234,17 @@ def _replace(anchor): while iter_.forward_char(): _replace(iter_.get_child_anchor()) - def _replace_char_at_iter(self, iter_, new_char): + def _replace_char_at_iter(self, + iter_: Gtk.TextIter, + new_char: str + ) -> None: buf = self.get_buffer() iter_2 = iter_.copy() iter_2.forward_char() buf.delete(iter_, iter_2) buf.insert(iter_, new_char) - def insert_emoji(self, codepoint, pixbuf): + def insert_emoji(self, codepoint: str, pixbuf: GdkPixbuf.Pixbuf) -> None: buf = self.get_buffer() if buf.get_char_count(): # buffer contains text @@ -254,7 +263,7 @@ def insert_emoji(self, codepoint, pixbuf): self.add_child_at_anchor(image, anchor) buf.insert_at_cursor(' ') - def clear(self, *args): + def clear(self, *args: Any) -> None: buf = self.get_buffer() start, end = buf.get_bounds() buf.delete(start, end) @@ -265,7 +274,7 @@ def save_undo(self, text: str) -> None: del self._undo_list[0] self.undo_pressed = False - def undo(self, *args): + def undo(self, *args: Any) -> None: buf = self.get_buffer() if self._undo_list: buf.set_text(self._undo_list.pop()) View it on GitLab:
https://dev.gajim.org/gajim/gajim/-/compare/b3b7eb20feb9fca643eaa4c09ec3567…
-- View it on GitLab:
https://dev.gajim.org/gajim/gajim/-/compare/b3b7eb20feb9fca643eaa4c09ec3567…
You're receiving this email because of your account on
dev.gajim.org
.
1
0
0
0
[Git][gajim/gajim][master] 2 commits: Use correct type for log_line_id
by Daniel Brötzmann (@wurstsalat)
15 Jan '22
15 Jan '22
Daniel Brötzmann pushed to branch master at gajim / gajim Commits: 288d2de9 by wurstsalat at 2022-01-15T18:38:19+01:00 Use correct type for log_line_id - - - - - b3b7eb20 by wurstsalat at 2022-01-15T18:38:40+01:00 Controls: Typing - - - - - 6 changed files: - gajim/gtk/controls/base.py - gajim/gtk/controls/chat.py - gajim/gtk/controls/groupchat.py - gajim/gtk/conversation/rows/base.py - gajim/gtk/conversation/rows/message.py - gajim/gtk/conversation/view.py Changes: ===================================== gajim/gtk/controls/base.py ===================================== @@ -26,8 +26,6 @@ from __future__ import annotations from typing import Any -from typing import Dict -from typing import List from typing import Optional from typing import Union @@ -49,20 +47,16 @@ from nbxmpp.modules.security_labels import Displaymarking from gajim.common import app +from gajim.common import events from gajim.common import ged from gajim.common import i18n from gajim.common.helpers import message_needs_highlight from gajim.common.helpers import get_file_path_from_dnd_dropped_uri from gajim.common.i18n import _ from gajim.common.ged import EventHelper -from gajim.common.events import ApplicationEvent -from gajim.common.events import JingleRequestReceived -from gajim.common.events import FileRequestReceivedEvent -from gajim.common.events import FileRequestSent -from gajim.common.events import Notification from gajim.common.helpers import AdditionalDataDict from gajim.common.helpers import get_retraction_text -from gajim.common.const import KindConstant +from gajim.common.const import Direction, KindConstant from gajim.common.modules.httpupload import HTTPFileTransfer from gajim.common.preview_helpers import filename_from_uri from gajim.common.preview_helpers import guess_simple_file_type @@ -131,7 +125,7 @@ def __init__(self, widget_name: str, account: str, jid: JID) -> None: # Initialize it to True so empty textview is saved in undo list self.space_pressed: bool = True - self.handlers: Dict[str, Any] = {} + self.handlers: dict[int, Any] = {} self.account = account @@ -245,9 +239,9 @@ def __init__(self, widget_name: str, account: str, jid: JID) -> None: self._chat_loaded: bool = False # the following vars are used to keep history of user's messages - self.sent_history: List[str] = [] + self.sent_history: list[str] = [] self.sent_history_pos: int = 0 - self.received_history: List[str] = [] + self.received_history: list[str] = [] self.received_history_pos: int = 0 self.orig_msg: Optional[str] = None @@ -267,7 +261,7 @@ def __init__(self, widget_name: str, account: str, jid: JID) -> None: # TODO: self.user_nick: Optional[str] = None - self.command_hits: List[str] = [] + self.command_hits: list[str] = [] self.last_key_tabs: bool = False self.sendmessage: bool = True @@ -299,26 +293,30 @@ def _connect_contact_signals(self) -> None: def _get_action(self, name: str) -> Gio.SimpleAction: return app.window.lookup_action(f'{name}{self.control_id}') - def process_event(self, event: ApplicationEvent) -> None: + def process_event(self, event: events.ApplicationEvent) -> None: if event.account != self.account: return if event.jid not in (self.contact.jid, self.contact.jid.bare): return - jingle_av_events = [ - 'jingle-request-received', - 'jingle-connected-received', - 'jingle-disconnected-received', - 'jingle-error-received' - ] + jingle_av_events = ( + events.JingleRequestReceived, + events.JingleConnectedReceived, + events.JingleDisconnectedReceived, + events.JingleErrorReceived + ) + file_transfer_events = ( + events.FileRequestReceivedEvent, + events.FileRequestSent + ) if self.is_chat: - if event.name in jingle_av_events: + if isinstance(event, jingle_av_events): self._process_jingle_av_event(event) return - if event.name in ('file-request-received', 'file-request-sent'): + if isinstance(event, file_transfer_events): self.add_jingle_file_transfer(event=event) return @@ -326,7 +324,7 @@ def process_event(self, event: ApplicationEvent) -> None: method_name = f'_on_{method_name}' getattr(self, method_name)(event) - def _on_message_updated(self, event): + def _on_message_updated(self, event: events.MessageUpdated) -> None: if hasattr(event, 'correct_id'): self.conversation_view.correct_message( event.correct_id, event.msgtxt) @@ -490,7 +488,7 @@ def setup_seclabel(self) -> None: if self._client.get_module('SecLabels').supported: self._client.get_module('SecLabels').request_catalog(jid) - def _sec_labels_received(self, event): + def _sec_labels_received(self, event: events.SecCatalogReceived) -> None: if event.account != self.account: return @@ -688,7 +686,8 @@ def get_speller_language(self) -> Optional[Gspell.Language]: def on_language_changed(self, checker: Gspell.Checker, _param: Any) -> None: gspell_lang = checker.get_language() - self.contact.settings.set('speller_language', gspell_lang.get_code()) + if gspell_lang is not None: + self.contact.settings.set('speller_language', gspell_lang.get_code()) def shutdown(self) -> None: # remove_gui_extension_point() is called on shutdown, but also when @@ -730,12 +729,13 @@ def _on_msg_textview_populate_popup(self, Override the default context menu and we prepend an option to switch languages """ + assert isinstance(menu, Gtk.Menu) item = Gtk.MenuItem.new_with_mnemonic(_('_Undo')) menu.prepend(item) id_ = item.connect('activate', self.msg_textview.undo) self.handlers[id_] = item - item = Gtk.SeparatorMenuItem.new() + item = Gtk.SeparatorMenuItem() menu.prepend(item) item = Gtk.MenuItem.new_with_mnemonic(_('_Clear')) @@ -800,7 +800,7 @@ def _on_message_textview_paste_event(self, def _paste_event_confirmed(self, is_checked: bool, - image: Optional[GdkPixbuf.Pixbuf] + image: GdkPixbuf.Pixbuf ) -> None: if is_checked: app.settings.set('confirm_paste_image', False) @@ -904,7 +904,7 @@ def _on_message_textview_key_press_event(self, if event.get_state() & Gdk.ModifierType.SHIFT_MASK: if (event.get_state() & Gdk.ModifierType.CONTROL_MASK and event.keyval == Gdk.KEY_ISO_Left_Tab): - app.window.select_next_chat(False, unread_first=True) + app.window.select_next_chat(Direction.PREV, unread_first=True) return True if event.keyval in (Gdk.KEY_Page_Down, Gdk.KEY_Page_Up): @@ -913,7 +913,7 @@ def _on_message_textview_key_press_event(self, if event.get_state() & Gdk.ModifierType.CONTROL_MASK: if event.keyval == Gdk.KEY_Tab: - app.window.select_next_chat(True, unread_first=True) + app.window.select_next_chat(Direction.NEXT, unread_first=True) return True message_buffer = self.msg_textview.get_buffer() @@ -1185,14 +1185,14 @@ def add_file_transfer(self, transfer: HTTPFileTransfer) -> None: def add_jingle_file_transfer(self, event: Union[ - FileRequestReceivedEvent, - FileRequestSent, + events.FileRequestReceivedEvent, + events.FileRequestSent, None] ) -> None: if self._allow_add_message(): self.conversation_view.add_jingle_file_transfer(event) - def add_call_message(self, event: JingleRequestReceived) -> None: + def add_call_message(self, event: events.JingleRequestReceived) -> None: if self._allow_add_message(): self.conversation_view.add_call_message(event=event) @@ -1203,7 +1203,7 @@ def add_message(self, tim: float, notify: bool, displaymarking: Optional[Displaymarking] = None, - msg_log_id: Optional[str] = None, + msg_log_id: Optional[int] = None, message_id: Optional[str] = None, stanza_id: Optional[str] =None, additional_data: Optional[AdditionalDataDict] = None @@ -1287,6 +1287,7 @@ def _notify(self, text = f'{file_type} ({file_name})' sound: Optional[str] = None + msg_type = 'chat-message' if self.is_chat: msg_type = 'chat-message' sound = 'first_message_received' @@ -1318,13 +1319,13 @@ def _notify(self, text = f'* {name} {text[3:]}' app.ged.raise_event( - Notification(account=self.account, - jid=self.contact.jid, - type='incoming-message', - sub_type=msg_type, - title=title, - text=text, - sound=sound)) + events.Notification(account=self.account, + jid=self.contact.jid, + type='incoming-message', + sub_type=msg_type, + title=title, + text=text, + sound=sound)) def toggle_emoticons(self) -> None: """ @@ -1353,7 +1354,7 @@ def set_emoticon_popover(self) -> None: def _on_emoticon_button_clicked(self, _widget: Gtk.Button) -> None: # Present GTK emoji chooser (not cross platform compatible) self.msg_textview.emit('insert-emoji') - self.xml.emoticons_button.set_property('active', False) + self.xml.emoticons_button.set_active(False) def _on_formatting_menuitem_activate(self, menu_item: Gtk.CheckMenuItem @@ -1361,7 +1362,7 @@ def _on_formatting_menuitem_activate(self, formatting = menu_item.get_name() self.msg_textview.apply_formatting(formatting) - def _style_changed(self, *args): + def _style_changed(self, _event: events.StyleChanged) -> None: self.update_text_tags() def update_text_tags(self) -> None: @@ -1493,6 +1494,7 @@ def add_messages(self, messages: list[ConversationRow]): message_text = msg.message contact_name = msg.contact_name + kind = 'incoming' if msg.kind in ( KindConstant.SINGLE_MSG_RECV, KindConstant.CHAT_MSG_RECV): kind = 'incoming' @@ -1593,7 +1595,7 @@ def update_account_badge(self) -> None: class ScrolledWindow(Gtk.ScrolledWindow): - def __init__(self, *args, **kwargs): + def __init__(self, *args: Any, **kwargs: Any) -> None: Gtk.ScrolledWindow.__init__(self, *args, **kwargs) self.set_overlay_scrolling(False) ===================================== gajim/gtk/controls/chat.py ===================================== @@ -25,8 +25,8 @@ from __future__ import annotations -from typing import ClassVar # pylint: disable=unused-import -from typing import Type # pylint: disable=unused-import +from typing import ClassVar +from typing import Type from typing import Optional import time @@ -43,11 +43,14 @@ from nbxmpp.namespaces import Namespace from gajim.common import app +from gajim.common import events from gajim.common import helpers -from gajim.common.events import JingleRequestReceived +from gajim.common import types +from gajim.common.client import Client from gajim.common.i18n import _ from gajim.common.helpers import AdditionalDataDict from gajim.common.const import AvatarSize +from gajim.common.const import SimpleClientState from gajim.common.const import KindConstant from gajim.common.const import PEPEventType from gajim.common.jingle_session import JingleSession @@ -63,7 +66,7 @@ from gajim.gui.util import open_window from gajim.command_system.implementation.hosts import ChatCommands -from gajim.command_system.framework import CommandHost # pylint: disable=unused-import +from gajim.command_system.framework import CommandHost from ..menus import get_encryption_menu from ..menus import get_singlechat_menu @@ -79,7 +82,7 @@ class ChatControl(BaseControl): # Set a command host to bound to. Every command given through a chat will be # processed with this command host. - COMMAND_HOST = ChatCommands # type: ClassVar[Type[CommandHost]] + COMMAND_HOST: ClassVar[Type[CommandHost]] = ChatCommands def __init__(self, account: str, jid: JID) -> None: BaseControl.__init__(self, @@ -300,20 +303,35 @@ def _on_add_to_roster(self, jid = self.contact.real_jid open_window('AddContact', account=self.account, jid=jid) - def _on_block_contact(self, _action, _param): + def _on_block_contact(self, + _action: Gio.SimpleAction, + _param: Optional[GLib.Variant] + ) -> None: app.window.block_contact(self.account, self.contact.jid) - def _on_information(self, _action, _param): + def _on_information(self, + _action: Gio.SimpleAction, + _param: Optional[GLib.Variant] + ) -> None: app.window.contact_info(self.account, self.contact.jid) - def _on_invite_contacts(self, _action, _param): + def _on_invite_contacts(self, + _action: Gio.SimpleAction, + _param: Optional[GLib.Variant] + ) -> None: open_window('AdhocMUC', account=self.account, contact=self.contact) - def _on_send_chatstate(self, action, param): + def _on_send_chatstate(self, + action: Gio.SimpleAction, + param: GLib.Variant + ) -> None: action.set_state(param) self.contact.settings.set('send_chatstate', param.get_string()) - def _on_send_marker(self, action, param): + def _on_send_marker(self, + action: Gio.SimpleAction, + param: GLib.Variant + ) -> None: action.set_state(param) self.contact.settings.set('send_marker', param.get_boolean()) @@ -348,10 +366,10 @@ def _get_pep_widget(self, type_: PEPEventType) -> Optional[Gtk.Image]: return self.xml.location_image return None - def _on_tune_received(self, _event): + def _on_tune_received(self, _event: events.TuneReceived) -> None: self._update_pep(PEPEventType.TUNE) - def _on_location_received(self, _event): + def _on_location_received(self, _event: events.LocationReceived) -> None: self._update_pep(PEPEventType.LOCATION) def _on_nickname_received(self, _event): @@ -364,19 +382,31 @@ def _on_update_client_info(self, event): return self.xml.phone_image.set_visible(contact.uses_phone) - def _on_chatstate_update(self, *args): + def _on_chatstate_update(self, + _contact: types.BareContact, + _signal_name: str + ) -> None: self.draw_banner_text() - def _on_nickname_update(self, _contact, _signal_name): + def _on_nickname_update(self, + _contact: types.BareContact, + _signal_name: str + ) -> None: self.draw_banner_text() - def _on_presence_update(self, _contact, _signal_name): + def _on_presence_update(self, + _contact: types.BareContact, + _signal_name: str + ) -> None: self._update_avatar() - def _on_caps_update(self, _contact, _signal_name): + def _on_caps_update(self, + _contact: types.BareContact, + _signal_name: str + ) -> None: self.update_ui() - def _on_mam_message_received(self, event): + def _on_mam_message_received(self, event: events.MamMessageReceived) -> None: if event.properties.is_muc_pm: if not event.properties.jid == self.contact.jid: return @@ -396,7 +426,7 @@ def _on_mam_message_received(self, event): additional_data=event.additional_data, notify=False) - def _on_message_received(self, event): + def _on_message_received(self, event: events.MessageReceived) -> None: if not event.msgtxt: return @@ -416,10 +446,10 @@ def _on_message_received(self, event): if kind == 'outgoing': self.conversation_view.set_read_marker(event.properties.id) - def _on_message_error(self, event): + def _on_message_error(self, event: events.MessageError) -> None: self.conversation_view.show_error(event.message_id, event.error) - def _on_message_sent(self, event): + def _on_message_sent(self, event: events.MessageSent) -> None: if not event.message: return @@ -453,21 +483,21 @@ def _on_message_sent(self, event): message_id=message_id, additional_data=event.additional_data) - def _on_receipt_received(self, event): + def _on_receipt_received(self, event: events.ReceiptReceived) -> None: self.conversation_view.show_receipt(event.receipt_id) - def _on_displayed_received(self, event): + def _on_displayed_received(self, event: events.DisplayedReceived) -> None: self.conversation_view.set_read_marker(event.marker_id) - def _nec_ping(self, event): + def _nec_ping(self, event: events.ApplicationEvent): if self.contact != event.contact: return - if event.name == 'ping-sent': + if isinstance(event, events.PingSent): self.add_info_message(_('Ping?')) - elif event.name == 'ping-reply': + elif isinstance(event, events.PingReply): self.add_info_message( _('Pong! (%s seconds)') % event.seconds) - elif event.name == 'ping-error': + elif isinstance(event, events.PingError): self.add_info_message(event.error) # Jingle AV calls @@ -477,7 +507,7 @@ def _on_start_call(self, ) -> None: self._call_widget.start_call() - def _process_jingle_av_event(self, event): + def _process_jingle_av_event(self, event: events.JingleEvent) -> None: self._call_widget.process_event(event) def _on_call_accepted(self, @@ -497,7 +527,7 @@ def _on_call_ended(self, _call_widget: CallWidget) -> None: def _add_incoming_call(self, _call_widget: CallWidget, - event: JingleRequestReceived + event: events.JingleRequestReceived ) -> None: self.add_call_message(event) @@ -523,7 +553,6 @@ def on_location_eventbox_enter_notify_event(self, _widget, _event): app.window.get_window().set_cursor(cursor) def update_ui(self) -> None: - # The name banner is drawn here BaseControl.update_ui(self) self.update_toolbar() self._update_avatar() @@ -595,9 +624,9 @@ def send_message(self, def add_message(self, text: str, kind: str, - tim: Optional[float] = None, + tim: float, displaymarking: Optional[Displaymarking] = None, - msg_log_id: Optional[str] = None, + msg_log_id: Optional[int] = None, stanza_id: Optional[str] = None, message_id: Optional[str] = None, additional_data: Optional[AdditionalDataDict] = None, @@ -671,7 +700,10 @@ def allow_shutdown(self, _method, on_yes, on_no): return on_yes(self) - def _on_avatar_update(self, _contact, _signal_name): + def _on_avatar_update(self, + _contact: types.BareContact, + _signal_name: str + ) -> None: self._update_avatar() def _update_avatar(self) -> None: @@ -679,8 +711,15 @@ def _update_avatar(self) -> None: surface = self.contact.get_avatar(AvatarSize.CHAT, scale) self.xml.avatar_image.set_from_surface(surface) - def _on_drag_data_received(self, _widget, _context, _x_coord, _y_coord, - selection, target_type, _timestamp): + def _on_drag_data_received(self, + _widget: Gtk.Widget, + _context: Gdk.DragContext, + _x_coord: int, + _y_coord: int, + selection: Gtk.SelectionData, + target_type: int, + _timestamp: int + ) -> None: if not selection.get_data(): return @@ -691,7 +730,10 @@ def _on_drag_data_received(self, _widget, _context, _x_coord, _y_coord, # File drag and drop (handled in chat_control_base) self.drag_data_file_transfer(selection) - def _on_client_state_changed(self, _client, _signal_name, state): + def _on_client_state_changed(self, + _client: Client, + _signal_name: str, + state: SimpleClientState): self.msg_textview.set_sensitive(state.is_connected) self.msg_textview.set_editable(state.is_connected) @@ -700,7 +742,7 @@ def _on_client_state_changed(self, _client, _signal_name, state): self.draw_banner() self.update_actions() - def _on_presence_received(self, event): + def _on_presence_received(self, event: events.PresenceReceived) -> None: uf_show = helpers.get_uf_show(event.show) name = self.contact.name ===================================== gajim/gtk/controls/groupchat.py ===================================== @@ -25,7 +25,6 @@ # along with Gajim. If not, see <
http://www.gnu.org/licenses/
>. from typing import Any -from typing import List from typing import Optional import time @@ -41,6 +40,8 @@ from nbxmpp.modules.security_labels import Displaymarking from nbxmpp.modules.vcard_temp import VCard from nbxmpp.structs import PresenceProperties +from nbxmpp.structs import MessageProperties +from nbxmpp.task import Task from gi.repository import Gtk from gi.repository import Gdk @@ -48,12 +49,15 @@ from gi.repository import Gio from gajim.common import app +from gajim.common import events from gajim.common import ged from gajim.common import helpers +from gajim.common.client import Client +from gajim.common.const import AvatarSize +from gajim.common.const import SimpleClientState from gajim.common.helpers import AdditionalDataDict from gajim.common.helpers import event_filter from gajim.common.helpers import to_user_string -from gajim.common.const import AvatarSize from gajim.common.i18n import _ from gajim.common.modules.contacts import GroupchatContact @@ -79,6 +83,7 @@ from gajim.gui.groupchat_settings import GroupChatSettings from gajim.gui.groupchat_roster import GroupchatRoster from gajim.gui.groupchat_state import GroupchatState +from gajim.gui.message_input import MessageInputTextView from gajim.gui.util import NickCompletionGenerator from gajim.gui.util import get_app_window from gajim.gui.util import open_window @@ -144,8 +149,8 @@ def __init__(self, account: str, jid: JID) -> None: self.attention_flag: bool = False # sorted list of nicks who mentioned us (last at the end) - self.attention_list: List[str] = [] - self.nick_hits: List[str] = [] + self.attention_list: list[str] = [] + self.nick_hits: list[str] = [] self.__nick_completion: Optional[NickCompletionGenerator] = None self.last_key_tabs: bool = False @@ -253,7 +258,10 @@ def _connect_contact_signals(self) -> None: 'room-join-failed': self._on_room_join_failed, }) - def _on_muc_state_changed(self, _contact, _signal_name): + def _on_muc_state_changed(self, + _contact: GroupchatContact, + _signal_name: str + ) -> None: if self.contact.is_joining: self._groupchat_state.set_joining() @@ -265,11 +273,15 @@ def _on_muc_state_changed(self, _contact, _signal_name): elif self.contact.is_not_joined: self._set_control_inactive() - def _on_client_state_changed(self, _client, _signal_name, state): + def _on_client_state_changed(self, + _client: Client, + _signal_name: str, + state: SimpleClientState + ) -> None: pass @property - def _nick_completion(self): + def _nick_completion(self) -> NickCompletionGenerator: if self.__nick_completion is None: self.__nick_completion = NickCompletionGenerator( self.contact.nickname) @@ -440,12 +452,15 @@ def _show_page(self, name: str) -> None: def _get_current_page(self) -> str: return self.xml.stack.get_visible_child_name() - def _on_muc_disco_update(self, _event): + def _on_muc_disco_update(self, _event: events.MucDiscoUpdate) -> None: self.update_actions() self.draw_banner_text() # Actions - def _on_information(self, _action, _param): + def _on_information(self, + _action: Gio.SimpleAction, + _param: Optional[GLib.Variant] + ) -> None: self._muc_info_box.set_from_disco_info(self.disco_info) if self._subject_data is not None: self._muc_info_box.set_subject(self._subject_data.subject) @@ -453,7 +468,10 @@ def _on_information(self, _action, _param): self._subject_data.user_timestamp) self._show_page('muc-info') - def _on_groupchat_settings(self, _action, _param): + def _on_groupchat_settings(self, + _action: Gio.SimpleAction, + _param: Optional[GLib.Variant] + ) -> None: if self._groupchat_settings_box is not None: self.xml.settings_scrolled_box.remove(self._groupchat_settings_box) self._groupchat_settings_box.destroy() @@ -464,7 +482,10 @@ def _on_groupchat_settings(self, _action, _param): self.xml.settings_scrolled_box.add(self._groupchat_settings_box) self._show_page('muc-settings') - def _on_groupchat_manage(self, _action, _param): + def _on_groupchat_manage(self, + _action: Gio.SimpleAction, + _param: Optional[GLib.Variant] + ) -> None: surface = app.interface.avatar_storage.get_muc_surface( self.account, self.contact.jid, @@ -481,7 +502,7 @@ def _on_groupchat_manage(self, _action, _param): con.get_module('MUC').request_config( self.room_jid, callback=self._on_manage_form_received) - def _on_manage_form_received(self, task): + def _on_manage_form_received(self, task: Task) -> None: try: result = task.finish() except StanzaError as error: @@ -493,30 +514,39 @@ def _on_manage_form_received(self, task): self.xml.manage_save_button.set_sensitive(True) self._room_config_form = result.form - def _on_invite(self, _action, _param): + def _on_invite(self, + _action: Gio.SimpleAction, + _param: Optional[GLib.Variant] + ) -> None: self._invite_box.load_contacts() self._show_page('invite') - def _on_invite_ready(self, _, invitable): + def _on_invite_ready(self, + _listbox: GroupChatInviter, + invitable: bool + ) -> None: self.xml.invite_button.set_sensitive(invitable) - def _on_invite_clicked(self, _button): + def _on_invite_clicked(self, _button: Gtk.Button) -> None: invitees = self._invite_box.get_invitees() for jid in invitees: self.invite(jid) self._show_page('groupchat') - def invite(self, contact_jid): + def invite(self, contact_jid: str) -> None: self._client.get_module('MUC').invite(self.room_jid, contact_jid) self.add_info_message( _('%s has been invited to this group chat') % contact_jid) - def _on_destroy_room(self, _button): + def _on_destroy_room(self, _button: Gtk.Button) -> None: self.xml.destroy_reason_entry.grab_focus() self.xml.destroy_button.grab_default() self._show_page('destroy') - def _on_destroy_alternate_changed(self, entry, _param): + def _on_destroy_alternate_changed(self, + entry: Gtk.Entry, + _param: Any + ) -> None: jid = entry.get_text() if jid: try: @@ -534,13 +564,13 @@ def _on_destroy_alternate_changed(self, entry, _param): Gtk.EntryIconPosition.SECONDARY, None) self.xml.destroy_button.set_sensitive(True) - def _on_destroy_confirm(self, _button): + def _on_destroy_confirm(self, _button: Gtk.Button) -> None: reason = self.xml.destroy_reason_entry.get_text() jid = self.xml.destroy_alternate_entry.get_text() self._client.get_module('MUC').destroy(self.room_jid, reason, jid) self._show_page('groupchat') - def _on_configure_room(self, _button): + def _on_configure_room(self, _button: Gtk.Button) -> None: self.xml.manage_popover.popdown() win = get_app_window('GroupchatConfig', self.account, self.room_jid) @@ -559,7 +589,7 @@ def _on_configure_room(self, _button): contact.affiliation.value) self._show_page('groupchat') - def _on_configure_form_received(self, task): + def _on_configure_form_received(self, task: Task) -> None: try: result = task.finish() except StanzaError as error: @@ -580,15 +610,18 @@ def _on_request_voice(self, def _request_voice(self) -> None: self._client.get_module('MUC').request_voice(self.room_jid) - def _on_execute_command(self, _action, param): + def _on_execute_command(self, + _action: Gio.SimpleAction, + param: GLib.Variant + ) -> None: jid = self.room_jid nick = param.get_string() if nick: jid += '/' + nick AdHocCommand(self.account, jid) - def _on_change_avatar(self, _button): - def _on_accept(path): + def _on_change_avatar(self, _button: Gtk.Button) -> None: + def _on_accept(path: str) -> None: self._avatar_selector.prepare_crop_area(path) self.xml.avatar_update_button.set_sensitive( self._avatar_selector.get_prepared()) @@ -599,8 +632,8 @@ def _on_accept(path): transient_for=app.window, modal=True) - def _on_avatar_select_file_clicked(self, _button): - def _on_accept(path): + def _on_avatar_select_file_clicked(self, _button: Gtk.Button) -> None: + def _on_accept(path: str) -> None: self._avatar_selector.prepare_crop_area(path) self.xml.avatar_update_button.set_sensitive( self._avatar_selector.get_prepared()) @@ -609,7 +642,7 @@ def _on_accept(path): transient_for=app.window, modal=True) - def _on_upload_avatar_result(self, task): + def _on_upload_avatar_result(self, task: Task) -> None: try: task.finish() except Exception as error: @@ -618,7 +651,7 @@ def _on_upload_avatar_result(self, task): else: self.add_info_message(_('Avatar upload successful')) - def _on_avatar_update_clicked(self, _button): + def _on_avatar_update_clicked(self, _button: Gtk.Button) -> None: success, data, _, _ = self._avatar_selector.get_avatar_bytes() if not success: self.add_info_message(_('Loading avatar failed')) @@ -639,12 +672,18 @@ def _on_avatar_update_clicked(self, _button): callback=self._on_upload_avatar_result) self._show_page('groupchat') - def _on_contact_information(self, _action, param): + def _on_contact_information(self, + _action: Gio.SimpleAction, + param: GLib.Variant + ) -> None: nick = param.get_string() contact = self.contact.get_resource(nick) open_window('ContactInfo', account=self.account, contact=contact) - def _on_kick(self, _action, param): + def _on_kick(self, + _action: Gio.SimpleAction, + param: GLib.Variant + ) -> None: nick = param.get_string() self._kick_nick = nick text = _('Kick %s') % nick @@ -654,7 +693,10 @@ def _on_kick(self, _action, param): self.xml.kick_participant_button.grab_default() self._show_page('kick') - def _on_ban(self, _action, param): + def _on_ban(self, + _action: Gio.SimpleAction, + param: GLib.Variant + ) -> None: jid = param.get_string() self._ban_jid = jid text = _('Ban %s') % jid @@ -664,17 +706,23 @@ def _on_ban(self, _action, param): self.xml.ban_participant_button.grab_default() self._show_page('ban') - def _on_change_role(self, _action, param): + def _on_change_role(self, + _action: Gio.SimpleAction, + param: GLib.Variant + ) -> None: nick, role = param.get_strv() self._client.get_module('MUC').set_role(self.room_jid, nick, role) - def _on_change_affiliation(self, _action, param): + def _on_change_affiliation(self, + _action: Gio.SimpleAction, + param: GLib.Variant + ) -> None: jid, affiliation = param.get_strv() self._client.get_module('MUC').set_affiliation( self.room_jid, {jid: {'affiliation': affiliation}}) - def _show_roster(self, *args): + def _show_roster(self, *args: Any) -> None: show = not self.xml.roster_revealer.get_reveal_child() icon = 'go-next-symbolic' if show else 'go-previous-symbolic' self.xml.toggle_roster_image.set_from_icon_name( @@ -686,7 +734,10 @@ def _show_roster(self, *args): self.xml.roster_revealer.set_transition_type(transition) self.xml.roster_revealer.set_reveal_child(show) - def _on_roster_row_activated(self, _roster, nick): + def _on_roster_row_activated(self, + _roster: GroupchatRoster, + nick: str + ) -> None: muc_prefer_direct_msg = app.settings.get('muc_prefer_direct_msg') if not self.is_anonymous and muc_prefer_direct_msg: participant = self.contact.get_resource(nick) @@ -699,7 +750,10 @@ def _on_roster_row_activated(self, _roster, nick): contact = self.contact.get_resource(nick) app.window.add_private_chat(self.account, contact.jid, select=True) - def _on_avatar_update(self, _contact, _signal_name): + def _on_avatar_update(self, + _contact: GroupchatContact, + _signal_name: str + ) -> None: self._update_avatar() def _update_avatar(self) -> None: @@ -713,13 +767,17 @@ def draw_banner_text(self) -> None: """ self.xml.banner_name_label.set_text(self.contact.name) - def _on_bookmarks_received(self, _event): + def _on_bookmarks_received(self, _event: events.BookmarksReceived) -> None: self.draw_banner_text() - def _on_room_voice_request(self, _contact, _signal_name, properties): + def _on_room_voice_request(self, + _contact: GroupchatContact, + _signal_name: str, + properties: MessageProperties + ) -> None: voice_request = properties.voice_request - def on_approve(): + def on_approve() -> None: self._client.get_module('MUC').approve_voice_request( self.room_jid, voice_request) @@ -734,11 +792,13 @@ def on_approve(): callback=on_approve)], modal=False).show() - def _on_message_received(self, event): + def _on_message_received(self, event: events.MessageReceived) -> None: if not event.msgtxt: return - def _on_mam_message_received(self, event): + def _on_mam_message_received(self, + event: events.MamMessageReceived + ) -> None: if not event.properties.type.is_groupchat: return if event.archive_jid != self.room_jid: @@ -751,7 +811,7 @@ def _on_mam_message_received(self, event): additional_data=event.additional_data, notify=False) - def _on_gc_message_received(self, event): + def _on_gc_message_received(self, event: events.GcMessageReceived) -> None: if event.properties.muc_nickname is None: # message from server self.add_message(event.msgtxt, @@ -810,14 +870,18 @@ def add_message(self, stanza_id=stanza_id, additional_data=additional_data) - def _on_room_subject(self, _contact, _signal_name, properties): + def _on_room_subject(self, + _contact: GroupchatContact, + _signal_name: str, + properties: MessageProperties + ) -> None: if self.subject == properties.subject: # Probably a rejoin, we already showed that subject return self._subject_data = properties - date = None + date = '' if properties.user_timestamp: date = time.strftime('%c', time.localtime(properties.user_timestamp)) @@ -827,12 +891,16 @@ def _on_room_subject(self, _contact, _signal_name, properties): self.conversation_view.add_muc_subject( properties.subject, properties.muc_nickname, date) - def _on_room_config_changed(self, _contact, _signal_name, properties): + def _on_room_config_changed(self, + _contact: GroupchatContact, + _signal_name: str, + properties: MessageProperties + ) -> None: #
http://www.xmpp.org/extensions/xep-0045.html#roomconfig-notify
status_codes = properties.muc_status_codes - changes = [] + changes: list[str] = [] if StatusCode.SHOWING_UNAVAILABLE in status_codes: changes.append(_('Group chat now shows unavailable members')) @@ -868,7 +936,7 @@ def _on_room_config_changed(self, _contact, _signal_name, properties): self.add_info_message(change) @event_filter(['account']) - def _nec_ping(self, event): + def _nec_ping(self, event: events.ApplicationEvent) -> None: if not event.contact.is_groupchat: return @@ -876,13 +944,13 @@ def _nec_ping(self, event): return nick = event.contact.name - if event.name == 'ping-sent': + if isinstance(event, events.PingSent): self.add_info_message(_('Ping? (%s)') % nick) - elif event.name == 'ping-reply': + elif isinstance(event, events.PingReply): self.add_info_message( _('Pong! (%(nick)s %(delay)s s.)') % {'nick': nick, 'delay': event.seconds}) - elif event.name == 'ping-error': + elif isinstance(event, events.PingError): self.add_info_message(event.error) def _set_message_input_sensitive(self, state: bool) -> None: @@ -921,7 +989,12 @@ def rejoin(self) -> None: # if message is not None: # ctrl.send_message(message) - def _on_user_joined(self, _contact, _signal_name, user_contact, properties): + def _on_user_joined(self, + _contact: GroupchatContact, + _signal_name: str, + user_contact: GroupchatParticipant, + properties: MessageProperties + ) -> None: nick = user_contact.name if not properties.is_muc_self_presence: if self.contact.is_joined: @@ -950,17 +1023,28 @@ def _on_user_joined(self, _contact, _signal_name, user_contact, properties): # Update Actions self.update_actions() - def _on_room_config_finished(self, _contact, _signal_name): + def _on_room_config_finished(self, + _contact: GroupchatContact, + _signal_name: str + ) -> None: self._show_page('groupchat') self.add_info_message(_('A new group chat has been created')) - def _on_room_config_failed(self, _contact, _signal_name, error): + def _on_room_config_failed(self, + _contact: GroupchatContact, + _signal_name: str, + error: StanzaError + ) -> None: self.xml.error_heading.set_text(_('Failed to Configure Group Chat')) self.xml.error_label.set_text(to_user_string(error)) self._show_page('error') - def _on_user_nickname_changed(self, _contact, _signal_name, user_contact, - properties): + def _on_user_nickname_changed(self, + _contact: GroupchatContact, + _signal_name: str, + user_contact: GroupchatParticipant, + properties: MessageProperties + ) -> None: nick = user_contact.name new_nick = properties.muc_user.nick if properties.is_muc_self_presence: @@ -974,10 +1058,11 @@ def _on_user_nickname_changed(self, _contact, _signal_name, user_contact, self.add_info_message(message) def _on_user_status_show_changed(self, - _contact, - _signal_name, - user_contact, - properties): + _contact: GroupchatContact, + _signal_name: str, + user_contact: GroupchatParticipant, + properties: MessageProperties + ) -> None: self.conversation_view.add_muc_user_status( user_contact, @@ -1050,7 +1135,11 @@ def _on_user_role_changed(self, self.add_info_message(message) self.update_actions() - def _on_room_kicked(self, _contact, _signal_name, properties): + def _on_room_kicked(self, + _contact: GroupchatContact, + _signal_name: str, + properties: MessageProperties + ) -> None: status_codes = properties.muc_status_codes or [] reason = properties.muc_user.reason @@ -1102,7 +1191,12 @@ def _on_room_kicked(self, _contact, _signal_name, properties): message = message.format(actor=actor, reason=reason) self.add_info_message(message) - def _on_user_left(self, _contact, _signal_name, user_contact, properties): + def _on_user_left(self, + _contact: GroupchatContact, + _signal_name: str, + user_contact: GroupchatParticipant, + properties: MessageProperties + ) -> None: status_codes = properties.muc_status_codes or [] nick = user_contact.name @@ -1151,13 +1245,23 @@ def _on_user_left(self, _contact, _signal_name, user_contact, properties): self.conversation_view.add_muc_user_left( nick, properties.muc_user.reason) - def _on_room_joined(self, _contact, _signal_name): + def _on_room_joined(self, + _contact: GroupchatContact, + _signal_name: str + ) -> None: self._show_page('groupchat') - def _on_room_password_required(self, _contact, _signal_name, _properties): + def _on_room_password_required(self, + _contact: GroupchatContact, + _signal_name: str, + _properties: MessageProperties): self._show_page('password') - def _on_room_join_failed(self, _contact, _signal_name, error): + def _on_room_join_failed(self, + _contact: GroupchatContact, + _signal_name: str, + error: StanzaError + ) -> None: if self._client.get_module('Bookmarks').is_bookmark(self.room_jid): self.xml.remove_bookmark_button.show() @@ -1165,16 +1269,28 @@ def _on_room_join_failed(self, _contact, _signal_name, error): self.xml.error_label.set_text(to_user_string(error)) self._show_page('error') - def _on_room_creation_failed(self, _contact, _signal_name, properties): + def _on_room_creation_failed(self, + _contact: GroupchatContact, + _signal_name: str, + properties: MessageProperties + ) -> None: self.xml.error_heading.set_text(_('Failed to Create Group Chat')) self.xml.error_label.set_text(to_user_string(properties.error)) self._show_page('error') - def _on_room_presence_error(self, _contact, _signal_name, properties): + def _on_room_presence_error(self, + _contact: GroupchatContact, + _signal_name: str, + properties: MessageProperties + ) -> None: error_message = to_user_string(properties.error) self.add_info_message(_('Error: %s') % error_message) - def _on_room_destroyed(self, _contact, _signal_name, properties): + def _on_room_destroyed(self, + _contact: GroupchatContact, + _signal_name: str, + properties: MessageProperties + ) -> None: destroyed = properties.muc_destroyed reason = destroyed.reason @@ -1189,7 +1305,7 @@ def _on_room_destroyed(self, _contact, _signal_name, properties): 'instead: xmpp:%s?join') % str(alternate) self.add_info_message(join_message) - def _on_message_sent(self, event): + def _on_message_sent(self, event: events.MessageSent) -> None: if not event.message: return # we'll save sent message text when we'll receive it in @@ -1254,7 +1370,7 @@ def send_message(self, self.msg_textview.get_buffer().set_text('') self.msg_textview.grab_focus() - def _on_message_error(self, event): + def _on_message_error(self, event: events.MessageError) -> None: self.conversation_view.show_error(event.message_id, event.error) def shutdown(self, reason=None): @@ -1283,13 +1399,13 @@ def safe_shutdown(self) -> bool: def allow_shutdown(self, _method, on_yes, on_no): # whether to ask for confirmation before closing muc if app.settings.get('confirm_close_muc') and self.contact.is_joined: - def on_ok(is_checked): + def on_ok(is_checked: bool) -> None: if is_checked: # User does not want to be asked again app.settings.set('confirm_close_muc', False) on_yes(self) - def on_cancel(is_checked): + def on_cancel(is_checked: bool) -> None: if is_checked: # User does not want to be asked again app.settings.set('confirm_close_muc', False) @@ -1320,8 +1436,15 @@ def set_control_active(self, state: bool) -> None: self.attention_flag = False BaseControl.set_control_active(self, state) - def _on_drag_data_received(self, _widget, _context, _x_coord, _y_coord, - selection, target_type, _timestamp): + def _on_drag_data_received(self, + _widget: Gtk.Widget, + _context: Gdk.DragContext, + _x_coord: int, + _y_coord: int, + selection: Gtk.SelectionData, + target_type: int, + _timestamp: int + ) -> None: if not selection.get_data(): return @@ -1336,7 +1459,10 @@ def _jid_not_blocked(self, bare_jid: str) -> bool: fjid = self.room_jid + '/' + bare_jid return not helpers.jid_is_blocked(self.account, fjid) - def _on_message_textview_key_press_event(self, widget, event): + def _on_message_textview_key_press_event(self, + textview: MessageInputTextView, + event: Gdk.EventKey + ) -> bool: # pylint: disable=too-many-nested-blocks res = BaseControl._on_message_textview_key_press_event( self, widget, event) @@ -1449,7 +1575,7 @@ def _on_message_textview_key_press_event(self, widget, event): self.last_key_tabs = True return True self.last_key_tabs = False - return None + return False def delegate_action(self, action: str) -> int: res = super().delegate_action(action) @@ -1508,36 +1634,20 @@ def focus(self) -> None: elif page_name == 'destroy': self.xml.destroy_reason_entry.grab_focus_without_selecting() - def append_nick_in_msg_textview(self, _widget, nick): - message_buffer = self.msg_textview.get_buffer() - start_iter, end_iter = message_buffer.get_bounds() - cursor_position = message_buffer.get_insert() - end_iter = message_buffer.get_iter_at_mark(cursor_position) - text = message_buffer.get_text(start_iter, end_iter, False) - start = '' - if text: # Cursor is not at first position - if not text[-1] in (' ', '\n', '\t'): - start = ' ' - add = ' ' - else: - gc_refer_to_nick_char = app.settings.get('gc_refer_to_nick_char') - add = gc_refer_to_nick_char + ' ' - message_buffer.insert_at_cursor(start + nick + add) - - def _on_kick_participant_clicked(self, _button): + def _on_kick_participant_clicked(self, _button: Gtk.Button) -> None: reason = self.xml.kick_reason_entry.get_text() self._client.get_module('MUC').set_role( self.room_jid, self._kick_nick, 'none', reason) self._show_page('groupchat') - def _on_ban_participant_clicked(self, _button): + def _on_ban_participant_clicked(self, _button: Gtk.Button) -> None: reason = self.xml.ban_reason_entry.get_text() self._client.get_module('MUC').set_affiliation( self.room_jid, {self._ban_jid: {'affiliation': 'outcast', 'reason': reason}}) self._show_page('groupchat') - def _on_page_change(self, stack, _param): + def _on_page_change(self, stack: Gtk.Stack, _param: Any) -> None: page_name = stack.get_visible_child_name() if page_name == 'groupchat': pass @@ -1554,7 +1664,10 @@ def _on_page_change(self, stack, _param): elif page_name == 'error': self.xml.close_button.grab_default() - def _on_change_nick(self, _action, _param): + def _on_change_nick(self, + _action: Gio.SimpleAction, + _param: Optional[GLib.Variant] + ) -> None: if self._get_current_page() != 'groupchat': return self.xml.nickname_entry.set_text(self.contact.nickname) @@ -1562,7 +1675,7 @@ def _on_change_nick(self, _action, _param): self.xml.nickname_change_button.grab_default() self._show_page('nickname') - def _on_nickname_text_changed(self, entry, _param): + def _on_nickname_text_changed(self, entry: Gtk.Entry, _param: Any) -> None: text = entry.get_text() if not text or text == self.contact.nickname: self.xml.nickname_change_button.set_sensitive(False) @@ -1574,12 +1687,15 @@ def _on_nickname_text_changed(self, entry, _param): else: self.xml.nickname_change_button.set_sensitive(True) - def _on_nickname_change_clicked(self, _button): + def _on_nickname_change_clicked(self, _button: Gtk.Button) -> None: new_nick = self.xml.nickname_entry.get_text() self._client.get_module('MUC').change_nick(self.room_jid, new_nick) self._show_page('groupchat') - def _on_rename_groupchat(self, _action, _param): + def _on_rename_groupchat(self, + _action: Gio.SimpleAction, + _param: Optional[GLib.Variant] + ) -> None: if self._get_current_page() != 'groupchat': return self.xml.name_entry.set_text(self.contact.name) @@ -1587,13 +1703,13 @@ def _on_rename_groupchat(self, _action, _param): self.xml.rename_button.grab_default() self._show_page('rename') - def _on_rename_clicked(self, _button): + def _on_rename_clicked(self, _button: Gtk.Button) -> None: new_name = self.xml.name_entry.get_text() self._client.get_module('Bookmarks').modify( self.room_jid, name=new_name) self._show_page('groupchat') - def _on_manage_save_clicked(self, _button): + def _on_manage_save_clicked(self, _button: Gtk.Button) -> None: if self._room_config_form is not None: name = self.xml.muc_name_entry.get_text() desc = self.xml.muc_description_entry.get_text() @@ -1612,14 +1728,14 @@ def _on_manage_save_clicked(self, _button): self._show_page('groupchat') - def _on_change_subject(self, _button): + def _on_change_subject(self, _button: Gtk.Button) -> None: if self._get_current_page() not in ('groupchat', 'muc-manage'): return self.xml.subject_textview.get_buffer().set_text(self.subject) self.xml.subject_textview.grab_focus() self._show_page('subject') - def _on_subject_change_clicked(self, _button): + def _on_subject_change_clicked(self, _button: Gtk.Button) -> None: buffer_ = self.xml.subject_textview.get_buffer() subject = buffer_.get_text(buffer_.get_start_iter(), buffer_.get_end_iter(), @@ -1627,7 +1743,7 @@ def _on_subject_change_clicked(self, _button): self._client.get_module('MUC').set_subject(self.room_jid, subject) self._show_page('groupchat') - def _on_password_set_clicked(self, _button): + def _on_password_set_clicked(self, _button: Gtk.Button) -> None: password = self.xml.password_entry.get_text() self._client.get_module('MUC').set_password(self.room_jid, password) self._client.get_module('MUC').join(self.room_jid) @@ -1636,10 +1752,14 @@ def _on_password_set_clicked(self, _button): def _on_password_changed(self, entry, _param): self.xml.password_set_button.set_sensitive(bool(entry.get_text())) - def _on_password_cancel_clicked(self, _button=None): + def _on_password_cancel_clicked(self, *args: Any) -> None: self._close_control() - def _on_room_captcha_challenge(self, _contact, _signal_name, properties): + def _on_room_captcha_challenge(self, + _contact: GroupchatContact, + _signal_name: str, + properties: MessageProperties + ) -> None: self._remove_captcha_request() form = properties.captcha.form @@ -1654,7 +1774,11 @@ def _on_room_captcha_challenge(self, _contact, _signal_name, properties): self._show_page('captcha') self._captcha_request.focus_first_entry() - def _on_room_captcha_error(self, _contact, _signal_name, error): + def _on_room_captcha_error(self, + _contact: GroupchatContact, + _signal_name: str, + error: StanzaError + ) -> None: error_text = to_user_string(error) self.xml.captcha_error_label.set_text(error_text) self._show_page('captcha-error') @@ -1667,7 +1791,10 @@ def _remove_captcha_request(self) -> None: self._captcha_request.destroy() self._captcha_request = None - def _on_captcha_changed(self, _widget, is_valid): + def _on_captcha_changed(self, + _widget: DataFormWidget, + is_valid: bool + ) -> None: self.xml.captcha_set_button.set_sensitive(is_valid) def _on_captcha_set_clicked(self, _button): @@ -1676,31 +1803,33 @@ def _on_captcha_set_clicked(self, _button): self._remove_captcha_request() self._show_page('groupchat') - def _on_captcha_cancel_clicked(self, _button=None): + def _on_captcha_cancel_clicked(self, *args: Any) -> None: self._client.get_module('MUC').cancel_captcha(self.room_jid) self._remove_captcha_request() self._close_control() - def _on_captcha_try_again_clicked(self, _button=None): + def _on_captcha_try_again_clicked(self, *args: Any) -> None: self._client.get_module('MUC').join(self.room_jid) self._show_page('groupchat') - def _on_remove_bookmark_button_clicked(self, _button=None): + def _on_remove_bookmark_button_clicked(self, *args: Any) -> None: self._client.get_module('Bookmarks').remove(self.room_jid) self._close_control() - def _on_retry_join_clicked(self, _button=None): + def _on_retry_join_clicked(self, *args: Any) -> None: self._client.get_module('MUC').join(self.room_jid) self._show_page('groupchat') - def _on_page_cancel_clicked(self, _button=None): + def _on_page_cancel_clicked(self, *args: Any) -> None: self._show_page('groupchat') - def _on_page_close_clicked(self, _button=None): + def _on_page_close_clicked(self, *args: Any) -> None: self._close_control() - def _on_groupchat_state_abort_clicked(self, _button): + def _on_groupchat_state_abort_clicked(self, _button: Gtk.Button) -> None: self._close_control() - def _on_groupchat_state_join_clicked(self, _groupchat_state): + def _on_groupchat_state_join_clicked(self, + _groupchat_state: GroupchatState + ) -> None: self._client.get_module('MUC').join(self.room_jid) ===================================== gajim/gtk/conversation/rows/base.py ===================================== @@ -36,7 +36,7 @@ def __init__(self, account: str, widget: Optional[str] = None) -> None: self.kind: str = '' self.name: str = '' self.message_id: Optional[str] = None - self.log_line_id: Optional[str] = None + self.log_line_id: Optional[int] = None self.stanza_id: Optional[str] = None self.text: str = '' self._merged: bool = False ===================================== gajim/gtk/conversation/rows/message.py ===================================== @@ -86,7 +86,7 @@ def __init__(self, marker: Optional[str] = None, error: Optional[StanzaError] = None, encryption_enabled: bool = False, - log_line_id: Optional[str] = None) -> None: + log_line_id: Optional[int] = None) -> None: BaseRow.__init__(self, account) self.type = 'chat' ===================================== gajim/gtk/conversation/view.py ===================================== @@ -267,7 +267,7 @@ def add_message(self, kind: str, name: str, timestamp: float, - log_line_id: Optional[str] = None, + log_line_id: Optional[int] = None, message_id: Optional[str] = None, stanza_id: Optional[str] = None, display_marking: Optional[Displaymarking] = None, View it on GitLab:
https://dev.gajim.org/gajim/gajim/-/compare/4e985f7dfb7bab10ff029f1123baf13…
-- View it on GitLab:
https://dev.gajim.org/gajim/gajim/-/compare/4e985f7dfb7bab10ff029f1123baf13…
You're receiving this email because of your account on
dev.gajim.org
.
1
0
0
0
[Git][gajim/gajim][master] Rebuild builder stubs
by Daniel Brötzmann (@wurstsalat)
15 Jan '22
15 Jan '22
Daniel Brötzmann pushed to branch master at gajim / gajim Commits: 4e985f7d by wurstsalat at 2022-01-15T13:11:04+01:00 Rebuild builder stubs - - - - - 1 changed file: - gajim/gtk/builder.pyi Changes: ===================================== gajim/gtk/builder.pyi ===================================== @@ -9,22 +9,126 @@ from gi.repository import GtkSource class Builder(Gtk.Builder): ... -class CertificateDialogBuilder(Builder): - certificate_box: Gtk.Box - label_cert_for_account: Gtk.Label - data_it_common_name: Gtk.Label - data_it_organization: Gtk.Label - data_it_organizational_unit: Gtk.Label - data_it_serial_number: Gtk.Label - data_ib_common_name: Gtk.Label - data_ib_organization: Gtk.Label - data_ib_organizational_unit: Gtk.Label - data_issued_on: Gtk.Label - data_expires_on: Gtk.Label - data_sha1: Gtk.Label - data_sha256: Gtk.Label - copy_cert_info_button: Gtk.Button - image1: Gtk.Image +class CallWidgetBuilder(Builder): + adjustment1: Gtk.Adjustment + adjustment2: Gtk.Adjustment + dtmf_popover: Gtk.Popover + grid1: Gtk.Grid + button_1: Gtk.Button + button_2: Gtk.Button + button_3: Gtk.Button + button_4: Gtk.Button + button_5: Gtk.Button + button_6: Gtk.Button + button_7: Gtk.Button + button_8: Gtk.Button + button_9: Gtk.Button + button_star: Gtk.Button + button_0: Gtk.Button + button_pound: Gtk.Button + av_box: Gtk.Box + video_box: Gtk.Box + outgoing_viewport: Gtk.Viewport + incoming_viewport: Gtk.Viewport + av_start_box: Gtk.Box + av_start_mic_button: Gtk.Button + av_start_mic_cam_button: Gtk.Button + jingle_audio_state: Gtk.Image + jingle_connection_state: Gtk.Label + jingle_connection_spinner: Gtk.Spinner + answer_video_button: Gtk.Button + audio_buttons_box: Gtk.Box + mic_hscale: Gtk.VolumeButton + volumebutton_plus_button2: Gtk.Button + volumebutton_minus_button2: Gtk.Button + sound_hscale: Gtk.VolumeButton + volumebutton_plus_button1: Gtk.Button + volumebutton_minus_button1: Gtk.Button + dtmf_button: Gtk.MenuButton + av_cam_button: Gtk.Button + av_cam_image: Gtk.Image + + +class ServiceDiscoveryWindowBuilder(Builder): + liststore1: Gtk.ListStore + service_discovery_window: Gtk.Window + service_discovery: Gtk.Box + banner_agent_icon: Gtk.Image + banner_agent_header: Gtk.Label + banner_agent_subheader: Gtk.Label + address_box: Gtk.Box + address_comboboxtext: Gtk.ComboBoxText + address_comboboxtext_entry: Gtk.Entry + browse_button: Gtk.Button + services_progressbar: Gtk.ProgressBar + services_scrollwin: Gtk.ScrolledWindow + services_treeview: Gtk.TreeView + treeview_selection1: Gtk.TreeSelection + action_buttonbox: Gtk.Box + + +class ChatListRowBuilder(Builder): + eventbox: Gtk.EventBox + overlay: Gtk.Overlay + account_identifier: Gtk.Box + avatar_image: Gtk.Image + group_chat_indicator: Gtk.Image + name_label: Gtk.Label + chatstate_image: Gtk.Image + timestamp_label: Gtk.Label + nick_label: Gtk.Label + message_icon: Gtk.Image + message_label: Gtk.Label + unread_label: Gtk.Label + revealer: Gtk.Revealer + close_button: Gtk.Button + + +class WorkspaceDialogBuilder(Builder): + box: Gtk.Box + preview: Gtk.Image + entry: Gtk.Entry + remove_workspace_button: Gtk.Button + image_switch: Gtk.Switch + style_stack: Gtk.Stack + color_chooser: Gtk.ColorButton + image_box: Gtk.Box + save_button: Gtk.Button + + +class ProfileBuilder(Builder): + privacy_popover: Gtk.Popover + avatar_nick_access: Gtk.Switch + vcard_access: Gtk.Switch + avatar_nick_access_label: Gtk.Label + vcard_access_label: Gtk.Label + profile_stack: Gtk.Stack + spinner: Gtk.Spinner + scrolled: Gtk.ScrolledWindow + profile_box: Gtk.Box + avatar_overlay: Gtk.Overlay + avatar_image: Gtk.Image + remove_avatar_button: Gtk.Button + edit_avatar_button: Gtk.Button + nickname_entry: Gtk.Entry + cancel_button: Gtk.Button + add_entry_button: Gtk.MenuButton + privacy_button: Gtk.MenuButton + save_button: Gtk.Button + edit_button: Gtk.Button + avatar_selector_box: Gtk.Box + avatar_update_button: Gtk.Button + + +class BookmarksBuilder(Builder): + bookmarks_store: Gtk.ListStore + bookmarks_grid: Gtk.Grid + bookmarks_view: Gtk.TreeView + jid: Gtk.CellRendererText + name: Gtk.CellRendererText + nick: Gtk.CellRendererText + password: Gtk.CellRendererText + autojoin: Gtk.CellRendererToggle class ZeroconfInformationWindowBuilder(Builder): @@ -61,78 +165,55 @@ class ZeroconfInformationWindowBuilder(Builder): close_button: Gtk.Button -class ChatListRowBuilder(Builder): - eventbox: Gtk.EventBox - overlay: Gtk.Overlay - account_identifier: Gtk.Box - avatar_image: Gtk.Image - group_chat_indicator: Gtk.Image - name_label: Gtk.Label - chatstate_image: Gtk.Image - timestamp_label: Gtk.Label - nick_label: Gtk.Label - message_icon: Gtk.Image - message_label: Gtk.Label - unread_label: Gtk.Label - revealer: Gtk.Revealer - close_button: Gtk.Button - - -class SingleMessageWindowBuilder(Builder): +class EmojiChooserBuilder(Builder): box: Gtk.Box - message_grid: Gtk.Grid - recipients_entry: Gtk.Entry - subject_entry: Gtk.Entry - message_scrolledwindow: Gtk.ScrolledWindow - message_textview: Gtk.TextView - count_chars_label: Gtk.Label - send_button: Gtk.Button + search: Gtk.SearchEntry + stack: Gtk.Stack + section_box: Gtk.Box -class SearchViewBuilder(Builder): - header_box: Gtk.Box - header_name_label: Gtk.Label - header_date_label: Gtk.Label - result_row_grid: Gtk.Grid - row_avatar: Gtk.Image - row_time_label: Gtk.Label - row_name_label: Gtk.Label - search_box: Gtk.Box - search_entry: Gtk.SearchEntry - search_checkbutton: Gtk.CheckButton - date_hint: Gtk.Label - results_listbox: Gtk.ListBox - placeholder: Gtk.Box +class ManagePepServicesWindowBuilder(Builder): + manage_pep_services: Gtk.Box + services_treeview: Gtk.TreeView + treeview_selection1: Gtk.TreeSelection + configure_button: Gtk.Button + image1: Gtk.Image + delete_button: Gtk.Button -class AssistantBuilder(Builder): - main_grid: Gtk.Grid - content_area: Gtk.Box - stack: Gtk.Stack - action_area: Gtk.Box +class ThemesWindowBuilder(Builder): + option_popover: Gtk.Popover + choose_option_listbox: Gtk.ListBox + placeholder: Gtk.Box + theme_store: Gtk.ListStore + theme_grid: Gtk.Grid + theme_treeview: Gtk.TreeView + option_listbox: Gtk.ListBox + add_option_button: Gtk.MenuButton + add_theme_button: Gtk.ToolButton + remove_theme_button: Gtk.ToolButton -class BlockingListBuilder(Builder): - blocking_store: Gtk.ListStore - blocking_grid: Gtk.Grid - overlay: Gtk.Overlay - block_view: Gtk.TreeView - add_button: Gtk.ToolButton - remove_button: Gtk.ToolButton - save_button: Gtk.Button +class FileTransferSendBuilder(Builder): + send_stack: Gtk.Stack + listbox: Gtk.ListBox + description: Gtk.TextView + files_send: Gtk.Button + resource_box: Gtk.Box + resource_send: Gtk.Button + resource_instructions: Gtk.Label -class AccountPageBuilder(Builder): - paned: Gtk.Paned - roster_box: Gtk.Box - roster_menu_button: Gtk.MenuButton - roster_search_entry: Gtk.SearchEntry - account_box: Gtk.Box - avatar_image: Gtk.Image - account_label: Gtk.Label - account_action_box: Gtk.Box - account_settings: Gtk.Button - status_message_box: Gtk.Box +class FileTransferJingleBuilder(Builder): + transfer_box: Gtk.Box + transfer_action: Gtk.Label + file_name: Gtk.Label + file_description: Gtk.Label + file_size: Gtk.Label + action_stack: Gtk.Stack + error_label: Gtk.Label + progress_label: Gtk.Label + progress_bar: Gtk.ProgressBar class GroupchatNickChooserBuilder(Builder): @@ -143,223 +224,46 @@ class GroupchatNickChooserBuilder(Builder): apply_button: Gtk.Button -class GroupsPostWindowBuilder(Builder): - textbuffer1: Gtk.TextBuffer - groups_post_window: Gtk.Window - from_entry: Gtk.Entry - subject_entry: Gtk.Entry - contents_textview: Gtk.TextView - send_button: Gtk.Button - - -class MamPreferencesBuilder(Builder): - default_store: Gtk.ListStore - preferences_store: Gtk.ListStore - mam_box: Gtk.Box - default_combo: Gtk.ComboBox - overlay: Gtk.Overlay - pref_view: Gtk.TreeView - add: Gtk.ToolButton - remove: Gtk.ToolButton - save_button: Gtk.Button - - -class EmojiChooserBuilder(Builder): - box: Gtk.Box - search: Gtk.SearchEntry - stack: Gtk.Stack - section_box: Gtk.Box - - -class AdhocMucBuilder(Builder): - guests_store: Gtk.ListStore - server_store: Gtk.ListStore - adhoc_box: Gtk.Box - description_label: Gtk.Label - guests_treeview: Gtk.TreeView - server_combobox: Gtk.ComboBox - server_entry: Gtk.Entry - invite_button: Gtk.Button - - -class ManagePepServicesWindowBuilder(Builder): - manage_pep_services: Gtk.Box - services_treeview: Gtk.TreeView - treeview_selection1: Gtk.TreeSelection - configure_button: Gtk.Button +class CertificateDialogBuilder(Builder): + certificate_box: Gtk.Box + label_cert_for_account: Gtk.Label + data_it_common_name: Gtk.Label + data_it_organization: Gtk.Label + data_it_organizational_unit: Gtk.Label + data_it_serial_number: Gtk.Label + data_ib_common_name: Gtk.Label + data_ib_organization: Gtk.Label + data_ib_organizational_unit: Gtk.Label + data_issued_on: Gtk.Label + data_expires_on: Gtk.Label + data_sha1: Gtk.Label + data_sha256: Gtk.Label + copy_cert_info_button: Gtk.Button image1: Gtk.Image - delete_button: Gtk.Button - - -class GroupchatRosterBuilder(Builder): - participant_store: Gtk.TreeStore - roster_treeview: Gtk.TreeView - contact_column: Gtk.TreeViewColumn - avatar_renderer: Gtk.CellRendererPixbuf - text_renderer: Gtk.CellRendererText - event_column: Gtk.TreeViewColumn - icon: Gtk.CellRendererPixbuf - expander: Gtk.TreeViewColumn -class ServiceDiscoveryWindowBuilder(Builder): - liststore1: Gtk.ListStore - service_discovery_window: Gtk.Window - service_discovery: Gtk.Box - banner_agent_icon: Gtk.Image - banner_agent_header: Gtk.Label - banner_agent_subheader: Gtk.Label - address_box: Gtk.Box - address_comboboxtext: Gtk.ComboBoxText - address_comboboxtext_entry: Gtk.Entry - browse_button: Gtk.Button - services_progressbar: Gtk.ProgressBar - services_scrollwin: Gtk.ScrolledWindow - services_treeview: Gtk.TreeView - treeview_selection1: Gtk.TreeSelection - action_buttonbox: Gtk.Box - - -class MainBuilder(Builder): - main_grid: Gtk.Grid - left_grid: Gtk.Grid - account_box: Gtk.Box - workspace_scrolled: Gtk.ScrolledWindow - app_box: Gtk.Box - - -class PreviewContextMenuBuilder(Builder): - context_menu: Gtk.Menu - download: Gtk.MenuItem - open: Gtk.MenuItem - save_as: Gtk.MenuItem - open_folder: Gtk.MenuItem - encryption_separator: Gtk.SeparatorMenuItem - copy_link_location: Gtk.MenuItem - open_link_in_browser: Gtk.MenuItem - - -class VideoPreviewBuilder(Builder): - video_preview_box: Gtk.Box - video_source_label: Gtk.Label - video_preview_placeholder: Gtk.Box - - -class ProfileBuilder(Builder): - privacy_popover: Gtk.Popover - avatar_nick_access: Gtk.Switch - vcard_access: Gtk.Switch - avatar_nick_access_label: Gtk.Label - vcard_access_label: Gtk.Label - profile_stack: Gtk.Stack - spinner: Gtk.Spinner - scrolled: Gtk.ScrolledWindow - profile_box: Gtk.Box - avatar_overlay: Gtk.Overlay - avatar_image: Gtk.Image - remove_avatar_button: Gtk.Button - edit_avatar_button: Gtk.Button - nickname_entry: Gtk.Entry - cancel_button: Gtk.Button - add_entry_button: Gtk.MenuButton - privacy_button: Gtk.MenuButton - save_button: Gtk.Button - edit_button: Gtk.Button - avatar_selector_box: Gtk.Box - avatar_update_button: Gtk.Button - - -class CallWidgetBuilder(Builder): - adjustment1: Gtk.Adjustment - adjustment2: Gtk.Adjustment - dtmf_popover: Gtk.Popover - grid1: Gtk.Grid - button_1: Gtk.Button - button_2: Gtk.Button - button_3: Gtk.Button - button_4: Gtk.Button - button_5: Gtk.Button - button_6: Gtk.Button - button_7: Gtk.Button - button_8: Gtk.Button - button_9: Gtk.Button - button_star: Gtk.Button - button_0: Gtk.Button - button_pound: Gtk.Button - av_box: Gtk.Box - video_box: Gtk.Box - outgoing_viewport: Gtk.Viewport - incoming_viewport: Gtk.Viewport - av_start_box: Gtk.Box - av_start_mic_button: Gtk.Button - av_start_mic_cam_button: Gtk.Button - jingle_audio_state: Gtk.Image - jingle_connection_state: Gtk.Label - jingle_connection_spinner: Gtk.Spinner - answer_video_button: Gtk.Button - audio_buttons_box: Gtk.Box - mic_hscale: Gtk.VolumeButton - volumebutton_plus_button2: Gtk.Button - volumebutton_minus_button2: Gtk.Button - sound_hscale: Gtk.VolumeButton - volumebutton_plus_button1: Gtk.Button - volumebutton_minus_button1: Gtk.Button - dtmf_button: Gtk.MenuButton - av_cam_button: Gtk.Button - av_cam_image: Gtk.Image - - -class WorkspaceDialogBuilder(Builder): - box: Gtk.Box - preview: Gtk.Image - entry: Gtk.Entry - remove_workspace_button: Gtk.Button - image_switch: Gtk.Switch - style_stack: Gtk.Stack - color_chooser: Gtk.ColorButton - image_box: Gtk.Box - save_button: Gtk.Button - - -class FiletransfersBuilder(Builder): - accelgroup1: Gtk.AccelGroup - file_transfers_menu: Gtk.Menu - remove_menuitem: Gtk.MenuItem - pause_resume_menuitem: Gtk.MenuItem - cancel_menuitem: Gtk.MenuItem - open_folder_menuitem: Gtk.MenuItem - file_transfers_window: Gtk.Window - notify_ft_complete: Gtk.Switch - transfers_scrolledwindow: Gtk.ScrolledWindow - transfers_list: Gtk.TreeView - transfers_list_atkobject: Atk.Object - cleanup_button: Gtk.ToolButton - pause_resume_button: Gtk.ToolButton - cancel_button: Gtk.ToolButton - file_transfers_window_atkobject: Atk.Object - - -class PreviewBuilder(Builder): - preview_box: Gtk.Box - icon_event_box: Gtk.EventBox - icon_button: Gtk.Button - right_box: Gtk.Box - image_event_box: Gtk.EventBox - image_button: Gtk.Button - progressbar: Gtk.ProgressBar - button_box: Gtk.Box - download_button: Gtk.Button - save_as_button: Gtk.Button - open_folder_button: Gtk.Button - file_name: Gtk.Label - file_size: Gtk.Label - - -class ExceptionDialogBuilder(Builder): - exception_dialog: Gtk.ApplicationWindow - close_btn: Gtk.Button - report_btn: Gtk.Button - exception_view: Gtk.TextView +class PreferencesBuilder(Builder): + grid: Gtk.Grid + stack: Gtk.Stack + window_behaviour: Gtk.Grid + chats: Gtk.Grid + group_chats: Gtk.Grid + file_preview: Gtk.Grid + visual_notifications: Gtk.Grid + sounds: Gtk.Grid + status_message: Gtk.Grid + automatic_status: Gtk.Grid + themes: Gtk.Grid + emoji: Gtk.Grid + audio_video_info_bar: Gtk.InfoBar + button1: Gtk.Button + server: Gtk.Grid + audio: Gtk.Grid + video: Gtk.Grid + miscellaneous: Gtk.Grid + reset_button: Gtk.Button + advanced: Gtk.Grid + ace_button: Gtk.Button class GroupchatCreationBuilder(Builder): @@ -377,291 +281,69 @@ class GroupchatCreationBuilder(Builder): create_button: Gtk.Button -class PluginsWindowBuilder(Builder): - plugins_notebook: Gtk.Notebook - installed_plugins_treeview: Gtk.TreeView - treeview_selection: Gtk.TreeSelection - install_plugin_button: Gtk.ToolButton - uninstall_plugin_button: Gtk.ToolButton - plugin_name_label: Gtk.Label - configure_plugin_button: Gtk.Button - available_text: Gtk.InfoBar - available_text_label: Gtk.Label - description: Gtk.Label - plugin_version_label: Gtk.Label - plugin_authors_label: Gtk.Label - plugin_homepage_linkbutton: Gtk.Label - textbuffer1: Gtk.TextBuffer - - -class PasswordDialogBuilder(Builder): - pass_box: Gtk.Box - header: Gtk.Label - message_label: Gtk.Label - pass_entry: Gtk.Entry - save_pass_checkbutton: Gtk.CheckButton - cancel_button: Gtk.Button - ok_button: Gtk.Button - keyring_hint: Gtk.Label - - -class ThemesWindowBuilder(Builder): - option_popover: Gtk.Popover - choose_option_listbox: Gtk.ListBox - placeholder: Gtk.Box - theme_store: Gtk.ListStore - theme_grid: Gtk.Grid - theme_treeview: Gtk.TreeView - option_listbox: Gtk.ListBox - add_option_button: Gtk.MenuButton - add_theme_button: Gtk.ToolButton - remove_theme_button: Gtk.ToolButton - - -class AddContactBuilder(Builder): - account_liststore: Gtk.ListStore - address_box: Gtk.Box - account_box: Gtk.Box - account_combo: Gtk.ComboBox - cellrenderertext3: Gtk.CellRendererText - address_entry: Gtk.Entry - contact_grid: Gtk.Grid - status_switch: Gtk.Switch - group_combo: Gtk.ComboBoxText - message_entry: Gtk.Entry - contact_info_button: Gtk.Button - gateway_box: Gtk.Box - gateway_image: Gtk.Image - gateway_label: Gtk.Label - register_button: Gtk.Button - commands_button: Gtk.Button - - -class RosterBuilder(Builder): - contact_store: Gtk.TreeStore - roster_treeview: Gtk.TreeView - contact_column: Gtk.TreeViewColumn - avatar_renderer: Gtk.CellRendererPixbuf - text_renderer: Gtk.CellRendererText - expander: Gtk.TreeViewColumn - - -class GroupchatConfigBuilder(Builder): - affiliation_store: Gtk.ListStore - combo_store: Gtk.ListStore - info_popover: Gtk.Popover - outcast_store: Gtk.ListStore - grid: Gtk.Grid - treeview_buttonbox: Gtk.Box - info_button: Gtk.MenuButton - add_button: Gtk.Button - remove_button: Gtk.Button - ok_button: Gtk.Button - stack: Gtk.Stack - config_grid: Gtk.Grid - affiliation_treeview: Gtk.TreeView - reserved_name_column: Gtk.TreeViewColumn - role_column: Gtk.TreeViewColumn - outcast_treeview: Gtk.TreeView - - class AppPageBuilder(Builder): gajim_update: Gtk.Box update_message: Gtk.Label gajim_update_check: Gtk.Box -class ShortcutsWindowBuilder(Builder): - shortcuts_window: Gtk.ShortcutsWindow - - -class XmlConsoleBuilder(Builder): - headerbar: Gtk.HeaderBar - search_toggle: Gtk.ToggleButton - popover: Gtk.Popover - box: Gtk.Box - paned: Gtk.Paned - search_revealer: Gtk.Revealer - search_entry: Gtk.SearchEntry - search_forward: Gtk.ToolButton - search_backward: Gtk.ToolButton - scrolled: Gtk.ScrolledWindow - sourceview: GtkSource.View - scrolled_input: Gtk.ScrolledWindow - input_entry: Gtk.TextView - actionbar: Gtk.ActionBar - paste: Gtk.Button - menubutton: Gtk.MenuButton - send: Gtk.Button - - -class ChatControlBuilder(Builder): - drop_area: Gtk.Box - formattings_menu: Gtk.Menu - bold: Gtk.MenuItem - italic: Gtk.MenuItem - strike: Gtk.MenuItem - chat_control_hbox: Gtk.Box - overlay: Gtk.Overlay - paned1: Gtk.Paned - textview_box: Gtk.Box - banner_eventbox: Gtk.EventBox - avatar_eventbox: Gtk.EventBox - avatar_image: Gtk.Image - banner_name_label: Gtk.Label - banner_label: Gtk.Label - phone_image: Gtk.Image - account_badge_box: Gtk.Box - hbox2: Gtk.Box - tune_image: Gtk.Image - location_eventbox: Gtk.EventBox - location_image: Gtk.Image - conv_view_overlay: Gtk.Overlay - hbox: Gtk.Box - emoticons_button: Gtk.MenuButton - formattings_button: Gtk.MenuButton - label_selector: Gtk.ComboBox - settings_menu: Gtk.MenuButton - authentication_button: Gtk.Button - lock_image: Gtk.Image - encryption_menu: Gtk.MenuButton - sendfile_button: Gtk.Button - send_message_button: Gtk.Button - - -class FileTransferSendBuilder(Builder): - send_stack: Gtk.Stack - listbox: Gtk.ListBox - description: Gtk.TextView - files_send: Gtk.Button - resource_box: Gtk.Box - resource_send: Gtk.Button - resource_instructions: Gtk.Label - - -class RosterItemExchangeBuilder(Builder): - textbuffer1: Gtk.TextBuffer - roster_item_exchange: Gtk.Box - type_label: Gtk.Label - body_scrolledwindow: Gtk.ScrolledWindow - body_textview: Gtk.TextView - items_list_treeview: Gtk.TreeView - treeview_selection1: Gtk.TreeSelection - cancel_button: Gtk.Button - accept_button: Gtk.Button - - -class PopupNotificationWindowBuilder(Builder): - eventbox: Gtk.EventBox - color_bar: Gtk.Box - image: Gtk.Image - event_type_label: Gtk.Label - close_button: Gtk.Button - event_description_label: Gtk.Label - - -class HistoryManagerBuilder(Builder): - context_menu: Gtk.Menu - export_menuitem: Gtk.MenuItem - delete_menuitem: Gtk.MenuItem - history_manager_window: Gtk.Window - jids_scrolledwindow: Gtk.ScrolledWindow - jids_listview: Gtk.TreeView - treeview_selection1: Gtk.TreeSelection - welcome_box: Gtk.Box - logs_scrolledwindow: Gtk.ScrolledWindow - logs_listview: Gtk.TreeView - treeview_selection2: Gtk.TreeSelection - search_results_scrolledwindow: Gtk.ScrolledWindow - search_results_listview: Gtk.TreeView - treeview_selection3: Gtk.TreeSelection - search_entry: Gtk.Entry - search_db_button: Gtk.Button +class SystrayContextMenuBuilder(Builder): + accelgroup1: Gtk.AccelGroup + systray_context_menu: Gtk.Menu + status_menu: Gtk.MenuItem + start_chat_menuitem: Gtk.MenuItem + sounds_mute_menuitem: Gtk.CheckMenuItem + toggle_window_menuitem: Gtk.MenuItem + preferences_menuitem: Gtk.MenuItem + separator: Gtk.SeparatorMenuItem + quit_menuitem: Gtk.MenuItem -class ChatPanedBuilder(Builder): +class AccountPageBuilder(Builder): paned: Gtk.Paned - middle_grid: Gtk.Grid - header_bar: Gtk.Grid - workspace_label: Gtk.Label - filter_bar_toggle: Gtk.ToggleButton - search_entry: Gtk.SearchEntry - start_chat_button: Gtk.Button - filter_bar_revealer: Gtk.Revealer - filter_bar: Gtk.Box - chat_list_scrolled: Gtk.ScrolledWindow - right_grid: Gtk.Grid - right_grid_overlay: Gtk.Overlay - - -class ContactInfoBuilder(Builder): - devices_grid: Gtk.Grid - priority_label: Gtk.Label - software_label: Gtk.Label - system_label: Gtk.Label - time_label: Gtk.Label - status_value: Gtk.Label - priority_value: Gtk.Label - software_value: Gtk.Label - system_value: Gtk.Label - time_value: Gtk.Label - resource_box: Gtk.Box - resource_label: Gtk.Label - groups_model: Gtk.ListStore - main_grid: Gtk.Grid - header_revealer: Gtk.Revealer - header_image: Gtk.Image - name_entry: Gtk.Entry - edit_name_button: Gtk.ToggleButton - main_stack: Gtk.Stack - vcard_scrolled: Gtk.ScrolledWindow - vcard_box: Gtk.Box + roster_box: Gtk.Box + roster_menu_button: Gtk.MenuButton + roster_search_entry: Gtk.SearchEntry + account_box: Gtk.Box avatar_image: Gtk.Image - contact_name_label: Gtk.Label - contact_jid_label: Gtk.Label - group_chat_grid: Gtk.Grid - role_label: Gtk.Label - affiliation_label: Gtk.Label - settings_box: Gtk.Box - subscription_listbox: Gtk.ListBox - from_subscription_switch: Gtk.Switch - to_subscription_stack: Gtk.Stack - request_stack: Gtk.Stack - to_subscription_button: Gtk.Button - groups_page_box: Gtk.Box - groups_treeview: Gtk.TreeView - tree_selection: Gtk.TreeSelection - toggle_renderer: Gtk.CellRendererToggle - text_renderer: Gtk.CellRendererText - group_add_button: Gtk.ToolButton - group_remove_button: Gtk.ToolButton - notes_page_box: Gtk.Box - scrolledwindow_annotation: Gtk.ScrolledWindow - textview_annotation: Gtk.TextView - devices_stack: Gtk.Stack - devices_box: Gtk.Box + account_label: Gtk.Label + account_action_box: Gtk.Box + account_settings: Gtk.Button + status_message_box: Gtk.Box -class GroupchatInfoScrolledBuilder(Builder): - info_grid: Gtk.Grid - address_label: Gtk.Label - description_label: Gtk.Label - subject_label: Gtk.Label - author_label: Gtk.Label +class PluginsWindowBuilder(Builder): + plugins_notebook: Gtk.Notebook + installed_plugins_treeview: Gtk.TreeView + treeview_selection: Gtk.TreeSelection + install_plugin_button: Gtk.ToolButton + uninstall_plugin_button: Gtk.ToolButton + plugin_name_label: Gtk.Label + configure_plugin_button: Gtk.Button + available_text: Gtk.InfoBar + available_text_label: Gtk.Label description: Gtk.Label - author: Gtk.Label - users: Gtk.Label - contact_label: Gtk.Label - logs_label: Gtk.Label - lang: Gtk.Label - logs: Gtk.LinkButton - users_image: Gtk.Image - lang_image: Gtk.Image - contact_box: Gtk.Box - subject: Gtk.Label - name: Gtk.Label - avatar_image: Gtk.Image - address: Gtk.Label + plugin_version_label: Gtk.Label + plugin_authors_label: Gtk.Label + plugin_homepage_linkbutton: Gtk.Label + textbuffer1: Gtk.TextBuffer + + +class GroupchatRosterTooltipBuilder(Builder): + tooltip_grid: Gtk.Grid + avatar: Gtk.Image + jid: Gtk.Label + nick: Gtk.Label + fillelement: Gtk.Label + status: Gtk.Label + affiliation: Gtk.Label + + +class AssistantBuilder(Builder): + main_grid: Gtk.Grid + content_area: Gtk.Box + stack: Gtk.Stack + action_area: Gtk.Box class GroupchatInviterBuilder(Builder): @@ -674,6 +356,82 @@ class GroupchatInviterBuilder(Builder): invitees_scrolled: Gtk.ScrolledWindow +class MamPreferencesBuilder(Builder): + default_store: Gtk.ListStore + preferences_store: Gtk.ListStore + mam_box: Gtk.Box + default_combo: Gtk.ComboBox + overlay: Gtk.Overlay + pref_view: Gtk.TreeView + add: Gtk.ToolButton + remove: Gtk.ToolButton + save_button: Gtk.Button + + +class FiletransfersBuilder(Builder): + accelgroup1: Gtk.AccelGroup + file_transfers_menu: Gtk.Menu + remove_menuitem: Gtk.MenuItem + pause_resume_menuitem: Gtk.MenuItem + cancel_menuitem: Gtk.MenuItem + open_folder_menuitem: Gtk.MenuItem + file_transfers_window: Gtk.Window + notify_ft_complete: Gtk.Switch + transfers_scrolledwindow: Gtk.ScrolledWindow + transfers_list: Gtk.TreeView + transfers_list_atkobject: Atk.Object + cleanup_button: Gtk.ToolButton + pause_resume_button: Gtk.ToolButton + cancel_button: Gtk.ToolButton + file_transfers_window_atkobject: Atk.Object + + +class ExceptionDialogBuilder(Builder): + exception_dialog: Gtk.ApplicationWindow + close_btn: Gtk.Button + report_btn: Gtk.Button + exception_view: Gtk.TextView + + +class ManageSoundsBuilder(Builder): + liststore1: Gtk.ListStore + manage_sounds: Gtk.Box + sounds_treeview: Gtk.TreeView + filechooser: Gtk.FileChooserButton + + +class ServerInfoBuilder(Builder): + server_info_notebook: Gtk.Notebook + server: Gtk.Grid + server_hostname: Gtk.Label + server_software: Gtk.Label + server_uptime: Gtk.Label + no_addresses_label: Gtk.Label + connection_type: Gtk.Label + proxy_type: Gtk.Label + cert_button: Gtk.Button + proxy_host: Gtk.Label + domain_label: Gtk.Label + dns_label: Gtk.Label + ip_port_label: Gtk.Label + websocket_label: Gtk.Label + domain: Gtk.Label + dns: Gtk.Label + ip_port: Gtk.Label + websocket: Gtk.Label + features: Gtk.Box + features_scrolled: Gtk.ScrolledWindow + clipboard_button: Gtk.Button + + +class MainBuilder(Builder): + main_grid: Gtk.Grid + left_grid: Gtk.Grid + account_box: Gtk.Box + workspace_scrolled: Gtk.ScrolledWindow + app_box: Gtk.Box + + class GroupchatControlBuilder(Builder): drop_area: Gtk.Box formattings_menu: Gtk.Menu @@ -692,6 +450,8 @@ class GroupchatControlBuilder(Builder): banner_eventbox: Gtk.EventBox avatar_image: Gtk.Image banner_name_label: Gtk.Label + visitor_box: Gtk.Box + visitor_menu_button: Gtk.MenuButton account_badge_box: Gtk.Box toggle_roster_button: Gtk.Button toggle_roster_image: Gtk.Image @@ -749,64 +509,78 @@ class GroupchatControlBuilder(Builder): manage_save_button: Gtk.Button avatar_selector_grid: Gtk.Grid avatar_update_button: Gtk.Button + visitor_popover: Gtk.Popover -class StartChatDialogBuilder(Builder): - account_store: Gtk.ListStore - stack: Gtk.Stack - infobar: Gtk.InfoBar - box: Gtk.Box - search_entry: Gtk.SearchEntry - filter_bar_toggle: Gtk.ToggleButton - global_search_toggle: Gtk.ToggleButton - filter_bar_revealer: Gtk.Revealer - scrolledwindow: Gtk.ScrolledWindow - listbox: Gtk.ListBox - spinner: Gtk.Spinner - error_label: Gtk.Label - info_box: Gtk.Box - join_box: Gtk.Box - join_button: Gtk.Button - account_view: Gtk.TreeView - icon_pixbuf: Gtk.CellRendererPixbuf - account_text: Gtk.CellRendererText - placeholder: Gtk.Box +class HistoryManagerBuilder(Builder): + context_menu: Gtk.Menu + export_menuitem: Gtk.MenuItem + delete_menuitem: Gtk.MenuItem + history_manager_window: Gtk.Window + jids_scrolledwindow: Gtk.ScrolledWindow + jids_listview: Gtk.TreeView + treeview_selection1: Gtk.TreeSelection + welcome_box: Gtk.Box + logs_scrolledwindow: Gtk.ScrolledWindow + logs_listview: Gtk.TreeView + treeview_selection2: Gtk.TreeSelection + search_results_scrolledwindow: Gtk.ScrolledWindow + search_results_listview: Gtk.TreeView + treeview_selection3: Gtk.TreeSelection + search_entry: Gtk.Entry + search_db_button: Gtk.Button -class AdvancedConfigurationBuilder(Builder): +class XmlConsoleBuilder(Builder): + headerbar: Gtk.HeaderBar + search_toggle: Gtk.ToggleButton + popover: Gtk.Popover box: Gtk.Box + paned: Gtk.Paned + search_revealer: Gtk.Revealer search_entry: Gtk.SearchEntry - advanced_treeview: Gtk.TreeView - description: Gtk.Label - reset_button: Gtk.Button + search_forward: Gtk.ToolButton + search_backward: Gtk.ToolButton + scrolled: Gtk.ScrolledWindow + sourceview: GtkSource.View + scrolled_input: Gtk.ScrolledWindow + input_entry: Gtk.TextView + actionbar: Gtk.ActionBar + paste: Gtk.Button + menubutton: Gtk.MenuButton + send: Gtk.Button -class SystrayContextMenuBuilder(Builder): - accelgroup1: Gtk.AccelGroup - systray_context_menu: Gtk.Menu - status_menu: Gtk.MenuItem - start_chat_menuitem: Gtk.MenuItem - sounds_mute_menuitem: Gtk.CheckMenuItem - toggle_window_menuitem: Gtk.MenuItem - preferences_menuitem: Gtk.MenuItem - separator: Gtk.SeparatorMenuItem - quit_menuitem: Gtk.MenuItem +class SslErrorDialogBuilder(Builder): + ssl_error_box: Gtk.Box + intro_text: Gtk.Label + ssl_error: Gtk.Label + add_certificate_checkbutton: Gtk.CheckButton + view_cert_button: Gtk.Button + connect_button: Gtk.Button -class FileTransferJingleBuilder(Builder): - transfer_box: Gtk.Box - transfer_action: Gtk.Label - file_name: Gtk.Label - file_description: Gtk.Label - file_size: Gtk.Label - action_stack: Gtk.Stack - error_label: Gtk.Label - progress_label: Gtk.Label - progress_bar: Gtk.ProgressBar +class ShortcutsWindowBuilder(Builder): + shortcuts_window: Gtk.ShortcutsWindow -class GroupchatStateBuilder(Builder): - groupchat_state: Gtk.Stack +class AddContactBuilder(Builder): + account_liststore: Gtk.ListStore + address_box: Gtk.Box + account_box: Gtk.Box + account_combo: Gtk.ComboBox + cellrenderertext3: Gtk.CellRendererText + address_entry: Gtk.Entry + contact_grid: Gtk.Grid + status_switch: Gtk.Switch + group_combo: Gtk.ComboBoxText + message_entry: Gtk.Entry + contact_info_button: Gtk.Button + gateway_box: Gtk.Box + gateway_image: Gtk.Image + gateway_label: Gtk.Label + register_button: Gtk.Button + commands_button: Gtk.Button class RosterTooltipBuilder(Builder): @@ -823,12 +597,47 @@ class RosterTooltipBuilder(Builder): resources_box: Gtk.Box -class SynchronizeAccountsBuilder(Builder): - stack: Gtk.Stack - sync_accounts_box: Gtk.Box - accounts_treeview: Gtk.TreeView - sync_contacts_box: Gtk.Box - contacts_treeview: Gtk.TreeView +class ChatControlBuilder(Builder): + drop_area: Gtk.Box + formattings_menu: Gtk.Menu + bold: Gtk.MenuItem + italic: Gtk.MenuItem + strike: Gtk.MenuItem + chat_control_hbox: Gtk.Box + overlay: Gtk.Overlay + paned1: Gtk.Paned + textview_box: Gtk.Box + banner_eventbox: Gtk.EventBox + avatar_eventbox: Gtk.EventBox + avatar_image: Gtk.Image + banner_name_label: Gtk.Label + banner_label: Gtk.Label + phone_image: Gtk.Image + account_badge_box: Gtk.Box + hbox2: Gtk.Box + tune_image: Gtk.Image + location_eventbox: Gtk.EventBox + location_image: Gtk.Image + conv_view_overlay: Gtk.Overlay + hbox: Gtk.Box + emoticons_button: Gtk.MenuButton + formattings_button: Gtk.MenuButton + label_selector: Gtk.ComboBox + settings_menu: Gtk.MenuButton + authentication_button: Gtk.Button + lock_image: Gtk.Image + encryption_menu: Gtk.MenuButton + sendfile_button: Gtk.Button + send_message_button: Gtk.Button + + +class RosterBuilder(Builder): + contact_store: Gtk.TreeStore + roster_treeview: Gtk.TreeView + contact_column: Gtk.TreeViewColumn + avatar_renderer: Gtk.CellRendererPixbuf + text_renderer: Gtk.CellRendererText + expander: Gtk.TreeViewColumn class AccountWizardBuilder(Builder): @@ -868,90 +677,267 @@ class AccountWizardBuilder(Builder): sign_up_advanced_checkbutton: Gtk.CheckButton -class ServerInfoBuilder(Builder): - server_info_notebook: Gtk.Notebook - server: Gtk.Grid - server_hostname: Gtk.Label - server_software: Gtk.Label - server_uptime: Gtk.Label - no_addresses_label: Gtk.Label - connection_type: Gtk.Label - proxy_type: Gtk.Label - cert_button: Gtk.Button - proxy_host: Gtk.Label - domain_label: Gtk.Label - dns_label: Gtk.Label - ip_port_label: Gtk.Label - websocket_label: Gtk.Label - domain: Gtk.Label - dns: Gtk.Label - ip_port: Gtk.Label - websocket: Gtk.Label - features: Gtk.Box - features_scrolled: Gtk.ScrolledWindow - clipboard_button: Gtk.Button +class AdvancedConfigurationBuilder(Builder): + box: Gtk.Box + search_entry: Gtk.SearchEntry + advanced_treeview: Gtk.TreeView + description: Gtk.Label + reset_button: Gtk.Button -class PreferencesBuilder(Builder): +class ManageProxiesBuilder(Builder): + liststore1: Gtk.ListStore + box: Gtk.Box + proxies_treeview: Gtk.TreeView + treeview_selection1: Gtk.TreeSelection + add_proxy_button: Gtk.ToolButton + remove_proxy_button: Gtk.ToolButton + settings_grid: Gtk.Grid + proxypass_entry: Gtk.Entry + proxyuser_entry: Gtk.Entry + useauth_checkbutton: Gtk.CheckButton + proxyport_entry: Gtk.Entry + proxyhost_entry: Gtk.Entry + proxytype_combobox: Gtk.ComboBox + proxyname_entry: Gtk.Entry + + +class PasswordDialogBuilder(Builder): + pass_box: Gtk.Box + header: Gtk.Label + message_label: Gtk.Label + pass_entry: Gtk.Entry + save_pass_checkbutton: Gtk.CheckButton + cancel_button: Gtk.Button + ok_button: Gtk.Button + keyring_hint: Gtk.Label + + +class VideoPreviewBuilder(Builder): + video_preview_box: Gtk.Box + video_source_label: Gtk.Label + video_preview_placeholder: Gtk.Box + + +class RosterItemExchangeBuilder(Builder): + textbuffer1: Gtk.TextBuffer + roster_item_exchange: Gtk.Box + type_label: Gtk.Label + body_scrolledwindow: Gtk.ScrolledWindow + body_textview: Gtk.TextView + items_list_treeview: Gtk.TreeView + treeview_selection1: Gtk.TreeSelection + cancel_button: Gtk.Button + accept_button: Gtk.Button + + +class ContactInfoBuilder(Builder): + devices_grid: Gtk.Grid + priority_label: Gtk.Label + software_label: Gtk.Label + system_label: Gtk.Label + time_label: Gtk.Label + status_value: Gtk.Label + priority_value: Gtk.Label + software_value: Gtk.Label + system_value: Gtk.Label + time_value: Gtk.Label + resource_box: Gtk.Box + resource_label: Gtk.Label + groups_model: Gtk.ListStore + main_grid: Gtk.Grid + header_revealer: Gtk.Revealer + header_image: Gtk.Image + name_entry: Gtk.Entry + edit_name_button: Gtk.ToggleButton + main_stack: Gtk.Stack + vcard_scrolled: Gtk.ScrolledWindow + vcard_box: Gtk.Box + avatar_image: Gtk.Image + contact_name_label: Gtk.Label + contact_jid_label: Gtk.Label + group_chat_grid: Gtk.Grid + role_label: Gtk.Label + affiliation_label: Gtk.Label + settings_box: Gtk.Box + subscription_listbox: Gtk.ListBox + from_subscription_switch: Gtk.Switch + to_subscription_stack: Gtk.Stack + request_stack: Gtk.Stack + to_subscription_button: Gtk.Button + groups_page_box: Gtk.Box + groups_treeview: Gtk.TreeView + tree_selection: Gtk.TreeSelection + toggle_renderer: Gtk.CellRendererToggle + text_renderer: Gtk.CellRendererText + group_add_button: Gtk.ToolButton + group_remove_button: Gtk.ToolButton + notes_page_box: Gtk.Box + scrolledwindow_annotation: Gtk.ScrolledWindow + textview_annotation: Gtk.TextView + devices_stack: Gtk.Stack + devices_box: Gtk.Box + + +class ApplicationMenuBuilder(Builder): + pass + + +class PopupNotificationWindowBuilder(Builder): + eventbox: Gtk.EventBox + color_bar: Gtk.Box + image: Gtk.Image + event_type_label: Gtk.Label + close_button: Gtk.Button + event_description_label: Gtk.Label + + +class SynchronizeAccountsBuilder(Builder): + stack: Gtk.Stack + sync_accounts_box: Gtk.Box + accounts_treeview: Gtk.TreeView + sync_contacts_box: Gtk.Box + contacts_treeview: Gtk.TreeView + + +class SearchViewBuilder(Builder): + header_box: Gtk.Box + header_name_label: Gtk.Label + header_date_label: Gtk.Label + result_row_grid: Gtk.Grid + row_avatar: Gtk.Image + row_time_label: Gtk.Label + row_name_label: Gtk.Label + search_box: Gtk.Box + search_entry: Gtk.SearchEntry + search_checkbutton: Gtk.CheckButton + date_hint: Gtk.Label + results_listbox: Gtk.ListBox + placeholder: Gtk.Box + + +class GroupsPostWindowBuilder(Builder): + textbuffer1: Gtk.TextBuffer + groups_post_window: Gtk.Window + from_entry: Gtk.Entry + subject_entry: Gtk.Entry + contents_textview: Gtk.TextView + send_button: Gtk.Button + + +class AdhocMucBuilder(Builder): + guests_store: Gtk.ListStore + server_store: Gtk.ListStore + adhoc_box: Gtk.Box + description_label: Gtk.Label + guests_treeview: Gtk.TreeView + server_combobox: Gtk.ComboBox + server_entry: Gtk.Entry + invite_button: Gtk.Button + + +class PreviewBuilder(Builder): + preview_box: Gtk.Box + icon_event_box: Gtk.EventBox + icon_button: Gtk.Button + right_box: Gtk.Box + image_event_box: Gtk.EventBox + image_button: Gtk.Button + progressbar: Gtk.ProgressBar + button_box: Gtk.Box + download_button: Gtk.Button + save_as_button: Gtk.Button + open_folder_button: Gtk.Button + file_name: Gtk.Label + file_size: Gtk.Label + + +class GroupchatInfoScrolledBuilder(Builder): + info_grid: Gtk.Grid + address_label: Gtk.Label + description_label: Gtk.Label + subject_label: Gtk.Label + author_label: Gtk.Label + description: Gtk.Label + author: Gtk.Label + users: Gtk.Label + contact_label: Gtk.Label + logs_label: Gtk.Label + lang: Gtk.Label + logs: Gtk.LinkButton + users_image: Gtk.Image + lang_image: Gtk.Image + contact_box: Gtk.Box + subject: Gtk.Label + name: Gtk.Label + avatar_image: Gtk.Image + address: Gtk.Label + + +class GroupchatStateBuilder(Builder): + groupchat_state: Gtk.Stack + + +class BlockingListBuilder(Builder): + blocking_store: Gtk.ListStore + blocking_grid: Gtk.Grid + overlay: Gtk.Overlay + block_view: Gtk.TreeView + add_button: Gtk.ToolButton + remove_button: Gtk.ToolButton + save_button: Gtk.Button + + +class GroupchatConfigBuilder(Builder): + affiliation_store: Gtk.ListStore + combo_store: Gtk.ListStore + info_popover: Gtk.Popover + outcast_store: Gtk.ListStore grid: Gtk.Grid + treeview_buttonbox: Gtk.Box + info_button: Gtk.MenuButton + add_button: Gtk.Button + remove_button: Gtk.Button + ok_button: Gtk.Button stack: Gtk.Stack - window_behaviour: Gtk.Grid - chats: Gtk.Grid - group_chats: Gtk.Grid - file_preview: Gtk.Grid - visual_notifications: Gtk.Grid - sounds: Gtk.Grid - status_message: Gtk.Grid - automatic_status: Gtk.Grid - themes: Gtk.Grid - emoji: Gtk.Grid - audio_video_info_bar: Gtk.InfoBar - button1: Gtk.Button - server: Gtk.Grid - audio: Gtk.Grid - video: Gtk.Grid - miscellaneous: Gtk.Grid - reset_button: Gtk.Button - advanced: Gtk.Grid - ace_button: Gtk.Button + config_grid: Gtk.Grid + affiliation_treeview: Gtk.TreeView + reserved_name_column: Gtk.TreeViewColumn + role_column: Gtk.TreeViewColumn + outcast_treeview: Gtk.TreeView -class ManageSoundsBuilder(Builder): - liststore1: Gtk.ListStore - manage_sounds: Gtk.Box - sounds_treeview: Gtk.TreeView - filechooser: Gtk.FileChooserButton +class PreviewContextMenuBuilder(Builder): + context_menu: Gtk.Menu + download: Gtk.MenuItem + open: Gtk.MenuItem + save_as: Gtk.MenuItem + open_folder: Gtk.MenuItem + encryption_separator: Gtk.SeparatorMenuItem + copy_link_location: Gtk.MenuItem + open_link_in_browser: Gtk.MenuItem -class ManageProxiesBuilder(Builder): - liststore1: Gtk.ListStore +class SingleMessageWindowBuilder(Builder): box: Gtk.Box - proxies_treeview: Gtk.TreeView - treeview_selection1: Gtk.TreeSelection - add_proxy_button: Gtk.ToolButton - remove_proxy_button: Gtk.ToolButton - settings_grid: Gtk.Grid - proxypass_entry: Gtk.Entry - proxyuser_entry: Gtk.Entry - useauth_checkbutton: Gtk.CheckButton - proxyport_entry: Gtk.Entry - proxyhost_entry: Gtk.Entry - proxytype_combobox: Gtk.ComboBox - proxyname_entry: Gtk.Entry - - -class ApplicationMenuBuilder(Builder): - pass + message_grid: Gtk.Grid + recipients_entry: Gtk.Entry + subject_entry: Gtk.Entry + message_scrolledwindow: Gtk.ScrolledWindow + message_textview: Gtk.TextView + count_chars_label: Gtk.Label + send_button: Gtk.Button -class GroupchatRosterTooltipBuilder(Builder): - tooltip_grid: Gtk.Grid - avatar: Gtk.Image - jid: Gtk.Label - nick: Gtk.Label - fillelement: Gtk.Label - status: Gtk.Label - affiliation: Gtk.Label +class GroupchatRosterBuilder(Builder): + participant_store: Gtk.TreeStore + roster_treeview: Gtk.TreeView + contact_column: Gtk.TreeViewColumn + avatar_renderer: Gtk.CellRendererPixbuf + text_renderer: Gtk.CellRendererText + event_column: Gtk.TreeViewColumn + icon: Gtk.CellRendererPixbuf + expander: Gtk.TreeViewColumn class FileTransferBuilder(Builder): @@ -963,148 +949,165 @@ class FileTransferBuilder(Builder): transfer_progress: Gtk.Label -class BookmarksBuilder(Builder): - bookmarks_store: Gtk.ListStore - bookmarks_grid: Gtk.Grid - bookmarks_view: Gtk.TreeView - jid: Gtk.CellRendererText - name: Gtk.CellRendererText - nick: Gtk.CellRendererText - password: Gtk.CellRendererText - autojoin: Gtk.CellRendererToggle +class StartChatDialogBuilder(Builder): + account_store: Gtk.ListStore + stack: Gtk.Stack + infobar: Gtk.InfoBar + box: Gtk.Box + search_entry: Gtk.SearchEntry + filter_bar_toggle: Gtk.ToggleButton + global_search_toggle: Gtk.ToggleButton + filter_bar_revealer: Gtk.Revealer + scrolledwindow: Gtk.ScrolledWindow + listbox: Gtk.ListBox + spinner: Gtk.Spinner + error_label: Gtk.Label + info_box: Gtk.Box + join_box: Gtk.Box + join_button: Gtk.Button + account_view: Gtk.TreeView + icon_pixbuf: Gtk.CellRendererPixbuf + account_text: Gtk.CellRendererText + placeholder: Gtk.Box -class SslErrorDialogBuilder(Builder): - ssl_error_box: Gtk.Box - intro_text: Gtk.Label - ssl_error: Gtk.Label - add_certificate_checkbutton: Gtk.CheckButton - view_cert_button: Gtk.Button - connect_button: Gtk.Button +class ChatPanedBuilder(Builder): + paned: Gtk.Paned + middle_grid: Gtk.Grid + header_bar: Gtk.Grid + workspace_label: Gtk.Label + filter_bar_toggle: Gtk.ToggleButton + search_entry: Gtk.SearchEntry + start_chat_button: Gtk.Button + filter_bar_revealer: Gtk.Revealer + filter_bar: Gtk.Box + chat_list_scrolled: Gtk.ScrolledWindow + right_grid: Gtk.Grid + right_grid_overlay: Gtk.Overlay @overload -def get_builder(file_name: Literal['certificate_dialog.ui'], widgets: list[str] = ...) -> CertificateDialogBuilder: ... +def get_builder(file_name: Literal['call_widget.ui'], widgets: list[str] = ...) -> CallWidgetBuilder: ... @overload -def get_builder(file_name: Literal['zeroconf_information_window.ui'], widgets: list[str] = ...) -> ZeroconfInformationWindowBuilder: ... +def get_builder(file_name: Literal['service_discovery_window.ui'], widgets: list[str] = ...) -> ServiceDiscoveryWindowBuilder: ... @overload def get_builder(file_name: Literal['chat_list_row.ui'], widgets: list[str] = ...) -> ChatListRowBuilder: ... @overload -def get_builder(file_name: Literal['single_message_window.ui'], widgets: list[str] = ...) -> SingleMessageWindowBuilder: ... +def get_builder(file_name: Literal['workspace_dialog.ui'], widgets: list[str] = ...) -> WorkspaceDialogBuilder: ... @overload -def get_builder(file_name: Literal['search_view.ui'], widgets: list[str] = ...) -> SearchViewBuilder: ... +def get_builder(file_name: Literal['profile.ui'], widgets: list[str] = ...) -> ProfileBuilder: ... @overload -def get_builder(file_name: Literal['assistant.ui'], widgets: list[str] = ...) -> AssistantBuilder: ... +def get_builder(file_name: Literal['bookmarks.ui'], widgets: list[str] = ...) -> BookmarksBuilder: ... @overload -def get_builder(file_name: Literal['blocking_list.ui'], widgets: list[str] = ...) -> BlockingListBuilder: ... +def get_builder(file_name: Literal['zeroconf_information_window.ui'], widgets: list[str] = ...) -> ZeroconfInformationWindowBuilder: ... @overload -def get_builder(file_name: Literal['account_page.ui'], widgets: list[str] = ...) -> AccountPageBuilder: ... +def get_builder(file_name: Literal['emoji_chooser.ui'], widgets: list[str] = ...) -> EmojiChooserBuilder: ... @overload -def get_builder(file_name: Literal['groupchat_nick_chooser.ui'], widgets: list[str] = ...) -> GroupchatNickChooserBuilder: ... +def get_builder(file_name: Literal['manage_pep_services_window.ui'], widgets: list[str] = ...) -> ManagePepServicesWindowBuilder: ... @overload -def get_builder(file_name: Literal['groups_post_window.ui'], widgets: list[str] = ...) -> GroupsPostWindowBuilder: ... +def get_builder(file_name: Literal['themes_window.ui'], widgets: list[str] = ...) -> ThemesWindowBuilder: ... @overload -def get_builder(file_name: Literal['mam_preferences.ui'], widgets: list[str] = ...) -> MamPreferencesBuilder: ... +def get_builder(file_name: Literal['file_transfer_send.ui'], widgets: list[str] = ...) -> FileTransferSendBuilder: ... @overload -def get_builder(file_name: Literal['emoji_chooser.ui'], widgets: list[str] = ...) -> EmojiChooserBuilder: ... +def get_builder(file_name: Literal['file_transfer_jingle.ui'], widgets: list[str] = ...) -> FileTransferJingleBuilder: ... @overload -def get_builder(file_name: Literal['adhoc_muc.ui'], widgets: list[str] = ...) -> AdhocMucBuilder: ... +def get_builder(file_name: Literal['groupchat_nick_chooser.ui'], widgets: list[str] = ...) -> GroupchatNickChooserBuilder: ... @overload -def get_builder(file_name: Literal['manage_pep_services_window.ui'], widgets: list[str] = ...) -> ManagePepServicesWindowBuilder: ... +def get_builder(file_name: Literal['certificate_dialog.ui'], widgets: list[str] = ...) -> CertificateDialogBuilder: ... @overload -def get_builder(file_name: Literal['groupchat_roster.ui'], widgets: list[str] = ...) -> GroupchatRosterBuilder: ... +def get_builder(file_name: Literal['preferences.ui'], widgets: list[str] = ...) -> PreferencesBuilder: ... @overload -def get_builder(file_name: Literal['service_discovery_window.ui'], widgets: list[str] = ...) -> ServiceDiscoveryWindowBuilder: ... +def get_builder(file_name: Literal['groupchat_creation.ui'], widgets: list[str] = ...) -> GroupchatCreationBuilder: ... @overload -def get_builder(file_name: Literal['main.ui'], widgets: list[str] = ...) -> MainBuilder: ... +def get_builder(file_name: Literal['app_page.ui'], widgets: list[str] = ...) -> AppPageBuilder: ... @overload -def get_builder(file_name: Literal['preview_context_menu.ui'], widgets: list[str] = ...) -> PreviewContextMenuBuilder: ... +def get_builder(file_name: Literal['systray_context_menu.ui'], widgets: list[str] = ...) -> SystrayContextMenuBuilder: ... @overload -def get_builder(file_name: Literal['video_preview.ui'], widgets: list[str] = ...) -> VideoPreviewBuilder: ... +def get_builder(file_name: Literal['account_page.ui'], widgets: list[str] = ...) -> AccountPageBuilder: ... @overload -def get_builder(file_name: Literal['profile.ui'], widgets: list[str] = ...) -> ProfileBuilder: ... +def get_builder(file_name: Literal['plugins_window.ui'], widgets: list[str] = ...) -> PluginsWindowBuilder: ... @overload -def get_builder(file_name: Literal['call_widget.ui'], widgets: list[str] = ...) -> CallWidgetBuilder: ... +def get_builder(file_name: Literal['groupchat_roster_tooltip.ui'], widgets: list[str] = ...) -> GroupchatRosterTooltipBuilder: ... @overload -def get_builder(file_name: Literal['workspace_dialog.ui'], widgets: list[str] = ...) -> WorkspaceDialogBuilder: ... +def get_builder(file_name: Literal['assistant.ui'], widgets: list[str] = ...) -> AssistantBuilder: ... @overload -def get_builder(file_name: Literal['filetransfers.ui'], widgets: list[str] = ...) -> FiletransfersBuilder: ... +def get_builder(file_name: Literal['groupchat_inviter.ui'], widgets: list[str] = ...) -> GroupchatInviterBuilder: ... @overload -def get_builder(file_name: Literal['preview.ui'], widgets: list[str] = ...) -> PreviewBuilder: ... +def get_builder(file_name: Literal['mam_preferences.ui'], widgets: list[str] = ...) -> MamPreferencesBuilder: ... @overload -def get_builder(file_name: Literal['exception_dialog.ui'], widgets: list[str] = ...) -> ExceptionDialogBuilder: ... +def get_builder(file_name: Literal['filetransfers.ui'], widgets: list[str] = ...) -> FiletransfersBuilder: ... @overload -def get_builder(file_name: Literal['groupchat_creation.ui'], widgets: list[str] = ...) -> GroupchatCreationBuilder: ... +def get_builder(file_name: Literal['exception_dialog.ui'], widgets: list[str] = ...) -> ExceptionDialogBuilder: ... @overload -def get_builder(file_name: Literal['plugins_window.ui'], widgets: list[str] = ...) -> PluginsWindowBuilder: ... +def get_builder(file_name: Literal['manage_sounds.ui'], widgets: list[str] = ...) -> ManageSoundsBuilder: ... @overload -def get_builder(file_name: Literal['password_dialog.ui'], widgets: list[str] = ...) -> PasswordDialogBuilder: ... +def get_builder(file_name: Literal['server_info.ui'], widgets: list[str] = ...) -> ServerInfoBuilder: ... @overload -def get_builder(file_name: Literal['themes_window.ui'], widgets: list[str] = ...) -> ThemesWindowBuilder: ... +def get_builder(file_name: Literal['main.ui'], widgets: list[str] = ...) -> MainBuilder: ... @overload -def get_builder(file_name: Literal['add_contact.ui'], widgets: list[str] = ...) -> AddContactBuilder: ... +def get_builder(file_name: Literal['groupchat_control.ui'], widgets: list[str] = ...) -> GroupchatControlBuilder: ... @overload -def get_builder(file_name: Literal['roster.ui'], widgets: list[str] = ...) -> RosterBuilder: ... +def get_builder(file_name: Literal['history_manager.ui'], widgets: list[str] = ...) -> HistoryManagerBuilder: ... @overload -def get_builder(file_name: Literal['groupchat_config.ui'], widgets: list[str] = ...) -> GroupchatConfigBuilder: ... +def get_builder(file_name: Literal['xml_console.ui'], widgets: list[str] = ...) -> XmlConsoleBuilder: ... @overload -def get_builder(file_name: Literal['app_page.ui'], widgets: list[str] = ...) -> AppPageBuilder: ... +def get_builder(file_name: Literal['ssl_error_dialog.ui'], widgets: list[str] = ...) -> SslErrorDialogBuilder: ... @overload def get_builder(file_name: Literal['shortcuts_window.ui'], widgets: list[str] = ...) -> ShortcutsWindowBuilder: ... @overload -def get_builder(file_name: Literal['xml_console.ui'], widgets: list[str] = ...) -> XmlConsoleBuilder: ... +def get_builder(file_name: Literal['add_contact.ui'], widgets: list[str] = ...) -> AddContactBuilder: ... @overload -def get_builder(file_name: Literal['chat_control.ui'], widgets: list[str] = ...) -> ChatControlBuilder: ... +def get_builder(file_name: Literal['roster_tooltip.ui'], widgets: list[str] = ...) -> RosterTooltipBuilder: ... @overload -def get_builder(file_name: Literal['file_transfer_send.ui'], widgets: list[str] = ...) -> FileTransferSendBuilder: ... +def get_builder(file_name: Literal['chat_control.ui'], widgets: list[str] = ...) -> ChatControlBuilder: ... @overload -def get_builder(file_name: Literal['roster_item_exchange.ui'], widgets: list[str] = ...) -> RosterItemExchangeBuilder: ... +def get_builder(file_name: Literal['roster.ui'], widgets: list[str] = ...) -> RosterBuilder: ... @overload -def get_builder(file_name: Literal['popup_notification_window.ui'], widgets: list[str] = ...) -> PopupNotificationWindowBuilder: ... +def get_builder(file_name: Literal['account_wizard.ui'], widgets: list[str] = ...) -> AccountWizardBuilder: ... @overload -def get_builder(file_name: Literal['history_manager.ui'], widgets: list[str] = ...) -> HistoryManagerBuilder: ... +def get_builder(file_name: Literal['advanced_configuration.ui'], widgets: list[str] = ...) -> AdvancedConfigurationBuilder: ... @overload -def get_builder(file_name: Literal['chat_paned.ui'], widgets: list[str] = ...) -> ChatPanedBuilder: ... +def get_builder(file_name: Literal['manage_proxies.ui'], widgets: list[str] = ...) -> ManageProxiesBuilder: ... @overload -def get_builder(file_name: Literal['contact_info.ui'], widgets: list[str] = ...) -> ContactInfoBuilder: ... +def get_builder(file_name: Literal['password_dialog.ui'], widgets: list[str] = ...) -> PasswordDialogBuilder: ... @overload -def get_builder(file_name: Literal['groupchat_info_scrolled.ui'], widgets: list[str] = ...) -> GroupchatInfoScrolledBuilder: ... +def get_builder(file_name: Literal['video_preview.ui'], widgets: list[str] = ...) -> VideoPreviewBuilder: ... @overload -def get_builder(file_name: Literal['groupchat_inviter.ui'], widgets: list[str] = ...) -> GroupchatInviterBuilder: ... +def get_builder(file_name: Literal['roster_item_exchange.ui'], widgets: list[str] = ...) -> RosterItemExchangeBuilder: ... @overload -def get_builder(file_name: Literal['groupchat_control.ui'], widgets: list[str] = ...) -> GroupchatControlBuilder: ... +def get_builder(file_name: Literal['contact_info.ui'], widgets: list[str] = ...) -> ContactInfoBuilder: ... @overload -def get_builder(file_name: Literal['start_chat_dialog.ui'], widgets: list[str] = ...) -> StartChatDialogBuilder: ... +def get_builder(file_name: Literal['application_menu.ui'], widgets: list[str] = ...) -> ApplicationMenuBuilder: ... @overload -def get_builder(file_name: Literal['advanced_configuration.ui'], widgets: list[str] = ...) -> AdvancedConfigurationBuilder: ... +def get_builder(file_name: Literal['popup_notification_window.ui'], widgets: list[str] = ...) -> PopupNotificationWindowBuilder: ... @overload -def get_builder(file_name: Literal['systray_context_menu.ui'], widgets: list[str] = ...) -> SystrayContextMenuBuilder: ... +def get_builder(file_name: Literal['synchronize_accounts.ui'], widgets: list[str] = ...) -> SynchronizeAccountsBuilder: ... @overload -def get_builder(file_name: Literal['file_transfer_jingle.ui'], widgets: list[str] = ...) -> FileTransferJingleBuilder: ... +def get_builder(file_name: Literal['search_view.ui'], widgets: list[str] = ...) -> SearchViewBuilder: ... @overload -def get_builder(file_name: Literal['groupchat_state.ui'], widgets: list[str] = ...) -> GroupchatStateBuilder: ... +def get_builder(file_name: Literal['groups_post_window.ui'], widgets: list[str] = ...) -> GroupsPostWindowBuilder: ... @overload -def get_builder(file_name: Literal['roster_tooltip.ui'], widgets: list[str] = ...) -> RosterTooltipBuilder: ... +def get_builder(file_name: Literal['adhoc_muc.ui'], widgets: list[str] = ...) -> AdhocMucBuilder: ... @overload -def get_builder(file_name: Literal['synchronize_accounts.ui'], widgets: list[str] = ...) -> SynchronizeAccountsBuilder: ... +def get_builder(file_name: Literal['preview.ui'], widgets: list[str] = ...) -> PreviewBuilder: ... @overload -def get_builder(file_name: Literal['account_wizard.ui'], widgets: list[str] = ...) -> AccountWizardBuilder: ... +def get_builder(file_name: Literal['groupchat_info_scrolled.ui'], widgets: list[str] = ...) -> GroupchatInfoScrolledBuilder: ... @overload -def get_builder(file_name: Literal['server_info.ui'], widgets: list[str] = ...) -> ServerInfoBuilder: ... +def get_builder(file_name: Literal['groupchat_state.ui'], widgets: list[str] = ...) -> GroupchatStateBuilder: ... @overload -def get_builder(file_name: Literal['preferences.ui'], widgets: list[str] = ...) -> PreferencesBuilder: ... +def get_builder(file_name: Literal['blocking_list.ui'], widgets: list[str] = ...) -> BlockingListBuilder: ... @overload -def get_builder(file_name: Literal['manage_sounds.ui'], widgets: list[str] = ...) -> ManageSoundsBuilder: ... +def get_builder(file_name: Literal['groupchat_config.ui'], widgets: list[str] = ...) -> GroupchatConfigBuilder: ... @overload -def get_builder(file_name: Literal['manage_proxies.ui'], widgets: list[str] = ...) -> ManageProxiesBuilder: ... +def get_builder(file_name: Literal['preview_context_menu.ui'], widgets: list[str] = ...) -> PreviewContextMenuBuilder: ... @overload -def get_builder(file_name: Literal['application_menu.ui'], widgets: list[str] = ...) -> ApplicationMenuBuilder: ... +def get_builder(file_name: Literal['single_message_window.ui'], widgets: list[str] = ...) -> SingleMessageWindowBuilder: ... @overload -def get_builder(file_name: Literal['groupchat_roster_tooltip.ui'], widgets: list[str] = ...) -> GroupchatRosterTooltipBuilder: ... +def get_builder(file_name: Literal['groupchat_roster.ui'], widgets: list[str] = ...) -> GroupchatRosterBuilder: ... @overload def get_builder(file_name: Literal['file_transfer.ui'], widgets: list[str] = ...) -> FileTransferBuilder: ... @overload -def get_builder(file_name: Literal['bookmarks.ui'], widgets: list[str] = ...) -> BookmarksBuilder: ... +def get_builder(file_name: Literal['start_chat_dialog.ui'], widgets: list[str] = ...) -> StartChatDialogBuilder: ... @overload -def get_builder(file_name: Literal['ssl_error_dialog.ui'], widgets: list[str] = ...) -> SslErrorDialogBuilder: ... +def get_builder(file_name: Literal['chat_paned.ui'], widgets: list[str] = ...) -> ChatPanedBuilder: ... def get_builder(file_name: str, widgets: list[str] = ...) -> Builder: ... View it on GitLab:
https://dev.gajim.org/gajim/gajim/-/commit/4e985f7dfb7bab10ff029f1123baf131…
-- View it on GitLab:
https://dev.gajim.org/gajim/gajim/-/commit/4e985f7dfb7bab10ff029f1123baf131…
You're receiving this email because of your account on
dev.gajim.org
.
1
0
0
0
[Git][gajim/gajim][master] Typing: Rename ControlType to avoid confusion
by Daniel Brötzmann (@wurstsalat)
15 Jan '22
15 Jan '22
Daniel Brötzmann pushed to branch master at gajim / gajim Commits: 7679ecea by wurstsalat at 2022-01-15T13:07:19+01:00 Typing: Rename ControlType to avoid confusion - - - - - 6 changed files: - gajim/gtk/chat_page.py - gajim/gtk/chat_stack.py - gajim/gtk/groupchat_roster.py - gajim/gtk/main.py - gajim/gtk/types.py - gajim/gui_interface.py Changes: ===================================== gajim/gtk/chat_page.py ===================================== @@ -37,7 +37,7 @@ from .chat_list_stack import ChatListStack from .chat_stack import ChatStack from .search_view import SearchView -from .types import ControlType +from .types import ControlT from .const import UNLOAD_CHAT_TIME @@ -96,7 +96,7 @@ def __init__(self): self._ui.paned.set_position(app.settings.get('chat_handle_position')) self._ui.paned.connect('button-release-event', self._on_button_release) - self._last_control: Optional[ControlType] = None + self._last_control: Optional[ControlT] = None self._startup_finished: bool = False self._add_actions() @@ -334,10 +334,10 @@ def remove_chats_for_account(self, account: str) -> None: self._chat_list_stack.remove_chats_for_account(account) self._chat_stack.remove_chats_for_account(account) - def get_control(self, account: str, jid: JID) -> Optional[ControlType]: + def get_control(self, account: str, jid: JID) -> Optional[ControlT]: return self._chat_stack.get_control(account, jid) - def get_active_control(self) -> Optional[ControlType]: + def get_active_control(self) -> Optional[ControlT]: chat = self._chat_list_stack.get_selected_chat() if chat is None: return None @@ -347,7 +347,7 @@ def is_chat_loaded(self, account: str, jid: JID) -> bool: return self._chat_stack.is_chat_loaded(account, jid) def get_controls(self, account: Optional[str] - ) -> Generator[ControlType, None, None]: + ) -> Generator[ControlT, None, None]: return self._chat_stack.get_controls(account) def hide_search(self) -> bool: ===================================== gajim/gtk/chat_stack.py ===================================== @@ -32,7 +32,7 @@ from .controls.groupchat import GroupchatControl from .controls.private import PrivateChatControl -from .types import ControlType +from .types import ControlT from .util import EventHelper log = logging.getLogger('gajim.gui.chatstack') @@ -54,16 +54,16 @@ def __init__(self): ]) self.show_all() - self._controls: dict[tuple[str, JID], ControlType] = {} + self._controls: dict[tuple[str, JID], ControlT] = {} - def get_control(self, account: str, jid: JID) -> Optional[ControlType]: + def get_control(self, account: str, jid: JID) -> Optional[ControlT]: try: return self._controls[(account, jid)] except KeyError: return None def get_controls(self, account: Optional[str] - ) -> Generator[ControlType, None, None]: + ) -> Generator[ControlT, None, None]: if account is None: for control in self._controls.values(): yield control ===================================== 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 GroupchatControlType +from .types import GroupchatControlT from .util import EventHelper @@ -75,7 +75,7 @@ class GroupchatRoster(Gtk.ScrolledWindow, EventHelper): def __init__(self, account: str, room_jid: str, - control: GroupchatControlType + control: GroupchatControlT ) -> None: Gtk.ScrolledWindow.__init__(self) EventHelper.__init__(self) ===================================== gajim/gtk/main.py ===================================== @@ -51,7 +51,7 @@ from .dialogs import DialogButton from .dialogs import ConfirmationDialog from .dialogs import ConfirmationCheckDialog -from .types import ControlType +from .types import ControlT from .builder import get_builder from .util import get_key_theme from .util import resize_window @@ -533,14 +533,14 @@ def add_app_message(self, category: str, message: Optional[str] = None) -> None: self._app_page.add_app_message(category, message) - def get_control(self, account: str, jid: JID) -> Optional[ControlType]: + 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[ControlType, None, None]: + ) -> Generator[ControlT, None, None]: return self._chat_page.get_controls(account) - def get_active_control(self) -> Optional[ControlType]: + def get_active_control(self) -> Optional[ControlT]: return self._chat_page.get_active_control() def is_chat_loaded(self, account: str, jid: JID) -> bool: ===================================== gajim/gtk/types.py ===================================== @@ -39,13 +39,13 @@ -ControlType = Union [ +ControlT = Union [ 'BaseControl', 'ChatControl', 'PrivateChatControl', 'GroupchatControl' ] -GroupchatControlType = Union['GroupchatControl'] +GroupchatControlT = Union['GroupchatControl'] ConversationViewT = Union['ConversationView'] ===================================== gajim/gui_interface.py ===================================== @@ -104,7 +104,7 @@ from gajim.gui.util import get_app_windows from gajim.gui.util import get_color_for_account from gajim.gui.util import open_window -from gajim.gui.types import ControlType +from gajim.gui.types import ControlT log = logging.getLogger('gajim.interface') @@ -550,7 +550,7 @@ def __compare_hashes(account: str, file_props: FileProp) -> None: session.end_session() def send_httpupload(self, - chat_control: ControlType, + chat_control: ControlT, path: Optional[str] = None ) -> None: if path is not None: @@ -563,13 +563,13 @@ def send_httpupload(self, transient_for=app.window) def _on_file_dialog_ok(self, - chat_control: ControlType, + chat_control: ControlT, paths: list[str] ) -> None: for path in paths: self._send_httpupload(chat_control, path) - def _send_httpupload(self, chat_control: ControlType, path: str) -> None: + def _send_httpupload(self, chat_control: ControlT, path: str) -> None: client = app.get_client(chat_control.account) try: transfer = client.get_module('HTTPUpload').make_transfer( View it on GitLab:
https://dev.gajim.org/gajim/gajim/-/commit/7679ecea912cecb49147ead395ec13ca…
-- View it on GitLab:
https://dev.gajim.org/gajim/gajim/-/commit/7679ecea912cecb49147ead395ec13ca…
You're receiving this email because of your account on
dev.gajim.org
.
1
0
0
0
[Git][gajim/gajim][master] 5 commits: AddidionalDataDict: Don't limit return value to str
by Daniel Brötzmann (@wurstsalat)
15 Jan '22
15 Jan '22
Daniel Brötzmann pushed to branch master at gajim / gajim Commits: 188b9da1 by wurstsalat at 2022-01-15T12:43:21+01:00 AddidionalDataDict: Don't limit return value to str - - - - - db199df5 by wurstsalat at 2022-01-15T12:43:27+01:00 MessageWidget: Typing - - - - - 69f71372 by wurstsalat at 2022-01-15T12:43:27+01:00 ScrolledView: Use ConversationViewT - - - - - 5f071032 by wurstsalat at 2022-01-15T12:43:27+01:00 Add type annotations and refactor signal handling for ConversationView and its children - - - - - cef7d2e8 by wurstsalat at 2022-01-15T12:43:27+01:00 Update pyrightconfig - - - - - 16 changed files: - gajim/common/helpers.py - gajim/common/modules/chat_markers.py - gajim/common/types.py - gajim/gtk/chat_list.py - gajim/gtk/controls/base.py - gajim/gtk/controls/chat.py - gajim/gtk/conversation/message_widget.py - gajim/gtk/conversation/rows/base.py - gajim/gtk/conversation/rows/call.py - gajim/gtk/conversation/rows/message.py - gajim/gtk/conversation/rows/read_marker.py - gajim/gtk/conversation/rows/widgets.py - gajim/gtk/conversation/scrolled.py - gajim/gtk/conversation/view.py - gajim/gtk/types.py - pyrightconfig.json Changes: ===================================== gajim/common/helpers.py ===================================== @@ -847,7 +847,7 @@ def set_value(self, full_path: str, key: str, value: Optional[str]) -> None: def get_value(self, full_path: str, key: str, - default: Optional[str] = None) -> Optional[str]: + default: Optional[str] = None) -> Optional[Any]: path_childs = self._get_path_childs(full_path) _dict = self.data ===================================== gajim/common/modules/chat_markers.py ===================================== @@ -110,7 +110,7 @@ def _raise_event(self, name: str, properties: Any) -> None: marker_id=properties.marker.id)) def _send_marker(self, - contact: types.ChatContacts, + contact: types.ChatContactT, marker: str, id_: str, type_: str) -> None: @@ -139,7 +139,7 @@ def _send_marker(self, self._log.info('Send %s: %s', marker, contact.jid) def send_displayed_marker(self, - contact: types.ChatContacts, + contact: types.ChatContactT, id_: str, type_: str) -> None: self._send_marker(contact, 'displayed', id_, type_) ===================================== gajim/common/types.py ===================================== @@ -42,8 +42,6 @@ from gajim.common.modules.contacts import GroupchatContact from gajim.common.modules.contacts import GroupchatParticipant - ChatContacts = Union[BareContact, GroupchatContact, GroupchatParticipant] - from gajim.gui_interface import Interface from gajim.common.settings import Settings from gajim.gtk.css_config import CSSConfig @@ -70,3 +68,6 @@ AnyCallableT = Callable[..., Any] ObservableCbDict = dict[str, list[weakref.WeakMethod[AnyCallableT]]] + +ChatContactT = Union['BareContact', 'GroupchatContact', 'GroupchatParticipant'] +GroupchatContactT = Union['GroupchatContact'] ===================================== gajim/gtk/chat_list.py ===================================== @@ -13,6 +13,7 @@ # along with Gajim. If not, see <
http://www.gnu.org/licenses/
>. from __future__ import annotations + from typing import Optional from typing import Any from typing import cast @@ -52,11 +53,9 @@ from gajim.common.helpers import get_uf_relative_time from gajim.common.helpers import message_needs_highlight from gajim.common.helpers import AdditionalDataDict -from gajim.common.modules.contacts import BareContact -from gajim.common.modules.contacts import GroupchatContact -from gajim.common.modules.contacts import GroupchatParticipant from gajim.common.preview_helpers import filename_from_uri from gajim.common.preview_helpers import guess_simple_file_type +from gajim.common.types import ChatContactT from .menus import get_chat_list_row_menu from .builder import get_builder @@ -65,7 +64,6 @@ log = logging.getLogger('gajim.gui.chatlist') MessageEventT = Union[MessageReceived, GcMessageReceived, MamMessageReceived] -ContactT = Union[BareContact, GroupchatContact, GroupchatParticipant] class ChatList(Gtk.ListBox, EventHelper): @@ -746,13 +744,13 @@ def toggle_pinned(self) -> None: self._pinned = not self._pinned def _on_presence_update(self, - _contact: ContactT, + _contact: ChatContactT, _signal_name: str ) -> None: self.update_avatar() def _on_avatar_update(self, - _contact: ContactT, + _contact: ChatContactT, _signal_name: str ) -> None: self.update_avatar() @@ -781,7 +779,7 @@ def update_account_identifier(self) -> None: self._ui.account_identifier.set_visible(show) def _on_chatstate_update(self, - contact: ContactT, + contact: ChatContactT, _signal_name: str ) -> None: if contact.chatstate is None: @@ -790,7 +788,7 @@ def _on_chatstate_update(self, self._ui.chatstate_image.set_visible(contact.chatstate.is_composing) def _on_nickname_update(self, - _contact: ContactT, + _contact: ChatContactT, _signal_name: str ) -> None: self.update_name() ===================================== gajim/gtk/controls/base.py ===================================== @@ -79,8 +79,9 @@ from gajim.gui.util import get_hardware_key_codes from gajim.gui.builder import get_builder from gajim.gui.util import set_urgency_hint +from gajim.gui.util import scroll_to_end from gajim.gui.util import AccountBadge -from gajim.gui.const import ControlType # pylint: disable=unused-import +from gajim.gui.const import ControlType from gajim.gui.const import TARGET_TYPE_URI_LIST from gajim.gui.emoji_chooser import emoji_chooser @@ -188,8 +189,9 @@ def __init__(self, widget_name: str, account: str, jid: JID) -> None: # Create ConversationView and connect signals self.conversation_view = ConversationView(self.account, self.contact) - self.conversation_view.connect('quote', self.on_quote) - self.conversation_view.connect('mention', self.on_mention) + self.conversation_view.connect('quote', self._on_quote) + self.conversation_view.connect('mention', self._on_mention) + self.conversation_view.connect('scroll-to-end', self._on_scroll_to_end) id_ = self.conversation_view.connect( 'key-press-event', self._on_conversation_view_key_press) @@ -761,16 +763,19 @@ def paste_clipboard_as_quote(self, _item: Gtk.MenuItem) -> None: return self.insert_as_quote(text) - def on_quote(self, _widget: Gtk.Widget, text: str) -> None: + def _on_quote(self, _view: ConversationView, text: str) -> None: self.insert_as_quote(text) - def on_mention(self, _widget: Gtk.Widget, name: str) -> None: + def _on_mention(self, _view: ConversationView, name: str) -> None: gc_refer_to_nick_char = app.settings.get('gc_refer_to_nick_char') text = f'{name}{gc_refer_to_nick_char} ' message_buffer = self.msg_textview.get_buffer() message_buffer.insert_at_cursor(text) GLib.idle_add(self.msg_textview.grab_focus) + def _on_scroll_to_end(self, _view: ConversationView) -> None: + scroll_to_end(self._scrolled_view) + def _on_message_textview_paste_event(self, _texview: MessageInputTextView ) -> None: ===================================== gajim/gtk/controls/chat.py ===================================== @@ -110,8 +110,8 @@ def __init__(self, account: str, jid: JID) -> None: self._call_widget.connect('call-ended', self._on_call_ended) self.xml.paned1.add2(self._call_widget) - self.conversation_view.connect('accept-call', self._on_accept_call) - self.conversation_view.connect('decline-call', self._on_decline_call) + self.conversation_view.connect('call-accepted', self._on_call_accepted) + self.conversation_view.connect('call-declined', self._on_call_declined) # Menu for the HeaderBar self.control_menu = get_singlechat_menu( @@ -480,16 +480,16 @@ def _on_start_call(self, def _process_jingle_av_event(self, event): self._call_widget.process_event(event) - def _on_accept_call(self, - _view: ConversationView, - session: JingleSession - ) -> None: + def _on_call_accepted(self, + _view: ConversationView, + session: JingleSession + ) -> None: self._call_widget.accept_call(session) - def _on_decline_call(self, - _view: ConversationView, - session: JingleSession - ) -> None: + def _on_call_declined(self, + _view: ConversationView, + session: JingleSession + ) -> None: self._call_widget.decline_call(session) def _on_call_ended(self, _call_widget: CallWidget) -> None: ===================================== gajim/gtk/conversation/message_widget.py ===================================== @@ -23,6 +23,8 @@ from gajim.common.styling import process from gajim.common.styling import ParsingResult +from gajim.common.styling import PlainBlock +from gajim.common.styling import PreBlock from gajim.common.styling import QuoteBlock from .code_widget import CodeWidget @@ -67,19 +69,19 @@ def add_content(self, content: ContentT) -> None: self.clear() self._content = content for block in content.blocks: - if block.name == 'plain': + if isinstance(block, PlainBlock): widget = PlainWidget(self._account, self._selectable) widget.add_content(block) self.add(widget) continue - if block.name == 'pre': + if isinstance(block, PreBlock): widget = CodeWidget(self._account) widget.add_content(block) self.add(widget) continue - if block.name == 'quote': + if isinstance(block, QuoteBlock): message_widget = MessageWidget(self._account, self._selectable) message_widget.add_content(block) widget = QuoteWidget(self._account) @@ -93,6 +95,6 @@ def clear(self) -> None: self.foreach(self.remove) def update_text_tags(self, *args: Any) -> None: - for widget in self.get_children(): + for widget in cast(list[MessageWidget], self.get_children()): if not isinstance(widget, CodeWidget): widget.update_text_tags() ===================================== gajim/gtk/conversation/rows/base.py ===================================== @@ -33,10 +33,11 @@ def __init__(self, account: str, widget: Optional[str] = None) -> None: self._client = app.get_client(account) self.type: str = '' self.timestamp: datetime = datetime.fromtimestamp(0) - self.kind: Optional[str] = None - self.name: Optional[str] = None + self.kind: str = '' + self.name: str = '' self.message_id: Optional[str] = None self.log_line_id: Optional[str] = None + self.stanza_id: Optional[str] = None self.text: str = '' self._merged: bool = False ===================================== gajim/gtk/conversation/rows/call.py ===================================== @@ -15,14 +15,13 @@ from __future__ import annotations from typing import Optional -from typing import cast -from typing import TYPE_CHECKING import time from datetime import datetime from gi.repository import GdkPixbuf from gi.repository import Gtk +from gi.repository import GObject from gajim.common import app from gajim.common import types @@ -36,11 +35,22 @@ from .widgets import SimpleLabel from .base import BaseRow -if TYPE_CHECKING: - from gajim.gui.conversation.view import ConversationView - class CallRow(BaseRow): + + __gsignals__ = { + 'call-accepted': ( + GObject.SignalFlags.RUN_LAST, + None, + (object,) + ), + 'call-declined': ( + GObject.SignalFlags.RUN_LAST, + None, + (object,) + ), + } + def __init__(self, account: str, contact: types.BareContact, @@ -101,24 +111,22 @@ def update(self) -> None: def _on_accept(self, button: Gtk.Button) -> None: button.set_sensitive(False) self._decline_button.set_sensitive(False) - view = cast('ConversationView', self.get_parent()) if self._event is not None: session = self._client.get_module('Jingle').get_jingle_session( self._event.fjid, self._event.sid) - view.accept_call(session) + self.emit('call-accepted', session) else: assert self._session is not None - view.accept_call(self._session) + self.emit('call-accepted', self._session) def _on_decline(self, _button: Gtk.Button) -> None: - view = cast('ConversationView', self.get_parent()) if self._event is not None: session = self._client.get_module('Jingle').get_jingle_session( self._event.fjid, self._event.sid) - view.decline_call(session) + self.emit('call-declined', session) else: assert self._session is not None - view.decline_call(self._session) + self.emit('call-declined', self._session) self._session = None def _add_history_call_widget(self) -> None: ===================================== gajim/gtk/conversation/rows/message.py ===================================== @@ -15,14 +15,15 @@ from __future__ import annotations from typing import Optional -from typing import Union from datetime import datetime from datetime import timedelta from gi.repository import Gdk +from gi.repository import GdkPixbuf from gi.repository import GLib from gi.repository import Gtk +from gi.repository import GObject import cairo @@ -30,7 +31,6 @@ from nbxmpp.modules.security_labels import Displaymarking from gajim.common import app -from gajim.common import types from gajim.common.const import AvatarSize from gajim.common.const import Trust from gajim.common.const import TRUST_SYMBOL_DATA @@ -42,6 +42,8 @@ from gajim.common.helpers import to_user_string from gajim.common.i18n import _ from gajim.common.i18n import Q_ +from gajim.common.modules.contacts import GroupchatContact +from gajim.common.types import ChatContactT from .base import BaseRow from .widgets import MoreMenuButton @@ -52,16 +54,27 @@ from ...util import format_fingerprint from ...util import get_cursor - MERGE_TIMEFRAME = timedelta(seconds=120) class MessageRow(BaseRow): + + __gsignals__ = { + 'mention': ( + GObject.SignalFlags.RUN_LAST, + None, + (str,) + ), + 'quote': ( + GObject.SignalFlags.RUN_LAST, + None, + (str,) + ), + } + def __init__(self, account: str, - contact: Union[types.BareContact, - types.GroupchatContact, - types.GroupchatParticipant], + contact: ChatContactT, message_id: Optional[str], stanza_id: Optional[str], timestamp: float, @@ -83,7 +96,7 @@ def __init__(self, self.stanza_id = stanza_id self.log_line_id = log_line_id self.kind = kind - self.name = name or '' + self.name = name self.text = text self.additional_data = additional_data @@ -216,6 +229,10 @@ def update_text_tags(self) -> None: self._message_widget.update_text_tags() def _check_for_highlight(self, text: str) -> None: + assert isinstance(self._contact, GroupchatContact) + if self._contact.nickname is None: + return + needs_highlight = message_needs_highlight( text, self._contact.nickname, @@ -224,12 +241,12 @@ def _check_for_highlight(self, text: str) -> None: self.get_style_context().add_class( 'gajim-mention-highlight') - def _get_avatar(self, kind: str, name: str) -> Optional[cairo.Surface]: + def _get_avatar(self, kind: str, name: str) -> Optional[cairo.ImageSurface]: if self._contact is None: return None scale = self.get_scale_factor() - if self._is_groupchat: + if isinstance(self._contact, GroupchatContact): contact = self._contact.get_resource(name) return contact.get_avatar(AvatarSize.ROSTER, scale, add_show=False) @@ -239,7 +256,9 @@ def _get_avatar(self, kind: str, name: str) -> Optional[cairo.Surface]: else: contact = self._contact - return contact.get_avatar(AvatarSize.ROSTER, scale, add_show=False) + avatar = contact.get_avatar(AvatarSize.ROSTER, scale, add_show=False) + assert not isinstance(avatar, GdkPixbuf.Pixbuf) + return avatar def _on_avatar_clicked(self, _widget: Gtk.Widget, @@ -247,21 +266,31 @@ def _on_avatar_clicked(self, name: str ) -> int: if event.type == Gdk.EventType.BUTTON_PRESS and event.button == 1: - self.get_parent().on_mention(name) + self.emit('mention', name) return Gdk.EVENT_STOP @staticmethod def _on_realize(event_box: Gtk.EventBox) -> None: - event_box.get_window().set_cursor(get_cursor('pointer')) + window = event_box.get_window() + if window is not None: + window.set_cursor(get_cursor('pointer')) def is_same_sender(self, message: MessageRow) -> bool: return message.name == self.name def is_same_encryption(self, message: MessageRow) -> bool: - message_details = self._get_encryption_details(message.additional_data) - own_details = self._get_encryption_details(self.additional_data) + m_add_data = message.additional_data + if m_add_data is None: + m_add_data = AdditionalDataDict() + s_add_data = self.additional_data + if s_add_data is None: + s_add_data = AdditionalDataDict() + + message_details = self._get_encryption_details(m_add_data) + own_details = self._get_encryption_details(s_add_data) if message_details is None and own_details is None: return True + if message_details is not None and own_details is not None: # *_details contains encryption method's name, fingerprint, trust m_name, _, m_trust = message_details @@ -270,7 +299,7 @@ def is_same_encryption(self, message: MessageRow) -> bool: return True return False - def is_mergeable(self, message: BaseRow) -> bool: + def is_mergeable(self, message: MessageRow) -> bool: if message.type != self.type: return False if not self.is_same_sender(message): @@ -286,7 +315,7 @@ def on_copy_message(self, _widget: Gtk.Widget) -> None: clip.set_text(f'{timestamp} - {self.name}: {text}', -1) def on_quote_message(self, _widget: Gtk.Widget) -> None: - self.get_parent().on_quote(self._message_widget.get_text()) + self.emit('quote', self._message_widget.get_text()) def on_retract_message(self, _widget: Gtk.Widget) -> None: def _on_retract(reason: str) -> None: @@ -324,7 +353,7 @@ def _get_encryption_image(self, icon = 'channel-secure-symbolic' color = 'encrypted-color' else: - icon, trust_tooltip, color = TRUST_SYMBOL_DATA[trust] + icon, trust_tooltip, color = TRUST_SYMBOL_DATA[Trust(trust)] tooltip = f'{tooltip}\n{trust_tooltip}' if fingerprint is not None: fingerprint = format_fingerprint(fingerprint) @@ -338,13 +367,15 @@ def _get_encryption_image(self, @staticmethod def _get_encryption_details(additional_data: AdditionalDataDict - ) -> Optional[tuple[str, str, Trust]]: + ) -> Optional[tuple[ + str, Optional[str], Optional[Trust]]]: name = additional_data.get_value('encrypted', 'name') if name is None: return None fingerprint = additional_data.get_value('encrypted', 'fingerprint') - trust = additional_data.get_value('encrypted', 'trust') + trust_data = additional_data.get_value('encrypted', 'trust') + trust = Trust(trust_data) return name, fingerprint, trust @property ===================================== gajim/gtk/conversation/rows/read_marker.py ===================================== @@ -19,14 +19,14 @@ from gi.repository import Gtk -from gajim.common import types from gajim.common.i18n import _ +from gajim.common.types import ChatContactT from .base import BaseRow class ReadMarkerRow(BaseRow): - def __init__(self, account: str, contact: types.BareContact) -> None: + def __init__(self, account: str, contact: ChatContactT) -> None: BaseRow.__init__(self, account, widget='label') self.set_activatable(False) self.type = 'read_marker' @@ -46,7 +46,7 @@ def __init__(self, account: str, contact: types.BareContact) -> None: self.set_no_show_all(True) def _on_nickname_update(self, - contact: types.BareContact, + contact: ChatContactT, _signal_name: str ) -> None: text = _('%s has read up to this point') % contact.name ===================================== gajim/gtk/conversation/rows/widgets.py ===================================== @@ -14,8 +14,8 @@ from __future__ import annotations -import typing from typing import Union +from typing import Any from gi.repository import Gtk from gi.repository import Pango @@ -30,10 +30,6 @@ from ...util import wrap_with_event_box -if typing.TYPE_CHECKING: - from .message import MessageRow - - ContactT = Union[BareContact, GroupchatContact, GroupchatParticipant] @@ -49,7 +45,7 @@ def __init__(self) -> None: @wrap_with_event_box class MoreMenuButton(Gtk.Button): def __init__(self, - row: MessageRow, + row: Any, contact: ContactT, name: str ) -> None: ===================================== gajim/gtk/conversation/scrolled.py ===================================== @@ -19,8 +19,7 @@ from gi.repository import Gtk from gi.repository import GObject -from .view import ConversationView - +from ..types import ConversationViewT class ScrolledView(Gtk.ScrolledWindow): @@ -72,7 +71,7 @@ def __init__(self) -> None: def get_autoscroll(self) -> bool: return self._autoscroll - def get_view(self) -> ConversationView: + def get_view(self) -> ConversationViewT: return self.get_child().get_child() def reset(self) -> None: ===================================== gajim/gtk/conversation/view.py ===================================== @@ -42,11 +42,12 @@ from gajim.common.helpers import to_user_string from gajim.common.helpers import get_start_of_day from gajim.common.jingle_session import JingleSession -from gajim.common.modules.contacts import GroupchatParticipant -from gajim.common.modules.contacts import GroupchatContact -from gajim.common.modules.contacts import BareContact from gajim.common.modules.httpupload import HTTPFileTransfer from gajim.common.storage.archive import ConversationRow +from gajim.common.modules.contacts import BareContact +from gajim.common.modules.contacts import GroupchatContact +from gajim.common.modules.contacts import GroupchatParticipant +from gajim.common.types import ChatContactT from .rows.base import BaseRow from .rows.read_marker import ReadMarkerRow @@ -62,12 +63,8 @@ from .rows.muc_join_left import MUCJoinLeft from .rows.muc_user_status import MUCUserStatus -from ..util import scroll_to_end - log = logging.getLogger('gajim.gui.conversation_view') -ContactT = Union[BareContact, GroupchatContact, GroupchatParticipant] - class ConversationView(Gtk.ListBox): @@ -82,19 +79,24 @@ class ConversationView(Gtk.ListBox): None, (str, ) ), - 'accept-call': ( + 'scroll-to-end': ( + GObject.SignalFlags.RUN_LAST | GObject.SignalFlags.ACTION, + None, + () + ), + 'call-accepted': ( GObject.SignalFlags.RUN_LAST | GObject.SignalFlags.ACTION, None, (object, ) ), - 'decline-call': ( + 'call-declined': ( GObject.SignalFlags.RUN_LAST | GObject.SignalFlags.ACTION, None, (object, ) ), } - def __init__(self, account: str, contact: ContactT) -> None: + def __init__(self, account: str, contact: ChatContactT) -> None: Gtk.ListBox.__init__(self) self.set_selection_mode(Gtk.SelectionMode.NONE) self.set_sort_func(self._sort_func) @@ -152,7 +154,7 @@ def unlock(self) -> None: def clear(self) -> None: for row in self.get_children()[2:]: - if row.type == 'read_marker': + if isinstance(row, ReadMarkerRow): continue self.remove(row) row.destroy() @@ -252,6 +254,8 @@ def add_call_message(self, assert isinstance(self._contact, BareContact) call_row = CallRow( self._account, self._contact, event=event, db_message=db_message) + call_row.connect('call-accepted', self._on_call_accepted) + call_row.connect('call-declined', self._on_call_declined) self._insert_message(call_row) def add_command_output(self, text: str, is_error: bool) -> None: @@ -274,7 +278,7 @@ def add_message(self, if not timestamp: timestamp = time.time() - message = MessageRow( + message_row = MessageRow( self._account, self._contact, message_id, @@ -289,19 +293,20 @@ def add_message(self, error=error, encryption_enabled=self.encryption_enabled, log_line_id=log_line_id) + message_row.connect('mention', self._on_mention) + message_row.connect('quote', self._on_quote) - if message.type == 'chat': - if message_id is not None: - self._message_id_row_map[message_id] = message + if message_id is not None: + self._message_id_row_map[message_id] = message_row - if kind == 'incoming': - self._read_marker_row.set_last_incoming_timestamp( - message.timestamp) - if (marker is not None and marker == 'displayed' - and message_id is not None): - self.set_read_marker(message_id) + if kind == 'incoming': + self._read_marker_row.set_last_incoming_timestamp( + message_row.timestamp) + if (marker is not None and marker == 'displayed' + and message_id is not None): + self.set_read_marker(message_id) - self._insert_message(message) + self._insert_message(message_row) def _insert_message(self, message: BaseRow) -> None: self.add(message) @@ -327,13 +332,13 @@ def _add_date_row(self, timestamp: datetime) -> None: if row is None: return - if row.type != 'chat': + if not isinstance(row, MessageRow): return row.set_merged(False) def _check_for_merge(self, message: BaseRow) -> None: - if message.type != 'chat': + if not isinstance(message, MessageRow): return if not app.settings.get('chat_merge_consecutive_nickname'): @@ -354,10 +359,10 @@ def _find_ancestor(self, message: MessageRow) -> Optional[MessageRow]: if row is None: return None - if row.type == 'read_marker': + if isinstance(row, ReadMarkerRow): continue - if row.type != 'chat': + if not isinstance(row, MessageRow): return None if not message.is_same_sender(row): @@ -367,7 +372,7 @@ def _find_ancestor(self, message: MessageRow) -> Optional[MessageRow]: return row return None - def _update_descendants(self, message: BaseRow) -> None: + def _update_descendants(self, message: MessageRow) -> None: index = message.get_index() while True: index += 1 @@ -375,10 +380,10 @@ def _update_descendants(self, message: BaseRow) -> None: if row is None: return - if row.type == 'read_marker': + if isinstance(row, ReadMarkerRow): continue - if row.type != 'chat': + if not isinstance(row, MessageRow): return if message.is_mergeable(row): @@ -437,7 +442,7 @@ def _reduce_messages_after(self) -> None: def scroll_to_message_and_highlight(self, log_line_id: str) -> None: highlight_row = None - for row in self.get_children(): + for row in cast(list[BaseRow], self.get_children()): row.get_style_context().remove_class( 'conversation-search-highlight') if row.log_line_id == log_line_id: @@ -453,26 +458,27 @@ def _get_row_by_message_id(self, id_: str) -> Optional[MessageRow]: return self._message_id_row_map.get(id_) def get_row_by_log_line_id(self, log_line_id: str) -> Optional[MessageRow]: - for row in self.get_children(): + for row in cast(list[BaseRow], self.get_children()): + if not isinstance(row, MessageRow): + continue if row.log_line_id == log_line_id: return row return None def get_row_by_stanza_id(self, stanza_id: str) -> Optional[MessageRow]: - for row in self.get_children(): - if row.type != 'chat': + for row in cast(list[BaseRow], self.get_children()): + if not isinstance(row, MessageRow): continue if row.stanza_id == stanza_id: return row return None def iter_rows(self) -> Generator[BaseRow, None, None]: - for row in self.get_children(): + for row in cast(list[BaseRow], self.get_children()): yield row def update_call_rows(self) -> None: - rows = cast(list[BaseRow], self.get_children()) - for row in rows: + for row in cast(list[BaseRow], self.get_children()): if isinstance(row, CallRow): row.update() @@ -493,17 +499,18 @@ def set_read_marker(self, id_: str) -> None: self._read_marker_row.set_timestamp(timestamp) def update_avatars(self) -> None: - for row in self.get_children(): - if row.type == 'chat': + for row in cast(list[BaseRow], self.get_children()): + if isinstance(row, MessageRow): row.update_avatar() def update_text_tags(self) -> None: - for row in self.get_children(): - row.update_text_tags() + for row in cast(list[BaseRow], self.get_children()): + if isinstance(row, MessageRow): + row.update_text_tags() def scroll_to_end(self, force: bool = False) -> None: if self.autoscroll or force: - GLib.idle_add(scroll_to_end, self.get_parent().get_parent()) + GLib.idle_add(self.emit, 'scroll-to-end') def correct_message(self, correct_id: str, text: str) -> None: message_row = self._get_row_by_message_id(correct_id) @@ -527,17 +534,23 @@ def show_error(self, id_: str, error: StanzaError) -> None: message_row.set_error(to_user_string(error)) message_row.set_merged(False) - def on_quote(self, text: str) -> None: + def _on_quote(self, _message_row: MessageRow, text: str) -> None: self.emit('quote', text) - def on_mention(self, name: str) -> None: + def _on_mention(self, _message_row: MessageRow, name: str) -> None: self.emit('mention', name) - def accept_call(self, session: JingleSession) -> None: - self.emit('accept-call', session) - - def decline_call(self, session: JingleSession) -> None: - self.emit('decline-call', session) + def _on_call_accepted(self, + _call_row: CallRow, + session: JingleSession + ) -> None: + self.emit('call-accepted', session) + + def _on_call_declined(self, + _call_row: CallRow, + session: JingleSession + ) -> None: + self.emit('call-declined', session) def _on_contact_setting_changed(self, *args: Any) -> None: self.invalidate_filter() ===================================== gajim/gtk/types.py ===================================== @@ -23,6 +23,7 @@ from .controls.private import PrivateChatControl from .controls.groupchat import GroupchatControl from .conversation.message_widget import MessageWidget + from .conversation.view import ConversationView from .conversation.rows.call import CallRow from .conversation.rows.command_output import CommandOutputRow from .conversation.rows.date import DateRow @@ -46,3 +47,5 @@ ] GroupchatControlType = Union['GroupchatControl'] + +ConversationViewT = Union['ConversationView'] ===================================== pyrightconfig.json ===================================== @@ -21,6 +21,7 @@ "gajim/gtk/account_side_bar.py", "gajim/gtk/app_page.py", "gajim/gtk/app_side_bar.py", + "gajim/gtk/bookmarks.py", "gajim/gtk/call_widget.py", "gajim/gtk/chat_filter.py", "gajim/gtk/chat_list_stack.py", @@ -36,6 +37,7 @@ "gajim/gtk/conversation/rows/date.py", "gajim/gtk/conversation/rows/file_transfer.py", "gajim/gtk/conversation/rows/info.py", + "gajim/gtk/conversation/rows/message.py", "gajim/gtk/conversation/rows/muc_join_left.py", "gajim/gtk/conversation/rows/muc_subject.py", "gajim/gtk/conversation/rows/muc_user_status.py", @@ -43,6 +45,9 @@ "gajim/gtk/conversation/rows/scroll_hint.py", "gajim/gtk/conversation/rows/widgets.py", "gajim/gtk/conversation/scrolled.py", + "gajim/gtk/conversation/view.py", + "gajim/gtk/features.py", + "gajim/gtk/file_transfer_send.py", "gajim/gtk/groupchat_invitation.py", "gajim/gtk/groupchat_inviter.py", "gajim/gtk/groupchat_nick.py", @@ -50,12 +55,15 @@ "gajim/gtk/main_stack.py", "gajim/gtk/manage_sounds.py", "gajim/gtk/notification.py", - "gajim/gtk/structs.py", + "gajim/gtk/preview_audio.py", + "gajim/gtk/resource_selector.py", + "gajim/gtk/search_view.py", "gajim/gtk/sidebar_switcher.py", "gajim/gtk/ssl_error_dialog.py", "gajim/gtk/status_icon.py", "gajim/gtk/status_message_selector.py", "gajim/gtk/status_selector.py", + "gajim/gtk/structs.py", "gajim/gtk/themes.py", "gajim/gtk/video_preview.py", "gajim/gtk/workspace_dialog.py", View it on GitLab:
https://dev.gajim.org/gajim/gajim/-/compare/c132a0165a440224da8219c1d994726…
-- View it on GitLab:
https://dev.gajim.org/gajim/gajim/-/compare/c132a0165a440224da8219c1d994726…
You're receiving this email because of your account on
dev.gajim.org
.
1
0
0
0
← Newer
1
...
6
7
8
9
10
11
12
...
17
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Results per page:
10
25
50
100
200