Added sounds.
This commit is contained in:
parent
910a694b61
commit
473580484f
26
base.js
26
base.js
|
|
@ -661,7 +661,7 @@ function TextField() {
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
makeNonEnumerable(TextField);
|
// makeNonEnumerable(TextField);
|
||||||
|
|
||||||
var _rootFrame = new Frame()
|
var _rootFrame = new Frame()
|
||||||
var _root = new MovieClip()
|
var _root = new MovieClip()
|
||||||
|
|
@ -717,6 +717,30 @@ Object.prototype.isPropertyEnumerable = function (name) {
|
||||||
Object.defineProperty( Object.prototype, "addProperty", {enumerable: false});
|
Object.defineProperty( Object.prototype, "addProperty", {enumerable: false});
|
||||||
Object.defineProperty( Object.prototype, "isPropertyEnumerable", {enumerable: false});
|
Object.defineProperty( Object.prototype, "isPropertyEnumerable", {enumerable: false});
|
||||||
|
|
||||||
|
|
||||||
|
function Sound() {
|
||||||
|
this._sound = undefined;
|
||||||
|
this.duration = undefined
|
||||||
|
this.getVolume = function () {
|
||||||
|
return parseInt(this._sound.volume*100);
|
||||||
|
}
|
||||||
|
this.loadSound = function (url) {
|
||||||
|
this._sound = new Audio (url);
|
||||||
|
this._sound.load();
|
||||||
|
this.duration = this._sound.duration
|
||||||
|
}
|
||||||
|
this.setVolume = function (vol) {
|
||||||
|
this._sound.volume = vol;
|
||||||
|
}
|
||||||
|
this.start = function () {
|
||||||
|
this._sound.play();
|
||||||
|
}
|
||||||
|
this.stop = function () {
|
||||||
|
this._sound.pause();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Sound.addProperty('position', function () {return parseInt(this._sound.position*1000)})
|
||||||
|
|
||||||
function Point (x, y) {
|
function Point (x, y) {
|
||||||
this.x = x
|
this.x = x
|
||||||
this.y = y
|
this.y = y
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
# © 2012 Skyler Lehmkuhl
|
# © 2012 Skyler Lehmkuhl
|
||||||
# Released under the GPLv3. For more information, see gpl.txt.
|
# Released under the GPLv3. For more information, see gpl.txt.
|
||||||
|
|
||||||
import os, shutil, tarfile, tempfile, StringIO, urllib
|
import os, shutil, tarfile, tempfile, StringIO, urllib, subprocess
|
||||||
|
|
||||||
# Workaround for broken menubar under Ubuntu
|
# Workaround for broken menubar under Ubuntu
|
||||||
os.putenv("UBUNTU_MENUPROXY", "0")
|
os.putenv("UBUNTU_MENUPROXY", "0")
|
||||||
|
|
@ -280,10 +280,19 @@ def onKeyDownObj(self, key):
|
||||||
add_keyframe()
|
add_keyframe()
|
||||||
elif key=="F8":
|
elif key=="F8":
|
||||||
convert_to_symbol()
|
convert_to_symbol()
|
||||||
|
elif key=="left_arrow":
|
||||||
|
self.x-=1
|
||||||
|
elif key=="right_arrow":
|
||||||
|
self.x+=1
|
||||||
|
elif key=="up_arrow":
|
||||||
|
self.y-=1
|
||||||
|
elif key=="down_arrow":
|
||||||
|
self.y+=1
|
||||||
|
|
||||||
def create_sc(root):
|
def create_sc(root):
|
||||||
#retval = ".flash bbox="+str(svlgui.WIDTH)+"x"+str(svlgui.HEIGHT)+" background=#ffffff \
|
#retval = ".flash bbox="+str(svlgui.WIDTH)+"x"+str(svlgui.HEIGHT)+" background=#ffffff \
|
||||||
#fps="+str(svlgui.FRAMERATE)+"\n"+root.print_sc()+".end"
|
#fps="+str(svlgui.FRAMERATE)+"\n"+root.print_sc()+".end"
|
||||||
|
print svlgui.Library
|
||||||
retval = ".flash bbox="+str(svlgui.WIDTH)+"x"+str(svlgui.HEIGHT)+" background=#ffffff \
|
retval = ".flash bbox="+str(svlgui.WIDTH)+"x"+str(svlgui.HEIGHT)+" background=#ffffff \
|
||||||
fps="+str(svlgui.FRAMERATE)+"\n"+"".join([i.print_sc() for i in svlgui.Library])+root.print_sc()+".end"
|
fps="+str(svlgui.FRAMERATE)+"\n"+"".join([i.print_sc() for i in svlgui.Library])+root.print_sc()+".end"
|
||||||
return retval
|
return retval
|
||||||
|
|
@ -562,14 +571,64 @@ def save_file_as(widget=None):
|
||||||
svlgui.FILE = thetarfile
|
svlgui.FILE = thetarfile
|
||||||
pass
|
pass
|
||||||
def import_to_stage(widget=None):
|
def import_to_stage(widget=None):
|
||||||
thefile = svlgui.file_dialog("open",None,["jpg","png","bmp"]).path
|
thefile = svlgui.file_dialog("open",None,["jpg","png","bmp","wav"]).path
|
||||||
im = svlgui.Image(thefile)
|
for i in ("jpg","png","bmp"):
|
||||||
im.onMouseDown = onMouseDownObj
|
if thefile.endswith(i):
|
||||||
im.onMouseMove = onMouseMoveObj
|
im = svlgui.Image(thefile)
|
||||||
im.onMouseDrag = onMouseDragObj
|
im.onMouseDown = onMouseDownObj
|
||||||
im.onMouseUp = onMouseUpObj
|
im.onMouseMove = onMouseMoveObj
|
||||||
im.onKeyDown = onKeyDownObj
|
im.onMouseDrag = onMouseDragObj
|
||||||
root.descendItem().add(im)
|
im.onMouseUp = onMouseUpObj
|
||||||
|
im.onKeyDown = onKeyDownObj
|
||||||
|
root.descendItem().add(im)
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
if thefile.endswith("wav"):
|
||||||
|
if svlgui.PLATFORM=="osx":
|
||||||
|
if not os.path.exists('sox/sox'):
|
||||||
|
try:
|
||||||
|
import numpy as NP
|
||||||
|
result = svlgui.alert("To import sound you must install SoX. This will take about 1 MB of space. Install?", confirm=True)
|
||||||
|
if not result:
|
||||||
|
return
|
||||||
|
urllib.urlretrieve('http://downloads.sourceforge.net/project/sox/sox/14.4.0/sox-14.4.0-macosx.zip?r=&ts=1357270265&use_mirror=iweb', 'sox.zip')
|
||||||
|
os.system('ditto -V -x -k --sequesterRsrc --rsrc sox.zip .')
|
||||||
|
os.system('mv sox-14.4.0 sox')
|
||||||
|
except:
|
||||||
|
result = svlgui.alert("To import sound you must install NumPy and SoX. This will take about 10 MB of space. Install?", confirm=True)
|
||||||
|
if not result:
|
||||||
|
return
|
||||||
|
os.system("""osascript -e 'do shell script "easy_install numpy" with administrator privileges'""")
|
||||||
|
import numpy as NP
|
||||||
|
urllib.urlretrieve('http://downloads.sourceforge.net/project/sox/sox/14.4.0/sox-14.4.0-macosx.zip?r=&ts=1357270265&use_mirror=iweb', 'sox.zip')
|
||||||
|
os.system('ditto -V -x -k --sequesterRsrc --rsrc sox.zip .')
|
||||||
|
os.system('mv sox-14.4.0 sox')
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
import numpy as NP
|
||||||
|
except:
|
||||||
|
result = svlgui.alert("To import sound you must install NumPy. This will take about 9 MB of space. Install?", confirm=True)
|
||||||
|
if not result:
|
||||||
|
return
|
||||||
|
os.system("""osascript -e 'do shell script "easy_install numpy" with administrator privileges'""")
|
||||||
|
import numpy as NP
|
||||||
|
SOX_EXEC = 'sox/sox'
|
||||||
|
svlgui.NP = NP
|
||||||
|
num_channels = 1
|
||||||
|
out_byps = 2 # Bytes per sample you want, must be 1, 2, 4, or 8
|
||||||
|
cmd = [SOX_EXEC,
|
||||||
|
thefile, # input filename
|
||||||
|
'-t','raw', # output file type raw
|
||||||
|
'-e','signed-integer', # output encode as signed ints
|
||||||
|
'-L', # output little endin
|
||||||
|
'-b',str(out_byps*8), # output bytes per sample
|
||||||
|
'-'] # output to stdout]
|
||||||
|
data = NP.fromstring(subprocess.check_output(cmd),'<i%d'%(out_byps))
|
||||||
|
data = data.reshape(len(data)/num_channels, num_channels)
|
||||||
|
info = subprocess.check_output([SOX_EXEC,'--i',thefile])
|
||||||
|
sound = svlgui.Sound(data, name=thefile.split('/')[-1], path=thefile, info=info)
|
||||||
|
root.descendItem().add(sound)
|
||||||
|
|
||||||
MainWindow.stage.draw()
|
MainWindow.stage.draw()
|
||||||
def import_to_library(widget=None):
|
def import_to_library(widget=None):
|
||||||
pass
|
pass
|
||||||
|
|
|
||||||
142
svlgui.py
142
svlgui.py
|
|
@ -328,7 +328,7 @@ if SYSTEM=="osx":
|
||||||
m.convert_to_symbol.enabled = 1
|
m.convert_to_symbol.enabled = 1
|
||||||
m.preferences_cmd.enabled = 1
|
m.preferences_cmd.enabled = 1
|
||||||
|
|
||||||
#def create_sc(self):
|
#def create_sc(self):
|
||||||
# pass
|
# pass
|
||||||
#def run_file(self):
|
#def run_file(self):
|
||||||
# pass
|
# pass
|
||||||
|
|
@ -1911,6 +1911,81 @@ class Text (object):
|
||||||
+"\";\n"+self.name+".hwaccel = "+str(self.hwaccel).lower()+"\n"
|
+"\";\n"+self.name+".hwaccel = "+str(self.hwaccel).lower()+"\n"
|
||||||
return retval
|
return retval
|
||||||
|
|
||||||
|
class Sound:
|
||||||
|
"""Class for storing sounds in."""
|
||||||
|
def __init__(self, data, name, path, info):
|
||||||
|
global Library
|
||||||
|
Library.append(self)
|
||||||
|
self.data = data
|
||||||
|
self.name = name.replace(" ", "_")
|
||||||
|
self.x = 0
|
||||||
|
self.y = 0
|
||||||
|
self.rotation = 0
|
||||||
|
self.xscale = 0
|
||||||
|
self.yscale = 0
|
||||||
|
self.path = path
|
||||||
|
self.iname = None
|
||||||
|
reading_comments_flag = False
|
||||||
|
other = ''
|
||||||
|
for l in info.splitlines():
|
||||||
|
if( not l.strip() ):
|
||||||
|
continue
|
||||||
|
if( reading_comments_flag and l.strip() ):
|
||||||
|
if( comments ):
|
||||||
|
comments += '\n'
|
||||||
|
comments += l
|
||||||
|
else:
|
||||||
|
if( l.startswith('Input File') ):
|
||||||
|
input_file = l.split(':',1)[1].strip()[1:-1]
|
||||||
|
elif( l.startswith('Channels') ):
|
||||||
|
num_channels = int(l.split(':',1)[1].strip())
|
||||||
|
elif( l.startswith('Sample Rate') ):
|
||||||
|
sample_rate = int(l.split(':',1)[1].strip())
|
||||||
|
elif( l.startswith('Precision') ):
|
||||||
|
bits_per_sample = int(l.split(':',1)[1].strip()[0:-4])
|
||||||
|
elif( l.startswith('Duration') ):
|
||||||
|
tmp = l.split(':',1)[1].strip()
|
||||||
|
tmp = tmp.split('=',1)
|
||||||
|
duration_time = tmp[0]
|
||||||
|
duration_samples = int(tmp[1].split(None,1)[0])
|
||||||
|
elif( l.startswith('Sample Encoding') ):
|
||||||
|
encoding = l.split(':',1)[1].strip()
|
||||||
|
elif( l.startswith('Comments') ):
|
||||||
|
comments = ''
|
||||||
|
reading_comments_flag = True
|
||||||
|
else:
|
||||||
|
if( other ):
|
||||||
|
other += '\n'+l
|
||||||
|
else:
|
||||||
|
other = l
|
||||||
|
print >>sys.stderr, "Unhandled:",l
|
||||||
|
self.sample_rate = int(sample_rate)
|
||||||
|
self.duration_samples = int(duration_samples)
|
||||||
|
self.duration_time = int(duration_time.split(':')[0])*3600+int(duration_time.split(':')[1])*60+float(duration_time.split(':')[2])
|
||||||
|
def draw(self, cr, transform):
|
||||||
|
pass
|
||||||
|
def draw_frame(self, cr, transform):
|
||||||
|
if SYSTEM=="osx":
|
||||||
|
cr.newpath()
|
||||||
|
# cr.moveto(0,16)
|
||||||
|
chunk_size = int(self.duration_samples/(self.duration_time*FRAMERATE*16))
|
||||||
|
print chunk_size
|
||||||
|
print self.duration_samples/chunk_size
|
||||||
|
for i in xrange(self.duration_samples/chunk_size):
|
||||||
|
j = abs(NP.amax(self.data[i*chunk_size:(i+1)*chunk_size])/65536.0)
|
||||||
|
cr.moveto(i,16-j*16)
|
||||||
|
cr.lineto(i,16+j*16)
|
||||||
|
# cr.lineto(self.duration_time*16*FRAMERATE,16)
|
||||||
|
cr.stroke()
|
||||||
|
def hitTest(self, x, y):
|
||||||
|
return False
|
||||||
|
def print_sc(self):
|
||||||
|
retval = ".sound "+self.name+" \""+self.path+"\"\n"
|
||||||
|
return retval
|
||||||
|
def print_html(self):
|
||||||
|
retval = "var "+self.name.replace(".","_")+" = new Sound();\n"+self.name.replace(".","_")+"._sound = new Audio('"+self.path.split("/")[-1]+"');\n"
|
||||||
|
retval = retval + self.name.replace(".","_")+"._sound.load();\n"+self.name.replace(".","_")+".duration = "+self.name.replace(".","_")+"._sound.duration"
|
||||||
|
return retval
|
||||||
|
|
||||||
class framewrapper (object):
|
class framewrapper (object):
|
||||||
#def __getstate__(self):
|
#def __getstate__(self):
|
||||||
|
|
@ -2111,22 +2186,26 @@ class frame:
|
||||||
retval = ""
|
retval = ""
|
||||||
if self==self.parent.frames[0]:
|
if self==self.parent.frames[0]:
|
||||||
for i in self.objs:
|
for i in self.objs:
|
||||||
if i.obj.iname:
|
if isinstance(i.obj, Sound):
|
||||||
|
retval = retval+".play "+i.obj.name+"\n"
|
||||||
|
elif i.obj.iname:
|
||||||
retval = retval+".put "+i.obj.iname+"="+i.name+" x="+str(i.x)+" y="+str(i.y)+" scalex="+str(i.xscale*100)+" scaley="+str(i.yscale*100)+"\n"
|
retval = retval+".put "+i.obj.iname+"="+i.name+" x="+str(i.x)+" y="+str(i.y)+" scalex="+str(i.xscale*100)+" scaley="+str(i.yscale*100)+"\n"
|
||||||
else:
|
else:
|
||||||
retval = retval+".put "+i.name+" x="+str(i.x)+" y="+str(i.y)+" scalex="+str(i.xscale*100)+"%% scaley="+str(i.yscale*100)+"%%\n"
|
retval = retval+".put "+i.name+" x="+str(i.x)+" y="+str(i.y)+" scalex="+str(i.xscale*100)+"% scaley="+str(i.yscale*100)+"%\n"
|
||||||
else:
|
else:
|
||||||
for i in self.objs:
|
for i in self.objs:
|
||||||
if not i.obj in [j.obj for j in misc_funcs.lastval(self.parent.frames,self.parent.frames.index(self)).objs]:
|
if isinstance(i.obj, Sound):
|
||||||
|
retval = retval+".play "+i.obj.name+"\n"
|
||||||
|
elif not i.obj in [j.obj for j in misc_funcs.lastval(self.parent.frames,self.parent.frames.index(self)).objs]:
|
||||||
if not hasattr(i.obj, "iname"):
|
if not hasattr(i.obj, "iname"):
|
||||||
i.obj.iname = None
|
i.obj.iname = None
|
||||||
if i.obj.iname:
|
if i.obj.iname:
|
||||||
retval = retval+".put "+i.obj.iname+"="+i.name+" x="+str(i.x)+" y="+str(i.y)+" scalex="+str(i.xscale*100)+" scaley="+str(i.yscale*100)+"\n"
|
retval = retval+".put "+i.obj.iname+"="+i.name+" x="+str(i.x)+" y="+str(i.y)+" scalex="+str(i.xscale*100)+"% scaley="+str(i.yscale*100)+"%\n"
|
||||||
else:
|
else:
|
||||||
retval = retval+".put "+i.name+" x="+str(i.x)+" y="+str(i.y)+"scalex="+str(i.xscale*100)+" scaley="+str(i.yscale*100)+"\n"
|
retval = retval+".put "+i.name+" x="+str(i.x)+" y="+str(i.y)+"scalex="+str(i.xscale*100)+"% scaley="+str(i.yscale*100)+"%\n"
|
||||||
else:
|
else:
|
||||||
retval = retval+".move "+i.name+" x="+str(i.x)+" y="+str(i.y)+"\n"
|
retval = retval+".move "+i.name+" x="+str(i.x)+" y="+str(i.y)+"\n"
|
||||||
retval = retval+".change "+i.name+" scalex="+str(i.xscale*100)+" scaley="+str(i.yscale*100)+"\n"
|
retval = retval+".change "+i.name+" scalex="+str(i.xscale*100)+"% scaley="+str(i.yscale*100)+"%\n"
|
||||||
if not self.actions.strip()=='':
|
if not self.actions.strip()=='':
|
||||||
retval = retval + ".action:\n"+self.actions+"\n.end\n"
|
retval = retval + ".action:\n"+self.actions+"\n.end\n"
|
||||||
return retval
|
return retval
|
||||||
|
|
@ -2463,7 +2542,7 @@ class Group (object):
|
||||||
if self.activelayer.currentselect and MODE=="s":
|
if self.activelayer.currentselect and MODE=="s":
|
||||||
global SCALING
|
global SCALING
|
||||||
if (self.activelayer.currentselect.minx-5<x<self.activelayer.currentselect.minx+5 and \
|
if (self.activelayer.currentselect.minx-5<x<self.activelayer.currentselect.minx+5 and \
|
||||||
self.activelayer.currentselect.miny-5<y<self.activelayer.currentselect.miny+5) or \
|
self.activelayer.currentselect.miny-5<y<self.activelayer.currentselect.miny+5) or \
|
||||||
(self.activelayer.currentselect.minx-5<x<self.activelayer.currentselect.minx+5 and \
|
(self.activelayer.currentselect.minx-5<x<self.activelayer.currentselect.minx+5 and \
|
||||||
self.activelayer.currentselect.miny+self.activelayer.currentselect.maxy-5<y<self.activelayer.currentselect.miny+self.activelayer.currentselect.maxy+5) or \
|
self.activelayer.currentselect.miny+self.activelayer.currentselect.maxy-5<y<self.activelayer.currentselect.miny+self.activelayer.currentselect.maxy+5) or \
|
||||||
(self.activelayer.currentselect.minx+self.activelayer.currentselect.maxx-5<x<self.activelayer.currentselect.minx+self.activelayer.currentselect.maxx+5 and \
|
(self.activelayer.currentselect.minx+self.activelayer.currentselect.maxx-5<x<self.activelayer.currentselect.minx+self.activelayer.currentselect.maxx+5 and \
|
||||||
|
|
@ -2605,12 +2684,15 @@ class Group (object):
|
||||||
if self.layers[i].frames[j]:
|
if self.layers[i].frames[j]:
|
||||||
retval += self.name+"._layers["+str(i)+"]._frames["+str(j)+"] = new Frame ();\n"
|
retval += self.name+"._layers["+str(i)+"]._frames["+str(j)+"] = new Frame ();\n"
|
||||||
for k in self.layers[i].frames[j].objs:
|
for k in self.layers[i].frames[j].objs:
|
||||||
retval += self.name+"._layers["+str(i)+"]._frames["+str(j)+"]."+k.name+" = {};\n"
|
if isinstance(k.obj, Sound):
|
||||||
retval += self.name+"._layers["+str(i)+"]._frames["+str(j)+"]."+k.name+"._x = "+str(k.x)+";\n"
|
retval += self.name+"._layers["+str(i)+"].frames["+str(j)+"]."+k.obj.name.replace(".","_")+".start();\n"
|
||||||
retval += self.name+"._layers["+str(i)+"]._frames["+str(j)+"]."+k.name+"._y = "+str(k.y)+";\n"
|
else:
|
||||||
retval += self.name+"._layers["+str(i)+"]._frames["+str(j)+"]."+k.name+"._rotation = "+str(k.rot)+";\n"
|
retval += self.name+"._layers["+str(i)+"]._frames["+str(j)+"]."+k.name+" = {};\n"
|
||||||
retval += self.name+"._layers["+str(i)+"]._frames["+str(j)+"]."+k.name+"._xscale = "+str(k.xscale)+";\n"
|
retval += self.name+"._layers["+str(i)+"]._frames["+str(j)+"]."+k.name+"._x = "+str(k.x)+";\n"
|
||||||
retval += self.name+"._layers["+str(i)+"]._frames["+str(j)+"]."+k.name+"._yscale = "+str(k.yscale)+";\n"
|
retval += self.name+"._layers["+str(i)+"]._frames["+str(j)+"]."+k.name+"._y = "+str(k.y)+";\n"
|
||||||
|
retval += self.name+"._layers["+str(i)+"]._frames["+str(j)+"]."+k.name+"._rotation = "+str(k.rot)+";\n"
|
||||||
|
retval += self.name+"._layers["+str(i)+"]._frames["+str(j)+"]."+k.name+"._xscale = "+str(k.xscale)+";\n"
|
||||||
|
retval += self.name+"._layers["+str(i)+"]._frames["+str(j)+"]."+k.name+"._yscale = "+str(k.yscale)+";\n"
|
||||||
retval += self.name+"._layers["+str(i)+"]._frames["+str(j)+"].actions = \""+self.layers[i].frames[j].actions.replace("\n"," ").replace("\\","\\\\").replace("\"","\\\"")+"\"\n"
|
retval += self.name+"._layers["+str(i)+"]._frames["+str(j)+"].actions = \""+self.layers[i].frames[j].actions.replace("\n"," ").replace("\\","\\\\").replace("\"","\\\"")+"\"\n"
|
||||||
return retval
|
return retval
|
||||||
|
|
||||||
|
|
@ -2639,10 +2721,10 @@ class TemporaryGroup(Group):
|
||||||
self1.y = y-self1.inity
|
self1.y = y-self1.inity
|
||||||
elif MODE=="s":
|
elif MODE=="s":
|
||||||
if SCALING:
|
if SCALING:
|
||||||
|
# Not working yet.
|
||||||
if self1.initx>self1.maxx/2:
|
if self1.initx>self1.maxx/2:
|
||||||
self1.xscale = (x-self1.x)/self1.maxx
|
self1.xscale = (x-self1.x)/self1.maxx
|
||||||
else:
|
else:
|
||||||
# I don't understand why I need 2*self1.maxx instead of just maxx, but it works.
|
|
||||||
self1.xscale = (2*self1.maxx+self1.x-(x-self1.initx)-x)/self1.maxx
|
self1.xscale = (2*self1.maxx+self1.x-(x-self1.initx)-x)/self1.maxx
|
||||||
self1.x = x
|
self1.x = x
|
||||||
if self1.inity>self1.maxy/2:
|
if self1.inity>self1.maxy/2:
|
||||||
|
|
@ -2653,9 +2735,26 @@ class TemporaryGroup(Group):
|
||||||
self1.y = y
|
self1.y = y
|
||||||
def onMouseUp(self, self1, x, y, button=1, clicks=1):
|
def onMouseUp(self, self1, x, y, button=1, clicks=1):
|
||||||
self.clicked = False
|
self.clicked = False
|
||||||
# def hitTest(self, x, y):
|
def onKeyDown(self, self1, key):
|
||||||
# print self.x, self.y, x, y
|
if key in ("delete", "backspace"):
|
||||||
# return True
|
del self1.parent[self1.parent.index(self1)] # Need to clean up deletion
|
||||||
|
elif key in [" ", "s", "r", "e", "b", "p"]:
|
||||||
|
svlgui.MODE=key
|
||||||
|
svlgui.set_cursor({" ":"arrow","s":"arrow","r":"crosshair","e":"crosshair",
|
||||||
|
"b":"arrow","p":"arrow"}[key], MainWindow.stage)
|
||||||
|
misc_funcs.update_tooloptions()
|
||||||
|
elif key=="F6":
|
||||||
|
add_keyframe()
|
||||||
|
elif key=="F8":
|
||||||
|
convert_to_symbol()
|
||||||
|
elif key=="left_arrow":
|
||||||
|
self1.x-=1
|
||||||
|
elif key=="right_arrow":
|
||||||
|
self1.x+=1
|
||||||
|
elif key=="up_arrow":
|
||||||
|
self1.y-=1
|
||||||
|
elif key=="down_arrow":
|
||||||
|
self1.y+=1
|
||||||
|
|
||||||
|
|
||||||
def set_cursor(curs, widget=None):
|
def set_cursor(curs, widget=None):
|
||||||
|
|
@ -3065,6 +3164,13 @@ class FramesCanvas(Canvas):
|
||||||
dst_rect = [i*16, k*32, 16+i*16, 32+k*32]
|
dst_rect = [i*16, k*32, 16+i*16, 32+k*32]
|
||||||
self.inacfr.draw(cr, src_rect, dst_rect)
|
self.inacfr.draw(cr, src_rect, dst_rect)
|
||||||
cr.grestore()
|
cr.grestore()
|
||||||
|
for i in xrange(len(FRAMES)):
|
||||||
|
if FRAMES[i]:
|
||||||
|
try:
|
||||||
|
sounds = [i.obj for i in FRAMES[i].objs if isinstance(i.obj, Sound)]
|
||||||
|
[i.draw_frame(cr, None) for i in sounds]
|
||||||
|
except:
|
||||||
|
traceback.print_exc()
|
||||||
# print max(len(FRAMES),int(update_rect[0]/16-1)),int(update_rect[2]/16+1)
|
# print max(len(FRAMES),int(update_rect[0]/16-1)),int(update_rect[2]/16+1)
|
||||||
for i in xrange(max(len(FRAMES),int(update_rect[0]/16-1)),int(update_rect[2]/16+1)):
|
for i in xrange(max(len(FRAMES),int(update_rect[0]/16-1)),int(update_rect[2]/16+1)):
|
||||||
cr.newpath()
|
cr.newpath()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue