OSDN Git Service

glade: separate out & wrap the item-spinbox widget
authorAndrew Chadwick <andrewc-git@piffle.org>
Sun, 18 Sep 2011 16:29:54 +0000 (17:29 +0100)
committerAndrew Chadwick <andrewc-git@piffle.org>
Sun, 2 Oct 2011 17:38:16 +0000 (18:38 +0100)
The usual drill, but the slight wrinkle is that because it's a
derivative of a Box subclass, Glade would normall ask for a size each
time it's added. Override the setting and hide it since we always need 3
items exactly and the constructor will do that for us.

glade/icons/hicolor/16x16/actions/widget-mypaint-spinbox.png [new file with mode: 0644]
glade/icons/hicolor/22x22/actions/widget-mypaint-spinbox.png [new file with mode: 0644]
glade/mypaint_widgets.py
glade/mypaint_widgets.xml
gui/dialogs.py
gui/widgets.py

diff --git a/glade/icons/hicolor/16x16/actions/widget-mypaint-spinbox.png b/glade/icons/hicolor/16x16/actions/widget-mypaint-spinbox.png
new file mode 100644 (file)
index 0000000..21ede99
Binary files /dev/null and b/glade/icons/hicolor/16x16/actions/widget-mypaint-spinbox.png differ
diff --git a/glade/icons/hicolor/22x22/actions/widget-mypaint-spinbox.png b/glade/icons/hicolor/22x22/actions/widget-mypaint-spinbox.png
new file mode 100644 (file)
index 0000000..547d533
Binary files /dev/null and b/glade/icons/hicolor/22x22/actions/widget-mypaint-spinbox.png differ
index be1cfc5..cb159ce 100644 (file)
@@ -6,3 +6,4 @@ from gui.tileddrawwidget import TiledDrawWidget
 from gui.pixbuflist import PixbufList
 from gui.elastic import ElasticWindow, ElasticVBox, ElasticExpander
 from gui.curve import CurveWidget
+from gui.spinbox import ItemSpinBox
index e9aafed..ea16b48 100644 (file)
                         generic-name="elastic-expander" />
     <glade-widget-class name="CurveWidget" title="Curve Widget"
                         generic-name="curve" />
+    <glade-widget-class name="ItemSpinBox" title="Item SpinBox"
+                        generic-name="spinbox">
+      <properties>
+        <property id="size" save="False" query="False"
+                  default="0" visible="False" />
+      </properties>
+    </glade-widget-class>
+
+
   </glade-widget-classes>
 
   <glade-widget-group name="MyPaint" title="MyPaint Widgets">
@@ -35,6 +44,7 @@
     <glade-widget-class-ref name="ElasticVBox"/>
     <glade-widget-class-ref name="ElasticExpander"/>
     <glade-widget-class-ref name="CurveWidget"/>
+    <glade-widget-class-ref name="ItemSpinBox"/>
   </glade-widget-group>
 
 </glade-catalog>
index 1f18388..9dad7cb 100644 (file)
@@ -14,6 +14,7 @@ from fnmatch import fnmatch
 import brushmanager
 from pixbuflist import PixbufList
 import widgets
+import spinbox
 
 OVERWRITE_THIS = 1
 OVERWRITE_ALL  = 2
@@ -321,8 +322,8 @@ class QuickBrushChooser (gtk.VBox):
         active_group_name = app.preferences.get(self.PREFS_KEY, None)
 
         model = self._make_groups_sb_model()
-        self.groups_sb = widgets.ItemSpinBox(model, self.on_groups_sb_changed,
-                                              active_group_name)
+        self.groups_sb = spinbox.ItemSpinBox(model, self.on_groups_sb_changed,
+                                             active_group_name)
         active_group_name = self.groups_sb.get_value()
         self.bm.ensure_group_previews(active_group_name)
 
index 49543dc..7b0bfdb 100644 (file)
@@ -78,125 +78,6 @@ def section_frame(label_text):
     return frame
 
 
