Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/sugar/graphics
diff options
context:
space:
mode:
Diffstat (limited to 'src/sugar/graphics')
-rw-r--r--src/sugar/graphics/alert.py3
-rw-r--r--src/sugar/graphics/palette.py46
-rw-r--r--src/sugar/graphics/radiotoolbutton.py6
-rw-r--r--src/sugar/graphics/style.py13
-rw-r--r--src/sugar/graphics/toggletoolbutton.py6
-rw-r--r--src/sugar/graphics/toolbutton.py12
-rw-r--r--src/sugar/graphics/tray.py6
7 files changed, 65 insertions, 27 deletions
diff --git a/src/sugar/graphics/alert.py b/src/sugar/graphics/alert.py
index fad90bb..39c373c 100644
--- a/src/sugar/graphics/alert.py
+++ b/src/sugar/graphics/alert.py
@@ -85,7 +85,7 @@ class Alert(gtk.EventBox):
self._buttons_box.set_spacing(style.DEFAULT_SPACING)
self._hbox.pack_start(self._buttons_box)
- gtk.EventBox.__init__(self, **kwargs)
+ gobject.GObject.__init__(self, **kwargs)
self.set_visible_window(True)
self.add(self._hbox)
@@ -105,6 +105,7 @@ class Alert(gtk.EventBox):
if self._msg != value:
self._msg = value
self._msg_label.set_markup(self._msg)
+ self._msg_label.set_line_wrap(True)
elif pspec.name == 'icon':
if self._icon != value:
self._icon = value
diff --git a/src/sugar/graphics/palette.py b/src/sugar/graphics/palette.py
index 2c07389..c0a56fc 100644
--- a/src/sugar/graphics/palette.py
+++ b/src/sugar/graphics/palette.py
@@ -244,9 +244,7 @@ class Palette(gtk.Window):
self._menu_box = None
self._content = None
self._palette_popup_sid = None
- self._enter_invoker_hid = None
- self._leave_invoker_hid = None
- self._right_click_invoker_hid = None
+ self._invoker_hids = []
self.set_group_id("default")
@@ -274,8 +272,12 @@ class Palette(gtk.Window):
self._mouse_detector = MouseSpeedDetector(self, 200, 5)
self._mouse_detector.connect('motion-slow', self._mouse_slow_cb)
- def __destroy_cb(self, palette):
+ def __destroy_cb(self, palette):
self.set_group_id(None)
+
+ # Break the reference cycle. It looks like the gc is not able to free
+ # it, possibly because gtk.Menu memory handling is very special.
+ self.menu = None
if self._palette_popup_sid is not None:
_palette_observer.disconnect(self._palette_popup_sid)
@@ -312,21 +314,27 @@ class Palette(gtk.Window):
return gtk.gdk.Rectangle(x, y, width, height)
def _set_invoker(self, invoker):
- if self._invoker is not None:
- self._invoker.disconnect(self._enter_invoker_hid)
- self._invoker.disconnect(self._leave_invoker_hid)
- self._invoker.disconnect(self._right_click_invoker_hid)
+ for hid in self._invoker_hids[:]:
+ self._invoker.disconnect(hid)
+ self._invoker_hids.remove(hid)
self._invoker = invoker
if invoker is not None:
- self._enter_invoker_hid = self._invoker.connect(
- 'mouse-enter', self._invoker_mouse_enter_cb)
- self._leave_invoker_hid = self._invoker.connect(
- 'mouse-leave', self._invoker_mouse_leave_cb)
- self._right_click_invoker_hid = self._invoker.connect(
- 'right-click', self._invoker_right_click_cb)
+ self._invoker_hids.append(self._invoker.connect(
+ 'mouse-enter', self._invoker_mouse_enter_cb))
+ self._invoker_hids.append(self._invoker.connect(
+ 'mouse-leave', self._invoker_mouse_leave_cb))
+ self._invoker_hids.append(self._invoker.connect(
+ 'right-click', self._invoker_right_click_cb))
if hasattr(invoker.props, 'widget'):
- self._label.props.accel_widget = invoker.props.widget
+ self._update_accel_widget()
+ logging.debug(('Setup widget', invoker.props.widget))
+ self._invoker_hids.append(self._invoker.connect(
+ 'notify::widget', self._invoker_widget_changed_cb))
+
+ def _update_accel_widget(self):
+ assert self.props.invoker is not None
+ self._label.props.accel_widget = self.props.invoker.props.widget
def set_primary_text(self, label, accel_path=None):
self._primary_text = label
@@ -611,6 +619,9 @@ class Palette(gtk.Window):
self.popup(immediate=immediate)
+ def _invoker_widget_changed_cb(self, invoker, spec):
+ self._update_accel_widget()
+
def _invoker_mouse_enter_cb(self, invoker):
self._mouse_detector.start()
@@ -750,6 +761,9 @@ class Invoker(gobject.GObject):
def detach(self):
self.parent = None
+ if self._palette is not None:
+ self._palette.destroy()
+ self._palette = None
def _get_position_for_alignment(self, alignment, palette_dim):
palette_halign = alignment[0]
@@ -939,6 +953,8 @@ class WidgetInvoker(Invoker):
else:
self._widget = parent
+ self.notify('widget')
+
self._enter_hid = self._widget.connect('enter-notify-event',
self.__enter_notify_event_cb)
self._leave_hid = self._widget.connect('leave-notify-event',
diff --git a/src/sugar/graphics/radiotoolbutton.py b/src/sugar/graphics/radiotoolbutton.py
index abdf54c..e2636dc 100644
--- a/src/sugar/graphics/radiotoolbutton.py
+++ b/src/sugar/graphics/radiotoolbutton.py
@@ -36,6 +36,12 @@ class RadioToolButton(gtk.RadioToolButton):
self._palette_invoker.attach_tool(self)
+ self.connect('destroy', self.__destroy_cb)
+
+ def __destroy_cb(self, icon):
+ if self._palette_invoker is not None:
+ self._palette_invoker.detach()
+
def set_tooltip(self, tooltip):
""" Set a simple palette with just a single label.
"""
diff --git a/src/sugar/graphics/style.py b/src/sugar/graphics/style.py
index 1b510d1..ce2abe8 100644
--- a/src/sugar/graphics/style.py
+++ b/src/sugar/graphics/style.py
@@ -46,15 +46,6 @@ def _compute_zoom_factor():
return 1.0
-def _compute_font_height(font):
- widget = gtk.Label('')
-
- context = widget.get_pango_context()
- pango_font = context.load_font(font.get_pango_desc())
- metrics = pango_font.get_metrics()
-
- return pango.PIXELS(metrics.get_ascent() + metrics.get_descent())
-
class Font(object):
def __init__(self, desc):
self._desc = desc
@@ -124,8 +115,8 @@ XLARGE_ICON_SIZE = zoom(55 * 2.75)
FONT_SIZE = zoom(7 * _XO_DPI / _get_screen_dpi())
FONT_NORMAL = Font('Bitstream Vera Sans %d' % FONT_SIZE)
FONT_BOLD = Font('Bitstream Vera Sans bold %d' % FONT_SIZE)
-FONT_NORMAL_H = _compute_font_height(FONT_NORMAL)
-FONT_BOLD_H = _compute_font_height(FONT_BOLD)
+FONT_NORMAL_H = zoom(24)
+FONT_BOLD_H = zoom(24)
TOOLBOX_SEPARATOR_HEIGHT = zoom(9)
TOOLBOX_HORIZONTAL_PADDING = zoom(75)
diff --git a/src/sugar/graphics/toggletoolbutton.py b/src/sugar/graphics/toggletoolbutton.py
index ec622b4..35c4bf1 100644
--- a/src/sugar/graphics/toggletoolbutton.py
+++ b/src/sugar/graphics/toggletoolbutton.py
@@ -30,6 +30,12 @@ class ToggleToolButton(gtk.ToggleToolButton):
self._palette_invoker = ToolInvoker(self)
self.set_named_icon(named_icon)
+ self.connect('destroy', self.__destroy_cb)
+
+ def __destroy_cb(self, icon):
+ if self._palette_invoker is not None:
+ self._palette_invoker.detach()
+
def set_named_icon(self, named_icon):
icon = Icon(icon_name=named_icon)
self.set_icon_widget(icon)
diff --git a/src/sugar/graphics/toolbutton.py b/src/sugar/graphics/toolbutton.py
index bf392c8..a80c67a 100644
--- a/src/sugar/graphics/toolbutton.py
+++ b/src/sugar/graphics/toolbutton.py
@@ -65,6 +65,18 @@ class ToolButton(gtk.ToolButton):
self.set_icon(icon_name)
self.connect('clicked', self.__button_clicked_cb)
+ self.get_child().connect('can-activate-accel',
+ self.__button_can_activate_accel_cb)
+
+ self.connect('destroy', self.__destroy_cb)
+
+ def __destroy_cb(self, icon):
+ if self._palette_invoker is not None:
+ self._palette_invoker.detach()
+
+ def __button_can_activate_accel_cb(self, button, signal_id):
+ # Accept activation via accelerators regardless of this widget's state
+ return True
def set_tooltip(self, tooltip):
""" Set a simple palette with just a single label.
diff --git a/src/sugar/graphics/tray.py b/src/sugar/graphics/tray.py
index 8296a53..d5e9b39 100644
--- a/src/sugar/graphics/tray.py
+++ b/src/sugar/graphics/tray.py
@@ -358,6 +358,12 @@ class TrayIcon(gtk.ToolItem):
self.set_size_request(style.GRID_CELL_SIZE, style.GRID_CELL_SIZE)
+ self.connect('destroy', self.__destroy_cb)
+
+ def __destroy_cb(self, icon):
+ if self._palette_invoker is not None:
+ self._palette_invoker.detach()
+
def create_palette(self):
return None