commit-gnue
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

gnue/gnuef/designer/src Instance.py LayoutHandl...


From: Jason Cater
Subject: gnue/gnuef/designer/src Instance.py LayoutHandl...
Date: Thu, 14 Jun 2001 16:00:08 -0700

CVSROOT:        /home/cvs
Module name:    gnue
Changes by:     Jason Cater <address@hidden>    01/06/14 16:00:08

Modified files:
        gnuef/designer/src: Instance.py LayoutHandler.py 

Log message:
        Modified designer so multi-record fields are displayed and behave as 
such. \nAlso, selecting with a mouse works (including pressing shift to select 
multiple items). \The arrow keys still move the items and Alt+arrow keys resize 
the items. \nBorders are drawn around currently selected items.\nCurrently, 
Labels are being displayed behind the border box (not sure why, as the other 
widgets display correctly???)\nSelecting items with mouse has been reworked so, 
for example, the cursor does not change over text fields and clicking dropdown 
boxes in wrong place does not actually drop down a box :)

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnuef/designer/src/Instance.py.diff?cvsroot=OldCVS&tr1=1.1&tr2=1.2&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnuef/designer/src/LayoutHandler.py.diff?cvsroot=OldCVS&tr1=1.1&tr2=1.2&r1=text&r2=text

Patches:
Index: gnue/gnuef/designer/src/Instance.py
diff -u gnue/gnuef/designer/src/Instance.py:1.1 
gnue/gnuef/designer/src/Instance.py:1.2
--- gnue/gnuef/designer/src/Instance.py:1.1     Tue Jun 12 10:18:26 2001
+++ gnue/gnuef/designer/src/Instance.py Thu Jun 14 16:00:08 2001
@@ -47,8 +47,6 @@
 
     self._pages = []
 
-    self.widgets = UIwxpython.WIDGETS
-
     if location == None: 
       self._path = ""
       self._form = GFForm.GFForm()
@@ -106,8 +104,6 @@
         self.tree.AppendItem(self._form._treeItem, "Page Layout")
 
     self._form.walk(self.inventoryLoadedItems)
-
-    self._pageList = []
 
     self._currentPage = self._pages[0]
     hsplitter.SplitHorizontally (self.tree, self.editor)
Index: gnue/gnuef/designer/src/LayoutHandler.py
diff -u gnue/gnuef/designer/src/LayoutHandler.py:1.1 
gnue/gnuef/designer/src/LayoutHandler.py:1.2
--- gnue/gnuef/designer/src/LayoutHandler.py:1.1        Tue Jun 12 10:18:26 2001
+++ gnue/gnuef/designer/src/LayoutHandler.py    Thu Jun 14 16:00:08 2001
@@ -41,10 +41,12 @@
     self._form = instance._form
     self._app = instance._app
     self.widgets = UIwxpython.WIDGETS
+    del self.widgets['GFPage']
     self.pageNameLabel = wxStaticText(self, -1, "Page: ", pos=wxPoint(10,20))
     self._pageList = []  # Needed by UIwxpython
 
   def drawPage(self, page): 
+    self._currentSelection = {}
 
     self.panel = GridPane(self, self, wxPoint(10,60))
     self.panelColor = self.panel.GetBackgroundColour()
@@ -72,6 +74,7 @@
     
     self.borderPercentage = (int(GConfig.get('borderPercentage')) / 100.0)
     self.textPercentage = (int(GConfig.get('textPercentage')) / 100.0)
+    self.positionMappings = {}
 
     width = int(self._form.getOption('width'))
     height = int(self._form.getOption('height'))
@@ -84,13 +87,14 @@
     self.gridWidth = self.widgetWidth
     self.gridHeight = self.widgetHeight
 
-    self.menu_sb_space=0 # the extra spaces needed by the menu, toolbar and 
statusbar    
+    self.menu_sb_space=2 # the extra spaces needed by the menu, toolbar and 
statusbar    
 
