diff options
Diffstat (limited to 'src/sugar/graphics')
-rw-r--r-- | src/sugar/graphics/alert.py | 3 | ||||
-rw-r--r-- | src/sugar/graphics/palette.py | 46 | ||||
-rw-r--r-- | src/sugar/graphics/radiotoolbutton.py | 6 | ||||
-rw-r--r-- | src/sugar/graphics/style.py | 13 | ||||
-rw-r--r-- | src/sugar/graphics/toggletoolbutton.py | 6 | ||||
-rw-r--r-- | src/sugar/graphics/toolbutton.py | 12 | ||||
-rw-r--r-- | src/sugar/graphics/tray.py | 6 |
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 |