Moved tools to be a Python package in wxPython.tools, added scripts to
import and launch each tool. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16418 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
#
|
||||
|
||||
|
||||
|
||||
|
74
wxPython/wxPython/tools/XRCed/CHANGES
Normal file
74
wxPython/wxPython/tools/XRCed/CHANGES
Normal file
@@ -0,0 +1,74 @@
|
||||
0.0.7
|
||||
-----
|
||||
|
||||
Some command-line arguments.
|
||||
|
||||
"Test window" command and toolbar button.
|
||||
|
||||
New panel interphace (wxHTMLWindow is not used anymore).
|
||||
|
||||
Toggling between embedded and detached panel.
|
||||
|
||||
Cache for already used windows.
|
||||
|
||||
Current top-level control is bold, if test window shown.
|
||||
|
||||
Undo/redo broken.
|
||||
|
||||
CheckListBox does not work unless wxXRC source fixed (in both wxPytnon and
|
||||
wxWin):
|
||||
|
||||
contrib/src/xrc/xmlrsall.cpp
|
||||
45,46c45,46
|
||||
< AddHandler(new wxListCtrlXmlHandler);
|
||||
< #if CHECKLISTBOX
|
||||
---
|
||||
> AddHandler(new wxListCtrlXmlHandler);
|
||||
> #if wxUSE_CHECKLISTBOX
|
||||
|
||||
|
||||
0.0.6
|
||||
-----
|
||||
|
||||
Toolbar, bitmap, icon support (no display yet).
|
||||
|
||||
Changed parameter objects, added support for multiple parameters (like
|
||||
`growablecols').
|
||||
|
||||
Fixed double-clicking problem with tree control on Windows.
|
||||
|
||||
Some performance improovements.
|
||||
|
||||
|
||||
0.0.5
|
||||
-----
|
||||
|
||||
Added notebook with properties page and style page. Fixed some problems
|
||||
on Windows.
|
||||
|
||||
|
||||
0.0.4
|
||||
-----
|
||||
|
||||
Some fixes suggested by RD
|
||||
|
||||
|
||||
0.0.3
|
||||
-----
|
||||
|
||||
Faster preview window refresh.
|
||||
|
||||
Cut/Paste works better.
|
||||
|
||||
Some tree icons.
|
||||
|
||||
Tree item names.
|
||||
|
||||
Bugfixes.
|
||||
|
||||
|
||||
0.0.2
|
||||
-----
|
||||
|
||||
The first release.
|
||||
|
72
wxPython/wxPython/tools/XRCed/README
Normal file
72
wxPython/wxPython/tools/XRCed/README
Normal file
@@ -0,0 +1,72 @@
|
||||
********************************************************************************
|
||||
|
||||
XRCed README
|
||||
|
||||
********************************************************************************
|
||||
|
||||
Installation on UNIX
|
||||
--------------------
|
||||
|
||||
XRCed requires wxGTK and wxPython greater than 2.3.2, and Python 2.2 (it may
|
||||
work with earlier version, but was not tested).
|
||||
|
||||
Of course wxGTK's XRC library (libwxxrc) must be installed.
|
||||
|
||||
Installation on Windows
|
||||
-----------------------
|
||||
|
||||
Works with wxPython 2.3.2 for Python 2.2.
|
||||
|
||||
Short manual
|
||||
------------
|
||||
|
||||
XRCed's idea is very straightforward: it is a visual tool for editing an XML
|
||||
file conforming to XRC format. Every operation performed in XRCed has direct
|
||||
correspondence to XML structure. So it is not really a usual point-and-click
|
||||
GUI builder, but don't let that scare you.
|
||||
|
||||
To start xrced, change to the directory where you installed it and run
|
||||
"python2.2 xrced.py".
|
||||
|
||||
On UNIX you can edit wrapper script "xrced.sh" to point to your installation
|
||||
directory.
|
||||
|
||||
To create an object, first you should select some object in the tree (or the
|
||||
root item if it's empty) then press the right mouse button and select an
|
||||
appropriate command. The pulldown menu is context-dependent on the selected
|
||||
object.
|
||||
|
||||
XRCed tries to guess if new object should be added as a next sibling or a
|
||||
child of current object, depending on the possibility of the object to have
|
||||
child objects and expanded state (if tree item is collapsed, new object will
|
||||
be sibling). You can change this behavior to create siblings by pressing and
|
||||
holding the Shift and Control keys before clicking the mouse.
|
||||
|
||||
Pressed Control key while pressing right button makes next item a sibling of
|
||||
selected item regardless of its expanded state.
|
||||
|
||||
Pressed Shift key changes the place for inserting new child to be before
|
||||
selected child, not after as by default.
|
||||
|
||||
Panel on the right contains object properties. Properties which are optional
|
||||
should be "checked" first. This panel can be made separate by unchecking
|
||||
"Embed Panel" in View menu.
|
||||
|
||||
All properties can be edited as text, and some are supplied with special
|
||||
editing controls.
|
||||
|
||||
The names of the properties are exactly as in XRC file, and it's usually not
|
||||
hard to guess what they do. XML ID is the name of the window, and must be
|
||||
present for top-level windows (though this is not enforced by XRCed).
|
||||
|
||||
To display the preview window double-click a top-level object (you should
|
||||
assign an XMLID to it first), press "Test" toolbar button or select command
|
||||
from View menu, or press F5. After that, if you select a child object, it
|
||||
becomes highlighted, and if you change it, preview is updated when you select
|
||||
another item or press Ctrl-R (refresh). To turn off automatic update, toggle
|
||||
"View->Auto-refresh" or toolbar auto-refresh button (to the right of the
|
||||
refresh button).
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
Copyright 2001 Roman Rolinsky <rolinsky@mema.ucl.ac.be>
|
29
wxPython/wxPython/tools/XRCed/TODO
Normal file
29
wxPython/wxPython/tools/XRCed/TODO
Normal file
@@ -0,0 +1,29 @@
|
||||
TODO for XRCed
|
||||
==============
|
||||
|
||||
- Undo/Redo
|
||||
|
||||
- menu - accel not displayed in preview
|
||||
|
||||
+ tree icons
|
||||
|
||||
- replace object with another, keeping children
|
||||
|
||||
+ write tmp file for current dialog/panel/etc.
|
||||
|
||||
+ XML indents
|
||||
|
||||
? select same notebook pages after update
|
||||
|
||||
- put some default values in tree ctrl etc.
|
||||
|
||||
- special (fast) update for some values: pos/size, value/content, sizeritem
|
||||
stuff (?), well, as much as possible
|
||||
|
||||
- highlighting with better method
|
||||
|
||||
- import XRC/WXR files
|
||||
|
||||
+ disable some window creation when it's not valid
|
||||
|
||||
- check for memory leaks from wx objects
|
4
wxPython/wxPython/tools/XRCed/__init__.py
Normal file
4
wxPython/wxPython/tools/XRCed/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
||||
#
|
||||
|
||||
|
||||
|
368
wxPython/wxPython/tools/XRCed/images.py
Normal file
368
wxPython/wxPython/tools/XRCed/images.py
Normal file
@@ -0,0 +1,368 @@
|
||||
#----------------------------------------------------------------------
|
||||
# This file was generated by img2py.py
|
||||
#
|
||||
from wxPython.wx import wxBitmapFromXPMData, wxImageFromBitmap
|
||||
import cPickle, zlib
|
||||
|
||||
|
||||
def getIconData():
|
||||
return cPickle.loads(zlib.decompress(
|
||||
'x\xda\x9d\x90\xbb\x0e\xc20\x0cEw\xbe\xc2\x12C\x91"Y-\xa2\x82\xd1\x80\xd45C\
|
||||
\x97\xac\x88\x11\xa4\xf0\xff\x13\xd7Nh\xa0\xcd\x00\xb8y\xf4\xe6\xf8\x95l\xee\
|
||||
\x8fn56\xdb\x1da\xec\xa9kV\x97\xb1\tt\xa5\xd3\xfdr\xbd\x99b\xa8\xf5\xf1\xa0\
|
||||
\x9fi\xa7\xba\x85\rI\xcb\x8bg\x1dU\xf7m\xbf\xeb[\xd3\xfe\xa53\'\xd5\xc3a8O\
|
||||
\xban_@\x0eL10\x07X\xc4iL[\x8e\x8c\x81 \xe1\xc3\xea\x17\xd4/NPct\x85{0N\xcc\
|
||||
\xa5f\xb4\x83\x94\xd6|\xde\x1b\xb2"\x9a\x16\x05\xe6\x10\x81\x08\xe5\x9cZ\x1d\
|
||||
K\xcd\xd4\xed\x04-}\xb9\n\n\x12\xdb\xb0\x99\x0e\xe8\x8f\x17\xf2N~\x81\xe2}"^\
|
||||
\x16\xd0;\x18\xce\x9c\xcb?oP\x9c\xc7t\xf0\xb1\xfd\x13Z&,9z\x0eS:\x04/\x1bB:\
|
||||
\x81Q\x15jM4Z\xaf\x99\xba\xf4\xf5n\xed\x9e\x92\xef)B\x7f\xbem\x81\xfc\x04\
|
||||
\x8f\xd5\x99\xcc' ))
|
||||
|
||||
def getIconBitmap():
|
||||
return wxBitmapFromXPMData(getIconData())
|
||||
|
||||
def getIconImage():
|
||||
return wxImageFromBitmap(getIconBitmap())
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def getNewData():
|
||||
return cPickle.loads(zlib.decompress(
|
||||
"x\xda\xd3\xc8)0\xe4\nV72Q02V0Q0T\xe7J\x0cV\xd7SHVp\xcaIL\xce\x06\xf3\xf2\
|
||||
\x81<eK\x03\x10\x04\xf3\x15\x80|\xbf\xfc\xbcT0'\x02$\xe9f\xe1\xe6\xecf\x01\
|
||||
\x95\xc4\x0e\x06ZR\x0f\n\xb0KF\x80\x01B\x16\x9bd\x84\x1e>\x9d0\xbdX$A\xf2\
|
||||
\xf9\xc3Z\x12\x010%\x15\xf2\x11` S\x82\x1e\x00-\xd9\x8b\xfa" ))
|
||||
|
||||
def getNewBitmap():
|
||||
return wxBitmapFromXPMData(getNewData())
|
||||
|
||||
def getNewImage():
|
||||
return wxImageFromBitmap(getNewBitmap())
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def getOpenData():
|
||||
return cPickle.loads(zlib.decompress(
|
||||
'x\xda\xcd\x92\xb1\n\xc3 \x10\x86\xf7<\xc5A\x07\x0b\x81#IK\xb1\xab\x01\xc7:d\
|
||||
\xb95\x84N\r\xbd\xbe\xff\xd4hb\xb5j\xbb\xb6\xbf\x08~|\xde)\xe2~~\xb4\xd5 \
|
||||
\xba#t\x078A+\xaaq\x10\x08\x13\xa8y\x9cn\x8e\xccB\xbbsc\x87c\xb2\xac\xa5\xee\
|
||||
\x9b\x95a\xe1\x0b\xdf\xaf\x0e\xd8K-\x1d\xd7\x96\x95Tas9\x7f"\x11\xf1\xa3D7\
|
||||
\xf1K[Leh\xe7\x97A"1\xe1\x9a\xfcB\xc8\xb4\r4\xb9\xf4\x8eJ\x92C\xdf\xf2\x99\
|
||||
\xb5\x8f\xab\x8e+9v\x89\xa4\xd4\xc52so\xf2\x95\xcd\xc5/dB~\xfb\x13\xf0\t\x81\
|
||||
T\x87G' ))
|
||||
|
||||
def getOpenBitmap():
|
||||
return wxBitmapFromXPMData(getOpenData())
|
||||
|
||||
def getOpenImage():
|
||||
return wxImageFromBitmap(getOpenBitmap())
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def getSaveData():
|
||||
return cPickle.loads(zlib.decompress(
|
||||
'x\xda\xd3\xc8)0\xe4\nV72Q02V0U0T\xe7J\x0cV\xd7SHVp\xcaIL\xce\x06\xf3\xfc\
|
||||
\x81<eK\x03\x10\x04\xf3#@|\x0b\x03\x0b\x03\x03\x08_\x01\xc8\xf7\xcb\xcfK\x05\
|
||||
s\xf2A\x92n\x16n\xcen\x16PI\xec\x80\xe6\x92z(\x00]2B/\x1f\n\x80L\x7f\xdc\x92\
|
||||
z\xf8$#\xe8&\x19\x01\xf3G\x046I\x04\xc0\xa3\x13\x8f\xb1x\xed$Y\x125\xe4\xd1%\
|
||||
\x15\xfc\x91\x01]R\x02vI=\x00\xd8\x14\x96@' ))
|
||||
|
||||
def getSaveBitmap():
|
||||
return wxBitmapFromXPMData(getSaveData())
|
||||
|
||||
def getSaveImage():
|
||||
return wxImageFromBitmap(getSaveBitmap())
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def getCutData():
|
||||
return cPickle.loads(zlib.decompress(
|
||||
'x\xda\xd3\xc8)0\xe4\nV72Q02V0Q0T\xe7J\x0cV\xd7SHVp\xcaIL\xce\x06\xf3\xf2\
|
||||
\x81<e\x03 \xb00\x00\xf3#@|K\x03\x10\x04\xf3\x15\x80|\xbf\xfc\xbcT(\x07;\xa0\
|
||||
\x96\xa4\x1e^\xc9\x08\x145h\x92z\x102\x02\xab\x9d a\xa0\x1c\x0eI=$9L\xc9\x08\
|
||||
\xb8\xa1\x98^\xd1C\xd2\x88U\x12W \xe4\xe7\xeb\xe5\xe7\xe3\x96\x8c\xc8\xcf\
|
||||
\x87K\xa3H\x82\xc4#\xc0\x08S\x12&\x03B\xe4H\x82\x0c\x8f\x88\xc0j\'H8\x02{\
|
||||
\xf0E \x02\x80\x9a)\x81DI=\x00\x12\xa5\x85\x9f' ))
|
||||
|
||||
def getCutBitmap():
|
||||
return wxBitmapFromXPMData(getCutData())
|
||||
|
||||
def getCutImage():
|
||||
return wxImageFromBitmap(getCutBitmap())
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def getCopyData():
|
||||
return cPickle.loads(zlib.decompress(
|
||||
'x\xda\xc5\x92\xb1\n\xc20\x10\x86\xf7>\xc5\x81C\x9c\x8e\xb4*\xc4\xd5BF3t\xc9\
|
||||
Z\x8a\x93\xc5\xf3\xfd\'\xef.vP\xee\xe6\xfe\t\x81\x9f/\xdf\r!\xc7\xf5\xddwS\
|
||||
\x18\xce0\x9c\xe0\x02}\xe8\xe6) ,p[\xe7\xe5\xa9\x8d\xb8\x1d"\'E\xedE\xfa5\
|
||||
\xca\xd2\x0e\xdc\xef\xf4zh\xa9\x02s\xcacN_hg_\x88\x1a\x0fV\xce/\xfd\x87\x15\
|
||||
\x1d\x88\xbcIc\x9b\x95\xf4 \xcbDl\xb0\x92c\xf2\xf0m\xb2i\xca\xa5\xe2\x98(r1\
|
||||
\x1e\xc11\xa1H\x1c\xb3\xc53\x1b\xdcb\xc16\\\xb2\xdfO\xc0\x0f5t\x92\x06' ))
|
||||
|
||||
def getCopyBitmap():
|
||||
return wxBitmapFromXPMData(getCopyData())
|
||||
|
||||
def getCopyImage():
|
||||
return wxImageFromBitmap(getCopyBitmap())
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def getPasteData():
|
||||
return cPickle.loads(zlib.decompress(
|
||||
'x\xda\xcd\x92\xb1\n\x830\x10\x86w\x9f\xe2\xa0\x83\x85\xc0\x11m\xa1\xe9\x16Z\
|
||||
p\xec\r.YE:U\x9a\xbe\xff\xe4]48x\xe9V\xe8\'\xc2\xfd|\xf7g\x88\x1e\xa7OS\xf5u\
|
||||
{\x86\xf6\x04\x17h\xeaj\xe8k\x84\x11n\xd30\xbeR2\x9c\x0e\x96q6e\x92|\xb5\xf2\
|
||||
\xa4\x1c$w\xae\xbb\xdb%G\xc9\xce\xba\xbc\x0f\x9c\x1f\xf1\xfdL\xc1\xe7\xe5\
|
||||
\xce\xadR\xe7\x0f$2\xaa\x14\x81!\xe0\xb6\xb0I\x8c1"\xab\x90\x86\xbd\xe4\x9e \
|
||||
\x13\xed\xe5\x8a*7ti\x16\n\xd2\x0b\xc6|\x93\xde\xe8\x92\x0f\x95\x97\x8aM\xee\
|
||||
R\xa9)]R\xae\xaf\xd0\x04 \xc6dH\xfbd\x94\xf9\xe9\x9f\x803\xb0L\x99\x05' ))
|
||||
|
||||
def getPasteBitmap():
|
||||
return wxBitmapFromXPMData(getPasteData())
|
||||
|
||||
def getPasteImage():
|
||||
return wxImageFromBitmap(getPasteBitmap())
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def getTestData():
|
||||
return cPickle.loads(zlib.decompress(
|
||||
'x\xda\x95\xd2=\x0b\xc20\x10\x06\xe0\xbd\xbf\xe2\xc0\xa1N\xa1\x1f\n\xba*t\
|
||||
\xf4\x86.\xb7\x96\xe2d\xf1\xfc\xff\x93\xb9$\xcd5M\xa9xY\xf2\xf2\x10r$w\x9c>u\
|
||||
\xd1\x97\xcd\t\x9a\x16\xceP\x97\xc5\xd0\x97\x06F\xb8M\xc3\xf8r\x89l:\xb4\x95\
|
||||
,\x97Q\xf2\xb5\x92\xe52K\xee.\xdd\xbd\xf2\x19l~\xf0\xfb\x19\xc2v\xfd\x81Fj\
|
||||
\x1b\xcd\\9\x12\xd1\x8cD+$f\x0efw\xb4\x8b\xb8D\xb1\xa0nG\xbb\x88\x8a\xde,r@w\
|
||||
4A\x07\x8b\xa3\x01\xb5\x95\xd8V\x86Fm\x03M\xb4\x05\xaaF\xcb1\xb9R_h\xd5\x10f\
|
||||
\xc8\x1c\x15\xd3_\x89&\x8a+\x04$\xff\x14D\xe8-\x9d\x04\xcb\xa4\x94\xcd\x10\
|
||||
\xa2\xd2\xef\x013_\xba\x1d\xa3N' ))
|
||||
|
||||
def getTestBitmap():
|
||||
return wxBitmapFromXPMData(getTestData())
|
||||
|
||||
def getTestImage():
|
||||
return wxImageFromBitmap(getTestBitmap())
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def getRefreshData():
|
||||
return cPickle.loads(zlib.decompress(
|
||||
'x\xda\xad\xd2\xbb\x0e\xc20\x0c\x05\xd0\xbd_q%\x860]\xf5\xc1\x00?\xc0\xc8\
|
||||
\xd2\xc5+Bl\xa8\xed\xffO\xcd\xab\xa9\x01\x17\t\x81\xb3\xc4:\x8a\x15;\xd9?\
|
||||
\xa6\xa6\xea]{@\xdb\xa1C\xe3\xaak\xef\x047\xecNuX1\x87\xcf/\xe3p\x8f\t\x03\
|
||||
\x9e\x8f\xb5\x8f\x8cv|\x83\x0c\xb1\x81^D\xa9BF\x13\xac\xaa1Y\xd8\x88\x89\xc4\
|
||||
\'d\xdal\x94\xd5u\x9f0\x91\x89\xc8d\xa3j\xf7\x9f\xb8t@\x1bY\xae\xfd^6\x9f\
|
||||
\xb0&\xb4\x1c\xa5\x8dQY\xaa\x9a\x8f]\x86\xf1\xda\x8a\x88\x14\xc3O\x1f\x8c3\
|
||||
\x1dNw\xdd' ))
|
||||
|
||||
def getRefreshBitmap():
|
||||
return wxBitmapFromXPMData(getRefreshData())
|
||||
|
||||
def getRefreshImage():
|
||||
return wxImageFromBitmap(getRefreshBitmap())
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def getAutoRefreshData():
|
||||
return cPickle.loads(zlib.decompress(
|
||||
'x\xda\x95\xd2;\x0e\xc20\x0c\x06\xe0\xbd\xa7\xb0\xc4\x10&+-\x1d\xca\x05\x18Y\
|
||||
\xba\xfc+Bl\x08s\xff\x89<\x9c\x12\xc9I\xa5:Cc}\x95#;9\xbf\xbf\xe3\xb0\xbai\
|
||||
\xa6\xe9B3\x8dnx\xac\x0e\xf4\xa4\xd3\xd5\xc7\x95r\n\xf9]>\xaf\x94HD\xef\x97\
|
||||
\xc5g\xe4\x98\xdfB\xe6\xcb\xcf\xed8\x82\x1c\xa3\x83APi\x85\x9c\x0c\xf4\xd7\
|
||||
\x1a\xb3\xc5\r\x9a\xc8\xb4\x87\x9c7\x9d\xb2 \t\x01\x8b\x91\x82\x81U\xebV\x00\
|
||||
\xfd\xb4PC\xb6\xba\x16;ew1w \xed\xb2\xbc)DLY\x1dM\xea\t\x16u@\xe8\\\x19\x95\
|
||||
\xf1w.\xbb\x98i\x05z\xdc\xe17d\x90\x7f\x95\x07\x86\x9f' ))
|
||||
|
||||
def getAutoRefreshBitmap():
|
||||
return wxBitmapFromXPMData(getAutoRefreshData())
|
||||
|
||||
def getAutoRefreshImage():
|
||||
return wxImageFromBitmap(getAutoRefreshBitmap())
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def getTreeDefaultData():
|
||||
return cPickle.loads(zlib.decompress(
|
||||
"x\xda\xd3\xc8)0\xe4\nV74S04Q0U0T\xe7J\x0cV\x8fPHVp\xcaIL\xce\x06\xf3\xfc\
|
||||
\x81<eK\x03K\x13K\x030_\x01\xc8\xf7\xcb\xcfK\x05s\xf4@\x92n\x16n\xcen\x16`~>\
|
||||
\x88\xefb\xe0b\xe2\x02S\x8c\n\xc8\x10\xd4\x83\x80\x08T\xc1|\x10\xf0\xa7\xae\
|
||||
\xa0?\x18\xa0\nF@\x01\x99\x8e'FP\x0f\x00\xdc\x1bL7" ))
|
||||
|
||||
def getTreeDefaultBitmap():
|
||||
return wxBitmapFromXPMData(getTreeDefaultData())
|
||||
|
||||
def getTreeDefaultImage():
|
||||
return wxImageFromBitmap(getTreeDefaultBitmap())
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def getTreeRootData():
|
||||
return cPickle.loads(zlib.decompress(
|
||||
'x\xda\xd3\xc8)0\xe4\nV74S04Q0V0T\xe7J\x0cV\xd7SHVp\xcaIL\xce\x06\xf3"\x80<e\
|
||||
c\x0b\x10\x04\xf3\x15\x80|\xbf\xfc\xbcT(\x07\x15 \x04\xf5\x80\x00Y0\x02\x080\
|
||||
\x04\x15"\xb0i\x8f\x80\xe9\x87\xa8\x86\n\xc2\xf4\xa3\x08\x0e\xa8v\x9c~G\x15\
|
||||
\xd4\x03\x00\x87\xa5@\xc2' ))
|
||||
|
||||
def getTreeRootBitmap():
|
||||
return wxBitmapFromXPMData(getTreeRootData())
|
||||
|
||||
def getTreeRootImage():
|
||||
return wxImageFromBitmap(getTreeRootBitmap())
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def getTreePanelData():
|
||||
return cPickle.loads(zlib.decompress(
|
||||
'x\xda\xd3\xc8)0\xe4\nV74S04Q0Q0T\xe7J\x0cV\xd7SHVp\xcaIL\xce\x06\xf3\xf2\
|
||||
\x81<eK\x03K\x13K\x030_\x01\xc4w\xb3psv\xb3\x00\xf3#@|\x17\x03\x17\x13\x17\
|
||||
\x98<\n\xd0\x83\x08F \x83\xfca+\x98\x8f\x02 \x82zh\x00(\xa8\x07\x00&\x96e\
|
||||
\x83' ))
|
||||
|
||||
def getTreePanelBitmap():
|
||||
return wxBitmapFromXPMData(getTreePanelData())
|
||||
|
||||
def getTreePanelImage():
|
||||
return wxImageFromBitmap(getTreePanelBitmap())
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def getTreeDialogData():
|
||||
return cPickle.loads(zlib.decompress(
|
||||
'x\xda\xd3\xc8)0\xe4\nV74S\x00"\x13\x05Cu\xae\xc4`u\x05\x85d\x05\xa7\x9c\xc4\
|
||||
\xe4l0/\x1f\xc8S\xb64\xb04\xb14\x00\xf3\xf5@|\x03 p\xb3\x00\xf3#@|\x17\x03\
|
||||
\x17\x13\x17\x03\xa8nT\x00\x11\xd4C\x01$\x0bb53\x02\x05\x0c\x98`>1\x82\xf9`@\
|
||||
\xc8LLo\xea\x01\x00\xb5\x9cde' ))
|
||||
|
||||
def getTreeDialogBitmap():
|
||||
return wxBitmapFromXPMData(getTreeDialogData())
|
||||
|
||||
def getTreeDialogImage():
|
||||
return wxImageFromBitmap(getTreeDialogBitmap())
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def getTreeFrameData():
|
||||
return cPickle.loads(zlib.decompress(
|
||||
'x\xda\xd3\xc8)0\xe4\nV74S\x00"c\x05Cu\xae\xc4`u\x05\x85d\x05\xa7\x9c\xc4\
|
||||
\xe4l0O\x0f\xc8S6\x00\x027\x0b0?\x02\xc4w1p1q1\x80\xaaF\x05\x10A=\x14@\xb2 V\
|
||||
3#P\xc0p\x10\xc4\xf4\xa6\x1e\x00\xe3\x8f`,' ))
|
||||
|
||||
def getTreeFrameBitmap():
|
||||
return wxBitmapFromXPMData(getTreeFrameData())
|
||||
|
||||
def getTreeFrameImage():
|
||||
return wxImageFromBitmap(getTreeFrameBitmap())
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def getTreeMenuBarData():
|
||||
return cPickle.loads(zlib.decompress(
|
||||
'x\xda\xd3\xc8)0\xe4\nV74S\x00"S\x05Cu\xae\xc4`\xf5\x08\x85d\x05\xa7\x9c\xc4\
|
||||
\xe4l0\xcf\x1f\xc8S\xb64\xb04\xb14\x00\xf3\x15\x80|\xbf\xfc\xbcT0G\x0f$\xe9f\
|
||||
\xe1\xe6\xecf\x01\xe6\xe7\x83\xf8.\x06.&.0\xc5\xa8\x80\x1a\x82z\xa8 \x02"\
|
||||
\x98\x8f\x0c\xfca\x82\xfe \x00#I\x17\xc4b\xa6?*\x80\x08F\xa0\x01\x1a\xf9]\
|
||||
\x0f\x00\x9b\xde`\xb2' ))
|
||||
|
||||
def getTreeMenuBarBitmap():
|
||||
return wxBitmapFromXPMData(getTreeMenuBarData())
|
||||
|
||||
def getTreeMenuBarImage():
|
||||
return wxImageFromBitmap(getTreeMenuBarBitmap())
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def getTreeToolBarData():
|
||||
return cPickle.loads(zlib.decompress(
|
||||
'x\xda\xd3\xc8)0\xe4\nV74S\x00"\x0b\x05Cu\xae\xc4`\xf5\x08\x85d\x05\xa7\x9c\
|
||||
\xc4\xe4l0\xcf\x1f\xc8S\xb64\xb04\xb14\x00\xf3\x1d@|7\x0b7g\x03\x08_\x19\xc4\
|
||||
70\x80\xf3\x15\x80|\xbf\xfc\xbcT0G\x0f\xa6\xd8\xcd\x02\xcc\xd7\x86\xf0\r\x0c\
|
||||
\xa0\x8a\xf3A|\x17\x03\x17\x13\x17\x98fT@\rA=T\x10\x01\x11\xccG\x06\xfe0Am\
|
||||
\xed\x88|\x07\x87\x88|e\xe5\x08\x02\x82\x11\x11\x11p\xec\x8f\xc7L\x7fT\x00\
|
||||
\x11\x8c@\x034\xf2\xbb\x1e\x00\x1c\x05j\x12' ))
|
||||
|
||||
def getTreeToolBarBitmap():
|
||||
return wxBitmapFromXPMData(getTreeToolBarData())
|
||||
|
||||
def getTreeToolBarImage():
|
||||
return wxImageFromBitmap(getTreeToolBarBitmap())
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def getTreeMenuData():
|
||||
return cPickle.loads(zlib.decompress(
|
||||
'x\xda\xd3\xc8)0\xe4\nV74S\x00"S\x05Cu\xae\xc4`\xf5\x08\x85d\x05\xa7\x9c\xc4\
|
||||
\xe4l0\xcf\x1f\xc8S\xb64\xb04\xb14\x00\xf3\x15\x80|\xbf\xfc\xbcT0G\x0f$\xe9f\
|
||||
\xe1\xe6\xecf\x01\xe6\xe7\x83\xf8.\x06.&.0\xc5\nzp\x10\xa1\xa0\x00\x17\xcc\
|
||||
\x87\x02\x7f\x14A\x7f0 [p(\x9b\xe9\x0f\x03H\x82\x11\x08\x00\x16\xd4\x03\x00&\
|
||||
sj\xf9' ))
|
||||
|
||||
def getTreeMenuBitmap():
|
||||
return wxBitmapFromXPMData(getTreeMenuData())
|
||||
|
||||
def getTreeMenuImage():
|
||||
return wxImageFromBitmap(getTreeMenuBitmap())
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def getTreeSizerHData():
|
||||
return cPickle.loads(zlib.decompress(
|
||||
'x\xda\xd3\xc8)0\xe4\nV74S\x00"#\x05Cu\xae\xc4`u=\x85d\x05e3\x033\x133\x030_\
|
||||
\x01\xc8\xf7\xcb\xcfK\x85rP\x01\xa9\x82z\xa8\x00*\x08Q\x01\xa3\x06\xaf 6\xc7\
|
||||
S\x12 z\x00\xf8\xc9>T' ))
|
||||
|
||||
def getTreeSizerHBitmap():
|
||||
return wxBitmapFromXPMData(getTreeSizerHData())
|
||||
|
||||
def getTreeSizerHImage():
|
||||
return wxImageFromBitmap(getTreeSizerHBitmap())
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def getTreeSizerVData():
|
||||
return cPickle.loads(zlib.decompress(
|
||||
'x\xda\xd3\xc8)0\xe4\nV74S\x00"#\x05Cu\xae\xc4`u=\x85d\x05e3\x033\x133\x030_\
|
||||
\x01\xc8\xf7\xcb\xcfK\x85r\x14\x14\xf4`\x00\xc8F\x08*@\xc0\x00\t\x0e\x11\'!\
|
||||
\x03\xa0\xa0\x1e\x00\xfaC>*' ))
|
||||
|
||||
def getTreeSizerVBitmap():
|
||||
return wxBitmapFromXPMData(getTreeSizerVData())
|
||||
|
||||
def getTreeSizerVImage():
|
||||
return wxImageFromBitmap(getTreeSizerVBitmap())
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def getTreeStaticBoxSizerHData():
|
||||
return cPickle.loads(zlib.decompress(
|
||||
'x\xda\xd3\xc8)0\xe4\nV74S\x00"c\x05Cu\xae\xc4`u=\x85d\x05\xa7\x9c\xc4\xe4l0\
|
||||
/\x02\xc8S630313\x00\xf3\x15\x80|\xbf\xfc\xbcT(\x07\x15\xc0\x05\xf5\xb0\x08\
|
||||
\xea!\x8bB\x04#\x14\xf4\xf4\xf4\x14"`\x00.\x08R\x19\x01Q\x08\x17\x84\xf0\x06\
|
||||
\x93 *\xc0\x1f \xc4\x08\xea\x01\x00\x0b\xa9Jm' ))
|
||||
|
||||
def getTreeStaticBoxSizerHBitmap():
|
||||
return wxBitmapFromXPMData(getTreeStaticBoxSizerHData())
|
||||
|
||||
def getTreeStaticBoxSizerHImage():
|
||||
return wxImageFromBitmap(getTreeStaticBoxSizerHBitmap())
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def getTreeStaticBoxSizerVData():
|
||||
return cPickle.loads(zlib.decompress(
|
||||
'x\xda\xd3\xc8)0\xe4\nV74S\x00"c\x05Cu\xae\xc4`u=\x85d\x05\xa7\x9c\xc4\xe4l0\
|
||||
/\x02\xc8S630313\x00\xf3\x15\x80|\xbf\xfc\xbcT(\x07\x0c\xf4\xa0\xb4\x02\x92\
|
||||
\xa0\x1e\\\x14.\x18\xa1\xa0\xa7\xa7\xa7\x10\x11\x11\x81&\x08V\x89&\x08\x01\
|
||||
\xb4\x17\x84\x81\xc1`\xbb\x1e\x00U+IU' ))
|
||||
|
||||
def getTreeStaticBoxSizerVBitmap():
|
||||
return wxBitmapFromXPMData(getTreeStaticBoxSizerVData())
|
||||
|
||||
def getTreeStaticBoxSizerVImage():
|
||||
return wxImageFromBitmap(getTreeStaticBoxSizerVBitmap())
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def getTreeSizerGridData():
|
||||
return cPickle.loads(zlib.decompress(
|
||||
'x\xda\xd3\xc8)0\xe4\nV74S\x00"#\x05Cu\xae\xc4`u=\x85d\x05e3\x033\x133\x030_\
|
||||
\x01\xc8\xf7\xcb\xcfK\x85p\xf4P\x01TP\x01\x0c`\x14\xbd\x05\x87\x88\x93\xd0\
|
||||
\x00PP\x0f\x00!\xb1?\xce' ))
|
||||
|
||||
def getTreeSizerGridBitmap():
|
||||
return wxBitmapFromXPMData(getTreeSizerGridData())
|
||||
|
||||
def getTreeSizerGridImage():
|
||||
return wxImageFromBitmap(getTreeSizerGridBitmap())
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def getTreeSizerFlexGridData():
|
||||
return cPickle.loads(zlib.decompress(
|
||||
'x\xda\xd3\xc8)0\xe4\nV74S\x00"#\x05Cu\xae\xc4`u=\x85d\x05e3\x033\x133\x030_\
|
||||
\x01\xc8\xf7\xcb\xcfK\x85p\xf4P\x01TP\x01\x08\xc0\x04\x98A\x1dA\xbaYD/\xc7\
|
||||
\xa3\x01\xa0\xa0\x1e\x00>\x91?\xce' ))
|
||||
|
||||
def getTreeSizerFlexGridBitmap():
|
||||
return wxBitmapFromXPMData(getTreeSizerFlexGridData())
|
||||
|
||||
def getTreeSizerFlexGridImage():
|
||||
return wxImageFromBitmap(getTreeSizerFlexGridBitmap())
|
||||
|
722
wxPython/wxPython/tools/XRCed/params.py
Normal file
722
wxPython/wxPython/tools/XRCed/params.py
Normal file
@@ -0,0 +1,722 @@
|
||||
# Name: params.py
|
||||
# Purpose: Classes for parameter introduction
|
||||
# Author: Roman Rolinsky <rolinsky@mema.ucl.ac.be>
|
||||
# Created: 22.08.2001
|
||||
# RCS-ID: $Id$
|
||||
|
||||
from wxPython.wx import *
|
||||
from wxPython.xrc import *
|
||||
import string
|
||||
import os.path
|
||||
from types import *
|
||||
|
||||
# Object which is currently processed
|
||||
currentXXX = None
|
||||
def SetCurrentXXX(xxx):
|
||||
global currentXXX
|
||||
currentXXX = xxx
|
||||
|
||||
genericStyles = ['wxSIMPLE_BORDER', 'wxDOUBLE_BORDER',
|
||||
'wxSUNKEN_BORDER', 'wxRAISED_BORDER',
|
||||
'wxSTATIC_BORDER', 'wxNO_BORDER',
|
||||
'wxTRANSPARENT_WINDOW', 'wxWANTS_CHARS',
|
||||
'wxNO_FULL_REPAINT_ON_RESIZE']
|
||||
|
||||
buttonSize = (55,-1)
|
||||
|
||||
# Class that can properly disable children
|
||||
class PPanel(wxPanel):
|
||||
def __init__(self, parent, name):
|
||||
wxPanel.__init__(self, parent, -1, name=name)
|
||||
self.modified = self.freeze = false
|
||||
def Enable(self, value):
|
||||
# Something strange is going on with enable so we make sure...
|
||||
for w in self.GetChildren():
|
||||
w.Enable(value)
|
||||
wxPanel.Enable(self, value)
|
||||
def SetModified(self):
|
||||
self.modified = true
|
||||
panel.SetModified(true)
|
||||
|
||||
class ParamBinaryOr(PPanel):
|
||||
def __init__(self, parent, name):
|
||||
PPanel.__init__(self, parent, name)
|
||||
self.ID_TEXT_CTRL = wxNewId()
|
||||
self.ID_BUTTON_CHOICES = wxNewId()
|
||||
self.SetBackgroundColour(panel.GetBackgroundColour())
|
||||
sizer = wxBoxSizer()
|
||||
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(200,-1))
|
||||
sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 5)
|
||||
self.button = wxButton(self, self.ID_BUTTON_CHOICES, 'Edit...', size=buttonSize)
|
||||
sizer.Add(self.button, 0, wxALIGN_CENTER_VERTICAL)
|
||||
self.SetAutoLayout(true)
|
||||
self.SetSizer(sizer)
|
||||
sizer.Fit(self)
|
||||
EVT_BUTTON(self, self.ID_BUTTON_CHOICES, self.OnButtonChoices)
|
||||
EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
|
||||
def OnChange(self, evt):
|
||||
if self.freeze: return
|
||||
self.SetModified()
|
||||
evt.Skip()
|
||||
def GetValue(self):
|
||||
return self.text.GetValue()
|
||||
def SetValue(self, value):
|
||||
self.freeze = true
|
||||
self.text.SetValue(value)
|
||||
self.freeze = false
|
||||
def OnButtonChoices(self, evt):
|
||||
dlg = wxDialog(self, -1, 'Choices')
|
||||
topSizer = wxBoxSizer(wxVERTICAL)
|
||||
listBox = wxCheckListBox(dlg, -1, choices=self.values, size=(250,200))
|
||||
value = map(string.strip, string.split(self.text.GetValue(), '|'))
|
||||
if value == ['']: value = []
|
||||
ignored = []
|
||||
for i in value:
|
||||
try:
|
||||
listBox.Check(self.values.index(i))
|
||||
except ValueError:
|
||||
# Try to find equal
|
||||
if self.equal.has_key(i):
|
||||
listBox.Check(self.values.index(self.equal[i]))
|
||||
else:
|
||||
print 'WARNING: unknown flag: %s: ignored.' % i
|
||||
ignored.append(i)
|
||||
topSizer.Add(listBox, 1, wxEXPAND)
|
||||
sizer = wxBoxSizer()
|
||||
buttonOk = wxButton(dlg, wxID_OK, 'OK')
|
||||
buttonOk.SetDefault()
|
||||
sizer.Add(buttonOk, 0, wxRIGHT, 10)
|
||||
sizer.Add(0, 0, 1)
|
||||
sizer.Add(wxButton(dlg, wxID_CANCEL, 'Cancel'))
|
||||
topSizer.Add(sizer, 0, wxALL | wxEXPAND, 10)
|
||||
dlg.SetAutoLayout(true)
|
||||
dlg.SetSizer(topSizer)
|
||||
topSizer.Fit(dlg)
|
||||
dlg.Center()
|
||||
if dlg.ShowModal() == wxID_OK:
|
||||
value = []
|
||||
for i in range(listBox.Number()):
|
||||
if listBox.IsChecked(i):
|
||||
value.append(self.values[i])
|
||||
# Add ignored flags
|
||||
value.extend(ignored)
|
||||
if value:
|
||||
self.SetValue(reduce(lambda a,b: a+'|'+b, value))
|
||||
else:
|
||||
self.SetValue('')
|
||||
self.SetModified()
|
||||
dlg.Destroy()
|
||||
|
||||
class ParamFlag(ParamBinaryOr):
|
||||
values = ['wxTOP', 'wxBOTTOM', 'wxLEFT', 'wxRIGHT', 'wxALL',
|
||||
'wxEXPAND', 'wxSHAPED', 'wxALIGN_CENTRE', 'wxALIGN_RIGHT',
|
||||
'wxALIGN_BOTTOM', 'wxALIGN_CENTRE_VERTICAL',
|
||||
'wxALIGN_CENTRE_HORIZONTAL']
|
||||
equal = {'wxALIGN_CENTER': 'wxALIGN_CENTRE',
|
||||
'wxALIGN_CENTER_VERTICAL': 'wxALIGN_CENTRE_VERTICAL',
|
||||
'wxALIGN_CENTER_HORIZONTAL': 'wxALIGN_CENTRE_HORIZONTAL'}
|
||||
def __init__(self, parent, name):
|
||||
ParamBinaryOr.__init__(self, parent, name)
|
||||
|
||||
class ParamStyle(ParamBinaryOr):
|
||||
equal = {'wxALIGN_CENTER': 'wxALIGN_CENTRE'}
|
||||
def __init__(self, parent, name):
|
||||
self.values = currentXXX.winStyles + genericStyles
|
||||
ParamBinaryOr.__init__(self, parent, name)
|
||||
|
||||
class ParamNonGenericStyle(ParamBinaryOr):
|
||||
def __init__(self, parent, name):
|
||||
self.values = currentXXX.winStyles
|
||||
ParamBinaryOr.__init__(self, parent, name)
|
||||
|
||||
class ParamExStyle(ParamBinaryOr):
|
||||
def __init__(self, parent, name):
|
||||
if currentXXX:
|
||||
self.values = currentXXX.exStyles # constant at the moment
|
||||
else:
|
||||
self.values = []
|
||||
ParamBinaryOr.__init__(self, parent, name)
|
||||
|
||||
class ParamColour(PPanel):
|
||||
def __init__(self, parent, name):
|
||||
PPanel.__init__(self, parent, name)
|
||||
self.ID_TEXT_CTRL = wxNewId()
|
||||
self.ID_BUTTON = wxNewId()
|
||||
self.SetBackgroundColour(panel.GetBackgroundColour())
|
||||
sizer = wxBoxSizer()
|
||||
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=(65,-1))
|
||||
sizer.Add(self.text, 0, wxRIGHT, 5)
|
||||
self.button = wxPanel(self, self.ID_BUTTON, wxDefaultPosition, wxSize(40, -1))
|
||||
sizer.Add(self.button, 0, wxGROW)
|
||||
self.SetAutoLayout(true)
|
||||
self.SetSizer(sizer)
|
||||
sizer.Fit(self)
|
||||
self.textModified = false
|
||||
EVT_PAINT(self.button, self.OnPaintButton)
|
||||
EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
|
||||
EVT_LEFT_DOWN(self.button, self.OnLeftDown)
|
||||
def GetValue(self):
|
||||
return self.text.GetValue()
|
||||
def SetValue(self, value):
|
||||
self.freeze = true
|
||||
if not value: value = '#FFFFFF'
|
||||
self.text.SetValue(str(value)) # update text ctrl
|
||||
colour = wxColour(int(value[1:3], 16), int(value[3:5], 16), int(value[5:7], 16))
|
||||
self.button.SetBackgroundColour(colour)
|
||||
self.button.Refresh()
|
||||
self.freeze = false
|
||||
def OnChange(self, evt):
|
||||
if self.freeze: return
|
||||
self.SetModified()
|
||||
evt.Skip()
|
||||
def OnPaintButton(self, evt):
|
||||
dc = wxPaintDC(self.button)
|
||||
dc.SetBrush(wxTRANSPARENT_BRUSH)
|
||||
if self.IsEnabled(): dc.SetPen(wxBLACK_PEN)
|
||||
else: dc.SetPen(wxGREY_PEN)
|
||||
size = self.button.GetSize()
|
||||
dc.DrawRectangle(0, 0, size.x, size.y)
|
||||
def OnLeftDown(self, evt):
|
||||
data = wxColourData()
|
||||
data.SetColour(self.GetValue())
|
||||
dlg = wxColourDialog(self, data)
|
||||
if dlg.ShowModal() == wxID_OK:
|
||||
self.SetValue('#%02X%02X%02X' % dlg.GetColourData().GetColour().Get())
|
||||
self.SetModified()
|
||||
dlg.Destroy()
|
||||
|
||||
################################################################################
|
||||
|
||||
# Mapping from wx constants ro XML strings
|
||||
fontFamiliesWx2Xml = {wxDEFAULT: 'default', wxDECORATIVE: 'decorative',
|
||||
wxROMAN: 'roman', wxSCRIPT: 'script', wxSWISS: 'swiss',
|
||||
wxMODERN: 'modern'}
|
||||
fontStylesWx2Xml = {wxNORMAL: 'normal', wxSLANT: 'slant', wxITALIC: 'italic'}
|
||||
fontWeightsWx2Xml = {wxNORMAL: 'normal', wxLIGHT: 'light', wxBOLD: 'bold'}
|
||||
def ReverseMap(m):
|
||||
rm = {}
|
||||
for k,v in m.items(): rm[v] = k
|
||||
return rm
|
||||
fontFamiliesXml2wx = ReverseMap(fontFamiliesWx2Xml)
|
||||
fontStylesXml2wx = ReverseMap(fontStylesWx2Xml)
|
||||
fontWeightsXml2wx = ReverseMap(fontWeightsWx2Xml)
|
||||
|
||||
class ParamFont(PPanel):
|
||||
def __init__(self, parent, name):
|
||||
PPanel.__init__(self, parent, name)
|
||||
self.ID_TEXT_CTRL = wxNewId()
|
||||
self.ID_BUTTON_SELECT = wxNewId()
|
||||
self.SetBackgroundColour(panel.GetBackgroundColour())
|
||||
sizer = wxBoxSizer()
|
||||
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(200,-1))
|
||||
sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 5)
|
||||
self.button = wxButton(self, self.ID_BUTTON_SELECT, 'Select...', size=buttonSize)
|
||||
sizer.Add(self.button, 0, wxALIGN_CENTER_VERTICAL)
|
||||
self.SetAutoLayout(true)
|
||||
self.SetSizer(sizer)
|
||||
sizer.Fit(self)
|
||||
self.textModified = false
|
||||
EVT_BUTTON(self, self.ID_BUTTON_SELECT, self.OnButtonSelect)
|
||||
EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
|
||||
def OnChange(self, evt):
|
||||
if self.freeze: return
|
||||
self.SetModified()
|
||||
self.textModified = true
|
||||
evt.Skip()
|
||||
def _defaultValue(self):
|
||||
return ['12', 'default', 'normal', 'normal', '0', '', '']
|
||||
def GetValue(self):
|
||||
if self.textModified: # text has newer value
|
||||
try:
|
||||
return eval(self.text.GetValue())
|
||||
except SyntaxError:
|
||||
wxLogError('Syntax error in parameter value: ' + self.GetName())
|
||||
return self._defaultValue()
|
||||
return self.value
|
||||
def SetValue(self, value):
|
||||
self.freeze = true # disable other handlers
|
||||
if not value: value = self._defaultValue()
|
||||
self.value = value
|
||||
self.text.SetValue(str(value)) # update text ctrl
|
||||
self.freeze = false
|
||||
def OnButtonSelect(self, evt):
|
||||
if self.textModified: # text has newer value
|
||||
try:
|
||||
self.value = eval(self.text.GetValue())
|
||||
except SyntaxError:
|
||||
wxLogError('Syntax error in parameter value: ' + self.GetName())
|
||||
self.value = self._defaultValue()
|
||||
# Make initial font
|
||||
# Default values
|
||||
size = 12
|
||||
family = wxDEFAULT
|
||||
style = weight = wxNORMAL
|
||||
underlined = 0
|
||||
face = ''
|
||||
enc = wxFONTENCODING_DEFAULT
|
||||
# Fall back to default if exceptions
|
||||
error = false
|
||||
try:
|
||||
try: size = int(self.value[0])
|
||||
except ValueError: error = true
|
||||
try: family = fontFamiliesXml2wx[self.value[1]]
|
||||
except KeyError: error = true
|
||||
try: style = fontStylesXml2wx[self.value[2]]
|
||||
except KeyError: error = true
|
||||
try: weight = fontWeightsXml2wx[self.value[3]]
|
||||
except KeyError: error = true
|
||||
try: underlined = int(self.value[4])
|
||||
except ValueError: error = true
|
||||
face = self.value[5]
|
||||
mapper = wxFontMapper()
|
||||
if not self.value[6]: enc = mapper.CharsetToEncoding(self.value[6])
|
||||
except IndexError:
|
||||
error = true
|
||||
if error: wxLogError('Invalid font specification')
|
||||
if enc == wxFONTENCODING_DEFAULT: enc = wxFONTENCODING_SYSTEM
|
||||
font = wxFont(size, family, style, weight, underlined, face, enc)
|
||||
data = wxFontData()
|
||||
data.SetInitialFont(font)
|
||||
dlg = wxFontDialog(self, data)
|
||||
if dlg.ShowModal() == wxID_OK:
|
||||
font = dlg.GetFontData().GetChosenFont()
|
||||
value = [str(font.GetPointSize()),
|
||||
fontFamiliesWx2Xml.get(font.GetFamily(), "default"),
|
||||
fontStylesWx2Xml.get(font.GetStyle(), "normal"),
|
||||
fontWeightsWx2Xml.get(font.GetWeight(), "normal"),
|
||||
str(font.GetUnderlined()),
|
||||
font.GetFaceName(),
|
||||
wxFontMapper_GetEncodingName(font.GetEncoding())
|
||||
]
|
||||
# Add ignored flags
|
||||
self.SetValue(value)
|
||||
self.SetModified()
|
||||
self.textModified = false
|
||||
dlg.Destroy()
|
||||
|
||||
################################################################################
|
||||
|
||||
class ParamInt(PPanel):
|
||||
def __init__(self, parent, name):
|
||||
PPanel.__init__(self, parent, name)
|
||||
self.ID_SPIN_CTRL = wxNewId()
|
||||
sizer = wxBoxSizer()
|
||||
self.spin = wxSpinCtrl(self, self.ID_SPIN_CTRL, size=wxSize(50,-1))
|
||||
self.SetBackgroundColour(panel.GetBackgroundColour())
|
||||
sizer.Add(self.spin)
|
||||
self.SetAutoLayout(true)
|
||||
self.SetSizer(sizer)
|
||||
sizer.Fit(self)
|
||||
EVT_SPINCTRL(self, self.ID_SPIN_CTRL, self.OnChange)
|
||||
def GetValue(self):
|
||||
return str(self.spin.GetValue())
|
||||
def SetValue(self, value):
|
||||
self.freeze = true
|
||||
if not value: value = 0
|
||||
self.spin.SetValue(int(value))
|
||||
self.freeze = false
|
||||
def OnChange(self, evt):
|
||||
if self.freeze: return
|
||||
self.SetModified()
|
||||
evt.Skip()
|
||||
|
||||
class ParamText(PPanel):
|
||||
def __init__(self, parent, name, textWidth=200):
|
||||
PPanel.__init__(self, parent, name)
|
||||
self.ID_TEXT_CTRL = wxNewId()
|
||||
# We use sizer even here to have the same size of text control
|
||||
sizer = wxBoxSizer()
|
||||
self.SetBackgroundColour(panel.GetBackgroundColour())
|
||||
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(textWidth,-1))
|
||||
sizer.Add(self.text, 0, wxALIGN_CENTER_VERTICAL)
|
||||
self.SetAutoLayout(true)
|
||||
self.SetSizer(sizer)
|
||||
sizer.Fit(self)
|
||||
EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
|
||||
def GetValue(self):
|
||||
return self.text.GetValue()
|
||||
def SetValue(self, value):
|
||||
self.freeze = true # disable other handlers
|
||||
self.text.SetValue(value)
|
||||
self.freeze = false # disable other handlers
|
||||
def OnChange(self, evt):
|
||||
if self.freeze: return
|
||||
self.SetModified()
|
||||
evt.Skip()
|
||||
|
||||
class ParamAccel(ParamText):
|
||||
def __init__(self, parent, name):
|
||||
ParamText.__init__(self, parent, name, 50)
|
||||
|
||||
class ParamPosSize(ParamText):
|
||||
def __init__(self, parent, name):
|
||||
ParamText.__init__(self, parent, name, 80)
|
||||
|
||||
class ContentDialog(wxDialogPtr):
|
||||
def __init__(self, parent, value):
|
||||
# Is this normal???
|
||||
w = frame.res.LoadDialog(parent, 'DIALOG_CONTENT')
|
||||
wxDialogPtr.__init__(self, w.this)
|
||||
self.thisown = 1
|
||||
self.Center()
|
||||
self.list = self.FindWindowByName('LIST')
|
||||
# Set list items
|
||||
for v in value:
|
||||
self.list.Append(v)
|
||||
self.SetAutoLayout(true)
|
||||
self.GetSizer().Fit(self)
|
||||
# Callbacks
|
||||
self.ID_BUTTON_APPEND = XMLID('BUTTON_APPEND')
|
||||
self.ID_BUTTON_REMOVE = XMLID('BUTTON_REMOVE')
|
||||
self.ID_BUTTON_UP = XMLID('BUTTON_UP')
|
||||
self.ID_BUTTON_DOWN = XMLID('BUTTON_DOWN')
|
||||
EVT_BUTTON(self, self.ID_BUTTON_UP, self.OnButtonUp)
|
||||
EVT_BUTTON(self, self.ID_BUTTON_DOWN, self.OnButtonDown)
|
||||
EVT_BUTTON(self, self.ID_BUTTON_APPEND, self.OnButtonAppend)
|
||||
EVT_BUTTON(self, self.ID_BUTTON_REMOVE, self.OnButtonRemove)
|
||||
EVT_UPDATE_UI(self, self.ID_BUTTON_UP, self.OnUpdateUI)
|
||||
EVT_UPDATE_UI(self, self.ID_BUTTON_DOWN, self.OnUpdateUI)
|
||||
EVT_UPDATE_UI(self, self.ID_BUTTON_REMOVE, self.OnUpdateUI)
|
||||
def OnButtonUp(self, evt):
|
||||
i = self.list.GetSelection()
|
||||
str = self.list.GetString(i)
|
||||
self.list.Delete(i)
|
||||
self.list.InsertItems([str], i-1)
|
||||
self.list.SetSelection(i-1)
|
||||
def OnButtonDown(self, evt):
|
||||
i = self.list.GetSelection()
|
||||
str = self.list.GetString(i)
|
||||
self.list.Delete(i)
|
||||
self.list.InsertItems([str], i+1)
|
||||
self.list.SetSelection(i+1)
|
||||
def OnButtonAppend(self, evt):
|
||||
str = wxGetTextFromUser('Enter new item:', 'Append', '', self)
|
||||
self.list.Append(str)
|
||||
def OnButtonRemove(self, evt):
|
||||
self.list.Delete(self.list.GetSelection())
|
||||
def OnUpdateUI(self, evt):
|
||||
if evt.GetId() == self.ID_BUTTON_REMOVE:
|
||||
evt.Enable(self.list.GetSelection() != -1)
|
||||
elif evt.GetId() == self.ID_BUTTON_UP:
|
||||
evt.Enable(self.list.GetSelection() > 0)
|
||||
elif evt.GetId() == self.ID_BUTTON_DOWN:
|
||||
evt.Enable(self.list.GetSelection() != -1 and \
|
||||
self.list.GetSelection() < self.list.Number() - 1)
|
||||
|
||||
class ContentCheckListDialog(wxDialogPtr):
|
||||
def __init__(self, parent, value):
|
||||
# Is this normal???
|
||||
w = frame.res.LoadDialog(parent, 'DIALOG_CONTENT_CHECK_LIST')
|
||||
wxDialogPtr.__init__(self, w.this)
|
||||
self.thisown = 1
|
||||
self.Center()
|
||||
self.list = self.FindWindowByName('CHECK_LIST')
|
||||
# Set list items
|
||||
i = 0
|
||||
for v,ch in value:
|
||||
self.list.Append(v)
|
||||
self.list.Check(i, ch)
|
||||
i += 1
|
||||
self.SetAutoLayout(true)
|
||||
self.GetSizer().Fit(self)
|
||||
# Callbacks
|
||||
self.ID_BUTTON_APPEND = XMLID('BUTTON_APPEND')
|
||||
self.ID_BUTTON_REMOVE = XMLID('BUTTON_REMOVE')
|
||||
self.ID_BUTTON_UP = XMLID('BUTTON_UP')
|
||||
self.ID_BUTTON_DOWN = XMLID('BUTTON_DOWN')
|
||||
EVT_CHECKLISTBOX(self, self.list.GetId(), self.OnCheck)
|
||||
EVT_BUTTON(self, self.ID_BUTTON_UP, self.OnButtonUp)
|
||||
EVT_BUTTON(self, self.ID_BUTTON_DOWN, self.OnButtonDown)
|
||||
EVT_BUTTON(self, self.ID_BUTTON_APPEND, self.OnButtonAppend)
|
||||
EVT_BUTTON(self, self.ID_BUTTON_REMOVE, self.OnButtonRemove)
|
||||
EVT_UPDATE_UI(self, self.ID_BUTTON_UP, self.OnUpdateUI)
|
||||
EVT_UPDATE_UI(self, self.ID_BUTTON_DOWN, self.OnUpdateUI)
|
||||
EVT_UPDATE_UI(self, self.ID_BUTTON_REMOVE, self.OnUpdateUI)
|
||||
def OnCheck(self, evt):
|
||||
# !!! Wrong wxGTK (wxMSW?) behavior: toggling selection if checking
|
||||
self.list.Deselect(evt.GetSelection())
|
||||
def OnButtonUp(self, evt):
|
||||
i = self.list.GetSelection()
|
||||
str, ch = self.list.GetString(i), self.list.IsChecked(i)
|
||||
self.list.Delete(i)
|
||||
self.list.InsertItems([str], i-1)
|
||||
self.list.Check(i-1, ch)
|
||||
self.list.SetSelection(i-1)
|
||||
def OnButtonDown(self, evt):
|
||||
i = self.list.GetSelection()
|
||||
str, ch = self.list.GetString(i), self.list.IsChecked(i)
|
||||
self.list.Delete(i)
|
||||
self.list.InsertItems([str], i+1)
|
||||
self.list.Check(i+1, ch)
|
||||
self.list.SetSelection(i+1)
|
||||
def OnButtonAppend(self, evt):
|
||||
str = wxGetTextFromUser('Enter new item:', 'Append', '', self)
|
||||
self.list.Append(str)
|
||||
def OnButtonRemove(self, evt):
|
||||
self.list.Delete(self.list.GetSelection())
|
||||
def OnUpdateUI(self, evt):
|
||||
if evt.GetId() == self.ID_BUTTON_REMOVE:
|
||||
evt.Enable(self.list.GetSelection() != -1)
|
||||
elif evt.GetId() == self.ID_BUTTON_UP:
|
||||
evt.Enable(self.list.GetSelection() > 0)
|
||||
elif evt.GetId() == self.ID_BUTTON_DOWN:
|
||||
evt.Enable(self.list.GetSelection() != -1 and \
|
||||
self.list.GetSelection() < self.list.Number() - 1)
|
||||
|
||||
class ParamContent(PPanel):
|
||||
def __init__(self, parent, name):
|
||||
PPanel.__init__(self, parent, name)
|
||||
self.ID_TEXT_CTRL = wxNewId()
|
||||
self.ID_BUTTON_EDIT = wxNewId()
|
||||
self.SetBackgroundColour(panel.GetBackgroundColour())
|
||||
sizer = wxBoxSizer()
|
||||
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(200,-1))
|
||||
sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 5)
|
||||
self.button = wxButton(self, self.ID_BUTTON_EDIT, 'Edit...', size=buttonSize)
|
||||
sizer.Add(self.button, 0, wxALIGN_CENTER_VERTICAL)
|
||||
self.SetAutoLayout(true)
|
||||
self.SetSizer(sizer)
|
||||
sizer.Fit(self)
|
||||
self.textModified = false
|
||||
EVT_BUTTON(self, self.ID_BUTTON_EDIT, self.OnButtonEdit)
|
||||
EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
|
||||
def OnChange(self, evt):
|
||||
if self.freeze: return
|
||||
self.SetModified()
|
||||
self.textModified = true
|
||||
evt.Skip()
|
||||
def GetValue(self):
|
||||
if self.textModified: # text has newer value
|
||||
try:
|
||||
return eval(self.text.GetValue())
|
||||
except SyntaxError:
|
||||
wxLogError('Syntax error in parameter value: ' + self.GetName())
|
||||
return []
|
||||
return self.value
|
||||
def SetValue(self, value):
|
||||
self.freeze = true
|
||||
if not value: value = []
|
||||
self.value = value
|
||||
self.text.SetValue(str(value)) # update text ctrl
|
||||
self.freeze = false
|
||||
def OnButtonEdit(self, evt):
|
||||
if self.textModified: # text has newer value
|
||||
try:
|
||||
self.value = eval(self.text.GetValue())
|
||||
except SyntaxError:
|
||||
wxLogError('Syntax error in parameter value: ' + self.GetName())
|
||||
self.value = []
|
||||
dlg = ContentDialog(self, self.value)
|
||||
if dlg.ShowModal() == wxID_OK:
|
||||
value = []
|
||||
for i in range(dlg.list.Number()):
|
||||
value.append(dlg.list.GetString(i))
|
||||
# Add ignored flags
|
||||
self.SetValue(value)
|
||||
self.SetModified()
|
||||
self.textModified = false
|
||||
dlg.Destroy()
|
||||
|
||||
# CheckList content
|
||||
class ParamContentCheckList(ParamContent):
|
||||
def __init__(self, parent, name):
|
||||
ParamContent.__init__(self, parent, name)
|
||||
def OnButtonEdit(self, evt):
|
||||
if self.textModified: # text has newer value
|
||||
try:
|
||||
self.value = eval(self.text.GetValue())
|
||||
except SyntaxError:
|
||||
wxLogError('Syntax error in parameter value: ' + self.GetName())
|
||||
self.value = []
|
||||
dlg = ContentCheckListDialog(self, self.value)
|
||||
if dlg.ShowModal() == wxID_OK:
|
||||
value = []
|
||||
for i in range(dlg.list.Number()):
|
||||
value.append((dlg.list.GetString(i), dlg.list.IsChecked(i)))
|
||||
# Add ignored flags
|
||||
self.SetValue(value)
|
||||
self.SetModified()
|
||||
self.textModified = false
|
||||
dlg.Destroy()
|
||||
|
||||
class IntListDialog(wxDialogPtr):
|
||||
def __init__(self, parent, value):
|
||||
# Is this normal???
|
||||
w = frame.res.LoadDialog(parent, 'DIALOG_INTLIST')
|
||||
wxDialogPtr.__init__(self, w.this)
|
||||
self.thisown = 1
|
||||
self.Center()
|
||||
self.list = self.FindWindowByName('LIST')
|
||||
# Set list items
|
||||
value.sort()
|
||||
for v in value:
|
||||
if type(v) != IntType:
|
||||
wxLogError('Invalid item type')
|
||||
else:
|
||||
self.list.Append(str(v))
|
||||
self.SetAutoLayout(true)
|
||||
self.GetSizer().Fit(self)
|
||||
# Callbacks
|
||||
self.ID_BUTTON_ADD = XMLID('BUTTON_ADD')
|
||||
self.ID_BUTTON_REMOVE = XMLID('BUTTON_REMOVE')
|
||||
EVT_BUTTON(self, self.ID_BUTTON_ADD, self.OnButtonAppend)
|
||||
EVT_BUTTON(self, self.ID_BUTTON_REMOVE, self.OnButtonRemove)
|
||||
EVT_UPDATE_UI(self, self.ID_BUTTON_REMOVE, self.OnUpdateUI)
|
||||
def OnButtonAppend(self, evt):
|
||||
s = wxGetTextFromUser('Enter new number:', 'Add', '', self)
|
||||
# Check that it's unique
|
||||
try:
|
||||
v = int(s)
|
||||
s = str(v) # to be sure
|
||||
i = self.list.FindString(s)
|
||||
if i == -1: # ignore non-unique
|
||||
# Find place to insert
|
||||
found = false
|
||||
for i in range(self.list.Number()):
|
||||
if int(self.list.GetString(i)) > v:
|
||||
found = true
|
||||
break
|
||||
if found: self.list.InsertItems([s], i)
|
||||
else: self.list.Append(s)
|
||||
except ValueError:
|
||||
wxLogError('List item is not an int!')
|
||||
def OnButtonRemove(self, evt):
|
||||
self.list.Delete(self.list.GetSelection())
|
||||
def OnUpdateUI(self, evt):
|
||||
if evt.GetId() == self.ID_BUTTON_REMOVE:
|
||||
evt.Enable(self.list.GetSelection() != -1)
|
||||
|
||||
# For growable list
|
||||
class ParamIntList(ParamContent):
|
||||
def __init__(self, parent, name):
|
||||
ParamContent.__init__(self, parent, name)
|
||||
def OnButtonEdit(self, evt):
|
||||
if self.textModified: # text has newer value
|
||||
try:
|
||||
self.value = eval(self.text.GetValue())
|
||||
except SyntaxError:
|
||||
wxLogError('Syntax error in parameter value: ' + self.GetName())
|
||||
self.value = []
|
||||
dlg = IntListDialog(self, self.value)
|
||||
if dlg.ShowModal() == wxID_OK:
|
||||
value = []
|
||||
for i in range(dlg.list.Number()):
|
||||
value.append(int(dlg.list.GetString(i)))
|
||||
# Add ignored flags
|
||||
self.SetValue(value)
|
||||
self.SetModified()
|
||||
self.textModified = false
|
||||
dlg.Destroy()
|
||||
|
||||
# Boxless radiobox
|
||||
class RadioBox(PPanel):
|
||||
def __init__(self, parent, id, choices,
|
||||
pos=wxDefaultPosition, name='radiobox'):
|
||||
PPanel.__init__(self, parent, name)
|
||||
self.SetBackgroundColour(panel.GetBackgroundColour())
|
||||
self.choices = choices
|
||||
topSizer = wxBoxSizer()
|
||||
for i in choices:
|
||||
button = wxRadioButton(self, -1, i, name=i)
|
||||
topSizer.Add(button)
|
||||
EVT_RADIOBUTTON(self, button.GetId(), self.OnRadioChoice)
|
||||
self.SetAutoLayout(true)
|
||||
self.SetSizer(topSizer)
|
||||
topSizer.Fit(self)
|
||||
def SetStringSelection(self, value):
|
||||
self.freeze = true
|
||||
for i in self.choices:
|
||||
self.FindWindowByName(i).SetValue(i == value)
|
||||
self.value = value
|
||||
self.freeze = false
|
||||
def OnRadioChoice(self, evt):
|
||||
if self.freeze: return
|
||||
if evt.GetSelection():
|
||||
self.value = evt.GetEventObject().GetName()
|
||||
self.SetModified()
|
||||
def GetStringSelection(self):
|
||||
return self.value
|
||||
|
||||
class ParamBool(RadioBox):
|
||||
values = {'yes': '1', 'no': '0'}
|
||||
seulav = {'1': 'yes', '0': 'no'}
|
||||
def __init__(self, parent, name):
|
||||
RadioBox.__init__(self, parent, -1, choices = self.values.keys(), name=name)
|
||||
def GetValue(self):
|
||||
return self.values[self.GetStringSelection()]
|
||||
def SetValue(self, value):
|
||||
if not value: value = '1'
|
||||
self.SetStringSelection(self.seulav[value])
|
||||
|
||||
class ParamOrient(RadioBox):
|
||||
values = {'horizontal': 'wxHORIZONTAL', 'vertical': 'wxVERTICAL'}
|
||||
seulav = {'wxHORIZONTAL': 'horizontal', 'wxVERTICAL': 'vertical'}
|
||||
def __init__(self, parent, name):
|
||||
RadioBox.__init__(self, parent, -1, choices = self.values.keys(), name=name)
|
||||
def GetValue(self):
|
||||
return self.values[self.GetStringSelection()]
|
||||
def SetValue(self, value):
|
||||
if not value: value = 'wxHORIZONTAL'
|
||||
self.SetStringSelection(self.seulav[value])
|
||||
|
||||
class ParamFile(PPanel):
|
||||
def __init__(self, parent, name):
|
||||
PPanel.__init__(self, parent, name)
|
||||
self.ID_TEXT_CTRL = wxNewId()
|
||||
self.ID_BUTTON_BROWSE = wxNewId()
|
||||
self.SetBackgroundColour(panel.GetBackgroundColour())
|
||||
sizer = wxBoxSizer()
|
||||
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(200,-1))
|
||||
sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 5)
|
||||
self.button = wxButton(self, self.ID_BUTTON_BROWSE, 'Browse...',size=buttonSize)
|
||||
sizer.Add(self.button, 0, wxALIGN_CENTER_VERTICAL)
|
||||
self.SetAutoLayout(true)
|
||||
self.SetSizer(sizer)
|
||||
sizer.Fit(self)
|
||||
self.textModified = false
|
||||
EVT_BUTTON(self, self.ID_BUTTON_BROWSE, self.OnButtonBrowse)
|
||||
EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
|
||||
def OnChange(self, evt):
|
||||
if self.freeze: return
|
||||
self.SetModified()
|
||||
self.textModified = true
|
||||
evt.Skip()
|
||||
def GetValue(self):
|
||||
if self.textModified: # text has newer value
|
||||
return self.text.GetValue()
|
||||
return self.value
|
||||
def SetValue(self, value):
|
||||
self.freeze = true
|
||||
self.value = value
|
||||
self.text.SetValue(value) # update text ctrl
|
||||
self.freeze = false
|
||||
def OnButtonBrowse(self, evt):
|
||||
if self.textModified: # text has newer value
|
||||
self.value = self.text.GetValue()
|
||||
dlg = wxFileDialog(self,
|
||||
defaultDir = os.path.dirname(self.value),
|
||||
defaultFile = os.path.basename(self.value))
|
||||
if dlg.ShowModal() == wxID_OK:
|
||||
# Make relative
|
||||
common = os.path.commonprefix([os.path.abspath(frame.dataFile),
|
||||
dlg.GetPath()])
|
||||
self.SetValue(dlg.GetPath()[len(common):])
|
||||
self.SetModified()
|
||||
self.textModified = false
|
||||
dlg.Destroy()
|
||||
|
||||
paramDict = {
|
||||
'flag': ParamFlag,
|
||||
'style': ParamStyle, 'exstyle': ParamExStyle,
|
||||
'pos': ParamPosSize, 'size': ParamPosSize,
|
||||
'border': ParamInt, 'cols': ParamInt, 'rows': ParamInt,
|
||||
'vgap': ParamInt, 'hgap': ParamInt,
|
||||
'checkable': ParamBool, 'accel': ParamAccel,
|
||||
'label': ParamText, 'title': ParamText, 'value': ParamText,
|
||||
'content': ParamContent, 'selection': ParamInt,
|
||||
'min': ParamInt, 'max': ParamInt,
|
||||
'fg': ParamColour, 'bg': ParamColour, 'font': ParamFont,
|
||||
'enabled': ParamBool, 'focused': ParamBool, 'hidden': ParamBool,
|
||||
'tooltip': ParamText, 'bitmap': ParamFile, 'icon': ParamFile,
|
||||
}
|
||||
|
BIN
wxPython/wxPython/tools/XRCed/xrced.ico
Normal file
BIN
wxPython/wxPython/tools/XRCed/xrced.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.2 KiB |
1930
wxPython/wxPython/tools/XRCed/xrced.py
Normal file
1930
wxPython/wxPython/tools/XRCed/xrced.py
Normal file
File diff suppressed because it is too large
Load Diff
1
wxPython/wxPython/tools/XRCed/xrced.sh
Normal file
1
wxPython/wxPython/tools/XRCed/xrced.sh
Normal file
@@ -0,0 +1 @@
|
||||
python2.2 YOUR_PATH_TO_XRCED/xrced.py $*
|
235
wxPython/wxPython/tools/XRCed/xrced.xrc
Normal file
235
wxPython/wxPython/tools/XRCed/xrced.xrc
Normal file
@@ -0,0 +1,235 @@
|
||||
<?xml version="1.0" ?>
|
||||
<resource>
|
||||
<object class="wxDialog" name="DIALOG_CONTENT">
|
||||
<title>Content</title>
|
||||
<size>250,300</size>
|
||||
<object class="wxBoxSizer">
|
||||
<orient>wxVERTICAL</orient>
|
||||
<object class="sizeritem">
|
||||
<object class="wxBoxSizer">
|
||||
<orient>wxHORIZONTAL</orient>
|
||||
<object class="sizeritem">
|
||||
<object class="wxListBox" name="LIST">
|
||||
<content/>
|
||||
</object>
|
||||
<option>1</option>
|
||||
<flag>wxTOP|wxBOTTOM|wxLEFT|wxEXPAND</flag>
|
||||
<border>5</border>
|
||||
</object>
|
||||
<object class="sizeritem">
|
||||
<object class="wxBoxSizer">
|
||||
<orient>wxVERTICAL</orient>
|
||||
<object class="sizeritem">
|
||||
<object class="wxButton" name="BUTTON_UP">
|
||||
<label>Move Up</label>
|
||||
</object>
|
||||
<flag>wxBOTTOM</flag>
|
||||
<border>5</border>
|
||||
</object>
|
||||
<object class="sizeritem">
|
||||
<object class="wxButton" name="BUTTON_DOWN">
|
||||
<label>Move Down</label>
|
||||
</object>
|
||||
</object>
|
||||
<object class="spacer">
|
||||
<size>10,20</size>
|
||||
<option>1</option>
|
||||
</object>
|
||||
<object class="sizeritem">
|
||||
<object class="wxButton" name="BUTTON_APPEND">
|
||||
<label>Append...</label>
|
||||
</object>
|
||||
<flag>wxBOTTOM</flag>
|
||||
<border>5</border>
|
||||
</object>
|
||||
<object class="sizeritem">
|
||||
<object class="wxButton" name="BUTTON_REMOVE">
|
||||
<label>Remove</label>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<flag>wxALL|wxEXPAND</flag>
|
||||
<border>5</border>
|
||||
</object>
|
||||
</object>
|
||||
<option>1</option>
|
||||
<flag>wxEXPAND</flag>
|
||||
</object>
|
||||
<object class="sizeritem">
|
||||
<object class="wxStaticLine"/>
|
||||
<flag>wxEXPAND</flag>
|
||||
</object>
|
||||
<object class="sizeritem">
|
||||
<object class="wxBoxSizer">
|
||||
<orient>wxHORIZONTAL</orient>
|
||||
<object class="sizeritem">
|
||||
<object class="wxButton" name="wxID_OK">
|
||||
<label>OK</label>
|
||||
<default>1</default>
|
||||
</object>
|
||||
<flag>wxRIGHT</flag>
|
||||
<border>10</border>
|
||||
</object>
|
||||
<object class="sizeritem">
|
||||
<object class="wxButton" name="wxID_CANCEL">
|
||||
<label>Cancel</label>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<flag>wxALL|wxALIGN_CENTRE_HORIZONTAL</flag>
|
||||
<border>10</border>
|
||||
</object>
|
||||
</object>
|
||||
<style>wxRESIZE_BORDER</style>
|
||||
</object>
|
||||
<object class="wxDialog" name="DIALOG_CONTENT_CHECK_LIST">
|
||||
<title>Content</title>
|
||||
<size>250,300</size>
|
||||
<object class="wxBoxSizer">
|
||||
<orient>wxVERTICAL</orient>
|
||||
<object class="sizeritem">
|
||||
<object class="wxBoxSizer">
|
||||
<orient>wxHORIZONTAL</orient>
|
||||
<object class="sizeritem">
|
||||
<object class="wxCheckList" name="CHECK_LIST">
|
||||
<content/>
|
||||
</object>
|
||||
<option>1</option>
|
||||
<flag>wxTOP|wxBOTTOM|wxLEFT|wxEXPAND</flag>
|
||||
<border>5</border>
|
||||
</object>
|
||||
<object class="sizeritem">
|
||||
<object class="wxBoxSizer">
|
||||
<orient>wxVERTICAL</orient>
|
||||
<object class="sizeritem">
|
||||
<object class="wxButton" name="BUTTON_UP">
|
||||
<label>Move Up</label>
|
||||
</object>
|
||||
<flag>wxBOTTOM</flag>
|
||||
<border>5</border>
|
||||
</object>
|
||||
<object class="sizeritem">
|
||||
<object class="wxButton" name="BUTTON_DOWN">
|
||||
<label>Move Down</label>
|
||||
</object>
|
||||
</object>
|
||||
<object class="spacer">
|
||||
<size>10,20</size>
|
||||
<option>1</option>
|
||||
</object>
|
||||
<object class="sizeritem">
|
||||
<object class="wxButton" name="BUTTON_APPEND">
|
||||
<label>Append...</label>
|
||||
</object>
|
||||
<flag>wxBOTTOM</flag>
|
||||
<border>5</border>
|
||||
</object>
|
||||
<object class="sizeritem">
|
||||
<object class="wxButton" name="BUTTON_REMOVE">
|
||||
<label>Remove</label>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<flag>wxALL|wxEXPAND</flag>
|
||||
<border>5</border>
|
||||
</object>
|
||||
</object>
|
||||
<option>1</option>
|
||||
<flag>wxEXPAND</flag>
|
||||
</object>
|
||||
<object class="sizeritem">
|
||||
<object class="wxStaticLine"/>
|
||||
<flag>wxEXPAND</flag>
|
||||
</object>
|
||||
<object class="sizeritem">
|
||||
<object class="wxBoxSizer">
|
||||
<orient>wxHORIZONTAL</orient>
|
||||
<object class="sizeritem">
|
||||
<object class="wxButton" name="wxID_OK">
|
||||
<label>OK</label>
|
||||
<default>1</default>
|
||||
</object>
|
||||
<flag>wxRIGHT</flag>
|
||||
<border>10</border>
|
||||
</object>
|
||||
<object class="sizeritem">
|
||||
<object class="wxButton" name="wxID_CANCEL">
|
||||
<label>Cancel</label>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<flag>wxALL|wxALIGN_CENTRE_HORIZONTAL</flag>
|
||||
<border>10</border>
|
||||
</object>
|
||||
</object>
|
||||
<style>wxRESIZE_BORDER</style>
|
||||
</object>
|
||||
<object class="wxDialog" name="DIALOG_INTLIST">
|
||||
<title>Numbers</title>
|
||||
<size>100,300</size>
|
||||
<object class="wxBoxSizer">
|
||||
<orient>wxVERTICAL</orient>
|
||||
<object class="sizeritem">
|
||||
<object class="wxBoxSizer">
|
||||
<orient>wxVERTICAL</orient>
|
||||
<object class="sizeritem">
|
||||
<object class="wxListBox" name="LIST">
|
||||
<content/>
|
||||
<size>80,100</size>
|
||||
<style>wxLB_SORT</style>
|
||||
</object>
|
||||
<option>1</option>
|
||||
<flag>wxALL|wxALIGN_CENTRE_HORIZONTAL</flag>
|
||||
<border>10</border>
|
||||
</object>
|
||||
<object class="sizeritem">
|
||||
<object class="wxBoxSizer">
|
||||
<orient>wxVERTICAL</orient>
|
||||
<object class="sizeritem">
|
||||
<object class="wxButton" name="BUTTON_ADD">
|
||||
<label>Add...</label>
|
||||
</object>
|
||||
<flag>wxBOTTOM</flag>
|
||||
<border>3</border>
|
||||
</object>
|
||||
<object class="sizeritem">
|
||||
<object class="wxButton" name="BUTTON_REMOVE">
|
||||
<label>Remove</label>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<flag>wxALL|wxALIGN_CENTRE_HORIZONTAL</flag>
|
||||
<border>5</border>
|
||||
</object>
|
||||
</object>
|
||||
<option>1</option>
|
||||
<flag>wxEXPAND</flag>
|
||||
</object>
|
||||
<object class="sizeritem">
|
||||
<object class="wxStaticLine"/>
|
||||
<flag>wxEXPAND</flag>
|
||||
</object>
|
||||
<object class="sizeritem">
|
||||
<object class="wxBoxSizer">
|
||||
<orient>wxVERTICAL</orient>
|
||||
<object class="sizeritem">
|
||||
<object class="wxButton" name="wxID_OK">
|
||||
<label>OK</label>
|
||||
<default>1</default>
|
||||
</object>
|
||||
<flag>wxBOTTOM</flag>
|
||||
<border>5</border>
|
||||
</object>
|
||||
<object class="sizeritem">
|
||||
<object class="wxButton" name="wxID_CANCEL">
|
||||
<label>Cancel</label>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<flag>wxALL|wxALIGN_CENTRE_HORIZONTAL</flag>
|
||||
<border>10</border>
|
||||
</object>
|
||||
</object>
|
||||
<style>wxRESIZE_BORDER</style>
|
||||
</object>
|
||||
</resource>
|
712
wxPython/wxPython/tools/XRCed/xxx.py
Normal file
712
wxPython/wxPython/tools/XRCed/xxx.py
Normal file
@@ -0,0 +1,712 @@
|
||||
# Name: xxx.py ('xxx' is easy to distinguish from 'wx' :) )
|
||||
# Purpose: XML interface classes
|
||||
# Author: Roman Rolinsky <rolinsky@mema.ucl.ac.be>
|
||||
# Created: 22.08.2001
|
||||
# RCS-ID: $Id$
|
||||
|
||||
from wxPython.wx import *
|
||||
from wxPython.xrc import *
|
||||
from xml.dom import minidom
|
||||
import wxPython.lib.wxpTag
|
||||
|
||||
from params import *
|
||||
|
||||
# Base class for interface parameter classes
|
||||
class xxxNode:
|
||||
def __init__(self, node):
|
||||
self.node = node
|
||||
def remove(self):
|
||||
self.node.parentNode.removeChild(self.node)
|
||||
self.node.unlink()
|
||||
|
||||
# Generic (text) parameter class
|
||||
class xxxParam(xxxNode):
|
||||
# Standard use: for text nodes
|
||||
def __init__(self, node):
|
||||
xxxNode.__init__(self, node)
|
||||
if not node.hasChildNodes():
|
||||
# If does not have child nodes, create empty text node
|
||||
text = tree.dom.createTextNode('')
|
||||
node.appendChild(text)
|
||||
else:
|
||||
text = node.childNodes[0] # first child must be text node
|
||||
assert text.nodeType == minidom.Node.TEXT_NODE
|
||||
self.textNode = text
|
||||
# Value returns string
|
||||
def value(self):
|
||||
return self.textNode.data
|
||||
def update(self, value):
|
||||
self.textNode.data = value
|
||||
|
||||
# Integer parameter
|
||||
class xxxParamInt(xxxParam):
|
||||
# Standard use: for text nodes
|
||||
def __init__(self, node):
|
||||
xxxParam.__init__(self, node)
|
||||
# Value returns string
|
||||
def value(self):
|
||||
try:
|
||||
return int(self.textNode.data)
|
||||
except ValueError:
|
||||
return -1 # invalid value
|
||||
def update(self, value):
|
||||
self.textNode.data = str(value)
|
||||
|
||||
# Content parameter
|
||||
class xxxParamContent(xxxNode):
|
||||
def __init__(self, node):
|
||||
xxxNode.__init__(self, node)
|
||||
data, l = [], [] # data is needed to quicker value retrieval
|
||||
nodes = node.childNodes[:] # make a copy of the child list
|
||||
for n in nodes:
|
||||
if n.nodeType == minidom.Node.ELEMENT_NODE:
|
||||
assert n.tagName == 'item', 'bad content content'
|
||||
if not n.hasChildNodes():
|
||||
# If does not have child nodes, create empty text node
|
||||
text = tree.dom.createTextNode('')
|
||||
node.appendChild(text)
|
||||
else:
|
||||
# !!! normalize?
|
||||
text = n.childNodes[0] # first child must be text node
|
||||
assert text.nodeType == minidom.Node.TEXT_NODE
|
||||
l.append(text)
|
||||
data.append(str(text.data))
|
||||
else: # remove other
|
||||
node.removeChild(n)
|
||||
n.unlink()
|
||||
self.l, self.data = l, data
|
||||
def value(self):
|
||||
return self.data
|
||||
def update(self, value):
|
||||
# If number if items is not the same, recreate children
|
||||
if len(value) != len(self.l): # remove first if number of items has changed
|
||||
childNodes = self.node.childNodes[:]
|
||||
for n in childNodes:
|
||||
self.node.removeChild(n)
|
||||
l = []
|
||||
for str in value:
|
||||
itemElem = tree.dom.createElement('item')
|
||||
itemText = tree.dom.createTextNode(str)
|
||||
itemElem.appendChild(itemText)
|
||||
self.node.appendChild(itemElem)
|
||||
l.append(itemText)
|
||||
self.l = l
|
||||
else:
|
||||
for i in range(len(value)):
|
||||
self.l[i].data = value[i]
|
||||
self.data = value
|
||||
|
||||
# Content parameter for checklist
|
||||
class xxxParamContentCheckList(xxxNode):
|
||||
def __init__(self, node):
|
||||
xxxNode.__init__(self, node)
|
||||
data, l = [], [] # data is needed to quicker value retrieval
|
||||
nodes = node.childNodes[:] # make a copy of the child list
|
||||
for n in nodes:
|
||||
if n.nodeType == minidom.Node.ELEMENT_NODE:
|
||||
assert n.tagName == 'item', 'bad content content'
|
||||
checked = n.getAttribute('checked')
|
||||
if not n.hasChildNodes():
|
||||
# If does not have child nodes, create empty text node
|
||||
text = tree.dom.createTextNode('')
|
||||
node.appendChild(text)
|
||||
else:
|
||||
# !!! normalize?
|
||||
text = n.childNodes[0] # first child must be text node
|
||||
assert text.nodeType == minidom.Node.TEXT_NODE
|
||||
l.append((text, n))
|
||||
data.append((str(text.data), int(checked)))
|
||||
else: # remove other
|
||||
node.removeChild(n)
|
||||
n.unlink()
|
||||
self.l, self.data = l, data
|
||||
def value(self):
|
||||
return self.data
|
||||
def update(self, value):
|
||||
# If number if items is not the same, recreate children
|
||||
if len(value) != len(self.l): # remove first if number of items has changed
|
||||
childNodes = self.node.childNodes[:]
|
||||
for n in childNodes:
|
||||
self.node.removeChild(n)
|
||||
l = []
|
||||
for (s,ch) in value:
|
||||
itemElem = tree.dom.createElement('item')
|
||||
itemElem.setAttribute('checked', str(ch))
|
||||
itemText = tree.dom.createTextNode(s)
|
||||
itemElem.appendChild(itemText)
|
||||
self.node.appendChild(itemElem)
|
||||
l.append((itemText, itemElem))
|
||||
self.l = l
|
||||
else:
|
||||
for i in range(len(value)):
|
||||
self.l[i][0].data = value[i][0]
|
||||
self.l[i][1].setAttribute('checked', str(value[i][1]))
|
||||
self.data = value
|
||||
|
||||
################################################################################
|
||||
|
||||
# Classes to interface DOM objects
|
||||
class xxxObject:
|
||||
# Default behavior
|
||||
hasChildren = false # has children elements?
|
||||
hasStyle = true # almost everyone
|
||||
hasName = true # has name attribute?
|
||||
isSizer = hasChild = false
|
||||
allParams = None # Some nodes have no parameters
|
||||
# Style parameters (all optional)
|
||||
styles = ['fg', 'bg', 'font', 'enabled', 'focused', 'hidden', 'tooltip']
|
||||
# Special parameters
|
||||
specials = []
|
||||
# Required paremeters: none by default
|
||||
required = []
|
||||
# Default parameters with default values
|
||||
default = {}
|
||||
# Parameter types
|
||||
paramDict = {}
|
||||
# Window styles and extended styles
|
||||
winStyles = []
|
||||
# Tree icon index
|
||||
#image = -1
|
||||
# Construct a new xxx object from DOM element
|
||||
# parent is parent xxx object (or None if none), element is DOM element object
|
||||
def __init__(self, parent, element):
|
||||
self.parent = parent
|
||||
self.element = element
|
||||
self.undo = None
|
||||
# Get attributes
|
||||
self.className = element.getAttribute('class')
|
||||
if self.hasName: self.name = element.getAttribute('name')
|
||||
# Set parameters (text element children)
|
||||
self.params = {}
|
||||
nodes = element.childNodes[:]
|
||||
for node in nodes:
|
||||
if node.nodeType == minidom.Node.ELEMENT_NODE:
|
||||
tag = node.tagName
|
||||
if tag == 'object':
|
||||
continue # do nothing for object children here
|
||||
if not tag in self.allParams and not tag in self.styles:
|
||||
print 'WARNING: unknown parameter for %s: %s' % \
|
||||
(self.className, tag)
|
||||
elif tag in self.specials:
|
||||
self.special(tag, node)
|
||||
elif tag == 'content':
|
||||
if self.className == 'wxCheckList':
|
||||
self.params[tag] = xxxParamContentCheckList(node)
|
||||
else:
|
||||
self.params[tag] = xxxParamContent(node)
|
||||
elif tag == 'font': # has children
|
||||
self.params[tag] = xxxParamFont(element, node)
|
||||
else: # simple parameter
|
||||
self.params[tag] = xxxParam(node)
|
||||
else:
|
||||
# Remove all other nodes
|
||||
element.removeChild(node)
|
||||
node.unlink()
|
||||
# Returns real tree object
|
||||
def treeObject(self):
|
||||
if self.hasChild: return self.child
|
||||
return self
|
||||
# Returns tree image index
|
||||
def treeImage(self):
|
||||
if self.hasChild: return self.child.treeImage()
|
||||
return self.image
|
||||
# Class name plus wx name
|
||||
def treeName(self):
|
||||
if self.hasChild: return self.child.treeName()
|
||||
if self.hasName and self.name: return self.className + ' "' + self.name + '"'
|
||||
return self.className
|
||||
|
||||
################################################################################
|
||||
|
||||
# This is a little special: it is both xxxObject and xxxNode
|
||||
class xxxParamFont(xxxObject, xxxNode):
|
||||
allParams = ['size', 'style', 'weight', 'family', 'underlined',
|
||||
'face', 'encoding']
|
||||
def __init__(self, parent, element):
|
||||
xxxObject.__init__(self, parent, element)
|
||||
xxxNode.__init__(self, element)
|
||||
self.parentNode = parent # required to behave similar to DOM node
|
||||
v = []
|
||||
for p in self.allParams:
|
||||
try:
|
||||
v.append(str(self.params[p].value()))
|
||||
except KeyError:
|
||||
v.append('')
|
||||
self.data = v
|
||||
def update(self, value):
|
||||
# `value' is a list of strings corresponding to all parameters
|
||||
elem = self.element
|
||||
# Remove old elements first
|
||||
childNodes = elem.childNodes[:]
|
||||
for node in childNodes: elem.removeChild(node)
|
||||
i = 0
|
||||
self.params.clear()
|
||||
v = []
|
||||
for param in self.allParams:
|
||||
if value[i]:
|
||||
fontElem = tree.dom.createElement(param)
|
||||
textNode = tree.dom.createTextNode(value[i])
|
||||
self.params[param] = textNode
|
||||
fontElem.appendChild(textNode)
|
||||
elem.appendChild(fontElem)
|
||||
v.append(value[i])
|
||||
i += 1
|
||||
self.data = v
|
||||
def value(self):
|
||||
return self.data
|
||||
|
||||
################################################################################
|
||||
|
||||
class xxxContainer(xxxObject):
|
||||
hasChildren = true
|
||||
|
||||
# Special class for root node
|
||||
class xxxMainNode(xxxContainer):
|
||||
hasStyle = hasName = false
|
||||
|
||||
################################################################################
|
||||
# Top-level windwows
|
||||
|
||||
class xxxPanel(xxxContainer):
|
||||
allParams = ['pos', 'size', 'style']
|
||||
styles = ['fg', 'bg', 'font', 'enabled', 'focused', 'hidden', 'exstyle',
|
||||
'tooltip']
|
||||
winStyles = ['wxNO_3D', 'wxTAB_TRAVERSAL', 'wxCLIP_CHILDREN']
|
||||
exStyles = ['wxWS_EX_VALIDATE_RECURSIVELY']
|
||||
|
||||
class xxxDialog(xxxContainer):
|
||||
allParams = ['title', 'pos', 'size', 'style']
|
||||
required = ['title']
|
||||
winStyles = ['wxDEFAULT_DIALOG_STYLE', 'wxSTAY_ON_TOP',
|
||||
'wxDIALOG_MODAL', 'wxDIALOG_MODELESS',
|
||||
'wxCAPTION', 'wxSYSTEM_MENU', 'wxRESIZE_BORDER', 'wxRESIZE_BOX',
|
||||
'wxTHICK_FRAME',
|
||||
'wxNO_3D', 'wxTAB_TRAVERSAL', 'wxCLIP_CHILDREN']
|
||||
styles = ['fg', 'bg', 'font', 'enabled', 'focused', 'hidden', 'exstyle',
|
||||
'tooltip']
|
||||
exStyles = ['wxWS_EX_VALIDATE_RECURSIVELY']
|
||||
|
||||
class xxxFrame(xxxContainer):
|
||||
allParams = ['title', 'centered', 'pos', 'size', 'style']
|
||||
paramDict = {'centered': ParamBool}
|
||||
required = ['title']
|
||||
winStyles = ['wxDEFAULT_FRAME_STYLE', 'wxDEFAULT_DIALOG_STYLE',
|
||||
'wxSTAY_ON_TOP',
|
||||
'wxCAPTION', 'wxSYSTEM_MENU', 'wxRESIZE_BORDER',
|
||||
'wxRESIZE_BOX', 'wxMINIMIZE_BOX', 'wxMAXIMIZE_BOX',
|
||||
'wxFRAME_FLOAT_ON_PARENT', 'wxFRAME_TOOL_WINDOW',
|
||||
'wxNO_3D', 'wxTAB_TRAVERSAL', 'wxCLIP_CHILDREN']
|
||||
styles = ['fg', 'bg', 'font', 'enabled', 'focused', 'hidden', 'exstyle',
|
||||
'tooltip']
|
||||
exStyles = ['wxWS_EX_VALIDATE_RECURSIVELY']
|
||||
|
||||
class xxxTool(xxxObject):
|
||||
allParams = ['bitmap', 'bitmap2', 'toggle', 'tooltip', 'longhelp']
|
||||
paramDict = {'bitmap2': ParamFile}
|
||||
hasStyle = false
|
||||
|
||||
class xxxToolBar(xxxContainer):
|
||||
allParams = ['bitmapsize', 'margins', 'packing', 'separation',
|
||||
'pos', 'size', 'style']
|
||||
hasStyle = false
|
||||
paramDict = {'bitmapsize': ParamPosSize, 'margins': ParamPosSize,
|
||||
'packing': ParamInt, 'separation': ParamInt,
|
||||
'style': ParamNonGenericStyle}
|
||||
winStyles = ['wxTB_FLAT', 'wxTB_DOCKABLE', 'wxTB_VERTICAL', 'wxTB_HORIZONTAL']
|
||||
|
||||
################################################################################
|
||||
# Bitmap, Icon
|
||||
|
||||
class xxxBitmap(xxxObject):
|
||||
allParams = ['bitmap']
|
||||
required = ['bitmap']
|
||||
|
||||
class xxxIcon(xxxObject):
|
||||
allParams = ['icon']
|
||||
required = ['icon']
|
||||
|
||||
################################################################################
|
||||
# Controls
|
||||
|
||||
class xxxStaticText(xxxObject):
|
||||
allParams = ['label', 'pos', 'size', 'style']
|
||||
required = ['label']
|
||||
winStyles = ['wxALIGN_LEFT', 'wxALIGN_RIGHT', 'wxALIGN_CENTRE', 'wxST_NO_AUTORESIZE']
|
||||
|
||||
class xxxStaticLine(xxxObject):
|
||||
allParams = ['pos', 'size', 'style']
|
||||
winStyles = ['wxLI_HORIZONTAL', 'wxLI_VERTICAL']
|
||||
|
||||
class xxxStaticBitmap(xxxObject):
|
||||
allParams = ['bitmap', 'pos', 'size', 'style']
|
||||
required = ['bitmap']
|
||||
|
||||
class xxxTextCtrl(xxxObject):
|
||||
allParams = ['value', 'pos', 'size', 'style']
|
||||
winStyles = ['wxTE_PROCESS_ENTER', 'wxTE_PROCESS_TAB', 'wxTE_MULTILINE',
|
||||
'wxTE_PASSWORD', 'wxTE_READONLY', 'wxHSCROLL']
|
||||
|
||||
class xxxChoice(xxxObject):
|
||||
allParams = ['content', 'selection', 'pos', 'size', 'style']
|
||||
required = ['content']
|
||||
winStyles = ['wxCB_SORT']
|
||||
|
||||
class xxxSlider(xxxObject):
|
||||
allParams = ['value', 'min', 'max', 'pos', 'size', 'style',
|
||||
'tickfreq', 'pagesize', 'linesize', 'thumb', 'tick',
|
||||
'selmin', 'selmax']
|
||||
paramDict = {'value': ParamInt, 'tickfreq': ParamInt, 'pagesize': ParamInt,
|
||||
'linesize': ParamInt, 'thumb': ParamInt, 'thumb': ParamInt,
|
||||
'tick': ParamInt, 'selmin': ParamInt, 'selmax': ParamInt}
|
||||
required = ['value', 'min', 'max']
|
||||
winStyles = ['wxSL_HORIZONTAL', 'wxSL_VERTICAL', 'wxSL_AUTOTICKS', 'wxSL_LABELS',
|
||||
'wxSL_LEFT', 'wxSL_RIGHT', 'wxSL_TOP', 'wxSL_BOTTOM',
|
||||
'wxSL_BOTH', 'wxSL_SELRANGE']
|
||||
|
||||
class xxxGauge(xxxObject):
|
||||
allParams = ['range', 'pos', 'size', 'style', 'value', 'shadow', 'bezel']
|
||||
paramDict = {'range': ParamInt, 'value': ParamInt,
|
||||
'shadow': ParamInt, 'bezel': ParamInt}
|
||||
winStyles = ['wxGA_HORIZONTAL', 'wxGA_VERTICAL', 'wxGA_PROGRESSBAR', 'wxGA_SMOOTH']
|
||||
|
||||
class xxxScrollBar(xxxObject):
|
||||
allParams = ['pos', 'size', 'style', 'value', 'thumbsize', 'range', 'pagesize']
|
||||
paramDict = {'value': ParamInt, 'range': ParamInt, 'thumbsize': ParamInt,
|
||||
'pagesize': ParamInt}
|
||||
winStyles = ['wxSB_HORIZONTAL', 'wxSB_VERTICAL']
|
||||
|
||||
class xxxListCtrl(xxxObject):
|
||||
allParams = ['pos', 'size', 'style']
|
||||
winStyles = ['wxLC_LIST', 'wxLC_REPORT', 'wxLC_ICON', 'wxLC_SMALL_ICON',
|
||||
'wxLC_ALIGN_TOP', 'wxLC_ALIGN_LEFT', 'wxLC_AUTOARRANGE',
|
||||
'wxLC_USER_TEXT', 'wxLC_EDIT_LABELS', 'wxLC_NO_HEADER',
|
||||
'wxLC_SINGLE_SEL', 'wxLC_SORT_ASCENDING', 'wxLC_SORT_DESCENDING']
|
||||
|
||||
class xxxTreeCtrl(xxxObject):
|
||||
allParams = ['pos', 'size', 'style']
|
||||
winStyles = ['wxTR_HAS_BUTTONS', 'wxTR_NO_LINES', 'wxTR_LINES_AT_ROOT',
|
||||
'wxTR_EDIT_LABELS', 'wxTR_MULTIPLE']
|
||||
|
||||
class xxxHtmlWindow(xxxObject):
|
||||
allParams = ['pos', 'size', 'style', 'borders', 'url', 'htmlcode']
|
||||
paramDict = {'borders': ParamInt}
|
||||
winStyles = ['wxHW_SCROLLBAR_NEVER', 'wxHW_SCROLLBAR_AUTO']
|
||||
|
||||
class xxxCalendar(xxxObject):
|
||||
allParams = ['pos', 'size', 'style']
|
||||
|
||||
class xxxNotebook(xxxContainer):
|
||||
allParams = ['usenotebooksizer', 'pos', 'size', 'style']
|
||||
paramDict = {'usenotebooksizer': ParamBool}
|
||||
winStyles = ['wxNB_FIXEDWIDTH', 'wxNB_LEFT', 'wxNB_RIGHT', 'wxNB_BOTTOM']
|
||||
|
||||
################################################################################
|
||||
# Buttons
|
||||
|
||||
class xxxButton(xxxObject):
|
||||
allParams = ['label', 'default', 'pos', 'size', 'style']
|
||||
paramDict = {'default': ParamBool}
|
||||
required = ['label']
|
||||
winStyles = ['wxBU_LEFT', 'wxBU_TOP', 'wxBU_RIGHT', 'wxBU_BOTTOM']
|
||||
|
||||
class xxxBitmapButton(xxxObject):
|
||||
allParams = ['bitmap', 'selected', 'focus', 'disabled', 'default',
|
||||
'pos', 'size', 'style']
|
||||
required = ['bitmap']
|
||||
winStyles = ['wxBU_AUTODRAW', 'wxBU_LEFT', 'wxBU_TOP',
|
||||
'wxBU_RIGHT', 'wxBU_BOTTOM']
|
||||
|
||||
class xxxRadioButton(xxxObject):
|
||||
allParams = ['label', 'value', 'pos', 'size', 'style']
|
||||
paramDict = {'value': ParamBool}
|
||||
required = ['label']
|
||||
winStyles = ['wxRB_GROUP']
|
||||
|
||||
class xxxSpinButton(xxxObject):
|
||||
allParams = ['pos', 'size', 'style']
|
||||
winStyles = ['wxSP_HORIZONTAL', 'wxSP_VERTICAL', 'wxSP_ARROW_KEYS', 'wxSP_WRAP']
|
||||
|
||||
################################################################################
|
||||
# Boxes
|
||||
|
||||
class xxxStaticBox(xxxObject):
|
||||
allParams = ['label', 'pos', 'size', 'style']
|
||||
required = ['label']
|
||||
|
||||
class xxxRadioBox(xxxObject):
|
||||
allParams = ['label', 'content', 'selection', 'dimension', 'pos', 'size', 'style']
|
||||
paramDict = {'dimension': ParamInt}
|
||||
required = ['label', 'content']
|
||||
winStyles = ['wxRA_SPECIFY_ROWS', 'wxRA_SPECIFY_COLS']
|
||||
|
||||
class xxxCheckBox(xxxObject):
|
||||
allParams = ['label', 'pos', 'size', 'style']
|
||||
required = ['label']
|
||||
|
||||
class xxxComboBox(xxxObject):
|
||||
allParams = ['content', 'selection', 'value', 'pos', 'size', 'style']
|
||||
required = ['content']
|
||||
winStyles = ['wxCB_SIMPLE', 'wxCB_SORT', 'wxCB_READONLY', 'wxCB_DROPDOWN']
|
||||
|
||||
class xxxListBox(xxxObject):
|
||||
allParams = ['content', 'selection', 'pos', 'size', 'style']
|
||||
required = ['content']
|
||||
winStyles = ['wxLB_SINGLE', 'wxLB_MULTIPLE', 'wxLB_EXTENDED', 'wxLB_HSCROLL',
|
||||
'wxLB_ALWAYS_SB', 'wxLB_NEEDED_SB', 'wxLB_SORT']
|
||||
|
||||
class xxxCheckList(xxxObject):
|
||||
allParams = ['content', 'pos', 'size', 'style']
|
||||
required = ['content']
|
||||
winStyles = ['wxLC_LIST', 'wxLC_REPORT', 'wxLC_ICON', 'wxLC_SMALL_ICON',
|
||||
'wxLC_ALIGN_TOP', 'wxLC_ALIGN_LEFT', 'wxLC_AUTOARRANGE',
|
||||
'wxLC_USER_TEXT', 'wxLC_EDIT_LABELS', 'wxLC_NO_HEADER',
|
||||
'wxLC_SINGLE_SEL', 'wxLC_SORT_ASCENDING', 'wxLC_SORT_DESCENDING']
|
||||
paramDict = {'content': ParamContentCheckList}
|
||||
|
||||
################################################################################
|
||||
# Sizers
|
||||
|
||||
class xxxSizer(xxxContainer):
|
||||
hasName = hasStyle = false
|
||||
paramDict = {'orient': ParamOrient}
|
||||
isSizer = true
|
||||
|
||||
class xxxBoxSizer(xxxSizer):
|
||||
allParams = ['orient']
|
||||
required = ['orient']
|
||||
default = {'orient': 'wxVERTICAL'}
|
||||
# Tree icon depends on orientation
|
||||
def treeImage(self):
|
||||
if self.params['orient'].value() == 'wxHORIZONTAL': return self.imageH
|
||||
else: return self.imageV
|
||||
|
||||
class xxxStaticBoxSizer(xxxBoxSizer):
|
||||
allParams = ['label', 'orient']
|
||||
required = ['label', 'orient']
|
||||
default = {'orient': 'wxVERTICAL'}
|
||||
|
||||
class xxxGridSizer(xxxSizer):
|
||||
allParams = ['cols', 'rows', 'vgap', 'hgap']
|
||||
required = ['cols']
|
||||
default = {'cols': '2', 'rows': '2'}
|
||||
|
||||
# For repeated parameters
|
||||
class xxxParamMulti:
|
||||
def __init__(self):
|
||||
self.l, self.data = [], []
|
||||
def append(self, param):
|
||||
self.l.append(param)
|
||||
self.data.append(param.value())
|
||||
def value(self):
|
||||
return self.data
|
||||
def remove(self):
|
||||
for param in self.l:
|
||||
param.remove()
|
||||
self.l, self.data = [], []
|
||||
|
||||
class xxxFlexGridSizer(xxxGridSizer):
|
||||
specials = ['growablecols', 'growablerows']
|
||||
allParams = ['cols', 'rows', 'vgap', 'hgap'] + specials
|
||||
paramDict = {'growablecols':ParamIntList, 'growablerows':ParamIntList}
|
||||
# Special processing for growable* parameters
|
||||
# (they are represented by several nodes)
|
||||
def special(self, tag, node):
|
||||
if tag not in self.params:
|
||||
self.params[tag] = xxxParamMulti()
|
||||
self.params[tag].append(xxxParamInt(node))
|
||||
def setSpecial(self, param, value):
|
||||
# Straightforward implementation: remove, add again
|
||||
self.params[param].remove()
|
||||
del self.params[param]
|
||||
for i in value:
|
||||
node = tree.dom.createElement(param)
|
||||
text = tree.dom.createTextNode(str(i))
|
||||
node.appendChild(text)
|
||||
self.element.appendChild(node)
|
||||
self.special(param, node)
|
||||
|
||||
# Container with only one child.
|
||||
# Not shown in tree.
|
||||
class xxxChildContainer(xxxObject):
|
||||
hasName = hasStyle = false
|
||||
hasChild = true
|
||||
def __init__(self, parent, element):
|
||||
xxxObject.__init__(self, parent, element)
|
||||
# Must have one child with 'object' tag, but we don't check it
|
||||
nodes = element.childNodes[:] # create copy
|
||||
for node in nodes:
|
||||
if node.nodeType == minidom.Node.ELEMENT_NODE:
|
||||
if node.tagName == 'object':
|
||||
# Create new xxx object for child node
|
||||
self.child = MakeXXXFromDOM(self, node)
|
||||
self.child.parent = parent
|
||||
# Copy hasChildren and isSizer attributes
|
||||
self.hasChildren = self.child.hasChildren
|
||||
self.isSizer = self.child.isSizer
|
||||
return # success
|
||||
else:
|
||||
element.removeChild(node)
|
||||
node.unlink()
|
||||
assert 0, 'no child found'
|
||||
|
||||
class xxxSizerItem(xxxChildContainer):
|
||||
allParams = ['option', 'flag', 'border']
|
||||
paramDict = {'option': ParamInt}
|
||||
def __init__(self, parent, element):
|
||||
xxxChildContainer.__init__(self, parent, element)
|
||||
# Remove pos parameter - not needed for sizeritems
|
||||
if 'pos' in self.child.allParams:
|
||||
self.child.allParams = self.child.allParams[:]
|
||||
self.child.allParams.remove('pos')
|
||||
|
||||
class xxxNotebookPage(xxxChildContainer):
|
||||
allParams = ['label', 'selected']
|
||||
paramDict = {'selected': ParamBool}
|
||||
required = ['label']
|
||||
def __init__(self, parent, element):
|
||||
xxxChildContainer.__init__(self, parent, element)
|
||||
# pos and size dont matter for notebookpages
|
||||
if 'pos' in self.child.allParams:
|
||||
self.child.allParams = self.child.allParams[:]
|
||||
self.child.allParams.remove('pos')
|
||||
if 'size' in self.child.allParams:
|
||||
self.child.allParams = self.child.allParams[:]
|
||||
self.child.allParams.remove('size')
|
||||
|
||||
class xxxSpacer(xxxObject):
|
||||
hasName = hasStyle = false
|
||||
allParams = ['size', 'option', 'flag', 'border']
|
||||
paramDict = {'option': ParamInt}
|
||||
default = {'size': '0,0'}
|
||||
|
||||
class xxxMenuBar(xxxContainer):
|
||||
allParams = []
|
||||
|
||||
class xxxMenu(xxxContainer):
|
||||
allParams = ['label']
|
||||
default = {'label': ''}
|
||||
paramDict = {'style': ParamNonGenericStyle} # no generic styles
|
||||
winStyles = ['wxMENU_TEAROFF']
|
||||
|
||||
class xxxMenuItem(xxxObject):
|
||||
allParams = ['checkable', 'label', 'accel', 'help']
|
||||
default = {'label': ''}
|
||||
|
||||
class xxxSeparator(xxxObject):
|
||||
hasName = hasStyle = false
|
||||
|
||||
################################################################################
|
||||
|
||||
xxxDict = {
|
||||
'wxPanel': xxxPanel,
|
||||
'wxDialog': xxxDialog,
|
||||
'wxFrame': xxxFrame,
|
||||
'tool': xxxTool,
|
||||
'wxToolBar': xxxToolBar,
|
||||
|
||||
'wxBitmap': xxxBitmap,
|
||||
'wxIcon': xxxIcon,
|
||||
|
||||
'wxButton': xxxButton,
|
||||
'wxBitmapButton': xxxBitmapButton,
|
||||
'wxRadioButton': xxxRadioButton,
|
||||
'wxSpinButton': xxxSpinButton,
|
||||
|
||||
'wxStaticBox': xxxStaticBox,
|
||||
'wxStaticBitmap': xxxStaticBitmap,
|
||||
'wxRadioBox': xxxRadioBox,
|
||||
'wxComboBox': xxxComboBox,
|
||||
'wxCheckBox': xxxCheckBox,
|
||||
'wxListBox': xxxListBox,
|
||||
|
||||
'wxStaticText': xxxStaticText,
|
||||
'wxStaticLine': xxxStaticLine,
|
||||
'wxTextCtrl': xxxTextCtrl,
|
||||
'wxChoice': xxxChoice,
|
||||
'wxSlider': xxxSlider,
|
||||
'wxGauge': xxxGauge,
|
||||
'wxScrollBar': xxxScrollBar,
|
||||
'wxTreeCtrl': xxxTreeCtrl,
|
||||
'wxListCtrl': xxxListCtrl,
|
||||
'wxCheckList': xxxCheckList,
|
||||
'wxNotebook': xxxNotebook,
|
||||
'notebookpage': xxxNotebookPage,
|
||||
'wxHtmlWindow': xxxHtmlWindow,
|
||||
'wxCalendar': xxxCalendar,
|
||||
|
||||
'wxBoxSizer': xxxBoxSizer,
|
||||
'wxStaticBoxSizer': xxxStaticBoxSizer,
|
||||
'wxGridSizer': xxxGridSizer,
|
||||
'wxFlexGridSizer': xxxFlexGridSizer,
|
||||
'sizeritem': xxxSizerItem,
|
||||
'spacer': xxxSpacer,
|
||||
|
||||
'wxMenuBar': xxxMenuBar,
|
||||
'wxMenu': xxxMenu,
|
||||
'wxMenuItem': xxxMenuItem,
|
||||
'separator': xxxSeparator,
|
||||
}
|
||||
|
||||
# Create IDs for all parameters of all classes
|
||||
paramIDs = {'fg': wxNewId(), 'bg': wxNewId(), 'exstyle': wxNewId(), 'font': wxNewId(),
|
||||
'enabled': wxNewId(), 'focused': wxNewId(), 'hidden': wxNewId(),
|
||||
'tooltip': wxNewId()
|
||||
}
|
||||
for cl in xxxDict.values():
|
||||
if cl.allParams:
|
||||
for param in cl.allParams + cl.paramDict.keys():
|
||||
if not paramIDs.has_key(param):
|
||||
paramIDs[param] = wxNewId()
|
||||
|
||||
################################################################################
|
||||
# Helper functions
|
||||
|
||||
# Test for object elements
|
||||
def IsObject(node):
|
||||
return node.nodeType == minidom.Node.ELEMENT_NODE and node.tagName == 'object'
|
||||
|
||||
# Make XXX object from some DOM object, selecting correct class
|
||||
def MakeXXXFromDOM(parent, element):
|
||||
try:
|
||||
return xxxDict[element.getAttribute('class')](parent, element)
|
||||
except KeyError:
|
||||
# Verify that it's not recursive exception
|
||||
if element.getAttribute('class') not in xxxDict:
|
||||
print 'ERROR: unknown class:', element.getAttribute('class')
|
||||
raise
|
||||
|
||||
# Make empty DOM element
|
||||
def MakeEmptyDOM(className):
|
||||
elem = tree.dom.createElement('object')
|
||||
elem.setAttribute('class', className)
|
||||
# Set required and default parameters
|
||||
xxxClass = xxxDict[className]
|
||||
defaultNotRequired = filter(lambda x, l=xxxClass.required: x not in l,
|
||||
xxxClass.default.keys())
|
||||
for param in xxxClass.required + defaultNotRequired:
|
||||
textElem = tree.dom.createElement(param)
|
||||
try:
|
||||
textNode = tree.dom.createTextNode(xxxClass.default[param])
|
||||
except KeyError:
|
||||
textNode = tree.dom.createTextNode('')
|
||||
textElem.appendChild(textNode)
|
||||
elem.appendChild(textElem)
|
||||
return elem
|
||||
|
||||
# Make empty XXX object
|
||||
def MakeEmptyXXX(parent, className):
|
||||
# Make corresponding DOM object first
|
||||
elem = MakeEmptyDOM(className)
|
||||
# If parent is a sizer, we should create sizeritem object, except for spacers
|
||||
if parent:
|
||||
if parent.isSizer and className != 'spacer':
|
||||
sizerItemElem = MakeEmptyDOM('sizeritem')
|
||||
sizerItemElem.appendChild(elem)
|
||||
elem = sizerItemElem
|
||||
elif isinstance(parent, xxxNotebook):
|
||||
pageElem = MakeEmptyDOM('notebookpage')
|
||||
pageElem.appendChild(elem)
|
||||
elem = pageElem
|
||||
# Now just make object
|
||||
return MakeXXXFromDOM(parent, elem)
|
||||
|
4
wxPython/wxPython/tools/__init__.py
Normal file
4
wxPython/wxPython/tools/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
||||
#
|
||||
|
||||
|
||||
|
76
wxPython/wxPython/tools/img2img.py
Normal file
76
wxPython/wxPython/tools/img2img.py
Normal file
@@ -0,0 +1,76 @@
|
||||
"""
|
||||
Common routines for the image converter utilities.
|
||||
"""
|
||||
import sys, os, glob, getopt, string
|
||||
from wxPython.wx import *
|
||||
|
||||
wxInitAllImageHandlers()
|
||||
|
||||
def convert(file, maskClr, outputDir, outputName, outType, outExt):
|
||||
if string.lower(os.path.splitext(file)[1]) == ".ico":
|
||||
icon = wxIcon(file, wxBITMAP_TYPE_ICO)
|
||||
img = wxBitmapFromIcon(icon)
|
||||
else:
|
||||
img = wxBitmap(file, wxBITMAP_TYPE_ANY)
|
||||
|
||||
if not img.Ok():
|
||||
return 0, file + " failed to load!"
|
||||
else:
|
||||
if maskClr:
|
||||
om = img.GetMask()
|
||||
mask = wxMaskColour(img, maskClr)
|
||||
img.SetMask(mask)
|
||||
if om is not None:
|
||||
om.Destroy()
|
||||
if outputName:
|
||||
newname = outputName
|
||||
else:
|
||||
newname = os.path.join(outputDir,
|
||||
os.path.basename(os.path.splitext(file)[0]) + outExt)
|
||||
if img.SaveFile(newname, outType):
|
||||
return 1, file + " converted to " + newname
|
||||
else:
|
||||
img = wxImageFromBitmap(img)
|
||||
if img.SaveFile(newname, outType):
|
||||
return 1, "ok"
|
||||
else:
|
||||
return 0, file + " failed to save!"
|
||||
|
||||
|
||||
|
||||
|
||||
def main(args, outType, outExt, doc):
|
||||
if not args or ("-h" in args):
|
||||
print doc
|
||||
return
|
||||
|
||||
outputDir = ""
|
||||
maskClr = None
|
||||
outputName = None
|
||||
|
||||
try:
|
||||
opts, fileArgs = getopt.getopt(args, "m:n:o:")
|
||||
except getopt.GetoptError:
|
||||
print __doc__
|
||||
return
|
||||
|
||||
for opt, val in opts:
|
||||
if opt == "-m":
|
||||
maskClr = val
|
||||
elif opt == "-n":
|
||||
outputName = val
|
||||
elif opt == "-o":
|
||||
outputDir = val
|
||||
|
||||
if not fileArgs:
|
||||
print doc
|
||||
return
|
||||
|
||||
for arg in fileArgs:
|
||||
for file in glob.glob(arg):
|
||||
if not os.path.isfile(file):
|
||||
continue
|
||||
ok, msg = convert(file, maskClr, outputDir, outputName,
|
||||
outType, outExt)
|
||||
print msg
|
||||
|
36
wxPython/wxPython/tools/img2png.py
Normal file
36
wxPython/wxPython/tools/img2png.py
Normal file
@@ -0,0 +1,36 @@
|
||||
#!/usr/bin/env python
|
||||
"""
|
||||
img2png.py -- convert several image formats to PNG format
|
||||
|
||||
Usage:
|
||||
|
||||
img2png.py [options] image_files...
|
||||
|
||||
Options:
|
||||
|
||||
-o <dir> The directory to place the .png file(s), defaults to
|
||||
the current directory.
|
||||
|
||||
-m <#rrggbb> If the original image has a mask or transparency defined
|
||||
it will be used by default. You can use this option to
|
||||
override the default or provide a new mask by specifying
|
||||
a colour in the image to mark as transparent.
|
||||
|
||||
-n <name> A filename to write the .png data to. Defaults to the
|
||||
basename of the image file + '.png' This option overrides
|
||||
the -o option.
|
||||
"""
|
||||
|
||||
|
||||
import sys
|
||||
import img2img
|
||||
from wxPython import wx
|
||||
|
||||
def main():
|
||||
img2img.main(sys.argv[1:], wx.wxBITMAP_TYPE_PNG, ".png", __doc__)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
|
||||
|
190
wxPython/wxPython/tools/img2py.py
Normal file
190
wxPython/wxPython/tools/img2py.py
Normal file
@@ -0,0 +1,190 @@
|
||||
#!/usr/bin/env python
|
||||
"""
|
||||
img2py.py -- Convert an image to PNG format and embed it in a Python
|
||||
module with appropriate code so it can be loaded into
|
||||
a program at runtime. The benefit is that since it is
|
||||
Python source code it can be delivered as a .pyc or
|
||||
'compiled' into the program using freeze, py2exe, etc.
|
||||
|
||||
Usage:
|
||||
|
||||
img2py.py [options] image_file python_file
|
||||
|
||||
Options:
|
||||
|
||||
-m <#rrggbb> If the original image has a mask or transparency defined
|
||||
it will be used by default. You can use this option to
|
||||
override the default or provide a new mask by specifying
|
||||
a colour in the image to mark as transparent.
|
||||
|
||||
-n <name> Normally generic names (getBitmap, etc.) are used for the
|
||||
image access functions. If you use this option you can
|
||||
specify a name that should be used to customize the access
|
||||
fucntions, (getNameBitmap, etc.)
|
||||
|
||||
-a This flag specifies that the python_file should be appended
|
||||
to instead of overwritten. This in combination with -n will
|
||||
allow you to put multiple images in one Python source file.
|
||||
|
||||
-u Don't use compression. Leaves the data uncompressed.
|
||||
|
||||
-i Also output a function to return the image as a wxIcon.
|
||||
|
||||
"""
|
||||
|
||||
|
||||
|
||||
import sys, os, glob, getopt, tempfile, string
|
||||
import cPickle, cStringIO, zlib
|
||||
import img2img
|
||||
from wxPython import wx
|
||||
|
||||
|
||||
def crunch_data(data, compressed):
|
||||
# compress it?
|
||||
if compressed:
|
||||
data = zlib.compress(data, 9)
|
||||
|
||||
# convert to a printable format, so it can be in a Python source file
|
||||
data = repr(data)
|
||||
|
||||
# This next bit is borrowed from PIL. It is used to wrap the text intelligently.
|
||||
fp = cStringIO.StringIO()
|
||||
data = data + " " # buffer for the +1 test
|
||||
c = i = 0
|
||||
word = ""
|
||||
octdigits = "01234567"
|
||||
hexdigits = "0123456789abcdef"
|
||||
while i < len(data):
|
||||
if data[i] != "\\":
|
||||
word = data[i]
|
||||
i = i + 1
|
||||
else:
|
||||
if data[i+1] in octdigits:
|
||||
for n in range(2, 5):
|
||||
if data[i+n] not in octdigits:
|
||||
break
|
||||
word = data[i:i+n]
|
||||
i = i + n
|
||||
elif data[i+1] == 'x':
|
||||
for n in range(2, 5):
|
||||
if data[i+n] not in hexdigits:
|
||||
break
|
||||
word = data[i:i+n]
|
||||
i = i + n
|
||||
else:
|
||||
word = data[i:i+2]
|
||||
i = i + 2
|
||||
|
||||
l = len(word)
|
||||
if c + l >= 78-1:
|
||||
fp.write("\\\n")
|
||||
c = 0
|
||||
fp.write(word)
|
||||
c = c + l
|
||||
|
||||
# return the formatted compressed data
|
||||
return fp.getvalue()
|
||||
|
||||
|
||||
|
||||
def main(args):
|
||||
if not args or ("-h" in args):
|
||||
print __doc__
|
||||
return
|
||||
|
||||
append = 0
|
||||
compressed = 1
|
||||
maskClr = None
|
||||
imgName = ""
|
||||
icon = 0
|
||||
|
||||
try:
|
||||
opts, fileArgs = getopt.getopt(args, "auin:m:")
|
||||
except getopt.GetoptError:
|
||||
print __doc__
|
||||
return
|
||||
|
||||
for opt, val in opts:
|
||||
if opt == "-a":
|
||||
append = 1
|
||||
elif opt == "-u":
|
||||
compressed = 0
|
||||
elif opt == "-n":
|
||||
imgName = val
|
||||
elif opt == "-m":
|
||||
maskClr = val
|
||||
elif opt == "-i":
|
||||
icon = 1
|
||||
|
||||
if len(fileArgs) != 2:
|
||||
print __doc__
|
||||
return
|
||||
|
||||
image_file, python_file = fileArgs
|
||||
|
||||
# convert the image file to a temporary file
|
||||
tfname = tempfile.mktemp()
|
||||
ok, msg = img2img.convert(image_file, maskClr, None, tfname, wx.wxBITMAP_TYPE_PNG, ".png")
|
||||
if not ok:
|
||||
print msg
|
||||
return
|
||||
|
||||
data = open(tfname, "rb").read()
|
||||
data = crunch_data(data, compressed)
|
||||
os.unlink(tfname)
|
||||
|
||||
if append:
|
||||
out = open(python_file, "a")
|
||||
else:
|
||||
out = open(python_file, "w")
|
||||
|
||||
out.write("#" + "-" * 70 + "\n")
|
||||
if not append:
|
||||
out.write("# This file was generated by %s\n#\n" % sys.argv[0])
|
||||
out.write("from wxPython.wx import wxImageFromStream, wxBitmapFromImage\n")
|
||||
if icon:
|
||||
out.write("from wxPython.wx import wxEmptyIcon\n")
|
||||
if compressed:
|
||||
out.write("import cStringIO, zlib\n\n\n")
|
||||
else:
|
||||
out.write("import cStringIO\n\n\n")
|
||||
|
||||
if compressed:
|
||||
out.write("def get%sData():\n"
|
||||
" return zlib.decompress(\n%s)\n\n"
|
||||
% (imgName, data))
|
||||
else:
|
||||
out.write("def get%sData():\n"
|
||||
" return %s\n\n"
|
||||
% (imgName, data))
|
||||
|
||||
|
||||
out.write("def get%sBitmap():\n"
|
||||
" return wxBitmapFromImage(get%sImage())\n\n"
|
||||
"def get%sImage():\n"
|
||||
" stream = cStringIO.StringIO(get%sData())\n"
|
||||
" return wxImageFromStream(stream)\n\n"
|
||||
% tuple([imgName] * 4))
|
||||
if icon:
|
||||
out.write("def get%sIcon():\n"
|
||||
" icon = wxEmptyIcon()\n"
|
||||
" icon.CopyFromBitmap(get%sBitmap())\n"
|
||||
" return icon\n\n"
|
||||
% tuple([imgName] * 2))
|
||||
|
||||
|
||||
if imgName:
|
||||
n_msg = ' using "%s"' % imgName
|
||||
else:
|
||||
n_msg = ""
|
||||
if maskClr:
|
||||
m_msg = " with mask %s" % maskClr
|
||||
else:
|
||||
m_msg = ""
|
||||
print "Embedded %s%s into %s%s" % (image_file, n_msg, python_file, m_msg)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv[1:])
|
||||
|
37
wxPython/wxPython/tools/img2xpm.py
Normal file
37
wxPython/wxPython/tools/img2xpm.py
Normal file
@@ -0,0 +1,37 @@
|
||||
#!/usr/bin/env python
|
||||
"""
|
||||
img2xpm.py -- convert several image formats to XPM
|
||||
|
||||
Usage:
|
||||
|
||||
img2xpm.py [options] image_files...
|
||||
|
||||
Options:
|
||||
|
||||
-o <dir> The directory to place the .xpm file(s), defaults to
|
||||
the current directory.
|
||||
|
||||
-m <#rrggbb> If the original image has a mask or transparency defined
|
||||
it will be used by default. You can use this option to
|
||||
override the default or provide a new mask by specifying
|
||||
a colour in the image to mark as transparent.
|
||||
|
||||
-n <name> A filename to write the .xpm data to. Defaults to the
|
||||
basename of the image file + '.xpm' This option overrides
|
||||
the -o option.
|
||||
"""
|
||||
|
||||
|
||||
import sys
|
||||
import img2img
|
||||
from wxPython import wx
|
||||
|
||||
def main():
|
||||
img2img.main(sys.argv[1:], wx.wxBITMAP_TYPE_XPM, ".xpm", __doc__)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user