backported Roman's latest updates on HEAD to 2.8 branch

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_8_BRANCH@45694 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
2007-04-27 18:49:06 +00:00
parent e78f78e598
commit d698728cea
19 changed files with 381 additions and 192 deletions

View File

@@ -50,6 +50,12 @@ existed.
wx.aui.PyAuiDocArt and wx.aui.PyAuiTabArt can now be derived from in wx.aui.PyAuiDocArt and wx.aui.PyAuiTabArt can now be derived from in
wxPython and plugged in to wx.AUI. wxPython and plugged in to wx.AUI.
XRCed has a new experimental feature to add controls by draging icons
on the test window using the right button. Mouse position is tracked
to highlight the future parent.

View File

@@ -1,4 +1,4 @@
0.1.8-5 (under construction) 0.1.8-5
------- -------
Preferences for default "sizeritem" parameters for new panels and Preferences for default "sizeritem" parameters for new panels and

View File

@@ -71,3 +71,16 @@ class Globals:
g = Globals() g = Globals()
class MyDataObject(wx.PyDataObjectSimple):
def __init__(self):
wx.PyDataObjectSimple.__init__(self, wx.CustomDataFormat('XRCed_DND'))
self.data = ''
def GetDataSize(self):
return len(self.data)
def GetDataHere(self):
return self.data # returns a string
def SetData(self, data):
self.data = data
return True

View File

