From 86e2111461fab98d8c188d50ec8bd0c72c527f73 Mon Sep 17 00:00:00 2001 From: Pootle daemon Date: Mon, 13 Jun 2011 14:23:40 +0000 Subject: Merge branch 'master' of git.sugarlabs.org:turtleart/mainline --- (limited to 'TurtleArt/talogo.py') diff --git a/TurtleArt/talogo.py b/TurtleArt/talogo.py index e3576fa..12be92f 100644 --- a/TurtleArt/talogo.py +++ b/TurtleArt/talogo.py @@ -22,65 +22,22 @@ #THE SOFTWARE. import gtk - from time import time -from math import sqrt -from numpy import append -from numpy.fft import rfft -from random import uniform -from operator import isNumberType -from fcntl import ioctl - -import os.path +from operator import isNumberType from UserDict import UserDict -try: - from sugar.datastore import datastore -except ImportError: - pass - -from taconstants import TAB_LAYER, BLACK, WHITE, \ - DEFAULT_SCALE, ICON_SIZE, BLOCK_NAMES, CONSTANTS, SENSOR_DC_NO_BIAS, \ - SENSOR_DC_BIAS, XO1, XO15 -from tagplay import play_audio_from_file, play_movie_from_file, stop_media, \ - media_playing -from tacamera import Camera -import v4l2 -from tajail import myfunc, myfunc_import +from taconstants import TAB_LAYER, DEFAULT_SCALE, PREFIX_DICTIONARY +from tapalette import block_names, value_blocks from tautils import get_pixbuf_from_journal, convert, data_from_file, \ - text_media_type, round_int, chr_to_ord, strtype, get_path - -from RtfParser import RtfTextOnly + text_media_type, round_int, debug_output -from ringbuffer import RingBuffer1d +from util.RtfParser import RtfTextOnly from gettext import gettext as _ -VALUE_BLOCKS = ['box1', 'box2', 'color', 'shade', 'gray', 'scale', 'pensize', - 'heading', 'xcor', 'ycor', 'pop', 'see', 'keyboard', - 'sound', 'volume', 'pitch', 'resistance', 'voltage', - 'luminance'] - -import logging -_logger = logging.getLogger('turtleart-activity') - - -def find_device(): - """ Search for RFID devices. Return a device instance or None. """ - device = None - for i in os.listdir(os.path.join('.', 'devices')): - if not os.path.isdir(os.path.join('.', 'devices', i)): - try: - _tempmod = __import__('devices.%s' % i.split('.')[0], - globals(), locals(), ['RFIDReader'], -1) - devtemp = _tempmod.RFIDReader() - if devtemp.get_present() == True: - device = devtemp - except Exception, e: - _logger.error('FIND_DEVICE: %s: %s' % (i, e)) - pass - return device +media_blocks_dictionary = {} # new media blocks get added here +primitive_dictionary = {} # new block primitives get added here class noKeyError(UserDict): @@ -112,213 +69,6 @@ class logoerror(Exception): # Utility functions - -def _num_type(x): - """ Is x a number type? """ - if type(x) == int: - return True - if type(x) == float: - return True - if type(x) == ord: - return True - return False - - -def _string_to_num(x): - """ Try to comvert a string to a number """ - xx = convert(x.replace(self.tw.decimal_point, '.'), float) - if type(xx) is float: - return xx - else: - xx, xflag = chr_to_ord(x) - if xflag: - return xx - else: - raise logoerror("#syntaxerror") - - -def _and(x, y): - """ Logical and """ - return x & y - - -def _or(x, y): - """ Logical or """ - return x | y - - -def _careful_divide(x, y): - """ Raise error on divide by zero """ - try: - return x / y - except ZeroDivisionError: - raise logoerror("#zerodivide") - except TypeError: - try: - return _string_to_num(x) / _string_to_num(y) - except ZeroDivisionError: - raise logoerror("#zerodivide") - except ValueError: - raise logoerror("#syntaxerror") - except TypeError: - raise logoerror("#notanumber") - - -def _equal(x, y): - """ Numeric and logical equal """ - try: - return float(x) == float(y) - except TypeError: - typex, typey = False, False - if strtype(x): - typex = True - if strtype(y): - typey = True - if typex and typey: - return x == y - try: - return _string_to_num(x) == _string_to_num(y) - except ValueError: - raise logoerror("#syntaxerror") - - -def _less(x, y): - """ Compare numbers and strings """ - try: - return float(x) < float(y) - except ValueError: - typex, typey = False, False - if strtype(x): - typex = True - if strtype(y): - typey = True - if typex and typey: - return x < y - try: - return _string_to_num(x) < _string_to_num(y) - except TypeError: - raise logoerror("#notanumber") - - -def _more(x, y): - """ Compare numbers and strings """ - return _less(y, x) - - -def _plus(x, y): - """ Add numbers, concat strings """ - if _num_type(x) and _num_type(y): - return(x + y) - else: - if _num_type(x): - xx = str(round_int(x)) - else: - xx = str(x) - if _num_type(y): - yy = str(round_int(y)) - else: - yy = str(y) - return(xx + yy) - - -def _minus(x, y): - """ Numerical subtraction """ - if _num_type(x) and _num_type(y): - return(x - y) - try: - return _string_to_num(x) - _string_to_num(y) - except TypeError: - raise logoerror("#notanumber") - - -def _product(x, y): - """ Numerical multiplication """ - if _num_type(x) and _num_type(y): - return(x * y) - try: - return _string_to_num(x) * _string_to_num(y) - except TypeError: - raise logoerror("#notanumber") - - -def _mod(x, y): - """ Numerical mod """ - if _num_type(x) and _num_type(y): - return(x % y) - try: - return _string_to_num(x) % _string_to_num(y) - except TypeError: - raise logoerror("#notanumber") - except ValueError: - raise logoerror("#syntaxerror") - - -def _sqrt(x): - """ Square root """ - if _num_type(x): - if x < 0: - raise logoerror("#negroot") - return sqrt(x) - try: - return sqrt(_string_to_num(x)) - except ValueError: - raise logoerror("#negroot") - except TypeError: - raise logoerror("#notanumber") - - -def _random(x, y): - """ Random integer """ - if _num_type(x) and _num_type(y): - return(int(round(uniform(x, y), 0))) - xx, xflag = chr_to_ord(x) - yy, yflag = chr_to_ord(y) - if xflag and yflag: - return chr(int(round(uniform(xx, yy), 0))) - if not xflag: - xx = _string_to_num(x) - if not yflag: - yy = _string_to_num(y) - try: - return(int(round(uniform(xx, yy), 0))) - except TypeError: - raise logoerror("#notanumber") - - -def _identity(x): - """ Identity function """ - return(x) - - -def _avg(array, abs_value=False): - """ Calc. the average value of an array """ - if len(array) == 0: - return 0 - array_sum = 0 - if abs_value: - for a in array: - array_sum += abs(a) - else: - for a in array: - array_sum += a - return float(array_sum) / len(array) - - -def stop_logo(tw): - """ Stop logo is called from the Stop button on the toolbar """ - tw.step_time = 0 - tw.lc.step = _just_stop() - stop_media(tw.lc) - if tw.camera_available: - if tw.lc._video_capture_device is not None: - # restore AG and then close device - tw.lc._set_ag(1) - tw.lc._video_capture_device.close() - tw.lc._video_capture_device = None - tw.lc.camera.stop_camera_input() - tw.active_turtle.show() - - def _just_stop(): """ yield False to stop stack """ yield False @@ -337,164 +87,15 @@ class LogoCode: self.tw = tw self.oblist = {} - DEFPRIM = { - '(': [1, lambda self, x: self._prim_opar(x)], - 'and': [2, lambda self, x, y: _and(x, y)], - 'arc': [2, lambda self, x, y: self._prim_arc(self.tw.canvas.arc, x, - y)], - 'audio': [1, lambda self, x: self._play_sound(x)], - 'back': [1, lambda self, x: self._prim_move(self.tw.canvas.forward, - -x)], - 'black': [0, lambda self: BLACK], - 'blue': [0, lambda self: CONSTANTS['blue']], - 'bpos': [0, lambda self: CONSTANTS['bottompos']], - 'boty': [0, lambda self: CONSTANTS['bottomy']], - 'box1': [0, lambda self: self.boxes['box1']], - 'box': [1, lambda self, x: self._box(x)], - 'box2': [0, lambda self: self.boxes['box2']], - 'bullet': [1, self._prim_bullet, True], - 'bulletlist': [1, self._prim_list, True], - 'cartesian': [0, lambda self: self.tw.set_cartesian(True)], - 'clean': [0, lambda self: self.prim_clear()], - 'clearheap': [0, lambda self: self._empty_heap()], - 'color': [0, lambda self: self.tw.canvas.color], - 'gray': [0, lambda self: self.tw.canvas.gray], - 'comment': [1, lambda self, x: self._prim_print(x, True)], - 'container': [1, lambda self, x: x], - 'cyan': [0, lambda self: CONSTANTS['cyan']], - 'define': [2, self._prim_define], - 'division': [2, lambda self, x, y: _careful_divide(x, y)], - 'equal?': [2, lambda self, x, y: _equal(x, y)], - 'fillscreen': [2, lambda self, x, y: self.tw.canvas.fillscreen(x, y)], - 'forever': [1, self._prim_forever, True], - 'forward': [1, lambda self, x: self._prim_move(self.tw.canvas.forward, - x)], - 'fullscreen': [0, lambda self: self.tw.set_fullscreen()], - 'greater?': [2, lambda self, x, y: _more(x, y)], - 'green': [0, lambda self: CONSTANTS['green']], - 'heading': [0, lambda self: self.tw.canvas.heading], - 'hideblocks': [0, lambda self: self.tw.hideblocks()], - 'hres': [0, lambda self: CONSTANTS['width']], - 'id': [1, lambda self, x: _identity(x)], - 'if': [2, self._prim_if, True], - 'ifelse': [3, self._prim_ifelse, True], - 'insertimage': [1, lambda self, x: self._insert_image(False, - filepath=x)], - 'kbinput': [0, lambda self: self._prim_kbinput()], - 'keyboard': [0, lambda self: self.keyboard], - 'left': [1, lambda self, x: self._prim_right(-x)], - 'leftx': [0, lambda self: CONSTANTS['leftx']], - 'lpos': [0, lambda self: CONSTANTS['leftpos']], - 'less?': [2, lambda self, x, y: _less(x, y)], - 'luminance': [0, lambda self: self._read_camera(True)], - 'mediawait': [0, self._media_wait, True], - 'minus': [2, lambda self, x, y: _minus(x, y)], - 'mod': [2, lambda self, x, y: _mod(x, y)], - 'myfunction': [2, lambda self, f, x: self._myfunction(f, [x])], - 'myfunction2': [3, lambda self, f, x, y: self._myfunction(f, [x, y])], - 'myfunction3': [4, lambda self, f, x, y, z: self._myfunction( - f, [x, y, z])], - 'nop': [0, lambda self: None], - 'nop1': [0, lambda self: None], - 'nop2': [0, lambda self: None], - 'nop3': [1, lambda self, x: None], - 'not': [1, lambda self, x: not x], - 'orange': [0, lambda self: CONSTANTS['orange']], - 'or': [2, lambda self, x, y: _or(x, y)], - 'pendown': [0, lambda self: self.tw.canvas.setpen(True)], - 'pensize': [0, lambda self: self.tw.canvas.pensize], - 'penup': [0, lambda self: self.tw.canvas.setpen(False)], - 'pitch': [0, lambda self: self._get_pitch()], - 'plus': [2, lambda self, x, y: _plus(x, y)], - 'polar': [0, lambda self: self.tw.set_polar(True)], - 'pop': [0, lambda self: self._prim_pop()], - 'print': [1, lambda self, x: self._prim_print(x, False)], - 'printheap': [0, lambda self: self._prim_print_heap()], - 'product': [2, lambda self, x, y: _product(x, y)], - 'purple': [0, lambda self: CONSTANTS['purple']], - 'push': [1, lambda self, x: self._prim_push(x)], - 'random': [2, lambda self, x, y: _random(x, y)], - 'readcamera': [0, lambda self: self._read_camera()], - 'readpixel': [0, lambda self: self._read_pixel()], - 'red': [0, lambda self: CONSTANTS['red']], - 'repeat': [2, self._prim_repeat, True], - 'resistance': [0, lambda self: self._get_resistance()], - 'rfid': [0, lambda self: self.tw.rfid_idn], - 'right': [1, lambda self, x: self._prim_right(x)], - 'rightx': [0, lambda self: CONSTANTS['rightx']], - 'rpos': [0, lambda self: CONSTANTS['rightpos']], - 'savepix': [1, lambda self, x: self._save_picture(x)], - 'savesvg': [1, lambda self, x: self._save_svg(x)], - 'scale': [0, lambda self: self.scale], - 'see': [0, lambda self: self.see()], - 'setcolor': [1, lambda self, x: self._prim_set('color', - self.tw.canvas.setcolor, x)], - 'setgray': [1, lambda self, x: self._prim_set('gray', - self.tw.canvas.setgray, x)], - 'seth': [1, lambda self, x: self._prim_set('heading', - self.tw.canvas.seth, x)], - 'setpensize': [1, lambda self, x: self._prim_set('pensize', - self.tw.canvas.setpensize, x)], - 'setscale': [1, lambda self, x: self._prim_set('scale', - self._set_scale, x)], - 'setshade': [1, lambda self, x: self._prim_set('shade', - self.tw.canvas.setshade, x)], - 'settextcolor': [1, lambda self, x: self.tw.canvas.settextcolor(x)], - 'settextsize': [1, lambda self, x: self.tw.canvas.settextsize(x)], - 'setxy2': [2, lambda self, x, y: self._prim_move(self.tw.canvas.setxy, - x, y)], - 'setxy': [2, lambda self, x, y: self._prim_move(self.tw.canvas.setxy, - x, y, pendown=False)], - 'shade': [0, lambda self: self.tw.canvas.shade], - 'show': [1, lambda self, x: self._show(x, True)], - 'showaligned': [1, lambda self, x: self._show(x, False)], - 'showblocks': [0, lambda self: self.tw.showblocks()], - 'skin': [1, lambda self, x: self._reskin(x)], - 'sound': [0, lambda self: self._get_sound()], - 'sqrt': [1, lambda self, x: _sqrt(x)], - 'stack1': [0, self._prim_stack1, True], - 'stack': [1, self._prim_stack, True], - 'stack2': [0, self._prim_stack2, True], - 'start': [0, lambda self: self._prim_start()], - 'startfill': [0, lambda self: self.tw.canvas.start_fill()], - 'stopfill': [0, lambda self: self.tw.canvas.stop_fill()], - 'stopstack': [0, lambda self: self._prim_stopstack()], - 'storeinbox1': [1, lambda self, x: self._prim_setbox('box1', None, x)], - 'storeinbox2': [1, lambda self, x: self._prim_setbox('box2', None, x)], - 'storeinbox': [2, lambda self, x, y: self._prim_setbox('box3', x, y)], - 't1x1': [2, lambda self, x, y: self._show_template1x1(x, y)], - 't1x1a': [2, lambda self, x, y: self._show_template1x1a(x, y)], - 't1x2': [3, lambda self, x, y, z: self._show_template1x2(x, y, z)], - 't2x1': [3, lambda self, x, y, z: self._show_template2x1(x, y, z)], - 't2x2': [5, lambda self, x, y, z, a, b: self._show_template2x2( - x, y, z, a, b)], - 'textcolor': [0, lambda self: self.tw.canvas.textcolor], - 'textsize': [0, lambda self: self.tw.textsize], - 'titlex': [0, lambda self: CONSTANTS['titlex']], - 'titley': [0, lambda self: CONSTANTS['titley']], - 'topy': [0, lambda self: CONSTANTS['topy']], - 'tpos': [0, lambda self: CONSTANTS['toppos']], - 'turtle': [1, lambda self, x: self.tw.canvas.set_turtle(x)], - 'userdefined': [1, lambda self, x: self._prim_myblock([x])], - 'userdefined2': [2, lambda self, x, y: self._prim_myblock([x, y])], - 'userdefined3': [3, lambda self, x, y, - z: self._prim_myblock([x, y, z])], - 'video': [1, lambda self, x: self._play_video(x)], - 'voltage': [0, lambda self: self._get_voltage()], - 'volume': [0, lambda self: self._get_volume()], - 'vres': [0, lambda self: CONSTANTS['height']], - 'wait': [1, self._prim_wait, True], - 'white': [0, lambda self: WHITE], - 'write': [2, lambda self, x, y: self._write(self, x, y)], - 'xcor': [0, lambda self: self.tw.canvas.xcor / self.tw.coord_scale], - 'ycor': [0, lambda self: self.tw.canvas.ycor / self.tw.coord_scale], - 'yellow': [0, lambda self: CONSTANTS['yellow']]} + DEFPRIM = {'(': [1, lambda self, x: self._prim_opar(x)], + 'define': [2, self._prim_define], + 'nop': [0, lambda self: None]} for p in iter(DEFPRIM): if len(DEFPRIM[p]) == 2: - self._def_prim(p, DEFPRIM[p][0], DEFPRIM[p][1]) + self.def_prim(p, DEFPRIM[p][0], DEFPRIM[p][1]) else: - self._def_prim(p, DEFPRIM[p][0], DEFPRIM[p][1], DEFPRIM[p][2]) + self.def_prim(p, DEFPRIM[p][0], DEFPRIM[p][1], DEFPRIM[p][2]) self.symtype = type(self._intern('print')) self.listtype = type([]) @@ -520,38 +121,26 @@ class LogoCode: self.trace = 0 self.update_values = False self.gplay = None - self.ag = None self.filepath = None self.dsobject = None + self.start_time = None - # Scale factors for depreciated portfolio blocks - self.title_height = int((self.tw.canvas.height / 20) * self.tw.scale) self.body_height = int((self.tw.canvas.height / 40) * self.tw.scale) - self.bullet_height = int((self.tw.canvas.height / 30) * self.tw.scale) self.scale = DEFAULT_SCALE - self.max_samples = 1500 - self.input_step = 1 - - self.ringbuffer = RingBuffer1d(self.max_samples, dtype='int16') - if self.tw.hw == XO1: - self.voltage_gain = 0.00002225 - self.voltage_bias = 1.140 - elif self.tw.hw == XO15: - self.voltage_gain = -0.0001471 - self.voltage_bias = 1.695 - - if self.tw.camera_available: - self._video_capture_device = None - if self.tw.running_sugar: - self.imagepath = get_path(self.tw.activity, - 'data/turtlepic.png') - else: - self.imagepath = '/tmp/turtlepic.png' - self.camera = Camera(self.imagepath) + def stop_logo(self): + """ Stop logo is called from the Stop button on the toolbar """ + self.tw.step_time = 0 + self.step = _just_stop() + for plugin in self.tw._plugins: + plugin.stop() + if self.tw.gst_available: + from tagplay import stop_media + stop_media(self) + self.tw.active_turtle.show() - def _def_prim(self, name, args, fcn, rprim=False): + def def_prim(self, name, args, fcn, rprim=False): """ Define the primitives associated with the blocks """ sym = self._intern(name) sym.nargs, sym.fcn = args, fcn @@ -573,8 +162,6 @@ class LogoCode: self.stacks['stack2'] = None self.tw.saving_svg = False - self.find_value_blocks() - self._update_audio_mode() if self.trace > 0: self.update_values = True else: @@ -592,7 +179,11 @@ class LogoCode: if b.connections is not None and len(b.connections) > 1 and \ b.connections[1] is not None: code = self._blocks_to_code(b) - x = b.connections[1].values[0] + try: + x = b.connections[1].values[0] + except IndexError: + self.tw.showlabel('#nostack') + return None if type(convert(x, float, False)) == float: if int(float(x)) == x: x = int(x) @@ -600,7 +191,8 @@ class LogoCode: code = self._blocks_to_code(blk) if run_flag: - _logger.debug("running code: %s" % (code)) + # debug_output("running code: %s" % (code), self.tw.running_sugar) + self.start_time = time() self._setup_cmd(code) if not self.tw.hide: self.tw.display_coordinates() @@ -625,35 +217,22 @@ class LogoCode: code.append(float(blk.values[0])) except ValueError: code.append(float(ord(blk.values[0][0]))) - elif blk.name == 'string' or blk.name == 'title': + elif blk.name == 'string' or \ + blk.name == 'title': # deprecated block if type(blk.values[0]) == float or type(blk.values[0]) == int: if int(blk.values[0]) == blk.values[0]: blk.values[0] = int(blk.values[0]) code.append('#s' + str(blk.values[0])) else: code.append('#s' + blk.values[0]) - elif blk.name == 'journal': - if blk.values[0] is not None: - code.append('#smedia_' + str(blk.values[0])) - else: - code.append('#smedia_None') - elif blk.name == 'description': + elif blk.name in PREFIX_DICTIONARY: if blk.values[0] is not None: - code.append('#sdescr_' + str(blk.values[0])) + code.append(PREFIX_DICTIONARY[blk.name] + \ + str(blk.values[0])) else: - code.append('#sdescr_None') - elif blk.name == 'audio': - if blk.values[0] is not None: - code.append('#saudio_' + str(blk.values[0])) - else: - code.append('#saudio_None') - elif blk.name == 'video': - if blk.values[0] is not None: - code.append('#svideo_' + str(blk.values[0])) - else: - code.append('#svideo_None') - elif blk.name == 'camera': - code.append('#smedia_CAMERA') + code.append(PREFIX_DICTIONARY[blk.name] + 'None') + elif blk.name in media_blocks_dictionary: + code.append('#smedia_' + blk.name.upper()) else: return ['%nothing%'] else: @@ -718,7 +297,7 @@ class LogoCode: elif self.tw.interactive_mode: self.tw.toolbar_shapes['stopiton'].set_layer(TAB_LAYER) self.running = True - self._icall(self._evline, blklist) + self.icall(self.evline, blklist) yield True if self.tw.running_sugar: self.tw.activity.stop_turtle_button.set_icon("stopitoff") @@ -727,12 +306,12 @@ class LogoCode: yield False self.running = False - def _icall(self, fcn, *args): + def icall(self, fcn, *args): """ Add a function and its arguments to the program stack. """ self.istack.append(self.step) self.step = fcn(*(args)) - def _evline(self, blklist): + def evline(self, blklist): """ Evaluate a line of code from the list. """ oldiline = self.iline self.iline = blklist[:] @@ -762,7 +341,7 @@ class LogoCode: (token, self.bindex) = self.iline[1] # Process the token and any arguments. - self._icall(self._eval) + self.icall(self._eval) yield True # Time to unhighlight the current block. @@ -778,7 +357,7 @@ class LogoCode: self.tw.block_list.list[self.bindex].highlight() raise logoerror(str(self.iresult)) self.iline = oldiline - self._ireturn() + self.ireturn() if not self.tw.hide and self.tw.step_time > 0: self.tw.display_coordinates() yield True @@ -795,7 +374,7 @@ class LogoCode: # We highlight blocks here in case an error occurs... if not self.tw.hide and bindex is not None: self.tw.block_list.list[bindex].highlight() - self._icall(self._evalsym, token) + self.icall(self._evalsym, token) yield True # and unhighlight if everything was OK. if not self.tw.hide and bindex is not None: @@ -804,7 +383,7 @@ class LogoCode: else: res = token - self._ireturn(res) + self.ireturn(res) yield True def _evalsym(self, token): @@ -817,32 +396,31 @@ class LogoCode: raise logoerror("#noinput") for i in range(token.nargs): self._no_args_check() - self._icall(self._eval) + self.icall(self._eval) yield True self.arglist.append(self.iresult) if self.cfun.rprim: if type(self.cfun.fcn) == self.listtype: - _logger.debug("evalsym rprim list: %s" % (str(token))) - self._icall(self._ufuncall, self.cfun.fcn) + # debug_output('evalsym rprim list: %s' % (str(token)), + # self.tw.running_sugar) + self.icall(self._ufuncall, self.cfun.fcn) yield True else: - # print "evalsym rprim: ", token - self._icall(self.cfun.fcn, *self.arglist) + self.icall(self.cfun.fcn, *self.arglist) yield True result = None else: - # print "evalsym: ", token result = self.cfun.fcn(self, *self.arglist) self.cfun, self.arglist = oldcfun, oldarglist if self.arglist is not None and result == None: raise logoerror("%s %s %s" % \ (oldcfun.name, _("did not output to"), self.cfun.name)) - self._ireturn(result) + self.ireturn(result) yield True def _ufuncall(self, body): """ ufuncall """ - self._ijmp(self._evline, body) + self.ijmp(self.evline, body) yield True def doevalstep(self): @@ -869,12 +447,12 @@ class LogoCode: return False return True - def _ireturn(self, res=None): + def ireturn(self, res=None): """ return value """ self.step = self.istack.pop() self.iresult = res - def _ijmp(self, fcn, *args): + def ijmp(self, fcn, *args): """ ijmp """ self.step = fcn(*(args)) @@ -898,123 +476,6 @@ class LogoCode: # Primitives # - def prim_clear(self): - """ Clear screen """ - stop_media(self) - self.tw.canvas.clearscreen() - self.scale = DEFAULT_SCALE - self.tw.set_polar(False) - self.tw.set_cartesian(False) - self.hidden_turtle = None - for name in VALUE_BLOCKS: - self.update_label_value(name) - - def _prim_start(self): - """ Start block: recenter """ - if self.tw.running_sugar: - self.tw.activity.recenter() - - def _prim_wait(self, time): - """ Show the turtle while we wait """ - self.tw.active_turtle.show() - endtime = _millisecond() + time * 1000. - while _millisecond() < endtime: - yield True - self.tw.active_turtle.hide() - self._ireturn() - yield True - - def _prim_repeat(self, num, blklist): - """ Repeat list num times. """ - num = self._int(num) - for i in range(num): - self._icall(self._evline, blklist[:]) - yield True - if self.procstop: - break - self._ireturn() - yield True - - def _prim_bullet(self, blklist): - """ Depreciated bullet-list block style """ - self._show_bullets(blklist) - self._ireturn() - yield True - - def _prim_list(self, blklist): - """ Expandable list block """ - self._show_list(blklist) - self._ireturn() - yield True - - def _myfunction(self, f, x): - """ Programmable block """ - try: - y = myfunc(f, x) - if str(y) == 'nan': - _logger.debug("python function returned nan") - stop_logo(self.tw) - raise logoerror("#notanumber") - else: - return y - except ZeroDivisionError: - stop_logo(self.tw) - raise logoerror("#zerodivide") - except ValueError, e: - stop_logo(self.tw) - raise logoerror('#' + str(e)) - except SyntaxError, e: - stop_logo(self.tw) - raise logoerror('#' + str(e)) - except NameError, e: - stop_logo(self.tw) - raise logoerror('#' + str(e)) - except OverflowError: - stop_logo(self.tw) - raise logoerror("#overflowerror") - except TypeError: - stop_logo(self.tw) - raise logoerror("#notanumber") - - def _prim_forever(self, blklist): - """ Do list forever """ - while True: - self._icall(self._evline, blklist[:]) - yield True - if self.procstop: - break - self._ireturn() - yield True - - ''' - def _prim_while(self, list1, list2): - list = [self._intern('if')] - for i in list1: - list.append(i) - list.append(list2) - while self._icall(self._evline, list[:]): - yield True - self._ireturn() - yield True - ''' - - def _prim_if(self, boolean, blklist): - """ If bool, do list """ - if boolean: - self._icall(self._evline, blklist[:]) - yield True - self._ireturn() - yield True - - def _prim_ifelse(self, boolean, list1, list2): - """ If bool, do list1, else do list2 """ - if boolean: - self._ijmp(self._evline, list1[:]) - yield True - else: - self._ijmp(self._evline, list2[:]) - yield True - def _prim_opar(self, val): self.iline.pop(0) return val @@ -1026,49 +487,19 @@ class LogoCode: name.nargs, name.fcn = 0, body name.rprim = True - def _prim_stack(self, x): - """ Process a named stack """ - if type(convert(x, float, False)) == float: - if int(float(x)) == x: - x = int(x) - if 'stack3' + str(x) not in self.stacks or\ - self.stacks['stack3' + str(x)] is None: - raise logoerror("#nostack") - self._icall(self._evline, self.stacks['stack3' + str(x)][:]) - yield True - self.procstop = False - self._ireturn() - yield True - - def _prim_stack1(self): - """ Process Stack 1 """ - if self.stacks['stack1'] is None: - raise logoerror("#nostack") - self._icall(self._evline, self.stacks['stack1'][:]) - yield True - self.procstop = False - self._ireturn() - yield True - - def _prim_stack2(self): - """ Process Stack 2 """ - if self.stacks['stack2'] is None: - raise logoerror("#nostack") - self._icall(self._evline, self.stacks['stack2'][:]) - yield True - self.procstop = False - self._ireturn() - yield True - - def _prim_stopstack(self): - """ Stop execution of a stack """ - self.procstop = True - - def _prim_print_heap(self): - """ Display contents of heap """ - self.tw.showlabel('status', str(self.heap) + ' ') + def prim_clear(self): + """ Clear screen """ + if self.tw.gst_available: + from tagplay import stop_media + # stop_media(self) # TODO: gplay variable + self.tw.canvas.clearscreen() + self.tw.lc.scale = DEFAULT_SCALE + self.tw.lc.hidden_turtle = None + self.tw.lc.start_time = time() + for name in value_blocks: + self.tw.lc.update_label_value(name) - def _int(self, n): + def int(self, n): """ Raise an error if n doesn't convert to int. """ if type(n) == int: return n @@ -1080,96 +511,20 @@ class LogoCode: raise logoerror("%s %s %s %s" \ % (self.cfun.name, _("doesn't like"), str(n), _("as input"))) - def _box(self, x): - """ Retrieve value from named box """ - if type(convert(x, float, False)) == float: - if int(float(x)) == x: - x = int(x) - try: - return self.boxes['box3' + str(x)] - except KeyError: - raise logoerror("#emptybox") - - def _prim_myblock(self, x): - """ Run Python code imported from Journal """ - if self.bindex is not None and self.bindex in self.tw.myblock: - try: - if len(x) == 1: - myfunc_import(self, self.tw.myblock[self.bindex], x[0]) - else: - myfunc_import(self, self.tw.myblock[self.bindex], x) - except: - raise logoerror("#syntaxerror") - - def _prim_print(self, n, flag): - """ Print object n """ - if flag and (self.tw.hide or self.tw.step_time == 0): - return - if type(n) == str or type(n) == unicode: - if n[0:6] == 'media_' and n[6:] != 'CAMERA': - try: - if self.tw.running_sugar: - try: - dsobject = datastore.get(n[6:]) - except: - _logger.debug("Couldn't open %s" % (n[6:])) - self.tw.showlabel('status', dsobject.metadata['title']) - dsobject.destroy() - else: - self.tw.showlabel('status', n[6:]) - except IOError: - self.tw.showlabel('status', n) - else: - self.tw.showlabel('status', n) - elif type(n) == int: - self.tw.showlabel('status', n) - else: - self.tw.showlabel('status', - str(round_int(n)).replace('.', self.tw.decimal_point)) - - def _prim_kbinput(self): - """ Query keyboard """ - if len(self.tw.keypress) == 1: - self.keyboard = ord(self.tw.keypress[0]) - else: - try: - self.keyboard = {'Escape': 27, 'space': 32, ' ': 32, - 'Return': 13, \ - 'KP_Up': 2, 'KP_Down': 4, 'KP_Left': 1, \ - 'KP_Right': 3}[self.tw.keypress] - except KeyError: - self.keyboard = 0 - self.update_label_value('keyboard', self.keyboard) - self.tw.keypress = '' - def find_value_blocks(self): """ Find any value blocks that may need label updates """ - self.value_blocks = {} - for name in VALUE_BLOCKS: - self.value_blocks[name] = self.tw.block_list.get_similar_blocks( - 'block', name) - - def _update_audio_mode(self): - """ If there are sensor blocks, set the appropriate audio mode """ - for name in ['sound', 'volume', 'pitch']: - if len(self.value_blocks[name]) > 0: - self.tw.audiograb.set_sensor_type() - return - if len(self.value_blocks['resistance']) > 0: - self.tw.audiograb.set_sensor_type(SENSOR_DC_BIAS) - return - elif len(self.value_blocks['voltage']) > 0: - self.tw.audiograb.set_sensor_type(SENSOR_DC_NO_BIAS) - return + self.value_blocks_to_update = {} + for name in value_blocks: + self.value_blocks_to_update[name] = \ + self.tw.block_list.get_similar_blocks('block', name) def update_label_value(self, name, value=None): """ Update the label of value blocks to reflect current value """ - if self.tw.hide or not self.tw.interactive_mode or \ - not hasattr(self, 'value_blocks'): + if self.tw.hide or not self.tw.interactive_mode: return if value is None: - for block in self.value_blocks[name]: - block.spr.set_label(BLOCK_NAMES[name][0]) + for block in self.value_blocks_to_update[name]: + block.spr.set_label(block_names[name][0]) block.resize() elif self.update_values: if type(value) == float: @@ -1177,70 +532,10 @@ class LogoCode: self.tw.decimal_point) else: valstring = str(value) - for block in self.value_blocks[name]: - block.spr.set_label(BLOCK_NAMES[name][0] + ' = ' + valstring) + for block in self.value_blocks_to_update[name]: + block.spr.set_label(block_names[name][0] + ' = ' + valstring) block.resize() - def _prim_set(self, name, cmd, value=None): - """ Set a value and update the associated value blocks """ - if value is not None: - cmd(value) - self.update_label_value(name, value) - - def _prim_right(self, value): - self.tw.canvas.right(float(value)) - self.update_label_value('heading', self.tw.canvas.heading) - - def _prim_move(self, cmd, value1, value2=None, pendown=True): - if value2 is None: - cmd(value1) - else: - cmd(float(value1), float(value2), pendown=pendown) - self.update_label_value('xcor', - self.tw.canvas.xcor / self.tw.coord_scale) - self.update_label_value('ycor', - self.tw.canvas.ycor / self.tw.coord_scale) - if len(self.value_blocks['see']) > 0: - self.see() - - def _prim_arc(self, cmd, value1, value2): - cmd(float(value1), float(value2)) - self.update_label_value('xcor', - self.tw.canvas.xcor / self.tw.coord_scale) - self.update_label_value('ycor', - self.tw.canvas.ycor / self.tw.coord_scale) - self.update_label_value('heading', self.tw.canvas.heading) - if len(self.value_blocks['see']) > 0: - self.see() - - def _prim_setbox(self, name, x, val): - """ Define value of named box """ - if x is not None: - if type(convert(x, float, False)) == float: - if int(float(x)) == x: - x = int(x) - self.boxes[name + str(x)] = val - return - - self.boxes[name] = val - self.update_label_value(name, val) - - def _prim_push(self, val): - """ Push value onto FILO """ - self.heap.append(val) - self.update_label_value('pop', val) - - def _prim_pop(self): - """ Pop value off of FILO """ - if len(self.heap) == 0: - raise logoerror("#emptyheap") - else: - if len(self.heap) == 1: - self.update_label_value('pop') - else: - self.update_label_value('pop', self.heap[-2]) - return self.heap.pop(-1) - def push_file_data_to_heap(self, dsobject): """ push contents of a data store object (assuming json encoding) """ data = data_from_file(dsobject.file_path) @@ -1249,188 +544,59 @@ class LogoCode: self.heap.append(val) self.update_label_value('pop', self.heap[-1]) - def _empty_heap(self): - """ Empty FILO """ - self.heap = [] - - def _save_picture(self, name): - """ Save canvas to file as PNG """ - self.tw.save_as_image(name) - - def _save_svg(self, name): - """ Save SVG to file """ - self.tw.canvas.svg_close() - self.tw.save_as_image(name, True) - - def _show_list(self, sarray): - """ Display list of media objects """ - x = self.tw.canvas.xcor / self.tw.coord_scale - y = self.tw.canvas.ycor / self.tw.coord_scale - for s in sarray: - self.tw.canvas.setxy(x, y, pendown=False) - self._show(s) - y -= int(self.tw.canvas.textsize * self.tw.lead) - - def _set_scale(self, x): - """ Set scale used by media object display """ - self.scale = x - - def _reskin(self, media): - """ Reskin the turtle with an image from a file """ - scale = int(ICON_SIZE * float(self.scale) / DEFAULT_SCALE) - if scale < 1: - return - self.filepath = None - dsobject = None - if os.path.exists(media[6:]): # is it a path? - self.filepath = media[6:] - elif self.tw.running_sugar: # is it a datastore object? - try: - dsobject = datastore.get(media[6:]) - except: - _logger.debug("Couldn't open skin %s" % (media[6:])) - if dsobject is not None: - self.filepath = dsobject.file_path - if self.filepath == None: - self.tw.showlabel('nojournal', self.filepath) - return - pixbuf = None - try: - pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(self.filepath, scale, - scale) - except: - self.tw.showlabel('nojournal', self.filepath) - _logger.debug("Couldn't open skin %s" % (self.filepath)) - if pixbuf is not None: - self.tw.active_turtle.set_shapes([pixbuf]) - pen_state = self.tw.active_turtle.get_pen_state() - if pen_state: - self.tw.canvas.setpen(False) - self.tw.canvas.forward(0) - if pen_state: - self.tw.canvas.setpen(True) - - def _x(self): + def x2tx(self): """ Convert screen coordinates to turtle coordinates """ return int(self.tw.canvas.width / 2) + int(self.tw.canvas.xcor) - def _y(self): + def y2ty(self): """ Convert screen coordinates to turtle coordinates """ return int(self.tw.canvas.height / 2) - int(self.tw.canvas.ycor) - def _w(self): - """ Convert screen coordinates to turtle coordinates """ + def wpercent(self): + """ width as a percentage of screen coordinates """ return int((self.tw.canvas.width * self.scale) / 100.) - def _h(self): - """ Convert screen coordinates to turtle coordinates """ + def hpercent(self): + """ height as a percentage of screen coordinates """ return int((self.tw.canvas.height * self.scale) / 100.) - def _show(self, string, center=False): - """ Show is the general-purpose media-rendering block. """ - if type(string) == str or type(string) == unicode: - if string in ['media_', 'descr_', 'audio_', 'video_', - 'media_None', 'descr_None', 'audio_None', - 'video_None']: - pass - elif string[0:6] in ['media_', 'descr_', 'audio_', 'video_']: - self.filepath = None - self.dsobject = None - if string[6:] == 'CAMERA': - if self.tw.camera_available: - self.camera.save_camera_input_to_file() - self.camera.stop_camera_input() - self.filepath = self.imagepath - elif os.path.exists(string[6:]): # is it a path? - self.filepath = string[6:] - elif self.tw.running_sugar: # is it a datastore object? - try: - self.dsobject = datastore.get(string[6:]) - except: - _logger.debug("Couldn't find dsobject %s" % ( - string[6:])) - if self.dsobject is not None: - self.filepath = self.dsobject.file_path - if self.filepath == None: - if self.dsobject is not None: - self.tw.showlabel('nojournal', - self.dsobject.metadata['title']) - else: - self.tw.showlabel('nojournal', string[6:]) - _logger.debug("Couldn't open %s" % (string[6:])) - elif string[0:6] == 'media_': - self._insert_image(center) - elif string[0:6] == 'descr_': - mimetype = None - if self.dsobject is not None and \ - 'mime_type' in self.dsobject.metadata: - mimetype = self.dsobject.metadata['mime_type'] - description = None - if self.dsobject is not None and \ - 'description' in self.dsobject.metadata: - description = self.dsobject.metadata['description'] - self._insert_desc(mimetype, description) - elif string[0:6] == 'audio_': - self._play_sound() - elif string[0:6] == 'video_': - self._play_video() - if self.dsobject is not None: - self.dsobject.destroy() - else: # assume it is text to display - x = self._x() - y = self._y() - if center: - y -= self.tw.canvas.textsize - self.tw.canvas.draw_text(string, x, y, - int(self.tw.canvas.textsize * \ - self.scale / 100.), - self.tw.canvas.width - x) - elif type(string) == float or type(string) == int: - string = round_int(string) - x = self._x() - y = self._y() - if center: - y -= self.tw.canvas.textsize - self.tw.canvas.draw_text(string, x, y, - int(self.tw.canvas.textsize * \ - self.scale / 100.), - self.tw.canvas.width - x) - - def _insert_image(self, center=False, filepath=None): + def insert_image(self, center=False, filepath=None): """ Image only (at current x, y) """ if filepath is not None: self.filepath = filepath pixbuf = None - w = self._w() - h = self._h() + w, h = self.wpercent(), self.hpercent() if w < 1 or h < 1: return - if self.filepath is not None and self.filepath != '': + if self.dsobject is not None: + try: + pixbuf = get_pixbuf_from_journal(self.dsobject, w, h) + except: + debug_output("Couldn't open dsobject %s" % (self.dsobject), + self.tw.running_sugar) + if pixbuf is None and \ + self.filepath is not None and \ + self.filepath != '': try: pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(self.filepath, w, h) except: self.tw.showlabel('nojournal', self.filepath) - _logger.debug("Couldn't open filepath %s" % (self.filepath)) - elif self.dsobject is not None: - try: - pixbuf = get_pixbuf_from_journal(self.dsobject, w, h) - except: - self.tw.showlabel('nojournal', self.dsobject) - _logger.debug("Couldn't open dsobject %s" % (self.dsobject)) + debug_output("Couldn't open filepath %s" % (self.filepath), + self.tw.running_sugar) if pixbuf is not None: if center: self.tw.canvas.draw_pixbuf(pixbuf, 0, 0, - self._x() - int(w / 2), - self._y() - int(h / 2), w, h, + self.x2tx() - int(w / 2), + self.y2ty() - int(h / 2), w, h, self.filepath) else: - self.tw.canvas.draw_pixbuf(pixbuf, 0, 0, self._x(), self._y(), - w, h, self.filepath) + self.tw.canvas.draw_pixbuf(pixbuf, 0, 0, self.x2tx(), + self.y2ty(), w, h, self.filepath) - def _insert_desc(self, mimetype=None, description=None): + def insert_desc(self, mimetype=None, description=None): """ Description text only (at current x, y) """ - w = self._w() + w = self.wpercent() if w < 1: return text = None @@ -1448,378 +614,38 @@ class LogoCode: f.close() except IOError: self.tw.showlabel('nojournal', self.filepath) - _logger.debug("Couldn't open filepath %s" % \ - (self.filepath)) + debug_output("Couldn't open %s" % (self.filepath), + self.tw.running_sugar) else: if description is not None: text = str(description) else: text = self.filepath if text is not None: - self.tw.canvas.draw_text(text, self._x(), self._y(), + self.tw.canvas.draw_text(text, self.x2tx(), self.y2ty(), self.body_height, w) - def _media_wait(self): + def media_wait(self): """ Wait for media to stop playing """ - while(media_playing(self)): - yield True - self._ireturn() + if self.tw.gst_available: + from tagplay import media_playing + while(media_playing(self)): + yield True + self.ireturn() yield True - def _play_sound(self): + def play_sound(self): """ Sound file from Journal """ - play_audio_from_file(self, self.filepath) + if self.tw.gst_available: + from tagplay import play_audio_from_file + play_audio_from_file(self, self.filepath) - def _play_video(self): + def play_video(self): """ Movie file from Journal """ - w = self._w() - h = self._h() + w, h = self.wpercent(), self.hpercent() if w < 1 or h < 1: return - play_movie_from_file(self, self.filepath, self._x(), self._y(), - self._w(), self._h()) - - def see(self): - """ Read r, g, b from the canvas and return a corresponding palette - color """ - r, g, b, a = self.tw.canvas.get_pixel() - color_index = self.tw.canvas.get_color_index(r, g, b) - self.update_label_value('see', color_index) - return color_index - - def _read_pixel(self): - """ Read r, g, b, a from the canvas and push b, g, r to the stack """ - r, g, b, a = self.tw.canvas.get_pixel() - self.heap.append(b) - self.heap.append(g) - self.heap.append(r) - - def _read_camera(self, luminance_only=False): - """ Read average pixel from camera and push b, g, r to the stack """ - - if not self.tw.camera_available: - if not luminance_only: - self.heap.append(-1) - self.heap.append(-1) - self.heap.append(-1) - return -1 - - pixbuf = None - array = None - w = self._w() - if w < 1: - w = 1 - h = self._h() - if h < 1: - h = 1 - - self._video_capture_device = None - try: - self._video_capture_device = open('/dev/video0', 'rw') - except: - _logger.debug('video capture device not available') - if self._video_capture_device is not None: - self._set_ag(0) # disable autogain - - self.camera.save_camera_input_to_file() - self.camera.stop_camera_input() - - if self._video_capture_device is not None: - self._set_ag(1) # restore autogain and close device - self._video_capture_device.close() - self._video_capture_device = None - - pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(self.imagepath, w, h) - array = pixbuf.get_pixels() - - array_length = len(array) / 3 - r = 0 - g = 0 - b = 0 - i = 0 - for j in range(array_length): - r += ord(array[i]) - i += 1 - g += ord(array[i]) - i += 1 - b += ord(array[i]) - i += 1 - if luminance_only: - lum = int((r * 0.3 + g * 0.6 + b * 0.1) / array_length) - self.update_label_value('luminance', lum) - return lum - else: - self.heap.append(int((b / array_length))) - self.heap.append(int((g / array_length))) - self.heap.append(int((r / array_length))) - - def _set_ag(self, value): - """ set camera autogain (0==off, 1==on) """ - self._ag_control = v4l2.v4l2_control(v4l2.V4L2_CID_AUTOGAIN) - try: - ioctl(self._video_capture_device, v4l2.VIDIOC_G_CTRL, - self._ag_control) - self._ag_control.value = value - ioctl(self._video_capture_device, v4l2.VIDIOC_S_CTRL, - self._ag_control) - ioctl(self._video_capture_device, v4l2.VIDIOC_G_CTRL, - self._ag_control) - except: - _logger.debug('AUTOGAIN control not available') - - def _get_volume(self): - """ return mic in value """ - #TODO: Adjust gain for different HW - buf = self.ringbuffer.read(None, self.input_step) - if len(buf) > 0: - volume = float(_avg(buf, abs_value=True)) - self.update_label_value('volume', volume) - return volume - else: - return 0 - - def _get_sound(self): - """ return raw mic in value """ - buf = self.ringbuffer.read(None, self.input_step) - if len(buf) > 0: - sound = float(buf[0]) - self.update_label_value('sound', sound) - return sound - else: - return 0 - - def _get_pitch(self): - """ return index of max value in fft of mic in values """ - buf = [] - for i in range(4): - buf = append(buf, self.ringbuffer.read(None, self.input_step)) - if len(buf) > 0: - r = [] - for j in rfft(buf): - r.append(abs(j)) - # Convert output to Hertz - pitch = r.index(max(r)) * 48000 / len(buf) - self.update_label_value('pitch', pitch) - return pitch - else: - return 0 - - def _get_resistance(self): - """ return resistance sensor value """ - buf = self.ringbuffer.read(None, self.input_step) - if len(buf) > 0: - # See - # TODO: test this calibration on XO 1.5 - if self.tw.hw == XO1: - resistance = 2.718 ** ((float(_avg(buf)) * 0.000045788) + \ - 8.0531) - else: - avg_buf = float(_avg(buf)) - if avg_buf > 0: - resistance = (420000000 / avg_buf) - 13500 - else: - resistance = 420000000 - self.update_label_value('resistance', resistance) - return resistance - else: - return 0 - - def _get_voltage(self): - """ return voltage sensor value """ - buf = self.ringbuffer.read(None, self.input_step) - if len(buf) > 0: - # See - voltage = float(_avg(buf)) * self.voltage_gain + self.voltage_bias - self.update_label_value('voltage', voltage) - return voltage - else: - return 0 - - # Depreciated block methods - - def _show_template1x1(self, title, media): - """ title, one image, and description """ - xo = self.tw.calc_position('t1x1')[2] - x = -(self.tw.canvas.width / 2) + xo - y = self.tw.canvas.height / 2 - self.tw.canvas.setxy(x, y, pendown=False) - # save the text size so we can restore it later - save_text_size = self.tw.canvas.textsize - # set title text - self.tw.canvas.settextsize(self.title_height) - self._show(title) - # calculate and set scale for media blocks - myscale = 45 * (self.tw.canvas.height - self.title_height * 2) \ - / self.tw.canvas.height - self._set_scale(myscale) - # set body text size - self.tw.canvas.settextsize(self.body_height) - # render media object - # leave some space below the title - y -= int(self.title_height * 2 * self.tw.lead) - self.tw.canvas.setxy(x, y, pendown=False) - self._show(media) - if self.tw.running_sugar: - x = 0 - self.tw.canvas.setxy(x, y, pendown=False) - self._show(media.replace('media_', 'descr_')) - # restore text size - self.tw.canvas.settextsize(save_text_size) - - def _show_template2x1(self, title, media1, media2): - """ title, two images (horizontal), two descriptions """ - xo = self.tw.calc_position('t2x1')[2] - x = -(self.tw.canvas.width / 2) + xo - y = self.tw.canvas.height / 2 - self.tw.canvas.setxy(x, y, pendown=False) - # save the text size so we can restore it later - save_text_size = self.tw.canvas.textsize - # set title text - self.tw.canvas.settextsize(self.title_height) - self._show(title) - # calculate and set scale for media blocks - myscale = 45 * (self.tw.canvas.height - self.title_height * 2) / \ - self.tw.canvas.height - self._set_scale(myscale) - # set body text size - self.tw.canvas.settextsize(self.body_height) - # render four quadrents - # leave some space below the title - y -= int(self.title_height * 2 * self.tw.lead) - self.tw.canvas.setxy(x, y, pendown=False) - self._show(media1) - x = 0 - self.tw.canvas.setxy(x, y, pendown=False) - self._show(media2) - y = -self.title_height - if self.tw.running_sugar: - self.tw.canvas.setxy(x, y, pendown=False) - self._show(media2.replace('media_', 'descr_')) - x = -(self.tw.canvas.width / 2) + xo - self.tw.canvas.setxy(x, y, pendown=False) - self._show(media1.replace('media_', 'descr_')) - # restore text size - self.tw.canvas.settextsize(save_text_size) - - def _show_bullets(self, sarray): - """ title and varible number of bullets """ - xo = self.tw.calc_position('bullet')[2] - x = -(self.tw.canvas.width / 2) + xo - y = self.tw.canvas.height / 2 - self.tw.canvas.setxy(x, y, pendown=False) - # save the text size so we can restore it later - save_text_size = self.tw.canvas.textsize - # set title text - self.tw.canvas.settextsize(self.title_height) - self._show(sarray[0]) - # set body text size - self.tw.canvas.settextsize(self.bullet_height) - # leave some space below the title - y -= int(self.title_height * 2 * self.tw.lead) - for s in sarray[1:]: - self.tw.canvas.setxy(x, y, pendown=False) - self._show(s) - y -= int(self.bullet_height * 2 * self.tw.lead) - # restore text size - self.tw.canvas.settextsize(save_text_size) - - def _show_template1x2(self, title, media1, media2): - """ title, two images (vertical), two desciptions """ - xo = self.tw.calc_position('t1x2')[2] - x = -(self.tw.canvas.width / 2) + xo - y = self.tw.canvas.height / 2 - self.tw.canvas.setxy(x, y, pendown=False) - # save the text size so we can restore it later - save_text_size = self.tw.canvas.textsize - # set title text - self.tw.canvas.settextsize(self.title_height) - self._show(title) - # calculate and set scale for media blocks - myscale = 45 * (self.tw.canvas.height - self.title_height * 2) / \ - self.tw.canvas.height - self._set_scale(myscale) - # set body text size - self.tw.canvas.settextsize(self.body_height) - # render four quadrents - # leave some space below the title - y -= int(self.title_height * 2 * self.tw.lead) - self.tw.canvas.setxy(x, y, pendown=False) - self._show(media1) - if self.tw.running_sugar: - x = 0 - self.tw.canvas.setxy(x, y, pendown=False) - self._show(media1.replace('media_', 'descr_')) - y = -self.title_height - self.tw.canvas.setxy(x, y, pendown=False) - self._show(media2.replace('media_', 'descr_')) - x = -(self.tw.canvas.width / 2) + xo - self.tw.canvas.setxy(x, y, pendown=False) - self._show(media2) - # restore text size - self.tw.canvas.settextsize(save_text_size) - - def _show_template2x2(self, title, media1, media2, media3, media4): - """ title and four images """ - xo = self.tw.calc_position('t2x2')[2] - x = -(self.tw.canvas.width / 2) + xo - y = self.tw.canvas.height / 2 - self.tw.canvas.setxy(x, y, pendown=False) - # save the text size so we can restore it later - save_text_size = self.tw.canvas.textsize - # set title text - self.tw.canvas.settextsize(self.title_height) - self._show(title) - # calculate and set scale for media blocks - myscale = 45 * (self.tw.canvas.height - self.title_height * 2) / \ - self.tw.canvas.height - self._set_scale(myscale) - # set body text size - self.tw.canvas.settextsize(self.body_height) - # render four quadrents - # leave some space below the title - y -= int(self.title_height * 2 * self.tw.lead) - self.tw.canvas.setxy(x, y, pendown=False) - self._show(media1) - x = 0 - self.tw.canvas.setxy(x, y, pendown=False) - self._show(media2) - y = -self.title_height - self.tw.canvas.setxy(x, y, pendown=False) - self._show(media4) - x = -(self.tw.canvas.width / 2) + xo - self.tw.canvas.setxy(x, y, pendown=False) - self._show(media3) - # restore text size - self.tw.canvas.settextsize(save_text_size) - - def _show_template1x1a(self, title, media1): - """ title, one media object """ - xo = self.tw.calc_position('t1x1a')[2] - x = -(self.tw.canvas.width / 2) + xo - y = self.tw.canvas.height / 2 - self.tw.canvas.setxy(x, y, pendown=False) - # save the text size so we can restore it later - save_text_size = self.tw.canvas.textsize - # set title text - self.tw.canvas.settextsize(self.title_height) - self._show(title) - # calculate and set scale for media blocks - myscale = 90 * (self.tw.canvas.height - self.title_height * 2) / \ - self.tw.canvas.height - self._set_scale(myscale) - # set body text size - self.tw.canvas.settextsize(self.body_height) - # render media object - # leave some space below the title - y -= int(self.title_height * 2 * self.tw.lead) - self.tw.canvas.setxy(x, y, pendown=False) - self._show(media1) - # restore text size - self.tw.canvas.settextsize(save_text_size) - - def _write(self, string, fsize): - """ Write string at size """ - x = self.tw.canvas.width / 2 + int(self.tw.canvas.xcor) - y = self.tw.canvas.height / 2 - int(self.tw.canvas.ycor) - self.tw.canvas.draw_text(string, x, y - 15, int(fsize), - self.tw.canvas.width) + if self.tw.gst_available: + from tagplay import play_movie_from_file + play_movie_from_file(self, self.filepath, self.x2tx(), self.y2ty(), + w, h) -- cgit v0.9.1