2 # Purpose: XRC editor, toolbar
3 # Author: Roman Rolinsky <rolinsky@mema.ucl.ac.be>
7 from xxx
import * # xxx imports globals and params
8 from tree
import ID_NEW
15 GROUP_WINDOWS
, GROUP_MENUS
, GROUP_SIZERS
, GROUP_CONTROLS
= range(GROUPNUM
)
17 # States depending on current selection and Control/Shift keys
18 STATE_ROOT
, STATE_MENUBAR
, STATE_TOOLBAR
, STATE_MENU
, STATE_ELSE
= range(5)
20 # Left toolbar for GUI elements
23 def __init__(self
, parent
):
24 if wxPlatform
== '__WXGTK__':
25 wxPanel
.__init
__(self
, parent
, -1,
26 style
=wxRAISED_BORDER|wxWANTS_CHARS
)
28 wxPanel
.__init
__(self
, parent
, -1, style
=wxWANTS_CHARS
)
29 # Create sizer for groups
30 self
.sizer
= wxBoxSizer(wxVERTICAL
)
31 # Data to create buttons
32 pullDownMenu
= g
.pullDownMenu
34 self
.ctrl
= self
.shift
= False
35 # Current state (what to enable/disable)
39 (ID_NEW
.FRAME
, images
.getToolFrameBitmap()),
40 (ID_NEW
.DIALOG
, images
.getToolDialogBitmap()),
41 (ID_NEW
.PANEL
, images
.getToolPanelBitmap())],
43 (ID_NEW
.TOOL_BAR
, images
.getToolToolBarBitmap()),
44 (ID_NEW
.MENU_BAR
, images
.getToolMenuBarBitmap()),
45 (ID_NEW
.MENU
, images
.getToolMenuBitmap()),
46 (ID_NEW
.TOOL
, images
.getToolToolBitmap()),
47 (ID_NEW
.MENU_ITEM
, images
.getToolMenuItemBitmap()),
48 (ID_NEW
.SEPARATOR
, images
.getToolSeparatorBitmap())],
50 (ID_NEW
.BOX_SIZER
, images
.getToolBoxSizerBitmap()),
51 (ID_NEW
.STATIC_BOX_SIZER
, images
.getToolStaticBoxSizerBitmap()),
52 (ID_NEW
.GRID_SIZER
, images
.getToolGridSizerBitmap()),
53 (ID_NEW
.FLEX_GRID_SIZER
, images
.getToolFlexGridSizerBitmap()),
54 (ID_NEW
.GRID_BAG_SIZER
, images
.getToolGridBagSizerBitmap()),
55 (ID_NEW
.SPACER
, images
.getToolSpacerBitmap())],
57 (ID_NEW
.STATIC_TEXT
, images
.getToolStaticTextBitmap()),
58 (ID_NEW
.STATIC_BITMAP
, images
.getToolStaticBitmapBitmap()),
59 (ID_NEW
.STATIC_LINE
, images
.getToolStaticLineBitmap()),
61 (ID_NEW
.BUTTON
, images
.getToolButtonBitmap()),
62 (ID_NEW
.BITMAP_BUTTON
, images
.getToolBitmapButtonBitmap()),
63 (ID_NEW
.STATIC_BOX
, images
.getToolStaticBoxBitmap()),
65 (ID_NEW
.TEXT_CTRL
, images
.getToolTextCtrlBitmap()),
66 (ID_NEW
.COMBO_BOX
, images
.getToolComboBoxBitmap()),
67 (ID_NEW
.CHOICE
, images
.getToolChoiceBitmap()),
69 (ID_NEW
.RADIO_BUTTON
, images
.getToolRadioButtonBitmap()),
70 (ID_NEW
.CHECK_BOX
, images
.getToolCheckBoxBitmap()),
71 (ID_NEW
.RADIO_BOX
, images
.getToolRadioBoxBitmap()),
73 (ID_NEW
.SPIN_CTRL
, images
.getToolSpinCtrlBitmap()),
74 (ID_NEW
.SPIN_BUTTON
, images
.getToolSpinButtonBitmap()),
75 (ID_NEW
.SCROLL_BAR
, images
.getToolScrollBarBitmap()),
77 (ID_NEW
.SLIDER
, images
.getToolSliderBitmap()),
78 (ID_NEW
.GAUGE
, images
.getToolGaugeBitmap()),
79 (ID_NEW
.TREE_CTRL
, images
.getToolTreeCtrlBitmap()),
81 (ID_NEW
.LIST_BOX
, images
.getToolListBoxBitmap()),
82 (ID_NEW
.CHECK_LIST
, images
.getToolCheckListBitmap()),
83 (ID_NEW
.LIST_CTRL
, images
.getToolListCtrlBitmap()),
85 (ID_NEW
.NOTEBOOK
, images
.getToolNotebookBitmap()),
86 (ID_NEW
.SPLITTER_WINDOW
, images
.getToolSplitterWindowBitmap()),
88 (ID_NEW
.UNKNOWN
, images
.getToolUnknownBitmap())]
93 self
.AddButton(b
[0], b
[1], g
.pullDownMenu
.createMap
[b
[0]])
94 self
.SetAutoLayout(True)
95 self
.SetSizerAndFit(self
.sizer
)
96 # Allow to be resized in vertical direction only
97 self
.SetSizeHints(self
.GetSize()[0], -1)
99 EVT_COMMAND_RANGE(self
, ID_NEW
.PANEL
, ID_NEW
.LAST
,
100 wxEVT_COMMAND_BUTTON_CLICKED
, g
.frame
.OnCreate
)
101 EVT_KEY_DOWN(self
, self
.OnKeyDown
)
102 EVT_KEY_UP(self
, self
.OnKeyUp
)
104 def AddButton(self
, id, image
, text
):
105 from wxPython
.lib
import buttons
106 button
= buttons
.wxGenBitmapButton(self
, id, image
, size
=self
.TOOL_SIZE
,
107 style
=wxNO_BORDER|wxWANTS_CHARS
)
108 button
.SetBezelWidth(0)
109 EVT_KEY_DOWN(button
, self
.OnKeyDown
)
110 EVT_KEY_UP(button
, self
.OnKeyUp
)
111 button
.SetToolTipString(text
)
112 self
.curSizer
.Add(button
)
113 self
.groups
[-1][1][id] = button
115 def AddGroup(self
, name
):
116 # Each group is inside box
117 box
= wxStaticBox(self
, -1, name
, style
=wxWANTS_CHARS
)
118 box
.SetFont(g
.smallerFont())
119 boxSizer
= wxStaticBoxSizer(box
, wxVERTICAL
)
121 self
.curSizer
= wxGridSizer(0, 3)
122 boxSizer
.Add(self
.curSizer
)
123 self
.sizer
.Add(boxSizer
, 0, wxTOP | wxLEFT | wxRIGHT
, 4)
124 self
.groups
.append((box
,{}))
126 # Enable/disable group
127 def EnableGroup(self
, gnum
, enable
= True):
128 grp
= self
.groups
[gnum
]
129 grp
[0].Enable(enable
)
130 for b
in grp
[1].values(): b
.Enable(enable
)
132 # Enable/disable group item
133 def EnableGroupItem(self
, gnum
, id, enable
= True):
134 grp
= self
.groups
[gnum
]
135 grp
[1][id].Enable(enable
)
137 # Enable/disable group items
138 def EnableGroupItems(self
, gnum
, ids
, enable
= True):
139 grp
= self
.groups
[gnum
]
141 grp
[1][id].Enable(enable
)
144 def OnKeyDown(self
, evt
):
145 if evt
.GetKeyCode() == WXK_CONTROL
:
147 elif evt
.GetKeyCode() == WXK_SHIFT
:
149 self
.UpdateIfNeeded()
152 def OnKeyUp(self
, evt
):
153 if evt
.GetKeyCode() == WXK_CONTROL
:
155 elif evt
.GetKeyCode() == WXK_SHIFT
:
157 self
.UpdateIfNeeded()
160 def OnMouse(self
, evt
):
161 # Update control and shift states
162 g
.tree
.ctrl
= evt
.ControlDown()
163 g
.tree
.shift
= evt
.ShiftDown()
164 self
.UpdateIfNeeded()
167 # Update UI after key presses, if necessary
168 def UpdateIfNeeded(self
):
170 if self
.ctrl
!= tree
.ctrl
or self
.shift
!= tree
.shift
:
171 # Enabling is needed only for ctrl
172 if self
.ctrl
!= tree
.ctrl
: self
.UpdateUI()
173 self
.ctrl
= tree
.ctrl
174 self
.shift
= tree
.shift
181 g
.frame
.SetStatusText(status
, 1)
185 if not self
.IsShown(): return
187 pullDownMenu
= g
.pullDownMenu
189 item
= tree
.selection
190 # If nothing selected, disable everything and return
193 for grp
in range(GROUPNUM
):
194 self
.EnableGroup(grp
, False)
197 if tree
.ctrl
: needInsert
= True
198 else: needInsert
= tree
.NeedInsert(item
)
199 # Enable depending on selection
200 if item
== tree
.root
or needInsert
and tree
.GetItemParent(item
) == tree
.root
:
203 xxx
= tree
.GetPyData(item
).treeObject()
204 # Check parent for possible child nodes if inserting sibling
205 if needInsert
: xxx
= xxx
.parent
206 if xxx
.__class
__ == xxxMenuBar
:
207 state
= STATE_MENUBAR
208 elif xxx
.__class
__ in [xxxToolBar
, xxxTool
] or \
209 xxx
.__class
__ == xxxSeparator
and xxx
.parent
.__class
__ == xxxToolBar
:
210 state
= STATE_TOOLBAR
211 elif xxx
.__class
__ in [xxxMenu
, xxxMenuItem
]:
216 # Enable depending on selection
217 if state
!= self
.state
:
219 for grp
in range(GROUPNUM
):
220 self
.EnableGroup(grp
, False)
222 if state
== STATE_ROOT
:
223 self
.EnableGroup(GROUP_WINDOWS
, True)
224 self
.EnableGroup(GROUP_MENUS
, True)
226 self
.EnableGroupItems(GROUP_MENUS
,
231 elif state
== STATE_MENUBAR
:
232 self
.EnableGroup(GROUP_MENUS
)
233 self
.EnableGroupItems(GROUP_MENUS
,
238 elif state
== STATE_TOOLBAR
:
239 self
.EnableGroup(GROUP_MENUS
)
240 self
.EnableGroupItems(GROUP_MENUS
,
246 self
.EnableGroup(GROUP_CONTROLS
)
247 self
.EnableGroupItems(GROUP_CONTROLS
,
250 ID_NEW
.SPLITTER_WINDOW
],
252 elif state
== STATE_MENU
:
253 self
.EnableGroup(GROUP_MENUS
)
254 self
.EnableGroupItems(GROUP_MENUS
,
260 self
.EnableGroup(GROUP_WINDOWS
)
261 self
.EnableGroupItems(GROUP_WINDOWS
,
265 self
.EnableGroup(GROUP_MENUS
)
266 self
.EnableGroupItems(GROUP_MENUS
,
274 self
.EnableGroup(GROUP_SIZERS
)
275 self
.EnableGroup(GROUP_CONTROLS
)
276 # Special case for notebook (always executed)
277 if state
== STATE_ELSE
:
278 if xxx
.__class
__ == xxxNotebook
:
279 self
.EnableGroup(GROUP_SIZERS
, False)
281 self
.EnableGroup(GROUP_SIZERS
)
282 if not (xxx
.isSizer
or xxx
.parent
and xxx
.parent
.isSizer
):
283 self
.EnableGroupItem(GROUP_SIZERS
, ID_NEW
.SPACER
, False)