diff --git a/components/ConnectionHeader.qml b/components/ConnectionHeader.qml index cb1ce571..ff4061b5 100644 --- a/components/ConnectionHeader.qml +++ b/components/ConnectionHeader.qml @@ -16,7 +16,7 @@ ColumnLayout { Layout.alignment: Qt.AlignHCenter animate: true text: root.icon - fontStyle: Tokens.font.icon.builder.size(Tokens.font.icon.extraLarge.pointSize * 3).weight(Font.Bold).build() + fontStyle: Tokens.font.icon.builders.extraLarge.scale(3).weight(Font.Bold).build() } StyledText { diff --git a/components/MaterialIcon.qml b/components/MaterialIcon.qml index 5208c554..0fbac7b9 100644 --- a/components/MaterialIcon.qml +++ b/components/MaterialIcon.qml @@ -7,5 +7,5 @@ StyledText { property int grade: Colours.light ? 0 : -25 property font fontStyle: Tokens.font.icon.small - font: Tokens.font.icon.builder.size(fontStyle.pointSize).weight(fontStyle.weight).fill(fill.toFixed(1)).grade(grade).build() + font: Tokens.font.icon.size(fontStyle.pointSize).weight(fontStyle.weight).fill(fill.toFixed(1)).grade(grade).build() } diff --git a/components/controls/ToggleButton.qml b/components/controls/ToggleButton.qml index d67b808b..cecdc413 100644 --- a/components/controls/ToggleButton.qml +++ b/components/controls/ToggleButton.qml @@ -61,7 +61,7 @@ StyledRect { fill: root.toggled ? 1 : 0 text: root.icon color: root.toggled ? Colours.palette[`m3on${root.accent}`] : Colours.palette[`m3on${root.accent}Container`] - fontStyle: Tokens.font.icon.builder.size(root.iconSize).build() + fontStyle: Tokens.font.icon.size(root.iconSize).build() Behavior on fill { Anim {} diff --git a/components/filedialog/FolderContents.qml b/components/filedialog/FolderContents.qml index 0f0a64f0..4c5a77bc 100644 --- a/components/filedialog/FolderContents.qml +++ b/components/filedialog/FolderContents.qml @@ -59,7 +59,7 @@ Item { Layout.alignment: Qt.AlignHCenter text: "scan_delete" color: Colours.palette.m3outline - fontStyle: Tokens.font.icon.builder.size(Tokens.font.icon.extraLarge.pointSize * 2).weight(Font.Medium).build() + fontStyle: Tokens.font.icon.builders.extraLarge.scale(2).weight(Font.Medium).build() } StyledText { diff --git a/modules/background/Wallpaper.qml b/modules/background/Wallpaper.qml index 2d32ed6b..c0980f34 100644 --- a/modules/background/Wallpaper.qml +++ b/modules/background/Wallpaper.qml @@ -48,7 +48,7 @@ Item { MaterialIcon { text: "sentiment_stressed" color: Colours.palette.m3onSurfaceVariant - fontStyle: Tokens.font.icon.builder.size(Tokens.font.icon.extraLarge.pointSize * 5).build() + fontStyle: Tokens.font.icon.builders.extraLarge.scale(5).build() } Column { diff --git a/modules/bar/components/Power.qml b/modules/bar/components/Power.qml index c6a1e104..ba810f8b 100644 --- a/modules/bar/components/Power.qml +++ b/modules/bar/components/Power.qml @@ -29,6 +29,6 @@ Item { text: "power_settings_new" color: Colours.palette.m3error - fontStyle: Tokens.font.icon.builder.size(Tokens.font.icon.medium.pointSize).weight(Font.Bold).build() + fontStyle: Tokens.font.icon.builders.small.weight(Font.Bold).build() } } diff --git a/modules/bar/popouts/WirelessPassword.qml b/modules/bar/popouts/WirelessPassword.qml index 86d2f19b..13d46a70 100644 --- a/modules/bar/popouts/WirelessPassword.qml +++ b/modules/bar/popouts/WirelessPassword.qml @@ -177,7 +177,7 @@ ColumnLayout { MaterialIcon { Layout.alignment: Qt.AlignHCenter text: "lock" - fontStyle: Tokens.font.icon.builder.size(Tokens.font.icon.extraLarge.pointSize * 2).build() + fontStyle: Tokens.font.icon.builders.extraLarge.scale(2).build() } StyledText { diff --git a/modules/controlcenter/components/SettingsHeader.qml b/modules/controlcenter/components/SettingsHeader.qml index 325fb4f5..bb65976b 100644 --- a/modules/controlcenter/components/SettingsHeader.qml +++ b/modules/controlcenter/components/SettingsHeader.qml @@ -23,7 +23,7 @@ Item { MaterialIcon { Layout.alignment: Qt.AlignHCenter text: root.icon - fontStyle: Tokens.font.icon.builder.size(84).weight(Font.Bold).build() + fontStyle: Tokens.font.icon.size(84).weight(Font.Bold).build() } StyledText { diff --git a/modules/controlcenter/network/WirelessPasswordDialog.qml b/modules/controlcenter/network/WirelessPasswordDialog.qml index bc64592c..4e793a53 100644 --- a/modules/controlcenter/network/WirelessPasswordDialog.qml +++ b/modules/controlcenter/network/WirelessPasswordDialog.qml @@ -149,7 +149,7 @@ Item { MaterialIcon { Layout.alignment: Qt.AlignHCenter text: "lock" - fontStyle: Tokens.font.icon.builder.size(Tokens.font.icon.extraLarge.pointSize * 2).build() + fontStyle: Tokens.font.icon.builders.extraLarge.scale(2).build() } StyledText { diff --git a/modules/dashboard/LyricMenu.qml b/modules/dashboard/LyricMenu.qml index 18e68678..98e8c5c1 100644 --- a/modules/dashboard/LyricMenu.qml +++ b/modules/dashboard/LyricMenu.qml @@ -41,7 +41,7 @@ StyledRect { text: "lyrics" fill: 1 color: Colours.palette.m3primary - fontStyle: Tokens.font.icon.builder.size(Tokens.spacing.large).build() + fontStyle: Tokens.font.icon.size(Tokens.spacing.large).build() } Rectangle { diff --git a/modules/dashboard/Media.qml b/modules/dashboard/Media.qml index 4b0988d6..17602914 100644 --- a/modules/dashboard/Media.qml +++ b/modules/dashboard/Media.qml @@ -173,7 +173,7 @@ Item { grade: 200 text: "art_track" color: Colours.palette.m3onSurfaceVariant - fontStyle: Tokens.font.icon.builder.size((parent.width * 0.4) || 1).build() + fontStyle: Tokens.font.icon.size((parent.width * 0.4) || 1).build() } Image { @@ -267,7 +267,7 @@ Item { PlayerControl { type: IconButton.Text icon: Players.active?.shuffle ? "shuffle_on" : "shuffle" - font: Tokens.font.icon.builder.size(Math.round(Tokens.font.icon.large.pointSize)).build() + font: Tokens.font.icon.size(Math.round(Tokens.font.icon.large.pointSize)).build() disabled: !Players.active?.shuffleSupported onClicked: Players.active.shuffle = !Players.active?.shuffle } @@ -275,7 +275,7 @@ Item { PlayerControl { type: IconButton.Text icon: "skip_previous" - font: Tokens.font.icon.builder.size(Math.round(Tokens.font.icon.large.pointSize * 1.5)).build() + font: Tokens.font.icon.builders.large.scale(1.5).build() disabled: !Players.active?.canGoPrevious onClicked: Players.active?.previous() } @@ -286,7 +286,7 @@ Item { toggle: true padding: Tokens.padding.extraSmall / 2 checked: Players.active?.isPlaying ?? false - font: Tokens.font.icon.builder.size(Math.round(Tokens.font.icon.large.pointSize * 1.5)).build() + font: Tokens.font.icon.builders.large.scale(1.5).build() disabled: !Players.active?.canTogglePlaying onClicked: Players.active?.togglePlaying() } @@ -294,7 +294,7 @@ Item { PlayerControl { type: IconButton.Text icon: "skip_next" - font: Tokens.font.icon.builder.size(Math.round(Tokens.font.icon.large.pointSize * 1.5)).build() + font: Tokens.font.icon.builders.large.scale(1.5).build() disabled: !Players.active?.canGoNext onClicked: Players.active?.next() } @@ -302,7 +302,7 @@ Item { PlayerControl { type: IconButton.Text icon: "lyrics" - font: Tokens.font.icon.builder.size(Math.round(Tokens.font.icon.large.pointSize)).build() + font: Tokens.font.icon.size(Math.round(Tokens.font.icon.large.pointSize)).build() onClicked: root.lyricMenuOpen = !root.lyricMenuOpen } } diff --git a/modules/dashboard/Performance.qml b/modules/dashboard/Performance.qml index 40a77100..899503d8 100644 --- a/modules/dashboard/Performance.qml +++ b/modules/dashboard/Performance.qml @@ -37,7 +37,7 @@ Item { MaterialIcon { Layout.alignment: Qt.AlignHCenter text: "tune" - fontStyle: Tokens.font.icon.builder.size(Tokens.font.icon.extraLarge.pointSize * 2).build() + fontStyle: Tokens.font.icon.builders.extraLarge.scale(2).build() color: Colours.palette.m3onSurfaceVariant } @@ -287,7 +287,7 @@ Item { text: parent.icon fill: 1 color: parent.accentColor - fontStyle: Tokens.font.icon.builder.size(Tokens.spacing.large).build() + fontStyle: Tokens.font.icon.size(Tokens.spacing.large).build() } StyledText { diff --git a/modules/dashboard/WeatherTab.qml b/modules/dashboard/WeatherTab.qml index e88abfa2..b942a8b0 100644 --- a/modules/dashboard/WeatherTab.qml +++ b/modules/dashboard/WeatherTab.qml @@ -79,7 +79,7 @@ Item { MaterialIcon { Layout.alignment: Qt.AlignVCenter text: Weather.icon - fontStyle: Tokens.font.icon.builder.size(Tokens.font.icon.extraLarge.pointSize * 3).build() + fontStyle: Tokens.font.icon.builders.extraLarge.scale(3).build() color: Colours.palette.m3secondary animate: true } diff --git a/modules/dashboard/dash/Calendar.qml b/modules/dashboard/dash/Calendar.qml index ad57beed..445e8a6a 100644 --- a/modules/dashboard/dash/Calendar.qml +++ b/modules/dashboard/dash/Calendar.qml @@ -61,7 +61,7 @@ CustomMouseArea { anchors.centerIn: parent text: "chevron_left" color: Colours.palette.m3tertiary - fontStyle: Tokens.font.icon.builder.size(Tokens.font.icon.medium.pointSize).weight(Font.Bold).build() + fontStyle: Tokens.font.icon.size(Tokens.font.icon.medium.pointSize).weight(Font.Bold).build() } } @@ -118,7 +118,7 @@ CustomMouseArea { anchors.centerIn: parent text: "chevron_right" color: Colours.palette.m3tertiary - fontStyle: Tokens.font.icon.builder.size(Tokens.font.icon.medium.pointSize).weight(Font.Bold).build() + fontStyle: Tokens.font.icon.size(Tokens.font.icon.medium.pointSize).weight(Font.Bold).build() } } } diff --git a/modules/dashboard/dash/Media.qml b/modules/dashboard/dash/Media.qml index 9b056c28..a01d501d 100644 --- a/modules/dashboard/dash/Media.qml +++ b/modules/dashboard/dash/Media.qml @@ -98,7 +98,7 @@ Item { grade: 200 text: "art_track" color: Colours.palette.m3onSurfaceVariant - fontStyle: Tokens.font.icon.builder.size((parent.width * 0.4) || 1).build() + fontStyle: Tokens.font.icon.size((parent.width * 0.4) || 1).build() } Image { diff --git a/modules/dashboard/dash/SmallWeather.qml b/modules/dashboard/dash/SmallWeather.qml index b20086cb..333e5809 100644 --- a/modules/dashboard/dash/SmallWeather.qml +++ b/modules/dashboard/dash/SmallWeather.qml @@ -21,7 +21,7 @@ Item { animate: true text: Weather.icon color: Colours.palette.m3secondary - fontStyle: Tokens.font.icon.builder.size(Tokens.font.icon.extraLarge.pointSize * 2).build() + fontStyle: Tokens.font.icon.builders.extraLarge.scale(2).build() } Column { diff --git a/modules/dashboard/dash/User.qml b/modules/dashboard/dash/User.qml index d0552efe..1dc75891 100644 --- a/modules/dashboard/dash/User.qml +++ b/modules/dashboard/dash/User.qml @@ -29,7 +29,7 @@ Row { text: "person" fill: 1 grade: 200 - fontStyle: Tokens.font.icon.builder.size(Math.floor(info.implicitHeight / 2) || 1).build() + fontStyle: Tokens.font.icon.size(Math.floor(info.implicitHeight / 2) || 1).build() visible: pfp.status !== Image.Ready } diff --git a/modules/launcher/items/WallpaperItem.qml b/modules/launcher/items/WallpaperItem.qml index fa844c7a..8191c42e 100644 --- a/modules/launcher/items/WallpaperItem.qml +++ b/modules/launcher/items/WallpaperItem.qml @@ -58,7 +58,7 @@ Item { anchors.centerIn: parent text: "image" color: Colours.tPalette.m3outline - fontStyle: Tokens.font.icon.builder.size(Tokens.font.icon.extraLarge.pointSize * 2).weight(Font.DemiBold).build() + fontStyle: Tokens.font.icon.builders.extraLarge.scale(2).weight(Font.DemiBold).build() } CachingImage { diff --git a/modules/lock/Center.qml b/modules/lock/Center.qml index 56090d02..b73bd8b7 100644 --- a/modules/lock/Center.qml +++ b/modules/lock/Center.qml @@ -87,7 +87,7 @@ ColumnLayout { text: "person" color: Colours.palette.m3onSurfaceVariant - fontStyle: Tokens.font.icon.builder.size(Math.floor(root.centerWidth / 4)).build() + fontStyle: Tokens.font.icon.size(Math.floor(root.centerWidth / 4)).build() visible: pfp.status !== Image.Ready } @@ -194,7 +194,7 @@ ColumnLayout { anchors.centerIn: parent text: "arrow_forward" color: root.lock.pam.buffer ? Colours.palette.m3onPrimary : Colours.palette.m3onSurface - fontStyle: Tokens.font.icon.builder.size(Tokens.font.icon.large.pointSize).weight(Font.Medium).build() + fontStyle: Tokens.font.icon.size(Tokens.font.icon.large.pointSize).weight(Font.Medium).build() } } } diff --git a/modules/lock/LockSurface.qml b/modules/lock/LockSurface.qml index 832ab114..7cc800af 100644 --- a/modules/lock/LockSurface.qml +++ b/modules/lock/LockSurface.qml @@ -207,7 +207,7 @@ WlSessionLockSurface { anchors.centerIn: parent text: "lock" - fontStyle: Tokens.font.icon.builder.size(Tokens.font.icon.extraLarge.pointSize * 4).weight(Font.Bold).build() + fontStyle: Tokens.font.icon.builders.extraLarge.scale(4).weight(Font.Bold).build() rotation: 180 } diff --git a/modules/lock/Resources.qml b/modules/lock/Resources.qml index 314a521e..630266a4 100644 --- a/modules/lock/Resources.qml +++ b/modules/lock/Resources.qml @@ -80,7 +80,7 @@ GridLayout { anchors.centerIn: parent text: res.icon color: res.colour - fontStyle: Tokens.font.icon.builder.size((circ.arcRadius * 0.7) || 1).weight(Font.DemiBold).build() + fontStyle: Tokens.font.icon.size((circ.arcRadius * 0.7) || 1).weight(Font.DemiBold).build() } Behavior on value { diff --git a/modules/lock/WeatherInfo.qml b/modules/lock/WeatherInfo.qml index cc7fb6f1..5bc97f5c 100644 --- a/modules/lock/WeatherInfo.qml +++ b/modules/lock/WeatherInfo.qml @@ -41,7 +41,7 @@ ColumnLayout { animate: true text: Weather.icon color: Colours.palette.m3secondary - fontStyle: Tokens.font.icon.builder.size(Tokens.font.icon.extraLarge.pointSize * 2.5).build() + fontStyle: Tokens.font.icon.builders.extraLarge.scale(2.5).build() } ColumnLayout { @@ -150,7 +150,7 @@ ColumnLayout { MaterialIcon { Layout.alignment: Qt.AlignHCenter text: forecastHour.modelData?.icon ?? "cloud_alert" - fontStyle: Tokens.font.icon.builder.size(Tokens.font.icon.extraLarge.pointSize * 1.5).weight(Font.Medium).build() + fontStyle: Tokens.font.icon.builders.extraLarge.scale(1.5).weight(Font.Medium).build() } StyledText { diff --git a/modules/session/Content.qml b/modules/session/Content.qml index a9184b5b..01cb9f72 100644 --- a/modules/session/Content.qml +++ b/modules/session/Content.qml @@ -125,7 +125,7 @@ Column { text: button.icon color: button.activeFocus ? Colours.palette.m3onSecondaryContainer : Colours.palette.m3onSurface - fontStyle: Tokens.font.icon.builder.size(Tokens.font.icon.extraLarge.pointSize).weight(Font.Medium).build() + fontStyle: Tokens.font.icon.size(Tokens.font.icon.extraLarge.pointSize).weight(Font.Medium).build() } } } diff --git a/modules/sidebar/NotifDock.qml b/modules/sidebar/NotifDock.qml index 96081919..d2ba9620 100644 --- a/modules/sidebar/NotifDock.qml +++ b/modules/sidebar/NotifDock.qml @@ -183,7 +183,7 @@ Item { icon: "clear_all" radius: Tokens.rounding.large padding: Tokens.padding.medium - font: Tokens.font.icon.builder.size(Math.round(Tokens.font.icon.large.pointSize * 1.2)).build() + font: Tokens.font.icon.builders.large.scale(1.2).build() onClicked: clearTimer.start() Elevation { diff --git a/modules/utilities/toasts/ToastItem.qml b/modules/utilities/toasts/ToastItem.qml index 29ffdbf7..93d68937 100644 --- a/modules/utilities/toasts/ToastItem.qml +++ b/modules/utilities/toasts/ToastItem.qml @@ -84,7 +84,7 @@ StyledRect { return Colours.palette.m3onError; return Colours.palette.m3onSurfaceVariant; } - fontStyle: Tokens.font.icon.builder.size(Math.round(Tokens.font.icon.large.pointSize * 1.2)).build() + fontStyle: Tokens.font.icon.builders.large.scale(1.2).build() } } diff --git a/modules/windowinfo/Preview.qml b/modules/windowinfo/Preview.qml index c9e1455d..4ff03480 100644 --- a/modules/windowinfo/Preview.qml +++ b/modules/windowinfo/Preview.qml @@ -44,7 +44,7 @@ Item { Layout.alignment: Qt.AlignHCenter text: "web_asset_off" color: Colours.palette.m3outline - fontStyle: Tokens.font.icon.builder.size(Tokens.font.icon.extraLarge.pointSize * 3).build() + fontStyle: Tokens.font.icon.builders.extraLarge.scale(3).build() } StyledText { diff --git a/plugin/src/Caelestia/Config/font.cpp b/plugin/src/Caelestia/Config/font.cpp index 982b36d1..eeb06bd8 100644 --- a/plugin/src/Caelestia/Config/font.cpp +++ b/plugin/src/Caelestia/Config/font.cpp @@ -79,6 +79,14 @@ FontBuilders* FontStyle::builders() const { // IconFontStyle +IconFontStyle::IconFontStyle(QObject* parent) + : FontStyleBase(parent) + , m_builders(new IconFontBuilders(this, this)) {} + +FontBuilder IconFontStyle::size(int pointSize) { + return FontBuilder(m_small).size(pointSize); +} + void IconFontStyle::bind(IconFontStyleConfig* cfg) { if (m_cfg == cfg) return; @@ -99,8 +107,8 @@ QFont IconFontStyle::extraLarge() const { return m_extraLarge; } -FontBuilder IconFontStyle::builder() const { - return FontBuilder(m_large); +IconFontBuilders* IconFontStyle::builders() const { + return m_builders; } void IconFontStyle::rebuild() { @@ -138,6 +146,15 @@ FontBuilder FontBuilders::small() const { return FontBuilder(m_style->small()); } +// IconFontBuilders + +IconFontBuilders::IconFontBuilders(const IconFontStyle* style, QObject* parent) + : FontBuilders(style, parent) {} + +FontBuilder IconFontBuilders::extraLarge() const { + return FontBuilder(static_cast(m_style)->extraLarge()); +} + // FontTokens FontTokens::FontTokens(QObject* parent) diff --git a/plugin/src/Caelestia/Config/font.hpp b/plugin/src/Caelestia/Config/font.hpp index ebc35e5f..a4bc8e2d 100644 --- a/plugin/src/Caelestia/Config/font.hpp +++ b/plugin/src/Caelestia/Config/font.hpp @@ -11,6 +11,7 @@ class FontConfig; class FontStyleConfig; class IconFontStyleConfig; class FontStyleBase; +class IconFontStyle; class FontBuilders : public QObject { Q_OBJECT @@ -30,10 +31,22 @@ public: signals: void buildersChanged(); -private: +protected: const FontStyleBase* m_style; }; +class IconFontBuilders : public FontBuilders { + Q_OBJECT + QML_ANONYMOUS + + Q_PROPERTY(caelestia::config::FontBuilder extraLarge READ extraLarge NOTIFY buildersChanged FINAL) + +public: + explicit IconFontBuilders(const IconFontStyle* style, QObject* parent = nullptr); + + [[nodiscard]] FontBuilder extraLarge() const; +}; + class FontStyleBase : public QObject { Q_OBJECT @@ -85,22 +98,24 @@ class IconFontStyle : public FontStyleBase { QML_ANONYMOUS Q_PROPERTY(QFont extraLarge READ extraLarge NOTIFY fontsChanged FINAL) - Q_PROPERTY(caelestia::config::FontBuilder builder READ builder NOTIFY fontsChanged FINAL) + Q_PROPERTY(caelestia::config::IconFontBuilders* builders READ builders CONSTANT FINAL) public: - explicit IconFontStyle(QObject* parent = nullptr) - : FontStyleBase(parent) {} + explicit IconFontStyle(QObject* parent = nullptr); + + Q_INVOKABLE FontBuilder size(int pointSize); void bind(IconFontStyleConfig* cfg); [[nodiscard]] QFont extraLarge() const; - [[nodiscard]] FontBuilder builder() const; + [[nodiscard]] IconFontBuilders* builders() const; protected: void rebuild() override; private: QFont m_extraLarge; + IconFontBuilders* m_builders; }; class FontTokens : public QObject { diff --git a/plugin/src/Caelestia/Config/fontbuilder.cpp b/plugin/src/Caelestia/Config/fontbuilder.cpp index 031ae97e..9750e695 100644 --- a/plugin/src/Caelestia/Config/fontbuilder.cpp +++ b/plugin/src/Caelestia/Config/fontbuilder.cpp @@ -71,4 +71,8 @@ FontBuilder FontBuilder::width(float value) { return vaxis("wdth", value); } +FontBuilder FontBuilder::scale(qreal factor) { + return size(static_cast(m_font.pointSize() * factor)); +} + } // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/fontbuilder.hpp b/plugin/src/Caelestia/Config/fontbuilder.hpp index 28b48b9c..7613d784 100644 --- a/plugin/src/Caelestia/Config/fontbuilder.hpp +++ b/plugin/src/Caelestia/Config/fontbuilder.hpp @@ -29,6 +29,9 @@ public: [[nodiscard]] Q_INVOKABLE FontBuilder grade(float value); [[nodiscard]] Q_INVOKABLE FontBuilder width(float value); + // Operations + [[nodiscard]] Q_INVOKABLE FontBuilder scale(qreal factor); + private: QFont m_font; };