From ada65b094359509bfa4d4fe9b39e298a628d3fad Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Sat, 11 Oct 2025 10:04:47 -0700 Subject: [PATCH 1/8] bump fyne to 2.7 RC --- go.mod | 24 +++++++++++------------- go.sum | 48 ++++++++++++++++++++++-------------------------- 2 files changed, 33 insertions(+), 39 deletions(-) diff --git a/go.mod b/go.mod index 6e64dbb..38385b6 100644 --- a/go.mod +++ b/go.mod @@ -33,43 +33,41 @@ require ( require ( al.essio.dev/pkg/shellescape v1.5.1 // indirect - fyne.io/systray v1.11.0 // indirect - github.com/BurntSushi/toml v1.4.0 // indirect + fyne.io/systray v1.11.1-0.20250603113521-ca66a66d8b58 // indirect + github.com/BurntSushi/toml v1.5.0 // indirect github.com/danieljoos/wincred v1.2.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/fogleman/gg v1.3.0 // indirect - github.com/fredbi/uri v1.1.0 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/fyne-io/gl-js v0.1.0 // indirect - github.com/fyne-io/glfw-js v0.2.0 // indirect + github.com/fredbi/uri v1.1.1 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/fyne-io/gl-js v0.2.0 // indirect + github.com/fyne-io/glfw-js v0.3.0 // indirect github.com/fyne-io/image v0.1.1 // indirect - github.com/fyne-io/oksvg v0.1.0 // indirect + github.com/fyne-io/oksvg v0.2.0 // indirect github.com/go-audio/riff v1.0.0 // indirect github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71 // indirect github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a // indirect github.com/go-text/render v0.2.0 // indirect github.com/go-text/typesetting v0.2.1 // indirect - github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/h2non/filetype v1.1.3 // indirect github.com/hack-pad/go-indexeddb v0.3.2 // indirect github.com/hack-pad/safejs v0.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/jeandeaual/go-locale v0.0.0-20241217141322-fcc2cadd6f08 // indirect + github.com/jeandeaual/go-locale v0.0.0-20250612000132-0ef82f21eade // indirect github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 // indirect github.com/koron/go-ssdp v0.0.5 // indirect github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect github.com/nicksnyder/go-i18n/v2 v2.5.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/rymdport/portal v0.4.1 // indirect + github.com/rymdport/portal v0.4.2 // indirect github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c // indirect github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef // indirect - github.com/stretchr/testify v1.10.0 // indirect + github.com/stretchr/testify v1.11.1 // indirect github.com/yuin/goldmark v1.7.8 // indirect golang.org/x/image v0.32.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) -replace fyne.io/fyne/v2 v2.6.1 => github.com/dweymouth/fyne/v2 v2.3.0-rc1.0.20250712002006-5064d705dac4 +replace fyne.io/fyne/v2 v2.6.1 => github.com/dweymouth/fyne/v2 v2.3.0-rc1.0.20251011154419-850ce8c28ec4 replace github.com/go-audio/wav v1.1.0 => github.com/dweymouth/go-wav v0.0.0-20250719173115-e60429a83eb0 diff --git a/go.sum b/go.sum index 55c1945..4a57b6f 100644 --- a/go.sum +++ b/go.sum @@ -1,11 +1,11 @@ al.essio.dev/pkg/shellescape v1.5.1 h1:86HrALUujYS/h+GtqoB26SBEdkWfmMI6FubjXlsXyho= al.essio.dev/pkg/shellescape v1.5.1/go.mod h1:6sIqp7X2P6mThCQ7twERpZTuigpr6KbZWtls1U8I890= -fyne.io/systray v1.11.0 h1:D9HISlxSkx+jHSniMBR6fCFOUjk1x/OOOJLa9lJYAKg= -fyne.io/systray v1.11.0/go.mod h1:RVwqP9nYMo7h5zViCBHri2FgjXF7H2cub7MAq4NSoLs= +fyne.io/systray v1.11.1-0.20250603113521-ca66a66d8b58 h1:eA5/u2XRd8OUkoMqEv3IBlFYSruNlXD8bRHDiqm0VNI= +fyne.io/systray v1.11.1-0.20250603113521-ca66a66d8b58/go.mod h1:RVwqP9nYMo7h5zViCBHri2FgjXF7H2cub7MAq4NSoLs= github.com/20after4/configdir v0.1.1 h1:ylL5dO+aGxBV4jDtG9Ej9hZfeE8Fw9jULQVq0N+ErJ8= github.com/20after4/configdir v0.1.1/go.mod h1:kZ7yOiD6MFUABqBI2/N62QA1wyEB8sGeI+mygme1pl4= -github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= -github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= +github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/boxes-ltd/imaging v1.7.1 h1:JlfPQkr9sowLuPY24OLNw1Wa0UjriPVo2BN0YyxdCf0= @@ -25,8 +25,8 @@ github.com/dweymouth/fyne-advanced-list v0.0.0-20250211191927-58ea85eec72c h1:UX github.com/dweymouth/fyne-advanced-list v0.0.0-20250211191927-58ea85eec72c/go.mod h1:Idgzr4LYzve8IPHF1stLO1bdGQZnDKt/bT9WfJflCGw= github.com/dweymouth/fyne-tooltip v0.3.0 h1:NKCyTkh9NtvnTsiHtTOtaJzRDOFYP8AckQ2tyhOh6JY= github.com/dweymouth/fyne-tooltip v0.3.0/go.mod h1:m04ShLW/Tp6LXrNieTumApvNgo7YSB+wi+jZTN+kDBU= -github.com/dweymouth/fyne/v2 v2.3.0-rc1.0.20250712002006-5064d705dac4 h1:Q3r94AcVL8yaF4Nrd3EQFKyLL3UN/zHPkj+My9B2vCQ= -github.com/dweymouth/fyne/v2 v2.3.0-rc1.0.20250712002006-5064d705dac4/go.mod h1:YZt7SksjvrSNJCwbWFV32WON3mE1Sr7L41D29qMZ/lU= +github.com/dweymouth/fyne/v2 v2.3.0-rc1.0.20251011154419-850ce8c28ec4 h1:hE3rX7T8yAr2Aecyqf3Zf8K1whlv6waOIrOFlamxToc= +github.com/dweymouth/fyne/v2 v2.3.0-rc1.0.20251011154419-850ce8c28ec4/go.mod h1:xClVlrhxl7D+LT+BWYmcrW4Nf+dJTvkhnPgji7spAwE= github.com/dweymouth/go-jellyfin v0.0.0-20250928223159-bd2fb9681ef5 h1:Or5VJodg7cGmdnBIcS+FrEH0twBi7mZsFCz6V0vCOQI= github.com/dweymouth/go-jellyfin v0.0.0-20250928223159-bd2fb9681ef5/go.mod h1:fcUagHBaQnt06GmBAllNE0J4O/7064zXRWdqnTTtVjI= github.com/dweymouth/go-wav v0.0.0-20250719173115-e60429a83eb0 h1:mYcctuWgVArHhSLJxndlUM43C3hoE18BLDBkXKM2tl0= @@ -35,20 +35,18 @@ github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g= github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw= -github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= -github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fredbi/uri v1.1.0 h1:OqLpTXtyRg9ABReqvDGdJPqZUxs8cyBDOMXBbskCaB8= -github.com/fredbi/uri v1.1.0/go.mod h1:aYTUoAXBOq7BLfVJ8GnKmfcuURosB1xyHDIfWeC/iW4= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/fyne-io/gl-js v0.1.0 h1:8luJzNs0ntEAJo+8x8kfUOXujUlP8gB3QMOxO2mUdpM= -github.com/fyne-io/gl-js v0.1.0/go.mod h1:ZcepK8vmOYLu96JoxbCKJy2ybr+g1pTnaBDdl7c3ajI= -github.com/fyne-io/glfw-js v0.2.0 h1:8GUZtN2aCoTPNqgRDxK5+kn9OURINhBEBc7M4O1KrmM= -github.com/fyne-io/glfw-js v0.2.0/go.mod h1:Ri6te7rdZtBgBpxLW19uBpp3Dl6K9K/bRaYdJ22G8Jk= +github.com/fredbi/uri v1.1.1 h1:xZHJC08GZNIUhbP5ImTHnt5Ya0T8FI2VAwI/37kh2Ko= +github.com/fredbi/uri v1.1.1/go.mod h1:4+DZQ5zBjEwQCDmXW5JdIjz0PUA+yJbvtBv+u+adr5o= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fyne-io/gl-js v0.2.0 h1:+EXMLVEa18EfkXBVKhifYB6OGs3HwKO3lUElA0LlAjs= +github.com/fyne-io/gl-js v0.2.0/go.mod h1:ZcepK8vmOYLu96JoxbCKJy2ybr+g1pTnaBDdl7c3ajI= +github.com/fyne-io/glfw-js v0.3.0 h1:d8k2+Y7l+zy2pc7wlGRyPfTgZoqDf3AI4G+2zOWhWUk= +github.com/fyne-io/glfw-js v0.3.0/go.mod h1:Ri6te7rdZtBgBpxLW19uBpp3Dl6K9K/bRaYdJ22G8Jk= github.com/fyne-io/image v0.1.1 h1:WH0z4H7qfvNUw5l4p3bC1q70sa5+YWVt6HCj7y4VNyA= github.com/fyne-io/image v0.1.1/go.mod h1:xrfYBh6yspc+KjkgdZU/ifUC9sPA5Iv7WYUBzQKK7JM= -github.com/fyne-io/oksvg v0.1.0 h1:7EUKk3HV3Y2E+qypp3nWqMXD7mum0hCw2KEGhI1fnBw= -github.com/fyne-io/oksvg v0.1.0/go.mod h1:dJ9oEkPiWhnTFNCmRgEze+YNprJF7YRbpjgpWS4kzoI= +github.com/fyne-io/oksvg v0.2.0 h1:mxcGU2dx6nwjJsSA9PCYZDuoAcsZ/OuJlvg/Q9Njfo8= +github.com/fyne-io/oksvg v0.2.0/go.mod h1:dJ9oEkPiWhnTFNCmRgEze+YNprJF7YRbpjgpWS4kzoI= github.com/go-audio/aiff v0.0.0-20180403003018-6c3a8a6aff12/go.mod h1:AMSAp6W1zd0koOdX6QDgGIuBDTUvLa2SLQtm7d9eM3c= github.com/go-audio/aiff v1.0.0/go.mod h1:Kazp+9JR/Y1ITCXaDlO6OIIOrz6eGGAn+dGT04V4HPM= github.com/go-audio/audio v0.0.0-20180206231410-b697a35b5608/go.mod h1:6uAu0+H2lHkwdGsAY+j2wHPNPpPoeg5AaEFh9FlA+Zs= @@ -67,8 +65,6 @@ github.com/go-text/typesetting-utils v0.0.0-20241103174707-87a29e9e6066 h1:qCuYC github.com/go-text/typesetting-utils v0.0.0-20241103174707-87a29e9e6066/go.mod h1:DDxDdQEnB70R8owOx3LVpEFvpMK9eeH1o2r0yZhFI9o= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/google/pprof v0.0.0-20211214055906-6f57359322fd h1:1FjCyPC+syAzJ5/2S8fqdZK1R22vvA0J7JZKcuOIQ7Y= github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= @@ -87,8 +83,8 @@ github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB1 github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= -github.com/jeandeaual/go-locale v0.0.0-20241217141322-fcc2cadd6f08 h1:wMeVzrPO3mfHIWLZtDcSaGAe2I4PW9B/P5nMkRSwCAc= -github.com/jeandeaual/go-locale v0.0.0-20241217141322-fcc2cadd6f08/go.mod h1:ZDXo8KHryOWSIqnsb/CiDq7hQUYryCgdVnxbj8tDG7o= +github.com/jeandeaual/go-locale v0.0.0-20250612000132-0ef82f21eade h1:FmusiCI1wHw+XQbvL9M+1r/C3SPqKrmBaIOYwVfQoDE= +github.com/jeandeaual/go-locale v0.0.0-20250612000132-0ef82f21eade/go.mod h1:ZDXo8KHryOWSIqnsb/CiDq7hQUYryCgdVnxbj8tDG7o= github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 h1:YLvr1eE6cdCqjOe972w/cYF+FjW34v27+9Vo5106B4M= github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25/go.mod h1:kLgvv7o6UM+0QSf0QjAse3wReFDsb9qbZJdfexWlrQw= github.com/koron/go-ssdp v0.0.5 h1:E1iSMxIs4WqxTbIBLtmNBeOOC+1sCIXQeqTWVnpmwhk= @@ -114,8 +110,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/quarckster/go-mpris-server v1.0.3 h1:ef6d3DpxlORtdEBHnhQ/j3gS0Z3+YUfXeJhC9L9DZvA= github.com/quarckster/go-mpris-server v1.0.3/go.mod h1:2b4IdrpnEoEfU+6fQKjYhAgdvsiz4JxmTpDAUrMJVO4= -github.com/rymdport/portal v0.4.1 h1:2dnZhjf5uEaeDjeF/yBIeeRo6pNI2QAKm7kq1w/kbnA= -github.com/rymdport/portal v0.4.1/go.mod h1:kFF4jslnJ8pD5uCi17brj/ODlfIidOxlgUDTO5ncnC4= +github.com/rymdport/portal v0.4.2 h1:7jKRSemwlTyVHHrTGgQg7gmNPJs88xkbKcIL3NlcmSU= +github.com/rymdport/portal v0.4.2/go.mod h1:kFF4jslnJ8pD5uCi17brj/ODlfIidOxlgUDTO5ncnC4= github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c h1:km8GpoQut05eY3GiYWEedbTT0qnSxrCjsVbb7yKY1KE= github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c/go.mod h1:cNQ3dwVJtS5Hmnjxy6AgTPd0Inb3pW05ftPSX7NZO7Q= github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef h1:Ch6Q+AZUxDBCVqdkI8FSpFyZDtCVBc2VmejdNrm5rRQ= @@ -128,8 +124,8 @@ github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/supersonic-app/fyne-lyrics v0.0.0-20250614151306-b1880a70a410 h1:wuDHCo6SU6r0KMm0EuI5FGVJCuLK4hcuPcMKmln8oCA= github.com/supersonic-app/fyne-lyrics v0.0.0-20250614151306-b1880a70a410/go.mod h1:XvGBPgXWkKrK+5OsoVkTcTZmwZac1Sj6miEn8q6uA20= github.com/supersonic-app/go-glfw/v3.3/glfw v0.0.0-20250906235349-c09e5a2f6b75 h1:aZnnCd5QHk/5/K5L4HpPoDwzlXXRC/hJdecdKSOOJFE= From 9f399a447c91eb845033666da6e4f63c59276864 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Wed, 5 Nov 2025 08:28:12 -0800 Subject: [PATCH 2/8] use new Icon property for search field --- ui/widgets/searchentry.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/widgets/searchentry.go b/ui/widgets/searchentry.go index c71e4da..9908d7f 100644 --- a/ui/widgets/searchentry.go +++ b/ui/widgets/searchentry.go @@ -31,6 +31,7 @@ func NewSearchEntry() *SearchEntry { // For use only by extending widgets func (sf *SearchEntry) Init() { + sf.Icon = theme.SearchIcon() sf.PlaceHolder = lang.L("Search") sf.ActionItem = NewClearTextButton(func() { sf.SetText("") @@ -83,7 +84,7 @@ func (s *SearchEntry) updateActionButton() bool { btn := s.ActionItem.(*searchActionButton) oldResouce := btn.Resource if s.Text == "" { - btn.Resource = theme.SearchIcon() + btn.Resource = nil } else { btn.Resource = theme.ContentClearIcon() } @@ -111,7 +112,6 @@ func (s *SearchEntry) sendSearch(text string) { func NewClearTextButton(onTapped func()) *searchActionButton { c := &searchActionButton{OnTapped: onTapped} c.ExtendBaseWidget(c) - c.Resource = theme.SearchIcon() c.icon = widget.NewIcon(c.Resource) return c } From c14342eff8985fb2e38b1767a6509e24b3bfc17d Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Fri, 7 Nov 2025 07:46:10 -0800 Subject: [PATCH 3/8] use rounded image corners (TODO: allow disabling this) --- ui/bottompanel.go | 2 ++ ui/browsing/albumpage.go | 1 + ui/browsing/artistpage.go | 1 + ui/browsing/nowplayingpage.go | 1 + ui/browsing/playlistpage.go | 1 + ui/theme/themedrectangle.go | 14 ++++++-------- ui/util/util.go | 2 +- ui/widgets/gridview.go | 1 + ui/widgets/imageplaceholder.go | 3 +++ ui/widgets/largenowplayingcard.go | 4 +++- ui/widgets/listheader.go | 2 +- ui/widgets/nowplayingcard.go | 8 +++++++- ui/widgets/playqueuelist.go | 1 + ui/widgets/tracklistrow.go | 1 + 14 files changed, 30 insertions(+), 12 deletions(-) diff --git a/ui/bottompanel.go b/ui/bottompanel.go index ce0a2ba..33e534e 100644 --- a/ui/bottompanel.go +++ b/ui/bottompanel.go @@ -11,6 +11,7 @@ import ( "fyne.io/fyne/v2" "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/widget" ) @@ -47,6 +48,7 @@ func NewBottomPanel(pm *backend.PlaybackManager, im *backend.ImageManager, contr pm.OnStopped(util.FyneDoFunc(func() { bp.Controls.SetPlaying(false) })) bp.NowPlaying = widgets.NewNowPlayingCard() + bp.NowPlaying.ImageCornerRadius = theme.InputRadiusSize() bp.NowPlaying.OnCoverTapped = func() { contr.NavigateTo(controller.NowPlayingRoute()) } diff --git a/ui/browsing/albumpage.go b/ui/browsing/albumpage.go index f29294f..3cf3d04 100644 --- a/ui/browsing/albumpage.go +++ b/ui/browsing/albumpage.go @@ -231,6 +231,7 @@ func NewAlbumPageHeader(page *AlbumPage) *AlbumPageHeader { a.ExtendBaseWidget(a) a.cover = widgets.NewImagePlaceholder(myTheme.AlbumIcon, 225) a.cover.OnTapped = func(*fyne.PointEvent) { go a.showPopUpCover() } + a.cover.CornerRadius = theme.InputRadiusSize() a.titleLabel = widget.NewRichTextWithText("") a.titleLabel.Truncation = fyne.TextTruncateEllipsis diff --git a/ui/browsing/artistpage.go b/ui/browsing/artistpage.go index f62523f..1005c3f 100644 --- a/ui/browsing/artistpage.go +++ b/ui/browsing/artistpage.go @@ -503,6 +503,7 @@ func NewArtistPageHeader(page *ArtistPage) *ArtistPageHeader { } a.artistImage = widgets.NewImagePlaceholder(myTheme.ArtistIcon, 225) a.artistImage.OnTapped = func(*fyne.PointEvent) { a.showPopUpCover() } + a.artistImage.CornerRadius = theme.InputRadiusSize() a.favoriteBtn = widgets.NewFavoriteButton(func() { go a.toggleFavorited() }) a.playBtn = widget.NewButtonWithIcon(lang.L("Play Discography"), theme.MediaPlayIcon(), func() { go a.artistPage.pm.PlayArtistDiscography(a.artistID, false /*shuffle*/) diff --git a/ui/browsing/nowplayingpage.go b/ui/browsing/nowplayingpage.go index 48fe285..04840a6 100644 --- a/ui/browsing/nowplayingpage.go +++ b/ui/browsing/nowplayingpage.go @@ -110,6 +110,7 @@ func NewNowPlayingPage( pm.OnStopped(doFmtStatus) a.card = widgets.NewLargeNowPlayingCard() + a.card.ImageCornerRadius = theme.InputRadiusSize() a.card.OnAlbumNameTapped = func() { contr.NavigateTo(controller.AlbumRoute(a.nowPlaying.Metadata().AlbumID)) } diff --git a/ui/browsing/playlistpage.go b/ui/browsing/playlistpage.go index 5448eb1..40b8e48 100644 --- a/ui/browsing/playlistpage.go +++ b/ui/browsing/playlistpage.go @@ -328,6 +328,7 @@ func NewPlaylistPageHeader(page *PlaylistPage) *PlaylistPageHeader { a.image = widgets.NewImagePlaceholder(myTheme.PlaylistIcon, 225) a.image.OnTapped = func(*fyne.PointEvent) { go a.showPopUpCover() } + a.image.CornerRadius = theme.InputRadiusSize() a.titleLabel = util.NewTruncatingRichText() a.titleLabel.Segments[0].(*widget.TextSegment).Style = widget.RichTextStyle{ SizeName: theme.SizeNameHeadingText, diff --git a/ui/theme/themedrectangle.go b/ui/theme/themedrectangle.go index 34ca653..603f0a3 100644 --- a/ui/theme/themedrectangle.go +++ b/ui/theme/themedrectangle.go @@ -15,11 +15,11 @@ type ThemedRectangle struct { rect *canvas.Rectangle - ColorName fyne.ThemeColorName - Translucent bool - BorderWidth float32 - BorderColorName fyne.ThemeColorName - CornerRadiusName fyne.ThemeSizeName + ColorName fyne.ThemeColorName + Translucent bool + BorderWidth float32 + BorderColorName fyne.ThemeColorName + CornerRadius float32 } func NewThemedRectangle(colorName fyne.ThemeColorName) *ThemedRectangle { @@ -43,9 +43,7 @@ func (t *ThemedRectangle) Refresh() { t.rect.FillColor = fc t.rect.StrokeWidth = t.BorderWidth t.rect.StrokeColor = theme.Color(t.BorderColorName, settings.ThemeVariant()) - if t.CornerRadiusName != "" { - t.rect.CornerRadius = theme.Size(t.CornerRadiusName) - } + t.rect.CornerRadius = t.CornerRadius t.BaseWidget.Refresh() } diff --git a/ui/util/util.go b/ui/util/util.go index 9891499..afcf9c6 100644 --- a/ui/util/util.go +++ b/ui/util/util.go @@ -365,7 +365,7 @@ func AddHeaderBackground(obj fyne.CanvasObject) *fyne.Container { func AddHeaderBackgroundWithColorName(obj fyne.CanvasObject, colorName fyne.ThemeColorName) *fyne.Container { bgrnd := myTheme.NewThemedRectangle(colorName) - bgrnd.CornerRadiusName = theme.SizeNameInputRadius + bgrnd.CornerRadius = theme.InputRadiusSize() return container.NewStack(bgrnd, container.New(&layout.CustomPaddedLayout{LeftPadding: 10, RightPadding: 10, TopPadding: 10, BottomPadding: 10}, obj)) diff --git a/ui/widgets/gridview.go b/ui/widgets/gridview.go index 03142d4..f263b8e 100644 --- a/ui/widgets/gridview.go +++ b/ui/widgets/gridview.go @@ -304,6 +304,7 @@ func (g *GridView) createGridWrap() { func (g *GridView) createNewItemCard() fyne.CanvasObject { card := NewGridViewItem(g.Placeholder) + card.Cover.Im.CornerRadius = theme.InputRadiusSize() card.SetSize(backend.AppInstance().Config.GridView.CardSize) card.ItemIndex = -1 card.ImgLoader = util.NewThumbnailLoader(g.imageFetcher, card.Cover.SetImage) diff --git a/ui/widgets/imageplaceholder.go b/ui/widgets/imageplaceholder.go index 5cc2365..3caa93c 100644 --- a/ui/widgets/imageplaceholder.go +++ b/ui/widgets/imageplaceholder.go @@ -17,6 +17,7 @@ import ( type ImagePlaceholder struct { ScaleMode canvas.ImageScale PlaceholderIcon fyne.Resource + CornerRadius float32 widget.BaseWidget content *fyne.Container @@ -109,6 +110,8 @@ func (i *ImagePlaceholder) Refresh() { i.imageDisp.Hidden = !i.HaveImage() i.imageDisp.ScaleMode = i.ScaleMode i.iconImage.ScaleMode = i.ScaleMode + i.imageDisp.CornerRadius = i.CornerRadius + i.border.CornerRadius = i.CornerRadius i.BaseWidget.Refresh() } diff --git a/ui/widgets/largenowplayingcard.go b/ui/widgets/largenowplayingcard.go index 4935d84..99452da 100644 --- a/ui/widgets/largenowplayingcard.go +++ b/ui/widgets/largenowplayingcard.go @@ -19,7 +19,8 @@ import ( type LargeNowPlayingCard struct { CaptionedImage - DisableRating bool + DisableRating bool + ImageCornerRadius float32 isRadio bool trackName *widget.RichText @@ -163,5 +164,6 @@ func (n *LargeNowPlayingCard) Refresh() { } else { n.rating.Enable() } + n.cover.CornerRadius = n.ImageCornerRadius n.BaseWidget.Refresh() } diff --git a/ui/widgets/listheader.go b/ui/widgets/listheader.go index 09359d5..2c0ed12 100644 --- a/ui/widgets/listheader.go +++ b/ui/widgets/listheader.go @@ -64,7 +64,7 @@ func NewListHeader(cols []ListColumn, layout *layouts.ColumnsLayout) *ListHeader l.columnVisible[i] = true } rect := myTheme.NewThemedRectangle(myTheme.ColorNameListHeader) - rect.CornerRadiusName = theme.SizeNameSelectionRadius + rect.CornerRadius = theme.SelectionRadiusSize() l.container = container.NewStack(rect, l.columnsContainer) l.ExtendBaseWidget(l) l.buildColumns() diff --git a/ui/widgets/nowplayingcard.go b/ui/widgets/nowplayingcard.go index 5618b06..1538a1c 100644 --- a/ui/widgets/nowplayingcard.go +++ b/ui/widgets/nowplayingcard.go @@ -23,7 +23,8 @@ import ( type NowPlayingCard struct { widget.BaseWidget - DisableRating bool + DisableRating bool + ImageCornerRadius float32 trackName *OptionHyperlink artistName *MultiHyperlink @@ -163,6 +164,11 @@ func (n *NowPlayingCard) Update(track mediaprovider.MediaItem) { n.Refresh() } +func (n *NowPlayingCard) Refresh() { + n.cover.CornerRadius = n.ImageCornerRadius + n.BaseWidget.Refresh() +} + func (n *NowPlayingCard) SetImage(cover image.Image) { n.cover.SetImage(cover, true) } diff --git a/ui/widgets/playqueuelist.go b/ui/widgets/playqueuelist.go index 06947ce..9ee3e32 100644 --- a/ui/widgets/playqueuelist.go +++ b/ui/widgets/playqueuelist.go @@ -389,6 +389,7 @@ func NewPlayQueueListRow(playQueueList *PlayQueueList, im *backend.ImageManager, p.ExtendBaseWidget(p) p.cover.ScaleMode = canvas.ImageScaleFastest + p.cover.CornerRadius = theme.InputRadiusSize() p.title.OnMouseIn = p.MouseIn p.title.OnMouseOut = p.MouseOut p.artist.OnTapped = playQueueList.onArtistTapped diff --git a/ui/widgets/tracklistrow.go b/ui/widgets/tracklistrow.go index e4dd0be..847afdc 100644 --- a/ui/widgets/tracklistrow.go +++ b/ui/widgets/tracklistrow.go @@ -274,6 +274,7 @@ func NewExpandedTracklistRow(tracklist *Tracklist, im *backend.ImageManager, pla t.playingIcon = playingIcon t.img = NewImagePlaceholder(myTheme.TracksIcon, tracklistThumbnailSize) t.img.ScaleMode = canvas.ImageScaleFastest + t.img.CornerRadius = theme.InputRadiusSize() t.imageLoader = util.NewThumbnailLoader(im, func(i image.Image) { t.img.SetImage(i, false) From 2680676fe92644468878267b6a22bc689150d28c Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Fri, 7 Nov 2025 08:00:29 -0800 Subject: [PATCH 4/8] #566: left click on systray icon raises main window --- ui/mainwindow.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ui/mainwindow.go b/ui/mainwindow.go index 9e580a5..d5ffa84 100644 --- a/ui/mainwindow.go +++ b/ui/mainwindow.go @@ -413,6 +413,11 @@ func (m *MainWindow) SetupSystemTrayMenu(appName string, fyneApp fyne.App) { ) desk.SetSystemTrayMenu(menu) desk.SetSystemTrayIcon(res.ResAppicon256Png) + if runtime.GOOS != "darwin" { + // Left-click opening systray menu instead of raising window + // is standard behavior on Mac. + desk.SetSystemTrayWindow(m.Window) + } m.haveSystemTray = true } } From 679e9a9b1fc2b22ad9d5076b10a88cd9de86c029 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Sat, 15 Nov 2025 10:13:48 -0800 Subject: [PATCH 5/8] update Fyne to 2.7.1 --- go.mod | 4 ++-- go.sum | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 38385b6..a025346 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/dweymouth/supersonic go 1.24.0 require ( - fyne.io/fyne/v2 v2.6.1 + fyne.io/fyne/v2 v2.7.1 github.com/20after4/configdir v0.1.1 github.com/Microsoft/go-winio v0.6.2 github.com/boxes-ltd/imaging v1.7.1 @@ -67,7 +67,7 @@ require ( gopkg.in/yaml.v3 v3.0.1 // indirect ) -replace fyne.io/fyne/v2 v2.6.1 => github.com/dweymouth/fyne/v2 v2.3.0-rc1.0.20251011154419-850ce8c28ec4 +replace fyne.io/fyne/v2 v2.7.1 => github.com/dweymouth/fyne/v2 v2.3.0-rc1.0.20251115180245-c1288f7754ab replace github.com/go-audio/wav v1.1.0 => github.com/dweymouth/go-wav v0.0.0-20250719173115-e60429a83eb0 diff --git a/go.sum b/go.sum index 4a57b6f..c5193bc 100644 --- a/go.sum +++ b/go.sum @@ -25,8 +25,8 @@ github.com/dweymouth/fyne-advanced-list v0.0.0-20250211191927-58ea85eec72c h1:UX github.com/dweymouth/fyne-advanced-list v0.0.0-20250211191927-58ea85eec72c/go.mod h1:Idgzr4LYzve8IPHF1stLO1bdGQZnDKt/bT9WfJflCGw= github.com/dweymouth/fyne-tooltip v0.3.0 h1:NKCyTkh9NtvnTsiHtTOtaJzRDOFYP8AckQ2tyhOh6JY= github.com/dweymouth/fyne-tooltip v0.3.0/go.mod h1:m04ShLW/Tp6LXrNieTumApvNgo7YSB+wi+jZTN+kDBU= -github.com/dweymouth/fyne/v2 v2.3.0-rc1.0.20251011154419-850ce8c28ec4 h1:hE3rX7T8yAr2Aecyqf3Zf8K1whlv6waOIrOFlamxToc= -github.com/dweymouth/fyne/v2 v2.3.0-rc1.0.20251011154419-850ce8c28ec4/go.mod h1:xClVlrhxl7D+LT+BWYmcrW4Nf+dJTvkhnPgji7spAwE= +github.com/dweymouth/fyne/v2 v2.3.0-rc1.0.20251115180245-c1288f7754ab h1:3a3Dop0y5uGYSgjoyReYlwZqpo7xFQu+tULfZueCjEQ= +github.com/dweymouth/fyne/v2 v2.3.0-rc1.0.20251115180245-c1288f7754ab/go.mod h1:xClVlrhxl7D+LT+BWYmcrW4Nf+dJTvkhnPgji7spAwE= github.com/dweymouth/go-jellyfin v0.0.0-20250928223159-bd2fb9681ef5 h1:Or5VJodg7cGmdnBIcS+FrEH0twBi7mZsFCz6V0vCOQI= github.com/dweymouth/go-jellyfin v0.0.0-20250928223159-bd2fb9681ef5/go.mod h1:fcUagHBaQnt06GmBAllNE0J4O/7064zXRWdqnTTtVjI= github.com/dweymouth/go-wav v0.0.0-20250719173115-e60429a83eb0 h1:mYcctuWgVArHhSLJxndlUM43C3hoE18BLDBkXKM2tl0= From 2afef81a11b8431ceed3e04cac76909f853152bf Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Sat, 15 Nov 2025 10:32:01 -0800 Subject: [PATCH 6/8] add setting to disable rounded image corners --- backend/config.go | 8 +++++--- ui/bottompanel.go | 2 -- ui/browsing/albumpage.go | 1 - ui/browsing/artistpage.go | 1 - ui/browsing/nowplayingpage.go | 1 - ui/browsing/playlistpage.go | 1 - ui/dialogs/settingsdialog.go | 9 +++++++++ ui/theme/theme.go | 7 +++++++ ui/widgets/gridview.go | 1 - ui/widgets/imageplaceholder.go | 6 +++--- ui/widgets/largenowplayingcard.go | 4 +--- ui/widgets/nowplayingcard.go | 4 +--- ui/widgets/playqueuelist.go | 1 - ui/widgets/tracklistrow.go | 1 - 14 files changed, 26 insertions(+), 21 deletions(-) diff --git a/backend/config.go b/backend/config.go index 4c9091c..354ba28 100644 --- a/backend/config.go +++ b/backend/config.go @@ -148,8 +148,9 @@ type ReplayGainConfig struct { } type ThemeConfig struct { - ThemeFile string - Appearance string + ThemeFile string + Appearance string + UseRoundedImageCorners bool } type TranscodingConfig struct { @@ -284,7 +285,8 @@ func DefaultConfig(appVersionTag string) *Config { MaxBitRateKBPS: 160, }, Theme: ThemeConfig{ - Appearance: "Dark", + Appearance: "Dark", + UseRoundedImageCorners: true, }, PeakMeter: PeakMeterConfig{ WindowWidth: 375, diff --git a/ui/bottompanel.go b/ui/bottompanel.go index 33e534e..ce0a2ba 100644 --- a/ui/bottompanel.go +++ b/ui/bottompanel.go @@ -11,7 +11,6 @@ import ( "fyne.io/fyne/v2" "fyne.io/fyne/v2/container" - "fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/widget" ) @@ -48,7 +47,6 @@ func NewBottomPanel(pm *backend.PlaybackManager, im *backend.ImageManager, contr pm.OnStopped(util.FyneDoFunc(func() { bp.Controls.SetPlaying(false) })) bp.NowPlaying = widgets.NewNowPlayingCard() - bp.NowPlaying.ImageCornerRadius = theme.InputRadiusSize() bp.NowPlaying.OnCoverTapped = func() { contr.NavigateTo(controller.NowPlayingRoute()) } diff --git a/ui/browsing/albumpage.go b/ui/browsing/albumpage.go index 3cf3d04..f29294f 100644 --- a/ui/browsing/albumpage.go +++ b/ui/browsing/albumpage.go @@ -231,7 +231,6 @@ func NewAlbumPageHeader(page *AlbumPage) *AlbumPageHeader { a.ExtendBaseWidget(a) a.cover = widgets.NewImagePlaceholder(myTheme.AlbumIcon, 225) a.cover.OnTapped = func(*fyne.PointEvent) { go a.showPopUpCover() } - a.cover.CornerRadius = theme.InputRadiusSize() a.titleLabel = widget.NewRichTextWithText("") a.titleLabel.Truncation = fyne.TextTruncateEllipsis diff --git a/ui/browsing/artistpage.go b/ui/browsing/artistpage.go index 1005c3f..f62523f 100644 --- a/ui/browsing/artistpage.go +++ b/ui/browsing/artistpage.go @@ -503,7 +503,6 @@ func NewArtistPageHeader(page *ArtistPage) *ArtistPageHeader { } a.artistImage = widgets.NewImagePlaceholder(myTheme.ArtistIcon, 225) a.artistImage.OnTapped = func(*fyne.PointEvent) { a.showPopUpCover() } - a.artistImage.CornerRadius = theme.InputRadiusSize() a.favoriteBtn = widgets.NewFavoriteButton(func() { go a.toggleFavorited() }) a.playBtn = widget.NewButtonWithIcon(lang.L("Play Discography"), theme.MediaPlayIcon(), func() { go a.artistPage.pm.PlayArtistDiscography(a.artistID, false /*shuffle*/) diff --git a/ui/browsing/nowplayingpage.go b/ui/browsing/nowplayingpage.go index 04840a6..48fe285 100644 --- a/ui/browsing/nowplayingpage.go +++ b/ui/browsing/nowplayingpage.go @@ -110,7 +110,6 @@ func NewNowPlayingPage( pm.OnStopped(doFmtStatus) a.card = widgets.NewLargeNowPlayingCard() - a.card.ImageCornerRadius = theme.InputRadiusSize() a.card.OnAlbumNameTapped = func() { contr.NavigateTo(controller.AlbumRoute(a.nowPlaying.Metadata().AlbumID)) } diff --git a/ui/browsing/playlistpage.go b/ui/browsing/playlistpage.go index 40b8e48..5448eb1 100644 --- a/ui/browsing/playlistpage.go +++ b/ui/browsing/playlistpage.go @@ -328,7 +328,6 @@ func NewPlaylistPageHeader(page *PlaylistPage) *PlaylistPageHeader { a.image = widgets.NewImagePlaceholder(myTheme.PlaylistIcon, 225) a.image.OnTapped = func(*fyne.PointEvent) { go a.showPopUpCover() } - a.image.CornerRadius = theme.InputRadiusSize() a.titleLabel = util.NewTruncatingRichText() a.titleLabel.Segments[0].(*widget.TextSegment).Style = widget.RichTextStyle{ SizeName: theme.SizeNameHeadingText, diff --git a/ui/dialogs/settingsdialog.go b/ui/dialogs/settingsdialog.go index a45419f..2bf334b 100644 --- a/ui/dialogs/settingsdialog.go +++ b/ui/dialogs/settingsdialog.go @@ -573,6 +573,14 @@ func (s *SettingsDialog) createAppearanceTab(window fyne.Window) *container.TabI nowPlayingBackground := widget.NewCheckWithData(lang.L("Use blurred album cover for Now Playing page background"), binding.BindBool(&s.config.NowPlayingConfig.UseBackgroundImage)) + useRoundedImageCorners := widget.NewCheck(lang.L("Use rounded image corners"), func(b bool) { + s.config.Theme.UseRoundedImageCorners = b + if s.OnPageNeedsRefresh != nil { + s.OnPageNeedsRefresh() + } + }) + useRoundedImageCorners.Checked = s.config.Theme.UseRoundedImageCorners + return container.NewTabItem(lang.L("Appearance"), container.NewVBox( util.NewHSpace(0), // insert a theme.Padding amount of space at top container.NewBorder(nil, nil, widget.NewLabel(lang.L("Theme")), /*left*/ @@ -586,6 +594,7 @@ func (s *SettingsDialog) createAppearanceTab(window fyne.Window) *container.TabI s.newSectionSeparator(), useWaveformSeekbar, nowPlayingBackground, + useRoundedImageCorners, s.newSectionSeparator(), widget.NewRichText(&widget.TextSegment{Text: lang.L("Application font"), Style: util.BoldRichTextStyle}), container.New(layout.NewFormLayout(), diff --git a/ui/theme/theme.go b/ui/theme/theme.go index a05f30e..8972e06 100644 --- a/ui/theme/theme.go +++ b/ui/theme/theme.go @@ -33,6 +33,8 @@ const ( SizeNameSubText fyne.ThemeSizeName = "subText" // in between Text and Caption SizeNameSuffixText fyne.ThemeSizeName = "suffixText" // a tiny bit smaller than subText + SizeNameImageCornerRadius fyne.ThemeSizeName = "imageCornerRadius" + AnimationDurationShort = canvas.DurationShort AnimationDurationMedium = 225 * time.Millisecond AnimationDurationLong = canvas.DurationStandard @@ -286,6 +288,11 @@ func (m *MyTheme) Size(name fyne.ThemeSizeName) float32 { return 12 case theme.SizeNameScrollBar: return 14 + case SizeNameImageCornerRadius: + if m.config.UseRoundedImageCorners { + return theme.InputRadiusSize() + } + return 0 default: return theme.DefaultTheme().Size(name) } diff --git a/ui/widgets/gridview.go b/ui/widgets/gridview.go index f263b8e..03142d4 100644 --- a/ui/widgets/gridview.go +++ b/ui/widgets/gridview.go @@ -304,7 +304,6 @@ func (g *GridView) createGridWrap() { func (g *GridView) createNewItemCard() fyne.CanvasObject { card := NewGridViewItem(g.Placeholder) - card.Cover.Im.CornerRadius = theme.InputRadiusSize() card.SetSize(backend.AppInstance().Config.GridView.CardSize) card.ItemIndex = -1 card.ImgLoader = util.NewThumbnailLoader(g.imageFetcher, card.Cover.SetImage) diff --git a/ui/widgets/imageplaceholder.go b/ui/widgets/imageplaceholder.go index 3caa93c..d84c672 100644 --- a/ui/widgets/imageplaceholder.go +++ b/ui/widgets/imageplaceholder.go @@ -14,10 +14,10 @@ import ( // A widget that can display an image or else // a placeholder with a rectangular border frame // and an icon positioned in the center of the frame. +// The corner radius is taken from the app theme. type ImagePlaceholder struct { ScaleMode canvas.ImageScale PlaceholderIcon fyne.Resource - CornerRadius float32 widget.BaseWidget content *fyne.Container @@ -110,8 +110,8 @@ func (i *ImagePlaceholder) Refresh() { i.imageDisp.Hidden = !i.HaveImage() i.imageDisp.ScaleMode = i.ScaleMode i.iconImage.ScaleMode = i.ScaleMode - i.imageDisp.CornerRadius = i.CornerRadius - i.border.CornerRadius = i.CornerRadius + i.imageDisp.CornerRadius = i.Theme().Size(myTheme.SizeNameImageCornerRadius) + i.border.CornerRadius = i.imageDisp.CornerRadius i.BaseWidget.Refresh() } diff --git a/ui/widgets/largenowplayingcard.go b/ui/widgets/largenowplayingcard.go index 99452da..4935d84 100644 --- a/ui/widgets/largenowplayingcard.go +++ b/ui/widgets/largenowplayingcard.go @@ -19,8 +19,7 @@ import ( type LargeNowPlayingCard struct { CaptionedImage - DisableRating bool - ImageCornerRadius float32 + DisableRating bool isRadio bool trackName *widget.RichText @@ -164,6 +163,5 @@ func (n *LargeNowPlayingCard) Refresh() { } else { n.rating.Enable() } - n.cover.CornerRadius = n.ImageCornerRadius n.BaseWidget.Refresh() } diff --git a/ui/widgets/nowplayingcard.go b/ui/widgets/nowplayingcard.go index 1538a1c..167f6b1 100644 --- a/ui/widgets/nowplayingcard.go +++ b/ui/widgets/nowplayingcard.go @@ -23,8 +23,7 @@ import ( type NowPlayingCard struct { widget.BaseWidget - DisableRating bool - ImageCornerRadius float32 + DisableRating bool trackName *OptionHyperlink artistName *MultiHyperlink @@ -165,7 +164,6 @@ func (n *NowPlayingCard) Update(track mediaprovider.MediaItem) { } func (n *NowPlayingCard) Refresh() { - n.cover.CornerRadius = n.ImageCornerRadius n.BaseWidget.Refresh() } diff --git a/ui/widgets/playqueuelist.go b/ui/widgets/playqueuelist.go index 9ee3e32..06947ce 100644 --- a/ui/widgets/playqueuelist.go +++ b/ui/widgets/playqueuelist.go @@ -389,7 +389,6 @@ func NewPlayQueueListRow(playQueueList *PlayQueueList, im *backend.ImageManager, p.ExtendBaseWidget(p) p.cover.ScaleMode = canvas.ImageScaleFastest - p.cover.CornerRadius = theme.InputRadiusSize() p.title.OnMouseIn = p.MouseIn p.title.OnMouseOut = p.MouseOut p.artist.OnTapped = playQueueList.onArtistTapped diff --git a/ui/widgets/tracklistrow.go b/ui/widgets/tracklistrow.go index 847afdc..e4dd0be 100644 --- a/ui/widgets/tracklistrow.go +++ b/ui/widgets/tracklistrow.go @@ -274,7 +274,6 @@ func NewExpandedTracklistRow(tracklist *Tracklist, im *backend.ImageManager, pla t.playingIcon = playingIcon t.img = NewImagePlaceholder(myTheme.TracksIcon, tracklistThumbnailSize) t.img.ScaleMode = canvas.ImageScaleFastest - t.img.CornerRadius = theme.InputRadiusSize() t.imageLoader = util.NewThumbnailLoader(im, func(i image.Image) { t.img.SetImage(i, false) From 3d3470ed341dcb2572c5970699c41f4c40e818f9 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Sat, 15 Nov 2025 10:33:32 -0800 Subject: [PATCH 7/8] remove now-unneeded overridden refresh --- ui/widgets/nowplayingcard.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ui/widgets/nowplayingcard.go b/ui/widgets/nowplayingcard.go index 167f6b1..5618b06 100644 --- a/ui/widgets/nowplayingcard.go +++ b/ui/widgets/nowplayingcard.go @@ -163,10 +163,6 @@ func (n *NowPlayingCard) Update(track mediaprovider.MediaItem) { n.Refresh() } -func (n *NowPlayingCard) Refresh() { - n.BaseWidget.Refresh() -} - func (n *NowPlayingCard) SetImage(cover image.Image) { n.cover.SetImage(cover, true) } From 691fceab8abdbff4a872b6d7e75b0aa35c94d116 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Sat, 15 Nov 2025 10:38:10 -0800 Subject: [PATCH 8/8] add rounded image corners to en.json --- res/translations/en.json | 1 + 1 file changed, 1 insertion(+) diff --git a/res/translations/en.json b/res/translations/en.json index 02bed42..dd478f4 100644 --- a/res/translations/en.json +++ b/res/translations/en.json @@ -260,6 +260,7 @@ "URL": "URL", "Use blurred album cover for Now Playing page background": "Use blurred album cover for Now Playing page background", "Use legacy authentication": "Use legacy authentication", + "Use rounded image corners": "Use rounded image corners", "Use waveform seekbar": "Use waveform seekbar", "Username": "Username", "version": "version",