Skip to content

Commit 6b2c5db

Browse files
committed
canvas: Float Widgets on Top option
1 parent a8ea66b commit 6b2c5db

File tree

3 files changed

+55
-1
lines changed

3 files changed

+55
-1
lines changed

Orange/canvas/application/canvasmain.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,13 @@ def setup_actions(self):
616616
QAction(self.tr("Reset Widget Settings..."), self,
617617
triggered=self.reset_widget_settings)
618618

619+
self.float_widgets_on_top_action = \
620+
QAction(self.tr("Float Widgets on Top"), self,
621+
checkable=True,
622+
toolTip=self.tr("Widgets are always displayed above other windows."))
623+
self.float_widgets_on_top_action.toggled.connect(
624+
self.set_float_widgets_on_top_enabled)
625+
619626
def setup_menu(self):
620627
if sys.platform == "darwin" and QT_VERSION >= 0x50000:
621628
self.__menu_glob = QMenuBar(None)
@@ -694,6 +701,7 @@ def setup_menu(self):
694701
self.view_menu.addSeparator()
695702

696703
self.view_menu.addAction(self.toogle_margins_action)
704+
self.view_menu.addAction(self.float_widgets_on_top_action)
697705
menu_bar.addMenu(self.view_menu)
698706

699707
# Options menu
@@ -760,6 +768,10 @@ def restore(self):
760768
settings.value("quick-help/visible", True, type=bool)
761769
)
762770

771+
self.float_widgets_on_top_action.setChecked(
772+
settings.value("widgets-float-on-top", False, type=bool)
773+
)
774+
763775
self.__update_from_settings()
764776

765777
def set_document_title(self, title):
@@ -1655,6 +1667,14 @@ def reset_widget_settings(self):
16551667
"Settings will still be reset at next application start",
16561668
parent=self)
16571669

1670+
def set_float_widgets_on_top_enabled(self, enabled):
1671+
wm = self.current_document().scheme().widget_manager
1672+
1673+
settings = QSettings()
1674+
settings.setValue("mainwindow/widgets-float-on-top", bool(enabled))
1675+
wm.show_widgets_on_top_changed()
1676+
1677+
16581678
def show_report_view(self):
16591679
from Orange.canvas.report.owreport import OWReport
16601680
doc = self.current_document()

Orange/canvas/config.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ def init():
8585
"Use a popover menu to select a widget when clicking on a category "
8686
"button"),
8787

88+
("mainwindow/widgets-float-on-top", bool, False,
89+
"Float widgets on top of other windows"),
90+
8891
("mainwindow/number-of-recent-schemes", int, 15,
8992
"Number of recent workflows to keep in history"),
9093

Orange/canvas/scheme/widgetsscheme.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
from AnyQt.QtWidgets import QWidget, QShortcut, QLabel, QSizePolicy, QAction
2929
from AnyQt.QtGui import QKeySequence, QWhatsThisClickedEvent
3030

31-
from AnyQt.QtCore import Qt, QObject, QCoreApplication, QTimer, QEvent
31+
from AnyQt.QtCore import Qt, QObject, QCoreApplication, QTimer, QEvent, QSettings
3232
from AnyQt.QtCore import pyqtSignal as Signal
3333

3434
from .signalmanager import SignalManager, compress_signals, can_enable_dynamic
@@ -597,6 +597,9 @@ def create_widget_instance(self, node):
597597
widget.setCaption(node.title)
598598
# befriend class Report
599599
widget._Report__report_view = self.scheme().report_view
600+
601+
self.__set_float_on_top(widget)
602+
600603
# Schedule an update with the signal manager, due to the cleared
601604
# implicit Initializing flag
602605
self.signal_manager()._update()
@@ -627,6 +630,15 @@ def widget_processing_state(self, widget):
627630
"""
628631
return self.__widget_processing_state[widget]
629632

633+
def show_widgets_on_top_changed(self):
634+
"""
635+
`Float Widgets on Top` menu option has changed.
636+
637+
Update the flag on existing widgets.
638+
"""
639+
for widget in self.__widget_for_node.values():
640+
self.__set_float_on_top(widget)
641+
630642
def __create_delayed(self):
631643
if self.__init_queue:
632644
state = self.__init_queue.popleft()
@@ -790,6 +802,25 @@ def __on_env_changed(self, key, newvalue, oldvalue):
790802
for widget in self.__widget_for_node.values():
791803
widget.workflowEnvChanged(key, newvalue, oldvalue)
792804

805+
def __set_float_on_top(self, widget):
806+
"""Set or unset widget's float on top flag"""
807+
settings = QSettings()
808+
should_float_on_top = settings.value("mainwindow/widgets-float-on-top", False, type=bool)
809+
float_on_top = widget.windowFlags() & Qt.WindowStaysOnTopHint
810+
811+
if float_on_top == should_float_on_top:
812+
return
813+
814+
widget_was_visible = widget.isVisible()
815+
if should_float_on_top:
816+
widget.setWindowFlags(Qt.WindowStaysOnTopHint)
817+
else:
818+
widget.setWindowFlags(widget.windowFlags() & ~Qt.WindowStaysOnTopHint)
819+
820+
# Changing window flags hid the widget
821+
if widget_was_visible:
822+
widget.show()
823+
793824

794825
def user_message_from_state(message_group):
795826
return UserMessage(

0 commit comments

Comments
 (0)