fixes for wxMSW, more efficient code for enabling/disabling groups
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_4_BRANCH@19644 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -10,20 +10,30 @@ from tree import ID_NEW
|
|||||||
# Icons
|
# Icons
|
||||||
import images
|
import images
|
||||||
|
|
||||||
|
# Groups of controls
|
||||||
GROUPNUM = 4
|
GROUPNUM = 4
|
||||||
GROUP_WINDOWS, GROUP_MENUS, GROUP_SIZERS, GROUP_CONTROLS = range(GROUPNUM)
|
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
|
# Left toolbar for GUI elements
|
||||||
class Tools(wxPanel):
|
class Tools(wxPanel):
|
||||||
TOOL_SIZE = (30, 30)
|
TOOL_SIZE = (30, 30)
|
||||||
def __init__(self, parent):
|
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
|
# Create sizer for groups
|
||||||
self.sizer = wxBoxSizer(wxVERTICAL)
|
self.sizer = wxBoxSizer(wxVERTICAL)
|
||||||
# Data to create buttons
|
# Data to create buttons
|
||||||
pullDownMenu = g.pullDownMenu
|
pullDownMenu = g.pullDownMenu
|
||||||
self.groups = []
|
self.groups = []
|
||||||
self.ctrl = self.shift = false
|
self.ctrl = self.shift = false
|
||||||
|
# Current state (what to enable/disable)
|
||||||
|
self.state = None
|
||||||
groups = [
|
groups = [
|
||||||
["Windows",
|
["Windows",
|
||||||
(ID_NEW.FRAME, images.getToolFrameBitmap()),
|
(ID_NEW.FRAME, images.getToolFrameBitmap()),
|
||||||
@@ -88,15 +98,16 @@ class Tools(wxPanel):
|
|||||||
wxEVT_COMMAND_BUTTON_CLICKED, g.frame.OnCreate)
|
wxEVT_COMMAND_BUTTON_CLICKED, g.frame.OnCreate)
|
||||||
EVT_KEY_DOWN(self, self.OnKeyDown)
|
EVT_KEY_DOWN(self, self.OnKeyDown)
|
||||||
EVT_KEY_UP(self, self.OnKeyUp)
|
EVT_KEY_UP(self, self.OnKeyUp)
|
||||||
|
|
||||||
def AddButton(self, id, image, text):
|
def AddButton(self, id, image, text):
|
||||||
button = wxBitmapButton(self, id, image,
|
button = wxBitmapButton(self, id, image, size=self.TOOL_SIZE,
|
||||||
size=self.TOOL_SIZE,
|
style=wxBU_AUTODRAW|wxNO_BORDER|wxWANTS_CHARS)
|
||||||
style=wxNO_BORDER | wxWANTS_CHARS)
|
|
||||||
EVT_KEY_DOWN(button, self.OnKeyDown)
|
EVT_KEY_DOWN(button, self.OnKeyDown)
|
||||||
EVT_KEY_UP(button, self.OnKeyUp)
|
EVT_KEY_UP(button, self.OnKeyUp)
|
||||||
button.SetToolTipString(text)
|
button.SetToolTipString(text)
|
||||||
self.curSizer.Add(button)
|
self.curSizer.Add(button)
|
||||||
self.groups[-1][1][id] = button
|
self.groups[-1][1][id] = button
|
||||||
|
|
||||||
def AddGroup(self, name):
|
def AddGroup(self, name):
|
||||||
# Each group is inside box
|
# Each group is inside box
|
||||||
box = wxStaticBox(self, -1, name, style=wxWANTS_CHARS)
|
box = wxStaticBox(self, -1, name, style=wxWANTS_CHARS)
|
||||||
@@ -107,20 +118,24 @@ class Tools(wxPanel):
|
|||||||
boxSizer.Add(self.curSizer)
|
boxSizer.Add(self.curSizer)
|
||||||
self.sizer.Add(boxSizer, 0, wxTOP | wxLEFT | wxRIGHT, 4)
|
self.sizer.Add(boxSizer, 0, wxTOP | wxLEFT | wxRIGHT, 4)
|
||||||
self.groups.append((box,{}))
|
self.groups.append((box,{}))
|
||||||
|
|
||||||
# Enable/disable group
|
# Enable/disable group
|
||||||
def EnableGroup(self, gnum, enable = true):
|
def EnableGroup(self, gnum, enable = true):
|
||||||
grp = self.groups[gnum]
|
grp = self.groups[gnum]
|
||||||
grp[0].Enable(enable)
|
grp[0].Enable(enable)
|
||||||
for b in grp[1].values(): b.Enable(enable)
|
for b in grp[1].values(): b.Enable(enable)
|
||||||
|
|
||||||
# Enable/disable group item
|
# Enable/disable group item
|
||||||
def EnableGroupItem(self, gnum, id, enable = true):
|
def EnableGroupItem(self, gnum, id, enable = true):
|
||||||
grp = self.groups[gnum]
|
grp = self.groups[gnum]
|
||||||
grp[1][id].Enable(enable)
|
grp[1][id].Enable(enable)
|
||||||
|
|
||||||
# Enable/disable group items
|
# Enable/disable group items
|
||||||
def EnableGroupItems(self, gnum, ids, enable = true):
|
def EnableGroupItems(self, gnum, ids, enable = true):
|
||||||
grp = self.groups[gnum]
|
grp = self.groups[gnum]
|
||||||
for id in ids:
|
for id in ids:
|
||||||
grp[1][id].Enable(enable)
|
grp[1][id].Enable(enable)
|
||||||
|
|
||||||
# Process key events
|
# Process key events
|
||||||
def OnKeyDown(self, evt):
|
def OnKeyDown(self, evt):
|
||||||
if evt.GetKeyCode() == WXK_CONTROL:
|
if evt.GetKeyCode() == WXK_CONTROL:
|
||||||
@@ -129,6 +144,7 @@ class Tools(wxPanel):
|
|||||||
g.tree.shift = true
|
g.tree.shift = true
|
||||||
self.UpdateIfNeeded()
|
self.UpdateIfNeeded()
|
||||||
evt.Skip()
|
evt.Skip()
|
||||||
|
|
||||||
def OnKeyUp(self, evt):
|
def OnKeyUp(self, evt):
|
||||||
if evt.GetKeyCode() == WXK_CONTROL:
|
if evt.GetKeyCode() == WXK_CONTROL:
|
||||||
g.tree.ctrl = false
|
g.tree.ctrl = false
|
||||||
@@ -136,12 +152,14 @@ class Tools(wxPanel):
|
|||||||
g.tree.shift = false
|
g.tree.shift = false
|
||||||
self.UpdateIfNeeded()
|
self.UpdateIfNeeded()
|
||||||
evt.Skip()
|
evt.Skip()
|
||||||
|
|
||||||
def OnMouse(self, evt):
|
def OnMouse(self, evt):
|
||||||
# Update control and shift states
|
# Update control and shift states
|
||||||
g.tree.ctrl = evt.ControlDown()
|
g.tree.ctrl = evt.ControlDown()
|
||||||
g.tree.shift = evt.ShiftDown()
|
g.tree.shift = evt.ShiftDown()
|
||||||
self.UpdateIfNeeded()
|
self.UpdateIfNeeded()
|
||||||
evt.Skip()
|
evt.Skip()
|
||||||
|
|
||||||
# Update UI after key presses, if necessary
|
# Update UI after key presses, if necessary
|
||||||
def UpdateIfNeeded(self):
|
def UpdateIfNeeded(self):
|
||||||
tree = g.tree
|
tree = g.tree
|
||||||
@@ -157,21 +175,46 @@ class Tools(wxPanel):
|
|||||||
else:
|
else:
|
||||||
status = ''
|
status = ''
|
||||||
g.frame.SetStatusText(status, 1)
|
g.frame.SetStatusText(status, 1)
|
||||||
|
|
||||||
# Update interface
|
# Update interface
|
||||||
def UpdateUI(self):
|
def UpdateUI(self):
|
||||||
# Update status bar
|
# Update status bar
|
||||||
pullDownMenu = g.pullDownMenu
|
pullDownMenu = g.pullDownMenu
|
||||||
tree = g.tree
|
tree = g.tree
|
||||||
item = tree.selection
|
item = tree.selection
|
||||||
|
# If nothing selected, disable everything and return
|
||||||
|
if not item:
|
||||||
# Disable everything
|
# Disable everything
|
||||||
for grp in range(GROUPNUM):
|
for grp in range(GROUPNUM):
|
||||||
self.EnableGroup(grp, false)
|
self.EnableGroup(grp, false)
|
||||||
# If nothing selected, return
|
self.state = None
|
||||||
if not item: return
|
return
|
||||||
if tree.ctrl: needInsert = true
|
if tree.ctrl: needInsert = true
|
||||||
else: needInsert = tree.NeedInsert(item)
|
else: needInsert = tree.NeedInsert(item)
|
||||||
# Enable depending on selection
|
# Enable depending on selection
|
||||||
if item == tree.root or needInsert and tree.GetItemParent(item) == tree.root:
|
if item == tree.root or needInsert and tree.GetItemParent(item) == tree.root:
|
||||||
|
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_WINDOWS, true)
|
||||||
self.EnableGroup(GROUP_MENUS, true)
|
self.EnableGroup(GROUP_MENUS, true)
|
||||||
# But disable items
|
# But disable items
|
||||||
@@ -180,19 +223,14 @@ class Tools(wxPanel):
|
|||||||
ID_NEW.MENU_ITEM,
|
ID_NEW.MENU_ITEM,
|
||||||
ID_NEW.SEPARATOR ],
|
ID_NEW.SEPARATOR ],
|
||||||
false)
|
false)
|
||||||
else:
|
elif state == STATE_MENUBAR:
|
||||||
xxx = tree.GetPyData(item).treeObject()
|
|
||||||
# Check parent for possible child nodes if inserting sibling
|
|
||||||
if needInsert: xxx = xxx.parent
|
|
||||||
if xxx.__class__ == xxxMenuBar:
|
|
||||||
self.EnableGroup(GROUP_MENUS)
|
self.EnableGroup(GROUP_MENUS)
|
||||||
self.EnableGroupItems(GROUP_MENUS,
|
self.EnableGroupItems(GROUP_MENUS,
|
||||||
[ ID_NEW.TOOL_BAR,
|
[ ID_NEW.TOOL_BAR,
|
||||||
ID_NEW.MENU_BAR,
|
ID_NEW.MENU_BAR,
|
||||||
ID_NEW.TOOL ],
|
ID_NEW.TOOL ],
|
||||||
false)
|
false)
|
||||||
elif xxx.__class__ in [xxxToolBar, xxxTool] or \
|
elif state == STATE_TOOLBAR:
|
||||||
xxx.__class__ == xxxSeparator and xxx.parent.__class__ == xxxToolBar:
|
|
||||||
self.EnableGroup(GROUP_MENUS)
|
self.EnableGroup(GROUP_MENUS)
|
||||||
self.EnableGroupItems(GROUP_MENUS,
|
self.EnableGroupItems(GROUP_MENUS,
|
||||||
[ ID_NEW.TOOL_BAR,
|
[ ID_NEW.TOOL_BAR,
|
||||||
@@ -205,7 +243,7 @@ class Tools(wxPanel):
|
|||||||
[ ID_NEW.TREE_CTRL,
|
[ ID_NEW.TREE_CTRL,
|
||||||
ID_NEW.NOTEBOOK ],
|
ID_NEW.NOTEBOOK ],
|
||||||
false)
|
false)
|
||||||
elif xxx.__class__ in [xxxMenu, xxxMenuItem]:
|
elif state == STATE_MENU:
|
||||||
self.EnableGroup(GROUP_MENUS)
|
self.EnableGroup(GROUP_MENUS)
|
||||||
self.EnableGroupItems(GROUP_MENUS,
|
self.EnableGroupItems(GROUP_MENUS,
|
||||||
[ ID_NEW.TOOL_BAR,
|
[ ID_NEW.TOOL_BAR,
|
||||||
@@ -229,8 +267,13 @@ class Tools(wxPanel):
|
|||||||
false)
|
false)
|
||||||
self.EnableGroup(GROUP_SIZERS)
|
self.EnableGroup(GROUP_SIZERS)
|
||||||
self.EnableGroup(GROUP_CONTROLS)
|
self.EnableGroup(GROUP_CONTROLS)
|
||||||
|
# Special case for notebook (always executed)
|
||||||
|
if state == STATE_ELSE:
|
||||||
if xxx.__class__ == xxxNotebook:
|
if xxx.__class__ == xxxNotebook:
|
||||||
self.EnableGroup(GROUP_SIZERS, false)
|
self.EnableGroup(GROUP_SIZERS, false)
|
||||||
elif not (xxx.isSizer or xxx.parent and xxx.parent.isSizer):
|
else:
|
||||||
|
self.EnableGroup(GROUP_SIZERS)
|
||||||
|
if not (xxx.isSizer or xxx.parent and xxx.parent.isSizer):
|
||||||
self.EnableGroupItem(GROUP_SIZERS, ID_NEW.SPACER, false)
|
self.EnableGroupItem(GROUP_SIZERS, ID_NEW.SPACER, false)
|
||||||
|
# Save state
|
||||||
|
self.state = state
|
||||||
|
Reference in New Issue
Block a user