From c1f15235f6c5025f3948c89b93d279bb0cf82594 Mon Sep 17 00:00:00 2001 From: Ales Erjavec Date: Thu, 14 Jun 2018 13:25:57 +0200 Subject: [PATCH 1/4] canvas: Remove window flags modification on application state change On some platforms setting window flags and/or hide/show implicitly triggers application deactivate/reactivate, triggering an endless back and forth state changes. --- Orange/canvas/scheme/widgetsscheme.py | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/Orange/canvas/scheme/widgetsscheme.py b/Orange/canvas/scheme/widgetsscheme.py index f4031e547d6..65038198544 100644 --- a/Orange/canvas/scheme/widgetsscheme.py +++ b/Orange/canvas/scheme/widgetsscheme.py @@ -25,7 +25,7 @@ import sip -from AnyQt.QtWidgets import QWidget, QShortcut, QLabel, QSizePolicy, QAction, qApp +from AnyQt.QtWidgets import QWidget, QShortcut, QLabel, QSizePolicy, QAction from AnyQt.QtGui import QKeySequence, QWhatsThisClickedEvent from AnyQt.QtCore import Qt, QObject, QCoreApplication, QTimer, QEvent @@ -260,12 +260,6 @@ def __init__(self, parent=None): # Widgets float above other windows self.__float_widgets_on_top = False - if hasattr(qApp, "applicationStateChanged"): - # disables/enables widget floating when app (de)activates - # available in Qt >= 5.2 - def reapply_float_on_top(): - self.set_float_widgets_on_top(self.__float_widgets_on_top) - qApp.applicationStateChanged.connect(reapply_float_on_top) def set_scheme(self, scheme): """ @@ -644,7 +638,6 @@ def set_float_widgets_on_top(self, float_on_top): Set `Float Widgets on Top` flag on all widgets. """ self.__float_widgets_on_top = float_on_top - for widget in self.__widget_for_node.values(): self.__set_float_on_top_flag(widget) @@ -814,10 +807,6 @@ def __on_env_changed(self, key, newvalue, oldvalue): def __set_float_on_top_flag(self, widget): """Set or unset widget's float on top flag""" should_float_on_top = self.__float_widgets_on_top - if hasattr(qApp, "applicationState"): - # only float on top when the application is active - # available in Qt >= 5.2 - should_float_on_top &= qApp.applicationState() == Qt.ApplicationActive float_on_top = widget.windowFlags() & Qt.WindowStaysOnTopHint if float_on_top == should_float_on_top: From 79fc294b3321af42c1ce093ffd3a6d6c24946ecf Mon Sep 17 00:00:00 2001 From: Ales Erjavec Date: Thu, 14 Jun 2018 13:32:33 +0200 Subject: [PATCH 2/4] canvas: Fix 'float_on_top' change check --- Orange/canvas/scheme/widgetsscheme.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Orange/canvas/scheme/widgetsscheme.py b/Orange/canvas/scheme/widgetsscheme.py index 65038198544..288cadf2c8a 100644 --- a/Orange/canvas/scheme/widgetsscheme.py +++ b/Orange/canvas/scheme/widgetsscheme.py @@ -807,7 +807,7 @@ def __on_env_changed(self, key, newvalue, oldvalue): def __set_float_on_top_flag(self, widget): """Set or unset widget's float on top flag""" should_float_on_top = self.__float_widgets_on_top - float_on_top = widget.windowFlags() & Qt.WindowStaysOnTopHint + float_on_top = bool(widget.windowFlags() & Qt.WindowStaysOnTopHint) if float_on_top == should_float_on_top: return From 118c19af9a3ab0390fdec4a65e92cc1400f977a9 Mon Sep 17 00:00:00 2001 From: Ales Erjavec Date: Thu, 14 Jun 2018 13:38:42 +0200 Subject: [PATCH 3/4] canvas: Preserve widget window flags --- Orange/canvas/scheme/widgetsscheme.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Orange/canvas/scheme/widgetsscheme.py b/Orange/canvas/scheme/widgetsscheme.py index 288cadf2c8a..40791a4885d 100644 --- a/Orange/canvas/scheme/widgetsscheme.py +++ b/Orange/canvas/scheme/widgetsscheme.py @@ -814,7 +814,7 @@ def __set_float_on_top_flag(self, widget): widget_was_visible = widget.isVisible() if should_float_on_top: - widget.setWindowFlags(Qt.WindowStaysOnTopHint) + widget.setWindowFlags(widget.windowFlags() | Qt.WindowStaysOnTopHint) else: widget.setWindowFlags(widget.windowFlags() & ~Qt.WindowStaysOnTopHint) From d4cdf788d480eeb52244f0c3e46387a53203e2ff Mon Sep 17 00:00:00 2001 From: Ales Erjavec Date: Thu, 14 Jun 2018 13:40:03 +0200 Subject: [PATCH 4/4] canvas: Initialize float on top state --- Orange/canvas/application/canvasmain.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Orange/canvas/application/canvasmain.py b/Orange/canvas/application/canvasmain.py index 6b64f5df6ce..47c71e939c0 100644 --- a/Orange/canvas/application/canvasmain.py +++ b/Orange/canvas/application/canvasmain.py @@ -1176,6 +1176,9 @@ def set_new_scheme(self, new_scheme): if self.freeze_action.isChecked(): manager.pause() + new_scheme.widget_manager.set_float_widgets_on_top( + self.float_widgets_on_top_action.isChecked() + ) scheme_doc.setScheme(new_scheme) # Send a close event to the Scheme, it is responsible for