[Sugar-devel] [PATCH sugar] Views: move the ViewToolbar to the HomeWindow instead of having one in each View

Simon Schampijer simon at schampijer.de
Tue Aug 28 03:21:35 EDT 2012


From: Simon Schampijer <simon at laptop.org>

This patch moves the ViewToolbar to the HomeWindow and removes it
from the Views respectively. This ease the transition between the
Views and simplifies the code.

The toolbar is passed as an argument at initialization of the
View in order to connect to the 'query-changed' and 'view-changed'
signals of the toolbar. The buttons to change between the Favorite
and ListView are only available in the HomeView at the moment, they
are hidden and shown when we switch between the Views.

The _FILTERED_ALPHA global is added back again to the MeshView, it
has been dropped accidentally by 13844c18b225f46b1636fc1201e020af53c60fcd.

This patch depends on the previous toolbar simplification patch [1].

Signed-off-by: Simon Schampijer <simon at laptop.org>

[1] http://lists.sugarlabs.org/archive/sugar-devel/2012-August/039328.html
---
 src/jarabe/desktop/groupbox.py      |  38 +++----------
 src/jarabe/desktop/homebox.py       | 110 +-----------------------------------
 src/jarabe/desktop/homewindow.py    |  47 ++++++++++-----
 src/jarabe/desktop/meshbox.py       |  56 +++++++-----------
 src/jarabe/desktop/transitionbox.py |  14 +++--
 src/jarabe/desktop/viewtoolbar.py   |  89 ++++++++++++++++++++++++++++-
 6 files changed, 162 insertions(+), 192 deletions(-)

diff --git a/src/jarabe/desktop/groupbox.py b/src/jarabe/desktop/groupbox.py
index e58ac3f..b86cdf2 100644
--- a/src/jarabe/desktop/groupbox.py
+++ b/src/jarabe/desktop/groupbox.py
@@ -16,8 +16,6 @@
 
 import logging
 
-import gtk
-
 from sugar.graphics import style
 
 from jarabe.view.buddyicon import BuddyIcon
@@ -26,13 +24,14 @@ from jarabe.model import friends
 from jarabe.desktop.friendview import FriendView
 from jarabe.desktop.viewcontainer import ViewContainer
 from jarabe.desktop.favoriteslayout import SpreadLayout
-from jarabe.desktop.viewtoolbar import ViewToolbar
 
 
-class GroupContainer(ViewContainer):
-    __gtype_name__ = 'SugarGroupContainer'
+class GroupBox(ViewContainer):
+    __gtype_name__ = 'SugarGroupBox'
+
+    def __init__(self, toolbar):
+        logging.debug('STARTUP: Loading the group view')
 
-    def __init__(self):
         layout = SpreadLayout()
 
         # Round off icon size to an even number to ensure that the icon
@@ -40,24 +39,8 @@ class GroupContainer(ViewContainer):
                                style.LARGE_ICON_SIZE & ~1)
         ViewContainer.__init__(self, layout, owner_icon)
 
-
-class GroupBox(gtk.VBox):
-    __gtype_name__ = 'SugarGroupBox'
-
-    def __init__(self):
-        logging.debug('STARTUP: Loading the group view')
-
-        gtk.VBox.__init__(self)
-
         self._query = ''
-        self._toolbar = ViewToolbar()
-        self._toolbar.connect('query-changed', self._toolbar_query_changed_cb)
-        self.pack_start(self._toolbar, expand=False)
-        self._toolbar.show()
-
-        self._group_container = GroupContainer()
-        self.add(self._group_container)
-        self._group_container.show()
+        toolbar.connect('query-changed', self._toolbar_query_changed_cb)
 
         self._friends = {}
 
@@ -71,7 +54,7 @@ class GroupBox(gtk.VBox):
 
     def add_friend(self, buddy_info):
         icon = FriendView(buddy_info)
-        self._group_container.add(icon)
+        self.add(icon)
         self._friends[buddy_info.get_key()] = icon
         icon.show()
 
@@ -80,15 +63,12 @@ class GroupBox(gtk.VBox):
 
     def _friend_removed_cb(self, data_model, key):
         icon = self._friends[key]
-        self._group_container.remove(icon)
+        self.remove(icon)
         del self._friends[key]
         icon.destroy()
 
     def _toolbar_query_changed_cb(self, toolbar, query):
         self._query = query.lower()
-        for icon in self._group_container.get_children():
+        for icon in self.get_children():
             if hasattr(icon, 'set_filter'):
                 icon.set_filter(self._query)
