Changeset 11450:e9c545633850 in orange


Ignore:
Timestamp:
04/08/13 10:54:27 (13 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Made NewLinkAction an atomic operation.

File:
1 edited

Legend:

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

    r11449 r11450  
    1717 
    1818from PyQt4.QtGui import ( 
    19     QApplication, QGraphicsRectItem, QPen, QBrush, QColor, QFontMetrics 
     19    QApplication, QGraphicsRectItem, QPen, QBrush, QColor, QFontMetrics, 
     20    QUndoCommand 
    2021) 
    2122 
     
    195196 
    196197 
     198class UserCanceledError(ValueError): 
     199    pass 
     200 
     201 
    197202def reversed_arguments(func): 
    198203    """ 
     
    232237        # An `AnchorPoint` following the mouse cursor 
    233238        self.cursor_anchor_point = None 
     239        # An QUndoCommand 
     240        self.macro = None 
    234241 
    235242    def remove_tmp_anchor(self): 
     
    387394            node = None 
    388395            stack = self.document.undoStack() 
    389             stack.beginMacro("Add link") 
     396 
     397            self.macro = QUndoCommand(self.tr("Add link")) 
    390398 
    391399            if item: 
    392                 # If the release was over a widget item 
    393                 # then connect them 
     400                # If the release was over a node item then connect them 
    394401                node = self.scene.node_for_item(item) 
    395402            else: 
     
    404411 
    405412                if node is not None: 
    406                     self.document.addNode(node) 
     413                    commands.AddNodeCommand(self.scheme, node, 
     414                                            parent=self.macro) 
    407415 
    408416            if node is not None: 
     
    414422                    sink_node = self.scene.node_for_item(self.sink_item) 
    415423                self.connect_nodes(source_node, sink_node) 
    416             else: 
    417                 self.end() 
    418  
    419             stack.endMacro() 
     424 
     425                if not self.isCanceled() or not self.isFinished() and \ 
     426                        self.macro is not None: 
     427                    # Push (commit) the add link/node action on the stack. 
     428                    stack.push(self.macro) 
     429 
     430            self.end() 
     431 
    420432        else: 
    421433            self.end() 
     
    515527 
    516528                try: 
    517                     _, links_to_add, links_to_remove = self.edit_links( 
     529                    rstatus, links_to_add, links_to_remove = self.edit_links( 
    518530                        source_node, sink_node, initial_links 
    519531                    ) 
     
    522534                              exc_info=True) 
    523535                    raise 
     536                if rstatus == EditLinksDialog.Rejected: 
     537                    raise UserCanceledError 
    524538            else: 
    525539                # links_to_add now needs to be a list of actual SchemeLinks 
     
    537551 
    538552            for link in links_to_remove: 
    539                 self.document.removeLink(link) 
     553                commands.RemoveLinkCommand(self.scheme, link, 
     554                                           parent=self.macro) 
    540555 
    541556            for link in links_to_add: 
     
    548563 
    549564                if not duplicate: 
    550                     self.document.addLink(link) 
     565                    commands.AddLinkCommand(self.scheme, link, 
     566                                            parent=self.macro) 
    551567 
    552568        except scheme.IncompatibleChannelTypeError: 
     
    559575            log.info("Cannot connect: no possible links.") 
    560576            self.cancel() 
     577        except UserCanceledError: 
     578            log.info("User canceled a new link action.") 
     579            self.cancel(UserInteraction.UserCancelReason) 
    561580        except Exception: 
    562581            log.error("An error occurred during the creation of a new link.", 
    563582                      exc_info=True) 
    564583            self.cancel() 
    565  
    566         if not self.isFinished(): 
    567             self.end() 
    568584 
    569585    def edit_links(self, source_node, sink_node, initial_links=None): 
     
    609625        self.cleanup() 
    610626        # Remove the help tip set in mousePressEvent 
     627        self.macro = None 
    611628        helpevent = QuickHelpTipEvent("", "") 
    612629        QCoreApplication.postEvent(self.document, helpevent) 
Note: See TracChangeset for help on using the changeset viewer.