[plasma/union] src: Introduce PackageHandler as a class that encapsulates package operations
Arjen Hiemstra <[email protected]> Wed, 5 Aug 2026 10:33:23 +0000 (UTC)
| Newsgroups | gmane.comp.kde.cvs |
|---|---|
| Message-ID | <[email protected]> |
Git commit 1ca096d51f03019c28b8d5c40d04f9d789fe22bf by Arjen Hiemstra.
Committed on 05/08/2026 at 10:24.
Pushed by ahiemstra into branch 'master'.
Introduce PackageHandler as a class that encapsulates package operations
M +2 -0 src/CMakeLists.txt
A +72 -0 src/PackageHandler.cpp [License: LGPL(3+eV) LGPL(v3.0) LGPL(v2.1)]
A +43 -0 src/PackageHandler.h [License: LGPL(3+eV) LGPL(v3.0) LGPL(v2.1)]
https://invent.kde.org/plasma/union/-/commit/1ca096d51f03019c28b8d5c40d04f9d789fe22bf
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index b672e987..3efcfc5f 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -18,6 +18,7 @@ target_sources(Union PRIVATE
PlatformPlugin.cpp
StyleCache.cpp
StylePackage.cpp
+ PackageHandler.cpp
)
target_sources(Union PUBLIC
@@ -39,6 +40,7 @@ target_sources(Union PUBLIC
PluginRegistry.h
PlatformPlugin.h
StylePackage.h
+ PackageHandler.h
)
ecm_qt_declare_logging_category(Union
diff --git a/src/PackageHandler.cpp b/src/PackageHandler.cpp
new file mode 100644
index 00000000..53947f23
--- /dev/null
+++ b/src/PackageHandler.cpp
@@ -0,0 +1,72 @@
+// SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
+// SPDX-FileCopyrightText: 2026 Arjen Hiemstra <[email protected]>
+
+#include "PackageHandler.h"
+
+#include <QFile>
+#include <QJsonArray>
+
+#include "InputPlugin.h"
+#include "PlatformPlugin.h"
+
+#include "union_logging.h"
+
+using namespace Union;
+using namespace Qt::StringLiterals;
+
+namespace fs = std::filesystem;
+
+class UNION_NO_EXPORT PackageHandler::Private
+{
+public:
+ std::shared_ptr<PlatformPlugin> platform;
+};
+
+PackageHandler::PackageHandler(const std::shared_ptr<PlatformPlugin> &platformPlugin)
+ : d(std::make_unique<Private>())
+{
+ d->platform = platformPlugin;
+}
+
+PackageHandler::~PackageHandler() = default;
+
+StylePackage PackageHandler::package(const QString &id)
+{
+ const auto paths = d->platform->stylePackagePaths();
+ for (const auto &path : paths) {
+ auto packagePath = path / id.toStdString();
+ if (!fs::exists(packagePath)) {
+ continue;
+ }
+
+ auto package = StylePackage{packagePath};
+ if (package.isValid()) {
+ return package;
+ }
+ }
+
+ return StylePackage{};
+}
+
+QList<StylePackage> PackageHandler::allPackages()
+{
+ QSet<QString> seenPackages;
+ QList<StylePackage> result;
+
+ const auto packagePaths = d->platform->stylePackagePaths();
+ for (const auto &packagePath : packagePaths) {
+ for (auto entry : fs::directory_iterator(packagePath)) {
+ if (!entry.is_directory()) {
+ continue;
+ }
+
+ auto package = StylePackage{entry.path()};
+ if (package.isValid() && !seenPackages.contains(package.id())) {
+ result.append(package);
+ seenPackages.insert(package.id());
+ }
+ }
+ }
+
+ return result;
+}
diff --git a/src/PackageHandler.h b/src/PackageHandler.h
new file mode 100644
index 00000000..8498184b
--- /dev/null
+++ b/src/PackageHandler.h
@@ -0,0 +1,43 @@
+// SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
+// SPDX-FileCopyrightText: 2026 Arjen Hiemstra <[email protected]>
+
+#pragma once
+
+#include <filesystem>
+
+#include "StylePackage.h"
+
+#include "union_export.h"
+
+namespace Union
+{
+class PlatformPlugin;
+
+/*!
+ * A class that contains operations that can be performed on style packages.
+ *
+ * This encapsulates things like listing packages, installing and uninstalling
+ * and related operations.
+ */
+class UNION_EXPORT PackageHandler
+{
+public:
+ PackageHandler(const std::shared_ptr<PlatformPlugin> &platformPlugin);
+ ~PackageHandler();
+
+ /*!
+ * Returns the package with id \p id or an invalid package if it cannot be found.
+ */
+ StylePackage package(const QString &id);
+
+ /*!
+ * Returns a list of all installed packages.
+ */
+ QList<StylePackage> allPackages();
+
+private:
+ class Private;
+ const std::unique_ptr<Private> d;
+};
+
+}