[Sugar-devel] [PATCH] Start implementation de new toolbars

Gonzalo Odiard godiard at sugarlabs.org
Fri Apr 15 10:06:09 EDT 2011


I have not moved the record buttons yet.
The general design of the UI is discussed in
http://wiki.laptop.org/go/User:Godiard/Record/NewToolbar#Ideas_to_discuss_the_UI_for_Record
---
 record.py          |  152 +++++++++++++++++++++++++++++++++++++++++-----------
 toolbarcombobox.py |   59 --------------------
 2 files changed, 121 insertions(+), 90 deletions(-)
 delete mode 100644 toolbarcombobox.py

diff --git a/record.py b/record.py
index d957421..c19fb02 100644
--- a/record.py
+++ b/record.py
@@ -43,10 +43,17 @@ import constants
 from instance import Instance
 import utils
 from tray import HTray
-from toolbarcombobox import ToolComboBox
+from sugar.graphics.toolcombobox import ToolComboBox
 from mediaview import MediaView
 import hw
 
+from sugar.graphics.toolbarbox import ToolbarBox
+from sugar.graphics.toolbarbox import ToolbarButton
+from sugar.graphics.toolbutton import ToolButton
+from sugar.activity.widgets import StopButton
+from sugar.activity.widgets import ActivityToolbarButton
+from sugar.activity.widgets import CopyButton
+
 logger = logging.getLogger('record.py')
 COLOR_BLACK = gdk.color_parse('#000000')
 COLOR_WHITE = gdk.color_parse('#ffffff')
@@ -81,7 +88,7 @@ class Record(activity.Activity):
         self._media_view.realize_video()
 
         # Changing to the first toolbar kicks off the rest of the setup
-        self._toolbox.set_current_toolbar(1)
+        self.model.change_mode(constants.MODE_PHOTO)
 
     def read_file(self, path):
         self.model.read_file(path)
@@ -111,31 +118,81 @@ class Record(activity.Activity):
         self.connect_after('key-press-event', self._key_pressed)
 
         self._active_toolbar_idx = 0
-        self._toolbox = activity.ActivityToolbox(self)
-        self.set_toolbox(self._toolbox)
-        self._toolbar_modes = [None]
 
-        # remove Toolbox's hardcoded grey separator
-        self._toolbox.remove(self._toolbox._separator)
+        self._toolbar_box = ToolbarBox()
+        self.activity_button = ActivityToolbarButton(self)
+        self._toolbar_box.toolbar.insert(self.activity_button, 0)
+        self.set_toolbar_box(self._toolbar_box)
+        self._toolbar = self.get_toolbar_box().toolbar
+
+        edit_button = ToolbarButton()
+        self._edit_toolbar = EditToolbar(self)
+        edit_button.set_page(self._edit_toolbar)
+        edit_button.props.icon_name = 'toolbar-edit'
+        edit_button.props.label = _('Edit')
+        self._toolbar.insert(edit_button, -1)
+
+        view_button = ToolbarButton()
+        self._view_toolbar = ViewToolbar(self)
+        view_button.set_page(self._view_toolbar)
+        view_button.props.icon_name = 'toolbar-view'
+        view_button.props.label = _('View')
+        self._toolbar.insert(view_button, -1)
+
+        self._toolbar.insert(gtk.SeparatorToolItem(), -1)
+
+        self._toolbar_modes = [None]
 
         if self.model.get_has_camera():
             self._photo_toolbar = PhotoToolbar()
-            self._toolbox.add_toolbar(_('Photo'), self._photo_toolbar)
-            self._toolbar_modes.append(constants.MODE_PHOTO)
+            photo_button = ToolbarButton()
+            photo_button.set_page(self._photo_toolbar)
+            photo_button.props.icon_name = 'camera-external'
+            photo_button.props.label = _('Photo')
+            photo_button.mode = constants.MODE_PHOTO
+            photo_button.connect('clicked', self.__mode_button_clicked)
+            # disable auto popup
+            photo_button.get_child().disconnect(
+                    photo_button._palette_invoker._enter_hid)
+            self._toolbar.insert(photo_button, -1)
 
             self._video_toolbar = VideoToolbar()
