From a0f6021d83be89261ba515ff190572ff595fe6f0 Mon Sep 17 00:00:00 2001 From: Ales Erjavec Date: Thu, 18 Jun 2026 14:18:08 +0200 Subject: [PATCH 1/2] preprocess: Fix drop index selection on Wayland Use event.position() instead of mapping from QCursor.pos --- Orange/widgets/data/utils/preprocess.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Orange/widgets/data/utils/preprocess.py b/Orange/widgets/data/utils/preprocess.py index 89938ab5aad..a26f2986b08 100644 --- a/Orange/widgets/data/utils/preprocess.py +++ b/Orange/widgets/data/utils/preprocess.py @@ -16,7 +16,7 @@ ) from AnyQt.QtGui import ( - QCursor, QIcon, QPainter, QPixmap, QStandardItemModel, + QIcon, QPainter, QPixmap, QStandardItemModel, QDrag, QKeySequence ) @@ -291,7 +291,7 @@ def dragMoveEvent(self, event): if event.mimeData().hasFormat(self.MimeType) and \ self.model() is not None: event.accept() - self._setDropIndicatorAt(event.pos()) + self._setDropIndicatorAt(event.position()) return True else: return False @@ -646,8 +646,7 @@ def setIcon(self, index, icon): def dropEvent(self, event): """Reimplemented.""" layout = self.__flowlayout - index = self.__insertIndexAt(self.mapFromGlobal(QCursor.pos())) - + index = self.__insertIndexAt(event.position()) if event.mimeData().hasFormat("application/x-internal-move") and \ event.source() is self: # Complete the internal move @@ -677,8 +676,7 @@ def dragEnterEvent(self, event): def dragMoveEvent(self, event): """Reimplemented.""" - pos = self.mapFromGlobal(QCursor.pos()) - self.__setDropIndicatorAt(pos) + self.__setDropIndicatorAt(event.position()) def dragLeaveEvent(self, event): """Reimplemented.""" From eb1e48122eee9aecae9b904142eddb44b2625037 Mon Sep 17 00:00:00 2001 From: Ales Erjavec Date: Tue, 23 Jun 2026 14:23:32 +0200 Subject: [PATCH 2/2] owrocanalysis: Fix tooltip positioning on Wayland Pass target widget instance in QToolTip.showText --- Orange/widgets/evaluate/owrocanalysis.py | 4 ++-- Orange/widgets/evaluate/tests/test_owrocanalysis.py | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Orange/widgets/evaluate/owrocanalysis.py b/Orange/widgets/evaluate/owrocanalysis.py index 7b9f99152ca..2882ea7e55f 100644 --- a/Orange/widgets/evaluate/owrocanalysis.py +++ b/Orange/widgets/evaluate/owrocanalysis.py @@ -696,7 +696,7 @@ def _on_mouse_moved(self, pos): curr_thresh = np.compress(mask, cache_thresh).tolist() curr_clf = np.compress(mask, cache_clf).tolist() else: - QToolTip.showText(QCursor.pos(), "") + QToolTip.showText(QCursor.pos(), "", self.plotview) self._tooltip_cache = None if curr_thresh: @@ -721,7 +721,7 @@ def _on_mouse_moved(self, pos): clf_names = self.classifier_names msg = "Thresholds:\n" + "\n".join(["({:s}) {:.3f}".format(clf_names[i], thresh) for i, thresh in zip(valid_clf, valid_thresh)]) - QToolTip.showText(QCursor.pos(), msg) + QToolTip.showText(QCursor.pos(), msg, self.plotview) self._tooltip_cache = (pt, valid_thresh, valid_clf, ave_mode) def _on_target_changed(self): diff --git a/Orange/widgets/evaluate/tests/test_owrocanalysis.py b/Orange/widgets/evaluate/tests/test_owrocanalysis.py index d632b55df20..19dfe164194 100644 --- a/Orange/widgets/evaluate/tests/test_owrocanalysis.py +++ b/Orange/widgets/evaluate/tests/test_owrocanalysis.py @@ -234,7 +234,7 @@ def test_tooltips(self): pos = item.mapToScene(0, 0.1) pos = view.mapFromScene(pos) mouseMove(view.viewport(), pos) - (_, text), _ = show_text.call_args + (_, text, *_), _ = show_text.call_args self.assertIn("(#1) 0.900", text) self.assertNotIn("#2", text) @@ -242,13 +242,13 @@ def test_tooltips(self): pos = item.mapToScene(0.0, 0.0) pos = view.mapFromScene(pos) mouseMove(view.viewport(), pos) - (_, text), _ = show_text.call_args + (_, text, *_), _ = show_text.call_args self.assertIn("(#1) 1.000\n(#2) 1.000", text) pos = item.mapToScene(0.1, 0.3) pos = view.mapFromScene(pos) mouseMove(view.viewport(), pos) - (_, text), _ = show_text.call_args + (_, text, *_), _ = show_text.call_args self.assertIn("(#1) 0.600\n(#2) 0.590", text) show_text.reset_mock() @@ -256,7 +256,7 @@ def test_tooltips(self): self.widget.roc_averaging = OWROCAnalysis.Threshold self.widget._replot() mouseMove(view.viewport(), pos) - (_, text), _ = show_text.call_args + (_, text, *_), _ = show_text.call_args self.assertIn("(#1) 0.600\n(#2) 0.590", text) show_text.reset_mock()