[Top][All Lists]
[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.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [gnue] r8379 - in trunk/gnue-designer/src: forms forms/PagePainter/skins ui/wx/uihelpers/doccanvas,
jcater <=