-            self._toolbox.add_toolbar(_('Video'), self._video_toolbar)
+            video_button = ToolbarButton()
+            video_button.set_page(self._video_toolbar)
+            video_button.props.icon_name = 'media-video'
+            video_button.props.label = _('Video')
+            video_button.mode = constants.MODE_VIDEO
+            video_button.connect('clicked', self.__mode_button_clicked)
+            # disable auto popup
+            video_button.get_child().disconnect(
+                    video_button._palette_invoker._enter_hid)
+            self._toolbar.insert(video_button, -1)
+
+            self._toolbar_modes.append(constants.MODE_PHOTO)
             self._toolbar_modes.append(constants.MODE_VIDEO)
         else:
             self._photo_toolbar = None
             self._video_toolbar = None
 
         self._audio_toolbar = AudioToolbar()
-        self._toolbox.add_toolbar(_('Audio'), self._audio_toolbar)
+        audio_button = ToolbarButton()
+        audio_button.set_page(self._audio_toolbar)
+        audio_button.props.icon_name = 'media-audio'
+        audio_button.props.label = _('Audio')
+        audio_button.mode = constants.MODE_AUDIO
+        audio_button.connect('clicked', self.__mode_button_clicked)
+        # disable auto popup
+        audio_button.get_child().disconnect(
+                audio_button._palette_invoker._enter_hid)
+        self._toolbar.insert(audio_button, -1)
         self._toolbar_modes.append(constants.MODE_AUDIO)
 
-        self._toolbox.show_all()
-        self._toolbox.connect("current-toolbar-changed", self._toolbar_changed)
+        separator = gtk.SeparatorToolItem()
+        separator.props.draw = False
+        separator.set_expand(True)
+        self._toolbar.insert(separator, -1)
+        self._toolbar.insert(StopButton(self), -1)
+        self.get_toolbar_box().show_all()
 
         main_box = gtk.VBox()
         self.set_canvas(main_box)
@@ -330,27 +387,29 @@ class Record(activity.Activity):
 
     def _toggle_fullscreen(self):
         if not self._fullscreen:
-            self._toolbox.hide()
+            self._toolbar_box.hide()
             self._thumb_tray.hide()
         else:
-            self._toolbox.show()
+            self._toolbar_box.show()
             self._thumb_tray.show()
 
         self._fullscreen = not self._fullscreen
         self._media_view.set_fullscreen(self._fullscreen)
 
-    def _toolbar_changed(self, toolbox, num):
-        if num == 0: # Activity tab
-            return
 
+    def __mode_button_clicked(self, button):
         # Prevent mode/tab changing under certain conditions by immediately
         # changing back to the previously-selected toolbar
+        """
         if self.model.ui_frozen():
             self._toolbox.set_current_toolbar(self._active_toolbar_idx)
             return
 
         self._active_toolbar_idx = num
         self.model.change_mode(self._toolbar_modes[num])
+        """
+        if not self.model.ui_frozen():
+            self.model.change_mode(button.mode)
 
     def _shutter_clicked(self, arg):
         self.model.do_shutter()
@@ -816,19 +875,6 @@ class RecordToolbar(gtk.Toolbar):
     def __init__(self, icon_name, with_quality, with_timer, with_duration):
         super(RecordToolbar, self).__init__()
 
-        img = Icon(icon_name=icon_name)
-        color = sugar.profile.get_color()
-        img.set_property('fill-color', color.get_fill_color())
-        img.set_property('stroke-color', color.get_stroke_color())
-        toolitem = gtk.ToolItem()
-        toolitem.add(img)
-        self.insert(toolitem, -1)
-
-        separator = gtk.SeparatorToolItem()
-        separator.set_draw(False)
-        separator.set_expand(True)
-        self.insert(separator, -1)
-
         if with_quality:
             combo = gtk.combo_box_new_text()
             self.quality = ToolComboBox(combo=combo, label_text=_('Quality:'))
