commit-gnue
[Top][All Lists]
Advanced

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

[gnue] r8379 - in trunk/gnue-designer/src: forms forms/PagePainter/skins


From: jcater
Subject: [gnue] r8379 - in trunk/gnue-designer/src: forms forms/PagePainter/skins ui/wx/uihelpers/doccanvas
Date: Wed, 5 Apr 2006 17:04:07 -0500 (CDT)

Author: jcater
Date: 2006-04-05 17:04:07 -0500 (Wed, 05 Apr 2006)
New Revision: 8379

Modified:
   trunk/gnue-designer/src/forms/Document.py
   trunk/gnue-designer/src/forms/PagePainter/skins/default.py
   trunk/gnue-designer/src/ui/wx/uihelpers/doccanvas/canvas.py
   trunk/gnue-designer/src/ui/wx/uihelpers/doccanvas/widget.py
Log:
moving a box that overlaps other objects causes those other objects to move 
with it

Modified: trunk/gnue-designer/src/forms/Document.py
===================================================================
--- trunk/gnue-designer/src/forms/Document.py   2006-04-05 22:02:56 UTC (rev 
8378)
+++ trunk/gnue-designer/src/forms/Document.py   2006-04-05 22:04:07 UTC (rev 
8379)
@@ -313,6 +313,18 @@
 
 
     # =========================================================================
+    # Public methods specific to a Forms document
+    # =========================================================================
+    def find_glabels_for(self, name): 
+        labels = self.rootObject.findChildrenOfType('GFLabel')
+        results = []
+        append = results.append
+        for label in labels: 
+           if hasattr(label,'for') and label['for'] == name: 
+               append(label)
+        return results
+           
+    # =========================================================================
     # Private methods
     # =========================================================================
 
@@ -320,6 +332,7 @@
     # Object tracking
     # -------------------------------------------------------------------------
     def inventoryObject(self, object):
+        # TODO: wash me
         if object._type == 'GFForm':
             object._blockMap = {}
         elif object._type == 'GFLogic':
@@ -330,7 +343,7 @@
             object._xmlchildnamespaces = {'Char':'GNUe:Layout:Char'}
         elif object._type == 'GFBlock':
             if self.rootObject._blockMap.has_key(object.name):
-                raise "Warning: Multiple blocks with name %s" % 
str(object.name)
+                raise "Warning: Multiple blocks with name %s" % 
o(str(object.name))
             self.rootObject._blockMap[object.name] = object
             object._fieldMap = {}
         elif object._type == 'GFField':

Modified: trunk/gnue-designer/src/forms/PagePainter/skins/default.py
===================================================================
--- trunk/gnue-designer/src/forms/PagePainter/skins/default.py  2006-04-05 
22:02:56 UTC (rev 8378)
+++ trunk/gnue-designer/src/forms/PagePainter/skins/default.py  2006-04-05 
22:04:07 UTC (rev 8379)
@@ -232,6 +232,21 @@
         x, y, width, height = self.draw_area.Get()
         target_dc.DrawRectangle(x, y, width, height - 1)
 
+    def get_movable_children(self): 
+        """
+        return a list of widgets that "move" with you when selected. 
+        This is NOT children of container widgets. Those are returned
+        from get_movable_children(). 
+        """
+        gobject = self.gobject
+        myname = gobject.name
+        page = gobject.findParentOfType('GFPage')
+        labels = gobject.findChildrenOfType('GFLabel')
+        for label in labels:
+            label_for = self.canvas.document.find_gflabel_for(nyname)
+            if label_for: 
+                pass
+        return labels
 
 # --------------------------------------------------------------------------
 # Button
@@ -252,6 +267,7 @@
                     x + width // 2 - text_width // 2,
                     y + height // 2 - text_height // 2 - 2)
 
+
     def enter_edit_mode(self):
         """
         Called when the user double-clicks to edit
@@ -263,6 +279,7 @@
                        common.char_y_scale,
                        self.gobject['label'])
 
+
     def end_text_edit(self, text):
         """
         Called when the text edit request is finished
@@ -326,6 +343,22 @@
         self.gobject['label'] = text
 
 
+    def get_movable_siblings(self): 
+        """
+        return a list of widgets that "move" with you when selected. 
+        This is NOT children of container widgets. Those are returned
+        from get_movable_children(). 
+        """
+        results = []
+        append = results.append
+        for widget in self.canvas.ordered_widget_list: 
+            if widget != self and \
+               wx.IntersectRect(widget.hit_test_area, 
+               self.hit_test_area) == widget.hit_test_area: 
+                append (widget)
+        return results
+
+
 # --------------------------------------------------------------------------
 # Unknown/unimplemented widgets
 # --------------------------------------------------------------------------

Modified: trunk/gnue-designer/src/ui/wx/uihelpers/doccanvas/canvas.py
===================================================================
--- trunk/gnue-designer/src/ui/wx/uihelpers/doccanvas/canvas.py 2006-04-05 
22:02:56 UTC (rev 8378)
+++ trunk/gnue-designer/src/ui/wx/uihelpers/doccanvas/canvas.py 2006-04-05 
22:04:07 UTC (rev 8379)
@@ -69,6 +69,7 @@
         initialize(panel_color = self.GetBackgroundColour())
 
         self.ordered_widget_list = []
+        self.gobject_map = {}
 
         self.Bind(wx.EVT_PAINT, self.__wx_on_paint)
         self.Bind(wx.EVT_ERASE_BACKGROUND, self.__wx_on_erase_background)
@@ -710,15 +711,48 @@
 
         self.CaptureMouse()
 
-        self.__mouse_move_items = widgets = self.get_selected_widgets()
+                
+        # These will visually move, but not necessarily have their x,y changed.
+        self.__mouse_move_all = all_widgets = []
 