@@ -1,26 +1,25 @@
#---------------------------------------------------------------------- #----------------------------------------------------------------------
# This file was generated by encode_bitmaps.py # This file was generated by encode_bitmaps.py
# #
from wx import ImageFromStream, BitmapFromImage from wx import ImageFromStream, BitmapFromImage, EmptyIcon
from wx import EmptyIcon
import cStringIO import cStringIO
def getAutoRefreshData(): def getAutoRefreshData():
return \ return \
"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x17\x08\x06\ "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x18\x08\x06\
\x00\x00\x00\x11!\x8f-\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\ \x00\x00\x00\xe0w=\xf8\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\
\x00\xfaIDATH\x89\xb5T\xbb\x0e\x830\x0c<'\x1d\xe8\x9f2\x06X*>\xa0\xea\xd2\ \x00\xfdIDATH\x89\xc5T\xcb\x12\x820\x0c\xdc\x14\x0f\xf5O9\x16\xb88|\x80\xe3E\
\xd6c\xff\xb4,m:\x01\xc1\x8a\x93@\x95\x932\x90\xc7\x1d\xf6\xd9&2\x165a\xaa\ \xcd\xd1?\x95\x8b\xe2\xa9P2M[P\xc6\x9d\xe9\x81>vI6\t\x91\xa9\xb0'\xcc\xae\
\xb2\x038\x95^|\x7f?^\xee\x9d\x8d\xa5\xdc\xbb\xa2\x08B\xf2\x17sR\xb4X`~\x1c#\ \xec\x00\x0e\xa5\x17\x9f\xef\xd7(\xf7\x8e\xa6\xa2\xdc\xbb\xa2\x08B\xf2\x07sR\
\x0f\xff<'\x92\x8c F\xde\xf5\x03I\x91\xe7\xe3\xae\x8a\x14{\xd0:W\x94s\t\xd2\ \xb4X\xc0?\x8e\x91\x87\x7f\x9e\x13IF\x10#o\xda\x8e\xa4\xc8\xfdvUE\x8a=\xa8\
\xcaT\x0b]K\x8f&^,\x10\x9a\xdb\xf5\x03\xf9\xeb\xf6\x9c\x1b^\xd2\xb7K@\x12\ \x9d+\xca\xb9\x04ie\xaa\x85\xae\xa5G\x13/\x16\x08\xcdm\xda\x8e\xc6\xf3\xf2\
\x03\xc0L\xce\r\xa3u\x0e\xcdM\x17Q=8\x1bK\xb3y\xf2\x11\x8d\xebY\x0ej\x049\ \x9c-O\xe9[% \x89\x01\xc0\x93\xb3e\xd4\xce\xc1^t\x11\xd5\x83\xa3\xa9\xc8\x9b\
\xc8\x14\x01\xf1\x08\x0e\x8d\x8a0E\xd3%}\xb7\xfa,\xca6Z\xaaS\xdd\xb4\x1a|H \ '\x1fQ?\x9f\xe5\xa0F\x90\x83L\x11\x10\x8f`\xd3\xa8\x08S4\x9c\xd2ww\x9fE\xd9F\
\x14\n\xbfi\xdc\xd6<7\xbc\x08JdM\x0e\xcbU\x1a\x18+e@T\x1d\x19\x9b\\\x13\xe0\ Ku\xaa\x1bf\x837\t\x84B\xe17\xf5\xcb\x9ag\xcb\x93\xa0D\xd6\xe4\xb0\\\xa5\x81\
\xe7\xa5\xed3\xb3\xd7\xdegS\x14\x1b\r\xda\xf8\x8e\xa1\xb8\x0fbf\xcb\t\xfb\ \xb1R\x06D\xd5\x91\xa9\x92k\x00F\xbf\xb4}f\x1e\xb5\xf7\xd9\x14\xc5F\x836\xbe\
\x97\x00\x10\x1f\xcb)\xf2\xdd\x02GP\xbd\xd1~)\x14\xa25\xbe/\xa7J\x00\x00\x00\ c(\xee\x83\x98\xd9r\xc2~%\x00\xc4\xc7r\x8a|\xb5\xc0\x16\xfc\xb7\xd1~\x81\x0f\
\x00IEND\xaeB`\x82" \xa3~\xa27=\x9c\x90\xeb\x00\x00\x00\x00IEND\xaeB`\x82"
def getAutoRefreshBitmap(): def getAutoRefreshBitmap():
return BitmapFromImage(getAutoRefreshImage()) return BitmapFromImage(getAutoRefreshImage())
@@ -76,23 +75,24 @@ def getIconIcon():
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def getLocateData(): def getLocateData():
return \ return \
'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x17\x08\x06\ '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x18\x08\x06\
\x00\x00\x00\x11!\x8f-\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\ \x00\x00\x00\xe0w=\xf8\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\
\x01\x84IDATH\x89\xb5U\xc1\x8d\x830\x10\\\'W\x07\xc2=\xe4\x83RG>i\xc2\xba\\\ \x01\x88IDATH\x89\xb5V\xc1\x8d\x830\x10\\\'W\x07\xc2=\xf0A\xa9#\x9f4a\xdd]\
\x1d\x10\xdc\x04\x9f+$\x1fz\x00\xd1\x88\xef\x01k\xc6\xeb\x05r\xd2\xddJH\x04\ \x1d\t\xb8\t>WH>\xf4\x00\xa2\x11\xdf\x03\xd6\x8c\xd7\x0b\xe4\xa4\xcbJ\x91\
\xdb3\xbb\xb3\xb3\x8e1\xa73\xfdg|\x1cm(\xab"\xec\xad\x8f\xaf\xc9\xec\xad\x9b\ \x12l\xcf\xec\xce\xce\x9a\x18s:\xd3;\xe3\xe3hCY\x17ao}|Nfo\xddlU\x90\x00\xdb\
\xad\n\x12`\xbbqz8&:\xed\x82\xdb\x15\xdc]\xdc\x0c8,\xefb}\xab\xd2\x8c \x01_\ \x8d\xd3\xc31\xd1i\x17\xdc\xae\xe0\xaer3\xe0\xb0|\x17\xeb[\x95f\x04\t\xf8\
\x80# \xc4\xd8M&!\xda Iz\xa0\x81\x13\x11}>\xbe\x8c\x06\x10\xbf\xdf\x8b@v\xae\ \x02\x1c\x01!\xc6n2\t\xd1\x06I\xd2\x03\r\x9c\x88\xe8\xf3\xeb\xdbh\x00\xf1\
\xae\xac\x8a\x80r%=(\xabe\xa3\x00/\xefz\xf9c\xb7\x02\xc5=\x03\x91\xbb\xb9H\ \xf9\xad\x08d\xe7\xea\xca\xba\x08(W\xd2\x83\xb2^6\n\xf0\xf2\xa6\x97?v+P\xdc3\
\x1e%\xc2\xec$x\x94\x03z\xe0.\x8e\x90\x18\xc9\xfc\xb7\x8fI\xa4=\x00\xb7 \xf8\ \x10\xb9\xab\x8b\xe4Q"\xccN\x82G9\xa0\x07\xaer\x84\xc4H\xe6\x7f|L"\xed\x01\
\xb3\xa9\x03g\x84\xebc7\xe5\xd5-\x18\xcf\xa6\x0e9\x01d\xcf\x81\xe0\xe3k2\xee\ \xb8\x05\xc1\x9b\xc7=pF\xb8>vS^\xdd\x82\xd1<\xee!\'\x80\xec9\x10||N\xc6]\xf3\
\x967\x9c\xc1\xb0\n\x8e\xd8\x83\xa8?x\x1b\x7fK\x9f\'\x86P\xcep\x1f\xd49\xd0\ \x863\x18V\xc1\x11{\x10\xf5\x07o\xe3o\xe9\xf3\xc4\x10\xca\x19\xee\x83:\x07Zp\
\x82\xb3\xfcmdW\x05J\xe0{O\x9a$DsE\xcf\xa6\x0er\x8f\xef}\xb2/#\xf0\xbd\x8fZr\ \x96\x7f\x8d\xec\xaa@\t|\xefI\x93\x84h\xae\xa8y\xdc\x83\xdc\xe3{\x9f\xec\xcb\
\x03\xe5\x1c\xb0\\h\xe1-;\xa7\x12-Zb\xd3dF\xb8\xce.\xd3086\x07M\x1d"\x11ha9h\ \x08|\xef\xa3\x96\xdc@9\x07,\x17Zx\xcb\xce\xa9D\x8b\x96\xd84\x99\x11\xae\xb3\
\\U~]\x0fDd\xd3\xec\x18\x88\x07(j~\xa1\x0c\x9c#\x9bd"\xb0\xe2\x90g\xae\r\x9a\ \xcb4\x0c\x8e\xcdAS\x87H\x04ZX\x0e\x1aW\x95_\xd7\x03\x11\xd94;\x06\xe2\x01\
\x06.M\x91\xd9T#\xd1$J\xbe\x0bpL\xe6\xcf\xfep4\xf0]\x02\xa2\xd9-xqi\x81\x92H\ \x8a\x9aW\x94\x81sd\x93L\x04V\x1c\xf2\xcc\xb5A\xd3\xc0\xa5)2\x9bj$\x9aD\xc9s\
\xf0C\x02$"ZoI\xa9\xb3\x06\xbc2\x9c\xceo?\xf6j\x83\xbd\xda\xd0\xb6mx\xf7\xcc\ \x01\x8e\xc9\xfc\xdb\x0bG\x03\xdf% \x9a\xdd\x82\x17\x97\x16(\x89\x04?$@"\xa2\
\x0f\x93Y\xfb-\xb8Y\x01\xd4\x00\x00\x00\x00IEND\xaeB`\x82' \xf5\x96\x94:k\xc0+\xc3\xe9\xfc\xf2\xc7^l\xb0\x17\x1b\xda\xb6\r/\x9f{\xf7\
\xdf\x96_\xc7\x90\xfb4\xe23\t\xcc\x00\x00\x00\x00IEND\xaeB`\x82'
def getLocateBitmap(): def getLocateBitmap():
return BitmapFromImage(getLocateImage()) return BitmapFromImage(getLocateImage())
@@ -109,23 +109,24 @@ def getLocateIcon():
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def getLocateArmedData(): def getLocateArmedData():
return \ return \
'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x17\x08\x06\ '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x18\x08\x06\
\x00\x00\x00\x11!\x8f-\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\ \x00\x00\x00\xe0w=\xf8\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\
\x01zIDATH\x89\xb5U\xc1\x8d\xc2@\x0c\x9c\xe5\xeeO\x07\x14@\x03@!H\x14\xc0?\n\ \x01~IDATH\x89\xb5U\xc1\x8d\xc2@\x0c\x9c\xe5\xeeO\x07\x14@\x03@!H\x14\xc0?\n\
\xd4\x91D\xfb\xa7\x00$\n\x01\x1a\xa0\x00:\xa0\x82\xe5\x81\x86L\xbc\xde \xa4\ \xd4\x91D\xfb\xa7\x00$\n\x01\x1a\xa0\x00:\xa0\x82\xbd\x07\x1a2\xf1z\x838\xdd\
\xbby\xc6\xce\x8c=\xb6\x93\x10&?\xf8O\xfc~J\xd8\xccgi,~\xbc\xdd\xc3X<\x94:P\ \xcd3vf\xec\xb1\x9d\x840\xf9\xc2\x7f\xe2\xfb]\xc2f>Kc\xf1\xe3\xed\x1e\xc6\
\xe2j\xea\xbf\x1c\x1f\x9f\x85&c\xe4\xd5\xb4\'\xbf\xac+\xc4\xc7\x8b\xf4\xb2\ \xe2\xa1\xd4\x81\x12WS\xff\xe5\xf8x/4\x19#\xaf\xa6=\xf9e]!>\x9e\xa4\x97u\x05\
\xae`\xe3\xa5N3\x01%\'1\t\x15\xab\xf3=\xa8PId \xe0\x91\x03@\xbd\xdb\x87z\xb7\ \x1b/u\x9a\t(9\x89I\xa8X\x9d\xefA\x85J"\x03\x01\x8f\x1c\x00\xea\xdd>\xd4\xbb\
\xcf,\xa8w\xfb\xb0:\xbf\xac)\x89\x0cf\xb0\x99\xcf\x92G~^\xf9\xed\x93\x1c\x00\ }fA\xbd\xdb\x87\xd5\xf9iMId0\x83\xcd|\x96<\xf2\xf3\xcao\x9f\xe4\x00\xc0\x9c\
\x98\x13\x1f\xc0b[\x81\x05\xbd;PeKN;t\x06\x97u\x05\x15V\xb1\xeb!\xfa\x16\xe9\ \xf8\x00\x16\xdb\n,\xe8\xd5\x81*[r\xda\xa13\xb8\xac+\xa8\xb0\x8a]\x0f\xd1\
\xb6(y\xd76\xc9ZD{lw\xe4\xe8\xda&e\x02Z=\xa1\xe4\xc7\xdb=,\xb6\xf9\xc0I\xa6]\ \xb7H\xb7E\xc9\xbb\xb6I\xd6"\xdac\xbb#G\xd76)\x13\xd0\xea\t%?\xde\xeea\xb1\
\x10\xd9\xa1\xb1=Zv=Dl\xe6\xb3\xc4=\xa7\x98Z\xca\x9cL\xd9\xeb\xa0\x04V\xf9-\ \xcd\x07N2\xed\x82\xc8\x0e\x8d\xed\xd1\xb2\xeb!b3\x9f%\xee9\xc5\xd4R\xe6d\
\xb2\x0e\x06\x16\x9c"<K\x80\x97]]\xdb\xa4,\xe7\x14\x07y\x99\xc0\xf2\x14\xdf^\ \xca^\x07%\xb0\xcaO\x91u0\xb0\xe0\x14\xe1Y\x02<\xed\xea\xda&e9\xa78\xc8\xcb\
r\x80\xd6\x16\xb5Ks\xbcu\x1eX\xc4o\x8b\x0emi*\xd28\xb7\xcc\xe3 \x8a\x87\xe6\ \x04\x96\xa7\xf8\xf2\x92\x03\xb4\xb6\xa8]\x9a\xe3\xad\xf3\xc0"~[thKS\x91\xc6\
\x1d\x91\x85\xae\xb0=4v\x95\t\x00\xfd.\xabH\xd76\x89\x1b\xa6\x9e[r\xc6\xb3K\ \xb9e\x1e\x07Q<4\xef\x88,t\x85\xed\xa1\xb1\xabL\x00\xe8wYE\xba\xb6I\xdc0\xf5\
\x06zo\x99\xa8\x95{\x87V"Wdk\xea\x89x\x16\xe9sK\xae\xc5\xfc\xd9\x0f\xc7#\x1f\ \xdc\x923\x9e]2\xd0{\xcbD\xad\xdc;\xb4\x12\xb9"[SO\xc4\xb3H\x9f[r-\xe6\xcf~8\
\x15\x00\x86\xbe\x97`\xe7a\xe3\xa3\x02*\x04\xf4\x9f\x11\xeb\xb3G\xfc\x95\x00\ \x1e\xf9\xa8\x000\xf4\xbd\x04;\x0f\x1b\x1f\x15P!\xa0\xff\x8cX\x9f=\xe2\x8f\
A\xdbtK>\xe1\t\xf2\xe2\x0b\rG\xef\x97\xb3\x00\x00\x00\x00IEND\xaeB`\x82' \x04\x08\xda\xa6[\xf2\x0e\x1f\t\xfc\x06?%\xb3\x0b\x14\x95x1\xa9\x00\x00\x00\
\x00IEND\xaeB`\x82'
def getLocateArmedBitmap(): def getLocateArmedBitmap():
return BitmapFromImage(getLocateArmedImage()) return BitmapFromImage(getLocateArmedImage())
@@ -142,16 +143,17 @@ def getLocateArmedIcon():
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def getRefreshData(): def getRefreshData():
return \ return \
'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x17\x08\x06\ '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x18\x08\x06\
\x00\x00\x00\x11!\x8f-\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\ \x00\x00\x00\xe0w=\xf8\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\
\x00\xcaIDATH\x89\xc5\x94\xc1\x0e\x83 \x10Dw\xa1\x17\xff\xd4#m\xbf\xa3\xed\ \x00\xccIDATH\x89\xd5\x94\xc1\x0e\x83 \x10Dw\xa1\x17\xff\xd4#m\xbf\xa3\xed\
\x1e\xf9SOjO$Hve\x90\x10\xe7\xa6\xd1y0,\xc3\xec<\x8d\x94\x1b\xeaND\x0f\xf4\ \x1e\xf9SOjO$Hve\x90\x90\xa6s\xd3\xe8<\x18\x96av\x9eF\xca\ru\'\xa2\x1b\xfa\
\xc3e[\xf7\xf2\xdd\xe4<\xd7\xfe\x83v\x90\x9bG\x91S(\x0cH?k\xe6\xf9\xcak\x90\ \xe1\xb2\xad{\xf9nr\x9ek\xffA;\xc8\xcd\xa3\xc8)\x14\x06\xa4\x9f5\xf3|\xe55\
\xd3\x1dh\xe6\xcf\xd7\x9bK\xc8\xef\xfb1!\xf0\x19\xcc!@\x99\x97bkL\xad\xad[\ \xc8\xe9\x0e4\xf3\xfb\xe3\xc9%\xe4\xf3~\x99\x10\xf8\x0c\xe6\x10\xa0\xccK\xb1\
\xf1XpxL\xa3\x08E\x91C\x1cHL\xd5\x88\xf2\xa9I\xf9\xb7\xc8\x04L\xcesZ\xd5\x15\ 5\xa6\xd6\xd6\xadx,8<\xa6Q\x84\xa2\xc8!\x0e$\xa6jD\xf9\xd4\xa4\xfc[d\x02&\
\xe3*\xa0\xd78ixU\xdc\x0bX\xb6u?\xbb\xa9]U\xd1b\x94OZ\x13\x00\xad\x03"{ \xe0\ \xe79\xad\xea\x8aq\x15\xd0k\x9c4\xbc*~\x0bX\xb6u?\xbb\xa9]U\xd1b\x94OZ\x13\
3\x98C8<#\xf1@\x00\xad\x1a\xac\xfa\xd6dvQ)m\xc5e\xc3v\x01\x88\xf4s\xa8]\xc6&\ \x00\xad\x03"{ \xe03\x98C8<#\xf1@\x00\xad\x1a\xac\xfa\xd6dvQ)m\xc5e\xc3v\x01\
\xc0\x15\r\xbfh\x7f\xefOoH\x13\xe7\xb6\xfc\x00\x00\x00\x00IEND\xaeB`\x82' \x88\xf4s\xa8]\xc6&\xc0\x15\xfd\xffM\xfe\x02\x1c\xdeoJ\xc0]$\xb0\x00\x00\x00\
\x00IEND\xaeB`\x82'
def getRefreshBitmap(): def getRefreshBitmap():
return BitmapFromImage(getRefreshImage()) return BitmapFromImage(getRefreshImage())
@@ -168,20 +170,20 @@ def getRefreshIcon():
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def getTestData(): def getTestData():
return \ return \
'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x17\x08\x06\ '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x18\x08\x06\
\x00\x00\x00\x11!\x8f-\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\ \x00\x00\x00\xe0w=\xf8\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\
\x01\x1eIDATH\x89\xb5UK\x92\xc2 \x10}\r.r\x19G\x16.<N\xae0z\x8eh\x8e\x90\xe3\ \x01"IDATH\x89\xb5VK\x92\xc2 \x10}\r.r\x19\x1d\x16.<N\xae\xa0\x9eC\xcd\x11r\
\xb8\x98\x05:\x97q\xe1\x0c.\xc6P|\x1a\xe8L)UTB\xa7y\x1f\x1a\x08\x91\xd2xgSoE\ \x9cY\xcc\x82\x19/\xe3\xc2\x19\\h(>\rt\xa6\x0cUT\x92N\xf3>4\x90\x10)\x8d%\
\x07\xb0\x92$\xb9\xdf\x1f\x97\xc6Hi\x92\xcc\xa5\xda\x12q\xc0K\x89X\x07\x9b\ \x9bZ\x14\x1d\xc0J\x92\xe4\xfe~]\x1a#\xa5I2\x96jS\xc4\x01\xcf%b\x1d|l\xd6\
\x8f\xb5\x07\xb6\xd6V\t\xe6\xdc\xcb\xf5\x9b\'"\xa5\xa3n\x8cq\xb7;|\x07\xca=\ \x1e\xd8Z[%\x98r\xbf\x7f\xae<\x11)\x1duc\x8c\xbb\xdd\xe1;P\xeea\x9e1\xc6\xa5\
\xcc3\xc6\xb8\x14\x8b\x94~m\x91O\xc7!_\xd2\x9a\xfa\x9a\x0b.\x8fs\xf1\xf2m\ X\xa4\xf4{\x8b|9\x9f\xf2)\xad\xa9\xaf\xb9\xe0\xf28\x17o_\xa6\x99\x8b\x96\xfa\
\x9a\xb9h\xa9\x0f\x1d\xa4\xef\x12\x17M\x07\xdds\x9f\xdd\xee\xf1\xb3\xab\x9c\ \xd0Az/q\xd1t\xd0\xbd\xd6\xd9\xed\x1e_\xbb\xca\x0e\n]\xf84kmq\xd0\x04\x1a>w\
\xa0\xd0\x85O\xb3\xd6\x16\'\xcd\xa0\xe1\xb8[\x95H\xe2m-\xaaA\nTS\x9f6q\x91g\ \xab\x12I\xbc\xacE5H\x81j\xea\xd3&.\xf2\x04:\x07<"\x90\x9c-\x12\xf0a\x18\xa2\
\xd0%\xe0\x11\x81\xe4n\x91\x80\x8f\xe3\x18\x8d\xc5z\xc2:\xb4\x88>\xf7\x07/6Z\ g\xb1\x9e\xb0\x0e-\xa2\xfd\xe1\xe8\xc5FSTr\xc1\x15\x99k\xa9\xfa\x8c@\x02\xde\
\xa2\x92\x0b\xae\xc8\\K\xd5g\x04\x12\xf0V<T\xcf\x12\x84.J \xdcwN=P\xa8\x01)M\ \x8a\x87\xeaY\x82\xd0E\t\x84{\xcf\xa9\x07\n5 \xa5\xe9r>\xb9\xddv\x04\x00|~\
\xa7\xe3\xe0v\xdb\t\x00p\xfe\xca\xaf\xec\xdd\xd6<\x81{\x1fK\xd5\x03\x8d\x1f\ \xe5G\xf6nk^\xc0\xbd\x8f\xa5\xea\x81\xc6\x07\x07x\xee\xcaq\x1c\xb3x\xdf\xd7\
\x0e\xf0w*\xa7i\xca\xe2}_\x07\x16\x13\x84Di\xac\x06\xbc\x98\xe0\xbf\xed\x01\ \x81\xc5\x04!Q\x1a\xab\x01\xcf&\xf8o[\xfc\xaf\xe2\x01cx\xbd7\x02\x98\x02\xd0\
\xadi\xbd5g\xc8u\x0e\x00\x00\x00\x00IEND\xaeB`\x82' \x00\x00\x00\x00IEND\xaeB`\x82'
def getTestBitmap(): def getTestBitmap():
return BitmapFromImage(getTestImage()) return BitmapFromImage(getTestImage())
@@ -649,19 +651,19 @@ def getToolMenuItemIcon():
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def getToolMoveDownData(): def getToolMoveDownData():
return \ return \
'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x17\x08\x06\ '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x18\x08\x06\
\x00\x00\x00\x11!\x8f-\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\ \x00\x00\x00\xe0w=\xf8\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\
\x00\xf8IDATH\x89\xb5UA\x12\x830\x08\\H\xbf\xd5\x96\x9f\xd9\xfc\xcc\xb6\xefR\ \x00\xfcIDATH\x89\xb5VA\x12\x83 \x0c\xdc\x84~\xabm~f\xf9\x99m\xdf\xa5\xe9\
zI\xa6)\xa2I\xac2\x93q$\x86ea\x83D\x1cp\xa6\xb1u\xe8<\xe9\xa9\x00\x00p\xbf]\ \x05\xa64F\x01\xab\x99\xc98\x82d\xd9d\t\x12q\xc0\x99\xc6v@\xe7IO\x05\x00\x80\
\x0f\x03\xb9\xd4>\xf0\x18\x11\x07j\x05p\x19x\x01\xf3\x02\xfa\x18\xba\x0c\xc6\ \xfb\xedz\x18\xc8\xa5\xf6\x81\xc7\x888P+\x80\xcb\xc0\x0b\x98\x1d\xe8c\xe82\
q\x04\x80\xcd sb\xc6\x156.\x80\x88X\xb0\xdd@\xab=x\xbe\xde\xf9\x80z}\x88\xe9\ \x18\xc7\x11\x006\x83\xcc\x89\x19W\xd8\xb8\x00"b\xc1v\x03\xad\xd6\xe0\xf9z\
9\x14@\x1eH\xb5\xc9\xc4\x81\xbc\x9a\xc7\x1c,\x81\x0fk \xc4\xe1g\x01P\x11Q\ \xe7\x05\xea\xd5!\xa6\xe7P\x00y \xd5"\x13\x07\xf2r\x1es\xb0\x04>\xac\x81\x10\
\xeb\xaf\xad\x07\xa0\n,\xce\x1d.S\xcb\xe20\x99\xc6\x9e&\xb7\xc8\xb4\xd5\xfe\ \x87\x1f\x07\xa0"\xa2v\xbc\xe6\x0f@\x15X\xac;\\\xa6\x96\xc5a2\x8d=En\x91i\
\x96\xe9.\x00\xa0.\xd3V\xab\xf6\x808\x90\x88@D\xa0\xa8\xd7-ZG\xabL5\xc9\xd0\ \xab\xfd-\xd3]\x00@]\xa6\xadV\xad\x01q \x11\x81\x88@Q\xcf[\xb4\x03\xad2\xd5$\
\x93b\xb9\xdf-S\xe0;\x0e\x80\xe5H(\xf7\x16\xd9\xa3\xe1&\xcf\xa6\xfe\xf6\xbd\ CO\x8a\xe5|\xb7L\x81o;\x00\x96-\xa1\x9c[\xec\x1e\r\'y6\xf9\xb7\xefepO\xaaM\
\x0c\xeeI\xb5\x89\xc1\x96\xe5\xac\xbb\xeeAi\xcc\x81l\x89\x86\xb2,\x95qM\xf6\ \x0c\xb6,\xef\xba\xeb\x1c\x94\xc6\x1c\xc8\xa6h(\xd3Ri\xd7d/}\x9d\'\xf5Z\xc1V\
\xa7\xaf\xf3\xa4\xde(\xd8\xea\xc3f\x82\x0b\xc4\x95\xc3=AK\xfb\x005\x00\x82C\ \x1d67\xb8@\\Y\xdc\x13\xf4\'\xde\xd9\xbf-\x1f\x95\xdb\x82J\xbd\xd8\x18k\x00\
\xb1\xf0h\xde\x00\x00\x00\x00IEND\xaeB`\x82' \x00\x00\x00IEND\xaeB`\x82'
def getToolMoveDownBitmap(): def getToolMoveDownBitmap():
return BitmapFromImage(getToolMoveDownImage()) return BitmapFromImage(getToolMoveDownImage())
@@ -678,17 +680,18 @@ def getToolMoveDownIcon():
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def getToolMoveLeftData(): def getToolMoveLeftData():
return \ return \
'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x17\x08\x06\ '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x18\x08\x06\
\x00\x00\x00\x11!\x8f-\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\ \x00\x00\x00\xe0w=\xf8\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\
\x00\xcaIDATH\x89\xb5\x95\xe1\x0e\x83 \x0c\x84\xafe\xaf\xa5\xb27g\xdbs\r\xfc\ \x00\xceIDATH\x89\xb5\x96\xe1\x0e\x83 \x0c\x84\xafe\xaf\xa5\xb27\xef\xb6\xe7\
#\x0b#\xad\x14\xc1KL\x0c\x9a~\xbd\xf6\x8cD\xecp\xa7\xb8>H\xf1\x9bn\x05\x00\ \x1a\xf8G\x17GZ-\x02\x97\x98\x184|\xbd\xf6\x8c\x10q\xc0Hq\xb9\x90\xd37\x0f\
\xc0\xb6.\xd3 \x8f\xd6\x0b\x92#bGV\x80\xe8@*\x98/\xa0\xcf\xa1\xe8 \x84\x00\ \x05\x00\xc02O\xdd \x8f\xab\x174G\xc4\x81\xbc\x00\xd5\x81\xb6\xe1~\x01u\x0eU\
\x00S\xc6$\x02\xbc\xf75l.\x00\x00^\xefO\x9es\x1aIVs\xc9\xc4\x8e\xb6uI!\x84?g\ \x07"\x02\x00]\xda\xa4\x02b\x8c%\xac/\x00\x00^\xef\xcf\xde\xe7\xdc\x92\xac\
\xd3\x00\xc0\xcfM*\xee\xe7\x02$Y\xe3k\x8a\xa9&K|\xbb\x1c\\\x89\xaf\x19\x90\ \xcb!\x13\x07Z\xe6)\x8b\xc8\x9f\xb3n\x00\xe0\xe7&\x1f\xee\xfb\x024y\xe3\xeb\
\x97]\xc1\xc6\x01\xf1\x985\xb3\xa3j\xc1\xa6\xf8\x9e\x02\xca\xe2\xd2\xf9\xd3\ \x8a\xa9%O|\xab\x1c\xdc\x89\xaf\x1b\xb0\x0f\xbb\x80\xb5\x03\xd2\xd6k\xe6@\
\x10[\x15\x10\x8b\xee\xa2\xd2\xa9%\xb2\x97ST\xbb\xd2\xa4:`v\xa4\x8d\xa8\xab\ \xc5\x80]\xf1=\x05\x1c7\xd7\xd6\x9f\x8e\xd8\x9a\x80t\xa8.\x19\x95z"{;E\xa5+K\
\x91\xd3\x87GamD\x165S4\xd2=0\xf8%_\x02\xf4\xfc\x0e-\xda\x01\xe9\x13V\xf6\ \xa6\x03\xe6@V\x8b\xaa\n9}\xb8ml\xb5\xc8\xa3\xcb\x14\xb5T\x0f4~\xc9\xb7\x005\
\xde\n\xe5\xa2\x00\x00\x00\x00IEND\xaeB`\x82' \xbfC\x8fh\xf4\xb1e\x05\xe0\xd1V\xfd\x0e\xdbmz\x00\x00\x00\x00IEND\xaeB`\x82\
'
def getToolMoveLeftBitmap(): def getToolMoveLeftBitmap():
return BitmapFromImage(getToolMoveLeftImage()) return BitmapFromImage(getToolMoveLeftImage())
@@ -705,17 +708,17 @@ def getToolMoveLeftIcon():
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def getToolMoveRightData(): def getToolMoveRightData():
return \ return \
'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x17\x08\x06\ "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x18\x08\x06\
\x00\x00\x00\x11!\x8f-\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\ \x00\x00\x00\xe0w=\xf8\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\
\x00\xcdIDATH\x89\xed\x94]\x0e\x02!\x0c\x84\xa7\xc5k\xed\x8f7sOf\xdd=\x97\ \x00\xd3IDATH\x89\xed\x96a\x0e\xc2 \x0c\x85_\x8b\xd7\xda\x867s'\xb3n\xe7r\
\xd4\x170,\xc1Pv\xd1\'\'!\x01\x12\xfa1mS"vH\xa5\xfe\xa9\xc4\x8e\xd0I\\\xba\ \xf5\x0f\x18F0+\x0c\xfd\xe5KH\x06\t\xfdxm\xd3\x8c\x88\x1dR\xe9\xf6TbG\xe8$.\
\x9c\xc6AS`\xbeN\x03r\x11;\x8a+\xff@M\x97\xd2\xa5\x88\x00@\xd3O\x9b\x00\xf3<\ \x1dN\xe3\xa0)0_\xa7\x01\xb9\x88\x1d\xc5\x95?\xe0H\x97\xd2\xa1\x88\x00@\xd5K\
\xe7\xb0\xbe\x00\x00x\xac[,ts\xdeM\x80(bG\xd38\xa8\x88\xec\x9cu\x03\x00o7\ \xab\x00\xde\xfb\x1c\xd6\x17\x00\x00\x8fe\x8d\x85\xae\xce\xbb\t\x10E\xech\
\x9a\xecQrUjoS\x17}\x92\xa5\xbbL\x0e\xa2\x8et\x97\xd9\x01\xb1#\r\xd1[jav\xe0\ \x1a\x07\x15\x91\x9d\xb3n\x00\xe0\xedF\x93o\x94\\\x95\xda\xdb\xd4E\x9fd\xe9.\
\x93\x9c\xdfE@(\xd7\xe1\x10\xc0\x17\x02)\x80\xab\xc1\x89\t\xc0\xa1\x88\x11\ \x93\x83\xa8\x96\xee2; v\xa4!zM-\xcc\x0e\xb6$\xe7w\x11\x10\xcauh\x02l\x85@\n\
\x14\xcfX\xb7\xfa[\x0b\xe0\x8c\xbe\x0e\xa8\xa6(-\xe4r\x00\xd04\xae\x17vt\xc3\ \xe0jpb\x02p(b\x04\xc5=\x96\xf5\xf8\xae\x05pF_\x07\x1c\xa6(-\xe4\xdc\x00\xa8\
\x7f\\\x07\xfd|\\w\x03\x84\xc9\xb8\x0b\x98\xb8i\xd6\x0b\'hn\x9c\n\x87\xccd\ \x1a\xd73;\xba\xe1?\xae\x83~>\xae\xbb\x01\xc2d\xdc\x05L\xdcT\x8b\xf2\xdf\x96\
\x00\x00\x00\x00IEND\xaeB`\x82' \xdez\x01\x15\x93n\xa3D\xe4_\xf7\x00\x00\x00\x00IEND\xaeB`\x82"
def getToolMoveRightBitmap(): def getToolMoveRightBitmap():
return BitmapFromImage(getToolMoveRightImage()) return BitmapFromImage(getToolMoveRightImage())
@@ -732,19 +735,19 @@ def getToolMoveRightIcon():
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def getToolMoveUpData(): def getToolMoveUpData():
return \ return \
'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x17\x08\x06\ "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x18\x08\x06\
\x00\x00\x00\x11!\x8f-\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\ \x00\x00\x00\xe0w=\xf8\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\
\x00\xefIDATH\x89\xb5\x96Q\x12\xc2 \x0cD7\xc1k\xa9\xdc\xac\xc3\xcd\xaa\x9e\ \x00\xf1IDATH\x89\xd5\x96A\x12\x83 \x0cE\x7fB\xaf\xd5\xca\xcd\x1cnf\xdbs\t]\
\x0b\xf0C\x19\x91\x92\x10:mf\xf2\xd3\xd2}IX\x98\x12\xb1\xc3\x99\xc1\xa7\xaa\ \xb4Li$\x01\x1c]43\xd9(\xfe\x97\x84\x0f#\x11;\x9c\x19|\xaa\xba\x04\xa4\xb8&m\
\xb7\x80\x9cb\x96\x16\xa6\x14sR\xde\x9b\x00\x00p\xbf]7"E\x98\xd9\xd1,\xe02ZP\ a\x8ck\x8a\xc6\xfb.\x00\x00L\xb7\xebF$\x0b3;\x1a\x05\\Z\x0b\xca\xaae\x07=@s\
W\xddv`\x01\xaa{0\x1a\x89el*\xa0\xad\x90\xd9Q\x9d\x96B\x86.\xd2\x84\x98\x1d\ \x0fZ#\xe9\x19\x9b\t\x90\x152;*\xb3\xa7\x90\xa6\x8b,!fG\xa1\x01\xe9\xb2\xa95\
\x85\x01\xc4dSm\xd6\xa1\x82,\x1d\x88\n\xc8)\xe6\x92\x04@\xa2\x84o\x01K\xaf8\ \xebP@\xe6\n\xc4\x04\xa4\xb8\xa6\x9c\x04@\xa3\x84O\x01s\xad8\x0b\x00\x00\xc4\
\r\x00\x00\xc4\x8eJ\x02}\x1bk\xb1\xb1\xe9\xba\xae\x000}\xa0\xcc\x00\xef}\x0b\ \x8er\x02u\x1b[\xb1\xb1\xe9\xb2,\x000|\xa0\xba\x01\xde{\t;\x16\x00\x00\xf7\
;\x16\x00\x00\x8f\xe7\xab\x8c;k\xd7\xc7n@\tbG33\x0f\x9dg\xc3\xab\xa2\xeaF\ \xc73\x8f;Y\xd7\xc7n@\x0ebG#3\x0f\x95g\xcd\xab\xa2\xe8F\r\xeb\xa0\x99\x80\
\x0c\xed\xa0\xa9\x80\xdexH8x\x01?\xbb\xd6\xb1\xcb\xa6\xed\x1d$\x89w;\x98\xb1\ \xdaxH9x\x01_\xbb\x96\xb1\xcb\xa6\xf2\x0e\xd2\xc4\xab\x1d\x8c\xd84\xcf\\\x13\
i\x99\xb9$\xbe\x01\xb4\x9b*\xd9\xd4"\\\x8b\x8a\x89O\'\x7f\xe9\xbd\xcf\xda7m\ \xdf\x00\xe4\xa6j6\xed\x11.E\xd5\xc4\xbb\x93\x9f\xf4\xde'\xeb\x1b\x99\x87\
\x1ej\xd3\xae\xc6\xd9\x7f\x15o\xbc]\x81\xb1$]\x16\xd6\x00\x00\x00\x00IEND\ \xda\xb4\xaa\xf1\xf7\x7f\x15/\xe4\x0f\x81\xb3\xb0\xca}\xd2\x00\x00\x00\x00IE\
\xaeB`\x82' ND\xaeB`\x82"
def getToolMoveUpBitmap(): def getToolMoveUpBitmap():
return BitmapFromImage(getToolMoveUpImage()) return BitmapFromImage(getToolMoveUpImage())

View File

@@ -19,12 +19,18 @@ class Panel(wx.Notebook):
g.panel = panel = self g.panel = panel = self
self.modified = False self.modified = False
# Set common button size for parameter buttons # Set common sizes
bTmp = wx.Button(self, -1, '')
import params import params
params.buttonSize = (self.DLG_SZE(buttonSizeD)[0], bTmp.GetSize()[1]) cTmp = wx.Button(self, -1, '')
bTmp.Destroy() params.buttonSize = (self.DLG_SZE(buttonSizeD)[0], cTmp.GetSize()[1])
del bTmp cTmp.Destroy()
cTmp = wx.TextCtrl(self, -1, '')
params.textSize = cTmp.GetSize()
cTmp.Destroy()
cTmp = wx.CheckBox(self, -1, 'growablerows ') # this is the longest
ParamPage.labelSize = cTmp.GetSize()
cTmp.Destroy()
del cTmp
# List of child windows # List of child windows
self.pages = [] self.pages = []
@@ -170,6 +176,7 @@ class Panel(wx.Notebook):
# General class for notebook pages # General class for notebook pages
class ParamPage(wx.Panel): class ParamPage(wx.Panel):
labelSize = None
def __init__(self, parent, xxx): def __init__(self, parent, xxx):
wx.Panel.__init__(self, parent, -1) wx.Panel.__init__(self, parent, -1)
self.xxx = xxx self.xxx = xxx
@@ -266,38 +273,36 @@ class ParamPage(wx.Panel):
################################################################################ ################################################################################
LABEL_WIDTH = 125
# Panel for displaying properties # Panel for displaying properties
class PropPage(ParamPage): class PropPage(ParamPage):
renameDict = {'orient':'orientation', 'option':'proportion',
'usenotebooksizer':'usesizer', 'dontattachtoframe':'dontattach',
}
def __init__(self, parent, label, xxx): def __init__(self, parent, label, xxx):
ParamPage.__init__(self, parent, xxx) ParamPage.__init__(self, parent, xxx)
self.box = wx.StaticBox(self, -1, label) self.box = wx.StaticBox(self, -1, label)
self.box.SetFont(g.labelFont()) self.box.SetFont(g.labelFont())
topSizer = wx.StaticBoxSizer(self.box, wx.VERTICAL) topSizer = wx.StaticBoxSizer(self.box, wx.VERTICAL)
sizer = wx.FlexGridSizer(len(xxx.allParams), 2, 0, 1) sizer = wx.FlexGridSizer(len(xxx.allParams), 2, 1, 5)
sizer.AddGrowableCol(1) sizer.AddGrowableCol(1)
if xxx.hasName: if xxx.hasName:
label = wx.StaticText(self, -1, 'XML ID:', size=(LABEL_WIDTH,-1)) label = wx.StaticText(self, -1, 'XML ID:', size=self.labelSize)
control = ParamText(self, 'XML_name', 200) control = ParamText(self, 'XML_name', 200)
sizer.AddMany([ (label, 0, wx.ALIGN_CENTER_VERTICAL), sizer.AddMany([ (label, 0, wx.ALIGN_CENTER_VERTICAL),
(control, 0, wx.ALIGN_CENTER_VERTICAL | wx.BOTTOM | wx.GROW, 10) ]) (control, 0, wx.ALIGN_CENTER_VERTICAL | wx.BOTTOM | wx.GROW, 10) ])
self.controlName = control self.controlName = control
for param in xxx.allParams: for param in xxx.allParams:
present = xxx.params.has_key(param) present = xxx.params.has_key(param)
sParam = self.renameDict.get(param, param)
if param in xxx.required: if param in xxx.required:
if isinstance(xxx, xxxComment): if isinstance(xxx, xxxComment):
label = None label = None
else: else:
label = wx.StaticText(self, paramIDs[param], param + ':', label = wx.StaticText(self, paramIDs[param], sParam,
size = (LABEL_WIDTH,-1), name = param) size = self.labelSize, name = param)
else: else:
# Rename some parameters
if param == 'usenotebooksizer': sParam = 'usesizer:'
elif param == 'option': sParam = 'proportion'
else: sParam = param + ':'
label = wx.CheckBox(self, paramIDs[param], sParam, label = wx.CheckBox(self, paramIDs[param], sParam,
size = (LABEL_WIDTH,-1), name = param) size = self.labelSize, name = param)
self.checks[param] = label self.checks[param] = label
try: try:
typeClass = xxx.paramDict[param] typeClass = xxx.paramDict[param]
@@ -360,17 +365,19 @@ class PropPage(ParamPage):
# Style notebook page # Style notebook page
class StylePage(ParamPage): class StylePage(ParamPage):
renameDict = {'fg':'foreground', 'bg':'background'}
def __init__(self, parent, label, xxx): def __init__(self, parent, label, xxx):
ParamPage.__init__(self, parent, xxx) ParamPage.__init__(self, parent, xxx)
box = wx.StaticBox(self, -1, label) box = wx.StaticBox(self, -1, label)
box.SetFont(g.labelFont()) box.SetFont(g.labelFont())
topSizer = wx.StaticBoxSizer(box, wx.VERTICAL) topSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
sizer = wx.FlexGridSizer(len(xxx.styles), 2, 0, 1) sizer = wx.FlexGridSizer(len(xxx.styles), 2, 1, 5)
sizer.AddGrowableCol(1) sizer.AddGrowableCol(1)
for param in xxx.styles: for param in xxx.styles:
present = xxx.params.has_key(param) present = xxx.params.has_key(param)
sParam = self.renameDict.get(param, param)
check = wx.CheckBox(self, paramIDs[param], check = wx.CheckBox(self, paramIDs[param],
param + ':', size = (LABEL_WIDTH,-1), name = param) sParam, size = self.labelSize, name = param)
check.SetValue(present) check.SetValue(present)
control = paramDict[param](self, name = param) control = paramDict[param](self, name = param)
control.Enable(present) control.Enable(present)

View File

@@ -25,11 +25,12 @@ genericExStyles = [
'wxWS_EX_PROCESS_UI_UPDATES' 'wxWS_EX_PROCESS_UI_UPDATES'
] ]
# Global var initialized in Panel.__init__ for button size in screen pixels # Global vars initialized in Panel.__init__ for button and textbox size in screen pixels
buttonSize = None buttonSize = textSise = None
# Button size in dialog units # Default Button size in dialog units
buttonSizeD = (35,-1) buttonSizeD = (35,-1)
# Class that can properly disable children # Class that can properly disable children
class PPanel(wx.Panel): class PPanel(wx.Panel):
def __init__(self, parent, name): def __init__(self, parent, name):
@@ -58,9 +59,10 @@ class ParamBinaryOr(PPanel):
sizer = wx.BoxSizer() sizer = wx.BoxSizer()
self.text = wx.TextCtrl(self, self.ID_TEXT_CTRL, size=wx.Size(200,-1)) self.text = wx.TextCtrl(self, self.ID_TEXT_CTRL, size=wx.Size(200,-1))
sizer.Add(self.text, 0, wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, 5) sizer.Add(self.text, 0, wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, 5)
self.button = wx.Button(self, self.ID_BUTTON_CHOICES, 'Edit...', size=buttonSize) self.button = wx.Button(self, self.ID_BUTTON_CHOICES, 'Edit...',
sizer.Add(self.button, 0, wx.ALIGN_CENTER_VERTICAL) size=(buttonSize[0], textSize[1]))
self.SetSizer(sizer) sizer.Add(self.button, 0, wx.EXPAND)
self.SetSizerAndFit(sizer)
wx.EVT_BUTTON(self, self.ID_BUTTON_CHOICES, self.OnButtonChoices) wx.EVT_BUTTON(self, self.ID_BUTTON_CHOICES, self.OnButtonChoices)
wx.EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange) wx.EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
def GetValue(self): def GetValue(self):
@@ -390,6 +392,8 @@ class ParamUnit(PPanel):
self.SetSizer(sizer) self.SetSizer(sizer)
self.spin.Bind(wx.EVT_SPIN_UP, self.OnSpinUp) self.spin.Bind(wx.EVT_SPIN_UP, self.OnSpinUp)
self.spin.Bind(wx.EVT_SPIN_DOWN, self.OnSpinDown) self.spin.Bind(wx.EVT_SPIN_DOWN, self.OnSpinDown)
self.text.Bind(wx.EVT_TEXT, self.OnChange)
def GetValue(self): def GetValue(self):
return self.text.GetValue() return self.text.GetValue()
def SetValue(self, value): def SetValue(self, value):

