Changeset 11162:cc402e04763c in orange


Ignore:
Timestamp:
10/29/12 15:19:36 (18 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Added annotation geometry edit interactions in SchemeEditWidget.

Location:
Orange/OrangeCanvas/document
Files:
2 edited

Legend:

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

    r11159 r11162  
    1414from .. import scheme 
    1515from ..canvas import items 
     16from ..canvas.items import controlpoints 
     17from . import commands 
    1618 
    1719log = logging.getLogger(__name__) 
     
    575577 
    576578            if self.arrow_item is not None: 
    577                 self.arrow_item.setLine(QLineF(self.down_pos, 
    578                                                event.scenePos())) 
     579                p1, p2 = map(self.arrow_item.mapFromScene, 
     580                             (self.down_pos, event.scenePos())) 
     581                self.arrow_item.setLine(QLineF(p1, p2)) 
     582                self.arrow_item.adjustGeometry() 
     583 
    579584            event.accept() 
    580585            return True 
     
    583588        if event.button() == Qt.LeftButton: 
    584589            if self.arrow_item is not None: 
    585                 line = QLineF(self.down_pos, event.scenePos()) 
     590                p1, p2 = self.down_pos, event.scenePos() 
    586591 
    587592                # Commit the annotation to the scheme 
    588                 self.annotation.set_line(point_to_tuple(line.p1()), 
    589                                          point_to_tuple(line.p2())) 
     593                self.annotation.set_line(point_to_tuple(p1), 
     594                                         point_to_tuple(p2)) 
     595 
    590596                self.document.addAnnotation(self.annotation) 
    591597 
    592                 self.arrow_item.setLine(line) 
     598                p1, p2 = map(self.arrow_item.mapFromScene, (p1, p2)) 
     599                self.arrow_item.setLine(QLineF(p1, p2)) 
    593600                self.arrow_item.adjustGeometry() 
    594601 
     
    614621        self.annotation_item = None 
    615622        self.annotation = None 
     623        self.control = None 
    616624 
    617625    def start(self): 
     
    634642                item = self.scene.add_annotation(annot) 
    635643                item.setTextInteractionFlags(Qt.TextEditorInteraction) 
     644                item.setFramePen(QPen(Qt.DashLine)) 
    636645 
    637646                self.annotation_item = item 
    638647                self.annotation = annot 
     648                self.control = controlpoints.ControlPointRect() 
     649                self.control.rectChanged.connect( 
     650                    self.annotation_item.setGeometry 
     651                ) 
     652                self.scene.addItem(self.control) 
    639653 
    640654            if self.annotation_item is not None: 
    641655                rect = QRectF(self.down_pos, event.scenePos()).normalized() 
    642                 self.annotation_item.setGeometry(rect) 
     656                self.control.setRect(rect) 
     657 
    643658            return True 
    644659 
     
    654669                self.annotation_item.setGeometry(rect) 
    655670 
     671                self.control.rectChanged.disconnect( 
     672                    self.annotation_item.setGeometry 
     673                ) 
     674                self.control.hide() 
     675 
    656676                # Move the focus to the editor. 
     677                self.annotation_item.setFramePen(QPen(Qt.NoPen)) 
    657678                self.annotation_item.setFocus(Qt.OtherFocusReason) 
    658679                self.annotation_item.startEdit() 
     
    661682 
    662683    def end(self): 
     684        if self.control is not None: 
     685            self.scene.removeItem(self.control) 
     686        self.control = None 
    663687        self.down_pos = None 
    664688        self.annotation_item = None 
     
    666690        self.document.view().setCursor(Qt.ArrowCursor) 
    667691        UserInteraction.end(self) 
     692 
     693 
     694class ResizeTextAnnotation(UserInteraction): 
     695    def __init__(self, document, ): 
     696        UserInteraction.__init__(self, document) 
     697        self.item = None 
     698        self.annotation = None 
     699        self.control = None 
     700        self.savedFramePen = None 
     701 
     702    def mousePressEvent(self, event): 
     703        pos = event.scenePos() 
     704        if self.item is None: 
     705            item = self.scene.item_at(pos, items.TextAnnotation) 
     706            if item is not None and not item.hasFocus(): 
     707                self.editItem(item) 
     708                return True 
     709 
     710        return UserInteraction.mousePressEvent(self, event) 
     711 
     712    def editItem(self, item): 
     713        annotation = self.scene.annotation_for_item(item) 
     714        rect = item.geometry()  # TODO: map to scene if item has a parent. 
     715        control = controlpoints.ControlPointRect(rect=rect) 
     716        self.scene.addItem(control) 
     717 
     718        self.savedFramePen = item.framePen() 
     719        self.initialRect = rect 
     720 
     721        control.setFocus() 
     722        control.editingFinished.connect(self.__on_editingFinished) 
     723        control.rectEdited.connect(item.setGeometry) 
     724 
     725        item.setFramePen(QPen(Qt.DashLine)) 
     726 
     727        self.item = item 
     728 
     729        self.annotation = annotation 
     730        self.control = control 
     731 
     732    def __on_editingFinished(self): 
     733        rect = self.item.geometry() 
     734        command = commands.SetAttrCommand( 
     735            self.annotation, "rect", 
     736            (rect.x(), rect.y(), rect.width(), rect.height()), 
     737            name="Edit text geometry" 
     738        ) 
     739        self.document.undoStack().push(command) 
     740        self.end() 
     741 
     742    def __on_rectEdited(self, rect): 
     743        self.item.setGeometry(rect) 
     744 
     745    def cancel(self): 
     746        if self.item is not None: 
     747            self.item.setGeometry(self.initialRect) 
     748 
     749        UserInteraction.cancel(self) 
     750 
     751    def end(self): 
     752        if self.control is not None: 
     753            self.control.clearFocus() 
     754            self.scene.removeItem(self.control) 
     755 
     756        if self.item is not None: 
     757            self.item.setFramePen(self.savedFramePen) 
     758 
     759        self.item = None 
     760        self.annotation = None 
     761        self.control = None 
     762 
     763        UserInteraction.end(self) 
     764 
     765 
     766class ResizeArrowAnnotation(UserInteraction): 
     767    def __init__(self, document): 
     768        UserInteraction.__init__(self, document) 
     769        self.item = None 
     770        self.annotation = None 
     771        self.control = None 
     772 
     773    def mousePressEvent(self, event): 
     774        pos = event.scenePos() 
     775        if self.item is None: 
     776            item = self.scene.item_at(pos, items.ArrowAnnotation) 
     777            if item is not None: 
     778                self.editItem(item) 
     779                return True 
     780 
     781        return UserInteraction.mousePressEvent(self, event) 
     782 
     783    def editItem(self, item): 
     784        annotation = self.scene.annotation_for_item(item) 
     785        control = controlpoints.ControlPointLine() 
     786        self.scene.addItem(control) 
     787 
     788        line = item.line() 
     789        self.initialLine = line 
     790 
     791        p1, p2 = map(item.mapToScene, (line.p1(), line.p2())) 
     792 
     793        control.setLine(QLineF(p1, p2)) 
     794        control.setFocus() 
     795        control.editingFinished.connect(self.__on_editingFinished) 
     796        control.lineEdited.connect(self.__on_lineEdited) 
     797 
     798        self.item = item 
     799        self.annotation = annotation 
     800        self.control = control 
     801 
     802    def __on_editingFinished(self): 
     803        line = self.control.line() 
     804        p1, p2 = line.p1(), line.p2() 
     805 
     806        command = commands.SetAttrCommand( 
     807            self.annotation, 
     808            "geometry", 
     809            ((p1.x(), p1.y()), (p2.x(), p2.y())), 
     810            name="Edit arrow geometry", 
     811        ) 
     812        self.document.undoStack().push(command) 
     813        self.control.hide() 
     814 
     815        self.end() 
     816 
     817    def __on_lineEdited(self, line): 
     818        p1, p2 = map(self.item.mapFromScene, (line.p1(), line.p2())) 
     819        self.item.setLine(QLineF(p1, p2)) 
     820        self.item.adjustGeometry() 
     821 
     822    def cancel(self): 
     823        if self.item is not None: 
     824            self.item.setLine(self.initialLine) 
     825 
     826        UserInteraction.cancel(self) 
     827 
     828    def end(self): 
     829        if self.control is not None: 
     830            self.scene.removeItem(self.control) 
     831 
     832        self.control = None 
     833        self.item = None 
     834        self.annotation = None 
     835 
     836        UserInteraction.end(self) 
  • Orange/OrangeCanvas/document/schemeedit.py

    r11159 r11162  
    422422            return handler.mousePressEvent(event) 
    423423 
    424         annotation_item = scene.item_at(pos, items.TextAnnotation) 
     424        annotation_item = scene.item_at(pos, (items.TextAnnotation, 
     425                                              items.ArrowAnnotation)) 
     426 
    425427        if annotation_item and event.button() == Qt.LeftButton and \ 
    426428                not event.modifiers() & Qt.ControlModifier: 
    427             # TODO: Start a text rect edit. 
    428             pass 
     429            if isinstance(annotation_item, items.TextAnnotation): 
     430                handler = interactions.ResizeTextAnnotation(self) 
     431            elif isinstance(annotation_item, items.ArrowAnnotation): 
     432                handler = interactions.ResizeArrowAnnotation(self) 
     433            else: 
     434                log.error("Unknown annotation item (%r).", annotation_item) 
     435                return False 
     436 
     437            scene.clearSelection() 
     438 
     439            scene.set_user_interaction_handler(handler) 
     440            return handler.mousePressEvent(event) 
    429441 
    430442        any_item = scene.item_at(pos) 
Note: See TracChangeset for help on using the changeset viewer.