X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f65bb0f8ab88e80a367b6fa361e92545c04f6914..621b83d9b34572321873cf3d54920a7749b2f53c:/wxPython/wx/tools/XRCed/tools.py diff --git a/wxPython/wx/tools/XRCed/tools.py b/wxPython/wx/tools/XRCed/tools.py index f13a9cbb57..6fda618cfc 100644 --- a/wxPython/wx/tools/XRCed/tools.py +++ b/wxPython/wx/tools/XRCed/tools.py @@ -16,18 +16,17 @@ 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(wxPanel): +class Tools(wx.Panel): TOOL_SIZE = (30, 30) def __init__(self, parent): - if wxPlatform == '__WXGTK__': - wxPanel.__init__(self, parent, -1, - style=wxRAISED_BORDER|wxWANTS_CHARS) + if wx.Platform == '__WXGTK__': + wx.Panel.__init__(self, parent, -1, + style=wx.RAISED_BORDER|wx.WANTS_CHARS) else: - wxPanel.__init__(self, parent, -1, style=wxWANTS_CHARS) + wx.Panel.__init__(self, parent, -1, style=wx.WANTS_CHARS) # Create sizer for groups - self.sizer = wxBoxSizer(wxVERTICAL) + self.sizer = wx.BoxSizer(wx.VERTICAL) # Data to create buttons pullDownMenu = g.pullDownMenu self.groups = [] @@ -87,40 +86,50 @@ class Tools(wxPanel): (ID_NEW.UNKNOWN, images.getToolUnknownBitmap())] ] + self.boxes = {} 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 - EVT_COMMAND_RANGE(self, ID_NEW.PANEL, ID_NEW.LAST, - wxEVT_COMMAND_BUTTON_CLICKED, g.frame.OnCreate) - EVT_KEY_DOWN(self, self.OnKeyDown) - EVT_KEY_UP(self, self.OnKeyUp) + 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) + + self.drag = None def AddButton(self, id, image, text): - from wxPython.lib import buttons - button = buttons.wxGenBitmapButton(self, id, image, size=self.TOOL_SIZE, - style=wxNO_BORDER|wxWANTS_CHARS) + 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) - EVT_KEY_DOWN(button, self.OnKeyDown) - EVT_KEY_UP(button, self.OnKeyUp) + wx.EVT_KEY_DOWN(button, self.OnKeyDown) + wx.EVT_KEY_UP(button, self.OnKeyUp) + wx.EVT_LEFT_DOWN(button, self.OnLeftDownOnButton) + wx.EVT_MOTION(button, self.OnMotionOnButton) 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) + id = wx.NewId() + box = wx.StaticBox(self, id, '[+] '+name, style=wx.WANTS_CHARS) + box.show = True + box.name = name + box.gnum = len(self.groups) box.SetFont(g.smallerFont()) - boxSizer = wxStaticBoxSizer(box, wxVERTICAL) + box.Bind(wx.EVT_LEFT_DOWN, self.OnClickBox) + boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL) boxSizer.Add((0, 4)) - self.curSizer = wxGridSizer(0, 3) + self.boxes[id] = box + self.curSizer = wx.GridSizer(0, 3) boxSizer.Add(self.curSizer) - self.sizer.Add(boxSizer, 0, wxTOP | wxLEFT | wxRIGHT, 4) + self.sizer.Add(boxSizer, 0, wx.TOP | wx.LEFT | wx.RIGHT | wx.EXPAND, 4) self.groups.append((box,{})) # Enable/disable group @@ -129,6 +138,12 @@ class Tools(wxPanel): grp[0].Enable(enable) for b in grp[1].values(): b.Enable(enable) + # Show/hide group + def ShowGroup(self, gnum, show = True): + grp = self.groups[gnum] + grp[0].show = show + for b in grp[1].values(): b.Show(show) + # Enable/disable group item def EnableGroupItem(self, gnum, id, enable = True): grp = self.groups[gnum] @@ -140,19 +155,65 @@ class Tools(wxPanel): for id in ids: grp[1][id].Enable(enable) + def OnClickBox(self, evt): + box = self.boxes[evt.GetId()] + # Collapse/restore static box, change label + self.ShowGroup(box.gnum, not box.show) + if box.show: box.SetLabel('[+] ' + box.name) + else: box.SetLabel('[-] ' + box.name) + self.Layout() + + # DaD + def OnLeftDownOnButton(self, evt): + self.posDown = evt.GetPosition() + self.idDown = evt.GetId() + self.btnDown = evt.GetEventObject() + evt.Skip() + + def OnMotionOnButton(self, evt): + # Detect dragging + if evt.Dragging() and evt.LeftIsDown(): + d = evt.GetPosition() - self.posDown + if max(abs(d[0]), abs(d[1])) >= 5: + if self.btnDown.HasCapture(): + # Generate up event to release mouse + evt = wx.MouseEvent(wx.EVT_LEFT_UP.typeId) + evt.SetId(self.idDown) + # Set flag to prevent normal button operation this time + self.drag = True + self.btnDown.ProcessEvent(evt) + self.StartDrag() + evt.Skip() + + def StartDrag(self): + do = MyDataObject() + do.SetData(str(self.idDown)) + bm = self.btnDown.GetBitmapLabel() + # wxGTK requires wxIcon cursor, wxWIN and wxMAC require wxCursor + if wx.Platform == '__WXGTK__': + icon = wx.EmptyIcon() + icon.CopyFromBitmap(bm) + dragSource = wx.DropSource(self, icon) + else: + curs = wx.CursorFromImage(wx.ImageFromBitmap(bm)) + dragSource = wx.DropSource(self, curs) + dragSource.SetData(do) + g.frame.SetStatusText('Release the mouse button over the test window') + dragSource.DoDragDrop() + # Process key events def OnKeyDown(self, evt): - if evt.GetKeyCode() == WXK_CONTROL: + if evt.GetKeyCode() == wx.WXK_CONTROL: g.tree.ctrl = True - elif evt.GetKeyCode() == WXK_SHIFT: + elif evt.GetKeyCode() == wx.WXK_SHIFT: g.tree.shift = True self.UpdateIfNeeded() evt.Skip() def OnKeyUp(self, evt): - if evt.GetKeyCode() == WXK_CONTROL: + if evt.GetKeyCode() == wx.WXK_CONTROL: g.tree.ctrl = False - elif evt.GetKeyCode() == WXK_SHIFT: + elif evt.GetKeyCode() == wx.WXK_SHIFT: g.tree.shift = False self.UpdateIfNeeded() evt.Skip()