Axivion: Remove project settings

This removes the (hard) linking to a project. The user now
has to choose the preferred dashboard and the project to
inspect directly on the issues pane, similar to what is
needed for other Axivion plugins.
The last used dashboard and project will be now stored
inside the session data if its not the default session.

This breaks opening files from the issues pane if no project
or the wrong project is currently opened.
Fixing this needs further tweaking of fetching line markers
and maybe preparations for the project mapping which will be
done separately.

Change-Id: Id270c9758daa541059361407ad82adfdf6a240b5
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
This commit is contained in:
Christian Stenger
2024-09-11 10:22:16 +02:00
parent d023afcb53
commit ddd4fd24e6
8 changed files with 189 additions and 366 deletions

View File

@@ -6,7 +6,6 @@ add_qtc_plugin(Axivion
axivion.qrc
axivionoutputpane.cpp axivionoutputpane.h
axivionplugin.cpp axivionplugin.h
axivionprojectsettings.cpp axivionprojectsettings.h
axivionsettings.cpp axivionsettings.h
axiviontr.h
credentialquery.h credentialquery.cpp

View File

@@ -18,8 +18,6 @@ QtcPlugin {
"axivionoutputpane.h",
"axivionplugin.cpp",
"axivionplugin.h",
"axivionprojectsettings.h",
"axivionprojectsettings.cpp",
"axivionsettings.cpp",
"axivionsettings.h",
"axiviontr.h",

View File

@@ -133,12 +133,17 @@ class IssuesWidget : public QScrollArea
public:
explicit IssuesWidget(QWidget *parent = nullptr);
void updateUi(const QString &kind);
void initDashboardList(const QString &preferredProject = {});
void resetDashboard();
const std::optional<Dto::TableInfoDto> currentTableInfo() const { return m_currentTableInfo; }
IssueListSearch searchFromUi() const;
void showOverlay(const QString &errorMessage = {});
protected:
void showEvent(QShowEvent *event) override;
private:
void reinitProjectList(const QString &currentProject);
void updateTable();
void addIssues(const Dto::IssueTableDto &dto, int startRow);
void onSearchParameterChanged();
@@ -156,6 +161,8 @@ private:
QButtonGroup *m_typesButtonGroup = nullptr;
QPushButton *m_addedFilter = nullptr;
QPushButton *m_removedFilter = nullptr;
QComboBox *m_dashboards = nullptr;
QComboBox *m_dashboardProjects = nullptr;
QComboBox *m_ownerFilter = nullptr;
QComboBox *m_versionStart = nullptr;
QComboBox *m_versionEnd = nullptr;
@@ -170,12 +177,31 @@ private:
QStringList m_versionDates;
TaskTreeRunner m_taskTreeRunner;
OverlayWidget *m_overlay = nullptr;
bool m_dashboardListUninitialized = true;
};
IssuesWidget::IssuesWidget(QWidget *parent)
: QScrollArea(parent)
{
QWidget *widget = new QWidget(this);
m_dashboards = new QComboBox(this);
m_dashboards->setMinimumContentsLength(15);
connect(m_dashboards, &QComboBox::currentIndexChanged, this, [this] {
if (m_signalBlocker.isLocked())
return;
reinitProjectList(m_dashboardProjects->currentText());
});
m_dashboardProjects = new QComboBox(this);
m_dashboardProjects->setMinimumContentsLength(25);
connect(m_dashboardProjects, &QComboBox::currentIndexChanged, this, [this] {
if (m_signalBlocker.isLocked())
return;
m_currentPrefix.clear();
m_currentProject.clear();
m_issuesModel->clear();
fetchProjectInfo(m_dashboardProjects->currentText());
});
// row with issue types (-> depending on choice, tables below change)
// and a selectable range (start version, end version)
// row with added/removed and some filters (assignee, path glob, (named filter))
@@ -256,7 +282,7 @@ IssuesWidget::IssuesWidget(QWidget *parent)
using namespace Layouting;
Column {
Row { m_typesLayout, st, m_versionStart, m_versionEnd, st },
Row { m_dashboards, m_dashboardProjects, empty, m_typesLayout, st, m_versionStart, m_versionEnd, st },
Row { m_addedFilter, m_removedFilter, Space(1), m_ownerFilter, m_pathGlobFilter },
m_issuesView,
Row { st, m_totalRows }
@@ -265,6 +291,9 @@ IssuesWidget::IssuesWidget(QWidget *parent)
setWidget(widget);
setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
setWidgetResizable(true);
connect(&settings(), &AxivionSettings::changed,
this, [this] { initDashboardList(); });
}
void IssuesWidget::updateUi(const QString &kind)
@@ -308,6 +337,63 @@ void IssuesWidget::updateUi(const QString &kind)
fetchTable();
}
void IssuesWidget::resetDashboard()
{
setFiltersEnabled(false);
updateBasicProjectInfo(std::nullopt);
GuardLocker lock(m_signalBlocker);
m_dashboardProjects->clear();
m_dashboards->clear();
m_dashboardListUninitialized = true;
}
void IssuesWidget::initDashboardList(const QString &preferredProject)
{
const QString currentProject = preferredProject.isEmpty() ? m_dashboardProjects->currentText()
: preferredProject;
resetDashboard();
m_dashboardListUninitialized = false;
GuardLocker lock(m_signalBlocker);
const QList<AxivionServer> servers = settings().allAvailableServers();
if (servers.isEmpty()) {
switchActiveDashboardId({});
return;
}
for (const AxivionServer &server : servers)
m_dashboards->addItem(server.displayString(), QVariant::fromValue(server));
Id activeId = activeDashboardId();
if (!activeId.isValid())
activeId = settings().defaultDashboardId();
if (activeId.isValid()) {
int index = Utils::indexOf(servers, Utils::equal(&AxivionServer::id, activeId));
if (index < 0) {
activeId = settings().defaultDashboardId();
index = Utils::indexOf(servers, Utils::equal(&AxivionServer::id, activeId));
}
m_dashboards->setCurrentIndex(index);
}
switchActiveDashboardId(activeId);
reinitProjectList(currentProject);
}
void IssuesWidget::reinitProjectList(const QString &currentProject)
{
const auto onDashboardInfoFetched
= [this, currentProject] (const expected_str<DashboardInfo> &info) {
if (!info)
return;
GuardLocker lock(m_signalBlocker);
m_dashboardProjects->clear();
m_dashboardProjects->addItems(info->projects);
if (!currentProject.isEmpty() && info->projects.contains(currentProject))
m_dashboardProjects->setCurrentText(currentProject);
// FIXME ugly.. any better solution?
QTimer::singleShot(0, this, [this]() { fetchProjectInfo(m_dashboardProjects->currentText()); });
};
fetchDashboardInfo(onDashboardInfoFetched);
}
static Qt::Alignment alignmentFromString(const QString &str)
{
if (str == "left")
@@ -319,6 +405,13 @@ static Qt::Alignment alignmentFromString(const QString &str)
return Qt::AlignLeft;
}
void IssuesWidget::showEvent(QShowEvent *event)
{
if (m_dashboardListUninitialized)
initDashboardList();
QWidget::showEvent(event);
}
void IssuesWidget::updateTable()
{
if (!m_currentTableInfo)
@@ -509,6 +602,7 @@ void IssuesWidget::updateBasicProjectInfo(const std::optional<Dto::ProjectInfoDt
if (auto firstButton = m_typesButtonGroup->button(1))
firstButton->setChecked(true);
GuardLocker lock(m_signalBlocker);
m_userNames.clear();
m_ownerFilter->clear();
QStringList userDisplayNames;
@@ -516,9 +610,7 @@ void IssuesWidget::updateBasicProjectInfo(const std::optional<Dto::ProjectInfoDt
userDisplayNames.append(user.displayName);
m_userNames.append(user.name);
}
m_signalBlocker.lock();
m_ownerFilter->addItems(userDisplayNames);
m_signalBlocker.unlock();
m_versionDates.clear();
m_versionStart->clear();
@@ -530,11 +622,9 @@ void IssuesWidget::updateBasicProjectInfo(const std::optional<Dto::ProjectInfoDt
versionLabels.append(version.name);
m_versionDates.append(version.date);
}
m_signalBlocker.lock();
m_versionStart->addItems(versionLabels);
m_versionEnd->addItems(versionLabels);
m_versionStart->setCurrentIndex(m_versionDates.count() - 1);
m_signalBlocker.unlock();
}
void IssuesWidget::setFiltersEnabled(bool enabled)
@@ -751,6 +841,20 @@ public:
issues->showOverlay(errorMessage);
}
void reinitDashboardList(const QString &preferredProject)
{
QTC_ASSERT(m_outputWidget, return);
if (auto issues = static_cast<IssuesWidget *>(m_outputWidget->widget(0)))
issues->initDashboardList(preferredProject);
}
void resetDashboard()
{
QTC_ASSERT(m_outputWidget, return);
if (auto issues = static_cast<IssuesWidget *>(m_outputWidget->widget(0)))
issues->resetDashboard();
}
bool handleContextMenu(const QString &issue, const ItemViewEvent &e)
{
auto issues = static_cast<IssuesWidget *>(m_outputWidget->widget(0));
@@ -814,6 +918,18 @@ void updateDashboard()
theAxivionOutputPane->flash();
}
void reinitDashboard(const QString &preferredProject)
{
QTC_ASSERT(theAxivionOutputPane, return);
theAxivionOutputPane->reinitDashboardList(preferredProject);
}
void resetDashboard()
{
QTC_ASSERT(theAxivionOutputPane, return);
theAxivionOutputPane->resetDashboard();
}
static bool issueListContextMenuEvent(const ItemViewEvent &ev)
{
QTC_ASSERT(theAxivionOutputPane, return false);

View File

@@ -10,5 +10,7 @@ namespace Axivion::Internal {
void setupAxivionOutputPane(QObject *guard);
void updateDashboard();
void showFilterException(const QString &errorMessage);
void reinitDashboard(const QString &projectName);
void resetDashboard();
} // Axivion::Internal

View File

@@ -4,7 +4,6 @@
#include "axivionplugin.h"
#include "axivionoutputpane.h"
#include "axivionprojectsettings.h"
#include "axivionsettings.h"
#include "axiviontr.h"
#include "credentialquery.h"
@@ -17,6 +16,7 @@
#include <coreplugin/inavigationwidgetfactory.h>
#include <coreplugin/messagemanager.h>
#include <coreplugin/navigationwidget.h>
#include <coreplugin/session.h>
#include <extensionsystem/iplugin.h>
@@ -214,6 +214,7 @@ public:
AxivionPluginPrivate();
void handleSslErrors(QNetworkReply *reply, const QList<QSslError> &errors);
void onStartupProjectChanged(Project *project);
void fetchDashboardInfo(const DashboardInfoHandler &handler);
void fetchProjectInfo(const QString &projectName);
void handleOpenedDocs();
void onDocumentOpened(IDocument *doc);
@@ -226,6 +227,9 @@ public:
void setIssueDetails(const QString &issueDetailsHtml);
void handleAnchorClicked(const QUrl &url);
void onSessionLoaded(const QString &sessionName);
void onAboutToSaveSession();
signals:
void issueDetailsChanged(const QString &issueDetailsHtml);
@@ -279,6 +283,12 @@ public:
}
};
void fetchDashboardInfo(const DashboardInfoHandler &handler)
{
QTC_ASSERT(dd, return);
dd->fetchDashboardInfo(handler);
}
void fetchProjectInfo(const QString &projectName)
{
QTC_ASSERT(dd, return);
@@ -319,6 +329,11 @@ AxivionPluginPrivate::AxivionPluginPrivate()
#endif // ssl
connect(&settings().highlightMarks, &BoolAspect::changed,
this, &AxivionPluginPrivate::updateExistingMarks);
connect(SessionManager::instance(), &SessionManager::sessionLoaded,
this, &AxivionPluginPrivate::onSessionLoaded);
connect(SessionManager::instance(), &SessionManager::aboutToSaveSession,
this, &AxivionPluginPrivate::onAboutToSaveSession);
}
void AxivionPluginPrivate::handleSslErrors(QNetworkReply *reply, const QList<QSslError> &errors)
@@ -367,9 +382,6 @@ void AxivionPluginPrivate::onStartupProjectChanged(Project *project)
m_fileFinder.setProjectFiles(m_project->files(Project::AllFiles));
handleOpenedDocs();
});
const AxivionProjectSettings *projSettings = AxivionProjectSettings::projectSettings(m_project);
switchActiveDashboardId(projSettings->dashboardId());
fetchProjectInfo(projSettings->dashboardProjectName());
}
static QUrl constructUrl(const QString &projectName, const QString &subPath, const QUrlQuery &query)
@@ -854,15 +866,17 @@ Group issueHtmlRecipe(const QString &issueId, const HtmlHandler &handler)
return fetchHtmlRecipe(url, handler);
}
void AxivionPluginPrivate::fetchDashboardInfo(const DashboardInfoHandler &handler)
{
m_taskTreeRunner.start(dashboardInfoRecipe(handler));
}
void AxivionPluginPrivate::fetchProjectInfo(const QString &projectName)
{
if (!m_project)
return;
clearAllMarks();
m_currentProjectInfo = {};
m_analysisVersion = {};
if (projectName.isEmpty()) {
m_currentProjectInfo = {};
m_analysisVersion = {};
updateDashboard();
return;
}
@@ -1064,6 +1078,39 @@ void AxivionPluginPrivate::handleAnchorClicked(const QUrl &url)
EditorManager::openEditorAt(link);
}
static constexpr char SV_PROJECTNAME[] = "Axivion.ProjectName";
static constexpr char SV_DASHBOARDID[] = "Axivion.DashboardId";
void AxivionPluginPrivate::onSessionLoaded(const QString &sessionName)
{
// explicitly ignore default session to avoid triggering dialogs at startup
if (sessionName == "default")
return;
const QString projectName = SessionManager::sessionValue(SV_PROJECTNAME).toString();
const Id dashboardId = Id::fromSetting(SessionManager::sessionValue(SV_DASHBOARDID));
if (!dashboardId.isValid()) {
switchActiveDashboardId({});
resetDashboard();
return;
}
if (activeDashboardId() != dashboardId)
switchActiveDashboardId(dashboardId);
reinitDashboard(projectName);
}
void AxivionPluginPrivate::onAboutToSaveSession()
{
// explicitly ignore default session
if (SessionManager::startupSession() == "default")
return;
SessionManager::setSessionValue(SV_DASHBOARDID, activeDashboardId().toSetting());
const QString projectName = m_currentProjectInfo ? m_currentProjectInfo->name : QString();
SessionManager::setSessionValue(SV_PROJECTNAME, projectName);
}
class AxivionIssueWidgetFactory final : public INavigationWidgetFactory
{
public:
@@ -1104,7 +1151,6 @@ class AxivionPlugin final : public ExtensionSystem::IPlugin
~AxivionPlugin() final
{
AxivionProjectSettings::destroyProjectSettings();
delete dd;
dd = nullptr;
}
@@ -1115,7 +1161,6 @@ class AxivionPlugin final : public ExtensionSystem::IPlugin
dd = new AxivionPluginPrivate;
AxivionProjectSettings::setupProjectPanel();
setupAxivionIssueWidgetFactory();
connect(ProjectManager::instance(), &ProjectManager::startupProjectChanged,
@@ -1148,6 +1193,12 @@ const std::optional<DashboardInfo> currentDashboardInfo()
return dd->m_dashboardInfo;
}
const Id activeDashboardId()
{
QTC_ASSERT(dd, return {});
return dd->m_dashboardServerId;
}
void setAnalysisVersion(const QString &version)
{
QTC_ASSERT(dd, return);
@@ -1168,6 +1219,8 @@ void disableInlineIssues(bool disable)
Utils::FilePath findFileForIssuePath(const Utils::FilePath &issuePath)
{
QTC_ASSERT(dd, return {});
if (!dd->m_project || !dd->m_currentProjectInfo)
return {};
const FilePaths result = dd->m_fileFinder.findFile(issuePath.toUrl());
if (result.size() == 1)
return dd->m_project->projectDirectory().resolvePath(result.first());

View File

@@ -78,6 +78,7 @@ Tasking::Group lineMarkerRecipe(const Utils::FilePath &filePath, const LineMarke
using HtmlHandler = std::function<void(const QByteArray &)>;
Tasking::Group issueHtmlRecipe(const QString &issueId, const HtmlHandler &handler);
void fetchDashboardInfo(const DashboardInfoHandler &handler);
void fetchProjectInfo(const QString &projectName);
std::optional<Dto::ProjectInfoDto> projectInfo();
bool handleCertificateIssue();
@@ -87,6 +88,7 @@ QString anyToSimpleString(const Dto::Any &any);
void fetchIssueInfo(const QString &id);
void switchActiveDashboardId(const Utils::Id &toDashboardId);
const Utils::Id activeDashboardId();
const std::optional<DashboardInfo> currentDashboardInfo();
void setAnalysisVersion(const QString &version);
void disableInlineIssues(bool disable);

View File

@@ -1,309 +0,0 @@
// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "axivionprojectsettings.h"
#include "axivionplugin.h"
#include "axivionsettings.h"
#include "axiviontr.h"
#include <coreplugin/find/itemviewfind.h>
#include <projectexplorer/project.h>
#include <projectexplorer/projectpanelfactory.h>
#include <projectexplorer/projectsettingswidget.h>
#include <solutions/tasking/tasktreerunner.h>
#include <utils/algorithm.h>
#include <utils/infolabel.h>
#include <utils/layoutbuilder.h>
#include <utils/qtcassert.h>
#include <QComboBox>
#include <QPushButton>
#include <QTreeWidget>
#include <QVBoxLayout>
using namespace ProjectExplorer;
using namespace Tasking;
using namespace Utils;
namespace Axivion::Internal {
const char PSK_PROJECTNAME[] = "Axivion.ProjectName";
const char PSK_DASHBOARDID[] = "Axivion.DashboardId";
// AxivionProjectSettingsHandler
class AxivionProjectSettingsHandler : public QObject
{
public:
AxivionProjectSettings *projectSettings(Project *project)
{
auto &settings = m_axivionProjectSettings[project];
if (!settings)
settings = new AxivionProjectSettings(project);
return settings;
}
void destroy()
{
qDeleteAll(m_axivionProjectSettings);
m_axivionProjectSettings.clear();
}
QHash<Project *, AxivionProjectSettings *> m_axivionProjectSettings;
};
static AxivionProjectSettingsHandler &projectSettingsHandler()
{
static AxivionProjectSettingsHandler theProjectSettingsHandler;
return theProjectSettingsHandler;
}
// AxivionProjectSettings
AxivionProjectSettings::AxivionProjectSettings(Project *project)
: m_project{project}
{
load();
connect(project, &Project::settingsLoaded, this, &AxivionProjectSettings::load);
connect(project, &Project::aboutToSaveSettings, this, &AxivionProjectSettings::save);
}
AxivionProjectSettings *AxivionProjectSettings::projectSettings(Project *project)
{
return projectSettingsHandler().projectSettings(project);
}
void AxivionProjectSettings::destroyProjectSettings()
{
projectSettingsHandler().destroy();
}
void AxivionProjectSettings::load()
{
m_dashboardProjectName = m_project->namedSettings(PSK_PROJECTNAME).toString();
m_dashboardId = Id::fromSetting(m_project->namedSettings(PSK_DASHBOARDID));
if (!m_dashboardId.isValid())
m_dashboardId = settings().defaultDashboardId();
}
void AxivionProjectSettings::save()
{
m_project->setNamedSettings(PSK_PROJECTNAME, m_dashboardProjectName);
m_project->setNamedSettings(PSK_DASHBOARDID, m_dashboardId.toSetting());
}
// AxivionProjectSettingsWidget
class AxivionProjectSettingsWidget : public ProjectSettingsWidget
{
public:
explicit AxivionProjectSettingsWidget(Project *project);
private:
void fetchProjects();
void onSettingsChanged();
void onServerChanged();
void linkProject();
void unlinkProject();
void updateUi();
void updateEnabledStates();
void updateServers();
AxivionProjectSettings *m_projectSettings = nullptr;
QLabel *m_linkedProject = nullptr;
QComboBox *m_dashboardServers = nullptr;
QTreeWidget *m_dashboardProjects = nullptr;
QPushButton *m_fetchProjects = nullptr;
QPushButton *m_link = nullptr;
QPushButton *m_unlink = nullptr;
InfoLabel *m_infoLabel = nullptr;
TaskTreeRunner m_taskTreeRunner;
};
AxivionProjectSettingsWidget::AxivionProjectSettingsWidget(Project *project)
: m_projectSettings(projectSettingsHandler().projectSettings(project))
{
setUseGlobalSettingsCheckBoxVisible(false);
setUseGlobalSettingsLabelVisible(true);
setGlobalSettingsId("Axivion.Settings.General"); // FIXME move id to constants
m_linkedProject = new QLabel(this);
m_dashboardServers = new QComboBox(this);
m_dashboardServers->setSizeAdjustPolicy(QComboBox::AdjustToContents);
updateServers();
m_dashboardProjects = new QTreeWidget(this);
m_dashboardProjects->setHeaderHidden(true);
m_dashboardProjects->setRootIsDecorated(false);
m_infoLabel = new InfoLabel(this);
m_infoLabel->setVisible(false);
m_fetchProjects = new QPushButton(Tr::tr("Fetch Projects"));
m_link = new QPushButton(Tr::tr("Link Project"));
m_link->setEnabled(false);
m_unlink = new QPushButton(Tr::tr("Unlink Project"));
m_unlink->setEnabled(false);
using namespace Layouting;
Column {
noMargin,
m_dashboardServers,
m_linkedProject,
Tr::tr("Dashboard projects:"),
Core::ItemViewFind::createSearchableWrapper(m_dashboardProjects),
m_infoLabel,
Row { m_fetchProjects, m_link, m_unlink, st }
}.attachTo(this);
connect(m_dashboardServers, &QComboBox::currentIndexChanged,
this, &AxivionProjectSettingsWidget::onServerChanged);
connect(m_dashboardProjects, &QTreeWidget::itemSelectionChanged,
this, &AxivionProjectSettingsWidget::updateEnabledStates);
connect(m_fetchProjects, &QPushButton::clicked,
this, &AxivionProjectSettingsWidget::fetchProjects);
connect(m_link, &QPushButton::clicked,
this, &AxivionProjectSettingsWidget::linkProject);
connect(m_unlink, &QPushButton::clicked,
this, &AxivionProjectSettingsWidget::unlinkProject);
connect(&settings(), &AspectContainer::changed,
this, &AxivionProjectSettingsWidget::onSettingsChanged);
updateUi();
}
void AxivionProjectSettingsWidget::fetchProjects()
{
m_dashboardProjects->clear();
m_fetchProjects->setEnabled(false);
m_infoLabel->setVisible(false);
const auto onDashboardInfo = [this](const expected_str<DashboardInfo> &info) {
if (!info) {
m_infoLabel->setText(info.error());
m_infoLabel->setType(InfoLabel::Error);
m_infoLabel->setVisible(true);
} else {
for (const QString &project : info->projects)
new QTreeWidgetItem(m_dashboardProjects, {project});
}
updateEnabledStates();
};
m_taskTreeRunner.start(dashboardInfoRecipe(onDashboardInfo));
}
void AxivionProjectSettingsWidget::onSettingsChanged()
{
m_dashboardProjects->clear();
m_infoLabel->setVisible(false);
// check if serverId vanished - reset to default
const Id serverId = settings().defaultDashboardId();
if (m_projectSettings->dashboardId() != serverId) {
m_projectSettings->setDashboardId(serverId);
switchActiveDashboardId(serverId);
}
updateServers();
updateUi();
}
void AxivionProjectSettingsWidget::onServerChanged()
{
m_dashboardProjects->clear();
m_infoLabel->setVisible(false);
const Id id = m_dashboardServers->currentData().value<AxivionServer>().id;
m_projectSettings->setDashboardId(id);
switchActiveDashboardId(id);
updateUi();
}
void AxivionProjectSettingsWidget::linkProject()
{
const QList<QTreeWidgetItem *> selected = m_dashboardProjects->selectedItems();
QTC_ASSERT(selected.size() == 1, return);
const QString projectName = selected.first()->text(0);
m_projectSettings->setDashboardProjectName(projectName);
updateUi();
fetchProjectInfo(projectName);
}
void AxivionProjectSettingsWidget::unlinkProject()
{
QTC_ASSERT(!m_projectSettings->dashboardProjectName().isEmpty(), return);
m_projectSettings->setDashboardProjectName({});
updateUi();
fetchProjectInfo({});
}
void AxivionProjectSettingsWidget::updateUi()
{
const QString projectName = m_projectSettings->dashboardProjectName();
if (projectName.isEmpty())
m_linkedProject->setText(Tr::tr("This project is not linked to a dashboard project."));
else
m_linkedProject->setText(Tr::tr("This project is linked to \"%1\".").arg(projectName));
updateEnabledStates();
}
void AxivionProjectSettingsWidget::updateEnabledStates()
{
const bool hasDashboardSettings = !settings().serverForId(m_projectSettings->dashboardId())
.dashboard.isEmpty();
const bool linked = !m_projectSettings->dashboardProjectName().isEmpty();
const bool linkable = m_dashboardProjects->topLevelItemCount()
&& !m_dashboardProjects->selectedItems().isEmpty();
m_dashboardServers->setEnabled(!linked);
m_fetchProjects->setEnabled(hasDashboardSettings);
m_link->setEnabled(!linked && linkable);
m_unlink->setEnabled(linked);
if (!hasDashboardSettings) {
m_infoLabel->setText(Tr::tr("Incomplete or misconfigured settings."));
m_infoLabel->setType(InfoLabel::NotOk);
m_infoLabel->setVisible(true);
}
}
void AxivionProjectSettingsWidget::updateServers()
{
const QList<AxivionServer> available = settings().allAvailableServers();
m_dashboardServers->clear();
for (const AxivionServer &server : available)
m_dashboardServers->addItem(server.displayString(), QVariant::fromValue(server));
const Id id = m_projectSettings->dashboardId();
const int index = Utils::indexOf(available, [&id](const AxivionServer &s) {
return s.id == id;
});
if (index != -1)
m_dashboardServers->setCurrentIndex(index);
}
class AxivionProjectPanelFactory : public ProjectPanelFactory
{
public:
AxivionProjectPanelFactory()
{
setPriority(250);
setDisplayName(Tr::tr("Axivion"));
setCreateWidgetFunction([](Project *project) {
return new AxivionProjectSettingsWidget(project);
});
}
};
void AxivionProjectSettings::setupProjectPanel()
{
static AxivionProjectPanelFactory theAxivionProjectPanelFactory;
}
} // Axivion::Internal

View File

@@ -1,38 +0,0 @@
// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#pragma once
#include <utils/id.h>
#include <QObject>
namespace ProjectExplorer { class Project; }
namespace Axivion::Internal {
class AxivionProjectSettings : public QObject
{
public:
explicit AxivionProjectSettings(ProjectExplorer::Project *project);
void setDashboardProjectName(const QString &name) { m_dashboardProjectName = name; }
QString dashboardProjectName() const { return m_dashboardProjectName; }
void setDashboardId(const Utils::Id &dashboardId) { m_dashboardId = dashboardId; }
Utils::Id dashboardId() const { return m_dashboardId; }
static AxivionProjectSettings *projectSettings(ProjectExplorer::Project *project);
static void destroyProjectSettings();
static void setupProjectPanel();
private:
void load();
void save();
ProjectExplorer::Project *m_project = nullptr;
QString m_dashboardProjectName;
// id of the dashboard in use for this project, or default from settings on initialization
Utils::Id m_dashboardId;
};
} // Axivion::Internal