diff --git a/CMakeLists.txt b/CMakeLists.txt index 218f5b9e..d6ab0a85 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,7 +82,7 @@ endif() set(${PROJECT_NAME}_VERSION_MAJOR 1) set(${PROJECT_NAME}_VERSION_MINOR 2) -set(${PROJECT_NAME}_VERSION_PATCH 95) +set(${PROJECT_NAME}_VERSION_PATCH 0) set(${PROJECT_NAME}_VERSION ${${PROJECT_NAME}_VERSION_MAJOR}.${${PROJECT_NAME}_VERSION_MINOR}.${${PROJECT_NAME}_VERSION_PATCH}) set(${PROJECT_NAME}_SOVERSION "1.3") diff --git a/Changelog b/Changelog index 5798f514..b7c660b0 100644 --- a/Changelog +++ b/Changelog @@ -1,7 +1,7 @@ * v1.3.0 (unreleased) - [TODO] QtQuick support -* v1.2.0 (unreleased) +* v1.2.0 (17 December 2020) - Wayland support - Added Flag_KeepAboveIfNotUtilityWindow, so you can have keep above even if floating window is shown in the task-bar. diff --git a/conan/conanfile.py b/conan/conanfile.py index 8d97c109..8f6291e0 100644 --- a/conan/conanfile.py +++ b/conan/conanfile.py @@ -11,7 +11,7 @@ from conans import ConanFile, CMake, tools class KDDockWidgetsConan(ConanFile): name = "kddockwidgets" - version = "1.1.95" + version = "1.2.0" default_user = "kdab" default_channel = "stable" license = ("https://raw.githubusercontent.com/KDAB/KDDockWidgets/master/LICENSES/GPL-2.0-only.txt", diff --git a/debian.changelog b/debian.changelog index 8403ae8c..28ab6da2 100644 --- a/debian.changelog +++ b/debian.changelog @@ -1,3 +1,9 @@ +kddockwidgets (1.2.0) release candidate; urgency=high + + * 1.2.0 final + + -- Allen Winter Thu, 17 Dec 2020 12:00:00 -0500 + kddockwidgets (1.1.1) release candidate; urgency=high * 1.1.1 final diff --git a/kddockwidgets-rpmlintrc b/kddockwidgets-rpmlintrc new file mode 100644 index 00000000..14ec53b5 --- /dev/null +++ b/kddockwidgets-rpmlintrc @@ -0,0 +1 @@ +addFilter("E: shlib-policy-name-error") diff --git a/kddockwidgets.dsc b/kddockwidgets.dsc index 621244dc..0e2c3096 100644 --- a/kddockwidgets.dsc +++ b/kddockwidgets.dsc @@ -1,10 +1,10 @@ Format: 1.0 Source: kddockwidgets -Version: 1.1.1-1 +Version: 1.2.0-1 Binary: kddockwidgets Maintainer: Allen Winter Architecture: any Build-Depends: debhelper (>=9), cdbs, cmake, qt5-default, qtbase5-dev, libqt5x11extras5-dev Files: - 00000000000000000000000000000000 00000 kddockwidgets-1.1.1.tar.gz + 00000000000000000000000000000000 00000 kddockwidgets-1.2.0.tar.gz diff --git a/kddockwidgets.spec b/kddockwidgets.spec index cbf80bf1..948870fe 100644 --- a/kddockwidgets.spec +++ b/kddockwidgets.spec @@ -1,9 +1,10 @@ Name: kddockwidgets -Version: 1.1.1 +Version: 1.2.0 Release: 1 Summary: KDAB's Dock Widget Framework for Qt Source0: %{name}-%{version}.tar.gz Source1: %{name}-%{version}.tar.gz.asc +Source2: %{name}-rpmlintrc URL: https://github.com/KDAB/KDDockWidgets Group: System/Libraries License: GPL-2.0-only OR GPL-3.0-only @@ -86,6 +87,8 @@ cmake . -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release %{_libdir}/libkddockwidgets.so %changelog +* Thu Dec 17 2020 Allen Winter 1.2.0 + 1.2.0 final * Fri Dec 11 2020 Allen Winter 1.1.1 1.1.1 final * Mon Oct 26 2020 Allen Winter 1.1.0 diff --git a/src/MainWindowBase.cpp b/src/MainWindowBase.cpp index c359489e..97b91250 100644 --- a/src/MainWindowBase.cpp +++ b/src/MainWindowBase.cpp @@ -385,7 +385,7 @@ void MainWindowBase::overlayOnSideBar(DockWidgetBase *dw) return; const SideBar *sb = sideBarForDockWidget(dw); - if (sb == nullptr) { + if (!sb) { qWarning() << Q_FUNC_INFO << "You need to add the dock widget to the sidebar before you can overlay it"; return; } diff --git a/src/private/FloatingWindow.cpp b/src/private/FloatingWindow.cpp index 1345cd1d..31a9f3e3 100644 --- a/src/private/FloatingWindow.cpp +++ b/src/private/FloatingWindow.cpp @@ -229,7 +229,7 @@ void FloatingWindow::maybeCreateResizeHandler() { if (!KDDockWidgets::usesNativeDraggingAndResizing()) { setFlag(Qt::FramelessWindowHint, true); - setWidgetResizeHandler(new WidgetResizeHandler(this)); + setWidgetResizeHandler(new WidgetResizeHandler(false, this)); } } diff --git a/src/private/WidgetResizeHandler.cpp b/src/private/WidgetResizeHandler.cpp index acf87e1c..222e2b7c 100644 --- a/src/private/WidgetResizeHandler.cpp +++ b/src/private/WidgetResizeHandler.cpp @@ -40,8 +40,9 @@ int widgetResizeHandlerMargin = 4; //4 pixel using namespace KDDockWidgets; bool WidgetResizeHandler::s_disableAllHandlers = false; -WidgetResizeHandler::WidgetResizeHandler(QWidgetOrQuick *target) +WidgetResizeHandler::WidgetResizeHandler(bool filterIsGlobal, QWidgetOrQuick *target) : QObject(target) + , mFilterIsGlobal(filterIsGlobal) { setTarget(target); } @@ -52,14 +53,15 @@ WidgetResizeHandler::~WidgetResizeHandler() bool WidgetResizeHandler::eventFilter(QObject *o, QEvent *e) { - if (s_disableAllHandlers || o != mTarget) { + if (s_disableAllHandlers) return false; - } auto widget = qobject_cast(o); - if (!widget || !widget->isTopLevel()) { + if (!widget) + return false; + + if (!mFilterIsGlobal && (!widget->isTopLevel() || o != mTarget)) return false; - } switch (e->type()) { case QEvent::MouseButtonPress: { @@ -67,7 +69,7 @@ bool WidgetResizeHandler::eventFilter(QObject *o, QEvent *e) break; auto mouseEvent = static_cast(e); auto cursorPos = cursorPosition(Qt5Qt6Compat::eventGlobalPos(mouseEvent)); - if (cursorPos == CursorPosition::Undefined) + if (cursorPos == CursorPosition_Undefined) return false; const QRect widgetRect = mTarget->rect().marginsAdded(QMargins(widgetResizeHandlerMargin, widgetResizeHandlerMargin, widgetResizeHandlerMargin, widgetResizeHandlerMargin)); @@ -101,9 +103,9 @@ bool WidgetResizeHandler::eventFilter(QObject *o, QEvent *e) mResizeWidget = mResizeWidget && (mouseEvent->buttons() & Qt::LeftButton); const bool state = mResizeWidget; mResizeWidget = ((o == mTarget) && mResizeWidget); - mouseMoveEvent(mouseEvent); + const bool consumed = mouseMoveEvent(mouseEvent); mResizeWidget = state; - return true; + return consumed; } default: break; @@ -111,12 +113,13 @@ bool WidgetResizeHandler::eventFilter(QObject *o, QEvent *e) return false; } -void WidgetResizeHandler::mouseMoveEvent(QMouseEvent *e) +bool WidgetResizeHandler::mouseMoveEvent(QMouseEvent *e) { const QPoint globalPos = Qt5Qt6Compat::eventGlobalPos(e); if (!mResizeWidget) { - updateCursor(cursorPosition(globalPos)); - return; + const CursorPosition pos = cursorPosition(globalPos); + updateCursor(pos); + return pos != CursorPosition_Undefined; } const QRect oldGeometry = mTarget->geometry(); @@ -128,9 +131,9 @@ void WidgetResizeHandler::mouseMoveEvent(QMouseEvent *e) const int minWidth = mTarget->minimumWidth(); const int maxWidth = mTarget->maximumWidth(); switch (mCursorPos) { - case CursorPosition::TopLeft: - case CursorPosition::Left: - case CursorPosition::BottomLeft: { + case CursorPosition_TopLeft: + case CursorPosition_Left: + case CursorPosition_BottomLeft: { deltaWidth = oldGeometry.left() - globalPos.x(); newWidth = qBound(minWidth, mTarget->width() + deltaWidth, maxWidth); deltaWidth = newWidth - mTarget->width(); @@ -141,9 +144,9 @@ void WidgetResizeHandler::mouseMoveEvent(QMouseEvent *e) break; } - case CursorPosition::TopRight: - case CursorPosition::Right: - case CursorPosition::BottomRight: { + case CursorPosition_TopRight: + case CursorPosition_Right: + case CursorPosition_BottomRight: { deltaWidth = globalPos.x() - newGeometry.right(); newWidth = qBound(minWidth, mTarget->width() + deltaWidth, maxWidth); deltaWidth = newWidth - mTarget->width(); @@ -163,9 +166,9 @@ void WidgetResizeHandler::mouseMoveEvent(QMouseEvent *e) int deltaHeight = 0; int newHeight = 0; switch (mCursorPos) { - case CursorPosition::TopLeft: - case CursorPosition::Top: - case CursorPosition::TopRight: { + case CursorPosition_TopLeft: + case CursorPosition_Top: + case CursorPosition_TopRight: { deltaHeight = oldGeometry.top() - globalPos.y(); newHeight = qBound(minHeight, mTarget->height() + deltaHeight, maxHeight); deltaHeight = newHeight - mTarget->height(); @@ -176,9 +179,9 @@ void WidgetResizeHandler::mouseMoveEvent(QMouseEvent *e) break; } - case CursorPosition::BottomLeft: - case CursorPosition::Bottom: - case CursorPosition::BottomRight: { + case CursorPosition_BottomLeft: + case CursorPosition_Bottom: + case CursorPosition_BottomRight: { deltaHeight = globalPos.y() - newGeometry.bottom(); newHeight = qBound(minHeight, mTarget->height() + deltaHeight, maxHeight); deltaHeight = newHeight - mTarget->height(); @@ -194,8 +197,9 @@ void WidgetResizeHandler::mouseMoveEvent(QMouseEvent *e) if (newGeometry != mTarget->geometry()) mTarget->setGeometry(newGeometry); -} + return true; +} #ifdef Q_OS_WIN @@ -318,7 +322,11 @@ void WidgetResizeHandler::setTarget(QWidgetOrQuick *w) if (w) { mTarget = w; mTarget->setMouseTracking(true); - mTarget->installEventFilter(this); + if (mFilterIsGlobal) { + qApp->installEventFilter(this); + } else { + mTarget->installEventFilter(this); + } } else { qWarning() << "Target widget is null!"; } @@ -340,52 +348,65 @@ void WidgetResizeHandler::updateCursor(CursorPosition m) #endif switch (m) { - case CursorPosition::TopLeft: - case CursorPosition::BottomRight: - mTarget->setCursor(Qt::SizeFDiagCursor); + case CursorPosition_TopLeft: + case CursorPosition_BottomRight: + setMouseCursor(Qt::SizeFDiagCursor); break; - case CursorPosition::BottomLeft: - case CursorPosition::TopRight: - mTarget->setCursor(Qt::SizeBDiagCursor); + case CursorPosition_BottomLeft: + case CursorPosition_TopRight: + setMouseCursor(Qt::SizeBDiagCursor); break; - case CursorPosition::Top: - case CursorPosition::Bottom: - mTarget->setCursor(Qt::SizeVerCursor); + case CursorPosition_Top: + case CursorPosition_Bottom: + setMouseCursor(Qt::SizeVerCursor); break; - case CursorPosition::Left: - case CursorPosition::Right: - mTarget->setCursor(Qt::SizeHorCursor); + case CursorPosition_Left: + case CursorPosition_Right: + setMouseCursor(Qt::SizeHorCursor); break; - case CursorPosition::Undefined: - mTarget->setCursor(Qt::ArrowCursor); + case CursorPosition_Undefined: + restoreMouseCursor(); break; } } +void WidgetResizeHandler::setMouseCursor(Qt::CursorShape cursor) +{ + if (mFilterIsGlobal) + qApp->setOverrideCursor(cursor); + else + mTarget->setCursor(cursor); +} + +void WidgetResizeHandler::restoreMouseCursor() +{ + if (mFilterIsGlobal) + qApp->restoreOverrideCursor(); + else + mTarget->setCursor(Qt::ArrowCursor); +} + WidgetResizeHandler::CursorPosition WidgetResizeHandler::cursorPosition(QPoint globalPos) const { if (!mTarget) - return CursorPosition::Undefined; + return CursorPosition_Undefined; QPoint pos = mTarget->mapFromGlobal(globalPos); - if (pos.y() <= widgetResizeHandlerMargin && pos.x() <= widgetResizeHandlerMargin) { - return CursorPosition::TopLeft; - } else if (pos.y() >= mTarget->height() - widgetResizeHandlerMargin && pos.x() >= mTarget->width() - widgetResizeHandlerMargin) { - return CursorPosition::BottomRight; - } else if (pos.y() >= mTarget->height() - widgetResizeHandlerMargin && pos.x() <= widgetResizeHandlerMargin) { - return CursorPosition::BottomLeft; - } else if (pos.y() <= widgetResizeHandlerMargin && pos.x() >= mTarget->width() - widgetResizeHandlerMargin) { - return CursorPosition::TopRight; - } else if (pos.y() <= widgetResizeHandlerMargin) { - return CursorPosition::Top; - } else if (pos.y() >= mTarget->height() - widgetResizeHandlerMargin) { - return CursorPosition::Bottom; - } else if (pos.x() <= widgetResizeHandlerMargin) { - return CursorPosition::Left; - } else if ( pos.x() >= mTarget->width() - widgetResizeHandlerMargin) { - return CursorPosition::Right; - } else { - return CursorPosition::Undefined; - } + const int x = pos.x(); + const int y = pos.y(); + const int margin = widgetResizeHandlerMargin; + + int result = CursorPosition_Undefined; + if (qAbs(x) <= margin) + result |= CursorPosition_Left; + else if (qAbs(x - (mTarget->width() - margin)) <= margin) + result |= CursorPosition_Right; + + if (qAbs(y) <= margin) + result |= CursorPosition_Top; + else if (qAbs(y - (mTarget->height() - margin)) <= margin) + result |= CursorPosition_Bottom; + + return static_cast(result); } diff --git a/src/private/WidgetResizeHandler_p.h b/src/private/WidgetResizeHandler_p.h index f729954b..eea32241 100644 --- a/src/private/WidgetResizeHandler_p.h +++ b/src/private/WidgetResizeHandler_p.h @@ -30,7 +30,24 @@ class WidgetResizeHandler : public QObject { Q_OBJECT public: - explicit WidgetResizeHandler(QWidgetOrQuick *target = nullptr); + + enum CursorPosition { + CursorPosition_Undefined = 0, + CursorPosition_Left = 1, + CursorPosition_Right = 2, + CursorPosition_Top = 4, + CursorPosition_Bottom = 8, + CursorPosition_TopLeft = CursorPosition_Top | CursorPosition_Left, + CursorPosition_TopRight = CursorPosition_Top | CursorPosition_Right, + CursorPosition_BottomRight = CursorPosition_Bottom | CursorPosition_Right, + CursorPosition_BottomLeft = CursorPosition_Bottom | CursorPosition_Left + }; + + /** + * @brief CTOR + * @param target The target widget that will be resized. Also acts as parent QObject. + */ + explicit WidgetResizeHandler(bool filterIsGlobal, QWidgetOrQuick *target); ~WidgetResizeHandler() override; #ifdef Q_OS_WIN @@ -41,25 +58,17 @@ protected: bool eventFilter(QObject *o, QEvent *e) override; private: - enum class CursorPosition { - Left, - Right, - TopLeft, - TopRight, - BottomRight, - BottomLeft, - Top, - Bottom, - Undefined - }; void setTarget(QWidgetOrQuick *w); - void mouseMoveEvent(QMouseEvent *e); + bool mouseMoveEvent(QMouseEvent *e); void updateCursor(CursorPosition m); + void setMouseCursor(Qt::CursorShape cursor); + void restoreMouseCursor(); CursorPosition cursorPosition(QPoint) const; QWidgetOrQuick *mTarget = nullptr; - CursorPosition mCursorPos = CursorPosition::Undefined; + CursorPosition mCursorPos = CursorPosition_Undefined; QPoint mNewPosition; bool mResizeWidget = false; + const bool mFilterIsGlobal; }; } diff --git a/src/private/quick/MainWindowQuick.cpp b/src/private/quick/MainWindowQuick.cpp index e04e5382..b749264b 100644 --- a/src/private/quick/MainWindowQuick.cpp +++ b/src/private/quick/MainWindowQuick.cpp @@ -46,12 +46,12 @@ MainWindowQuick::~MainWindowQuick() QSize MainWindowQuick::minimumSize() const { - return multiSplitter()->rootItem()->minSize(); + return multiSplitter()->layoutMinimumSize(); } QSize MainWindowQuick::maximumSize() const { - return multiSplitter()->rootItem()->maxSizeHint(); + return multiSplitter()->layoutMaximumSizeHint(); } SideBar *MainWindowQuick::sideBar(SideBarLocation) const