-class ItemSpinBox (gtk.HBox):
-    """Control for selecting one of a small number of text items.
-
-    Somewhat like a `gtk.SpinButton`, but with a textual ``(value,
-    display_value)`` list model, and with the buttons positioned at either
-    end of the central label. Hopefully nothing too unusual.
-
-    Intended as an alternative to `gtk.ComboBox` which doesn't involve any
-    pointer grab breaking, which makes it more useful for dropdown panels.
-    """
-
-    ARROW_SHADOW_TYPE = gtk.SHADOW_OUT
-
-    def __init__(self, model, changed_cb, value=None):
-        gtk.HBox.__init__(self)
-        self._left_button = borderless_button(tooltip=_("Previous item"))
-        self._left_button.add(gtk.Arrow(gtk.ARROW_LEFT, self.ARROW_SHADOW_TYPE))
-        self._left_button.connect("clicked", self._spin_button_clicked, -1)
-        self._right_button = borderless_button(tooltip=_("Next item"))
-        self._right_button.add(gtk.Arrow(gtk.ARROW_RIGHT, self.ARROW_SHADOW_TYPE))
-        self._right_button.connect("clicked", self._spin_button_clicked, 1)
-        self._label = gtk.Label()
-        self.pack_start(self._left_button, False, False)
-        self.pack_start(self._label, True, True)
-        self.pack_start(self._right_button, False, False)
-        self._changed_cb = changed_cb
-        self._model = None
-        self._model_index = None
-        self.set_model(model, value)
-
-    def set_model(self, model, value=None):
-        """Set the model.
-
-        The `model` argument is either `None`, or a list of pairs of the form
-        ``[(value, text), ...]``. The ``value``s must be unique and testable by
-        equality. The ``text`` values are what is displayed in the label area
-        of the `ItemSpinBox` widget.
-        """
-        old_index = self._model_index
-        old_value = None
-        old_text = None
-        if old_index is not None:
-            old_value, old_text = self.model[old_index]
-
-        self._model = model
-        self._model_index = None
-        text = None
-        if value is None:
-            value = old_value
-        self.set_value(value)
-
-        model_valid = self._is_model_valid()
-        buttons_sensitive = model_valid and len(self._model) > 1
-        self._left_button.set_sensitive(buttons_sensitive)
-        self._right_button.set_sensitive(buttons_sensitive)
-
-
-    def _is_model_valid(self):
-        if self._model is None: return False
-        if not self._model: return False
-        if self._model_index is None: return False
-        if self._model_index < 0: return False
-        if self._model_index >= len(self._model): return False
-        return True
-
-
-    def _update_label(self):
-        if not self._is_model_valid():
-            text = _("(Nothing to show)")
-            self._label.set_sensitive(False)
-        else:
-            value, text = self._model[self._model_index]
-            self._label.set_sensitive(True)
-        self._label.set_text(text)
-
-
-    def get_value(self):
-        if not self._is_model_valid():
-            return None
-        value, text = self._model[self._model_index]
-        return value
-
-
-    def set_value(self, value, notify=False):
-        new_value = None
-        if not self._model:
-            self._model_index = None
-            self._update_label()
-            new_value = None
-        else:
-            found = False
-            for i, entry in enumerate(self._model):
-                v, t = entry
-                if v == value:
-                    self._model_index = i
-                    self._update_label()
-                    new_value = v
-                    found = True
-                    break
-            if not found:
-                self._model_index = 0
-                self._update_label()
-                new_value = self._model[0][0]
-        if notify:
-            self._changed_cb(new_value)
-
-
-    def _spin_button_clicked(self, widget, delta):
-        if not self._is_model_valid():
-            return
-        i = self._model_index + delta
-        while i < 0:
-            i += len(self._model)
-        i %= len(self._model)
-        self._model_index = i
-        self._update_label()
-        self._changed_cb(self.get_value())
-
-
 def find_widgets(widget, predicate):
     """Finds widgets in a container's tree by predicate.
     """
@@ -330,44 +211,3 @@ class ColorChangerHSV (gtk.Alignment):
             dialogs.change_current_color_detailed(self.app)
         current.connect("button-press-event", on_button_press)
         prev.connect("button-press-event", on_button_press)
-
-
-
-
-if __name__ == '__main__':
-    win = gtk.Window()
-    win.set_title("misc widgets")
-    win.connect("destroy", gtk.main_quit)
-
-    outer_vbox = gtk.VBox()
-    outer_vbox.set_border_width(SPACING)
-    win.add(outer_vbox)
-
-    frame = section_frame("Item spin buttons")
-    outer_vbox.pack_start(frame, True, True)
-    vbox = gtk.VBox()
-    vbox.set_border_width(SPACING)
-    vbox.set_spacing(SPACING_TIGHT)
-    frame.add(vbox)
-
-    def changed_cb(new_value):
-        print "SSB changed:", new_value
-
-    sb0 = ItemSpinBox(None, changed_cb)
-    vbox.pack_start(sb0, False, False)
-
-    model1 = list(enumerate("Apple Orange Pear Banana Lychee Herring Guava".split()))
-    sb1 = ItemSpinBox(model1, changed_cb)
-    vbox.pack_start(sb1, False, False)
-
-    sb1a = ItemSpinBox(model1, changed_cb, 4)
-    vbox.pack_start(sb1a, False, False)
-
-    model2 = [(0, "Single value")]
-    sb2 = ItemSpinBox(model2, changed_cb)
-    vbox.pack_start(sb2, False, False)
-
-    #win.set_size_request(200, 150)
-
-    win.show_all()
-    gtk.main()