-
-    def focus_search_entry(self):
-        self._toolbar.search_entry.grab_focus()
diff --git a/src/jarabe/desktop/homebox.py b/src/jarabe/desktop/homebox.py
index e4dba30..8f3963b 100644
--- a/src/jarabe/desktop/homebox.py
+++ b/src/jarabe/desktop/homebox.py
@@ -22,13 +22,11 @@ import gobject
 import gtk
 
 from sugar.graphics import style
-from sugar.graphics.radiotoolbutton import RadioToolButton
 from sugar.graphics.alert import Alert
 from sugar.graphics.icon import Icon
 
 from jarabe.desktop import favoritesview
 from jarabe.desktop.activitieslist import ActivitiesList
-from jarabe.desktop.viewtoolbar import ViewToolbar
 
 _FAVORITES_VIEW = 0
 _LIST_VIEW = 1
@@ -37,7 +35,7 @@ _LIST_VIEW = 1
 class HomeBox(gtk.VBox):
     __gtype_name__ = 'SugarHomeBox'
 
-    def __init__(self):
+    def __init__(self, toolbar):
         logging.debug('STARTUP: Loading the home view')
 
         gobject.GObject.__init__(self)
@@ -45,11 +43,8 @@ class HomeBox(gtk.VBox):
         self._favorites_box = favoritesview.FavoritesBox()
         self._list_view = ActivitiesList()
 
-        self._toolbar = HomeToolbar()
-        self._toolbar.connect('query-changed', self.__toolbar_query_changed_cb)
-        self._toolbar.connect('view-changed', self.__toolbar_view_changed_cb)
-        self.pack_start(self._toolbar, expand=False)
-        self._toolbar.show()
+        toolbar.connect('query-changed', self.__toolbar_query_changed_cb)
+        toolbar.connect('view-changed', self.__toolbar_view_changed_cb)
 
         self._set_view(_FAVORITES_VIEW)
         self._query = ''
@@ -139,107 +134,8 @@ class HomeBox(gtk.VBox):
         #return self._donut.has_activities()
         return False
 
-    def focus_search_entry(self):
-        self._toolbar.search_entry.grab_focus()
-
     def set_resume_mode(self, resume_mode):
         self._favorites_box.set_resume_mode(resume_mode)
         if resume_mode and self._query != '':
             self._list_view.set_filter(self._query)
             self._favorites_box.set_filter(self._query)
-
-
-class HomeToolbar(ViewToolbar):
-    __gtype_name__ = 'SugarHomeToolbar'
-
-    __gsignals__ = {
-        'view-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
-                         ([object])),
-    }
-
-    def __init__(self):
-        ViewToolbar.__init__(self)
-
-        favorites_button = FavoritesButton()
-        favorites_button.connect('toggled', self.__view_button_toggled_cb,
-                                 _FAVORITES_VIEW)
-        self.insert(favorites_button, -1)
-        favorites_button.show()
-
-        self._list_button = RadioToolButton(named_icon='view-list')
-        self._list_button.props.group = favorites_button
-        self._list_button.props.tooltip = _('List view')
-        self._list_button.props.accelerator = _('<Ctrl>2')
-        self._list_button.connect('toggled', self.__view_button_toggled_cb,
-                            _LIST_VIEW)
-        self.insert(self._list_button, -1)
-        self._list_button.show()
-
-        self._add_separator()
-
-    def __view_button_toggled_cb(self, button, view):
-        if button.props.active:
-            self.search_entry.grab_focus()
-            self.emit('view-changed', view)
-
-    def _add_separator(self, expand=False):
-        separator = gtk.SeparatorToolItem()
-        separator.props.draw = False
-        if expand:
-            separator.set_expand(True)
-        else:
-            separator.set_size_request(style.GRID_CELL_SIZE,
-                                       style.GRID_CELL_SIZE)
-        self.insert(separator, -1)
-        separator.show()
-
-
-class FavoritesButton(RadioToolButton):
-    __gtype_name__ = 'SugarFavoritesButton'
-
-    def __init__(self):
-        RadioToolButton.__init__(self)
-
-        self.props.tooltip = _('Favorites view')
-        self.props.accelerator = _('<Ctrl>1')
-        self.props.group = None
-
-        favorites_settings = favoritesview.get_settings()
-        self._layout = favorites_settings.layout
-        self._update_icon()
-
-        # someday, this will be a gtk.Table()
-        layouts_grid = gtk.HBox()
-        layout_item = None
-        for layoutid, layoutclass in sorted(favoritesview.LAYOUT_MAP.items()):
-            layout_item = RadioToolButton(icon_name=layoutclass.icon_name,
-                                          group=layout_item, active=False)
-            if layoutid == self._layout:
-                layout_item.set_active(True)
-            layouts_grid.pack_start(layout_item, fill=False)
-            layout_item.connect('toggled', self.__layout_activate_cb,
-                                layoutid)
-        layouts_grid.show_all()
-        self.props.palette.set_content(layouts_grid)
-
-    def __layout_activate_cb(self, menu_item, layout):
-        if not menu_item.get_active():
-            return
-        if self._layout == layout and self.props.active:
-            return
-
-        if self._layout != layout:
-            self._layout = layout
-            self._update_icon()
-
-            favorites_settings = favoritesview.get_settings()
-            favorites_settings.layout = layout
-
-        if not self.props.active:
-            self.props.active = True
-        else:
-            self.emit('toggled')
-
-    def _update_icon(self):
-        self.props.named_icon = favoritesview.LAYOUT_MAP[self._layout]\
-                                .icon_name
diff --git a/src/jarabe/desktop/homewindow.py b/src/jarabe/desktop/homewindow.py
index 64eb48e..c4f1401 100644
--- a/src/jarabe/desktop/homewindow.py
+++ b/src/jarabe/desktop/homewindow.py
@@ -26,6 +26,7 @@ from jarabe.desktop.meshbox import MeshBox
 from jarabe.desktop.homebox import HomeBox
 from jarabe.desktop.groupbox import GroupBox
 from jarabe.desktop.transitionbox import TransitionBox
