Daniel Brötzmann pushed to branch mainwindow at gajim / gajim
Commits: 309fe475 by wurstsalat at 2021-05-02T15:04:16+02:00 StartChat: Add filter bar
- - - - -
5 changed files:
- gajim/data/gui/start_chat_dialog.ui - + gajim/data/icons/hicolor/16x16/devices/feather-filter-symbolic.symbolic.png - + gajim/data/icons/hicolor/32x32/devices/feather-filter-symbolic.symbolic.png - + gajim/data/icons/hicolor/scalable/devices/feather-filter-symbolic.svg - gajim/gtk/start_chat.py
Changes:
===================================== gajim/data/gui/start_chat_dialog.ui ===================================== @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<!-- Generated with glade 3.36.0 --> +<!-- Generated with glade 3.38.2 --> <interface> <requires lib="gtk+" version="3.22"/> <object class="GtkListStore" id="account_store"> @@ -14,24 +14,24 @@ </object> <object class="GtkStack" id="stack"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <signal name="notify::visible-child-name" handler="_on_page_changed" swapped="no"/> <child> <object class="GtkBox"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> <child> <object class="GtkInfoBar" id="infobar"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="homogeneous">True</property> - <property name="show_close_button">True</property> + <property name="show-close-button">True</property> <signal name="response" handler="_on_infobar_response" swapped="no"/> <child internal-child="action_area"> <object class="GtkButtonBox"> - <property name="can_focus">False</property> - <property name="layout_style">end</property> + <property name="can-focus">False</property> + <property name="layout-style">end</property> <child> <placeholder/> </child> @@ -44,13 +44,13 @@ </child> <child internal-child="content_area"> <object class="GtkBox"> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="spacing">6</property> <child> <object class="GtkImage"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="icon_name">dialog-information-symbolic</property> + <property name="can-focus">False</property> + <property name="icon-name">dialog-information-symbolic</property> <property name="icon_size">3</property> </object> <packing> @@ -62,10 +62,10 @@ <child> <object class="GtkLabel"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="label" translatable="yes">Start a new chat, join a group chat or search for new group chats globally. You can also enter an XMPP address.</property> <property name="wrap">True</property> - <property name="max_width_chars">46</property> + <property name="max-width-chars">46</property> <property name="xalign">0</property> </object> <packing> @@ -91,25 +91,26 @@ <child> <object class="GtkBox" id="box"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="border_width">18</property> + <property name="can-focus">False</property> + <property name="border-width">18</property> <property name="orientation">vertical</property> <property name="spacing">6</property> <child> <object class="GtkBox"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="spacing">6</property> <child> <object class="GtkSearchEntry" id="search_entry"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="has_focus">True</property> - <property name="is_focus">True</property> + <property name="can-focus">True</property> + <property name="has-focus">True</property> + <property name="is-focus">True</property> <property name="hexpand">True</property> - <property name="primary_icon_name">edit-find-symbolic</property> - <property name="primary_icon_activatable">False</property> - <property name="primary_icon_sensitive">False</property> + <property name="primary-icon-name">edit-find-symbolic</property> + <property name="primary-icon-activatable">False</property> + <property name="primary-icon-sensitive">False</property> + <property name="placeholder-text" translatable="yes">Search…</property> </object> <packing> <property name="expand">False</property> @@ -117,30 +118,104 @@ <property name="position">0</property> </packing> </child> + <child> + <object class="GtkToggleButton" id="filter_bar_toggle"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="tooltip-text" translatable="yes">Filter Chats</property> + <property name="halign">end</property> + <signal name="toggled" handler="_on_filter_bar_toggled" swapped="no"/> + <child> + <object class="GtkImage"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="icon-name">feather-filter-symbolic</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> <child> <object class="GtkToggleButton" id="global_search_toggle"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Global Group Chat Search</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="tooltip-text" translatable="yes">Global Group Chat Search</property> <property name="halign">end</property> <property name="relief">half</property> <signal name="toggled" handler="_on_global_search_toggle" swapped="no"/> <child> <object class="GtkImage"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="icon_name">feather-globe-symbolic</property> + <property name="can-focus">False</property> + <property name="icon-name">feather-globe-symbolic</property> </object> </child> </object> <packing> <property name="expand">False</property> <property name="fill">True</property> - <property name="position">1</property> + <property name="position">2</property> </packing> </child> </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkRevealer" id="filter_bar_revealer"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="transition-duration">100</property> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">center</property> + <child> + <object class="GtkToggleButton" id="filter_chats"> + <property name="label" translatable="yes">Chats</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="active">True</property> + <signal name="toggled" handler="_on_filter_toggled" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkToggleButton" id="filter_groupchats"> + <property name="label" translatable="yes">Group Chats</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="active">True</property> + <signal name="toggled" handler="_on_filter_toggled" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <style> + <class name="linked"/> + </style> + </object> + </child> + </object> <packing> <property name="expand">False</property> <property name="fill">True</property> @@ -150,20 +225,20 @@ <child> <object class="GtkScrolledWindow" id="scrolledwindow"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hscrollbar_policy">never</property> - <property name="shadow_type">in</property> + <property name="can-focus">True</property> + <property name="hscrollbar-policy">never</property> + <property name="shadow-type">in</property> <child> <object class="GtkViewport"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <child> <object class="GtkListBox" id="listbox"> <property name="name">StartChatListBox</property> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="selection_mode">browse</property> - <property name="activate_on_single_click">False</property> + <property name="can-focus">False</property> + <property name="selection-mode">browse</property> + <property name="activate-on-single-click">False</property> </object> </child> </object> @@ -190,12 +265,12 @@ <child> <object class="GtkBox"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> <child> <object class="GtkSpinner" id="spinner"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="halign">center</property> <property name="valign">center</property> <property name="vexpand">True</property> @@ -216,21 +291,21 @@ <child> <object class="GtkBox"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> <child> <object class="GtkBox"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> <property name="spacing">12</property> <property name="homogeneous">True</property> <child> <object class="GtkImage"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="valign">end</property> - <property name="icon_name">dialog-error</property> + <property name="icon-name">dialog-error</property> <property name="icon_size">6</property> </object> <packing> @@ -242,7 +317,7 @@ <child> <object class="GtkLabel" id="error_label"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="valign">start</property> <property name="justify">center</property> <property name="wrap">True</property> @@ -267,16 +342,16 @@ <object class="GtkButton"> <property name="label" translatable="yes">_Back</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> <property name="halign">start</property> - <property name="use_underline">True</property> + <property name="use-underline">True</property> <signal name="clicked" handler="_on_back_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> <property name="fill">True</property> - <property name="pack_type">end</property> + <property name="pack-type">end</property> <property name="position">1</property> </packing> </child> @@ -292,7 +367,7 @@ <child> <object class="GtkBox" id="info_box"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> <property name="spacing">6</property> <child> @@ -301,11 +376,11 @@ <child> <object class="GtkBox"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <child> <object class="GtkBox" id="join_box"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <child> <placeholder/> </child> @@ -313,10 +388,10 @@ <object class="GtkButton" id="join_button"> <property name="label" translatable="yes">_Join</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> <property name="halign">end</property> - <property name="use_underline">True</property> + <property name="use-underline">True</property> <signal name="clicked" handler="_on_join_clicked" swapped="no"/> <style> <class name="suggested-action"/> @@ -325,7 +400,7 @@ <packing> <property name="expand">False</property> <property name="fill">True</property> - <property name="pack_type">end</property> + <property name="pack-type">end</property> <property name="position">1</property> </packing> </child> @@ -336,7 +411,7 @@ <packing> <property name="expand">False</property> <property name="fill">True</property> - <property name="pack_type">end</property> + <property name="pack-type">end</property> <property name="position">1</property> </packing> </child> @@ -344,10 +419,10 @@ <object class="GtkButton"> <property name="label" translatable="yes">_Back</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> <property name="halign">start</property> - <property name="use_underline">True</property> + <property name="use-underline">True</property> <signal name="clicked" handler="_on_back_clicked" swapped="no"/> </object> <packing> @@ -360,7 +435,7 @@ <packing> <property name="expand">False</property> <property name="fill">True</property> - <property name="pack_type">end</property> + <property name="pack-type">end</property> <property name="position">1</property> </packing> </child> @@ -376,13 +451,13 @@ <child> <object class="GtkBox"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> <property name="spacing">6</property> <child> <object class="GtkLabel"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="label" translatable="yes">Select Account</property> <property name="justify">center</property> <property name="wrap">True</property> @@ -400,18 +475,18 @@ <child> <object class="GtkScrolledWindow"> <property name="visible">True</property> - <property name="can_focus">True</property> + <property name="can-focus">True</property> <property name="vexpand">True</property> - <property name="hscrollbar_policy">never</property> - <property name="shadow_type">in</property> + <property name="hscrollbar-policy">never</property> + <property name="shadow-type">in</property> <child> <object class="GtkTreeView" id="account_view"> <property name="visible">True</property> - <property name="can_focus">True</property> + <property name="can-focus">True</property> <property name="model">account_store</property> - <property name="headers_visible">False</property> - <property name="enable_search">False</property> - <property name="show_expanders">False</property> + <property name="headers-visible">False</property> + <property name="enable-search">False</property> + <property name="show-expanders">False</property> <signal name="row-activated" handler="_on_select_clicked" swapped="no"/> <child internal-child="selection"> <object class="GtkTreeSelection"/> @@ -454,16 +529,16 @@ <child> <object class="GtkBox"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="homogeneous">True</property> <child> <object class="GtkButton"> <property name="label" translatable="yes">_Back</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> <property name="halign">start</property> - <property name="use_underline">True</property> + <property name="use-underline">True</property> <signal name="clicked" handler="_on_back_clicked" swapped="no"/> </object> <packing> @@ -476,10 +551,10 @@ <object class="GtkButton"> <property name="label" translatable="yes">_Select</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> <property name="halign">end</property> - <property name="use_underline">True</property> + <property name="use-underline">True</property> <signal name="clicked" handler="_on_select_clicked" swapped="no"/> <style> <class name="suggested-action"/> @@ -495,7 +570,7 @@ <packing> <property name="expand">False</property> <property name="fill">True</property> - <property name="pack_type">end</property> + <property name="pack-type">end</property> <property name="position">2</property> </packing> </child> @@ -511,7 +586,7 @@ </object> <object class="GtkBox" id="placeholder"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="halign">center</property> <property name="valign">center</property> <property name="orientation">vertical</property> @@ -519,8 +594,8 @@ <child> <object class="GtkImage"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="icon_name">avatar-default-symbolic</property> + <property name="can-focus">False</property> + <property name="icon-name">avatar-default-symbolic</property> <property name="icon_size">6</property> <style> <class name="dim-label"/> @@ -535,12 +610,12 @@ <child> <object class="GtkLabel"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="label" translatable="yes">No contacts found You can also type an XMPP address</property> <property name="justify">center</property> <property name="wrap">True</property> - <property name="max_width_chars">35</property> + <property name="max-width-chars">35</property> <style> <class name="dim-label"/> </style>
===================================== gajim/data/icons/hicolor/16x16/devices/feather-filter-symbolic.symbolic.png ===================================== Binary files /dev/null and b/gajim/data/icons/hicolor/16x16/devices/feather-filter-symbolic.symbolic.png differ
===================================== gajim/data/icons/hicolor/32x32/devices/feather-filter-symbolic.symbolic.png ===================================== Binary files /dev/null and b/gajim/data/icons/hicolor/32x32/devices/feather-filter-symbolic.symbolic.png differ
===================================== gajim/data/icons/hicolor/scalable/devices/feather-filter-symbolic.svg ===================================== @@ -0,0 +1,60 @@ +<?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-filter" + version="1.1" + id="svg4" + sodipodi:docname="feather-filter-symbolic.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15, custom)"> + <metadata + id="metadata10"> + 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="defs8" /> + <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="namedview6" + 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="svg4" /> + <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 2 2 A 1.0001 1.0001 0 0 0 1.2363281 3.6464844 L 9 12.826172 L 9 19 A 1.0001 1.0001 0 0 0 9.5527344 19.894531 L 13.552734 21.894531 A 1.0001 1.0001 0 0 0 15 21 L 15 12.826172 L 22.763672 3.6464844 A 1.0001 1.0001 0 0 0 22 2 L 2 2 z M 4.15625 4 L 19.84375 4 L 13.236328 11.814453 A 1.0001 1.0001 0 0 0 13 12.460938 L 13 19.382812 L 11 18.382812 L 11 12.460938 A 1.0001 1.0001 0 0 0 10.763672 11.814453 L 4.15625 4 z " + id="polygon2" /> +</svg>
===================================== gajim/gtk/start_chat.py ===================================== @@ -283,6 +283,13 @@ def _on_infobar_response(self, _widget, response): self._ui.infobar.set_revealed(False) app.settings.set('show_help_start_chat', False)
+ def _on_filter_bar_toggled(self, toggle_button): + active = toggle_button.get_active() + self._ui.filter_bar_revealer.set_reveal_child(active) + + def _on_filter_toggled(self, _toggle_button): + self._ui.listbox.invalidate_filter() + def _start_new_chat(self, row): if row.new: try: @@ -406,6 +413,8 @@ def _on_global_search_toggle(self, button): self._ui.search_entry.grab_focus() image_style_context = button.get_children()[0].get_style_context() if button.get_active(): + self._ui.filter_bar_toggle.set_active(False) + self._ui.filter_bar_toggle.set_sensitive(False) image_style_context.add_class('selected-color') self._set_listbox(self._global_search_listbox) if self._ui.search_entry.get_text(): @@ -413,6 +422,7 @@ def _on_global_search_toggle(self, button): self._remove_new_jid_row() self._ui.listbox.invalidate_filter() else: + self._ui.filter_bar_toggle.set_sensitive(True) self._ui.search_entry.set_text('') image_style_context.remove_class('selected-color') self._set_listbox(self._ui.listbox) @@ -496,6 +506,14 @@ def _filter_func(self, row, _user_data): search_text = self._ui.search_entry.get_text().lower() search_text_list = search_text.split() row_text = row.get_search_text().lower() + + show_chats = self._ui.filter_chats.get_active() + show_groupchats = self._ui.filter_groupchats.get_active() + if row.groupchat and not show_groupchats: + return False + if not row.groupchat and not show_chats: + return False + for text in search_text_list: if text not in row_text: GLib.timeout_add(50, self.select_first_row)
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/commit/309fe475b4f667fa1fae93e6541071c40...