Changeset 8186:b94a184484d2 in orange


Ignore:
Timestamp:
08/16/11 18:20:57 (3 years ago)
Author:
ales_erjavec <ales.erjavec@…>
Branch:
default
Convert:
9ea335320ac73df4e3fb1943bfc534330aa60f96
Message:

Added View menu to the menu bar.
Added Show Toolbars menu.
Moved Widget list type and icon size to the View menu.
Added Show Status Bar entry to the View menu.
(Fixes #889)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeCanvas/orngCanvas.pyw

    r8162 r8186  
    3232 
    3333        self.__dict__.update(orngEnviron.directoryNames) 
    34                 
     34             
    3535        self.defaultPic = os.path.join(self.picsDir, "Unknown.png") 
    3636        self.defaultBackground = os.path.join(self.picsDir, "frame.png") 
     
    6767        # output window 
    6868        self.output = orngOutput.OutputWindow(self) 
    69         self.output.catchException(1) 
     69#        self.output.catchException(1) 
    7070        self.output.catchOutput(1) 
    7171         
     
    8787            self.widgetIcons = None 
    8888            print "Unable to load all necessary icons. Please reinstall Orange." 
    89  
     89         
     90        ######### 
     91        # Actions 
     92        ######### 
     93        self.showMainToolbarAction = QAction("Main Toolbar", self) 
     94        self.showMainToolbarAction.setCheckable(True) 
     95        self.showMainToolbarAction.setChecked(self.settings.get("showToolbar", True)) 
     96        self.connect(self.showMainToolbarAction, 
     97                     SIGNAL("triggered(bool)"), 
     98                     self.menuItemShowToolbar) 
     99         
     100        self.showWidgetToolbarAction = QAction("Widget Toolbar", self) 
     101        self.showWidgetToolbarAction.setCheckable(True) 
     102        self.showWidgetToolbarAction.setChecked(self.settings.get("showWidgetToolbar", True)) 
     103        self.connect(self.showWidgetToolbarAction, 
     104                     SIGNAL("triggered(bool)"), 
     105                     self.menuItemShowWidgetToolbar) 
     106         
     107        # TODO: Move other actions currently defined elsewhere 
     108         
    90109        self.setStatusBar(MyStatusBar(self)) 
     110        self.statusBar().setVisible(self.settings.get("showStatusBar", True)) 
     111        self.sizeGrip = SizeGrip(self) 
     112        self.sizeGrip.setVisible(not self.settings.get("showStatusBar", True)) 
    91113         
    92114        self.updateStyle() 
    93115         
     116        self.eventNotifier = EventNotifier(parent=self) 
    94117        # create toolbar 
    95118        self.toolbar = self.addToolBar("Toolbar") 
     
    101124        # create a schema 
    102125        self.schema = orngDoc.SchemaDoc(self) 
     126        # A corner widget to reserve space for the size grip when 
     127        # the status bar is hidden 
     128        self.schema.canvasView.setCornerWidget(QWidget()) 
     129         
    103130        self.setCentralWidget(self.schema) 
    104131        self.schema.setFocus() 
     
    113140        self.toolbar.addAction(QIcon(self.file_print), "Print", self.menuItemPrinter) 
    114141        self.toolbar.addSeparator() 
    115         w = QWidget() 
    116         w.setLayout(QHBoxLayout()) 
    117          
    118         items = ["Tool box", "Tree view", "Tree view (no icons)", "Tabs without labels", "Tabs with labels"] 
    119         ind = max(len(items) - 1, self.settings["widgetListType"]) 
    120         self.widgetListTypeCB = OWGUI.comboBox(w, self.settings, "widgetListType", label="Style:", orientation="horizontal", items=items, callback=self.createWidgetsToolbar, debuggingEnabled=0) 
    121         self.widgetListTypeCB.setFocusPolicy(Qt.TabFocus) 
    122         self.toolbar.addWidget(w) 
    123          
    124         self.toolbar.addSeparator() 
    125  
    126         w = QWidget() 
    127         w.setLayout(QHBoxLayout()) 
    128         items = ["%d x %d" % (v, v) for v in self.toolbarIconSizeList] 
    129         self.settings["toolbarIconSize"] = min(len(items) - 1, self.settings["toolbarIconSize"]) 
    130         cb = OWGUI.comboBoxWithCaption(w, self.settings, "toolbarIconSize", "Icon size:", items=items, tooltip="Set the size of the widget icons in the toolbar, tool box, and tree view area", callback=self.createWidgetsToolbar, debuggingEnabled=0) 
    131         cb.setFocusPolicy(Qt.TabFocus) 
    132          
    133         self.toolbar.addWidget(w) 
     142         
     143        # Create the controls for widget list type in the main toolbar 
     144        # Commented out because this duplicates the entries in the View menu. 
     145#        def updateWidgetListType(): 
     146#            self.createWidgetsToolbar() 
     147#            ind = min(len(self.widgetListTypeActions) - 1, self.settings["widgetListType"]) 
     148#            self.widgetListTypeActions[ind].setChecked(True) 
     149#             
     150#        def updateToolbarIconSize(): 
     151#            self.createWidgetsToolbar() 
     152#            ind = min(len(self.iconSizeActions) - 1, self.settings["toolbarIconSize"]) 
     153#            self.iconSizeActions[ind].setChecked(True) 
     154#             
     155#        w = QWidget() 
     156#        w.setLayout(QHBoxLayout()) 
     157#         
     158#        items = ["Tool box", "Tree view", "Tree view (no icons)", "Tabs without labels", "Tabs with labels"] 
     159#        ind = max(len(items) - 1, self.settings["widgetListType"]) 
     160#        self.widgetListTypeCB = OWGUI.comboBox(w, self.settings, "widgetListType", 
     161#                                    label="Style:", orientation="horizontal", 
     162#                                    items=items, 
     163#                                    callback=updateWidgetListType, 
     164#                                    debuggingEnabled=0) 
     165#         
     166#        self.widgetListTypeCB.setFocusPolicy(Qt.TabFocus) 
     167#        self.toolbar.addWidget(w) 
     168#         
     169#        self.toolbar.addSeparator() 
     170# 
     171#        w = QWidget() 
     172#        w.setLayout(QHBoxLayout()) 
     173#        items = ["%d x %d" % (v, v) for v in self.toolbarIconSizeList] 
     174#        self.settings["toolbarIconSize"] = min(len(items) - 1, self.settings["toolbarIconSize"]) 
     175#        cb = OWGUI.comboBoxWithCaption(w, self.settings, "toolbarIconSize", "Icon size:", 
     176#                                       items=items, 
     177#                                       tooltip="Set the size of the widget icons in the toolbar, tool box, and tree view area", 
     178#                                       callback=updateToolbarIconSize, 
     179#                                       debuggingEnabled=0) 
     180#        cb.setFocusPolicy(Qt.TabFocus) 
     181#         
     182#        self.toolbar.addWidget(w) 
    134183         
    135184        self.freezeAction = self.toolbar.addAction("Freeze signals") 
     
    141190            self.schema.setFreeze(freeze) 
    142191             
    143         self.connect(self.freezeAction, SIGNAL("toggled(bool)"), toogleSchemaFreeze) #lambda bool: self.schema.setFreeze(bool)) 
     192        self.connect(self.freezeAction, SIGNAL("toggled(bool)"), toogleSchemaFreeze) 
    144193         
    145194        # Restore geometry before calling createWidgetsToolbar. 
     
    154203 
    155204        # center window in the desktop 
    156         # on multiheaded desktops it it does not fit 
     205        # on multiheaded desktops if it does not fit 
    157206         
    158207        desktop = qApp.desktop() 
     
    180229        self.initMenu() 
    181230        self.readRecentFiles() 
    182  
    183          
    184231         
    185232        #move to center if frame not fully contained in space 
     
    196243         
    197244 
    198         # did Orange crash the last time we used it? If yes, you will find a temSchema.tmp file 
     245        # did Orange crash the last time we used it? If yes, you will find a tempSchema.tmp file 
    199246        if not RedR: 
    200247            if os.path.exists(os.path.join(self.canvasSettingsDir, "tempSchema.tmp")): 
     
    208255            self.schema.loadDocument(sys.argv[-1]) 
    209256         
     257        # Raise the size grip so it is above all other widgets 
     258        self.sizeGrip.raise_() 
     259         
    210260        # show message box if no numpy 
    211261        qApp.processEvents() 
    212262        try: 
    213263            import numpy 
    214         except: 
     264        except ImportError: 
    215265            if QMessageBox.warning(self, '%s Canvas' % product, 'Several widgets now use numpy module, \nthat is not yet installed on this computer. \nDo you wish to download it?', QMessageBox.Ok | QMessageBox.Default, QMessageBox.Cancel | QMessageBox.Escape) == QMessageBox.Ok: 
    216266                import webbrowser 
    217267                webbrowser.open("http://sourceforge.net/projects/numpy/") 
     268                 
     269        # On Mac if the user clicks the Toolbar button in the title bar 
     270        if sys.platform == "darwin": 
     271            self.eventNotifier.attach(self, QEvent.ToolBarChange, self.toogleToolbarState) 
     272             
     273        self.output.catchException(1) 
    218274 
    219275    def updateWidgetRegistry(self): 
     
    263319        else: 
    264320            if sys.platform == "darwin": 
    265                 self.setUnifiedTitleAndToolBarOnMac(False)    
     321                self.setUnifiedTitleAndToolBarOnMac(False) 
    266322            self.widgetsToolBar = self.addToolBar("Widgets") 
    267323            self.insertToolBarBreak(self.widgetsToolBar) 
     
    290346                if self.widgetRegistry.has_key(cat) and self.widgetRegistry[cat].has_key(widgetName): 
    291347                    self.widgetShortcuts[key] = self.widgetRegistry[cat][widgetName] 
    292  
    293348 
    294349    def initMenu(self): 
     
    318373        self.menuFile.addSeparator() 
    319374        self.menuFile.addAction("E&xit", self.close, Qt.CTRL + Qt.Key_Q) 
     375         
     376        self.menuView = QMenu("&View", self) 
     377        # Show Toolbars menu 
     378        toolbars = self.createPopupMenu() 
     379        self.menuView.addMenu(toolbars) 
     380        self.menuView.addSeparator() 
     381         
     382         
     383        # Widget list type menu 
     384        actions = ["Toolbox", "Tree View", "Tree View (no icons)", 
     385                   "Tabs Without Labels", "Tabs With Labels"] 
     386        style = QMenu("Widget Toolbar Style", self) 
     387        styleGroup = QActionGroup(style) 
     388        styleGroup.setExclusive(True) 
     389         
     390        def setListType(id): 
     391            self.settings["widgetListType"] = id 
     392            self.createWidgetsToolbar() 
     393             
     394        for id, action in enumerate(actions): 
     395            action = style.addAction(action, lambda id=id: setListType(id)) 
     396            action.setCheckable(True) 
     397            styleGroup.addAction(action) 
     398            style.addAction(action) 
     399             
     400        styleActions = list(styleGroup.actions())  
     401        ind = min(len(styleActions) -1 , self.settings.get("widgetListType", -1)) 
     402        styleActions[ind].setChecked(True) 
     403        self.widgetListTypeActions = styleActions 
     404         
     405        self.menuView.addMenu(style) 
     406         
     407        # Widget toobox icon size menu 
     408        iconSize = QMenu("Widget Icon Size", self) 
     409        sizes = ["%i x %i" % (s, s) for s in self.toolbarIconSizeList] 
     410        sizeGroup = QActionGroup(iconSize) 
     411         
     412        def setIconSize(id): 
     413            self.settings["toolbarIconSize"] = id 
     414            self.createWidgetsToolbar() 
     415             
     416        for id, size in enumerate(sizes): 
     417            action = iconSize.addAction(size, lambda id=id: setIconSize(id)) 
     418            action.setCheckable(True) 
     419            sizeGroup.addAction(action) 
     420            iconSize.addAction(action) 
     421             
     422        sizeActions = list(sizeGroup.actions()) 
     423        ind = min(len(sizeActions) - 1, self.settings.get("toolbarIconSize", -1)) 
     424        sizeActions[ind].setChecked(True) 
     425        self.iconSizeActions = sizeActions 
     426         
     427        self.menuView.addMenu(iconSize) 
     428         
     429        self.menuView.addSeparator() 
     430        self.showStatusBarAction = self.menuView.addAction("Show Status Bar", 
     431                                                self.menuItemShowStatusBar) 
     432        self.showStatusBarAction.setCheckable(True) 
     433        self.showStatusBarAction.setChecked(self.settings.get("showStatusBar", True)) 
    320434 
    321435        self.menuOptions = QMenu("&Options", self) 
     
    379493        self.menuBar = QMenuBar(self) 
    380494        self.menuBar.addMenu(self.menuFile) 
     495        self.menuBar.addMenu(self.menuView) 
    381496        self.menuBar.addMenu(self.menuOptions) 
    382497        self.menuBar.addMenu(self.widgetPopup) 
     
    555670        file.close() 
    556671 
    557  
    558     def menuItemShowToolbar(self): 
    559         self.settings["showToolbar"] = not self.settings.get("showToolbar", True) 
    560         if self.settings["showToolbar"]: self.toolbar.show() 
    561         else: self.toolbar.hide() 
    562  
    563     def menuItemShowWidgetToolbar(self): 
    564         self.settings["showWidgetToolbar"] = not self.settings.get("showWidgetToolbar", True) 
    565         if self.settings["showWidgetToolbar"]: self.widgetsToolBar.show() 
    566         else: self.widgetsToolBar.hide() 
    567  
     672    def menuItemShowToolbar(self, show=True): 
     673        self.toolbar.setVisible(show) 
     674        self.settings["showToolbar"] = show 
     675        self.showMainToolbarAction.setChecked(show) 
     676 
     677    def menuItemShowWidgetToolbar(self, show=True): 
     678        self.widgetsToolBar.setVisible(show) 
     679        self.settings["showWidgetToolbar"] = show 
     680        self.showWidgetToolbarAction.setChecked(show) 
     681         
     682    def createPopupMenu(self): 
     683        """ Create a menu with show toolbar entries. 
     684        """ 
     685        toolbars = QMenu("Show Toolbars", self) 
     686        toolbars.addAction(self.showMainToolbarAction) 
     687        toolbars.addAction(self.showWidgetToolbarAction) 
     688        return toolbars 
     689         
     690    def toogleToolbarState(self): 
     691        """ Toogle the toolbar state (Mac OSX specific). This gets called when 
     692        the toolbar button in the unified title bar was clicked. 
     693        """ 
     694        state = not self.settings["showToolbar"] 
     695        self.settings["showToolbar"] = state 
     696        self.showMainToolbarAction.setChecked(state) 
     697         
    568698 
    569699    def menuItemEditWidgetShortcuts(self): 
     
    738868                Orange.misc.addons.refresh_addons(reload_path=True) 
    739869                 
    740                      
     870    def menuItemShowStatusBar(self): 
     871        state = self.showStatusBarAction.isChecked() 
     872        self.statusBar().setVisible(state) 
     873        self.sizeGrip.setVisible(not state) 
     874        self.sizeGrip.raise_() 
     875        self.settings["showStatusBar"] = state 
    741876 
    742877    def updateStyle(self): 
     
    9081043        self.parentWidget.menuItemShowOutputWindow() 
    9091044         
     1045class SizeGrip(QSizeGrip): 
     1046    def __init__(self, mainwindow): 
     1047        QSizeGrip.__init__(self, mainwindow) 
     1048        mainwindow.installEventFilter(self) 
     1049        self.updateMyPos(mainwindow) 
     1050         
     1051    def eventFilter(self, obj, event): 
     1052        if obj is self.parent() and isinstance(event, QResizeEvent): 
     1053            self.updateMyPos(obj) 
     1054             
     1055        return QSizeGrip.eventFilter(self, obj, event) 
     1056     
     1057    def updateMyPos(self, mainwindow): 
     1058        window_size = mainwindow.size() 
     1059        mysize = self.size() 
     1060        self.move(window_size.width() - mysize.width(), 
     1061                  window_size.height() - mysize.height()) 
     1062             
     1063from collections import defaultdict 
     1064class EventNotifier(QObject): 
     1065    """ An Qt event notifier. 
     1066    """ 
     1067    def __init__(self, parent=None): 
     1068        QObject.__init__(self, parent) 
     1069        self._filtering = set() 
     1070        self._attached = defaultdict(list) 
     1071         
     1072    def attach(self, obj, event, slot): 
     1073        if hasattr(event, "__iter__"): 
     1074            events = list(event) 
     1075        else: 
     1076            events = [event] 
     1077        for e in events: 
     1078            self._attached[obj, e].append(slot) 
     1079         
     1080        if obj not in self._filtering: 
     1081            self._filtering.add(obj) 
     1082            obj.installEventFilter(self) 
     1083             
     1084    def detach(self, obj, event, slot=None): 
     1085        if hasattr(event, "__iter__"): 
     1086            events = list(event) 
     1087        else: 
     1088            events = [event] 
     1089        for e in events: 
     1090            slots = self._attached.get((obj, e), []) 
     1091            if slot is None: 
     1092                slots_to_remove = slots 
     1093            else: 
     1094                slots_to_remove = [slot] 
     1095            for s in slots_to_remove:  
     1096                if s in slots: 
     1097                    slots.remove(s) 
     1098            if not slots: 
     1099                del self._attached[obj, e] 
     1100         
     1101        if not any([s for (obj_, _), s in self._attached.items() \ 
     1102                    if obj_ == obj]): 
     1103            # If obj has no more slots 
     1104            self._filtering.remove(obj) 
     1105            obj.removeEventFilter(self) 
     1106             
     1107    def eventFilter(self, obj, event): 
     1108        if obj in self._filtering: 
     1109            if (obj, type(event)) in self._attached or (obj, event.type()) in self._attached: 
     1110                slots = self._attached.get((obj, type(event)), []) + \ 
     1111                        self._attached.get((obj, event.type()), []) 
     1112                for slot in slots: 
     1113                    slot() 
     1114        return False 
     1115     
    9101116         
    9111117class OrangeQApplication(QApplication): 
Note: See TracChangeset for help on using the changeset viewer.