Changeset 11195:e90582a13944 in orange


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

Changed the base class of UserInteraction to QObject, added notifier signals.

Location:
Orange/OrangeCanvas
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeCanvas/canvas/scene.py

    r11191 r11195  
    709709    def set_user_interaction_handler(self, handler): 
    710710        if self.user_interaction_handler and \ 
    711                 not self.user_interaction_handler.finished: 
     711                not self.user_interaction_handler.isFinished(): 
    712712            self.user_interaction_handler.cancel() 
    713713 
  • Orange/OrangeCanvas/document/interactions.py

    r11193 r11195  
    99) 
    1010 
    11 from PyQt4.QtCore import Qt, QSizeF, QPointF, QRectF, QLineF 
     11from PyQt4.QtCore import Qt, QObject, QSizeF, QPointF, QRectF, QLineF 
     12from PyQt4.QtCore import pyqtSignal as Signal 
    1213 
    1314from ..registry.qt import QtWidgetRegistry 
     
    2021 
    2122 
    22 class UserInteraction(object): 
    23     def __init__(self, document): 
     23class UserInteraction(QObject): 
     24    # cancel reason flags 
     25    NoReason = 0  # No specified reason 
     26    UserCancelReason = 1  # User canceled the operation (e.g. pressing ESC) 
     27    InteractionOverrideReason = 3  # Another interaction was set 
     28    ErrorReason = 4  # An internal error occurred 
     29    OtherReason = 5 
     30 
     31    # Emitted when the interaction is set on the scene. 
     32    started = Signal() 
     33 
     34    # Emitted when the interaction finishes successfully. 
     35    finished = Signal() 
     36 
     37    # Emitted when the interaction ends (canceled or finished) 
     38    ended = Signal() 
     39 
     40    # Emitted when the interaction is canceled. 
     41    canceled = Signal([], [int]) 
     42 
     43    def __init__(self, document, parent=None, deleteOnEnd=True): 
     44        QObject.__init__(self, parent) 
    2445        self.document = document 
    2546        self.scene = document.scene() 
    2647        self.scheme = document.scheme() 
    27         self.finished = False 
    28         self.canceled = False 
     48        self.deleteOnEnd = deleteOnEnd 
     49 
     50        self.cancelOnEsc = False 
     51 
     52        self.__finished = False 
     53        self.__canceled = False 
     54        self.__cancelReason = self.NoReason 
    2955 
    3056    def start(self): 
    31         pass 
     57        """Start the interaction. This is called by the scene when 
     58        the interaction is installed. 
     59 
     60        Must be called from subclass implementations. 
     61 
     62        """ 
     63        self.started.emit() 
    3264 
    3365    def end(self): 
    34         self.finished = True 
     66        """Finish the interaction. Restore any leftover state in 
     67        this method. 
     68 
     69        .. note:: This gets called from the default `cancel` implementation. 
     70 
     71        """ 
     72        self.__finished = True 
     73 
    3574        if self.scene.user_interaction_handler is self: 
    3675            self.scene.set_user_interaction_handler(None) 
    3776 
    38     def cancel(self): 
    39         self.canceled = True 
     77        if self.__canceled: 
     78            self.canceled.emit() 
     79            self.canceled[int].emit(self.__cancelReason) 
     80        else: 
     81            self.finished.emit() 
     82 
     83        self.ended.emit() 
     84 
     85        if self.deleteOnEnd: 
     86            self.deleteLater() 
     87 
     88    def cancel(self, reason=OtherReason): 
     89        """Cancel the interaction for `reason`. 
     90        """ 
     91 
     92        self.__canceled = True 
     93        self.__cancelReason = reason 
     94 
    4095        self.end() 
     96 
     97    def isFinished(self): 
     98        """Has the interaction finished. 
     99        """ 
     100        return self.__finished 
     101 
     102    def isCanceled(self): 
     103        """Was the interaction canceled. 
     104        """ 
     105        return self.__canceled 
     106 
     107    def cancelReason(self): 
     108        """Return the reason the interaction was canceled. 
     109        """ 
     110        return self.__cancelReason 
    41111 
    42112    def mousePressEvent(self, event): 
     
    53123 
    54124    def keyPressEvent(self, event): 
     125        if self.cancelOnEsc and event.key() == Qt.Key_Escape: 
     126            self.cancel(self.UserCancelReason) 
    55127        return False 
    56128 
     
    82154    FROM_SINK = 2 
    83155 
    84     def __init__(self, document): 
    85         UserInteraction.__init__(self, document) 
     156    def __init__(self, document, *args, **kwargs): 
     157        UserInteraction.__init__(self, document, *args, **kwargs) 
    86158        self.source_item = None 
    87159        self.sink_item = None 
     
    165237            return True 
    166238        else: 
    167             # Whoerver put us in charge did not know what he was doing. 
    168             self.cancel() 
     239            # Whoever put us in charge did not know what he was doing. 
     240            self.cancel(self.ErrorReason) 
    169241            return False 
    170242 
     
    385457            self.cancel() 
    386458 
    387         self.end() 
     459        if not self.isFinished(): 
     460            self.end() 
    388461 
    389462    def end(self): 
     
    391464        UserInteraction.end(self) 
    392465 
    393     def cancel(self): 
    394         if not self.finished: 
    395             log.info("Canceling new link action, reverting scene state.") 
    396             self.cleanup() 
     466    def cancel(self, reason=UserInteraction.OtherReason): 
     467        self.cleanup() 
     468        UserInteraction.cancel(self, reason) 
    397469 
    398470    def cleanup(self): 
     
    422494 
    423495    """ 
    424  
    425     def __init__(self, document): 
    426         UserInteraction.__init__(self, document) 
    427496 
    428497    def mousePressEvent(self, event): 
     
    451520    """Select items in the scene using a Rectangle selection 
    452521    """ 
    453     def __init__(self, document): 
    454         UserInteraction.__init__(self, document) 
     522    def __init__(self, document, *args, **kwargs): 
     523        UserInteraction.__init__(self, document, *args, **kwargs) 
    455524        self.initial_selection = None 
    456525 
     
    481550            return True 
    482551        else: 
    483             self.cancel() 
     552            self.cancel(self.ErrorReason) 
    484553            return False 
    485554 
     
    525594 
    526595class EditNodeLinksAction(UserInteraction): 
    527     def __init__(self, document, source_node, sink_node): 
    528         UserInteraction.__init__(self, document) 
     596    def __init__(self, document, source_node, sink_node, *args, **kwargs): 
     597        UserInteraction.__init__(self, document, *args, **kwargs) 
    529598        self.source_node = source_node 
    530599        self.sink_node = sink_node 
     
    581650    """Create a new arrow annotation. 
    582651    """ 
    583     def __init__(self, document): 
    584         UserInteraction.__init__(self, document) 
     652    def __init__(self, document, *args, **kwargs): 
     653        UserInteraction.__init__(self, document, *args, **kwargs) 
    585654        self.down_pos = None 
    586655        self.arrow_item = None 
     
    651720 
    652721class NewTextAnnotation(UserInteraction): 
    653     def __init__(self, document): 
    654         UserInteraction.__init__(self, document) 
     722    def __init__(self, document, *args, **kwargs): 
     723        UserInteraction.__init__(self, document, *args, **kwargs) 
    655724        self.down_pos = None 
    656725        self.annotation_item = None 
     
    752821 
    753822class ResizeTextAnnotation(UserInteraction): 
    754     def __init__(self, document, ): 
    755         UserInteraction.__init__(self, document) 
     823    def __init__(self, document, *args, **kwargs): 
     824        UserInteraction.__init__(self, document, *args, **kwargs) 
    756825        self.item = None 
    757826        self.annotation = None 
     
    815884            self.control.setRect(rect) 
    816885 
    817     def cancel(self): 
     886    def cancel(self, reason=UserInteraction.OtherReason): 
     887        log.debug("ResizeArrowAnnotation.cancel(%s)", reason) 
    818888        if self.item is not None and self.savedRect is not None: 
    819889            self.item.setGeometry(self.savedRect) 
    820890 
    821         UserInteraction.cancel(self) 
     891        UserInteraction.cancel(self, reason) 
    822892 
    823893    def end(self): 
     
    836906 
    837907class ResizeArrowAnnotation(UserInteraction): 
    838     def __init__(self, document): 
    839         UserInteraction.__init__(self, document) 
     908    def __init__(self, document, *args, **kwargs): 
     909        UserInteraction.__init__(self, document, *args, **kwargs) 
    840910        self.item = None 
    841911        self.annotation = None 
     
    909979            self.control.setLine(QLineF(p1, p2)) 
    910980 
    911     def cancel(self): 
     981    def cancel(self, reason=UserInteraction.OtherReason): 
     982        log.debug("ResizeArrowAnnotation.cancel(%s)", reason) 
    912983        if self.item is not None and self.savedLine is not None: 
    913984            self.item.setLine(self.savedLine) 
    914985 
    915         UserInteraction.cancel(self) 
     986        UserInteraction.cancel(self, reason) 
    916987 
    917988    def end(self): 
  • Orange/OrangeCanvas/document/schemeedit.py

    r11194 r11195  
    708708        if self.__newTextAnnotationAction.isChecked(): 
    709709            self.__newTextAnnotationAction.setChecked(not checked) 
     710 
     711        action = self.__newArrowAnnotationAction 
     712 
    710713        if not checked: 
    711714            handler = self.__scene.user_interaction_handler 
    712715            if isinstance(handler, interactions.NewArrowAnnotation): 
    713716                # Cancel the interaction and restore the state 
    714                 handler.cancel() 
     717                handler.ended.disconnect(action.toggle) 
     718                handler.cancel(interactions.UserInteraction.UserCancelReason) 
    715719                log.info("Canceled new arrow annotation") 
    716720 
    717721        else: 
    718722            handler = interactions.NewArrowAnnotation(self) 
    719             # TODO: when does the interaction complete. 
     723            handler.ended.connect(action.toggle) 
     724 
    720725            self.__scene.set_user_interaction_handler(handler) 
    721726 
     
    723728        if self.__newArrowAnnotationAction.isChecked(): 
    724729            self.__newArrowAnnotationAction.setChecked(not checked) 
     730 
     731        action = self.__newTextAnnotationAction 
    725732 
    726733        if not checked: 
     
    728735            if isinstance(handler, interactions.NewTextAnnotation): 
    729736                # cancel the interaction and restore the state 
    730                 handler.cancel() 
     737                handler.ended.disconnect(action.toggle) 
     738                handler.cancel(interactions.UserInteraction.UserCancelReason) 
    731739                log.info("Canceled new text annotation") 
    732740 
    733741        else: 
    734742            handler = interactions.NewTextAnnotation(self) 
     743            handler.ended.connect(action.toggle) 
     744 
    735745            self.__scene.set_user_interaction_handler(handler) 
    736746 
     
    799809        handler = self.__scene.user_interaction_handler 
    800810        if isinstance(handler, (interactions.ResizeArrowAnnotation, 
    801                                 interactions.ResizeTextAnnotation)): 
     811                                interactions.ResizeTextAnnotation)) and \ 
     812                not handler.isFinished() and not handler.isCanceled(): 
    802813            handler.commit() 
    803814            handler.end() 
Note: See TracChangeset for help on using the changeset viewer.