More XRCed updates from Roman
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14484 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -28,6 +28,8 @@ for each item, as well as optional column or row spanning. Cells with
|
|||||||
no item assigned to it are just left blank. Stretchable rows or
|
no item assigned to it are just left blank. Stretchable rows or
|
||||||
columns are specified and work the same as in wxFlexGridSizer.
|
columns are specified and work the same as in wxFlexGridSizer.
|
||||||
|
|
||||||
|
Updated XRCed from Roman Rolinsky
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
2.3.2.1
|
2.3.2.1
|
||||||
|
@@ -39,17 +39,20 @@ Fixed double-clicking problem with tree control on Windows.
|
|||||||
|
|
||||||
Some performance improovements.
|
Some performance improovements.
|
||||||
|
|
||||||
|
|
||||||
0.0.5
|
0.0.5
|
||||||
-----
|
-----
|
||||||
|
|
||||||
Added notebook with properties page and style page. Fixed some problems
|
Added notebook with properties page and style page. Fixed some problems
|
||||||
on Windows.
|
on Windows.
|
||||||
|
|
||||||
|
|
||||||
0.0.4
|
0.0.4
|
||||||
-----
|
-----
|
||||||
|
|
||||||
Some fixes suggested by RD
|
Some fixes suggested by RD
|
||||||
|
|
||||||
|
|
||||||
0.0.3
|
0.0.3
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
@@ -8,6 +8,7 @@ from wxPython.wx import *
|
|||||||
from wxPython.xrc import *
|
from wxPython.xrc import *
|
||||||
import string
|
import string
|
||||||
import os.path
|
import os.path
|
||||||
|
from types import *
|
||||||
|
|
||||||
# Object which is currently processed
|
# Object which is currently processed
|
||||||
currentXXX = None
|
currentXXX = None
|
||||||
@@ -21,6 +22,8 @@ genericStyles = ['wxSIMPLE_BORDER', 'wxDOUBLE_BORDER',
|
|||||||
'wxTRANSPARENT_WINDOW', 'wxWANTS_CHARS',
|
'wxTRANSPARENT_WINDOW', 'wxWANTS_CHARS',
|
||||||
'wxNO_FULL_REPAINT_ON_RESIZE']
|
'wxNO_FULL_REPAINT_ON_RESIZE']
|
||||||
|
|
||||||
|
buttonSize = (55,-1)
|
||||||
|
|
||||||
# Class that can properly disable children
|
# Class that can properly disable children
|
||||||
class PPanel(wxPanel):
|
class PPanel(wxPanel):
|
||||||
def __init__(self, parent, name):
|
def __init__(self, parent, name):
|
||||||
@@ -43,8 +46,8 @@ class ParamBinaryOr(PPanel):
|
|||||||
self.SetBackgroundColour(panel.GetBackgroundColour())
|
self.SetBackgroundColour(panel.GetBackgroundColour())
|
||||||
sizer = wxBoxSizer()
|
sizer = wxBoxSizer()
|
||||||
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(200,-1))
|
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(200,-1))
|
||||||
sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 10)
|
sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 5)
|
||||||
self.button = wxButton(self, self.ID_BUTTON_CHOICES, 'Edit...')
|
self.button = wxButton(self, self.ID_BUTTON_CHOICES, 'Edit...', size=buttonSize)
|
||||||
sizer.Add(self.button, 0, wxALIGN_CENTER_VERTICAL)
|
sizer.Add(self.button, 0, wxALIGN_CENTER_VERTICAL)
|
||||||
self.SetAutoLayout(true)
|
self.SetAutoLayout(true)
|
||||||
self.SetSizer(sizer)
|
self.SetSizer(sizer)
|
||||||
@@ -141,8 +144,8 @@ class ParamColour(PPanel):
|
|||||||
self.ID_BUTTON = wxNewId()
|
self.ID_BUTTON = wxNewId()
|
||||||
self.SetBackgroundColour(panel.GetBackgroundColour())
|
self.SetBackgroundColour(panel.GetBackgroundColour())
|
||||||
sizer = wxBoxSizer()
|
sizer = wxBoxSizer()
|
||||||
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(60,-1))
|
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=buttonSize)
|
||||||
sizer.Add(self.text, 0, wxRIGHT, 10)
|
sizer.Add(self.text, 0, wxRIGHT, 5)
|
||||||
self.button = wxPanel(self, self.ID_BUTTON, wxDefaultPosition, wxSize(40, -1))
|
self.button = wxPanel(self, self.ID_BUTTON, wxDefaultPosition, wxSize(40, -1))
|
||||||
sizer.Add(self.button, 0, wxGROW)
|
sizer.Add(self.button, 0, wxGROW)
|
||||||
self.SetAutoLayout(true)
|
self.SetAutoLayout(true)
|
||||||
@@ -207,8 +210,8 @@ class ParamFont(PPanel):
|
|||||||
self.SetBackgroundColour(panel.GetBackgroundColour())
|
self.SetBackgroundColour(panel.GetBackgroundColour())
|
||||||
sizer = wxBoxSizer()
|
sizer = wxBoxSizer()
|
||||||
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(200,-1))
|
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(200,-1))
|
||||||
sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 10)
|
sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 5)
|
||||||
self.button = wxButton(self, self.ID_BUTTON_SELECT, 'Select...')
|
self.button = wxButton(self, self.ID_BUTTON_SELECT, 'Select...', size=buttonSize)
|
||||||
sizer.Add(self.button, 0, wxALIGN_CENTER_VERTICAL)
|
sizer.Add(self.button, 0, wxALIGN_CENTER_VERTICAL)
|
||||||
self.SetAutoLayout(true)
|
self.SetAutoLayout(true)
|
||||||
self.SetSizer(sizer)
|
self.SetSizer(sizer)
|
||||||
@@ -353,21 +356,21 @@ class ParamPosSize(ParamText):
|
|||||||
class ContentDialog(wxDialogPtr):
|
class ContentDialog(wxDialogPtr):
|
||||||
def __init__(self, parent, value):
|
def __init__(self, parent, value):
|
||||||
# Is this normal???
|
# Is this normal???
|
||||||
w = frame.res.LoadDialog(parent, 'ID_DIALOG_CONTENT')
|
w = frame.res.LoadDialog(parent, 'DIALOG_CONTENT')
|
||||||
wxDialogPtr.__init__(self, w.this)
|
wxDialogPtr.__init__(self, w.this)
|
||||||
self.thisown = 1
|
self.thisown = 1
|
||||||
self.Center()
|
self.Center()
|
||||||
self.list = self.FindWindowByName('ID_LIST')
|
self.list = self.FindWindowByName('LIST')
|
||||||
# Set list items
|
# Set list items
|
||||||
for v in value:
|
for v in value:
|
||||||
self.list.Append(v)
|
self.list.Append(v)
|
||||||
self.SetAutoLayout(true)
|
self.SetAutoLayout(true)
|
||||||
self.GetSizer().Fit(self)
|
self.GetSizer().Fit(self)
|
||||||
# Callbacks
|
# Callbacks
|
||||||
self.ID_BUTTON_APPEND = XMLID('ID_BUTTON_APPEND')
|
self.ID_BUTTON_APPEND = XMLID('BUTTON_APPEND')
|
||||||
self.ID_BUTTON_REMOVE = XMLID('ID_BUTTON_REMOVE')
|
self.ID_BUTTON_REMOVE = XMLID('BUTTON_REMOVE')
|
||||||
self.ID_BUTTON_UP = XMLID('ID_BUTTON_UP')
|
self.ID_BUTTON_UP = XMLID('BUTTON_UP')
|
||||||
self.ID_BUTTON_DOWN = XMLID('ID_BUTTON_DOWN')
|
self.ID_BUTTON_DOWN = XMLID('BUTTON_DOWN')
|
||||||
EVT_BUTTON(self, self.ID_BUTTON_UP, self.OnButtonUp)
|
EVT_BUTTON(self, self.ID_BUTTON_UP, self.OnButtonUp)
|
||||||
EVT_BUTTON(self, self.ID_BUTTON_DOWN, self.OnButtonDown)
|
EVT_BUTTON(self, self.ID_BUTTON_DOWN, self.OnButtonDown)
|
||||||
EVT_BUTTON(self, self.ID_BUTTON_APPEND, self.OnButtonAppend)
|
EVT_BUTTON(self, self.ID_BUTTON_APPEND, self.OnButtonAppend)
|
||||||
@@ -404,11 +407,11 @@ class ContentDialog(wxDialogPtr):
|
|||||||
class ContentCheckListDialog(wxDialogPtr):
|
class ContentCheckListDialog(wxDialogPtr):
|
||||||
def __init__(self, parent, value):
|
def __init__(self, parent, value):
|
||||||
# Is this normal???
|
# Is this normal???
|
||||||
w = frame.res.LoadDialog(parent, 'ID_DIALOG_CONTENT_CHECK_LIST')
|
w = frame.res.LoadDialog(parent, 'DIALOG_CONTENT_CHECK_LIST')
|
||||||
wxDialogPtr.__init__(self, w.this)
|
wxDialogPtr.__init__(self, w.this)
|
||||||
self.thisown = 1
|
self.thisown = 1
|
||||||
self.Center()
|
self.Center()
|
||||||
self.list = self.FindWindowByName('ID_CHECK_LIST')
|
self.list = self.FindWindowByName('CHECK_LIST')
|
||||||
# Set list items
|
# Set list items
|
||||||
i = 0
|
i = 0
|
||||||
for v,ch in value:
|
for v,ch in value:
|
||||||
@@ -418,10 +421,10 @@ class ContentCheckListDialog(wxDialogPtr):
|
|||||||
self.SetAutoLayout(true)
|
self.SetAutoLayout(true)
|
||||||
self.GetSizer().Fit(self)
|
self.GetSizer().Fit(self)
|
||||||
# Callbacks
|
# Callbacks
|
||||||
self.ID_BUTTON_APPEND = XMLID('ID_BUTTON_APPEND')
|
self.ID_BUTTON_APPEND = XMLID('BUTTON_APPEND')
|
||||||
self.ID_BUTTON_REMOVE = XMLID('ID_BUTTON_REMOVE')
|
self.ID_BUTTON_REMOVE = XMLID('BUTTON_REMOVE')
|
||||||
self.ID_BUTTON_UP = XMLID('ID_BUTTON_UP')
|
self.ID_BUTTON_UP = XMLID('BUTTON_UP')
|
||||||
self.ID_BUTTON_DOWN = XMLID('ID_BUTTON_DOWN')
|
self.ID_BUTTON_DOWN = XMLID('BUTTON_DOWN')
|
||||||
EVT_CHECKLISTBOX(self, self.list.GetId(), self.OnCheck)
|
EVT_CHECKLISTBOX(self, self.list.GetId(), self.OnCheck)
|
||||||
EVT_BUTTON(self, self.ID_BUTTON_UP, self.OnButtonUp)
|
EVT_BUTTON(self, self.ID_BUTTON_UP, self.OnButtonUp)
|
||||||
EVT_BUTTON(self, self.ID_BUTTON_DOWN, self.OnButtonDown)
|
EVT_BUTTON(self, self.ID_BUTTON_DOWN, self.OnButtonDown)
|
||||||
@@ -469,8 +472,8 @@ class ParamContent(PPanel):
|
|||||||
self.SetBackgroundColour(panel.GetBackgroundColour())
|
self.SetBackgroundColour(panel.GetBackgroundColour())
|
||||||
sizer = wxBoxSizer()
|
sizer = wxBoxSizer()
|
||||||
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(200,-1))
|
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(200,-1))
|
||||||
sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 10)
|
sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 5)
|
||||||
self.button = wxButton(self, self.ID_BUTTON_EDIT, 'Edit...')
|
self.button = wxButton(self, self.ID_BUTTON_EDIT, 'Edit...', size=buttonSize)
|
||||||
sizer.Add(self.button, 0, wxALIGN_CENTER_VERTICAL)
|
sizer.Add(self.button, 0, wxALIGN_CENTER_VERTICAL)
|
||||||
self.SetAutoLayout(true)
|
self.SetAutoLayout(true)
|
||||||
self.SetSizer(sizer)
|
self.SetSizer(sizer)
|
||||||
@@ -493,6 +496,7 @@ class ParamContent(PPanel):
|
|||||||
return self.value
|
return self.value
|
||||||
def SetValue(self, value):
|
def SetValue(self, value):
|
||||||
self.freeze = true
|
self.freeze = true
|
||||||
|
if not value: value = []
|
||||||
self.value = value
|
self.value = value
|
||||||
self.text.SetValue(str(value)) # update text ctrl
|
self.text.SetValue(str(value)) # update text ctrl
|
||||||
self.freeze = false
|
self.freeze = false
|
||||||
@@ -515,41 +519,9 @@ class ParamContent(PPanel):
|
|||||||
dlg.Destroy()
|
dlg.Destroy()
|
||||||
|
|
||||||
# CheckList content
|
# CheckList content
|
||||||
class ParamContentCheckList(PPanel):
|
class ParamContentCheckList(ParamContent):
|
||||||
def __init__(self, parent, name):
|
def __init__(self, parent, name):
|
||||||
PPanel.__init__(self, parent, name)
|
ParamContent.__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, 10)
|
|
||||||
self.button = wxButton(self, self.ID_BUTTON_EDIT, 'Edit...')
|
|
||||||
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
|
|
||||||
self.value = value
|
|
||||||
self.text.SetValue(str(value)) # update text ctrl
|
|
||||||
self.freeze = false
|
|
||||||
def OnButtonEdit(self, evt):
|
def OnButtonEdit(self, evt):
|
||||||
if self.textModified: # text has newer value
|
if self.textModified: # text has newer value
|
||||||
try:
|
try:
|
||||||
@@ -568,6 +540,75 @@ class ParamContentCheckList(PPanel):
|
|||||||
self.textModified = false
|
self.textModified = false
|
||||||
dlg.Destroy()
|
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
|
# Boxless radiobox
|
||||||
class RadioBox(PPanel):
|
class RadioBox(PPanel):
|
||||||
def __init__(self, parent, id, choices,
|
def __init__(self, parent, id, choices,
|
||||||
@@ -627,8 +668,8 @@ class ParamFile(PPanel):
|
|||||||
self.SetBackgroundColour(panel.GetBackgroundColour())
|
self.SetBackgroundColour(panel.GetBackgroundColour())
|
||||||
sizer = wxBoxSizer()
|
sizer = wxBoxSizer()
|
||||||
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(200,-1))
|
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(200,-1))
|
||||||
sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 10)
|
sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 5)
|
||||||
self.button = wxButton(self, self.ID_BUTTON_BROWSE, 'Browse...')
|
self.button = wxButton(self, self.ID_BUTTON_BROWSE, 'Browse...',size=buttonSize)
|
||||||
sizer.Add(self.button, 0, wxALIGN_CENTER_VERTICAL)
|
sizer.Add(self.button, 0, wxALIGN_CENTER_VERTICAL)
|
||||||
self.SetAutoLayout(true)
|
self.SetAutoLayout(true)
|
||||||
self.SetSizer(sizer)
|
self.SetSizer(sizer)
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 766 B After Width: | Height: | Size: 2.2 KiB |
@@ -9,7 +9,6 @@ from wxPython.xrc import *
|
|||||||
from wxPython.html import *
|
from wxPython.html import *
|
||||||
from xml.dom import minidom
|
from xml.dom import minidom
|
||||||
import os
|
import os
|
||||||
import tempfile
|
|
||||||
import getopt
|
import getopt
|
||||||
|
|
||||||
# Icons
|
# Icons
|
||||||
@@ -17,13 +16,18 @@ import images
|
|||||||
|
|
||||||
# Constants
|
# Constants
|
||||||
|
|
||||||
if wxGetOsVersion()[1] == 1:
|
# Return code from wxGetOsVersion
|
||||||
|
wxGTK = 9
|
||||||
|
|
||||||
|
if wxGetOsVersion()[0] == wxGTK:
|
||||||
labelFont = wxFont(12, wxDEFAULT, wxNORMAL, wxBOLD)
|
labelFont = wxFont(12, wxDEFAULT, wxNORMAL, wxBOLD)
|
||||||
|
modernFont = wxFont(12, wxMODERN, wxNORMAL, wxNORMAL)
|
||||||
else:
|
else:
|
||||||
labelFont = wxFont(10, wxDEFAULT, wxNORMAL, wxBOLD)
|
labelFont = wxFont(10, wxDEFAULT, wxNORMAL, wxBOLD)
|
||||||
|
modernFont = wxFont(10, wxMODERN, wxNORMAL, wxNORMAL)
|
||||||
|
|
||||||
progname = 'XRCed'
|
progname = 'XRCed'
|
||||||
version = '0.0.7-1'
|
version = '0.0.7-2'
|
||||||
|
|
||||||
# Local modules
|
# Local modules
|
||||||
from xxx import *
|
from xxx import *
|
||||||
@@ -217,7 +221,11 @@ class ParamPage(wxPanel):
|
|||||||
w.SetValue('') # set empty (default) value
|
w.SetValue('') # set empty (default) value
|
||||||
w.SetModified() # mark as changed
|
w.SetModified() # mark as changed
|
||||||
elem = tree.dom.createElement(param)
|
elem = tree.dom.createElement(param)
|
||||||
xxx.params[param] = xxxParam(elem)
|
# Some classes are special
|
||||||
|
if param == 'font':
|
||||||
|
xxx.params[param] = xxxParamFont(xxx.element, elem)
|
||||||
|
else:
|
||||||
|
xxx.params[param] = xxxParam(elem)
|
||||||
# Find place to put new element: first present element after param
|
# Find place to put new element: first present element after param
|
||||||
found = false
|
found = false
|
||||||
paramStyles = xxx.allParams + xxx.styles
|
paramStyles = xxx.allParams + xxx.styles
|
||||||
@@ -275,7 +283,7 @@ class PropPage(ParamPage):
|
|||||||
topSizer = wxStaticBoxSizer(box, wxVERTICAL)
|
topSizer = wxStaticBoxSizer(box, wxVERTICAL)
|
||||||
sizer = wxFlexGridSizer(len(xxx.allParams), 2, 1, 1)
|
sizer = wxFlexGridSizer(len(xxx.allParams), 2, 1, 1)
|
||||||
if xxx.hasName:
|
if xxx.hasName:
|
||||||
label = wxStaticText(self, -1, 'XML ID:', size=(80,-1))
|
label = wxStaticText(self, -1, 'XML ID:', size=(100,-1))
|
||||||
control = ParamText(self, name='XML_name')
|
control = ParamText(self, name='XML_name')
|
||||||
sizer.AddMany([ (label, 0, wxALIGN_CENTER_VERTICAL),
|
sizer.AddMany([ (label, 0, wxALIGN_CENTER_VERTICAL),
|
||||||
(control, 0, wxALIGN_CENTER_VERTICAL) ])
|
(control, 0, wxALIGN_CENTER_VERTICAL) ])
|
||||||
@@ -284,13 +292,13 @@ class PropPage(ParamPage):
|
|||||||
present = param in xxx.params
|
present = param in xxx.params
|
||||||
if param in xxx.required:
|
if param in xxx.required:
|
||||||
label = wxStaticText(self, paramIDs[param], param + ':',
|
label = wxStaticText(self, paramIDs[param], param + ':',
|
||||||
size = (80,-1), name = param)
|
size = (100,-1), name = param)
|
||||||
else:
|
else:
|
||||||
# Notebook has one very loooooong parameter
|
# Notebook has one very loooooong parameter
|
||||||
if param == 'usenotebooksizer': sParam = 'usesizer:'
|
if param == 'usenotebooksizer': sParam = 'usesizer:'
|
||||||
else: sParam = param + ':'
|
else: sParam = param + ':'
|
||||||
label = wxCheckBox(self, paramIDs[param], sParam,
|
label = wxCheckBox(self, paramIDs[param], sParam,
|
||||||
size = (80,-1), name = param)
|
size = (100,-1), name = param)
|
||||||
self.checks[param] = label
|
self.checks[param] = label
|
||||||
try:
|
try:
|
||||||
typeClass = xxx.paramDict[param]
|
typeClass = xxx.paramDict[param]
|
||||||
@@ -306,7 +314,7 @@ class PropPage(ParamPage):
|
|||||||
sizer.AddMany([ (label, 0, wxALIGN_CENTER_VERTICAL),
|
sizer.AddMany([ (label, 0, wxALIGN_CENTER_VERTICAL),
|
||||||
(control, 0, wxALIGN_CENTER_VERTICAL) ])
|
(control, 0, wxALIGN_CENTER_VERTICAL) ])
|
||||||
self.controls[param] = control
|
self.controls[param] = control
|
||||||
topSizer.Add(sizer, 1, wxALL | wxEXPAND, 5)
|
topSizer.Add(sizer, 1, wxALL | wxEXPAND, 3)
|
||||||
self.SetAutoLayout(true)
|
self.SetAutoLayout(true)
|
||||||
self.SetSizer(topSizer)
|
self.SetSizer(topSizer)
|
||||||
topSizer.Fit(self)
|
topSizer.Fit(self)
|
||||||
@@ -343,7 +351,7 @@ class StylePage(ParamPage):
|
|||||||
for param in xxx.styles:
|
for param in xxx.styles:
|
||||||
present = param in xxx.params.keys()
|
present = param in xxx.params.keys()
|
||||||
check = wxCheckBox(self, paramIDs[param],
|
check = wxCheckBox(self, paramIDs[param],
|
||||||
param + ':', size = (80,-1), name = param)
|
param + ':', size = (100,-1), name = param)
|
||||||
check.SetValue(present)
|
check.SetValue(present)
|
||||||
control = paramDict[param](self, name = param)
|
control = paramDict[param](self, name = param)
|
||||||
control.Enable(present)
|
control.Enable(present)
|
||||||
@@ -351,7 +359,7 @@ class StylePage(ParamPage):
|
|||||||
(control, 0, wxALIGN_CENTER_VERTICAL) ])
|
(control, 0, wxALIGN_CENTER_VERTICAL) ])
|
||||||
self.checks[param] = check
|
self.checks[param] = check
|
||||||
self.controls[param] = control
|
self.controls[param] = control
|
||||||
topSizer.Add(sizer, 1, wxALL | wxEXPAND, 5)
|
topSizer.Add(sizer, 1, wxALL | wxEXPAND, 3)
|
||||||
self.SetAutoLayout(true)
|
self.SetAutoLayout(true)
|
||||||
self.SetSizer(topSizer)
|
self.SetSizer(topSizer)
|
||||||
topSizer.Fit(self)
|
topSizer.Fit(self)
|
||||||
@@ -422,7 +430,7 @@ class XML_Tree(wxTreeCtrl):
|
|||||||
|
|
||||||
self.needUpdate = false
|
self.needUpdate = false
|
||||||
self.pendingHighLight = None
|
self.pendingHighLight = None
|
||||||
self.ctrl = false
|
self.ctrl = self.shift = false
|
||||||
self.dom = None
|
self.dom = None
|
||||||
# Create image list
|
# Create image list
|
||||||
il = wxImageList(16, 16, true)
|
il = wxImageList(16, 16, true)
|
||||||
@@ -542,6 +550,8 @@ class XML_Tree(wxTreeCtrl):
|
|||||||
return node
|
return node
|
||||||
# Find position relative to the top-level window
|
# Find position relative to the top-level window
|
||||||
def FindNodePos(self, item):
|
def FindNodePos(self, item):
|
||||||
|
# Root at (0,0)
|
||||||
|
if item == testWin.item: return wxPoint(0, 0)
|
||||||
itemParent = self.GetItemParent(item)
|
itemParent = self.GetItemParent(item)
|
||||||
# Select NB page
|
# Select NB page
|
||||||
obj = self.FindNodeObject(item)
|
obj = self.FindNodeObject(item)
|
||||||
@@ -552,8 +562,6 @@ class XML_Tree(wxTreeCtrl):
|
|||||||
if notebook.GetPage(i) == obj:
|
if notebook.GetPage(i) == obj:
|
||||||
if notebook.GetSelection() != i: notebook.SetSelection(i)
|
if notebook.GetSelection() != i: notebook.SetSelection(i)
|
||||||
break
|
break
|
||||||
# Root at (0,0)
|
|
||||||
if itemParent == self.root: return wxPoint(0, 0)
|
|
||||||
# Find first ancestor which is a wxWindow (not a sizer)
|
# Find first ancestor which is a wxWindow (not a sizer)
|
||||||
winParent = itemParent
|
winParent = itemParent
|
||||||
while self.GetPyData(winParent).isSizer:
|
while self.GetPyData(winParent).isSizer:
|
||||||
@@ -565,9 +573,9 @@ class XML_Tree(wxTreeCtrl):
|
|||||||
return parentPos + pos
|
return parentPos + pos
|
||||||
# Find window (or sizer) corresponding to a tree item.
|
# Find window (or sizer) corresponding to a tree item.
|
||||||
def FindNodeObject(self, item):
|
def FindNodeObject(self, item):
|
||||||
|
if item == testWin.item: return testWin.panel
|
||||||
itemParent = self.GetItemParent(item)
|
itemParent = self.GetItemParent(item)
|
||||||
# If top-level, return testWin (or panel if wxFrame)
|
# If top-level, return testWin (or panel if wxFrame)
|
||||||
if itemParent == self.root: return testWin.panel
|
|
||||||
xxx = self.GetPyData(item).treeObject()
|
xxx = self.GetPyData(item).treeObject()
|
||||||
parentWin = self.FindNodeObject(itemParent)
|
parentWin = self.FindNodeObject(itemParent)
|
||||||
# Top-level sizer? return window's sizer
|
# Top-level sizer? return window's sizer
|
||||||
@@ -601,7 +609,7 @@ class XML_Tree(wxTreeCtrl):
|
|||||||
if panel.IsModified():
|
if panel.IsModified():
|
||||||
self.Apply(xxx, oldItem)
|
self.Apply(xxx, oldItem)
|
||||||
#if conf.autoRefresh:
|
#if conf.autoRefresh:
|
||||||
if testWin and tree.GetItemAncestor(oldItem) == testWin.item:
|
if testWin and not tree.IsHighlatable(oldItem):
|
||||||
if testWin.highLight:
|
if testWin.highLight:
|
||||||
testWin.highLight.Remove()
|
testWin.highLight.Remove()
|
||||||
self.needUpdate = true
|
self.needUpdate = true
|
||||||
@@ -619,11 +627,13 @@ class XML_Tree(wxTreeCtrl):
|
|||||||
panel.SetModified(false)
|
panel.SetModified(false)
|
||||||
# Hightlighting is done in OnIdle
|
# Hightlighting is done in OnIdle
|
||||||
tree.pendingHighLight = self.selection
|
tree.pendingHighLight = self.selection
|
||||||
# Find top-level parent
|
# Check if item is in testWin subtree
|
||||||
def GetItemAncestor(self, item):
|
def IsHighlatable(self, item):
|
||||||
while self.GetItemParent(item) != self.root:
|
if item == testWin.item: return false
|
||||||
|
while item != self.root:
|
||||||
item = self.GetItemParent(item)
|
item = self.GetItemParent(item)
|
||||||
return item
|
if item == testWin.item: return true
|
||||||
|
return false
|
||||||
# Highlight selected item
|
# Highlight selected item
|
||||||
def HighLight(self, item):
|
def HighLight(self, item):
|
||||||
self.pendingHighLight = None
|
self.pendingHighLight = None
|
||||||
@@ -635,7 +645,7 @@ class XML_Tree(wxTreeCtrl):
|
|||||||
if testWin.highLight: testWin.highLight.Remove()
|
if testWin.highLight: testWin.highLight.Remove()
|
||||||
return
|
return
|
||||||
# If a control from another window is selected, remove highlight
|
# If a control from another window is selected, remove highlight
|
||||||
if self.GetItemAncestor(item) != testWin.item:
|
if not self.IsHighlatable(item):
|
||||||
if testWin.highLight: testWin.highLight.Remove()
|
if testWin.highLight: testWin.highLight.Remove()
|
||||||
return
|
return
|
||||||
# Get window/sizer object
|
# Get window/sizer object
|
||||||
@@ -680,6 +690,7 @@ class XML_Tree(wxTreeCtrl):
|
|||||||
# (re)create test window
|
# (re)create test window
|
||||||
def CreateTestWin(self, item):
|
def CreateTestWin(self, item):
|
||||||
global testWin
|
global testWin
|
||||||
|
wxBeginBusyCursor()
|
||||||
# Create a window with this resource
|
# Create a window with this resource
|
||||||
xxx = self.GetPyData(item).treeObject()
|
xxx = self.GetPyData(item).treeObject()
|
||||||
# Close old window, remember where it was
|
# Close old window, remember where it was
|
||||||
@@ -691,7 +702,7 @@ class XML_Tree(wxTreeCtrl):
|
|||||||
if testWin.highLight:
|
if testWin.highLight:
|
||||||
highLight = testWin.highLight.item
|
highLight = testWin.highLight.item
|
||||||
# !!! if 0 is removed, refresh is broken (notebook not deleted?)
|
# !!! if 0 is removed, refresh is broken (notebook not deleted?)
|
||||||
if 0 and xxx.className == 'wxPanel':
|
if xxx.className == 'wxPanel':
|
||||||
if testWin.highLight:
|
if testWin.highLight:
|
||||||
testWin.pendingHighLight = highLight
|
testWin.pendingHighLight = highLight
|
||||||
testWin.highLight.Remove()
|
testWin.highLight.Remove()
|
||||||
@@ -732,6 +743,8 @@ class XML_Tree(wxTreeCtrl):
|
|||||||
# Create new frame
|
# Create new frame
|
||||||
testWin = wxPreFrame()
|
testWin = wxPreFrame()
|
||||||
res.LoadFrame(testWin, frame, xxx.name)
|
res.LoadFrame(testWin, frame, xxx.name)
|
||||||
|
# Create status bar
|
||||||
|
testWin.CreateStatusBar()
|
||||||
testWin.panel = testWin
|
testWin.panel = testWin
|
||||||
testWin.SetPosition(pos)
|
testWin.SetPosition(pos)
|
||||||
testWin.Show(true)
|
testWin.Show(true)
|
||||||
@@ -751,6 +764,7 @@ class XML_Tree(wxTreeCtrl):
|
|||||||
testWin.Show(true)
|
testWin.Show(true)
|
||||||
elif xxx.className == 'wxMenuBar':
|
elif xxx.className == 'wxMenuBar':
|
||||||
testWin = wxFrame(frame, -1, 'MenuBar: ' + xxx.name, pos=pos)
|
testWin = wxFrame(frame, -1, 'MenuBar: ' + xxx.name, pos=pos)
|
||||||
|
testWin.panel = None
|
||||||
# Set status bar to display help
|
# Set status bar to display help
|
||||||
testWin.CreateStatusBar()
|
testWin.CreateStatusBar()
|
||||||
testWin.menuBar = res.LoadMenuBar(xxx.name)
|
testWin.menuBar = res.LoadMenuBar(xxx.name)
|
||||||
@@ -758,6 +772,7 @@ class XML_Tree(wxTreeCtrl):
|
|||||||
testWin.Show(true)
|
testWin.Show(true)
|
||||||
elif xxx.className == 'wxToolBar':
|
elif xxx.className == 'wxToolBar':
|
||||||
testWin = wxFrame(frame, -1, 'ToolBar: ' + xxx.name, pos=pos)
|
testWin = wxFrame(frame, -1, 'ToolBar: ' + xxx.name, pos=pos)
|
||||||
|
testWin.panel = None
|
||||||
# Set status bar to display help
|
# Set status bar to display help
|
||||||
testWin.CreateStatusBar()
|
testWin.CreateStatusBar()
|
||||||
testWin.toolBar = res.LoadToolBar(testWin, xxx.name)
|
testWin.toolBar = res.LoadToolBar(testWin, xxx.name)
|
||||||
@@ -765,10 +780,13 @@ class XML_Tree(wxTreeCtrl):
|
|||||||
testWin.Show(true)
|
testWin.Show(true)
|
||||||
wxMemoryFSHandler_RemoveFile('xxx.xrc')
|
wxMemoryFSHandler_RemoveFile('xxx.xrc')
|
||||||
testWin.item = item
|
testWin.item = item
|
||||||
testWin.Connect(testWin.GetId(), -1, wxEVT_CLOSE_WINDOW, self.OnCloseTestWin)
|
EVT_CLOSE(testWin, self.OnCloseTestWin)
|
||||||
|
EVT_BUTTON(testWin, wxID_OK, self.OnCloseTestWin)
|
||||||
|
EVT_BUTTON(testWin, wxID_CANCEL, self.OnCloseTestWin)
|
||||||
testWin.highLight = None
|
testWin.highLight = None
|
||||||
if highLight and not tree.pendingHighLight:
|
if highLight and not tree.pendingHighLight:
|
||||||
self.HighLight(highLight)
|
self.HighLight(highLight)
|
||||||
|
wxEndBusyCursor()
|
||||||
|
|
||||||
def OnCloseTestWin(self, evt):
|
def OnCloseTestWin(self, evt):
|
||||||
global testWin, testWinPos
|
global testWin, testWinPos
|
||||||
@@ -776,13 +794,20 @@ class XML_Tree(wxTreeCtrl):
|
|||||||
testWinPos = testWin.GetPosition()
|
testWinPos = testWin.GetPosition()
|
||||||
testWin.Destroy()
|
testWin.Destroy()
|
||||||
testWin = None
|
testWin = None
|
||||||
evt.Skip()
|
|
||||||
|
# Return item index in parent
|
||||||
|
def ItemIndex(self, parent, item):
|
||||||
|
i = 0
|
||||||
|
it, cookie = self.GetFirstChild(parent, 0)
|
||||||
|
while it != item:
|
||||||
|
i += 1
|
||||||
|
it, cookie = self.GetNextChild(parent, cookie)
|
||||||
|
return i
|
||||||
|
|
||||||
# True if next item should be inserted after current (vs. appended to it)
|
# True if next item should be inserted after current (vs. appended to it)
|
||||||
def NeedInsert(self, item):
|
def NeedInsert(self, item):
|
||||||
xxx = self.GetPyData(item)
|
xxx = self.GetPyData(item)
|
||||||
if item == self.root: return false # root item
|
if item == self.root: return false # root item
|
||||||
if self.ctrl: return true # if Ctrl pressed, always insert
|
|
||||||
if xxx.hasChildren and not self.GetChildrenCount(item, false):
|
if xxx.hasChildren and not self.GetChildrenCount(item, false):
|
||||||
return false
|
return false
|
||||||
return not (self.IsExpanded(item) and self.GetChildrenCount(item, false))
|
return not (self.IsExpanded(item) and self.GetChildrenCount(item, false))
|
||||||
@@ -806,10 +831,11 @@ class XML_Tree(wxTreeCtrl):
|
|||||||
self.ctrl = evt.ControlDown() # save Ctrl state
|
self.ctrl = evt.ControlDown() # save Ctrl state
|
||||||
self.shift = evt.ShiftDown() # and Shift too
|
self.shift = evt.ShiftDown() # and Shift too
|
||||||
m = wxMenu() # create menu
|
m = wxMenu() # create menu
|
||||||
needInsert = false
|
if self.ctrl:
|
||||||
if item != self.root: needInsert = self.NeedInsert(item)
|
needInsert = true
|
||||||
if item == self.root or \
|
else:
|
||||||
self.GetItemParent(item) == self.root and needInsert:
|
needInsert = self.NeedInsert(item)
|
||||||
|
if item == self.root or needInsert and self.GetItemParent(item) == self.root:
|
||||||
m.Append(pullDownMenu.ID_NEW_PANEL, 'Panel', 'Create panel')
|
m.Append(pullDownMenu.ID_NEW_PANEL, 'Panel', 'Create panel')
|
||||||
m.Append(pullDownMenu.ID_NEW_DIALOG, 'Dialog', 'Create dialog')
|
m.Append(pullDownMenu.ID_NEW_DIALOG, 'Dialog', 'Create dialog')
|
||||||
m.Append(pullDownMenu.ID_NEW_FRAME, 'Frame', 'Create frame')
|
m.Append(pullDownMenu.ID_NEW_FRAME, 'Frame', 'Create frame')
|
||||||
@@ -854,7 +880,7 @@ class XML_Tree(wxTreeCtrl):
|
|||||||
menu.Append(wxID_CUT, 'Cut', 'Cut to the clipboard')
|
menu.Append(wxID_CUT, 'Cut', 'Cut to the clipboard')
|
||||||
menu.Append(wxID_COPY, 'Copy', 'Copy to the clipboard')
|
menu.Append(wxID_COPY, 'Copy', 'Copy to the clipboard')
|
||||||
if self.ctrl and item != tree.root:
|
if self.ctrl and item != tree.root:
|
||||||
menu.Append(wxID_PASTE, 'Paste Sibling',
|
menu.Append(pullDownMenu.ID_PASTE_SIBLING, 'Paste Sibling',
|
||||||
'Paste from the clipboard as a sibling')
|
'Paste from the clipboard as a sibling')
|
||||||
else:
|
else:
|
||||||
menu.Append(wxID_PASTE, 'Paste', 'Paste from the clipboard')
|
menu.Append(wxID_PASTE, 'Paste', 'Paste from the clipboard')
|
||||||
@@ -929,6 +955,7 @@ class PullDownMenu:
|
|||||||
ID_NEW_LAST = wxNewId()
|
ID_NEW_LAST = wxNewId()
|
||||||
ID_EXPAND = wxNewId()
|
ID_EXPAND = wxNewId()
|
||||||
ID_COLLAPSE = wxNewId()
|
ID_COLLAPSE = wxNewId()
|
||||||
|
ID_PASTE_SIBLING = wxNewId()
|
||||||
|
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
self.ID_DELETE = parent.ID_DELETE
|
self.ID_DELETE = parent.ID_DELETE
|
||||||
@@ -936,19 +963,38 @@ class PullDownMenu:
|
|||||||
self.ID_NEW_LAST, parent.OnCreate)
|
self.ID_NEW_LAST, parent.OnCreate)
|
||||||
EVT_MENU(parent, self.ID_COLLAPSE, parent.OnCollapse)
|
EVT_MENU(parent, self.ID_COLLAPSE, parent.OnCollapse)
|
||||||
EVT_MENU(parent, self.ID_EXPAND, parent.OnExpand)
|
EVT_MENU(parent, self.ID_EXPAND, parent.OnExpand)
|
||||||
|
EVT_MENU(parent, self.ID_PASTE_SIBLING, parent.OnPaste)
|
||||||
# We connect to tree, but process in frame
|
# We connect to tree, but process in frame
|
||||||
EVT_MENU_HIGHLIGHT_ALL(tree, parent.OnPullDownHighlight)
|
EVT_MENU_HIGHLIGHT_ALL(tree, parent.OnPullDownHighlight)
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
|
# ScrolledMessageDialog - modified from wxPython lib to set fixed-width font
|
||||||
|
class ScrolledMessageDialog(wxDialog):
|
||||||
|
def __init__(self, parent, msg, caption, pos = wxDefaultPosition, size = (500,300)):
|
||||||
|
from wxPython.lib.layoutf import Layoutf
|
||||||
|
wxDialog.__init__(self, parent, -1, caption, pos, size)
|
||||||
|
text = wxTextCtrl(self, -1, msg, wxDefaultPosition,
|
||||||
|
wxDefaultSize, wxTE_MULTILINE | wxTE_READONLY)
|
||||||
|
text.SetFont(modernFont)
|
||||||
|
dc = wxWindowDC(text)
|
||||||
|
w, h = dc.GetTextExtent(' ')
|
||||||
|
ok = wxButton(self, wxID_OK, "OK")
|
||||||
|
text.SetConstraints(Layoutf('t=t5#1;b=t5#2;l=l5#1;r=r5#1', (self,ok)))
|
||||||
|
text.SetSize((w * 80 + 30, h * 40))
|
||||||
|
ok.SetConstraints(Layoutf('b=b5#1;x%w50#1;w!80;h!25', (self,)))
|
||||||
|
self.SetAutoLayout(TRUE)
|
||||||
|
self.Fit()
|
||||||
|
self.CenterOnScreen(wxBOTH)
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
|
||||||
class Frame(wxFrame):
|
class Frame(wxFrame):
|
||||||
def __init__(self, pos, size):
|
def __init__(self, pos, size):
|
||||||
global frame
|
global frame
|
||||||
frame = self
|
frame = self
|
||||||
wxFrame.__init__(self, None, -1, '', pos, size)
|
wxFrame.__init__(self, None, -1, '', pos, size)
|
||||||
self.CreateStatusBar()
|
self.CreateStatusBar()
|
||||||
#self.SetIcon(wxIconFromXPMData(images.getIconData()))
|
|
||||||
#icon = wxIconFromXPMData(images.getIconData())
|
|
||||||
icon = wxIcon(os.path.join(sys.path[0], 'xrced.ico'), wxBITMAP_TYPE_ICO)
|
icon = wxIcon(os.path.join(sys.path[0], 'xrced.ico'), wxBITMAP_TYPE_ICO)
|
||||||
self.SetIcon(icon)
|
self.SetIcon(icon)
|
||||||
|
|
||||||
@@ -958,6 +1004,9 @@ class Frame(wxFrame):
|
|||||||
self.panelWidth = 300
|
self.panelWidth = 300
|
||||||
self.panelHeight = 200
|
self.panelHeight = 200
|
||||||
|
|
||||||
|
# Idle flas
|
||||||
|
self.inIdle = false
|
||||||
|
|
||||||
# Make menus
|
# Make menus
|
||||||
menuBar = wxMenuBar()
|
menuBar = wxMenuBar()
|
||||||
|
|
||||||
@@ -1294,6 +1343,7 @@ class Frame(wxFrame):
|
|||||||
|
|
||||||
def OnCut(self, evt):
|
def OnCut(self, evt):
|
||||||
selected = tree.selection
|
selected = tree.selection
|
||||||
|
if not selected: return # key pressed event
|
||||||
# Undo info
|
# Undo info
|
||||||
self.lastOp = 'CUT'
|
self.lastOp = 'CUT'
|
||||||
self.undo = [tree.GetItemParent(selected), tree.GetPrevSibling(selected)]
|
self.undo = [tree.GetItemParent(selected), tree.GetPrevSibling(selected)]
|
||||||
@@ -1306,7 +1356,7 @@ class Frame(wxFrame):
|
|||||||
testWin = None
|
testWin = None
|
||||||
else:
|
else:
|
||||||
# Remove highlight, update testWin
|
# Remove highlight, update testWin
|
||||||
if tree.GetItemAncestor(selected) == testWin.item:
|
if not tree.IsHighlatable(selected):
|
||||||
if testWin.highLight: testWin.highLight.Remove()
|
if testWin.highLight: testWin.highLight.Remove()
|
||||||
tree.needUpdate = true
|
tree.needUpdate = true
|
||||||
self.clipboard = tree.RemoveLeaf(selected)
|
self.clipboard = tree.RemoveLeaf(selected)
|
||||||
@@ -1318,13 +1368,17 @@ class Frame(wxFrame):
|
|||||||
|
|
||||||
def OnCopy(self, evt):
|
def OnCopy(self, evt):
|
||||||
selected = tree.selection
|
selected = tree.selection
|
||||||
|
if not selected: return # key pressed event
|
||||||
xxx = tree.GetPyData(selected)
|
xxx = tree.GetPyData(selected)
|
||||||
self.clipboard = xxx.element.cloneNode(true)
|
self.clipboard = xxx.element.cloneNode(true)
|
||||||
self.SetStatusText('Copied')
|
self.SetStatusText('Copied')
|
||||||
|
|
||||||
def OnPaste(self, evt):
|
def OnPaste(self, evt):
|
||||||
selected = tree.selection
|
selected = tree.selection
|
||||||
appendChild = not tree.NeedInsert(selected)
|
if not selected: return # key pressed event
|
||||||
|
# For pasting with Ctrl pressed
|
||||||
|
if evt.GetId() == pullDownMenu.ID_PASTE_SIBLING: appendChild = false
|
||||||
|
else: appendChild = not tree.NeedInsert(selected)
|
||||||
xxx = tree.GetPyData(selected)
|
xxx = tree.GetPyData(selected)
|
||||||
if not appendChild:
|
if not appendChild:
|
||||||
# If has next item, insert, else append to parent
|
# If has next item, insert, else append to parent
|
||||||
@@ -1358,6 +1412,8 @@ class Frame(wxFrame):
|
|||||||
x = xxx.treeObject()
|
x = xxx.treeObject()
|
||||||
if x.__class__ in [xxxDialog, xxxFrame, xxxMenuBar, xxxToolBar]:
|
if x.__class__ in [xxxDialog, xxxFrame, xxxMenuBar, xxxToolBar]:
|
||||||
if parent.__class__ != xxxMainNode: error = true
|
if parent.__class__ != xxxMainNode: error = true
|
||||||
|
elif x.__class__ == xxxPanel and parent.__class__ == xxxMainNode:
|
||||||
|
pass
|
||||||
elif x.__class__ == xxxSpacer:
|
elif x.__class__ == xxxSpacer:
|
||||||
if not parent.isSizer: error = true
|
if not parent.isSizer: error = true
|
||||||
elif x.__class__ == xxxSeparator:
|
elif x.__class__ == xxxSeparator:
|
||||||
@@ -1411,8 +1467,12 @@ class Frame(wxFrame):
|
|||||||
node = tree.GetPyData(nextItem).element
|
node = tree.GetPyData(nextItem).element
|
||||||
parent.element.insertBefore(elem, node)
|
parent.element.insertBefore(elem, node)
|
||||||
# Inserting before is difficult, se we insert after or first child
|
# Inserting before is difficult, se we insert after or first child
|
||||||
newItem = tree.InsertItem(parentLeaf, selected, xxx.treeName(),
|
index = tree.ItemIndex(parentLeaf, nextItem)
|
||||||
image=xxx.treeImage(), data=wxTreeItemData(xxx))
|
newItem = tree.InsertItemBefore(parentLeaf, index,
|
||||||
|
xxx.treeName(), image=xxx.treeImage())
|
||||||
|
tree.SetPyData(newItem, xxx)
|
||||||
|
# newItem = tree.InsertItem(parentLeaf, selected, xxx.treeName(),
|
||||||
|
# image=xxx.treeImage(), data=wxTreeItemData(xxx))
|
||||||
# Add children items
|
# Add children items
|
||||||
if xxx.hasChildren:
|
if xxx.hasChildren:
|
||||||
treeObj = xxx.treeObject()
|
treeObj = xxx.treeObject()
|
||||||
@@ -1426,7 +1486,7 @@ class Frame(wxFrame):
|
|||||||
tree.ScrollTo(newItem)
|
tree.ScrollTo(newItem)
|
||||||
tree.Refresh()
|
tree.Refresh()
|
||||||
# Update view?
|
# Update view?
|
||||||
if testWin and tree.GetItemAncestor(newItem) == testWin.item:
|
if testWin and tree.IsHighlatable(newItem):
|
||||||
if conf.autoRefresh:
|
if conf.autoRefresh:
|
||||||
tree.needUpdate = true
|
tree.needUpdate = true
|
||||||
tree.pendingHighLight = newItem
|
tree.pendingHighLight = newItem
|
||||||
@@ -1437,6 +1497,7 @@ class Frame(wxFrame):
|
|||||||
|
|
||||||
def OnDelete(self, evt):
|
def OnDelete(self, evt):
|
||||||
selected = tree.selection
|
selected = tree.selection
|
||||||
|
if not selected: return # key pressed event
|
||||||
# Undo info
|
# Undo info
|
||||||
self.lastOp = 'DELETE'
|
self.lastOp = 'DELETE'
|
||||||
self.undo = [tree.GetItemParent(selected), tree.GetPrevSibling(selected)]
|
self.undo = [tree.GetItemParent(selected), tree.GetPrevSibling(selected)]
|
||||||
@@ -1449,7 +1510,7 @@ class Frame(wxFrame):
|
|||||||
testWin = None
|
testWin = None
|
||||||
else:
|
else:
|
||||||
# Remove highlight, update testWin
|
# Remove highlight, update testWin
|
||||||
if tree.GetItemAncestor(selected) == testWin.item:
|
if not tree.IsHighlatable(selected):
|
||||||
if testWin.highLight: testWin.highLight.Remove()
|
if testWin.highLight: testWin.highLight.Remove()
|
||||||
tree.needUpdate = true
|
tree.needUpdate = true
|
||||||
xnode = tree.RemoveLeaf(selected)
|
xnode = tree.RemoveLeaf(selected)
|
||||||
@@ -1482,6 +1543,7 @@ class Frame(wxFrame):
|
|||||||
self.miniFrame.SetSize((self.panelWidth, self.panelHeight))
|
self.miniFrame.SetSize((self.panelWidth, self.panelHeight))
|
||||||
|
|
||||||
def OnTest(self, evt):
|
def OnTest(self, evt):
|
||||||
|
if not tree.selection: return # key pressed event
|
||||||
tree.ShowTestWindow(tree.selection)
|
tree.ShowTestWindow(tree.selection)
|
||||||
|
|
||||||
def OnRefresh(self, evt):
|
def OnRefresh(self, evt):
|
||||||
@@ -1509,9 +1571,8 @@ class Frame(wxFrame):
|
|||||||
dlg.Destroy()
|
dlg.Destroy()
|
||||||
|
|
||||||
def OnReadme(self, evt):
|
def OnReadme(self, evt):
|
||||||
from wxPython.lib.dialogs import wxScrolledMessageDialog
|
|
||||||
text = open(os.path.join(sys.path[0], 'README'), 'r').read()
|
text = open(os.path.join(sys.path[0], 'README'), 'r').read()
|
||||||
dlg = wxScrolledMessageDialog(self, text, "XRCed README")
|
dlg = ScrolledMessageDialog(self, text, "XRCed README")
|
||||||
dlg.ShowModal()
|
dlg.ShowModal()
|
||||||
dlg.Destroy()
|
dlg.Destroy()
|
||||||
|
|
||||||
@@ -1534,19 +1595,15 @@ class Frame(wxFrame):
|
|||||||
|
|
||||||
def OnCreate(self, evt):
|
def OnCreate(self, evt):
|
||||||
selected = tree.selection
|
selected = tree.selection
|
||||||
appendChild = not tree.NeedInsert(selected)
|
if tree.ctrl: appendChild = false
|
||||||
|
else: appendChild = not tree.NeedInsert(selected)
|
||||||
xxx = tree.GetPyData(selected)
|
xxx = tree.GetPyData(selected)
|
||||||
if not appendChild:
|
if not appendChild:
|
||||||
# If insert before
|
# If insert before
|
||||||
if tree.shift:
|
if tree.shift:
|
||||||
# If has previous item, insert after it, else append to parent
|
# If has previous item, insert after it, else append to parent
|
||||||
nextItem = selected
|
nextItem = selected
|
||||||
selected = tree.GetPrevSibling(selected)
|
parentLeaf = tree.GetItemParent(selected)
|
||||||
if selected:
|
|
||||||
# Insert before nextItem
|
|
||||||
parentLeaf = tree.GetItemParent(selected)
|
|
||||||
else: # last child: change selected to parent
|
|
||||||
parentLeaf = selected = tree.GetItemParent(nextItem)
|
|
||||||
else:
|
else:
|
||||||
# If has next item, insert, else append to parent
|
# If has next item, insert, else append to parent
|
||||||
nextItem = tree.GetNextSibling(selected)
|
nextItem = tree.GetNextSibling(selected)
|
||||||
@@ -1557,13 +1614,11 @@ class Frame(wxFrame):
|
|||||||
appendChild = true
|
appendChild = true
|
||||||
selected = tree.GetItemParent(selected)
|
selected = tree.GetItemParent(selected)
|
||||||
# Expanded container (must have children)
|
# Expanded container (must have children)
|
||||||
else:
|
elif tree.shift and tree.IsExpanded(selected) \
|
||||||
# Can't use HasChildren because root always has
|
and tree.GetChildrenCount(selected, false):
|
||||||
if tree.shift and tree.IsExpanded(selected) \
|
appendChild = false
|
||||||
and tree.GetChildrenCount(selected, false):
|
nextItem = tree.GetFirstChild(selected, 0)[0]
|
||||||
appendChild = false
|
parentLeaf = selected
|
||||||
nextItem = tree.GetFirstChild(selected, 0)[0]
|
|
||||||
parentLeaf = selected
|
|
||||||
# Parent should be tree element or None
|
# Parent should be tree element or None
|
||||||
if appendChild:
|
if appendChild:
|
||||||
parent = tree.GetPyData(selected)
|
parent = tree.GetPyData(selected)
|
||||||
@@ -1592,16 +1647,23 @@ class Frame(wxFrame):
|
|||||||
else:
|
else:
|
||||||
node = tree.GetPyData(nextItem).element
|
node = tree.GetPyData(nextItem).element
|
||||||
parent.element.insertBefore(elem, node)
|
parent.element.insertBefore(elem, node)
|
||||||
newItem = tree.InsertItem(parentLeaf, selected,
|
# !!! There is a different behavious on Win and GTK
|
||||||
xxx.treeName(), image=xxx.treeImage(),
|
# !!! On Win InsertItem(parent, parent, ...) inserts at the end.
|
||||||
data=wxTreeItemData(xxx))
|
index = tree.ItemIndex(parentLeaf, nextItem)
|
||||||
|
newItem = tree.InsertItemBefore(parentLeaf, index,
|
||||||
|
xxx.treeName(), image=xxx.treeImage())
|
||||||
|
# data=wxTreeItemData(xxx)) # does not work
|
||||||
|
tree.SetPyData(newItem, xxx)
|
||||||
|
# newItem = tree.InsertItem(parentLeaf, selected,
|
||||||
|
# xxx.treeName(), image=xxx.treeImage(),
|
||||||
|
# data=wxTreeItemData(xxx))
|
||||||
tree.EnsureVisible(newItem)
|
tree.EnsureVisible(newItem)
|
||||||
tree.SelectItem(newItem)
|
tree.SelectItem(newItem)
|
||||||
if not tree.IsVisible(newItem):
|
if not tree.IsVisible(newItem):
|
||||||
tree.ScrollTo(newItem)
|
tree.ScrollTo(newItem)
|
||||||
tree.Refresh()
|
tree.Refresh()
|
||||||
# Update view?
|
# Update view?
|
||||||
if testWin and tree.GetItemAncestor(newItem) == testWin.item:
|
if testWin and tree.IsHighlatable(newItem):
|
||||||
if conf.autoRefresh:
|
if conf.autoRefresh:
|
||||||
tree.needUpdate = true
|
tree.needUpdate = true
|
||||||
tree.pendingHighLight = newItem
|
tree.pendingHighLight = newItem
|
||||||
@@ -1636,16 +1698,22 @@ class Frame(wxFrame):
|
|||||||
evt.Enable(testWin != None)
|
evt.Enable(testWin != None)
|
||||||
|
|
||||||
def OnIdle(self, evt):
|
def OnIdle(self, evt):
|
||||||
|
if self.inIdle: return # Recursive call protection
|
||||||
|
self.inIdle = true
|
||||||
if tree.needUpdate:
|
if tree.needUpdate:
|
||||||
if conf.autoRefresh:
|
if conf.autoRefresh:
|
||||||
if testWin:
|
if testWin:
|
||||||
|
self.SetStatusText('Refreshing test window...')
|
||||||
# (re)create
|
# (re)create
|
||||||
tree.CreateTestWin(testWin.item)
|
tree.CreateTestWin(testWin.item)
|
||||||
|
wxYield()
|
||||||
|
self.SetStatusText('')
|
||||||
tree.needUpdate = false
|
tree.needUpdate = false
|
||||||
elif tree.pendingHighLight:
|
elif tree.pendingHighLight:
|
||||||
tree.HighLight(tree.pendingHighLight)
|
tree.HighLight(tree.pendingHighLight)
|
||||||
else:
|
else:
|
||||||
evt.Skip()
|
evt.Skip()
|
||||||
|
self.inIdle = false
|
||||||
|
|
||||||
# We don't let close panel window
|
# We don't let close panel window
|
||||||
def OnCloseMiniFrame(self, evt):
|
def OnCloseMiniFrame(self, evt):
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" ?>
|
<?xml version="1.0" ?>
|
||||||
<resource>
|
<resource>
|
||||||
<object class="wxDialog" name="ID_DIALOG_CONTENT">
|
<object class="wxDialog" name="DIALOG_CONTENT">
|
||||||
<title>Content</title>
|
<title>Content</title>
|
||||||
<size>250,300</size>
|
<size>250,300</size>
|
||||||
<object class="wxBoxSizer">
|
<object class="wxBoxSizer">
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
<object class="wxBoxSizer">
|
<object class="wxBoxSizer">
|
||||||
<orient>wxHORIZONTAL</orient>
|
<orient>wxHORIZONTAL</orient>
|
||||||
<object class="sizeritem">
|
<object class="sizeritem">
|
||||||
<object class="wxListBox" name="ID_LIST">
|
<object class="wxListBox" name="LIST">
|
||||||
<content/>
|
<content/>
|
||||||
</object>
|
</object>
|
||||||
<option>1</option>
|
<option>1</option>
|
||||||
@@ -20,14 +20,14 @@
|
|||||||
<object class="wxBoxSizer">
|
<object class="wxBoxSizer">
|
||||||
<orient>wxVERTICAL</orient>
|
<orient>wxVERTICAL</orient>
|
||||||
<object class="sizeritem">
|
<object class="sizeritem">
|
||||||
<object class="wxButton" name="ID_BUTTON_UP">
|
<object class="wxButton" name="BUTTON_UP">
|
||||||
<label>Move Up</label>
|
<label>Move Up</label>
|
||||||
</object>
|
</object>
|
||||||
<flag>wxBOTTOM</flag>
|
<flag>wxBOTTOM</flag>
|
||||||
<border>5</border>
|
<border>5</border>
|
||||||
</object>
|
</object>
|
||||||
<object class="sizeritem">
|
<object class="sizeritem">
|
||||||
<object class="wxButton" name="ID_BUTTON_DOWN">
|
<object class="wxButton" name="BUTTON_DOWN">
|
||||||
<label>Move Down</label>
|
<label>Move Down</label>
|
||||||
</object>
|
</object>
|
||||||
</object>
|
</object>
|
||||||
@@ -36,14 +36,14 @@
|
|||||||
<option>1</option>
|
<option>1</option>
|
||||||
</object>
|
</object>
|
||||||
<object class="sizeritem">
|
<object class="sizeritem">
|
||||||
<object class="wxButton" name="ID_BUTTON_APPEND">
|
<object class="wxButton" name="BUTTON_APPEND">
|
||||||
<label>Append...</label>
|
<label>Append...</label>
|
||||||
</object>
|
</object>
|
||||||
<flag>wxBOTTOM</flag>
|
<flag>wxBOTTOM</flag>
|
||||||
<border>5</border>
|
<border>5</border>
|
||||||
</object>
|
</object>
|
||||||
<object class="sizeritem">
|
<object class="sizeritem">
|
||||||
<object class="wxButton" name="ID_BUTTON_REMOVE">
|
<object class="wxButton" name="BUTTON_REMOVE">
|
||||||
<label>Remove</label>
|
<label>Remove</label>
|
||||||
</object>
|
</object>
|
||||||
</object>
|
</object>
|
||||||
@@ -82,7 +82,7 @@
|
|||||||
</object>
|
</object>
|
||||||
<style>wxRESIZE_BORDER</style>
|
<style>wxRESIZE_BORDER</style>
|
||||||
</object>
|
</object>
|
||||||
<object class="wxDialog" name="ID_DIALOG_CONTENT_CHECK_LIST">
|
<object class="wxDialog" name="DIALOG_CONTENT_CHECK_LIST">
|
||||||
<title>Content</title>
|
<title>Content</title>
|
||||||
<size>250,300</size>
|
<size>250,300</size>
|
||||||
<object class="wxBoxSizer">
|
<object class="wxBoxSizer">
|
||||||
@@ -91,7 +91,7 @@
|
|||||||
<object class="wxBoxSizer">
|
<object class="wxBoxSizer">
|
||||||
<orient>wxHORIZONTAL</orient>
|
<orient>wxHORIZONTAL</orient>
|
||||||
<object class="sizeritem">
|
<object class="sizeritem">
|
||||||
<object class="wxCheckList" name="ID_CHECK_LIST">
|
<object class="wxCheckList" name="CHECK_LIST">
|
||||||
<content/>
|
<content/>
|
||||||
</object>
|
</object>
|
||||||
<option>1</option>
|
<option>1</option>
|
||||||
@@ -102,14 +102,14 @@
|
|||||||
<object class="wxBoxSizer">
|
<object class="wxBoxSizer">
|
||||||
<orient>wxVERTICAL</orient>
|
<orient>wxVERTICAL</orient>
|
||||||
<object class="sizeritem">
|
<object class="sizeritem">
|
||||||
<object class="wxButton" name="ID_BUTTON_UP">
|
<object class="wxButton" name="BUTTON_UP">
|
||||||
<label>Move Up</label>
|
<label>Move Up</label>
|
||||||
</object>
|
</object>
|
||||||
<flag>wxBOTTOM</flag>
|
<flag>wxBOTTOM</flag>
|
||||||
<border>5</border>
|
<border>5</border>
|
||||||
</object>
|
</object>
|
||||||
<object class="sizeritem">
|
<object class="sizeritem">
|
||||||
<object class="wxButton" name="ID_BUTTON_DOWN">
|
<object class="wxButton" name="BUTTON_DOWN">
|
||||||
<label>Move Down</label>
|
<label>Move Down</label>
|
||||||
</object>
|
</object>
|
||||||
</object>
|
</object>
|
||||||
@@ -118,14 +118,14 @@
|
|||||||
<option>1</option>
|
<option>1</option>
|
||||||
</object>
|
</object>
|
||||||
<object class="sizeritem">
|
<object class="sizeritem">
|
||||||
<object class="wxButton" name="ID_BUTTON_APPEND">
|
<object class="wxButton" name="BUTTON_APPEND">
|
||||||
<label>Append...</label>
|
<label>Append...</label>
|
||||||
</object>
|
</object>
|
||||||
<flag>wxBOTTOM</flag>
|
<flag>wxBOTTOM</flag>
|
||||||
<border>5</border>
|
<border>5</border>
|
||||||
</object>
|
</object>
|
||||||
<object class="sizeritem">
|
<object class="sizeritem">
|
||||||
<object class="wxButton" name="ID_BUTTON_REMOVE">
|
<object class="wxButton" name="BUTTON_REMOVE">
|
||||||
<label>Remove</label>
|
<label>Remove</label>
|
||||||
</object>
|
</object>
|
||||||
</object>
|
</object>
|
||||||
@@ -164,4 +164,72 @@
|
|||||||
</object>
|
</object>
|
||||||
<style>wxRESIZE_BORDER</style>
|
<style>wxRESIZE_BORDER</style>
|
||||||
</object>
|
</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>
|
</resource>
|
@@ -26,13 +26,27 @@ class xxxParam:
|
|||||||
self.textNode = text
|
self.textNode = text
|
||||||
# Value returns string
|
# Value returns string
|
||||||
def value(self):
|
def value(self):
|
||||||
return str(self.textNode.data)
|
return self.textNode.data
|
||||||
def update(self, value):
|
def update(self, value):
|
||||||
self.textNode.data = value
|
self.textNode.data = value
|
||||||
def remove(self):
|
def remove(self):
|
||||||
self.node.parentNode.removeChild(self.node)
|
self.node.parentNode.removeChild(self.node)
|
||||||
self.node.unlink()
|
self.node.unlink()
|
||||||
|
|
||||||
|
# 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
|
# Content parameter
|
||||||
class xxxParamContent:
|
class xxxParamContent:
|
||||||
def __init__(self, node):
|
def __init__(self, node):
|
||||||
@@ -118,10 +132,10 @@ class xxxParamContentCheckList:
|
|||||||
self.node.appendChild(itemElem)
|
self.node.appendChild(itemElem)
|
||||||
l.append((itemText, itemElem))
|
l.append((itemText, itemElem))
|
||||||
self.l = l
|
self.l = l
|
||||||
# else:
|
else:
|
||||||
# for i in range(len(value)):
|
for i in range(len(value)):
|
||||||
# self.l[i][0].data = value[i]
|
self.l[i][0].data = value[i][0]
|
||||||
# self.l[i][1].setAttributedata = value[i]
|
self.l[i][1].setAttribute('checked', str(value[i][1]))
|
||||||
self.data = value
|
self.data = value
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
@@ -176,7 +190,7 @@ class xxxObject:
|
|||||||
else:
|
else:
|
||||||
self.params[tag] = xxxParamContent(node)
|
self.params[tag] = xxxParamContent(node)
|
||||||
elif tag == 'font': # has children
|
elif tag == 'font': # has children
|
||||||
self.params[tag] = xxxParamFont(self, node)
|
self.params[tag] = xxxParamFont(element, node)
|
||||||
else: # simple parameter
|
else: # simple parameter
|
||||||
self.params[tag] = xxxParam(node)
|
self.params[tag] = xxxParam(node)
|
||||||
else:
|
else:
|
||||||
@@ -199,24 +213,26 @@ class xxxObject:
|
|||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
class xxxParamFont(xxxParam):
|
# This is a little special
|
||||||
|
class xxxParamFont(xxxObject):
|
||||||
allParams = ['size', 'style', 'weight', 'family', 'underlined',
|
allParams = ['size', 'style', 'weight', 'family', 'underlined',
|
||||||
'face', 'encoding']
|
'face', 'encoding']
|
||||||
def __init__(self, parent, element):
|
def __init__(self, parent, element):
|
||||||
xxxObject.__init__(self, parent, element)
|
xxxObject.__init__(self, parent, element)
|
||||||
self.parentNode = element # required to behave similar to DOM node
|
self.parentNode = parent # required to behave similar to DOM node
|
||||||
v = []
|
v = []
|
||||||
for p in self.allParams:
|
for p in self.allParams:
|
||||||
try:
|
try:
|
||||||
v.append(str(self.params[p].data))
|
v.append(str(self.params[p].value()))
|
||||||
except KeyError:
|
except KeyError:
|
||||||
v.append('')
|
v.append('')
|
||||||
self.data = v
|
self.data = v
|
||||||
def update(self, value):
|
def update(self, value):
|
||||||
# `value' is a list of strings corresponding to all parameters
|
# `value' is a list of strings corresponding to all parameters
|
||||||
elem = self.element
|
elem = self.element
|
||||||
for node in elem.childNodes:
|
# Remove old elements first
|
||||||
elem.removeChild(node)
|
childNodes = elem.childNodes[:]
|
||||||
|
for node in childNodes: elem.removeChild(node)
|
||||||
i = 0
|
i = 0
|
||||||
self.params.clear()
|
self.params.clear()
|
||||||
v = []
|
v = []
|
||||||
@@ -230,6 +246,11 @@ class xxxParamFont(xxxParam):
|
|||||||
v.append(value[i])
|
v.append(value[i])
|
||||||
i += 1
|
i += 1
|
||||||
self.data = v
|
self.data = v
|
||||||
|
def value(self):
|
||||||
|
return self.data
|
||||||
|
def remove(self):
|
||||||
|
self.parentNode.removeChild(self.element)
|
||||||
|
self.element.unlink()
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
@@ -483,20 +504,20 @@ class xxxParamMulti:
|
|||||||
class xxxFlexGridSizer(xxxGridSizer):
|
class xxxFlexGridSizer(xxxGridSizer):
|
||||||
specials = ['growablecols', 'growablerows']
|
specials = ['growablecols', 'growablerows']
|
||||||
allParams = ['cols', 'rows', 'vgap', 'hgap'] + specials
|
allParams = ['cols', 'rows', 'vgap', 'hgap'] + specials
|
||||||
paramDict = {'growablecols':ParamContent, 'growablerows':ParamContent}
|
paramDict = {'growablecols':ParamIntList, 'growablerows':ParamIntList}
|
||||||
# Special processing for growable* parameters
|
# Special processing for growable* parameters
|
||||||
# (they are represented by several nodes)
|
# (they are represented by several nodes)
|
||||||
def special(self, tag, node):
|
def special(self, tag, node):
|
||||||
if tag not in self.params.keys():
|
if tag not in self.params:
|
||||||
self.params[tag] = xxxParamMulti()
|
self.params[tag] = xxxParamMulti()
|
||||||
self.params[tag].append(xxxParam(node))
|
self.params[tag].append(xxxParamInt(node))
|
||||||
def setSpecial(self, param, value):
|
def setSpecial(self, param, value):
|
||||||
# Straightforward implementation: remove, add again
|
# Straightforward implementation: remove, add again
|
||||||
self.params[param].remove()
|
self.params[param].remove()
|
||||||
del self.params[param]
|
del self.params[param]
|
||||||
for str in value:
|
for i in value:
|
||||||
node = tree.dom.createElement(param)
|
node = tree.dom.createElement(param)
|
||||||
text = tree.dom.createTextNode(str)
|
text = tree.dom.createTextNode(str(i))
|
||||||
node.appendChild(text)
|
node.appendChild(text)
|
||||||
self.element.appendChild(node)
|
self.element.appendChild(node)
|
||||||
self.special(param, node)
|
self.special(param, node)
|
||||||
|
Reference in New Issue
Block a user