+from jarabe.desktop.viewtoolbar import ViewToolbar
 from jarabe.model.shell import ShellModel
 from jarabe.model import shell
 
@@ -67,13 +68,23 @@ class HomeWindow(gtk.Window):
         self.connect('key-press-event', self.__key_press_event_cb)
         self.connect('key-release-event', self.__key_release_event_cb)
 
-        self._home_box = HomeBox()
-        self._group_box = GroupBox()
-        self._mesh_box = MeshBox()
-        self._transition_box = TransitionBox()
+        self._box = gtk.VBox()
+
+        self._toolbar = ViewToolbar()
+        self._box.pack_start(self._toolbar, expand=False)
+        self._toolbar.show()
 
-        self.add(self._home_box)
+        self._home_box = HomeBox(self._toolbar)
+        self._box.pack_start(self._home_box)
         self._home_box.show()
+        self._toolbar.show_view_buttons()
+
+        self._group_box = GroupBox(self._toolbar)
+        self._mesh_box = MeshBox(self._toolbar)
+        self._transition_box = TransitionBox()
+
+        self.add(self._box)
+        self._box.show()
 
         self._transition_box.connect('completed',
                                      self._transition_completed_cb)
@@ -143,8 +154,10 @@ class HomeWindow(gtk.Window):
 
         if old_level != ShellModel.ZOOM_ACTIVITY and \
            new_level != ShellModel.ZOOM_ACTIVITY:
-            self.remove(self.get_child())
-            self.add(self._transition_box)
+            children = self._box.get_children()
+            if len(children) >= 2:
+                self._box.remove(children[1])
+            self._box.pack_start(self._transition_box)
             self._transition_box.show()
 
             if new_level == ShellModel.ZOOM_HOME:
@@ -172,21 +185,25 @@ class HomeWindow(gtk.Window):
         if level == ShellModel.ZOOM_ACTIVITY:
             return
 
-        current_child = self.get_child()
-        self.remove(current_child)
+        children = self._box.get_children()
+        if len(children) >= 2:
+            self._box.remove(children[1])
 
         if level == ShellModel.ZOOM_HOME:
-            self.add(self._home_box)
+            self._box.pack_start(self._home_box)
             self._home_box.show()
-            self._home_box.focus_search_entry()
+            self._toolbar.search_entry.grab_focus()
+            self._toolbar.show_view_buttons()
         elif level == ShellModel.ZOOM_GROUP:
-            self.add(self._group_box)
+            self._box.pack_start(self._group_box)
             self._group_box.show()
-            self._group_box.focus_search_entry()
+            self._toolbar.search_entry.grab_focus()
+            self._toolbar.hide_view_buttons()
         elif level == ShellModel.ZOOM_MESH:
