Changeset 11279:e788ced9f4b2 in orange


Ignore:
Timestamp:
01/24/13 18:25:13 (15 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Enumerating new node titles as they are created.

Location:
Orange/OrangeCanvas/document
Files:
2 edited

Legend:

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

    r11277 r11279  
    381381            desc = item.data(QtWidgetRegistry.WIDGET_DESC_ROLE).toPyObject() 
    382382            pos = event.scenePos() 
    383             node = scheme.SchemeNode(desc, position=(pos.x(), pos.y())) 
     383            node = self.document.newNodeHelper(desc, 
     384                                               position=(pos.x(), pos.y())) 
    384385            return node 
     386 
    385387 
    386388    def connect_existing(self, node): 
     
    544546            view = self.document.view() 
    545547            pos = view.mapToScene(view.mapFromGlobal(pos)) 
    546             node = scheme.SchemeNode(desc, position=(pos.x(), pos.y())) 
     548 
     549            node = self.document.newNodeHelper(desc, 
     550                                               position=(pos.x(), pos.y())) 
    547551            self.document.addNode(node) 
    548552            return node 
  • Orange/OrangeCanvas/document/schemeedit.py

    r11266 r11279  
    66import sys 
    77import logging 
     8import itertools 
    89 
    910from operator import attrgetter 
     
    558559 
    559560    def setTitle(self, title): 
     561        """ 
     562        Set the scheme title. 
     563        """ 
    560564        self.__undoStack.push( 
    561565            commands.SetAttrCommand(self.__scheme, "title", title) 
     
    563567 
    564568    def setDescription(self, description): 
     569        """ 
     570        Set the scheme description string. 
     571        """ 
    565572        self.__undoStack.push( 
    566573            commands.SetAttrCommand(self.__scheme, "description", description) 
     
    568575 
    569576    def addNode(self, node): 
    570         """Add a new node to the scheme. 
     577        """ 
     578        Add a new node (:class:`SchemeNode`) to the document. 
    571579        """ 
    572580        command = commands.AddNodeCommand(self.__scheme, node) 
    573581        self.__undoStack.push(command) 
    574582 
    575     def createNewNode(self, description): 
    576         """Create a new `SchemeNode` and add it to the document at left of the 
    577         last added node. 
    578  
    579         """ 
    580         node = scheme.SchemeNode(description) 
    581  
    582         if self.scheme().nodes: 
    583             x, y = self.scheme().nodes[-1].position 
    584             node.position = (x + 150, y) 
     583    def createNewNode(self, description, title=None, position=None): 
     584        """ 
     585        Create a new `SchemeNode` and add it to the document. The new 
     586        node is constructed using `newNodeHelper` method. 
     587 
     588        """ 
     589        node = self.newNodeHelper(description, title, position) 
     590        self.addNode(node) 
     591 
     592        return node 
     593 
     594    def newNodeHelper(self, description, title=None, position=None): 
     595        """ 
     596        Return a new initialized `SchemeNode`. If title and position are 
     597        not supplied they are initialized to a sensible defaults. 
     598 
     599        """ 
     600        if title is None: 
     601            title = self.enumerateTitle(description.name) 
     602 
     603        if position is None: 
     604            position = self.nextPosition() 
     605 
     606        return scheme.SchemeNode(description, title=title, position=position) 
     607 
     608    def enumerateTitle(self, title): 
     609        """ 
     610        Enumerate a title string (i.e. add a number in parentheses) so it is 
     611        not equal to any node title in the current scheme. 
     612 
     613        """ 
     614        curr_titles = set([node.title for node in self.scheme().nodes]) 
     615        template = title + " ({0})" 
     616 
     617        enumerated = itertools.imap(template.format, itertools.count(1)) 
     618        candidates = itertools.chain([title], enumerated) 
     619 
     620        seq = itertools.dropwhile(curr_titles.__contains__, candidates) 
     621        return next(seq) 
     622 
     623    def nextPosition(self): 
     624        """ 
     625        Return the next default node position (x, y) tuple. This is 
     626        a position left of the last added node. 
     627 
     628        """ 
     629        nodes = self.scheme().nodes 
     630        if nodes: 
     631            x, y = nodes[-1].position 
     632            position = (x + 150, y) 
    585633        else: 
    586             node.position = (150, 150) 
    587  
    588         self.addNode(node) 
     634            position = (150, 150) 
     635        return position 
    589636 
    590637    def removeNode(self, node): 
     
    762809                desc = self.__registry.widget(unicode(qname)) 
    763810                pos = event.scenePos() 
    764                 node = scheme.SchemeNode(desc, position=(pos.x(), pos.y())) 
    765                 self.addNode(node) 
     811                self.createNewNode(desc, position=(pos.x(), pos.y())) 
    766812                return True 
    767813 
Note: See TracChangeset for help on using the changeset viewer.