diff --git a/wxPython/wxPython/tools/XRCed/tools.py b/wxPython/wxPython/tools/XRCed/tools.py index 54e612d9fc..0d65c58d22 100644 --- a/wxPython/wxPython/tools/XRCed/tools.py +++ b/wxPython/wxPython/tools/XRCed/tools.py @@ -10,20 +10,30 @@ from tree import ID_NEW # Icons import images +# Groups of controls GROUPNUM = 4 GROUP_WINDOWS, GROUP_MENUS, GROUP_SIZERS, GROUP_CONTROLS = range(GROUPNUM) +# States depending on current selection and Control/Shift keys +STATE_ROOT, STATE_MENUBAR, STATE_TOOLBAR, STATE_MENU, STATE_ELSE = range(5) + # Left toolbar for GUI elements class Tools(wxPanel): TOOL_SIZE = (30, 30) def __init__(self, parent): - wxPanel.__init__(self, parent, -1, style=wxRAISED_BORDER | wxWANTS_CHARS) + if wxPlatform == '__WXGTK__': + wxPanel.__init__(self, parent, -1, + style=wxRAISED_BORDER|wxWANTS_CHARS) + else: + wxPanel.__init__(self, parent, -1, style=wxWANTS_CHARS) # Create sizer for groups self.sizer = wxBoxSizer(wxVERTICAL) # Data to create buttons pullDownMenu = g.pullDownMenu self.groups = [] self.ctrl = self.shift = false + # Current state (what to enable/disable) + self.state = None groups = [ ["Windows", (ID_NEW.FRAME, images.getToolFrameBitmap()), @@ -88,15 +98,16 @@ class Tools(wxPanel): wxEVT_COMMAND_BUTTON_CLICKED, g.frame.OnCreate) EVT_KEY_DOWN(self, self.OnKeyDown) EVT_KEY_UP(self, self.OnKeyUp) + def AddButton(self, id, image, text): - button = wxBitmapButton(self, id, image, - size=self.TOOL_SIZE, - style=wxNO_BORDER | wxWANTS_CHARS) + button = wxBitmapButton(self, id, image, size=self.TOOL_SIZE, + style=wxBU_AUTODRAW|wxNO_BORDER|wxWANTS_CHARS) EVT_KEY_DOWN(button, self.OnKeyDown) EVT_KEY_UP(button, self.OnKeyUp) button.SetToolTipString(text) self.curSizer.Add(button) self.groups[-1][1][id] = button + def AddGroup(self, name): # Each group is inside box box = wxStaticBox(self, -1, name, style=wxWANTS_CHARS) @@ -107,20 +118,24 @@ class Tools(wxPanel): boxSizer.Add(self.curSizer) self.sizer.Add(boxSizer, 0, wxTOP | wxLEFT | wxRIGHT, 4) self.groups.append((box,{})) + # Enable/disable group def EnableGroup(self, gnum, enable = true): grp = self.groups[gnum] grp[0].Enable(enable) for b in grp[1].values(): b.Enable(enable) + # Enable/disable group item def EnableGroupItem(self, gnum, id, enable = true): grp = self.groups[gnum] grp[1][id].Enable(enable) + # Enable/disable group items def EnableGroupItems(self, gnum, ids, enable = true): grp = self.groups[gnum] for id in ids: grp[1][id].Enable(enable) + # Process key events def OnKeyDown(self, evt): if evt.GetKeyCode() == WXK_CONTROL: @@ -129,6 +144,7 @@ class Tools(wxPanel): g.tree.shift = true self.UpdateIfNeeded() evt.Skip() + def OnKeyUp(self, evt): if evt.GetKeyCode() == WXK_CONTROL: g.tree.ctrl = false @@ -136,12 +152,14 @@ class Tools(wxPanel): g.tree.shift = false self.UpdateIfNeeded() evt.Skip() + def OnMouse(self, evt): # Update control and shift states g.tree.ctrl = evt.ControlDown() g.tree.shift = evt.ShiftDown() self.UpdateIfNeeded() evt.Skip() + # Update UI after key presses, if necessary def UpdateIfNeeded(self): tree = g.tree @@ -157,42 +175,62 @@ class Tools(wxPanel): else: status = '' g.frame.SetStatusText(status, 1) + # Update interface def UpdateUI(self): # Update status bar pullDownMenu = g.pullDownMenu tree = g.tree item = tree.selection - # Disable everything - for grp in range(GROUPNUM): - self.EnableGroup(grp, false) - # If nothing selected, return - if not item: return + # If nothing selected, disable everything and return + if not item: + # Disable everything + for grp in range(GROUPNUM): + self.EnableGroup(grp, false) + self.state = None + return if tree.ctrl: needInsert = true else: needInsert = tree.NeedInsert(item) # Enable depending on selection if item == tree.root or needInsert and tree.GetItemParent(item) == tree.root: - self.EnableGroup(GROUP_WINDOWS, true) - self.EnableGroup(GROUP_MENUS, true) - # But disable items - self.EnableGroupItems(GROUP_MENUS, - [ ID_NEW.TOOL, - ID_NEW.MENU_ITEM, - ID_NEW.SEPARATOR ], - false) + state = STATE_ROOT else: xxx = tree.GetPyData(item).treeObject() # Check parent for possible child nodes if inserting sibling if needInsert: xxx = xxx.parent if xxx.__class__ == xxxMenuBar: + state = STATE_MENUBAR + elif xxx.__class__ in [xxxToolBar, xxxTool] or \ + xxx.__class__ == xxxSeparator and xxx.parent.__class__ == xxxToolBar: + state = STATE_TOOLBAR + elif xxx.__class__ in [xxxMenu, xxxMenuItem]: + state = STATE_MENU + else: + state = STATE_ELSE + + # Enable depending on selection + if state != self.state: + # Disable everything + for grp in range(GROUPNUM): + self.EnableGroup(grp, false) + # Enable some + if state == STATE_ROOT: + self.EnableGroup(GROUP_WINDOWS, true) + self.EnableGroup(GROUP_MENUS, true) + # But disable items + self.EnableGroupItems(GROUP_MENUS, + [ ID_NEW.TOOL, + ID_NEW.MENU_ITEM, + ID_NEW.SEPARATOR ], + false) + elif state == STATE_MENUBAR: self.EnableGroup(GROUP_MENUS) self.EnableGroupItems(GROUP_MENUS, [ ID_NEW.TOOL_BAR, ID_NEW.MENU_BAR, ID_NEW.TOOL ], false) - elif xxx.__class__ in [xxxToolBar, xxxTool] or \ - xxx.__class__ == xxxSeparator and xxx.parent.__class__ == xxxToolBar: + elif state == STATE_TOOLBAR: self.EnableGroup(GROUP_MENUS) self.EnableGroupItems(GROUP_MENUS, [ ID_NEW.TOOL_BAR, @@ -205,7 +243,7 @@ class Tools(wxPanel): [ ID_NEW.TREE_CTRL, ID_NEW.NOTEBOOK ], false) - elif xxx.__class__ in [xxxMenu, xxxMenuItem]: + elif state == STATE_MENU: self.EnableGroup(GROUP_MENUS) self.EnableGroupItems(GROUP_MENUS, [ ID_NEW.TOOL_BAR, @@ -229,8 +267,13 @@ class Tools(wxPanel): false) self.EnableGroup(GROUP_SIZERS) self.EnableGroup(GROUP_CONTROLS) - if xxx.__class__ == xxxNotebook: - self.EnableGroup(GROUP_SIZERS, false) - elif not (xxx.isSizer or xxx.parent and xxx.parent.isSizer): + # Special case for notebook (always executed) + if state == STATE_ELSE: + if xxx.__class__ == xxxNotebook: + self.EnableGroup(GROUP_SIZERS, false) + else: + self.EnableGroup(GROUP_SIZERS) + if not (xxx.isSizer or xxx.parent and xxx.parent.isSizer): self.EnableGroupItem(GROUP_SIZERS, ID_NEW.SPACER, false) - + # Save state + self.state = state