Binary file not shown.

Before

Width:  |  Height:  |  Size: 316 B

After

Width:  |  Height:  |  Size: 342 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 513 B

After

Width:  |  Height:  |  Size: 460 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 502 B

After

Width:  |  Height:  |  Size: 471 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 275 B

After

Width:  |  Height:  |  Size: 283 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 350 B

After

Width:  |  Height:  |  Size: 351 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 301 B

After

Width:  |  Height:  |  Size: 315 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 291 B

After

Width:  |  Height:  |  Size: 279 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 286 B

After

Width:  |  Height:  |  Size: 284 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 284 B

After

Width:  |  Height:  |  Size: 299 B

View File

@@ -16,7 +16,6 @@ GROUP_WINDOWS, GROUP_MENUS, GROUP_SIZERS, GROUP_CONTROLS = range(GROUPNUM)
# States depending on current selection and Control/Shift keys # States depending on current selection and Control/Shift keys
STATE_ROOT, STATE_MENUBAR, STATE_TOOLBAR, STATE_MENU, STATE_STDDLGBTN, STATE_ELSE = range(6) STATE_ROOT, STATE_MENUBAR, STATE_TOOLBAR, STATE_MENU, STATE_STDDLGBTN, STATE_ELSE = range(6)
# Left toolbar for GUI elements # Left toolbar for GUI elements
class Tools(wx.Panel): class Tools(wx.Panel):
TOOL_SIZE = (30, 30) TOOL_SIZE = (30, 30)
@@ -97,17 +96,18 @@ class Tools(wx.Panel):
self.SetSizeHints(self.GetSize()[0], -1) self.SetSizeHints(self.GetSize()[0], -1)
# Events # Events
wx.EVT_COMMAND_RANGE(self, ID_NEW.PANEL, ID_NEW.LAST, wx.EVT_COMMAND_RANGE(self, ID_NEW.PANEL, ID_NEW.LAST,
wx.wxEVT_COMMAND_BUTTON_CLICKED, g.frame.OnCreate) wx.wxEVT_COMMAND_BUTTON_CLICKED, g.frame.OnCreate)
wx.EVT_KEY_DOWN(self, self.OnKeyDown) wx.EVT_KEY_DOWN(self, self.OnKeyDown)
wx.EVT_KEY_UP(self, self.OnKeyUp) wx.EVT_KEY_UP(self, self.OnKeyUp)
def AddButton(self, id, image, text): def AddButton(self, id, image, text):
from wx.lib import buttons from wx.lib import buttons
button = buttons.GenBitmapButton(self, id, image, size=self.TOOL_SIZE, button = buttons.GenBitmapButton(self, id, image, size=self.TOOL_SIZE,
style=wx.NO_BORDER|wx.WANTS_CHARS) style=wx.NO_BORDER|wx.WANTS_CHARS)
button.SetBezelWidth(0) button.SetBezelWidth(0)
wx.EVT_KEY_DOWN(button, self.OnKeyDown) wx.EVT_KEY_DOWN(button, self.OnKeyDown)
wx.EVT_KEY_UP(button, self.OnKeyUp) wx.EVT_KEY_UP(button, self.OnKeyUp)
wx.EVT_RIGHT_DOWN(button, self.OnRightClick)
button.SetToolTipString(text) button.SetToolTipString(text)
self.curSizer.Add(button) self.curSizer.Add(button)
self.groups[-1][1][id] = button self.groups[-1][1][id] = button
@@ -160,6 +160,22 @@ class Tools(wx.Panel):
else: box.SetLabel('[-] ' + box.name) else: box.SetLabel('[-] ' + box.name)
self.Layout() self.Layout()
# Drag
def OnRightClick(self, evt):
do = MyDataObject()
do.SetData(str(evt.GetId()))
bm = evt.GetEventObject().GetBitmapLabel()
if wx.Platform != '__WXMAC__':
icon = wx.EmptyIcon()
icon.CopyFromBitmap(bm)
dragSource = wx.DropSource(self, icon)
else: # on Mac DragSource requires cursor (but does not work anyway)
curs = wx.CursorFromImage(wx.ImageFromBitmap(bm))
dragSource = wx.DropSource(self, curs)
dragSource.SetData(do)
g.frame.SetStatusText('Release the mouse button over the test window')
dragSource.DoDragDrop()
# Process key events # Process key events
def OnKeyDown(self, evt): def OnKeyDown(self, evt):
if evt.GetKeyCode() == wx.WXK_CONTROL: if evt.GetKeyCode() == wx.WXK_CONTROL:

