Poodletooth-iLand/panda/direct/leveleditor/AnimControlUI.py
2015-03-03 17:10:12 -05:00

936 lines
No EOL
43 KiB
Python

"""
This is the GUI for the Animation Control Panel
"""
from direct.interval.IntervalGlobal import *
from direct.actor.Actor import *
from panda3d.core import VBase3,VBase4
import ObjectGlobals as OG
import AnimGlobals as AG
import os,wx, time
from wx.lib.embeddedimage import PyEmbeddedImage
#----------------------------------------------------------------------
FirstFrame = PyEmbeddedImage(
"iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAAA3NCSVQICAjb4U/gAAACh0lE"
"QVRIie2Uz08aQRTHd368CZzYGGNjPWkTlB7EK0QSewSSamL9R+upXmpko/LLskgqhrDGyqb4"
"Y40CB3dnd6aHMYBIjSZe2vhOk/2+93nf93Z3UOvsTHvtwK9OfIP+f1CEEKUUITRWJYQQQl4A"
"RQgBpQihVqvV6/UwflBCCGGM3XY6tm33H9JhGWPMOR9xFwhhnZzs7e21bPvL+rqu60KIe3eU"
"3tzcVCqVQqHwYW5ubW0tCIIBlDFmmmbTsjLptBoEADjnjUajWCodHx/3er2JiQklqWEdxzGr"
"1R8HB7/bbU3TotHoqFOMcfv8vFarZdJpxpjruvV6vVAs1ut1z/MopQBACAEAAGi32xXTLJfL"
"l5eXGGMAUJ3Gj88Y45w3LSu/v9+0LNd1AYAxpmlaEASE0uvr659HR+Vy2XEcla9pmpRS0zQy"
"tOsBFCEkhPi2tZXP533fD4VCqqY/iue6Xzc3r66uGGPDUr98kNw/SSkJIclE4tPKiq7rnHNl"
"QYUQIhwOp5aXF+bnlfERKKUDf3RYkFJOTk5ms9n40lJuZ6d6eOh5HgDcu5AyFoslk8liqWQY"
"xsXFxcjnOQYqhPB9PwgCzvn76emNjY3FeNzI5ZrNpjKMCQmCAACSicR8NLqfz5dLpU63q9Dk"
"sVMhRCQSmZmZQQhJKTnnCKGPsdjc7KxpmoZhtGxbCIEwVr11Xc9mMvHFxZ1crlarqfzBfp++"
"+THGlNLbTmd3d/fX6enn1dV3U1O+7ysVAIQQjUbj+/Z2bGEhlUqpXT+AKpuP0WpxjuOEw+FQ"
"KDScgxACgG63e3d3F4lEnuV0uFi1HNtVXQjq99VG3v4T8Tecij7uvsczoS+KN+g/Av0D3hpG"
"5dYDHHkAAAAASUVORK5CYII=")
#----------------------------------------------------------------------
PreFrame = PyEmbeddedImage(
"iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAAA3NCSVQICAjb4U/gAAACQ0lE"
"QVRIieWVzW4aMRSFbV+DCHTDJlkAYZMKAek2fQHYddElu/SteA+eoNk0iPA7BBBQgtQJI6Gi"
"ZoQKM2PP2F24P2RmKFGVRauenSX707nH99r4XtfRc4s8O/G/ghKMMcaHoQAAAIdxhFBKGeeM"
"MR/XDxVCrFYr0zQP4hzH0TStVqvpuk4p3d3waAEA6/W6Wq2m0ul3l5cIISmlDwcAm81mPp83"
"m827+ZwCFAoFn9NHUEXZWpZt20F3GGPLsiaTidbvz2Yzx3EQQvFkkgSy8kPVeUJ+xQIACjcc"
"DjudziddZ4ypBIQQyshh6C4OIWSa5sfZrNVqGYZh2zal9GeCUkq19KUUDsUIUUpN0xwOh71e"
"b2EYnHNCSCQSCe5EgZYKgWKMGefvr64Gt7f3i4XnebvuQhQoP7z5CSG2ZX15ePA8T2W6D+i7"
"gL1OpZQUoFwuF4vFD9fXo9HI2m6B0lA0CZuU8KJUPelM5u3Jyavz80ajMZ1OXdf9vesDUOXX"
"c10gpFAsZk5PB4NBvV5fLpdCiF1rT70oH5ozFj86en1x8fLsrN1ud7vdz6sVAKgo1UPxpJby"
"SQghhEgmk6VSKZ/PN25u+pq2tSzFCsYRMqacc9d1g2jP8xBCqVTqzfFxsVCo1+vj8Zgx9n2u"
"9kGFEIlEolKpJOJxGeg+Jdd1CSG5XC6bzbbabcMwghOFfR8fxjgajQohOOfhWfyQyvTrZgOE"
"xGKxXW5I+er5OSghBEboRSIhpfyTi9oniZAMBIr+0o/vH4d+A5itKwKTfnzPAAAAAElFTkSu"
"QmCC")
#----------------------------------------------------------------------
PreKeyFrame = PyEmbeddedImage(
"iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAAA3NCSVQICAjb4U/gAAACPUlE"
"QVRIib3Vz0/aYBgH8OfHiyTGgAsciJMl6A5j7OLO4+48eHT/qjflSDPlRweNEqPGrTF2hQwW"
"gbR9nx2Yi9Ii1bE9x7b55Pu87/Ok+PXqChZdtHDxv6FEsLS0UJQZXVcdHIBSi0OJ0HXV4aHE"
"QJmZmGOgML99BCAipZTjOPVard/vE00jT2gTEYkIEV3XbZpms9HwfP/T3l4mk9FaPwdVSmmt"
"v7uuaZqmaV5fX2utX66tEbOIPC0pIjIzANi23basRqPR7XaDIGBmRAQACImPoZNmtda2bbda"
"raZpOo4zeaiUAgARYebwgUajiJhIJPzR6Jtt12u1k5OTG8f5Y90vVgrjoIQ4Ho/Pz87ax8df"
"TLM/GABAIpGIbkckVvtE9PP2dn9//8KyiFkp9fvsogoRI99Ohw+CIJ1K7e7ulsvllZWVIAim"
"xuVBIqVinakAIFE+n8/t7LwtlarVauf0dDgaRUeeMQDRt+95HiG+3tx8lc+32m2jWr24vASA"
"yfDPCj4HBQAR8X2fmd9vbW0UCs1m8/PRkXNzowH4buUnIxW+qTnDLyKe56VSqQ/l8pti0TCM"
"Rr3+o9+fuDwjeKw1DYIAAbKZzMft7WKxaBiGZVnD4XDWHcbdfZnQiBuFwvr6eqfTqVQqAhBe"
"/Blo1Hd3b8T3fSZ6Vyrlcrler7eUTIbzhlBEmLU/92jP816srqbTaREJh8UHv2hEGI9xMJBs"
"9pG8c+thUhFIJmV5GXz/2SJE/E5E/lKMQhdR/wT9BR51CSZZ1VE7AAAAAElFTkSuQmCC")
#----------------------------------------------------------------------
PrePlay = PyEmbeddedImage(
"iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAAA3NCSVQICAjb4U/gAAACV0lE"
"QVRIic2Vz1PaUBDHs5tkH9jROv4LDhUHrLXOlOml/p3+H/VYg6YJQz3UWkDDAJlob8J4AUxq"
"3tse4lBKEIV6cI9vdz7vuz/eW/h1daU9t+GzE18kFBERpxAWhAJAJpO5u7sbDodp7iJQIjIM"
"o16v7+/vtzsdk2giwJgLZxqGYZqXl5eWZf04O4ui6NPeHqTCngpFRCFEr9f76jjVarXf7wsh"
"hBBKqXTw41BEFETD21vbtstHR9fX10SUzWaZmZmllHNDiYiZz2q1Q8vyfV9HzGazIy9r2nxQ"
"0zR1XQ+CwLKsn7WaUkoQAUwWUEqpMT8O1XWdiLrdrm3b305OBoOBEMI0zSk3M7NSWuqmf6BJ"
"NwaDgeO69vFxt9dLyvdQNolSnqEUAKSU309PLcsKgkDX9dm4ETR9aIyIiFgulz8fHEgpl5eX"
"ETEtYdyS+iYjBZo2HnoPZWal1IdS6fXqarVaDYKAmWlaZyYsTpQCjLfrb/rM/Gpp6WOp9G57"
"u1GvO67rBwErNQP9pDlVSt2Goa7r73d3C8Vio9GoVCrtTkc9gAYAfuKLklJKKRFxZ2enUChc"
"eJ7rOK12W0ppEuEYmpnlXM9UKRWGISK+3drazOc9z6tUKl6z+TuOiWj03ck4ngM6jgaAYrG4"
"sbHRarVc1/WazTAMiUjTNKnUrDmdYcycqN7M59/kcu1Ox3Hd8/PzMAzjOF7867tXHUUAkMvl"
"1tfXfd//cniIACqlFBZb0QBARHEc39zcrKysTHgX3FHMHEWRUmptbS3t/a9tyszxtO6/vL3/"
"kP0BhtFQnDqk9wIAAAAASUVORK5CYII=")
#----------------------------------------------------------------------
Play = PyEmbeddedImage(
"iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAAA3NCSVQICAjb4U/gAAACTUlE"
"QVRIidXWzU7bQBAH8JmxLW8SbglXLCchTsKFElEUu4aaHnhSnoInoBeEihoSwodEz5wKya67"
"Oz24UAiOgQhV6p5sy/r5v7OztvHH9TW896B3F/8hats2Ir4zenNzQ0Su6y5M249PENG27YOD"
"g5+3t192d33fJyKlFDMvjgIAIRrmo6Oj8/PzTqcThWGjXrcsS6WpMWZBlAFs2xZCAMDx8fFg"
"MAharTAMm82mEEJK+ZrUsygiWkQAQERCCGPMt5OTwelp0Gr1+/0gCBzHUUoVp55FAcCy/178"
"QzN/HwyGo1Gz0QijqB0EQogCOg8lmll3QnRdl5mHo9HZeNyo1/v9frfbFUKkaaq1fhlFotzC"
"4T19Nh6PLy58z4vCsLu2VhJCPk2dl9SyCjr0gb64vLy8uvI8b2trKwiCcqn0EOVp8zMDgG1Z"
"88THtBDCcZzhcLi/v//18JAeFe1J0uxBRAQAzFy8o5RSWuvV1dUkSYJWyxjzkDR/+sUxtdZK"
"qVq1Gm9vf9zcrFQqUsqimiJiAWqMkVJWKpUoDOM4rtVqSqnJZDJz27OkzEgEzybOzEopIvqw"
"vp4kied5Wuvn3Bw0L2maptoY3/d3k6Tb6SDidDqdN5s8NGup++OsfMvLy593dnq9XrlUki/t"
"0fkoIjNPp9OlpaU4jj9FUbValVJOCgMWoUQkpXRdt7exkSTJysrKrzSdV75XoQyAiHXf39vb"
"a7fbiPgmLhs484kmoru7O8dxsu576zs/P6kxplwuA0Dx+r4NzdyFuWz8Pz8TvwFpng4ClVur"
"2QAAAABJRU5ErkJggg==")
#----------------------------------------------------------------------
NextKeyFrame = PyEmbeddedImage(
"iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAAA3NCSVQICAjb4U/gAAACNUlE"
"QVRIic2Vy27aQBSGj+3xBQNRlSJlQWhwSKPUSMkQmcu+Sl8zW56AVfMCTQgLVEQSbxCELhFi"
"wcUzc7qwihQ8NiTNImdny/P5/89tlNFwCO8d6rsTPyAUEXQdCAHE7VBFUXaCmqZ2d6c9PIBh"
"bIEi4nK5VFVVVbeYQMMg9/fq4yNGoGRDI2Os2+0yziuVim3bnDGMuFv/P87+JhQBRs/PnU7H"
"9/1Go+E4jqHrnPNYtCzIxrMCYOg6IPZ6vcFgUHbdWr1+mM8DAOf8jdC1ZELIYrH4dXv75PtV"
"z6OUfs7lBOdCiFdDETFgLLQalms6nf68ufnd63med3F+nk6nhRDJaEn18eUBTdNUVR2Px61W"
"q9ls9vt9xhghJKHzJDmNRpgNRHzy/eFo5LpurVr9Ui4rMW0XsQ8QZy1Er1ardrvt+75bq32f"
"TD4dHES/lNgPGJNC12wAmM/nf8bj2WwmFSuvvjTC+pim+bVUopSeXl5mr6+5TMFO0DXupFSi"
"lJaOj9OZDLMsBUA6ErKWWq3g31oRQnDObdt2HKdRrxcKBdu2OedBEERHPklpOJGhumwmUzo5"
"oZQWj44syxJCBEGw1ZkEyjhnjNm2/e3s7ILSYrFo6LoQgiUXMBmaSqUqlHrV6mE+b1kWY2x3"
"nASKiLqu/7i6yu7tWaYZ5i7pNGJ070mgmqblcrldzRICmhZ9rbz9ilZVZTIBQjCbhZdD+Irm"
"3wwhcH8fECEy1v8BBYCYtf3R7v34+AuNHRpDa7trrwAAAABJRU5ErkJggg==")
#----------------------------------------------------------------------
NextFrame = PyEmbeddedImage(
"iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAAA3NCSVQICAjb4U/gAAACOUlE"
"QVRIidWVS2/aQBSFZ8ZjYxkTFmSBRFAgpk1CJTIgE/orq/wMJFbNAjbNLqsgxAKVh+INgrhL"
"HkK8PI8urCKCx01bsWju+vrTuef6noHj0Qgcu9DRie8dCiE8MlQIsdlsEEIIvT0EQkhV1WAn"
"PtBIKe10OpSxYrFoGAajVAghJUIIF4vFdDqNx+OxWIxzLlcKIRQAjF9eGo1GrVYbDAaMc4yx"
"1BBN03q93pe7u3a7HdG0UKUAAAiApqpAiG63OxwOP+Xzt5XKWSoFAGCMHTRzzj3P29coh+4k"
"Y4zX6/VTs/nsOGXbJoQkTk85Y/sICCFCKDjHIVQI4VHqu+ivazabfXt4+N7t2rZ9UyhEo1HO"
"eVDdfkm2L15/oCgKQsh13Xq9Xq1W+/0+pTTMaLlSaaPvhhDi2XFG43E+n78tlz9eXob9doHx"
"AQgbzUdvt9tWq+U4TqlUAkJIuXJPpdAdGwCwWq1+uK5pmkhmgnz70vL3E4lEPlgWIaRQKDw1"
"m/Tx8R+hO1zOsggh1sVF1DQxxmGbko2/3YJfscI5Z4wZhpHNZj9XKul02jAMxpjneb8JB4lS"
"/9h9dTHTtHI5Qkjm/FzXdf+Egs1vQyljlFLDMK6vrm4IyWQymqpyzmlggUIIznmQC/ffKITQ"
"crn8en+PFcUul89SKV3XaUhQIYQmk4nruslkMpFIvDrffagfffP5PHZyokcijLGw3NtxMcaM"
"sYOsgcHXVFEU6VB/XhJPgxH3t/WuX9P/FPoTFHYunoRw1IsAAAAASUVORK5CYII=")
#----------------------------------------------------------------------
LastFrame = PyEmbeddedImage(
"iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAAA3NCSVQICAjb4U/gAAAClElE"
"QVRIie2VT0sbQRjG950/Gw8mW4QgCWxaMSdjwkq60YDmYD+A/QBiP5keq2IuHuKxxUNFqoI2"
"UuOlInahHpYkHhLdmXmnh5VNiLFS8CL4nhZm3t/zzvMsM/D76sp47iLPTnyFvkQoABDyqAYh"
"BAD+DwoA3W632WwyxiilA5u01r7vCyE454+B+iXvoZTSVru9Va1++fq10+2aphltAgAA+H5w"
"sL6xcXl5yRhjjD2Eaq0HoWHzzc1NrVZbXV09OjoytOacR2iNeHp6ura2tr297ft+LBaLvOKc"
"Hx4efl5fD+UNw+hpIiIhhHPued5WtXpycjI/P5+dnARChBBaa9M0AyG+7e01zs/nZmeLxWIi"
"kZBSEkJarZbneRGqB9WIiAgAjDGt9c+zs18XF47jVBYWkskkIhqGQQgxTbPZatV2dn7U65VK"
"JTc1xTkf8GSIO6EVpmlKKff39xuNhuu6t7e3kRWMUoNSz/M2Nzez2eyHxUWlVH9QLKIopcJx"
"en4TwhjzfX93d/eNZVFK+9NgjAkh6vX63d2dlUjQvt+x96W17u9BxCAIGGMzMzPLy8uZTEZK"
"Ga1KKYUQ4+PjH5eWPq2sJJNJqdSQ4yOi1toAQEQp5cjISCGfL5VK7yYmCMDx8XEoHKLTqZTr"
"uvl83rIsxphSKgiCYVCtpZQiCOLxuOM4ruu+zWQopUqpQIhwNM65bdvvi8VcLmdZllQqCAJE"
"TKVS07ncEKhSKmaaJdedK5cztg0AIQgAtNaolG3b5XI5Pz09OjoqhIhGk1IWCgXHcYQQ9wmF"
"zwkhpN1udzqddDodhjbg75/r67GxsUQ8LqUcyPNhQfRGEUIIIQO43okYQ8QncQ88/WdPf/RP"
"1ku8pF+hz1V/AVdHWFTfbzsRAAAAAElFTkSuQmCC")
#----------------------------------------------------------------------
Key = PyEmbeddedImage(
"iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAAA3NCSVQICAjb4U/gAAACl0lE"
"QVRIie2Uv0sbYRjH3x+X9/JGk9wlYkg6icbJMf0LHCxo/QuKUCfR0TFqB/dKHSztYKHBYHCp"
"kIIFqZM6ODho3Y2tQ44EMRffu3tz79vhlcNGC5I4+h2/L3yen+8Df19cgKcWenLiM7RbKITw"
"vql1g6OUAikhQowxIUTw1GGmEEKdkEKh8GZq6v3KCgAAY9wttKen58Pqan5hwTCMcrm8sLhI"
"COkKSgg5Ozv79PlzcWPjy/r6j50du9HY3d2llHYO1XV9s1R6NTY2OjpqWRbGeG5u7uDwMGjr"
"LRRCiB4tz/N+nZ6OT0y4rgsAcBwnm82GNK1WqyGEQDB9IYTv+wAAhBDGmHOuaZqUUpl3hRBq"
"NBp2szk0OOh5HgBASkkpTSSTVcsyTVMIoakeHR8fb5ZKGsYN2242m5l0ulqtYozNROLurqia"
"GGPX19eGYUgplSmljEQiruOotdUAAJzz4eHh+fl5Sun3cvnn3t7y8nI+n0/29c3MzDRtuz1T"
"256dnXUcJxKJBJG45yGEVBhNxSGE6LpOKTUMIxqNJpPJWCwWi8USpklCoTZoPB4nhPy5vOzv"
"71f98X2/Vq8bhqHKQkH+QgghBOfccRwhhOu6nucFfiDf9ymlqVTqYH8/HA4DADDGlmVdXV2l"
"Uql/oEq+72cymZe5HGNsZGQkOzTEOW8blCpwYnz8a6FQr9ej0ahpmltbWy8ymd7eXvUK2y4/"
"xhhj7LouIURKyTm/fzIQQhDC15OTmqa9W1o6Ojr6tr1dLBaNeLzVaj0AfaR0Xa9UKm+np09O"
"TgYGBj6ureVyOcbY7dw6g0opw+Fw8+amcn6eTqdN02SMBTV1CFVCCIVCoVar1fZHOr+nAAC1"
"JA8E6wb6Pz1Dn15/AQsQSZkYzgBNAAAAAElFTkSuQmCC")
#----------------------------------------------------------------------
Stop = PyEmbeddedImage(
"iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAAA3NCSVQICAjb4U/gAAAAvklE"
"QVRIie3VMQ6DMAwF0G9CEUxMzAwch4NwCEbuxyXoygiBkMQd2KoUM7Cg4tFSnixZ/qH3MODq"
"ii4XHzQO9IiQpvJTIlgLY06gRFgW3/dwDkRHqHMoiqiq4L2ExjGPo+k6TBOUOkK1VnUdtS2M"
"AfMhug+bZfBeQAEkSbB9n+0/6IPeAQ2dKTO0htbi7QcjKoQ6hzx/NQ22TUgpa6ksYe1XmgCg"
"wMe3B4pYe56u64lJATBjnmX0d91n+3+OfgDGM0GplgNFhQAAAABJRU5ErkJggg==")
#----------------------------------------------------------------------
DeleteKey = PyEmbeddedImage(
"iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAAA3NCSVQICAjb4U/gAAAEXUlE"
"QVRIibWWX0hUWRzHf+ece4/3TjPjvTMOrqM+lH9KmQhEszCC2OifLRRF+LKwb8X66Eug0UOP"
"Cz22+7JIGwxmEGmTWUahkhapLQSbwQZFm6iDOubM3DPn3nvOPozT6jhKQft7u/f+zuf3O7/v"
"+f3ORf98+ADf2vA3JxaC4q8Mg9DGJeufpUSWBYryxSlhcBy0spLHXQ9VFOXxY/z2LWjal+Qo"
"CaGxGI7HgZDNoQDOwYPqyAianQVV3ZopNY0+eCBDIXfXLrDtzaGuK02THztGYzFIp/PiryPq"
"Oh0f34ax0tq6jRC81fYBgHNRWens30/v3AEorJvUNPXNG/39+98TiR/b2q5evQoAZE0GBdYg"
"xpxIRFRV0f5+qaqA0LrPqorn5oqnpn55966zq8vw+WL37nVdukQp3QoKAMiy7JYW6fHQoSG5"
"VjRCgDHfw4d/VlT81tMTvX69u7v7weBgcmXl0aNHuq5vBc3my48eRcvLyvPnMuuNEGBM+/pw"
"S0t0bOz4oUPfHz4cj8cJIe3t7WPj40KIdVCEEM4zhLAQzqlT6vS0Oj0Nug6aVjQ4iCoqUvX1"
"f01Otp48mclkAIAxVlNToyrKwsJCVrFVqBCCc845dxxHSsk5F0II2+aOk2xtxcPD7uwsfvbM"
"tizrwIHEx4/JVKq6qopzDgBSSk3TAsHgfDyelUsBAErpy5cve27eVAhZSSZTqVS4rGx+fp4Q"
"YgYCLsZFyeQPg4NzlD7dvh2mpqx0+tOnT4ZhSClXz4OUHo8nwxhCaBVq23ZtbW1HR4eu6/di"
"scdPnly5cqWzszNYUnLh/Pkk57C0FIhGeSjUdOYMwXhlefnn9nbGmMfj+Vw9m3OMcTYMzsah"
"lAZMM2CahmH4fL5gMOj3+/1+fyAUCup6eHQULlzQmpu/GxkxQqGKykpK6ceZGSU3JVzXXVhc"
"NAwjqxX+nL8Q2TLajDEhRCaT4bYtAZTbtzMNDSIUshsaXK8XDwxohlFaWjr29KmmaQBACInH"
"44lEorS0dB30c8BwONzU2GhZViQSqY5E0N27orzc2bMHGEOM8SNHUCqljI+3nj37x40bi4uL"
"Pp/PNM1bt26Vh8Nerze7fZQ3+QkhhJBMJkOLi8noqDszw0+fRozlegUDgNbbK5qaTly8qNj2"
"5cuXX7x4caevLxqNGsXFjuMUgK5Wo6hIef1amZxkbW1ICMipvNpUluXv6/u7vv6nrq5XExPb"
"d+z49dq1xsZGy7JWdSsAVVU0N0cHBjLnzoGug+sWcJif9w4NJU6ceL+0VFZSYpqmZVkoNyU2"
"tCkhkE7T+/f58ePS6y1ABADbFmVlqX37vAMDddXVXr+f5U5oIShCAED7+53mZlFejjgvQMw6"
"Mubu3GnX1cneXjfX8ptAVVUdHhaVlc7u3f+JsxnXsuy9e2VJiTIxAWvmHuTXFCG0vCwNAzYE"
"39QwRum01PW1Yubfpl9HBAAh8ogboABfR8ylkvfif/lD+Rcv7QbV/D7nwgAAAABJRU5ErkJg"
"gg==")
class TimeSlider(wx.Window):
"""
This is the Time Slider Panel.
"""
def __init__(self, parent, slidersize, sliderStartFrame, sliderEndFrame, curFrame):
wx.Window.__init__(self, parent, size = slidersize, style = wx.SUNKEN_BORDER)
self._mainDialog = wx.GetTopLevelParent(self)
self._mouseIn = False
self.points = []
self.numbers = []
self.curFrame = curFrame
self.sliderStartFrame = sliderStartFrame
self.sliderEndFrame = sliderEndFrame
self.frameNum = self.sliderEndFrame-self.sliderStartFrame+1
self.InitBuffer()
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Bind(wx.EVT_SIZE, self.OnSize)
self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
self.Bind(wx.EVT_MOTION, self.OnMotion)
def InitBuffer(self):
self.w,self.h = self.GetClientSize()
self.buffer = wx.EmptyBitmap(self.w, self.h)
dc = wx.BufferedDC(wx.ClientDC(self), self.buffer)
self.DrawTimeSlider(dc)
self.DrawNumber(dc)
self.DrawFrame(dc)
self.DrawKeys(dc)
def SetTimeSliderData(self, sliderStartFrame = 1, sliderEndFrame = 24, curFrame = 0):
self.curFrame = curFrame
self.sliderStartFrame = sliderStartFrame
self.sliderEndFrame = sliderEndFrame
self.frameNum = self.sliderEndFrame-self.sliderStartFrame+1
self.points = []
self.numbers = []
self.InitBuffer()
self.Refresh()
def OnPaint(self, evt):
dc = wx.BufferedPaintDC(self, self.buffer)
def DrawTimeSlider(self,dc):
dc.SetBackground(wx.Brush(self.GetBackgroundColour()))
dc.Clear()
dc.SetPen(wx.BLACK_PEN)
dc.SetBrush(wx.BLACK_BRUSH)
dc.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.NORMAL))
self.unitWidth = self.w/float(self.frameNum)
if self.frameNum <= 20:
self.points.append(((float(0),self.h),(float(0),self.h-15)))
for i in range(1,self.frameNum):
temp = self.points[i-1][0][0]+self.unitWidth
self.points.append(((temp,self.h),(temp,self.h-15)))
for i in range(self.frameNum):
self.numbers.append(self.sliderStartFrame+i)
for i in range(self.frameNum):
dc.DrawLine(self.points[i][0][0], self.points[i][0][1], self.points[i][1][0], self.points[i][1][1])
st = str(self.numbers[i])
tw,th = dc.GetTextExtent(st)
dc.DrawText(st, self.points[i][0][0]+2, 0.5)
elif self.frameNum <= 70:
self.points.append(((self.unitWidth,self.h),(self.unitWidth,self.h-15)))
for i in range(1,int((self.frameNum+1)/2)):
temp = self.points[i-1][0][0]+2*self.unitWidth
self.points.append(((temp,self.h),(temp,self.h-15)))
for i in range(1,self.frameNum/2+1):
self.numbers.append(self.sliderStartFrame-1+i*2)
for i in range(int((self.frameNum+1)/2)):
dc.DrawLine(self.points[i][0][0], self.points[i][0][1], self.points[i][1][0], self.points[i][1][1])
for i in range(self.frameNum/2):
st = str(self.numbers[i])
tw,th = dc.GetTextExtent(st)
dc.DrawText(st, self.points[i][0][0]+2, 0.5)
elif self.frameNum <= 150:
self.points.append(((self.unitWidth*4.0,self.h),(self.unitWidth*4.0,self.h-15)))
for i in range(1,int(self.frameNum/5)):
temp = self.points[i-1][0][0]+5*self.unitWidth
self.points.append(((temp,self.h),(temp,self.h-15)))
for i in range(1,self.frameNum/5+1):
self.numbers.append(self.sliderStartFrame-1+i*5)
for i in range(int(self.frameNum/5)):
dc.DrawLine(self.points[i][0][0], self.points[i][0][1], self.points[i][1][0], self.points[i][1][1])
for i in range(self.frameNum/5):
st = str(self.numbers[i])
tw,th = dc.GetTextExtent(st)
dc.DrawText(st, self.points[i][0][0]+2, 0.5)
elif self.frameNum <= 250:
self.points.append(((self.unitWidth*9.0,self.h),(self.unitWidth*9.0,self.h-15)))
for i in range(1,int(self.frameNum/10)):
temp = self.points[i-1][0][0]+10*self.unitWidth
self.points.append(((temp,self.h),(temp,self.h-15)))
for i in range(1,self.frameNum/10+1):
self.numbers.append(self.sliderStartFrame+i*10)
for i in range(int(self.frameNum/10)):
dc.DrawLine(self.points[i][0][0], self.points[i][0][1], self.points[i][1][0], self.points[i][1][1])
for i in range(self.frameNum/10):
st = str(self.numbers[i])
tw,th = dc.GetTextExtent(st)
dc.DrawText(st, self.points[i][0][0]+2, 0.5)
elif self.frameNum <= 1000:
self.points.append(((self.unitWidth*49.0,self.h),(self.unitWidth*49.0,self.h-15)))
for i in range(1,int(self.frameNum/50)):
temp = self.points[i-1][0][0]+50*self.unitWidth
self.points.append(((temp,self.h),(temp,self.h-15)))
for i in range(1,self.frameNum/50+1):
self.numbers.append(self.sliderStartFrame-1+i*50)
for i in range(int(self.frameNum/50)):
dc.DrawLine(self.points[i][0][0], self.points[i][0][1], self.points[i][1][0], self.points[i][1][1])
for i in range(self.frameNum/50):
st = str(self.numbers[i])
tw,th = dc.GetTextExtent(st)
dc.DrawText(st, self.points[i][0][0]+2, 0.5)
elif self.frameNum <= 2000:
self.points.append(((self.unitWidth*99.0,self.h),(self.unitWidth*99.0,self.h-15)))
for i in range(1,int(self.frameNum/100)):
temp = self.points[i-1][0][0]+100*self.unitWidth
self.points.append(((temp,self.h),(temp,self.h-15)))
for i in range(1,self.frameNum/100+1):
self.numbers.append(self.sliderStartFrame-1+i*100)
for i in range(int(self.frameNum/100)):
dc.DrawLine(self.points[i][0][0], self.points[i][0][1], self.points[i][1][0], self.points[i][1][1])
for i in range(self.frameNum/100):
st = str(self.numbers[i])
tw,th = dc.GetTextExtent(st)
dc.DrawText(st, self.points[i][0][0]+2, 0.5)
elif self.frameNum <= 10000:
self.points.append(((self.unitWidth*999.0,self.h),(self.unitWidth*999.0,self.h-15)))
for i in range(1,int(self.frameNum/1000)):
temp = self.points[i-1][0][0]+1000*self.unitWidth
self.points.append(((temp,self.h),(temp,self.h-15)))
for i in range(1,self.frameNum/1000+1):
self.numbers.append(self.sliderStartFrame-1+i*1000)
for i in range(int(self.frameNum/1000)):
dc.DrawLine(self.points[i][0][0], self.points[i][0][1], self.points[i][1][0], self.points[i][1][1])
for i in range(self.frameNum/1000):
st = str(self.numbers[i])
tw,th = dc.GetTextExtent(st)
dc.DrawText(st, self.points[i][0][0]+2, 0.5)
else:
pass
def DrawNumber(self, dc):
dc.SetPen(wx.BLACK_PEN)
dc.SetBrush(wx.BLACK_BRUSH)
dc.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.NORMAL))
i = self.curFrame-self.sliderStartFrame
st = str(self.curFrame)
tw,th = dc.GetTextExtent(st)
dc.DrawText(st, float(self.unitWidth)*float(i)+2, self.h-th-0.5)
def DrawFrame(self, dc):
i = self.curFrame-self.sliderStartFrame
pos = float(self.unitWidth)*float(i)
self.curRect = wx.Rect(pos, float(0), self.unitWidth, self.h)
oldPen, oldBrush, oldMode = dc.GetPen(), dc.GetBrush(), dc.GetLogicalFunction()
gray = wx.Colour(200, 200, 200)
grayPen = wx.Pen(gray)
grayBrush = wx.Brush(gray)
dc.SetPen(grayPen)
dc.SetBrush(grayBrush)
dc.SetLogicalFunction(wx.XOR)
dc.DrawRectangleRect(self.curRect)
dc.SetPen(oldPen)
dc.SetBrush(oldBrush)
dc.SetLogicalFunction(oldMode)
def DrawKeys(self, dc):
if len(self._mainDialog.keys) != 0:
for key in self._mainDialog.keys:
keyFrame = key
i = keyFrame-self.sliderStartFrame
pos = float(self.unitWidth)*float(i)
oldPen, oldBrush, oldMode = dc.GetPen(), dc.GetBrush(), dc.GetLogicalFunction()
dc.SetPen(wx.Pen("red"))
dc.SetBrush(wx.Brush("red"))
dc.SetLogicalFunction(wx.AND)
dc.DrawLine(pos, float(0), pos, self.h)
dc.SetPen(oldPen)
dc.SetBrush(oldBrush)
dc.SetLogicalFunction(oldMode)
else:
pass
def OnSize(self,evt):
self.InitBuffer()
def OnLeftDown(self,evt):
point = (evt.GetX(), evt.GetY())
if point[1]>= float(0) and point[1]<= (float(self.h)-2.0):
if point[0]>= float(0) and point[0]<= float(self.w):
self._mouseIn = True
if self._mouseIn:
self.CaptureMouse()
self.curFrame = int(float(point[0])/self.unitWidth)+self.sliderStartFrame
self._mainDialog.curFrame = self.curFrame
self._mainDialog.curFrameSpin.SetValue(self.curFrame)
self._mainDialog.OnAnimation(self.curFrame)
self.SetTimeSliderData(self.sliderStartFrame, self.sliderEndFrame, self.curFrame)
def OnLeftUp(self,evt):
if self.GetCapture():
self.ReleaseMouse()
self._mouseIn = False
def OnMotion(self,evt):
self._mouseIn = False
if evt.Dragging() and evt.LeftIsDown():
point = (evt.GetX(), evt.GetY())
if point[1]>= float(0) and point[1]<= (float(self.h)-2.0):
if point[0]>= float(0) and point[0]<= float(self.w):
self._mouseIn = True
if self._mouseIn:
self.curFrame = int(float(point[0])/self.unitWidth)+self.sliderStartFrame
self._mainDialog.curFrame = self.curFrame
self._mainDialog.curFrameSpin.SetValue(self.curFrame)
self._mainDialog.OnAnimation(self.curFrame)
self.SetTimeSliderData(self.sliderStartFrame, self.sliderEndFrame, self.curFrame)
evt.Skip()
self._mouseIn = False
class TimeRange(wx.Window):
"""
This is the Time Range Panel.
"""
def __init__(self, parent, rangesize, startFrame, endFrame, sliderStartFrame, sliderEndFrame):
wx.Window.__init__(self, parent, size = rangesize, style = wx.SUNKEN_BORDER)
self._mainDialog = wx.GetTopLevelParent(self)
self._mouseIn = False
self.startFrame = startFrame
self.endFrame = endFrame
self.sliderStartFrame = sliderStartFrame
self.sliderEndFrame = sliderEndFrame
self.frameNum = self.endFrame-self.startFrame+1
self.InitBuffer()
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Bind(wx.EVT_SIZE, self.OnSize)
self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
self.Bind(wx.EVT_MOTION, self.OnMotion)
def InitBuffer(self):
self.w,self.h = self.GetClientSize()
self.buffer = wx.EmptyBitmap(self.w, self.h)
dc = wx.BufferedDC(wx.ClientDC(self), self.buffer)
self.DrawTimeRange(dc)
def SetTimeRangeData(self, startFrame = 1, endFrame = 24, sliderStartFrame = 1, sliderEndFrame = 24):
self.startFrame = startFrame
self.endFrame = endFrame
self.sliderStartFrame = sliderStartFrame
self.sliderEndFrame = sliderEndFrame
self.frameNum = self.endFrame-self.startFrame+1
self.InitBuffer()
self.Refresh()
def OnPaint(self, evt):
dc = wx.BufferedPaintDC(self, self.buffer)
def DrawTimeRange(self,dc):
dc.SetBackground(wx.Brush(wx.Colour(150, 150, 150)))
dc.Clear()
dc.SetPen(wx.Pen(self.GetBackgroundColour()))
dc.SetBrush(wx.Brush(self.GetBackgroundColour()))
self.unitWidth = (self.w-6.0)/float(self.frameNum)
self.rangePosX = 3.0+(float(self.sliderStartFrame-self.startFrame))*self.unitWidth
self.rangePosY = 2.0
self.rangeWidth = float(self.sliderEndFrame-self.sliderStartFrame+1)*self.unitWidth
self.rangeHeight = self.h-4.0
self.curRect = wx.Rect(self.rangePosX, self.rangePosY, self.rangeWidth, self.rangeHeight)
dc.DrawRoundedRectangleRect(self.curRect, radius = 2)
def OnSize(self,evt):
self.InitBuffer()
def OnLeftDown(self,evt):
point = (evt.GetX(), evt.GetY())
self.pos = 0
if point[1]>= self.rangePosY and point[1]<= self.rangePosY+self.rangeHeight:
if point[0]>= self.rangePosX and point[0]<= self.rangePosX+self.rangeWidth:
self._mouseIn = True
if self._mouseIn:
self.CaptureMouse()
self.pos = point
def OnLeftUp(self,evt):
if self.GetCapture():
self.ReleaseMouse()
self._mouseIn = False
def OnMotion(self,evt):
self._mouseIn = False
if evt.Dragging() and evt.LeftIsDown():
newPos = (evt.GetX(), evt.GetY())
if newPos[1]>= self.rangePosY and newPos[1]<= self.rangePosY+self.rangeHeight:
if newPos[0]>= self.rangePosX and newPos[0]<= self.rangePosX+self.rangeWidth:
self._mouseIn = True
if self._mouseIn:
if newPos[0] == self.pos[0]:
evt.Skip()
self._mouseIn = False
if newPos[0] > self.pos[0]:
if float(newPos[0]-self.pos[0]) >= self.unitWidth:
if self.sliderEndFrame < self.endFrame:
self.sliderStartFrame += 1
self.sliderEndFrame += 1
self.SetTimeRangeData(self.startFrame, self.endFrame, self.sliderStartFrame, self.sliderEndFrame)
self.MainPanelUpdate()
self.pos = newPos
evt.Skip()
self._mouseIn = False
if newPos[0] < self.pos[0]:
if float(self.pos[0]-newPos[0]) >= self.unitWidth:
if self.sliderStartFrame > self.startFrame:
self.sliderStartFrame -=1
self.sliderEndFrame -=1
self.SetTimeRangeData(self.startFrame, self.endFrame, self.sliderStartFrame, self.sliderEndFrame)
self.MainPanelUpdate()
self.pos = newPos
evt.Skip()
self._mouseIn = False
evt.Skip()
self._mouseIn = False
def MainPanelUpdate(self):
self._mainDialog.sliderStartFrame = self.sliderStartFrame
self._mainDialog.sliderEndFrame = self.sliderEndFrame
self._mainDialog.timeSliderStartSpin.SetValue(self.sliderStartFrame)
self._mainDialog.timeSliderEndSpin.SetValue(self.sliderEndFrame)
self._mainDialog.timeSlider.SetTimeSliderData(self._mainDialog.sliderStartFrame, self._mainDialog.sliderEndFrame, self._mainDialog.curFrame)
class AnimControlUI(wx.Dialog):
"""
This is the Animation Control main class implementation.
"""
def __init__(self, parent, editor):
wx.Dialog.__init__(self, parent, id=wx.ID_ANY, title="Animation Controller",
pos=wx.DefaultPosition, size=(920, 110))
self.editor = editor
self._initOver = False
self.parallel = []
if self.editor.animMgr.keyFramesInfo != []:
self.editor.animMgr.generateKeyFrames()
self.keys = self.editor.animMgr.keyFrames
self.editor.objectMgr.findActors(render)
self.editor.objectMgr.findNodes(render)
self.prePlay = False
self.play = False
self.stop = True
self.curFrame = 1
self.startFrame = 1
self.sliderStartFrame = 1
self.endFrame = 24
self.sliderEndFrame = 24
self.mainPanel1 = wx.Panel(self, -1)
self.timeSlider = TimeSlider(self.mainPanel1, wx.Size(560, 35), self.sliderStartFrame, self.sliderEndFrame, self.curFrame)
self.curFrameSpin = wx.SpinCtrl(self.mainPanel1, -1, "",size = (70,25),min=self.startFrame, max=self.endFrame)
bmpFirstFrame = FirstFrame.GetBitmap()
bmpPreFrame = PreFrame.GetBitmap()
bmpPreKeyFrame = PreKeyFrame.GetBitmap()
self.bmpPrePlay = PrePlay.GetBitmap()
self.bmpPlay = Play.GetBitmap()
bmpNextKeyFrame = NextKeyFrame.GetBitmap()
bmpNextFrame = NextFrame.GetBitmap()
bmpLastFrame = LastFrame.GetBitmap()
bmpKey = Key.GetBitmap()
self.bmpStop = Stop.GetBitmap()
bmpDeleteKey = DeleteKey.GetBitmap()
self.buttonFirstFrame = wx.BitmapButton(self.mainPanel1, -1, bmpFirstFrame, size = (30,30),style = wx.BU_AUTODRAW)
self.buttonPreFrame = wx.BitmapButton(self.mainPanel1, -1, bmpPreFrame, size = (30,30),style = wx.BU_AUTODRAW)
self.buttonPreKeyFrame = wx.BitmapButton(self.mainPanel1, -1, bmpPreKeyFrame, size = (30,30),style = wx.BU_AUTODRAW)
self.buttonPrePlay = wx.BitmapButton(self.mainPanel1, -1, self.bmpPrePlay, size = (30,30),style = wx.BU_AUTODRAW)
self.buttonPlay = wx.BitmapButton(self.mainPanel1, -1, self.bmpPlay, size = (30,30),style = wx.BU_AUTODRAW)
self.buttonNextKeyFrame = wx.BitmapButton(self.mainPanel1, -1, bmpNextKeyFrame, size = (30,30),style = wx.BU_AUTODRAW)
self.buttonNextFrame = wx.BitmapButton(self.mainPanel1, -1, bmpNextFrame, size = (30,30),style = wx.BU_AUTODRAW)
self.buttonLastFrame = wx.BitmapButton(self.mainPanel1, -1, bmpLastFrame, size = (30,30),style = wx.BU_AUTODRAW)
self.mainPanel2 = wx.Panel(self, -1)
self.timeStartSpin = wx.SpinCtrl(self.mainPanel2, -1, "",size = (70,25),min=0, max=self.sliderEndFrame)
self.timeSliderStartSpin = wx.SpinCtrl(self.mainPanel2, -1, "",size = (70,25),min=self.startFrame, max=self.sliderEndFrame)
self.timeRange = TimeRange(self.mainPanel2, wx.Size(450, 25), self.startFrame, self.endFrame, self.sliderStartFrame, self.sliderEndFrame)
self.timeSliderEndSpin = wx.SpinCtrl(self.mainPanel2, -1, "",size = (70,25),min=self.sliderStartFrame, max=self.endFrame)
self.timeEndSpin = wx.SpinCtrl(self.mainPanel2, -1, "",size = (70,25),min=self.sliderStartFrame, max=10000)
self.buttonDeleteKey = wx.BitmapButton(self.mainPanel2, -1, bmpDeleteKey, size = (30,30),style = wx.BU_AUTODRAW)
self.SetProperties()
self.DoLayout()
self.Bind(wx.EVT_SPINCTRL, self.OnCurrentTime, self.curFrameSpin)
self.Bind(wx.EVT_BUTTON, self.OnFirstFrame, self.buttonFirstFrame)
self.Bind(wx.EVT_BUTTON, self.OnPreFrame, self.buttonPreFrame)
self.Bind(wx.EVT_BUTTON, self.OnPreKeyFrame, self.buttonPreKeyFrame)
self.Bind(wx.EVT_BUTTON, self.OnPrePlay, self.buttonPrePlay)
self.Bind(wx.EVT_BUTTON, self.OnPlay, self.buttonPlay)
self.Bind(wx.EVT_BUTTON, self.OnNextKeyFrame, self.buttonNextKeyFrame)
self.Bind(wx.EVT_BUTTON, self.OnNextFrame, self.buttonNextFrame)
self.Bind(wx.EVT_BUTTON, self.OnLastFrame, self.buttonLastFrame)
self.Bind(wx.EVT_SPINCTRL, self.OnTimeStartSpin, self.timeStartSpin)
self.Bind(wx.EVT_SPINCTRL, self.OnTimeSliderStartSpin, self.timeSliderStartSpin)
self.Bind(wx.EVT_SPINCTRL, self.OnTimeSliderEndSpin, self.timeSliderEndSpin)
self.Bind(wx.EVT_SPINCTRL, self.OnTimeEndSpin, self.timeEndSpin)
self.Bind(wx.EVT_BUTTON, self.OnDeleteKey, self.buttonDeleteKey)
self.Bind(wx.EVT_CLOSE, self.OnExit)
self.OnPropKey()
self.OnAnimation(self.curFrame)
self.timeUnit = float(1)/float(24)*float(1000)
self.timer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
self._initOver = True
def SetProperties(self):
self.curFrameSpin.SetValue(self.curFrame)
self.timeStartSpin.SetValue(self.startFrame)
self.timeSliderStartSpin.SetValue(self.sliderStartFrame)
self.timeSliderEndSpin.SetValue(self.sliderEndFrame)
self.timeEndSpin.SetValue(self.endFrame)
def DoLayout(self):
dialogSizer = wx.BoxSizer(wx.VERTICAL)
mainSizer1 = wx.FlexGridSizer(1, 10, 0, 0)
mainSizer2 = wx.FlexGridSizer(1, 6, 0, 0)
mainSizer1.Add(self.timeSlider, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5)
mainSizer1.Add(self.curFrameSpin, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, 3)
mainSizer1.Add(self.buttonFirstFrame, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, 3)
mainSizer1.Add(self.buttonPreFrame, 0, wx.ALIGN_CENTER_VERTICAL|wx.RIGHT, 3)
mainSizer1.Add(self.buttonPreKeyFrame, 0, wx.ALIGN_CENTER_VERTICAL|wx.RIGHT, 3)
mainSizer1.Add(self.buttonPrePlay, 0, wx.ALIGN_CENTER_VERTICAL|wx.RIGHT, 3)
mainSizer1.Add(self.buttonPlay, 0, wx.ALIGN_CENTER_VERTICAL|wx.RIGHT, 3)
mainSizer1.Add(self.buttonNextKeyFrame, 0, wx.ALIGN_CENTER_VERTICAL|wx.RIGHT, 3)
mainSizer1.Add(self.buttonNextFrame, 0, wx.ALIGN_CENTER_VERTICAL|wx.RIGHT, 3)
mainSizer1.Add(self.buttonLastFrame, 0, wx.ALIGN_CENTER_VERTICAL)
mainSizer2.Add(self.timeStartSpin, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, 5)
mainSizer2.Add(self.timeSliderStartSpin, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, 5)
mainSizer2.Add(self.timeRange, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, 5)
mainSizer2.Add(self.timeSliderEndSpin, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, 5)
mainSizer2.Add(self.timeEndSpin, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, 5)
mainSizer2.Add(self.buttonDeleteKey, 0, wx.ALIGN_CENTER_VERTICAL|wx.RIGHT, 3)
self.mainPanel1.SetSizerAndFit(mainSizer1)
self.mainPanel2.SetSizerAndFit(mainSizer2)
dialogSizer.Add(self.mainPanel1, 1, wx.ALIGN_CENTER_VERTICAL|wx.TOP, 5)
dialogSizer.Add(self.mainPanel2, 1, wx.ALIGN_CENTER_VERTICAL|wx.TOP, 7)
self.SetSizer(dialogSizer)
self.Layout()
self.dialogSizer = dialogSizer
def OnCurrentTime(self, evt):
self.curFrame = evt.GetInt()
self.timeSlider.SetTimeSliderData(self.sliderStartFrame, self.sliderEndFrame, self.curFrame)
self.OnAnimation(self.curFrame)
def OnControl(self):
self.curFrameSpin.SetValue(self.curFrame)
self.timeSlider.SetTimeSliderData(self.sliderStartFrame, self.sliderEndFrame, self.curFrame)
self.OnAnimation(self.curFrame)
def OnFirstFrame(self,evt):
self.curFrame = self.sliderStartFrame
self.OnControl()
def OnPreFrame(self,evt):
if self.curFrame-1 >= self.startFrame:
self.curFrame -= 1
self.OnControl()
else:
evt.Skip()
def sortKey(self):
for i in range(0, len(self.keys)-1):
for j in range(i+1, len(self.keys)):
if self.keys[i]>self.keys[j]:
temp = self.keys[i]
self.keys[i] = self.keys[j]
self.keys[j] = temp
def OnPreKeyFrame(self,evt):
self.sortKey()
if self.curFrame <= self.keys[0] or self.curFrame > self.keys[len(self.keys)-1]:
self.curFrame = self.keys[len(self.keys)-1]
else:
for i in range(1, len(self.keys)):
if self.curFrame <= self.keys[i] and self.curFrame > self.keys[i-1]:
self.curFrame = self.keys[i-1]
break
self.OnControl()
def OnTimer(self,evt):
if self.prePlay == True and self.stop == False and self.play == False:
if self.curFrame-1>=self.sliderStartFrame:
self.curFrame -= 1
self.OnControl()
elif self.curFrame == self.sliderStartFrame:
self.curFrame = self.sliderEndFrame
self.OnControl()
if self.play == True and self.stop == False and self.prePlay == False:
if self.curFrame+1<=self.sliderEndFrame:
self.curFrame += 1
self.OnControl()
elif self.curFrame == self.sliderEndFrame:
self.curFrame = self.sliderStartFrame
self.OnControl()
def OnPrePlay(self,evt):
if self.prePlay == False and self.stop == True and self.play == False:
self.buttonPrePlay = wx.BitmapButton(self.mainPanel1, -1, self.bmpStop, size = (30,30),style = wx.BU_AUTODRAW)
self.DoLayout()
self.prePlay = True
self.stop = False
self.timer.Start(self.timeUnit)
evt.Skip()
elif self.prePlay == True and self.stop == False and self.play == False:
self.buttonPrePlay = wx.BitmapButton(self.mainPanel1, -1, self.bmpPrePlay, size = (30,30),style = wx.BU_AUTODRAW)
self.DoLayout()
self.prePlay = False
self.stop = True
self.timer.Stop()
evt.Skip()
else:
evt.Skip()
def OnPlay(self,evt):
if self.play == False and self.stop == True and self.prePlay == False:
self.buttonPlay = wx.BitmapButton(self.mainPanel1, -1, self.bmpStop, size = (30,30),style = wx.BU_AUTODRAW)
self.DoLayout()
self.play = True
self.stop = False
self.timer.Start(self.timeUnit)
evt.Skip()
elif self.play == True and self.stop == False and self.prePlay == False:
self.buttonPlay = wx.BitmapButton(self.mainPanel1, -1, self.bmpPlay, size = (30,30),style = wx.BU_AUTODRAW)
self.DoLayout()
self.play = False
self.stop = True
self.timer.Stop()
evt.Skip()
else:
evt.Skip()
def OnNextKeyFrame(self,evt):
self.sortKey()
if self.curFrame < self.keys[0] or self.curFrame >= self.keys[len(self.keys)-1]:
self.curFrame = self.keys[0]
else:
for i in range(0, len(self.keys)-1):
if self.curFrame >= self.keys[i] and self.curFrame < self.keys[i+1]:
self.curFrame = self.keys[i+1]
break
self.OnControl()
def OnNextFrame(self,evt):
if self.curFrame+1 <= self.endFrame:
self.curFrame += 1
self.OnControl()
else:
evt.Skip()
def OnLastFrame(self,evt):
self.curFrame = self.sliderEndFrame
self.OnControl()
def OnTime(self):
preFrame = self.curFrame
self.curFrameSpin.SetRange(self.startFrame,self.endFrame)
self.curFrame = preFrame
self.timeSlider.SetTimeSliderData(self.sliderStartFrame, self.sliderEndFrame, self.curFrame)
self.timeRange.SetTimeRangeData(self.startFrame, self.endFrame, self.sliderStartFrame, self.sliderEndFrame)
self.parallel = self.editor.animMgr.createParallel(self.startFrame,self.endFrame)
def OnTimeStartSpin(self,evt):
self.startFrame = evt.GetInt()
self.timeSliderStartSpin.SetRange(self.startFrame, self.sliderEndFrame)
if self.startFrame >= self.sliderStartFrame:
self.sliderStartFrame = self.startFrame
self.timeSliderStartSpin.SetValue(self.sliderStartFrame)
self.OnTime()
else:
self.OnTime()
def OnTimeSliderStartSpin(self,evt):
self.sliderStartFrame = evt.GetInt()
self.timeEndSpin.SetRange(self.sliderStartFrame, 10000)
self.OnTime()
def OnTimeSliderEndSpin(self,evt):
self.sliderEndFrame = evt.GetInt()
self.timeStartSpin.SetRange(0, self.sliderEndFrame)
self.OnTime()
def OnTimeEndSpin(self,evt):
self.endFrame = evt.GetInt()
self.timeSliderEndSpin.SetRange(self.sliderStartFrame, self.endFrame)
if self.endFrame <= self.sliderEndFrame:
self.sliderEndFrame = self.endFrame
self.timeSliderEndSpin.SetValue(self.sliderEndFrame)
self.OnTime()
else:
self.OnTime()
def OnDeleteKey(self,evt):
for i in range(0,len(self.keys)):
if self.curFrame == self.keys[i]:
del self.keys[i]
break
for j in self.editor.animMgr.keyFramesInfo.keys():
for k in range(0,len(self.editor.animMgr.keyFramesInfo[j])):
if self.curFrame == self.editor.animMgr.keyFramesInfo[j][k][0]:
del self.editor.animMgr.keyFramesInfo[j][k]
break
for l in self.editor.animMgr.keyFramesInfo.keys():
if len(self.editor.animMgr.keyFramesInfo[l]) == 0:
del self.editor.animMgr.keyFramesInfo[l]
self.OnPropKey()
self.OnAnimation(self.curFrame)
def OnPropKey(self):
self.parallel = self.editor.animMgr.createParallel(self.startFrame, self.endFrame)
self.timeSlider.SetTimeSliderData(self.sliderStartFrame, self.sliderEndFrame, self.curFrame)
def OnAnimation(self, curFrame):
time = float(curFrame-1)/float(24)
self.parallel.setT(time)
if self.editor.GRAPH_EDITOR == True:
self.editor.ui.graphEditorUI.curFrameChange()
def OnExit(self,evt):
for actor in self.editor.objectMgr.Actor:
actorAnim = os.path.basename(actor[OG.OBJ_ANIM])
actor[OG.OBJ_NP].loop(actorAnim)
self.parallel = None
self.Destroy()
self.editor.ui.editAnimMenuItem.Check(False)
self.editor.mode = self.editor.BASE_MODE