feat: add buttons and labels while not forgetting entries
This commit is contained in:
20
go.mod
20
go.mod
@@ -6,7 +6,7 @@ require fyne.io/fyne/v2 v2.7.2
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
fyne.io/systray v1.12.0 // indirect
|
fyne.io/systray v1.12.0 // indirect
|
||||||
github.com/BurntSushi/toml v1.5.0 // indirect
|
github.com/BurntSushi/toml v1.6.0 // indirect
|
||||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
github.com/fredbi/uri v1.1.1 // indirect
|
github.com/fredbi/uri v1.1.1 // indirect
|
||||||
github.com/fsnotify/fsnotify v1.9.0 // indirect
|
github.com/fsnotify/fsnotify v1.9.0 // indirect
|
||||||
@@ -15,26 +15,26 @@ require (
|
|||||||
github.com/fyne-io/image v0.1.1 // indirect
|
github.com/fyne-io/image v0.1.1 // indirect
|
||||||
github.com/fyne-io/oksvg v0.2.0 // indirect
|
github.com/fyne-io/oksvg v0.2.0 // indirect
|
||||||
github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71 // 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-gl/glfw/v3.3/glfw v0.0.0-20250301202403-da16c1255728 // indirect
|
||||||
github.com/go-text/render v0.2.0 // indirect
|
github.com/go-text/render v0.2.0 // indirect
|
||||||
github.com/go-text/typesetting v0.2.1 // indirect
|
github.com/go-text/typesetting v0.3.2 // indirect
|
||||||
github.com/godbus/dbus/v5 v5.1.0 // indirect
|
github.com/godbus/dbus/v5 v5.2.2 // indirect
|
||||||
github.com/hack-pad/go-indexeddb v0.3.2 // indirect
|
github.com/hack-pad/go-indexeddb v0.3.2 // indirect
|
||||||
github.com/hack-pad/safejs v0.1.0 // indirect
|
github.com/hack-pad/safejs v0.1.1 // indirect
|
||||||
github.com/jeandeaual/go-locale v0.0.0-20250612000132-0ef82f21eade // indirect
|
github.com/jeandeaual/go-locale v0.0.0-20250612000132-0ef82f21eade // indirect
|
||||||
github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 // indirect
|
github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 // indirect
|
||||||
github.com/kr/text v0.1.0 // indirect
|
github.com/kr/text v0.1.0 // indirect
|
||||||
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect
|
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect
|
||||||
github.com/nicksnyder/go-i18n/v2 v2.5.1 // indirect
|
github.com/nicksnyder/go-i18n/v2 v2.6.1 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
github.com/rymdport/portal v0.4.2 // indirect
|
github.com/rymdport/portal v0.4.2 // indirect
|
||||||
github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c // indirect
|
github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c // indirect
|
||||||
github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef // indirect
|
github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef // indirect
|
||||||
github.com/stretchr/testify v1.11.1 // indirect
|
github.com/stretchr/testify v1.11.1 // indirect
|
||||||
github.com/yuin/goldmark v1.7.8 // indirect
|
github.com/yuin/goldmark v1.7.16 // indirect
|
||||||
golang.org/x/image v0.24.0 // indirect
|
golang.org/x/image v0.34.0 // indirect
|
||||||
golang.org/x/net v0.47.0 // indirect
|
golang.org/x/net v0.48.0 // indirect
|
||||||
golang.org/x/sys v0.39.0 // indirect
|
golang.org/x/sys v0.40.0 // indirect
|
||||||
golang.org/x/text v0.32.0 // indirect
|
golang.org/x/text v0.32.0 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
)
|
)
|
||||||
|
|||||||
46
go.sum
46
go.sum
@@ -2,8 +2,8 @@ fyne.io/fyne/v2 v2.7.2 h1:XiNpWkn0PzX43ZCjbb0QYGg1RCxVbugwfVgikWZBCMw=
|
|||||||
fyne.io/fyne/v2 v2.7.2/go.mod h1:PXbqY3mQmJV3J1NRUR2VbVgUUx3vgvhuFJxyjRK/4Ug=
|
fyne.io/fyne/v2 v2.7.2/go.mod h1:PXbqY3mQmJV3J1NRUR2VbVgUUx3vgvhuFJxyjRK/4Ug=
|
||||||
fyne.io/systray v1.12.0 h1:CA1Kk0e2zwFlxtc02L3QFSiIbxJ/P0n582YrZHT7aTM=
|
fyne.io/systray v1.12.0 h1:CA1Kk0e2zwFlxtc02L3QFSiIbxJ/P0n582YrZHT7aTM=
|
||||||
fyne.io/systray v1.12.0/go.mod h1:RVwqP9nYMo7h5zViCBHri2FgjXF7H2cub7MAq4NSoLs=
|
fyne.io/systray v1.12.0/go.mod h1:RVwqP9nYMo7h5zViCBHri2FgjXF7H2cub7MAq4NSoLs=
|
||||||
github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg=
|
github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk=
|
||||||
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
|
github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g=
|
github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g=
|
||||||
@@ -22,22 +22,22 @@ 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/fyne-io/oksvg v0.2.0/go.mod h1:dJ9oEkPiWhnTFNCmRgEze+YNprJF7YRbpjgpWS4kzoI=
|
||||||
github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71 h1:5BVwOaUSBTlVZowGO6VZGw2H/zl9nrd3eCZfYV+NfQA=
|
github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71 h1:5BVwOaUSBTlVZowGO6VZGw2H/zl9nrd3eCZfYV+NfQA=
|
||||||
github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=
|
github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a h1:vxnBhFDDT+xzxf1jTJKMKZw3H0swfWk9RpWbBbDK5+0=
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20250301202403-da16c1255728 h1:RkGhqHxEVAvPM0/R+8g7XRwQnHatO0KAuVcwHo8q9W8=
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20250301202403-da16c1255728/go.mod h1:SyRD8YfuKk+ZXlDqYiqe1qMSqjNgtHzBTG810KUagMc=
|
||||||
github.com/go-text/render v0.2.0 h1:LBYoTmp5jYiJ4NPqDc2pz17MLmA3wHw1dZSVGcOdeAc=
|
github.com/go-text/render v0.2.0 h1:LBYoTmp5jYiJ4NPqDc2pz17MLmA3wHw1dZSVGcOdeAc=
|
||||||
github.com/go-text/render v0.2.0/go.mod h1:CkiqfukRGKJA5vZZISkjSYrcdtgKQWRa2HIzvwNN5SU=
|
github.com/go-text/render v0.2.0/go.mod h1:CkiqfukRGKJA5vZZISkjSYrcdtgKQWRa2HIzvwNN5SU=
|
||||||
github.com/go-text/typesetting v0.2.1 h1:x0jMOGyO3d1qFAPI0j4GSsh7M0Q3Ypjzr4+CEVg82V8=
|
github.com/go-text/typesetting v0.3.2 h1:OUOFxp9Rx5PiO0/rh2IY+5gmyXjXsVG8+LfEyk9NMcE=
|
||||||
github.com/go-text/typesetting v0.2.1/go.mod h1:mTOxEwasOFpAMBjEQDhdWRckoLLeI/+qrQeBCTGEt6M=
|
github.com/go-text/typesetting v0.3.2/go.mod h1:vIRUT25mLQaSh4C8H/lIsKppQz/Gdb8Pu/tNwpi52ts=
|
||||||
github.com/go-text/typesetting-utils v0.0.0-20241103174707-87a29e9e6066 h1:qCuYC+94v2xrb1PoS4NIDe7DGYtLnU2wWiQe9a1B1c0=
|
github.com/go-text/typesetting-utils v0.0.0-20250618110550-c820a94c77b8 h1:4KCscI9qYWMGTuz6BpJtbUSRzcBrUSSE0ENMJbNSrFs=
|
||||||
github.com/go-text/typesetting-utils v0.0.0-20241103174707-87a29e9e6066/go.mod h1:DDxDdQEnB70R8owOx3LVpEFvpMK9eeH1o2r0yZhFI9o=
|
github.com/go-text/typesetting-utils v0.0.0-20250618110550-c820a94c77b8/go.mod h1:3/62I4La/HBRX9TcTpBj4eipLiwzf+vhI+7whTc9V7o=
|
||||||
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
|
github.com/godbus/dbus/v5 v5.2.2 h1:TUR3TgtSVDmjiXOgAAyaZbYmIeP3DPkld3jgKGV8mXQ=
|
||||||
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
github.com/godbus/dbus/v5 v5.2.2/go.mod h1:3AAv2+hPq5rdnr5txxxRwiGjPXamgoIHgz9FPBfOp3c=
|
||||||
github.com/google/pprof v0.0.0-20211214055906-6f57359322fd h1:1FjCyPC+syAzJ5/2S8fqdZK1R22vvA0J7JZKcuOIQ7Y=
|
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/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=
|
||||||
github.com/hack-pad/go-indexeddb v0.3.2 h1:DTqeJJYc1usa45Q5r52t01KhvlSN02+Oq+tQbSBI91A=
|
github.com/hack-pad/go-indexeddb v0.3.2 h1:DTqeJJYc1usa45Q5r52t01KhvlSN02+Oq+tQbSBI91A=
|
||||||
github.com/hack-pad/go-indexeddb v0.3.2/go.mod h1:QvfTevpDVlkfomY498LhstjwbPW6QC4VC/lxYb0Kom0=
|
github.com/hack-pad/go-indexeddb v0.3.2/go.mod h1:QvfTevpDVlkfomY498LhstjwbPW6QC4VC/lxYb0Kom0=
|
||||||
github.com/hack-pad/safejs v0.1.0 h1:qPS6vjreAqh2amUqj4WNG1zIw7qlRQJ9K10eDKMCnE8=
|
github.com/hack-pad/safejs v0.1.1 h1:d5qPO0iQ7h2oVtpzGnLExE+Wn9AtytxIfltcS2b9KD8=
|
||||||
github.com/hack-pad/safejs v0.1.0/go.mod h1:HdS+bKF1NrE72VoXZeWzxFOVQVUSqZJAG0xNCnb+Tio=
|
github.com/hack-pad/safejs v0.1.1/go.mod h1:HdS+bKF1NrE72VoXZeWzxFOVQVUSqZJAG0xNCnb+Tio=
|
||||||
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 h1:FmusiCI1wHw+XQbvL9M+1r/C3SPqKrmBaIOYwVfQoDE=
|
||||||
github.com/jeandeaual/go-locale v0.0.0-20250612000132-0ef82f21eade/go.mod h1:ZDXo8KHryOWSIqnsb/CiDq7hQUYryCgdVnxbj8tDG7o=
|
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 h1:YLvr1eE6cdCqjOe972w/cYF+FjW34v27+9Vo5106B4M=
|
||||||
@@ -47,8 +47,8 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
|||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
|
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
|
||||||
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
|
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
|
||||||
github.com/nicksnyder/go-i18n/v2 v2.5.1 h1:IxtPxYsR9Gp60cGXjfuR/llTqV8aYMsC472zD0D1vHk=
|
github.com/nicksnyder/go-i18n/v2 v2.6.1 h1:JDEJraFsQE17Dut9HFDHzCoAWGEQJom5s0TRd17NIEQ=
|
||||||
github.com/nicksnyder/go-i18n/v2 v2.5.1/go.mod h1:DrhgsSDZxoAfvVrBVLXoxZn/pN5TXqaDbq7ju94viiQ=
|
github.com/nicksnyder/go-i18n/v2 v2.6.1/go.mod h1:Vee0/9RD3Quc/NmwEjzzD7VTZ+Ir7QbXocrkhOzmUKA=
|
||||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
|
||||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||||
github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA=
|
github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA=
|
||||||
@@ -63,14 +63,16 @@ github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef h1:Ch6Q+AZUxDBCVqd
|
|||||||
github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef/go.mod h1:nXTWP6+gD5+LUJ8krVhhoeHjvHTutPxMYl5SvkcnJNE=
|
github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef/go.mod h1:nXTWP6+gD5+LUJ8krVhhoeHjvHTutPxMYl5SvkcnJNE=
|
||||||
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
|
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/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
|
||||||
github.com/yuin/goldmark v1.7.8 h1:iERMLn0/QJeHFhxSt3p6PeN9mGnvIKSpG9YYorDMnic=
|
github.com/yuin/goldmark v1.7.16 h1:n+CJdUxaFMiDUNnWC3dMWCIQJSkxH4uz3ZwQBkAlVNE=
|
||||||
github.com/yuin/goldmark v1.7.8/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E=
|
github.com/yuin/goldmark v1.7.16/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg=
|
||||||
golang.org/x/image v0.24.0 h1:AN7zRgVsbvmTfNyqIbbOraYL8mSwcKncEj8ofjgzcMQ=
|
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
|
||||||
golang.org/x/image v0.24.0/go.mod h1:4b/ITuLfqYq1hqZcjofwctIhi7sZh2WaCjvsBNjjya8=
|
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
|
||||||
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
|
golang.org/x/image v0.34.0 h1:33gCkyw9hmwbZJeZkct8XyR11yH889EQt/QH4VmXMn8=
|
||||||
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
|
golang.org/x/image v0.34.0/go.mod h1:2RNFBZRB+vnwwFil8GkMdRvrJOFd1AzdZI6vOY+eJVU=
|
||||||
golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
|
golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU=
|
||||||
golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY=
|
||||||
|
golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ=
|
||||||
|
golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||||
golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU=
|
golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU=
|
||||||
golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY=
|
golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
|||||||
5
src/action.go
Normal file
5
src/action.go
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
func connect() {
|
||||||
|
|
||||||
|
}
|
||||||
219
src/draw.go
Normal file
219
src/draw.go
Normal file
@@ -0,0 +1,219 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"image/color"
|
||||||
|
"log"
|
||||||
|
|
||||||
|
"fyne.io/fyne/v2"
|
||||||
|
"fyne.io/fyne/v2/canvas"
|
||||||
|
"fyne.io/fyne/v2/container"
|
||||||
|
"fyne.io/fyne/v2/dialog"
|
||||||
|
"fyne.io/fyne/v2/layout"
|
||||||
|
"fyne.io/fyne/v2/widget"
|
||||||
|
)
|
||||||
|
|
||||||
|
func drawSeparator(trailNewLine bool) *fyne.Container {
|
||||||
|
emptyLabel := widget.NewLabel("") // Give it some space at the bottom with an empty line
|
||||||
|
separatorLine := canvas.NewLine(color.Gray{Y: 128})
|
||||||
|
|
||||||
|
var separContainer *fyne.Container
|
||||||
|
if trailNewLine {
|
||||||
|
separContainer = container.NewVBox(
|
||||||
|
emptyLabel,
|
||||||
|
separatorLine,
|
||||||
|
emptyLabel,
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
separContainer = container.NewVBox(
|
||||||
|
emptyLabel,
|
||||||
|
separatorLine,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return separContainer
|
||||||
|
}
|
||||||
|
|
||||||
|
func drawButtonRow(targetMode *int) *fyne.Container {
|
||||||
|
actionText := widget.NewLabel("Select Mode")
|
||||||
|
// targetMode is defined as:
|
||||||
|
// 0 undefined / not used
|
||||||
|
// 1 presentation (PowerPoint, Impress)
|
||||||
|
// 2 video (mp4, mkv)
|
||||||
|
var presModeBtn *widget.Button
|
||||||
|
var videoModeBtn *widget.Button
|
||||||
|
presModeBtn = widget.NewButton("Presentation", func() {
|
||||||
|
*targetMode = 1
|
||||||
|
presModeBtn.Importance = widget.HighImportance
|
||||||
|
videoModeBtn.Importance = widget.LowImportance
|
||||||
|
log.Println("Set mode to presentation", *targetMode)
|
||||||
|
refreshButtons(presModeBtn, videoModeBtn)
|
||||||
|
})
|
||||||
|
presWide := container.NewGridWrap(
|
||||||
|
buttonSize,
|
||||||
|
presModeBtn,
|
||||||
|
)
|
||||||
|
|
||||||
|
videoModeBtn = widget.NewButton("Video", func() {
|
||||||
|
*targetMode = 2
|
||||||
|
presModeBtn.Importance = widget.LowImportance
|
||||||
|
videoModeBtn.Importance = widget.HighImportance
|
||||||
|
log.Println("Set mode to video", *targetMode)
|
||||||
|
refreshButtons(presModeBtn, videoModeBtn)
|
||||||
|
})
|
||||||
|
videoWide := container.NewGridWrap(
|
||||||
|
buttonSize,
|
||||||
|
videoModeBtn,
|
||||||
|
)
|
||||||
|
|
||||||
|
modeRow := container.NewHBox(
|
||||||
|
presWide,
|
||||||
|
widget.NewLabel(""),
|
||||||
|
videoWide,
|
||||||
|
)
|
||||||
|
|
||||||
|
modeCol := container.NewVBox(
|
||||||
|
actionText,
|
||||||
|
modeRow,
|
||||||
|
)
|
||||||
|
|
||||||
|
return modeCol
|
||||||
|
}
|
||||||
|
|
||||||
|
func drawTargetSection(raspiNames []string, raspiTarget *string) *fyne.Container {
|
||||||
|
actionText := widget.NewLabel("Select Target")
|
||||||
|
|
||||||
|
// Left side for selection of target
|
||||||
|
piSelection := widget.NewRadioGroup(raspiNames, func(selected string) {
|
||||||
|
if len(selected) != 0 {
|
||||||
|
*raspiTarget = selected
|
||||||
|
log.Println("Selected target:", selected)
|
||||||
|
} else {
|
||||||
|
log.Println("Deselected Target")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// Right side authentication
|
||||||
|
userLabel := widget.NewLabel("Username")
|
||||||
|
passLabel := widget.NewLabel("Password")
|
||||||
|
|
||||||
|
userEntry := widget.NewEntry()
|
||||||
|
userEntry.SetPlaceHolder("<your-username>")
|
||||||
|
|
||||||
|
passEntry := widget.NewEntry()
|
||||||
|
passEntry.SetPlaceHolder("<your-password>")
|
||||||
|
|
||||||
|
expander := canvas.NewRectangle(color.Transparent)
|
||||||
|
expander.SetMinSize(fyne.NewSize(150, 0))
|
||||||
|
targetAuth := container.NewVBox(
|
||||||
|
container.NewGridWithColumns(2, userLabel, expander),
|
||||||
|
userEntry,
|
||||||
|
container.NewGridWithColumns(2, passLabel, expander),
|
||||||
|
passEntry,
|
||||||
|
)
|
||||||
|
|
||||||
|
divider := canvas.NewRectangle(color.Transparent)
|
||||||
|
divider.SetMinSize(fyne.NewSize(300, 0))
|
||||||
|
|
||||||
|
selecCol := container.NewVBox(
|
||||||
|
actionText,
|
||||||
|
piSelection,
|
||||||
|
)
|
||||||
|
|
||||||
|
targetRow := container.NewHBox(
|
||||||
|
selecCol,
|
||||||
|
divider,
|
||||||
|
targetAuth,
|
||||||
|
)
|
||||||
|
|
||||||
|
var verifyBtn *widget.Button
|
||||||
|
verifyBtn = widget.NewButton("Verify Credentials", func() {
|
||||||
|
verifyBtn.Importance = widget.HighImportance
|
||||||
|
log.Println("Verifying credentials...")
|
||||||
|
refreshButtons(verifyBtn)
|
||||||
|
})
|
||||||
|
verifyWide := container.NewGridWrap(
|
||||||
|
buttonSize,
|
||||||
|
verifyBtn,
|
||||||
|
)
|
||||||
|
|
||||||
|
wholeCol := container.NewVBox(
|
||||||
|
targetRow,
|
||||||
|
widget.NewLabel(""),
|
||||||
|
verifyWide,
|
||||||
|
)
|
||||||
|
|
||||||
|
return wholeCol
|
||||||
|
}
|
||||||
|
|
||||||
|
func drawFileSelection(localPath *string, parentWindow *fyne.Window) *fyne.Container {
|
||||||
|
actionText := widget.NewLabel("Select File")
|
||||||
|
pathLabel := widget.NewLabel("No File Selected Yet...")
|
||||||
|
|
||||||
|
uploadBtn := widget.NewButton("Click to Select File", func() {
|
||||||
|
// Stupid dialog error on 'headless' servers...
|
||||||
|
log.Println("Ignore the next error. ~Refer: https://github.com/fyne-io/fyne/issues/4110")
|
||||||
|
|
||||||
|
// Use NewFileOpen to get the dialog object
|
||||||
|
uploadDiag := dialog.NewFileOpen(func(r fyne.URIReadCloser, err error) {
|
||||||
|
if r != nil {
|
||||||
|
defer r.Close()
|
||||||
|
|
||||||
|
pathLabel.SetText(r.URI().Name())
|
||||||
|
*localPath = r.URI().Path()
|
||||||
|
|
||||||
|
log.Println("Local path of selected file:", *localPath)
|
||||||
|
}
|
||||||
|
}, *parentWindow)
|
||||||
|
|
||||||
|
//fileFilter := storage.NewExtensionFileFilter() // <- needs a list[str] of extensions if we want to filter
|
||||||
|
//uploadDiag.SetFilter(fileFilter)
|
||||||
|
|
||||||
|
// Resize the dialog to the whole window, if it wants to do that -
|
||||||
|
uploadDiag.Resize(dialogSize)
|
||||||
|
uploadDiag.Show()
|
||||||
|
})
|
||||||
|
uploadWide := container.NewGridWrap(
|
||||||
|
buttonSize,
|
||||||
|
uploadBtn,
|
||||||
|
)
|
||||||
|
|
||||||
|
fileSelecRow := container.NewHBox(
|
||||||
|
uploadWide,
|
||||||
|
pathLabel,
|
||||||
|
)
|
||||||
|
|
||||||
|
fileSelecCol := container.NewVBox(
|
||||||
|
actionText,
|
||||||
|
fileSelecRow,
|
||||||
|
)
|
||||||
|
|
||||||
|
return fileSelecCol
|
||||||
|
}
|
||||||
|
|
||||||
|
func drawFooter(app fyne.App, targetMode *int) *fyne.Container {
|
||||||
|
// Configuration of the bottom of the application
|
||||||
|
showBtn := widget.NewButton("Print Current Value", func() {
|
||||||
|
log.Println(*targetMode)
|
||||||
|
})
|
||||||
|
showWide := container.NewGridWrap(
|
||||||
|
buttonSize,
|
||||||
|
showBtn,
|
||||||
|
)
|
||||||
|
|
||||||
|
cancelBtn := widget.NewButton("Exit", func() {
|
||||||
|
log.Println("Quitting")
|
||||||
|
app.Quit()
|
||||||
|
})
|
||||||
|
cancelWide := container.NewGridWrap(
|
||||||
|
buttonSize,
|
||||||
|
cancelBtn,
|
||||||
|
)
|
||||||
|
|
||||||
|
bottom := container.NewHBox(
|
||||||
|
showWide, // left
|
||||||
|
layout.NewSpacer(), // flexible space
|
||||||
|
cancelWide, // right
|
||||||
|
)
|
||||||
|
|
||||||
|
return bottom
|
||||||
|
}
|
||||||
60
src/main.go
60
src/main.go
@@ -6,51 +6,69 @@ import (
|
|||||||
"fyne.io/fyne/v2"
|
"fyne.io/fyne/v2"
|
||||||
"fyne.io/fyne/v2/app"
|
"fyne.io/fyne/v2/app"
|
||||||
"fyne.io/fyne/v2/container"
|
"fyne.io/fyne/v2/container"
|
||||||
"fyne.io/fyne/v2/layout"
|
|
||||||
"fyne.io/fyne/v2/theme"
|
"fyne.io/fyne/v2/theme"
|
||||||
"fyne.io/fyne/v2/widget"
|
"fyne.io/fyne/v2/widget"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
appName string = "RPi Charon Configuration Tool"
|
||||||
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
windowSize fyne.Size = fyne.NewSize(700, 600)
|
windowSize fyne.Size = fyne.NewSize(700, 650) // Default Window size
|
||||||
|
dialogSize fyne.Size = fyne.NewSize(750, 700) // For some reason when we use windowSize for that, its still smaller, this is also smaller. But a better fit
|
||||||
|
buttonSize fyne.Size = fyne.NewSize(200, 50) // Default button size
|
||||||
|
entrySize fyne.Size = fyne.NewSize(200, 40)
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
a := app.NewWithID("nl.systemec.rpi-charon")
|
app := app.NewWithID("nl.systemec.rpi-charon")
|
||||||
a.Settings().SetTheme(theme.DefaultTheme())
|
app.Settings().SetTheme(theme.DefaultTheme())
|
||||||
|
|
||||||
w := a.NewWindow("rpi-charon")
|
w := app.NewWindow(appName)
|
||||||
w.Resize(windowSize)
|
w.Resize(windowSize)
|
||||||
|
|
||||||
raspiNames := getRaspiNames()
|
raspiNames := getRaspiNames()
|
||||||
|
|
||||||
|
// Define variables and print them out for debug
|
||||||
|
var targetMode int = 0
|
||||||
var raspiTarget string
|
var raspiTarget string
|
||||||
piSelection := widget.NewRadioGroup(raspiNames, func(selected string) {
|
var localUploadPath string
|
||||||
if len(selected) != 0 {
|
log.Println("Current mode:", targetMode)
|
||||||
log.Println(selected)
|
log.Println("Current target:", raspiTarget)
|
||||||
raspiTarget = selected
|
|
||||||
} else {
|
|
||||||
log.Println("Deselected Target")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
bottom := container.NewHBox(
|
// Call the draw functions -> ./src/draw.go
|
||||||
actionWide, // left
|
modeBtnRow := drawButtonRow(&targetMode)
|
||||||
layout.NewSpacer(), // flexible space
|
drawSelecRow := drawTargetSection(raspiNames, &raspiTarget)
|
||||||
exitWide, // right
|
fileSelectRow := drawFileSelection(&localUploadPath, &w)
|
||||||
|
footerRow := drawFooter(app, &targetMode)
|
||||||
|
|
||||||
|
center := container.NewVBox(
|
||||||
|
modeBtnRow,
|
||||||
|
drawSeparator(true),
|
||||||
|
drawSelecRow,
|
||||||
|
drawSeparator(false),
|
||||||
|
fileSelectRow,
|
||||||
)
|
)
|
||||||
|
|
||||||
content := container.NewBorder(
|
content := container.NewBorder(
|
||||||
widget.NewLabel("Select relevant files."), // top
|
widget.NewLabel(appName), // top
|
||||||
bottom, // bottom
|
footerRow, // bottom
|
||||||
nil, nil, // left, right
|
nil, nil, // left, right
|
||||||
centerContent,
|
center, //center
|
||||||
)
|
)
|
||||||
|
log.Println(raspiTarget)
|
||||||
|
|
||||||
w.SetContent(content)
|
w.SetContent(content)
|
||||||
w.ShowAndRun()
|
w.ShowAndRun()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func refreshButtons(givenButtons ...*widget.Button) {
|
||||||
|
for _, btn := range givenButtons {
|
||||||
|
btn.Refresh()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// The raspiList is defined in the other go file, must me maintained separately
|
// The raspiList is defined in the other go file, must me maintained separately
|
||||||
func getRaspiNames() []string {
|
func getRaspiNames() []string {
|
||||||
raspiNames := make([]string, 0, len(raspiList))
|
raspiNames := make([]string, 0, len(raspiList))
|
||||||
|
|||||||
Reference in New Issue
Block a user