proper image scaling with screen scaling (#3036, #3037)

This commit is contained in:
end-4
2026-05-04 09:20:12 +02:00
parent c652d2a7f3
commit f992294ec2
16 changed files with 20 additions and 41 deletions
@@ -88,8 +88,6 @@ Rectangle {
width: root.imageWidth * root.scale width: root.imageWidth * root.scale
height: root.imageHeight * root.scale height: root.imageHeight * root.scale
sourceSize.width: width
sourceSize.height: height
} }
Loader { Loader {
@@ -7,7 +7,7 @@ import qs.modules.common.functions
// From https://github.com/caelestia-dots/shell with modifications. // From https://github.com/caelestia-dots/shell with modifications.
// License: GPLv3 // License: GPLv3
Image { StyledImage {
id: root id: root
required property var fileModelData required property var fileModelData
asynchronous: true asynchronous: true
@@ -30,7 +30,7 @@ MaterialShape { // App icon
color: isUrgent ? Appearance.colors.colPrimaryContainer : Appearance.colors.colSecondaryContainer color: isUrgent ? Appearance.colors.colPrimaryContainer : Appearance.colors.colSecondaryContainer
Loader { Loader {
id: materialSymbolLoader id: materialSymbolLoader
active: root.appIcon == "" active: root.appIcon == "" && root.image == ""
anchors.fill: parent anchors.fill: parent
sourceComponent: MaterialSymbol { sourceComponent: MaterialSymbol {
text: { text: {
@@ -63,7 +63,7 @@ MaterialShape { // App icon
anchors.fill: parent anchors.fill: parent
sourceComponent: Item { sourceComponent: Item {
anchors.fill: parent anchors.fill: parent
Image { StyledImage {
id: notifImage id: notifImage
anchors.fill: parent anchors.fill: parent
readonly property int size: parent.width readonly property int size: parent.width
@@ -74,11 +74,6 @@ MaterialShape { // App icon
antialiasing: true antialiasing: true
asynchronous: true asynchronous: true
width: size
height: size
sourceSize.width: size
sourceSize.height: size
layer.enabled: true layer.enabled: true
layer.effect: OpacityMask { layer.effect: OpacityMask {
maskSource: Rectangle { maskSource: Rectangle {
@@ -1,4 +1,5 @@
import QtQuick import QtQuick
import Quickshell
import qs.services import qs.services
import qs.modules.common import qs.modules.common
import qs.modules.common.widgets import qs.modules.common.widgets
@@ -22,4 +23,9 @@ Image {
currentFallbackIndex += 1; currentFallbackIndex += 1;
} }
} }
sourceSize: {
const dpr = (QsWindow.window as QsWindow)?.devicePixelRatio ?? 1;
return Qt.size(width * dpr, height * dpr);
}
} }
@@ -194,10 +194,6 @@ Variants {
easing.type: Easing.OutCubic easing.type: Easing.OutCubic
} }
} }
sourceSize {
width: bgRoot.scaledWallpaperWidth
height: bgRoot.scaledWallpaperHeight
}
width: bgRoot.scaledWallpaperWidth width: bgRoot.scaledWallpaperWidth
height: bgRoot.scaledWallpaperHeight height: bgRoot.scaledWallpaperHeight
} }
@@ -113,12 +113,10 @@ Item { // Player instance
} }
} }
Image { StyledImage {
id: blurredArt id: blurredArt
anchors.fill: parent anchors.fill: parent
source: root.displayedArtFilePath source: root.displayedArtFilePath
sourceSize.width: background.width
sourceSize.height: background.height
fillMode: Image.PreserveAspectCrop fillMode: Image.PreserveAspectCrop
cache: false cache: false
antialiasing: true antialiasing: true
@@ -179,8 +177,6 @@ Item { // Player instance
width: size width: size
height: size height: size
sourceSize.width: size
sourceSize.height: size
} }
} }
@@ -1,5 +1,6 @@
pragma ComponentBehavior: Bound pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import Quickshell
import Qt5Compat.GraphicalEffects import Qt5Compat.GraphicalEffects
import qs.modules.common import qs.modules.common
import qs.modules.common.functions import qs.modules.common.functions
@@ -71,8 +72,10 @@ StyledOverlayWidget {
anchors.centerIn: parent anchors.centerIn: parent
width: root.imageWidth * root.scaleFactor width: root.imageWidth * root.scaleFactor
height: root.imageHeight * root.scaleFactor height: root.imageHeight * root.scaleFactor
sourceSize.width: width sourceSize: {
sourceSize.height: height const dpr = (QsWindow.window as QsWindow)?.devicePixelRatio ?? 1;
return Qt.size(width * dpr, height * dpr);
}
playing: visible playing: visible
asynchronous: true asynchronous: true
@@ -3,6 +3,7 @@ import qs
import qs.services import qs.services
import qs.modules.common import qs.modules.common
import qs.modules.common.functions import qs.modules.common.functions
import qs.modules.common.widgets
import Qt5Compat.GraphicalEffects import Qt5Compat.GraphicalEffects
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
@@ -109,7 +110,7 @@ Item { // Window
border.width : 1 border.width : 1
} }
Image { StyledImage {
id: windowIcon id: windowIcon
property real baseSize: Math.min(root.targetWindowWidth, root.targetWindowHeight) property real baseSize: Math.min(root.targetWindowWidth, root.targetWindowHeight)
anchors { anchors {
@@ -126,12 +127,11 @@ Item { // Window
// console.log("Final:", Math.min(targetWindowWidth, targetWindowHeight) * (root.compactMode ? root.iconToWindowRatioCompact : root.iconToWindowRatio) / root.monitorData.scale) // console.log("Final:", Math.min(targetWindowWidth, targetWindowHeight) * (root.compactMode ? root.iconToWindowRatioCompact : root.iconToWindowRatio) / root.monitorData.scale)
return baseSize * (root.compactMode ? root.iconToWindowRatioCompact : root.iconToWindowRatio); return baseSize * (root.compactMode ? root.iconToWindowRatioCompact : root.iconToWindowRatio);
} }
// mipmap: true mipmap: true
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
source: root.iconPath source: root.iconPath
width: iconSize width: iconSize
height: iconSize height: iconSize
sourceSize: Qt.size(iconSize, iconSize)
Behavior on width { Behavior on width {
animation: Appearance.animation.elementMoveEnter.numberAnimation.createObject(this) animation: Appearance.animation.elementMoveEnter.numberAnimation.createObject(this)
@@ -186,7 +186,6 @@ Item {
asynchronous: false asynchronous: false
width: root.windowWidth width: root.windowWidth
height: root.windowHeight height: root.windowHeight
sourceSize: Qt.size(root.windowWidth, root.windowHeight)
source: Qt.resolvedUrl(root.screenshotPath) source: Qt.resolvedUrl(root.screenshotPath)
visible: false visible: false
} }
@@ -67,8 +67,6 @@ Button {
height: root.rowHeight height: root.rowHeight
fillMode: Image.PreserveAspectFit fillMode: Image.PreserveAspectFit
source: modelData.preview_url source: modelData.preview_url
sourceSize.width: root.rowHeight * modelData.aspect_ratio
sourceSize.height: root.rowHeight
layer.enabled: true layer.enabled: true
layer.effect: OpacityMask { layer.effect: OpacityMask {
@@ -36,12 +36,10 @@ Item {
text: root.node?.audio.muted ? Translation.tr("Click to unmute") : Translation.tr("Click to mute") text: root.node?.audio.muted ? Translation.tr("Click to unmute") : Translation.tr("Click to mute")
} }
Image { StyledImage {
id: iconImg id: iconImg
anchors.fill: parent anchors.fill: parent
visible: false visible: false
sourceSize.width: parent.size
sourceSize.height: parent.size
source: { source: {
let icon; let icon;
icon = AppSearch.guessIcon(root.node?.properties["application.icon-name"] ?? ""); icon = AppSearch.guessIcon(root.node?.properties["application.icon-name"] ?? "");
@@ -66,8 +66,6 @@ MouseArea {
cache: false cache: false
fillMode: Image.PreserveAspectCrop fillMode: Image.PreserveAspectCrop
clip: true clip: true
sourceSize.width: wallpaperItemColumnLayout.width
sourceSize.height: wallpaperItemColumnLayout.height - wallpaperItemColumnLayout.spacing - wallpaperItemName.height
Connections { Connections {
target: Wallpapers target: Wallpapers
@@ -102,8 +100,6 @@ MouseArea {
anchors.fill: parent anchors.fill: parent
sourceComponent: DirectoryIcon { sourceComponent: DirectoryIcon {
fileModelData: root.fileModelData fileModelData: root.fileModelData
sourceSize.width: wallpaperItemColumnLayout.width
sourceSize.height: wallpaperItemColumnLayout.height - wallpaperItemColumnLayout.spacing - wallpaperItemName.height
} }
} }
} }
@@ -71,8 +71,6 @@ ContentPage {
StyledImage { StyledImage {
id: wallpaperPreview id: wallpaperPreview
anchors.fill: parent anchors.fill: parent
sourceSize.width: parent.implicitWidth
sourceSize.height: parent.implicitHeight
fillMode: Image.PreserveAspectCrop fillMode: Image.PreserveAspectCrop
source: Config.options.background.wallpaperPath source: Config.options.background.wallpaperPath
cache: false cache: false
@@ -33,7 +33,7 @@ LockScreen {
interactables.switchToFocusedView(); interactables.switchToFocusedView();
} }
Image { StyledImage {
id: bg id: bg
z: 0 z: 0
width: parent.width width: parent.width
@@ -46,7 +46,6 @@ LockScreen {
openAnim.restart(); openAnim.restart();
} }
} }
sourceSize: Qt.size(lockSurfaceItem.width, lockSurfaceItem.height)
source: Config.options.background.wallpaperPath source: Config.options.background.wallpaperPath
fillMode: Image.PreserveAspectCrop fillMode: Image.PreserveAspectCrop
@@ -102,8 +102,6 @@ MouseArea {
readonly property int size: 48 readonly property int size: 48
width: size width: size
height: size height: size
sourceSize.width: size
sourceSize.height: size
source: root.notification.image source: root.notification.image
fillMode: Image.PreserveAspectFit fillMode: Image.PreserveAspectFit
} }
@@ -85,7 +85,6 @@ WMouseAreaButton {
active: !root.newWorkspace active: !root.newWorkspace
sourceComponent: StyledImage { sourceComponent: StyledImage {
cache: true cache: true
sourceSize: Qt.size(root.screenAspectRatio * root.wallpaperHeight, root.wallpaperHeight)
source: Config.options.background.wallpaperPath source: Config.options.background.wallpaperPath
fillMode: Image.PreserveAspectCrop fillMode: Image.PreserveAspectCrop