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:
Robin Dunn
2002-03-07 21:33:31 +00:00
parent f0972d1ea4
commit 18fc9fa3b5
7 changed files with 348 additions and 145 deletions

View File

@@ -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

View File

@@ -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
----- -----

View File

@@ -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)
@@ -90,7 +93,7 @@ class ParamBinaryOr(PPanel):
dlg.SetSizer(topSizer) dlg.SetSizer(topSizer)
topSizer.Fit(dlg) topSizer.Fit(dlg)
dlg.Center() dlg.Center()
if dlg.ShowModal() == wxID_OK: if dlg.ShowModal() == wxID_OK:
value = [] value = []
for i in range(listBox.Number()): for i in range(listBox.Number()):
if listBox.IsChecked(i): if listBox.IsChecked(i):
@@ -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,7 +540,76 @@ class ParamContentCheckList(PPanel):
self.textModified = false self.textModified = false
dlg.Destroy() dlg.Destroy()
# Boxless radiobox 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): class RadioBox(PPanel):
def __init__(self, parent, id, choices, def __init__(self, parent, id, choices,
pos=wxDefaultPosition, name='radiobox'): pos=wxDefaultPosition, name='radiobox'):
@@ -620,15 +661,15 @@ class ParamOrient(RadioBox):
self.SetStringSelection(self.seulav[value]) self.SetStringSelection(self.seulav[value])
class ParamFile(PPanel): class ParamFile(PPanel):
def __init__(self, parent, name): def __init__(self, parent, name):
PPanel.__init__(self, parent, name) PPanel.__init__(self, parent, name)
self.ID_TEXT_CTRL = wxNewId() self.ID_TEXT_CTRL = wxNewId()
self.ID_BUTTON_BROWSE = wxNewId() self.ID_BUTTON_BROWSE = wxNewId()
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)
@@ -637,7 +678,7 @@ class ParamFile(PPanel):
EVT_BUTTON(self, self.ID_BUTTON_BROWSE, self.OnButtonBrowse) EVT_BUTTON(self, self.ID_BUTTON_BROWSE, self.OnButtonBrowse)
EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange) EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
def OnChange(self, evt): def OnChange(self, evt):
if self.freeze: return if self.freeze: return
self.SetModified() self.SetModified()
self.textModified = true self.textModified = true
evt.Skip() evt.Skip()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 766 B

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -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):

View File

@@ -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>

View File

@@ -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)