From 1db4cd77d3fb3d424f92adcdf4ed2d46cf15cae4 Mon Sep 17 00:00:00 2001 From: Morgan Collett Date: Thu, 16 Aug 2007 15:17:23 +0000 Subject: Merge branch 'master' of git://dev.laptop.org/sugar --- (limited to 'sugar') diff --git a/sugar/datastore/dbus_helpers.py b/sugar/datastore/dbus_helpers.py index f0cfa3b..442a35d 100644 --- a/sugar/datastore/dbus_helpers.py +++ b/sugar/datastore/dbus_helpers.py @@ -28,55 +28,63 @@ DS_DBUS_SERVICE = "org.laptop.sugar.DataStore" DS_DBUS_INTERFACE = "org.laptop.sugar.DataStore" DS_DBUS_PATH = "/org/laptop/sugar/DataStore" -_bus = dbus.SessionBus() -_data_store = dbus.Interface(_bus.get_object(DS_DBUS_SERVICE, DS_DBUS_PATH), - DS_DBUS_INTERFACE) +_data_store = None + +def _get_data_store(): + global _data_store + + if not _data_store: + _bus = dbus.SessionBus() + _data_store = dbus.Interface(_bus.get_object(DS_DBUS_SERVICE, + DS_DBUS_PATH), + DS_DBUS_INTERFACE) + return _data_store def create(properties, filename): - object_id = _data_store.create(dbus.Dictionary(properties), filename) + object_id = _get_data_store().create(dbus.Dictionary(properties), filename) logging.debug('dbus_helpers.create: ' + object_id) return object_id def update(uid, properties, filename, reply_handler=None, error_handler=None, timeout=-1): logging.debug('dbus_helpers.update: %s, %s, %s' % (uid, filename, properties)) if reply_handler and error_handler: - _data_store.update(uid, dbus.Dictionary(properties), filename, + _get_data_store().update(uid, dbus.Dictionary(properties), filename, reply_handler=reply_handler, error_handler=error_handler, timeout=timeout) else: - _data_store.update(uid, dbus.Dictionary(properties), filename) + _get_data_store().update(uid, dbus.Dictionary(properties), filename) def delete(uid): logging.debug('dbus_helpers.delete: %r' % uid) - _data_store.delete(uid) + _get_data_store().delete(uid) def get_properties(uid): logging.debug('dbus_helpers.get_properties: %s' % uid) - return _data_store.get_properties(uid) + return _get_data_store().get_properties(uid) def get_filename(uid): - filename = _data_store.get_filename(uid) + filename = _get_data_store().get_filename(uid) logging.debug('dbus_helpers.get_filename: %s, %s' % (uid, filename)) return filename def find(query, reply_handler, error_handler): logging.debug('dbus_helpers.find: %r' % query) if reply_handler and error_handler: - return _data_store.find(query, reply_handler=reply_handler, + return _get_data_store().find(query, reply_handler=reply_handler, error_handler=error_handler) else: - return _data_store.find(query) + return _get_data_store().find(query) def mount(uri, options): - return _data_store.mount(uri, options) + return _get_data_store().mount(uri, options) def unmount(mount_point_id): - _data_store.unmount(mount_point_id) + _get_data_store().unmount(mount_point_id) def mounts(): - return _data_store.mounts() + return _get_data_store().mounts() def get_unique_values(key): - return _data_store.get_uniquevaluesfor(key, dbus.Dictionary({}, signature='ss')) + return _get_data_store().get_uniquevaluesfor(key, dbus.Dictionary({}, signature='ss')) diff --git a/sugar/graphics/objectchooser.py b/sugar/graphics/objectchooser.py index 5b09e13..46739f6 100644 --- a/sugar/graphics/objectchooser.py +++ b/sugar/graphics/objectchooser.py @@ -150,7 +150,7 @@ class CollapsedEntry(CanvasRoundBox): self._icon_name = type.icon if not self._icon_name: - self._icon_name = 'theme:stock-missing' + self._icon_name = 'theme:image-missing' return self._icon_name diff --git a/sugar/graphics/palette.py b/sugar/graphics/palette.py index 368a0f6..3573e96 100644 --- a/sugar/graphics/palette.py +++ b/sugar/graphics/palette.py @@ -87,9 +87,7 @@ class Palette(gtk.Window): 'invoker' : (object, None, None, gobject.PARAM_READWRITE), 'position' : (gobject.TYPE_INT, None, None, 0, 6, - 0, gobject.PARAM_READWRITE), - 'draw-gap' : (bool, None, None, False, - gobject.PARAM_READWRITE) + 0, gobject.PARAM_READWRITE) } __gsignals__ = { @@ -114,7 +112,6 @@ class Palette(gtk.Window): self._group_id = None self._up = False self._position = self.DEFAULT - self._draw_gap = False self._palette_popup_sid = None self._popup_anim = animator.Animator(0.3, 10) @@ -206,9 +203,6 @@ class Palette(gtk.Window): self._invoker.connect('mouse-leave', self._invoker_mouse_leave_cb) elif pspec.name == 'position': self._position = value - elif pspec.name == 'draw-gap': - self._draw_gap = value - self.queue_draw() else: raise AssertionError @@ -217,8 +211,6 @@ class Palette(gtk.Window): return self._invoker elif pspec.name == 'position': return self._position - elif pspec.name == 'draw-gap': - return self._draw_gap else: raise AssertionError @@ -228,7 +220,7 @@ class Palette(gtk.Window): def do_expose_event(self, event): # We want to draw a border with a beautiful gap - if self._draw_gap: + if self._invoker.has_rectangle_gap(): invoker = self._invoker.get_rect() palette = self.get_rect() @@ -398,6 +390,9 @@ class Palette(gtk.Window): self.menu.set_active(True) self.show() + if self._invoker: + self._invoker.notify_popup() + self._up = True _palette_observer.emit('popup', self) self.emit('popup') @@ -406,9 +401,13 @@ class Palette(gtk.Window): if not self._palette_popup_sid is None: _palette_observer.disconnect(self._palette_popup_sid) self._palette_popup_sid = None + self.menu.set_active(False) self.hide() + if self._invoker: + self._invoker.notify_popdown() + self._up = False self.emit('popdown') @@ -535,6 +534,12 @@ class Invoker(gobject.GObject): def __init__(self): gobject.GObject.__init__(self) + def has_rectangle_gap(self): + return False + + def draw_rectangle(self, event, palette): + pass + def get_default_position(self): return Palette.AROUND @@ -543,6 +548,12 @@ class Invoker(gobject.GObject): height = gtk.gdk.screen_height() return gtk.gdk.Rectangle(0, 0, width, height) + def notify_popup(self): + pass + + def notify_popdown(self): + pass + class WidgetInvoker(Invoker): def __init__(self, widget): Invoker.__init__(self) @@ -562,31 +573,24 @@ class WidgetInvoker(Invoker): return gtk.gdk.Rectangle(x, y, width, height) - def draw_invoker_rect(self, event, palette): + def has_rectangle_gap(self): + return True + + def draw_rectangle(self, event, palette): style = self._widget.style - if palette.is_up(): - gap = _calculate_gap(self.get_rect(), palette.get_rect()) - - if gap: - style.paint_box_gap(event.window, gtk.STATE_PRELIGHT, - gtk.SHADOW_IN, event.area, self._widget, - "palette-invoker", - self._widget.allocation.x, - self._widget.allocation.y, - self._widget.allocation.width, - self._widget.allocation.height, - gap[0], gap[1], gap[2]) - else: - style.paint_box(event.window, gtk.STATE_PRELIGHT, + gap = _calculate_gap(self.get_rect(), palette.get_rect()) + if gap: + style.paint_box_gap(event.window, gtk.STATE_PRELIGHT, gtk.SHADOW_IN, event.area, self._widget, "palette-invoker", self._widget.allocation.x, self._widget.allocation.y, self._widget.allocation.width, - self._widget.allocation.height) + self._widget.allocation.height, + gap[0], gap[1], gap[2]) else: style.paint_box(event.window, gtk.STATE_PRELIGHT, - gtk.SHADOW_NONE, event.area, self._widget, + gtk.SHADOW_IN, event.area, self._widget, "palette-invoker", self._widget.allocation.x, self._widget.allocation.y, @@ -602,6 +606,12 @@ class WidgetInvoker(Invoker): def get_toplevel(self): return self._widget.get_toplevel() + def notify_popup(self): + self._widget.queue_draw() + + def notify_popdown(self): + self._widget.queue_draw() + class CanvasInvoker(Invoker): def __init__(self, item): Invoker.__init__(self) diff --git a/sugar/graphics/radiotoolbutton.py b/sugar/graphics/radiotoolbutton.py index fb584ee..4ffc7d1 100644 --- a/sugar/graphics/radiotoolbutton.py +++ b/sugar/graphics/radiotoolbutton.py @@ -40,25 +40,15 @@ class RadioToolButton(gtk.RadioToolButton): def set_palette(self, palette): self._palette = palette self._palette.props.invoker = WidgetInvoker(self.child) - self._palette.props.draw_gap = True - - self._palette.connect("popup", self._palette_changed) - self._palette.connect("popdown", self._palette_changed) def set_tooltip(self, text): - self._palette = Palette(text) - self._palette.props.invoker = WidgetInvoker(self.child) + self._set_palette(Palette(text)) def do_expose_event(self, event): - if self._palette and self._palette.props.draw_gap: - if self._palette.is_up() or self.child.state == gtk.STATE_PRELIGHT: - invoker = self._palette.props.invoker - invoker.draw_invoker_rect(event, self._palette) + if self._palette and self._palette.is_up(): + invoker = self._palette.props.invoker + invoker.draw_rectangle(event, self._palette) gtk.RadioToolButton.do_expose_event(self, event) - def _palette_changed(self, palette): - # Force a redraw to update the invoker rectangle - self.queue_draw() - palette = property(get_palette, set_palette) diff --git a/sugar/graphics/toggletoolbutton.py b/sugar/graphics/toggletoolbutton.py index 41050e2..74e78a6 100644 --- a/sugar/graphics/toggletoolbutton.py +++ b/sugar/graphics/toggletoolbutton.py @@ -39,25 +39,15 @@ class ToggleToolButton(gtk.ToggleToolButton): def set_palette(self, palette): self._palette = palette self._palette.props.invoker = WidgetInvoker(self.child) - self._palette.props.draw_gap = True - - self._palette.connect("popup", self._palette_changed) - self._palette.connect("popdown", self._palette_changed) def set_tooltip(self, text): - self._palette = Palette(text) - self._palette.props.invoker = WidgetInvoker(self.child) + self._set_palette(Palette(text)) def do_expose_event(self, event): - if self._palette and self._palette.props.draw_gap: - if self._palette.is_up() or self.child.state == gtk.STATE_PRELIGHT: - invoker = self._palette.props.invoker - invoker.draw_invoker_rect(event, self._palette) + if self._palette and self._palette.is_up(): + invoker = self._palette.props.invoker + invoker.draw_rectangle(event, self._palette) gtk.ToggleToolButton.do_expose_event(self, event) - def _palette_changed(self, palette): - # Force a redraw to update the invoker rectangle - self.queue_draw() - palette = property(get_palette, set_palette) diff --git a/sugar/graphics/toolbutton.py b/sugar/graphics/toolbutton.py index 52a5d62..8e982e4 100644 --- a/sugar/graphics/toolbutton.py +++ b/sugar/graphics/toolbutton.py @@ -42,19 +42,14 @@ class ToolButton(gtk.ToolButton): def set_palette(self, palette): self._palette = palette self._palette.props.invoker = WidgetInvoker(self.child) - self._palette.props.draw_gap = True - - self._palette.connect("popup", self._palette_changed) - self._palette.connect("popdown", self._palette_changed) def set_tooltip(self, text): self.set_palette(Palette(text)) def do_expose_event(self, event): - if self._palette and self._palette.props.draw_gap: - if self._palette.is_up() or self.child.state == gtk.STATE_PRELIGHT: - invoker = self._palette.props.invoker - invoker.draw_invoker_rect(event, self._palette) + if self._palette and self._palette.is_up(): + invoker = self._palette.props.invoker + invoker.draw_rectangle(event, self._palette) gtk.ToolButton.do_expose_event(self, event) @@ -62,8 +57,4 @@ class ToolButton(gtk.ToolButton): if self._palette: self._palette.popdown(True) - def _palette_changed(self, palette): - # Force a redraw to update the invoker rectangle - self.queue_draw() - palette = property(get_palette, set_palette) -- cgit v0.9.1