focus, and disabled bitmaps of wxBitmapButton to actually be treated like bitmaps. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@39174 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			292 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			292 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# Name:         tools.py
 | 
						|
# Purpose:      XRC editor, toolbar
 | 
						|
# Author:       Roman Rolinsky <rolinsky@mema.ucl.ac.be>
 | 
						|
# Created:      19.03.2003
 | 
						|
# RCS-ID:       $Id$
 | 
						|
 | 
						|
from xxx import *                       # xxx imports globals and params
 | 
						|
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_STDDLGBTN, STATE_ELSE = range(6)
 | 
						|
 | 
						|
# Left toolbar for GUI elements
 | 
						|
class Tools(wx.Panel):
 | 
						|
    TOOL_SIZE = (30, 30)
 | 
						|
    def __init__(self, parent):
 | 
						|
        if wx.Platform == '__WXGTK__':
 | 
						|
            wx.Panel.__init__(self, parent, -1,
 | 
						|
                             style=wx.RAISED_BORDER|wx.WANTS_CHARS)
 | 
						|
        else:
 | 
						|
            wx.Panel.__init__(self, parent, -1, style=wx.WANTS_CHARS)
 | 
						|
        # Create sizer for groups
 | 
						|
        self.sizer = wx.BoxSizer(wx.VERTICAL)
 | 
						|
        # 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()),
 | 
						|
             (ID_NEW.DIALOG, images.getToolDialogBitmap()),
 | 
						|
             (ID_NEW.PANEL, images.getToolPanelBitmap())],
 | 
						|
            ["Menus",
 | 
						|
             (ID_NEW.TOOL_BAR, images.getToolToolBarBitmap()),
 | 
						|
             (ID_NEW.MENU_BAR, images.getToolMenuBarBitmap()),
 | 
						|
             (ID_NEW.MENU, images.getToolMenuBitmap()),
 | 
						|
             (ID_NEW.TOOL, images.getToolToolBitmap()),
 | 
						|
             (ID_NEW.MENU_ITEM, images.getToolMenuItemBitmap()),
 | 
						|
             (ID_NEW.SEPARATOR, images.getToolSeparatorBitmap())],
 | 
						|
            ["Sizers",
 | 
						|
             (ID_NEW.BOX_SIZER, images.getToolBoxSizerBitmap()),
 | 
						|
             (ID_NEW.STATIC_BOX_SIZER, images.getToolStaticBoxSizerBitmap()),
 | 
						|
             (ID_NEW.GRID_SIZER, images.getToolGridSizerBitmap()),
 | 
						|
             (ID_NEW.FLEX_GRID_SIZER, images.getToolFlexGridSizerBitmap()),
 | 
						|
             (ID_NEW.GRID_BAG_SIZER, images.getToolGridBagSizerBitmap()),
 | 
						|
             (ID_NEW.SPACER, images.getToolSpacerBitmap())],
 | 
						|
            ["Controls",
 | 
						|
             (ID_NEW.STATIC_TEXT, images.getToolStaticTextBitmap()),
 | 
						|
             (ID_NEW.STATIC_BITMAP, images.getToolStaticBitmapBitmap()),
 | 
						|
             (ID_NEW.STATIC_LINE, images.getToolStaticLineBitmap()),
 | 
						|
             
 | 
						|
             (ID_NEW.BUTTON, images.getToolButtonBitmap()),
 | 
						|
             (ID_NEW.BITMAP_BUTTON, images.getToolBitmapButtonBitmap()),
 | 
						|
             (ID_NEW.STATIC_BOX, images.getToolStaticBoxBitmap()),
 | 
						|
             
 | 
						|
             (ID_NEW.TEXT_CTRL, images.getToolTextCtrlBitmap()),
 | 
						|
             (ID_NEW.COMBO_BOX, images.getToolComboBoxBitmap()),
 | 
						|
             (ID_NEW.CHOICE, images.getToolChoiceBitmap()),
 | 
						|
             
 | 
						|
             (ID_NEW.RADIO_BUTTON, images.getToolRadioButtonBitmap()),
 | 
						|
             (ID_NEW.CHECK_BOX, images.getToolCheckBoxBitmap()),
 | 
						|
             (ID_NEW.RADIO_BOX, images.getToolRadioBoxBitmap()),
 | 
						|
             
 | 
						|
             (ID_NEW.SPIN_CTRL, images.getToolSpinCtrlBitmap()),
 | 
						|
             (ID_NEW.SPIN_BUTTON, images.getToolSpinButtonBitmap()),
 | 
						|
             (ID_NEW.SCROLL_BAR, images.getToolScrollBarBitmap()),
 | 
						|
 | 
						|
             (ID_NEW.SLIDER, images.getToolSliderBitmap()),
 | 
						|
             (ID_NEW.GAUGE, images.getToolGaugeBitmap()),
 | 
						|
             (ID_NEW.TREE_CTRL, images.getToolTreeCtrlBitmap()),
 | 
						|
             
 | 
						|
             (ID_NEW.LIST_BOX, images.getToolListBoxBitmap()),
 | 
						|
             (ID_NEW.CHECK_LIST, images.getToolCheckListBitmap()),
 | 
						|
             (ID_NEW.LIST_CTRL, images.getToolListCtrlBitmap()),
 | 
						|
             
 | 
						|
             (ID_NEW.NOTEBOOK, images.getToolNotebookBitmap()),
 | 
						|
             (ID_NEW.SPLITTER_WINDOW, images.getToolSplitterWindowBitmap()),
 | 
						|
 | 
						|
             (ID_NEW.UNKNOWN, images.getToolUnknownBitmap())]
 | 
						|
            ]
 | 
						|
        for grp in groups:
 | 
						|
            self.AddGroup(grp[0])
 | 
						|
            for b in grp[1:]:
 | 
						|
                self.AddButton(b[0], b[1], g.pullDownMenu.createMap[b[0]])
 | 
						|
        self.SetAutoLayout(True)
 | 
						|
        self.SetSizerAndFit(self.sizer)
 | 
						|
        # Allow to be resized in vertical direction only
 | 
						|
        self.SetSizeHints(self.GetSize()[0], -1)
 | 
						|
        # Events
 | 
						|
        wx.EVT_COMMAND_RANGE(self, ID_NEW.PANEL, ID_NEW.LAST,
 | 
						|
                          wx.wxEVT_COMMAND_BUTTON_CLICKED, g.frame.OnCreate)
 | 
						|
        wx.EVT_KEY_DOWN(self, self.OnKeyDown)
 | 
						|
        wx.EVT_KEY_UP(self, self.OnKeyUp)
 | 
						|
 | 
						|
    def AddButton(self, id, image, text):
 | 
						|
        from wx.lib import buttons
 | 
						|
        button = buttons.GenBitmapButton(self, id, image, size=self.TOOL_SIZE,
 | 
						|
                                           style=wx.NO_BORDER|wx.WANTS_CHARS)
 | 
						|
        button.SetBezelWidth(0)
 | 
						|
        wx.EVT_KEY_DOWN(button, self.OnKeyDown)
 | 
						|
        wx.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 = wx.StaticBox(self, -1, name, style=wx.WANTS_CHARS)
 | 
						|
        box.SetFont(g.smallerFont())
 | 
						|
        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
 | 
						|
        boxSizer.Add((0, 4))
 | 
						|
        self.curSizer = wx.GridSizer(0, 3)
 | 
						|
        boxSizer.Add(self.curSizer)
 | 
						|
        self.sizer.Add(boxSizer, 0, wx.TOP | wx.LEFT | wx.RIGHT, 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() == wx.WXK_CONTROL:
 | 
						|
            g.tree.ctrl = True
 | 
						|
        elif evt.GetKeyCode() == wx.WXK_SHIFT:
 | 
						|
            g.tree.shift = True
 | 
						|
        self.UpdateIfNeeded()
 | 
						|
        evt.Skip()
 | 
						|
 | 
						|
    def OnKeyUp(self, evt):
 | 
						|
        if evt.GetKeyCode() == wx.WXK_CONTROL:
 | 
						|
            g.tree.ctrl = False
 | 
						|
        elif evt.GetKeyCode() == wx.WXK_SHIFT:
 | 
						|
            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
 | 
						|
        if self.ctrl != tree.ctrl or self.shift != tree.shift:
 | 
						|
            # Enabling is needed only for ctrl
 | 
						|
            if self.ctrl != tree.ctrl: self.UpdateUI()
 | 
						|
            self.ctrl = tree.ctrl
 | 
						|
            self.shift = tree.shift
 | 
						|
            if tree.ctrl:
 | 
						|
                status = 'SBL'
 | 
						|
            elif tree.shift:
 | 
						|
                status = 'INS'
 | 
						|
            else:
 | 
						|
                status = ''
 | 
						|
            g.frame.SetStatusText(status, 1)
 | 
						|
 | 
						|
    # Update interface
 | 
						|
    def UpdateUI(self):
 | 
						|
        if not self.IsShown(): return
 | 
						|
        # Update status bar
 | 
						|
        pullDownMenu = g.pullDownMenu
 | 
						|
        tree = g.tree
 | 
						|
        item = tree.selection
 | 
						|
        # 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:
 | 
						|
            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
 | 
						|
            elif xxx.__class__ == xxxStdDialogButtonSizer:
 | 
						|
                state = STATE_STDDLGBTN
 | 
						|
            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_STDDLGBTN:
 | 
						|
                pass                    # nothing can be added from toolbar
 | 
						|
            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 state == STATE_TOOLBAR:
 | 
						|
                self.EnableGroup(GROUP_MENUS)
 | 
						|
                self.EnableGroupItems(GROUP_MENUS,
 | 
						|
                                      [ ID_NEW.TOOL_BAR,
 | 
						|
                                        ID_NEW.MENU,
 | 
						|
                                        ID_NEW.MENU_BAR,
 | 
						|
                                        ID_NEW.MENU_ITEM ],
 | 
						|
                                      False)
 | 
						|
                self.EnableGroup(GROUP_CONTROLS)
 | 
						|
                self.EnableGroupItems(GROUP_CONTROLS,
 | 
						|
                                      [ ID_NEW.TREE_CTRL,
 | 
						|
                                        ID_NEW.NOTEBOOK,
 | 
						|
                                        ID_NEW.SPLITTER_WINDOW ],
 | 
						|
                                      False)
 | 
						|
            elif state == STATE_MENU:
 | 
						|
                self.EnableGroup(GROUP_MENUS)
 | 
						|
                self.EnableGroupItems(GROUP_MENUS,
 | 
						|
                                      [ ID_NEW.TOOL_BAR,
 | 
						|
                                        ID_NEW.MENU_BAR,
 | 
						|
                                        ID_NEW.TOOL ],
 | 
						|
                                      False)
 | 
						|
            else:
 | 
						|
                self.EnableGroup(GROUP_WINDOWS)
 | 
						|
                self.EnableGroupItems(GROUP_WINDOWS,
 | 
						|
                                      [ ID_NEW.FRAME,
 | 
						|
                                        ID_NEW.DIALOG ],
 | 
						|
                                      False)
 | 
						|
                self.EnableGroup(GROUP_MENUS)
 | 
						|
                self.EnableGroupItems(GROUP_MENUS,
 | 
						|
                                      [ ID_NEW.MENU_BAR,
 | 
						|
                                        ID_NEW.MENU_BAR,
 | 
						|
                                        ID_NEW.MENU,
 | 
						|
                                        ID_NEW.MENU_ITEM,
 | 
						|
                                        ID_NEW.TOOL,
 | 
						|
                                        ID_NEW.SEPARATOR ],
 | 
						|
                                      False)
 | 
						|
                self.EnableGroup(GROUP_SIZERS)
 | 
						|
                self.EnableGroup(GROUP_CONTROLS)
 | 
						|
        # Special case for *book (always executed)
 | 
						|
        if state == STATE_ELSE:
 | 
						|
            if xxx.__class__ in [xxxNotebook, xxxChoicebook, xxxListbook]:
 | 
						|
                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)
 | 
						|
            if xxx.__class__ == xxxFrame:
 | 
						|
                self.EnableGroupItem(GROUP_MENUS, ID_NEW.MENU_BAR)
 | 
						|
        # Save state
 | 
						|
        self.state = state
 |