Ignore:
Timestamp:
11/23/12 18:43:01 (17 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Added quick menu trigger flags (default is double click and space key).

File:
1 edited

Legend:

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

    r11195 r11198  
    88from PyQt4.QtGui import ( 
    99    QWidget, QVBoxLayout, QInputDialog, QMenu, QAction, QKeySequence, 
    10     QUndoStack, QGraphicsItem, QGraphicsObject, QPainter 
     10    QUndoStack, QGraphicsItem, QGraphicsObject, QPainter, QCursor, 
     11    QGraphicsTextItem 
    1112) 
    1213 
     
    6566    titleChanged = Signal(unicode) 
    6667 
     68    # Quick Menu triggers 
     69    (NoTriggers, 
     70     Clicked, 
     71     DoubleClicked, 
     72     SpaceKey, 
     73     AnyKey) = [0, 1, 2, 4, 8] 
     74 
    6775    def __init__(self, parent=None, ): 
    6876        QWidget.__init__(self, parent) 
     
    7179        self.__registry = None 
    7280        self.__scheme = None 
    73         self.__undoStack = QUndoStack(self) 
    74         self.__undoStack.cleanChanged[bool].connect(self.__onCleanChanged) 
     81        self.__quickMenuTriggers = SchemeEditWidget.SpaceKey | \ 
     82                                   SchemeEditWidget.DoubleClicked 
     83        self.__emptyClickButtons = 0 
     84        self.__possibleSelectionHandler = None 
    7585        self.__possibleMouseItemsMove = False 
    7686        self.__itemsMoving = {} 
    7787        self.__contextMenuTarget = None 
    7888        self.__quickMenu = None 
     89 
     90        self.__undoStack = QUndoStack(self) 
     91        self.__undoStack.cleanChanged[bool].connect(self.__onCleanChanged) 
    7992 
    8093        self.__editFinishedMapper = QSignalMapper(self) 
     
    201214 
    202215    modified = Property(bool, fget=isModified, fset=setModified) 
     216 
     217    def setQuickMenuTriggers(self, triggers): 
     218        """Set quick menu triggers. 
     219        """ 
     220        if self.__quickMenuTriggers != triggers: 
     221            self.__quickMenuTriggers = triggers 
     222 
     223    def quickMenuTriggres(self): 
     224        return self.__quickMenuTriggers 
    203225 
    204226    def undoStack(self): 
     
    495517            handler = interactions.NewLinkAction(self) 
    496518            scene.set_user_interaction_handler(handler) 
    497  
    498519            return handler.mousePressEvent(event) 
    499520 
    500521        any_item = scene.item_at(pos) 
    501522        if not any_item and event.button() == Qt.LeftButton: 
    502             # Start rect selection 
     523            self.__emptyClickButtons |= Qt.LeftButton 
     524            # Create a RectangleSelectionAction but do not set in on the scene 
     525            # just yet (instead wait for the mouse move event). 
    503526            handler = interactions.RectangleSelectionAction(self) 
    504             scene.set_user_interaction_handler(handler) 
    505             return handler.mousePressEvent(event) 
     527            rval = handler.mousePressEvent(event) 
     528            if rval == True: 
     529                self.__possibleSelectionHandler = handler 
     530            return False 
    506531 
    507532        if any_item and event.button() == Qt.LeftButton: 
     
    521546        if scene.user_interaction_handler: 
    522547            return False 
     548 
     549        if self.__emptyClickButtons & Qt.LeftButton and \ 
     550                event.buttons() & Qt.LeftButton and \ 
     551                self.__possibleSelectionHandler: 
     552            # Set the RectangleSelection (initialized in mousePressEvent) 
     553            # on the scene 
     554            handler = self.__possibleSelectionHandler 
     555            scene.set_user_interaction_handler(handler) 
     556            return handler.mouseMoveEvent(event) 
    523557 
    524558        return False 
     
    555589                self.__itemsMoving.clear() 
    556590                return True 
     591 
     592        if self.__emptyClickButtons & Qt.LeftButton and \ 
     593                event.button() & Qt.LeftButton: 
     594            self.__emptyClickButtons &= ~Qt.LeftButton 
     595 
     596            if self.__quickMenuTriggers & SchemeEditWidget.Clicked and \ 
     597                    mouse_drag_distance(event, Qt.LeftButton) < 1: 
     598                action = interactions.NewNodeAction(self) 
     599                action.create_new(event.screenPos()) 
     600                event.accept() 
     601                return True 
     602 
    557603        return False 
    558604 
     
    563609 
    564610        item = scene.item_at(event.scenePos()) 
    565         if not item: 
     611        if not item and self.__quickMenuTriggers & \ 
     612                SchemeEditWidget.DoubleClicked: 
    566613            # Double click on an empty spot 
    567614            # Create a new node quick 
    568615            action = interactions.NewNodeAction(self) 
    569             action.create_new(event) 
     616            action.create_new(event.screenPos()) 
    570617            event.accept() 
    571618            return True 
     
    583630 
    584631    def sceneKeyPressEvent(self, event): 
     632        scene = self.__scene 
     633        if scene.user_interaction_handler: 
     634            return False 
     635 
     636        # If a QGraphicsItem is in text editing mode, don't interrupt it 
     637        focusItem = scene.focusItem() 
     638        if focusItem and isinstance(focusItem, QGraphicsTextItem) and \ 
     639                focusItem.textInteractionFlags() & Qt.TextEditable: 
     640            return False 
     641 
     642        # If the mouse is not over out view 
     643        if not self.view().underMouse(): 
     644            return False 
     645 
     646        if (event.key() == Qt.Key_Space and \ 
     647                self.__quickMenuTriggers & SchemeEditWidget.SpaceKey): 
     648            action = interactions.NewNodeAction(self) 
     649            action.create_new(QCursor.pos()) 
     650            event.accept() 
     651            return True 
     652 
     653        if len(event.text()) and \ 
     654                self.__quickMenuTriggers & SchemeEditWidget.AnyKey: 
     655            action = interactions.NewNodeAction(self) 
     656            # TODO: set the search text to event.text() and set focus on the 
     657            # search line 
     658            action.create_new(QCursor.pos()) 
     659            event.accept() 
     660            return True 
     661 
    585662        return False 
    586663 
     
    826903        geom = item.geometry() 
    827904        return (geom.x(), geom.y(), geom.width(), geom.height()) 
     905 
     906 
     907def mouse_drag_distance(event, button=Qt.LeftButton): 
     908    """Return the (manhattan) distance between the (screen position) 
     909    when the `button` was pressed and the current mouse position. 
     910 
     911    """ 
     912    diff = (event.buttonDownScreenPos(button) - event.screenPos()) 
     913    return diff.manhattanLength() 
Note: See TracChangeset for help on using the changeset viewer.