add a filter to the tree of rule filters

I can never remember which category filters are in when making a new
rule. This change adds a filter entry above the treeview. As you type,
filters that do not contain the search text (case insensitively) are
made not visible. Categories are always visible, but will no longer
expand if all of their child nodes are hidden.
This commit is contained in:
Tom Samstag 2016-03-13 23:45:09 -07:00
parent d7480aa0ff
commit b96645084a
2 changed files with 61 additions and 7 deletions

View File

@ -455,6 +455,7 @@ class EditRule(ManagedWindow):
self.get_widget('rule_editor_title'),label) self.get_widget('rule_editor_title'),label)
self.window.hide() self.window.hide()
self.valuebox = self.get_widget('valuebox') self.valuebox = self.get_widget('valuebox')
self.rname_filter = self.get_widget('ruletreefilter')
self.rname = self.get_widget('ruletree') self.rname = self.get_widget('ruletree')
self.rule_name = self.get_widget('rulename') self.rule_name = self.get_widget('rulename')
self.description = self.get_widget('description') self.description = self.get_widget('description')
@ -619,11 +620,13 @@ class EditRule(ManagedWindow):
self.page_num = self.page_num + 1 self.page_num = self.page_num + 1
self.page_num = 0 self.page_num = 0
self.store = Gtk.TreeStore(GObject.TYPE_STRING, GObject.TYPE_PYOBJECT) self.store = Gtk.TreeStore(GObject.TYPE_STRING, GObject.TYPE_PYOBJECT)
self.ruletree_filter = self.store.filter_new()
self.ruletree_filter.set_visible_func(self.rtree_visible_func)
self.selection = self.rname.get_selection() self.selection = self.rname.get_selection()
col = Gtk.TreeViewColumn(_('Rule Name'), Gtk.CellRendererText(), col = Gtk.TreeViewColumn(_('Rule Name'), Gtk.CellRendererText(),
text=0) text=0)
self.rname.append_column(col) self.rname.append_column(col)
self.rname.set_model(self.store) self.rname.set_model(self.ruletree_filter)
prev = None prev = None
last_top = None last_top = None
@ -677,6 +680,7 @@ class EditRule(ManagedWindow):
self.get_widget('rule_editor_ok').connect('clicked', self.rule_ok) self.get_widget('rule_editor_ok').connect('clicked', self.rule_ok)
self.get_widget('rule_editor_cancel').connect('clicked', self.close_window) self.get_widget('rule_editor_cancel').connect('clicked', self.close_window)
self.get_widget('rule_editor_help').connect('clicked', self.on_help_clicked) self.get_widget('rule_editor_help').connect('clicked', self.on_help_clicked)
self.rname_filter.connect('changed', self.on_rname_filter_changed)
self._set_size() self._set_size()
self.show() self.show()
@ -735,6 +739,12 @@ class EditRule(ManagedWindow):
class_obj = store.get_value(node, 1) class_obj = store.get_value(node, 1)
self.display_values(class_obj) self.display_values(class_obj)
def on_rname_filter_changed(self, obj):
"""
Update the ruletree based on the filter.
"""
self.ruletree_filter.refilter()
def display_values(self, class_obj): def display_values(self, class_obj):
if class_obj in self.class2page: if class_obj in self.class2page:
page = self.class2page[class_obj] page = self.class2page[class_obj]
@ -765,6 +775,18 @@ class EditRule(ManagedWindow):
except KeyError: except KeyError:
pass pass
def rtree_visible_func(self, model, iter, data):
"""
Callback function to determine if a row of the tree is visible
"""
filter_text = self.rname_filter.get_text()
tree_text = model[iter][0]
children = model[iter].iterchildren()
result = (not tree_text or
children.iter or
filter_text.lower() in tree_text.lower())
return result
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# EditFilter # EditFilter

View File

@ -835,13 +835,45 @@
<property name="shadow_type">in</property> <property name="shadow_type">in</property>
<property name="min_content_width">200</property> <property name="min_content_width">200</property>
<child> <child>
<object class="GtkTreeView" id="ruletree"> <object class="GtkViewport" id="viewport1">
<property name="width_request">250</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">False</property>
<property name="enable_search">False</property> <child>
<child internal-child="selection"> <object class="GtkBox" id="box2">
<object class="GtkTreeSelection" id="treeview-selection4"/> <property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkSearchEntry" id="ruletreefilter">
<property name="visible">True</property>
<property name="can_focus">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>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkTreeView" id="ruletree">
<property name="width_request">250</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="enable_search">False</property>
<child internal-child="selection">
<object class="GtkTreeSelection" id="treeview-selection4"/>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child> </child>
</object> </object>
</child> </child>