From de92b1f7101277d987f14aaea84b26059fba92e7 Mon Sep 17 00:00:00 2001 From: David Ashby Date: Sat, 22 Feb 2025 00:14:55 -0500 Subject: [PATCH] init --- .gitignore | 1 + go.mod | 51 ++++++++++++++++++++ go.sum | 115 ++++++++++++++++++++++++++++++++++++++++++++ gopher.png | Bin 0 -> 18204 bytes main.go | 138 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 305 insertions(+) create mode 100644 .gitignore create mode 100644 go.mod create mode 100644 go.sum create mode 100644 gopher.png create mode 100644 main.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4b3a757 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +why \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..e413132 --- /dev/null +++ b/go.mod @@ -0,0 +1,51 @@ +module git.yetaga.in/alazyreader/why + +go 1.24.0 + +require modernc.org/tk9.0 v0.62.0 + +require ( + github.com/adrg/xdg v0.5.3 // indirect + github.com/disintegration/imaging v1.6.2 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.0 // indirect + github.com/evilsocket/islazy v1.11.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.1 // indirect + github.com/mat/besticon/v3 v3.18.0 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/ncruces/go-strftime v0.1.9 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + golang.org/x/exp v0.0.0-20230315142452-642cacee5cc0 // indirect + golang.org/x/image v0.20.0 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.28.0 // indirect + modernc.org/fileutil v1.3.0 // indirect + modernc.org/fsm v1.2.1 // indirect + modernc.org/gc/v3 v3.0.0-20230512134359-466b49aa80e0 // indirect + modernc.org/knuth v0.5.4 // indirect + modernc.org/libX11 v0.11.2 // indirect + modernc.org/libXau v0.9.2 // indirect + modernc.org/libXdmcp v0.12.0 // indirect + modernc.org/libXft v0.10.0 // indirect + modernc.org/libXrender v0.9.0 // indirect + modernc.org/libbsd v0.11.1 // indirect + modernc.org/libc v1.61.13 // indirect + modernc.org/libexpat v0.10.2 // indirect + modernc.org/libfontconfig v0.8.2 // indirect + modernc.org/libfreetype v0.9.1 // indirect + modernc.org/libmd v0.12.0 // indirect + modernc.org/libtcl9.0 v0.15.1 // indirect + modernc.org/libtk9.0 v0.14.0 // indirect + modernc.org/libxcb v0.11.0 // indirect + modernc.org/libz v0.16.10 // indirect + modernc.org/mathutil v1.7.1 // indirect + modernc.org/memory v1.8.2 // indirect + modernc.org/ngrab v0.1.0 // indirect + modernc.org/rec v0.2.0 // indirect + modernc.org/regexp v1.7.3 // indirect + modernc.org/sortutil v1.2.1 // indirect + modernc.org/strutil v1.2.1 // indirect + modernc.org/tcl9.0 v0.15.25 // indirect + modernc.org/token v1.1.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..bc146fc --- /dev/null +++ b/go.sum @@ -0,0 +1,115 @@ +github.com/adrg/xdg v0.5.3 h1:xRnxJXne7+oWDatRhR1JLnvuccuIeCoBu2rtuLqQB78= +github.com/adrg/xdg v0.5.3/go.mod h1:nlTsY+NNiCBGCK2tpm09vRqfVzrc2fLmXGpBLF0zlTQ= +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/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c= +github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.0 h1:JbqvnEzRvPpxhCJzJJ2y0RbiZ8nyjccVUrSM3q+GvvE= +github.com/ebitengine/purego v0.8.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/evilsocket/islazy v1.11.0 h1:B5w6uuS6ki6iDG+aH/RFeoMb8ijQh/pGabewqp2UeJ0= +github.com/evilsocket/islazy v1.11.0/go.mod h1:muYH4x5MB5YRdkxnrOtrXLIBX6LySj1uFIqys94LKdo= +github.com/expr-lang/expr v1.16.9 h1:WUAzmR0JNI9JCiF0/ewwHB1gmcGw5wW7nWt8gc6PpCI= +github.com/expr-lang/expr v1.16.9/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/golang-lru/v2 v2.0.1 h1:5pv5N1lT1fjLg2VQ5KWc7kmucp2x/kvFOnxuVTqZ6x4= +github.com/hashicorp/golang-lru/v2 v2.0.1/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/mat/besticon/v3 v3.18.0 h1:dEDT5cXp8s/UH4Gh2uWEmguxGexU7q22MKjBzZmfd70= +github.com/mat/besticon/v3 v3.18.0/go.mod h1:J8y+A9X0Oxxsq5+gaeIzn5/6XcJe1rsnhpFOXsq9/6A= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= +github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +golang.org/x/exp v0.0.0-20230315142452-642cacee5cc0 h1:pVgRXcIictcr+lBQIFeiwuwtDIs4eL21OuM9nyAADmo= +golang.org/x/exp v0.0.0-20230315142452-642cacee5cc0/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.20.0 h1:7cVCUjQwfL18gyBJOmYvptfSHS8Fb3YUDtfLIZ7Nbpw= +golang.org/x/image v0.20.0/go.mod h1:0a88To4CYVBAHp5FXJm8o7QbUl37Vd85ply1vyD8auM= +golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8= +golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg= +golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +modernc.org/cc/v4 v4.24.4 h1:TFkx1s6dCkQpd6dKurBNmpo+G8Zl4Sq/ztJ+2+DEsh0= +modernc.org/cc/v4 v4.24.4/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= +modernc.org/ccgo/v4 v4.23.16 h1:Z2N+kk38b7SfySC1ZkpGLN2vthNJP1+ZzGZIlH7uBxo= +modernc.org/ccgo/v4 v4.23.16/go.mod h1:nNma8goMTY7aQZQNTyN9AIoJfxav4nvTnvKThAeMDdo= +modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE= +modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= +modernc.org/fsm v1.2.1 h1:HbM58bXxL5O2lcZV2MLunCelmbcx0pfEABx5MiBdVcU= +modernc.org/fsm v1.2.1/go.mod h1:EDGRSaPWy3qP70XVpUVVqkUplm0myW+jAohuM5RajEs= +modernc.org/gc/v2 v2.6.3 h1:aJVhcqAte49LF+mGveZ5KPlsp4tdGdAOT4sipJXADjw= +modernc.org/gc/v2 v2.6.3/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= +modernc.org/gc/v3 v3.0.0-20230512134359-466b49aa80e0 h1:Iox2PD9TaVKyyCdDn7A3KuDd4ELb9TcrsA/2iXzRRtU= +modernc.org/gc/v3 v3.0.0-20230512134359-466b49aa80e0/go.mod h1:1hU1kIUddpAm7byqo+bfUr4X6PwhHSjb3cNv5yXlzEs= +modernc.org/knuth v0.5.4 h1:F8mDs7ME3oN9eyx01n6/xVmJ4F5U/qEhSYPnPXaZrps= +modernc.org/knuth v0.5.4/go.mod h1:e5SBb35HQBj2aFwbBO3ClPcViLY3Wi0LzaOd7c/3qMk= +modernc.org/libX11 v0.11.2 h1:tAqv1KVQEDhBqQ/1gfSmEAQtAoOjteOTHZZoiB7AfUQ= +modernc.org/libX11 v0.11.2/go.mod h1:3AuhC2yIZnqs345bgkN09wZkQxftMkh0VxzG5hlGMHU= +modernc.org/libXau v0.9.2 h1:zvsrhQm4LZxp9s+PmH4cU3bHtwx8D2N1ZosdOGFgAIw= +modernc.org/libXau v0.9.2/go.mod h1:W7rrXkzskKX3CCFdNkoBoj1MIIxbLLG3zyO7uOdKT1o= +modernc.org/libXdmcp v0.12.0 h1:ZjEkqq0oMPJLSIHf3sGTyWZAaN3pufx1FxieH8ahujA= +modernc.org/libXdmcp v0.12.0/go.mod h1:vGEvyhpeH8Tq8t813RNeyMRODJ0Wxlwg9Avy1TC3DK4= +modernc.org/libXft v0.10.0 h1:CtttMuQsmLbXg+IPYVxQHJXsGVLMn3WsKIXr8e/TDKo= +modernc.org/libXft v0.10.0/go.mod h1:z+VNTTc3Lmtzn4FcpueZkoHGlhXkMReyLcfTFfERxCE= +modernc.org/libXrender v0.9.0 h1:JDLYImH30B2f1HYM0gMN+RArkyL37I4/3PkgE40dMGY= +modernc.org/libXrender v0.9.0/go.mod h1:b41LOnUnhzdqU0Nn5b/HL6F+JvIS5rD58FOQXDgNQBY= +modernc.org/libbsd v0.11.1 h1:fitxx6pR7qCmKiyguiaSd3sNluE3Upb5CqoSQKWAfo4= +modernc.org/libbsd v0.11.1/go.mod h1:FEVwPCCWsF7E3aZ5r7r4VeRullGyYucA6aTgk5HNTRY= +modernc.org/libc v1.61.13 h1:3LRd6ZO1ezsFiX1y+bHd1ipyEHIJKvuprv0sLTBwLW8= +modernc.org/libc v1.61.13/go.mod h1:8F/uJWL/3nNil0Lgt1Dpz+GgkApWh04N3el3hxJcA6E= +modernc.org/libexpat v0.10.2 h1:apvlWGtS3cn61Z24isCvCLU4t1NWAUOBWTA2KMNvVzc= +modernc.org/libexpat v0.10.2/go.mod h1:OJbzff11GOxEfSSy3ofxGn0vrkpAWN0YLvTTLthe4Lw= +modernc.org/libfontconfig v0.8.2 h1:OvllZZfoE/7WrtzO8HHaQn9YS6JZlSUdkAY3nL+od6Y= +modernc.org/libfontconfig v0.8.2/go.mod h1:xQ59wWxiqkxaAIg+hH+6u+b9B0uu7njWDV4UnoXrDYE= +modernc.org/libfreetype v0.9.1 h1:OS57DE3q1dSTAfOz2O0dw2w5zDx3oax8BUNaHQB0DGU= +modernc.org/libfreetype v0.9.1/go.mod h1:7MEdxlU7xIIQ1k5MQYGe0C7BfKuXwVW1i5G9fQDbRSE= +modernc.org/libmd v0.12.0 h1:aAvpjpr7FJUrO14hghEB5QK7Prvl6Cbf7D8vSswxojE= +modernc.org/libmd v0.12.0/go.mod h1:QQBOHm77lZsemt1VbO7fQhDUYO0/dy5KR1nLVm5YvLY= +modernc.org/libtcl9.0 v0.15.1 h1:DM9nzm+VPFeEpPYYSLfRif9vneEklR9/OCkrabMdrbw= +modernc.org/libtcl9.0 v0.15.1/go.mod h1:WVZziJEB6DHMOG7nTfRXKzOzFF9dfdI6aA/GkpffgXg= +modernc.org/libtk9.0 v0.14.0 h1:X2cLLoObDTlXwf0c6fwmSWP48tfABIuvqUBfsLySUmM= +modernc.org/libtk9.0 v0.14.0/go.mod h1:D6csINNOuk5lLMab20kjhCK0JxQfL02IaAPa9vnj2G4= +modernc.org/libxcb v0.11.0 h1:MzVt6ETBHfAjQeZYH3J5vKzHn7HihZd3FSKbQb9mK1Y= +modernc.org/libxcb v0.11.0/go.mod h1:Wht2E7ngaJG36GguDTdXkHXItBFPFVXAcN7w8pJW9ug= +modernc.org/libz v0.16.10 h1:EzVXcQypULQaMZvYCTaUrifHI3w+qJC32tVHhIJME6w= +modernc.org/libz v0.16.10/go.mod h1:aFCUCpH+9uJvjLJfN98nhQz1ibdhZrZG8Pe6ZJeBSIA= +modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= +modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= +modernc.org/memory v1.8.2 h1:cL9L4bcoAObu4NkxOlKWBWtNHIsnnACGF/TbqQ6sbcI= +modernc.org/memory v1.8.2/go.mod h1:ZbjSvMO5NQ1A2i3bWeDiVMxIorXwdClKE/0SZ+BMotU= +modernc.org/ngrab v0.1.0 h1:21cX4tAIfLNjR4ax7JMfHTz2ztnjVGcCSsztoG6EFMk= +modernc.org/ngrab v0.1.0/go.mod h1:dDGjUip6IXmb5Y5M8RPYD7Sg4S/VdfG5akxK34uYtOE= +modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= +modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= +modernc.org/rec v0.2.0 h1:bvKWh/hNdAkdcUxWXAmyBQ1htADn5n5ad5G8boPp4Og= +modernc.org/rec v0.2.0/go.mod h1:SoaswcFNRf7GmLiMHK1672ac60D2KmUFmu5rRrZDBPo= +modernc.org/regexp v1.7.3 h1:XOyVuWwhINI1jwwEkEKBNXAgfdYKOJ7iRgQH1zYlol0= +modernc.org/regexp v1.7.3/go.mod h1:w871IJbq9BwRr+ZtUZ9D7+p7qPAFWTN47ESu46YcGjI= +modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= +modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= +modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= +modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= +modernc.org/tcl9.0 v0.15.25 h1:3xNx26D+vYmSY3K9FaNdPmlHd8Hcz39YGiqsBFCYx5c= +modernc.org/tcl9.0 v0.15.25/go.mod h1:hCbqZz0GQRzN3Xnfn4dKpMCwvA9sfEb+Go++cw1cJ3A= +modernc.org/tk9.0 v0.62.0 h1:V4lyYhCRSXZKn+txvjZCyUnWodAFVJRYFDpFuLldGlk= +modernc.org/tk9.0 v0.62.0/go.mod h1:vzTmvDro5F7yCnusSheZrF8VXXOzmY9RxH2c5M3YFqc= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= diff --git a/gopher.png b/gopher.png new file mode 100644 index 0000000000000000000000000000000000000000..7213edb0bb25484b2a3f8e7b342e7ba66415f502 GIT binary patch literal 18204 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 F|6es~JLdoZ literal 0 HcmV?d00001 diff --git a/main.go b/main.go new file mode 100644 index 0000000..0bdf59b --- /dev/null +++ b/main.go @@ -0,0 +1,138 @@ +package main + +import ( + "bytes" + _ "embed" + "fmt" + "image" + "image/draw" + "image/jpeg" + "image/png" + "io" + "log" + "os" + "slices" + "strings" + "time" + + tk "modernc.org/tk9.0" +) + +//go:embed gopher.png +var gopher []byte + +var validFileTypes = []tk.FileType{ + { + TypeName: "JPEG", + Extensions: []string{".jpg", ".jpeg"}, + }, + { + TypeName: "GIF", + Extensions: []string{".gif"}, + }, + { + TypeName: "PNG", + Extensions: []string{".png"}, + }, + { + TypeName: "SVG", + Extensions: []string{".svg"}, + }, +} + +var metaPressed bool + +func isType(filename string, desired string) bool { + splode := strings.Split(filename, ".") + if len(splode) < 2 { + return false + } + ext := fmt.Sprintf(".%s", splode[len(splode)-1]) + for _, ft := range validFileTypes { + if slices.Contains(ft.Extensions, ext) && ft.TypeName == desired { + return true + } + } + return false +} + +func jpegToPng(in io.Reader) (*bytes.Buffer, error) { + start := time.Now() + buf := new(bytes.Buffer) + + img, err := jpeg.Decode(in) + if err != nil { + return nil, fmt.Errorf("unable to decode jpeg: %w", err) + } + + b := img.Bounds() + dst := image.NewNRGBA(image.Rect(0, 0, b.Dx(), b.Dy())) + draw.Draw(dst, dst.Bounds(), img, b.Min, draw.Src) + + if err := (&png.Encoder{ + CompressionLevel: -2, + }).Encode(buf, dst); err != nil { + return nil, fmt.Errorf("unable to encode png: %w", err) + } + end := time.Now() + log.Printf("jpeg to png took %v", end.Sub(start)) + return buf, nil +} + +func loadImage(img *tk.LabelWidget) func() { + return func() { + files := tk.GetOpenFile(tk.Filetypes(validFileTypes)) + if len(files) > 0 { + f, err := os.Open(files[0]) + if err != nil { + log.Println(err.Error()) + return + } + var r io.Reader + if isType(files[0], "JPEG") { + r, err = jpegToPng(f) + if err != nil { + log.Println(err.Error()) + return + } + } else { + r = f + } + i, err := io.ReadAll(r) + if err != nil { + log.Println(err.Error()) + return + } + img.Configure(tk.Image(tk.NewPhoto(tk.Data(i)))) + } + } +} + +func main() { + img := tk.Label(tk.Image(tk.NewPhoto(tk.Data(gopher)))) + + menubar := tk.Menu() + fileMenu := menubar.Menu() + fileMenu.AddCommand(tk.Lbl("Open"), tk.Underline(0), tk.Accelerator("Meta+O"), tk.Command(loadImage(img))) + menubar.AddCascade(tk.Lbl("File"), tk.Underline(0), tk.Mnu(fileMenu)) + + tk.Bind(tk.App, "", tk.Command(func(e *tk.Event) { + if e.Keysym == "Meta_L" || e.Keysym == "Meta_R" { + metaPressed = true + } + if e.Keysym == "o" && metaPressed { + loadImage(img)() + } + })) + tk.Bind(tk.App, "", tk.Command(func(e *tk.Event) { + if e.Keysym == "Meta_L" || e.Keysym == "Meta_R" { + metaPressed = false + } + })) + tk.Bind(tk.App, "", tk.Command(func(e *tk.Event) { + log.Println(e) + })) + + tk.Pack(img) + tk.App.Configure(tk.Mnu(menubar)).Center().Wait() +}