diff options
author | Marco Pesenti Gritti <marco@localhost.localdomain> | 2006-10-01 23:50:43 (GMT) |
---|---|---|
committer | Marco Pesenti Gritti <marco@localhost.localdomain> | 2006-10-01 23:50:43 (GMT) |
commit | 0a912e214a815717be270a4ae49becc8721a26dc (patch) | |
tree | a4d6813a0709963269f579f7f40bf7971ac0126f /sugar/graphics | |
parent | d05f1f13d325dc41674ff99020dbcb67ef78dab8 (diff) |
Start moving to hippo canvas. (Friends presence in the activity regressed)
Diffstat (limited to 'sugar/graphics')
-rw-r--r-- | sugar/graphics/__init__.py | 20 | ||||
-rw-r--r-- | sugar/graphics/canvasicon.py | 5 | ||||
-rw-r--r-- | sugar/graphics/grid.py | 2 | ||||
-rw-r--r-- | sugar/graphics/menuicon.py | 113 | ||||
-rw-r--r-- | sugar/graphics/style.py | 15 |
5 files changed, 145 insertions, 10 deletions
diff --git a/sugar/graphics/__init__.py b/sugar/graphics/__init__.py index e69de29..8bfa7eb 100644 --- a/sugar/graphics/__init__.py +++ b/sugar/graphics/__init__.py @@ -0,0 +1,20 @@ +import gtk + +from sugar.graphics import style +from sugar.canvas.IconColor import IconColor + +if gtk.gdk.screen_width() == 1200: + _medium_icon_size = 75 +else: + _medium_icon_size = 50 + +_stylesheet = { + 'color' : IconColor('white'), + 'size' : _medium_icon_size +} +style.register_stylesheet('frame-activity-icon', _stylesheet) + +_stylesheet = { + 'size' : _medium_icon_size +} +style.register_stylesheet('frame-zoom-icon', _stylesheet) diff --git a/sugar/graphics/canvasicon.py b/sugar/graphics/canvasicon.py index e8d8ea4..17a0193 100644 --- a/sugar/graphics/canvasicon.py +++ b/sugar/graphics/canvasicon.py @@ -73,6 +73,8 @@ class CanvasIcon(hippo.CanvasBox, hippo.CanvasItem): self._buffer = None self._buffer_size = 0.0 + self.connect('button-press-event', self._button_press_event_cb) + def do_set_property(self, pspec, value): if pspec.name == 'icon-name': self._icon_name = value @@ -132,3 +134,6 @@ class CanvasIcon(hippo.CanvasBox, hippo.CanvasItem): def do_get_height_request(self, for_width): return self._size + + def _button_press_event_cb(self, item, event): + item.emit_activated() diff --git a/sugar/graphics/grid.py b/sugar/graphics/grid.py index be44f43..8ee124a 100644 --- a/sugar/graphics/grid.py +++ b/sugar/graphics/grid.py @@ -7,7 +7,7 @@ class Grid(object): def __init__(self): self._factor = gtk.gdk.screen_width() / COLS - def position(self, x, y): + def point(self, x, y): return [x * self._factor, y * self._factor] def rectangle(self, x, y, width, height): diff --git a/sugar/graphics/menuicon.py b/sugar/graphics/menuicon.py new file mode 100644 index 0000000..88a8d56 --- /dev/null +++ b/sugar/graphics/menuicon.py @@ -0,0 +1,113 @@ +import hippo +import gobject + +from sugar.graphics.canvasicon import CanvasIcon + +class _MenuStrategy: + def get_menu_position(self, menu, grid_x1, grid_y1, grid_x2, grid_y2): + grid_x = grid_x2 + if grid_x + menu.get_width() > Grid.COLS: + grid_x = grid_x1 - menu.get_width() + 1 + + grid_y = grid_y1 + + if grid_y < 0: + grid_y = 0 + if grid_y + menu.get_width() > Grid.ROWS: + grid_y = Grid.ROWS - menu.get_width() + + return [grid_x, grid_y] + +class MenuIcon(CanvasIcon): + def __init__(self, menu_shell, **kwargs): + CanvasIcon.__init__(self, **kwargs) + + self._menu_shell = menu_shell + self._grid = menu_shell.get_grid() + self._menu = None + self._hover_menu = False + self._popdown_on_leave = False + self._popdown_sid = 0 + self._menu_strategy = _MenuStrategy() + + self.connect('motion-notify-event', self._motion_notify_event_cb) + + def popdown(self): + if self._menu: + self._menu.destroy() + self._menu = None + self._menu_shell.set_active(None) + + def set_menu_strategy(self, strategy): + self._menu_strategy = strategy + + def _popup(self, x1, y1, x2, y2): + self.popdown() + + self._menu_shell.set_active(None) + + grid = self._shell.get_grid() + self._menu = self.create_menu() + self._menu.connect('enter-notify-event', + self._menu_enter_notify_event_cb) + self._menu.connect('leave-notify-event', + self._menu_leave_notify_event_cb) + + [grid_x1, grid_y1] = grid.convert_from_screen(x1, y1) + [grid_x2, grid_y2] = grid.convert_from_screen(x2, y2) + + strategy = self._menu_strategy + [grid_x, grid_y] = strategy.get_menu_position(self._menu, + grid_x1, grid_y1, + grid_x2, grid_y2) + + grid.set_constraints(self._menu, grid_x, grid_y, + self._menu.get_width(), self._menu.get_height()) + + self._menu.show() + + self._menu_shell.set_active(self) + + def _menu_enter_notify_event_cb(self, widget, event): + self._hover_menu = True + + def _menu_leave_notify_event_cb(self, widget, event): + self._hover_menu = False + if self._popdown_on_leave: + self.popdown() + + def _start_popdown_timeout(self): + self._stop_popdown_timeout() + self._popdown_sid = gobject.timeout_add(1000, self._popdown_timeout_cb) + + def _stop_popdown_timeout(self): + if self._popdown_sid > 0: + gobject.source_remove(self._popdown_sid) + self._popdown_sid = 0 + + def _motion_notify_event_cb(self, item, event): + if event.detail == hippo.MOTION_DETAIL_ENTER: + self._motion_notify_enter() + elif event.detail == hippo.MOTION_DETAIL_LEAVE: + self._motion_notify_leave() + + def _motion_notify_enter(self): + self._stop_popdown_timeout() + + [x, y] = self.get_context().translate_to_widget(self) + [width, height] = self.get_allocation() + + self._popup(x, y, width, height) + + def _motion_notify_leave(self): + self._start_popdown_timeout() + + def _popdown_timeout_cb(self): + self._popdown_sid = 0 + + if not self._hover_menu: + self.popdown() + else: + self._popdown_on_leave = True + + return False diff --git a/sugar/graphics/style.py b/sugar/graphics/style.py index f8a0898..4b1bc53 100644 --- a/sugar/graphics/style.py +++ b/sugar/graphics/style.py @@ -1,13 +1,10 @@ _styles = {} -def register_style(name, style): +def register_stylesheet(name, style): _styles[name] = style -def apply_style(name, item): - if _styles.has_key(name): - for name in _styles.keys(): - item.set_property(name, _styles[name] - -def Style(dict): - def set_property(self, name, value): - self._properties[name] = value +def apply_stylesheet(item, stylesheet_name): + if _styles.has_key(stylesheet_name): + style_sheet = _styles[stylesheet_name] + for name in style_sheet.keys(): + item.set_property(name, style_sheet[name]) |