View File

@@ -11,6 +11,12 @@ import traceback
# Constant to define standart window name # Constant to define standart window name
STD_NAME = '_XRCED_T_W' STD_NAME = '_XRCED_T_W'
COLOUR_COMMENT = 'Blue'
COLOUR_REF = 'DarkGreen'
COLOUR_HIDDEN = 'Grey'
COLOUR_HL = 'Red'
COLOUR_DT = 'Green'
# Icons # Icons
import images import images
@@ -412,20 +418,24 @@ def SetMenu(m, list, shift=False):
################################################################################ ################################################################################
class HighLightBox: class HighLightBox:
colour = None
def __init__(self, pos, size): def __init__(self, pos, size):
if not self.colour: colour = self.colour = wx.NamedColour(COLOUR_HL)
else: colour = self.colour
if size.width == -1: size.width = 0 if size.width == -1: size.width = 0
if size.height == -1: size.height = 0 if size.height == -1: size.height = 0
w = g.testWin.panel w = g.testWin.panel
l1 = wx.Window(w, -1, pos, wx.Size(size.width, 2)) l1 = wx.Window(w, -1, pos, wx.Size(size.width, 2))
l1.SetBackgroundColour(wx.RED) l1.SetBackgroundColour(self.colour)
l2 = wx.Window(w, -1, pos, wx.Size(2, size.height)) l2 = wx.Window(w, -1, pos, wx.Size(2, size.height))
l2.SetBackgroundColour(wx.RED) l2.SetBackgroundColour(self.colour)
l3 = wx.Window(w, -1, wx.Point(pos.x + size.width - 2, pos.y), wx.Size(2, size.height)) l3 = wx.Window(w, -1, wx.Point(pos.x + size.width - 2, pos.y), wx.Size(2, size.height))
l3.SetBackgroundColour(wx.RED) l3.SetBackgroundColour(self.colour)
l4 = wx.Window(w, -1, wx.Point(pos.x, pos.y + size.height - 2), wx.Size(size.width, 2)) l4 = wx.Window(w, -1, wx.Point(pos.x, pos.y + size.height - 2), wx.Size(size.width, 2))
l4.SetBackgroundColour(wx.RED) l4.SetBackgroundColour(self.colour)
self.lines = [l1, l2, l3, l4] self.lines = [l1, l2, l3, l4]
self.size = size self.size = size
g.testWin.highLight = self
# Move highlight to a new position # Move highlight to a new position
def Replace(self, pos, size): def Replace(self, pos, size):
if size.width == -1: size.width = 0 if size.width == -1: size.width = 0
@@ -442,6 +452,42 @@ class HighLightBox:
def Refresh(self): def Refresh(self):
map(wx.Window.Refresh, self.lines) map(wx.Window.Refresh, self.lines)
# Same for drop target
class HighLightDTBox(HighLightBox):
colour = None
def __init__(self, pos, size):
if not self.colour: colour = self.colour = wx.NamedColour(COLOUR_DT)
else: colour = self.colour
if size.width == -1: size.width = 0
if size.height == -1: size.height = 0
w = g.testWin.panel
l1 = wx.Window(w, -1, pos, wx.Size(size.width, 2))
l1.SetBackgroundColour(colour)
l2 = wx.Window(w, -1, pos, wx.Size(2, size.height))
l2.SetBackgroundColour(colour)
l3 = wx.Window(w, -1, wx.Point(pos.x + size.width - 2, pos.y), wx.Size(2, size.height))
l3.SetBackgroundColour(colour)
l4 = wx.Window(w, -1, wx.Point(pos.x, pos.y + size.height - 2), wx.Size(size.width, 2))
l4.SetBackgroundColour(colour)
self.lines = [l1, l2, l3, l4]
self.size = size
self.item = None
# Remove it
def Remove(self):
map(wx.Window.Destroy, self.lines)
g.testWin.highLightDT = None
def updateHL(hl, hlClass, pos, size):
if hl and hl.size == size:
hl.Remove()
hl = None
if hl:
hl.Replace(pos, size)
hl.Refresh()
else:
hl = hlClass(pos, size)
return hl
################################################################################ ################################################################################
class XML_Tree(wx.TreeCtrl): class XML_Tree(wx.TreeCtrl):
@@ -555,6 +601,7 @@ class XML_Tree(wx.TreeCtrl):
self.rootObj = xxxMainNode(self.dom) self.rootObj = xxxMainNode(self.dom)
self.root = self.AddRoot('XML tree', self.rootImage, self.root = self.AddRoot('XML tree', self.rootImage,
data=wx.TreeItemData(self.rootObj)) data=wx.TreeItemData(self.rootObj))
self.itemColour = self.GetItemTextColour(self.root)
self.SetItemHasChildren(self.root) self.SetItemHasChildren(self.root)
nodes = self.mainNode.childNodes[:] nodes = self.mainNode.childNodes[:]
for node in nodes: for node in nodes:
@@ -587,12 +634,12 @@ class XML_Tree(wx.TreeCtrl):
data=wx.TreeItemData(xxx)) data=wx.TreeItemData(xxx))
# Different color for comments and references # Different color for comments and references
if xxx.className == 'comment': if xxx.className == 'comment':
self.SetItemTextColour(item, 'Blue') self.SetItemTextColour(item, COLOUR_COMMENT)
self.SetItemFont(item, self.fontComment) self.SetItemFont(item, self.fontComment)
elif treeObj.ref: elif treeObj.ref:
self.SetItemTextColour(item, 'DarkGreen') self.SetItemTextColour(item, COLOUR_REF)
elif treeObj.hasStyle and treeObj.params.get('hidden', False): elif treeObj.hasStyle and treeObj.params.get('hidden', False):
self.SetItemTextColour(item, 'Grey') self.SetItemTextColour(item, COLOUR_HIDDEN)
# Try to find children objects # Try to find children objects
if treeObj.hasChildren: if treeObj.hasChildren:
nodes = treeObj.node.childNodes[:] nodes = treeObj.node.childNodes[:]
@@ -623,12 +670,12 @@ class XML_Tree(wx.TreeCtrl):
treeObj = xxx.treeObject() treeObj = xxx.treeObject()
# Different color for references and comments # Different color for references and comments
if xxx.className == 'comment': if xxx.className == 'comment':
self.SetItemTextColour(newItem, 'Blue') self.SetItemTextColour(newItem, COLOUR_COMMENT)
self.SetItemFont(newItem, self.fontComment) self.SetItemFont(newItem, self.fontComment)
elif treeObj.ref: elif treeObj.ref:
self.SetItemTextColour(newItem, 'DarkGreen') self.SetItemTextColour(newItem, COLOUR_REF)
elif treeObj.hasStyle and treeObj.params.get('hidden', False): elif treeObj.hasStyle and treeObj.params.get('hidden', False):
self.SetItemTextColour(newItem, 'Grey') self.SetItemTextColour(newItem, COLOUR_HIDDEN)
# Add children items # Add children items
if xxx.hasChildren: if xxx.hasChildren:
treeObj = xxx.treeObject() treeObj = xxx.treeObject()
@@ -724,6 +771,7 @@ class XML_Tree(wx.TreeCtrl):
self.UnselectAll() self.UnselectAll()
self.SelectItem(evt.GetItem()) self.SelectItem(evt.GetItem())
self.selectionChanging = False self.selectionChanging = False
g.frame.SetStatusText('')
def ChangeSelection(self, item): def ChangeSelection(self, item):
# Apply changes # Apply changes
@@ -731,8 +779,7 @@ class XML_Tree(wx.TreeCtrl):
#oldItem = evt.GetOldItem() #oldItem = evt.GetOldItem()
status = '' status = ''
oldItem = self.selection oldItem = self.selection
# use GetItemParent as a way to determine if the itemId is still valid if oldItem:
if oldItem and self.GetItemParent(oldItem):
xxx = self.GetPyData(oldItem) xxx = self.GetPyData(oldItem)
# If some data was modified, apply changes # If some data was modified, apply changes
if g.panel.IsModified(): if g.panel.IsModified():
@@ -742,7 +789,7 @@ class XML_Tree(wx.TreeCtrl):
g.testWin.highLight.Remove() g.testWin.highLight.Remove()
self.needUpdate = True self.needUpdate = True
status = 'Changes were applied' status = 'Changes were applied'
g.frame.SetStatusText(status) if status: g.frame.SetStatusText(status)
# Generate view # Generate view
self.selection = item self.selection = item
if not self.selection.IsOk(): if not self.selection.IsOk():
@@ -787,18 +834,10 @@ class XML_Tree(wx.TreeCtrl):
size = obj.GetSize() size = obj.GetSize()
# Highlight # Highlight
# Negative positions are not working quite well # Negative positions are not working quite well
hl = g.testWin.highLight
# If highlight object has the same size SetDimension does not repaint it # If highlight object has the same size SetDimension does not repaint it
# so we must remove the old HL window # so we must remove the old HL window
if hl and hl.size == size: g.testWin.highLight = updateHL(g.testWin.highLight, HighLightBox, pos, size)
hl.Remove() g.testWin.highLight.item = item
hl = None
if hl:
hl.Replace(pos, size)
else:
g.testWin.highLight = hl = HighLightBox(pos, size)
hl.Refresh()
hl.item = item
def ShowTestWindow(self, item): def ShowTestWindow(self, item):
xxx = self.GetPyData(item) xxx = self.GetPyData(item)
@@ -906,6 +945,7 @@ class XML_Tree(wx.TreeCtrl):
if not g.currentEncoding: if not g.currentEncoding:
xmlFlags != xrc.XRC_USE_LOCALE xmlFlags != xrc.XRC_USE_LOCALE
res = xrc.XmlResource('', xmlFlags) res = xrc.XmlResource('', xmlFlags)
res.InitAllHandlers()
xrc.XmlResource.Set(res) # set as global xrc.XmlResource.Set(res) # set as global
# Register handlers # Register handlers
addHandlers() addHandlers()
@@ -997,7 +1037,10 @@ class XML_Tree(wx.TreeCtrl):
testWin.item = item testWin.item = item
wx.EVT_CLOSE(testWin, self.OnCloseTestWin) wx.EVT_CLOSE(testWin, self.OnCloseTestWin)
wx.EVT_SIZE(testWin, self.OnSizeTestWin) wx.EVT_SIZE(testWin, self.OnSizeTestWin)
testWin.highLight = None # Add drop target
testWin.SetDropTarget(DropTarget())
# Reset highlights
testWin.highLight = testWin.highLightDT = None
if highLight and not self.pendingHighLight: if highLight and not self.pendingHighLight:
self.HighLight(highLight) self.HighLight(highLight)
except: except:
@@ -1236,3 +1279,88 @@ class XML_Tree(wx.TreeCtrl):
node.data = evt.GetLabel() node.data = evt.GetLabel()
g.panel.SetData(xxx) g.panel.SetData(xxx)
evt.Skip() evt.Skip()
################################################################################
# DragAndDrop
class DropTarget(wx.PyDropTarget):
def __init__(self):
self.do = MyDataObject()
wx.DropTarget.__init__(self, self.do)
# Find best object for dropping
def WhereToDrop(self, x, y, d):
# Find object by position
obj = wx.FindWindowAtPoint(g.testWin.ClientToScreen((x,y)))
if not obj:
return wx.DragNone, ()
item = g.frame.FindObject(g.testWin.item, obj)
if not item:
return wx.DragNone, ()
xxx = g.tree.GetPyData(item).treeObject()
parentItem = None
# Check if window has a XRC sizer, then use it as parent
if obj.GetSizer():
sizer = obj.GetSizer()
sizerItem = g.frame.FindObject(g.testWin.item, sizer)
if sizerItem:
parentItem = sizerItem
obj = sizer
item = wx.TreeItemId()
# if not sizer but can have children, it is parent with free placement
elif xxx.hasChildren:
parentItem = item
item = wx.TreeItemId()
# Otherwise, try to add to item's parent
if not parentItem:
parentItem = g.tree.GetItemParent(item)
obj = g.tree.FindNodeObject(parentItem)
parent = g.tree.GetPyData(parentItem).treeObject()
return d,(obj,parent,parentItem,item)
# Drop
def OnData(self, x, y, d):
self.GetData()
id = int(self.do.GetDataHere())
d,other = self.WhereToDrop(x, y, d)
if d != wx.DragNone:
obj,parent,parentItem,item = other
g.tree.selection = parentItem
xxx = g.frame.CreateXXX(parent, parentItem, item, id)
# Set coordinates if parent is not sizer
if not parent.isSizer:
xxx.set('pos', '%d,%d' % (x, y))
g.panel.SetData(xxx)
g.frame.SetStatusText('Object created')
self.RemoveHL()
return d
def OnDragOver(self, x, y, d):
d,other = self.WhereToDrop(x, y, d)
if d != wx.DragNone:
obj,parent,parentItem,item = other
pos, size = g.tree.FindNodePos(parentItem, obj), obj.GetSize()
# Change tree item colour
hl = g.testWin.highLightDT
if hl and hl.item and hl.item != parentItem:
g.tree.SetItemTextColour(hl.item, g.tree.itemColour)
g.testWin.highLightDT = updateHL(hl, HighLightDTBox, pos, size)
g.testWin.highLightDT.item = parentItem
g.tree.SetItemTextColour(parentItem, COLOUR_DT)
g.tree.EnsureVisible(parentItem)
g.frame.SetStatusText('Drop target: %s' % parent.treeName())
else:
g.frame.SetStatusText('Inappropriate drop target')
self.RemoveHL()
return d
def OnLeave(self):
self.RemoveHL()
def RemoveHL(self):
hl = g.testWin.highLightDT
if hl:
if hl.item: g.tree.SetItemTextColour(hl.item, g.tree.itemColour)
hl.Remove()

