Ignore:
Timestamp:
11/09/12 14:49:58 (18 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

More code cleanup.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeCanvas/gui/toolbar.py

    r11137 r11179  
    77import logging 
    88 
    9 from collections import namedtuple 
     9from PyQt4.QtGui import QToolBar 
    1010 
    11 from PyQt4.QtGui import ( 
    12     QWidget, QToolBar, QToolButton, QAction, QBoxLayout, QStyle, QStylePainter, 
    13     QStyleOptionToolBar, QSizePolicy 
    14 ) 
    15  
    16 from PyQt4.QtCore import Qt, QSize, QPoint, QEvent, QSignalMapper 
    17  
    18 from PyQt4.QtCore import pyqtSignal as Signal, \ 
    19                          pyqtProperty as Property 
     11from PyQt4.QtCore import Qt, QSize, QEvent 
    2012 
    2113log = logging.getLogger(__name__) 
     
    2315 
    2416class DynamicResizeToolBar(QToolBar): 
    25     """A QToolBar subclass that dynamically resizes its toolbuttons 
     17    """A QToolBar subclass that dynamically resizes its tool buttons 
    2618    to fit available space (this is done by setting fixed size on the 
    2719    button instances). 
     
    3325    def __init__(self, parent=None, *args, **kwargs): 
    3426        QToolBar.__init__(self, *args, **kwargs) 
    35  
    36 #        if self.orientation() == Qt.Horizontal: 
    37 #            self.setSizePolicy(QSizePolicy.Fixed, 
    38 #                               QSizePolicy.MinimumExpanding) 
    39 #        else: 
    40 #            self.setSizePolicy(QSizePolicy.MinimumExpanding, 
    41 #                               QSizePolicy.Fixed) 
    4227 
    4328    def resizeEvent(self, event): 
     
    120105        item_size = base_size + (1 if i < remainder else 0) 
    121106        setter(item, item_size) 
    122  
    123  
    124 ######## 
    125 # Unused 
    126 ######## 
    127  
    128 _ToolBarSlot = namedtuple( 
    129     "_ToolBarAction", 
    130     ["index", 
    131      "action", 
    132      "button", 
    133      ] 
    134 ) 
    135  
    136  
    137 class ToolBarButton(QToolButton): 
    138     def __init__(self, *args, **kwargs): 
    139         QToolButton.__init__(self, *args, **kwargs) 
    140  
    141  
    142 class ToolBar(QWidget): 
    143  
    144     actionTriggered = Signal() 
    145     actionHovered = Signal() 
    146  
    147     def __init__(self, parent=None, toolButtonStyle=Qt.ToolButtonFollowStyle, 
    148                  orientation=Qt.Horizontal, iconSize=None, **kwargs): 
    149         QWidget.__init__(self, parent, **kwargs) 
    150  
    151         self.__actions = [] 
    152         self.__toolButtonStyle = toolButtonStyle 
    153         self.__orientation = orientation 
    154  
    155         if iconSize is not None: 
    156             pm = self.style().pixelMetric(QStyle.PM_ToolBarIconSize) 
    157             iconSize = QSize(pm, pm) 
    158  
    159         self.__iconSize = iconSize 
    160  
    161         if orientation == Qt.Horizontal: 
    162             layout = QBoxLayout(QBoxLayout.LeftToRight) 
    163         else: 
    164             layout = QBoxLayout(QBoxLayout.TopToBottom) 
    165  
    166         layout.setContentsMargins(0, 0, 0, 0) 
    167         layout.setSpacing(0) 
    168         self.setLayout(layout) 
    169  
    170         self.__signalMapper = QSignalMapper() 
    171  
    172     def setToolButtonStyle(self, style): 
    173         if self.__toolButtonStyle != style: 
    174             for slot in self.__actions: 
    175                 slot.button.setToolButtonStyle(style) 
    176             self.__toolButtonStyle = style 
    177  
    178     def toolButtonStyle(self): 
    179         return self.__toolButtonStyle 
    180  
    181     toolButtonStyle_ = Property(int, fget=toolButtonStyle, 
    182                                 fset=setToolButtonStyle) 
    183  
    184     def setOrientation(self, orientation): 
    185         if self.__orientation != orientation: 
    186             if orientation == Qt.Horizontal: 
    187                 self.layout().setDirection(QBoxLayout.LeftToRight) 
    188             else: 
    189                 self.layout().setDirection(QBoxLayout.TopToBottom) 
    190             sp = self.sizePolicy() 
    191             sp.transpose() 
    192             self.setSizePolicy(sp) 
    193             self.__orientation = orientation 
    194  
    195     def orientation(self): 
    196         return self.__orientation 
    197  
    198     orientation_ = Property(int, fget=orientation, fset=setOrientation) 
    199  
    200     def setIconSize(self, size): 
    201         if self.__iconSize != size: 
    202             for slot in self.__actions: 
    203                 slot.button.setIconSize(size) 
    204             self.__iconSize = size 
    205  
    206     def iconSize(self): 
    207         return self.__iconSize 
    208  
    209     iconSize_ = Property(QSize, fget=iconSize, fset=setIconSize) 
    210  
    211     def actionEvent(self, event): 
    212         action = event.action() 
    213         if event.type() == QEvent.ActionAdded: 
    214             if event.before() is not None: 
    215                 index = self._indexForAction(event.before()) + 1 
    216             else: 
    217                 index = self.count() 
    218  
    219             already_added = True 
    220             try: 
    221                 self._indexForAction(action) 
    222             except IndexError: 
    223                 already_added = False 
    224  
    225             if already_added: 
    226                 log.error("Action ('%s') already inserted", action.text()) 
    227                 return 
    228  
    229             self.__insertAction(index, action) 
    230  
    231         elif event.type() == QEvent.ActionRemoved: 
    232             try: 
    233                 index = self._indexForAction(event.action()) 
    234             except IndexError: 
    235                 log.error("Action ('%s') is not in the toolbar", action.text()) 
    236                 return 
    237  
    238             self.__removeAction(index) 
    239  
    240         elif event.type() == QEvent.ActionChanged: 
    241             pass 
    242  
    243         return QWidget.actionEvent(self, event) 
    244  
    245     def count(self): 
    246         return len(self.__actions) 
    247  
    248     def actionAt(self, point): 
    249         widget = self.childAt(QPoint) 
    250         if isinstance(widget, QToolButton): 
    251             return widget.defaultAction() 
    252  
    253     def _indexForAction(self, action): 
    254         for i, slot in enumerate(self.__actions): 
    255             if slot.action is action: 
    256                 return i 
    257         raise IndexError("Action not in the toolbar") 
    258  
    259     def __insertAction(self, index, action): 
    260         """Insert action into index. 
    261         """ 
    262         log.debug("Inserting action '%s' at %i.", action.text(), index) 
    263         button = ToolBarButton(self) 
    264         button.setDefaultAction(action) 
    265         button.setToolButtonStyle(self.toolButtonStyle_) 
    266         button.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) 
    267         button.triggered[QAction].connect(self.actionTriggered) 
    268         self.__signalMapper.setMapping(button, action) 
    269         slot = _ToolBarSlot(index, action, button) 
    270         self.__actions.insert(index, slot) 
    271  
    272         for i in range(index + 1, len(self.__actions)): 
    273             self.__actions[i] = self.__actions[i]._replace(index=i) 
    274  
    275         self.layout().insertWidget(index, button, stretch=1) 
    276  
    277     def __removeAction(self, index): 
    278         """Remove action at index. 
    279         """ 
    280         slot = self.__actions.pop(index) 
    281         log.debug("Removing action '%s'.", slot.action.text()) 
    282         for i in range(index, len(self.__actions)): 
    283             self.__actions[i] = self.__actions[i]._replace(index=i) 
    284         self.layout().takeAt(index) 
    285         slot.button.hide() 
    286         slot.button.setParent(None) 
    287         slot.button.deleteLater() 
    288  
    289     def paintEvent(self, event): 
    290         try: 
    291             painter = QStylePainter(self) 
    292             opt = QStyleOptionToolBar() 
    293             opt.initFrom(self) 
    294  
    295             opt.features = QStyleOptionToolBar.None 
    296             opt.positionOfLine = QStyleOptionToolBar.OnlyOne 
    297             opt.positionWithinLine = QStyleOptionToolBar.OnlyOne 
    298  
    299             painter.drawControl(QStyle.CE_ToolBar, opt) 
    300             print self.style() 
    301         except Exception: 
    302             log.critical("Error", exc_info=1) 
    303         painter.end() 
Note: See TracChangeset for help on using the changeset viewer.