Changeset 11223:3c65576f9f6a in orange


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

Added optional SizeGrip to the QuickMenu widget.

File:
1 edited

Legend:

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

    r11209 r11223  
    77 
    88from collections import namedtuple 
     9 
     10import numpy 
    911 
    1012from PyQt4.QtGui import ( 
     
    1315    QStandardItemModel, QSortFilterProxyModel, QStyleOptionToolButton, 
    1416    QStylePainter, QStyle, QApplication, QStyledItemDelegate, 
    15     QStyleOptionViewItemV4 
     17    QStyleOptionViewItemV4, QSizeGrip 
    1618) 
    1719 
     
    6769        width = max([s.width() for s in widget_hints]) 
    6870        # Take the median for the height 
    69         heights = sorted([s.height() for s in widget_hints]) 
    70         height = heights[len(heights) / 2] 
    71         return QSize(width, height) 
     71        height = numpy.median([s.height() for s in widget_hints]) 
     72 
     73        return QSize(width, int(height)) 
    7274 
    7375    def __sizeHintForTreeView(self, view): 
     
    488490        self.__search.installEventFilter(self.__navigator) 
    489491 
     492        self.__grip = WindowSizeGrip(self) 
     493        self.__grip.raise_() 
     494 
     495    def setSizeGripEnabled(self, enabled): 
     496        """Enable the resizing of the menu with a size grip in a bottom 
     497        right corner (enabled by default). 
     498 
     499        """ 
     500        if bool(enabled) != bool(self.__grip): 
     501            if self.__grip: 
     502                self.__grip.deleteLater() 
     503                self.__grip = None 
     504            else: 
     505                self.__grip = WindowSizeGrip(self) 
     506                self.__grip.raise_() 
     507 
     508    def sizeGripEnabled(self): 
     509        """Is the size grip enabled. 
     510        """ 
     511        return bool(self.__grip) 
     512 
    490513    def addPage(self, name, page): 
    491514        """Add the page and return it's index. 
     
    552575                palette = button.palette() 
    553576                button.setStyleSheet( 
    554                     "QToolButton {\n" 
     577                    "TabButton {\n" 
    555578                    "    qproperty-flat_: false;" 
    556579                    "    background-color: %s;\n" 
    557580                    "    border: none;\n" 
    558581                    "}\n" 
    559                     "QToolButton:checked {\n" 
     582                    "TabButton:checked {\n" 
    560583                    "    border: 1px solid %s;\n" 
    561584                    "}" % (brush.color().name(), 
     
    579602 
    580603        self.ensurePolished() 
    581         size = self.sizeHint() 
     604 
     605        if self.testAttribute(Qt.WA_Resized) and self.sizeGripEnabled(): 
     606            size = self.size() 
     607        else: 
     608            size = self.sizeHint() 
     609 
    582610        desktop = QApplication.desktop() 
    583611        screen_geom = desktop.availableGeometry(pos) 
     
    768796                        self.__view.setCurrentIndex(index) 
    769797                        break 
     798 
     799 
     800class WindowSizeGrip(QSizeGrip): 
     801    """Automatically positioning SizeGrip. 
     802    """ 
     803    def __init__(self, parent): 
     804        QSizeGrip.__init__(self, parent) 
     805        self.__corner = Qt.BottomRightCorner 
     806 
     807        self.resize(self.sizeHint()) 
     808 
     809        self.__updatePos() 
     810 
     811    def setCorner(self, corner): 
     812        """Set the corner where the size grip should position itself. 
     813        """ 
     814        if corner not in [Qt.TopLeftCorner, Qt.TopRightCorner, 
     815                          Qt.BottomLeftCorner, Qt.BottomRightCorner]: 
     816            raise ValueError("Qt.Corner flag expected") 
     817 
     818        if self.__corner != corner: 
     819            self.__corner = corner 
     820            self.__updatePos() 
     821 
     822    def corner(self): 
     823        """Return the corner where the size grip is positioned. 
     824        """ 
     825        return self.__corner 
     826 
     827    def eventFilter(self, obj, event): 
     828        if obj is self.window(): 
     829            if event.type() == QEvent.Resize: 
     830                self.__updatePos() 
     831 
     832        return QSizeGrip.eventFilter(self, obj, event) 
     833 
     834    def showEvent(self, event): 
     835        if self.window() != self.parent(): 
     836            log.error("%s: Can only show on a top level window.", 
     837                      type(self).__name__) 
     838 
     839        return QSizeGrip.showEvent(self, event) 
     840 
     841    def __updatePos(self): 
     842        window = self.window() 
     843 
     844        if window is not self.parent(): 
     845            return 
     846 
     847        corner = self.__corner 
     848        size = self.sizeHint() 
     849 
     850        window_geom = window.geometry() 
     851        window_size = window_geom.size() 
     852 
     853        if corner in [Qt.TopLeftCorner, Qt.BottomLeftCorner]: 
     854            x = 0 
     855        else: 
     856            x = window_geom.width() - size.width() 
     857 
     858        if corner in [Qt.TopLeftCorner, Qt.TopRightCorner]: 
     859            y = 0 
     860        else: 
     861            y = window_size.height() - size.height() 
     862 
     863        self.move(x, y) 
Note: See TracChangeset for help on using the changeset viewer.