diff --git a/src/plugins/mesonprojectmanager/CMakeLists.txt b/src/plugins/mesonprojectmanager/CMakeLists.txt index 4cc66cab91b..07b63f93b42 100644 --- a/src/plugins/mesonprojectmanager/CMakeLists.txt +++ b/src/plugins/mesonprojectmanager/CMakeLists.txt @@ -57,8 +57,6 @@ add_qtc_plugin(MesonProjectManager toolssettingsaccessor.h toolssettingspage.cpp toolssettingspage.h - tooltreeitem.cpp - tooltreeitem.h versionhelper.h ) diff --git a/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs b/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs index 619d6f26f0f..40c0c883a41 100644 --- a/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs +++ b/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs @@ -73,8 +73,6 @@ Project { "toolssettingsaccessor.h", "toolssettingspage.cpp", "toolssettingspage.h", - "tooltreeitem.cpp", - "tooltreeitem.h", "versionhelper.h", ] } diff --git a/src/plugins/mesonprojectmanager/toolitemsettings.cpp b/src/plugins/mesonprojectmanager/toolitemsettings.cpp index 1b66cc2d03d..021b08edb6e 100644 --- a/src/plugins/mesonprojectmanager/toolitemsettings.cpp +++ b/src/plugins/mesonprojectmanager/toolitemsettings.cpp @@ -4,7 +4,7 @@ #include "toolitemsettings.h" #include "mesonprojectmanagertr.h" -#include "tooltreeitem.h" +#include "toolsmodel.h" #include #include diff --git a/src/plugins/mesonprojectmanager/toolsmodel.cpp b/src/plugins/mesonprojectmanager/toolsmodel.cpp index 372f61d435b..861ec4b58c5 100644 --- a/src/plugins/mesonprojectmanager/toolsmodel.cpp +++ b/src/plugins/mesonprojectmanager/toolsmodel.cpp @@ -3,24 +3,129 @@ #include "toolsmodel.h" -#include "tooltreeitem.h" #include "mesonprojectmanagertr.h" #include "mesontools.h" #include + #include #include +#include -namespace MesonProjectManager { -namespace Internal { +using namespace Utils; + +namespace MesonProjectManager::Internal { + +// ToolTreeItem + +ToolTreeItem::ToolTreeItem(const QString &name) + : m_name{name} + , m_id(Id::generate()) + , m_autoDetected{false} + , m_unsavedChanges{true} +{ + self_check(); + update_tooltip(); +} + +ToolTreeItem::ToolTreeItem(const MesonTools::Tool_t &tool) + : m_name{tool->name()} + , m_executable{tool->exe()} + , m_id{tool->id()} + , m_autoDetected{tool->autoDetected()} +{ + m_tooltip = Tr::tr("Version: %1").arg(tool->version().toQString()); + self_check(); +} + +ToolTreeItem::ToolTreeItem(const ToolTreeItem &other) + : m_name{Tr::tr("Clone of %1").arg(other.m_name)} + , m_executable{other.m_executable} + , m_id{Id::generate()} + , m_autoDetected{false} + , m_unsavedChanges{true} +{ + self_check(); + update_tooltip(); +} + +QVariant ToolTreeItem::data(int column, int role) const +{ + switch (role) { + case Qt::DisplayRole: { + switch (column) { + case 0: { + return m_name; + } + case 1: { + return m_executable.toUserOutput(); + } + } // switch (column) + return QVariant(); + } + case Qt::FontRole: { + QFont font; + font.setBold(m_unsavedChanges); + return font; + } + case Qt::ToolTipRole: { + if (!m_pathExists) + return Tr::tr("Meson executable path does not exist."); + if (!m_pathIsFile) + return Tr::tr("Meson executable path is not a file."); + if (!m_pathIsExecutable) + return Tr::tr("Meson executable path is not executable."); + return m_tooltip; + } + case Qt::DecorationRole: { + if (column == 0 && (!m_pathExists || !m_pathIsFile || !m_pathIsExecutable)) + return Icons::CRITICAL.icon(); + return {}; + } + } + return {}; +} + +void ToolTreeItem::update(const QString &name, const FilePath &exe) +{ + m_unsavedChanges = true; + m_name = name; + if (exe != m_executable) { + m_executable = exe; + self_check(); + update_tooltip(); + } +} + +void ToolTreeItem::self_check() +{ + m_pathExists = m_executable.exists(); + m_pathIsFile = m_executable.toFileInfo().isFile(); + m_pathIsExecutable = m_executable.toFileInfo().isExecutable(); +} + +void ToolTreeItem::update_tooltip(const Version &version) +{ + if (version.isValid) + m_tooltip = Tr::tr("Version: %1").arg(version.toQString()); + else + m_tooltip = Tr::tr("Cannot get tool version."); +} + +void ToolTreeItem::update_tooltip() +{ + update_tooltip(ToolWrapper::read_version(m_executable)); +} + +// ToolsModel ToolsModel::ToolsModel() { setHeader({Tr::tr("Name"), Tr::tr("Location")}); rootItem()->appendChild( - new Utils::StaticTreeItem({ProjectExplorer::Constants::msgAutoDetected()}, - {ProjectExplorer::Constants::msgAutoDetectedToolTip()})); - rootItem()->appendChild(new Utils::StaticTreeItem(ProjectExplorer::Constants::msgManual())); + new StaticTreeItem({ProjectExplorer::Constants::msgAutoDetected()}, + {ProjectExplorer::Constants::msgAutoDetectedToolTip()})); + rootItem()->appendChild(new StaticTreeItem(ProjectExplorer::Constants::msgManual())); for (const auto &tool : MesonTools::tools()) addMesonToolHelper(tool); } @@ -30,7 +135,7 @@ ToolTreeItem *ToolsModel::mesoneToolTreeItem(const QModelIndex &index) const return itemForIndexAtLevel<2>(index); } -void ToolsModel::updateItem(const Utils::Id &itemId, const QString &name, const Utils::FilePath &exe) +void ToolsModel::updateItem(const Id &itemId, const QString &name, const FilePath &exe) { auto treeItem = findItemAtLevel<2>([itemId](ToolTreeItem *n) { return n->id() == itemId; }); QTC_ASSERT(treeItem, return ); @@ -45,7 +150,7 @@ void ToolsModel::addMesonTool() void ToolsModel::removeMesonTool(ToolTreeItem *item) { QTC_ASSERT(item, return ); - const Utils::Id id = item->id(); + const Id id = item->id(); destroyItem(item); m_itemsToRemove.enqueue(id); } @@ -83,19 +188,18 @@ void ToolsModel::addMesonToolHelper(const MesonTools::Tool_t &tool) QString ToolsModel::uniqueName(const QString &baseName) { QStringList names; - forItemsAtLevel<2>([&names](auto *item) { names << item->name(); }); + forItemsAtLevel<2>([&names](ToolTreeItem *item) { names << item->name(); }); return Utils::makeUniquelyNumbered(baseName, names); } -Utils::TreeItem *ToolsModel::autoDetectedGroup() const +TreeItem *ToolsModel::autoDetectedGroup() const { return rootItem()->childAt(0); } -Utils::TreeItem *ToolsModel::manualGroup() const +TreeItem *ToolsModel::manualGroup() const { return rootItem()->childAt(1); } -} // namespace Internal -} // namespace MesonProjectManager +} // MesonProjectManager::Internal diff --git a/src/plugins/mesonprojectmanager/toolsmodel.h b/src/plugins/mesonprojectmanager/toolsmodel.h index c03d3d0cfa3..6e25a7af2b7 100644 --- a/src/plugins/mesonprojectmanager/toolsmodel.h +++ b/src/plugins/mesonprojectmanager/toolsmodel.h @@ -7,13 +7,40 @@ #include -#include #include -namespace MesonProjectManager { -namespace Internal { +namespace MesonProjectManager::Internal { -class ToolTreeItem; +class ToolTreeItem final : public Utils::TreeItem +{ +public: + ToolTreeItem(const QString &name); + ToolTreeItem(const MesonTools::Tool_t &tool); + ToolTreeItem(const ToolTreeItem &other); + + QVariant data(int column, int role) const override; + bool isAutoDetected() const noexcept { return m_autoDetected; } + QString name() const noexcept { return m_name; } + Utils::FilePath executable() const noexcept { return m_executable; } + Utils::Id id() const noexcept { return m_id; } + bool hasUnsavedChanges() const noexcept { return m_unsavedChanges; } + void setSaved() { m_unsavedChanges = false; } + void update(const QString &name, const Utils::FilePath &exe); + +private: + void self_check(); + void update_tooltip(const Version &version); + void update_tooltip(); + QString m_name; + QString m_tooltip; + Utils::FilePath m_executable; + Utils::Id m_id; + bool m_autoDetected; + bool m_pathExists; + bool m_pathIsFile; + bool m_pathIsExecutable; + bool m_unsavedChanges = false; +}; class ToolsModel final : public Utils::TreeModel { @@ -35,5 +62,4 @@ private: QQueue m_itemsToRemove; }; -} // namespace Internal -} // namespace MesonProjectManager +} // MesonProjectManager::Internal diff --git a/src/plugins/mesonprojectmanager/toolssettingspage.cpp b/src/plugins/mesonprojectmanager/toolssettingspage.cpp index 629513f8b5e..dd82899b404 100644 --- a/src/plugins/mesonprojectmanager/toolssettingspage.cpp +++ b/src/plugins/mesonprojectmanager/toolssettingspage.cpp @@ -7,7 +7,6 @@ #include "mesonprojectmanagertr.h" #include "toolitemsettings.h" #include "toolsmodel.h" -#include "tooltreeitem.h" #include diff --git a/src/plugins/mesonprojectmanager/tooltreeitem.cpp b/src/plugins/mesonprojectmanager/tooltreeitem.cpp deleted file mode 100644 index bb042fc3c82..00000000000 --- a/src/plugins/mesonprojectmanager/tooltreeitem.cpp +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright (C) 2020 Alexis Jeandet. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#include "tooltreeitem.h" - -#include "mesonprojectmanagertr.h" - -#include - -#include - -namespace MesonProjectManager { -namespace Internal { - -ToolTreeItem::ToolTreeItem(const QString &name) - : m_name{name} - , m_autoDetected{false} - , m_id(Utils::Id::generate()) - , m_unsavedChanges{true} -{ - self_check(); - update_tooltip(); -} - -ToolTreeItem::ToolTreeItem(const MesonTools::Tool_t &tool) - : m_name{tool->name()} - , m_executable{tool->exe()} - , m_autoDetected{tool->autoDetected()} - , m_id{tool->id()} -{ - m_tooltip = Tr::tr("Version: %1").arg(tool->version().toQString()); - self_check(); -} - -ToolTreeItem::ToolTreeItem(const ToolTreeItem &other) - : m_name{Tr::tr("Clone of %1").arg(other.m_name)} - , m_executable{other.m_executable} - , m_autoDetected{false} - , m_id{Utils::Id::generate()} - , m_unsavedChanges{true} -{ - self_check(); - update_tooltip(); -} - -QVariant ToolTreeItem::data(int column, int role) const -{ - switch (role) { - case Qt::DisplayRole: { - switch (column) { - case 0: { - return m_name; - } - case 1: { - return m_executable.toUserOutput(); - } - } // switch (column) - return QVariant(); - } - case Qt::FontRole: { - QFont font; - font.setBold(m_unsavedChanges); - return font; - } - case Qt::ToolTipRole: { - if (!m_pathExists) - return Tr::tr("Meson executable path does not exist."); - if (!m_pathIsFile) - return Tr::tr("Meson executable path is not a file."); - if (!m_pathIsExecutable) - return Tr::tr("Meson executable path is not executable."); - return m_tooltip; - } - case Qt::DecorationRole: { - if (column == 0 && (!m_pathExists || !m_pathIsFile || !m_pathIsExecutable)) - return Utils::Icons::CRITICAL.icon(); - return {}; - } - } - return {}; -} - -void ToolTreeItem::update(const QString &name, const Utils::FilePath &exe) -{ - m_unsavedChanges = true; - m_name = name; - if (exe != m_executable) { - m_executable = exe; - self_check(); - update_tooltip(); - } -} - -void ToolTreeItem::self_check() -{ - m_pathExists = m_executable.exists(); - m_pathIsFile = m_executable.toFileInfo().isFile(); - m_pathIsExecutable = m_executable.toFileInfo().isExecutable(); -} - -void ToolTreeItem::update_tooltip(const Version &version) -{ - if (version.isValid) - m_tooltip = Tr::tr("Version: %1").arg(version.toQString()); - else - m_tooltip = Tr::tr("Cannot get tool version."); -} - -void ToolTreeItem::update_tooltip() -{ - update_tooltip(ToolWrapper::read_version(m_executable)); -} - -} // namespace Internal -} // namespace MesonProjectManager diff --git a/src/plugins/mesonprojectmanager/tooltreeitem.h b/src/plugins/mesonprojectmanager/tooltreeitem.h deleted file mode 100644 index 8f7b22abaf6..00000000000 --- a/src/plugins/mesonprojectmanager/tooltreeitem.h +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (C) 2020 Alexis Jeandet. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#pragma once - -#include "mesontools.h" - -#include -#include -#include - -#include -#include - -#include - -namespace MesonProjectManager { -namespace Internal { - -class ToolTreeItem final : public Utils::TreeItem -{ -public: - ToolTreeItem(const QString &name); - ToolTreeItem(const MesonTools::Tool_t &tool); - ToolTreeItem(const ToolTreeItem &other); - - QVariant data(int column, int role) const override; - inline bool isAutoDetected() const noexcept { return m_autoDetected; } - inline QString name() const noexcept { return m_name; } - inline Utils::FilePath executable() const noexcept { return m_executable; } - inline Utils::Id id() const noexcept { return m_id; } - inline bool hasUnsavedChanges() const noexcept { return m_unsavedChanges; } - inline void setSaved() { m_unsavedChanges = false; } - void update(const QString &name, const Utils::FilePath &exe); - -private: - void self_check(); - void update_tooltip(const Version &version); - void update_tooltip(); - QString m_name; - QString m_tooltip; - Utils::FilePath m_executable; - bool m_autoDetected; - bool m_pathExists; - bool m_pathIsFile; - bool m_pathIsExecutable; - Utils::Id m_id; - - bool m_unsavedChanges = false; -}; - -} // namespace Internal -} // namespace MesonProjectManager