diff --git a/src/DockWidgetBase.cpp b/src/DockWidgetBase.cpp index dc297edd..5bf1c592 100644 --- a/src/DockWidgetBase.cpp +++ b/src/DockWidgetBase.cpp @@ -778,6 +778,16 @@ DockWidgetBase *DockWidgetBase::deserialize(const LayoutSaver::DockWidget::Ptr & return dw; } +void DockWidgetBase::setUserType(int userType) +{ + d->m_userType = userType; +} + +int DockWidgetBase::userType() const +{ + return d->m_userType; +} + LayoutSaver::DockWidget::Ptr DockWidgetBase::Private::serialize() const { auto ptr = LayoutSaver::DockWidget::dockWidgetForName(q->uniqueName()); @@ -859,7 +869,6 @@ Frame *DockWidgetBase::Private::frame() const return nullptr; } - void DockWidgetBase::Private::saveLastFloatingGeometry() { if (q->isFloating() && q->isVisible()) { diff --git a/src/DockWidgetBase.h b/src/DockWidgetBase.h index de31d982..4cc6b433 100644 --- a/src/DockWidgetBase.h +++ b/src/DockWidgetBase.h @@ -410,6 +410,13 @@ public: /// added bonus of remembering the requested geometry in case it's still hidden. void setFloatingGeometry(QRect geo); + ///@brief Allows the user to set a type on this dock widget + ///The type is opaque and will not be interpreted by KDDockWidgets. + ///This type is passed to FrameWorkWidgetFactory::createTitleBar(), which the user can override + ///and return different TitleBar subclasses, depending on the type. + void setUserType(int userType); + int userType() const; + Q_SIGNALS: #ifdef KDDOCKWIDGETS_QTWIDGETS ///@brief signal emitted when the parent changed diff --git a/src/FrameworkWidgetFactory.cpp b/src/FrameworkWidgetFactory.cpp index 81b3e90d..9245d3d0 100644 --- a/src/FrameworkWidgetFactory.cpp +++ b/src/FrameworkWidgetFactory.cpp @@ -54,9 +54,9 @@ FrameworkWidgetFactory::~FrameworkWidgetFactory() } #ifdef KDDOCKWIDGETS_QTWIDGETS -Frame *DefaultWidgetFactory::createFrame(QWidgetOrQuick *parent, FrameOptions options) const +Frame *DefaultWidgetFactory::createFrame(QWidgetOrQuick *parent, FrameOptions options, int userType) const { - return new FrameWidget(parent, options); + return new FrameWidget(parent, options, userType); } TitleBar *DefaultWidgetFactory::createTitleBar(Frame *frame) const @@ -138,9 +138,9 @@ QAbstractButton* DefaultWidgetFactory::createTitleBarButton(QWidget *parent, Tit #else -Frame *DefaultWidgetFactory::createFrame(QWidgetOrQuick *parent, FrameOptions options) const +Frame *DefaultWidgetFactory::createFrame(QWidgetOrQuick *parent, FrameOptions options, int userType) const { - return new FrameQuick(parent, options); + return new FrameQuick(parent, options, userType); } TitleBar *DefaultWidgetFactory::createTitleBar(Frame *frame) const diff --git a/src/FrameworkWidgetFactory.h b/src/FrameworkWidgetFactory.h index f0e544c8..4cdead1a 100644 --- a/src/FrameworkWidgetFactory.h +++ b/src/FrameworkWidgetFactory.h @@ -83,7 +83,9 @@ public: /// DockWidgets. ///@param parent just forward to Frame's constructor ///@param options just forward to Frame's constructor - virtual Frame* createFrame(QWidgetOrQuick *parent = nullptr, FrameOptions options = FrameOption_None) const = 0; + ///@param userType corresponds to DockWidgetBase::userType() + virtual Frame* createFrame(QWidgetOrQuick *parent = nullptr, FrameOptions options = FrameOption_None, + int userType = 0) const = 0; ///@brief Called internally by the framework to create a TitleBar /// Override to provide your own TitleBar sub-class. If overridden then @@ -166,7 +168,7 @@ class DOCKS_EXPORT DefaultWidgetFactory : public FrameworkWidgetFactory Q_OBJECT public: DefaultWidgetFactory() = default; - Frame *createFrame(QWidgetOrQuick *parent, FrameOptions) const override; + Frame *createFrame(QWidgetOrQuick *parent, FrameOptions, int userType) const override; TitleBar *createTitleBar(Frame *) const override; TitleBar *createTitleBar(FloatingWindow *) const override; TabWidget *createTabWidget(Frame *parent) const override; diff --git a/src/private/DockWidgetBase_p.h b/src/private/DockWidgetBase_p.h index 48a0cf2f..20eb1c0b 100644 --- a/src/private/DockWidgetBase_p.h +++ b/src/private/DockWidgetBase_p.h @@ -151,8 +151,8 @@ public: bool m_isForceClosing = false; bool m_isMovingToSideBar = false; QSize m_lastOverlayedSize = QSize(0, 0); + int m_userType = 0; }; - } #if defined(QT_WIDGETS_LIB) diff --git a/src/private/FloatingWindow.cpp b/src/private/FloatingWindow.cpp index a7d0fd5a..39907b63 100644 --- a/src/private/FloatingWindow.cpp +++ b/src/private/FloatingWindow.cpp @@ -528,3 +528,10 @@ QMargins FloatingWindow::contentMargins() const { return { 4, 4, 4, 4 }; } + +int FloatingWindow::userType() const +{ + if (Frame *f = singleFrame()) + return f->userType(); + return 0; +} diff --git a/src/private/FloatingWindow_p.h b/src/private/FloatingWindow_p.h index fd5f1608..84c3f24e 100644 --- a/src/private/FloatingWindow_p.h +++ b/src/private/FloatingWindow_p.h @@ -57,6 +57,8 @@ public: const Frame::List frames() const; DropArea *dropArea() const { return m_dropArea; } + int userType() const; + #ifdef Q_OS_WIN void setLastHitTest(int hitTest) { m_lastHitTest = hitTest; diff --git a/src/private/Frame.cpp b/src/private/Frame.cpp index c9b654a1..0d2dbabb 100644 --- a/src/private/Frame.cpp +++ b/src/private/Frame.cpp @@ -51,12 +51,13 @@ static FrameOptions actualOptions(FrameOptions options) } } -Frame::Frame(QWidgetOrQuick *parent, FrameOptions options) +Frame::Frame(QWidgetOrQuick *parent, FrameOptions options, int userType) : LayoutGuestWidget(parent) , FocusScope(this) , m_tabWidget(Config::self().frameworkWidgetFactory()->createTabWidget(this)) , m_titleBar(Config::self().frameworkWidgetFactory()->createTitleBar(this)) , m_options(actualOptions(options)) + , m_userType(userType) { s_dbg_numFrames++; DockRegistry::self()->registerFrame(this); @@ -778,3 +779,8 @@ bool Frame::isMDI() const { return qobject_cast(m_layoutWidget) != nullptr; } + +int Frame::userType() const +{ + return m_userType; +} diff --git a/src/private/Frame_p.h b/src/private/Frame_p.h index a03442a7..8ab1c692 100644 --- a/src/private/Frame_p.h +++ b/src/private/Frame_p.h @@ -58,11 +58,13 @@ class DOCKS_EXPORT Frame Q_OBJECT Q_PROPERTY(KDDockWidgets::TitleBar* titleBar READ titleBar CONSTANT) Q_PROPERTY(int currentIndex READ currentIndex NOTIFY currentDockWidgetChanged) + Q_PROPERTY(int userType READ userType CONSTANT) Q_PROPERTY(bool isMDI READ isMDI NOTIFY isMDIChanged) public: typedef QList List; - explicit Frame(QWidgetOrQuick *parent = nullptr, FrameOptions = FrameOption_None); + explicit Frame(QWidgetOrQuick *parent = nullptr, FrameOptions = FrameOption_None, + int userType = 0); ~Frame() override; static Frame *deserialize(const LayoutSaver::Frame &); @@ -260,6 +262,9 @@ public: /// Usually no, unless you're using an MDI main window bool isMDI() const; + /// @brief See DockWidgetBase::userType() + int userType() const; + Q_SIGNALS: void currentDockWidgetChanged(KDDockWidgets::DockWidgetBase *); void numDockWidgetsChanged(); @@ -310,6 +315,7 @@ protected: virtual DockWidgetBase *dockWidgetAt_impl(int index) const = 0; virtual DockWidgetBase *currentDockWidget_impl() const = 0; virtual int nonContentsHeight() const = 0; + private: bool m_inCtor = true; // Needs to be initialized early, as pointed out by UBSAN protected: @@ -335,6 +341,7 @@ private: QPointer m_layoutItem; bool m_updatingTitleBar = false; bool m_beingDeleted = false; + int m_userType = 0; QMetaObject::Connection m_visibleWidgetCountChangedConnection; }; diff --git a/src/private/quick/FrameQuick.cpp b/src/private/quick/FrameQuick.cpp index 67a4ad8b..354f60c9 100644 --- a/src/private/quick/FrameQuick.cpp +++ b/src/private/quick/FrameQuick.cpp @@ -26,8 +26,8 @@ using namespace KDDockWidgets; -FrameQuick::FrameQuick(QWidgetAdapter *parent, FrameOptions options) - : Frame(parent, options) +FrameQuick::FrameQuick(QWidgetAdapter *parent, FrameOptions options, int userType) + : Frame(parent, options, userType) { connect(m_tabWidget->asWidget(), SIGNAL(countChanged()), this, SLOT(updateConstriants())); diff --git a/src/private/quick/FrameQuick_p.h b/src/private/quick/FrameQuick_p.h index 6677ff4c..9d149271 100644 --- a/src/private/quick/FrameQuick_p.h +++ b/src/private/quick/FrameQuick_p.h @@ -31,7 +31,8 @@ class DOCKS_EXPORT FrameQuick : public Frame Q_OBJECT Q_PROPERTY(QObject* tabWidget READ tabWidgetObj CONSTANT) public: - explicit FrameQuick(QWidgetAdapter *parent = nullptr, FrameOptions = FrameOption::FrameOption_None); + explicit FrameQuick(QWidgetAdapter *parent = nullptr, FrameOptions = FrameOption::FrameOption_None, + int userType = 0); ~FrameQuick() override; /// @reimp diff --git a/src/private/widgets/FrameWidget.cpp b/src/private/widgets/FrameWidget.cpp index 96df8f8c..afa6c4f4 100644 --- a/src/private/widgets/FrameWidget.cpp +++ b/src/private/widgets/FrameWidget.cpp @@ -49,8 +49,8 @@ public: VBoxLayout::~VBoxLayout() = default; -FrameWidget::FrameWidget(QWidget *parent, FrameOptions options) - : Frame(parent, options) +FrameWidget::FrameWidget(QWidget *parent, FrameOptions options, int userType) + : Frame(parent, options, userType) { auto vlayout = new VBoxLayout(this); vlayout->setContentsMargins(0, 0, 0, 0); diff --git a/src/private/widgets/FrameWidget_p.h b/src/private/widgets/FrameWidget_p.h index fe0f28c5..1f338a80 100644 --- a/src/private/widgets/FrameWidget_p.h +++ b/src/private/widgets/FrameWidget_p.h @@ -32,7 +32,8 @@ class DOCKS_EXPORT FrameWidget : public Frame { Q_OBJECT public: - explicit FrameWidget(QWidget *parent = nullptr, FrameOptions = FrameOption_None); + explicit FrameWidget(QWidget *parent = nullptr, FrameOptions = FrameOption_None, + int userType = 0); ~FrameWidget(); QTabBar *tabBar() const;