[Sugar-devel] [PATCH v3 sugar-toolkit-gtk3] Fix the drawing of ColorToolButton, RadioToolButton and ToggleToolButton

Manuel Quiñones manuq at laptop.org
Thu Aug 23 20:13:08 EDT 2012


Draw a black background in the buttons when the palette is up, as
commit 01a06943 did with the ToolButton.  As the comment for that
commit states, we can change the prelight background color in the
theme, but not when the mouse moves over the Palette.

Also add testcase to test the three toolbuttons.

Signed-off-by: Manuel Quiñones <manuq at laptop.org>

---

v2: Paint the background color as per Simon's feedback.
v3: Add testcase.
---
 src/sugar3/graphics/colorbutton.py      | 20 +++++++--------
 src/sugar3/graphics/radiotoolbutton.py  | 20 +++++++--------
 src/sugar3/graphics/toggletoolbutton.py | 20 +++++++--------
 tests/graphics/toolbuttons.py           | 45 +++++++++++++++++++++++++++++++++
 4 files changed, 75 insertions(+), 30 deletions(-)
 create mode 100644 tests/graphics/toolbuttons.py

diff --git a/src/sugar3/graphics/colorbutton.py b/src/sugar3/graphics/colorbutton.py
index 95d023a..823fd61 100644
--- a/src/sugar3/graphics/colorbutton.py
+++ b/src/sugar3/graphics/colorbutton.py
@@ -523,20 +523,20 @@ class ColorToolButton(Gtk.ToolItem):
 
     title = GObject.property(type=str, getter=get_title, setter=set_title)
 
-    def do_expose_event(self, event):
+    def do_draw(self, cr):
         child = self.get_child()
         allocation = self.get_allocation()
         if self._palette and self._palette.is_up():
             invoker = self._palette.props.invoker
-            invoker.draw_rectangle(event, self._palette)
-        elif child.state == Gtk.StateType.PRELIGHT:
-            child.style.paint_box(event.window, Gtk.StateType.PRELIGHT,
-                                  Gtk.ShadowType.NONE, event.area,
-                                  child, 'toolbutton-prelight',
-                                  allocation.x, allocation.y,
-                                  allocation.width, allocation.height)
-
-        Gtk.ToolButton.do_expose_event(self, event)
+            invoker.draw_rectangle(cr, self._palette)
+
+            allocation = self.get_allocation()
+            # draw a black background, has been done by the engine before
+            cr.set_source_rgb(0, 0, 0)
+            cr.rectangle(0, 0, allocation.width, allocation.height)
+            cr.paint()
+
+        Gtk.ToolButton.do_draw(self, cr)
 
     def __notify_change(self, widget, pspec):
         self.notify(pspec.name)
diff --git a/src/sugar3/graphics/radiotoolbutton.py b/src/sugar3/graphics/radiotoolbutton.py
index 8fd01f7..006d167 100644
--- a/src/sugar3/graphics/radiotoolbutton.py
+++ b/src/sugar3/graphics/radiotoolbutton.py
@@ -165,18 +165,18 @@ class RadioToolButton(Gtk.RadioToolButton):
     palette_invoker = GObject.property(
         type=object, setter=set_palette_invoker, getter=get_palette_invoker)
 
-    def do_expose_event(self, event):
+    def do_draw(self, cr):
         child = self.get_child()
         allocation = self.get_allocation()
 
         if self.palette and self.palette.is_up():
             invoker = self.palette.props.invoker
-            invoker.draw_rectangle(event, self.palette)
-        elif child.state == Gtk.StateType.PRELIGHT:
-            child.style.paint_box(event.window, Gtk.StateType.PRELIGHT,
-                                  Gtk.ShadowType.NONE, event.area,
-                                  child, 'toolbutton-prelight',
-                                  allocation.x, allocation.y,
-                                  allocation.width, allocation.height)
-
-        Gtk.RadioToolButton.do_expose_event(self, event)
+            invoker.draw_rectangle(cr, self.palette)
+
+            allocation = self.get_allocation()
+            # draw a black background, has been done by the engine before
+            cr.set_source_rgb(0, 0, 0)
+            cr.rectangle(0, 0, allocation.width, allocation.height)
+            cr.paint()
+
+        Gtk.RadioToolButton.do_draw(self, cr)
diff --git a/src/sugar3/graphics/toggletoolbutton.py b/src/sugar3/graphics/toggletoolbutton.py
index c865332..f50d2fd 100644
--- a/src/sugar3/graphics/toggletoolbutton.py
+++ b/src/sugar3/graphics/toggletoolbutton.py
@@ -113,20 +113,20 @@ class ToggleToolButton(Gtk.ToggleToolButton):
     accelerator = GObject.property(type=str, setter=set_accelerator,
                                    getter=get_accelerator)
 
-    def do_expose_event(self, event):
+    def do_draw(self, cr):
         allocation = self.get_allocation()
         child = self.get_child()
 
         if self.palette and self.palette.is_up():
             invoker = self.palette.props.invoker
-            invoker.draw_rectangle(event, self.palette)
-        elif child.state == Gtk.StateType.PRELIGHT:
-            child.style.paint_box(event.window, Gtk.StateType.PRELIGHT,
-                                  Gtk.ShadowType.NONE, event.area,
-                                  child, 'toolbutton-prelight',
-                                  allocation.x, allocation.y,
-                                  allocation.width, allocation.height)
-
-        Gtk.ToggleToolButton.do_expose_event(self, event)
+            invoker.draw_rectangle(cr, self.palette)
+
+            allocation = self.get_allocation()
+            # draw a black background, has been done by the engine before
+            cr.set_source_rgb(0, 0, 0)
+            cr.rectangle(0, 0, allocation.width, allocation.height)
+            cr.paint()
+
+        Gtk.ToggleToolButton.do_draw(self, cr)
 
     palette = property(get_palette, set_palette)
diff --git a/tests/graphics/toolbuttons.py b/tests/graphics/toolbuttons.py
new file mode 100644
index 0000000..c4c8cf8
--- /dev/null
+++ b/tests/graphics/toolbuttons.py
@@ -0,0 +1,45 @@
+from gi.repository import Gtk
+
+from sugar3.graphics.toolbarbox import ToolbarBox
+from sugar3.graphics.colorbutton import ColorToolButton
+from sugar3.graphics.radiotoolbutton import RadioToolButton
+from sugar3.graphics.toggletoolbutton import ToggleToolButton
+
+import common
+
+
+test = common.Test()
+test.show()
+
+vbox = Gtk.VBox()
+test.pack_start(vbox, True, True, 0)
+vbox.show()
+
+toolbar_box = ToolbarBox()
+vbox.pack_start(toolbar_box, False, False, 0)
+toolbar_box.show()
+
+radial_button = RadioToolButton(named_icon='view-radial')
+toolbar_box.toolbar.insert(radial_button, -1)
+radial_button.show()
+
+list_button = RadioToolButton(named_icon='view-list')
+list_button.props.group = radial_button
+toolbar_box.toolbar.insert(list_button, -1)
+list_button.show()
+
+separator = Gtk.SeparatorToolItem()
+toolbar_box.toolbar.insert(separator, -1)
+separator.show()
+
+color_button = ColorToolButton()
+toolbar_box.toolbar.insert(color_button, -1)
+color_button.show()
+
+favorite_button = ToggleToolButton('emblem-favorite')
+toolbar_box.toolbar.insert(favorite_button, -1)
+favorite_button.show()
+
+
+if __name__ == '__main__':
+    common.main(test)
-- 
1.7.11.4



More information about the Sugar-devel mailing list