diff --git a/Bar/Modules/ActiveWindow.qml b/Bar/Modules/ActiveWindow.qml index c01d58d..ab39551 100644 --- a/Bar/Modules/ActiveWindow.qml +++ b/Bar/Modules/ActiveWindow.qml @@ -1,9 +1,9 @@ import QtQuick import Quickshell -import qs.Components -import qs.Settings import Quickshell.Wayland import Quickshell.Widgets +import qs.Components +import qs.Settings PanelWindow { id: activeWindowPanel @@ -121,6 +121,7 @@ PanelWindow { source: ToplevelManager?.activeToplevel ? getIcon() : "" visible: Settings.settings.showActiveWindowIcon anchors.verticalCenterOffset: -3 + } Text { diff --git a/Bar/Modules/Applauncher.qml b/Bar/Modules/Applauncher.qml index 2012032..50085c2 100644 --- a/Bar/Modules/Applauncher.qml +++ b/Bar/Modules/Applauncher.qml @@ -3,9 +3,11 @@ import QtQuick.Controls import QtQuick.Layouts import Quickshell import Quickshell.Io +import Quickshell.Wayland +import Quickshell.Widgets import qs.Components import qs.Settings -import Quickshell.Wayland + import "../../Helpers/Fuzzysort.js" as Fuzzysort PanelWithOverlay { @@ -342,13 +344,9 @@ PanelWithOverlay { width: 28 height: 28 property bool iconLoaded: !modelData.isCalculator && iconImg.status === Image.Ready && iconImg.source !== "" && iconImg.status !== Image.Error - Image { + IconImage { id: iconImg anchors.fill: parent - fillMode: Image.PreserveAspectFit - smooth: true - mipmap: true - cache: false asynchronous: true source: modelData.isCalculator ? "qrc:/icons/calculate.svg" : Quickshell.iconPath(modelData.icon, "application-x-executable") visible: modelData.isCalculator || parent.iconLoaded diff --git a/Bar/Modules/CustomTrayMenu.qml b/Bar/Modules/CustomTrayMenu.qml index 58a9605..9d897f0 100644 --- a/Bar/Modules/CustomTrayMenu.qml +++ b/Bar/Modules/CustomTrayMenu.qml @@ -3,6 +3,7 @@ import QtQuick import QtQuick.Controls import QtQuick.Layouts import Quickshell +import Quickshell.Widgets import qs.Settings PopupWindow { @@ -112,14 +113,12 @@ PopupWindow { elide: Text.ElideRight } - Image { + IconImage { Layout.preferredWidth: 16 Layout.preferredHeight: 16 - smooth: true - mipmap: true source: modelData?.icon ?? "" visible: (modelData?.icon ?? "") !== "" - fillMode: Image.PreserveAspectFit + backer.fillMode: Image.PreserveAspectFit } } diff --git a/Bar/Modules/Media.qml b/Bar/Modules/Media.qml index 1014134..02fd372 100644 --- a/Bar/Modules/Media.qml +++ b/Bar/Modules/Media.qml @@ -2,6 +2,7 @@ import QtQuick import QtQuick.Controls import QtQuick.Layouts import Qt5Compat.GraphicalEffects +import Quickshell.Widgets import qs.Settings import qs.Services import qs.Components @@ -57,8 +58,6 @@ Item { mipmap: true cache: false asynchronous: true - sourceSize.width: 24 - sourceSize.height: 24 source: MusicManager.trackArtUrl visible: source.toString() !== "" diff --git a/Bar/Modules/Taskbar.qml b/Bar/Modules/Taskbar.qml index f74b989..8f716e6 100644 --- a/Bar/Modules/Taskbar.qml +++ b/Bar/Modules/Taskbar.qml @@ -74,8 +74,6 @@ Item { height: Math.max(12, Settings.settings.taskbarIconSize * 0.625) anchors.centerIn: parent source: getAppIcon(modelData) - smooth: true - mipmap: true visible: source.toString() !== "" } diff --git a/Components/Avatar.qml b/Components/Avatar.qml new file mode 100644 index 0000000..ab02589 --- /dev/null +++ b/Components/Avatar.qml @@ -0,0 +1,43 @@ +import QtQuick +import Qt5Compat.GraphicalEffects +import Quickshell +import Quickshell.Widgets +import qs.Settings + +Item { + anchors.fill: parent + + IconImage { + id: avatarImage + anchors.fill: parent + anchors.margins: 2 + source: "file://" + Settings.settings.profileImage + visible: false + asynchronous: true + backer.fillMode: Image.PreserveAspectCrop + } + + OpacityMask { + anchors.fill: avatarImage + source: avatarImage + maskSource: Rectangle { + width: avatarImage.width + height: avatarImage.height + radius: avatarImage.width / 2 + visible: false + } + visible: Settings.settings.profileImage !== "" + } + + // Fallback icon + Text { + anchors.centerIn: parent + text: "person" + font.family: "Material Symbols Outlined" + font.pixelSize: 24 + color: Theme.onAccent + visible: Settings.settings.profileImage === undefined || Settings.settings.profileImage === "" + z: 0 + } +} + diff --git a/Widgets/Background.qml b/Widgets/Background.qml index b8eb602..b4d5dca 100644 --- a/Widgets/Background.qml +++ b/Widgets/Background.qml @@ -35,6 +35,7 @@ ShellRoot { visible: wallpaperSource !== "" cache: true smooth: true + mipmap: false } } } diff --git a/Widgets/Dock.qml b/Widgets/Dock.qml index ce7f043..5dbcb5d 100644 --- a/Widgets/Dock.qml +++ b/Widgets/Dock.qml @@ -154,8 +154,6 @@ PanelWindow { height: Math.max(20, Settings.settings.taskbarIconSize * 0.75) anchors.centerIn: parent source: taskbar.getAppIcon(modelData) - smooth: true - mipmap: true visible: source.toString() !== "" } diff --git a/Widgets/LockScreen/LockScreen.qml b/Widgets/LockScreen/LockScreen.qml index 20e747e..b344b4d 100644 --- a/Widgets/LockScreen/LockScreen.qml +++ b/Widgets/LockScreen/LockScreen.qml @@ -3,10 +3,11 @@ import QtQuick.Layouts import QtQuick.Controls import QtQuick.Effects import Qt5Compat.GraphicalEffects -import Quickshell.Wayland import Quickshell import Quickshell.Services.Pam import Quickshell.Io +import Quickshell.Wayland +import Quickshell.Widgets import qs.Components import qs.Settings import qs.Services @@ -137,7 +138,6 @@ WlSessionLock { cache: true smooth: true mipmap: false - visible: true // source for MultiEffect } MultiEffect { @@ -161,36 +161,8 @@ WlSessionLock { radius: 40 color: Theme.accentPrimary - Image { - id: avatarImage - anchors.fill: parent - anchors.margins: 4 - source: Settings.settings.profileImage - fillMode: Image.PreserveAspectCrop - visible: false - asynchronous: true - mipmap: true - smooth: true - } - OpacityMask { - anchors.fill: avatarImage - source: avatarImage - maskSource: Rectangle { - width: avatarImage.width - height: avatarImage.height - radius: avatarImage.width / 2 - visible: false - } - visible: Settings.settings.profileImage !== "" - } - Text { - anchors.centerIn: parent - text: "person" - font.family: "Material Symbols Outlined" - font.pixelSize: 32 - color: Theme.onAccent - visible: Settings.settings.profileImage === "" - } + Avatar {} + layer.enabled: true layer.effect: Glow { color: Theme.accentPrimary @@ -339,7 +311,7 @@ WlSessionLock { } Rectangle { - width: infoColumn.width + 16 + width: infoColumn.width + 32 height: infoColumn.height + 8 color: (Theme.backgroundPrimary !== undefined && Theme.backgroundPrimary !== null) ? Theme.backgroundPrimary : "#222" anchors.horizontalCenter: parent.horizontalCenter diff --git a/Widgets/Notification/NotificationPopup.qml b/Widgets/Notification/NotificationPopup.qml index 58214d7..dbce771 100644 --- a/Widgets/Notification/NotificationPopup.qml +++ b/Widgets/Notification/NotificationPopup.qml @@ -1,6 +1,7 @@ import QtQuick import QtQuick.Controls import Quickshell +import Quickshell.Widgets import qs.Settings PanelWindow { @@ -124,17 +125,12 @@ PanelWindow { property var iconSources: [rawNotification?.image || "", rawNotification?.appIcon || "", rawNotification?.icon || ""] // Try to load notification icon - Image { + IconImage { id: iconImage anchors.fill: parent anchors.margins: 4 - fillMode: Image.PreserveAspectFit - smooth: true - mipmap: true - cache: false asynchronous: true - sourceSize.width: 36 - sourceSize.height: 36 + backer.fillMode: Image.PreserveAspectFit source: { for (var i = 0; i < iconBackground.iconSources.length; i++) { var icon = iconBackground.iconSources[i]; diff --git a/Widgets/Sidebar/Config/ProfileSettings.qml b/Widgets/Sidebar/Config/ProfileSettings.qml index 2d135b5..4a4bf7c 100644 --- a/Widgets/Sidebar/Config/ProfileSettings.qml +++ b/Widgets/Sidebar/Config/ProfileSettings.qml @@ -2,6 +2,8 @@ import QtQuick import QtQuick.Layouts import QtQuick.Controls import Qt5Compat.GraphicalEffects +import Quickshell.Widgets +import qs.Components import qs.Settings Rectangle { @@ -61,39 +63,7 @@ Rectangle { border.color: profileImageInput.activeFocus ? Theme.accentPrimary : Theme.outline border.width: 1 - Image { - id: avatarImage - anchors.fill: parent - anchors.margins: 2 - source: Settings.settings.profileImage - fillMode: Image.PreserveAspectCrop - visible: false - asynchronous: true - cache: false - smooth: true - mipmap: true - } - - OpacityMask { - anchors.fill: avatarImage - source: avatarImage - maskSource: Rectangle { - width: avatarImage.width - height: avatarImage.height - radius: avatarImage.width / 2 - visible: false - } - visible: Settings.settings.profileImage !== "" - } - - Text { - anchors.centerIn: parent - text: "person" - font.family: "Material Symbols Outlined" - font.pixelSize: 20 - color: Theme.accentPrimary - visible: Settings.settings.profileImage === "" - } + Avatar {} } Rectangle { diff --git a/Widgets/Sidebar/Panel/System.qml b/Widgets/Sidebar/Panel/System.qml index 3e53cf6..902874a 100644 --- a/Widgets/Sidebar/Panel/System.qml +++ b/Widgets/Sidebar/Panel/System.qml @@ -4,6 +4,7 @@ import QtQuick.Controls import Qt5Compat.GraphicalEffects import Quickshell import Quickshell.Io +import Quickshell.Widgets import qs.Settings import qs.Widgets import qs.Widgets.LockScreen @@ -51,38 +52,7 @@ Rectangle { z: 2 } - OpacityMask { - anchors.fill: parent - source: Image { - id: avatarImage - anchors.fill: parent - source: Settings.settings.profileImage !== undefined ? Settings.settings.profileImage : "" - fillMode: Image.PreserveAspectCrop - asynchronous: true - cache: false - smooth: true - mipmap: true - } - maskSource: Rectangle { - width: 44 - height: 44 - radius: 22 - visible: false - } - visible: Settings.settings.profileImage !== undefined && Settings.settings.profileImage !== "" - z: 1 - } - - // Fallback icon - Text { - anchors.centerIn: parent - text: "person" - font.family: "Material Symbols Outlined" - font.pixelSize: 24 - color: Theme.onAccent - visible: Settings.settings.profileImage === undefined || Settings.settings.profileImage === "" - z: 0 - } + Avatar {} } // User info text diff --git a/Widgets/Sidebar/Panel/WallpaperPanel.qml b/Widgets/Sidebar/Panel/WallpaperPanel.qml index dd6219a..932e776 100644 --- a/Widgets/Sidebar/Panel/WallpaperPanel.qml +++ b/Widgets/Sidebar/Panel/WallpaperPanel.qml @@ -136,12 +136,9 @@ PanelWindow { source: modelData fillMode: Image.PreserveAspectCrop asynchronous: true - cache: false + cache: true smooth: true mipmap: true - // Limit memory usage - sourceSize.width: Math.min(width, 480) - sourceSize.height: Math.min(height, 270) } MouseArea { anchors.fill: parent