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
_______________________________________________
Post Messages to: [email protected]
Subscription Maintenance: http://leafe.com/mailman/listinfo/dabo-dev