Daniel Brötzmann pushed to branch master at gajim / gajim
Commits: 2502c2e1 by wurstsalat at 2022-01-12T14:18:31+01:00 Themes: Typing
- - - - - e88c58ba by wurstsalat at 2022-01-12T15:06:23+01:00 SynchronizeAccounts: Typing
- - - - - 9382e923 by wurstsalat at 2022-01-12T15:40:51+01:00 Improve type annotations for video preview and gstreamer
- - - - - c1474810 by wurstsalat at 2022-01-12T16:20:28+01:00 WorkspaceDialog: Typing
- - - - - e21d2e9a by wurstsalat at 2022-01-12T16:20:44+01:00 WorkspaceSidebar: Typing
- - - - -
8 changed files:
- gajim/common/app.py - gajim/gtk/call_widget.py - gajim/gtk/gstreamer.py - gajim/gtk/synchronize_accounts.py - gajim/gtk/themes.py - gajim/gtk/video_preview.py - gajim/gtk/workspace_dialog.py - gajim/gtk/workspace_side_bar.py
Changes:
===================================== gajim/common/app.py ===================================== @@ -231,8 +231,8 @@ def detect_dependencies() -> None: conference = Gst.ElementFactory.make('fsrtpconference', None) conference.new_session(Farstream.MediaType.AUDIO) from gajim.gui.gstreamer import create_gtk_widget - sink, _, _ = create_gtk_widget() - if sink is not None: + gtk_widget = create_gtk_widget() + if gtk_widget is not None: _dependencies['AV'] = True except Exception as error: log('gajim').warning('AV dependency test failed: %s', error)
===================================== gajim/gtk/call_widget.py ===================================== @@ -471,8 +471,10 @@ def _update_video(self) -> None: self._ui.outgoing_viewport.set_no_show_all(True) self._ui.outgoing_viewport.hide()
- sink_other, self._video_widget_other, _name = create_gtk_widget() - sink_self, self._video_widget_self, _name = create_gtk_widget() + other_gtk_widget = create_gtk_widget() + self_gtk_widget = create_gtk_widget() + sink_other, self._video_widget_other, _name = other_gtk_widget + sink_self, self._video_widget_self, _name = self_gtk_widget self._ui.incoming_viewport.add(self._video_widget_other) self._ui.outgoing_viewport.add(self._video_widget_self)
===================================== gajim/gtk/gstreamer.py ===================================== @@ -22,14 +22,14 @@ pass
-def create_gtk_widget() -> Tuple[Optional[Gst.Element], - Optional[Gtk.Widget], - Optional[str]]: +def create_gtk_widget() -> Optional[Tuple[Gst.Element, + Gtk.Widget, + str]]: gtkglsink = Gst.ElementFactory.make('gtkglsink', None) if gtkglsink is not None: glsinkbin = Gst.ElementFactory.make('glsinkbin', None) if glsinkbin is None: - return None, None, None + return None glsinkbin.set_property('sink', gtkglsink) sink = glsinkbin widget = gtkglsink.get_property('widget') @@ -37,7 +37,7 @@ def create_gtk_widget() -> Tuple[Optional[Gst.Element], else: sink = Gst.ElementFactory.make('gtksink', None) if sink is None: - return None, None, None + return None widget = sink.get_property('widget') name = 'gtksink' widget.set_visible(True)
===================================== gajim/gtk/synchronize_accounts.py ===================================== @@ -25,7 +25,7 @@
class SynchronizeAccounts(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) @@ -82,15 +82,16 @@ def __init__(self, account):
self.show_all()
- 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 _init_accounts(self): + def _init_accounts(self) -> None: """ Initialize listStore with existing accounts """ model = self._ui.accounts_treeview.get_model() + assert isinstance(model, Gtk.ListStore) model.clear() for remote_account in app.connections: if remote_account == self.account: @@ -104,15 +105,13 @@ def _init_accounts(self): 1, app.get_hostname_from_account(remote_account))
- def _on_next_clicked(self, _widget): + def _on_next_clicked(self, _button: Gtk.Button) -> None: selection = self._ui.accounts_treeview.get_selection() (model, iter_) = selection.get_selected() if not iter_: return
self._remote_account = model.get_value(iter_, 0) - self._remote_client = app.get_client(self._remote_account) - if not app.account_is_available(self._remote_account): ErrorDialog( _('This account is not connected to the server'), @@ -120,24 +119,27 @@ def _on_next_clicked(self, _widget): 'connected.')) return
+ self._remote_client = app.get_client(self._remote_account) self._init_contacts() self._ui.stack.set_visible_child_full( 'contacts', Gtk.StackTransitionType.SLIDE_LEFT)
- def _on_back_clicked(self, _button): + def _on_back_clicked(self, _button: Gtk.Button) -> None: self._ui.stack.set_visible_child_full( 'accounts', Gtk.StackTransitionType.SLIDE_RIGHT)
def _init_contacts(self): model = self._ui.contacts_treeview.get_model() + assert isinstance(model, Gtk.ListStore) model.clear()
# recover local contacts - local_jid_list = [] + local_jid_list: list[str] = [] for contact in self._local_client.get_module('Roster').iter_contacts(): local_jid_list.append(str(contact.jid))
- remote_jid_list = [] + remote_jid_list: list[str] = [] + assert self._remote_client is not None for contact in self._remote_client.get_module('Roster').iter_contacts(): remote_jid_list.append(str(contact.jid))
@@ -146,22 +148,26 @@ def _init_contacts(self): iter_ = model.append() model.set(iter_, 0, True, 1, remote_jid)
- def _on_sync_toggled(self, cell, path): + def _on_sync_toggled(self, cell: Gtk.CellRendererToggle, path: str) -> None: model = self._ui.contacts_treeview.get_model() + assert isinstance(model, Gtk.ListStore) iter_ = model.get_iter(path) model[iter_][0] = not cell.get_active()
- def _on_sync_clicked(self, _widget): + def _on_sync_clicked(self, _button: Gtk.Button) -> None: + assert self._remote_account is not None + assert self._remote_client is not None model = self._ui.contacts_treeview.get_model() + assert isinstance(model, Gtk.ListStore) iter_ = model.get_iter_first() while iter_: if model[iter_][0]: # it is selected remote_jid = model[iter_][1] + hostname = app.get_hostname_from_account(self._remote_account) message = _('I’m synchronizing my contacts from my account at ' '"%s". Could you please add this address to your ' - 'contact list?' % app.get_hostname_from_account( - self._remote_account)) + 'contact list?' % hostname) remote_contact = self._remote_client.get_module( 'Contacts').get_contact(remote_jid)
===================================== gajim/gtk/themes.py ===================================== @@ -326,6 +326,8 @@ def _remove_theme():
app.css_config.remove_theme(theme) self._update_preferences_window() + assert isinstance(store, Gtk.TreeStore) + assert iter_ is not None store.remove(iter_)
first = store.get_iter_first() @@ -364,8 +366,10 @@ def __init__(self, self._box.add(label)
if option.attr in (StyleAttr.COLOR, StyleAttr.BACKGROUND): + assert not isinstance(value, Pango.FontDescription) self._init_color(value) elif option.attr == StyleAttr.FONT: + assert not isinstance(value, str) self._init_font(value)
remove_button = Gtk.Button.new_from_icon_name( @@ -378,7 +382,7 @@ def __init__(self, self.add(self._box) self.show_all()
- def _init_color(self, color: str) -> None: + def _init_color(self, color: Optional[str]) -> None: color_button = Gtk.ColorButton() if color is not None: rgba = Gdk.RGBA() @@ -388,7 +392,7 @@ def _init_color(self, color: str) -> None: color_button.connect('color-set', self._on_color_set) self._box.add(color_button)
- def _init_font(self, desc: Pango.FontDescription) -> None: + def _init_font(self, desc: Optional[Pango.FontDescription]) -> None: font_button = Gtk.FontButton() if desc is not None: font_button.set_font_desc(desc) @@ -402,24 +406,29 @@ def _on_color_set(self, color_button: Gtk.ColorButton) -> None: app.css_config.set_value( self.option.selector, self.option.attr, color_string, pre=True) app.ged.raise_event(StyleChanged()) - self.get_toplevel().reload_roster_theme() + themes_win = cast(Themes, self.get_toplevel()) + themes_win.reload_roster_theme()
def _on_font_set(self, font_button: Gtk.FontButton) -> None: desc = font_button.get_font_desc() + if desc is None: + return app.css_config.set_font(self.option.selector, desc, pre=True) app.ged.raise_event(StyleChanged()) - self.get_toplevel().reload_roster_theme() + themes_win = cast(Themes, self.get_toplevel()) + themes_win.reload_roster_theme()
def _on_remove(self, *args: Any) -> None: - self.get_parent().remove(self) + listbox = cast(Gtk.ListBox, self.get_parent()) + listbox.remove(self) app.css_config.remove_value( self.option.selector, self.option.attr, pre=True) app.ged.raise_event(StyleChanged()) self.destroy()
- def __eq__(self, other): - if isinstance(other, ChooseOption): - return other.option == self.option + def __eq__(self, other: object) -> bool: + if not isinstance(other, ChooseOption): + raise NotImplementedError return other.option == self.option
===================================== gajim/gtk/video_preview.py ===================================== @@ -70,13 +70,14 @@ def _enable_preview(self) -> None: self._set_error_text() return
- sink, widget, name = create_gtk_widget() - if sink is None: + gtk_widget = create_gtk_widget() + if gtk_widget is None: log.error('Failed to obtain a working Gstreamer GTK+ sink, ' 'video support will be disabled') self._set_error_text() return
+ sink, widget, name = gtk_widget self._set_sink_text(name)
if self._av_pipeline is None: @@ -94,6 +95,7 @@ def _enable_preview(self) -> None: self._ui.video_preview_box.pack_end(widget, True, True, 0) self._av_widget = widget
+ assert self._av_src is not None self._av_pipeline.add(self._av_src) self._av_src.link(self._av_sink) self._av_pipeline.set_state(Gst.State.PLAYING)
===================================== gajim/gtk/workspace_dialog.py ===================================== @@ -12,6 +12,7 @@ # You should have received a copy of the GNU General Public License # along with Gajim. If not, see http://www.gnu.org/licenses/.
+from typing import Any from typing import Optional
from gi.repository import Gtk @@ -79,18 +80,19 @@ def __init__(self, workspace_id: Optional[str] = None) -> None:
self._ui.connect_signals(self)
- self.connect('key-press-event', self._on_key_press_event) + self.connect('key-press-event', self._on_key_press) self.show_all()
- def _on_key_press_event(self, _widget, event): + def _on_key_press(self, _widget: Gtk.Widget, event: Gdk.EventKey) -> None: if event.keyval == Gdk.KEY_Escape: self.destroy()
- def _on_remove_workspace(self, _button): + def _on_remove_workspace(self, _button: Gtk.Button) -> None: def _on_remove(): + assert self._workspace_id is not None app.window.remove_workspace(self._workspace_id) self.destroy() - + assert self._workspace_id is not None chat_list = app.window.get_chat_list(self._workspace_id) open_chats = chat_list.get_open_chats() if len(open_chats) > 0: @@ -106,22 +108,24 @@ def _on_remove(): # No chats in chat list, it is save to remove workspace _on_remove()
- def _on_cancel(self, _button): + def _on_cancel(self, _button: Gtk.Button) -> None: self.destroy()
- def _on_color_set(self, _button): + def _on_color_set(self, _button: Gtk.ColorButton) -> None: self._update_avatar()
- def _on_text_changed(self, entry, _param): + def _on_text_changed(self, entry: Gtk.Entry, _param: Any) -> None: self._ui.save_button.set_sensitive(bool(entry.get_text())) self._update_avatar()
- def _on_image_switch_toggled(self, switch, *args): + def _on_image_switch_toggled(self, switch: Gtk.Switch, *args: Any) -> None: if switch.get_active(): self._ui.style_stack.set_visible_child_name('image') if self._workspace_id is not None: self._avatar_sha = app.settings.get_workspace_setting( self._workspace_id, 'avatar_sha') + if self._avatar_sha == '': + self._avatar_sha = None else: self._ui.style_stack.set_visible_child_name('color') self._avatar_sha = None @@ -132,6 +136,7 @@ def _update_avatar(self) -> None: rgba = self._ui.color_chooser.get_rgba() scale = self.get_scale_factor() if self._avatar_sha is not None: + assert self._workspace_id is not None surface = app.interface.avatar_storage.get_workspace_surface( self._workspace_id, AvatarSize.WORKSPACE_EDIT, @@ -154,7 +159,7 @@ def _get_avatar_data(self) -> Optional[bytes]:
return data
- def _on_save(self, _button): + def _on_save(self, _button: Gtk.Button) -> None: name = self._ui.entry.get_text() rgba = self._ui.color_chooser.get_rgba() use_image = self._ui.image_switch.get_active()
===================================== gajim/gtk/workspace_side_bar.py ===================================== @@ -17,7 +17,7 @@ from typing import Any from typing import List from typing import Optional -from typing import Union +from typing import cast
import logging
@@ -25,6 +25,7 @@ from gi.repository import Gio from gi.repository import GLib from gi.repository import Gtk + from nbxmpp.protocol import JID
from gajim.common import app @@ -63,8 +64,8 @@ def __init__(self, chat_page: ChatPage) -> None: Gdk.DragAction.MOVE)
self.drag_row: Optional[Workspace] = None - self.row_before: Optional[Workspace] = None - self.row_after: Union[Workspace, AddWorkspace, None] = None + self.row_before: Optional[CommonWorkspace] = None + self.row_after: Optional[CommonWorkspace] = None
self.connect('drag-motion', self._on_drag_motion) self.connect('drag-data-received', self._on_drag_data_received) @@ -86,7 +87,7 @@ def _on_drag_motion(self, y_coord: int, _time: int ) -> bool: - row = self.get_row_at_y(y_coord) + row = cast(CommonWorkspace, self.get_row_at_y(y_coord))
if row: alloc = row.get_allocation() @@ -128,7 +129,9 @@ def _on_drag_data_received(self, def _process_workspace_drop(self, workspace_id: str) -> None: row = self.get_workspace_by_id(workspace_id)
- if row in (self.row_after, None): + if row == self.row_after: + return + if row is None: return
self.remove(row) @@ -146,7 +149,7 @@ def _process_workspace_drop(self, workspace_id: str) -> None:
def _process_chat_list_drop(self, identifier: str, y_coord: int) -> None: account, jid = identifier.split() - workspace_row = self.get_row_at_y(y_coord) + workspace_row = cast(Workspace, self.get_row_at_y(y_coord)) if workspace_row.workspace_id == 'add': return
@@ -156,15 +159,25 @@ def _process_chat_list_drop(self, identifier: str, y_coord: int) -> None: app.window.activate_action('move-chat-to-workspace', params.to_variant())
- def _get_row_before(self, row): - return self.get_row_at_index(row.get_index() - 1) + def _get_row_before(self, + row: CommonWorkspace + ) -> Optional[CommonWorkspace]: + workspace = cast( + CommonWorkspace, self.get_row_at_index(row.get_index() - 1)) + return workspace
- def _get_row_after(self, row): - return self.get_row_at_index(row.get_index() + 1) + def _get_row_after(self, + row: CommonWorkspace + ) -> Optional[CommonWorkspace]: + workspace = cast( + CommonWorkspace, self.get_row_at_index(row.get_index() + 1)) + return workspace
def _get_last_workspace_row(self) -> Workspace: # Calling len(children) would include AddWorkspace - return self.get_row_at_index(len(self.get_children()) - 1) + last_workspace = cast( + Workspace, self.get_row_at_index(len(self.get_children()) - 1)) + return last_workspace
def set_drag_row(self, row: Workspace) -> None: self.drag_row = row @@ -185,7 +198,7 @@ def _on_chat_selected(self,
@staticmethod def _on_row_activated(_listbox: Gtk.ListBox, - row: Union[Workspace, AddWorkspace] + row: CommonWorkspace ) -> None: if row.workspace_id == 'add': open_window('WorkspaceDialog') @@ -199,7 +212,9 @@ def add_workspace(self, workspace_id: str) -> None: self.insert(row, len(self.get_children()) - 1)
def store_workspace_order(self) -> None: - order = [row.workspace_id for row in self.get_children()] + workspaces: list[CommonWorkspace] = cast( + list[CommonWorkspace], self.get_children()) + order: list[str] = [row.workspace_id for row in workspaces] order.remove('add') app.settings.set_app_setting('workspace_order', order)
@@ -211,7 +226,7 @@ def remove_workspace(self, workspace_id: str) -> bool: return True
def activate_workspace(self, workspace_id: str) -> None: - row = self.get_selected_row() + row = cast(CommonWorkspace, self.get_selected_row()) if row is not None and row.workspace_id == workspace_id: return
@@ -219,17 +234,24 @@ def activate_workspace(self, workspace_id: str) -> None: self.select_row(row)
def get_active_workspace(self) -> Optional[str]: - row = self.get_selected_row() + row = cast(CommonWorkspace, self.get_selected_row()) if row is None: return None return row.workspace_id
def get_first_workspace(self) -> str: - for row in self.get_children(): + workspaces: list[CommonWorkspace] = cast( + list[CommonWorkspace], self.get_children()) + for row in workspaces: return row.workspace_id - - def get_workspace_by_id(self, workspace_id: str) -> Optional[Workspace]: - for row in self.get_children(): + return '' + + def get_workspace_by_id(self, + workspace_id: str + ) -> Optional[CommonWorkspace]: + workspaces: list[CommonWorkspace] = cast( + list[CommonWorkspace], self.get_children()) + for row in workspaces: if row.workspace_id == workspace_id: return row return None @@ -296,8 +318,8 @@ def _popup_menu(self, _widget: Gtk.Widget, event: Gdk.EventButton) -> None: menu = self._get_workspace_menu()
rectangle = Gdk.Rectangle() - rectangle.x = event.x - rectangle.y = event.y + rectangle.x = int(event.x) + rectangle.y = int(event.y) rectangle.width = rectangle.height = 1
popover = Gtk.Popover.new_from_model(self, menu) @@ -337,9 +359,10 @@ def _on_drag_begin(self, scale = self.get_scale_factor() surface = app.interface.avatar_storage.get_workspace_surface( self.workspace_id, AvatarSize.WORKSPACE, scale) - Gtk.drag_set_icon_surface(drag_context, surface) + if surface is not None: + Gtk.drag_set_icon_surface(drag_context, surface)
- listbox = self.get_parent() + listbox = cast(WorkspaceSideBar, self.get_parent()) listbox.set_drag_row(self)
def _on_drag_data_get(self,
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/compare/355be2949d53c5e2bbd5c42424c74263...