diff options
author | Ed Stoner <ed@whsd.net> | 2007-10-09 13:05:19 (GMT) |
---|---|---|
committer | Ed Stoner <ed@whsd.net> | 2007-10-09 13:05:19 (GMT) |
commit | 6afdf50013c25bbf8ed0ad5ef7c789590a28046a (patch) | |
tree | 8b1c63534a1beb5bdb605cbeff9c46b394674c4e /cartoonbuilder.py |
Initial import
Diffstat (limited to 'cartoonbuilder.py')
-rwxr-xr-x | cartoonbuilder.py | 1419 |
1 files changed, 1419 insertions, 0 deletions
diff --git a/cartoonbuilder.py b/cartoonbuilder.py new file mode 100755 index 0000000..5fa9c83 --- /dev/null +++ b/cartoonbuilder.py @@ -0,0 +1,1419 @@ +#!/usr/bin/env python + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + + +### cartoonbuilder +### +### author: Ed Stoner (ed@whsd.net) +### (c) 2007 World Wide Workshop Foundation + +import time +import pygtk +pygtk.require('2.0') +import gtk +import gobject +import gettext +import os +import zipfile +import textwrap +# should really put a try in front of this +# in case there is no sound support +import gst + +_ = gettext.lgettext + +TRANSIMG = '50x50blank-trans.png' +BGHEIGHT = 300 +BGWIDTH = 300 +IMGHEIGHT = 75 +IMGWIDTH = 75 + +BORDER_LEFT = 1 +BORDER_RIGHT = 2 +BORDER_TOP = 4 +BORDER_BOTTOM = 8 +BORDER_VERTICAL = BORDER_TOP | BORDER_BOTTOM +BORDER_HORIZONTAL = BORDER_LEFT | BORDER_RIGHT +BORDER_ALL = BORDER_VERTICAL | BORDER_HORIZONTAL +BORDER_ALL_BUT_BOTTOM = BORDER_HORIZONTAL | BORDER_TOP +BORDER_ALL_BUT_LEFT = BORDER_VERTICAL | BORDER_RIGHT + +SLICE_BTN_WIDTH = 40 + +# Colors from the Rich's UI design + +GRAY = "#B7B7B7" # gray +PINK = "#FF0099" # pink +YELLOW = "#FFFF00" # yellow +WHITE = "#FFFFFF" +BLACK = "#000000" +BACKGROUND = "#66CC00" # light green +BUTTON_FOREGROUND = "#CCFB99" # very light green +BUTTON_BACKGROUND = "#027F01" # dark green +COLOR_FG_BUTTONS = ( + (gtk.STATE_NORMAL,"#CCFF99"), + (gtk.STATE_ACTIVE,"#CCFF99"), + (gtk.STATE_PRELIGHT,"#CCFF99"), + (gtk.STATE_SELECTED,"#CCFF99"), + (gtk.STATE_INSENSITIVE,"#CCFF99"), + ) # very light green +COLOR_BG_BUTTONS = ( + (gtk.STATE_NORMAL,"#027F01"), + (gtk.STATE_ACTIVE,"#CCFF99"), + (gtk.STATE_PRELIGHT,"#016D01"), + (gtk.STATE_SELECTED,"#CCFF99"), + (gtk.STATE_INSENSITIVE,"#027F01"), + ) +OLD_COLOR_BG_BUTTONS = ( + (gtk.STATE_NORMAL,"#027F01"), + (gtk.STATE_ACTIVE,"#014D01"), + (gtk.STATE_PRELIGHT,"#016D01"), + (gtk.STATE_SELECTED,"#027F01"), + (gtk.STATE_INSENSITIVE,"#027F01"), + ) + +SPANISH = u'Espa\xf1ol' +#SPANISH = 'Espanol' +LANGLIST = ['English',SPANISH] +LANG = {'English':{'character':'My Character', + 'sound':'My Sound', + 'background':'My Background', + 'lessonplan':'Lesson Plans', + 'lpdir':'lp-en'}, + SPANISH:{'character':u'Mi car\xe1cter', + 'sound':'Mi sonido', + 'background':'Mi fondo', + 'lessonplan':u'Planes de la lecci\xf3n', + 'lpdir':'lp-es'}} + +def getwrappedfile(filepath,linelength): + text = [] + f = file(filepath) + for line in f: + if line == '\n': + text.append(line) + else: + for wline in textwrap.wrap(line.strip()): + text.append('%s\n' % wline) + return ''.join(text) + +def prepare_btn(btn, w=-1, h=-1): + for state, color in COLOR_BG_BUTTONS: + btn.modify_bg(state, gtk.gdk.color_parse(color)) + c = btn.get_child() + if c is not None: + for state, color in COLOR_FG_BUTTONS: + c.modify_fg(state, gtk.gdk.color_parse(color)) + else: + for state, color in COLOR_FG_BUTTONS: + btn.modify_fg(state, gtk.gdk.color_parse(color)) + if w>0 or h>0: + btn.set_size_request(w, h) + return btn + +class FrameWidget(gtk.DrawingArea): + def __init__(self,bgpixbuf,fgpixbuf): + gtk.DrawingArea.__init__(self) + self.gc = None # initialized in realize-event handler + self.width = 0 # updated in size-allocate handler + self.height = 0 # idem + self.bgpixbuf = bgpixbuf + self.fgpixbuf = fgpixbuf + self.connect('size-allocate', self.on_size_allocate) + self.connect('expose-event', self.on_expose_event) + self.connect('realize', self.on_realize) + + def on_realize(self, widget): + self.gc = widget.window.new_gc() + + def on_size_allocate(self, widget, allocation): + self.width = allocation.width + self.height = allocation.height + + def on_expose_event(self, widget, event): + # This is where the drawing takes place + if self.bgpixbuf: + #bgpixbuf = gtk.gdk.pixbuf_new_from_file(self.bgimgpath) + widget.window.draw_pixbuf(self.gc,self.bgpixbuf,0,0,0,0,-1,-1,0,0) + if self.fgpixbuf: + #fgpixbuf = gtk.gdk.pixbuf_new_from_file(self.fgimgpath) + #widget.window.draw_pixbuf(self.gc,fgpixbuf,0,0,75,75,-1,-1,0,0) + widget.window.draw_pixbuf(self.gc,self.fgpixbuf,0,0,0,0,-1,-1,0,0) + + +class cartoonbuilder: + def delete_event(self, widget, event, data=None): + return False + + def destroy(self, widget, data=None): + gtk.main_quit() + + def on_gstmessage(self, bus, message): + t = message.type + if t == gst.MESSAGE_EOS: + # END OF SOUND FILE + self.player.set_state(gst.STATE_NULL) + self.player.set_state(gst.STATE_PLAYING) + elif t == gst.MESSAGE_ERROR: + self.player.set_state(gst.STATE_NULL) + + def clearframe(self, widget, data=None): + transpixbuf = self.gettranspixbuf(IMGWIDTH,IMGHEIGHT) + self.frameimgs[self.frame_selected].set_from_pixbuf(transpixbuf) + self.fgpixbufs[self.frame_selected] = self.gettranspixbuf(BGWIDTH,BGHEIGHT) + self.fgpixbuf = self.gettranspixbuf(BGWIDTH,BGHEIGHT) + self.drawmain() + + def clearall(self, widget, data=None): + for i in range(6): + transpixbuf = self.gettranspixbuf(IMGWIDTH,IMGHEIGHT) + self.frameimgs[i].set_from_pixbuf(transpixbuf) + self.fgpixbufs[i] = self.gettranspixbuf(BGWIDTH,BGHEIGHT) + self.fgpixbuf = self.gettranspixbuf(BGWIDTH,BGHEIGHT) + + def selectframe(self, widget, event, data=None): + if data: + i = data-1 + self.framebuttons[i].modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse(YELLOW)) + self.framebuttons[i].modify_bg(gtk.STATE_PRELIGHT,gtk.gdk.color_parse(YELLOW)) + if self.frame_selected != i: + self.framebuttons[self.frame_selected].modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse(BLACK)) + self.framebuttons[self.frame_selected].modify_bg(gtk.STATE_PRELIGHT,gtk.gdk.color_parse(BLACK)) + #self.framebuttons[self.frame_selected].set_style(self.fbstyle) + self.frame_selected = i + self.fgpixbuf = self.fgpixbufs[self.frame_selected] + self.drawmain() + + def pickimage(self, widget, event, data=None): + if data: + pixbuf = self.posepixbufs[data-1] + + scaled_buf = pixbuf.scale_simple(IMGWIDTH,IMGHEIGHT,gtk.gdk.INTERP_BILINEAR) + self.frameimgs[self.frame_selected].set_from_pixbuf(scaled_buf) + fgpixbuf = pixbuf.scale_simple(BGWIDTH,BGHEIGHT,gtk.gdk.INTERP_BILINEAR) + self.fgpixbufs[self.frame_selected] = fgpixbuf + self.fgpixbuf = fgpixbuf + self.drawmain() + + def lastback(self, widget, data=None): + if self.backnum == 0: + self.backnum = len(self.backpicpaths)-1 + else: + self.backnum -= 1 + bgimgpath = self.backpicpaths[self.backnum] + self.setback(bgimgpath) + + def nextback(self, widget, data=None): + if self.backnum == (len(self.backpicpaths)-1): + self.backnum = 0 + else: + self.backnum += 1 + bgimgpath = self.backpicpaths[self.backnum] + self.setback(bgimgpath) + + def setback(self,imgpath): + #self.mfdraw.queue_draw() + #pixbuf = gtk.gdk.pixbuf_new_from_file(self.bgimgpath) + pixbuf = gtk.gdk.pixbuf_new_from_file(imgpath) + self.bgpixbuf = pixbuf.scale_simple(BGWIDTH,BGHEIGHT,gtk.gdk.INTERP_BILINEAR) + scaled_buf = pixbuf.scale_simple(60,60,gtk.gdk.INTERP_BILINEAR) + self.bgsmall.set_from_pixbuf(scaled_buf) + self.drawmain() + + def setcharacter(self): + pics = self.getpics(self.imgdir) + pixbuf = gtk.gdk.pixbuf_new_from_file(pics[self.imgstartindex]) + scaled_buf = pixbuf.scale_simple(60,60,gtk.gdk.INTERP_BILINEAR) + self.ccismall.set_from_pixbuf(scaled_buf) + self.charlabel.set_label(os.path.split(self.imgdir)[1]) + + def lastcharacter(self, widget, data=None): + if self.imgdirindex == 0: + self.imgdirindex = (len(self.imgdirs)-1) + else: + self.imgdirindex -= 1 + self.imgstartindex = 0 + self.imgdir = self.imgdirs[self.imgdirindex] + self.loadimages() + self.setcharacter() + self.drawmain() + + def nextcharacter(self, widget, data=None): + if self.imgdirindex == (len(self.imgdirs)-1): + self.imgdirindex = 0 + else: + self.imgdirindex += 1 + self.imgstartindex = 0 + self.imgdir = self.imgdirs[self.imgdirindex] + self.loadimages() + self.setcharacter() + self.drawmain() + + def changesound(self): + if self.soundfile: + soundname = os.path.splitext(os.path.split(self.soundfile)[1])[0] + self.player.set_property('uri', 'file://' + self.soundfile) + if self.playing: + self.player.set_state(gst.STATE_NULL) + self.player.set_state(gst.STATE_PLAYING) + else: + soundname = 'No Sound' + if self.playing: + self.player.set_state(gst.STATE_NULL) + self.soundlabel.set_text(soundname.capitalize()) + + def lastsound(self, widget, data=None): + if self.soundindex == 0: + self.soundindex = (len(self.sounds)-1) + else: + self.soundindex -= 1 + self.soundfile = self.sounds[self.soundindex] + self.changesound() + + def nextsound(self, widget, data=None): + if self.soundindex == (len(self.sounds)-1): + self.soundindex = 0 + else: + self.soundindex += 1 + self.soundfile = self.sounds[self.soundindex] + self.changesound() + + def go(self, widget, data=None): + self.playframenum = 0 + if self.playing: + if self.soundfile: + self.player.set_state(gst.STATE_NULL) + #widget.set_label('GO!') + playimg = gtk.Image() + #playimg.set_from_stock(gtk.STOCK_MEDIA_PLAY,gtk.ICON_SIZE_BUTTON) + playimg.set_from_file(os.path.join(self.iconsdir,'right_arrow.png')) + playimg.show() + widget.set_image(playimg) + self.playing = False + else: + if self.soundfile: + #self.player.set_property('uri', 'file://' + self.soundfile) + self.player.set_state(gst.STATE_PLAYING) + #widget.set_label('STOP') + stopimg = gtk.Image() + #stopimg.set_from_stock(gtk.STOCK_MEDIA_STOP,gtk.ICON_SIZE_BUTTON) + stopimg.set_from_file(os.path.join(self.iconsdir,'pause.png')) + stopimg.show() + widget.set_image(stopimg) + self.playing = gobject.timeout_add(self.waittime, self.playframe) + + def oldplayframe(self): + self.mfdraw.fgimgpath = self.frameimgpaths[self.playframenum] + self.mfdraw.queue_draw() + self.playframenum += 1 + if self.playframenum == 6: + self.playframenum = 0 + if self.playing: + return True + else: + return False + + def playframe(self): + self.fgpixbuf = self.fgpixbufs[self.playframenum] + self.drawmain() + self.playframenum += 1 + if self.playframenum == 6: + self.playframenum = 0 + # SOUND HANDLING + #if self.bus.have_pending: + # print 'PENDING ITEMS ON SOUND BUS' + # END OF SOUND HANDLING + if self.playing: + return True + else: + return False + + def drawmain(self): + #if not self.fgimgpath: + # pixbuf2 = gtk.gdk.pixbuf_new_from_file(self.bgimgpath) + # sbuf2 = pixbuf2.scale_simple(BGHEIGHT,BGWIDTH,gtk.gdk.INTERP_BILINEAR) + # self.mainimage.set_from_pixbuf(sbuf2) + # return + + # COMPOSITING FROM FILE PATHS + #pixbuf = gtk.gdk.pixbuf_new_from_file(self.fgimgpath) + #sbuf = pixbuf.scale_simple(BGHEIGHT,BGWIDTH,gtk.gdk.INTERP_BILINEAR) + #pixbuf2 = gtk.gdk.pixbuf_new_from_file(self.bgimgpath) + #sbuf2 = pixbuf2.scale_simple(BGHEIGHT,BGWIDTH,gtk.gdk.INTERP_BILINEAR) + #sbuf.composite(sbuf2,0,0,sbuf.props.width,sbuf.props.height, + # 0,0,1.0,1.0,gtk.gdk.INTERP_HYPER,255) + + # COMPOSITING FROM PIXBUFS + #sbuf = self.fgpixbuf.copy() + #sbuf2 = self.bgpixbuf.copy() + #sbuf.composite(sbuf2,0,0,sbuf.props.width,sbuf.props.height, + # 0,0,1.0,1.0,gtk.gdk.INTERP_HYPER,255) + #self.mainimage.set_from_pixbuf(sbuf2) + + # USING DRAWING AREA + self.mfdraw.fgpixbuf = self.fgpixbuf + self.mfdraw.bgpixbuf = self.bgpixbuf + self.mfdraw.queue_draw() + + def getbackgroundfile(self, widget, data=None): + dialog = gtk.FileChooserDialog(title="Open..", + action=gtk.FILE_CHOOSER_ACTION_OPEN, + buttons=(gtk.STOCK_CANCEL, + gtk.RESPONSE_CANCEL, + gtk.STOCK_OPEN, gtk.RESPONSE_OK)) + if self.insugar: + dialog.set_current_folder('/home/olpc') + dialog.set_default_response(gtk.RESPONSE_OK) + + #filter = gtk.FileFilter() + #filter.set_name("All files") + #filter.add_pattern("*") + #dialog.add_filter(filter) + + filter = gtk.FileFilter() + filter.set_name("Images") + filter.add_mime_type("image/png") + filter.add_mime_type("image/jpeg") + filter.add_mime_type("image/gif") + filter.add_pattern("*.png") + filter.add_pattern("*.jpg") + filter.add_pattern("*.gif") + dialog.add_filter(filter) + + response = dialog.run() + if response == gtk.RESPONSE_OK: + #print dialog.get_filename(), 'selected' + bgimgpath = dialog.get_filename() + self.backpicpaths.append(bgimgpath) + self.backnum = self.backpicpaths.index(bgimgpath) + self.setback(bgimgpath) + f = file(os.path.join(self.mdirpath,'config.backpics'),'a') + f.write('%s\n' % bgimgpath) + f.close() + elif response == gtk.RESPONSE_CANCEL: + # print 'Closed, no files selected' + pass + dialog.destroy() + + def getimgdir(self, widget, data=None): + daction = gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER + dialog = gtk.FileChooserDialog(title='Select Folder', + action=daction, + buttons=(gtk.STOCK_CANCEL, + gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, + gtk.RESPONSE_OK)) + if self.insugar: + dialog.set_current_folder('/home/olpc') + dialog.set_default_response(gtk.RESPONSE_OK) + response = dialog.run() + if response == gtk.RESPONSE_OK: + #print dialog.get_filename(), 'selected' + imgdir = dialog.get_filename() + pics = self.getpics(imgdir) + if pics: + self.imgdir = imgdir + self.imgdirs.append(imgdir) + self.imgdirindex = self.imgdirs.index(imgdir) + self.loadimages() + self.setcharacter() + self.drawmain() + f = file(os.path.join(self.mdirpath,'config.imgdirs'),'a') + f.write('%s\n' % imgdir) + f.close() + elif response == gtk.RESPONSE_CANCEL: + pass + dialog.destroy() + + def getsoundfile(self, widget, data=None): + dialog = gtk.FileChooserDialog(title="Open..", + action=gtk.FILE_CHOOSER_ACTION_OPEN, + buttons=(gtk.STOCK_CANCEL, + gtk.RESPONSE_CANCEL, + gtk.STOCK_OPEN, gtk.RESPONSE_OK)) + if self.insugar: + dialog.set_current_folder('/home/olpc') + dialog.set_default_response(gtk.RESPONSE_OK) + + filter = gtk.FileFilter() + filter.set_name("Sounds") + #filter.add_mime_type("image/png") + filter.add_pattern('*.wav') + filter.add_pattern('*.mp3') + filter.add_pattern('*.ogg') + dialog.add_filter(filter) + + response = dialog.run() + if response == gtk.RESPONSE_OK: + soundfilepath = dialog.get_filename() + self.sounds.append(soundfilepath) + self.soundfile = soundfilepath + self.soundindex = self.sounds.index(soundfilepath) + self.changesound() + f = file(os.path.join(self.mdirpath,'config.sounds'),'a') + f.write('%s\n' % soundfilepath) + f.close() + elif response == gtk.RESPONSE_CANCEL: + # print 'Closed, no files selected' + pass + dialog.destroy() + + def savefile(self, widget, data=None): + daction = gtk.FILE_CHOOSER_ACTION_SAVE + dialog = gtk.FileChooserDialog(title='Save Animation', + action=daction, + buttons=(gtk.STOCK_CANCEL, + gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, + gtk.RESPONSE_OK)) + if self.insugar: + dialog.set_current_folder('/home/olpc') + dialog.set_current_name('cartoon.zip') + dialog.set_default_response(gtk.RESPONSE_OK) + response = dialog.run() + if response == gtk.RESPONSE_OK: + filepath = dialog.get_filename() + # print filepath + zf = zipfile.ZipFile(filepath,'w') + # add the background file + tmpimgdir = os.path.join(self.mdirpath,'tmpimg') + tmpbgpath = os.path.join(tmpimgdir,'back.png') + self.bgpixbuf.save(tmpbgpath,'png') + zf.write(tmpbgpath) + os.remove(tmpbgpath) + # add the frames + count = 1 + for pixbuf in self.fgpixbufs: + filename = '%02d.png' % count + filepath = os.path.join(tmpimgdir,filename) + pixbuf.save(filepath,'png') + zf.write(filepath) + os.remove(filepath) + count += 1 + zf.close() + elif response == gtk.RESPONSE_CANCEL: + pass + dialog.destroy() + + def loadfile(self, widget, data=None): + daction = gtk.FILE_CHOOSER_ACTION_OPEN + dialog = gtk.FileChooserDialog(title='Select File', + action=daction, + buttons=(gtk.STOCK_CANCEL, + gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, + gtk.RESPONSE_OK)) + if self.insugar: + dialog.set_current_folder('/home/olpc') + dialog.set_default_response(gtk.RESPONSE_OK) + filter = gtk.FileFilter() + filter.set_name("Zipfiles") + #filter.add_mime_type("image/gif") + filter.add_pattern("*.zip") + dialog.add_filter(filter) + response = dialog.run() + if response == gtk.RESPONSE_OK: + filepath = dialog.get_filename() + # print filepath + zf = zipfile.ZipFile(filepath,'r') + fnames = zf.namelist() + framenames = [] + for fname in fnames: + if fname[-8:] == 'back.png': + backname = fname + else: + framenames.append(fname) + framenames.sort() + # set the background + tmpimgdir = os.path.join(self.mdirpath,'tmpimg') + tmpbgpath = os.path.join(tmpimgdir,'back.png') + f = file(tmpbgpath,'w') + f.write(zf.read(backname)) + f.close() + self.setback(tmpbgpath) + os.remove(tmpbgpath) + self.imgdir = tmpimgdir + for filepath in framenames: + fname = os.path.split(filepath)[1] + tmpfilepath = os.path.join(tmpimgdir,fname) + f = file(tmpfilepath,'w') + f.write(zf.read(filepath)) + f.close() + zf.close() + self.loadimages() + #self.setcharacter() + # setup the filmstrip frames + pics = self.getpics(self.imgdir) + count = 0 + for imgpath in pics: + pixbuf = gtk.gdk.pixbuf_new_from_file(imgpath) + fgpixbuf = pixbuf.scale_simple(BGWIDTH,BGHEIGHT,gtk.gdk.INTERP_BILINEAR) + self.fgpixbufs[count] = fgpixbuf + if count == 0: + self.fgpixbuf = fgpixbuf + self.drawmain() + scaled_buf = pixbuf.scale_simple(IMGWIDTH,IMGHEIGHT,gtk.gdk.INTERP_BILINEAR) + self.frameimgs[count].set_from_pixbuf(scaled_buf) + count += 1 + entries = os.listdir(tmpimgdir) + for entry in entries: + entrypath = os.path.join(tmpimgdir,entry) + os.remove(entrypath) + + elif response == gtk.RESPONSE_CANCEL: + pass + dialog.destroy() + + def setplayspeed(self,adj): + self.waittime = int((6-adj.value)*150) + if self.playing: + gobject.source_remove(self.playing) + self.playing = gobject.timeout_add(self.waittime, self.playframe) + + def loadimages(self): + self.posepixbufs = [] + pics = self.getpics(self.imgdir) + count = 0 + for imgpath in pics[self.imgstartindex:self.imgstartindex+10]: + pixbuf = gtk.gdk.pixbuf_new_from_file(imgpath) + scaled_buf = pixbuf.scale_simple(IMGWIDTH,IMGHEIGHT,gtk.gdk.INTERP_BILINEAR) + self.posepixbufs.append(pixbuf) + self.images[count].set_from_pixbuf(scaled_buf) + count += 1 + for i in range(count,10): + transpixbuf = self.gettranspixbuf(IMGWIDTH,IMGHEIGHT) + imgpath = os.path.join(self.iconsdir,TRANSIMG) + img = gtk.Image() + img.set_from_pixbuf(transpixbuf) + img.show() + self.posepixbufs.append(pixbuf) + self.images[i].set_from_pixbuf(transpixbuf) + + def getpics(self, dirpath): + pics = [] + entries = os.listdir(dirpath) + entries.sort() + for entry in entries: + if entry[-4:].lower() in ['.png','.gif','.jpg']: + filepath = os.path.join(dirpath,entry) + pics.append(filepath) + return pics + + + def imgup(self, widget, data=None): + pics = self.getpics(self.imgdir) + if self.imgstartindex > 0: + self.imgstartindex -= 2 + self.loadimages() + self.setcharacter() + self.drawmain() + + def imgdown(self, widget, data=None): + pics = self.getpics(self.imgdir) + if len(pics[self.imgstartindex:]) > 10: + self.imgstartindex += 2 + self.loadimages() + self.setcharacter() + self.drawmain() + + def gettranspixbuf(self, width=50, height=50): + transimgpath = os.path.join(self.iconsdir,TRANSIMG) + pixbuf = gtk.gdk.pixbuf_new_from_file(transimgpath) + if width == 50 and height == 50: + return pixbuf + scaled_buf = pixbuf.scale_simple(width,height,gtk.gdk.INTERP_BILINEAR) + return scaled_buf + + def showlessonplans(self, widget, data=None): + dia = gtk.Dialog(title='Lesson Plans', + parent=None, + flags=0, + buttons=None) + dia.set_default_size(500,500) + dia.show() + + #dia.vbox.pack_start(scrolled_window, True, True, 0) + notebook = gtk.Notebook() + # uncomment below to highlight tabs + notebook.modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse(WHITE)) + notebook.set_tab_pos(gtk.POS_TOP) + #notebook.set_default_size(400,400) + notebook.show() + lessonplans = {} + lpdir = os.path.join(self.mdirpath,LANG[self.language]['lpdir']) + lpentries = os.listdir(lpdir) + for entry in lpentries: + fpath = os.path.join(lpdir,entry) + lessonplans[entry] = getwrappedfile(fpath,80) + lpkeys = lessonplans.keys() + lpkeys.sort() + for lpkey in lpkeys: + lpname = lpkey.replace('_',' ').replace('0','')[:-4] + label = gtk.Label(lessonplans[lpkey]) + #if self.insugar: + # label.modify_fg(gtk.STATE_NORMAL,gtk.gdk.color_parse(WHITE)) + eb = gtk.EventBox() + eb.modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse(WHITE)) + #label.set_line_wrap(True) + label.show() + eb.add(label) + eb.show() + #tlabel = gtk.Label('Lesson Plan %s' % str(i+1)) + tlabel = gtk.Label(lpname) + tlabel.show() + scrolled_window = gtk.ScrolledWindow() + scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS) + scrolled_window.show() + scrolled_window.add_with_viewport(eb) + notebook.append_page(scrolled_window, tlabel) + #dia.action_area.pack_start(notebook, True, True, 0) + dia.vbox.pack_start(notebook, True, True, 0) + result = dia.run() + dia.destroy() + + def changed_cb(self, combobox): + model = combobox.get_model() + index = combobox.get_active() + if index: + lang = model[index][0] + if lang in LANG: + self.lessonplans.set_label(LANG[lang]['lessonplan']) + prepare_btn(self.lessonplans) + self.character.set_label(LANG[lang]['character']) + prepare_btn(self.character) + self.bgbutton.set_label(LANG[lang]['background']) + prepare_btn(self.bgbutton) + self.soundbutton.set_label(LANG[lang]['sound']) + prepare_btn(self.soundbutton) + else: + print repr(lang) + return + + def changebuttonlang(self): + self.lessonplans.set_label(LANG[self.language]['lessonplan']) + prepare_btn(self.lessonplans) + self.character.set_label(LANG[self.language]['character']) + prepare_btn(self.character) + self.bgbutton.set_label(LANG[self.language]['background']) + prepare_btn(self.bgbutton) + self.soundbutton.set_label(LANG[self.language]['sound']) + prepare_btn(self.soundbutton) + self.lang.set_label(self.language) + prepare_btn(self.lang) + + def setlastlanguage(self, widget, data=None): + li = LANGLIST.index(self.language) + if li == 0: + self.language = LANGLIST[len(LANGLIST)-1] + else: + self.language = LANGLIST[li-1] + self.changebuttonlang() + + def setnextlanguage(self, widget, data=None): + li = LANGLIST.index(self.language) + if li == (len(LANGLIST)-1): + self.language = LANGLIST[0] + else: + self.language = LANGLIST[li+1] + self.changebuttonlang() + + def getdefaultlang(self): + return 'English' + + def __init__(self,toplevel_window,mdirpath): + self.mdirpath = mdirpath + self.iconsdir = os.path.join(self.mdirpath,'icons') + self.playing = False + self.backnum = 0 + self.backpicpaths = [] + bpfile = file(os.path.join(self.mdirpath,'config.backpics')) + for line in bpfile: + bpfilepath = line.strip() + if bpfilepath[0] != '/': + bpfilepath = os.path.join(self.mdirpath,line.strip()) + if os.path.isfile(bpfilepath): + self.backpicpaths.append(bpfilepath) + bpfile.close() + self.waittime = 3*150 + self.insugar = False + self.language = self.getdefaultlang() + self.imgdirs = [] + imgdirfile = file(os.path.join(self.mdirpath,'config.imgdirs')) + for line in imgdirfile: + imgdirpath = line.strip() + if imgdirpath[0] != '/': + imgdirpath = os.path.join(self.mdirpath,line.strip()) + if os.path.isdir(imgdirpath): + self.imgdirs.append(imgdirpath) + imgdirfile.close() + self.imgdirindex = 0 + self.imgstartindex = 0 + self.sounds = [''] + soundfile = file(os.path.join(self.mdirpath,'config.sounds')) + for line in soundfile: + soundfilepath = line.strip() + if soundfilepath[0] != '/': + soundfilepath = os.path.join(self.mdirpath,line.strip()) + if os.path.isfile(soundfilepath): + self.sounds.append(soundfilepath) + soundfile.close() + self.soundindex = 0 + self.soundfile = self.sounds[self.soundindex] + # START GSTREAMER STUFF + self.player = gst.element_factory_make("playbin", "player") + fakesink = gst.element_factory_make('fakesink', "my-fakesink") + self.player.set_property("video-sink", fakesink) + self.bus = self.player.get_bus() + self.bus.add_signal_watch() + self.bus.connect('message', self.on_gstmessage) + # END GSTREAMER STUFF + self.fgpixbuf = self.gettranspixbuf(BGWIDTH,BGHEIGHT) + + self.mpbox = gtk.VBox() + + self.main = gtk.EventBox() + self.main.show() + self.main.modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse(GRAY)) + self.mainbox = gtk.EventBox() + self.mainbox.modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse(BACKGROUND)) + self.mainbox.set_border_width(5) + self.mainbox.show() + self.main.add(self.mainbox) + self.mpbox.show() + self.logobox = gtk.HBox(False,0) + self.logobox.show() + self.logo = gtk.Image() + self.logo.show() + self.logo.set_from_file(os.path.join(self.iconsdir,'logo.png')) + self.logobox.pack_start(self.logo,False,False,0) + self.lessonplans = gtk.Button('Lesson Plans') + self.lessonplans.connect('clicked',self.showlessonplans, None) + prepare_btn(self.lessonplans) + self.lessonplans.show() + self.lpvbox = gtk.VBox() + self.lpvbox.show() + self.lpvbox.pack_start(self.lessonplans,True,False,0) + self.lpoframe = gtk.EventBox() + self.lpoframe.modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse(YELLOW)) + self.lpoframe.show() + self.lpframe = gtk.EventBox() + self.lpframe.modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse(BACKGROUND)) + self.lpframe.show() + self.lpalign = gtk.Alignment(1.0,1.0,1.0,1.0) + self.lpalign.add(self.lpframe) + self.lpalign.set_padding(5,0,5,0) + self.lpalign.show() + self.lpoframe.add(self.lpalign) + self.lphbox = gtk.HBox() + self.lphbox.show() + self.lphbox.pack_start(self.lpvbox,True,False,0) + self.lpframe.add(self.lphbox) + self.logobox.pack_start(self.lpoframe,True,True,0) + #self.lang = gtk.combo_box_new_text() + #self.lang.append_text('Language') + #self.lang.append_text('English') + #self.lang.append_text(SPANISH) + #self.lang.connect('changed', self.changed_cb) + #self.lang.set_active(0) + #prepare_btn(self.lang) + #self.lang.show() + self.lastlang = gtk.Button() + self.lastlang.connect('clicked', self.setlastlanguage, None) + llla = gtk.Image() + llla.set_from_file(os.path.join(self.iconsdir,'left_arrow.png')) + llla.show() + self.lastlang.add(llla) + prepare_btn(self.lastlang) + self.lastlang.show() + self.llvbox = gtk.VBox() + self.llvbox.show() + self.llvbox.pack_start(self.lastlang,True,False,0) + self.lang = gtk.Button(self.language) + prepare_btn(self.lang) + self.lang.show() + self.nextlang = gtk.Button() + self.nextlang.connect('clicked', self.setnextlanguage, None) + nlra = gtk.Image() + nlra.set_from_file(os.path.join(self.iconsdir,'right_arrow.png')) + nlra.show() + self.nextlang.add(nlra) + prepare_btn(self.nextlang) + self.nextlang.show() + self.nlvbox = gtk.VBox() + self.nlvbox.show() + self.nlvbox.pack_start(self.nextlang,True,False,0) + self.langvbox = gtk.VBox() + self.langvbox.show() + self.langvbox.pack_start(self.lang,True,False,0) + self.langoframe = gtk.EventBox() + self.langoframe.modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse(YELLOW)) + self.langoframe.show() + self.langframe = gtk.EventBox() + self.langframe.modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse(BACKGROUND)) + self.langframe.show() + self.langalign = gtk.Alignment(1.0,1.0,1.0,1.0) + self.langalign.add(self.langframe) + self.langalign.set_padding(5,0,5,0) + self.langalign.show() + self.langoframe.add(self.langalign) + self.langhbox = gtk.HBox() + self.langhbox.show() + self.langhbox.pack_start(self.llvbox,True,False,0) + self.langhbox.pack_start(self.langvbox,True,False,0) + self.langhbox.pack_start(self.nlvbox,True,False,0) + self.langframe.add(self.langhbox) + self.logobox.pack_start(self.langoframe,True,True,0) + + self.sooframe = gtk.EventBox() + self.sooframe.modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse(YELLOW)) + self.sooframe.show() + self.soframe = gtk.EventBox() + self.soframe.modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse(BACKGROUND)) + self.soframe.show() + self.soalign = gtk.Alignment(1.0,1.0,1.0,1.0) + self.soalign.add(self.soframe) + self.soalign.set_padding(5,0,5,5) + self.soalign.show() + self.sooframe.add(self.soalign) + self.fileopen = gtk.Button() + openimg = gtk.Image() + openimg.set_from_stock(gtk.STOCK_OPEN,gtk.ICON_SIZE_BUTTON) + openimg.show() + prepare_btn(self.fileopen) + self.fileopen.set_label('') + self.fileopen.set_image(openimg) + self.fileopen.connect('clicked',self.loadfile, None) + self.fileopen.show() + self.fovbox = gtk.VBox() + self.fovbox.show() + self.fovbox.pack_start(self.fileopen,True,False,0) + self.fohbox = gtk.HBox() + self.fohbox.show() + self.fohbox.pack_start(self.fovbox,True,False,0) + self.filesave = gtk.Button() + saveimg = gtk.Image() + saveimg.set_from_stock(gtk.STOCK_SAVE,gtk.ICON_SIZE_BUTTON) + saveimg.show() + prepare_btn(self.filesave) + self.filesave.set_label('') + self.filesave.set_image(saveimg) + self.filesave.connect('clicked',self.savefile, None) + self.filesave.show() + self.fsvbox = gtk.VBox() + self.fsvbox.show() + self.fsvbox.pack_start(self.filesave,True,False,0) + self.fohbox.pack_start(self.fsvbox,True,False,0) + self.soframe.add(self.fohbox) + self.logobox.pack_start(self.sooframe,True,True,0) + + self.mpbox.pack_start(self.logobox,False,False,0) + + self.centerframeborder = gtk.EventBox() + self.centerframeborder.modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse(YELLOW)) + self.centerframeborder.show() + self.ocenterframe = gtk.EventBox() + self.ocenterframe.modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse(BACKGROUND)) + self.ocenterframe.set_border_width(5) + self.ocenterframe.show() + self.centerframeborder.add(self.ocenterframe) + self.centerframe = gtk.EventBox() + self.centerframe.modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse(BACKGROUND)) + self.centerframe.set_border_width(5) + self.centerframe.show() + self.ocenterframe.add(self.centerframe) + self.hbox = gtk.HBox() + self.hbox.show() + self.mainbox.add(self.mpbox) + self.centerframe.add(self.hbox) + self.mpbox.pack_start(self.centerframeborder,True,True,0) + + + self.tvbox = gtk.VBox() + self.tvbox.show() + # flow arrows + flowbox = gtk.HBox() + flowbox.show() + yellow_arrow = gtk.Image() + yellow_arrow.set_from_file(os.path.join(self.iconsdir, 'yellow_arrow.png')) + yellow_arrow.show() + flowbox.pack_end(yellow_arrow,True,False,0) + topspace = gtk.EventBox() + topspace.modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse(BACKGROUND)) + topspace.show() + topspace.set_border_width(15) + self.tvbox.pack_start(topspace,False,False,0) + self.tvbox.pack_start(flowbox,False,False,0) + self.table = gtk.Table(rows=7, columns=2, homogeneous=False) + + self.imgbuttons = [] + self.images = [] + # POSE CHOOSER BUTTONS + for i in range(1,11): + ib = gtk.EventBox() + #ib = gtk.Button() + #ib.connect('clicked', self.pickimage, i) + ib.set_events(gtk.gdk.BUTTON_PRESS_MASK) + ib.connect('button_press_event', self.pickimage, i) + ib.set_border_width(1) + #ib.add(img) + ib.modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse(BLACK)) + ib.modify_bg(gtk.STATE_PRELIGHT,gtk.gdk.color_parse(BLACK)) + ib.show() + img = gtk.Image() + img.show() + #ib.set_label('') + #ib.set_image(img) + ib.add(img) + self.imgbuttons.append(ib) + self.images.append(img) + + self.imgupbutton = gtk.Button() + self.imgupbutton.connect('clicked', self.imgup, None) + self.imgupbutton.show() + #upa = gtk.Arrow(gtk.ARROW_UP,gtk.SHADOW_OUT) + #upa.show() + upa = gtk.Image() + upa.set_from_file(os.path.join(self.iconsdir,'up_arrow.png')) + upa.show() + self.imgupbutton.add(upa) + prepare_btn(self.imgupbutton) + self.iubhbox = gtk.HBox() + self.iubhbox.show() + self.iubhbox.pack_start(self.imgupbutton,True,False,0) + self.tvbox.pack_start(self.iubhbox,False,False,0) + + self.table.attach(self.imgbuttons[0],0,1,0,1) + self.table.attach(self.imgbuttons[1],1,2,0,1) + self.table.attach(self.imgbuttons[2],0,1,1,2) + self.table.attach(self.imgbuttons[3],1,2,1,2) + self.table.attach(self.imgbuttons[4],0,1,2,3) + self.table.attach(self.imgbuttons[5],1,2,2,3) + self.table.attach(self.imgbuttons[6],0,1,3,4) + self.table.attach(self.imgbuttons[7],1,2,3,4) + self.table.attach(self.imgbuttons[8],0,1,4,5) + self.table.attach(self.imgbuttons[9],1,2,4,5) + self.table.show() + + self.tableframeborder = gtk.EventBox() + self.tableframeborder.modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse(YELLOW)) + self.tableframeborder.show() + self.tableframe = gtk.EventBox() + self.tableframe.modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse(BACKGROUND)) + self.tableframe.show() + self.tableframe.set_border_width(5) + self.tableframeborder.add(self.tableframe) + self.tableframe.add(self.table) + + self.tfhbox = gtk.HBox() + self.tfhbox.show() + self.tfhbox.pack_start(self.tableframeborder,True,False,20) + self.tvbox.pack_start(self.tfhbox,False,False,0) + + self.imgdownbutton = gtk.Button() + self.imgdownbutton.connect('clicked', self.imgdown, None) + self.imgdownbutton.show() + #downa = gtk.Arrow(gtk.ARROW_DOWN,gtk.SHADOW_OUT) + #downa.show() + downa = gtk.Image() + downa.set_from_file(os.path.join(self.iconsdir,'down_arrow.png')) + downa.show() + self.imgdownbutton.add(downa) + prepare_btn(self.imgdownbutton) + self.idbhbox = gtk.HBox() + self.idbhbox.show() + self.idbhbox.pack_start(self.imgdownbutton,True,False,0) + self.tvbox.pack_start(self.idbhbox,False,False,0) + self.hbox.pack_start(self.tvbox,True,True,0) + + self.imgdir = self.imgdirs[self.imgdirindex] + self.loadimages() + + self.rightbox = gtk.VBox() + self.rightbox.show() + + # ANIMATION FRAMES / FILMSTRIP + self.tophbox = gtk.HBox() + self.tophbox.show() + # animation frames + self.animhbox = gtk.HBox() + self.animhbox.show() + self.framebuttons = [] + self.frameimgs = [] + self.fgpixbufs = [] + for i in range(6): + #fb = gtk.Button() + #fb.connect('clicked', self.selectframe, i+1) + fb = gtk.EventBox() + fb.set_events(gtk.gdk.BUTTON_PRESS_MASK) + fb.connect('button_press_event', self.selectframe, i+1) + fb.modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse(BLACK)) + fb.modify_bg(gtk.STATE_PRELIGHT,gtk.gdk.color_parse(BLACK)) + fb.show() + self.framebuttons.append(fb) + tpixbuf = self.gettranspixbuf(BGWIDTH,BGHEIGHT) + self.fgpixbufs.append(tpixbuf) + #fb.set_label('') + transimg = gtk.Image() + transimg.set_from_pixbuf(self.gettranspixbuf(IMGWIDTH,IMGHEIGHT)) + transimg.show() + self.frameimgs.append(transimg) + #fb.set_image(transimg) + fb.add(transimg) + self.animhbox.pack_start(fb,True,True,2) + #if i != 5: + # ra = gtk.Arrow(gtk.ARROW_RIGHT,gtk.SHADOW_OUT) + # ra.show() + # self.tophbox.pack_start(ra,True,True,0) + + + self.animborder = gtk.EventBox() + self.animborder.modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse(PINK)) + self.animborder.show() + self.animframe = gtk.EventBox() + self.animframe.modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse(BACKGROUND)) + self.animframe.set_border_width(5) + self.animframe.show() + self.animborder.add(self.animframe) + self.animfilmstrip = gtk.VBox() + self.animfilmstrip.show() + self.filmstriptopimg = gtk.Image() + self.filmstriptopimg.set_from_file(os.path.join(self.iconsdir,'filmstrip.png')) + self.filmstriptopimg.show() + self.animfilmstrip.pack_start(self.filmstriptopimg,False,False,0) + self.animfilmstrip.pack_start(self.animhbox,False,False,0) + self.filmstripbottomimg = gtk.Image() + self.filmstripbottomimg.set_from_file(os.path.join(self.iconsdir,'filmstrip.png')) + self.filmstripbottomimg.show() + self.animfilmstrip.pack_start(self.filmstripbottomimg,False,False,0) + self.animframe.add(self.animfilmstrip) + self.afvbox = gtk.VBox() + self.afvbox.show() + self.afvbox.pack_start(self.animborder,False,False,0) + self.tophbox.pack_start(self.afvbox,False,False,0) + #self.clrframe = gtk.Button('CLEAR FRAME') + cancelimg = gtk.Image() + #cancelimg.set_from_stock(gtk.STOCK_CANCEL,gtk.ICON_SIZE_BUTTON) + cancelimg.set_from_file(os.path.join(self.iconsdir,'clear.png')) + cancelimg.show() + self.clrframe = gtk.Button() + self.clrframe.set_label('') + self.clrframe.set_image(cancelimg) + self.clrframe.connect('clicked', self.clearall, None) + prepare_btn(self.clrframe) + self.clrframe.show() + + #self.cfbox.pack_start(self.clrframe,True,True,0) + #self.clrall = gtk.Button('CLEAR ALL') + #self.clrall.connect('clicked', self.clearall, None) + #self.clrall.show() + #self.cfbox.pack_start(self.clrall,True,True,0) + #self.controlbox.pack_start(self.cfbox,True,True,0) + self.cfvbox = gtk.VBox() + self.cfvbox.show() + self.cfvbox.pack_start(self.clrframe,True,False,0) + self.tophbox.pack_start(self.cfvbox,False,False,5) + + pink_arrow = gtk.Image() + pink_arrow.set_from_file(os.path.join(self.iconsdir, 'pink_arrow.png')) + pink_arrow.show() + self.pahbox = gtk.HBox() + self.pahbox.show() + self.pahbox.pack_start(pink_arrow,False,False,150) + self.topvbox = gtk.VBox() + self.topvbox.show() + self.topvbox.pack_start(self.tophbox,False,False,0) + self.topvbox.pack_start(self.pahbox,False,False,0) + + self.rightbox.pack_start(self.topvbox,False,False,5) + self.frame_selected = 0 + self.fbstyle = self.framebuttons[0].get_style() + self.framebuttons[0].modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse(YELLOW)) + self.framebuttons[0].modify_bg(gtk.STATE_PRELIGHT,gtk.gdk.color_parse(YELLOW)) + + self.bottomhbox = gtk.HBox() + self.bottomhbox.show() + + self.centervbox = gtk.VBox() + self.centervbox.show() + # MAIN IMAGE + self.mfdraw = FrameWidget(None,self.fgpixbuf) + self.mfdraw.set_size_request(BGWIDTH,BGHEIGHT) + self.mfdraw.show() + self.mfdrawborder = gtk.EventBox() + self.mfdrawborder.modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse(PINK)) + self.mfdrawborder.show() + self.mfdrawbox = gtk.EventBox() + self.mfdrawbox.set_border_width(5) + self.mfdrawbox.show() + self.mfdrawbox.add(self.mfdraw) + self.mfdrawborder.add(self.mfdrawbox) + self.centervbox.pack_start(self.mfdrawborder,False,False,0) + + self.bcontrolbox = gtk.HBox() + self.bcontrolbox.set_border_width(5) + self.bcontrolbox.show() + # GO BUTTON + playimg = gtk.Image() + #playimg.set_from_stock(gtk.STOCK_MEDIA_PLAY,gtk.ICON_SIZE_BUTTON) + playimg.set_from_file(os.path.join(self.iconsdir,'right_arrow.png')) + playimg.show() + self.gobutton = gtk.Button() + self.gobutton.set_label('') + self.gobutton.set_image(playimg) + self.gobutton.connect('clicked', self.go, None) + prepare_btn(self.gobutton) + self.gobutton.show() + self.bcontrolbox.pack_start(self.gobutton,True,True,5) + + # SPEED CONTROLS + self.sbox = gtk.VBox() + self.sbox.show() + adj = gtk.Adjustment(2.5,1,5,.5,1) + adj.connect('value_changed',self.setplayspeed) + self.playspeed = gtk.HScale(adj) + self.playspeed.set_draw_value(False) + for state, color in COLOR_BG_BUTTONS: + self.playspeed.modify_bg(state, gtk.gdk.color_parse(color)) + self.playspeed.show() + self.sbox.pack_start(self.playspeed,True,True,0) + #self.pslabel = gtk.Label('Speed') + #self.pslabel.show() + #self.sbox.pack_start(self.pslabel,True,True,0) + self.bcontrolbox.pack_start(self.sbox,True,True,5) + self.centervbox.pack_start(self.bcontrolbox,False,False,0) + self.bottomhbox.pack_start(self.centervbox,False,False,0) + + self.controlbox = gtk.VBox() + self.controlbox.show() + + # CHARACTER CONTROLS + self.ccbox = gtk.VBox() + self.ccbox.show() + self.cchbox = gtk.HBox() + self.cchbox.show() + self.cclbutton = gtk.Button() + self.cclbutton.connect('clicked',self.lastcharacter,None) + self.cclbutton.show() + ccla = gtk.Image() + ccla.set_from_file(os.path.join(self.iconsdir,'left_arrow.png')) + ccla.show() + prepare_btn(self.cclbutton) + self.cclbutton.add(ccla) + self.cclbvbox = gtk.VBox() + self.cclbvbox.show() + self.cclbvbox.pack_start(self.cclbutton,True,False,0) + self.cchbox.pack_start(self.cclbvbox,True,False,5) + self.ccibutton = gtk.Button() + self.ccibutton.show() + self.ccismall = gtk.Image() + self.ccismall.show() + self.cciebox = gtk.EventBox() + self.cciebox.modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse(BLACK)) + self.cciebox.show() + self.cciebox.add(self.ccismall) + self.ccibvbox = gtk.VBox() + self.ccibvbox.show() + self.ccibvbox.pack_start(self.cciebox,True,False,0) + self.cchbox.pack_start(self.ccibvbox,False,False,0) + self.ccrbutton = gtk.Button() + self.ccrbutton.connect('clicked',self.nextcharacter,None) + self.ccrbutton.show() + ccra = gtk.Image() + ccra.set_from_file(os.path.join(self.iconsdir,'right_arrow.png')) + ccra.show() + self.ccrbutton.add(ccra) + prepare_btn(self.ccrbutton) + self.ccrbvbox = gtk.VBox() + self.ccrbvbox.show() + self.ccrbvbox.pack_start(self.ccrbutton,True,False,0) + self.cchbox.pack_start(self.ccrbvbox,True,False,5) + self.ccbox.pack_start(self.cchbox,True,True,0) + self.charlabel = gtk.Label('') + self.charlabel.show() + self.charlabelhbox = gtk.HBox() + self.charlabelhbox.show() + self.charlabelhbox.pack_start(self.charlabel,True,False,0) + self.ccbox.pack_start(self.charlabelhbox,False,False,0) + self.character = gtk.Button('My Character') + self.character.connect('clicked',self.getimgdir,None) + prepare_btn(self.character) + self.character.show() + self.characterhbox = gtk.HBox() + self.characterhbox.show() + self.characterhbox.pack_start(self.character,True,False,0) + self.ccbox.pack_start(self.characterhbox,False,False,5) + self.setcharacter() + + + self.controlbox.pack_start(self.ccbox,False,False,5) + + # BACKGROUND CONTROLS + self.bgbox = gtk.VBox() + self.bgbox.show() + self.bghbox = gtk.HBox() + self.bghbox.show() + self.blbutton = gtk.Button() + self.blbutton.connect('clicked',self.lastback,None) + self.blbutton.show() + bla = gtk.Image() + bla.set_from_file(os.path.join(self.iconsdir,'left_arrow.png')) + bla.show() + self.blbutton.add(bla) + prepare_btn(self.blbutton) + self.blbvbox = gtk.VBox() + self.blbvbox.show() + self.blbvbox.pack_start(self.blbutton,True,False,0) + self.bghbox.pack_start(self.blbvbox,True,False,5) + self.bgsmall = gtk.Image() + bgimgpath = os.path.join(self.mdirpath,'backpics/bigbg01.gif') + self.setback(bgimgpath) + self.bgsmall.show() + self.bghbox.pack_start(self.bgsmall,False,False,0) + self.brbutton = gtk.Button() + self.brbutton.connect('clicked',self.nextback,None) + self.brbutton.show() + bra = gtk.Image() + bra.set_from_file(os.path.join(self.iconsdir,'right_arrow.png')) + bra.show() + self.brbutton.add(bra) + prepare_btn(self.brbutton) + self.brbvbox = gtk.VBox() + self.brbvbox.show() + self.brbvbox.pack_start(self.brbutton,True,False,0) + self.bghbox.pack_start(self.brbvbox,True,False,5) + self.bgbox.pack_start(self.bghbox,True,True,0) + self.bgbutton = gtk.Button('My Background') + self.bgbutton.connect('clicked',self.getbackgroundfile,None) + prepare_btn(self.bgbutton) + self.bgbutton.show() + self.bgbuttonhbox = gtk.HBox() + self.bgbuttonhbox.show() + self.bgbuttonhbox.pack_start(self.bgbutton,True,False,0) + self.bgbox.pack_start(self.bgbuttonhbox,False,False,5) + self.controlbox.pack_start(self.bgbox,False,False,5) + + # SOUND CONTROLS + self.soundbox = gtk.VBox() + self.soundbox.show() + self.soundhbox = gtk.HBox() + self.soundhbox.show() + self.slbutton = gtk.Button() + self.slbutton.connect('clicked',self.lastsound,None) + self.slbutton.show() + sla = gtk.Image() + sla.set_from_file(os.path.join(self.iconsdir,'left_arrow.png')) + sla.show() + self.slbutton.add(sla) + prepare_btn(self.slbutton) + self.slbvbox = gtk.VBox() + self.slbvbox.show() + self.slbvbox.pack_start(self.slbutton,True,False,0) + self.soundhbox.pack_start(self.slbvbox,True,False,5) + self.soundimg = gtk.Image() + self.soundimg.set_from_file(os.path.join(self.iconsdir,'sound_icon.png')) + self.soundimg.show() + self.soundhbox.pack_start(self.soundimg,False,False,0) + self.srbutton = gtk.Button() + self.srbutton.connect('clicked',self.nextsound,None) + self.srbutton.show() + sra = gtk.Image() + sra.set_from_file(os.path.join(self.iconsdir,'right_arrow.png')) + sra.show() + self.srbutton.add(sra) + prepare_btn(self.srbutton) + self.srbvbox = gtk.VBox() + self.srbvbox.show() + self.srbvbox.pack_start(self.srbutton,True,False,0) + self.soundhbox.pack_start(self.srbvbox,True,False,5) + self.soundbox.pack_start(self.soundhbox,True,True,0) + self.soundlabel = gtk.Label('No Sound') + self.soundlabel.show() + self.soundlabelhbox = gtk.HBox() + self.soundlabelhbox.show() + self.soundlabelhbox.pack_start(self.soundlabel,True,False,0) + self.soundbox.pack_start(self.soundlabelhbox,False,False,0) + self.soundbutton = gtk.Button('My Sound') + self.soundbutton.connect('clicked',self.getsoundfile,None) + prepare_btn(self.soundbutton) + self.soundbutton.show() + self.soundbuttonhbox = gtk.HBox() + self.soundbuttonhbox.show() + self.soundbuttonhbox.pack_start(self.soundbutton,True,False,0) + self.soundbox.pack_start(self.soundbuttonhbox,False,False,5) + self.controlbox.pack_start(self.soundbox,False,False,5) + + # FINISHING DETAILS + self.bottomhbox.pack_start(self.controlbox,True,True,10) + self.rightbox.pack_start(self.bottomhbox,True,True,10) + self.hbox.pack_start(self.rightbox,True,True,0) + + def main(self): + gtk.main() + +try: + from sugar.activity import activity + class cartoonbuilderActivity(activity.Activity): + def __init__(self, handle): + activity.Activity.__init__(self,handle) + self.connect("destroy",self.destroy_cb) + #app = cartoonbuilder(self,'/home/olpc/Activities/CartoonBuilder.activity') + bundle_path = activity.get_bundle_path() + os.chdir(bundle_path) + self.set_title('CartoonBuilder') + toolbox = activity.ActivityToolbox(self) + self.set_toolbox(toolbox) + toolbox.show() + if hasattr(self, '_jobject'): + self._jobject.metadata['title'] = 'CartoonBuilder' + title_widget = toolbox._activity_toolbar.title + title_widget.set_size_request(title_widget.get_layout().get_pixel_size()[0] + 20, -1) + app = cartoonbuilder(self, bundle_path) + app.insugar = True + outerframe = gtk.EventBox() + outerframe.show() + innerframe = gtk.EventBox() + innerframe.show() + ifalign = gtk.Alignment(1.0,1.0,1.0,1.0) + ifalign.add(innerframe) + ifalign.set_padding(85,90,160,160) # top,bottom,left,right + ifalign.show() + #innerframe.set_border_width(150) + outerframe.add(ifalign) + innerframe.add(app.main) + self.set_canvas(outerframe) + + def destroy_cb(self, data=None): + return True + +except ImportError: + pass + +if __name__ == "__main__": + # have to do toplevel window stuff here because Sugar does it on the OLPC + toplevel_window = gtk.Window(gtk.WINDOW_TOPLEVEL) + #mdirpath = '.' + mdirpath = os.path.abspath(os.curdir) + app = cartoonbuilder(toplevel_window,mdirpath) + toplevel_window.add(app.main) + toplevel_window.set_title('Cartoon Builder') + # FULLSCREEN + + #toplevel_window.set_decorated(False) + #toplevel_window.fullscreen() + + toplevel_window.connect("delete_event", app.delete_event) + toplevel_window.connect("destroy", app.destroy) + #toplevel_window.set_border_width(10) + toplevel_window.show() + gtk.main() |