-    self.panel.SetSize(wxSize(int(width)*int(self.widgetWidth), 
+    self.panel.SetClientSize(wxSize(int(width)*int(self.widgetWidth), 
                        int(height)*int(self.widgetHeight)))
 
     page.walk(self.__drawItem)
 
+    EVT_CHAR(self.panel, self.keyTrap)
     EVT_LEFT_UP(self.panel, self.OnLeftUp)
     EVT_LEFT_DOWN(self.panel, self.OnLeftDown)
     EVT_RIGHT_UP(self.panel, self.OnRightUp)
@@ -99,22 +103,45 @@
 
   def __drawItem(self, object): 
     if self.widgets.has_key(object.getObjectType()): 
-#      object._widgetContainer = WidgetContainer(self, self.panel) 
+      object._widgetHandler = WidgetHandler(self, object)
       object._widget = self.widgets[object.getObjectType()]\
          (object,self.panel, self.textWidth, self.textHeight, \
           self.widgetWidth, self.widgetHeight, self,initialize=0)
-      object._widgetHandler = WidgetHandler(self, object, object._widget)
-#      object._widgetContainer.set(object._widget)
       object._widget._object = object
+      object._widgetHandler.initialize(object._widget)
+      if not len(self._currentSelection.keys()): 
+        self._currentSelection = {object._widgetHandler:1}
+        object._widgetHandler.setSelected(0)
 
 
-
   def OnLeftDown(self, event): 
-    print "Left down"
-#    self.curLine = [] 
-    self.x, self.y = event.GetPositionTuple() 
-    self.__mouseObject = self.panel.Get
+    x,y = event.GetPositionTuple()
+    if wxPyTypeCast(event.GetEventObject(),'wxWindow').GetId() != 
self.panel.GetId(): 
+      xa, ya = 
wxPyTypeCast(event.GetEventObject(),'wxWindow').GetPositionTuple()
+      x = x + xa
+      y = y + ya
+    print "Left down (%s,%s)" % (x,y)
+    self.x = x
+    self.y = y
     self.panel.CaptureMouse() 
+    if not event.ShiftDown(): 
+      for selection in self._currentSelection.keys(): 
+        selection.setSelected(0)
+      self._currentSelection = {}
+    selection = None
+    for t in self.positionMappings.values():
+      if x >= t[0] and x <= t[2] and y >= t[1] and y <= t[3]: 
+        selection = t[4]
+        break
+    if selection != None: 
+      if self._currentSelection.has_key(selection): 
+        print ("Deselected")
+        del self._currentSelection[selection]
+        selection.setSelected(0)
+      else: 
+        print ("Selected")
+        self._currentSelection[selection] = 1
+        selection.setSelected(1)
  
  
   def OnLeftUp(self, event): 
@@ -144,31 +171,105 @@
 #      self.x, self.y = pos 
 #      dc.EndDrawing() 
  
+  def keyTrap(self, event): 
+    if event.KeyCode() in (WXK_LEFT, WXK_RIGHT, WXK_UP, WXK_DOWN):
+      print "Got key code"
+    if event.KeyCode() in (WXK_LEFT, WXK_RIGHT, WXK_UP, WXK_DOWN) and \
+      len(self._currentSelection.keys()): 
+      print "%s" % self._currentSelection
+      if event.AltDown() or event.MetaDown():
+        if event.KeyCode() == WXK_LEFT:
+          for widget in self._currentSelection.keys(): 
+            widget.relativeResize(-1,0)
+        if event.KeyCode() == WXK_RIGHT:
+          for widget in self._currentSelection.keys(): 
+            widget.relativeResize(1,0)
+        if event.KeyCode() == WXK_UP: 
+          for widget in self._currentSelection.keys(): 
+            widget.relativeResize(0,-1)
+        if event.KeyCode() == WXK_DOWN:
+          for widget in self._currentSelection.keys(): 
+            widget.relativeResize(0,1)
+      else: 
+        if event.KeyCode() == WXK_LEFT: 
+          for widget in self._currentSelection.keys(): 
+            widget.relativeMove(-1,0)
+        if event.KeyCode() == WXK_RIGHT:
+          for widget in self._currentSelection.keys(): 
+            widget.relativeMove(1,0)
+        if event.KeyCode() == WXK_UP: 
+          for widget in self._currentSelection.keys(): 
+            widget.relativeMove(0,-1)
+        if event.KeyCode() == WXK_DOWN:
+          for widget in self._currentSelection.keys(): 
+            widget.relativeMove(0,1)
 
 #
 #
 #
 class WidgetHandler: 
-  def __init__(self, instance, object, widget): 
-    print widget
+  def __init__(self, instance, object): 
     self.instance = instance
     self.object = object 
-    self.widget = widget.widgets[0]
-    self.mainWidget = widget
     self.hasFocus = 0
     self.menu = None
+    self.highlightBox = WidgetHighlighter(self.instance.panel)
+
+  def initialize(self, widget): 
+    self.widget = widget.widgets[0]
+    self.mainWidget = widget    
 
+    self.recalcBoundaries()
+
     for widget in self.mainWidget.widgets:
-      self.setAllChildren(EVT_KEY_UP, widget, self.keyTrap)
-      self.setAllChildren(EVT_PAINT, widget, self.paintTrap)
+      widget.SetCursor (wxNullCursor)
+      self.setAllChildren(EVT_KEY_UP, widget, self.instance.keyTrap)
       self.setAllChildren(EVT_SET_FOCUS, widget, self.focusGainedTrap)
       self.setAllChildren(EVT_KILL_FOCUS, widget, self.focusLostTrap)
       self.setAllChildren(EVT_LEFT_UP, widget, self.instance.OnLeftUp)
       self.setAllChildren(EVT_LEFT_DOWN, widget, self.instance.OnLeftDown)
       self.setAllChildren(EVT_RIGHT_UP, widget, self.OnRightUp)
       self.setAllChildren(EVT_MOTION, widget, self.instance.OnMotion)
-    self.widget.Refresh()
 
+    self.setAllChildren(EVT_KEY_UP, self.highlightBox, self.instance.keyTrap)
+    self.setAllChildren(EVT_SET_FOCUS, self.highlightBox, self.focusGainedTrap)
+    self.setAllChildren(EVT_KILL_FOCUS, self.highlightBox, self.focusLostTrap)
+    self.setAllChildren(EVT_LEFT_UP, self.highlightBox, self.instance.OnLeftUp)
+    self.setAllChildren(EVT_LEFT_DOWN, self.highlightBox, 
self.instance.OnLeftDown)
+    self.setAllChildren(EVT_RIGHT_UP, self.highlightBox, self.OnRightUp)
+    self.setAllChildren(EVT_MOTION, self.highlightBox, self.instance.OnMotion)
+
+    self.widget.Refresh()    
+
+  def recalcBoundaries(self): 
+    x1,y1,x2,y2 = (9999999,9999999,0,0)
+   
+    for widget in self.mainWidget.widgets:
+      tx, ty = widget.GetPositionTuple()
+      tw, th = widget.GetSizeTuple()
+      self.instance.positionMappings[widget] = [tx,ty,tx+tw-1,ty+tw-1,self]
+      print "%s (%s,%s) (%s,%s)" % 
(self.object.getObjectType(),tx,ty,tx+tw-1,ty+tw-1) 
+      if tx < x1: 
+        x1 = tx
+      if ty < y1: 
+        y1 = ty
+      if tw + tx > x2: 
+        x2 = tw + tx
+      if th + ty > y2: 
+        y2 = th + ty
+
+
+    self.highlightBox.SetPosition(wxPoint(x1-2,y1-2))
+#    self.highlightBox.SetClientSize(wxSize(1,1))
+    self.highlightBox.SetClientSize(wxSize(x2-x1+6,y2-y1+6))
+#    self.instance.panel.Refresh()
+    for widget in self.mainWidget.widgets: 
+       widget.Refresh()
+
+  def setSelected(self, selected): 
+    self.highlightBox.setSelected(selected)
+
+
   def setAllChildren(self, event, widget, trap):
 #    print "Setting event on %s (%s)" % (widget,self.mainWidget.widgets)
     event(widget, trap) 
@@ -184,16 +285,6 @@
     self.hasFocus = 0
     self.widget.Refresh()
 
-  def paintTrap(self, event): 
-    print "PaintTrap"
-    dc = wxPaintDC(self.instance.panel)
-    x,y = self.widget.GetPositionTuple()
-    h,w = self.widget.GetSizeTuple()
-    dc.SetPen(wxPen(wxBLUE))
-    dc.DrawRectangle(x-1,y-1,h+2,w+2)
-    event.Skip()
-
-
   def OnLeftDown(self, event): 
 #    self.curLine = [] 
 #    self.x, self.y = event.GetPositionTuple() 
@@ -224,112 +315,119 @@
 #      coords = (self.x, self.y) + pos 
       
 #      self.curLine.append(coords) 
-      dc.DrawLine(self.x, self.y, pos[0], pos[1]) 
+#      dc.DrawLine(self.x, self.y, pos[0], pos[1]) 
       self.x, self.y = pos 
 #      dc.EndDrawing() 
  
 
-  def keyTrap(self, event): 
-    if event.KeyCode() in (WXK_LEFT, WXK_RIGHT, WXK_UP, WXK_DOWN): 
-      if event.AltDown() or event.MetaDown():
-        if event.KeyCode() == WXK_LEFT and \
-           hasattr(self.object, 'width'):
-          self.object.width = self.object.width - 1 
-          for widget in self.mainWidget.widgets: 
-            w,h = widget.GetSizeTuple()
-            widget.SetSize(wxSize(w-self.instance.gridWidth,h))
-        if event.KeyCode() == WXK_RIGHT and \
-           hasattr(self.object, 'width'):
-          self.object.width = self.object.width + 1 
-          for widget in self.mainWidget.widgets: 
-            w,h = widget.GetSizeTuple()
-            widget.SetSize(wxSize(w+self.instance.gridWidth,h))
-        if event.KeyCode() == WXK_UP and \
-           hasattr(self.object, 'height') and \
-           self.object.height > 1: 
-          self.object.height = self.object.height - 1 
-          for widget in self.mainWidget.widgets: 
-            w,h = widget.GetSizeTuple()
-            widget.SetSize(wxSize(w,h-self.instance.gridHeight))
-        if event.KeyCode() == WXK_DOWN and \
-           hasattr(self.object, 'height'):
-          self.object.height = self.object.height + 1 
-          for widget in self.mainWidget.widgets: 
-            w,h = widget.GetSizeTuple()
-            widget.SetSize(wxSize(w,h+self.instance.gridHeight))
-      else: 
-        if event.KeyCode() == WXK_LEFT and \
-           self.object.x > 0: 
-          self.object.x = self.object.x - 1 
-          for widget in self.mainWidget.widgets: 
-            x,y = widget.GetPositionTuple()
-            widget.SetPosition(wxPoint(x-self.instance.gridWidth,y))
-        if event.KeyCode() == WXK_RIGHT:
-          self.object.x = self.object.x + 1 
-          for widget in self.mainWidget.widgets: 
-            x,y = widget.GetPositionTuple()
-            widget.SetPosition(wxPoint(x+self.instance.gridWidth,y))
-        if event.KeyCode() == WXK_UP and \
-           self.object.x > 0: 
-          self.object.y = self.object.y - 1 
-          for widget in self.mainWidget.widgets: 
-            x,y = widget.GetPositionTuple()
-            widget.SetPosition(wxPoint(x,y-self.instance.gridHeight))
-        if event.KeyCode() == WXK_DOWN:
-          self.object.y = self.object.y + 1 
-          for widget in self.mainWidget.widgets: 
-            x,y = widget.GetPositionTuple()
-            widget.SetPosition(wxPoint(x,y+self.instance.gridHeight))
+  def relativeResize(self, dx, dy): 
+    if dx == -1 and \
+       hasattr(self.object, 'width'):
+      self.object.width = self.object.width - 1 
+      for widget in self.mainWidget.widgets: 
+        w,h = widget.GetSizeTuple()
+        widget.SetSize(wxSize(w-self.instance.gridWidth,h))
+    if dx == 1 and \
+       hasattr(self.object, 'width'):
+      self.object.width = self.object.width + 1 
+      for widget in self.mainWidget.widgets: 
+        w,h = widget.GetSizeTuple()
+        widget.SetSize(wxSize(w+self.instance.gridWidth,h))
+    if dy == -1 and \
+       hasattr(self.object, 'height') and \
+       self.object.height > 1: 
+      self.object.height = self.object.height - 1 
+      for widget in self.mainWidget.widgets: 
+        w,h = widget.GetSizeTuple()
+        widget.SetSize(wxSize(w,h-self.instance.gridHeight))
+    if dy == 1 and \
+       hasattr(self.object, 'height'):
+      self.object.height = self.object.height + 1 
+      for widget in self.mainWidget.widgets: 
+        w,h = widget.GetSizeTuple()
+        widget.SetSize(wxSize(w,h+self.instance.gridHeight))
+    self.recalcBoundaries()
+
+
+  def relativeMove(self, dx, dy): 
+    print "Moving %s (%s,%s)" % (self.object.getObjectType(), dx,dy)
+    if dx == -1 and \
+       self.object.x > 0: 
+      self.object.x = self.object.x - 1 
+      for widget in self.mainWidget.widgets: 
+        x,y = widget.GetPositionTuple()
+        widget.SetPosition(wxPoint(x-self.instance.gridWidth,y))
+    if dx == 1:
+      self.object.x = self.object.x + 1 
+      for widget in self.mainWidget.widgets: 
+        x,y = widget.GetPositionTuple()
+        widget.SetPosition(wxPoint(x+self.instance.gridWidth,y))
+    if dy == -1 and \
+       self.object.y > 0: 
+      self.object.y = self.object.y - 1 
+      print self.object.y
+      print self.mainWidget.widgets
+      for widget in self.mainWidget.widgets: 
+        x,y = widget.GetPositionTuple()
+        widget.SetPosition(wxPoint(x,y-self.instance.gridHeight))
+    if dy == 1:
+      self.object.y = self.object.y + 1 
+      for widget in self.mainWidget.widgets: 
+        x,y = widget.GetPositionTuple()
+        widget.SetPosition(wxPoint(x,y+self.instance.gridHeight))
+    self.recalcBoundaries()
 
-        
+
 #
 #
 #
-class WidgetContainer(wxPanel): 
-  def __init__(self, instance, parent): 
-    wxPanel.__init__(self,parent, -1)
-    self.__instance = instance 
-    self.__hasFocus = 1
-
-  def set(self, object):  
-    self.__object = object
-    w,h = self.__object.widgets[0].GetSizeTuple()
-    x,y = self.__object.widgets[0].GetPositionTuple() 
-    self.SetSize(wxSize(w+8, h+8))
-    self.SetPosition(wxPoint(x-3, y-3))
-
-    EVT_SIZE(object.widgets[0], self.resize)
-#    EVT_PAINT(self, self.OnPaint)
-
-  def gainFocus(self, event):
-    self.__hasFocus = 1
-
-  def loseFocus(self, event):
-    self.__hasFocus = 0 
-
-  def resize(self, event): 
-    w,h = self.__object.widget[0].GetSizeTuple()
-    self.SetSize(wxSize(w+8, h+8))
+class WidgetHighlighter(wxWindow): 
+
+  def __init__(self, parent): 
+    wxWindow.__init__(self, parent, -1)
+    self.selected = 0
+    self.parent = parent
+#    self.SetBackgroundMode(wxTRANSPARENT)
+    EVT_PAINT(self, self.OnPaint)
+    EVT_SIZE(self, self.reconfigure)
+    EVT_MOVE(self, self.reconfigure)
+    panelColor = parent.GetBackgroundColour()
+    self.inactiveBorderColor = wxColour(panelColor.Red()-16,
+                 panelColor.Green()-16,    
+                 panelColor.Blue()-16)
+    self.activeBorderColor = wxBLUE
+
+  def setSelected (self, selected): 
+    if self.selected != selected: 
+      self.selected = selected
+      self.Refresh()
+
+  def reconfigure(self, event):
+    self.Refresh()
 
   def OnPaint(self, event): 
     dc = wxPaintDC(self)
-    w, h = self.GetSizeTuple()
-    dc.SetPen(wxPen(wxBLUE))
-    dc.DrawRect(0,0,1,1)
-    dc.DrawRect(w-2,0,w-1,1)
-    dc.DrawRect(0,h-2,1,h-1)
-    dc.DrawRect(w-2,h-2,w-1,h-1)
-    dc.SetBrush(wxBrush(self.__instance.panelColor))
-    dc.DrawRect(2,2,w-3,h-3) 
-    event.Skip()
-
+    dc.BeginDrawing()
+    dc.SetBackgroundMode(wxTRANSPARENT)
+    dc.SetBrush (wxTRANSPARENT_BRUSH)
+    dc.SetBackground(wxBrush(self.parent.GetBackgroundColour(),wxTRANSPARENT))
+    dc.Clear()
+    if self.selected: 
+      dc.SetPen(wxPen(self.activeBorderColor))
+    else: 
+      dc.SetPen(wxPen(self.inactiveBorderColor))    
+    x1,y1 = self.GetSizeTuple()
+    dc.SetBrush(wxTRANSPARENT_BRUSH)
+    dc.DrawRectangle(0,0,x1,y1)
+    dc.EndDrawing()
+        
 
 #
 #
 #
-class GridPane(wxPanel): 
+class GridPane(wxSashWindow): 
   def __init__(self, instance, parent, pos): 
-    wxPanel.__init__(self, parent, -1, pos=pos, 
style=wxWANTS_CHARS|wxSUNKEN_BORDER) 
+    wxSashWindow.__init__(self, parent, -1, pos=pos, 
style=wxWANTS_CHARS|wxSIMPLE_BORDER) 
     self.__showGrids = 1
     self.__instance = instance
     EVT_PAINT(self, self.OnPaint)
@@ -337,6 +435,7 @@
   def OnPaint(self, event): 
     if self.__showGrids: 
       dc = wxPaintDC(self)  
+      dc.BeginDrawing()
       w, h = self.GetSizeTuple()
       dc.SetPen(wxPen(self.__instance.panelGridColor)) 
       for x in range(self.__instance.widgetWidth,w-2, 
self.__instance.widgetWidth): 
@@ -344,5 +443,6 @@
     
       for y in 
range(self.__instance.widgetHeight,h-2,self.__instance.widgetHeight): 
         dc.DrawLine(0,y,w-1,y)
+      dc.EndDrawing()
     event.Skip()
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]