Changeset 11193:df0832fddb84 in orange


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

Add a 'Text Annotation' to the scheme with a single click.

Location:
Orange/OrangeCanvas
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeCanvas/canvas/items/annotationitem.py

    r11192 r11193  
    6161        self.__textItem.setTabChangesFocus(True) 
    6262        self.__textItem.setTextInteractionFlags(Qt.NoTextInteraction) 
     63        self.__textItem.setFont(self.font()) 
    6364        self.__textInteractionFlags = Qt.NoTextInteraction 
    6465 
     
    232233 
    233234        return Annotation.itemChange(self, change, value) 
     235 
     236    def changeEvent(self, event): 
     237        if event.type() == QEvent.FontChange: 
     238            self.__textItem.setFont(self.font()) 
     239 
     240        Annotation.changeEvent(self, event) 
    234241 
    235242 
  • Orange/OrangeCanvas/document/interactions.py

    r11192 r11193  
    66 
    77from PyQt4.QtGui import ( 
    8     QApplication, QGraphicsRectItem, QPen, QBrush, QColor 
     8    QApplication, QGraphicsRectItem, QPen, QBrush, QColor, QFontMetrics 
    99) 
    1010 
    11 from PyQt4.QtCore import Qt, QSizeF, QRectF, QLineF 
     11from PyQt4.QtCore import Qt, QSizeF, QPointF, QRectF, QLineF 
    1212 
    1313from ..registry.qt import QtWidgetRegistry 
     
    662662        UserInteraction.start(self) 
    663663 
     664    def createNewAnnotation(self, rect): 
     665        """Create a new TextAnnotation at with `rect` as the geometry. 
     666        """ 
     667        annot = scheme.SchemeTextAnnotation(rect_to_tuple(rect)) 
     668 
     669        item = self.scene.add_annotation(annot) 
     670        item.setTextInteractionFlags(Qt.TextEditorInteraction) 
     671        item.setFramePen(QPen(Qt.DashLine)) 
     672 
     673        self.annotation_item = item 
     674        self.annotation = annot 
     675        self.control = controlpoints.ControlPointRect() 
     676        self.control.rectChanged.connect( 
     677            self.annotation_item.setGeometry 
     678        ) 
     679        self.scene.addItem(self.control) 
     680 
    664681    def mousePressEvent(self, event): 
    665682        if event.button() == Qt.LeftButton: 
     
    673690                    QApplication.instance().startDragDistance(): 
    674691                rect = QRectF(self.down_pos, event.scenePos()).normalized() 
    675                 annot = scheme.SchemeTextAnnotation(rect_to_tuple(rect)) 
    676  
    677                 item = self.scene.add_annotation(annot) 
    678                 item.setTextInteractionFlags(Qt.TextEditorInteraction) 
    679                 item.setFramePen(QPen(Qt.DashLine)) 
    680  
    681                 self.annotation_item = item 
    682                 self.annotation = annot 
    683                 self.control = controlpoints.ControlPointRect() 
    684                 self.control.rectChanged.connect( 
    685                     self.annotation_item.setGeometry 
    686                 ) 
    687                 self.scene.addItem(self.control) 
     692                self.createNewAnnotation(rect) 
    688693 
    689694            if self.annotation_item is not None: 
     
    695700    def mouseReleaseEvent(self, event): 
    696701        if event.button() == Qt.LeftButton: 
    697             if self.annotation_item is not None: 
     702            if self.annotation_item is None: 
     703                self.createNewAnnotation(QRectF(event.scenePos(), 
     704                                                event.scenePos())) 
     705                rect = self.defaultTextGeometry(event.scenePos()) 
     706 
     707            else: 
    698708                rect = QRectF(self.down_pos, event.scenePos()).normalized() 
    699709 
    700                 # Commit the annotation to the scheme. 
    701                 self.annotation.rect = rect_to_tuple(rect) 
    702                 self.document.addAnnotation(self.annotation) 
    703  
    704                 self.annotation_item.setGeometry(rect) 
    705  
    706                 self.control.rectChanged.disconnect( 
    707                     self.annotation_item.setGeometry 
    708                 ) 
    709                 self.control.hide() 
    710  
    711                 # Move the focus to the editor. 
    712                 self.annotation_item.setFramePen(QPen(Qt.NoPen)) 
    713                 self.annotation_item.setFocus(Qt.OtherFocusReason) 
    714                 self.annotation_item.startEdit() 
     710            # Commit the annotation to the scheme. 
     711            self.annotation.rect = rect_to_tuple(rect) 
     712 
     713            self.document.addAnnotation(self.annotation) 
     714 
     715            self.annotation_item.setGeometry(rect) 
     716 
     717            self.control.rectChanged.disconnect( 
     718                self.annotation_item.setGeometry 
     719            ) 
     720            self.control.hide() 
     721 
     722            # Move the focus to the editor. 
     723            self.annotation_item.setFramePen(QPen(Qt.NoPen)) 
     724            self.annotation_item.setFocus(Qt.OtherFocusReason) 
     725            self.annotation_item.startEdit() 
    715726 
    716727            self.end() 
     728 
     729    def defaultTextGeometry(self, point): 
     730        """Return the default text geometry. Used in case the user 
     731        single clicked in the scene. 
     732 
     733        """ 
     734        font = self.annotation_item.font() 
     735        metrics = QFontMetrics(font) 
     736        height = metrics.lineSpacing() 
     737        rect = QRectF(QPointF(point.x(), point.y() - height), 
     738                      QSizeF(150, height)) 
     739        return rect 
    717740 
    718741    def end(self): 
Note: See TracChangeset for help on using the changeset viewer.