diff --git a/wxPython/wxPython/tools/XRCed/CHANGES b/wxPython/wxPython/tools/XRCed/CHANGES index 0281339872..4815b83035 100644 --- a/wxPython/wxPython/tools/XRCed/CHANGES +++ b/wxPython/wxPython/tools/XRCed/CHANGES @@ -1,3 +1,21 @@ +0.0.9-4 +------- + +Implemented standard bitmap selection. + +Fixed a bug in FlexGridSizer code. + +0.0.9-3 +------- + +File browsing (for bitmaps/icons, etc.) had a small problem when current +file was not saved yet. + +0.0.9-2 +------- + +Small bug fix for initial don't panic message. + 0.0.9-1 ------- diff --git a/wxPython/wxPython/tools/XRCed/globals.py b/wxPython/wxPython/tools/XRCed/globals.py index 5f59ef4366..78bb0595c2 100644 --- a/wxPython/wxPython/tools/XRCed/globals.py +++ b/wxPython/wxPython/tools/XRCed/globals.py @@ -16,7 +16,7 @@ else: modernFont = wxFont(10, wxMODERN, wxNORMAL, wxNORMAL) progname = 'XRCed' -version = '0.0.9-1' +version = '0.0.9-4' # Global variables diff --git a/wxPython/wxPython/tools/XRCed/panel.py b/wxPython/wxPython/tools/XRCed/panel.py index 0da807e754..5202ccb237 100644 --- a/wxPython/wxPython/tools/XRCed/panel.py +++ b/wxPython/wxPython/tools/XRCed/panel.py @@ -170,6 +170,8 @@ class ParamPage(wxPanel): # Some classes are special if param == 'font': xxx.params[param] = xxxParamFont(xxx.element, elem) + elif param in xxxObject.bitmapTags: + xxx.params[param] = xxxParamBitmap(elem) else: xxx.params[param] = xxxParam(elem) # Find place to put new element: first present element after param @@ -247,7 +249,7 @@ class PropPage(ParamPage): label = wxStaticText(self, -1, 'XML ID:', size=(100,-1)) control = ParamText(self, name='XML_name') sizer.AddMany([ (label, 0, wxALIGN_CENTER_VERTICAL), - (control, 0, wxALIGN_CENTER_VERTICAL) ]) + (control, 0, wxALIGN_CENTER_VERTICAL | wxBOTTOM, 5) ]) self.controlName = control for param in xxx.allParams: present = xxx.params.has_key(param) diff --git a/wxPython/wxPython/tools/XRCed/params.py b/wxPython/wxPython/tools/XRCed/params.py index a8d2d7d67e..986c94ad3f 100644 --- a/wxPython/wxPython/tools/XRCed/params.py +++ b/wxPython/wxPython/tools/XRCed/params.py @@ -8,6 +8,7 @@ import string import os.path from globals import * from types import * +from wxPython.xrc import * genericStyles = ['wxSIMPLE_BORDER', 'wxDOUBLE_BORDER', 'wxSUNKEN_BORDER', 'wxRAISED_BORDER', @@ -305,7 +306,7 @@ class ParamInt(PPanel): self.freeze = false class ParamText(PPanel): - def __init__(self, parent, name, textWidth=200): + def __init__(self, parent, name, textWidth=260): PPanel.__init__(self, parent, name) self.ID_TEXT_CTRL = wxNewId() # We use sizer even here to have the same size of text control @@ -334,8 +335,9 @@ class ParamPosSize(ParamText): class ContentDialog(wxDialogPtr): def __init__(self, parent, value): - # Is this normal??? + # Load from resource w = g.frame.res.LoadDialog(parent, 'DIALOG_CONTENT') + # Perform initialization with class pointer wxDialogPtr.__init__(self, w.this) self.thisown = 1 self.Center() @@ -385,7 +387,6 @@ class ContentDialog(wxDialogPtr): class ContentCheckListDialog(wxDialogPtr): def __init__(self, parent, value): - # Is this normal??? w = g.frame.res.LoadDialog(parent, 'DIALOG_CONTENT_CHECK_LIST') wxDialogPtr.__init__(self, w.this) self.thisown = 1 @@ -684,6 +685,83 @@ class ParamFile(PPanel): self.textModified = false dlg.Destroy() +class ParamBitmap(PPanel): + def __init__(self, parent, name): + # Load from resource + w = g.frame.res.LoadPanel(parent, 'PANEL_BITMAP') + # Perform initialization with class pointer + wxPanelPtr.__init__(self, w.this) + self.thisown = 1 + self.modified = self.freeze = false + self.SetBackgroundColour(g.panel.GetBackgroundColour()) + self.radio_std = self.FindWindowByName('RADIO_STD') + self.radio_file = self.FindWindowByName('RADIO_FILE') + self.combo = self.FindWindowByName('COMBO_STD') + self.text = self.FindWindowByName('TEXT_FILE') + self.button = self.FindWindowByName('BUTTON_BROWSE') + self.textModified = false + self.SetAutoLayout(true) + self.GetSizer().SetMinSize((260, -1)) + self.GetSizer().Fit(self) + EVT_RADIOBUTTON(self, XMLID('RADIO_STD'), self.OnRadioStd) + EVT_RADIOBUTTON(self, XMLID('RADIO_FILE'), self.OnRadioFile) + EVT_BUTTON(self, XMLID('BUTTON_BROWSE'), self.OnButtonBrowse) + EVT_COMBOBOX(self, XMLID('COMBO_STD'), self.OnCombo) + EVT_TEXT(self, XMLID('COMBO_STD'), self.OnChange) + EVT_TEXT(self, XMLID('TEXT_FILE'), self.OnChange) + def OnRadioStd(self, evt): + self.SetModified() + self.SetValue('') + def OnRadioFile(self, evt): + self.SetModified() + self.SetValue(['','']) + def updateRadios(self): + if self.value[0]: + self.text.Enable(false) + self.button.Enable(false) + self.combo.Enable(true) + else: + self.text.Enable(true) + self.button.Enable(true) + self.combo.Enable(false) + def OnChange(self, evt): + PPanel.OnChange(self, evt) + self.textModified = true + def OnCombo(self, evt): + PPanel.OnChange(self, evt) + self.value[0] = self.combo.GetValue() + def GetValue(self): + if self.textModified: # text has newer value + return [self.combo.GetValue(), self.text.GetValue()] + return self.value + def SetValue(self, value): + self.freeze = true + if not value: + self.value = ['wxART_MISSING_IMAGE', ''] + else: + self.value = value + self.combo.SetValue(self.value[0]) + self.text.SetValue(self.value[1]) # update text ctrl + self.updateRadios() + self.freeze = false + def OnButtonBrowse(self, evt): + if self.textModified: # text has newer value + self.value[1] = self.text.GetValue() + dlg = wxFileDialog(self, + defaultDir = os.path.abspath(os.path.dirname(self.value[1])), + defaultFile = os.path.basename(self.value[1])) + if dlg.ShowModal() == wxID_OK: + # Get common part of selected path and current + if g.frame.dataFile: + curpath = os.path.abspath(g.frame.dataFile) + else: + curpath = os.path.join(os.getcwd(), '') + common = os.path.commonprefix([curpath, dlg.GetPath()]) + self.SetValue(['', dlg.GetPath()[len(common):]]) + self.SetModified() + self.textModified = false + dlg.Destroy() + paramDict = { 'flag': ParamFlag, 'style': ParamStyle, 'exstyle': ParamExStyle, @@ -696,6 +774,6 @@ paramDict = { 'min': ParamInt, 'max': ParamInt, 'fg': ParamColour, 'bg': ParamColour, 'font': ParamFont, 'enabled': ParamBool, 'focused': ParamBool, 'hidden': ParamBool, - 'tooltip': ParamText, 'bitmap': ParamFile, 'icon': ParamFile, + 'tooltip': ParamText, 'bitmap': ParamBitmap, 'icon': ParamBitmap, } diff --git a/wxPython/wxPython/tools/XRCed/xrced.xrc b/wxPython/wxPython/tools/XRCed/xrced.xrc index a407461450..dd19218ab9 100644 --- a/wxPython/wxPython/tools/XRCed/xrced.xrc +++ b/wxPython/wxPython/tools/XRCed/xrced.xrc @@ -232,4 +232,87 @@ + + + + wxVERTICAL + + + 2 + 2 + + + + + + + + + wxART_ADD_BOOKMARK + wxART_DEL_BOOKMARK + wxART_HELP_SIDE_PANEL + wxART_HELP_SETTINGS + wxART_HELP_BOOK + wxART_HELP_FOLDER + wxART_HELP_PAGE + wxART_GO_BACK + wxART_GO_FORWARD + wxART_GO_UP + wxART_GO_DOWN + wxART_GO_TO_PARENT + wxART_GO_HOME + wxART_FILE_OPEN + wxART_PRINT + wxART_HELP + wxART_TIP + wxART_REPORT_VIEW + wxART_LIST_VIEW + wxART_NEW_DIR + wxART_FOLDER + wxART_GO_DIR_UP + wxART_EXECUTABLE_FILE + wxART_NORMAL_FILE + wxART_TICK_MARK + wxART_CROSS_MARK + wxART_ERROR + wxART_QUESTION + wxART_WARNING + wxART_INFORMATION + wxART_MISSING_IMAGE + + + wxRIGHT|wxEXPAND + 5 + + + + + + + + + wxHORIZONTAL + + + + wxRIGHT|wxEXPAND + 5 + + + + + 55,-1 + + + + wxRIGHT|wxEXPAND + 5 + + 2 + 1 + + wxEXPAND + + + \ No newline at end of file diff --git a/wxPython/wxPython/tools/XRCed/xxx.py b/wxPython/wxPython/tools/XRCed/xxx.py index 9cfa41c307..b7ddcf8a6e 100644 --- a/wxPython/wxPython/tools/XRCed/xxx.py +++ b/wxPython/wxPython/tools/XRCed/xxx.py @@ -151,6 +151,21 @@ class xxxParamContentCheckList(xxxNode): self.l[i][1].setAttribute('checked', str(value[i][1])) self.data = value +# Bitmap parameter +class xxxParamBitmap(xxxParam): + def __init__(self, node): + xxxParam.__init__(self, node) + self.stock_id = node.getAttribute('stock_id') + def value(self): + return [self.stock_id, xxxParam.value(self)] + def update(self, value): + self.stock_id = value[0] + if self.stock_id: + self.node.setAttribute('stock_id', self.stock_id) + else: + self.node.removeAttribute('stock_id') + xxxParam.update(self, value[1]) + ################################################################################ # Classes to interface DOM objects @@ -165,6 +180,8 @@ class xxxObject: styles = ['fg', 'bg', 'font', 'enabled', 'focused', 'hidden', 'tooltip'] # Special parameters specials = [] + # Bitmap tags + bitmapTags = ['bitmap', 'bitmap2', 'icon'] # Required paremeters: none by default required = [] # Default parameters with default values @@ -204,6 +221,9 @@ class xxxObject: self.params[tag] = xxxParamContent(node) elif tag == 'font': # has children self.params[tag] = xxxParamFont(element, node) + elif tag in self.bitmapTags: + # Can have attributes + self.params[tag] = xxxParamBitmap(node) else: # simple parameter self.params[tag] = xxxParam(node) else: @@ -327,7 +347,7 @@ class xxxFrame(xxxContainer): class xxxTool(xxxObject): allParams = ['bitmap', 'bitmap2', 'toggle', 'tooltip', 'longhelp'] required = ['bitmap'] - paramDict = {'bitmap2': ParamFile, 'toggle': ParamBool} + paramDict = {'bitmap2': ParamBitmap, 'toggle': ParamBool} hasStyle = false class xxxToolBar(xxxContainer): @@ -346,6 +366,7 @@ class xxxBitmap(xxxObject): allParams = ['bitmap'] required = ['bitmap'] +# Just like bitmap class xxxIcon(xxxObject): allParams = ['icon'] required = ['icon'] @@ -530,7 +551,8 @@ class xxxGridSizer(xxxSizer): # For repeated parameters class xxxParamMulti: - def __init__(self): + def __init__(self, node): + self.node = node self.l, self.data = [], [] def append(self, param): self.l.append(param) @@ -550,7 +572,8 @@ class xxxFlexGridSizer(xxxGridSizer): # (they are represented by several nodes) def special(self, tag, node): if not self.params.has_key(tag): - self.params[tag] = xxxParamMulti() + # Create new multi-group + self.params[tag] = xxxParamMulti(node) self.params[tag].append(xxxParamInt(node)) def setSpecial(self, param, value): # Straightforward implementation: remove, add again