Ignore:
File:
1 edited

Legend:

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

    r11471 r11492  
    1010import logging 
    1111import itertools 
     12import unicodedata 
    1213 
    1314from operator import attrgetter 
     
    100101    # Quick Menu triggers 
    101102    (NoTriggers, 
    102      Clicked, 
     103     RightClicked, 
    103104     DoubleClicked, 
    104105     SpaceKey, 
     
    344345 
    345346        scene = CanvasScene() 
    346         scene.set_channel_names_visible(self.__channelNamesVisible) 
    347         scene.set_node_animation_enabled(self.__nodeAnimationEnabled) 
    348         scene.setFont(self.font()) 
     347        self.__setupScene(scene) 
    349348 
    350349        view = CanvasView(scene) 
     
    359358        self.__scene = scene 
    360359 
    361         self.__focusListener = GraphicsSceneFocusEventListener() 
    362         self.__focusListener.itemFocusedIn.connect(self.__onItemFocusedIn) 
    363         self.__focusListener.itemFocusedOut.connect(self.__onItemFocusedOut) 
    364         self.__scene.addItem(self.__focusListener) 
    365  
    366         self.__scene.selectionChanged.connect( 
    367             self.__onSelectionChanged 
    368         ) 
    369  
    370360        layout.addWidget(view) 
    371361        self.setLayout(layout) 
     362 
     363    def __setupScene(self, scene): 
     364        """ 
     365        Set up a :class:`CanvasScene` instance for use by the editor. 
     366 
     367        .. note:: If an existing scene is in use it must be teared down using 
     368            __teardownScene 
     369 
     370        """ 
     371        scene.set_channel_names_visible(self.__channelNamesVisible) 
     372        scene.set_node_animation_enabled( 
     373            self.__nodeAnimationEnabled 
     374        ) 
     375 
     376        scene.setFont(self.font()) 
     377 
     378        scene.installEventFilter(self) 
     379 
     380        scene.set_registry(self.__registry) 
     381 
     382        # Focus listener 
     383        self.__focusListener = GraphicsSceneFocusEventListener() 
     384        self.__focusListener.itemFocusedIn.connect( 
     385            self.__onItemFocusedIn 
     386        ) 
     387        self.__focusListener.itemFocusedOut.connect( 
     388            self.__onItemFocusedOut 
     389        ) 
     390        scene.addItem(self.__focusListener) 
     391 
     392        scene.selectionChanged.connect( 
     393            self.__onSelectionChanged 
     394        ) 
     395 
     396        scene.node_item_activated.connect( 
     397            self.__onNodeActivate 
     398        ) 
     399 
     400        scene.annotation_added.connect( 
     401            self.__onAnnotationAdded 
     402        ) 
     403 
     404        scene.annotation_removed.connect( 
     405            self.__onAnnotationRemoved 
     406        ) 
     407 
     408        self.__annotationGeomChanged = QSignalMapper(self) 
     409 
     410    def __teardownScene(self, scene): 
     411        """ 
     412        Tear down an instance of :class:`CanvasScene` that was used by the 
     413        editor. 
     414 
     415        """ 
     416        # Clear the current item selection in the scene so edit action 
     417        # states are updated accordingly. 
     418        scene.clearSelection() 
     419 
     420        # Clear focus from any item. 
     421        scene.setFocusItem(None) 
     422 
     423        # Clear the annotation mapper 
     424        self.__annotationGeomChanged.deleteLater() 
     425        self.__annotationGeomChanged = None 
     426 
     427        self.__focusListener.itemFocusedIn.disconnect( 
     428            self.__onItemFocusedIn 
     429        ) 
     430        self.__focusListener.itemFocusedOut.disconnect( 
     431            self.__onItemFocusedOut 
     432        ) 
     433 
     434        scene.selectionChanged.disconnect( 
     435            self.__onSelectionChanged 
     436        ) 
     437 
     438        scene.removeEventFilter(self) 
     439 
     440        # Clear all items from the scene 
     441        scene.blockSignals(True) 
     442        scene.clear_scene() 
    372443 
    373444    def toolbarActions(self): 
     
    440511 
    441512            - `SchemeEditWidget.NoTrigeres` 
    442             - `SchemeEditWidget.Clicked` 
     513            - `SchemeEditWidget.RightClicked` 
    443514            - `SchemeEditWidget.DoubleClicked` 
    444515            - `SchemeEditWidget.SpaceKey` 
     
    534605                self.__cleanSettings = [] 
    535606 
    536             # Clear the current item selection in the scene so edit action 
    537             # states are updated accordingly. 
    538             self.__scene.clearSelection() 
    539  
    540             self.__annotationGeomChanged.deleteLater() 
    541             self.__annotationGeomChanged = QSignalMapper(self) 
     607            self.__teardownScene(self.__scene) 
     608            self.__scene.deleteLater() 
    542609 
    543610            self.__undoStack.clear() 
    544611 
    545             self.__focusListener.itemFocusedIn.disconnect( 
    546                 self.__onItemFocusedIn 
    547             ) 
    548             self.__focusListener.itemFocusedOut.disconnect( 
    549                 self.__onItemFocusedOut 
    550             ) 
    551  
    552             self.__scene.selectionChanged.disconnect( 
    553                 self.__onSelectionChanged 
    554             ) 
    555  
    556             self.__scene.removeEventFilter(self) 
    557  
    558             # Clear all items from the scene 
    559             self.__scene.blockSignals(True) 
    560             self.__scene.clear_scene() 
    561  
    562             self.__scene.deleteLater() 
    563  
    564612            self.__scene = CanvasScene() 
     613            self.__setupScene(self.__scene) 
     614 
    565615            self.__view.setScene(self.__scene) 
    566             self.__scene.set_channel_names_visible(self.__channelNamesVisible) 
    567             self.__scene.set_node_animation_enabled( 
    568                 self.__nodeAnimationEnabled 
    569             ) 
    570  
    571             self.__scene.setFont(self.font()) 
    572  
    573             self.__scene.installEventFilter(self) 
    574  
    575             self.__scene.set_registry(self.__registry) 
    576  
    577             # Focus listener 
    578             self.__focusListener = GraphicsSceneFocusEventListener() 
    579             self.__focusListener.itemFocusedIn.connect( 
    580                 self.__onItemFocusedIn 
    581             ) 
    582             self.__focusListener.itemFocusedOut.connect( 
    583                 self.__onItemFocusedOut 
    584             ) 
    585             self.__scene.addItem(self.__focusListener) 
    586  
    587             self.__scene.selectionChanged.connect( 
    588                 self.__onSelectionChanged 
    589             ) 
    590  
    591             self.__scene.node_item_activated.connect( 
    592                 self.__onNodeActivate 
    593             ) 
    594  
    595             self.__scene.annotation_added.connect( 
    596                 self.__onAnnotationAdded 
    597             ) 
    598  
    599             self.__scene.annotation_removed.connect( 
    600                 self.__onAnnotationRemoved 
    601             ) 
    602616 
    603617            self.__scene.set_scheme(scheme) 
     
    974988 
    975989        any_item = scene.item_at(pos) 
     990        if not any_item: 
     991            self.__emptyClickButtons |= event.button() 
     992 
    976993        if not any_item and event.button() == Qt.LeftButton: 
    977             self.__emptyClickButtons |= Qt.LeftButton 
    978994            # Create a RectangleSelectionAction but do not set in on the scene 
    979995            # just yet (instead wait for the mouse move event). 
     
    10101026            handler = self.__possibleSelectionHandler 
    10111027            self._setUserInteractionHandler(handler) 
     1028            self.__possibleSelectionHandler = None 
    10121029            return handler.mouseMoveEvent(event) 
    10131030 
     
    10151032 
    10161033    def sceneMouseReleaseEvent(self, event): 
     1034        scene = self.__scene 
     1035        if scene.user_interaction_handler: 
     1036            return False 
     1037 
    10171038        if event.button() == Qt.LeftButton and self.__possibleMouseItemsMove: 
    10181039            self.__possibleMouseItemsMove = False 
     
    10471068                self.__itemsMoving.clear() 
    10481069                return True 
    1049  
    1050         if self.__emptyClickButtons & Qt.LeftButton and \ 
    1051                 event.button() & Qt.LeftButton: 
    1052             self.__emptyClickButtons &= ~Qt.LeftButton 
    1053  
    1054             if self.__quickMenuTriggers & SchemeEditWidget.Clicked and \ 
    1055                     mouse_drag_distance(event, Qt.LeftButton) < 1: 
    1056                 action = interactions.NewNodeAction(self) 
    1057  
    1058                 with nested(disabled(self.__undoAction), 
    1059                             disabled(self.__redoAction)): 
    1060                     action.create_new(event.screenPos()) 
    1061  
    1062                 event.accept() 
    1063                 return True 
     1070        elif event.button() == Qt.LeftButton: 
     1071            self.__possibleSelectionHandler = None 
    10641072 
    10651073        return False 
     
    11131121 
    11141122        handler = None 
     1123        searchText = "" 
    11151124        if (event.key() == Qt.Key_Space and \ 
    11161125                self.__quickMenuTriggers & SchemeEditWidget.SpaceKey): 
     
    11181127 
    11191128        elif len(event.text()) and \ 
    1120                 self.__quickMenuTriggers & SchemeEditWidget.AnyKey: 
     1129                self.__quickMenuTriggers & SchemeEditWidget.AnyKey and \ 
     1130                is_printable(unicode(event.text())[0]): 
    11211131            handler = interactions.NewNodeAction(self) 
     1132            searchText = unicode(event.text()) 
     1133 
    11221134            # TODO: set the search text to event.text() and set focus on the 
    11231135            # search line 
     
    11321144                        disabled(self.__undoAction), 
    11331145                        disabled(self.__redoAction)): 
    1134                 handler.create_new(QCursor.pos()) 
     1146                handler.create_new(QCursor.pos(), searchText) 
    11351147 
    11361148            event.accept() 
     
    14141426            return 
    14151427 
     1428        item = self.scene().item_at(scenePos) 
     1429        if not item and \ 
     1430                self.__quickMenuTriggers & SchemeEditWidget.RightClicked: 
     1431            action = interactions.NewNodeAction(self) 
     1432 
     1433            with nested(disabled(self.__undoAction), 
     1434                        disabled(self.__redoAction)): 
     1435                action.create_new(globalPos) 
     1436            return 
     1437 
    14161438    def __onRenameAction(self): 
    14171439        """ 
     
    15531575    for obj in objects: 
    15541576        obj.setEnabled(enable) 
     1577 
     1578 
     1579# All control character categories. 
     1580_control = set(["Cc", "Cf", "Cs", "Co", "Cn"]) 
     1581 
     1582 
     1583def is_printable(unichar): 
     1584    """ 
     1585    Return True if the unicode character `unichar` is a printable character. 
     1586    """ 
     1587    return unicodedata.category(unichar) not in _control 
Note: See TracChangeset for help on using the changeset viewer.