daboide Commit Revision 585 Date: 2006-05-31 12:27:14 -0700 (Wed, 31 May 2006) Author: ed
Changed: U trunk/ClassDesigner.py U trunk/ClassDesignerComponents.py U trunk/ClassDesignerTreeSheet.py
Log: Added context menu options for moving an object to an adjacent sizer slot: either up, down, left or right, depending on the type of sizer it is in and whether it is at a boundary.
Fixed a problem that was leaving the row,col information out of the Object Tree for objects in grid sizers.
Diff: Modified: trunk/ClassDesigner.py =================================================================== --- trunk/ClassDesigner.py 2006-05-29 22:31:22 UTC (rev 584) +++ trunk/ClassDesigner.py 2006-05-31 19:27:14 UTC (rev 585) @@ -1918,17 +1918,38 @@ depending on its position in the design surface. """ self._contextObj = obj - if isinstance(obj.ControllingSizer, (dabo.ui.dSizer, dabo.ui.dBorderSizer)): + sz = obj.ControllingSizer + items = [] + if isinstance(sz, (dui.dSizer, dui.dBorderSizer)): + if sz.Orientation == "Vertical": + items.append((_("Add Slot Above"), self.onAddSlotBefore)) + items.append((_("Add Slot Below"), self.onAddSlotAfter)) + else: + items.append((_("Add Slot Left"), self.onAddSlotBefore)) + items.append((_("Add Slot Right"), self.onAddSlotAfter)) + pos = obj.getPositionInSizer() + if pos > 0: + items.append((_("Move Up One Slot"), self.onMoveSlotUp)) + if pos < len(sz.Children)-1: + items.append((_("Move Down One Slot"), self.onMoveSlotDown)) + elif isinstance(sz, dui.dGridSizer): + pos = sz.getGridPos(obj) + if pos != (0, 0): + items.append((_("Move Up One Slot"), self.onMoveSlotUp)) + if not ((sz.MaxDimension == "r") and (pos[0] >= sz.MaxRows)): + items.append((_("Move Down One Slot"), self.onMoveSlotDown)) + if pos[1] > 0: + items.append((_("Move Left One Slot"), self.onMoveSlotLeft)) + if not ((sz.MaxDimension == "c") and (pos[1] >= sz.MaxCols)): + items.append((_("Move Right One Slot"), self.onMoveSlotRight)) + if items: if sepBefore: pop.appendSeparator() - if obj.ControllingSizer.Orientation == "Vertical": - pop.append(_("Add Slot Above"), bindfunc=self.onAddSlotBefore) - pop.append(_("Add Slot Below"), bindfunc=self.onAddSlotAfter) - else: - pop.append(_("Add Slot Left"), bindfunc=self.onAddSlotBefore) - pop.append(_("Add Slot Right"), bindfunc=self.onAddSlotAfter) + for cap, func in items: + pop.append(cap, bindfunc=func) if sepAfter: pop.appendSeparator() + def onAddSlotBefore(self, evt): @@ -1937,8 +1958,8 @@ def onAddSlotAfter(self, evt): self._addEmptySlot(1) - - + + def _addEmptySlot(self, offset): obj = self._contextObj self._contextObj = None @@ -1949,6 +1970,59 @@ self.updateLayout() + def onMoveSlotUp(self, evt): + obj = self._contextObj + sz = obj.ControllingSizer + if isinstance(sz, (dui.dSizer, dui.dBorderSizer)): + self._moveVertically(obj, sz, -1) + elif isinstance(sz, dui.dGridSizer): + sz.switchObjects(obj, sz.getNeighbor(obj, "up")) + self.updateLayout() + + + def onMoveSlotDown(self, evt): + obj = self._contextObj + sz = obj.ControllingSizer + if isinstance(sz, (dui.dSizer, dui.dBorderSizer)): + self._moveVertically(obj, sz, 1) + elif isinstance(sz, dui.dGridSizer): + target = sz.getNeighbor(obj, "down") + if target is None: + # We're at the bottom row of the design, so add a row + sz.Rows += 1 + target = sz.getNeighbor(obj, "down") + sz.switchObjects(obj, target) + self.updateLayout() + + + def _moveVertically(self, obj, sz, drct): + pos = obj.getPositionInSizer() + props = sz.getItemProps(obj) + sz.remove(obj) + sz.insert(pos+drct, obj) + sz.setItemProps(obj, props) + sz.layout() + + + def onMoveSlotLeft(self, evt): + obj = self._contextObj + sz = obj.ControllingSizer + sz.switchObjects(obj, sz.getNeighbor(obj, "left")) + self.updateLayout() + + + def onMoveSlotRight(self, evt): + obj = self._contextObj + sz = obj.ControllingSizer + target = sz.getNeighbor(obj, "right") + if target is None: + # We're at the rightmost column of the design, so add a col. + sz.Columns += 1 + target = sz.getNeighbor(obj, "right") + sz.switchObjects(obj, target) + self.updateLayout() + + def getControlMenu(self, srcObj, justSizers=False): """Creates the popup menu for selecting child objects""" # Store the source object
Modified: trunk/ClassDesignerComponents.py =================================================================== --- trunk/ClassDesignerComponents.py 2006-05-29 22:31:22 UTC (rev 584) +++ trunk/ClassDesignerComponents.py 2006-05-31 19:27:14 UTC (rev 585) @@ -1219,6 +1219,21 @@ return ret + def switchObjects(self, obj1, obj2): + """Swaps the location of the two objects.""" + if not obj1 or not obj2: + dabo.errorLog.write(_("Cannot swap with non-existent object.")) + return + row1, col1 = self.getGridPos(obj1) + row2, col2 = self.getGridPos(obj2) + props = self.getItemProps(obj1) + self.remove(obj1) + self.moveObject(obj2, row1, col1) + self.append(obj1, row=row2, col=col2) + self.setItemProps(obj1, props) + self.layout() + + def createContextMenu(self): pop = dabo.ui.dMenu() isMain = (self.ControllingSizer is None
Modified: trunk/ClassDesignerTreeSheet.py =================================================================== --- trunk/ClassDesignerTreeSheet.py 2006-05-29 22:31:22 UTC (rev 584) +++ trunk/ClassDesignerTreeSheet.py 2006-05-31 19:27:14 UTC (rev 585) @@ -164,6 +164,11 @@ dsp = (obj.Name, self._getClassName(obj._baseClass)) else: dsp = ("", self._getClassName(obj.__class__)) + try: + if isinstance(obj.ControllingSizer, LayoutGridSizer): + r, c = obj.ControllingSizer.getGridPos(obj) + dsp = ("%s r:%s, c:%s" % (dsp[0], r, c), dsp[1]) + except: pass ret = "%s (%s)" % dsp return ret
©2006 Ed Leafe |
|