-            self.add(self._mesh_box)
+            self._box.pack_start(self._mesh_box)
             self._mesh_box.show()
-            self._mesh_box.focus_search_entry()
+            self._toolbar.search_entry.grab_focus()
+            self._toolbar.hide_view_buttons()
 
     def get_home_box(self):
         return self._home_box
diff --git a/src/jarabe/desktop/meshbox.py b/src/jarabe/desktop/meshbox.py
index 8002a33..1ee5e67 100644
--- a/src/jarabe/desktop/meshbox.py
+++ b/src/jarabe/desktop/meshbox.py
@@ -41,7 +41,6 @@ from jarabe.desktop.networkviews import OlpcMeshView
 from jarabe.desktop.networkviews import SugarAdhocView
 from jarabe.desktop.viewcontainer import ViewContainer
 from jarabe.desktop.favoriteslayout import SpreadLayout
-from jarabe.desktop.viewtoolbar import ViewToolbar
 from jarabe.model import network
 from jarabe.model.network import AccessPoint
 from jarabe.model.olpcmesh import OlpcMeshManager
@@ -52,6 +51,8 @@ from jarabe.journal import misc
 _AP_ICON_NAME = 'network-wireless'
 _OLPC_MESH_ICON_NAME = 'network-mesh'
 
+_FILTERED_ALPHA = 0.33
+
 
 class _ActivityIcon(EventIcon):
     def __init__(self, model, file_name, xo_color,
@@ -335,10 +336,12 @@ class NetworkManagerObserver(object):
                         self._box.add_adhoc_networks(device)
 
 
-class MeshContainer(ViewContainer):
-    __gtype_name__ = 'SugarMeshContainer'
+class MeshBox(ViewContainer):
+    __gtype_name__ = 'SugarMeshBox'
+
+    def __init__(self, toolbar):
+        logging.debug('STARTUP: Loading the mesh view')
 
-    def __init__(self):
         layout = SpreadLayout()
 
         # Round off icon size to an even number to ensure that the icon
@@ -346,15 +349,6 @@ class MeshContainer(ViewContainer):
                                style.STANDARD_ICON_SIZE & ~1)
         ViewContainer.__init__(self, layout, owner_icon)
 
-
-class MeshBox(gtk.VBox):
-    __gtype_name__ = 'SugarMeshBox'
-
-    def __init__(self):
-        logging.debug('STARTUP: Loading the mesh view')
-
-        gtk.VBox.__init__(self)
-
         self.wireless_networks = {}
         self._adhoc_manager = None
         self._adhoc_networks = []
@@ -367,14 +361,7 @@ class MeshBox(gtk.VBox):
         self._suspended = True
         self._query = ''
 
-        self._toolbar = ViewToolbar()
-        self._toolbar.connect('query-changed', self._toolbar_query_changed_cb)
-        self.pack_start(self._toolbar, expand=False)
-        self._toolbar.show()
-
-        self._mesh_container = MeshContainer()
-        self.add(self._mesh_container)
-        self._mesh_container.show()
+        toolbar.connect('query-changed', self._toolbar_query_changed_cb)
 
         for buddy_model in self._model.get_buddies():
             self._add_buddy(buddy_model)
@@ -411,7 +398,7 @@ class MeshBox(gtk.VBox):
         if buddy_model.is_owner():
             return
         icon = BuddyIcon(buddy_model)
-        self._mesh_container.add(icon)
+        self.add(icon)
         icon.show()
 
         if hasattr(icon, 'set_filter'):
@@ -422,7 +409,7 @@ class MeshBox(gtk.VBox):
     def _remove_buddy(self, buddy_model):
         logging.debug('MeshBox._remove_buddy')
         icon = self._buddies[buddy_model.props.key]
-        self._mesh_container.remove(icon)
+        self.remove(icon)
         del self._buddies[buddy_model.props.key]
 
     def __buddy_notify_current_activity_cb(self, buddy_model, pspec):
@@ -436,7 +423,7 @@ class MeshBox(gtk.VBox):
 
     def _add_activity(self, activity_model):
         icon = ActivityView(activity_model)
-        self._mesh_container.add(icon)
+        self.add(icon)
         icon.show()
 
         if hasattr(icon, 'set_filter'):
@@ -446,7 +433,7 @@ class MeshBox(gtk.VBox):
 
     def _remove_activity(self, activity_model):
         icon = self._activities[activity_model.activity_id]
