[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;
+};
+
+}