meld r1182 - in trunk: . glade2



Author: kaiw
Date: Wed Feb 25 17:24:41 2009
New Revision: 1182
URL: http://svn.gnome.org/viewvc/meld?rev=1182&view=rev

Log:
Consolidate user-defined filters into a dropdown menu on the toolbar

Since the previously split toolbars were combined, it became very easy to have
user-defined filters take up a lot of toolbar space. This fixes that problem
by having a single "Filters" dropdown menu on the toolbar containing all
user-defined filters.
Menu positioning code taken from Epiphany.


Modified:
   trunk/dirdiff.py
   trunk/glade2/dirdiff-ui.xml
   trunk/misc.py

Modified: trunk/dirdiff.py
==============================================================================
--- trunk/dirdiff.py	(original)
+++ trunk/dirdiff.py	Wed Feb 25 17:24:41 2009
@@ -200,6 +200,8 @@
             ("ShowSame",     gtk.STOCK_APPLY,   _("Same"),     None, _("Show identical"), self.on_filter_state_normal_toggled, True),
             ("ShowNew",      gtk.STOCK_ADD,     _("New"),      None, _("Show new"), self.on_filter_state_new_toggled, True),
             ("ShowModified", gtk.STOCK_REMOVE,  _("Modified"), None, _("Show modified"), self.on_filter_state_modified_toggled, True),
+
+            ("CustomFilterMenu", None, _("Filters"), None, _("Set active filters"), self.on_custom_filter_menu_toggled, False),
         )
         self.ui_file = paths.share_dir("glade2/dirdiff-ui.xml")
         self.actiongroup = gtk.ActionGroup('DirdiffToolbarActions')
@@ -209,7 +211,7 @@
         self.create_name_filters()
         for button in ("DirCompare", "DirCopyLeft", "DirCopyRight",
                        "DirDelete", "Hide", "IgnoreCase", "ShowSame",
-                       "ShowNew", "ShowModified"):
+                       "ShowNew", "ShowModified", "CustomFilterMenu"):
             self.actiongroup.get_action(button).props.is_important = True
         self.map_widgets_into_lists( ["treeview", "fileentry", "diffmap", "scrolledwindow", "linkmap"] )
         self.set_num_panes(num_panes)
@@ -254,6 +256,15 @@
                     misc.run_dialog(
                         text=_("Error converting pattern '%s' to regular expression") % r.value )
 
+    def _custom_popup_deactivated(self, popup):
+        self.filter_menu_button.set_active(False)
+
+    def on_custom_filter_menu_toggled(self, item):
+        if item.get_active():
+            self.custom_popup.connect("deactivate", self._custom_popup_deactivated)
+            self.custom_popup.popup(None, None, misc.position_menu_under_widget,
+                                    1, gtk.get_current_event_time(), self.filter_menu_button)
+
     def on_container_switch_in_event(self, ui):
         melddoc.MeldDoc.on_container_switch_in_event(self, ui)
         ui.insert_action_group(self.filter_actiongroup)
@@ -261,6 +272,11 @@
         for x in self.filter_ui:
             ui.add_ui(self.custom_merge_id, *x)
         self.popup_deactivate_id = self.popup_menu.connect("deactivate", self.on_popup_deactivate_event)
+        self.custom_popup = ui.get_widget("/CustomPopup")
+        self.filter_menu_button = ui.get_widget("/Toolbar/FilterActions/CustomFilterMenu")
+        label = misc.make_tool_button_widget(self.filter_menu_button.props.label)
+        self.filter_menu_button.set_label_widget(label)
+
         if self.treeview_focussed:
             self.scheduler.add_task(self.treeview_focussed.grab_focus)
             self.scheduler.add_task(self.on_treeview_cursor_changed)
@@ -295,8 +311,8 @@
         for i,f in enumerate(self.name_filters_available):
             name = "Hide%d" % i
             callback = lambda b, i=i: self._update_name_filter(b, i)
-            actions.append((name, gtk.STOCK_FIND, f.label, "", _("Hide %s") % f.label, callback, f.active))
-            self.filter_ui.append(["/Toolbar/FilterActions/FilterButtons" , name, name, gtk.UI_MANAGER_TOOLITEM, False])
+            actions.append((name, None, f.label, None, _("Hide %s") % f.label, callback, f.active))
+            self.filter_ui.append(["/CustomPopup" , name, name, gtk.UI_MANAGER_MENUITEM, False])
             self.filter_ui.append(["/Menubar/ViewMenu/FileFilters" , name, name, gtk.UI_MANAGER_MENUITEM, False])
 
         self.filter_actiongroup = gtk.ActionGroup("DirdiffFilterActions")

Modified: trunk/glade2/dirdiff-ui.xml
==============================================================================
--- trunk/glade2/dirdiff-ui.xml	(original)
+++ trunk/glade2/dirdiff-ui.xml	Wed Feb 25 17:24:41 2009
@@ -29,6 +29,7 @@
       <toolitem action="ShowNew" />
       <toolitem action="ShowModified" />
       <separator/>
+      <toolitem action="CustomFilterMenu"/>
       <placeholder name="FilterButtons" />
     </placeholder>
   </toolbar>
@@ -43,5 +44,8 @@
     <separator/>
     <menuitem action="DirDelete" />
   </popup>
+
+  <popup name="CustomPopup">
+  </popup>
 </ui>
 

Modified: trunk/misc.py
==============================================================================
--- trunk/misc.py	(original)
+++ trunk/misc.py	Wed Feb 25 17:24:41 2009
@@ -73,6 +73,50 @@
         except ImportError:
             pass
 
+# Taken from epiphany
+def position_menu_under_widget(menu, widget):
+    container = widget.get_ancestor(gtk.Container)
+
+    widget_width, widget_height = widget.size_request()
+    menu_width, menu_height = menu.size_request()
+
+    screen = menu.get_screen()
+    monitor_num = screen.get_monitor_at_window(widget.window)
+    if monitor_num < 0:
+        monitor_num = 0
+    monitor = screen.get_monitor_geometry(monitor_num)
+
+    x, y = widget.window.get_origin()
+    if widget.flags() & gtk.NO_WINDOW:
+        x += widget.allocation.x
+        y += widget.allocation.y
+
+    if container.get_direction() == gtk.TEXT_DIR_LTR:
+        x += widget.allocation.width - widget_width
+    else:
+        x += widget_width - menu_width
+
+    if (y + widget.allocation.height + menu_height) <= monitor.y + monitor.height:
+        y += widget.allocation.height
+    elif (y - menu_height) >= monitor.y:
+        y -= menu_height
+    elif monitor.y + monitor.height - (y + widget.allocation.height) > y:
+        y += widget.allocation.height
+    else:
+        y -= menu_height
+
+    return (x, y, False)
+
+def make_tool_button_widget(label):
+    """Make a GtkToolButton label-widget suggestive of a menu dropdown"""
+    arrow = gtk.Arrow(gtk.ARROW_DOWN, gtk.SHADOW_NONE)
+    label = gtk.Label(label)
+    hbox = gtk.HBox(spacing=3)
+    hbox.pack_end(arrow)
+    hbox.pack_end(label)
+    hbox.show_all()
+    return hbox
+
 class struct(object):
     """Similar to a dictionary except that members may be accessed as s.member.
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]