Changeset 1334

Show
Ignore:
Timestamp:
06/05/07 23:02:02 (1 year ago)
Author:
arj..@yirdis.nl
Message:
  • Extended ConnectHandleTool to allow to add handles on gaphas.item.Line objects
  • Added painter for line segment split
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • gaphor/trunk/gaphor/ui/diagramtools.py

    r1310 r1334  
    1212 
    1313import gaphas 
    14 from gaphas.geometry import distance_point_point 
     14from gaphas.geometry import distance_point_point, distance_point_point_fast, \ 
     15                            distance_line_point 
     16from gaphas.item import Line 
    1517from gaphas.tool import Tool, HandleTool, ItemTool, ToolChain 
    1618 
     
    2628    Handle Tool (acts on item handles) that uses the IConnect protocol 
    2729    to connect items to one-another. 
     30 
     31    It also adds handles to lines when a line is grabbed on the middle of 
     32    a line segment (points are drawn by the LineSegmentPainter). 
    2833    """ 
    2934 
     
    102107            adapter.disconnect_constraints(handle) 
    103108         
     109    def on_button_press(self, context, event): 
     110        """ 
     111        In addition to the normal behavior, the button press event creates 
     112        new handles if it is activated on the middle of a line segment. 
     113        """ 
     114        if super(ConnectHandleTool, self).on_button_press(context, event): 
     115            return True 
     116 
     117        view = context.view 
     118        item = view.hovered_item 
     119        if item and item is view.focused_item and isinstance(item, Line): 
     120            h = item.handles() 
     121            x, y = context.view.transform_point_c2i(item, event.x, event.y) 
     122            for h1, h2 in zip(h[:-1], h[1:]): 
     123                cx = (h1.x + h2.x) / 2 
     124                cy = (h1.y + h2.y) / 2 
     125                if distance_point_point_fast((x,y), (cx, cy)) <= 4: 
     126                    segment = h.index(h1) 
     127                    item.split_segment(segment) 
     128                    self.grab_handle(item, item.handles()[segment + 1]) 
     129                    context.grab() 
     130                    self._grabbed = True 
     131                    return True 
     132 
     133    def on_button_release(self, context, event): 
     134        grabbed_handle = self._grabbed_handle 
     135        grabbed_item = self._grabbed_item 
     136        if super(ConnectHandleTool, self).on_button_release(context, event): 
     137            if grabbed_handle and grabbed_item: 
     138                h = grabbed_item.handles() 
     139                if h[0] is grabbed_handle or h[-1] is grabbed_handle: 
     140                    return True 
     141                segment = h.index(grabbed_handle) 
     142                before = h[segment - 1] 
     143                after = h[segment + 1] 
     144                d, p = distance_line_point(before.pos, after.pos, grabbed_handle.pos) 
     145                if d < 2: 
     146                    grabbed_item.merge_segment(segment) 
     147            return True 
    104148 
    105149class PopupItemTool(ItemTool): 
     
    291335    chain.append(HoverTool()) 
    292336    chain.append(ConnectHandleTool()) 
    293     chain.append(PopupItemTool()) 
     337    chain.append(ItemTool()) 
    294338    chain.append(TextEditTool()) 
    295339    chain.append(RubberbandTool()) 
  • gaphor/trunk/gaphor/ui/diagramview.py

    r1243 r1334  
    44import gtk 
    55import gaphas 
     6from diagrampainters import DefaultPainter 
     7 
    68 
    79class DiagramView(gaphas.GtkView): 
     
    2325        self.diagram = diagram 
    2426        self.canvas = diagram.canvas 
     27        self.painter = DefaultPainter() 
    2528 
    2629        # Drop