-        self._mesh_container.remove(icon)
+        self.remove(icon)
         del self._activities[activity_model.activity_id]
 
     # add AP to its corresponding network icon on the desktop,
@@ -459,7 +446,7 @@ class MeshBox(gtk.VBox):
             # this is a new network
             icon = WirelessNetworkView(ap)
             self.wireless_networks[hash_value] = icon
-            self._mesh_container.add(icon)
+            self.add(icon)
             icon.show()
             if hasattr(icon, 'set_filter'):
                 icon.set_filter(self._query)
@@ -468,7 +455,7 @@ class MeshBox(gtk.VBox):
         # remove a network if it has no APs left
         if net.num_aps() == 0:
             net.disconnect()
-            self._mesh_container.remove(net)
+            self.remove(net)
             del self.wireless_networks[hash_value]
 
     def _ap_props_changed_cb(self, ap, old_hash_value):
@@ -546,19 +533,19 @@ class MeshBox(gtk.VBox):
 
     def remove_adhoc_networks(self):
         for icon in self._adhoc_networks:
-            self._mesh_container.remove(icon)
+            self.remove(icon)
         self._adhoc_networks = []
         self._adhoc_manager.stop_listening()
 
     def _add_adhoc_network_icon(self, channel):
         icon = SugarAdhocView(channel)
-        self._mesh_container.add(icon)
+        self.add(icon)
         icon.show()
         self._adhoc_networks.append(icon)
 
     def _add_olpc_mesh_icon(self, mesh_mgr, channel):
         icon = OlpcMeshView(mesh_mgr, channel)
-        self._mesh_container.add(icon)
+        self.add(icon)
         icon.show()
         self._mesh.append(icon)
 
@@ -577,13 +564,13 @@ class MeshBox(gtk.VBox):
             logging.debug('removing OLPC mesh IBSS')
             net.remove_all_aps()
             net.disconnect()
-            self._mesh_container.remove(net)
+            self.remove(net)
             del self.wireless_networks[hash_value]
 
     def disable_olpc_mesh(self, mesh_device):
         for icon in self._mesh:
             icon.disconnect()
-            self._mesh_container.remove(icon)
+            self.remove(icon)
         self._mesh = []
 
     def suspend(self):
@@ -600,9 +587,6 @@ class MeshBox(gtk.VBox):
 
     def _toolbar_query_changed_cb(self, toolbar, query):
         self._query = query.lower()
-        for icon in self._mesh_container.get_children():
+        for icon in self.get_children():
             if hasattr(icon, 'set_filter'):
                 icon.set_filter(self._query)
-
-    def focus_search_entry(self):
-        self._toolbar.search_entry.grab_focus()
diff --git a/src/jarabe/desktop/transitionbox.py b/src/jarabe/desktop/transitionbox.py
index 54a70de..3718bdd 100644
--- a/src/jarabe/desktop/transitionbox.py
+++ b/src/jarabe/desktop/transitionbox.py
@@ -21,6 +21,8 @@ from sugar.graphics import animator
 
 from jarabe.model.buddy import get_owner_instance
 from jarabe.view.buddyicon import BuddyIcon
+from jarabe.desktop.viewcontainer import ViewContainer
+from jarabe.desktop.favoriteslayout import SpreadLayout
 
 
 class _Animation(animator.Animation):
@@ -36,7 +38,7 @@ class _Animation(animator.Animation):
         self._icon.props.pixel_size = int(self.start_size + d)
 
 
-class TransitionBox(BuddyIcon):
+class TransitionBox(ViewContainer):
     __gtype_name__ = 'SugarTransitionBox'
 
     __gsignals__ = {
@@ -44,8 +46,12 @@ class TransitionBox(BuddyIcon):
     }
 
     def __init__(self):
-        BuddyIcon.__init__(self, buddy=get_owner_instance(),
-                           pixel_size=style.XLARGE_ICON_SIZE)
+        layout = SpreadLayout()
+
+        # Round off icon size to an even number to ensure that the icon
+        self._owner_icon = BuddyIcon(buddy=get_owner_instance(),
+                                     pixel_size=style.XLARGE_ICON_SIZE & ~1)
+        ViewContainer.__init__(self, layout, self._owner_icon)
 
         self._animator = animator.Animator(0.3)
         self._animator.connect('completed', self._animation_completed_cb)
@@ -55,5 +61,5 @@ class TransitionBox(BuddyIcon):
 
     def start_transition(self, start_size, end_size):
         self._animator.remove_all()
