From 7f5f88f51ad51ee3976b0e15a017833d9b137218 Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Thu, 3 Sep 2026 17:55:16 -0400 Subject: [PATCH] Use Wayland-compatible method for tab/sidebar drag and drop --- ui/pane.h | 14 +++++++++----- ui/sidebaricons.h | 34 +++++++--------------------------- ui/tabwidget.h | 40 ++++++++-------------------------------- 3 files changed, 24 insertions(+), 64 deletions(-) diff --git a/ui/pane.h b/ui/pane.h index 53f8a4bf68..27b8e3d7b3 100644 --- a/ui/pane.h +++ b/ui/pane.h @@ -3,7 +3,6 @@ #include #include #include -#include #include "uicontext.h" #include "clickablelabel.h" #include "splitter.h" @@ -14,7 +13,6 @@ class PaneHeader; class PaneHeaderContainer; class PaneHeaderFade; class CloseButton; -class TabDragIndicator; class SyncGroup; /*! @@ -125,11 +123,17 @@ class BINARYNINJAUIAPI PaneHeader : public QWidget Pane* m_owner = nullptr; std::optional m_dragStart; - TabDragIndicator* m_dragIndicator = nullptr; - bool m_dragNewWindow = false; + bool m_dragActive = false; Pane* m_dropTarget = nullptr; Qt::Edge m_dropEdge = Qt::RightEdge; - QRubberBand* m_dropIndicator = nullptr; + bool m_overPaneContainer = false; + + void startPaneDrag(const QPoint& pos); + void newWindowForDroppedPane(const QPoint& hotSpot); + bool dragUpdateTarget(QWidget* window, const QPoint& pos); + void dragClearTarget(); + + friend class PaneDragSession; public: PaneHeader(); diff --git a/ui/sidebaricons.h b/ui/sidebaricons.h index f116b0a0e9..8523d220b9 100644 --- a/ui/sidebaricons.h +++ b/ui/sidebaricons.h @@ -1,7 +1,6 @@ #pragma once #include -#include class Sidebar; class SidebarWidgetType; @@ -27,30 +26,6 @@ struct BINARYNINJAUIAPI SidebarIconInfo QRect rect; }; -/*! - \ingroup sidebar -*/ -class BINARYNINJAUIAPI SidebarIconDragIndicator : public QWidget -{ - Q_OBJECT - - QImage m_image; - QSize m_size; - QPoint m_offset; - -public: - SidebarIconDragIndicator(QImage image, QSize size, QPoint pt, QPoint offset); - void moveToMouse(QPoint pt); - - QSize size() const { return m_size; } - QPoint offset() const { return m_offset; } - -protected: - virtual QSize sizeHint() const override; - virtual QSize minimumSizeHint() const override; - virtual void paintEvent(QPaintEvent* event) override; -}; - /*! \ingroup sidebar */ @@ -67,11 +42,16 @@ class BINARYNINJAUIAPI SidebarIconsWidget : public QWidget std::optional m_dragStart; std::optional m_dragItem; bool m_dragItemAsPlaceholder = false; + bool m_dragActive = false; SidebarIconsWidget* m_dragTargetSidebar = nullptr; Pane* m_dragTargetPane = nullptr; Qt::Edge m_dragTargetPaneEdge = Qt::LeftEdge; - SidebarIconDragIndicator* m_dragIndicator = nullptr; - QRubberBand* m_dropIndicator = nullptr; + + void startIconDrag(const QPoint& pos); + bool dragUpdateTarget(QWidget* window, const QPoint& pos); + void dragClearTarget(); + + friend class SidebarIconDragSession; std::vector filterTypesForPlaceholder(const std::vector& types) const; std::optional itemForY(int y) const; diff --git a/ui/tabwidget.h b/ui/tabwidget.h index 16f57b7c2c..e9c4c649dc 100644 --- a/ui/tabwidget.h +++ b/ui/tabwidget.h @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include "uitypes.h" @@ -39,34 +38,6 @@ class BINARYNINJAUIAPI DockableTabCollection : public QObject const std::set& containers() const { return m_containers; } }; -/*! - - \ingroup tabwidget -*/ -class BINARYNINJAUIAPI TabDragIndicator : public QWidget -{ - Q_OBJECT - - QPixmap m_pixmap; - QImage m_newWindowImage; - QSize m_size, m_currentSize; - QPoint m_offset; - bool m_newWindow; - - public: - TabDragIndicator(QPixmap pixmap, QSize size, QPoint pt, QPoint offset, bool newWindow); - void moveToMouse(QPoint pt); - - QPixmap pixmap() const { return m_pixmap; } - QSize size() const { return m_size; } - QPoint offset() const { return m_offset; } - - protected: - virtual QSize sizeHint() const override; - virtual QSize minimumSizeHint() const override; - virtual void paintEvent(QPaintEvent* event) override; -}; - /*! \ingroup tabwidget @@ -158,13 +129,11 @@ class BINARYNINJAUIAPI DockableTabBar : public QAbstractScrollArea int m_closeButtonDown = -1; std::optional m_tabDragStart; - TabDragIndicator* m_tabDragIndicator = nullptr; + bool m_tabDragActive = false; DockableTabBar* m_tabDragTarget = nullptr; int m_tabDragWidth; int m_tabDragTargetIndex = -1; std::optional m_tabDragSplitEdge; - bool m_tabDragNewWindow = false; - QRubberBand* m_tabDropIndicator = nullptr; int m_placeholderIndex = -1; int m_placeholderWidth; @@ -175,6 +144,13 @@ class BINARYNINJAUIAPI DockableTabBar : public QAbstractScrollArea void updateLayout(); + void startTabDrag(const QPoint& pos); + void setDragPlaceholder(DockableTabBar* target, int index); + bool dragUpdateTarget(QWidget* window, const QPoint& pos); + void dragClearTarget(); + + friend class TabDragSession; + public: DockableTabBar(DockableTabCollection* collection); virtual ~DockableTabBar();