+        # These will move and have their x,y changed in the end
+        self.__mouse_move_items = movable_widgets = []
+
+        # Start out with the selected widgets
+        self.__mouse_move_selected = selected_widgets = 
self.get_selected_widgets()
+        unvisited_widgets = selected_widgets[:]
+
+        # And recursively add any siblings or children        
+        # (TODO: it's not recursive yet)
         area = wx.Rect()
-        for widget in widgets:
+        while unvisited_widgets: 
+            widget = unvisited_widgets.pop()
+            all_widgets.append(widget)
+            movable_widgets.append(widget)
+            
+            # Process child widgets
+            for child_widget in widget.get_movable_children(): 
+                if child_widget not in all_widgets: 
+                    all_widgets.append(child_widget)
+            
+
+            # Process movable widgets
+            for child_widget in widget.get_movable_siblings(): 
+                if child_widget not in all_widgets: 
+                    all_widgets.append(child_widget)
+                    movable_widgets.append(child_widget)
+                
+
+        # Unselect any selected ones
+        for widget in selected_widgets:
             widget.selected = False
+            
+        # And hide all of them
+        for widget in all_widgets: 
             widget.visible = False
             area = area.Union(widget.refresh_area)
-
-
+            
+            
         # Create a bitmap of our widgets in an offscreen buffer
         # so we can redraw them as the mouse moves
 
@@ -729,15 +763,15 @@
 
         memory_dc = wx.MemoryDC()
         offscreen_buffer = wx.EmptyBitmap(buff_width, buff_height)
-        maskColor = wx.WHITE
+        mask_color = wx.WHITE
 
         memory_dc.SelectObject(offscreen_buffer)
         memory_dc.SetDeviceOrigin(-buff_x, -buff_y)
 
-        memory_dc.SetBackground(wx.Brush(maskColor))
+        memory_dc.SetBackground(wx.Brush(mask_color))
         memory_dc.Clear()
 
-        for widget in widgets:
+        for widget in all_widgets:
             (obj_x, obj_y,
              obj_width, obj_height) = widget.refresh_area.Get()
 
@@ -763,6 +797,7 @@
 
         self.end_refresh_batch()
 
+
     def __update_moving(self, x, y):
         """
         Update the "moving" feedback by deleting the old and
@@ -789,15 +824,22 @@
         self.__mouse_move_buffer = None
         self.__mouse_move_area = None
 
-        for widget in self.__mouse_move_items:
+        for widget in self.__mouse_move_selected:
             widget.selected = True
+            
+        for widget in self.__mouse_move_all: 
             widget.show()
+            
+        for widget in self.__mouse_move_items: 
             if x != self.__mouse_move_start_x or \
                y != self.__mouse_move_start_y:
                 widget.move_from_canvas(x - self.__mouse_move_start_x,
                                         y - self.__mouse_move_start_y)
 
         self.__mouse_move_items = None
+        self.__mouse_move_all = None
+        self.__mouse_move_selected = None
+        
         self.refresh_selection()
         self.refresh_scrolled_area(old_area)
 
@@ -1047,6 +1089,7 @@
         Add a DocumentWidget to the canvas
         """
         self.ordered_widget_list.insert(0,widget)
+        self.gobject_map[widget.gobject] = widget
         widget.force_canvas_refresh()
 
 
@@ -1055,6 +1098,8 @@
         Remove a DocumentWidget from the canvas
         """
         self.ordered_widget_list.remove(widget)
+        del self.gobject_map[widget.gobject]
+        
         area = widget.refresh_area
         self.refresh_scrolled_area(refresh_area)
         widget.Destroy()

Modified: trunk/gnue-designer/src/ui/wx/uihelpers/doccanvas/widget.py
===================================================================
--- trunk/gnue-designer/src/ui/wx/uihelpers/doccanvas/widget.py 2006-04-05 
22:02:56 UTC (rev 8378)
+++ trunk/gnue-designer/src/ui/wx/uihelpers/doccanvas/widget.py 2006-04-05 
22:04:07 UTC (rev 8379)
@@ -42,6 +42,12 @@
 # A Drawable canvas widget
 # ===================================================================
 class DocumentWidget:
+ 
+    # Should this widget behave as a "container"?
+    # Containers can be a target for move operations
+    # and their children move on screen with them. 
+    container = False
+    
     def __init__(self, gobject, canvas):
 
         self.gobject = gobject
@@ -61,7 +67,6 @@
         self.recalc_metrics()
 
 
-
     def show(self, show=True):
         # Make sure show is a Boolean
         show = bool(show)
@@ -288,8 +293,40 @@
         Coordinates are relative from widget's (0,0)
         """
         assert(False)
+        
+        
+    def get_movable_siblings(self): 
+        """
+        return a list of widgets that "move" with you when selected. 
+        This is NOT children of container widgets. Those are returned
+        from get_movable_children(). 
+        """
+        return []
 
+    def get_movable_children(self): 
+        """
+        return a list of widgets that are your children and are movable. 
+        The difference between get_movable_siblings and get_movable_children 
+        is that, after a move, the latter do not havetheir x,y coordinates 
+        changed. 
+        """
+        
+        # Get a list of all the children
+        all_children = []
+        self.gobject.walk(all_children.append)
+        
+        # Now, find any canvas widgets coorresponding to them
+        widgets = []
+        for object in all_children[1:]:  #[0] is us
+            try: 
+                widgets += [self.canvas.gobject_map[object]]
+            except KeyError: 
+                pass
+            
+        # all_children[0] is ourself, so don't return it
+        return widgets
 
+
     def resize_from_canvas(self, delta_width, delta_height):
         """
         Called when the object is resized via mouse.





reply via email to

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