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
|
||||
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
|
||||
|
Reference in New Issue
Block a user