launcher: exact calculation for wallpaper width

Fixes #322
This commit is contained in:
2 * r + 2 * t 2025-08-23 16:08:02 +10:00
parent 56ea40a9a0
commit 66c0d0a15f
5 changed files with 36 additions and 11 deletions

View file

@ -1,4 +1,3 @@
import qs.services
import qs.config import qs.config
import qs.modules.osd as Osd import qs.modules.osd as Osd
import qs.modules.notifications as Notifications import qs.modules.notifications as Notifications
@ -64,6 +63,7 @@ Item {
id: launcher id: launcher
visibilities: root.visibilities visibilities: root.visibilities
panels: root
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: parent.bottom anchors.bottom: parent.bottom

View file

@ -11,7 +11,10 @@ import QtQuick
Item { Item {
id: root id: root
required property var wrapper
required property PersistentProperties visibilities required property PersistentProperties visibilities
required property var panels
readonly property int padding: Appearance.padding.large readonly property int padding: Appearance.padding.large
readonly property int rounding: Appearance.rounding.large readonly property int rounding: Appearance.rounding.large
@ -34,7 +37,9 @@ Item {
ContentList { ContentList {
id: list id: list
wrapper: root.wrapper
visibilities: root.visibilities visibilities: root.visibilities
panels: root.panels
search: search search: search
padding: root.padding padding: root.padding
rounding: root.rounding rounding: root.rounding

View file

@ -11,7 +11,9 @@ import QtQuick.Controls
Item { Item {
id: root id: root
required property var wrapper
required property PersistentProperties visibilities required property PersistentProperties visibilities
required property var panels
required property TextField search required property TextField search
required property int padding required property int padding
required property int rounding required property int rounding
@ -103,6 +105,8 @@ Item {
sourceComponent: WallpaperList { sourceComponent: WallpaperList {
search: root.search search: root.search
visibilities: root.visibilities visibilities: root.visibilities
panels: root.panels
wrapper: root.wrapper
} }
} }

View file

@ -12,18 +12,31 @@ PathView {
required property TextField search required property TextField search
required property PersistentProperties visibilities required property PersistentProperties visibilities
readonly property int numItems: { required property var panels
const screenWidth = QsWindow.window?.screen.width * 0.8; required property var wrapper
if (!screenWidth)
return 0; readonly property int itemWidth: Config.launcher.sizes.wallpaperWidth * 0.8 + Appearance.padding.larger * 2
const itemWidth = Config.launcher.sizes.wallpaperWidth * 0.8;
const max = Config.launcher.maxWallpapers; readonly property int numItems: {
const maxItemsOnScreen = Math.floor(screenWidth / itemWidth); const screen = QsWindow.window?.screen;
if (!screen)
return 0;
// Screen width - 4x outer rounding - 2x max side thickness (cause centered)
let outerMargins = Math.max(Config.border.thickness, panels.bar.implicitWidth);
if (panels.popouts.hasCurrent && panels.popouts.currentCenter + panels.popouts.nonAnimHeight / 2 > screen.height - wrapper.implicitHeight - Config.border.thickness * 2)
outerMargins = panels.bar.implicitWidth + panels.popouts.nonAnimWidth;
const maxWidth = screen.width - Config.border.rounding * 4 - outerMargins * 2;
if (maxWidth <= 0)
return 0;
const maxItemsOnScreen = Math.floor(maxWidth / itemWidth);
const visible = Math.min(maxItemsOnScreen, Config.launcher.maxWallpapers, scriptModel.values.length);
const visible = Math.min(maxItemsOnScreen, max, scriptModel.values.length);
if (visible === 2) if (visible === 2)
return 1; return 1;
else if (visible > 1 && visible % 2 === 0) if (visible > 1 && visible % 2 === 0)
return visible - 1; return visible - 1;
return visible; return visible;
} }
@ -45,7 +58,7 @@ PathView {
Wallpapers.preview(currentItem.modelData.path); Wallpapers.preview(currentItem.modelData.path);
} }
implicitWidth: Math.min(numItems, count) * (Config.launcher.sizes.wallpaperWidth * 0.8 + Appearance.padding.larger * 2) implicitWidth: Math.min(numItems, count) * itemWidth
pathItemCount: numItems pathItemCount: numItems
cacheItemCount: 4 cacheItemCount: 4

View file

@ -6,6 +6,7 @@ Item {
id: root id: root
required property PersistentProperties visibilities required property PersistentProperties visibilities
required property var panels
visible: height > 0 visible: height > 0
implicitHeight: 0 implicitHeight: 0
@ -50,6 +51,8 @@ Item {
Content { Content {
id: content id: content
wrapper: root
visibilities: root.visibilities visibilities: root.visibilities
panels: root.panels
} }
} }