Changeset 11271:11be0a2d82e2 in orange


Ignore:
Timestamp:
01/23/13 19:46:15 (15 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Make it possible for help and output docks to have setable window flags.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeCanvas/application/canvasmain.py

    r11270 r11271  
    100100 
    101101 
     102class DockableWindow(QDockWidget): 
     103    def __init__(self, *args, **kwargs): 
     104        QDockWidget.__init__(self, *args, **kwargs) 
     105 
     106        # Fist show after floating 
     107        self.__firstShow = True 
     108        # flags to use while floating 
     109        self.__windowFlags = Qt.Window 
     110        self.setWindowFlags(self.__windowFlags) 
     111        self.topLevelChanged.connect(self.__on_topLevelChanged) 
     112        self.visibilityChanged.connect(self.__on_visbilityChanged) 
     113 
     114        self.__closeAction = QAction(self.tr("Close"), self, 
     115                                     shortcut=QKeySequence.Close, 
     116                                     triggered=self.close, 
     117                                     enabled=self.isFloating()) 
     118        self.topLevelChanged.connect(self.__closeAction.setEnabled) 
     119        self.addAction(self.__closeAction) 
     120 
     121    def setFloatingWindowFlags(self, flags): 
     122        """ 
     123        Set `windowFlags` to use while the widget is floating (undocked). 
     124        """ 
     125        self.__windowFlags = flags 
     126        if self.isFloating(): 
     127            self.__fixWindowFlags() 
     128 
     129    def floatingWindowFlags(self): 
     130        """ 
     131        Return the `windowFlags` used when the widget is floating. 
     132        """ 
     133        return self.__windowFlags 
     134 
     135    def __fixWindowFlags(self): 
     136        if self.isFloating(): 
     137            update_window_flags(self, self.__windowFlags) 
     138 
     139    def __on_topLevelChanged(self, floating): 
     140        if floating: 
     141            self.__firstShow = True 
     142            self.__fixWindowFlags() 
     143 
     144    def __on_visbilityChanged(self, visible): 
     145        if visible and self.isFloating() and self.__firstShow: 
     146            self.__firstShow = False 
     147            self.__fixWindowFlags() 
     148 
     149 
     150def update_window_flags(widget, flags): 
     151    currflags = widget.windowFlags() 
     152    if int(flags) != int(currflags): 
     153        hidden = widget.isHidden() 
     154        widget.setWindowFlags(flags) 
     155        # setting the flags hides the widget 
     156        if not hidden: 
     157            widget.show() 
     158 
     159 
    102160class CanvasMainWindow(QMainWindow): 
    103161    SETTINGS_VERSION = 2 
     
    108166        self.__scheme_margins_enabled = True 
    109167        self.__document_title = "untitled" 
     168        self.__first_show = True 
    110169 
    111170        self.widget_registry = None 
     
    145204        self.setCorner(Qt.BottomRightCorner, Qt.RightDockWidgetArea) 
    146205 
     206        self.setDockOptions(QMainWindow.AnimatedDocks) 
    147207        # Create an empty initial scheme inside a container with fixed 
    148208        # margins. 
     
    271331        ) 
    272332 
    273         self.output_dock = QDockWidget(self.tr("Output"), 
    274                                        objectName="output-dock") 
     333        self.output_dock = DockableWindow(self.tr("Output"), self, 
     334                                          objectName="output-dock") 
    275335        self.output_dock.setAllowedAreas(Qt.BottomDockWidgetArea) 
    276336        output_view = OutputView() 
     
    278338        # does not resize properly on first undock 
    279339        self.output_dock.setWidget(output_view) 
    280         self.addDockWidget(Qt.BottomDockWidgetArea, self.output_dock) 
    281  
    282         self.output_dock.setFloating(True) 
    283340        self.output_dock.hide() 
    284341 
    285         self.help_dock = QDockWidget(self.tr("Help"), 
    286                                      objectName="help-dock") 
     342        self.help_dock = DockableWindow(self.tr("Help"), self, 
     343                                        objectName="help-dock") 
    287344        self.help_dock.setAllowedAreas(Qt.NoDockWidgetArea) 
    288345        self.help_view = QWebView() 
    289346        self.help_dock.setWidget(self.help_view) 
    290         self.addDockWidget(Qt.LeftDockWidgetArea, self.help_dock) 
    291  
    292         self.help_dock.setFloating(True) 
    293347        self.help_dock.hide() 
    294348 
     
    13811435 
    13821436    def showEvent(self, event): 
    1383         settings = QSettings() 
    1384         settings.beginGroup("mainwindow") 
    1385  
    1386         # Restore geometry and dock/toolbar state 
    1387         state = settings.value("state") 
    1388         if state.isValid(): 
    1389             self.restoreState(state.toByteArray(), 
    1390                               version=self.SETTINGS_VERSION) 
    1391         geom_data = settings.value("geometry") 
    1392         if geom_data.isValid(): 
    1393             self.restoreGeometry(geom_data.toByteArray()) 
     1437        if self.__first_show: 
     1438            settings = QSettings() 
     1439            settings.beginGroup("mainwindow") 
     1440 
     1441            # Restore geometry and dock/toolbar state 
     1442            state = settings.value("state") 
     1443            if state.isValid(): 
     1444                self.restoreState(state.toByteArray(), 
     1445                                  version=self.SETTINGS_VERSION) 
     1446            geom_data = settings.value("geometry") 
     1447            if geom_data.isValid(): 
     1448                self.restoreGeometry(geom_data.toByteArray()) 
     1449            self.__first_show = False 
    13941450 
    13951451        return QMainWindow.showEvent(self, event) 
     
    14301486                self.help_view.setUrl(QUrl(url)) 
    14311487                self.help_dock.show() 
     1488                self.help_dock.raise_() 
    14321489                return True 
    14331490 
     
    15051562                                            defaultValue=True) 
    15061563        self.scheme_widget.setChannelNamesVisible(show_channel_names.toBool()) 
     1564 
     1565        settings.endGroup() 
     1566 
     1567        settings.beginGroup("output") 
     1568        stay_on_top = settings.value("stay-on-top", defaultValue=True) 
     1569        if stay_on_top.toBool(): 
     1570            self.output_dock.setFloatingWindowFlags(Qt.Tool) 
     1571        else: 
     1572            self.output_dock.setFloatingWindowFlags(Qt.Window) 
     1573 
     1574        dockable = settings.value("dockable", defaultValue=True,) 
     1575        if dockable.toBool(): 
     1576            self.output_dock.setAllowedAreas(Qt.BottomDockWidgetArea) 
     1577        else: 
     1578            self.output_dock.setAllowedAreas(Qt.NoDockWidgetArea) 
     1579 
     1580        settings.endGroup() 
     1581 
     1582        settings.beginGroup("help") 
     1583        stay_on_top = settings.value("stay-on-top", defaultValue=True) 
     1584        if stay_on_top.toBool(): 
     1585            self.help_dock.setFloatingWindowFlags(Qt.Tool) 
     1586        else: 
     1587            self.help_dock.setFloatingWindowFlags(Qt.Window) 
     1588 
     1589        dockable = settings.value("dockable", defaultValue=False) 
     1590        if dockable.toBool(): 
     1591            self.help_dock.setAllowedAreas(Qt.LeftDockWidgetArea | \ 
     1592                                           Qt.RightDockWidgetArea) 
     1593        else: 
     1594            self.help_dock.setAllowedAreas(Qt.NoDockWidgetArea) 
    15071595 
    15081596 
Note: See TracChangeset for help on using the changeset viewer.