From 99d3a6777ece113271835756ae386f2794bc794b Mon Sep 17 00:00:00 2001 From: wurstsalat Date: Sat, 8 Oct 2022 23:35:30 +0200 Subject: imprv: Workspaces: Add 'Mark as read' menu item Fixes #11198 --- gajim/gtk/chat_list.py | 8 ++++++-- gajim/gtk/const.py | 1 + gajim/gtk/main.py | 26 ++++++++++++++++++++++++++ gajim/gtk/menus.py | 9 +++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/gajim/gtk/chat_list.py b/gajim/gtk/chat_list.py index 4cb9479cc..514d69fbd 100644 --- a/gajim/gtk/chat_list.py +++ b/gajim/gtk/chat_list.py @@ -107,8 +107,12 @@ class ChatList(Gtk.ListBox, EventHelper): def workspace_id(self) -> str: return self._workspace_id - def get_unread_count(self) -> int: - return sum(chats.unread_count for chats in self._chats.values()) + def get_unread_count(self, include_silent: bool = False) -> int: + if include_silent: + return sum(chat.get_real_unread_count() for + chat in self._chats.values()) + + return sum(chat.unread_count for chat in self._chats.values()) def get_chat_unread_count(self, account: str, diff --git a/gajim/gtk/const.py b/gajim/gtk/const.py index fc89baff9..dbc6446d7 100644 --- a/gajim/gtk/const.py +++ b/gajim/gtk/const.py @@ -248,6 +248,7 @@ MAIN_WIN_ACTIONS = [ ('edit-workspace', 's', True), ('remove-workspace', 's', True), ('activate-workspace', 's', True), + ('mark-workspace-as-read', 's', True), ('add-chat', 'a{sv}', True), ('add-group-chat', 'as', True), ('add-to-roster', 'a{sv}', True), diff --git a/gajim/gtk/main.py b/gajim/gtk/main.py index 5f234af5c..b707c3888 100644 --- a/gajim/gtk/main.py +++ b/gajim/gtk/main.py @@ -186,6 +186,22 @@ class MainWindow(Gtk.ApplicationWindow, EventHelper): self.deiconify() self.present_with_time(Gtk.get_current_event_time()) + def mark_workspace_as_read(self, workspace: str) -> None: + chat_list_stack = self._chat_page.get_chat_list_stack() + chat_list = chat_list_stack.get_chatlist(workspace) + open_chats = chat_list.get_open_chats() + for chat in open_chats: + self.mark_as_read(chat['account'], chat['jid']) + + def _mark_workspace_as_read(self, + _action: Gio.SimpleAction, + param: GLib.Variant + ) -> None: + + workspace_id = param.get_string() or None + if workspace_id is not None: + self.mark_workspace_as_read(workspace_id) + def _prepare_window(self) -> None: window_width = app.settings.get('mainwin_width') window_height = app.settings.get('mainwin_height') @@ -370,6 +386,7 @@ class MainWindow(Gtk.ApplicationWindow, EventHelper): ('edit-workspace', self._edit_workspace), ('remove-workspace', self._remove_workspace), ('activate-workspace', self._activate_workspace), + ('mark-workspace-as-read', self._mark_workspace_as_read), ('add-chat', self._add_chat), ('add-group-chat', self._add_group_chat), ('add-to-roster', self._add_to_roster), @@ -839,6 +856,15 @@ class MainWindow(Gtk.ApplicationWindow, EventHelper): chat_list_stack = self._chat_page.get_chat_list_stack() return chat_list_stack.get_total_unread_count() + def get_workspace_unread_count(self, + workspace: str, + include_silent: bool = False + ) -> int: + + chat_list_stack = self._chat_page.get_chat_list_stack() + chat_list = chat_list_stack.get_chatlist(workspace) + return chat_list.get_unread_count(include_silent) + def get_chat_unread_count(self, account: str, jid: JID, diff --git a/gajim/gtk/menus.py b/gajim/gtk/menus.py index 8b22d43b8..a852c3130 100644 --- a/gajim/gtk/menus.py +++ b/gajim/gtk/menus.py @@ -597,6 +597,15 @@ def get_workspace_menu(workspace_id: str) -> GajimMenu: (_('Remove'), remove_action, f'"{workspace_id}"'), ] + unread_count = app.window.get_workspace_unread_count( + workspace_id, include_silent=True) + if unread_count: + menuitems.insert( + 0, + (_('Mark as read'), + 'win.mark-workspace-as-read', + f'"{workspace_id}"')) + return GajimMenu.from_list(menuitems) -- cgit v1.2.3