Daniel Brötzmann pushed to branch mainwindow at gajim / gajim
Commits: ec5018d6 by wurstsalat at 2021-05-16T12:53:32+02:00 ChatPage: Add ChatFilter
- - - - -
13 changed files:
- gajim/data/gui/chat_list_row.ui - gajim/data/gui/chat_paned.ui - + gajim/data/icons/hicolor/16x16/devices/feather-user-symbolic.symbolic.png - + gajim/data/icons/hicolor/16x16/devices/feather-users-symbolic.symbolic.png - + gajim/data/icons/hicolor/32x32/devices/feather-user-symbolic.symbolic.png - + gajim/data/icons/hicolor/32x32/devices/feather-users-symbolic.symbolic.png - + gajim/data/icons/hicolor/scalable/devices/feather-user-symbolic.svg - + gajim/data/icons/hicolor/scalable/devices/feather-users-symbolic.svg - gajim/data/style/gajim.css - gajim/gtk/chat_filter.py - gajim/gtk/chat_list.py - gajim/gtk/chat_list_stack.py - gajim/gtk/chat_page.py
Changes:
===================================== gajim/data/gui/chat_list_row.ui ===================================== @@ -64,7 +64,7 @@ <object class="GtkImage" id="group_chat_indicator"> <property name="can-focus">False</property> <property name="no-show-all">True</property> - <property name="icon-name">system-users-symbolic</property> + <property name="icon-name">feather-users-symbolic</property> <property name="icon_size">1</property> <style> <class name="dim-label"/>
===================================== gajim/data/gui/chat_paned.ui ===================================== @@ -15,8 +15,8 @@ <property name="vexpand">True</property> <property name="orientation">vertical</property> <child> - <!-- n-columns=1 n-rows=3 --> - <object class="GtkGrid"> + <!-- n-columns=1 n-rows=4 --> + <object class="GtkGrid" id="header_bar"> <property name="visible">True</property> <property name="can-focus">False</property> <property name="row-spacing">3</property> @@ -72,15 +72,13 @@ <object class="GtkSeparator"> <property name="visible">True</property> <property name="can-focus">False</property> - <property name="margin-left">6</property> - <property name="margin-right">6</property> <property name="margin-start">6</property> <property name="margin-end">6</property> <property name="margin-top">12</property> </object> <packing> <property name="left-attach">0</property> - <property name="top-attach">2</property> + <property name="top-attach">3</property> </packing> </child> <child> @@ -127,9 +125,12 @@ </object> <packing> <property name="left-attach">0</property> - <property name="top-attach">1</property> + <property name="top-attach">2</property> </packing> </child> + <child> + <placeholder/> + </child> <style> <class name="chatlist-top-bar"/> </style>
===================================== gajim/data/icons/hicolor/16x16/devices/feather-user-symbolic.symbolic.png ===================================== Binary files /dev/null and b/gajim/data/icons/hicolor/16x16/devices/feather-user-symbolic.symbolic.png differ
===================================== gajim/data/icons/hicolor/16x16/devices/feather-users-symbolic.symbolic.png ===================================== Binary files /dev/null and b/gajim/data/icons/hicolor/16x16/devices/feather-users-symbolic.symbolic.png differ
===================================== gajim/data/icons/hicolor/32x32/devices/feather-user-symbolic.symbolic.png ===================================== Binary files /dev/null and b/gajim/data/icons/hicolor/32x32/devices/feather-user-symbolic.symbolic.png differ
===================================== gajim/data/icons/hicolor/32x32/devices/feather-users-symbolic.symbolic.png ===================================== Binary files /dev/null and b/gajim/data/icons/hicolor/32x32/devices/feather-users-symbolic.symbolic.png differ
===================================== gajim/data/icons/hicolor/scalable/devices/feather-user-symbolic.svg ===================================== @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="24" + height="24" + viewBox="0 0 24 24" + fill="none" + stroke="currentColor" + stroke-width="2" + stroke-linecap="round" + stroke-linejoin="round" + class="feather feather-user" + version="1.1" + id="svg6" + sodipodi:docname="feather-user-symbolic.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15, custom)"> + <metadata + id="metadata12"> + rdf:RDF + <cc:Work + rdf:about=""> + dc:formatimage/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs10" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="998" + id="namedview8" + showgrid="false" + inkscape:zoom="34.291667" + inkscape:cx="12" + inkscape:cy="12" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="svg6" /> + <path + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1;opacity:1" + d="M 8 14 C 5.2504209 14 3 16.250421 3 19 L 3 21 A 1 1 0 0 0 4 22 A 1 1 0 0 0 5 21 L 5 19 C 5 17.331301 6.3313011 16 8 16 L 16 16 C 17.668699 16 19 17.331301 19 19 L 19 21 A 1 1 0 0 0 20 22 A 1 1 0 0 0 21 21 L 21 19 C 21 16.250421 18.749579 14 16 14 L 8 14 z " + id="path2" /> + <path + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1;opacity:1" + d="M 12 2 C 9.2504209 2 7 4.2504209 7 7 C 7 9.7495791 9.2504209 12 12 12 C 14.749579 12 17 9.7495791 17 7 C 17 4.2504209 14.749579 2 12 2 z M 12 4 C 13.668699 4 15 5.3313011 15 7 C 15 8.6686989 13.668699 10 12 10 C 10.331301 10 9 8.6686989 9 7 C 9 5.3313011 10.331301 4 12 4 z " + id="circle4" /> +</svg>
===================================== gajim/data/icons/hicolor/scalable/devices/feather-users-symbolic.svg ===================================== @@ -0,0 +1,72 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="24" + height="24" + viewBox="0 0 24 24" + fill="none" + stroke="currentColor" + stroke-width="2" + stroke-linecap="round" + stroke-linejoin="round" + class="feather feather-users" + version="1.1" + id="svg10" + sodipodi:docname="feather-users-symbolic.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15, custom)"> + <metadata + id="metadata16"> + rdf:RDF + <cc:Work + rdf:about=""> + dc:formatimage/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs14" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="998" + id="namedview12" + showgrid="false" + inkscape:zoom="34.291667" + inkscape:cx="12" + inkscape:cy="12" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="svg10" /> + <path + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1;opacity:1" + d="M 5 14 C 2.2504209 14 1.7763568e-15 16.250421 0 19 L 0 21 A 1 1 0 0 0 1 22 A 1 1 0 0 0 2 21 L 2 19 C 2 17.331301 3.3313011 16 5 16 L 13 16 C 14.668699 16 16 17.331301 16 19 L 16 21 A 1 1 0 0 0 17 22 A 1 1 0 0 0 18 21 L 18 19 C 18 16.250421 15.749579 14 13 14 L 5 14 z " + id="path2" /> + <path + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1;opacity:1" + d="M 9 2 C 6.2504209 2 4 4.2504209 4 7 C 4 9.7495791 6.2504209 12 9 12 C 11.749579 12 14 9.7495791 14 7 C 14 4.2504209 11.749579 2 9 2 z M 9 4 C 10.668699 4 12 5.3313011 12 7 C 12 8.6686989 10.668699 10 9 10 C 7.3313011 10 6 8.6686989 6 7 C 6 5.3313011 7.3313011 4 9 4 z " + id="circle4" /> + <path + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1;opacity:1" + d="M 20 14.130859 A 1 1 0 0 0 19.03125 14.880859 A 1 1 0 0 0 19.75 16.097656 C 21.078577 16.440693 21.998977 17.627852 22 19 L 22 21 A 1 1 0 0 0 23 22 A 1 1 0 0 0 24 21 L 24 19 C 23.998304 16.726383 22.451421 14.730513 20.25 14.162109 A 1 1 0 0 0 20 14.130859 z " + id="path6" /> + <path + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1;opacity:1" + d="M 15.998047 2.1308594 A 1 1 0 0 0 15.03125 2.8828125 A 1 1 0 0 0 15.751953 4.0996094 C 17.32674 4.5028185 18.007812 5.722745 18.007812 7.0058594 C 18.007812 8.2889738 17.32674 9.5089002 15.751953 9.9121094 A 1 1 0 0 0 15.03125 11.128906 A 1 1 0 0 0 16.248047 11.849609 C 18.683717 11.225979 20.007812 9.0843253 20.007812 7.0058594 C 20.007812 4.9273934 18.683717 2.7857396 16.248047 2.1621094 A 1 1 0 0 0 15.998047 2.1308594 z " + id="path8" /> +</svg>
===================================== gajim/data/style/gajim.css ===================================== @@ -263,6 +263,13 @@ padding: 12px; background: transparent; } +.chat-filter-icons { + background: transparent; +} +.chat-filter-icons button { + color: @insensitive_fg_color; +} + .chatlist { background: transparent; }
===================================== gajim/gtk/chat_filter.py ===================================== @@ -26,26 +26,40 @@ class ChatFilter(Gtk.Box): (str, )), }
- def __init__(self): + def __init__(self, icons=False): Gtk.Box.__init__(self) self.set_halign(Gtk.Align.CENTER)
toolbar = Gtk.Toolbar() + if icons: + toolbar.get_style_context().add_class('chat-filter-icons')
all_button = Gtk.RadioToolButton.new_from_widget(None) - all_button.set_label(_('All')) + if icons: + all_button.set_icon_name('feather-home-symbolic') + all_button.set_tooltip_text(_('All')) + else: + all_button.set_label(_('All')) all_button.set_name('all') all_button.connect('clicked', self._on_button_clicked) toolbar.insert(all_button, 1)
chats_button = Gtk.RadioToolButton.new_from_widget(all_button) - chats_button.set_label(_('Chats')) + if icons: + chats_button.set_icon_name('feather-user-symbolic') + chats_button.set_tooltip_text(_('Chats')) + else: + chats_button.set_label(_('Chats')) chats_button.set_name('chats') chats_button.connect('clicked', self._on_button_clicked) toolbar.insert(chats_button, 2)
group_chats_button = Gtk.RadioToolButton.new_from_widget(all_button) - group_chats_button.set_label(_('Group Chats')) + if icons: + group_chats_button.set_icon_name('feather-users-symbolic') + group_chats_button.set_tooltip_text(_('Group Chats')) + else: + group_chats_button.set_label(_('Group Chats')) group_chats_button.set_name('group_chats') group_chats_button.connect('clicked', self._on_button_clicked) toolbar.insert(group_chats_button, 3)
===================================== gajim/gtk/chat_list.py ===================================== @@ -42,6 +42,7 @@ def __init__(self, workspace_id): EventHelper.__init__(self)
self._chats = {} + self._current_filter = 'all' self._current_filter_text = '' self._workspace_id = workspace_id
@@ -86,6 +87,13 @@ def _update_timer(self): return True
def _filter_func(self, row): + is_groupchat = row.type == 'groupchat' + if self._current_filter == 'chats' and is_groupchat: + return False + + if self._current_filter == 'group_chats' and not is_groupchat: + return False + if not self._current_filter_text: return True text = self._current_filter_text.lower() @@ -145,6 +153,10 @@ def _set_placeholder(self): def _on_start_chat_clicked(_widget): app.app.activate_action('start-chat', GLib.Variant('s', ''))
+ def set_filter(self, name): + self._current_filter = name + self.invalidate_filter() + def set_filter_text(self, text): self._current_filter_text = text self.invalidate_filter()
===================================== gajim/gtk/chat_list_stack.py ===================================== @@ -49,7 +49,7 @@ class ChatListStack(Gtk.Stack): (str, str, str)), }
- def __init__(self, search_entry): + def __init__(self, chat_filter, search_entry): Gtk.Stack.__init__(self) self.set_hexpand(True) self.set_vexpand(True) @@ -63,6 +63,7 @@ def __init__(self, search_entry):
self.connect('notify::visible-child-name', self._on_visible_child_name) search_entry.connect('search-changed', self._on_search_changed) + chat_filter.connect('filter-changed', self._on_filter_changed) app.window.connect('notify::is-active', self._on_window_active)
self._add_actions() @@ -122,6 +123,10 @@ def is_chat_active(self, account, jid): return False return chat.is_active
+ def _on_filter_changed(self, _filter, name): + chat_list = self.get_visible_child() + chat_list.set_filter(name) + def _on_search_changed(self, search_entry): chat_list = self.get_visible_child() chat_list.set_filter_text(search_entry.get_text())
===================================== gajim/gtk/chat_page.py ===================================== @@ -22,6 +22,7 @@ from gajim.common.i18n import _
from .util import get_builder +from .chat_filter import ChatFilter from .chat_list_stack import ChatListStack from .chat_stack import ChatStack from .search_view import SearchView @@ -59,7 +60,11 @@ def __init__(self): self._search_revealer.add(self._search_view) self._ui.right_grid_overlay.add_overlay(self._search_revealer)
- self._chat_list_stack = ChatListStack(self._ui.search_entry) + self._chat_filter = ChatFilter(icons=True) + self._ui.header_bar.attach(self._chat_filter, 0, 1, 1, 1) + + self._chat_list_stack = ChatListStack( + self._chat_filter, self._ui.search_entry) self._chat_list_stack.connect('chat-selected', self._on_chat_selected) self._chat_list_stack.connect('chat-unselected', self._on_chat_unselected)
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/commit/ec5018d651419867f56da8523bc381e2f...