Changeset 11370:03af193a01d3 in orange


Ignore:
Timestamp:
02/26/13 11:48:28 (14 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Moved 'icon' and 'title' property from ToolTree widget, to quickmenu.MenuPage.

Location:
Orange/OrangeCanvas
Files:
3 edited

Legend:

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

    r11229 r11370  
    11""" 
    2 Quick widget selector menu for the canvas. 
     2========== 
     3Quick Menu 
     4========== 
     5 
     6A :class:`QuickMenu` widget provides lists of actions organized in tabs 
     7with a quick search functionality. 
    38 
    49""" 
     10 
    511import sys 
    612import logging 
     
    3844 
    3945 
     46class MenuPage(ToolTree): 
     47    """ 
     48    A menu page in a :class:`QuickMenu` widget. 
     49    """ 
     50    def __init__(self, parent=None, title=None, icon=None, **kwargs): 
     51        ToolTree.__init__(self, parent, **kwargs) 
     52 
     53        if title is None: 
     54            title = "" 
     55 
     56        if icon is None: 
     57            icon = QIcon() 
     58 
     59        self.__title = title 
     60        self.__icon = icon 
     61 
     62        # Make sure the initial model is wrapped in a ItemDisableFilter. 
     63        self.setModel(self.model()) 
     64 
     65    def setTitle(self, title): 
     66        """ 
     67        Set the title of the page. 
     68        """ 
     69        if self.__title != title: 
     70            self.__title = title 
     71            self.update() 
     72 
     73    def title(self): 
     74        """ 
     75        Return the title of this page. 
     76        """ 
     77        return self.__title 
     78 
     79    title_ = Property(unicode, fget=title, fset=setTitle) 
     80 
     81    def setIcon(self, icon): 
     82        """ 
     83        Set icon for this menu page. 
     84        """ 
     85        if self.__icon != icon: 
     86            self.__icon = icon 
     87            self.update() 
     88 
     89    def icon(self): 
     90        """ 
     91        Return the icon of this manu page. 
     92        """ 
     93        return self.__icon 
     94 
     95    icon_ = Property(QIcon, fget=icon, fset=setIcon) 
     96 
     97    def setFilterFunc(self, func): 
     98        proxyModel = self.view().model() 
     99        proxyModel.setFilterFunc(func) 
     100 
     101    def setModel(self, model): 
     102        proxyModel = ItemDisableFilter(self) 
     103        proxyModel.setSourceModel(model) 
     104        ToolTree.setModel(self, proxyModel) 
     105 
     106    def setRootIndex(self, index): 
     107        proxyModel = self.view().model() 
     108        mappedIndex = proxyModel.mapFromSource(index) 
     109        ToolTree.setRootIndex(self, mappedIndex) 
     110 
     111    def rootIndex(self): 
     112        proxyModel = self.view().model() 
     113        return proxyModel.mapToSource(ToolTree.rootIndex(self)) 
     114 
     115 
     116class ItemDisableFilter(QSortFilterProxyModel): 
     117    def __init__(self, parent=None): 
     118        QSortFilterProxyModel.__init__(self, parent) 
     119 
     120        self.__filterFunc = None 
     121 
     122    def setFilterFunc(self, func): 
     123        if not (isinstance(func, Callable) or func is None): 
     124            raise ValueError("A callable object or None expected.") 
     125 
     126        if self.__filterFunc != func: 
     127            self.__filterFunc = func 
     128            # Mark the whole model as changed. 
     129            self.dataChanged.emit(self.index(0, 0), 
     130                                  self.index(self.rowCount(), 0)) 
     131 
     132    def flags(self, index): 
     133        source = self.mapToSource(index) 
     134        flags = source.flags() 
     135 
     136        if self.__filterFunc is not None: 
     137            enabled = flags & Qt.ItemIsEnabled 
     138            if enabled and not self.__filterFunc(source): 
     139                flags ^= Qt.ItemIsEnabled 
     140 
     141        return flags 
     142 
     143 
     144class SuggestMenuPage(MenuPage): 
     145    def __init__(self, *args, **kwargs): 
     146        MenuPage.__init__(self, *args, **kwargs) 
     147 
     148    def setModel(self, model): 
     149        flat = FlattenedTreeItemModel(self) 
     150        flat.setSourceModel(model) 
     151        flat.setFlatteningMode(flat.InternalNodesDisabled) 
     152        flat.setFlatteningMode(flat.LeavesOnly) 
     153        proxy = SortFilterProxyModel(self) 
     154        proxy.setFilterCaseSensitivity(False) 
     155        proxy.setSourceModel(flat) 
     156        ToolTree.setModel(self, proxy) 
     157        self.ensureCurrent() 
     158 
     159    def setFilterFixedString(self, pattern): 
     160        proxy = self.view().model() 
     161        proxy.setFilterFixedString(pattern) 
     162        self.ensureCurrent() 
     163 
     164    def setFilterRegExp(self, pattern): 
     165        filter_proxy = self.view().model() 
     166        filter_proxy.setFilterRegExp(pattern) 
     167        self.ensureCurrent() 
     168 
     169    def setFilterWildCard(self, pattern): 
     170        filter_proxy = self.view().model() 
     171        filter_proxy.setFilterWildCard(pattern) 
     172        self.ensureCurrent() 
     173 
     174    def setFilterFunc(self, func): 
     175        filter_proxy = self.view().model() 
     176        filter_proxy.setFilterFunc(func) 
     177 
     178 
     179class SortFilterProxyModel(QSortFilterProxyModel): 
     180    def __init__(self, parent=None): 
     181        QSortFilterProxyModel.__init__(self, parent) 
     182 
     183        self.__filterFunc = None 
     184 
     185    def setFilterFunc(self, func): 
     186        if not (isinstance(func, Callable) or func is None): 
     187            raise ValueError("A callable object or None expected.") 
     188 
     189        if self.__filterFunc is not func: 
     190            self.__filterFunc = func 
     191            self.invalidateFilter() 
     192 
     193    def filterFunc(self): 
     194        return self.__filterFunc 
     195 
     196    def filterAcceptsRow(self, row, parent=QModelIndex()): 
     197        accepted = QSortFilterProxyModel.filterAcceptsRow(self, row, parent) 
     198        if accepted and self.__filterFunc is not None: 
     199            model = self.sourceModel() 
     200            index = model.index(row, self.filterKeyColumn(), parent) 
     201            return self.__filterFunc(index) 
     202        else: 
     203            return accepted 
     204 
     205 
    40206class SearchWidget(LineEdit): 
    41207    def __init__(self, parent=None, **kwargs): 
     
    50216 
    51217class MenuStackWidget(QStackedWidget): 
    52     """Stack widget for the menu pages (ToolTree instances). 
    53218    """ 
     219    Stack widget for the menu pages. 
     220    """ 
    54221 
    55222    def sizeHint(self): 
    56         """Size hint is the median size hint of the widgets contained 
    57         within. 
     223        """ 
     224        Size hint is the maximum width and median height of the widgets 
     225        contained in the stack. 
    58226 
    59227        """ 
     
    266434 
    267435class PagedMenu(QWidget): 
    268     """Tabed container for `ToolTree` instances. 
     436    """ 
     437    Tabbed container for :class:`MenuPage` instances. 
    269438    """ 
    270439    triggered = Signal(QAction) 
     
    363532        """ 
    364533        return self.__tab.button(index) 
    365  
    366  
    367 class ItemDisableFilter(QSortFilterProxyModel): 
    368     def __init__(self, parent=None): 
    369         QSortFilterProxyModel.__init__(self, parent) 
    370  
    371         self.__filterFunc = None 
    372  
    373     def setFilterFunc(self, func): 
    374         if not (isinstance(func, Callable) or func is None): 
    375             raise ValueError("A callable object or None expected.") 
    376  
    377         if self.__filterFunc != func: 
    378             self.__filterFunc = func 
    379             # Mark the whole model as changed. 
    380             self.dataChanged.emit(self.index(0, 0), 
    381                                   self.index(self.rowCount(), 0)) 
    382  
    383     def flags(self, index): 
    384         source = self.mapToSource(index) 
    385         flags = source.flags() 
    386  
    387         if self.__filterFunc is not None: 
    388             enabled = flags & Qt.ItemIsEnabled 
    389             if enabled and not self.__filterFunc(source): 
    390                 flags ^= Qt.ItemIsEnabled 
    391  
    392         return flags 
    393  
    394  
    395 class MenuPage(ToolTree): 
    396     def __init__(self, *args, **kwargs): 
    397         ToolTree.__init__(self, *args, **kwargs) 
    398  
    399         # Make sure the initial model is wrapped in a ItemDisableFilter. 
    400         self.setModel(self.model()) 
    401  
    402     def setFilterFunc(self, func): 
    403         proxyModel = self.view().model() 
    404         proxyModel.setFilterFunc(func) 
    405  
    406     def setModel(self, model): 
    407         proxyModel = ItemDisableFilter(self) 
    408         proxyModel.setSourceModel(model) 
    409         ToolTree.setModel(self, proxyModel) 
    410  
    411     def setRootIndex(self, index): 
    412         proxyModel = self.view().model() 
    413         mappedIndex = proxyModel.mapFromSource(index) 
    414         ToolTree.setRootIndex(self, mappedIndex) 
    415  
    416     def rootIndex(self): 
    417         proxyModel = self.view().model() 
    418         return proxyModel.mapToSource(ToolTree.rootIndex(self)) 
    419  
    420  
    421 class SortFilterProxyModel(QSortFilterProxyModel): 
    422     def __init__(self, parent=None): 
    423         QSortFilterProxyModel.__init__(self, parent) 
    424  
    425         self.__filterFunc = None 
    426  
    427     def setFilterFunc(self, func): 
    428         if not (isinstance(func, Callable) or func is None): 
    429             raise ValueError("A callable object or None expected.") 
    430  
    431         if self.__filterFunc is not func: 
    432             self.__filterFunc = func 
    433             self.invalidateFilter() 
    434  
    435     def filterFunc(self): 
    436         return self.__filterFunc 
    437  
    438     def filterAcceptsRow(self, row, parent=QModelIndex()): 
    439         accepted = QSortFilterProxyModel.filterAcceptsRow(self, row, parent) 
    440         if accepted and self.__filterFunc is not None: 
    441             model = self.sourceModel() 
    442             index = model.index(row, self.filterKeyColumn(), parent) 
    443             return self.__filterFunc(index) 
    444         else: 
    445             return accepted 
    446  
    447  
    448 class SuggestMenuPage(ToolTree): 
    449     def __init__(self, *args, **kwargs): 
    450         ToolTree.__init__(self, *args, **kwargs) 
    451  
    452         # Make sure the initial model is wrapped in a FlattenedTreeItemModel. 
    453         self.setModel(self.model()) 
    454  
    455     def setModel(self, model): 
    456         flat = FlattenedTreeItemModel(self) 
    457         flat.setSourceModel(model) 
    458         flat.setFlatteningMode(flat.InternalNodesDisabled) 
    459         flat.setFlatteningMode(flat.LeavesOnly) 
    460         proxy = SortFilterProxyModel(self) 
    461         proxy.setFilterCaseSensitivity(False) 
    462         proxy.setSourceModel(flat) 
    463         ToolTree.setModel(self, proxy) 
    464         self.ensureCurrent() 
    465  
    466     def setFilterFixedString(self, pattern): 
    467         proxy = self.view().model() 
    468         proxy.setFilterFixedString(pattern) 
    469         self.ensureCurrent() 
    470  
    471     def setFilterRegExp(self, pattern): 
    472         filter_proxy = self.view().model() 
    473         filter_proxy.setFilterRegExp(pattern) 
    474         self.ensureCurrent() 
    475  
    476     def setFilterWildCard(self, pattern): 
    477         filter_proxy = self.view().model() 
    478         filter_proxy.setFilterWildCard(pattern) 
    479         self.ensureCurrent() 
    480  
    481     def setFilterFunc(self, func): 
    482         filter_proxy = self.view().model() 
    483         filter_proxy.setFilterFunc(func) 
    484534 
    485535 
  • Orange/OrangeCanvas/document/tests/test_quickmenu.py

    r11333 r11370  
    33 
    44from ..quickmenu import QuickMenu, SuggestMenuPage, FlattenedTreeItemModel, \ 
    5                         ToolTree, QAction 
     5                        MenuPage, QAction 
    66 
    77from ...gui.test import QAppTestCase 
     
    2323        menu.hovered.connect(hovered) 
    2424 
    25         items_page = ToolTree() 
     25        items_page = MenuPage() 
    2626        model = QStringListModel(["one", "two", "file not found"]) 
    2727        items_page.setModel(model) 
    2828        menu.addPage("w", items_page) 
    2929 
    30         page_c = ToolTree() 
     30        page_c = MenuPage() 
    3131        menu.addPage("c", page_c) 
    3232 
     
    7171        menu.setFilterFixedString("la") 
    7272        self.singleShot(2500, lambda: menu.setFilterFixedString("ba")) 
     73        self.singleShot(5000, lambda: menu.setFilterFixedString("ab")) 
    7374        self.app.exec_() 
    7475 
  • Orange/OrangeCanvas/gui/tooltree.py

    r11366 r11370  
    11""" 
     2========= 
     3Tool Tree 
     4========= 
     5 
    26A ToolTree widget presenting the user with a set of actions 
    37organized in a tree structure. 
     
    913from PyQt4.QtGui import ( 
    1014    QTreeView, QWidget, QVBoxLayout, QSizePolicy, QStandardItemModel, 
    11     QAbstractProxyModel, QStyledItemDelegate, QStyle, QAction, QIcon 
     15    QAbstractProxyModel, QStyledItemDelegate, QStyle, QAction 
    1216) 
    1317 
    1418from PyQt4.QtCore import Qt, QEvent, QModelIndex 
    15 from PyQt4.QtCore import pyqtSignal as Signal, pyqtProperty as Property 
     19from PyQt4.QtCore import pyqtSignal as Signal 
    1620 
    1721log = logging.getLogger(__name__) 
     
    2125    """ 
    2226    A ListView like presentation of a list of actions. 
    23  
    2427    """ 
    2528    triggered = Signal(QAction) 
    2629    hovered = Signal(QAction) 
    2730 
    28     def __init__(self, parent=None, title=None, icon=None, **kwargs): 
     31    def __init__(self, parent=None, **kwargs): 
    2932        QTreeView.__init__(self, parent, **kwargs) 
    3033        self.setSizePolicy(QSizePolicy.MinimumExpanding, 
    3134                           QSizePolicy.Expanding) 
    32  
    33         if title is None: 
    34             title = "" 
    35  
    36         if icon is None: 
    37             icon = QIcon() 
    38  
    39         self.__title = title 
    40         self.__icon = icon 
    4135 
    4236        self.__model = QStandardItemModel() 
     
    7266 
    7367        self.setLayout(layout) 
    74  
    75     def setTitle(self, title): 
    76         """ 
    77         Set the title 
    78         """ 
    79         if self.__title != title: 
    80             self.__title = title 
    81             self.update() 
    82  
    83     def title(self): 
    84         """ 
    85         Return the title of this tool tree. 
    86         """ 
    87         return self.__title 
    88  
    89     title_ = Property(unicode, fget=title, fset=setTitle) 
    90  
    91     def setIcon(self, icon): 
    92         """ 
    93         Set icon for this tool tree. 
    94         """ 
    95         if self.__icon != icon: 
    96             self.__icon = icon 
    97             self.update() 
    98  
    99     def icon(self): 
    100         """ 
    101         Return the icon of this tool tree. 
    102         """ 
    103         return self.__icon 
    104  
    105     icon_ = Property(QIcon, fget=icon, fset=setIcon) 
    10668 
    10769    def setFlattened(self, flatten): 
Note: See TracChangeset for help on using the changeset viewer.