From d530e209b37fd4881a490bbfa8af39cd70fd325a Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 02:10:20 +1000 Subject: [PATCH 01/81] feat: add c++ settings --- plugin/src/Caelestia/CMakeLists.txt | 4 +- plugin/src/Caelestia/Config/CMakeLists.txt | 27 ++ .../src/Caelestia/Config/advancedconfig.hpp | 235 ++++++++++++++++++ .../src/Caelestia/Config/appearanceconfig.hpp | 207 +++++++++++++++ .../src/Caelestia/Config/backgroundconfig.hpp | 74 ++++++ plugin/src/Caelestia/Config/barconfig.hpp | 133 ++++++++++ plugin/src/Caelestia/Config/borderconfig.hpp | 26 ++ plugin/src/Caelestia/Config/config.cpp | 138 ++++++++++ plugin/src/Caelestia/Config/config.hpp | 94 +++++++ plugin/src/Caelestia/Config/configobject.cpp | 107 ++++++++ plugin/src/Caelestia/Config/configobject.hpp | 63 +++++ .../Caelestia/Config/controlcenterconfig.hpp | 17 ++ .../src/Caelestia/Config/dashboardconfig.hpp | 36 +++ plugin/src/Caelestia/Config/generalconfig.hpp | 60 +++++ .../src/Caelestia/Config/launcherconfig.hpp | 46 ++++ plugin/src/Caelestia/Config/lockconfig.hpp | 19 ++ plugin/src/Caelestia/Config/notifsconfig.hpp | 25 ++ plugin/src/Caelestia/Config/osdconfig.hpp | 19 ++ plugin/src/Caelestia/Config/serviceconfig.hpp | 32 +++ plugin/src/Caelestia/Config/sessionconfig.hpp | 49 ++++ plugin/src/Caelestia/Config/sidebarconfig.hpp | 17 ++ plugin/src/Caelestia/Config/userpaths.hpp | 26 ++ .../src/Caelestia/Config/utilitiesconfig.hpp | 56 +++++ plugin/src/Caelestia/Config/winfoconfig.hpp | 17 ++ 24 files changed, 1526 insertions(+), 1 deletion(-) create mode 100644 plugin/src/Caelestia/Config/CMakeLists.txt create mode 100644 plugin/src/Caelestia/Config/advancedconfig.hpp create mode 100644 plugin/src/Caelestia/Config/appearanceconfig.hpp create mode 100644 plugin/src/Caelestia/Config/backgroundconfig.hpp create mode 100644 plugin/src/Caelestia/Config/barconfig.hpp create mode 100644 plugin/src/Caelestia/Config/borderconfig.hpp create mode 100644 plugin/src/Caelestia/Config/config.cpp create mode 100644 plugin/src/Caelestia/Config/config.hpp create mode 100644 plugin/src/Caelestia/Config/configobject.cpp create mode 100644 plugin/src/Caelestia/Config/configobject.hpp create mode 100644 plugin/src/Caelestia/Config/controlcenterconfig.hpp create mode 100644 plugin/src/Caelestia/Config/dashboardconfig.hpp create mode 100644 plugin/src/Caelestia/Config/generalconfig.hpp create mode 100644 plugin/src/Caelestia/Config/launcherconfig.hpp create mode 100644 plugin/src/Caelestia/Config/lockconfig.hpp create mode 100644 plugin/src/Caelestia/Config/notifsconfig.hpp create mode 100644 plugin/src/Caelestia/Config/osdconfig.hpp create mode 100644 plugin/src/Caelestia/Config/serviceconfig.hpp create mode 100644 plugin/src/Caelestia/Config/sessionconfig.hpp create mode 100644 plugin/src/Caelestia/Config/sidebarconfig.hpp create mode 100644 plugin/src/Caelestia/Config/userpaths.hpp create mode 100644 plugin/src/Caelestia/Config/utilitiesconfig.hpp create mode 100644 plugin/src/Caelestia/Config/winfoconfig.hpp diff --git a/plugin/src/Caelestia/CMakeLists.txt b/plugin/src/Caelestia/CMakeLists.txt index 211cbb56..01f43b21 100644 --- a/plugin/src/Caelestia/CMakeLists.txt +++ b/plugin/src/Caelestia/CMakeLists.txt @@ -12,12 +12,13 @@ set(QT_QML_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/qml") qt_standard_project_setup(REQUIRES 6.9) function(qml_module arg_TARGET) - cmake_parse_arguments(PARSE_ARGV 1 arg "" "URI" "SOURCES;LIBRARIES") + cmake_parse_arguments(PARSE_ARGV 1 arg "" "URI" "SOURCES;QML_FILES;LIBRARIES") qt_add_qml_module(${arg_TARGET} URI ${arg_URI} VERSION ${VERSION} SOURCES ${arg_SOURCES} + QML_FILES ${arg_QML_FILES} ) qt_query_qml_module(${arg_TARGET} @@ -58,6 +59,7 @@ qml_module(caelestia ) add_subdirectory(Components) +add_subdirectory(Config) add_subdirectory(Internal) add_subdirectory(Models) add_subdirectory(Services) diff --git a/plugin/src/Caelestia/Config/CMakeLists.txt b/plugin/src/Caelestia/Config/CMakeLists.txt new file mode 100644 index 00000000..9351ec41 --- /dev/null +++ b/plugin/src/Caelestia/Config/CMakeLists.txt @@ -0,0 +1,27 @@ +qml_module(caelestia-config + URI Caelestia.Config + SOURCES + config.hpp config.cpp + configobject.hpp + advancedconfig.hpp + appearanceconfig.hpp + backgroundconfig.hpp + barconfig.hpp + borderconfig.hpp + controlcenterconfig.hpp + dashboardconfig.hpp + generalconfig.hpp + launcherconfig.hpp + lockconfig.hpp + notifsconfig.hpp + osdconfig.hpp + serviceconfig.hpp + sessionconfig.hpp + sidebarconfig.hpp + userpaths.hpp + utilitiesconfig.hpp + winfoconfig.hpp + configobject.cpp + LIBRARIES + Qt::Quick +) diff --git a/plugin/src/Caelestia/Config/advancedconfig.hpp b/plugin/src/Caelestia/Config/advancedconfig.hpp new file mode 100644 index 00000000..57352a32 --- /dev/null +++ b/plugin/src/Caelestia/Config/advancedconfig.hpp @@ -0,0 +1,235 @@ +#pragma once + +#include "configobject.hpp" + +#include + +namespace caelestia::config { + +class AnimCurves : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(QList, emphasized) + CONFIG_PROPERTY(QList, emphasizedAccel) + CONFIG_PROPERTY(QList, emphasizedDecel) + CONFIG_PROPERTY(QList, standard) + CONFIG_PROPERTY(QList, standardAccel) + CONFIG_PROPERTY(QList, standardDecel) + CONFIG_PROPERTY(QList, expressiveFastSpatial) + CONFIG_PROPERTY(QList, expressiveDefaultSpatial) + CONFIG_PROPERTY(QList, expressiveSlowSpatial) + +public: + explicit AnimCurves(QObject* parent = nullptr) + : ConfigObject(parent) + , m_emphasized({ 0.05, 0, 2.0 / 15.0, 0.06, 1.0 / 6.0, 0.4, 5.0 / 24.0, 0.82, 0.25, 1, 1, 1 }) + , m_emphasizedAccel({ 0.3, 0, 0.8, 0.15, 1, 1 }) + , m_emphasizedDecel({ 0.05, 0.7, 0.1, 1, 1, 1 }) + , m_standard({ 0.2, 0, 0, 1, 1, 1 }) + , m_standardAccel({ 0.3, 0, 1, 1, 1, 1 }) + , m_standardDecel({ 0, 0, 0, 1, 1, 1 }) + , m_expressiveFastSpatial({ 0.42, 1.67, 0.21, 0.9, 1, 1 }) + , m_expressiveDefaultSpatial({ 0.38, 1.21, 0.22, 1, 1, 1 }) + , m_expressiveSlowSpatial({ 0.39, 1.29, 0.35, 0.98, 1, 1 }) {} +}; + +class AdvancedAppearance : public ConfigObject { + Q_OBJECT + CONFIG_SUBOBJECT(AnimCurves, curves) + +public: + explicit AdvancedAppearance(QObject* parent = nullptr) + : ConfigObject(parent) + , m_curves(new AnimCurves(this)) {} +}; + +class BarSizes : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(int, innerWidth, 40) + CONFIG_PROPERTY(int, windowPreviewSize, 400) + CONFIG_PROPERTY(int, trayMenuWidth, 300) + CONFIG_PROPERTY(int, batteryWidth, 250) + CONFIG_PROPERTY(int, networkWidth, 320) + CONFIG_PROPERTY(int, kbLayoutWidth, 320) + +public: + explicit BarSizes(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class AdvancedDashboard : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(bool, showDashboard, true) + CONFIG_PROPERTY(bool, showMedia, true) + CONFIG_PROPERTY(bool, showPerformance, true) + CONFIG_PROPERTY(bool, showWeather, true) + + Q_PROPERTY(int tabIndicatorHeight READ tabIndicatorHeight CONSTANT) + Q_PROPERTY(int tabIndicatorSpacing READ tabIndicatorSpacing CONSTANT) + Q_PROPERTY(int infoWidth READ infoWidth CONSTANT) + Q_PROPERTY(int infoIconSize READ infoIconSize CONSTANT) + Q_PROPERTY(int dateTimeWidth READ dateTimeWidth CONSTANT) + Q_PROPERTY(int mediaWidth READ mediaWidth CONSTANT) + Q_PROPERTY(int mediaProgressSweep READ mediaProgressSweep CONSTANT) + Q_PROPERTY(int mediaProgressThickness READ mediaProgressThickness CONSTANT) + Q_PROPERTY(int resourceProgessThickness READ resourceProgessThickness CONSTANT) + Q_PROPERTY(int weatherWidth READ weatherWidth CONSTANT) + Q_PROPERTY(int mediaCoverArtSize READ mediaCoverArtSize CONSTANT) + Q_PROPERTY(int mediaVisualiserSize READ mediaVisualiserSize CONSTANT) + Q_PROPERTY(int resourceSize READ resourceSize CONSTANT) + +public: + explicit AdvancedDashboard(QObject* parent = nullptr) + : ConfigObject(parent) {} + + [[nodiscard]] static int tabIndicatorHeight() { return 3; } + + [[nodiscard]] static int tabIndicatorSpacing() { return 5; } + + [[nodiscard]] static int infoWidth() { return 200; } + + [[nodiscard]] static int infoIconSize() { return 25; } + + [[nodiscard]] static int dateTimeWidth() { return 110; } + + [[nodiscard]] static int mediaWidth() { return 200; } + + [[nodiscard]] static int mediaProgressSweep() { return 180; } + + [[nodiscard]] static int mediaProgressThickness() { return 8; } + + [[nodiscard]] static int resourceProgessThickness() { return 10; } + + [[nodiscard]] static int weatherWidth() { return 250; } + + [[nodiscard]] static int mediaCoverArtSize() { return 150; } + + [[nodiscard]] static int mediaVisualiserSize() { return 80; } + + [[nodiscard]] static int resourceSize() { return 200; } +}; + +class LauncherSizes : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(int, itemWidth, 600) + CONFIG_PROPERTY(int, itemHeight, 57) + CONFIG_PROPERTY(int, wallpaperWidth, 280) + CONFIG_PROPERTY(int, wallpaperHeight, 200) + +public: + explicit LauncherSizes(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class NotifsSizes : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(int, width, 400) + CONFIG_PROPERTY(int, image, 41) + CONFIG_PROPERTY(int, badge, 20) + +public: + explicit NotifsSizes(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class OsdSizes : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(int, sliderWidth, 30) + CONFIG_PROPERTY(int, sliderHeight, 150) + +public: + explicit OsdSizes(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class SessionSizes : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(int, button, 80) + +public: + explicit SessionSizes(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class SidebarSizes : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(int, width, 430) + +public: + explicit SidebarSizes(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class UtilitiesSizes : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(int, width, 430) + CONFIG_PROPERTY(int, toastWidth, 430) + +public: + explicit UtilitiesSizes(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class LockSizes : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(qreal, heightMult, 0.7) + CONFIG_PROPERTY(qreal, ratio, 16.0 / 9.0) + CONFIG_PROPERTY(int, centerWidth, 600) + +public: + explicit LockSizes(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class WInfoSizes : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(qreal, heightMult, 0.7) + CONFIG_PROPERTY(qreal, detailsWidth, 500) + +public: + explicit WInfoSizes(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class ControlCenterSizes : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(qreal, heightMult, 0.7) + CONFIG_PROPERTY(qreal, ratio, 16.0 / 9.0) + +public: + explicit ControlCenterSizes(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class AdvancedConfig : public ConfigObject { + Q_OBJECT + CONFIG_SUBOBJECT(AdvancedAppearance, appearance) + CONFIG_SUBOBJECT(BarSizes, bar) + CONFIG_SUBOBJECT(AdvancedDashboard, dashboard) + CONFIG_SUBOBJECT(LauncherSizes, launcher) + CONFIG_SUBOBJECT(NotifsSizes, notifs) + CONFIG_SUBOBJECT(OsdSizes, osd) + CONFIG_SUBOBJECT(SessionSizes, session) + CONFIG_SUBOBJECT(SidebarSizes, sidebar) + CONFIG_SUBOBJECT(UtilitiesSizes, utilities) + CONFIG_SUBOBJECT(LockSizes, lock) + CONFIG_SUBOBJECT(WInfoSizes, winfo) + CONFIG_SUBOBJECT(ControlCenterSizes, controlCenter) + +public: + explicit AdvancedConfig(QObject* parent = nullptr) + : ConfigObject(parent) + , m_appearance(new AdvancedAppearance(this)) + , m_bar(new BarSizes(this)) + , m_dashboard(new AdvancedDashboard(this)) + , m_launcher(new LauncherSizes(this)) + , m_notifs(new NotifsSizes(this)) + , m_osd(new OsdSizes(this)) + , m_session(new SessionSizes(this)) + , m_sidebar(new SidebarSizes(this)) + , m_utilities(new UtilitiesSizes(this)) + , m_lock(new LockSizes(this)) + , m_winfo(new WInfoSizes(this)) + , m_controlCenter(new ControlCenterSizes(this)) {} +}; + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/appearanceconfig.hpp b/plugin/src/Caelestia/Config/appearanceconfig.hpp new file mode 100644 index 00000000..4d4acc08 --- /dev/null +++ b/plugin/src/Caelestia/Config/appearanceconfig.hpp @@ -0,0 +1,207 @@ +#pragma once + +#include "configobject.hpp" + +#include + +namespace caelestia::config { + +class AppearanceRounding : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(qreal, scale, 1) + + Q_PROPERTY(int small READ small NOTIFY scaleChanged) + Q_PROPERTY(int normal READ normal NOTIFY scaleChanged) + Q_PROPERTY(int large READ large NOTIFY scaleChanged) + Q_PROPERTY(int full READ full NOTIFY scaleChanged) + +public: + explicit AppearanceRounding(QObject* parent = nullptr) + : ConfigObject(parent) {} + + [[nodiscard]] int small() const { return static_cast(12 * m_scale); } + + [[nodiscard]] int normal() const { return static_cast(17 * m_scale); } + + [[nodiscard]] int large() const { return static_cast(25 * m_scale); } + + [[nodiscard]] int full() const { return static_cast(1000 * m_scale); } +}; + +class AppearanceSpacing : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(qreal, scale, 1) + + Q_PROPERTY(int small READ small NOTIFY scaleChanged) + Q_PROPERTY(int smaller READ smaller NOTIFY scaleChanged) + Q_PROPERTY(int normal READ normal NOTIFY scaleChanged) + Q_PROPERTY(int larger READ larger NOTIFY scaleChanged) + Q_PROPERTY(int large READ large NOTIFY scaleChanged) + +public: + explicit AppearanceSpacing(QObject* parent = nullptr) + : ConfigObject(parent) {} + + [[nodiscard]] int small() const { return static_cast(7 * m_scale); } + + [[nodiscard]] int smaller() const { return static_cast(10 * m_scale); } + + [[nodiscard]] int normal() const { return static_cast(12 * m_scale); } + + [[nodiscard]] int larger() const { return static_cast(15 * m_scale); } + + [[nodiscard]] int large() const { return static_cast(20 * m_scale); } +}; + +class AppearancePadding : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(qreal, scale, 1) + + Q_PROPERTY(int small READ small NOTIFY scaleChanged) + Q_PROPERTY(int smaller READ smaller NOTIFY scaleChanged) + Q_PROPERTY(int normal READ normal NOTIFY scaleChanged) + Q_PROPERTY(int larger READ larger NOTIFY scaleChanged) + Q_PROPERTY(int large READ large NOTIFY scaleChanged) + +public: + explicit AppearancePadding(QObject* parent = nullptr) + : ConfigObject(parent) {} + + [[nodiscard]] int small() const { return static_cast(5 * m_scale); } + + [[nodiscard]] int smaller() const { return static_cast(7 * m_scale); } + + [[nodiscard]] int normal() const { return static_cast(10 * m_scale); } + + [[nodiscard]] int larger() const { return static_cast(12 * m_scale); } + + [[nodiscard]] int large() const { return static_cast(15 * m_scale); } +}; + +class FontFamily : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(QString, sans, QStringLiteral("Rubik")) + CONFIG_PROPERTY(QString, mono, QStringLiteral("CaskaydiaCove NF")) + CONFIG_PROPERTY(QString, material, QStringLiteral("Material Symbols Rounded")) + CONFIG_PROPERTY(QString, clock, QStringLiteral("Rubik")) + +public: + explicit FontFamily(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class FontSize : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(qreal, scale, 1) + + Q_PROPERTY(int small READ small NOTIFY scaleChanged) + Q_PROPERTY(int smaller READ smaller NOTIFY scaleChanged) + Q_PROPERTY(int normal READ normal NOTIFY scaleChanged) + Q_PROPERTY(int larger READ larger NOTIFY scaleChanged) + Q_PROPERTY(int large READ large NOTIFY scaleChanged) + Q_PROPERTY(int extraLarge READ extraLarge NOTIFY scaleChanged) + +public: + explicit FontSize(QObject* parent = nullptr) + : ConfigObject(parent) {} + + [[nodiscard]] int small() const { return static_cast(11 * m_scale); } + + [[nodiscard]] int smaller() const { return static_cast(12 * m_scale); } + + [[nodiscard]] int normal() const { return static_cast(13 * m_scale); } + + [[nodiscard]] int larger() const { return static_cast(15 * m_scale); } + + [[nodiscard]] int large() const { return static_cast(18 * m_scale); } + + [[nodiscard]] int extraLarge() const { return static_cast(28 * m_scale); } +}; + +class AppearanceFont : public ConfigObject { + Q_OBJECT + CONFIG_SUBOBJECT(FontFamily, family) + CONFIG_SUBOBJECT(FontSize, size) + +public: + explicit AppearanceFont(QObject* parent = nullptr) + : ConfigObject(parent) + , m_family(new FontFamily(this)) + , m_size(new FontSize(this)) {} +}; + +class AnimDurations : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(qreal, scale, 1) + + Q_PROPERTY(int small READ small NOTIFY scaleChanged) + Q_PROPERTY(int normal READ normal NOTIFY scaleChanged) + Q_PROPERTY(int large READ large NOTIFY scaleChanged) + Q_PROPERTY(int extraLarge READ extraLarge NOTIFY scaleChanged) + Q_PROPERTY(int expressiveFastSpatial READ expressiveFastSpatial NOTIFY scaleChanged) + Q_PROPERTY(int expressiveDefaultSpatial READ expressiveDefaultSpatial NOTIFY scaleChanged) + Q_PROPERTY(int expressiveSlowSpatial READ expressiveSlowSpatial NOTIFY scaleChanged) + +public: + explicit AnimDurations(QObject* parent = nullptr) + : ConfigObject(parent) {} + + [[nodiscard]] int small() const { return static_cast(200 * m_scale); } + + [[nodiscard]] int normal() const { return static_cast(400 * m_scale); } + + [[nodiscard]] int large() const { return static_cast(600 * m_scale); } + + [[nodiscard]] int extraLarge() const { return static_cast(1000 * m_scale); } + + [[nodiscard]] int expressiveFastSpatial() const { return static_cast(350 * m_scale); } + + [[nodiscard]] int expressiveDefaultSpatial() const { return static_cast(500 * m_scale); } + + [[nodiscard]] int expressiveSlowSpatial() const { return static_cast(650 * m_scale); } +}; + +class AppearanceAnim : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(qreal, mediaGifSpeedAdjustment, 300) + CONFIG_PROPERTY(qreal, sessionGifSpeed, 0.7) + CONFIG_SUBOBJECT(AnimDurations, durations) + +public: + explicit AppearanceAnim(QObject* parent = nullptr) + : ConfigObject(parent) + , m_durations(new AnimDurations(this)) {} +}; + +class AppearanceTransparency : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(bool, enabled, false) + CONFIG_PROPERTY(qreal, base, 0.85) + CONFIG_PROPERTY(qreal, layers, 0.4) + +public: + explicit AppearanceTransparency(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class AppearanceConfig : public ConfigObject { + Q_OBJECT + CONFIG_SUBOBJECT(AppearanceRounding, rounding) + CONFIG_SUBOBJECT(AppearanceSpacing, spacing) + CONFIG_SUBOBJECT(AppearancePadding, padding) + CONFIG_SUBOBJECT(AppearanceFont, font) + CONFIG_SUBOBJECT(AppearanceAnim, anim) + CONFIG_SUBOBJECT(AppearanceTransparency, transparency) + +public: + explicit AppearanceConfig(QObject* parent = nullptr) + : ConfigObject(parent) + , m_rounding(new AppearanceRounding(this)) + , m_spacing(new AppearanceSpacing(this)) + , m_padding(new AppearancePadding(this)) + , m_font(new AppearanceFont(this)) + , m_anim(new AppearanceAnim(this)) + , m_transparency(new AppearanceTransparency(this)) {} +}; + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/backgroundconfig.hpp b/plugin/src/Caelestia/Config/backgroundconfig.hpp new file mode 100644 index 00000000..32440cc3 --- /dev/null +++ b/plugin/src/Caelestia/Config/backgroundconfig.hpp @@ -0,0 +1,74 @@ +#pragma once + +#include "configobject.hpp" + +#include + +namespace caelestia::config { + +class DesktopClockBackground : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(bool, enabled, false) + CONFIG_PROPERTY(qreal, opacity, 0.7) + CONFIG_PROPERTY(bool, blur, true) + +public: + explicit DesktopClockBackground(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class DesktopClockShadow : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(bool, enabled, true) + CONFIG_PROPERTY(qreal, opacity, 0.7) + CONFIG_PROPERTY(qreal, blur, 0.4) + +public: + explicit DesktopClockShadow(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class DesktopClock : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(bool, enabled, false) + CONFIG_PROPERTY(qreal, scale, 1.0) + CONFIG_PROPERTY(QString, position, QStringLiteral("bottom-right")) + CONFIG_PROPERTY(bool, invertColors, false) + CONFIG_SUBOBJECT(DesktopClockBackground, background) + CONFIG_SUBOBJECT(DesktopClockShadow, shadow) + +public: + explicit DesktopClock(QObject* parent = nullptr) + : ConfigObject(parent) + , m_background(new DesktopClockBackground(this)) + , m_shadow(new DesktopClockShadow(this)) {} +}; + +class BackgroundVisualiser : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(bool, enabled, false) + CONFIG_PROPERTY(bool, autoHide, true) + CONFIG_PROPERTY(bool, blur, false) + CONFIG_PROPERTY(qreal, rounding, 1) + CONFIG_PROPERTY(qreal, spacing, 1) + +public: + explicit BackgroundVisualiser(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class BackgroundConfig : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(bool, enabled, true) + CONFIG_PROPERTY(bool, wallpaperEnabled, true) + CONFIG_SUBOBJECT(DesktopClock, desktopClock) + CONFIG_SUBOBJECT(BackgroundVisualiser, visualiser) + +public: + explicit BackgroundConfig(QObject* parent = nullptr) + : ConfigObject(parent) + , m_desktopClock(new DesktopClock(this)) + , m_visualiser(new BackgroundVisualiser(this)) {} +}; + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/barconfig.hpp b/plugin/src/Caelestia/Config/barconfig.hpp new file mode 100644 index 00000000..712c047f --- /dev/null +++ b/plugin/src/Caelestia/Config/barconfig.hpp @@ -0,0 +1,133 @@ +#pragma once + +#include "configobject.hpp" + +#include +#include +#include + +namespace caelestia::config { + +class BarScrollActions : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(bool, workspaces, true) + CONFIG_PROPERTY(bool, volume, true) + CONFIG_PROPERTY(bool, brightness, true) + +public: + explicit BarScrollActions(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class BarPopouts : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(bool, activeWindow, true) + CONFIG_PROPERTY(bool, tray, true) + CONFIG_PROPERTY(bool, statusIcons, true) + +public: + explicit BarPopouts(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class BarWorkspaces : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(int, shown, 5) + CONFIG_PROPERTY(bool, activeIndicator, true) + CONFIG_PROPERTY(bool, occupiedBg, false) + CONFIG_PROPERTY(bool, showWindows, true) + CONFIG_PROPERTY(bool, showWindowsOnSpecialWorkspaces, true) + CONFIG_PROPERTY(int, maxWindowIcons, 0) + CONFIG_PROPERTY(bool, activeTrail, false) + CONFIG_PROPERTY(bool, perMonitorWorkspaces, true) + CONFIG_PROPERTY(QString, label, QStringLiteral(" ")) + CONFIG_PROPERTY(QString, occupiedLabel, QStringLiteral("\U000f06af")) + CONFIG_PROPERTY(QString, activeLabel, QStringLiteral("\U000f06af")) + CONFIG_PROPERTY(QString, capitalisation, QStringLiteral("preserve")) + CONFIG_PROPERTY(QVariantList, specialWorkspaceIcons) + CONFIG_PROPERTY(QVariantList, windowIcons) + +public: + explicit BarWorkspaces(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class BarActiveWindow : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(bool, compact, false) + CONFIG_PROPERTY(bool, inverted, false) + CONFIG_PROPERTY(bool, showOnHover, true) + +public: + explicit BarActiveWindow(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class BarTray : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(bool, background, false) + CONFIG_PROPERTY(bool, recolour, false) + CONFIG_PROPERTY(bool, compact, false) + CONFIG_PROPERTY(QVariantList, iconSubs) + CONFIG_PROPERTY(QStringList, hiddenIcons) + +public: + explicit BarTray(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class BarStatus : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(bool, showAudio, false) + CONFIG_PROPERTY(bool, showMicrophone, false) + CONFIG_PROPERTY(bool, showKbLayout, false) + CONFIG_PROPERTY(bool, showNetwork, true) + CONFIG_PROPERTY(bool, showWifi, true) + CONFIG_PROPERTY(bool, showBluetooth, true) + CONFIG_PROPERTY(bool, showBattery, true) + CONFIG_PROPERTY(bool, showLockStatus, true) + +public: + explicit BarStatus(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class BarClock : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(bool, background, false) + CONFIG_PROPERTY(bool, showDate, false) + CONFIG_PROPERTY(bool, showIcon, true) + +public: + explicit BarClock(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class BarConfig : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(bool, persistent, true) + CONFIG_PROPERTY(bool, showOnHover, true) + CONFIG_PROPERTY(int, dragThreshold, 20) + CONFIG_SUBOBJECT(BarScrollActions, scrollActions) + CONFIG_SUBOBJECT(BarPopouts, popouts) + CONFIG_SUBOBJECT(BarWorkspaces, workspaces) + CONFIG_SUBOBJECT(BarActiveWindow, activeWindow) + CONFIG_SUBOBJECT(BarTray, tray) + CONFIG_SUBOBJECT(BarStatus, status) + CONFIG_SUBOBJECT(BarClock, clock) + CONFIG_PROPERTY(QVariantList, entries) + CONFIG_PROPERTY(QStringList, excludedScreens) + +public: + explicit BarConfig(QObject* parent = nullptr) + : ConfigObject(parent) + , m_scrollActions(new BarScrollActions(this)) + , m_popouts(new BarPopouts(this)) + , m_workspaces(new BarWorkspaces(this)) + , m_activeWindow(new BarActiveWindow(this)) + , m_tray(new BarTray(this)) + , m_status(new BarStatus(this)) + , m_clock(new BarClock(this)) {} +}; + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/borderconfig.hpp b/plugin/src/Caelestia/Config/borderconfig.hpp new file mode 100644 index 00000000..9bc2966c --- /dev/null +++ b/plugin/src/Caelestia/Config/borderconfig.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include "configobject.hpp" + +#include + +namespace caelestia::config { + +class BorderConfig : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(int, thickness, 10) + CONFIG_PROPERTY(int, rounding, 25) + + Q_PROPERTY(int minThickness READ minThickness CONSTANT) + Q_PROPERTY(int clampedThickness READ clampedThickness NOTIFY thicknessChanged) + +public: + explicit BorderConfig(QObject* parent = nullptr) + : ConfigObject(parent) {} + + [[nodiscard]] static int minThickness() { return 2; } + + [[nodiscard]] int clampedThickness() const { return std::max(minThickness(), m_thickness); } +}; + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/config.cpp b/plugin/src/Caelestia/Config/config.cpp new file mode 100644 index 00000000..01df3704 --- /dev/null +++ b/plugin/src/Caelestia/Config/config.cpp @@ -0,0 +1,138 @@ +#include "config.hpp" + +#include +#include +#include +#include +#include +#include +#include + +namespace caelestia::config { + +static GlobalConfig* s_instance = nullptr; + +GlobalConfig::GlobalConfig(QObject* parent) + : ConfigObject(parent) + , m_appearance(new AppearanceConfig(this)) + , m_general(new GeneralConfig(this)) + , m_background(new BackgroundConfig(this)) + , m_bar(new BarConfig(this)) + , m_border(new BorderConfig(this)) + , m_dashboard(new DashboardConfig(this)) + , m_controlCenter(new ControlCenterConfig(this)) + , m_launcher(new LauncherConfig(this)) + , m_notifs(new NotifsConfig(this)) + , m_osd(new OsdConfig(this)) + , m_session(new SessionConfig(this)) + , m_winfo(new WInfoConfig(this)) + , m_lock(new LockConfig(this)) + , m_utilities(new UtilitiesConfig(this)) + , m_sidebar(new SidebarConfig(this)) + , m_services(new ServiceConfig(this)) + , m_paths(new UserPaths(this)) + , m_advanced(new AdvancedConfig(this)) { + s_instance = this; + + m_configPath = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + + QStringLiteral("/caelestia/shell.json"); + + m_saveTimer.setSingleShot(true); + m_saveTimer.setInterval(500); + connect(&m_saveTimer, &QTimer::timeout, this, &GlobalConfig::writeToFile); + + m_cooldownTimer.setSingleShot(true); + m_cooldownTimer.setInterval(2000); + connect(&m_cooldownTimer, &QTimer::timeout, this, [this] { + m_recentlySaved = false; + emit recentlySavedChanged(); + }); + + connect(&m_watcher, &QFileSystemWatcher::fileChanged, this, &GlobalConfig::onFileChanged); + + reload(); + + if (QFile::exists(m_configPath)) { + m_watcher.addPath(m_configPath); + } +} + +GlobalConfig* GlobalConfig::instance() { + return s_instance; +} + +bool GlobalConfig::recentlySaved() const { + return m_recentlySaved; +} + +void GlobalConfig::save() { + m_saveTimer.start(); + m_recentlySaved = true; + emit recentlySavedChanged(); + m_cooldownTimer.start(); +} + +void GlobalConfig::reload() { + QFile file(m_configPath); + + if (!file.open(QIODevice::ReadOnly)) { + qWarning() << "Config: failed to open" << m_configPath; + return; + } + + load(file.readAll()); +} + +void GlobalConfig::load(const QByteArray& contents) { + QJsonParseError error{}; + auto doc = QJsonDocument::fromJson(contents, &error); + + if (error.error != QJsonParseError::NoError) { + qWarning() << "Config: failed to parse JSON:" << error.errorString(); + return; + } + + loadFromJson(doc.object()); +} + +void GlobalConfig::onFileChanged() { + if (!m_watcher.files().contains(m_configPath)) { + m_watcher.addPath(m_configPath); + } + + if (!m_recentlySaved) { + reload(); + } +} + +void GlobalConfig::writeToFile() { + QDir().mkpath(QFileInfo(m_configPath).absolutePath()); + + QFile file(m_configPath); + + if (!file.open(QIODevice::WriteOnly)) { + qWarning() << "Config: failed to write" << m_configPath; + return; + } + + file.write(QJsonDocument(toJsonObject()).toJson(QJsonDocument::Indented)); +} + +// Config + +Config::Config(QQuickItem* parent) + : QQuickItem(parent) {} + +Config* Config::qmlAttachedProperties(QObject* object) { + auto* item = qobject_cast(object); + + while (item) { + if (auto* config = qobject_cast(item)) + return config; + item = item->parentItem(); + } + + return nullptr; +} + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/config.hpp b/plugin/src/Caelestia/Config/config.hpp new file mode 100644 index 00000000..e989d4c3 --- /dev/null +++ b/plugin/src/Caelestia/Config/config.hpp @@ -0,0 +1,94 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include "advancedconfig.hpp" +#include "appearanceconfig.hpp" +#include "backgroundconfig.hpp" +#include "barconfig.hpp" +#include "borderconfig.hpp" +#include "controlcenterconfig.hpp" +#include "dashboardconfig.hpp" +#include "generalconfig.hpp" +#include "launcherconfig.hpp" +#include "lockconfig.hpp" +#include "notifsconfig.hpp" +#include "osdconfig.hpp" +#include "serviceconfig.hpp" +#include "sessionconfig.hpp" +#include "sidebarconfig.hpp" +#include "userpaths.hpp" +#include "utilitiesconfig.hpp" +#include "winfoconfig.hpp" + +namespace caelestia::config { + +class GlobalConfig : public ConfigObject { + Q_OBJECT + QML_ELEMENT + QML_SINGLETON + + CONFIG_SUBOBJECT(AppearanceConfig, appearance) + CONFIG_SUBOBJECT(GeneralConfig, general) + CONFIG_SUBOBJECT(BackgroundConfig, background) + CONFIG_SUBOBJECT(BarConfig, bar) + CONFIG_SUBOBJECT(BorderConfig, border) + CONFIG_SUBOBJECT(DashboardConfig, dashboard) + CONFIG_SUBOBJECT(ControlCenterConfig, controlCenter) + CONFIG_SUBOBJECT(LauncherConfig, launcher) + CONFIG_SUBOBJECT(NotifsConfig, notifs) + CONFIG_SUBOBJECT(OsdConfig, osd) + CONFIG_SUBOBJECT(SessionConfig, session) + CONFIG_SUBOBJECT(WInfoConfig, winfo) + CONFIG_SUBOBJECT(LockConfig, lock) + CONFIG_SUBOBJECT(UtilitiesConfig, utilities) + CONFIG_SUBOBJECT(SidebarConfig, sidebar) + CONFIG_SUBOBJECT(ServiceConfig, services) + CONFIG_SUBOBJECT(UserPaths, paths) + CONFIG_SUBOBJECT(AdvancedConfig, advanced) + + Q_PROPERTY(bool recentlySaved READ recentlySaved NOTIFY recentlySavedChanged) + +public: + explicit GlobalConfig(QObject* parent = nullptr); + + static GlobalConfig* instance(); + + [[nodiscard]] bool recentlySaved() const; + + Q_INVOKABLE void save(); + Q_INVOKABLE void reload(); + +signals: + void recentlySavedChanged(); + +private: + void load(const QByteArray& contents); + void onFileChanged(); + void writeToFile(); + + bool m_recentlySaved = false; + QString m_configPath; + QFileSystemWatcher m_watcher; + QTimer m_saveTimer; + QTimer m_cooldownTimer; +}; + +class Config : public QQuickItem { + Q_OBJECT + QML_ELEMENT + QML_ATTACHED(Config) + +public: + explicit Config(QQuickItem* parent = nullptr); + + static Config* qmlAttachedProperties(QObject* object); +}; + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/configobject.cpp b/plugin/src/Caelestia/Config/configobject.cpp new file mode 100644 index 00000000..7533b0f5 --- /dev/null +++ b/plugin/src/Caelestia/Config/configobject.cpp @@ -0,0 +1,107 @@ +#include "configobject.hpp" + +#include +#include +#include +#include +#include +#include + +namespace caelestia::config { + +Q_LOGGING_CATEGORY(lcConfig, "caelestia.config", QtInfoMsg) + +ConfigObject::ConfigObject(QObject* parent) + : QObject(parent) {} + +void ConfigObject::loadFromJson(const QJsonObject& obj) { + const auto* meta = metaObject(); + + for (int i = meta->propertyOffset(); i < meta->propertyCount(); ++i) { + auto prop = meta->property(i); + const auto key = QString::fromUtf8(prop.name()); + + if (!obj.contains(key)) + continue; + + const auto jsonVal = obj.value(key); + + // Recurse into sub-objects + auto current = prop.read(this); + auto* subObj = current.value(); + + if (subObj) { + subObj->loadFromJson(jsonVal.toObject()); + continue; + } + + // Skip read-only properties + if (!prop.isWritable()) + continue; + + // Handle QStringList explicitly (QJsonArray → QStringList needs manual conversion) + if (prop.metaType().id() == QMetaType::QStringList) { + QStringList list; + const auto jsonArr = jsonVal.toArray(); + for (const auto& v : jsonArr) + list.append(v.toString()); + prop.write(this, QVariant::fromValue(list)); + continue; + } + + // For all other types, let Qt's variant conversion handle it + prop.write(this, jsonVal.toVariant()); + } +} + +QJsonObject ConfigObject::toJsonObject() const { + QJsonObject obj; + const auto* meta = metaObject(); + + for (int i = meta->propertyOffset(); i < meta->propertyCount(); ++i) { + const auto prop = meta->property(i); + + if (!prop.isReadable()) + continue; + + const auto key = QString::fromUtf8(prop.name()); + const auto value = prop.read(this); + + // Recurse into sub-objects + if (value.canView()) { + auto* const subObj = value.value(); + if (subObj) + obj.insert(key, subObj->toJsonObject()); + else + qCWarning(lcConfig, "Unable to get sub-object when serializing config object"); + continue; + } + + // Skip read-only properties (computed values) + if (!prop.isWritable()) + continue; + + // Handle QStringList explicitly + if (prop.metaType().id() == QMetaType::QStringList) { + QJsonArray arr; + const auto strList = value.toStringList(); + for (const auto& s : strList) + arr.append(s); + obj.insert(key, arr); + continue; + } + + // Handle QVariantList explicitly + if (prop.metaType().id() == QMetaType::QVariantList) { + obj.insert(key, QJsonArray::fromVariantList(value.toList())); + continue; + } + + // Default case + obj.insert(key, QJsonValue::fromVariant(value)); + } + + return obj; +} + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/configobject.hpp b/plugin/src/Caelestia/Config/configobject.hpp new file mode 100644 index 00000000..2f8f443e --- /dev/null +++ b/plugin/src/Caelestia/Config/configobject.hpp @@ -0,0 +1,63 @@ +#pragma once + +#include +#include +#include + +#include + +// Declares a serialized config property with getter, setter (change-detected), signal, and member. +#define CONFIG_PROPERTY(Type, name, ...) \ + Q_PROPERTY(Type name READ name WRITE set_##name NOTIFY name##Changed) \ + \ +public: \ + [[nodiscard]] Type name() const { \ + return m_##name; \ + } \ + void set_##name(const Type& val) { \ + if (caelestia::config::ConfigObject::updateMember(m_##name, val)) \ + emit name##Changed(); \ + } \ + Q_SIGNAL void name##Changed(); \ + \ +private: \ + Type m_##name __VA_OPT__(= __VA_ARGS__); + +// Declares a CONSTANT sub-object property. Initialize the member in the constructor. +#define CONFIG_SUBOBJECT(Type, name) \ + Q_PROPERTY(caelestia::config::Type* name READ name CONSTANT) \ + \ +public: \ + [[nodiscard]] Type* name() const { \ + return m_##name; \ + } \ + \ +private: \ + Type* m_##name = nullptr; + +namespace caelestia::config { + +class ConfigObject : public QObject { + Q_OBJECT + QML_ANONYMOUS + +public: + explicit ConfigObject(QObject* parent = nullptr); + + void loadFromJson(const QJsonObject& obj); + [[nodiscard]] QJsonObject toJsonObject() const; + + template static bool updateMember(T& member, const T& value) { + if constexpr (std::is_floating_point_v) { + if (qFuzzyCompare(member + 1.0, value + 1.0)) + return false; + } else { + if (member == value) + return false; + } + member = value; + return true; + } +}; + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/controlcenterconfig.hpp b/plugin/src/Caelestia/Config/controlcenterconfig.hpp new file mode 100644 index 00000000..d827f7cc --- /dev/null +++ b/plugin/src/Caelestia/Config/controlcenterconfig.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include "configobject.hpp" + +namespace caelestia::config { + +// ControlCenterConfig has no serialized properties (serializer returns {}) +// All properties are in AdvancedConfig.controlCenter +class ControlCenterConfig : public ConfigObject { + Q_OBJECT + +public: + explicit ControlCenterConfig(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/dashboardconfig.hpp b/plugin/src/Caelestia/Config/dashboardconfig.hpp new file mode 100644 index 00000000..f6b97ac6 --- /dev/null +++ b/plugin/src/Caelestia/Config/dashboardconfig.hpp @@ -0,0 +1,36 @@ +#pragma once + +#include "configobject.hpp" + +namespace caelestia::config { + +class DashboardPerformance : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(bool, showBattery, true) + CONFIG_PROPERTY(bool, showGpu, true) + CONFIG_PROPERTY(bool, showCpu, true) + CONFIG_PROPERTY(bool, showMemory, true) + CONFIG_PROPERTY(bool, showStorage, true) + CONFIG_PROPERTY(bool, showNetwork, true) + +public: + explicit DashboardPerformance(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class DashboardConfig : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(bool, enabled, true) + CONFIG_PROPERTY(bool, showOnHover, true) + CONFIG_PROPERTY(int, mediaUpdateInterval, 500) + CONFIG_PROPERTY(int, resourceUpdateInterval, 1000) + CONFIG_PROPERTY(int, dragThreshold, 50) + CONFIG_SUBOBJECT(DashboardPerformance, performance) + +public: + explicit DashboardConfig(QObject* parent = nullptr) + : ConfigObject(parent) + , m_performance(new DashboardPerformance(this)) {} +}; + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/generalconfig.hpp b/plugin/src/Caelestia/Config/generalconfig.hpp new file mode 100644 index 00000000..8ccc9089 --- /dev/null +++ b/plugin/src/Caelestia/Config/generalconfig.hpp @@ -0,0 +1,60 @@ +#pragma once + +#include "configobject.hpp" + +#include +#include +#include + +namespace caelestia::config { + +class GeneralApps : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(QStringList, terminal, { QStringLiteral("foot") }) + CONFIG_PROPERTY(QStringList, audio, { QStringLiteral("pavucontrol") }) + CONFIG_PROPERTY(QStringList, playback, { QStringLiteral("mpv") }) + CONFIG_PROPERTY(QStringList, explorer, { QStringLiteral("thunar") }) + +public: + explicit GeneralApps(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class GeneralIdle : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(bool, lockBeforeSleep, true) + CONFIG_PROPERTY(bool, inhibitWhenAudio, true) + CONFIG_PROPERTY(QVariantList, timeouts) + +public: + explicit GeneralIdle(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class GeneralBattery : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(QVariantList, warnLevels) + CONFIG_PROPERTY(int, criticalLevel, 3) + +public: + explicit GeneralBattery(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class GeneralConfig : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(QString, logo) + CONFIG_PROPERTY(QStringList, excludedScreens) + CONFIG_SUBOBJECT(GeneralApps, apps) + CONFIG_SUBOBJECT(GeneralIdle, idle) + CONFIG_SUBOBJECT(GeneralBattery, battery) + +public: + explicit GeneralConfig(QObject* parent = nullptr) + : ConfigObject(parent) + , m_apps(new GeneralApps(this)) + , m_idle(new GeneralIdle(this)) + , m_battery(new GeneralBattery(this)) {} +}; + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/launcherconfig.hpp b/plugin/src/Caelestia/Config/launcherconfig.hpp new file mode 100644 index 00000000..d430ae60 --- /dev/null +++ b/plugin/src/Caelestia/Config/launcherconfig.hpp @@ -0,0 +1,46 @@ +#pragma once + +#include "configobject.hpp" + +#include +#include +#include + +namespace caelestia::config { + +class LauncherUseFuzzy : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(bool, apps, false) + CONFIG_PROPERTY(bool, actions, false) + CONFIG_PROPERTY(bool, schemes, false) + CONFIG_PROPERTY(bool, variants, false) + CONFIG_PROPERTY(bool, wallpapers, false) + +public: + explicit LauncherUseFuzzy(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class LauncherConfig : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(bool, enabled, true) + CONFIG_PROPERTY(bool, showOnHover, false) + CONFIG_PROPERTY(int, maxShown, 7) + CONFIG_PROPERTY(int, maxWallpapers, 9) + CONFIG_PROPERTY(QString, specialPrefix, QStringLiteral("@")) + CONFIG_PROPERTY(QString, actionPrefix, QStringLiteral(">")) + CONFIG_PROPERTY(bool, enableDangerousActions, false) + CONFIG_PROPERTY(int, dragThreshold, 50) + CONFIG_PROPERTY(bool, vimKeybinds, false) + CONFIG_PROPERTY(QStringList, favouriteApps) + CONFIG_PROPERTY(QStringList, hiddenApps) + CONFIG_SUBOBJECT(LauncherUseFuzzy, useFuzzy) + CONFIG_PROPERTY(QVariantList, actions) + +public: + explicit LauncherConfig(QObject* parent = nullptr) + : ConfigObject(parent) + , m_useFuzzy(new LauncherUseFuzzy(this)) {} +}; + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/lockconfig.hpp b/plugin/src/Caelestia/Config/lockconfig.hpp new file mode 100644 index 00000000..a15c722a --- /dev/null +++ b/plugin/src/Caelestia/Config/lockconfig.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include "configobject.hpp" + +namespace caelestia::config { + +class LockConfig : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(bool, recolourLogo, false) + CONFIG_PROPERTY(bool, enableFprint, true) + CONFIG_PROPERTY(int, maxFprintTries, 3) + CONFIG_PROPERTY(bool, hideNotifs, false) + +public: + explicit LockConfig(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/notifsconfig.hpp b/plugin/src/Caelestia/Config/notifsconfig.hpp new file mode 100644 index 00000000..61c9bb9e --- /dev/null +++ b/plugin/src/Caelestia/Config/notifsconfig.hpp @@ -0,0 +1,25 @@ +#pragma once + +#include "configobject.hpp" + +#include + +namespace caelestia::config { + +class NotifsConfig : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(bool, expire, true) + CONFIG_PROPERTY(QString, fullscreen, QStringLiteral("on")) + CONFIG_PROPERTY(int, defaultExpireTimeout, 5000) + CONFIG_PROPERTY(qreal, clearThreshold, 0.3) + CONFIG_PROPERTY(int, expandThreshold, 20) + CONFIG_PROPERTY(bool, actionOnClick, false) + CONFIG_PROPERTY(int, groupPreviewNum, 3) + CONFIG_PROPERTY(bool, openExpanded, false) + +public: + explicit NotifsConfig(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/osdconfig.hpp b/plugin/src/Caelestia/Config/osdconfig.hpp new file mode 100644 index 00000000..71cc27b4 --- /dev/null +++ b/plugin/src/Caelestia/Config/osdconfig.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include "configobject.hpp" + +namespace caelestia::config { + +class OsdConfig : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(bool, enabled, true) + CONFIG_PROPERTY(int, hideDelay, 2000) + CONFIG_PROPERTY(bool, enableBrightness, true) + CONFIG_PROPERTY(bool, enableMicrophone, false) + +public: + explicit OsdConfig(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/serviceconfig.hpp b/plugin/src/Caelestia/Config/serviceconfig.hpp new file mode 100644 index 00000000..131314c1 --- /dev/null +++ b/plugin/src/Caelestia/Config/serviceconfig.hpp @@ -0,0 +1,32 @@ +#pragma once + +#include "configobject.hpp" + +#include +#include + +namespace caelestia::config { + +class ServiceConfig : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(QString, weatherLocation) + CONFIG_PROPERTY(bool, useFahrenheit, false) + CONFIG_PROPERTY(bool, useFahrenheitPerformance, false) + CONFIG_PROPERTY(bool, useTwelveHourClock, false) + CONFIG_PROPERTY(QString, gpuType) + CONFIG_PROPERTY(int, visualiserBars, 45) + CONFIG_PROPERTY(qreal, audioIncrement, 0.1) + CONFIG_PROPERTY(qreal, brightnessIncrement, 0.1) + CONFIG_PROPERTY(qreal, maxVolume, 1.0) + CONFIG_PROPERTY(bool, smartScheme, true) + CONFIG_PROPERTY(QString, defaultPlayer, QStringLiteral("Spotify")) + CONFIG_PROPERTY(QVariantList, playerAliases) + CONFIG_PROPERTY(bool, showLyrics, false) + CONFIG_PROPERTY(QString, lyricsBackend, QStringLiteral("Auto")) + +public: + explicit ServiceConfig(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/sessionconfig.hpp b/plugin/src/Caelestia/Config/sessionconfig.hpp new file mode 100644 index 00000000..af609512 --- /dev/null +++ b/plugin/src/Caelestia/Config/sessionconfig.hpp @@ -0,0 +1,49 @@ +#pragma once + +#include "configobject.hpp" + +#include +#include + +namespace caelestia::config { + +class SessionIcons : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(QString, logout, QStringLiteral("logout")) + CONFIG_PROPERTY(QString, shutdown, QStringLiteral("power_settings_new")) + CONFIG_PROPERTY(QString, hibernate, QStringLiteral("downloading")) + CONFIG_PROPERTY(QString, reboot, QStringLiteral("cached")) + +public: + explicit SessionIcons(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class SessionCommands : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(QStringList, logout, { QStringLiteral("loginctl"), QStringLiteral("terminate-user"), QString() }) + CONFIG_PROPERTY(QStringList, shutdown, { QStringLiteral("systemctl"), QStringLiteral("poweroff") }) + CONFIG_PROPERTY(QStringList, hibernate, { QStringLiteral("systemctl"), QStringLiteral("hibernate") }) + CONFIG_PROPERTY(QStringList, reboot, { QStringLiteral("systemctl"), QStringLiteral("reboot") }) + +public: + explicit SessionCommands(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class SessionConfig : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(bool, enabled, true) + CONFIG_PROPERTY(int, dragThreshold, 30) + CONFIG_PROPERTY(bool, vimKeybinds, false) + CONFIG_SUBOBJECT(SessionIcons, icons) + CONFIG_SUBOBJECT(SessionCommands, commands) + +public: + explicit SessionConfig(QObject* parent = nullptr) + : ConfigObject(parent) + , m_icons(new SessionIcons(this)) + , m_commands(new SessionCommands(this)) {} +}; + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/sidebarconfig.hpp b/plugin/src/Caelestia/Config/sidebarconfig.hpp new file mode 100644 index 00000000..71041cfb --- /dev/null +++ b/plugin/src/Caelestia/Config/sidebarconfig.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include "configobject.hpp" + +namespace caelestia::config { + +class SidebarConfig : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(bool, enabled, true) + CONFIG_PROPERTY(int, dragThreshold, 80) + +public: + explicit SidebarConfig(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/userpaths.hpp b/plugin/src/Caelestia/Config/userpaths.hpp new file mode 100644 index 00000000..ec0b4880 --- /dev/null +++ b/plugin/src/Caelestia/Config/userpaths.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include "configobject.hpp" + +#include +#include +#include + +namespace caelestia::config { + +class UserPaths : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(QString, wallpaperDir, + QStandardPaths::writableLocation(QStandardPaths::PicturesLocation) + QStringLiteral("/Wallpapers")) + CONFIG_PROPERTY(QString, lyricsDir, QDir::homePath() + QStringLiteral("/Music/lyrics/")) + CONFIG_PROPERTY(QString, sessionGif, QStringLiteral("root:/assets/kurukuru.gif")) + CONFIG_PROPERTY(QString, mediaGif, QStringLiteral("root:/assets/bongocat.gif")) + CONFIG_PROPERTY(QString, noNotifsPic, QStringLiteral("root:/assets/dino.png")) + CONFIG_PROPERTY(QString, lockNoNotifsPic, QStringLiteral("root:/assets/dino.png")) + +public: + explicit UserPaths(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/utilitiesconfig.hpp b/plugin/src/Caelestia/Config/utilitiesconfig.hpp new file mode 100644 index 00000000..98da47ed --- /dev/null +++ b/plugin/src/Caelestia/Config/utilitiesconfig.hpp @@ -0,0 +1,56 @@ +#pragma once + +#include "configobject.hpp" + +#include +#include + +namespace caelestia::config { + +class UtilitiesToasts : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(bool, configLoaded, true) + CONFIG_PROPERTY(QString, fullscreen, QStringLiteral("off")) + CONFIG_PROPERTY(bool, chargingChanged, true) + CONFIG_PROPERTY(bool, gameModeChanged, true) + CONFIG_PROPERTY(bool, dndChanged, true) + CONFIG_PROPERTY(bool, audioOutputChanged, true) + CONFIG_PROPERTY(bool, audioInputChanged, true) + CONFIG_PROPERTY(bool, capsLockChanged, true) + CONFIG_PROPERTY(bool, numLockChanged, true) + CONFIG_PROPERTY(bool, kbLayoutChanged, true) + CONFIG_PROPERTY(bool, kbLimit, true) + CONFIG_PROPERTY(bool, vpnChanged, true) + CONFIG_PROPERTY(bool, nowPlaying, false) + +public: + explicit UtilitiesToasts(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class UtilitiesVpn : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(bool, enabled, false) + CONFIG_PROPERTY(QVariantList, provider) + +public: + explicit UtilitiesVpn(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class UtilitiesConfig : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(bool, enabled, true) + CONFIG_PROPERTY(int, maxToasts, 4) + CONFIG_SUBOBJECT(UtilitiesToasts, toasts) + CONFIG_SUBOBJECT(UtilitiesVpn, vpn) + CONFIG_PROPERTY(QVariantList, quickToggles) + +public: + explicit UtilitiesConfig(QObject* parent = nullptr) + : ConfigObject(parent) + , m_toasts(new UtilitiesToasts(this)) + , m_vpn(new UtilitiesVpn(this)) {} +}; + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/winfoconfig.hpp b/plugin/src/Caelestia/Config/winfoconfig.hpp new file mode 100644 index 00000000..91f2f234 --- /dev/null +++ b/plugin/src/Caelestia/Config/winfoconfig.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include "configobject.hpp" + +namespace caelestia::config { + +// WInfoConfig has no serialized properties (serializer returns {}) +// All properties are in AdvancedConfig.winfo +class WInfoConfig : public ConfigObject { + Q_OBJECT + +public: + explicit WInfoConfig(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +} // namespace caelestia::config From 8d73d6037deb78a4abc74a15adf705a93c324cd4 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 02:38:03 +1000 Subject: [PATCH 02/81] fix: move scale back to normal config --- plugin/src/Caelestia/Config/CMakeLists.txt | 7 +- .../src/Caelestia/Config/advancedconfig.hpp | 79 ++++++++- .../src/Caelestia/Config/appearanceconfig.cpp | 167 ++++++++++++++++++ .../src/Caelestia/Config/appearanceconfig.hpp | 142 ++++++++------- plugin/src/Caelestia/Config/config.cpp | 95 ++-------- plugin/src/Caelestia/Config/config.hpp | 25 +-- plugin/src/Caelestia/Config/configobject.cpp | 74 ++++++++ plugin/src/Caelestia/Config/configobject.hpp | 24 ++- 8 files changed, 445 insertions(+), 168 deletions(-) create mode 100644 plugin/src/Caelestia/Config/appearanceconfig.cpp diff --git a/plugin/src/Caelestia/Config/CMakeLists.txt b/plugin/src/Caelestia/Config/CMakeLists.txt index 9351ec41..93f94b06 100644 --- a/plugin/src/Caelestia/Config/CMakeLists.txt +++ b/plugin/src/Caelestia/Config/CMakeLists.txt @@ -1,10 +1,10 @@ qml_module(caelestia-config URI Caelestia.Config SOURCES - config.hpp config.cpp - configobject.hpp + config.cpp + configobject.cpp + appearanceconfig.cpp advancedconfig.hpp - appearanceconfig.hpp backgroundconfig.hpp barconfig.hpp borderconfig.hpp @@ -21,7 +21,6 @@ qml_module(caelestia-config userpaths.hpp utilitiesconfig.hpp winfoconfig.hpp - configobject.cpp LIBRARIES Qt::Quick ) diff --git a/plugin/src/Caelestia/Config/advancedconfig.hpp b/plugin/src/Caelestia/Config/advancedconfig.hpp index 57352a32..181ba0bc 100644 --- a/plugin/src/Caelestia/Config/advancedconfig.hpp +++ b/plugin/src/Caelestia/Config/advancedconfig.hpp @@ -32,14 +32,91 @@ public: , m_expressiveSlowSpatial({ 0.39, 1.29, 0.35, 0.98, 1, 1 }) {} }; +class RoundingTokens : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(int, small, 12) + CONFIG_PROPERTY(int, normal, 17) + CONFIG_PROPERTY(int, large, 25) + CONFIG_PROPERTY(int, full, 1000) + +public: + explicit RoundingTokens(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class SpacingTokens : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(int, small, 7) + CONFIG_PROPERTY(int, smaller, 10) + CONFIG_PROPERTY(int, normal, 12) + CONFIG_PROPERTY(int, larger, 15) + CONFIG_PROPERTY(int, large, 20) + +public: + explicit SpacingTokens(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class PaddingTokens : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(int, small, 5) + CONFIG_PROPERTY(int, smaller, 7) + CONFIG_PROPERTY(int, normal, 10) + CONFIG_PROPERTY(int, larger, 12) + CONFIG_PROPERTY(int, large, 15) + +public: + explicit PaddingTokens(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class FontSizeTokens : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(int, small, 11) + CONFIG_PROPERTY(int, smaller, 12) + CONFIG_PROPERTY(int, normal, 13) + CONFIG_PROPERTY(int, larger, 15) + CONFIG_PROPERTY(int, large, 18) + CONFIG_PROPERTY(int, extraLarge, 28) + +public: + explicit FontSizeTokens(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + +class AnimDurationTokens : public ConfigObject { + Q_OBJECT + CONFIG_PROPERTY(int, small, 200) + CONFIG_PROPERTY(int, normal, 400) + CONFIG_PROPERTY(int, large, 600) + CONFIG_PROPERTY(int, extraLarge, 1000) + CONFIG_PROPERTY(int, expressiveFastSpatial, 350) + CONFIG_PROPERTY(int, expressiveDefaultSpatial, 500) + CONFIG_PROPERTY(int, expressiveSlowSpatial, 650) + +public: + explicit AnimDurationTokens(QObject* parent = nullptr) + : ConfigObject(parent) {} +}; + class AdvancedAppearance : public ConfigObject { Q_OBJECT CONFIG_SUBOBJECT(AnimCurves, curves) + CONFIG_SUBOBJECT(RoundingTokens, rounding) + CONFIG_SUBOBJECT(SpacingTokens, spacing) + CONFIG_SUBOBJECT(PaddingTokens, padding) + CONFIG_SUBOBJECT(FontSizeTokens, fontSize) + CONFIG_SUBOBJECT(AnimDurationTokens, animDurations) public: explicit AdvancedAppearance(QObject* parent = nullptr) : ConfigObject(parent) - , m_curves(new AnimCurves(this)) {} + , m_curves(new AnimCurves(this)) + , m_rounding(new RoundingTokens(this)) + , m_spacing(new SpacingTokens(this)) + , m_padding(new PaddingTokens(this)) + , m_fontSize(new FontSizeTokens(this)) + , m_animDurations(new AnimDurationTokens(this)) {} }; class BarSizes : public ConfigObject { diff --git a/plugin/src/Caelestia/Config/appearanceconfig.cpp b/plugin/src/Caelestia/Config/appearanceconfig.cpp new file mode 100644 index 00000000..1b45f8f6 --- /dev/null +++ b/plugin/src/Caelestia/Config/appearanceconfig.cpp @@ -0,0 +1,167 @@ +#include "appearanceconfig.hpp" +#include "advancedconfig.hpp" + +#include + +namespace caelestia::config { + +// Helper: connect all changed signals from a token object to a single valuesChanged signal, +// plus connect the local scaleChanged signal. +template static void connectTokenSignals(Source* source, Target* target) { + const auto* meta = source->metaObject(); + + for (int i = meta->propertyOffset(); i < meta->propertyCount(); ++i) { + auto prop = meta->property(i); + + if (prop.hasNotifySignal()) + QObject::connect(source, prop.notifySignal(), target, + target->metaObject()->method(target->metaObject()->indexOfSignal("valuesChanged()"))); + } + + QObject::connect(target, &Target::scaleChanged, target, &Target::valuesChanged); +} + +// AppearanceRounding + +void AppearanceRounding::bindTokens(RoundingTokens* tokens) { + m_tokens = tokens; + connectTokenSignals(tokens, this); +} + +int AppearanceRounding::small() const { + return m_tokens ? static_cast(m_tokens->small() * m_scale) : 0; +} + +int AppearanceRounding::normal() const { + return m_tokens ? static_cast(m_tokens->normal() * m_scale) : 0; +} + +int AppearanceRounding::large() const { + return m_tokens ? static_cast(m_tokens->large() * m_scale) : 0; +} + +int AppearanceRounding::full() const { + return m_tokens ? static_cast(m_tokens->full() * m_scale) : 0; +} + +// AppearanceSpacing + +void AppearanceSpacing::bindTokens(SpacingTokens* tokens) { + m_tokens = tokens; + connectTokenSignals(tokens, this); +} + +int AppearanceSpacing::small() const { + return m_tokens ? static_cast(m_tokens->small() * m_scale) : 0; +} + +int AppearanceSpacing::smaller() const { + return m_tokens ? static_cast(m_tokens->smaller() * m_scale) : 0; +} + +int AppearanceSpacing::normal() const { + return m_tokens ? static_cast(m_tokens->normal() * m_scale) : 0; +} + +int AppearanceSpacing::larger() const { + return m_tokens ? static_cast(m_tokens->larger() * m_scale) : 0; +} + +int AppearanceSpacing::large() const { + return m_tokens ? static_cast(m_tokens->large() * m_scale) : 0; +} + +// AppearancePadding + +void AppearancePadding::bindTokens(PaddingTokens* tokens) { + m_tokens = tokens; + connectTokenSignals(tokens, this); +} + +int AppearancePadding::small() const { + return m_tokens ? static_cast(m_tokens->small() * m_scale) : 0; +} + +int AppearancePadding::smaller() const { + return m_tokens ? static_cast(m_tokens->smaller() * m_scale) : 0; +} + +int AppearancePadding::normal() const { + return m_tokens ? static_cast(m_tokens->normal() * m_scale) : 0; +} + +int AppearancePadding::larger() const { + return m_tokens ? static_cast(m_tokens->larger() * m_scale) : 0; +} + +int AppearancePadding::large() const { + return m_tokens ? static_cast(m_tokens->large() * m_scale) : 0; +} + +// FontSize + +void FontSize::bindTokens(FontSizeTokens* tokens) { + m_tokens = tokens; + connectTokenSignals(tokens, this); +} + +int FontSize::small() const { + return m_tokens ? static_cast(m_tokens->small() * m_scale) : 0; +} + +int FontSize::smaller() const { + return m_tokens ? static_cast(m_tokens->smaller() * m_scale) : 0; +} + +int FontSize::normal() const { + return m_tokens ? static_cast(m_tokens->normal() * m_scale) : 0; +} + +int FontSize::larger() const { + return m_tokens ? static_cast(m_tokens->larger() * m_scale) : 0; +} + +int FontSize::large() const { + return m_tokens ? static_cast(m_tokens->large() * m_scale) : 0; +} + +int FontSize::extraLarge() const { + return m_tokens ? static_cast(m_tokens->extraLarge() * m_scale) : 0; +} + +// AnimDurations + +void AnimDurations::bindTokens(AnimDurationTokens* tokens) { + m_tokens = tokens; + connectTokenSignals(tokens, this); +} + +int AnimDurations::small() const { + return m_tokens ? static_cast(m_tokens->small() * m_scale) : 0; +} + +int AnimDurations::normal() const { + return m_tokens ? static_cast(m_tokens->normal() * m_scale) : 0; +} + +int AnimDurations::large() const { + return m_tokens ? static_cast(m_tokens->large() * m_scale) : 0; +} + +int AnimDurations::extraLarge() const { + return m_tokens ? static_cast(m_tokens->extraLarge() * m_scale) : 0; +} + +int AnimDurations::expressiveFastSpatial() const { + return m_tokens ? static_cast(m_tokens->expressiveFastSpatial() * m_scale) : 0; +} + +int AnimDurations::expressiveDefaultSpatial() const { + return m_tokens ? static_cast(m_tokens->expressiveDefaultSpatial() * m_scale) : 0; +} + +int AnimDurations::expressiveSlowSpatial() const { + return m_tokens ? static_cast(m_tokens->expressiveSlowSpatial() * m_scale) : 0; +} + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/appearanceconfig.hpp b/plugin/src/Caelestia/Config/appearanceconfig.hpp index 4d4acc08..c0094b26 100644 --- a/plugin/src/Caelestia/Config/appearanceconfig.hpp +++ b/plugin/src/Caelestia/Config/appearanceconfig.hpp @@ -6,76 +6,93 @@ namespace caelestia::config { +// Forward declare token types from advancedconfig.hpp +class RoundingTokens; +class SpacingTokens; +class PaddingTokens; +class FontSizeTokens; +class AnimDurationTokens; + class AppearanceRounding : public ConfigObject { Q_OBJECT CONFIG_PROPERTY(qreal, scale, 1) - Q_PROPERTY(int small READ small NOTIFY scaleChanged) - Q_PROPERTY(int normal READ normal NOTIFY scaleChanged) - Q_PROPERTY(int large READ large NOTIFY scaleChanged) - Q_PROPERTY(int full READ full NOTIFY scaleChanged) + Q_PROPERTY(int small READ small NOTIFY valuesChanged) + Q_PROPERTY(int normal READ normal NOTIFY valuesChanged) + Q_PROPERTY(int large READ large NOTIFY valuesChanged) + Q_PROPERTY(int full READ full NOTIFY valuesChanged) public: explicit AppearanceRounding(QObject* parent = nullptr) : ConfigObject(parent) {} - [[nodiscard]] int small() const { return static_cast(12 * m_scale); } + void bindTokens(RoundingTokens* tokens); - [[nodiscard]] int normal() const { return static_cast(17 * m_scale); } + [[nodiscard]] int small() const; + [[nodiscard]] int normal() const; + [[nodiscard]] int large() const; + [[nodiscard]] int full() const; - [[nodiscard]] int large() const { return static_cast(25 * m_scale); } + Q_SIGNAL void valuesChanged(); - [[nodiscard]] int full() const { return static_cast(1000 * m_scale); } +private: + RoundingTokens* m_tokens = nullptr; }; class AppearanceSpacing : public ConfigObject { Q_OBJECT CONFIG_PROPERTY(qreal, scale, 1) - Q_PROPERTY(int small READ small NOTIFY scaleChanged) - Q_PROPERTY(int smaller READ smaller NOTIFY scaleChanged) - Q_PROPERTY(int normal READ normal NOTIFY scaleChanged) - Q_PROPERTY(int larger READ larger NOTIFY scaleChanged) - Q_PROPERTY(int large READ large NOTIFY scaleChanged) + Q_PROPERTY(int small READ small NOTIFY valuesChanged) + Q_PROPERTY(int smaller READ smaller NOTIFY valuesChanged) + Q_PROPERTY(int normal READ normal NOTIFY valuesChanged) + Q_PROPERTY(int larger READ larger NOTIFY valuesChanged) + Q_PROPERTY(int large READ large NOTIFY valuesChanged) public: explicit AppearanceSpacing(QObject* parent = nullptr) : ConfigObject(parent) {} - [[nodiscard]] int small() const { return static_cast(7 * m_scale); } + void bindTokens(SpacingTokens* tokens); - [[nodiscard]] int smaller() const { return static_cast(10 * m_scale); } + [[nodiscard]] int small() const; + [[nodiscard]] int smaller() const; + [[nodiscard]] int normal() const; + [[nodiscard]] int larger() const; + [[nodiscard]] int large() const; - [[nodiscard]] int normal() const { return static_cast(12 * m_scale); } + Q_SIGNAL void valuesChanged(); - [[nodiscard]] int larger() const { return static_cast(15 * m_scale); } - - [[nodiscard]] int large() const { return static_cast(20 * m_scale); } +private: + SpacingTokens* m_tokens = nullptr; }; class AppearancePadding : public ConfigObject { Q_OBJECT CONFIG_PROPERTY(qreal, scale, 1) - Q_PROPERTY(int small READ small NOTIFY scaleChanged) - Q_PROPERTY(int smaller READ smaller NOTIFY scaleChanged) - Q_PROPERTY(int normal READ normal NOTIFY scaleChanged) - Q_PROPERTY(int larger READ larger NOTIFY scaleChanged) - Q_PROPERTY(int large READ large NOTIFY scaleChanged) + Q_PROPERTY(int small READ small NOTIFY valuesChanged) + Q_PROPERTY(int smaller READ smaller NOTIFY valuesChanged) + Q_PROPERTY(int normal READ normal NOTIFY valuesChanged) + Q_PROPERTY(int larger READ larger NOTIFY valuesChanged) + Q_PROPERTY(int large READ large NOTIFY valuesChanged) public: explicit AppearancePadding(QObject* parent = nullptr) : ConfigObject(parent) {} - [[nodiscard]] int small() const { return static_cast(5 * m_scale); } + void bindTokens(PaddingTokens* tokens); - [[nodiscard]] int smaller() const { return static_cast(7 * m_scale); } + [[nodiscard]] int small() const; + [[nodiscard]] int smaller() const; + [[nodiscard]] int normal() const; + [[nodiscard]] int larger() const; + [[nodiscard]] int large() const; - [[nodiscard]] int normal() const { return static_cast(10 * m_scale); } + Q_SIGNAL void valuesChanged(); - [[nodiscard]] int larger() const { return static_cast(12 * m_scale); } - - [[nodiscard]] int large() const { return static_cast(15 * m_scale); } +private: + PaddingTokens* m_tokens = nullptr; }; class FontFamily : public ConfigObject { @@ -94,28 +111,30 @@ class FontSize : public ConfigObject { Q_OBJECT CONFIG_PROPERTY(qreal, scale, 1) - Q_PROPERTY(int small READ small NOTIFY scaleChanged) - Q_PROPERTY(int smaller READ smaller NOTIFY scaleChanged) - Q_PROPERTY(int normal READ normal NOTIFY scaleChanged) - Q_PROPERTY(int larger READ larger NOTIFY scaleChanged) - Q_PROPERTY(int large READ large NOTIFY scaleChanged) - Q_PROPERTY(int extraLarge READ extraLarge NOTIFY scaleChanged) + Q_PROPERTY(int small READ small NOTIFY valuesChanged) + Q_PROPERTY(int smaller READ smaller NOTIFY valuesChanged) + Q_PROPERTY(int normal READ normal NOTIFY valuesChanged) + Q_PROPERTY(int larger READ larger NOTIFY valuesChanged) + Q_PROPERTY(int large READ large NOTIFY valuesChanged) + Q_PROPERTY(int extraLarge READ extraLarge NOTIFY valuesChanged) public: explicit FontSize(QObject* parent = nullptr) : ConfigObject(parent) {} - [[nodiscard]] int small() const { return static_cast(11 * m_scale); } + void bindTokens(FontSizeTokens* tokens); - [[nodiscard]] int smaller() const { return static_cast(12 * m_scale); } + [[nodiscard]] int small() const; + [[nodiscard]] int smaller() const; + [[nodiscard]] int normal() const; + [[nodiscard]] int larger() const; + [[nodiscard]] int large() const; + [[nodiscard]] int extraLarge() const; - [[nodiscard]] int normal() const { return static_cast(13 * m_scale); } + Q_SIGNAL void valuesChanged(); - [[nodiscard]] int larger() const { return static_cast(15 * m_scale); } - - [[nodiscard]] int large() const { return static_cast(18 * m_scale); } - - [[nodiscard]] int extraLarge() const { return static_cast(28 * m_scale); } +private: + FontSizeTokens* m_tokens = nullptr; }; class AppearanceFont : public ConfigObject { @@ -134,31 +153,32 @@ class AnimDurations : public ConfigObject { Q_OBJECT CONFIG_PROPERTY(qreal, scale, 1) - Q_PROPERTY(int small READ small NOTIFY scaleChanged) - Q_PROPERTY(int normal READ normal NOTIFY scaleChanged) - Q_PROPERTY(int large READ large NOTIFY scaleChanged) - Q_PROPERTY(int extraLarge READ extraLarge NOTIFY scaleChanged) - Q_PROPERTY(int expressiveFastSpatial READ expressiveFastSpatial NOTIFY scaleChanged) - Q_PROPERTY(int expressiveDefaultSpatial READ expressiveDefaultSpatial NOTIFY scaleChanged) - Q_PROPERTY(int expressiveSlowSpatial READ expressiveSlowSpatial NOTIFY scaleChanged) + Q_PROPERTY(int small READ small NOTIFY valuesChanged) + Q_PROPERTY(int normal READ normal NOTIFY valuesChanged) + Q_PROPERTY(int large READ large NOTIFY valuesChanged) + Q_PROPERTY(int extraLarge READ extraLarge NOTIFY valuesChanged) + Q_PROPERTY(int expressiveFastSpatial READ expressiveFastSpatial NOTIFY valuesChanged) + Q_PROPERTY(int expressiveDefaultSpatial READ expressiveDefaultSpatial NOTIFY valuesChanged) + Q_PROPERTY(int expressiveSlowSpatial READ expressiveSlowSpatial NOTIFY valuesChanged) public: explicit AnimDurations(QObject* parent = nullptr) : ConfigObject(parent) {} - [[nodiscard]] int small() const { return static_cast(200 * m_scale); } + void bindTokens(AnimDurationTokens* tokens); - [[nodiscard]] int normal() const { return static_cast(400 * m_scale); } + [[nodiscard]] int small() const; + [[nodiscard]] int normal() const; + [[nodiscard]] int large() const; + [[nodiscard]] int extraLarge() const; + [[nodiscard]] int expressiveFastSpatial() const; + [[nodiscard]] int expressiveDefaultSpatial() const; + [[nodiscard]] int expressiveSlowSpatial() const; - [[nodiscard]] int large() const { return static_cast(600 * m_scale); } + Q_SIGNAL void valuesChanged(); - [[nodiscard]] int extraLarge() const { return static_cast(1000 * m_scale); } - - [[nodiscard]] int expressiveFastSpatial() const { return static_cast(350 * m_scale); } - - [[nodiscard]] int expressiveDefaultSpatial() const { return static_cast(500 * m_scale); } - - [[nodiscard]] int expressiveSlowSpatial() const { return static_cast(650 * m_scale); } +private: + AnimDurationTokens* m_tokens = nullptr; }; class AppearanceAnim : public ConfigObject { diff --git a/plugin/src/Caelestia/Config/config.cpp b/plugin/src/Caelestia/Config/config.cpp index 01df3704..02014577 100644 --- a/plugin/src/Caelestia/Config/config.cpp +++ b/plugin/src/Caelestia/Config/config.cpp @@ -1,17 +1,15 @@ #include "config.hpp" -#include -#include -#include -#include -#include -#include #include namespace caelestia::config { static GlobalConfig* s_instance = nullptr; +static QString configDir() { + return QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + QStringLiteral("/caelestia/"); +} + GlobalConfig::GlobalConfig(QObject* parent) : ConfigObject(parent) , m_appearance(new AppearanceConfig(this)) @@ -34,91 +32,32 @@ GlobalConfig::GlobalConfig(QObject* parent) , m_advanced(new AdvancedConfig(this)) { s_instance = this; - m_configPath = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + - QStringLiteral("/caelestia/shell.json"); + // Bind token base values from advanced config to appearance computed properties + auto* adv = m_advanced->appearance(); + m_appearance->rounding()->bindTokens(adv->rounding()); + m_appearance->spacing()->bindTokens(adv->spacing()); + m_appearance->padding()->bindTokens(adv->padding()); + m_appearance->font()->size()->bindTokens(adv->fontSize()); + m_appearance->anim()->durations()->bindTokens(adv->animDurations()); - m_saveTimer.setSingleShot(true); - m_saveTimer.setInterval(500); - connect(&m_saveTimer, &QTimer::timeout, this, &GlobalConfig::writeToFile); - - m_cooldownTimer.setSingleShot(true); - m_cooldownTimer.setInterval(2000); - connect(&m_cooldownTimer, &QTimer::timeout, this, [this] { - m_recentlySaved = false; - emit recentlySavedChanged(); - }); - - connect(&m_watcher, &QFileSystemWatcher::fileChanged, this, &GlobalConfig::onFileChanged); - - reload(); - - if (QFile::exists(m_configPath)) { - m_watcher.addPath(m_configPath); - } + // Each has its own file backend + setupFileBackend(configDir() + QStringLiteral("shell.json")); + m_advanced->setupFileBackend(configDir() + QStringLiteral("advanced.json")); } GlobalConfig* GlobalConfig::instance() { return s_instance; } -bool GlobalConfig::recentlySaved() const { - return m_recentlySaved; -} - void GlobalConfig::save() { - m_saveTimer.start(); - m_recentlySaved = true; - emit recentlySavedChanged(); - m_cooldownTimer.start(); + saveToFile(); } void GlobalConfig::reload() { - QFile file(m_configPath); - - if (!file.open(QIODevice::ReadOnly)) { - qWarning() << "Config: failed to open" << m_configPath; - return; - } - - load(file.readAll()); + reloadFromFile(); } -void GlobalConfig::load(const QByteArray& contents) { - QJsonParseError error{}; - auto doc = QJsonDocument::fromJson(contents, &error); - - if (error.error != QJsonParseError::NoError) { - qWarning() << "Config: failed to parse JSON:" << error.errorString(); - return; - } - - loadFromJson(doc.object()); -} - -void GlobalConfig::onFileChanged() { - if (!m_watcher.files().contains(m_configPath)) { - m_watcher.addPath(m_configPath); - } - - if (!m_recentlySaved) { - reload(); - } -} - -void GlobalConfig::writeToFile() { - QDir().mkpath(QFileInfo(m_configPath).absolutePath()); - - QFile file(m_configPath); - - if (!file.open(QIODevice::WriteOnly)) { - qWarning() << "Config: failed to write" << m_configPath; - return; - } - - file.write(QJsonDocument(toJsonObject()).toJson(QJsonDocument::Indented)); -} - -// Config +// Config (attached type) Config::Config(QQuickItem* parent) : QQuickItem(parent) {} diff --git a/plugin/src/Caelestia/Config/config.hpp b/plugin/src/Caelestia/Config/config.hpp index e989d4c3..ecd26634 100644 --- a/plugin/src/Caelestia/Config/config.hpp +++ b/plugin/src/Caelestia/Config/config.hpp @@ -1,12 +1,7 @@ #pragma once -#include -#include -#include -#include #include #include -#include #include "advancedconfig.hpp" #include "appearanceconfig.hpp" @@ -51,33 +46,21 @@ class GlobalConfig : public ConfigObject { CONFIG_SUBOBJECT(SidebarConfig, sidebar) CONFIG_SUBOBJECT(ServiceConfig, services) CONFIG_SUBOBJECT(UserPaths, paths) - CONFIG_SUBOBJECT(AdvancedConfig, advanced) - - Q_PROPERTY(bool recentlySaved READ recentlySaved NOTIFY recentlySavedChanged) + // advanced is NOT a CONFIG_SUBOBJECT — it has its own file backend + Q_PROPERTY(AdvancedConfig* advanced READ advanced CONSTANT) public: explicit GlobalConfig(QObject* parent = nullptr); static GlobalConfig* instance(); - [[nodiscard]] bool recentlySaved() const; + [[nodiscard]] AdvancedConfig* advanced() const { return m_advanced; } Q_INVOKABLE void save(); Q_INVOKABLE void reload(); -signals: - void recentlySavedChanged(); - private: - void load(const QByteArray& contents); - void onFileChanged(); - void writeToFile(); - - bool m_recentlySaved = false; - QString m_configPath; - QFileSystemWatcher m_watcher; - QTimer m_saveTimer; - QTimer m_cooldownTimer; + AdvancedConfig* m_advanced = nullptr; }; class Config : public QQuickItem { diff --git a/plugin/src/Caelestia/Config/configobject.cpp b/plugin/src/Caelestia/Config/configobject.cpp index 7533b0f5..cb6624a1 100644 --- a/plugin/src/Caelestia/Config/configobject.cpp +++ b/plugin/src/Caelestia/Config/configobject.cpp @@ -1,6 +1,10 @@ #include "configobject.hpp" +#include +#include +#include #include +#include #include #include #include @@ -104,4 +108,74 @@ QJsonObject ConfigObject::toJsonObject() const { return obj; } +void ConfigObject::setupFileBackend(const QString& path) { + m_filePath = path; + + m_watcher = new QFileSystemWatcher(this); + m_saveTimer = new QTimer(this); + m_cooldownTimer = new QTimer(this); + + m_saveTimer->setSingleShot(true); + m_saveTimer->setInterval(500); + connect(m_saveTimer, &QTimer::timeout, this, [this] { + QDir().mkpath(QFileInfo(m_filePath).absolutePath()); + + QFile file(m_filePath); + if (!file.open(QIODevice::WriteOnly)) { + qCWarning(lcConfig) << "Failed to write" << m_filePath; + return; + } + + file.write(QJsonDocument(toJsonObject()).toJson(QJsonDocument::Indented)); + }); + + m_cooldownTimer->setSingleShot(true); + m_cooldownTimer->setInterval(2000); + connect(m_cooldownTimer, &QTimer::timeout, this, [this] { + m_recentlySaved = false; + }); + + connect(m_watcher, &QFileSystemWatcher::fileChanged, this, &ConfigObject::onFileChanged); + + reloadFromFile(); + + if (QFile::exists(m_filePath)) + m_watcher->addPath(m_filePath); +} + +void ConfigObject::saveToFile() { + if (!m_saveTimer) + return; + m_saveTimer->start(); + m_recentlySaved = true; + m_cooldownTimer->start(); +} + +void ConfigObject::reloadFromFile() { + QFile file(m_filePath); + + if (!file.open(QIODevice::ReadOnly)) { + qCDebug(lcConfig) << "Failed to open" << m_filePath; + return; + } + + QJsonParseError error{}; + auto doc = QJsonDocument::fromJson(file.readAll(), &error); + + if (error.error != QJsonParseError::NoError) { + qCWarning(lcConfig) << "Failed to parse" << m_filePath << ":" << error.errorString(); + return; + } + + loadFromJson(doc.object()); +} + +void ConfigObject::onFileChanged() { + if (!m_watcher->files().contains(m_filePath)) + m_watcher->addPath(m_filePath); + + if (!m_recentlySaved) + reloadFromFile(); +} + } // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/configobject.hpp b/plugin/src/Caelestia/Config/configobject.hpp index 2f8f443e..d3ef11e9 100644 --- a/plugin/src/Caelestia/Config/configobject.hpp +++ b/plugin/src/Caelestia/Config/configobject.hpp @@ -1,10 +1,10 @@ #pragma once +#include #include #include #include - -#include +#include // Declares a serialized config property with getter, setter (change-detected), signal, and member. #define CONFIG_PROPERTY(Type, name, ...) \ @@ -16,7 +16,7 @@ public: } \ void set_##name(const Type& val) { \ if (caelestia::config::ConfigObject::updateMember(m_##name, val)) \ - emit name##Changed(); \ + Q_EMIT name##Changed(); \ } \ Q_SIGNAL void name##Changed(); \ \ @@ -47,6 +47,14 @@ public: void loadFromJson(const QJsonObject& obj); [[nodiscard]] QJsonObject toJsonObject() const; + // File-backed config support. Call setupFileBackend() to enable + // automatic file watching, debounced saving, and reload. + void setupFileBackend(const QString& path); + void saveToFile(); + void reloadFromFile(); + + [[nodiscard]] bool recentlySaved() const { return m_recentlySaved; } + template static bool updateMember(T& member, const T& value) { if constexpr (std::is_floating_point_v) { if (qFuzzyCompare(member + 1.0, value + 1.0)) @@ -58,6 +66,16 @@ public: member = value; return true; } + +private: + void onFileChanged(); + + QString m_filePath; + bool m_recentlySaved = false; + // These are heap-allocated only when setupFileBackend is called + QFileSystemWatcher* m_watcher = nullptr; + QTimer* m_saveTimer = nullptr; + QTimer* m_cooldownTimer = nullptr; }; } // namespace caelestia::config From f7aec30ad20536cf945b8f497cdc286a047252b1 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 02:52:17 +1000 Subject: [PATCH 03/81] fix: use private constructor for singleton --- plugin/src/Caelestia/Config/config.cpp | 15 ++++++++++----- plugin/src/Caelestia/Config/config.hpp | 5 +++-- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/plugin/src/Caelestia/Config/config.cpp b/plugin/src/Caelestia/Config/config.cpp index 02014577..dfee35f4 100644 --- a/plugin/src/Caelestia/Config/config.cpp +++ b/plugin/src/Caelestia/Config/config.cpp @@ -4,12 +4,14 @@ namespace caelestia::config { -static GlobalConfig* s_instance = nullptr; +namespace { -static QString configDir() { +QString configDir() { return QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + QStringLiteral("/caelestia/"); } +} // namespace + GlobalConfig::GlobalConfig(QObject* parent) : ConfigObject(parent) , m_appearance(new AppearanceConfig(this)) @@ -30,8 +32,6 @@ GlobalConfig::GlobalConfig(QObject* parent) , m_services(new ServiceConfig(this)) , m_paths(new UserPaths(this)) , m_advanced(new AdvancedConfig(this)) { - s_instance = this; - // Bind token base values from advanced config to appearance computed properties auto* adv = m_advanced->appearance(); m_appearance->rounding()->bindTokens(adv->rounding()); @@ -46,7 +46,12 @@ GlobalConfig::GlobalConfig(QObject* parent) } GlobalConfig* GlobalConfig::instance() { - return s_instance; + static GlobalConfig instance; + return &instance; +} + +GlobalConfig* GlobalConfig::create(QQmlEngine*, QJSEngine*) { + return instance(); } void GlobalConfig::save() { diff --git a/plugin/src/Caelestia/Config/config.hpp b/plugin/src/Caelestia/Config/config.hpp index ecd26634..fda17721 100644 --- a/plugin/src/Caelestia/Config/config.hpp +++ b/plugin/src/Caelestia/Config/config.hpp @@ -50,9 +50,8 @@ class GlobalConfig : public ConfigObject { Q_PROPERTY(AdvancedConfig* advanced READ advanced CONSTANT) public: - explicit GlobalConfig(QObject* parent = nullptr); - static GlobalConfig* instance(); + static GlobalConfig* create(QQmlEngine*, QJSEngine*); [[nodiscard]] AdvancedConfig* advanced() const { return m_advanced; } @@ -60,6 +59,8 @@ public: Q_INVOKABLE void reload(); private: + explicit GlobalConfig(QObject* parent = nullptr); + AdvancedConfig* m_advanced = nullptr; }; From ff1bde855ec42f8d913379fd22bfa10d805e74cd Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 03:07:48 +1000 Subject: [PATCH 04/81] fix: expose config types to qml properly --- .../src/Caelestia/Config/advancedconfig.hpp | 38 +++++++++++++++++++ .../src/Caelestia/Config/appearanceconfig.hpp | 20 ++++++++++ .../src/Caelestia/Config/backgroundconfig.hpp | 10 +++++ plugin/src/Caelestia/Config/barconfig.hpp | 16 ++++++++ plugin/src/Caelestia/Config/borderconfig.hpp | 2 + plugin/src/Caelestia/Config/configobject.hpp | 1 - .../Caelestia/Config/controlcenterconfig.hpp | 1 + .../src/Caelestia/Config/dashboardconfig.hpp | 4 ++ plugin/src/Caelestia/Config/generalconfig.hpp | 8 ++++ .../src/Caelestia/Config/launcherconfig.hpp | 4 ++ plugin/src/Caelestia/Config/lockconfig.hpp | 2 + plugin/src/Caelestia/Config/notifsconfig.hpp | 2 + plugin/src/Caelestia/Config/osdconfig.hpp | 2 + plugin/src/Caelestia/Config/serviceconfig.hpp | 2 + plugin/src/Caelestia/Config/sessionconfig.hpp | 6 +++ plugin/src/Caelestia/Config/sidebarconfig.hpp | 2 + plugin/src/Caelestia/Config/userpaths.hpp | 2 + .../src/Caelestia/Config/utilitiesconfig.hpp | 6 +++ plugin/src/Caelestia/Config/winfoconfig.hpp | 1 + 19 files changed, 128 insertions(+), 1 deletion(-) diff --git a/plugin/src/Caelestia/Config/advancedconfig.hpp b/plugin/src/Caelestia/Config/advancedconfig.hpp index 181ba0bc..3b895675 100644 --- a/plugin/src/Caelestia/Config/advancedconfig.hpp +++ b/plugin/src/Caelestia/Config/advancedconfig.hpp @@ -8,6 +8,8 @@ namespace caelestia::config { class AnimCurves : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(QList, emphasized) CONFIG_PROPERTY(QList, emphasizedAccel) CONFIG_PROPERTY(QList, emphasizedDecel) @@ -34,6 +36,8 @@ public: class RoundingTokens : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(int, small, 12) CONFIG_PROPERTY(int, normal, 17) CONFIG_PROPERTY(int, large, 25) @@ -46,6 +50,8 @@ public: class SpacingTokens : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(int, small, 7) CONFIG_PROPERTY(int, smaller, 10) CONFIG_PROPERTY(int, normal, 12) @@ -59,6 +65,8 @@ public: class PaddingTokens : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(int, small, 5) CONFIG_PROPERTY(int, smaller, 7) CONFIG_PROPERTY(int, normal, 10) @@ -72,6 +80,8 @@ public: class FontSizeTokens : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(int, small, 11) CONFIG_PROPERTY(int, smaller, 12) CONFIG_PROPERTY(int, normal, 13) @@ -86,6 +96,8 @@ public: class AnimDurationTokens : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(int, small, 200) CONFIG_PROPERTY(int, normal, 400) CONFIG_PROPERTY(int, large, 600) @@ -101,6 +113,8 @@ public: class AdvancedAppearance : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_SUBOBJECT(AnimCurves, curves) CONFIG_SUBOBJECT(RoundingTokens, rounding) CONFIG_SUBOBJECT(SpacingTokens, spacing) @@ -121,6 +135,8 @@ public: class BarSizes : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(int, innerWidth, 40) CONFIG_PROPERTY(int, windowPreviewSize, 400) CONFIG_PROPERTY(int, trayMenuWidth, 300) @@ -135,6 +151,8 @@ public: class AdvancedDashboard : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(bool, showDashboard, true) CONFIG_PROPERTY(bool, showMedia, true) CONFIG_PROPERTY(bool, showPerformance, true) @@ -187,6 +205,8 @@ public: class LauncherSizes : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(int, itemWidth, 600) CONFIG_PROPERTY(int, itemHeight, 57) CONFIG_PROPERTY(int, wallpaperWidth, 280) @@ -199,6 +219,8 @@ public: class NotifsSizes : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(int, width, 400) CONFIG_PROPERTY(int, image, 41) CONFIG_PROPERTY(int, badge, 20) @@ -210,6 +232,8 @@ public: class OsdSizes : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(int, sliderWidth, 30) CONFIG_PROPERTY(int, sliderHeight, 150) @@ -220,6 +244,8 @@ public: class SessionSizes : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(int, button, 80) public: @@ -229,6 +255,8 @@ public: class SidebarSizes : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(int, width, 430) public: @@ -238,6 +266,8 @@ public: class UtilitiesSizes : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(int, width, 430) CONFIG_PROPERTY(int, toastWidth, 430) @@ -248,6 +278,8 @@ public: class LockSizes : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(qreal, heightMult, 0.7) CONFIG_PROPERTY(qreal, ratio, 16.0 / 9.0) CONFIG_PROPERTY(int, centerWidth, 600) @@ -259,6 +291,8 @@ public: class WInfoSizes : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(qreal, heightMult, 0.7) CONFIG_PROPERTY(qreal, detailsWidth, 500) @@ -269,6 +303,8 @@ public: class ControlCenterSizes : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(qreal, heightMult, 0.7) CONFIG_PROPERTY(qreal, ratio, 16.0 / 9.0) @@ -279,6 +315,8 @@ public: class AdvancedConfig : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_SUBOBJECT(AdvancedAppearance, appearance) CONFIG_SUBOBJECT(BarSizes, bar) CONFIG_SUBOBJECT(AdvancedDashboard, dashboard) diff --git a/plugin/src/Caelestia/Config/appearanceconfig.hpp b/plugin/src/Caelestia/Config/appearanceconfig.hpp index c0094b26..db395e82 100644 --- a/plugin/src/Caelestia/Config/appearanceconfig.hpp +++ b/plugin/src/Caelestia/Config/appearanceconfig.hpp @@ -15,6 +15,8 @@ class AnimDurationTokens; class AppearanceRounding : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(qreal, scale, 1) Q_PROPERTY(int small READ small NOTIFY valuesChanged) @@ -41,6 +43,8 @@ private: class AppearanceSpacing : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(qreal, scale, 1) Q_PROPERTY(int small READ small NOTIFY valuesChanged) @@ -69,6 +73,8 @@ private: class AppearancePadding : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(qreal, scale, 1) Q_PROPERTY(int small READ small NOTIFY valuesChanged) @@ -97,6 +103,8 @@ private: class FontFamily : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(QString, sans, QStringLiteral("Rubik")) CONFIG_PROPERTY(QString, mono, QStringLiteral("CaskaydiaCove NF")) CONFIG_PROPERTY(QString, material, QStringLiteral("Material Symbols Rounded")) @@ -109,6 +117,8 @@ public: class FontSize : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(qreal, scale, 1) Q_PROPERTY(int small READ small NOTIFY valuesChanged) @@ -139,6 +149,8 @@ private: class AppearanceFont : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_SUBOBJECT(FontFamily, family) CONFIG_SUBOBJECT(FontSize, size) @@ -151,6 +163,8 @@ public: class AnimDurations : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(qreal, scale, 1) Q_PROPERTY(int small READ small NOTIFY valuesChanged) @@ -183,6 +197,8 @@ private: class AppearanceAnim : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(qreal, mediaGifSpeedAdjustment, 300) CONFIG_PROPERTY(qreal, sessionGifSpeed, 0.7) CONFIG_SUBOBJECT(AnimDurations, durations) @@ -195,6 +211,8 @@ public: class AppearanceTransparency : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(bool, enabled, false) CONFIG_PROPERTY(qreal, base, 0.85) CONFIG_PROPERTY(qreal, layers, 0.4) @@ -206,6 +224,8 @@ public: class AppearanceConfig : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_SUBOBJECT(AppearanceRounding, rounding) CONFIG_SUBOBJECT(AppearanceSpacing, spacing) CONFIG_SUBOBJECT(AppearancePadding, padding) diff --git a/plugin/src/Caelestia/Config/backgroundconfig.hpp b/plugin/src/Caelestia/Config/backgroundconfig.hpp index 32440cc3..743cd787 100644 --- a/plugin/src/Caelestia/Config/backgroundconfig.hpp +++ b/plugin/src/Caelestia/Config/backgroundconfig.hpp @@ -8,6 +8,8 @@ namespace caelestia::config { class DesktopClockBackground : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(bool, enabled, false) CONFIG_PROPERTY(qreal, opacity, 0.7) CONFIG_PROPERTY(bool, blur, true) @@ -19,6 +21,8 @@ public: class DesktopClockShadow : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(bool, enabled, true) CONFIG_PROPERTY(qreal, opacity, 0.7) CONFIG_PROPERTY(qreal, blur, 0.4) @@ -30,6 +34,8 @@ public: class DesktopClock : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(bool, enabled, false) CONFIG_PROPERTY(qreal, scale, 1.0) CONFIG_PROPERTY(QString, position, QStringLiteral("bottom-right")) @@ -46,6 +52,8 @@ public: class BackgroundVisualiser : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(bool, enabled, false) CONFIG_PROPERTY(bool, autoHide, true) CONFIG_PROPERTY(bool, blur, false) @@ -59,6 +67,8 @@ public: class BackgroundConfig : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(bool, enabled, true) CONFIG_PROPERTY(bool, wallpaperEnabled, true) CONFIG_SUBOBJECT(DesktopClock, desktopClock) diff --git a/plugin/src/Caelestia/Config/barconfig.hpp b/plugin/src/Caelestia/Config/barconfig.hpp index 712c047f..3ec57b00 100644 --- a/plugin/src/Caelestia/Config/barconfig.hpp +++ b/plugin/src/Caelestia/Config/barconfig.hpp @@ -10,6 +10,8 @@ namespace caelestia::config { class BarScrollActions : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(bool, workspaces, true) CONFIG_PROPERTY(bool, volume, true) CONFIG_PROPERTY(bool, brightness, true) @@ -21,6 +23,8 @@ public: class BarPopouts : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(bool, activeWindow, true) CONFIG_PROPERTY(bool, tray, true) CONFIG_PROPERTY(bool, statusIcons, true) @@ -32,6 +36,8 @@ public: class BarWorkspaces : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(int, shown, 5) CONFIG_PROPERTY(bool, activeIndicator, true) CONFIG_PROPERTY(bool, occupiedBg, false) @@ -54,6 +60,8 @@ public: class BarActiveWindow : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(bool, compact, false) CONFIG_PROPERTY(bool, inverted, false) CONFIG_PROPERTY(bool, showOnHover, true) @@ -65,6 +73,8 @@ public: class BarTray : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(bool, background, false) CONFIG_PROPERTY(bool, recolour, false) CONFIG_PROPERTY(bool, compact, false) @@ -78,6 +88,8 @@ public: class BarStatus : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(bool, showAudio, false) CONFIG_PROPERTY(bool, showMicrophone, false) CONFIG_PROPERTY(bool, showKbLayout, false) @@ -94,6 +106,8 @@ public: class BarClock : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(bool, background, false) CONFIG_PROPERTY(bool, showDate, false) CONFIG_PROPERTY(bool, showIcon, true) @@ -105,6 +119,8 @@ public: class BarConfig : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(bool, persistent, true) CONFIG_PROPERTY(bool, showOnHover, true) CONFIG_PROPERTY(int, dragThreshold, 20) diff --git a/plugin/src/Caelestia/Config/borderconfig.hpp b/plugin/src/Caelestia/Config/borderconfig.hpp index 9bc2966c..abdd07d9 100644 --- a/plugin/src/Caelestia/Config/borderconfig.hpp +++ b/plugin/src/Caelestia/Config/borderconfig.hpp @@ -8,6 +8,8 @@ namespace caelestia::config { class BorderConfig : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(int, thickness, 10) CONFIG_PROPERTY(int, rounding, 25) diff --git a/plugin/src/Caelestia/Config/configobject.hpp b/plugin/src/Caelestia/Config/configobject.hpp index d3ef11e9..bc8271a8 100644 --- a/plugin/src/Caelestia/Config/configobject.hpp +++ b/plugin/src/Caelestia/Config/configobject.hpp @@ -39,7 +39,6 @@ namespace caelestia::config { class ConfigObject : public QObject { Q_OBJECT - QML_ANONYMOUS public: explicit ConfigObject(QObject* parent = nullptr); diff --git a/plugin/src/Caelestia/Config/controlcenterconfig.hpp b/plugin/src/Caelestia/Config/controlcenterconfig.hpp index d827f7cc..80b40b87 100644 --- a/plugin/src/Caelestia/Config/controlcenterconfig.hpp +++ b/plugin/src/Caelestia/Config/controlcenterconfig.hpp @@ -8,6 +8,7 @@ namespace caelestia::config { // All properties are in AdvancedConfig.controlCenter class ControlCenterConfig : public ConfigObject { Q_OBJECT + QML_ANONYMOUS public: explicit ControlCenterConfig(QObject* parent = nullptr) diff --git a/plugin/src/Caelestia/Config/dashboardconfig.hpp b/plugin/src/Caelestia/Config/dashboardconfig.hpp index f6b97ac6..d78bc1af 100644 --- a/plugin/src/Caelestia/Config/dashboardconfig.hpp +++ b/plugin/src/Caelestia/Config/dashboardconfig.hpp @@ -6,6 +6,8 @@ namespace caelestia::config { class DashboardPerformance : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(bool, showBattery, true) CONFIG_PROPERTY(bool, showGpu, true) CONFIG_PROPERTY(bool, showCpu, true) @@ -20,6 +22,8 @@ public: class DashboardConfig : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(bool, enabled, true) CONFIG_PROPERTY(bool, showOnHover, true) CONFIG_PROPERTY(int, mediaUpdateInterval, 500) diff --git a/plugin/src/Caelestia/Config/generalconfig.hpp b/plugin/src/Caelestia/Config/generalconfig.hpp index 8ccc9089..88bb7ebf 100644 --- a/plugin/src/Caelestia/Config/generalconfig.hpp +++ b/plugin/src/Caelestia/Config/generalconfig.hpp @@ -10,6 +10,8 @@ namespace caelestia::config { class GeneralApps : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(QStringList, terminal, { QStringLiteral("foot") }) CONFIG_PROPERTY(QStringList, audio, { QStringLiteral("pavucontrol") }) CONFIG_PROPERTY(QStringList, playback, { QStringLiteral("mpv") }) @@ -22,6 +24,8 @@ public: class GeneralIdle : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(bool, lockBeforeSleep, true) CONFIG_PROPERTY(bool, inhibitWhenAudio, true) CONFIG_PROPERTY(QVariantList, timeouts) @@ -33,6 +37,8 @@ public: class GeneralBattery : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(QVariantList, warnLevels) CONFIG_PROPERTY(int, criticalLevel, 3) @@ -43,6 +49,8 @@ public: class GeneralConfig : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(QString, logo) CONFIG_PROPERTY(QStringList, excludedScreens) CONFIG_SUBOBJECT(GeneralApps, apps) diff --git a/plugin/src/Caelestia/Config/launcherconfig.hpp b/plugin/src/Caelestia/Config/launcherconfig.hpp index d430ae60..23f71734 100644 --- a/plugin/src/Caelestia/Config/launcherconfig.hpp +++ b/plugin/src/Caelestia/Config/launcherconfig.hpp @@ -10,6 +10,8 @@ namespace caelestia::config { class LauncherUseFuzzy : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(bool, apps, false) CONFIG_PROPERTY(bool, actions, false) CONFIG_PROPERTY(bool, schemes, false) @@ -23,6 +25,8 @@ public: class LauncherConfig : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(bool, enabled, true) CONFIG_PROPERTY(bool, showOnHover, false) CONFIG_PROPERTY(int, maxShown, 7) diff --git a/plugin/src/Caelestia/Config/lockconfig.hpp b/plugin/src/Caelestia/Config/lockconfig.hpp index a15c722a..444b3051 100644 --- a/plugin/src/Caelestia/Config/lockconfig.hpp +++ b/plugin/src/Caelestia/Config/lockconfig.hpp @@ -6,6 +6,8 @@ namespace caelestia::config { class LockConfig : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(bool, recolourLogo, false) CONFIG_PROPERTY(bool, enableFprint, true) CONFIG_PROPERTY(int, maxFprintTries, 3) diff --git a/plugin/src/Caelestia/Config/notifsconfig.hpp b/plugin/src/Caelestia/Config/notifsconfig.hpp index 61c9bb9e..745b057b 100644 --- a/plugin/src/Caelestia/Config/notifsconfig.hpp +++ b/plugin/src/Caelestia/Config/notifsconfig.hpp @@ -8,6 +8,8 @@ namespace caelestia::config { class NotifsConfig : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(bool, expire, true) CONFIG_PROPERTY(QString, fullscreen, QStringLiteral("on")) CONFIG_PROPERTY(int, defaultExpireTimeout, 5000) diff --git a/plugin/src/Caelestia/Config/osdconfig.hpp b/plugin/src/Caelestia/Config/osdconfig.hpp index 71cc27b4..18770294 100644 --- a/plugin/src/Caelestia/Config/osdconfig.hpp +++ b/plugin/src/Caelestia/Config/osdconfig.hpp @@ -6,6 +6,8 @@ namespace caelestia::config { class OsdConfig : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(bool, enabled, true) CONFIG_PROPERTY(int, hideDelay, 2000) CONFIG_PROPERTY(bool, enableBrightness, true) diff --git a/plugin/src/Caelestia/Config/serviceconfig.hpp b/plugin/src/Caelestia/Config/serviceconfig.hpp index 131314c1..062bf451 100644 --- a/plugin/src/Caelestia/Config/serviceconfig.hpp +++ b/plugin/src/Caelestia/Config/serviceconfig.hpp @@ -9,6 +9,8 @@ namespace caelestia::config { class ServiceConfig : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(QString, weatherLocation) CONFIG_PROPERTY(bool, useFahrenheit, false) CONFIG_PROPERTY(bool, useFahrenheitPerformance, false) diff --git a/plugin/src/Caelestia/Config/sessionconfig.hpp b/plugin/src/Caelestia/Config/sessionconfig.hpp index af609512..629b3b6e 100644 --- a/plugin/src/Caelestia/Config/sessionconfig.hpp +++ b/plugin/src/Caelestia/Config/sessionconfig.hpp @@ -9,6 +9,8 @@ namespace caelestia::config { class SessionIcons : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(QString, logout, QStringLiteral("logout")) CONFIG_PROPERTY(QString, shutdown, QStringLiteral("power_settings_new")) CONFIG_PROPERTY(QString, hibernate, QStringLiteral("downloading")) @@ -21,6 +23,8 @@ public: class SessionCommands : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(QStringList, logout, { QStringLiteral("loginctl"), QStringLiteral("terminate-user"), QString() }) CONFIG_PROPERTY(QStringList, shutdown, { QStringLiteral("systemctl"), QStringLiteral("poweroff") }) CONFIG_PROPERTY(QStringList, hibernate, { QStringLiteral("systemctl"), QStringLiteral("hibernate") }) @@ -33,6 +37,8 @@ public: class SessionConfig : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(bool, enabled, true) CONFIG_PROPERTY(int, dragThreshold, 30) CONFIG_PROPERTY(bool, vimKeybinds, false) diff --git a/plugin/src/Caelestia/Config/sidebarconfig.hpp b/plugin/src/Caelestia/Config/sidebarconfig.hpp index 71041cfb..4460872e 100644 --- a/plugin/src/Caelestia/Config/sidebarconfig.hpp +++ b/plugin/src/Caelestia/Config/sidebarconfig.hpp @@ -6,6 +6,8 @@ namespace caelestia::config { class SidebarConfig : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(bool, enabled, true) CONFIG_PROPERTY(int, dragThreshold, 80) diff --git a/plugin/src/Caelestia/Config/userpaths.hpp b/plugin/src/Caelestia/Config/userpaths.hpp index ec0b4880..18812188 100644 --- a/plugin/src/Caelestia/Config/userpaths.hpp +++ b/plugin/src/Caelestia/Config/userpaths.hpp @@ -10,6 +10,8 @@ namespace caelestia::config { class UserPaths : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(QString, wallpaperDir, QStandardPaths::writableLocation(QStandardPaths::PicturesLocation) + QStringLiteral("/Wallpapers")) CONFIG_PROPERTY(QString, lyricsDir, QDir::homePath() + QStringLiteral("/Music/lyrics/")) diff --git a/plugin/src/Caelestia/Config/utilitiesconfig.hpp b/plugin/src/Caelestia/Config/utilitiesconfig.hpp index 98da47ed..57b6fccd 100644 --- a/plugin/src/Caelestia/Config/utilitiesconfig.hpp +++ b/plugin/src/Caelestia/Config/utilitiesconfig.hpp @@ -9,6 +9,8 @@ namespace caelestia::config { class UtilitiesToasts : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(bool, configLoaded, true) CONFIG_PROPERTY(QString, fullscreen, QStringLiteral("off")) CONFIG_PROPERTY(bool, chargingChanged, true) @@ -30,6 +32,8 @@ public: class UtilitiesVpn : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(bool, enabled, false) CONFIG_PROPERTY(QVariantList, provider) @@ -40,6 +44,8 @@ public: class UtilitiesConfig : public ConfigObject { Q_OBJECT + QML_ANONYMOUS + CONFIG_PROPERTY(bool, enabled, true) CONFIG_PROPERTY(int, maxToasts, 4) CONFIG_SUBOBJECT(UtilitiesToasts, toasts) diff --git a/plugin/src/Caelestia/Config/winfoconfig.hpp b/plugin/src/Caelestia/Config/winfoconfig.hpp index 91f2f234..30d4f5e6 100644 --- a/plugin/src/Caelestia/Config/winfoconfig.hpp +++ b/plugin/src/Caelestia/Config/winfoconfig.hpp @@ -8,6 +8,7 @@ namespace caelestia::config { // All properties are in AdvancedConfig.winfo class WInfoConfig : public ConfigObject { Q_OBJECT + QML_ANONYMOUS public: explicit WInfoConfig(QObject* parent = nullptr) From 4ff97c8306c5289a547cf4446410fb37f4d32192 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 03:27:19 +1000 Subject: [PATCH 05/81] fix: crash/block on qml engine reload --- plugin/src/Caelestia/Config/config.cpp | 21 ++++++++++++++++----- plugin/src/Caelestia/Config/config.hpp | 2 ++ 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/plugin/src/Caelestia/Config/config.cpp b/plugin/src/Caelestia/Config/config.cpp index dfee35f4..c242a1d2 100644 --- a/plugin/src/Caelestia/Config/config.cpp +++ b/plugin/src/Caelestia/Config/config.cpp @@ -1,11 +1,14 @@ #include "config.hpp" +#include #include namespace caelestia::config { namespace { +GlobalConfig* s_instance = nullptr; + QString configDir() { return QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + QStringLiteral("/caelestia/"); } @@ -32,6 +35,9 @@ GlobalConfig::GlobalConfig(QObject* parent) , m_services(new ServiceConfig(this)) , m_paths(new UserPaths(this)) , m_advanced(new AdvancedConfig(this)) { + // Set global instance + s_instance = this; + // Bind token base values from advanced config to appearance computed properties auto* adv = m_advanced->appearance(); m_appearance->rounding()->bindTokens(adv->rounding()); @@ -45,13 +51,18 @@ GlobalConfig::GlobalConfig(QObject* parent) m_advanced->setupFileBackend(configDir() + QStringLiteral("advanced.json")); } -GlobalConfig* GlobalConfig::instance() { - static GlobalConfig instance; - return &instance; +GlobalConfig::~GlobalConfig() { + // Clear global instance + s_instance = nullptr; } -GlobalConfig* GlobalConfig::create(QQmlEngine*, QJSEngine*) { - return instance(); +GlobalConfig* GlobalConfig::instance() { + return s_instance; +} + +GlobalConfig* GlobalConfig::create(QQmlEngine* engine, QJSEngine*) { + auto* config = new GlobalConfig(engine); + return config; } void GlobalConfig::save() { diff --git a/plugin/src/Caelestia/Config/config.hpp b/plugin/src/Caelestia/Config/config.hpp index fda17721..bf23df7b 100644 --- a/plugin/src/Caelestia/Config/config.hpp +++ b/plugin/src/Caelestia/Config/config.hpp @@ -58,6 +58,8 @@ public: Q_INVOKABLE void save(); Q_INVOKABLE void reload(); + ~GlobalConfig() override; + private: explicit GlobalConfig(QObject* parent = nullptr); From f4b851b5b3916175bc2ce51ef0657789a845bf4a Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 15:09:59 +1000 Subject: [PATCH 06/81] feat: advanced -> tokens --- plugin/src/Caelestia/Config/CMakeLists.txt | 2 +- .../src/Caelestia/Config/appearanceconfig.cpp | 2 +- plugin/src/Caelestia/Config/config.cpp | 18 +-- plugin/src/Caelestia/Config/config.hpp | 10 +- .../{advancedconfig.hpp => tokensconfig.hpp} | 153 ++++++++---------- 5 files changed, 79 insertions(+), 106 deletions(-) rename plugin/src/Caelestia/Config/{advancedconfig.hpp => tokensconfig.hpp} (60%) diff --git a/plugin/src/Caelestia/Config/CMakeLists.txt b/plugin/src/Caelestia/Config/CMakeLists.txt index 93f94b06..b071537f 100644 --- a/plugin/src/Caelestia/Config/CMakeLists.txt +++ b/plugin/src/Caelestia/Config/CMakeLists.txt @@ -4,7 +4,7 @@ qml_module(caelestia-config config.cpp configobject.cpp appearanceconfig.cpp - advancedconfig.hpp + tokensconfig.hpp backgroundconfig.hpp barconfig.hpp borderconfig.hpp diff --git a/plugin/src/Caelestia/Config/appearanceconfig.cpp b/plugin/src/Caelestia/Config/appearanceconfig.cpp index 1b45f8f6..61cb6abe 100644 --- a/plugin/src/Caelestia/Config/appearanceconfig.cpp +++ b/plugin/src/Caelestia/Config/appearanceconfig.cpp @@ -1,5 +1,5 @@ #include "appearanceconfig.hpp" -#include "advancedconfig.hpp" +#include "tokensconfig.hpp" #include diff --git a/plugin/src/Caelestia/Config/config.cpp b/plugin/src/Caelestia/Config/config.cpp index c242a1d2..0df6447c 100644 --- a/plugin/src/Caelestia/Config/config.cpp +++ b/plugin/src/Caelestia/Config/config.cpp @@ -34,21 +34,21 @@ GlobalConfig::GlobalConfig(QObject* parent) , m_sidebar(new SidebarConfig(this)) , m_services(new ServiceConfig(this)) , m_paths(new UserPaths(this)) - , m_advanced(new AdvancedConfig(this)) { + , m_tokens(new TokenConfig(this)) { // Set global instance s_instance = this; - // Bind token base values from advanced config to appearance computed properties - auto* adv = m_advanced->appearance(); - m_appearance->rounding()->bindTokens(adv->rounding()); - m_appearance->spacing()->bindTokens(adv->spacing()); - m_appearance->padding()->bindTokens(adv->padding()); - m_appearance->font()->size()->bindTokens(adv->fontSize()); - m_appearance->anim()->durations()->bindTokens(adv->animDurations()); + // Bind token base values from token config to appearance computed properties + auto* appearance = m_tokens->appearance(); + m_appearance->rounding()->bindTokens(appearance->rounding()); + m_appearance->spacing()->bindTokens(appearance->spacing()); + m_appearance->padding()->bindTokens(appearance->padding()); + m_appearance->font()->size()->bindTokens(appearance->fontSize()); + m_appearance->anim()->durations()->bindTokens(appearance->animDurations()); // Each has its own file backend setupFileBackend(configDir() + QStringLiteral("shell.json")); - m_advanced->setupFileBackend(configDir() + QStringLiteral("advanced.json")); + m_tokens->setupFileBackend(configDir() + QStringLiteral("shell-tokens.json")); } GlobalConfig::~GlobalConfig() { diff --git a/plugin/src/Caelestia/Config/config.hpp b/plugin/src/Caelestia/Config/config.hpp index bf23df7b..0d0c1692 100644 --- a/plugin/src/Caelestia/Config/config.hpp +++ b/plugin/src/Caelestia/Config/config.hpp @@ -3,7 +3,6 @@ #include #include -#include "advancedconfig.hpp" #include "appearanceconfig.hpp" #include "backgroundconfig.hpp" #include "barconfig.hpp" @@ -18,6 +17,7 @@ #include "serviceconfig.hpp" #include "sessionconfig.hpp" #include "sidebarconfig.hpp" +#include "tokensconfig.hpp" #include "userpaths.hpp" #include "utilitiesconfig.hpp" #include "winfoconfig.hpp" @@ -46,14 +46,14 @@ class GlobalConfig : public ConfigObject { CONFIG_SUBOBJECT(SidebarConfig, sidebar) CONFIG_SUBOBJECT(ServiceConfig, services) CONFIG_SUBOBJECT(UserPaths, paths) - // advanced is NOT a CONFIG_SUBOBJECT — it has its own file backend - Q_PROPERTY(AdvancedConfig* advanced READ advanced CONSTANT) + // tokens is NOT a CONFIG_SUBOBJECT — it has its own file backend + Q_PROPERTY(TokenConfig* tokens READ tokens CONSTANT) public: static GlobalConfig* instance(); static GlobalConfig* create(QQmlEngine*, QJSEngine*); - [[nodiscard]] AdvancedConfig* advanced() const { return m_advanced; } + [[nodiscard]] TokenConfig* tokens() const { return m_tokens; } Q_INVOKABLE void save(); Q_INVOKABLE void reload(); @@ -63,7 +63,7 @@ public: private: explicit GlobalConfig(QObject* parent = nullptr); - AdvancedConfig* m_advanced = nullptr; + TokenConfig* m_tokens = nullptr; }; class Config : public QQuickItem { diff --git a/plugin/src/Caelestia/Config/advancedconfig.hpp b/plugin/src/Caelestia/Config/tokensconfig.hpp similarity index 60% rename from plugin/src/Caelestia/Config/advancedconfig.hpp rename to plugin/src/Caelestia/Config/tokensconfig.hpp index 3b895675..f3f48153 100644 --- a/plugin/src/Caelestia/Config/advancedconfig.hpp +++ b/plugin/src/Caelestia/Config/tokensconfig.hpp @@ -111,7 +111,7 @@ public: : ConfigObject(parent) {} }; -class AdvancedAppearance : public ConfigObject { +class AppearanceTokens : public ConfigObject { Q_OBJECT QML_ANONYMOUS @@ -123,7 +123,7 @@ class AdvancedAppearance : public ConfigObject { CONFIG_SUBOBJECT(AnimDurationTokens, animDurations) public: - explicit AdvancedAppearance(QObject* parent = nullptr) + explicit AppearanceTokens(QObject* parent = nullptr) : ConfigObject(parent) , m_curves(new AnimCurves(this)) , m_rounding(new RoundingTokens(this)) @@ -133,7 +133,7 @@ public: , m_animDurations(new AnimDurationTokens(this)) {} }; -class BarSizes : public ConfigObject { +class BarTokens : public ConfigObject { Q_OBJECT QML_ANONYMOUS @@ -145,11 +145,11 @@ class BarSizes : public ConfigObject { CONFIG_PROPERTY(int, kbLayoutWidth, 320) public: - explicit BarSizes(QObject* parent = nullptr) + explicit BarTokens(QObject* parent = nullptr) : ConfigObject(parent) {} }; -class AdvancedDashboard : public ConfigObject { +class DashboardTokens : public ConfigObject { Q_OBJECT QML_ANONYMOUS @@ -157,53 +157,26 @@ class AdvancedDashboard : public ConfigObject { CONFIG_PROPERTY(bool, showMedia, true) CONFIG_PROPERTY(bool, showPerformance, true) CONFIG_PROPERTY(bool, showWeather, true) - - Q_PROPERTY(int tabIndicatorHeight READ tabIndicatorHeight CONSTANT) - Q_PROPERTY(int tabIndicatorSpacing READ tabIndicatorSpacing CONSTANT) - Q_PROPERTY(int infoWidth READ infoWidth CONSTANT) - Q_PROPERTY(int infoIconSize READ infoIconSize CONSTANT) - Q_PROPERTY(int dateTimeWidth READ dateTimeWidth CONSTANT) - Q_PROPERTY(int mediaWidth READ mediaWidth CONSTANT) - Q_PROPERTY(int mediaProgressSweep READ mediaProgressSweep CONSTANT) - Q_PROPERTY(int mediaProgressThickness READ mediaProgressThickness CONSTANT) - Q_PROPERTY(int resourceProgessThickness READ resourceProgessThickness CONSTANT) - Q_PROPERTY(int weatherWidth READ weatherWidth CONSTANT) - Q_PROPERTY(int mediaCoverArtSize READ mediaCoverArtSize CONSTANT) - Q_PROPERTY(int mediaVisualiserSize READ mediaVisualiserSize CONSTANT) - Q_PROPERTY(int resourceSize READ resourceSize CONSTANT) + CONFIG_PROPERTY(int, tabIndicatorHeight, 3) + CONFIG_PROPERTY(int, tabIndicatorSpacing, 5) + CONFIG_PROPERTY(int, infoWidth, 200) + CONFIG_PROPERTY(int, infoIconSize, 25) + CONFIG_PROPERTY(int, dateTimeWidth, 110) + CONFIG_PROPERTY(int, mediaWidth, 200) + CONFIG_PROPERTY(int, mediaProgressSweep, 180) + CONFIG_PROPERTY(int, mediaProgressThickness, 8) + CONFIG_PROPERTY(int, resourceProgressThickness, 10) + CONFIG_PROPERTY(int, weatherWidth, 250) + CONFIG_PROPERTY(int, mediaCoverArtSize, 150) + CONFIG_PROPERTY(int, mediaVisualiserSize, 80) + CONFIG_PROPERTY(int, resourceSize, 200) public: - explicit AdvancedDashboard(QObject* parent = nullptr) + explicit DashboardTokens(QObject* parent = nullptr) : ConfigObject(parent) {} - - [[nodiscard]] static int tabIndicatorHeight() { return 3; } - - [[nodiscard]] static int tabIndicatorSpacing() { return 5; } - - [[nodiscard]] static int infoWidth() { return 200; } - - [[nodiscard]] static int infoIconSize() { return 25; } - - [[nodiscard]] static int dateTimeWidth() { return 110; } - - [[nodiscard]] static int mediaWidth() { return 200; } - - [[nodiscard]] static int mediaProgressSweep() { return 180; } - - [[nodiscard]] static int mediaProgressThickness() { return 8; } - - [[nodiscard]] static int resourceProgessThickness() { return 10; } - - [[nodiscard]] static int weatherWidth() { return 250; } - - [[nodiscard]] static int mediaCoverArtSize() { return 150; } - - [[nodiscard]] static int mediaVisualiserSize() { return 80; } - - [[nodiscard]] static int resourceSize() { return 200; } }; -class LauncherSizes : public ConfigObject { +class LauncherTokens : public ConfigObject { Q_OBJECT QML_ANONYMOUS @@ -213,11 +186,11 @@ class LauncherSizes : public ConfigObject { CONFIG_PROPERTY(int, wallpaperHeight, 200) public: - explicit LauncherSizes(QObject* parent = nullptr) + explicit LauncherTokens(QObject* parent = nullptr) : ConfigObject(parent) {} }; -class NotifsSizes : public ConfigObject { +class NotifsTokens : public ConfigObject { Q_OBJECT QML_ANONYMOUS @@ -226,11 +199,11 @@ class NotifsSizes : public ConfigObject { CONFIG_PROPERTY(int, badge, 20) public: - explicit NotifsSizes(QObject* parent = nullptr) + explicit NotifsTokens(QObject* parent = nullptr) : ConfigObject(parent) {} }; -class OsdSizes : public ConfigObject { +class OsdTokens : public ConfigObject { Q_OBJECT QML_ANONYMOUS @@ -238,33 +211,33 @@ class OsdSizes : public ConfigObject { CONFIG_PROPERTY(int, sliderHeight, 150) public: - explicit OsdSizes(QObject* parent = nullptr) + explicit OsdTokens(QObject* parent = nullptr) : ConfigObject(parent) {} }; -class SessionSizes : public ConfigObject { +class SessionTokens : public ConfigObject { Q_OBJECT QML_ANONYMOUS CONFIG_PROPERTY(int, button, 80) public: - explicit SessionSizes(QObject* parent = nullptr) + explicit SessionTokens(QObject* parent = nullptr) : ConfigObject(parent) {} }; -class SidebarSizes : public ConfigObject { +class SidebarTokens : public ConfigObject { Q_OBJECT QML_ANONYMOUS CONFIG_PROPERTY(int, width, 430) public: - explicit SidebarSizes(QObject* parent = nullptr) + explicit SidebarTokens(QObject* parent = nullptr) : ConfigObject(parent) {} }; -class UtilitiesSizes : public ConfigObject { +class UtilitiesTokens : public ConfigObject { Q_OBJECT QML_ANONYMOUS @@ -272,11 +245,11 @@ class UtilitiesSizes : public ConfigObject { CONFIG_PROPERTY(int, toastWidth, 430) public: - explicit UtilitiesSizes(QObject* parent = nullptr) + explicit UtilitiesTokens(QObject* parent = nullptr) : ConfigObject(parent) {} }; -class LockSizes : public ConfigObject { +class LockTokens : public ConfigObject { Q_OBJECT QML_ANONYMOUS @@ -285,11 +258,11 @@ class LockSizes : public ConfigObject { CONFIG_PROPERTY(int, centerWidth, 600) public: - explicit LockSizes(QObject* parent = nullptr) + explicit LockTokens(QObject* parent = nullptr) : ConfigObject(parent) {} }; -class WInfoSizes : public ConfigObject { +class WInfoTokens : public ConfigObject { Q_OBJECT QML_ANONYMOUS @@ -297,11 +270,11 @@ class WInfoSizes : public ConfigObject { CONFIG_PROPERTY(qreal, detailsWidth, 500) public: - explicit WInfoSizes(QObject* parent = nullptr) + explicit WInfoTokens(QObject* parent = nullptr) : ConfigObject(parent) {} }; -class ControlCenterSizes : public ConfigObject { +class ControlCenterTokens : public ConfigObject { Q_OBJECT QML_ANONYMOUS @@ -309,42 +282,42 @@ class ControlCenterSizes : public ConfigObject { CONFIG_PROPERTY(qreal, ratio, 16.0 / 9.0) public: - explicit ControlCenterSizes(QObject* parent = nullptr) + explicit ControlCenterTokens(QObject* parent = nullptr) : ConfigObject(parent) {} }; -class AdvancedConfig : public ConfigObject { +class TokenConfig : public ConfigObject { Q_OBJECT QML_ANONYMOUS - CONFIG_SUBOBJECT(AdvancedAppearance, appearance) - CONFIG_SUBOBJECT(BarSizes, bar) - CONFIG_SUBOBJECT(AdvancedDashboard, dashboard) - CONFIG_SUBOBJECT(LauncherSizes, launcher) - CONFIG_SUBOBJECT(NotifsSizes, notifs) - CONFIG_SUBOBJECT(OsdSizes, osd) - CONFIG_SUBOBJECT(SessionSizes, session) - CONFIG_SUBOBJECT(SidebarSizes, sidebar) - CONFIG_SUBOBJECT(UtilitiesSizes, utilities) - CONFIG_SUBOBJECT(LockSizes, lock) - CONFIG_SUBOBJECT(WInfoSizes, winfo) - CONFIG_SUBOBJECT(ControlCenterSizes, controlCenter) + CONFIG_SUBOBJECT(AppearanceTokens, appearance) + CONFIG_SUBOBJECT(BarTokens, bar) + CONFIG_SUBOBJECT(DashboardTokens, dashboard) + CONFIG_SUBOBJECT(LauncherTokens, launcher) + CONFIG_SUBOBJECT(NotifsTokens, notifs) + CONFIG_SUBOBJECT(OsdTokens, osd) + CONFIG_SUBOBJECT(SessionTokens, session) + CONFIG_SUBOBJECT(SidebarTokens, sidebar) + CONFIG_SUBOBJECT(UtilitiesTokens, utilities) + CONFIG_SUBOBJECT(LockTokens, lock) + CONFIG_SUBOBJECT(WInfoTokens, winfo) + CONFIG_SUBOBJECT(ControlCenterTokens, controlCenter) public: - explicit AdvancedConfig(QObject* parent = nullptr) + explicit TokenConfig(QObject* parent = nullptr) : ConfigObject(parent) - , m_appearance(new AdvancedAppearance(this)) - , m_bar(new BarSizes(this)) - , m_dashboard(new AdvancedDashboard(this)) - , m_launcher(new LauncherSizes(this)) - , m_notifs(new NotifsSizes(this)) - , m_osd(new OsdSizes(this)) - , m_session(new SessionSizes(this)) - , m_sidebar(new SidebarSizes(this)) - , m_utilities(new UtilitiesSizes(this)) - , m_lock(new LockSizes(this)) - , m_winfo(new WInfoSizes(this)) - , m_controlCenter(new ControlCenterSizes(this)) {} + , m_appearance(new AppearanceTokens(this)) + , m_bar(new BarTokens(this)) + , m_dashboard(new DashboardTokens(this)) + , m_launcher(new LauncherTokens(this)) + , m_notifs(new NotifsTokens(this)) + , m_osd(new OsdTokens(this)) + , m_session(new SessionTokens(this)) + , m_sidebar(new SidebarTokens(this)) + , m_utilities(new UtilitiesTokens(this)) + , m_lock(new LockTokens(this)) + , m_winfo(new WInfoTokens(this)) + , m_controlCenter(new ControlCenterTokens(this)) {} }; } // namespace caelestia::config From 9f8fd7d660d067c2bedc71b7525e34e68bb63eb0 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 15:36:18 +1000 Subject: [PATCH 07/81] feat: make tokens separate singleton --- plugin/src/Caelestia/Config/CMakeLists.txt | 2 +- .../src/Caelestia/Config/appearanceconfig.cpp | 2 +- plugin/src/Caelestia/Config/config.cpp | 13 +-- plugin/src/Caelestia/Config/config.hpp | 7 -- plugin/src/Caelestia/Config/tokens.cpp | 85 +++++++++++++++++++ .../Config/{tokensconfig.hpp => tokens.hpp} | 39 +++++---- 6 files changed, 112 insertions(+), 36 deletions(-) create mode 100644 plugin/src/Caelestia/Config/tokens.cpp rename plugin/src/Caelestia/Config/{tokensconfig.hpp => tokens.hpp} (92%) diff --git a/plugin/src/Caelestia/Config/CMakeLists.txt b/plugin/src/Caelestia/Config/CMakeLists.txt index b071537f..61f14735 100644 --- a/plugin/src/Caelestia/Config/CMakeLists.txt +++ b/plugin/src/Caelestia/Config/CMakeLists.txt @@ -4,7 +4,7 @@ qml_module(caelestia-config config.cpp configobject.cpp appearanceconfig.cpp - tokensconfig.hpp + tokens.cpp backgroundconfig.hpp barconfig.hpp borderconfig.hpp diff --git a/plugin/src/Caelestia/Config/appearanceconfig.cpp b/plugin/src/Caelestia/Config/appearanceconfig.cpp index 61cb6abe..6f2433aa 100644 --- a/plugin/src/Caelestia/Config/appearanceconfig.cpp +++ b/plugin/src/Caelestia/Config/appearanceconfig.cpp @@ -1,5 +1,5 @@ #include "appearanceconfig.hpp" -#include "tokensconfig.hpp" +#include "tokens.hpp" #include diff --git a/plugin/src/Caelestia/Config/config.cpp b/plugin/src/Caelestia/Config/config.cpp index 0df6447c..f6fb721d 100644 --- a/plugin/src/Caelestia/Config/config.cpp +++ b/plugin/src/Caelestia/Config/config.cpp @@ -33,22 +33,11 @@ GlobalConfig::GlobalConfig(QObject* parent) , m_utilities(new UtilitiesConfig(this)) , m_sidebar(new SidebarConfig(this)) , m_services(new ServiceConfig(this)) - , m_paths(new UserPaths(this)) - , m_tokens(new TokenConfig(this)) { + , m_paths(new UserPaths(this)) { // Set global instance s_instance = this; - // Bind token base values from token config to appearance computed properties - auto* appearance = m_tokens->appearance(); - m_appearance->rounding()->bindTokens(appearance->rounding()); - m_appearance->spacing()->bindTokens(appearance->spacing()); - m_appearance->padding()->bindTokens(appearance->padding()); - m_appearance->font()->size()->bindTokens(appearance->fontSize()); - m_appearance->anim()->durations()->bindTokens(appearance->animDurations()); - - // Each has its own file backend setupFileBackend(configDir() + QStringLiteral("shell.json")); - m_tokens->setupFileBackend(configDir() + QStringLiteral("shell-tokens.json")); } GlobalConfig::~GlobalConfig() { diff --git a/plugin/src/Caelestia/Config/config.hpp b/plugin/src/Caelestia/Config/config.hpp index 0d0c1692..bd18b7fb 100644 --- a/plugin/src/Caelestia/Config/config.hpp +++ b/plugin/src/Caelestia/Config/config.hpp @@ -17,7 +17,6 @@ #include "serviceconfig.hpp" #include "sessionconfig.hpp" #include "sidebarconfig.hpp" -#include "tokensconfig.hpp" #include "userpaths.hpp" #include "utilitiesconfig.hpp" #include "winfoconfig.hpp" @@ -46,15 +45,11 @@ class GlobalConfig : public ConfigObject { CONFIG_SUBOBJECT(SidebarConfig, sidebar) CONFIG_SUBOBJECT(ServiceConfig, services) CONFIG_SUBOBJECT(UserPaths, paths) - // tokens is NOT a CONFIG_SUBOBJECT — it has its own file backend - Q_PROPERTY(TokenConfig* tokens READ tokens CONSTANT) public: static GlobalConfig* instance(); static GlobalConfig* create(QQmlEngine*, QJSEngine*); - [[nodiscard]] TokenConfig* tokens() const { return m_tokens; } - Q_INVOKABLE void save(); Q_INVOKABLE void reload(); @@ -62,8 +57,6 @@ public: private: explicit GlobalConfig(QObject* parent = nullptr); - - TokenConfig* m_tokens = nullptr; }; class Config : public QQuickItem { diff --git a/plugin/src/Caelestia/Config/tokens.cpp b/plugin/src/Caelestia/Config/tokens.cpp new file mode 100644 index 00000000..8c8146b7 --- /dev/null +++ b/plugin/src/Caelestia/Config/tokens.cpp @@ -0,0 +1,85 @@ +#include "tokens.hpp" +#include "config.hpp" + +#include +#include + +namespace caelestia::config { + +namespace { + +TokenConfig* s_instance = nullptr; + +QString configDir() { + return QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + QStringLiteral("/caelestia/"); +} + +} // namespace + +TokenConfig::TokenConfig(QObject* parent) + : ConfigObject(parent) + , m_appearance(new AppearanceTokens(this)) + , m_bar(new BarTokens(this)) + , m_dashboard(new DashboardTokens(this)) + , m_launcher(new LauncherTokens(this)) + , m_notifs(new NotifsTokens(this)) + , m_osd(new OsdTokens(this)) + , m_session(new SessionTokens(this)) + , m_sidebar(new SidebarTokens(this)) + , m_utilities(new UtilitiesTokens(this)) + , m_lock(new LockTokens(this)) + , m_winfo(new WInfoTokens(this)) + , m_controlCenter(new ControlCenterTokens(this)) { + s_instance = this; + + // Bind token base values to GlobalConfig appearance computed properties + if (auto* global = GlobalConfig::instance()) { + auto* appearanceConfig = global->appearance(); + appearanceConfig->rounding()->bindTokens(m_appearance->rounding()); + appearanceConfig->spacing()->bindTokens(m_appearance->spacing()); + appearanceConfig->padding()->bindTokens(m_appearance->padding()); + appearanceConfig->font()->size()->bindTokens(m_appearance->fontSize()); + appearanceConfig->anim()->durations()->bindTokens(m_appearance->animDurations()); + } + + setupFileBackend(configDir() + QStringLiteral("shell-tokens.json")); +} + +TokenConfig::~TokenConfig() { + s_instance = nullptr; +} + +TokenConfig* TokenConfig::instance() { + return s_instance; +} + +TokenConfig* TokenConfig::create(QQmlEngine* engine, QJSEngine*) { + return new TokenConfig(engine); +} + +void TokenConfig::save() { + saveToFile(); +} + +void TokenConfig::reload() { + reloadFromFile(); +} + +// Tokens (attached type) + +Tokens::Tokens(QQuickItem* parent) + : QQuickItem(parent) {} + +Tokens* Tokens::qmlAttachedProperties(QObject* object) { + auto* item = qobject_cast(object); + + while (item) { + if (auto* tokens = qobject_cast(item)) + return tokens; + item = item->parentItem(); + } + + return nullptr; +} + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/tokensconfig.hpp b/plugin/src/Caelestia/Config/tokens.hpp similarity index 92% rename from plugin/src/Caelestia/Config/tokensconfig.hpp rename to plugin/src/Caelestia/Config/tokens.hpp index f3f48153..d94f173f 100644 --- a/plugin/src/Caelestia/Config/tokensconfig.hpp +++ b/plugin/src/Caelestia/Config/tokens.hpp @@ -3,6 +3,7 @@ #include "configobject.hpp" #include +#include namespace caelestia::config { @@ -288,7 +289,8 @@ public: class TokenConfig : public ConfigObject { Q_OBJECT - QML_ANONYMOUS + QML_ELEMENT + QML_SINGLETON CONFIG_SUBOBJECT(AppearanceTokens, appearance) CONFIG_SUBOBJECT(BarTokens, bar) @@ -304,20 +306,27 @@ class TokenConfig : public ConfigObject { CONFIG_SUBOBJECT(ControlCenterTokens, controlCenter) public: - explicit TokenConfig(QObject* parent = nullptr) - : ConfigObject(parent) - , m_appearance(new AppearanceTokens(this)) - , m_bar(new BarTokens(this)) - , m_dashboard(new DashboardTokens(this)) - , m_launcher(new LauncherTokens(this)) - , m_notifs(new NotifsTokens(this)) - , m_osd(new OsdTokens(this)) - , m_session(new SessionTokens(this)) - , m_sidebar(new SidebarTokens(this)) - , m_utilities(new UtilitiesTokens(this)) - , m_lock(new LockTokens(this)) - , m_winfo(new WInfoTokens(this)) - , m_controlCenter(new ControlCenterTokens(this)) {} + static TokenConfig* instance(); + static TokenConfig* create(QQmlEngine*, QJSEngine*); + + Q_INVOKABLE void save(); + Q_INVOKABLE void reload(); + + ~TokenConfig() override; + +private: + explicit TokenConfig(QObject* parent = nullptr); +}; + +class Tokens : public QQuickItem { + Q_OBJECT + QML_ELEMENT + QML_ATTACHED(Tokens) + +public: + explicit Tokens(QQuickItem* parent = nullptr); + + static Tokens* qmlAttachedProperties(QObject* object); }; } // namespace caelestia::config From a932a68a4026c48563d7406fd56c11f4a0177b1a Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 15:40:19 +1000 Subject: [PATCH 08/81] feat: add config scope --- plugin/src/Caelestia/Config/CMakeLists.txt | 1 + plugin/src/Caelestia/Config/config.cpp | 16 +++++----------- plugin/src/Caelestia/Config/config.hpp | 15 +++++++++++---- plugin/src/Caelestia/Config/configscope.cpp | 20 ++++++++++++++++++++ plugin/src/Caelestia/Config/configscope.hpp | 18 ++++++++++++++++++ plugin/src/Caelestia/Config/tokens.cpp | 16 +++++----------- plugin/src/Caelestia/Config/tokens.hpp | 14 +++++++++++--- 7 files changed, 71 insertions(+), 29 deletions(-) create mode 100644 plugin/src/Caelestia/Config/configscope.cpp create mode 100644 plugin/src/Caelestia/Config/configscope.hpp diff --git a/plugin/src/Caelestia/Config/CMakeLists.txt b/plugin/src/Caelestia/Config/CMakeLists.txt index 61f14735..dcaf1e69 100644 --- a/plugin/src/Caelestia/Config/CMakeLists.txt +++ b/plugin/src/Caelestia/Config/CMakeLists.txt @@ -3,6 +3,7 @@ qml_module(caelestia-config SOURCES config.cpp configobject.cpp + configscope.cpp appearanceconfig.cpp tokens.cpp backgroundconfig.hpp diff --git a/plugin/src/Caelestia/Config/config.cpp b/plugin/src/Caelestia/Config/config.cpp index f6fb721d..0a71fdc9 100644 --- a/plugin/src/Caelestia/Config/config.cpp +++ b/plugin/src/Caelestia/Config/config.cpp @@ -1,4 +1,5 @@ #include "config.hpp" +#include "configscope.hpp" #include #include @@ -64,19 +65,12 @@ void GlobalConfig::reload() { // Config (attached type) -Config::Config(QQuickItem* parent) - : QQuickItem(parent) {} +Config::Config(ConfigScope* scope, QObject* parent) + : QObject(parent) + , m_scope(scope) {} Config* Config::qmlAttachedProperties(QObject* object) { - auto* item = qobject_cast(object); - - while (item) { - if (auto* config = qobject_cast(item)) - return config; - item = item->parentItem(); - } - - return nullptr; + return new Config(ConfigScope::find(object), object); } } // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/config.hpp b/plugin/src/Caelestia/Config/config.hpp index bd18b7fb..2f5fd570 100644 --- a/plugin/src/Caelestia/Config/config.hpp +++ b/plugin/src/Caelestia/Config/config.hpp @@ -1,7 +1,6 @@ #pragma once -#include -#include +#include #include "appearanceconfig.hpp" #include "backgroundconfig.hpp" @@ -59,15 +58,23 @@ private: explicit GlobalConfig(QObject* parent = nullptr); }; -class Config : public QQuickItem { +class ConfigScope; + +class Config : public QObject { Q_OBJECT QML_ELEMENT + QML_UNCREATABLE("") QML_ATTACHED(Config) public: - explicit Config(QQuickItem* parent = nullptr); + explicit Config(ConfigScope* scope, QObject* parent = nullptr); + + [[nodiscard]] ConfigScope* scope() const { return m_scope; } static Config* qmlAttachedProperties(QObject* object); + +private: + ConfigScope* m_scope; }; } // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/configscope.cpp b/plugin/src/Caelestia/Config/configscope.cpp new file mode 100644 index 00000000..e7e8452b --- /dev/null +++ b/plugin/src/Caelestia/Config/configscope.cpp @@ -0,0 +1,20 @@ +#include "configscope.hpp" + +namespace caelestia::config { + +ConfigScope::ConfigScope(QQuickItem* parent) + : QQuickItem(parent) {} + +ConfigScope* ConfigScope::find(QObject* object) { + auto* item = qobject_cast(object); + + while (item) { + if (auto* scope = qobject_cast(item)) + return scope; + item = item->parentItem(); + } + + return nullptr; +} + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/configscope.hpp b/plugin/src/Caelestia/Config/configscope.hpp new file mode 100644 index 00000000..94380c80 --- /dev/null +++ b/plugin/src/Caelestia/Config/configscope.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include +#include + +namespace caelestia::config { + +class ConfigScope : public QQuickItem { + Q_OBJECT + QML_ELEMENT + +public: + explicit ConfigScope(QQuickItem* parent = nullptr); + + static ConfigScope* find(QObject* object); +}; + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/tokens.cpp b/plugin/src/Caelestia/Config/tokens.cpp index 8c8146b7..c81567d6 100644 --- a/plugin/src/Caelestia/Config/tokens.cpp +++ b/plugin/src/Caelestia/Config/tokens.cpp @@ -1,5 +1,6 @@ #include "tokens.hpp" #include "config.hpp" +#include "configscope.hpp" #include #include @@ -67,19 +68,12 @@ void TokenConfig::reload() { // Tokens (attached type) -Tokens::Tokens(QQuickItem* parent) - : QQuickItem(parent) {} +Tokens::Tokens(ConfigScope* scope, QObject* parent) + : QObject(parent) + , m_scope(scope) {} Tokens* Tokens::qmlAttachedProperties(QObject* object) { - auto* item = qobject_cast(object); - - while (item) { - if (auto* tokens = qobject_cast(item)) - return tokens; - item = item->parentItem(); - } - - return nullptr; + return new Tokens(ConfigScope::find(object), object); } } // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/tokens.hpp b/plugin/src/Caelestia/Config/tokens.hpp index d94f173f..a3ea6f69 100644 --- a/plugin/src/Caelestia/Config/tokens.hpp +++ b/plugin/src/Caelestia/Config/tokens.hpp @@ -3,10 +3,12 @@ #include "configobject.hpp" #include -#include +#include namespace caelestia::config { +class ConfigScope; + class AnimCurves : public ConfigObject { Q_OBJECT QML_ANONYMOUS @@ -318,15 +320,21 @@ private: explicit TokenConfig(QObject* parent = nullptr); }; -class Tokens : public QQuickItem { +class Tokens : public QObject { Q_OBJECT QML_ELEMENT + QML_UNCREATABLE("") QML_ATTACHED(Tokens) public: - explicit Tokens(QQuickItem* parent = nullptr); + explicit Tokens(ConfigScope* scope, QObject* parent = nullptr); + + [[nodiscard]] ConfigScope* scope() const { return m_scope; } static Tokens* qmlAttachedProperties(QObject* object); + +private: + ConfigScope* m_scope; }; } // namespace caelestia::config From 71f27bb45fe9c6d7de7411a74063f05596bc2d01 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 18:09:21 +1000 Subject: [PATCH 09/81] feat: add per monitor configs Per monitor configs go in a separate file in the monitor dir, e.g. `monitors//shell.json` --- plugin/src/Caelestia/Config/CMakeLists.txt | 1 + plugin/src/Caelestia/Config/config.cpp | 63 ++++++- plugin/src/Caelestia/Config/config.hpp | 44 +++++ plugin/src/Caelestia/Config/configobject.cpp | 163 +++++++++++++++++- plugin/src/Caelestia/Config/configobject.hpp | 37 +++- plugin/src/Caelestia/Config/configscope.cpp | 32 ++++ plugin/src/Caelestia/Config/configscope.hpp | 28 +++ .../Caelestia/Config/monitorconfigmanager.cpp | 69 ++++++++ .../Caelestia/Config/monitorconfigmanager.hpp | 38 ++++ plugin/src/Caelestia/Config/tokens.cpp | 52 +++++- plugin/src/Caelestia/Config/tokens.hpp | 34 ++++ 11 files changed, 556 insertions(+), 5 deletions(-) create mode 100644 plugin/src/Caelestia/Config/monitorconfigmanager.cpp create mode 100644 plugin/src/Caelestia/Config/monitorconfigmanager.hpp diff --git a/plugin/src/Caelestia/Config/CMakeLists.txt b/plugin/src/Caelestia/Config/CMakeLists.txt index dcaf1e69..9d8a9d99 100644 --- a/plugin/src/Caelestia/Config/CMakeLists.txt +++ b/plugin/src/Caelestia/Config/CMakeLists.txt @@ -6,6 +6,7 @@ qml_module(caelestia-config configscope.cpp appearanceconfig.cpp tokens.cpp + monitorconfigmanager.cpp backgroundconfig.hpp barconfig.hpp borderconfig.hpp diff --git a/plugin/src/Caelestia/Config/config.cpp b/plugin/src/Caelestia/Config/config.cpp index 0a71fdc9..345655ec 100644 --- a/plugin/src/Caelestia/Config/config.cpp +++ b/plugin/src/Caelestia/Config/config.cpp @@ -41,6 +41,30 @@ GlobalConfig::GlobalConfig(QObject* parent) setupFileBackend(configDir() + QStringLiteral("shell.json")); } +GlobalConfig::GlobalConfig(GlobalConfig* fallback, const QString& filePath, QObject* parent) + : ConfigObject(parent) + , m_appearance(new AppearanceConfig(this)) + , m_general(new GeneralConfig(this)) + , m_background(new BackgroundConfig(this)) + , m_bar(new BarConfig(this)) + , m_border(new BorderConfig(this)) + , m_dashboard(new DashboardConfig(this)) + , m_controlCenter(new ControlCenterConfig(this)) + , m_launcher(new LauncherConfig(this)) + , m_notifs(new NotifsConfig(this)) + , m_osd(new OsdConfig(this)) + , m_session(new SessionConfig(this)) + , m_winfo(new WInfoConfig(this)) + , m_lock(new LockConfig(this)) + , m_utilities(new UtilitiesConfig(this)) + , m_sidebar(new SidebarConfig(this)) + , m_services(new ServiceConfig(this)) + , m_paths(new UserPaths(this)) { + setSparse(true); + setupFileBackend(filePath); + syncFromGlobal(fallback); +} + GlobalConfig::~GlobalConfig() { // Clear global instance s_instance = nullptr; @@ -67,7 +91,44 @@ void GlobalConfig::reload() { Config::Config(ConfigScope* scope, QObject* parent) : QObject(parent) - , m_scope(scope) {} + , m_scope(scope) { + connectScope(); +} + +void Config::connectScope() { + if (!m_scope) + return; + connect(m_scope, &ConfigScope::configChanged, this, &Config::sourceChanged); + connect(m_scope, &ConfigScope::tokensChanged, this, &Config::sourceChanged); +} + +// Helper: return per-monitor sub-object if scope exists, otherwise global +#define CONFIG_ATTACHED_GETTER(Type, name) \ + const Type* Config::name() const { \ + if (m_scope && m_scope->config()) \ + return m_scope->config()->name(); \ + return GlobalConfig::instance()->name(); \ + } + +CONFIG_ATTACHED_GETTER(AppearanceConfig, appearance) +CONFIG_ATTACHED_GETTER(GeneralConfig, general) +CONFIG_ATTACHED_GETTER(BackgroundConfig, background) +CONFIG_ATTACHED_GETTER(BarConfig, bar) +CONFIG_ATTACHED_GETTER(BorderConfig, border) +CONFIG_ATTACHED_GETTER(DashboardConfig, dashboard) +CONFIG_ATTACHED_GETTER(ControlCenterConfig, controlCenter) +CONFIG_ATTACHED_GETTER(LauncherConfig, launcher) +CONFIG_ATTACHED_GETTER(NotifsConfig, notifs) +CONFIG_ATTACHED_GETTER(OsdConfig, osd) +CONFIG_ATTACHED_GETTER(SessionConfig, session) +CONFIG_ATTACHED_GETTER(WInfoConfig, winfo) +CONFIG_ATTACHED_GETTER(LockConfig, lock) +CONFIG_ATTACHED_GETTER(UtilitiesConfig, utilities) +CONFIG_ATTACHED_GETTER(SidebarConfig, sidebar) +CONFIG_ATTACHED_GETTER(ServiceConfig, services) +CONFIG_ATTACHED_GETTER(UserPaths, paths) + +#undef CONFIG_ATTACHED_GETTER Config* Config::qmlAttachedProperties(QObject* object) { return new Config(ConfigScope::find(object), object); diff --git a/plugin/src/Caelestia/Config/config.hpp b/plugin/src/Caelestia/Config/config.hpp index 2f5fd570..f74c30b2 100644 --- a/plugin/src/Caelestia/Config/config.hpp +++ b/plugin/src/Caelestia/Config/config.hpp @@ -55,25 +55,69 @@ public: ~GlobalConfig() override; private: + friend class MonitorConfigManager; explicit GlobalConfig(QObject* parent = nullptr); + explicit GlobalConfig(GlobalConfig* fallback, const QString& filePath, QObject* parent); }; class ConfigScope; class Config : public QObject { Q_OBJECT + Q_MOC_INCLUDE("configscope.hpp") QML_ELEMENT QML_UNCREATABLE("") QML_ATTACHED(Config) + Q_PROPERTY(ConfigScope* scope READ scope NOTIFY sourceChanged) + Q_PROPERTY(const AppearanceConfig* appearance READ appearance NOTIFY sourceChanged) + Q_PROPERTY(const GeneralConfig* general READ general NOTIFY sourceChanged) + Q_PROPERTY(const BackgroundConfig* background READ background NOTIFY sourceChanged) + Q_PROPERTY(const BarConfig* bar READ bar NOTIFY sourceChanged) + Q_PROPERTY(const BorderConfig* border READ border NOTIFY sourceChanged) + Q_PROPERTY(const DashboardConfig* dashboard READ dashboard NOTIFY sourceChanged) + Q_PROPERTY(const ControlCenterConfig* controlCenter READ controlCenter NOTIFY sourceChanged) + Q_PROPERTY(const LauncherConfig* launcher READ launcher NOTIFY sourceChanged) + Q_PROPERTY(const NotifsConfig* notifs READ notifs NOTIFY sourceChanged) + Q_PROPERTY(const OsdConfig* osd READ osd NOTIFY sourceChanged) + Q_PROPERTY(const SessionConfig* session READ session NOTIFY sourceChanged) + Q_PROPERTY(const WInfoConfig* winfo READ winfo NOTIFY sourceChanged) + Q_PROPERTY(const LockConfig* lock READ lock NOTIFY sourceChanged) + Q_PROPERTY(const UtilitiesConfig* utilities READ utilities NOTIFY sourceChanged) + Q_PROPERTY(const SidebarConfig* sidebar READ sidebar NOTIFY sourceChanged) + Q_PROPERTY(const ServiceConfig* services READ services NOTIFY sourceChanged) + Q_PROPERTY(const UserPaths* paths READ paths NOTIFY sourceChanged) + public: explicit Config(ConfigScope* scope, QObject* parent = nullptr); [[nodiscard]] ConfigScope* scope() const { return m_scope; } + [[nodiscard]] const AppearanceConfig* appearance() const; + [[nodiscard]] const GeneralConfig* general() const; + [[nodiscard]] const BackgroundConfig* background() const; + [[nodiscard]] const BarConfig* bar() const; + [[nodiscard]] const BorderConfig* border() const; + [[nodiscard]] const DashboardConfig* dashboard() const; + [[nodiscard]] const ControlCenterConfig* controlCenter() const; + [[nodiscard]] const LauncherConfig* launcher() const; + [[nodiscard]] const NotifsConfig* notifs() const; + [[nodiscard]] const OsdConfig* osd() const; + [[nodiscard]] const SessionConfig* session() const; + [[nodiscard]] const WInfoConfig* winfo() const; + [[nodiscard]] const LockConfig* lock() const; + [[nodiscard]] const UtilitiesConfig* utilities() const; + [[nodiscard]] const SidebarConfig* sidebar() const; + [[nodiscard]] const ServiceConfig* services() const; + [[nodiscard]] const UserPaths* paths() const; + static Config* qmlAttachedProperties(QObject* object); + Q_SIGNAL void sourceChanged(); + private: + void connectScope(); + ConfigScope* m_scope; }; diff --git a/plugin/src/Caelestia/Config/configobject.cpp b/plugin/src/Caelestia/Config/configobject.cpp index cb6624a1..3682a00f 100644 --- a/plugin/src/Caelestia/Config/configobject.cpp +++ b/plugin/src/Caelestia/Config/configobject.cpp @@ -50,11 +50,13 @@ void ConfigObject::loadFromJson(const QJsonObject& obj) { for (const auto& v : jsonArr) list.append(v.toString()); prop.write(this, QVariant::fromValue(list)); + m_loadedKeys.insert(key); continue; } // For all other types, let Qt's variant conversion handle it prop.write(this, jsonVal.toVariant()); + m_loadedKeys.insert(key); } } @@ -108,6 +110,159 @@ QJsonObject ConfigObject::toJsonObject() const { return obj; } +QJsonObject ConfigObject::toSparseJsonObject() const { + QJsonObject obj; + const auto* meta = metaObject(); + + for (int i = meta->propertyOffset(); i < meta->propertyCount(); ++i) { + const auto prop = meta->property(i); + + if (!prop.isReadable()) + continue; + + const auto key = QString::fromUtf8(prop.name()); + const auto value = prop.read(this); + + // Recurse into sub-objects — include only if they have loaded keys + if (value.canView()) { + auto* const subObj = value.value(); + if (subObj) { + auto subJson = subObj->toSparseJsonObject(); + if (!subJson.isEmpty()) + obj.insert(key, subJson); + } + continue; + } + + // Only include properties that were explicitly loaded + if (!m_loadedKeys.contains(key)) + continue; + + if (!prop.isWritable()) + continue; + + if (prop.metaType().id() == QMetaType::QStringList) { + QJsonArray arr; + const auto strList = value.toStringList(); + for (const auto& s : strList) + arr.append(s); + obj.insert(key, arr); + continue; + } + + if (prop.metaType().id() == QMetaType::QVariantList) { + obj.insert(key, QJsonArray::fromVariantList(value.toList())); + continue; + } + + obj.insert(key, QJsonValue::fromVariant(value)); + } + + return obj; +} + +void ConfigObject::clearLoadedKeys() { + m_loadedKeys.clear(); + + const auto* meta = metaObject(); + for (int i = meta->propertyOffset(); i < meta->propertyCount(); ++i) { + auto prop = meta->property(i); + auto value = prop.read(this); + auto* subObj = value.value(); + if (subObj) + subObj->clearLoadedKeys(); + } +} + +void ConfigObject::syncFromGlobal(ConfigObject* global) { + m_global = global; + + // Connect batched change signal (single connection per ConfigObject pair) + connect(global, &ConfigObject::propertiesChanged, this, &ConfigObject::onGlobalPropertiesChanged); + + // Initial sync: copy all non-loaded property values from global + const auto* meta = metaObject(); + for (int i = meta->propertyOffset(); i < meta->propertyCount(); ++i) { + auto prop = meta->property(i); + const auto key = QString::fromUtf8(prop.name()); + + auto current = prop.read(this); + auto* subObj = current.value(); + + if (subObj) { + auto globalVal = prop.read(global); + auto* globalSub = globalVal.value(); + if (globalSub) + subObj->syncFromGlobal(globalSub); + continue; + } + + if (!prop.isWritable()) + continue; + + if (!m_loadedKeys.contains(key)) + prop.write(this, prop.read(global)); + } +} + +void ConfigObject::resyncFromGlobal() { + if (!m_global) + return; + + const auto* meta = metaObject(); + for (int i = meta->propertyOffset(); i < meta->propertyCount(); ++i) { + auto prop = meta->property(i); + const auto key = QString::fromUtf8(prop.name()); + + auto current = prop.read(this); + auto* subObj = current.value(); + + if (subObj) { + subObj->resyncFromGlobal(); + continue; + } + + if (!prop.isWritable()) + continue; + + if (!m_loadedKeys.contains(key)) + prop.write(this, prop.read(m_global)); + } +} + +void ConfigObject::onGlobalPropertiesChanged(const QMap& changed) { + for (auto it = changed.begin(); it != changed.end(); ++it) { + if (m_loadedKeys.contains(it.key())) + continue; + + int idx = metaObject()->indexOfProperty(it.key().toUtf8().constData()); + if (idx >= 0) + metaObject()->property(idx).write(this, it.value()); + } +} + +void ConfigObject::notifyPropertyChanged(const QString& name, const QVariant& value) { + m_pendingChanges.insert(name, value); + + if (!m_batchTimer) { + m_batchTimer = new QTimer(this); + m_batchTimer->setSingleShot(true); + m_batchTimer->setInterval(0); + connect(m_batchTimer, &QTimer::timeout, this, &ConfigObject::emitBatchedChanges); + } + + m_batchTimer->start(); +} + +void ConfigObject::emitBatchedChanges() { + if (m_pendingChanges.isEmpty()) + return; + + auto changes = std::move(m_pendingChanges); + m_pendingChanges.clear(); + Q_EMIT propertiesChanged(changes); +} + void ConfigObject::setupFileBackend(const QString& path) { m_filePath = path; @@ -126,7 +281,8 @@ void ConfigObject::setupFileBackend(const QString& path) { return; } - file.write(QJsonDocument(toJsonObject()).toJson(QJsonDocument::Indented)); + auto json = m_sparse ? toSparseJsonObject() : toJsonObject(); + file.write(QJsonDocument(json).toJson(QJsonDocument::Indented)); }); m_cooldownTimer->setSingleShot(true); @@ -167,7 +323,12 @@ void ConfigObject::reloadFromFile() { return; } + clearLoadedKeys(); loadFromJson(doc.object()); + + // Re-sync non-loaded properties from global after reload + if (m_global) + resyncFromGlobal(); } void ConfigObject::onFileChanged() { diff --git a/plugin/src/Caelestia/Config/configobject.hpp b/plugin/src/Caelestia/Config/configobject.hpp index bc8271a8..91c6c3f4 100644 --- a/plugin/src/Caelestia/Config/configobject.hpp +++ b/plugin/src/Caelestia/Config/configobject.hpp @@ -2,9 +2,12 @@ #include #include +#include #include #include +#include #include +#include // Declares a serialized config property with getter, setter (change-detected), signal, and member. #define CONFIG_PROPERTY(Type, name, ...) \ @@ -15,8 +18,10 @@ public: return m_##name; \ } \ void set_##name(const Type& val) { \ - if (caelestia::config::ConfigObject::updateMember(m_##name, val)) \ + if (caelestia::config::ConfigObject::updateMember(m_##name, val)) { \ Q_EMIT name##Changed(); \ + notifyPropertyChanged(QStringLiteral(#name), QVariant::fromValue(m_##name)); \ + } \ } \ Q_SIGNAL void name##Changed(); \ \ @@ -45,6 +50,7 @@ public: void loadFromJson(const QJsonObject& obj); [[nodiscard]] QJsonObject toJsonObject() const; + [[nodiscard]] QJsonObject toSparseJsonObject() const; // File-backed config support. Call setupFileBackend() to enable // automatic file watching, debounced saving, and reload. @@ -52,6 +58,18 @@ public: void saveToFile(); void reloadFromFile(); + // Per-monitor overlay support (Qt Resolve Mask pattern). + // Eagerly syncs non-overridden properties from a global ConfigObject. + void syncFromGlobal(ConfigObject* global); + void resyncFromGlobal(); + void clearLoadedKeys(); + + [[nodiscard]] bool isPropertyLoaded(const QString& name) const { return m_loadedKeys.contains(name); } + + [[nodiscard]] bool isSparse() const { return m_sparse; } + + void setSparse(bool sparse) { m_sparse = sparse; } + [[nodiscard]] bool recentlySaved() const { return m_recentlySaved; } template static bool updateMember(T& member, const T& value) { @@ -66,15 +84,30 @@ public: return true; } + Q_SIGNAL void propertiesChanged(const QMap& changed); + +protected: + void notifyPropertyChanged(const QString& name, const QVariant& value); + private: void onFileChanged(); + void onGlobalPropertiesChanged(const QMap& changed); + void emitBatchedChanges(); QString m_filePath; bool m_recentlySaved = false; - // These are heap-allocated only when setupFileBackend is called + bool m_sparse = false; + + // File backend (heap-allocated only when setupFileBackend is called) QFileSystemWatcher* m_watcher = nullptr; QTimer* m_saveTimer = nullptr; QTimer* m_cooldownTimer = nullptr; + + // Per-monitor overlay state + ConfigObject* m_global = nullptr; + QSet m_loadedKeys; + QMap m_pendingChanges; + QTimer* m_batchTimer = nullptr; }; } // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/configscope.cpp b/plugin/src/Caelestia/Config/configscope.cpp index e7e8452b..7b2074e3 100644 --- a/plugin/src/Caelestia/Config/configscope.cpp +++ b/plugin/src/Caelestia/Config/configscope.cpp @@ -1,10 +1,42 @@ #include "configscope.hpp" +#include "monitorconfigmanager.hpp" namespace caelestia::config { ConfigScope::ConfigScope(QQuickItem* parent) : QQuickItem(parent) {} +void ConfigScope::setScreen(const QString& screen) { + if (m_screen == screen) + return; + + m_screen = screen; + Q_EMIT screenChanged(); + resolveConfig(); +} + +void ConfigScope::resolveConfig() { + GlobalConfig* newConfig = nullptr; + TokenConfig* newTokens = nullptr; + + if (!m_screen.isEmpty()) { + if (auto* mgr = MonitorConfigManager::instance()) { + newConfig = mgr->configForScreen(m_screen); + newTokens = mgr->tokensForScreen(m_screen); + } + } + + if (m_config != newConfig) { + m_config = newConfig; + Q_EMIT configChanged(); + } + + if (m_tokens != newTokens) { + m_tokens = newTokens; + Q_EMIT tokensChanged(); + } +} + ConfigScope* ConfigScope::find(QObject* object) { auto* item = qobject_cast(object); diff --git a/plugin/src/Caelestia/Config/configscope.hpp b/plugin/src/Caelestia/Config/configscope.hpp index 94380c80..411e9034 100644 --- a/plugin/src/Caelestia/Config/configscope.hpp +++ b/plugin/src/Caelestia/Config/configscope.hpp @@ -5,14 +5,42 @@ namespace caelestia::config { +class GlobalConfig; +class TokenConfig; + class ConfigScope : public QQuickItem { Q_OBJECT + Q_MOC_INCLUDE("config.hpp") + Q_MOC_INCLUDE("tokens.hpp") QML_ELEMENT + Q_PROPERTY(QString screen READ screen WRITE setScreen NOTIFY screenChanged) + Q_PROPERTY(GlobalConfig* config READ config NOTIFY configChanged) + Q_PROPERTY(TokenConfig* tokens READ tokens NOTIFY tokensChanged) + public: explicit ConfigScope(QQuickItem* parent = nullptr); + [[nodiscard]] QString screen() const { return m_screen; } + + void setScreen(const QString& screen); + + [[nodiscard]] GlobalConfig* config() const { return m_config; } + + [[nodiscard]] TokenConfig* tokens() const { return m_tokens; } + static ConfigScope* find(QObject* object); + + Q_SIGNAL void screenChanged(); + Q_SIGNAL void configChanged(); + Q_SIGNAL void tokensChanged(); + +private: + void resolveConfig(); + + QString m_screen; + GlobalConfig* m_config = nullptr; + TokenConfig* m_tokens = nullptr; }; } // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/monitorconfigmanager.cpp b/plugin/src/Caelestia/Config/monitorconfigmanager.cpp new file mode 100644 index 00000000..d8b0561c --- /dev/null +++ b/plugin/src/Caelestia/Config/monitorconfigmanager.cpp @@ -0,0 +1,69 @@ +#include "monitorconfigmanager.hpp" +#include "config.hpp" +#include "tokens.hpp" + +#include + +namespace caelestia::config { + +MonitorConfigManager* MonitorConfigManager::s_instance = nullptr; + +namespace { + +QString monitorConfigDir(const QString& screen) { + return QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + + QStringLiteral("/caelestia/monitors/") + screen + QStringLiteral("/"); +} + +} // namespace + +MonitorConfigManager::MonitorConfigManager(QObject* parent) + : QObject(parent) { + s_instance = this; +} + +MonitorConfigManager::~MonitorConfigManager() { + s_instance = nullptr; +} + +MonitorConfigManager* MonitorConfigManager::instance() { + return s_instance; +} + +MonitorConfigManager* MonitorConfigManager::create(QQmlEngine* engine, QJSEngine*) { + return new MonitorConfigManager(engine); +} + +GlobalConfig* MonitorConfigManager::configForScreen(const QString& screen) { + auto it = m_overlays.find(screen); + if (it != m_overlays.end() && it->config) + return it->config; + + auto* global = GlobalConfig::instance(); + if (!global) + return nullptr; + + auto dir = monitorConfigDir(screen); + auto* overlay = new GlobalConfig(global, dir + QStringLiteral("shell.json"), this); + + m_overlays[screen].config = overlay; + return overlay; +} + +TokenConfig* MonitorConfigManager::tokensForScreen(const QString& screen) { + auto it = m_overlays.find(screen); + if (it != m_overlays.end() && it->tokens) + return it->tokens; + + auto* global = TokenConfig::instance(); + if (!global) + return nullptr; + + auto dir = monitorConfigDir(screen); + auto* overlay = new TokenConfig(global, dir + QStringLiteral("shell-tokens.json"), this); + + m_overlays[screen].tokens = overlay; + return overlay; +} + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/monitorconfigmanager.hpp b/plugin/src/Caelestia/Config/monitorconfigmanager.hpp new file mode 100644 index 00000000..2741b732 --- /dev/null +++ b/plugin/src/Caelestia/Config/monitorconfigmanager.hpp @@ -0,0 +1,38 @@ +#pragma once + +#include +#include +#include + +namespace caelestia::config { + +class GlobalConfig; +class TokenConfig; + +class MonitorConfigManager : public QObject { + Q_OBJECT + QML_ELEMENT + QML_SINGLETON + +public: + static MonitorConfigManager* instance(); + static MonitorConfigManager* create(QQmlEngine*, QJSEngine*); + + [[nodiscard]] Q_INVOKABLE GlobalConfig* configForScreen(const QString& screen); + [[nodiscard]] Q_INVOKABLE TokenConfig* tokensForScreen(const QString& screen); + + ~MonitorConfigManager() override; + +private: + explicit MonitorConfigManager(QObject* parent = nullptr); + + struct ScreenOverlay { + GlobalConfig* config = nullptr; + TokenConfig* tokens = nullptr; + }; + + QHash m_overlays; + static MonitorConfigManager* s_instance; +}; + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/tokens.cpp b/plugin/src/Caelestia/Config/tokens.cpp index c81567d6..8aab816e 100644 --- a/plugin/src/Caelestia/Config/tokens.cpp +++ b/plugin/src/Caelestia/Config/tokens.cpp @@ -46,6 +46,25 @@ TokenConfig::TokenConfig(QObject* parent) setupFileBackend(configDir() + QStringLiteral("shell-tokens.json")); } +TokenConfig::TokenConfig(TokenConfig* fallback, const QString& filePath, QObject* parent) + : ConfigObject(parent) + , m_appearance(new AppearanceTokens(this)) + , m_bar(new BarTokens(this)) + , m_dashboard(new DashboardTokens(this)) + , m_launcher(new LauncherTokens(this)) + , m_notifs(new NotifsTokens(this)) + , m_osd(new OsdTokens(this)) + , m_session(new SessionTokens(this)) + , m_sidebar(new SidebarTokens(this)) + , m_utilities(new UtilitiesTokens(this)) + , m_lock(new LockTokens(this)) + , m_winfo(new WInfoTokens(this)) + , m_controlCenter(new ControlCenterTokens(this)) { + setSparse(true); + setupFileBackend(filePath); + syncFromGlobal(fallback); +} + TokenConfig::~TokenConfig() { s_instance = nullptr; } @@ -70,7 +89,38 @@ void TokenConfig::reload() { Tokens::Tokens(ConfigScope* scope, QObject* parent) : QObject(parent) - , m_scope(scope) {} + , m_scope(scope) { + connectScope(); +} + +void Tokens::connectScope() { + if (!m_scope) + return; + connect(m_scope, &ConfigScope::tokensChanged, this, &Tokens::sourceChanged); + connect(m_scope, &ConfigScope::configChanged, this, &Tokens::sourceChanged); +} + +#define TOKENS_ATTACHED_GETTER(Type, name) \ + const Type* Tokens::name() const { \ + if (m_scope && m_scope->tokens()) \ + return m_scope->tokens()->name(); \ + return TokenConfig::instance()->name(); \ + } + +TOKENS_ATTACHED_GETTER(AppearanceTokens, appearance) +TOKENS_ATTACHED_GETTER(BarTokens, bar) +TOKENS_ATTACHED_GETTER(DashboardTokens, dashboard) +TOKENS_ATTACHED_GETTER(LauncherTokens, launcher) +TOKENS_ATTACHED_GETTER(NotifsTokens, notifs) +TOKENS_ATTACHED_GETTER(OsdTokens, osd) +TOKENS_ATTACHED_GETTER(SessionTokens, session) +TOKENS_ATTACHED_GETTER(SidebarTokens, sidebar) +TOKENS_ATTACHED_GETTER(UtilitiesTokens, utilities) +TOKENS_ATTACHED_GETTER(LockTokens, lock) +TOKENS_ATTACHED_GETTER(WInfoTokens, winfo) +TOKENS_ATTACHED_GETTER(ControlCenterTokens, controlCenter) + +#undef TOKENS_ATTACHED_GETTER Tokens* Tokens::qmlAttachedProperties(QObject* object) { return new Tokens(ConfigScope::find(object), object); diff --git a/plugin/src/Caelestia/Config/tokens.hpp b/plugin/src/Caelestia/Config/tokens.hpp index a3ea6f69..9ab1ddc3 100644 --- a/plugin/src/Caelestia/Config/tokens.hpp +++ b/plugin/src/Caelestia/Config/tokens.hpp @@ -317,23 +317,57 @@ public: ~TokenConfig() override; private: + friend class MonitorConfigManager; explicit TokenConfig(QObject* parent = nullptr); + explicit TokenConfig(TokenConfig* fallback, const QString& filePath, QObject* parent); }; class Tokens : public QObject { Q_OBJECT + Q_MOC_INCLUDE("configscope.hpp") QML_ELEMENT QML_UNCREATABLE("") QML_ATTACHED(Tokens) + Q_PROPERTY(ConfigScope* scope READ scope NOTIFY sourceChanged) + Q_PROPERTY(const AppearanceTokens* appearance READ appearance NOTIFY sourceChanged) + Q_PROPERTY(const BarTokens* bar READ bar NOTIFY sourceChanged) + Q_PROPERTY(const DashboardTokens* dashboard READ dashboard NOTIFY sourceChanged) + Q_PROPERTY(const LauncherTokens* launcher READ launcher NOTIFY sourceChanged) + Q_PROPERTY(const NotifsTokens* notifs READ notifs NOTIFY sourceChanged) + Q_PROPERTY(const OsdTokens* osd READ osd NOTIFY sourceChanged) + Q_PROPERTY(const SessionTokens* session READ session NOTIFY sourceChanged) + Q_PROPERTY(const SidebarTokens* sidebar READ sidebar NOTIFY sourceChanged) + Q_PROPERTY(const UtilitiesTokens* utilities READ utilities NOTIFY sourceChanged) + Q_PROPERTY(const LockTokens* lock READ lock NOTIFY sourceChanged) + Q_PROPERTY(const WInfoTokens* winfo READ winfo NOTIFY sourceChanged) + Q_PROPERTY(const ControlCenterTokens* controlCenter READ controlCenter NOTIFY sourceChanged) + public: explicit Tokens(ConfigScope* scope, QObject* parent = nullptr); [[nodiscard]] ConfigScope* scope() const { return m_scope; } + [[nodiscard]] const AppearanceTokens* appearance() const; + [[nodiscard]] const BarTokens* bar() const; + [[nodiscard]] const DashboardTokens* dashboard() const; + [[nodiscard]] const LauncherTokens* launcher() const; + [[nodiscard]] const NotifsTokens* notifs() const; + [[nodiscard]] const OsdTokens* osd() const; + [[nodiscard]] const SessionTokens* session() const; + [[nodiscard]] const SidebarTokens* sidebar() const; + [[nodiscard]] const UtilitiesTokens* utilities() const; + [[nodiscard]] const LockTokens* lock() const; + [[nodiscard]] const WInfoTokens* winfo() const; + [[nodiscard]] const ControlCenterTokens* controlCenter() const; + static Tokens* qmlAttachedProperties(QObject* object); + Q_SIGNAL void sourceChanged(); + private: + void connectScope(); + ConfigScope* m_scope; }; From 9a8c5ec7f9a47ca373a51e3360073a94f0e7bac9 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 18:15:59 +1000 Subject: [PATCH 10/81] feat: add debug logging --- plugin/src/Caelestia/Config/configobject.cpp | 32 +++++++++++++++++--- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/plugin/src/Caelestia/Config/configobject.cpp b/plugin/src/Caelestia/Config/configobject.cpp index 3682a00f..6ab8b14f 100644 --- a/plugin/src/Caelestia/Config/configobject.cpp +++ b/plugin/src/Caelestia/Config/configobject.cpp @@ -21,6 +21,9 @@ ConfigObject::ConfigObject(QObject* parent) void ConfigObject::loadFromJson(const QJsonObject& obj) { const auto* meta = metaObject(); + qCDebug(lcConfig) << "Loading JSON into" << meta->className() << "with" << obj.keys().size() + << "keys:" << obj.keys(); + for (int i = meta->propertyOffset(); i < meta->propertyCount(); ++i) { auto prop = meta->property(i); const auto key = QString::fromUtf8(prop.name()); @@ -35,6 +38,7 @@ void ConfigObject::loadFromJson(const QJsonObject& obj) { auto* subObj = current.value(); if (subObj) { + qCDebug(lcConfig) << " Recursing into sub-object" << key; subObj->loadFromJson(jsonVal.toObject()); continue; } @@ -51,12 +55,14 @@ void ConfigObject::loadFromJson(const QJsonObject& obj) { list.append(v.toString()); prop.write(this, QVariant::fromValue(list)); m_loadedKeys.insert(key); + qCDebug(lcConfig) << " Loaded" << key << "=" << list; continue; } // For all other types, let Qt's variant conversion handle it prop.write(this, jsonVal.toVariant()); m_loadedKeys.insert(key); + qCDebug(lcConfig) << " Loaded" << key << "=" << jsonVal.toVariant(); } } @@ -177,11 +183,13 @@ void ConfigObject::clearLoadedKeys() { void ConfigObject::syncFromGlobal(ConfigObject* global) { m_global = global; + const auto* meta = metaObject(); + qCDebug(lcConfig) << "Syncing" << meta->className() << "from global, loaded keys:" << m_loadedKeys; + // Connect batched change signal (single connection per ConfigObject pair) connect(global, &ConfigObject::propertiesChanged, this, &ConfigObject::onGlobalPropertiesChanged); // Initial sync: copy all non-loaded property values from global - const auto* meta = metaObject(); for (int i = meta->propertyOffset(); i < meta->propertyCount(); ++i) { auto prop = meta->property(i); const auto key = QString::fromUtf8(prop.name()); @@ -200,8 +208,13 @@ void ConfigObject::syncFromGlobal(ConfigObject* global) { if (!prop.isWritable()) continue; - if (!m_loadedKeys.contains(key)) - prop.write(this, prop.read(global)); + if (!m_loadedKeys.contains(key)) { + auto val = prop.read(global); + prop.write(this, val); + qCDebug(lcConfig) << " Synced" << key << "=" << val << "from global"; + } else { + qCDebug(lcConfig) << " Keeping loaded" << key << "=" << prop.read(this); + } } } @@ -236,8 +249,11 @@ void ConfigObject::onGlobalPropertiesChanged(const QMap& chan continue; int idx = metaObject()->indexOfProperty(it.key().toUtf8().constData()); - if (idx >= 0) + if (idx >= 0) { metaObject()->property(idx).write(this, it.value()); + qCDebug(lcConfig) << metaObject()->className() << "synced" << it.key() << "=" << it.value() + << "from global change"; + } } } @@ -293,6 +309,8 @@ void ConfigObject::setupFileBackend(const QString& path) { connect(m_watcher, &QFileSystemWatcher::fileChanged, this, &ConfigObject::onFileChanged); + qCDebug(lcConfig) << "Setting up file backend for" << metaObject()->className() << "at" << path; + reloadFromFile(); if (QFile::exists(m_filePath)) @@ -323,12 +341,16 @@ void ConfigObject::reloadFromFile() { return; } + qCDebug(lcConfig) << "Reloading" << metaObject()->className() << "from" << m_filePath; + clearLoadedKeys(); loadFromJson(doc.object()); // Re-sync non-loaded properties from global after reload - if (m_global) + if (m_global) { + qCDebug(lcConfig) << "Re-syncing" << metaObject()->className() << "from global after reload"; resyncFromGlobal(); + } } void ConfigObject::onFileChanged() { From f15b234753787ff05587c93eda58a1fa24ba45a5 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 18:35:05 +1000 Subject: [PATCH 11/81] fix: create tokens singleton when global config is created GlobalConfig depends on TokenConfig to forward properties --- plugin/src/Caelestia/Config/config.cpp | 31 +++++++++++++++++++- plugin/src/Caelestia/Config/config.hpp | 2 ++ plugin/src/Caelestia/Config/configobject.hpp | 3 ++ plugin/src/Caelestia/Config/tokens.cpp | 14 +++------ 4 files changed, 39 insertions(+), 11 deletions(-) diff --git a/plugin/src/Caelestia/Config/config.cpp b/plugin/src/Caelestia/Config/config.cpp index 345655ec..7a8ea1f7 100644 --- a/plugin/src/Caelestia/Config/config.cpp +++ b/plugin/src/Caelestia/Config/config.cpp @@ -1,5 +1,6 @@ #include "config.hpp" #include "configscope.hpp" +#include "tokens.hpp" #include #include @@ -39,6 +40,10 @@ GlobalConfig::GlobalConfig(QObject* parent) s_instance = this; setupFileBackend(configDir() + QStringLiteral("shell.json")); + + // If TokenConfig was created before us, bind now + if (TokenConfig::instance()) + bindAppearanceTokens(); } GlobalConfig::GlobalConfig(GlobalConfig* fallback, const QString& filePath, QObject* parent) @@ -74,8 +79,32 @@ GlobalConfig* GlobalConfig::instance() { return s_instance; } -GlobalConfig* GlobalConfig::create(QQmlEngine* engine, QJSEngine*) { +void GlobalConfig::bindAppearanceTokens() { + auto* tokens = TokenConfig::instance(); + if (!tokens) { + qCDebug(lcConfig) << "GlobalConfig::bindAppearanceTokens: TokenConfig not yet available"; + return; + } + + qCDebug(lcConfig) << "GlobalConfig::bindAppearanceTokens: binding appearance to token values"; + auto* tokenAppearance = tokens->appearance(); + m_appearance->rounding()->bindTokens(tokenAppearance->rounding()); + m_appearance->spacing()->bindTokens(tokenAppearance->spacing()); + m_appearance->padding()->bindTokens(tokenAppearance->padding()); + m_appearance->font()->size()->bindTokens(tokenAppearance->fontSize()); + m_appearance->anim()->durations()->bindTokens(tokenAppearance->animDurations()); +} + +GlobalConfig* GlobalConfig::create(QQmlEngine* engine, QJSEngine* jsEngine) { auto* config = new GlobalConfig(engine); + + // Ensure TokenConfig is created — appearance computed properties depend on token binding. + if (!TokenConfig::instance()) + TokenConfig::create(engine, jsEngine); + + // Bind now that both singletons exist + config->bindAppearanceTokens(); + return config; } diff --git a/plugin/src/Caelestia/Config/config.hpp b/plugin/src/Caelestia/Config/config.hpp index f74c30b2..2df63a03 100644 --- a/plugin/src/Caelestia/Config/config.hpp +++ b/plugin/src/Caelestia/Config/config.hpp @@ -54,6 +54,8 @@ public: ~GlobalConfig() override; + void bindAppearanceTokens(); + private: friend class MonitorConfigManager; explicit GlobalConfig(QObject* parent = nullptr); diff --git a/plugin/src/Caelestia/Config/configobject.hpp b/plugin/src/Caelestia/Config/configobject.hpp index 91c6c3f4..bb56e9c7 100644 --- a/plugin/src/Caelestia/Config/configobject.hpp +++ b/plugin/src/Caelestia/Config/configobject.hpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -42,6 +43,8 @@ private: namespace caelestia::config { +Q_DECLARE_LOGGING_CATEGORY(lcConfig) + class ConfigObject : public QObject { Q_OBJECT diff --git a/plugin/src/Caelestia/Config/tokens.cpp b/plugin/src/Caelestia/Config/tokens.cpp index 8aab816e..e03992a4 100644 --- a/plugin/src/Caelestia/Config/tokens.cpp +++ b/plugin/src/Caelestia/Config/tokens.cpp @@ -33,17 +33,11 @@ TokenConfig::TokenConfig(QObject* parent) , m_controlCenter(new ControlCenterTokens(this)) { s_instance = this; - // Bind token base values to GlobalConfig appearance computed properties - if (auto* global = GlobalConfig::instance()) { - auto* appearanceConfig = global->appearance(); - appearanceConfig->rounding()->bindTokens(m_appearance->rounding()); - appearanceConfig->spacing()->bindTokens(m_appearance->spacing()); - appearanceConfig->padding()->bindTokens(m_appearance->padding()); - appearanceConfig->font()->size()->bindTokens(m_appearance->fontSize()); - appearanceConfig->anim()->durations()->bindTokens(m_appearance->animDurations()); - } - setupFileBackend(configDir() + QStringLiteral("shell-tokens.json")); + + // If GlobalConfig was created before us, trigger its binding + if (auto* global = GlobalConfig::instance()) + global->bindAppearanceTokens(); } TokenConfig::TokenConfig(TokenConfig* fallback, const QString& filePath, QObject* parent) From 08cc492698eaeaddf170275a741b0e8ebf24083d Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 18:36:29 +1000 Subject: [PATCH 12/81] fix: ensure tokens are not bound multiple times --- plugin/src/Caelestia/Config/config.cpp | 4 ++++ plugin/src/Caelestia/Config/config.hpp | 2 ++ 2 files changed, 6 insertions(+) diff --git a/plugin/src/Caelestia/Config/config.cpp b/plugin/src/Caelestia/Config/config.cpp index 7a8ea1f7..16be07a8 100644 --- a/plugin/src/Caelestia/Config/config.cpp +++ b/plugin/src/Caelestia/Config/config.cpp @@ -80,6 +80,9 @@ GlobalConfig* GlobalConfig::instance() { } void GlobalConfig::bindAppearanceTokens() { + if (m_tokensBound) + return; + auto* tokens = TokenConfig::instance(); if (!tokens) { qCDebug(lcConfig) << "GlobalConfig::bindAppearanceTokens: TokenConfig not yet available"; @@ -93,6 +96,7 @@ void GlobalConfig::bindAppearanceTokens() { m_appearance->padding()->bindTokens(tokenAppearance->padding()); m_appearance->font()->size()->bindTokens(tokenAppearance->fontSize()); m_appearance->anim()->durations()->bindTokens(tokenAppearance->animDurations()); + m_tokensBound = true; } GlobalConfig* GlobalConfig::create(QQmlEngine* engine, QJSEngine* jsEngine) { diff --git a/plugin/src/Caelestia/Config/config.hpp b/plugin/src/Caelestia/Config/config.hpp index 2df63a03..888caffc 100644 --- a/plugin/src/Caelestia/Config/config.hpp +++ b/plugin/src/Caelestia/Config/config.hpp @@ -60,6 +60,8 @@ private: friend class MonitorConfigManager; explicit GlobalConfig(QObject* parent = nullptr); explicit GlobalConfig(GlobalConfig* fallback, const QString& filePath, QObject* parent); + + bool m_tokensBound = false; }; class ConfigScope; From a53aff357a6fd16351cc492c5829c6e28fb5ad12 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 18:58:45 +1000 Subject: [PATCH 13/81] feat: expose default configs to qml --- plugin/src/Caelestia/Config/config.cpp | 18 ++++++++++++++---- plugin/src/Caelestia/Config/config.hpp | 4 +++- plugin/src/Caelestia/Config/tokens.cpp | 17 ++++++++++++++--- plugin/src/Caelestia/Config/tokens.hpp | 5 ++++- 4 files changed, 35 insertions(+), 9 deletions(-) diff --git a/plugin/src/Caelestia/Config/config.cpp b/plugin/src/Caelestia/Config/config.cpp index 16be07a8..24cbe9e7 100644 --- a/plugin/src/Caelestia/Config/config.cpp +++ b/plugin/src/Caelestia/Config/config.cpp @@ -66,19 +66,29 @@ GlobalConfig::GlobalConfig(GlobalConfig* fallback, const QString& filePath, QObj , m_services(new ServiceConfig(this)) , m_paths(new UserPaths(this)) { setSparse(true); - setupFileBackend(filePath); - syncFromGlobal(fallback); + if (!filePath.isEmpty()) + setupFileBackend(filePath); + if (fallback) + syncFromGlobal(fallback); } GlobalConfig::~GlobalConfig() { - // Clear global instance - s_instance = nullptr; + if (m_defaults) + m_defaults->deleteLater(); + if (s_instance == this) + s_instance = nullptr; } GlobalConfig* GlobalConfig::instance() { return s_instance; } +GlobalConfig* GlobalConfig::defaults() { + if (!m_defaults) + m_defaults = new GlobalConfig(nullptr, QString()); // Non-singleton constructor + return m_defaults; +} + void GlobalConfig::bindAppearanceTokens() { if (m_tokensBound) return; diff --git a/plugin/src/Caelestia/Config/config.hpp b/plugin/src/Caelestia/Config/config.hpp index 888caffc..a6fa2f01 100644 --- a/plugin/src/Caelestia/Config/config.hpp +++ b/plugin/src/Caelestia/Config/config.hpp @@ -47,6 +47,7 @@ class GlobalConfig : public ConfigObject { public: static GlobalConfig* instance(); + [[nodiscard]] Q_INVOKABLE GlobalConfig* defaults(); static GlobalConfig* create(QQmlEngine*, QJSEngine*); Q_INVOKABLE void save(); @@ -59,8 +60,9 @@ public: private: friend class MonitorConfigManager; explicit GlobalConfig(QObject* parent = nullptr); - explicit GlobalConfig(GlobalConfig* fallback, const QString& filePath, QObject* parent); + explicit GlobalConfig(GlobalConfig* fallback, const QString& filePath, QObject* parent = nullptr); + GlobalConfig* m_defaults = nullptr; bool m_tokensBound = false; }; diff --git a/plugin/src/Caelestia/Config/tokens.cpp b/plugin/src/Caelestia/Config/tokens.cpp index e03992a4..f2f8d5cc 100644 --- a/plugin/src/Caelestia/Config/tokens.cpp +++ b/plugin/src/Caelestia/Config/tokens.cpp @@ -55,18 +55,29 @@ TokenConfig::TokenConfig(TokenConfig* fallback, const QString& filePath, QObject , m_winfo(new WInfoTokens(this)) , m_controlCenter(new ControlCenterTokens(this)) { setSparse(true); - setupFileBackend(filePath); - syncFromGlobal(fallback); + if (!filePath.isEmpty()) + setupFileBackend(filePath); + if (fallback) + syncFromGlobal(fallback); } TokenConfig::~TokenConfig() { - s_instance = nullptr; + if (m_defaults) + m_defaults->deleteLater(); + if (s_instance == this) + s_instance = nullptr; } TokenConfig* TokenConfig::instance() { return s_instance; } +TokenConfig* TokenConfig::defaults() { + if (!m_defaults) + m_defaults = new TokenConfig(nullptr, QString()); // Non-singleton constructor + return m_defaults; +} + TokenConfig* TokenConfig::create(QQmlEngine* engine, QJSEngine*) { return new TokenConfig(engine); } diff --git a/plugin/src/Caelestia/Config/tokens.hpp b/plugin/src/Caelestia/Config/tokens.hpp index 9ab1ddc3..3d9d48d5 100644 --- a/plugin/src/Caelestia/Config/tokens.hpp +++ b/plugin/src/Caelestia/Config/tokens.hpp @@ -309,6 +309,7 @@ class TokenConfig : public ConfigObject { public: static TokenConfig* instance(); + [[nodiscard]] Q_INVOKABLE TokenConfig* defaults(); static TokenConfig* create(QQmlEngine*, QJSEngine*); Q_INVOKABLE void save(); @@ -319,7 +320,9 @@ public: private: friend class MonitorConfigManager; explicit TokenConfig(QObject* parent = nullptr); - explicit TokenConfig(TokenConfig* fallback, const QString& filePath, QObject* parent); + explicit TokenConfig(TokenConfig* fallback, const QString& filePath, QObject* parent = nullptr); + + TokenConfig* m_defaults = nullptr; }; class Tokens : public QObject { From edf6184c81b271cd4460cf284862ecdefa1914e7 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 19:16:44 +1000 Subject: [PATCH 14/81] fix: retry reading file before warn Some programs will not write to the file atomically, causing us to read a malformed JSON while the write is in progress. Add a retry system to avoid false warnings. --- plugin/src/Caelestia/Config/configobject.cpp | 23 ++++++++++++++++++-- plugin/src/Caelestia/Config/configobject.hpp | 2 ++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/plugin/src/Caelestia/Config/configobject.cpp b/plugin/src/Caelestia/Config/configobject.cpp index 6ab8b14f..8b9001fd 100644 --- a/plugin/src/Caelestia/Config/configobject.cpp +++ b/plugin/src/Caelestia/Config/configobject.cpp @@ -285,6 +285,11 @@ void ConfigObject::setupFileBackend(const QString& path) { m_watcher = new QFileSystemWatcher(this); m_saveTimer = new QTimer(this); m_cooldownTimer = new QTimer(this); + m_retryTimer = new QTimer(this); + + m_retryTimer->setSingleShot(true); + m_retryTimer->setInterval(50); + connect(m_retryTimer, &QTimer::timeout, this, &ConfigObject::reloadFromFile); m_saveTimer->setSingleShot(true); m_saveTimer->setInterval(500); @@ -337,10 +342,20 @@ void ConfigObject::reloadFromFile() { auto doc = QJsonDocument::fromJson(file.readAll(), &error); if (error.error != QJsonParseError::NoError) { - qCWarning(lcConfig) << "Failed to parse" << m_filePath << ":" << error.errorString(); + if (m_retryTimer && m_parseRetries < 3) { + m_parseRetries++; + qCDebug(lcConfig, "Failed to parse %s: %s - retrying (%d/3)", qPrintable(m_filePath), + qPrintable(error.errorString()), m_parseRetries); + m_retryTimer->start(); + } else { + qCWarning(lcConfig, "Failed to parse %s: %s", qPrintable(m_filePath), qPrintable(error.errorString())); + m_parseRetries = 0; + } return; } + m_parseRetries = 0; + qCDebug(lcConfig) << "Reloading" << metaObject()->className() << "from" << m_filePath; clearLoadedKeys(); @@ -357,8 +372,12 @@ void ConfigObject::onFileChanged() { if (!m_watcher->files().contains(m_filePath)) m_watcher->addPath(m_filePath); - if (!m_recentlySaved) + if (!m_recentlySaved) { + m_parseRetries = 0; + if (m_retryTimer) + m_retryTimer->stop(); reloadFromFile(); + } } } // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/configobject.hpp b/plugin/src/Caelestia/Config/configobject.hpp index bb56e9c7..096fb9e8 100644 --- a/plugin/src/Caelestia/Config/configobject.hpp +++ b/plugin/src/Caelestia/Config/configobject.hpp @@ -105,6 +105,8 @@ private: QFileSystemWatcher* m_watcher = nullptr; QTimer* m_saveTimer = nullptr; QTimer* m_cooldownTimer = nullptr; + QTimer* m_retryTimer = nullptr; + int m_parseRetries = 0; // Per-monitor overlay state ConfigObject* m_global = nullptr; From 8f51502f91c7cf0ccbe48feb68b56dfb4e5c4dae Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 19:44:22 +1000 Subject: [PATCH 15/81] fix: use qobject parent --- plugin/src/Caelestia/Config/config.cpp | 4 +--- plugin/src/Caelestia/Config/tokens.cpp | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/plugin/src/Caelestia/Config/config.cpp b/plugin/src/Caelestia/Config/config.cpp index 24cbe9e7..21b90200 100644 --- a/plugin/src/Caelestia/Config/config.cpp +++ b/plugin/src/Caelestia/Config/config.cpp @@ -73,8 +73,6 @@ GlobalConfig::GlobalConfig(GlobalConfig* fallback, const QString& filePath, QObj } GlobalConfig::~GlobalConfig() { - if (m_defaults) - m_defaults->deleteLater(); if (s_instance == this) s_instance = nullptr; } @@ -85,7 +83,7 @@ GlobalConfig* GlobalConfig::instance() { GlobalConfig* GlobalConfig::defaults() { if (!m_defaults) - m_defaults = new GlobalConfig(nullptr, QString()); // Non-singleton constructor + m_defaults = new GlobalConfig(nullptr, QString(), this); // Non-singleton constructor return m_defaults; } diff --git a/plugin/src/Caelestia/Config/tokens.cpp b/plugin/src/Caelestia/Config/tokens.cpp index f2f8d5cc..7e6ca0e0 100644 --- a/plugin/src/Caelestia/Config/tokens.cpp +++ b/plugin/src/Caelestia/Config/tokens.cpp @@ -62,8 +62,6 @@ TokenConfig::TokenConfig(TokenConfig* fallback, const QString& filePath, QObject } TokenConfig::~TokenConfig() { - if (m_defaults) - m_defaults->deleteLater(); if (s_instance == this) s_instance = nullptr; } @@ -74,7 +72,7 @@ TokenConfig* TokenConfig::instance() { TokenConfig* TokenConfig::defaults() { if (!m_defaults) - m_defaults = new TokenConfig(nullptr, QString()); // Non-singleton constructor + m_defaults = new TokenConfig(nullptr, QString(), this); // Non-singleton constructor return m_defaults; } From e283ee2a9ff37e9a2de40511e9ed13d198c0ce97 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 19:49:05 +1000 Subject: [PATCH 16/81] fix: fully qualify Q_PROPERTY types --- plugin/src/Caelestia/Config/config.hpp | 36 ++++++++++----------- plugin/src/Caelestia/Config/configscope.hpp | 4 +-- plugin/src/Caelestia/Config/tokens.hpp | 26 +++++++-------- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/plugin/src/Caelestia/Config/config.hpp b/plugin/src/Caelestia/Config/config.hpp index a6fa2f01..61ef871c 100644 --- a/plugin/src/Caelestia/Config/config.hpp +++ b/plugin/src/Caelestia/Config/config.hpp @@ -75,24 +75,24 @@ class Config : public QObject { QML_UNCREATABLE("") QML_ATTACHED(Config) - Q_PROPERTY(ConfigScope* scope READ scope NOTIFY sourceChanged) - Q_PROPERTY(const AppearanceConfig* appearance READ appearance NOTIFY sourceChanged) - Q_PROPERTY(const GeneralConfig* general READ general NOTIFY sourceChanged) - Q_PROPERTY(const BackgroundConfig* background READ background NOTIFY sourceChanged) - Q_PROPERTY(const BarConfig* bar READ bar NOTIFY sourceChanged) - Q_PROPERTY(const BorderConfig* border READ border NOTIFY sourceChanged) - Q_PROPERTY(const DashboardConfig* dashboard READ dashboard NOTIFY sourceChanged) - Q_PROPERTY(const ControlCenterConfig* controlCenter READ controlCenter NOTIFY sourceChanged) - Q_PROPERTY(const LauncherConfig* launcher READ launcher NOTIFY sourceChanged) - Q_PROPERTY(const NotifsConfig* notifs READ notifs NOTIFY sourceChanged) - Q_PROPERTY(const OsdConfig* osd READ osd NOTIFY sourceChanged) - Q_PROPERTY(const SessionConfig* session READ session NOTIFY sourceChanged) - Q_PROPERTY(const WInfoConfig* winfo READ winfo NOTIFY sourceChanged) - Q_PROPERTY(const LockConfig* lock READ lock NOTIFY sourceChanged) - Q_PROPERTY(const UtilitiesConfig* utilities READ utilities NOTIFY sourceChanged) - Q_PROPERTY(const SidebarConfig* sidebar READ sidebar NOTIFY sourceChanged) - Q_PROPERTY(const ServiceConfig* services READ services NOTIFY sourceChanged) - Q_PROPERTY(const UserPaths* paths READ paths NOTIFY sourceChanged) + Q_PROPERTY(caelestia::config::ConfigScope* scope READ scope NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::AppearanceConfig* appearance READ appearance NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::GeneralConfig* general READ general NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::BackgroundConfig* background READ background NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::BarConfig* bar READ bar NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::BorderConfig* border READ border NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::DashboardConfig* dashboard READ dashboard NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::ControlCenterConfig* controlCenter READ controlCenter NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::LauncherConfig* launcher READ launcher NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::NotifsConfig* notifs READ notifs NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::OsdConfig* osd READ osd NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::SessionConfig* session READ session NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::WInfoConfig* winfo READ winfo NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::LockConfig* lock READ lock NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::UtilitiesConfig* utilities READ utilities NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::SidebarConfig* sidebar READ sidebar NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::ServiceConfig* services READ services NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::UserPaths* paths READ paths NOTIFY sourceChanged) public: explicit Config(ConfigScope* scope, QObject* parent = nullptr); diff --git a/plugin/src/Caelestia/Config/configscope.hpp b/plugin/src/Caelestia/Config/configscope.hpp index 411e9034..53ff5426 100644 --- a/plugin/src/Caelestia/Config/configscope.hpp +++ b/plugin/src/Caelestia/Config/configscope.hpp @@ -15,8 +15,8 @@ class ConfigScope : public QQuickItem { QML_ELEMENT Q_PROPERTY(QString screen READ screen WRITE setScreen NOTIFY screenChanged) - Q_PROPERTY(GlobalConfig* config READ config NOTIFY configChanged) - Q_PROPERTY(TokenConfig* tokens READ tokens NOTIFY tokensChanged) + Q_PROPERTY(caelestia::config::GlobalConfig* config READ config NOTIFY configChanged) + Q_PROPERTY(caelestia::config::TokenConfig* tokens READ tokens NOTIFY tokensChanged) public: explicit ConfigScope(QQuickItem* parent = nullptr); diff --git a/plugin/src/Caelestia/Config/tokens.hpp b/plugin/src/Caelestia/Config/tokens.hpp index 3d9d48d5..aae51f16 100644 --- a/plugin/src/Caelestia/Config/tokens.hpp +++ b/plugin/src/Caelestia/Config/tokens.hpp @@ -332,19 +332,19 @@ class Tokens : public QObject { QML_UNCREATABLE("") QML_ATTACHED(Tokens) - Q_PROPERTY(ConfigScope* scope READ scope NOTIFY sourceChanged) - Q_PROPERTY(const AppearanceTokens* appearance READ appearance NOTIFY sourceChanged) - Q_PROPERTY(const BarTokens* bar READ bar NOTIFY sourceChanged) - Q_PROPERTY(const DashboardTokens* dashboard READ dashboard NOTIFY sourceChanged) - Q_PROPERTY(const LauncherTokens* launcher READ launcher NOTIFY sourceChanged) - Q_PROPERTY(const NotifsTokens* notifs READ notifs NOTIFY sourceChanged) - Q_PROPERTY(const OsdTokens* osd READ osd NOTIFY sourceChanged) - Q_PROPERTY(const SessionTokens* session READ session NOTIFY sourceChanged) - Q_PROPERTY(const SidebarTokens* sidebar READ sidebar NOTIFY sourceChanged) - Q_PROPERTY(const UtilitiesTokens* utilities READ utilities NOTIFY sourceChanged) - Q_PROPERTY(const LockTokens* lock READ lock NOTIFY sourceChanged) - Q_PROPERTY(const WInfoTokens* winfo READ winfo NOTIFY sourceChanged) - Q_PROPERTY(const ControlCenterTokens* controlCenter READ controlCenter NOTIFY sourceChanged) + Q_PROPERTY(caelestia::config::ConfigScope* scope READ scope NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::AppearanceTokens* appearance READ appearance NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::BarTokens* bar READ bar NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::DashboardTokens* dashboard READ dashboard NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::LauncherTokens* launcher READ launcher NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::NotifsTokens* notifs READ notifs NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::OsdTokens* osd READ osd NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::SessionTokens* session READ session NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::SidebarTokens* sidebar READ sidebar NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::UtilitiesTokens* utilities READ utilities NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::LockTokens* lock READ lock NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::WInfoTokens* winfo READ winfo NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::ControlCenterTokens* controlCenter READ controlCenter NOTIFY sourceChanged) public: explicit Tokens(ConfigScope* scope, QObject* parent = nullptr); From d5d6f70f521b91e26c7058bd003c243e4b43a1f5 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 20:10:27 +1000 Subject: [PATCH 17/81] feat: add load/save + fail signals --- plugin/src/Caelestia/Config/config.cpp | 12 +---- plugin/src/Caelestia/Config/config.hpp | 5 +-- plugin/src/Caelestia/Config/configobject.cpp | 46 ++++++++++++++++---- plugin/src/Caelestia/Config/configobject.hpp | 19 +++++++- plugin/src/Caelestia/Config/tokens.cpp | 12 +---- plugin/src/Caelestia/Config/tokens.hpp | 5 +-- 6 files changed, 61 insertions(+), 38 deletions(-) diff --git a/plugin/src/Caelestia/Config/config.cpp b/plugin/src/Caelestia/Config/config.cpp index 21b90200..f78884f2 100644 --- a/plugin/src/Caelestia/Config/config.cpp +++ b/plugin/src/Caelestia/Config/config.cpp @@ -18,7 +18,7 @@ QString configDir() { } // namespace GlobalConfig::GlobalConfig(QObject* parent) - : ConfigObject(parent) + : RootConfig(parent) , m_appearance(new AppearanceConfig(this)) , m_general(new GeneralConfig(this)) , m_background(new BackgroundConfig(this)) @@ -47,7 +47,7 @@ GlobalConfig::GlobalConfig(QObject* parent) } GlobalConfig::GlobalConfig(GlobalConfig* fallback, const QString& filePath, QObject* parent) - : ConfigObject(parent) + : RootConfig(parent) , m_appearance(new AppearanceConfig(this)) , m_general(new GeneralConfig(this)) , m_background(new BackgroundConfig(this)) @@ -120,14 +120,6 @@ GlobalConfig* GlobalConfig::create(QQmlEngine* engine, QJSEngine* jsEngine) { return config; } -void GlobalConfig::save() { - saveToFile(); -} - -void GlobalConfig::reload() { - reloadFromFile(); -} - // Config (attached type) Config::Config(ConfigScope* scope, QObject* parent) diff --git a/plugin/src/Caelestia/Config/config.hpp b/plugin/src/Caelestia/Config/config.hpp index 61ef871c..2218e753 100644 --- a/plugin/src/Caelestia/Config/config.hpp +++ b/plugin/src/Caelestia/Config/config.hpp @@ -22,7 +22,7 @@ namespace caelestia::config { -class GlobalConfig : public ConfigObject { +class GlobalConfig : public RootConfig { Q_OBJECT QML_ELEMENT QML_SINGLETON @@ -50,9 +50,6 @@ public: [[nodiscard]] Q_INVOKABLE GlobalConfig* defaults(); static GlobalConfig* create(QQmlEngine*, QJSEngine*); - Q_INVOKABLE void save(); - Q_INVOKABLE void reload(); - ~GlobalConfig() override; void bindAppearanceTokens(); diff --git a/plugin/src/Caelestia/Config/configobject.cpp b/plugin/src/Caelestia/Config/configobject.cpp index 8b9001fd..93736837 100644 --- a/plugin/src/Caelestia/Config/configobject.cpp +++ b/plugin/src/Caelestia/Config/configobject.cpp @@ -298,12 +298,16 @@ void ConfigObject::setupFileBackend(const QString& path) { QFile file(m_filePath); if (!file.open(QIODevice::WriteOnly)) { - qCWarning(lcConfig) << "Failed to write" << m_filePath; + qCWarning(lcConfig, "Failed to write %s", qUtf8Printable(m_filePath)); + if (auto* root = qobject_cast(this)) + Q_EMIT root->fileSaveFailed(QStringLiteral("Failed to open file for writing")); return; } auto json = m_sparse ? toSparseJsonObject() : toJsonObject(); file.write(QJsonDocument(json).toJson(QJsonDocument::Indented)); + if (auto* root = qobject_cast(this)) + Q_EMIT root->fileSaved(); }); m_cooldownTimer->setSingleShot(true); @@ -330,12 +334,12 @@ void ConfigObject::saveToFile() { m_cooldownTimer->start(); } -void ConfigObject::reloadFromFile() { +bool ConfigObject::reloadFromFile() { QFile file(m_filePath); if (!file.open(QIODevice::ReadOnly)) { - qCDebug(lcConfig) << "Failed to open" << m_filePath; - return; + qCDebug(lcConfig, "Failed to open %s", qUtf8Printable(m_filePath)); + return false; } QJsonParseError error{}; @@ -344,14 +348,15 @@ void ConfigObject::reloadFromFile() { if (error.error != QJsonParseError::NoError) { if (m_retryTimer && m_parseRetries < 3) { m_parseRetries++; - qCDebug(lcConfig, "Failed to parse %s: %s - retrying (%d/3)", qPrintable(m_filePath), - qPrintable(error.errorString()), m_parseRetries); + qCDebug(lcConfig, "Failed to parse %s: %s - retrying (%d/3)", qUtf8Printable(m_filePath), + qUtf8Printable(error.errorString()), m_parseRetries); m_retryTimer->start(); } else { - qCWarning(lcConfig, "Failed to parse %s: %s", qPrintable(m_filePath), qPrintable(error.errorString())); + qCWarning( + lcConfig, "Failed to parse %s: %s", qUtf8Printable(m_filePath), qUtf8Printable(error.errorString())); m_parseRetries = 0; } - return; + return false; } m_parseRetries = 0; @@ -366,6 +371,8 @@ void ConfigObject::reloadFromFile() { qCDebug(lcConfig) << "Re-syncing" << metaObject()->className() << "from global after reload"; resyncFromGlobal(); } + + return true; } void ConfigObject::onFileChanged() { @@ -376,8 +383,29 @@ void ConfigObject::onFileChanged() { m_parseRetries = 0; if (m_retryTimer) m_retryTimer->stop(); - reloadFromFile(); + + bool ok = reloadFromFile(); + if (auto* root = qobject_cast(this)) { + if (ok) + Q_EMIT root->fileLoaded(); + else + Q_EMIT root->fileLoadFailed(QStringLiteral("Failed to load config file")); + } } } +// RootConfig + +RootConfig::RootConfig(QObject* parent) + : ConfigObject(parent) {} + +void RootConfig::save() { + saveToFile(); +} + +void RootConfig::reload() { + if (reloadFromFile()) + Q_EMIT fileLoaded(); +} + } // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/configobject.hpp b/plugin/src/Caelestia/Config/configobject.hpp index 096fb9e8..f9607fa7 100644 --- a/plugin/src/Caelestia/Config/configobject.hpp +++ b/plugin/src/Caelestia/Config/configobject.hpp @@ -59,7 +59,7 @@ public: // automatic file watching, debounced saving, and reload. void setupFileBackend(const QString& path); void saveToFile(); - void reloadFromFile(); + bool reloadFromFile(); // Per-monitor overlay support (Qt Resolve Mask pattern). // Eagerly syncs non-overridden properties from a global ConfigObject. @@ -115,4 +115,21 @@ private: QTimer* m_batchTimer = nullptr; }; +// Intermediate base for singleton config roots (GlobalConfig, TokenConfig). +// Provides save/reload with file lifecycle signals. +class RootConfig : public ConfigObject { + Q_OBJECT + +public: + explicit RootConfig(QObject* parent = nullptr); + + Q_INVOKABLE void save(); + Q_INVOKABLE void reload(); + + Q_SIGNAL void fileLoaded(); + Q_SIGNAL void fileLoadFailed(const QString& error); + Q_SIGNAL void fileSaved(); + Q_SIGNAL void fileSaveFailed(const QString& error); +}; + } // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/tokens.cpp b/plugin/src/Caelestia/Config/tokens.cpp index 7e6ca0e0..ac383ba5 100644 --- a/plugin/src/Caelestia/Config/tokens.cpp +++ b/plugin/src/Caelestia/Config/tokens.cpp @@ -18,7 +18,7 @@ QString configDir() { } // namespace TokenConfig::TokenConfig(QObject* parent) - : ConfigObject(parent) + : RootConfig(parent) , m_appearance(new AppearanceTokens(this)) , m_bar(new BarTokens(this)) , m_dashboard(new DashboardTokens(this)) @@ -41,7 +41,7 @@ TokenConfig::TokenConfig(QObject* parent) } TokenConfig::TokenConfig(TokenConfig* fallback, const QString& filePath, QObject* parent) - : ConfigObject(parent) + : RootConfig(parent) , m_appearance(new AppearanceTokens(this)) , m_bar(new BarTokens(this)) , m_dashboard(new DashboardTokens(this)) @@ -80,14 +80,6 @@ TokenConfig* TokenConfig::create(QQmlEngine* engine, QJSEngine*) { return new TokenConfig(engine); } -void TokenConfig::save() { - saveToFile(); -} - -void TokenConfig::reload() { - reloadFromFile(); -} - // Tokens (attached type) Tokens::Tokens(ConfigScope* scope, QObject* parent) diff --git a/plugin/src/Caelestia/Config/tokens.hpp b/plugin/src/Caelestia/Config/tokens.hpp index aae51f16..53c4a707 100644 --- a/plugin/src/Caelestia/Config/tokens.hpp +++ b/plugin/src/Caelestia/Config/tokens.hpp @@ -289,7 +289,7 @@ public: : ConfigObject(parent) {} }; -class TokenConfig : public ConfigObject { +class TokenConfig : public RootConfig { Q_OBJECT QML_ELEMENT QML_SINGLETON @@ -312,9 +312,6 @@ public: [[nodiscard]] Q_INVOKABLE TokenConfig* defaults(); static TokenConfig* create(QQmlEngine*, QJSEngine*); - Q_INVOKABLE void save(); - Q_INVOKABLE void reload(); - ~TokenConfig() override; private: From 4f2b90147eaaa96577947455d846937030130988 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 20:16:37 +1000 Subject: [PATCH 18/81] fix: signal and emit macros -> keywords Only the ones inside macros are unable to use the keywords --- plugin/src/Caelestia/Config/appearanceconfig.hpp | 15 ++++++++++----- plugin/src/Caelestia/Config/config.hpp | 3 ++- plugin/src/Caelestia/Config/configobject.cpp | 12 ++++++------ plugin/src/Caelestia/Config/configobject.hpp | 12 +++++++----- plugin/src/Caelestia/Config/configscope.cpp | 6 +++--- plugin/src/Caelestia/Config/configscope.hpp | 7 ++++--- plugin/src/Caelestia/Config/tokens.hpp | 3 ++- 7 files changed, 34 insertions(+), 24 deletions(-) diff --git a/plugin/src/Caelestia/Config/appearanceconfig.hpp b/plugin/src/Caelestia/Config/appearanceconfig.hpp index db395e82..c13d0779 100644 --- a/plugin/src/Caelestia/Config/appearanceconfig.hpp +++ b/plugin/src/Caelestia/Config/appearanceconfig.hpp @@ -35,7 +35,8 @@ public: [[nodiscard]] int large() const; [[nodiscard]] int full() const; - Q_SIGNAL void valuesChanged(); +signals: + void valuesChanged(); private: RoundingTokens* m_tokens = nullptr; @@ -65,7 +66,8 @@ public: [[nodiscard]] int larger() const; [[nodiscard]] int large() const; - Q_SIGNAL void valuesChanged(); +signals: + void valuesChanged(); private: SpacingTokens* m_tokens = nullptr; @@ -95,7 +97,8 @@ public: [[nodiscard]] int larger() const; [[nodiscard]] int large() const; - Q_SIGNAL void valuesChanged(); +signals: + void valuesChanged(); private: PaddingTokens* m_tokens = nullptr; @@ -141,7 +144,8 @@ public: [[nodiscard]] int large() const; [[nodiscard]] int extraLarge() const; - Q_SIGNAL void valuesChanged(); +signals: + void valuesChanged(); private: FontSizeTokens* m_tokens = nullptr; @@ -189,7 +193,8 @@ public: [[nodiscard]] int expressiveDefaultSpatial() const; [[nodiscard]] int expressiveSlowSpatial() const; - Q_SIGNAL void valuesChanged(); +signals: + void valuesChanged(); private: AnimDurationTokens* m_tokens = nullptr; diff --git a/plugin/src/Caelestia/Config/config.hpp b/plugin/src/Caelestia/Config/config.hpp index 2218e753..ddced131 100644 --- a/plugin/src/Caelestia/Config/config.hpp +++ b/plugin/src/Caelestia/Config/config.hpp @@ -116,7 +116,8 @@ public: static Config* qmlAttachedProperties(QObject* object); - Q_SIGNAL void sourceChanged(); +signals: + void sourceChanged(); private: void connectScope(); diff --git a/plugin/src/Caelestia/Config/configobject.cpp b/plugin/src/Caelestia/Config/configobject.cpp index 93736837..8103b896 100644 --- a/plugin/src/Caelestia/Config/configobject.cpp +++ b/plugin/src/Caelestia/Config/configobject.cpp @@ -276,7 +276,7 @@ void ConfigObject::emitBatchedChanges() { auto changes = std::move(m_pendingChanges); m_pendingChanges.clear(); - Q_EMIT propertiesChanged(changes); + emit propertiesChanged(changes); } void ConfigObject::setupFileBackend(const QString& path) { @@ -300,14 +300,14 @@ void ConfigObject::setupFileBackend(const QString& path) { if (!file.open(QIODevice::WriteOnly)) { qCWarning(lcConfig, "Failed to write %s", qUtf8Printable(m_filePath)); if (auto* root = qobject_cast(this)) - Q_EMIT root->fileSaveFailed(QStringLiteral("Failed to open file for writing")); + emit root->fileSaveFailed(QStringLiteral("Failed to open file for writing")); return; } auto json = m_sparse ? toSparseJsonObject() : toJsonObject(); file.write(QJsonDocument(json).toJson(QJsonDocument::Indented)); if (auto* root = qobject_cast(this)) - Q_EMIT root->fileSaved(); + emit root->fileSaved(); }); m_cooldownTimer->setSingleShot(true); @@ -387,9 +387,9 @@ void ConfigObject::onFileChanged() { bool ok = reloadFromFile(); if (auto* root = qobject_cast(this)) { if (ok) - Q_EMIT root->fileLoaded(); + emit root->fileLoaded(); else - Q_EMIT root->fileLoadFailed(QStringLiteral("Failed to load config file")); + emit root->fileLoadFailed(QStringLiteral("Failed to load config file")); } } } @@ -405,7 +405,7 @@ void RootConfig::save() { void RootConfig::reload() { if (reloadFromFile()) - Q_EMIT fileLoaded(); + emit fileLoaded(); } } // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/configobject.hpp b/plugin/src/Caelestia/Config/configobject.hpp index f9607fa7..f0420441 100644 --- a/plugin/src/Caelestia/Config/configobject.hpp +++ b/plugin/src/Caelestia/Config/configobject.hpp @@ -87,7 +87,8 @@ public: return true; } - Q_SIGNAL void propertiesChanged(const QMap& changed); +signals: + void propertiesChanged(const QMap& changed); protected: void notifyPropertyChanged(const QString& name, const QVariant& value); @@ -126,10 +127,11 @@ public: Q_INVOKABLE void save(); Q_INVOKABLE void reload(); - Q_SIGNAL void fileLoaded(); - Q_SIGNAL void fileLoadFailed(const QString& error); - Q_SIGNAL void fileSaved(); - Q_SIGNAL void fileSaveFailed(const QString& error); +signals: + void fileLoaded(); + void fileLoadFailed(const QString& error); + void fileSaved(); + void fileSaveFailed(const QString& error); }; } // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/configscope.cpp b/plugin/src/Caelestia/Config/configscope.cpp index 7b2074e3..6f20f05d 100644 --- a/plugin/src/Caelestia/Config/configscope.cpp +++ b/plugin/src/Caelestia/Config/configscope.cpp @@ -11,7 +11,7 @@ void ConfigScope::setScreen(const QString& screen) { return; m_screen = screen; - Q_EMIT screenChanged(); + emit screenChanged(); resolveConfig(); } @@ -28,12 +28,12 @@ void ConfigScope::resolveConfig() { if (m_config != newConfig) { m_config = newConfig; - Q_EMIT configChanged(); + emit configChanged(); } if (m_tokens != newTokens) { m_tokens = newTokens; - Q_EMIT tokensChanged(); + emit tokensChanged(); } } diff --git a/plugin/src/Caelestia/Config/configscope.hpp b/plugin/src/Caelestia/Config/configscope.hpp index 53ff5426..202cf48a 100644 --- a/plugin/src/Caelestia/Config/configscope.hpp +++ b/plugin/src/Caelestia/Config/configscope.hpp @@ -31,9 +31,10 @@ public: static ConfigScope* find(QObject* object); - Q_SIGNAL void screenChanged(); - Q_SIGNAL void configChanged(); - Q_SIGNAL void tokensChanged(); +signals: + void screenChanged(); + void configChanged(); + void tokensChanged(); private: void resolveConfig(); diff --git a/plugin/src/Caelestia/Config/tokens.hpp b/plugin/src/Caelestia/Config/tokens.hpp index 53c4a707..b8b4ab79 100644 --- a/plugin/src/Caelestia/Config/tokens.hpp +++ b/plugin/src/Caelestia/Config/tokens.hpp @@ -363,7 +363,8 @@ public: static Tokens* qmlAttachedProperties(QObject* object); - Q_SIGNAL void sourceChanged(); +signals: + void sourceChanged(); private: void connectScope(); From 324acb492aa3ecdbea840ca3d46fd8cf65f5160f Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 21:08:09 +1000 Subject: [PATCH 19/81] fix: ensure singletons exist when evaluating attached props --- plugin/src/Caelestia/Config/config.cpp | 8 +++++++- plugin/src/Caelestia/Config/tokens.cpp | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/plugin/src/Caelestia/Config/config.cpp b/plugin/src/Caelestia/Config/config.cpp index f78884f2..da9fdcbe 100644 --- a/plugin/src/Caelestia/Config/config.cpp +++ b/plugin/src/Caelestia/Config/config.cpp @@ -140,7 +140,8 @@ void Config::connectScope() { const Type* Config::name() const { \ if (m_scope && m_scope->config()) \ return m_scope->config()->name(); \ - return GlobalConfig::instance()->name(); \ + auto* global = GlobalConfig::instance(); \ + return global ? global->name() : nullptr; \ } CONFIG_ATTACHED_GETTER(AppearanceConfig, appearance) @@ -164,6 +165,11 @@ CONFIG_ATTACHED_GETTER(UserPaths, paths) #undef CONFIG_ATTACHED_GETTER Config* Config::qmlAttachedProperties(QObject* object) { + // Ensure GlobalConfig singleton is created before any attached property access + if (!GlobalConfig::instance()) { + if (auto* engine = qmlEngine(object)) + engine->singletonInstance("Caelestia.Config", "GlobalConfig"); + } return new Config(ConfigScope::find(object), object); } diff --git a/plugin/src/Caelestia/Config/tokens.cpp b/plugin/src/Caelestia/Config/tokens.cpp index ac383ba5..2b0559fa 100644 --- a/plugin/src/Caelestia/Config/tokens.cpp +++ b/plugin/src/Caelestia/Config/tokens.cpp @@ -99,7 +99,8 @@ void Tokens::connectScope() { const Type* Tokens::name() const { \ if (m_scope && m_scope->tokens()) \ return m_scope->tokens()->name(); \ - return TokenConfig::instance()->name(); \ + auto* global = TokenConfig::instance(); \ + return global ? global->name() : nullptr; \ } TOKENS_ATTACHED_GETTER(AppearanceTokens, appearance) @@ -118,6 +119,11 @@ TOKENS_ATTACHED_GETTER(ControlCenterTokens, controlCenter) #undef TOKENS_ATTACHED_GETTER Tokens* Tokens::qmlAttachedProperties(QObject* object) { + // Ensure TokenConfig singleton is created before any attached property access + if (!TokenConfig::instance()) { + if (auto* engine = qmlEngine(object)) + engine->singletonInstance("Caelestia.Config", "TokenConfig"); + } return new Tokens(ConfigScope::find(object), object); } From 0429650a6e6121bf44235be40cb477bde4f861cf Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 21:16:35 +1000 Subject: [PATCH 20/81] feat: Tokens attached object points to Config.appearance --- plugin/src/Caelestia/Config/tokens.cpp | 62 ++++++++++++++++---------- plugin/src/Caelestia/Config/tokens.hpp | 40 ++++++----------- 2 files changed, 51 insertions(+), 51 deletions(-) diff --git a/plugin/src/Caelestia/Config/tokens.cpp b/plugin/src/Caelestia/Config/tokens.cpp index 2b0559fa..3c987ac1 100644 --- a/plugin/src/Caelestia/Config/tokens.cpp +++ b/plugin/src/Caelestia/Config/tokens.cpp @@ -91,38 +91,52 @@ Tokens::Tokens(ConfigScope* scope, QObject* parent) void Tokens::connectScope() { if (!m_scope) return; - connect(m_scope, &ConfigScope::tokensChanged, this, &Tokens::sourceChanged); connect(m_scope, &ConfigScope::configChanged, this, &Tokens::sourceChanged); } -#define TOKENS_ATTACHED_GETTER(Type, name) \ - const Type* Tokens::name() const { \ - if (m_scope && m_scope->tokens()) \ - return m_scope->tokens()->name(); \ - auto* global = TokenConfig::instance(); \ - return global ? global->name() : nullptr; \ - } +// Resolve appearance from per-monitor GlobalConfig overlay or global GlobalConfig +static const AppearanceConfig* resolveAppearance(ConfigScope* scope) { + if (scope && scope->config()) + return scope->config()->appearance(); + auto* global = GlobalConfig::instance(); + return global ? global->appearance() : nullptr; +} -TOKENS_ATTACHED_GETTER(AppearanceTokens, appearance) -TOKENS_ATTACHED_GETTER(BarTokens, bar) -TOKENS_ATTACHED_GETTER(DashboardTokens, dashboard) -TOKENS_ATTACHED_GETTER(LauncherTokens, launcher) -TOKENS_ATTACHED_GETTER(NotifsTokens, notifs) -TOKENS_ATTACHED_GETTER(OsdTokens, osd) -TOKENS_ATTACHED_GETTER(SessionTokens, session) -TOKENS_ATTACHED_GETTER(SidebarTokens, sidebar) -TOKENS_ATTACHED_GETTER(UtilitiesTokens, utilities) -TOKENS_ATTACHED_GETTER(LockTokens, lock) -TOKENS_ATTACHED_GETTER(WInfoTokens, winfo) -TOKENS_ATTACHED_GETTER(ControlCenterTokens, controlCenter) +const AppearanceRounding* Tokens::rounding() const { + auto* a = resolveAppearance(m_scope); + return a ? a->rounding() : nullptr; +} -#undef TOKENS_ATTACHED_GETTER +const AppearanceSpacing* Tokens::spacing() const { + auto* a = resolveAppearance(m_scope); + return a ? a->spacing() : nullptr; +} + +const AppearancePadding* Tokens::padding() const { + auto* a = resolveAppearance(m_scope); + return a ? a->padding() : nullptr; +} + +const AppearanceFont* Tokens::font() const { + auto* a = resolveAppearance(m_scope); + return a ? a->font() : nullptr; +} + +const AppearanceAnim* Tokens::anim() const { + auto* a = resolveAppearance(m_scope); + return a ? a->anim() : nullptr; +} + +const AppearanceTransparency* Tokens::transparency() const { + auto* a = resolveAppearance(m_scope); + return a ? a->transparency() : nullptr; +} Tokens* Tokens::qmlAttachedProperties(QObject* object) { - // Ensure TokenConfig singleton is created before any attached property access - if (!TokenConfig::instance()) { + // Ensure GlobalConfig singleton is created before any attached property access + if (!GlobalConfig::instance()) { if (auto* engine = qmlEngine(object)) - engine->singletonInstance("Caelestia.Config", "TokenConfig"); + engine->singletonInstance("Caelestia.Config", "GlobalConfig"); } return new Tokens(ConfigScope::find(object), object); } diff --git a/plugin/src/Caelestia/Config/tokens.hpp b/plugin/src/Caelestia/Config/tokens.hpp index b8b4ab79..7b38804c 100644 --- a/plugin/src/Caelestia/Config/tokens.hpp +++ b/plugin/src/Caelestia/Config/tokens.hpp @@ -1,5 +1,6 @@ #pragma once +#include "appearanceconfig.hpp" #include "configobject.hpp" #include @@ -329,37 +330,22 @@ class Tokens : public QObject { QML_UNCREATABLE("") QML_ATTACHED(Tokens) - Q_PROPERTY(caelestia::config::ConfigScope* scope READ scope NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::AppearanceTokens* appearance READ appearance NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::BarTokens* bar READ bar NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::DashboardTokens* dashboard READ dashboard NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::LauncherTokens* launcher READ launcher NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::NotifsTokens* notifs READ notifs NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::OsdTokens* osd READ osd NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::SessionTokens* session READ session NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::SidebarTokens* sidebar READ sidebar NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::UtilitiesTokens* utilities READ utilities NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::LockTokens* lock READ lock NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::WInfoTokens* winfo READ winfo NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::ControlCenterTokens* controlCenter READ controlCenter NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::AppearanceRounding* rounding READ rounding NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::AppearanceSpacing* spacing READ spacing NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::AppearancePadding* padding READ padding NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::AppearanceFont* font READ font NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::AppearanceAnim* anim READ anim NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::AppearanceTransparency* transparency READ transparency NOTIFY sourceChanged) public: explicit Tokens(ConfigScope* scope, QObject* parent = nullptr); - [[nodiscard]] ConfigScope* scope() const { return m_scope; } - - [[nodiscard]] const AppearanceTokens* appearance() const; - [[nodiscard]] const BarTokens* bar() const; - [[nodiscard]] const DashboardTokens* dashboard() const; - [[nodiscard]] const LauncherTokens* launcher() const; - [[nodiscard]] const NotifsTokens* notifs() const; - [[nodiscard]] const OsdTokens* osd() const; - [[nodiscard]] const SessionTokens* session() const; - [[nodiscard]] const SidebarTokens* sidebar() const; - [[nodiscard]] const UtilitiesTokens* utilities() const; - [[nodiscard]] const LockTokens* lock() const; - [[nodiscard]] const WInfoTokens* winfo() const; - [[nodiscard]] const ControlCenterTokens* controlCenter() const; + [[nodiscard]] const AppearanceRounding* rounding() const; + [[nodiscard]] const AppearanceSpacing* spacing() const; + [[nodiscard]] const AppearancePadding* padding() const; + [[nodiscard]] const AppearanceFont* font() const; + [[nodiscard]] const AppearanceAnim* anim() const; + [[nodiscard]] const AppearanceTransparency* transparency() const; static Tokens* qmlAttachedProperties(QObject* object); From 3a37d77d1fbb544c9c46846b9a718ae048e6444f Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 21:18:56 +1000 Subject: [PATCH 21/81] feat: replace qml config module with c++ module --- components/Anim.qml | 6 +- components/CAnim.qml | 6 +- components/ConnectionHeader.qml | 8 +- components/ConnectionInfoSection.qml | 18 +- components/MaterialIcon.qml | 6 +- components/PropertyRow.qml | 8 +- components/SectionContainer.qml | 10 +- components/SectionHeader.qml | 6 +- components/StateLayer.qml | 6 +- components/StyledText.qml | 12 +- components/containers/StyledWindow.qml | 11 + components/controls/CircularIndicator.qml | 12 +- components/controls/CircularProgress.qml | 14 +- components/controls/CollapsibleSection.qml | 48 +- components/controls/CustomSpinBox.qml | 20 +- components/controls/FilledSlider.qml | 20 +- components/controls/IconButton.qml | 6 +- components/controls/IconTextButton.qml | 10 +- components/controls/Menu.qml | 18 +- components/controls/SpinBoxRow.qml | 10 +- components/controls/SplitButton.qml | 26 +- components/controls/SplitButtonRow.qml | 10 +- components/controls/StyledInputField.qml | 8 +- components/controls/StyledRadioButton.qml | 12 +- components/controls/StyledScrollBar.qml | 6 +- components/controls/StyledSlider.qml | 8 +- components/controls/StyledSwitch.qml | 22 +- components/controls/StyledTextField.qml | 10 +- components/controls/SwitchRow.qml | 10 +- components/controls/TextButton.qml | 8 +- components/controls/ToggleButton.qml | 22 +- components/controls/ToggleRow.qml | 4 +- components/controls/Tooltip.qml | 22 +- components/effects/InnerBorder.qml | 6 +- components/filedialog/CurrentItem.qml | 12 +- components/filedialog/DialogButtons.qml | 30 +- components/filedialog/FolderContents.qml | 40 +- components/filedialog/HeaderBar.qml | 32 +- components/filedialog/Sidebar.qml | 30 +- components/widgets/ExtraIndicator.qml | 16 +- config/Appearance.qml | 14 - config/AppearanceConfig.qml | 94 ---- config/BackgroundConfig.qml | 37 -- config/BarConfig.qml | 129 ----- config/BorderConfig.qml | 10 - config/Config.qml | 500 ------------------ config/ControlCenterConfig.qml | 10 - config/DashboardConfig.qml | 40 -- config/GeneralConfig.qml | 61 --- config/LauncherConfig.qml | 147 ----- config/LockConfig.qml | 15 - config/NotifsConfig.qml | 19 - config/OsdConfig.qml | 14 - config/ServiceConfig.qml | 24 - config/SessionConfig.qml | 29 - config/SidebarConfig.qml | 11 - config/UserPaths.qml | 11 - config/UtilitiesConfig.qml | 67 --- config/WInfoConfig.qml | 10 - modules/BatteryMonitor.qml | 2 +- modules/IdleMonitors.qml | 2 +- modules/areapicker/Picker.qml | 10 +- modules/background/Background.qml | 10 +- modules/background/DesktopClock.qml | 42 +- modules/background/Visualiser.qml | 10 +- modules/background/Wallpaper.qml | 18 +- modules/bar/Bar.qml | 6 +- modules/bar/BarWrapper.qml | 10 +- modules/bar/components/ActiveWindow.qml | 12 +- modules/bar/components/Clock.qml | 16 +- modules/bar/components/OsIcon.qml | 12 +- modules/bar/components/Power.qml | 10 +- modules/bar/components/Settings.qml | 10 +- modules/bar/components/SettingsIcon.qml | 10 +- modules/bar/components/StatusIcons.qml | 22 +- modules/bar/components/Tray.qml | 24 +- modules/bar/components/TrayItem.qml | 6 +- .../components/workspaces/ActiveIndicator.qml | 10 +- .../bar/components/workspaces/OccupiedBg.qml | 8 +- .../workspaces/SpecialWorkspaces.qml | 38 +- .../bar/components/workspaces/Workspace.qml | 10 +- .../bar/components/workspaces/Workspaces.qml | 14 +- modules/bar/popouts/ActiveWindow.qml | 20 +- modules/bar/popouts/Audio.qml | 20 +- modules/bar/popouts/Battery.qml | 38 +- modules/bar/popouts/Bluetooth.qml | 36 +- modules/bar/popouts/ClipWrapper.qml | 6 +- modules/bar/popouts/Content.qml | 10 +- modules/bar/popouts/LockStatus.qml | 4 +- modules/bar/popouts/Network.qml | 66 +-- modules/bar/popouts/TrayMenu.qml | 28 +- modules/bar/popouts/WirelessPassword.qml | 56 +- modules/bar/popouts/Wrapper.qml | 10 +- modules/bar/popouts/kblayout/KbLayout.qml | 32 +- .../bar/popouts/kblayout/KbLayoutModel.qml | 2 +- modules/controlcenter/ControlCenter.qml | 4 +- modules/controlcenter/NavRail.qml | 58 +- modules/controlcenter/Panes.qml | 6 +- modules/controlcenter/WindowTitle.qml | 12 +- .../appearance/AppearancePane.qml | 14 +- .../appearance/sections/AnimationsSection.qml | 4 +- .../appearance/sections/BackgroundSection.qml | 32 +- .../appearance/sections/BorderSection.qml | 6 +- .../sections/ColorSchemeSection.qml | 24 +- .../sections/ColorVariantSection.qml | 16 +- .../appearance/sections/FontsSection.qml | 46 +- .../appearance/sections/ScalesSection.qml | 8 +- .../appearance/sections/ThemeModeSection.qml | 2 +- .../sections/TransparencySection.qml | 6 +- modules/controlcenter/audio/AudioPane.qml | 96 ++-- modules/controlcenter/bluetooth/BtPane.qml | 2 +- modules/controlcenter/bluetooth/Details.qml | 142 ++--- .../controlcenter/bluetooth/DeviceList.qml | 56 +- modules/controlcenter/bluetooth/Settings.qml | 126 ++--- .../components/ConnectedButtonGroup.qml | 28 +- .../components/DeviceDetails.qml | 4 +- .../controlcenter/components/DeviceList.qml | 10 +- .../components/PaneTransition.qml | 18 +- .../components/ReadonlySlider.qml | 16 +- .../components/SettingsHeader.qml | 8 +- .../controlcenter/components/SliderInput.qml | 12 +- .../components/SplitPaneLayout.qml | 22 +- .../components/SplitPaneWithDetails.qml | 2 +- .../components/WallpaperGrid.qml | 24 +- .../controlcenter/dashboard/DashboardPane.qml | 20 +- .../dashboard/GeneralSection.qml | 6 +- .../dashboard/PerformanceSection.qml | 4 +- .../controlcenter/launcher/LauncherPane.qml | 84 +-- modules/controlcenter/launcher/Settings.qml | 24 +- .../controlcenter/network/EthernetDetails.qml | 10 +- .../controlcenter/network/EthernetList.qml | 34 +- .../controlcenter/network/EthernetPane.qml | 2 +- .../network/EthernetSettings.qml | 22 +- .../controlcenter/network/NetworkSettings.qml | 28 +- .../controlcenter/network/NetworkingPane.qml | 26 +- modules/controlcenter/network/VpnDetails.qml | 82 +-- modules/controlcenter/network/VpnList.qml | 128 ++--- modules/controlcenter/network/VpnSettings.qml | 28 +- .../controlcenter/network/WirelessDetails.qml | 14 +- .../controlcenter/network/WirelessList.qml | 48 +- .../controlcenter/network/WirelessPane.qml | 2 +- .../network/WirelessPasswordDialog.qml | 50 +- .../network/WirelessSettings.qml | 10 +- .../notifications/NotificationsPane.qml | 28 +- modules/controlcenter/taskbar/TaskbarPane.qml | 96 ++-- modules/dashboard/Content.qml | 18 +- modules/dashboard/Dash.qml | 18 +- modules/dashboard/LyricMenu.qml | 66 +-- modules/dashboard/LyricsView.qml | 12 +- modules/dashboard/Media.qml | 84 +-- modules/dashboard/Performance.qml | 142 ++--- modules/dashboard/Tabs.qml | 18 +- modules/dashboard/WeatherTab.qml | 72 +-- modules/dashboard/Wrapper.qml | 6 +- modules/dashboard/dash/Calendar.qml | 48 +- modules/dashboard/dash/DateTime.qml | 18 +- modules/dashboard/dash/Media.qml | 52 +- modules/dashboard/dash/Resources.qml | 16 +- modules/dashboard/dash/SmallWeather.qml | 12 +- modules/dashboard/dash/User.qml | 34 +- modules/drawers/ContentWindow.qml | 18 +- modules/drawers/Drawers.qml | 2 +- modules/drawers/Interactions.qml | 2 +- modules/drawers/Panels.qml | 4 +- modules/drawers/Regions.qml | 2 +- modules/launcher/AppList.qml | 28 +- modules/launcher/Content.qml | 20 +- modules/launcher/ContentList.qml | 24 +- modules/launcher/WallpaperList.qml | 4 +- modules/launcher/Wrapper.qml | 8 +- modules/launcher/items/ActionItem.qml | 20 +- modules/launcher/items/AppItem.qml | 18 +- modules/launcher/items/CalcItem.qml | 26 +- modules/launcher/items/SchemeItem.qml | 24 +- modules/launcher/items/VariantItem.qml | 22 +- modules/launcher/items/WallpaperItem.qml | 20 +- modules/launcher/services/Actions.qml | 2 +- modules/launcher/services/Apps.qml | 2 +- modules/launcher/services/M3Variants.qml | 2 +- modules/launcher/services/Schemes.qml | 2 +- modules/lock/Center.qml | 62 +-- modules/lock/Content.qml | 26 +- modules/lock/Fetch.qml | 38 +- modules/lock/InputField.qml | 16 +- modules/lock/LockSurface.qml | 54 +- modules/lock/Media.qml | 44 +- modules/lock/NotifDock.qml | 32 +- modules/lock/NotifGroup.qml | 46 +- modules/lock/Pam.qml | 2 +- modules/lock/Resources.qml | 24 +- modules/lock/WeatherInfo.qml | 44 +- modules/notifications/Content.qml | 28 +- modules/notifications/Notification.qml | 86 +-- modules/osd/Content.qml | 10 +- modules/osd/Wrapper.qml | 6 +- modules/session/Content.qml | 12 +- modules/session/Wrapper.qml | 6 +- modules/sidebar/Content.qml | 8 +- modules/sidebar/Notif.qml | 30 +- modules/sidebar/NotifActionList.qml | 20 +- modules/sidebar/NotifDock.qml | 42 +- modules/sidebar/NotifDockList.qml | 22 +- modules/sidebar/NotifGroup.qml | 56 +- modules/sidebar/NotifGroupList.qml | 14 +- modules/sidebar/Wrapper.qml | 10 +- modules/utilities/Content.qml | 4 +- modules/utilities/RecordingDeleteModal.qml | 32 +- modules/utilities/Wrapper.qml | 16 +- modules/utilities/cards/IdleInhibit.qml | 44 +- modules/utilities/cards/Record.qml | 60 +-- modules/utilities/cards/RecordingList.qml | 28 +- modules/utilities/cards/Toggles.qml | 26 +- modules/utilities/toasts/ToastItem.qml | 22 +- modules/utilities/toasts/Toasts.qml | 14 +- modules/windowinfo/Buttons.qml | 46 +- modules/windowinfo/Details.qml | 30 +- modules/windowinfo/Preview.qml | 18 +- modules/windowinfo/WindowInfo.qml | 12 +- services/Audio.qml | 2 +- services/Brightness.qml | 2 +- services/Colours.qml | 8 +- services/GameMode.qml | 2 +- services/Hypr.qml | 2 +- services/LyricsService.qml | 2 +- services/NetworkUsage.qml | 2 +- services/NotifData.qml | 2 +- services/Notifs.qml | 2 +- services/Players.qml | 2 +- services/Screens.qml | 2 +- services/SystemUsage.qml | 2 +- services/Time.qml | 2 +- services/VPN.qml | 2 +- services/Wallpapers.qml | 2 +- services/Weather.qml | 2 +- utils/Icons.qml | 2 +- utils/Paths.qml | 2 +- utils/SysInfo.qml | 2 +- 237 files changed, 2395 insertions(+), 3626 deletions(-) delete mode 100644 config/Appearance.qml delete mode 100644 config/AppearanceConfig.qml delete mode 100644 config/BackgroundConfig.qml delete mode 100644 config/BarConfig.qml delete mode 100644 config/BorderConfig.qml delete mode 100644 config/Config.qml delete mode 100644 config/ControlCenterConfig.qml delete mode 100644 config/DashboardConfig.qml delete mode 100644 config/GeneralConfig.qml delete mode 100644 config/LauncherConfig.qml delete mode 100644 config/LockConfig.qml delete mode 100644 config/NotifsConfig.qml delete mode 100644 config/OsdConfig.qml delete mode 100644 config/ServiceConfig.qml delete mode 100644 config/SessionConfig.qml delete mode 100644 config/SidebarConfig.qml delete mode 100644 config/UserPaths.qml delete mode 100644 config/UtilitiesConfig.qml delete mode 100644 config/WInfoConfig.qml diff --git a/components/Anim.qml b/components/Anim.qml index 505243a7..bf8eefb1 100644 --- a/components/Anim.qml +++ b/components/Anim.qml @@ -1,8 +1,8 @@ import QtQuick -import qs.config +import Caelestia.Config NumberAnimation { - duration: Appearance.anim.durations.normal + duration: Tokens.anim.durations.normal easing.type: Easing.BezierSpline - easing.bezierCurve: Appearance.anim.curves.standard + easing.bezierCurve: Tokens.anim.curves.standard } diff --git a/components/CAnim.qml b/components/CAnim.qml index f2f4e40f..3b7b7b2f 100644 --- a/components/CAnim.qml +++ b/components/CAnim.qml @@ -1,8 +1,8 @@ import QtQuick -import qs.config +import Caelestia.Config ColorAnimation { - duration: Appearance.anim.durations.normal + duration: Tokens.anim.durations.normal easing.type: Easing.BezierSpline - easing.bezierCurve: Appearance.anim.curves.standard + easing.bezierCurve: Tokens.anim.curves.standard } diff --git a/components/ConnectionHeader.qml b/components/ConnectionHeader.qml index cdba17bc..36886803 100644 --- a/components/ConnectionHeader.qml +++ b/components/ConnectionHeader.qml @@ -1,7 +1,7 @@ import QtQuick import QtQuick.Layouts import qs.components -import qs.config +import Caelestia.Config ColumnLayout { id: root @@ -9,14 +9,14 @@ ColumnLayout { required property string icon required property string title - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal Layout.alignment: Qt.AlignHCenter MaterialIcon { Layout.alignment: Qt.AlignHCenter animate: true text: root.icon - font.pointSize: Appearance.font.size.extraLarge * 3 + font.pointSize: Tokens.font.size.extraLarge * 3 font.bold: true } @@ -24,7 +24,7 @@ ColumnLayout { Layout.alignment: Qt.AlignHCenter animate: true text: root.title - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large font.bold: true } } diff --git a/components/ConnectionInfoSection.qml b/components/ConnectionInfoSection.qml index 9063a6d2..bac3cc7c 100644 --- a/components/ConnectionInfoSection.qml +++ b/components/ConnectionInfoSection.qml @@ -2,14 +2,14 @@ import QtQuick import QtQuick.Layouts import qs.components import qs.services -import qs.config +import Caelestia.Config ColumnLayout { id: root required property var deviceDetails - spacing: Appearance.spacing.small / 2 + spacing: Tokens.spacing.small / 2 StyledText { text: qsTr("IP Address") @@ -18,40 +18,40 @@ ColumnLayout { StyledText { text: root.deviceDetails?.ipAddress || qsTr("Not available") color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } StyledText { - Layout.topMargin: Appearance.spacing.normal + Layout.topMargin: Tokens.spacing.normal text: qsTr("Subnet Mask") } StyledText { text: root.deviceDetails?.subnet || qsTr("Not available") color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } StyledText { - Layout.topMargin: Appearance.spacing.normal + Layout.topMargin: Tokens.spacing.normal text: qsTr("Gateway") } StyledText { text: root.deviceDetails?.gateway || qsTr("Not available") color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } StyledText { - Layout.topMargin: Appearance.spacing.normal + Layout.topMargin: Tokens.spacing.normal text: qsTr("DNS Servers") } StyledText { text: (root.deviceDetails && root.deviceDetails.dns && root.deviceDetails.dns.length > 0) ? root.deviceDetails.dns.join(", ") : qsTr("Not available") color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small wrapMode: Text.Wrap Layout.maximumWidth: parent.width } diff --git a/components/MaterialIcon.qml b/components/MaterialIcon.qml index a1d19d3c..e85d39be 100644 --- a/components/MaterialIcon.qml +++ b/components/MaterialIcon.qml @@ -1,12 +1,12 @@ import qs.services -import qs.config +import Caelestia.Config StyledText { property real fill property int grade: Colours.light ? 0 : -25 - font.family: Appearance.font.family.material - font.pointSize: Appearance.font.size.larger + font.family: Tokens.font.family.material + font.pointSize: Tokens.font.size.larger font.variableAxes: ({ FILL: fill.toFixed(1), GRAD: grade, diff --git a/components/PropertyRow.qml b/components/PropertyRow.qml index 67315b9c..7f1a68bd 100644 --- a/components/PropertyRow.qml +++ b/components/PropertyRow.qml @@ -2,7 +2,7 @@ import QtQuick import QtQuick.Layouts import qs.components import qs.services -import qs.config +import Caelestia.Config ColumnLayout { id: root @@ -11,16 +11,16 @@ ColumnLayout { required property string value property bool showTopMargin: false - spacing: Appearance.spacing.small / 2 + spacing: Tokens.spacing.small / 2 StyledText { - Layout.topMargin: root.showTopMargin ? Appearance.spacing.normal : 0 + Layout.topMargin: root.showTopMargin ? Tokens.spacing.normal : 0 text: root.label } StyledText { text: root.value color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } } diff --git a/components/SectionContainer.qml b/components/SectionContainer.qml index 8b57cdd4..05b4523c 100644 --- a/components/SectionContainer.qml +++ b/components/SectionContainer.qml @@ -2,19 +2,19 @@ import QtQuick import QtQuick.Layouts import qs.components import qs.services -import qs.config +import Caelestia.Config StyledRect { id: root default property alias content: contentColumn.data - property real contentSpacing: Appearance.spacing.larger + property real contentSpacing: Tokens.spacing.larger property bool alignTop: false Layout.fillWidth: true - implicitHeight: contentColumn.implicitHeight + Appearance.padding.large * 2 + implicitHeight: contentColumn.implicitHeight + Tokens.padding.large * 2 - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: Colours.transparency.enabled ? Colours.layer(Colours.palette.m3surfaceContainer, 2) : Colours.palette.m3surfaceContainerHigh ColumnLayout { @@ -24,7 +24,7 @@ StyledRect { anchors.right: parent.right anchors.top: root.alignTop ? parent.top : undefined anchors.verticalCenter: root.alignTop ? undefined : parent.verticalCenter - anchors.margins: Appearance.padding.large + anchors.margins: Tokens.padding.large spacing: root.contentSpacing } diff --git a/components/SectionHeader.qml b/components/SectionHeader.qml index a7724769..107c6d36 100644 --- a/components/SectionHeader.qml +++ b/components/SectionHeader.qml @@ -2,7 +2,7 @@ import QtQuick import QtQuick.Layouts import qs.components import qs.services -import qs.config +import Caelestia.Config ColumnLayout { id: root @@ -13,9 +13,9 @@ ColumnLayout { spacing: 0 StyledText { - Layout.topMargin: Appearance.spacing.large + Layout.topMargin: Tokens.spacing.large text: root.title - font.pointSize: Appearance.font.size.larger + font.pointSize: Tokens.font.size.larger font.weight: 500 } diff --git a/components/StateLayer.qml b/components/StateLayer.qml index f3e3ea13..59c5cb23 100644 --- a/components/StateLayer.qml +++ b/components/StateLayer.qml @@ -1,6 +1,6 @@ import QtQuick import qs.services -import qs.config +import Caelestia.Config MouseArea { id: root @@ -63,7 +63,7 @@ MouseArea { properties: "implicitWidth,implicitHeight" from: 0 to: rippleAnim.radius * 2 - easing.bezierCurve: Appearance.anim.curves.standardDecel + easing.bezierCurve: Tokens.anim.curves.standardDecel } Anim { target: ripple @@ -83,7 +83,7 @@ MouseArea { StyledRect { id: ripple - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: root.color opacity: 0 diff --git a/components/StyledText.qml b/components/StyledText.qml index 5bf8add3..051f5804 100644 --- a/components/StyledText.qml +++ b/components/StyledText.qml @@ -2,7 +2,7 @@ pragma ComponentBehavior: Bound import QtQuick import qs.services -import qs.config +import Caelestia.Config Text { id: root @@ -11,13 +11,13 @@ Text { property string animateProp: "scale" property real animateFrom: 0 property real animateTo: 1 - property int animateDuration: Appearance.anim.durations.normal + property int animateDuration: Tokens.anim.durations.normal renderType: Text.NativeRendering textFormat: Text.PlainText color: Colours.palette.m3onSurface - font.family: Appearance.font.family.sans - font.pointSize: Appearance.font.size.smaller + font.family: Tokens.font.family.sans + font.pointSize: Tokens.font.size.smaller Behavior on color { CAnim {} @@ -29,12 +29,12 @@ Text { SequentialAnimation { Anim { to: root.animateFrom - easing.bezierCurve: Appearance.anim.curves.standardAccel + easing.bezierCurve: Tokens.anim.curves.standardAccel } PropertyAction {} Anim { to: root.animateTo - easing.bezierCurve: Appearance.anim.curves.standardDecel + easing.bezierCurve: Tokens.anim.curves.standardDecel } } } diff --git a/components/containers/StyledWindow.qml b/components/containers/StyledWindow.qml index 0adca1fe..57f319c0 100644 --- a/components/containers/StyledWindow.qml +++ b/components/containers/StyledWindow.qml @@ -1,11 +1,22 @@ import Quickshell import Quickshell.Wayland +import Caelestia.Config // qmllint disable uncreatable-type PanelWindow { // qmllint enable uncreatable-type + id: root + required property string name + default property alias contentData: scope.data WlrLayershell.namespace: `caelestia-${name}` color: "transparent" + + ConfigScope { + id: scope + + anchors.fill: parent + screen: root.screen.name + } } diff --git a/components/controls/CircularIndicator.qml b/components/controls/CircularIndicator.qml index 84476500..8bfee428 100644 --- a/components/controls/CircularIndicator.qml +++ b/components/controls/CircularIndicator.qml @@ -3,7 +3,7 @@ import QtQuick import QtQuick.Templates import Caelestia.Internal import qs.services -import qs.config +import Caelestia.Config BusyIndicator { id: root @@ -19,8 +19,8 @@ BusyIndicator { Completing } - property real implicitSize: Appearance.font.size.normal * 3 - property real strokeWidth: Appearance.padding.small * 0.8 + property real implicitSize: Tokens.font.size.normal * 3 + property real strokeWidth: Tokens.padding.small * 0.8 property color fgColour: Colours.palette.m3primary property color bgColour: Colours.palette.m3secondaryContainer @@ -64,7 +64,7 @@ BusyIndicator { transitions: Transition { Anim { properties: "opacity,internalStrokeWidth" - duration: manager.completeEndDuration * Appearance.anim.durations.scale + duration: manager.completeEndDuration * Tokens.anim.durations.scale } } @@ -90,7 +90,7 @@ BusyIndicator { property: "progress" from: 0 to: 1 - duration: manager.duration * Appearance.anim.durations.scale + duration: manager.duration * Tokens.anim.durations.scale } NumberAnimation { @@ -99,7 +99,7 @@ BusyIndicator { property: "completeEndProgress" from: 0 to: 1 - duration: manager.completeEndDuration * Appearance.anim.durations.scale + duration: manager.completeEndDuration * Tokens.anim.durations.scale onFinished: { if (root.animState === CircularIndicator.Completing) root.animState = CircularIndicator.Stopped; diff --git a/components/controls/CircularProgress.qml b/components/controls/CircularProgress.qml index 8cd585ee..4cd5f9f7 100644 --- a/components/controls/CircularProgress.qml +++ b/components/controls/CircularProgress.qml @@ -2,16 +2,16 @@ import ".." import QtQuick import QtQuick.Shapes import qs.services -import qs.config +import Caelestia.Config Shape { id: root property real value property int startAngle: -90 - property int strokeWidth: Appearance.padding.smaller + property int strokeWidth: Tokens.padding.smaller property int padding: 0 - property int spacing: Appearance.spacing.small + property int spacing: Tokens.spacing.small property color fgColour: Colours.palette.m3primary property color bgColour: Colours.palette.m3secondaryContainer @@ -27,7 +27,7 @@ Shape { fillColor: "transparent" strokeColor: root.bgColour strokeWidth: root.strokeWidth - capStyle: Appearance.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap + capStyle: Tokens.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap PathAngleArc { startAngle: root.startAngle + 360 * root.vValue + root.gapAngle @@ -40,7 +40,7 @@ Shape { Behavior on strokeColor { CAnim { - duration: Appearance.anim.durations.large + duration: Tokens.anim.durations.large } } } @@ -49,7 +49,7 @@ Shape { fillColor: "transparent" strokeColor: root.fgColour strokeWidth: root.strokeWidth - capStyle: Appearance.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap + capStyle: Tokens.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap PathAngleArc { startAngle: root.startAngle @@ -62,7 +62,7 @@ Shape { Behavior on strokeColor { CAnim { - duration: Appearance.anim.durations.large + duration: Tokens.anim.durations.large } } } diff --git a/components/controls/CollapsibleSection.qml b/components/controls/CollapsibleSection.qml index 7e164ebb..19c7da9b 100644 --- a/components/controls/CollapsibleSection.qml +++ b/components/controls/CollapsibleSection.qml @@ -3,7 +3,7 @@ import QtQuick import QtQuick.Layouts import qs.components import qs.services -import qs.config +import Caelestia.Config ColumnLayout { id: root @@ -18,14 +18,14 @@ ColumnLayout { signal toggleRequested - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small Layout.fillWidth: true Item { id: sectionHeaderItem Layout.fillWidth: true - Layout.preferredHeight: Math.max(titleRow.implicitHeight + Appearance.padding.normal * 2, 48) + Layout.preferredHeight: Math.max(titleRow.implicitHeight + Tokens.padding.normal * 2, 48) RowLayout { id: titleRow @@ -33,13 +33,13 @@ ColumnLayout { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.leftMargin: Appearance.padding.normal - anchors.rightMargin: Appearance.padding.normal - spacing: Appearance.spacing.normal + anchors.leftMargin: Tokens.padding.normal + anchors.rightMargin: Tokens.padding.normal + spacing: Tokens.spacing.normal StyledText { text: root.title - font.pointSize: Appearance.font.size.larger + font.pointSize: Tokens.font.size.larger font.weight: 500 } @@ -51,12 +51,12 @@ ColumnLayout { text: "expand_more" rotation: root.expanded ? 180 : 0 color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal Behavior on rotation { Anim { - duration: Appearance.anim.durations.small - easing.bezierCurve: Appearance.anim.curves.standard + duration: Tokens.anim.durations.small + easing.bezierCurve: Tokens.anim.curves.standard } } } @@ -70,7 +70,7 @@ ColumnLayout { anchors.fill: parent color: Colours.palette.m3onSurface - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal showHoverBackground: false } } @@ -79,12 +79,12 @@ ColumnLayout { id: contentWrapper Layout.fillWidth: true - Layout.preferredHeight: root.expanded ? (contentColumn.implicitHeight + Appearance.spacing.small * 2) : 0 + Layout.preferredHeight: root.expanded ? (contentColumn.implicitHeight + Tokens.spacing.small * 2) : 0 clip: true Behavior on Layout.preferredHeight { Anim { - easing.bezierCurve: Appearance.anim.curves.standard + easing.bezierCurve: Tokens.anim.curves.standard } } @@ -92,14 +92,14 @@ ColumnLayout { id: backgroundRect anchors.fill: parent - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: Colours.transparency.enabled ? Colours.layer(Colours.palette.m3surfaceContainer, root.nested ? 3 : 2) : (root.nested ? Colours.palette.m3surfaceContainerHigh : Colours.palette.m3surfaceContainer) opacity: root.showBackground && root.expanded ? 1.0 : 0.0 visible: root.showBackground Behavior on opacity { Anim { - easing.bezierCurve: Appearance.anim.curves.standard + easing.bezierCurve: Tokens.anim.curves.standard } } } @@ -109,16 +109,16 @@ ColumnLayout { anchors.left: parent.left anchors.right: parent.right - y: Appearance.spacing.small - anchors.leftMargin: Appearance.padding.normal - anchors.rightMargin: Appearance.padding.normal - anchors.bottomMargin: Appearance.spacing.small - spacing: Appearance.spacing.small + y: Tokens.spacing.small + anchors.leftMargin: Tokens.padding.normal + anchors.rightMargin: Tokens.padding.normal + anchors.bottomMargin: Tokens.spacing.small + spacing: Tokens.spacing.small opacity: root.expanded ? 1.0 : 0.0 Behavior on opacity { Anim { - easing.bezierCurve: Appearance.anim.curves.standard + easing.bezierCurve: Tokens.anim.curves.standard } } @@ -126,12 +126,12 @@ ColumnLayout { id: descriptionText Layout.fillWidth: true - Layout.topMargin: root.description !== "" ? Appearance.spacing.smaller : 0 - Layout.bottomMargin: root.description !== "" ? Appearance.spacing.small : 0 + Layout.topMargin: root.description !== "" ? Tokens.spacing.smaller : 0 + Layout.bottomMargin: root.description !== "" ? Tokens.spacing.small : 0 visible: root.description !== "" text: root.description color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small wrapMode: Text.Wrap } } diff --git a/components/controls/CustomSpinBox.qml b/components/controls/CustomSpinBox.qml index f63b1402..6adb137c 100644 --- a/components/controls/CustomSpinBox.qml +++ b/components/controls/CustomSpinBox.qml @@ -4,7 +4,7 @@ import ".." import QtQuick import QtQuick.Layouts import qs.services -import qs.config +import Caelestia.Config RowLayout { id: root @@ -20,7 +20,7 @@ RowLayout { signal valueModified(value: real) - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small onValueChanged: { if (!root.isEditing) { @@ -73,23 +73,23 @@ RowLayout { root.isEditing = false; } - padding: Appearance.padding.small - leftPadding: Appearance.padding.normal - rightPadding: Appearance.padding.normal + padding: Tokens.padding.small + leftPadding: Tokens.padding.normal + rightPadding: Tokens.padding.normal background: StyledRect { implicitWidth: 100 - radius: Appearance.rounding.small + radius: Tokens.rounding.small color: Colours.tPalette.m3surfaceContainerHigh } } StyledRect { - radius: Appearance.rounding.small + radius: Tokens.rounding.small color: Colours.palette.m3primary implicitWidth: implicitHeight - implicitHeight: upIcon.implicitHeight + Appearance.padding.small * 2 + implicitHeight: upIcon.implicitHeight + Tokens.padding.small * 2 StateLayer { id: upState @@ -120,11 +120,11 @@ RowLayout { } StyledRect { - radius: Appearance.rounding.small + radius: Tokens.rounding.small color: Colours.palette.m3primary implicitWidth: implicitHeight - implicitHeight: downIcon.implicitHeight + Appearance.padding.small * 2 + implicitHeight: downIcon.implicitHeight + Tokens.padding.small * 2 StateLayer { id: downState diff --git a/components/controls/FilledSlider.qml b/components/controls/FilledSlider.qml index c865482c..5a65722f 100644 --- a/components/controls/FilledSlider.qml +++ b/components/controls/FilledSlider.qml @@ -3,7 +3,7 @@ import "../effects" import QtQuick import QtQuick.Templates import qs.services -import qs.config +import Caelestia.Config Slider { id: root @@ -16,7 +16,7 @@ Slider { background: StyledRect { color: Colours.layer(Colours.palette.m3surfaceContainer, 2) - radius: Appearance.rounding.full + radius: Tokens.rounding.full StyledRect { anchors.left: parent.left @@ -51,7 +51,7 @@ Slider { anchors.fill: parent color: Colours.palette.m3inverseSurface - radius: Appearance.rounding.full + radius: Tokens.rounding.full MouseArea { id: handleInteraction @@ -70,8 +70,8 @@ Slider { function update(): void { animate = !moving; binding.when = moving; - font.pointSize = moving ? Appearance.font.size.small : Appearance.font.size.larger; - font.family = moving ? Appearance.font.family.sans : Appearance.font.family.material; + font.pointSize = moving ? Tokens.font.size.small : Tokens.font.size.larger; + font.family = moving ? Tokens.font.family.sans : Tokens.font.family.material; } text: root.icon @@ -96,8 +96,8 @@ Slider { target: icon property: "scale" to: 0 - duration: Appearance.anim.durations.normal / 2 - easing.bezierCurve: Appearance.anim.curves.standardAccel + duration: Tokens.anim.durations.normal / 2 + easing.bezierCurve: Tokens.anim.curves.standardAccel } ScriptAction { script: icon.update() @@ -106,8 +106,8 @@ Slider { target: icon property: "scale" to: 1 - duration: Appearance.anim.durations.normal / 2 - easing.bezierCurve: Appearance.anim.curves.standardDecel + duration: Tokens.anim.durations.normal / 2 + easing.bezierCurve: Tokens.anim.curves.standardDecel } } } @@ -140,7 +140,7 @@ Slider { Behavior on value { Anim { - duration: Appearance.anim.durations.large + duration: Tokens.anim.durations.large } } } diff --git a/components/controls/IconButton.qml b/components/controls/IconButton.qml index 56999894..60973094 100644 --- a/components/controls/IconButton.qml +++ b/components/controls/IconButton.qml @@ -1,7 +1,7 @@ import ".." import QtQuick import qs.services -import qs.config +import Caelestia.Config StyledRect { id: root @@ -15,7 +15,7 @@ StyledRect { property alias icon: label.text property bool checked property bool toggle - property real padding: type === IconButton.Text ? Appearance.padding.small / 2 : Appearance.padding.smaller + property real padding: type === IconButton.Text ? Tokens.padding.small / 2 : Tokens.padding.smaller property alias font: label.font property int type: IconButton.Filled property bool disabled @@ -44,7 +44,7 @@ StyledRect { onCheckedChanged: internalChecked = checked - radius: internalChecked ? Appearance.rounding.small : implicitHeight / 2 * Math.min(1, Appearance.rounding.scale) + radius: internalChecked ? Tokens.rounding.small : implicitHeight / 2 * Math.min(1, Tokens.rounding.scale) color: type === IconButton.Text ? "transparent" : disabled ? disabledColour : internalChecked ? activeColour : inactiveColour implicitWidth: implicitHeight diff --git a/components/controls/IconTextButton.qml b/components/controls/IconTextButton.qml index d213b9be..1fbf74eb 100644 --- a/components/controls/IconTextButton.qml +++ b/components/controls/IconTextButton.qml @@ -2,7 +2,7 @@ import ".." import QtQuick import QtQuick.Layouts import qs.services -import qs.config +import Caelestia.Config StyledRect { id: root @@ -17,8 +17,8 @@ StyledRect { property alias text: label.text property bool checked property bool toggle - property real horizontalPadding: Appearance.padding.normal - property real verticalPadding: Appearance.padding.smaller + property real horizontalPadding: Tokens.padding.normal + property real verticalPadding: Tokens.padding.smaller property alias font: label.font property int type: IconTextButton.Filled @@ -36,7 +36,7 @@ StyledRect { onCheckedChanged: internalChecked = checked - radius: internalChecked ? Appearance.rounding.small : implicitHeight / 2 * Math.min(1, Appearance.rounding.scale) + radius: internalChecked ? Tokens.rounding.small : implicitHeight / 2 * Math.min(1, Tokens.rounding.scale) color: type === IconTextButton.Text ? "transparent" : internalChecked ? activeColour : inactiveColour implicitWidth: row.implicitWidth + horizontalPadding * 2 @@ -58,7 +58,7 @@ StyledRect { id: row anchors.centerIn: parent - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small MaterialIcon { id: iconLabel diff --git a/components/controls/Menu.qml b/components/controls/Menu.qml index 320f318c..6c375767 100644 --- a/components/controls/Menu.qml +++ b/components/controls/Menu.qml @@ -5,7 +5,7 @@ import "../effects" import QtQuick import QtQuick.Layouts import qs.services -import qs.config +import Caelestia.Config Elevation { id: root @@ -16,7 +16,7 @@ Elevation { signal itemSelected(item: MenuItem) - radius: Appearance.rounding.small / 2 + radius: Tokens.rounding.small / 2 level: 2 implicitWidth: Math.max(200, column.implicitWidth) @@ -46,8 +46,8 @@ Elevation { readonly property bool active: modelData === root.active Layout.fillWidth: true - implicitWidth: menuOptionRow.implicitWidth + Appearance.padding.normal * 2 - implicitHeight: menuOptionRow.implicitHeight + Appearance.padding.normal * 2 + implicitWidth: menuOptionRow.implicitWidth + Tokens.padding.normal * 2 + implicitHeight: menuOptionRow.implicitHeight + Tokens.padding.normal * 2 color: Qt.alpha(Colours.palette.m3secondaryContainer, active ? 1 : 0) @@ -67,8 +67,8 @@ Elevation { id: menuOptionRow anchors.fill: parent - anchors.margins: Appearance.padding.normal - spacing: Appearance.spacing.small + anchors.margins: Tokens.padding.normal + spacing: Tokens.spacing.small MaterialIcon { Layout.alignment: Qt.AlignVCenter @@ -102,14 +102,14 @@ Elevation { Behavior on opacity { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial } } Behavior on implicitHeight { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } } diff --git a/components/controls/SpinBoxRow.qml b/components/controls/SpinBoxRow.qml index b2c6ef1a..c5e5c082 100644 --- a/components/controls/SpinBoxRow.qml +++ b/components/controls/SpinBoxRow.qml @@ -3,7 +3,7 @@ import QtQuick import QtQuick.Layouts import qs.components import qs.services -import qs.config +import Caelestia.Config StyledRect { id: root @@ -16,8 +16,8 @@ StyledRect { property var onValueModified: function (value) {} Layout.fillWidth: true - implicitHeight: row.implicitHeight + Appearance.padding.large * 2 - radius: Appearance.rounding.normal + implicitHeight: row.implicitHeight + Tokens.padding.large * 2 + radius: Tokens.rounding.normal color: Colours.layer(Colours.palette.m3surfaceContainer, 2) Behavior on implicitHeight { @@ -30,8 +30,8 @@ StyledRect { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.large - spacing: Appearance.spacing.normal + anchors.margins: Tokens.padding.large + spacing: Tokens.spacing.normal StyledText { Layout.fillWidth: true diff --git a/components/controls/SplitButton.qml b/components/controls/SplitButton.qml index 0e9aef8f..8759635c 100644 --- a/components/controls/SplitButton.qml +++ b/components/controls/SplitButton.qml @@ -2,7 +2,7 @@ import ".." import QtQuick import QtQuick.Layouts import qs.services -import qs.config +import Caelestia.Config Row { id: root @@ -12,8 +12,8 @@ Row { Tonal } - property real horizontalPadding: Appearance.padding.normal - property real verticalPadding: Appearance.padding.smaller + property real horizontalPadding: Tokens.padding.normal + property real verticalPadding: Tokens.padding.smaller property int type: SplitButton.Filled property bool disabled property bool menuOnTop @@ -33,12 +33,12 @@ Row { property color disabledColour: Qt.alpha(Colours.palette.m3onSurface, 0.1) property color disabledTextColour: Qt.alpha(Colours.palette.m3onSurface, 0.38) - spacing: Math.floor(Appearance.spacing.small / 2) + spacing: Math.floor(Tokens.spacing.small / 2) StyledRect { - radius: implicitHeight / 2 * Math.min(1, Appearance.rounding.scale) - topRightRadius: Appearance.rounding.small / 2 - bottomRightRadius: Appearance.rounding.small / 2 + radius: implicitHeight / 2 * Math.min(1, Tokens.rounding.scale) + topRightRadius: Tokens.rounding.small / 2 + bottomRightRadius: Tokens.rounding.small / 2 color: root.disabled ? root.disabledColour : root.colour implicitWidth: textRow.implicitWidth + root.horizontalPadding * 2 @@ -62,7 +62,7 @@ Row { anchors.centerIn: parent anchors.horizontalCenterOffset: Math.floor(root.verticalPadding / 4) - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small MaterialIcon { id: iconLabel @@ -86,7 +86,7 @@ Row { Behavior on Layout.preferredWidth { Anim { - easing.bezierCurve: Appearance.anim.curves.emphasized + easing.bezierCurve: Tokens.anim.curves.emphasized } } } @@ -96,9 +96,9 @@ Row { StyledRect { id: expandBtn - property real rad: root.expanded ? implicitHeight / 2 * Math.min(1, Appearance.rounding.scale) : Appearance.rounding.small / 2 + property real rad: root.expanded ? implicitHeight / 2 * Math.min(1, Tokens.rounding.scale) : Tokens.rounding.small / 2 - radius: implicitHeight / 2 * Math.min(1, Appearance.rounding.scale) + radius: implicitHeight / 2 * Math.min(1, Tokens.rounding.scale) topLeftRadius: rad bottomLeftRadius: rad color: root.disabled ? root.disabledColour : root.colour @@ -157,8 +157,8 @@ Row { anchors.top: parent.bottom anchors.right: parent.right - anchors.topMargin: Appearance.spacing.small - anchors.bottomMargin: Appearance.spacing.small + anchors.topMargin: Tokens.spacing.small + anchors.bottomMargin: Tokens.spacing.small } } } diff --git a/components/controls/SplitButtonRow.qml b/components/controls/SplitButtonRow.qml index a58e46d4..9082ce1d 100644 --- a/components/controls/SplitButtonRow.qml +++ b/components/controls/SplitButtonRow.qml @@ -5,7 +5,7 @@ import QtQuick import QtQuick.Layouts import qs.components import qs.services -import qs.config +import Caelestia.Config StyledRect { id: root @@ -21,8 +21,8 @@ StyledRect { signal selected(item: MenuItem) Layout.fillWidth: true - implicitHeight: row.implicitHeight + Appearance.padding.large * 2 - radius: Appearance.rounding.normal + implicitHeight: row.implicitHeight + Tokens.padding.large * 2 + radius: Tokens.rounding.normal color: Colours.layer(Colours.palette.m3surfaceContainer, 2) clip: false @@ -33,8 +33,8 @@ StyledRect { id: row anchors.fill: parent - anchors.margins: Appearance.padding.large - spacing: Appearance.spacing.normal + anchors.margins: Tokens.padding.large + spacing: Tokens.spacing.normal StyledText { Layout.fillWidth: true diff --git a/components/controls/StyledInputField.qml b/components/controls/StyledInputField.qml index fb312128..7cbf26c5 100644 --- a/components/controls/StyledInputField.qml +++ b/components/controls/StyledInputField.qml @@ -4,7 +4,7 @@ import ".." import QtQuick import qs.components import qs.services -import qs.config +import Caelestia.Config Item { id: root @@ -22,14 +22,14 @@ Item { signal editingFinished implicitWidth: 70 - implicitHeight: inputField.implicitHeight + Appearance.padding.small * 2 + implicitHeight: inputField.implicitHeight + Tokens.padding.small * 2 StyledRect { id: container anchors.fill: parent color: inputHover.containsMouse || inputField.activeFocus ? Colours.layer(Colours.palette.m3surfaceContainer, 3) : Colours.layer(Colours.palette.m3surfaceContainer, 2) - radius: Appearance.rounding.small + radius: Tokens.rounding.small border.width: 1 border.color: inputField.activeFocus ? Colours.palette.m3primary : Qt.alpha(Colours.palette.m3outline, 0.3) opacity: root.enabled ? 1 : 0.5 @@ -55,7 +55,7 @@ Item { id: inputField anchors.centerIn: parent - width: parent.width - Appearance.padding.normal + width: parent.width - Tokens.padding.normal horizontalAlignment: root.horizontalAlignment validator: root.validator readOnly: root.readOnly diff --git a/components/controls/StyledRadioButton.qml b/components/controls/StyledRadioButton.qml index 458e6fe0..a2e99327 100644 --- a/components/controls/StyledRadioButton.qml +++ b/components/controls/StyledRadioButton.qml @@ -2,12 +2,12 @@ import QtQuick import QtQuick.Templates import qs.components import qs.services -import qs.config +import Caelestia.Config RadioButton { id: root - font.pointSize: Appearance.font.size.smaller + font.pointSize: Tokens.font.size.smaller implicitWidth: implicitIndicatorWidth + implicitContentWidth + contentItem.anchors.leftMargin implicitHeight: Math.max(implicitIndicatorHeight, implicitContentHeight) @@ -17,7 +17,7 @@ RadioButton { implicitWidth: 20 implicitHeight: 20 - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: "transparent" border.color: root.checked ? Colours.palette.m3primary : Colours.palette.m3onSurfaceVariant border.width: 2 @@ -28,7 +28,7 @@ RadioButton { root.click(); } - anchors.margins: -Appearance.padding.smaller + anchors.margins: -Tokens.padding.smaller color: root.checked ? Colours.palette.m3onSurface : Colours.palette.m3primary z: -1 } @@ -38,7 +38,7 @@ RadioButton { implicitWidth: 8 implicitHeight: 8 - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: Qt.alpha(Colours.palette.m3primary, root.checked ? 1 : 0) } @@ -52,6 +52,6 @@ RadioButton { font.pointSize: root.font.pointSize anchors.verticalCenter: parent.verticalCenter anchors.left: outerCircle.right - anchors.leftMargin: Appearance.spacing.smaller + anchors.leftMargin: Tokens.spacing.smaller } } diff --git a/components/controls/StyledScrollBar.qml b/components/controls/StyledScrollBar.qml index 4c30dda3..4cd86a4a 100644 --- a/components/controls/StyledScrollBar.qml +++ b/components/controls/StyledScrollBar.qml @@ -2,7 +2,7 @@ import ".." import QtQuick import QtQuick.Templates import qs.services -import qs.config +import Caelestia.Config ScrollBar { id: root @@ -45,7 +45,7 @@ ScrollBar { } } } - implicitWidth: Appearance.padding.small + implicitWidth: Tokens.padding.small contentItem: StyledRect { anchors.left: parent.left @@ -61,7 +61,7 @@ ScrollBar { return 0.6; return 0; } - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: Colours.palette.m3secondary MouseArea { diff --git a/components/controls/StyledSlider.qml b/components/controls/StyledSlider.qml index 21b2f2cb..09349635 100644 --- a/components/controls/StyledSlider.qml +++ b/components/controls/StyledSlider.qml @@ -2,7 +2,7 @@ import QtQuick import QtQuick.Templates import qs.components import qs.services -import qs.config +import Caelestia.Config Slider { id: root @@ -18,7 +18,7 @@ Slider { implicitWidth: root.handle.x - root.implicitHeight / 6 color: Colours.palette.m3primary - radius: Appearance.rounding.full + radius: Tokens.rounding.full topRightRadius: root.implicitHeight / 15 bottomRightRadius: root.implicitHeight / 15 } @@ -33,7 +33,7 @@ Slider { implicitWidth: parent.width - root.handle.x - root.handle.implicitWidth - root.implicitHeight / 6 color: Colours.palette.m3surfaceContainerHighest - radius: Appearance.rounding.full + radius: Tokens.rounding.full topLeftRadius: root.implicitHeight / 15 bottomLeftRadius: root.implicitHeight / 15 } @@ -46,7 +46,7 @@ Slider { implicitHeight: root.implicitHeight color: Colours.palette.m3primary - radius: Appearance.rounding.full + radius: Tokens.rounding.full MouseArea { anchors.fill: parent diff --git a/components/controls/StyledSwitch.qml b/components/controls/StyledSwitch.qml index b56410a9..92cde7da 100644 --- a/components/controls/StyledSwitch.qml +++ b/components/controls/StyledSwitch.qml @@ -3,7 +3,7 @@ import QtQuick import QtQuick.Shapes import QtQuick.Templates import qs.services -import qs.config +import Caelestia.Config Switch { id: root @@ -14,21 +14,21 @@ Switch { implicitHeight: implicitIndicatorHeight indicator: StyledRect { - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: root.checked ? Colours.palette.m3primary : Colours.layer(Colours.palette.m3surfaceContainerHighest, root.cLayer) implicitWidth: implicitHeight * 1.7 - implicitHeight: Appearance.font.size.normal + Appearance.padding.smaller * 2 + implicitHeight: Tokens.font.size.normal + Tokens.padding.smaller * 2 StyledRect { readonly property real nonAnimWidth: root.pressed ? implicitHeight * 1.3 : implicitHeight - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: root.checked ? Colours.palette.m3onPrimary : Colours.layer(Colours.palette.m3outline, root.cLayer + 1) - x: root.checked ? parent.implicitWidth - nonAnimWidth - Appearance.padding.small / 2 : Appearance.padding.small / 2 + x: root.checked ? parent.implicitWidth - nonAnimWidth - Tokens.padding.small / 2 : Tokens.padding.small / 2 implicitWidth: nonAnimWidth - implicitHeight: parent.implicitHeight - Appearance.padding.small + implicitHeight: parent.implicitHeight - Tokens.padding.small anchors.verticalCenter: parent.verticalCenter StyledRect { @@ -83,15 +83,15 @@ Switch { anchors.centerIn: parent width: height - height: parent.implicitHeight - Appearance.padding.small * 2 + height: parent.implicitHeight - Tokens.padding.small * 2 preferredRendererType: Shape.CurveRenderer asynchronous: true ShapePath { - strokeWidth: Appearance.font.size.larger * 0.15 + strokeWidth: Tokens.font.size.larger * 0.15 strokeColor: root.checked ? Colours.palette.m3primary : Colours.palette.m3surfaceContainerHighest fillColor: "transparent" - capStyle: Appearance.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap + capStyle: Tokens.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap startX: icon.start1.x startY: icon.start1.y @@ -145,8 +145,8 @@ Switch { } component PropAnim: PropertyAnimation { - duration: Appearance.anim.durations.normal + duration: Tokens.anim.durations.normal easing.type: Easing.BezierSpline - easing.bezierCurve: Appearance.anim.curves.standard + easing.bezierCurve: Tokens.anim.curves.standard } } diff --git a/components/controls/StyledTextField.qml b/components/controls/StyledTextField.qml index bf8e5b54..9a810f79 100644 --- a/components/controls/StyledTextField.qml +++ b/components/controls/StyledTextField.qml @@ -4,15 +4,15 @@ import ".." import QtQuick import QtQuick.Controls import qs.services -import qs.config +import Caelestia.Config TextField { id: root color: Colours.palette.m3onSurface placeholderTextColor: Colours.palette.m3outline - font.family: Appearance.font.family.sans - font.pointSize: Appearance.font.size.smaller + font.family: Tokens.font.family.sans + font.pointSize: Tokens.font.size.smaller renderType: echoMode === TextField.Password ? TextField.QtRendering : TextField.NativeRendering cursorVisible: !readOnly @@ -25,7 +25,7 @@ TextField { implicitWidth: 2 color: Colours.palette.m3primary - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal Connections { function onCursorPositionChanged(): void { @@ -61,7 +61,7 @@ TextField { Behavior on opacity { Anim { - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small } } } diff --git a/components/controls/SwitchRow.qml b/components/controls/SwitchRow.qml index 076080b6..01a42dd9 100644 --- a/components/controls/SwitchRow.qml +++ b/components/controls/SwitchRow.qml @@ -3,7 +3,7 @@ import QtQuick import QtQuick.Layouts import qs.components import qs.services -import qs.config +import Caelestia.Config StyledRect { id: root @@ -13,8 +13,8 @@ StyledRect { property var onToggled: function (checked) {} Layout.fillWidth: true - implicitHeight: row.implicitHeight + Appearance.padding.large * 2 - radius: Appearance.rounding.normal + implicitHeight: row.implicitHeight + Tokens.padding.large * 2 + radius: Tokens.rounding.normal color: Colours.layer(Colours.palette.m3surfaceContainer, 2) Behavior on implicitHeight { @@ -27,8 +27,8 @@ StyledRect { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.large - spacing: Appearance.spacing.normal + anchors.margins: Tokens.padding.large + spacing: Tokens.spacing.normal StyledText { Layout.fillWidth: true diff --git a/components/controls/TextButton.qml b/components/controls/TextButton.qml index 1066910f..a74c49e1 100644 --- a/components/controls/TextButton.qml +++ b/components/controls/TextButton.qml @@ -1,7 +1,7 @@ import ".." import QtQuick import qs.services -import qs.config +import Caelestia.Config StyledRect { id: root @@ -15,8 +15,8 @@ StyledRect { property alias text: label.text property bool checked property bool toggle - property real horizontalPadding: Appearance.padding.normal - property real verticalPadding: Appearance.padding.smaller + property real horizontalPadding: Tokens.padding.normal + property real verticalPadding: Tokens.padding.smaller property alias font: label.font property int type: TextButton.Filled @@ -47,7 +47,7 @@ StyledRect { onCheckedChanged: internalChecked = checked - radius: internalChecked ? Appearance.rounding.small : implicitHeight / 2 * Math.min(1, Appearance.rounding.scale) + radius: internalChecked ? Tokens.rounding.small : implicitHeight / 2 * Math.min(1, Tokens.rounding.scale) color: type === TextButton.Text ? "transparent" : internalChecked ? activeColour : inactiveColour implicitWidth: label.implicitWidth + horizontalPadding * 2 diff --git a/components/controls/ToggleButton.qml b/components/controls/ToggleButton.qml index 1531b8b4..4e4174b0 100644 --- a/components/controls/ToggleButton.qml +++ b/components/controls/ToggleButton.qml @@ -6,7 +6,7 @@ import QtQuick.Layouts import qs.components import qs.components.controls import qs.services -import qs.config +import Caelestia.Config StyledRect { id: root @@ -15,9 +15,9 @@ StyledRect { property string icon property string label property string accent: "Secondary" - property real iconSize: Appearance.font.size.large - property real horizontalPadding: Appearance.padding.large - property real verticalPadding: Appearance.padding.normal + property real iconSize: Tokens.font.size.large + property real horizontalPadding: Tokens.padding.large + property real verticalPadding: Tokens.padding.normal property string tooltip: "" property bool hovered: false @@ -26,10 +26,10 @@ StyledRect { Component.onCompleted: { hovered = toggleStateLayer.containsMouse; } - Layout.preferredWidth: implicitWidth + (toggleStateLayer.pressed ? Appearance.padding.normal * 2 : toggled ? Appearance.padding.small * 2 : 0) + Layout.preferredWidth: implicitWidth + (toggleStateLayer.pressed ? Tokens.padding.normal * 2 : toggled ? Tokens.padding.small * 2 : 0) implicitWidth: toggleBtnInner.implicitWidth + horizontalPadding * 2 implicitHeight: toggleBtnIcon.implicitHeight + verticalPadding * 2 - radius: toggled || toggleStateLayer.pressed ? Appearance.rounding.small : Math.min(width, height) / 2 * Math.min(1, Appearance.rounding.scale) + radius: toggled || toggleStateLayer.pressed ? Tokens.rounding.small : Math.min(width, height) / 2 * Math.min(1, Tokens.rounding.scale) color: toggled ? Colours.palette[`m3${accent.toLowerCase()}`] : Colours.palette[`m3${accent.toLowerCase()}Container`] Connections { @@ -57,7 +57,7 @@ StyledRect { id: toggleBtnInner anchors.centerIn: parent - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal MaterialIcon { id: toggleBtnIcon @@ -87,15 +87,15 @@ StyledRect { Behavior on radius { Anim { - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } } Behavior on Layout.preferredWidth { Anim { - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } } diff --git a/components/controls/ToggleRow.qml b/components/controls/ToggleRow.qml index 2ec35dc7..01e9cc0e 100644 --- a/components/controls/ToggleRow.qml +++ b/components/controls/ToggleRow.qml @@ -2,7 +2,7 @@ import QtQuick import QtQuick.Layouts import qs.components import qs.components.controls -import qs.config +import Caelestia.Config RowLayout { id: root @@ -12,7 +12,7 @@ RowLayout { property alias toggle: toggle Layout.fillWidth: true - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal StyledText { Layout.fillWidth: true diff --git a/components/controls/Tooltip.qml b/components/controls/Tooltip.qml index d550cc92..fdb27bea 100644 --- a/components/controls/Tooltip.qml +++ b/components/controls/Tooltip.qml @@ -3,7 +3,7 @@ import QtQuick import QtQuick.Controls import qs.components.effects import qs.services -import qs.config +import Caelestia.Config Popup { id: root @@ -44,10 +44,10 @@ Popup { let newX = targetCenterX - tooltipWidth / 2; // Position tooltip above target - let newY = targetPos.y - tooltipHeight - Appearance.spacing.small; + let newY = targetPos.y - tooltipHeight - Tokens.spacing.small; // Keep within bounds - const padding = Appearance.padding.normal; + const padding = Tokens.padding.normal; if (newX < padding) { newX = padding; } else if (newX + tooltipWidth > (parent.width - padding)) { @@ -100,8 +100,8 @@ Popup { property: "opacity" from: 0 to: 1 - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } } @@ -110,19 +110,19 @@ Popup { property: "opacity" from: 1 to: 0 - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } } contentItem: StyledRect { id: tooltipRect - implicitWidth: tooltipText.implicitWidth + Appearance.padding.normal * 2 - implicitHeight: tooltipText.implicitHeight + Appearance.padding.smaller * 2 + implicitWidth: tooltipText.implicitWidth + Tokens.padding.normal * 2 + implicitHeight: tooltipText.implicitHeight + Tokens.padding.smaller * 2 color: Colours.palette.m3surfaceContainerHighest - radius: Appearance.rounding.small + radius: Tokens.rounding.small antialiasing: true // Add elevation for depth @@ -140,7 +140,7 @@ Popup { text: root.text color: Colours.palette.m3onSurface - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } } diff --git a/components/effects/InnerBorder.qml b/components/effects/InnerBorder.qml index 462f77af..2770c9bc 100644 --- a/components/effects/InnerBorder.qml +++ b/components/effects/InnerBorder.qml @@ -4,7 +4,7 @@ import ".." import QtQuick import QtQuick.Effects import qs.services -import qs.config +import Caelestia.Config StyledRect { property alias innerRadius: maskInner.radius @@ -37,8 +37,8 @@ StyledRect { id: maskInner anchors.fill: parent - anchors.margins: Appearance.padding.normal - radius: Appearance.rounding.small + anchors.margins: Tokens.padding.normal + radius: Tokens.rounding.small } } } diff --git a/components/filedialog/CurrentItem.qml b/components/filedialog/CurrentItem.qml index 0603a626..d410b13c 100644 --- a/components/filedialog/CurrentItem.qml +++ b/components/filedialog/CurrentItem.qml @@ -2,15 +2,15 @@ import ".." import QtQuick import QtQuick.Shapes import qs.services -import qs.config +import Caelestia.Config Item { id: root required property var currentItem - implicitWidth: content.implicitWidth + Appearance.padding.larger + content.anchors.rightMargin - implicitHeight: currentItem ? content.implicitHeight + Appearance.padding.normal + content.anchors.bottomMargin : 0 + implicitWidth: content.implicitWidth + Tokens.padding.larger + content.anchors.rightMargin + implicitHeight: currentItem ? content.implicitHeight + Tokens.padding.normal + content.anchors.bottomMargin : 0 Shape { preferredRendererType: Shape.CurveRenderer @@ -18,7 +18,7 @@ Item { ShapePath { id: path - readonly property real rounding: Appearance.rounding.small + readonly property real rounding: Tokens.rounding.small readonly property bool flatten: root.implicitHeight < rounding * 2 readonly property real roundingY: flatten ? root.implicitHeight / 2 : rounding @@ -76,8 +76,8 @@ Item { anchors.right: parent.right anchors.bottom: parent.bottom - anchors.rightMargin: Appearance.padding.larger - Appearance.padding.small - anchors.bottomMargin: Appearance.padding.normal - Appearance.padding.small + anchors.rightMargin: Tokens.padding.larger - Tokens.padding.small + anchors.bottomMargin: Tokens.padding.normal - Tokens.padding.small Connections { function onCurrentItemChanged(): void { diff --git a/components/filedialog/DialogButtons.qml b/components/filedialog/DialogButtons.qml index 725f8fc9..94cbd72d 100644 --- a/components/filedialog/DialogButtons.qml +++ b/components/filedialog/DialogButtons.qml @@ -1,7 +1,7 @@ import QtQuick.Layouts import qs.components import qs.services -import qs.config +import Caelestia.Config StyledRect { id: root @@ -9,7 +9,7 @@ StyledRect { required property var dialog required property FolderContents folder - implicitHeight: inner.implicitHeight + Appearance.padding.normal * 2 + implicitHeight: inner.implicitHeight + Tokens.padding.normal * 2 color: Colours.tPalette.m3surfaceContainer @@ -17,9 +17,9 @@ StyledRect { id: inner anchors.fill: parent - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small StyledText { text: qsTr("Filter:") @@ -28,14 +28,14 @@ StyledRect { StyledRect { Layout.fillWidth: true Layout.fillHeight: true - Layout.rightMargin: Appearance.spacing.normal + Layout.rightMargin: Tokens.spacing.normal color: Colours.tPalette.m3surfaceContainerHigh - radius: Appearance.rounding.small + radius: Tokens.rounding.small StyledText { anchors.fill: parent - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal text: `${root.dialog.filterLabel} (${root.dialog.filters.map(f => `*.${f}`).join(", ")})` } @@ -43,10 +43,10 @@ StyledRect { StyledRect { color: Colours.tPalette.m3surfaceContainerHigh - radius: Appearance.rounding.small + radius: Tokens.rounding.small - implicitWidth: cancelText.implicitWidth + Appearance.padding.normal * 2 - implicitHeight: cancelText.implicitHeight + Appearance.padding.normal * 2 + implicitWidth: cancelText.implicitWidth + Tokens.padding.normal * 2 + implicitHeight: cancelText.implicitHeight + Tokens.padding.normal * 2 StateLayer { function onClicked(): void { @@ -60,7 +60,7 @@ StyledRect { id: selectText anchors.centerIn: parent - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal text: qsTr("Select") color: root.dialog.selectionValid ? Colours.palette.m3onSurface : Colours.palette.m3outline @@ -69,10 +69,10 @@ StyledRect { StyledRect { color: Colours.tPalette.m3surfaceContainerHigh - radius: Appearance.rounding.small + radius: Tokens.rounding.small - implicitWidth: cancelText.implicitWidth + Appearance.padding.normal * 2 - implicitHeight: cancelText.implicitHeight + Appearance.padding.normal * 2 + implicitWidth: cancelText.implicitWidth + Tokens.padding.normal * 2 + implicitHeight: cancelText.implicitHeight + Tokens.padding.normal * 2 StateLayer { function onClicked(): void { @@ -84,7 +84,7 @@ StyledRect { id: cancelText anchors.centerIn: parent - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal text: qsTr("Cancel") } diff --git a/components/filedialog/FolderContents.qml b/components/filedialog/FolderContents.qml index 56a4a284..980bd3e1 100644 --- a/components/filedialog/FolderContents.qml +++ b/components/filedialog/FolderContents.qml @@ -10,7 +10,7 @@ import qs.components.controls import qs.components.filedialog import qs.components.images import qs.services -import qs.config +import Caelestia.Config import qs.utils Item { @@ -42,8 +42,8 @@ Item { Rectangle { anchors.fill: parent - anchors.margins: Appearance.padding.small - radius: Appearance.rounding.small + anchors.margins: Tokens.padding.small + radius: Tokens.rounding.small } } @@ -59,14 +59,14 @@ Item { Layout.alignment: Qt.AlignHCenter text: "scan_delete" color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.extraLarge * 2 + font.pointSize: Tokens.font.size.extraLarge * 2 font.weight: 500 } StyledText { text: qsTr("This folder is empty") color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large font.weight: 500 } } @@ -80,10 +80,10 @@ Item { id: view anchors.fill: parent - anchors.margins: Appearance.padding.small + Appearance.padding.normal + anchors.margins: Tokens.padding.small + Tokens.padding.normal - cellWidth: Sizes.itemWidth + Appearance.spacing.small - cellHeight: Sizes.itemWidth + Appearance.spacing.small * 2 + Appearance.padding.normal * 2 + 1 + cellWidth: Sizes.itemWidth + Tokens.spacing.small + cellHeight: Sizes.itemWidth + Tokens.spacing.small * 2 + Tokens.padding.normal * 2 + 1 clip: true focus: true @@ -120,8 +120,8 @@ Item { properties: "opacity,scale" from: 0 to: 1 - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } @@ -140,12 +140,12 @@ Item { Anim { properties: "opacity,scale" to: 1 - easing.bezierCurve: Appearance.anim.curves.standardDecel + easing.bezierCurve: Tokens.anim.curves.standardDecel } Anim { properties: "x,y" - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } } @@ -153,7 +153,7 @@ Item { CurrentItem { anchors.right: parent.right anchors.bottom: parent.bottom - anchors.margins: Appearance.padding.small + anchors.margins: Tokens.padding.small currentItem: view.currentItem } @@ -164,12 +164,12 @@ Item { required property int index required property FileSystemEntry modelData - readonly property real nonAnimHeight: icon.implicitHeight + name.anchors.topMargin + name.implicitHeight + Appearance.padding.normal * 2 + readonly property real nonAnimHeight: icon.implicitHeight + name.anchors.topMargin + name.implicitHeight + Tokens.padding.normal * 2 implicitWidth: Sizes.itemWidth implicitHeight: nonAnimHeight - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: Qt.alpha(Colours.tPalette.m3surfaceContainerHighest, GridView.isCurrentItem ? Colours.tPalette.m3surfaceContainerHighest.a : 0) z: GridView.isCurrentItem || implicitHeight !== nonAnimHeight ? 1 : 0 clip: true @@ -192,9 +192,9 @@ Item { anchors.horizontalCenter: parent.horizontalCenter anchors.top: parent.top - anchors.topMargin: Appearance.padding.normal + anchors.topMargin: Tokens.padding.normal - implicitSize: Sizes.itemWidth - Appearance.padding.normal * 2 + implicitSize: Sizes.itemWidth - Tokens.padding.normal * 2 Component.onCompleted: { const file = item.modelData; @@ -215,8 +215,8 @@ Item { anchors.left: parent.left anchors.right: parent.right anchors.top: icon.bottom - anchors.topMargin: Appearance.spacing.small - anchors.margins: Appearance.padding.normal + anchors.topMargin: Tokens.spacing.small + anchors.margins: Tokens.padding.normal horizontalAlignment: Text.AlignHCenter elide: item.GridView.isCurrentItem ? Text.ElideNone : Text.ElideRight diff --git a/components/filedialog/HeaderBar.qml b/components/filedialog/HeaderBar.qml index b44ac58b..c114bbd8 100644 --- a/components/filedialog/HeaderBar.qml +++ b/components/filedialog/HeaderBar.qml @@ -4,15 +4,15 @@ import ".." import QtQuick import QtQuick.Layouts import qs.services -import qs.config +import Caelestia.Config StyledRect { id: root required property var dialog - implicitWidth: inner.implicitWidth + Appearance.padding.normal * 2 - implicitHeight: inner.implicitHeight + Appearance.padding.normal * 2 + implicitWidth: inner.implicitWidth + Tokens.padding.normal * 2 + implicitHeight: inner.implicitHeight + Tokens.padding.normal * 2 color: Colours.tPalette.m3surfaceContainer @@ -20,19 +20,19 @@ StyledRect { id: inner anchors.fill: parent - anchors.margins: Appearance.padding.normal - spacing: Appearance.spacing.small + anchors.margins: Tokens.padding.normal + spacing: Tokens.spacing.small Item { implicitWidth: implicitHeight - implicitHeight: upIcon.implicitHeight + Appearance.padding.small * 2 + implicitHeight: upIcon.implicitHeight + Tokens.padding.small * 2 StateLayer { function onClicked(): void { root.dialog.cwd.pop(); } - radius: Appearance.rounding.small + radius: Tokens.rounding.small disabled: root.dialog.cwd.length === 1 } @@ -49,7 +49,7 @@ StyledRect { StyledRect { Layout.fillWidth: true - radius: Appearance.rounding.small + radius: Tokens.rounding.small color: Colours.tPalette.m3surfaceContainerHigh implicitHeight: pathComponents.implicitHeight + pathComponents.anchors.margins * 2 @@ -58,10 +58,10 @@ StyledRect { id: pathComponents anchors.fill: parent - anchors.margins: Appearance.padding.small / 2 + anchors.margins: Tokens.padding.small / 2 anchors.leftMargin: 0 - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small Repeater { model: root.dialog.cwd @@ -76,7 +76,7 @@ StyledRect { Loader { asynchronous: true - Layout.rightMargin: Appearance.spacing.small + Layout.rightMargin: Tokens.spacing.small active: folder.index > 0 sourceComponent: StyledText { text: "/" @@ -86,8 +86,8 @@ StyledRect { } Item { - implicitWidth: homeIcon.implicitWidth + (homeIcon.active ? Appearance.padding.small : 0) + folderName.implicitWidth + Appearance.padding.normal * 2 - implicitHeight: folderName.implicitHeight + Appearance.padding.small * 2 + implicitWidth: homeIcon.implicitWidth + (homeIcon.active ? Tokens.padding.small : 0) + folderName.implicitWidth + Tokens.padding.normal * 2 + implicitHeight: folderName.implicitHeight + Tokens.padding.small * 2 Loader { asynchronous: true @@ -98,7 +98,7 @@ StyledRect { root.dialog.cwd = root.dialog.cwd.slice(0, folder.index + 1); } - radius: Appearance.rounding.small + radius: Tokens.rounding.small } } @@ -109,7 +109,7 @@ StyledRect { anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter - anchors.leftMargin: Appearance.padding.normal + anchors.leftMargin: Tokens.padding.normal active: folder.index === 0 && folder.modelData === "Home" sourceComponent: MaterialIcon { @@ -124,7 +124,7 @@ StyledRect { anchors.left: homeIcon.right anchors.verticalCenter: parent.verticalCenter - anchors.leftMargin: homeIcon.active ? Appearance.padding.small : 0 + anchors.leftMargin: homeIcon.active ? Tokens.padding.small : 0 text: folder.modelData color: folder.index < root.dialog.cwd.length - 1 ? Colours.palette.m3onSurfaceVariant : Colours.palette.m3onSurface diff --git a/components/filedialog/Sidebar.qml b/components/filedialog/Sidebar.qml index d6acb811..885185c9 100644 --- a/components/filedialog/Sidebar.qml +++ b/components/filedialog/Sidebar.qml @@ -5,7 +5,7 @@ import QtQuick.Layouts import qs.components import qs.components.filedialog import qs.services -import qs.config +import Caelestia.Config StyledRect { id: root @@ -13,7 +13,7 @@ StyledRect { required property var dialog implicitWidth: Sizes.sidebarWidth - implicitHeight: inner.implicitHeight + Appearance.padding.normal * 2 + implicitHeight: inner.implicitHeight + Tokens.padding.normal * 2 color: Colours.tPalette.m3surfaceContainer @@ -23,16 +23,16 @@ StyledRect { anchors.left: parent.left anchors.right: parent.right anchors.top: parent.top - anchors.margins: Appearance.padding.normal - spacing: Appearance.spacing.small / 2 + anchors.margins: Tokens.padding.normal + spacing: Tokens.spacing.small / 2 StyledText { Layout.alignment: Qt.AlignHCenter - Layout.topMargin: Appearance.padding.small / 2 - Layout.bottomMargin: Appearance.spacing.normal + Layout.topMargin: Tokens.padding.small / 2 + Layout.bottomMargin: Tokens.spacing.normal text: qsTr("Files") color: Colours.palette.m3onSurface - font.pointSize: Appearance.font.size.larger + font.pointSize: Tokens.font.size.larger font.bold: true } @@ -46,9 +46,9 @@ StyledRect { readonly property bool selected: modelData === root.dialog.cwd[root.dialog.cwd.length - 1] Layout.fillWidth: true - implicitHeight: placeInner.implicitHeight + Appearance.padding.normal * 2 + implicitHeight: placeInner.implicitHeight + Tokens.padding.normal * 2 - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: Qt.alpha(Colours.palette.m3secondaryContainer, selected ? 1 : 0) StateLayer { @@ -66,11 +66,11 @@ StyledRect { id: placeInner anchors.fill: parent - anchors.margins: Appearance.padding.normal - anchors.leftMargin: Appearance.padding.large - anchors.rightMargin: Appearance.padding.large + anchors.margins: Tokens.padding.normal + anchors.leftMargin: Tokens.padding.large + anchors.rightMargin: Tokens.padding.large - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal MaterialIcon { text: { @@ -92,7 +92,7 @@ StyledRect { return "folder"; } color: place.selected ? Colours.palette.m3onSecondaryContainer : Colours.palette.m3onSurface - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large fill: place.selected ? 1 : 0 Behavior on fill { @@ -104,7 +104,7 @@ StyledRect { Layout.fillWidth: true text: place.modelData color: place.selected ? Colours.palette.m3onSecondaryContainer : Colours.palette.m3onSurface - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal elide: Text.ElideRight } } diff --git a/components/widgets/ExtraIndicator.qml b/components/widgets/ExtraIndicator.qml index 44738d85..938f1ec1 100644 --- a/components/widgets/ExtraIndicator.qml +++ b/components/widgets/ExtraIndicator.qml @@ -2,19 +2,19 @@ import ".." import "../effects" import QtQuick import qs.services -import qs.config +import Caelestia.Config StyledRect { required property int extra anchors.right: parent.right - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal color: Colours.palette.m3tertiary - radius: Appearance.rounding.small + radius: Tokens.rounding.small - implicitWidth: count.implicitWidth + Appearance.padding.normal * 2 - implicitHeight: count.implicitHeight + Appearance.padding.small * 2 + implicitWidth: count.implicitWidth + Tokens.padding.normal * 2 + implicitHeight: count.implicitHeight + Tokens.padding.small * 2 opacity: extra > 0 ? 1 : 0 scale: extra > 0 ? 1 : 0.5 @@ -38,14 +38,14 @@ StyledRect { Behavior on opacity { Anim { - duration: Appearance.anim.durations.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial } } Behavior on scale { Anim { - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } } } diff --git a/config/Appearance.qml b/config/Appearance.qml deleted file mode 100644 index 489620a0..00000000 --- a/config/Appearance.qml +++ /dev/null @@ -1,14 +0,0 @@ -pragma Singleton - -import Quickshell - -Singleton { - // Literally just here to shorten accessing stuff :woe: - // Also kinda so I can keep accessing it with `Appearance.xxx` instead of `Config.appearance.xxx` - readonly property AppearanceConfig.Rounding rounding: Config.appearance.rounding // qmllint disable missing-property - readonly property AppearanceConfig.Spacing spacing: Config.appearance.spacing // qmllint disable missing-property - readonly property AppearanceConfig.Padding padding: Config.appearance.padding // qmllint disable missing-property - readonly property AppearanceConfig.FontStuff font: Config.appearance.font // qmllint disable missing-property - readonly property AppearanceConfig.Anim anim: Config.appearance.anim // qmllint disable missing-property - readonly property AppearanceConfig.Transparency transparency: Config.appearance.transparency // qmllint disable missing-property -} diff --git a/config/AppearanceConfig.qml b/config/AppearanceConfig.qml deleted file mode 100644 index cee140f6..00000000 --- a/config/AppearanceConfig.qml +++ /dev/null @@ -1,94 +0,0 @@ -import Quickshell.Io - -JsonObject { - property Rounding rounding: Rounding {} - property Spacing spacing: Spacing {} - property Padding padding: Padding {} - property FontStuff font: FontStuff {} - property Anim anim: Anim {} - property Transparency transparency: Transparency {} - - component Rounding: JsonObject { - property real scale: 1 - property int small: 12 * scale - property int normal: 17 * scale - property int large: 25 * scale - property int full: 1000 * scale - } - - component Spacing: JsonObject { - property real scale: 1 - property int small: 7 * scale - property int smaller: 10 * scale - property int normal: 12 * scale - property int larger: 15 * scale - property int large: 20 * scale - } - - component Padding: JsonObject { - property real scale: 1 - property int small: 5 * scale - property int smaller: 7 * scale - property int normal: 10 * scale - property int larger: 12 * scale - property int large: 15 * scale - } - - component FontFamily: JsonObject { - property string sans: "Rubik" - property string mono: "CaskaydiaCove NF" - property string material: "Material Symbols Rounded" - property string clock: "Rubik" - } - - component FontSize: JsonObject { - property real scale: 1 - property int small: 11 * scale - property int smaller: 12 * scale - property int normal: 13 * scale - property int larger: 15 * scale - property int large: 18 * scale - property int extraLarge: 28 * scale - } - - component FontStuff: JsonObject { - property FontFamily family: FontFamily {} - property FontSize size: FontSize {} - } - - component AnimCurves: JsonObject { - property list emphasized: [0.05, 0, 2 / 15, 0.06, 1 / 6, 0.4, 5 / 24, 0.82, 0.25, 1, 1, 1] - property list emphasizedAccel: [0.3, 0, 0.8, 0.15, 1, 1] - property list emphasizedDecel: [0.05, 0.7, 0.1, 1, 1, 1] - property list standard: [0.2, 0, 0, 1, 1, 1] - property list standardAccel: [0.3, 0, 1, 1, 1, 1] - property list standardDecel: [0, 0, 0, 1, 1, 1] - property list expressiveFastSpatial: [0.42, 1.67, 0.21, 0.9, 1, 1] - property list expressiveDefaultSpatial: [0.38, 1.21, 0.22, 1, 1, 1] - property list expressiveSlowSpatial: [0.39, 1.29, 0.35, 0.98, 1, 1] - } - - component AnimDurations: JsonObject { - property real scale: 1 - property int small: 200 * scale - property int normal: 400 * scale - property int large: 600 * scale - property int extraLarge: 1000 * scale - property int expressiveFastSpatial: 350 * scale - property int expressiveDefaultSpatial: 500 * scale - property int expressiveSlowSpatial: 650 * scale - } - - component Anim: JsonObject { - property real mediaGifSpeedAdjustment: 300 - property real sessionGifSpeed: 0.7 - property AnimCurves curves: AnimCurves {} - property AnimDurations durations: AnimDurations {} - } - - component Transparency: JsonObject { - property bool enabled: false - property real base: 0.85 - property real layers: 0.4 - } -} diff --git a/config/BackgroundConfig.qml b/config/BackgroundConfig.qml deleted file mode 100644 index 8383f524..00000000 --- a/config/BackgroundConfig.qml +++ /dev/null @@ -1,37 +0,0 @@ -import Quickshell.Io - -JsonObject { - property bool enabled: true - property bool wallpaperEnabled: true - property DesktopClock desktopClock: DesktopClock {} - property Visualiser visualiser: Visualiser {} - - component DesktopClock: JsonObject { - property bool enabled: false - property real scale: 1.0 - property string position: "bottom-right" - property bool invertColors: false - property DesktopClockBackground background: DesktopClockBackground {} - property DesktopClockShadow shadow: DesktopClockShadow {} - } - - component DesktopClockBackground: JsonObject { - property bool enabled: false - property real opacity: 0.7 - property bool blur: true - } - - component DesktopClockShadow: JsonObject { - property bool enabled: true - property real opacity: 0.7 - property real blur: 0.4 - } - - component Visualiser: JsonObject { - property bool enabled: false - property bool autoHide: true - property bool blur: false - property real rounding: 1 - property real spacing: 1 - } -} diff --git a/config/BarConfig.qml b/config/BarConfig.qml deleted file mode 100644 index 463302ab..00000000 --- a/config/BarConfig.qml +++ /dev/null @@ -1,129 +0,0 @@ -import Quickshell.Io - -JsonObject { - property bool persistent: true - property bool showOnHover: true - property int dragThreshold: 20 - property ScrollActions scrollActions: ScrollActions {} - property Popouts popouts: Popouts {} - property Workspaces workspaces: Workspaces {} - property ActiveWindow activeWindow: ActiveWindow {} - property Tray tray: Tray {} - property Status status: Status {} - property Clock clock: Clock {} - property Sizes sizes: Sizes {} - property list excludedScreens: [] - - property list entries: [ - { - id: "logo", - enabled: true - }, - { - id: "workspaces", - enabled: true - }, - { - id: "spacer", - enabled: true - }, - { - id: "activeWindow", - enabled: true - }, - { - id: "spacer", - enabled: true - }, - { - id: "tray", - enabled: true - }, - { - id: "clock", - enabled: true - }, - { - id: "statusIcons", - enabled: true - }, - { - id: "power", - enabled: true - } - ] - - component ScrollActions: JsonObject { - property bool workspaces: true - property bool volume: true - property bool brightness: true - } - - component Popouts: JsonObject { - property bool activeWindow: true - property bool tray: true - property bool statusIcons: true - } - - component Workspaces: JsonObject { - property int shown: 5 - property bool activeIndicator: true - property bool occupiedBg: false - property bool showWindows: true - property bool showWindowsOnSpecialWorkspaces: showWindows - property int maxWindowIcons: 0 // 0 = unlimited - property bool activeTrail: false - property bool perMonitorWorkspaces: true - property string label: " " // if empty, will show workspace name's first letter - property string occupiedLabel: "󰮯" - property string activeLabel: "󰮯" - property string capitalisation: "preserve" // upper, lower, or preserve - relevant only if label is empty - property list specialWorkspaceIcons: [] - property list windowIcons: [ - { - regex: "steam(_app_(default|[0-9]+))?", - icon: "sports_esports" - } - ] - } - - component ActiveWindow: JsonObject { - property bool compact: false - property bool inverted: false - property bool showOnHover: true - } - - component Tray: JsonObject { - property bool background: false - property bool recolour: false - property bool compact: false - property list iconSubs: [] - property list hiddenIcons: [] - } - - component Status: JsonObject { - property bool showAudio: false - property bool showMicrophone: false - property bool showKbLayout: false - property bool showNetwork: true - property bool showWifi: true - property bool showBluetooth: true - property bool showBattery: true - property bool showLockStatus: true - } - - component Clock: JsonObject { - property bool background: false - property bool showDate: false - property bool showIcon: true - } - - component Sizes: JsonObject { - property int innerWidth: 40 - property int windowPreviewSize: 400 - property int trayMenuWidth: 300 - property int batteryWidth: 250 - property int networkWidth: 320 - property int kbLayoutWidth: 320 - } -} diff --git a/config/BorderConfig.qml b/config/BorderConfig.qml deleted file mode 100644 index 662320d9..00000000 --- a/config/BorderConfig.qml +++ /dev/null @@ -1,10 +0,0 @@ -import Quickshell.Io -import qs.config - -JsonObject { - property int thickness: Config.appearance.padding.normal - property int rounding: Config.appearance.rounding.large - - readonly property int minThickness: 2 - readonly property int clampedThickness: Math.max(minThickness, thickness) -} diff --git a/config/Config.qml b/config/Config.qml deleted file mode 100644 index 997eaf1e..00000000 --- a/config/Config.qml +++ /dev/null @@ -1,500 +0,0 @@ -pragma Singleton - -import QtQuick -import Quickshell -import Quickshell.Io -import Caelestia -import qs.utils - -Singleton { - id: root - - property alias appearance: adapter.appearance - property alias general: adapter.general - property alias background: adapter.background - property alias bar: adapter.bar - property alias border: adapter.border - property alias dashboard: adapter.dashboard - property alias controlCenter: adapter.controlCenter - property alias launcher: adapter.launcher - property alias notifs: adapter.notifs - property alias osd: adapter.osd - property alias session: adapter.session - property alias winfo: adapter.winfo - property alias lock: adapter.lock - property alias utilities: adapter.utilities - property alias sidebar: adapter.sidebar - property alias services: adapter.services - property alias paths: adapter.paths - - property bool recentlySaved: false - - // Public save function - call this to persist config changes - function save(): void { - saveTimer.restart(); - recentlySaved = true; - recentSaveCooldown.restart(); - } - - // Helper function to serialize the config object - function serializeConfig(): var { - return { - appearance: serializeAppearance(), - general: serializeGeneral(), - background: serializeBackground(), - bar: serializeBar(), - border: serializeBorder(), - dashboard: serializeDashboard(), - controlCenter: serializeControlCenter(), - launcher: serializeLauncher(), - notifs: serializeNotifs(), - osd: serializeOsd(), - session: serializeSession(), - winfo: serializeWinfo(), - lock: serializeLock(), - utilities: serializeUtilities(), - sidebar: serializeSidebar(), - services: serializeServices(), - paths: serializePaths() - }; - } - - function serializeAppearance(): var { - return { - rounding: { - scale: appearance.rounding.scale - }, - spacing: { - scale: appearance.spacing.scale - }, - padding: { - scale: appearance.padding.scale - }, - font: { - family: { - sans: appearance.font.family.sans, - mono: appearance.font.family.mono, - material: appearance.font.family.material, - clock: appearance.font.family.clock - }, - size: { - scale: appearance.font.size.scale - } - }, - anim: { - mediaGifSpeedAdjustment: 300, - sessionGifSpeed: 0.7, - durations: { - scale: appearance.anim.durations.scale - } - }, - transparency: { - enabled: appearance.transparency.enabled, - base: appearance.transparency.base, - layers: appearance.transparency.layers - } - }; - } - - function serializeGeneral(): var { - return { - logo: general.logo, - excludedScreens: general.excludedScreens, - apps: { - terminal: general.apps.terminal, - audio: general.apps.audio, - playback: general.apps.playback, - explorer: general.apps.explorer - }, - idle: { - lockBeforeSleep: general.idle.lockBeforeSleep, - inhibitWhenAudio: general.idle.inhibitWhenAudio, - timeouts: general.idle.timeouts - }, - battery: { - warnLevels: general.battery.warnLevels, - criticalLevel: general.battery.criticalLevel - } - }; - } - - function serializeBackground(): var { - return { - enabled: background.enabled, - wallpaperEnabled: background.wallpaperEnabled, - desktopClock: { - enabled: background.desktopClock.enabled, - scale: background.desktopClock.scale, - position: background.desktopClock.position, - invertColors: background.desktopClock.invertColors, - background: { - enabled: background.desktopClock.background.enabled, - opacity: background.desktopClock.background.opacity, - blur: background.desktopClock.background.blur - }, - shadow: { - enabled: background.desktopClock.shadow.enabled, - opacity: background.desktopClock.shadow.opacity, - blur: background.desktopClock.shadow.blur - } - }, - visualiser: { - enabled: background.visualiser.enabled, - autoHide: background.visualiser.autoHide, - blur: background.visualiser.blur, - rounding: background.visualiser.rounding, - spacing: background.visualiser.spacing - } - }; - } - - function serializeBar(): var { - return { - persistent: bar.persistent, - showOnHover: bar.showOnHover, - dragThreshold: bar.dragThreshold, - scrollActions: { - workspaces: bar.scrollActions.workspaces, - volume: bar.scrollActions.volume, - brightness: bar.scrollActions.brightness - }, - popouts: { - activeWindow: bar.popouts.activeWindow, - tray: bar.popouts.tray, - statusIcons: bar.popouts.statusIcons - }, - workspaces: { - shown: bar.workspaces.shown, - activeIndicator: bar.workspaces.activeIndicator, - occupiedBg: bar.workspaces.occupiedBg, - showWindows: bar.workspaces.showWindows, - showWindowsOnSpecialWorkspaces: bar.workspaces.showWindowsOnSpecialWorkspaces, - maxWindowIcons: bar.workspaces.maxWindowIcons, - activeTrail: bar.workspaces.activeTrail, - perMonitorWorkspaces: bar.workspaces.perMonitorWorkspaces, - label: bar.workspaces.label, - occupiedLabel: bar.workspaces.occupiedLabel, - activeLabel: bar.workspaces.activeLabel, - capitalisation: bar.workspaces.capitalisation, - specialWorkspaceIcons: bar.workspaces.specialWorkspaceIcons, - windowIcons: bar.workspaces.windowIcons - }, - activeWindow: { - compact: bar.activeWindow.compact, - inverted: bar.activeWindow.inverted, - showOnHover: bar.activeWindow.showOnHover - }, - tray: { - background: bar.tray.background, - recolour: bar.tray.recolour, - compact: bar.tray.compact, - iconSubs: bar.tray.iconSubs, - hiddenIcons: bar.tray.hiddenIcons - }, - status: { - showAudio: bar.status.showAudio, - showMicrophone: bar.status.showMicrophone, - showKbLayout: bar.status.showKbLayout, - showNetwork: bar.status.showNetwork, - showWifi: bar.status.showWifi, - showBluetooth: bar.status.showBluetooth, - showBattery: bar.status.showBattery, - showLockStatus: bar.status.showLockStatus - }, - clock: { - background: bar.clock.background, - showDate: bar.clock.showDate, - showIcon: bar.clock.showIcon - }, - entries: bar.entries, - excludedScreens: bar.excludedScreens - }; - } - - function serializeBorder(): var { - return { - thickness: border.thickness, - rounding: border.rounding - }; - } - - function serializeDashboard(): var { - return { - enabled: dashboard.enabled, - showOnHover: dashboard.showOnHover, - mediaUpdateInterval: dashboard.mediaUpdateInterval, - resourceUpdateInterval: dashboard.resourceUpdateInterval, - dragThreshold: dashboard.dragThreshold, - performance: { - showBattery: dashboard.performance.showBattery, - showGpu: dashboard.performance.showGpu, - showCpu: dashboard.performance.showCpu, - showMemory: dashboard.performance.showMemory, - showStorage: dashboard.performance.showStorage, - showNetwork: dashboard.performance.showNetwork - } - }; - } - - function serializeControlCenter(): var { - return {}; - } - - function serializeLauncher(): var { - return { - enabled: launcher.enabled, - showOnHover: launcher.showOnHover, - maxShown: launcher.maxShown, - maxWallpapers: launcher.maxWallpapers, - specialPrefix: launcher.specialPrefix, - actionPrefix: launcher.actionPrefix, - enableDangerousActions: launcher.enableDangerousActions, - dragThreshold: launcher.dragThreshold, - vimKeybinds: launcher.vimKeybinds, - favouriteApps: launcher.favouriteApps, - hiddenApps: launcher.hiddenApps, - useFuzzy: { - apps: launcher.useFuzzy.apps, - actions: launcher.useFuzzy.actions, - schemes: launcher.useFuzzy.schemes, - variants: launcher.useFuzzy.variants, - wallpapers: launcher.useFuzzy.wallpapers - }, - actions: launcher.actions - }; - } - - function serializeNotifs(): var { - return { - expire: notifs.expire, - fullscreen: notifs.fullscreen, - defaultExpireTimeout: notifs.defaultExpireTimeout, - clearThreshold: notifs.clearThreshold, - expandThreshold: notifs.expandThreshold, - actionOnClick: notifs.actionOnClick, - groupPreviewNum: notifs.groupPreviewNum, - openExpanded: notifs.openExpanded - }; - } - - function serializeOsd(): var { - return { - enabled: osd.enabled, - hideDelay: osd.hideDelay, - enableBrightness: osd.enableBrightness, - enableMicrophone: osd.enableMicrophone - }; - } - - function serializeSession(): var { - return { - enabled: session.enabled, - dragThreshold: session.dragThreshold, - vimKeybinds: session.vimKeybinds, - icons: { - logout: session.icons.logout, - shutdown: session.icons.shutdown, - hibernate: session.icons.hibernate, - reboot: session.icons.reboot - }, - commands: { - logout: session.commands.logout, - shutdown: session.commands.shutdown, - hibernate: session.commands.hibernate, - reboot: session.commands.reboot - } - }; - } - - function serializeWinfo(): var { - return {}; - } - - function serializeLock(): var { - return { - recolourLogo: lock.recolourLogo, - enableFprint: lock.enableFprint, - maxFprintTries: lock.maxFprintTries, - hideNotifs: lock.hideNotifs - }; - } - - function serializeUtilities(): var { - const vpnProviders = []; - for (let i = 0; i < utilities.vpn.provider.length; i++) { - const p = utilities.vpn.provider[i]; - const provider = { - displayName: p.displayName, - enabled: p.enabled, - interface: p.interface, - name: p.name - }; - if (p.connectCmd && p.connectCmd.length > 0) { - provider.connectCmd = p.connectCmd; - } - if (p.disconnectCmd && p.disconnectCmd.length > 0) { - provider.disconnectCmd = p.disconnectCmd; - } - vpnProviders.push(provider); - } - - return { - enabled: utilities.enabled, - maxToasts: utilities.maxToasts, - toasts: { - configLoaded: utilities.toasts.configLoaded, - fullscreen: utilities.toasts.fullscreen, - chargingChanged: utilities.toasts.chargingChanged, - gameModeChanged: utilities.toasts.gameModeChanged, - dndChanged: utilities.toasts.dndChanged, - audioOutputChanged: utilities.toasts.audioOutputChanged, - audioInputChanged: utilities.toasts.audioInputChanged, - capsLockChanged: utilities.toasts.capsLockChanged, - numLockChanged: utilities.toasts.numLockChanged, - kbLayoutChanged: utilities.toasts.kbLayoutChanged, - vpnChanged: utilities.toasts.vpnChanged, - nowPlaying: utilities.toasts.nowPlaying - }, - vpn: { - enabled: utilities.vpn.enabled, - provider: vpnProviders - }, - quickToggles: utilities.quickToggles - }; - } - - function serializeSidebar(): var { - return { - enabled: sidebar.enabled, - dragThreshold: sidebar.dragThreshold - }; - } - - function serializeServices(): var { - return { - weatherLocation: services.weatherLocation, - useFahrenheit: services.useFahrenheit, - useFahrenheitPerformance: services.useFahrenheitPerformance, - useTwelveHourClock: services.useTwelveHourClock, - gpuType: services.gpuType, - visualiserBars: services.visualiserBars, - audioIncrement: services.audioIncrement, - brightnessIncrement: services.brightnessIncrement, - maxVolume: services.maxVolume, - smartScheme: services.smartScheme, - defaultPlayer: services.defaultPlayer, - playerAliases: services.playerAliases, - showLyrics: services.showLyrics, - lyricsBackend: services.lyricsBackend - }; - } - - function serializePaths(): var { - return { - wallpaperDir: paths.wallpaperDir, - lyricsDir: paths.lyricsDir, - sessionGif: paths.sessionGif, - mediaGif: paths.mediaGif, - noNotifsPic: paths.noNotifsPic, - lockNoNotifsPic: paths.lockNoNotifsPic - }; - } - - ElapsedTimer { - id: timer - } - - Timer { - id: saveTimer - - interval: 500 - onTriggered: { - timer.restart(); - try { - // Parse current config to preserve structure and comments if possible - let config = {}; - try { - config = JSON.parse(fileView.text()); - } catch (e) { - // If parsing fails, start with empty object - config = {}; - } - - // Update config with current values - config = root.serializeConfig(); - - // Save to file with pretty printing - fileView.setText(JSON.stringify(config, null, 2)); - } catch (e) { - Toaster.toast(qsTr("Failed to serialize config"), e.message, "settings_alert", Toast.Error); - } - } - } - - Timer { - id: recentSaveCooldown - - interval: 2000 - onTriggered: { - root.recentlySaved = false; - } - } - - FileView { - id: fileView - - path: `${Paths.config}/shell.json` - watchChanges: true - onFileChanged: { - // Prevent reload loop - don't reload if we just saved - if (!root.recentlySaved) { - timer.restart(); - reload(); - } else { - // Self-initiated save - reload without toast - reload(); - } - } - onLoaded: { - try { - JSON.parse(text()); - const elapsed = timer.elapsedMs(); - // Only show toast for external changes (not our own saves) and when elapsed time is meaningful - if (adapter.utilities.toasts.configLoaded && !root.recentlySaved && elapsed > 0) { // qmllint disable unresolved-type - Toaster.toast(qsTr("Config loaded"), qsTr("Config loaded in %1ms").arg(elapsed), "rule_settings"); // qmllint disable unresolved-type - } else if (adapter.utilities.toasts.configLoaded && root.recentlySaved && elapsed > 0) { // qmllint disable unresolved-type - Toaster.toast(qsTr("Config saved"), qsTr("Config reloaded in %1ms").arg(elapsed), "rule_settings"); - } - } catch (e) { - Toaster.toast(qsTr("Failed to load config"), e.message, "settings_alert", Toast.Error); - } - } - onLoadFailed: err => { - if (err !== FileViewError.FileNotFound) - Toaster.toast(qsTr("Failed to read config file"), FileViewError.toString(err), "settings_alert", Toast.Warning); - } - onSaveFailed: err => Toaster.toast(qsTr("Failed to save config"), FileViewError.toString(err), "settings_alert", Toast.Error) - - JsonAdapter { // qmllint disable unresolved-type - id: adapter - - property AppearanceConfig appearance: AppearanceConfig {} - property GeneralConfig general: GeneralConfig {} - property BackgroundConfig background: BackgroundConfig {} - property BarConfig bar: BarConfig {} - property BorderConfig border: BorderConfig {} - property DashboardConfig dashboard: DashboardConfig {} - property ControlCenterConfig controlCenter: ControlCenterConfig {} - property LauncherConfig launcher: LauncherConfig {} - property NotifsConfig notifs: NotifsConfig {} - property OsdConfig osd: OsdConfig {} - property SessionConfig session: SessionConfig {} - property WInfoConfig winfo: WInfoConfig {} - property LockConfig lock: LockConfig {} - property UtilitiesConfig utilities: UtilitiesConfig {} - property SidebarConfig sidebar: SidebarConfig {} - property ServiceConfig services: ServiceConfig {} - property UserPaths paths: UserPaths {} - } - } -} diff --git a/config/ControlCenterConfig.qml b/config/ControlCenterConfig.qml deleted file mode 100644 index a5889491..00000000 --- a/config/ControlCenterConfig.qml +++ /dev/null @@ -1,10 +0,0 @@ -import Quickshell.Io - -JsonObject { - property Sizes sizes: Sizes {} - - component Sizes: JsonObject { - property real heightMult: 0.7 - property real ratio: 16 / 9 - } -} diff --git a/config/DashboardConfig.qml b/config/DashboardConfig.qml deleted file mode 100644 index 0a16cc1f..00000000 --- a/config/DashboardConfig.qml +++ /dev/null @@ -1,40 +0,0 @@ -import Quickshell.Io - -JsonObject { - property bool enabled: true - property bool showOnHover: true - property int mediaUpdateInterval: 500 - property int resourceUpdateInterval: 1000 - property int dragThreshold: 50 - property bool showDashboard: true - property bool showMedia: true - property bool showPerformance: true - property bool showWeather: true - property Sizes sizes: Sizes {} - property Performance performance: Performance {} - - component Performance: JsonObject { - property bool showBattery: true - property bool showGpu: true - property bool showCpu: true - property bool showMemory: true - property bool showStorage: true - property bool showNetwork: true - } - - component Sizes: JsonObject { - readonly property int tabIndicatorHeight: 3 - readonly property int tabIndicatorSpacing: 5 - readonly property int infoWidth: 200 - readonly property int infoIconSize: 25 - readonly property int dateTimeWidth: 110 - readonly property int mediaWidth: 200 - readonly property int mediaProgressSweep: 180 - readonly property int mediaProgressThickness: 8 - readonly property int resourceProgessThickness: 10 - readonly property int weatherWidth: 250 - readonly property int mediaCoverArtSize: 150 - readonly property int mediaVisualiserSize: 80 - readonly property int resourceSize: 200 - } -} diff --git a/config/GeneralConfig.qml b/config/GeneralConfig.qml deleted file mode 100644 index 0d1d1e19..00000000 --- a/config/GeneralConfig.qml +++ /dev/null @@ -1,61 +0,0 @@ -import Quickshell.Io - -JsonObject { - property string logo: "" - property list excludedScreens: [] - property Apps apps: Apps {} - property Idle idle: Idle {} - property Battery battery: Battery {} - - component Apps: JsonObject { - property list terminal: ["foot"] - property list audio: ["pavucontrol"] - property list playback: ["mpv"] - property list explorer: ["thunar"] - } - - component Idle: JsonObject { - property bool lockBeforeSleep: true - property bool inhibitWhenAudio: true - property list timeouts: [ - { - timeout: 180, - idleAction: "lock" - }, - { - timeout: 300, - idleAction: "dpms off", - returnAction: "dpms on" - }, - { - timeout: 600, - idleAction: ["systemctl", "suspend-then-hibernate"] - } - ] - } - - component Battery: JsonObject { - property list warnLevels: [ - { - level: 20, - title: qsTr("Low battery"), - message: qsTr("You might want to plug in a charger"), - icon: "battery_android_frame_2" - }, - { - level: 10, - title: qsTr("Did you see the previous message?"), - message: qsTr("You should probably plug in a charger now"), - icon: "battery_android_frame_1" - }, - { - level: 5, - title: qsTr("Critical battery level"), - message: qsTr("PLUG THE CHARGER RIGHT NOW!!"), - icon: "battery_android_alert", - critical: true - }, - ] - property int criticalLevel: 3 - } -} diff --git a/config/LauncherConfig.qml b/config/LauncherConfig.qml deleted file mode 100644 index 05088af0..00000000 --- a/config/LauncherConfig.qml +++ /dev/null @@ -1,147 +0,0 @@ -import Quickshell.Io - -JsonObject { - property bool enabled: true - property bool showOnHover: false - property int maxShown: 7 - property int maxWallpapers: 9 // Warning: even numbers look bad - property string specialPrefix: "@" - property string actionPrefix: ">" - property bool enableDangerousActions: false // Allow actions that can cause losing data, like shutdown, reboot and logout - property int dragThreshold: 50 - property bool vimKeybinds: false - property list favouriteApps: [] - property list hiddenApps: [] - property UseFuzzy useFuzzy: UseFuzzy {} - property Sizes sizes: Sizes {} - - property list actions: [ - { - name: "Calculator", - icon: "calculate", - description: "Do simple math equations (powered by Qalc)", - command: ["autocomplete", "calc"], - enabled: true, - dangerous: false - }, - { - name: "Scheme", - icon: "palette", - description: "Change the current colour scheme", - command: ["autocomplete", "scheme"], - enabled: true, - dangerous: false - }, - { - name: "Wallpaper", - icon: "image", - description: "Change the current wallpaper", - command: ["autocomplete", "wallpaper"], - enabled: true, - dangerous: false - }, - { - name: "Variant", - icon: "colors", - description: "Change the current scheme variant", - command: ["autocomplete", "variant"], - enabled: true, - dangerous: false - }, - { - name: "Transparency", - icon: "opacity", - description: "Change shell transparency", - command: ["autocomplete", "transparency"], - enabled: false, - dangerous: false - }, - { - name: "Random", - icon: "casino", - description: "Switch to a random wallpaper", - command: ["caelestia", "wallpaper", "-r"], - enabled: true, - dangerous: false - }, - { - name: "Light", - icon: "light_mode", - description: "Change the scheme to light mode", - command: ["setMode", "light"], - enabled: true, - dangerous: false - }, - { - name: "Dark", - icon: "dark_mode", - description: "Change the scheme to dark mode", - command: ["setMode", "dark"], - enabled: true, - dangerous: false - }, - { - name: "Shutdown", - icon: "power_settings_new", - description: "Shutdown the system", - command: ["systemctl", "poweroff"], - enabled: true, - dangerous: true - }, - { - name: "Reboot", - icon: "cached", - description: "Reboot the system", - command: ["systemctl", "reboot"], - enabled: true, - dangerous: true - }, - { - name: "Logout", - icon: "exit_to_app", - description: "Log out of the current session", - command: ["loginctl", "terminate-user", ""], - enabled: true, - dangerous: true - }, - { - name: "Lock", - icon: "lock", - description: "Lock the current session", - command: ["loginctl", "lock-session"], - enabled: true, - dangerous: false - }, - { - name: "Sleep", - icon: "bedtime", - description: "Suspend then hibernate", - command: ["systemctl", "suspend-then-hibernate"], - enabled: true, - dangerous: false - }, - { - name: "Settings", - icon: "settings", - description: "Configure the shell", - command: ["caelestia", "shell", "controlCenter", "open"], - enabled: true, - dangerous: false - } - ] - - component UseFuzzy: JsonObject { - property bool apps: false - property bool actions: false - property bool schemes: false - property bool variants: false - property bool wallpapers: false - } - - component Sizes: JsonObject { - property int itemWidth: 600 - property int itemHeight: 57 - property int wallpaperWidth: 280 - property int wallpaperHeight: 200 - } -} diff --git a/config/LockConfig.qml b/config/LockConfig.qml deleted file mode 100644 index d0a9fb35..00000000 --- a/config/LockConfig.qml +++ /dev/null @@ -1,15 +0,0 @@ -import Quickshell.Io - -JsonObject { - property bool recolourLogo: false - property bool enableFprint: true - property int maxFprintTries: 3 - property bool hideNotifs: false - property Sizes sizes: Sizes {} - - component Sizes: JsonObject { - property real heightMult: 0.7 - property real ratio: 16 / 9 - property int centerWidth: 600 - } -} diff --git a/config/NotifsConfig.qml b/config/NotifsConfig.qml deleted file mode 100644 index bd54b94b..00000000 --- a/config/NotifsConfig.qml +++ /dev/null @@ -1,19 +0,0 @@ -import Quickshell.Io - -JsonObject { - property bool expire: true - property string fullscreen: "on" - property int defaultExpireTimeout: 5000 - property real clearThreshold: 0.3 - property int expandThreshold: 20 - property bool actionOnClick: false - property int groupPreviewNum: 3 - property bool openExpanded: false // Show the notifichation in expanded state when opening - property Sizes sizes: Sizes {} - - component Sizes: JsonObject { - property int width: 400 - property int image: 41 - property int badge: 20 - } -} diff --git a/config/OsdConfig.qml b/config/OsdConfig.qml deleted file mode 100644 index 543fc41e..00000000 --- a/config/OsdConfig.qml +++ /dev/null @@ -1,14 +0,0 @@ -import Quickshell.Io - -JsonObject { - property bool enabled: true - property int hideDelay: 2000 - property bool enableBrightness: true - property bool enableMicrophone: false - property Sizes sizes: Sizes {} - - component Sizes: JsonObject { - property int sliderWidth: 30 - property int sliderHeight: 150 - } -} diff --git a/config/ServiceConfig.qml b/config/ServiceConfig.qml deleted file mode 100644 index a9d7c3dc..00000000 --- a/config/ServiceConfig.qml +++ /dev/null @@ -1,24 +0,0 @@ -import QtQuick -import Quickshell.Io - -JsonObject { - property string weatherLocation: "" // A lat,long pair or empty for autodetection, e.g. "37.8267,-122.4233" - property bool useFahrenheit: [Locale.ImperialUSSystem, Locale.ImperialSystem].includes(Qt.locale().measurementSystem) - property bool useFahrenheitPerformance: [Locale.ImperialUSSystem, Locale.ImperialSystem].includes(Qt.locale().measurementSystem) - property bool useTwelveHourClock: Qt.locale().timeFormat(Locale.ShortFormat).toLowerCase().includes("a") - property string gpuType: "" - property int visualiserBars: 45 - property real audioIncrement: 0.1 - property real brightnessIncrement: 0.1 - property real maxVolume: 1.0 - property bool smartScheme: true - property string defaultPlayer: "Spotify" - property list playerAliases: [ - { - "from": "com.github.th_ch.youtube_music", - "to": "YT Music" - } - ] - property bool showLyrics: false - property string lyricsBackend: "Auto" -} diff --git a/config/SessionConfig.qml b/config/SessionConfig.qml deleted file mode 100644 index 414f821a..00000000 --- a/config/SessionConfig.qml +++ /dev/null @@ -1,29 +0,0 @@ -import Quickshell.Io - -JsonObject { - property bool enabled: true - property int dragThreshold: 30 - property bool vimKeybinds: false - property Icons icons: Icons {} - property Commands commands: Commands {} - - property Sizes sizes: Sizes {} - - component Icons: JsonObject { - property string logout: "logout" - property string shutdown: "power_settings_new" - property string hibernate: "downloading" - property string reboot: "cached" - } - - component Commands: JsonObject { - property list logout: ["loginctl", "terminate-user", ""] - property list shutdown: ["systemctl", "poweroff"] - property list hibernate: ["systemctl", "hibernate"] - property list reboot: ["systemctl", "reboot"] - } - - component Sizes: JsonObject { - property int button: 80 - } -} diff --git a/config/SidebarConfig.qml b/config/SidebarConfig.qml deleted file mode 100644 index a871562b..00000000 --- a/config/SidebarConfig.qml +++ /dev/null @@ -1,11 +0,0 @@ -import Quickshell.Io - -JsonObject { - property bool enabled: true - property int dragThreshold: 80 - property Sizes sizes: Sizes {} - - component Sizes: JsonObject { - property int width: 430 - } -} diff --git a/config/UserPaths.qml b/config/UserPaths.qml deleted file mode 100644 index 3726017c..00000000 --- a/config/UserPaths.qml +++ /dev/null @@ -1,11 +0,0 @@ -import Quickshell.Io -import qs.utils - -JsonObject { - property string wallpaperDir: `${Paths.pictures}/Wallpapers` - property string lyricsDir: `${Paths.home}/Music/lyrics/` - property string sessionGif: "root:/assets/kurukuru.gif" - property string mediaGif: "root:/assets/bongocat.gif" - property string noNotifsPic: "root:/assets/dino.png" - property string lockNoNotifsPic: "root:/assets/dino.png" -} diff --git a/config/UtilitiesConfig.qml b/config/UtilitiesConfig.qml deleted file mode 100644 index 61cf1678..00000000 --- a/config/UtilitiesConfig.qml +++ /dev/null @@ -1,67 +0,0 @@ -import Quickshell.Io - -JsonObject { - property bool enabled: true - property int maxToasts: 4 - - property Sizes sizes: Sizes {} - property Toasts toasts: Toasts {} - property Vpn vpn: Vpn {} - - property list quickToggles: [ - { - id: "wifi", - enabled: true - }, - { - id: "bluetooth", - enabled: true - }, - { - id: "mic", - enabled: true - }, - { - id: "settings", - enabled: true - }, - { - id: "gameMode", - enabled: true - }, - { - id: "dnd", - enabled: true - }, - { - id: "vpn", - enabled: false - } - ] - - component Sizes: JsonObject { - property int width: 430 - property int toastWidth: 430 - } - - component Toasts: JsonObject { - property bool configLoaded: true - property string fullscreen: "off" - property bool chargingChanged: true - property bool gameModeChanged: true - property bool dndChanged: true - property bool audioOutputChanged: true - property bool audioInputChanged: true - property bool capsLockChanged: true - property bool numLockChanged: true - property bool kbLayoutChanged: true - property bool kbLimit: true - property bool vpnChanged: true - property bool nowPlaying: false - } - - component Vpn: JsonObject { - property bool enabled: false - property list provider: [] - } -} diff --git a/config/WInfoConfig.qml b/config/WInfoConfig.qml deleted file mode 100644 index 50257807..00000000 --- a/config/WInfoConfig.qml +++ /dev/null @@ -1,10 +0,0 @@ -import Quickshell.Io - -JsonObject { - property Sizes sizes: Sizes {} - - component Sizes: JsonObject { - property real heightMult: 0.7 - property real detailsWidth: 500 - } -} diff --git a/modules/BatteryMonitor.qml b/modules/BatteryMonitor.qml index 0596a1aa..b6412283 100644 --- a/modules/BatteryMonitor.qml +++ b/modules/BatteryMonitor.qml @@ -2,7 +2,7 @@ import QtQuick import Quickshell import Quickshell.Services.UPower import Caelestia -import qs.config +import Caelestia.Config Scope { id: root diff --git a/modules/IdleMonitors.qml b/modules/IdleMonitors.qml index 440dc704..c396bc8b 100644 --- a/modules/IdleMonitors.qml +++ b/modules/IdleMonitors.qml @@ -5,7 +5,7 @@ import Quickshell import Quickshell.Wayland import Caelestia.Internal import qs.services -import qs.config +import Caelestia.Config Scope { id: root diff --git a/modules/areapicker/Picker.qml b/modules/areapicker/Picker.qml index e6272737..6234d192 100644 --- a/modules/areapicker/Picker.qml +++ b/modules/areapicker/Picker.qml @@ -8,7 +8,7 @@ import Quickshell.Wayland import Caelestia import qs.components import qs.services -import qs.config +import Caelestia.Config MouseArea { id: root @@ -167,7 +167,7 @@ MouseArea { target: root property: "opacity" to: 0 - duration: Appearance.anim.durations.large + duration: Tokens.anim.durations.large } ExAnim { target: root @@ -278,7 +278,7 @@ MouseArea { Behavior on opacity { Anim { - duration: Appearance.anim.durations.large + duration: Tokens.anim.durations.large } } @@ -307,7 +307,7 @@ MouseArea { } component ExAnim: Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } diff --git a/modules/background/Background.qml b/modules/background/Background.qml index 0f44b1a0..14669eab 100644 --- a/modules/background/Background.qml +++ b/modules/background/Background.qml @@ -5,7 +5,7 @@ import Quickshell import Quickshell.Wayland import qs.components.containers import qs.services -import qs.config +import Caelestia.Config Variants { model: Config.background.enabled ? Screens.screens : [] @@ -56,8 +56,8 @@ Variants { asynchronous: true active: Config.background.desktopClock.enabled - anchors.margins: Appearance.padding.large * 2 - anchors.leftMargin: Appearance.padding.large * 2 + Config.bar.sizes.innerWidth + Math.max(Appearance.padding.smaller, Config.border.thickness) + anchors.margins: Tokens.padding.large * 2 + anchors.leftMargin: Tokens.padding.large * 2 + Config.bar.sizes.innerWidth + Math.max(Tokens.padding.smaller, Config.border.thickness) state: Config.background.desktopClock.position states: [ @@ -146,8 +146,8 @@ Variants { transitions: Transition { AnchorAnimation { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } diff --git a/modules/background/DesktopClock.qml b/modules/background/DesktopClock.qml index 67f77e44..43f3fcef 100644 --- a/modules/background/DesktopClock.qml +++ b/modules/background/DesktopClock.qml @@ -5,7 +5,7 @@ import QtQuick.Effects import QtQuick.Layouts import qs.components import qs.services -import qs.config +import Caelestia.Config Item { id: root @@ -23,8 +23,8 @@ Item { readonly property color safeSecondary: useLightSet ? Colours.palette.m3secondaryContainer : Colours.palette.m3secondary readonly property color safeTertiary: useLightSet ? Colours.palette.m3tertiaryContainer : Colours.palette.m3tertiary - implicitWidth: layout.implicitWidth + (Appearance.padding.large * 4 * root.clockScale) - implicitHeight: layout.implicitHeight + (Appearance.padding.large * 2 * root.clockScale) + implicitWidth: layout.implicitWidth + (Tokens.padding.large * 4 * root.clockScale) + implicitHeight: layout.implicitHeight + (Tokens.padding.large * 2 * root.clockScale) Item { id: clockContainer @@ -63,7 +63,7 @@ Item { visible: root.bgEnabled anchors.fill: parent - radius: Appearance.rounding.large * root.clockScale + radius: Tokens.rounding.large * root.clockScale opacity: Config.background.desktopClock.background.opacity color: Colours.palette.m3surface @@ -74,29 +74,29 @@ Item { id: layout anchors.centerIn: parent - spacing: Appearance.spacing.larger * root.clockScale + spacing: Tokens.spacing.larger * root.clockScale RowLayout { - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small StyledText { text: Time.hourStr - font.pointSize: Appearance.font.size.extraLarge * 3 * root.clockScale + font.pointSize: Tokens.font.size.extraLarge * 3 * root.clockScale font.weight: Font.Bold color: root.safePrimary } StyledText { text: ":" - font.pointSize: Appearance.font.size.extraLarge * 3 * root.clockScale + font.pointSize: Tokens.font.size.extraLarge * 3 * root.clockScale color: root.safeTertiary opacity: 0.8 - Layout.topMargin: -Appearance.padding.large * 1.5 * root.clockScale + Layout.topMargin: -Tokens.padding.large * 1.5 * root.clockScale } StyledText { text: Time.minuteStr - font.pointSize: Appearance.font.size.extraLarge * 3 * root.clockScale + font.pointSize: Tokens.font.size.extraLarge * 3 * root.clockScale font.weight: Font.Bold color: root.safeSecondary } @@ -104,14 +104,14 @@ Item { Loader { asynchronous: true Layout.alignment: Qt.AlignTop - Layout.topMargin: Appearance.padding.large * 1.4 * root.clockScale + Layout.topMargin: Tokens.padding.large * 1.4 * root.clockScale active: Config.services.useTwelveHourClock visible: active sourceComponent: StyledText { text: Time.amPmStr - font.pointSize: Appearance.font.size.large * root.clockScale + font.pointSize: Tokens.font.size.large * root.clockScale color: root.safeSecondary } } @@ -120,9 +120,9 @@ Item { StyledRect { Layout.fillHeight: true Layout.preferredWidth: 4 * root.clockScale - Layout.topMargin: Appearance.spacing.larger * root.clockScale - Layout.bottomMargin: Appearance.spacing.larger * root.clockScale - radius: Appearance.rounding.full + Layout.topMargin: Tokens.spacing.larger * root.clockScale + Layout.bottomMargin: Tokens.spacing.larger * root.clockScale + radius: Tokens.rounding.full color: root.safePrimary opacity: 0.8 } @@ -132,7 +132,7 @@ Item { StyledText { text: Time.format("MMMM").toUpperCase() - font.pointSize: Appearance.font.size.large * root.clockScale + font.pointSize: Tokens.font.size.large * root.clockScale font.letterSpacing: 4 font.weight: Font.Bold color: root.safeSecondary @@ -140,7 +140,7 @@ Item { StyledText { text: Time.format("dd") - font.pointSize: Appearance.font.size.extraLarge * root.clockScale + font.pointSize: Tokens.font.size.extraLarge * root.clockScale font.letterSpacing: 2 font.weight: Font.Medium color: root.safePrimary @@ -148,7 +148,7 @@ Item { StyledText { text: Time.format("dddd") - font.pointSize: Appearance.font.size.larger * root.clockScale + font.pointSize: Tokens.font.size.larger * root.clockScale font.letterSpacing: 2 color: root.safeSecondary } @@ -158,14 +158,14 @@ Item { Behavior on clockScale { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } Behavior on implicitWidth { Anim { - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small } } } diff --git a/modules/background/Visualiser.qml b/modules/background/Visualiser.qml index 2f59a300..ebb28dfa 100644 --- a/modules/background/Visualiser.qml +++ b/modules/background/Visualiser.qml @@ -7,7 +7,7 @@ import Caelestia.Internal import Caelestia.Services import qs.components import qs.services -import qs.config +import Caelestia.Config Item { id: root @@ -60,14 +60,14 @@ Item { anchors.fill: parent anchors.margins: Config.border.thickness - anchors.leftMargin: Visibilities.bars.get(root.screen).exclusiveZone + Appearance.spacing.small * Config.background.visualiser.spacing + anchors.leftMargin: Visibilities.bars.get(root.screen).exclusiveZone + Tokens.spacing.small * Config.background.visualiser.spacing values: Audio.cava.values primaryColor: Qt.alpha(Colours.palette.m3primary, 0.7) secondaryColor: Qt.alpha(Colours.palette.m3inversePrimary, 0.7) - rounding: Appearance.rounding.small * Config.background.visualiser.rounding - spacing: Appearance.spacing.small * Config.background.visualiser.spacing - animationDuration: Appearance.anim.durations.normal + rounding: Tokens.rounding.small * Config.background.visualiser.rounding + spacing: Tokens.spacing.small * Config.background.visualiser.spacing + animationDuration: Tokens.anim.durations.normal Behavior on anchors.leftMargin { Anim {} diff --git a/modules/background/Wallpaper.qml b/modules/background/Wallpaper.qml index 10d743ba..f226d062 100644 --- a/modules/background/Wallpaper.qml +++ b/modules/background/Wallpaper.qml @@ -5,7 +5,7 @@ import qs.components import qs.components.filedialog import qs.components.images import qs.services -import qs.config +import Caelestia.Config import qs.utils Item { @@ -43,30 +43,30 @@ Item { Row { anchors.centerIn: parent - spacing: Appearance.spacing.large + spacing: Tokens.spacing.large MaterialIcon { text: "sentiment_stressed" color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.extraLarge * 5 + font.pointSize: Tokens.font.size.extraLarge * 5 } Column { anchors.verticalCenter: parent.verticalCenter - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small StyledText { text: qsTr("Wallpaper missing?") color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.extraLarge * 2 + font.pointSize: Tokens.font.size.extraLarge * 2 font.bold: true } StyledRect { - implicitWidth: selectWallText.implicitWidth + Appearance.padding.large * 2 - implicitHeight: selectWallText.implicitHeight + Appearance.padding.small * 2 + implicitWidth: selectWallText.implicitWidth + Tokens.padding.large * 2 + implicitHeight: selectWallText.implicitHeight + Tokens.padding.small * 2 - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: Colours.palette.m3primary FileDialog { @@ -94,7 +94,7 @@ Item { text: qsTr("Set it now!") color: Colours.palette.m3onPrimary - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large } } } diff --git a/modules/bar/Bar.qml b/modules/bar/Bar.qml index 3b99a44b..5d127f57 100644 --- a/modules/bar/Bar.qml +++ b/modules/bar/Bar.qml @@ -8,7 +8,7 @@ import QtQuick.Layouts import Quickshell import qs.components import qs.services -import qs.config +import Caelestia.Config ColumnLayout { id: root @@ -17,7 +17,7 @@ ColumnLayout { required property DrawerVisibilities visibilities required property BarPopouts.Wrapper popouts required property bool fullscreen - readonly property int vPadding: Appearance.padding.large + readonly property int vPadding: Tokens.padding.large function closeTray(): void { if (!Config.bar.tray.compact) @@ -102,7 +102,7 @@ ColumnLayout { } } - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal Repeater { id: repeater diff --git a/modules/bar/BarWrapper.qml b/modules/bar/BarWrapper.qml index ec9df2d1..8ea61505 100644 --- a/modules/bar/BarWrapper.qml +++ b/modules/bar/BarWrapper.qml @@ -3,7 +3,7 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell import qs.components -import qs.config +import Caelestia.Config import qs.utils import qs.modules.bar.popouts as BarPopouts @@ -18,7 +18,7 @@ Item { readonly property bool disabled: Strings.testRegexList(Config.bar.excludedScreens, screen.name) readonly property int clampedWidth: Math.max(Config.border.minThickness, implicitWidth) - readonly property int padding: Math.max(Appearance.padding.smaller, Config.border.thickness) + readonly property int padding: Math.max(Tokens.padding.smaller, Config.border.thickness) readonly property int contentWidth: Config.bar.sizes.innerWidth + padding * 2 readonly property int exclusiveZone: !disabled && (Config.bar.persistent || visibilities.bar) ? contentWidth : Config.border.thickness readonly property bool shouldBeVisible: !fullscreen && !disabled && (Config.bar.persistent || visibilities.bar || isHovered) @@ -57,8 +57,8 @@ Item { Anim { target: root property: "implicitWidth" - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } }, Transition { @@ -68,7 +68,7 @@ Item { Anim { target: root property: "implicitWidth" - easing.bezierCurve: Appearance.anim.curves.emphasized + easing.bezierCurve: Tokens.anim.curves.emphasized } } ] diff --git a/modules/bar/components/ActiveWindow.qml b/modules/bar/components/ActiveWindow.qml index 0fa277ee..63cdb04a 100644 --- a/modules/bar/components/ActiveWindow.qml +++ b/modules/bar/components/ActiveWindow.qml @@ -3,7 +3,7 @@ pragma ComponentBehavior: Bound import QtQuick import qs.components import qs.services -import qs.config +import Caelestia.Config import qs.utils Item { @@ -86,8 +86,8 @@ Item { id: metrics text: root.windowTitle - font.pointSize: Appearance.font.size.smaller - font.family: Appearance.font.family.mono + font.pointSize: Tokens.font.size.smaller + font.family: Tokens.font.family.mono elide: Qt.ElideRight elideWidth: root.maxHeight - icon.height @@ -101,8 +101,8 @@ Item { Behavior on implicitHeight { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } @@ -111,7 +111,7 @@ Item { anchors.horizontalCenter: icon.horizontalCenter anchors.top: icon.bottom - anchors.topMargin: Appearance.spacing.small + anchors.topMargin: Tokens.spacing.small font.pointSize: metrics.font.pointSize font.family: metrics.font.family diff --git a/modules/bar/components/Clock.qml b/modules/bar/components/Clock.qml index 90ed78cf..ead13d9e 100644 --- a/modules/bar/components/Clock.qml +++ b/modules/bar/components/Clock.qml @@ -3,25 +3,25 @@ pragma ComponentBehavior: Bound import QtQuick import qs.components import qs.services -import qs.config +import Caelestia.Config StyledRect { id: root readonly property color colour: Colours.palette.m3tertiary - readonly property int padding: Config.bar.clock.background ? Appearance.padding.normal : Appearance.padding.small + readonly property int padding: Config.bar.clock.background ? Tokens.padding.normal : Tokens.padding.small implicitWidth: Config.bar.sizes.innerWidth implicitHeight: layout.implicitHeight + root.padding * 2 color: Qt.alpha(Colours.tPalette.m3surfaceContainer, Config.bar.clock.background ? Colours.tPalette.m3surfaceContainer.a : 0) - radius: Appearance.rounding.full + radius: Tokens.rounding.full Column { id: layout anchors.centerIn: parent - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small Loader { asynchronous: true @@ -43,8 +43,8 @@ StyledRect { horizontalAlignment: StyledText.AlignHCenter text: Time.format("ddd\nd") - font.pointSize: Appearance.font.size.smaller - font.family: Appearance.font.family.sans + font.pointSize: Tokens.font.size.smaller + font.family: Tokens.font.family.sans color: root.colour } @@ -63,8 +63,8 @@ StyledRect { horizontalAlignment: StyledText.AlignHCenter text: Time.format(Config.services.useTwelveHourClock ? "hh\nmm\nA" : "hh\nmm") - font.pointSize: Appearance.font.size.smaller - font.family: Appearance.font.family.mono + font.pointSize: Tokens.font.size.smaller + font.family: Tokens.font.family.mono color: root.colour } } diff --git a/modules/bar/components/OsIcon.qml b/modules/bar/components/OsIcon.qml index fc16a4fc..47a8c88f 100644 --- a/modules/bar/components/OsIcon.qml +++ b/modules/bar/components/OsIcon.qml @@ -2,14 +2,14 @@ import QtQuick import qs.components import qs.components.effects import qs.services -import qs.config +import Caelestia.Config import qs.utils Item { id: root - implicitWidth: Math.round(Appearance.font.size.large * 1.2) - implicitHeight: Math.round(Appearance.font.size.large * 1.2) + implicitWidth: Math.round(Tokens.font.size.large * 1.2) + implicitHeight: Math.round(Tokens.font.size.large * 1.2) MouseArea { anchors.fill: parent @@ -30,8 +30,8 @@ Item { id: caelestiaLogo Logo { - implicitWidth: Math.round(Appearance.font.size.large * 1.6) - implicitHeight: Math.round(Appearance.font.size.large * 1.6) + implicitWidth: Math.round(Tokens.font.size.large * 1.6) + implicitHeight: Math.round(Tokens.font.size.large * 1.6) } } @@ -40,7 +40,7 @@ Item { ColouredIcon { source: SysInfo.osLogo - implicitSize: Math.round(Appearance.font.size.large * 1.2) + implicitSize: Math.round(Tokens.font.size.large * 1.2) colour: Colours.palette.m3tertiary } } diff --git a/modules/bar/components/Power.qml b/modules/bar/components/Power.qml index 5f573811..f3f4706a 100644 --- a/modules/bar/components/Power.qml +++ b/modules/bar/components/Power.qml @@ -1,14 +1,14 @@ import QtQuick import qs.components import qs.services -import qs.config +import Caelestia.Config Item { id: root required property DrawerVisibilities visibilities - implicitWidth: icon.implicitHeight + Appearance.padding.small * 2 + implicitWidth: icon.implicitHeight + Tokens.padding.small * 2 implicitHeight: icon.implicitHeight StateLayer { @@ -20,8 +20,8 @@ Item { anchors.fill: undefined anchors.centerIn: parent implicitWidth: implicitHeight - implicitHeight: icon.implicitHeight + Appearance.padding.small * 2 - radius: Appearance.rounding.full + implicitHeight: icon.implicitHeight + Tokens.padding.small * 2 + radius: Tokens.rounding.full } MaterialIcon { @@ -33,6 +33,6 @@ Item { text: "power_settings_new" color: Colours.palette.m3error font.bold: true - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } } diff --git a/modules/bar/components/Settings.qml b/modules/bar/components/Settings.qml index f6ed88af..f060225c 100644 --- a/modules/bar/components/Settings.qml +++ b/modules/bar/components/Settings.qml @@ -1,13 +1,13 @@ import QtQuick import qs.components import qs.services -import qs.config +import Caelestia.Config import qs.modules.controlcenter Item { id: root - implicitWidth: icon.implicitHeight + Appearance.padding.small * 2 + implicitWidth: icon.implicitHeight + Tokens.padding.small * 2 implicitHeight: icon.implicitHeight StateLayer { @@ -21,8 +21,8 @@ Item { anchors.fill: undefined anchors.centerIn: parent implicitWidth: implicitHeight - implicitHeight: icon.implicitHeight + Appearance.padding.small * 2 - radius: Appearance.rounding.full + implicitHeight: icon.implicitHeight + Tokens.padding.small * 2 + radius: Tokens.rounding.full } MaterialIcon { @@ -34,6 +34,6 @@ Item { text: "settings" color: Colours.palette.m3onSurface font.bold: true - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } } diff --git a/modules/bar/components/SettingsIcon.qml b/modules/bar/components/SettingsIcon.qml index f6ed88af..f060225c 100644 --- a/modules/bar/components/SettingsIcon.qml +++ b/modules/bar/components/SettingsIcon.qml @@ -1,13 +1,13 @@ import QtQuick import qs.components import qs.services -import qs.config +import Caelestia.Config import qs.modules.controlcenter Item { id: root - implicitWidth: icon.implicitHeight + Appearance.padding.small * 2 + implicitWidth: icon.implicitHeight + Tokens.padding.small * 2 implicitHeight: icon.implicitHeight StateLayer { @@ -21,8 +21,8 @@ Item { anchors.fill: undefined anchors.centerIn: parent implicitWidth: implicitHeight - implicitHeight: icon.implicitHeight + Appearance.padding.small * 2 - radius: Appearance.rounding.full + implicitHeight: icon.implicitHeight + Tokens.padding.small * 2 + radius: Tokens.rounding.full } MaterialIcon { @@ -34,6 +34,6 @@ Item { text: "settings" color: Colours.palette.m3onSurface font.bold: true - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } } diff --git a/modules/bar/components/StatusIcons.qml b/modules/bar/components/StatusIcons.qml index 455e04ef..c32bc21f 100644 --- a/modules/bar/components/StatusIcons.qml +++ b/modules/bar/components/StatusIcons.qml @@ -7,7 +7,7 @@ import Quickshell.Bluetooth import Quickshell.Services.UPower import qs.components import qs.services -import qs.config +import Caelestia.Config import qs.utils StyledRect { @@ -17,11 +17,11 @@ StyledRect { readonly property alias items: iconColumn color: Colours.tPalette.m3surfaceContainer - radius: Appearance.rounding.full + radius: Tokens.rounding.full clip: true implicitWidth: Config.bar.sizes.innerWidth - implicitHeight: iconColumn.implicitHeight + Appearance.padding.normal * 2 - (Config.bar.status.showLockStatus && !Hypr.capsLock && !Hypr.numLock ? iconColumn.spacing : 0) + implicitHeight: iconColumn.implicitHeight + Tokens.padding.normal * 2 - (Config.bar.status.showLockStatus && !Hypr.capsLock && !Hypr.numLock ? iconColumn.spacing : 0) ColumnLayout { id: iconColumn @@ -29,9 +29,9 @@ StyledRect { anchors.left: parent.left anchors.right: parent.right anchors.bottom: parent.bottom - anchors.bottomMargin: Appearance.padding.normal + anchors.bottomMargin: Tokens.padding.normal - spacing: Appearance.spacing.smaller / 2 + spacing: Tokens.spacing.smaller / 2 // Lock keys status WrappedLoader { @@ -136,7 +136,7 @@ StyledRect { animate: true text: Hypr.kbLayout color: root.colour - font.family: Appearance.font.family.mono + font.family: Tokens.font.family.mono } } @@ -172,7 +172,7 @@ StyledRect { active: Config.bar.status.showBluetooth sourceComponent: ColumnLayout { - spacing: Appearance.spacing.smaller / 2 + spacing: Tokens.spacing.smaller / 2 // Bluetooth icon MaterialIcon { @@ -211,14 +211,14 @@ StyledRect { Anim { from: 1 to: 0 - duration: Appearance.anim.durations.large - easing.bezierCurve: Appearance.anim.curves.standardAccel + duration: Tokens.anim.durations.large + easing.bezierCurve: Tokens.anim.curves.standardAccel } Anim { from: 0 to: 1 - duration: Appearance.anim.durations.large - easing.bezierCurve: Appearance.anim.curves.standardDecel + duration: Tokens.anim.durations.large + easing.bezierCurve: Tokens.anim.curves.standardDecel } } } diff --git a/modules/bar/components/Tray.qml b/modules/bar/components/Tray.qml index 79b57755..76785813 100644 --- a/modules/bar/components/Tray.qml +++ b/modules/bar/components/Tray.qml @@ -5,7 +5,7 @@ import Quickshell import Quickshell.Services.SystemTray import qs.components import qs.services -import qs.config +import Caelestia.Config StyledRect { id: root @@ -14,8 +14,8 @@ StyledRect { readonly property alias items: items readonly property alias expandIcon: expandIcon - readonly property int padding: Config.bar.tray.background ? Appearance.padding.normal : Appearance.padding.small - readonly property int spacing: Config.bar.tray.background ? Appearance.spacing.small : 0 + readonly property int padding: Config.bar.tray.background ? Tokens.padding.normal : Tokens.padding.small + readonly property int spacing: Config.bar.tray.background ? Tokens.spacing.small : 0 property bool expanded @@ -32,7 +32,7 @@ StyledRect { implicitHeight: nonAnimHeight color: Qt.alpha(Colours.tPalette.m3surfaceContainer, (Config.bar.tray.background && items.count > 0) ? Colours.tPalette.m3surfaceContainer.a : 0) - radius: Appearance.rounding.full + radius: Tokens.rounding.full Column { id: layout @@ -40,7 +40,7 @@ StyledRect { anchors.horizontalCenter: parent.horizontalCenter anchors.top: parent.top anchors.topMargin: root.padding - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small opacity: root.expanded || !Config.bar.tray.compact ? 1 : 0 @@ -49,7 +49,7 @@ StyledRect { properties: "scale" from: 0 to: 1 - easing.bezierCurve: Appearance.anim.curves.standardDecel + easing.bezierCurve: Tokens.anim.curves.standardDecel } } @@ -57,7 +57,7 @@ StyledRect { Anim { properties: "scale" to: 1 - easing.bezierCurve: Appearance.anim.curves.standardDecel + easing.bezierCurve: Tokens.anim.curves.standardDecel } Anim { properties: "x,y" @@ -91,16 +91,16 @@ StyledRect { sourceComponent: Item { implicitWidth: expandIconInner.implicitWidth - implicitHeight: expandIconInner.implicitHeight - Appearance.padding.small * 2 + implicitHeight: expandIconInner.implicitHeight - Tokens.padding.small * 2 MaterialIcon { id: expandIconInner anchors.horizontalCenter: parent.horizontalCenter anchors.bottom: parent.bottom - anchors.bottomMargin: Config.bar.tray.background ? Appearance.padding.small : -Appearance.padding.small + anchors.bottomMargin: Config.bar.tray.background ? Tokens.padding.small : -Tokens.padding.small text: "expand_less" - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large rotation: root.expanded ? 180 : 0 Behavior on rotation { @@ -116,8 +116,8 @@ StyledRect { Behavior on implicitHeight { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } } diff --git a/modules/bar/components/TrayItem.qml b/modules/bar/components/TrayItem.qml index c5cb9fe8..1320eb2a 100644 --- a/modules/bar/components/TrayItem.qml +++ b/modules/bar/components/TrayItem.qml @@ -4,7 +4,7 @@ import QtQuick import Quickshell.Services.SystemTray import qs.components.effects import qs.services -import qs.config +import Caelestia.Config import qs.utils MouseArea { @@ -13,8 +13,8 @@ MouseArea { required property SystemTrayItem modelData acceptedButtons: Qt.LeftButton | Qt.RightButton - implicitWidth: Appearance.font.size.small * 2 - implicitHeight: Appearance.font.size.small * 2 + implicitWidth: Tokens.font.size.small * 2 + implicitHeight: Tokens.font.size.small * 2 onClicked: event => { if (event.button === Qt.LeftButton) diff --git a/modules/bar/components/workspaces/ActiveIndicator.qml b/modules/bar/components/workspaces/ActiveIndicator.qml index d10086fd..0c785901 100644 --- a/modules/bar/components/workspaces/ActiveIndicator.qml +++ b/modules/bar/components/workspaces/ActiveIndicator.qml @@ -2,7 +2,7 @@ import QtQuick import qs.components import qs.components.effects import qs.services -import qs.config +import Caelestia.Config StyledRect { id: root @@ -42,9 +42,9 @@ StyledRect { clip: true y: offset + mask.y - implicitWidth: Config.bar.sizes.innerWidth - Appearance.padding.small * 2 + implicitWidth: Config.bar.sizes.innerWidth - Tokens.padding.small * 2 implicitHeight: size - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: Colours.palette.m3primary Colouriser { @@ -70,7 +70,7 @@ StyledRect { enabled: Config.bar.workspaces.activeTrail EAnim { - duration: Appearance.anim.durations.normal * 2 + duration: Tokens.anim.durations.normal * 2 } } @@ -93,6 +93,6 @@ StyledRect { } component EAnim: Anim { - easing.bezierCurve: Appearance.anim.curves.emphasized + easing.bezierCurve: Tokens.anim.curves.emphasized } } diff --git a/modules/bar/components/workspaces/OccupiedBg.qml b/modules/bar/components/workspaces/OccupiedBg.qml index 3f087160..891b1250 100644 --- a/modules/bar/components/workspaces/OccupiedBg.qml +++ b/modules/bar/components/workspaces/OccupiedBg.qml @@ -4,7 +4,7 @@ import QtQuick import Quickshell import qs.components import qs.services -import qs.config +import Caelestia.Config Item { id: root @@ -65,18 +65,18 @@ Item { anchors.horizontalCenter: root.horizontalCenter y: (start?.y ?? 0) - 1 - implicitWidth: Config.bar.sizes.innerWidth - Appearance.padding.small * 2 + 2 + implicitWidth: Config.bar.sizes.innerWidth - Tokens.padding.small * 2 + 2 implicitHeight: start && end ? end.y + end.size - start.y + 2 : 0 color: Colours.layer(Colours.palette.m3surfaceContainerHigh, 2) - radius: Appearance.rounding.full + radius: Tokens.rounding.full scale: 0 Component.onCompleted: scale = 1 Behavior on scale { Anim { - easing.bezierCurve: Appearance.anim.curves.standardDecel + easing.bezierCurve: Tokens.anim.curves.standardDecel } } diff --git a/modules/bar/components/workspaces/SpecialWorkspaces.qml b/modules/bar/components/workspaces/SpecialWorkspaces.qml index cef8a990..741d4340 100644 --- a/modules/bar/components/workspaces/SpecialWorkspaces.qml +++ b/modules/bar/components/workspaces/SpecialWorkspaces.qml @@ -7,7 +7,7 @@ import Quickshell.Hyprland import qs.components import qs.components.effects import qs.services -import qs.config +import Caelestia.Config import qs.utils Item { @@ -31,7 +31,7 @@ Item { Rectangle { anchors.fill: parent - radius: Appearance.rounding.full + radius: Tokens.rounding.full gradient: Gradient { orientation: Gradient.Vertical @@ -60,7 +60,7 @@ Item { anchors.left: parent.left anchors.right: parent.right - radius: Appearance.rounding.full + radius: Tokens.rounding.full implicitHeight: parent.height / 2 opacity: view.contentY > 0 ? 0 : 1 @@ -74,9 +74,9 @@ Item { anchors.left: parent.left anchors.right: parent.right - radius: Appearance.rounding.full + radius: Tokens.rounding.full implicitHeight: parent.height / 2 - opacity: view.contentY < view.contentHeight - parent.height + Appearance.padding.small ? 0 : 1 + opacity: view.contentY < view.contentHeight - parent.height + Tokens.padding.small ? 0 : 1 Behavior on opacity { Anim {} @@ -88,7 +88,7 @@ Item { id: view anchors.fill: parent - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal interactive: false currentIndex: model.values.findIndex(w => w.name === root.activeSpecial) @@ -119,7 +119,7 @@ Item { properties: "scale" from: 0 to: 1 - easing.bezierCurve: Appearance.anim.curves.standardDecel + easing.bezierCurve: Tokens.anim.curves.standardDecel } } @@ -127,12 +127,12 @@ Item { Anim { property: "scale" to: 0.5 - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small } Anim { property: "opacity" to: 0 - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small } } @@ -140,7 +140,7 @@ Item { Anim { properties: "scale" to: 1 - easing.bezierCurve: Appearance.anim.curves.standardDecel + easing.bezierCurve: Tokens.anim.curves.standardDecel } Anim { properties: "x,y" @@ -151,7 +151,7 @@ Item { Anim { properties: "scale" to: 1 - easing.bezierCurve: Appearance.anim.curves.standardDecel + easing.bezierCurve: Tokens.anim.curves.standardDecel } Anim { properties: "x,y" @@ -175,7 +175,7 @@ Item { implicitHeight: (view.currentItem as SpecialWsDelegate)?.size ?? 0 color: Colours.palette.m3tertiary - radius: Appearance.rounding.full + radius: Tokens.rounding.full Colouriser { source: view @@ -192,13 +192,13 @@ Item { Behavior on y { Anim { - easing.bezierCurve: Appearance.anim.curves.emphasized + easing.bezierCurve: Tokens.anim.curves.emphasized } } Behavior on implicitHeight { Anim { - easing.bezierCurve: Appearance.anim.curves.emphasized + easing.bezierCurve: Tokens.anim.curves.emphasized } } } @@ -213,7 +213,7 @@ Item { drag.target: view.contentItem drag.axis: Drag.YAxis drag.maximumY: 0 - drag.minimumY: Math.min(0, view.height - view.contentHeight - Appearance.padding.small) + drag.minimumY: Math.min(0, view.height - view.contentHeight - Tokens.padding.small) onPressed: event => startY = event.y @@ -233,7 +233,7 @@ Item { id: ws required property HyprlandWorkspace modelData - readonly property int size: label.Layout.preferredHeight + (hasWindows ? windows.implicitHeight + Appearance.padding.small : 0) + readonly property int size: label.Layout.preferredHeight + (hasWindows ? windows.implicitHeight + Tokens.padding.small : 0) property int wsId property string icon property bool hasWindows @@ -284,7 +284,7 @@ Item { asynchronous: true Layout.alignment: Qt.AlignHCenter | Qt.AlignTop - Layout.preferredHeight: Config.bar.sizes.innerWidth - Appearance.padding.small * 2 + Layout.preferredHeight: Config.bar.sizes.innerWidth - Tokens.padding.small * 2 sourceComponent: ws.icon.length === 1 ? letterComp : iconComp @@ -328,7 +328,7 @@ Item { properties: "scale" from: 0 to: 1 - easing.bezierCurve: Appearance.anim.curves.standardDecel + easing.bezierCurve: Tokens.anim.curves.standardDecel } } @@ -336,7 +336,7 @@ Item { Anim { properties: "scale" to: 1 - easing.bezierCurve: Appearance.anim.curves.standardDecel + easing.bezierCurve: Tokens.anim.curves.standardDecel } Anim { properties: "x,y" diff --git a/modules/bar/components/workspaces/Workspace.qml b/modules/bar/components/workspaces/Workspace.qml index bfbdc2ac..af037051 100644 --- a/modules/bar/components/workspaces/Workspace.qml +++ b/modules/bar/components/workspaces/Workspace.qml @@ -5,7 +5,7 @@ import QtQuick.Layouts import Quickshell import qs.components import qs.services -import qs.config +import Caelestia.Config import qs.utils ColumnLayout { @@ -18,7 +18,7 @@ ColumnLayout { readonly property bool isWorkspace: true // Flag for finding workspace children // Unanimated prop for others to use as reference - readonly property int size: implicitHeight + (hasWindows ? Appearance.padding.small : 0) + readonly property int size: implicitHeight + (hasWindows ? Tokens.padding.small : 0) readonly property int ws: groupOffset + index + 1 readonly property bool isOccupied: occupied[ws] ?? false @@ -33,7 +33,7 @@ ColumnLayout { id: indicator Layout.alignment: Qt.AlignHCenter | Qt.AlignTop - Layout.preferredHeight: Config.bar.sizes.innerWidth - Appearance.padding.small * 2 + Layout.preferredHeight: Config.bar.sizes.innerWidth - Tokens.padding.small * 2 animate: true text: { @@ -74,7 +74,7 @@ ColumnLayout { properties: "scale" from: 0 to: 1 - easing.bezierCurve: Appearance.anim.curves.standardDecel + easing.bezierCurve: Tokens.anim.curves.standardDecel } } @@ -82,7 +82,7 @@ ColumnLayout { Anim { properties: "scale" to: 1 - easing.bezierCurve: Appearance.anim.curves.standardDecel + easing.bezierCurve: Tokens.anim.curves.standardDecel } Anim { properties: "x,y" diff --git a/modules/bar/components/workspaces/Workspaces.qml b/modules/bar/components/workspaces/Workspaces.qml index bbbfdfbc..a0ccb775 100644 --- a/modules/bar/components/workspaces/Workspaces.qml +++ b/modules/bar/components/workspaces/Workspaces.qml @@ -6,7 +6,7 @@ import QtQuick.Layouts import Quickshell import qs.components import qs.services -import qs.config +import Caelestia.Config StyledClippingRect { id: root @@ -28,10 +28,10 @@ StyledClippingRect { property real blur: onSpecial ? 1 : 0 implicitWidth: Config.bar.sizes.innerWidth - implicitHeight: layout.implicitHeight + Appearance.padding.small * 2 + implicitHeight: layout.implicitHeight + Tokens.padding.small * 2 color: Colours.tPalette.m3surfaceContainer - radius: Appearance.rounding.full + radius: Tokens.rounding.full Item { anchors.fill: parent @@ -51,7 +51,7 @@ StyledClippingRect { active: Config.bar.workspaces.occupiedBg anchors.fill: parent - anchors.margins: Appearance.padding.small + anchors.margins: Tokens.padding.small sourceComponent: OccupiedBg { workspaces: workspaces @@ -64,7 +64,7 @@ StyledClippingRect { id: layout anchors.centerIn: parent - spacing: Math.floor(Appearance.spacing.small / 2) + spacing: Math.floor(Tokens.spacing.small / 2) Repeater { id: workspaces @@ -118,7 +118,7 @@ StyledClippingRect { asynchronous: true anchors.fill: parent - anchors.margins: Appearance.padding.small + anchors.margins: Tokens.padding.small active: opacity > 0 @@ -140,7 +140,7 @@ StyledClippingRect { Behavior on blur { Anim { - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small } } } diff --git a/modules/bar/popouts/ActiveWindow.qml b/modules/bar/popouts/ActiveWindow.qml index 7e4bd60a..a37d81f9 100644 --- a/modules/bar/popouts/ActiveWindow.qml +++ b/modules/bar/popouts/ActiveWindow.qml @@ -4,7 +4,7 @@ import Quickshell.Wayland import Quickshell.Widgets import qs.components import qs.services -import qs.config +import Caelestia.Config import qs.utils Item { @@ -12,21 +12,21 @@ Item { required property PopoutState popouts - implicitWidth: Hypr.activeToplevel ? child.implicitWidth : -Appearance.padding.large * 2 + implicitWidth: Hypr.activeToplevel ? child.implicitWidth : -Tokens.padding.large * 2 implicitHeight: child.implicitHeight Column { id: child anchors.centerIn: parent - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal RowLayout { id: detailsRow anchors.left: parent.left anchors.right: parent.right - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal IconImage { id: icon @@ -46,7 +46,7 @@ Item { StyledText { Layout.fillWidth: true text: Hypr.activeToplevel?.title ?? "" - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal elide: Text.ElideRight } @@ -59,8 +59,8 @@ Item { } Item { - implicitWidth: expandIcon.implicitHeight + Appearance.padding.small * 2 - implicitHeight: expandIcon.implicitHeight + Appearance.padding.small * 2 + implicitWidth: expandIcon.implicitHeight + Tokens.padding.small * 2 + implicitHeight: expandIcon.implicitHeight + Tokens.padding.small * 2 Layout.alignment: Qt.AlignVCenter @@ -69,7 +69,7 @@ Item { root.popouts.detachRequested("winfo"); } - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal } MaterialIcon { @@ -80,14 +80,14 @@ Item { text: "chevron_right" - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large } } } ClippingWrapperRectangle { color: "transparent" - radius: Appearance.rounding.small + radius: Tokens.rounding.small ScreencopyView { id: preview diff --git a/modules/bar/popouts/Audio.qml b/modules/bar/popouts/Audio.qml index 52ac3b80..50bf1915 100644 --- a/modules/bar/popouts/Audio.qml +++ b/modules/bar/popouts/Audio.qml @@ -7,15 +7,15 @@ import Quickshell.Services.Pipewire import qs.components import qs.components.controls import qs.services -import qs.config +import Caelestia.Config Item { id: root required property PopoutState popouts - implicitWidth: layout.implicitWidth + Appearance.padding.normal * 2 - implicitHeight: layout.implicitHeight + Appearance.padding.normal * 2 + implicitWidth: layout.implicitWidth + Tokens.padding.normal * 2 + implicitHeight: layout.implicitHeight + Tokens.padding.normal * 2 ButtonGroup { id: sinks @@ -30,7 +30,7 @@ Item { anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal StyledText { text: qsTr("Output device") @@ -53,7 +53,7 @@ Item { } StyledText { - Layout.topMargin: Appearance.spacing.smaller + Layout.topMargin: Tokens.spacing.smaller text: qsTr("Input device") font.weight: 500 } @@ -72,15 +72,15 @@ Item { } StyledText { - Layout.topMargin: Appearance.spacing.smaller - Layout.bottomMargin: -Appearance.spacing.small / 2 + Layout.topMargin: Tokens.spacing.smaller + Layout.bottomMargin: -Tokens.spacing.small / 2 text: qsTr("Volume (%1)").arg(Audio.muted ? qsTr("Muted") : `${Math.round(Audio.volume * 100)}%`) font.weight: 500 } CustomMouseArea { Layout.fillWidth: true - implicitHeight: Appearance.padding.normal * 3 + implicitHeight: Tokens.padding.normal * 3 onWheel: event => { if (event.angleDelta.y > 0) @@ -105,10 +105,10 @@ Item { IconTextButton { Layout.fillWidth: true - Layout.topMargin: Appearance.spacing.normal + Layout.topMargin: Tokens.spacing.normal inactiveColour: Colours.palette.m3primaryContainer inactiveOnColour: Colours.palette.m3onPrimaryContainer - verticalPadding: Appearance.padding.small + verticalPadding: Tokens.padding.small text: qsTr("Open settings") icon: "settings" diff --git a/modules/bar/popouts/Battery.qml b/modules/bar/popouts/Battery.qml index 86d903d2..2a11071e 100644 --- a/modules/bar/popouts/Battery.qml +++ b/modules/bar/popouts/Battery.qml @@ -4,12 +4,12 @@ import QtQuick import Quickshell.Services.UPower import qs.components import qs.services -import qs.config +import Caelestia.Config Column { id: root - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal width: Config.bar.sizes.batteryWidth StyledText { @@ -45,11 +45,11 @@ Column { height: active ? ((item as Item)?.implicitHeight ?? 0) : 0 sourceComponent: StyledRect { - implicitWidth: child.implicitWidth + Appearance.padding.normal * 2 - implicitHeight: child.implicitHeight + Appearance.padding.smaller * 2 + implicitWidth: child.implicitWidth + Tokens.padding.normal * 2 + implicitHeight: child.implicitHeight + Tokens.padding.smaller * 2 color: Colours.palette.m3error - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal Column { id: child @@ -58,7 +58,7 @@ Column { Row { anchors.horizontalCenter: parent.horizontalCenter - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small MaterialIcon { anchors.verticalCenter: parent.verticalCenter @@ -72,7 +72,7 @@ Column { anchors.verticalCenter: parent.verticalCenter text: qsTr("Performance Degraded") color: Colours.palette.m3onError - font.family: Appearance.font.family.mono + font.family: Tokens.font.family.mono font.weight: 500 } @@ -109,17 +109,17 @@ Column { anchors.horizontalCenter: parent.horizontalCenter - implicitWidth: saver.implicitHeight + balance.implicitHeight + perf.implicitHeight + Appearance.padding.normal * 2 + Appearance.spacing.large * 2 - implicitHeight: Math.max(saver.implicitHeight, balance.implicitHeight, perf.implicitHeight) + Appearance.padding.small * 2 + implicitWidth: saver.implicitHeight + balance.implicitHeight + perf.implicitHeight + Tokens.padding.normal * 2 + Tokens.spacing.large * 2 + implicitHeight: Math.max(saver.implicitHeight, balance.implicitHeight, perf.implicitHeight) + Tokens.padding.small * 2 color: Colours.tPalette.m3surfaceContainer - radius: Appearance.rounding.full + radius: Tokens.rounding.full StyledRect { id: indicator color: Colours.palette.m3primary - radius: Appearance.rounding.full + radius: Tokens.rounding.full state: profiles.current states: [ @@ -148,9 +148,9 @@ Column { transitions: Transition { AnchorAnimation { - duration: Appearance.anim.durations.normal + duration: Tokens.anim.durations.normal easing.type: Easing.BezierSpline - easing.bezierCurve: Appearance.anim.curves.emphasized + easing.bezierCurve: Tokens.anim.curves.emphasized } } } @@ -160,7 +160,7 @@ Column { anchors.verticalCenter: parent.verticalCenter anchors.left: parent.left - anchors.leftMargin: Appearance.padding.small + anchors.leftMargin: Tokens.padding.small profile: PowerProfile.PowerSaver icon: "energy_savings_leaf" @@ -180,7 +180,7 @@ Column { anchors.verticalCenter: parent.verticalCenter anchors.right: parent.right - anchors.rightMargin: Appearance.padding.small + anchors.rightMargin: Tokens.padding.small profile: PowerProfile.Performance icon: "rocket_launch" @@ -201,15 +201,15 @@ Column { required property string icon required property int profile - implicitWidth: icon.implicitHeight + Appearance.padding.small * 2 - implicitHeight: icon.implicitHeight + Appearance.padding.small * 2 + implicitWidth: icon.implicitHeight + Tokens.padding.small * 2 + implicitHeight: icon.implicitHeight + Tokens.padding.small * 2 StateLayer { function onClicked(): void { PowerProfiles.profile = parent.profile; } - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: profiles.current === parent.icon ? Colours.palette.m3onPrimary : Colours.palette.m3onSurface } @@ -219,7 +219,7 @@ Column { anchors.centerIn: parent text: parent.icon - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large color: profiles.current === text ? Colours.palette.m3onPrimary : Colours.palette.m3onSurface fill: profiles.current === text ? 1 : 0 diff --git a/modules/bar/popouts/Bluetooth.qml b/modules/bar/popouts/Bluetooth.qml index 027b3d41..d5cc0f61 100644 --- a/modules/bar/popouts/Bluetooth.qml +++ b/modules/bar/popouts/Bluetooth.qml @@ -7,7 +7,7 @@ import Quickshell.Bluetooth import qs.components import qs.components.controls import qs.services -import qs.config +import Caelestia.Config import qs.utils ColumnLayout { @@ -16,11 +16,11 @@ ColumnLayout { required property PopoutState popouts width: 300 - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small StyledText { - Layout.topMargin: Appearance.padding.normal - Layout.rightMargin: Appearance.padding.small + Layout.topMargin: Tokens.padding.normal + Layout.rightMargin: Tokens.padding.small text: qsTr("Bluetooth") font.weight: 500 } @@ -46,8 +46,8 @@ ColumnLayout { } StyledText { - Layout.topMargin: Appearance.spacing.small - Layout.rightMargin: Appearance.padding.small + Layout.topMargin: Tokens.spacing.small + Layout.rightMargin: Tokens.padding.small text: { const devices = Bluetooth.devices.values; // qmllint disable unresolved-type let available = qsTr("%1 device%2 available").arg(devices.length).arg(devices.length === 1 ? "" : "s"); @@ -57,7 +57,7 @@ ColumnLayout { return available; } color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } Repeater { @@ -72,8 +72,8 @@ ColumnLayout { readonly property bool loading: modelData.state === BluetoothDeviceState.Connecting || modelData.state === BluetoothDeviceState.Disconnecting // qmllint disable unresolved-type Layout.fillWidth: true - Layout.rightMargin: Appearance.padding.small - spacing: Appearance.spacing.small + Layout.rightMargin: Tokens.padding.small + spacing: Tokens.spacing.small opacity: 0 scale: 0.7 @@ -96,8 +96,8 @@ ColumnLayout { } StyledText { - Layout.leftMargin: Appearance.spacing.small / 2 - Layout.rightMargin: Appearance.spacing.small / 2 + Layout.leftMargin: Tokens.spacing.small / 2 + Layout.rightMargin: Tokens.spacing.small / 2 Layout.fillWidth: true text: device.modelData.name elide: Text.ElideRight @@ -113,9 +113,9 @@ ColumnLayout { id: connectBtn implicitWidth: implicitHeight - implicitHeight: connectIcon.implicitHeight + Appearance.padding.small + implicitHeight: connectIcon.implicitHeight + Tokens.padding.small - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: Qt.alpha(Colours.palette.m3primary, device.modelData.state === BluetoothDeviceState.Connected ? 1 : 0) // qmllint disable unresolved-type CircularIndicator { @@ -161,7 +161,7 @@ ColumnLayout { device.modelData.forget(); } - radius: Appearance.rounding.full + radius: Tokens.rounding.full } MaterialIcon { @@ -175,10 +175,10 @@ ColumnLayout { IconTextButton { Layout.fillWidth: true - Layout.topMargin: Appearance.spacing.normal + Layout.topMargin: Tokens.spacing.normal inactiveColour: Colours.palette.m3primaryContainer inactiveOnColour: Colours.palette.m3onPrimaryContainer - verticalPadding: Appearance.padding.small + verticalPadding: Tokens.padding.small text: qsTr("Open settings") icon: "settings" @@ -191,8 +191,8 @@ ColumnLayout { property alias toggle: toggle Layout.fillWidth: true - Layout.rightMargin: Appearance.padding.small - spacing: Appearance.spacing.normal + Layout.rightMargin: Tokens.padding.small + spacing: Tokens.spacing.normal StyledText { Layout.fillWidth: true diff --git a/modules/bar/popouts/ClipWrapper.qml b/modules/bar/popouts/ClipWrapper.qml index bf2a0049..810ac2e5 100644 --- a/modules/bar/popouts/ClipWrapper.qml +++ b/modules/bar/popouts/ClipWrapper.qml @@ -3,7 +3,7 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell import qs.components -import qs.config +import Caelestia.Config import qs.modules.bar.popouts // Need to import this module so the Wrapper type is the same as others Item { @@ -35,8 +35,8 @@ Item { Behavior on offsetScale { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } diff --git a/modules/bar/popouts/Content.qml b/modules/bar/popouts/Content.qml index 71a8c5eb..381d3ef0 100644 --- a/modules/bar/popouts/Content.qml +++ b/modules/bar/popouts/Content.qml @@ -5,7 +5,7 @@ import QtQuick import Quickshell import Quickshell.Services.SystemTray import qs.components -import qs.config +import Caelestia.Config Item { id: root @@ -14,14 +14,14 @@ Item { readonly property Popout currentPopout: content.children.find(c => c.shouldBeActive) ?? null readonly property Item current: currentPopout?.item ?? null - implicitWidth: (currentPopout?.implicitWidth ?? 0) + Appearance.padding.large * 2 - implicitHeight: (currentPopout?.implicitHeight ?? 0) + Appearance.padding.large * 2 + implicitWidth: (currentPopout?.implicitWidth ?? 0) + Tokens.padding.large * 2 + implicitHeight: (currentPopout?.implicitHeight ?? 0) + Tokens.padding.large * 2 Item { id: content anchors.fill: parent - anchors.margins: Appearance.padding.large + anchors.margins: Tokens.padding.large Popout { name: "activewindow" @@ -194,7 +194,7 @@ Item { SequentialAnimation { Anim { properties: "opacity,scale" - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small } PropertyAction { target: popout diff --git a/modules/bar/popouts/LockStatus.qml b/modules/bar/popouts/LockStatus.qml index 9b61e037..4d646a0c 100644 --- a/modules/bar/popouts/LockStatus.qml +++ b/modules/bar/popouts/LockStatus.qml @@ -1,10 +1,10 @@ import QtQuick.Layouts import qs.components import qs.services -import qs.config +import Caelestia.Config ColumnLayout { - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small StyledText { text: qsTr("Capslock: %1").arg(Hypr.capsLock ? "Enabled" : "Disabled") diff --git a/modules/bar/popouts/Network.qml b/modules/bar/popouts/Network.qml index 53350ee7..6bcf6604 100644 --- a/modules/bar/popouts/Network.qml +++ b/modules/bar/popouts/Network.qml @@ -6,7 +6,7 @@ import Quickshell import qs.components import qs.components.controls import qs.services -import qs.config +import Caelestia.Config import qs.utils ColumnLayout { @@ -19,15 +19,15 @@ ColumnLayout { property var passwordNetwork: null property bool showPasswordDialog: false - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small width: Config.bar.sizes.networkWidth // Wireless section StyledText { visible: root.view === "wireless" Layout.preferredHeight: visible ? implicitHeight : 0 - Layout.topMargin: visible ? Appearance.padding.normal : 0 - Layout.rightMargin: Appearance.padding.small + Layout.topMargin: visible ? Tokens.padding.normal : 0 + Layout.rightMargin: Tokens.padding.small text: qsTr("Wireless") font.weight: 500 } @@ -43,11 +43,11 @@ ColumnLayout { StyledText { visible: root.view === "wireless" Layout.preferredHeight: visible ? implicitHeight : 0 - Layout.topMargin: visible ? Appearance.spacing.small : 0 - Layout.rightMargin: Appearance.padding.small + Layout.topMargin: visible ? Tokens.spacing.small : 0 + Layout.rightMargin: Tokens.padding.small text: qsTr("%1 networks available").arg(Nmcli.networks.length) // qmllint disable missing-property color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } Repeater { @@ -70,8 +70,8 @@ ColumnLayout { visible: root.view === "wireless" Layout.preferredHeight: visible ? implicitHeight : 0 Layout.fillWidth: true - Layout.rightMargin: Appearance.padding.small - spacing: Appearance.spacing.small + Layout.rightMargin: Tokens.padding.small + spacing: Tokens.spacing.small opacity: 0 scale: 0.7 @@ -97,12 +97,12 @@ ColumnLayout { MaterialIcon { visible: networkItem.modelData.isSecure text: "lock" - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } StyledText { - Layout.leftMargin: Appearance.spacing.small / 2 - Layout.rightMargin: Appearance.spacing.small / 2 + Layout.leftMargin: Tokens.spacing.small / 2 + Layout.rightMargin: Tokens.spacing.small / 2 Layout.fillWidth: true text: networkItem.modelData.ssid elide: Text.ElideRight @@ -112,9 +112,9 @@ ColumnLayout { StyledRect { implicitWidth: implicitHeight - implicitHeight: wirelessConnectIcon.implicitHeight + Appearance.padding.small + implicitHeight: wirelessConnectIcon.implicitHeight + Tokens.padding.small - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: Qt.alpha(Colours.palette.m3primary, networkItem.modelData.active ? 1 : 0) CircularIndicator { @@ -165,11 +165,11 @@ ColumnLayout { StyledRect { visible: root.view === "wireless" Layout.preferredHeight: visible ? implicitHeight : 0 - Layout.topMargin: visible ? Appearance.spacing.small : 0 + Layout.topMargin: visible ? Tokens.spacing.small : 0 Layout.fillWidth: true - implicitHeight: rescanBtn.implicitHeight + Appearance.padding.small * 2 + implicitHeight: rescanBtn.implicitHeight + Tokens.padding.small * 2 - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: Colours.palette.m3primaryContainer StateLayer { @@ -185,7 +185,7 @@ ColumnLayout { id: rescanBtn anchors.centerIn: parent - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small opacity: Nmcli.scanning ? 0 : 1 MaterialIcon { @@ -210,9 +210,9 @@ ColumnLayout { CircularIndicator { anchors.centerIn: parent - strokeWidth: Appearance.padding.small / 2 + strokeWidth: Tokens.padding.small / 2 bgColour: "transparent" - implicitSize: parent.implicitHeight - Appearance.padding.smaller * 2 + implicitSize: parent.implicitHeight - Tokens.padding.smaller * 2 running: Nmcli.scanning } } @@ -221,8 +221,8 @@ ColumnLayout { StyledText { visible: root.view === "ethernet" Layout.preferredHeight: visible ? implicitHeight : 0 - Layout.topMargin: visible ? Appearance.padding.normal : 0 - Layout.rightMargin: Appearance.padding.small + Layout.topMargin: visible ? Tokens.padding.normal : 0 + Layout.rightMargin: Tokens.padding.small text: qsTr("Ethernet") font.weight: 500 } @@ -230,11 +230,11 @@ ColumnLayout { StyledText { visible: root.view === "ethernet" Layout.preferredHeight: visible ? implicitHeight : 0 - Layout.topMargin: visible ? Appearance.spacing.small : 0 - Layout.rightMargin: Appearance.padding.small + Layout.topMargin: visible ? Tokens.spacing.small : 0 + Layout.rightMargin: Tokens.padding.small text: qsTr("%1 devices available").arg(Nmcli.ethernetDevices.length) color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } Repeater { @@ -256,8 +256,8 @@ ColumnLayout { visible: root.view === "ethernet" Layout.preferredHeight: visible ? implicitHeight : 0 Layout.fillWidth: true - Layout.rightMargin: Appearance.padding.small - spacing: Appearance.spacing.small + Layout.rightMargin: Tokens.padding.small + spacing: Tokens.spacing.small opacity: 0 scale: 0.7 @@ -281,8 +281,8 @@ ColumnLayout { } StyledText { - Layout.leftMargin: Appearance.spacing.small / 2 - Layout.rightMargin: Appearance.spacing.small / 2 + Layout.leftMargin: Tokens.spacing.small / 2 + Layout.rightMargin: Tokens.spacing.small / 2 Layout.fillWidth: true text: ethernetItem.modelData.interface || qsTr("Unknown") elide: Text.ElideRight @@ -292,9 +292,9 @@ ColumnLayout { StyledRect { implicitWidth: implicitHeight - implicitHeight: connectIcon.implicitHeight + Appearance.padding.small + implicitHeight: connectIcon.implicitHeight + Tokens.padding.small - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: Qt.alpha(Colours.palette.m3primary, ethernetItem.modelData.connected ? 1 : 0) CircularIndicator { @@ -374,8 +374,8 @@ ColumnLayout { property alias toggle: toggle Layout.fillWidth: true - Layout.rightMargin: Appearance.padding.small - spacing: Appearance.spacing.normal + Layout.rightMargin: Tokens.padding.small + spacing: Tokens.spacing.normal StyledText { Layout.fillWidth: true diff --git a/modules/bar/popouts/TrayMenu.qml b/modules/bar/popouts/TrayMenu.qml index 4347e39e..f39d64b0 100644 --- a/modules/bar/popouts/TrayMenu.qml +++ b/modules/bar/popouts/TrayMenu.qml @@ -6,7 +6,7 @@ import Quickshell import Quickshell.Widgets import qs.components import qs.services -import qs.config +import Caelestia.Config StackView { id: root @@ -45,8 +45,8 @@ StackView { property bool isSubMenu property bool shown - padding: Appearance.padding.smaller - spacing: Appearance.spacing.small + padding: Tokens.padding.smaller + spacing: Tokens.spacing.small opacity: shown ? 1 : 0 scale: shown ? 1 : 0.8 @@ -81,7 +81,7 @@ StackView { implicitWidth: Config.bar.sizes.trayMenuWidth implicitHeight: modelData.isSeparator ? 1 : children.implicitHeight - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: modelData.isSeparator ? Colours.palette.m3outlineVariant : "transparent" Loader { @@ -110,9 +110,9 @@ StackView { } } - anchors.margins: -Appearance.padding.small / 2 - anchors.leftMargin: -Appearance.padding.smaller - anchors.rightMargin: -Appearance.padding.smaller + anchors.margins: -Tokens.padding.small / 2 + anchors.leftMargin: -Tokens.padding.smaller + anchors.rightMargin: -Tokens.padding.smaller radius: item.radius disabled: !item.modelData.enabled @@ -138,7 +138,7 @@ StackView { id: label anchors.left: icon.right - anchors.leftMargin: icon.active ? Appearance.spacing.smaller : 0 + anchors.leftMargin: icon.active ? Tokens.spacing.smaller : 0 text: labelMetrics.elidedText color: item.modelData.enabled ? Colours.palette.m3onSurface : Colours.palette.m3outline @@ -152,7 +152,7 @@ StackView { font.family: label.font.family elide: Text.ElideRight - elideWidth: Config.bar.sizes.trayMenuWidth - (icon.active ? icon.implicitWidth + label.anchors.leftMargin : 0) - (expand.active ? expand.implicitWidth + Appearance.spacing.normal : 0) + elideWidth: Config.bar.sizes.trayMenuWidth - (icon.active ? icon.implicitWidth + label.anchors.leftMargin : 0) - (expand.active ? expand.implicitWidth + Tokens.spacing.normal : 0) } Loader { @@ -180,7 +180,7 @@ StackView { sourceComponent: Item { implicitWidth: back.implicitWidth - implicitHeight: back.implicitHeight + Appearance.spacing.small / 2 + implicitHeight: back.implicitHeight + Tokens.spacing.small / 2 Item { anchors.bottom: parent.bottom @@ -189,11 +189,11 @@ StackView { StyledRect { anchors.fill: parent - anchors.margins: -Appearance.padding.small / 2 - anchors.leftMargin: -Appearance.padding.smaller - anchors.rightMargin: -Appearance.padding.smaller * 2 + anchors.margins: -Tokens.padding.small / 2 + anchors.leftMargin: -Tokens.padding.smaller + anchors.rightMargin: -Tokens.padding.smaller * 2 - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: Colours.palette.m3secondaryContainer StateLayer { diff --git a/modules/bar/popouts/WirelessPassword.qml b/modules/bar/popouts/WirelessPassword.qml index 8858273d..15317069 100644 --- a/modules/bar/popouts/WirelessPassword.qml +++ b/modules/bar/popouts/WirelessPassword.qml @@ -6,7 +6,7 @@ import Quickshell import qs.components import qs.components.controls import qs.services -import qs.config +import Caelestia.Config import qs.utils ColumnLayout { @@ -69,9 +69,9 @@ ColumnLayout { } } - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal implicitWidth: 400 - implicitHeight: content.implicitHeight + Appearance.padding.large * 2 + implicitHeight: content.implicitHeight + Tokens.padding.large * 2 visible: shouldBeVisible || isClosing enabled: shouldBeVisible && !isClosing focus: enabled @@ -128,8 +128,8 @@ ColumnLayout { StyledRect { Layout.fillWidth: true Layout.preferredWidth: 400 - implicitHeight: content.implicitHeight + Appearance.padding.large * 2 - radius: Appearance.rounding.normal + implicitHeight: content.implicitHeight + Tokens.padding.large * 2 + radius: Tokens.rounding.normal color: Colours.tPalette.m3surfaceContainer visible: root.shouldBeVisible || root.isClosing opacity: root.shouldBeVisible && !root.isClosing ? 1 : 0 @@ -170,20 +170,20 @@ ColumnLayout { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.large + anchors.margins: Tokens.padding.large - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal MaterialIcon { Layout.alignment: Qt.AlignHCenter text: "lock" - font.pointSize: Appearance.font.size.extraLarge * 2 + font.pointSize: Tokens.font.size.extraLarge * 2 } StyledText { Layout.alignment: Qt.AlignHCenter text: qsTr("Enter password") - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large font.weight: 500 } @@ -201,7 +201,7 @@ ColumnLayout { return qsTr("Network: Unknown"); } color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } Timer { @@ -237,7 +237,7 @@ ColumnLayout { id: statusText Layout.alignment: Qt.AlignHCenter - Layout.topMargin: Appearance.spacing.small + Layout.topMargin: Tokens.spacing.small visible: connectButton.connecting || connectButton.hasError text: { if (connectButton.hasError) { @@ -249,10 +249,10 @@ ColumnLayout { return ""; } color: connectButton.hasError ? Colours.palette.m3error : Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small font.weight: 400 wrapMode: Text.WordWrap - Layout.maximumWidth: parent.width - Appearance.padding.large * 2 + Layout.maximumWidth: parent.width - Tokens.padding.large * 2 } FocusScope { @@ -261,9 +261,9 @@ ColumnLayout { property string passwordBuffer: "" objectName: "passwordContainer" - Layout.topMargin: Appearance.spacing.large + Layout.topMargin: Tokens.spacing.large Layout.fillWidth: true - implicitHeight: Math.max(48, charList.implicitHeight + Appearance.padding.normal * 2) + implicitHeight: Math.max(48, charList.implicitHeight + Tokens.padding.normal * 2) focus: true activeFocusOnTab: true @@ -336,7 +336,7 @@ ColumnLayout { StyledRect { anchors.fill: parent - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: passwordContainer.activeFocus ? Qt.lighter(Colours.tPalette.m3surfaceContainer, 1.05) : Colours.tPalette.m3surfaceContainer border.width: passwordContainer.activeFocus || connectButton.hasError ? 4 : (root.shouldBeVisible ? 1 : 0) border.color: { @@ -369,7 +369,7 @@ ColumnLayout { hoverEnabled: false cursorShape: Qt.IBeamCursor - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal } StyledText { @@ -378,8 +378,8 @@ ColumnLayout { anchors.centerIn: parent text: qsTr("Password") color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.normal - font.family: Appearance.font.family.mono + font.pointSize: Tokens.font.size.normal + font.family: Tokens.font.family.mono opacity: passwordContainer.passwordBuffer ? 0 : 1 Behavior on opacity { @@ -394,10 +394,10 @@ ColumnLayout { anchors.centerIn: parent implicitWidth: fullWidth - implicitHeight: Appearance.font.size.normal + implicitHeight: Tokens.font.size.normal orientation: Qt.Horizontal - spacing: Appearance.spacing.small / 2 + spacing: Tokens.spacing.small / 2 interactive: false model: ScriptModel { @@ -411,7 +411,7 @@ ColumnLayout { implicitHeight: charList.implicitHeight color: Colours.palette.m3onSurface - radius: Appearance.rounding.small / 2 + radius: Tokens.rounding.small / 2 opacity: 0 scale: 0 @@ -454,8 +454,8 @@ ColumnLayout { Behavior on scale { Anim { - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } } } @@ -467,15 +467,15 @@ ColumnLayout { } RowLayout { - Layout.topMargin: Appearance.spacing.normal + Layout.topMargin: Tokens.spacing.normal Layout.fillWidth: true - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal TextButton { id: cancelButton Layout.fillWidth: true - Layout.minimumHeight: Appearance.font.size.normal + Appearance.padding.normal * 2 + Layout.minimumHeight: Tokens.font.size.normal + Tokens.padding.normal * 2 inactiveColour: Colours.palette.m3secondaryContainer inactiveOnColour: Colours.palette.m3onSecondaryContainer text: qsTr("Cancel") @@ -490,7 +490,7 @@ ColumnLayout { property bool hasError: false Layout.fillWidth: true - Layout.minimumHeight: Appearance.font.size.normal + Appearance.padding.normal * 2 + Layout.minimumHeight: Tokens.font.size.normal + Tokens.padding.normal * 2 inactiveColour: Colours.palette.m3primary inactiveOnColour: Colours.palette.m3onPrimary text: qsTr("Connect") diff --git a/modules/bar/popouts/Wrapper.qml b/modules/bar/popouts/Wrapper.qml index 04212e28..fbf5075f 100644 --- a/modules/bar/popouts/Wrapper.qml +++ b/modules/bar/popouts/Wrapper.qml @@ -6,7 +6,7 @@ import Quickshell.Hyprland import Quickshell.Wayland import qs.components import qs.services -import qs.config +import Caelestia.Config import qs.modules.controlcenter import qs.modules.windowinfo @@ -32,13 +32,13 @@ Item { property string detachedMode property string queuedMode - property int animLength: Appearance.anim.durations.expressiveDefaultSpatial - property list animCurve: Appearance.anim.curves.expressiveDefaultSpatial + property int animLength: Tokens.anim.durations.expressiveDefaultSpatial + property list animCurve: Tokens.anim.curves.expressiveDefaultSpatial function setAnims(detach: bool): void { const type = `expressive${detach ? "Slow" : "Default"}Spatial`; - animLength = Appearance.anim.durations[type]; - animCurve = Appearance.anim.curves[type]; + animLength = Tokens.anim.durations[type]; + animCurve = Tokens.anim.curves[type]; } function detach(mode: string): void { diff --git a/modules/bar/popouts/kblayout/KbLayout.qml b/modules/bar/popouts/kblayout/KbLayout.qml index 3e581902..5767de46 100644 --- a/modules/bar/popouts/kblayout/KbLayout.qml +++ b/modules/bar/popouts/kblayout/KbLayout.qml @@ -5,7 +5,7 @@ import QtQuick.Controls import QtQuick.Layouts import qs.components import qs.services -import qs.config +import Caelestia.Config ColumnLayout { id: root @@ -14,7 +14,7 @@ ColumnLayout { kb.refresh(); } - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small width: Config.bar.sizes.kbLayoutWidth Component.onCompleted: kb.start() @@ -24,8 +24,8 @@ ColumnLayout { } StyledText { - Layout.topMargin: Appearance.padding.normal - Layout.rightMargin: Appearance.padding.small + Layout.topMargin: Tokens.padding.normal + Layout.rightMargin: Tokens.padding.small text: qsTr("Keyboard Layouts") font.weight: 500 } @@ -36,14 +36,14 @@ ColumnLayout { model: kb.visibleModel Layout.fillWidth: true - Layout.rightMargin: Appearance.padding.small - Layout.topMargin: Appearance.spacing.small + Layout.rightMargin: Tokens.padding.small + Layout.topMargin: Tokens.spacing.small clip: true interactive: true implicitHeight: Math.min(contentHeight, 320) visible: kb.visibleModel.count > 0 - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small add: Transition { NumberAnimation { @@ -88,7 +88,7 @@ ColumnLayout { readonly property bool isDisabled: layoutIndex > 3 width: list.width - height: Math.max(36, rowText.implicitHeight + Appearance.padding.small * 2) + height: Math.max(36, rowText.implicitHeight + Tokens.padding.small * 2) ToolTip.visible: isDisabled && layer.containsMouse ToolTip.text: "XKB limitation: maximum 4 layouts allowed" @@ -104,7 +104,7 @@ ColumnLayout { anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter implicitHeight: parent.height - 4 - radius: Appearance.rounding.full + radius: Tokens.rounding.full enabled: !kbDelegate.isDisabled } @@ -114,8 +114,8 @@ ColumnLayout { anchors.verticalCenter: layer.verticalCenter anchors.left: layer.left anchors.right: layer.right - anchors.leftMargin: Appearance.padding.small - anchors.rightMargin: Appearance.padding.small + anchors.leftMargin: Tokens.padding.small + anchors.rightMargin: Tokens.padding.small text: kbDelegate.label elide: Text.ElideRight opacity: kbDelegate.isDisabled ? 0.4 : 1.0 @@ -126,8 +126,8 @@ ColumnLayout { Rectangle { visible: kb.activeLabel.length > 0 Layout.fillWidth: true - Layout.rightMargin: Appearance.padding.small - Layout.topMargin: Appearance.spacing.small + Layout.rightMargin: Tokens.padding.small + Layout.topMargin: Tokens.spacing.small implicitHeight: 1 color: Colours.palette.m3onSurfaceVariant @@ -139,9 +139,9 @@ ColumnLayout { visible: kb.activeLabel.length > 0 Layout.fillWidth: true - Layout.rightMargin: Appearance.padding.small - Layout.topMargin: Appearance.spacing.small - spacing: Appearance.spacing.small + Layout.rightMargin: Tokens.padding.small + Layout.topMargin: Tokens.spacing.small + spacing: Tokens.spacing.small opacity: 1 scale: 1 diff --git a/modules/bar/popouts/kblayout/KbLayoutModel.qml b/modules/bar/popouts/kblayout/KbLayoutModel.qml index 4caebbd2..b6535847 100644 --- a/modules/bar/popouts/kblayout/KbLayoutModel.qml +++ b/modules/bar/popouts/kblayout/KbLayoutModel.qml @@ -3,7 +3,7 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell.Io import Caelestia -import qs.config +import Caelestia.Config // TODO: handle this better later diff --git a/modules/controlcenter/ControlCenter.qml b/modules/controlcenter/ControlCenter.qml index 5b067fc0..9b1f01ea 100644 --- a/modules/controlcenter/ControlCenter.qml +++ b/modules/controlcenter/ControlCenter.qml @@ -6,13 +6,13 @@ import Quickshell import qs.components import qs.components.controls import qs.services -import qs.config +import Caelestia.Config Item { id: root required property ShellScreen screen - readonly property int rounding: floating ? 0 : Appearance.rounding.normal + readonly property int rounding: floating ? 0 : Tokens.rounding.normal property alias floating: session.floating property alias active: session.active diff --git a/modules/controlcenter/NavRail.qml b/modules/controlcenter/NavRail.qml index 037ea0d6..706d9d98 100644 --- a/modules/controlcenter/NavRail.qml +++ b/modules/controlcenter/NavRail.qml @@ -5,7 +5,7 @@ import QtQuick.Layouts import Quickshell import qs.components import qs.services -import qs.config +import Caelestia.Config import qs.modules.controlcenter Item { @@ -15,23 +15,23 @@ Item { required property Session session required property bool initialOpeningComplete - implicitWidth: layout.implicitWidth + Appearance.padding.larger * 4 - implicitHeight: layout.implicitHeight + Appearance.padding.large * 2 + implicitWidth: layout.implicitWidth + Tokens.padding.larger * 4 + implicitHeight: layout.implicitHeight + Tokens.padding.large * 2 ColumnLayout { id: layout anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter - anchors.leftMargin: Appearance.padding.larger * 2 - spacing: Appearance.spacing.normal + anchors.leftMargin: Tokens.padding.larger * 2 + spacing: Tokens.spacing.normal states: State { name: "expanded" when: root.session.navExpanded PropertyChanges { - layout.spacing: Appearance.spacing.small + layout.spacing: Tokens.spacing.small } } @@ -42,7 +42,7 @@ Item { } Loader { - Layout.topMargin: Appearance.spacing.large + Layout.topMargin: Tokens.spacing.large asynchronous: true active: !root.session.floating visible: active @@ -51,10 +51,10 @@ Item { readonly property int nonAnimWidth: normalWinIcon.implicitWidth + (root.session.navExpanded ? normalWinLabel.anchors.leftMargin + normalWinLabel.implicitWidth : 0) + normalWinIcon.anchors.leftMargin * 2 implicitWidth: nonAnimWidth - implicitHeight: root.session.navExpanded ? normalWinIcon.implicitHeight + Appearance.padding.normal * 2 : nonAnimWidth + implicitHeight: root.session.navExpanded ? normalWinIcon.implicitHeight + Tokens.padding.normal * 2 : nonAnimWidth color: Colours.palette.m3primaryContainer - radius: Appearance.rounding.small + radius: Tokens.rounding.small StateLayer { id: normalWinState @@ -75,11 +75,11 @@ Item { anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter - anchors.leftMargin: Appearance.padding.large + anchors.leftMargin: Tokens.padding.large text: "select_window" color: Colours.palette.m3onPrimaryContainer - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large fill: 1 } @@ -88,7 +88,7 @@ Item { anchors.left: normalWinIcon.right anchors.verticalCenter: parent.verticalCenter - anchors.leftMargin: Appearance.spacing.normal + anchors.leftMargin: Tokens.spacing.normal text: qsTr("Float window") color: Colours.palette.m3onPrimaryContainer @@ -96,22 +96,22 @@ Item { Behavior on opacity { Anim { - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small } } } Behavior on implicitWidth { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } Behavior on implicitHeight { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } } @@ -123,7 +123,7 @@ Item { NavItem { required property int index - Layout.topMargin: index === 0 ? Appearance.spacing.large * 2 : 0 + Layout.topMargin: index === 0 ? Tokens.spacing.large * 2 : 0 icon: PaneRegistry.getByIndex(index).icon label: PaneRegistry.getByIndex(index).label } @@ -148,7 +148,7 @@ Item { expandedLabel.opacity: 1 smallLabel.opacity: 0 background.implicitWidth: icon.implicitWidth + icon.anchors.leftMargin * 2 + expandedLabel.anchors.leftMargin + expandedLabel.implicitWidth - background.implicitHeight: icon.implicitHeight + Appearance.padding.normal * 2 + background.implicitHeight: icon.implicitHeight + Tokens.padding.normal * 2 item.implicitHeight: background.implicitHeight } } @@ -156,24 +156,24 @@ Item { transitions: Transition { Anim { property: "opacity" - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small } Anim { properties: "implicitWidth,implicitHeight" - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } StyledRect { id: background - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: Qt.alpha(Colours.palette.m3secondaryContainer, item.active ? 1 : 0) implicitWidth: icon.implicitWidth + icon.anchors.leftMargin * 2 - implicitHeight: icon.implicitHeight + Appearance.padding.small + implicitHeight: icon.implicitHeight + Tokens.padding.small StateLayer { function onClicked(): void { @@ -192,11 +192,11 @@ Item { anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter - anchors.leftMargin: Appearance.padding.large + anchors.leftMargin: Tokens.padding.large text: item.icon color: item.active ? Colours.palette.m3onSecondaryContainer : Colours.palette.m3onSurface - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large fill: item.active ? 1 : 0 Behavior on fill { @@ -209,7 +209,7 @@ Item { anchors.left: icon.right anchors.verticalCenter: parent.verticalCenter - anchors.leftMargin: Appearance.spacing.normal + anchors.leftMargin: Tokens.spacing.normal opacity: 0 text: item.label @@ -222,10 +222,10 @@ Item { anchors.horizontalCenter: icon.horizontalCenter anchors.top: icon.bottom - anchors.topMargin: Appearance.spacing.small / 2 + anchors.topMargin: Tokens.spacing.small / 2 text: item.label - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small font.capitalization: Font.Capitalize } } diff --git a/modules/controlcenter/Panes.qml b/modules/controlcenter/Panes.qml index 6a536410..c8718528 100644 --- a/modules/controlcenter/Panes.qml +++ b/modules/controlcenter/Panes.qml @@ -13,7 +13,7 @@ import QtQuick.Layouts import Quickshell.Widgets import qs.components import qs.services -import qs.config +import Caelestia.Config import qs.modules.controlcenter ClippingRectangle { @@ -58,7 +58,7 @@ ClippingRectangle { Timer { id: animationDelayTimer - interval: Appearance.anim.durations.normal + interval: Tokens.anim.durations.normal onTriggered: { layout.animationComplete = true; } @@ -67,7 +67,7 @@ ClippingRectangle { Timer { id: initialOpeningTimer - interval: Appearance.anim.durations.large + interval: Tokens.anim.durations.large running: true onTriggered: { layout.initialOpeningComplete = true; diff --git a/modules/controlcenter/WindowTitle.qml b/modules/controlcenter/WindowTitle.qml index a55445c5..1993446f 100644 --- a/modules/controlcenter/WindowTitle.qml +++ b/modules/controlcenter/WindowTitle.qml @@ -2,7 +2,7 @@ import QtQuick import Quickshell import qs.components import qs.services -import qs.config +import Caelestia.Config StyledRect { id: root @@ -10,7 +10,7 @@ StyledRect { required property ShellScreen screen required property Session session - implicitHeight: text.implicitHeight + Appearance.padding.normal + implicitHeight: text.implicitHeight + Tokens.padding.normal color: Colours.tPalette.m3surfaceContainer StyledText { @@ -21,24 +21,24 @@ StyledRect { text: qsTr("Caelestia Settings - %1").arg(root.session.active) font.capitalization: Font.Capitalize - font.pointSize: Appearance.font.size.larger + font.pointSize: Tokens.font.size.larger font.weight: 500 } Item { anchors.right: parent.right anchors.top: parent.top - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal implicitWidth: implicitHeight - implicitHeight: closeIcon.implicitHeight + Appearance.padding.small + implicitHeight: closeIcon.implicitHeight + Tokens.padding.small StateLayer { function onClicked(): void { QsWindow.window.destroy(); } - radius: Appearance.rounding.full + radius: Tokens.rounding.full } MaterialIcon { diff --git a/modules/controlcenter/appearance/AppearancePane.qml b/modules/controlcenter/appearance/AppearancePane.qml index c0ccfcd7..472c654a 100644 --- a/modules/controlcenter/appearance/AppearancePane.qml +++ b/modules/controlcenter/appearance/AppearancePane.qml @@ -15,7 +15,7 @@ import qs.components.controls import qs.components.effects import qs.components.images import qs.services -import qs.config +import Caelestia.Config import qs.utils Item { @@ -111,9 +111,9 @@ Item { StyledText { Layout.alignment: Qt.AlignHCenter - Layout.bottomMargin: Appearance.spacing.normal + Layout.bottomMargin: Tokens.spacing.normal text: qsTr("Wallpaper") - font.pointSize: Appearance.font.size.extraLarge + font.pointSize: Tokens.font.size.extraLarge font.weight: 600 } @@ -122,7 +122,7 @@ Item { Layout.fillWidth: true Layout.fillHeight: true - Layout.bottomMargin: -Appearance.padding.large * 2 + Layout.bottomMargin: -Tokens.padding.large * 2 asynchronous: true active: { @@ -172,14 +172,14 @@ Item { anchors.left: parent.left anchors.right: parent.right - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small RowLayout { - spacing: Appearance.spacing.smaller + spacing: Tokens.spacing.smaller StyledText { text: qsTr("Appearance") - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large font.weight: 500 } diff --git a/modules/controlcenter/appearance/sections/AnimationsSection.qml b/modules/controlcenter/appearance/sections/AnimationsSection.qml index e4d8a033..e5e973e2 100644 --- a/modules/controlcenter/appearance/sections/AnimationsSection.qml +++ b/modules/controlcenter/appearance/sections/AnimationsSection.qml @@ -8,7 +8,7 @@ import qs.components import qs.components.containers import qs.components.controls import qs.services -import qs.config +import Caelestia.Config CollapsibleSection { id: root @@ -19,7 +19,7 @@ CollapsibleSection { showBackground: true SectionContainer { - contentSpacing: Appearance.spacing.normal + contentSpacing: Tokens.spacing.normal SliderInput { Layout.fillWidth: true diff --git a/modules/controlcenter/appearance/sections/BackgroundSection.qml b/modules/controlcenter/appearance/sections/BackgroundSection.qml index 8b50c124..95670d24 100644 --- a/modules/controlcenter/appearance/sections/BackgroundSection.qml +++ b/modules/controlcenter/appearance/sections/BackgroundSection.qml @@ -8,7 +8,7 @@ import qs.components import qs.components.containers import qs.components.controls import qs.services -import qs.config +import Caelestia.Config CollapsibleSection { id: root @@ -37,9 +37,9 @@ CollapsibleSection { } StyledText { - Layout.topMargin: Appearance.spacing.normal + Layout.topMargin: Tokens.spacing.normal text: qsTr("Desktop Clock") - font.pointSize: Appearance.font.size.larger + font.pointSize: Tokens.font.size.larger font.weight: 500 } @@ -64,12 +64,12 @@ CollapsibleSection { rootPane.saveConfig(); } - contentSpacing: Appearance.spacing.small + contentSpacing: Tokens.spacing.small z: 1 StyledText { text: qsTr("Positioning") - font.pointSize: Appearance.font.size.larger + font.pointSize: Tokens.font.size.larger font.weight: 500 } @@ -156,11 +156,11 @@ CollapsibleSection { } SectionContainer { - contentSpacing: Appearance.spacing.small + contentSpacing: Tokens.spacing.small StyledText { text: qsTr("Shadow") - font.pointSize: Appearance.font.size.larger + font.pointSize: Tokens.font.size.larger font.weight: 500 } @@ -174,7 +174,7 @@ CollapsibleSection { } SectionContainer { - contentSpacing: Appearance.spacing.normal + contentSpacing: Tokens.spacing.normal SliderInput { Layout.fillWidth: true @@ -199,7 +199,7 @@ CollapsibleSection { } SectionContainer { - contentSpacing: Appearance.spacing.normal + contentSpacing: Tokens.spacing.normal SliderInput { Layout.fillWidth: true @@ -225,11 +225,11 @@ CollapsibleSection { } SectionContainer { - contentSpacing: Appearance.spacing.small + contentSpacing: Tokens.spacing.small StyledText { text: qsTr("Background") - font.pointSize: Appearance.font.size.larger + font.pointSize: Tokens.font.size.larger font.weight: 500 } @@ -252,7 +252,7 @@ CollapsibleSection { } SectionContainer { - contentSpacing: Appearance.spacing.normal + contentSpacing: Tokens.spacing.normal SliderInput { Layout.fillWidth: true @@ -278,9 +278,9 @@ CollapsibleSection { } StyledText { - Layout.topMargin: Appearance.spacing.normal + Layout.topMargin: Tokens.spacing.normal text: qsTr("Visualiser") - font.pointSize: Appearance.font.size.larger + font.pointSize: Tokens.font.size.larger font.weight: 500 } @@ -303,7 +303,7 @@ CollapsibleSection { } SectionContainer { - contentSpacing: Appearance.spacing.normal + contentSpacing: Tokens.spacing.normal SliderInput { Layout.fillWidth: true @@ -328,7 +328,7 @@ CollapsibleSection { } SectionContainer { - contentSpacing: Appearance.spacing.normal + contentSpacing: Tokens.spacing.normal SliderInput { Layout.fillWidth: true diff --git a/modules/controlcenter/appearance/sections/BorderSection.qml b/modules/controlcenter/appearance/sections/BorderSection.qml index e0c677cf..e92a28da 100644 --- a/modules/controlcenter/appearance/sections/BorderSection.qml +++ b/modules/controlcenter/appearance/sections/BorderSection.qml @@ -8,7 +8,7 @@ import qs.components import qs.components.containers import qs.components.controls import qs.services -import qs.config +import Caelestia.Config CollapsibleSection { id: root @@ -19,7 +19,7 @@ CollapsibleSection { showBackground: true SectionContainer { - contentSpacing: Appearance.spacing.normal + contentSpacing: Tokens.spacing.normal SliderInput { Layout.fillWidth: true @@ -43,7 +43,7 @@ CollapsibleSection { } SectionContainer { - contentSpacing: Appearance.spacing.normal + contentSpacing: Tokens.spacing.normal SliderInput { Layout.fillWidth: true diff --git a/modules/controlcenter/appearance/sections/ColorSchemeSection.qml b/modules/controlcenter/appearance/sections/ColorSchemeSection.qml index b954cd45..69dff698 100644 --- a/modules/controlcenter/appearance/sections/ColorSchemeSection.qml +++ b/modules/controlcenter/appearance/sections/ColorSchemeSection.qml @@ -9,7 +9,7 @@ import qs.components import qs.components.containers import qs.components.controls import qs.services -import qs.config +import Caelestia.Config CollapsibleSection { title: qsTr("Color scheme") @@ -18,7 +18,7 @@ CollapsibleSection { ColumnLayout { Layout.fillWidth: true - spacing: Appearance.spacing.small / 2 + spacing: Tokens.spacing.small / 2 Repeater { model: Schemes.list @@ -32,10 +32,10 @@ CollapsibleSection { readonly property bool isCurrent: schemeKey === Schemes.currentScheme color: Qt.alpha(Colours.tPalette.m3surfaceContainer, isCurrent ? Colours.tPalette.m3surfaceContainer.a : 0) - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal border.width: isCurrent ? 1 : 0 border.color: Colours.palette.m3primary - implicitHeight: schemeRow.implicitHeight + Appearance.padding.normal * 2 + implicitHeight: schemeRow.implicitHeight + Tokens.padding.normal * 2 StateLayer { function onClicked(): void { @@ -65,9 +65,9 @@ CollapsibleSection { id: schemeRow anchors.fill: parent - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal StyledRect { id: preview @@ -78,7 +78,7 @@ CollapsibleSection { border.color: Qt.alpha(`#${modelData.colours?.outline}`, 0.5) color: `#${modelData.colours?.surface}` - radius: Appearance.rounding.full + radius: Tokens.rounding.full implicitWidth: iconPlaceholder.implicitWidth implicitHeight: iconPlaceholder.implicitWidth @@ -87,7 +87,7 @@ CollapsibleSection { visible: false text: "circle" - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large } Item { @@ -105,7 +105,7 @@ CollapsibleSection { implicitWidth: preview.implicitWidth color: `#${modelData.colours?.primary}` - radius: Appearance.rounding.full + radius: Tokens.rounding.full } } } @@ -116,12 +116,12 @@ CollapsibleSection { StyledText { text: modelData.flavour ?? "" - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } StyledText { text: modelData.name ?? "" - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: Colours.palette.m3outline elide: Text.ElideRight @@ -137,7 +137,7 @@ CollapsibleSection { sourceComponent: MaterialIcon { text: "check" color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large } } } diff --git a/modules/controlcenter/appearance/sections/ColorVariantSection.qml b/modules/controlcenter/appearance/sections/ColorVariantSection.qml index b3cc4cfb..8fbd80d9 100644 --- a/modules/controlcenter/appearance/sections/ColorVariantSection.qml +++ b/modules/controlcenter/appearance/sections/ColorVariantSection.qml @@ -9,7 +9,7 @@ import qs.components import qs.components.containers import qs.components.controls import qs.services -import qs.config +import Caelestia.Config CollapsibleSection { title: qsTr("Color variant") @@ -18,7 +18,7 @@ CollapsibleSection { ColumnLayout { Layout.fillWidth: true - spacing: Appearance.spacing.small / 2 + spacing: Tokens.spacing.small / 2 Repeater { model: M3Variants.list @@ -29,10 +29,10 @@ CollapsibleSection { Layout.fillWidth: true color: Qt.alpha(Colours.tPalette.m3surfaceContainer, modelData.variant === Schemes.currentVariant ? Colours.tPalette.m3surfaceContainer.a : 0) - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal border.width: modelData.variant === Schemes.currentVariant ? 1 : 0 border.color: Colours.palette.m3primary - implicitHeight: variantRow.implicitHeight + Appearance.padding.normal * 2 + implicitHeight: variantRow.implicitHeight + Tokens.padding.normal * 2 StateLayer { function onClicked(): void { @@ -62,13 +62,13 @@ CollapsibleSection { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal MaterialIcon { text: modelData.icon - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large fill: modelData.variant === Schemes.currentVariant ? 1 : 0 } @@ -82,7 +82,7 @@ CollapsibleSection { visible: modelData.variant === Schemes.currentVariant text: "check" color: Colours.palette.m3primary - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large } } } diff --git a/modules/controlcenter/appearance/sections/FontsSection.qml b/modules/controlcenter/appearance/sections/FontsSection.qml index 47b738f1..562ea8d5 100644 --- a/modules/controlcenter/appearance/sections/FontsSection.qml +++ b/modules/controlcenter/appearance/sections/FontsSection.qml @@ -8,7 +8,7 @@ import qs.components import qs.components.containers import qs.components.controls import qs.services -import qs.config +import Caelestia.Config CollapsibleSection { id: root @@ -38,7 +38,7 @@ CollapsibleSection { property alias contentHeight: sansFontList.contentHeight clip: true - spacing: Appearance.spacing.small / 2 + spacing: Tokens.spacing.small / 2 model: Qt.fontFamilies() StyledScrollBar.vertical: StyledScrollBar { @@ -52,10 +52,10 @@ CollapsibleSection { width: ListView.view.width color: Qt.alpha(Colours.tPalette.m3surfaceContainer, isCurrent ? Colours.tPalette.m3surfaceContainer.a : 0) - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal border.width: isCurrent ? 1 : 0 border.color: Colours.palette.m3primary - implicitHeight: fontFamilySansRow.implicitHeight + Appearance.padding.normal * 2 + implicitHeight: fontFamilySansRow.implicitHeight + Tokens.padding.normal * 2 StateLayer { function onClicked(): void { @@ -70,13 +70,13 @@ CollapsibleSection { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal StyledText { text: modelData - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } Item { @@ -90,7 +90,7 @@ CollapsibleSection { sourceComponent: MaterialIcon { text: "check" color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large } } } @@ -119,7 +119,7 @@ CollapsibleSection { property alias contentHeight: monoFontList.contentHeight clip: true - spacing: Appearance.spacing.small / 2 + spacing: Tokens.spacing.small / 2 model: Qt.fontFamilies() StyledScrollBar.vertical: StyledScrollBar { @@ -133,10 +133,10 @@ CollapsibleSection { width: ListView.view.width color: Qt.alpha(Colours.tPalette.m3surfaceContainer, isCurrent ? Colours.tPalette.m3surfaceContainer.a : 0) - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal border.width: isCurrent ? 1 : 0 border.color: Colours.palette.m3primary - implicitHeight: fontFamilyMonoRow.implicitHeight + Appearance.padding.normal * 2 + implicitHeight: fontFamilyMonoRow.implicitHeight + Tokens.padding.normal * 2 StateLayer { function onClicked(): void { @@ -151,13 +151,13 @@ CollapsibleSection { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal StyledText { text: modelData - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } Item { @@ -171,7 +171,7 @@ CollapsibleSection { sourceComponent: MaterialIcon { text: "check" color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large } } } @@ -202,7 +202,7 @@ CollapsibleSection { property alias contentHeight: materialFontList.contentHeight clip: true - spacing: Appearance.spacing.small / 2 + spacing: Tokens.spacing.small / 2 model: Qt.fontFamilies().filter(f => f.startsWith("Material Symbols")) StyledScrollBar.vertical: StyledScrollBar { @@ -216,10 +216,10 @@ CollapsibleSection { width: ListView.view.width color: Qt.alpha(Colours.tPalette.m3surfaceContainer, isCurrent ? Colours.tPalette.m3surfaceContainer.a : 0) - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal border.width: isCurrent ? 1 : 0 border.color: Colours.palette.m3primary - implicitHeight: fontFamilyMaterialRow.implicitHeight + Appearance.padding.normal * 2 + implicitHeight: fontFamilyMaterialRow.implicitHeight + Tokens.padding.normal * 2 StateLayer { function onClicked(): void { @@ -234,13 +234,13 @@ CollapsibleSection { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal StyledText { text: modelData - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } Item { @@ -254,7 +254,7 @@ CollapsibleSection { sourceComponent: MaterialIcon { text: "check" color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large } } } @@ -264,7 +264,7 @@ CollapsibleSection { } SectionContainer { - contentSpacing: Appearance.spacing.normal + contentSpacing: Tokens.spacing.normal SliderInput { Layout.fillWidth: true diff --git a/modules/controlcenter/appearance/sections/ScalesSection.qml b/modules/controlcenter/appearance/sections/ScalesSection.qml index 6d5d5b30..8113f28c 100644 --- a/modules/controlcenter/appearance/sections/ScalesSection.qml +++ b/modules/controlcenter/appearance/sections/ScalesSection.qml @@ -8,7 +8,7 @@ import qs.components import qs.components.containers import qs.components.controls import qs.services -import qs.config +import Caelestia.Config CollapsibleSection { id: root @@ -19,7 +19,7 @@ CollapsibleSection { showBackground: true SectionContainer { - contentSpacing: Appearance.spacing.normal + contentSpacing: Tokens.spacing.normal SliderInput { Layout.fillWidth: true @@ -43,7 +43,7 @@ CollapsibleSection { } SectionContainer { - contentSpacing: Appearance.spacing.normal + contentSpacing: Tokens.spacing.normal SliderInput { Layout.fillWidth: true @@ -67,7 +67,7 @@ CollapsibleSection { } SectionContainer { - contentSpacing: Appearance.spacing.normal + contentSpacing: Tokens.spacing.normal SliderInput { Layout.fillWidth: true diff --git a/modules/controlcenter/appearance/sections/ThemeModeSection.qml b/modules/controlcenter/appearance/sections/ThemeModeSection.qml index c63c73aa..8857da56 100644 --- a/modules/controlcenter/appearance/sections/ThemeModeSection.qml +++ b/modules/controlcenter/appearance/sections/ThemeModeSection.qml @@ -6,7 +6,7 @@ import qs.components import qs.components.containers import qs.components.controls import qs.services -import qs.config +import Caelestia.Config CollapsibleSection { title: qsTr("Theme mode") diff --git a/modules/controlcenter/appearance/sections/TransparencySection.qml b/modules/controlcenter/appearance/sections/TransparencySection.qml index 77582f9c..2dc91b65 100644 --- a/modules/controlcenter/appearance/sections/TransparencySection.qml +++ b/modules/controlcenter/appearance/sections/TransparencySection.qml @@ -8,7 +8,7 @@ import qs.components import qs.components.containers import qs.components.controls import qs.services -import qs.config +import Caelestia.Config CollapsibleSection { id: root @@ -28,7 +28,7 @@ CollapsibleSection { } SectionContainer { - contentSpacing: Appearance.spacing.normal + contentSpacing: Tokens.spacing.normal SliderInput { Layout.fillWidth: true @@ -53,7 +53,7 @@ CollapsibleSection { } SectionContainer { - contentSpacing: Appearance.spacing.normal + contentSpacing: Tokens.spacing.normal SliderInput { Layout.fillWidth: true diff --git a/modules/controlcenter/audio/AudioPane.qml b/modules/controlcenter/audio/AudioPane.qml index 172132f6..13885656 100644 --- a/modules/controlcenter/audio/AudioPane.qml +++ b/modules/controlcenter/audio/AudioPane.qml @@ -10,7 +10,7 @@ import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import qs.config +import Caelestia.Config Item { id: root @@ -38,15 +38,15 @@ Item { anchors.left: parent.left anchors.right: parent.right - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal RowLayout { Layout.fillWidth: true - spacing: Appearance.spacing.smaller + spacing: Tokens.spacing.smaller StyledText { text: qsTr("Audio") - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large font.weight: 500 } @@ -64,15 +64,15 @@ Item { ColumnLayout { Layout.fillWidth: true - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small RowLayout { Layout.fillWidth: true - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small StyledText { text: qsTr("Devices (%1)").arg(Audio.sinks.length) - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal font.weight: 500 } } @@ -93,8 +93,8 @@ Item { Layout.fillWidth: true color: Audio.sink?.id === modelData.id ? Colours.layer(Colours.palette.m3surfaceContainer, 2) : "transparent" - radius: Appearance.rounding.normal - implicitHeight: outputRowLayout.implicitHeight + Appearance.padding.normal * 2 + radius: Tokens.rounding.normal + implicitHeight: outputRowLayout.implicitHeight + Tokens.padding.normal * 2 StateLayer { function onClicked(): void { @@ -108,13 +108,13 @@ Item { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal MaterialIcon { text: Audio.sink?.id === modelData.id ? "speaker" : "speaker_group" - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large fill: Audio.sink?.id === modelData.id ? 1 : 0 } @@ -141,15 +141,15 @@ Item { ColumnLayout { Layout.fillWidth: true - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small RowLayout { Layout.fillWidth: true - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small StyledText { text: qsTr("Devices (%1)").arg(Audio.sources.length) - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal font.weight: 500 } } @@ -170,8 +170,8 @@ Item { Layout.fillWidth: true color: Audio.source?.id === modelData.id ? Colours.layer(Colours.palette.m3surfaceContainer, 2) : "transparent" - radius: Appearance.rounding.normal - implicitHeight: inputRowLayout.implicitHeight + Appearance.padding.normal * 2 + radius: Tokens.rounding.normal + implicitHeight: inputRowLayout.implicitHeight + Tokens.padding.normal * 2 StateLayer { function onClicked(): void { @@ -185,13 +185,13 @@ Item { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal MaterialIcon { text: "mic" - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large fill: Audio.source?.id === modelData.id ? 1 : 0 } @@ -229,7 +229,7 @@ Item { anchors.left: parent.left anchors.right: parent.right anchors.top: parent.top - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal SettingsHeader { icon: "volume_up" @@ -242,19 +242,19 @@ Item { } SectionContainer { - contentSpacing: Appearance.spacing.normal + contentSpacing: Tokens.spacing.normal ColumnLayout { Layout.fillWidth: true - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small RowLayout { Layout.fillWidth: true - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal StyledText { text: qsTr("Volume") - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal font.weight: 500 } @@ -306,15 +306,15 @@ Item { StyledText { text: "%" color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal opacity: Audio.muted ? 0.5 : 1 } StyledRect { implicitWidth: implicitHeight - implicitHeight: muteIcon.implicitHeight + Appearance.padding.normal * 2 + implicitHeight: muteIcon.implicitHeight + Tokens.padding.normal * 2 - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: Audio.muted ? Colours.palette.m3secondary : Colours.palette.m3secondaryContainer StateLayer { @@ -339,7 +339,7 @@ Item { id: outputVolumeSlider Layout.fillWidth: true - implicitHeight: Appearance.padding.normal * 3 + implicitHeight: Tokens.padding.normal * 3 value: Audio.volume enabled: !Audio.muted @@ -360,19 +360,19 @@ Item { } SectionContainer { - contentSpacing: Appearance.spacing.normal + contentSpacing: Tokens.spacing.normal ColumnLayout { Layout.fillWidth: true - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small RowLayout { Layout.fillWidth: true - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal StyledText { text: qsTr("Volume") - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal font.weight: 500 } @@ -424,15 +424,15 @@ Item { StyledText { text: "%" color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal opacity: Audio.sourceMuted ? 0.5 : 1 } StyledRect { implicitWidth: implicitHeight - implicitHeight: muteInputIcon.implicitHeight + Appearance.padding.normal * 2 + implicitHeight: muteInputIcon.implicitHeight + Tokens.padding.normal * 2 - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: Audio.sourceMuted ? Colours.palette.m3secondary : Colours.palette.m3secondaryContainer StateLayer { @@ -457,7 +457,7 @@ Item { id: inputVolumeSlider Layout.fillWidth: true - implicitHeight: Appearance.padding.normal * 3 + implicitHeight: Tokens.padding.normal * 3 value: Audio.sourceVolume enabled: !Audio.sourceMuted @@ -478,11 +478,11 @@ Item { } SectionContainer { - contentSpacing: Appearance.spacing.normal + contentSpacing: Tokens.spacing.normal ColumnLayout { Layout.fillWidth: true - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small Repeater { model: Audio.streams @@ -493,15 +493,15 @@ Item { required property int index Layout.fillWidth: true - spacing: Appearance.spacing.smaller + spacing: Tokens.spacing.smaller RowLayout { Layout.fillWidth: true - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal MaterialIcon { text: "apps" - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal fill: 0 } @@ -510,7 +510,7 @@ Item { elide: Text.ElideRight maximumLineCount: 1 text: Audio.getStreamName(modelData) - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal font.weight: 500 } @@ -558,15 +558,15 @@ Item { StyledText { text: "%" color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal opacity: Audio.getStreamMuted(modelData) ? 0.5 : 1 } StyledRect { implicitWidth: implicitHeight - implicitHeight: streamMuteIcon.implicitHeight + Appearance.padding.normal * 2 + implicitHeight: streamMuteIcon.implicitHeight + Tokens.padding.normal * 2 - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: Audio.getStreamMuted(modelData) ? Colours.palette.m3secondary : Colours.palette.m3secondaryContainer StateLayer { @@ -587,7 +587,7 @@ Item { StyledSlider { Layout.fillWidth: true - implicitHeight: Appearance.padding.normal * 3 + implicitHeight: Tokens.padding.normal * 3 value: Audio.getStreamVolume(modelData) enabled: !Audio.getStreamMuted(modelData) @@ -617,7 +617,7 @@ Item { visible: Audio.streams.length === 0 text: qsTr("No applications currently playing audio") color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small horizontalAlignment: Text.AlignHCenter } } diff --git a/modules/controlcenter/bluetooth/BtPane.qml b/modules/controlcenter/bluetooth/BtPane.qml index 97ea99c5..d5794254 100644 --- a/modules/controlcenter/bluetooth/BtPane.qml +++ b/modules/controlcenter/bluetooth/BtPane.qml @@ -9,7 +9,7 @@ import Quickshell.Widgets import qs.components import qs.components.containers import qs.components.controls -import qs.config +import Caelestia.Config SplitPaneWithDetails { id: root diff --git a/modules/controlcenter/bluetooth/Details.qml b/modules/controlcenter/bluetooth/Details.qml index 9b347acd..04b4ba01 100644 --- a/modules/controlcenter/bluetooth/Details.qml +++ b/modules/controlcenter/bluetooth/Details.qml @@ -10,7 +10,7 @@ import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import qs.config +import Caelestia.Config import qs.utils StyledFlickable { @@ -54,12 +54,12 @@ StyledFlickable { sections: [ Component { ColumnLayout { - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal StyledText { - Layout.topMargin: Appearance.spacing.large + Layout.topMargin: Tokens.spacing.large text: qsTr("Connection status") - font.pointSize: Appearance.font.size.larger + font.pointSize: Tokens.font.size.larger font.weight: 500 } @@ -70,9 +70,9 @@ StyledFlickable { StyledRect { Layout.fillWidth: true - implicitHeight: deviceStatus.implicitHeight + Appearance.padding.large * 2 + implicitHeight: deviceStatus.implicitHeight + Tokens.padding.large * 2 - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: Colours.tPalette.m3surfaceContainer ColumnLayout { @@ -81,9 +81,9 @@ StyledFlickable { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.large + anchors.margins: Tokens.padding.large - spacing: Appearance.spacing.larger + spacing: Tokens.spacing.larger Toggle { label: qsTr("Connected") @@ -113,12 +113,12 @@ StyledFlickable { }, Component { ColumnLayout { - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal StyledText { - Layout.topMargin: Appearance.spacing.large + Layout.topMargin: Tokens.spacing.large text: qsTr("Device properties") - font.pointSize: Appearance.font.size.larger + font.pointSize: Tokens.font.size.larger font.weight: 500 } @@ -129,9 +129,9 @@ StyledFlickable { StyledRect { Layout.fillWidth: true - implicitHeight: deviceProps.implicitHeight + Appearance.padding.large * 2 + implicitHeight: deviceProps.implicitHeight + Tokens.padding.large * 2 - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: Colours.tPalette.m3surfaceContainer ColumnLayout { @@ -140,19 +140,19 @@ StyledFlickable { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.large + anchors.margins: Tokens.padding.large - spacing: Appearance.spacing.larger + spacing: Tokens.spacing.larger RowLayout { Layout.fillWidth: true - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small Item { id: renameDevice Layout.fillWidth: true - Layout.rightMargin: Appearance.spacing.small + Layout.rightMargin: Tokens.spacing.small implicitHeight: renameLabel.implicitHeight + deviceNameEdit.implicitHeight @@ -167,15 +167,15 @@ StyledFlickable { PropertyChanges { renameDevice.implicitHeight: deviceNameEdit.implicitHeight renameLabel.opacity: 0 - deviceNameEdit.padding: Appearance.padding.normal + deviceNameEdit.padding: Tokens.padding.normal } } transitions: Transition { AnchorAnimation { - duration: Appearance.anim.durations.normal + duration: Tokens.anim.durations.normal easing.type: Easing.BezierSpline - easing.bezierCurve: Appearance.anim.curves.standard + easing.bezierCurve: Tokens.anim.curves.standard } Anim { properties: "implicitHeight,opacity,padding" @@ -189,7 +189,7 @@ StyledFlickable { text: qsTr("Device name") color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } StyledTextField { @@ -198,7 +198,7 @@ StyledFlickable { anchors.left: parent.left anchors.right: parent.right anchors.top: renameLabel.bottom - anchors.leftMargin: root.session.bt.editingDeviceName ? 0 : -Appearance.padding.normal + anchors.leftMargin: root.session.bt.editingDeviceName ? 0 : -Tokens.padding.normal text: root.device?.name ?? "" readOnly: !root.session.bt.editingDeviceName @@ -207,11 +207,11 @@ StyledFlickable { root.device.name = text; } - leftPadding: Appearance.padding.normal - rightPadding: Appearance.padding.normal + leftPadding: Tokens.padding.normal + rightPadding: Tokens.padding.normal background: StyledRect { - radius: Appearance.rounding.small + radius: Tokens.rounding.small border.width: 2 border.color: Colours.palette.m3primary opacity: root.session.bt.editingDeviceName ? 1 : 0 @@ -233,9 +233,9 @@ StyledFlickable { StyledRect { implicitWidth: implicitHeight - implicitHeight: cancelEditIcon.implicitHeight + Appearance.padding.smaller * 2 + implicitHeight: cancelEditIcon.implicitHeight + Tokens.padding.smaller * 2 - radius: Appearance.rounding.small + radius: Tokens.rounding.small color: Colours.palette.m3secondaryContainer opacity: root.session.bt.editingDeviceName ? 1 : 0 scale: root.session.bt.editingDeviceName ? 1 : 0.5 @@ -265,17 +265,17 @@ StyledFlickable { Behavior on scale { Anim { - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } } } StyledRect { implicitWidth: implicitHeight - implicitHeight: editIcon.implicitHeight + Appearance.padding.smaller * 2 + implicitHeight: editIcon.implicitHeight + Tokens.padding.smaller * 2 - radius: root.session.bt.editingDeviceName ? Appearance.rounding.small : implicitHeight / 2 * Math.min(1, Appearance.rounding.scale) + radius: root.session.bt.editingDeviceName ? Tokens.rounding.small : implicitHeight / 2 * Math.min(1, Tokens.rounding.scale) color: Qt.alpha(Colours.palette.m3primary, root.session.bt.editingDeviceName ? 1 : 0) StateLayer { @@ -322,12 +322,12 @@ StyledFlickable { }, Component { ColumnLayout { - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal StyledText { - Layout.topMargin: Appearance.spacing.large + Layout.topMargin: Tokens.spacing.large text: qsTr("Device information") - font.pointSize: Appearance.font.size.larger + font.pointSize: Tokens.font.size.larger font.weight: 500 } @@ -338,9 +338,9 @@ StyledFlickable { StyledRect { Layout.fillWidth: true - implicitHeight: deviceInfo.implicitHeight + Appearance.padding.large * 2 + implicitHeight: deviceInfo.implicitHeight + Tokens.padding.large * 2 - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: Colours.tPalette.m3surfaceContainer ColumnLayout { @@ -349,9 +349,9 @@ StyledFlickable { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.large + anchors.margins: Tokens.padding.large - spacing: Appearance.spacing.small / 2 + spacing: Tokens.spacing.small / 2 StyledText { text: root.device?.batteryAvailable ? qsTr("Device battery (%1%)").arg(root.device.battery * 100) : qsTr("Battery unavailable") @@ -360,15 +360,15 @@ StyledFlickable { RowLayout { id: batteryPercent - Layout.topMargin: Appearance.spacing.small / 2 + Layout.topMargin: Tokens.spacing.small / 2 Layout.fillWidth: true - Layout.preferredHeight: Appearance.padding.smaller - spacing: Appearance.spacing.small / 2 + Layout.preferredHeight: Tokens.padding.smaller + spacing: Tokens.spacing.small / 2 StyledRect { Layout.fillWidth: true Layout.fillHeight: true - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: Colours.palette.m3secondaryContainer StyledRect { @@ -378,54 +378,54 @@ StyledFlickable { anchors.margins: parent.height * 0.25 implicitWidth: root.device?.batteryAvailable ? batteryPercent.width * root.device.battery : 0 - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: Colours.palette.m3primary } } } StyledText { - Layout.topMargin: Appearance.spacing.normal + Layout.topMargin: Tokens.spacing.normal text: qsTr("Dbus path") } StyledText { text: root.device?.dbusPath ?? "" color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } StyledText { - Layout.topMargin: Appearance.spacing.normal + Layout.topMargin: Tokens.spacing.normal text: qsTr("MAC address") } StyledText { text: root.device?.address ?? "" color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } StyledText { - Layout.topMargin: Appearance.spacing.normal + Layout.topMargin: Tokens.spacing.normal text: qsTr("Bonded") } StyledText { text: root.device?.bonded ? qsTr("Yes") : qsTr("No") color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } StyledText { - Layout.topMargin: Appearance.spacing.normal + Layout.topMargin: Tokens.spacing.normal text: qsTr("System name") } StyledText { text: root.device?.deviceName ?? "" color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } } } @@ -438,7 +438,7 @@ StyledFlickable { ColumnLayout { anchors.right: fabRoot.right anchors.bottom: fabRoot.top - anchors.bottomMargin: Appearance.padding.normal + anchors.bottomMargin: Tokens.padding.normal Repeater { id: fabMenu @@ -470,9 +470,9 @@ StyledFlickable { Layout.alignment: Qt.AlignRight - implicitHeight: fabMenuItemInner.implicitHeight + Appearance.padding.larger * 2 + implicitHeight: fabMenuItemInner.implicitHeight + Tokens.padding.larger * 2 - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: Colours.palette.m3primaryContainer opacity: 0 @@ -482,7 +482,7 @@ StyledFlickable { when: root.session.bt.fabMenuOpen PropertyChanges { - fabMenuItem.implicitWidth: fabMenuItemInner.implicitWidth + Appearance.padding.large * 2 + fabMenuItem.implicitWidth: fabMenuItemInner.implicitWidth + Tokens.padding.large * 2 fabMenuItem.opacity: 1 fabMenuItemInner.opacity: 1 } @@ -494,17 +494,17 @@ StyledFlickable { SequentialAnimation { PauseAnimation { - duration: (fabMenu.count - 1 - fabMenuItem.index) * Appearance.anim.durations.small / 8 + duration: (fabMenu.count - 1 - fabMenuItem.index) * Tokens.anim.durations.small / 8 } ParallelAnimation { Anim { property: "implicitWidth" - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } Anim { property: "opacity" - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small } } } @@ -514,17 +514,17 @@ StyledFlickable { SequentialAnimation { PauseAnimation { - duration: fabMenuItem.index * Appearance.anim.durations.small / 8 + duration: fabMenuItem.index * Tokens.anim.durations.small / 8 } ParallelAnimation { Anim { property: "implicitWidth" - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } Anim { property: "opacity" - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small } } } @@ -549,7 +549,7 @@ StyledFlickable { id: fabMenuItemInner anchors.centerIn: parent - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal opacity: 0 MaterialIcon { @@ -567,7 +567,7 @@ StyledFlickable { Behavior on Layout.preferredWidth { Anim { - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small } } } @@ -594,7 +594,7 @@ StyledFlickable { implicitWidth: 64 implicitHeight: 64 - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: root.session.bt.fabMenuOpen ? Colours.palette.m3primary : Colours.palette.m3primaryContainer states: State { @@ -605,15 +605,15 @@ StyledFlickable { fabBg.implicitWidth: 48 fabBg.implicitHeight: 48 fabBg.radius: 48 / 2 - fab.font.pointSize: Appearance.font.size.larger + fab.font.pointSize: Tokens.font.size.larger } } transitions: Transition { Anim { properties: "implicitWidth,implicitHeight" - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } Anim { properties: "radius,font.pointSize" @@ -644,7 +644,7 @@ StyledFlickable { animate: true text: root.session.bt.fabMenuOpen ? "close" : "settings" color: root.session.bt.fabMenuOpen ? Colours.palette.m3onPrimary : Colours.palette.m3onPrimaryContainer - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large fill: 1 } } @@ -656,7 +656,7 @@ StyledFlickable { property alias toggle: toggle Layout.fillWidth: true - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal StyledText { Layout.fillWidth: true diff --git a/modules/controlcenter/bluetooth/DeviceList.qml b/modules/controlcenter/bluetooth/DeviceList.qml index b53829b9..ca76c8c1 100644 --- a/modules/controlcenter/bluetooth/DeviceList.qml +++ b/modules/controlcenter/bluetooth/DeviceList.qml @@ -10,7 +10,7 @@ import qs.components import qs.components.containers import qs.components.controls import qs.services -import qs.config +import Caelestia.Config import qs.utils DeviceList { @@ -32,11 +32,11 @@ DeviceList { headerComponent: Component { RowLayout { - spacing: Appearance.spacing.smaller + spacing: Tokens.spacing.smaller StyledText { text: qsTr("Bluetooth") - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large font.weight: 500 } @@ -48,9 +48,9 @@ DeviceList { toggled: Bluetooth.defaultAdapter?.enabled ?? false icon: "power" accent: "Tertiary" - iconSize: Appearance.font.size.normal - horizontalPadding: Appearance.padding.normal - verticalPadding: Appearance.padding.smaller + iconSize: Tokens.font.size.normal + horizontalPadding: Tokens.padding.normal + verticalPadding: Tokens.padding.smaller tooltip: qsTr("Toggle Bluetooth") onClicked: { @@ -64,9 +64,9 @@ DeviceList { toggled: Bluetooth.defaultAdapter?.discoverable ?? false icon: root.smallDiscoverable ? "group_search" : "" label: root.smallDiscoverable ? "" : qsTr("Discoverable") - iconSize: Appearance.font.size.normal - horizontalPadding: Appearance.padding.normal - verticalPadding: Appearance.padding.smaller + iconSize: Tokens.font.size.normal + horizontalPadding: Tokens.padding.normal + verticalPadding: Tokens.padding.smaller tooltip: qsTr("Make discoverable") onClicked: { @@ -80,9 +80,9 @@ DeviceList { toggled: Bluetooth.defaultAdapter?.pairable ?? false icon: "missing_controller" label: root.smallPairable ? "" : qsTr("Pairable") - iconSize: Appearance.font.size.normal - horizontalPadding: Appearance.padding.normal - verticalPadding: Appearance.padding.smaller + iconSize: Tokens.font.size.normal + horizontalPadding: Tokens.padding.normal + verticalPadding: Tokens.padding.smaller tooltip: qsTr("Make pairable") onClicked: { @@ -96,9 +96,9 @@ DeviceList { toggled: Bluetooth.defaultAdapter?.discovering ?? false icon: "bluetooth_searching" accent: "Secondary" - iconSize: Appearance.font.size.normal - horizontalPadding: Appearance.padding.normal - verticalPadding: Appearance.padding.smaller + iconSize: Tokens.font.size.normal + horizontalPadding: Tokens.padding.normal + verticalPadding: Tokens.padding.smaller tooltip: qsTr("Scan for devices") onClicked: { @@ -112,9 +112,9 @@ DeviceList { toggled: !root.session.bt.active icon: "settings" accent: "Primary" - iconSize: Appearance.font.size.normal - horizontalPadding: Appearance.padding.normal - verticalPadding: Appearance.padding.smaller + iconSize: Tokens.font.size.normal + horizontalPadding: Tokens.padding.normal + verticalPadding: Tokens.padding.smaller tooltip: qsTr("Bluetooth settings") onClicked: { @@ -137,10 +137,10 @@ DeviceList { readonly property bool connected: modelData && modelData.state === BluetoothDeviceState.Connected width: ListView.view ? ListView.view.width : undefined - implicitHeight: deviceInner.implicitHeight + Appearance.padding.normal * 2 + implicitHeight: deviceInner.implicitHeight + Tokens.padding.normal * 2 color: Qt.alpha(Colours.tPalette.m3surfaceContainer, root.activeItem === modelData ? Colours.tPalette.m3surfaceContainer.a : 0) - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal StateLayer { id: stateLayer @@ -155,15 +155,15 @@ DeviceList { id: deviceInner anchors.fill: parent - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal StyledRect { implicitWidth: implicitHeight - implicitHeight: icon.implicitHeight + Appearance.padding.normal * 2 + implicitHeight: icon.implicitHeight + Tokens.padding.normal * 2 - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: device.connected ? Colours.palette.m3primaryContainer : (device.modelData && device.modelData.bonded) ? Colours.palette.m3secondaryContainer : Colours.tPalette.m3surfaceContainerHigh StyledRect { @@ -178,7 +178,7 @@ DeviceList { anchors.centerIn: parent text: Icons.getBluetoothIcon(device.modelData ? device.modelData.icon : "") color: device.connected ? Colours.palette.m3onPrimaryContainer : (device.modelData && device.modelData.bonded) ? Colours.palette.m3onSecondaryContainer : Colours.palette.m3onSurface - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large fill: device.connected ? 1 : 0 Behavior on fill { @@ -202,7 +202,7 @@ DeviceList { Layout.fillWidth: true text: (device.modelData ? device.modelData.address : "") + (device.connected ? qsTr(" (Connected)") : (device.modelData && device.modelData.bonded) ? qsTr(" (Paired)") : "") color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small elide: Text.ElideRight } } @@ -211,9 +211,9 @@ DeviceList { id: connectBtn implicitWidth: implicitHeight - implicitHeight: connectIcon.implicitHeight + Appearance.padding.smaller * 2 + implicitHeight: connectIcon.implicitHeight + Tokens.padding.smaller * 2 - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: Qt.alpha(Colours.palette.m3primaryContainer, device.connected ? 1 : 0) CircularIndicator { diff --git a/modules/controlcenter/bluetooth/Settings.qml b/modules/controlcenter/bluetooth/Settings.qml index 6936c1ea..bd09deeb 100644 --- a/modules/controlcenter/bluetooth/Settings.qml +++ b/modules/controlcenter/bluetooth/Settings.qml @@ -9,14 +9,14 @@ import qs.components import qs.components.controls import qs.components.effects import qs.services -import qs.config +import Caelestia.Config ColumnLayout { id: root required property Session session - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal SettingsHeader { icon: "bluetooth" @@ -24,9 +24,9 @@ ColumnLayout { } StyledText { - Layout.topMargin: Appearance.spacing.large + Layout.topMargin: Tokens.spacing.large text: qsTr("Adapter status") - font.pointSize: Appearance.font.size.larger + font.pointSize: Tokens.font.size.larger font.weight: 500 } @@ -37,9 +37,9 @@ ColumnLayout { StyledRect { Layout.fillWidth: true - implicitHeight: adapterStatus.implicitHeight + Appearance.padding.large * 2 + implicitHeight: adapterStatus.implicitHeight + Tokens.padding.large * 2 - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: Colours.tPalette.m3surfaceContainer ColumnLayout { @@ -48,9 +48,9 @@ ColumnLayout { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.large + anchors.margins: Tokens.padding.large - spacing: Appearance.spacing.larger + spacing: Tokens.spacing.larger Toggle { label: qsTr("Powered") @@ -85,9 +85,9 @@ ColumnLayout { } StyledText { - Layout.topMargin: Appearance.spacing.large + Layout.topMargin: Tokens.spacing.large text: qsTr("Adapter properties") - font.pointSize: Appearance.font.size.larger + font.pointSize: Tokens.font.size.larger font.weight: 500 } @@ -98,9 +98,9 @@ ColumnLayout { StyledRect { Layout.fillWidth: true - implicitHeight: adapterSettings.implicitHeight + Appearance.padding.large * 2 + implicitHeight: adapterSettings.implicitHeight + Tokens.padding.large * 2 - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: Colours.tPalette.m3surfaceContainer ColumnLayout { @@ -109,13 +109,13 @@ ColumnLayout { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.large + anchors.margins: Tokens.padding.large - spacing: Appearance.spacing.larger + spacing: Tokens.spacing.larger RowLayout { Layout.fillWidth: true - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal StyledText { Layout.fillWidth: true @@ -127,28 +127,28 @@ ColumnLayout { property bool expanded - implicitWidth: adapterPicker.implicitWidth + Appearance.padding.normal * 2 - implicitHeight: adapterPicker.implicitHeight + Appearance.padding.smaller * 2 + implicitWidth: adapterPicker.implicitWidth + Tokens.padding.normal * 2 + implicitHeight: adapterPicker.implicitHeight + Tokens.padding.smaller * 2 StateLayer { function onClicked(): void { adapterPickerButton.expanded = !adapterPickerButton.expanded; } - radius: Appearance.rounding.small + radius: Tokens.rounding.small } RowLayout { id: adapterPicker anchors.fill: parent - anchors.margins: Appearance.padding.normal - anchors.topMargin: Appearance.padding.smaller - anchors.bottomMargin: Appearance.padding.smaller - spacing: Appearance.spacing.normal + anchors.margins: Tokens.padding.normal + anchors.topMargin: Tokens.padding.smaller + anchors.bottomMargin: Tokens.padding.smaller + spacing: Tokens.spacing.normal StyledText { - Layout.leftMargin: Appearance.padding.small + Layout.leftMargin: Tokens.padding.small text: Bluetooth.defaultAdapter?.name ?? qsTr("None") } @@ -170,8 +170,8 @@ ColumnLayout { Behavior on scale { Anim { - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } } } @@ -185,7 +185,7 @@ ColumnLayout { implicitHeight: adapterPickerButton.expanded ? adapterList.implicitHeight : adapterPickerButton.implicitHeight color: Colours.palette.m3secondaryContainer - radius: Appearance.rounding.small + radius: Tokens.rounding.small opacity: adapterPickerButton.expanded ? 1 : 0 scale: adapterPickerButton.expanded ? 1 : 0.7 @@ -207,7 +207,7 @@ ColumnLayout { required property BluetoothAdapter modelData Layout.fillWidth: true - implicitHeight: adapterInner.implicitHeight + Appearance.padding.normal * 2 + implicitHeight: adapterInner.implicitHeight + Tokens.padding.normal * 2 StateLayer { function onClicked(): void { @@ -224,12 +224,12 @@ ColumnLayout { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.normal - spacing: Appearance.spacing.normal + anchors.margins: Tokens.padding.normal + spacing: Tokens.spacing.normal StyledText { Layout.fillWidth: true - Layout.leftMargin: Appearance.padding.small + Layout.leftMargin: Tokens.padding.small text: adapter.modelData.name color: Colours.palette.m3onSecondaryContainer } @@ -250,15 +250,15 @@ ColumnLayout { Behavior on scale { Anim { - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } } Behavior on implicitHeight { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } } @@ -267,7 +267,7 @@ ColumnLayout { RowLayout { Layout.fillWidth: true - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal StyledText { Layout.fillWidth: true @@ -287,13 +287,13 @@ ColumnLayout { RowLayout { Layout.fillWidth: true - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small Item { id: renameAdapter Layout.fillWidth: true - Layout.rightMargin: Appearance.spacing.small + Layout.rightMargin: Tokens.spacing.small implicitHeight: renameLabel.implicitHeight + adapterNameEdit.implicitHeight @@ -308,15 +308,15 @@ ColumnLayout { PropertyChanges { renameAdapter.implicitHeight: adapterNameEdit.implicitHeight renameLabel.opacity: 0 - adapterNameEdit.padding: Appearance.padding.normal + adapterNameEdit.padding: Tokens.padding.normal } } transitions: Transition { AnchorAnimation { - duration: Appearance.anim.durations.normal + duration: Tokens.anim.durations.normal easing.type: Easing.BezierSpline - easing.bezierCurve: Appearance.anim.curves.standard + easing.bezierCurve: Tokens.anim.curves.standard } Anim { properties: "implicitHeight,opacity,padding" @@ -330,7 +330,7 @@ ColumnLayout { text: qsTr("Rename adapter (currently does not work)") color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } StyledTextField { @@ -339,7 +339,7 @@ ColumnLayout { anchors.left: parent.left anchors.right: parent.right anchors.top: renameLabel.bottom - anchors.leftMargin: root.session.bt.editingAdapterName ? 0 : -Appearance.padding.normal + anchors.leftMargin: root.session.bt.editingAdapterName ? 0 : -Tokens.padding.normal text: root.session.bt.currentAdapter?.name ?? "" readOnly: !root.session.bt.editingAdapterName @@ -347,11 +347,11 @@ ColumnLayout { root.session.bt.editingAdapterName = false; } - leftPadding: Appearance.padding.normal - rightPadding: Appearance.padding.normal + leftPadding: Tokens.padding.normal + rightPadding: Tokens.padding.normal background: StyledRect { - radius: Appearance.rounding.small + radius: Tokens.rounding.small border.width: 2 border.color: Colours.palette.m3primary opacity: root.session.bt.editingAdapterName ? 1 : 0 @@ -373,9 +373,9 @@ ColumnLayout { StyledRect { implicitWidth: implicitHeight - implicitHeight: cancelEditIcon.implicitHeight + Appearance.padding.smaller * 2 + implicitHeight: cancelEditIcon.implicitHeight + Tokens.padding.smaller * 2 - radius: Appearance.rounding.small + radius: Tokens.rounding.small color: Colours.palette.m3secondaryContainer opacity: root.session.bt.editingAdapterName ? 1 : 0 scale: root.session.bt.editingAdapterName ? 1 : 0.5 @@ -405,17 +405,17 @@ ColumnLayout { Behavior on scale { Anim { - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } } } StyledRect { implicitWidth: implicitHeight - implicitHeight: editIcon.implicitHeight + Appearance.padding.smaller * 2 + implicitHeight: editIcon.implicitHeight + Tokens.padding.smaller * 2 - radius: root.session.bt.editingAdapterName ? Appearance.rounding.small : implicitHeight / 2 * Math.min(1, Appearance.rounding.scale) + radius: root.session.bt.editingAdapterName ? Tokens.rounding.small : implicitHeight / 2 * Math.min(1, Tokens.rounding.scale) color: Qt.alpha(Colours.palette.m3primary, root.session.bt.editingAdapterName ? 1 : 0) StateLayer { @@ -448,9 +448,9 @@ ColumnLayout { } StyledText { - Layout.topMargin: Appearance.spacing.large + Layout.topMargin: Tokens.spacing.large text: qsTr("Adapter information") - font.pointSize: Appearance.font.size.larger + font.pointSize: Tokens.font.size.larger font.weight: 500 } @@ -461,9 +461,9 @@ ColumnLayout { StyledRect { Layout.fillWidth: true - implicitHeight: adapterInfo.implicitHeight + Appearance.padding.large * 2 + implicitHeight: adapterInfo.implicitHeight + Tokens.padding.large * 2 - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: Colours.tPalette.m3surfaceContainer ColumnLayout { @@ -472,9 +472,9 @@ ColumnLayout { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.large + anchors.margins: Tokens.padding.large - spacing: Appearance.spacing.small / 2 + spacing: Tokens.spacing.small / 2 StyledText { text: qsTr("Adapter state") @@ -483,29 +483,29 @@ ColumnLayout { StyledText { text: Bluetooth.defaultAdapter ? BluetoothAdapterState.toString(Bluetooth.defaultAdapter.state) : qsTr("Unknown") color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } StyledText { - Layout.topMargin: Appearance.spacing.normal + Layout.topMargin: Tokens.spacing.normal text: qsTr("Dbus path") } StyledText { text: Bluetooth.defaultAdapter?.dbusPath ?? "" color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } StyledText { - Layout.topMargin: Appearance.spacing.normal + Layout.topMargin: Tokens.spacing.normal text: qsTr("Adapter id") } StyledText { text: Bluetooth.defaultAdapter?.adapterId ?? "" color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } } } @@ -516,7 +516,7 @@ ColumnLayout { property alias toggle: toggle Layout.fillWidth: true - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal StyledText { Layout.fillWidth: true diff --git a/modules/controlcenter/components/ConnectedButtonGroup.qml b/modules/controlcenter/components/ConnectedButtonGroup.qml index 15b1896c..e95fa094 100644 --- a/modules/controlcenter/components/ConnectedButtonGroup.qml +++ b/modules/controlcenter/components/ConnectedButtonGroup.qml @@ -5,7 +5,7 @@ import qs.components import qs.components.controls import qs.components.effects import qs.services -import qs.config +import Caelestia.Config StyledRect { id: root @@ -16,8 +16,8 @@ StyledRect { property int rows: 1 // Number of rows Layout.fillWidth: true - implicitHeight: layout.implicitHeight + Appearance.padding.large * 2 - radius: Appearance.rounding.normal + implicitHeight: layout.implicitHeight + Tokens.padding.large * 2 + radius: Tokens.rounding.normal color: Colours.layer(Colours.palette.m3surfaceContainer, 2) clip: true @@ -29,21 +29,21 @@ StyledRect { id: layout anchors.fill: parent - anchors.margins: Appearance.padding.large - spacing: Appearance.spacing.normal + anchors.margins: Tokens.padding.large + spacing: Tokens.spacing.normal StyledText { visible: root.title !== "" text: root.title - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } GridLayout { id: buttonGrid Layout.alignment: Qt.AlignHCenter - rowSpacing: Appearance.spacing.small - columnSpacing: Appearance.spacing.small + rowSpacing: Tokens.spacing.small + columnSpacing: Tokens.spacing.small rows: root.rows columns: Math.ceil(root.options.length / root.rows) @@ -81,13 +81,13 @@ StyledRect { // Match utilities Toggles radius styling // Each button has full rounding (not connected) since they have spacing - radius: stateLayer.pressed ? Appearance.rounding.small / 2 : internalChecked ? Appearance.rounding.small : Appearance.rounding.normal + radius: stateLayer.pressed ? Tokens.rounding.small / 2 : internalChecked ? Tokens.rounding.small : Tokens.rounding.normal // Match utilities Toggles inactive color inactiveColour: Colours.layer(Colours.palette.m3surfaceContainerHighest, 2) // Adjust width similar to utilities toggles - Layout.preferredWidth: implicitWidth + (stateLayer.pressed ? Appearance.padding.large : internalChecked ? Appearance.padding.smaller : 0) + Layout.preferredWidth: implicitWidth + (stateLayer.pressed ? Tokens.padding.large : internalChecked ? Tokens.padding.smaller : 0) onClicked: { if (modelData.onToggled && root.rootItem && modelData.propertyName) { @@ -98,15 +98,15 @@ StyledRect { Behavior on Layout.preferredWidth { Anim { - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } } Behavior on radius { Anim { - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } } } diff --git a/modules/controlcenter/components/DeviceDetails.qml b/modules/controlcenter/components/DeviceDetails.qml index c150abd7..5fc4d0ed 100644 --- a/modules/controlcenter/components/DeviceDetails.qml +++ b/modules/controlcenter/components/DeviceDetails.qml @@ -7,7 +7,7 @@ import qs.components import qs.components.containers import qs.components.controls import qs.components.effects -import qs.config +import Caelestia.Config Item { id: root @@ -30,7 +30,7 @@ Item { anchors.left: parent.left anchors.right: parent.right anchors.top: parent.top - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal Loader { id: headerLoader diff --git a/modules/controlcenter/components/DeviceList.qml b/modules/controlcenter/components/DeviceList.qml index 2134d8cf..8a65fc0c 100644 --- a/modules/controlcenter/components/DeviceList.qml +++ b/modules/controlcenter/components/DeviceList.qml @@ -8,7 +8,7 @@ import qs.components import qs.components.containers import qs.components.controls import qs.services -import qs.config +import Caelestia.Config ColumnLayout { id: root @@ -27,7 +27,7 @@ ColumnLayout { signal itemSelected(var item) - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small Loader { id: headerLoader @@ -41,13 +41,13 @@ ColumnLayout { RowLayout { Layout.fillWidth: true Layout.topMargin: root.headerComponent ? 0 : 0 - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small visible: root.title !== "" || root.description !== "" StyledText { visible: root.title !== "" text: root.title - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large font.weight: 500 } @@ -78,7 +78,7 @@ ColumnLayout { model: root.model delegate: root.delegate - spacing: Appearance.spacing.small / 2 + spacing: Tokens.spacing.small / 2 interactive: false clip: false } diff --git a/modules/controlcenter/components/PaneTransition.qml b/modules/controlcenter/components/PaneTransition.qml index ac9c3371..a025f7d0 100644 --- a/modules/controlcenter/components/PaneTransition.qml +++ b/modules/controlcenter/components/PaneTransition.qml @@ -1,7 +1,7 @@ pragma ComponentBehavior: Bound import QtQuick -import qs.config +import Caelestia.Config SequentialAnimation { id: root @@ -20,9 +20,9 @@ SequentialAnimation { property: "opacity" from: root.opacityFrom to: root.opacityTo - duration: Appearance.anim.durations.normal / 2 + duration: Tokens.anim.durations.normal / 2 easing.type: Easing.BezierSpline - easing.bezierCurve: Appearance.anim.curves.standardAccel + easing.bezierCurve: Tokens.anim.curves.standardAccel } NumberAnimation { @@ -30,9 +30,9 @@ SequentialAnimation { property: "scale" from: root.scaleFrom to: root.scaleTo - duration: Appearance.anim.durations.normal / 2 + duration: Tokens.anim.durations.normal / 2 easing.type: Easing.BezierSpline - easing.bezierCurve: Appearance.anim.curves.standardAccel + easing.bezierCurve: Tokens.anim.curves.standardAccel } } @@ -53,9 +53,9 @@ SequentialAnimation { property: "opacity" from: root.opacityTo to: root.opacityFrom - duration: Appearance.anim.durations.normal / 2 + duration: Tokens.anim.durations.normal / 2 easing.type: Easing.BezierSpline - easing.bezierCurve: Appearance.anim.curves.standardDecel + easing.bezierCurve: Tokens.anim.curves.standardDecel } NumberAnimation { @@ -63,9 +63,9 @@ SequentialAnimation { property: "scale" from: root.scaleTo to: root.scaleFrom - duration: Appearance.anim.durations.normal / 2 + duration: Tokens.anim.durations.normal / 2 easing.type: Easing.BezierSpline - easing.bezierCurve: Appearance.anim.curves.standardDecel + easing.bezierCurve: Tokens.anim.curves.standardDecel } } } diff --git a/modules/controlcenter/components/ReadonlySlider.qml b/modules/controlcenter/components/ReadonlySlider.qml index 10527045..e1bff137 100644 --- a/modules/controlcenter/components/ReadonlySlider.qml +++ b/modules/controlcenter/components/ReadonlySlider.qml @@ -5,7 +5,7 @@ import QtQuick.Layouts import qs.components import qs.components.controls import qs.services -import qs.config +import Caelestia.Config ColumnLayout { id: root @@ -17,16 +17,16 @@ ColumnLayout { property string suffix: "" property bool readonly: false - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small RowLayout { Layout.fillWidth: true - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal StyledText { visible: root.label !== "" text: root.label - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal color: root.readonly ? Colours.palette.m3outline : Colours.palette.m3onSurface } @@ -38,20 +38,20 @@ ColumnLayout { visible: root.readonly text: "lock" color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } StyledText { text: Math.round(root.value) + (root.suffix !== "" ? " " + root.suffix : "") - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal color: root.readonly ? Colours.palette.m3outline : Colours.palette.m3onSurface } } StyledRect { Layout.fillWidth: true - implicitHeight: Appearance.padding.normal - radius: Appearance.rounding.full + implicitHeight: Tokens.padding.normal + radius: Tokens.rounding.full color: Colours.layer(Colours.palette.m3surfaceContainerHighest, 1) opacity: root.readonly ? 0.5 : 1.0 diff --git a/modules/controlcenter/components/SettingsHeader.qml b/modules/controlcenter/components/SettingsHeader.qml index 6d392f5e..425a9e8e 100644 --- a/modules/controlcenter/components/SettingsHeader.qml +++ b/modules/controlcenter/components/SettingsHeader.qml @@ -3,7 +3,7 @@ pragma ComponentBehavior: Bound import QtQuick import QtQuick.Layouts import qs.components -import qs.config +import Caelestia.Config Item { id: root @@ -18,19 +18,19 @@ Item { id: column anchors.centerIn: parent - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal MaterialIcon { Layout.alignment: Qt.AlignHCenter text: root.icon - font.pointSize: Appearance.font.size.extraLarge * 3 + font.pointSize: Tokens.font.size.extraLarge * 3 font.bold: true } StyledText { Layout.alignment: Qt.AlignHCenter text: root.title - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large font.bold: true } } diff --git a/modules/controlcenter/components/SliderInput.qml b/modules/controlcenter/components/SliderInput.qml index df3acf41..1c1f29be 100644 --- a/modules/controlcenter/components/SliderInput.qml +++ b/modules/controlcenter/components/SliderInput.qml @@ -6,7 +6,7 @@ import qs.components import qs.components.controls import qs.components.effects import qs.services -import qs.config +import Caelestia.Config ColumnLayout { id: root @@ -52,7 +52,7 @@ ColumnLayout { return parseFloat(text); } - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small Component.onCompleted: { // Set initialized flag after a brief delay to allow component to fully load @@ -71,12 +71,12 @@ ColumnLayout { RowLayout { Layout.fillWidth: true - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal StyledText { visible: root.label !== "" text: root.label - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } Item { @@ -138,7 +138,7 @@ ColumnLayout { visible: root.suffix !== "" text: root.suffix color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } } @@ -146,7 +146,7 @@ ColumnLayout { id: slider Layout.fillWidth: true - implicitHeight: Appearance.padding.normal * 3 + implicitHeight: Tokens.padding.normal * 3 from: root.from to: root.to diff --git a/modules/controlcenter/components/SplitPaneLayout.qml b/modules/controlcenter/components/SplitPaneLayout.qml index 5bf5c41a..cff20ec7 100644 --- a/modules/controlcenter/components/SplitPaneLayout.qml +++ b/modules/controlcenter/components/SplitPaneLayout.qml @@ -5,7 +5,7 @@ import QtQuick.Layouts import Quickshell.Widgets import qs.components import qs.components.effects -import qs.config +import Caelestia.Config RowLayout { id: root @@ -32,9 +32,9 @@ RowLayout { id: leftClippingRect anchors.fill: parent - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal anchors.leftMargin: 0 - anchors.rightMargin: Appearance.padding.normal / 2 + anchors.rightMargin: Tokens.padding.normal / 2 radius: leftBorder.innerRadius color: "transparent" @@ -43,9 +43,9 @@ RowLayout { id: leftLoader anchors.fill: parent - anchors.margins: Appearance.padding.large + Appearance.padding.normal - anchors.leftMargin: Appearance.padding.large - anchors.rightMargin: Appearance.padding.large + Appearance.padding.normal / 2 + anchors.margins: Tokens.padding.large + Tokens.padding.normal + anchors.leftMargin: Tokens.padding.large + anchors.rightMargin: Tokens.padding.large + Tokens.padding.normal / 2 asynchronous: true sourceComponent: root.leftContent @@ -62,7 +62,7 @@ RowLayout { id: leftBorder leftThickness: 0 - rightThickness: Appearance.padding.normal / 2 + rightThickness: Tokens.padding.normal / 2 } } @@ -76,9 +76,9 @@ RowLayout { id: rightClippingRect anchors.fill: parent - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal anchors.leftMargin: 0 - anchors.rightMargin: Appearance.padding.normal / 2 + anchors.rightMargin: Tokens.padding.normal / 2 radius: rightBorder.innerRadius color: "transparent" @@ -87,7 +87,7 @@ RowLayout { id: rightLoader anchors.fill: parent - anchors.margins: Appearance.padding.large * 2 + anchors.margins: Tokens.padding.large * 2 asynchronous: true sourceComponent: root.rightContent @@ -103,7 +103,7 @@ RowLayout { InnerBorder { id: rightBorder - leftThickness: Appearance.padding.normal / 2 + leftThickness: Tokens.padding.normal / 2 } } } diff --git a/modules/controlcenter/components/SplitPaneWithDetails.qml b/modules/controlcenter/components/SplitPaneWithDetails.qml index e8dcb269..dcc472d9 100644 --- a/modules/controlcenter/components/SplitPaneWithDetails.qml +++ b/modules/controlcenter/components/SplitPaneWithDetails.qml @@ -7,7 +7,7 @@ import Quickshell.Widgets import qs.components import qs.components.containers import qs.components.effects -import qs.config +import Caelestia.Config Item { id: root diff --git a/modules/controlcenter/components/WallpaperGrid.qml b/modules/controlcenter/components/WallpaperGrid.qml index 6a65c8e1..b85ec556 100644 --- a/modules/controlcenter/components/WallpaperGrid.qml +++ b/modules/controlcenter/components/WallpaperGrid.qml @@ -8,18 +8,18 @@ import qs.components.controls import qs.components.effects import qs.components.images import qs.services -import qs.config +import Caelestia.Config GridView { id: root required property Session session - readonly property int minCellWidth: 200 + Appearance.spacing.normal + readonly property int minCellWidth: 200 + Tokens.spacing.normal readonly property int columnsCount: Math.max(1, Math.floor(width / minCellWidth)) cellWidth: width / columnsCount - cellHeight: 140 + Appearance.spacing.normal + cellHeight: 140 + Tokens.spacing.normal model: Wallpapers.list @@ -33,8 +33,8 @@ GridView { required property var modelData required property int index readonly property bool isCurrent: modelData && modelData.path === Wallpapers.actualCurrent - readonly property real itemMargin: Appearance.spacing.normal / 2 - readonly property real itemRadius: Appearance.rounding.normal + readonly property real itemMargin: Tokens.spacing.normal / 2 + readonly property real itemRadius: Tokens.rounding.normal width: root.cellWidth height: root.cellHeight @@ -130,7 +130,7 @@ GridView { anchors.right: parent.right anchors.bottom: parent.bottom - implicitHeight: filenameText.implicitHeight + Appearance.padding.normal * 1.5 + implicitHeight: filenameText.implicitHeight + Tokens.padding.normal * 1.5 radius: 0 gradient: Gradient { @@ -190,12 +190,12 @@ GridView { MaterialIcon { anchors.right: parent.right anchors.top: parent.top - anchors.margins: Appearance.padding.small + anchors.margins: Tokens.padding.small visible: isCurrent text: "check_circle" color: Colours.palette.m3primary - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large } } @@ -205,12 +205,12 @@ GridView { anchors.left: parent.left anchors.right: parent.right anchors.bottom: parent.bottom - anchors.leftMargin: Appearance.padding.normal + Appearance.spacing.normal / 2 - anchors.rightMargin: Appearance.padding.normal + Appearance.spacing.normal / 2 - anchors.bottomMargin: Appearance.padding.normal + anchors.leftMargin: Tokens.padding.normal + Tokens.spacing.normal / 2 + anchors.rightMargin: Tokens.padding.normal + Tokens.spacing.normal / 2 + anchors.bottomMargin: Tokens.padding.normal text: modelData.name - font.pointSize: Appearance.font.size.smaller + font.pointSize: Tokens.font.size.smaller font.weight: 500 color: isCurrent ? Colours.palette.m3primary : Colours.palette.m3onSurface elide: Text.ElideMiddle diff --git a/modules/controlcenter/dashboard/DashboardPane.qml b/modules/controlcenter/dashboard/DashboardPane.qml index bd6b9d5f..d2e95801 100644 --- a/modules/controlcenter/dashboard/DashboardPane.qml +++ b/modules/controlcenter/dashboard/DashboardPane.qml @@ -11,7 +11,7 @@ import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import qs.config +import Caelestia.Config import qs.utils Item { @@ -66,9 +66,9 @@ Item { id: dashboardClippingRect anchors.fill: parent - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal anchors.leftMargin: 0 - anchors.rightMargin: Appearance.padding.normal + anchors.rightMargin: Tokens.padding.normal radius: dashboardBorder.innerRadius color: "transparent" @@ -77,9 +77,9 @@ Item { id: dashboardLoader anchors.fill: parent - anchors.margins: Appearance.padding.large + Appearance.padding.normal - anchors.leftMargin: Appearance.padding.large - anchors.rightMargin: Appearance.padding.large + anchors.margins: Tokens.padding.large + Tokens.padding.normal + anchors.leftMargin: Tokens.padding.large + anchors.rightMargin: Tokens.padding.large asynchronous: true sourceComponent: dashboardContentComponent @@ -90,7 +90,7 @@ Item { id: dashboardBorder leftThickness: 0 - rightThickness: Appearance.padding.normal + rightThickness: Tokens.padding.normal } Component { @@ -113,14 +113,14 @@ Item { anchors.right: parent.right anchors.top: parent.top - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal RowLayout { - spacing: Appearance.spacing.smaller + spacing: Tokens.spacing.smaller StyledText { text: qsTr("Dashboard") - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large font.weight: 500 } } diff --git a/modules/controlcenter/dashboard/GeneralSection.qml b/modules/controlcenter/dashboard/GeneralSection.qml index 61e83d3c..6294a05d 100644 --- a/modules/controlcenter/dashboard/GeneralSection.qml +++ b/modules/controlcenter/dashboard/GeneralSection.qml @@ -5,7 +5,7 @@ import QtQuick.Layouts import qs.components import qs.components.controls import qs.services -import qs.config +import Caelestia.Config SectionContainer { id: root @@ -17,7 +17,7 @@ SectionContainer { StyledText { text: qsTr("General Settings") - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } SwitchRow { @@ -40,7 +40,7 @@ SectionContainer { RowLayout { Layout.fillWidth: true - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal SwitchRow { Layout.fillWidth: true diff --git a/modules/controlcenter/dashboard/PerformanceSection.qml b/modules/controlcenter/dashboard/PerformanceSection.qml index eebf5fd2..1a0b6482 100644 --- a/modules/controlcenter/dashboard/PerformanceSection.qml +++ b/modules/controlcenter/dashboard/PerformanceSection.qml @@ -6,7 +6,7 @@ import Quickshell.Services.UPower import qs.components import qs.components.controls import qs.services -import qs.config +import Caelestia.Config SectionContainer { id: root @@ -22,7 +22,7 @@ SectionContainer { StyledText { text: qsTr("Performance Resources") - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } ConnectedButtonGroup { diff --git a/modules/controlcenter/launcher/LauncherPane.qml b/modules/controlcenter/launcher/LauncherPane.qml index 677cf418..51989c63 100644 --- a/modules/controlcenter/launcher/LauncherPane.qml +++ b/modules/controlcenter/launcher/LauncherPane.qml @@ -14,7 +14,7 @@ import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import qs.config +import Caelestia.Config import qs.utils Item { @@ -150,14 +150,14 @@ Item { anchors.fill: parent - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small RowLayout { - spacing: Appearance.spacing.smaller + spacing: Tokens.spacing.smaller StyledText { text: qsTr("Launcher") - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large font.weight: 500 } @@ -169,9 +169,9 @@ Item { toggled: !root.session.launcher.active icon: "settings" accent: "Primary" - iconSize: Appearance.font.size.normal - horizontalPadding: Appearance.padding.normal - verticalPadding: Appearance.padding.smaller + iconSize: Tokens.font.size.normal + horizontalPadding: Tokens.padding.normal + verticalPadding: Tokens.padding.smaller tooltip: qsTr("Launcher settings") onClicked: { @@ -187,9 +187,9 @@ Item { } StyledText { - Layout.topMargin: Appearance.spacing.large + Layout.topMargin: Tokens.spacing.large text: qsTr("Applications (%1)").arg(root.searchText ? root.filteredApps.length : allAppsDb.apps.length) - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal font.weight: 500 } @@ -200,11 +200,11 @@ Item { StyledRect { Layout.fillWidth: true - Layout.topMargin: Appearance.spacing.normal - Layout.bottomMargin: Appearance.spacing.small + Layout.topMargin: Tokens.spacing.normal + Layout.bottomMargin: Tokens.spacing.small color: Colours.layer(Colours.palette.m3surfaceContainer, 2) - radius: Appearance.rounding.full + radius: Tokens.rounding.full implicitHeight: Math.max(searchIcon.implicitHeight, searchField.implicitHeight, clearIcon.implicitHeight) @@ -213,7 +213,7 @@ Item { anchors.verticalCenter: parent.verticalCenter anchors.left: parent.left - anchors.leftMargin: Appearance.padding.normal + anchors.leftMargin: Tokens.padding.normal text: "search" color: Colours.palette.m3onSurfaceVariant @@ -224,11 +224,11 @@ Item { anchors.left: searchIcon.right anchors.right: clearIcon.left - anchors.leftMargin: Appearance.spacing.small - anchors.rightMargin: Appearance.spacing.small + anchors.leftMargin: Tokens.spacing.small + anchors.rightMargin: Tokens.spacing.small - topPadding: Appearance.padding.normal - bottomPadding: Appearance.padding.normal + topPadding: Tokens.padding.normal + bottomPadding: Tokens.padding.normal placeholderText: qsTr("Search applications...") @@ -242,7 +242,7 @@ Item { anchors.verticalCenter: parent.verticalCenter anchors.right: parent.right - anchors.rightMargin: Appearance.padding.normal + anchors.rightMargin: Tokens.padding.normal width: searchField.text ? implicitWidth : implicitWidth / 2 opacity: { @@ -270,13 +270,13 @@ Item { Behavior on width { Anim { - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small } } Behavior on opacity { Anim { - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small } } } @@ -297,7 +297,7 @@ Item { Layout.fillHeight: true model: root.filteredApps - spacing: Appearance.spacing.small / 2 + spacing: Tokens.spacing.small / 2 clip: true StyledScrollBar.vertical: StyledScrollBar { @@ -313,7 +313,7 @@ Item { implicitHeight: 40 color: isSelected ? Colours.layer(Colours.palette.m3surfaceContainer, 2) : "transparent" - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal opacity: 0 @@ -338,9 +338,9 @@ Item { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal IconImage { asynchronous: true @@ -355,7 +355,7 @@ Item { StyledText { Layout.fillWidth: true text: modelData.name || modelData.entry?.name || qsTr("Unknown") - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } Loader { @@ -518,12 +518,12 @@ Item { readonly property var displayedApp: parent && parent.displayedApp !== undefined ? parent.displayedApp : null anchors.fill: parent - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal SettingsHeader { - Layout.leftMargin: Appearance.padding.large * 2 - Layout.rightMargin: Appearance.padding.large * 2 - Layout.topMargin: Appearance.padding.large * 2 + Layout.leftMargin: Tokens.padding.large * 2 + Layout.rightMargin: Tokens.padding.large * 2 + Layout.topMargin: Tokens.padding.large * 2 visible: displayedApp === null icon: "apps" title: qsTr("Launcher Applications") @@ -531,23 +531,23 @@ Item { Item { Layout.alignment: Qt.AlignHCenter - Layout.leftMargin: Appearance.padding.large * 2 - Layout.rightMargin: Appearance.padding.large * 2 - Layout.topMargin: Appearance.padding.large * 2 + Layout.leftMargin: Tokens.padding.large * 2 + Layout.rightMargin: Tokens.padding.large * 2 + Layout.topMargin: Tokens.padding.large * 2 visible: displayedApp !== null implicitWidth: Math.max(appIconImage.implicitWidth, appTitleText.implicitWidth) - implicitHeight: appIconImage.implicitHeight + Appearance.spacing.normal + appTitleText.implicitHeight + implicitHeight: appIconImage.implicitHeight + Tokens.spacing.normal + appTitleText.implicitHeight ColumnLayout { anchors.centerIn: parent - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal IconImage { id: appIconImage asynchronous: true Layout.alignment: Qt.AlignHCenter - implicitSize: Appearance.font.size.extraLarge * 3 * 2 + implicitSize: Tokens.font.size.extraLarge * 3 * 2 source: { const app = appDetailsLayout.displayedApp; if (!app) @@ -565,7 +565,7 @@ Item { Layout.alignment: Qt.AlignHCenter text: displayedApp ? (displayedApp.name || displayedApp.entry?.name || qsTr("Application Details")) : "" - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large font.bold: true } } @@ -574,9 +574,9 @@ Item { Item { Layout.fillWidth: true Layout.fillHeight: true - Layout.topMargin: Appearance.spacing.large - Layout.leftMargin: Appearance.padding.large * 2 - Layout.rightMargin: Appearance.padding.large * 2 + Layout.topMargin: Tokens.spacing.large + Layout.leftMargin: Tokens.padding.large * 2 + Layout.rightMargin: Tokens.padding.large * 2 StyledFlickable { id: detailsFlickable @@ -595,10 +595,10 @@ Item { anchors.left: parent.left anchors.right: parent.right anchors.top: parent.top - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal SwitchRow { - Layout.topMargin: Appearance.spacing.normal + Layout.topMargin: Tokens.spacing.normal visible: appDetailsLayout.displayedApp !== null label: qsTr("Mark as favourite") checked: root.favouriteChecked @@ -631,7 +631,7 @@ Item { } } SwitchRow { - Layout.topMargin: Appearance.spacing.normal + Layout.topMargin: Tokens.spacing.normal visible: appDetailsLayout.displayedApp !== null label: qsTr("Hide from launcher") checked: root.hideFromLauncherChecked diff --git a/modules/controlcenter/launcher/Settings.qml b/modules/controlcenter/launcher/Settings.qml index 95fc2fb0..1641570c 100644 --- a/modules/controlcenter/launcher/Settings.qml +++ b/modules/controlcenter/launcher/Settings.qml @@ -8,14 +8,14 @@ import qs.components import qs.components.controls import qs.components.effects import qs.services -import qs.config +import Caelestia.Config ColumnLayout { id: root required property Session session - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal SettingsHeader { icon: "apps" @@ -23,7 +23,7 @@ ColumnLayout { } SectionHeader { - Layout.topMargin: Appearance.spacing.large + Layout.topMargin: Tokens.spacing.large title: qsTr("General") description: qsTr("General launcher settings") } @@ -67,13 +67,13 @@ ColumnLayout { } SectionHeader { - Layout.topMargin: Appearance.spacing.large + Layout.topMargin: Tokens.spacing.large title: qsTr("Display") description: qsTr("Display and appearance settings") } SectionContainer { - contentSpacing: Appearance.spacing.small / 2 + contentSpacing: Tokens.spacing.small / 2 PropertyRow { label: qsTr("Max shown items") @@ -94,13 +94,13 @@ ColumnLayout { } SectionHeader { - Layout.topMargin: Appearance.spacing.large + Layout.topMargin: Tokens.spacing.large title: qsTr("Prefixes") description: qsTr("Command prefix settings") } SectionContainer { - contentSpacing: Appearance.spacing.small / 2 + contentSpacing: Tokens.spacing.small / 2 PropertyRow { label: qsTr("Special prefix") @@ -115,7 +115,7 @@ ColumnLayout { } SectionHeader { - Layout.topMargin: Appearance.spacing.large + Layout.topMargin: Tokens.spacing.large title: qsTr("Fuzzy search") description: qsTr("Fuzzy search settings") } @@ -168,13 +168,13 @@ ColumnLayout { } SectionHeader { - Layout.topMargin: Appearance.spacing.large + Layout.topMargin: Tokens.spacing.large title: qsTr("Sizes") description: qsTr("Size settings for launcher items") } SectionContainer { - contentSpacing: Appearance.spacing.small / 2 + contentSpacing: Tokens.spacing.small / 2 PropertyRow { label: qsTr("Item width") @@ -201,13 +201,13 @@ ColumnLayout { } SectionHeader { - Layout.topMargin: Appearance.spacing.large + Layout.topMargin: Tokens.spacing.large title: qsTr("Hidden apps") description: qsTr("Applications hidden from launcher") } SectionContainer { - contentSpacing: Appearance.spacing.small / 2 + contentSpacing: Tokens.spacing.small / 2 PropertyRow { label: qsTr("Total hidden") diff --git a/modules/controlcenter/network/EthernetDetails.qml b/modules/controlcenter/network/EthernetDetails.qml index 9b78ccaf..e6128a31 100644 --- a/modules/controlcenter/network/EthernetDetails.qml +++ b/modules/controlcenter/network/EthernetDetails.qml @@ -9,7 +9,7 @@ import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import qs.config +import Caelestia.Config DeviceDetails { id: root @@ -43,7 +43,7 @@ DeviceDetails { sections: [ Component { ColumnLayout { - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal SectionHeader { title: qsTr("Connection status") @@ -69,7 +69,7 @@ DeviceDetails { }, Component { ColumnLayout { - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal SectionHeader { title: qsTr("Device properties") @@ -77,7 +77,7 @@ DeviceDetails { } SectionContainer { - contentSpacing: Appearance.spacing.small / 2 + contentSpacing: Tokens.spacing.small / 2 PropertyRow { label: qsTr("Interface") @@ -100,7 +100,7 @@ DeviceDetails { }, Component { ColumnLayout { - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal SectionHeader { title: qsTr("Connection information") diff --git a/modules/controlcenter/network/EthernetList.qml b/modules/controlcenter/network/EthernetList.qml index 4fcd5b92..44048265 100644 --- a/modules/controlcenter/network/EthernetList.qml +++ b/modules/controlcenter/network/EthernetList.qml @@ -8,7 +8,7 @@ import qs.components import qs.components.containers import qs.components.controls import qs.services -import qs.config +import Caelestia.Config DeviceList { id: root @@ -23,11 +23,11 @@ DeviceList { headerComponent: Component { RowLayout { - spacing: Appearance.spacing.smaller + spacing: Tokens.spacing.smaller StyledText { text: qsTr("Settings") - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large font.weight: 500 } @@ -39,9 +39,9 @@ DeviceList { toggled: !root.session.ethernet.active icon: "settings" accent: "Primary" - iconSize: Appearance.font.size.normal - horizontalPadding: Appearance.padding.normal - verticalPadding: Appearance.padding.smaller + iconSize: Tokens.font.size.normal + horizontalPadding: Tokens.padding.normal + verticalPadding: Tokens.padding.smaller onClicked: { if (root.session.ethernet.active) @@ -62,10 +62,10 @@ DeviceList { readonly property bool isActive: root.activeItem && modelData && root.activeItem.interface === modelData.interface width: ListView.view ? ListView.view.width : undefined - implicitHeight: rowLayout.implicitHeight + Appearance.padding.normal * 2 + implicitHeight: rowLayout.implicitHeight + Tokens.padding.normal * 2 color: Qt.alpha(Colours.tPalette.m3surfaceContainer, ethernetItem.isActive ? Colours.tPalette.m3surfaceContainer.a : 0) - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal StateLayer { id: stateLayer @@ -79,15 +79,15 @@ DeviceList { id: rowLayout anchors.fill: parent - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal StyledRect { implicitWidth: implicitHeight - implicitHeight: icon.implicitHeight + Appearance.padding.normal * 2 + implicitHeight: icon.implicitHeight + Tokens.padding.normal * 2 - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: modelData.connected ? Colours.palette.m3primaryContainer : Colours.tPalette.m3surfaceContainerHigh StyledRect { @@ -101,7 +101,7 @@ DeviceList { anchors.centerIn: parent text: "cable" - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large fill: modelData.connected ? 1 : 0 color: modelData.connected ? Colours.palette.m3onPrimaryContainer : Colours.palette.m3onSurface @@ -124,13 +124,13 @@ DeviceList { RowLayout { Layout.fillWidth: true - spacing: Appearance.spacing.smaller + spacing: Tokens.spacing.smaller StyledText { Layout.fillWidth: true text: modelData.connected ? qsTr("Connected") : qsTr("Disconnected") color: modelData.connected ? Colours.palette.m3primary : Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small font.weight: modelData.connected ? 500 : 400 elide: Text.ElideRight } @@ -141,9 +141,9 @@ DeviceList { id: connectBtn implicitWidth: implicitHeight - implicitHeight: connectIcon.implicitHeight + Appearance.padding.smaller * 2 + implicitHeight: connectIcon.implicitHeight + Tokens.padding.smaller * 2 - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: Qt.alpha(Colours.palette.m3primaryContainer, modelData.connected ? 1 : 0) StateLayer { diff --git a/modules/controlcenter/network/EthernetPane.qml b/modules/controlcenter/network/EthernetPane.qml index 8fb833fd..a2699c78 100644 --- a/modules/controlcenter/network/EthernetPane.qml +++ b/modules/controlcenter/network/EthernetPane.qml @@ -6,7 +6,7 @@ import QtQuick import Quickshell.Widgets import qs.components import qs.components.containers -import qs.config +import Caelestia.Config SplitPaneWithDetails { id: root diff --git a/modules/controlcenter/network/EthernetSettings.qml b/modules/controlcenter/network/EthernetSettings.qml index 3d99c47c..7a37316c 100644 --- a/modules/controlcenter/network/EthernetSettings.qml +++ b/modules/controlcenter/network/EthernetSettings.qml @@ -8,14 +8,14 @@ import qs.components import qs.components.controls import qs.components.effects import qs.services -import qs.config +import Caelestia.Config ColumnLayout { id: root required property Session session - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal SettingsHeader { icon: "cable" @@ -23,9 +23,9 @@ ColumnLayout { } StyledText { - Layout.topMargin: Appearance.spacing.large + Layout.topMargin: Tokens.spacing.large text: qsTr("Ethernet devices") - font.pointSize: Appearance.font.size.larger + font.pointSize: Tokens.font.size.larger font.weight: 500 } @@ -36,9 +36,9 @@ ColumnLayout { StyledRect { Layout.fillWidth: true - implicitHeight: ethernetInfo.implicitHeight + Appearance.padding.large * 2 + implicitHeight: ethernetInfo.implicitHeight + Tokens.padding.large * 2 - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: Colours.tPalette.m3surfaceContainer ColumnLayout { @@ -47,9 +47,9 @@ ColumnLayout { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.large + anchors.margins: Tokens.padding.large - spacing: Appearance.spacing.small / 2 + spacing: Tokens.spacing.small / 2 StyledText { text: qsTr("Total devices") @@ -58,18 +58,18 @@ ColumnLayout { StyledText { text: qsTr("%1").arg(Nmcli.ethernetDevices.length) color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } StyledText { - Layout.topMargin: Appearance.spacing.normal + Layout.topMargin: Tokens.spacing.normal text: qsTr("Connected devices") } StyledText { text: qsTr("%1").arg(Nmcli.ethernetDevices.filter(d => d.connected).length) color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } } } diff --git a/modules/controlcenter/network/NetworkSettings.qml b/modules/controlcenter/network/NetworkSettings.qml index 15ac56d2..6a1bc6df 100644 --- a/modules/controlcenter/network/NetworkSettings.qml +++ b/modules/controlcenter/network/NetworkSettings.qml @@ -10,14 +10,14 @@ import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import qs.config +import Caelestia.Config ColumnLayout { id: root required property Session session - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal SettingsHeader { icon: "router" @@ -25,13 +25,13 @@ ColumnLayout { } SectionHeader { - Layout.topMargin: Appearance.spacing.large + Layout.topMargin: Tokens.spacing.large title: qsTr("Ethernet") description: qsTr("Ethernet device information") } SectionContainer { - contentSpacing: Appearance.spacing.small / 2 + contentSpacing: Tokens.spacing.small / 2 PropertyRow { label: qsTr("Total devices") @@ -46,7 +46,7 @@ ColumnLayout { } SectionHeader { - Layout.topMargin: Appearance.spacing.large + Layout.topMargin: Tokens.spacing.large title: qsTr("Wireless") description: qsTr("WiFi network settings") } @@ -62,7 +62,7 @@ ColumnLayout { } SectionHeader { - Layout.topMargin: Appearance.spacing.large + Layout.topMargin: Tokens.spacing.large title: qsTr("VPN") description: qsTr("VPN provider settings") visible: Config.utilities.vpn.enabled || Config.utilities.vpn.provider.length > 0 @@ -88,8 +88,8 @@ ColumnLayout { TextButton { Layout.fillWidth: true - Layout.topMargin: Appearance.spacing.normal - Layout.minimumHeight: Appearance.font.size.normal + Appearance.padding.normal * 2 + Layout.topMargin: Tokens.spacing.normal + Layout.minimumHeight: Tokens.font.size.normal + Tokens.padding.normal * 2 text: qsTr("⚙ Manage VPN Providers") inactiveColour: Colours.palette.m3secondaryContainer inactiveOnColour: Colours.palette.m3onSecondaryContainer @@ -101,13 +101,13 @@ ColumnLayout { } SectionHeader { - Layout.topMargin: Appearance.spacing.large + Layout.topMargin: Tokens.spacing.large title: qsTr("Current connection") description: qsTr("Active network connection information") } SectionContainer { - contentSpacing: Appearance.spacing.small / 2 + contentSpacing: Tokens.spacing.small / 2 PropertyRow { label: qsTr("Network") @@ -141,20 +141,20 @@ ColumnLayout { parent: Overlay.overlay anchors.centerIn: parent - width: Math.min(600, parent.width - Appearance.padding.large * 2) - height: Math.min(700, parent.height - Appearance.padding.large * 2) + width: Math.min(600, parent.width - Tokens.padding.large * 2) + height: Math.min(700, parent.height - Tokens.padding.large * 2) modal: true closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside background: StyledRect { color: Colours.palette.m3surface - radius: Appearance.rounding.large + radius: Tokens.rounding.large } StyledFlickable { anchors.fill: parent - anchors.margins: Appearance.padding.large * 1.5 + anchors.margins: Tokens.padding.large * 1.5 flickableDirection: Flickable.VerticalFlick contentHeight: vpnSettingsContent.height clip: true diff --git a/modules/controlcenter/network/NetworkingPane.qml b/modules/controlcenter/network/NetworkingPane.qml index 990c4a26..2829a114 100644 --- a/modules/controlcenter/network/NetworkingPane.qml +++ b/modules/controlcenter/network/NetworkingPane.qml @@ -12,7 +12,7 @@ import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import qs.config +import Caelestia.Config import qs.utils Item { @@ -43,15 +43,15 @@ Item { anchors.left: parent.left anchors.right: parent.right - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal RowLayout { Layout.fillWidth: true - spacing: Appearance.spacing.smaller + spacing: Tokens.spacing.smaller StyledText { text: qsTr("Network") - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large font.weight: 500 } @@ -63,9 +63,9 @@ Item { toggled: Nmcli.wifiEnabled icon: "wifi" accent: "Tertiary" - iconSize: Appearance.font.size.normal - horizontalPadding: Appearance.padding.normal - verticalPadding: Appearance.padding.smaller + iconSize: Tokens.font.size.normal + horizontalPadding: Tokens.padding.normal + verticalPadding: Tokens.padding.smaller tooltip: qsTr("Toggle WiFi") onClicked: { @@ -77,9 +77,9 @@ Item { toggled: Nmcli.scanning icon: "wifi_find" accent: "Secondary" - iconSize: Appearance.font.size.normal - horizontalPadding: Appearance.padding.normal - verticalPadding: Appearance.padding.smaller + iconSize: Tokens.font.size.normal + horizontalPadding: Tokens.padding.normal + verticalPadding: Tokens.padding.smaller tooltip: qsTr("Scan for networks") onClicked: { @@ -91,9 +91,9 @@ Item { toggled: !root.session.ethernet.active && !root.session.network.active icon: "settings" accent: "Primary" - iconSize: Appearance.font.size.normal - horizontalPadding: Appearance.padding.normal - verticalPadding: Appearance.padding.smaller + iconSize: Tokens.font.size.normal + horizontalPadding: Tokens.padding.normal + verticalPadding: Tokens.padding.smaller tooltip: qsTr("Network settings") onClicked: { diff --git a/modules/controlcenter/network/VpnDetails.qml b/modules/controlcenter/network/VpnDetails.qml index b02f4c49..214e4eb3 100644 --- a/modules/controlcenter/network/VpnDetails.qml +++ b/modules/controlcenter/network/VpnDetails.qml @@ -10,7 +10,7 @@ import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import qs.config +import Caelestia.Config import qs.utils DeviceDetails { @@ -37,7 +37,7 @@ DeviceDetails { sections: [ Component { ColumnLayout { - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal SectionHeader { title: qsTr("Connection status") @@ -92,12 +92,12 @@ DeviceDetails { RowLayout { Layout.fillWidth: true - Layout.topMargin: Appearance.spacing.normal - spacing: Appearance.spacing.normal + Layout.topMargin: Tokens.spacing.normal + spacing: Tokens.spacing.normal TextButton { Layout.fillWidth: true - Layout.minimumHeight: Appearance.font.size.normal + Appearance.padding.normal * 2 + Layout.minimumHeight: Tokens.font.size.normal + Tokens.padding.normal * 2 visible: root.providerEnabled enabled: !VPN.connecting inactiveColour: Colours.palette.m3primaryContainer @@ -149,7 +149,7 @@ DeviceDetails { TextButton { Layout.fillWidth: true - Layout.topMargin: Appearance.spacing.normal + Layout.topMargin: Tokens.spacing.normal visible: root.providerEnabled && VPN.status.state === "needs-auth" && VPN.status.authUrl !== "" text: qsTr("Open Login Page") inactiveColour: Colours.palette.m3tertiaryContainer @@ -162,10 +162,10 @@ DeviceDetails { StyledText { Layout.fillWidth: true - Layout.topMargin: Appearance.spacing.normal + Layout.topMargin: Tokens.spacing.normal visible: root.providerEnabled && VPN.status.state === "needs-auth" && VPN.status.authUrl === "" text: qsTr("Click 'Connect' to generate authentication URL") - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: Colours.palette.m3onSurfaceVariant horizontalAlignment: Text.AlignHCenter wrapMode: Text.WordWrap @@ -175,7 +175,7 @@ DeviceDetails { }, Component { ColumnLayout { - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal SectionHeader { title: qsTr("Provider details") @@ -183,7 +183,7 @@ DeviceDetails { } SectionContainer { - contentSpacing: Appearance.spacing.small / 2 + contentSpacing: Tokens.spacing.small / 2 PropertyRow { label: qsTr("Provider") @@ -262,8 +262,8 @@ DeviceDetails { parent: Overlay.overlay anchors.centerIn: parent - width: Math.min(400, parent.width - Appearance.padding.large * 2) - padding: Appearance.padding.large * 1.5 + width: Math.min(400, parent.width - Tokens.padding.large * 2) + padding: Tokens.padding.large * 1.5 modal: true closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside @@ -276,15 +276,15 @@ DeviceDetails { property: "opacity" from: 0 to: 1 - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } Anim { property: "scale" from: 0.7 to: 1 - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } } @@ -293,15 +293,15 @@ DeviceDetails { property: "opacity" from: 1 to: 0 - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } Anim { property: "scale" from: 1 to: 0.7 - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } } @@ -311,7 +311,7 @@ DeviceDetails { background: StyledRect { color: Colours.palette.m3surfaceContainerHigh - radius: Appearance.rounding.large + radius: Tokens.rounding.large Elevation { anchors.fill: parent @@ -322,21 +322,21 @@ DeviceDetails { } contentItem: ColumnLayout { - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal StyledText { text: qsTr("Edit VPN Provider") - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large font.weight: 500 } ColumnLayout { Layout.fillWidth: true - spacing: Appearance.spacing.smaller / 2 + spacing: Tokens.spacing.smaller / 2 StyledText { text: qsTr("Display Name") - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: Colours.palette.m3onSurfaceVariant } @@ -344,7 +344,7 @@ DeviceDetails { Layout.fillWidth: true implicitHeight: 40 color: displayNameField.activeFocus ? Colours.layer(Colours.palette.m3surfaceContainer, 3) : Colours.layer(Colours.palette.m3surfaceContainer, 2) - radius: Appearance.rounding.small + radius: Tokens.rounding.small border.width: 1 border.color: displayNameField.activeFocus ? Colours.palette.m3primary : Qt.alpha(Colours.palette.m3outline, 0.3) @@ -359,7 +359,7 @@ DeviceDetails { id: displayNameField anchors.centerIn: parent - width: parent.width - Appearance.padding.normal + width: parent.width - Tokens.padding.normal horizontalAlignment: TextInput.AlignLeft text: editVpnDialog.displayName onTextChanged: editVpnDialog.displayName = text @@ -369,11 +369,11 @@ DeviceDetails { ColumnLayout { Layout.fillWidth: true - spacing: Appearance.spacing.smaller / 2 + spacing: Tokens.spacing.smaller / 2 StyledText { text: qsTr("Interface (e.g., wg0, torguard)") - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: Colours.palette.m3onSurfaceVariant } @@ -381,7 +381,7 @@ DeviceDetails { Layout.fillWidth: true implicitHeight: 40 color: interfaceNameField.activeFocus ? Colours.layer(Colours.palette.m3surfaceContainer, 3) : Colours.layer(Colours.palette.m3surfaceContainer, 2) - radius: Appearance.rounding.small + radius: Tokens.rounding.small border.width: 1 border.color: interfaceNameField.activeFocus ? Colours.palette.m3primary : Qt.alpha(Colours.palette.m3outline, 0.3) @@ -396,7 +396,7 @@ DeviceDetails { id: interfaceNameField anchors.centerIn: parent - width: parent.width - Appearance.padding.normal + width: parent.width - Tokens.padding.normal horizontalAlignment: TextInput.AlignLeft text: editVpnDialog.interfaceName onTextChanged: editVpnDialog.interfaceName = text @@ -406,12 +406,12 @@ DeviceDetails { ColumnLayout { Layout.fillWidth: true - spacing: Appearance.spacing.smaller / 2 + spacing: Tokens.spacing.smaller / 2 visible: editVpnDialog.connectCmd.length > 0 StyledText { text: qsTr("Connect Command") - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: Colours.palette.m3onSurfaceVariant } @@ -419,7 +419,7 @@ DeviceDetails { Layout.fillWidth: true implicitHeight: 40 color: connectCmdFieldEdit.activeFocus ? Colours.layer(Colours.palette.m3surfaceContainer, 3) : Colours.layer(Colours.palette.m3surfaceContainer, 2) - radius: Appearance.rounding.small + radius: Tokens.rounding.small border.width: 1 border.color: connectCmdFieldEdit.activeFocus ? Colours.palette.m3primary : Qt.alpha(Colours.palette.m3outline, 0.3) @@ -434,7 +434,7 @@ DeviceDetails { id: connectCmdFieldEdit anchors.centerIn: parent - width: parent.width - Appearance.padding.normal + width: parent.width - Tokens.padding.normal horizontalAlignment: TextInput.AlignLeft text: editVpnDialog.connectCmd onTextChanged: editVpnDialog.connectCmd = text @@ -444,12 +444,12 @@ DeviceDetails { ColumnLayout { Layout.fillWidth: true - spacing: Appearance.spacing.smaller / 2 + spacing: Tokens.spacing.smaller / 2 visible: editVpnDialog.disconnectCmd.length > 0 StyledText { text: qsTr("Disconnect Command") - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: Colours.palette.m3onSurfaceVariant } @@ -457,7 +457,7 @@ DeviceDetails { Layout.fillWidth: true implicitHeight: 40 color: disconnectCmdFieldEdit.activeFocus ? Colours.layer(Colours.palette.m3surfaceContainer, 3) : Colours.layer(Colours.palette.m3surfaceContainer, 2) - radius: Appearance.rounding.small + radius: Tokens.rounding.small border.width: 1 border.color: disconnectCmdFieldEdit.activeFocus ? Colours.palette.m3primary : Qt.alpha(Colours.palette.m3outline, 0.3) @@ -472,7 +472,7 @@ DeviceDetails { id: disconnectCmdFieldEdit anchors.centerIn: parent - width: parent.width - Appearance.padding.normal + width: parent.width - Tokens.padding.normal horizontalAlignment: TextInput.AlignLeft text: editVpnDialog.disconnectCmd onTextChanged: editVpnDialog.disconnectCmd = text @@ -481,9 +481,9 @@ DeviceDetails { } RowLayout { - Layout.topMargin: Appearance.spacing.normal + Layout.topMargin: Tokens.spacing.normal Layout.fillWidth: true - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal TextButton { Layout.fillWidth: true diff --git a/modules/controlcenter/network/VpnList.qml b/modules/controlcenter/network/VpnList.qml index 8522f972..5ca385cb 100644 --- a/modules/controlcenter/network/VpnList.qml +++ b/modules/controlcenter/network/VpnList.qml @@ -9,7 +9,7 @@ import qs.components import qs.components.controls import qs.components.effects import qs.services -import qs.config +import Caelestia.Config ColumnLayout { id: root @@ -18,7 +18,7 @@ ColumnLayout { property bool showHeader: true property int pendingSwitchIndex: -1 - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal Connections { function onConnectedChanged() { @@ -77,7 +77,7 @@ ColumnLayout { Layout.preferredHeight: contentHeight interactive: false - spacing: Appearance.spacing.smaller + spacing: Tokens.spacing.smaller model: ScriptModel { values: Config.utilities.vpn.provider.map((provider, index) => { @@ -104,10 +104,10 @@ ColumnLayout { required property int index width: ListView.view ? ListView.view.width : undefined - implicitHeight: rowLayout.implicitHeight + Appearance.padding.normal * 2 + implicitHeight: rowLayout.implicitHeight + Tokens.padding.normal * 2 color: Qt.alpha(Colours.tPalette.m3surfaceContainer, (root.session && root.session.vpn && root.session.vpn.active === modelData) ? Colours.tPalette.m3surfaceContainer.a : 0) - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal StateLayer { function onClicked(): void { @@ -123,15 +123,15 @@ ColumnLayout { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal StyledRect { implicitWidth: implicitHeight - implicitHeight: icon.implicitHeight + Appearance.padding.normal * 2 + implicitHeight: icon.implicitHeight + Tokens.padding.normal * 2 - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: modelData.enabled && VPN.connected ? Colours.palette.m3primaryContainer : Colours.tPalette.m3surfaceContainerHigh MaterialIcon { @@ -139,7 +139,7 @@ ColumnLayout { anchors.centerIn: parent text: modelData.enabled && VPN.connected ? "vpn_key" : "vpn_key_off" - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large fill: modelData.enabled && VPN.connected ? 1 : 0 color: modelData.enabled && VPN.connected ? Colours.palette.m3onPrimaryContainer : Colours.palette.m3onSurface } @@ -160,7 +160,7 @@ ColumnLayout { RowLayout { Layout.fillWidth: true - spacing: Appearance.spacing.smaller + spacing: Tokens.spacing.smaller StyledText { Layout.fillWidth: true @@ -197,7 +197,7 @@ ColumnLayout { return Colours.palette.m3tertiary; return Colours.palette.m3onSurface; } - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small font.weight: modelData.enabled && VPN.connected ? 500 : 400 elide: Text.ElideRight } @@ -206,9 +206,9 @@ ColumnLayout { StyledRect { implicitWidth: implicitHeight - implicitHeight: connectIcon.implicitHeight + Appearance.padding.smaller * 2 + implicitHeight: connectIcon.implicitHeight + Tokens.padding.smaller * 2 - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: Qt.alpha(Colours.palette.m3primaryContainer, VPN.connected && modelData.enabled ? 1 : 0) StateLayer { @@ -267,9 +267,9 @@ ColumnLayout { StyledRect { implicitWidth: implicitHeight - implicitHeight: deleteIcon.implicitHeight + Appearance.padding.smaller * 2 + implicitHeight: deleteIcon.implicitHeight + Tokens.padding.smaller * 2 - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: "transparent" StateLayer { @@ -366,8 +366,8 @@ ColumnLayout { parent: Overlay.overlay x: Math.round((parent.width - width) / 2) y: Math.round((parent.height - height) / 2) - implicitWidth: Math.min(400, parent.width - Appearance.padding.large * 2) - padding: Appearance.padding.large * 1.5 + implicitWidth: Math.min(400, parent.width - Tokens.padding.large * 2) + padding: Tokens.padding.large * 1.5 modal: true closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside @@ -381,15 +381,15 @@ ColumnLayout { property: "opacity" from: 0 to: 1 - duration: Appearance.anim.durations.normal - easing.bezierCurve: Appearance.anim.curves.emphasized + duration: Tokens.anim.durations.normal + easing.bezierCurve: Tokens.anim.curves.emphasized } Anim { property: "scale" from: 0.7 to: 1 - duration: Appearance.anim.durations.normal - easing.bezierCurve: Appearance.anim.curves.emphasized + duration: Tokens.anim.durations.normal + easing.bezierCurve: Tokens.anim.curves.emphasized } } } @@ -400,15 +400,15 @@ ColumnLayout { property: "opacity" from: 1 to: 0 - duration: Appearance.anim.durations.small - easing.bezierCurve: Appearance.anim.curves.emphasized + duration: Tokens.anim.durations.small + easing.bezierCurve: Tokens.anim.curves.emphasized } Anim { property: "scale" from: 1 to: 0.7 - duration: Appearance.anim.durations.small - easing.bezierCurve: Appearance.anim.curves.emphasized + duration: Tokens.anim.durations.small + easing.bezierCurve: Tokens.anim.curves.emphasized } } } @@ -423,7 +423,7 @@ ColumnLayout { background: StyledRect { color: Colours.palette.m3surfaceContainerHigh - radius: Appearance.rounding.large + radius: Tokens.rounding.large Elevation { anchors.fill: parent @@ -434,8 +434,8 @@ ColumnLayout { Behavior on implicitHeight { Anim { - duration: Appearance.anim.durations.normal - easing.bezierCurve: Appearance.anim.curves.emphasized + duration: Tokens.anim.durations.normal + easing.bezierCurve: Tokens.anim.curves.emphasized } } } @@ -445,8 +445,8 @@ ColumnLayout { Behavior on implicitHeight { Anim { - duration: Appearance.anim.durations.normal - easing.bezierCurve: Appearance.anim.curves.emphasized + duration: Tokens.anim.durations.normal + easing.bezierCurve: Tokens.anim.curves.emphasized } } @@ -454,20 +454,20 @@ ColumnLayout { id: selectionContent anchors.fill: parent - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal visible: vpnDialog.currentState === "selection" opacity: vpnDialog.currentState === "selection" ? 1 : 0 Behavior on opacity { Anim { - duration: Appearance.anim.durations.small - easing.bezierCurve: Appearance.anim.curves.emphasized + duration: Tokens.anim.durations.small + easing.bezierCurve: Tokens.anim.curves.emphasized } } StyledText { text: qsTr("Add VPN Provider") - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large font.weight: 500 } @@ -476,11 +476,11 @@ ColumnLayout { text: qsTr("Choose a provider to add") wrapMode: Text.WordWrap color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } TextButton { - Layout.topMargin: Appearance.spacing.normal + Layout.topMargin: Tokens.spacing.normal Layout.fillWidth: true text: qsTr("NetBird") inactiveColour: Colours.tPalette.m3surfaceContainerHigh @@ -564,7 +564,7 @@ ColumnLayout { } TextButton { - Layout.topMargin: Appearance.spacing.normal + Layout.topMargin: Tokens.spacing.normal Layout.fillWidth: true text: qsTr("Cancel") inactiveColour: Colours.palette.m3secondaryContainer @@ -577,30 +577,30 @@ ColumnLayout { id: formContent anchors.fill: parent - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal visible: vpnDialog.currentState === "form" opacity: vpnDialog.currentState === "form" ? 1 : 0 Behavior on opacity { Anim { - duration: Appearance.anim.durations.small - easing.bezierCurve: Appearance.anim.curves.emphasized + duration: Tokens.anim.durations.small + easing.bezierCurve: Tokens.anim.curves.emphasized } } StyledText { text: vpnDialog.editIndex >= 0 ? qsTr("Edit VPN Provider") : qsTr("Add %1 VPN").arg(vpnDialog.displayName) - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large font.weight: 500 } ColumnLayout { Layout.fillWidth: true - spacing: Appearance.spacing.smaller / 2 + spacing: Tokens.spacing.smaller / 2 StyledText { text: qsTr("Display Name") - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: Colours.palette.m3onSurfaceVariant } @@ -608,7 +608,7 @@ ColumnLayout { Layout.fillWidth: true implicitHeight: 40 color: displayNameField.activeFocus ? Colours.layer(Colours.palette.m3surfaceContainer, 3) : Colours.layer(Colours.palette.m3surfaceContainer, 2) - radius: Appearance.rounding.small + radius: Tokens.rounding.small border.width: 1 border.color: displayNameField.activeFocus ? Colours.palette.m3primary : Qt.alpha(Colours.palette.m3outline, 0.3) @@ -623,7 +623,7 @@ ColumnLayout { id: displayNameField anchors.centerIn: parent - width: parent.width - Appearance.padding.normal + width: parent.width - Tokens.padding.normal horizontalAlignment: TextInput.AlignLeft text: vpnDialog.displayName onTextChanged: vpnDialog.displayName = text @@ -633,11 +633,11 @@ ColumnLayout { ColumnLayout { Layout.fillWidth: true - spacing: Appearance.spacing.smaller / 2 + spacing: Tokens.spacing.smaller / 2 StyledText { text: qsTr("Interface (e.g., wg0, torguard)") - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: Colours.palette.m3onSurfaceVariant } @@ -645,7 +645,7 @@ ColumnLayout { Layout.fillWidth: true implicitHeight: 40 color: interfaceNameField.activeFocus ? Colours.layer(Colours.palette.m3surfaceContainer, 3) : Colours.layer(Colours.palette.m3surfaceContainer, 2) - radius: Appearance.rounding.small + radius: Tokens.rounding.small border.width: 1 border.color: interfaceNameField.activeFocus ? Colours.palette.m3primary : Qt.alpha(Colours.palette.m3outline, 0.3) @@ -660,7 +660,7 @@ ColumnLayout { id: interfaceNameField anchors.centerIn: parent - width: parent.width - Appearance.padding.normal + width: parent.width - Tokens.padding.normal horizontalAlignment: TextInput.AlignLeft text: vpnDialog.interfaceName onTextChanged: vpnDialog.interfaceName = text @@ -670,12 +670,12 @@ ColumnLayout { ColumnLayout { Layout.fillWidth: true - spacing: Appearance.spacing.smaller / 2 + spacing: Tokens.spacing.smaller / 2 visible: vpnDialog.editIndex >= 0 ? (vpnDialog.connectCmd.length > 0) : (vpnDialog.providerName === "custom") StyledText { text: qsTr("Connect Command (e.g., wg-quick up wg0)") - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: Colours.palette.m3onSurfaceVariant } @@ -683,7 +683,7 @@ ColumnLayout { Layout.fillWidth: true implicitHeight: 40 color: connectCmdField.activeFocus ? Colours.layer(Colours.palette.m3surfaceContainer, 3) : Colours.layer(Colours.palette.m3surfaceContainer, 2) - radius: Appearance.rounding.small + radius: Tokens.rounding.small border.width: 1 border.color: connectCmdField.activeFocus ? Colours.palette.m3primary : Qt.alpha(Colours.palette.m3outline, 0.3) @@ -698,7 +698,7 @@ ColumnLayout { id: connectCmdField anchors.centerIn: parent - width: parent.width - Appearance.padding.normal + width: parent.width - Tokens.padding.normal horizontalAlignment: TextInput.AlignLeft text: vpnDialog.connectCmd onTextChanged: vpnDialog.connectCmd = text @@ -708,12 +708,12 @@ ColumnLayout { ColumnLayout { Layout.fillWidth: true - spacing: Appearance.spacing.smaller / 2 + spacing: Tokens.spacing.smaller / 2 visible: vpnDialog.editIndex >= 0 ? (vpnDialog.connectCmd.length > 0) : (vpnDialog.providerName === "custom") StyledText { text: qsTr("Disconnect Command (e.g., wg-quick down wg0)") - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: Colours.palette.m3onSurfaceVariant } @@ -721,7 +721,7 @@ ColumnLayout { Layout.fillWidth: true implicitHeight: 40 color: disconnectCmdField.activeFocus ? Colours.layer(Colours.palette.m3surfaceContainer, 3) : Colours.layer(Colours.palette.m3surfaceContainer, 2) - radius: Appearance.rounding.small + radius: Tokens.rounding.small border.width: 1 border.color: disconnectCmdField.activeFocus ? Colours.palette.m3primary : Qt.alpha(Colours.palette.m3outline, 0.3) @@ -736,7 +736,7 @@ ColumnLayout { id: disconnectCmdField anchors.centerIn: parent - width: parent.width - Appearance.padding.normal + width: parent.width - Tokens.padding.normal horizontalAlignment: TextInput.AlignLeft text: vpnDialog.disconnectCmd onTextChanged: vpnDialog.disconnectCmd = text @@ -745,9 +745,9 @@ ColumnLayout { } RowLayout { - Layout.topMargin: Appearance.spacing.normal + Layout.topMargin: Tokens.spacing.normal Layout.fillWidth: true - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal TextButton { Layout.fillWidth: true @@ -822,8 +822,8 @@ ColumnLayout { target: selectionContent property: "opacity" to: 0 - duration: Appearance.anim.durations.small - easing.bezierCurve: Appearance.anim.curves.emphasized + duration: Tokens.anim.durations.small + easing.bezierCurve: Tokens.anim.curves.emphasized } } @@ -838,8 +838,8 @@ ColumnLayout { target: formContent property: "opacity" to: 1 - duration: Appearance.anim.durations.small - easing.bezierCurve: Appearance.anim.curves.emphasized + duration: Tokens.anim.durations.small + easing.bezierCurve: Tokens.anim.curves.emphasized } } } diff --git a/modules/controlcenter/network/VpnSettings.qml b/modules/controlcenter/network/VpnSettings.qml index 80732fde..d8dd09d1 100644 --- a/modules/controlcenter/network/VpnSettings.qml +++ b/modules/controlcenter/network/VpnSettings.qml @@ -11,14 +11,14 @@ import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import qs.config +import Caelestia.Config ColumnLayout { id: root required property Session session - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal SettingsHeader { icon: "vpn_key" @@ -26,7 +26,7 @@ ColumnLayout { } SectionHeader { - Layout.topMargin: Appearance.spacing.large + Layout.topMargin: Tokens.spacing.large title: qsTr("General") description: qsTr("VPN configuration") } @@ -43,20 +43,20 @@ ColumnLayout { } SectionHeader { - Layout.topMargin: Appearance.spacing.large + Layout.topMargin: Tokens.spacing.large title: qsTr("Providers") description: qsTr("Manage VPN providers") } SectionContainer { - contentSpacing: Appearance.spacing.normal + contentSpacing: Tokens.spacing.normal ListView { Layout.fillWidth: true Layout.preferredHeight: contentHeight interactive: false - spacing: Appearance.spacing.smaller + spacing: Tokens.spacing.smaller model: ScriptModel { values: Config.utilities.vpn.provider.map((provider, index) => { @@ -84,18 +84,18 @@ ColumnLayout { width: ListView.view ? ListView.view.width : undefined implicitHeight: 60 color: Colours.tPalette.m3surfaceContainerHigh - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal RowLayout { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.normal - spacing: Appearance.spacing.normal + anchors.margins: Tokens.padding.normal + spacing: Tokens.spacing.normal MaterialIcon { text: modelData.isActive ? "vpn_key" : "vpn_key_off" - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large color: modelData.isActive ? Colours.palette.m3primary : Colours.palette.m3outline } @@ -110,7 +110,7 @@ ColumnLayout { StyledText { text: qsTr("%1 • %2").arg(modelData.name).arg(modelData.interface || qsTr("No interface")) - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: Colours.palette.m3outline } } @@ -186,7 +186,7 @@ ColumnLayout { TextButton { Layout.fillWidth: true - Layout.topMargin: Appearance.spacing.normal + Layout.topMargin: Tokens.spacing.normal text: qsTr("+ Add Provider") inactiveColour: Colours.palette.m3primaryContainer inactiveOnColour: Colours.palette.m3onPrimaryContainer @@ -198,13 +198,13 @@ ColumnLayout { } SectionHeader { - Layout.topMargin: Appearance.spacing.large + Layout.topMargin: Tokens.spacing.large title: qsTr("Quick Add") description: qsTr("Add common VPN providers") } SectionContainer { - contentSpacing: Appearance.spacing.smaller + contentSpacing: Tokens.spacing.smaller TextButton { Layout.fillWidth: true diff --git a/modules/controlcenter/network/WirelessDetails.qml b/modules/controlcenter/network/WirelessDetails.qml index 913e5d75..b6d7e77e 100644 --- a/modules/controlcenter/network/WirelessDetails.qml +++ b/modules/controlcenter/network/WirelessDetails.qml @@ -10,7 +10,7 @@ import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import qs.config +import Caelestia.Config import qs.utils DeviceDetails { @@ -64,7 +64,7 @@ DeviceDetails { sections: [ Component { ColumnLayout { - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal SectionHeader { title: qsTr("Connection status") @@ -86,8 +86,8 @@ DeviceDetails { TextButton { Layout.fillWidth: true - Layout.topMargin: Appearance.spacing.normal - Layout.minimumHeight: Appearance.font.size.normal + Appearance.padding.normal * 2 + Layout.topMargin: Tokens.spacing.normal + Layout.minimumHeight: Tokens.font.size.normal + Tokens.padding.normal * 2 visible: { if (!root.network || !root.network.ssid) { return false; @@ -112,7 +112,7 @@ DeviceDetails { }, Component { ColumnLayout { - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal SectionHeader { title: qsTr("Network properties") @@ -120,7 +120,7 @@ DeviceDetails { } SectionContainer { - contentSpacing: Appearance.spacing.small / 2 + contentSpacing: Tokens.spacing.small / 2 PropertyRow { label: qsTr("SSID") @@ -155,7 +155,7 @@ DeviceDetails { }, Component { ColumnLayout { - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal SectionHeader { title: qsTr("Connection information") diff --git a/modules/controlcenter/network/WirelessList.qml b/modules/controlcenter/network/WirelessList.qml index bff142d3..878986d1 100644 --- a/modules/controlcenter/network/WirelessList.qml +++ b/modules/controlcenter/network/WirelessList.qml @@ -11,7 +11,7 @@ import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import qs.config +import Caelestia.Config import qs.utils DeviceList { @@ -34,7 +34,7 @@ DeviceList { visible: Nmcli.scanning text: qsTr("Scanning...") color: Colours.palette.m3primary - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } } @@ -48,11 +48,11 @@ DeviceList { headerComponent: Component { RowLayout { - spacing: Appearance.spacing.smaller + spacing: Tokens.spacing.smaller StyledText { text: qsTr("Settings") - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large font.weight: 500 } @@ -64,9 +64,9 @@ DeviceList { toggled: Nmcli.wifiEnabled icon: "wifi" accent: "Tertiary" - iconSize: Appearance.font.size.normal - horizontalPadding: Appearance.padding.normal - verticalPadding: Appearance.padding.smaller + iconSize: Tokens.font.size.normal + horizontalPadding: Tokens.padding.normal + verticalPadding: Tokens.padding.smaller onClicked: { Nmcli.toggleWifi(null); @@ -77,9 +77,9 @@ DeviceList { toggled: Nmcli.scanning icon: "wifi_find" accent: "Secondary" - iconSize: Appearance.font.size.normal - horizontalPadding: Appearance.padding.normal - verticalPadding: Appearance.padding.smaller + iconSize: Tokens.font.size.normal + horizontalPadding: Tokens.padding.normal + verticalPadding: Tokens.padding.smaller onClicked: { Nmcli.rescanWifi(); @@ -90,9 +90,9 @@ DeviceList { toggled: !root.session.network.active icon: "settings" accent: "Primary" - iconSize: Appearance.font.size.normal - horizontalPadding: Appearance.padding.normal - verticalPadding: Appearance.padding.smaller + iconSize: Tokens.font.size.normal + horizontalPadding: Tokens.padding.normal + verticalPadding: Tokens.padding.smaller onClicked: { if (root.session.network.active) @@ -110,10 +110,10 @@ DeviceList { required property var modelData width: ListView.view ? ListView.view.width : undefined - implicitHeight: rowLayout.implicitHeight + Appearance.padding.normal * 2 + implicitHeight: rowLayout.implicitHeight + Tokens.padding.normal * 2 color: Qt.alpha(Colours.tPalette.m3surfaceContainer, root.activeItem === modelData ? Colours.tPalette.m3surfaceContainer.a : 0) - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal StateLayer { function onClicked(): void { @@ -130,15 +130,15 @@ DeviceList { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal StyledRect { implicitWidth: implicitHeight - implicitHeight: icon.implicitHeight + Appearance.padding.normal * 2 + implicitHeight: icon.implicitHeight + Tokens.padding.normal * 2 - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: modelData.active ? Colours.palette.m3primaryContainer : Colours.tPalette.m3surfaceContainerHigh MaterialIcon { @@ -146,7 +146,7 @@ DeviceList { anchors.centerIn: parent text: Icons.getNetworkIcon(modelData.strength, modelData.isSecure) - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large fill: modelData.active ? 1 : 0 color: modelData.active ? Colours.palette.m3onPrimaryContainer : Colours.palette.m3onSurface } @@ -167,7 +167,7 @@ DeviceList { RowLayout { Layout.fillWidth: true - spacing: Appearance.spacing.smaller + spacing: Tokens.spacing.smaller StyledText { Layout.fillWidth: true @@ -182,7 +182,7 @@ DeviceList { return qsTr("Open"); } color: modelData.active ? Colours.palette.m3primary : Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small font.weight: modelData.active ? 500 : 400 elide: Text.ElideRight } @@ -191,9 +191,9 @@ DeviceList { StyledRect { implicitWidth: implicitHeight - implicitHeight: connectIcon.implicitHeight + Appearance.padding.smaller * 2 + implicitHeight: connectIcon.implicitHeight + Tokens.padding.smaller * 2 - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: Qt.alpha(Colours.palette.m3primaryContainer, modelData.active ? 1 : 0) StateLayer { diff --git a/modules/controlcenter/network/WirelessPane.qml b/modules/controlcenter/network/WirelessPane.qml index cccf8222..02af096d 100644 --- a/modules/controlcenter/network/WirelessPane.qml +++ b/modules/controlcenter/network/WirelessPane.qml @@ -6,7 +6,7 @@ import QtQuick import Quickshell.Widgets import qs.components import qs.components.containers -import qs.config +import Caelestia.Config SplitPaneWithDetails { id: root diff --git a/modules/controlcenter/network/WirelessPasswordDialog.qml b/modules/controlcenter/network/WirelessPasswordDialog.qml index 8700f1c4..14fb565a 100644 --- a/modules/controlcenter/network/WirelessPasswordDialog.qml +++ b/modules/controlcenter/network/WirelessPasswordDialog.qml @@ -10,7 +10,7 @@ import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import qs.config +import Caelestia.Config import qs.utils Item { @@ -99,9 +99,9 @@ Item { anchors.centerIn: parent implicitWidth: 400 - implicitHeight: content.implicitHeight + Appearance.padding.large * 2 + implicitHeight: content.implicitHeight + Tokens.padding.large * 2 - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: Colours.tPalette.m3surface opacity: root.session.network.showPasswordDialog && !root.isClosing ? 1 : 0 scale: root.session.network.showPasswordDialog && !root.isClosing ? 1 : 0.7 @@ -142,20 +142,20 @@ Item { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.large + anchors.margins: Tokens.padding.large - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal MaterialIcon { Layout.alignment: Qt.AlignHCenter text: "lock" - font.pointSize: Appearance.font.size.extraLarge * 2 + font.pointSize: Tokens.font.size.extraLarge * 2 } StyledText { Layout.alignment: Qt.AlignHCenter text: qsTr("Enter password") - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large font.weight: 500 } @@ -163,14 +163,14 @@ Item { Layout.alignment: Qt.AlignHCenter text: root.network ? qsTr("Network: %1").arg(root.network.ssid) : "" color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } StyledText { id: statusText Layout.alignment: Qt.AlignHCenter - Layout.topMargin: Appearance.spacing.small + Layout.topMargin: Tokens.spacing.small visible: connectButton.connecting || connectButton.hasError text: { if (connectButton.hasError) { @@ -182,10 +182,10 @@ Item { return ""; } color: connectButton.hasError ? Colours.palette.m3error : Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small font.weight: 400 wrapMode: Text.WordWrap - Layout.maximumWidth: parent.width - Appearance.padding.large * 2 + Layout.maximumWidth: parent.width - Tokens.padding.large * 2 } Item { @@ -193,9 +193,9 @@ Item { property string passwordBuffer: "" - Layout.topMargin: Appearance.spacing.large + Layout.topMargin: Tokens.spacing.large Layout.fillWidth: true - implicitHeight: Math.max(48, charList.implicitHeight + Appearance.padding.normal * 2) + implicitHeight: Math.max(48, charList.implicitHeight + Tokens.padding.normal * 2) focus: true Keys.onPressed: event => { if (!activeFocus) { @@ -261,7 +261,7 @@ Item { StyledRect { anchors.fill: parent - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: passwordContainer.activeFocus ? Qt.lighter(Colours.tPalette.m3surfaceContainer, 1.05) : Colours.tPalette.m3surfaceContainer border.width: passwordContainer.activeFocus || connectButton.hasError ? 4 : (root.visible ? 1 : 0) border.color: { @@ -302,8 +302,8 @@ Item { anchors.centerIn: parent text: qsTr("Password") color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.normal - font.family: Appearance.font.family.mono + font.pointSize: Tokens.font.size.normal + font.family: Tokens.font.family.mono opacity: passwordContainer.passwordBuffer ? 0 : 1 Behavior on opacity { @@ -318,10 +318,10 @@ Item { anchors.centerIn: parent implicitWidth: fullWidth - implicitHeight: Appearance.font.size.normal + implicitHeight: Tokens.font.size.normal orientation: Qt.Horizontal - spacing: Appearance.spacing.small / 2 + spacing: Tokens.spacing.small / 2 interactive: false model: ScriptModel { @@ -335,7 +335,7 @@ Item { implicitHeight: charList.implicitHeight color: Colours.palette.m3onSurface - radius: Appearance.rounding.small / 2 + radius: Tokens.rounding.small / 2 opacity: 0 scale: 0 @@ -378,8 +378,8 @@ Item { Behavior on scale { Anim { - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } } } @@ -391,15 +391,15 @@ Item { } RowLayout { - Layout.topMargin: Appearance.spacing.normal + Layout.topMargin: Tokens.spacing.normal Layout.fillWidth: true - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal TextButton { id: cancelButton Layout.fillWidth: true - Layout.minimumHeight: Appearance.font.size.normal + Appearance.padding.normal * 2 + Layout.minimumHeight: Tokens.font.size.normal + Tokens.padding.normal * 2 inactiveColour: Colours.palette.m3secondaryContainer inactiveOnColour: Colours.palette.m3onSecondaryContainer text: qsTr("Cancel") @@ -414,7 +414,7 @@ Item { property bool hasError: false Layout.fillWidth: true - Layout.minimumHeight: Appearance.font.size.normal + Appearance.padding.normal * 2 + Layout.minimumHeight: Tokens.font.size.normal + Tokens.padding.normal * 2 inactiveColour: Colours.palette.m3primary inactiveOnColour: Colours.palette.m3onPrimary text: qsTr("Connect") diff --git a/modules/controlcenter/network/WirelessSettings.qml b/modules/controlcenter/network/WirelessSettings.qml index 7b929bf9..bce381ba 100644 --- a/modules/controlcenter/network/WirelessSettings.qml +++ b/modules/controlcenter/network/WirelessSettings.qml @@ -8,14 +8,14 @@ import qs.components import qs.components.controls import qs.components.effects import qs.services -import qs.config +import Caelestia.Config ColumnLayout { id: root required property Session session - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal SettingsHeader { icon: "wifi" @@ -23,7 +23,7 @@ ColumnLayout { } SectionHeader { - Layout.topMargin: Appearance.spacing.large + Layout.topMargin: Tokens.spacing.large title: qsTr("WiFi status") description: qsTr("General WiFi settings") } @@ -39,13 +39,13 @@ ColumnLayout { } SectionHeader { - Layout.topMargin: Appearance.spacing.large + Layout.topMargin: Tokens.spacing.large title: qsTr("Network information") description: qsTr("Current network connection") } SectionContainer { - contentSpacing: Appearance.spacing.small / 2 + contentSpacing: Tokens.spacing.small / 2 PropertyRow { label: qsTr("Connected network") diff --git a/modules/controlcenter/notifications/NotificationsPane.qml b/modules/controlcenter/notifications/NotificationsPane.qml index 8d58e9e8..5768e478 100644 --- a/modules/controlcenter/notifications/NotificationsPane.qml +++ b/modules/controlcenter/notifications/NotificationsPane.qml @@ -11,7 +11,7 @@ import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import qs.config +import Caelestia.Config Item { id: root @@ -66,9 +66,9 @@ Item { id: notificationsClippingRect anchors.fill: parent - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal anchors.leftMargin: 0 - anchors.rightMargin: Appearance.padding.normal + anchors.rightMargin: Tokens.padding.normal color: "transparent" radius: notificationsBorder.innerRadius @@ -77,9 +77,9 @@ Item { id: notificationsLoader anchors.fill: parent - anchors.margins: Appearance.padding.large + Appearance.padding.normal - anchors.leftMargin: Appearance.padding.large - anchors.rightMargin: Appearance.padding.large + anchors.margins: Tokens.padding.large + Tokens.padding.normal + anchors.leftMargin: Tokens.padding.large + anchors.rightMargin: Tokens.padding.large sourceComponent: notificationsContentComponent } @@ -89,7 +89,7 @@ Item { id: notificationsBorder leftThickness: 0 - rightThickness: Appearance.padding.normal + rightThickness: Tokens.padding.normal } Component { @@ -111,13 +111,13 @@ Item { anchors.left: parent.left anchors.right: parent.right anchors.top: parent.top - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal ColumnLayout { Layout.fillWidth: true Layout.maximumWidth: 500 Layout.alignment: Qt.AlignTop - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal SectionContainer { Layout.fillWidth: true @@ -125,7 +125,7 @@ Item { StyledText { text: qsTr("Notifications") - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } SplitButtonRow { @@ -220,7 +220,7 @@ Item { ColumnLayout { Layout.fillWidth: true Layout.alignment: Qt.AlignTop - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal SectionContainer { Layout.fillWidth: true @@ -228,7 +228,7 @@ Item { StyledText { text: qsTr("Toast settings") - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } SplitButtonRow { @@ -316,8 +316,8 @@ Item { GridLayout { Layout.fillWidth: true columns: 2 - columnSpacing: Appearance.spacing.normal - rowSpacing: Appearance.spacing.normal + columnSpacing: Tokens.spacing.normal + rowSpacing: Tokens.spacing.normal SwitchRow { Layout.fillWidth: true diff --git a/modules/controlcenter/taskbar/TaskbarPane.qml b/modules/controlcenter/taskbar/TaskbarPane.qml index d61e932d..7ec57775 100644 --- a/modules/controlcenter/taskbar/TaskbarPane.qml +++ b/modules/controlcenter/taskbar/TaskbarPane.qml @@ -11,7 +11,7 @@ import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import qs.config +import Caelestia.Config import qs.utils Item { @@ -126,9 +126,9 @@ Item { id: taskbarClippingRect anchors.fill: parent - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal anchors.leftMargin: 0 - anchors.rightMargin: Appearance.padding.normal + anchors.rightMargin: Tokens.padding.normal radius: taskbarBorder.innerRadius color: "transparent" @@ -137,9 +137,9 @@ Item { id: taskbarLoader anchors.fill: parent - anchors.margins: Appearance.padding.large + Appearance.padding.normal - anchors.leftMargin: Appearance.padding.large - anchors.rightMargin: Appearance.padding.large + anchors.margins: Tokens.padding.large + Tokens.padding.normal + anchors.leftMargin: Tokens.padding.large + anchors.rightMargin: Tokens.padding.large asynchronous: true sourceComponent: taskbarContentComponent @@ -150,7 +150,7 @@ Item { id: taskbarBorder leftThickness: 0 - rightThickness: Appearance.padding.normal + rightThickness: Tokens.padding.normal } Component { @@ -173,14 +173,14 @@ Item { anchors.right: parent.right anchors.top: parent.top - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal RowLayout { - spacing: Appearance.spacing.smaller + spacing: Tokens.spacing.smaller StyledText { text: qsTr("Taskbar") - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large font.weight: 500 } } @@ -191,7 +191,7 @@ Item { StyledText { text: qsTr("Status Icons") - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } ConnectedButtonGroup { @@ -270,14 +270,14 @@ Item { id: mainRowLayout Layout.fillWidth: true - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal ColumnLayout { id: leftColumnLayout Layout.fillWidth: true Layout.alignment: Qt.AlignTop - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal SectionContainer { Layout.fillWidth: true @@ -285,13 +285,13 @@ Item { StyledText { text: qsTr("Workspaces") - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } StyledRect { Layout.fillWidth: true - implicitHeight: workspacesShownRow.implicitHeight + Appearance.padding.large * 2 - radius: Appearance.rounding.normal + implicitHeight: workspacesShownRow.implicitHeight + Tokens.padding.large * 2 + radius: Tokens.rounding.normal color: Colours.layer(Colours.palette.m3surfaceContainer, 2) Behavior on implicitHeight { @@ -304,8 +304,8 @@ Item { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.large - spacing: Appearance.spacing.normal + anchors.margins: Tokens.padding.large + spacing: Tokens.spacing.normal StyledText { Layout.fillWidth: true @@ -326,8 +326,8 @@ Item { StyledRect { Layout.fillWidth: true - implicitHeight: workspacesActiveIndicatorRow.implicitHeight + Appearance.padding.large * 2 - radius: Appearance.rounding.normal + implicitHeight: workspacesActiveIndicatorRow.implicitHeight + Tokens.padding.large * 2 + radius: Tokens.rounding.normal color: Colours.layer(Colours.palette.m3surfaceContainer, 2) Behavior on implicitHeight { @@ -340,8 +340,8 @@ Item { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.large - spacing: Appearance.spacing.normal + anchors.margins: Tokens.padding.large + spacing: Tokens.spacing.normal StyledText { Layout.fillWidth: true @@ -360,8 +360,8 @@ Item { StyledRect { Layout.fillWidth: true - implicitHeight: workspacesOccupiedBgRow.implicitHeight + Appearance.padding.large * 2 - radius: Appearance.rounding.normal + implicitHeight: workspacesOccupiedBgRow.implicitHeight + Tokens.padding.large * 2 + radius: Tokens.rounding.normal color: Colours.layer(Colours.palette.m3surfaceContainer, 2) Behavior on implicitHeight { @@ -374,8 +374,8 @@ Item { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.large - spacing: Appearance.spacing.normal + anchors.margins: Tokens.padding.large + spacing: Tokens.spacing.normal StyledText { Layout.fillWidth: true @@ -394,8 +394,8 @@ Item { StyledRect { Layout.fillWidth: true - implicitHeight: workspacesShowWindowsRow.implicitHeight + Appearance.padding.large * 2 - radius: Appearance.rounding.normal + implicitHeight: workspacesShowWindowsRow.implicitHeight + Tokens.padding.large * 2 + radius: Tokens.rounding.normal color: Colours.layer(Colours.palette.m3surfaceContainer, 2) Behavior on implicitHeight { @@ -408,8 +408,8 @@ Item { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.large - spacing: Appearance.spacing.normal + anchors.margins: Tokens.padding.large + spacing: Tokens.spacing.normal StyledText { Layout.fillWidth: true @@ -428,8 +428,8 @@ Item { StyledRect { Layout.fillWidth: true - implicitHeight: workspacesMaxWindowIconsRow.implicitHeight + Appearance.padding.large * 2 - radius: Appearance.rounding.normal + implicitHeight: workspacesMaxWindowIconsRow.implicitHeight + Tokens.padding.large * 2 + radius: Tokens.rounding.normal color: Colours.layer(Colours.palette.m3surfaceContainer, 2) Behavior on implicitHeight { @@ -442,8 +442,8 @@ Item { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.large - spacing: Appearance.spacing.normal + anchors.margins: Tokens.padding.large + spacing: Tokens.spacing.normal StyledText { Layout.fillWidth: true @@ -464,8 +464,8 @@ Item { StyledRect { Layout.fillWidth: true - implicitHeight: workspacesPerMonitorRow.implicitHeight + Appearance.padding.large * 2 - radius: Appearance.rounding.normal + implicitHeight: workspacesPerMonitorRow.implicitHeight + Tokens.padding.large * 2 + radius: Tokens.rounding.normal color: Colours.layer(Colours.palette.m3surfaceContainer, 2) Behavior on implicitHeight { @@ -478,8 +478,8 @@ Item { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.large - spacing: Appearance.spacing.normal + anchors.margins: Tokens.padding.large + spacing: Tokens.spacing.normal StyledText { Layout.fillWidth: true @@ -503,7 +503,7 @@ Item { StyledText { text: qsTr("Scroll Actions") - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } ConnectedButtonGroup { @@ -544,7 +544,7 @@ Item { Layout.fillWidth: true Layout.alignment: Qt.AlignTop - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal SectionContainer { Layout.fillWidth: true @@ -552,7 +552,7 @@ Item { StyledText { text: qsTr("Clock") - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } SwitchRow { @@ -589,7 +589,7 @@ Item { StyledText { text: qsTr("Bar Behavior") - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } SwitchRow { @@ -611,7 +611,7 @@ Item { } SectionContainer { - contentSpacing: Appearance.spacing.normal + contentSpacing: Tokens.spacing.normal SliderInput { Layout.fillWidth: true @@ -642,7 +642,7 @@ Item { StyledText { text: qsTr("Active window") - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } SwitchRow { @@ -670,7 +670,7 @@ Item { Layout.fillWidth: true Layout.alignment: Qt.AlignTop - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal SectionContainer { Layout.fillWidth: true @@ -678,7 +678,7 @@ Item { StyledText { text: qsTr("Popouts") - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } SwitchRow { @@ -715,7 +715,7 @@ Item { StyledText { text: qsTr("Tray Settings") - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } ConnectedButtonGroup { @@ -756,7 +756,7 @@ Item { StyledText { text: qsTr("Monitors") - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } ConnectedButtonGroup { diff --git a/modules/dashboard/Content.qml b/modules/dashboard/Content.qml index 957389f8..a07aca41 100644 --- a/modules/dashboard/Content.qml +++ b/modules/dashboard/Content.qml @@ -6,7 +6,7 @@ import Quickshell import Quickshell.Widgets import qs.components import qs.components.filedialog -import qs.config +import Caelestia.Config Item { id: root @@ -66,8 +66,8 @@ Item { anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right - anchors.topMargin: Appearance.padding.normal - anchors.margins: Appearance.padding.large + anchors.topMargin: Tokens.padding.normal + anchors.margins: Tokens.padding.large nonAnimWidth: root.nonAnimWidth - anchors.margins * 2 dashState: root.dashState @@ -81,9 +81,9 @@ Item { anchors.left: parent.left anchors.right: parent.right anchors.bottom: parent.bottom - anchors.margins: Appearance.padding.large + anchors.margins: Tokens.padding.large - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: "transparent" Flickable { @@ -199,15 +199,15 @@ Item { Behavior on implicitWidth { Anim { - duration: Appearance.anim.durations.large - easing.bezierCurve: Appearance.anim.curves.emphasized + duration: Tokens.anim.durations.large + easing.bezierCurve: Tokens.anim.curves.emphasized } } Behavior on implicitHeight { Anim { - duration: Appearance.anim.durations.large - easing.bezierCurve: Appearance.anim.curves.emphasized + duration: Tokens.anim.durations.large + easing.bezierCurve: Tokens.anim.curves.emphasized } } } diff --git a/modules/dashboard/Dash.qml b/modules/dashboard/Dash.qml index 59620d88..3de9fb6b 100644 --- a/modules/dashboard/Dash.qml +++ b/modules/dashboard/Dash.qml @@ -3,7 +3,7 @@ import QtQuick.Layouts import qs.components import qs.components.filedialog import qs.services -import qs.config +import Caelestia.Config GridLayout { id: root @@ -12,8 +12,8 @@ GridLayout { required property DashboardState dashState required property FileDialog facePicker - rowSpacing: Appearance.spacing.normal - columnSpacing: Appearance.spacing.normal + rowSpacing: Tokens.spacing.normal + columnSpacing: Tokens.spacing.normal Rect { Layout.column: 2 @@ -21,7 +21,7 @@ GridLayout { Layout.preferredWidth: user.implicitWidth Layout.preferredHeight: user.implicitHeight - radius: Appearance.rounding.large + radius: Tokens.rounding.large User { id: user @@ -37,7 +37,7 @@ GridLayout { Layout.preferredWidth: Config.dashboard.sizes.weatherWidth Layout.fillHeight: true - radius: Appearance.rounding.large * 1.5 + radius: Tokens.rounding.large * 1.5 SmallWeather {} } @@ -47,7 +47,7 @@ GridLayout { Layout.preferredWidth: dateTime.implicitWidth Layout.fillHeight: true - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal DateTime { id: dateTime @@ -61,7 +61,7 @@ GridLayout { Layout.fillWidth: true Layout.preferredHeight: calendar.implicitHeight - radius: Appearance.rounding.large + radius: Tokens.rounding.large Calendar { id: calendar @@ -76,7 +76,7 @@ GridLayout { Layout.preferredWidth: resources.implicitWidth Layout.fillHeight: true - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal Resources { id: resources @@ -90,7 +90,7 @@ GridLayout { Layout.preferredWidth: media.implicitWidth Layout.fillHeight: true - radius: Appearance.rounding.large * 2 + radius: Tokens.rounding.large * 2 Media { id: media diff --git a/modules/dashboard/LyricMenu.qml b/modules/dashboard/LyricMenu.qml index 54b43eec..b311ff7c 100644 --- a/modules/dashboard/LyricMenu.qml +++ b/modules/dashboard/LyricMenu.qml @@ -5,7 +5,7 @@ import QtQuick.Layouts import qs.components import qs.components.controls import qs.services -import qs.config +import Caelestia.Config StyledRect { id: root @@ -19,7 +19,7 @@ StyledRect { implicitHeight: contentHeight - radius: Appearance.rounding.large + radius: Tokens.rounding.large color: Colours.tPalette.m3surfaceContainer Loader { @@ -29,31 +29,31 @@ StyledRect { sourceComponent: ColumnLayout { anchors.fill: parent - anchors.margins: Appearance.padding.large - spacing: Appearance.spacing.normal + anchors.margins: Tokens.padding.large + spacing: Tokens.spacing.normal // Header: icon, backend selector, refresh, toggle RowLayout { Layout.fillWidth: true - spacing: Appearance.padding.small + spacing: Tokens.padding.small MaterialIcon { text: "lyrics" fill: 1 color: Colours.palette.m3primary - font.pointSize: Appearance.spacing.large + font.pointSize: Tokens.spacing.large } Rectangle { Layout.preferredHeight: 24 Layout.preferredWidth: 80 - radius: Appearance.rounding.small + radius: Tokens.rounding.small color: Qt.rgba(Colours.palette.m3primary.r, Colours.palette.m3primary.g, Colours.palette.m3primary.b, 0.15) StyledText { anchors.centerIn: parent text: LyricsService.preferredBackend - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: Colours.palette.m3primary } @@ -73,14 +73,14 @@ StyledRect { Rectangle { Layout.preferredHeight: 24 Layout.preferredWidth: 60 - radius: Appearance.rounding.small + radius: Tokens.rounding.small visible: LyricsService.preferredBackend === "Auto" color: LyricsService.backend === "Local" ? Qt.rgba(Colours.palette.m3tertiary.r, Colours.palette.m3tertiary.g, Colours.palette.m3tertiary.b, 0.15) : Qt.rgba(Colours.palette.m3secondary.r, Colours.palette.m3secondary.g, Colours.palette.m3secondary.b, 0.15) StyledText { anchors.centerIn: parent text: LyricsService.backend - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: LyricsService.backend === "Local" ? Colours.palette.m3tertiary : Colours.palette.m3secondary } } @@ -105,7 +105,7 @@ StyledRect { Layout.fillWidth: true text: LyricsService.preferredBackend === "Local" ? "Loaded File:" : "Fetched Candidates:" color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small elide: Text.ElideRight visible: LyricsService.preferredBackend === "Local" ? LyricsService.loadedLocalFile.length > 0 : LyricsService.candidatesModel.count > 0 } @@ -115,12 +115,12 @@ StyledRect { Layout.fillWidth: true Layout.preferredHeight: 48 visible: LyricsService.preferredBackend === "Local" && LyricsService.loadedLocalFile.length > 0 - radius: Appearance.rounding.small + radius: Tokens.rounding.small color: Qt.rgba(Colours.palette.m3tertiary.r, Colours.palette.m3tertiary.g, Colours.palette.m3tertiary.b, 0.1) ColumnLayout { anchors.fill: parent - anchors.margins: Appearance.padding.small + anchors.margins: Tokens.padding.small spacing: 0 StyledText { @@ -130,7 +130,7 @@ StyledRect { const parts = path.split('/'); return parts[parts.length - 1]; } - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: Colours.palette.m3tertiary elide: Text.ElideMiddle } @@ -145,7 +145,7 @@ StyledRect { } return ""; } - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: Colours.palette.m3outline elide: Text.ElideMiddle } @@ -164,7 +164,7 @@ StyledRect { model: LyricsService.candidatesModel clip: true - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small visible: LyricsService.candidatesModel.count > 0 opacity: visible ? 1 : 0 @@ -186,7 +186,7 @@ StyledRect { Behavior on scale { NumberAnimation { - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small easing.type: Easing.OutCubic } } @@ -195,7 +195,7 @@ StyledRect { id: background anchors.fill: parent - radius: Appearance.rounding.small + radius: Tokens.rounding.small color: delegateRoot.pressed ? Qt.rgba(Colours.palette.m3primary.r, Colours.palette.m3primary.g, Colours.palette.m3primary.b, 0.25) : delegateRoot.hovered ? Qt.rgba(Colours.palette.m3primary.r, Colours.palette.m3primary.g, Colours.palette.m3primary.b, 0.06) : Qt.rgba(Colours.palette.m3primary.r, Colours.palette.m3primary.g, Colours.palette.m3primary.b, 0.03) @@ -204,12 +204,12 @@ StyledRect { Behavior on color { ColorAnimation { - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small } } Behavior on border.width { NumberAnimation { - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small } } } @@ -228,8 +228,8 @@ StyledRect { Row { anchors.fill: parent - anchors.margins: Appearance.padding.normal - spacing: Appearance.spacing.small + anchors.margins: Tokens.padding.normal + spacing: Tokens.spacing.small // Active indicator bar Rectangle { @@ -241,7 +241,7 @@ StyledRect { Behavior on color { ColorAnimation { - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small } } } @@ -253,7 +253,7 @@ StyledRect { Text { text: delegateRoot.title - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal font.bold: true color: delegateRoot.hovered ? Colours.palette.m3primary : Colours.palette.m3onSurface width: parent.width @@ -261,14 +261,14 @@ StyledRect { Behavior on color { ColorAnimation { - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small } } } Text { text: delegateRoot.artist - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: Colours.palette.m3onSurfaceVariant elide: Text.ElideRight } @@ -286,19 +286,19 @@ StyledRect { // Manual search ColumnLayout { Layout.fillWidth: true - spacing: Appearance.padding.small + spacing: Tokens.padding.small StyledText { Layout.fillWidth: true text: "Manual Search" - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: Colours.palette.m3onSurfaceVariant elide: Text.ElideRight } RowLayout { Layout.fillWidth: true - spacing: Appearance.padding.small + spacing: Tokens.padding.small StyledInputField { id: searchTitle @@ -336,18 +336,18 @@ StyledRect { // Offset controls RowLayout { Layout.fillWidth: true - spacing: Appearance.padding.small + spacing: Tokens.padding.small MaterialIcon { text: "contrast_square" - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large color: Colours.palette.m3secondary } StyledText { text: "Offset" color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } Item { @@ -368,7 +368,7 @@ StyledRect { horizontalAlignment: TextInput.AlignHCenter color: Colours.palette.m3secondary - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal selectByMouse: true text: (LyricsService.offset >= 0 ? "+" : "") + LyricsService.offset.toFixed(1) + "s" onEditingFinished: { diff --git a/modules/dashboard/LyricsView.qml b/modules/dashboard/LyricsView.qml index 285e92f8..b0ef99a3 100644 --- a/modules/dashboard/LyricsView.qml +++ b/modules/dashboard/LyricsView.qml @@ -4,7 +4,7 @@ import Quickshell import qs.components import qs.components.containers import qs.services -import qs.config +import Caelestia.Config StyledListView { id: root @@ -19,7 +19,7 @@ StyledListView { preferredHighlightEnd: height / 2 + 30 highlightRangeMode: ListView.ApplyRange highlightFollowsCurrentItem: true - highlightMoveDuration: LyricsService.isManualSeeking ? 0 : Appearance.anim.durations.normal + highlightMoveDuration: LyricsService.isManualSeeking ? 0 : Tokens.anim.durations.normal layer.enabled: true layer.effect: ShaderEffect { required property Item source @@ -46,7 +46,7 @@ StyledListView { property bool isCurrent: ListView.isCurrentItem width: ListView.view.width - height: hasContent ? (lyricText.contentHeight + Appearance.spacing.large) : 0 + height: hasContent ? (lyricText.contentHeight + Tokens.spacing.large) : 0 MultiEffect { id: effect @@ -84,19 +84,19 @@ StyledListView { anchors.centerIn: parent horizontalAlignment: Text.AlignHCenter wrapMode: Text.WordWrap - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal color: delegateRoot.isCurrent ? Colours.palette.m3primary : Colours.palette.m3onSurfaceVariant font.bold: delegateRoot.isCurrent scale: delegateRoot.isCurrent ? 1.15 : 1.0 Behavior on color { CAnim { - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small } } Behavior on scale { Anim { - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small } } } diff --git a/modules/dashboard/Media.qml b/modules/dashboard/Media.qml index 4c838a5f..d8ed44b3 100644 --- a/modules/dashboard/Media.qml +++ b/modules/dashboard/Media.qml @@ -9,7 +9,7 @@ import Caelestia.Services import qs.components import qs.components.controls import qs.services -import qs.config +import Caelestia.Config import qs.utils Item { @@ -18,7 +18,7 @@ Item { required property DrawerVisibilities visibilities readonly property bool needsKeyboard: lyricMenuOpen - readonly property real nonAnimHeight: Math.max(cover.implicitHeight + Config.dashboard.sizes.mediaVisualiserSize * 2, lyricMenuOpen ? lyricMenu.implicitHeight : details.implicitHeight, bongocat.implicitHeight) + Appearance.padding.large * 2 + readonly property real nonAnimHeight: Math.max(cover.implicitHeight + Config.dashboard.sizes.mediaVisualiserSize * 2, lyricMenuOpen ? lyricMenu.implicitHeight : details.implicitHeight, bongocat.implicitHeight) + Tokens.padding.large * 2 readonly property real detailsHeightWithoutLyrics: details.implicitHeight - lyricsViewInDetails.implicitHeight property bool lyricMenuOpen: false @@ -52,7 +52,7 @@ Item { } } - implicitWidth: cover.implicitWidth + Config.dashboard.sizes.mediaVisualiserSize * 2 + details.implicitWidth + details.anchors.leftMargin + bongocat.implicitWidth + bongocat.anchors.leftMargin * 2 + Appearance.padding.large * 2 + implicitWidth: cover.implicitWidth + Config.dashboard.sizes.mediaVisualiserSize * 2 + details.implicitWidth + details.anchors.leftMargin + bongocat.implicitWidth + bongocat.anchors.leftMargin * 2 + Tokens.padding.large * 2 implicitHeight: nonAnimHeight Behavior on implicitHeight { @@ -61,7 +61,7 @@ Item { Behavior on playerProgress { Anim { - duration: Appearance.anim.durations.large + duration: Tokens.anim.durations.large } } @@ -106,8 +106,8 @@ Item { readonly property real centerX: width / 2 readonly property real centerY: height / 2 - readonly property real innerX: cover.implicitWidth / 2 + Appearance.spacing.small - readonly property real innerY: cover.implicitHeight / 2 + Appearance.spacing.small + readonly property real innerX: cover.implicitWidth / 2 + Tokens.spacing.small + readonly property real innerY: cover.implicitHeight / 2 + Tokens.spacing.small property color colour: Colours.palette.m3primary anchors.fill: cover @@ -136,8 +136,8 @@ Item { readonly property real cos: Math.cos(angle) readonly property real sin: Math.sin(angle) - capStyle: Appearance.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap - strokeWidth: 360 / Config.services.visualiserBars - Appearance.spacing.small / 4 + capStyle: Tokens.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap + strokeWidth: 360 / Config.services.visualiserBars - Tokens.spacing.small / 4 strokeColor: Colours.palette.m3primary startX: visualiser.centerX + (visualiser.innerX + strokeWidth / 2) * cos @@ -159,7 +159,7 @@ Item { anchors.verticalCenter: parent.verticalCenter anchors.left: parent.left - anchors.leftMargin: Appearance.padding.large + Config.dashboard.sizes.mediaVisualiserSize + anchors.leftMargin: Tokens.padding.large + Config.dashboard.sizes.mediaVisualiserSize implicitWidth: Config.dashboard.sizes.mediaCoverArtSize implicitHeight: Config.dashboard.sizes.mediaCoverArtSize @@ -201,9 +201,9 @@ Item { anchors.verticalCenter: parent.verticalCenter anchors.left: visualiser.right - anchors.leftMargin: Appearance.spacing.normal + anchors.leftMargin: Tokens.spacing.normal - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small StyledText { id: title @@ -215,7 +215,7 @@ Item { horizontalAlignment: Text.AlignHCenter text: (Players.active?.trackTitle ?? qsTr("No media")) || qsTr("Unknown title") color: Players.active ? Colours.palette.m3primary : Colours.palette.m3onSurface - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal elide: Text.ElideRight } @@ -230,7 +230,7 @@ Item { visible: !!Players.active text: Players.active?.trackAlbum || qsTr("Unknown album") color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small elide: Text.ElideRight } @@ -259,15 +259,15 @@ Item { id: controls Layout.alignment: Qt.AlignHCenter - Layout.topMargin: Appearance.spacing.small - Layout.bottomMargin: Appearance.spacing.smaller + Layout.topMargin: Tokens.spacing.small + Layout.bottomMargin: Tokens.spacing.smaller - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small PlayerControl { type: IconButton.Text icon: Players.active?.shuffle ? "shuffle_on" : "shuffle" - font.pointSize: Math.round(Appearance.font.size.large) + font.pointSize: Math.round(Tokens.font.size.large) disabled: !Players.active?.shuffleSupported onClicked: Players.active.shuffle = !Players.active?.shuffle } @@ -275,7 +275,7 @@ Item { PlayerControl { type: IconButton.Text icon: "skip_previous" - font.pointSize: Math.round(Appearance.font.size.large * 1.5) + font.pointSize: Math.round(Tokens.font.size.large * 1.5) disabled: !Players.active?.canGoPrevious onClicked: Players.active?.previous() } @@ -284,9 +284,9 @@ Item { icon: Players.active?.isPlaying ? "pause" : "play_arrow" label.animate: true toggle: true - padding: Appearance.padding.small / 2 + padding: Tokens.padding.small / 2 checked: Players.active?.isPlaying ?? false - font.pointSize: Math.round(Appearance.font.size.large * 1.5) + font.pointSize: Math.round(Tokens.font.size.large * 1.5) disabled: !Players.active?.canTogglePlaying onClicked: Players.active?.togglePlaying() } @@ -294,7 +294,7 @@ Item { PlayerControl { type: IconButton.Text icon: "skip_next" - font.pointSize: Math.round(Appearance.font.size.large * 1.5) + font.pointSize: Math.round(Tokens.font.size.large * 1.5) disabled: !Players.active?.canGoNext onClicked: Players.active?.next() } @@ -302,7 +302,7 @@ Item { PlayerControl { type: IconButton.Text icon: "lyrics" - font.pointSize: Math.round(Appearance.font.size.large) + font.pointSize: Math.round(Tokens.font.size.large) onClicked: root.lyricMenuOpen = !root.lyricMenuOpen } } @@ -312,7 +312,7 @@ Item { enabled: !!Players.active implicitWidth: 280 - implicitHeight: Appearance.padding.normal * 3 + implicitHeight: Tokens.padding.normal * 3 onMoved: { const active = Players.active; @@ -356,7 +356,7 @@ Item { text: root.lengthStr(Players.active?.position ?? -1) color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } StyledText { @@ -366,7 +366,7 @@ Item { text: root.lengthStr(Players.active?.length ?? -1) color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } } } @@ -377,14 +377,14 @@ Item { anchors.verticalCenter: parent.verticalCenter anchors.verticalCenterOffset: playerChanger.parent == leftSection ? -playerChanger.height : 0 anchors.left: details.right - anchors.leftMargin: Appearance.spacing.normal + anchors.leftMargin: Tokens.spacing.normal visible: lyricMenu.height === 0 || opacity > 0 opacity: lyricMenu.height === 0 ? 1 : 0 Behavior on opacity { NumberAnimation { - duration: Appearance.anim.durations.normal + duration: Tokens.anim.durations.normal easing.type: Easing.OutCubic } } @@ -402,7 +402,7 @@ Item { height: visualiser.height * 0.75 playing: Players.active?.isPlaying ?? false - speed: Audio.beatTracker.bpm / Appearance.anim.mediaGifSpeedAdjustment // qmllint disable unresolved-type + speed: Audio.beatTracker.bpm / Tokens.anim.mediaGifSpeedAdjustment // qmllint disable unresolved-type source: Paths.absolutePath(Config.paths.mediaGif) asynchronous: true fillMode: AnimatedImage.PreserveAspectFit @@ -416,9 +416,9 @@ Item { anchors.top: parent.top anchors.left: details.right anchors.right: parent.right - anchors.leftMargin: Appearance.spacing.normal + anchors.leftMargin: Tokens.spacing.normal - contentHeight: !root.lyricsShowingDebounced ? root.detailsHeightWithoutLyrics + Appearance.padding.large * 5 : root.detailsHeightWithoutLyrics + lyricsViewInDetails.implicitHeight + contentHeight: !root.lyricsShowingDebounced ? root.detailsHeightWithoutLyrics + Tokens.padding.large * 5 : root.detailsHeightWithoutLyrics + lyricsViewInDetails.implicitHeight visible: root.lyricMenuOpen || height > 0 height: root.lyricMenuOpen ? implicitHeight : 0 @@ -426,7 +426,7 @@ Item { Behavior on height { NumberAnimation { - duration: Appearance.anim.durations.normal + duration: Tokens.anim.durations.normal easing.type: Easing.OutCubic } } @@ -437,14 +437,14 @@ Item { parent: !root.lyricsShowingDebounced ? details : leftSection Layout.alignment: Qt.AlignHCenter - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small PlayerControl { type: IconButton.Text icon: "move_up" inactiveOnColour: Colours.palette.m3secondary - padding: Appearance.padding.small - font.pointSize: Appearance.font.size.large + padding: Tokens.padding.small + font.pointSize: Tokens.font.size.large disabled: !Players.active?.canRaise onClicked: { Players.active?.raise(); @@ -482,8 +482,8 @@ Item { type: IconButton.Text icon: "delete" inactiveOnColour: Colours.palette.m3error - padding: Appearance.padding.small - font.pointSize: Appearance.font.size.large + padding: Tokens.padding.small + font.pointSize: Tokens.font.size.large disabled: !Players.active?.canQuit onClicked: Players.active?.quit() } @@ -498,15 +498,15 @@ Item { } component PlayerControl: IconButton { - Layout.preferredWidth: implicitWidth + (stateLayer.pressed ? Appearance.padding.large : internalChecked ? Appearance.padding.smaller : 0) - radius: stateLayer.pressed ? Appearance.rounding.small / 2 : internalChecked ? Appearance.rounding.small : implicitHeight / 2 - radiusAnim.duration: Appearance.anim.durations.expressiveFastSpatial - radiusAnim.easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + Layout.preferredWidth: implicitWidth + (stateLayer.pressed ? Tokens.padding.large : internalChecked ? Tokens.padding.smaller : 0) + radius: stateLayer.pressed ? Tokens.rounding.small / 2 : internalChecked ? Tokens.rounding.small : implicitHeight / 2 + radiusAnim.duration: Tokens.anim.durations.expressiveFastSpatial + radiusAnim.easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial Behavior on Layout.preferredWidth { Anim { - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } } } diff --git a/modules/dashboard/Performance.qml b/modules/dashboard/Performance.qml index 75198254..13ab57a7 100644 --- a/modules/dashboard/Performance.qml +++ b/modules/dashboard/Performance.qml @@ -6,12 +6,12 @@ import Caelestia.Internal import qs.components import qs.components.misc import qs.services -import qs.config +import Caelestia.Config Item { id: root - readonly property int minWidth: 400 + 400 + Appearance.spacing.normal + 120 + Appearance.padding.large * 2 + readonly property int minWidth: 400 + 400 + Tokens.spacing.normal + 120 + Tokens.padding.large * 2 function displayTemp(temp: real): string { return `${Math.ceil(Config.services.useFahrenheitPerformance ? temp * 1.8 + 32 : temp)}°${Config.services.useFahrenheitPerformance ? "F" : "C"}`; @@ -26,32 +26,32 @@ Item { anchors.centerIn: parent width: 400 height: 350 - radius: Appearance.rounding.large + radius: Tokens.rounding.large color: Colours.tPalette.m3surfaceContainer visible: !Config.dashboard.performance.showCpu && !(Config.dashboard.performance.showGpu && SystemUsage.gpuType !== "NONE") && !Config.dashboard.performance.showMemory && !Config.dashboard.performance.showStorage && !Config.dashboard.performance.showNetwork && !(UPower.displayDevice.isLaptopBattery && Config.dashboard.performance.showBattery) ColumnLayout { anchors.centerIn: parent - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal MaterialIcon { Layout.alignment: Qt.AlignHCenter text: "tune" - font.pointSize: Appearance.font.size.extraLarge * 2 + font.pointSize: Tokens.font.size.extraLarge * 2 color: Colours.palette.m3onSurfaceVariant } StyledText { Layout.alignment: Qt.AlignHCenter text: qsTr("No widgets enabled") - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large color: Colours.palette.m3onSurface } StyledText { Layout.alignment: Qt.AlignHCenter text: qsTr("Enable widgets in dashboard settings") - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: Colours.palette.m3onSurfaceVariant } } @@ -62,7 +62,7 @@ Item { anchors.left: parent.left anchors.right: parent.right - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal visible: !placeholder.visible Ref { @@ -73,11 +73,11 @@ Item { id: mainColumn Layout.fillWidth: true - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal RowLayout { Layout.fillWidth: true - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal visible: Config.dashboard.performance.showCpu || (Config.dashboard.performance.showGpu && SystemUsage.gpuType !== "NONE") HeroCard { @@ -115,7 +115,7 @@ Item { RowLayout { Layout.fillWidth: true - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal visible: Config.dashboard.performance.showMemory || Config.dashboard.performance.showStorage || Config.dashboard.performance.showNetwork GaugeCard { @@ -166,7 +166,7 @@ Item { property real animatedPercentage: 0 color: Colours.tPalette.m3surfaceContainer - radius: Appearance.rounding.large + radius: Tokens.rounding.large Component.onCompleted: animatedPercentage = percentage onPercentageChanged: animatedPercentage = percentage @@ -181,13 +181,13 @@ Item { ColumnLayout { anchors.fill: parent - anchors.margins: Appearance.padding.large - spacing: Appearance.spacing.small + anchors.margins: Tokens.padding.large + spacing: Tokens.spacing.small // Header Section ColumnLayout { Layout.fillWidth: true - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small MaterialIcon { text: { @@ -214,14 +214,14 @@ Item { return charging ? `battery_charging_${(level + 3) * 10}` : `battery_${level}_bar`; } - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large color: batteryTank.accentColor } StyledText { Layout.fillWidth: true text: qsTr("Battery") - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal color: Colours.palette.m3onSurface } } @@ -238,7 +238,7 @@ Item { StyledText { Layout.alignment: Qt.AlignRight text: `${Math.round(batteryTank.percentage * 100)}%` - font.pointSize: Appearance.font.size.extraLarge + font.pointSize: Tokens.font.size.extraLarge font.weight: Font.Medium color: batteryTank.accentColor } @@ -263,7 +263,7 @@ Item { return `${min}m`; } - font.pointSize: Appearance.font.size.smaller + font.pointSize: Tokens.font.size.smaller color: Colours.palette.m3onSurfaceVariant } } @@ -271,7 +271,7 @@ Item { Behavior on animatedPercentage { Anim { - duration: Appearance.anim.durations.large + duration: Tokens.anim.durations.large } } } @@ -282,19 +282,19 @@ Item { property color accentColor: Colours.palette.m3primary Layout.fillWidth: true - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small MaterialIcon { text: parent.icon fill: 1 color: parent.accentColor - font.pointSize: Appearance.spacing.large + font.pointSize: Tokens.spacing.large } StyledText { Layout.fillWidth: true text: parent.title - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal elide: Text.ElideRight } } @@ -308,7 +308,7 @@ Item { property real animatedValue: 0 color: bgColor - radius: Appearance.rounding.full + radius: Tokens.rounding.full Component.onCompleted: animatedValue = value onValueChanged: animatedValue = value @@ -318,12 +318,12 @@ Item { anchors.bottom: parent.bottom width: parent.width * progressBar.animatedValue color: progressBar.fgColor - radius: Appearance.rounding.full + radius: Tokens.rounding.full } Behavior on animatedValue { Anim { - duration: Appearance.anim.durations.large + duration: Tokens.anim.durations.large } } } @@ -346,7 +346,7 @@ Item { property real animatedTemp: 0 color: Colours.tPalette.m3surfaceContainer - radius: Appearance.rounding.large + radius: Tokens.rounding.large Component.onCompleted: { animatedUsage = usage; animatedTemp = tempProgress; @@ -365,10 +365,10 @@ Item { CardHeader { anchors.left: parent.left anchors.top: parent.top - anchors.leftMargin: Appearance.padding.large - anchors.topMargin: Math.round(Appearance.padding.large * 1.2) + anchors.leftMargin: Tokens.padding.large + anchors.topMargin: Math.round(Tokens.padding.large * 1.2) - width: parent.width - anchors.leftMargin - usageColumn.anchors.rightMargin - usageLabel.width - Appearance.spacing.normal + width: parent.width - anchors.leftMargin - usageColumn.anchors.rightMargin - usageLabel.width - Tokens.spacing.normal icon: heroCard.icon title: heroCard.title accentColor: heroCard.accentColor @@ -378,23 +378,23 @@ Item { anchors.left: parent.left anchors.right: parent.right anchors.bottom: parent.bottom - anchors.margins: Math.round(Appearance.padding.large * 1.2) - anchors.bottomMargin: Math.round(Appearance.padding.large * 1.3) + anchors.margins: Math.round(Tokens.padding.large * 1.2) + anchors.bottomMargin: Math.round(Tokens.padding.large * 1.3) - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small Row { - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small StyledText { text: heroCard.secondaryValue - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal font.weight: Font.Medium } StyledText { text: heroCard.secondaryLabel - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: Colours.palette.m3onSurfaceVariant anchors.baseline: parent.children[0].baseline } @@ -414,7 +414,7 @@ Item { anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.large + anchors.margins: Tokens.padding.large anchors.rightMargin: 32 spacing: 0 @@ -423,14 +423,14 @@ Item { anchors.right: parent.right text: heroCard.mainLabel - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal color: Colours.palette.m3onSurfaceVariant } StyledText { anchors.right: parent.right text: heroCard.mainValue - font.pointSize: Appearance.font.size.extraLarge + font.pointSize: Tokens.font.size.extraLarge font.weight: Font.Medium color: heroCard.accentColor } @@ -438,13 +438,13 @@ Item { Behavior on animatedUsage { Anim { - duration: Appearance.anim.durations.large + duration: Tokens.anim.durations.large } } Behavior on animatedTemp { Anim { - duration: Appearance.anim.durations.large + duration: Tokens.anim.durations.large } } } @@ -462,15 +462,15 @@ Item { property real animatedPercentage: 0 color: Colours.tPalette.m3surfaceContainer - radius: Appearance.rounding.large + radius: Tokens.rounding.large clip: true Component.onCompleted: animatedPercentage = percentage onPercentageChanged: animatedPercentage = percentage ColumnLayout { anchors.fill: parent - anchors.margins: Appearance.padding.large - spacing: Appearance.spacing.smaller + anchors.margins: Tokens.padding.large + spacing: Tokens.spacing.smaller CardHeader { icon: gaugeCard.icon @@ -496,7 +496,7 @@ Item { StyledText { anchors.centerIn: parent text: `${Math.round(gaugeCard.percentage * 100)}%` - font.pointSize: Appearance.font.size.extraLarge + font.pointSize: Tokens.font.size.extraLarge font.weight: Font.Medium color: gaugeCard.accentColor } @@ -505,14 +505,14 @@ Item { StyledText { Layout.alignment: Qt.AlignHCenter text: gaugeCard.subtitle - font.pointSize: Appearance.font.size.smaller + font.pointSize: Tokens.font.size.smaller color: Colours.palette.m3onSurfaceVariant } } Behavior on animatedPercentage { Anim { - duration: Appearance.anim.durations.large + duration: Tokens.anim.durations.large } } } @@ -529,7 +529,7 @@ Item { property color accentColor: Colours.palette.m3secondary color: Colours.tPalette.m3surfaceContainer - radius: Appearance.rounding.large + radius: Tokens.rounding.large clip: true Component.onCompleted: { diskCount = SystemUsage.disks.length; @@ -567,8 +567,8 @@ Item { ColumnLayout { anchors.fill: parent - anchors.margins: Appearance.padding.large - spacing: Appearance.spacing.smaller + anchors.margins: Tokens.padding.large + spacing: Tokens.spacing.smaller CardHeader { icon: "hard_disk" @@ -585,7 +585,7 @@ Item { MaterialIcon { text: "unfold_more" color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal visible: storageGaugeCard.diskCount > 1 opacity: 0.7 ToolTip.visible: hintHover.hovered @@ -616,7 +616,7 @@ Item { StyledText { anchors.centerIn: parent text: storageGaugeCard.currentDisk ? `${Math.round(storageGaugeCard.currentDisk.perc * 100)}%` : "—" - font.pointSize: Appearance.font.size.extraLarge + font.pointSize: Tokens.font.size.extraLarge font.weight: Font.Medium color: storageGaugeCard.accentColor } @@ -632,14 +632,14 @@ Item { const totalFmt = SystemUsage.formatKib(storageGaugeCard.currentDisk.total); return `${usedFmt.value.toFixed(1)} / ${Math.floor(totalFmt.value)} ${totalFmt.unit}`; } - font.pointSize: Appearance.font.size.smaller + font.pointSize: Tokens.font.size.smaller color: Colours.palette.m3onSurfaceVariant } } Behavior on animatedPercentage { Anim { - duration: Appearance.anim.durations.large + duration: Tokens.anim.durations.large } } } @@ -650,7 +650,7 @@ Item { property color accentColor: Colours.palette.m3primary color: Colours.tPalette.m3surfaceContainer - radius: Appearance.rounding.large + radius: Tokens.rounding.large clip: true Ref { @@ -659,8 +659,8 @@ Item { ColumnLayout { anchors.fill: parent - anchors.margins: Appearance.padding.large - spacing: Appearance.spacing.small + anchors.margins: Tokens.padding.large + spacing: Tokens.spacing.small CardHeader { icon: "swap_vert" @@ -710,7 +710,7 @@ Item { Behavior on smoothMax { Anim { - duration: Appearance.anim.durations.large + duration: Tokens.anim.durations.large } } } @@ -719,7 +719,7 @@ Item { StyledText { anchors.centerIn: parent text: qsTr("Collecting data...") - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: Colours.palette.m3onSurfaceVariant visible: NetworkUsage.downloadBuffer.count < 2 opacity: 0.6 @@ -729,17 +729,17 @@ Item { // Download row RowLayout { Layout.fillWidth: true - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal MaterialIcon { text: "download" color: Colours.palette.m3tertiary - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } StyledText { text: qsTr("Download") - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: Colours.palette.m3onSurfaceVariant } @@ -752,7 +752,7 @@ Item { const fmt = NetworkUsage.formatBytes(NetworkUsage.downloadSpeed ?? 0); return fmt ? `${fmt.value.toFixed(1)} ${fmt.unit}` : "0.0 B/s"; } - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal font.weight: Font.Medium color: Colours.palette.m3tertiary } @@ -761,17 +761,17 @@ Item { // Upload row RowLayout { Layout.fillWidth: true - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal MaterialIcon { text: "upload" color: Colours.palette.m3secondary - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } StyledText { text: qsTr("Upload") - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: Colours.palette.m3onSurfaceVariant } @@ -784,7 +784,7 @@ Item { const fmt = NetworkUsage.formatBytes(NetworkUsage.uploadSpeed ?? 0); return fmt ? `${fmt.value.toFixed(1)} ${fmt.unit}` : "0.0 B/s"; } - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal font.weight: Font.Medium color: Colours.palette.m3secondary } @@ -793,17 +793,17 @@ Item { // Session totals RowLayout { Layout.fillWidth: true - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal MaterialIcon { text: "history" color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } StyledText { text: qsTr("Total") - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: Colours.palette.m3onSurfaceVariant } @@ -817,7 +817,7 @@ Item { const up = NetworkUsage.formatBytesTotal(NetworkUsage.uploadTotal ?? 0); return (down && up) ? `↓${down.value.toFixed(1)}${down.unit} ↑${up.value.toFixed(1)}${up.unit}` : "↓0.0B ↑0.0B"; } - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: Colours.palette.m3onSurfaceVariant } } diff --git a/modules/dashboard/Tabs.qml b/modules/dashboard/Tabs.qml index 7d8ff051..94556aca 100644 --- a/modules/dashboard/Tabs.qml +++ b/modules/dashboard/Tabs.qml @@ -7,7 +7,7 @@ import Quickshell.Widgets import qs.components import qs.components.controls import qs.services -import qs.config +import Caelestia.Config Item { id: root @@ -77,7 +77,7 @@ Item { implicitHeight: parent.implicitHeight * 2 color: Colours.palette.m3primary - radius: Appearance.rounding.full + radius: Tokens.rounding.full } Behavior on x { @@ -163,16 +163,16 @@ Item { properties: "implicitWidth,implicitHeight" from: 0 to: rippleAnim.radius * 2 - duration: Appearance.anim.durations.normal - easing.bezierCurve: Appearance.anim.curves.standardDecel + duration: Tokens.anim.durations.normal + easing.bezierCurve: Tokens.anim.curves.standardDecel } Anim { target: ripple property: "opacity" to: 0 - duration: Appearance.anim.durations.normal + duration: Tokens.anim.durations.normal easing.type: Easing.BezierSpline - easing.bezierCurve: Appearance.anim.curves.standard + easing.bezierCurve: Tokens.anim.curves.standard } } @@ -185,7 +185,7 @@ Item { implicitHeight: parent.height + Config.dashboard.sizes.tabIndicatorSpacing * 2 color: "transparent" - radius: Appearance.rounding.small + radius: Tokens.rounding.small StyledRect { id: stateLayer @@ -203,7 +203,7 @@ Item { StyledRect { id: ripple - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: tab.current ? Colours.palette.m3primary : Colours.palette.m3onSurface opacity: 0 @@ -223,7 +223,7 @@ Item { text: tab.iconName color: tab.current ? Colours.palette.m3primary : Colours.palette.m3onSurfaceVariant fill: tab.current ? 1 : 0 - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large Behavior on fill { Anim {} diff --git a/modules/dashboard/WeatherTab.qml b/modules/dashboard/WeatherTab.qml index a87ce29a..78be9ad7 100644 --- a/modules/dashboard/WeatherTab.qml +++ b/modules/dashboard/WeatherTab.qml @@ -2,7 +2,7 @@ import QtQuick import QtQuick.Layouts import qs.components import qs.services -import qs.config +import Caelestia.Config Item { id: root @@ -17,26 +17,26 @@ Item { id: layout anchors.fill: parent - spacing: Appearance.spacing.smaller + spacing: Tokens.spacing.smaller RowLayout { - Layout.leftMargin: Appearance.padding.large - Layout.rightMargin: Appearance.padding.large + Layout.leftMargin: Tokens.padding.large + Layout.rightMargin: Tokens.padding.large Layout.fillWidth: true Column { - spacing: Appearance.spacing.small / 2 + spacing: Tokens.spacing.small / 2 StyledText { text: Weather.city || qsTr("Loading...") - font.pointSize: Appearance.font.size.extraLarge + font.pointSize: Tokens.font.size.extraLarge font.weight: 600 color: Colours.palette.m3onSurface } StyledText { text: new Date().toLocaleDateString(Qt.locale(), "dddd, MMMM d") - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: Colours.palette.m3onSurfaceVariant } } @@ -46,7 +46,7 @@ Item { } Row { - spacing: Appearance.spacing.large + spacing: Tokens.spacing.large WeatherStat { icon: "wb_twilight" @@ -66,40 +66,40 @@ Item { StyledRect { Layout.fillWidth: true - implicitHeight: bigInfoRow.implicitHeight + Appearance.padding.small * 2 + implicitHeight: bigInfoRow.implicitHeight + Tokens.padding.small * 2 - radius: Appearance.rounding.large * 2 + radius: Tokens.rounding.large * 2 color: Colours.tPalette.m3surfaceContainer RowLayout { id: bigInfoRow anchors.centerIn: parent - spacing: Appearance.spacing.large + spacing: Tokens.spacing.large MaterialIcon { Layout.alignment: Qt.AlignVCenter text: Weather.icon - font.pointSize: Appearance.font.size.extraLarge * 3 + font.pointSize: Tokens.font.size.extraLarge * 3 color: Colours.palette.m3secondary animate: true } ColumnLayout { Layout.alignment: Qt.AlignVCenter - spacing: -Appearance.spacing.small + spacing: -Tokens.spacing.small StyledText { text: Weather.temp - font.pointSize: Appearance.font.size.extraLarge * 2 + font.pointSize: Tokens.font.size.extraLarge * 2 font.weight: 500 color: Colours.palette.m3primary } StyledText { - Layout.leftMargin: Appearance.padding.small + Layout.leftMargin: Tokens.padding.small text: Weather.description - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal color: Colours.palette.m3onSurfaceVariant } } @@ -108,7 +108,7 @@ Item { RowLayout { Layout.fillWidth: true - spacing: Appearance.spacing.smaller + spacing: Tokens.spacing.smaller DetailCard { icon: "water_drop" @@ -131,18 +131,18 @@ Item { } StyledText { - Layout.topMargin: Appearance.spacing.normal - Layout.leftMargin: Appearance.padding.normal + Layout.topMargin: Tokens.spacing.normal + Layout.leftMargin: Tokens.padding.normal visible: forecastRepeater.count > 0 text: qsTr("7-Day Forecast") - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal font.weight: 600 color: Colours.palette.m3onSurface } RowLayout { Layout.fillWidth: true - spacing: Appearance.spacing.smaller + spacing: Tokens.spacing.smaller Repeater { id: forecastRepeater @@ -156,30 +156,30 @@ Item { required property var modelData Layout.fillWidth: true - implicitHeight: forecastItemColumn.implicitHeight + Appearance.padding.normal * 2 + implicitHeight: forecastItemColumn.implicitHeight + Tokens.padding.normal * 2 - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: Colours.tPalette.m3surfaceContainer ColumnLayout { id: forecastItemColumn anchors.centerIn: parent - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small StyledText { Layout.alignment: Qt.AlignHCenter text: forecastItem.index === 0 ? qsTr("Today") : new Date(forecastItem.modelData.date).toLocaleDateString(Qt.locale(), "ddd") - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal font.weight: 600 color: Colours.palette.m3primary } StyledText { - Layout.topMargin: -Appearance.spacing.small / 2 + Layout.topMargin: -Tokens.spacing.small / 2 Layout.alignment: Qt.AlignHCenter text: new Date(forecastItem.modelData.date).toLocaleDateString(Qt.locale(), "MMM d") - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small opacity: 0.7 color: Colours.palette.m3onSurfaceVariant } @@ -187,7 +187,7 @@ Item { MaterialIcon { Layout.alignment: Qt.AlignHCenter text: forecastItem.modelData.icon - font.pointSize: Appearance.font.size.extraLarge + font.pointSize: Tokens.font.size.extraLarge color: Colours.palette.m3secondary } @@ -213,17 +213,17 @@ Item { Layout.fillWidth: true Layout.preferredHeight: 60 - radius: Appearance.rounding.small + radius: Tokens.rounding.small color: Colours.tPalette.m3surfaceContainer Row { anchors.centerIn: parent - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal MaterialIcon { text: detailRoot.icon color: detailRoot.colour - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large anchors.verticalCenter: parent.verticalCenter } @@ -233,7 +233,7 @@ Item { StyledText { text: detailRoot.label - font.pointSize: Appearance.font.size.smaller + font.pointSize: Tokens.font.size.smaller opacity: 0.7 horizontalAlignment: Text.AlignLeft } @@ -254,23 +254,23 @@ Item { property string value property color colour - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small MaterialIcon { text: weatherStat.icon - font.pointSize: Appearance.font.size.extraLarge + font.pointSize: Tokens.font.size.extraLarge color: weatherStat.colour } Column { StyledText { text: weatherStat.label - font.pointSize: Appearance.font.size.smaller + font.pointSize: Tokens.font.size.smaller color: Colours.palette.m3onSurfaceVariant } StyledText { text: weatherStat.value - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small font.weight: 600 color: Colours.palette.m3onSurface } diff --git a/modules/dashboard/Wrapper.qml b/modules/dashboard/Wrapper.qml index 566f616a..e01dc0f0 100644 --- a/modules/dashboard/Wrapper.qml +++ b/modules/dashboard/Wrapper.qml @@ -5,7 +5,7 @@ import Quickshell import Caelestia import qs.components import qs.components.filedialog -import qs.config +import Caelestia.Config import qs.utils Item { @@ -40,8 +40,8 @@ Item { Behavior on offsetScale { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } diff --git a/modules/dashboard/dash/Calendar.qml b/modules/dashboard/dash/Calendar.qml index 64e43f5c..d415a031 100644 --- a/modules/dashboard/dash/Calendar.qml +++ b/modules/dashboard/dash/Calendar.qml @@ -7,7 +7,7 @@ import qs.components import qs.components.controls import qs.components.effects import qs.services -import qs.config +import Caelestia.Config CustomMouseArea { id: root @@ -35,18 +35,18 @@ CustomMouseArea { id: inner anchors.fill: parent - anchors.margins: Appearance.padding.large - spacing: Appearance.spacing.small + anchors.margins: Tokens.padding.large + spacing: Tokens.spacing.small RowLayout { id: monthNavigationRow Layout.fillWidth: true - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small Item { implicitWidth: implicitHeight - implicitHeight: prevMonthText.implicitHeight + Appearance.padding.small * 2 + implicitHeight: prevMonthText.implicitHeight + Tokens.padding.small * 2 StateLayer { id: prevMonthStateLayer @@ -55,7 +55,7 @@ CustomMouseArea { root.dashState.currentDate = new Date(root.currYear, root.currMonth - 1, 1); } - radius: Appearance.rounding.full + radius: Tokens.rounding.full } MaterialIcon { @@ -64,7 +64,7 @@ CustomMouseArea { anchors.centerIn: parent text: "chevron_left" color: Colours.palette.m3tertiary - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal font.weight: 700 } } @@ -72,8 +72,8 @@ CustomMouseArea { Item { Layout.fillWidth: true - implicitWidth: monthYearDisplay.implicitWidth + Appearance.padding.small * 2 - implicitHeight: monthYearDisplay.implicitHeight + Appearance.padding.small * 2 + implicitWidth: monthYearDisplay.implicitWidth + Tokens.padding.small * 2 + implicitHeight: monthYearDisplay.implicitHeight + Tokens.padding.small * 2 StateLayer { function onClicked(): void { @@ -81,11 +81,11 @@ CustomMouseArea { } anchors.fill: monthYearDisplay - anchors.margins: -Appearance.padding.small - anchors.leftMargin: -Appearance.padding.normal - anchors.rightMargin: -Appearance.padding.normal + anchors.margins: -Tokens.padding.small + anchors.leftMargin: -Tokens.padding.normal + anchors.rightMargin: -Tokens.padding.normal - radius: Appearance.rounding.full + radius: Tokens.rounding.full disabled: { const now = new Date(); return root.currMonth === now.getMonth() && root.currYear === now.getFullYear(); @@ -98,7 +98,7 @@ CustomMouseArea { anchors.centerIn: parent text: grid.title color: Colours.palette.m3primary - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal font.weight: 500 font.capitalization: Font.Capitalize } @@ -106,7 +106,7 @@ CustomMouseArea { Item { implicitWidth: implicitHeight - implicitHeight: nextMonthText.implicitHeight + Appearance.padding.small * 2 + implicitHeight: nextMonthText.implicitHeight + Tokens.padding.small * 2 StateLayer { id: nextMonthStateLayer @@ -115,7 +115,7 @@ CustomMouseArea { root.dashState.currentDate = new Date(root.currYear, root.currMonth + 1, 1); } - radius: Appearance.rounding.full + radius: Tokens.rounding.full } MaterialIcon { @@ -124,7 +124,7 @@ CustomMouseArea { anchors.centerIn: parent text: "chevron_right" color: Colours.palette.m3tertiary - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal font.weight: 700 } } @@ -167,7 +167,7 @@ CustomMouseArea { required property var model implicitWidth: implicitHeight - implicitHeight: text.implicitHeight + Appearance.padding.small * 2 + implicitHeight: text.implicitHeight + Tokens.padding.small * 2 StyledText { id: text @@ -184,7 +184,7 @@ CustomMouseArea { return Colours.palette.m3onSurfaceVariant; } opacity: dayItem.model.today || dayItem.model.month === grid.month ? 1 : 0.4 - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal font.weight: 500 } } @@ -208,7 +208,7 @@ CustomMouseArea { implicitHeight: today?.implicitHeight ?? 0 clip: true - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: Colours.palette.m3primary opacity: todayItem ? 1 : 0 @@ -236,15 +236,15 @@ CustomMouseArea { Behavior on x { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } Behavior on y { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } } diff --git a/modules/dashboard/dash/DateTime.qml b/modules/dashboard/dash/DateTime.qml index 7f786a19..1b43b137 100644 --- a/modules/dashboard/dash/DateTime.qml +++ b/modules/dashboard/dash/DateTime.qml @@ -4,7 +4,7 @@ import QtQuick import QtQuick.Layouts import qs.components import qs.services -import qs.config +import Caelestia.Config Item { id: root @@ -24,8 +24,8 @@ Item { Layout.alignment: Qt.AlignHCenter text: Time.hourStr color: Colours.palette.m3secondary - font.pointSize: Appearance.font.size.extraLarge - font.family: Appearance.font.family.clock + font.pointSize: Tokens.font.size.extraLarge + font.family: Tokens.font.family.clock font.weight: 600 } @@ -33,8 +33,8 @@ Item { Layout.alignment: Qt.AlignHCenter text: "•••" color: Colours.palette.m3primary - font.pointSize: Appearance.font.size.extraLarge * 0.9 - font.family: Appearance.font.family.clock + font.pointSize: Tokens.font.size.extraLarge * 0.9 + font.family: Tokens.font.family.clock } StyledText { @@ -42,8 +42,8 @@ Item { Layout.alignment: Qt.AlignHCenter text: Time.minuteStr color: Colours.palette.m3secondary - font.pointSize: Appearance.font.size.extraLarge - font.family: Appearance.font.family.clock + font.pointSize: Tokens.font.size.extraLarge + font.family: Tokens.font.family.clock font.weight: 600 } @@ -57,8 +57,8 @@ Item { sourceComponent: StyledText { text: Time.amPmStr color: Colours.palette.m3primary - font.pointSize: Appearance.font.size.large - font.family: Appearance.font.family.clock + font.pointSize: Tokens.font.size.large + font.family: Tokens.font.family.clock font.weight: 600 } } diff --git a/modules/dashboard/dash/Media.qml b/modules/dashboard/dash/Media.qml index 4f50531c..d6cfa76a 100644 --- a/modules/dashboard/dash/Media.qml +++ b/modules/dashboard/dash/Media.qml @@ -3,7 +3,7 @@ import QtQuick.Shapes import Caelestia.Services import qs.components import qs.services -import qs.config +import Caelestia.Config import qs.utils Item { @@ -20,7 +20,7 @@ Item { Behavior on playerProgress { Anim { - duration: Appearance.anim.durations.large + duration: Tokens.anim.durations.large } } @@ -43,13 +43,13 @@ Item { fillColor: "transparent" strokeColor: Colours.layer(Colours.palette.m3surfaceContainerHigh, 2) strokeWidth: Config.dashboard.sizes.mediaProgressThickness - capStyle: Appearance.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap + capStyle: Tokens.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap PathAngleArc { centerX: cover.x + cover.width / 2 centerY: cover.y + cover.height / 2 - radiusX: (cover.width + Config.dashboard.sizes.mediaProgressThickness) / 2 + Appearance.spacing.small - radiusY: (cover.height + Config.dashboard.sizes.mediaProgressThickness) / 2 + Appearance.spacing.small + radiusX: (cover.width + Config.dashboard.sizes.mediaProgressThickness) / 2 + Tokens.spacing.small + radiusY: (cover.height + Config.dashboard.sizes.mediaProgressThickness) / 2 + Tokens.spacing.small startAngle: -90 - Config.dashboard.sizes.mediaProgressSweep / 2 sweepAngle: Config.dashboard.sizes.mediaProgressSweep } @@ -63,13 +63,13 @@ Item { fillColor: "transparent" strokeColor: Colours.palette.m3primary strokeWidth: Config.dashboard.sizes.mediaProgressThickness - capStyle: Appearance.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap + capStyle: Tokens.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap PathAngleArc { centerX: cover.x + cover.width / 2 centerY: cover.y + cover.height / 2 - radiusX: (cover.width + Config.dashboard.sizes.mediaProgressThickness) / 2 + Appearance.spacing.small - radiusY: (cover.height + Config.dashboard.sizes.mediaProgressThickness) / 2 + Appearance.spacing.small + radiusX: (cover.width + Config.dashboard.sizes.mediaProgressThickness) / 2 + Tokens.spacing.small + radiusY: (cover.height + Config.dashboard.sizes.mediaProgressThickness) / 2 + Tokens.spacing.small startAngle: -90 - Config.dashboard.sizes.mediaProgressSweep / 2 sweepAngle: Config.dashboard.sizes.mediaProgressSweep * root.playerProgress } @@ -86,7 +86,7 @@ Item { anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right - anchors.margins: Appearance.padding.large + Config.dashboard.sizes.mediaProgressThickness + Appearance.spacing.small + anchors.margins: Tokens.padding.large + Config.dashboard.sizes.mediaProgressThickness + Tokens.spacing.small implicitHeight: width color: Colours.tPalette.m3surfaceContainerHigh @@ -119,15 +119,15 @@ Item { anchors.top: cover.bottom anchors.horizontalCenter: parent.horizontalCenter - anchors.topMargin: Appearance.spacing.normal + anchors.topMargin: Tokens.spacing.normal animate: true horizontalAlignment: Text.AlignHCenter text: (Players.active?.trackTitle ?? qsTr("No media")) || qsTr("Unknown title") color: Colours.palette.m3primary - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal - width: parent.implicitWidth - Appearance.padding.large * 2 + width: parent.implicitWidth - Tokens.padding.large * 2 elide: Text.ElideRight } @@ -136,15 +136,15 @@ Item { anchors.top: title.bottom anchors.horizontalCenter: parent.horizontalCenter - anchors.topMargin: Appearance.spacing.small + anchors.topMargin: Tokens.spacing.small animate: true horizontalAlignment: Text.AlignHCenter text: (Players.active?.trackAlbum ?? qsTr("No media")) || qsTr("Unknown album") color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small - width: parent.implicitWidth - Appearance.padding.large * 2 + width: parent.implicitWidth - Tokens.padding.large * 2 elide: Text.ElideRight } @@ -153,14 +153,14 @@ Item { anchors.top: album.bottom anchors.horizontalCenter: parent.horizontalCenter - anchors.topMargin: Appearance.spacing.small + anchors.topMargin: Tokens.spacing.small animate: true horizontalAlignment: Text.AlignHCenter text: (Players.active?.trackArtist ?? qsTr("No media")) || qsTr("Unknown artist") color: Colours.palette.m3secondary - width: parent.implicitWidth - Appearance.padding.large * 2 + width: parent.implicitWidth - Tokens.padding.large * 2 elide: Text.ElideRight } @@ -169,9 +169,9 @@ Item { anchors.top: artist.bottom anchors.horizontalCenter: parent.horizontalCenter - anchors.topMargin: Appearance.spacing.smaller + anchors.topMargin: Tokens.spacing.smaller - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small Control { function onClicked(): void { @@ -208,12 +208,12 @@ Item { anchors.bottom: parent.bottom anchors.left: parent.left anchors.right: parent.right - anchors.topMargin: Appearance.spacing.small - anchors.bottomMargin: Appearance.padding.large - anchors.margins: Appearance.padding.large * 2 + anchors.topMargin: Tokens.spacing.small + anchors.bottomMargin: Tokens.padding.large + anchors.margins: Tokens.padding.large * 2 playing: Players.active?.isPlaying ?? false - speed: Audio.beatTracker.bpm / Appearance.anim.mediaGifSpeedAdjustment // qmllint disable unresolved-type + speed: Audio.beatTracker.bpm / Tokens.anim.mediaGifSpeedAdjustment // qmllint disable unresolved-type source: Paths.absolutePath(Config.paths.mediaGif) asynchronous: true fillMode: AnimatedImage.PreserveAspectFit @@ -228,7 +228,7 @@ Item { function onClicked(): void { } - implicitWidth: Math.max(icon.implicitHeight, icon.implicitHeight) + Appearance.padding.small + implicitWidth: Math.max(icon.implicitHeight, icon.implicitHeight) + Tokens.padding.small implicitHeight: implicitWidth StateLayer { @@ -237,7 +237,7 @@ Item { } disabled: !control.canUse - radius: Appearance.rounding.full + radius: Tokens.rounding.full } MaterialIcon { @@ -249,7 +249,7 @@ Item { animate: true text: control.icon color: control.canUse ? Colours.palette.m3onSurface : Colours.palette.m3outline - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large } } } diff --git a/modules/dashboard/dash/Resources.qml b/modules/dashboard/dash/Resources.qml index f5ac4556..3dec14f2 100644 --- a/modules/dashboard/dash/Resources.qml +++ b/modules/dashboard/dash/Resources.qml @@ -2,7 +2,7 @@ import QtQuick import qs.components import qs.components.misc import qs.services -import qs.config +import Caelestia.Config Row { id: root @@ -10,8 +10,8 @@ Row { anchors.top: parent.top anchors.bottom: parent.bottom - padding: Appearance.padding.large - spacing: Appearance.spacing.normal + padding: Tokens.padding.large + spacing: Tokens.spacing.normal Ref { service: SystemUsage @@ -44,19 +44,19 @@ Row { anchors.top: parent.top anchors.bottom: parent.bottom - anchors.margins: Appearance.padding.large + anchors.margins: Tokens.padding.large implicitWidth: icon.implicitWidth StyledRect { anchors.horizontalCenter: parent.horizontalCenter anchors.top: parent.top anchors.bottom: icon.top - anchors.bottomMargin: Appearance.spacing.small + anchors.bottomMargin: Tokens.spacing.small implicitWidth: Config.dashboard.sizes.resourceProgessThickness color: Colours.layer(Colours.palette.m3surfaceContainerHigh, 2) - radius: Appearance.rounding.full + radius: Tokens.rounding.full StyledRect { anchors.left: parent.left @@ -65,7 +65,7 @@ Row { implicitHeight: res.value * parent.height color: res.colour - radius: Appearance.rounding.full + radius: Tokens.rounding.full } } @@ -80,7 +80,7 @@ Row { Behavior on value { Anim { - duration: Appearance.anim.durations.large + duration: Tokens.anim.durations.large } } } diff --git a/modules/dashboard/dash/SmallWeather.qml b/modules/dashboard/dash/SmallWeather.qml index 666a2701..dbc5ac3e 100644 --- a/modules/dashboard/dash/SmallWeather.qml +++ b/modules/dashboard/dash/SmallWeather.qml @@ -1,7 +1,7 @@ import QtQuick import qs.components import qs.services -import qs.config +import Caelestia.Config Item { id: root @@ -21,7 +21,7 @@ Item { animate: true text: Weather.icon color: Colours.palette.m3secondary - font.pointSize: Appearance.font.size.extraLarge * 2 + font.pointSize: Tokens.font.size.extraLarge * 2 } Column { @@ -29,9 +29,9 @@ Item { anchors.verticalCenter: parent.verticalCenter anchors.left: icon.right - anchors.leftMargin: Appearance.spacing.large + anchors.leftMargin: Tokens.spacing.large - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small StyledText { anchors.horizontalCenter: parent.horizontalCenter @@ -39,7 +39,7 @@ Item { animate: true text: Weather.temp color: Colours.palette.m3primary - font.pointSize: Appearance.font.size.extraLarge + font.pointSize: Tokens.font.size.extraLarge font.weight: 500 } @@ -50,7 +50,7 @@ Item { text: Weather.description elide: Text.ElideRight - width: Math.min(implicitWidth, root.parent.width - icon.implicitWidth - info.anchors.leftMargin - Appearance.padding.large * 2) + width: Math.min(implicitWidth, root.parent.width - icon.implicitWidth - info.anchors.leftMargin - Tokens.padding.large * 2) } } } diff --git a/modules/dashboard/dash/User.qml b/modules/dashboard/dash/User.qml index 7dc47f74..03ca0e6b 100644 --- a/modules/dashboard/dash/User.qml +++ b/modules/dashboard/dash/User.qml @@ -4,7 +4,7 @@ import qs.components.effects import qs.components.filedialog import qs.components.images import qs.services -import qs.config +import Caelestia.Config import qs.utils Row { @@ -13,14 +13,14 @@ Row { required property DrawerVisibilities visibilities required property FileDialog facePicker - padding: Appearance.padding.large - spacing: Appearance.spacing.normal + padding: Tokens.padding.large + spacing: Tokens.spacing.normal StyledClippingRect { implicitWidth: info.implicitHeight implicitHeight: info.implicitHeight - radius: Appearance.rounding.large + radius: Tokens.rounding.large color: Colours.layer(Colours.palette.m3surfaceContainerHigh, 2) MaterialIcon { @@ -52,7 +52,7 @@ Row { Behavior on opacity { Anim { - duration: Appearance.anim.durations.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial } } } @@ -60,10 +60,10 @@ Row { StyledRect { anchors.centerIn: parent - implicitWidth: selectIcon.implicitHeight + Appearance.padding.small * 2 - implicitHeight: selectIcon.implicitHeight + Appearance.padding.small * 2 + implicitWidth: selectIcon.implicitHeight + Tokens.padding.small * 2 + implicitHeight: selectIcon.implicitHeight + Tokens.padding.small * 2 - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: Colours.palette.m3primary scale: parent.containsMouse ? 1 : 0.5 opacity: parent.containsMouse ? 1 : 0 @@ -85,19 +85,19 @@ Row { text: "frame_person" color: Colours.palette.m3onPrimary - font.pointSize: Appearance.font.size.extraLarge + font.pointSize: Tokens.font.size.extraLarge } Behavior on scale { Anim { - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } } Behavior on opacity { Anim { - duration: Appearance.anim.durations.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial } } } @@ -108,7 +108,7 @@ Row { id: info anchors.verticalCenter: parent.verticalCenter - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal Item { id: line @@ -123,7 +123,7 @@ Row { anchors.leftMargin: (Config.dashboard.sizes.infoIconSize - implicitWidth) / 2 source: SysInfo.osLogo - implicitSize: Math.floor(Appearance.font.size.normal * 1.34) + implicitSize: Math.floor(Tokens.font.size.normal * 1.34) colour: Colours.palette.m3primary } @@ -134,7 +134,7 @@ Row { anchors.left: icon.right anchors.leftMargin: icon.anchors.leftMargin text: `: ${SysInfo.osPrettyName || SysInfo.osName}` - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal width: Config.dashboard.sizes.infoWidth elide: Text.ElideRight @@ -175,7 +175,7 @@ Row { fill: 1 text: line.icon color: line.colour - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } StyledText { @@ -185,7 +185,7 @@ Row { anchors.left: icon.right anchors.leftMargin: icon.anchors.leftMargin text: `: ${line.text}` - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal width: Config.dashboard.sizes.infoWidth elide: Text.ElideRight diff --git a/modules/drawers/ContentWindow.qml b/modules/drawers/ContentWindow.qml index ff0e847a..ce2196bf 100644 --- a/modules/drawers/ContentWindow.qml +++ b/modules/drawers/ContentWindow.qml @@ -10,7 +10,7 @@ import Caelestia.Blobs import qs.components import qs.components.containers import qs.services -import qs.config +import Caelestia.Config import qs.modules.bar StyledWindow { @@ -73,25 +73,25 @@ StyledWindow { Behavior on borderThickness { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial easing.type: Easing.BezierSpline - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } Behavior on borderRounding { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial easing.type: Easing.BezierSpline - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } Behavior on shadowOpacity { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial easing.type: Easing.BezierSpline - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } @@ -221,8 +221,8 @@ StyledWindow { Behavior on extraWidth { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } } diff --git a/modules/drawers/Drawers.qml b/modules/drawers/Drawers.qml index ed886b31..a55e42d0 100644 --- a/modules/drawers/Drawers.qml +++ b/modules/drawers/Drawers.qml @@ -3,7 +3,7 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell import qs.services -import qs.config +import Caelestia.Config Variants { model: Screens.screens diff --git a/modules/drawers/Interactions.qml b/modules/drawers/Interactions.qml index ad17a0f2..fc782ddb 100644 --- a/modules/drawers/Interactions.qml +++ b/modules/drawers/Interactions.qml @@ -3,7 +3,7 @@ import QtQuick.Controls import Quickshell import qs.components import qs.components.controls -import qs.config +import Caelestia.Config import qs.modules.bar as Bar import qs.modules.bar.popouts as BarPopouts diff --git a/modules/drawers/Panels.qml b/modules/drawers/Panels.qml index 0d567414..83f30499 100644 --- a/modules/drawers/Panels.qml +++ b/modules/drawers/Panels.qml @@ -1,7 +1,7 @@ import QtQuick import Quickshell import qs.components -import qs.config +import Caelestia.Config import qs.modules.bar as Bar import qs.modules.dashboard as Dashboard import qs.modules.launcher as Launcher @@ -138,7 +138,7 @@ Item { anchors.bottom: sidebar.visible ? parent.bottom : utilities.top anchors.right: sidebar.left - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal } Sidebar.Wrapper { diff --git a/modules/drawers/Regions.qml b/modules/drawers/Regions.qml index d4281762..022d9661 100644 --- a/modules/drawers/Regions.qml +++ b/modules/drawers/Regions.qml @@ -2,7 +2,7 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell -import qs.config +import Caelestia.Config import qs.modules.bar as Bar Region { diff --git a/modules/launcher/AppList.qml b/modules/launcher/AppList.qml index 15d6e44a..7ce6038d 100644 --- a/modules/launcher/AppList.qml +++ b/modules/launcher/AppList.qml @@ -6,7 +6,7 @@ import qs.components import qs.components.containers import qs.components.controls import qs.services -import qs.config +import Caelestia.Config import qs.modules.launcher.items import qs.modules.launcher.services @@ -22,7 +22,7 @@ StyledListView { onValuesChanged: root.currentIndex = 0 } - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small orientation: Qt.Vertical implicitHeight: (Config.launcher.sizes.itemHeight + spacing) * Math.min(Config.launcher.maxShown, count) - spacing @@ -32,7 +32,7 @@ StyledListView { highlightFollowsCurrentItem: false highlight: StyledRect { - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: Colours.palette.m3onSurface opacity: 0.08 @@ -42,8 +42,8 @@ StyledListView { Behavior on y { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } } @@ -118,16 +118,16 @@ StyledListView { property: "opacity" from: 1 to: 0 - duration: Appearance.anim.durations.small - easing.bezierCurve: Appearance.anim.curves.standardAccel + duration: Tokens.anim.durations.small + easing.bezierCurve: Tokens.anim.curves.standardAccel } Anim { target: root property: "scale" from: 1 to: 0.9 - duration: Appearance.anim.durations.small - easing.bezierCurve: Appearance.anim.curves.standardAccel + duration: Tokens.anim.durations.small + easing.bezierCurve: Tokens.anim.curves.standardAccel } } PropertyAction { @@ -140,16 +140,16 @@ StyledListView { property: "opacity" from: 0 to: 1 - duration: Appearance.anim.durations.small - easing.bezierCurve: Appearance.anim.curves.standardDecel + duration: Tokens.anim.durations.small + easing.bezierCurve: Tokens.anim.curves.standardDecel } Anim { target: root property: "scale" from: 0.9 to: 1 - duration: Appearance.anim.durations.small - easing.bezierCurve: Appearance.anim.curves.standardDecel + duration: Tokens.anim.durations.small + easing.bezierCurve: Tokens.anim.curves.standardDecel } } PropertyAction { @@ -197,7 +197,7 @@ StyledListView { addDisplaced: Transition { Anim { property: "y" - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small } Anim { properties: "opacity,scale" diff --git a/modules/launcher/Content.qml b/modules/launcher/Content.qml index 8076eb54..49178db7 100644 --- a/modules/launcher/Content.qml +++ b/modules/launcher/Content.qml @@ -4,7 +4,7 @@ import QtQuick import qs.components import qs.components.controls import qs.services -import qs.config +import Caelestia.Config import qs.modules.launcher.services Item { @@ -14,8 +14,8 @@ Item { required property var panels required property real maxHeight - readonly property int padding: Appearance.padding.large - readonly property int rounding: Appearance.rounding.large + readonly property int padding: Tokens.padding.large + readonly property int rounding: Tokens.rounding.large implicitWidth: listWrapper.width + padding * 2 implicitHeight: searchWrapper.height + listWrapper.height + padding * 2 @@ -47,7 +47,7 @@ Item { id: searchWrapper color: Colours.layer(Colours.palette.m3surfaceContainer, 2) - radius: Appearance.rounding.full + radius: Tokens.rounding.full anchors.left: parent.left anchors.right: parent.right @@ -72,11 +72,11 @@ Item { anchors.left: searchIcon.right anchors.right: clearIcon.left - anchors.leftMargin: Appearance.spacing.small - anchors.rightMargin: Appearance.spacing.small + anchors.leftMargin: Tokens.spacing.small + anchors.rightMargin: Tokens.spacing.small - topPadding: Appearance.padding.larger - bottomPadding: Appearance.padding.larger + topPadding: Tokens.padding.larger + bottomPadding: Tokens.padding.larger placeholderText: qsTr("Type \"%1\" for commands").arg(Config.launcher.actionPrefix) @@ -176,13 +176,13 @@ Item { Behavior on width { Anim { - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small } } Behavior on opacity { Anim { - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small } } } diff --git a/modules/launcher/ContentList.qml b/modules/launcher/ContentList.qml index 775b193f..d36cfad9 100644 --- a/modules/launcher/ContentList.qml +++ b/modules/launcher/ContentList.qml @@ -4,7 +4,7 @@ import QtQuick import qs.components import qs.components.controls import qs.services -import qs.config +import Caelestia.Config import qs.utils Item { @@ -60,7 +60,7 @@ Item { property: "opacity" from: 1 to: 0 - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small } PropertyAction {} Anim { @@ -68,7 +68,7 @@ Item { property: "opacity" from: 0 to: 1 - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small } } } @@ -110,8 +110,8 @@ Item { opacity: root.currentList?.count === 0 ? 1 : 0 scale: root.currentList?.count === 0 ? 1 : 0.5 - spacing: Appearance.spacing.normal - padding: Appearance.padding.large + spacing: Tokens.spacing.normal + padding: Tokens.padding.large anchors.horizontalCenter: parent.horizontalCenter anchors.verticalCenter: parent.verticalCenter @@ -119,7 +119,7 @@ Item { MaterialIcon { text: root.state === "wallpapers" ? "wallpaper_slideshow" : "manage_search" color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.extraLarge + font.pointSize: Tokens.font.size.extraLarge anchors.verticalCenter: parent.verticalCenter } @@ -130,14 +130,14 @@ Item { StyledText { text: root.state === "wallpapers" ? qsTr("No wallpapers found") : qsTr("No results") color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.larger + font.pointSize: Tokens.font.size.larger font.weight: 500 } StyledText { text: root.state === "wallpapers" && Wallpapers.list.length === 0 ? qsTr("Try putting some wallpapers in %1").arg(Paths.shortenHome(Paths.wallsdir)) : qsTr("Try searching for something else") color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } } @@ -154,8 +154,8 @@ Item { enabled: root.visibilities.launcher Anim { - duration: Appearance.anim.durations.large - easing.bezierCurve: Appearance.anim.curves.emphasizedDecel + duration: Tokens.anim.durations.large + easing.bezierCurve: Tokens.anim.curves.emphasizedDecel } } @@ -163,8 +163,8 @@ Item { enabled: root.visibilities.launcher Anim { - duration: Appearance.anim.durations.large - easing.bezierCurve: Appearance.anim.curves.emphasizedDecel + duration: Tokens.anim.durations.large + easing.bezierCurve: Tokens.anim.curves.emphasizedDecel } } } diff --git a/modules/launcher/WallpaperList.qml b/modules/launcher/WallpaperList.qml index ad03e9de..dc2dd003 100644 --- a/modules/launcher/WallpaperList.qml +++ b/modules/launcher/WallpaperList.qml @@ -5,7 +5,7 @@ import QtQuick import Quickshell import qs.components.controls import qs.services -import qs.config +import Caelestia.Config PathView { id: root @@ -15,7 +15,7 @@ PathView { required property var panels required property var content - readonly property int itemWidth: Config.launcher.sizes.wallpaperWidth * 0.8 + Appearance.padding.larger * 2 + readonly property int itemWidth: Config.launcher.sizes.wallpaperWidth * 0.8 + Tokens.padding.larger * 2 readonly property int numItems: { const screen = (QsWindow.window as QsWindow)?.screen; diff --git a/modules/launcher/Wrapper.qml b/modules/launcher/Wrapper.qml index 5dfffeae..fda2a111 100644 --- a/modules/launcher/Wrapper.qml +++ b/modules/launcher/Wrapper.qml @@ -3,7 +3,7 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell import qs.components -import qs.config +import Caelestia.Config import qs.modules.launcher.services Item { @@ -16,7 +16,7 @@ Item { readonly property bool shouldBeActive: visibilities.launcher && Config.launcher.enabled readonly property real maxHeight: { - let max = screen.height - Config.border.thickness * 2 - Appearance.spacing.large; + let max = screen.height - Config.border.thickness * 2 - Tokens.spacing.large; if (visibilities.dashboard) max -= panels.dashboard.nonAnimHeight; return max; @@ -41,8 +41,8 @@ Item { Behavior on offsetScale { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } diff --git a/modules/launcher/items/ActionItem.qml b/modules/launcher/items/ActionItem.qml index a3ef00dd..c0fb4ac2 100644 --- a/modules/launcher/items/ActionItem.qml +++ b/modules/launcher/items/ActionItem.qml @@ -1,7 +1,7 @@ import QtQuick import qs.components import qs.services -import qs.config +import Caelestia.Config Item { id: root @@ -19,27 +19,27 @@ Item { root.modelData?.onClicked(root.list); } - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal } Item { anchors.fill: parent - anchors.leftMargin: Appearance.padding.larger - anchors.rightMargin: Appearance.padding.larger - anchors.margins: Appearance.padding.smaller + anchors.leftMargin: Tokens.padding.larger + anchors.rightMargin: Tokens.padding.larger + anchors.margins: Tokens.padding.smaller MaterialIcon { id: icon text: root.modelData?.icon ?? "" - font.pointSize: Appearance.font.size.extraLarge + font.pointSize: Tokens.font.size.extraLarge anchors.verticalCenter: parent.verticalCenter } Item { anchors.left: icon.right - anchors.leftMargin: Appearance.spacing.normal + anchors.leftMargin: Tokens.spacing.normal anchors.verticalCenter: icon.verticalCenter implicitWidth: parent.width - icon.width @@ -49,18 +49,18 @@ Item { id: name text: root.modelData?.name ?? "" - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } StyledText { id: desc text: root.modelData?.desc ?? "" - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: Colours.palette.m3outline elide: Text.ElideRight - width: root.width - icon.width - Appearance.rounding.normal * 2 + width: root.width - icon.width - Tokens.rounding.normal * 2 anchors.top: name.bottom } diff --git a/modules/launcher/items/AppItem.qml b/modules/launcher/items/AppItem.qml index 0b64c3da..e021275c 100644 --- a/modules/launcher/items/AppItem.qml +++ b/modules/launcher/items/AppItem.qml @@ -3,7 +3,7 @@ import Quickshell import Quickshell.Widgets import qs.components import qs.services -import qs.config +import Caelestia.Config import qs.utils import qs.modules.launcher.services @@ -24,14 +24,14 @@ Item { root.visibilities.launcher = false; } - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal } Item { anchors.fill: parent - anchors.leftMargin: Appearance.padding.larger - anchors.rightMargin: Appearance.padding.larger - anchors.margins: Appearance.padding.smaller + anchors.leftMargin: Tokens.padding.larger + anchors.rightMargin: Tokens.padding.larger + anchors.margins: Tokens.padding.smaller IconImage { id: icon @@ -45,7 +45,7 @@ Item { Item { anchors.left: icon.right - anchors.leftMargin: Appearance.spacing.normal + anchors.leftMargin: Tokens.spacing.normal anchors.verticalCenter: icon.verticalCenter implicitWidth: parent.width - icon.width - favouriteIcon.width @@ -55,18 +55,18 @@ Item { id: name text: root.modelData?.name ?? "" - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } StyledText { id: comment text: (root.modelData?.comment || root.modelData?.genericName || root.modelData?.name) ?? "" - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: Colours.palette.m3outline elide: Text.ElideRight - width: root.width - icon.width - favouriteIcon.width - Appearance.rounding.normal * 2 + width: root.width - icon.width - favouriteIcon.width - Tokens.rounding.normal * 2 anchors.top: name.bottom } diff --git a/modules/launcher/items/CalcItem.qml b/modules/launcher/items/CalcItem.qml index 369b35ef..a016f585 100644 --- a/modules/launcher/items/CalcItem.qml +++ b/modules/launcher/items/CalcItem.qml @@ -4,7 +4,7 @@ import Quickshell import Caelestia import qs.components import qs.services -import qs.config +import Caelestia.Config Item { id: root @@ -32,20 +32,20 @@ Item { root.onClicked(); } - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal } RowLayout { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.larger + anchors.margins: Tokens.padding.larger - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal MaterialIcon { text: "function" - font.pointSize: Appearance.font.size.extraLarge + font.pointSize: Tokens.font.size.extraLarge Layout.alignment: Qt.AlignVCenter } @@ -69,11 +69,11 @@ Item { StyledRect { color: Colours.palette.m3tertiary - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal clip: true - implicitWidth: (stateLayer.containsMouse ? label.implicitWidth + label.anchors.rightMargin : 0) + icon.implicitWidth + Appearance.padding.normal * 2 - implicitHeight: Math.max(label.implicitHeight, icon.implicitHeight) + Appearance.padding.small * 2 + implicitWidth: (stateLayer.containsMouse ? label.implicitWidth + label.anchors.rightMargin : 0) + icon.implicitWidth + Tokens.padding.normal * 2 + implicitHeight: Math.max(label.implicitHeight, icon.implicitHeight) + Tokens.padding.small * 2 Layout.alignment: Qt.AlignVCenter @@ -93,11 +93,11 @@ Item { anchors.verticalCenter: parent.verticalCenter anchors.right: icon.left - anchors.rightMargin: Appearance.spacing.small + anchors.rightMargin: Tokens.spacing.small text: qsTr("Open in calculator") color: Colours.palette.m3onTertiary - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal opacity: stateLayer.containsMouse ? 1 : 0 @@ -111,16 +111,16 @@ Item { anchors.verticalCenter: parent.verticalCenter anchors.right: parent.right - anchors.rightMargin: Appearance.padding.normal + anchors.rightMargin: Tokens.padding.normal text: "open_in_new" color: Colours.palette.m3onTertiary - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large } Behavior on implicitWidth { Anim { - easing.bezierCurve: Appearance.anim.curves.emphasized + easing.bezierCurve: Tokens.anim.curves.emphasized } } } diff --git a/modules/launcher/items/SchemeItem.qml b/modules/launcher/items/SchemeItem.qml index 6cc47aa4..2fbfabaa 100644 --- a/modules/launcher/items/SchemeItem.qml +++ b/modules/launcher/items/SchemeItem.qml @@ -1,7 +1,7 @@ import QtQuick import qs.components import qs.services -import qs.config +import Caelestia.Config import qs.modules.launcher.services Item { @@ -20,14 +20,14 @@ Item { root.modelData?.onClicked(root.list); } - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal } Item { anchors.fill: parent - anchors.leftMargin: Appearance.padding.larger - anchors.rightMargin: Appearance.padding.larger - anchors.margins: Appearance.padding.smaller + anchors.leftMargin: Tokens.padding.larger + anchors.rightMargin: Tokens.padding.larger + anchors.margins: Tokens.padding.smaller StyledRect { id: preview @@ -38,7 +38,7 @@ Item { border.color: Qt.alpha(`#${root.modelData?.colours?.outline}`, 0.5) color: `#${root.modelData?.colours?.surface}` - radius: Appearance.rounding.full + radius: Tokens.rounding.full implicitWidth: parent.height * 0.8 implicitHeight: parent.height * 0.8 @@ -57,27 +57,27 @@ Item { implicitWidth: preview.implicitWidth color: `#${root.modelData?.colours?.primary}` - radius: Appearance.rounding.full + radius: Tokens.rounding.full } } } Column { anchors.left: preview.right - anchors.leftMargin: Appearance.spacing.normal + anchors.leftMargin: Tokens.spacing.normal anchors.verticalCenter: parent.verticalCenter - width: parent.width - preview.width - anchors.leftMargin - (current.active ? current.width + Appearance.spacing.normal : 0) + width: parent.width - preview.width - anchors.leftMargin - (current.active ? current.width + Tokens.spacing.normal : 0) spacing: 0 StyledText { text: root.modelData?.flavour ?? "" - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } StyledText { text: root.modelData?.name ?? "" - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: Colours.palette.m3outline elide: Text.ElideRight @@ -98,7 +98,7 @@ Item { sourceComponent: MaterialIcon { text: "check" color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large } } } diff --git a/modules/launcher/items/VariantItem.qml b/modules/launcher/items/VariantItem.qml index b63539b7..73f66994 100644 --- a/modules/launcher/items/VariantItem.qml +++ b/modules/launcher/items/VariantItem.qml @@ -1,7 +1,7 @@ import QtQuick import qs.components import qs.services -import qs.config +import Caelestia.Config import qs.modules.launcher.services Item { @@ -20,40 +20,40 @@ Item { root.modelData?.onClicked(root.list); } - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal } Item { anchors.fill: parent - anchors.leftMargin: Appearance.padding.larger - anchors.rightMargin: Appearance.padding.larger - anchors.margins: Appearance.padding.smaller + anchors.leftMargin: Tokens.padding.larger + anchors.rightMargin: Tokens.padding.larger + anchors.margins: Tokens.padding.smaller MaterialIcon { id: icon text: root.modelData?.icon ?? "" - font.pointSize: Appearance.font.size.extraLarge + font.pointSize: Tokens.font.size.extraLarge anchors.verticalCenter: parent.verticalCenter } Column { anchors.left: icon.right - anchors.leftMargin: Appearance.spacing.larger + anchors.leftMargin: Tokens.spacing.larger anchors.verticalCenter: icon.verticalCenter - width: parent.width - icon.width - anchors.leftMargin - (current.active ? current.width + Appearance.spacing.normal : 0) + width: parent.width - icon.width - anchors.leftMargin - (current.active ? current.width + Tokens.spacing.normal : 0) spacing: 0 StyledText { text: root.modelData?.name ?? "" - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } StyledText { text: root.modelData?.description ?? "" - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small color: Colours.palette.m3outline elide: Text.ElideRight @@ -74,7 +74,7 @@ Item { sourceComponent: MaterialIcon { text: "check" color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large } } } diff --git a/modules/launcher/items/WallpaperItem.qml b/modules/launcher/items/WallpaperItem.qml index beb93426..7ffa75f7 100644 --- a/modules/launcher/items/WallpaperItem.qml +++ b/modules/launcher/items/WallpaperItem.qml @@ -4,7 +4,7 @@ import qs.components import qs.components.effects import qs.components.images import qs.services -import qs.config +import Caelestia.Config Item { id: root @@ -21,8 +21,8 @@ Item { opacity = Qt.binding(() => PathView.onPath ? 1 : 0); } - implicitWidth: image.width + Appearance.padding.larger * 2 - implicitHeight: image.height + label.height + Appearance.spacing.small / 2 + Appearance.padding.large + Appearance.padding.normal + implicitWidth: image.width + Tokens.padding.larger * 2 + implicitHeight: image.height + label.height + Tokens.spacing.small / 2 + Tokens.padding.large + Tokens.padding.normal StateLayer { function onClicked(): void { @@ -30,7 +30,7 @@ Item { root.visibilities.launcher = false; } - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal } Elevation { @@ -48,9 +48,9 @@ Item { id: image anchors.horizontalCenter: parent.horizontalCenter - y: Appearance.padding.large + y: Tokens.padding.large color: Colours.tPalette.m3surfaceContainer - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal implicitWidth: Config.launcher.sizes.wallpaperWidth implicitHeight: implicitWidth / 16 * 9 @@ -59,7 +59,7 @@ Item { anchors.centerIn: parent text: "image" color: Colours.tPalette.m3outline - font.pointSize: Appearance.font.size.extraLarge * 2 + font.pointSize: Tokens.font.size.extraLarge * 2 font.weight: 600 } @@ -76,15 +76,15 @@ Item { id: label anchors.top: image.bottom - anchors.topMargin: Appearance.spacing.small / 2 + anchors.topMargin: Tokens.spacing.small / 2 anchors.horizontalCenter: parent.horizontalCenter - width: image.width - Appearance.padding.normal * 2 + width: image.width - Tokens.padding.normal * 2 horizontalAlignment: Text.AlignHCenter elide: Text.ElideRight renderType: Text.QtRendering text: root.modelData.relativePath - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } Behavior on scale { diff --git a/modules/launcher/services/Actions.qml b/modules/launcher/services/Actions.qml index 2a76012f..29ed6905 100644 --- a/modules/launcher/services/Actions.qml +++ b/modules/launcher/services/Actions.qml @@ -4,7 +4,7 @@ import ".." import QtQuick import Quickshell import qs.services -import qs.config +import Caelestia.Config import qs.utils Searcher { diff --git a/modules/launcher/services/Apps.qml b/modules/launcher/services/Apps.qml index 1f1f3570..57461ffb 100644 --- a/modules/launcher/services/Apps.qml +++ b/modules/launcher/services/Apps.qml @@ -2,7 +2,7 @@ pragma Singleton import Quickshell import Caelestia -import qs.config +import Caelestia.Config import qs.utils Searcher { diff --git a/modules/launcher/services/M3Variants.qml b/modules/launcher/services/M3Variants.qml index a951b8c6..d7d7bf56 100644 --- a/modules/launcher/services/M3Variants.qml +++ b/modules/launcher/services/M3Variants.qml @@ -3,7 +3,7 @@ pragma Singleton import ".." import QtQuick import Quickshell -import qs.config +import Caelestia.Config import qs.utils Searcher { diff --git a/modules/launcher/services/Schemes.qml b/modules/launcher/services/Schemes.qml index d389aa17..571cb101 100644 --- a/modules/launcher/services/Schemes.qml +++ b/modules/launcher/services/Schemes.qml @@ -4,7 +4,7 @@ import ".." import QtQuick import Quickshell import Quickshell.Io -import qs.config +import Caelestia.Config import qs.utils Searcher { diff --git a/modules/lock/Center.qml b/modules/lock/Center.qml index 73b6e670..95cd6018 100644 --- a/modules/lock/Center.qml +++ b/modules/lock/Center.qml @@ -6,7 +6,7 @@ import qs.components import qs.components.controls import qs.components.images import qs.services -import qs.config +import Caelestia.Config import qs.utils ColumnLayout { @@ -20,18 +20,18 @@ ColumnLayout { Layout.fillWidth: false Layout.fillHeight: true - spacing: Appearance.spacing.large * 2 + spacing: Tokens.spacing.large * 2 RowLayout { Layout.alignment: Qt.AlignHCenter - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small StyledText { Layout.alignment: Qt.AlignVCenter text: Time.hourStr color: Colours.palette.m3secondary - font.pointSize: Math.floor(Appearance.font.size.extraLarge * 3 * root.centerScale) - font.family: Appearance.font.family.clock + font.pointSize: Math.floor(Tokens.font.size.extraLarge * 3 * root.centerScale) + font.family: Tokens.font.family.clock font.bold: true } @@ -39,8 +39,8 @@ ColumnLayout { Layout.alignment: Qt.AlignVCenter text: ":" color: Colours.palette.m3primary - font.pointSize: Math.floor(Appearance.font.size.extraLarge * 3 * root.centerScale) - font.family: Appearance.font.family.clock + font.pointSize: Math.floor(Tokens.font.size.extraLarge * 3 * root.centerScale) + font.family: Tokens.font.family.clock font.bold: true } @@ -48,14 +48,14 @@ ColumnLayout { Layout.alignment: Qt.AlignVCenter text: Time.minuteStr color: Colours.palette.m3secondary - font.pointSize: Math.floor(Appearance.font.size.extraLarge * 3 * root.centerScale) - font.family: Appearance.font.family.clock + font.pointSize: Math.floor(Tokens.font.size.extraLarge * 3 * root.centerScale) + font.family: Tokens.font.family.clock font.bold: true } Loader { asynchronous: true - Layout.leftMargin: Appearance.spacing.small + Layout.leftMargin: Tokens.spacing.small Layout.alignment: Qt.AlignVCenter active: Config.services.useTwelveHourClock @@ -64,8 +64,8 @@ ColumnLayout { sourceComponent: StyledText { text: Time.amPmStr color: Colours.palette.m3primary - font.pointSize: Math.floor(Appearance.font.size.extraLarge * 2 * root.centerScale) - font.family: Appearance.font.family.clock + font.pointSize: Math.floor(Tokens.font.size.extraLarge * 2 * root.centerScale) + font.family: Tokens.font.family.clock font.bold: true } } @@ -73,24 +73,24 @@ ColumnLayout { StyledText { Layout.alignment: Qt.AlignHCenter - Layout.topMargin: -Appearance.padding.large * 2 + Layout.topMargin: -Tokens.padding.large * 2 text: Time.format("dddd, d MMMM yyyy") color: Colours.palette.m3tertiary - font.pointSize: Math.floor(Appearance.font.size.extraLarge * root.centerScale) - font.family: Appearance.font.family.mono + font.pointSize: Math.floor(Tokens.font.size.extraLarge * root.centerScale) + font.family: Tokens.font.family.mono font.bold: true } StyledClippingRect { - Layout.topMargin: Appearance.spacing.large * 2 + Layout.topMargin: Tokens.spacing.large * 2 Layout.alignment: Qt.AlignHCenter implicitWidth: root.centerWidth / 2 implicitHeight: root.centerWidth / 2 color: Colours.tPalette.m3surfaceContainer - radius: Appearance.rounding.full + radius: Tokens.rounding.full MaterialIcon { anchors.centerIn: parent @@ -113,10 +113,10 @@ ColumnLayout { Layout.alignment: Qt.AlignHCenter implicitWidth: root.centerWidth * 0.8 - implicitHeight: input.implicitHeight + Appearance.padding.small * 2 + implicitHeight: input.implicitHeight + Tokens.padding.small * 2 color: Colours.tPalette.m3surfaceContainer - radius: Appearance.rounding.full + radius: Tokens.rounding.full focus: true onActiveFocusChanged: { @@ -147,12 +147,12 @@ ColumnLayout { id: input anchors.fill: parent - anchors.margins: Appearance.padding.small - spacing: Appearance.spacing.normal + anchors.margins: Tokens.padding.small + spacing: Tokens.spacing.normal Item { implicitWidth: implicitHeight - implicitHeight: fprintIcon.implicitHeight + Appearance.padding.small * 2 + implicitHeight: fprintIcon.implicitHeight + Tokens.padding.small * 2 MaterialIcon { id: fprintIcon @@ -188,10 +188,10 @@ ColumnLayout { StyledRect { implicitWidth: implicitHeight - implicitHeight: enterIcon.implicitHeight + Appearance.padding.small * 2 + implicitHeight: enterIcon.implicitHeight + Tokens.padding.small * 2 color: root.lock.pam.buffer ? Colours.palette.m3primary : Colours.layer(Colours.palette.m3surfaceContainerHigh, 2) - radius: Appearance.rounding.full + radius: Tokens.rounding.full StateLayer { function onClicked(): void { @@ -215,7 +215,7 @@ ColumnLayout { Item { Layout.fillWidth: true - Layout.topMargin: -Appearance.spacing.large + Layout.topMargin: -Tokens.spacing.large implicitHeight: Math.max(message.implicitHeight, stateMessage.implicitHeight) @@ -272,7 +272,7 @@ ColumnLayout { color: Colours.palette.m3onSurfaceVariant animateProp: "opacity" - font.family: Appearance.font.family.mono + font.family: Tokens.font.family.mono horizontalAlignment: Qt.AlignHCenter wrapMode: Text.WrapAtWordBoundaryOrAnywhere lineHeight: 1.2 @@ -327,8 +327,8 @@ ColumnLayout { opacity: 0 color: Colours.palette.m3error - font.pointSize: Appearance.font.size.small - font.family: Appearance.font.family.mono + font.pointSize: Tokens.font.size.small + font.family: Tokens.font.family.mono horizontalAlignment: Qt.AlignHCenter wrapMode: Text.WrapAtWordBoundaryOrAnywhere @@ -397,13 +397,13 @@ ColumnLayout { target: message property: "scale" to: 0.7 - duration: Appearance.anim.durations.large + duration: Tokens.anim.durations.large } Anim { target: message property: "opacity" to: 0 - duration: Appearance.anim.durations.large + duration: Tokens.anim.durations.large } } } @@ -412,7 +412,7 @@ ColumnLayout { component FlashAnim: NumberAnimation { target: message property: "opacity" - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small easing.type: Easing.Linear } } diff --git a/modules/lock/Content.qml b/modules/lock/Content.qml index 4427099f..17578031 100644 --- a/modules/lock/Content.qml +++ b/modules/lock/Content.qml @@ -2,25 +2,25 @@ import QtQuick import QtQuick.Layouts import qs.components import qs.services -import qs.config +import Caelestia.Config RowLayout { id: root required property var lock - spacing: Appearance.spacing.large * 2 + spacing: Tokens.spacing.large * 2 ColumnLayout { Layout.fillWidth: true - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal StyledRect { Layout.fillWidth: true implicitHeight: weather.implicitHeight - topLeftRadius: Appearance.rounding.large - radius: Appearance.rounding.small + topLeftRadius: Tokens.rounding.large + radius: Tokens.rounding.small color: Colours.tPalette.m3surfaceContainer WeatherInfo { @@ -34,7 +34,7 @@ RowLayout { Layout.fillWidth: true Layout.fillHeight: true - radius: Appearance.rounding.small + radius: Tokens.rounding.small color: Colours.tPalette.m3surfaceContainer Fetch {} @@ -44,8 +44,8 @@ RowLayout { Layout.fillWidth: true implicitHeight: media.implicitHeight - bottomLeftRadius: Appearance.rounding.large - radius: Appearance.rounding.small + bottomLeftRadius: Tokens.rounding.large + radius: Tokens.rounding.small color: Colours.tPalette.m3surfaceContainer Media { @@ -62,14 +62,14 @@ RowLayout { ColumnLayout { Layout.fillWidth: true - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal StyledRect { Layout.fillWidth: true implicitHeight: resources.implicitHeight - topRightRadius: Appearance.rounding.large - radius: Appearance.rounding.small + topRightRadius: Tokens.rounding.large + radius: Tokens.rounding.small color: Colours.tPalette.m3surfaceContainer Resources { @@ -81,8 +81,8 @@ RowLayout { Layout.fillWidth: true Layout.fillHeight: true - bottomRightRadius: Appearance.rounding.large - radius: Appearance.rounding.small + bottomRightRadius: Tokens.rounding.large + radius: Tokens.rounding.small color: Colours.tPalette.m3surfaceContainer NotifDock { diff --git a/modules/lock/Fetch.qml b/modules/lock/Fetch.qml index ab6de7b6..d3ba56e3 100644 --- a/modules/lock/Fetch.qml +++ b/modules/lock/Fetch.qml @@ -6,36 +6,36 @@ import Quickshell.Services.UPower import qs.components import qs.components.effects import qs.services -import qs.config +import Caelestia.Config import qs.utils ColumnLayout { id: root anchors.fill: parent - anchors.margins: Appearance.padding.large * 2 - anchors.topMargin: Appearance.padding.large + anchors.margins: Tokens.padding.large * 2 + anchors.topMargin: Tokens.padding.large - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small RowLayout { Layout.fillWidth: true Layout.fillHeight: false - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal StyledRect { - implicitWidth: prompt.implicitWidth + Appearance.padding.normal * 2 - implicitHeight: prompt.implicitHeight + Appearance.padding.normal * 2 + implicitWidth: prompt.implicitWidth + Tokens.padding.normal * 2 + implicitHeight: prompt.implicitHeight + Tokens.padding.normal * 2 color: Colours.palette.m3primary - radius: Appearance.rounding.small + radius: Tokens.rounding.small MonoText { id: prompt anchors.centerIn: parent text: ">" - font.pointSize: root.width > 400 ? Appearance.font.size.larger : Appearance.font.size.normal + font.pointSize: root.width > 400 ? Tokens.font.size.larger : Tokens.font.size.normal color: Colours.palette.m3onPrimary } } @@ -43,7 +43,7 @@ ColumnLayout { MonoText { Layout.fillWidth: true text: "caelestiafetch.sh" - font.pointSize: root.width > 400 ? Appearance.font.size.larger : Appearance.font.size.normal + font.pointSize: root.width > 400 ? Tokens.font.size.larger : Tokens.font.size.normal elide: Text.ElideRight } @@ -71,10 +71,10 @@ ColumnLayout { ColumnLayout { Layout.fillWidth: true - Layout.topMargin: Appearance.padding.normal - Layout.bottomMargin: Appearance.padding.normal + Layout.topMargin: Tokens.padding.normal + Layout.bottomMargin: Tokens.padding.normal Layout.leftMargin: iconLoader.active ? 0 : width * 0.1 - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal WrappedLoader { Layout.fillWidth: true @@ -125,18 +125,18 @@ ColumnLayout { active: root.height > 180 sourceComponent: RowLayout { - spacing: Appearance.spacing.large + spacing: Tokens.spacing.large Repeater { - model: Math.max(0, Math.min(8, root.width / (Appearance.font.size.larger * 2 + Appearance.spacing.large))) + model: Math.max(0, Math.min(8, root.width / (Tokens.font.size.larger * 2 + Tokens.spacing.large))) StyledRect { required property int index implicitWidth: implicitHeight - implicitHeight: Appearance.font.size.larger * 2 + implicitHeight: Tokens.font.size.larger * 2 color: Colours.palette[`term${index}`] - radius: Appearance.rounding.small + radius: Tokens.rounding.small } } } @@ -168,11 +168,11 @@ ColumnLayout { component FetchText: MonoText { Layout.fillWidth: true - font.pointSize: root.width > 400 ? Appearance.font.size.larger : Appearance.font.size.normal + font.pointSize: root.width > 400 ? Tokens.font.size.larger : Tokens.font.size.normal elide: Text.ElideRight } component MonoText: StyledText { - font.family: Appearance.font.family.mono + font.family: Tokens.font.family.mono } } diff --git a/modules/lock/InputField.qml b/modules/lock/InputField.qml index 1286267a..fdae94f7 100644 --- a/modules/lock/InputField.qml +++ b/modules/lock/InputField.qml @@ -5,7 +5,7 @@ import QtQuick.Layouts import Quickshell import qs.components import qs.services -import qs.config +import Caelestia.Config Item { id: root @@ -49,8 +49,8 @@ Item { animate: true color: root.pam.passwd.active ? Colours.palette.m3secondary : Colours.palette.m3outline - font.pointSize: Appearance.font.size.normal - font.family: Appearance.font.family.mono + font.pointSize: Tokens.font.size.normal + font.family: Tokens.font.family.mono opacity: root.buffer ? 0 : 1 @@ -74,10 +74,10 @@ Item { anchors.horizontalCenterOffset: implicitWidth > root.width ? -(implicitWidth - root.width) / 2 : 0 implicitWidth: fullWidth - implicitHeight: Appearance.font.size.normal + implicitHeight: Tokens.font.size.normal orientation: Qt.Horizontal - spacing: Appearance.spacing.small / 2 + spacing: Tokens.spacing.small / 2 interactive: false model: ScriptModel { @@ -91,7 +91,7 @@ Item { implicitHeight: charList.implicitHeight color: Colours.palette.m3onSurface - radius: Appearance.rounding.small / 2 + radius: Tokens.rounding.small / 2 opacity: 0 scale: 0 @@ -134,8 +134,8 @@ Item { Behavior on scale { Anim { - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } } } diff --git a/modules/lock/LockSurface.qml b/modules/lock/LockSurface.qml index 46862f83..c0c1bfd3 100644 --- a/modules/lock/LockSurface.qml +++ b/modules/lock/LockSurface.qml @@ -5,7 +5,7 @@ import QtQuick.Effects import Quickshell.Wayland import qs.components import qs.services -import qs.config +import Caelestia.Config WlSessionLockSurface { id: root @@ -33,8 +33,8 @@ WlSessionLockSurface { target: lockContent properties: "implicitWidth,implicitHeight" to: lockContent.size - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } Anim { target: lockBg @@ -45,30 +45,30 @@ WlSessionLockSurface { target: content property: "scale" to: 0 - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } Anim { target: content property: "opacity" to: 0 - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small } Anim { target: lockIcon property: "opacity" to: 1 - duration: Appearance.anim.durations.large + duration: Tokens.anim.durations.large } Anim { target: background property: "opacity" to: 0 - duration: Appearance.anim.durations.large + duration: Tokens.anim.durations.large } SequentialAnimation { PauseAnimation { - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small } Anim { target: lockContent @@ -93,7 +93,7 @@ WlSessionLockSurface { target: background property: "opacity" to: 1 - duration: Appearance.anim.durations.large + duration: Tokens.anim.durations.large } SequentialAnimation { ParallelAnimation { @@ -101,15 +101,15 @@ WlSessionLockSurface { target: lockContent property: "scale" to: 1 - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } Anim { target: lockContent property: "rotation" to: 360 - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.standardAccel + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.standardAccel } } ParallelAnimation { @@ -117,7 +117,7 @@ WlSessionLockSurface { target: lockIcon property: "rotation" to: 360 - easing.bezierCurve: Appearance.anim.curves.standardDecel + easing.bezierCurve: Tokens.anim.curves.standardDecel } Anim { target: lockIcon @@ -133,27 +133,27 @@ WlSessionLockSurface { target: content property: "scale" to: 1 - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } Anim { target: lockBg property: "radius" - to: Appearance.rounding.large * 1.5 + to: Tokens.rounding.large * 1.5 } Anim { target: lockContent property: "implicitWidth" to: (root.screen?.height ?? 0) * Config.lock.sizes.heightMult * Config.lock.sizes.ratio - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } Anim { target: lockContent property: "implicitHeight" to: (root.screen?.height ?? 0) * Config.lock.sizes.heightMult - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } } @@ -179,8 +179,8 @@ WlSessionLockSurface { Item { id: lockContent - readonly property int size: lockIcon.implicitHeight + Appearance.padding.large * 4 - readonly property int radius: size / 4 * Appearance.rounding.scale + readonly property int size: lockIcon.implicitHeight + Tokens.padding.large * 4 + readonly property int radius: size / 4 * Tokens.rounding.scale anchors.centerIn: parent implicitWidth: size @@ -210,7 +210,7 @@ WlSessionLockSurface { anchors.centerIn: parent text: "lock" - font.pointSize: Appearance.font.size.extraLarge * 4 + font.pointSize: Tokens.font.size.extraLarge * 4 font.bold: true rotation: 180 } @@ -219,8 +219,8 @@ WlSessionLockSurface { id: content anchors.centerIn: parent - width: (root.screen?.height ?? 0) * Config.lock.sizes.heightMult * Config.lock.sizes.ratio - Appearance.padding.large * 2 - height: (root.screen?.height ?? 0) * Config.lock.sizes.heightMult - Appearance.padding.large * 2 + width: (root.screen?.height ?? 0) * Config.lock.sizes.heightMult * Config.lock.sizes.ratio - Tokens.padding.large * 2 + height: (root.screen?.height ?? 0) * Config.lock.sizes.heightMult - Tokens.padding.large * 2 lock: root opacity: 0 diff --git a/modules/lock/Media.qml b/modules/lock/Media.qml index 9d2a0367..c93d830e 100644 --- a/modules/lock/Media.qml +++ b/modules/lock/Media.qml @@ -5,7 +5,7 @@ import QtQuick.Layouts import qs.components import qs.components.effects import qs.services -import qs.config +import Caelestia.Config Item { id: root @@ -34,7 +34,7 @@ Item { Behavior on opacity { Anim { - duration: Appearance.anim.durations.extraLarge + duration: Tokens.anim.durations.extraLarge } } } @@ -69,14 +69,14 @@ Item { anchors.left: parent.left anchors.right: parent.right - anchors.margins: Appearance.padding.large + anchors.margins: Tokens.padding.large StyledText { - Layout.topMargin: Appearance.padding.large - Layout.bottomMargin: Appearance.spacing.larger + Layout.topMargin: Tokens.padding.large + Layout.bottomMargin: Tokens.spacing.larger text: qsTr("Now playing") color: Colours.palette.m3onSurfaceVariant - font.family: Appearance.font.family.mono + font.family: Tokens.font.family.mono font.weight: 500 } @@ -86,8 +86,8 @@ Item { text: Players.active?.trackArtist ?? qsTr("No media") color: Colours.palette.m3primary horizontalAlignment: Text.AlignHCenter - font.pointSize: Appearance.font.size.large - font.family: Appearance.font.family.mono + font.pointSize: Tokens.font.size.large + font.family: Tokens.font.family.mono font.weight: 600 elide: Text.ElideRight } @@ -97,17 +97,17 @@ Item { animate: true text: Players.active?.trackTitle ?? qsTr("No media") horizontalAlignment: Text.AlignHCenter - font.pointSize: Appearance.font.size.larger - font.family: Appearance.font.family.mono + font.pointSize: Tokens.font.size.larger + font.family: Tokens.font.family.mono elide: Text.ElideRight } RowLayout { Layout.alignment: Qt.AlignHCenter - Layout.topMargin: Appearance.spacing.large * 1.2 - Layout.bottomMargin: Appearance.padding.large + Layout.topMargin: Tokens.spacing.large * 1.2 + Layout.bottomMargin: Tokens.padding.large - spacing: Appearance.spacing.large + spacing: Tokens.spacing.large PlayerControl { function onClicked(): void { @@ -154,12 +154,12 @@ Item { function onClicked(): void { } - Layout.preferredWidth: implicitWidth + (controlState.pressed ? Appearance.padding.normal * 2 : active ? Appearance.padding.small * 2 : 0) - implicitWidth: controlIcon.implicitWidth + Appearance.padding.large * 2 - implicitHeight: controlIcon.implicitHeight + Appearance.padding.normal * 2 + Layout.preferredWidth: implicitWidth + (controlState.pressed ? Tokens.padding.normal * 2 : active ? Tokens.padding.small * 2 : 0) + implicitWidth: controlIcon.implicitWidth + Tokens.padding.large * 2 + implicitHeight: controlIcon.implicitHeight + Tokens.padding.normal * 2 color: active ? Colours.palette[`m3${colour.toLowerCase()}`] : Colours.palette[`m3${colour.toLowerCase()}Container`] - radius: active || controlState.pressed ? Appearance.rounding.normal : Math.min(implicitWidth, implicitHeight) / 2 * Math.min(1, Appearance.rounding.scale) + radius: active || controlState.pressed ? Tokens.rounding.normal : Math.min(implicitWidth, implicitHeight) / 2 * Math.min(1, Tokens.rounding.scale) Elevation { anchors.fill: parent @@ -183,7 +183,7 @@ Item { anchors.centerIn: parent color: control.active ? Colours.palette[`m3on${control.colour}`] : Colours.palette[`m3on${control.colour}Container`] - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large fill: control.active ? 1 : 0 Behavior on fill { @@ -193,15 +193,15 @@ Item { Behavior on Layout.preferredWidth { Anim { - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } } Behavior on radius { Anim { - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } } } diff --git a/modules/lock/NotifDock.qml b/modules/lock/NotifDock.qml index 50fe2153..131eeec2 100644 --- a/modules/lock/NotifDock.qml +++ b/modules/lock/NotifDock.qml @@ -8,7 +8,7 @@ import qs.components import qs.components.containers import qs.components.effects import qs.services -import qs.config +import Caelestia.Config import qs.utils ColumnLayout { @@ -17,15 +17,15 @@ ColumnLayout { required property var lock anchors.fill: parent - anchors.margins: Appearance.padding.large + anchors.margins: Tokens.padding.large - spacing: Appearance.spacing.smaller + spacing: Tokens.spacing.smaller StyledText { Layout.fillWidth: true text: Notifs.list.length > 0 ? qsTr("%1 notification%2").arg(Notifs.list.length).arg(Notifs.list.length === 1 ? "" : "s") : qsTr("Notifications") color: Colours.palette.m3outline - font.family: Appearance.font.family.mono + font.family: Tokens.font.family.mono font.weight: 500 elide: Text.ElideRight } @@ -36,7 +36,7 @@ ColumnLayout { Layout.fillWidth: true Layout.fillHeight: true - radius: Appearance.rounding.small + radius: Tokens.rounding.small color: "transparent" Loader { @@ -46,7 +46,7 @@ ColumnLayout { opacity: Notifs.list.length > 0 && !Config.lock.hideNotifs ? 0 : 1 sourceComponent: ColumnLayout { - spacing: Appearance.spacing.large + spacing: Tokens.spacing.large Image { asynchronous: true @@ -65,15 +65,15 @@ ColumnLayout { Layout.alignment: Qt.AlignHCenter text: Config.lock.hideNotifs ? qsTr("Unlock for Notifications") : qsTr("No Notifications") color: Colours.palette.m3outlineVariant - font.pointSize: Appearance.font.size.large - font.family: Appearance.font.family.mono + font.pointSize: Tokens.font.size.large + font.family: Tokens.font.family.mono font.weight: 500 } } Behavior on opacity { Anim { - duration: Appearance.anim.durations.extraLarge + duration: Tokens.anim.durations.extraLarge } } } @@ -81,7 +81,7 @@ ColumnLayout { StyledListView { anchors.fill: parent visible: !Config.lock.hideNotifs - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small clip: true model: ScriptModel { @@ -103,8 +103,8 @@ ColumnLayout { property: "scale" from: 0 to: 1 - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } @@ -126,8 +126,8 @@ ColumnLayout { } Anim { property: "y" - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } @@ -138,8 +138,8 @@ ColumnLayout { } Anim { property: "y" - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } } diff --git a/modules/lock/NotifGroup.qml b/modules/lock/NotifGroup.qml index 133dc626..c8e5426e 100644 --- a/modules/lock/NotifGroup.qml +++ b/modules/lock/NotifGroup.qml @@ -8,7 +8,7 @@ import Quickshell.Services.Notifications import qs.components import qs.components.effects import qs.services -import qs.config +import Caelestia.Config import qs.utils StyledRect { @@ -46,10 +46,10 @@ StyledRect { anchors.left: parent?.left anchors.right: parent?.right - implicitHeight: content.implicitHeight + Appearance.padding.normal * 2 + implicitHeight: content.implicitHeight + Tokens.padding.normal * 2 clip: true - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: root.urgency === "critical" ? Colours.palette.m3secondaryContainer : Colours.layer(Colours.palette.m3surfaceContainerHigh, 2) RowLayout { @@ -58,9 +58,9 @@ StyledRect { anchors.left: parent.left anchors.right: parent.right anchors.top: parent.top - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal Item { Layout.alignment: Qt.AlignLeft | Qt.AlignTop @@ -99,14 +99,14 @@ StyledRect { MaterialIcon { text: Icons.getNotifIcon(root.notifs[0]?.summary, root.urgency) color: root.urgency === "critical" ? Colours.palette.m3onError : root.urgency === "low" ? Colours.palette.m3onSurface : Colours.palette.m3onSecondaryContainer - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large } } ClippingRectangle { anchors.fill: parent color: root.urgency === "critical" ? Colours.palette.m3error : root.urgency === "low" ? Colours.layer(Colours.palette.m3surfaceContainerHighest, 3) : Colours.palette.m3secondaryContainer - radius: Appearance.rounding.full + radius: Tokens.rounding.full Loader { asynchronous: true @@ -126,7 +126,7 @@ StyledRect { implicitHeight: Config.notifs.sizes.badge color: root.urgency === "critical" ? Colours.palette.m3error : root.urgency === "low" ? Colours.palette.m3surfaceContainerHighest : Colours.palette.m3secondaryContainer - radius: Appearance.rounding.full + radius: Tokens.rounding.full ColouredIcon { anchors.centerIn: parent @@ -140,21 +140,21 @@ StyledRect { } ColumnLayout { - Layout.topMargin: -Appearance.padding.small - Layout.bottomMargin: -Appearance.padding.small / 2 - (root.expanded ? 0 : spacing) + Layout.topMargin: -Tokens.padding.small + Layout.bottomMargin: -Tokens.padding.small / 2 - (root.expanded ? 0 : spacing) Layout.fillWidth: true - spacing: Math.round(Appearance.spacing.small / 2) + spacing: Math.round(Tokens.spacing.small / 2) RowLayout { Layout.bottomMargin: -parent.spacing Layout.fillWidth: true - spacing: Appearance.spacing.smaller + spacing: Tokens.spacing.smaller StyledText { Layout.fillWidth: true text: root.modelData color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small elide: Text.ElideRight } @@ -162,15 +162,15 @@ StyledRect { animate: true text: root.notifs[0]?.timeStr ?? "" color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } StyledRect { - implicitWidth: expandBtn.implicitWidth + Appearance.padding.smaller * 2 - implicitHeight: groupCount.implicitHeight + Appearance.padding.small + implicitWidth: expandBtn.implicitWidth + Tokens.padding.smaller * 2 + implicitHeight: groupCount.implicitHeight + Tokens.padding.small color: root.urgency === "critical" ? Colours.palette.m3error : Colours.layer(Colours.palette.m3surfaceContainerHighest, 2) - radius: Appearance.rounding.full + radius: Tokens.rounding.full opacity: root.notifs.length > Config.notifs.groupPreviewNum ? 1 : 0 Layout.preferredWidth: root.notifs.length > Config.notifs.groupPreviewNum ? implicitWidth : 0 @@ -187,20 +187,20 @@ StyledRect { id: expandBtn anchors.centerIn: parent - spacing: Appearance.spacing.small / 2 + spacing: Tokens.spacing.small / 2 StyledText { id: groupCount - Layout.leftMargin: Appearance.padding.small / 2 + Layout.leftMargin: Tokens.padding.small / 2 animate: true text: root.notifs.length color: root.urgency === "critical" ? Colours.palette.m3onError : Colours.palette.m3onSurface - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } MaterialIcon { - Layout.rightMargin: -Appearance.padding.small / 2 + Layout.rightMargin: -Tokens.padding.small / 2 animate: true text: root.expanded ? "expand_less" : "expand_more" color: root.urgency === "critical" ? Colours.palette.m3onError : Colours.palette.m3onSurface @@ -298,8 +298,8 @@ StyledRect { Behavior on implicitHeight { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } diff --git a/modules/lock/Pam.qml b/modules/lock/Pam.qml index 8345ebc4..8f780ea0 100644 --- a/modules/lock/Pam.qml +++ b/modules/lock/Pam.qml @@ -3,7 +3,7 @@ import Quickshell import Quickshell.Io import Quickshell.Wayland import Quickshell.Services.Pam -import qs.config +import Caelestia.Config Scope { id: root diff --git a/modules/lock/Resources.qml b/modules/lock/Resources.qml index 33c0e4c0..59a470d0 100644 --- a/modules/lock/Resources.qml +++ b/modules/lock/Resources.qml @@ -4,17 +4,17 @@ import qs.components import qs.components.controls import qs.components.misc import qs.services -import qs.config +import Caelestia.Config GridLayout { id: root anchors.left: parent.left anchors.right: parent.right - anchors.margins: Appearance.padding.large + anchors.margins: Tokens.padding.large - rowSpacing: Appearance.spacing.large - columnSpacing: Appearance.spacing.large + rowSpacing: Tokens.spacing.large + columnSpacing: Tokens.spacing.large rows: 2 columns: 2 @@ -23,28 +23,28 @@ GridLayout { } Resource { - Layout.topMargin: Appearance.padding.large + Layout.topMargin: Tokens.padding.large icon: "memory" value: SystemUsage.cpuPerc colour: Colours.palette.m3primary } Resource { - Layout.topMargin: Appearance.padding.large + Layout.topMargin: Tokens.padding.large icon: "thermostat" value: Math.min(1, SystemUsage.cpuTemp / 90) colour: Colours.palette.m3secondary } Resource { - Layout.bottomMargin: Appearance.padding.large + Layout.bottomMargin: Tokens.padding.large icon: "memory_alt" value: SystemUsage.memPerc colour: Colours.palette.m3secondary } Resource { - Layout.bottomMargin: Appearance.padding.large + Layout.bottomMargin: Tokens.padding.large icon: "hard_disk" value: SystemUsage.storagePerc colour: Colours.palette.m3tertiary @@ -61,17 +61,17 @@ GridLayout { implicitHeight: width color: Colours.layer(Colours.palette.m3surfaceContainerHigh, 2) - radius: Appearance.rounding.large + radius: Tokens.rounding.large CircularProgress { id: circ anchors.fill: parent value: res.value - padding: Appearance.padding.large * 3 + padding: Tokens.padding.large * 3 fgColour: res.colour bgColour: Colours.layer(Colours.palette.m3surfaceContainerHighest, 3) - strokeWidth: width < 200 ? Appearance.padding.smaller : Appearance.padding.normal + strokeWidth: width < 200 ? Tokens.padding.smaller : Tokens.padding.normal } MaterialIcon { @@ -86,7 +86,7 @@ GridLayout { Behavior on value { Anim { - duration: Appearance.anim.durations.large + duration: Tokens.anim.durations.large } } } diff --git a/modules/lock/WeatherInfo.qml b/modules/lock/WeatherInfo.qml index 213bf155..2a8d058e 100644 --- a/modules/lock/WeatherInfo.qml +++ b/modules/lock/WeatherInfo.qml @@ -4,7 +4,7 @@ import QtQuick import QtQuick.Layouts import qs.components import qs.services -import qs.config +import Caelestia.Config ColumnLayout { id: root @@ -13,14 +13,14 @@ ColumnLayout { anchors.left: parent.left anchors.right: parent.right - anchors.margins: Appearance.padding.large * 2 + anchors.margins: Tokens.padding.large * 2 - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small Loader { asynchronous: true - Layout.topMargin: Appearance.padding.large * 2 - Layout.bottomMargin: -Appearance.padding.large + Layout.topMargin: Tokens.padding.large * 2 + Layout.bottomMargin: -Tokens.padding.large Layout.alignment: Qt.AlignHCenter active: root.rootHeight > 610 @@ -29,24 +29,24 @@ ColumnLayout { sourceComponent: StyledText { text: qsTr("Weather") color: Colours.palette.m3primary - font.pointSize: Appearance.font.size.extraLarge + font.pointSize: Tokens.font.size.extraLarge font.weight: 500 } } RowLayout { Layout.fillWidth: true - spacing: Appearance.spacing.large + spacing: Tokens.spacing.large MaterialIcon { animate: true text: Weather.icon color: Colours.palette.m3secondary - font.pointSize: Appearance.font.size.extraLarge * 2.5 + font.pointSize: Tokens.font.size.extraLarge * 2.5 } ColumnLayout { - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small StyledText { Layout.fillWidth: true @@ -54,7 +54,7 @@ ColumnLayout { animate: true text: Weather.description color: Colours.palette.m3secondary - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large font.weight: 500 elide: Text.ElideRight } @@ -65,19 +65,19 @@ ColumnLayout { animate: true text: qsTr("Humidity: %1%").arg(Weather.humidity) color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal elide: Text.ElideRight } } Loader { asynchronous: true - Layout.rightMargin: Appearance.padding.smaller + Layout.rightMargin: Tokens.padding.smaller active: root.width > 400 visible: active sourceComponent: ColumnLayout { - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small StyledText { Layout.fillWidth: true @@ -86,7 +86,7 @@ ColumnLayout { text: Weather.temp color: Colours.palette.m3primary horizontalAlignment: Text.AlignRight - font.pointSize: Appearance.font.size.extraLarge + font.pointSize: Tokens.font.size.extraLarge font.weight: 500 elide: Text.ElideLeft } @@ -98,7 +98,7 @@ ColumnLayout { text: qsTr("Feels like: %1").arg(Weather.feelsLike) color: Colours.palette.m3outline horizontalAlignment: Text.AlignRight - font.pointSize: Appearance.font.size.smaller + font.pointSize: Tokens.font.size.smaller elide: Text.ElideLeft } } @@ -109,15 +109,15 @@ ColumnLayout { id: forecastLoader asynchronous: true - Layout.topMargin: Appearance.spacing.smaller - Layout.bottomMargin: Appearance.padding.large * 2 + Layout.topMargin: Tokens.spacing.smaller + Layout.bottomMargin: Tokens.padding.large * 2 Layout.fillWidth: true active: root.rootHeight > 820 visible: active sourceComponent: RowLayout { - spacing: Appearance.spacing.large + spacing: Tokens.spacing.large Repeater { model: { @@ -137,7 +137,7 @@ ColumnLayout { required property var modelData Layout.fillWidth: true - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small StyledText { Layout.fillWidth: true @@ -147,13 +147,13 @@ ColumnLayout { } color: Colours.palette.m3outline horizontalAlignment: Text.AlignHCenter - font.pointSize: Appearance.font.size.larger + font.pointSize: Tokens.font.size.larger } MaterialIcon { Layout.alignment: Qt.AlignHCenter text: forecastHour.modelData?.icon ?? "cloud_alert" - font.pointSize: Appearance.font.size.extraLarge * 1.5 + font.pointSize: Tokens.font.size.extraLarge * 1.5 font.weight: 500 } @@ -161,7 +161,7 @@ ColumnLayout { Layout.alignment: Qt.AlignHCenter text: Config.services.useFahrenheit ? `${forecastHour.modelData?.tempF ?? 0}°F` : `${forecastHour.modelData?.tempC ?? 0}°C` color: Colours.palette.m3secondary - font.pointSize: Appearance.font.size.larger + font.pointSize: Tokens.font.size.larger } } } diff --git a/modules/notifications/Content.qml b/modules/notifications/Content.qml index bd18276e..c9f934aa 100644 --- a/modules/notifications/Content.qml +++ b/modules/notifications/Content.qml @@ -5,7 +5,7 @@ import qs.components import qs.components.containers import qs.components.widgets import qs.services -import qs.config +import Caelestia.Config Item { id: root @@ -13,7 +13,7 @@ Item { required property DrawerVisibilities visibilities required property Item osdPanel required property Item sessionPanel - readonly property int padding: Appearance.padding.large + readonly property int padding: Tokens.padding.large anchors.top: parent.top anchors.bottom: parent.bottom @@ -25,7 +25,7 @@ Item { if (count === 0) return 0; - let height = (count - 1) * Appearance.spacing.smaller; + let height = (count - 1) * Tokens.spacing.smaller; for (let i = 0; i < count; i++) height += (list.itemAtIndex(i) as NotifWrapper)?.nonAnimHeight ?? 0; @@ -49,7 +49,7 @@ Item { anchors.margins: root.padding color: "transparent" - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal StyledListView { id: list @@ -89,9 +89,9 @@ Item { let height = 0; for (let i = 0; i < count; i++) { - height += ((list.itemAtIndex(i) as NotifWrapper)?.nonAnimHeight ?? 0) + Appearance.spacing.smaller; + height += ((list.itemAtIndex(i) as NotifWrapper)?.nonAnimHeight ?? 0) + Tokens.spacing.smaller; - if (height - Appearance.spacing.smaller >= scrollY) + if (height - Tokens.spacing.smaller >= scrollY) return i; } @@ -110,9 +110,9 @@ Item { let height = 0; for (let i = count - 1; i >= 0; i--) { - height += ((list.itemAtIndex(i) as NotifWrapper)?.nonAnimHeight ?? 0) + Appearance.spacing.smaller; + height += ((list.itemAtIndex(i) as NotifWrapper)?.nonAnimHeight ?? 0) + Tokens.spacing.smaller; - if (height - Appearance.spacing.smaller >= scrollY) + if (height - Tokens.spacing.smaller >= scrollY) return count - i - 1; } @@ -140,7 +140,7 @@ Item { } implicitWidth: notif.implicitWidth - implicitHeight: notif.implicitHeight + (idx === 0 ? 0 : Appearance.spacing.smaller) + implicitHeight: notif.implicitHeight + (idx === 0 ? 0 : Tokens.spacing.smaller) ListView.onRemove: removeAnim.start() @@ -171,8 +171,8 @@ Item { target: notif property: "x" to: (notif.x >= 0 ? Config.notifs.sizes.width : -Config.notifs.sizes.width) * 2 - duration: Appearance.anim.durations.normal - easing.bezierCurve: Appearance.anim.curves.emphasized + duration: Tokens.anim.durations.normal + easing.bezierCurve: Tokens.anim.curves.emphasized } PropertyAction { target: wrapper @@ -183,7 +183,7 @@ Item { ClippingRectangle { anchors.top: parent.top - anchors.topMargin: wrapper.idx === 0 ? 0 : Appearance.spacing.smaller + anchors.topMargin: wrapper.idx === 0 ? 0 : Tokens.spacing.smaller color: "transparent" radius: notif.radius @@ -199,8 +199,8 @@ Item { } component Anim: NumberAnimation { - duration: Appearance.anim.durations.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial easing.type: Easing.BezierSpline - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } diff --git a/modules/notifications/Notification.qml b/modules/notifications/Notification.qml index 7b580a74..b7d90fe7 100644 --- a/modules/notifications/Notification.qml +++ b/modules/notifications/Notification.qml @@ -9,7 +9,7 @@ import Quickshell.Services.Notifications import qs.components import qs.components.effects import qs.services -import qs.config +import Caelestia.Config import qs.utils StyledRect { @@ -23,7 +23,7 @@ StyledRect { property bool expanded: Config.notifs.openExpanded color: root.modelData.urgency === NotificationUrgency.Critical ? Colours.palette.m3secondaryContainer : Colours.tPalette.m3surfaceContainer - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal implicitWidth: Config.notifs.sizes.width implicitHeight: inner.implicitHeight @@ -36,7 +36,7 @@ StyledRect { Behavior on x { Anim { - easing.bezierCurve: Appearance.anim.curves.emphasizedDecel + easing.bezierCurve: Tokens.anim.curves.emphasizedDecel } } @@ -95,14 +95,14 @@ StyledRect { anchors.left: parent.left anchors.right: parent.right anchors.top: parent.top - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal implicitHeight: root.nonAnimHeight Behavior on implicitHeight { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } @@ -119,7 +119,7 @@ StyledRect { visible: root.hasImage || root.hasAppIcon sourceComponent: ClippingRectangle { - radius: Appearance.rounding.full + radius: Tokens.rounding.full implicitWidth: Config.notifs.sizes.image implicitHeight: Config.notifs.sizes.image @@ -147,7 +147,7 @@ StyledRect { anchors.bottom: root.hasImage ? image.bottom : undefined sourceComponent: StyledRect { - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: root.modelData.urgency === NotificationUrgency.Critical ? Colours.palette.m3error : root.modelData.urgency === NotificationUrgency.Low ? Colours.layer(Colours.palette.m3surfaceContainerHighest, 2) : Colours.palette.m3secondaryContainer implicitWidth: root.hasImage ? Config.notifs.sizes.badge : Config.notifs.sizes.image implicitHeight: root.hasImage ? Config.notifs.sizes.badge : Config.notifs.sizes.image @@ -175,14 +175,14 @@ StyledRect { asynchronous: true active: !root.hasAppIcon anchors.centerIn: parent - anchors.horizontalCenterOffset: -Appearance.font.size.large * 0.02 - anchors.verticalCenterOffset: Appearance.font.size.large * 0.02 + anchors.horizontalCenterOffset: -Tokens.font.size.large * 0.02 + anchors.verticalCenterOffset: Tokens.font.size.large * 0.02 sourceComponent: MaterialIcon { text: Icons.getNotifIcon(root.modelData.summary, root.modelData.urgency) color: root.modelData.urgency === NotificationUrgency.Critical ? Colours.palette.m3onError : root.modelData.urgency === NotificationUrgency.Low ? Colours.palette.m3onSurface : Colours.palette.m3onSecondaryContainer - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large } } } @@ -207,9 +207,9 @@ StyledRect { PathAngleArc { id: progressArc - radiusX: progressIndicator.width / 2 - Appearance.padding.small / 2 + radiusX: progressIndicator.width / 2 - Tokens.padding.small / 2 centerX: progressIndicator.width / 2 - radiusY: progressIndicator.height / 2 - Appearance.padding.small / 2 + radiusY: progressIndicator.height / 2 - Tokens.padding.small / 2 centerY: progressIndicator.height / 2 startAngle: -90 @@ -217,7 +217,7 @@ StyledRect { Behavior on sweepAngle { Anim { - easing.bezierCurve: Appearance.anim.curves.emphasizedDecel + easing.bezierCurve: Tokens.anim.curves.emphasizedDecel } } } @@ -229,13 +229,13 @@ StyledRect { anchors.top: parent.top anchors.left: image.right - anchors.leftMargin: Appearance.spacing.smaller + anchors.leftMargin: Tokens.spacing.smaller animate: true text: appNameMetrics.elidedText maximumLineCount: 1 color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small opacity: root.expanded ? 1 : 0 @@ -251,7 +251,7 @@ StyledRect { font.family: appName.font.family font.pointSize: appName.font.pointSize elide: Text.ElideRight - elideWidth: expandBtn.x - time.width - timeSep.width - summary.x - Appearance.spacing.small * 3 + elideWidth: expandBtn.x - time.width - timeSep.width - summary.x - Tokens.spacing.small * 3 } StyledText { @@ -259,7 +259,7 @@ StyledRect { anchors.top: parent.top anchors.left: image.right - anchors.leftMargin: Appearance.spacing.smaller + anchors.leftMargin: Tokens.spacing.smaller animate: true text: summaryMetrics.elidedText @@ -286,9 +286,9 @@ StyledRect { property: "maximumLineCount" } AnchorAnimation { - duration: Appearance.anim.durations.normal + duration: Tokens.anim.durations.normal easing.type: Easing.BezierSpline - easing.bezierCurve: Appearance.anim.curves.standard + easing.bezierCurve: Tokens.anim.curves.standard } } @@ -304,7 +304,7 @@ StyledRect { font.family: summary.font.family font.pointSize: summary.font.pointSize elide: Text.ElideRight - elideWidth: expandBtn.x - time.width - timeSep.width - summary.x - Appearance.spacing.small * 3 + elideWidth: expandBtn.x - time.width - timeSep.width - summary.x - Tokens.spacing.small * 3 } StyledText { @@ -312,11 +312,11 @@ StyledRect { anchors.top: parent.top anchors.left: summary.right - anchors.leftMargin: Appearance.spacing.small + anchors.leftMargin: Tokens.spacing.small text: "•" color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small states: State { name: "expanded" @@ -330,9 +330,9 @@ StyledRect { transitions: Transition { AnchorAnimation { - duration: Appearance.anim.durations.normal + duration: Tokens.anim.durations.normal easing.type: Easing.BezierSpline - easing.bezierCurve: Appearance.anim.curves.standard + easing.bezierCurve: Tokens.anim.curves.standard } } } @@ -342,13 +342,13 @@ StyledRect { anchors.top: parent.top anchors.left: timeSep.right - anchors.leftMargin: Appearance.spacing.small + anchors.leftMargin: Tokens.spacing.small animate: true horizontalAlignment: Text.AlignLeft text: root.modelData.timeStr color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } Item { @@ -365,7 +365,7 @@ StyledRect { root.expanded = !root.expanded; } - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: root.modelData.urgency === NotificationUrgency.Critical ? Colours.palette.m3onSecondaryContainer : Colours.palette.m3onSurface } @@ -376,7 +376,7 @@ StyledRect { animate: true text: root.expanded ? "expand_less" : "expand_more" - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } } @@ -386,13 +386,13 @@ StyledRect { anchors.left: summary.left anchors.right: expandBtn.left anchors.top: summary.bottom - anchors.rightMargin: Appearance.spacing.small + anchors.rightMargin: Tokens.spacing.small animate: true textFormat: root.bodyTextFormat text: bodyPreviewMetrics.elidedText color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small opacity: root.expanded ? 0 : 1 @@ -417,13 +417,13 @@ StyledRect { anchors.left: summary.left anchors.right: expandBtn.left anchors.top: summary.bottom - anchors.rightMargin: Appearance.spacing.small + anchors.rightMargin: Tokens.spacing.small animate: true textFormat: root.bodyTextFormat text: root.modelData.body color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small wrapMode: Text.WrapAtWordBoundaryOrAnywhere height: text ? implicitHeight : 0 @@ -447,9 +447,9 @@ StyledRect { anchors.horizontalCenter: parent.horizontalCenter anchors.top: body.bottom - anchors.topMargin: Appearance.spacing.small + anchors.topMargin: Tokens.spacing.small - spacing: Appearance.spacing.smaller + spacing: Tokens.spacing.smaller opacity: root.expanded ? 1 : 0 @@ -483,20 +483,20 @@ StyledRect { required property var modelData - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: root.modelData.urgency === NotificationUrgency.Critical ? Colours.palette.m3secondary : Colours.layer(Colours.palette.m3surfaceContainerHigh, 2) - Layout.preferredWidth: actionText.width + Appearance.padding.normal * 2 - Layout.preferredHeight: actionText.height + Appearance.padding.small * 2 - implicitWidth: actionText.width + Appearance.padding.normal * 2 - implicitHeight: actionText.height + Appearance.padding.small * 2 + Layout.preferredWidth: actionText.width + Tokens.padding.normal * 2 + Layout.preferredHeight: actionText.height + Tokens.padding.small * 2 + implicitWidth: actionText.width + Tokens.padding.normal * 2 + implicitHeight: actionText.height + Tokens.padding.small * 2 StateLayer { function onClicked(): void { action.modelData.invoke(); } - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: root.modelData.urgency === NotificationUrgency.Critical ? Colours.palette.m3onSecondary : Colours.palette.m3onSurface } @@ -506,7 +506,7 @@ StyledRect { anchors.centerIn: parent text: actionTextMetrics.elidedText color: root.modelData.urgency === NotificationUrgency.Critical ? Colours.palette.m3onSecondary : Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } TextMetrics { @@ -518,7 +518,7 @@ StyledRect { elide: Text.ElideRight elideWidth: { const numActions = root.modelData.actions.length + 1; - return (inner.width - actions.spacing * (numActions - 1)) / numActions - Appearance.padding.normal * 2; + return (inner.width - actions.spacing * (numActions - 1)) / numActions - Tokens.padding.normal * 2; } } } diff --git a/modules/osd/Content.qml b/modules/osd/Content.qml index 5ec6ad98..b0022fd6 100644 --- a/modules/osd/Content.qml +++ b/modules/osd/Content.qml @@ -5,7 +5,7 @@ import QtQuick.Layouts import qs.components import qs.components.controls import qs.services -import qs.config +import Caelestia.Config import qs.utils Item { @@ -20,14 +20,14 @@ Item { required property bool sourceMuted required property real brightness - implicitWidth: layout.implicitWidth + Appearance.padding.large * 2 - implicitHeight: layout.implicitHeight + Appearance.padding.large * 2 + implicitWidth: layout.implicitWidth + Tokens.padding.large * 2 + implicitHeight: layout.implicitHeight + Tokens.padding.large * 2 ColumnLayout { id: layout anchors.centerIn: parent - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal // Speaker volume CustomMouseArea { @@ -117,7 +117,7 @@ Item { Behavior on Layout.preferredHeight { Anim { - easing.bezierCurve: Appearance.anim.curves.emphasized + easing.bezierCurve: Tokens.anim.curves.emphasized } } diff --git a/modules/osd/Wrapper.qml b/modules/osd/Wrapper.qml index 487b611f..1c593e84 100644 --- a/modules/osd/Wrapper.qml +++ b/modules/osd/Wrapper.qml @@ -4,7 +4,7 @@ import QtQuick import Quickshell import qs.components import qs.services -import qs.config +import Caelestia.Config Item { id: root @@ -46,8 +46,8 @@ Item { Behavior on offsetScale { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } diff --git a/modules/session/Content.qml b/modules/session/Content.qml index 0f64ec4b..b84a5a42 100644 --- a/modules/session/Content.qml +++ b/modules/session/Content.qml @@ -4,7 +4,7 @@ import QtQuick import Quickshell import qs.components import qs.services -import qs.config +import Caelestia.Config import qs.utils Column { @@ -12,8 +12,8 @@ Column { required property DrawerVisibilities visibilities - padding: Appearance.padding.large - spacing: Appearance.spacing.large + padding: Tokens.padding.large + spacing: Tokens.spacing.large SessionButton { id: logout @@ -53,7 +53,7 @@ Column { playing: visible asynchronous: true - speed: Appearance.anim.sessionGifSpeed + speed: Tokens.anim.sessionGifSpeed source: Paths.absolutePath(Config.paths.sessionGif) } @@ -85,7 +85,7 @@ Column { implicitWidth: Config.session.sizes.button implicitHeight: Config.session.sizes.button - radius: Appearance.rounding.large + radius: Tokens.rounding.large color: button.activeFocus ? Colours.palette.m3secondaryContainer : Colours.tPalette.m3surfaceContainer Keys.onEnterPressed: Quickshell.execDetached(button.command) @@ -128,7 +128,7 @@ Column { text: button.icon color: button.activeFocus ? Colours.palette.m3onSecondaryContainer : Colours.palette.m3onSurface - font.pointSize: Appearance.font.size.extraLarge + font.pointSize: Tokens.font.size.extraLarge font.weight: 500 } } diff --git a/modules/session/Wrapper.qml b/modules/session/Wrapper.qml index 0d2d3b42..f211cfbe 100644 --- a/modules/session/Wrapper.qml +++ b/modules/session/Wrapper.qml @@ -2,7 +2,7 @@ pragma ComponentBehavior: Bound import QtQuick import qs.components -import qs.config +import Caelestia.Config Item { id: root @@ -23,8 +23,8 @@ Item { Behavior on offsetScale { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } diff --git a/modules/sidebar/Content.qml b/modules/sidebar/Content.qml index 7dbbd06c..c6016967 100644 --- a/modules/sidebar/Content.qml +++ b/modules/sidebar/Content.qml @@ -2,7 +2,7 @@ import QtQuick import QtQuick.Layouts import qs.components import qs.services -import qs.config +import Caelestia.Config Item { id: root @@ -14,13 +14,13 @@ Item { id: layout anchors.fill: parent - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal StyledRect { Layout.fillWidth: true Layout.fillHeight: true - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: Colours.tPalette.m3surfaceContainerLow NotifDock { @@ -30,7 +30,7 @@ Item { } StyledRect { - Layout.topMargin: Appearance.padding.large - layout.spacing + Layout.topMargin: Tokens.padding.large - layout.spacing Layout.fillWidth: true implicitHeight: 1 diff --git a/modules/sidebar/Notif.qml b/modules/sidebar/Notif.qml index 5ccdc97e..aa80d068 100644 --- a/modules/sidebar/Notif.qml +++ b/modules/sidebar/Notif.qml @@ -5,7 +5,7 @@ import QtQuick.Layouts import Quickshell import qs.components import qs.services -import qs.config +import Caelestia.Config StyledRect { id: root @@ -16,11 +16,11 @@ StyledRect { required property DrawerVisibilities visibilities readonly property StyledText body: (expandedContent.item as ExpandedBody)?.body ?? null - readonly property real nonAnimHeight: expanded ? summary.implicitHeight + expandedContent.implicitHeight + expandedContent.anchors.topMargin + Appearance.padding.normal * 2 : summaryHeightMetrics.height + readonly property real nonAnimHeight: expanded ? summary.implicitHeight + expandedContent.implicitHeight + expandedContent.anchors.topMargin + Tokens.padding.normal * 2 : summaryHeightMetrics.height implicitHeight: nonAnimHeight - radius: Appearance.rounding.small + radius: Tokens.rounding.small color: { const c = root.modelData?.urgency === "critical" ? Colours.palette.m3secondaryContainer : Colours.layer(Colours.palette.m3surfaceContainerHigh, 2); return expanded ? c : Qt.alpha(c, 0); @@ -32,12 +32,12 @@ StyledRect { name: "expanded" PropertyChanges { - summary.anchors.margins: Appearance.padding.normal - dummySummary.anchors.margins: Appearance.padding.normal - compactBody.anchors.margins: Appearance.padding.normal - timeStr.anchors.margins: Appearance.padding.normal - expandedContent.anchors.margins: Appearance.padding.normal - summary.width: root.width - Appearance.padding.normal * 2 - timeStr.implicitWidth - Appearance.spacing.small + summary.anchors.margins: Tokens.padding.normal + dummySummary.anchors.margins: Tokens.padding.normal + compactBody.anchors.margins: Tokens.padding.normal + timeStr.anchors.margins: Tokens.padding.normal + expandedContent.anchors.margins: Tokens.padding.normal + summary.width: root.width - Tokens.padding.normal * 2 - timeStr.implicitWidth - Tokens.spacing.small summary.maximumLineCount: Number.MAX_SAFE_INTEGER } } @@ -86,7 +86,7 @@ StyledRect { anchors.top: parent.top anchors.left: dummySummary.right anchors.right: parent.right - anchors.leftMargin: Appearance.spacing.small + anchors.leftMargin: Tokens.spacing.small sourceComponent: StyledText { text: String(root.modelData?.body ?? "").replace(/\n/g, " ") @@ -106,7 +106,7 @@ StyledRect { animate: true text: root.modelData?.timeStr ?? "" color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } } @@ -117,22 +117,22 @@ StyledRect { anchors.top: summary.bottom anchors.left: parent.left anchors.right: parent.right - anchors.topMargin: Appearance.spacing.small / 2 + anchors.topMargin: Tokens.spacing.small / 2 sourceComponent: ExpandedBody {} } Behavior on implicitHeight { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } component ExpandedBody: ColumnLayout { readonly property alias body: bodyText - spacing: Appearance.spacing.smaller + spacing: Tokens.spacing.smaller StyledText { id: bodyText diff --git a/modules/sidebar/NotifActionList.qml b/modules/sidebar/NotifActionList.qml index 84e6103c..320fd1a3 100644 --- a/modules/sidebar/NotifActionList.qml +++ b/modules/sidebar/NotifActionList.qml @@ -8,7 +8,7 @@ import qs.components import qs.components.containers import qs.components.effects import qs.services -import qs.config +import Caelestia.Config Item { id: root @@ -94,7 +94,7 @@ Item { id: actionList anchors.fill: parent - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small Repeater { model: [ @@ -114,11 +114,11 @@ Item { Layout.fillWidth: true Layout.fillHeight: true - implicitWidth: actionInner.implicitWidth + Appearance.padding.normal * 2 - implicitHeight: actionInner.implicitHeight + Appearance.padding.small * 2 + implicitWidth: actionInner.implicitWidth + Tokens.padding.normal * 2 + implicitHeight: actionInner.implicitHeight + Tokens.padding.small * 2 - Layout.preferredWidth: implicitWidth + (actionStateLayer.pressed ? Appearance.padding.large : 0) - radius: actionStateLayer.pressed ? Appearance.rounding.small / 2 : Appearance.rounding.small + Layout.preferredWidth: implicitWidth + (actionStateLayer.pressed ? Tokens.padding.large : 0) + radius: actionStateLayer.pressed ? Tokens.rounding.small / 2 : Tokens.rounding.small color: Colours.layer(Colours.palette.m3surfaceContainerHighest, 4) Timer { @@ -183,15 +183,15 @@ Item { Behavior on Layout.preferredWidth { Anim { - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } } Behavior on radius { Anim { - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } } } diff --git a/modules/sidebar/NotifDock.qml b/modules/sidebar/NotifDock.qml index 11ce4dac..a819f52b 100644 --- a/modules/sidebar/NotifDock.qml +++ b/modules/sidebar/NotifDock.qml @@ -8,7 +8,7 @@ import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import qs.config +import Caelestia.Config import qs.utils Item { @@ -19,7 +19,7 @@ Item { readonly property int notifCount: Notifs.list.reduce((acc, n) => n.closed ? acc : acc + 1, 0) anchors.fill: parent - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal Component.onCompleted: Notifs.list.forEach(n => n.popup = false) @@ -29,7 +29,7 @@ Item { anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right - anchors.margins: Appearance.padding.small + anchors.margins: Tokens.padding.small implicitHeight: Math.max(count.implicitHeight, titleText.implicitHeight) @@ -43,8 +43,8 @@ Item { text: root.notifCount color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.normal - font.family: Appearance.font.family.mono + font.pointSize: Tokens.font.size.normal + font.family: Tokens.font.family.mono font.weight: 500 Behavior on anchors.leftMargin { @@ -62,12 +62,12 @@ Item { anchors.verticalCenter: parent.verticalCenter anchors.left: count.right anchors.right: parent.right - anchors.leftMargin: Appearance.spacing.small + anchors.leftMargin: Tokens.spacing.small text: root.notifCount > 0 ? qsTr("notification%1").arg(root.notifCount === 1 ? "" : "s") : qsTr("Notifications") color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.normal - font.family: Appearance.font.family.mono + font.pointSize: Tokens.font.size.normal + font.family: Tokens.font.family.mono font.weight: 500 elide: Text.ElideRight } @@ -80,9 +80,9 @@ Item { anchors.right: parent.right anchors.top: title.bottom anchors.bottom: parent.bottom - anchors.topMargin: Appearance.spacing.smaller + anchors.topMargin: Tokens.spacing.smaller - radius: Appearance.rounding.small + radius: Tokens.rounding.small color: "transparent" Loader { @@ -92,7 +92,7 @@ Item { opacity: root.notifCount > 0 ? 0 : 1 sourceComponent: ColumnLayout { - spacing: Appearance.spacing.large + spacing: Tokens.spacing.large Image { asynchronous: true @@ -111,15 +111,15 @@ Item { Layout.alignment: Qt.AlignHCenter text: qsTr("No Notifications") color: Colours.palette.m3outlineVariant - font.pointSize: Appearance.font.size.large - font.family: Appearance.font.family.mono + font.pointSize: Tokens.font.size.large + font.family: Tokens.font.family.mono font.weight: 500 } } Behavior on opacity { Anim { - duration: Appearance.anim.durations.extraLarge + duration: Tokens.anim.durations.extraLarge } } } @@ -177,7 +177,7 @@ Item { asynchronous: true anchors.right: parent.right anchors.bottom: parent.bottom - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal scale: root.notifCount > 0 ? 1 : 0.5 opacity: root.notifCount > 0 ? 1 : 0 @@ -187,9 +187,9 @@ Item { id: clearBtn icon: "clear_all" - radius: Appearance.rounding.normal - padding: Appearance.padding.normal - font.pointSize: Math.round(Appearance.font.size.large * 1.2) + radius: Tokens.rounding.normal + padding: Tokens.padding.normal + font.pointSize: Math.round(Tokens.font.size.large * 1.2) onClicked: clearTimer.start() Elevation { @@ -202,14 +202,14 @@ Item { Behavior on scale { Anim { - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } } Behavior on opacity { Anim { - duration: Appearance.anim.durations.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial } } } diff --git a/modules/sidebar/NotifDockList.qml b/modules/sidebar/NotifDockList.qml index c40a1e01..80d091c3 100644 --- a/modules/sidebar/NotifDockList.qml +++ b/modules/sidebar/NotifDockList.qml @@ -5,7 +5,7 @@ import Quickshell import Caelestia.Components import qs.components import qs.services -import qs.config +import Caelestia.Config LazyListView { id: root @@ -18,7 +18,7 @@ LazyListView { anchors.right: parent?.right implicitHeight: contentHeight - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small readyDelay: 1 cacheBuffer: 400 asynchronous: true @@ -33,7 +33,7 @@ LazyListView { useCustomViewport: true viewport: Qt.rect(0, container.contentY, width, container.height) - removeDuration: Appearance.anim.durations.normal + removeDuration: Tokens.anim.durations.normal model: ScriptModel { values: { @@ -129,8 +129,8 @@ LazyListView { enabled: notif.LazyListView.ready Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } @@ -140,15 +140,15 @@ LazyListView { Behavior on scale { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } Behavior on x { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } } @@ -159,7 +159,7 @@ LazyListView { target: root.container property: "contentY" - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } diff --git a/modules/sidebar/NotifGroup.qml b/modules/sidebar/NotifGroup.qml index 0efea542..3d624bfc 100644 --- a/modules/sidebar/NotifGroup.qml +++ b/modules/sidebar/NotifGroup.qml @@ -7,7 +7,7 @@ import Quickshell.Services.Notifications import qs.components import qs.components.effects import qs.services -import qs.config +import Caelestia.Config import qs.utils StyledRect { @@ -51,9 +51,9 @@ StyledRect { readonly property int urgency: groupProps.urgency readonly property int nonAnimHeight: { - const headerHeight = header.implicitHeight + (root.expanded ? Math.round(Appearance.spacing.small / 2) : 0); + const headerHeight = header.implicitHeight + (root.expanded ? Math.round(Tokens.spacing.small / 2) : 0); const columnHeight = headerHeight + notifList.layoutHeight + column.Layout.topMargin + column.Layout.bottomMargin; - return Math.round(Math.max(Config.notifs.sizes.image, columnHeight) + Appearance.padding.normal * 2); + return Math.round(Math.max(Config.notifs.sizes.image, columnHeight) + Tokens.padding.normal * 2); } readonly property bool expanded: props.expandedNotifs.includes(modelData) @@ -73,10 +73,10 @@ StyledRect { anchors.left: parent?.left anchors.right: parent?.right - implicitHeight: content.implicitHeight + Appearance.padding.normal * 2 + implicitHeight: content.implicitHeight + Tokens.padding.normal * 2 clip: true - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: Colours.layer(Colours.palette.m3surfaceContainer, 2) RowLayout { @@ -85,9 +85,9 @@ StyledRect { anchors.left: parent.left anchors.right: parent.right anchors.top: parent.top - anchors.margins: Appearance.padding.normal + anchors.margins: Tokens.padding.normal - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal Item { Layout.alignment: Qt.AlignLeft | Qt.AlignTop @@ -126,14 +126,14 @@ StyledRect { MaterialIcon { text: Icons.getNotifIcon(root.notifs[0]?.summary, root.urgency) color: root.urgency === NotificationUrgency.Critical ? Colours.palette.m3onError : root.urgency === NotificationUrgency.Low ? Colours.palette.m3onSurface : Colours.palette.m3onSecondaryContainer - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large } } StyledClippingRect { anchors.fill: parent color: root.urgency === NotificationUrgency.Critical ? Colours.palette.m3error : root.urgency === NotificationUrgency.Low ? Colours.layer(Colours.palette.m3surfaceContainerHigh, 3) : Colours.palette.m3secondaryContainer - radius: Appearance.rounding.full + radius: Tokens.rounding.full Loader { asynchronous: true @@ -153,7 +153,7 @@ StyledRect { implicitHeight: Config.notifs.sizes.badge color: root.urgency === NotificationUrgency.Critical ? Colours.palette.m3error : root.urgency === NotificationUrgency.Low ? Colours.palette.m3surfaceContainerHigh : Colours.palette.m3secondaryContainer - radius: Appearance.rounding.full + radius: Tokens.rounding.full ColouredIcon { anchors.centerIn: parent @@ -169,23 +169,23 @@ StyledRect { ColumnLayout { id: column - Layout.topMargin: -Appearance.padding.small - Layout.bottomMargin: -Appearance.padding.small / 2 + Layout.topMargin: -Tokens.padding.small + Layout.bottomMargin: -Tokens.padding.small / 2 Layout.fillWidth: true spacing: 0 RowLayout { id: header - Layout.bottomMargin: root.expanded ? Math.round(Appearance.spacing.small / 2) : 0 + Layout.bottomMargin: root.expanded ? Math.round(Tokens.spacing.small / 2) : 0 Layout.fillWidth: true - spacing: Appearance.spacing.smaller + spacing: Tokens.spacing.smaller StyledText { Layout.fillWidth: true text: root.modelData color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small elide: Text.ElideRight } @@ -193,15 +193,15 @@ StyledRect { animate: true text: root.notifs.find(n => !n.closed)?.timeStr ?? "" color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } StyledRect { - implicitWidth: expandBtn.implicitWidth + Appearance.padding.smaller * 2 - implicitHeight: groupCount.implicitHeight + Appearance.padding.small + implicitWidth: expandBtn.implicitWidth + Tokens.padding.smaller * 2 + implicitHeight: groupCount.implicitHeight + Tokens.padding.small color: root.urgency === NotificationUrgency.Critical ? Colours.palette.m3error : Colours.layer(Colours.palette.m3surfaceContainerHigh, 3) - radius: Appearance.rounding.full + radius: Tokens.rounding.full StateLayer { function onClicked(): void { @@ -215,36 +215,36 @@ StyledRect { id: expandBtn anchors.centerIn: parent - spacing: Appearance.spacing.small / 2 + spacing: Tokens.spacing.small / 2 StyledText { id: groupCount - Layout.leftMargin: Appearance.padding.small / 2 + Layout.leftMargin: Tokens.padding.small / 2 animate: true text: root.notifCount color: root.urgency === NotificationUrgency.Critical ? Colours.palette.m3onError : Colours.palette.m3onSurface - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small } MaterialIcon { - Layout.rightMargin: -Appearance.padding.small / 2 + Layout.rightMargin: -Tokens.padding.small / 2 text: "expand_more" color: root.urgency === NotificationUrgency.Critical ? Colours.palette.m3onError : Colours.palette.m3onSurface rotation: root.expanded ? 180 : 0 - Layout.topMargin: root.expanded ? -Math.floor(Appearance.padding.smaller / 2) : 0 + Layout.topMargin: root.expanded ? -Math.floor(Tokens.padding.smaller / 2) : 0 Behavior on rotation { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } Behavior on Layout.topMargin { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } } diff --git a/modules/sidebar/NotifGroupList.qml b/modules/sidebar/NotifGroupList.qml index aeec4c62..32d8d678 100644 --- a/modules/sidebar/NotifGroupList.qml +++ b/modules/sidebar/NotifGroupList.qml @@ -6,7 +6,7 @@ import Quickshell import Caelestia.Components import qs.components import qs.services -import qs.config +import Caelestia.Config LazyListView { id: root @@ -22,12 +22,12 @@ LazyListView { Layout.fillWidth: true implicitHeight: contentHeight - spacing: Math.round(Appearance.spacing.small / 2) + spacing: Math.round(Tokens.spacing.small / 2) asynchronous: true readyDelay: 1 cacheBuffer: 400 - removeDuration: Appearance.anim.durations.normal + removeDuration: Tokens.anim.durations.normal useCustomViewport: true viewport: { @@ -132,8 +132,8 @@ LazyListView { enabled: notif.LazyListView.ready Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } @@ -147,8 +147,8 @@ LazyListView { Behavior on x { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } } diff --git a/modules/sidebar/Wrapper.qml b/modules/sidebar/Wrapper.qml index eefd11a0..446a5b30 100644 --- a/modules/sidebar/Wrapper.qml +++ b/modules/sidebar/Wrapper.qml @@ -2,7 +2,7 @@ pragma ComponentBehavior: Bound import QtQuick import qs.components -import qs.config +import Caelestia.Config Item { id: root @@ -20,8 +20,8 @@ Item { Behavior on offsetScale { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } @@ -31,13 +31,13 @@ Item { anchors.top: parent.top anchors.bottom: parent.bottom anchors.left: parent.left - anchors.margins: Appearance.padding.large + anchors.margins: Tokens.padding.large anchors.bottomMargin: 0 active: root.shouldBeActive || root.visible sourceComponent: Content { - implicitWidth: Config.sidebar.sizes.width - Appearance.padding.large * 2 + implicitWidth: Config.sidebar.sizes.width - Tokens.padding.large * 2 props: root.props visibilities: root.visibilities } diff --git a/modules/utilities/Content.qml b/modules/utilities/Content.qml index 6dcfedcd..7ecb46ff 100644 --- a/modules/utilities/Content.qml +++ b/modules/utilities/Content.qml @@ -2,7 +2,7 @@ import "cards" import QtQuick import QtQuick.Layouts import qs.components -import qs.config +import Caelestia.Config import qs.modules.bar.popouts as BarPopouts Item { @@ -19,7 +19,7 @@ Item { id: layout anchors.fill: parent - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal IdleInhibit {} diff --git a/modules/utilities/RecordingDeleteModal.qml b/modules/utilities/RecordingDeleteModal.qml index 4d6d8af2..9d89fb8f 100644 --- a/modules/utilities/RecordingDeleteModal.qml +++ b/modules/utilities/RecordingDeleteModal.qml @@ -8,7 +8,7 @@ import qs.components import qs.components.controls import qs.components.effects import qs.services -import qs.config +import Caelestia.Config Loader { id: root @@ -33,9 +33,9 @@ Loader { Item { anchors.fill: parent - anchors.margins: -Appearance.padding.large - anchors.rightMargin: -Appearance.padding.large - Config.border.thickness - anchors.bottomMargin: -Appearance.padding.large - Config.border.thickness + anchors.margins: -Tokens.padding.large + anchors.rightMargin: -Tokens.padding.large - Config.border.thickness + anchors.bottomMargin: -Tokens.padding.large - Config.border.thickness opacity: 0.5 StyledRect { @@ -130,15 +130,15 @@ Loader { StyledRect { anchors.centerIn: parent - radius: Appearance.rounding.large + radius: Tokens.rounding.large color: Colours.palette.m3surfaceContainerHigh scale: 0 Component.onCompleted: scale = Qt.binding(() => root.props.recordingConfirmDelete ? 1 : 0) - width: Math.min(parent.width - Appearance.padding.large * 2, implicitWidth) - implicitWidth: deleteConfirmationLayout.implicitWidth + Appearance.padding.large * 3 - implicitHeight: deleteConfirmationLayout.implicitHeight + Appearance.padding.large * 3 + width: Math.min(parent.width - Tokens.padding.large * 2, implicitWidth) + implicitWidth: deleteConfirmationLayout.implicitWidth + Tokens.padding.large * 3 + implicitHeight: deleteConfirmationLayout.implicitHeight + Tokens.padding.large * 3 MouseArea { anchors.fill: parent @@ -155,26 +155,26 @@ Loader { id: deleteConfirmationLayout anchors.fill: parent - anchors.margins: Appearance.padding.large * 1.5 - spacing: Appearance.spacing.normal + anchors.margins: Tokens.padding.large * 1.5 + spacing: Tokens.spacing.normal StyledText { text: qsTr("Delete recording?") - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large } StyledText { Layout.fillWidth: true text: qsTr("Recording '%1' will be permanently deleted.").arg(deleteConfirmation.path) color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small wrapMode: Text.WrapAtWordBoundaryOrAnywhere } RowLayout { - Layout.topMargin: Appearance.spacing.normal + Layout.topMargin: Tokens.spacing.normal Layout.alignment: Qt.AlignRight - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal TextButton { text: qsTr("Cancel") @@ -195,8 +195,8 @@ Loader { Behavior on scale { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } } diff --git a/modules/utilities/Wrapper.qml b/modules/utilities/Wrapper.qml index cb4bcaa0..6d666894 100644 --- a/modules/utilities/Wrapper.qml +++ b/modules/utilities/Wrapper.qml @@ -3,7 +3,7 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell import qs.components -import qs.config +import Caelestia.Config import qs.modules.sidebar as Sidebar import qs.modules.bar.popouts as BarPopouts @@ -47,8 +47,8 @@ Item { Anim { property: "sidebarLerp" - duration: Appearance.anim.durations.expressiveDefaultSpatial / 2 - easing.bezierCurve: Appearance.anim.curves.standardAccel + duration: Tokens.anim.durations.expressiveDefaultSpatial / 2 + easing.bezierCurve: Tokens.anim.curves.standardAccel } }, Transition { @@ -56,16 +56,16 @@ Item { Anim { property: "sidebarLerp" - duration: Appearance.anim.durations.expressiveDefaultSpatial / 2 - easing.bezierCurve: Appearance.anim.curves.standardDecel + duration: Tokens.anim.durations.expressiveDefaultSpatial / 2 + easing.bezierCurve: Tokens.anim.curves.standardDecel } } ] Behavior on offsetScale { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } @@ -74,7 +74,7 @@ Item { anchors.top: parent.top anchors.left: parent.left - anchors.margins: Appearance.padding.large + anchors.margins: Tokens.padding.large asynchronous: true active: root.shouldBeActive || root.visible diff --git a/modules/utilities/cards/IdleInhibit.qml b/modules/utilities/cards/IdleInhibit.qml index 20d232a3..30176f29 100644 --- a/modules/utilities/cards/IdleInhibit.qml +++ b/modules/utilities/cards/IdleInhibit.qml @@ -3,15 +3,15 @@ import QtQuick.Layouts import qs.components import qs.components.controls import qs.services -import qs.config +import Caelestia.Config StyledRect { id: root Layout.fillWidth: true - implicitHeight: layout.implicitHeight + (IdleInhibitor.enabled ? activeChip.implicitHeight + activeChip.anchors.topMargin : 0) + Appearance.padding.large * 2 + implicitHeight: layout.implicitHeight + (IdleInhibitor.enabled ? activeChip.implicitHeight + activeChip.anchors.topMargin : 0) + Tokens.padding.large * 2 - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: Colours.tPalette.m3surfaceContainer clip: true @@ -21,14 +21,14 @@ StyledRect { anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right - anchors.margins: Appearance.padding.large - spacing: Appearance.spacing.normal + anchors.margins: Tokens.padding.large + spacing: Tokens.spacing.normal StyledRect { implicitWidth: implicitHeight - implicitHeight: icon.implicitHeight + Appearance.padding.smaller * 2 + implicitHeight: icon.implicitHeight + Tokens.padding.smaller * 2 - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: IdleInhibitor.enabled ? Colours.palette.m3secondary : Colours.palette.m3secondaryContainer MaterialIcon { @@ -37,7 +37,7 @@ StyledRect { anchors.centerIn: parent text: "coffee" color: IdleInhibitor.enabled ? Colours.palette.m3onSecondary : Colours.palette.m3onSecondaryContainer - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large } } @@ -48,7 +48,7 @@ StyledRect { StyledText { Layout.fillWidth: true text: qsTr("Keep Awake") - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal elide: Text.ElideRight } @@ -56,7 +56,7 @@ StyledRect { Layout.fillWidth: true text: IdleInhibitor.enabled ? qsTr("Preventing sleep mode") : qsTr("Normal power management") color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small elide: Text.ElideRight } } @@ -73,9 +73,9 @@ StyledRect { asynchronous: true anchors.bottom: parent.bottom anchors.left: parent.left - anchors.topMargin: Appearance.spacing.larger - anchors.bottomMargin: IdleInhibitor.enabled ? Appearance.padding.large : -implicitHeight - anchors.leftMargin: Appearance.padding.large + anchors.topMargin: Tokens.spacing.larger + anchors.bottomMargin: IdleInhibitor.enabled ? Tokens.padding.large : -implicitHeight + anchors.leftMargin: Tokens.padding.large opacity: IdleInhibitor.enabled ? 1 : 0 scale: IdleInhibitor.enabled ? 1 : 0.5 @@ -83,10 +83,10 @@ StyledRect { Component.onCompleted: active = Qt.binding(() => opacity > 0) sourceComponent: StyledRect { - implicitWidth: activeText.implicitWidth + Appearance.padding.normal * 2 - implicitHeight: activeText.implicitHeight + Appearance.padding.small * 2 + implicitWidth: activeText.implicitWidth + Tokens.padding.normal * 2 + implicitHeight: activeText.implicitHeight + Tokens.padding.small * 2 - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: Colours.palette.m3primary StyledText { @@ -95,20 +95,20 @@ StyledRect { anchors.centerIn: parent text: qsTr("Active since %1").arg(Qt.formatTime(IdleInhibitor.enabledSince, Config.services.useTwelveHourClock ? "hh:mm a" : "hh:mm")) color: Colours.palette.m3onPrimary - font.pointSize: Math.round(Appearance.font.size.small * 0.9) + font.pointSize: Math.round(Tokens.font.size.small * 0.9) } } Behavior on anchors.bottomMargin { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } Behavior on opacity { Anim { - duration: Appearance.anim.durations.small + duration: Tokens.anim.durations.small } } @@ -119,8 +119,8 @@ StyledRect { Behavior on implicitHeight { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } } diff --git a/modules/utilities/cards/Record.qml b/modules/utilities/cards/Record.qml index 9dd16ec5..97d88dde 100644 --- a/modules/utilities/cards/Record.qml +++ b/modules/utilities/cards/Record.qml @@ -5,7 +5,7 @@ import QtQuick.Layouts import qs.components import qs.components.controls import qs.services -import qs.config +import Caelestia.Config StyledRect { id: root @@ -16,28 +16,28 @@ StyledRect { Layout.fillWidth: true implicitHeight: layout.implicitHeight + layout.anchors.margins * 2 - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: Colours.tPalette.m3surfaceContainer ColumnLayout { id: layout anchors.fill: parent - anchors.margins: Appearance.padding.large - spacing: Appearance.spacing.normal + anchors.margins: Tokens.padding.large + spacing: Tokens.spacing.normal RowLayout { - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal z: 1 StyledRect { implicitWidth: implicitHeight implicitHeight: { - const h = icon.implicitHeight + Appearance.padding.smaller * 2; + const h = icon.implicitHeight + Tokens.padding.smaller * 2; return h - (h % 2); } - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: Recorder.running ? Colours.palette.m3secondary : Colours.palette.m3secondaryContainer MaterialIcon { @@ -48,7 +48,7 @@ StyledRect { anchors.verticalCenterOffset: 1.5 text: "screen_record" color: Recorder.running ? Colours.palette.m3onSecondary : Colours.palette.m3onSecondaryContainer - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large } } @@ -59,7 +59,7 @@ StyledRect { StyledText { Layout.fillWidth: true text: qsTr("Screen Recorder") - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal elide: Text.ElideRight } @@ -67,7 +67,7 @@ StyledRect { Layout.fillWidth: true text: Recorder.paused ? qsTr("Recording paused") : Recorder.running ? qsTr("Recording running") : qsTr("Recording off") color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.small + font.pointSize: Tokens.font.size.small elide: Text.ElideRight } } @@ -131,15 +131,15 @@ StyledRect { target: listOrControls property: "scale" to: 0.7 - duration: Appearance.anim.durations.small - easing.bezierCurve: Appearance.anim.curves.standardAccel + duration: Tokens.anim.durations.small + easing.bezierCurve: Tokens.anim.curves.standardAccel } Anim { target: listOrControls property: "opacity" to: 0 - duration: Appearance.anim.durations.small - easing.bezierCurve: Appearance.anim.curves.standardAccel + duration: Tokens.anim.durations.small + easing.bezierCurve: Tokens.anim.curves.standardAccel } } PropertyAction { @@ -158,15 +158,15 @@ StyledRect { target: listOrControls property: "scale" to: 1 - duration: Appearance.anim.durations.small - easing.bezierCurve: Appearance.anim.curves.standardDecel + duration: Tokens.anim.durations.small + easing.bezierCurve: Tokens.anim.curves.standardDecel } Anim { target: listOrControls property: "opacity" to: 1 - duration: Appearance.anim.durations.small - easing.bezierCurve: Appearance.anim.curves.standardDecel + duration: Tokens.anim.durations.small + easing.bezierCurve: Tokens.anim.curves.standardDecel } } } @@ -187,14 +187,14 @@ StyledRect { id: recordingControls RowLayout { - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal StyledRect { - radius: Appearance.rounding.full + radius: Tokens.rounding.full color: Recorder.paused ? Colours.palette.m3tertiary : Colours.palette.m3error - implicitWidth: recText.implicitWidth + Appearance.padding.normal * 2 - implicitHeight: recText.implicitHeight + Appearance.padding.smaller * 2 + implicitWidth: recText.implicitWidth + Tokens.padding.normal * 2 + implicitHeight: recText.implicitHeight + Tokens.padding.smaller * 2 StyledText { id: recText @@ -203,7 +203,7 @@ StyledRect { animate: true text: Recorder.paused ? "PAUSED" : "REC" color: Recorder.paused ? Colours.palette.m3onTertiary : Colours.palette.m3onError - font.family: Appearance.font.family.mono + font.family: Tokens.font.family.mono } Behavior on implicitWidth { @@ -218,14 +218,14 @@ StyledRect { Anim { from: 1 to: 0 - duration: Appearance.anim.durations.large - easing.bezierCurve: Appearance.anim.curves.emphasizedAccel + duration: Tokens.anim.durations.large + easing.bezierCurve: Tokens.anim.curves.emphasizedAccel } Anim { from: 0 to: 1 - duration: Appearance.anim.durations.extraLarge - easing.bezierCurve: Appearance.anim.curves.emphasizedDecel + duration: Tokens.anim.durations.extraLarge + easing.bezierCurve: Tokens.anim.curves.emphasizedDecel } } } @@ -246,7 +246,7 @@ StyledRect { return qsTr("Recording for %1").arg(time); } - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } Item { @@ -259,7 +259,7 @@ StyledRect { toggle: true checked: Recorder.paused type: IconButton.Tonal - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large onClicked: { Recorder.togglePause(); internalChecked = Recorder.paused; @@ -270,7 +270,7 @@ StyledRect { icon: "stop" inactiveColour: Colours.palette.m3error inactiveOnColour: Colours.palette.m3onError - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large onClicked: Recorder.stop() } } diff --git a/modules/utilities/cards/RecordingList.qml b/modules/utilities/cards/RecordingList.qml index 7fb56f3b..57b7ad64 100644 --- a/modules/utilities/cards/RecordingList.qml +++ b/modules/utilities/cards/RecordingList.qml @@ -9,7 +9,7 @@ import qs.components import qs.components.containers import qs.components.controls import qs.services -import qs.config +import Caelestia.Config import qs.utils ColumnLayout { @@ -27,19 +27,19 @@ ColumnLayout { onClicked: root.props.recordingListExpanded = !root.props.recordingListExpanded RowLayout { - spacing: Appearance.spacing.smaller + spacing: Tokens.spacing.smaller MaterialIcon { Layout.alignment: Qt.AlignVCenter text: "list" - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large } StyledText { Layout.alignment: Qt.AlignVCenter Layout.fillWidth: true text: qsTr("Recordings") - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } IconButton { @@ -61,8 +61,8 @@ ColumnLayout { } Layout.fillWidth: true - Layout.rightMargin: -Appearance.spacing.small - implicitHeight: (Appearance.font.size.larger + Appearance.padding.small) * (root.props.recordingListExpanded ? 10 : 3) + Layout.rightMargin: -Tokens.spacing.small + implicitHeight: (Tokens.font.size.larger + Tokens.padding.small) * (root.props.recordingListExpanded ? 10 : 3) clip: true StyledScrollBar.vertical: StyledScrollBar { @@ -77,14 +77,14 @@ ColumnLayout { anchors.left: list.contentItem.left anchors.right: list.contentItem.right - anchors.rightMargin: Appearance.spacing.small - spacing: Appearance.spacing.small / 2 + anchors.rightMargin: Tokens.spacing.small + spacing: Tokens.spacing.small / 2 Component.onCompleted: baseName = modelData.baseName StyledText { Layout.fillWidth: true - Layout.rightMargin: Appearance.spacing.small / 2 + Layout.rightMargin: Tokens.spacing.small / 2 text: { const time = recording.baseName; const matches = time.match(/^recording_(\d{4})(\d{2})(\d{2})_(\d{2})-(\d{2})-(\d{2})/); @@ -169,13 +169,13 @@ ColumnLayout { active: opacity > 0 sourceComponent: ColumnLayout { - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small MaterialIcon { Layout.alignment: Qt.AlignHCenter text: "scan_delete" color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.extraLarge + font.pointSize: Tokens.font.size.extraLarge opacity: root.props.recordingListExpanded ? 1 : 0 scale: root.props.recordingListExpanded ? 1 : 0 @@ -195,7 +195,7 @@ ColumnLayout { } RowLayout { - spacing: Appearance.spacing.smaller + spacing: Tokens.spacing.smaller MaterialIcon { Layout.alignment: Qt.AlignHCenter @@ -233,8 +233,8 @@ ColumnLayout { Behavior on implicitHeight { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } } diff --git a/modules/utilities/cards/Toggles.qml b/modules/utilities/cards/Toggles.qml index 2b14a9ae..65b5a627 100644 --- a/modules/utilities/cards/Toggles.qml +++ b/modules/utilities/cards/Toggles.qml @@ -6,7 +6,7 @@ import Quickshell.Bluetooth import qs.components import qs.components.controls import qs.services -import qs.config +import Caelestia.Config import qs.modules.bar.popouts as BarPopouts StyledRect { @@ -38,21 +38,21 @@ StyledRect { readonly property bool needExtraRow: quickToggles.length > 6 Layout.fillWidth: true - implicitHeight: layout.implicitHeight + Appearance.padding.large * 2 + implicitHeight: layout.implicitHeight + Tokens.padding.large * 2 - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: Colours.tPalette.m3surfaceContainer ColumnLayout { id: layout anchors.fill: parent - anchors.margins: Appearance.padding.large - spacing: Appearance.spacing.normal + anchors.margins: Tokens.padding.large + spacing: Tokens.spacing.normal StyledText { text: qsTr("Quick Toggles") - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } QuickToggleRow { @@ -69,7 +69,7 @@ StyledRect { property var rowModel: [] Layout.fillWidth: true - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small Repeater { model: parent.rowModel @@ -154,17 +154,17 @@ StyledRect { component Toggle: IconButton { Layout.fillWidth: true - Layout.preferredWidth: implicitWidth + (stateLayer.pressed ? Appearance.padding.large : internalChecked ? Appearance.padding.smaller : 0) - radius: stateLayer.pressed ? Appearance.rounding.small / 2 : internalChecked ? Appearance.rounding.small : Appearance.rounding.normal + Layout.preferredWidth: implicitWidth + (stateLayer.pressed ? Tokens.padding.large : internalChecked ? Tokens.padding.smaller : 0) + radius: stateLayer.pressed ? Tokens.rounding.small / 2 : internalChecked ? Tokens.rounding.small : Tokens.rounding.normal inactiveColour: Colours.layer(Colours.palette.m3surfaceContainerHighest, 2) toggle: true - radiusAnim.duration: Appearance.anim.durations.expressiveFastSpatial - radiusAnim.easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + radiusAnim.duration: Tokens.anim.durations.expressiveFastSpatial + radiusAnim.easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial Behavior on Layout.preferredWidth { Anim { - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + duration: Tokens.anim.durations.expressiveFastSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial } } } diff --git a/modules/utilities/toasts/ToastItem.qml b/modules/utilities/toasts/ToastItem.qml index 52473a48..756160fc 100644 --- a/modules/utilities/toasts/ToastItem.qml +++ b/modules/utilities/toasts/ToastItem.qml @@ -4,7 +4,7 @@ import Caelestia import qs.components import qs.components.effects import qs.services -import qs.config +import Caelestia.Config StyledRect { id: root @@ -13,9 +13,9 @@ StyledRect { anchors.left: parent.left anchors.right: parent.right - implicitHeight: layout.implicitHeight + Appearance.padding.smaller * 2 + implicitHeight: layout.implicitHeight + Tokens.padding.smaller * 2 - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: { if (root.modelData.type === Toast.Success) return Colours.palette.m3successContainer; @@ -50,13 +50,13 @@ StyledRect { id: layout anchors.fill: parent - anchors.margins: Appearance.padding.smaller - anchors.leftMargin: Appearance.padding.normal - anchors.rightMargin: Appearance.padding.normal - spacing: Appearance.spacing.normal + anchors.margins: Tokens.padding.smaller + anchors.leftMargin: Tokens.padding.normal + anchors.rightMargin: Tokens.padding.normal + spacing: Tokens.spacing.normal StyledRect { - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal color: { if (root.modelData.type === Toast.Success) return Colours.palette.m3success; @@ -68,7 +68,7 @@ StyledRect { } implicitWidth: implicitHeight - implicitHeight: icon.implicitHeight + Appearance.padding.smaller * 2 + implicitHeight: icon.implicitHeight + Tokens.padding.smaller * 2 MaterialIcon { id: icon @@ -84,7 +84,7 @@ StyledRect { return Colours.palette.m3onError; return Colours.palette.m3onSurfaceVariant; } - font.pointSize: Math.round(Appearance.font.size.large * 1.2) + font.pointSize: Math.round(Tokens.font.size.large * 1.2) } } @@ -106,7 +106,7 @@ StyledRect { return Colours.palette.m3onErrorContainer; return Colours.palette.m3onSurface; } - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal elide: Text.ElideRight } diff --git a/modules/utilities/toasts/Toasts.qml b/modules/utilities/toasts/Toasts.qml index 1ef072e9..32fb56fc 100644 --- a/modules/utilities/toasts/Toasts.qml +++ b/modules/utilities/toasts/Toasts.qml @@ -5,12 +5,12 @@ import Quickshell import Caelestia import qs.components import qs.services -import qs.config +import Caelestia.Config Item { id: root - readonly property int spacing: Appearance.spacing.small + readonly property int spacing: Tokens.spacing.small property bool flag function shouldShowToast(toast: Toast): bool { @@ -23,7 +23,7 @@ Item { return false; } - implicitWidth: Config.utilities.sizes.toastWidth - Appearance.padding.normal * 2 + implicitWidth: Config.utilities.sizes.toastWidth - Tokens.padding.normal * 2 implicitHeight: { let h = -spacing; for (let i = 0; i < repeater.count; i++) { @@ -111,8 +111,8 @@ Item { properties: "opacity,scale" from: 0 to: 1 - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } ParallelAnimation { @@ -148,8 +148,8 @@ Item { Behavior on anchors.bottomMargin { Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + duration: Tokens.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } } } diff --git a/modules/windowinfo/Buttons.qml b/modules/windowinfo/Buttons.qml index 3f0bf4de..6ddda9b3 100644 --- a/modules/windowinfo/Buttons.qml +++ b/modules/windowinfo/Buttons.qml @@ -5,7 +5,7 @@ import QtQuick.Layouts import Quickshell.Widgets import qs.components import qs.services -import qs.config +import Caelestia.Config ColumnLayout { id: root @@ -14,14 +14,14 @@ ColumnLayout { property bool moveToWsExpanded anchors.fill: parent - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small RowLayout { - Layout.topMargin: Appearance.padding.large - Layout.leftMargin: Appearance.padding.large - Layout.rightMargin: Appearance.padding.large + Layout.topMargin: Tokens.padding.large + Layout.leftMargin: Tokens.padding.large + Layout.rightMargin: Tokens.padding.large - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal StyledText { Layout.fillWidth: true @@ -31,10 +31,10 @@ ColumnLayout { StyledRect { color: Colours.palette.m3primary - radius: Appearance.rounding.small + radius: Tokens.rounding.small - implicitWidth: moveToWsIcon.implicitWidth + Appearance.padding.small * 2 - implicitHeight: moveToWsIcon.implicitHeight + Appearance.padding.small + implicitWidth: moveToWsIcon.implicitWidth + Tokens.padding.small * 2 + implicitHeight: moveToWsIcon.implicitHeight + Tokens.padding.small StateLayer { function onClicked(): void { @@ -52,27 +52,27 @@ ColumnLayout { animate: true text: root.moveToWsExpanded ? "expand_more" : "keyboard_arrow_right" color: Colours.palette.m3onPrimary - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large } } } WrapperItem { Layout.fillWidth: true - Layout.leftMargin: Appearance.padding.large * 2 - Layout.rightMargin: Appearance.padding.large * 2 + Layout.leftMargin: Tokens.padding.large * 2 + Layout.rightMargin: Tokens.padding.large * 2 Layout.preferredHeight: root.moveToWsExpanded ? implicitHeight : 0 clip: true - topMargin: Appearance.spacing.normal - bottomMargin: Appearance.spacing.normal + topMargin: Tokens.spacing.normal + bottomMargin: Tokens.spacing.normal GridLayout { id: wsGrid - rowSpacing: Appearance.spacing.smaller - columnSpacing: Appearance.spacing.normal + rowSpacing: Tokens.spacing.smaller + columnSpacing: Tokens.spacing.normal columns: 5 Repeater { @@ -102,11 +102,11 @@ ColumnLayout { RowLayout { Layout.fillWidth: true - Layout.leftMargin: Appearance.padding.large - Layout.rightMargin: Appearance.padding.large - Layout.bottomMargin: Appearance.padding.large + Layout.leftMargin: Tokens.padding.large + Layout.rightMargin: Tokens.padding.large + Layout.bottomMargin: Tokens.padding.large - spacing: root.client?.lastIpcObject.floating ? Appearance.spacing.normal : Appearance.spacing.small + spacing: root.client?.lastIpcObject.floating ? Tokens.spacing.normal : Tokens.spacing.small Button { function onClicked(): void { @@ -155,10 +155,10 @@ ColumnLayout { function onClicked(): void { } - radius: Appearance.rounding.small + radius: Tokens.rounding.small Layout.fillWidth: true - implicitHeight: label.implicitHeight + Appearance.padding.small * 2 + implicitHeight: label.implicitHeight + Tokens.padding.small * 2 StateLayer { id: stateLayer @@ -177,7 +177,7 @@ ColumnLayout { animate: true color: parent.onColor - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } } } diff --git a/modules/windowinfo/Details.qml b/modules/windowinfo/Details.qml index 3934a993..1f274ca8 100644 --- a/modules/windowinfo/Details.qml +++ b/modules/windowinfo/Details.qml @@ -3,7 +3,7 @@ import QtQuick.Layouts import Quickshell.Hyprland import qs.components import qs.services -import qs.config +import Caelestia.Config ColumnLayout { id: root @@ -11,15 +11,15 @@ ColumnLayout { required property HyprlandToplevel client anchors.fill: parent - spacing: Appearance.spacing.small + spacing: Tokens.spacing.small Label { - Layout.topMargin: Appearance.padding.large * 2 + Layout.topMargin: Tokens.padding.large * 2 text: root.client?.title ?? qsTr("No active client") wrapMode: Text.WrapAtWordBoundaryOrAnywhere - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large font.weight: 500 } @@ -27,16 +27,16 @@ ColumnLayout { text: root.client?.lastIpcObject.class ?? qsTr("No active client") color: Colours.palette.m3tertiary - font.pointSize: Appearance.font.size.larger + font.pointSize: Tokens.font.size.larger } StyledRect { Layout.fillWidth: true Layout.preferredHeight: 1 - Layout.leftMargin: Appearance.padding.large * 2 - Layout.rightMargin: Appearance.padding.large * 2 - Layout.topMargin: Appearance.spacing.normal - Layout.bottomMargin: Appearance.spacing.large + Layout.leftMargin: Tokens.padding.large * 2 + Layout.rightMargin: Tokens.padding.large * 2 + Layout.topMargin: Tokens.spacing.normal + Layout.bottomMargin: Tokens.spacing.large color: Colours.palette.m3secondary } @@ -130,11 +130,11 @@ ColumnLayout { required property string text property alias color: icon.color - Layout.leftMargin: Appearance.padding.large - Layout.rightMargin: Appearance.padding.large + Layout.leftMargin: Tokens.padding.large + Layout.rightMargin: Tokens.padding.large Layout.fillWidth: true - spacing: Appearance.spacing.smaller + spacing: Tokens.spacing.smaller MaterialIcon { id: icon @@ -149,13 +149,13 @@ ColumnLayout { text: detail.text elide: Text.ElideRight - font.pointSize: Appearance.font.size.normal + font.pointSize: Tokens.font.size.normal } } component Label: StyledText { - Layout.leftMargin: Appearance.padding.large - Layout.rightMargin: Appearance.padding.large + Layout.leftMargin: Tokens.padding.large + Layout.rightMargin: Tokens.padding.large Layout.fillWidth: true elide: Text.ElideRight horizontalAlignment: Text.AlignHCenter diff --git a/modules/windowinfo/Preview.qml b/modules/windowinfo/Preview.qml index 2683e544..4946205c 100644 --- a/modules/windowinfo/Preview.qml +++ b/modules/windowinfo/Preview.qml @@ -7,7 +7,7 @@ import Quickshell.Hyprland import Quickshell.Wayland import qs.components import qs.services -import qs.config +import Caelestia.Config Item { id: root @@ -15,7 +15,7 @@ Item { required property ShellScreen screen required property HyprlandToplevel client - Layout.preferredWidth: preview.implicitWidth + Appearance.padding.large * 2 + Layout.preferredWidth: preview.implicitWidth + Tokens.padding.large * 2 Layout.fillHeight: true StyledClippingRect { @@ -24,13 +24,13 @@ Item { anchors.horizontalCenter: parent.horizontalCenter anchors.top: parent.top anchors.bottom: label.top - anchors.topMargin: Appearance.padding.large - anchors.bottomMargin: Appearance.spacing.normal + anchors.topMargin: Tokens.padding.large + anchors.bottomMargin: Tokens.spacing.normal implicitWidth: view.implicitWidth color: Colours.tPalette.m3surfaceContainer - radius: Appearance.rounding.small + radius: Tokens.rounding.small Loader { asynchronous: true @@ -44,14 +44,14 @@ Item { Layout.alignment: Qt.AlignHCenter text: "web_asset_off" color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.extraLarge * 3 + font.pointSize: Tokens.font.size.extraLarge * 3 } StyledText { Layout.alignment: Qt.AlignHCenter text: qsTr("No active client") color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.extraLarge + font.pointSize: Tokens.font.size.extraLarge font.weight: 500 } @@ -59,7 +59,7 @@ Item { Layout.alignment: Qt.AlignHCenter text: qsTr("Try switching to a window") color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.large + font.pointSize: Tokens.font.size.large } } } @@ -82,7 +82,7 @@ Item { anchors.horizontalCenter: parent.horizontalCenter anchors.bottom: parent.bottom - anchors.bottomMargin: Appearance.padding.large + anchors.bottomMargin: Tokens.padding.large animate: true text: { diff --git a/modules/windowinfo/WindowInfo.qml b/modules/windowinfo/WindowInfo.qml index d7cfc2fa..a0079128 100644 --- a/modules/windowinfo/WindowInfo.qml +++ b/modules/windowinfo/WindowInfo.qml @@ -4,7 +4,7 @@ import Quickshell import Quickshell.Hyprland import qs.components import qs.services -import qs.config +import Caelestia.Config Item { id: root @@ -19,9 +19,9 @@ Item { id: child anchors.fill: parent - anchors.margins: Appearance.padding.large + anchors.margins: Tokens.padding.large - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal Preview { screen: root.screen @@ -29,7 +29,7 @@ Item { } ColumnLayout { - spacing: Appearance.spacing.normal + spacing: Tokens.spacing.normal Layout.preferredWidth: Config.winfo.sizes.detailsWidth Layout.fillHeight: true @@ -39,7 +39,7 @@ Item { Layout.fillHeight: true color: Colours.tPalette.m3surfaceContainer - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal Details { client: root.client @@ -51,7 +51,7 @@ Item { Layout.preferredHeight: buttons.implicitHeight color: Colours.tPalette.m3surfaceContainer - radius: Appearance.rounding.normal + radius: Tokens.rounding.normal Buttons { id: buttons diff --git a/services/Audio.qml b/services/Audio.qml index e2d936a0..ad679149 100644 --- a/services/Audio.qml +++ b/services/Audio.qml @@ -6,7 +6,7 @@ import Quickshell.Io import Quickshell.Services.Pipewire import Caelestia import Caelestia.Services -import qs.config +import Caelestia.Config Singleton { id: root diff --git a/services/Brightness.qml b/services/Brightness.qml index 6e828d91..5e7d7f81 100644 --- a/services/Brightness.qml +++ b/services/Brightness.qml @@ -5,7 +5,7 @@ import QtQuick import Quickshell import Quickshell.Io import qs.components.misc -import qs.config +import Caelestia.Config Singleton { id: root diff --git a/services/Colours.qml b/services/Colours.qml index 8a26e119..fd4698de 100644 --- a/services/Colours.qml +++ b/services/Colours.qml @@ -6,7 +6,7 @@ import Quickshell import Quickshell.Io import Caelestia import qs.services -import qs.config +import Caelestia.Config import qs.utils Singleton { @@ -115,9 +115,9 @@ Singleton { } component Transparency: QtObject { - readonly property bool enabled: Appearance.transparency.enabled - readonly property real base: Math.max(0, Math.min(1, Appearance.transparency.base - (root.light ? 0.1 : 0))) - readonly property real layers: Appearance.transparency.layers + readonly property bool enabled: Tokens.transparency.enabled + readonly property real base: Math.max(0, Math.min(1, Tokens.transparency.base - (root.light ? 0.1 : 0))) + readonly property real layers: Tokens.transparency.layers onEnabledChanged: debounceTimer.restart() onBaseChanged: debounceTimer.restart() diff --git a/services/GameMode.qml b/services/GameMode.qml index 3a3fb7bd..ac1b235d 100644 --- a/services/GameMode.qml +++ b/services/GameMode.qml @@ -5,7 +5,7 @@ import Quickshell import Quickshell.Io import Caelestia import qs.services -import qs.config +import Caelestia.Config Singleton { id: root diff --git a/services/Hypr.qml b/services/Hypr.qml index 98c6e718..2c307e2a 100644 --- a/services/Hypr.qml +++ b/services/Hypr.qml @@ -7,7 +7,7 @@ import Quickshell.Io import Caelestia import Caelestia.Internal import qs.components.misc -import qs.config +import Caelestia.Config Singleton { id: root diff --git a/services/LyricsService.qml b/services/LyricsService.qml index a6b94f27..7fd63670 100644 --- a/services/LyricsService.qml +++ b/services/LyricsService.qml @@ -5,7 +5,7 @@ import QtQuick import Quickshell import Quickshell.Io import Caelestia -import qs.config +import Caelestia.Config import qs.utils Singleton { diff --git a/services/NetworkUsage.qml b/services/NetworkUsage.qml index 1f74c97b..e0cc61b3 100644 --- a/services/NetworkUsage.qml +++ b/services/NetworkUsage.qml @@ -4,7 +4,7 @@ import QtQuick import Quickshell import Quickshell.Io import Caelestia.Internal -import qs.config +import Caelestia.Config Singleton { id: root diff --git a/services/NotifData.qml b/services/NotifData.qml index d84183e5..ac781ad5 100644 --- a/services/NotifData.qml +++ b/services/NotifData.qml @@ -5,7 +5,7 @@ import Quickshell import Quickshell.Services.Notifications import Caelestia import qs.services -import qs.config +import Caelestia.Config import qs.utils QtObject { diff --git a/services/Notifs.qml b/services/Notifs.qml index 9ea5beff..f2205fc0 100644 --- a/services/Notifs.qml +++ b/services/Notifs.qml @@ -8,7 +8,7 @@ import Quickshell.Services.Notifications import Caelestia import qs.components.misc import qs.services -import qs.config +import Caelestia.Config import qs.utils Singleton { diff --git a/services/Players.qml b/services/Players.qml index 526b0044..f3c6ab3f 100644 --- a/services/Players.qml +++ b/services/Players.qml @@ -6,7 +6,7 @@ import Quickshell.Io import Quickshell.Services.Mpris import Caelestia import qs.components.misc -import qs.config +import Caelestia.Config Singleton { id: root diff --git a/services/Screens.qml b/services/Screens.qml index 9fed887f..7e1b85df 100644 --- a/services/Screens.qml +++ b/services/Screens.qml @@ -1,7 +1,7 @@ pragma Singleton import Quickshell -import qs.config +import Caelestia.Config import qs.utils Singleton { diff --git a/services/SystemUsage.qml b/services/SystemUsage.qml index 79691fea..e1dc4947 100644 --- a/services/SystemUsage.qml +++ b/services/SystemUsage.qml @@ -3,7 +3,7 @@ pragma Singleton import QtQuick import Quickshell import Quickshell.Io -import qs.config +import Caelestia.Config Singleton { id: root diff --git a/services/Time.qml b/services/Time.qml index d41c9142..f92c69a1 100644 --- a/services/Time.qml +++ b/services/Time.qml @@ -2,7 +2,7 @@ pragma Singleton import QtQuick import Quickshell -import qs.config +import Caelestia.Config Singleton { property alias enabled: clock.enabled diff --git a/services/VPN.qml b/services/VPN.qml index bc0addce..ac82a394 100644 --- a/services/VPN.qml +++ b/services/VPN.qml @@ -4,7 +4,7 @@ import QtQuick import Quickshell import Quickshell.Io import Caelestia -import qs.config +import Caelestia.Config Singleton { id: root diff --git a/services/Wallpapers.qml b/services/Wallpapers.qml index 602abb20..a42d926e 100644 --- a/services/Wallpapers.qml +++ b/services/Wallpapers.qml @@ -5,7 +5,7 @@ import Quickshell import Quickshell.Io import Caelestia.Models import qs.services -import qs.config +import Caelestia.Config import qs.utils Searcher { diff --git a/services/Weather.qml b/services/Weather.qml index 40c4d895..e5037c40 100644 --- a/services/Weather.qml +++ b/services/Weather.qml @@ -3,7 +3,7 @@ pragma Singleton import QtQuick import Quickshell import Caelestia -import qs.config +import Caelestia.Config import qs.utils Singleton { diff --git a/utils/Icons.qml b/utils/Icons.qml index aded0f4b..1d958cff 100644 --- a/utils/Icons.qml +++ b/utils/Icons.qml @@ -3,7 +3,7 @@ pragma Singleton import QtQuick import Quickshell import Quickshell.Services.Notifications -import qs.config +import Caelestia.Config Singleton { id: root diff --git a/utils/Paths.qml b/utils/Paths.qml index b0926348..aa967913 100644 --- a/utils/Paths.qml +++ b/utils/Paths.qml @@ -3,7 +3,7 @@ pragma Singleton import QtQuick import Quickshell import Caelestia -import qs.config +import Caelestia.Config Singleton { id: root diff --git a/utils/SysInfo.qml b/utils/SysInfo.qml index 74c94e9b..8081340e 100644 --- a/utils/SysInfo.qml +++ b/utils/SysInfo.qml @@ -3,7 +3,7 @@ pragma Singleton import QtQuick import Quickshell import Quickshell.Io -import qs.config +import Caelestia.Config import qs.utils Singleton { From 2b2d5a487358867c790fb4a770bf5eadbcd2438f Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 21:22:58 +1000 Subject: [PATCH 22/81] feat: move size tokens to subobject --- plugin/src/Caelestia/Config/tokens.cpp | 31 ++++++++----------------- plugin/src/Caelestia/Config/tokens.hpp | 32 ++++++++++++++++++++++---- 2 files changed, 37 insertions(+), 26 deletions(-) diff --git a/plugin/src/Caelestia/Config/tokens.cpp b/plugin/src/Caelestia/Config/tokens.cpp index 3c987ac1..281d232f 100644 --- a/plugin/src/Caelestia/Config/tokens.cpp +++ b/plugin/src/Caelestia/Config/tokens.cpp @@ -20,17 +20,7 @@ QString configDir() { TokenConfig::TokenConfig(QObject* parent) : RootConfig(parent) , m_appearance(new AppearanceTokens(this)) - , m_bar(new BarTokens(this)) - , m_dashboard(new DashboardTokens(this)) - , m_launcher(new LauncherTokens(this)) - , m_notifs(new NotifsTokens(this)) - , m_osd(new OsdTokens(this)) - , m_session(new SessionTokens(this)) - , m_sidebar(new SidebarTokens(this)) - , m_utilities(new UtilitiesTokens(this)) - , m_lock(new LockTokens(this)) - , m_winfo(new WInfoTokens(this)) - , m_controlCenter(new ControlCenterTokens(this)) { + , m_sizes(new SizeTokens(this)) { s_instance = this; setupFileBackend(configDir() + QStringLiteral("shell-tokens.json")); @@ -43,17 +33,7 @@ TokenConfig::TokenConfig(QObject* parent) TokenConfig::TokenConfig(TokenConfig* fallback, const QString& filePath, QObject* parent) : RootConfig(parent) , m_appearance(new AppearanceTokens(this)) - , m_bar(new BarTokens(this)) - , m_dashboard(new DashboardTokens(this)) - , m_launcher(new LauncherTokens(this)) - , m_notifs(new NotifsTokens(this)) - , m_osd(new OsdTokens(this)) - , m_session(new SessionTokens(this)) - , m_sidebar(new SidebarTokens(this)) - , m_utilities(new UtilitiesTokens(this)) - , m_lock(new LockTokens(this)) - , m_winfo(new WInfoTokens(this)) - , m_controlCenter(new ControlCenterTokens(this)) { + , m_sizes(new SizeTokens(this)) { setSparse(true); if (!filePath.isEmpty()) setupFileBackend(filePath); @@ -132,6 +112,13 @@ const AppearanceTransparency* Tokens::transparency() const { return a ? a->transparency() : nullptr; } +const SizeTokens* Tokens::sizes() const { + if (m_scope && m_scope->tokens()) + return m_scope->tokens()->sizes(); + auto* global = TokenConfig::instance(); + return global ? global->sizes() : nullptr; +} + Tokens* Tokens::qmlAttachedProperties(QObject* object) { // Ensure GlobalConfig singleton is created before any attached property access if (!GlobalConfig::instance()) { diff --git a/plugin/src/Caelestia/Config/tokens.hpp b/plugin/src/Caelestia/Config/tokens.hpp index 7b38804c..27858ccb 100644 --- a/plugin/src/Caelestia/Config/tokens.hpp +++ b/plugin/src/Caelestia/Config/tokens.hpp @@ -290,12 +290,10 @@ public: : ConfigObject(parent) {} }; -class TokenConfig : public RootConfig { +class SizeTokens : public ConfigObject { Q_OBJECT - QML_ELEMENT - QML_SINGLETON + QML_ANONYMOUS - CONFIG_SUBOBJECT(AppearanceTokens, appearance) CONFIG_SUBOBJECT(BarTokens, bar) CONFIG_SUBOBJECT(DashboardTokens, dashboard) CONFIG_SUBOBJECT(LauncherTokens, launcher) @@ -308,6 +306,30 @@ class TokenConfig : public RootConfig { CONFIG_SUBOBJECT(WInfoTokens, winfo) CONFIG_SUBOBJECT(ControlCenterTokens, controlCenter) +public: + explicit SizeTokens(QObject* parent = nullptr) + : ConfigObject(parent) + , m_bar(new BarTokens(this)) + , m_dashboard(new DashboardTokens(this)) + , m_launcher(new LauncherTokens(this)) + , m_notifs(new NotifsTokens(this)) + , m_osd(new OsdTokens(this)) + , m_session(new SessionTokens(this)) + , m_sidebar(new SidebarTokens(this)) + , m_utilities(new UtilitiesTokens(this)) + , m_lock(new LockTokens(this)) + , m_winfo(new WInfoTokens(this)) + , m_controlCenter(new ControlCenterTokens(this)) {} +}; + +class TokenConfig : public RootConfig { + Q_OBJECT + QML_ELEMENT + QML_SINGLETON + + CONFIG_SUBOBJECT(AppearanceTokens, appearance) + CONFIG_SUBOBJECT(SizeTokens, sizes) + public: static TokenConfig* instance(); [[nodiscard]] Q_INVOKABLE TokenConfig* defaults(); @@ -336,6 +358,7 @@ class Tokens : public QObject { Q_PROPERTY(const caelestia::config::AppearanceFont* font READ font NOTIFY sourceChanged) Q_PROPERTY(const caelestia::config::AppearanceAnim* anim READ anim NOTIFY sourceChanged) Q_PROPERTY(const caelestia::config::AppearanceTransparency* transparency READ transparency NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::SizeTokens* sizes READ sizes NOTIFY sourceChanged) public: explicit Tokens(ConfigScope* scope, QObject* parent = nullptr); @@ -346,6 +369,7 @@ public: [[nodiscard]] const AppearanceFont* font() const; [[nodiscard]] const AppearanceAnim* anim() const; [[nodiscard]] const AppearanceTransparency* transparency() const; + [[nodiscard]] const SizeTokens* sizes() const; static Tokens* qmlAttachedProperties(QObject* object); From b5dcd07ab8e8c4b1238feb4c49792fe9a2c927ef Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 21:24:16 +1000 Subject: [PATCH 23/81] fix: use correct size tokens in QML --- modules/background/Background.qml | 2 +- modules/bar/BarWrapper.qml | 2 +- modules/bar/components/Clock.qml | 2 +- modules/bar/components/StatusIcons.qml | 2 +- modules/bar/components/Tray.qml | 2 +- .../components/workspaces/ActiveIndicator.qml | 2 +- .../bar/components/workspaces/OccupiedBg.qml | 2 +- .../workspaces/SpecialWorkspaces.qml | 2 +- .../bar/components/workspaces/Workspace.qml | 4 ++-- .../bar/components/workspaces/Workspaces.qml | 2 +- modules/bar/popouts/ActiveWindow.qml | 4 ++-- modules/bar/popouts/Battery.qml | 2 +- modules/bar/popouts/Network.qml | 2 +- modules/bar/popouts/TrayMenu.qml | 4 ++-- modules/bar/popouts/kblayout/KbLayout.qml | 2 +- modules/controlcenter/ControlCenter.qml | 4 ++-- modules/controlcenter/launcher/Settings.qml | 8 +++---- modules/dashboard/Dash.qml | 2 +- modules/dashboard/Media.qml | 14 +++++------ modules/dashboard/Tabs.qml | 2 +- modules/dashboard/dash/DateTime.qml | 2 +- modules/dashboard/dash/Media.qml | 24 +++++++++---------- modules/dashboard/dash/Resources.qml | 2 +- modules/dashboard/dash/User.qml | 8 +++---- modules/launcher/AppList.qml | 2 +- modules/launcher/ContentList.qml | 6 ++--- modules/launcher/WallpaperList.qml | 2 +- modules/launcher/items/ActionItem.qml | 2 +- modules/launcher/items/AppItem.qml | 2 +- modules/launcher/items/CalcItem.qml | 2 +- modules/launcher/items/SchemeItem.qml | 2 +- modules/launcher/items/VariantItem.qml | 2 +- modules/launcher/items/WallpaperItem.qml | 2 +- modules/lock/Center.qml | 2 +- modules/lock/LockSurface.qml | 8 +++---- modules/lock/NotifGroup.qml | 20 ++++++++-------- modules/notifications/Content.qml | 4 ++-- modules/notifications/Notification.qml | 22 ++++++++--------- modules/osd/Content.qml | 14 +++++------ modules/session/Content.qml | 8 +++---- modules/sidebar/NotifGroup.qml | 22 ++++++++--------- modules/sidebar/Wrapper.qml | 4 ++-- modules/utilities/Wrapper.qml | 2 +- modules/utilities/toasts/Toasts.qml | 2 +- modules/windowinfo/WindowInfo.qml | 4 ++-- services/NotifData.qml | 6 ++--- 46 files changed, 121 insertions(+), 121 deletions(-) diff --git a/modules/background/Background.qml b/modules/background/Background.qml index 14669eab..1fe3be74 100644 --- a/modules/background/Background.qml +++ b/modules/background/Background.qml @@ -57,7 +57,7 @@ Variants { active: Config.background.desktopClock.enabled anchors.margins: Tokens.padding.large * 2 - anchors.leftMargin: Tokens.padding.large * 2 + Config.bar.sizes.innerWidth + Math.max(Tokens.padding.smaller, Config.border.thickness) + anchors.leftMargin: Tokens.padding.large * 2 + Tokens.sizes.bar.innerWidth + Math.max(Tokens.padding.smaller, Config.border.thickness) state: Config.background.desktopClock.position states: [ diff --git a/modules/bar/BarWrapper.qml b/modules/bar/BarWrapper.qml index 8ea61505..52050e05 100644 --- a/modules/bar/BarWrapper.qml +++ b/modules/bar/BarWrapper.qml @@ -19,7 +19,7 @@ Item { readonly property int clampedWidth: Math.max(Config.border.minThickness, implicitWidth) readonly property int padding: Math.max(Tokens.padding.smaller, Config.border.thickness) - readonly property int contentWidth: Config.bar.sizes.innerWidth + padding * 2 + readonly property int contentWidth: Tokens.sizes.bar.innerWidth + padding * 2 readonly property int exclusiveZone: !disabled && (Config.bar.persistent || visibilities.bar) ? contentWidth : Config.border.thickness readonly property bool shouldBeVisible: !fullscreen && !disabled && (Config.bar.persistent || visibilities.bar || isHovered) property bool isHovered diff --git a/modules/bar/components/Clock.qml b/modules/bar/components/Clock.qml index ead13d9e..693659c5 100644 --- a/modules/bar/components/Clock.qml +++ b/modules/bar/components/Clock.qml @@ -11,7 +11,7 @@ StyledRect { readonly property color colour: Colours.palette.m3tertiary readonly property int padding: Config.bar.clock.background ? Tokens.padding.normal : Tokens.padding.small - implicitWidth: Config.bar.sizes.innerWidth + implicitWidth: Tokens.sizes.bar.innerWidth implicitHeight: layout.implicitHeight + root.padding * 2 color: Qt.alpha(Colours.tPalette.m3surfaceContainer, Config.bar.clock.background ? Colours.tPalette.m3surfaceContainer.a : 0) diff --git a/modules/bar/components/StatusIcons.qml b/modules/bar/components/StatusIcons.qml index c32bc21f..c2a4b047 100644 --- a/modules/bar/components/StatusIcons.qml +++ b/modules/bar/components/StatusIcons.qml @@ -20,7 +20,7 @@ StyledRect { radius: Tokens.rounding.full clip: true - implicitWidth: Config.bar.sizes.innerWidth + implicitWidth: Tokens.sizes.bar.innerWidth implicitHeight: iconColumn.implicitHeight + Tokens.padding.normal * 2 - (Config.bar.status.showLockStatus && !Hypr.capsLock && !Hypr.numLock ? iconColumn.spacing : 0) ColumnLayout { diff --git a/modules/bar/components/Tray.qml b/modules/bar/components/Tray.qml index 76785813..98650fae 100644 --- a/modules/bar/components/Tray.qml +++ b/modules/bar/components/Tray.qml @@ -28,7 +28,7 @@ StyledRect { clip: true visible: height > 0 - implicitWidth: Config.bar.sizes.innerWidth + implicitWidth: Tokens.sizes.bar.innerWidth implicitHeight: nonAnimHeight color: Qt.alpha(Colours.tPalette.m3surfaceContainer, (Config.bar.tray.background && items.count > 0) ? Colours.tPalette.m3surfaceContainer.a : 0) diff --git a/modules/bar/components/workspaces/ActiveIndicator.qml b/modules/bar/components/workspaces/ActiveIndicator.qml index 0c785901..c76f9457 100644 --- a/modules/bar/components/workspaces/ActiveIndicator.qml +++ b/modules/bar/components/workspaces/ActiveIndicator.qml @@ -42,7 +42,7 @@ StyledRect { clip: true y: offset + mask.y - implicitWidth: Config.bar.sizes.innerWidth - Tokens.padding.small * 2 + implicitWidth: Tokens.sizes.bar.innerWidth - Tokens.padding.small * 2 implicitHeight: size radius: Tokens.rounding.full color: Colours.palette.m3primary diff --git a/modules/bar/components/workspaces/OccupiedBg.qml b/modules/bar/components/workspaces/OccupiedBg.qml index 891b1250..da7e70c6 100644 --- a/modules/bar/components/workspaces/OccupiedBg.qml +++ b/modules/bar/components/workspaces/OccupiedBg.qml @@ -65,7 +65,7 @@ Item { anchors.horizontalCenter: root.horizontalCenter y: (start?.y ?? 0) - 1 - implicitWidth: Config.bar.sizes.innerWidth - Tokens.padding.small * 2 + 2 + implicitWidth: Tokens.sizes.bar.innerWidth - Tokens.padding.small * 2 + 2 implicitHeight: start && end ? end.y + end.size - start.y + 2 : 0 color: Colours.layer(Colours.palette.m3surfaceContainerHigh, 2) diff --git a/modules/bar/components/workspaces/SpecialWorkspaces.qml b/modules/bar/components/workspaces/SpecialWorkspaces.qml index 741d4340..70eb22a0 100644 --- a/modules/bar/components/workspaces/SpecialWorkspaces.qml +++ b/modules/bar/components/workspaces/SpecialWorkspaces.qml @@ -284,7 +284,7 @@ Item { asynchronous: true Layout.alignment: Qt.AlignHCenter | Qt.AlignTop - Layout.preferredHeight: Config.bar.sizes.innerWidth - Tokens.padding.small * 2 + Layout.preferredHeight: Tokens.sizes.bar.innerWidth - Tokens.padding.small * 2 sourceComponent: ws.icon.length === 1 ? letterComp : iconComp diff --git a/modules/bar/components/workspaces/Workspace.qml b/modules/bar/components/workspaces/Workspace.qml index af037051..62d09d4b 100644 --- a/modules/bar/components/workspaces/Workspace.qml +++ b/modules/bar/components/workspaces/Workspace.qml @@ -33,7 +33,7 @@ ColumnLayout { id: indicator Layout.alignment: Qt.AlignHCenter | Qt.AlignTop - Layout.preferredHeight: Config.bar.sizes.innerWidth - Tokens.padding.small * 2 + Layout.preferredHeight: Tokens.sizes.bar.innerWidth - Tokens.padding.small * 2 animate: true text: { @@ -61,7 +61,7 @@ ColumnLayout { Layout.alignment: Qt.AlignHCenter Layout.fillHeight: true - Layout.topMargin: -Config.bar.sizes.innerWidth / 10 + Layout.topMargin: -Tokens.sizes.bar.innerWidth / 10 visible: active active: root.hasWindows diff --git a/modules/bar/components/workspaces/Workspaces.qml b/modules/bar/components/workspaces/Workspaces.qml index a0ccb775..ae43f974 100644 --- a/modules/bar/components/workspaces/Workspaces.qml +++ b/modules/bar/components/workspaces/Workspaces.qml @@ -27,7 +27,7 @@ StyledClippingRect { property real blur: onSpecial ? 1 : 0 - implicitWidth: Config.bar.sizes.innerWidth + implicitWidth: Tokens.sizes.bar.innerWidth implicitHeight: layout.implicitHeight + Tokens.padding.small * 2 color: Colours.tPalette.m3surfaceContainer diff --git a/modules/bar/popouts/ActiveWindow.qml b/modules/bar/popouts/ActiveWindow.qml index a37d81f9..e0ef85d9 100644 --- a/modules/bar/popouts/ActiveWindow.qml +++ b/modules/bar/popouts/ActiveWindow.qml @@ -95,8 +95,8 @@ Item { captureSource: Hypr.activeToplevel?.wayland ?? null // qmllint disable unresolved-type live: visible - constraintSize.width: Config.bar.sizes.windowPreviewSize - constraintSize.height: Config.bar.sizes.windowPreviewSize + constraintSize.width: Tokens.sizes.bar.windowPreviewSize + constraintSize.height: Tokens.sizes.bar.windowPreviewSize } } } diff --git a/modules/bar/popouts/Battery.qml b/modules/bar/popouts/Battery.qml index 2a11071e..149e21c2 100644 --- a/modules/bar/popouts/Battery.qml +++ b/modules/bar/popouts/Battery.qml @@ -10,7 +10,7 @@ Column { id: root spacing: Tokens.spacing.normal - width: Config.bar.sizes.batteryWidth + width: Tokens.sizes.bar.batteryWidth StyledText { text: UPower.displayDevice.isLaptopBattery ? qsTr("Remaining: %1%").arg(Math.round(UPower.displayDevice.percentage * 100)) : qsTr("No battery detected") diff --git a/modules/bar/popouts/Network.qml b/modules/bar/popouts/Network.qml index 6bcf6604..cec936d9 100644 --- a/modules/bar/popouts/Network.qml +++ b/modules/bar/popouts/Network.qml @@ -20,7 +20,7 @@ ColumnLayout { property bool showPasswordDialog: false spacing: Tokens.spacing.small - width: Config.bar.sizes.networkWidth + width: Tokens.sizes.bar.networkWidth // Wireless section StyledText { diff --git a/modules/bar/popouts/TrayMenu.qml b/modules/bar/popouts/TrayMenu.qml index f39d64b0..9576049b 100644 --- a/modules/bar/popouts/TrayMenu.qml +++ b/modules/bar/popouts/TrayMenu.qml @@ -78,7 +78,7 @@ StackView { required property QsMenuEntry modelData - implicitWidth: Config.bar.sizes.trayMenuWidth + implicitWidth: Tokens.sizes.bar.trayMenuWidth implicitHeight: modelData.isSeparator ? 1 : children.implicitHeight radius: Tokens.rounding.full @@ -152,7 +152,7 @@ StackView { font.family: label.font.family elide: Text.ElideRight - elideWidth: Config.bar.sizes.trayMenuWidth - (icon.active ? icon.implicitWidth + label.anchors.leftMargin : 0) - (expand.active ? expand.implicitWidth + Tokens.spacing.normal : 0) + elideWidth: Tokens.sizes.bar.trayMenuWidth - (icon.active ? icon.implicitWidth + label.anchors.leftMargin : 0) - (expand.active ? expand.implicitWidth + Tokens.spacing.normal : 0) } Loader { diff --git a/modules/bar/popouts/kblayout/KbLayout.qml b/modules/bar/popouts/kblayout/KbLayout.qml index 5767de46..265d3ab8 100644 --- a/modules/bar/popouts/kblayout/KbLayout.qml +++ b/modules/bar/popouts/kblayout/KbLayout.qml @@ -15,7 +15,7 @@ ColumnLayout { } spacing: Tokens.spacing.small - width: Config.bar.sizes.kbLayoutWidth + width: Tokens.sizes.bar.kbLayoutWidth Component.onCompleted: kb.start() diff --git a/modules/controlcenter/ControlCenter.qml b/modules/controlcenter/ControlCenter.qml index 9b1f01ea..b2c07e52 100644 --- a/modules/controlcenter/ControlCenter.qml +++ b/modules/controlcenter/ControlCenter.qml @@ -27,8 +27,8 @@ Item { signal close - implicitWidth: implicitHeight * Config.controlCenter.sizes.ratio - implicitHeight: screen.height * Config.controlCenter.sizes.heightMult + implicitWidth: implicitHeight * Tokens.sizes.controlCenter.ratio + implicitHeight: screen.height * Tokens.sizes.controlCenter.heightMult GridLayout { anchors.fill: parent diff --git a/modules/controlcenter/launcher/Settings.qml b/modules/controlcenter/launcher/Settings.qml index 1641570c..ec29aeb2 100644 --- a/modules/controlcenter/launcher/Settings.qml +++ b/modules/controlcenter/launcher/Settings.qml @@ -178,25 +178,25 @@ ColumnLayout { PropertyRow { label: qsTr("Item width") - value: qsTr("%1 px").arg(Config.launcher.sizes.itemWidth) + value: qsTr("%1 px").arg(Tokens.sizes.launcher.itemWidth) } PropertyRow { showTopMargin: true label: qsTr("Item height") - value: qsTr("%1 px").arg(Config.launcher.sizes.itemHeight) + value: qsTr("%1 px").arg(Tokens.sizes.launcher.itemHeight) } PropertyRow { showTopMargin: true label: qsTr("Wallpaper width") - value: qsTr("%1 px").arg(Config.launcher.sizes.wallpaperWidth) + value: qsTr("%1 px").arg(Tokens.sizes.launcher.wallpaperWidth) } PropertyRow { showTopMargin: true label: qsTr("Wallpaper height") - value: qsTr("%1 px").arg(Config.launcher.sizes.wallpaperHeight) + value: qsTr("%1 px").arg(Tokens.sizes.launcher.wallpaperHeight) } } diff --git a/modules/dashboard/Dash.qml b/modules/dashboard/Dash.qml index 3de9fb6b..cc6c5171 100644 --- a/modules/dashboard/Dash.qml +++ b/modules/dashboard/Dash.qml @@ -34,7 +34,7 @@ GridLayout { Rect { Layout.row: 0 Layout.columnSpan: 2 - Layout.preferredWidth: Config.dashboard.sizes.weatherWidth + Layout.preferredWidth: Tokens.sizes.dashboard.weatherWidth Layout.fillHeight: true radius: Tokens.rounding.large * 1.5 diff --git a/modules/dashboard/Media.qml b/modules/dashboard/Media.qml index d8ed44b3..43a2311e 100644 --- a/modules/dashboard/Media.qml +++ b/modules/dashboard/Media.qml @@ -18,7 +18,7 @@ Item { required property DrawerVisibilities visibilities readonly property bool needsKeyboard: lyricMenuOpen - readonly property real nonAnimHeight: Math.max(cover.implicitHeight + Config.dashboard.sizes.mediaVisualiserSize * 2, lyricMenuOpen ? lyricMenu.implicitHeight : details.implicitHeight, bongocat.implicitHeight) + Tokens.padding.large * 2 + readonly property real nonAnimHeight: Math.max(cover.implicitHeight + Tokens.sizes.dashboard.mediaVisualiserSize * 2, lyricMenuOpen ? lyricMenu.implicitHeight : details.implicitHeight, bongocat.implicitHeight) + Tokens.padding.large * 2 readonly property real detailsHeightWithoutLyrics: details.implicitHeight - lyricsViewInDetails.implicitHeight property bool lyricMenuOpen: false @@ -52,7 +52,7 @@ Item { } } - implicitWidth: cover.implicitWidth + Config.dashboard.sizes.mediaVisualiserSize * 2 + details.implicitWidth + details.anchors.leftMargin + bongocat.implicitWidth + bongocat.anchors.leftMargin * 2 + Tokens.padding.large * 2 + implicitWidth: cover.implicitWidth + Tokens.sizes.dashboard.mediaVisualiserSize * 2 + details.implicitWidth + details.anchors.leftMargin + bongocat.implicitWidth + bongocat.anchors.leftMargin * 2 + Tokens.padding.large * 2 implicitHeight: nonAnimHeight Behavior on implicitHeight { @@ -111,7 +111,7 @@ Item { property color colour: Colours.palette.m3primary anchors.fill: cover - anchors.margins: -Config.dashboard.sizes.mediaVisualiserSize + anchors.margins: -Tokens.sizes.dashboard.mediaVisualiserSize asynchronous: true preferredRendererType: Shape.CurveRenderer @@ -132,7 +132,7 @@ Item { readonly property real value: Math.max(1e-3, Math.min(1, Audio.cava.values[modelData])) readonly property real angle: modelData * 2 * Math.PI / Config.services.visualiserBars - readonly property real magnitude: value * Config.dashboard.sizes.mediaVisualiserSize + readonly property real magnitude: value * Tokens.sizes.dashboard.mediaVisualiserSize readonly property real cos: Math.cos(angle) readonly property real sin: Math.sin(angle) @@ -159,10 +159,10 @@ Item { anchors.verticalCenter: parent.verticalCenter anchors.left: parent.left - anchors.leftMargin: Tokens.padding.large + Config.dashboard.sizes.mediaVisualiserSize + anchors.leftMargin: Tokens.padding.large + Tokens.sizes.dashboard.mediaVisualiserSize - implicitWidth: Config.dashboard.sizes.mediaCoverArtSize - implicitHeight: Config.dashboard.sizes.mediaCoverArtSize + implicitWidth: Tokens.sizes.dashboard.mediaCoverArtSize + implicitHeight: Tokens.sizes.dashboard.mediaCoverArtSize color: Colours.tPalette.m3surfaceContainerHigh radius: Infinity diff --git a/modules/dashboard/Tabs.qml b/modules/dashboard/Tabs.qml index 94556aca..04728d2e 100644 --- a/modules/dashboard/Tabs.qml +++ b/modules/dashboard/Tabs.qml @@ -182,7 +182,7 @@ Item { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - implicitHeight: parent.height + Config.dashboard.sizes.tabIndicatorSpacing * 2 + implicitHeight: parent.height + Tokens.sizes.dashboard.tabIndicatorSpacing * 2 color: "transparent" radius: Tokens.rounding.small diff --git a/modules/dashboard/dash/DateTime.qml b/modules/dashboard/dash/DateTime.qml index 1b43b137..2df22d15 100644 --- a/modules/dashboard/dash/DateTime.qml +++ b/modules/dashboard/dash/DateTime.qml @@ -11,7 +11,7 @@ Item { anchors.top: parent.top anchors.bottom: parent.bottom - implicitWidth: Config.dashboard.sizes.dateTimeWidth + implicitWidth: Tokens.sizes.dashboard.dateTimeWidth ColumnLayout { anchors.left: parent.left diff --git a/modules/dashboard/dash/Media.qml b/modules/dashboard/dash/Media.qml index d6cfa76a..07d2352e 100644 --- a/modules/dashboard/dash/Media.qml +++ b/modules/dashboard/dash/Media.qml @@ -16,7 +16,7 @@ Item { anchors.top: parent.top anchors.bottom: parent.bottom - implicitWidth: Config.dashboard.sizes.mediaWidth + implicitWidth: Tokens.sizes.dashboard.mediaWidth Behavior on playerProgress { Anim { @@ -42,16 +42,16 @@ Item { ShapePath { fillColor: "transparent" strokeColor: Colours.layer(Colours.palette.m3surfaceContainerHigh, 2) - strokeWidth: Config.dashboard.sizes.mediaProgressThickness + strokeWidth: Tokens.sizes.dashboard.mediaProgressThickness capStyle: Tokens.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap PathAngleArc { centerX: cover.x + cover.width / 2 centerY: cover.y + cover.height / 2 - radiusX: (cover.width + Config.dashboard.sizes.mediaProgressThickness) / 2 + Tokens.spacing.small - radiusY: (cover.height + Config.dashboard.sizes.mediaProgressThickness) / 2 + Tokens.spacing.small - startAngle: -90 - Config.dashboard.sizes.mediaProgressSweep / 2 - sweepAngle: Config.dashboard.sizes.mediaProgressSweep + radiusX: (cover.width + Tokens.sizes.dashboard.mediaProgressThickness) / 2 + Tokens.spacing.small + radiusY: (cover.height + Tokens.sizes.dashboard.mediaProgressThickness) / 2 + Tokens.spacing.small + startAngle: -90 - Tokens.sizes.dashboard.mediaProgressSweep / 2 + sweepAngle: Tokens.sizes.dashboard.mediaProgressSweep } Behavior on strokeColor { @@ -62,16 +62,16 @@ Item { ShapePath { fillColor: "transparent" strokeColor: Colours.palette.m3primary - strokeWidth: Config.dashboard.sizes.mediaProgressThickness + strokeWidth: Tokens.sizes.dashboard.mediaProgressThickness capStyle: Tokens.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap PathAngleArc { centerX: cover.x + cover.width / 2 centerY: cover.y + cover.height / 2 - radiusX: (cover.width + Config.dashboard.sizes.mediaProgressThickness) / 2 + Tokens.spacing.small - radiusY: (cover.height + Config.dashboard.sizes.mediaProgressThickness) / 2 + Tokens.spacing.small - startAngle: -90 - Config.dashboard.sizes.mediaProgressSweep / 2 - sweepAngle: Config.dashboard.sizes.mediaProgressSweep * root.playerProgress + radiusX: (cover.width + Tokens.sizes.dashboard.mediaProgressThickness) / 2 + Tokens.spacing.small + radiusY: (cover.height + Tokens.sizes.dashboard.mediaProgressThickness) / 2 + Tokens.spacing.small + startAngle: -90 - Tokens.sizes.dashboard.mediaProgressSweep / 2 + sweepAngle: Tokens.sizes.dashboard.mediaProgressSweep * root.playerProgress } Behavior on strokeColor { @@ -86,7 +86,7 @@ Item { anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right - anchors.margins: Tokens.padding.large + Config.dashboard.sizes.mediaProgressThickness + Tokens.spacing.small + anchors.margins: Tokens.padding.large + Tokens.sizes.dashboard.mediaProgressThickness + Tokens.spacing.small implicitHeight: width color: Colours.tPalette.m3surfaceContainerHigh diff --git a/modules/dashboard/dash/Resources.qml b/modules/dashboard/dash/Resources.qml index 3dec14f2..f492cc58 100644 --- a/modules/dashboard/dash/Resources.qml +++ b/modules/dashboard/dash/Resources.qml @@ -53,7 +53,7 @@ Row { anchors.bottom: icon.top anchors.bottomMargin: Tokens.spacing.small - implicitWidth: Config.dashboard.sizes.resourceProgessThickness + implicitWidth: Tokens.sizes.dashboard.resourceProgessThickness color: Colours.layer(Colours.palette.m3surfaceContainerHigh, 2) radius: Tokens.rounding.full diff --git a/modules/dashboard/dash/User.qml b/modules/dashboard/dash/User.qml index 03ca0e6b..3b13bc7c 100644 --- a/modules/dashboard/dash/User.qml +++ b/modules/dashboard/dash/User.qml @@ -120,7 +120,7 @@ Row { id: icon anchors.left: parent.left - anchors.leftMargin: (Config.dashboard.sizes.infoIconSize - implicitWidth) / 2 + anchors.leftMargin: (Tokens.sizes.dashboard.infoIconSize - implicitWidth) / 2 source: SysInfo.osLogo implicitSize: Math.floor(Tokens.font.size.normal * 1.34) @@ -136,7 +136,7 @@ Row { text: `: ${SysInfo.osPrettyName || SysInfo.osName}` font.pointSize: Tokens.font.size.normal - width: Config.dashboard.sizes.infoWidth + width: Tokens.sizes.dashboard.infoWidth elide: Text.ElideRight } } @@ -170,7 +170,7 @@ Row { id: icon anchors.left: parent.left - anchors.leftMargin: (Config.dashboard.sizes.infoIconSize - implicitWidth) / 2 + anchors.leftMargin: (Tokens.sizes.dashboard.infoIconSize - implicitWidth) / 2 fill: 1 text: line.icon @@ -187,7 +187,7 @@ Row { text: `: ${line.text}` font.pointSize: Tokens.font.size.normal - width: Config.dashboard.sizes.infoWidth + width: Tokens.sizes.dashboard.infoWidth elide: Text.ElideRight } } diff --git a/modules/launcher/AppList.qml b/modules/launcher/AppList.qml index 7ce6038d..bdad31e0 100644 --- a/modules/launcher/AppList.qml +++ b/modules/launcher/AppList.qml @@ -24,7 +24,7 @@ StyledListView { spacing: Tokens.spacing.small orientation: Qt.Vertical - implicitHeight: (Config.launcher.sizes.itemHeight + spacing) * Math.min(Config.launcher.maxShown, count) - spacing + implicitHeight: (Tokens.sizes.launcher.itemHeight + spacing) * Math.min(Config.launcher.maxShown, count) - spacing preferredHighlightBegin: 0 preferredHighlightEnd: height diff --git a/modules/launcher/ContentList.qml b/modules/launcher/ContentList.qml index d36cfad9..e59dd382 100644 --- a/modules/launcher/ContentList.qml +++ b/modules/launcher/ContentList.qml @@ -32,7 +32,7 @@ Item { name: "apps" PropertyChanges { - root.implicitWidth: Config.launcher.sizes.itemWidth + root.implicitWidth: Tokens.sizes.launcher.itemWidth root.implicitHeight: Math.min(root.maxHeight, appList.implicitHeight > 0 ? appList.implicitHeight : empty.implicitHeight) appList.active: true } @@ -46,8 +46,8 @@ Item { name: "wallpapers" PropertyChanges { - root.implicitWidth: Math.max(Config.launcher.sizes.itemWidth * 1.2, wallpaperList.implicitWidth) - root.implicitHeight: Config.launcher.sizes.wallpaperHeight + root.implicitWidth: Math.max(Tokens.sizes.launcher.itemWidth * 1.2, wallpaperList.implicitWidth) + root.implicitHeight: Tokens.sizes.launcher.wallpaperHeight wallpaperList.active: true } } diff --git a/modules/launcher/WallpaperList.qml b/modules/launcher/WallpaperList.qml index dc2dd003..705563a8 100644 --- a/modules/launcher/WallpaperList.qml +++ b/modules/launcher/WallpaperList.qml @@ -15,7 +15,7 @@ PathView { required property var panels required property var content - readonly property int itemWidth: Config.launcher.sizes.wallpaperWidth * 0.8 + Tokens.padding.larger * 2 + readonly property int itemWidth: Tokens.sizes.launcher.wallpaperWidth * 0.8 + Tokens.padding.larger * 2 readonly property int numItems: { const screen = (QsWindow.window as QsWindow)?.screen; diff --git a/modules/launcher/items/ActionItem.qml b/modules/launcher/items/ActionItem.qml index c0fb4ac2..06d3e0c9 100644 --- a/modules/launcher/items/ActionItem.qml +++ b/modules/launcher/items/ActionItem.qml @@ -9,7 +9,7 @@ Item { required property var modelData required property var list - implicitHeight: Config.launcher.sizes.itemHeight + implicitHeight: Tokens.sizes.launcher.itemHeight anchors.left: parent?.left anchors.right: parent?.right diff --git a/modules/launcher/items/AppItem.qml b/modules/launcher/items/AppItem.qml index e021275c..f65a6b65 100644 --- a/modules/launcher/items/AppItem.qml +++ b/modules/launcher/items/AppItem.qml @@ -13,7 +13,7 @@ Item { required property DesktopEntry modelData required property DrawerVisibilities visibilities - implicitHeight: Config.launcher.sizes.itemHeight + implicitHeight: Tokens.sizes.launcher.itemHeight anchors.left: parent?.left anchors.right: parent?.right diff --git a/modules/launcher/items/CalcItem.qml b/modules/launcher/items/CalcItem.qml index a016f585..d18cbf90 100644 --- a/modules/launcher/items/CalcItem.qml +++ b/modules/launcher/items/CalcItem.qml @@ -22,7 +22,7 @@ Item { Qalculator.evalAsync(math); } - implicitHeight: Config.launcher.sizes.itemHeight + implicitHeight: Tokens.sizes.launcher.itemHeight anchors.left: parent?.left anchors.right: parent?.right diff --git a/modules/launcher/items/SchemeItem.qml b/modules/launcher/items/SchemeItem.qml index 2fbfabaa..c5d9d8bb 100644 --- a/modules/launcher/items/SchemeItem.qml +++ b/modules/launcher/items/SchemeItem.qml @@ -10,7 +10,7 @@ Item { required property Schemes.Scheme modelData required property var list - implicitHeight: Config.launcher.sizes.itemHeight + implicitHeight: Tokens.sizes.launcher.itemHeight anchors.left: parent?.left anchors.right: parent?.right diff --git a/modules/launcher/items/VariantItem.qml b/modules/launcher/items/VariantItem.qml index 73f66994..eb486ea1 100644 --- a/modules/launcher/items/VariantItem.qml +++ b/modules/launcher/items/VariantItem.qml @@ -10,7 +10,7 @@ Item { required property M3Variants.Variant modelData required property var list - implicitHeight: Config.launcher.sizes.itemHeight + implicitHeight: Tokens.sizes.launcher.itemHeight anchors.left: parent?.left anchors.right: parent?.right diff --git a/modules/launcher/items/WallpaperItem.qml b/modules/launcher/items/WallpaperItem.qml index 7ffa75f7..cd41a315 100644 --- a/modules/launcher/items/WallpaperItem.qml +++ b/modules/launcher/items/WallpaperItem.qml @@ -52,7 +52,7 @@ Item { color: Colours.tPalette.m3surfaceContainer radius: Tokens.rounding.normal - implicitWidth: Config.launcher.sizes.wallpaperWidth + implicitWidth: Tokens.sizes.launcher.wallpaperWidth implicitHeight: implicitWidth / 16 * 9 MaterialIcon { diff --git a/modules/lock/Center.qml b/modules/lock/Center.qml index 95cd6018..aa4bd51b 100644 --- a/modules/lock/Center.qml +++ b/modules/lock/Center.qml @@ -14,7 +14,7 @@ ColumnLayout { required property var lock readonly property real centerScale: Math.min(1, (lock.screen?.height ?? 1440) / 1440) - readonly property int centerWidth: Config.lock.sizes.centerWidth * centerScale + readonly property int centerWidth: Tokens.sizes.lock.centerWidth * centerScale Layout.preferredWidth: centerWidth Layout.fillWidth: false diff --git a/modules/lock/LockSurface.qml b/modules/lock/LockSurface.qml index c0c1bfd3..d0001e23 100644 --- a/modules/lock/LockSurface.qml +++ b/modules/lock/LockSurface.qml @@ -144,14 +144,14 @@ WlSessionLockSurface { Anim { target: lockContent property: "implicitWidth" - to: (root.screen?.height ?? 0) * Config.lock.sizes.heightMult * Config.lock.sizes.ratio + to: (root.screen?.height ?? 0) * Tokens.sizes.lock.heightMult * Tokens.sizes.lock.ratio duration: Tokens.anim.durations.expressiveDefaultSpatial easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } Anim { target: lockContent property: "implicitHeight" - to: (root.screen?.height ?? 0) * Config.lock.sizes.heightMult + to: (root.screen?.height ?? 0) * Tokens.sizes.lock.heightMult duration: Tokens.anim.durations.expressiveDefaultSpatial easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial } @@ -219,8 +219,8 @@ WlSessionLockSurface { id: content anchors.centerIn: parent - width: (root.screen?.height ?? 0) * Config.lock.sizes.heightMult * Config.lock.sizes.ratio - Tokens.padding.large * 2 - height: (root.screen?.height ?? 0) * Config.lock.sizes.heightMult - Tokens.padding.large * 2 + width: (root.screen?.height ?? 0) * Tokens.sizes.lock.heightMult * Tokens.sizes.lock.ratio - Tokens.padding.large * 2 + height: (root.screen?.height ?? 0) * Tokens.sizes.lock.heightMult - Tokens.padding.large * 2 lock: root opacity: 0 diff --git a/modules/lock/NotifGroup.qml b/modules/lock/NotifGroup.qml index c8e5426e..2fdb6fb1 100644 --- a/modules/lock/NotifGroup.qml +++ b/modules/lock/NotifGroup.qml @@ -64,8 +64,8 @@ StyledRect { Item { Layout.alignment: Qt.AlignLeft | Qt.AlignTop - implicitWidth: Config.notifs.sizes.image - implicitHeight: Config.notifs.sizes.image + implicitWidth: Tokens.sizes.notifs.image + implicitHeight: Tokens.sizes.notifs.image Component { id: imageComp @@ -73,12 +73,12 @@ StyledRect { Image { source: Qt.resolvedUrl(root.image) fillMode: Image.PreserveAspectCrop - sourceSize.width: Config.notifs.sizes.image - sourceSize.height: Config.notifs.sizes.image + sourceSize.width: Tokens.sizes.notifs.image + sourceSize.height: Tokens.sizes.notifs.image cache: false asynchronous: true - width: Config.notifs.sizes.image - height: Config.notifs.sizes.image + width: Tokens.sizes.notifs.image + height: Tokens.sizes.notifs.image } } @@ -86,7 +86,7 @@ StyledRect { id: appIconComp ColouredIcon { - implicitSize: Math.round(Config.notifs.sizes.image * 0.6) + implicitSize: Math.round(Tokens.sizes.notifs.image * 0.6) source: Quickshell.iconPath(root.appIcon) colour: root.urgency === "critical" ? Colours.palette.m3onError : root.urgency === "low" ? Colours.palette.m3onSurface : Colours.palette.m3onSecondaryContainer layer.enabled: root.appIcon.endsWith("symbolic") @@ -122,15 +122,15 @@ StyledRect { active: root.appIcon && root.image sourceComponent: StyledRect { - implicitWidth: Config.notifs.sizes.badge - implicitHeight: Config.notifs.sizes.badge + implicitWidth: Tokens.sizes.notifs.badge + implicitHeight: Tokens.sizes.notifs.badge color: root.urgency === "critical" ? Colours.palette.m3error : root.urgency === "low" ? Colours.palette.m3surfaceContainerHighest : Colours.palette.m3secondaryContainer radius: Tokens.rounding.full ColouredIcon { anchors.centerIn: parent - implicitSize: Math.round(Config.notifs.sizes.badge * 0.6) + implicitSize: Math.round(Tokens.sizes.notifs.badge * 0.6) source: Quickshell.iconPath(root.appIcon) colour: root.urgency === "critical" ? Colours.palette.m3onError : root.urgency === "low" ? Colours.palette.m3onSurface : Colours.palette.m3onSecondaryContainer layer.enabled: root.appIcon.endsWith("symbolic") diff --git a/modules/notifications/Content.qml b/modules/notifications/Content.qml index c9f934aa..e32b84c6 100644 --- a/modules/notifications/Content.qml +++ b/modules/notifications/Content.qml @@ -19,7 +19,7 @@ Item { anchors.bottom: parent.bottom anchors.right: parent.right - implicitWidth: Config.notifs.sizes.width + padding * 2 + implicitWidth: Tokens.sizes.notifs.width + padding * 2 implicitHeight: { const count = list.count; if (count === 0) @@ -170,7 +170,7 @@ Item { Anim { target: notif property: "x" - to: (notif.x >= 0 ? Config.notifs.sizes.width : -Config.notifs.sizes.width) * 2 + to: (notif.x >= 0 ? Tokens.sizes.notifs.width : -Tokens.sizes.notifs.width) * 2 duration: Tokens.anim.durations.normal easing.bezierCurve: Tokens.anim.curves.emphasized } diff --git a/modules/notifications/Notification.qml b/modules/notifications/Notification.qml index b7d90fe7..2d4c4901 100644 --- a/modules/notifications/Notification.qml +++ b/modules/notifications/Notification.qml @@ -24,10 +24,10 @@ StyledRect { color: root.modelData.urgency === NotificationUrgency.Critical ? Colours.palette.m3secondaryContainer : Colours.tPalette.m3surfaceContainer radius: Tokens.rounding.normal - implicitWidth: Config.notifs.sizes.width + implicitWidth: Tokens.sizes.notifs.width implicitHeight: inner.implicitHeight - x: Config.notifs.sizes.width + x: Tokens.sizes.notifs.width Component.onCompleted: { x = 0; modelData.lock(this); @@ -68,7 +68,7 @@ StyledRect { if (!containsMouse) root.modelData.timer.start(); - if (Math.abs(root.x) < Config.notifs.sizes.width * Config.notifs.clearThreshold) + if (Math.abs(root.x) < Tokens.sizes.notifs.width * Config.notifs.clearThreshold) root.x = 0; else root.modelData.popup = false; @@ -114,21 +114,21 @@ StyledRect { anchors.left: parent.left anchors.top: parent.top - width: Config.notifs.sizes.image - height: Config.notifs.sizes.image + width: Tokens.sizes.notifs.image + height: Tokens.sizes.notifs.image visible: root.hasImage || root.hasAppIcon sourceComponent: ClippingRectangle { radius: Tokens.rounding.full - implicitWidth: Config.notifs.sizes.image - implicitHeight: Config.notifs.sizes.image + implicitWidth: Tokens.sizes.notifs.image + implicitHeight: Tokens.sizes.notifs.image Image { anchors.fill: parent source: Qt.resolvedUrl(root.modelData.image) fillMode: Image.PreserveAspectCrop - sourceSize.width: Config.notifs.sizes.image - sourceSize.height: Config.notifs.sizes.image + sourceSize.width: Tokens.sizes.notifs.image + sourceSize.height: Tokens.sizes.notifs.image cache: false asynchronous: true } @@ -149,8 +149,8 @@ StyledRect { sourceComponent: StyledRect { radius: Tokens.rounding.full color: root.modelData.urgency === NotificationUrgency.Critical ? Colours.palette.m3error : root.modelData.urgency === NotificationUrgency.Low ? Colours.layer(Colours.palette.m3surfaceContainerHighest, 2) : Colours.palette.m3secondaryContainer - implicitWidth: root.hasImage ? Config.notifs.sizes.badge : Config.notifs.sizes.image - implicitHeight: root.hasImage ? Config.notifs.sizes.badge : Config.notifs.sizes.image + implicitWidth: root.hasImage ? Tokens.sizes.notifs.badge : Tokens.sizes.notifs.image + implicitHeight: root.hasImage ? Tokens.sizes.notifs.badge : Tokens.sizes.notifs.image Loader { id: icon diff --git a/modules/osd/Content.qml b/modules/osd/Content.qml index b0022fd6..3a82f0d0 100644 --- a/modules/osd/Content.qml +++ b/modules/osd/Content.qml @@ -38,8 +38,8 @@ Item { Audio.decrementVolume(); } - implicitWidth: Config.osd.sizes.sliderWidth - implicitHeight: Config.osd.sizes.sliderHeight + implicitWidth: Tokens.sizes.osd.sliderWidth + implicitHeight: Tokens.sizes.osd.sliderHeight FilledSlider { anchors.fill: parent @@ -63,8 +63,8 @@ Item { Audio.decrementSourceVolume(); } - implicitWidth: Config.osd.sizes.sliderWidth - implicitHeight: Config.osd.sizes.sliderHeight + implicitWidth: Tokens.sizes.osd.sliderWidth + implicitHeight: Tokens.sizes.osd.sliderHeight FilledSlider { anchors.fill: parent @@ -92,8 +92,8 @@ Item { monitor.setBrightness(monitor.brightness - Config.services.brightnessIncrement); } - implicitWidth: Config.osd.sizes.sliderWidth - implicitHeight: Config.osd.sizes.sliderHeight + implicitWidth: Tokens.sizes.osd.sliderWidth + implicitHeight: Tokens.sizes.osd.sliderHeight FilledSlider { anchors.fill: parent @@ -110,7 +110,7 @@ Item { required property bool shouldBeActive asynchronous: true - Layout.preferredHeight: shouldBeActive ? Config.osd.sizes.sliderHeight : 0 + Layout.preferredHeight: shouldBeActive ? Tokens.sizes.osd.sliderHeight : 0 opacity: shouldBeActive ? 1 : 0 active: opacity > 0 visible: active diff --git a/modules/session/Content.qml b/modules/session/Content.qml index b84a5a42..45fc0283 100644 --- a/modules/session/Content.qml +++ b/modules/session/Content.qml @@ -46,8 +46,8 @@ Column { } AnimatedImage { - width: Config.session.sizes.button - height: Config.session.sizes.button + width: Tokens.sizes.session.button + height: Tokens.sizes.session.button sourceSize.width: width sourceSize.height: height @@ -82,8 +82,8 @@ Column { required property string icon required property list command - implicitWidth: Config.session.sizes.button - implicitHeight: Config.session.sizes.button + implicitWidth: Tokens.sizes.session.button + implicitHeight: Tokens.sizes.session.button radius: Tokens.rounding.large color: button.activeFocus ? Colours.palette.m3secondaryContainer : Colours.tPalette.m3surfaceContainer diff --git a/modules/sidebar/NotifGroup.qml b/modules/sidebar/NotifGroup.qml index 3d624bfc..2616d805 100644 --- a/modules/sidebar/NotifGroup.qml +++ b/modules/sidebar/NotifGroup.qml @@ -53,7 +53,7 @@ StyledRect { readonly property int nonAnimHeight: { const headerHeight = header.implicitHeight + (root.expanded ? Math.round(Tokens.spacing.small / 2) : 0); const columnHeight = headerHeight + notifList.layoutHeight + column.Layout.topMargin + column.Layout.bottomMargin; - return Math.round(Math.max(Config.notifs.sizes.image, columnHeight) + Tokens.padding.normal * 2); + return Math.round(Math.max(Tokens.sizes.notifs.image, columnHeight) + Tokens.padding.normal * 2); } readonly property bool expanded: props.expandedNotifs.includes(modelData) @@ -91,8 +91,8 @@ StyledRect { Item { Layout.alignment: Qt.AlignLeft | Qt.AlignTop - implicitWidth: Config.notifs.sizes.image - implicitHeight: Config.notifs.sizes.image + implicitWidth: Tokens.sizes.notifs.image + implicitHeight: Tokens.sizes.notifs.image Component { id: imageComp @@ -100,12 +100,12 @@ StyledRect { Image { source: Qt.resolvedUrl(root.image) fillMode: Image.PreserveAspectCrop - sourceSize.width: Config.notifs.sizes.image - sourceSize.height: Config.notifs.sizes.image + sourceSize.width: Tokens.sizes.notifs.image + sourceSize.height: Tokens.sizes.notifs.image cache: false asynchronous: true - width: Config.notifs.sizes.image - height: Config.notifs.sizes.image + width: Tokens.sizes.notifs.image + height: Tokens.sizes.notifs.image } } @@ -113,7 +113,7 @@ StyledRect { id: appIconComp ColouredIcon { - implicitSize: Math.round(Config.notifs.sizes.image * 0.6) + implicitSize: Math.round(Tokens.sizes.notifs.image * 0.6) source: Quickshell.iconPath(root.appIcon) colour: root.urgency === NotificationUrgency.Critical ? Colours.palette.m3onError : root.urgency === NotificationUrgency.Low ? Colours.palette.m3onSurface : Colours.palette.m3onSecondaryContainer layer.enabled: root.appIcon.endsWith("symbolic") @@ -149,15 +149,15 @@ StyledRect { active: root.appIcon && root.image sourceComponent: StyledRect { - implicitWidth: Config.notifs.sizes.badge - implicitHeight: Config.notifs.sizes.badge + implicitWidth: Tokens.sizes.notifs.badge + implicitHeight: Tokens.sizes.notifs.badge color: root.urgency === NotificationUrgency.Critical ? Colours.palette.m3error : root.urgency === NotificationUrgency.Low ? Colours.palette.m3surfaceContainerHigh : Colours.palette.m3secondaryContainer radius: Tokens.rounding.full ColouredIcon { anchors.centerIn: parent - implicitSize: Math.round(Config.notifs.sizes.badge * 0.6) + implicitSize: Math.round(Tokens.sizes.notifs.badge * 0.6) source: Quickshell.iconPath(root.appIcon) colour: root.urgency === NotificationUrgency.Critical ? Colours.palette.m3onError : root.urgency === NotificationUrgency.Low ? Colours.palette.m3onSurface : Colours.palette.m3onSecondaryContainer layer.enabled: root.appIcon.endsWith("symbolic") diff --git a/modules/sidebar/Wrapper.qml b/modules/sidebar/Wrapper.qml index 446a5b30..e2d8f5a6 100644 --- a/modules/sidebar/Wrapper.qml +++ b/modules/sidebar/Wrapper.qml @@ -15,7 +15,7 @@ Item { visible: offsetScale < 1 anchors.rightMargin: (-implicitWidth - 5) * offsetScale - implicitWidth: Config.sidebar.sizes.width + implicitWidth: Tokens.sizes.sidebar.width opacity: 1 - offsetScale Behavior on offsetScale { @@ -37,7 +37,7 @@ Item { active: root.shouldBeActive || root.visible sourceComponent: Content { - implicitWidth: Config.sidebar.sizes.width - Tokens.padding.large * 2 + implicitWidth: Tokens.sizes.sidebar.width - Tokens.padding.large * 2 props: root.props visibilities: root.visibilities } diff --git a/modules/utilities/Wrapper.qml b/modules/utilities/Wrapper.qml index 6d666894..c8f87c36 100644 --- a/modules/utilities/Wrapper.qml +++ b/modules/utilities/Wrapper.qml @@ -29,7 +29,7 @@ Item { visible: offsetScale < 1 anchors.bottomMargin: (-implicitHeight - 5) * offsetScale implicitHeight: content.implicitHeight + content.anchors.margins * 2 - implicitWidth: sidebar.width * (1 - sidebar.offsetScale) * horizontalStretch * sidebarLerp + Config.utilities.sizes.width * (1 - sidebarLerp) + implicitWidth: sidebar.width * (1 - sidebar.offsetScale) * horizontalStretch * sidebarLerp + Tokens.sizes.utilities.width * (1 - sidebarLerp) opacity: 1 - offsetScale states: State { diff --git a/modules/utilities/toasts/Toasts.qml b/modules/utilities/toasts/Toasts.qml index 32fb56fc..7c15bf82 100644 --- a/modules/utilities/toasts/Toasts.qml +++ b/modules/utilities/toasts/Toasts.qml @@ -23,7 +23,7 @@ Item { return false; } - implicitWidth: Config.utilities.sizes.toastWidth - Tokens.padding.normal * 2 + implicitWidth: Tokens.sizes.utilities.toastWidth - Tokens.padding.normal * 2 implicitHeight: { let h = -spacing; for (let i = 0; i < repeater.count; i++) { diff --git a/modules/windowinfo/WindowInfo.qml b/modules/windowinfo/WindowInfo.qml index a0079128..2c31d209 100644 --- a/modules/windowinfo/WindowInfo.qml +++ b/modules/windowinfo/WindowInfo.qml @@ -13,7 +13,7 @@ Item { required property HyprlandToplevel client implicitWidth: child.implicitWidth - implicitHeight: screen.height * Config.winfo.sizes.heightMult + implicitHeight: screen.height * Tokens.sizes.winfo.heightMult RowLayout { id: child @@ -31,7 +31,7 @@ Item { ColumnLayout { spacing: Tokens.spacing.normal - Layout.preferredWidth: Config.winfo.sizes.detailsWidth + Layout.preferredWidth: Tokens.sizes.winfo.detailsWidth Layout.fillHeight: true StyledRect { diff --git a/services/NotifData.qml b/services/NotifData.qml index ac781ad5..31ff7d2f 100644 --- a/services/NotifData.qml +++ b/services/NotifData.qml @@ -54,14 +54,14 @@ QtObject { // qmllint disable uncreatable-type PanelWindow { // qmllint enable uncreatable-type - implicitWidth: Config.notifs.sizes.image - implicitHeight: Config.notifs.sizes.image + implicitWidth: Tokens.sizes.notifs.image + implicitHeight: Tokens.sizes.notifs.image color: "transparent" mask: Region {} Image { function tryCache(): void { - if (status !== Image.Ready || width != Config.notifs.sizes.image || height != Config.notifs.sizes.image) + if (status !== Image.Ready || width != Tokens.sizes.notifs.image || height != Tokens.sizes.notifs.image) return; const cacheKey = notif.appName + notif.summary + notif.id; From 180120801a66d24f5064536824e80c58a7f4970f Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 21:33:18 +1000 Subject: [PATCH 24/81] feat: add proper anim tokens to Tokens --- plugin/src/Caelestia/Config/CMakeLists.txt | 1 + plugin/src/Caelestia/Config/anim.cpp | 62 +++++++++++++++++ plugin/src/Caelestia/Config/anim.hpp | 78 ++++++++++++++++++++++ plugin/src/Caelestia/Config/tokens.cpp | 46 ++++++++----- plugin/src/Caelestia/Config/tokens.hpp | 9 ++- 5 files changed, 177 insertions(+), 19 deletions(-) create mode 100644 plugin/src/Caelestia/Config/anim.cpp create mode 100644 plugin/src/Caelestia/Config/anim.hpp diff --git a/plugin/src/Caelestia/Config/CMakeLists.txt b/plugin/src/Caelestia/Config/CMakeLists.txt index 9d8a9d99..92ee2da9 100644 --- a/plugin/src/Caelestia/Config/CMakeLists.txt +++ b/plugin/src/Caelestia/Config/CMakeLists.txt @@ -6,6 +6,7 @@ qml_module(caelestia-config configscope.cpp appearanceconfig.cpp tokens.cpp + anim.cpp monitorconfigmanager.cpp backgroundconfig.hpp barconfig.hpp diff --git a/plugin/src/Caelestia/Config/anim.cpp b/plugin/src/Caelestia/Config/anim.cpp new file mode 100644 index 00000000..9c2b9111 --- /dev/null +++ b/plugin/src/Caelestia/Config/anim.cpp @@ -0,0 +1,62 @@ +#include "anim.hpp" +#include "appearanceconfig.hpp" +#include "tokens.hpp" + +#include + +namespace caelestia::config { + +AnimTokens::AnimTokens(QObject* parent) + : QObject(parent) {} + +QEasingCurve AnimTokens::buildCurve(const QList& points) { + QEasingCurve curve(QEasingCurve::BezierSpline); + + // Points come in pairs of (x, y) forming cubic bezier segments. + // Each segment needs 3 control points: c1, c2, endPoint. + // So 6 values per segment: c1x, c1y, c2x, c2y, endX, endY. + for (int i = 0; i + 5 < points.size(); i += 6) { + QPointF c1(points[i], points[i + 1]); + QPointF c2(points[i + 2], points[i + 3]); + QPointF end(points[i + 4], points[i + 5]); + curve.addCubicBezierSegment(c1, c2, end); + } + + return curve; +} + +void AnimTokens::rebuildCurves() { + if (!m_curves) + return; + + m_emphasized = buildCurve(m_curves->emphasized()); + m_emphasizedAccel = buildCurve(m_curves->emphasizedAccel()); + m_emphasizedDecel = buildCurve(m_curves->emphasizedDecel()); + m_standard = buildCurve(m_curves->standard()); + m_standardAccel = buildCurve(m_curves->standardAccel()); + m_standardDecel = buildCurve(m_curves->standardDecel()); + m_expressiveFastSpatial = buildCurve(m_curves->expressiveFastSpatial()); + m_expressiveDefaultSpatial = buildCurve(m_curves->expressiveDefaultSpatial()); + m_expressiveSlowSpatial = buildCurve(m_curves->expressiveSlowSpatial()); + + emit curvesChanged(); +} + +void AnimTokens::bindCurves(AnimCurves* curves) { + m_curves = curves; + + // Rebuild when any curve control points change + connect(curves, &AnimCurves::propertiesChanged, this, &AnimTokens::rebuildCurves); + + rebuildCurves(); +} + +void AnimTokens::bindDurations(AnimDurations* durations) { + if (m_durations == durations) + return; + + m_durations = durations; + emit durationsChanged(); +} + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/anim.hpp b/plugin/src/Caelestia/Config/anim.hpp new file mode 100644 index 00000000..464ee32a --- /dev/null +++ b/plugin/src/Caelestia/Config/anim.hpp @@ -0,0 +1,78 @@ +#pragma once + +#include +#include +#include + +namespace caelestia::config { + +class AnimCurves; +class AnimDurations; +class ConfigScope; + +class AnimTokens : public QObject { + Q_OBJECT + Q_MOC_INCLUDE("appearanceconfig.hpp") + QML_ANONYMOUS + + Q_PROPERTY(QEasingCurve emphasized READ emphasized NOTIFY curvesChanged) + Q_PROPERTY(QEasingCurve emphasizedAccel READ emphasizedAccel NOTIFY curvesChanged) + Q_PROPERTY(QEasingCurve emphasizedDecel READ emphasizedDecel NOTIFY curvesChanged) + Q_PROPERTY(QEasingCurve standard READ standard NOTIFY curvesChanged) + Q_PROPERTY(QEasingCurve standardAccel READ standardAccel NOTIFY curvesChanged) + Q_PROPERTY(QEasingCurve standardDecel READ standardDecel NOTIFY curvesChanged) + Q_PROPERTY(QEasingCurve expressiveFastSpatial READ expressiveFastSpatial NOTIFY curvesChanged) + Q_PROPERTY(QEasingCurve expressiveDefaultSpatial READ expressiveDefaultSpatial NOTIFY curvesChanged) + Q_PROPERTY(QEasingCurve expressiveSlowSpatial READ expressiveSlowSpatial NOTIFY curvesChanged) + + Q_PROPERTY(caelestia::config::AnimDurations* durations READ durations NOTIFY durationsChanged) + +public: + explicit AnimTokens(QObject* parent = nullptr); + + void bindCurves(AnimCurves* curves); + void bindDurations(AnimDurations* durations); + + [[nodiscard]] QEasingCurve emphasized() const { return m_emphasized; } + + [[nodiscard]] QEasingCurve emphasizedAccel() const { return m_emphasizedAccel; } + + [[nodiscard]] QEasingCurve emphasizedDecel() const { return m_emphasizedDecel; } + + [[nodiscard]] QEasingCurve standard() const { return m_standard; } + + [[nodiscard]] QEasingCurve standardAccel() const { return m_standardAccel; } + + [[nodiscard]] QEasingCurve standardDecel() const { return m_standardDecel; } + + [[nodiscard]] QEasingCurve expressiveFastSpatial() const { return m_expressiveFastSpatial; } + + [[nodiscard]] QEasingCurve expressiveDefaultSpatial() const { return m_expressiveDefaultSpatial; } + + [[nodiscard]] QEasingCurve expressiveSlowSpatial() const { return m_expressiveSlowSpatial; } + + [[nodiscard]] AnimDurations* durations() const { return m_durations; } + +signals: + void curvesChanged(); + void durationsChanged(); + +private: + void rebuildCurves(); + static QEasingCurve buildCurve(const QList& points); + + AnimCurves* m_curves = nullptr; + AnimDurations* m_durations = nullptr; + + QEasingCurve m_emphasized; + QEasingCurve m_emphasizedAccel; + QEasingCurve m_emphasizedDecel; + QEasingCurve m_standard; + QEasingCurve m_standardAccel; + QEasingCurve m_standardDecel; + QEasingCurve m_expressiveFastSpatial; + QEasingCurve m_expressiveDefaultSpatial; + QEasingCurve m_expressiveSlowSpatial; +}; + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/tokens.cpp b/plugin/src/Caelestia/Config/tokens.cpp index 281d232f..bf808249 100644 --- a/plugin/src/Caelestia/Config/tokens.cpp +++ b/plugin/src/Caelestia/Config/tokens.cpp @@ -62,18 +62,6 @@ TokenConfig* TokenConfig::create(QQmlEngine* engine, QJSEngine*) { // Tokens (attached type) -Tokens::Tokens(ConfigScope* scope, QObject* parent) - : QObject(parent) - , m_scope(scope) { - connectScope(); -} - -void Tokens::connectScope() { - if (!m_scope) - return; - connect(m_scope, &ConfigScope::configChanged, this, &Tokens::sourceChanged); -} - // Resolve appearance from per-monitor GlobalConfig overlay or global GlobalConfig static const AppearanceConfig* resolveAppearance(ConfigScope* scope) { if (scope && scope->config()) @@ -82,6 +70,35 @@ static const AppearanceConfig* resolveAppearance(ConfigScope* scope) { return global ? global->appearance() : nullptr; } +Tokens::Tokens(ConfigScope* scope, QObject* parent) + : QObject(parent) + , m_scope(scope) + , m_anim(new AnimTokens(this)) { + connectScope(); + bindAnim(); +} + +void Tokens::connectScope() { + if (!m_scope) + return; + connect(m_scope, &ConfigScope::configChanged, this, &Tokens::sourceChanged); + connect(m_scope, &ConfigScope::configChanged, this, &Tokens::bindAnim); +} + +void Tokens::bindAnim() { + auto* appearance = resolveAppearance(m_scope); + if (!appearance) + return; + + // Bind durations from resolved GlobalConfig appearance + m_anim->bindDurations(appearance->anim()->durations()); + + // Bind curves from TokenConfig + auto* tokens = TokenConfig::instance(); + if (tokens) + m_anim->bindCurves(tokens->appearance()->curves()); +} + const AppearanceRounding* Tokens::rounding() const { auto* a = resolveAppearance(m_scope); return a ? a->rounding() : nullptr; @@ -102,11 +119,6 @@ const AppearanceFont* Tokens::font() const { return a ? a->font() : nullptr; } -const AppearanceAnim* Tokens::anim() const { - auto* a = resolveAppearance(m_scope); - return a ? a->anim() : nullptr; -} - const AppearanceTransparency* Tokens::transparency() const { auto* a = resolveAppearance(m_scope); return a ? a->transparency() : nullptr; diff --git a/plugin/src/Caelestia/Config/tokens.hpp b/plugin/src/Caelestia/Config/tokens.hpp index 27858ccb..a9d879b4 100644 --- a/plugin/src/Caelestia/Config/tokens.hpp +++ b/plugin/src/Caelestia/Config/tokens.hpp @@ -1,5 +1,6 @@ #pragma once +#include "anim.hpp" #include "appearanceconfig.hpp" #include "configobject.hpp" @@ -356,9 +357,9 @@ class Tokens : public QObject { Q_PROPERTY(const caelestia::config::AppearanceSpacing* spacing READ spacing NOTIFY sourceChanged) Q_PROPERTY(const caelestia::config::AppearancePadding* padding READ padding NOTIFY sourceChanged) Q_PROPERTY(const caelestia::config::AppearanceFont* font READ font NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::AppearanceAnim* anim READ anim NOTIFY sourceChanged) Q_PROPERTY(const caelestia::config::AppearanceTransparency* transparency READ transparency NOTIFY sourceChanged) Q_PROPERTY(const caelestia::config::SizeTokens* sizes READ sizes NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::AnimTokens* anim READ anim NOTIFY sourceChanged) public: explicit Tokens(ConfigScope* scope, QObject* parent = nullptr); @@ -367,10 +368,12 @@ public: [[nodiscard]] const AppearanceSpacing* spacing() const; [[nodiscard]] const AppearancePadding* padding() const; [[nodiscard]] const AppearanceFont* font() const; - [[nodiscard]] const AppearanceAnim* anim() const; [[nodiscard]] const AppearanceTransparency* transparency() const; + [[nodiscard]] const SizeTokens* sizes() const; + [[nodiscard]] const AnimTokens* anim() const { return m_anim; } + static Tokens* qmlAttachedProperties(QObject* object); signals: @@ -378,8 +381,10 @@ signals: private: void connectScope(); + void bindAnim(); ConfigScope* m_scope; + AnimTokens* m_anim = nullptr; }; } // namespace caelestia::config From d99fefdd3465be5bf940a5c336824bf1f1e626e1 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 21:40:19 +1000 Subject: [PATCH 25/81] fix: use correct anim tokens in QML --- components/Anim.qml | 3 +-- components/CAnim.qml | 3 +-- components/StateLayer.qml | 2 +- components/StyledText.qml | 5 ++--- components/controls/CollapsibleSection.qml | 8 ++++---- components/controls/FilledSlider.qml | 4 ++-- components/controls/Menu.qml | 2 +- components/controls/SplitButton.qml | 2 +- components/controls/StyledSwitch.qml | 3 +-- components/controls/ToggleButton.qml | 4 ++-- components/controls/Tooltip.qml | 4 ++-- components/filedialog/FolderContents.qml | 6 +++--- components/widgets/ExtraIndicator.qml | 2 +- modules/areapicker/Picker.qml | 2 +- modules/background/Background.qml | 2 +- modules/background/DesktopClock.qml | 2 +- modules/bar/BarWrapper.qml | 4 ++-- modules/bar/components/ActiveWindow.qml | 2 +- modules/bar/components/StatusIcons.qml | 4 ++-- modules/bar/components/Tray.qml | 6 +++--- .../components/workspaces/ActiveIndicator.qml | 2 +- .../bar/components/workspaces/OccupiedBg.qml | 2 +- .../workspaces/SpecialWorkspaces.qml | 14 ++++++------- .../bar/components/workspaces/Workspace.qml | 4 ++-- modules/bar/popouts/Battery.qml | 3 +-- modules/bar/popouts/ClipWrapper.qml | 6 +++--- modules/bar/popouts/WirelessPassword.qml | 2 +- modules/bar/popouts/Wrapper.qml | 8 ++++---- modules/controlcenter/NavRail.qml | 6 +++--- modules/controlcenter/bluetooth/Details.qml | 11 +++++----- modules/controlcenter/bluetooth/Settings.qml | 11 +++++----- .../components/ConnectedButtonGroup.qml | 4 ++-- .../components/PaneTransition.qml | 12 ++++------- modules/controlcenter/network/VpnDetails.qml | 8 ++++---- modules/controlcenter/network/VpnList.qml | 20 +++++++++---------- .../network/WirelessPasswordDialog.qml | 2 +- modules/dashboard/Content.qml | 4 ++-- modules/dashboard/Media.qml | 4 ++-- modules/dashboard/Tabs.qml | 5 ++--- modules/dashboard/Wrapper.qml | 2 +- modules/dashboard/dash/Calendar.qml | 4 ++-- modules/dashboard/dash/User.qml | 2 +- modules/drawers/ContentWindow.qml | 11 ++++------ modules/launcher/AppList.qml | 10 +++++----- modules/launcher/ContentList.qml | 4 ++-- modules/launcher/Wrapper.qml | 2 +- modules/launcher/items/CalcItem.qml | 2 +- modules/lock/InputField.qml | 2 +- modules/lock/LockSurface.qml | 16 +++++++-------- modules/lock/Media.qml | 4 ++-- modules/lock/NotifDock.qml | 6 +++--- modules/lock/NotifGroup.qml | 2 +- modules/notifications/Content.qml | 5 ++--- modules/notifications/Notification.qml | 12 +++++------ modules/osd/Content.qml | 2 +- modules/osd/Wrapper.qml | 2 +- modules/session/Wrapper.qml | 2 +- modules/sidebar/Notif.qml | 2 +- modules/sidebar/NotifActionList.qml | 4 ++-- modules/sidebar/NotifDock.qml | 2 +- modules/sidebar/NotifDockList.qml | 8 ++++---- modules/sidebar/NotifGroup.qml | 4 ++-- modules/sidebar/NotifGroupList.qml | 4 ++-- modules/sidebar/Wrapper.qml | 2 +- modules/utilities/RecordingDeleteModal.qml | 2 +- modules/utilities/Wrapper.qml | 6 +++--- modules/utilities/cards/IdleInhibit.qml | 4 ++-- modules/utilities/cards/Record.qml | 12 +++++------ modules/utilities/cards/RecordingList.qml | 2 +- modules/utilities/cards/Toggles.qml | 4 ++-- modules/utilities/toasts/Toasts.qml | 4 ++-- 71 files changed, 165 insertions(+), 183 deletions(-) diff --git a/components/Anim.qml b/components/Anim.qml index bf8eefb1..69484591 100644 --- a/components/Anim.qml +++ b/components/Anim.qml @@ -3,6 +3,5 @@ import Caelestia.Config NumberAnimation { duration: Tokens.anim.durations.normal - easing.type: Easing.BezierSpline - easing.bezierCurve: Tokens.anim.curves.standard + easing: Tokens.anim.standard } diff --git a/components/CAnim.qml b/components/CAnim.qml index 3b7b7b2f..b86fcce1 100644 --- a/components/CAnim.qml +++ b/components/CAnim.qml @@ -3,6 +3,5 @@ import Caelestia.Config ColorAnimation { duration: Tokens.anim.durations.normal - easing.type: Easing.BezierSpline - easing.bezierCurve: Tokens.anim.curves.standard + easing: Tokens.anim.standard } diff --git a/components/StateLayer.qml b/components/StateLayer.qml index 59c5cb23..545a7583 100644 --- a/components/StateLayer.qml +++ b/components/StateLayer.qml @@ -63,7 +63,7 @@ MouseArea { properties: "implicitWidth,implicitHeight" from: 0 to: rippleAnim.radius * 2 - easing.bezierCurve: Tokens.anim.curves.standardDecel + easing: Tokens.anim.standardDecel } Anim { target: ripple diff --git a/components/StyledText.qml b/components/StyledText.qml index 051f5804..83dc146d 100644 --- a/components/StyledText.qml +++ b/components/StyledText.qml @@ -29,12 +29,12 @@ Text { SequentialAnimation { Anim { to: root.animateFrom - easing.bezierCurve: Tokens.anim.curves.standardAccel + easing: Tokens.anim.standardAccel } PropertyAction {} Anim { to: root.animateTo - easing.bezierCurve: Tokens.anim.curves.standardDecel + easing: Tokens.anim.standardDecel } } } @@ -43,6 +43,5 @@ Text { target: root property: root.animateProp duration: root.animateDuration / 2 - easing.type: Easing.BezierSpline } } diff --git a/components/controls/CollapsibleSection.qml b/components/controls/CollapsibleSection.qml index 19c7da9b..95aae8ee 100644 --- a/components/controls/CollapsibleSection.qml +++ b/components/controls/CollapsibleSection.qml @@ -56,7 +56,7 @@ ColumnLayout { Behavior on rotation { Anim { duration: Tokens.anim.durations.small - easing.bezierCurve: Tokens.anim.curves.standard + easing: Tokens.anim.standard } } } @@ -84,7 +84,7 @@ ColumnLayout { Behavior on Layout.preferredHeight { Anim { - easing.bezierCurve: Tokens.anim.curves.standard + easing: Tokens.anim.standard } } @@ -99,7 +99,7 @@ ColumnLayout { Behavior on opacity { Anim { - easing.bezierCurve: Tokens.anim.curves.standard + easing: Tokens.anim.standard } } } @@ -118,7 +118,7 @@ ColumnLayout { Behavior on opacity { Anim { - easing.bezierCurve: Tokens.anim.curves.standard + easing: Tokens.anim.standard } } diff --git a/components/controls/FilledSlider.qml b/components/controls/FilledSlider.qml index 5a65722f..c71f65e9 100644 --- a/components/controls/FilledSlider.qml +++ b/components/controls/FilledSlider.qml @@ -97,7 +97,7 @@ Slider { property: "scale" to: 0 duration: Tokens.anim.durations.normal / 2 - easing.bezierCurve: Tokens.anim.curves.standardAccel + easing: Tokens.anim.standardAccel } ScriptAction { script: icon.update() @@ -107,7 +107,7 @@ Slider { property: "scale" to: 1 duration: Tokens.anim.durations.normal / 2 - easing.bezierCurve: Tokens.anim.curves.standardDecel + easing: Tokens.anim.standardDecel } } } diff --git a/components/controls/Menu.qml b/components/controls/Menu.qml index 6c375767..966837ea 100644 --- a/components/controls/Menu.qml +++ b/components/controls/Menu.qml @@ -109,7 +109,7 @@ Elevation { Behavior on implicitHeight { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } } diff --git a/components/controls/SplitButton.qml b/components/controls/SplitButton.qml index 8759635c..cdea38f0 100644 --- a/components/controls/SplitButton.qml +++ b/components/controls/SplitButton.qml @@ -86,7 +86,7 @@ Row { Behavior on Layout.preferredWidth { Anim { - easing.bezierCurve: Tokens.anim.curves.emphasized + easing: Tokens.anim.emphasized } } } diff --git a/components/controls/StyledSwitch.qml b/components/controls/StyledSwitch.qml index 92cde7da..be7eb9c5 100644 --- a/components/controls/StyledSwitch.qml +++ b/components/controls/StyledSwitch.qml @@ -146,7 +146,6 @@ Switch { component PropAnim: PropertyAnimation { duration: Tokens.anim.durations.normal - easing.type: Easing.BezierSpline - easing.bezierCurve: Tokens.anim.curves.standard + easing: Tokens.anim.standard } } diff --git a/components/controls/ToggleButton.qml b/components/controls/ToggleButton.qml index 4e4174b0..fce6215b 100644 --- a/components/controls/ToggleButton.qml +++ b/components/controls/ToggleButton.qml @@ -88,14 +88,14 @@ StyledRect { Behavior on radius { Anim { duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } } Behavior on Layout.preferredWidth { Anim { duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } } diff --git a/components/controls/Tooltip.qml b/components/controls/Tooltip.qml index fdb27bea..06b292de 100644 --- a/components/controls/Tooltip.qml +++ b/components/controls/Tooltip.qml @@ -101,7 +101,7 @@ Popup { from: 0 to: 1 duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } } @@ -111,7 +111,7 @@ Popup { from: 1 to: 0 duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } } diff --git a/components/filedialog/FolderContents.qml b/components/filedialog/FolderContents.qml index 980bd3e1..ebd5098d 100644 --- a/components/filedialog/FolderContents.qml +++ b/components/filedialog/FolderContents.qml @@ -121,7 +121,7 @@ Item { from: 0 to: 1 duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } @@ -140,12 +140,12 @@ Item { Anim { properties: "opacity,scale" to: 1 - easing.bezierCurve: Tokens.anim.curves.standardDecel + easing: Tokens.anim.standardDecel } Anim { properties: "x,y" duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } } diff --git a/components/widgets/ExtraIndicator.qml b/components/widgets/ExtraIndicator.qml index 938f1ec1..1c766bf0 100644 --- a/components/widgets/ExtraIndicator.qml +++ b/components/widgets/ExtraIndicator.qml @@ -45,7 +45,7 @@ StyledRect { Behavior on scale { Anim { duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } } } diff --git a/modules/areapicker/Picker.qml b/modules/areapicker/Picker.qml index 6234d192..6399981f 100644 --- a/modules/areapicker/Picker.qml +++ b/modules/areapicker/Picker.qml @@ -308,6 +308,6 @@ MouseArea { component ExAnim: Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } diff --git a/modules/background/Background.qml b/modules/background/Background.qml index 1fe3be74..547fdc9b 100644 --- a/modules/background/Background.qml +++ b/modules/background/Background.qml @@ -147,7 +147,7 @@ Variants { transitions: Transition { AnchorAnimation { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } diff --git a/modules/background/DesktopClock.qml b/modules/background/DesktopClock.qml index 43f3fcef..c184df78 100644 --- a/modules/background/DesktopClock.qml +++ b/modules/background/DesktopClock.qml @@ -159,7 +159,7 @@ Item { Behavior on clockScale { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } diff --git a/modules/bar/BarWrapper.qml b/modules/bar/BarWrapper.qml index 52050e05..1f10d366 100644 --- a/modules/bar/BarWrapper.qml +++ b/modules/bar/BarWrapper.qml @@ -58,7 +58,7 @@ Item { target: root property: "implicitWidth" duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } }, Transition { @@ -68,7 +68,7 @@ Item { Anim { target: root property: "implicitWidth" - easing.bezierCurve: Tokens.anim.curves.emphasized + easing: Tokens.anim.emphasized } } ] diff --git a/modules/bar/components/ActiveWindow.qml b/modules/bar/components/ActiveWindow.qml index 63cdb04a..5979edd4 100644 --- a/modules/bar/components/ActiveWindow.qml +++ b/modules/bar/components/ActiveWindow.qml @@ -102,7 +102,7 @@ Item { Behavior on implicitHeight { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } diff --git a/modules/bar/components/StatusIcons.qml b/modules/bar/components/StatusIcons.qml index c2a4b047..3b11036b 100644 --- a/modules/bar/components/StatusIcons.qml +++ b/modules/bar/components/StatusIcons.qml @@ -212,13 +212,13 @@ StyledRect { from: 1 to: 0 duration: Tokens.anim.durations.large - easing.bezierCurve: Tokens.anim.curves.standardAccel + easing: Tokens.anim.standardAccel } Anim { from: 0 to: 1 duration: Tokens.anim.durations.large - easing.bezierCurve: Tokens.anim.curves.standardDecel + easing: Tokens.anim.standardDecel } } } diff --git a/modules/bar/components/Tray.qml b/modules/bar/components/Tray.qml index 98650fae..5adc5e57 100644 --- a/modules/bar/components/Tray.qml +++ b/modules/bar/components/Tray.qml @@ -49,7 +49,7 @@ StyledRect { properties: "scale" from: 0 to: 1 - easing.bezierCurve: Tokens.anim.curves.standardDecel + easing: Tokens.anim.standardDecel } } @@ -57,7 +57,7 @@ StyledRect { Anim { properties: "scale" to: 1 - easing.bezierCurve: Tokens.anim.curves.standardDecel + easing: Tokens.anim.standardDecel } Anim { properties: "x,y" @@ -117,7 +117,7 @@ StyledRect { Behavior on implicitHeight { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } } diff --git a/modules/bar/components/workspaces/ActiveIndicator.qml b/modules/bar/components/workspaces/ActiveIndicator.qml index c76f9457..e9a32b45 100644 --- a/modules/bar/components/workspaces/ActiveIndicator.qml +++ b/modules/bar/components/workspaces/ActiveIndicator.qml @@ -93,6 +93,6 @@ StyledRect { } component EAnim: Anim { - easing.bezierCurve: Tokens.anim.curves.emphasized + easing: Tokens.anim.emphasized } } diff --git a/modules/bar/components/workspaces/OccupiedBg.qml b/modules/bar/components/workspaces/OccupiedBg.qml index da7e70c6..c54db55c 100644 --- a/modules/bar/components/workspaces/OccupiedBg.qml +++ b/modules/bar/components/workspaces/OccupiedBg.qml @@ -76,7 +76,7 @@ Item { Behavior on scale { Anim { - easing.bezierCurve: Tokens.anim.curves.standardDecel + easing: Tokens.anim.standardDecel } } diff --git a/modules/bar/components/workspaces/SpecialWorkspaces.qml b/modules/bar/components/workspaces/SpecialWorkspaces.qml index 70eb22a0..a825c1e5 100644 --- a/modules/bar/components/workspaces/SpecialWorkspaces.qml +++ b/modules/bar/components/workspaces/SpecialWorkspaces.qml @@ -119,7 +119,7 @@ Item { properties: "scale" from: 0 to: 1 - easing.bezierCurve: Tokens.anim.curves.standardDecel + easing: Tokens.anim.standardDecel } } @@ -140,7 +140,7 @@ Item { Anim { properties: "scale" to: 1 - easing.bezierCurve: Tokens.anim.curves.standardDecel + easing: Tokens.anim.standardDecel } Anim { properties: "x,y" @@ -151,7 +151,7 @@ Item { Anim { properties: "scale" to: 1 - easing.bezierCurve: Tokens.anim.curves.standardDecel + easing: Tokens.anim.standardDecel } Anim { properties: "x,y" @@ -192,13 +192,13 @@ Item { Behavior on y { Anim { - easing.bezierCurve: Tokens.anim.curves.emphasized + easing: Tokens.anim.emphasized } } Behavior on implicitHeight { Anim { - easing.bezierCurve: Tokens.anim.curves.emphasized + easing: Tokens.anim.emphasized } } } @@ -328,7 +328,7 @@ Item { properties: "scale" from: 0 to: 1 - easing.bezierCurve: Tokens.anim.curves.standardDecel + easing: Tokens.anim.standardDecel } } @@ -336,7 +336,7 @@ Item { Anim { properties: "scale" to: 1 - easing.bezierCurve: Tokens.anim.curves.standardDecel + easing: Tokens.anim.standardDecel } Anim { properties: "x,y" diff --git a/modules/bar/components/workspaces/Workspace.qml b/modules/bar/components/workspaces/Workspace.qml index 62d09d4b..e57f6f5e 100644 --- a/modules/bar/components/workspaces/Workspace.qml +++ b/modules/bar/components/workspaces/Workspace.qml @@ -74,7 +74,7 @@ ColumnLayout { properties: "scale" from: 0 to: 1 - easing.bezierCurve: Tokens.anim.curves.standardDecel + easing: Tokens.anim.standardDecel } } @@ -82,7 +82,7 @@ ColumnLayout { Anim { properties: "scale" to: 1 - easing.bezierCurve: Tokens.anim.curves.standardDecel + easing: Tokens.anim.standardDecel } Anim { properties: "x,y" diff --git a/modules/bar/popouts/Battery.qml b/modules/bar/popouts/Battery.qml index 149e21c2..cbcdc715 100644 --- a/modules/bar/popouts/Battery.qml +++ b/modules/bar/popouts/Battery.qml @@ -149,8 +149,7 @@ Column { transitions: Transition { AnchorAnimation { duration: Tokens.anim.durations.normal - easing.type: Easing.BezierSpline - easing.bezierCurve: Tokens.anim.curves.emphasized + easing: Tokens.anim.emphasized } } } diff --git a/modules/bar/popouts/ClipWrapper.qml b/modules/bar/popouts/ClipWrapper.qml index 810ac2e5..68c301a8 100644 --- a/modules/bar/popouts/ClipWrapper.qml +++ b/modules/bar/popouts/ClipWrapper.qml @@ -36,14 +36,14 @@ Item { Behavior on offsetScale { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } Behavior on x { Anim { duration: content.animLength - easing.bezierCurve: content.animCurve + easing: content.animCurve } } @@ -52,7 +52,7 @@ Item { Anim { duration: content.animLength - easing.bezierCurve: content.animCurve + easing: content.animCurve } } diff --git a/modules/bar/popouts/WirelessPassword.qml b/modules/bar/popouts/WirelessPassword.qml index 15317069..f1a79366 100644 --- a/modules/bar/popouts/WirelessPassword.qml +++ b/modules/bar/popouts/WirelessPassword.qml @@ -455,7 +455,7 @@ ColumnLayout { Behavior on scale { Anim { duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } } } diff --git a/modules/bar/popouts/Wrapper.qml b/modules/bar/popouts/Wrapper.qml index fbf5075f..d99ffdab 100644 --- a/modules/bar/popouts/Wrapper.qml +++ b/modules/bar/popouts/Wrapper.qml @@ -33,12 +33,12 @@ Item { property string queuedMode property int animLength: Tokens.anim.durations.expressiveDefaultSpatial - property list animCurve: Tokens.anim.curves.expressiveDefaultSpatial + property easingCurve animCurve: Tokens.anim.expressiveDefaultSpatial function setAnims(detach: bool): void { const type = `expressive${detach ? "Slow" : "Default"}Spatial`; animLength = Tokens.anim.durations[type]; - animCurve = Tokens.anim.curves[type]; + animCurve = Tokens.anim[type]; } function detach(mode: string): void { @@ -140,7 +140,7 @@ Item { Behavior on implicitWidth { Anim { duration: root.animLength - easing.bezierCurve: root.animCurve + easing: root.animCurve } } @@ -149,7 +149,7 @@ Item { Anim { duration: root.animLength - easing.bezierCurve: root.animCurve + easing: root.animCurve } } diff --git a/modules/controlcenter/NavRail.qml b/modules/controlcenter/NavRail.qml index 706d9d98..fe80493a 100644 --- a/modules/controlcenter/NavRail.qml +++ b/modules/controlcenter/NavRail.qml @@ -104,14 +104,14 @@ Item { Behavior on implicitWidth { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } Behavior on implicitHeight { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } } @@ -162,7 +162,7 @@ Item { Anim { properties: "implicitWidth,implicitHeight" duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } diff --git a/modules/controlcenter/bluetooth/Details.qml b/modules/controlcenter/bluetooth/Details.qml index 04b4ba01..42ceace2 100644 --- a/modules/controlcenter/bluetooth/Details.qml +++ b/modules/controlcenter/bluetooth/Details.qml @@ -174,8 +174,7 @@ StyledFlickable { transitions: Transition { AnchorAnimation { duration: Tokens.anim.durations.normal - easing.type: Easing.BezierSpline - easing.bezierCurve: Tokens.anim.curves.standard + easing: Tokens.anim.standard } Anim { properties: "implicitHeight,opacity,padding" @@ -266,7 +265,7 @@ StyledFlickable { Behavior on scale { Anim { duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } } } @@ -500,7 +499,7 @@ StyledFlickable { Anim { property: "implicitWidth" duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } Anim { property: "opacity" @@ -520,7 +519,7 @@ StyledFlickable { Anim { property: "implicitWidth" duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } Anim { property: "opacity" @@ -613,7 +612,7 @@ StyledFlickable { Anim { properties: "implicitWidth,implicitHeight" duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } Anim { properties: "radius,font.pointSize" diff --git a/modules/controlcenter/bluetooth/Settings.qml b/modules/controlcenter/bluetooth/Settings.qml index bd09deeb..2588a28c 100644 --- a/modules/controlcenter/bluetooth/Settings.qml +++ b/modules/controlcenter/bluetooth/Settings.qml @@ -171,7 +171,7 @@ ColumnLayout { Behavior on scale { Anim { duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } } } @@ -251,14 +251,14 @@ ColumnLayout { Behavior on scale { Anim { duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } } Behavior on implicitHeight { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } } @@ -315,8 +315,7 @@ ColumnLayout { transitions: Transition { AnchorAnimation { duration: Tokens.anim.durations.normal - easing.type: Easing.BezierSpline - easing.bezierCurve: Tokens.anim.curves.standard + easing: Tokens.anim.standard } Anim { properties: "implicitHeight,opacity,padding" @@ -406,7 +405,7 @@ ColumnLayout { Behavior on scale { Anim { duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } } } diff --git a/modules/controlcenter/components/ConnectedButtonGroup.qml b/modules/controlcenter/components/ConnectedButtonGroup.qml index e95fa094..b4ddfc22 100644 --- a/modules/controlcenter/components/ConnectedButtonGroup.qml +++ b/modules/controlcenter/components/ConnectedButtonGroup.qml @@ -99,14 +99,14 @@ StyledRect { Behavior on Layout.preferredWidth { Anim { duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } } Behavior on radius { Anim { duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } } } diff --git a/modules/controlcenter/components/PaneTransition.qml b/modules/controlcenter/components/PaneTransition.qml index a025f7d0..489d3c78 100644 --- a/modules/controlcenter/components/PaneTransition.qml +++ b/modules/controlcenter/components/PaneTransition.qml @@ -21,8 +21,7 @@ SequentialAnimation { from: root.opacityFrom to: root.opacityTo duration: Tokens.anim.durations.normal / 2 - easing.type: Easing.BezierSpline - easing.bezierCurve: Tokens.anim.curves.standardAccel + easing: Tokens.anim.standardAccel } NumberAnimation { @@ -31,8 +30,7 @@ SequentialAnimation { from: root.scaleFrom to: root.scaleTo duration: Tokens.anim.durations.normal / 2 - easing.type: Easing.BezierSpline - easing.bezierCurve: Tokens.anim.curves.standardAccel + easing: Tokens.anim.standardAccel } } @@ -54,8 +52,7 @@ SequentialAnimation { from: root.opacityTo to: root.opacityFrom duration: Tokens.anim.durations.normal / 2 - easing.type: Easing.BezierSpline - easing.bezierCurve: Tokens.anim.curves.standardDecel + easing: Tokens.anim.standardDecel } NumberAnimation { @@ -64,8 +61,7 @@ SequentialAnimation { from: root.scaleTo to: root.scaleFrom duration: Tokens.anim.durations.normal / 2 - easing.type: Easing.BezierSpline - easing.bezierCurve: Tokens.anim.curves.standardDecel + easing: Tokens.anim.standardDecel } } } diff --git a/modules/controlcenter/network/VpnDetails.qml b/modules/controlcenter/network/VpnDetails.qml index 214e4eb3..9906ef37 100644 --- a/modules/controlcenter/network/VpnDetails.qml +++ b/modules/controlcenter/network/VpnDetails.qml @@ -277,14 +277,14 @@ DeviceDetails { from: 0 to: 1 duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } Anim { property: "scale" from: 0.7 to: 1 duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } } @@ -294,14 +294,14 @@ DeviceDetails { from: 1 to: 0 duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } Anim { property: "scale" from: 1 to: 0.7 duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } } diff --git a/modules/controlcenter/network/VpnList.qml b/modules/controlcenter/network/VpnList.qml index 5ca385cb..05054876 100644 --- a/modules/controlcenter/network/VpnList.qml +++ b/modules/controlcenter/network/VpnList.qml @@ -382,14 +382,14 @@ ColumnLayout { from: 0 to: 1 duration: Tokens.anim.durations.normal - easing.bezierCurve: Tokens.anim.curves.emphasized + easing: Tokens.anim.emphasized } Anim { property: "scale" from: 0.7 to: 1 duration: Tokens.anim.durations.normal - easing.bezierCurve: Tokens.anim.curves.emphasized + easing: Tokens.anim.emphasized } } } @@ -401,14 +401,14 @@ ColumnLayout { from: 1 to: 0 duration: Tokens.anim.durations.small - easing.bezierCurve: Tokens.anim.curves.emphasized + easing: Tokens.anim.emphasized } Anim { property: "scale" from: 1 to: 0.7 duration: Tokens.anim.durations.small - easing.bezierCurve: Tokens.anim.curves.emphasized + easing: Tokens.anim.emphasized } } } @@ -435,7 +435,7 @@ ColumnLayout { Behavior on implicitHeight { Anim { duration: Tokens.anim.durations.normal - easing.bezierCurve: Tokens.anim.curves.emphasized + easing: Tokens.anim.emphasized } } } @@ -446,7 +446,7 @@ ColumnLayout { Behavior on implicitHeight { Anim { duration: Tokens.anim.durations.normal - easing.bezierCurve: Tokens.anim.curves.emphasized + easing: Tokens.anim.emphasized } } @@ -461,7 +461,7 @@ ColumnLayout { Behavior on opacity { Anim { duration: Tokens.anim.durations.small - easing.bezierCurve: Tokens.anim.curves.emphasized + easing: Tokens.anim.emphasized } } @@ -584,7 +584,7 @@ ColumnLayout { Behavior on opacity { Anim { duration: Tokens.anim.durations.small - easing.bezierCurve: Tokens.anim.curves.emphasized + easing: Tokens.anim.emphasized } } @@ -823,7 +823,7 @@ ColumnLayout { property: "opacity" to: 0 duration: Tokens.anim.durations.small - easing.bezierCurve: Tokens.anim.curves.emphasized + easing: Tokens.anim.emphasized } } @@ -839,7 +839,7 @@ ColumnLayout { property: "opacity" to: 1 duration: Tokens.anim.durations.small - easing.bezierCurve: Tokens.anim.curves.emphasized + easing: Tokens.anim.emphasized } } } diff --git a/modules/controlcenter/network/WirelessPasswordDialog.qml b/modules/controlcenter/network/WirelessPasswordDialog.qml index 14fb565a..4222ddf4 100644 --- a/modules/controlcenter/network/WirelessPasswordDialog.qml +++ b/modules/controlcenter/network/WirelessPasswordDialog.qml @@ -379,7 +379,7 @@ Item { Behavior on scale { Anim { duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } } } diff --git a/modules/dashboard/Content.qml b/modules/dashboard/Content.qml index a07aca41..6fc7faea 100644 --- a/modules/dashboard/Content.qml +++ b/modules/dashboard/Content.qml @@ -200,14 +200,14 @@ Item { Behavior on implicitWidth { Anim { duration: Tokens.anim.durations.large - easing.bezierCurve: Tokens.anim.curves.emphasized + easing: Tokens.anim.emphasized } } Behavior on implicitHeight { Anim { duration: Tokens.anim.durations.large - easing.bezierCurve: Tokens.anim.curves.emphasized + easing: Tokens.anim.emphasized } } } diff --git a/modules/dashboard/Media.qml b/modules/dashboard/Media.qml index 43a2311e..29de3934 100644 --- a/modules/dashboard/Media.qml +++ b/modules/dashboard/Media.qml @@ -501,12 +501,12 @@ Item { Layout.preferredWidth: implicitWidth + (stateLayer.pressed ? Tokens.padding.large : internalChecked ? Tokens.padding.smaller : 0) radius: stateLayer.pressed ? Tokens.rounding.small / 2 : internalChecked ? Tokens.rounding.small : implicitHeight / 2 radiusAnim.duration: Tokens.anim.durations.expressiveFastSpatial - radiusAnim.easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + radiusAnim.easing: Tokens.anim.expressiveFastSpatial Behavior on Layout.preferredWidth { Anim { duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } } } diff --git a/modules/dashboard/Tabs.qml b/modules/dashboard/Tabs.qml index 04728d2e..54e80c7a 100644 --- a/modules/dashboard/Tabs.qml +++ b/modules/dashboard/Tabs.qml @@ -164,15 +164,14 @@ Item { from: 0 to: rippleAnim.radius * 2 duration: Tokens.anim.durations.normal - easing.bezierCurve: Tokens.anim.curves.standardDecel + easing: Tokens.anim.standardDecel } Anim { target: ripple property: "opacity" to: 0 duration: Tokens.anim.durations.normal - easing.type: Easing.BezierSpline - easing.bezierCurve: Tokens.anim.curves.standard + easing: Tokens.anim.standard } } diff --git a/modules/dashboard/Wrapper.qml b/modules/dashboard/Wrapper.qml index e01dc0f0..7a810dc0 100644 --- a/modules/dashboard/Wrapper.qml +++ b/modules/dashboard/Wrapper.qml @@ -41,7 +41,7 @@ Item { Behavior on offsetScale { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } diff --git a/modules/dashboard/dash/Calendar.qml b/modules/dashboard/dash/Calendar.qml index d415a031..38d2d563 100644 --- a/modules/dashboard/dash/Calendar.qml +++ b/modules/dashboard/dash/Calendar.qml @@ -237,14 +237,14 @@ CustomMouseArea { Behavior on x { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } Behavior on y { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } } diff --git a/modules/dashboard/dash/User.qml b/modules/dashboard/dash/User.qml index 3b13bc7c..83ddcb2e 100644 --- a/modules/dashboard/dash/User.qml +++ b/modules/dashboard/dash/User.qml @@ -91,7 +91,7 @@ Row { Behavior on scale { Anim { duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } } diff --git a/modules/drawers/ContentWindow.qml b/modules/drawers/ContentWindow.qml index ce2196bf..8d665477 100644 --- a/modules/drawers/ContentWindow.qml +++ b/modules/drawers/ContentWindow.qml @@ -74,24 +74,21 @@ StyledWindow { Behavior on borderThickness { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.type: Easing.BezierSpline - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } Behavior on borderRounding { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.type: Easing.BezierSpline - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } Behavior on shadowOpacity { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.type: Easing.BezierSpline - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } @@ -222,7 +219,7 @@ StyledWindow { Behavior on extraWidth { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } } diff --git a/modules/launcher/AppList.qml b/modules/launcher/AppList.qml index bdad31e0..dc3ee16c 100644 --- a/modules/launcher/AppList.qml +++ b/modules/launcher/AppList.qml @@ -43,7 +43,7 @@ StyledListView { Behavior on y { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } } @@ -119,7 +119,7 @@ StyledListView { from: 1 to: 0 duration: Tokens.anim.durations.small - easing.bezierCurve: Tokens.anim.curves.standardAccel + easing: Tokens.anim.standardAccel } Anim { target: root @@ -127,7 +127,7 @@ StyledListView { from: 1 to: 0.9 duration: Tokens.anim.durations.small - easing.bezierCurve: Tokens.anim.curves.standardAccel + easing: Tokens.anim.standardAccel } } PropertyAction { @@ -141,7 +141,7 @@ StyledListView { from: 0 to: 1 duration: Tokens.anim.durations.small - easing.bezierCurve: Tokens.anim.curves.standardDecel + easing: Tokens.anim.standardDecel } Anim { target: root @@ -149,7 +149,7 @@ StyledListView { from: 0.9 to: 1 duration: Tokens.anim.durations.small - easing.bezierCurve: Tokens.anim.curves.standardDecel + easing: Tokens.anim.standardDecel } } PropertyAction { diff --git a/modules/launcher/ContentList.qml b/modules/launcher/ContentList.qml index e59dd382..ac10fd4d 100644 --- a/modules/launcher/ContentList.qml +++ b/modules/launcher/ContentList.qml @@ -155,7 +155,7 @@ Item { Anim { duration: Tokens.anim.durations.large - easing.bezierCurve: Tokens.anim.curves.emphasizedDecel + easing: Tokens.anim.emphasizedDecel } } @@ -164,7 +164,7 @@ Item { Anim { duration: Tokens.anim.durations.large - easing.bezierCurve: Tokens.anim.curves.emphasizedDecel + easing: Tokens.anim.emphasizedDecel } } } diff --git a/modules/launcher/Wrapper.qml b/modules/launcher/Wrapper.qml index fda2a111..b0b8753b 100644 --- a/modules/launcher/Wrapper.qml +++ b/modules/launcher/Wrapper.qml @@ -42,7 +42,7 @@ Item { Behavior on offsetScale { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } diff --git a/modules/launcher/items/CalcItem.qml b/modules/launcher/items/CalcItem.qml index d18cbf90..0585276f 100644 --- a/modules/launcher/items/CalcItem.qml +++ b/modules/launcher/items/CalcItem.qml @@ -120,7 +120,7 @@ Item { Behavior on implicitWidth { Anim { - easing.bezierCurve: Tokens.anim.curves.emphasized + easing: Tokens.anim.emphasized } } } diff --git a/modules/lock/InputField.qml b/modules/lock/InputField.qml index fdae94f7..bc0b3312 100644 --- a/modules/lock/InputField.qml +++ b/modules/lock/InputField.qml @@ -135,7 +135,7 @@ Item { Behavior on scale { Anim { duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } } } diff --git a/modules/lock/LockSurface.qml b/modules/lock/LockSurface.qml index d0001e23..cbb2e4f0 100644 --- a/modules/lock/LockSurface.qml +++ b/modules/lock/LockSurface.qml @@ -34,7 +34,7 @@ WlSessionLockSurface { properties: "implicitWidth,implicitHeight" to: lockContent.size duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } Anim { target: lockBg @@ -46,7 +46,7 @@ WlSessionLockSurface { property: "scale" to: 0 duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } Anim { target: content @@ -102,14 +102,14 @@ WlSessionLockSurface { property: "scale" to: 1 duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } Anim { target: lockContent property: "rotation" to: 360 duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.standardAccel + easing: Tokens.anim.standardAccel } } ParallelAnimation { @@ -117,7 +117,7 @@ WlSessionLockSurface { target: lockIcon property: "rotation" to: 360 - easing.bezierCurve: Tokens.anim.curves.standardDecel + easing: Tokens.anim.standardDecel } Anim { target: lockIcon @@ -134,7 +134,7 @@ WlSessionLockSurface { property: "scale" to: 1 duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } Anim { target: lockBg @@ -146,14 +146,14 @@ WlSessionLockSurface { property: "implicitWidth" to: (root.screen?.height ?? 0) * Tokens.sizes.lock.heightMult * Tokens.sizes.lock.ratio duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } Anim { target: lockContent property: "implicitHeight" to: (root.screen?.height ?? 0) * Tokens.sizes.lock.heightMult duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } } diff --git a/modules/lock/Media.qml b/modules/lock/Media.qml index c93d830e..1f876daf 100644 --- a/modules/lock/Media.qml +++ b/modules/lock/Media.qml @@ -194,14 +194,14 @@ Item { Behavior on Layout.preferredWidth { Anim { duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } } Behavior on radius { Anim { duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } } } diff --git a/modules/lock/NotifDock.qml b/modules/lock/NotifDock.qml index 131eeec2..57587f8f 100644 --- a/modules/lock/NotifDock.qml +++ b/modules/lock/NotifDock.qml @@ -104,7 +104,7 @@ ColumnLayout { from: 0 to: 1 duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } @@ -127,7 +127,7 @@ ColumnLayout { Anim { property: "y" duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } @@ -139,7 +139,7 @@ ColumnLayout { Anim { property: "y" duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } } diff --git a/modules/lock/NotifGroup.qml b/modules/lock/NotifGroup.qml index 2fdb6fb1..e7d77a20 100644 --- a/modules/lock/NotifGroup.qml +++ b/modules/lock/NotifGroup.qml @@ -299,7 +299,7 @@ StyledRect { Behavior on implicitHeight { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } diff --git a/modules/notifications/Content.qml b/modules/notifications/Content.qml index e32b84c6..a0a964b0 100644 --- a/modules/notifications/Content.qml +++ b/modules/notifications/Content.qml @@ -172,7 +172,7 @@ Item { property: "x" to: (notif.x >= 0 ? Tokens.sizes.notifs.width : -Tokens.sizes.notifs.width) * 2 duration: Tokens.anim.durations.normal - easing.bezierCurve: Tokens.anim.curves.emphasized + easing: Tokens.anim.emphasized } PropertyAction { target: wrapper @@ -200,7 +200,6 @@ Item { component Anim: NumberAnimation { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.type: Easing.BezierSpline - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } diff --git a/modules/notifications/Notification.qml b/modules/notifications/Notification.qml index 2d4c4901..63d27e69 100644 --- a/modules/notifications/Notification.qml +++ b/modules/notifications/Notification.qml @@ -36,7 +36,7 @@ StyledRect { Behavior on x { Anim { - easing.bezierCurve: Tokens.anim.curves.emphasizedDecel + easing: Tokens.anim.emphasizedDecel } } @@ -102,7 +102,7 @@ StyledRect { Behavior on implicitHeight { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } @@ -217,7 +217,7 @@ StyledRect { Behavior on sweepAngle { Anim { - easing.bezierCurve: Tokens.anim.curves.emphasizedDecel + easing: Tokens.anim.emphasizedDecel } } } @@ -287,8 +287,7 @@ StyledRect { } AnchorAnimation { duration: Tokens.anim.durations.normal - easing.type: Easing.BezierSpline - easing.bezierCurve: Tokens.anim.curves.standard + easing: Tokens.anim.standard } } @@ -331,8 +330,7 @@ StyledRect { transitions: Transition { AnchorAnimation { duration: Tokens.anim.durations.normal - easing.type: Easing.BezierSpline - easing.bezierCurve: Tokens.anim.curves.standard + easing: Tokens.anim.standard } } } diff --git a/modules/osd/Content.qml b/modules/osd/Content.qml index 3a82f0d0..521b803c 100644 --- a/modules/osd/Content.qml +++ b/modules/osd/Content.qml @@ -117,7 +117,7 @@ Item { Behavior on Layout.preferredHeight { Anim { - easing.bezierCurve: Tokens.anim.curves.emphasized + easing: Tokens.anim.emphasized } } diff --git a/modules/osd/Wrapper.qml b/modules/osd/Wrapper.qml index 1c593e84..2d7986a7 100644 --- a/modules/osd/Wrapper.qml +++ b/modules/osd/Wrapper.qml @@ -47,7 +47,7 @@ Item { Behavior on offsetScale { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } diff --git a/modules/session/Wrapper.qml b/modules/session/Wrapper.qml index f211cfbe..417bd95a 100644 --- a/modules/session/Wrapper.qml +++ b/modules/session/Wrapper.qml @@ -24,7 +24,7 @@ Item { Behavior on offsetScale { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } diff --git a/modules/sidebar/Notif.qml b/modules/sidebar/Notif.qml index aa80d068..6394a0e6 100644 --- a/modules/sidebar/Notif.qml +++ b/modules/sidebar/Notif.qml @@ -125,7 +125,7 @@ StyledRect { Behavior on implicitHeight { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } diff --git a/modules/sidebar/NotifActionList.qml b/modules/sidebar/NotifActionList.qml index 320fd1a3..09da396c 100644 --- a/modules/sidebar/NotifActionList.qml +++ b/modules/sidebar/NotifActionList.qml @@ -184,14 +184,14 @@ Item { Behavior on Layout.preferredWidth { Anim { duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } } Behavior on radius { Anim { duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } } } diff --git a/modules/sidebar/NotifDock.qml b/modules/sidebar/NotifDock.qml index a819f52b..b9930409 100644 --- a/modules/sidebar/NotifDock.qml +++ b/modules/sidebar/NotifDock.qml @@ -203,7 +203,7 @@ Item { Behavior on scale { Anim { duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } } diff --git a/modules/sidebar/NotifDockList.qml b/modules/sidebar/NotifDockList.qml index 80d091c3..9803155d 100644 --- a/modules/sidebar/NotifDockList.qml +++ b/modules/sidebar/NotifDockList.qml @@ -130,7 +130,7 @@ LazyListView { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } @@ -141,14 +141,14 @@ LazyListView { Behavior on scale { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } Behavior on x { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } } @@ -160,6 +160,6 @@ LazyListView { target: root.container property: "contentY" duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } diff --git a/modules/sidebar/NotifGroup.qml b/modules/sidebar/NotifGroup.qml index 2616d805..2314dfe5 100644 --- a/modules/sidebar/NotifGroup.qml +++ b/modules/sidebar/NotifGroup.qml @@ -237,14 +237,14 @@ StyledRect { Behavior on rotation { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } Behavior on Layout.topMargin { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } } diff --git a/modules/sidebar/NotifGroupList.qml b/modules/sidebar/NotifGroupList.qml index 32d8d678..4aecf75f 100644 --- a/modules/sidebar/NotifGroupList.qml +++ b/modules/sidebar/NotifGroupList.qml @@ -133,7 +133,7 @@ LazyListView { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } @@ -148,7 +148,7 @@ LazyListView { Behavior on x { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } } diff --git a/modules/sidebar/Wrapper.qml b/modules/sidebar/Wrapper.qml index e2d8f5a6..aff42f69 100644 --- a/modules/sidebar/Wrapper.qml +++ b/modules/sidebar/Wrapper.qml @@ -21,7 +21,7 @@ Item { Behavior on offsetScale { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } diff --git a/modules/utilities/RecordingDeleteModal.qml b/modules/utilities/RecordingDeleteModal.qml index 9d89fb8f..7d7bcac8 100644 --- a/modules/utilities/RecordingDeleteModal.qml +++ b/modules/utilities/RecordingDeleteModal.qml @@ -196,7 +196,7 @@ Loader { Behavior on scale { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } } diff --git a/modules/utilities/Wrapper.qml b/modules/utilities/Wrapper.qml index c8f87c36..f36444eb 100644 --- a/modules/utilities/Wrapper.qml +++ b/modules/utilities/Wrapper.qml @@ -48,7 +48,7 @@ Item { Anim { property: "sidebarLerp" duration: Tokens.anim.durations.expressiveDefaultSpatial / 2 - easing.bezierCurve: Tokens.anim.curves.standardAccel + easing: Tokens.anim.standardAccel } }, Transition { @@ -57,7 +57,7 @@ Item { Anim { property: "sidebarLerp" duration: Tokens.anim.durations.expressiveDefaultSpatial / 2 - easing.bezierCurve: Tokens.anim.curves.standardDecel + easing: Tokens.anim.standardDecel } } ] @@ -65,7 +65,7 @@ Item { Behavior on offsetScale { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } diff --git a/modules/utilities/cards/IdleInhibit.qml b/modules/utilities/cards/IdleInhibit.qml index 30176f29..08427e7c 100644 --- a/modules/utilities/cards/IdleInhibit.qml +++ b/modules/utilities/cards/IdleInhibit.qml @@ -102,7 +102,7 @@ StyledRect { Behavior on anchors.bottomMargin { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } @@ -120,7 +120,7 @@ StyledRect { Behavior on implicitHeight { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } } diff --git a/modules/utilities/cards/Record.qml b/modules/utilities/cards/Record.qml index 97d88dde..dca2d375 100644 --- a/modules/utilities/cards/Record.qml +++ b/modules/utilities/cards/Record.qml @@ -132,14 +132,14 @@ StyledRect { property: "scale" to: 0.7 duration: Tokens.anim.durations.small - easing.bezierCurve: Tokens.anim.curves.standardAccel + easing: Tokens.anim.standardAccel } Anim { target: listOrControls property: "opacity" to: 0 duration: Tokens.anim.durations.small - easing.bezierCurve: Tokens.anim.curves.standardAccel + easing: Tokens.anim.standardAccel } } PropertyAction { @@ -159,14 +159,14 @@ StyledRect { property: "scale" to: 1 duration: Tokens.anim.durations.small - easing.bezierCurve: Tokens.anim.curves.standardDecel + easing: Tokens.anim.standardDecel } Anim { target: listOrControls property: "opacity" to: 1 duration: Tokens.anim.durations.small - easing.bezierCurve: Tokens.anim.curves.standardDecel + easing: Tokens.anim.standardDecel } } } @@ -219,13 +219,13 @@ StyledRect { from: 1 to: 0 duration: Tokens.anim.durations.large - easing.bezierCurve: Tokens.anim.curves.emphasizedAccel + easing: Tokens.anim.emphasizedAccel } Anim { from: 0 to: 1 duration: Tokens.anim.durations.extraLarge - easing.bezierCurve: Tokens.anim.curves.emphasizedDecel + easing: Tokens.anim.emphasizedDecel } } } diff --git a/modules/utilities/cards/RecordingList.qml b/modules/utilities/cards/RecordingList.qml index 57b7ad64..210b92af 100644 --- a/modules/utilities/cards/RecordingList.qml +++ b/modules/utilities/cards/RecordingList.qml @@ -234,7 +234,7 @@ ColumnLayout { Behavior on implicitHeight { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } } diff --git a/modules/utilities/cards/Toggles.qml b/modules/utilities/cards/Toggles.qml index 65b5a627..41eee68f 100644 --- a/modules/utilities/cards/Toggles.qml +++ b/modules/utilities/cards/Toggles.qml @@ -159,12 +159,12 @@ StyledRect { inactiveColour: Colours.layer(Colours.palette.m3surfaceContainerHighest, 2) toggle: true radiusAnim.duration: Tokens.anim.durations.expressiveFastSpatial - radiusAnim.easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + radiusAnim.easing: Tokens.anim.expressiveFastSpatial Behavior on Layout.preferredWidth { Anim { duration: Tokens.anim.durations.expressiveFastSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveFastSpatial + easing: Tokens.anim.expressiveFastSpatial } } } diff --git a/modules/utilities/toasts/Toasts.qml b/modules/utilities/toasts/Toasts.qml index 7c15bf82..517175bf 100644 --- a/modules/utilities/toasts/Toasts.qml +++ b/modules/utilities/toasts/Toasts.qml @@ -112,7 +112,7 @@ Item { from: 0 to: 1 duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } ParallelAnimation { @@ -149,7 +149,7 @@ Item { Behavior on anchors.bottomMargin { Anim { duration: Tokens.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Tokens.anim.curves.expressiveDefaultSpatial + easing: Tokens.anim.expressiveDefaultSpatial } } } From ba959245785676745ef1763eb33b31999db42f4f Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 21:44:03 +1000 Subject: [PATCH 26/81] fix: dashboard showXXX confs in the wrong file --- plugin/src/Caelestia/Config/dashboardconfig.hpp | 4 ++++ plugin/src/Caelestia/Config/tokens.hpp | 4 ---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugin/src/Caelestia/Config/dashboardconfig.hpp b/plugin/src/Caelestia/Config/dashboardconfig.hpp index d78bc1af..d4b0ba89 100644 --- a/plugin/src/Caelestia/Config/dashboardconfig.hpp +++ b/plugin/src/Caelestia/Config/dashboardconfig.hpp @@ -26,6 +26,10 @@ class DashboardConfig : public ConfigObject { CONFIG_PROPERTY(bool, enabled, true) CONFIG_PROPERTY(bool, showOnHover, true) + CONFIG_PROPERTY(bool, showDashboard, true) + CONFIG_PROPERTY(bool, showMedia, true) + CONFIG_PROPERTY(bool, showPerformance, true) + CONFIG_PROPERTY(bool, showWeather, true) CONFIG_PROPERTY(int, mediaUpdateInterval, 500) CONFIG_PROPERTY(int, resourceUpdateInterval, 1000) CONFIG_PROPERTY(int, dragThreshold, 50) diff --git a/plugin/src/Caelestia/Config/tokens.hpp b/plugin/src/Caelestia/Config/tokens.hpp index a9d879b4..203ba9a8 100644 --- a/plugin/src/Caelestia/Config/tokens.hpp +++ b/plugin/src/Caelestia/Config/tokens.hpp @@ -158,10 +158,6 @@ class DashboardTokens : public ConfigObject { Q_OBJECT QML_ANONYMOUS - CONFIG_PROPERTY(bool, showDashboard, true) - CONFIG_PROPERTY(bool, showMedia, true) - CONFIG_PROPERTY(bool, showPerformance, true) - CONFIG_PROPERTY(bool, showWeather, true) CONFIG_PROPERTY(int, tabIndicatorHeight, 3) CONFIG_PROPERTY(int, tabIndicatorSpacing, 5) CONFIG_PROPERTY(int, infoWidth, 200) From 9cf3ad40945c87d711e2be96c162cde82c627b14 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 21:54:27 +1000 Subject: [PATCH 27/81] fix: broken config uses + move gif speed adjustments to Config.general --- modules/dashboard/Media.qml | 2 +- modules/dashboard/dash/Media.qml | 2 +- modules/dashboard/dash/Resources.qml | 2 +- modules/session/Content.qml | 2 +- plugin/src/Caelestia/Config/appearanceconfig.hpp | 2 -- plugin/src/Caelestia/Config/generalconfig.hpp | 2 ++ 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/dashboard/Media.qml b/modules/dashboard/Media.qml index 29de3934..3cc17d57 100644 --- a/modules/dashboard/Media.qml +++ b/modules/dashboard/Media.qml @@ -402,7 +402,7 @@ Item { height: visualiser.height * 0.75 playing: Players.active?.isPlaying ?? false - speed: Audio.beatTracker.bpm / Tokens.anim.mediaGifSpeedAdjustment // qmllint disable unresolved-type + speed: Audio.beatTracker.bpm / Config.general.mediaGifSpeedAdjustment // qmllint disable unresolved-type source: Paths.absolutePath(Config.paths.mediaGif) asynchronous: true fillMode: AnimatedImage.PreserveAspectFit diff --git a/modules/dashboard/dash/Media.qml b/modules/dashboard/dash/Media.qml index 07d2352e..0788d380 100644 --- a/modules/dashboard/dash/Media.qml +++ b/modules/dashboard/dash/Media.qml @@ -213,7 +213,7 @@ Item { anchors.margins: Tokens.padding.large * 2 playing: Players.active?.isPlaying ?? false - speed: Audio.beatTracker.bpm / Tokens.anim.mediaGifSpeedAdjustment // qmllint disable unresolved-type + speed: Audio.beatTracker.bpm / Config.general.mediaGifSpeedAdjustment // qmllint disable unresolved-type source: Paths.absolutePath(Config.paths.mediaGif) asynchronous: true fillMode: AnimatedImage.PreserveAspectFit diff --git a/modules/dashboard/dash/Resources.qml b/modules/dashboard/dash/Resources.qml index f492cc58..17d0f4a2 100644 --- a/modules/dashboard/dash/Resources.qml +++ b/modules/dashboard/dash/Resources.qml @@ -53,7 +53,7 @@ Row { anchors.bottom: icon.top anchors.bottomMargin: Tokens.spacing.small - implicitWidth: Tokens.sizes.dashboard.resourceProgessThickness + implicitWidth: Tokens.sizes.dashboard.resourceProgressThickness color: Colours.layer(Colours.palette.m3surfaceContainerHigh, 2) radius: Tokens.rounding.full diff --git a/modules/session/Content.qml b/modules/session/Content.qml index 45fc0283..48dd9c5b 100644 --- a/modules/session/Content.qml +++ b/modules/session/Content.qml @@ -53,7 +53,7 @@ Column { playing: visible asynchronous: true - speed: Tokens.anim.sessionGifSpeed + speed: Config.general.sessionGifSpeed source: Paths.absolutePath(Config.paths.sessionGif) } diff --git a/plugin/src/Caelestia/Config/appearanceconfig.hpp b/plugin/src/Caelestia/Config/appearanceconfig.hpp index c13d0779..c58105a7 100644 --- a/plugin/src/Caelestia/Config/appearanceconfig.hpp +++ b/plugin/src/Caelestia/Config/appearanceconfig.hpp @@ -204,8 +204,6 @@ class AppearanceAnim : public ConfigObject { Q_OBJECT QML_ANONYMOUS - CONFIG_PROPERTY(qreal, mediaGifSpeedAdjustment, 300) - CONFIG_PROPERTY(qreal, sessionGifSpeed, 0.7) CONFIG_SUBOBJECT(AnimDurations, durations) public: diff --git a/plugin/src/Caelestia/Config/generalconfig.hpp b/plugin/src/Caelestia/Config/generalconfig.hpp index 88bb7ebf..24982e61 100644 --- a/plugin/src/Caelestia/Config/generalconfig.hpp +++ b/plugin/src/Caelestia/Config/generalconfig.hpp @@ -53,6 +53,8 @@ class GeneralConfig : public ConfigObject { CONFIG_PROPERTY(QString, logo) CONFIG_PROPERTY(QStringList, excludedScreens) + CONFIG_PROPERTY(qreal, mediaGifSpeedAdjustment, 300) + CONFIG_PROPERTY(qreal, sessionGifSpeed, 0.7) CONFIG_SUBOBJECT(GeneralApps, apps) CONFIG_SUBOBJECT(GeneralIdle, idle) CONFIG_SUBOBJECT(GeneralBattery, battery) From f65723ad719b89adc8a0341d9cb1e1373168b28f Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 22:11:30 +1000 Subject: [PATCH 28/81] feat: never destroy config singletons There are lots of issues with it, so instead give ownership to C++ and don't destroy on reloads (this does mean it does not reload, but it doesn't need to anyways) --- plugin/src/Caelestia/Config/config.cpp | 48 +++++--------------------- plugin/src/Caelestia/Config/config.hpp | 2 -- plugin/src/Caelestia/Config/tokens.cpp | 26 +++----------- plugin/src/Caelestia/Config/tokens.hpp | 2 -- 4 files changed, 13 insertions(+), 65 deletions(-) diff --git a/plugin/src/Caelestia/Config/config.cpp b/plugin/src/Caelestia/Config/config.cpp index da9fdcbe..41067735 100644 --- a/plugin/src/Caelestia/Config/config.cpp +++ b/plugin/src/Caelestia/Config/config.cpp @@ -9,8 +9,6 @@ namespace caelestia::config { namespace { -GlobalConfig* s_instance = nullptr; - QString configDir() { return QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + QStringLiteral("/caelestia/"); } @@ -36,14 +34,7 @@ GlobalConfig::GlobalConfig(QObject* parent) , m_sidebar(new SidebarConfig(this)) , m_services(new ServiceConfig(this)) , m_paths(new UserPaths(this)) { - // Set global instance - s_instance = this; - setupFileBackend(configDir() + QStringLiteral("shell.json")); - - // If TokenConfig was created before us, bind now - if (TokenConfig::instance()) - bindAppearanceTokens(); } GlobalConfig::GlobalConfig(GlobalConfig* fallback, const QString& filePath, QObject* parent) @@ -72,13 +63,10 @@ GlobalConfig::GlobalConfig(GlobalConfig* fallback, const QString& filePath, QObj syncFromGlobal(fallback); } -GlobalConfig::~GlobalConfig() { - if (s_instance == this) - s_instance = nullptr; -} - GlobalConfig* GlobalConfig::instance() { - return s_instance; + static GlobalConfig instance; + instance.bindAppearanceTokens(); + return &instance; } GlobalConfig* GlobalConfig::defaults() { @@ -91,14 +79,8 @@ void GlobalConfig::bindAppearanceTokens() { if (m_tokensBound) return; - auto* tokens = TokenConfig::instance(); - if (!tokens) { - qCDebug(lcConfig) << "GlobalConfig::bindAppearanceTokens: TokenConfig not yet available"; - return; - } - qCDebug(lcConfig) << "GlobalConfig::bindAppearanceTokens: binding appearance to token values"; - auto* tokenAppearance = tokens->appearance(); + auto* const tokenAppearance = TokenConfig::instance()->appearance(); m_appearance->rounding()->bindTokens(tokenAppearance->rounding()); m_appearance->spacing()->bindTokens(tokenAppearance->spacing()); m_appearance->padding()->bindTokens(tokenAppearance->padding()); @@ -107,17 +89,9 @@ void GlobalConfig::bindAppearanceTokens() { m_tokensBound = true; } -GlobalConfig* GlobalConfig::create(QQmlEngine* engine, QJSEngine* jsEngine) { - auto* config = new GlobalConfig(engine); - - // Ensure TokenConfig is created — appearance computed properties depend on token binding. - if (!TokenConfig::instance()) - TokenConfig::create(engine, jsEngine); - - // Bind now that both singletons exist - config->bindAppearanceTokens(); - - return config; +GlobalConfig* GlobalConfig::create(QQmlEngine*, QJSEngine*) { + QQmlEngine::setObjectOwnership(instance(), QQmlEngine::CppOwnership); + return instance(); } // Config (attached type) @@ -140,8 +114,7 @@ void Config::connectScope() { const Type* Config::name() const { \ if (m_scope && m_scope->config()) \ return m_scope->config()->name(); \ - auto* global = GlobalConfig::instance(); \ - return global ? global->name() : nullptr; \ + return GlobalConfig::instance()->name(); \ } CONFIG_ATTACHED_GETTER(AppearanceConfig, appearance) @@ -165,11 +138,6 @@ CONFIG_ATTACHED_GETTER(UserPaths, paths) #undef CONFIG_ATTACHED_GETTER Config* Config::qmlAttachedProperties(QObject* object) { - // Ensure GlobalConfig singleton is created before any attached property access - if (!GlobalConfig::instance()) { - if (auto* engine = qmlEngine(object)) - engine->singletonInstance("Caelestia.Config", "GlobalConfig"); - } return new Config(ConfigScope::find(object), object); } diff --git a/plugin/src/Caelestia/Config/config.hpp b/plugin/src/Caelestia/Config/config.hpp index ddced131..d683df11 100644 --- a/plugin/src/Caelestia/Config/config.hpp +++ b/plugin/src/Caelestia/Config/config.hpp @@ -50,8 +50,6 @@ public: [[nodiscard]] Q_INVOKABLE GlobalConfig* defaults(); static GlobalConfig* create(QQmlEngine*, QJSEngine*); - ~GlobalConfig() override; - void bindAppearanceTokens(); private: diff --git a/plugin/src/Caelestia/Config/tokens.cpp b/plugin/src/Caelestia/Config/tokens.cpp index bf808249..902dbfc4 100644 --- a/plugin/src/Caelestia/Config/tokens.cpp +++ b/plugin/src/Caelestia/Config/tokens.cpp @@ -9,8 +9,6 @@ namespace caelestia::config { namespace { -TokenConfig* s_instance = nullptr; - QString configDir() { return QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + QStringLiteral("/caelestia/"); } @@ -21,13 +19,7 @@ TokenConfig::TokenConfig(QObject* parent) : RootConfig(parent) , m_appearance(new AppearanceTokens(this)) , m_sizes(new SizeTokens(this)) { - s_instance = this; - setupFileBackend(configDir() + QStringLiteral("shell-tokens.json")); - - // If GlobalConfig was created before us, trigger its binding - if (auto* global = GlobalConfig::instance()) - global->bindAppearanceTokens(); } TokenConfig::TokenConfig(TokenConfig* fallback, const QString& filePath, QObject* parent) @@ -41,13 +33,9 @@ TokenConfig::TokenConfig(TokenConfig* fallback, const QString& filePath, QObject syncFromGlobal(fallback); } -TokenConfig::~TokenConfig() { - if (s_instance == this) - s_instance = nullptr; -} - TokenConfig* TokenConfig::instance() { - return s_instance; + static TokenConfig instance; + return &instance; } TokenConfig* TokenConfig::defaults() { @@ -56,8 +44,9 @@ TokenConfig* TokenConfig::defaults() { return m_defaults; } -TokenConfig* TokenConfig::create(QQmlEngine* engine, QJSEngine*) { - return new TokenConfig(engine); +TokenConfig* TokenConfig::create(QQmlEngine*, QJSEngine*) { + QQmlEngine::setObjectOwnership(instance(), QQmlEngine::CppOwnership); + return instance(); } // Tokens (attached type) @@ -132,11 +121,6 @@ const SizeTokens* Tokens::sizes() const { } Tokens* Tokens::qmlAttachedProperties(QObject* object) { - // Ensure GlobalConfig singleton is created before any attached property access - if (!GlobalConfig::instance()) { - if (auto* engine = qmlEngine(object)) - engine->singletonInstance("Caelestia.Config", "GlobalConfig"); - } return new Tokens(ConfigScope::find(object), object); } diff --git a/plugin/src/Caelestia/Config/tokens.hpp b/plugin/src/Caelestia/Config/tokens.hpp index 203ba9a8..69740aab 100644 --- a/plugin/src/Caelestia/Config/tokens.hpp +++ b/plugin/src/Caelestia/Config/tokens.hpp @@ -332,8 +332,6 @@ public: [[nodiscard]] Q_INVOKABLE TokenConfig* defaults(); static TokenConfig* create(QQmlEngine*, QJSEngine*); - ~TokenConfig() override; - private: friend class MonitorConfigManager; explicit TokenConfig(QObject* parent = nullptr); From 71dd7b4db8348319d48b30ef0abd0893fae1069f Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 22:17:24 +1000 Subject: [PATCH 29/81] chore: format QML imports --- components/ConnectionHeader.qml | 2 +- components/ConnectionInfoSection.qml | 2 +- components/MaterialIcon.qml | 2 +- components/PropertyRow.qml | 2 +- components/SectionContainer.qml | 2 +- components/SectionHeader.qml | 2 +- components/StateLayer.qml | 2 +- components/StyledText.qml | 2 +- components/controls/CircularIndicator.qml | 2 +- components/controls/CircularProgress.qml | 2 +- components/controls/CollapsibleSection.qml | 2 +- components/controls/CustomSpinBox.qml | 2 +- components/controls/FilledSlider.qml | 2 +- components/controls/IconButton.qml | 2 +- components/controls/IconTextButton.qml | 2 +- components/controls/Menu.qml | 2 +- components/controls/SpinBoxRow.qml | 2 +- components/controls/SplitButton.qml | 2 +- components/controls/SplitButtonRow.qml | 2 +- components/controls/StyledInputField.qml | 2 +- components/controls/StyledRadioButton.qml | 2 +- components/controls/StyledScrollBar.qml | 2 +- components/controls/StyledSlider.qml | 2 +- components/controls/StyledSwitch.qml | 2 +- components/controls/StyledTextField.qml | 2 +- components/controls/SwitchRow.qml | 2 +- components/controls/TextButton.qml | 2 +- components/controls/ToggleButton.qml | 2 +- components/controls/ToggleRow.qml | 2 +- components/controls/Tooltip.qml | 2 +- components/effects/InnerBorder.qml | 2 +- components/filedialog/CurrentItem.qml | 2 +- components/filedialog/DialogButtons.qml | 2 +- components/filedialog/FolderContents.qml | 2 +- components/filedialog/HeaderBar.qml | 2 +- components/filedialog/Sidebar.qml | 2 +- components/widgets/ExtraIndicator.qml | 2 +- modules/IdleMonitors.qml | 2 +- modules/areapicker/Picker.qml | 2 +- modules/background/Background.qml | 2 +- modules/background/DesktopClock.qml | 2 +- modules/background/Visualiser.qml | 2 +- modules/background/Wallpaper.qml | 2 +- modules/bar/Bar.qml | 2 +- modules/bar/BarWrapper.qml | 2 +- modules/bar/components/ActiveWindow.qml | 2 +- modules/bar/components/Clock.qml | 2 +- modules/bar/components/OsIcon.qml | 2 +- modules/bar/components/Power.qml | 2 +- modules/bar/components/Settings.qml | 2 +- modules/bar/components/SettingsIcon.qml | 2 +- modules/bar/components/StatusIcons.qml | 2 +- modules/bar/components/Tray.qml | 2 +- modules/bar/components/TrayItem.qml | 2 +- modules/bar/components/workspaces/ActiveIndicator.qml | 2 +- modules/bar/components/workspaces/OccupiedBg.qml | 2 +- modules/bar/components/workspaces/SpecialWorkspaces.qml | 2 +- modules/bar/components/workspaces/Workspace.qml | 2 +- modules/bar/components/workspaces/Workspaces.qml | 2 +- modules/bar/popouts/ActiveWindow.qml | 2 +- modules/bar/popouts/Audio.qml | 2 +- modules/bar/popouts/Battery.qml | 2 +- modules/bar/popouts/Bluetooth.qml | 2 +- modules/bar/popouts/ClipWrapper.qml | 2 +- modules/bar/popouts/Content.qml | 2 +- modules/bar/popouts/LockStatus.qml | 2 +- modules/bar/popouts/Network.qml | 2 +- modules/bar/popouts/TrayMenu.qml | 2 +- modules/bar/popouts/WirelessPassword.qml | 2 +- modules/bar/popouts/Wrapper.qml | 2 +- modules/bar/popouts/kblayout/KbLayout.qml | 2 +- modules/controlcenter/ControlCenter.qml | 2 +- modules/controlcenter/NavRail.qml | 2 +- modules/controlcenter/Panes.qml | 2 +- modules/controlcenter/WindowTitle.qml | 2 +- modules/controlcenter/appearance/AppearancePane.qml | 2 +- modules/controlcenter/appearance/sections/AnimationsSection.qml | 2 +- modules/controlcenter/appearance/sections/BackgroundSection.qml | 2 +- modules/controlcenter/appearance/sections/BorderSection.qml | 2 +- .../controlcenter/appearance/sections/ColorSchemeSection.qml | 2 +- .../controlcenter/appearance/sections/ColorVariantSection.qml | 2 +- modules/controlcenter/appearance/sections/FontsSection.qml | 2 +- modules/controlcenter/appearance/sections/ScalesSection.qml | 2 +- modules/controlcenter/appearance/sections/ThemeModeSection.qml | 2 +- .../controlcenter/appearance/sections/TransparencySection.qml | 2 +- modules/controlcenter/audio/AudioPane.qml | 2 +- modules/controlcenter/bluetooth/BtPane.qml | 2 +- modules/controlcenter/bluetooth/Details.qml | 2 +- modules/controlcenter/bluetooth/DeviceList.qml | 2 +- modules/controlcenter/bluetooth/Settings.qml | 2 +- modules/controlcenter/components/ConnectedButtonGroup.qml | 2 +- modules/controlcenter/components/DeviceDetails.qml | 2 +- modules/controlcenter/components/DeviceList.qml | 2 +- modules/controlcenter/components/ReadonlySlider.qml | 2 +- modules/controlcenter/components/SettingsHeader.qml | 2 +- modules/controlcenter/components/SliderInput.qml | 2 +- modules/controlcenter/components/SplitPaneLayout.qml | 2 +- modules/controlcenter/components/SplitPaneWithDetails.qml | 2 +- modules/controlcenter/components/WallpaperGrid.qml | 2 +- modules/controlcenter/dashboard/DashboardPane.qml | 2 +- modules/controlcenter/dashboard/GeneralSection.qml | 2 +- modules/controlcenter/dashboard/PerformanceSection.qml | 2 +- modules/controlcenter/launcher/LauncherPane.qml | 2 +- modules/controlcenter/launcher/Settings.qml | 2 +- modules/controlcenter/network/EthernetDetails.qml | 2 +- modules/controlcenter/network/EthernetList.qml | 2 +- modules/controlcenter/network/EthernetPane.qml | 2 +- modules/controlcenter/network/EthernetSettings.qml | 2 +- modules/controlcenter/network/NetworkSettings.qml | 2 +- modules/controlcenter/network/NetworkingPane.qml | 2 +- modules/controlcenter/network/VpnDetails.qml | 2 +- modules/controlcenter/network/VpnList.qml | 2 +- modules/controlcenter/network/VpnSettings.qml | 2 +- modules/controlcenter/network/WirelessDetails.qml | 2 +- modules/controlcenter/network/WirelessList.qml | 2 +- modules/controlcenter/network/WirelessPane.qml | 2 +- modules/controlcenter/network/WirelessPasswordDialog.qml | 2 +- modules/controlcenter/network/WirelessSettings.qml | 2 +- modules/controlcenter/notifications/NotificationsPane.qml | 2 +- modules/controlcenter/taskbar/TaskbarPane.qml | 2 +- modules/dashboard/Content.qml | 2 +- modules/dashboard/Dash.qml | 2 +- modules/dashboard/LyricMenu.qml | 2 +- modules/dashboard/LyricsView.qml | 2 +- modules/dashboard/Media.qml | 2 +- modules/dashboard/Performance.qml | 2 +- modules/dashboard/Tabs.qml | 2 +- modules/dashboard/WeatherTab.qml | 2 +- modules/dashboard/Wrapper.qml | 2 +- modules/dashboard/dash/Calendar.qml | 2 +- modules/dashboard/dash/DateTime.qml | 2 +- modules/dashboard/dash/Media.qml | 2 +- modules/dashboard/dash/Resources.qml | 2 +- modules/dashboard/dash/SmallWeather.qml | 2 +- modules/dashboard/dash/User.qml | 2 +- modules/drawers/ContentWindow.qml | 2 +- modules/drawers/Drawers.qml | 2 +- modules/drawers/Interactions.qml | 2 +- modules/drawers/Panels.qml | 2 +- modules/launcher/AppList.qml | 2 +- modules/launcher/Content.qml | 2 +- modules/launcher/ContentList.qml | 2 +- modules/launcher/WallpaperList.qml | 2 +- modules/launcher/Wrapper.qml | 2 +- modules/launcher/items/ActionItem.qml | 2 +- modules/launcher/items/AppItem.qml | 2 +- modules/launcher/items/CalcItem.qml | 2 +- modules/launcher/items/SchemeItem.qml | 2 +- modules/launcher/items/VariantItem.qml | 2 +- modules/launcher/items/WallpaperItem.qml | 2 +- modules/launcher/services/Actions.qml | 2 +- modules/lock/Center.qml | 2 +- modules/lock/Content.qml | 2 +- modules/lock/Fetch.qml | 2 +- modules/lock/InputField.qml | 2 +- modules/lock/LockSurface.qml | 2 +- modules/lock/Media.qml | 2 +- modules/lock/NotifDock.qml | 2 +- modules/lock/NotifGroup.qml | 2 +- modules/lock/Resources.qml | 2 +- modules/lock/WeatherInfo.qml | 2 +- modules/notifications/Content.qml | 2 +- modules/notifications/Notification.qml | 2 +- modules/osd/Content.qml | 2 +- modules/osd/Wrapper.qml | 2 +- modules/session/Content.qml | 2 +- modules/session/Wrapper.qml | 2 +- modules/sidebar/Content.qml | 2 +- modules/sidebar/Notif.qml | 2 +- modules/sidebar/NotifActionList.qml | 2 +- modules/sidebar/NotifDock.qml | 2 +- modules/sidebar/NotifDockList.qml | 2 +- modules/sidebar/NotifGroup.qml | 2 +- modules/sidebar/NotifGroupList.qml | 2 +- modules/sidebar/Wrapper.qml | 2 +- modules/utilities/Content.qml | 2 +- modules/utilities/RecordingDeleteModal.qml | 2 +- modules/utilities/Wrapper.qml | 2 +- modules/utilities/cards/IdleInhibit.qml | 2 +- modules/utilities/cards/Record.qml | 2 +- modules/utilities/cards/RecordingList.qml | 2 +- modules/utilities/cards/Toggles.qml | 2 +- modules/utilities/toasts/ToastItem.qml | 2 +- modules/utilities/toasts/Toasts.qml | 2 +- modules/windowinfo/Buttons.qml | 2 +- modules/windowinfo/Details.qml | 2 +- modules/windowinfo/Preview.qml | 2 +- modules/windowinfo/WindowInfo.qml | 2 +- services/Audio.qml | 2 +- services/Brightness.qml | 2 +- services/Colours.qml | 2 +- services/GameMode.qml | 2 +- services/Hypr.qml | 2 +- services/NetworkUsage.qml | 2 +- services/NotifData.qml | 2 +- services/Notifs.qml | 2 +- services/Players.qml | 2 +- services/Wallpapers.qml | 2 +- 198 files changed, 198 insertions(+), 198 deletions(-) diff --git a/components/ConnectionHeader.qml b/components/ConnectionHeader.qml index 36886803..691fd3c5 100644 --- a/components/ConnectionHeader.qml +++ b/components/ConnectionHeader.qml @@ -1,7 +1,7 @@ import QtQuick import QtQuick.Layouts -import qs.components import Caelestia.Config +import qs.components ColumnLayout { id: root diff --git a/components/ConnectionInfoSection.qml b/components/ConnectionInfoSection.qml index bac3cc7c..d94c3a6e 100644 --- a/components/ConnectionInfoSection.qml +++ b/components/ConnectionInfoSection.qml @@ -1,8 +1,8 @@ import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config ColumnLayout { id: root diff --git a/components/MaterialIcon.qml b/components/MaterialIcon.qml index e85d39be..739c50ba 100644 --- a/components/MaterialIcon.qml +++ b/components/MaterialIcon.qml @@ -1,5 +1,5 @@ -import qs.services import Caelestia.Config +import qs.services StyledText { property real fill diff --git a/components/PropertyRow.qml b/components/PropertyRow.qml index 7f1a68bd..4d302509 100644 --- a/components/PropertyRow.qml +++ b/components/PropertyRow.qml @@ -1,8 +1,8 @@ import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config ColumnLayout { id: root diff --git a/components/SectionContainer.qml b/components/SectionContainer.qml index 05b4523c..7aa3f13f 100644 --- a/components/SectionContainer.qml +++ b/components/SectionContainer.qml @@ -1,8 +1,8 @@ import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config StyledRect { id: root diff --git a/components/SectionHeader.qml b/components/SectionHeader.qml index 107c6d36..09364143 100644 --- a/components/SectionHeader.qml +++ b/components/SectionHeader.qml @@ -1,8 +1,8 @@ import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config ColumnLayout { id: root diff --git a/components/StateLayer.qml b/components/StateLayer.qml index 545a7583..a18e41f9 100644 --- a/components/StateLayer.qml +++ b/components/StateLayer.qml @@ -1,6 +1,6 @@ import QtQuick -import qs.services import Caelestia.Config +import qs.services MouseArea { id: root diff --git a/components/StyledText.qml b/components/StyledText.qml index 83dc146d..d3624c58 100644 --- a/components/StyledText.qml +++ b/components/StyledText.qml @@ -1,8 +1,8 @@ pragma ComponentBehavior: Bound import QtQuick -import qs.services import Caelestia.Config +import qs.services Text { id: root diff --git a/components/controls/CircularIndicator.qml b/components/controls/CircularIndicator.qml index 8bfee428..763b112c 100644 --- a/components/controls/CircularIndicator.qml +++ b/components/controls/CircularIndicator.qml @@ -1,9 +1,9 @@ import ".." import QtQuick import QtQuick.Templates +import Caelestia.Config import Caelestia.Internal import qs.services -import Caelestia.Config BusyIndicator { id: root diff --git a/components/controls/CircularProgress.qml b/components/controls/CircularProgress.qml index 4cd5f9f7..9e312280 100644 --- a/components/controls/CircularProgress.qml +++ b/components/controls/CircularProgress.qml @@ -1,8 +1,8 @@ import ".." import QtQuick import QtQuick.Shapes -import qs.services import Caelestia.Config +import qs.services Shape { id: root diff --git a/components/controls/CollapsibleSection.qml b/components/controls/CollapsibleSection.qml index 95aae8ee..75a6b9aa 100644 --- a/components/controls/CollapsibleSection.qml +++ b/components/controls/CollapsibleSection.qml @@ -1,9 +1,9 @@ import ".." import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config ColumnLayout { id: root diff --git a/components/controls/CustomSpinBox.qml b/components/controls/CustomSpinBox.qml index 6adb137c..b5f4f8dd 100644 --- a/components/controls/CustomSpinBox.qml +++ b/components/controls/CustomSpinBox.qml @@ -3,8 +3,8 @@ pragma ComponentBehavior: Bound import ".." import QtQuick import QtQuick.Layouts -import qs.services import Caelestia.Config +import qs.services RowLayout { id: root diff --git a/components/controls/FilledSlider.qml b/components/controls/FilledSlider.qml index c71f65e9..e8593b96 100644 --- a/components/controls/FilledSlider.qml +++ b/components/controls/FilledSlider.qml @@ -2,8 +2,8 @@ import ".." import "../effects" import QtQuick import QtQuick.Templates -import qs.services import Caelestia.Config +import qs.services Slider { id: root diff --git a/components/controls/IconButton.qml b/components/controls/IconButton.qml index 60973094..d0e6ac31 100644 --- a/components/controls/IconButton.qml +++ b/components/controls/IconButton.qml @@ -1,7 +1,7 @@ import ".." import QtQuick -import qs.services import Caelestia.Config +import qs.services StyledRect { id: root diff --git a/components/controls/IconTextButton.qml b/components/controls/IconTextButton.qml index 1fbf74eb..919c1f1d 100644 --- a/components/controls/IconTextButton.qml +++ b/components/controls/IconTextButton.qml @@ -1,8 +1,8 @@ import ".." import QtQuick import QtQuick.Layouts -import qs.services import Caelestia.Config +import qs.services StyledRect { id: root diff --git a/components/controls/Menu.qml b/components/controls/Menu.qml index 966837ea..3f4878e6 100644 --- a/components/controls/Menu.qml +++ b/components/controls/Menu.qml @@ -4,8 +4,8 @@ import ".." import "../effects" import QtQuick import QtQuick.Layouts -import qs.services import Caelestia.Config +import qs.services Elevation { id: root diff --git a/components/controls/SpinBoxRow.qml b/components/controls/SpinBoxRow.qml index c5e5c082..d15414f0 100644 --- a/components/controls/SpinBoxRow.qml +++ b/components/controls/SpinBoxRow.qml @@ -1,9 +1,9 @@ import ".." import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config StyledRect { id: root diff --git a/components/controls/SplitButton.qml b/components/controls/SplitButton.qml index cdea38f0..ba75a678 100644 --- a/components/controls/SplitButton.qml +++ b/components/controls/SplitButton.qml @@ -1,8 +1,8 @@ import ".." import QtQuick import QtQuick.Layouts -import qs.services import Caelestia.Config +import qs.services Row { id: root diff --git a/components/controls/SplitButtonRow.qml b/components/controls/SplitButtonRow.qml index 9082ce1d..c097bfd5 100644 --- a/components/controls/SplitButtonRow.qml +++ b/components/controls/SplitButtonRow.qml @@ -3,9 +3,9 @@ pragma ComponentBehavior: Bound import ".." import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config StyledRect { id: root diff --git a/components/controls/StyledInputField.qml b/components/controls/StyledInputField.qml index 7cbf26c5..38b1208b 100644 --- a/components/controls/StyledInputField.qml +++ b/components/controls/StyledInputField.qml @@ -2,9 +2,9 @@ pragma ComponentBehavior: Bound import ".." import QtQuick +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config Item { id: root diff --git a/components/controls/StyledRadioButton.qml b/components/controls/StyledRadioButton.qml index a2e99327..a141b245 100644 --- a/components/controls/StyledRadioButton.qml +++ b/components/controls/StyledRadioButton.qml @@ -1,8 +1,8 @@ import QtQuick import QtQuick.Templates +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config RadioButton { id: root diff --git a/components/controls/StyledScrollBar.qml b/components/controls/StyledScrollBar.qml index 4cd86a4a..aaeaff29 100644 --- a/components/controls/StyledScrollBar.qml +++ b/components/controls/StyledScrollBar.qml @@ -1,8 +1,8 @@ import ".." import QtQuick import QtQuick.Templates -import qs.services import Caelestia.Config +import qs.services ScrollBar { id: root diff --git a/components/controls/StyledSlider.qml b/components/controls/StyledSlider.qml index 09349635..f169691b 100644 --- a/components/controls/StyledSlider.qml +++ b/components/controls/StyledSlider.qml @@ -1,8 +1,8 @@ import QtQuick import QtQuick.Templates +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config Slider { id: root diff --git a/components/controls/StyledSwitch.qml b/components/controls/StyledSwitch.qml index be7eb9c5..a3439130 100644 --- a/components/controls/StyledSwitch.qml +++ b/components/controls/StyledSwitch.qml @@ -2,8 +2,8 @@ import ".." import QtQuick import QtQuick.Shapes import QtQuick.Templates -import qs.services import Caelestia.Config +import qs.services Switch { id: root diff --git a/components/controls/StyledTextField.qml b/components/controls/StyledTextField.qml index 9a810f79..7eec78b8 100644 --- a/components/controls/StyledTextField.qml +++ b/components/controls/StyledTextField.qml @@ -3,8 +3,8 @@ pragma ComponentBehavior: Bound import ".." import QtQuick import QtQuick.Controls -import qs.services import Caelestia.Config +import qs.services TextField { id: root diff --git a/components/controls/SwitchRow.qml b/components/controls/SwitchRow.qml index 01a42dd9..8b2d617d 100644 --- a/components/controls/SwitchRow.qml +++ b/components/controls/SwitchRow.qml @@ -1,9 +1,9 @@ import ".." import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config StyledRect { id: root diff --git a/components/controls/TextButton.qml b/components/controls/TextButton.qml index a74c49e1..159d63b4 100644 --- a/components/controls/TextButton.qml +++ b/components/controls/TextButton.qml @@ -1,7 +1,7 @@ import ".." import QtQuick -import qs.services import Caelestia.Config +import qs.services StyledRect { id: root diff --git a/components/controls/ToggleButton.qml b/components/controls/ToggleButton.qml index fce6215b..0ece6d4e 100644 --- a/components/controls/ToggleButton.qml +++ b/components/controls/ToggleButton.qml @@ -3,10 +3,10 @@ pragma ComponentBehavior: Bound import ".." import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.controls import qs.services -import Caelestia.Config StyledRect { id: root diff --git a/components/controls/ToggleRow.qml b/components/controls/ToggleRow.qml index 01e9cc0e..beb6a15c 100644 --- a/components/controls/ToggleRow.qml +++ b/components/controls/ToggleRow.qml @@ -1,8 +1,8 @@ import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.controls -import Caelestia.Config RowLayout { id: root diff --git a/components/controls/Tooltip.qml b/components/controls/Tooltip.qml index 06b292de..d00c144b 100644 --- a/components/controls/Tooltip.qml +++ b/components/controls/Tooltip.qml @@ -1,9 +1,9 @@ import ".." import QtQuick import QtQuick.Controls +import Caelestia.Config import qs.components.effects import qs.services -import Caelestia.Config Popup { id: root diff --git a/components/effects/InnerBorder.qml b/components/effects/InnerBorder.qml index 2770c9bc..2723a04e 100644 --- a/components/effects/InnerBorder.qml +++ b/components/effects/InnerBorder.qml @@ -3,8 +3,8 @@ pragma ComponentBehavior: Bound import ".." import QtQuick import QtQuick.Effects -import qs.services import Caelestia.Config +import qs.services StyledRect { property alias innerRadius: maskInner.radius diff --git a/components/filedialog/CurrentItem.qml b/components/filedialog/CurrentItem.qml index d410b13c..036828e5 100644 --- a/components/filedialog/CurrentItem.qml +++ b/components/filedialog/CurrentItem.qml @@ -1,8 +1,8 @@ import ".." import QtQuick import QtQuick.Shapes -import qs.services import Caelestia.Config +import qs.services Item { id: root diff --git a/components/filedialog/DialogButtons.qml b/components/filedialog/DialogButtons.qml index 94cbd72d..abd49d33 100644 --- a/components/filedialog/DialogButtons.qml +++ b/components/filedialog/DialogButtons.qml @@ -1,7 +1,7 @@ import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config StyledRect { id: root diff --git a/components/filedialog/FolderContents.qml b/components/filedialog/FolderContents.qml index ebd5098d..b5f34a48 100644 --- a/components/filedialog/FolderContents.qml +++ b/components/filedialog/FolderContents.qml @@ -4,13 +4,13 @@ import QtQuick import QtQuick.Effects import QtQuick.Layouts import Quickshell +import Caelestia.Config import Caelestia.Models import qs.components import qs.components.controls import qs.components.filedialog import qs.components.images import qs.services -import Caelestia.Config import qs.utils Item { diff --git a/components/filedialog/HeaderBar.qml b/components/filedialog/HeaderBar.qml index c114bbd8..7bd66b2c 100644 --- a/components/filedialog/HeaderBar.qml +++ b/components/filedialog/HeaderBar.qml @@ -3,8 +3,8 @@ pragma ComponentBehavior: Bound import ".." import QtQuick import QtQuick.Layouts -import qs.services import Caelestia.Config +import qs.services StyledRect { id: root diff --git a/components/filedialog/Sidebar.qml b/components/filedialog/Sidebar.qml index 885185c9..ad10afba 100644 --- a/components/filedialog/Sidebar.qml +++ b/components/filedialog/Sidebar.qml @@ -2,10 +2,10 @@ pragma ComponentBehavior: Bound import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.filedialog import qs.services -import Caelestia.Config StyledRect { id: root diff --git a/components/widgets/ExtraIndicator.qml b/components/widgets/ExtraIndicator.qml index 1c766bf0..1fa34837 100644 --- a/components/widgets/ExtraIndicator.qml +++ b/components/widgets/ExtraIndicator.qml @@ -1,8 +1,8 @@ import ".." import "../effects" import QtQuick -import qs.services import Caelestia.Config +import qs.services StyledRect { required property int extra diff --git a/modules/IdleMonitors.qml b/modules/IdleMonitors.qml index c396bc8b..839cd6f6 100644 --- a/modules/IdleMonitors.qml +++ b/modules/IdleMonitors.qml @@ -3,9 +3,9 @@ pragma ComponentBehavior: Bound import "lock" import Quickshell import Quickshell.Wayland +import Caelestia.Config import Caelestia.Internal import qs.services -import Caelestia.Config Scope { id: root diff --git a/modules/areapicker/Picker.qml b/modules/areapicker/Picker.qml index 6399981f..30c47afd 100644 --- a/modules/areapicker/Picker.qml +++ b/modules/areapicker/Picker.qml @@ -6,9 +6,9 @@ import Quickshell import Quickshell.Io import Quickshell.Wayland import Caelestia +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config MouseArea { id: root diff --git a/modules/background/Background.qml b/modules/background/Background.qml index 547fdc9b..fde27ef4 100644 --- a/modules/background/Background.qml +++ b/modules/background/Background.qml @@ -3,9 +3,9 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell import Quickshell.Wayland +import Caelestia.Config import qs.components.containers import qs.services -import Caelestia.Config Variants { model: Config.background.enabled ? Screens.screens : [] diff --git a/modules/background/DesktopClock.qml b/modules/background/DesktopClock.qml index c184df78..b7d22417 100644 --- a/modules/background/DesktopClock.qml +++ b/modules/background/DesktopClock.qml @@ -3,9 +3,9 @@ pragma ComponentBehavior: Bound import QtQuick import QtQuick.Effects import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config Item { id: root diff --git a/modules/background/Visualiser.qml b/modules/background/Visualiser.qml index ebb28dfa..45055879 100644 --- a/modules/background/Visualiser.qml +++ b/modules/background/Visualiser.qml @@ -3,11 +3,11 @@ pragma ComponentBehavior: Bound import QtQuick import QtQuick.Effects import Quickshell +import Caelestia.Config import Caelestia.Internal import Caelestia.Services import qs.components import qs.services -import Caelestia.Config Item { id: root diff --git a/modules/background/Wallpaper.qml b/modules/background/Wallpaper.qml index f226d062..b5eac8dd 100644 --- a/modules/background/Wallpaper.qml +++ b/modules/background/Wallpaper.qml @@ -1,11 +1,11 @@ pragma ComponentBehavior: Bound import QtQuick +import Caelestia.Config import qs.components import qs.components.filedialog import qs.components.images import qs.services -import Caelestia.Config import qs.utils Item { diff --git a/modules/bar/Bar.qml b/modules/bar/Bar.qml index 5d127f57..27483d9f 100644 --- a/modules/bar/Bar.qml +++ b/modules/bar/Bar.qml @@ -6,9 +6,9 @@ import "components/workspaces" import QtQuick import QtQuick.Layouts import Quickshell +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config ColumnLayout { id: root diff --git a/modules/bar/BarWrapper.qml b/modules/bar/BarWrapper.qml index 1f10d366..7c8c5973 100644 --- a/modules/bar/BarWrapper.qml +++ b/modules/bar/BarWrapper.qml @@ -2,8 +2,8 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell -import qs.components import Caelestia.Config +import qs.components import qs.utils import qs.modules.bar.popouts as BarPopouts diff --git a/modules/bar/components/ActiveWindow.qml b/modules/bar/components/ActiveWindow.qml index 5979edd4..6bd5ef3f 100644 --- a/modules/bar/components/ActiveWindow.qml +++ b/modules/bar/components/ActiveWindow.qml @@ -1,9 +1,9 @@ pragma ComponentBehavior: Bound import QtQuick +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config import qs.utils Item { diff --git a/modules/bar/components/Clock.qml b/modules/bar/components/Clock.qml index 693659c5..d6528c64 100644 --- a/modules/bar/components/Clock.qml +++ b/modules/bar/components/Clock.qml @@ -1,9 +1,9 @@ pragma ComponentBehavior: Bound import QtQuick +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config StyledRect { id: root diff --git a/modules/bar/components/OsIcon.qml b/modules/bar/components/OsIcon.qml index 47a8c88f..94d1a1c4 100644 --- a/modules/bar/components/OsIcon.qml +++ b/modules/bar/components/OsIcon.qml @@ -1,8 +1,8 @@ import QtQuick +import Caelestia.Config import qs.components import qs.components.effects import qs.services -import Caelestia.Config import qs.utils Item { diff --git a/modules/bar/components/Power.qml b/modules/bar/components/Power.qml index f3f4706a..8fca7adc 100644 --- a/modules/bar/components/Power.qml +++ b/modules/bar/components/Power.qml @@ -1,7 +1,7 @@ import QtQuick +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config Item { id: root diff --git a/modules/bar/components/Settings.qml b/modules/bar/components/Settings.qml index f060225c..5424e414 100644 --- a/modules/bar/components/Settings.qml +++ b/modules/bar/components/Settings.qml @@ -1,7 +1,7 @@ import QtQuick +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config import qs.modules.controlcenter Item { diff --git a/modules/bar/components/SettingsIcon.qml b/modules/bar/components/SettingsIcon.qml index f060225c..5424e414 100644 --- a/modules/bar/components/SettingsIcon.qml +++ b/modules/bar/components/SettingsIcon.qml @@ -1,7 +1,7 @@ import QtQuick +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config import qs.modules.controlcenter Item { diff --git a/modules/bar/components/StatusIcons.qml b/modules/bar/components/StatusIcons.qml index 3b11036b..900e5574 100644 --- a/modules/bar/components/StatusIcons.qml +++ b/modules/bar/components/StatusIcons.qml @@ -5,9 +5,9 @@ import QtQuick.Layouts import Quickshell import Quickshell.Bluetooth import Quickshell.Services.UPower +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config import qs.utils StyledRect { diff --git a/modules/bar/components/Tray.qml b/modules/bar/components/Tray.qml index 5adc5e57..ceb5e180 100644 --- a/modules/bar/components/Tray.qml +++ b/modules/bar/components/Tray.qml @@ -3,9 +3,9 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell import Quickshell.Services.SystemTray +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config StyledRect { id: root diff --git a/modules/bar/components/TrayItem.qml b/modules/bar/components/TrayItem.qml index 1320eb2a..fefb532c 100644 --- a/modules/bar/components/TrayItem.qml +++ b/modules/bar/components/TrayItem.qml @@ -2,9 +2,9 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell.Services.SystemTray +import Caelestia.Config import qs.components.effects import qs.services -import Caelestia.Config import qs.utils MouseArea { diff --git a/modules/bar/components/workspaces/ActiveIndicator.qml b/modules/bar/components/workspaces/ActiveIndicator.qml index e9a32b45..ec782e3b 100644 --- a/modules/bar/components/workspaces/ActiveIndicator.qml +++ b/modules/bar/components/workspaces/ActiveIndicator.qml @@ -1,8 +1,8 @@ import QtQuick +import Caelestia.Config import qs.components import qs.components.effects import qs.services -import Caelestia.Config StyledRect { id: root diff --git a/modules/bar/components/workspaces/OccupiedBg.qml b/modules/bar/components/workspaces/OccupiedBg.qml index c54db55c..2bd3c8cb 100644 --- a/modules/bar/components/workspaces/OccupiedBg.qml +++ b/modules/bar/components/workspaces/OccupiedBg.qml @@ -2,9 +2,9 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config Item { id: root diff --git a/modules/bar/components/workspaces/SpecialWorkspaces.qml b/modules/bar/components/workspaces/SpecialWorkspaces.qml index a825c1e5..7f43e3a7 100644 --- a/modules/bar/components/workspaces/SpecialWorkspaces.qml +++ b/modules/bar/components/workspaces/SpecialWorkspaces.qml @@ -4,10 +4,10 @@ import QtQuick import QtQuick.Layouts import Quickshell import Quickshell.Hyprland +import Caelestia.Config import qs.components import qs.components.effects import qs.services -import Caelestia.Config import qs.utils Item { diff --git a/modules/bar/components/workspaces/Workspace.qml b/modules/bar/components/workspaces/Workspace.qml index e57f6f5e..39c55ec6 100644 --- a/modules/bar/components/workspaces/Workspace.qml +++ b/modules/bar/components/workspaces/Workspace.qml @@ -3,9 +3,9 @@ pragma ComponentBehavior: Bound import QtQuick import QtQuick.Layouts import Quickshell +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config import qs.utils ColumnLayout { diff --git a/modules/bar/components/workspaces/Workspaces.qml b/modules/bar/components/workspaces/Workspaces.qml index ae43f974..e7f617c6 100644 --- a/modules/bar/components/workspaces/Workspaces.qml +++ b/modules/bar/components/workspaces/Workspaces.qml @@ -4,9 +4,9 @@ import QtQuick import QtQuick.Effects import QtQuick.Layouts import Quickshell +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config StyledClippingRect { id: root diff --git a/modules/bar/popouts/ActiveWindow.qml b/modules/bar/popouts/ActiveWindow.qml index e0ef85d9..59aabce1 100644 --- a/modules/bar/popouts/ActiveWindow.qml +++ b/modules/bar/popouts/ActiveWindow.qml @@ -2,9 +2,9 @@ import QtQuick import QtQuick.Layouts import Quickshell.Wayland import Quickshell.Widgets +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config import qs.utils Item { diff --git a/modules/bar/popouts/Audio.qml b/modules/bar/popouts/Audio.qml index 50bf1915..e8dc9203 100644 --- a/modules/bar/popouts/Audio.qml +++ b/modules/bar/popouts/Audio.qml @@ -4,10 +4,10 @@ import QtQuick import QtQuick.Controls import QtQuick.Layouts import Quickshell.Services.Pipewire +import Caelestia.Config import qs.components import qs.components.controls import qs.services -import Caelestia.Config Item { id: root diff --git a/modules/bar/popouts/Battery.qml b/modules/bar/popouts/Battery.qml index cbcdc715..fdfb1089 100644 --- a/modules/bar/popouts/Battery.qml +++ b/modules/bar/popouts/Battery.qml @@ -2,9 +2,9 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell.Services.UPower +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config Column { id: root diff --git a/modules/bar/popouts/Bluetooth.qml b/modules/bar/popouts/Bluetooth.qml index d5cc0f61..931ad222 100644 --- a/modules/bar/popouts/Bluetooth.qml +++ b/modules/bar/popouts/Bluetooth.qml @@ -4,10 +4,10 @@ import QtQuick import QtQuick.Layouts import Quickshell import Quickshell.Bluetooth +import Caelestia.Config import qs.components import qs.components.controls import qs.services -import Caelestia.Config import qs.utils ColumnLayout { diff --git a/modules/bar/popouts/ClipWrapper.qml b/modules/bar/popouts/ClipWrapper.qml index 68c301a8..30fd4aaa 100644 --- a/modules/bar/popouts/ClipWrapper.qml +++ b/modules/bar/popouts/ClipWrapper.qml @@ -2,8 +2,8 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell -import qs.components import Caelestia.Config +import qs.components import qs.modules.bar.popouts // Need to import this module so the Wrapper type is the same as others Item { diff --git a/modules/bar/popouts/Content.qml b/modules/bar/popouts/Content.qml index 381d3ef0..8b5d0db5 100644 --- a/modules/bar/popouts/Content.qml +++ b/modules/bar/popouts/Content.qml @@ -4,8 +4,8 @@ import "./kblayout" import QtQuick import Quickshell import Quickshell.Services.SystemTray -import qs.components import Caelestia.Config +import qs.components Item { id: root diff --git a/modules/bar/popouts/LockStatus.qml b/modules/bar/popouts/LockStatus.qml index 4d646a0c..caab7487 100644 --- a/modules/bar/popouts/LockStatus.qml +++ b/modules/bar/popouts/LockStatus.qml @@ -1,7 +1,7 @@ import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config ColumnLayout { spacing: Tokens.spacing.small diff --git a/modules/bar/popouts/Network.qml b/modules/bar/popouts/Network.qml index cec936d9..956d4bac 100644 --- a/modules/bar/popouts/Network.qml +++ b/modules/bar/popouts/Network.qml @@ -3,10 +3,10 @@ pragma ComponentBehavior: Bound import QtQuick import QtQuick.Layouts import Quickshell +import Caelestia.Config import qs.components import qs.components.controls import qs.services -import Caelestia.Config import qs.utils ColumnLayout { diff --git a/modules/bar/popouts/TrayMenu.qml b/modules/bar/popouts/TrayMenu.qml index 9576049b..9dfcb4a7 100644 --- a/modules/bar/popouts/TrayMenu.qml +++ b/modules/bar/popouts/TrayMenu.qml @@ -4,9 +4,9 @@ import QtQuick import QtQuick.Controls import Quickshell import Quickshell.Widgets +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config StackView { id: root diff --git a/modules/bar/popouts/WirelessPassword.qml b/modules/bar/popouts/WirelessPassword.qml index f1a79366..0c3bae70 100644 --- a/modules/bar/popouts/WirelessPassword.qml +++ b/modules/bar/popouts/WirelessPassword.qml @@ -3,10 +3,10 @@ pragma ComponentBehavior: Bound import QtQuick import QtQuick.Layouts import Quickshell +import Caelestia.Config import qs.components import qs.components.controls import qs.services -import Caelestia.Config import qs.utils ColumnLayout { diff --git a/modules/bar/popouts/Wrapper.qml b/modules/bar/popouts/Wrapper.qml index d99ffdab..48fe05f8 100644 --- a/modules/bar/popouts/Wrapper.qml +++ b/modules/bar/popouts/Wrapper.qml @@ -4,9 +4,9 @@ import QtQuick import Quickshell import Quickshell.Hyprland import Quickshell.Wayland +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config import qs.modules.controlcenter import qs.modules.windowinfo diff --git a/modules/bar/popouts/kblayout/KbLayout.qml b/modules/bar/popouts/kblayout/KbLayout.qml index 265d3ab8..2d6f9412 100644 --- a/modules/bar/popouts/kblayout/KbLayout.qml +++ b/modules/bar/popouts/kblayout/KbLayout.qml @@ -3,9 +3,9 @@ pragma ComponentBehavior: Bound import QtQuick import QtQuick.Controls import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config ColumnLayout { id: root diff --git a/modules/controlcenter/ControlCenter.qml b/modules/controlcenter/ControlCenter.qml index b2c07e52..9bf097f7 100644 --- a/modules/controlcenter/ControlCenter.qml +++ b/modules/controlcenter/ControlCenter.qml @@ -3,10 +3,10 @@ pragma ComponentBehavior: Bound import QtQuick import QtQuick.Layouts import Quickshell +import Caelestia.Config import qs.components import qs.components.controls import qs.services -import Caelestia.Config Item { id: root diff --git a/modules/controlcenter/NavRail.qml b/modules/controlcenter/NavRail.qml index fe80493a..5a0ba37b 100644 --- a/modules/controlcenter/NavRail.qml +++ b/modules/controlcenter/NavRail.qml @@ -3,9 +3,9 @@ pragma ComponentBehavior: Bound import QtQuick import QtQuick.Layouts import Quickshell +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config import qs.modules.controlcenter Item { diff --git a/modules/controlcenter/Panes.qml b/modules/controlcenter/Panes.qml index c8718528..c3a8e21b 100644 --- a/modules/controlcenter/Panes.qml +++ b/modules/controlcenter/Panes.qml @@ -11,9 +11,9 @@ import "dashboard" import QtQuick import QtQuick.Layouts import Quickshell.Widgets +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config import qs.modules.controlcenter ClippingRectangle { diff --git a/modules/controlcenter/WindowTitle.qml b/modules/controlcenter/WindowTitle.qml index 1993446f..70ea22ea 100644 --- a/modules/controlcenter/WindowTitle.qml +++ b/modules/controlcenter/WindowTitle.qml @@ -1,8 +1,8 @@ import QtQuick import Quickshell +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config StyledRect { id: root diff --git a/modules/controlcenter/appearance/AppearancePane.qml b/modules/controlcenter/appearance/AppearancePane.qml index 472c654a..1c787f36 100644 --- a/modules/controlcenter/appearance/AppearancePane.qml +++ b/modules/controlcenter/appearance/AppearancePane.qml @@ -8,6 +8,7 @@ import QtQuick import QtQuick.Layouts import Quickshell import Quickshell.Widgets +import Caelestia.Config import Caelestia.Models import qs.components import qs.components.containers @@ -15,7 +16,6 @@ import qs.components.controls import qs.components.effects import qs.components.images import qs.services -import Caelestia.Config import qs.utils Item { diff --git a/modules/controlcenter/appearance/sections/AnimationsSection.qml b/modules/controlcenter/appearance/sections/AnimationsSection.qml index e5e973e2..412441ab 100644 --- a/modules/controlcenter/appearance/sections/AnimationsSection.qml +++ b/modules/controlcenter/appearance/sections/AnimationsSection.qml @@ -4,11 +4,11 @@ import ".." import "../../components" import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.services -import Caelestia.Config CollapsibleSection { id: root diff --git a/modules/controlcenter/appearance/sections/BackgroundSection.qml b/modules/controlcenter/appearance/sections/BackgroundSection.qml index 95670d24..3f31f10b 100644 --- a/modules/controlcenter/appearance/sections/BackgroundSection.qml +++ b/modules/controlcenter/appearance/sections/BackgroundSection.qml @@ -4,11 +4,11 @@ import ".." import "../../components" import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.services -import Caelestia.Config CollapsibleSection { id: root diff --git a/modules/controlcenter/appearance/sections/BorderSection.qml b/modules/controlcenter/appearance/sections/BorderSection.qml index e92a28da..7dbd2dbe 100644 --- a/modules/controlcenter/appearance/sections/BorderSection.qml +++ b/modules/controlcenter/appearance/sections/BorderSection.qml @@ -4,11 +4,11 @@ import ".." import "../../components" import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.services -import Caelestia.Config CollapsibleSection { id: root diff --git a/modules/controlcenter/appearance/sections/ColorSchemeSection.qml b/modules/controlcenter/appearance/sections/ColorSchemeSection.qml index 69dff698..90eaeb25 100644 --- a/modules/controlcenter/appearance/sections/ColorSchemeSection.qml +++ b/modules/controlcenter/appearance/sections/ColorSchemeSection.qml @@ -5,11 +5,11 @@ import "../../../launcher/services" import QtQuick import QtQuick.Layouts import Quickshell +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.services -import Caelestia.Config CollapsibleSection { title: qsTr("Color scheme") diff --git a/modules/controlcenter/appearance/sections/ColorVariantSection.qml b/modules/controlcenter/appearance/sections/ColorVariantSection.qml index 8fbd80d9..a5de4ad8 100644 --- a/modules/controlcenter/appearance/sections/ColorVariantSection.qml +++ b/modules/controlcenter/appearance/sections/ColorVariantSection.qml @@ -5,11 +5,11 @@ import "../../../launcher/services" import QtQuick import QtQuick.Layouts import Quickshell +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.services -import Caelestia.Config CollapsibleSection { title: qsTr("Color variant") diff --git a/modules/controlcenter/appearance/sections/FontsSection.qml b/modules/controlcenter/appearance/sections/FontsSection.qml index 562ea8d5..1791fc69 100644 --- a/modules/controlcenter/appearance/sections/FontsSection.qml +++ b/modules/controlcenter/appearance/sections/FontsSection.qml @@ -4,11 +4,11 @@ import ".." import "../../components" import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.services -import Caelestia.Config CollapsibleSection { id: root diff --git a/modules/controlcenter/appearance/sections/ScalesSection.qml b/modules/controlcenter/appearance/sections/ScalesSection.qml index 8113f28c..dac6226e 100644 --- a/modules/controlcenter/appearance/sections/ScalesSection.qml +++ b/modules/controlcenter/appearance/sections/ScalesSection.qml @@ -4,11 +4,11 @@ import ".." import "../../components" import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.services -import Caelestia.Config CollapsibleSection { id: root diff --git a/modules/controlcenter/appearance/sections/ThemeModeSection.qml b/modules/controlcenter/appearance/sections/ThemeModeSection.qml index 8857da56..aab53b8b 100644 --- a/modules/controlcenter/appearance/sections/ThemeModeSection.qml +++ b/modules/controlcenter/appearance/sections/ThemeModeSection.qml @@ -2,11 +2,11 @@ pragma ComponentBehavior: Bound import ".." import QtQuick +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.services -import Caelestia.Config CollapsibleSection { title: qsTr("Theme mode") diff --git a/modules/controlcenter/appearance/sections/TransparencySection.qml b/modules/controlcenter/appearance/sections/TransparencySection.qml index 2dc91b65..f2f15ba1 100644 --- a/modules/controlcenter/appearance/sections/TransparencySection.qml +++ b/modules/controlcenter/appearance/sections/TransparencySection.qml @@ -4,11 +4,11 @@ import ".." import "../../components" import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.services -import Caelestia.Config CollapsibleSection { id: root diff --git a/modules/controlcenter/audio/AudioPane.qml b/modules/controlcenter/audio/AudioPane.qml index 13885656..a1da681e 100644 --- a/modules/controlcenter/audio/AudioPane.qml +++ b/modules/controlcenter/audio/AudioPane.qml @@ -5,12 +5,12 @@ import "../components" import QtQuick import QtQuick.Layouts import Quickshell.Widgets +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import Caelestia.Config Item { id: root diff --git a/modules/controlcenter/bluetooth/BtPane.qml b/modules/controlcenter/bluetooth/BtPane.qml index d5794254..b2b9c0f6 100644 --- a/modules/controlcenter/bluetooth/BtPane.qml +++ b/modules/controlcenter/bluetooth/BtPane.qml @@ -6,10 +6,10 @@ import "." import QtQuick import Quickshell.Bluetooth import Quickshell.Widgets +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls -import Caelestia.Config SplitPaneWithDetails { id: root diff --git a/modules/controlcenter/bluetooth/Details.qml b/modules/controlcenter/bluetooth/Details.qml index 42ceace2..a398c34d 100644 --- a/modules/controlcenter/bluetooth/Details.qml +++ b/modules/controlcenter/bluetooth/Details.qml @@ -5,12 +5,12 @@ import "../components" import QtQuick import QtQuick.Layouts import Quickshell.Bluetooth +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import Caelestia.Config import qs.utils StyledFlickable { diff --git a/modules/controlcenter/bluetooth/DeviceList.qml b/modules/controlcenter/bluetooth/DeviceList.qml index ca76c8c1..9833eacd 100644 --- a/modules/controlcenter/bluetooth/DeviceList.qml +++ b/modules/controlcenter/bluetooth/DeviceList.qml @@ -6,11 +6,11 @@ import QtQuick import QtQuick.Layouts import Quickshell import Quickshell.Bluetooth +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.services -import Caelestia.Config import qs.utils DeviceList { diff --git a/modules/controlcenter/bluetooth/Settings.qml b/modules/controlcenter/bluetooth/Settings.qml index 2588a28c..d5c9a28a 100644 --- a/modules/controlcenter/bluetooth/Settings.qml +++ b/modules/controlcenter/bluetooth/Settings.qml @@ -5,11 +5,11 @@ import "../components" import QtQuick import QtQuick.Layouts import Quickshell.Bluetooth +import Caelestia.Config import qs.components import qs.components.controls import qs.components.effects import qs.services -import Caelestia.Config ColumnLayout { id: root diff --git a/modules/controlcenter/components/ConnectedButtonGroup.qml b/modules/controlcenter/components/ConnectedButtonGroup.qml index b4ddfc22..90f9614a 100644 --- a/modules/controlcenter/components/ConnectedButtonGroup.qml +++ b/modules/controlcenter/components/ConnectedButtonGroup.qml @@ -1,11 +1,11 @@ import ".." import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.controls import qs.components.effects import qs.services -import Caelestia.Config StyledRect { id: root diff --git a/modules/controlcenter/components/DeviceDetails.qml b/modules/controlcenter/components/DeviceDetails.qml index 5fc4d0ed..075024f6 100644 --- a/modules/controlcenter/components/DeviceDetails.qml +++ b/modules/controlcenter/components/DeviceDetails.qml @@ -3,11 +3,11 @@ pragma ComponentBehavior: Bound import ".." import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.components.effects -import Caelestia.Config Item { id: root diff --git a/modules/controlcenter/components/DeviceList.qml b/modules/controlcenter/components/DeviceList.qml index 8a65fc0c..f02cc3c0 100644 --- a/modules/controlcenter/components/DeviceList.qml +++ b/modules/controlcenter/components/DeviceList.qml @@ -4,11 +4,11 @@ import ".." import QtQuick import QtQuick.Layouts import Quickshell +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.services -import Caelestia.Config ColumnLayout { id: root diff --git a/modules/controlcenter/components/ReadonlySlider.qml b/modules/controlcenter/components/ReadonlySlider.qml index e1bff137..8cd493f4 100644 --- a/modules/controlcenter/components/ReadonlySlider.qml +++ b/modules/controlcenter/components/ReadonlySlider.qml @@ -2,10 +2,10 @@ import ".." import "../components" import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.controls import qs.services -import Caelestia.Config ColumnLayout { id: root diff --git a/modules/controlcenter/components/SettingsHeader.qml b/modules/controlcenter/components/SettingsHeader.qml index 425a9e8e..c6ccbb67 100644 --- a/modules/controlcenter/components/SettingsHeader.qml +++ b/modules/controlcenter/components/SettingsHeader.qml @@ -2,8 +2,8 @@ pragma ComponentBehavior: Bound import QtQuick import QtQuick.Layouts -import qs.components import Caelestia.Config +import qs.components Item { id: root diff --git a/modules/controlcenter/components/SliderInput.qml b/modules/controlcenter/components/SliderInput.qml index 1c1f29be..73fd00ae 100644 --- a/modules/controlcenter/components/SliderInput.qml +++ b/modules/controlcenter/components/SliderInput.qml @@ -2,11 +2,11 @@ pragma ComponentBehavior: Bound import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.controls import qs.components.effects import qs.services -import Caelestia.Config ColumnLayout { id: root diff --git a/modules/controlcenter/components/SplitPaneLayout.qml b/modules/controlcenter/components/SplitPaneLayout.qml index cff20ec7..64c7c9fc 100644 --- a/modules/controlcenter/components/SplitPaneLayout.qml +++ b/modules/controlcenter/components/SplitPaneLayout.qml @@ -3,9 +3,9 @@ pragma ComponentBehavior: Bound import QtQuick import QtQuick.Layouts import Quickshell.Widgets +import Caelestia.Config import qs.components import qs.components.effects -import Caelestia.Config RowLayout { id: root diff --git a/modules/controlcenter/components/SplitPaneWithDetails.qml b/modules/controlcenter/components/SplitPaneWithDetails.qml index dcc472d9..ad1c444d 100644 --- a/modules/controlcenter/components/SplitPaneWithDetails.qml +++ b/modules/controlcenter/components/SplitPaneWithDetails.qml @@ -4,10 +4,10 @@ import ".." import QtQuick import QtQuick.Layouts import Quickshell.Widgets +import Caelestia.Config import qs.components import qs.components.containers import qs.components.effects -import Caelestia.Config Item { id: root diff --git a/modules/controlcenter/components/WallpaperGrid.qml b/modules/controlcenter/components/WallpaperGrid.qml index b85ec556..efab9145 100644 --- a/modules/controlcenter/components/WallpaperGrid.qml +++ b/modules/controlcenter/components/WallpaperGrid.qml @@ -2,13 +2,13 @@ pragma ComponentBehavior: Bound import ".." import QtQuick +import Caelestia.Config import Caelestia.Models import qs.components import qs.components.controls import qs.components.effects import qs.components.images import qs.services -import Caelestia.Config GridView { id: root diff --git a/modules/controlcenter/dashboard/DashboardPane.qml b/modules/controlcenter/dashboard/DashboardPane.qml index d2e95801..83bc1e16 100644 --- a/modules/controlcenter/dashboard/DashboardPane.qml +++ b/modules/controlcenter/dashboard/DashboardPane.qml @@ -6,12 +6,12 @@ import QtQuick import QtQuick.Layouts import Quickshell import Quickshell.Widgets +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import Caelestia.Config import qs.utils Item { diff --git a/modules/controlcenter/dashboard/GeneralSection.qml b/modules/controlcenter/dashboard/GeneralSection.qml index 6294a05d..be67eab2 100644 --- a/modules/controlcenter/dashboard/GeneralSection.qml +++ b/modules/controlcenter/dashboard/GeneralSection.qml @@ -2,10 +2,10 @@ import ".." import "../components" import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.controls import qs.services -import Caelestia.Config SectionContainer { id: root diff --git a/modules/controlcenter/dashboard/PerformanceSection.qml b/modules/controlcenter/dashboard/PerformanceSection.qml index 1a0b6482..ea6c68b3 100644 --- a/modules/controlcenter/dashboard/PerformanceSection.qml +++ b/modules/controlcenter/dashboard/PerformanceSection.qml @@ -3,10 +3,10 @@ import "../components" import QtQuick import QtQuick.Layouts import Quickshell.Services.UPower +import Caelestia.Config import qs.components import qs.components.controls import qs.services -import Caelestia.Config SectionContainer { id: root diff --git a/modules/controlcenter/launcher/LauncherPane.qml b/modules/controlcenter/launcher/LauncherPane.qml index 51989c63..83c2232b 100644 --- a/modules/controlcenter/launcher/LauncherPane.qml +++ b/modules/controlcenter/launcher/LauncherPane.qml @@ -9,12 +9,12 @@ import QtQuick.Layouts import Quickshell import Quickshell.Widgets import Caelestia +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import Caelestia.Config import qs.utils Item { diff --git a/modules/controlcenter/launcher/Settings.qml b/modules/controlcenter/launcher/Settings.qml index ec29aeb2..61bab0c1 100644 --- a/modules/controlcenter/launcher/Settings.qml +++ b/modules/controlcenter/launcher/Settings.qml @@ -4,11 +4,11 @@ import ".." import "../components" import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.controls import qs.components.effects import qs.services -import Caelestia.Config ColumnLayout { id: root diff --git a/modules/controlcenter/network/EthernetDetails.qml b/modules/controlcenter/network/EthernetDetails.qml index e6128a31..1daeb4a2 100644 --- a/modules/controlcenter/network/EthernetDetails.qml +++ b/modules/controlcenter/network/EthernetDetails.qml @@ -4,12 +4,12 @@ import ".." import "../components" import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import Caelestia.Config DeviceDetails { id: root diff --git a/modules/controlcenter/network/EthernetList.qml b/modules/controlcenter/network/EthernetList.qml index 44048265..595233c5 100644 --- a/modules/controlcenter/network/EthernetList.qml +++ b/modules/controlcenter/network/EthernetList.qml @@ -4,11 +4,11 @@ import ".." import "../components" import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.services -import Caelestia.Config DeviceList { id: root diff --git a/modules/controlcenter/network/EthernetPane.qml b/modules/controlcenter/network/EthernetPane.qml index a2699c78..d66620f1 100644 --- a/modules/controlcenter/network/EthernetPane.qml +++ b/modules/controlcenter/network/EthernetPane.qml @@ -4,9 +4,9 @@ import ".." import "../components" import QtQuick import Quickshell.Widgets +import Caelestia.Config import qs.components import qs.components.containers -import Caelestia.Config SplitPaneWithDetails { id: root diff --git a/modules/controlcenter/network/EthernetSettings.qml b/modules/controlcenter/network/EthernetSettings.qml index 7a37316c..f13b6fca 100644 --- a/modules/controlcenter/network/EthernetSettings.qml +++ b/modules/controlcenter/network/EthernetSettings.qml @@ -4,11 +4,11 @@ import ".." import "../components" import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.controls import qs.components.effects import qs.services -import Caelestia.Config ColumnLayout { id: root diff --git a/modules/controlcenter/network/NetworkSettings.qml b/modules/controlcenter/network/NetworkSettings.qml index 6a1bc6df..22d85188 100644 --- a/modules/controlcenter/network/NetworkSettings.qml +++ b/modules/controlcenter/network/NetworkSettings.qml @@ -5,12 +5,12 @@ import "../components" import QtQuick import QtQuick.Controls import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import Caelestia.Config ColumnLayout { id: root diff --git a/modules/controlcenter/network/NetworkingPane.qml b/modules/controlcenter/network/NetworkingPane.qml index 2829a114..e02bfafb 100644 --- a/modules/controlcenter/network/NetworkingPane.qml +++ b/modules/controlcenter/network/NetworkingPane.qml @@ -7,12 +7,12 @@ import QtQuick import QtQuick.Layouts import Quickshell import Quickshell.Widgets +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import Caelestia.Config import qs.utils Item { diff --git a/modules/controlcenter/network/VpnDetails.qml b/modules/controlcenter/network/VpnDetails.qml index 9906ef37..3ea85d32 100644 --- a/modules/controlcenter/network/VpnDetails.qml +++ b/modules/controlcenter/network/VpnDetails.qml @@ -5,12 +5,12 @@ import "../components" import QtQuick import QtQuick.Controls import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import Caelestia.Config import qs.utils DeviceDetails { diff --git a/modules/controlcenter/network/VpnList.qml b/modules/controlcenter/network/VpnList.qml index 05054876..e0376fc6 100644 --- a/modules/controlcenter/network/VpnList.qml +++ b/modules/controlcenter/network/VpnList.qml @@ -5,11 +5,11 @@ import QtQuick import QtQuick.Controls import QtQuick.Layouts import Quickshell +import Caelestia.Config import qs.components import qs.components.controls import qs.components.effects import qs.services -import Caelestia.Config ColumnLayout { id: root diff --git a/modules/controlcenter/network/VpnSettings.qml b/modules/controlcenter/network/VpnSettings.qml index d8dd09d1..e0f0e7f5 100644 --- a/modules/controlcenter/network/VpnSettings.qml +++ b/modules/controlcenter/network/VpnSettings.qml @@ -6,12 +6,12 @@ import QtQuick import QtQuick.Controls import QtQuick.Layouts import Quickshell +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import Caelestia.Config ColumnLayout { id: root diff --git a/modules/controlcenter/network/WirelessDetails.qml b/modules/controlcenter/network/WirelessDetails.qml index b6d7e77e..e39744ca 100644 --- a/modules/controlcenter/network/WirelessDetails.qml +++ b/modules/controlcenter/network/WirelessDetails.qml @@ -5,12 +5,12 @@ import "../components" import "." import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import Caelestia.Config import qs.utils DeviceDetails { diff --git a/modules/controlcenter/network/WirelessList.qml b/modules/controlcenter/network/WirelessList.qml index 878986d1..9eefb172 100644 --- a/modules/controlcenter/network/WirelessList.qml +++ b/modules/controlcenter/network/WirelessList.qml @@ -6,12 +6,12 @@ import "." import QtQuick import QtQuick.Layouts import Quickshell +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import Caelestia.Config import qs.utils DeviceList { diff --git a/modules/controlcenter/network/WirelessPane.qml b/modules/controlcenter/network/WirelessPane.qml index 02af096d..43689176 100644 --- a/modules/controlcenter/network/WirelessPane.qml +++ b/modules/controlcenter/network/WirelessPane.qml @@ -4,9 +4,9 @@ import ".." import "../components" import QtQuick import Quickshell.Widgets +import Caelestia.Config import qs.components import qs.components.containers -import Caelestia.Config SplitPaneWithDetails { id: root diff --git a/modules/controlcenter/network/WirelessPasswordDialog.qml b/modules/controlcenter/network/WirelessPasswordDialog.qml index 4222ddf4..f5b3afa9 100644 --- a/modules/controlcenter/network/WirelessPasswordDialog.qml +++ b/modules/controlcenter/network/WirelessPasswordDialog.qml @@ -5,12 +5,12 @@ import "." import QtQuick import QtQuick.Layouts import Quickshell +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import Caelestia.Config import qs.utils Item { diff --git a/modules/controlcenter/network/WirelessSettings.qml b/modules/controlcenter/network/WirelessSettings.qml index bce381ba..f3f1fd4b 100644 --- a/modules/controlcenter/network/WirelessSettings.qml +++ b/modules/controlcenter/network/WirelessSettings.qml @@ -4,11 +4,11 @@ import ".." import "../components" import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.controls import qs.components.effects import qs.services -import Caelestia.Config ColumnLayout { id: root diff --git a/modules/controlcenter/notifications/NotificationsPane.qml b/modules/controlcenter/notifications/NotificationsPane.qml index 5768e478..919a2549 100644 --- a/modules/controlcenter/notifications/NotificationsPane.qml +++ b/modules/controlcenter/notifications/NotificationsPane.qml @@ -6,12 +6,12 @@ import QtQuick import QtQuick.Layouts import Quickshell import Quickshell.Widgets +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import Caelestia.Config Item { id: root diff --git a/modules/controlcenter/taskbar/TaskbarPane.qml b/modules/controlcenter/taskbar/TaskbarPane.qml index 7ec57775..5715b8e2 100644 --- a/modules/controlcenter/taskbar/TaskbarPane.qml +++ b/modules/controlcenter/taskbar/TaskbarPane.qml @@ -6,12 +6,12 @@ import QtQuick import QtQuick.Layouts import Quickshell import Quickshell.Widgets +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import Caelestia.Config import qs.utils Item { diff --git a/modules/dashboard/Content.qml b/modules/dashboard/Content.qml index 6fc7faea..771d4bb4 100644 --- a/modules/dashboard/Content.qml +++ b/modules/dashboard/Content.qml @@ -4,9 +4,9 @@ import QtQuick import QtQuick.Layouts import Quickshell import Quickshell.Widgets +import Caelestia.Config import qs.components import qs.components.filedialog -import Caelestia.Config Item { id: root diff --git a/modules/dashboard/Dash.qml b/modules/dashboard/Dash.qml index cc6c5171..6785ede8 100644 --- a/modules/dashboard/Dash.qml +++ b/modules/dashboard/Dash.qml @@ -1,9 +1,9 @@ import "dash" import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.filedialog import qs.services -import Caelestia.Config GridLayout { id: root diff --git a/modules/dashboard/LyricMenu.qml b/modules/dashboard/LyricMenu.qml index b311ff7c..1e5461f5 100644 --- a/modules/dashboard/LyricMenu.qml +++ b/modules/dashboard/LyricMenu.qml @@ -2,10 +2,10 @@ pragma ComponentBehavior: Bound import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.controls import qs.services -import Caelestia.Config StyledRect { id: root diff --git a/modules/dashboard/LyricsView.qml b/modules/dashboard/LyricsView.qml index b0ef99a3..6ccbd26e 100644 --- a/modules/dashboard/LyricsView.qml +++ b/modules/dashboard/LyricsView.qml @@ -1,10 +1,10 @@ import QtQuick import QtQuick.Effects import Quickshell +import Caelestia.Config import qs.components import qs.components.containers import qs.services -import Caelestia.Config StyledListView { id: root diff --git a/modules/dashboard/Media.qml b/modules/dashboard/Media.qml index 3cc17d57..e4638843 100644 --- a/modules/dashboard/Media.qml +++ b/modules/dashboard/Media.qml @@ -5,11 +5,11 @@ import QtQuick.Layouts import QtQuick.Shapes import Quickshell import Quickshell.Services.Mpris +import Caelestia.Config import Caelestia.Services import qs.components import qs.components.controls import qs.services -import Caelestia.Config import qs.utils Item { diff --git a/modules/dashboard/Performance.qml b/modules/dashboard/Performance.qml index 13ab57a7..0c405fd3 100644 --- a/modules/dashboard/Performance.qml +++ b/modules/dashboard/Performance.qml @@ -2,11 +2,11 @@ import QtQuick import QtQuick.Controls import QtQuick.Layouts import Quickshell.Services.UPower +import Caelestia.Config import Caelestia.Internal import qs.components import qs.components.misc import qs.services -import Caelestia.Config Item { id: root diff --git a/modules/dashboard/Tabs.qml b/modules/dashboard/Tabs.qml index 54e80c7a..fc5d7ec1 100644 --- a/modules/dashboard/Tabs.qml +++ b/modules/dashboard/Tabs.qml @@ -4,10 +4,10 @@ import QtQuick import QtQuick.Controls import Quickshell import Quickshell.Widgets +import Caelestia.Config import qs.components import qs.components.controls import qs.services -import Caelestia.Config Item { id: root diff --git a/modules/dashboard/WeatherTab.qml b/modules/dashboard/WeatherTab.qml index 78be9ad7..312372b2 100644 --- a/modules/dashboard/WeatherTab.qml +++ b/modules/dashboard/WeatherTab.qml @@ -1,8 +1,8 @@ import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config Item { id: root diff --git a/modules/dashboard/Wrapper.qml b/modules/dashboard/Wrapper.qml index 7a810dc0..dd097e7b 100644 --- a/modules/dashboard/Wrapper.qml +++ b/modules/dashboard/Wrapper.qml @@ -3,9 +3,9 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell import Caelestia +import Caelestia.Config import qs.components import qs.components.filedialog -import Caelestia.Config import qs.utils Item { diff --git a/modules/dashboard/dash/Calendar.qml b/modules/dashboard/dash/Calendar.qml index 38d2d563..990e380d 100644 --- a/modules/dashboard/dash/Calendar.qml +++ b/modules/dashboard/dash/Calendar.qml @@ -3,11 +3,11 @@ pragma ComponentBehavior: Bound import QtQuick import QtQuick.Controls import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.controls import qs.components.effects import qs.services -import Caelestia.Config CustomMouseArea { id: root diff --git a/modules/dashboard/dash/DateTime.qml b/modules/dashboard/dash/DateTime.qml index 2df22d15..248d41f3 100644 --- a/modules/dashboard/dash/DateTime.qml +++ b/modules/dashboard/dash/DateTime.qml @@ -2,9 +2,9 @@ pragma ComponentBehavior: Bound import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config Item { id: root diff --git a/modules/dashboard/dash/Media.qml b/modules/dashboard/dash/Media.qml index 0788d380..2dd8a4af 100644 --- a/modules/dashboard/dash/Media.qml +++ b/modules/dashboard/dash/Media.qml @@ -1,9 +1,9 @@ import QtQuick import QtQuick.Shapes +import Caelestia.Config import Caelestia.Services import qs.components import qs.services -import Caelestia.Config import qs.utils Item { diff --git a/modules/dashboard/dash/Resources.qml b/modules/dashboard/dash/Resources.qml index 17d0f4a2..df560369 100644 --- a/modules/dashboard/dash/Resources.qml +++ b/modules/dashboard/dash/Resources.qml @@ -1,8 +1,8 @@ import QtQuick +import Caelestia.Config import qs.components import qs.components.misc import qs.services -import Caelestia.Config Row { id: root diff --git a/modules/dashboard/dash/SmallWeather.qml b/modules/dashboard/dash/SmallWeather.qml index dbc5ac3e..998c7125 100644 --- a/modules/dashboard/dash/SmallWeather.qml +++ b/modules/dashboard/dash/SmallWeather.qml @@ -1,7 +1,7 @@ import QtQuick +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config Item { id: root diff --git a/modules/dashboard/dash/User.qml b/modules/dashboard/dash/User.qml index 83ddcb2e..791297ff 100644 --- a/modules/dashboard/dash/User.qml +++ b/modules/dashboard/dash/User.qml @@ -1,10 +1,10 @@ import QtQuick +import Caelestia.Config import qs.components import qs.components.effects import qs.components.filedialog import qs.components.images import qs.services -import Caelestia.Config import qs.utils Row { diff --git a/modules/drawers/ContentWindow.qml b/modules/drawers/ContentWindow.qml index 8d665477..2842a33f 100644 --- a/modules/drawers/ContentWindow.qml +++ b/modules/drawers/ContentWindow.qml @@ -7,10 +7,10 @@ import Quickshell import Quickshell.Hyprland import Quickshell.Wayland import Caelestia.Blobs +import Caelestia.Config import qs.components import qs.components.containers import qs.services -import Caelestia.Config import qs.modules.bar StyledWindow { diff --git a/modules/drawers/Drawers.qml b/modules/drawers/Drawers.qml index a55e42d0..d2cd05f9 100644 --- a/modules/drawers/Drawers.qml +++ b/modules/drawers/Drawers.qml @@ -2,8 +2,8 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell -import qs.services import Caelestia.Config +import qs.services Variants { model: Screens.screens diff --git a/modules/drawers/Interactions.qml b/modules/drawers/Interactions.qml index fc782ddb..bef8f4b8 100644 --- a/modules/drawers/Interactions.qml +++ b/modules/drawers/Interactions.qml @@ -1,9 +1,9 @@ import QtQuick import QtQuick.Controls import Quickshell +import Caelestia.Config import qs.components import qs.components.controls -import Caelestia.Config import qs.modules.bar as Bar import qs.modules.bar.popouts as BarPopouts diff --git a/modules/drawers/Panels.qml b/modules/drawers/Panels.qml index 83f30499..52e20d26 100644 --- a/modules/drawers/Panels.qml +++ b/modules/drawers/Panels.qml @@ -1,7 +1,7 @@ import QtQuick import Quickshell -import qs.components import Caelestia.Config +import qs.components import qs.modules.bar as Bar import qs.modules.dashboard as Dashboard import qs.modules.launcher as Launcher diff --git a/modules/launcher/AppList.qml b/modules/launcher/AppList.qml index dc3ee16c..52b9b1b5 100644 --- a/modules/launcher/AppList.qml +++ b/modules/launcher/AppList.qml @@ -2,11 +2,11 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.services -import Caelestia.Config import qs.modules.launcher.items import qs.modules.launcher.services diff --git a/modules/launcher/Content.qml b/modules/launcher/Content.qml index 49178db7..2ca41739 100644 --- a/modules/launcher/Content.qml +++ b/modules/launcher/Content.qml @@ -1,10 +1,10 @@ pragma ComponentBehavior: Bound import QtQuick +import Caelestia.Config import qs.components import qs.components.controls import qs.services -import Caelestia.Config import qs.modules.launcher.services Item { diff --git a/modules/launcher/ContentList.qml b/modules/launcher/ContentList.qml index ac10fd4d..e36c0d32 100644 --- a/modules/launcher/ContentList.qml +++ b/modules/launcher/ContentList.qml @@ -1,10 +1,10 @@ pragma ComponentBehavior: Bound import QtQuick +import Caelestia.Config import qs.components import qs.components.controls import qs.services -import Caelestia.Config import qs.utils Item { diff --git a/modules/launcher/WallpaperList.qml b/modules/launcher/WallpaperList.qml index 705563a8..3663f4bc 100644 --- a/modules/launcher/WallpaperList.qml +++ b/modules/launcher/WallpaperList.qml @@ -3,9 +3,9 @@ pragma ComponentBehavior: Bound import "items" import QtQuick import Quickshell +import Caelestia.Config import qs.components.controls import qs.services -import Caelestia.Config PathView { id: root diff --git a/modules/launcher/Wrapper.qml b/modules/launcher/Wrapper.qml index b0b8753b..e6cc8114 100644 --- a/modules/launcher/Wrapper.qml +++ b/modules/launcher/Wrapper.qml @@ -2,8 +2,8 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell -import qs.components import Caelestia.Config +import qs.components import qs.modules.launcher.services Item { diff --git a/modules/launcher/items/ActionItem.qml b/modules/launcher/items/ActionItem.qml index 06d3e0c9..a0473844 100644 --- a/modules/launcher/items/ActionItem.qml +++ b/modules/launcher/items/ActionItem.qml @@ -1,7 +1,7 @@ import QtQuick +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config Item { id: root diff --git a/modules/launcher/items/AppItem.qml b/modules/launcher/items/AppItem.qml index f65a6b65..7a399549 100644 --- a/modules/launcher/items/AppItem.qml +++ b/modules/launcher/items/AppItem.qml @@ -1,9 +1,9 @@ import QtQuick import Quickshell import Quickshell.Widgets +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config import qs.utils import qs.modules.launcher.services diff --git a/modules/launcher/items/CalcItem.qml b/modules/launcher/items/CalcItem.qml index 0585276f..66882991 100644 --- a/modules/launcher/items/CalcItem.qml +++ b/modules/launcher/items/CalcItem.qml @@ -2,9 +2,9 @@ import QtQuick import QtQuick.Layouts import Quickshell import Caelestia +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config Item { id: root diff --git a/modules/launcher/items/SchemeItem.qml b/modules/launcher/items/SchemeItem.qml index c5d9d8bb..96e08548 100644 --- a/modules/launcher/items/SchemeItem.qml +++ b/modules/launcher/items/SchemeItem.qml @@ -1,7 +1,7 @@ import QtQuick +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config import qs.modules.launcher.services Item { diff --git a/modules/launcher/items/VariantItem.qml b/modules/launcher/items/VariantItem.qml index eb486ea1..a95839ad 100644 --- a/modules/launcher/items/VariantItem.qml +++ b/modules/launcher/items/VariantItem.qml @@ -1,7 +1,7 @@ import QtQuick +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config import qs.modules.launcher.services Item { diff --git a/modules/launcher/items/WallpaperItem.qml b/modules/launcher/items/WallpaperItem.qml index cd41a315..771c26ca 100644 --- a/modules/launcher/items/WallpaperItem.qml +++ b/modules/launcher/items/WallpaperItem.qml @@ -1,10 +1,10 @@ import QtQuick +import Caelestia.Config import Caelestia.Models import qs.components import qs.components.effects import qs.components.images import qs.services -import Caelestia.Config Item { id: root diff --git a/modules/launcher/services/Actions.qml b/modules/launcher/services/Actions.qml index 29ed6905..30b8bb2c 100644 --- a/modules/launcher/services/Actions.qml +++ b/modules/launcher/services/Actions.qml @@ -3,8 +3,8 @@ pragma Singleton import ".." import QtQuick import Quickshell -import qs.services import Caelestia.Config +import qs.services import qs.utils Searcher { diff --git a/modules/lock/Center.qml b/modules/lock/Center.qml index aa4bd51b..be7bb22d 100644 --- a/modules/lock/Center.qml +++ b/modules/lock/Center.qml @@ -2,11 +2,11 @@ pragma ComponentBehavior: Bound import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.controls import qs.components.images import qs.services -import Caelestia.Config import qs.utils ColumnLayout { diff --git a/modules/lock/Content.qml b/modules/lock/Content.qml index 17578031..0ff7daad 100644 --- a/modules/lock/Content.qml +++ b/modules/lock/Content.qml @@ -1,8 +1,8 @@ import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config RowLayout { id: root diff --git a/modules/lock/Fetch.qml b/modules/lock/Fetch.qml index d3ba56e3..0afbe455 100644 --- a/modules/lock/Fetch.qml +++ b/modules/lock/Fetch.qml @@ -3,10 +3,10 @@ pragma ComponentBehavior: Bound import QtQuick import QtQuick.Layouts import Quickshell.Services.UPower +import Caelestia.Config import qs.components import qs.components.effects import qs.services -import Caelestia.Config import qs.utils ColumnLayout { diff --git a/modules/lock/InputField.qml b/modules/lock/InputField.qml index bc0b3312..c1c1e31f 100644 --- a/modules/lock/InputField.qml +++ b/modules/lock/InputField.qml @@ -3,9 +3,9 @@ pragma ComponentBehavior: Bound import QtQuick import QtQuick.Layouts import Quickshell +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config Item { id: root diff --git a/modules/lock/LockSurface.qml b/modules/lock/LockSurface.qml index cbb2e4f0..b269e1ea 100644 --- a/modules/lock/LockSurface.qml +++ b/modules/lock/LockSurface.qml @@ -3,9 +3,9 @@ pragma ComponentBehavior: Bound import QtQuick import QtQuick.Effects import Quickshell.Wayland +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config WlSessionLockSurface { id: root diff --git a/modules/lock/Media.qml b/modules/lock/Media.qml index 1f876daf..169d06f4 100644 --- a/modules/lock/Media.qml +++ b/modules/lock/Media.qml @@ -2,10 +2,10 @@ pragma ComponentBehavior: Bound import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.effects import qs.services -import Caelestia.Config Item { id: root diff --git a/modules/lock/NotifDock.qml b/modules/lock/NotifDock.qml index 57587f8f..070d4a33 100644 --- a/modules/lock/NotifDock.qml +++ b/modules/lock/NotifDock.qml @@ -4,11 +4,11 @@ import QtQuick import QtQuick.Layouts import Quickshell import Quickshell.Widgets +import Caelestia.Config import qs.components import qs.components.containers import qs.components.effects import qs.services -import Caelestia.Config import qs.utils ColumnLayout { diff --git a/modules/lock/NotifGroup.qml b/modules/lock/NotifGroup.qml index e7d77a20..07a6a1ca 100644 --- a/modules/lock/NotifGroup.qml +++ b/modules/lock/NotifGroup.qml @@ -5,10 +5,10 @@ import QtQuick.Layouts import Quickshell import Quickshell.Widgets import Quickshell.Services.Notifications +import Caelestia.Config import qs.components import qs.components.effects import qs.services -import Caelestia.Config import qs.utils StyledRect { diff --git a/modules/lock/Resources.qml b/modules/lock/Resources.qml index 59a470d0..5babda20 100644 --- a/modules/lock/Resources.qml +++ b/modules/lock/Resources.qml @@ -1,10 +1,10 @@ import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.controls import qs.components.misc import qs.services -import Caelestia.Config GridLayout { id: root diff --git a/modules/lock/WeatherInfo.qml b/modules/lock/WeatherInfo.qml index 2a8d058e..e76be9e6 100644 --- a/modules/lock/WeatherInfo.qml +++ b/modules/lock/WeatherInfo.qml @@ -2,9 +2,9 @@ pragma ComponentBehavior: Bound import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config ColumnLayout { id: root diff --git a/modules/notifications/Content.qml b/modules/notifications/Content.qml index a0a964b0..fcbf41f2 100644 --- a/modules/notifications/Content.qml +++ b/modules/notifications/Content.qml @@ -1,11 +1,11 @@ import QtQuick import Quickshell import Quickshell.Widgets +import Caelestia.Config import qs.components import qs.components.containers import qs.components.widgets import qs.services -import Caelestia.Config Item { id: root diff --git a/modules/notifications/Notification.qml b/modules/notifications/Notification.qml index 63d27e69..ca7596dc 100644 --- a/modules/notifications/Notification.qml +++ b/modules/notifications/Notification.qml @@ -6,10 +6,10 @@ import QtQuick.Shapes import Quickshell import Quickshell.Widgets import Quickshell.Services.Notifications +import Caelestia.Config import qs.components import qs.components.effects import qs.services -import Caelestia.Config import qs.utils StyledRect { diff --git a/modules/osd/Content.qml b/modules/osd/Content.qml index 521b803c..012c4fe5 100644 --- a/modules/osd/Content.qml +++ b/modules/osd/Content.qml @@ -2,10 +2,10 @@ pragma ComponentBehavior: Bound import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.controls import qs.services -import Caelestia.Config import qs.utils Item { diff --git a/modules/osd/Wrapper.qml b/modules/osd/Wrapper.qml index 2d7986a7..7884c319 100644 --- a/modules/osd/Wrapper.qml +++ b/modules/osd/Wrapper.qml @@ -2,9 +2,9 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config Item { id: root diff --git a/modules/session/Content.qml b/modules/session/Content.qml index 48dd9c5b..ed6dff11 100644 --- a/modules/session/Content.qml +++ b/modules/session/Content.qml @@ -2,9 +2,9 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config import qs.utils Column { diff --git a/modules/session/Wrapper.qml b/modules/session/Wrapper.qml index 417bd95a..081752d3 100644 --- a/modules/session/Wrapper.qml +++ b/modules/session/Wrapper.qml @@ -1,8 +1,8 @@ pragma ComponentBehavior: Bound import QtQuick -import qs.components import Caelestia.Config +import qs.components Item { id: root diff --git a/modules/sidebar/Content.qml b/modules/sidebar/Content.qml index c6016967..f6b8eb05 100644 --- a/modules/sidebar/Content.qml +++ b/modules/sidebar/Content.qml @@ -1,8 +1,8 @@ import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config Item { id: root diff --git a/modules/sidebar/Notif.qml b/modules/sidebar/Notif.qml index 6394a0e6..26dea195 100644 --- a/modules/sidebar/Notif.qml +++ b/modules/sidebar/Notif.qml @@ -3,9 +3,9 @@ pragma ComponentBehavior: Bound import QtQuick import QtQuick.Layouts import Quickshell +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config StyledRect { id: root diff --git a/modules/sidebar/NotifActionList.qml b/modules/sidebar/NotifActionList.qml index 09da396c..843d6ef9 100644 --- a/modules/sidebar/NotifActionList.qml +++ b/modules/sidebar/NotifActionList.qml @@ -4,11 +4,11 @@ import QtQuick import QtQuick.Layouts import Quickshell import Quickshell.Widgets +import Caelestia.Config import qs.components import qs.components.containers import qs.components.effects import qs.services -import Caelestia.Config Item { id: root diff --git a/modules/sidebar/NotifDock.qml b/modules/sidebar/NotifDock.qml index b9930409..914164e6 100644 --- a/modules/sidebar/NotifDock.qml +++ b/modules/sidebar/NotifDock.qml @@ -3,12 +3,12 @@ pragma ComponentBehavior: Bound import QtQuick import QtQuick.Layouts import Quickshell.Widgets +import Caelestia.Config import qs.components import qs.components.containers import qs.components.controls import qs.components.effects import qs.services -import Caelestia.Config import qs.utils Item { diff --git a/modules/sidebar/NotifDockList.qml b/modules/sidebar/NotifDockList.qml index 9803155d..991802bb 100644 --- a/modules/sidebar/NotifDockList.qml +++ b/modules/sidebar/NotifDockList.qml @@ -3,9 +3,9 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell import Caelestia.Components +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config LazyListView { id: root diff --git a/modules/sidebar/NotifGroup.qml b/modules/sidebar/NotifGroup.qml index 2314dfe5..dee6f20b 100644 --- a/modules/sidebar/NotifGroup.qml +++ b/modules/sidebar/NotifGroup.qml @@ -4,10 +4,10 @@ import QtQuick import QtQuick.Layouts import Quickshell import Quickshell.Services.Notifications +import Caelestia.Config import qs.components import qs.components.effects import qs.services -import Caelestia.Config import qs.utils StyledRect { diff --git a/modules/sidebar/NotifGroupList.qml b/modules/sidebar/NotifGroupList.qml index 4aecf75f..93506856 100644 --- a/modules/sidebar/NotifGroupList.qml +++ b/modules/sidebar/NotifGroupList.qml @@ -4,9 +4,9 @@ import QtQuick import QtQuick.Layouts import Quickshell import Caelestia.Components +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config LazyListView { id: root diff --git a/modules/sidebar/Wrapper.qml b/modules/sidebar/Wrapper.qml index aff42f69..0ccc62b3 100644 --- a/modules/sidebar/Wrapper.qml +++ b/modules/sidebar/Wrapper.qml @@ -1,8 +1,8 @@ pragma ComponentBehavior: Bound import QtQuick -import qs.components import Caelestia.Config +import qs.components Item { id: root diff --git a/modules/utilities/Content.qml b/modules/utilities/Content.qml index 7ecb46ff..5ec2d33a 100644 --- a/modules/utilities/Content.qml +++ b/modules/utilities/Content.qml @@ -1,8 +1,8 @@ import "cards" import QtQuick import QtQuick.Layouts -import qs.components import Caelestia.Config +import qs.components import qs.modules.bar.popouts as BarPopouts Item { diff --git a/modules/utilities/RecordingDeleteModal.qml b/modules/utilities/RecordingDeleteModal.qml index 7d7bcac8..2b7e1496 100644 --- a/modules/utilities/RecordingDeleteModal.qml +++ b/modules/utilities/RecordingDeleteModal.qml @@ -4,11 +4,11 @@ import QtQuick import QtQuick.Layouts import QtQuick.Shapes import Caelestia +import Caelestia.Config import qs.components import qs.components.controls import qs.components.effects import qs.services -import Caelestia.Config Loader { id: root diff --git a/modules/utilities/Wrapper.qml b/modules/utilities/Wrapper.qml index f36444eb..a87f8a59 100644 --- a/modules/utilities/Wrapper.qml +++ b/modules/utilities/Wrapper.qml @@ -2,8 +2,8 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell -import qs.components import Caelestia.Config +import qs.components import qs.modules.sidebar as Sidebar import qs.modules.bar.popouts as BarPopouts diff --git a/modules/utilities/cards/IdleInhibit.qml b/modules/utilities/cards/IdleInhibit.qml index 08427e7c..bf80dee3 100644 --- a/modules/utilities/cards/IdleInhibit.qml +++ b/modules/utilities/cards/IdleInhibit.qml @@ -1,9 +1,9 @@ import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.controls import qs.services -import Caelestia.Config StyledRect { id: root diff --git a/modules/utilities/cards/Record.qml b/modules/utilities/cards/Record.qml index dca2d375..43a84076 100644 --- a/modules/utilities/cards/Record.qml +++ b/modules/utilities/cards/Record.qml @@ -2,10 +2,10 @@ pragma ComponentBehavior: Bound import QtQuick import QtQuick.Layouts +import Caelestia.Config import qs.components import qs.components.controls import qs.services -import Caelestia.Config StyledRect { id: root diff --git a/modules/utilities/cards/RecordingList.qml b/modules/utilities/cards/RecordingList.qml index 210b92af..c239e06b 100644 --- a/modules/utilities/cards/RecordingList.qml +++ b/modules/utilities/cards/RecordingList.qml @@ -4,12 +4,12 @@ import QtQuick import QtQuick.Layouts import Quickshell import Quickshell.Widgets +import Caelestia.Config import Caelestia.Models import qs.components import qs.components.containers import qs.components.controls import qs.services -import Caelestia.Config import qs.utils ColumnLayout { diff --git a/modules/utilities/cards/Toggles.qml b/modules/utilities/cards/Toggles.qml index 41eee68f..49147a62 100644 --- a/modules/utilities/cards/Toggles.qml +++ b/modules/utilities/cards/Toggles.qml @@ -3,10 +3,10 @@ pragma ComponentBehavior: Bound import QtQuick import QtQuick.Layouts import Quickshell.Bluetooth +import Caelestia.Config import qs.components import qs.components.controls import qs.services -import Caelestia.Config import qs.modules.bar.popouts as BarPopouts StyledRect { diff --git a/modules/utilities/toasts/ToastItem.qml b/modules/utilities/toasts/ToastItem.qml index 756160fc..5247e773 100644 --- a/modules/utilities/toasts/ToastItem.qml +++ b/modules/utilities/toasts/ToastItem.qml @@ -1,10 +1,10 @@ import QtQuick import QtQuick.Layouts import Caelestia +import Caelestia.Config import qs.components import qs.components.effects import qs.services -import Caelestia.Config StyledRect { id: root diff --git a/modules/utilities/toasts/Toasts.qml b/modules/utilities/toasts/Toasts.qml index 517175bf..bceb4ea6 100644 --- a/modules/utilities/toasts/Toasts.qml +++ b/modules/utilities/toasts/Toasts.qml @@ -3,9 +3,9 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell import Caelestia +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config Item { id: root diff --git a/modules/windowinfo/Buttons.qml b/modules/windowinfo/Buttons.qml index 6ddda9b3..5d9752ca 100644 --- a/modules/windowinfo/Buttons.qml +++ b/modules/windowinfo/Buttons.qml @@ -3,9 +3,9 @@ pragma ComponentBehavior: Bound import QtQuick import QtQuick.Layouts import Quickshell.Widgets +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config ColumnLayout { id: root diff --git a/modules/windowinfo/Details.qml b/modules/windowinfo/Details.qml index 1f274ca8..1820409f 100644 --- a/modules/windowinfo/Details.qml +++ b/modules/windowinfo/Details.qml @@ -1,9 +1,9 @@ import QtQuick import QtQuick.Layouts import Quickshell.Hyprland +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config ColumnLayout { id: root diff --git a/modules/windowinfo/Preview.qml b/modules/windowinfo/Preview.qml index 4946205c..fed85891 100644 --- a/modules/windowinfo/Preview.qml +++ b/modules/windowinfo/Preview.qml @@ -5,9 +5,9 @@ import QtQuick.Layouts import Quickshell import Quickshell.Hyprland import Quickshell.Wayland +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config Item { id: root diff --git a/modules/windowinfo/WindowInfo.qml b/modules/windowinfo/WindowInfo.qml index 2c31d209..7ee35c29 100644 --- a/modules/windowinfo/WindowInfo.qml +++ b/modules/windowinfo/WindowInfo.qml @@ -2,9 +2,9 @@ import QtQuick import QtQuick.Layouts import Quickshell import Quickshell.Hyprland +import Caelestia.Config import qs.components import qs.services -import Caelestia.Config Item { id: root diff --git a/services/Audio.qml b/services/Audio.qml index ad679149..faf86a93 100644 --- a/services/Audio.qml +++ b/services/Audio.qml @@ -5,8 +5,8 @@ import Quickshell import Quickshell.Io import Quickshell.Services.Pipewire import Caelestia -import Caelestia.Services import Caelestia.Config +import Caelestia.Services Singleton { id: root diff --git a/services/Brightness.qml b/services/Brightness.qml index 5e7d7f81..2cd628ec 100644 --- a/services/Brightness.qml +++ b/services/Brightness.qml @@ -4,8 +4,8 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell import Quickshell.Io -import qs.components.misc import Caelestia.Config +import qs.components.misc Singleton { id: root diff --git a/services/Colours.qml b/services/Colours.qml index fd4698de..922b51db 100644 --- a/services/Colours.qml +++ b/services/Colours.qml @@ -5,8 +5,8 @@ import QtQuick import Quickshell import Quickshell.Io import Caelestia -import qs.services import Caelestia.Config +import qs.services import qs.utils Singleton { diff --git a/services/GameMode.qml b/services/GameMode.qml index ac1b235d..44b0fe4c 100644 --- a/services/GameMode.qml +++ b/services/GameMode.qml @@ -4,8 +4,8 @@ import QtQuick import Quickshell import Quickshell.Io import Caelestia -import qs.services import Caelestia.Config +import qs.services Singleton { id: root diff --git a/services/Hypr.qml b/services/Hypr.qml index 2c307e2a..054b611c 100644 --- a/services/Hypr.qml +++ b/services/Hypr.qml @@ -5,9 +5,9 @@ import Quickshell import Quickshell.Hyprland import Quickshell.Io import Caelestia +import Caelestia.Config import Caelestia.Internal import qs.components.misc -import Caelestia.Config Singleton { id: root diff --git a/services/NetworkUsage.qml b/services/NetworkUsage.qml index e0cc61b3..a6598713 100644 --- a/services/NetworkUsage.qml +++ b/services/NetworkUsage.qml @@ -3,8 +3,8 @@ pragma Singleton import QtQuick import Quickshell import Quickshell.Io -import Caelestia.Internal import Caelestia.Config +import Caelestia.Internal Singleton { id: root diff --git a/services/NotifData.qml b/services/NotifData.qml index 31ff7d2f..1cec1510 100644 --- a/services/NotifData.qml +++ b/services/NotifData.qml @@ -4,8 +4,8 @@ import QtQuick import Quickshell import Quickshell.Services.Notifications import Caelestia -import qs.services import Caelestia.Config +import qs.services import qs.utils QtObject { diff --git a/services/Notifs.qml b/services/Notifs.qml index f2205fc0..510ee0bc 100644 --- a/services/Notifs.qml +++ b/services/Notifs.qml @@ -6,9 +6,9 @@ import Quickshell import Quickshell.Io import Quickshell.Services.Notifications import Caelestia +import Caelestia.Config import qs.components.misc import qs.services -import Caelestia.Config import qs.utils Singleton { diff --git a/services/Players.qml b/services/Players.qml index f3c6ab3f..0724afbc 100644 --- a/services/Players.qml +++ b/services/Players.qml @@ -5,8 +5,8 @@ import Quickshell import Quickshell.Io import Quickshell.Services.Mpris import Caelestia -import qs.components.misc import Caelestia.Config +import qs.components.misc Singleton { id: root diff --git a/services/Wallpapers.qml b/services/Wallpapers.qml index a42d926e..4ef522ba 100644 --- a/services/Wallpapers.qml +++ b/services/Wallpapers.qml @@ -3,9 +3,9 @@ pragma Singleton import QtQuick import Quickshell import Quickshell.Io +import Caelestia.Config import Caelestia.Models import qs.services -import Caelestia.Config import qs.utils Searcher { From ae8d344f84ca381a3716a81c364de77fd54b6d0c Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 22:43:31 +1000 Subject: [PATCH 30/81] fix: qualify attached props on non-Item components They do not have parents, so they won't inherit the config scope otherwise Animations are not per monitor --- modules/controlcenter/NavRail.qml | 4 ++-- modules/controlcenter/bluetooth/Details.qml | 4 ++-- modules/launcher/ContentList.qml | 6 +++--- modules/sidebar/Notif.qml | 12 ++++++------ 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/modules/controlcenter/NavRail.qml b/modules/controlcenter/NavRail.qml index 5a0ba37b..4522573b 100644 --- a/modules/controlcenter/NavRail.qml +++ b/modules/controlcenter/NavRail.qml @@ -31,7 +31,7 @@ Item { when: root.session.navExpanded PropertyChanges { - layout.spacing: Tokens.spacing.small + layout.spacing: root.Tokens.spacing.small } } @@ -148,7 +148,7 @@ Item { expandedLabel.opacity: 1 smallLabel.opacity: 0 background.implicitWidth: icon.implicitWidth + icon.anchors.leftMargin * 2 + expandedLabel.anchors.leftMargin + expandedLabel.implicitWidth - background.implicitHeight: icon.implicitHeight + Tokens.padding.normal * 2 + background.implicitHeight: icon.implicitHeight + root.Tokens.padding.normal * 2 item.implicitHeight: background.implicitHeight } } diff --git a/modules/controlcenter/bluetooth/Details.qml b/modules/controlcenter/bluetooth/Details.qml index a398c34d..ec47e5f1 100644 --- a/modules/controlcenter/bluetooth/Details.qml +++ b/modules/controlcenter/bluetooth/Details.qml @@ -167,7 +167,7 @@ StyledFlickable { PropertyChanges { renameDevice.implicitHeight: deviceNameEdit.implicitHeight renameLabel.opacity: 0 - deviceNameEdit.padding: Tokens.padding.normal + deviceNameEdit.padding: root.Tokens.padding.normal } } @@ -481,7 +481,7 @@ StyledFlickable { when: root.session.bt.fabMenuOpen PropertyChanges { - fabMenuItem.implicitWidth: fabMenuItemInner.implicitWidth + Tokens.padding.large * 2 + fabMenuItem.implicitWidth: fabMenuItemInner.implicitWidth + root.Tokens.padding.large * 2 fabMenuItem.opacity: 1 fabMenuItemInner.opacity: 1 } diff --git a/modules/launcher/ContentList.qml b/modules/launcher/ContentList.qml index e36c0d32..4667a540 100644 --- a/modules/launcher/ContentList.qml +++ b/modules/launcher/ContentList.qml @@ -32,7 +32,7 @@ Item { name: "apps" PropertyChanges { - root.implicitWidth: Tokens.sizes.launcher.itemWidth + root.implicitWidth: root.Tokens.sizes.launcher.itemWidth root.implicitHeight: Math.min(root.maxHeight, appList.implicitHeight > 0 ? appList.implicitHeight : empty.implicitHeight) appList.active: true } @@ -46,8 +46,8 @@ Item { name: "wallpapers" PropertyChanges { - root.implicitWidth: Math.max(Tokens.sizes.launcher.itemWidth * 1.2, wallpaperList.implicitWidth) - root.implicitHeight: Tokens.sizes.launcher.wallpaperHeight + root.implicitWidth: Math.max(root.Tokens.sizes.launcher.itemWidth * 1.2, wallpaperList.implicitWidth) + root.implicitHeight: root.Tokens.sizes.launcher.wallpaperHeight wallpaperList.active: true } } diff --git a/modules/sidebar/Notif.qml b/modules/sidebar/Notif.qml index 26dea195..54dfb5ff 100644 --- a/modules/sidebar/Notif.qml +++ b/modules/sidebar/Notif.qml @@ -32,12 +32,12 @@ StyledRect { name: "expanded" PropertyChanges { - summary.anchors.margins: Tokens.padding.normal - dummySummary.anchors.margins: Tokens.padding.normal - compactBody.anchors.margins: Tokens.padding.normal - timeStr.anchors.margins: Tokens.padding.normal - expandedContent.anchors.margins: Tokens.padding.normal - summary.width: root.width - Tokens.padding.normal * 2 - timeStr.implicitWidth - Tokens.spacing.small + summary.anchors.margins: root.Tokens.padding.normal + dummySummary.anchors.margins: root.Tokens.padding.normal + compactBody.anchors.margins: root.Tokens.padding.normal + timeStr.anchors.margins: root.Tokens.padding.normal + expandedContent.anchors.margins: root.Tokens.padding.normal + summary.width: root.width - root.Tokens.padding.normal * 2 - timeStr.implicitWidth - root.Tokens.spacing.small summary.maximumLineCount: Number.MAX_SAFE_INTEGER } } From 37b61fedc9268d66e73569461f872fa35861d75b Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 23:27:27 +1000 Subject: [PATCH 31/81] chore: update readme --- README.md | 56 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 48 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 43d04fb1..8c6763bd 100644 --- a/README.md +++ b/README.md @@ -205,22 +205,40 @@ git pull ## Configuring All configuration options should be put in `~/.config/caelestia/shell.json`. This file is _not_ created by -default, you must create it manually. +default, you must create it manually. Options that you omit from the config file will use their default +values. + +### Per-monitor configuration + +You can configure options per-monitor in `~/.config/caelestia/monitors//shell.json`. Options +set in this file will **override** the respective options in the global config. Otherwise, the options will +use their values from the global config. + +For example, to disable the bar on DP-1: + +**`~/.config/caelestia/monitors/DP-1/shell.json`** + +```json +{ + "bar": { + "persistent": false + } +} +``` ### Example configuration > [!NOTE] -> The example configuration only includes recommended configuration options. For more advanced customisation -> such as modifying the size of individual items or changing constants in the code, there are some other -> options which can be found in the source files in the `config` directory. +> The example configuration includes ALL configuration options in `shell.json`. You are +> **not** recommended to copy and paste this entire configuration into `shell.json`. +> This is meant to serve as a reference of all the available options, and you should +> only add the ones you want to change to `shell.json`.
Example ```json { "appearance": { - "mediaGifSpeedAdjustment": 300, - "sessionGifSpeed": 0.7, "anim": { "durations": { "scale": 1 @@ -254,6 +272,8 @@ default, you must create it manually. }, "general": { "logo": "caelestia", + "mediaGifSpeedAdjustment": 300, + "sessionGifSpeed": 0.7, "apps": { "terminal": ["foot"], "audio": ["pavucontrol"], @@ -442,9 +462,13 @@ default, you must create it manually. }, "dashboard": { "enabled": true, + "showOnHover": true, + "showDashboard": true, + "showMedia": true, + "showPerformance": true, + "showWeather": true, "dragThreshold": 50, - "mediaUpdateInterval": 500, - "showOnHover": true + "mediaUpdateInterval": 500 }, "launcher": { "actionPrefix": ">", @@ -704,6 +728,22 @@ default, you must create it manually.
+### Advanced configuration + +> [!WARNING] +> Do NOT change any of these options if you do not know what you are doing. These options control the +> tokens used internally within the shell, and can cause visual issues if changed. The existence of +> the options are also not guaranteed across versions, and may change or be removed without notice. + +A separate `~/.config/caelestia/shell-tokens.json` file allows editing the internal tokens without +touching the source code of the shell. These tokens affect, for example, individual rounding, +spacing, padding, font size, animation duration and easing curves tokens, and the sizes of certain +components. The appearance scale values in `shell.json` are multiplied against these base +token values to produce the final computed values. + +Per-monitor token overrides are also available at +`~/.config/caelestia/monitors//shell-tokens.json`. + ### Home Manager Module For NixOS users, a home manager module is also available. From 9be9ec10a61984dfbc48dca43b47c522a693104d Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 23:37:42 +1000 Subject: [PATCH 32/81] fix: per monitor configs Use c++ singleton pattern for monitor manager and bind appearance tokens properly Also use scoped properties on ContentWindow --- components/containers/StyledWindow.qml | 1 + modules/drawers/ContentWindow.qml | 10 ++-- plugin/src/Caelestia/Config/config.cpp | 3 + .../Caelestia/Config/monitorconfigmanager.cpp | 56 ++++++------------- .../Caelestia/Config/monitorconfigmanager.hpp | 3 - 5 files changed, 27 insertions(+), 46 deletions(-) diff --git a/components/containers/StyledWindow.qml b/components/containers/StyledWindow.qml index 57f319c0..c93465c7 100644 --- a/components/containers/StyledWindow.qml +++ b/components/containers/StyledWindow.qml @@ -8,6 +8,7 @@ PanelWindow { id: root required property string name + readonly property alias configScope: scope default property alias contentData: scope.data WlrLayershell.namespace: `caelestia-${name}` diff --git a/modules/drawers/ContentWindow.qml b/modules/drawers/ContentWindow.qml index 2842a33f..4ff12c16 100644 --- a/modules/drawers/ContentWindow.qml +++ b/modules/drawers/ContentWindow.qml @@ -30,9 +30,9 @@ StyledWindow { } return monitor?.activeWorkspace?.toplevels.values.some(t => t.lastIpcObject.fullscreen > 1) ?? false; } - property real borderThickness: hasFullscreen ? 0 : Config.border.thickness - readonly property real borderLayoutThickness: hasFullscreen ? 0 : Config.border.thickness - property real borderRounding: hasFullscreen ? 0 : Config.border.rounding + property real borderThickness: hasFullscreen ? 0 : configScope.Config.border.thickness + readonly property real borderLayoutThickness: hasFullscreen ? 0 : configScope.Config.border.thickness + property real borderRounding: hasFullscreen ? 0 : configScope.Config.border.rounding property real shadowOpacity: hasFullscreen ? 0 : 0.7 readonly property int dragMaskPadding: { @@ -44,8 +44,8 @@ StyledWindow { const thresholds = []; for (const panel of ["dashboard", "launcher", "session", "sidebar"]) - if (Config[panel].enabled) - thresholds.push(Config[panel].dragThreshold); + if (configScope.Config[panel].enabled) + thresholds.push(configScope.Config[panel].dragThreshold); return Math.max(...thresholds); } diff --git a/plugin/src/Caelestia/Config/config.cpp b/plugin/src/Caelestia/Config/config.cpp index 41067735..9ed2b4af 100644 --- a/plugin/src/Caelestia/Config/config.cpp +++ b/plugin/src/Caelestia/Config/config.cpp @@ -61,6 +61,9 @@ GlobalConfig::GlobalConfig(GlobalConfig* fallback, const QString& filePath, QObj setupFileBackend(filePath); if (fallback) syncFromGlobal(fallback); + + // Bind appearance computed properties to token base values + bindAppearanceTokens(); } GlobalConfig* GlobalConfig::instance() { diff --git a/plugin/src/Caelestia/Config/monitorconfigmanager.cpp b/plugin/src/Caelestia/Config/monitorconfigmanager.cpp index d8b0561c..473b6567 100644 --- a/plugin/src/Caelestia/Config/monitorconfigmanager.cpp +++ b/plugin/src/Caelestia/Config/monitorconfigmanager.cpp @@ -6,8 +6,6 @@ namespace caelestia::config { -MonitorConfigManager* MonitorConfigManager::s_instance = nullptr; - namespace { QString monitorConfigDir(const QString& screen) { @@ -18,52 +16,34 @@ QString monitorConfigDir(const QString& screen) { } // namespace MonitorConfigManager::MonitorConfigManager(QObject* parent) - : QObject(parent) { - s_instance = this; -} - -MonitorConfigManager::~MonitorConfigManager() { - s_instance = nullptr; -} + : QObject(parent) {} MonitorConfigManager* MonitorConfigManager::instance() { - return s_instance; + static MonitorConfigManager instance; + return &instance; } -MonitorConfigManager* MonitorConfigManager::create(QQmlEngine* engine, QJSEngine*) { - return new MonitorConfigManager(engine); +MonitorConfigManager* MonitorConfigManager::create(QQmlEngine*, QJSEngine*) { + QQmlEngine::setObjectOwnership(instance(), QQmlEngine::CppOwnership); + return instance(); } GlobalConfig* MonitorConfigManager::configForScreen(const QString& screen) { - auto it = m_overlays.find(screen); - if (it != m_overlays.end() && it->config) - return it->config; - - auto* global = GlobalConfig::instance(); - if (!global) - return nullptr; - - auto dir = monitorConfigDir(screen); - auto* overlay = new GlobalConfig(global, dir + QStringLiteral("shell.json"), this); - - m_overlays[screen].config = overlay; - return overlay; + auto& overlay = m_overlays[screen]; + if (!overlay.config) { + auto dir = monitorConfigDir(screen); + overlay.config = new GlobalConfig(GlobalConfig::instance(), dir + QStringLiteral("shell.json"), this); + } + return overlay.config; } TokenConfig* MonitorConfigManager::tokensForScreen(const QString& screen) { - auto it = m_overlays.find(screen); - if (it != m_overlays.end() && it->tokens) - return it->tokens; - - auto* global = TokenConfig::instance(); - if (!global) - return nullptr; - - auto dir = monitorConfigDir(screen); - auto* overlay = new TokenConfig(global, dir + QStringLiteral("shell-tokens.json"), this); - - m_overlays[screen].tokens = overlay; - return overlay; + auto& overlay = m_overlays[screen]; + if (!overlay.tokens) { + auto dir = monitorConfigDir(screen); + overlay.tokens = new TokenConfig(TokenConfig::instance(), dir + QStringLiteral("shell-tokens.json"), this); + } + return overlay.tokens; } } // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/monitorconfigmanager.hpp b/plugin/src/Caelestia/Config/monitorconfigmanager.hpp index 2741b732..70bbdc0d 100644 --- a/plugin/src/Caelestia/Config/monitorconfigmanager.hpp +++ b/plugin/src/Caelestia/Config/monitorconfigmanager.hpp @@ -21,8 +21,6 @@ public: [[nodiscard]] Q_INVOKABLE GlobalConfig* configForScreen(const QString& screen); [[nodiscard]] Q_INVOKABLE TokenConfig* tokensForScreen(const QString& screen); - ~MonitorConfigManager() override; - private: explicit MonitorConfigManager(QObject* parent = nullptr); @@ -32,7 +30,6 @@ private: }; QHash m_overlays; - static MonitorConfigManager* s_instance; }; } // namespace caelestia::config From 31d7a77929abb304f0bd53df35b837111cd038d7 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 23:49:40 +1000 Subject: [PATCH 33/81] fix: popouts anims, should not be per-monitor Anims are not per-monitor --- modules/bar/popouts/Wrapper.qml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/modules/bar/popouts/Wrapper.qml b/modules/bar/popouts/Wrapper.qml index 48fe05f8..9a18f911 100644 --- a/modules/bar/popouts/Wrapper.qml +++ b/modules/bar/popouts/Wrapper.qml @@ -32,13 +32,16 @@ Item { property string detachedMode property string queuedMode - property int animLength: Tokens.anim.durations.expressiveDefaultSpatial - property easingCurve animCurve: Tokens.anim.expressiveDefaultSpatial + // Dummy object so Tokens attached prop resolves to global config + // Anim configs are not per-monitor + readonly property QtObject dummy: QtObject {} + property int animLength: dummy.Tokens.anim.durations.expressiveDefaultSpatial + property easingCurve animCurve: dummy.Tokens.anim.expressiveDefaultSpatial function setAnims(detach: bool): void { const type = `expressive${detach ? "Slow" : "Default"}Spatial`; - animLength = Tokens.anim.durations[type]; - animCurve = Tokens.anim[type]; + animLength = dummy.Tokens.anim.durations[type]; + animCurve = dummy.Tokens.anim[type]; } function detach(mode: string): void { From 93b5fb5f4f0d811460a0a86546e3a9da02a7817a Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 23:53:36 +1000 Subject: [PATCH 34/81] feat: make all configs sparse --- plugin/src/Caelestia/Config/config.cpp | 1 - plugin/src/Caelestia/Config/configobject.cpp | 54 +------------------- plugin/src/Caelestia/Config/configobject.hpp | 6 --- plugin/src/Caelestia/Config/tokens.cpp | 1 - 4 files changed, 2 insertions(+), 60 deletions(-) diff --git a/plugin/src/Caelestia/Config/config.cpp b/plugin/src/Caelestia/Config/config.cpp index 9ed2b4af..7ae638d9 100644 --- a/plugin/src/Caelestia/Config/config.cpp +++ b/plugin/src/Caelestia/Config/config.cpp @@ -56,7 +56,6 @@ GlobalConfig::GlobalConfig(GlobalConfig* fallback, const QString& filePath, QObj , m_sidebar(new SidebarConfig(this)) , m_services(new ServiceConfig(this)) , m_paths(new UserPaths(this)) { - setSparse(true); if (!filePath.isEmpty()) setupFileBackend(filePath); if (fallback) diff --git a/plugin/src/Caelestia/Config/configobject.cpp b/plugin/src/Caelestia/Config/configobject.cpp index 8103b896..fda9fba2 100644 --- a/plugin/src/Caelestia/Config/configobject.cpp +++ b/plugin/src/Caelestia/Config/configobject.cpp @@ -70,56 +70,6 @@ QJsonObject ConfigObject::toJsonObject() const { QJsonObject obj; const auto* meta = metaObject(); - for (int i = meta->propertyOffset(); i < meta->propertyCount(); ++i) { - const auto prop = meta->property(i); - - if (!prop.isReadable()) - continue; - - const auto key = QString::fromUtf8(prop.name()); - const auto value = prop.read(this); - - // Recurse into sub-objects - if (value.canView()) { - auto* const subObj = value.value(); - if (subObj) - obj.insert(key, subObj->toJsonObject()); - else - qCWarning(lcConfig, "Unable to get sub-object when serializing config object"); - continue; - } - - // Skip read-only properties (computed values) - if (!prop.isWritable()) - continue; - - // Handle QStringList explicitly - if (prop.metaType().id() == QMetaType::QStringList) { - QJsonArray arr; - const auto strList = value.toStringList(); - for (const auto& s : strList) - arr.append(s); - obj.insert(key, arr); - continue; - } - - // Handle QVariantList explicitly - if (prop.metaType().id() == QMetaType::QVariantList) { - obj.insert(key, QJsonArray::fromVariantList(value.toList())); - continue; - } - - // Default case - obj.insert(key, QJsonValue::fromVariant(value)); - } - - return obj; -} - -QJsonObject ConfigObject::toSparseJsonObject() const { - QJsonObject obj; - const auto* meta = metaObject(); - for (int i = meta->propertyOffset(); i < meta->propertyCount(); ++i) { const auto prop = meta->property(i); @@ -133,7 +83,7 @@ QJsonObject ConfigObject::toSparseJsonObject() const { if (value.canView()) { auto* const subObj = value.value(); if (subObj) { - auto subJson = subObj->toSparseJsonObject(); + auto subJson = subObj->toJsonObject(); if (!subJson.isEmpty()) obj.insert(key, subJson); } @@ -304,7 +254,7 @@ void ConfigObject::setupFileBackend(const QString& path) { return; } - auto json = m_sparse ? toSparseJsonObject() : toJsonObject(); + auto json = toJsonObject(); file.write(QJsonDocument(json).toJson(QJsonDocument::Indented)); if (auto* root = qobject_cast(this)) emit root->fileSaved(); diff --git a/plugin/src/Caelestia/Config/configobject.hpp b/plugin/src/Caelestia/Config/configobject.hpp index f0420441..a70cdd74 100644 --- a/plugin/src/Caelestia/Config/configobject.hpp +++ b/plugin/src/Caelestia/Config/configobject.hpp @@ -53,7 +53,6 @@ public: void loadFromJson(const QJsonObject& obj); [[nodiscard]] QJsonObject toJsonObject() const; - [[nodiscard]] QJsonObject toSparseJsonObject() const; // File-backed config support. Call setupFileBackend() to enable // automatic file watching, debounced saving, and reload. @@ -69,10 +68,6 @@ public: [[nodiscard]] bool isPropertyLoaded(const QString& name) const { return m_loadedKeys.contains(name); } - [[nodiscard]] bool isSparse() const { return m_sparse; } - - void setSparse(bool sparse) { m_sparse = sparse; } - [[nodiscard]] bool recentlySaved() const { return m_recentlySaved; } template static bool updateMember(T& member, const T& value) { @@ -100,7 +95,6 @@ private: QString m_filePath; bool m_recentlySaved = false; - bool m_sparse = false; // File backend (heap-allocated only when setupFileBackend is called) QFileSystemWatcher* m_watcher = nullptr; diff --git a/plugin/src/Caelestia/Config/tokens.cpp b/plugin/src/Caelestia/Config/tokens.cpp index 902dbfc4..74cd827b 100644 --- a/plugin/src/Caelestia/Config/tokens.cpp +++ b/plugin/src/Caelestia/Config/tokens.cpp @@ -26,7 +26,6 @@ TokenConfig::TokenConfig(TokenConfig* fallback, const QString& filePath, QObject : RootConfig(parent) , m_appearance(new AppearanceTokens(this)) , m_sizes(new SizeTokens(this)) { - setSparse(true); if (!filePath.isEmpty()) setupFileBackend(filePath); if (fallback) From 746d1af8262ed303a3b0934dde1a8b7e27108b83 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 00:00:56 +1000 Subject: [PATCH 35/81] feat: allow resetting options Also make options changed programmatically (from QML, etc) mark themselves as loaded --- plugin/src/Caelestia/Config/configobject.cpp | 18 ++++++++++++++++++ plugin/src/Caelestia/Config/configobject.hpp | 4 ++++ 2 files changed, 22 insertions(+) diff --git a/plugin/src/Caelestia/Config/configobject.cpp b/plugin/src/Caelestia/Config/configobject.cpp index fda9fba2..7a36f7b5 100644 --- a/plugin/src/Caelestia/Config/configobject.cpp +++ b/plugin/src/Caelestia/Config/configobject.cpp @@ -168,6 +168,24 @@ void ConfigObject::syncFromGlobal(ConfigObject* global) { } } +void ConfigObject::markPropertyLoaded(const QString& name) { + m_loadedKeys.insert(name); +} + +void ConfigObject::resetOption(const QString& name) { + m_loadedKeys.remove(name); + + // If synced from global, re-copy the global value + if (m_global) { + int idx = metaObject()->indexOfProperty(name.toUtf8().constData()); + if (idx >= 0) { + auto prop = metaObject()->property(idx); + if (prop.isWritable()) + prop.write(this, prop.read(m_global)); + } + } +} + void ConfigObject::resyncFromGlobal() { if (!m_global) return; diff --git a/plugin/src/Caelestia/Config/configobject.hpp b/plugin/src/Caelestia/Config/configobject.hpp index a70cdd74..8ffe074c 100644 --- a/plugin/src/Caelestia/Config/configobject.hpp +++ b/plugin/src/Caelestia/Config/configobject.hpp @@ -20,6 +20,7 @@ public: } \ void set_##name(const Type& val) { \ if (caelestia::config::ConfigObject::updateMember(m_##name, val)) { \ + markPropertyLoaded(QStringLiteral(#name)); \ Q_EMIT name##Changed(); \ notifyPropertyChanged(QStringLiteral(#name), QVariant::fromValue(m_##name)); \ } \ @@ -68,6 +69,8 @@ public: [[nodiscard]] bool isPropertyLoaded(const QString& name) const { return m_loadedKeys.contains(name); } + Q_INVOKABLE void resetOption(const QString& name); + [[nodiscard]] bool recentlySaved() const { return m_recentlySaved; } template static bool updateMember(T& member, const T& value) { @@ -86,6 +89,7 @@ signals: void propertiesChanged(const QMap& changed); protected: + void markPropertyLoaded(const QString& name); void notifyPropertyChanged(const QString& name, const QVariant& value); private: From 9b1b33a3883ea362ae46a7cfe697d18f574492cf Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 01:19:48 +1000 Subject: [PATCH 36/81] feat: remove file prefix on signals --- plugin/src/Caelestia/Config/configobject.cpp | 11 ++++++----- plugin/src/Caelestia/Config/configobject.hpp | 8 ++++---- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/plugin/src/Caelestia/Config/configobject.cpp b/plugin/src/Caelestia/Config/configobject.cpp index 7a36f7b5..00769941 100644 --- a/plugin/src/Caelestia/Config/configobject.cpp +++ b/plugin/src/Caelestia/Config/configobject.cpp @@ -268,14 +268,15 @@ void ConfigObject::setupFileBackend(const QString& path) { if (!file.open(QIODevice::WriteOnly)) { qCWarning(lcConfig, "Failed to write %s", qUtf8Printable(m_filePath)); if (auto* root = qobject_cast(this)) - emit root->fileSaveFailed(QStringLiteral("Failed to open file for writing")); + emit root->saveFailed(QStringLiteral("Failed to open file for writing")); return; } auto json = toJsonObject(); file.write(QJsonDocument(json).toJson(QJsonDocument::Indented)); + file.close(); if (auto* root = qobject_cast(this)) - emit root->fileSaved(); + emit root->saved(); }); m_cooldownTimer->setSingleShot(true); @@ -355,9 +356,9 @@ void ConfigObject::onFileChanged() { bool ok = reloadFromFile(); if (auto* root = qobject_cast(this)) { if (ok) - emit root->fileLoaded(); + emit root->loaded(); else - emit root->fileLoadFailed(QStringLiteral("Failed to load config file")); + emit root->loadFailed(QStringLiteral("Failed to load config file")); } } } @@ -373,7 +374,7 @@ void RootConfig::save() { void RootConfig::reload() { if (reloadFromFile()) - emit fileLoaded(); + emit loaded(); } } // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/configobject.hpp b/plugin/src/Caelestia/Config/configobject.hpp index 8ffe074c..66df4ac3 100644 --- a/plugin/src/Caelestia/Config/configobject.hpp +++ b/plugin/src/Caelestia/Config/configobject.hpp @@ -126,10 +126,10 @@ public: Q_INVOKABLE void reload(); signals: - void fileLoaded(); - void fileLoadFailed(const QString& error); - void fileSaved(); - void fileSaveFailed(const QString& error); + void loaded(); + void loadFailed(const QString& error); + void saved(); + void saveFailed(const QString& error); }; } // namespace caelestia::config From 697784abcef53d75507fc738d2d9f3121794b04e Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 01:20:40 +1000 Subject: [PATCH 37/81] fix: remove key from loaded keys on sync A sync goes through the property setter, which sets the key as loaded. But a sync is not considered an explicit set, so unset it after --- plugin/src/Caelestia/Config/configobject.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plugin/src/Caelestia/Config/configobject.cpp b/plugin/src/Caelestia/Config/configobject.cpp index 00769941..4e198a41 100644 --- a/plugin/src/Caelestia/Config/configobject.cpp +++ b/plugin/src/Caelestia/Config/configobject.cpp @@ -161,6 +161,7 @@ void ConfigObject::syncFromGlobal(ConfigObject* global) { if (!m_loadedKeys.contains(key)) { auto val = prop.read(global); prop.write(this, val); + m_loadedKeys.remove(key); // setter added it — remove since this is a synced value qCDebug(lcConfig) << " Synced" << key << "=" << val << "from global"; } else { qCDebug(lcConfig) << " Keeping loaded" << key << "=" << prop.read(this); @@ -206,8 +207,10 @@ void ConfigObject::resyncFromGlobal() { if (!prop.isWritable()) continue; - if (!m_loadedKeys.contains(key)) + if (!m_loadedKeys.contains(key)) { prop.write(this, prop.read(m_global)); + m_loadedKeys.remove(key); // setter added it — remove since this is a synced value + } } } @@ -219,6 +222,9 @@ void ConfigObject::onGlobalPropertiesChanged(const QMap& chan int idx = metaObject()->indexOfProperty(it.key().toUtf8().constData()); if (idx >= 0) { metaObject()->property(idx).write(this, it.value()); + // Remove the key that was added by markPropertyLoaded in the setter — + // this is a synced value, not an explicit override + m_loadedKeys.remove(it.key()); qCDebug(lcConfig) << metaObject()->className() << "synced" << it.key() << "=" << it.value() << "from global change"; } From 72e0a218fd700bef06e073512e9013dd3e486daf Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 02:06:13 +1000 Subject: [PATCH 38/81] refactor: move file logic to RootConfig + to own file --- plugin/src/Caelestia/Config/CMakeLists.txt | 1 + plugin/src/Caelestia/Config/config.hpp | 1 + plugin/src/Caelestia/Config/configobject.cpp | 176 +++---------------- plugin/src/Caelestia/Config/configobject.hpp | 39 ---- plugin/src/Caelestia/Config/rootconfig.cpp | 127 +++++++++++++ plugin/src/Caelestia/Config/rootconfig.hpp | 46 +++++ plugin/src/Caelestia/Config/tokens.hpp | 2 +- 7 files changed, 197 insertions(+), 195 deletions(-) create mode 100644 plugin/src/Caelestia/Config/rootconfig.cpp create mode 100644 plugin/src/Caelestia/Config/rootconfig.hpp diff --git a/plugin/src/Caelestia/Config/CMakeLists.txt b/plugin/src/Caelestia/Config/CMakeLists.txt index 92ee2da9..a77a1fe9 100644 --- a/plugin/src/Caelestia/Config/CMakeLists.txt +++ b/plugin/src/Caelestia/Config/CMakeLists.txt @@ -3,6 +3,7 @@ qml_module(caelestia-config SOURCES config.cpp configobject.cpp + rootconfig.cpp configscope.cpp appearanceconfig.cpp tokens.cpp diff --git a/plugin/src/Caelestia/Config/config.hpp b/plugin/src/Caelestia/Config/config.hpp index d683df11..1a989143 100644 --- a/plugin/src/Caelestia/Config/config.hpp +++ b/plugin/src/Caelestia/Config/config.hpp @@ -13,6 +13,7 @@ #include "lockconfig.hpp" #include "notifsconfig.hpp" #include "osdconfig.hpp" +#include "rootconfig.hpp" #include "serviceconfig.hpp" #include "sessionconfig.hpp" #include "sidebarconfig.hpp" diff --git a/plugin/src/Caelestia/Config/configobject.cpp b/plugin/src/Caelestia/Config/configobject.cpp index 4e198a41..cc38d7e5 100644 --- a/plugin/src/Caelestia/Config/configobject.cpp +++ b/plugin/src/Caelestia/Config/configobject.cpp @@ -1,10 +1,6 @@ #include "configobject.hpp" -#include -#include -#include #include -#include #include #include #include @@ -15,6 +11,8 @@ namespace caelestia::config { Q_LOGGING_CATEGORY(lcConfig, "caelestia.config", QtInfoMsg) +// ConfigObject + ConfigObject::ConfigObject(QObject* parent) : QObject(parent) {} @@ -169,24 +167,6 @@ void ConfigObject::syncFromGlobal(ConfigObject* global) { } } -void ConfigObject::markPropertyLoaded(const QString& name) { - m_loadedKeys.insert(name); -} - -void ConfigObject::resetOption(const QString& name) { - m_loadedKeys.remove(name); - - // If synced from global, re-copy the global value - if (m_global) { - int idx = metaObject()->indexOfProperty(name.toUtf8().constData()); - if (idx >= 0) { - auto prop = metaObject()->property(idx); - if (prop.isWritable()) - prop.write(this, prop.read(m_global)); - } - } -} - void ConfigObject::resyncFromGlobal() { if (!m_global) return; @@ -214,6 +194,24 @@ void ConfigObject::resyncFromGlobal() { } } +void ConfigObject::markPropertyLoaded(const QString& name) { + m_loadedKeys.insert(name); +} + +void ConfigObject::resetOption(const QString& name) { + m_loadedKeys.remove(name); + + // If synced from global, re-copy the global value + if (m_global) { + int idx = metaObject()->indexOfProperty(name.toUtf8().constData()); + if (idx >= 0) { + auto prop = metaObject()->property(idx); + if (prop.isWritable()) + prop.write(this, prop.read(m_global)); + } + } +} + void ConfigObject::onGlobalPropertiesChanged(const QMap& changed) { for (auto it = changed.begin(); it != changed.end(); ++it) { if (m_loadedKeys.contains(it.key())) @@ -222,9 +220,7 @@ void ConfigObject::onGlobalPropertiesChanged(const QMap& chan int idx = metaObject()->indexOfProperty(it.key().toUtf8().constData()); if (idx >= 0) { metaObject()->property(idx).write(this, it.value()); - // Remove the key that was added by markPropertyLoaded in the setter — - // this is a synced value, not an explicit override - m_loadedKeys.remove(it.key()); + m_loadedKeys.remove(it.key()); // setter added it — remove since this is a synced value qCDebug(lcConfig) << metaObject()->className() << "synced" << it.key() << "=" << it.value() << "from global change"; } @@ -253,134 +249,4 @@ void ConfigObject::emitBatchedChanges() { emit propertiesChanged(changes); } -void ConfigObject::setupFileBackend(const QString& path) { - m_filePath = path; - - m_watcher = new QFileSystemWatcher(this); - m_saveTimer = new QTimer(this); - m_cooldownTimer = new QTimer(this); - m_retryTimer = new QTimer(this); - - m_retryTimer->setSingleShot(true); - m_retryTimer->setInterval(50); - connect(m_retryTimer, &QTimer::timeout, this, &ConfigObject::reloadFromFile); - - m_saveTimer->setSingleShot(true); - m_saveTimer->setInterval(500); - connect(m_saveTimer, &QTimer::timeout, this, [this] { - QDir().mkpath(QFileInfo(m_filePath).absolutePath()); - - QFile file(m_filePath); - if (!file.open(QIODevice::WriteOnly)) { - qCWarning(lcConfig, "Failed to write %s", qUtf8Printable(m_filePath)); - if (auto* root = qobject_cast(this)) - emit root->saveFailed(QStringLiteral("Failed to open file for writing")); - return; - } - - auto json = toJsonObject(); - file.write(QJsonDocument(json).toJson(QJsonDocument::Indented)); - file.close(); - if (auto* root = qobject_cast(this)) - emit root->saved(); - }); - - m_cooldownTimer->setSingleShot(true); - m_cooldownTimer->setInterval(2000); - connect(m_cooldownTimer, &QTimer::timeout, this, [this] { - m_recentlySaved = false; - }); - - connect(m_watcher, &QFileSystemWatcher::fileChanged, this, &ConfigObject::onFileChanged); - - qCDebug(lcConfig) << "Setting up file backend for" << metaObject()->className() << "at" << path; - - reloadFromFile(); - - if (QFile::exists(m_filePath)) - m_watcher->addPath(m_filePath); -} - -void ConfigObject::saveToFile() { - if (!m_saveTimer) - return; - m_saveTimer->start(); - m_recentlySaved = true; - m_cooldownTimer->start(); -} - -bool ConfigObject::reloadFromFile() { - QFile file(m_filePath); - - if (!file.open(QIODevice::ReadOnly)) { - qCDebug(lcConfig, "Failed to open %s", qUtf8Printable(m_filePath)); - return false; - } - - QJsonParseError error{}; - auto doc = QJsonDocument::fromJson(file.readAll(), &error); - - if (error.error != QJsonParseError::NoError) { - if (m_retryTimer && m_parseRetries < 3) { - m_parseRetries++; - qCDebug(lcConfig, "Failed to parse %s: %s - retrying (%d/3)", qUtf8Printable(m_filePath), - qUtf8Printable(error.errorString()), m_parseRetries); - m_retryTimer->start(); - } else { - qCWarning( - lcConfig, "Failed to parse %s: %s", qUtf8Printable(m_filePath), qUtf8Printable(error.errorString())); - m_parseRetries = 0; - } - return false; - } - - m_parseRetries = 0; - - qCDebug(lcConfig) << "Reloading" << metaObject()->className() << "from" << m_filePath; - - clearLoadedKeys(); - loadFromJson(doc.object()); - - // Re-sync non-loaded properties from global after reload - if (m_global) { - qCDebug(lcConfig) << "Re-syncing" << metaObject()->className() << "from global after reload"; - resyncFromGlobal(); - } - - return true; -} - -void ConfigObject::onFileChanged() { - if (!m_watcher->files().contains(m_filePath)) - m_watcher->addPath(m_filePath); - - if (!m_recentlySaved) { - m_parseRetries = 0; - if (m_retryTimer) - m_retryTimer->stop(); - - bool ok = reloadFromFile(); - if (auto* root = qobject_cast(this)) { - if (ok) - emit root->loaded(); - else - emit root->loadFailed(QStringLiteral("Failed to load config file")); - } - } -} - -// RootConfig - -RootConfig::RootConfig(QObject* parent) - : ConfigObject(parent) {} - -void RootConfig::save() { - saveToFile(); -} - -void RootConfig::reload() { - if (reloadFromFile()) - emit loaded(); -} - } // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/configobject.hpp b/plugin/src/Caelestia/Config/configobject.hpp index 66df4ac3..4e0cae92 100644 --- a/plugin/src/Caelestia/Config/configobject.hpp +++ b/plugin/src/Caelestia/Config/configobject.hpp @@ -1,6 +1,5 @@ #pragma once -#include #include #include #include @@ -55,14 +54,7 @@ public: void loadFromJson(const QJsonObject& obj); [[nodiscard]] QJsonObject toJsonObject() const; - // File-backed config support. Call setupFileBackend() to enable - // automatic file watching, debounced saving, and reload. - void setupFileBackend(const QString& path); - void saveToFile(); - bool reloadFromFile(); - // Per-monitor overlay support (Qt Resolve Mask pattern). - // Eagerly syncs non-overridden properties from a global ConfigObject. void syncFromGlobal(ConfigObject* global); void resyncFromGlobal(); void clearLoadedKeys(); @@ -71,8 +63,6 @@ public: Q_INVOKABLE void resetOption(const QString& name); - [[nodiscard]] bool recentlySaved() const { return m_recentlySaved; } - template static bool updateMember(T& member, const T& value) { if constexpr (std::is_floating_point_v) { if (qFuzzyCompare(member + 1.0, value + 1.0)) @@ -93,20 +83,9 @@ protected: void notifyPropertyChanged(const QString& name, const QVariant& value); private: - void onFileChanged(); void onGlobalPropertiesChanged(const QMap& changed); void emitBatchedChanges(); - QString m_filePath; - bool m_recentlySaved = false; - - // File backend (heap-allocated only when setupFileBackend is called) - QFileSystemWatcher* m_watcher = nullptr; - QTimer* m_saveTimer = nullptr; - QTimer* m_cooldownTimer = nullptr; - QTimer* m_retryTimer = nullptr; - int m_parseRetries = 0; - // Per-monitor overlay state ConfigObject* m_global = nullptr; QSet m_loadedKeys; @@ -114,22 +93,4 @@ private: QTimer* m_batchTimer = nullptr; }; -// Intermediate base for singleton config roots (GlobalConfig, TokenConfig). -// Provides save/reload with file lifecycle signals. -class RootConfig : public ConfigObject { - Q_OBJECT - -public: - explicit RootConfig(QObject* parent = nullptr); - - Q_INVOKABLE void save(); - Q_INVOKABLE void reload(); - -signals: - void loaded(); - void loadFailed(const QString& error); - void saved(); - void saveFailed(const QString& error); -}; - } // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/rootconfig.cpp b/plugin/src/Caelestia/Config/rootconfig.cpp new file mode 100644 index 00000000..841d01f4 --- /dev/null +++ b/plugin/src/Caelestia/Config/rootconfig.cpp @@ -0,0 +1,127 @@ +#include "rootconfig.hpp" + +#include +#include +#include +#include + +namespace caelestia::config { + +RootConfig::RootConfig(QObject* parent) + : ConfigObject(parent) {} + +void RootConfig::setupFileBackend(const QString& path) { + m_filePath = path; + + m_watcher = new QFileSystemWatcher(this); + m_saveTimer = new QTimer(this); + m_cooldownTimer = new QTimer(this); + m_retryTimer = new QTimer(this); + + m_retryTimer->setSingleShot(true); + m_retryTimer->setInterval(50); + connect(m_retryTimer, &QTimer::timeout, this, &RootConfig::reloadFromFile); + + m_saveTimer->setSingleShot(true); + m_saveTimer->setInterval(500); + connect(m_saveTimer, &QTimer::timeout, this, [this] { + QDir().mkpath(QFileInfo(m_filePath).absolutePath()); + + QFile file(m_filePath); + if (!file.open(QIODevice::WriteOnly)) { + qCWarning(lcConfig, "Failed to write %s", qUtf8Printable(m_filePath)); + emit saveFailed(QStringLiteral("Failed to open file for writing")); + return; + } + + auto json = toJsonObject(); + file.write(QJsonDocument(json).toJson(QJsonDocument::Indented)); + file.close(); + emit saved(); + }); + + m_cooldownTimer->setSingleShot(true); + m_cooldownTimer->setInterval(2000); + connect(m_cooldownTimer, &QTimer::timeout, this, [this] { + m_recentlySaved = false; + }); + + connect(m_watcher, &QFileSystemWatcher::fileChanged, this, &RootConfig::onFileChanged); + + qCDebug(lcConfig) << "Setting up file backend for" << metaObject()->className() << "at" << path; + + reloadFromFile(); + + if (QFile::exists(m_filePath)) + m_watcher->addPath(m_filePath); +} + +void RootConfig::saveToFile() { + if (!m_saveTimer) + return; + m_saveTimer->start(); + m_recentlySaved = true; + m_cooldownTimer->start(); +} + +bool RootConfig::reloadFromFile() { + QFile file(m_filePath); + + if (!file.open(QIODevice::ReadOnly)) { + qCDebug(lcConfig, "Failed to open %s", qUtf8Printable(m_filePath)); + return false; + } + + QJsonParseError error{}; + auto doc = QJsonDocument::fromJson(file.readAll(), &error); + + if (error.error != QJsonParseError::NoError) { + if (m_retryTimer && m_parseRetries < 3) { + m_parseRetries++; + qCDebug(lcConfig, "Failed to parse %s: %s - retrying (%d/3)", qUtf8Printable(m_filePath), + qUtf8Printable(error.errorString()), m_parseRetries); + m_retryTimer->start(); + } else { + qCWarning( + lcConfig, "Failed to parse %s: %s", qUtf8Printable(m_filePath), qUtf8Printable(error.errorString())); + m_parseRetries = 0; + } + return false; + } + + m_parseRetries = 0; + + qCDebug(lcConfig) << "Reloading" << metaObject()->className() << "from" << m_filePath; + + clearLoadedKeys(); + loadFromJson(doc.object()); + + return true; +} + +void RootConfig::onFileChanged() { + if (!m_watcher->files().contains(m_filePath)) + m_watcher->addPath(m_filePath); + + if (!m_recentlySaved) { + m_parseRetries = 0; + if (m_retryTimer) + m_retryTimer->stop(); + + if (reloadFromFile()) + emit loaded(); + else + emit loadFailed(QStringLiteral("Failed to load config file")); + } +} + +void RootConfig::save() { + saveToFile(); +} + +void RootConfig::reload() { + if (reloadFromFile()) + emit loaded(); +} + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/rootconfig.hpp b/plugin/src/Caelestia/Config/rootconfig.hpp new file mode 100644 index 00000000..bb644acd --- /dev/null +++ b/plugin/src/Caelestia/Config/rootconfig.hpp @@ -0,0 +1,46 @@ +#pragma once + +#include "configobject.hpp" + +#include +#include + +namespace caelestia::config { + +// Intermediate base for singleton config roots (GlobalConfig, TokenConfig). +// Provides file-backed persistence, save/reload, and lifecycle signals. +class RootConfig : public ConfigObject { + Q_OBJECT + +public: + explicit RootConfig(QObject* parent = nullptr); + + void setupFileBackend(const QString& path); + void saveToFile(); + bool reloadFromFile(); + + [[nodiscard]] bool recentlySaved() const { return m_recentlySaved; } + + Q_INVOKABLE void save(); + Q_INVOKABLE void reload(); + +signals: + void loaded(); + void loadFailed(const QString& error); + void saved(); + void saveFailed(const QString& error); + +private: + void onFileChanged(); + + QString m_filePath; + bool m_recentlySaved = false; + + QFileSystemWatcher* m_watcher = nullptr; + QTimer* m_saveTimer = nullptr; + QTimer* m_cooldownTimer = nullptr; + QTimer* m_retryTimer = nullptr; + int m_parseRetries = 0; +}; + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/tokens.hpp b/plugin/src/Caelestia/Config/tokens.hpp index 69740aab..231cbb52 100644 --- a/plugin/src/Caelestia/Config/tokens.hpp +++ b/plugin/src/Caelestia/Config/tokens.hpp @@ -2,7 +2,7 @@ #include "anim.hpp" #include "appearanceconfig.hpp" -#include "configobject.hpp" +#include "rootconfig.hpp" #include #include From 24367dfb3ad9d3f99f3f18a23dd044197866503e Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 02:22:06 +1000 Subject: [PATCH 39/81] feat: add config load/fail toasts --- modules/ConfigToasts.qml | 31 +++++++++++++++++++++++++++++++ shell.qml | 1 + 2 files changed, 32 insertions(+) create mode 100644 modules/ConfigToasts.qml diff --git a/modules/ConfigToasts.qml b/modules/ConfigToasts.qml new file mode 100644 index 00000000..7c43e522 --- /dev/null +++ b/modules/ConfigToasts.qml @@ -0,0 +1,31 @@ +import QtQuick +import Quickshell +import Caelestia +import Caelestia.Config + +Scope { + Connections { + function onLoaded(): void { + if (GlobalConfig.utilities.toasts.configLoaded) + Toaster.toast(qsTr("Config loaded"), qsTr("Config loaded successfully!"), "rule_settings"); + } + + function onLoadFailed(error: string): void { + Toaster.toast(qsTr("Failed to read config file"), error, "settings_alert", Toast.Warning); + } + + function onSaveFailed(error: string): void { + Toaster.toast(qsTr("Failed to save config"), error, "settings_alert", Toast.Error); + } + + target: GlobalConfig + } + + Connections { + function onLoadFailed(error: string): void { + Toaster.toast(qsTr("Failed to read token config file"), error, "settings_alert", Toast.Warning); + } + + target: TokenConfig + } +} diff --git a/shell.qml b/shell.qml index 7ef1014d..5ccf61d3 100644 --- a/shell.qml +++ b/shell.qml @@ -19,6 +19,7 @@ ShellRoot { id: lock } + ConfigToasts {} Shortcuts {} BatteryMonitor {} IdleMonitors { From 1ad6f657aeb41eb8cd2ad0c3a7585a4f0a96e984 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 02:30:24 +1000 Subject: [PATCH 40/81] fix: don't emit until final retry Also more descriptive error messages --- plugin/src/Caelestia/Config/rootconfig.cpp | 42 ++++++++++++---------- plugin/src/Caelestia/Config/rootconfig.hpp | 4 ++- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/plugin/src/Caelestia/Config/rootconfig.cpp b/plugin/src/Caelestia/Config/rootconfig.cpp index 841d01f4..193ac472 100644 --- a/plugin/src/Caelestia/Config/rootconfig.cpp +++ b/plugin/src/Caelestia/Config/rootconfig.cpp @@ -20,7 +20,7 @@ void RootConfig::setupFileBackend(const QString& path) { m_retryTimer->setSingleShot(true); m_retryTimer->setInterval(50); - connect(m_retryTimer, &QTimer::timeout, this, &RootConfig::reloadFromFile); + connect(m_retryTimer, &QTimer::timeout, this, &RootConfig::reload); m_saveTimer->setSingleShot(true); m_saveTimer->setInterval(500); @@ -29,8 +29,9 @@ void RootConfig::setupFileBackend(const QString& path) { QFile file(m_filePath); if (!file.open(QIODevice::WriteOnly)) { - qCWarning(lcConfig, "Failed to write %s", qUtf8Printable(m_filePath)); - emit saveFailed(QStringLiteral("Failed to open file for writing")); + auto err = QStringLiteral("Failed to write %1: %2").arg(m_filePath, file.errorString()); + qCWarning(lcConfig, "%s", qUtf8Printable(err)); + emit saveFailed(err); return; } @@ -50,7 +51,7 @@ void RootConfig::setupFileBackend(const QString& path) { qCDebug(lcConfig) << "Setting up file backend for" << metaObject()->className() << "at" << path; - reloadFromFile(); + reload(); if (QFile::exists(m_filePath)) m_watcher->addPath(m_filePath); @@ -64,12 +65,13 @@ void RootConfig::saveToFile() { m_cooldownTimer->start(); } -bool RootConfig::reloadFromFile() { +std::optional RootConfig::reloadFromFile() { QFile file(m_filePath); if (!file.open(QIODevice::ReadOnly)) { - qCDebug(lcConfig, "Failed to open %s", qUtf8Printable(m_filePath)); - return false; + auto err = QStringLiteral("Failed to open %1: %2").arg(m_filePath, file.errorString()); + qCDebug(lcConfig, "%s", qUtf8Printable(err)); + return err; } QJsonParseError error{}; @@ -81,12 +83,12 @@ bool RootConfig::reloadFromFile() { qCDebug(lcConfig, "Failed to parse %s: %s - retrying (%d/3)", qUtf8Printable(m_filePath), qUtf8Printable(error.errorString()), m_parseRetries); m_retryTimer->start(); - } else { - qCWarning( - lcConfig, "Failed to parse %s: %s", qUtf8Printable(m_filePath), qUtf8Printable(error.errorString())); - m_parseRetries = 0; + return std::nullopt; // pending retry — no signal } - return false; + + qCWarning(lcConfig, "Failed to parse %s: %s", qUtf8Printable(m_filePath), qUtf8Printable(error.errorString())); + m_parseRetries = 0; + return error.errorString(); } m_parseRetries = 0; @@ -96,7 +98,7 @@ bool RootConfig::reloadFromFile() { clearLoadedKeys(); loadFromJson(doc.object()); - return true; + return QString(); // success } void RootConfig::onFileChanged() { @@ -108,10 +110,7 @@ void RootConfig::onFileChanged() { if (m_retryTimer) m_retryTimer->stop(); - if (reloadFromFile()) - emit loaded(); - else - emit loadFailed(QStringLiteral("Failed to load config file")); + reload(); } } @@ -120,8 +119,13 @@ void RootConfig::save() { } void RootConfig::reload() { - if (reloadFromFile()) - emit loaded(); + auto result = reloadFromFile(); + if (result.has_value()) { + if (result->isEmpty()) + emit loaded(); + else + emit loadFailed(*result); + } } } // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/rootconfig.hpp b/plugin/src/Caelestia/Config/rootconfig.hpp index bb644acd..cfb1f82b 100644 --- a/plugin/src/Caelestia/Config/rootconfig.hpp +++ b/plugin/src/Caelestia/Config/rootconfig.hpp @@ -2,6 +2,7 @@ #include "configobject.hpp" +#include #include #include @@ -17,7 +18,8 @@ public: void setupFileBackend(const QString& path); void saveToFile(); - bool reloadFromFile(); + // Returns nullopt if retrying, empty string on success, error message on failure. + [[nodiscard]] std::optional reloadFromFile(); [[nodiscard]] bool recentlySaved() const { return m_recentlySaved; } From b987a39d795d61ad69d450ce7bc5b6d739ab4e4d Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 02:33:29 +1000 Subject: [PATCH 41/81] feat: debounce reloads --- plugin/src/Caelestia/Config/rootconfig.cpp | 14 +++++++------- plugin/src/Caelestia/Config/rootconfig.hpp | 1 + 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/plugin/src/Caelestia/Config/rootconfig.cpp b/plugin/src/Caelestia/Config/rootconfig.cpp index 193ac472..bab8e4b8 100644 --- a/plugin/src/Caelestia/Config/rootconfig.cpp +++ b/plugin/src/Caelestia/Config/rootconfig.cpp @@ -47,6 +47,11 @@ void RootConfig::setupFileBackend(const QString& path) { m_recentlySaved = false; }); + m_reloadDebounce = new QTimer(this); + m_reloadDebounce->setSingleShot(true); + m_reloadDebounce->setInterval(50); + connect(m_reloadDebounce, &QTimer::timeout, this, &RootConfig::reload); + connect(m_watcher, &QFileSystemWatcher::fileChanged, this, &RootConfig::onFileChanged); qCDebug(lcConfig) << "Setting up file backend for" << metaObject()->className() << "at" << path; @@ -105,13 +110,8 @@ void RootConfig::onFileChanged() { if (!m_watcher->files().contains(m_filePath)) m_watcher->addPath(m_filePath); - if (!m_recentlySaved) { - m_parseRetries = 0; - if (m_retryTimer) - m_retryTimer->stop(); - - reload(); - } + if (!m_recentlySaved) + m_reloadDebounce->start(); } void RootConfig::save() { diff --git a/plugin/src/Caelestia/Config/rootconfig.hpp b/plugin/src/Caelestia/Config/rootconfig.hpp index cfb1f82b..fc9eabae 100644 --- a/plugin/src/Caelestia/Config/rootconfig.hpp +++ b/plugin/src/Caelestia/Config/rootconfig.hpp @@ -42,6 +42,7 @@ private: QTimer* m_saveTimer = nullptr; QTimer* m_cooldownTimer = nullptr; QTimer* m_retryTimer = nullptr; + QTimer* m_reloadDebounce = nullptr; int m_parseRetries = 0; }; From 3e1b235a75872059d1ff84a87c795e24fe42db6a Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 02:41:42 +1000 Subject: [PATCH 42/81] feat: watch parent dirs recursively for changes --- plugin/src/Caelestia/Config/rootconfig.cpp | 64 ++++++++++++++++++---- plugin/src/Caelestia/Config/rootconfig.hpp | 4 +- 2 files changed, 56 insertions(+), 12 deletions(-) diff --git a/plugin/src/Caelestia/Config/rootconfig.cpp b/plugin/src/Caelestia/Config/rootconfig.cpp index bab8e4b8..79eaf37e 100644 --- a/plugin/src/Caelestia/Config/rootconfig.cpp +++ b/plugin/src/Caelestia/Config/rootconfig.cpp @@ -4,9 +4,18 @@ #include #include #include +#include namespace caelestia::config { +namespace { + +QString watchRoot() { + return QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation); +} + +} // namespace + RootConfig::RootConfig(QObject* parent) : ConfigObject(parent) {} @@ -38,6 +47,10 @@ void RootConfig::setupFileBackend(const QString& path) { auto json = toJsonObject(); file.write(QJsonDocument(json).toJson(QJsonDocument::Indented)); file.close(); + + // Update watches — save may have created directories + updateWatch(); + emit saved(); }); @@ -52,14 +65,51 @@ void RootConfig::setupFileBackend(const QString& path) { m_reloadDebounce->setInterval(50); connect(m_reloadDebounce, &QTimer::timeout, this, &RootConfig::reload); - connect(m_watcher, &QFileSystemWatcher::fileChanged, this, &RootConfig::onFileChanged); + connect(m_watcher, &QFileSystemWatcher::directoryChanged, this, &RootConfig::onWatcherEvent); + connect(m_watcher, &QFileSystemWatcher::fileChanged, this, &RootConfig::onWatcherEvent); qCDebug(lcConfig) << "Setting up file backend for" << metaObject()->className() << "at" << path; + updateWatch(); reload(); +} - if (QFile::exists(m_filePath)) - m_watcher->addPath(m_filePath); +void RootConfig::updateWatch() { + auto targetDir = QFileInfo(m_filePath).absolutePath(); + + // Find the nearest existing directory, walking up toward the watch root + auto dir = targetDir; + while (!QFile::exists(dir) && dir != watchRoot() && !dir.isEmpty()) { + auto parent = QFileInfo(dir).absolutePath(); + if (parent == dir) + break; // reached filesystem root + dir = parent; + } + + // Update directory watch if it changed + if (dir != m_watchedDir) { + if (!m_watchedDir.isEmpty()) + m_watcher->removePath(m_watchedDir); + + m_watchedDir = dir; + + if (QFile::exists(dir)) + m_watcher->addPath(dir); + } + + // Watch the file itself if it exists (for in-place modifications) + if (QFile::exists(m_filePath)) { + if (!m_watcher->files().contains(m_filePath)) + m_watcher->addPath(m_filePath); + } +} + +void RootConfig::onWatcherEvent() { + // Re-evaluate what to watch — directories may have been created or deleted + updateWatch(); + + if (!m_recentlySaved) + m_reloadDebounce->start(); } void RootConfig::saveToFile() { @@ -106,14 +156,6 @@ std::optional RootConfig::reloadFromFile() { return QString(); // success } -void RootConfig::onFileChanged() { - if (!m_watcher->files().contains(m_filePath)) - m_watcher->addPath(m_filePath); - - if (!m_recentlySaved) - m_reloadDebounce->start(); -} - void RootConfig::save() { saveToFile(); } diff --git a/plugin/src/Caelestia/Config/rootconfig.hpp b/plugin/src/Caelestia/Config/rootconfig.hpp index fc9eabae..18489547 100644 --- a/plugin/src/Caelestia/Config/rootconfig.hpp +++ b/plugin/src/Caelestia/Config/rootconfig.hpp @@ -33,9 +33,11 @@ signals: void saveFailed(const QString& error); private: - void onFileChanged(); + void updateWatch(); + void onWatcherEvent(); QString m_filePath; + QString m_watchedDir; bool m_recentlySaved = false; QFileSystemWatcher* m_watcher = nullptr; From ef00097a51af86ef32015ad7571ac016559b91b4 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 02:46:42 +1000 Subject: [PATCH 43/81] feat: improve error toasts --- modules/ConfigToasts.qml | 4 ++-- plugin/src/Caelestia/Config/rootconfig.cpp | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/modules/ConfigToasts.qml b/modules/ConfigToasts.qml index 7c43e522..2e0f5fec 100644 --- a/modules/ConfigToasts.qml +++ b/modules/ConfigToasts.qml @@ -11,7 +11,7 @@ Scope { } function onLoadFailed(error: string): void { - Toaster.toast(qsTr("Failed to read config file"), error, "settings_alert", Toast.Warning); + Toaster.toast(qsTr("Failed to parse config"), error, "settings_alert", Toast.Warning); } function onSaveFailed(error: string): void { @@ -23,7 +23,7 @@ Scope { Connections { function onLoadFailed(error: string): void { - Toaster.toast(qsTr("Failed to read token config file"), error, "settings_alert", Toast.Warning); + Toaster.toast(qsTr("Failed to parse token config"), error, "settings_alert", Toast.Warning); } target: TokenConfig diff --git a/plugin/src/Caelestia/Config/rootconfig.cpp b/plugin/src/Caelestia/Config/rootconfig.cpp index 79eaf37e..bc3d1cdc 100644 --- a/plugin/src/Caelestia/Config/rootconfig.cpp +++ b/plugin/src/Caelestia/Config/rootconfig.cpp @@ -123,6 +123,11 @@ void RootConfig::saveToFile() { std::optional RootConfig::reloadFromFile() { QFile file(m_filePath); + if (!file.exists()) { + qCDebug(lcConfig) << "File does not exist:" << m_filePath; + return std::nullopt; + } + if (!file.open(QIODevice::ReadOnly)) { auto err = QStringLiteral("Failed to open %1: %2").arg(m_filePath, file.errorString()); qCDebug(lcConfig, "%s", qUtf8Printable(err)); @@ -143,7 +148,7 @@ std::optional RootConfig::reloadFromFile() { qCWarning(lcConfig, "Failed to parse %s: %s", qUtf8Printable(m_filePath), qUtf8Printable(error.errorString())); m_parseRetries = 0; - return error.errorString(); + return QStringLiteral("JSON parse error: %1").arg(error.errorString()); } m_parseRetries = 0; From ee9dce02682cf0203a1e402cd9cf04a575597169 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 03:01:58 +1000 Subject: [PATCH 44/81] fix: propagate per monitor overlay signals to main --- modules/ConfigToasts.qml | 12 ++++++------ plugin/src/Caelestia/Config/config.cpp | 6 +++--- plugin/src/Caelestia/Config/config.hpp | 3 ++- .../Caelestia/Config/monitorconfigmanager.cpp | 17 +++++++++++++++-- plugin/src/Caelestia/Config/rootconfig.cpp | 11 ++++++----- plugin/src/Caelestia/Config/rootconfig.hpp | 11 ++++++----- plugin/src/Caelestia/Config/tokens.cpp | 6 +++--- plugin/src/Caelestia/Config/tokens.hpp | 3 ++- 8 files changed, 43 insertions(+), 26 deletions(-) diff --git a/modules/ConfigToasts.qml b/modules/ConfigToasts.qml index 2e0f5fec..bcba7a7d 100644 --- a/modules/ConfigToasts.qml +++ b/modules/ConfigToasts.qml @@ -10,20 +10,20 @@ Scope { Toaster.toast(qsTr("Config loaded"), qsTr("Config loaded successfully!"), "rule_settings"); } - function onLoadFailed(error: string): void { - Toaster.toast(qsTr("Failed to parse config"), error, "settings_alert", Toast.Warning); + function onLoadFailed(error: string, screen: string): void { + Toaster.toast(qsTr("Failed to parse config%1").arg(screen ? " for " + screen : ""), error, "settings_alert", Toast.Warning); } - function onSaveFailed(error: string): void { - Toaster.toast(qsTr("Failed to save config"), error, "settings_alert", Toast.Error); + function onSaveFailed(error: string, screen: string): void { + Toaster.toast(qsTr("Failed to save config%1").arg(screen ? " for " + screen : ""), error, "settings_alert", Toast.Error); } target: GlobalConfig } Connections { - function onLoadFailed(error: string): void { - Toaster.toast(qsTr("Failed to parse token config"), error, "settings_alert", Toast.Warning); + function onLoadFailed(error: string, screen: string): void { + Toaster.toast(qsTr("Failed to parse token config%1").arg(screen ? "for " + screen : ""), error, "settings_alert", Toast.Warning); } target: TokenConfig diff --git a/plugin/src/Caelestia/Config/config.cpp b/plugin/src/Caelestia/Config/config.cpp index 7ae638d9..8a7a5c02 100644 --- a/plugin/src/Caelestia/Config/config.cpp +++ b/plugin/src/Caelestia/Config/config.cpp @@ -37,7 +37,7 @@ GlobalConfig::GlobalConfig(QObject* parent) setupFileBackend(configDir() + QStringLiteral("shell.json")); } -GlobalConfig::GlobalConfig(GlobalConfig* fallback, const QString& filePath, QObject* parent) +GlobalConfig::GlobalConfig(GlobalConfig* fallback, const QString& filePath, const QString& screen, QObject* parent) : RootConfig(parent) , m_appearance(new AppearanceConfig(this)) , m_general(new GeneralConfig(this)) @@ -57,7 +57,7 @@ GlobalConfig::GlobalConfig(GlobalConfig* fallback, const QString& filePath, QObj , m_services(new ServiceConfig(this)) , m_paths(new UserPaths(this)) { if (!filePath.isEmpty()) - setupFileBackend(filePath); + setupFileBackend(filePath, screen); if (fallback) syncFromGlobal(fallback); @@ -73,7 +73,7 @@ GlobalConfig* GlobalConfig::instance() { GlobalConfig* GlobalConfig::defaults() { if (!m_defaults) - m_defaults = new GlobalConfig(nullptr, QString(), this); // Non-singleton constructor + m_defaults = new GlobalConfig(nullptr, QString(), QString(), this); return m_defaults; } diff --git a/plugin/src/Caelestia/Config/config.hpp b/plugin/src/Caelestia/Config/config.hpp index 1a989143..06f5e3e4 100644 --- a/plugin/src/Caelestia/Config/config.hpp +++ b/plugin/src/Caelestia/Config/config.hpp @@ -56,7 +56,8 @@ public: private: friend class MonitorConfigManager; explicit GlobalConfig(QObject* parent = nullptr); - explicit GlobalConfig(GlobalConfig* fallback, const QString& filePath, QObject* parent = nullptr); + explicit GlobalConfig( + GlobalConfig* fallback, const QString& filePath, const QString& screen = {}, QObject* parent = nullptr); GlobalConfig* m_defaults = nullptr; bool m_tokensBound = false; diff --git a/plugin/src/Caelestia/Config/monitorconfigmanager.cpp b/plugin/src/Caelestia/Config/monitorconfigmanager.cpp index 473b6567..3746097f 100644 --- a/plugin/src/Caelestia/Config/monitorconfigmanager.cpp +++ b/plugin/src/Caelestia/Config/monitorconfigmanager.cpp @@ -32,7 +32,13 @@ GlobalConfig* MonitorConfigManager::configForScreen(const QString& screen) { auto& overlay = m_overlays[screen]; if (!overlay.config) { auto dir = monitorConfigDir(screen); - overlay.config = new GlobalConfig(GlobalConfig::instance(), dir + QStringLiteral("shell.json"), this); + overlay.config = new GlobalConfig(GlobalConfig::instance(), dir + QStringLiteral("shell.json"), screen, this); + + auto* const global = GlobalConfig::instance(); + connect(overlay.config, &GlobalConfig::loaded, global, &GlobalConfig::loaded); + connect(overlay.config, &GlobalConfig::saved, global, &GlobalConfig::saved); + connect(overlay.config, &GlobalConfig::loadFailed, global, &GlobalConfig::loadFailed); + connect(overlay.config, &GlobalConfig::saveFailed, global, &GlobalConfig::saveFailed); } return overlay.config; } @@ -41,7 +47,14 @@ TokenConfig* MonitorConfigManager::tokensForScreen(const QString& screen) { auto& overlay = m_overlays[screen]; if (!overlay.tokens) { auto dir = monitorConfigDir(screen); - overlay.tokens = new TokenConfig(TokenConfig::instance(), dir + QStringLiteral("shell-tokens.json"), this); + overlay.tokens = + new TokenConfig(TokenConfig::instance(), dir + QStringLiteral("shell-tokens.json"), screen, this); + + auto* const global = TokenConfig::instance(); + connect(overlay.tokens, &TokenConfig::loaded, global, &TokenConfig::loaded); + connect(overlay.tokens, &TokenConfig::saved, global, &TokenConfig::saved); + connect(overlay.tokens, &TokenConfig::loadFailed, global, &TokenConfig::loadFailed); + connect(overlay.tokens, &TokenConfig::saveFailed, global, &TokenConfig::saveFailed); } return overlay.tokens; } diff --git a/plugin/src/Caelestia/Config/rootconfig.cpp b/plugin/src/Caelestia/Config/rootconfig.cpp index bc3d1cdc..fd90122a 100644 --- a/plugin/src/Caelestia/Config/rootconfig.cpp +++ b/plugin/src/Caelestia/Config/rootconfig.cpp @@ -19,8 +19,9 @@ QString watchRoot() { RootConfig::RootConfig(QObject* parent) : ConfigObject(parent) {} -void RootConfig::setupFileBackend(const QString& path) { +void RootConfig::setupFileBackend(const QString& path, const QString& screen) { m_filePath = path; + m_screen = screen; m_watcher = new QFileSystemWatcher(this); m_saveTimer = new QTimer(this); @@ -40,7 +41,7 @@ void RootConfig::setupFileBackend(const QString& path) { if (!file.open(QIODevice::WriteOnly)) { auto err = QStringLiteral("Failed to write %1: %2").arg(m_filePath, file.errorString()); qCWarning(lcConfig, "%s", qUtf8Printable(err)); - emit saveFailed(err); + emit saveFailed(err, m_screen); return; } @@ -51,7 +52,7 @@ void RootConfig::setupFileBackend(const QString& path) { // Update watches — save may have created directories updateWatch(); - emit saved(); + emit saved(m_screen); }); m_cooldownTimer->setSingleShot(true); @@ -169,9 +170,9 @@ void RootConfig::reload() { auto result = reloadFromFile(); if (result.has_value()) { if (result->isEmpty()) - emit loaded(); + emit loaded(m_screen); else - emit loadFailed(*result); + emit loadFailed(*result, m_screen); } } diff --git a/plugin/src/Caelestia/Config/rootconfig.hpp b/plugin/src/Caelestia/Config/rootconfig.hpp index 18489547..a7a0c72b 100644 --- a/plugin/src/Caelestia/Config/rootconfig.hpp +++ b/plugin/src/Caelestia/Config/rootconfig.hpp @@ -16,7 +16,7 @@ class RootConfig : public ConfigObject { public: explicit RootConfig(QObject* parent = nullptr); - void setupFileBackend(const QString& path); + void setupFileBackend(const QString& path, const QString& screen = {}); void saveToFile(); // Returns nullopt if retrying, empty string on success, error message on failure. [[nodiscard]] std::optional reloadFromFile(); @@ -27,16 +27,17 @@ public: Q_INVOKABLE void reload(); signals: - void loaded(); - void loadFailed(const QString& error); - void saved(); - void saveFailed(const QString& error); + void loaded(const QString& screen); + void loadFailed(const QString& error, const QString& screen); + void saved(const QString& screen); + void saveFailed(const QString& error, const QString& screen); private: void updateWatch(); void onWatcherEvent(); QString m_filePath; + QString m_screen; QString m_watchedDir; bool m_recentlySaved = false; diff --git a/plugin/src/Caelestia/Config/tokens.cpp b/plugin/src/Caelestia/Config/tokens.cpp index 74cd827b..3f800071 100644 --- a/plugin/src/Caelestia/Config/tokens.cpp +++ b/plugin/src/Caelestia/Config/tokens.cpp @@ -22,12 +22,12 @@ TokenConfig::TokenConfig(QObject* parent) setupFileBackend(configDir() + QStringLiteral("shell-tokens.json")); } -TokenConfig::TokenConfig(TokenConfig* fallback, const QString& filePath, QObject* parent) +TokenConfig::TokenConfig(TokenConfig* fallback, const QString& filePath, const QString& screen, QObject* parent) : RootConfig(parent) , m_appearance(new AppearanceTokens(this)) , m_sizes(new SizeTokens(this)) { if (!filePath.isEmpty()) - setupFileBackend(filePath); + setupFileBackend(filePath, screen); if (fallback) syncFromGlobal(fallback); } @@ -39,7 +39,7 @@ TokenConfig* TokenConfig::instance() { TokenConfig* TokenConfig::defaults() { if (!m_defaults) - m_defaults = new TokenConfig(nullptr, QString(), this); // Non-singleton constructor + m_defaults = new TokenConfig(nullptr, QString(), QString(), this); return m_defaults; } diff --git a/plugin/src/Caelestia/Config/tokens.hpp b/plugin/src/Caelestia/Config/tokens.hpp index 231cbb52..462d3f62 100644 --- a/plugin/src/Caelestia/Config/tokens.hpp +++ b/plugin/src/Caelestia/Config/tokens.hpp @@ -335,7 +335,8 @@ public: private: friend class MonitorConfigManager; explicit TokenConfig(QObject* parent = nullptr); - explicit TokenConfig(TokenConfig* fallback, const QString& filePath, QObject* parent = nullptr); + explicit TokenConfig( + TokenConfig* fallback, const QString& filePath, const QString& screen = {}, QObject* parent = nullptr); TokenConfig* m_defaults = nullptr; }; From 5a13cc22f618c65719e5bc53fcc97d0079a285b7 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 03:12:13 +1000 Subject: [PATCH 45/81] feat: add unknown option toasts --- modules/ConfigToasts.qml | 8 ++++ .../Caelestia/Config/monitorconfigmanager.cpp | 2 + plugin/src/Caelestia/Config/rootconfig.cpp | 38 ++++++++++++++++++- plugin/src/Caelestia/Config/rootconfig.hpp | 2 + 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/modules/ConfigToasts.qml b/modules/ConfigToasts.qml index bcba7a7d..81463b8d 100644 --- a/modules/ConfigToasts.qml +++ b/modules/ConfigToasts.qml @@ -18,6 +18,10 @@ Scope { Toaster.toast(qsTr("Failed to save config%1").arg(screen ? " for " + screen : ""), error, "settings_alert", Toast.Error); } + function onUnknownOption(key: string, screen: string): void { + Toaster.toast(qsTr("Unknown option in%1 config").arg(screen ? " " + screen : ""), key, "question_mark", Toast.Warning); + } + target: GlobalConfig } @@ -26,6 +30,10 @@ Scope { Toaster.toast(qsTr("Failed to parse token config%1").arg(screen ? "for " + screen : ""), error, "settings_alert", Toast.Warning); } + function onUnknownOption(key: string, screen: string): void { + Toaster.toast(qsTr("Unknown option in%1 token config").arg(screen ? " " + screen : ""), key, "question_mark", Toast.Warning); + } + target: TokenConfig } } diff --git a/plugin/src/Caelestia/Config/monitorconfigmanager.cpp b/plugin/src/Caelestia/Config/monitorconfigmanager.cpp index 3746097f..fb1745ec 100644 --- a/plugin/src/Caelestia/Config/monitorconfigmanager.cpp +++ b/plugin/src/Caelestia/Config/monitorconfigmanager.cpp @@ -39,6 +39,7 @@ GlobalConfig* MonitorConfigManager::configForScreen(const QString& screen) { connect(overlay.config, &GlobalConfig::saved, global, &GlobalConfig::saved); connect(overlay.config, &GlobalConfig::loadFailed, global, &GlobalConfig::loadFailed); connect(overlay.config, &GlobalConfig::saveFailed, global, &GlobalConfig::saveFailed); + connect(overlay.config, &GlobalConfig::unknownOption, global, &GlobalConfig::unknownOption); } return overlay.config; } @@ -55,6 +56,7 @@ TokenConfig* MonitorConfigManager::tokensForScreen(const QString& screen) { connect(overlay.tokens, &TokenConfig::saved, global, &TokenConfig::saved); connect(overlay.tokens, &TokenConfig::loadFailed, global, &TokenConfig::loadFailed); connect(overlay.tokens, &TokenConfig::saveFailed, global, &TokenConfig::saveFailed); + connect(overlay.tokens, &TokenConfig::unknownOption, global, &TokenConfig::unknownOption); } return overlay.tokens; } diff --git a/plugin/src/Caelestia/Config/rootconfig.cpp b/plugin/src/Caelestia/Config/rootconfig.cpp index fd90122a..8a10c950 100644 --- a/plugin/src/Caelestia/Config/rootconfig.cpp +++ b/plugin/src/Caelestia/Config/rootconfig.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include namespace caelestia::config { @@ -19,6 +20,35 @@ QString watchRoot() { RootConfig::RootConfig(QObject* parent) : ConfigObject(parent) {} +QStringList RootConfig::collectUnknownKeys(const ConfigObject* obj, const QJsonObject& json) { + QStringList unknown; + const auto* meta = obj->metaObject(); + + QSet known; + for (int i = meta->propertyOffset(); i < meta->propertyCount(); ++i) + known.insert(QString::fromUtf8(meta->property(i).name())); + + for (auto it = json.begin(); it != json.end(); ++it) { + if (!known.contains(it.key())) { + unknown.append(it.key()); + } else if (it.value().isObject()) { + int idx = meta->indexOfProperty(it.key().toUtf8().constData()); + if (idx >= 0) { + auto prop = meta->property(idx); + auto value = prop.read(obj); + auto* subObj = value.value(); + if (subObj) { + const auto subUnknown = collectUnknownKeys(subObj, it.value().toObject()); + for (const auto& subKey : subUnknown) + unknown.append(it.key() + QStringLiteral(".") + subKey); + } + } + } + } + + return unknown; +} + void RootConfig::setupFileBackend(const QString& path, const QString& screen) { m_filePath = path; m_screen = screen; @@ -157,7 +187,13 @@ std::optional RootConfig::reloadFromFile() { qCDebug(lcConfig) << "Reloading" << metaObject()->className() << "from" << m_filePath; clearLoadedKeys(); - loadFromJson(doc.object()); + + auto jsonObj = doc.object(); + const auto unknownKeys = collectUnknownKeys(this, jsonObj); + for (const auto& key : unknownKeys) + emit unknownOption(key, m_screen); + + loadFromJson(jsonObj); return QString(); // success } diff --git a/plugin/src/Caelestia/Config/rootconfig.hpp b/plugin/src/Caelestia/Config/rootconfig.hpp index a7a0c72b..25b69002 100644 --- a/plugin/src/Caelestia/Config/rootconfig.hpp +++ b/plugin/src/Caelestia/Config/rootconfig.hpp @@ -31,8 +31,10 @@ signals: void loadFailed(const QString& error, const QString& screen); void saved(const QString& screen); void saveFailed(const QString& error, const QString& screen); + void unknownOption(const QString& key, const QString& screen); private: + static QStringList collectUnknownKeys(const ConfigObject* obj, const QJsonObject& json); void updateWatch(); void onWatcherEvent(); From bea72b4a640786c84495705bf7cd9af09111c1b8 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 03:20:25 +1000 Subject: [PATCH 46/81] feat: emit signals on startup Except loaded signal --- plugin/src/Caelestia/Config/rootconfig.cpp | 37 +++++++++++++++------- plugin/src/Caelestia/Config/rootconfig.hpp | 2 ++ 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/plugin/src/Caelestia/Config/rootconfig.cpp b/plugin/src/Caelestia/Config/rootconfig.cpp index 8a10c950..611abd57 100644 --- a/plugin/src/Caelestia/Config/rootconfig.cpp +++ b/plugin/src/Caelestia/Config/rootconfig.cpp @@ -102,7 +102,13 @@ void RootConfig::setupFileBackend(const QString& path, const QString& screen) { qCDebug(lcConfig) << "Setting up file backend for" << metaObject()->className() << "at" << path; updateWatch(); - reload(); + + // Load immediately so values are available during construction. + // Defer signal emissions to next event loop tick so QML has time to connect. + auto result = reloadFromFile(); + QTimer::singleShot(0, this, [this, result] { + emitLoadSignals(result, false); + }); } void RootConfig::updateWatch() { @@ -189,12 +195,11 @@ std::optional RootConfig::reloadFromFile() { clearLoadedKeys(); auto jsonObj = doc.object(); - const auto unknownKeys = collectUnknownKeys(this, jsonObj); - for (const auto& key : unknownKeys) - emit unknownOption(key, m_screen); - loadFromJson(jsonObj); + // Collect unknown keys — caller is responsible for emitting signals + m_lastUnknownKeys = collectUnknownKeys(this, jsonObj); + return QString(); // success } @@ -202,14 +207,24 @@ void RootConfig::save() { saveToFile(); } -void RootConfig::reload() { - auto result = reloadFromFile(); - if (result.has_value()) { - if (result->isEmpty()) +void RootConfig::emitLoadSignals(const std::optional& result, bool emitLoaded) { + if (!result.has_value()) + return; + + for (const auto& key : std::as_const(m_lastUnknownKeys)) + emit unknownOption(key, m_screen); + m_lastUnknownKeys.clear(); + + if (result->isEmpty()) { + if (emitLoaded) emit loaded(m_screen); - else - emit loadFailed(*result, m_screen); + } else { + emit loadFailed(*result, m_screen); } } +void RootConfig::reload() { + emitLoadSignals(reloadFromFile()); +} + } // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/rootconfig.hpp b/plugin/src/Caelestia/Config/rootconfig.hpp index 25b69002..fb6a68b5 100644 --- a/plugin/src/Caelestia/Config/rootconfig.hpp +++ b/plugin/src/Caelestia/Config/rootconfig.hpp @@ -35,6 +35,7 @@ signals: private: static QStringList collectUnknownKeys(const ConfigObject* obj, const QJsonObject& json); + void emitLoadSignals(const std::optional& result, bool emitLoaded = true); void updateWatch(); void onWatcherEvent(); @@ -49,6 +50,7 @@ private: QTimer* m_retryTimer = nullptr; QTimer* m_reloadDebounce = nullptr; int m_parseRetries = 0; + QStringList m_lastUnknownKeys; }; } // namespace caelestia::config From 41ba4f62714fda70c1ce60985ac0c0612ad397a2 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 03:39:58 +1000 Subject: [PATCH 47/81] feat: add per monitor enabled prop Enabled prop should be used in favour of general.excludedScreens. The latter has been removed --- README.md | 1 + plugin/src/Caelestia/Config/config.cpp | 9 +++++++++ plugin/src/Caelestia/Config/config.hpp | 4 ++++ plugin/src/Caelestia/Config/generalconfig.hpp | 1 - plugin/src/Caelestia/Config/tokens.cpp | 9 +++++++++ plugin/src/Caelestia/Config/tokens.hpp | 3 +++ services/Screens.qml | 9 ++------- 7 files changed, 28 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 8c6763bd..d7e4c7c6 100644 --- a/README.md +++ b/README.md @@ -238,6 +238,7 @@ For example, to disable the bar on DP-1: ```json { + "enabled": true, "appearance": { "anim": { "durations": { diff --git a/plugin/src/Caelestia/Config/config.cpp b/plugin/src/Caelestia/Config/config.cpp index 8a7a5c02..b68f4247 100644 --- a/plugin/src/Caelestia/Config/config.cpp +++ b/plugin/src/Caelestia/Config/config.cpp @@ -1,5 +1,6 @@ #include "config.hpp" #include "configscope.hpp" +#include "monitorconfigmanager.hpp" #include "tokens.hpp" #include @@ -91,6 +92,10 @@ void GlobalConfig::bindAppearanceTokens() { m_tokensBound = true; } +GlobalConfig* GlobalConfig::forScreen(const QString& screen) { + return MonitorConfigManager::instance()->configForScreen(screen); +} + GlobalConfig* GlobalConfig::create(QQmlEngine*, QJSEngine*) { QQmlEngine::setObjectOwnership(instance(), QQmlEngine::CppOwnership); return instance(); @@ -139,6 +144,10 @@ CONFIG_ATTACHED_GETTER(UserPaths, paths) #undef CONFIG_ATTACHED_GETTER +GlobalConfig* Config::forScreen(const QString& screen) { + return GlobalConfig::forScreen(screen); +} + Config* Config::qmlAttachedProperties(QObject* object) { return new Config(ConfigScope::find(object), object); } diff --git a/plugin/src/Caelestia/Config/config.hpp b/plugin/src/Caelestia/Config/config.hpp index 06f5e3e4..1c34f039 100644 --- a/plugin/src/Caelestia/Config/config.hpp +++ b/plugin/src/Caelestia/Config/config.hpp @@ -28,6 +28,7 @@ class GlobalConfig : public RootConfig { QML_ELEMENT QML_SINGLETON + CONFIG_PROPERTY(bool, enabled, true) CONFIG_SUBOBJECT(AppearanceConfig, appearance) CONFIG_SUBOBJECT(GeneralConfig, general) CONFIG_SUBOBJECT(BackgroundConfig, background) @@ -49,6 +50,7 @@ class GlobalConfig : public RootConfig { public: static GlobalConfig* instance(); [[nodiscard]] Q_INVOKABLE GlobalConfig* defaults(); + [[nodiscard]] Q_INVOKABLE static GlobalConfig* forScreen(const QString& screen); static GlobalConfig* create(QQmlEngine*, QJSEngine*); void bindAppearanceTokens(); @@ -114,6 +116,8 @@ public: [[nodiscard]] const ServiceConfig* services() const; [[nodiscard]] const UserPaths* paths() const; + [[nodiscard]] Q_INVOKABLE static GlobalConfig* forScreen(const QString& screen); + static Config* qmlAttachedProperties(QObject* object); signals: diff --git a/plugin/src/Caelestia/Config/generalconfig.hpp b/plugin/src/Caelestia/Config/generalconfig.hpp index 24982e61..32b7df1e 100644 --- a/plugin/src/Caelestia/Config/generalconfig.hpp +++ b/plugin/src/Caelestia/Config/generalconfig.hpp @@ -52,7 +52,6 @@ class GeneralConfig : public ConfigObject { QML_ANONYMOUS CONFIG_PROPERTY(QString, logo) - CONFIG_PROPERTY(QStringList, excludedScreens) CONFIG_PROPERTY(qreal, mediaGifSpeedAdjustment, 300) CONFIG_PROPERTY(qreal, sessionGifSpeed, 0.7) CONFIG_SUBOBJECT(GeneralApps, apps) diff --git a/plugin/src/Caelestia/Config/tokens.cpp b/plugin/src/Caelestia/Config/tokens.cpp index 3f800071..84d3cef7 100644 --- a/plugin/src/Caelestia/Config/tokens.cpp +++ b/plugin/src/Caelestia/Config/tokens.cpp @@ -1,6 +1,7 @@ #include "tokens.hpp" #include "config.hpp" #include "configscope.hpp" +#include "monitorconfigmanager.hpp" #include #include @@ -43,6 +44,10 @@ TokenConfig* TokenConfig::defaults() { return m_defaults; } +TokenConfig* TokenConfig::forScreen(const QString& screen) { + return MonitorConfigManager::instance()->tokensForScreen(screen); +} + TokenConfig* TokenConfig::create(QQmlEngine*, QJSEngine*) { QQmlEngine::setObjectOwnership(instance(), QQmlEngine::CppOwnership); return instance(); @@ -119,6 +124,10 @@ const SizeTokens* Tokens::sizes() const { return global ? global->sizes() : nullptr; } +TokenConfig* Tokens::forScreen(const QString& screen) { + return TokenConfig::forScreen(screen); +} + Tokens* Tokens::qmlAttachedProperties(QObject* object) { return new Tokens(ConfigScope::find(object), object); } diff --git a/plugin/src/Caelestia/Config/tokens.hpp b/plugin/src/Caelestia/Config/tokens.hpp index 462d3f62..2448b737 100644 --- a/plugin/src/Caelestia/Config/tokens.hpp +++ b/plugin/src/Caelestia/Config/tokens.hpp @@ -330,6 +330,7 @@ class TokenConfig : public RootConfig { public: static TokenConfig* instance(); [[nodiscard]] Q_INVOKABLE TokenConfig* defaults(); + [[nodiscard]] Q_INVOKABLE static TokenConfig* forScreen(const QString& screen); static TokenConfig* create(QQmlEngine*, QJSEngine*); private: @@ -369,6 +370,8 @@ public: [[nodiscard]] const AnimTokens* anim() const { return m_anim; } + [[nodiscard]] Q_INVOKABLE static TokenConfig* forScreen(const QString& screen); + static Tokens* qmlAttachedProperties(QObject* object); signals: diff --git a/services/Screens.qml b/services/Screens.qml index 7e1b85df..f902a38d 100644 --- a/services/Screens.qml +++ b/services/Screens.qml @@ -7,14 +7,9 @@ import qs.utils Singleton { id: root - readonly property list screens: { - const excluded = Config.general.excludedScreens; - if (excluded.length === 0) - return Quickshell.screens; - return Quickshell.screens.filter(s => !Strings.testRegexList(excluded, s.name)); - } + readonly property list screens: Quickshell.screens.filter(s => GlobalConfig.forScreen(s.name).enabled) function isExcluded(screen: ShellScreen): bool { - return Strings.testRegexList(Config.general.excludedScreens, screen.name); + return !GlobalConfig.forScreen(screen.name).enabled; } } From 3d012e86b325156ab7d16bcd069db572c01efaf3 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 03:45:17 +1000 Subject: [PATCH 48/81] chore: remove old Config.save() --- modules/controlcenter/appearance/AppearancePane.qml | 2 -- modules/controlcenter/dashboard/DashboardPane.qml | 1 - modules/controlcenter/launcher/LauncherPane.qml | 3 --- modules/controlcenter/launcher/Settings.qml | 9 --------- modules/controlcenter/network/NetworkSettings.qml | 1 - modules/controlcenter/network/VpnDetails.qml | 3 --- modules/controlcenter/network/VpnList.qml | 7 ------- modules/controlcenter/network/VpnSettings.qml | 6 ------ .../controlcenter/notifications/NotificationsPane.qml | 2 -- modules/controlcenter/taskbar/TaskbarPane.qml | 1 - services/LyricsService.qml | 2 -- 11 files changed, 37 deletions(-) diff --git a/modules/controlcenter/appearance/AppearancePane.qml b/modules/controlcenter/appearance/AppearancePane.qml index 1c787f36..7111d83f 100644 --- a/modules/controlcenter/appearance/AppearancePane.qml +++ b/modules/controlcenter/appearance/AppearancePane.qml @@ -91,8 +91,6 @@ Item { Config.border.rounding = root.borderRounding; Config.border.thickness = root.borderThickness; - - Config.save(); } anchors.fill: parent diff --git a/modules/controlcenter/dashboard/DashboardPane.qml b/modules/controlcenter/dashboard/DashboardPane.qml index 83bc1e16..eed077c9 100644 --- a/modules/controlcenter/dashboard/DashboardPane.qml +++ b/modules/controlcenter/dashboard/DashboardPane.qml @@ -57,7 +57,6 @@ Item { Config.dashboard.performance.showStorage = root.showStorage; Config.dashboard.performance.showNetwork = root.showNetwork; // Note: sizes properties are readonly and cannot be modified - Config.save(); } anchors.fill: parent diff --git a/modules/controlcenter/launcher/LauncherPane.qml b/modules/controlcenter/launcher/LauncherPane.qml index 83c2232b..c29243c2 100644 --- a/modules/controlcenter/launcher/LauncherPane.qml +++ b/modules/controlcenter/launcher/LauncherPane.qml @@ -62,7 +62,6 @@ Item { } Config.launcher.hiddenApps = hiddenApps; - Config.save(); } function filterApps(search: string): list { @@ -626,7 +625,6 @@ Item { } } Config.launcher.favouriteApps = favouriteApps; - Config.save(); } } } @@ -659,7 +657,6 @@ Item { } } Config.launcher.hiddenApps = hiddenApps; - Config.save(); } } } diff --git a/modules/controlcenter/launcher/Settings.qml b/modules/controlcenter/launcher/Settings.qml index 61bab0c1..ce570737 100644 --- a/modules/controlcenter/launcher/Settings.qml +++ b/modules/controlcenter/launcher/Settings.qml @@ -34,7 +34,6 @@ ColumnLayout { checked: Config.launcher.enabled toggle.onToggled: { Config.launcher.enabled = checked; - Config.save(); } } @@ -43,7 +42,6 @@ ColumnLayout { checked: Config.launcher.showOnHover toggle.onToggled: { Config.launcher.showOnHover = checked; - Config.save(); } } @@ -52,7 +50,6 @@ ColumnLayout { checked: Config.launcher.vimKeybinds toggle.onToggled: { Config.launcher.vimKeybinds = checked; - Config.save(); } } @@ -61,7 +58,6 @@ ColumnLayout { checked: Config.launcher.enableDangerousActions toggle.onToggled: { Config.launcher.enableDangerousActions = checked; - Config.save(); } } } @@ -126,7 +122,6 @@ ColumnLayout { checked: Config.launcher.useFuzzy.apps toggle.onToggled: { Config.launcher.useFuzzy.apps = checked; - Config.save(); } } @@ -135,7 +130,6 @@ ColumnLayout { checked: Config.launcher.useFuzzy.actions toggle.onToggled: { Config.launcher.useFuzzy.actions = checked; - Config.save(); } } @@ -144,7 +138,6 @@ ColumnLayout { checked: Config.launcher.useFuzzy.schemes toggle.onToggled: { Config.launcher.useFuzzy.schemes = checked; - Config.save(); } } @@ -153,7 +146,6 @@ ColumnLayout { checked: Config.launcher.useFuzzy.variants toggle.onToggled: { Config.launcher.useFuzzy.variants = checked; - Config.save(); } } @@ -162,7 +154,6 @@ ColumnLayout { checked: Config.launcher.useFuzzy.wallpapers toggle.onToggled: { Config.launcher.useFuzzy.wallpapers = checked; - Config.save(); } } } diff --git a/modules/controlcenter/network/NetworkSettings.qml b/modules/controlcenter/network/NetworkSettings.qml index 22d85188..3e720ea4 100644 --- a/modules/controlcenter/network/NetworkSettings.qml +++ b/modules/controlcenter/network/NetworkSettings.qml @@ -76,7 +76,6 @@ ColumnLayout { checked: Config.utilities.vpn.enabled toggle.onToggled: { Config.utilities.vpn.enabled = checked; - Config.save(); } } diff --git a/modules/controlcenter/network/VpnDetails.qml b/modules/controlcenter/network/VpnDetails.qml index 3ea85d32..fcdd9a8a 100644 --- a/modules/controlcenter/network/VpnDetails.qml +++ b/modules/controlcenter/network/VpnDetails.qml @@ -86,7 +86,6 @@ DeviceDetails { } Config.utilities.vpn.provider = providers; - Config.save(); } } @@ -141,7 +140,6 @@ DeviceDetails { } } Config.utilities.vpn.provider = providers; - Config.save(); root.session.vpn.active = null; } } @@ -540,7 +538,6 @@ DeviceDetails { } Config.utilities.vpn.provider = providers; - Config.save(); editVpnDialog.closeWithAnimation(); } } diff --git a/modules/controlcenter/network/VpnList.qml b/modules/controlcenter/network/VpnList.qml index e0376fc6..957ce87e 100644 --- a/modules/controlcenter/network/VpnList.qml +++ b/modules/controlcenter/network/VpnList.qml @@ -48,7 +48,6 @@ ColumnLayout { } } Config.utilities.vpn.provider = providers; - Config.save(); Qt.callLater(function () { VPN.toggle(); @@ -244,7 +243,6 @@ ColumnLayout { } } Config.utilities.vpn.provider = providers; - Config.save(); Qt.callLater(function () { VPN.toggle(); @@ -294,7 +292,6 @@ ColumnLayout { } } Config.utilities.vpn.provider = providers; - Config.save(); } } @@ -496,7 +493,6 @@ ColumnLayout { interface: "wt0" }); Config.utilities.vpn.provider = providers; - Config.save(); vpnDialog.closeWithAnimation(); } } @@ -517,7 +513,6 @@ ColumnLayout { interface: "tailscale0" }); Config.utilities.vpn.provider = providers; - Config.save(); vpnDialog.closeWithAnimation(); } } @@ -538,7 +533,6 @@ ColumnLayout { interface: "CloudflareWARP" }); Config.utilities.vpn.provider = providers; - Config.save(); vpnDialog.closeWithAnimation(); } } @@ -806,7 +800,6 @@ ColumnLayout { } Config.utilities.vpn.provider = providers; - Config.save(); vpnDialog.closeWithAnimation(); } } diff --git a/modules/controlcenter/network/VpnSettings.qml b/modules/controlcenter/network/VpnSettings.qml index e0f0e7f5..30b5403b 100644 --- a/modules/controlcenter/network/VpnSettings.qml +++ b/modules/controlcenter/network/VpnSettings.qml @@ -37,7 +37,6 @@ ColumnLayout { checked: Config.utilities.vpn.enabled toggle.onToggled: { Config.utilities.vpn.enabled = checked; - Config.save(); } } } @@ -149,7 +148,6 @@ ColumnLayout { } Config.utilities.vpn.provider = providers; - Config.save(); } } @@ -176,7 +174,6 @@ ColumnLayout { } } Config.utilities.vpn.provider = providers; - Config.save(); } } } @@ -220,7 +217,6 @@ ColumnLayout { interface: "wt0" }); Config.utilities.vpn.provider = providers; - Config.save(); } } @@ -238,7 +234,6 @@ ColumnLayout { interface: "tailscale0" }); Config.utilities.vpn.provider = providers; - Config.save(); } } @@ -256,7 +251,6 @@ ColumnLayout { interface: "CloudflareWARP" }); Config.utilities.vpn.provider = providers; - Config.save(); } } } diff --git a/modules/controlcenter/notifications/NotificationsPane.qml b/modules/controlcenter/notifications/NotificationsPane.qml index 919a2549..a522dca4 100644 --- a/modules/controlcenter/notifications/NotificationsPane.qml +++ b/modules/controlcenter/notifications/NotificationsPane.qml @@ -56,8 +56,6 @@ Item { Config.utilities.toasts.kbLayoutChanged = root.kbLayoutChanged; Config.utilities.toasts.vpnChanged = root.vpnChanged; Config.utilities.toasts.nowPlaying = root.nowPlaying; - - Config.save(); } anchors.fill: parent diff --git a/modules/controlcenter/taskbar/TaskbarPane.qml b/modules/controlcenter/taskbar/TaskbarPane.qml index 5715b8e2..4c3ff8af 100644 --- a/modules/controlcenter/taskbar/TaskbarPane.qml +++ b/modules/controlcenter/taskbar/TaskbarPane.qml @@ -100,7 +100,6 @@ Item { }); } Config.bar.entries = entries; - Config.save(); } anchors.fill: parent diff --git a/services/LyricsService.qml b/services/LyricsService.qml index 7fd63670..dc5f600f 100644 --- a/services/LyricsService.qml +++ b/services/LyricsService.qml @@ -69,7 +69,6 @@ Singleton { function toggleVisibility() { Config.services.showLyrics = !Config.services.showLyrics; - Config.save(); } function loadLyrics() { @@ -274,7 +273,6 @@ Singleton { onPreferredBackendChanged: { if (Config.services.lyricsBackend !== preferredBackend) { Config.services.lyricsBackend = preferredBackend; - Config.save(); } } From 42b9e57eae90e07f6400ec3f5b812d532911561b Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 03:46:37 +1000 Subject: [PATCH 49/81] fix: use singleton for conf writes --- .../appearance/AppearancePane.qml | 58 ++++++++-------- .../controlcenter/dashboard/DashboardPane.qml | 30 ++++----- .../controlcenter/launcher/LauncherPane.qml | 6 +- modules/controlcenter/launcher/Settings.qml | 18 ++--- .../controlcenter/network/NetworkSettings.qml | 2 +- modules/controlcenter/network/VpnDetails.qml | 6 +- modules/controlcenter/network/VpnList.qml | 14 ++-- modules/controlcenter/network/VpnSettings.qml | 12 ++-- .../notifications/NotificationsPane.qml | 34 +++++----- modules/controlcenter/taskbar/TaskbarPane.qml | 66 +++++++++---------- services/LyricsService.qml | 4 +- 11 files changed, 125 insertions(+), 125 deletions(-) diff --git a/modules/controlcenter/appearance/AppearancePane.qml b/modules/controlcenter/appearance/AppearancePane.qml index 7111d83f..6ede9bb3 100644 --- a/modules/controlcenter/appearance/AppearancePane.qml +++ b/modules/controlcenter/appearance/AppearancePane.qml @@ -55,42 +55,42 @@ Item { property real visualiserSpacing: Config.background.visualiser.spacing ?? 1 function saveConfig() { - Config.appearance.anim.durations.scale = root.animDurationsScale; + GlobalConfig.appearance.anim.durations.scale = root.animDurationsScale; - Config.appearance.font.family.material = root.fontFamilyMaterial; - Config.appearance.font.family.mono = root.fontFamilyMono; - Config.appearance.font.family.sans = root.fontFamilySans; - Config.appearance.font.size.scale = root.fontSizeScale; + GlobalConfig.appearance.font.family.material = root.fontFamilyMaterial; + GlobalConfig.appearance.font.family.mono = root.fontFamilyMono; + GlobalConfig.appearance.font.family.sans = root.fontFamilySans; + GlobalConfig.appearance.font.size.scale = root.fontSizeScale; - Config.appearance.padding.scale = root.paddingScale; - Config.appearance.rounding.scale = root.roundingScale; - Config.appearance.spacing.scale = root.spacingScale; + GlobalConfig.appearance.padding.scale = root.paddingScale; + GlobalConfig.appearance.rounding.scale = root.roundingScale; + GlobalConfig.appearance.spacing.scale = root.spacingScale; - Config.appearance.transparency.enabled = root.transparencyEnabled; - Config.appearance.transparency.base = root.transparencyBase; - Config.appearance.transparency.layers = root.transparencyLayers; + GlobalConfig.appearance.transparency.enabled = root.transparencyEnabled; + GlobalConfig.appearance.transparency.base = root.transparencyBase; + GlobalConfig.appearance.transparency.layers = root.transparencyLayers; - Config.background.desktopClock.enabled = root.desktopClockEnabled; - Config.background.enabled = root.backgroundEnabled; - Config.background.desktopClock.scale = root.desktopClockScale; - Config.background.desktopClock.position = root.desktopClockPosition; - Config.background.desktopClock.shadow.enabled = root.desktopClockShadowEnabled; - Config.background.desktopClock.shadow.opacity = root.desktopClockShadowOpacity; - Config.background.desktopClock.shadow.blur = root.desktopClockShadowBlur; - Config.background.desktopClock.background.enabled = root.desktopClockBackgroundEnabled; - Config.background.desktopClock.background.opacity = root.desktopClockBackgroundOpacity; - Config.background.desktopClock.background.blur = root.desktopClockBackgroundBlur; - Config.background.desktopClock.invertColors = root.desktopClockInvertColors; + GlobalConfig.background.desktopClock.enabled = root.desktopClockEnabled; + GlobalConfig.background.enabled = root.backgroundEnabled; + GlobalConfig.background.desktopClock.scale = root.desktopClockScale; + GlobalConfig.background.desktopClock.position = root.desktopClockPosition; + GlobalConfig.background.desktopClock.shadow.enabled = root.desktopClockShadowEnabled; + GlobalConfig.background.desktopClock.shadow.opacity = root.desktopClockShadowOpacity; + GlobalConfig.background.desktopClock.shadow.blur = root.desktopClockShadowBlur; + GlobalConfig.background.desktopClock.background.enabled = root.desktopClockBackgroundEnabled; + GlobalConfig.background.desktopClock.background.opacity = root.desktopClockBackgroundOpacity; + GlobalConfig.background.desktopClock.background.blur = root.desktopClockBackgroundBlur; + GlobalConfig.background.desktopClock.invertColors = root.desktopClockInvertColors; - Config.background.wallpaperEnabled = root.wallpaperEnabled; + GlobalConfig.background.wallpaperEnabled = root.wallpaperEnabled; - Config.background.visualiser.enabled = root.visualiserEnabled; - Config.background.visualiser.autoHide = root.visualiserAutoHide; - Config.background.visualiser.rounding = root.visualiserRounding; - Config.background.visualiser.spacing = root.visualiserSpacing; + GlobalConfig.background.visualiser.enabled = root.visualiserEnabled; + GlobalConfig.background.visualiser.autoHide = root.visualiserAutoHide; + GlobalConfig.background.visualiser.rounding = root.visualiserRounding; + GlobalConfig.background.visualiser.spacing = root.visualiserSpacing; - Config.border.rounding = root.borderRounding; - Config.border.thickness = root.borderThickness; + GlobalConfig.border.rounding = root.borderRounding; + GlobalConfig.border.thickness = root.borderThickness; } anchors.fill: parent diff --git a/modules/controlcenter/dashboard/DashboardPane.qml b/modules/controlcenter/dashboard/DashboardPane.qml index eed077c9..46e33ebc 100644 --- a/modules/controlcenter/dashboard/DashboardPane.qml +++ b/modules/controlcenter/dashboard/DashboardPane.qml @@ -41,21 +41,21 @@ Item { property bool showNetwork: Config.dashboard.performance.showNetwork ?? true function saveConfig() { - Config.dashboard.enabled = root.enabled; - Config.dashboard.showOnHover = root.showOnHover; - Config.dashboard.mediaUpdateInterval = root.mediaUpdateInterval; - Config.dashboard.resourceUpdateInterval = root.resourceUpdateInterval; - Config.dashboard.dragThreshold = root.dragThreshold; - Config.dashboard.showDashboard = root.showDashboard; - Config.dashboard.showMedia = root.showMedia; - Config.dashboard.showPerformance = root.showPerformance; - Config.dashboard.showWeather = root.showWeather; - Config.dashboard.performance.showBattery = root.showBattery; - Config.dashboard.performance.showGpu = root.showGpu; - Config.dashboard.performance.showCpu = root.showCpu; - Config.dashboard.performance.showMemory = root.showMemory; - Config.dashboard.performance.showStorage = root.showStorage; - Config.dashboard.performance.showNetwork = root.showNetwork; + GlobalConfig.dashboard.enabled = root.enabled; + GlobalConfig.dashboard.showOnHover = root.showOnHover; + GlobalConfig.dashboard.mediaUpdateInterval = root.mediaUpdateInterval; + GlobalConfig.dashboard.resourceUpdateInterval = root.resourceUpdateInterval; + GlobalConfig.dashboard.dragThreshold = root.dragThreshold; + GlobalConfig.dashboard.showDashboard = root.showDashboard; + GlobalConfig.dashboard.showMedia = root.showMedia; + GlobalConfig.dashboard.showPerformance = root.showPerformance; + GlobalConfig.dashboard.showWeather = root.showWeather; + GlobalConfig.dashboard.performance.showBattery = root.showBattery; + GlobalConfig.dashboard.performance.showGpu = root.showGpu; + GlobalConfig.dashboard.performance.showCpu = root.showCpu; + GlobalConfig.dashboard.performance.showMemory = root.showMemory; + GlobalConfig.dashboard.performance.showStorage = root.showStorage; + GlobalConfig.dashboard.performance.showNetwork = root.showNetwork; // Note: sizes properties are readonly and cannot be modified } diff --git a/modules/controlcenter/launcher/LauncherPane.qml b/modules/controlcenter/launcher/LauncherPane.qml index c29243c2..e5353fba 100644 --- a/modules/controlcenter/launcher/LauncherPane.qml +++ b/modules/controlcenter/launcher/LauncherPane.qml @@ -61,7 +61,7 @@ Item { } } - Config.launcher.hiddenApps = hiddenApps; + GlobalConfig.launcher.hiddenApps = hiddenApps; } function filterApps(search: string): list { @@ -624,7 +624,7 @@ Item { favouriteApps.splice(index, 1); } } - Config.launcher.favouriteApps = favouriteApps; + GlobalConfig.launcher.favouriteApps = favouriteApps; } } } @@ -656,7 +656,7 @@ Item { hiddenApps.splice(index, 1); } } - Config.launcher.hiddenApps = hiddenApps; + GlobalConfig.launcher.hiddenApps = hiddenApps; } } } diff --git a/modules/controlcenter/launcher/Settings.qml b/modules/controlcenter/launcher/Settings.qml index ce570737..df25a827 100644 --- a/modules/controlcenter/launcher/Settings.qml +++ b/modules/controlcenter/launcher/Settings.qml @@ -33,7 +33,7 @@ ColumnLayout { label: qsTr("Enabled") checked: Config.launcher.enabled toggle.onToggled: { - Config.launcher.enabled = checked; + GlobalConfig.launcher.enabled = checked; } } @@ -41,7 +41,7 @@ ColumnLayout { label: qsTr("Show on hover") checked: Config.launcher.showOnHover toggle.onToggled: { - Config.launcher.showOnHover = checked; + GlobalConfig.launcher.showOnHover = checked; } } @@ -49,7 +49,7 @@ ColumnLayout { label: qsTr("Vim keybinds") checked: Config.launcher.vimKeybinds toggle.onToggled: { - Config.launcher.vimKeybinds = checked; + GlobalConfig.launcher.vimKeybinds = checked; } } @@ -57,7 +57,7 @@ ColumnLayout { label: qsTr("Enable dangerous actions") checked: Config.launcher.enableDangerousActions toggle.onToggled: { - Config.launcher.enableDangerousActions = checked; + GlobalConfig.launcher.enableDangerousActions = checked; } } } @@ -121,7 +121,7 @@ ColumnLayout { label: qsTr("Apps") checked: Config.launcher.useFuzzy.apps toggle.onToggled: { - Config.launcher.useFuzzy.apps = checked; + GlobalConfig.launcher.useFuzzy.apps = checked; } } @@ -129,7 +129,7 @@ ColumnLayout { label: qsTr("Actions") checked: Config.launcher.useFuzzy.actions toggle.onToggled: { - Config.launcher.useFuzzy.actions = checked; + GlobalConfig.launcher.useFuzzy.actions = checked; } } @@ -137,7 +137,7 @@ ColumnLayout { label: qsTr("Schemes") checked: Config.launcher.useFuzzy.schemes toggle.onToggled: { - Config.launcher.useFuzzy.schemes = checked; + GlobalConfig.launcher.useFuzzy.schemes = checked; } } @@ -145,7 +145,7 @@ ColumnLayout { label: qsTr("Variants") checked: Config.launcher.useFuzzy.variants toggle.onToggled: { - Config.launcher.useFuzzy.variants = checked; + GlobalConfig.launcher.useFuzzy.variants = checked; } } @@ -153,7 +153,7 @@ ColumnLayout { label: qsTr("Wallpapers") checked: Config.launcher.useFuzzy.wallpapers toggle.onToggled: { - Config.launcher.useFuzzy.wallpapers = checked; + GlobalConfig.launcher.useFuzzy.wallpapers = checked; } } } diff --git a/modules/controlcenter/network/NetworkSettings.qml b/modules/controlcenter/network/NetworkSettings.qml index 3e720ea4..5ed755fe 100644 --- a/modules/controlcenter/network/NetworkSettings.qml +++ b/modules/controlcenter/network/NetworkSettings.qml @@ -75,7 +75,7 @@ ColumnLayout { label: qsTr("VPN enabled") checked: Config.utilities.vpn.enabled toggle.onToggled: { - Config.utilities.vpn.enabled = checked; + GlobalConfig.utilities.vpn.enabled = checked; } } diff --git a/modules/controlcenter/network/VpnDetails.qml b/modules/controlcenter/network/VpnDetails.qml index fcdd9a8a..f0197f9c 100644 --- a/modules/controlcenter/network/VpnDetails.qml +++ b/modules/controlcenter/network/VpnDetails.qml @@ -85,7 +85,7 @@ DeviceDetails { } } - Config.utilities.vpn.provider = providers; + GlobalConfig.utilities.vpn.provider = providers; } } @@ -139,7 +139,7 @@ DeviceDetails { providers.push(Config.utilities.vpn.provider[i]); } } - Config.utilities.vpn.provider = providers; + GlobalConfig.utilities.vpn.provider = providers; root.session.vpn.active = null; } } @@ -537,7 +537,7 @@ DeviceDetails { } } - Config.utilities.vpn.provider = providers; + GlobalConfig.utilities.vpn.provider = providers; editVpnDialog.closeWithAnimation(); } } diff --git a/modules/controlcenter/network/VpnList.qml b/modules/controlcenter/network/VpnList.qml index 957ce87e..dd63300d 100644 --- a/modules/controlcenter/network/VpnList.qml +++ b/modules/controlcenter/network/VpnList.qml @@ -47,7 +47,7 @@ ColumnLayout { providers.push(p); } } - Config.utilities.vpn.provider = providers; + GlobalConfig.utilities.vpn.provider = providers; Qt.callLater(function () { VPN.toggle(); @@ -242,7 +242,7 @@ ColumnLayout { providers.push(p); } } - Config.utilities.vpn.provider = providers; + GlobalConfig.utilities.vpn.provider = providers; Qt.callLater(function () { VPN.toggle(); @@ -291,7 +291,7 @@ ColumnLayout { providers.push(reconstructed); } } - Config.utilities.vpn.provider = providers; + GlobalConfig.utilities.vpn.provider = providers; } } @@ -492,7 +492,7 @@ ColumnLayout { displayName: "NetBird", interface: "wt0" }); - Config.utilities.vpn.provider = providers; + GlobalConfig.utilities.vpn.provider = providers; vpnDialog.closeWithAnimation(); } } @@ -512,7 +512,7 @@ ColumnLayout { displayName: "Tailscale", interface: "tailscale0" }); - Config.utilities.vpn.provider = providers; + GlobalConfig.utilities.vpn.provider = providers; vpnDialog.closeWithAnimation(); } } @@ -532,7 +532,7 @@ ColumnLayout { displayName: "Cloudflare WARP", interface: "CloudflareWARP" }); - Config.utilities.vpn.provider = providers; + GlobalConfig.utilities.vpn.provider = providers; vpnDialog.closeWithAnimation(); } } @@ -799,7 +799,7 @@ ColumnLayout { providers.push(newProvider); } - Config.utilities.vpn.provider = providers; + GlobalConfig.utilities.vpn.provider = providers; vpnDialog.closeWithAnimation(); } } diff --git a/modules/controlcenter/network/VpnSettings.qml b/modules/controlcenter/network/VpnSettings.qml index 30b5403b..27c1cc8e 100644 --- a/modules/controlcenter/network/VpnSettings.qml +++ b/modules/controlcenter/network/VpnSettings.qml @@ -36,7 +36,7 @@ ColumnLayout { label: qsTr("VPN enabled") checked: Config.utilities.vpn.enabled toggle.onToggled: { - Config.utilities.vpn.enabled = checked; + GlobalConfig.utilities.vpn.enabled = checked; } } } @@ -147,7 +147,7 @@ ColumnLayout { providers.unshift(provider); } - Config.utilities.vpn.provider = providers; + GlobalConfig.utilities.vpn.provider = providers; } } @@ -173,7 +173,7 @@ ColumnLayout { providers.push(reconstructed); } } - Config.utilities.vpn.provider = providers; + GlobalConfig.utilities.vpn.provider = providers; } } } @@ -216,7 +216,7 @@ ColumnLayout { displayName: "NetBird", interface: "wt0" }); - Config.utilities.vpn.provider = providers; + GlobalConfig.utilities.vpn.provider = providers; } } @@ -233,7 +233,7 @@ ColumnLayout { displayName: "Tailscale", interface: "tailscale0" }); - Config.utilities.vpn.provider = providers; + GlobalConfig.utilities.vpn.provider = providers; } } @@ -250,7 +250,7 @@ ColumnLayout { displayName: "Cloudflare WARP", interface: "CloudflareWARP" }); - Config.utilities.vpn.provider = providers; + GlobalConfig.utilities.vpn.provider = providers; } } } diff --git a/modules/controlcenter/notifications/NotificationsPane.qml b/modules/controlcenter/notifications/NotificationsPane.qml index a522dca4..ea75c2a6 100644 --- a/modules/controlcenter/notifications/NotificationsPane.qml +++ b/modules/controlcenter/notifications/NotificationsPane.qml @@ -38,24 +38,24 @@ Item { property bool nowPlaying: Config.utilities.toasts.nowPlaying ?? false function saveConfig(): void { - Config.notifs.expire = root.notificationsExpire; - Config.notifs.fullscreen = root.notificationsFullscreen; - Config.notifs.openExpanded = root.notificationsOpenExpanded; - Config.notifs.defaultExpireTimeout = root.notificationsDefaultExpireTimeout; - Config.notifs.groupPreviewNum = root.notificationsGroupPreviewNum; + GlobalConfig.notifs.expire = root.notificationsExpire; + GlobalConfig.notifs.fullscreen = root.notificationsFullscreen; + GlobalConfig.notifs.openExpanded = root.notificationsOpenExpanded; + GlobalConfig.notifs.defaultExpireTimeout = root.notificationsDefaultExpireTimeout; + GlobalConfig.notifs.groupPreviewNum = root.notificationsGroupPreviewNum; - Config.utilities.maxToasts = root.maxToasts; - Config.utilities.toasts.fullscreen = root.toastsFullscreen; - Config.utilities.toasts.chargingChanged = root.chargingChanged; - Config.utilities.toasts.gameModeChanged = root.gameModeChanged; - Config.utilities.toasts.dndChanged = root.dndChanged; - Config.utilities.toasts.audioOutputChanged = root.audioOutputChanged; - Config.utilities.toasts.audioInputChanged = root.audioInputChanged; - Config.utilities.toasts.capsLockChanged = root.capsLockChanged; - Config.utilities.toasts.numLockChanged = root.numLockChanged; - Config.utilities.toasts.kbLayoutChanged = root.kbLayoutChanged; - Config.utilities.toasts.vpnChanged = root.vpnChanged; - Config.utilities.toasts.nowPlaying = root.nowPlaying; + GlobalConfig.utilities.maxToasts = root.maxToasts; + GlobalConfig.utilities.toasts.fullscreen = root.toastsFullscreen; + GlobalConfig.utilities.toasts.chargingChanged = root.chargingChanged; + GlobalConfig.utilities.toasts.gameModeChanged = root.gameModeChanged; + GlobalConfig.utilities.toasts.dndChanged = root.dndChanged; + GlobalConfig.utilities.toasts.audioOutputChanged = root.audioOutputChanged; + GlobalConfig.utilities.toasts.audioInputChanged = root.audioInputChanged; + GlobalConfig.utilities.toasts.capsLockChanged = root.capsLockChanged; + GlobalConfig.utilities.toasts.numLockChanged = root.numLockChanged; + GlobalConfig.utilities.toasts.kbLayoutChanged = root.kbLayoutChanged; + GlobalConfig.utilities.toasts.vpnChanged = root.vpnChanged; + GlobalConfig.utilities.toasts.nowPlaying = root.nowPlaying; } anchors.fill: parent diff --git a/modules/controlcenter/taskbar/TaskbarPane.qml b/modules/controlcenter/taskbar/TaskbarPane.qml index 4c3ff8af..75d70bff 100644 --- a/modules/controlcenter/taskbar/TaskbarPane.qml +++ b/modules/controlcenter/taskbar/TaskbarPane.qml @@ -54,38 +54,38 @@ Item { property list excludedScreens: Config.bar.excludedScreens ?? [] function saveConfig(entryIndex, entryEnabled) { - Config.bar.activeWindow.compact = root.activeWindowCompact; - Config.bar.activeWindow.inverted = root.activeWindowInverted; - Config.bar.clock.background = root.clockBackground; - Config.bar.clock.showDate = root.clockShowDate; - Config.bar.clock.showIcon = root.clockShowIcon; - Config.bar.persistent = root.persistent; - Config.bar.showOnHover = root.showOnHover; - Config.bar.dragThreshold = root.dragThreshold; - Config.bar.status.showAudio = root.showAudio; - Config.bar.status.showMicrophone = root.showMicrophone; - Config.bar.status.showKbLayout = root.showKbLayout; - Config.bar.status.showNetwork = root.showNetwork; - Config.bar.status.showWifi = root.showWifi; - Config.bar.status.showBluetooth = root.showBluetooth; - Config.bar.status.showBattery = root.showBattery; - Config.bar.status.showLockStatus = root.showLockStatus; - Config.bar.tray.background = root.trayBackground; - Config.bar.tray.compact = root.trayCompact; - Config.bar.tray.recolour = root.trayRecolour; - Config.bar.workspaces.shown = root.workspacesShown; - Config.bar.workspaces.activeIndicator = root.workspacesActiveIndicator; - Config.bar.workspaces.occupiedBg = root.workspacesOccupiedBg; - Config.bar.workspaces.showWindows = root.workspacesShowWindows; - Config.bar.workspaces.maxWindowIcons = root.workspacesMaxWindowIcons; - Config.bar.workspaces.perMonitorWorkspaces = root.workspacesPerMonitor; - Config.bar.scrollActions.workspaces = root.scrollWorkspaces; - Config.bar.scrollActions.volume = root.scrollVolume; - Config.bar.scrollActions.brightness = root.scrollBrightness; - Config.bar.popouts.activeWindow = root.popoutActiveWindow; - Config.bar.popouts.tray = root.popoutTray; - Config.bar.popouts.statusIcons = root.popoutStatusIcons; - Config.bar.excludedScreens = root.excludedScreens; + GlobalConfig.bar.activeWindow.compact = root.activeWindowCompact; + GlobalConfig.bar.activeWindow.inverted = root.activeWindowInverted; + GlobalConfig.bar.clock.background = root.clockBackground; + GlobalConfig.bar.clock.showDate = root.clockShowDate; + GlobalConfig.bar.clock.showIcon = root.clockShowIcon; + GlobalConfig.bar.persistent = root.persistent; + GlobalConfig.bar.showOnHover = root.showOnHover; + GlobalConfig.bar.dragThreshold = root.dragThreshold; + GlobalConfig.bar.status.showAudio = root.showAudio; + GlobalConfig.bar.status.showMicrophone = root.showMicrophone; + GlobalConfig.bar.status.showKbLayout = root.showKbLayout; + GlobalConfig.bar.status.showNetwork = root.showNetwork; + GlobalConfig.bar.status.showWifi = root.showWifi; + GlobalConfig.bar.status.showBluetooth = root.showBluetooth; + GlobalConfig.bar.status.showBattery = root.showBattery; + GlobalConfig.bar.status.showLockStatus = root.showLockStatus; + GlobalConfig.bar.tray.background = root.trayBackground; + GlobalConfig.bar.tray.compact = root.trayCompact; + GlobalConfig.bar.tray.recolour = root.trayRecolour; + GlobalConfig.bar.workspaces.shown = root.workspacesShown; + GlobalConfig.bar.workspaces.activeIndicator = root.workspacesActiveIndicator; + GlobalConfig.bar.workspaces.occupiedBg = root.workspacesOccupiedBg; + GlobalConfig.bar.workspaces.showWindows = root.workspacesShowWindows; + GlobalConfig.bar.workspaces.maxWindowIcons = root.workspacesMaxWindowIcons; + GlobalConfig.bar.workspaces.perMonitorWorkspaces = root.workspacesPerMonitor; + GlobalConfig.bar.scrollActions.workspaces = root.scrollWorkspaces; + GlobalConfig.bar.scrollActions.volume = root.scrollVolume; + GlobalConfig.bar.scrollActions.brightness = root.scrollBrightness; + GlobalConfig.bar.popouts.activeWindow = root.popoutActiveWindow; + GlobalConfig.bar.popouts.tray = root.popoutTray; + GlobalConfig.bar.popouts.statusIcons = root.popoutStatusIcons; + GlobalConfig.bar.excludedScreens = root.excludedScreens; const entries = []; for (let i = 0; i < entriesModel.count; i++) { @@ -99,7 +99,7 @@ Item { enabled: enabled }); } - Config.bar.entries = entries; + GlobalConfig.bar.entries = entries; } anchors.fill: parent diff --git a/services/LyricsService.qml b/services/LyricsService.qml index dc5f600f..04fc64fb 100644 --- a/services/LyricsService.qml +++ b/services/LyricsService.qml @@ -68,7 +68,7 @@ Singleton { } function toggleVisibility() { - Config.services.showLyrics = !Config.services.showLyrics; + GlobalConfig.services.showLyrics = !Config.services.showLyrics; } function loadLyrics() { @@ -272,7 +272,7 @@ Singleton { onPreferredBackendChanged: { if (Config.services.lyricsBackend !== preferredBackend) { - Config.services.lyricsBackend = preferredBackend; + GlobalConfig.services.lyricsBackend = preferredBackend; } } From fc1b3ca2d62b71281458d7d6f6e518e2ce42a9d6 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 03:47:42 +1000 Subject: [PATCH 50/81] chore: remove unused import --- services/Screens.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/services/Screens.qml b/services/Screens.qml index f902a38d..ac26d27d 100644 --- a/services/Screens.qml +++ b/services/Screens.qml @@ -2,7 +2,6 @@ pragma Singleton import Quickshell import Caelestia.Config -import qs.utils Singleton { id: root From 644e70679b4e1112fe56311ed2fd45e552e1eb2e Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 03:52:51 +1000 Subject: [PATCH 51/81] refactor: move attached types to own files --- plugin/src/Caelestia/Config/CMakeLists.txt | 2 + plugin/src/Caelestia/Config/config.cpp | 52 ------------ plugin/src/Caelestia/Config/config.hpp | 64 --------------- .../src/Caelestia/Config/configattached.cpp | 56 +++++++++++++ .../src/Caelestia/Config/configattached.hpp | 69 ++++++++++++++++ plugin/src/Caelestia/Config/tokens.cpp | 80 ------------------ plugin/src/Caelestia/Config/tokens.hpp | 43 ---------- .../src/Caelestia/Config/tokensattached.cpp | 82 +++++++++++++++++++ .../src/Caelestia/Config/tokensattached.hpp | 52 ++++++++++++ 9 files changed, 261 insertions(+), 239 deletions(-) create mode 100644 plugin/src/Caelestia/Config/configattached.cpp create mode 100644 plugin/src/Caelestia/Config/configattached.hpp create mode 100644 plugin/src/Caelestia/Config/tokensattached.cpp create mode 100644 plugin/src/Caelestia/Config/tokensattached.hpp diff --git a/plugin/src/Caelestia/Config/CMakeLists.txt b/plugin/src/Caelestia/Config/CMakeLists.txt index a77a1fe9..9322d76c 100644 --- a/plugin/src/Caelestia/Config/CMakeLists.txt +++ b/plugin/src/Caelestia/Config/CMakeLists.txt @@ -2,11 +2,13 @@ qml_module(caelestia-config URI Caelestia.Config SOURCES config.cpp + configattached.cpp configobject.cpp rootconfig.cpp configscope.cpp appearanceconfig.cpp tokens.cpp + tokensattached.cpp anim.cpp monitorconfigmanager.cpp backgroundconfig.hpp diff --git a/plugin/src/Caelestia/Config/config.cpp b/plugin/src/Caelestia/Config/config.cpp index b68f4247..9cdcc982 100644 --- a/plugin/src/Caelestia/Config/config.cpp +++ b/plugin/src/Caelestia/Config/config.cpp @@ -1,5 +1,4 @@ #include "config.hpp" -#include "configscope.hpp" #include "monitorconfigmanager.hpp" #include "tokens.hpp" @@ -101,55 +100,4 @@ GlobalConfig* GlobalConfig::create(QQmlEngine*, QJSEngine*) { return instance(); } -// Config (attached type) - -Config::Config(ConfigScope* scope, QObject* parent) - : QObject(parent) - , m_scope(scope) { - connectScope(); -} - -void Config::connectScope() { - if (!m_scope) - return; - connect(m_scope, &ConfigScope::configChanged, this, &Config::sourceChanged); - connect(m_scope, &ConfigScope::tokensChanged, this, &Config::sourceChanged); -} - -// Helper: return per-monitor sub-object if scope exists, otherwise global -#define CONFIG_ATTACHED_GETTER(Type, name) \ - const Type* Config::name() const { \ - if (m_scope && m_scope->config()) \ - return m_scope->config()->name(); \ - return GlobalConfig::instance()->name(); \ - } - -CONFIG_ATTACHED_GETTER(AppearanceConfig, appearance) -CONFIG_ATTACHED_GETTER(GeneralConfig, general) -CONFIG_ATTACHED_GETTER(BackgroundConfig, background) -CONFIG_ATTACHED_GETTER(BarConfig, bar) -CONFIG_ATTACHED_GETTER(BorderConfig, border) -CONFIG_ATTACHED_GETTER(DashboardConfig, dashboard) -CONFIG_ATTACHED_GETTER(ControlCenterConfig, controlCenter) -CONFIG_ATTACHED_GETTER(LauncherConfig, launcher) -CONFIG_ATTACHED_GETTER(NotifsConfig, notifs) -CONFIG_ATTACHED_GETTER(OsdConfig, osd) -CONFIG_ATTACHED_GETTER(SessionConfig, session) -CONFIG_ATTACHED_GETTER(WInfoConfig, winfo) -CONFIG_ATTACHED_GETTER(LockConfig, lock) -CONFIG_ATTACHED_GETTER(UtilitiesConfig, utilities) -CONFIG_ATTACHED_GETTER(SidebarConfig, sidebar) -CONFIG_ATTACHED_GETTER(ServiceConfig, services) -CONFIG_ATTACHED_GETTER(UserPaths, paths) - -#undef CONFIG_ATTACHED_GETTER - -GlobalConfig* Config::forScreen(const QString& screen) { - return GlobalConfig::forScreen(screen); -} - -Config* Config::qmlAttachedProperties(QObject* object) { - return new Config(ConfigScope::find(object), object); -} - } // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/config.hpp b/plugin/src/Caelestia/Config/config.hpp index 1c34f039..3a66c0b0 100644 --- a/plugin/src/Caelestia/Config/config.hpp +++ b/plugin/src/Caelestia/Config/config.hpp @@ -65,68 +65,4 @@ private: bool m_tokensBound = false; }; -class ConfigScope; - -class Config : public QObject { - Q_OBJECT - Q_MOC_INCLUDE("configscope.hpp") - QML_ELEMENT - QML_UNCREATABLE("") - QML_ATTACHED(Config) - - Q_PROPERTY(caelestia::config::ConfigScope* scope READ scope NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::AppearanceConfig* appearance READ appearance NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::GeneralConfig* general READ general NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::BackgroundConfig* background READ background NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::BarConfig* bar READ bar NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::BorderConfig* border READ border NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::DashboardConfig* dashboard READ dashboard NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::ControlCenterConfig* controlCenter READ controlCenter NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::LauncherConfig* launcher READ launcher NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::NotifsConfig* notifs READ notifs NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::OsdConfig* osd READ osd NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::SessionConfig* session READ session NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::WInfoConfig* winfo READ winfo NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::LockConfig* lock READ lock NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::UtilitiesConfig* utilities READ utilities NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::SidebarConfig* sidebar READ sidebar NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::ServiceConfig* services READ services NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::UserPaths* paths READ paths NOTIFY sourceChanged) - -public: - explicit Config(ConfigScope* scope, QObject* parent = nullptr); - - [[nodiscard]] ConfigScope* scope() const { return m_scope; } - - [[nodiscard]] const AppearanceConfig* appearance() const; - [[nodiscard]] const GeneralConfig* general() const; - [[nodiscard]] const BackgroundConfig* background() const; - [[nodiscard]] const BarConfig* bar() const; - [[nodiscard]] const BorderConfig* border() const; - [[nodiscard]] const DashboardConfig* dashboard() const; - [[nodiscard]] const ControlCenterConfig* controlCenter() const; - [[nodiscard]] const LauncherConfig* launcher() const; - [[nodiscard]] const NotifsConfig* notifs() const; - [[nodiscard]] const OsdConfig* osd() const; - [[nodiscard]] const SessionConfig* session() const; - [[nodiscard]] const WInfoConfig* winfo() const; - [[nodiscard]] const LockConfig* lock() const; - [[nodiscard]] const UtilitiesConfig* utilities() const; - [[nodiscard]] const SidebarConfig* sidebar() const; - [[nodiscard]] const ServiceConfig* services() const; - [[nodiscard]] const UserPaths* paths() const; - - [[nodiscard]] Q_INVOKABLE static GlobalConfig* forScreen(const QString& screen); - - static Config* qmlAttachedProperties(QObject* object); - -signals: - void sourceChanged(); - -private: - void connectScope(); - - ConfigScope* m_scope; -}; - } // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/configattached.cpp b/plugin/src/Caelestia/Config/configattached.cpp new file mode 100644 index 00000000..02574910 --- /dev/null +++ b/plugin/src/Caelestia/Config/configattached.cpp @@ -0,0 +1,56 @@ +#include "configattached.hpp" +#include "config.hpp" +#include "configscope.hpp" +#include "monitorconfigmanager.hpp" + +namespace caelestia::config { + +Config::Config(ConfigScope* scope, QObject* parent) + : QObject(parent) + , m_scope(scope) { + connectScope(); +} + +void Config::connectScope() { + if (!m_scope) + return; + connect(m_scope, &ConfigScope::configChanged, this, &Config::sourceChanged); + connect(m_scope, &ConfigScope::tokensChanged, this, &Config::sourceChanged); +} + +#define CONFIG_ATTACHED_GETTER(Type, name) \ + const Type* Config::name() const { \ + if (m_scope && m_scope->config()) \ + return m_scope->config()->name(); \ + return GlobalConfig::instance()->name(); \ + } + +CONFIG_ATTACHED_GETTER(AppearanceConfig, appearance) +CONFIG_ATTACHED_GETTER(GeneralConfig, general) +CONFIG_ATTACHED_GETTER(BackgroundConfig, background) +CONFIG_ATTACHED_GETTER(BarConfig, bar) +CONFIG_ATTACHED_GETTER(BorderConfig, border) +CONFIG_ATTACHED_GETTER(DashboardConfig, dashboard) +CONFIG_ATTACHED_GETTER(ControlCenterConfig, controlCenter) +CONFIG_ATTACHED_GETTER(LauncherConfig, launcher) +CONFIG_ATTACHED_GETTER(NotifsConfig, notifs) +CONFIG_ATTACHED_GETTER(OsdConfig, osd) +CONFIG_ATTACHED_GETTER(SessionConfig, session) +CONFIG_ATTACHED_GETTER(WInfoConfig, winfo) +CONFIG_ATTACHED_GETTER(LockConfig, lock) +CONFIG_ATTACHED_GETTER(UtilitiesConfig, utilities) +CONFIG_ATTACHED_GETTER(SidebarConfig, sidebar) +CONFIG_ATTACHED_GETTER(ServiceConfig, services) +CONFIG_ATTACHED_GETTER(UserPaths, paths) + +#undef CONFIG_ATTACHED_GETTER + +GlobalConfig* Config::forScreen(const QString& screen) { + return GlobalConfig::forScreen(screen); +} + +Config* Config::qmlAttachedProperties(QObject* object) { + return new Config(ConfigScope::find(object), object); +} + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/configattached.hpp b/plugin/src/Caelestia/Config/configattached.hpp new file mode 100644 index 00000000..6aeb7c19 --- /dev/null +++ b/plugin/src/Caelestia/Config/configattached.hpp @@ -0,0 +1,69 @@ +#pragma once + +#include "config.hpp" +#include "configscope.hpp" + +namespace caelestia::config { + +class Config : public QObject { + Q_OBJECT + QML_ELEMENT + QML_UNCREATABLE("") + QML_ATTACHED(Config) + + Q_PROPERTY(caelestia::config::ConfigScope* scope READ scope NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::AppearanceConfig* appearance READ appearance NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::GeneralConfig* general READ general NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::BackgroundConfig* background READ background NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::BarConfig* bar READ bar NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::BorderConfig* border READ border NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::DashboardConfig* dashboard READ dashboard NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::ControlCenterConfig* controlCenter READ controlCenter NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::LauncherConfig* launcher READ launcher NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::NotifsConfig* notifs READ notifs NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::OsdConfig* osd READ osd NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::SessionConfig* session READ session NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::WInfoConfig* winfo READ winfo NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::LockConfig* lock READ lock NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::UtilitiesConfig* utilities READ utilities NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::SidebarConfig* sidebar READ sidebar NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::ServiceConfig* services READ services NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::UserPaths* paths READ paths NOTIFY sourceChanged) + +public: + explicit Config(ConfigScope* scope, QObject* parent = nullptr); + + [[nodiscard]] ConfigScope* scope() const { return m_scope; } + + [[nodiscard]] const AppearanceConfig* appearance() const; + [[nodiscard]] const GeneralConfig* general() const; + [[nodiscard]] const BackgroundConfig* background() const; + [[nodiscard]] const BarConfig* bar() const; + [[nodiscard]] const BorderConfig* border() const; + [[nodiscard]] const DashboardConfig* dashboard() const; + [[nodiscard]] const ControlCenterConfig* controlCenter() const; + [[nodiscard]] const LauncherConfig* launcher() const; + [[nodiscard]] const NotifsConfig* notifs() const; + [[nodiscard]] const OsdConfig* osd() const; + [[nodiscard]] const SessionConfig* session() const; + [[nodiscard]] const WInfoConfig* winfo() const; + [[nodiscard]] const LockConfig* lock() const; + [[nodiscard]] const UtilitiesConfig* utilities() const; + [[nodiscard]] const SidebarConfig* sidebar() const; + [[nodiscard]] const ServiceConfig* services() const; + [[nodiscard]] const UserPaths* paths() const; + + [[nodiscard]] Q_INVOKABLE static GlobalConfig* forScreen(const QString& screen); + + static Config* qmlAttachedProperties(QObject* object); + +signals: + void sourceChanged(); + +private: + void connectScope(); + + ConfigScope* m_scope; +}; + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/tokens.cpp b/plugin/src/Caelestia/Config/tokens.cpp index 84d3cef7..3d3f48c9 100644 --- a/plugin/src/Caelestia/Config/tokens.cpp +++ b/plugin/src/Caelestia/Config/tokens.cpp @@ -1,6 +1,5 @@ #include "tokens.hpp" #include "config.hpp" -#include "configscope.hpp" #include "monitorconfigmanager.hpp" #include @@ -53,83 +52,4 @@ TokenConfig* TokenConfig::create(QQmlEngine*, QJSEngine*) { return instance(); } -// Tokens (attached type) - -// Resolve appearance from per-monitor GlobalConfig overlay or global GlobalConfig -static const AppearanceConfig* resolveAppearance(ConfigScope* scope) { - if (scope && scope->config()) - return scope->config()->appearance(); - auto* global = GlobalConfig::instance(); - return global ? global->appearance() : nullptr; -} - -Tokens::Tokens(ConfigScope* scope, QObject* parent) - : QObject(parent) - , m_scope(scope) - , m_anim(new AnimTokens(this)) { - connectScope(); - bindAnim(); -} - -void Tokens::connectScope() { - if (!m_scope) - return; - connect(m_scope, &ConfigScope::configChanged, this, &Tokens::sourceChanged); - connect(m_scope, &ConfigScope::configChanged, this, &Tokens::bindAnim); -} - -void Tokens::bindAnim() { - auto* appearance = resolveAppearance(m_scope); - if (!appearance) - return; - - // Bind durations from resolved GlobalConfig appearance - m_anim->bindDurations(appearance->anim()->durations()); - - // Bind curves from TokenConfig - auto* tokens = TokenConfig::instance(); - if (tokens) - m_anim->bindCurves(tokens->appearance()->curves()); -} - -const AppearanceRounding* Tokens::rounding() const { - auto* a = resolveAppearance(m_scope); - return a ? a->rounding() : nullptr; -} - -const AppearanceSpacing* Tokens::spacing() const { - auto* a = resolveAppearance(m_scope); - return a ? a->spacing() : nullptr; -} - -const AppearancePadding* Tokens::padding() const { - auto* a = resolveAppearance(m_scope); - return a ? a->padding() : nullptr; -} - -const AppearanceFont* Tokens::font() const { - auto* a = resolveAppearance(m_scope); - return a ? a->font() : nullptr; -} - -const AppearanceTransparency* Tokens::transparency() const { - auto* a = resolveAppearance(m_scope); - return a ? a->transparency() : nullptr; -} - -const SizeTokens* Tokens::sizes() const { - if (m_scope && m_scope->tokens()) - return m_scope->tokens()->sizes(); - auto* global = TokenConfig::instance(); - return global ? global->sizes() : nullptr; -} - -TokenConfig* Tokens::forScreen(const QString& screen) { - return TokenConfig::forScreen(screen); -} - -Tokens* Tokens::qmlAttachedProperties(QObject* object) { - return new Tokens(ConfigScope::find(object), object); -} - } // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/tokens.hpp b/plugin/src/Caelestia/Config/tokens.hpp index 2448b737..ca42ccbd 100644 --- a/plugin/src/Caelestia/Config/tokens.hpp +++ b/plugin/src/Caelestia/Config/tokens.hpp @@ -342,47 +342,4 @@ private: TokenConfig* m_defaults = nullptr; }; -class Tokens : public QObject { - Q_OBJECT - Q_MOC_INCLUDE("configscope.hpp") - QML_ELEMENT - QML_UNCREATABLE("") - QML_ATTACHED(Tokens) - - Q_PROPERTY(const caelestia::config::AppearanceRounding* rounding READ rounding NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::AppearanceSpacing* spacing READ spacing NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::AppearancePadding* padding READ padding NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::AppearanceFont* font READ font NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::AppearanceTransparency* transparency READ transparency NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::SizeTokens* sizes READ sizes NOTIFY sourceChanged) - Q_PROPERTY(const caelestia::config::AnimTokens* anim READ anim NOTIFY sourceChanged) - -public: - explicit Tokens(ConfigScope* scope, QObject* parent = nullptr); - - [[nodiscard]] const AppearanceRounding* rounding() const; - [[nodiscard]] const AppearanceSpacing* spacing() const; - [[nodiscard]] const AppearancePadding* padding() const; - [[nodiscard]] const AppearanceFont* font() const; - [[nodiscard]] const AppearanceTransparency* transparency() const; - - [[nodiscard]] const SizeTokens* sizes() const; - - [[nodiscard]] const AnimTokens* anim() const { return m_anim; } - - [[nodiscard]] Q_INVOKABLE static TokenConfig* forScreen(const QString& screen); - - static Tokens* qmlAttachedProperties(QObject* object); - -signals: - void sourceChanged(); - -private: - void connectScope(); - void bindAnim(); - - ConfigScope* m_scope; - AnimTokens* m_anim = nullptr; -}; - } // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/tokensattached.cpp b/plugin/src/Caelestia/Config/tokensattached.cpp new file mode 100644 index 00000000..0f1a8bf3 --- /dev/null +++ b/plugin/src/Caelestia/Config/tokensattached.cpp @@ -0,0 +1,82 @@ +#include "tokensattached.hpp" +#include "anim.hpp" +#include "config.hpp" +#include "configscope.hpp" +#include "monitorconfigmanager.hpp" +#include "tokens.hpp" + +namespace caelestia::config { + +static const AppearanceConfig* resolveAppearance(ConfigScope* scope) { + if (scope && scope->config()) + return scope->config()->appearance(); + return GlobalConfig::instance()->appearance(); +} + +Tokens::Tokens(ConfigScope* scope, QObject* parent) + : QObject(parent) + , m_scope(scope) + , m_anim(new AnimTokens(this)) { + connectScope(); + bindAnim(); +} + +void Tokens::connectScope() { + if (!m_scope) + return; + connect(m_scope, &ConfigScope::configChanged, this, &Tokens::sourceChanged); + connect(m_scope, &ConfigScope::configChanged, this, &Tokens::bindAnim); +} + +void Tokens::bindAnim() { + auto* appearance = resolveAppearance(m_scope); + if (!appearance) + return; + + m_anim->bindDurations(appearance->anim()->durations()); + + auto* tokens = TokenConfig::instance(); + if (tokens) + m_anim->bindCurves(tokens->appearance()->curves()); +} + +const AppearanceRounding* Tokens::rounding() const { + auto* a = resolveAppearance(m_scope); + return a ? a->rounding() : nullptr; +} + +const AppearanceSpacing* Tokens::spacing() const { + auto* a = resolveAppearance(m_scope); + return a ? a->spacing() : nullptr; +} + +const AppearancePadding* Tokens::padding() const { + auto* a = resolveAppearance(m_scope); + return a ? a->padding() : nullptr; +} + +const AppearanceFont* Tokens::font() const { + auto* a = resolveAppearance(m_scope); + return a ? a->font() : nullptr; +} + +const AppearanceTransparency* Tokens::transparency() const { + auto* a = resolveAppearance(m_scope); + return a ? a->transparency() : nullptr; +} + +const SizeTokens* Tokens::sizes() const { + if (m_scope && m_scope->tokens()) + return m_scope->tokens()->sizes(); + return TokenConfig::instance()->sizes(); +} + +TokenConfig* Tokens::forScreen(const QString& screen) { + return TokenConfig::forScreen(screen); +} + +Tokens* Tokens::qmlAttachedProperties(QObject* object) { + return new Tokens(ConfigScope::find(object), object); +} + +} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/tokensattached.hpp b/plugin/src/Caelestia/Config/tokensattached.hpp new file mode 100644 index 00000000..df4eeece --- /dev/null +++ b/plugin/src/Caelestia/Config/tokensattached.hpp @@ -0,0 +1,52 @@ +#pragma once + +#include "anim.hpp" +#include "appearanceconfig.hpp" +#include "configscope.hpp" +#include "tokens.hpp" + +namespace caelestia::config { + +class Tokens : public QObject { + Q_OBJECT + QML_ELEMENT + QML_UNCREATABLE("") + QML_ATTACHED(Tokens) + + Q_PROPERTY(const caelestia::config::AppearanceRounding* rounding READ rounding NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::AppearanceSpacing* spacing READ spacing NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::AppearancePadding* padding READ padding NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::AppearanceFont* font READ font NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::AppearanceTransparency* transparency READ transparency NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::SizeTokens* sizes READ sizes NOTIFY sourceChanged) + Q_PROPERTY(const caelestia::config::AnimTokens* anim READ anim NOTIFY sourceChanged) + +public: + explicit Tokens(ConfigScope* scope, QObject* parent = nullptr); + + [[nodiscard]] const AppearanceRounding* rounding() const; + [[nodiscard]] const AppearanceSpacing* spacing() const; + [[nodiscard]] const AppearancePadding* padding() const; + [[nodiscard]] const AppearanceFont* font() const; + [[nodiscard]] const AppearanceTransparency* transparency() const; + + [[nodiscard]] const SizeTokens* sizes() const; + + [[nodiscard]] const AnimTokens* anim() const { return m_anim; } + + [[nodiscard]] Q_INVOKABLE static TokenConfig* forScreen(const QString& screen); + + static Tokens* qmlAttachedProperties(QObject* object); + +signals: + void sourceChanged(); + +private: + void connectScope(); + void bindAnim(); + + ConfigScope* m_scope; + AnimTokens* m_anim = nullptr; +}; + +} // namespace caelestia::config From dd15b1d80ea93ad526649f7c29046006fcd02711 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 03:54:01 +1000 Subject: [PATCH 52/81] refactor: static -> anonymous namespace --- plugin/src/Caelestia/Config/tokensattached.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugin/src/Caelestia/Config/tokensattached.cpp b/plugin/src/Caelestia/Config/tokensattached.cpp index 0f1a8bf3..0db81991 100644 --- a/plugin/src/Caelestia/Config/tokensattached.cpp +++ b/plugin/src/Caelestia/Config/tokensattached.cpp @@ -7,12 +7,16 @@ namespace caelestia::config { -static const AppearanceConfig* resolveAppearance(ConfigScope* scope) { +namespace { + +const AppearanceConfig* resolveAppearance(ConfigScope* scope) { if (scope && scope->config()) return scope->config()->appearance(); return GlobalConfig::instance()->appearance(); } +} // namespace + Tokens::Tokens(ConfigScope* scope, QObject* parent) : QObject(parent) , m_scope(scope) From f1fb68c7210783b0200ecbf2fcb4588219646587 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 03:58:35 +1000 Subject: [PATCH 53/81] feat: add auto save on option changes --- plugin/src/Caelestia/Config/rootconfig.cpp | 24 ++++++++++++++++++++++ plugin/src/Caelestia/Config/rootconfig.hpp | 3 +++ 2 files changed, 27 insertions(+) diff --git a/plugin/src/Caelestia/Config/rootconfig.cpp b/plugin/src/Caelestia/Config/rootconfig.cpp index 611abd57..d82d910b 100644 --- a/plugin/src/Caelestia/Config/rootconfig.cpp +++ b/plugin/src/Caelestia/Config/rootconfig.cpp @@ -96,6 +96,9 @@ void RootConfig::setupFileBackend(const QString& path, const QString& screen) { m_reloadDebounce->setInterval(50); connect(m_reloadDebounce, &QTimer::timeout, this, &RootConfig::reload); + // Auto-save when any property changes (debounced by the save timer) + connectAutoSave(this); + connect(m_watcher, &QFileSystemWatcher::directoryChanged, this, &RootConfig::onWatcherEvent); connect(m_watcher, &QFileSystemWatcher::fileChanged, this, &RootConfig::onWatcherEvent); @@ -111,6 +114,23 @@ void RootConfig::setupFileBackend(const QString& path, const QString& screen) { }); } +void RootConfig::connectAutoSave(ConfigObject* obj) { + connect(obj, &ConfigObject::propertiesChanged, this, [this] { + if (!m_loading) + saveToFile(); + }); + + // Recurse into sub-objects + const auto* meta = obj->metaObject(); + for (int i = meta->propertyOffset(); i < meta->propertyCount(); ++i) { + auto prop = meta->property(i); + auto value = prop.read(obj); + auto* subObj = value.value(); + if (subObj) + connectAutoSave(subObj); + } +} + void RootConfig::updateWatch() { auto targetDir = QFileInfo(m_filePath).absolutePath(); @@ -192,11 +212,15 @@ std::optional RootConfig::reloadFromFile() { qCDebug(lcConfig) << "Reloading" << metaObject()->className() << "from" << m_filePath; + m_loading = true; + clearLoadedKeys(); auto jsonObj = doc.object(); loadFromJson(jsonObj); + m_loading = false; + // Collect unknown keys — caller is responsible for emitting signals m_lastUnknownKeys = collectUnknownKeys(this, jsonObj); diff --git a/plugin/src/Caelestia/Config/rootconfig.hpp b/plugin/src/Caelestia/Config/rootconfig.hpp index fb6a68b5..01ce2e54 100644 --- a/plugin/src/Caelestia/Config/rootconfig.hpp +++ b/plugin/src/Caelestia/Config/rootconfig.hpp @@ -39,10 +39,13 @@ private: void updateWatch(); void onWatcherEvent(); + void connectAutoSave(ConfigObject* obj); + QString m_filePath; QString m_screen; QString m_watchedDir; bool m_recentlySaved = false; + bool m_loading = false; QFileSystemWatcher* m_watcher = nullptr; QTimer* m_saveTimer = nullptr; From 7b13772f26f31e20e094734fdbbe1229215fad4e Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 21:07:00 +1000 Subject: [PATCH 54/81] chore: add not per-mon opts to readme --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index d7e4c7c6..bd330395 100644 --- a/README.md +++ b/README.md @@ -226,6 +226,18 @@ For example, to disable the bar on DP-1: } ``` +> [!NOTE] +> Not all options are respect per-monitor overrides. Most notably, the following options will only read +> from the global config, and ignore the respective option in per-monitor config files. +> +> - All animation configs are not per-monitor +> - `general` (logo, terminal app, idle settings) +> - `services` (weather, audio, GPU, player settings, etc.) +> - `paths` (wallpaper dir, lyrics dir, etc.) +> - `notifs` (notification behavior) +> - `utilities` (individual toast enabled status, vpn configs) +> - `launcher` (actions, favourite apps, hidden apps) + ### Example configuration > [!NOTE] From 1385ca15debbb4ae964cfa2d42fb70bddaea6305 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 22:16:32 +1000 Subject: [PATCH 55/81] feat: add warning on global options using per-mon confs --- plugin/src/Caelestia/Config/configobject.cpp | 8 +++++ plugin/src/Caelestia/Config/configobject.hpp | 32 +++++++++++++++++++ plugin/src/Caelestia/Config/generalconfig.hpp | 20 ++++++------ .../src/Caelestia/Config/launcherconfig.hpp | 24 +++++++------- plugin/src/Caelestia/Config/notifsconfig.hpp | 8 ++--- plugin/src/Caelestia/Config/serviceconfig.hpp | 28 ++++++++-------- plugin/src/Caelestia/Config/userpaths.hpp | 4 +-- .../src/Caelestia/Config/utilitiesconfig.hpp | 28 ++++++++-------- 8 files changed, 96 insertions(+), 56 deletions(-) diff --git a/plugin/src/Caelestia/Config/configobject.cpp b/plugin/src/Caelestia/Config/configobject.cpp index cc38d7e5..d4a1a77f 100644 --- a/plugin/src/Caelestia/Config/configobject.cpp +++ b/plugin/src/Caelestia/Config/configobject.cpp @@ -29,6 +29,10 @@ void ConfigObject::loadFromJson(const QJsonObject& obj) { if (!obj.contains(key)) continue; + if (m_global && m_globalOnlyKeys.contains(key)) + qCWarning( + lcConfig, "Option '%s' is global-only and will be ignored in per-monitor config", qUtf8Printable(key)); + const auto jsonVal = obj.value(key); // Recurse into sub-objects @@ -227,6 +231,10 @@ void ConfigObject::onGlobalPropertiesChanged(const QMap& chan } } +void ConfigObject::markGlobalOnly(const QString& name) { + m_globalOnlyKeys.insert(name); +} + void ConfigObject::notifyPropertyChanged(const QString& name, const QVariant& value) { m_pendingChanges.insert(name, value); diff --git a/plugin/src/Caelestia/Config/configobject.hpp b/plugin/src/Caelestia/Config/configobject.hpp index 4e0cae92..8e3969a4 100644 --- a/plugin/src/Caelestia/Config/configobject.hpp +++ b/plugin/src/Caelestia/Config/configobject.hpp @@ -41,6 +41,34 @@ public: private: \ Type* m_##name = nullptr; +// Like CONFIG_PROPERTY but warns on read/write when accessed on a per-monitor overlay. +#define CONFIG_GLOBAL_PROPERTY(Type, name, ...) \ + Q_PROPERTY(Type name READ name WRITE set_##name NOTIFY name##Changed) \ + \ +public: \ + [[nodiscard]] Type name() const { \ + if (isOverlay()) \ + qCWarning(caelestia::config::lcConfig, "Reading global-only option '%s' on per-monitor overlay", #name); \ + return m_##name; \ + } \ + void set_##name(const Type& val) { \ + if (isOverlay()) \ + qCWarning(caelestia::config::lcConfig, "Writing global-only option '%s' on per-monitor overlay", #name); \ + if (caelestia::config::ConfigObject::updateMember(m_##name, val)) { \ + markPropertyLoaded(QStringLiteral(#name)); \ + Q_EMIT name##Changed(); \ + notifyPropertyChanged(QStringLiteral(#name), QVariant::fromValue(m_##name)); \ + } \ + } \ + Q_SIGNAL void name##Changed(); \ + \ +private: \ + Type m_##name __VA_OPT__(= __VA_ARGS__); \ + const bool m_##name##_go = [this] { \ + markGlobalOnly(QStringLiteral(#name)); \ + return true; \ + }(); + namespace caelestia::config { Q_DECLARE_LOGGING_CATEGORY(lcConfig) @@ -61,6 +89,8 @@ public: [[nodiscard]] bool isPropertyLoaded(const QString& name) const { return m_loadedKeys.contains(name); } + [[nodiscard]] bool isOverlay() const { return m_global != nullptr; } + Q_INVOKABLE void resetOption(const QString& name); template static bool updateMember(T& member, const T& value) { @@ -80,6 +110,7 @@ signals: protected: void markPropertyLoaded(const QString& name); + void markGlobalOnly(const QString& name); void notifyPropertyChanged(const QString& name, const QVariant& value); private: @@ -89,6 +120,7 @@ private: // Per-monitor overlay state ConfigObject* m_global = nullptr; QSet m_loadedKeys; + QSet m_globalOnlyKeys; QMap m_pendingChanges; QTimer* m_batchTimer = nullptr; }; diff --git a/plugin/src/Caelestia/Config/generalconfig.hpp b/plugin/src/Caelestia/Config/generalconfig.hpp index 32b7df1e..f84cfa34 100644 --- a/plugin/src/Caelestia/Config/generalconfig.hpp +++ b/plugin/src/Caelestia/Config/generalconfig.hpp @@ -12,10 +12,10 @@ class GeneralApps : public ConfigObject { Q_OBJECT QML_ANONYMOUS - CONFIG_PROPERTY(QStringList, terminal, { QStringLiteral("foot") }) - CONFIG_PROPERTY(QStringList, audio, { QStringLiteral("pavucontrol") }) - CONFIG_PROPERTY(QStringList, playback, { QStringLiteral("mpv") }) - CONFIG_PROPERTY(QStringList, explorer, { QStringLiteral("thunar") }) + CONFIG_GLOBAL_PROPERTY(QStringList, terminal, { QStringLiteral("foot") }) + CONFIG_GLOBAL_PROPERTY(QStringList, audio, { QStringLiteral("pavucontrol") }) + CONFIG_GLOBAL_PROPERTY(QStringList, playback, { QStringLiteral("mpv") }) + CONFIG_GLOBAL_PROPERTY(QStringList, explorer, { QStringLiteral("thunar") }) public: explicit GeneralApps(QObject* parent = nullptr) @@ -26,9 +26,9 @@ class GeneralIdle : public ConfigObject { Q_OBJECT QML_ANONYMOUS - CONFIG_PROPERTY(bool, lockBeforeSleep, true) - CONFIG_PROPERTY(bool, inhibitWhenAudio, true) - CONFIG_PROPERTY(QVariantList, timeouts) + CONFIG_GLOBAL_PROPERTY(bool, lockBeforeSleep, true) + CONFIG_GLOBAL_PROPERTY(bool, inhibitWhenAudio, true) + CONFIG_GLOBAL_PROPERTY(QVariantList, timeouts) public: explicit GeneralIdle(QObject* parent = nullptr) @@ -39,8 +39,8 @@ class GeneralBattery : public ConfigObject { Q_OBJECT QML_ANONYMOUS - CONFIG_PROPERTY(QVariantList, warnLevels) - CONFIG_PROPERTY(int, criticalLevel, 3) + CONFIG_GLOBAL_PROPERTY(QVariantList, warnLevels) + CONFIG_GLOBAL_PROPERTY(int, criticalLevel, 3) public: explicit GeneralBattery(QObject* parent = nullptr) @@ -51,7 +51,7 @@ class GeneralConfig : public ConfigObject { Q_OBJECT QML_ANONYMOUS - CONFIG_PROPERTY(QString, logo) + CONFIG_GLOBAL_PROPERTY(QString, logo) CONFIG_PROPERTY(qreal, mediaGifSpeedAdjustment, 300) CONFIG_PROPERTY(qreal, sessionGifSpeed, 0.7) CONFIG_SUBOBJECT(GeneralApps, apps) diff --git a/plugin/src/Caelestia/Config/launcherconfig.hpp b/plugin/src/Caelestia/Config/launcherconfig.hpp index 23f71734..b0c8d06b 100644 --- a/plugin/src/Caelestia/Config/launcherconfig.hpp +++ b/plugin/src/Caelestia/Config/launcherconfig.hpp @@ -12,11 +12,11 @@ class LauncherUseFuzzy : public ConfigObject { Q_OBJECT QML_ANONYMOUS - CONFIG_PROPERTY(bool, apps, false) - CONFIG_PROPERTY(bool, actions, false) - CONFIG_PROPERTY(bool, schemes, false) - CONFIG_PROPERTY(bool, variants, false) - CONFIG_PROPERTY(bool, wallpapers, false) + CONFIG_GLOBAL_PROPERTY(bool, apps, false) + CONFIG_GLOBAL_PROPERTY(bool, actions, false) + CONFIG_GLOBAL_PROPERTY(bool, schemes, false) + CONFIG_GLOBAL_PROPERTY(bool, variants, false) + CONFIG_GLOBAL_PROPERTY(bool, wallpapers, false) public: explicit LauncherUseFuzzy(QObject* parent = nullptr) @@ -31,15 +31,15 @@ class LauncherConfig : public ConfigObject { CONFIG_PROPERTY(bool, showOnHover, false) CONFIG_PROPERTY(int, maxShown, 7) CONFIG_PROPERTY(int, maxWallpapers, 9) - CONFIG_PROPERTY(QString, specialPrefix, QStringLiteral("@")) - CONFIG_PROPERTY(QString, actionPrefix, QStringLiteral(">")) - CONFIG_PROPERTY(bool, enableDangerousActions, false) + CONFIG_GLOBAL_PROPERTY(QString, specialPrefix, QStringLiteral("@")) + CONFIG_GLOBAL_PROPERTY(QString, actionPrefix, QStringLiteral(">")) + CONFIG_GLOBAL_PROPERTY(bool, enableDangerousActions, false) CONFIG_PROPERTY(int, dragThreshold, 50) - CONFIG_PROPERTY(bool, vimKeybinds, false) - CONFIG_PROPERTY(QStringList, favouriteApps) - CONFIG_PROPERTY(QStringList, hiddenApps) + CONFIG_GLOBAL_PROPERTY(bool, vimKeybinds, false) + CONFIG_GLOBAL_PROPERTY(QStringList, favouriteApps) + CONFIG_GLOBAL_PROPERTY(QStringList, hiddenApps) CONFIG_SUBOBJECT(LauncherUseFuzzy, useFuzzy) - CONFIG_PROPERTY(QVariantList, actions) + CONFIG_GLOBAL_PROPERTY(QVariantList, actions) public: explicit LauncherConfig(QObject* parent = nullptr) diff --git a/plugin/src/Caelestia/Config/notifsconfig.hpp b/plugin/src/Caelestia/Config/notifsconfig.hpp index 745b057b..eef360fe 100644 --- a/plugin/src/Caelestia/Config/notifsconfig.hpp +++ b/plugin/src/Caelestia/Config/notifsconfig.hpp @@ -10,12 +10,12 @@ class NotifsConfig : public ConfigObject { Q_OBJECT QML_ANONYMOUS - CONFIG_PROPERTY(bool, expire, true) - CONFIG_PROPERTY(QString, fullscreen, QStringLiteral("on")) - CONFIG_PROPERTY(int, defaultExpireTimeout, 5000) + CONFIG_GLOBAL_PROPERTY(bool, expire, true) + CONFIG_GLOBAL_PROPERTY(QString, fullscreen, QStringLiteral("on")) + CONFIG_GLOBAL_PROPERTY(int, defaultExpireTimeout, 5000) CONFIG_PROPERTY(qreal, clearThreshold, 0.3) CONFIG_PROPERTY(int, expandThreshold, 20) - CONFIG_PROPERTY(bool, actionOnClick, false) + CONFIG_GLOBAL_PROPERTY(bool, actionOnClick, false) CONFIG_PROPERTY(int, groupPreviewNum, 3) CONFIG_PROPERTY(bool, openExpanded, false) diff --git a/plugin/src/Caelestia/Config/serviceconfig.hpp b/plugin/src/Caelestia/Config/serviceconfig.hpp index 062bf451..439092af 100644 --- a/plugin/src/Caelestia/Config/serviceconfig.hpp +++ b/plugin/src/Caelestia/Config/serviceconfig.hpp @@ -11,20 +11,20 @@ class ServiceConfig : public ConfigObject { Q_OBJECT QML_ANONYMOUS - CONFIG_PROPERTY(QString, weatherLocation) - CONFIG_PROPERTY(bool, useFahrenheit, false) - CONFIG_PROPERTY(bool, useFahrenheitPerformance, false) - CONFIG_PROPERTY(bool, useTwelveHourClock, false) - CONFIG_PROPERTY(QString, gpuType) - CONFIG_PROPERTY(int, visualiserBars, 45) - CONFIG_PROPERTY(qreal, audioIncrement, 0.1) - CONFIG_PROPERTY(qreal, brightnessIncrement, 0.1) - CONFIG_PROPERTY(qreal, maxVolume, 1.0) - CONFIG_PROPERTY(bool, smartScheme, true) - CONFIG_PROPERTY(QString, defaultPlayer, QStringLiteral("Spotify")) - CONFIG_PROPERTY(QVariantList, playerAliases) - CONFIG_PROPERTY(bool, showLyrics, false) - CONFIG_PROPERTY(QString, lyricsBackend, QStringLiteral("Auto")) + CONFIG_GLOBAL_PROPERTY(QString, weatherLocation) + CONFIG_GLOBAL_PROPERTY(bool, useFahrenheit, false) + CONFIG_GLOBAL_PROPERTY(bool, useFahrenheitPerformance, false) + CONFIG_GLOBAL_PROPERTY(bool, useTwelveHourClock, false) + CONFIG_GLOBAL_PROPERTY(QString, gpuType) + CONFIG_GLOBAL_PROPERTY(int, visualiserBars, 45) + CONFIG_GLOBAL_PROPERTY(qreal, audioIncrement, 0.1) + CONFIG_GLOBAL_PROPERTY(qreal, brightnessIncrement, 0.1) + CONFIG_GLOBAL_PROPERTY(qreal, maxVolume, 1.0) + CONFIG_GLOBAL_PROPERTY(bool, smartScheme, true) + CONFIG_GLOBAL_PROPERTY(QString, defaultPlayer, QStringLiteral("Spotify")) + CONFIG_GLOBAL_PROPERTY(QVariantList, playerAliases) + CONFIG_GLOBAL_PROPERTY(bool, showLyrics, false) + CONFIG_GLOBAL_PROPERTY(QString, lyricsBackend, QStringLiteral("Auto")) public: explicit ServiceConfig(QObject* parent = nullptr) diff --git a/plugin/src/Caelestia/Config/userpaths.hpp b/plugin/src/Caelestia/Config/userpaths.hpp index 18812188..f0d0fb2e 100644 --- a/plugin/src/Caelestia/Config/userpaths.hpp +++ b/plugin/src/Caelestia/Config/userpaths.hpp @@ -12,9 +12,9 @@ class UserPaths : public ConfigObject { Q_OBJECT QML_ANONYMOUS - CONFIG_PROPERTY(QString, wallpaperDir, + CONFIG_GLOBAL_PROPERTY(QString, wallpaperDir, QStandardPaths::writableLocation(QStandardPaths::PicturesLocation) + QStringLiteral("/Wallpapers")) - CONFIG_PROPERTY(QString, lyricsDir, QDir::homePath() + QStringLiteral("/Music/lyrics/")) + CONFIG_GLOBAL_PROPERTY(QString, lyricsDir, QDir::homePath() + QStringLiteral("/Music/lyrics/")) CONFIG_PROPERTY(QString, sessionGif, QStringLiteral("root:/assets/kurukuru.gif")) CONFIG_PROPERTY(QString, mediaGif, QStringLiteral("root:/assets/bongocat.gif")) CONFIG_PROPERTY(QString, noNotifsPic, QStringLiteral("root:/assets/dino.png")) diff --git a/plugin/src/Caelestia/Config/utilitiesconfig.hpp b/plugin/src/Caelestia/Config/utilitiesconfig.hpp index 57b6fccd..cabb877e 100644 --- a/plugin/src/Caelestia/Config/utilitiesconfig.hpp +++ b/plugin/src/Caelestia/Config/utilitiesconfig.hpp @@ -11,19 +11,19 @@ class UtilitiesToasts : public ConfigObject { Q_OBJECT QML_ANONYMOUS - CONFIG_PROPERTY(bool, configLoaded, true) CONFIG_PROPERTY(QString, fullscreen, QStringLiteral("off")) - CONFIG_PROPERTY(bool, chargingChanged, true) - CONFIG_PROPERTY(bool, gameModeChanged, true) - CONFIG_PROPERTY(bool, dndChanged, true) - CONFIG_PROPERTY(bool, audioOutputChanged, true) - CONFIG_PROPERTY(bool, audioInputChanged, true) - CONFIG_PROPERTY(bool, capsLockChanged, true) - CONFIG_PROPERTY(bool, numLockChanged, true) - CONFIG_PROPERTY(bool, kbLayoutChanged, true) - CONFIG_PROPERTY(bool, kbLimit, true) - CONFIG_PROPERTY(bool, vpnChanged, true) - CONFIG_PROPERTY(bool, nowPlaying, false) + CONFIG_GLOBAL_PROPERTY(bool, configLoaded, true) + CONFIG_GLOBAL_PROPERTY(bool, chargingChanged, true) + CONFIG_GLOBAL_PROPERTY(bool, gameModeChanged, true) + CONFIG_GLOBAL_PROPERTY(bool, dndChanged, true) + CONFIG_GLOBAL_PROPERTY(bool, audioOutputChanged, true) + CONFIG_GLOBAL_PROPERTY(bool, audioInputChanged, true) + CONFIG_GLOBAL_PROPERTY(bool, capsLockChanged, true) + CONFIG_GLOBAL_PROPERTY(bool, numLockChanged, true) + CONFIG_GLOBAL_PROPERTY(bool, kbLayoutChanged, true) + CONFIG_GLOBAL_PROPERTY(bool, kbLimit, true) + CONFIG_GLOBAL_PROPERTY(bool, vpnChanged, true) + CONFIG_GLOBAL_PROPERTY(bool, nowPlaying, false) public: explicit UtilitiesToasts(QObject* parent = nullptr) @@ -34,8 +34,8 @@ class UtilitiesVpn : public ConfigObject { Q_OBJECT QML_ANONYMOUS - CONFIG_PROPERTY(bool, enabled, false) - CONFIG_PROPERTY(QVariantList, provider) + CONFIG_GLOBAL_PROPERTY(bool, enabled, false) + CONFIG_GLOBAL_PROPERTY(QVariantList, provider) public: explicit UtilitiesVpn(QObject* parent = nullptr) From e16a70bee783d492ac36cbc9c6892f3cffab69be Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 22:26:30 +1000 Subject: [PATCH 56/81] fix: don't sync global props Prevents warning on syncs as well --- plugin/src/Caelestia/Config/configobject.cpp | 8 ++++---- plugin/src/Caelestia/Config/configobject.hpp | 2 ++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/plugin/src/Caelestia/Config/configobject.cpp b/plugin/src/Caelestia/Config/configobject.cpp index d4a1a77f..6a700cf4 100644 --- a/plugin/src/Caelestia/Config/configobject.cpp +++ b/plugin/src/Caelestia/Config/configobject.cpp @@ -29,7 +29,7 @@ void ConfigObject::loadFromJson(const QJsonObject& obj) { if (!obj.contains(key)) continue; - if (m_global && m_globalOnlyKeys.contains(key)) + if (m_global && isGlobalOnly(key)) qCWarning( lcConfig, "Option '%s' is global-only and will be ignored in per-monitor config", qUtf8Printable(key)); @@ -157,7 +157,7 @@ void ConfigObject::syncFromGlobal(ConfigObject* global) { continue; } - if (!prop.isWritable()) + if (!prop.isWritable() || isGlobalOnly(key)) continue; if (!m_loadedKeys.contains(key)) { @@ -188,7 +188,7 @@ void ConfigObject::resyncFromGlobal() { continue; } - if (!prop.isWritable()) + if (!prop.isWritable() || isGlobalOnly(key)) continue; if (!m_loadedKeys.contains(key)) { @@ -218,7 +218,7 @@ void ConfigObject::resetOption(const QString& name) { void ConfigObject::onGlobalPropertiesChanged(const QMap& changed) { for (auto it = changed.begin(); it != changed.end(); ++it) { - if (m_loadedKeys.contains(it.key())) + if (m_loadedKeys.contains(it.key()) || isGlobalOnly(it.key())) continue; int idx = metaObject()->indexOfProperty(it.key().toUtf8().constData()); diff --git a/plugin/src/Caelestia/Config/configobject.hpp b/plugin/src/Caelestia/Config/configobject.hpp index 8e3969a4..f3e10508 100644 --- a/plugin/src/Caelestia/Config/configobject.hpp +++ b/plugin/src/Caelestia/Config/configobject.hpp @@ -91,6 +91,8 @@ public: [[nodiscard]] bool isOverlay() const { return m_global != nullptr; } + [[nodiscard]] bool isGlobalOnly(const QString& name) const { return m_globalOnlyKeys.contains(name); } + Q_INVOKABLE void resetOption(const QString& name); template static bool updateMember(T& member, const T& value) { From 129b0633811dbe5e98ad5b48da50f179d4c90592 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 22:38:36 +1000 Subject: [PATCH 57/81] refactor: move inline getter impls to cpp file --- plugin/src/Caelestia/Config/anim.cpp | 40 +++++++++++++++++++ plugin/src/Caelestia/Config/anim.hpp | 29 +++++--------- .../src/Caelestia/Config/configattached.cpp | 4 ++ .../src/Caelestia/Config/configattached.hpp | 2 +- plugin/src/Caelestia/Config/configobject.cpp | 12 ++++++ plugin/src/Caelestia/Config/configobject.hpp | 8 ++-- plugin/src/Caelestia/Config/configscope.cpp | 12 ++++++ plugin/src/Caelestia/Config/configscope.hpp | 8 ++-- plugin/src/Caelestia/Config/rootconfig.cpp | 4 ++ plugin/src/Caelestia/Config/rootconfig.hpp | 2 +- .../src/Caelestia/Config/tokensattached.cpp | 4 ++ .../src/Caelestia/Config/tokensattached.hpp | 3 +- 12 files changed, 95 insertions(+), 33 deletions(-) diff --git a/plugin/src/Caelestia/Config/anim.cpp b/plugin/src/Caelestia/Config/anim.cpp index 9c2b9111..824523c2 100644 --- a/plugin/src/Caelestia/Config/anim.cpp +++ b/plugin/src/Caelestia/Config/anim.cpp @@ -9,6 +9,46 @@ namespace caelestia::config { AnimTokens::AnimTokens(QObject* parent) : QObject(parent) {} +QEasingCurve AnimTokens::emphasized() const { + return m_emphasized; +} + +QEasingCurve AnimTokens::emphasizedAccel() const { + return m_emphasizedAccel; +} + +QEasingCurve AnimTokens::emphasizedDecel() const { + return m_emphasizedDecel; +} + +QEasingCurve AnimTokens::standard() const { + return m_standard; +} + +QEasingCurve AnimTokens::standardAccel() const { + return m_standardAccel; +} + +QEasingCurve AnimTokens::standardDecel() const { + return m_standardDecel; +} + +QEasingCurve AnimTokens::expressiveFastSpatial() const { + return m_expressiveFastSpatial; +} + +QEasingCurve AnimTokens::expressiveDefaultSpatial() const { + return m_expressiveDefaultSpatial; +} + +QEasingCurve AnimTokens::expressiveSlowSpatial() const { + return m_expressiveSlowSpatial; +} + +AnimDurations* AnimTokens::durations() const { + return m_durations; +} + QEasingCurve AnimTokens::buildCurve(const QList& points) { QEasingCurve curve(QEasingCurve::BezierSpline); diff --git a/plugin/src/Caelestia/Config/anim.hpp b/plugin/src/Caelestia/Config/anim.hpp index 464ee32a..1d5909a7 100644 --- a/plugin/src/Caelestia/Config/anim.hpp +++ b/plugin/src/Caelestia/Config/anim.hpp @@ -33,25 +33,16 @@ public: void bindCurves(AnimCurves* curves); void bindDurations(AnimDurations* durations); - [[nodiscard]] QEasingCurve emphasized() const { return m_emphasized; } - - [[nodiscard]] QEasingCurve emphasizedAccel() const { return m_emphasizedAccel; } - - [[nodiscard]] QEasingCurve emphasizedDecel() const { return m_emphasizedDecel; } - - [[nodiscard]] QEasingCurve standard() const { return m_standard; } - - [[nodiscard]] QEasingCurve standardAccel() const { return m_standardAccel; } - - [[nodiscard]] QEasingCurve standardDecel() const { return m_standardDecel; } - - [[nodiscard]] QEasingCurve expressiveFastSpatial() const { return m_expressiveFastSpatial; } - - [[nodiscard]] QEasingCurve expressiveDefaultSpatial() const { return m_expressiveDefaultSpatial; } - - [[nodiscard]] QEasingCurve expressiveSlowSpatial() const { return m_expressiveSlowSpatial; } - - [[nodiscard]] AnimDurations* durations() const { return m_durations; } + [[nodiscard]] QEasingCurve emphasized() const; + [[nodiscard]] QEasingCurve emphasizedAccel() const; + [[nodiscard]] QEasingCurve emphasizedDecel() const; + [[nodiscard]] QEasingCurve standard() const; + [[nodiscard]] QEasingCurve standardAccel() const; + [[nodiscard]] QEasingCurve standardDecel() const; + [[nodiscard]] QEasingCurve expressiveFastSpatial() const; + [[nodiscard]] QEasingCurve expressiveDefaultSpatial() const; + [[nodiscard]] QEasingCurve expressiveSlowSpatial() const; + [[nodiscard]] AnimDurations* durations() const; signals: void curvesChanged(); diff --git a/plugin/src/Caelestia/Config/configattached.cpp b/plugin/src/Caelestia/Config/configattached.cpp index 02574910..55694c32 100644 --- a/plugin/src/Caelestia/Config/configattached.cpp +++ b/plugin/src/Caelestia/Config/configattached.cpp @@ -11,6 +11,10 @@ Config::Config(ConfigScope* scope, QObject* parent) connectScope(); } +ConfigScope* Config::scope() const { + return m_scope; +} + void Config::connectScope() { if (!m_scope) return; diff --git a/plugin/src/Caelestia/Config/configattached.hpp b/plugin/src/Caelestia/Config/configattached.hpp index 6aeb7c19..d63c330f 100644 --- a/plugin/src/Caelestia/Config/configattached.hpp +++ b/plugin/src/Caelestia/Config/configattached.hpp @@ -33,7 +33,7 @@ class Config : public QObject { public: explicit Config(ConfigScope* scope, QObject* parent = nullptr); - [[nodiscard]] ConfigScope* scope() const { return m_scope; } + [[nodiscard]] ConfigScope* scope() const; [[nodiscard]] const AppearanceConfig* appearance() const; [[nodiscard]] const GeneralConfig* general() const; diff --git a/plugin/src/Caelestia/Config/configobject.cpp b/plugin/src/Caelestia/Config/configobject.cpp index 6a700cf4..b209b30a 100644 --- a/plugin/src/Caelestia/Config/configobject.cpp +++ b/plugin/src/Caelestia/Config/configobject.cpp @@ -198,6 +198,18 @@ void ConfigObject::resyncFromGlobal() { } } +bool ConfigObject::isPropertyLoaded(const QString& name) const { + return m_loadedKeys.contains(name); +} + +bool ConfigObject::isOverlay() const { + return m_global != nullptr; +} + +bool ConfigObject::isGlobalOnly(const QString& name) const { + return m_globalOnlyKeys.contains(name); +} + void ConfigObject::markPropertyLoaded(const QString& name) { m_loadedKeys.insert(name); } diff --git a/plugin/src/Caelestia/Config/configobject.hpp b/plugin/src/Caelestia/Config/configobject.hpp index f3e10508..6666b704 100644 --- a/plugin/src/Caelestia/Config/configobject.hpp +++ b/plugin/src/Caelestia/Config/configobject.hpp @@ -87,11 +87,9 @@ public: void resyncFromGlobal(); void clearLoadedKeys(); - [[nodiscard]] bool isPropertyLoaded(const QString& name) const { return m_loadedKeys.contains(name); } - - [[nodiscard]] bool isOverlay() const { return m_global != nullptr; } - - [[nodiscard]] bool isGlobalOnly(const QString& name) const { return m_globalOnlyKeys.contains(name); } + [[nodiscard]] bool isPropertyLoaded(const QString& name) const; + [[nodiscard]] bool isOverlay() const; + [[nodiscard]] bool isGlobalOnly(const QString& name) const; Q_INVOKABLE void resetOption(const QString& name); diff --git a/plugin/src/Caelestia/Config/configscope.cpp b/plugin/src/Caelestia/Config/configscope.cpp index 6f20f05d..769f2b73 100644 --- a/plugin/src/Caelestia/Config/configscope.cpp +++ b/plugin/src/Caelestia/Config/configscope.cpp @@ -6,6 +6,18 @@ namespace caelestia::config { ConfigScope::ConfigScope(QQuickItem* parent) : QQuickItem(parent) {} +QString ConfigScope::screen() const { + return m_screen; +} + +GlobalConfig* ConfigScope::config() const { + return m_config; +} + +TokenConfig* ConfigScope::tokens() const { + return m_tokens; +} + void ConfigScope::setScreen(const QString& screen) { if (m_screen == screen) return; diff --git a/plugin/src/Caelestia/Config/configscope.hpp b/plugin/src/Caelestia/Config/configscope.hpp index 202cf48a..82869816 100644 --- a/plugin/src/Caelestia/Config/configscope.hpp +++ b/plugin/src/Caelestia/Config/configscope.hpp @@ -21,13 +21,11 @@ class ConfigScope : public QQuickItem { public: explicit ConfigScope(QQuickItem* parent = nullptr); - [[nodiscard]] QString screen() const { return m_screen; } - + [[nodiscard]] QString screen() const; void setScreen(const QString& screen); - [[nodiscard]] GlobalConfig* config() const { return m_config; } - - [[nodiscard]] TokenConfig* tokens() const { return m_tokens; } + [[nodiscard]] GlobalConfig* config() const; + [[nodiscard]] TokenConfig* tokens() const; static ConfigScope* find(QObject* object); diff --git a/plugin/src/Caelestia/Config/rootconfig.cpp b/plugin/src/Caelestia/Config/rootconfig.cpp index d82d910b..9e976ab2 100644 --- a/plugin/src/Caelestia/Config/rootconfig.cpp +++ b/plugin/src/Caelestia/Config/rootconfig.cpp @@ -20,6 +20,10 @@ QString watchRoot() { RootConfig::RootConfig(QObject* parent) : ConfigObject(parent) {} +bool RootConfig::recentlySaved() const { + return m_recentlySaved; +} + QStringList RootConfig::collectUnknownKeys(const ConfigObject* obj, const QJsonObject& json) { QStringList unknown; const auto* meta = obj->metaObject(); diff --git a/plugin/src/Caelestia/Config/rootconfig.hpp b/plugin/src/Caelestia/Config/rootconfig.hpp index 01ce2e54..bf9b8e2c 100644 --- a/plugin/src/Caelestia/Config/rootconfig.hpp +++ b/plugin/src/Caelestia/Config/rootconfig.hpp @@ -21,7 +21,7 @@ public: // Returns nullopt if retrying, empty string on success, error message on failure. [[nodiscard]] std::optional reloadFromFile(); - [[nodiscard]] bool recentlySaved() const { return m_recentlySaved; } + [[nodiscard]] bool recentlySaved() const; Q_INVOKABLE void save(); Q_INVOKABLE void reload(); diff --git a/plugin/src/Caelestia/Config/tokensattached.cpp b/plugin/src/Caelestia/Config/tokensattached.cpp index 0db81991..23ee2841 100644 --- a/plugin/src/Caelestia/Config/tokensattached.cpp +++ b/plugin/src/Caelestia/Config/tokensattached.cpp @@ -75,6 +75,10 @@ const SizeTokens* Tokens::sizes() const { return TokenConfig::instance()->sizes(); } +const AnimTokens* Tokens::anim() const { + return m_anim; +} + TokenConfig* Tokens::forScreen(const QString& screen) { return TokenConfig::forScreen(screen); } diff --git a/plugin/src/Caelestia/Config/tokensattached.hpp b/plugin/src/Caelestia/Config/tokensattached.hpp index df4eeece..88cf0102 100644 --- a/plugin/src/Caelestia/Config/tokensattached.hpp +++ b/plugin/src/Caelestia/Config/tokensattached.hpp @@ -31,8 +31,7 @@ public: [[nodiscard]] const AppearanceTransparency* transparency() const; [[nodiscard]] const SizeTokens* sizes() const; - - [[nodiscard]] const AnimTokens* anim() const { return m_anim; } + [[nodiscard]] const AnimTokens* anim() const; [[nodiscard]] Q_INVOKABLE static TokenConfig* forScreen(const QString& screen); From b8d17ad8efb797cae68cb7ad5679afb24efaf031 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 22:47:30 +1000 Subject: [PATCH 58/81] fix: use global config for global properties --- modules/background/DesktopClock.qml | 2 +- modules/bar/components/Clock.qml | 2 +- modules/controlcenter/launcher/Settings.qml | 4 ++-- modules/dashboard/Performance.qml | 2 +- modules/dashboard/WeatherTab.qml | 2 +- modules/dashboard/dash/DateTime.qml | 2 +- modules/launcher/AppList.qml | 2 +- modules/launcher/Content.qml | 6 +++--- modules/launcher/ContentList.qml | 2 +- modules/launcher/items/AppItem.qml | 2 +- modules/launcher/items/CalcItem.qml | 2 +- modules/launcher/services/Actions.qml | 4 ++-- modules/launcher/services/Apps.qml | 2 +- modules/launcher/services/M3Variants.qml | 2 +- modules/launcher/services/Schemes.qml | 2 +- modules/lock/Center.qml | 2 +- modules/lock/WeatherInfo.qml | 2 +- modules/osd/Content.qml | 4 ++-- modules/utilities/cards/IdleInhibit.qml | 2 +- services/Weather.qml | 8 ++++---- 20 files changed, 28 insertions(+), 28 deletions(-) diff --git a/modules/background/DesktopClock.qml b/modules/background/DesktopClock.qml index b7d22417..be6dff61 100644 --- a/modules/background/DesktopClock.qml +++ b/modules/background/DesktopClock.qml @@ -106,7 +106,7 @@ Item { Layout.alignment: Qt.AlignTop Layout.topMargin: Tokens.padding.large * 1.4 * root.clockScale - active: Config.services.useTwelveHourClock + active: GlobalConfig.services.useTwelveHourClock visible: active sourceComponent: StyledText { diff --git a/modules/bar/components/Clock.qml b/modules/bar/components/Clock.qml index d6528c64..ffe599af 100644 --- a/modules/bar/components/Clock.qml +++ b/modules/bar/components/Clock.qml @@ -62,7 +62,7 @@ StyledRect { anchors.horizontalCenter: parent.horizontalCenter horizontalAlignment: StyledText.AlignHCenter - text: Time.format(Config.services.useTwelveHourClock ? "hh\nmm\nA" : "hh\nmm") + text: Time.format(GlobalConfig.services.useTwelveHourClock ? "hh\nmm\nA" : "hh\nmm") font.pointSize: Tokens.font.size.smaller font.family: Tokens.font.family.mono color: root.colour diff --git a/modules/controlcenter/launcher/Settings.qml b/modules/controlcenter/launcher/Settings.qml index df25a827..657c4a28 100644 --- a/modules/controlcenter/launcher/Settings.qml +++ b/modules/controlcenter/launcher/Settings.qml @@ -100,13 +100,13 @@ ColumnLayout { PropertyRow { label: qsTr("Special prefix") - value: Config.launcher.specialPrefix || qsTr("None") + value: GlobalConfig.launcher.specialPrefix || qsTr("None") } PropertyRow { showTopMargin: true label: qsTr("Action prefix") - value: Config.launcher.actionPrefix || qsTr("None") + value: GlobalConfig.launcher.actionPrefix || qsTr("None") } } diff --git a/modules/dashboard/Performance.qml b/modules/dashboard/Performance.qml index 0c405fd3..cfed9296 100644 --- a/modules/dashboard/Performance.qml +++ b/modules/dashboard/Performance.qml @@ -14,7 +14,7 @@ Item { readonly property int minWidth: 400 + 400 + Tokens.spacing.normal + 120 + Tokens.padding.large * 2 function displayTemp(temp: real): string { - return `${Math.ceil(Config.services.useFahrenheitPerformance ? temp * 1.8 + 32 : temp)}°${Config.services.useFahrenheitPerformance ? "F" : "C"}`; + return `${Math.ceil(GlobalConfig.services.useFahrenheitPerformance ? temp * 1.8 + 32 : temp)}°${GlobalConfig.services.useFahrenheitPerformance ? "F" : "C"}`; } implicitWidth: Math.max(minWidth, content.implicitWidth) diff --git a/modules/dashboard/WeatherTab.qml b/modules/dashboard/WeatherTab.qml index 312372b2..3cf8d3b7 100644 --- a/modules/dashboard/WeatherTab.qml +++ b/modules/dashboard/WeatherTab.qml @@ -193,7 +193,7 @@ Item { StyledText { Layout.alignment: Qt.AlignHCenter - text: Config.services.useFahrenheit ? forecastItem.modelData.maxTempF + "°" + " / " + forecastItem.modelData.minTempF + "°" : forecastItem.modelData.maxTempC + "°" + " / " + forecastItem.modelData.minTempC + "°" + text: GlobalConfig.services.useFahrenheit ? forecastItem.modelData.maxTempF + "°" + " / " + forecastItem.modelData.minTempF + "°" : forecastItem.modelData.maxTempC + "°" + " / " + forecastItem.modelData.minTempC + "°" font.weight: 600 color: Colours.palette.m3tertiary } diff --git a/modules/dashboard/dash/DateTime.qml b/modules/dashboard/dash/DateTime.qml index 248d41f3..82bee151 100644 --- a/modules/dashboard/dash/DateTime.qml +++ b/modules/dashboard/dash/DateTime.qml @@ -51,7 +51,7 @@ Item { asynchronous: true Layout.alignment: Qt.AlignHCenter - active: Config.services.useTwelveHourClock + active: GlobalConfig.services.useTwelveHourClock visible: active sourceComponent: StyledText { diff --git a/modules/launcher/AppList.qml b/modules/launcher/AppList.qml index 52b9b1b5..ac5bea65 100644 --- a/modules/launcher/AppList.qml +++ b/modules/launcher/AppList.qml @@ -50,7 +50,7 @@ StyledListView { state: { const text = search.text; - const prefix = Config.launcher.actionPrefix; + const prefix = GlobalConfig.launcher.actionPrefix; if (text.startsWith(prefix)) { for (const action of ["calc", "scheme", "variant"]) if (text.startsWith(`${prefix}${action} `)) diff --git a/modules/launcher/Content.qml b/modules/launcher/Content.qml index 2ca41739..7e283c8f 100644 --- a/modules/launcher/Content.qml +++ b/modules/launcher/Content.qml @@ -78,7 +78,7 @@ Item { topPadding: Tokens.padding.larger bottomPadding: Tokens.padding.larger - placeholderText: qsTr("Type \"%1\" for commands").arg(Config.launcher.actionPrefix) + placeholderText: qsTr("Type \"%1\" for commands").arg(GlobalConfig.launcher.actionPrefix) onAccepted: { const currentItem = list.currentList?.currentItem; @@ -88,8 +88,8 @@ Item { Wallpapers.previewColourLock = true; Wallpapers.setWallpaper(currentItem.modelData.path); root.visibilities.launcher = false; - } else if (text.startsWith(Config.launcher.actionPrefix)) { - if (text.startsWith(`${Config.launcher.actionPrefix}calc `)) + } else if (text.startsWith(GlobalConfig.launcher.actionPrefix)) { + if (text.startsWith(`${GlobalConfig.launcher.actionPrefix}calc `)) currentItem.onClicked(); else currentItem.modelData.onClicked(list.currentList); diff --git a/modules/launcher/ContentList.qml b/modules/launcher/ContentList.qml index 4667a540..482d6c0d 100644 --- a/modules/launcher/ContentList.qml +++ b/modules/launcher/ContentList.qml @@ -18,7 +18,7 @@ Item { required property int padding required property int rounding - readonly property bool showWallpapers: search.text.startsWith(`${Config.launcher.actionPrefix}wallpaper `) + readonly property bool showWallpapers: search.text.startsWith(`${GlobalConfig.launcher.actionPrefix}wallpaper `) readonly property var currentList: showWallpapers ? wallpaperList.item : appList.item // Can be either ListView or PathView, so can't type properly anchors.horizontalCenter: parent.horizontalCenter diff --git a/modules/launcher/items/AppItem.qml b/modules/launcher/items/AppItem.qml index 7a399549..a78349cd 100644 --- a/modules/launcher/items/AppItem.qml +++ b/modules/launcher/items/AppItem.qml @@ -78,7 +78,7 @@ Item { asynchronous: true anchors.verticalCenter: parent.verticalCenter anchors.right: parent.right - active: root.modelData && Strings.testRegexList(Config.launcher.favouriteApps, root.modelData.id) + active: root.modelData && Strings.testRegexList(GlobalConfig.launcher.favouriteApps, root.modelData.id) sourceComponent: MaterialIcon { text: "favorite" diff --git a/modules/launcher/items/CalcItem.qml b/modules/launcher/items/CalcItem.qml index 66882991..534b6c10 100644 --- a/modules/launcher/items/CalcItem.qml +++ b/modules/launcher/items/CalcItem.qml @@ -10,7 +10,7 @@ Item { id: root required property var list - readonly property string math: list.search.text.slice(`${Config.launcher.actionPrefix}calc `.length) + readonly property string math: list.search.text.slice(`${GlobalConfig.launcher.actionPrefix}calc `.length) function onClicked(): void { Quickshell.execDetached(["wl-copy", Qalculator.rawResult]); diff --git a/modules/launcher/services/Actions.qml b/modules/launcher/services/Actions.qml index 30b8bb2c..13ec0361 100644 --- a/modules/launcher/services/Actions.qml +++ b/modules/launcher/services/Actions.qml @@ -11,7 +11,7 @@ Searcher { id: root function transformSearch(search: string): string { - return search.slice(Config.launcher.actionPrefix.length); + return search.slice(GlobalConfig.launcher.actionPrefix.length); } list: variants.instances @@ -39,7 +39,7 @@ Searcher { return; if (command[0] === "autocomplete" && command.length > 1) { - list.search.text = `${Config.launcher.actionPrefix}${command[1]} `; + list.search.text = `${GlobalConfig.launcher.actionPrefix}${command[1]} `; } else if (command[0] === "setMode" && command.length > 1) { list.visibilities.launcher = false; Colours.setMode(command[1]); diff --git a/modules/launcher/services/Apps.qml b/modules/launcher/services/Apps.qml index 57461ffb..ff05456b 100644 --- a/modules/launcher/services/Apps.qml +++ b/modules/launcher/services/Apps.qml @@ -24,7 +24,7 @@ Searcher { } function search(search: string): list { - const prefix = Config.launcher.specialPrefix; + const prefix = GlobalConfig.launcher.specialPrefix; if (search.startsWith(`${prefix}i `)) { keys = ["id", "name"]; diff --git a/modules/launcher/services/M3Variants.qml b/modules/launcher/services/M3Variants.qml index d7d7bf56..aa5d1ca7 100644 --- a/modules/launcher/services/M3Variants.qml +++ b/modules/launcher/services/M3Variants.qml @@ -10,7 +10,7 @@ Searcher { id: root function transformSearch(search: string): string { - return search.slice(`${Config.launcher.actionPrefix}variant `.length); + return search.slice(`${GlobalConfig.launcher.actionPrefix}variant `.length); } list: [ diff --git a/modules/launcher/services/Schemes.qml b/modules/launcher/services/Schemes.qml index 571cb101..bd2a10f7 100644 --- a/modules/launcher/services/Schemes.qml +++ b/modules/launcher/services/Schemes.qml @@ -14,7 +14,7 @@ Searcher { property string currentVariant function transformSearch(search: string): string { - return search.slice(`${Config.launcher.actionPrefix}scheme `.length); + return search.slice(`${GlobalConfig.launcher.actionPrefix}scheme `.length); } function selector(item: var): string { diff --git a/modules/lock/Center.qml b/modules/lock/Center.qml index be7bb22d..712e6709 100644 --- a/modules/lock/Center.qml +++ b/modules/lock/Center.qml @@ -58,7 +58,7 @@ ColumnLayout { Layout.leftMargin: Tokens.spacing.small Layout.alignment: Qt.AlignVCenter - active: Config.services.useTwelveHourClock + active: GlobalConfig.services.useTwelveHourClock visible: active sourceComponent: StyledText { diff --git a/modules/lock/WeatherInfo.qml b/modules/lock/WeatherInfo.qml index e76be9e6..d96a54df 100644 --- a/modules/lock/WeatherInfo.qml +++ b/modules/lock/WeatherInfo.qml @@ -159,7 +159,7 @@ ColumnLayout { StyledText { Layout.alignment: Qt.AlignHCenter - text: Config.services.useFahrenheit ? `${forecastHour.modelData?.tempF ?? 0}°F` : `${forecastHour.modelData?.tempC ?? 0}°C` + text: GlobalConfig.services.useFahrenheit ? `${forecastHour.modelData?.tempF ?? 0}°F` : `${forecastHour.modelData?.tempC ?? 0}°C` color: Colours.palette.m3secondary font.pointSize: Tokens.font.size.larger } diff --git a/modules/osd/Content.qml b/modules/osd/Content.qml index 012c4fe5..ff3295b7 100644 --- a/modules/osd/Content.qml +++ b/modules/osd/Content.qml @@ -46,7 +46,7 @@ Item { icon: Icons.getVolumeIcon(value, root.muted) value: root.volume - to: Config.services.maxVolume + to: GlobalConfig.services.maxVolume onMoved: Audio.setVolume(value) } } @@ -71,7 +71,7 @@ Item { icon: Icons.getMicVolumeIcon(value, root.sourceMuted) value: root.sourceVolume - to: Config.services.maxVolume + to: GlobalConfig.services.maxVolume onMoved: Audio.setSourceVolume(value) } } diff --git a/modules/utilities/cards/IdleInhibit.qml b/modules/utilities/cards/IdleInhibit.qml index bf80dee3..13d6f7a1 100644 --- a/modules/utilities/cards/IdleInhibit.qml +++ b/modules/utilities/cards/IdleInhibit.qml @@ -93,7 +93,7 @@ StyledRect { id: activeText anchors.centerIn: parent - text: qsTr("Active since %1").arg(Qt.formatTime(IdleInhibitor.enabledSince, Config.services.useTwelveHourClock ? "hh:mm a" : "hh:mm")) + text: qsTr("Active since %1").arg(Qt.formatTime(IdleInhibitor.enabledSince, GlobalConfig.services.useTwelveHourClock ? "hh:mm a" : "hh:mm")) color: Colours.palette.m3onPrimary font.pointSize: Math.round(Tokens.font.size.small * 0.9) } diff --git a/services/Weather.qml b/services/Weather.qml index e5037c40..504c0bbb 100644 --- a/services/Weather.qml +++ b/services/Weather.qml @@ -17,12 +17,12 @@ Singleton { readonly property string icon: cc ? Icons.getWeatherIcon(cc.weatherCode) : "cloud_alert" readonly property string description: cc?.weatherDesc ?? qsTr("No weather") - readonly property string temp: Config.services.useFahrenheit ? `${cc?.tempF ?? 0}°F` : `${cc?.tempC ?? 0}°C` - readonly property string feelsLike: Config.services.useFahrenheit ? `${cc?.feelsLikeF ?? 0}°F` : `${cc?.feelsLikeC ?? 0}°C` + readonly property string temp: GlobalConfig.services.useFahrenheit ? `${cc?.tempF ?? 0}°F` : `${cc?.tempC ?? 0}°C` + readonly property string feelsLike: GlobalConfig.services.useFahrenheit ? `${cc?.feelsLikeF ?? 0}°F` : `${cc?.feelsLikeC ?? 0}°C` readonly property int humidity: cc?.humidity ?? 0 readonly property real windSpeed: cc?.windSpeed ?? 0 - readonly property string sunrise: cc ? Qt.formatDateTime(new Date(cc.sunrise), Config.services.useTwelveHourClock ? "h:mm A" : "h:mm") : "--:--" - readonly property string sunset: cc ? Qt.formatDateTime(new Date(cc.sunset), Config.services.useTwelveHourClock ? "h:mm A" : "h:mm") : "--:--" + readonly property string sunrise: cc ? Qt.formatDateTime(new Date(cc.sunrise), GlobalConfig.services.useTwelveHourClock ? "h:mm A" : "h:mm") : "--:--" + readonly property string sunset: cc ? Qt.formatDateTime(new Date(cc.sunset), GlobalConfig.services.useTwelveHourClock ? "h:mm A" : "h:mm") : "--:--" readonly property var cachedCities: new Map() From 8f579a1e65872a37dd7801487dda50a2faf7df73 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 22:52:18 +1000 Subject: [PATCH 59/81] fix: ignore most operations if global only --- plugin/src/Caelestia/Config/configobject.cpp | 20 ++++++++++++++++---- plugin/src/Caelestia/Config/configobject.hpp | 1 + 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/plugin/src/Caelestia/Config/configobject.cpp b/plugin/src/Caelestia/Config/configobject.cpp index b209b30a..8b53b6d1 100644 --- a/plugin/src/Caelestia/Config/configobject.cpp +++ b/plugin/src/Caelestia/Config/configobject.cpp @@ -29,7 +29,7 @@ void ConfigObject::loadFromJson(const QJsonObject& obj) { if (!obj.contains(key)) continue; - if (m_global && isGlobalOnly(key)) + if (isGlobalOnly(key)) qCWarning( lcConfig, "Option '%s' is global-only and will be ignored in per-monitor config", qUtf8Printable(key)); @@ -79,6 +79,10 @@ QJsonObject ConfigObject::toJsonObject() const { continue; const auto key = QString::fromUtf8(prop.name()); + + if (isGlobalOnly(key)) + continue; + const auto value = prop.read(this); // Recurse into sub-objects — include only if they have loaded keys @@ -125,6 +129,8 @@ void ConfigObject::clearLoadedKeys() { const auto* meta = metaObject(); for (int i = meta->propertyOffset(); i < meta->propertyCount(); ++i) { auto prop = meta->property(i); + if (isGlobalOnly(QString::fromUtf8(prop.name()))) + continue; auto value = prop.read(this); auto* subObj = value.value(); if (subObj) @@ -146,6 +152,9 @@ void ConfigObject::syncFromGlobal(ConfigObject* global) { auto prop = meta->property(i); const auto key = QString::fromUtf8(prop.name()); + if (isGlobalOnly(key)) + continue; + auto current = prop.read(this); auto* subObj = current.value(); @@ -157,7 +166,7 @@ void ConfigObject::syncFromGlobal(ConfigObject* global) { continue; } - if (!prop.isWritable() || isGlobalOnly(key)) + if (!prop.isWritable()) continue; if (!m_loadedKeys.contains(key)) { @@ -180,6 +189,9 @@ void ConfigObject::resyncFromGlobal() { auto prop = meta->property(i); const auto key = QString::fromUtf8(prop.name()); + if (isGlobalOnly(key)) + continue; + auto current = prop.read(this); auto* subObj = current.value(); @@ -188,7 +200,7 @@ void ConfigObject::resyncFromGlobal() { continue; } - if (!prop.isWritable() || isGlobalOnly(key)) + if (!prop.isWritable()) continue; if (!m_loadedKeys.contains(key)) { @@ -207,7 +219,7 @@ bool ConfigObject::isOverlay() const { } bool ConfigObject::isGlobalOnly(const QString& name) const { - return m_globalOnlyKeys.contains(name); + return isOverlay() && m_globalOnlyKeys.contains(name); } void ConfigObject::markPropertyLoaded(const QString& name) { diff --git a/plugin/src/Caelestia/Config/configobject.hpp b/plugin/src/Caelestia/Config/configobject.hpp index 6666b704..d13e6119 100644 --- a/plugin/src/Caelestia/Config/configobject.hpp +++ b/plugin/src/Caelestia/Config/configobject.hpp @@ -89,6 +89,7 @@ public: [[nodiscard]] bool isPropertyLoaded(const QString& name) const; [[nodiscard]] bool isOverlay() const; + // Returns true only on overlays — global singleton always returns false. [[nodiscard]] bool isGlobalOnly(const QString& name) const; Q_INVOKABLE void resetOption(const QString& name); From 666d451f4b063bb86775bd9da1a3af1211efc072 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 23:02:00 +1000 Subject: [PATCH 60/81] fix: global config use for rest of global props --- modules/BatteryMonitor.qml | 4 +- .../bar/popouts/kblayout/KbLayoutModel.qml | 2 +- .../controlcenter/launcher/LauncherPane.qml | 24 ++++++------ modules/controlcenter/launcher/Settings.qml | 16 ++++---- .../controlcenter/network/NetworkSettings.qml | 8 ++-- modules/controlcenter/network/VpnDetails.qml | 18 ++++----- modules/controlcenter/network/VpnList.qml | 38 +++++++++---------- modules/controlcenter/network/VpnSettings.qml | 20 +++++----- .../notifications/NotificationsPane.qml | 26 ++++++------- modules/launcher/Content.qml | 2 +- modules/launcher/services/Actions.qml | 4 +- modules/launcher/services/Apps.qml | 6 +-- modules/launcher/services/M3Variants.qml | 2 +- modules/launcher/services/Schemes.qml | 2 +- modules/notifications/Notification.qml | 2 +- modules/utilities/cards/Toggles.qml | 2 +- services/Audio.qml | 4 +- services/GameMode.qml | 4 +- services/Hypr.qml | 6 +-- services/NotifData.qml | 6 +-- services/Notifs.qml | 4 +- services/Players.qml | 2 +- services/VPN.qml | 6 +-- services/Wallpapers.qml | 2 +- 24 files changed, 105 insertions(+), 105 deletions(-) diff --git a/modules/BatteryMonitor.qml b/modules/BatteryMonitor.qml index b6412283..d0327ba0 100644 --- a/modules/BatteryMonitor.qml +++ b/modules/BatteryMonitor.qml @@ -12,10 +12,10 @@ Scope { Connections { function onOnBatteryChanged(): void { if (UPower.onBattery) { - if (Config.utilities.toasts.chargingChanged) + if (GlobalConfig.utilities.toasts.chargingChanged) Toaster.toast(qsTr("Charger unplugged"), qsTr("Battery is discharging"), "power_off"); } else { - if (Config.utilities.toasts.chargingChanged) + if (GlobalConfig.utilities.toasts.chargingChanged) Toaster.toast(qsTr("Charger plugged in"), qsTr("Battery is charging"), "power"); for (const level of root.warnLevels) level.warned = false; diff --git a/modules/bar/popouts/kblayout/KbLayoutModel.qml b/modules/bar/popouts/kblayout/KbLayoutModel.qml index b6535847..f62d0b98 100644 --- a/modules/bar/popouts/kblayout/KbLayoutModel.qml +++ b/modules/bar/popouts/kblayout/KbLayoutModel.qml @@ -106,7 +106,7 @@ Item { arr = arr.filter(i => i.layoutIndex !== activeIndex); arr.forEach(i => _visibleModel.append(i)); - if (!Config.utilities.toasts.kbLimit) + if (!GlobalConfig.utilities.toasts.kbLimit) return; if (_layoutsModel.count > 4) { diff --git a/modules/controlcenter/launcher/LauncherPane.qml b/modules/controlcenter/launcher/LauncherPane.qml index e5353fba..70649bce 100644 --- a/modules/controlcenter/launcher/LauncherPane.qml +++ b/modules/controlcenter/launcher/LauncherPane.qml @@ -37,8 +37,8 @@ Item { const appId = root.selectedApp.id || root.selectedApp.entry?.id; - root.hideFromLauncherChecked = Config.launcher.hiddenApps && Config.launcher.hiddenApps.length > 0 && Strings.testRegexList(Config.launcher.hiddenApps, appId); - root.favouriteChecked = Config.launcher.favouriteApps && Config.launcher.favouriteApps.length > 0 && Strings.testRegexList(Config.launcher.favouriteApps, appId); + root.hideFromLauncherChecked = GlobalConfig.launcher.hiddenApps && GlobalConfig.launcher.hiddenApps.length > 0 && Strings.testRegexList(GlobalConfig.launcher.hiddenApps, appId); + root.favouriteChecked = GlobalConfig.launcher.favouriteApps && GlobalConfig.launcher.favouriteApps.length > 0 && Strings.testRegexList(GlobalConfig.launcher.favouriteApps, appId); } function saveHiddenApps(isHidden) { @@ -48,7 +48,7 @@ Item { const appId = root.selectedApp.id || root.selectedApp.entry?.id; - const hiddenApps = Config.launcher.hiddenApps ? [...Config.launcher.hiddenApps] : []; + const hiddenApps = GlobalConfig.launcher.hiddenApps ? [...GlobalConfig.launcher.hiddenApps] : []; if (isHidden) { if (!hiddenApps.includes(appId)) { @@ -128,7 +128,7 @@ Item { id: allAppsDb path: `${Paths.state}/apps.sqlite` - favouriteApps: Config.launcher.favouriteApps + favouriteApps: GlobalConfig.launcher.favouriteApps entries: DesktopEntries.applications.values } @@ -358,8 +358,8 @@ Item { } Loader { - readonly property bool isHidden: modelData ? Strings.testRegexList(Config.launcher.hiddenApps, modelData.id) : false - readonly property bool isFav: modelData ? Strings.testRegexList(Config.launcher.favouriteApps, modelData.id) : false + readonly property bool isHidden: modelData ? Strings.testRegexList(GlobalConfig.launcher.hiddenApps, modelData.id) : false + readonly property bool isFav: modelData ? Strings.testRegexList(GlobalConfig.launcher.favouriteApps, modelData.id) : false Layout.alignment: Qt.AlignVCenter asynchronous: true @@ -422,8 +422,8 @@ Item { onDisplayedAppChanged: { if (displayedApp) { const appId = displayedApp.id || displayedApp.entry?.id; - root.hideFromLauncherChecked = Config.launcher.hiddenApps && Config.launcher.hiddenApps.length > 0 && Strings.testRegexList(Config.launcher.hiddenApps, appId); - root.favouriteChecked = Config.launcher.favouriteApps && Config.launcher.favouriteApps.length > 0 && Strings.testRegexList(Config.launcher.favouriteApps, appId); + root.hideFromLauncherChecked = GlobalConfig.launcher.hiddenApps && GlobalConfig.launcher.hiddenApps.length > 0 && Strings.testRegexList(GlobalConfig.launcher.hiddenApps, appId); + root.favouriteChecked = GlobalConfig.launcher.favouriteApps && GlobalConfig.launcher.favouriteApps.length > 0 && Strings.testRegexList(GlobalConfig.launcher.favouriteApps, appId); } else { root.hideFromLauncherChecked = false; root.favouriteChecked = false; @@ -606,14 +606,14 @@ Item { // * app isn't in favouriteApps array but marked as favourite anyway // ^^^ This means that this app is favourited because of a regex check // this button can not toggle regexed apps - enabled: appDetailsLayout.displayedApp !== null && !root.hideFromLauncherChecked && (Config.launcher.favouriteApps.indexOf(appDetailsLayout.displayedApp.id || appDetailsLayout.displayedApp.entry?.id) !== -1 || !root.favouriteChecked) + enabled: appDetailsLayout.displayedApp !== null && !root.hideFromLauncherChecked && (GlobalConfig.launcher.favouriteApps.indexOf(appDetailsLayout.displayedApp.id || appDetailsLayout.displayedApp.entry?.id) !== -1 || !root.favouriteChecked) opacity: enabled ? 1 : 0.6 onToggled: checked => { root.favouriteChecked = checked; const app = appDetailsLayout.displayedApp; if (app) { const appId = app.id || app.entry?.id; - const favouriteApps = Config.launcher.favouriteApps ? [...Config.launcher.favouriteApps] : []; + const favouriteApps = GlobalConfig.launcher.favouriteApps ? [...GlobalConfig.launcher.favouriteApps] : []; if (checked) { if (!favouriteApps.includes(appId)) { favouriteApps.push(appId); @@ -638,14 +638,14 @@ Item { // * app isn't in hiddenApps array but marked as hidden anyway // ^^^ This means that this app is hidden because of a regex check // this button can not toggle regexed apps - enabled: appDetailsLayout.displayedApp !== null && !root.favouriteChecked && (Config.launcher.hiddenApps.indexOf(appDetailsLayout.displayedApp.id || appDetailsLayout.displayedApp.entry?.id) !== -1 || !root.hideFromLauncherChecked) + enabled: appDetailsLayout.displayedApp !== null && !root.favouriteChecked && (GlobalConfig.launcher.hiddenApps.indexOf(appDetailsLayout.displayedApp.id || appDetailsLayout.displayedApp.entry?.id) !== -1 || !root.hideFromLauncherChecked) opacity: enabled ? 1 : 0.6 onToggled: checked => { root.hideFromLauncherChecked = checked; const app = appDetailsLayout.displayedApp; if (app) { const appId = app.id || app.entry?.id; - const hiddenApps = Config.launcher.hiddenApps ? [...Config.launcher.hiddenApps] : []; + const hiddenApps = GlobalConfig.launcher.hiddenApps ? [...GlobalConfig.launcher.hiddenApps] : []; if (checked) { if (!hiddenApps.includes(appId)) { hiddenApps.push(appId); diff --git a/modules/controlcenter/launcher/Settings.qml b/modules/controlcenter/launcher/Settings.qml index 657c4a28..f0181230 100644 --- a/modules/controlcenter/launcher/Settings.qml +++ b/modules/controlcenter/launcher/Settings.qml @@ -47,7 +47,7 @@ ColumnLayout { ToggleRow { label: qsTr("Vim keybinds") - checked: Config.launcher.vimKeybinds + checked: GlobalConfig.launcher.vimKeybinds toggle.onToggled: { GlobalConfig.launcher.vimKeybinds = checked; } @@ -55,7 +55,7 @@ ColumnLayout { ToggleRow { label: qsTr("Enable dangerous actions") - checked: Config.launcher.enableDangerousActions + checked: GlobalConfig.launcher.enableDangerousActions toggle.onToggled: { GlobalConfig.launcher.enableDangerousActions = checked; } @@ -119,7 +119,7 @@ ColumnLayout { SectionContainer { ToggleRow { label: qsTr("Apps") - checked: Config.launcher.useFuzzy.apps + checked: GlobalConfig.launcher.useFuzzy.apps toggle.onToggled: { GlobalConfig.launcher.useFuzzy.apps = checked; } @@ -127,7 +127,7 @@ ColumnLayout { ToggleRow { label: qsTr("Actions") - checked: Config.launcher.useFuzzy.actions + checked: GlobalConfig.launcher.useFuzzy.actions toggle.onToggled: { GlobalConfig.launcher.useFuzzy.actions = checked; } @@ -135,7 +135,7 @@ ColumnLayout { ToggleRow { label: qsTr("Schemes") - checked: Config.launcher.useFuzzy.schemes + checked: GlobalConfig.launcher.useFuzzy.schemes toggle.onToggled: { GlobalConfig.launcher.useFuzzy.schemes = checked; } @@ -143,7 +143,7 @@ ColumnLayout { ToggleRow { label: qsTr("Variants") - checked: Config.launcher.useFuzzy.variants + checked: GlobalConfig.launcher.useFuzzy.variants toggle.onToggled: { GlobalConfig.launcher.useFuzzy.variants = checked; } @@ -151,7 +151,7 @@ ColumnLayout { ToggleRow { label: qsTr("Wallpapers") - checked: Config.launcher.useFuzzy.wallpapers + checked: GlobalConfig.launcher.useFuzzy.wallpapers toggle.onToggled: { GlobalConfig.launcher.useFuzzy.wallpapers = checked; } @@ -202,7 +202,7 @@ ColumnLayout { PropertyRow { label: qsTr("Total hidden") - value: qsTr("%1").arg(Config.launcher.hiddenApps ? Config.launcher.hiddenApps.length : 0) + value: qsTr("%1").arg(GlobalConfig.launcher.hiddenApps ? GlobalConfig.launcher.hiddenApps.length : 0) } } } diff --git a/modules/controlcenter/network/NetworkSettings.qml b/modules/controlcenter/network/NetworkSettings.qml index 5ed755fe..d8700ecd 100644 --- a/modules/controlcenter/network/NetworkSettings.qml +++ b/modules/controlcenter/network/NetworkSettings.qml @@ -65,15 +65,15 @@ ColumnLayout { Layout.topMargin: Tokens.spacing.large title: qsTr("VPN") description: qsTr("VPN provider settings") - visible: Config.utilities.vpn.enabled || Config.utilities.vpn.provider.length > 0 + visible: GlobalConfig.utilities.vpn.enabled || GlobalConfig.utilities.vpn.provider.length > 0 } SectionContainer { - visible: Config.utilities.vpn.enabled || Config.utilities.vpn.provider.length > 0 + visible: GlobalConfig.utilities.vpn.enabled || GlobalConfig.utilities.vpn.provider.length > 0 ToggleRow { label: qsTr("VPN enabled") - checked: Config.utilities.vpn.enabled + checked: GlobalConfig.utilities.vpn.enabled toggle.onToggled: { GlobalConfig.utilities.vpn.enabled = checked; } @@ -82,7 +82,7 @@ ColumnLayout { PropertyRow { showTopMargin: true label: qsTr("Providers") - value: qsTr("%1").arg(Config.utilities.vpn.provider.length) + value: qsTr("%1").arg(GlobalConfig.utilities.vpn.provider.length) } TextButton { diff --git a/modules/controlcenter/network/VpnDetails.qml b/modules/controlcenter/network/VpnDetails.qml index f0197f9c..c146554f 100644 --- a/modules/controlcenter/network/VpnDetails.qml +++ b/modules/controlcenter/network/VpnDetails.qml @@ -21,7 +21,7 @@ DeviceDetails { readonly property bool providerEnabled: { if (!vpnProvider || vpnProvider.index === undefined) return false; - const provider = Config.utilities.vpn.provider[vpnProvider.index]; + const provider = GlobalConfig.utilities.vpn.provider[vpnProvider.index]; return provider && typeof provider === "object" && provider.enabled === true; } @@ -55,8 +55,8 @@ DeviceDetails { const index = root.vpnProvider.index; // Copy providers and update enabled state - for (let i = 0; i < Config.utilities.vpn.provider.length; i++) { - const p = Config.utilities.vpn.provider[i]; + for (let i = 0; i < GlobalConfig.utilities.vpn.provider.length; i++) { + const p = GlobalConfig.utilities.vpn.provider[i]; if (typeof p === "object") { const newProvider = { name: p.name, @@ -115,7 +115,7 @@ DeviceDetails { inactiveOnColour: Colours.palette.m3onSecondaryContainer onClicked: { - const provider = Config.utilities.vpn.provider[root.vpnProvider.index]; + const provider = GlobalConfig.utilities.vpn.provider[root.vpnProvider.index]; editVpnDialog.editIndex = root.vpnProvider.index; editVpnDialog.providerName = root.vpnProvider.name; editVpnDialog.displayName = root.vpnProvider.displayName; @@ -134,9 +134,9 @@ DeviceDetails { onClicked: { const providers = []; - for (let i = 0; i < Config.utilities.vpn.provider.length; i++) { + for (let i = 0; i < GlobalConfig.utilities.vpn.provider.length; i++) { if (i !== root.vpnProvider.index) { - providers.push(Config.utilities.vpn.provider[i]); + providers.push(GlobalConfig.utilities.vpn.provider[i]); } } GlobalConfig.utilities.vpn.provider = providers; @@ -500,10 +500,10 @@ DeviceDetails { onClicked: { const providers = []; - const oldProvider = Config.utilities.vpn.provider[editVpnDialog.editIndex]; + const oldProvider = GlobalConfig.utilities.vpn.provider[editVpnDialog.editIndex]; const wasEnabled = typeof oldProvider === "object" ? (oldProvider.enabled !== false) : true; - for (let i = 0; i < Config.utilities.vpn.provider.length; i++) { + for (let i = 0; i < GlobalConfig.utilities.vpn.provider.length; i++) { if (i === editVpnDialog.editIndex) { const hasCommands = editVpnDialog.connectCmd.length > 0 && editVpnDialog.disconnectCmd.length > 0; const newProvider = { @@ -520,7 +520,7 @@ DeviceDetails { providers.push(newProvider); } else { - const p = Config.utilities.vpn.provider[i]; + const p = GlobalConfig.utilities.vpn.provider[i]; const reconstructed = { displayName: p.displayName, enabled: p.enabled, diff --git a/modules/controlcenter/network/VpnList.qml b/modules/controlcenter/network/VpnList.qml index dd63300d..23fdf5b1 100644 --- a/modules/controlcenter/network/VpnList.qml +++ b/modules/controlcenter/network/VpnList.qml @@ -27,8 +27,8 @@ ColumnLayout { root.pendingSwitchIndex = -1; const providers = []; - for (let i = 0; i < Config.utilities.vpn.provider.length; i++) { - const p = Config.utilities.vpn.provider[i]; + for (let i = 0; i < GlobalConfig.utilities.vpn.provider.length; i++) { + const p = GlobalConfig.utilities.vpn.provider[i]; if (typeof p === "object") { const newProvider = { name: p.name, @@ -79,7 +79,7 @@ ColumnLayout { spacing: Tokens.spacing.smaller model: ScriptModel { - values: Config.utilities.vpn.provider.map((provider, index) => { + values: GlobalConfig.utilities.vpn.provider.map((provider, index) => { const isObject = typeof provider === "object"; const name = isObject ? (provider.name || "custom") : String(provider); const displayName = isObject ? (provider.displayName || name) : name; @@ -222,8 +222,8 @@ ColumnLayout { VPN.toggle(); } else { const providers = []; - for (let i = 0; i < Config.utilities.vpn.provider.length; i++) { - const p = Config.utilities.vpn.provider[i]; + for (let i = 0; i < GlobalConfig.utilities.vpn.provider.length; i++) { + const p = GlobalConfig.utilities.vpn.provider[i]; if (typeof p === "object") { const newProvider = { name: p.name, @@ -273,9 +273,9 @@ ColumnLayout { StateLayer { function onClicked(): void { const providers = []; - for (let i = 0; i < Config.utilities.vpn.provider.length; i++) { + for (let i = 0; i < GlobalConfig.utilities.vpn.provider.length; i++) { if (i !== modelData.index) { - const p = Config.utilities.vpn.provider[i]; + const p = GlobalConfig.utilities.vpn.provider[i]; const reconstructed = { name: p.name, displayName: p.displayName, @@ -346,7 +346,7 @@ ColumnLayout { } function showEditForm(index: int): void { - const provider = Config.utilities.vpn.provider[index]; + const provider = GlobalConfig.utilities.vpn.provider[index]; const isObject = typeof provider === "object"; editIndex = index; @@ -484,8 +484,8 @@ ColumnLayout { inactiveOnColour: Colours.palette.m3onSurface onClicked: { const providers = []; - for (let i = 0; i < Config.utilities.vpn.provider.length; i++) { - providers.push(Config.utilities.vpn.provider[i]); + for (let i = 0; i < GlobalConfig.utilities.vpn.provider.length; i++) { + providers.push(GlobalConfig.utilities.vpn.provider[i]); } providers.push({ name: "netbird", @@ -504,8 +504,8 @@ ColumnLayout { inactiveOnColour: Colours.palette.m3onSurface onClicked: { const providers = []; - for (let i = 0; i < Config.utilities.vpn.provider.length; i++) { - providers.push(Config.utilities.vpn.provider[i]); + for (let i = 0; i < GlobalConfig.utilities.vpn.provider.length; i++) { + providers.push(GlobalConfig.utilities.vpn.provider[i]); } providers.push({ name: "tailscale", @@ -524,8 +524,8 @@ ColumnLayout { inactiveOnColour: Colours.palette.m3onSurface onClicked: { const providers = []; - for (let i = 0; i < Config.utilities.vpn.provider.length; i++) { - providers.push(Config.utilities.vpn.provider[i]); + for (let i = 0; i < GlobalConfig.utilities.vpn.provider.length; i++) { + providers.push(GlobalConfig.utilities.vpn.provider[i]); } providers.push({ name: "warp", @@ -780,21 +780,21 @@ ColumnLayout { } if (vpnDialog.editIndex >= 0) { - const oldProvider = Config.utilities.vpn.provider[vpnDialog.editIndex]; + const oldProvider = GlobalConfig.utilities.vpn.provider[vpnDialog.editIndex]; if (typeof oldProvider === "object" && oldProvider.enabled !== undefined) { newProvider.enabled = oldProvider.enabled; } - for (let i = 0; i < Config.utilities.vpn.provider.length; i++) { + for (let i = 0; i < GlobalConfig.utilities.vpn.provider.length; i++) { if (i === vpnDialog.editIndex) { providers.push(newProvider); } else { - providers.push(Config.utilities.vpn.provider[i]); + providers.push(GlobalConfig.utilities.vpn.provider[i]); } } } else { - for (let i = 0; i < Config.utilities.vpn.provider.length; i++) { - providers.push(Config.utilities.vpn.provider[i]); + for (let i = 0; i < GlobalConfig.utilities.vpn.provider.length; i++) { + providers.push(GlobalConfig.utilities.vpn.provider[i]); } providers.push(newProvider); } diff --git a/modules/controlcenter/network/VpnSettings.qml b/modules/controlcenter/network/VpnSettings.qml index 27c1cc8e..064f32a1 100644 --- a/modules/controlcenter/network/VpnSettings.qml +++ b/modules/controlcenter/network/VpnSettings.qml @@ -34,7 +34,7 @@ ColumnLayout { SectionContainer { ToggleRow { label: qsTr("VPN enabled") - checked: Config.utilities.vpn.enabled + checked: GlobalConfig.utilities.vpn.enabled toggle.onToggled: { GlobalConfig.utilities.vpn.enabled = checked; } @@ -58,7 +58,7 @@ ColumnLayout { spacing: Tokens.spacing.smaller model: ScriptModel { - values: Config.utilities.vpn.provider.map((provider, index) => { + values: GlobalConfig.utilities.vpn.provider.map((provider, index) => { const isObject = typeof provider === "object"; const name = isObject ? (provider.name || "custom") : String(provider); const displayName = isObject ? (provider.displayName || name) : name; @@ -116,11 +116,11 @@ ColumnLayout { IconButton { icon: modelData.isActive ? "arrow_downward" : "arrow_upward" - visible: !modelData.isActive || Config.utilities.vpn.provider.length > 1 + visible: !modelData.isActive || GlobalConfig.utilities.vpn.provider.length > 1 onClicked: { const providers = []; - for (let i = 0; i < Config.utilities.vpn.provider.length; i++) { - const p = Config.utilities.vpn.provider[i]; + for (let i = 0; i < GlobalConfig.utilities.vpn.provider.length; i++) { + const p = GlobalConfig.utilities.vpn.provider[i]; const reconstructed = { name: p.name, displayName: p.displayName, @@ -155,9 +155,9 @@ ColumnLayout { icon: "delete" onClicked: { const providers = []; - for (let i = 0; i < Config.utilities.vpn.provider.length; i++) { + for (let i = 0; i < GlobalConfig.utilities.vpn.provider.length; i++) { if (i !== index) { - const p = Config.utilities.vpn.provider[i]; + const p = GlobalConfig.utilities.vpn.provider[i]; const reconstructed = { name: p.name, displayName: p.displayName, @@ -210,7 +210,7 @@ ColumnLayout { inactiveOnColour: Colours.palette.m3onSurface onClicked: { - const providers = [...Config.utilities.vpn.provider]; + const providers = [...GlobalConfig.utilities.vpn.provider]; providers.push({ name: "netbird", displayName: "NetBird", @@ -227,7 +227,7 @@ ColumnLayout { inactiveOnColour: Colours.palette.m3onSurface onClicked: { - const providers = [...Config.utilities.vpn.provider]; + const providers = [...GlobalConfig.utilities.vpn.provider]; providers.push({ name: "tailscale", displayName: "Tailscale", @@ -244,7 +244,7 @@ ColumnLayout { inactiveOnColour: Colours.palette.m3onSurface onClicked: { - const providers = [...Config.utilities.vpn.provider]; + const providers = [...GlobalConfig.utilities.vpn.provider]; providers.push({ name: "warp", displayName: "Cloudflare WARP", diff --git a/modules/controlcenter/notifications/NotificationsPane.qml b/modules/controlcenter/notifications/NotificationsPane.qml index ea75c2a6..eda4e213 100644 --- a/modules/controlcenter/notifications/NotificationsPane.qml +++ b/modules/controlcenter/notifications/NotificationsPane.qml @@ -18,24 +18,24 @@ Item { required property Session session - property bool notificationsExpire: Config.notifs.expire ?? true - property string notificationsFullscreen: Config.notifs.fullscreen ?? "on" + property bool notificationsExpire: GlobalConfig.notifs.expire ?? true + property string notificationsFullscreen: GlobalConfig.notifs.fullscreen ?? "on" property bool notificationsOpenExpanded: Config.notifs.openExpanded ?? false - property int notificationsDefaultExpireTimeout: Config.notifs.defaultExpireTimeout ?? 5000 + property int notificationsDefaultExpireTimeout: GlobalConfig.notifs.defaultExpireTimeout ?? 5000 property int notificationsGroupPreviewNum: Config.notifs.groupPreviewNum ?? 3 property int maxToasts: Config.utilities.maxToasts ?? 4 property string toastsFullscreen: Config.utilities.toasts.fullscreen ?? "off" - property bool chargingChanged: Config.utilities.toasts.chargingChanged ?? true - property bool gameModeChanged: Config.utilities.toasts.gameModeChanged ?? true - property bool dndChanged: Config.utilities.toasts.dndChanged ?? true - property bool audioOutputChanged: Config.utilities.toasts.audioOutputChanged ?? true - property bool audioInputChanged: Config.utilities.toasts.audioInputChanged ?? true - property bool capsLockChanged: Config.utilities.toasts.capsLockChanged ?? true - property bool numLockChanged: Config.utilities.toasts.numLockChanged ?? true - property bool kbLayoutChanged: Config.utilities.toasts.kbLayoutChanged ?? true - property bool vpnChanged: Config.utilities.toasts.vpnChanged ?? true - property bool nowPlaying: Config.utilities.toasts.nowPlaying ?? false + property bool chargingChanged: GlobalConfig.utilities.toasts.chargingChanged ?? true + property bool gameModeChanged: GlobalConfig.utilities.toasts.gameModeChanged ?? true + property bool dndChanged: GlobalConfig.utilities.toasts.dndChanged ?? true + property bool audioOutputChanged: GlobalConfig.utilities.toasts.audioOutputChanged ?? true + property bool audioInputChanged: GlobalConfig.utilities.toasts.audioInputChanged ?? true + property bool capsLockChanged: GlobalConfig.utilities.toasts.capsLockChanged ?? true + property bool numLockChanged: GlobalConfig.utilities.toasts.numLockChanged ?? true + property bool kbLayoutChanged: GlobalConfig.utilities.toasts.kbLayoutChanged ?? true + property bool vpnChanged: GlobalConfig.utilities.toasts.vpnChanged ?? true + property bool nowPlaying: GlobalConfig.utilities.toasts.nowPlaying ?? false function saveConfig(): void { GlobalConfig.notifs.expire = root.notificationsExpire; diff --git a/modules/launcher/Content.qml b/modules/launcher/Content.qml index 7e283c8f..48a3d4fa 100644 --- a/modules/launcher/Content.qml +++ b/modules/launcher/Content.qml @@ -106,7 +106,7 @@ Item { Keys.onEscapePressed: root.visibilities.launcher = false Keys.onPressed: event => { - if (!Config.launcher.vimKeybinds) + if (!GlobalConfig.launcher.vimKeybinds) return; if (event.modifiers & Qt.ControlModifier) { diff --git a/modules/launcher/services/Actions.qml b/modules/launcher/services/Actions.qml index 13ec0361..4ec249da 100644 --- a/modules/launcher/services/Actions.qml +++ b/modules/launcher/services/Actions.qml @@ -15,12 +15,12 @@ Searcher { } list: variants.instances - useFuzzy: Config.launcher.useFuzzy.actions + useFuzzy: GlobalConfig.launcher.useFuzzy.actions Variants { id: variants - model: Config.launcher.actions.filter(a => (a.enabled ?? true) && (Config.launcher.enableDangerousActions || !(a.dangerous ?? false))) + model: Config.launcher.actions.filter(a => (a.enabled ?? true) && (GlobalConfig.launcher.enableDangerousActions || !(a.dangerous ?? false))) Action {} } diff --git a/modules/launcher/services/Apps.qml b/modules/launcher/services/Apps.qml index ff05456b..5c80513e 100644 --- a/modules/launcher/services/Apps.qml +++ b/modules/launcher/services/Apps.qml @@ -66,13 +66,13 @@ Searcher { } list: appDb.apps - useFuzzy: Config.launcher.useFuzzy.apps + useFuzzy: GlobalConfig.launcher.useFuzzy.apps AppDb { id: appDb path: `${Paths.state}/apps.sqlite` - favouriteApps: Config.launcher.favouriteApps - entries: DesktopEntries.applications.values.filter(a => !Strings.testRegexList(Config.launcher.hiddenApps, a.id)) + favouriteApps: GlobalConfig.launcher.favouriteApps + entries: DesktopEntries.applications.values.filter(a => !Strings.testRegexList(GlobalConfig.launcher.hiddenApps, a.id)) } } diff --git a/modules/launcher/services/M3Variants.qml b/modules/launcher/services/M3Variants.qml index aa5d1ca7..4517d02c 100644 --- a/modules/launcher/services/M3Variants.qml +++ b/modules/launcher/services/M3Variants.qml @@ -69,7 +69,7 @@ Searcher { description: qsTr("All colours are grayscale, no chroma.") } ] - useFuzzy: Config.launcher.useFuzzy.variants + useFuzzy: GlobalConfig.launcher.useFuzzy.variants component Variant: QtObject { required property string variant diff --git a/modules/launcher/services/Schemes.qml b/modules/launcher/services/Schemes.qml index bd2a10f7..cc555f29 100644 --- a/modules/launcher/services/Schemes.qml +++ b/modules/launcher/services/Schemes.qml @@ -26,7 +26,7 @@ Searcher { } list: schemes.instances - useFuzzy: Config.launcher.useFuzzy.schemes + useFuzzy: GlobalConfig.launcher.useFuzzy.schemes keys: ["name", "flavour"] weights: [0.9, 0.1] diff --git a/modules/notifications/Notification.qml b/modules/notifications/Notification.qml index ca7596dc..24c0c958 100644 --- a/modules/notifications/Notification.qml +++ b/modules/notifications/Notification.qml @@ -81,7 +81,7 @@ StyledRect { } } onClicked: event => { - if (!Config.notifs.actionOnClick || event.button !== Qt.LeftButton) + if (!GlobalConfig.notifs.actionOnClick || event.button !== Qt.LeftButton) return; const actions = root.modelData.actions; diff --git a/modules/utilities/cards/Toggles.qml b/modules/utilities/cards/Toggles.qml index 49147a62..b2e14567 100644 --- a/modules/utilities/cards/Toggles.qml +++ b/modules/utilities/cards/Toggles.qml @@ -27,7 +27,7 @@ StyledRect { } if (item.id === "vpn") { - return Config.utilities.vpn.provider.some(p => typeof p === "object" ? (p.enabled === true) : false); + return GlobalConfig.utilities.vpn.provider.some(p => typeof p === "object" ? (p.enabled === true) : false); } seenIds.add(item.id); diff --git a/services/Audio.qml b/services/Audio.qml index faf86a93..88fe9652 100644 --- a/services/Audio.qml +++ b/services/Audio.qml @@ -111,7 +111,7 @@ Singleton { const newSinkName = sink.description || sink.name || qsTr("Unknown Device"); - if (previousSinkName && previousSinkName !== newSinkName && Config.utilities.toasts.audioOutputChanged) + if (previousSinkName && previousSinkName !== newSinkName && GlobalConfig.utilities.toasts.audioOutputChanged) Toaster.toast(qsTr("Audio output changed"), qsTr("Now using: %1").arg(newSinkName), "volume_up"); previousSinkName = newSinkName; @@ -123,7 +123,7 @@ Singleton { const newSourceName = source.description || source.name || qsTr("Unknown Device"); - if (previousSourceName && previousSourceName !== newSourceName && Config.utilities.toasts.audioInputChanged) + if (previousSourceName && previousSourceName !== newSourceName && GlobalConfig.utilities.toasts.audioInputChanged) Toaster.toast(qsTr("Audio input changed"), qsTr("Now using: %1").arg(newSourceName), "mic"); previousSourceName = newSourceName; diff --git a/services/GameMode.qml b/services/GameMode.qml index 44b0fe4c..6dfc791c 100644 --- a/services/GameMode.qml +++ b/services/GameMode.qml @@ -28,11 +28,11 @@ Singleton { onEnabledChanged: { if (enabled) { setDynamicConfs(); - if (Config.utilities.toasts.gameModeChanged) + if (GlobalConfig.utilities.toasts.gameModeChanged) Toaster.toast(qsTr("Game mode enabled"), qsTr("Disabled Hyprland animations, blur, gaps and shadows"), "gamepad"); } else { Hypr.extras.message("reload"); - if (Config.utilities.toasts.gameModeChanged) + if (GlobalConfig.utilities.toasts.gameModeChanged) Toaster.toast(qsTr("Game mode disabled"), qsTr("Hyprland settings restored"), "gamepad"); } } diff --git a/services/Hypr.qml b/services/Hypr.qml index 054b611c..181967e7 100644 --- a/services/Hypr.qml +++ b/services/Hypr.qml @@ -93,7 +93,7 @@ Singleton { Component.onCompleted: reloadDynamicConfs() onCapsLockChanged: { - if (!Config.utilities.toasts.capsLockChanged) + if (!GlobalConfig.utilities.toasts.capsLockChanged) return; if (capsLock) @@ -103,7 +103,7 @@ Singleton { } onNumLockChanged: { - if (!Config.utilities.toasts.numLockChanged) + if (!GlobalConfig.utilities.toasts.numLockChanged) return; if (numLock) @@ -113,7 +113,7 @@ Singleton { } onKbLayoutFullChanged: { - if (hadKeyboard && Config.utilities.toasts.kbLayoutChanged) + if (hadKeyboard && GlobalConfig.utilities.toasts.kbLayoutChanged) Toaster.toast(qsTr("Keyboard layout changed"), qsTr("Layout changed to: %1").arg(kbLayoutFull), "keyboard"); hadKeyboard = !!keyboard; diff --git a/services/NotifData.qml b/services/NotifData.qml index 1cec1510..c92a3ad7 100644 --- a/services/NotifData.qml +++ b/services/NotifData.qml @@ -33,7 +33,7 @@ QtObject { property string appName property string image property var hints // Hints are not persisted across restarts - property real expireTimeout: Config.notifs.defaultExpireTimeout + property real expireTimeout: GlobalConfig.notifs.defaultExpireTimeout property int urgency: NotificationUrgency.Normal property bool resident property bool hasActionIcons @@ -41,9 +41,9 @@ QtObject { readonly property Timer timer: Timer { running: true - interval: notif.expireTimeout > 0 ? notif.expireTimeout : Config.notifs.defaultExpireTimeout + interval: notif.expireTimeout > 0 ? notif.expireTimeout : GlobalConfig.notifs.defaultExpireTimeout onTriggered: { - if (Config.notifs.expire) + if (GlobalConfig.notifs.expire) notif.popup = false; } } diff --git a/services/Notifs.qml b/services/Notifs.qml index 510ee0bc..d539d0a2 100644 --- a/services/Notifs.qml +++ b/services/Notifs.qml @@ -32,13 +32,13 @@ Singleton { function shouldShowPopup(): bool { if (props.dnd || [...Visibilities.screens.values()].some(v => v.sidebar)) return false; - if (Config.notifs.fullscreen === "off" && hasFullscreen()) + if (GlobalConfig.notifs.fullscreen === "off" && hasFullscreen()) return false; return true; } onDndChanged: { - if (!Config.utilities.toasts.dndChanged) + if (!GlobalConfig.utilities.toasts.dndChanged) return; if (dnd) diff --git a/services/Players.qml b/services/Players.qml index 0724afbc..23c9067f 100644 --- a/services/Players.qml +++ b/services/Players.qml @@ -37,7 +37,7 @@ Singleton { Connections { function onPostTrackChanged() { - if (!Config.utilities.toasts.nowPlaying) { + if (!GlobalConfig.utilities.toasts.nowPlaying) { return; } if (root.active.trackArtist != "" && root.active.trackTitle != "") { diff --git a/services/VPN.qml b/services/VPN.qml index ac82a394..61e91d0b 100644 --- a/services/VPN.qml +++ b/services/VPN.qml @@ -18,9 +18,9 @@ Singleton { }) readonly property bool connecting: connectProc.running || disconnectProc.running - readonly property bool enabled: Config.utilities.vpn.provider.some(p => typeof p === "object" ? (p.enabled === true) : false) + readonly property bool enabled: GlobalConfig.utilities.vpn.provider.some(p => typeof p === "object" ? (p.enabled === true) : false) readonly property var providerInput: { - const enabledProvider = Config.utilities.vpn.provider.find(p => typeof p === "object" ? (p.enabled === true) : false); + const enabledProvider = GlobalConfig.utilities.vpn.provider.find(p => typeof p === "object" ? (p.enabled === true) : false); return enabledProvider || "wireguard"; } readonly property bool isCustomProvider: typeof providerInput === "object" @@ -279,7 +279,7 @@ Singleton { } function emitStatusToast(statusObj: var): void { - if (!Config.utilities.toasts.vpnChanged) + if (!GlobalConfig.utilities.toasts.vpnChanged) return; const displayName = root.currentConfig ? (root.currentConfig.displayName || "VPN") : "VPN"; diff --git a/services/Wallpapers.qml b/services/Wallpapers.qml index 4ef522ba..3478d90c 100644 --- a/services/Wallpapers.qml +++ b/services/Wallpapers.qml @@ -41,7 +41,7 @@ Searcher { list: wallpapers.entries key: "relativePath" - useFuzzy: Config.launcher.useFuzzy.wallpapers + useFuzzy: GlobalConfig.launcher.useFuzzy.wallpapers extraOpts: useFuzzy ? ({}) : ({ forward: false }) From 03c1e5060af2153766da0f0e55da0d3ce4232b49 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 23:04:57 +1000 Subject: [PATCH 61/81] feat: print full option path in warning --- plugin/src/Caelestia/Config/configobject.cpp | 36 ++++++++++++++++++-- plugin/src/Caelestia/Config/configobject.hpp | 7 ++-- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/plugin/src/Caelestia/Config/configobject.cpp b/plugin/src/Caelestia/Config/configobject.cpp index 8b53b6d1..030ecabe 100644 --- a/plugin/src/Caelestia/Config/configobject.cpp +++ b/plugin/src/Caelestia/Config/configobject.cpp @@ -30,8 +30,8 @@ void ConfigObject::loadFromJson(const QJsonObject& obj) { continue; if (isGlobalOnly(key)) - qCWarning( - lcConfig, "Option '%s' is global-only and will be ignored in per-monitor config", qUtf8Printable(key)); + qCWarning(lcConfig, "Option '%s' is global-only and will be ignored in per-monitor config", + qUtf8Printable(propertyPath(key))); const auto jsonVal = obj.value(key); @@ -210,6 +210,38 @@ void ConfigObject::resyncFromGlobal() { } } +QString ConfigObject::propertyPath(const QString& name) const { + QStringList parts; + parts.append(name); + + const QObject* obj = this; + while (auto* parentObj = obj->parent()) { + auto* parentConfig = qobject_cast(parentObj); + if (!parentConfig) + break; + + // Find which property name this child is on the parent + const auto* meta = parentConfig->metaObject(); + bool found = false; + for (int i = meta->propertyOffset(); i < meta->propertyCount(); ++i) { + auto prop = meta->property(i); + auto val = prop.read(parentObj); + if (val.value() == obj) { + parts.prepend(QString::fromUtf8(prop.name())); + found = true; + break; + } + } + + if (!found) + break; + + obj = parentObj; + } + + return parts.join(QLatin1Char('.')); +} + bool ConfigObject::isPropertyLoaded(const QString& name) const { return m_loadedKeys.contains(name); } diff --git a/plugin/src/Caelestia/Config/configobject.hpp b/plugin/src/Caelestia/Config/configobject.hpp index d13e6119..c35d812c 100644 --- a/plugin/src/Caelestia/Config/configobject.hpp +++ b/plugin/src/Caelestia/Config/configobject.hpp @@ -48,12 +48,14 @@ private: public: \ [[nodiscard]] Type name() const { \ if (isOverlay()) \ - qCWarning(caelestia::config::lcConfig, "Reading global-only option '%s' on per-monitor overlay", #name); \ + qCWarning(caelestia::config::lcConfig, "Reading global-only option '%s' on per-monitor overlay", \ + qUtf8Printable(propertyPath(QStringLiteral(#name)))); \ return m_##name; \ } \ void set_##name(const Type& val) { \ if (isOverlay()) \ - qCWarning(caelestia::config::lcConfig, "Writing global-only option '%s' on per-monitor overlay", #name); \ + qCWarning(caelestia::config::lcConfig, "Writing global-only option '%s' on per-monitor overlay", \ + qUtf8Printable(propertyPath(QStringLiteral(#name)))); \ if (caelestia::config::ConfigObject::updateMember(m_##name, val)) { \ markPropertyLoaded(QStringLiteral(#name)); \ Q_EMIT name##Changed(); \ @@ -88,6 +90,7 @@ public: void clearLoadedKeys(); [[nodiscard]] bool isPropertyLoaded(const QString& name) const; + [[nodiscard]] QString propertyPath(const QString& name) const; [[nodiscard]] bool isOverlay() const; // Returns true only on overlays — global singleton always returns false. [[nodiscard]] bool isGlobalOnly(const QString& name) const; From 0432c4708e6c797d4f3d9de4ccfe3b6a583493e3 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 23:22:48 +1000 Subject: [PATCH 62/81] fix: anims should not be per monitor --- .../src/Caelestia/Config/appearanceconfig.hpp | 2 +- plugin/src/Caelestia/Config/tokens.hpp | 32 +++++++++---------- .../src/Caelestia/Config/tokensattached.cpp | 12 ++----- 3 files changed, 19 insertions(+), 27 deletions(-) diff --git a/plugin/src/Caelestia/Config/appearanceconfig.hpp b/plugin/src/Caelestia/Config/appearanceconfig.hpp index c58105a7..f366482d 100644 --- a/plugin/src/Caelestia/Config/appearanceconfig.hpp +++ b/plugin/src/Caelestia/Config/appearanceconfig.hpp @@ -169,7 +169,7 @@ class AnimDurations : public ConfigObject { Q_OBJECT QML_ANONYMOUS - CONFIG_PROPERTY(qreal, scale, 1) + CONFIG_GLOBAL_PROPERTY(qreal, scale, 1) Q_PROPERTY(int small READ small NOTIFY valuesChanged) Q_PROPERTY(int normal READ normal NOTIFY valuesChanged) diff --git a/plugin/src/Caelestia/Config/tokens.hpp b/plugin/src/Caelestia/Config/tokens.hpp index ca42ccbd..1a0c7b8f 100644 --- a/plugin/src/Caelestia/Config/tokens.hpp +++ b/plugin/src/Caelestia/Config/tokens.hpp @@ -15,15 +15,15 @@ class AnimCurves : public ConfigObject { Q_OBJECT QML_ANONYMOUS - CONFIG_PROPERTY(QList, emphasized) - CONFIG_PROPERTY(QList, emphasizedAccel) - CONFIG_PROPERTY(QList, emphasizedDecel) - CONFIG_PROPERTY(QList, standard) - CONFIG_PROPERTY(QList, standardAccel) - CONFIG_PROPERTY(QList, standardDecel) - CONFIG_PROPERTY(QList, expressiveFastSpatial) - CONFIG_PROPERTY(QList, expressiveDefaultSpatial) - CONFIG_PROPERTY(QList, expressiveSlowSpatial) + CONFIG_GLOBAL_PROPERTY(QList, emphasized) + CONFIG_GLOBAL_PROPERTY(QList, emphasizedAccel) + CONFIG_GLOBAL_PROPERTY(QList, emphasizedDecel) + CONFIG_GLOBAL_PROPERTY(QList, standard) + CONFIG_GLOBAL_PROPERTY(QList, standardAccel) + CONFIG_GLOBAL_PROPERTY(QList, standardDecel) + CONFIG_GLOBAL_PROPERTY(QList, expressiveFastSpatial) + CONFIG_GLOBAL_PROPERTY(QList, expressiveDefaultSpatial) + CONFIG_GLOBAL_PROPERTY(QList, expressiveSlowSpatial) public: explicit AnimCurves(QObject* parent = nullptr) @@ -103,13 +103,13 @@ class AnimDurationTokens : public ConfigObject { Q_OBJECT QML_ANONYMOUS - CONFIG_PROPERTY(int, small, 200) - CONFIG_PROPERTY(int, normal, 400) - CONFIG_PROPERTY(int, large, 600) - CONFIG_PROPERTY(int, extraLarge, 1000) - CONFIG_PROPERTY(int, expressiveFastSpatial, 350) - CONFIG_PROPERTY(int, expressiveDefaultSpatial, 500) - CONFIG_PROPERTY(int, expressiveSlowSpatial, 650) + CONFIG_GLOBAL_PROPERTY(int, small, 200) + CONFIG_GLOBAL_PROPERTY(int, normal, 400) + CONFIG_GLOBAL_PROPERTY(int, large, 600) + CONFIG_GLOBAL_PROPERTY(int, extraLarge, 1000) + CONFIG_GLOBAL_PROPERTY(int, expressiveFastSpatial, 350) + CONFIG_GLOBAL_PROPERTY(int, expressiveDefaultSpatial, 500) + CONFIG_GLOBAL_PROPERTY(int, expressiveSlowSpatial, 650) public: explicit AnimDurationTokens(QObject* parent = nullptr) diff --git a/plugin/src/Caelestia/Config/tokensattached.cpp b/plugin/src/Caelestia/Config/tokensattached.cpp index 23ee2841..1dd159d7 100644 --- a/plugin/src/Caelestia/Config/tokensattached.cpp +++ b/plugin/src/Caelestia/Config/tokensattached.cpp @@ -29,19 +29,11 @@ void Tokens::connectScope() { if (!m_scope) return; connect(m_scope, &ConfigScope::configChanged, this, &Tokens::sourceChanged); - connect(m_scope, &ConfigScope::configChanged, this, &Tokens::bindAnim); } void Tokens::bindAnim() { - auto* appearance = resolveAppearance(m_scope); - if (!appearance) - return; - - m_anim->bindDurations(appearance->anim()->durations()); - - auto* tokens = TokenConfig::instance(); - if (tokens) - m_anim->bindCurves(tokens->appearance()->curves()); + m_anim->bindDurations(GlobalConfig::instance()->appearance()->anim()->durations()); + m_anim->bindCurves(TokenConfig::instance()->appearance()->curves()); } const AppearanceRounding* Tokens::rounding() const { From 5cef79d5e046d8b27c998cf438bbe37bba180121 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 23:50:46 +1000 Subject: [PATCH 63/81] feat: warn on per monitor confs being accessed without scope --- .../src/Caelestia/Config/configattached.cpp | 3 ++ .../src/Caelestia/Config/tokensattached.cpp | 41 ++++++++----------- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/plugin/src/Caelestia/Config/configattached.cpp b/plugin/src/Caelestia/Config/configattached.cpp index 55694c32..cc6ae8f9 100644 --- a/plugin/src/Caelestia/Config/configattached.cpp +++ b/plugin/src/Caelestia/Config/configattached.cpp @@ -26,6 +26,9 @@ void Config::connectScope() { const Type* Config::name() const { \ if (m_scope && m_scope->config()) \ return m_scope->config()->name(); \ + if (parent()) \ + qCWarning(lcConfig, "Config.%s accessed without a ConfigScope ancestor on %s", #name, \ + parent()->metaObject()->className()); \ return GlobalConfig::instance()->name(); \ } diff --git a/plugin/src/Caelestia/Config/tokensattached.cpp b/plugin/src/Caelestia/Config/tokensattached.cpp index 1dd159d7..cf4acdb4 100644 --- a/plugin/src/Caelestia/Config/tokensattached.cpp +++ b/plugin/src/Caelestia/Config/tokensattached.cpp @@ -9,9 +9,12 @@ namespace caelestia::config { namespace { -const AppearanceConfig* resolveAppearance(ConfigScope* scope) { +const AppearanceConfig* resolveAppearance(ConfigScope* scope, const char* prop, QObject* parent) { if (scope && scope->config()) return scope->config()->appearance(); + if (parent) + qCWarning(lcConfig, "Tokens.%s accessed without a ConfigScope ancestor on %s", prop, + parent->metaObject()->className()); return GlobalConfig::instance()->appearance(); } @@ -36,34 +39,26 @@ void Tokens::bindAnim() { m_anim->bindCurves(TokenConfig::instance()->appearance()->curves()); } -const AppearanceRounding* Tokens::rounding() const { - auto* a = resolveAppearance(m_scope); - return a ? a->rounding() : nullptr; -} +#define TOKENS_ATTACHED_GETTER(Type, name) \ + const Type* Tokens::name() const { \ + auto* a = resolveAppearance(m_scope, #name, parent()); \ + return a ? a->name() : nullptr; \ + } -const AppearanceSpacing* Tokens::spacing() const { - auto* a = resolveAppearance(m_scope); - return a ? a->spacing() : nullptr; -} +TOKENS_ATTACHED_GETTER(AppearanceRounding, rounding) +TOKENS_ATTACHED_GETTER(AppearanceSpacing, spacing) +TOKENS_ATTACHED_GETTER(AppearancePadding, padding) +TOKENS_ATTACHED_GETTER(AppearanceFont, font) +TOKENS_ATTACHED_GETTER(AppearanceTransparency, transparency) -const AppearancePadding* Tokens::padding() const { - auto* a = resolveAppearance(m_scope); - return a ? a->padding() : nullptr; -} - -const AppearanceFont* Tokens::font() const { - auto* a = resolveAppearance(m_scope); - return a ? a->font() : nullptr; -} - -const AppearanceTransparency* Tokens::transparency() const { - auto* a = resolveAppearance(m_scope); - return a ? a->transparency() : nullptr; -} +#undef TOKENS_ATTACHED_GETTER const SizeTokens* Tokens::sizes() const { if (m_scope && m_scope->tokens()) return m_scope->tokens()->sizes(); + if (parent()) + qCWarning(lcConfig, "Tokens.sizes accessed without a ConfigScope ancestor on %s", + parent()->metaObject()->className()); return TokenConfig::instance()->sizes(); } From 2f5fcfa2fbeede87b707f419be5174544fd8dac1 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Mon, 13 Apr 2026 00:06:21 +1000 Subject: [PATCH 64/81] fix: move more properties to global only --- plugin/src/Caelestia/Config/barconfig.hpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugin/src/Caelestia/Config/barconfig.hpp b/plugin/src/Caelestia/Config/barconfig.hpp index 3ec57b00..8def7921 100644 --- a/plugin/src/Caelestia/Config/barconfig.hpp +++ b/plugin/src/Caelestia/Config/barconfig.hpp @@ -45,13 +45,13 @@ class BarWorkspaces : public ConfigObject { CONFIG_PROPERTY(bool, showWindowsOnSpecialWorkspaces, true) CONFIG_PROPERTY(int, maxWindowIcons, 0) CONFIG_PROPERTY(bool, activeTrail, false) - CONFIG_PROPERTY(bool, perMonitorWorkspaces, true) + CONFIG_GLOBAL_PROPERTY(bool, perMonitorWorkspaces, true) CONFIG_PROPERTY(QString, label, QStringLiteral(" ")) CONFIG_PROPERTY(QString, occupiedLabel, QStringLiteral("\U000f06af")) CONFIG_PROPERTY(QString, activeLabel, QStringLiteral("\U000f06af")) CONFIG_PROPERTY(QString, capitalisation, QStringLiteral("preserve")) - CONFIG_PROPERTY(QVariantList, specialWorkspaceIcons) - CONFIG_PROPERTY(QVariantList, windowIcons) + CONFIG_GLOBAL_PROPERTY(QVariantList, specialWorkspaceIcons) + CONFIG_GLOBAL_PROPERTY(QVariantList, windowIcons) public: explicit BarWorkspaces(QObject* parent = nullptr) @@ -78,8 +78,8 @@ class BarTray : public ConfigObject { CONFIG_PROPERTY(bool, background, false) CONFIG_PROPERTY(bool, recolour, false) CONFIG_PROPERTY(bool, compact, false) - CONFIG_PROPERTY(QVariantList, iconSubs) - CONFIG_PROPERTY(QStringList, hiddenIcons) + CONFIG_GLOBAL_PROPERTY(QVariantList, iconSubs) + CONFIG_GLOBAL_PROPERTY(QStringList, hiddenIcons) public: explicit BarTray(QObject* parent = nullptr) From 7e4b14f6ba179dfc093fb3cbe15c75e4e6913325 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Mon, 13 Apr 2026 00:06:48 +1000 Subject: [PATCH 65/81] fix: per monitor props not having ancestor scope --- modules/bar/Bar.qml | 8 +++--- modules/bar/components/ActiveWindow.qml | 8 +++--- modules/bar/components/Tray.qml | 2 +- .../components/workspaces/ActiveIndicator.qml | 12 +++++---- .../workspaces/SpecialWorkspaces.qml | 6 ++--- .../bar/components/workspaces/Workspace.qml | 2 +- .../bar/components/workspaces/Workspaces.qml | 4 +-- modules/bar/popouts/Content.qml | 2 +- modules/controlcenter/taskbar/TaskbarPane.qml | 2 +- modules/dashboard/Media.qml | 6 ++--- modules/drawers/Regions.qml | 25 +++++++++++-------- modules/osd/Content.qml | 4 +-- services/Audio.qml | 16 ++++++------ services/Brightness.qml | 4 +-- services/LyricsService.qml | 12 ++++----- services/Players.qml | 4 +-- services/SystemUsage.qml | 4 +-- services/Time.qml | 2 +- services/Wallpapers.qml | 2 +- services/Weather.qml | 4 +-- utils/Icons.qml | 6 ++--- utils/SysInfo.qml | 8 +++--- 22 files changed, 74 insertions(+), 69 deletions(-) diff --git a/modules/bar/Bar.qml b/modules/bar/Bar.qml index 27483d9f..a2ed060e 100644 --- a/modules/bar/Bar.qml +++ b/modules/bar/Bar.qml @@ -80,11 +80,11 @@ ColumnLayout { const ch = childAt(width / 2, y) as WrappedLoader; if (ch?.id === "workspaces" && Config.bar.scrollActions.workspaces) { // Workspace scroll - const mon = (Config.bar.workspaces.perMonitorWorkspaces ? Hypr.monitorFor(screen) : Hypr.focusedMonitor); + const mon = (GlobalConfig.bar.workspaces.perMonitorWorkspaces ? Hypr.monitorFor(screen) : Hypr.focusedMonitor); const specialWs = mon?.lastIpcObject.specialWorkspace.name; if (specialWs?.length > 0) Hypr.dispatch(`togglespecialworkspace ${specialWs.slice(8)}`); - else if (angleDelta.y < 0 || (Config.bar.workspaces.perMonitorWorkspaces ? mon.activeWorkspace?.id : Hypr.activeWsId) > 1) + else if (angleDelta.y < 0 || (GlobalConfig.bar.workspaces.perMonitorWorkspaces ? mon.activeWorkspace?.id : Hypr.activeWsId) > 1) Hypr.dispatch(`workspace r${angleDelta.y > 0 ? "-" : "+"}1`); } else if (y < screen.height / 2 && Config.bar.scrollActions.volume) { // Volume scroll on top half @@ -96,9 +96,9 @@ ColumnLayout { // Brightness scroll on bottom half const monitor = Brightness.getMonitorForScreen(screen); if (angleDelta.y > 0) - monitor.setBrightness(monitor.brightness + Config.services.brightnessIncrement); + monitor.setBrightness(monitor.brightness + GlobalConfig.services.brightnessIncrement); else if (angleDelta.y < 0) - monitor.setBrightness(monitor.brightness - Config.services.brightnessIncrement); + monitor.setBrightness(monitor.brightness - GlobalConfig.services.brightnessIncrement); } } diff --git a/modules/bar/components/ActiveWindow.qml b/modules/bar/components/ActiveWindow.qml index 6bd5ef3f..b4bd3bba 100644 --- a/modules/bar/components/ActiveWindow.qml +++ b/modules/bar/components/ActiveWindow.qml @@ -86,8 +86,8 @@ Item { id: metrics text: root.windowTitle - font.pointSize: Tokens.font.size.smaller - font.family: Tokens.font.family.mono + font.pointSize: root.Tokens.font.size.smaller + font.family: root.Tokens.font.family.mono elide: Qt.ElideRight elideWidth: root.maxHeight - icon.height @@ -120,10 +120,10 @@ Item { transform: [ Translate { - x: Config.bar.activeWindow.inverted ? -text.implicitWidth + text.implicitHeight : 0 + x: root.Config.bar.activeWindow.inverted ? -text.implicitWidth + text.implicitHeight : 0 }, Rotation { - angle: Config.bar.activeWindow.inverted ? 270 : 90 + angle: root.Config.bar.activeWindow.inverted ? 270 : 90 origin.x: text.implicitHeight / 2 origin.y: text.implicitHeight / 2 } diff --git a/modules/bar/components/Tray.qml b/modules/bar/components/Tray.qml index ceb5e180..80d5d009 100644 --- a/modules/bar/components/Tray.qml +++ b/modules/bar/components/Tray.qml @@ -68,7 +68,7 @@ StyledRect { id: items model: ScriptModel { - values: SystemTray.items.values.filter(i => !Config.bar.tray.hiddenIcons.includes(i.id)) + values: SystemTray.items.values.filter(i => !GlobalConfig.bar.tray.hiddenIcons.includes(i.id)) } TrayItem {} diff --git a/modules/bar/components/workspaces/ActiveIndicator.qml b/modules/bar/components/workspaces/ActiveIndicator.qml index ec782e3b..19d6c783 100644 --- a/modules/bar/components/workspaces/ActiveIndicator.qml +++ b/modules/bar/components/workspaces/ActiveIndicator.qml @@ -1,3 +1,5 @@ +pragma ComponentBehavior: Bound + import QtQuick import Caelestia.Config import qs.components @@ -61,13 +63,13 @@ StyledRect { } Behavior on leading { - enabled: Config.bar.workspaces.activeTrail + enabled: root.Config.bar.workspaces.activeTrail EAnim {} } Behavior on trailing { - enabled: Config.bar.workspaces.activeTrail + enabled: root.Config.bar.workspaces.activeTrail EAnim { duration: Tokens.anim.durations.normal * 2 @@ -75,19 +77,19 @@ StyledRect { } Behavior on currentSize { - enabled: Config.bar.workspaces.activeTrail + enabled: root.Config.bar.workspaces.activeTrail EAnim {} } Behavior on offset { - enabled: !Config.bar.workspaces.activeTrail + enabled: !root.Config.bar.workspaces.activeTrail EAnim {} } Behavior on size { - enabled: !Config.bar.workspaces.activeTrail + enabled: !root.Config.bar.workspaces.activeTrail EAnim {} } diff --git a/modules/bar/components/workspaces/SpecialWorkspaces.qml b/modules/bar/components/workspaces/SpecialWorkspaces.qml index 7f43e3a7..cafecb7b 100644 --- a/modules/bar/components/workspaces/SpecialWorkspaces.qml +++ b/modules/bar/components/workspaces/SpecialWorkspaces.qml @@ -15,7 +15,7 @@ Item { required property ShellScreen screen readonly property HyprlandMonitor monitor: Hypr.monitorFor(screen) - readonly property string activeSpecial: (Config.bar.workspaces.perMonitorWorkspaces ? monitor : Hypr.focusedMonitor)?.lastIpcObject.specialWorkspace?.name ?? "" + readonly property string activeSpecial: (GlobalConfig.bar.workspaces.perMonitorWorkspaces ? monitor : Hypr.focusedMonitor)?.lastIpcObject.specialWorkspace?.name ?? "" layer.enabled: true layer.effect: OpacityMask { @@ -95,7 +95,7 @@ Item { onCurrentIndexChanged: currentIndex = Qt.binding(() => model.values.findIndex(w => w.name === root.activeSpecial)) model: ScriptModel { - values: Hypr.workspaces.values.filter(w => w.name.startsWith("special:") && (!Config.bar.workspaces.perMonitorWorkspaces || w.monitor === root.monitor)) + values: Hypr.workspaces.values.filter(w => w.name.startsWith("special:") && (!GlobalConfig.bar.workspaces.perMonitorWorkspaces || w.monitor === root.monitor)) } preferredHighlightBegin: 0 @@ -347,7 +347,7 @@ Item { model: ScriptModel { values: { const windows = Hypr.toplevels.values.filter(c => c.workspace?.id === ws.wsId); - const maxIcons = Config.bar.workspaces.maxWindowIcons; + const maxIcons = root.Config.bar.workspaces.maxWindowIcons; return maxIcons > 0 ? windows.slice(0, maxIcons) : windows; } } diff --git a/modules/bar/components/workspaces/Workspace.qml b/modules/bar/components/workspaces/Workspace.qml index 39c55ec6..bd581aab 100644 --- a/modules/bar/components/workspaces/Workspace.qml +++ b/modules/bar/components/workspaces/Workspace.qml @@ -94,7 +94,7 @@ ColumnLayout { values: { const ws = root.ws; const windows = Hypr.toplevels.values.filter(c => c.workspace?.id === ws); - const maxIcons = Config.bar.workspaces.maxWindowIcons; + const maxIcons = root.Config.bar.workspaces.maxWindowIcons; return maxIcons > 0 ? windows.slice(0, maxIcons) : windows; } } diff --git a/modules/bar/components/workspaces/Workspaces.qml b/modules/bar/components/workspaces/Workspaces.qml index e7f617c6..698312b2 100644 --- a/modules/bar/components/workspaces/Workspaces.qml +++ b/modules/bar/components/workspaces/Workspaces.qml @@ -14,8 +14,8 @@ StyledClippingRect { required property ShellScreen screen required property bool fullscreen - readonly property bool onSpecial: (Config.bar.workspaces.perMonitorWorkspaces ? Hypr.monitorFor(screen) : Hypr.focusedMonitor)?.lastIpcObject.specialWorkspace?.name !== "" - readonly property int activeWsId: Config.bar.workspaces.perMonitorWorkspaces ? (Hypr.monitorFor(screen).activeWorkspace?.id ?? 1) : Hypr.activeWsId + readonly property bool onSpecial: (GlobalConfig.bar.workspaces.perMonitorWorkspaces ? Hypr.monitorFor(screen) : Hypr.focusedMonitor)?.lastIpcObject.specialWorkspace?.name !== "" + readonly property int activeWsId: GlobalConfig.bar.workspaces.perMonitorWorkspaces ? (Hypr.monitorFor(screen).activeWorkspace?.id ?? 1) : Hypr.activeWsId readonly property var occupied: { const occ = {}; diff --git a/modules/bar/popouts/Content.qml b/modules/bar/popouts/Content.qml index 8b5d0db5..f1c2456b 100644 --- a/modules/bar/popouts/Content.qml +++ b/modules/bar/popouts/Content.qml @@ -128,7 +128,7 @@ Item { Repeater { model: ScriptModel { - values: SystemTray.items.values.filter(i => !Config.bar.tray.hiddenIcons.includes(i.id)) + values: SystemTray.items.values.filter(i => !GlobalConfig.bar.tray.hiddenIcons.includes(i.id)) } Popout { diff --git a/modules/controlcenter/taskbar/TaskbarPane.qml b/modules/controlcenter/taskbar/TaskbarPane.qml index 75d70bff..601fc09f 100644 --- a/modules/controlcenter/taskbar/TaskbarPane.qml +++ b/modules/controlcenter/taskbar/TaskbarPane.qml @@ -43,7 +43,7 @@ Item { property bool workspacesOccupiedBg: Config.bar.workspaces.occupiedBg ?? false property bool workspacesShowWindows: Config.bar.workspaces.showWindows ?? false property int workspacesMaxWindowIcons: Config.bar.workspaces.maxWindowIcons ?? 0 - property bool workspacesPerMonitor: Config.bar.workspaces.perMonitorWorkspaces ?? true + property bool workspacesPerMonitor: GlobalConfig.bar.workspaces.perMonitorWorkspaces ?? true property bool scrollWorkspaces: Config.bar.scrollActions.workspaces ?? true property bool scrollVolume: Config.bar.scrollActions.volume ?? true property bool scrollBrightness: Config.bar.scrollActions.brightness ?? true diff --git a/modules/dashboard/Media.qml b/modules/dashboard/Media.qml index e4638843..0a697996 100644 --- a/modules/dashboard/Media.qml +++ b/modules/dashboard/Media.qml @@ -122,7 +122,7 @@ Item { id: visualiserBars model: Array.from({ - length: Config.services.visualiserBars + length: GlobalConfig.services.visualiserBars }, (_, i) => i) ShapePath { @@ -131,13 +131,13 @@ Item { required property int modelData readonly property real value: Math.max(1e-3, Math.min(1, Audio.cava.values[modelData])) - readonly property real angle: modelData * 2 * Math.PI / Config.services.visualiserBars + readonly property real angle: modelData * 2 * Math.PI / GlobalConfig.services.visualiserBars readonly property real magnitude: value * Tokens.sizes.dashboard.mediaVisualiserSize readonly property real cos: Math.cos(angle) readonly property real sin: Math.sin(angle) capStyle: Tokens.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap - strokeWidth: 360 / Config.services.visualiserBars - Tokens.spacing.small / 4 + strokeWidth: 360 / GlobalConfig.services.visualiserBars - Tokens.spacing.small / 4 strokeColor: Colours.palette.m3primary startX: visualiser.centerX + (visualiser.innerX + strokeWidth / 2) * cos diff --git a/modules/drawers/Regions.qml b/modules/drawers/Regions.qml index 022d9661..26b7b4c6 100644 --- a/modules/drawers/Regions.qml +++ b/modules/drawers/Regions.qml @@ -12,22 +12,25 @@ Region { required property Panels panels required property var win + readonly property real borderThickness: win.configScope.Config.border.thickness + readonly property real clampedThickness: win.configScope.Config.border.clampedThickness + x: bar.clampedWidth + win.dragMaskPadding - y: Config.border.clampedThickness + win.dragMaskPadding - width: win.width - bar.clampedWidth - Config.border.clampedThickness - win.dragMaskPadding * 2 - height: win.height - Config.border.clampedThickness * 2 - win.dragMaskPadding * 2 + y: clampedThickness + win.dragMaskPadding + width: win.width - bar.clampedWidth - clampedThickness - win.dragMaskPadding * 2 + height: win.height - clampedThickness * 2 - win.dragMaskPadding * 2 intersection: Intersection.Xor R { panel: root.panels.dashboard y: 0 - height: panel.height * (1 - root.panels.dashboard.offsetScale) + Config.border.thickness + height: panel.height * (1 - root.panels.dashboard.offsetScale) + root.borderThickness } R { panel: root.panels.launcher y: root.win.height - height - height: panel.height * (1 - root.panels.launcher.offsetScale) + Config.border.thickness + height: panel.height * (1 - root.panels.launcher.offsetScale) + root.borderThickness } R { @@ -35,7 +38,7 @@ Region { panel: root.panels.sessionWrapper x: root.win.width - width - width: panel.width * (1 - root.panels.session.offsetScale) + Config.border.thickness + sidebarRegion.width + width: panel.width * (1 - root.panels.session.offsetScale) + root.borderThickness + sidebarRegion.width } R { @@ -43,25 +46,25 @@ Region { panel: root.panels.sidebar x: root.win.width - width - width: panel.width * (1 - root.panels.sidebar.offsetScale) + Config.border.thickness + width: panel.width * (1 - root.panels.sidebar.offsetScale) + root.borderThickness } R { panel: root.panels.osdWrapper x: root.win.width - width - width: panel.width * (1 - root.panels.osd.offsetScale) + Config.border.thickness + sessionRegion.width + width: panel.width * (1 - root.panels.osd.offsetScale) + root.borderThickness + sessionRegion.width } R { panel: root.panels.notifications y: 0 - height: panel.height + Config.border.thickness + height: panel.height + root.borderThickness } R { panel: root.panels.utilities y: root.win.height - height - height: panel.height * (1 - root.panels.utilities.offsetScale) + Config.border.thickness + height: panel.height * (1 - root.panels.utilities.offsetScale) + root.borderThickness } R { @@ -73,7 +76,7 @@ Region { required property Item panel x: panel.x + root.bar.implicitWidth - y: panel.y + Config.border.thickness + y: panel.y + root.borderThickness width: panel.width height: panel.height intersection: Intersection.Subtract diff --git a/modules/osd/Content.qml b/modules/osd/Content.qml index ff3295b7..7ea58ab7 100644 --- a/modules/osd/Content.qml +++ b/modules/osd/Content.qml @@ -87,9 +87,9 @@ Item { if (!monitor) return; if (event.angleDelta.y > 0) - monitor.setBrightness(monitor.brightness + Config.services.brightnessIncrement); + monitor.setBrightness(monitor.brightness + GlobalConfig.services.brightnessIncrement); else if (event.angleDelta.y < 0) - monitor.setBrightness(monitor.brightness - Config.services.brightnessIncrement); + monitor.setBrightness(monitor.brightness - GlobalConfig.services.brightnessIncrement); } implicitWidth: Tokens.sizes.osd.sliderWidth diff --git a/services/Audio.qml b/services/Audio.qml index 88fe9652..6268b92e 100644 --- a/services/Audio.qml +++ b/services/Audio.qml @@ -33,31 +33,31 @@ Singleton { function setVolume(newVolume: real): void { if (sink?.ready && sink?.audio) { sink.audio.muted = false; - sink.audio.volume = Math.max(0, Math.min(Config.services.maxVolume, newVolume)); + sink.audio.volume = Math.max(0, Math.min(GlobalConfig.services.maxVolume, newVolume)); } } function incrementVolume(amount: real): void { - setVolume(volume + (amount || Config.services.audioIncrement)); + setVolume(volume + (amount || GlobalConfig.services.audioIncrement)); } function decrementVolume(amount: real): void { - setVolume(volume - (amount || Config.services.audioIncrement)); + setVolume(volume - (amount || GlobalConfig.services.audioIncrement)); } function setSourceVolume(newVolume: real): void { if (source?.ready && source?.audio) { source.audio.muted = false; - source.audio.volume = Math.max(0, Math.min(Config.services.maxVolume, newVolume)); + source.audio.volume = Math.max(0, Math.min(GlobalConfig.services.maxVolume, newVolume)); } } function incrementSourceVolume(amount: real): void { - setSourceVolume(sourceVolume + (amount || Config.services.audioIncrement)); + setSourceVolume(sourceVolume + (amount || GlobalConfig.services.audioIncrement)); } function decrementSourceVolume(amount: real): void { - setSourceVolume(sourceVolume - (amount || Config.services.audioIncrement)); + setSourceVolume(sourceVolume - (amount || GlobalConfig.services.audioIncrement)); } function setAudioSink(newSink: PwNode): void { @@ -80,7 +80,7 @@ Singleton { function setStreamVolume(stream: PwNode, newVolume: real): void { if (stream?.ready && stream?.audio) { stream.audio.muted = false; - stream.audio.volume = Math.max(0, Math.min(Config.services.maxVolume, newVolume)); + stream.audio.volume = Math.max(0, Math.min(GlobalConfig.services.maxVolume, newVolume)); } } @@ -166,7 +166,7 @@ Singleton { CavaProvider { id: cava - bars: Config.services.visualiserBars + bars: GlobalConfig.services.visualiserBars } BeatTracker { diff --git a/services/Brightness.qml b/services/Brightness.qml index 2cd628ec..ac34cbc1 100644 --- a/services/Brightness.qml +++ b/services/Brightness.qml @@ -50,13 +50,13 @@ Singleton { function increaseBrightness(): void { const monitor = getMonitor("active"); if (monitor) - monitor.setBrightness(monitor.brightness + Config.services.brightnessIncrement); + monitor.setBrightness(monitor.brightness + GlobalConfig.services.brightnessIncrement); } function decreaseBrightness(): void { const monitor = getMonitor("active"); if (monitor) - monitor.setBrightness(monitor.brightness - Config.services.brightnessIncrement); + monitor.setBrightness(monitor.brightness - GlobalConfig.services.brightnessIncrement); } onMonitorsChanged: { diff --git a/services/LyricsService.qml b/services/LyricsService.qml index 04fc64fb..26a75e9b 100644 --- a/services/LyricsService.qml +++ b/services/LyricsService.qml @@ -15,17 +15,17 @@ Singleton { property int currentIndex: -1 property bool loading: false property bool isManualSeeking: false - property bool lyricsVisible: Config.services.showLyrics + property bool lyricsVisible: GlobalConfig.services.showLyrics property string backend: "Local" - property string preferredBackend: Config.services.lyricsBackend + property string preferredBackend: GlobalConfig.services.lyricsBackend property real currentSongId: 0 property string loadedLocalFile: "" property real offset property int currentRequestId: 0 property var lyricsMap: ({}) - readonly property string lyricsDir: Paths.absolutePath(Config.paths.lyricsDir) - readonly property string lyricsMapFile: Paths.absolutePath(Config.paths.lyricsDir) + "/lyrics_map.json" + readonly property string lyricsDir: Paths.absolutePath(GlobalConfig.paths.lyricsDir) + readonly property string lyricsMapFile: lyricsDir + "/lyrics_map.json" readonly property alias model: lyricsModel readonly property alias candidatesModel: fetchedCandidatesModel readonly property var _netEaseHeaders: ({ @@ -68,7 +68,7 @@ Singleton { } function toggleVisibility() { - GlobalConfig.services.showLyrics = !Config.services.showLyrics; + GlobalConfig.services.showLyrics = !GlobalConfig.services.showLyrics; } function loadLyrics() { @@ -271,7 +271,7 @@ Singleton { } onPreferredBackendChanged: { - if (Config.services.lyricsBackend !== preferredBackend) { + if (GlobalConfig.services.lyricsBackend !== preferredBackend) { GlobalConfig.services.lyricsBackend = preferredBackend; } } diff --git a/services/Players.qml b/services/Players.qml index 23c9067f..41507839 100644 --- a/services/Players.qml +++ b/services/Players.qml @@ -12,11 +12,11 @@ Singleton { id: root readonly property list list: Mpris.players.values - readonly property MprisPlayer active: props.manualActive ?? list.find(p => getIdentity(p) === Config.services.defaultPlayer) ?? list[0] ?? null + readonly property MprisPlayer active: props.manualActive ?? list.find(p => getIdentity(p) === GlobalConfig.services.defaultPlayer) ?? list[0] ?? null property alias manualActive: props.manualActive function getIdentity(player: MprisPlayer): string { - const alias = Config.services.playerAliases.find(a => a.from === player.identity); + const alias = GlobalConfig.services.playerAliases.find(a => a.from === player.identity); return alias?.to ?? player.identity; } diff --git a/services/SystemUsage.qml b/services/SystemUsage.qml index e1dc4947..d2b19075 100644 --- a/services/SystemUsage.qml +++ b/services/SystemUsage.qml @@ -14,7 +14,7 @@ Singleton { property real cpuTemp // GPU properties - readonly property string gpuType: Config.services.gpuType.toUpperCase() || autoGpuType + readonly property string gpuType: GlobalConfig.services.gpuType.toUpperCase() || autoGpuType property string autoGpuType: "NONE" property string gpuName: "" property real gpuPerc @@ -251,7 +251,7 @@ Singleton { Process { id: gpuTypeCheck - running: !Config.services.gpuType + running: !GlobalConfig.services.gpuType command: ["sh", "-c", "if command -v nvidia-smi &>/dev/null && nvidia-smi -L &>/dev/null; then echo NVIDIA; elif ls /sys/class/drm/card*/device/gpu_busy_percent 2>/dev/null | grep -q .; then echo GENERIC; else echo NONE; fi"] stdout: StdioCollector { onStreamFinished: root.autoGpuType = text.trim() diff --git a/services/Time.qml b/services/Time.qml index f92c69a1..0db520d0 100644 --- a/services/Time.qml +++ b/services/Time.qml @@ -11,7 +11,7 @@ Singleton { readonly property int minutes: clock.minutes readonly property int seconds: clock.seconds - readonly property string timeStr: format(Config.services.useTwelveHourClock ? "hh:mm:A" : "hh:mm") + readonly property string timeStr: format(GlobalConfig.services.useTwelveHourClock ? "hh:mm:A" : "hh:mm") readonly property list timeComponents: timeStr.split(":") readonly property string hourStr: timeComponents[0] ?? "" readonly property string minuteStr: timeComponents[1] ?? "" diff --git a/services/Wallpapers.qml b/services/Wallpapers.qml index 3478d90c..15daf5c1 100644 --- a/services/Wallpapers.qml +++ b/services/Wallpapers.qml @@ -12,7 +12,7 @@ Searcher { id: root readonly property string currentNamePath: `${Paths.state}/wallpaper/path.txt` - readonly property list smartArg: Config.services.smartScheme ? [] : ["--no-smart"] + readonly property list smartArg: GlobalConfig.services.smartScheme ? [] : ["--no-smart"] property bool showPreview: false readonly property string current: showPreview ? previewPath : actualCurrent diff --git a/services/Weather.qml b/services/Weather.qml index 504c0bbb..9c30bf7a 100644 --- a/services/Weather.qml +++ b/services/Weather.qml @@ -27,7 +27,7 @@ Singleton { readonly property var cachedCities: new Map() function reload(): void { - const configLocation = Config.services.weatherLocation; + const configLocation = GlobalConfig.services.weatherLocation; if (configLocation) { if (configLocation.indexOf(",") !== -1 && !isNaN(parseFloat(configLocation.split(",")[0]))) { @@ -215,7 +215,7 @@ Singleton { root.reload(); } - target: Config.services + target: GlobalConfig.services } Timer { diff --git a/utils/Icons.qml b/utils/Icons.qml index 1d958cff..c864d553 100644 --- a/utils/Icons.qml +++ b/utils/Icons.qml @@ -107,7 +107,7 @@ Singleton { } function getAppCategoryIcon(name: string, fallback: string): string { - for (const iconConfig of Config.bar.workspaces.windowIcons) + for (const iconConfig of GlobalConfig.bar.workspaces.windowIcons) if (matchIconConfig(name, iconConfig)) return iconConfig.icon; @@ -212,7 +212,7 @@ Singleton { function getSpecialWsIcon(name: string): string { name = name.toLowerCase().slice("special:".length); - for (const iconConfig of Config.bar.workspaces.specialWorkspaceIcons) + for (const iconConfig of GlobalConfig.bar.workspaces.specialWorkspaceIcons) if (matchIconConfig(name, iconConfig)) return iconConfig.icon; @@ -230,7 +230,7 @@ Singleton { } function getTrayIcon(id: string, icon: string): string { - for (const sub of Config.bar.tray.iconSubs) + for (const sub of GlobalConfig.bar.tray.iconSubs) if (sub.id === id) return sub.image ? Qt.resolvedUrl(sub.image) : Quickshell.iconPath(sub.icon); diff --git a/utils/SysInfo.qml b/utils/SysInfo.qml index 8081340e..c715b8d2 100644 --- a/utils/SysInfo.qml +++ b/utils/SysInfo.qml @@ -36,11 +36,11 @@ Singleton { root.osIdLike = fd("ID_LIKE").split(" "); const logo = Quickshell.iconPath(fd("LOGO"), true); - if (Config.general.logo === "caelestia") { + if (GlobalConfig.general.logo === "caelestia") { root.osLogo = Qt.resolvedUrl(`${Quickshell.shellDir}/assets/logo.svg`); root.isDefaultLogo = true; - } else if (Config.general.logo) { - root.osLogo = Quickshell.iconPath(Config.general.logo, true) || "file://" + Paths.absolutePath(Config.general.logo); + } else if (GlobalConfig.general.logo) { + root.osLogo = Quickshell.iconPath(GlobalConfig.general.logo, true) || "file://" + Paths.absolutePath(GlobalConfig.general.logo); root.isDefaultLogo = false; } else if (logo) { root.osLogo = logo; @@ -54,7 +54,7 @@ Singleton { osRelease.reload(); } - target: Config.general + target: GlobalConfig.general } Timer { From bbba6e162d94e421195a7bf4ce43de74fdc38cbd Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Mon, 13 Apr 2026 00:12:44 +1000 Subject: [PATCH 66/81] fix: global transparency --- plugin/src/Caelestia/Config/appearanceconfig.hpp | 6 +++--- plugin/src/Caelestia/Config/tokensattached.cpp | 5 ++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/plugin/src/Caelestia/Config/appearanceconfig.hpp b/plugin/src/Caelestia/Config/appearanceconfig.hpp index f366482d..ccb732fd 100644 --- a/plugin/src/Caelestia/Config/appearanceconfig.hpp +++ b/plugin/src/Caelestia/Config/appearanceconfig.hpp @@ -216,9 +216,9 @@ class AppearanceTransparency : public ConfigObject { Q_OBJECT QML_ANONYMOUS - CONFIG_PROPERTY(bool, enabled, false) - CONFIG_PROPERTY(qreal, base, 0.85) - CONFIG_PROPERTY(qreal, layers, 0.4) + CONFIG_GLOBAL_PROPERTY(bool, enabled, false) + CONFIG_GLOBAL_PROPERTY(qreal, base, 0.85) + CONFIG_GLOBAL_PROPERTY(qreal, layers, 0.4) public: explicit AppearanceTransparency(QObject* parent = nullptr) diff --git a/plugin/src/Caelestia/Config/tokensattached.cpp b/plugin/src/Caelestia/Config/tokensattached.cpp index cf4acdb4..6c05bb4b 100644 --- a/plugin/src/Caelestia/Config/tokensattached.cpp +++ b/plugin/src/Caelestia/Config/tokensattached.cpp @@ -49,10 +49,13 @@ TOKENS_ATTACHED_GETTER(AppearanceRounding, rounding) TOKENS_ATTACHED_GETTER(AppearanceSpacing, spacing) TOKENS_ATTACHED_GETTER(AppearancePadding, padding) TOKENS_ATTACHED_GETTER(AppearanceFont, font) -TOKENS_ATTACHED_GETTER(AppearanceTransparency, transparency) #undef TOKENS_ATTACHED_GETTER +const AppearanceTransparency* Tokens::transparency() const { + return GlobalConfig::instance()->appearance()->transparency(); // Transparency is always global +} + const SizeTokens* Tokens::sizes() const { if (m_scope && m_scope->tokens()) return m_scope->tokens()->sizes(); From 8883156dd9f6b65e29546f9f91067b80e6ed9407 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Mon, 13 Apr 2026 00:25:16 +1000 Subject: [PATCH 67/81] fix: add lock config scope Also global lock settings And fix some accesses --- modules/IdleMonitors.qml | 6 +- modules/lock/LockSurface.qml | 109 +++++++++++---------- modules/lock/Pam.qml | 6 +- plugin/src/Caelestia/Config/lockconfig.hpp | 4 +- utils/Paths.qml | 2 +- 5 files changed, 67 insertions(+), 60 deletions(-) diff --git a/modules/IdleMonitors.qml b/modules/IdleMonitors.qml index 839cd6f6..417b0e8a 100644 --- a/modules/IdleMonitors.qml +++ b/modules/IdleMonitors.qml @@ -11,7 +11,7 @@ Scope { id: root required property Lock lock - readonly property bool enabled: !Config.general.idle.inhibitWhenAudio || !Players.list.some(p => p.isPlaying) + readonly property bool enabled: !GlobalConfig.general.idle.inhibitWhenAudio || !Players.list.some(p => p.isPlaying) function handleIdleAction(action: var): void { if (!action) @@ -29,7 +29,7 @@ Scope { LogindManager { onAboutToSleep: { - if (Config.general.idle.lockBeforeSleep) + if (GlobalConfig.general.idle.lockBeforeSleep) root.lock.lock.locked = true; } onLockRequested: root.lock.lock.locked = true @@ -37,7 +37,7 @@ Scope { } Variants { - model: Config.general.idle.timeouts + model: GlobalConfig.general.idle.timeouts IdleMonitor { required property var modelData diff --git a/modules/lock/LockSurface.qml b/modules/lock/LockSurface.qml index b269e1ea..70c754d6 100644 --- a/modules/lock/LockSurface.qml +++ b/modules/lock/LockSurface.qml @@ -159,72 +159,79 @@ WlSessionLockSurface { } } - ScreencopyView { - id: background + ConfigScope { + id: configScope anchors.fill: parent - captureSource: root.screen - opacity: 0 + screen: root.screen - layer.enabled: true - layer.effect: MultiEffect { - autoPaddingEnabled: false - blurEnabled: true - blur: 1 - blurMax: 64 - blurMultiplier: 1 - } - } - - Item { - id: lockContent - - readonly property int size: lockIcon.implicitHeight + Tokens.padding.large * 4 - readonly property int radius: size / 4 * Tokens.rounding.scale - - anchors.centerIn: parent - implicitWidth: size - implicitHeight: size - - rotation: 180 - scale: 0 - - StyledRect { - id: lockBg + ScreencopyView { + id: background anchors.fill: parent - color: Colours.palette.m3surface - radius: parent.radius - opacity: Colours.transparency.enabled ? Colours.transparency.base : 1 + captureSource: root.screen + opacity: 0 layer.enabled: true layer.effect: MultiEffect { - shadowEnabled: true - blurMax: 15 - shadowColor: Qt.alpha(Colours.palette.m3shadow, 0.7) + autoPaddingEnabled: false + blurEnabled: true + blur: 1 + blurMax: 64 + blurMultiplier: 1 } } - MaterialIcon { - id: lockIcon + Item { + id: lockContent + + readonly property int size: lockIcon.implicitHeight + Tokens.padding.large * 4 + readonly property int radius: size / 4 * Tokens.rounding.scale anchors.centerIn: parent - text: "lock" - font.pointSize: Tokens.font.size.extraLarge * 4 - font.bold: true + implicitWidth: size + implicitHeight: size + rotation: 180 - } - - Content { - id: content - - anchors.centerIn: parent - width: (root.screen?.height ?? 0) * Tokens.sizes.lock.heightMult * Tokens.sizes.lock.ratio - Tokens.padding.large * 2 - height: (root.screen?.height ?? 0) * Tokens.sizes.lock.heightMult - Tokens.padding.large * 2 - - lock: root - opacity: 0 scale: 0 + + StyledRect { + id: lockBg + + anchors.fill: parent + color: Colours.palette.m3surface + radius: parent.radius + opacity: Colours.transparency.enabled ? Colours.transparency.base : 1 + + layer.enabled: true + layer.effect: MultiEffect { + shadowEnabled: true + blurMax: 15 + shadowColor: Qt.alpha(Colours.palette.m3shadow, 0.7) + } + } + + MaterialIcon { + id: lockIcon + + anchors.centerIn: parent + text: "lock" + font.pointSize: Tokens.font.size.extraLarge * 4 + font.bold: true + rotation: 180 + } + + Content { + id: content + + anchors.centerIn: parent + width: (root.screen?.height ?? 0) * Tokens.sizes.lock.heightMult * Tokens.sizes.lock.ratio - Tokens.padding.large * 2 + height: (root.screen?.height ?? 0) * Tokens.sizes.lock.heightMult - Tokens.padding.large * 2 + + lock: root + opacity: 0 + scale: 0 + } } } } diff --git a/modules/lock/Pam.qml b/modules/lock/Pam.qml index 8f780ea0..94832b20 100644 --- a/modules/lock/Pam.qml +++ b/modules/lock/Pam.qml @@ -82,7 +82,7 @@ Scope { property int errorTries function checkAvail(): void { - if (!available || !Config.lock.enableFprint || !root.lock.secure) { + if (!available || !GlobalConfig.lock.enableFprint || !root.lock.secure) { abort(); return; } @@ -113,7 +113,7 @@ Scope { // Isn't actually the real max tries as pam only reports completed // when max tries is reached. tries++; - if (tries < Config.lock.maxFprintTries) { + if (tries < GlobalConfig.lock.maxFprintTries) { // Restart if not actually real max tries root.fprintState = "fail"; start(); @@ -188,6 +188,6 @@ Scope { fprint.checkAvail(); } - target: Config.lock + target: GlobalConfig.lock } } diff --git a/plugin/src/Caelestia/Config/lockconfig.hpp b/plugin/src/Caelestia/Config/lockconfig.hpp index 444b3051..0d8aa6ba 100644 --- a/plugin/src/Caelestia/Config/lockconfig.hpp +++ b/plugin/src/Caelestia/Config/lockconfig.hpp @@ -9,8 +9,8 @@ class LockConfig : public ConfigObject { QML_ANONYMOUS CONFIG_PROPERTY(bool, recolourLogo, false) - CONFIG_PROPERTY(bool, enableFprint, true) - CONFIG_PROPERTY(int, maxFprintTries, 3) + CONFIG_GLOBAL_PROPERTY(bool, enableFprint, true) + CONFIG_GLOBAL_PROPERTY(int, maxFprintTries, 3) CONFIG_PROPERTY(bool, hideNotifs, false) public: diff --git a/utils/Paths.qml b/utils/Paths.qml index aa967913..97f6448a 100644 --- a/utils/Paths.qml +++ b/utils/Paths.qml @@ -19,7 +19,7 @@ Singleton { readonly property string imagecache: `${cache}/imagecache` readonly property string notifimagecache: `${imagecache}/notifs` - readonly property string wallsdir: Quickshell.env("CAELESTIA_WALLPAPERS_DIR") || absolutePath(Config.paths.wallpaperDir) + readonly property string wallsdir: Quickshell.env("CAELESTIA_WALLPAPERS_DIR") || absolutePath(GlobalConfig.paths.wallpaperDir) readonly property string recsdir: Quickshell.env("CAELESTIA_RECORDINGS_DIR") || `${videos}/Recordings` readonly property string libdir: Quickshell.env("CAELESTIA_LIB_DIR") || "/usr/lib/caelestia" From 8c8d196e2042e2447088e5ed32258177d8471329 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Mon, 13 Apr 2026 03:06:13 +1000 Subject: [PATCH 68/81] feat: use QQuickAttachedPropertyPropagator Instead of manually trying to find ancestor ConfigScope, set attached prop on ancestor and propagate via attached props --- components/containers/StyledWindow.qml | 10 +- modules/drawers/ContentWindow.qml | 10 +- modules/drawers/Regions.qml | 4 +- modules/lock/LockSurface.qml | 112 +++++++++--------- plugin/src/Caelestia/CMakeLists.txt | 2 +- plugin/src/Caelestia/Config/CMakeLists.txt | 2 +- plugin/src/Caelestia/Config/anim.hpp | 4 +- .../src/Caelestia/Config/configattached.cpp | 53 ++++++--- .../src/Caelestia/Config/configattached.hpp | 23 ++-- plugin/src/Caelestia/Config/configscope.cpp | 64 ---------- plugin/src/Caelestia/Config/configscope.hpp | 45 ------- plugin/src/Caelestia/Config/tokens.hpp | 2 - .../src/Caelestia/Config/tokensattached.cpp | 67 ++++++++--- .../src/Caelestia/Config/tokensattached.hpp | 22 +++- 14 files changed, 185 insertions(+), 235 deletions(-) delete mode 100644 plugin/src/Caelestia/Config/configscope.cpp delete mode 100644 plugin/src/Caelestia/Config/configscope.hpp diff --git a/components/containers/StyledWindow.qml b/components/containers/StyledWindow.qml index c93465c7..8ea3c227 100644 --- a/components/containers/StyledWindow.qml +++ b/components/containers/StyledWindow.qml @@ -8,16 +8,10 @@ PanelWindow { id: root required property string name - readonly property alias configScope: scope - default property alias contentData: scope.data WlrLayershell.namespace: `caelestia-${name}` color: "transparent" - ConfigScope { - id: scope - - anchors.fill: parent - screen: root.screen.name - } + contentItem.Config.screen: screen.name + contentItem.Tokens.screen: screen.name } diff --git a/modules/drawers/ContentWindow.qml b/modules/drawers/ContentWindow.qml index 4ff12c16..a321543b 100644 --- a/modules/drawers/ContentWindow.qml +++ b/modules/drawers/ContentWindow.qml @@ -30,9 +30,9 @@ StyledWindow { } return monitor?.activeWorkspace?.toplevels.values.some(t => t.lastIpcObject.fullscreen > 1) ?? false; } - property real borderThickness: hasFullscreen ? 0 : configScope.Config.border.thickness - readonly property real borderLayoutThickness: hasFullscreen ? 0 : configScope.Config.border.thickness - property real borderRounding: hasFullscreen ? 0 : configScope.Config.border.rounding + property real borderThickness: hasFullscreen ? 0 : contentItem.Config.border.thickness + readonly property real borderLayoutThickness: hasFullscreen ? 0 : contentItem.Config.border.thickness + property real borderRounding: hasFullscreen ? 0 : contentItem.Config.border.rounding property real shadowOpacity: hasFullscreen ? 0 : 0.7 readonly property int dragMaskPadding: { @@ -44,8 +44,8 @@ StyledWindow { const thresholds = []; for (const panel of ["dashboard", "launcher", "session", "sidebar"]) - if (configScope.Config[panel].enabled) - thresholds.push(configScope.Config[panel].dragThreshold); + if (contentItem.Config[panel].enabled) + thresholds.push(contentItem.Config[panel].dragThreshold); return Math.max(...thresholds); } diff --git a/modules/drawers/Regions.qml b/modules/drawers/Regions.qml index 26b7b4c6..47ad0680 100644 --- a/modules/drawers/Regions.qml +++ b/modules/drawers/Regions.qml @@ -12,8 +12,8 @@ Region { required property Panels panels required property var win - readonly property real borderThickness: win.configScope.Config.border.thickness - readonly property real clampedThickness: win.configScope.Config.border.clampedThickness + readonly property real borderThickness: win.contentItem.Config.border.thickness + readonly property real clampedThickness: win.contentItem.Config.border.clampedThickness x: bar.clampedWidth + win.dragMaskPadding y: clampedThickness + win.dragMaskPadding diff --git a/modules/lock/LockSurface.qml b/modules/lock/LockSurface.qml index 70c754d6..23bfd65f 100644 --- a/modules/lock/LockSurface.qml +++ b/modules/lock/LockSurface.qml @@ -15,6 +15,9 @@ WlSessionLockSurface { readonly property alias unlocking: unlockAnim.running + contentItem.Config.screen: screen.name + contentItem.Tokens.screen: screen.name + color: "transparent" Connections { @@ -159,79 +162,72 @@ WlSessionLockSurface { } } - ConfigScope { - id: configScope + ScreencopyView { + id: background anchors.fill: parent - screen: root.screen + captureSource: root.screen + opacity: 0 - ScreencopyView { - id: background + layer.enabled: true + layer.effect: MultiEffect { + autoPaddingEnabled: false + blurEnabled: true + blur: 1 + blurMax: 64 + blurMultiplier: 1 + } + } + + Item { + id: lockContent + + readonly property int size: lockIcon.implicitHeight + Tokens.padding.large * 4 + readonly property int radius: size / 4 * Tokens.rounding.scale + + anchors.centerIn: parent + implicitWidth: size + implicitHeight: size + + rotation: 180 + scale: 0 + + StyledRect { + id: lockBg anchors.fill: parent - captureSource: root.screen - opacity: 0 + color: Colours.palette.m3surface + radius: parent.radius + opacity: Colours.transparency.enabled ? Colours.transparency.base : 1 layer.enabled: true layer.effect: MultiEffect { - autoPaddingEnabled: false - blurEnabled: true - blur: 1 - blurMax: 64 - blurMultiplier: 1 + shadowEnabled: true + blurMax: 15 + shadowColor: Qt.alpha(Colours.palette.m3shadow, 0.7) } } - Item { - id: lockContent - - readonly property int size: lockIcon.implicitHeight + Tokens.padding.large * 4 - readonly property int radius: size / 4 * Tokens.rounding.scale + MaterialIcon { + id: lockIcon anchors.centerIn: parent - implicitWidth: size - implicitHeight: size - + text: "lock" + font.pointSize: Tokens.font.size.extraLarge * 4 + font.bold: true rotation: 180 + } + + Content { + id: content + + anchors.centerIn: parent + width: (root.screen?.height ?? 0) * Tokens.sizes.lock.heightMult * Tokens.sizes.lock.ratio - Tokens.padding.large * 2 + height: (root.screen?.height ?? 0) * Tokens.sizes.lock.heightMult - Tokens.padding.large * 2 + + lock: root + opacity: 0 scale: 0 - - StyledRect { - id: lockBg - - anchors.fill: parent - color: Colours.palette.m3surface - radius: parent.radius - opacity: Colours.transparency.enabled ? Colours.transparency.base : 1 - - layer.enabled: true - layer.effect: MultiEffect { - shadowEnabled: true - blurMax: 15 - shadowColor: Qt.alpha(Colours.palette.m3shadow, 0.7) - } - } - - MaterialIcon { - id: lockIcon - - anchors.centerIn: parent - text: "lock" - font.pointSize: Tokens.font.size.extraLarge * 4 - font.bold: true - rotation: 180 - } - - Content { - id: content - - anchors.centerIn: parent - width: (root.screen?.height ?? 0) * Tokens.sizes.lock.heightMult * Tokens.sizes.lock.ratio - Tokens.padding.large * 2 - height: (root.screen?.height ?? 0) * Tokens.sizes.lock.heightMult - Tokens.padding.large * 2 - - lock: root - opacity: 0 - scale: 0 - } } } } diff --git a/plugin/src/Caelestia/CMakeLists.txt b/plugin/src/Caelestia/CMakeLists.txt index 01f43b21..fbee0482 100644 --- a/plugin/src/Caelestia/CMakeLists.txt +++ b/plugin/src/Caelestia/CMakeLists.txt @@ -1,4 +1,4 @@ -find_package(Qt6 REQUIRED COMPONENTS ShaderTools Core Qml Gui Quick Concurrent Sql Network DBus) +find_package(Qt6 REQUIRED COMPONENTS ShaderTools Core Qml Gui Quick QuickControls2 Concurrent Sql Network DBus) find_package(PkgConfig REQUIRED) pkg_check_modules(Qalculate IMPORTED_TARGET libqalculate REQUIRED) pkg_check_modules(Pipewire IMPORTED_TARGET libpipewire-0.3 REQUIRED) diff --git a/plugin/src/Caelestia/Config/CMakeLists.txt b/plugin/src/Caelestia/Config/CMakeLists.txt index 9322d76c..4b26ea02 100644 --- a/plugin/src/Caelestia/Config/CMakeLists.txt +++ b/plugin/src/Caelestia/Config/CMakeLists.txt @@ -5,7 +5,6 @@ qml_module(caelestia-config configattached.cpp configobject.cpp rootconfig.cpp - configscope.cpp appearanceconfig.cpp tokens.cpp tokensattached.cpp @@ -29,4 +28,5 @@ qml_module(caelestia-config winfoconfig.hpp LIBRARIES Qt::Quick + Qt::QuickControls2 ) diff --git a/plugin/src/Caelestia/Config/anim.hpp b/plugin/src/Caelestia/Config/anim.hpp index 1d5909a7..b90c3bda 100644 --- a/plugin/src/Caelestia/Config/anim.hpp +++ b/plugin/src/Caelestia/Config/anim.hpp @@ -8,11 +8,11 @@ namespace caelestia::config { class AnimCurves; class AnimDurations; -class ConfigScope; class AnimTokens : public QObject { Q_OBJECT - Q_MOC_INCLUDE("appearanceconfig.hpp") + Q_MOC_INCLUDE("tokens.hpp") // AnimCurves + Q_MOC_INCLUDE("appearanceconfig.hpp") // AnimDurations QML_ANONYMOUS Q_PROPERTY(QEasingCurve emphasized READ emphasized NOTIFY curvesChanged) diff --git a/plugin/src/Caelestia/Config/configattached.cpp b/plugin/src/Caelestia/Config/configattached.cpp index cc6ae8f9..5cafe34a 100644 --- a/plugin/src/Caelestia/Config/configattached.cpp +++ b/plugin/src/Caelestia/Config/configattached.cpp @@ -1,33 +1,56 @@ #include "configattached.hpp" #include "config.hpp" -#include "configscope.hpp" #include "monitorconfigmanager.hpp" namespace caelestia::config { -Config::Config(ConfigScope* scope, QObject* parent) - : QObject(parent) - , m_scope(scope) { - connectScope(); +Config::Config(QObject* parent) + : QQuickAttachedPropertyPropagator(parent) { + initialize(); } -ConfigScope* Config::scope() const { - return m_scope; +QString Config::screen() const { + return m_screen; } -void Config::connectScope() { - if (!m_scope) +void Config::inheritScreen(const QString& screen) { + if (screen == m_screen) return; - connect(m_scope, &ConfigScope::configChanged, this, &Config::sourceChanged); - connect(m_scope, &ConfigScope::tokensChanged, this, &Config::sourceChanged); + + m_screen = screen; + + if (m_screen.isEmpty()) + m_config = nullptr; + else + m_config = MonitorConfigManager::instance()->configForScreen(m_screen); + + propagateScreen(); + emit sourceChanged(); +} + +void Config::propagateScreen() { + const auto children = attachedChildren(); + for (auto* const child : children) { + auto* const config = qobject_cast(child); + if (config) + config->inheritScreen(m_screen); + } +} + +void Config::attachedParentChange( + QQuickAttachedPropertyPropagator* newParent, QQuickAttachedPropertyPropagator* oldParent) { + Q_UNUSED(oldParent); + auto* const config = qobject_cast(newParent); + if (config) + inheritScreen(config->screen()); } #define CONFIG_ATTACHED_GETTER(Type, name) \ const Type* Config::name() const { \ - if (m_scope && m_scope->config()) \ - return m_scope->config()->name(); \ + if (m_config) \ + return m_config->name(); \ if (parent()) \ - qCWarning(lcConfig, "Config.%s accessed without a ConfigScope ancestor on %s", #name, \ + qCWarning(lcConfig, "Config.%s accessed without a screen set on %s", #name, \ parent()->metaObject()->className()); \ return GlobalConfig::instance()->name(); \ } @@ -57,7 +80,7 @@ GlobalConfig* Config::forScreen(const QString& screen) { } Config* Config::qmlAttachedProperties(QObject* object) { - return new Config(ConfigScope::find(object), object); + return new Config(object); } } // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/configattached.hpp b/plugin/src/Caelestia/Config/configattached.hpp index d63c330f..2b4c32a1 100644 --- a/plugin/src/Caelestia/Config/configattached.hpp +++ b/plugin/src/Caelestia/Config/configattached.hpp @@ -1,17 +1,18 @@ #pragma once #include "config.hpp" -#include "configscope.hpp" + +#include namespace caelestia::config { -class Config : public QObject { +class Config : public QQuickAttachedPropertyPropagator { Q_OBJECT QML_ELEMENT QML_UNCREATABLE("") QML_ATTACHED(Config) - Q_PROPERTY(caelestia::config::ConfigScope* scope READ scope NOTIFY sourceChanged) + Q_PROPERTY(QString screen READ screen WRITE inheritScreen NOTIFY sourceChanged) Q_PROPERTY(const caelestia::config::AppearanceConfig* appearance READ appearance NOTIFY sourceChanged) Q_PROPERTY(const caelestia::config::GeneralConfig* general READ general NOTIFY sourceChanged) Q_PROPERTY(const caelestia::config::BackgroundConfig* background READ background NOTIFY sourceChanged) @@ -31,9 +32,10 @@ class Config : public QObject { Q_PROPERTY(const caelestia::config::UserPaths* paths READ paths NOTIFY sourceChanged) public: - explicit Config(ConfigScope* scope, QObject* parent = nullptr); + explicit Config(QObject* parent = nullptr); - [[nodiscard]] ConfigScope* scope() const; + [[nodiscard]] QString screen() const; + void inheritScreen(const QString& screen); [[nodiscard]] const AppearanceConfig* appearance() const; [[nodiscard]] const GeneralConfig* general() const; @@ -60,10 +62,15 @@ public: signals: void sourceChanged(); -private: - void connectScope(); +protected: + void attachedParentChange( + QQuickAttachedPropertyPropagator* newParent, QQuickAttachedPropertyPropagator* oldParent) override; - ConfigScope* m_scope; +private: + void propagateScreen(); + + QString m_screen; + GlobalConfig* m_config = nullptr; }; } // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/configscope.cpp b/plugin/src/Caelestia/Config/configscope.cpp deleted file mode 100644 index 769f2b73..00000000 --- a/plugin/src/Caelestia/Config/configscope.cpp +++ /dev/null @@ -1,64 +0,0 @@ -#include "configscope.hpp" -#include "monitorconfigmanager.hpp" - -namespace caelestia::config { - -ConfigScope::ConfigScope(QQuickItem* parent) - : QQuickItem(parent) {} - -QString ConfigScope::screen() const { - return m_screen; -} - -GlobalConfig* ConfigScope::config() const { - return m_config; -} - -TokenConfig* ConfigScope::tokens() const { - return m_tokens; -} - -void ConfigScope::setScreen(const QString& screen) { - if (m_screen == screen) - return; - - m_screen = screen; - emit screenChanged(); - resolveConfig(); -} - -void ConfigScope::resolveConfig() { - GlobalConfig* newConfig = nullptr; - TokenConfig* newTokens = nullptr; - - if (!m_screen.isEmpty()) { - if (auto* mgr = MonitorConfigManager::instance()) { - newConfig = mgr->configForScreen(m_screen); - newTokens = mgr->tokensForScreen(m_screen); - } - } - - if (m_config != newConfig) { - m_config = newConfig; - emit configChanged(); - } - - if (m_tokens != newTokens) { - m_tokens = newTokens; - emit tokensChanged(); - } -} - -ConfigScope* ConfigScope::find(QObject* object) { - auto* item = qobject_cast(object); - - while (item) { - if (auto* scope = qobject_cast(item)) - return scope; - item = item->parentItem(); - } - - return nullptr; -} - -} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/configscope.hpp b/plugin/src/Caelestia/Config/configscope.hpp deleted file mode 100644 index 82869816..00000000 --- a/plugin/src/Caelestia/Config/configscope.hpp +++ /dev/null @@ -1,45 +0,0 @@ -#pragma once - -#include -#include - -namespace caelestia::config { - -class GlobalConfig; -class TokenConfig; - -class ConfigScope : public QQuickItem { - Q_OBJECT - Q_MOC_INCLUDE("config.hpp") - Q_MOC_INCLUDE("tokens.hpp") - QML_ELEMENT - - Q_PROPERTY(QString screen READ screen WRITE setScreen NOTIFY screenChanged) - Q_PROPERTY(caelestia::config::GlobalConfig* config READ config NOTIFY configChanged) - Q_PROPERTY(caelestia::config::TokenConfig* tokens READ tokens NOTIFY tokensChanged) - -public: - explicit ConfigScope(QQuickItem* parent = nullptr); - - [[nodiscard]] QString screen() const; - void setScreen(const QString& screen); - - [[nodiscard]] GlobalConfig* config() const; - [[nodiscard]] TokenConfig* tokens() const; - - static ConfigScope* find(QObject* object); - -signals: - void screenChanged(); - void configChanged(); - void tokensChanged(); - -private: - void resolveConfig(); - - QString m_screen; - GlobalConfig* m_config = nullptr; - TokenConfig* m_tokens = nullptr; -}; - -} // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/tokens.hpp b/plugin/src/Caelestia/Config/tokens.hpp index 1a0c7b8f..de0a7c26 100644 --- a/plugin/src/Caelestia/Config/tokens.hpp +++ b/plugin/src/Caelestia/Config/tokens.hpp @@ -9,8 +9,6 @@ namespace caelestia::config { -class ConfigScope; - class AnimCurves : public ConfigObject { Q_OBJECT QML_ANONYMOUS diff --git a/plugin/src/Caelestia/Config/tokensattached.cpp b/plugin/src/Caelestia/Config/tokensattached.cpp index 6c05bb4b..b9cf5745 100644 --- a/plugin/src/Caelestia/Config/tokensattached.cpp +++ b/plugin/src/Caelestia/Config/tokensattached.cpp @@ -1,7 +1,6 @@ #include "tokensattached.hpp" #include "anim.hpp" #include "config.hpp" -#include "configscope.hpp" #include "monitorconfigmanager.hpp" #include "tokens.hpp" @@ -9,29 +8,60 @@ namespace caelestia::config { namespace { -const AppearanceConfig* resolveAppearance(ConfigScope* scope, const char* prop, QObject* parent) { - if (scope && scope->config()) - return scope->config()->appearance(); +const AppearanceConfig* resolveAppearance(GlobalConfig* config, const char* prop, QObject* parent) { + if (config) + return config->appearance(); if (parent) - qCWarning(lcConfig, "Tokens.%s accessed without a ConfigScope ancestor on %s", prop, - parent->metaObject()->className()); + qCWarning(lcConfig, "Tokens.%s accessed without a screen set on %s", prop, parent->metaObject()->className()); return GlobalConfig::instance()->appearance(); } } // namespace -Tokens::Tokens(ConfigScope* scope, QObject* parent) - : QObject(parent) - , m_scope(scope) +Tokens::Tokens(QObject* parent) + : QQuickAttachedPropertyPropagator(parent) , m_anim(new AnimTokens(this)) { - connectScope(); bindAnim(); + initialize(); } -void Tokens::connectScope() { - if (!m_scope) +QString Tokens::screen() const { + return m_screen; +} + +void Tokens::inheritScreen(const QString& screen) { + if (screen == m_screen) return; - connect(m_scope, &ConfigScope::configChanged, this, &Tokens::sourceChanged); + + m_screen = screen; + + if (m_screen.isEmpty()) { + m_config = nullptr; + m_tokens = nullptr; + } else { + m_config = MonitorConfigManager::instance()->configForScreen(m_screen); + m_tokens = MonitorConfigManager::instance()->tokensForScreen(m_screen); + } + + propagateScreen(); + emit sourceChanged(); +} + +void Tokens::propagateScreen() { + const auto children = attachedChildren(); + for (auto* const child : children) { + auto* const tokens = qobject_cast(child); + if (tokens) + tokens->inheritScreen(m_screen); + } +} + +void Tokens::attachedParentChange( + QQuickAttachedPropertyPropagator* newParent, QQuickAttachedPropertyPropagator* oldParent) { + Q_UNUSED(oldParent); + auto* const tokens = qobject_cast(newParent); + if (tokens) + inheritScreen(tokens->screen()); } void Tokens::bindAnim() { @@ -41,7 +71,7 @@ void Tokens::bindAnim() { #define TOKENS_ATTACHED_GETTER(Type, name) \ const Type* Tokens::name() const { \ - auto* a = resolveAppearance(m_scope, #name, parent()); \ + auto* a = resolveAppearance(m_config, #name, parent()); \ return a ? a->name() : nullptr; \ } @@ -57,11 +87,10 @@ const AppearanceTransparency* Tokens::transparency() const { } const SizeTokens* Tokens::sizes() const { - if (m_scope && m_scope->tokens()) - return m_scope->tokens()->sizes(); + if (m_tokens) + return m_tokens->sizes(); if (parent()) - qCWarning(lcConfig, "Tokens.sizes accessed without a ConfigScope ancestor on %s", - parent()->metaObject()->className()); + qCWarning(lcConfig, "Tokens.sizes accessed without a screen set on %s", parent()->metaObject()->className()); return TokenConfig::instance()->sizes(); } @@ -74,7 +103,7 @@ TokenConfig* Tokens::forScreen(const QString& screen) { } Tokens* Tokens::qmlAttachedProperties(QObject* object) { - return new Tokens(ConfigScope::find(object), object); + return new Tokens(object); } } // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/tokensattached.hpp b/plugin/src/Caelestia/Config/tokensattached.hpp index 88cf0102..4fa1a9b5 100644 --- a/plugin/src/Caelestia/Config/tokensattached.hpp +++ b/plugin/src/Caelestia/Config/tokensattached.hpp @@ -2,17 +2,20 @@ #include "anim.hpp" #include "appearanceconfig.hpp" -#include "configscope.hpp" +#include "config.hpp" #include "tokens.hpp" +#include + namespace caelestia::config { -class Tokens : public QObject { +class Tokens : public QQuickAttachedPropertyPropagator { Q_OBJECT QML_ELEMENT QML_UNCREATABLE("") QML_ATTACHED(Tokens) + Q_PROPERTY(QString screen READ screen WRITE inheritScreen NOTIFY sourceChanged) Q_PROPERTY(const caelestia::config::AppearanceRounding* rounding READ rounding NOTIFY sourceChanged) Q_PROPERTY(const caelestia::config::AppearanceSpacing* spacing READ spacing NOTIFY sourceChanged) Q_PROPERTY(const caelestia::config::AppearancePadding* padding READ padding NOTIFY sourceChanged) @@ -22,7 +25,10 @@ class Tokens : public QObject { Q_PROPERTY(const caelestia::config::AnimTokens* anim READ anim NOTIFY sourceChanged) public: - explicit Tokens(ConfigScope* scope, QObject* parent = nullptr); + explicit Tokens(QObject* parent = nullptr); + + [[nodiscard]] QString screen() const; + void inheritScreen(const QString& screen); [[nodiscard]] const AppearanceRounding* rounding() const; [[nodiscard]] const AppearanceSpacing* spacing() const; @@ -40,11 +46,17 @@ public: signals: void sourceChanged(); +protected: + void attachedParentChange( + QQuickAttachedPropertyPropagator* newParent, QQuickAttachedPropertyPropagator* oldParent) override; + private: - void connectScope(); + void propagateScreen(); void bindAnim(); - ConfigScope* m_scope; + QString m_screen; + GlobalConfig* m_config = nullptr; + TokenConfig* m_tokens = nullptr; AnimTokens* m_anim = nullptr; }; From 9de094b5edf9a941687ffd9b8d2f415d69cb2d10 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Mon, 13 Apr 2026 03:14:10 +1000 Subject: [PATCH 69/81] fix: suppress warnings before component is complete --- plugin/src/Caelestia/Config/configattached.cpp | 10 +++++++++- plugin/src/Caelestia/Config/configattached.hpp | 7 ++++++- plugin/src/Caelestia/Config/tokensattached.cpp | 14 ++++++++++---- plugin/src/Caelestia/Config/tokensattached.hpp | 7 ++++++- 4 files changed, 31 insertions(+), 7 deletions(-) diff --git a/plugin/src/Caelestia/Config/configattached.cpp b/plugin/src/Caelestia/Config/configattached.cpp index 5cafe34a..0a97c8c0 100644 --- a/plugin/src/Caelestia/Config/configattached.cpp +++ b/plugin/src/Caelestia/Config/configattached.cpp @@ -2,6 +2,8 @@ #include "config.hpp" #include "monitorconfigmanager.hpp" +#include + namespace caelestia::config { Config::Config(QObject* parent) @@ -9,6 +11,12 @@ Config::Config(QObject* parent) initialize(); } +void Config::classBegin() {} + +void Config::componentComplete() { + m_complete = true; +} + QString Config::screen() const { return m_screen; } @@ -49,7 +57,7 @@ void Config::attachedParentChange( const Type* Config::name() const { \ if (m_config) \ return m_config->name(); \ - if (parent()) \ + if (m_complete && parent()) /* Suppress warnings before component is complete */ \ qCWarning(lcConfig, "Config.%s accessed without a screen set on %s", #name, \ parent()->metaObject()->className()); \ return GlobalConfig::instance()->name(); \ diff --git a/plugin/src/Caelestia/Config/configattached.hpp b/plugin/src/Caelestia/Config/configattached.hpp index 2b4c32a1..35ccc6e4 100644 --- a/plugin/src/Caelestia/Config/configattached.hpp +++ b/plugin/src/Caelestia/Config/configattached.hpp @@ -6,8 +6,9 @@ namespace caelestia::config { -class Config : public QQuickAttachedPropertyPropagator { +class Config : public QQuickAttachedPropertyPropagator, public QQmlParserStatus { Q_OBJECT + Q_INTERFACES(QQmlParserStatus) QML_ELEMENT QML_UNCREATABLE("") QML_ATTACHED(Config) @@ -67,8 +68,12 @@ protected: QQuickAttachedPropertyPropagator* newParent, QQuickAttachedPropertyPropagator* oldParent) override; private: + void classBegin() override; + void componentComplete() override; + void propagateScreen(); + bool m_complete = false; QString m_screen; GlobalConfig* m_config = nullptr; }; diff --git a/plugin/src/Caelestia/Config/tokensattached.cpp b/plugin/src/Caelestia/Config/tokensattached.cpp index b9cf5745..627b50bf 100644 --- a/plugin/src/Caelestia/Config/tokensattached.cpp +++ b/plugin/src/Caelestia/Config/tokensattached.cpp @@ -8,10 +8,10 @@ namespace caelestia::config { namespace { -const AppearanceConfig* resolveAppearance(GlobalConfig* config, const char* prop, QObject* parent) { +const AppearanceConfig* resolveAppearance(GlobalConfig* config, bool complete, const char* prop, QObject* parent) { if (config) return config->appearance(); - if (parent) + if (complete && parent) qCWarning(lcConfig, "Tokens.%s accessed without a screen set on %s", prop, parent->metaObject()->className()); return GlobalConfig::instance()->appearance(); } @@ -25,6 +25,12 @@ Tokens::Tokens(QObject* parent) initialize(); } +void Tokens::classBegin() {} + +void Tokens::componentComplete() { + m_complete = true; +} + QString Tokens::screen() const { return m_screen; } @@ -71,7 +77,7 @@ void Tokens::bindAnim() { #define TOKENS_ATTACHED_GETTER(Type, name) \ const Type* Tokens::name() const { \ - auto* a = resolveAppearance(m_config, #name, parent()); \ + auto* a = resolveAppearance(m_config, m_complete, #name, parent()); \ return a ? a->name() : nullptr; \ } @@ -89,7 +95,7 @@ const AppearanceTransparency* Tokens::transparency() const { const SizeTokens* Tokens::sizes() const { if (m_tokens) return m_tokens->sizes(); - if (parent()) + if (m_complete && parent()) qCWarning(lcConfig, "Tokens.sizes accessed without a screen set on %s", parent()->metaObject()->className()); return TokenConfig::instance()->sizes(); } diff --git a/plugin/src/Caelestia/Config/tokensattached.hpp b/plugin/src/Caelestia/Config/tokensattached.hpp index 4fa1a9b5..6416bda5 100644 --- a/plugin/src/Caelestia/Config/tokensattached.hpp +++ b/plugin/src/Caelestia/Config/tokensattached.hpp @@ -9,8 +9,9 @@ namespace caelestia::config { -class Tokens : public QQuickAttachedPropertyPropagator { +class Tokens : public QQuickAttachedPropertyPropagator, public QQmlParserStatus { Q_OBJECT + Q_INTERFACES(QQmlParserStatus) QML_ELEMENT QML_UNCREATABLE("") QML_ATTACHED(Tokens) @@ -51,9 +52,13 @@ protected: QQuickAttachedPropertyPropagator* newParent, QQuickAttachedPropertyPropagator* oldParent) override; private: + void classBegin() override; + void componentComplete() override; + void propagateScreen(); void bindAnim(); + bool m_complete = false; QString m_screen; GlobalConfig* m_config = nullptr; TokenConfig* m_tokens = nullptr; From 06ad45d88a4d949b710f498a389e91a832b393ee Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Mon, 13 Apr 2026 03:23:29 +1000 Subject: [PATCH 70/81] fix: more non global access warnings --- modules/controlcenter/appearance/AppearancePane.qml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/controlcenter/appearance/AppearancePane.qml b/modules/controlcenter/appearance/AppearancePane.qml index 6ede9bb3..a1e0e42c 100644 --- a/modules/controlcenter/appearance/AppearancePane.qml +++ b/modules/controlcenter/appearance/AppearancePane.qml @@ -23,7 +23,7 @@ Item { required property Session session - property real animDurationsScale: Config.appearance.anim.durations.scale ?? 1 + property real animDurationsScale: GlobalConfig.appearance.anim.durations.scale ?? 1 property string fontFamilyMaterial: Config.appearance.font.family.material ?? "Material Symbols Rounded" property string fontFamilyMono: Config.appearance.font.family.mono ?? "CaskaydiaCove NF" property string fontFamilySans: Config.appearance.font.family.sans ?? "Rubik" @@ -31,9 +31,9 @@ Item { property real paddingScale: Config.appearance.padding.scale ?? 1 property real roundingScale: Config.appearance.rounding.scale ?? 1 property real spacingScale: Config.appearance.spacing.scale ?? 1 - property bool transparencyEnabled: Config.appearance.transparency.enabled ?? false - property real transparencyBase: Config.appearance.transparency.base ?? 0.85 - property real transparencyLayers: Config.appearance.transparency.layers ?? 0.4 + property bool transparencyEnabled: GlobalConfig.appearance.transparency.enabled ?? false + property real transparencyBase: GlobalConfig.appearance.transparency.base ?? 0.85 + property real transparencyLayers: GlobalConfig.appearance.transparency.layers ?? 0.4 property real borderRounding: Config.border.rounding ?? 1 property real borderThickness: Config.border.thickness ?? 1 From 6a91535677632ec8c168908c7301935a43158cde Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Mon, 13 Apr 2026 03:43:53 +1000 Subject: [PATCH 71/81] fix: don't suppress warnings on non Item components --- plugin/src/Caelestia/Config/configattached.cpp | 4 +++- plugin/src/Caelestia/Config/tokensattached.cpp | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/plugin/src/Caelestia/Config/configattached.cpp b/plugin/src/Caelestia/Config/configattached.cpp index 0a97c8c0..8d229049 100644 --- a/plugin/src/Caelestia/Config/configattached.cpp +++ b/plugin/src/Caelestia/Config/configattached.cpp @@ -57,7 +57,9 @@ void Config::attachedParentChange( const Type* Config::name() const { \ if (m_config) \ return m_config->name(); \ - if (m_complete && parent()) /* Suppress warnings before component is complete */ \ + /* Suppress warnings before component is complete if attached to a QQuickItem. */ \ + /* Raw QObjects are unable to inherit the screen (only QQuickItems can). */ \ + if ((m_complete || !qobject_cast(parent())) && parent()) \ qCWarning(lcConfig, "Config.%s accessed without a screen set on %s", #name, \ parent()->metaObject()->className()); \ return GlobalConfig::instance()->name(); \ diff --git a/plugin/src/Caelestia/Config/tokensattached.cpp b/plugin/src/Caelestia/Config/tokensattached.cpp index 627b50bf..a86550df 100644 --- a/plugin/src/Caelestia/Config/tokensattached.cpp +++ b/plugin/src/Caelestia/Config/tokensattached.cpp @@ -4,6 +4,8 @@ #include "monitorconfigmanager.hpp" #include "tokens.hpp" +#include + namespace caelestia::config { namespace { @@ -11,7 +13,7 @@ namespace { const AppearanceConfig* resolveAppearance(GlobalConfig* config, bool complete, const char* prop, QObject* parent) { if (config) return config->appearance(); - if (complete && parent) + if ((complete || !qobject_cast(parent)) && parent) qCWarning(lcConfig, "Tokens.%s accessed without a screen set on %s", prop, parent->metaObject()->className()); return GlobalConfig::instance()->appearance(); } @@ -95,7 +97,7 @@ const AppearanceTransparency* Tokens::transparency() const { const SizeTokens* Tokens::sizes() const { if (m_tokens) return m_tokens->sizes(); - if (m_complete && parent()) + if ((m_complete || !qobject_cast(parent())) && parent()) qCWarning(lcConfig, "Tokens.sizes accessed without a screen set on %s", parent()->metaObject()->className()); return TokenConfig::instance()->sizes(); } From 8106aca17358090088c141f03bba896a05fe382b Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Mon, 13 Apr 2026 15:53:43 +1000 Subject: [PATCH 72/81] fix: even more non global access --- components/controls/CircularProgress.qml | 4 +-- components/controls/StyledSwitch.qml | 4 +-- modules/BatteryMonitor.qml | 4 +-- modules/background/Background.qml | 6 ++--- modules/bar/popouts/TrayMenu.qml | 2 +- .../controlcenter/dashboard/DashboardPane.qml | 4 +-- modules/dashboard/Media.qml | 8 +++--- modules/dashboard/Performance.qml | 2 +- modules/dashboard/dash/Media.qml | 26 +++++++++---------- modules/drawers/ContentWindow.qml | 2 +- modules/drawers/Drawers.qml | 1 - modules/drawers/Exclusions.qml | 4 +-- modules/lock/Center.qml | 4 +-- modules/lock/LockSurface.qml | 6 ++--- modules/lock/NotifGroup.qml | 4 +-- modules/notifications/Notification.qml | 4 +-- modules/osd/Wrapper.qml | 2 +- modules/sidebar/NotifGroupList.qml | 2 +- .../src/Caelestia/Config/dashboardconfig.hpp | 4 +-- services/NetworkUsage.qml | 2 +- services/SystemUsage.qml | 2 +- 21 files changed, 48 insertions(+), 49 deletions(-) diff --git a/components/controls/CircularProgress.qml b/components/controls/CircularProgress.qml index 9e312280..f66e02e0 100644 --- a/components/controls/CircularProgress.qml +++ b/components/controls/CircularProgress.qml @@ -27,7 +27,7 @@ Shape { fillColor: "transparent" strokeColor: root.bgColour strokeWidth: root.strokeWidth - capStyle: Tokens.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap + capStyle: root.Tokens.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap PathAngleArc { startAngle: root.startAngle + 360 * root.vValue + root.gapAngle @@ -49,7 +49,7 @@ Shape { fillColor: "transparent" strokeColor: root.fgColour strokeWidth: root.strokeWidth - capStyle: Tokens.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap + capStyle: root.Tokens.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap PathAngleArc { startAngle: root.startAngle diff --git a/components/controls/StyledSwitch.qml b/components/controls/StyledSwitch.qml index a3439130..df1bfc71 100644 --- a/components/controls/StyledSwitch.qml +++ b/components/controls/StyledSwitch.qml @@ -88,10 +88,10 @@ Switch { asynchronous: true ShapePath { - strokeWidth: Tokens.font.size.larger * 0.15 + strokeWidth: root.Tokens.font.size.larger * 0.15 strokeColor: root.checked ? Colours.palette.m3primary : Colours.palette.m3surfaceContainerHighest fillColor: "transparent" - capStyle: Tokens.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap + capStyle: root.Tokens.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap startX: icon.start1.x startY: icon.start1.y diff --git a/modules/BatteryMonitor.qml b/modules/BatteryMonitor.qml index d0327ba0..2d13b5a3 100644 --- a/modules/BatteryMonitor.qml +++ b/modules/BatteryMonitor.qml @@ -7,7 +7,7 @@ import Caelestia.Config Scope { id: root - readonly property list warnLevels: [...Config.general.battery.warnLevels].sort((a, b) => b.level - a.level) + readonly property list warnLevels: [...GlobalConfig.general.battery.warnLevels].sort((a, b) => b.level - a.level) Connections { function onOnBatteryChanged(): void { @@ -38,7 +38,7 @@ Scope { } } - if (!hibernateTimer.running && p <= Config.general.battery.criticalLevel) { + if (!hibernateTimer.running && p <= GlobalConfig.general.battery.criticalLevel) { Toaster.toast(qsTr("Hibernating in 5 seconds"), qsTr("Hibernating to prevent data loss"), "battery_android_alert", Toast.Error); hibernateTimer.start(); } diff --git a/modules/background/Background.qml b/modules/background/Background.qml index fde27ef4..af63848c 100644 --- a/modules/background/Background.qml +++ b/modules/background/Background.qml @@ -8,7 +8,7 @@ import qs.components.containers import qs.services Variants { - model: Config.background.enabled ? Screens.screens : [] + model: Screens.screens.filter(s => GlobalConfig.forScreen(s.name).background.enabled) StyledWindow { id: win @@ -18,8 +18,8 @@ Variants { screen: modelData name: "background" WlrLayershell.exclusionMode: ExclusionMode.Ignore - WlrLayershell.layer: Config.background.wallpaperEnabled ? WlrLayer.Background : WlrLayer.Bottom - color: Config.background.wallpaperEnabled ? "black" : "transparent" + WlrLayershell.layer: contentItem.Config.background.wallpaperEnabled ? WlrLayer.Background : WlrLayer.Bottom + color: contentItem.Config.background.wallpaperEnabled ? "black" : "transparent" surfaceFormat.opaque: false anchors.top: true diff --git a/modules/bar/popouts/TrayMenu.qml b/modules/bar/popouts/TrayMenu.qml index 9dfcb4a7..49329238 100644 --- a/modules/bar/popouts/TrayMenu.qml +++ b/modules/bar/popouts/TrayMenu.qml @@ -152,7 +152,7 @@ StackView { font.family: label.font.family elide: Text.ElideRight - elideWidth: Tokens.sizes.bar.trayMenuWidth - (icon.active ? icon.implicitWidth + label.anchors.leftMargin : 0) - (expand.active ? expand.implicitWidth + Tokens.spacing.normal : 0) + elideWidth: root.Tokens.sizes.bar.trayMenuWidth - (icon.active ? icon.implicitWidth + label.anchors.leftMargin : 0) - (expand.active ? expand.implicitWidth + root.Tokens.spacing.normal : 0) } Loader { diff --git a/modules/controlcenter/dashboard/DashboardPane.qml b/modules/controlcenter/dashboard/DashboardPane.qml index 46e33ebc..6bde196a 100644 --- a/modules/controlcenter/dashboard/DashboardPane.qml +++ b/modules/controlcenter/dashboard/DashboardPane.qml @@ -22,8 +22,8 @@ Item { // General Settings property bool enabled: Config.dashboard.enabled ?? true property bool showOnHover: Config.dashboard.showOnHover ?? true - property int mediaUpdateInterval: Config.dashboard.mediaUpdateInterval ?? 1000 - property int resourceUpdateInterval: Config.dashboard.resourceUpdateInterval ?? 1000 + property int mediaUpdateInterval: GlobalConfig.dashboard.mediaUpdateInterval ?? 1000 + property int resourceUpdateInterval: GlobalConfig.dashboard.resourceUpdateInterval ?? 1000 property int dragThreshold: Config.dashboard.dragThreshold ?? 50 // Dashboard Tabs diff --git a/modules/dashboard/Media.qml b/modules/dashboard/Media.qml index 0a697996..277d12cc 100644 --- a/modules/dashboard/Media.qml +++ b/modules/dashboard/Media.qml @@ -67,7 +67,7 @@ Item { Timer { running: Players.active?.isPlaying ?? false - interval: Config.dashboard.mediaUpdateInterval + interval: GlobalConfig.dashboard.mediaUpdateInterval triggeredOnStart: true repeat: true onTriggered: { @@ -132,12 +132,12 @@ Item { readonly property real value: Math.max(1e-3, Math.min(1, Audio.cava.values[modelData])) readonly property real angle: modelData * 2 * Math.PI / GlobalConfig.services.visualiserBars - readonly property real magnitude: value * Tokens.sizes.dashboard.mediaVisualiserSize + readonly property real magnitude: value * root.Tokens.sizes.dashboard.mediaVisualiserSize readonly property real cos: Math.cos(angle) readonly property real sin: Math.sin(angle) - capStyle: Tokens.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap - strokeWidth: 360 / GlobalConfig.services.visualiserBars - Tokens.spacing.small / 4 + capStyle: root.Tokens.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap + strokeWidth: 360 / GlobalConfig.services.visualiserBars - root.Tokens.spacing.small / 4 strokeColor: Colours.palette.m3primary startX: visualiser.centerX + (visualiser.innerX + strokeWidth / 2) * cos diff --git a/modules/dashboard/Performance.qml b/modules/dashboard/Performance.qml index cfed9296..cfcc78f7 100644 --- a/modules/dashboard/Performance.qml +++ b/modules/dashboard/Performance.qml @@ -705,7 +705,7 @@ Item { property: "slideProgress" from: 0 to: 1 - duration: Config.dashboard.resourceUpdateInterval + duration: GlobalConfig.dashboard.resourceUpdateInterval } Behavior on smoothMax { diff --git a/modules/dashboard/dash/Media.qml b/modules/dashboard/dash/Media.qml index 2dd8a4af..c83efde5 100644 --- a/modules/dashboard/dash/Media.qml +++ b/modules/dashboard/dash/Media.qml @@ -26,7 +26,7 @@ Item { Timer { running: Players.active?.isPlaying ?? false - interval: Config.dashboard.mediaUpdateInterval + interval: GlobalConfig.dashboard.mediaUpdateInterval triggeredOnStart: true repeat: true onTriggered: Players.active?.positionChanged() @@ -42,16 +42,16 @@ Item { ShapePath { fillColor: "transparent" strokeColor: Colours.layer(Colours.palette.m3surfaceContainerHigh, 2) - strokeWidth: Tokens.sizes.dashboard.mediaProgressThickness - capStyle: Tokens.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap + strokeWidth: root.Tokens.sizes.dashboard.mediaProgressThickness + capStyle: root.Tokens.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap PathAngleArc { centerX: cover.x + cover.width / 2 centerY: cover.y + cover.height / 2 - radiusX: (cover.width + Tokens.sizes.dashboard.mediaProgressThickness) / 2 + Tokens.spacing.small - radiusY: (cover.height + Tokens.sizes.dashboard.mediaProgressThickness) / 2 + Tokens.spacing.small - startAngle: -90 - Tokens.sizes.dashboard.mediaProgressSweep / 2 - sweepAngle: Tokens.sizes.dashboard.mediaProgressSweep + radiusX: (cover.width + root.Tokens.sizes.dashboard.mediaProgressThickness) / 2 + root.Tokens.spacing.small + radiusY: (cover.height + root.Tokens.sizes.dashboard.mediaProgressThickness) / 2 + root.Tokens.spacing.small + startAngle: -90 - root.Tokens.sizes.dashboard.mediaProgressSweep / 2 + sweepAngle: root.Tokens.sizes.dashboard.mediaProgressSweep } Behavior on strokeColor { @@ -62,16 +62,16 @@ Item { ShapePath { fillColor: "transparent" strokeColor: Colours.palette.m3primary - strokeWidth: Tokens.sizes.dashboard.mediaProgressThickness - capStyle: Tokens.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap + strokeWidth: root.Tokens.sizes.dashboard.mediaProgressThickness + capStyle: root.Tokens.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap PathAngleArc { centerX: cover.x + cover.width / 2 centerY: cover.y + cover.height / 2 - radiusX: (cover.width + Tokens.sizes.dashboard.mediaProgressThickness) / 2 + Tokens.spacing.small - radiusY: (cover.height + Tokens.sizes.dashboard.mediaProgressThickness) / 2 + Tokens.spacing.small - startAngle: -90 - Tokens.sizes.dashboard.mediaProgressSweep / 2 - sweepAngle: Tokens.sizes.dashboard.mediaProgressSweep * root.playerProgress + radiusX: (cover.width + root.Tokens.sizes.dashboard.mediaProgressThickness) / 2 + root.Tokens.spacing.small + radiusY: (cover.height + root.Tokens.sizes.dashboard.mediaProgressThickness) / 2 + root.Tokens.spacing.small + startAngle: -90 - root.Tokens.sizes.dashboard.mediaProgressSweep / 2 + sweepAngle: root.Tokens.sizes.dashboard.mediaProgressSweep * root.playerProgress } Behavior on strokeColor { diff --git a/modules/drawers/ContentWindow.qml b/modules/drawers/ContentWindow.qml index a321543b..328d13ea 100644 --- a/modules/drawers/ContentWindow.qml +++ b/modules/drawers/ContentWindow.qml @@ -95,7 +95,7 @@ StyledWindow { HyprlandFocusGrab { id: focusGrab - active: (visibilities.launcher && Config.launcher.enabled) || (visibilities.session && Config.session.enabled) || (visibilities.sidebar && Config.sidebar.enabled) || (!Config.dashboard.showOnHover && visibilities.dashboard && Config.dashboard.enabled) || (panels.popouts.currentName.startsWith("traymenu") && (panels.popouts.current as StackView)?.depth > 1) + active: (visibilities.launcher && root.contentItem.Config.launcher.enabled) || (visibilities.session && root.contentItem.Config.session.enabled) || (visibilities.sidebar && root.contentItem.Config.sidebar.enabled) || (!root.contentItem.Config.dashboard.showOnHover && visibilities.dashboard && root.contentItem.Config.dashboard.enabled) || (panels.popouts.currentName.startsWith("traymenu") && (panels.popouts.current as StackView)?.depth > 1) windows: [root] onCleared: { visibilities.launcher = false; diff --git a/modules/drawers/Drawers.qml b/modules/drawers/Drawers.qml index d2cd05f9..1bfde878 100644 --- a/modules/drawers/Drawers.qml +++ b/modules/drawers/Drawers.qml @@ -16,7 +16,6 @@ Variants { Exclusions { screen: scope.modelData bar: content.bar - borderThickness: Config.border.thickness } ContentWindow { diff --git a/modules/drawers/Exclusions.qml b/modules/drawers/Exclusions.qml index 87610ee6..fe72730c 100644 --- a/modules/drawers/Exclusions.qml +++ b/modules/drawers/Exclusions.qml @@ -2,6 +2,7 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell +import Caelestia.Config import qs.components.containers import qs.modules.bar as Bar @@ -10,7 +11,6 @@ Scope { required property ShellScreen screen required property Bar.BarWrapper bar - required property real borderThickness ExclusionZone { anchors.left: true @@ -32,7 +32,7 @@ Scope { component ExclusionZone: StyledWindow { screen: root.screen name: "border-exclusion" - exclusiveZone: root.borderThickness + exclusiveZone: contentItem.Config.border.thickness mask: Region {} implicitWidth: 1 implicitHeight: 1 diff --git a/modules/lock/Center.qml b/modules/lock/Center.qml index 712e6709..349f44d2 100644 --- a/modules/lock/Center.qml +++ b/modules/lock/Center.qml @@ -160,13 +160,13 @@ ColumnLayout { anchors.centerIn: parent animate: true text: { - if (root.lock.pam.fprint.tries >= Config.lock.maxFprintTries) + if (root.lock.pam.fprint.tries >= GlobalConfig.lock.maxFprintTries) return "fingerprint_off"; if (root.lock.pam.fprint.active) return "fingerprint"; return "lock"; } - color: root.lock.pam.fprint.tries >= Config.lock.maxFprintTries ? Colours.palette.m3error : Colours.palette.m3onSurface + color: root.lock.pam.fprint.tries >= GlobalConfig.lock.maxFprintTries ? Colours.palette.m3error : Colours.palette.m3onSurface opacity: root.lock.pam.passwd.active ? 0 : 1 Behavior on opacity { diff --git a/modules/lock/LockSurface.qml b/modules/lock/LockSurface.qml index 23bfd65f..f08b528d 100644 --- a/modules/lock/LockSurface.qml +++ b/modules/lock/LockSurface.qml @@ -142,19 +142,19 @@ WlSessionLockSurface { Anim { target: lockBg property: "radius" - to: Tokens.rounding.large * 1.5 + to: lockContent.Tokens.rounding.large * 1.5 } Anim { target: lockContent property: "implicitWidth" - to: (root.screen?.height ?? 0) * Tokens.sizes.lock.heightMult * Tokens.sizes.lock.ratio + to: (root.screen?.height ?? 0) * lockContent.Tokens.sizes.lock.heightMult * lockContent.Tokens.sizes.lock.ratio duration: Tokens.anim.durations.expressiveDefaultSpatial easing: Tokens.anim.expressiveDefaultSpatial } Anim { target: lockContent property: "implicitHeight" - to: (root.screen?.height ?? 0) * Tokens.sizes.lock.heightMult + to: (root.screen?.height ?? 0) * lockContent.Tokens.sizes.lock.heightMult duration: Tokens.anim.durations.expressiveDefaultSpatial easing: Tokens.anim.expressiveDefaultSpatial } diff --git a/modules/lock/NotifGroup.qml b/modules/lock/NotifGroup.qml index 07a6a1ca..50ea168d 100644 --- a/modules/lock/NotifGroup.qml +++ b/modules/lock/NotifGroup.qml @@ -219,7 +219,7 @@ StyledRect { Repeater { model: ScriptModel { - values: root.notifs.slice(0, Config.notifs.groupPreviewNum) + values: root.notifs.slice(0, root.Config.notifs.groupPreviewNum) } NotifLine { @@ -282,7 +282,7 @@ StyledRect { sourceComponent: ColumnLayout { Repeater { model: ScriptModel { - values: root.notifs.slice(Config.notifs.groupPreviewNum) + values: root.notifs.slice(root.Config.notifs.groupPreviewNum) } NotifLine {} diff --git a/modules/notifications/Notification.qml b/modules/notifications/Notification.qml index 24c0c958..55dea458 100644 --- a/modules/notifications/Notification.qml +++ b/modules/notifications/Notification.qml @@ -207,9 +207,9 @@ StyledRect { PathAngleArc { id: progressArc - radiusX: progressIndicator.width / 2 - Tokens.padding.small / 2 + radiusX: progressIndicator.width / 2 - root.Tokens.padding.small / 2 centerX: progressIndicator.width / 2 - radiusY: progressIndicator.height / 2 - Tokens.padding.small / 2 + radiusY: progressIndicator.height / 2 - root.Tokens.padding.small / 2 centerY: progressIndicator.height / 2 startAngle: -90 diff --git a/modules/osd/Wrapper.qml b/modules/osd/Wrapper.qml index 7884c319..2dac5222 100644 --- a/modules/osd/Wrapper.qml +++ b/modules/osd/Wrapper.qml @@ -87,7 +87,7 @@ Item { Timer { id: timer - interval: Config.osd.hideDelay + interval: root.Config.osd.hideDelay onTriggered: { if (!root.hovered) root.visibilities.osd = false; diff --git a/modules/sidebar/NotifGroupList.qml b/modules/sidebar/NotifGroupList.qml index 93506856..7b046391 100644 --- a/modules/sidebar/NotifGroupList.qml +++ b/modules/sidebar/NotifGroupList.qml @@ -42,7 +42,7 @@ LazyListView { let count = 0; let i = 0; - const previewNum = Config.notifs.groupPreviewNum; + const previewNum = root.Config.notifs.groupPreviewNum; while (i < root.notifs.length && count < previewNum) { if (!(root.notifs[i]?.closed ?? true)) count++; diff --git a/plugin/src/Caelestia/Config/dashboardconfig.hpp b/plugin/src/Caelestia/Config/dashboardconfig.hpp index d4b0ba89..cb872d1d 100644 --- a/plugin/src/Caelestia/Config/dashboardconfig.hpp +++ b/plugin/src/Caelestia/Config/dashboardconfig.hpp @@ -30,8 +30,8 @@ class DashboardConfig : public ConfigObject { CONFIG_PROPERTY(bool, showMedia, true) CONFIG_PROPERTY(bool, showPerformance, true) CONFIG_PROPERTY(bool, showWeather, true) - CONFIG_PROPERTY(int, mediaUpdateInterval, 500) - CONFIG_PROPERTY(int, resourceUpdateInterval, 1000) + CONFIG_GLOBAL_PROPERTY(int, mediaUpdateInterval, 500) + CONFIG_GLOBAL_PROPERTY(int, resourceUpdateInterval, 1000) CONFIG_PROPERTY(int, dragThreshold, 50) CONFIG_SUBOBJECT(DashboardPerformance, performance) diff --git a/services/NetworkUsage.qml b/services/NetworkUsage.qml index a6598713..6c4dc8d2 100644 --- a/services/NetworkUsage.qml +++ b/services/NetworkUsage.qml @@ -155,7 +155,7 @@ Singleton { } Timer { - interval: Config.dashboard.resourceUpdateInterval + interval: GlobalConfig.dashboard.resourceUpdateInterval running: root.refCount > 0 repeat: true triggeredOnStart: true diff --git a/services/SystemUsage.qml b/services/SystemUsage.qml index d2b19075..15dda611 100644 --- a/services/SystemUsage.qml +++ b/services/SystemUsage.qml @@ -80,7 +80,7 @@ Singleton { Timer { running: root.refCount > 0 - interval: Config.dashboard.resourceUpdateInterval + interval: GlobalConfig.dashboard.resourceUpdateInterval repeat: true triggeredOnStart: true onTriggered: { From 16a77f0df995aa69ad0a893459c398eaa611f0c1 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Mon, 13 Apr 2026 16:42:38 +1000 Subject: [PATCH 73/81] chore: remove unused import --- modules/drawers/Drawers.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/drawers/Drawers.qml b/modules/drawers/Drawers.qml index 1bfde878..aad8f9f4 100644 --- a/modules/drawers/Drawers.qml +++ b/modules/drawers/Drawers.qml @@ -2,7 +2,6 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell -import Caelestia.Config import qs.services Variants { From 3cffc1ff944adbb1beeaf2e0c8bf8ed88aa0175f Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Mon, 13 Apr 2026 16:52:36 +1000 Subject: [PATCH 74/81] fix: even MORE non global access --- modules/bar/components/workspaces/SpecialWorkspaces.qml | 6 +++--- modules/utilities/toasts/Toasts.qml | 2 +- plugin/src/Caelestia/Config/barconfig.hpp | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/bar/components/workspaces/SpecialWorkspaces.qml b/modules/bar/components/workspaces/SpecialWorkspaces.qml index cafecb7b..f45191f6 100644 --- a/modules/bar/components/workspaces/SpecialWorkspaces.qml +++ b/modules/bar/components/workspaces/SpecialWorkspaces.qml @@ -263,7 +263,7 @@ Item { function onLastIpcObjectChanged(): void { if (ws.modelData) - ws.hasWindows = Config.bar.workspaces.showWindowsOnSpecialWorkspaces && ws.modelData.lastIpcObject.windows > 0; + ws.hasWindows = root.Config.bar.workspaces.showWindowsOnSpecialWorkspaces && ws.modelData.lastIpcObject.windows > 0; } target: ws.modelData @@ -272,10 +272,10 @@ Item { Connections { function onShowWindowsOnSpecialWorkspacesChanged(): void { if (ws.modelData) - ws.hasWindows = Config.bar.workspaces.showWindowsOnSpecialWorkspaces && ws.modelData.lastIpcObject.windows > 0; + ws.hasWindows = root.Config.bar.workspaces.showWindowsOnSpecialWorkspaces && ws.modelData.lastIpcObject.windows > 0; } - target: Config.bar.workspaces + target: root.Config.bar.workspaces } Loader { diff --git a/modules/utilities/toasts/Toasts.qml b/modules/utilities/toasts/Toasts.qml index bceb4ea6..cce8b9f2 100644 --- a/modules/utilities/toasts/Toasts.qml +++ b/modules/utilities/toasts/Toasts.qml @@ -47,7 +47,7 @@ Item { toasts.push(toast); if (!toast.closed) { count++; - if (count > Config.utilities.maxToasts) + if (count > root.Config.utilities.maxToasts) break; } } diff --git a/plugin/src/Caelestia/Config/barconfig.hpp b/plugin/src/Caelestia/Config/barconfig.hpp index 8def7921..6397064f 100644 --- a/plugin/src/Caelestia/Config/barconfig.hpp +++ b/plugin/src/Caelestia/Config/barconfig.hpp @@ -43,7 +43,7 @@ class BarWorkspaces : public ConfigObject { CONFIG_PROPERTY(bool, occupiedBg, false) CONFIG_PROPERTY(bool, showWindows, true) CONFIG_PROPERTY(bool, showWindowsOnSpecialWorkspaces, true) - CONFIG_PROPERTY(int, maxWindowIcons, 0) + CONFIG_PROPERTY(int, maxWindowIcons, 5) CONFIG_PROPERTY(bool, activeTrail, false) CONFIG_GLOBAL_PROPERTY(bool, perMonitorWorkspaces, true) CONFIG_PROPERTY(QString, label, QStringLiteral(" ")) From 0571adc80cd547d1c3b5a2c3c61b57bfe051276e Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Mon, 13 Apr 2026 18:11:54 +1000 Subject: [PATCH 75/81] fix: add back list option defaults --- modules/utilities/cards/Toggles.qml | 2 +- plugin/src/Caelestia/Config/barconfig.hpp | 29 ++++-- plugin/src/Caelestia/Config/configobject.hpp | 11 +++ plugin/src/Caelestia/Config/generalconfig.hpp | 50 ++++++++-- .../src/Caelestia/Config/launcherconfig.hpp | 91 ++++++++++++++++++- plugin/src/Caelestia/Config/serviceconfig.hpp | 19 +++- plugin/src/Caelestia/Config/sessionconfig.hpp | 18 ++-- plugin/src/Caelestia/Config/userpaths.hpp | 16 ++-- .../src/Caelestia/Config/utilitiesconfig.hpp | 15 ++- 9 files changed, 213 insertions(+), 38 deletions(-) diff --git a/modules/utilities/cards/Toggles.qml b/modules/utilities/cards/Toggles.qml index b2e14567..9cdf4291 100644 --- a/modules/utilities/cards/Toggles.qml +++ b/modules/utilities/cards/Toggles.qml @@ -19,7 +19,7 @@ StyledRect { const seenIds = new Set(); return Config.utilities.quickToggles.filter(item => { - if (!item.enabled) + if (!(item.enabled ?? true)) return false; if (seenIds.has(item.id)) { diff --git a/plugin/src/Caelestia/Config/barconfig.hpp b/plugin/src/Caelestia/Config/barconfig.hpp index 6397064f..43d43205 100644 --- a/plugin/src/Caelestia/Config/barconfig.hpp +++ b/plugin/src/Caelestia/Config/barconfig.hpp @@ -8,6 +8,8 @@ namespace caelestia::config { +using Qt::StringLiterals::operator""_s; + class BarScrollActions : public ConfigObject { Q_OBJECT QML_ANONYMOUS @@ -46,12 +48,16 @@ class BarWorkspaces : public ConfigObject { CONFIG_PROPERTY(int, maxWindowIcons, 5) CONFIG_PROPERTY(bool, activeTrail, false) CONFIG_GLOBAL_PROPERTY(bool, perMonitorWorkspaces, true) - CONFIG_PROPERTY(QString, label, QStringLiteral(" ")) - CONFIG_PROPERTY(QString, occupiedLabel, QStringLiteral("\U000f06af")) - CONFIG_PROPERTY(QString, activeLabel, QStringLiteral("\U000f06af")) - CONFIG_PROPERTY(QString, capitalisation, QStringLiteral("preserve")) + CONFIG_PROPERTY(QString, label, u" "_s) + CONFIG_PROPERTY(QString, occupiedLabel, u"󰮯"_s) + CONFIG_PROPERTY(QString, activeLabel, u"󰮯"_s) + CONFIG_PROPERTY(QString, capitalisation, u"preserve"_s) CONFIG_GLOBAL_PROPERTY(QVariantList, specialWorkspaceIcons) - CONFIG_GLOBAL_PROPERTY(QVariantList, windowIcons) + CONFIG_GLOBAL_PROPERTY(QVariantList, windowIcons, + { vmap({ + { u"regex"_s, u"steam(_app_(default|[0-9]+))?"_s }, + { u"icon"_s, u"sports_esports"_s }, + }) }) public: explicit BarWorkspaces(QObject* parent = nullptr) @@ -131,7 +137,18 @@ class BarConfig : public ConfigObject { CONFIG_SUBOBJECT(BarTray, tray) CONFIG_SUBOBJECT(BarStatus, status) CONFIG_SUBOBJECT(BarClock, clock) - CONFIG_PROPERTY(QVariantList, entries) + CONFIG_PROPERTY(QVariantList, entries, + { + vmap({ { u"id"_s, u"logo"_s }, { u"enabled"_s, true } }), + vmap({ { u"id"_s, u"workspaces"_s }, { u"enabled"_s, true } }), + vmap({ { u"id"_s, u"spacer"_s }, { u"enabled"_s, true } }), + vmap({ { u"id"_s, u"activeWindow"_s }, { u"enabled"_s, true } }), + vmap({ { u"id"_s, u"spacer"_s }, { u"enabled"_s, true } }), + vmap({ { u"id"_s, u"tray"_s }, { u"enabled"_s, true } }), + vmap({ { u"id"_s, u"clock"_s }, { u"enabled"_s, true } }), + vmap({ { u"id"_s, u"statusIcons"_s }, { u"enabled"_s, true } }), + vmap({ { u"id"_s, u"power"_s }, { u"enabled"_s, true } }), + }) CONFIG_PROPERTY(QStringList, excludedScreens) public: diff --git a/plugin/src/Caelestia/Config/configobject.hpp b/plugin/src/Caelestia/Config/configobject.hpp index c35d812c..c4f4428b 100644 --- a/plugin/src/Caelestia/Config/configobject.hpp +++ b/plugin/src/Caelestia/Config/configobject.hpp @@ -9,6 +9,17 @@ #include #include +namespace caelestia::config { + +inline QVariantMap vmap(std::initializer_list> entries) { + QVariantMap map; + for (const auto& [key, value] : entries) + map.insert(std::move(key), std::move(value)); + return map; +} + +} // namespace caelestia::config + // Declares a serialized config property with getter, setter (change-detected), signal, and member. #define CONFIG_PROPERTY(Type, name, ...) \ Q_PROPERTY(Type name READ name WRITE set_##name NOTIFY name##Changed) \ diff --git a/plugin/src/Caelestia/Config/generalconfig.hpp b/plugin/src/Caelestia/Config/generalconfig.hpp index f84cfa34..73a4915d 100644 --- a/plugin/src/Caelestia/Config/generalconfig.hpp +++ b/plugin/src/Caelestia/Config/generalconfig.hpp @@ -8,14 +8,16 @@ namespace caelestia::config { +using Qt::StringLiterals::operator""_s; + class GeneralApps : public ConfigObject { Q_OBJECT QML_ANONYMOUS - CONFIG_GLOBAL_PROPERTY(QStringList, terminal, { QStringLiteral("foot") }) - CONFIG_GLOBAL_PROPERTY(QStringList, audio, { QStringLiteral("pavucontrol") }) - CONFIG_GLOBAL_PROPERTY(QStringList, playback, { QStringLiteral("mpv") }) - CONFIG_GLOBAL_PROPERTY(QStringList, explorer, { QStringLiteral("thunar") }) + CONFIG_GLOBAL_PROPERTY(QStringList, terminal, { u"foot"_s }) + CONFIG_GLOBAL_PROPERTY(QStringList, audio, { u"pavucontrol"_s }) + CONFIG_GLOBAL_PROPERTY(QStringList, playback, { u"mpv"_s }) + CONFIG_GLOBAL_PROPERTY(QStringList, explorer, { u"thunar"_s }) public: explicit GeneralApps(QObject* parent = nullptr) @@ -28,7 +30,22 @@ class GeneralIdle : public ConfigObject { CONFIG_GLOBAL_PROPERTY(bool, lockBeforeSleep, true) CONFIG_GLOBAL_PROPERTY(bool, inhibitWhenAudio, true) - CONFIG_GLOBAL_PROPERTY(QVariantList, timeouts) + CONFIG_GLOBAL_PROPERTY(QVariantList, timeouts, + { + vmap({ + { u"timeout"_s, 180 }, + { u"idleAction"_s, u"lock"_s }, + }), + vmap({ + { u"timeout"_s, 300 }, + { u"idleAction"_s, u"dpms off"_s }, + { u"returnAction"_s, u"dpms on"_s }, + }), + vmap({ + { u"timeout"_s, 600 }, + { u"idleAction"_s, QStringList{ u"systemctl"_s, u"suspend-then-hibernate"_s } }, + }), + }) public: explicit GeneralIdle(QObject* parent = nullptr) @@ -39,7 +56,28 @@ class GeneralBattery : public ConfigObject { Q_OBJECT QML_ANONYMOUS - CONFIG_GLOBAL_PROPERTY(QVariantList, warnLevels) + CONFIG_GLOBAL_PROPERTY(QVariantList, warnLevels, + { + vmap({ + { u"level"_s, 20 }, + { u"title"_s, u"Low battery"_s }, + { u"message"_s, u"You might want to plug in a charger"_s }, + { u"icon"_s, u"battery_android_frame_2"_s }, + }), + vmap({ + { u"level"_s, 10 }, + { u"title"_s, u"Did you see the previous message?"_s }, + { u"message"_s, u"You should probably plug in a charger now"_s }, + { u"icon"_s, u"battery_android_frame_1"_s }, + }), + vmap({ + { u"level"_s, 5 }, + { u"title"_s, u"Critical battery level"_s }, + { u"message"_s, u"PLUG THE CHARGER RIGHT NOW!!"_s }, + { u"icon"_s, u"battery_android_alert"_s }, + { u"critical"_s, true }, + }), + }) CONFIG_GLOBAL_PROPERTY(int, criticalLevel, 3) public: diff --git a/plugin/src/Caelestia/Config/launcherconfig.hpp b/plugin/src/Caelestia/Config/launcherconfig.hpp index b0c8d06b..049e213a 100644 --- a/plugin/src/Caelestia/Config/launcherconfig.hpp +++ b/plugin/src/Caelestia/Config/launcherconfig.hpp @@ -8,6 +8,8 @@ namespace caelestia::config { +using Qt::StringLiterals::operator""_s; + class LauncherUseFuzzy : public ConfigObject { Q_OBJECT QML_ANONYMOUS @@ -31,15 +33,98 @@ class LauncherConfig : public ConfigObject { CONFIG_PROPERTY(bool, showOnHover, false) CONFIG_PROPERTY(int, maxShown, 7) CONFIG_PROPERTY(int, maxWallpapers, 9) - CONFIG_GLOBAL_PROPERTY(QString, specialPrefix, QStringLiteral("@")) - CONFIG_GLOBAL_PROPERTY(QString, actionPrefix, QStringLiteral(">")) + CONFIG_GLOBAL_PROPERTY(QString, specialPrefix, u"@"_s) + CONFIG_GLOBAL_PROPERTY(QString, actionPrefix, u">"_s) CONFIG_GLOBAL_PROPERTY(bool, enableDangerousActions, false) CONFIG_PROPERTY(int, dragThreshold, 50) CONFIG_GLOBAL_PROPERTY(bool, vimKeybinds, false) CONFIG_GLOBAL_PROPERTY(QStringList, favouriteApps) CONFIG_GLOBAL_PROPERTY(QStringList, hiddenApps) CONFIG_SUBOBJECT(LauncherUseFuzzy, useFuzzy) - CONFIG_GLOBAL_PROPERTY(QVariantList, actions) + CONFIG_GLOBAL_PROPERTY(QVariantList, actions, + { + vmap({ + { u"name"_s, u"Calculator"_s }, + { u"icon"_s, u"calculate"_s }, + { u"description"_s, u"Do simple math equations (powered by Qalc)"_s }, + { u"command"_s, QStringList{ u"autocomplete"_s, u"calc"_s } }, + }), + vmap({ + { u"name"_s, u"Scheme"_s }, + { u"icon"_s, u"palette"_s }, + { u"description"_s, u"Change the current colour scheme"_s }, + { u"command"_s, QStringList{ u"autocomplete"_s, u"scheme"_s } }, + }), + vmap({ + { u"name"_s, u"Wallpaper"_s }, + { u"icon"_s, u"image"_s }, + { u"description"_s, u"Change the current wallpaper"_s }, + { u"command"_s, QStringList{ u"autocomplete"_s, u"wallpaper"_s } }, + }), + vmap({ + { u"name"_s, u"Variant"_s }, + { u"icon"_s, u"colors"_s }, + { u"description"_s, u"Change the current scheme variant"_s }, + { u"command"_s, QStringList{ u"autocomplete"_s, u"variant"_s } }, + }), + vmap({ + { u"name"_s, u"Random"_s }, + { u"icon"_s, u"casino"_s }, + { u"description"_s, u"Switch to a random wallpaper"_s }, + { u"command"_s, QStringList{ u"caelestia"_s, u"wallpaper"_s, u"-r"_s } }, + }), + vmap({ + { u"name"_s, u"Light"_s }, + { u"icon"_s, u"light_mode"_s }, + { u"description"_s, u"Change the scheme to light mode"_s }, + { u"command"_s, QStringList{ u"setMode"_s, u"light"_s } }, + }), + vmap({ + { u"name"_s, u"Dark"_s }, + { u"icon"_s, u"dark_mode"_s }, + { u"description"_s, u"Change the scheme to dark mode"_s }, + { u"command"_s, QStringList{ u"setMode"_s, u"dark"_s } }, + }), + vmap({ + { u"name"_s, u"Shutdown"_s }, + { u"icon"_s, u"power_settings_new"_s }, + { u"description"_s, u"Shutdown the system"_s }, + { u"command"_s, QStringList{ u"systemctl"_s, u"poweroff"_s } }, + { u"dangerous"_s, true }, + }), + vmap({ + { u"name"_s, u"Reboot"_s }, + { u"icon"_s, u"cached"_s }, + { u"description"_s, u"Reboot the system"_s }, + { u"command"_s, QStringList{ u"systemctl"_s, u"reboot"_s } }, + { u"dangerous"_s, true }, + }), + vmap({ + { u"name"_s, u"Logout"_s }, + { u"icon"_s, u"exit_to_app"_s }, + { u"description"_s, u"Log out of the current session"_s }, + { u"command"_s, QStringList{ u"loginctl"_s, u"terminate-user"_s, u""_s } }, + { u"dangerous"_s, true }, + }), + vmap({ + { u"name"_s, u"Lock"_s }, + { u"icon"_s, u"lock"_s }, + { u"description"_s, u"Lock the current session"_s }, + { u"command"_s, QStringList{ u"loginctl"_s, u"lock-session"_s } }, + }), + vmap({ + { u"name"_s, u"Sleep"_s }, + { u"icon"_s, u"bedtime"_s }, + { u"description"_s, u"Suspend then hibernate"_s }, + { u"command"_s, QStringList{ u"systemctl"_s, u"suspend-then-hibernate"_s } }, + }), + vmap({ + { u"name"_s, u"Settings"_s }, + { u"icon"_s, u"settings"_s }, + { u"description"_s, u"Configure the shell"_s }, + { u"command"_s, QStringList{ u"caelestia"_s, u"shell"_s, u"controlCenter"_s, u"open"_s } }, + }), + }) public: explicit LauncherConfig(QObject* parent = nullptr) diff --git a/plugin/src/Caelestia/Config/serviceconfig.hpp b/plugin/src/Caelestia/Config/serviceconfig.hpp index 439092af..b97c69c1 100644 --- a/plugin/src/Caelestia/Config/serviceconfig.hpp +++ b/plugin/src/Caelestia/Config/serviceconfig.hpp @@ -7,24 +7,33 @@ namespace caelestia::config { +using Qt::StringLiterals::operator""_s; + class ServiceConfig : public ConfigObject { Q_OBJECT QML_ANONYMOUS CONFIG_GLOBAL_PROPERTY(QString, weatherLocation) - CONFIG_GLOBAL_PROPERTY(bool, useFahrenheit, false) + // Guess based on locale + CONFIG_GLOBAL_PROPERTY(bool, useFahrenheit, + QLocale().measurementSystem() == QLocale::ImperialUSSystem || + QLocale().measurementSystem() == QLocale::ImperialUKSystem) + // This is always false by default cause apparently even imperial system users don't use it for perf temps? CONFIG_GLOBAL_PROPERTY(bool, useFahrenheitPerformance, false) - CONFIG_GLOBAL_PROPERTY(bool, useTwelveHourClock, false) + // Attempt to guess based on locale + CONFIG_GLOBAL_PROPERTY( + bool, useTwelveHourClock, QLocale().timeFormat(QLocale::ShortFormat).toLower().contains(u"a"_s)) CONFIG_GLOBAL_PROPERTY(QString, gpuType) CONFIG_GLOBAL_PROPERTY(int, visualiserBars, 45) CONFIG_GLOBAL_PROPERTY(qreal, audioIncrement, 0.1) CONFIG_GLOBAL_PROPERTY(qreal, brightnessIncrement, 0.1) CONFIG_GLOBAL_PROPERTY(qreal, maxVolume, 1.0) CONFIG_GLOBAL_PROPERTY(bool, smartScheme, true) - CONFIG_GLOBAL_PROPERTY(QString, defaultPlayer, QStringLiteral("Spotify")) - CONFIG_GLOBAL_PROPERTY(QVariantList, playerAliases) + CONFIG_GLOBAL_PROPERTY(QString, defaultPlayer, u"Spotify"_s) + CONFIG_GLOBAL_PROPERTY(QVariantList, playerAliases, + { vmap({ { u"from"_s, u"com.github.th_ch.youtube_music"_s }, { u"to"_s, u"YT Music"_s } }) }) CONFIG_GLOBAL_PROPERTY(bool, showLyrics, false) - CONFIG_GLOBAL_PROPERTY(QString, lyricsBackend, QStringLiteral("Auto")) + CONFIG_GLOBAL_PROPERTY(QString, lyricsBackend, u"Auto"_s) public: explicit ServiceConfig(QObject* parent = nullptr) diff --git a/plugin/src/Caelestia/Config/sessionconfig.hpp b/plugin/src/Caelestia/Config/sessionconfig.hpp index 629b3b6e..7e7548f1 100644 --- a/plugin/src/Caelestia/Config/sessionconfig.hpp +++ b/plugin/src/Caelestia/Config/sessionconfig.hpp @@ -7,14 +7,16 @@ namespace caelestia::config { +using Qt::StringLiterals::operator""_s; + class SessionIcons : public ConfigObject { Q_OBJECT QML_ANONYMOUS - CONFIG_PROPERTY(QString, logout, QStringLiteral("logout")) - CONFIG_PROPERTY(QString, shutdown, QStringLiteral("power_settings_new")) - CONFIG_PROPERTY(QString, hibernate, QStringLiteral("downloading")) - CONFIG_PROPERTY(QString, reboot, QStringLiteral("cached")) + CONFIG_PROPERTY(QString, logout, u"logout"_s) + CONFIG_PROPERTY(QString, shutdown, u"power_settings_new"_s) + CONFIG_PROPERTY(QString, hibernate, u"downloading"_s) + CONFIG_PROPERTY(QString, reboot, u"cached"_s) public: explicit SessionIcons(QObject* parent = nullptr) @@ -25,10 +27,10 @@ class SessionCommands : public ConfigObject { Q_OBJECT QML_ANONYMOUS - CONFIG_PROPERTY(QStringList, logout, { QStringLiteral("loginctl"), QStringLiteral("terminate-user"), QString() }) - CONFIG_PROPERTY(QStringList, shutdown, { QStringLiteral("systemctl"), QStringLiteral("poweroff") }) - CONFIG_PROPERTY(QStringList, hibernate, { QStringLiteral("systemctl"), QStringLiteral("hibernate") }) - CONFIG_PROPERTY(QStringList, reboot, { QStringLiteral("systemctl"), QStringLiteral("reboot") }) + CONFIG_PROPERTY(QStringList, logout, { u"loginctl"_s, u"terminate-user"_s, u""_s }) + CONFIG_PROPERTY(QStringList, shutdown, { u"systemctl"_s, u"poweroff"_s }) + CONFIG_PROPERTY(QStringList, hibernate, { u"systemctl"_s, u"hibernate"_s }) + CONFIG_PROPERTY(QStringList, reboot, { u"systemctl"_s, u"reboot"_s }) public: explicit SessionCommands(QObject* parent = nullptr) diff --git a/plugin/src/Caelestia/Config/userpaths.hpp b/plugin/src/Caelestia/Config/userpaths.hpp index f0d0fb2e..da6973a7 100644 --- a/plugin/src/Caelestia/Config/userpaths.hpp +++ b/plugin/src/Caelestia/Config/userpaths.hpp @@ -8,17 +8,19 @@ namespace caelestia::config { +using Qt::StringLiterals::operator""_s; + class UserPaths : public ConfigObject { Q_OBJECT QML_ANONYMOUS - CONFIG_GLOBAL_PROPERTY(QString, wallpaperDir, - QStandardPaths::writableLocation(QStandardPaths::PicturesLocation) + QStringLiteral("/Wallpapers")) - CONFIG_GLOBAL_PROPERTY(QString, lyricsDir, QDir::homePath() + QStringLiteral("/Music/lyrics/")) - CONFIG_PROPERTY(QString, sessionGif, QStringLiteral("root:/assets/kurukuru.gif")) - CONFIG_PROPERTY(QString, mediaGif, QStringLiteral("root:/assets/bongocat.gif")) - CONFIG_PROPERTY(QString, noNotifsPic, QStringLiteral("root:/assets/dino.png")) - CONFIG_PROPERTY(QString, lockNoNotifsPic, QStringLiteral("root:/assets/dino.png")) + CONFIG_GLOBAL_PROPERTY( + QString, wallpaperDir, QStandardPaths::writableLocation(QStandardPaths::PicturesLocation) + u"/Wallpapers"_s) + CONFIG_GLOBAL_PROPERTY(QString, lyricsDir, QDir::homePath() + u"/Music/lyrics/"_s) + CONFIG_PROPERTY(QString, sessionGif, u"root:/assets/kurukuru.gif"_s) + CONFIG_PROPERTY(QString, mediaGif, u"root:/assets/bongocat.gif"_s) + CONFIG_PROPERTY(QString, noNotifsPic, u"root:/assets/dino.png"_s) + CONFIG_PROPERTY(QString, lockNoNotifsPic, u"root:/assets/dino.png"_s) public: explicit UserPaths(QObject* parent = nullptr) diff --git a/plugin/src/Caelestia/Config/utilitiesconfig.hpp b/plugin/src/Caelestia/Config/utilitiesconfig.hpp index cabb877e..3e5625bb 100644 --- a/plugin/src/Caelestia/Config/utilitiesconfig.hpp +++ b/plugin/src/Caelestia/Config/utilitiesconfig.hpp @@ -7,11 +7,13 @@ namespace caelestia::config { +using Qt::StringLiterals::operator""_s; + class UtilitiesToasts : public ConfigObject { Q_OBJECT QML_ANONYMOUS - CONFIG_PROPERTY(QString, fullscreen, QStringLiteral("off")) + CONFIG_PROPERTY(QString, fullscreen, u"off"_s) CONFIG_GLOBAL_PROPERTY(bool, configLoaded, true) CONFIG_GLOBAL_PROPERTY(bool, chargingChanged, true) CONFIG_GLOBAL_PROPERTY(bool, gameModeChanged, true) @@ -50,7 +52,16 @@ class UtilitiesConfig : public ConfigObject { CONFIG_PROPERTY(int, maxToasts, 4) CONFIG_SUBOBJECT(UtilitiesToasts, toasts) CONFIG_SUBOBJECT(UtilitiesVpn, vpn) - CONFIG_PROPERTY(QVariantList, quickToggles) + CONFIG_PROPERTY(QVariantList, quickToggles, + { + vmap({ { u"id"_s, u"wifi"_s }, { u"enabled"_s, true } }), + vmap({ { u"id"_s, u"bluetooth"_s }, { u"enabled"_s, true } }), + vmap({ { u"id"_s, u"mic"_s }, { u"enabled"_s, true } }), + vmap({ { u"id"_s, u"settings"_s }, { u"enabled"_s, true } }), + vmap({ { u"id"_s, u"gameMode"_s }, { u"enabled"_s, true } }), + vmap({ { u"id"_s, u"dnd"_s }, { u"enabled"_s, true } }), + vmap({ { u"id"_s, u"vpn"_s }, { u"enabled"_s, false } }), + }) public: explicit UtilitiesConfig(QObject* parent = nullptr) From 982bb9759af532cb9a73fc5e29f981c4116fed30 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Mon, 13 Apr 2026 18:25:24 +1000 Subject: [PATCH 76/81] fix: EVEN MORE non global access Also Tokens.sizes.notifs.image -> global --- modules/launcher/services/Actions.qml | 2 +- modules/lock/NotifGroup.qml | 14 +++++++------- modules/notifications/Content.qml | 2 +- modules/notifications/Notification.qml | 22 +++++++++++----------- modules/sidebar/NotifGroup.qml | 16 ++++++++-------- plugin/src/Caelestia/Config/tokens.hpp | 2 +- services/NotifData.qml | 6 +++--- 7 files changed, 32 insertions(+), 32 deletions(-) diff --git a/modules/launcher/services/Actions.qml b/modules/launcher/services/Actions.qml index 4ec249da..634b3e6a 100644 --- a/modules/launcher/services/Actions.qml +++ b/modules/launcher/services/Actions.qml @@ -20,7 +20,7 @@ Searcher { Variants { id: variants - model: Config.launcher.actions.filter(a => (a.enabled ?? true) && (GlobalConfig.launcher.enableDangerousActions || !(a.dangerous ?? false))) + model: GlobalConfig.launcher.actions.filter(a => (a.enabled ?? true) && (GlobalConfig.launcher.enableDangerousActions || !(a.dangerous ?? false))) Action {} } diff --git a/modules/lock/NotifGroup.qml b/modules/lock/NotifGroup.qml index 50ea168d..14afc8bd 100644 --- a/modules/lock/NotifGroup.qml +++ b/modules/lock/NotifGroup.qml @@ -64,8 +64,8 @@ StyledRect { Item { Layout.alignment: Qt.AlignLeft | Qt.AlignTop - implicitWidth: Tokens.sizes.notifs.image - implicitHeight: Tokens.sizes.notifs.image + implicitWidth: TokenConfig.sizes.notifs.image + implicitHeight: TokenConfig.sizes.notifs.image Component { id: imageComp @@ -73,12 +73,12 @@ StyledRect { Image { source: Qt.resolvedUrl(root.image) fillMode: Image.PreserveAspectCrop - sourceSize.width: Tokens.sizes.notifs.image - sourceSize.height: Tokens.sizes.notifs.image + sourceSize.width: TokenConfig.sizes.notifs.image + sourceSize.height: TokenConfig.sizes.notifs.image cache: false asynchronous: true - width: Tokens.sizes.notifs.image - height: Tokens.sizes.notifs.image + width: TokenConfig.sizes.notifs.image + height: TokenConfig.sizes.notifs.image } } @@ -86,7 +86,7 @@ StyledRect { id: appIconComp ColouredIcon { - implicitSize: Math.round(Tokens.sizes.notifs.image * 0.6) + implicitSize: Math.round(TokenConfig.sizes.notifs.image * 0.6) source: Quickshell.iconPath(root.appIcon) colour: root.urgency === "critical" ? Colours.palette.m3onError : root.urgency === "low" ? Colours.palette.m3onSurface : Colours.palette.m3onSecondaryContainer layer.enabled: root.appIcon.endsWith("symbolic") diff --git a/modules/notifications/Content.qml b/modules/notifications/Content.qml index fcbf41f2..aeaa7dea 100644 --- a/modules/notifications/Content.qml +++ b/modules/notifications/Content.qml @@ -170,7 +170,7 @@ Item { Anim { target: notif property: "x" - to: (notif.x >= 0 ? Tokens.sizes.notifs.width : -Tokens.sizes.notifs.width) * 2 + to: (notif.x >= 0 ? wrapper.Tokens.sizes.notifs.width : -wrapper.Tokens.sizes.notifs.width) * 2 duration: Tokens.anim.durations.normal easing: Tokens.anim.emphasized } diff --git a/modules/notifications/Notification.qml b/modules/notifications/Notification.qml index 55dea458..73c7c287 100644 --- a/modules/notifications/Notification.qml +++ b/modules/notifications/Notification.qml @@ -114,21 +114,21 @@ StyledRect { anchors.left: parent.left anchors.top: parent.top - width: Tokens.sizes.notifs.image - height: Tokens.sizes.notifs.image + width: TokenConfig.sizes.notifs.image + height: TokenConfig.sizes.notifs.image visible: root.hasImage || root.hasAppIcon sourceComponent: ClippingRectangle { radius: Tokens.rounding.full - implicitWidth: Tokens.sizes.notifs.image - implicitHeight: Tokens.sizes.notifs.image + implicitWidth: TokenConfig.sizes.notifs.image + implicitHeight: TokenConfig.sizes.notifs.image Image { anchors.fill: parent source: Qt.resolvedUrl(root.modelData.image) fillMode: Image.PreserveAspectCrop - sourceSize.width: Tokens.sizes.notifs.image - sourceSize.height: Tokens.sizes.notifs.image + sourceSize.width: TokenConfig.sizes.notifs.image + sourceSize.height: TokenConfig.sizes.notifs.image cache: false asynchronous: true } @@ -149,8 +149,8 @@ StyledRect { sourceComponent: StyledRect { radius: Tokens.rounding.full color: root.modelData.urgency === NotificationUrgency.Critical ? Colours.palette.m3error : root.modelData.urgency === NotificationUrgency.Low ? Colours.layer(Colours.palette.m3surfaceContainerHighest, 2) : Colours.palette.m3secondaryContainer - implicitWidth: root.hasImage ? Tokens.sizes.notifs.badge : Tokens.sizes.notifs.image - implicitHeight: root.hasImage ? Tokens.sizes.notifs.badge : Tokens.sizes.notifs.image + implicitWidth: root.hasImage ? Tokens.sizes.notifs.badge : TokenConfig.sizes.notifs.image + implicitHeight: root.hasImage ? Tokens.sizes.notifs.badge : TokenConfig.sizes.notifs.image Loader { id: icon @@ -251,7 +251,7 @@ StyledRect { font.family: appName.font.family font.pointSize: appName.font.pointSize elide: Text.ElideRight - elideWidth: expandBtn.x - time.width - timeSep.width - summary.x - Tokens.spacing.small * 3 + elideWidth: expandBtn.x - time.width - timeSep.width - summary.x - root.Tokens.spacing.small * 3 } StyledText { @@ -303,7 +303,7 @@ StyledRect { font.family: summary.font.family font.pointSize: summary.font.pointSize elide: Text.ElideRight - elideWidth: expandBtn.x - time.width - timeSep.width - summary.x - Tokens.spacing.small * 3 + elideWidth: expandBtn.x - time.width - timeSep.width - summary.x - root.Tokens.spacing.small * 3 } StyledText { @@ -516,7 +516,7 @@ StyledRect { elide: Text.ElideRight elideWidth: { const numActions = root.modelData.actions.length + 1; - return (inner.width - actions.spacing * (numActions - 1)) / numActions - Tokens.padding.normal * 2; + return (inner.width - actions.spacing * (numActions - 1)) / numActions - root.Tokens.padding.normal * 2; } } } diff --git a/modules/sidebar/NotifGroup.qml b/modules/sidebar/NotifGroup.qml index dee6f20b..8c9429bb 100644 --- a/modules/sidebar/NotifGroup.qml +++ b/modules/sidebar/NotifGroup.qml @@ -53,7 +53,7 @@ StyledRect { readonly property int nonAnimHeight: { const headerHeight = header.implicitHeight + (root.expanded ? Math.round(Tokens.spacing.small / 2) : 0); const columnHeight = headerHeight + notifList.layoutHeight + column.Layout.topMargin + column.Layout.bottomMargin; - return Math.round(Math.max(Tokens.sizes.notifs.image, columnHeight) + Tokens.padding.normal * 2); + return Math.round(Math.max(TokenConfig.sizes.notifs.image, columnHeight) + Tokens.padding.normal * 2); } readonly property bool expanded: props.expandedNotifs.includes(modelData) @@ -91,8 +91,8 @@ StyledRect { Item { Layout.alignment: Qt.AlignLeft | Qt.AlignTop - implicitWidth: Tokens.sizes.notifs.image - implicitHeight: Tokens.sizes.notifs.image + implicitWidth: TokenConfig.sizes.notifs.image + implicitHeight: TokenConfig.sizes.notifs.image Component { id: imageComp @@ -100,12 +100,12 @@ StyledRect { Image { source: Qt.resolvedUrl(root.image) fillMode: Image.PreserveAspectCrop - sourceSize.width: Tokens.sizes.notifs.image - sourceSize.height: Tokens.sizes.notifs.image + sourceSize.width: TokenConfig.sizes.notifs.image + sourceSize.height: TokenConfig.sizes.notifs.image cache: false asynchronous: true - width: Tokens.sizes.notifs.image - height: Tokens.sizes.notifs.image + width: TokenConfig.sizes.notifs.image + height: TokenConfig.sizes.notifs.image } } @@ -113,7 +113,7 @@ StyledRect { id: appIconComp ColouredIcon { - implicitSize: Math.round(Tokens.sizes.notifs.image * 0.6) + implicitSize: Math.round(TokenConfig.sizes.notifs.image * 0.6) source: Quickshell.iconPath(root.appIcon) colour: root.urgency === NotificationUrgency.Critical ? Colours.palette.m3onError : root.urgency === NotificationUrgency.Low ? Colours.palette.m3onSurface : Colours.palette.m3onSecondaryContainer layer.enabled: root.appIcon.endsWith("symbolic") diff --git a/plugin/src/Caelestia/Config/tokens.hpp b/plugin/src/Caelestia/Config/tokens.hpp index de0a7c26..5ff1ce5e 100644 --- a/plugin/src/Caelestia/Config/tokens.hpp +++ b/plugin/src/Caelestia/Config/tokens.hpp @@ -194,7 +194,7 @@ class NotifsTokens : public ConfigObject { QML_ANONYMOUS CONFIG_PROPERTY(int, width, 400) - CONFIG_PROPERTY(int, image, 41) + CONFIG_GLOBAL_PROPERTY(int, image, 41) CONFIG_PROPERTY(int, badge, 20) public: diff --git a/services/NotifData.qml b/services/NotifData.qml index c92a3ad7..6f470038 100644 --- a/services/NotifData.qml +++ b/services/NotifData.qml @@ -54,14 +54,14 @@ QtObject { // qmllint disable uncreatable-type PanelWindow { // qmllint enable uncreatable-type - implicitWidth: Tokens.sizes.notifs.image - implicitHeight: Tokens.sizes.notifs.image + implicitWidth: TokenConfig.sizes.notifs.image + implicitHeight: TokenConfig.sizes.notifs.image color: "transparent" mask: Region {} Image { function tryCache(): void { - if (status !== Image.Ready || width != Tokens.sizes.notifs.image || height != Tokens.sizes.notifs.image) + if (status !== Image.Ready || width != TokenConfig.sizes.notifs.image || height != TokenConfig.sizes.notifs.image) return; const cacheKey = notif.appName + notif.summary + notif.id; From 876517081de089bfadbeb36320a5a9be79937e05 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Mon, 13 Apr 2026 18:53:03 +1000 Subject: [PATCH 77/81] chore: update readme global opts --- README.md | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index bd330395..b7ead9bc 100644 --- a/README.md +++ b/README.md @@ -230,13 +230,25 @@ For example, to disable the bar on DP-1: > Not all options are respect per-monitor overrides. Most notably, the following options will only read > from the global config, and ignore the respective option in per-monitor config files. > -> - All animation configs are not per-monitor -> - `general` (logo, terminal app, idle settings) -> - `services` (weather, audio, GPU, player settings, etc.) -> - `paths` (wallpaper dir, lyrics dir, etc.) -> - `notifs` (notification behavior) -> - `utilities` (individual toast enabled status, vpn configs) -> - `launcher` (actions, favourite apps, hidden apps) +>
Ignored options +> +> - `appearance` (`anim`, `transparency`) +> - `general` (`logo`, `apps`, `idle`, `battery`) +> - `bar.workspaces` (`perMonitorWorkspaces`, `specialWorkspaceIcons`, `windowIcons`) +> - `bar.tray` (`iconSubs`, `hiddenIcons`) +> - `dashboard` (`mediaUpdateInterval`, `resourceUpdateInterval`) +> - `launcher` (`specialPrefix`, `actionPrefix`, `enableDangerousActions`, `vimKeybinds`, +> `favouriteApps`, `hiddenApps`, `actions`) +> - `launcher.useFuzzy` (`apps`, `actions`, `schemes`, `variants`, `wallpapers`) +> - `notifs` (`expire`, `fullscreen`, `defaultExpireTimeout`, `actionOnClick`) +> - `lock` (`enableFprint`, `maxFprintTries`) +> - `utilities` (`toasts`, `vpn`) +> - `services` (`weatherLocation`, `useFahrenheit`, `useFahrenheitPerformance`, `useTwelveHourClock`, +> `gpuType`, `visualiserBars`, `audioIncrement`, `brightnessIncrement`, `maxVolume`, `smartScheme`, +> `defaultPlayer`, `playerAliases`, `showLyrics`, `lyricsBackend`) +> - `paths` (`wallpaperDir`, `lyricsDir`) +> +>
### Example configuration From 455c4c59a6ace33012e305fe8016ee8da03fc931 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Mon, 13 Apr 2026 18:58:24 +1000 Subject: [PATCH 78/81] chore: remove unnecessary id --- components/containers/StyledWindow.qml | 2 -- 1 file changed, 2 deletions(-) diff --git a/components/containers/StyledWindow.qml b/components/containers/StyledWindow.qml index 8ea3c227..72bbed6f 100644 --- a/components/containers/StyledWindow.qml +++ b/components/containers/StyledWindow.qml @@ -5,8 +5,6 @@ import Caelestia.Config // qmllint disable uncreatable-type PanelWindow { // qmllint enable uncreatable-type - id: root - required property string name WlrLayershell.namespace: `caelestia-${name}` From b1401c1c8c48a70317ae082e3fd9b519a4fedf57 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Mon, 13 Apr 2026 22:09:43 +1000 Subject: [PATCH 79/81] feat: border rounding only affect outer corners --- modules/drawers/ContentWindow.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/drawers/ContentWindow.qml b/modules/drawers/ContentWindow.qml index 328d13ea..0824d209 100644 --- a/modules/drawers/ContentWindow.qml +++ b/modules/drawers/ContentWindow.qml @@ -301,7 +301,7 @@ StyledWindow { y: panel.y + root.borderThickness implicitWidth: panel.width implicitHeight: panel.height - radius: Config.border.rounding + radius: Tokens.rounding.large deformScale: deformAmount / 10000 } } From 50c4eaf75bbb7dd6aec90531572d77e652e3d4be Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Mon, 13 Apr 2026 22:30:49 +1000 Subject: [PATCH 80/81] feat: add border smoothing option --- README.md | 1 + modules/drawers/ContentWindow.qml | 1 + plugin/src/Caelestia/Config/borderconfig.hpp | 1 + 3 files changed, 3 insertions(+) diff --git a/README.md b/README.md index b7ead9bc..f5849cb8 100644 --- a/README.md +++ b/README.md @@ -483,6 +483,7 @@ For example, to disable the bar on DP-1: }, "border": { "rounding": 25, + "smoothing": 32, "thickness": 10 }, "dashboard": { diff --git a/modules/drawers/ContentWindow.qml b/modules/drawers/ContentWindow.qml index 0824d209..b69408dc 100644 --- a/modules/drawers/ContentWindow.qml +++ b/modules/drawers/ContentWindow.qml @@ -131,6 +131,7 @@ StyledWindow { id: blobGroup color: Colours.palette.m3surface + smoothing: root.contentItem.Config.border.smoothing Behavior on color { CAnim {} diff --git a/plugin/src/Caelestia/Config/borderconfig.hpp b/plugin/src/Caelestia/Config/borderconfig.hpp index abdd07d9..9de604e8 100644 --- a/plugin/src/Caelestia/Config/borderconfig.hpp +++ b/plugin/src/Caelestia/Config/borderconfig.hpp @@ -12,6 +12,7 @@ class BorderConfig : public ConfigObject { CONFIG_PROPERTY(int, thickness, 10) CONFIG_PROPERTY(int, rounding, 25) + CONFIG_PROPERTY(int, smoothing, 32) Q_PROPERTY(int minThickness READ minThickness CONSTANT) Q_PROPERTY(int clampedThickness READ clampedThickness NOTIFY thicknessChanged) From c517b7102437d203d5782f7f714898f5f6d6a525 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Mon, 13 Apr 2026 23:03:36 +1000 Subject: [PATCH 81/81] fix: utilities recording modal bg --- modules/drawers/ContentWindow.qml | 1 + modules/utilities/Content.qml | 2 + modules/utilities/RecordingDeleteModal.qml | 52 +++++++++++++--------- modules/utilities/Wrapper.qml | 2 + 4 files changed, 35 insertions(+), 22 deletions(-) diff --git a/modules/drawers/ContentWindow.qml b/modules/drawers/ContentWindow.qml index b69408dc..b89907f7 100644 --- a/modules/drawers/ContentWindow.qml +++ b/modules/drawers/ContentWindow.qml @@ -250,6 +250,7 @@ StyledWindow { borderThickness: root.borderThickness utilities.horizontalStretch: (sidebarBg.rawDeformMatrix.m11 - 1) / 2 + 1 + utilities.deformMatrix: utilsBg.rawDeformMatrix dashboard.transform: Matrix4x4 { matrix: dashBg.deformMatrix diff --git a/modules/utilities/Content.qml b/modules/utilities/Content.qml index 5ec2d33a..e03c546f 100644 --- a/modules/utilities/Content.qml +++ b/modules/utilities/Content.qml @@ -11,6 +11,7 @@ Item { required property var props required property DrawerVisibilities visibilities required property BarPopouts.Wrapper popouts + required property matrix4x4 deformMatrix implicitWidth: layout.implicitWidth implicitHeight: layout.implicitHeight @@ -37,5 +38,6 @@ Item { RecordingDeleteModal { props: root.props + deformMatrix: root.deformMatrix } } diff --git a/modules/utilities/RecordingDeleteModal.qml b/modules/utilities/RecordingDeleteModal.qml index 2b7e1496..8eda4607 100644 --- a/modules/utilities/RecordingDeleteModal.qml +++ b/modules/utilities/RecordingDeleteModal.qml @@ -14,6 +14,7 @@ Loader { id: root required property var props + required property matrix4x4 deformMatrix asynchronous: true anchors.fill: parent @@ -40,7 +41,9 @@ Loader { StyledRect { anchors.fill: parent - topLeftRadius: Config.border.rounding + anchors.rightMargin: -parent.width * (1 - root.deformMatrix.m11) / 2 // Additional bit to account for deform + anchors.bottomMargin: -parent.height * 0.1 // Additional bit to account for overshoot + topLeftRadius: Tokens.rounding.large color: Colours.palette.m3scrim } @@ -51,13 +54,14 @@ Loader { preferredRendererType: Shape.CurveRenderer asynchronous: true + // Bottom left ShapePath { - startX: -Config.border.rounding * 2 - startY: shape.height - Config.border.thickness + startX: -root.Config.border.smoothing * 2 + startY: shape.height - root.Config.border.thickness strokeWidth: 0 fillGradient: LinearGradient { orientation: LinearGradient.Horizontal - x1: -Config.border.rounding * 2 + x1: -root.Config.border.smoothing * 2 GradientStop { position: 0 @@ -70,31 +74,34 @@ Loader { } PathLine { - relativeX: Config.border.rounding + relativeX: root.Config.border.smoothing relativeY: 0 } - PathArc { - relativeY: -Config.border.rounding - radiusX: Config.border.rounding - radiusY: Config.border.rounding - direction: PathArc.Counterclockwise + PathCubic { + relativeX: root.Config.border.smoothing + relativeY: -root.Config.border.smoothing + relativeControl1X: root.Config.border.smoothing * 0.93 + relativeControl1Y: -root.Config.border.smoothing * 0.07 + relativeControl2X: root.Config.border.smoothing * 0.93 + relativeControl2Y: -root.Config.border.smoothing * 0.07 } PathLine { relativeX: 0 - relativeY: Config.border.rounding + Config.border.thickness + relativeY: root.Config.border.smoothing + root.Config.border.thickness } PathLine { - relativeX: -Config.border.rounding * 2 + relativeX: -root.Config.border.smoothing * 2 relativeY: 0 } } + // Top right curve ShapePath { - startX: shape.width - Config.border.rounding - Config.border.thickness + startX: shape.width - root.Config.border.smoothing - root.Config.border.thickness + (1 - root.deformMatrix.m11) * shape.width / 2 strokeWidth: 0 fillGradient: LinearGradient { orientation: LinearGradient.Vertical - y1: -Config.border.rounding * 2 + y1: -root.Config.border.smoothing * 2 GradientStop { position: 0 @@ -106,19 +113,20 @@ Loader { } } - PathArc { - relativeX: Config.border.rounding - relativeY: -Config.border.rounding - radiusX: Config.border.rounding - radiusY: Config.border.rounding - direction: PathArc.Counterclockwise + PathCubic { + relativeX: root.Config.border.smoothing + relativeY: -root.Config.border.smoothing + relativeControl1X: root.Config.border.smoothing * 0.93 + relativeControl1Y: -root.Config.border.smoothing * 0.07 + relativeControl2X: root.Config.border.smoothing * 0.93 + relativeControl2Y: -root.Config.border.smoothing * 0.07 } PathLine { relativeX: 0 - relativeY: -Config.border.rounding + relativeY: -root.Config.border.smoothing } PathLine { - relativeX: Config.border.thickness + relativeX: root.Config.border.thickness relativeY: 0 } PathLine { diff --git a/modules/utilities/Wrapper.qml b/modules/utilities/Wrapper.qml index a87f8a59..137e817b 100644 --- a/modules/utilities/Wrapper.qml +++ b/modules/utilities/Wrapper.qml @@ -14,6 +14,7 @@ Item { required property Sidebar.Wrapper sidebar required property BarPopouts.Wrapper popouts property real horizontalStretch + property matrix4x4 deformMatrix readonly property PersistentProperties props: PersistentProperties { property bool recordingListExpanded: false @@ -84,6 +85,7 @@ Item { props: root.props visibilities: root.visibilities popouts: root.popouts + deformMatrix: root.deformMatrix } } }