Ignore:
Timestamp:
11/21/12 19:37:17 (17 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Changed annotation item selection and (control point) geometry editing.

Control point editing is now fixed to the items focus state.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeCanvas/document/interactions.py

    r11185 r11192  
    719719        if self.control is not None: 
    720720            self.scene.removeItem(self.control) 
     721 
    721722        self.control = None 
    722723        self.down_pos = None 
     
    734735        self.control = None 
    735736        self.savedFramePen = None 
     737        self.savedRect = None 
    736738 
    737739    def mousePressEvent(self, event): 
     
    741743            if item is not None and not item.hasFocus(): 
    742744                self.editItem(item) 
    743                 return True 
     745                return False 
    744746 
    745747        return UserInteraction.mousePressEvent(self, event) 
     
    752754 
    753755        self.savedFramePen = item.framePen() 
    754         self.initialRect = rect 
    755  
    756         control.setFocus() 
    757         control.editingFinished.connect(self.__on_editingFinished) 
     756        self.savedRect = rect 
     757 
    758758        control.rectEdited.connect(item.setGeometry) 
     759        control.setFocusProxy(item) 
    759760 
    760761        item.setFramePen(QPen(Qt.DashDotLine)) 
     762        item.geometryChanged.connect(self.__on_textGeometryChanged) 
    761763 
    762764        self.item = item 
     
    765767        self.control = control 
    766768 
     769    def commit(self): 
     770        """Commit the current item geometry state to the document. 
     771        """ 
     772        rect = self.item.geometry() 
     773        if self.savedRect != rect: 
     774            command = commands.SetAttrCommand( 
     775                self.annotation, "rect", 
     776                (rect.x(), rect.y(), rect.width(), rect.height()), 
     777                name="Edit text geometry" 
     778            ) 
     779            self.document.undoStack().push(command) 
     780            self.savedRect = rect 
     781 
    767782    def __on_editingFinished(self): 
    768         rect = self.item.geometry() 
    769         command = commands.SetAttrCommand( 
    770             self.annotation, "rect", 
    771             (rect.x(), rect.y(), rect.width(), rect.height()), 
    772             name="Edit text geometry" 
    773         ) 
    774         self.document.undoStack().push(command) 
     783        self.commit() 
    775784        self.end() 
    776785 
     
    778787        self.item.setGeometry(rect) 
    779788 
     789    def __on_textGeometryChanged(self): 
     790        if not self.control.isControlActive(): 
     791            rect = self.item.geometry() 
     792            self.control.setRect(rect) 
     793 
    780794    def cancel(self): 
    781         if self.item is not None: 
    782             self.item.setGeometry(self.initialRect) 
     795        if self.item is not None and self.savedRect is not None: 
     796            self.item.setGeometry(self.savedRect) 
    783797 
    784798        UserInteraction.cancel(self) 
     
    786800    def end(self): 
    787801        if self.control is not None: 
    788             self.control.clearFocus() 
    789802            self.scene.removeItem(self.control) 
    790803 
     
    805818        self.annotation = None 
    806819        self.control = None 
     820        self.savedLine = None 
    807821 
    808822    def mousePressEvent(self, event): 
     
    812826            if item is not None and not item.hasFocus(): 
    813827                self.editItem(item) 
    814                 return True 
     828                return False 
    815829 
    816830        return UserInteraction.mousePressEvent(self, event) 
     
    822836 
    823837        line = item.line() 
    824         self.initialLine = line 
     838        self.savedLine = line 
    825839 
    826840        p1, p2 = map(item.mapToScene, (line.p1(), line.p2())) 
    827841 
    828842        control.setLine(QLineF(p1, p2)) 
    829         control.setFocus() 
    830         control.editingFinished.connect(self.__on_editingFinished) 
     843        control.setFocusProxy(item) 
    831844        control.lineEdited.connect(self.__on_lineEdited) 
     845 
     846        item.geometryChanged.connect(self.__on_lineGeometryChanged) 
    832847 
    833848        self.item = item 
     
    835850        self.control = control 
    836851 
    837     def __on_editingFinished(self): 
     852    def commit(self): 
     853        """Commit the current geometry of the item to the document. 
     854 
     855        .. note:: Does nothing if the actual geometry is not changed. 
     856 
     857        """ 
    838858        line = self.control.line() 
    839859        p1, p2 = line.p1(), line.p2() 
    840860 
    841         command = commands.SetAttrCommand( 
    842             self.annotation, 
    843             "geometry", 
    844             ((p1.x(), p1.y()), (p2.x(), p2.y())), 
    845             name="Edit arrow geometry", 
    846         ) 
    847         self.document.undoStack().push(command) 
    848         self.control.hide() 
    849  
     861        if self.item.line() != self.savedLine: 
     862            command = commands.SetAttrCommand( 
     863                self.annotation, 
     864                "geometry", 
     865                ((p1.x(), p1.y()), (p2.x(), p2.y())), 
     866                name="Edit arrow geometry", 
     867            ) 
     868            self.document.undoStack().push(command) 
     869            self.savedLine = self.item.line() 
     870 
     871    def __on_editingFinished(self): 
     872        self.commit() 
    850873        self.end() 
    851874 
     
    855878        self.item.adjustGeometry() 
    856879 
     880    def __on_lineGeometryChanged(self): 
     881        # Possible geometry change from out of our control, for instance 
     882        # item move as a part of a selection group. 
     883        if not self.control.isControlActive(): 
     884            line = self.item.line() 
     885            p1, p2 = map(self.item.mapToScene, (line.p1(), line.p2())) 
     886            self.control.setLine(QLineF(p1, p2)) 
     887 
    857888    def cancel(self): 
    858         if self.item is not None: 
    859             self.item.setLine(self.initialLine) 
     889        if self.item is not None and self.savedLine is not None: 
     890            self.item.setLine(self.savedLine) 
    860891 
    861892        UserInteraction.cancel(self) 
     
    865896            self.scene.removeItem(self.control) 
    866897 
     898        if self.item is not None: 
     899            self.item.geometryChanged.disconnect(self.__on_lineGeometryChanged) 
     900 
    867901        self.control = None 
    868902        self.item = None 
Note: See TracChangeset for help on using the changeset viewer.