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_STDDLGBTN
, STATE_ELSE
= range(6)
19 # Left toolbar for GUI elements
20 class Tools(wx
.Panel
):
22 def __init__(self
, parent
):
23 if wx
.Platform
== '__WXGTK__':
24 wx
.Panel
.__init
__(self
, parent
, -1,
25 style
=wx
.RAISED_BORDER|wx
.WANTS_CHARS
)
27 wx
.Panel
.__init
__(self
, parent
, -1, style
=wx
.WANTS_CHARS
)
28 # Create sizer for groups
29 self
.sizer
= wx
.BoxSizer(wx
.VERTICAL
)
30 # Data to create buttons
31 pullDownMenu
= g
.pullDownMenu
33 self
.ctrl
= self
.shift
= False
34 # Current state (what to enable/disable)
38 (ID_NEW
.FRAME
, images
.getToolFrameBitmap()),
39 (ID_NEW
.DIALOG
, images
.getToolDialogBitmap()),
40 (ID_NEW
.PANEL
, images
.getToolPanelBitmap())],
42 (ID_NEW
.TOOL_BAR
, images
.getToolToolBarBitmap()),
43 (ID_NEW
.MENU_BAR
, images
.getToolMenuBarBitmap()),
44 (ID_NEW
.MENU
, images
.getToolMenuBitmap()),
45 (ID_NEW
.TOOL
, images
.getToolToolBitmap()),
46 (ID_NEW
.MENU_ITEM
, images
.getToolMenuItemBitmap()),
47 (ID_NEW
.SEPARATOR
, images
.getToolSeparatorBitmap())],
49 (ID_NEW
.BOX_SIZER
, images
.getToolBoxSizerBitmap()),
50 (ID_NEW
.STATIC_BOX_SIZER
, images
.getToolStaticBoxSizerBitmap()),
51 (ID_NEW
.GRID_SIZER
, images
.getToolGridSizerBitmap()),
52 (ID_NEW
.FLEX_GRID_SIZER
, images
.getToolFlexGridSizerBitmap()),
53 (ID_NEW
.GRID_BAG_SIZER
, images
.getToolGridBagSizerBitmap()),
54 (ID_NEW
.SPACER
, images
.getToolSpacerBitmap())],
56 (ID_NEW
.STATIC_TEXT
, images
.getToolStaticTextBitmap()),
57 (ID_NEW
.STATIC_BITMAP
, images
.getToolStaticBitmapBitmap()),
58 (ID_NEW
.STATIC_LINE
, images
.getToolStaticLineBitmap()),
60 (ID_NEW
.BUTTON
, images
.getToolButtonBitmap()),
61 (ID_NEW
.BITMAP_BUTTON
, images
.getToolBitmapButtonBitmap()),
62 (ID_NEW
.STATIC_BOX
, images
.getToolStaticBoxBitmap()),
64 (ID_NEW
.TEXT_CTRL
, images
.getToolTextCtrlBitmap()),
65 (ID_NEW
.COMBO_BOX
, images
.getToolComboBoxBitmap()),
66 (ID_NEW
.CHOICE
, images
.getToolChoiceBitmap()),
68 (ID_NEW
.RADIO_BUTTON
, images
.getToolRadioButtonBitmap()),
69 (ID_NEW
.CHECK_BOX
, images
.getToolCheckBoxBitmap()),
70 (ID_NEW
.RADIO_BOX
, images
.getToolRadioBoxBitmap()),
72 (ID_NEW
.SPIN_CTRL
, images
.getToolSpinCtrlBitmap()),
73 (ID_NEW
.SPIN_BUTTON
, images
.getToolSpinButtonBitmap()),
74 (ID_NEW
.SCROLL_BAR
, images
.getToolScrollBarBitmap()),
76 (ID_NEW
.SLIDER
, images
.getToolSliderBitmap()),
77 (ID_NEW
.GAUGE
, images
.getToolGaugeBitmap()),
78 (ID_NEW
.TREE_CTRL
, images
.getToolTreeCtrlBitmap()),
80 (ID_NEW
.LIST_BOX
, images
.getToolListBoxBitmap()),
81 (ID_NEW
.CHECK_LIST
, images
.getToolCheckListBitmap()),
82 (ID_NEW
.LIST_CTRL
, images
.getToolListCtrlBitmap()),
84 (ID_NEW
.NOTEBOOK
, images
.getToolNotebookBitmap()),
85 (ID_NEW
.SPLITTER_WINDOW
, images
.getToolSplitterWindowBitmap()),
87 (ID_NEW
.UNKNOWN
, images
.getToolUnknownBitmap())]
93 self
.AddButton(b
[0], b
[1], g
.pullDownMenu
.createMap
[b
[0]])
94 self
.SetSizerAndFit(self
.sizer
)
95 # Allow to be resized in vertical direction only
96 self
.SetSizeHints(self
.GetSize()[0], -1)
98 wx
.EVT_COMMAND_RANGE(self
, ID_NEW
.PANEL
, ID_NEW
.LAST
,
99 wx
.wxEVT_COMMAND_BUTTON_CLICKED
, g
.frame
.OnCreate
)
100 wx
.EVT_KEY_DOWN(self
, self
.OnKeyDown
)
101 wx
.EVT_KEY_UP(self
, self
.OnKeyUp
)
102 # wxMSW does not generate click events for StaticBox
103 if wx
.Platform
== '__WXMSW__':
104 self
.Bind(wx
.EVT_LEFT_DOWN
, self
.OnClickBox
)
108 def AddButton(self
, id, image
, text
):
109 from wx
.lib
import buttons
110 button
= buttons
.GenBitmapButton(self
, id, image
, size
=self
.TOOL_SIZE
,
111 style
=wx
.NO_BORDER|wx
.WANTS_CHARS
)
112 button
.SetBezelWidth(0)
113 wx
.EVT_KEY_DOWN(button
, self
.OnKeyDown
)
114 wx
.EVT_KEY_UP(button
, self
.OnKeyUp
)
115 wx
.EVT_LEFT_DOWN(button
, self
.OnLeftDownOnButton
)
116 wx
.EVT_MOTION(button
, self
.OnMotionOnButton
)
117 button
.SetToolTipString(text
)
118 self
.curSizer
.Add(button
)
119 self
.groups
[-1][1][id] = button
121 def AddGroup(self
, name
):
122 # Each group is inside box
124 box
= wx
.StaticBox(self
, id, '[+] '+name
, style
=wx
.WANTS_CHARS
)
125 box
.SetForegroundColour(wx
.Colour(64, 64, 64))
126 # box.SetFont(g.smallerFont())
129 box
.gnum
= len(self
.groups
)
130 box
.Bind(wx
.EVT_LEFT_DOWN
, self
.OnClickBox
)
131 boxSizer
= wx
.StaticBoxSizer(box
, wx
.VERTICAL
)
134 self
.curSizer
= wx
.GridSizer(0, 3)
135 boxSizer
.Add(self
.curSizer
)
136 self
.sizer
.Add(boxSizer
, 0, wx
.TOP | wx
.LEFT | wx
.RIGHT | wx
.EXPAND
, 4)
137 self
.groups
.append((box
,{}))
139 # Enable/disable group
140 def EnableGroup(self
, gnum
, enable
= True):
141 grp
= self
.groups
[gnum
]
142 #grp[0].Enable(enable)
143 for b
in grp
[1].values(): b
.Enable(enable
)
146 def ShowGroup(self
, gnum
, show
= True):
147 grp
= self
.groups
[gnum
]
149 for b
in grp
[1].values(): b
.Show(show
)
151 # Enable/disable group item
152 def EnableGroupItem(self
, gnum
, id, enable
= True):
153 grp
= self
.groups
[gnum
]
154 grp
[1][id].Enable(enable
)
156 # Enable/disable group items
157 def EnableGroupItems(self
, gnum
, ids
, enable
= True):
158 grp
= self
.groups
[gnum
]
160 grp
[1][id].Enable(enable
)
162 def OnClickBox(self
, evt
):
163 if wx
.Platform
== '__WXMSW__':
165 for id,b
in self
.boxes
.items():
166 # How to detect a click on a label?
167 if b
.GetRect().Inside(evt
.GetPosition()):
174 box
= self
.boxes
[evt
.GetId()]
175 # Collapse/restore static box, change label
176 self
.ShowGroup(box
.gnum
, not box
.show
)
177 if box
.show
: box
.SetLabel('[+] ' + box
.name
)
178 else: box
.SetLabel('[-] ' + box
.name
)
181 #for b in self.boxes.items():
184 def OnLeftDownOnButton(self
, evt
):
185 self
.posDown
= evt
.GetPosition()
186 self
.idDown
= evt
.GetId()
187 self
.btnDown
= evt
.GetEventObject()
190 def OnMotionOnButton(self
, evt
):
192 if evt
.Dragging() and evt
.LeftIsDown():
193 d
= evt
.GetPosition() - self
.posDown
194 if max(abs(d
[0]), abs(d
[1])) >= 5:
195 if self
.btnDown
.HasCapture():
196 # Generate up event to release mouse
197 evt
= wx
.MouseEvent(wx
.EVT_LEFT_UP
.typeId
)
198 evt
.SetId(self
.idDown
)
199 # Set flag to prevent normal button operation this time
201 self
.btnDown
.ProcessEvent(evt
)
207 do
.SetData(str(self
.idDown
))
208 bm
= self
.btnDown
.GetBitmapLabel()
209 # wxGTK requires wxIcon cursor, wxWIN and wxMAC require wxCursor
210 if wx
.Platform
== '__WXGTK__':
211 icon
= wx
.EmptyIcon()
212 icon
.CopyFromBitmap(bm
)
213 dragSource
= wx
.DropSource(self
, icon
)
215 curs
= wx
.CursorFromImage(wx
.ImageFromBitmap(bm
))
216 dragSource
= wx
.DropSource(self
, curs
)
217 dragSource
.SetData(do
)
218 g
.frame
.SetStatusText('Release the mouse button over the test window')
219 dragSource
.DoDragDrop()
222 def OnKeyDown(self
, evt
):
223 if evt
.GetKeyCode() == wx
.WXK_CONTROL
:
225 elif evt
.GetKeyCode() == wx
.WXK_SHIFT
:
227 self
.UpdateIfNeeded()
230 def OnKeyUp(self
, evt
):
231 if evt
.GetKeyCode() == wx
.WXK_CONTROL
:
233 elif evt
.GetKeyCode() == wx
.WXK_SHIFT
:
235 self
.UpdateIfNeeded()
238 def OnMouse(self
, evt
):
239 # Update control and shift states
240 g
.tree
.ctrl
= evt
.ControlDown()
241 g
.tree
.shift
= evt
.ShiftDown()
242 self
.UpdateIfNeeded()
245 # Update UI after key presses, if necessary
246 def UpdateIfNeeded(self
):
248 if self
.ctrl
!= tree
.ctrl
or self
.shift
!= tree
.shift
:
249 # Enabling is needed only for ctrl
250 if self
.ctrl
!= tree
.ctrl
: self
.UpdateUI()
251 self
.ctrl
= tree
.ctrl
252 self
.shift
= tree
.shift
259 g
.frame
.SetStatusText(status
, 1)
263 if not self
.IsShown(): return
265 pullDownMenu
= g
.pullDownMenu
267 item
= tree
.selection
268 # If nothing selected, disable everything and return
271 for grp
in range(GROUPNUM
):
272 self
.EnableGroup(grp
, False)
275 if tree
.ctrl
: needInsert
= True
276 else: needInsert
= tree
.NeedInsert(item
)
277 # Enable depending on selection
278 if item
== tree
.root
or needInsert
and tree
.GetItemParent(item
) == tree
.root
:
281 xxx
= tree
.GetPyData(item
).treeObject()
282 # Check parent for possible child nodes if inserting sibling
283 if needInsert
: xxx
= xxx
.parent
284 if xxx
.__class
__ == xxxMenuBar
:
285 state
= STATE_MENUBAR
286 elif xxx
.__class
__ in [xxxToolBar
, xxxTool
] or \
287 xxx
.__class
__ == xxxSeparator
and xxx
.parent
.__class
__ == xxxToolBar
:
288 state
= STATE_TOOLBAR
289 elif xxx
.__class
__ in [xxxMenu
, xxxMenuItem
]:
291 elif xxx
.__class
__ == xxxStdDialogButtonSizer
:
292 state
= STATE_STDDLGBTN
296 # Enable depending on selection
297 if state
!= self
.state
:
299 for grp
in range(GROUPNUM
):
300 self
.EnableGroup(grp
, False)
302 if state
== STATE_ROOT
:
303 self
.EnableGroup(GROUP_WINDOWS
, True)
304 self
.EnableGroup(GROUP_MENUS
, True)
306 self
.EnableGroupItems(GROUP_MENUS
,
311 elif state
== STATE_STDDLGBTN
:
312 pass # nothing can be added from toolbar
313 elif state
== STATE_MENUBAR
:
314 self
.EnableGroup(GROUP_MENUS
)
315 self
.EnableGroupItems(GROUP_MENUS
,
320 elif state
== STATE_TOOLBAR
:
321 self
.EnableGroup(GROUP_MENUS
)
322 self
.EnableGroupItems(GROUP_MENUS
,
328 self
.EnableGroup(GROUP_CONTROLS
)
329 self
.EnableGroupItems(GROUP_CONTROLS
,
332 ID_NEW
.SPLITTER_WINDOW
],
334 elif state
== STATE_MENU
:
335 self
.EnableGroup(GROUP_MENUS
)
336 self
.EnableGroupItems(GROUP_MENUS
,
342 self
.EnableGroup(GROUP_WINDOWS
)
343 self
.EnableGroupItems(GROUP_WINDOWS
,
347 self
.EnableGroup(GROUP_MENUS
)
348 self
.EnableGroupItems(GROUP_MENUS
,
356 self
.EnableGroup(GROUP_SIZERS
)
357 self
.EnableGroup(GROUP_CONTROLS
)
358 # Special case for *book (always executed)
359 if state
== STATE_ELSE
:
360 if xxx
.__class
__ in [xxxNotebook
, xxxChoicebook
, xxxListbook
]:
361 self
.EnableGroup(GROUP_SIZERS
, False)
363 self
.EnableGroup(GROUP_SIZERS
)
364 if not (xxx
.isSizer
or xxx
.parent
and xxx
.parent
.isSizer
):
365 self
.EnableGroupItem(GROUP_SIZERS
, ID_NEW
.SPACER
, False)
366 if xxx
.__class
__ == xxxFrame
:
367 self
.EnableGroupItem(GROUP_MENUS
, ID_NEW
.MENU_BAR
)