Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGonzalo Odiard <godiard@sugarlabs.org>2011-05-18 20:50:26 (GMT)
committer Daniel Drake <dsd@laptop.org>2011-05-20 17:44:30 (GMT)
commita7d32680785f8775df4651c64f6c68247f557d10 (patch)
tree7297740228fb00c7b6c0e0f873391983f0a8c597
parentdb8c5918907405cebe87b4367b3c48358d9da453 (diff)
Port to new activity toolbars
[dsd: minor tweaks, dont allow mode-change while not in STATE_READY]
-rw-r--r--model.py1
-rw-r--r--record.py228
-rw-r--r--toolbarcombobox.py59
3 files changed, 111 insertions, 177 deletions
diff --git a/model.py b/model.py
index 7ce2bc1..a6d06cb 100644
--- a/model.py
+++ b/model.py
@@ -113,6 +113,7 @@ class Model:
for recd in self.mediaHashs[mode]:
self.activity.add_thumbnail(recd, True)
+ self.activity.set_mode(mode)
self.set_state(constants.STATE_READY)
if mode == constants.MODE_PHOTO:
diff --git a/record.py b/record.py
index d957421..c7c9031 100644
--- a/record.py
+++ b/record.py
@@ -33,9 +33,13 @@ import pygst
pygst.require('0.10')
import gst
-import sugar.profile
from sugar.activity import activity
-from sugar.graphics.icon import Icon
+from sugar.graphics.toolcombobox import ToolComboBox
+from sugar.graphics.toolbarbox import ToolbarBox
+from sugar.graphics.toolbarbox import ToolbarButton
+from sugar.graphics.radiotoolbutton import RadioToolButton
+from sugar.activity.widgets import StopButton
+from sugar.activity.widgets import ActivityToolbarButton
from model import Model
from button import RecdButton
@@ -43,7 +47,6 @@ import constants
from instance import Instance
import utils
from tray import HTray
-from toolbarcombobox import ToolComboBox
from mediaview import MediaView
import hw
@@ -81,7 +84,10 @@ 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)
+ if self.model.get_has_camera():
+ self.model.change_mode(constants.MODE_PHOTO)
+ else:
+ self.model.change_mode(constants.MODE_AUDIO)
def read_file(self, path):
self.model.read_file(path)
@@ -111,31 +117,53 @@ 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()
+ activity_button = ActivityToolbarButton(self)
+ self._toolbar_box.toolbar.insert(activity_button, 0)
+ self.set_toolbar_box(self._toolbar_box)
+ self._toolbar = self.get_toolbar_box().toolbar
+ tool_group = 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)
-
- self._video_toolbar = VideoToolbar()
- self._toolbox.add_toolbar(_('Video'), self._video_toolbar)
- self._toolbar_modes.append(constants.MODE_VIDEO)
+ self._photo_button = RadioToolButton()
+ self._photo_button.props.group = tool_group
+ tool_group = self._photo_button
+ self._photo_button.props.icon_name = 'camera-external'
+ self._photo_button.props.label = _('Photo')
+ self._photo_button.mode = constants.MODE_PHOTO
+ self._photo_button.connect('clicked', self._mode_button_clicked)
+ self._toolbar.insert(self._photo_button, -1)
+
+ self._video_button = RadioToolButton()
+ self._video_button.props.group = tool_group
+ self._video_button.props.icon_name = 'media-video'
+ self._video_button.props.label = _('Video')
+ self._video_button.mode = constants.MODE_VIDEO
+ self._video_button.connect('clicked', self._mode_button_clicked)
+ self._toolbar.insert(self._video_button, -1)
else:
- self._photo_toolbar = None
- self._video_toolbar = None
+ self._photo_button = None
+ self._video_button = None
- self._audio_toolbar = AudioToolbar()
- self._toolbox.add_toolbar(_('Audio'), self._audio_toolbar)
- self._toolbar_modes.append(constants.MODE_AUDIO)
+ self._audio_button = RadioToolButton()
+ self._audio_button.props.group = tool_group
+ self._audio_button.props.icon_name = 'media-audio'
+ self._audio_button.props.label = _('Audio')
+ self._audio_button.mode = constants.MODE_AUDIO
+ self._audio_button.connect('clicked', self._mode_button_clicked)
+ self._toolbar.insert(self._audio_button, -1)
- self._toolbox.show_all()
- self._toolbox.connect("current-toolbar-changed", self._toolbar_changed)
+ self._toolbar.insert(gtk.SeparatorToolItem(), -1)
+
+ self._toolbar_controls = RecordControl(self._toolbar)
+
+ 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)
@@ -191,30 +219,16 @@ class Record(activity.Activity):
def serialize(self):
data = {}
- if self._photo_toolbar:
- data['photo_timer'] = self._photo_toolbar.get_timer_idx()
-
- if self._video_toolbar:
- data['video_timer'] = self._video_toolbar.get_timer_idx()
- data['video_duration'] = self._video_toolbar.get_duration_idx()
- data['video_quality'] = self._video_toolbar.get_quality()
-
- data['audio_timer'] = self._audio_toolbar.get_timer_idx()
- data['audio_duration'] = self._audio_toolbar.get_duration_idx()
+ data['timer'] = self._toolbar_controls.get_timer_idx()
+ data['duration'] = self._toolbar_controls.get_duration_idx()
+ data['quality'] = self._toolbar_controls.get_quality()
return data
def deserialize(self, data):
- if self._photo_toolbar:
- self._photo_toolbar.set_timer_idx(data.get('photo_timer', 0))
-
- if self._video_toolbar:
- self._video_toolbar.set_timer_idx(data.get('video_timer', 0))
- self._video_toolbar.set_duration_idx(data.get('video_duration', 0))
- self._video_toolbar.set_quality(data.get('video_quality', 0))
-
- self._audio_toolbar.set_timer_idx(data.get('audio_timer', 0))
- self._audio_toolbar.set_duration_idx(data.get('audio_duration'))
+ self._toolbar_controls.set_timer_idx(data.get('timer', 0))
+ self._toolbar_controls.set_duration_idx(data.get('duration', 0))
+ self._toolbar_controls.set_quality(data.get('quality', 0))
def _key_pressed(self, widget, event):
if self.model.ui_frozen():
@@ -241,6 +255,9 @@ class Record(activity.Activity):
def _play_pause_clicked(self, widget):
self.model.play_pause()
+ def set_mode(self, mode):
+ self._toolbar_controls.set_mode(mode)
+
# can be called from gstreamer thread, so must not do any GTK+ stuff
def set_glive_sink(self, sink):
return self._media_view.set_video_sink(sink)
@@ -250,23 +267,13 @@ class Record(activity.Activity):
return self._media_view.set_video2_sink(sink)
def get_selected_quality(self):
- return self._video_toolbar.get_quality()
+ return self._toolbar_controls.get_quality()
def get_selected_timer(self):
- mode = self.model.get_mode()
- if mode == constants.MODE_PHOTO:
- return self._photo_toolbar.get_timer()
- elif mode == constants.MODE_VIDEO:
- return self._video_toolbar.get_timer()
- elif mode == constants.MODE_AUDIO:
- return self._audio_toolbar.get_timer()
+ return self._toolbar_controls.get_timer()
def get_selected_duration(self):
- mode = self.model.get_mode()
- if mode == constants.MODE_VIDEO:
- return self._video_toolbar.get_duration()
- elif mode == constants.MODE_AUDIO:
- return self._audio_toolbar.get_duration()
+ return self._toolbar_controls.get_duration()
def set_progress(self, value, text):
self._progress.set_progress(value)
@@ -330,27 +337,17 @@ 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
-
- # 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])
+ def _mode_button_clicked(self, button):
+ self.model.change_mode(button.mode)
def _shutter_clicked(self, arg):
self.model.do_shutter()
@@ -359,6 +356,11 @@ class Record(activity.Activity):
self._shutter_button.set_sensitive(value)
def set_state(self, state):
+ radio_state = (state == constants.STATE_READY)
+ for item in (self._photo_button, self._audio_button, self._video_button):
+ if item:
+ item.set_sensitive(radio_state)
+
self._showing_info = False
if state == constants.STATE_READY:
self._set_cursor_default()
@@ -812,41 +814,46 @@ class PlayButton(gtk.Button):
self.set_image(self._pause_image)
-class RecordToolbar(gtk.Toolbar):
- def __init__(self, icon_name, with_quality, with_timer, with_duration):
- super(RecordToolbar, self).__init__()
+class RecordControl():
- 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)
+ def __init__(self, toolbar):
+ self._timer_combo = TimerCombo()
+ toolbar.insert(self._timer_combo, -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:'))
- self.quality.combo.append_text(_('Low'))
- if hw.get_xo_version() != 1:
- # Disable High quality on XO-1. The system simply isn't beefy
- # enough for recording to work well.
- self.quality.combo.append_text(_('High'))
- self.quality.combo.set_active(0)
- self.insert(self.quality, -1)
-
- if with_timer:
- self._timer_combo = TimerCombo()
- self.insert(self._timer_combo, -1)
-
- if with_duration:
- self._duration_combo = DurationCombo()
- self.insert(self._duration_combo, -1)
+ self._duration_combo = DurationCombo()
+ toolbar.insert(self._duration_combo, -1)
+
+ preferences_toolbar = gtk.Toolbar()
+ combo = gtk.combo_box_new_text()
+ self.quality = ToolComboBox(combo=combo, label_text=_('Quality:'))
+ self.quality.combo.append_text(_('Low'))
+ if hw.get_xo_version() != 1:
+ # Disable High quality on XO-1. The system simply isn't beefy
+ # enough for recording to work well.
+ self.quality.combo.append_text(_('High'))
+ self.quality.combo.set_active(0)
+ self.quality.show_all()
+ preferences_toolbar.insert(self.quality, -1)
+
+ preferences_button = ToolbarButton()
+ preferences_button.set_page(preferences_toolbar)
+ preferences_button.props.icon_name = 'preferences-system'
+ preferences_button.props.label = _('Preferences')
+ toolbar.insert(preferences_button, -1)
+
+ def set_mode(self, mode):
+ if mode == constants.MODE_PHOTO:
+ self.quality.set_sensitive(True)
+ self._timer_combo.set_sensitive(True)
+ self._duration_combo.set_sensitive(False)
+ if mode == constants.MODE_VIDEO:
+ self.quality.set_sensitive(True)
+ self._timer_combo.set_sensitive(True)
+ self._duration_combo.set_sensitive(True)
+ if mode == constants.MODE_AUDIO:
+ self.quality.set_sensitive(False)
+ self._timer_combo.set_sensitive(True)
+ self._duration_combo.set_sensitive(True)
def get_timer(self):
return self._timer_combo.get_value()
@@ -872,20 +879,6 @@ class RecordToolbar(gtk.Toolbar):
def set_quality(self, idx):
self.quality.combo.set_active(idx)
-class PhotoToolbar(RecordToolbar):
- def __init__(self):
- super(PhotoToolbar, self).__init__('media-photo', with_quality=False, with_timer=True, with_duration=False)
-
-
-class VideoToolbar(RecordToolbar):
- def __init__(self):
- super(VideoToolbar, self).__init__('media-video', with_quality=True, with_timer=True, with_duration=True)
-
-
-class AudioToolbar(RecordToolbar):
- def __init__(self):
- super(AudioToolbar, self).__init__('media-audio', with_quality=False, with_timer=True, with_duration=True)
-
class TimerCombo(ToolComboBox):
TIMERS = (0, 5, 10)
@@ -940,4 +933,3 @@ class DurationCombo(ToolComboBox):
@staticmethod
def _minutes_string(x):
return ngettext('%s minute', '%s minutes', x) % x
-
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)