-        self._animator.add(_Animation(self, start_size, end_size))
+        self._animator.add(_Animation(self._owner_icon, start_size, end_size))
         self._animator.start()
diff --git a/src/jarabe/desktop/viewtoolbar.py b/src/jarabe/desktop/viewtoolbar.py
index 9db301a..f0e3943 100644
--- a/src/jarabe/desktop/viewtoolbar.py
+++ b/src/jarabe/desktop/viewtoolbar.py
@@ -17,6 +17,7 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
+from gettext import gettext as _
 import logging
 
 import gtk
@@ -24,9 +25,13 @@ import gobject
 
 from sugar.graphics import style
 from sugar.graphics import iconentry
+from sugar.graphics.radiotoolbutton import RadioToolButton
+
+from jarabe.desktop import favoritesview
 
 _AUTOSEARCH_TIMEOUT = 1000
-_FILTERED_ALPHA = 0.33
+_FAVORITES_VIEW = 0
+_LIST_VIEW = 1
 
 
 class ViewToolbar(gtk.Toolbar):
@@ -35,6 +40,8 @@ class ViewToolbar(gtk.Toolbar):
     __gsignals__ = {
         'query-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
                           ([str])),
+        'view-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
+                         ([object])),
     }
 
     def __init__(self):
@@ -61,6 +68,30 @@ class ViewToolbar(gtk.Toolbar):
 
         self._add_separator(expand=True)
 
+        self._favorites_button = FavoritesButton()
+        self._favorites_button.connect('toggled',
+                                       self.__view_button_toggled_cb,
+                                       _FAVORITES_VIEW)
+        self.insert(self._favorites_button, -1)
+
+        self._list_button = RadioToolButton(named_icon='view-list')
+        self._list_button.props.group = self._favorites_button
+        self._list_button.props.tooltip = _('List view')
+        self._list_button.props.accelerator = _('<Ctrl>2')
+        self._list_button.connect('toggled', self.__view_button_toggled_cb,
+                                      _LIST_VIEW)
+        self.insert(self._list_button, -1)
+
+        self._add_separator()
+
+    def show_view_buttons(self):
+        self._favorites_button.show()
+        self._list_button.show()
+
+    def hide_view_buttons(self):
+        self._favorites_button.hide()
+        self._list_button.hide()
+
     def _add_separator(self, expand=False):
         separator = gtk.SeparatorToolItem()
         separator.props.draw = False
@@ -95,3 +126,59 @@ class ViewToolbar(gtk.Toolbar):
         self._autosearch_timer = None
         self.search_entry.activate()
         return False
+
+    def __view_button_toggled_cb(self, button, view):
+        if button.props.active:
+            self.search_entry.grab_focus()
+            self.emit('view-changed', view)
+
+
+class FavoritesButton(RadioToolButton):
+    __gtype_name__ = 'SugarFavoritesButton'
+
+    def __init__(self):
+        RadioToolButton.__init__(self)
+
+        self.props.tooltip = _('Favorites view')
+        self.props.accelerator = _('<Ctrl>1')
+        self.props.group = None
+
+        favorites_settings = favoritesview.get_settings()
+        self._layout = favorites_settings.layout
+        self._update_icon()
+
+        # someday, this will be a gtk.Table()
+        layouts_grid = gtk.HBox()
+        layout_item = None
+        for layoutid, layoutclass in sorted(favoritesview.LAYOUT_MAP.items()):
+            layout_item = RadioToolButton(icon_name=layoutclass.icon_name,
+                                          group=layout_item, active=False)
+            if layoutid == self._layout:
+                layout_item.set_active(True)
+            layouts_grid.pack_start(layout_item, fill=False)
+            layout_item.connect('toggled', self.__layout_activate_cb,
+                                layoutid)
+        layouts_grid.show_all()
+        self.props.palette.set_content(layouts_grid)
+
+    def __layout_activate_cb(self, menu_item, layout):
+        if not menu_item.get_active():
+            return
+        if self._layout == layout and self.props.active:
+            return
+
+        if self._layout != layout:
+            self._layout = layout
+            self._update_icon()
+
+            favorites_settings = favoritesview.get_settings()
+            favorites_settings.layout = layout
+
+        if not self.props.active:
+            self.props.active = True
+        else:
+            self.emit('toggled')
+
+    def _update_icon(self):
+        self.props.named_icon = favoritesview.LAYOUT_MAP[self._layout]\
+                                .icon_name
-- 
1.7.11.4



More information about the Sugar-devel mailing list