From e1cc716d15732b9ca2a7c3bb80326bd551abb944 Mon Sep 17 00:00:00 2001 From: Mikhail Shashin Date: Sun, 14 Dec 2025 05:04:13 +0300 Subject: [PATCH 1/2] Refactor tab names management: extract TabNamesUtils and optimize QSettings usage --- AdaptixClient/CMakeLists.txt | 2 + .../Headers/UI/Widgets/AbstractDock.h | 16 +++++- AdaptixClient/Headers/Utils/TabNamesUtils.h | 17 ++++++ .../Libs/kddockwidgets/kddockwidgets_export.h | 1 + .../kddockwidgets/qtwidgets/views/Stack.cpp | 55 ++++++++++++++++++- .../Source/UI/Widgets/SessionsTableWidget.cpp | 9 +++ AdaptixClient/Source/Utils/TabNamesUtils.cpp | 55 +++++++++++++++++++ 7 files changed, 152 insertions(+), 3 deletions(-) create mode 100644 AdaptixClient/Headers/Utils/TabNamesUtils.h create mode 100644 AdaptixClient/Source/Utils/TabNamesUtils.cpp diff --git a/AdaptixClient/CMakeLists.txt b/AdaptixClient/CMakeLists.txt index b08fa7e0..8381c42b 100644 --- a/AdaptixClient/CMakeLists.txt +++ b/AdaptixClient/CMakeLists.txt @@ -153,6 +153,7 @@ SET( HEADERS Headers/Utils/NonBlockingDialogs.h Headers/Utils/FontManager.h Headers/Utils/TitleBarStyle.h + Headers/Utils/TabNamesUtils.h Headers/UI/Widgets/DockWidgetRegister.h ) @@ -233,6 +234,7 @@ add_executable(AdaptixClient Source/Utils/NonBlockingDialogs.cpp Source/Utils/FontManager.cpp Source/Utils/TitleBarStyle.cpp + Source/Utils/TabNamesUtils.cpp ) target_compile_definitions( diff --git a/AdaptixClient/Headers/UI/Widgets/AbstractDock.h b/AdaptixClient/Headers/UI/Widgets/AbstractDock.h index 732c0e6c..77ba5598 100644 --- a/AdaptixClient/Headers/UI/Widgets/AbstractDock.h +++ b/AdaptixClient/Headers/UI/Widgets/AbstractDock.h @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #ifdef __GNUC__ @@ -87,7 +88,20 @@ protected: public: DockTab(const QString &tabName, const QString &projectName, const QString &icon = "") { dockWidget = new KDDockWidgets::QtWidgets::DockWidget(tabName + ":Dock-" + projectName, KDDockWidgets::DockWidgetOption_None, KDDockWidgets::LayoutSaverOption::None); - dockWidget->setTitle(tabName); + + QString displayTitle = tabName; + bool isRenameable = tabName.startsWith("Console [") || + tabName.startsWith("Terminal [") || + tabName.startsWith("Files [") || + tabName.startsWith("Processes ["); + + if (isRenameable) { + QString customTitle = TabNamesUtils::getCustomTabName(tabName, projectName); + if (!customTitle.isEmpty()) + displayTitle = customTitle; + } + + dockWidget->setTitle(displayTitle); if (!icon.isEmpty()) dockWidget->setIcon(QIcon(icon), KDDockWidgets::IconPlace::TabBar); diff --git a/AdaptixClient/Headers/Utils/TabNamesUtils.h b/AdaptixClient/Headers/Utils/TabNamesUtils.h new file mode 100644 index 00000000..c2ced488 --- /dev/null +++ b/AdaptixClient/Headers/Utils/TabNamesUtils.h @@ -0,0 +1,17 @@ +#ifndef ADAPTIXCLIENT_TABNAMESUTILS_H +#define ADAPTIXCLIENT_TABNAMESUTILS_H + +#include + +class TabNamesUtils +{ +public: + static void removeAgentTabNames(const QString &agentId, const QString &projectName); + static QString getCustomTabName(const QString &tabName, const QString &projectName); + static void setCustomTabName(const QString &uniqueName, const QString &customTitle); + static void removeCustomTabName(const QString &uniqueName); + static bool hasCustomTabName(const QString &uniqueName); + static QString buildUniqueName(const QString &tabName, const QString &projectName); +}; + +#endif // ADAPTIXCLIENT_TABNAMESUTILS_H diff --git a/AdaptixClient/Libs/kddockwidgets/kddockwidgets_export.h b/AdaptixClient/Libs/kddockwidgets/kddockwidgets_export.h index 0a3a2791..e132c22e 100644 --- a/AdaptixClient/Libs/kddockwidgets/kddockwidgets_export.h +++ b/AdaptixClient/Libs/kddockwidgets/kddockwidgets_export.h @@ -33,6 +33,7 @@ # define KDDOCKWIDGETS_DEPRECATED_NO_EXPORT KDDOCKWIDGETS_NO_EXPORT KDDOCKWIDGETS_DEPRECATED #endif +/* NOLINTNEXTLINE(readability-avoid-unconditional-preprocessor-if) */ #if 0 /* DEFINE_NO_DEPRECATED */ # ifndef KDDOCKWIDGETS_NO_DEPRECATED # define KDDOCKWIDGETS_NO_DEPRECATED diff --git a/AdaptixClient/Libs/kddockwidgets/qtwidgets/views/Stack.cpp b/AdaptixClient/Libs/kddockwidgets/qtwidgets/views/Stack.cpp index 67731372..62e30ff6 100644 --- a/AdaptixClient/Libs/kddockwidgets/qtwidgets/views/Stack.cpp +++ b/AdaptixClient/Libs/kddockwidgets/qtwidgets/views/Stack.cpp @@ -33,6 +33,8 @@ #include #include #include +#include +#include #include "kdbindings/signal.h" @@ -256,10 +258,59 @@ void Stack::showContextMenu(QPoint pos) // Convert pos to tabBar coordinates for tabAt() check QPoint tabBarPos = tabBar->mapFrom(this, pos); + int clickedTabIndex = tabBar->tabAt(tabBarPos); - // Click on a tab => No menu - if (tabBar->tabAt(tabBarPos) >= 0) + if (clickedTabIndex >= 0) { + auto* coreDw = m_stack->tabBar()->dockWidgetAt(clickedTabIndex); + if (!coreDw) + return; + + QString uniqueName = QString::fromStdString(coreDw->uniqueName().toStdString()); + bool isRenameable = uniqueName.startsWith("Console [") || + uniqueName.startsWith("Terminal [") || + uniqueName.startsWith("Files [") || + uniqueName.startsWith("Processes ["); + + if (!isRenameable) + return; + + QSettings settings("Adaptix", "AdaptixClient"); + bool hasCustomName = settings.contains("TabNames/" + uniqueName); + + QMenu menu(this); + + menu.addAction("Rename", this, [this, clickedTabIndex, coreDw]() { + bool ok; + QString currentTitle = tabText(clickedTabIndex); + QString newTitle = QInputDialog::getText(this, "Rename Tab", + "Enter new name:", QLineEdit::Normal, currentTitle, &ok); + + if (ok && !newTitle.isEmpty() && newTitle != currentTitle) { + setTabText(clickedTabIndex, newTitle); + coreDw->setTitle(newTitle); + + QString uniqueName = QString::fromStdString(coreDw->uniqueName().toStdString()); + QSettings settings("Adaptix", "AdaptixClient"); + settings.setValue("TabNames/" + uniqueName, newTitle); + } + }); + + if (hasCustomName) { + menu.addAction("Reset Name", this, [this, clickedTabIndex, coreDw]() { + QString uniqueName = QString::fromStdString(coreDw->uniqueName().toStdString()); + QString originalName = uniqueName.split(":Dock-").first(); + + setTabText(clickedTabIndex, originalName); + coreDw->setTitle(originalName); + + QSettings settings("Adaptix", "AdaptixClient"); + settings.remove("TabNames/" + uniqueName); + }); + } + + menu.exec(mapToGlobal(pos)); return; + } // Right click is allowed only on the tabs area // Create a rectangle covering the tab bar area, expanded to full width of the widget diff --git a/AdaptixClient/Source/UI/Widgets/SessionsTableWidget.cpp b/AdaptixClient/Source/UI/Widgets/SessionsTableWidget.cpp index 48d885b3..4c32f60d 100644 --- a/AdaptixClient/Source/UI/Widgets/SessionsTableWidget.cpp +++ b/AdaptixClient/Source/UI/Widgets/SessionsTableWidget.cpp @@ -14,6 +14,7 @@ #include #include #include +#include REGISTER_DOCK_WIDGET(SessionsTableWidget, "Sessions", true) @@ -167,6 +168,9 @@ void SessionsTableWidget::RemoveAgentItem(const QString &agentId) const Agent* agent = adaptixWidget->AgentsMap[agentId]; adaptixWidget->AgentsMap.remove(agentId); + QString projectName = adaptixWidget->GetProfile()->GetProject(); + TabNamesUtils::removeAgentTabNames(agentId, projectName); + if (agent->Console) delete agent->Console; if (agent->FileBrowser) @@ -222,9 +226,14 @@ void SessionsTableWidget::UpdateData() const void SessionsTableWidget::Clear() const { + QString projectName = adaptixWidget->GetProfile()->GetProject(); + for (auto agentId : adaptixWidget->AgentsMap.keys()) { Agent* agent = adaptixWidget->AgentsMap[agentId]; adaptixWidget->AgentsMap.remove(agentId); + + TabNamesUtils::removeAgentTabNames(agentId, projectName); + delete agent->Console; delete agent->FileBrowser; delete agent->ProcessBrowser; diff --git a/AdaptixClient/Source/Utils/TabNamesUtils.cpp b/AdaptixClient/Source/Utils/TabNamesUtils.cpp new file mode 100644 index 00000000..7a17389c --- /dev/null +++ b/AdaptixClient/Source/Utils/TabNamesUtils.cpp @@ -0,0 +1,55 @@ +#include +#include +#include + +namespace { + constexpr const char* SETTINGS_ORG = "Adaptix"; + constexpr const char* SETTINGS_APP = "AdaptixClient"; + constexpr const char* TAB_NAMES_PREFIX = "TabNames/"; + const QStringList TAB_TYPES = {"Console [", "Terminal [", "Files [", "Processes ["}; + + QSettings& getSettings() { + static QSettings settings(SETTINGS_ORG, SETTINGS_APP); + return settings; + } +} + +void TabNamesUtils::removeAgentTabNames(const QString &agentId, const QString &projectName) +{ + QSettings& settings = getSettings(); + + for (const QString& tabType : TAB_TYPES) { + QString uniqueName = tabType + agentId + "]:Dock-" + projectName; + settings.remove(TAB_NAMES_PREFIX + uniqueName); + } +} + +QString TabNamesUtils::getCustomTabName(const QString &tabName, const QString &projectName) +{ + QString uniqueName = buildUniqueName(tabName, projectName); + QSettings& settings = getSettings(); + return settings.value(TAB_NAMES_PREFIX + uniqueName).toString(); +} + +void TabNamesUtils::setCustomTabName(const QString &uniqueName, const QString &customTitle) +{ + QSettings& settings = getSettings(); + settings.setValue(TAB_NAMES_PREFIX + uniqueName, customTitle); +} + +void TabNamesUtils::removeCustomTabName(const QString &uniqueName) +{ + QSettings& settings = getSettings(); + settings.remove(TAB_NAMES_PREFIX + uniqueName); +} + +bool TabNamesUtils::hasCustomTabName(const QString &uniqueName) +{ + QSettings& settings = getSettings(); + return settings.contains(TAB_NAMES_PREFIX + uniqueName); +} + +QString TabNamesUtils::buildUniqueName(const QString &tabName, const QString &projectName) +{ + return tabName + ":Dock-" + projectName; +} From e750dd1da63fc6dfd2ff35f4093b98d5cb1d5169 Mon Sep 17 00:00:00 2001 From: Mikhail Shashin Date: Sun, 14 Dec 2025 14:58:32 +0300 Subject: [PATCH 2/2] Revert "Refactor tab names management: extract TabNamesUtils and optimize QSettings usage" This reverts commit e1cc716d15732b9ca2a7c3bb80326bd551abb944. --- AdaptixClient/CMakeLists.txt | 2 - .../Headers/UI/Widgets/AbstractDock.h | 16 +----- AdaptixClient/Headers/Utils/TabNamesUtils.h | 17 ------ .../Libs/kddockwidgets/kddockwidgets_export.h | 1 - .../Source/UI/Widgets/SessionsTableWidget.cpp | 9 --- AdaptixClient/Source/Utils/TabNamesUtils.cpp | 55 ------------------- 6 files changed, 1 insertion(+), 99 deletions(-) delete mode 100644 AdaptixClient/Headers/Utils/TabNamesUtils.h delete mode 100644 AdaptixClient/Source/Utils/TabNamesUtils.cpp diff --git a/AdaptixClient/CMakeLists.txt b/AdaptixClient/CMakeLists.txt index 8381c42b..b08fa7e0 100644 --- a/AdaptixClient/CMakeLists.txt +++ b/AdaptixClient/CMakeLists.txt @@ -153,7 +153,6 @@ SET( HEADERS Headers/Utils/NonBlockingDialogs.h Headers/Utils/FontManager.h Headers/Utils/TitleBarStyle.h - Headers/Utils/TabNamesUtils.h Headers/UI/Widgets/DockWidgetRegister.h ) @@ -234,7 +233,6 @@ add_executable(AdaptixClient Source/Utils/NonBlockingDialogs.cpp Source/Utils/FontManager.cpp Source/Utils/TitleBarStyle.cpp - Source/Utils/TabNamesUtils.cpp ) target_compile_definitions( diff --git a/AdaptixClient/Headers/UI/Widgets/AbstractDock.h b/AdaptixClient/Headers/UI/Widgets/AbstractDock.h index 77ba5598..732c0e6c 100644 --- a/AdaptixClient/Headers/UI/Widgets/AbstractDock.h +++ b/AdaptixClient/Headers/UI/Widgets/AbstractDock.h @@ -22,7 +22,6 @@ #include #include #include -#include #include #include #ifdef __GNUC__ @@ -88,20 +87,7 @@ protected: public: DockTab(const QString &tabName, const QString &projectName, const QString &icon = "") { dockWidget = new KDDockWidgets::QtWidgets::DockWidget(tabName + ":Dock-" + projectName, KDDockWidgets::DockWidgetOption_None, KDDockWidgets::LayoutSaverOption::None); - - QString displayTitle = tabName; - bool isRenameable = tabName.startsWith("Console [") || - tabName.startsWith("Terminal [") || - tabName.startsWith("Files [") || - tabName.startsWith("Processes ["); - - if (isRenameable) { - QString customTitle = TabNamesUtils::getCustomTabName(tabName, projectName); - if (!customTitle.isEmpty()) - displayTitle = customTitle; - } - - dockWidget->setTitle(displayTitle); + dockWidget->setTitle(tabName); if (!icon.isEmpty()) dockWidget->setIcon(QIcon(icon), KDDockWidgets::IconPlace::TabBar); diff --git a/AdaptixClient/Headers/Utils/TabNamesUtils.h b/AdaptixClient/Headers/Utils/TabNamesUtils.h deleted file mode 100644 index c2ced488..00000000 --- a/AdaptixClient/Headers/Utils/TabNamesUtils.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef ADAPTIXCLIENT_TABNAMESUTILS_H -#define ADAPTIXCLIENT_TABNAMESUTILS_H - -#include - -class TabNamesUtils -{ -public: - static void removeAgentTabNames(const QString &agentId, const QString &projectName); - static QString getCustomTabName(const QString &tabName, const QString &projectName); - static void setCustomTabName(const QString &uniqueName, const QString &customTitle); - static void removeCustomTabName(const QString &uniqueName); - static bool hasCustomTabName(const QString &uniqueName); - static QString buildUniqueName(const QString &tabName, const QString &projectName); -}; - -#endif // ADAPTIXCLIENT_TABNAMESUTILS_H diff --git a/AdaptixClient/Libs/kddockwidgets/kddockwidgets_export.h b/AdaptixClient/Libs/kddockwidgets/kddockwidgets_export.h index e132c22e..0a3a2791 100644 --- a/AdaptixClient/Libs/kddockwidgets/kddockwidgets_export.h +++ b/AdaptixClient/Libs/kddockwidgets/kddockwidgets_export.h @@ -33,7 +33,6 @@ # define KDDOCKWIDGETS_DEPRECATED_NO_EXPORT KDDOCKWIDGETS_NO_EXPORT KDDOCKWIDGETS_DEPRECATED #endif -/* NOLINTNEXTLINE(readability-avoid-unconditional-preprocessor-if) */ #if 0 /* DEFINE_NO_DEPRECATED */ # ifndef KDDOCKWIDGETS_NO_DEPRECATED # define KDDOCKWIDGETS_NO_DEPRECATED diff --git a/AdaptixClient/Source/UI/Widgets/SessionsTableWidget.cpp b/AdaptixClient/Source/UI/Widgets/SessionsTableWidget.cpp index 4c32f60d..48d885b3 100644 --- a/AdaptixClient/Source/UI/Widgets/SessionsTableWidget.cpp +++ b/AdaptixClient/Source/UI/Widgets/SessionsTableWidget.cpp @@ -14,7 +14,6 @@ #include #include #include -#include REGISTER_DOCK_WIDGET(SessionsTableWidget, "Sessions", true) @@ -168,9 +167,6 @@ void SessionsTableWidget::RemoveAgentItem(const QString &agentId) const Agent* agent = adaptixWidget->AgentsMap[agentId]; adaptixWidget->AgentsMap.remove(agentId); - QString projectName = adaptixWidget->GetProfile()->GetProject(); - TabNamesUtils::removeAgentTabNames(agentId, projectName); - if (agent->Console) delete agent->Console; if (agent->FileBrowser) @@ -226,14 +222,9 @@ void SessionsTableWidget::UpdateData() const void SessionsTableWidget::Clear() const { - QString projectName = adaptixWidget->GetProfile()->GetProject(); - for (auto agentId : adaptixWidget->AgentsMap.keys()) { Agent* agent = adaptixWidget->AgentsMap[agentId]; adaptixWidget->AgentsMap.remove(agentId); - - TabNamesUtils::removeAgentTabNames(agentId, projectName); - delete agent->Console; delete agent->FileBrowser; delete agent->ProcessBrowser; diff --git a/AdaptixClient/Source/Utils/TabNamesUtils.cpp b/AdaptixClient/Source/Utils/TabNamesUtils.cpp deleted file mode 100644 index 7a17389c..00000000 --- a/AdaptixClient/Source/Utils/TabNamesUtils.cpp +++ /dev/null @@ -1,55 +0,0 @@ -#include -#include -#include - -namespace { - constexpr const char* SETTINGS_ORG = "Adaptix"; - constexpr const char* SETTINGS_APP = "AdaptixClient"; - constexpr const char* TAB_NAMES_PREFIX = "TabNames/"; - const QStringList TAB_TYPES = {"Console [", "Terminal [", "Files [", "Processes ["}; - - QSettings& getSettings() { - static QSettings settings(SETTINGS_ORG, SETTINGS_APP); - return settings; - } -} - -void TabNamesUtils::removeAgentTabNames(const QString &agentId, const QString &projectName) -{ - QSettings& settings = getSettings(); - - for (const QString& tabType : TAB_TYPES) { - QString uniqueName = tabType + agentId + "]:Dock-" + projectName; - settings.remove(TAB_NAMES_PREFIX + uniqueName); - } -} - -QString TabNamesUtils::getCustomTabName(const QString &tabName, const QString &projectName) -{ - QString uniqueName = buildUniqueName(tabName, projectName); - QSettings& settings = getSettings(); - return settings.value(TAB_NAMES_PREFIX + uniqueName).toString(); -} - -void TabNamesUtils::setCustomTabName(const QString &uniqueName, const QString &customTitle) -{ - QSettings& settings = getSettings(); - settings.setValue(TAB_NAMES_PREFIX + uniqueName, customTitle); -} - -void TabNamesUtils::removeCustomTabName(const QString &uniqueName) -{ - QSettings& settings = getSettings(); - settings.remove(TAB_NAMES_PREFIX + uniqueName); -} - -bool TabNamesUtils::hasCustomTabName(const QString &uniqueName) -{ - QSettings& settings = getSettings(); - return settings.contains(TAB_NAMES_PREFIX + uniqueName); -} - -QString TabNamesUtils::buildUniqueName(const QString &tabName, const QString &projectName) -{ - return tabName + ":Dock-" + projectName; -}