From 76ca747b364bbfa06bf0869f7e62df2947672d48 Mon Sep 17 00:00:00 2001 From: Thorin Date: Fri, 19 Mar 2010 03:51:27 +0000 Subject: Create repository and load --- (limited to 'J2JToolbar.py') diff --git a/J2JToolbar.py b/J2JToolbar.py new file mode 100755 index 0000000..550fa78 --- /dev/null +++ b/J2JToolbar.py @@ -0,0 +1,301 @@ +import gtk, gst, thread, tempfile, time, os +import pygame +import olpcgames +from gettext import gettext as _ +from sugar.graphics.toolbutton import ToolButton +from sugar.graphics.toolcombobox import ToolComboBox +import logging + +log = logging.getLogger('City run') +log.setLevel(logging.DEBUG) + +ImagePath = os.path.dirname(os.path.abspath(__file__)) + "/City/Images" + +GST_PIPE = ['v4l2src', 'ffmpegcolorspace', 'pngenc'] + +class readScenes(object): + def __init__(self, scpath): + self.scpath = scpath + self.scene_names = [dir for dir in os.listdir(self.scpath) if os.path.isdir(self.scpath + '/' + dir)] + self.scene_data = [] + for n in self.scene_names: + fp = self.scpath + "/" + n + mdfile = [open(fp + '/' + f) for f in os.listdir(fp) if os.path.isfile(fp + "/" + f) and f.startswith(n)] + if mdfile: + result = {"Name":n} + defaults = {} + for line in mdfile[0]: + if line.startswith('#') or line.startswith('\n'): + pass + else: + keyvals = line.split('=') + if len(keyvals) == 2: + key = keyvals[0].upper() + val = (keyvals[1][:-1] if keyvals[1][-1] == '\n' else keyvals[1]) + if key.startswith('TEMPO'): + result['Tempo'] = val.replace(' ','') + elif key.startswith('KEY'): + result['Key'] = val.replace(' ','') + elif key.startswith('MODE'): + result['Mode'] = val.replace(' ','') + else: + pass + else: + raise IOError, "Bad Scene Meta Data file: %s" %keyvals + result['Defaults'] = {} + self.scene_data.append(result) + else: + raise IOError, "Can't find Meta Data file in %s Scene" %n + def scene_instruct(self, name): + "returns a list of strings suitable to give to a ScenePlayer object for creating a scene" + for scd in self.scene_data: + if scd['Name'] == name: + collected = [name] + for k in ['Key', 'Mode', 'Tempo', 'Defaults']: + try: + collected.append(str(scd[k])) + except KeyError: + collected.append('None') + return collected + def get_scene_list(self): + "returns a list of scene strings for the toolbar, with City as the default" + ordered_names = self.scene_names[:] + if 'City' in ordered_names: + ordered_names.insert(0,ordered_names.pop(ordered_names.index('City'))) + return [self.scene_instruct(s) for s in ordered_names] + +class CameraSnap(object): + """A class representing the OLPC camera.""" + def __init__(self): + log.info("CameraSnap init") + snap_file, self.snap_path = tempfile.mkstemp(suffix = '.png') + pipe = GST_PIPE + ['filesink location=%s' % self.snap_path] + self.pipe = gst.parse_launch('!'.join(pipe)) + self.bus = self.pipe.get_bus() + log.info("tempfile is %s " %self.snap_path) + def Snap(self): + """Take a snapshot.""" + log.info("about to set pipe state to PLAY") + self.pipe.set_state(gst.STATE_PLAYING) + log.info("about to poll") + thread.start_new_thread(self.bus.poll, (gst.MESSAGE_EOS, -1)) + for i in xrange(60): + time.sleep(0.18) + if os.path.getsize(self.snap_path) > 0: break + else: raise IOError, "Error writing camera snap to file" + return self.snap_path + def Stop(self): + self.pipe.set_state(gst.STATE_NULL) + + +class Jam2JamToolBar(gtk.Toolbar): + def __init__(self, activity): + gtk.Toolbar.__init__(self) + self.activity = activity + self.parameters = ['Density', 'Pitch', 'Length', 'Timbre', 'Volume'] # no tempo here. + scene_stuff = readScenes(self.activity._ScenePath) + self.scenes = scene_stuff.get_scene_list() + print "SCENE DATA IS ", self.scenes + #self.scenes = [['City', 'A', 'minor pentatonic'], ['City', 'G#', 'major']] #this data needs to be obtained from directories + self.play_pause_state = 'Playing' + self.scene_init = True + + # Separator + separator = gtk.SeparatorToolItem() + separator.set_draw(True) + self.insert(separator, -1) + + #Horizontal Parameter control combobox + self._add_widget(gtk.Label(_('Horizontal:'))) + self._Hparameter_combo = ToolComboBox() + for i, f in enumerate(self.parameters): + self._Hparameter_combo.combo.append_item(i, f) + self._Hparameter_combo.combo.connect('changed', self._Hparameter_change_cb) + self._add_widget(self._Hparameter_combo) + self._Hparameter_combo.combo.set_active(0) + + # Separator + separator = gtk.SeparatorToolItem() + separator.set_draw(True) + separator.show() + self.insert(separator, -1) + + #Vertical Parameter control combobox + self._add_widget(gtk.Label(_('Vertical:'))) + self._Vparameter_combo = ToolComboBox() + for j, k in enumerate(self.parameters): + self._Vparameter_combo.combo.append_item(j, k) + self._Vparameter_combo.combo.connect('changed', self._Vparameter_change_cb) + self._add_widget(self._Vparameter_combo) + self._Vparameter_combo.combo.set_active(1) + + # Separator + separator = gtk.SeparatorToolItem() + separator.set_draw(True) + separator.show() + self.insert(separator, -1) + + + #Scene Selection control combobox + self._add_widget(gtk.Label(_('Scene:'))) + self._Scene_combo = ToolComboBox() + for l, m in enumerate(self.scenes): + self._Scene_combo.combo.append_item(l, m[0]) + self._Scene_combo.combo.connect('changed', self._Scene_change_cb) + self._add_widget(self._Scene_combo) + #ought to do this safely somehow. + self._Scene_combo.combo.set_active(0) + self.scene_init = False + + # Separator + separator = gtk.SeparatorToolItem() + separator.set_draw(True) + separator.show() + self.insert(separator, -1) + + + #Camera Button + self.camera_ready = True + camera_icon = ImagePath + "/camera-external.svg" + camera_busy_icon = ImagePath + "/camera-busy.svg" + self.camera_image, self.camera_busy_image = gtk.Image(), gtk.Image() + self.camera_image.set_from_file(camera_icon) + self.camera_busy_image.set_from_file(camera_busy_icon) + self.camera_image.show() + #camera_busy_image.show() + self._cameraButton = ToolButton() + self._cameraButton.set_icon_widget(self.camera_image) + self._cameraButton.connect('clicked', self._cameraSnap_cb) + self._cameraButton.set_tooltip(_('Snapshot')) + self.insert(self._cameraButton, -1) + self._cameraButton.show() + + # Separator + separator = gtk.SeparatorToolItem() + separator.set_draw(True) + separator.show() + self.insert(separator, -1) + + #Play/Pause Button + pause_icon = ImagePath + "/media-playback-pause.svg" + play_icon = ImagePath + "/media-playback-start.svg" + self.pause_image = gtk.Image() + self.pause_image.set_from_file(pause_icon) + + self.play_image = gtk.Image() + self.play_image.set_from_file(play_icon) + + self._pauseButton = ToolButton() + self._pauseButton.connect('clicked', self._pause_cb) + self.pause_image.show() + self._pauseButton.set_icon_widget(self.pause_image) + self._pauseButton.set_tooltip(_('Pause')) + #self._toggleplay_pause() + self.insert(self._pauseButton, -1) + self._pauseButton.show() + + # Separator + separator = gtk.SeparatorToolItem() + separator.set_draw(True) + separator.show() + self.insert(separator, -1) + + + def _add_widget(self, widget, expand=False): + tool_item = gtk.ToolItem() + tool_item.set_expand(expand) + tool_item.add(widget) + widget.show() + self.insert(tool_item, -1) + tool_item.show() + + def _toggleplay_pause(self): + if self.play_pause_state == "Playing": + self.activity.jamScene.music_player.pause() + self.play_image.show() + self._pauseButton.set_icon_widget(self.play_image) + self._pauseButton.set_tooltip(_('Play')) + self.play_pause_state = "Paused" + else: + self.activity.jamScene.music_player.resume() + self.pause_image.show() + self._pauseButton.set_icon_widget(self.pause_image) + self._pauseButton.set_tooltip(_('Pause')) + self.play_pause_state = "Playing" + try: + self.activity._pgc.grab_focus() + except AttributeError: + pass + + def _show_busy_camera(self): + self.camera_ready = False + self.camera_busy_image.show() + self._cameraButton.set_icon_widget(self.camera_busy_image) + self._cameraButton.set_tooltip(_('Please wait...')) + + def _show_active_camera(self): + self.camera_image.show() + self._cameraButton.set_icon_widget(self.camera_image) + self._cameraButton.set_tooltip(_('Snap')) + self.camera_ready = True + + def _Hparameter_change_cb(self, widget): + param = "Parameter|Horizontal|" + self.parameters[self._Hparameter_combo.combo.get_active()] + olpcgames.eventwrap.post(olpcgames.eventwrap.Event(pygame.USEREVENT, action=param)) + try: + self.activity._pgc.grab_focus() + except AttributeError: + pass + + def _Vparameter_change_cb(self, widget): + param = "Parameter|Vertical|" + self.parameters[self._Vparameter_combo.combo.get_active()] + olpcgames.eventwrap.post(olpcgames.eventwrap.Event(pygame.USEREVENT, action=param)) + try: + self.activity._pgc.grab_focus() + except AttributeError: + pass + + def _Scene_change_cb(self, widget): + if self.scene_init: + pass + else: + selection = self.scenes[self._Scene_combo.combo.get_active()] + scene = "Reload|" + '|'.join(map(lambda x: str(x), selection)) + olpcgames.eventwrap.post(olpcgames.eventwrap.Event(pygame.USEREVENT, action=scene)) + try: + self.activity._pgc.grab_focus() + except AttributeError: + pass + + ### functions to assist calls from pygame + def deactivate_scene_change(self): + self._Scene_combo.set_sensitive(False) + def reactivate_scene_change(self): + self._Scene_combo.set_sensitive(True) + def set_horizontal_parameter(self, param): + ndx = self.parameters.index(param) + self._Hparameter_combo.combo.set_active(ndx) + def set_vertical_parameter(self, param): + ndx = self.parameters.index(param) + self._Vparameter_combo.combo.set_active(ndx) + + def _cameraSnap_cb(self, widget): + "Here I could wrap a camera event..." + def snaptime(): + snap = CameraSnap() + self.activity.cameras_loaded.append(snap) + picpath = snap.Snap() + self.activity.load_image(picpath) + snap.Stop() + self._show_active_camera() + self.activity._pgc.grab_focus() + if self.camera_ready: + self._show_busy_camera() + thread.start_new_thread(snaptime, ()) + else: + log.info('Ignoring request to use camera, as camera is currently busy') + + def _pause_cb(self, widget): + self._toggleplay_pause() + log.info("Play/Pause Button pressed") + -- cgit v0.9.1