From c8f8af226f55025f2a02c6eef73f91c91f2db50e Mon Sep 17 00:00:00 2001 From: intergrav Date: Thu, 23 Jul 2026 04:21:55 -0400 Subject: [PATCH] refactor: more improvements - queue should handle sorting and reordering massive amount of tracks much more efficiently now. also scroll lag with large selections has been fixed - made some sensible improvements to the context menu, such as submenu expansion delay, blurred background and some other improvements to its behavior - removed bold text in synced lyrics as i noticed it can cause unwanted layout changes - reverted being able to resize sidebar with keyboard, it can be done in settings --- src/lib/NowPlaying.svelte | 15 +- src/lib/Queue.svelte | 29 +-- src/lib/Sidebar.svelte | 14 +- src/lib/components/ContextMenu.svelte | 276 ++++++++++++++++---------- src/lib/components/ProgressBar.svelte | 4 +- src/lib/queue.svelte.ts | 274 +++++++++++++++---------- 6 files changed, 374 insertions(+), 238 deletions(-) diff --git a/src/lib/NowPlaying.svelte b/src/lib/NowPlaying.svelte index 31bf071..0f85076 100644 --- a/src/lib/NowPlaying.svelte +++ b/src/lib/NowPlaying.svelte @@ -482,15 +482,20 @@ $effect(() => { &.synced > :not(.current-line) { opacity: 0.5; } - - .current-line { - font-weight: bold; + &.synced > .current-line { + opacity: 1; } } .artwork-image.hidden { - opacity: 0.25; - filter: blur(16px); + opacity: 0.125; + } + + @media (prefers-reduced-transparency: no-preference) { + .artwork-image.hidden { + opacity: 0.25; + filter: blur(16px); + } } } diff --git a/src/lib/Queue.svelte b/src/lib/Queue.svelte index 9ea619e..75f8cba 100644 --- a/src/lib/Queue.svelte +++ b/src/lib/Queue.svelte @@ -29,6 +29,7 @@ import { getSortItems, goto, insertAt, + isSelected, moveHead, moveSelected, paste, @@ -42,6 +43,7 @@ import { selectAll, setRating, starSelected, + toggleSelectionRange, toggleStar, } from "./queue.svelte.js"; import { settings } from "./settings.svelte.js"; @@ -336,8 +338,8 @@ function animateMoves(moves: QueueMove[], selected = new Set()) { } function moveWithAnimation(move: () => QueueMove[]) { - const selected = new Set(queue.sel); - animateMoves(move(), selected); + const selectedBeforeMove = new Set(queue.sel); + animateMoves(move(), selectedBeforeMove); } $effect(() => { @@ -360,7 +362,7 @@ function reorderWithAnimation(direction: -1 | 1, steps = 1) { function onDragStart(event: DragEvent, index: number) { if (!event.dataTransfer) return; - if (!queue.sel.includes(index)) select(index); + if (!isSelected(index)) select(index); event.dataTransfer.effectAllowed = "move"; } @@ -490,6 +492,7 @@ function getQueueItems(index: number): Item[] { { label: t("action.select_all"), action: selectAll, disabled: empty }, { type: "separator" }, { label: t("common.sort"), items: getSortItems() }, + { type: "separator" }, { label: t("common.clear"), action: clear }, ]; } @@ -535,7 +538,10 @@ function getQueueItems(index: number): Item[] { }, ] : []), - { label: t("common.sort"), items: getSortItems() }, + { type: "separator" }, + ...(queue.sel.length > 1 + ? [{ label: t("common.sort"), items: getSortItems() }] + : []), { label: t("action.move_up"), action: () => reorderWithAnimation(-1), @@ -591,7 +597,7 @@ function getQueueItems(index: number): Item[] { } function showMenu(index: number, x?: number, y?: number) { - if (index >= 0 && !queue.sel.includes(index)) select(index); + if (index >= 0 && !isSelected(index)) select(index); const row = index >= 0 ? queueElement?.querySelector(`[data-id="queue-row-${index}"]`) @@ -673,7 +679,7 @@ function showMenu(index: number, x?: number, y?: number) { class="col btn-head pressable" aria-label={t("action.move_up")} title={t("action.move_up")} - disabled={queue.sel.includes(0)} + disabled={isSelected(0)} onclick={(e) => { e.stopPropagation(); reorderWithAnimation(-1); @@ -687,7 +693,7 @@ function showMenu(index: number, x?: number, y?: number) { class="col btn-head pressable" aria-label={t("action.move_down")} title={t("action.move_down")} - disabled={queue.sel.includes(queue.tracks.length - 1)} + disabled={isSelected(queue.tracks.length - 1)} onclick={(e) => { e.stopPropagation(); reorderWithAnimation(1); @@ -755,7 +761,7 @@ function showMenu(index: number, x?: number, y?: number) { data-id="queue-row-{index}" data-queue-key={entry.key} class:playing={queue.pos === index} - class:selected={queue.sel.includes(index)} + class:selected={isSelected(index)} class:odd={index % 2 !== 0} class:over-above={drag?.index === index && !drag.isAfter} class:over-below={drag?.index === index && drag.isAfter} @@ -771,12 +777,7 @@ function showMenu(index: number, x?: number, y?: number) { groupFrom = index; groupPhase = "to"; } else if (groupPhase === "to") { - for ( - let i = Math.min(groupFrom, index); - i <= Math.max(groupFrom, index); - i++ - ) - select(i, true); + toggleSelectionRange(groupFrom, index); groupPhase = null; groupFrom = -1; } else { diff --git a/src/lib/Sidebar.svelte b/src/lib/Sidebar.svelte index cdf68eb..2d55c6d 100644 --- a/src/lib/Sidebar.svelte +++ b/src/lib/Sidebar.svelte @@ -36,7 +36,7 @@ $effect(() => {
{ ); }} onlostpointercapture={() => (draggingSidebar = false)} - onkeydown={(e) => { - const direction = document.documentElement.dir === "rtl" ? -1 : 1; - let width = Math.round(settings.sidebarWidth); - if (e.key === "ArrowLeft") width -= direction; - else if (e.key === "ArrowRight") width += direction; - else if (e.key === "Home") width = minSidebarWidth; - else if (e.key === "End") width = maxSidebarWidth; - else return; - - e.preventDefault(); - setSidebarWidth(width); - }} >
diff --git a/src/lib/components/ContextMenu.svelte b/src/lib/components/ContextMenu.svelte index fbeff27..7f655cd 100644 --- a/src/lib/components/ContextMenu.svelte +++ b/src/lib/components/ContextMenu.svelte @@ -1,4 +1,6 @@