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/schemeedit.py

    r11165 r11192  
    3737 
    3838    def sceneEventFilter(self, obj, event): 
     39        print obj, event, event.type() 
    3940        if event.type() == QEvent.FocusIn and \ 
    4041                obj.flags() & QGraphicsItem.ItemIsFocusable: 
     
    197198 
    198199            self.__scene.set_registry(self.__registry) 
    199             self.__scene.set_scheme(scheme) 
    200  
    201             self.__scene.selectionChanged.connect( 
    202                 self.__onSelectionChanged 
    203             ) 
    204  
    205             self.__scene.node_item_activated.connect( 
    206                 self.__onNodeActivate 
    207             ) 
    208  
    209             self.__scene.annotation_added.connect( 
    210                 self.__onAnnotationAdded 
    211             ) 
    212  
    213             self.__scene.annotation_removed.connect( 
    214                 self.__onAnnotationRemoved 
    215             ) 
    216  
     200 
     201            # Focus listener 
    217202            self.__focusListener = GraphicsSceneFocusEventListener() 
    218203            self.__focusListener.itemFocusedIn.connect( 
     
    223208            ) 
    224209            self.__scene.addItem(self.__focusListener) 
     210 
     211            self.__scene.selectionChanged.connect( 
     212                self.__onSelectionChanged 
     213            ) 
     214 
     215            self.__scene.node_item_activated.connect( 
     216                self.__onNodeActivate 
     217            ) 
     218 
     219            self.__scene.annotation_added.connect( 
     220                self.__onAnnotationAdded 
     221            ) 
     222 
     223            self.__scene.annotation_removed.connect( 
     224                self.__onAnnotationRemoved 
     225            ) 
     226 
     227            self.__scene.set_scheme(scheme) 
    225228 
    226229    def scheme(self): 
     
    439442            return handler.mousePressEvent(event) 
    440443 
    441         annotation_item = scene.item_at(pos, (items.TextAnnotation, 
    442                                               items.ArrowAnnotation)) 
    443  
    444         if annotation_item and event.button() == Qt.LeftButton and \ 
    445                 not event.modifiers() & Qt.ControlModifier: 
    446             if isinstance(annotation_item, items.TextAnnotation): 
    447                 handler = interactions.ResizeTextAnnotation(self) 
    448             elif isinstance(annotation_item, items.ArrowAnnotation): 
    449                 handler = interactions.ResizeArrowAnnotation(self) 
    450             else: 
    451                 log.error("Unknown annotation item (%r).", annotation_item) 
    452                 return False 
    453  
    454             scene.clearSelection() 
    455  
    456             scene.set_user_interaction_handler(handler) 
    457             return handler.mousePressEvent(event) 
    458  
    459444        any_item = scene.item_at(pos) 
    460445        if not any_item and event.button() == Qt.LeftButton: 
     
    603588 
    604589    def __onAnnotationAdded(self, item): 
     590        log.debug("Annotation added (%r)", item) 
    605591        item.setFlag(QGraphicsItem.ItemIsSelectable) 
     592        item.setFlag(QGraphicsItem.ItemIsMovable) 
     593        item.setFlag(QGraphicsItem.ItemIsFocusable) 
     594 
     595        item.installSceneEventFilter(self.__focusListener) 
     596 
    606597        if isinstance(item, items.ArrowAnnotation): 
    607598            pass 
    608599        elif isinstance(item, items.TextAnnotation): 
     600            # Make the annotation editable. 
     601            item.setTextInteractionFlags(Qt.TextEditorInteraction) 
     602 
    609603            self.__editFinishedMapper.setMapping(item, item) 
    610604            item.editingFinished.connect( 
    611605                self.__editFinishedMapper.map 
    612606            ) 
     607 
    613608        self.__annotationGeomChanged.setMapping(item, item) 
    614609        item.geometryChanged.connect( 
     
    617612 
    618613    def __onAnnotationRemoved(self, item): 
     614        log.debug("Annotation removed (%r)", item) 
    619615        if isinstance(item, items.ArrowAnnotation): 
    620616            pass 
     
    623619                self.__editFinishedMapper.map 
    624620            ) 
     621 
     622        item.removeSceneEventFilter(self.__focusListener) 
     623 
    625624        self.__annotationGeomChanged.removeMappings(item) 
    626625        item.geometryChanged.disconnect( 
     
    629628 
    630629    def __onItemFocusedIn(self, item): 
    631         pass 
     630        """Annotation item has gained focus. 
     631        """ 
     632        if not self.__scene.user_interaction_handler: 
     633            self.__startControlPointEdit(item) 
    632634 
    633635    def __onItemFocusedOut(self, item): 
    634         pass 
     636        """Annotation item lost focus. 
     637        """ 
     638        self.__endControlPointEdit() 
    635639 
    636640    def __onEditingFinished(self, item): 
     641        """Text annotation editing has finished. 
     642        """ 
    637643        annot = self.__scene.annotation_for_item(item) 
    638644        text = unicode(item.toPlainText()) 
     
    661667 
    662668    def __toogleLinkEnabled(self, enabled): 
     669        """Link enabled state was toogled in the context menu. 
     670        """ 
    663671        if self.__contextMenuTarget: 
    664672            link = self.__contextMenuTarget 
     
    669677 
    670678    def __linkRemove(self): 
     679        """Remove link was requested from the context menu. 
     680        """ 
    671681        if self.__contextMenuTarget: 
    672682            self.removeLink(self.__contextMenuTarget) 
    673683 
    674684    def __linkReset(self): 
     685        """Link reset from the context menu was requested. 
     686        """ 
    675687        if self.__contextMenuTarget: 
    676688            link = self.__contextMenuTarget 
     
    679691            ) 
    680692            action.edit_links() 
     693 
     694    def __startControlPointEdit(self, item): 
     695        """Start a control point edit interaction for item. 
     696        """ 
     697        if isinstance(item, items.ArrowAnnotation): 
     698            handler = interactions.ResizeArrowAnnotation(self) 
     699        elif isinstance(item, items.TextAnnotation): 
     700            handler = interactions.ResizeTextAnnotation(self) 
     701        else: 
     702            log.warning("Unknown annotation item type %r" % item) 
     703            return 
     704 
     705        handler.editItem(item) 
     706        self.__scene.set_user_interaction_handler(handler) 
     707 
     708        log.info("Control point editing started (%r)." % item) 
     709 
     710    def __endControlPointEdit(self): 
     711        """End the current control point edit interaction. 
     712        """ 
     713        handler = self.__scene.user_interaction_handler 
     714        if isinstance(handler, (interactions.ResizeArrowAnnotation, 
     715                                interactions.ResizeTextAnnotation)): 
     716            handler.commit() 
     717            handler.end() 
     718 
     719            log.info("Control point editing finished.") 
    681720 
    682721 
Note: See TracChangeset for help on using the changeset viewer.