From a8fda48c7292b8109fde3b43fd552a192715fa42 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Wed, 1 Nov 2006 14:25:31 -0500 Subject: [PATCH 1/6] Don't draw progress bar when % is 0 --- services/nm/bubble.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/services/nm/bubble.py b/services/nm/bubble.py index 52710a6e..24e68aba 100644 --- a/services/nm/bubble.py +++ b/services/nm/bubble.py @@ -103,7 +103,8 @@ class Bubble(hippo.CanvasBox, hippo.CanvasItem): cr.set_line_width(line_width) cr.stroke(); - self._paint_progress_bar(cr, x, y, width, height, line_width) + if self._percent > 0: + self._paint_progress_bar(cr, x, y, width, height, line_width) def _paint_progress_bar(self, cr, x, y, width, height, line_width): prog_x = x + line_width From 9ef18ffe999609e823f77b77bbb9a44d2284a0f3 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Wed, 1 Nov 2006 14:25:47 -0500 Subject: [PATCH 2/6] Rollovers in NM applet menu --- services/nm/nmclient.py | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/services/nm/nmclient.py b/services/nm/nmclient.py index e02a4422..8cb5bb59 100644 --- a/services/nm/nmclient.py +++ b/services/nm/nmclient.py @@ -288,6 +288,14 @@ nm_bubble_wireless = { 'padding' : style.space_unit * 1.5 } +nm_bubble_wireless_hi = { + 'fill-color' : 0x979797FF, + 'stroke-color' : 0x979797FF, + 'progress-color': 0x666666FF, + 'spacing' : style.space_unit, + 'padding' : style.space_unit * 1.5 +} + nm_bubble_wired = { 'fill-color' : 0x000000FF, 'stroke-color' : 0x000000FF, @@ -296,6 +304,14 @@ nm_bubble_wired = { 'padding' : style.space_unit * 1.5 } +nm_bubble_wired_hi = { + 'fill-color' : 0x333333FF, + 'stroke-color' : 0x3333333FF, + 'progress-color': 0x000000FF, + 'spacing' : style.space_unit, + 'padding' : style.space_unit * 1.5 +} + nm_menu_item_title = { 'xalign': hippo.ALIGNMENT_START, 'padding-left': 5, @@ -305,18 +321,36 @@ nm_menu_item_title = { style.register_stylesheet("nm.Bubble.Wireless", nm_bubble_wireless) +style.register_stylesheet("nm.Bubble.Wireless.Hi", nm_bubble_wireless_hi) style.register_stylesheet("nm.Bubble.Wired", nm_bubble_wired) +style.register_stylesheet("nm.Bubble.Wired.Hi", nm_bubble_wired_hi) style.register_stylesheet("nm.MenuItem.Title", nm_menu_item_title) class NetworkMenuItem(Bubble): - def __init__(self, text, percent=0, stylesheet="nm.Bubble.Wireless"): + def __init__(self, text, percent=0, stylesheet="nm.Bubble.Wireless", hi_stylesheet="nm.Bubble.Wireless.Hi"): Bubble.__init__(self, percent=percent) + self._hover = False + self._default_stylesheet = stylesheet + self._hi_stylesheet = hi_stylesheet style.apply_stylesheet(self, stylesheet) text_item = hippo.CanvasText(text=text) style.apply_stylesheet(text_item, 'nm.MenuItem.Title') self.append(text_item) + self.connect('motion-notify-event', self._motion_notify_event_cb) + + def _motion_notify_event_cb(self, widget, event, handled=False): + if event.detail == hippo.MOTION_DETAIL_ENTER: + if not self._hover: + self._hover = True + style.apply_stylesheet(self, self._hi_stylesheet) + elif event.detail == hippo.MOTION_DETAIL_LEAVE: + if self._hover: + self._hover = False + style.apply_stylesheet(self, self._default_stylesheet) + + class NetworkMenu(gtk.Window): __gsignals__ = { 'action': (gobject.SIGNAL_RUN_FIRST, From a6ff123ffe96b71654392c7bf4b2c311d123cc76 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Wed, 1 Nov 2006 15:43:30 -0500 Subject: [PATCH 3/6] Do rollovers on menu items and stub code for activating a connection --- services/nm/nmclient.py | 106 ++++++++++++++++++++++++++++------------ 1 file changed, 76 insertions(+), 30 deletions(-) diff --git a/services/nm/nmclient.py b/services/nm/nmclient.py index 8cb5bb59..54017e98 100644 --- a/services/nm/nmclient.py +++ b/services/nm/nmclient.py @@ -111,13 +111,14 @@ class Network(gobject.GObject): def is_valid(self): return self._valid - def add_to_menu(self, menu): + def add_to_menu(self, menu, callback, dev): strength = self._strength if strength > 100: strength = 100 elif strength < 0: strength = 0 item = NetworkMenuItem(text=self._ssid, percent=strength) + item.connect('activated', callback, dev, self) menu.add_item(item) @@ -188,18 +189,21 @@ class Device(gobject.GObject): self._active_net = None del self._networks[net_op] - def _add_to_menu_wired(self, menu): - item = NetworkMenuItem(_("Wired Network"), stylesheet="nm.Bubble.Wired") + def _add_to_menu_wired(self, menu, callback): + item = NetworkMenuItem(_("Wired Network"), stylesheet="nm.Bubble.Wired", + hi_stylesheet="nm.Bubble.Wired.Hi", + act_stylesheet="nm.Bubble.Wired.Activated") + item.connect('activated', callback, self) menu.add_item(item) - def _add_to_menu_wireless(self, menu, active_only): + def _add_to_menu_wireless(self, menu, callback, active_only): act_net = None if self._active_net and self._networks.has_key(self._active_net): act_net = self._networks[self._active_net] # Only add the active network if active_only == True if active_only and act_net: - act_net.add_to_menu(menu) + act_net.add_to_menu(menu, callback, self) return # Otherwise, add all networks _except_ the active one @@ -208,13 +212,13 @@ class Device(gobject.GObject): continue if act_net == net: continue - net.add_to_menu(menu) + net.add_to_menu(menu, callback, self) - def add_to_menu(self, menu, active_only=False): + def add_to_menu(self, menu, callback, active_only=False): if self._type == DEVICE_TYPE_802_3_ETHERNET: - self._add_to_menu_wired(menu) + self._add_to_menu_wired(menu, callback) elif self._type == DEVICE_TYPE_802_11_WIRELESS: - self._add_to_menu_wireless(menu, active_only) + self._add_to_menu_wireless(menu, callback, active_only) def get_op(self): return self._op @@ -281,35 +285,51 @@ class Device(gobject.GObject): return self._caps nm_bubble_wireless = { - 'fill-color' : 0x646464FF, - 'stroke-color' : 0x646464FF, + 'fill-color' : 0x646464FF, + 'stroke-color' : 0x646464FF, 'progress-color': 0x333333FF, - 'spacing' : style.space_unit, - 'padding' : style.space_unit * 1.5 + 'spacing' : style.space_unit, + 'padding' : style.space_unit * 1.5 } nm_bubble_wireless_hi = { - 'fill-color' : 0x979797FF, - 'stroke-color' : 0x979797FF, + 'fill-color' : 0x979797FF, + 'stroke-color' : 0x979797FF, 'progress-color': 0x666666FF, - 'spacing' : style.space_unit, - 'padding' : style.space_unit * 1.5 + 'spacing' : style.space_unit, + 'padding' : style.space_unit * 1.5 +} + +nm_bubble_wireless_activated = { + 'fill-color' : 0xA7A7A7FF, + 'stroke-color' : 0xA7A7A7FF, + 'progress-color': 0x777777FF, + 'spacing' : style.space_unit, + 'padding' : style.space_unit * 1.5 } nm_bubble_wired = { - 'fill-color' : 0x000000FF, - 'stroke-color' : 0x000000FF, + 'fill-color' : 0x000000FF, + 'stroke-color' : 0x000000FF, 'progress-color': 0x000000FF, - 'spacing' : style.space_unit, - 'padding' : style.space_unit * 1.5 + 'spacing' : style.space_unit, + 'padding' : style.space_unit * 1.5 } nm_bubble_wired_hi = { - 'fill-color' : 0x333333FF, - 'stroke-color' : 0x3333333FF, + 'fill-color' : 0x333333FF, + 'stroke-color' : 0x333333FF, 'progress-color': 0x000000FF, - 'spacing' : style.space_unit, - 'padding' : style.space_unit * 1.5 + 'spacing' : style.space_unit, + 'padding' : style.space_unit * 1.5 +} + +nm_bubble_wired_activated = { + 'fill-color' : 0x444444FF, + 'stroke-color' : 0x444444FF, + 'progress-color': 0x000000FF, + 'spacing' : style.space_unit, + 'padding' : style.space_unit * 1.5 } nm_menu_item_title = { @@ -322,16 +342,21 @@ nm_menu_item_title = { style.register_stylesheet("nm.Bubble.Wireless", nm_bubble_wireless) style.register_stylesheet("nm.Bubble.Wireless.Hi", nm_bubble_wireless_hi) +style.register_stylesheet("nm.Bubble.Wireless.Activated", nm_bubble_wireless_activated) style.register_stylesheet("nm.Bubble.Wired", nm_bubble_wired) style.register_stylesheet("nm.Bubble.Wired.Hi", nm_bubble_wired_hi) +style.register_stylesheet("nm.Bubble.Wired.Activated", nm_bubble_wired_activated) style.register_stylesheet("nm.MenuItem.Title", nm_menu_item_title) class NetworkMenuItem(Bubble): - def __init__(self, text, percent=0, stylesheet="nm.Bubble.Wireless", hi_stylesheet="nm.Bubble.Wireless.Hi"): + def __init__(self, text, percent=0, stylesheet="nm.Bubble.Wireless", + hi_stylesheet="nm.Bubble.Wireless.Hi", + act_stylesheet="nm.Bubble.Wireless.Activated"): Bubble.__init__(self, percent=percent) self._hover = False self._default_stylesheet = stylesheet self._hi_stylesheet = hi_stylesheet + self._act_stylesheet = act_stylesheet style.apply_stylesheet(self, stylesheet) text_item = hippo.CanvasText(text=text) @@ -339,8 +364,10 @@ class NetworkMenuItem(Bubble): self.append(text_item) self.connect('motion-notify-event', self._motion_notify_event_cb) + self.connect('button-press-event', self._button_press_event_cb) + self.connect('activated', self._activated_cb) - def _motion_notify_event_cb(self, widget, event, handled=False): + def _motion_notify_event_cb(self, widget, event): if event.detail == hippo.MOTION_DETAIL_ENTER: if not self._hover: self._hover = True @@ -349,6 +376,19 @@ class NetworkMenuItem(Bubble): if self._hover: self._hover = False style.apply_stylesheet(self, self._default_stylesheet) + return True + + def _button_press_event_cb(self, widget, event): + logging.debug("button press") + style.apply_stylesheet(self, self._act_stylesheet) + return False + + def _activated_cb(self, widget): + logging.debug("activated: %s" % self._hover) + if self._hover: + style.apply_stylesheet(self, self._act_stylesheet) + else: + style.apply_stylesheet(self, self._default_stylesheet) class NetworkMenu(gtk.Window): @@ -557,7 +597,7 @@ class NMClientApp: act_dev = self._devices[self._active_device] if act_dev: - act_dev.add_to_menu(menu, active_only=True) + act_dev.add_to_menu(menu, self._menu_item_clicked_cb, active_only=True) menu.add_separator() # Wired devices first, if they don't support carrier detect @@ -570,7 +610,7 @@ class NMClientApp: continue if dev == act_dev: continue - dev.add_to_menu(menu) + dev.add_to_menu(menu, self._menu_item_clicked_cb) # Wireless devices second for dev in self._devices.values(): @@ -578,7 +618,7 @@ class NMClientApp: continue if dev.get_type() != DEVICE_TYPE_802_11_WIRELESS: continue - dev.add_to_menu(menu) + dev.add_to_menu(menu, self._menu_item_clicked_cb) return menu @@ -721,6 +761,12 @@ class NMClientApp: for arg in args: logging.debug(' ' + str(arg)) + def _menu_item_clicked_cb(self, widget, device, network=None): + net_op = "" + if network: + net_op = network.get_op() + logging.debug("clicked dev %s, net %s" % (device.get_op(), net_op)) + def device_activation_stage_sig_handler(self, device, stage): print 'Network Manager Device Stage "%s" for device %s'%(NM_DEVICE_STAGE_STRINGS[stage], device) From 823f1cf6f72bce727b681a69db547bb2f36527a6 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Wed, 1 Nov 2006 16:55:24 -0500 Subject: [PATCH 4/6] Work around non-bound HippoCanvas 'clickable' property by using button-press-event instead --- services/nm/nmclient.py | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/services/nm/nmclient.py b/services/nm/nmclient.py index 54017e98..866097da 100644 --- a/services/nm/nmclient.py +++ b/services/nm/nmclient.py @@ -118,7 +118,7 @@ class Network(gobject.GObject): elif strength < 0: strength = 0 item = NetworkMenuItem(text=self._ssid, percent=strength) - item.connect('activated', callback, dev, self) + item.connect('button-press-event', callback, (dev, self)) menu.add_item(item) @@ -193,7 +193,7 @@ class Device(gobject.GObject): item = NetworkMenuItem(_("Wired Network"), stylesheet="nm.Bubble.Wired", hi_stylesheet="nm.Bubble.Wired.Hi", act_stylesheet="nm.Bubble.Wired.Activated") - item.connect('activated', callback, self) + item.connect('button-press-event', callback, (self, None)) menu.add_item(item) def _add_to_menu_wireless(self, menu, callback, active_only): @@ -364,8 +364,8 @@ class NetworkMenuItem(Bubble): self.append(text_item) self.connect('motion-notify-event', self._motion_notify_event_cb) - self.connect('button-press-event', self._button_press_event_cb) - self.connect('activated', self._activated_cb) + # Disable active hilight for now... + #self.connect('button-press-event', self._button_press_event_cb) def _motion_notify_event_cb(self, widget, event): if event.detail == hippo.MOTION_DETAIL_ENTER: @@ -379,18 +379,9 @@ class NetworkMenuItem(Bubble): return True def _button_press_event_cb(self, widget, event): - logging.debug("button press") style.apply_stylesheet(self, self._act_stylesheet) return False - def _activated_cb(self, widget): - logging.debug("activated: %s" % self._hover) - if self._hover: - style.apply_stylesheet(self, self._act_stylesheet) - else: - style.apply_stylesheet(self, self._default_stylesheet) - - class NetworkMenu(gtk.Window): __gsignals__ = { 'action': (gobject.SIGNAL_RUN_FIRST, @@ -761,7 +752,8 @@ class NMClientApp: for arg in args: logging.debug(' ' + str(arg)) - def _menu_item_clicked_cb(self, widget, device, network=None): + def _menu_item_clicked_cb(self, widget, event, dev_data): + (device, network) = dev_data net_op = "" if network: net_op = network.get_op() From fcd4ebb281dba75402a54a8f97432c72ef8c6d01 Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Thu, 2 Nov 2006 00:45:17 +0100 Subject: [PATCH 5/6] Ensure /tmp/sugar-services exists --- sugar-emulator | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sugar-emulator b/sugar-emulator index 9b629d4b..16e9da41 100755 --- a/sugar-emulator +++ b/sugar-emulator @@ -70,5 +70,9 @@ for i in range(1, len(sys.argv)): emulator = Emulator(fullscreen) emulator.start() +# FIXME temporary until dbus support services in home dir +if not os.path.isdir('/tmp/sugar-services'): + os.mkdir('/tmp/sugar-services') + os.execlp('dbus-launch', 'dbus-launch', '--exit-with-session', '--config-file=%s' % env.get_dbus_config(), program) From 26b04db5e3bb803d96f0d3e42b8048d49c7c8486 Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Thu, 2 Nov 2006 11:10:37 +0100 Subject: [PATCH 6/6] Add activity_version support --- sugar/activity/bundle.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sugar/activity/bundle.py b/sugar/activity/bundle.py index 72d50fea..655868cb 100644 --- a/sugar/activity/bundle.py +++ b/sugar/activity/bundle.py @@ -12,6 +12,7 @@ class Bundle: self._show_launcher = False self._valid = True self._path = path + self._activity_version = 0 info_path = os.path.join(path, 'activity', 'activity.info') if os.path.isfile(info_path): @@ -50,6 +51,9 @@ class Bundle: if cp.has_option(section, 'icon'): self._icon = cp.get(section, 'icon') + if cp.has_option(section, 'activity_version'): + self._activity_version = int(cp.get(section, 'activity_version')) + def is_valid(self): return self._valid @@ -69,6 +73,10 @@ class Bundle: """Get the activity icon name""" return self._icon + def get_activity_version(self): + """Get the activity version""" + return self._activity_version + def get_exec(self): """Get the command to execute to launch the activity factory""" return self._exec