From 64b9ac752375b80718e494233ef9cc3cb680ab50 Mon Sep 17 00:00:00 2001 From: Roman Rolinsky Date: Fri, 15 Jul 2005 09:51:40 +0000 Subject: [PATCH] StdDialogButtonSizer menu git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@34854 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- wxPython/wx/tools/XRCed/panel.py | 2 +- wxPython/wx/tools/XRCed/tree.py | 91 +++++++++++++++++++++++--------- wxPython/wx/tools/XRCed/xrced.py | 17 ++++-- wxPython/wx/tools/XRCed/xxx.py | 22 +++++++- 4 files changed, 100 insertions(+), 32 deletions(-) diff --git a/wxPython/wx/tools/XRCed/panel.py b/wxPython/wx/tools/XRCed/panel.py index 67b00f40e1..407888f52c 100644 --- a/wxPython/wx/tools/XRCed/panel.py +++ b/wxPython/wx/tools/XRCed/panel.py @@ -72,7 +72,7 @@ class Panel(wxNotebook): # First page # Remove current objects and sizer sizer = self.ResetPage(self.page1) - if not xxx or (not xxx.allParams and not xxx.hasName): + if not xxx or (not xxx.allParams and not xxx.hasName and not xxx.hasChild): if g.tree.selection: sizer.Add(wxStaticText(self.page1, -1, 'This item has no properties.')) else: # nothing selected diff --git a/wxPython/wx/tools/XRCed/tree.py b/wxPython/wx/tools/XRCed/tree.py index 0790e2fafb..0a4d4d0638 100644 --- a/wxPython/wx/tools/XRCed/tree.py +++ b/wxPython/wx/tools/XRCed/tree.py @@ -107,8 +107,20 @@ class ID_NEW: MENU = wxNewId() MENU_ITEM = wxNewId() SEPARATOR = wxNewId() + + OK_BUTTON = wxNewId() + YES_BUTTON = wxNewId() + SAVE_BUTTON = wxNewId() + APPLY_BUTTON = wxNewId() + NO_BUTTON = wxNewId() + CANCEL_BUTTON = wxNewId() + HELP_BUTTON = wxNewId() + CONTEXT_HELP_BUTTON = wxNewId() + LAST = wxNewId() + + class PullDownMenu: ID_EXPAND = wxNewId() ID_COLLAPSE = wxNewId() @@ -182,6 +194,15 @@ class PullDownMenu: ID_NEW.STD_DIALOG_BUTTON_SIZER: 'wxStdDialogButtonSizer', ID_NEW.SPACER: 'spacer', ID_NEW.UNKNOWN: 'unknown', + + ID_NEW.OK_BUTTON: 'wxButton', + ID_NEW.YES_BUTTON: 'wxButton', + ID_NEW.SAVE_BUTTON: 'wxButton', + ID_NEW.APPLY_BUTTON: 'wxButton', + ID_NEW.NO_BUTTON: 'wxButton', + ID_NEW.CANCEL_BUTTON: 'wxButton', + ID_NEW.HELP_BUTTON: 'wxButton', + ID_NEW.CONTEXT_HELP_BUTTON: 'wxButton', } self.topLevel = [ (ID_NEW.PANEL, 'Panel', 'Create panel'), @@ -304,33 +325,45 @@ class PullDownMenu: (ID_NEW.LIST_BOX, 'ListBox', 'Create list box'), ], ] + self.stdButtons = [ + (ID_NEW.OK_BUTTON, 'OK Button', 'Create standard button'), + (ID_NEW.YES_BUTTON, 'YES Button', 'Create standard button'), + (ID_NEW.SAVE_BUTTON, 'SAVE Button', 'Create standard button'), + (ID_NEW.APPLY_BUTTON, 'APPLY Button', 'Create standard button'), + (ID_NEW.NO_BUTTON, 'NO Button', 'Create standard button'), + (ID_NEW.CANCEL_BUTTON, 'CANCEL Button', 'Create standard button'), + (ID_NEW.HELP_BUTTON, 'HELP Button', 'Create standard button'), + (ID_NEW.CONTEXT_HELP_BUTTON, 'CONTEXT HELP Button', 'Create standard button'), + ] + self.stdButtonIDs = { + ID_NEW.OK_BUTTON: ('wxID_OK', '&Ok'), + ID_NEW.YES_BUTTON: ('wxID_YES', '&Yes'), + ID_NEW.SAVE_BUTTON: ('wxID_SAVE', '&Save'), + ID_NEW.APPLY_BUTTON: ('wxID_APPLY', '&Apply'), + ID_NEW.NO_BUTTON: ('wxID_NO', '&No'), + ID_NEW.CANCEL_BUTTON: ('wxID_CANCEL', '&Cancel'), + ID_NEW.HELP_BUTTON: ('wxID_HELP', '&Help'), + ID_NEW.CONTEXT_HELP_BUTTON: ('wxID_CONTEXT_HELP', '&Help'), + } + + ################################################################################ # Set menu to list items. # Each menu command is a tuple (id, label, help) # submenus are lists [id, label, help, submenu] -# and separators are any other type -def SetMenu(m, list): - for l in list: - if type(l) == types.TupleType: - apply(m.Append, l) - elif type(l) == types.ListType: - subMenu = wxMenu() - SetMenu(subMenu, l[2:]) - m.AppendMenu(wxNewId(), l[0], subMenu, l[1]) - else: # separator - m.AppendSeparator() -# Same, but adds 1000 to all IDs -def SetMenu2(m, list): +# and separators are any other type. Shift is for making +# alternative sets of IDs. (+1000). +def SetMenu(m, list, shift=False): for l in list: if type(l) == types.TupleType: # Shift ID - l = (1000 + l[0],) + l[1:] + if shift: l = (1000 + l[0],) + l[1:] apply(m.Append, l) elif type(l) == types.ListType: subMenu = wxMenu() - SetMenu2(subMenu, l[2:]) + SetMenu(subMenu, l[2:]) m.AppendMenu(wxNewId(), l[0], subMenu, l[1]) else: # separator m.AppendSeparator() @@ -542,12 +575,12 @@ class XML_Tree(wxTreeCtrl): self.selection = None return node # Find position relative to the top-level window - def FindNodePos(self, item): + def FindNodePos(self, item, obj=None): # Root at (0,0) if item == g.testWin.item: return wxPoint(0, 0) itemParent = self.GetItemParent(item) # Select NB page - obj = self.FindNodeObject(item) + if not obj: obj = self.FindNodeObject(item) if self.GetPyData(itemParent).treeObject().__class__ == xxxNotebook: notebook = self.FindNodeObject(itemParent) # Find position @@ -587,6 +620,12 @@ class XML_Tree(wxTreeCtrl): elif isinstance(xxx.parent, xxxToolBar): # How to get tool from toolbar? return parentWin.GetChildren()[0] + elif isinstance(xxx.parent, xxxStdDialogButtonSizer): + # This sizer returns non-existing children + for ch in parentWin.GetChildren(): + if ch.GetWindow() and ch.GetWindow().GetName() == xxx.name: + return ch.GetWindow() + return None # Otherwise get parent's object and it's child child = parentWin.GetChildren()[self.ItemIndex(item)] # Return window or sizer for sizer items @@ -653,7 +692,9 @@ class XML_Tree(wxTreeCtrl): if g.testWin.highLight: g.testWin.highLight.Remove() return # Get window/sizer object - obj, pos = self.FindNodeObject(item), self.FindNodePos(item) + obj = self.FindNodeObject(item) + if not obj: return + pos = self.FindNodePos(item, obj) size = obj.GetSize() # Highlight # Negative positions are not working quite well @@ -968,6 +1009,8 @@ class XML_Tree(wxTreeCtrl): SetMenu(m, pullDownMenu.toolBarControls) elif xxx.__class__ in [xxxMenu, xxxMenuItem]: SetMenu(m, pullDownMenu.menuControls) + elif xxx.__class__ == xxxStdDialogButtonSizer: + SetMenu(m, pullDownMenu.stdButtons) else: SetMenu(m, pullDownMenu.controls) if xxx.__class__ == xxxNotebook: @@ -996,19 +1039,19 @@ class XML_Tree(wxTreeCtrl): if xxx.__class__ == xxxMenuBar: m.Append(1000 + ID_NEW.MENU, 'Menu', 'Create menu') elif xxx.__class__ in [xxxMenu, xxxMenuItem]: - SetMenu2(m, pullDownMenu.menuControls) + SetMenu(m, pullDownMenu.menuControls, shift=True) elif xxx.__class__ == xxxToolBar and \ self.GetItemParent(item) == self.root: - SetMenu2(m, []) + SetMenu(m, [], shift=True) elif xxx.__class__ in [xxxFrame, xxxDialog, xxxPanel]: - SetMenu2(m, [ + SetMenu(m, [ (ID_NEW.PANEL, 'Panel', 'Create panel'), (ID_NEW.DIALOG, 'Dialog', 'Create dialog'), - (ID_NEW.FRAME, 'Frame', 'Create frame')]) + (ID_NEW.FRAME, 'Frame', 'Create frame')], shift=True) elif xxx.isSizer: - SetMenu2(m, pullDownMenu.sizers) + SetMenu(m, pullDownMenu.sizers, shift=True) else: - SetMenu2(m, pullDownMenu.controls) + SetMenu(m, pullDownMenu.controls, shift=True) id = wxNewId() menu.AppendMenu(id, 'Replace With', m) if not m.GetMenuItemCount(): menu.Enable(id, False) diff --git a/wxPython/wx/tools/XRCed/xrced.py b/wxPython/wx/tools/XRCed/xrced.py index 7da5549984..243ab45607 100644 --- a/wxPython/wx/tools/XRCed/xrced.py +++ b/wxPython/wx/tools/XRCed/xrced.py @@ -498,7 +498,7 @@ class Frame(wxFrame): # Parent is sizer or notebook, child is not child container if parent.isSizer and not isChildContainer and not isinstance(xxx, xxxSpacer): # Create sizer item element - sizerItemElem = MakeEmptyDOM('sizeritem') + sizerItemElem = MakeEmptyDOM(parent.itemTag) sizerItemElem.appendChild(elem) elem = sizerItemElem elif isinstance(parent, xxxNotebook) and not isChildContainer: @@ -764,8 +764,16 @@ Homepage: http://xrced.sourceforge.net\ if parent.__class__ == xxxMainNode: cl = xxx.treeObject().__class__ frame.maxIDs[cl] += 1 - xxx.treeObject().name = '%s%d' % (defaultIDs[cl], frame.maxIDs[cl]) - xxx.treeObject().element.setAttribute('name', xxx.treeObject().name) + xxx.setTreeName('%s%d' % (defaultIDs[cl], frame.maxIDs[cl])) + # And for some other standard controls + elif parent.__class__ == xxxStdDialogButtonSizer: + xxx.setTreeName(pullDownMenu.stdButtonIDs[evt.GetId()][0]) + # We can even set label + obj = xxx.treeObject() + elem = g.tree.dom.createElement('label') + elem.appendChild(g.tree.dom.createTextNode(pullDownMenu.stdButtonIDs[evt.GetId()][1])) + obj.params['label'] = xxxParam(elem) + xxx.treeObject().element.appendChild(elem) # Insert new node, register undo elem = xxx.element @@ -855,8 +863,7 @@ Homepage: http://xrced.sourceforge.net\ if parent.__class__ == xxxMainNode: cl = xxx.treeObject().__class__ frame.maxIDs[cl] += 1 - xxx.treeObject().name = '%s%d' % (defaultIDs[cl], frame.maxIDs[cl]) - xxx.treeObject().element.setAttribute('name', xxx.treeObject().name) + xxx.setTreeName('%s%d' % (defaultIDs[cl], frame.maxIDs[cl])) # Update panel g.panel.SetData(xxx) diff --git a/wxPython/wx/tools/XRCed/xxx.py b/wxPython/wx/tools/XRCed/xxx.py index 88367ca810..4af295088d 100644 --- a/wxPython/wx/tools/XRCed/xxx.py +++ b/wxPython/wx/tools/XRCed/xxx.py @@ -294,6 +294,12 @@ class xxxObject: def panelName(self): if self.subclass: return self.subclass + '(' + self.className + ')' else: return self.className + # Sets name of tree object + def setTreeName(self, name): + if self.hasChild: obj = self.child + else: obj = self + obj.name = name + obj.element.setAttribute('name', name) ################################################################################ @@ -623,6 +629,7 @@ class xxxSizer(xxxContainer): hasName = hasStyle = False paramDict = {'orient': ParamOrient} isSizer = True + itemTag = 'sizeritem' # different for some sizers class xxxBoxSizer(xxxSizer): allParams = ['orient'] @@ -644,6 +651,7 @@ class xxxGridSizer(xxxSizer): class xxxStdDialogButtonSizer(xxxSizer): allParams = [] + itemTag = 'button' # For repeated parameters class xxxParamMulti: @@ -742,6 +750,16 @@ class xxxSizerItem(xxxChildContainer): self.child.allParams = self.child.allParams[:] self.child.allParams.remove('pos') +class xxxSizerItemButton(xxxSizerItem): + allParams = [] + paramDict = {} + def __init__(self, parent, element): + xxxChildContainer.__init__(self, parent, element) + # Remove pos parameter - not needed for sizeritems + if 'pos' in self.child.allParams: + self.child.allParams = self.child.allParams[:] + self.child.allParams.remove('pos') + class xxxNotebookPage(xxxChildContainer): allParams = ['label', 'selected'] paramDict = {'selected': ParamBool} @@ -842,7 +860,7 @@ xxxDict = { 'wxFlexGridSizer': xxxFlexGridSizer, 'wxGridBagSizer': xxxGridBagSizer, 'wxStdDialogButtonSizer': xxxStdDialogButtonSizer, - 'sizeritem': xxxSizerItem, + 'sizeritem': xxxSizerItem, 'button': xxxSizerItemButton, 'spacer': xxxSpacer, 'wxMenuBar': xxxMenuBar, @@ -907,7 +925,7 @@ def MakeEmptyXXX(parent, className): # If parent is a sizer, we should create sizeritem object, except for spacers if parent: if parent.isSizer and className != 'spacer': - sizerItemElem = MakeEmptyDOM('sizeritem') + sizerItemElem = MakeEmptyDOM(parent.itemTag) sizerItemElem.appendChild(elem) elem = sizerItemElem elif isinstance(parent, xxxNotebook): -- 2.45.2