From 58d3cdee1622e972f51efa32fcf9a7d9f5e5f1d2 Mon Sep 17 00:00:00 2001
From: Simon Schampijer <simon@laptop.org>
Date: Thu, 25 Oct 2012 14:09:00 +0200
Subject: [PATCH shell] BuddyMenu: switch from GTK.Menu to custom menu, part
of SL #3992
The Gtk.Menu triggers a Palette popdown in a long press (and actually as well
a long click). There is not realy a way around that so we go with our custom
Palettes.
Use the toggle_palette property from the invoker in order to popup/popdown
Palette on left click or tap.
Fixme: we need to make the Palette widget accessible through the Palette
API.
Signed-off-by: Simon Schampijer <simon@laptop.org>
---
src/jarabe/desktop/favoritesview.py | 17 ++++++++--------
src/jarabe/view/buddyicon.py | 6 +-----
src/jarabe/view/buddymenu.py | 39 +++++++++++++++++++------------------
3 files changed, 30 insertions(+), 32 deletions(-)
diff --git a/src/jarabe/desktop/favoritesview.py b/src/jarabe/desktop/favoritesview.py
index e71b769..6e32363 100644
a
|
b
|
from gi.repository import GdkPixbuf |
29 | 29 | from sugar3.graphics import style |
30 | 30 | from sugar3.graphics.icon import Icon |
31 | 31 | from sugar3.graphics.icon import CanvasIcon |
32 | | from sugar3.graphics.menuitem import MenuItem |
33 | 32 | from sugar3.graphics.palettemenuitem import PaletteMenuItem |
34 | 33 | from sugar3.graphics.palettemenuitem import PaletteMenuItemSeparator |
35 | 34 | from sugar3.graphics.alert import Alert |
… |
… |
class OwnerIcon(BuddyIcon): |
606 | 605 | backup_url = client.get_string('/desktop/sugar/backup_url') |
607 | 606 | |
608 | 607 | if not backup_url: |
609 | | self._register_menu = MenuItem(_('Register'), 'media-record') |
| 608 | self._register_menu = PaletteMenuItem(_('Register'), |
| 609 | 'media-record') |
610 | 610 | else: |
611 | | self._register_menu = MenuItem(_('Register again'), |
612 | | 'media-record') |
| 611 | self._register_menu = PaletteMenuItem(_('Register again'), |
| 612 | 'media-record') |
613 | 613 | |
614 | 614 | self._register_menu.connect('activate', self.__register_activate_cb) |
615 | | palette.menu.append(self._register_menu) |
| 615 | palette.menu_box.pack_end(self._register_menu, True, True, 0) |
616 | 616 | self._register_menu.show() |
617 | 617 | |
618 | 618 | self.connect_to_palette_pop_events(palette) |
… |
… |
class OwnerIcon(BuddyIcon): |
623 | 623 | self.emit('register-activate') |
624 | 624 | |
625 | 625 | def set_registered(self): |
626 | | self.palette.menu.remove(self._register_menu) |
627 | | self._register_menu = MenuItem(_('Register again'), 'media-record') |
| 626 | self.palette.menu_box.remove(self._register_menu) |
| 627 | self._register_menu = PaletteMenuItem(_('Register again'), |
| 628 | 'media-record') |
628 | 629 | self._register_menu.connect('activate', self.__register_activate_cb) |
629 | | self.palette.menu.append(self._register_menu) |
| 630 | self.palette.menu_box.pack_end(self._register_menu, True, True, 0) |
630 | 631 | self._register_menu.show() |
631 | 632 | |
632 | 633 | |
diff --git a/src/jarabe/view/buddyicon.py b/src/jarabe/view/buddyicon.py
index cd648b1..6320113 100644
a
|
b
|
class BuddyIcon(CanvasIcon): |
35 | 35 | self._buddy.connect('notify::present', self.__buddy_notify_present_cb) |
36 | 36 | self._buddy.connect('notify::color', self.__buddy_notify_color_cb) |
37 | 37 | |
38 | | self.connect('button-release-event', self.__button_release_event_cb) |
39 | | |
| 38 | self.palette_invoker.props.toggle_palette = True |
40 | 39 | self.palette_invoker.cache_palette = False |
41 | 40 | |
42 | 41 | self._update_color() |
… |
… |
class BuddyIcon(CanvasIcon): |
46 | 45 | self.connect_to_palette_pop_events(palette) |
47 | 46 | return palette |
48 | 47 | |
49 | | def __button_release_event_cb(self, icon, event): |
50 | | self.props.palette.popup(immediate=True, state=Palette.SECONDARY) |
51 | | |
52 | 48 | def __buddy_notify_present_cb(self, buddy, pspec): |
53 | 49 | # Update the icon's color when the buddy comes and goes |
54 | 50 | self._update_color() |
diff --git a/src/jarabe/view/buddymenu.py b/src/jarabe/view/buddymenu.py
index d17f4ff..f1cc533 100644
a
|
b
|
import glib |
24 | 24 | import dbus |
25 | 25 | |
26 | 26 | from sugar3.graphics.palette import Palette |
27 | | from sugar3.graphics.menuitem import MenuItem |
| 27 | from sugar3.graphics.palettemenuitem import PaletteMenuItem |
28 | 28 | from sugar3.graphics.icon import Icon |
29 | 29 | |
30 | 30 | from jarabe.model import shell |
… |
… |
class BuddyMenu(Palette): |
45 | 45 | Palette.__init__(self, None, |
46 | 46 | primary_text=glib.markup_escape_text(nick), |
47 | 47 | icon=buddy_icon) |
| 48 | self.menu_box = Gtk.VBox() |
| 49 | self.set_content(self.menu_box) |
| 50 | self.menu_box.show_all() |
48 | 51 | self._invite_menu = None |
49 | 52 | self._active_activity_changed_hid = None |
50 | | self.get_menu().connect('destroy', self.__destroy_cb) |
| 53 | # Fixme: we need to make the widget accessible through the Palette API |
| 54 | self._widget.connect('destroy', self.__destroy_cb) |
51 | 55 | |
52 | 56 | self._buddy.connect('notify::nick', self.__buddy_notify_nick_cb) |
53 | 57 | |
… |
… |
class BuddyMenu(Palette): |
64 | 68 | |
65 | 69 | def _add_buddy_items(self): |
66 | 70 | if friends.get_model().has_buddy(self._buddy): |
67 | | menu_item = MenuItem(_('Remove friend'), 'list-remove') |
| 71 | menu_item = PaletteMenuItem(_('Remove friend'), 'list-remove') |
68 | 72 | menu_item.connect('activate', self._remove_friend_cb) |
69 | 73 | else: |
70 | | menu_item = MenuItem(_('Make friend'), 'list-add') |
| 74 | menu_item = PaletteMenuItem(_('Make friend'), 'list-add') |
71 | 75 | menu_item.connect('activate', self._make_friend_cb) |
72 | 76 | |
73 | | self.menu.append(menu_item) |
74 | | menu_item.show() |
| 77 | self.menu_box.pack_start(menu_box, True, True, 0) |
75 | 78 | |
76 | | self._invite_menu = MenuItem('') |
| 79 | self._invite_menu = PaletteMenuItem('') |
77 | 80 | self._invite_menu.connect('activate', self._invite_friend_cb) |
78 | | self.menu.append(self._invite_menu) |
| 81 | self.menu_box.pack_start(self._invite_menu, True, True, 0) |
79 | 82 | |
80 | 83 | home_model = shell.get_model() |
81 | 84 | self._active_activity_changed_hid = home_model.connect( |
… |
… |
class BuddyMenu(Palette): |
84 | 87 | self._update_invite_menu(activity) |
85 | 88 | |
86 | 89 | def _add_my_items(self): |
87 | | item = MenuItem(_('Shutdown'), 'system-shutdown') |
| 90 | item = PaletteMenuItem(_('Shutdown'), 'system-shutdown') |
88 | 91 | item.connect('activate', self.__shutdown_activate_cb) |
89 | | self.menu.append(item) |
90 | | item.show() |
| 92 | self.menu_box.pack_start(item, True, True, 0) |
91 | 93 | |
92 | 94 | client = GConf.Client.get_default() |
93 | 95 | |
94 | 96 | if client.get_bool('/desktop/sugar/show_restart'): |
95 | | item = MenuItem(_('Restart'), 'system-restart') |
| 97 | item = PaletteMenuItem(_('Restart'), 'system-restart') |
96 | 98 | item.connect('activate', self.__reboot_activate_cb) |
97 | | self.menu.append(item) |
| 99 | self.menu_box.pack_start(item, True, True, 0) |
98 | 100 | item.show() |
99 | 101 | |
100 | 102 | if client.get_bool('/desktop/sugar/show_logout'): |
101 | | item = MenuItem(_('Logout'), 'system-logout') |
| 103 | item = PaletteMenuItem(_('Logout'), 'system-logout') |
102 | 104 | item.connect('activate', self.__logout_activate_cb) |
103 | | self.menu.append(item) |
| 105 | self.menu_box.pack_start(item, True, True, 0) |
104 | 106 | item.show() |
105 | 107 | |
106 | | item = MenuItem(_('My Settings'), 'preferences-system') |
| 108 | item = PaletteMenuItem(_('My Settings'), 'preferences-system') |
107 | 109 | item.connect('activate', self.__controlpanel_activate_cb) |
108 | | self.menu.append(item) |
| 110 | self.menu_box.pack_start(item, True, True, 0) |
109 | 111 | item.show() |
110 | 112 | |
111 | 113 | def _quit(self, action): |
… |
… |
class BuddyMenu(Palette): |
138 | 140 | self._invite_menu.hide() |
139 | 141 | else: |
140 | 142 | title = activity.get_title() |
141 | | label = self._invite_menu.get_children()[0] |
142 | | label.set_text(_('Invite to %s') % title) |
| 143 | self._invite_menu.set_label(_('Invite to %s') % title) |
143 | 144 | |
144 | 145 | icon = Icon(file=activity.get_icon_path()) |
145 | 146 | icon.props.xo_color = activity.get_icon_color() |