Skip to content

Commit eb88420

Browse files
committed
Add package manager
1 parent 99da85e commit eb88420

22 files changed

Lines changed: 1292 additions & 3 deletions

src/libs/application/uishell/src/qml/PackageManagerView.qml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,7 @@ Item {
324324
height: 64
325325
anchors.centerIn: parent
326326
source: singerButton.modelData.avatarPath ?? ""
327+
mipmap: true
327328
}
328329
}
329330
Text {
@@ -397,6 +398,7 @@ Item {
397398
height: 64
398399
anchors.centerIn: parent
399400
source: singerDetailView.modelData.avatarPath ?? ""
401+
mipmap: true
400402
}
401403
}
402404
ColumnLayout {
@@ -423,7 +425,7 @@ Item {
423425
delegate: Button {
424426
required property var modelData
425427
icon.source: "image://fluent-system-icons/play_circle"
426-
text: modelData.name
428+
text: modelData.name || qsTr("Preview")
427429
// TODO play audio
428430
}
429431
}
@@ -448,10 +450,10 @@ Item {
448450
if (item) {
449451
item.destroy()
450452
}
451-
item = delegate.createObject(this, {
453+
item = delegate?.createObject(this, {
452454
modelData: singerDetailView.modelData,
453455
index: singerDetailView.index
454-
})
456+
}) ?? null
455457
}
456458
data: [item]
457459
}
@@ -523,6 +525,7 @@ Item {
523525
anchors.margins: 8
524526
source: singerDetailView.modelData.backgroundPath ?? ""
525527
fillMode: Image.PreserveAspectFit
528+
mipmap: true
526529
}
527530
}
528531
}

