diff --git a/scripts/appimage/Dockerfile b/scripts/appimage/Dockerfile index aa5b8b6c5..4d550519a 100644 --- a/scripts/appimage/Dockerfile +++ b/scripts/appimage/Dockerfile @@ -8,7 +8,7 @@ FROM centos/devtoolset-7-toolchain-centos7 as intermediate ARG QT_VERSION=5.15.11 ARG KF5_VERSION v5.110.0 -ARG KDDockWidgets_VERSION=1.7 +ARG KDDockWidgets_VERSION=2.0 ARG QCustomPlot_VERSION=2.1.1 ARG rust_demangler_VERSION=0.1.23 ARG d_demangler_VERSION=0.0.2 @@ -124,7 +124,7 @@ RUN ldconfig && \ # kddockwidgets RUN cd /opt && git clone --recursive https://github.com/KDAB/KDDockWidgets.git -b ${KDDockWidgets_VERSION} && \ - cd KDDockWidgets && mkdir build && cd build && cmake -DCMAKE_INSTALL_PREFIX=/usr .. && \ + cd KDDockWidgets && mkdir build && cd build && cmake -DCMAKE_INSTALL_PREFIX=/usr -DKDDockWidgets_EXAMPLES=0 -DKDDockWidgets_FRONTENDS="qtwidgets" .. && \ make -j && make install && cd /opt && rm -Rf KDDockWidgets FROM intermediate diff --git a/scripts/compile-test/BaseArchlinux b/scripts/compile-test/BaseArchlinux index 6dda5856d..0e10b817c 100644 --- a/scripts/compile-test/BaseArchlinux +++ b/scripts/compile-test/BaseArchlinux @@ -6,5 +6,5 @@ RUN pacman -Sy --noconfirm && \ pacman -S archlinux-keyring --noconfirm && pacman-key --init && pacman-key --populate && \ pacman -Syu --noconfirm git make qt5-x11extras cmake gcc extra-cmake-modules \ libelf gettext qt5-base ninja qcustomplot \ - threadweaver kconfigwidgets knotifications karchive syntax-highlighting \ - kiconthemes kitemviews kitemmodels kwindowsystem kio kparts solid clazy python python-yaml + threadweaver5 kconfigwidgets5 knotifications5 karchive5 syntax-highlighting5 \ + kiconthemes5 kitemviews5 kitemmodels5 kwindowsystem5 kio5 kparts5 solid5 clazy python python-yaml diff --git a/scripts/compile-test/BuildDependencies b/scripts/compile-test/BuildDependencies index 13dca6585..1416d4d76 100644 --- a/scripts/compile-test/BuildDependencies +++ b/scripts/compile-test/BuildDependencies @@ -1,10 +1,11 @@ ARG BASEIMAGE FROM $BASEIMAGE +ARG KDDOCKWIDGETS_VERSION="1.6" WORKDIR /opt -RUN git clone -b 1.6 https://github.com/KDAB/KDDockWidgets && \ +RUN git clone -b "$KDDOCKWIDGETS_VERSION" https://github.com/KDAB/KDDockWidgets && \ cd KDDockWidgets && mkdir build && cd build && \ cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr/ \ - -DKDDockWidgets_EXAMPLES=OFF -G Ninja .. && \ + -DKDDockWidgets_EXAMPLES=OFF -DKDDockWidgets_FRONTENDS="qtwidgets" -G Ninja .. && \ cmake --build . --target install && cd /opt && rm -Rf KDDockWidgets diff --git a/scripts/compile-test/BuildDependenciesQt6 b/scripts/compile-test/BuildDependenciesQt6 index 67f3935ca..54dd03877 100644 --- a/scripts/compile-test/BuildDependenciesQt6 +++ b/scripts/compile-test/BuildDependenciesQt6 @@ -1,6 +1,7 @@ ARG BASEIMAGE FROM $BASEIMAGE +ARG KDDOCKWIDGETS_VERSION WORKDIR /opt RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \ @@ -17,8 +18,8 @@ RUN wget https://www.qcustomplot.com/release/2.1.1/QCustomPlot-source.tar.gz && qmake6 CONFIG+=release CONFIG+=force_debug_info && make -j && \ cp -va libqcustomplot* /usr/lib/x86_64-linux-gnu/ && cd /opt && rm -Rf qcustomplot-source -RUN git clone -b 1.7 https://github.com/KDAB/KDDockWidgets && \ +RUN git clone -b $KDDOCKWIDGETS_VERSION https://github.com/KDAB/KDDockWidgets && \ cd KDDockWidgets && mkdir build && cd build && \ cmake -DCMAKE_BUILD_TYPE=Debug -DKDDockWidgets_QT6=ON -DCMAKE_INSTALL_PREFIX=/usr/ \ - -DKDDockWidgets_EXAMPLES=OFF -G Ninja .. && \ + -DKDDockWidgets_EXAMPLES=OFF -DKDDockWidgets_FRONTENDS="qtwidgets" -G Ninja .. && \ cmake --build . --target install && cd /opt && rm -Rf KDDockWidgets diff --git a/scripts/compile-test/build.sh b/scripts/compile-test/build.sh index de3a874ed..279df9eb8 100755 --- a/scripts/compile-test/build.sh +++ b/scripts/compile-test/build.sh @@ -23,6 +23,8 @@ buildBase() buildDependencies() { distro=$1 + kddw_version=$2 + tag=$(toLower $distro) buildBase $distro @@ -33,13 +35,14 @@ buildDependencies() fi docker build --ulimit nofile=1024:262144 -t hotspot-$tag-dependencies \ - --build-arg BASEIMAGE=hotspot-$tag-base \ + --build-arg BASEIMAGE=hotspot-$tag-base --build-arg KDDOCKWIDGETS_VERSION="$kddw_version" \ -f scripts/compile-test/BuildDependencies$suffix $extraArgs . } buildHotspotWithPresets() { distro=$1 + kddw_version=$2 tag=$(toLower $distro) suffix= @@ -47,7 +50,7 @@ buildHotspotWithPresets() suffix=Qt6 fi - buildDependencies $distro + buildDependencies $distro $kddw_version docker build --ulimit nofile=1024:262144 -t hotspot-$tag \ --build-arg BASEIMAGE=hotspot-$tag-dependencies \ -f scripts/compile-test/BuildHotspotWithPresets$suffix $extraArgs . @@ -56,18 +59,19 @@ buildHotspotWithPresets() buildHotspotWithoutPresets() { distro=$1 + kddw_version=$2 tag=$(toLower $distro) - buildDependencies $distro + buildDependencies $distro $kddw_version docker build --ulimit nofile=1024:262144 -t hotspot-$tag \ --build-arg BASEIMAGE=hotspot-$tag-dependencies \ -f scripts/compile-test/BuildHotspotWithoutPresets $extraArgs . } export DOCKER_BUILDKIT=1 -buildHotspotWithoutPresets Ubuntu20.04 -buildHotspotWithPresets Ubuntu22.04 -buildHotspotWithPresets Archlinux -buildHotspotWithPresets OpenSuseTumbleweed -buildHotspotWithoutPresets Fedora34 -buildHotspotWithPresets NeonQt6 +buildHotspotWithoutPresets Ubuntu20.04 1.6 +buildHotspotWithPresets Ubuntu22.04 2.0 +buildHotspotWithPresets Archlinux 2.0 +buildHotspotWithPresets OpenSuseTumbleweed 2.0 +buildHotspotWithoutPresets Fedora34 2.0 +buildHotspotWithPresets NeonQt6 2.0 diff --git a/src/dockwidgets.h b/src/dockwidgets.h new file mode 100644 index 000000000..98590987f --- /dev/null +++ b/src/dockwidgets.h @@ -0,0 +1,37 @@ +/* + SPDX-FileCopyrightText: Lieven Hey + SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com + + SPDX-License-Identifier: GPL-2.0-or-later +*/ + +#pragma once + +#include + +#if KDDOCKWIDGETS_VERSION < KDDOCKWIDGETS_VERSION_CHECK(2, 0, 0) +namespace KDDockWidgets { +class DockWidgetBase; +class DockWidget; +class MainWindow; +} + +using DockWidget = KDDockWidgets::DockWidget; +using DockMainWindow = KDDockWidgets::MainWindow; +using CoreDockWidget = KDDockWidgets::DockWidgetBase; +#else +namespace KDDockWidgets { +namespace QtWidgets { +class DockWidget; +class MainWindow; +} + +namespace Core { +class DockWidget; +} +} + +using DockWidget = KDDockWidgets::QtWidgets::DockWidget; +using CoreDockWidget = KDDockWidgets::Core::DockWidget; +using DockMainWindow = KDDockWidgets::QtWidgets::MainWindow; +#endif // KDDOCKWIDGETS_VERSION < KDDOCKWIDGETS_VERSION_CHECK(2, 0, 0) diff --git a/src/dockwidgetsetup.cpp b/src/dockwidgetsetup.cpp index 33d447257..7c7ff118b 100644 --- a/src/dockwidgetsetup.cpp +++ b/src/dockwidgetsetup.cpp @@ -8,15 +8,22 @@ #include "dockwidgetsetup.h" #include -#include +#include + +#if KDDOCKWIDGETS_VERSION < KDDOCKWIDGETS_VERSION_CHECK(2, 0, 0) +#include #include +#else +#include +#include +#endif // KDDOCKWIDGETS_VERSION < KDDOCKWIDGETS_VERSION_CHECK(2, 0, 0) namespace { -class DockingArea : public KDDockWidgets::MainWindow +class DockingArea : public DockMainWindow { Q_OBJECT public: - using MainWindow::MainWindow; + using DockMainWindow::MainWindow; protected: QMargins centerWidgetMargins() const override @@ -38,12 +45,21 @@ class DockingArea : public KDDockWidgets::MainWindow void setupDockWidgets() { - KDDockWidgets::Config::self().setFlags(KDDockWidgets::Config::Flag_HideTitleBarWhenTabsVisible - | KDDockWidgets::Config::Flag_TabsHaveCloseButton); + constexpr auto flags = + KDDockWidgets::Config::Flag_HideTitleBarWhenTabsVisible | KDDockWidgets::Config::Flag_TabsHaveCloseButton; + +#if KDDOCKWIDGETS_VERSION < KDDOCKWIDGETS_VERSION_CHECK(2, 0, 0) + KDDockWidgets::Config::self().setFlags(flags); KDDockWidgets::DefaultWidgetFactory::s_dropIndicatorType = KDDockWidgets::DropIndicatorType::Segmented; + +#else + KDDockWidgets::initFrontend(KDDockWidgets::FrontendType::QtWidgets); + KDDockWidgets::Config::self().setFlags(flags); + KDDockWidgets::Core::ViewFactory::s_dropIndicatorType = KDDockWidgets::DropIndicatorType::Segmented; +#endif } -KDDockWidgets::MainWindow* createDockingArea(const QString& id, QWidget* parent) +DockMainWindow* createDockingArea(const QString& id, QWidget* parent) { auto ret = new DockingArea(id, KDDockWidgets::MainWindowOption_None, parent); diff --git a/src/dockwidgetsetup.h b/src/dockwidgetsetup.h index 4e65efc4e..3881abe2a 100644 --- a/src/dockwidgetsetup.h +++ b/src/dockwidgetsetup.h @@ -7,12 +7,10 @@ #pragma once -namespace KDDockWidgets { -class MainWindow; -} +#include "dockwidgets.h" class QWidget; class QString; void setupDockWidgets(); -KDDockWidgets::MainWindow* createDockingArea(const QString& id, QWidget* parent); +DockMainWindow* createDockingArea(const QString& id, QWidget* parent); diff --git a/src/resultspage.cpp b/src/resultspage.cpp index e4591c981..41e080cad 100644 --- a/src/resultspage.cpp +++ b/src/resultspage.cpp @@ -27,8 +27,15 @@ #include +#include + +#if KDDOCKWIDGETS_VERSION < KDDOCKWIDGETS_VERSION_CHECK(2, 0, 0) #include #include +#else +#include +#include +#endif // KDDOCKWIDGETS_VERSION < KDDOCKWIDGETS_VERSION_CHECK(2, 0, 0) #include #include @@ -42,12 +49,21 @@ #endif namespace { -void showDock(KDDockWidgets::DockWidget* dock) +void showDock(DockWidget* dock) { dock->show(); - dock->setFocus(); + dock->setFocus(Qt::FocusReason::NoFocusReason); dock->setAsCurrentTab(); } + +CoreDockWidget* toDockWidget(DockWidget* dock) +{ +#if KDDOCKWIDGETS_VERSION < KDDOCKWIDGETS_VERSION_CHECK(2, 0, 0) + return dock; +#else + return dock->dockWidget(); +#endif // KDDOCKWIDGETS_VERSION < KDDOCKWIDGETS_VERSION_CHECK +} } ResultsPage::ResultsPage(PerfParser* parser, QWidget* parent) @@ -90,7 +106,7 @@ ResultsPage::ResultsPage(PerfParser* parser, QWidget* parent) ui->lostMessage->hide(); auto dockify = [](QWidget* widget, const QString& id, const QString& title, const QString& shortcut) { - auto* dock = new KDDockWidgets::DockWidget(id); + auto* dock = new DockWidget(id); dock->setWidget(widget); dock->setTitle(title); dock->toggleAction()->setShortcut(shortcut); @@ -254,7 +270,7 @@ void ResultsPage::onOpenEditor(const Data::Symbol& symbol) void ResultsPage::selectSummaryTab() { m_summaryPageDock->show(); - m_summaryPageDock->setFocus(); + m_summaryPageDock->setFocus(Qt::NoFocusReason); m_summaryPageDock->setAsCurrentTab(); } @@ -312,14 +328,18 @@ void ResultsPage::showError(const QString& message) QTimer::singleShot(5000, ui->errorWidget, &KMessageWidget::animatedHide); } -void ResultsPage::initDockWidgets(const QVector& restored) +void ResultsPage::initDockWidgets(const QVector& restored) { - Q_ASSERT(restored.contains(m_summaryPageDock)); + auto summaryPageDock = toDockWidget(m_summaryPageDock); + + Q_ASSERT(restored.contains(summaryPageDock)); const auto docks = {m_bottomUpDock, m_topDownDock, m_flameGraphDock, m_callerCalleeDock, m_timeLineDock, m_disassemblyDock, m_frequencyDock}; for (auto dock : docks) { - if (!dock || restored.contains(dock)) + auto dockWidget = toDockWidget(dock); + + if (!dock || restored.contains(dockWidget)) continue; auto initialOption = KDDockWidgets::InitialOption {}; diff --git a/src/resultspage.h b/src/resultspage.h index f9c3fd26e..20198a330 100644 --- a/src/resultspage.h +++ b/src/resultspage.h @@ -12,6 +12,8 @@ #include +#include "dockwidgets.h" + class QMenu; class QAction; @@ -23,12 +25,6 @@ namespace Data { struct Symbol; } -namespace KDDockWidgets { -class MainWindow; -class DockWidget; -class DockWidgetBase; -} - class PerfParser; class ResultsSummaryPage; class ResultsBottomUpPage; @@ -54,7 +50,7 @@ class ResultsPage : public QWidget QMenu* exportMenu() const; QList windowActions() const; - void initDockWidgets(const QVector& restored); + void initDockWidgets(const QVector& restored); public slots: void setSysroot(const QString& path); @@ -74,27 +70,27 @@ public slots: void repositionFilterBusyIndicator(); std::unique_ptr ui; - KDDockWidgets::MainWindow* m_contents; + DockMainWindow* m_contents; FilterAndZoomStack* m_filterAndZoomStack; CostContextMenu* m_costContextMenu; QMenu* m_filterMenu; QMenu* m_exportMenu; - KDDockWidgets::DockWidget* m_summaryPageDock; + DockWidget* m_summaryPageDock; ResultsSummaryPage* m_resultsSummaryPage; - KDDockWidgets::DockWidget* m_bottomUpDock; + DockWidget* m_bottomUpDock; ResultsBottomUpPage* m_resultsBottomUpPage; - KDDockWidgets::DockWidget* m_topDownDock; + DockWidget* m_topDownDock; ResultsTopDownPage* m_resultsTopDownPage; - KDDockWidgets::DockWidget* m_flameGraphDock; + DockWidget* m_flameGraphDock; ResultsFlameGraphPage* m_resultsFlameGraphPage; - KDDockWidgets::DockWidget* m_callerCalleeDock; + DockWidget* m_callerCalleeDock; ResultsCallerCalleePage* m_resultsCallerCalleePage; - KDDockWidgets::DockWidget* m_disassemblyDock; + DockWidget* m_disassemblyDock; ResultsDisassemblyPage* m_resultsDisassemblyPage; - KDDockWidgets::DockWidget* m_timeLineDock; + DockWidget* m_timeLineDock; TimeLineWidget* m_timeLineWidget; FrequencyPage* m_frequencyPage = nullptr; - KDDockWidgets::DockWidget* m_frequencyDock = nullptr; + DockWidget* m_frequencyDock = nullptr; QWidget* m_filterBusyIndicator = nullptr; bool m_timelineVisible; };