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

Added annotation action menus for font size and arrow color.

File:
1 edited

Legend:

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

    r11198 r11201  
    77 
    88from PyQt4.QtGui import ( 
    9     QWidget, QVBoxLayout, QInputDialog, QMenu, QAction, QKeySequence, 
    10     QUndoStack, QGraphicsItem, QGraphicsObject, QPainter, QCursor, 
    11     QGraphicsTextItem 
     9    QWidget, QVBoxLayout, QInputDialog, QMenu, QAction, QActionGroup, 
     10    QKeySequence, QUndoStack, QGraphicsItem, QGraphicsObject, 
     11    QGraphicsTextItem, QCursor, QFont, QPainter, QPixmap, QColor, 
     12    QIcon 
    1213) 
    1314 
     
    133134                    ) 
    134135 
     136        # Create a font size menu for the new annotation action. 
     137        self.__fontMenu = QMenu("Font Size", self) 
     138        self.__fontActionGroup = group = \ 
     139            QActionGroup(self, exclusive=True, 
     140                         triggered=self.__onFontSizeTriggered) 
     141 
     142        def font(size): 
     143            return QFont("Helvetica", size) 
     144 
     145        for size in [12, 14, 16, 18, 20, 22, 24]: 
     146            action = QAction("%ip" % size, group, 
     147                             checkable=True, 
     148                             font=font(size)) 
     149 
     150            self.__fontMenu.addAction(action) 
     151 
     152        group.actions()[2].setChecked(True) 
     153 
     154        self.__newTextAnnotationAction.setMenu(self.__fontMenu) 
     155 
    135156        self.__newArrowAnnotationAction = \ 
    136157            QAction(self.tr("Arrow"), self, 
     
    140161                    toggled=self.__toggleNewArrowAnnotation, 
    141162                    ) 
     163 
     164        # Create a color menu for the arrow annotation action 
     165        self.__arrowColorMenu = QMenu("Arrow Color",) 
     166        self.__arrowColorActionGroup = group = \ 
     167            QActionGroup(self, exclusive=True, 
     168                         triggered=self.__onArrowColorTriggered) 
     169 
     170        def color_icon(color): 
     171            icon = QIcon() 
     172            for size in [16, 24, 32]: 
     173                pixmap = QPixmap(size, size) 
     174                pixmap.fill(QColor(0, 0, 0, 0)) 
     175                p = QPainter(pixmap) 
     176                p.setRenderHint(QPainter.Antialiasing) 
     177                p.setBrush(color) 
     178                p.setPen(Qt.NoPen) 
     179                p.drawEllipse(1, 1, size - 2, size - 2) 
     180                p.end() 
     181                icon.addPixmap(pixmap) 
     182            return icon 
     183 
     184        for color in ["#000", "#C1272D", "#662D91", "#1F9CDF", "#39B54A"]: 
     185            icon = color_icon(QColor(color)) 
     186            action = QAction(group, icon=icon, checkable=True, 
     187                             iconVisibleInMenu=True) 
     188            action.setData(color) 
     189            self.__arrowColorMenu.addAction(action) 
     190 
     191        group.actions()[1].setChecked(True) 
     192 
     193        self.__newArrowAnnotationAction.setMenu(self.__arrowColorMenu) 
    142194 
    143195        self.__linkEnableAction = \ 
     
    400452        else: 
    401453            view.resetTransform() 
    402  
    403     def newArrowAnnotation(self): 
    404         handler = interactions.NewArrowAnnotation(self) 
    405         self.__scene.set_user_interaction_handler(handler) 
    406  
    407     def newTextAnnotation(self): 
    408         handler = interactions.NewTextAnnotation(self) 
    409         self.__scene.set_user_interaction_handler(handler) 
    410454 
    411455    def alignToGrid(self): 
     
    798842        else: 
    799843            handler = interactions.NewArrowAnnotation(self) 
     844            checked = self.__arrowColorActionGroup.checkedAction() 
     845            handler.setColor(checked.data().toPyObject()) 
     846 
    800847            handler.ended.connect(action.toggle) 
    801848 
    802849            self.__scene.set_user_interaction_handler(handler) 
     850 
     851    def __onFontSizeTriggered(self, action): 
     852        if not self.__newTextAnnotationAction.isChecked(): 
     853            # Trigger the action 
     854            self.__newTextAnnotationAction.trigger() 
     855        else: 
     856            # just update the preferred font on the interaction handler 
     857            handler = self.__scene.user_interaction_handler 
     858            if isinstance(handler, interactions.NewTextAnnotation): 
     859                handler.setFont(action.font()) 
    803860 
    804861    def __toggleNewTextAnnotation(self, checked): 
     
    818875        else: 
    819876            handler = interactions.NewTextAnnotation(self) 
     877            checked = self.__fontActionGroup.checkedAction() 
     878            handler.setFont(checked.font()) 
     879 
    820880            handler.ended.connect(action.toggle) 
    821881 
    822882            self.__scene.set_user_interaction_handler(handler) 
     883 
     884    def __onArrowColorTriggered(self, action): 
     885        if not self.__newArrowAnnotationAction.isChecked(): 
     886            # Trigger the action 
     887            self.__newArrowAnnotationAction.trigger() 
     888        else: 
     889            # just update the preferred color on the interaction handler 
     890            handler = self.__scene.user_interaction_handler 
     891            if isinstance(handler, interactions.NewArrowAnnotation): 
     892                handler.setColor(action.data().toPyObject()) 
    823893 
    824894    def __onCustomContextMenuRequested(self, pos): 
Note: See TracChangeset for help on using the changeset viewer.