src/plugins/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ add_subdirectory(coreplugin)
125125
add_subdirectory(audio)
126126
add_subdirectory(welcomewizard)
127127
add_subdirectory(maintenance)
128+
add_subdirectory(packagemanager)
128129
add_subdirectory(importexportmanager)
129130
add_subdirectory(visualeditor)
130131
add_subdirectory(midiformatconverter)
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
project(packagemanager
2+
VERSION ${APPLICATION_VERSION}
3+
DESCRIPTION ${CURRENT_PLUGIN_DESC}
4+
)
5+
6+
diffscope_add_builtin_plugin(${PROJECT_NAME}
7+
NAME org.diffscope.packagemanager
8+
DISPLAY_NAME "Package Manager"
9+
MACRO_PREFIX PACKAGE_MANAGER
10+
QML_MODULE_NAME PackageManager
11+
QT_LINKS
12+
Core
13+
Gui
14+
Widgets
15+
Qml
16+
Quick
17+
QuickDialogs2
18+
LINKS
19+
ExtensionSystem::ExtensionSystem
20+
ChorusKit::AppCore
21+
uishell
22+
QAKCore
23+
QAKQuick
24+
coreplugin
25+
INCLUDE_PRIVATE
26+
internal/**
27+
)
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#include "PackageManagerPlugin.h"
2+
3+
#include <CoreApi/runtimeinterface.h>
4+
#include <CoreApi/settingcatalog.h>
5+
#include <CoreApi/translationmanager.h>
6+
7+
#include <QAKCore/actionregistry.h>
8+
9+
#include <coreplugin/CoreInterface.h>
10+
#include <coreplugin/HomeWindowInterface.h>
11+
#include <coreplugin/ProjectWindowInterface.h>
12+
13+
#include <extensionsystem/pluginspec.h>
14+
15+
#include <packagemanager/internal/PackageManagerSettings.h>
16+
#include <packagemanager/internal/PackageManagerAddOn.h>
17+
#include <packagemanager/internal/PackageManagerPage.h>
18+
19+
static auto getPackageManagerActionExtension() {
20+
return QAK_STATIC_ACTION_EXTENSION(packagemanager);
21+
}
22+
23+
namespace PackageManager {
24+
25+
PackageManagerPlugin::PackageManagerPlugin() = default;
26+
27+
PackageManagerPlugin::~PackageManagerPlugin() = default;
28+
29+
bool PackageManagerPlugin::initialize(const QStringList &arguments, QString *errorMessage) {
30+
Q_UNUSED(arguments)
31+
Q_UNUSED(errorMessage)
32+
33+
Core::RuntimeInterface::translationManager()->addTranslationPath(pluginSpec()->location() + QStringLiteral("/translations"));
34+
new PackageManagerSettings(pluginSpec()->location(), this);
35+
36+
Core::CoreInterface::actionRegistry()->addExtension(::getPackageManagerActionExtension());
37+
Core::HomeWindowInterfaceRegistry::instance()->attach<PackageManagerAddOn>();
38+
Core::ProjectWindowInterfaceRegistry::instance()->attach<PackageManagerAddOn>();
39+
40+
Core::CoreInterface::settingCatalog()->addPage(new PackageManagerPage);
41+
42+
return true;
43+
}
44+
45+
void PackageManagerPlugin::extensionsInitialized() {
46+
}
47+
48+
bool PackageManagerPlugin::delayedInitialize() {
49+
return IPlugin::delayedInitialize();
50+
}
51+
52+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#ifndef DIFFSCOPE_PACKAGEMANAGER_PACKAGEMANAGERPLUGIN_H
2+
#define DIFFSCOPE_PACKAGEMANAGER_PACKAGEMANAGERPLUGIN_H
3+
4+
#include <extensionsystem/iplugin.h>
5+
6+
namespace PackageManager {
7+
8+
class PackageManagerPlugin : public ExtensionSystem::IPlugin {
9+
Q_OBJECT
10+
Q_PLUGIN_METADATA(IID "org.OpenVPI.DiffScope.Plugin" FILE "plugin.json")
11+
public:
12+
PackageManagerPlugin();
13+
~PackageManagerPlugin() override;
14+
15+
bool initialize(const QStringList &arguments, QString *errorMessage) override;
16+
void extensionsInitialized() override;
17+
bool delayedInitialize() override;
18+
};
19+
20+
}
21+
22+
#endif // DIFFSCOPE_PACKAGEMANAGER_PACKAGEMANAGERPLUGIN_H
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
#include "PackageManagerSettings.h"
2+
3+
#include <algorithm>
4+
5+
#include <QDir>
6+
#include <QSettings>
7+
#include <QtGlobal>
8+
9+
#include <CoreApi/runtimeinterface.h>
10+
11+
namespace PackageManager {
12+
13+
static PackageManagerSettings *m_instance = nullptr;
14+
15+
PackageManagerSettings::PackageManagerSettings(const QString &pluginLocation, QObject *parent)
16+
: QObject(parent), m_pluginLocation(pluginLocation) {
17+
Q_ASSERT(!m_instance);
18+
m_instance = this;
19+
load();
20+
}
21+
22+
PackageManagerSettings::~PackageManagerSettings() {
23+
save();
24+
m_instance = nullptr;
25+
}
26+
27+
PackageManagerSettings *PackageManagerSettings::instance() {
28+
return m_instance;
29+
}
30+
31+
QString PackageManagerSettings::dspmPath() {
32+
Q_ASSERT(m_instance);
33+
return m_instance->m_dspmPath;
34+
}
35+
36+
void PackageManagerSettings::setDspmPath(const QString &dspmPath) {
37+
Q_ASSERT(m_instance);
38+
auto normalized = QDir::toNativeSeparators(dspmPath.trimmed());
39+
if (m_instance->m_dspmPath == normalized)
40+
return;
41+
m_instance->m_dspmPath = normalized;
42+
Q_EMIT m_instance->dspmPathChanged();
43+
}
44+
45+
QString PackageManagerSettings::packageDir() {
46+
Q_ASSERT(m_instance);
47+
return m_instance->m_packageDir;
48+
}
49+
50+
void PackageManagerSettings::setPackageDir(const QString &packageDir) {
51+
Q_ASSERT(m_instance);
52+
auto normalized = QDir::toNativeSeparators(packageDir.trimmed());
53+
if (m_instance->m_packageDir == normalized)
54+
return;
55+
m_instance->m_packageDir = normalized;
56+
Q_EMIT m_instance->packageDirChanged();
57+
}
58+
59+
int PackageManagerSettings::timeoutSeconds() {
60+
Q_ASSERT(m_instance);
61+
return m_instance->m_timeoutSeconds;
62+
}
63+
64+
void PackageManagerSettings::setTimeoutSeconds(int timeoutSeconds) {
65+
Q_ASSERT(m_instance);
66+
timeoutSeconds = std::max(1, timeoutSeconds);
67+
if (m_instance->m_timeoutSeconds == timeoutSeconds)
68+
return;
69+
m_instance->m_timeoutSeconds = timeoutSeconds;
70+
Q_EMIT m_instance->timeoutSecondsChanged();
71+
}
72+
73+
QString PackageManagerSettings::defaultPackageDir() {
74+
#if defined(Q_OS_WIN)
75+
auto base = qEnvironmentVariable("LOCALAPPDATA");
76+
if (base.isEmpty()) {
77+
base = QDir::home().filePath(QStringLiteral("AppData/Local"));
78+
}
79+
return QDir::toNativeSeparators(QDir(base).filePath(QStringLiteral("OpenVPI/DiffScope_packages")));
80+
#elif defined(Q_OS_MACOS)
81+
return QDir::toNativeSeparators(QDir::home().filePath(QStringLiteral("Library/Application Support/OpenVPI/DiffScope_packages")));
82+
#else
83+
auto base = qEnvironmentVariable("XDG_DATA_HOME");
84+
if (base.isEmpty()) {
85+
base = QDir::home().filePath(QStringLiteral(".local/share"));
86+
}
87+
return QDir::toNativeSeparators(QDir(base).filePath(QStringLiteral("OpenVPI/DiffScope_packages")));
88+
#endif
89+
}
90+
91+
QString PackageManagerSettings::defaultDspmPath() {
92+
#if defined(Q_OS_WIN)
93+
const auto executableName = QStringLiteral("dspm.exe");
94+
#else
95+
const auto executableName = QStringLiteral("dspm");
96+
#endif
97+
if (m_instance) {
98+
return QDir::toNativeSeparators(QDir(m_instance->m_pluginLocation).filePath(QStringLiteral("dspm/") + executableName));
99+
}
100+
return executableName;
101+
}
102+
103+
void PackageManagerSettings::load() {
104+
auto settings = Core::RuntimeInterface::settings();
105+
settings->beginGroup(staticMetaObject.className());
106+
m_dspmPath = settings->value("dspmPath", defaultDspmPath()).toString();
107+
m_packageDir = settings->value("packageDir", defaultPackageDir()).toString();
108+
m_timeoutSeconds = std::max(1, settings->value("timeoutSeconds", 5).toInt());
109+
settings->endGroup();
110+
111+
Q_EMIT dspmPathChanged();
112+
Q_EMIT packageDirChanged();
113+
Q_EMIT timeoutSecondsChanged();
114+
}
115+
116+
void PackageManagerSettings::save() const {
117+
auto settings = Core::RuntimeInterface::settings();
118+
settings->beginGroup(staticMetaObject.className());
119+
settings->setValue("dspmPath", m_dspmPath);
120+
settings->setValue("packageDir", m_packageDir);
121+
settings->setValue("timeoutSeconds", m_timeoutSeconds);
122+
settings->endGroup();
123+
}
124+
125+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
#ifndef DIFFSCOPE_PACKAGEMANAGER_PACKAGEMANAGERSETTINGS_H
2+
#define DIFFSCOPE_PACKAGEMANAGER_PACKAGEMANAGERSETTINGS_H
3+
4+
#include <qqmlintegration.h>
5+
6+
#include <QObject>
7+
8+
class QQmlEngine;
9+
class QJSEngine;
10+
11+
namespace PackageManager {
12+
13+
class PackageManagerPlugin;
14+
15+
class PackageManagerSettings : public QObject {
16+
Q_OBJECT
17+
QML_ELEMENT
18+
QML_SINGLETON
19+
20+
Q_PROPERTY(QString dspmPath READ dspmPath WRITE setDspmPath NOTIFY dspmPathChanged)
21+
Q_PROPERTY(QString packageDir READ packageDir WRITE setPackageDir NOTIFY packageDirChanged)
22+
Q_PROPERTY(int timeoutSeconds READ timeoutSeconds WRITE setTimeoutSeconds NOTIFY timeoutSecondsChanged)
23+
24+
public:
25+
~PackageManagerSettings() override;
26+
27+
static PackageManagerSettings *instance();
28+
29+
static inline PackageManagerSettings *create(QQmlEngine *, QJSEngine *) {
30+
return instance();
31+
}
32+
33+
static QString dspmPath();
34+
static void setDspmPath(const QString &dspmPath);
35+
36+
static QString packageDir();
37+
static void setPackageDir(const QString &packageDir);
38+
39+
static int timeoutSeconds();
40+
static void setTimeoutSeconds(int timeoutSeconds);
41+
42+
static QString defaultPackageDir();
43+
static QString defaultDspmPath();
44+
45+
void load();
46+
void save() const;
47+
48+
Q_SIGNALS:
49+
void dspmPathChanged();
50+
void packageDirChanged();
51+
void timeoutSecondsChanged();
52+
53+
private:
54+
friend class PackageManagerPlugin;
55+
explicit PackageManagerSettings(const QString &pluginLocation, QObject *parent = nullptr);
56+
57+
QString m_pluginLocation;
58+
QString m_dspmPath;
59+
QString m_packageDir;
60+
int m_timeoutSeconds{5};
61+
};
62+
63+
}
64+
65+
#endif // DIFFSCOPE_PACKAGEMANAGER_PACKAGEMANAGERSETTINGS_H

0 commit comments

Comments
 (0)