View File

@@ -303,7 +303,7 @@ class Frame(wx.Frame):
# Build interface # Build interface
sizer = wx.BoxSizer(wx.VERTICAL) sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(wx.StaticLine(self, -1), 0, wx.EXPAND) #sizer.Add(wx.StaticLine(self, -1), 0, wx.EXPAND)
# Horizontal sizer for toolbar and splitter # Horizontal sizer for toolbar and splitter
self.toolsSizer = sizer1 = wx.BoxSizer() self.toolsSizer = sizer1 = wx.BoxSizer()
splitter = wx.SplitterWindow(self, -1, style=wx.SP_3DSASH) splitter = wx.SplitterWindow(self, -1, style=wx.SP_3DSASH)
@@ -990,8 +990,9 @@ class Frame(wx.Frame):
child = tree.GetNextSibling(child) child = tree.GetNextSibling(child)
return None return None
# Click event after locate activated
def OnTestWinLeftDown(self, evt): def OnTestWinLeftDown(self, evt):
pos = evt.GetPosition() # Restore normal event processing
self.SetHandler(g.testWin) self.SetHandler(g.testWin)
g.testWin.Disconnect(wx.ID_ANY, wx.ID_ANY, wx.wxEVT_LEFT_DOWN) g.testWin.Disconnect(wx.ID_ANY, wx.ID_ANY, wx.wxEVT_LEFT_DOWN)
item = self.FindObject(g.testWin.item, evt.GetEventObject()) item = self.FindObject(g.testWin.item, evt.GetEventObject())
@@ -1103,19 +1104,24 @@ Homepage: http://xrced.sourceforge.net\
parent = tree.GetPyData(parentLeaf) parent = tree.GetPyData(parentLeaf)
if parent.hasChild: parent = parent.child if parent.hasChild: parent = parent.child
self.CreateXXX(parent, parentLeaf, nextItem, evt.GetId())
# Actual method to create object and add to XML and wx trees
def CreateXXX(self, parent, parentLeaf, nextItem, id):
selected = tree.selection
# Create object_ref? # Create object_ref?
if evt.GetId() == ID_NEW.REF: if id == ID_NEW.REF:
ref = wx.GetTextFromUser('Create reference to:', 'Create reference') ref = wx.GetTextFromUser('Create reference to:', 'Create reference')
if not ref: return if not ref: return
xxx = MakeEmptyRefXXX(parent, ref) xxx = MakeEmptyRefXXX(parent, ref)
elif evt.GetId() == ID_NEW.COMMENT: elif id == ID_NEW.COMMENT:
xxx = MakeEmptyCommentXXX(parent) xxx = MakeEmptyCommentXXX(parent)
else: else:
# Create empty element # Create empty element
if evt.GetId() >= ID_NEW.CUSTOM: if id >= ID_NEW.CUSTOM:
className = pullDownMenu.customMap[evt.GetId()] className = pullDownMenu.customMap[id]
else: else:
className = pullDownMenu.createMap[evt.GetId()] className = pullDownMenu.createMap[id]
xxx = MakeEmptyXXX(parent, className) xxx = MakeEmptyXXX(parent, className)
# Insert new node, register undo # Insert new node, register undo
@@ -1127,17 +1133,21 @@ Homepage: http://xrced.sourceforge.net\
xxx.setTreeName('%s%d' % (defaultIDs[cl], frame.maxIDs[cl])) xxx.setTreeName('%s%d' % (defaultIDs[cl], frame.maxIDs[cl]))
# And for some other standard controls # And for some other standard controls
elif parent.__class__ == xxxStdDialogButtonSizer: elif parent.__class__ == xxxStdDialogButtonSizer:
xxx.setTreeName(pullDownMenu.stdButtonIDs[evt.GetId()][0]) # ... we can even set automatically tree name
# We can even set label xxx.setTreeName(pullDownMenu.stdButtonIDs[id][0])
obj = xxx.treeObject() obj = xxx.treeObject()
# ... and label
elem = g.tree.dom.createElement('label') elem = g.tree.dom.createElement('label')
elem.appendChild(g.tree.dom.createTextNode(pullDownMenu.stdButtonIDs[evt.GetId()][1])) elem.appendChild(g.tree.dom.createTextNode(pullDownMenu.stdButtonIDs[id][1]))
obj.params['label'] = xxxParam(elem) obj.params['label'] = xxxParam(elem)
xxx.treeObject().node.appendChild(elem) xxx.treeObject().node.appendChild(elem)
# Else, set label if exists to class name
newItem = tree.InsertNode(parentLeaf, parent, xxx.node, nextItem) elif 'label' in xxx.treeObject().allParams:
else: # comment node label = className
newItem = tree.InsertNode(parentLeaf, parent, xxx.node, nextItem) if label[:2] == 'wx': label = label[2:]
xxx.treeObject().set('label', label.upper())
# For comment nodes, simply add node
newItem = tree.InsertNode(parentLeaf, parent, xxx.node, nextItem)
undoMan.RegisterUndo(UndoPasteCreate(parentLeaf, parent, newItem, selected)) undoMan.RegisterUndo(UndoPasteCreate(parentLeaf, parent, newItem, selected))
tree.EnsureVisible(newItem) tree.EnsureVisible(newItem)
tree.SelectItem(newItem) tree.SelectItem(newItem)
@@ -1155,6 +1165,7 @@ Homepage: http://xrced.sourceforge.net\
if not xxx.isElement: if not xxx.isElement:
tree.EditLabel(newItem) tree.EditLabel(newItem)
self.SetModified() self.SetModified()
return xxx
# Replace one object with another # Replace one object with another
def OnReplace(self, evt): def OnReplace(self, evt):
@@ -1315,10 +1326,10 @@ Homepage: http://xrced.sourceforge.net\
if tree.needUpdate: if tree.needUpdate:
if conf.autoRefresh: if conf.autoRefresh:
if g.testWin: if g.testWin:
self.SetStatusText('Refreshing test window...') #self.SetStatusText('Refreshing test window...')
# (re)create # (re)create
tree.CreateTestWin(g.testWin.item) tree.CreateTestWin(g.testWin.item)
self.SetStatusText('') #self.SetStatusText('')
tree.needUpdate = False tree.needUpdate = False
elif tree.pendingHighLight: elif tree.pendingHighLight:
try: try:
@@ -1752,7 +1763,7 @@ Please upgrade wxWidgets to %d.%d.%d or higher.''' % MinWxVersion)
# Store important data # Store important data
frame.handlers = getHandlers()[:] frame.handlers = getHandlers()[:]
frame.custom = g.pullDownMenu.custom[:] frame.custom = g.pullDownMenu.custom[:]
frame.modules = set(sys.modules.keys()) frame.modules = sys.modules.copy()
# Initialize # Initialize
frame.Clear() frame.Clear()

View File

@@ -622,7 +622,7 @@
</object> </object>
<object class="sizeritem"> <object class="sizeritem">
<object class="wxSpinCtrl" name="spin_proportion_panel"> <object class="wxSpinCtrl" name="spin_proportion_panel">
<size>50,-1</size> <size>30,-1d</size>
</object> </object>
</object> </object>
<object class="sizeritem"> <object class="sizeritem">
@@ -657,7 +657,7 @@
</object> </object>
<object class="sizeritem"> <object class="sizeritem">
<object class="wxSpinCtrl" name="spin_proportion_control"> <object class="wxSpinCtrl" name="spin_proportion_control">
<size>50,-1</size> <size>30,-1d</size>
</object> </object>
</object> </object>
<object class="sizeritem"> <object class="sizeritem">
@@ -685,6 +685,7 @@
<item>always</item> <item>always</item>
<item>never</item> <item>never</item>
</content> </content>
<style>wxRA_SPECIFY_ROWS</style>
</object> </object>
<flag>wxALL|wxALIGN_CENTRE_HORIZONTAL</flag> <flag>wxALL|wxALIGN_CENTRE_HORIZONTAL</flag>
<border>5</border> <border>5</border>