@@ -847,6 +893,7 @@ class RecordToolbar(gtk.Toolbar):
         if with_duration:
             self._duration_combo = DurationCombo()
             self.insert(self._duration_combo, -1)
+        self.show_all()
 
     def get_timer(self):
         return self._timer_combo.get_value()
@@ -941,3 +988,46 @@ class DurationCombo(ToolComboBox):
     def _minutes_string(x):
         return ngettext('%s minute', '%s minutes', x) % x
 
+class EditToolbar(gtk.Toolbar):
+
+    def __init__(self, record_activity):
+        gtk.Toolbar.__init__(self)
+        self._activity = record_activity
+        self.copy = CopyButton()
+        self.insert(self.copy, -1)
+        self.copy.show()
+        self.copy.connect('clicked', self.__copy_clicked)
+
+    def __copy_clicked(self, button):
+        self._activity._copy_to_clipboard(self._activity._active_recd)
+
+class ViewToolbar(gtk.Toolbar):
+
+    def __init__(self, record_activity):
+        gtk.Toolbar.__init__(self)
+        self._activity = record_activity
+
+        full_screen_button = ToolButton('view-fullscreen')
+        full_screen_button.props.label = _('Fullscreen')
+        self.insert(full_screen_button, -1)
+        full_screen_button.connect('clicked', self.__fullscreen_clicked)
+
+        tray_button = ToolButton('tray-hide')
+        tray_button.props.label = _('Hide tray')
+        tray_button.connect('clicked', self.__tray_clicked_cb)
+        self.insert(tray_button, -1)
+
+        self.show_all()
+
+    def __fullscreen_clicked(self, button):
+        self._activity._toggle_fullscreen()
+
+    def __tray_clicked_cb(self, button):
+        if self._activity._thumb_tray.props.visible is False:
+            self._activity._thumb_tray.show()
+            button.set_icon('tray-hide')
+            button.set_tooltip(_('Hide Tray'))
+        else:
+            self._activity._thumb_tray.hide()
+            button.set_icon('tray-show')
+            button.set_tooltip(_('Show Tray'))
diff --git a/toolbarcombobox.py b/toolbarcombobox.py
deleted file mode 100644
index e455414..0000000
--- a/toolbarcombobox.py
+++ /dev/null
@@ -1,59 +0,0 @@
-# Copyright (C) 2007, Red Hat, Inc.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the
-# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-
-import gtk
-import gobject
-
-from sugar.graphics.combobox import ComboBox
-from sugar.graphics import style
-
-class ToolComboBox(gtk.ToolItem):
-    __gproperties__ = {
-        'label-text' : (str, None, None, None,
-                        gobject.PARAM_WRITABLE),
-    }
-
-    def __init__(self, combo=None, **kwargs):
-        self.label = None
-        self._label_text = ''
-
-        gobject.GObject.__init__(self, **kwargs)
-
-        self.set_border_width(int(style.DEFAULT_PADDING*3.5))
-
-        hbox = gtk.HBox(False, style.DEFAULT_SPACING)
-
-        self.label = gtk.Label(self._label_text)
-        hbox.pack_start(self.label, False)
-        self.label.show()
-
-        if combo:
-            self.combo = combo
-        else:
-            self.combo = ComboBox()
-
-        hbox.pack_start(self.combo)
-        self.combo.show()
-
-        self.add(hbox)
-        hbox.show()
-
-    def do_set_property(self, pspec, value):
-        if pspec.name == 'label-text':
-            self._label_text = value
-            if self.label:
-                self.label.set_text(self._label_text)
-- 
1.7.4.2



More information about the Sugar-devel mailing list