diff --git a/wxPython/docs/CHANGES.txt b/wxPython/docs/CHANGES.txt index 06749ad4f3..fcbe0828c6 100644 --- a/wxPython/docs/CHANGES.txt +++ b/wxPython/docs/CHANGES.txt @@ -50,6 +50,12 @@ existed. wx.aui.PyAuiDocArt and wx.aui.PyAuiTabArt can now be derived from in 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. + + + diff --git a/wxPython/wx/tools/XRCed/CHANGES.txt b/wxPython/wx/tools/XRCed/CHANGES.txt index 212c61507f..dcc4dcabf2 100644 --- a/wxPython/wx/tools/XRCed/CHANGES.txt +++ b/wxPython/wx/tools/XRCed/CHANGES.txt @@ -1,4 +1,4 @@ -0.1.8-5 (under construction) +0.1.8-5 ------- Preferences for default "sizeritem" parameters for new panels and diff --git a/wxPython/wx/tools/XRCed/globals.py b/wxPython/wx/tools/XRCed/globals.py index ca71046967..43f42e39d8 100644 --- a/wxPython/wx/tools/XRCed/globals.py +++ b/wxPython/wx/tools/XRCed/globals.py @@ -71,3 +71,16 @@ class 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 diff --git a/wxPython/wx/tools/XRCed/images.py b/wxPython/wx/tools/XRCed/images.py index 6d133911ce..a960ae3334 100644 --- a/wxPython/wx/tools/XRCed/images.py +++ b/wxPython/wx/tools/XRCed/images.py @@ -1,26 +1,25 @@ #---------------------------------------------------------------------- # This file was generated by encode_bitmaps.py # -from wx import ImageFromStream, BitmapFromImage -from wx import EmptyIcon +from wx import ImageFromStream, BitmapFromImage, EmptyIcon import cStringIO def getAutoRefreshData(): return \ -"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x17\x08\x06\ -\x00\x00\x00\x11!\x8f-\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\ -\xd6c\xff\xb4,m:\x01\xc1\x8a\x93@\x95\x932\x90\xc7\x1d\xf6\xd9&2\x165a\xaa\ -\xb2\x038\x95^|\x7f?^\xee\x9d\x8d\xa5\xdc\xbb\xa2\x08B\xf2\x17sR\xb4X`~\x1c#\ -\x0f\xff<'\x92\x8c F\xde\xf5\x03I\x91\xe7\xe3\xae\x8a\x14{\xd0:W\x94s\t\xd2\ -\xcaT\x0b]K\x8f&^,\x10\x9a\xdb\xf5\x03\xf9\xeb\xf6\x9c\x1b^\xd2\xb7K@\x12\ -\x03\xc0L\xce\r\xa3u\x0e\xcdM\x17Q=8\x1bK\xb3y\xf2\x11\x8d\xebY\x0ej\x049\ -\xc8\x14\x01\xf1\x08\x0e\x8d\x8a0E\xd3%}\xb7\xfa,\xca6Z\xaaS\xdd\xb4\x1a|H \ -\x14\n\xbfi\xdc\xd6<7\xbc\x08JdM\x0e\xcbU\x1a\x18+e@T\x1d\x19\x9b\\\x13\xe0\ -\xe7\xa5\xed3\xb3\xd7\xdegS\x14\x1b\r\xda\xf8\x8e\xa1\xb8\x0fbf\xcb\t\xfb\ -\x97\x00\x10\x1f\xcb)\xf2\xdd\x02GP\xbd\xd1~)\x14\xa25\xbe/\xa7J\x00\x00\x00\ -\x00IEND\xaeB`\x82" +"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x18\x08\x06\ +\x00\x00\x00\xe0w=\xf8\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\ +\x00\xfdIDATH\x89\xc5T\xcb\x12\x820\x0c\xdc\x14\x0f\xf5O9\x16\xb88|\x80\xe3E\ +\xcd\xd1?\x95\x8b\xe2\xa9P2M[P\xc6\x9d\xe9\x81>vI6\t\x91\xa9\xb0'\xcc\xae\ +\xec\x00\x0e\xa5\x17\x9f\xef\xd7(\xf7\x8e\xa6\xa2\xdc\xbb\xa2\x08B\xf2\x07sR\ +\xb4X\xc0?\x8e\x91\x87\x7f\x9e\x13IF\x10#o\xda\x8e\xa4\xc8\xfdvUE\x8a=\xa8\ +\x9d+\xca\xb9\x04ie\xaa\x85\xae\xa5G\x13/\x16\x08\xcdm\xda\x8e\xc6\xf3\xf2\ +\x9c-O\xe9[% \x89\x01\xc0\x93\xb3e\xd4\xce\xc1^t\x11\xd5\x83\xa3\xa9\xc8\x9b\ +'\x1fQ?\x9f\xe5\xa0F\x90\x83L\x11\x10\x8f`\xd3\xa8\x08S4\x9c\xd2ww\x9fE\xd9F\ +Ku\xaa\x1bf\x837\t\x84B\xe17\xf5\xcb\x9ag\xcb\x93\xa0D\xd6\xe4\xb0\\\xa5\x81\ +\xb1R\x06D\xd5\x91\xa9\x92k\x00F\xbf\xb4}f\x1e\xb5\xf7\xd9\x14\xc5F\x836\xbe\ +c(\xee\x83\x98\xd9r\xc2~%\x00\xc4\xc7r\x8a|\xb5\xc0\x16\xfc\xb7\xd1~\x81\x0f\ +\xa3~\xa27=\x9c\x90\xeb\x00\x00\x00\x00IEND\xaeB`\x82" def getAutoRefreshBitmap(): return BitmapFromImage(getAutoRefreshImage()) @@ -76,23 +75,24 @@ def getIconIcon(): #---------------------------------------------------------------------- def getLocateData(): return \ -'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x17\x08\x06\ -\x00\x00\x00\x11!\x8f-\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\\\ -\x1d\x10\xdc\x04\x9f+$\x1fz\x00\xd1\x88\xef\x01k\xc6\xeb\x05r\xd2\xddJH\x04\ -\xdb3\xbb\xb3\xb3\x8e1\xa73\xfdg|\x1cm(\xab"\xec\xad\x8f\xaf\xc9\xec\xad\x9b\ -\xad\n\x12`\xbbqz8&:\xed\x82\xdb\x15\xdc]\xdc\x0c8,\xefb}\xab\xd2\x8c \x01_\ -\x80# \xc4\xd8M&!\xda Iz\xa0\x81\x13\x11}>\xbe\x8c\x06\x10\xbf\xdf\x8b@v\xae\ -\xae\xac\x8a\x80r%=(\xabe\xa3\x00/\xefz\xf9c\xb7\x02\xc5=\x03\x91\xbb\xb9H\ -\x1e%\xc2\xec$x\x94\x03z\xe0.\x8e\x90\x18\xc9\xfc\xb7\x8fI\xa4=\x00\xb7 \xf8\ -\xb3\xa9\x03g\x84\xebc7\xe5\xd5-\x18\xcf\xa6\x0e9\x01d\xcf\x81\xe0\xe3k2\xee\ -\x967\x9c\xc1\xb0\n\x8e\xd8\x83\xa8?x\x1b\x7fK\x9f\'\x86P\xcep\x1f\xd49\xd0\ -\x82\xb3\xfcmdW\x05J\xe0{O\x9a$DsE\xcf\xa6\x0er\x8f\xef}\xb2/#\xf0\xbd\x8fZr\ -\x03\xe5\x1c\xb0\\h\xe1-;\xa7\x12-Zb\xd3dF\xb8\xce.\xd3086\x07M\x1d"\x11ha9h\ -\\U~]\x0fDd\xd3\xec\x18\x88\x07(j~\xa1\x0c\x9c#\x9bd"\xb0\xe2\x90g\xae\r\x9a\ -\x06.M\x91\xd9T#\xd1$J\xbe\x0bpL\xe6\xcf\xfep4\xf0]\x02\xa2\xd9-xqi\x81\x92H\ -\xf0C\x02$"ZoI\xa9\xb3\x06\xbc2\x9c\xceo?\xf6j\x83\xbd\xda\xd0\xb6mx\xf7\xcc\ -\x0f\x93Y\xfb-\xb8Y\x01\xd4\x00\x00\x00\x00IEND\xaeB`\x82' +'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x18\x08\x06\ +\x00\x00\x00\xe0w=\xf8\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\ +\x01\x88IDATH\x89\xb5V\xc1\x8d\x830\x10\\\'W\x07\xc2=\xf0A\xa9#\x9f4a\xdd]\ +\x1d\t\xb8\t>WH>\xf4\x00\xa2\x11\xdf\x03\xd6\x8c\xd7\x0b\xe4\xa4\xcbJ\x91\ +\x12l\xcf\xec\xce\xce\x9a\x18s:\xd3;\xe3\xe3hCY\x17ao}|Nfo\xddlU\x90\x00\xdb\ +\x8d\xd3\xc31\xd1i\x17\xdc\xae\xe0\xaer3\xe0\xb0|\x17\xeb[\x95f\x04\t\xf8\ +\x02\x1c\x01!\xc6n2\t\xd1\x06I\xd2\x03\r\x9c\x88\xe8\xf3\xeb\xdbh\x00\xf1\ +\xf9\xad\x08d\xe7\xea\xca\xba\x08(W\xd2\x83\xb2^6\n\xf0\xf2\xa6\x97?v+P\xdc3\ +\x10\xb9\xab\x8b\xe4Q"\xccN\x82G9\xa0\x07\xaer\x84\xc4H\xe6\x7f|L"\xed\x01\ +\xb8\x05\xc1\x9b\xc7=pF\xb8>vS^\xdd\x82\xd1<\xee!\'\x80\xec9\x10||N\xc6]\xf3\ +\x863\x18V\xc1\x11{\x10\xf5\x07o\xe3o\xe9\xf3\xc4\x10\xca\x19\xee\x83:\x07Zp\ +\x96\x7f\x8d\xec\xaa@\t|\xefI\x93\x84h\xae\xa8y\xdc\x83\xdc\xe3{\x9f\xec\xcb\ +\x08|\xef\xa3\x96\xdc@9\x07,\x17Zx\xcb\xce\xa9D\x8b\x96\xd84\x99\x11\xae\xb3\ +\xcb4\x0c\x8e\xcdAS\x87H\x04ZX\x0e\x1aW\x95_\xd7\x03\x11\xd94;\x06\xe2\x01\ +\x8a\x9aW\x94\x81sd\x93L\x04V\x1c\xf2\xcc\xb5A\xd3\xc0\xa5)2\x9bj$\x9aD\xc9s\ +\x01\x8e\xc9\xfc\xdb\x0bG\x03\xdf% \x9a\xdd\x82\x17\x97\x16(\x89\x04?$@"\xa2\ +\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(): return BitmapFromImage(getLocateImage()) @@ -109,23 +109,24 @@ def getLocateIcon(): #---------------------------------------------------------------------- def getLocateArmedData(): return \ -'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x17\x08\x06\ -\x00\x00\x00\x11!\x8f-\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\ -\xd4\x91D\xfb\xa7\x00$\n\x01\x1a\xa0\x00:\xa0\x82\xe5\x81\x86L\xbc\xde \xa4\ -\xbby\xc6\xce\x8c=\xb6\x93\x10&?\xf8O\xfc~J\xd8\xccgi,~\xbc\xdd\xc3X<\x94:P\ -\xe2j\xea\xbf\x1c\x1f\x9f\x85&c\xe4\xd5\xb4\'\xbf\xac+\xc4\xc7\x8b\xf4\xb2\ -\xae`\xe3\xa5N3\x01%\'1\t\x15\xab\xf3=\xa8PId \xe0\x91\x03@\xbd\xdb\x87z\xb7\ -\xcf,\xa8w\xfb\xb0:\xbf\xac)\x89\x0cf\xb0\x99\xcf\x92G~^\xf9\xed\x93\x1c\x00\ -\x98\x13\x1f\xc0b[\x81\x05\xbd;PeKN;t\x06\x97u\x05\x15V\xb1\xeb!\xfa\x16\xe9\ -\xb6(y\xd76\xc9ZD{lw\xe4\xe8\xda&e\x02Z=\xa1\xe4\xc7\xdb=,\xb6\xf9\xc0I\xa6]\ -\x10\xd9\xa1\xb1=Zv=Dl\xe6\xb3\xc4=\xa7\x98Z\xca\x9cL\xd9\xeb\xa0\x04V\xf9-\ -\xb2\x0e\x06\x16\x9c"\xe1\t\xf2\xe2\x0b\rG\xef\x97\xb3\x00\x00\x00\x00IEND\xaeB`\x82' +'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x18\x08\x06\ +\x00\x00\x00\xe0w=\xf8\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\ +\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\xbd\x07\x1a2\xf1z\x838\xdd\ +\xcd3vf\xec\xb1\x9d\x840\xf9\xc2\x7f\xe2\xfb]\xc2f>Kc\xf1\xe3\xed\x1e\xc6\ +\xe2\xa1\xd4\x81\x12WS\xff\xe5\xf8x/4\x19#\xaf\xa6=\xf9e]!>\x9e\xa4\x97u\x05\ +\x1b/u\x9a\t(9\x89I\xa8X\x9d\xefA\x85J"\x03\x01\x8f\x1c\x00\xea\xdd>\xd4\xbb\ +}fA\xbd\xdb\x87\xd5\xf9iMId0\x83\xcd|\x96<\xf2\xf3\xcao\x9f\xe4\x00\xc0\x9c\ +\xf8\x00\x16\xdb\n,\xe8\xd5\x81*[r\xda\xa13\xb8\xac+\xa8\xb0\x8a]\x0f\xd1\ +\xb7H\xb7E\xc9\xbb\xb6I\xd6"\xdac\xbb#G\xd76)\x13\xd0\xea\t%?\xde\xeea\xb1\ +\xcd\x07N2\xed\x82\xc8\x0e\x8d\xed\xd1\xb2\xeb!b3\x9f%\xee9\xc5\xd4R\xe6d\ +\xca^\x07%\xb0\xcaO\x91u0\xb0\xe0\x14\xe1Y\x02<\xed\xea\xda&e9\xa78\xc8\xcb\ +\x04\x96\xa7\xf8\xf2\x92\x03\xb4\xb6\xa8]\x9a\xe3\xad\xf3\xc0"~[thKS\x91\xc6\ +\xb9e\x1e\x07Q<4\xef\x88,t\x85\xed\xa1\xb1\xabL\x00\xe8wYE\xba\xb6I\xdc0\xf5\ +\xdc\x923\x9e]2\xd0{\xcbD\xad\xdc;\xb4\x12\xb9"[SO\xc4\xb3H\x9f[r-\xe6\xcf~8\ +\x1e\xf9\xa8\x000\xf4\xbd\x04;\x0f\x1b\x1f\x15P!\xa0\xff\x8cX\x9f=\xe2\x8f\ +\x04\x08\xda\xa6[\xf2\x0e\x1f\t\xfc\x06?%\xb3\x0b\x14\x95x1\xa9\x00\x00\x00\ +\x00IEND\xaeB`\x82' def getLocateArmedBitmap(): return BitmapFromImage(getLocateArmedImage()) @@ -142,16 +143,17 @@ def getLocateArmedIcon(): #---------------------------------------------------------------------- def getRefreshData(): return \ -'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x17\x08\x06\ -\x00\x00\x00\x11!\x8f-\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\ -\x1e\xf9SOjO$Hve\x90\x10\xe7\xa6\xd1y0,\xc3\xec<\x8d\x94\x1b\xeaND\x0f\xf4\ -\xc3e[\xf7\xf2\xdd\xe4<\xd7\xfe\x83v\x90\x9bG\x91S(\x0cH?k\xe6\xf9\xcak\x90\ -\xd3\x1dh\xe6\xcf\xd7\x9bK\xc8\xef\xfb1!\xf0\x19\xcc!@\x99\x97bkL\xad\xad[\ -\xf1XpxL\xa3\x08E\x91C\x1cHL\xd5\x88\xf2\xa9I\xf9\xb7\xc8\x04L\xcesZ\xd5\x15\ -\xe3*\xa0\xd78ixU\xdc\x0bX\xb6u?\xbb\xa9]U\xd1b\x94OZ\x13\x00\xad\x03"{ \xe0\ -3\x98C8<#\xf1@\x00\xad\x1a\xac\xfa\xd6dvQ)m\xc5e\xc3v\x01\x88\xf4s\xa8]\xc6&\ -\xc0\x15\r\xbfh\x7f\xefOoH\x13\xe7\xb6\xfc\x00\x00\x00\x00IEND\xaeB`\x82' +'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x18\x08\x06\ +\x00\x00\x00\xe0w=\xf8\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\ +\x00\xccIDATH\x89\xd5\x94\xc1\x0e\x83 \x10Dw\xa1\x17\xff\xd4#m\xbf\xa3\xed\ +\x1e\xf9SOjO$Hve\x90\x90\xa6s\xd3\xe8<\x18\x96av\x9eF\xca\ru\'\xa2\x1b\xfa\ +\xe1\xb2\xad{\xf9nr\x9ek\xffA;\xc8\xcd\xa3\xc8)\x14\x06\xa4\x9f5\xf3|\xe55\ +\xc8\xe9\x0e4\xf3\xfb\xe3\xc9%\xe4\xf3~\x99\x10\xf8\x0c\xe6\x10\xa0\xccK\xb1\ +5\xa6\xd6\xd6\xadx,8<\xa6Q\x84\xa2\xc8!\x0e$\xa6jD\xf9\xd4\xa4\xfc[d\x02&\ +\xe79\xad\xea\x8aq\x15\xd0k\x9c4\xbc*~\x0bX\xb6u?\xbb\xa9]U\xd1b\x94OZ\x13\ +\x00\xad\x03"{ \xe03\x98C8<#\xf1@\x00\xad\x1a\xac\xfa\xd6dvQ)m\xc5e\xc3v\x01\ +\x88\xf4s\xa8]\xc6&\xc0\x15\xfd\xffM\xfe\x02\x1c\xdeoJ\xc0]$\xb0\x00\x00\x00\ +\x00IEND\xaeB`\x82' def getRefreshBitmap(): return BitmapFromImage(getRefreshImage()) @@ -168,20 +170,20 @@ def getRefreshIcon(): #---------------------------------------------------------------------- def getTestData(): return \ -'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x17\x08\x06\ -\x00\x00\x00\x11!\x8f-\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\ -\x01\x1eIDATH\x89\xb5UK\x92\xc2 \x10}\r.r\x19G\x16.\xf7\x07/6Z\ -\xa2\x92\x0b\xae\xc8\\K\xd5g\x04\x12\xf0V\rt\xa6\x0cUT\x92N\xf3>4\x90\x10)\x8d%\ +\x9bZ\x14\x1d\xc0J\x92\xe4\xfe~]\x1a#\xa5I2\x96jS\xc4\x01\xcf%b\x1d|l\xd6\ +\x1e\xd8Z[%\x98r\xbf\x7f\xae<\x11)\x1duc\x8c\xbb\xdd\xe1;P\xeea\x9e1\xc6\xa5\ +X\xa4\xf4{\x8b|9\x9f\xf2)\xad\xa9\xaf\xb9\xe0\xf28\x17o_\xa6\x99\x8b\x96\xfa\ +\xd0Az/q\xd1t\xd0\xbd\xd6\xd9\xed\x1e_\xbb\xca\x0e\n]\xf84kmq\xd0\x04\x1a>w\ +\xab\x12I\xbc\xacE5H\x81j\xea\xd3&.\xf2\x04:\x07<"\x90\x9c-\x12\xf0a\x18\xa2\ +g\xb1\x9e\xb0\x0e-\xa2\xfd\xe1\xe8\xc5FSTr\xc1\x15\x99k\xa9\xfa\x8c@\x02\xde\ +\x8a\x87\xeaY\x82\xd0E\t\x84{\xcf\xa9\x07\n5 \xa5\xe9r>\xb9\xddv\x04\x00|~\ +\xe5G\xf6nk^\xc0\xbd\x8f\xa5\xea\x81\xc6\x07\x07x\xee\xcaq\x1c\xb3x\xdf\xd7\ +\x81\xc5\x04!Q\x1a\xab\x01\xcf&\xf8o[\xfc\xaf\xe2\x01cx\xbd7\x02\x98\x02\xd0\ +\x00\x00\x00\x00IEND\xaeB`\x82' def getTestBitmap(): return BitmapFromImage(getTestImage()) @@ -649,19 +651,19 @@ def getToolMenuItemIcon(): #---------------------------------------------------------------------- def getToolMoveDownData(): return \ -'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x17\x08\x06\ -\x00\x00\x00\x11!\x8f-\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\ -zI\xa6)\xa2I\xac2\x93q$\x86ea\x83D\x1cp\xa6\xb1u\xe8<\xe9\xa9\x00\x00p\xbf]\ -\x0f\x03\xb9\xd4>\xf0\x18\x11\x07j\x05p\x19x\x01\xf3\x02\xfa\x18\xba\x0c\xc6\ -q\x04\x80\xcd sb\xc6\x156.\x80\x88X\xb0\xdd@\xab=x\xbe\xde\xf9\x80z}\x88\xe9\ -9\x14@\x1eH\xb5\xc9\xc4\x81\xbc\x9a\xc7\x1c,\x81\x0fk \xc4\xe1g\x01P\x11Q\ -\xeb\xaf\xad\x07\xa0\n,\xce\x1d.S\xcb\xe20\x99\xc6\x9e&\xb7\xc8\xb4\xd5\xfe\ -\x96\xe9.\x00\xa0.\xd3V\xab\xf6\x808\x90\x88@D\xa0\xa8\xd7-ZG\xabL5\xc9\xd0\ -\x93b\xb9\xdf-S\xe0;\x0e\x80\xe5H(\xf7\x16\xd9\xa3\xe1&\xcf\xa6\xfe\xf6\xbd\ -\x0c\xeeI\xb5\x89\xc1\x96\xe5\xac\xbb\xeeAi\xcc\x81l\x89\x86\xb2,\x95qM\xf6\ -\xa7\xaf\xf3\xa4\xde(\xd8\xea\xc3f\x82\x0b\xc4\x95\xc3=AK\xfb\x005\x00\x82C\ -\xb1\xf0h\xde\x00\x00\x00\x00IEND\xaeB`\x82' +'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x18\x08\x06\ +\x00\x00\x00\xe0w=\xf8\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\ +\x00\xfcIDATH\x89\xb5VA\x12\x83 \x0c\xdc\x84~\xabm~f\xf9\x99m\xdf\xa5\xe9\ +\x05\xa64F\x01\xab\x99\xc98\x82d\xd9d\t\x12q\xc0\x99\xc6v@\xe7IO\x05\x00\x80\ +\xfb\xedz\x18\xc8\xa5\xf6\x81\xc7\x888P+\x80\xcb\xc0\x0b\x98\x1d\xe8c\xe82\ +\x18\xc7\x11\x006\x83\xcc\x89\x19W\xd8\xb8\x00"b\xc1v\x03\xad\xd6\xe0\xf9z\ +\xe7\x05\xea\xd5!\xa6\xe7P\x00y \xd5"\x13\x07\xf2r\x1es\xb0\x04>\xac\x81\x10\ +\x87\x1f\x07\xa0"\xa2v\xbc\xe6\x0f@\x15X\xac;\\\xa6\x96\xc5a2\x8d=En\x91i\ +\xab\xfd-\xd3]\x00@]\xa6\xadV\xad\x01q \x11\x81\x88@Q\xcf[\xb4\x03\xad2\xd5$\ +CO\x8a\xe5|\xb7L\x81o;\x00\x96-\xa1\x9c[\xec\x1e\r\'y6\xf9\xb7\xefepO\xaaM\ +\x0c\xb6,\xef\xba\xeb\x1c\x94\xc6\x1c\xc8\xa6h(\xd3Ri\xd7d/}\x9d\'\xf5Z\xc1V\ +\x1d67\xb8@\\Y\xdc\x13\xf4\'\xde\xd9\xbf-\x1f\x95\xdb\x82J\xbd\xd8\x18k\x00\ +\x00\x00\x00IEND\xaeB`\x82' def getToolMoveDownBitmap(): return BitmapFromImage(getToolMoveDownImage()) @@ -678,17 +680,18 @@ def getToolMoveDownIcon(): #---------------------------------------------------------------------- def getToolMoveLeftData(): return \ -'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x17\x08\x06\ -\x00\x00\x00\x11!\x8f-\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\ -#\x0b#\xad\x14\xc1KL\x0c\x9a~\xbd\xf6\x8cD\xecp\xa7\xb8>H\xf1\x9bn\x05\x00\ -\xc0\xb6.\xd3 \x8f\xd6\x0b\x92#bGV\x80\xe8@*\x98/\xa0\xcf\xa1\xe8 \x84\x00\ -\x00S\xc6$\x02\xbc\xf75l.\x00\x00^\xefO\x9es\x1aIVs\xc9\xc4\x8e\xb6uI!\x84?g\ -\xd3\x00\xc0\xcfM*\xee\xe7\x02$Y\xe3k\x8a\xa9&K|\xbb\x1c\\\x89\xaf\x19\x90\ -\x97]\xc1\xc6\x01\xf1\x985\xb3\xa3j\xc1\xa6\xf8\x9e\x02\xca\xe2\xd2\xf9\xd3\ -\x10[\x15\x10\x8b\xee\xa2\xd2\xa9%\xb2\x97ST\xbb\xd2\xa4:`v\xa4\x8d\xa8\xab\ -\x91\xd3\x87GamD\x165S4\xd2=0\xf8%_\x02\xf4\xfc\x0e-\xda\x01\xe9\x13V\xf6\ -\xde\n\xe5\xa2\x00\x00\x00\x00IEND\xaeB`\x82' +'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x18\x08\x06\ +\x00\x00\x00\xe0w=\xf8\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\ +\x00\xceIDATH\x89\xb5\x96\xe1\x0e\x83 \x0c\x84\xafe\xaf\xa5\xb27\xef\xb6\xe7\ +\x1a\xf8G\x17GZ-\x02\x97\x98\x184|\xbd\xf6\x8c\x10q\xc0Hq\xb9\x90\xd37\x0f\ +\x05\x00\xc02O\xdd \x8f\xab\x174G\xc4\x81\xbc\x00\xd5\x81\xb6\xe1~\x01u\x0eU\ +\x07"\x02\x00]\xda\xa4\x02b\x8c%\xac/\x00\x00^\xef\xcf\xde\xe7\xdc\x92\xac\ +\xcb!\x13\x07Z\xe6)\x8b\xc8\x9f\xb3n\x00\xe0\xe7&\x1f\xee\xfb\x024y\xe3\xeb\ +\x8a\xa9%O|\xab\x1c\xdc\x89\xaf\x1b\xb0\x0f\xbb\x80\xb5\x03\xd2\xd6k\xe6@\ +\xc5\x80]\xf1=\x05\x1c7\xd7\xd6\x9f\x8e\xd8\x9a\x80t\xa8.\x19\x95z"{;E\xa5+K\ +\xa6\x03\xe6@V\x8b\xaa\n9}\xb8ml\xb5\xc8\xa3\xcb\x14\xb5T\x0f4~\xc9\xb7\x005\ +\xbfC\x8fh\xf4\xb1e\x05\xe0\xd1V\xfd\x0e\xdbmz\x00\x00\x00\x00IEND\xaeB`\x82\ +' def getToolMoveLeftBitmap(): return BitmapFromImage(getToolMoveLeftImage()) @@ -705,17 +708,17 @@ def getToolMoveLeftIcon(): #---------------------------------------------------------------------- def getToolMoveRightData(): return \ -'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x17\x08\x06\ -\x00\x00\x00\x11!\x8f-\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\ -\xd4\x170,\xc1Pv\xd1\'\'!\x01\x12\xfa1mS"vH\xa5\xfe\xa9\xc4\x8e\xd0I\\\xba\ -\x9c\xc6AS`\xbeN\x03r\x11;\x8a+\xff@M\x97\xd2\xa5\x88\x00@\xd3O\x9b\x00\xf3<\ -\xe7\xb0\xbe\x00\x00x\xac[,ts\xdeM\x80(bG\xd38\xa8\x88\xec\x9cu\x03\x00o7\ -\x9a\xecQrUjoS\x17}\x92\xa5\xbbL\x0e\xa2\x8et\x97\xd9\x01\xb1#\r\xd1[jav\xe0\ -\x93\x9c\xdfE@(\xd7\xe1\x10\xc0\x17\x02)\x80\xab\xc1\x89\t\xc0\xa1\x88\x11\ -\x14\xcfX\xb7\xfa[\x0b\xe0\x8c\xbe\x0e\xa8\xa6(-\xe4r\x00\xd04\xae\x17vt\xc3\ -\x7f\\\x07\xfd|\\w\x03\x84\xc9\xb8\x0b\x98\xb8i\xd6\x0b\'hn\x9c\n\x87\xccd\ -\x00\x00\x00\x00IEND\xaeB`\x82' +"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x18\x08\x06\ +\x00\x00\x00\xe0w=\xf8\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\ +\x00\xd3IDATH\x89\xed\x96a\x0e\xc2 \x0c\x85_\x8b\xd7\xda\x867s'\xb3n\xe7r\ +\xf5\x0f\x18F0+\x0c\xfd\xe5KH\x06\t\xfdxm\xd3\x8c\x88\x1dR\xe9\xf6TbG\xe8$.\ +\x1dN\xe3\xa0)0_\xa7\x01\xb9\x88\x1d\xc5\x95?\xe0H\x97\xd2\xa1\x88\x00@\xd5K\ +\xab\x00\xde\xfb\x1c\xd6\x17\x00\x00\x8fe\x8d\x85\xae\xce\xbb\t\x10E\xech\ +\x1a\x07\x15\x91\x9d\xb3n\x00\xe0\xedF\x93o\x94\\\x95\xda\xdb\xd4E\x9fd\xe9.\ +\x93\x83\xa8\x96\xee2; v\xa4!zM-\xcc\x0e\xb6$\xe7w\x11\x10\xcauh\x02l\x85@\n\ +\xe0jpb\x02p(b\x04\xc5=\x96\xf5\xf8\xae\x05pF_\x07\x1c\xa6(-\xe4\xdc\x00\xa8\ +\x1a\xd73;\xba\xe1?\xae\x83~>\xae\xbb\x01\xc2d\xdc\x05L\xdcT\x8b\xf2\xdf\x96\ +\xdez\x01\x15\x93n\xa3D\xe4_\xf7\x00\x00\x00\x00IEND\xaeB`\x82" def getToolMoveRightBitmap(): return BitmapFromImage(getToolMoveRightImage()) @@ -732,19 +735,19 @@ def getToolMoveRightIcon(): #---------------------------------------------------------------------- def getToolMoveUpData(): return \ -'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x17\x08\x06\ -\x00\x00\x00\x11!\x8f-\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\ -\x0b\xf0C\x19\x91\x92\x10:mf\xf2\xd3\xd2}IX\x98\x12\xb1\xc3\x99\xc1\xa7\xaa\ -\xb7\x80\x9cb\x96\x16\xa6\x14sR\xde\x9b\x00\x00p\xbf]7"E\x98\xd9\xd1,\xe02ZP\ -W\xddv`\x01\xaa{0\x1a\x89el*\xa0\xad\x90\xd9Q\x9d\x96B\x86.\xd2\x84\x98\x1d\ -\x85\x01\xc4dSm\xd6\xa1\x82,\x1d\x88\n\xc8)\xe6\x92\x04@\xa2\x84o\x01K\xaf8\ -\r\x00\x00\xc4\x8eJ\x02}\x1bk\xb1\xb1\xe9\xba\xae\x000}\xa0\xcc\x00\xef}\x0b\ -;\x16\x00\x00\x8f\xe7\xab\x8c;k\xd7\xc7n@\tbG33\x0f\x9dg\xc3\xab\xa2\xeaF\ -\x0c\xed\xa0\xa9\x80\xdexH8x\x01?\xbb\xd6\xb1\xcb\xa6\xed\x1d$\x89w;\x98\xb1\ -i\x99\xb9$\xbe\x01\xb4\x9b*\xd9\xd4"\\\x8b\x8a\x89O\'\x7f\xe9\xbd\xcf\xda7m\ -\x1ej\xd3\xae\xc6\xd9\x7f\x15o\xbc]\x81\xb1$]\x16\xd6\x00\x00\x00\x00IEND\ -\xaeB`\x82' +"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x18\x08\x06\ +\x00\x00\x00\xe0w=\xf8\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\ +\x00\xf1IDATH\x89\xd5\x96A\x12\x83 \x0cE\x7fB\xaf\xd5\xca\xcd\x1cnf\xdbs\t]\ +\xb4Li$\x01\x1c]43\xd9(\xfe\x97\x84\x0f#\x11;\x9c\x19|\xaa\xba\x04\xa4\xb8&m\ +a\x8ck\x8a\xc6\xfb.\x00\x00L\xb7\xebF$\x0b3;\x1a\x05\\Z\x0b\xca\xaae\x07=@s\ +\x0fZ#\xe9\x19\x9b\t\x90\x152;*\xb3\xa7\x90\xa6\x8b,!fG\xa1\x01\xe9\xb2\xa95\ +\xebP@\xe6\n\xc4\x04\xa4\xb8\xa6\x9c\x04@\xa3\x84O\x01s\xad8\x0b\x00\x00\xc4\ +\x8er\x02u\x1b[\xb1\xb1\xe9\xb2,\x000|\xa0\xba\x01\xde{\t;\x16\x00\x00\xf7\ +\xc73\x8f;Y\xd7\xc7n@\x0ebG#3\x0f\x95g\xcd\xab\xa2\xe8F\r\xeb\xa0\x99\x80\ +\xdaxH9x\x01_\xbb\x96\xb1\xcb\xa6\xf2\x0e\xd2\xc4\xab\x1d\x8c\xd84\xcf\\\x13\ +\xdf\x00\xe4\xa6j6\xed\x11.E\xd5\xc4\xbb\x93\x9f\xf4\xde'\xeb\x1b\x99\x87\ +\xda\xb4\xaa\xf1\xf7\x7f\x15/\xe4\x0f\x81\xb3\xb0\xca}\xd2\x00\x00\x00\x00IE\ +ND\xaeB`\x82" def getToolMoveUpBitmap(): return BitmapFromImage(getToolMoveUpImage()) diff --git a/wxPython/wx/tools/XRCed/panel.py b/wxPython/wx/tools/XRCed/panel.py index d05dc3793c..1bb555d530 100644 --- a/wxPython/wx/tools/XRCed/panel.py +++ b/wxPython/wx/tools/XRCed/panel.py @@ -19,12 +19,18 @@ class Panel(wx.Notebook): g.panel = panel = self self.modified = False - # Set common button size for parameter buttons - bTmp = wx.Button(self, -1, '') + # Set common sizes import params - params.buttonSize = (self.DLG_SZE(buttonSizeD)[0], bTmp.GetSize()[1]) - bTmp.Destroy() - del bTmp + cTmp = wx.Button(self, -1, '') + params.buttonSize = (self.DLG_SZE(buttonSizeD)[0], cTmp.GetSize()[1]) + 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 self.pages = [] @@ -170,6 +176,7 @@ class Panel(wx.Notebook): # General class for notebook pages class ParamPage(wx.Panel): + labelSize = None def __init__(self, parent, xxx): wx.Panel.__init__(self, parent, -1) self.xxx = xxx @@ -266,38 +273,36 @@ class ParamPage(wx.Panel): ################################################################################ -LABEL_WIDTH = 125 - # Panel for displaying properties class PropPage(ParamPage): + renameDict = {'orient':'orientation', 'option':'proportion', + 'usenotebooksizer':'usesizer', 'dontattachtoframe':'dontattach', + } def __init__(self, parent, label, xxx): ParamPage.__init__(self, parent, xxx) self.box = wx.StaticBox(self, -1, label) self.box.SetFont(g.labelFont()) 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) 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) sizer.AddMany([ (label, 0, wx.ALIGN_CENTER_VERTICAL), (control, 0, wx.ALIGN_CENTER_VERTICAL | wx.BOTTOM | wx.GROW, 10) ]) self.controlName = control for param in xxx.allParams: present = xxx.params.has_key(param) + sParam = self.renameDict.get(param, param) if param in xxx.required: if isinstance(xxx, xxxComment): label = None else: - label = wx.StaticText(self, paramIDs[param], param + ':', - size = (LABEL_WIDTH,-1), name = param) + label = wx.StaticText(self, paramIDs[param], sParam, + size = self.labelSize, name = param) else: - # Rename some parameters - if param == 'usenotebooksizer': sParam = 'usesizer:' - elif param == 'option': sParam = 'proportion' - else: sParam = param + ':' label = wx.CheckBox(self, paramIDs[param], sParam, - size = (LABEL_WIDTH,-1), name = param) + size = self.labelSize, name = param) self.checks[param] = label try: typeClass = xxx.paramDict[param] @@ -360,17 +365,19 @@ class PropPage(ParamPage): # Style notebook page class StylePage(ParamPage): + renameDict = {'fg':'foreground', 'bg':'background'} def __init__(self, parent, label, xxx): ParamPage.__init__(self, parent, xxx) box = wx.StaticBox(self, -1, label) box.SetFont(g.labelFont()) 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) for param in xxx.styles: present = xxx.params.has_key(param) + sParam = self.renameDict.get(param, param) check = wx.CheckBox(self, paramIDs[param], - param + ':', size = (LABEL_WIDTH,-1), name = param) + sParam, size = self.labelSize, name = param) check.SetValue(present) control = paramDict[param](self, name = param) control.Enable(present) diff --git a/wxPython/wx/tools/XRCed/params.py b/wxPython/wx/tools/XRCed/params.py index 7142449f84..769f6d8f48 100644 --- a/wxPython/wx/tools/XRCed/params.py +++ b/wxPython/wx/tools/XRCed/params.py @@ -25,11 +25,12 @@ genericExStyles = [ 'wxWS_EX_PROCESS_UI_UPDATES' ] -# Global var initialized in Panel.__init__ for button size in screen pixels -buttonSize = None -# Button size in dialog units +# Global vars initialized in Panel.__init__ for button and textbox size in screen pixels +buttonSize = textSise = None +# Default Button size in dialog units buttonSizeD = (35,-1) + # Class that can properly disable children class PPanel(wx.Panel): def __init__(self, parent, name): @@ -58,9 +59,10 @@ class ParamBinaryOr(PPanel): sizer = wx.BoxSizer() 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) - self.button = wx.Button(self, self.ID_BUTTON_CHOICES, 'Edit...', size=buttonSize) - sizer.Add(self.button, 0, wx.ALIGN_CENTER_VERTICAL) - self.SetSizer(sizer) + self.button = wx.Button(self, self.ID_BUTTON_CHOICES, 'Edit...', + size=(buttonSize[0], textSize[1])) + sizer.Add(self.button, 0, wx.EXPAND) + self.SetSizerAndFit(sizer) wx.EVT_BUTTON(self, self.ID_BUTTON_CHOICES, self.OnButtonChoices) wx.EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange) def GetValue(self): @@ -390,6 +392,8 @@ class ParamUnit(PPanel): self.SetSizer(sizer) self.spin.Bind(wx.EVT_SPIN_UP, self.OnSpinUp) self.spin.Bind(wx.EVT_SPIN_DOWN, self.OnSpinDown) + self.text.Bind(wx.EVT_TEXT, self.OnChange) + def GetValue(self): return self.text.GetValue() def SetValue(self, value): diff --git a/wxPython/wx/tools/XRCed/src-images/AutoRefresh.png b/wxPython/wx/tools/XRCed/src-images/AutoRefresh.png index d957081d6e..539b61c7bc 100644 Binary files a/wxPython/wx/tools/XRCed/src-images/AutoRefresh.png and b/wxPython/wx/tools/XRCed/src-images/AutoRefresh.png differ diff --git a/wxPython/wx/tools/XRCed/src-images/Locate.png b/wxPython/wx/tools/XRCed/src-images/Locate.png index 0686506bdf..da264d5c1e 100644 Binary files a/wxPython/wx/tools/XRCed/src-images/Locate.png and b/wxPython/wx/tools/XRCed/src-images/Locate.png differ diff --git a/wxPython/wx/tools/XRCed/src-images/LocateArmed.png b/wxPython/wx/tools/XRCed/src-images/LocateArmed.png index 71379a7c84..04ee0df1cb 100644 Binary files a/wxPython/wx/tools/XRCed/src-images/LocateArmed.png and b/wxPython/wx/tools/XRCed/src-images/LocateArmed.png differ diff --git a/wxPython/wx/tools/XRCed/src-images/Refresh.png b/wxPython/wx/tools/XRCed/src-images/Refresh.png index 8180432feb..6d192f8f1b 100644 Binary files a/wxPython/wx/tools/XRCed/src-images/Refresh.png and b/wxPython/wx/tools/XRCed/src-images/Refresh.png differ diff --git a/wxPython/wx/tools/XRCed/src-images/Test.png b/wxPython/wx/tools/XRCed/src-images/Test.png index c6e7816f4a..f8b4c45252 100644 Binary files a/wxPython/wx/tools/XRCed/src-images/Test.png and b/wxPython/wx/tools/XRCed/src-images/Test.png differ diff --git a/wxPython/wx/tools/XRCed/src-images/ToolMoveDown.png b/wxPython/wx/tools/XRCed/src-images/ToolMoveDown.png index f0dc4bc303..b78bc2f232 100644 Binary files a/wxPython/wx/tools/XRCed/src-images/ToolMoveDown.png and b/wxPython/wx/tools/XRCed/src-images/ToolMoveDown.png differ diff --git a/wxPython/wx/tools/XRCed/src-images/ToolMoveLeft.png b/wxPython/wx/tools/XRCed/src-images/ToolMoveLeft.png index 94b32fd672..99eb248ed0 100644 Binary files a/wxPython/wx/tools/XRCed/src-images/ToolMoveLeft.png and b/wxPython/wx/tools/XRCed/src-images/ToolMoveLeft.png differ diff --git a/wxPython/wx/tools/XRCed/src-images/ToolMoveRight.png b/wxPython/wx/tools/XRCed/src-images/ToolMoveRight.png index 05f4dd4bc0..7b0a7ce28a 100644 Binary files a/wxPython/wx/tools/XRCed/src-images/ToolMoveRight.png and b/wxPython/wx/tools/XRCed/src-images/ToolMoveRight.png differ diff --git a/wxPython/wx/tools/XRCed/src-images/ToolMoveUp.png b/wxPython/wx/tools/XRCed/src-images/ToolMoveUp.png index 01d2883606..bac5995201 100644 Binary files a/wxPython/wx/tools/XRCed/src-images/ToolMoveUp.png and b/wxPython/wx/tools/XRCed/src-images/ToolMoveUp.png differ diff --git a/wxPython/wx/tools/XRCed/tools.py b/wxPython/wx/tools/XRCed/tools.py index 45687f850a..f2db30528c 100644 --- a/wxPython/wx/tools/XRCed/tools.py +++ b/wxPython/wx/tools/XRCed/tools.py @@ -16,7 +16,6 @@ GROUP_WINDOWS, GROUP_MENUS, GROUP_SIZERS, GROUP_CONTROLS = range(GROUPNUM) # States depending on current selection and Control/Shift keys STATE_ROOT, STATE_MENUBAR, STATE_TOOLBAR, STATE_MENU, STATE_STDDLGBTN, STATE_ELSE = range(6) - # Left toolbar for GUI elements class Tools(wx.Panel): TOOL_SIZE = (30, 30) @@ -97,17 +96,18 @@ class Tools(wx.Panel): self.SetSizeHints(self.GetSize()[0], -1) # Events 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_UP(self, self.OnKeyUp) def AddButton(self, id, image, text): from wx.lib import buttons 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) wx.EVT_KEY_DOWN(button, self.OnKeyDown) wx.EVT_KEY_UP(button, self.OnKeyUp) + wx.EVT_RIGHT_DOWN(button, self.OnRightClick) button.SetToolTipString(text) self.curSizer.Add(button) self.groups[-1][1][id] = button @@ -160,6 +160,22 @@ class Tools(wx.Panel): else: box.SetLabel('[-] ' + box.name) 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 def OnKeyDown(self, evt): if evt.GetKeyCode() == wx.WXK_CONTROL: diff --git a/wxPython/wx/tools/XRCed/tree.py b/wxPython/wx/tools/XRCed/tree.py index f384b15da5..d287a1d33a 100644 --- a/wxPython/wx/tools/XRCed/tree.py +++ b/wxPython/wx/tools/XRCed/tree.py @@ -11,6 +11,12 @@ import traceback # Constant to define standart window name STD_NAME = '_XRCED_T_W' +COLOUR_COMMENT = 'Blue' +COLOUR_REF = 'DarkGreen' +COLOUR_HIDDEN = 'Grey' +COLOUR_HL = 'Red' +COLOUR_DT = 'Green' + # Icons import images @@ -412,20 +418,24 @@ def SetMenu(m, list, shift=False): ################################################################################ class HighLightBox: + colour = None 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.height == -1: size.height = 0 w = g.testWin.panel 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.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.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.SetBackgroundColour(wx.RED) + l4.SetBackgroundColour(self.colour) self.lines = [l1, l2, l3, l4] self.size = size + g.testWin.highLight = self # Move highlight to a new position def Replace(self, pos, size): if size.width == -1: size.width = 0 @@ -442,6 +452,42 @@ class HighLightBox: def Refresh(self): 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): @@ -555,6 +601,7 @@ class XML_Tree(wx.TreeCtrl): self.rootObj = xxxMainNode(self.dom) self.root = self.AddRoot('XML tree', self.rootImage, data=wx.TreeItemData(self.rootObj)) + self.itemColour = self.GetItemTextColour(self.root) self.SetItemHasChildren(self.root) nodes = self.mainNode.childNodes[:] for node in nodes: @@ -587,12 +634,12 @@ class XML_Tree(wx.TreeCtrl): data=wx.TreeItemData(xxx)) # Different color for comments and references if xxx.className == 'comment': - self.SetItemTextColour(item, 'Blue') + self.SetItemTextColour(item, COLOUR_COMMENT) self.SetItemFont(item, self.fontComment) elif treeObj.ref: - self.SetItemTextColour(item, 'DarkGreen') + self.SetItemTextColour(item, COLOUR_REF) elif treeObj.hasStyle and treeObj.params.get('hidden', False): - self.SetItemTextColour(item, 'Grey') + self.SetItemTextColour(item, COLOUR_HIDDEN) # Try to find children objects if treeObj.hasChildren: nodes = treeObj.node.childNodes[:] @@ -623,12 +670,12 @@ class XML_Tree(wx.TreeCtrl): treeObj = xxx.treeObject() # Different color for references and comments if xxx.className == 'comment': - self.SetItemTextColour(newItem, 'Blue') + self.SetItemTextColour(newItem, COLOUR_COMMENT) self.SetItemFont(newItem, self.fontComment) elif treeObj.ref: - self.SetItemTextColour(newItem, 'DarkGreen') + self.SetItemTextColour(newItem, COLOUR_REF) elif treeObj.hasStyle and treeObj.params.get('hidden', False): - self.SetItemTextColour(newItem, 'Grey') + self.SetItemTextColour(newItem, COLOUR_HIDDEN) # Add children items if xxx.hasChildren: treeObj = xxx.treeObject() @@ -724,6 +771,7 @@ class XML_Tree(wx.TreeCtrl): self.UnselectAll() self.SelectItem(evt.GetItem()) self.selectionChanging = False + g.frame.SetStatusText('') def ChangeSelection(self, item): # Apply changes @@ -731,8 +779,7 @@ class XML_Tree(wx.TreeCtrl): #oldItem = evt.GetOldItem() status = '' oldItem = self.selection - # use GetItemParent as a way to determine if the itemId is still valid - if oldItem and self.GetItemParent(oldItem): + if oldItem: xxx = self.GetPyData(oldItem) # If some data was modified, apply changes if g.panel.IsModified(): @@ -742,7 +789,7 @@ class XML_Tree(wx.TreeCtrl): g.testWin.highLight.Remove() self.needUpdate = True status = 'Changes were applied' - g.frame.SetStatusText(status) + if status: g.frame.SetStatusText(status) # Generate view self.selection = item if not self.selection.IsOk(): @@ -787,18 +834,10 @@ class XML_Tree(wx.TreeCtrl): size = obj.GetSize() # Highlight # Negative positions are not working quite well - hl = g.testWin.highLight # If highlight object has the same size SetDimension does not repaint it # so we must remove the old HL window - if hl and hl.size == size: - hl.Remove() - hl = None - if hl: - hl.Replace(pos, size) - else: - g.testWin.highLight = hl = HighLightBox(pos, size) - hl.Refresh() - hl.item = item + g.testWin.highLight = updateHL(g.testWin.highLight, HighLightBox, pos, size) + g.testWin.highLight.item = item def ShowTestWindow(self, item): xxx = self.GetPyData(item) @@ -906,6 +945,7 @@ class XML_Tree(wx.TreeCtrl): if not g.currentEncoding: xmlFlags != xrc.XRC_USE_LOCALE res = xrc.XmlResource('', xmlFlags) + res.InitAllHandlers() xrc.XmlResource.Set(res) # set as global # Register handlers addHandlers() @@ -997,7 +1037,10 @@ class XML_Tree(wx.TreeCtrl): testWin.item = item wx.EVT_CLOSE(testWin, self.OnCloseTestWin) 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: self.HighLight(highLight) except: @@ -1236,3 +1279,88 @@ class XML_Tree(wx.TreeCtrl): node.data = evt.GetLabel() g.panel.SetData(xxx) 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() + diff --git a/wxPython/wx/tools/XRCed/xrced.py b/wxPython/wx/tools/XRCed/xrced.py index 78c3fc94c7..888062ff13 100644 --- a/wxPython/wx/tools/XRCed/xrced.py +++ b/wxPython/wx/tools/XRCed/xrced.py @@ -303,7 +303,7 @@ class Frame(wx.Frame): # Build interface 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 self.toolsSizer = sizer1 = wx.BoxSizer() splitter = wx.SplitterWindow(self, -1, style=wx.SP_3DSASH) @@ -990,8 +990,9 @@ class Frame(wx.Frame): child = tree.GetNextSibling(child) return None + # Click event after locate activated def OnTestWinLeftDown(self, evt): - pos = evt.GetPosition() + # Restore normal event processing self.SetHandler(g.testWin) g.testWin.Disconnect(wx.ID_ANY, wx.ID_ANY, wx.wxEVT_LEFT_DOWN) item = self.FindObject(g.testWin.item, evt.GetEventObject()) @@ -1103,19 +1104,24 @@ Homepage: http://xrced.sourceforge.net\ parent = tree.GetPyData(parentLeaf) 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? - if evt.GetId() == ID_NEW.REF: + if id == ID_NEW.REF: ref = wx.GetTextFromUser('Create reference to:', 'Create reference') if not ref: return xxx = MakeEmptyRefXXX(parent, ref) - elif evt.GetId() == ID_NEW.COMMENT: + elif id == ID_NEW.COMMENT: xxx = MakeEmptyCommentXXX(parent) else: # Create empty element - if evt.GetId() >= ID_NEW.CUSTOM: - className = pullDownMenu.customMap[evt.GetId()] + if id >= ID_NEW.CUSTOM: + className = pullDownMenu.customMap[id] else: - className = pullDownMenu.createMap[evt.GetId()] + className = pullDownMenu.createMap[id] xxx = MakeEmptyXXX(parent, className) # Insert new node, register undo @@ -1127,17 +1133,21 @@ Homepage: http://xrced.sourceforge.net\ xxx.setTreeName('%s%d' % (defaultIDs[cl], frame.maxIDs[cl])) # And for some other standard controls elif parent.__class__ == xxxStdDialogButtonSizer: - xxx.setTreeName(pullDownMenu.stdButtonIDs[evt.GetId()][0]) - # We can even set label + # ... we can even set automatically tree name + xxx.setTreeName(pullDownMenu.stdButtonIDs[id][0]) obj = xxx.treeObject() + # ... and 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) xxx.treeObject().node.appendChild(elem) - - newItem = tree.InsertNode(parentLeaf, parent, xxx.node, nextItem) - else: # comment node - newItem = tree.InsertNode(parentLeaf, parent, xxx.node, nextItem) + # Else, set label if exists to class name + elif 'label' in xxx.treeObject().allParams: + label = className + 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)) tree.EnsureVisible(newItem) tree.SelectItem(newItem) @@ -1155,6 +1165,7 @@ Homepage: http://xrced.sourceforge.net\ if not xxx.isElement: tree.EditLabel(newItem) self.SetModified() + return xxx # Replace one object with another def OnReplace(self, evt): @@ -1315,10 +1326,10 @@ Homepage: http://xrced.sourceforge.net\ if tree.needUpdate: if conf.autoRefresh: if g.testWin: - self.SetStatusText('Refreshing test window...') + #self.SetStatusText('Refreshing test window...') # (re)create tree.CreateTestWin(g.testWin.item) - self.SetStatusText('') + #self.SetStatusText('') tree.needUpdate = False elif tree.pendingHighLight: try: @@ -1752,7 +1763,7 @@ Please upgrade wxWidgets to %d.%d.%d or higher.''' % MinWxVersion) # Store important data frame.handlers = getHandlers()[:] frame.custom = g.pullDownMenu.custom[:] - frame.modules = set(sys.modules.keys()) + frame.modules = sys.modules.copy() # Initialize frame.Clear() diff --git a/wxPython/wx/tools/XRCed/xrced.xrc b/wxPython/wx/tools/XRCed/xrced.xrc index 14b4191e19..04965a2811 100644 --- a/wxPython/wx/tools/XRCed/xrced.xrc +++ b/wxPython/wx/tools/XRCed/xrced.xrc @@ -622,7 +622,7 @@ - 50,-1 + 30,-1d @@ -657,7 +657,7 @@ - 50,-1 + 30,-1d @@ -685,6 +685,7 @@ always never + wxALL|wxALIGN_CENTRE_HORIZONTAL 5