From 68df790d278e00dd48e1b3c29e827e4c871cfb36 Mon Sep 17 00:00:00 2001 From: Stu Leak Date: Wed, 7 Jan 2026 22:20:00 -0500 Subject: [PATCH] Fix player frame generation and video playback Major improvements to UnifiedPlayer: 1. GetFrameImage() now works when paused for responsive UI updates 2. Play() method properly starts FFmpeg process 3. Frame display loop runs continuously for smooth video display 4. Disabled audio temporarily to fix video playback fundamentals 5. Simplified FFmpeg command to focus on video stream only Player now: - Generates video frames correctly - Shows video when paused - Has responsive progress tracking - Starts playback properly Next steps: Re-enable audio playback once video is stable --- internal/player/unified_ffmpeg_player.go | 145 +- internal/player/unified_player_adapter.go | 18 +- main.go | 107 +- vendor/fyne.io/fyne/v2/.gitignore | 49 + vendor/fyne.io/fyne/v2/.godocdown.import | 1 + vendor/fyne.io/fyne/v2/AUTHORS | 16 + vendor/fyne.io/fyne/v2/CHANGELOG.md | 1680 + vendor/fyne.io/fyne/v2/CODE_OF_CONDUCT.md | 76 + vendor/fyne.io/fyne/v2/CONTRIBUTING.md | 63 + vendor/fyne.io/fyne/v2/LICENSE | 28 + vendor/fyne.io/fyne/v2/README.md | 184 + vendor/fyne.io/fyne/v2/SECURITY.md | 15 + vendor/fyne.io/fyne/v2/animation.go | 84 + vendor/fyne.io/fyne/v2/app.go | 145 + vendor/fyne.io/fyne/v2/app/app.go | 190 + vendor/fyne.io/fyne/v2/app/app_darwin.go | 60 + vendor/fyne.io/fyne/v2/app/app_darwin.m | 60 + .../fyne.io/fyne/v2/app/app_desktop_darwin.go | 61 + .../fyne.io/fyne/v2/app/app_desktop_darwin.m | 12 + vendor/fyne.io/fyne/v2/app/app_gl.go | 14 + vendor/fyne.io/fyne/v2/app/app_mobile.go | 26 + vendor/fyne.io/fyne/v2/app/app_mobile_and.c | 130 + vendor/fyne.io/fyne/v2/app/app_mobile_and.go | 44 + vendor/fyne.io/fyne/v2/app/app_mobile_ios.go | 27 + vendor/fyne.io/fyne/v2/app/app_mobile_ios.m | 10 + vendor/fyne.io/fyne/v2/app/app_mobile_xdg.go | 22 + vendor/fyne.io/fyne/v2/app/app_noos.go | 23 + .../fyne/v2/app/app_notlegacy_darwin.go | 8 + .../fyne.io/fyne/v2/app/app_openurl_wasm.go | 18 + vendor/fyne.io/fyne/v2/app/app_openurl_web.go | 12 + vendor/fyne.io/fyne/v2/app/app_other.go | 26 + vendor/fyne.io/fyne/v2/app/app_software.go | 15 + vendor/fyne.io/fyne/v2/app/app_wasm.go | 75 + vendor/fyne.io/fyne/v2/app/app_windows.go | 106 + vendor/fyne.io/fyne/v2/app/app_xdg.go | 150 + vendor/fyne.io/fyne/v2/app/cloud.go | 47 + vendor/fyne.io/fyne/v2/app/icon_cache_file.go | 54 + vendor/fyne.io/fyne/v2/app/icon_cache_noos.go | 13 + .../fyne.io/fyne/v2/app/icon_cache_other.go | 13 + vendor/fyne.io/fyne/v2/app/meta.go | 36 + .../fyne.io/fyne/v2/app/meta_development.go | 65 + vendor/fyne.io/fyne/v2/app/preferences.go | 191 + .../fyne/v2/app/preferences_android.go | 24 + vendor/fyne.io/fyne/v2/app/preferences_ios.go | 25 + .../fyne.io/fyne/v2/app/preferences_mobile.go | 23 + .../fyne.io/fyne/v2/app/preferences_nonweb.go | 67 + .../fyne.io/fyne/v2/app/preferences_other.go | 32 + .../fyne.io/fyne/v2/app/preferences_wasm.go | 62 + vendor/fyne.io/fyne/v2/app/settings.go | 151 + .../fyne.io/fyne/v2/app/settings_desktop.go | 80 + vendor/fyne.io/fyne/v2/app/settings_file.go | 33 + vendor/fyne.io/fyne/v2/app/settings_mobile.go | 11 + vendor/fyne.io/fyne/v2/app/settings_noos.go | 24 + vendor/fyne.io/fyne/v2/app/settings_wasm.go | 23 + vendor/fyne.io/fyne/v2/app/storage.go | 31 + vendor/fyne.io/fyne/v2/canvas.go | 58 + vendor/fyne.io/fyne/v2/canvas/animation.go | 91 + vendor/fyne.io/fyne/v2/canvas/arc.go | 95 + vendor/fyne.io/fyne/v2/canvas/base.go | 69 + vendor/fyne.io/fyne/v2/canvas/canvas.go | 57 + vendor/fyne.io/fyne/v2/canvas/circle.go | 95 + vendor/fyne.io/fyne/v2/canvas/gradient.go | 238 + vendor/fyne.io/fyne/v2/canvas/image.go | 399 + vendor/fyne.io/fyne/v2/canvas/line.go | 108 + vendor/fyne.io/fyne/v2/canvas/polygon.go | 71 + vendor/fyne.io/fyne/v2/canvas/raster.go | 200 + vendor/fyne.io/fyne/v2/canvas/rectangle.go | 95 + vendor/fyne.io/fyne/v2/canvas/square.go | 13 + vendor/fyne.io/fyne/v2/canvas/text.go | 85 + vendor/fyne.io/fyne/v2/canvasobject.go | 107 + vendor/fyne.io/fyne/v2/clipboard.go | 9 + vendor/fyne.io/fyne/v2/cloud.go | 39 + vendor/fyne.io/fyne/v2/container.go | 202 + vendor/fyne.io/fyne/v2/container/apptabs.go | 470 + vendor/fyne.io/fyne/v2/container/clip.go | 70 + vendor/fyne.io/fyne/v2/container/container.go | 20 + vendor/fyne.io/fyne/v2/container/doctabs.go | 489 + .../fyne.io/fyne/v2/container/innerwindow.go | 444 + vendor/fyne.io/fyne/v2/container/layouts.go | 124 + .../fyne/v2/container/multiplewindows.go | 104 + .../fyne.io/fyne/v2/container/navigation.go | 215 + vendor/fyne.io/fyne/v2/container/scroll.go | 55 + vendor/fyne.io/fyne/v2/container/split.go | 420 + vendor/fyne.io/fyne/v2/container/tabs.go | 881 + vendor/fyne.io/fyne/v2/container/theme.go | 116 + .../fyne.io/fyne/v2/data/binding/binding.go | 169 + vendor/fyne.io/fyne/v2/data/binding/bool.go | 118 + .../fyne.io/fyne/v2/data/binding/convert.go | 409 + .../fyne/v2/data/binding/convert_helper.go | 98 + vendor/fyne.io/fyne/v2/data/binding/items.go | 284 + vendor/fyne.io/fyne/v2/data/binding/lists.go | 563 + vendor/fyne.io/fyne/v2/data/binding/maps.go | 411 + .../fyne/v2/data/binding/pref_helper.go | 97 + .../fyne/v2/data/binding/preference.go | 259 + .../fyne.io/fyne/v2/data/binding/sprintf.go | 218 + vendor/fyne.io/fyne/v2/data/binding/trees.go | 617 + vendor/fyne.io/fyne/v2/device.go | 44 + vendor/fyne.io/fyne/v2/dialog/base.go | 259 + vendor/fyne.io/fyne/v2/dialog/color.go | 363 + vendor/fyne.io/fyne/v2/dialog/color_button.go | 116 + .../fyne.io/fyne/v2/dialog/color_channel.go | 187 + vendor/fyne.io/fyne/v2/dialog/color_picker.go | 304 + .../fyne.io/fyne/v2/dialog/color_preview.go | 78 + vendor/fyne.io/fyne/v2/dialog/color_wheel.go | 212 + vendor/fyne.io/fyne/v2/dialog/confirm.go | 65 + vendor/fyne.io/fyne/v2/dialog/custom.go | 107 + vendor/fyne.io/fyne/v2/dialog/entry.go | 75 + vendor/fyne.io/fyne/v2/dialog/file.go | 991 + vendor/fyne.io/fyne/v2/dialog/file_darwin.go | 12 + vendor/fyne.io/fyne/v2/dialog/file_mobile.go | 43 + vendor/fyne.io/fyne/v2/dialog/file_tamago.go | 9 + vendor/fyne.io/fyne/v2/dialog/file_unix.go | 38 + vendor/fyne.io/fyne/v2/dialog/file_wasm.go | 33 + vendor/fyne.io/fyne/v2/dialog/file_windows.go | 102 + vendor/fyne.io/fyne/v2/dialog/file_xdg.go | 37 + .../fyne/v2/dialog/file_xdg_flatpak.go | 189 + .../fyne/v2/dialog/file_xdg_notflatpak.go | 11 + vendor/fyne.io/fyne/v2/dialog/fileitem.go | 147 + vendor/fyne.io/fyne/v2/dialog/folder.go | 42 + vendor/fyne.io/fyne/v2/dialog/form.go | 87 + vendor/fyne.io/fyne/v2/dialog/information.go | 53 + vendor/fyne.io/fyne/v2/dialog/progress.go | 39 + .../fyne/v2/dialog/progressinfinite.go | 40 + vendor/fyne.io/fyne/v2/dialog/text.go | 50 + vendor/fyne.io/fyne/v2/driver.go | 57 + vendor/fyne.io/fyne/v2/driver/desktop/app.go | 23 + .../fyne.io/fyne/v2/driver/desktop/canvas.go | 11 + .../fyne.io/fyne/v2/driver/desktop/cursor.go | 47 + .../fyne.io/fyne/v2/driver/desktop/driver.go | 15 + vendor/fyne.io/fyne/v2/driver/desktop/key.go | 66 + .../fyne.io/fyne/v2/driver/desktop/mouse.go | 58 + .../fyne/v2/driver/desktop/shortcut.go | 58 + .../fyne.io/fyne/v2/driver/embedded/driver.go | 19 + .../fyne.io/fyne/v2/driver/embedded/event.go | 8 + .../fyne/v2/driver/embedded/keyboard.go | 39 + .../fyne.io/fyne/v2/driver/embedded/touch.go | 33 + .../fyne.io/fyne/v2/driver/mobile/device.go | 12 + .../fyne.io/fyne/v2/driver/mobile/driver.go | 10 + vendor/fyne.io/fyne/v2/driver/mobile/key.go | 10 + .../fyne.io/fyne/v2/driver/mobile/keyboard.go | 26 + vendor/fyne.io/fyne/v2/driver/mobile/touch.go | 15 + vendor/fyne.io/fyne/v2/driver/native.go | 71 + .../fyne.io/fyne/v2/driver/native_android.go | 16 + vendor/fyne.io/fyne/v2/driver/native_other.go | 12 + .../fyne.io/fyne/v2/driver/software/render.go | 31 + .../fyne/v2/driver/software/softwarecanvas.go | 18 + vendor/fyne.io/fyne/v2/event.go | 37 + vendor/fyne.io/fyne/v2/fyne.go | 28 + vendor/fyne.io/fyne/v2/geometry.go | 162 + .../fyne/v2/internal/animation/animation.go | 32 + .../fyne/v2/internal/animation/runner.go | 174 + vendor/fyne.io/fyne/v2/internal/app/config.go | 5 + .../v2/internal/app/config_desktop_darwin.go | 15 + .../fyne/v2/internal/app/config_mobile_and.go | 19 + .../fyne/v2/internal/app/config_mobile_ios.go | 19 + .../fyne/v2/internal/app/config_mobile_ios.m | 9 + .../fyne/v2/internal/app/config_noos.go | 13 + .../fyne/v2/internal/app/config_other.go | 12 + .../fyne/v2/internal/app/config_wasm.go | 7 + .../fyne/v2/internal/app/config_windows.go | 15 + .../fyne/v2/internal/app/config_xdg.go | 13 + .../fyne/v2/internal/app/focus_manager.go | 150 + .../fyne.io/fyne/v2/internal/app/lifecycle.go | 121 + vendor/fyne.io/fyne/v2/internal/app/meta.go | 10 + vendor/fyne.io/fyne/v2/internal/app/theme.go | 52 + .../fyne/v2/internal/app/theme_darwin.go | 28 + .../fyne/v2/internal/app/theme_darwin.m | 8 + .../fyne/v2/internal/app/theme_mobile.go | 18 + .../fyne/v2/internal/app/theme_other.go | 15 + .../fyne/v2/internal/app/theme_wasm.go | 24 + .../fyne.io/fyne/v2/internal/app/theme_web.go | 15 + .../fyne/v2/internal/app/theme_windows.go | 63 + .../fyne.io/fyne/v2/internal/app/theme_xdg.go | 20 + vendor/fyne.io/fyne/v2/internal/async/chan.go | 97 + .../fyne/v2/internal/async/chan_struct.go | 84 + vendor/fyne.io/fyne/v2/internal/async/doc.go | 18 + .../fyne/v2/internal/async/goroutine.go | 85 + .../v2/internal/async/goroutine_desktop.go | 8 + .../v2/internal/async/goroutine_mobile.go | 9 + vendor/fyne.io/fyne/v2/internal/async/map.go | 67 + .../fyne/v2/internal/async/map_clear.go | 12 + .../v2/internal/async/map_clear_go1.23.go | 8 + .../v2/internal/async/map_migratedfynedo.go | 72 + vendor/fyne.io/fyne/v2/internal/async/pool.go | 30 + .../fyne.io/fyne/v2/internal/async/queue.go | 92 + .../v2/internal/async/queue_migratedfynedo.go | 60 + .../v2/internal/build/animations_disabled.go | 7 + .../v2/internal/build/animations_enabled.go | 7 + .../fyne.io/fyne/v2/internal/build/build.go | 29 + .../fyne/v2/internal/build/driver_flatpak.go | 6 + .../v2/internal/build/driver_notflatpak.go | 6 + .../v2/internal/build/driver_notwayland.go | 6 + .../fyne/v2/internal/build/driver_wayland.go | 6 + .../fyne/v2/internal/build/hints_disabled.go | 7 + .../fyne/v2/internal/build/hints_enabled.go | 6 + .../fyne/v2/internal/build/menu_integrated.go | 6 + .../fyne/v2/internal/build/menu_native.go | 6 + .../fyne/v2/internal/build/metadata.go | 6 + .../v2/internal/build/metadata_disabled.go | 6 + .../fyne/v2/internal/build/migrated_fynedo.go | 6 + .../v2/internal/build/migrated_notfynedo.go | 6 + .../fyne/v2/internal/build/mode_debug.go | 8 + .../fyne/v2/internal/build/mode_release.go | 8 + .../fyne/v2/internal/build/mode_standard.go | 8 + vendor/fyne.io/fyne/v2/internal/cache/base.go | 122 + .../fyne/v2/internal/cache/canvases.go | 35 + vendor/fyne.io/fyne/v2/internal/cache/svg.go | 63 + vendor/fyne.io/fyne/v2/internal/cache/text.go | 68 + .../fyne/v2/internal/cache/texture_common.go | 111 + .../fyne/v2/internal/cache/texture_desktop.go | 21 + .../v2/internal/cache/texture_gomobile.go | 22 + .../fyne/v2/internal/cache/texture_wasm.go | 22 + .../fyne.io/fyne/v2/internal/cache/theme.go | 93 + .../fyne.io/fyne/v2/internal/cache/widget.go | 74 + vendor/fyne.io/fyne/v2/internal/clip.go | 89 + .../fyne.io/fyne/v2/internal/color/color.go | 97 + vendor/fyne.io/fyne/v2/internal/docs.go | 141 + .../fyne/v2/internal/driver/common/canvas.go | 483 + .../fyne/v2/internal/driver/common/driver.go | 11 + .../v2/internal/driver/common/structures.go | 95 + .../fyne/v2/internal/driver/common/window.go | 11 + .../fyne/v2/internal/driver/context.go | 9 + .../v2/internal/driver/embedded/device.go | 31 + .../v2/internal/driver/embedded/driver.go | 241 + .../internal/driver/embedded/touchscreen.go | 236 + .../v2/internal/driver/embedded/window.go | 137 + .../fyne/v2/internal/driver/glfw/animation.go | 11 + .../fyne/v2/internal/driver/glfw/canvas.go | 312 + .../fyne/v2/internal/driver/glfw/clipboard.go | 64 + .../v2/internal/driver/glfw/clipboard_wasm.go | 28 + .../fyne/v2/internal/driver/glfw/device.go | 29 + .../v2/internal/driver/glfw/device_desktop.go | 33 + .../v2/internal/driver/glfw/device_wasm.go | 75 + .../fyne/v2/internal/driver/glfw/driver.go | 181 + .../v2/internal/driver/glfw/driver_darwin.go | 21 + .../v2/internal/driver/glfw/driver_darwin.m | 34 + .../v2/internal/driver/glfw/driver_desktop.go | 233 + .../internal/driver/glfw/driver_notwindows.go | 7 + .../v2/internal/driver/glfw/driver_wasm.go | 25 + .../v2/internal/driver/glfw/driver_windows.go | 80 + .../v2/internal/driver/glfw/driver_xdg.go | 51 + .../fyne/v2/internal/driver/glfw/glfw_core.go | 12 + .../fyne/v2/internal/driver/glfw/glfw_es.go | 11 + .../fyne/v2/internal/driver/glfw/glfw_wasm.go | 5 + .../fyne/v2/internal/driver/glfw/key.go | 13 + .../fyne/v2/internal/driver/glfw/keyboard.go | 31 + .../fyne/v2/internal/driver/glfw/loop.go | 243 + .../v2/internal/driver/glfw/loop_desktop.go | 27 + .../fyne/v2/internal/driver/glfw/loop_wasm.go | 26 + .../fyne/v2/internal/driver/glfw/menu.go | 15 + .../fyne/v2/internal/driver/glfw/menu_bar.go | 209 + .../v2/internal/driver/glfw/menu_bar_item.go | 172 + .../v2/internal/driver/glfw/menu_darwin.go | 354 + .../v2/internal/driver/glfw/menu_darwin.m | 236 + .../v2/internal/driver/glfw/menu_notweb.go | 38 + .../v2/internal/driver/glfw/menu_other.go | 9 + .../fyne/v2/internal/driver/glfw/menu_wasm.go | 10 + .../fyne/v2/internal/driver/glfw/scale.go | 61 + .../driver/glfw/scroll_speed_darwin.go | 11 + .../driver/glfw/scroll_speed_default.go | 9 + .../internal/driver/glfw/scroll_speed_wasm.go | 9 + .../fyne/v2/internal/driver/glfw/window.go | 999 + .../v2/internal/driver/glfw/window_darwin.go | 39 + .../v2/internal/driver/glfw/window_darwin.m | 14 + .../v2/internal/driver/glfw/window_desktop.go | 819 + .../internal/driver/glfw/window_notdarwin.go | 22 + .../internal/driver/glfw/window_notwindows.go | 15 + .../v2/internal/driver/glfw/window_notxdg.go | 16 + .../v2/internal/driver/glfw/window_wasm.go | 706 + .../v2/internal/driver/glfw/window_wayland.go | 21 + .../v2/internal/driver/glfw/window_windows.go | 69 + .../v2/internal/driver/glfw/window_x11.go | 17 + .../v2/internal/driver/glfw/window_xdg.go | 9 + .../fyne/v2/internal/driver/mobile/README.txt | 7 + .../fyne/v2/internal/driver/mobile/android.c | 533 + .../v2/internal/driver/mobile/animation.go | 11 + .../driver/mobile/app/GoNativeActivity.java | 356 + .../v2/internal/driver/mobile/app/android.c | 307 + .../v2/internal/driver/mobile/app/android.go | 898 + .../fyne/v2/internal/driver/mobile/app/app.go | 166 + .../v2/internal/driver/mobile/app/app_unix.go | 19 + .../driver/mobile/app/callfn/callfn.go | 16 + .../driver/mobile/app/callfn/callfn_386.s | 11 + .../driver/mobile/app/callfn/callfn_amd64.s | 11 + .../driver/mobile/app/callfn/callfn_arm.s | 11 + .../driver/mobile/app/callfn/callfn_arm64.s | 11 + .../driver/mobile/app/darwin_desktop.go | 414 + .../driver/mobile/app/darwin_desktop.m | 244 + .../internal/driver/mobile/app/darwin_ios.go | 330 + .../internal/driver/mobile/app/darwin_ios.m | 434 + .../fyne/v2/internal/driver/mobile/app/doc.go | 88 + .../v2/internal/driver/mobile/app/keyboard.go | 130 + .../v2/internal/driver/mobile/app/mobile.go | 16 + .../v2/internal/driver/mobile/app/shiny.go | 33 + .../fyne/v2/internal/driver/mobile/app/x11.c | 174 + .../fyne/v2/internal/driver/mobile/app/x11.go | 147 + .../fyne/v2/internal/driver/mobile/canvas.go | 428 + .../v2/internal/driver/mobile/clipboard.go | 15 + .../driver/mobile/clipboard_android.go | 46 + .../driver/mobile/clipboard_desktop.go | 16 + .../internal/driver/mobile/clipboard_ios.go | 30 + .../v2/internal/driver/mobile/clipboard_ios.m | 15 + .../fyne/v2/internal/driver/mobile/device.go | 60 + .../internal/driver/mobile/device_android.go | 20 + .../internal/driver/mobile/device_desktop.go | 15 + .../v2/internal/driver/mobile/device_ios.go | 16 + .../internal/driver/mobile/device_wayland.go | 15 + .../fyne/v2/internal/driver/mobile/driver.go | 670 + .../internal/driver/mobile/driver_android.go | 23 + .../v2/internal/driver/mobile/driver_ios.go | 15 + .../v2/internal/driver/mobile/driver_ios.m | 12 + .../driver/mobile/event/key/code_string.go | 183 + .../internal/driver/mobile/event/key/key.go | 274 + .../mobile/event/lifecycle/lifecycle.go | 137 + .../driver/mobile/event/paint/paint.go | 27 + .../internal/driver/mobile/event/size/size.go | 98 + .../driver/mobile/event/touch/touch.go | 72 + .../fyne/v2/internal/driver/mobile/file.go | 137 + .../v2/internal/driver/mobile/file_android.go | 180 + .../v2/internal/driver/mobile/file_desktop.go | 35 + .../v2/internal/driver/mobile/file_ios.go | 158 + .../fyne/v2/internal/driver/mobile/file_ios.m | 62 + .../fyne/v2/internal/driver/mobile/folder.go | 23 + .../internal/driver/mobile/folder_android.go | 75 + .../internal/driver/mobile/folder_desktop.go | 22 + .../v2/internal/driver/mobile/folder_ios.go | 59 + .../v2/internal/driver/mobile/folder_ios.m | 29 + .../v2/internal/driver/mobile/gl/consts.go | 80 + .../internal/driver/mobile/gl/dll_windows.go | 242 + .../fyne/v2/internal/driver/mobile/gl/doc.go | 44 + .../fyne/v2/internal/driver/mobile/gl/fn.go | 96 + .../fyne/v2/internal/driver/mobile/gl/gl.go | 561 + .../v2/internal/driver/mobile/gl/interface.go | 285 + .../v2/internal/driver/mobile/gl/types.go | 90 + .../fyne/v2/internal/driver/mobile/gl/work.c | 181 + .../fyne/v2/internal/driver/mobile/gl/work.go | 175 + .../fyne/v2/internal/driver/mobile/gl/work.h | 104 + .../internal/driver/mobile/gl/work_other.go | 35 + .../internal/driver/mobile/gl/work_windows.go | 349 + .../v2/internal/driver/mobile/keyboard.go | 46 + .../fyne/v2/internal/driver/mobile/menu.go | 125 + .../v2/internal/driver/mobile/menubutton.go | 52 + .../driver/mobile/mobileinit/ctx_android.go | 135 + .../driver/mobile/mobileinit/mobileinit.go | 11 + .../mobile/mobileinit/mobileinit_android.go | 93 + .../mobile/mobileinit/mobileinit_ios.go | 36 + .../driver/mobile/mobileinit/mobileinit_ios.m | 7 + .../mobile/mobileinit/mobileinit_linux.go | 1 + .../v2/internal/driver/mobile/repository.go | 77 + .../fyne/v2/internal/driver/mobile/uri.go | 16 + .../v2/internal/driver/mobile/uri_android.go | 64 + .../fyne/v2/internal/driver/mobile/window.go | 209 + .../internal/driver/mobile/window_android.go | 26 + .../v2/internal/driver/mobile/window_ios.go | 14 + .../fyne.io/fyne/v2/internal/driver/util.go | 220 + .../fyne/v2/internal/hints_disabled.go | 9 + .../fyne.io/fyne/v2/internal/hints_enabled.go | 18 + .../fyne.io/fyne/v2/internal/metadata/data.go | 34 + .../fyne.io/fyne/v2/internal/metadata/icon.go | 41 + .../fyne.io/fyne/v2/internal/metadata/load.go | 34 + .../fyne.io/fyne/v2/internal/metadata/save.go | 36 + .../fyne.io/fyne/v2/internal/overlay_stack.go | 91 + .../fyne.io/fyne/v2/internal/painter/draw.go | 673 + .../fyne.io/fyne/v2/internal/painter/font.go | 389 + .../fyne/v2/internal/painter/font_prod.go | 21 + .../fyne/v2/internal/painter/gl/capture.go | 45 + .../fyne/v2/internal/painter/gl/context.go | 45 + .../fyne/v2/internal/painter/gl/draw.go | 642 + .../v2/internal/painter/gl/draw_desktop.go | 12 + .../v2/internal/painter/gl/draw_notdesktop.go | 10 + .../fyne.io/fyne/v2/internal/painter/gl/gl.go | 35 + .../fyne/v2/internal/painter/gl/gl_core.go | 360 + .../fyne/v2/internal/painter/gl/gl_es.go | 360 + .../v2/internal/painter/gl/gl_gomobile.go | 368 + .../fyne/v2/internal/painter/gl/gl_wasm.go | 343 + .../fyne/v2/internal/painter/gl/painter.go | 219 + .../fyne/v2/internal/painter/gl/shaders.go | 52 + .../v2/internal/painter/gl/shaders/arc.frag | 116 + .../internal/painter/gl/shaders/arc_es.frag | 126 + .../v2/internal/painter/gl/shaders/line.frag | 18 + .../v2/internal/painter/gl/shaders/line.vert | 14 + .../internal/painter/gl/shaders/line_es.frag | 28 + .../internal/painter/gl/shaders/line_es.vert | 24 + .../internal/painter/gl/shaders/polygon.frag | 59 + .../painter/gl/shaders/polygon_es.frag | 69 + .../painter/gl/shaders/rectangle.frag | 32 + .../painter/gl/shaders/rectangle.vert | 8 + .../painter/gl/shaders/rectangle_es.frag | 42 + .../painter/gl/shaders/rectangle_es.vert | 18 + .../painter/gl/shaders/round_rectangle.frag | 86 + .../gl/shaders/round_rectangle_es.frag | 96 + .../internal/painter/gl/shaders/simple.frag | 31 + .../internal/painter/gl/shaders/simple.vert | 16 + .../painter/gl/shaders/simple_es.frag | 41 + .../painter/gl/shaders/simple_es.vert | 26 + .../fyne/v2/internal/painter/gl/shaders_es.go | 52 + .../fyne/v2/internal/painter/gl/texture.go | 210 + .../fyne.io/fyne/v2/internal/painter/image.go | 68 + .../fyne/v2/internal/painter/software/draw.go | 376 + .../v2/internal/painter/software/painter.go | 66 + .../fyne/v2/internal/painter/vector.go | 41 + .../fyne.io/fyne/v2/internal/preferences.go | 316 + .../fyne/v2/internal/repository/file.go | 338 + .../fyne/v2/internal/repository/http.go | 99 + .../internal/repository/indexdb_file_wasm.go | 175 + .../v2/internal/repository/indexdb_wasm.go | 339 + .../fyne/v2/internal/repository/memory.go | 346 + .../fyne/v2/internal/repository/mime/mime.go | 13 + .../fyne.io/fyne/v2/internal/scale/scale.go | 43 + vendor/fyne.io/fyne/v2/internal/svg/svg.go | 330 + vendor/fyne.io/fyne/v2/internal/test/text.go | 18 + vendor/fyne.io/fyne/v2/internal/test/theme.go | 25 + vendor/fyne.io/fyne/v2/internal/test/util.go | 66 + .../fyne/v2/internal/test/util_helper.go | 73 + .../fyne.io/fyne/v2/internal/theme/feature.go | 29 + .../fyne.io/fyne/v2/internal/theme/render.go | 30 + .../fyne.io/fyne/v2/internal/theme/theme.go | 93 + .../fyne.io/fyne/v2/internal/widget/base.go | 143 + .../fyne/v2/internal/widget/base_renderer.go | 27 + .../v2/internal/widget/overlay_container.go | 89 + .../fyne/v2/internal/widget/scroller.go | 687 + .../widget/scroller_behavior_darwin.go | 12 + .../widget/scroller_behavior_darwin.m | 7 + .../widget/scroller_behavior_other.go | 7 + .../fyne.io/fyne/v2/internal/widget/shadow.go | 201 + .../v2/internal/widget/shadowing_renderer.go | 49 + .../v2/internal/widget/simple_renderer.go | 55 + vendor/fyne.io/fyne/v2/key.go | 200 + vendor/fyne.io/fyne/v2/key_darwin.go | 6 + vendor/fyne.io/fyne/v2/key_other.go | 8 + vendor/fyne.io/fyne/v2/lang/lang.go | 209 + vendor/fyne.io/fyne/v2/lang/lang_android.go | 11 + .../fyne.io/fyne/v2/lang/lang_notandroid.go | 5 + vendor/fyne.io/fyne/v2/lang/locale.go | 56 + .../fyne/v2/lang/translations/base.cs.json | 45 + .../fyne/v2/lang/translations/base.de.json | 45 + .../fyne/v2/lang/translations/base.el.json | 45 + .../fyne/v2/lang/translations/base.en.json | 45 + .../fyne/v2/lang/translations/base.es.json | 45 + .../fyne/v2/lang/translations/base.fr.json | 31 + .../fyne/v2/lang/translations/base.pl.json | 31 + .../fyne/v2/lang/translations/base.pt.json | 45 + .../fyne/v2/lang/translations/base.pt_BR.json | 31 + .../fyne/v2/lang/translations/base.ru.json | 45 + .../fyne/v2/lang/translations/base.sv.json | 45 + .../fyne/v2/lang/translations/base.ta.json | 45 + .../fyne/v2/lang/translations/base.uk.json | 45 + .../v2/lang/translations/base.zh_Hans.json | 45 + vendor/fyne.io/fyne/v2/layout.go | 11 + vendor/fyne.io/fyne/v2/layout/borderlayout.go | 108 + vendor/fyne.io/fyne/v2/layout/boxlayout.go | 227 + vendor/fyne.io/fyne/v2/layout/centerlayout.go | 38 + .../fyne/v2/layout/custompaddedlayout.go | 61 + vendor/fyne.io/fyne/v2/layout/formlayout.go | 133 + vendor/fyne.io/fyne/v2/layout/gridlayout.go | 156 + .../fyne.io/fyne/v2/layout/gridwraplayout.go | 70 + vendor/fyne.io/fyne/v2/layout/paddedlayout.go | 44 + vendor/fyne.io/fyne/v2/layout/rowwrap.go | 106 + vendor/fyne.io/fyne/v2/layout/spacer.go | 80 + vendor/fyne.io/fyne/v2/layout/stacklayout.go | 51 + vendor/fyne.io/fyne/v2/locale.go | 25 + vendor/fyne.io/fyne/v2/log.go | 21 + vendor/fyne.io/fyne/v2/math.go | 17 + vendor/fyne.io/fyne/v2/menu.go | 100 + vendor/fyne.io/fyne/v2/notification.go | 11 + vendor/fyne.io/fyne/v2/overlay_stack.go | 13 + vendor/fyne.io/fyne/v2/preferences.go | 95 + vendor/fyne.io/fyne/v2/resource.go | 84 + vendor/fyne.io/fyne/v2/scroll.go | 18 + vendor/fyne.io/fyne/v2/serialise.go | 26 + vendor/fyne.io/fyne/v2/settings.go | 44 + vendor/fyne.io/fyne/v2/shortcut.go | 172 + vendor/fyne.io/fyne/v2/staticcheck.conf | 1 + vendor/fyne.io/fyne/v2/storage.go | 14 + vendor/fyne.io/fyne/v2/storage/errors.go | 15 + vendor/fyne.io/fyne/v2/storage/file.go | 48 + vendor/fyne.io/fyne/v2/storage/filter.go | 65 + .../fyne/v2/storage/repository/errors.go | 24 + .../fyne/v2/storage/repository/generic.go | 322 + .../fyne/v2/storage/repository/parse.go | 114 + .../fyne/v2/storage/repository/repository.go | 301 + .../fyne.io/fyne/v2/storage/repository/uri.go | 114 + vendor/fyne.io/fyne/v2/storage/resource.go | 25 + vendor/fyne.io/fyne/v2/storage/uri.go | 611 + .../fyne.io/fyne/v2/storage/uri_root_error.go | 10 + vendor/fyne.io/fyne/v2/test/app.go | 264 + vendor/fyne.io/fyne/v2/test/app_helper.go | 18 + vendor/fyne.io/fyne/v2/test/canvas.go | 321 + vendor/fyne.io/fyne/v2/test/clipboard.go | 20 + vendor/fyne.io/fyne/v2/test/cloud.go | 31 + vendor/fyne.io/fyne/v2/test/device.go | 36 + vendor/fyne.io/fyne/v2/test/device_mobile.go | 7 + vendor/fyne.io/fyne/v2/test/device_other.go | 7 + vendor/fyne.io/fyne/v2/test/driver.go | 153 + vendor/fyne.io/fyne/v2/test/file.go | 106 + .../fyne.io/fyne/v2/test/markup_renderer.go | 658 + vendor/fyne.io/fyne/v2/test/notification.go | 1 + .../fyne/v2/test/notification_helper.go | 33 + vendor/fyne.io/fyne/v2/test/storage.go | 21 + vendor/fyne.io/fyne/v2/test/test.go | 243 + vendor/fyne.io/fyne/v2/test/test_helper.go | 160 + vendor/fyne.io/fyne/v2/test/theme.go | 234 + vendor/fyne.io/fyne/v2/test/theme_helper.go | 31 + vendor/fyne.io/fyne/v2/test/window.go | 140 + vendor/fyne.io/fyne/v2/test/window_helper.go | 19 + vendor/fyne.io/fyne/v2/text.go | 74 + vendor/fyne.io/fyne/v2/theme.go | 63 + vendor/fyne.io/fyne/v2/theme/bundled-emoji.go | 17 + vendor/fyne.io/fyne/v2/theme/bundled-fonts.go | 55 + vendor/fyne.io/fyne/v2/theme/bundled-icons.go | 783 + vendor/fyne.io/fyne/v2/theme/color.go | 482 + vendor/fyne.io/fyne/v2/theme/font.go | 119 + .../theme/font/DejaVuSansMono-Powerline.ttf | Bin 0 -> 341860 bytes .../fyne/v2/theme/font/EmojiOneColor.otf | Bin 0 -> 4232712 bytes .../v2/theme/font/InterSymbols-Regular.ttf | Bin 0 -> 8912 bytes .../fyne/v2/theme/font/NotoSans-Bold.ttf | Bin 0 -> 455164 bytes .../v2/theme/font/NotoSans-BoldItalic.ttf | Bin 0 -> 471004 bytes .../fyne/v2/theme/font/NotoSans-Italic.ttf | Bin 0 -> 470472 bytes .../fyne/v2/theme/font/NotoSans-Regular.ttf | Bin 0 -> 455188 bytes vendor/fyne.io/fyne/v2/theme/icons.go | 1409 + .../fyne.io/fyne/v2/theme/icons/account.svg | 1 + .../fyne/v2/theme/icons/arrow-back.svg | 1 + .../fyne/v2/theme/icons/arrow-down.svg | 1 + .../fyne/v2/theme/icons/arrow-drop-down.svg | 1 + .../fyne/v2/theme/icons/arrow-drop-up.svg | 1 + .../fyne/v2/theme/icons/arrow-forward.svg | 1 + .../fyne.io/fyne/v2/theme/icons/arrow-up.svg | 1 + .../fyne/v2/theme/icons/broken-image.svg | 1 + .../fyne.io/fyne/v2/theme/icons/calendar.svg | 5 + vendor/fyne.io/fyne/v2/theme/icons/cancel.svg | 1 + .../fyne/v2/theme/icons/check-box-checked.svg | 9 + .../fyne/v2/theme/icons/check-box-fill.svg | 8 + .../fyne/v2/theme/icons/check-box-partial.svg | 9 + .../fyne.io/fyne/v2/theme/icons/check-box.svg | 9 + vendor/fyne.io/fyne/v2/theme/icons/check.svg | 4 + .../fyne/v2/theme/icons/color-achromatic.svg | 1 + .../fyne/v2/theme/icons/color-chromatic.svg | 1 + .../fyne/v2/theme/icons/color-palette.svg | 4 + .../fyne.io/fyne/v2/theme/icons/computer.svg | 1 + .../fyne/v2/theme/icons/content-add.svg | 1 + .../fyne/v2/theme/icons/content-copy.svg | 1 + .../fyne/v2/theme/icons/content-cut.svg | 1 + .../fyne/v2/theme/icons/content-paste.svg | 1 + .../fyne/v2/theme/icons/content-redo.svg | 1 + .../fyne/v2/theme/icons/content-remove.svg | 1 + .../fyne/v2/theme/icons/content-undo.svg | 1 + vendor/fyne.io/fyne/v2/theme/icons/delete.svg | 1 + .../fyne.io/fyne/v2/theme/icons/desktop.svg | 1 + .../fyne/v2/theme/icons/document-create.svg | 1 + .../fyne/v2/theme/icons/document-print.svg | 1 + .../fyne/v2/theme/icons/document-save.svg | 1 + .../fyne.io/fyne/v2/theme/icons/document.svg | 1 + .../fyne.io/fyne/v2/theme/icons/download.svg | 1 + .../v2/theme/icons/drag-corner-indicator.svg | 11 + vendor/fyne.io/fyne/v2/theme/icons/error.svg | 1 + .../fyne/v2/theme/icons/file-application.svg | 3 + .../fyne/v2/theme/icons/file-audio.svg | 3 + .../fyne/v2/theme/icons/file-image.svg | 3 + .../fyne.io/fyne/v2/theme/icons/file-text.svg | 3 + .../fyne/v2/theme/icons/file-video.svg | 3 + vendor/fyne.io/fyne/v2/theme/icons/file.svg | 1 + .../fyne/v2/theme/icons/folder-new.svg | 1 + .../fyne/v2/theme/icons/folder-open.svg | 1 + vendor/fyne.io/fyne/v2/theme/icons/folder.svg | 1 + vendor/fyne.io/fyne/v2/theme/icons/fyne.png | Bin 0 -> 19560 bytes vendor/fyne.io/fyne/v2/theme/icons/grid.svg | 1 + vendor/fyne.io/fyne/v2/theme/icons/help.svg | 1 + .../fyne.io/fyne/v2/theme/icons/history.svg | 1 + vendor/fyne.io/fyne/v2/theme/icons/home.svg | 1 + vendor/fyne.io/fyne/v2/theme/icons/info.svg | 9 + vendor/fyne.io/fyne/v2/theme/icons/list.svg | 1 + vendor/fyne.io/fyne/v2/theme/icons/login.svg | 1 + vendor/fyne.io/fyne/v2/theme/icons/logout.svg | 1 + .../fyne/v2/theme/icons/mail-attachment.svg | 1 + .../fyne/v2/theme/icons/mail-compose.svg | 1 + .../fyne/v2/theme/icons/mail-forward.svg | 1 + .../fyne/v2/theme/icons/mail-reply.svg | 1 + .../fyne/v2/theme/icons/mail-reply_all.svg | 1 + .../fyne.io/fyne/v2/theme/icons/mail-send.svg | 1 + .../fyne.io/fyne/v2/theme/icons/maximize.svg | 1 + .../v2/theme/icons/media-fast-forward.svg | 1 + .../fyne/v2/theme/icons/media-fast-rewind.svg | 1 + .../fyne/v2/theme/icons/media-music.svg | 1 + .../fyne/v2/theme/icons/media-pause.svg | 1 + .../fyne/v2/theme/icons/media-photo.svg | 1 + .../fyne/v2/theme/icons/media-play.svg | 1 + .../fyne/v2/theme/icons/media-record.svg | 3 + .../fyne/v2/theme/icons/media-replay.svg | 1 + .../fyne/v2/theme/icons/media-skip-next.svg | 1 + .../v2/theme/icons/media-skip-previous.svg | 1 + .../fyne/v2/theme/icons/media-stop.svg | 1 + .../fyne/v2/theme/icons/media-video.svg | 1 + .../fyne/v2/theme/icons/menu-expand.svg | 1 + vendor/fyne.io/fyne/v2/theme/icons/menu.svg | 1 + .../fyne.io/fyne/v2/theme/icons/minimize.svg | 1 + .../fyne/v2/theme/icons/more-horizontal.svg | 3 + .../fyne/v2/theme/icons/more-vertical.svg | 3 + .../fyne.io/fyne/v2/theme/icons/question.svg | 6 + .../v2/theme/icons/radio-button-checked.svg | 9 + .../fyne/v2/theme/icons/radio-button-fill.svg | 9 + .../fyne/v2/theme/icons/radio-button.svg | 9 + .../fyne/v2/theme/icons/search-replace.svg | 1 + vendor/fyne.io/fyne/v2/theme/icons/search.svg | 1 + .../fyne.io/fyne/v2/theme/icons/settings.svg | 1 + .../fyne.io/fyne/v2/theme/icons/storage.svg | 1 + vendor/fyne.io/fyne/v2/theme/icons/upload.svg | 1 + .../fyne/v2/theme/icons/view-fullscreen.svg | 1 + .../fyne/v2/theme/icons/view-refresh.svg | 1 + .../fyne/v2/theme/icons/view-zoom-fit.svg | 1 + .../fyne/v2/theme/icons/view-zoom-in.svg | 1 + .../fyne/v2/theme/icons/view-zoom-out.svg | 1 + .../fyne/v2/theme/icons/visibility-off.svg | 1 + .../fyne/v2/theme/icons/visibility.svg | 1 + .../fyne/v2/theme/icons/volume-down.svg | 1 + .../fyne/v2/theme/icons/volume-mute.svg | 1 + .../fyne.io/fyne/v2/theme/icons/volume-up.svg | 1 + .../fyne.io/fyne/v2/theme/icons/warning.svg | 8 + vendor/fyne.io/fyne/v2/theme/json.go | 202 + vendor/fyne.io/fyne/v2/theme/legacy.go | 89 + vendor/fyne.io/fyne/v2/theme/size.go | 247 + vendor/fyne.io/fyne/v2/theme/theme.go | 356 + vendor/fyne.io/fyne/v2/theme/theme_desktop.go | 32 + vendor/fyne.io/fyne/v2/theme/theme_hints.go | 8 + vendor/fyne.io/fyne/v2/theme/theme_mobile.go | 9 + vendor/fyne.io/fyne/v2/theme/theme_other.go | 14 + vendor/fyne.io/fyne/v2/theme/theme_wasm.go | 9 + .../fyne.io/fyne/v2/theme/unbundled-emoji.go | 7 + vendor/fyne.io/fyne/v2/thread.go | 20 + vendor/fyne.io/fyne/v2/uri.go | 103 + vendor/fyne.io/fyne/v2/validation.go | 17 + vendor/fyne.io/fyne/v2/widget.go | 33 + vendor/fyne.io/fyne/v2/widget/accordion.go | 307 + vendor/fyne.io/fyne/v2/widget/activity.go | 177 + vendor/fyne.io/fyne/v2/widget/bind_helper.go | 77 + vendor/fyne.io/fyne/v2/widget/button.go | 455 + vendor/fyne.io/fyne/v2/widget/calendar.go | 240 + vendor/fyne.io/fyne/v2/widget/card.go | 241 + vendor/fyne.io/fyne/v2/widget/check.go | 398 + vendor/fyne.io/fyne/v2/widget/check_group.go | 275 + vendor/fyne.io/fyne/v2/widget/date_entry.go | 160 + vendor/fyne.io/fyne/v2/widget/entry.go | 2166 + .../fyne/v2/widget/entry_cursor_anim.go | 123 + .../fyne.io/fyne/v2/widget/entry_password.go | 87 + .../fyne/v2/widget/entry_validation.go | 136 + vendor/fyne.io/fyne/v2/widget/fileicon.go | 212 + vendor/fyne.io/fyne/v2/widget/form.go | 497 + vendor/fyne.io/fyne/v2/widget/gridwrap.go | 705 + vendor/fyne.io/fyne/v2/widget/hyperlink.go | 336 + vendor/fyne.io/fyne/v2/widget/icon.go | 84 + vendor/fyne.io/fyne/v2/widget/importance.go | 29 + vendor/fyne.io/fyne/v2/widget/label.go | 246 + vendor/fyne.io/fyne/v2/widget/list.go | 836 + vendor/fyne.io/fyne/v2/widget/locale.go | 120 + vendor/fyne.io/fyne/v2/widget/markdown.go | 192 + .../fyne/v2/widget/markdown_image_notweb.go | 18 + .../fyne/v2/widget/markdown_image_wasm.go | 29 + vendor/fyne.io/fyne/v2/widget/menu.go | 361 + vendor/fyne.io/fyne/v2/widget/menu_item.go | 404 + .../fyne/v2/widget/menu_item_darwin.go | 35 + .../fyne.io/fyne/v2/widget/menu_item_other.go | 37 + vendor/fyne.io/fyne/v2/widget/popup.go | 305 + vendor/fyne.io/fyne/v2/widget/popup_menu.go | 143 + vendor/fyne.io/fyne/v2/widget/progressbar.go | 198 + .../fyne/v2/widget/progressbarinfinite.go | 201 + vendor/fyne.io/fyne/v2/widget/radio_group.go | 248 + vendor/fyne.io/fyne/v2/widget/radio_item.go | 207 + vendor/fyne.io/fyne/v2/widget/richtext.go | 1142 + .../fyne/v2/widget/richtext_objects.go | 567 + vendor/fyne.io/fyne/v2/widget/select.go | 461 + vendor/fyne.io/fyne/v2/widget/select_entry.go | 108 + vendor/fyne.io/fyne/v2/widget/selectable.go | 415 + vendor/fyne.io/fyne/v2/widget/separator.go | 79 + vendor/fyne.io/fyne/v2/widget/slider.go | 552 + vendor/fyne.io/fyne/v2/widget/table.go | 1740 + vendor/fyne.io/fyne/v2/widget/textgrid.go | 918 + vendor/fyne.io/fyne/v2/widget/toolbar.go | 163 + vendor/fyne.io/fyne/v2/widget/tree.go | 1079 + vendor/fyne.io/fyne/v2/widget/widget.go | 226 + vendor/fyne.io/fyne/v2/window.go | 107 + vendor/fyne.io/systray/.gitignore | 13 + vendor/fyne.io/systray/CHANGELOG.md | 125 + vendor/fyne.io/systray/LICENSE | 202 + vendor/fyne.io/systray/Makefile | 18 + vendor/fyne.io/systray/README.md | 147 + .../internal/generated/menu/dbus_menu.go | 484 + .../notifier/status_notifier_item.go | 633 + vendor/fyne.io/systray/systray.go | 308 + vendor/fyne.io/systray/systray.h | 26 + vendor/fyne.io/systray/systray_darwin.go | 213 + vendor/fyne.io/systray/systray_darwin.m | 464 + vendor/fyne.io/systray/systray_menu_unix.go | 367 + .../fyne.io/systray/systray_notifier_unix.go | 44 + vendor/fyne.io/systray/systray_unix.go | 435 + vendor/fyne.io/systray/systray_windows.go | 1147 + vendor/github.com/BurntSushi/toml/.gitignore | 2 + vendor/github.com/BurntSushi/toml/COPYING | 21 + vendor/github.com/BurntSushi/toml/README.md | 120 + vendor/github.com/BurntSushi/toml/decode.go | 638 + .../github.com/BurntSushi/toml/deprecated.go | 29 + vendor/github.com/BurntSushi/toml/doc.go | 8 + vendor/github.com/BurntSushi/toml/encode.go | 776 + vendor/github.com/BurntSushi/toml/error.go | 347 + .../github.com/BurntSushi/toml/internal/tz.go | 36 + vendor/github.com/BurntSushi/toml/lex.go | 1272 + vendor/github.com/BurntSushi/toml/meta.go | 145 + vendor/github.com/BurntSushi/toml/parse.go | 845 + .../github.com/BurntSushi/toml/type_fields.go | 238 + .../github.com/BurntSushi/toml/type_toml.go | 65 + vendor/github.com/davecgh/go-spew/LICENSE | 15 + .../github.com/davecgh/go-spew/spew/bypass.go | 145 + .../davecgh/go-spew/spew/bypasssafe.go | 38 + .../github.com/davecgh/go-spew/spew/common.go | 341 + .../github.com/davecgh/go-spew/spew/config.go | 306 + vendor/github.com/davecgh/go-spew/spew/doc.go | 211 + .../github.com/davecgh/go-spew/spew/dump.go | 509 + .../github.com/davecgh/go-spew/spew/format.go | 419 + .../github.com/davecgh/go-spew/spew/spew.go | 148 + .../ebitengine/oto/v3/.clang-format | 1 + .../ebitengine/oto/v3/.gitattributes | 1 + .../github.com/ebitengine/oto/v3/.gitignore | 2 + vendor/github.com/ebitengine/oto/v3/LICENSE | 201 + vendor/github.com/ebitengine/oto/v3/README.md | 234 + .../ebitengine/oto/v3/api_darwin.go | 95 + .../ebitengine/oto/v3/api_wasapi_windows.go | 479 + .../ebitengine/oto/v3/api_winmm_windows.go | 174 + .../github.com/ebitengine/oto/v3/context.go | 181 + .../ebitengine/oto/v3/driver_android.go | 49 + .../ebitengine/oto/v3/driver_console.go | 74 + .../ebitengine/oto/v3/driver_darwin.go | 299 + .../github.com/ebitengine/oto/v3/driver_js.go | 223 + .../ebitengine/oto/v3/driver_nintendosdk.cpp | 25 + .../ebitengine/oto/v3/driver_playstation5.cpp | 25 + .../ebitengine/oto/v3/driver_unix.go | 278 + .../oto/v3/driver_wasapi_windows.go | 470 + .../ebitengine/oto/v3/driver_windows.go | 163 + .../ebitengine/oto/v3/driver_winmm_windows.go | 297 + .../ebitengine/oto/v3/internal/mux/mux.go | 591 + .../oto/v3/internal/oboe/.clang-format | 2 + .../oto/v3/internal/oboe/LICENSE-oboe | 202 + .../oto/v3/internal/oboe/README-oboe.md | 54 + .../oto/v3/internal/oboe/binding_android.cpp | 191 + .../oto/v3/internal/oboe/binding_android.go | 60 + .../oto/v3/internal/oboe/binding_android.h | 37 + .../oto/v3/internal/oboe/generate.go | 17 + .../oboe_aaudio_AAudioExtensions_android.h | 309 + .../oboe/oboe_aaudio_AAudioLoader_android.cpp | 634 + .../oboe/oboe_aaudio_AAudioLoader_android.h | 396 + .../oboe_aaudio_AudioStreamAAudio_android.cpp | 1186 + .../oboe_aaudio_AudioStreamAAudio_android.h | 198 + .../oboe/oboe_common_AdpfWrapper_android.cpp | 277 + .../oboe/oboe_common_AdpfWrapper_android.h | 173 + .../oboe_common_AudioSourceCaller_android.cpp | 38 + .../oboe_common_AudioSourceCaller_android.h | 83 + ...oboe_common_AudioStreamBuilder_android.cpp | 252 + .../oboe/oboe_common_AudioStream_android.cpp | 258 + ...common_DataConversionFlowGraph_android.cpp | 266 + ...e_common_DataConversionFlowGraph_android.h | 86 + .../oboe_common_FilterAudioStream_android.cpp | 106 + .../oboe_common_FilterAudioStream_android.h | 223 + .../oboe_common_FixedBlockAdapter_android.cpp | 38 + .../oboe_common_FixedBlockAdapter_android.h | 67 + .../oboe_common_FixedBlockReader_android.cpp | 73 + .../oboe_common_FixedBlockReader_android.h | 60 + .../oboe_common_FixedBlockWriter_android.cpp | 73 + .../oboe_common_FixedBlockWriter_android.h | 54 + .../oboe/oboe_common_LatencyTuner_android.cpp | 108 + .../oboe_common_MonotonicCounter_android.h | 112 + .../oboe/oboe_common_OboeDebug_android.h | 41 + .../oboe_common_OboeExtensions_android.cpp | 40 + .../oboe_common_QuirksManager_android.cpp | 319 + .../oboe/oboe_common_QuirksManager_android.h | 134 + .../oboe_common_SourceFloatCaller_android.cpp | 30 + .../oboe_common_SourceFloatCaller_android.h | 44 + .../oboe_common_SourceI16Caller_android.cpp | 47 + .../oboe_common_SourceI16Caller_android.h | 49 + .../oboe_common_SourceI24Caller_android.cpp | 56 + .../oboe_common_SourceI24Caller_android.h | 53 + .../oboe_common_SourceI32Caller_android.cpp | 47 + .../oboe_common_SourceI32Caller_android.h | 53 + ...oboe_common_StabilizedCallback_android.cpp | 112 + .../oboe/oboe_common_Trace_android.cpp | 94 + .../internal/oboe/oboe_common_Trace_android.h | 72 + .../oboe/oboe_common_Utilities_android.cpp | 403 + .../oboe/oboe_common_Version_android.cpp | 28 + .../oboe/oboe_fifo_FifoBuffer_android.cpp | 178 + .../oboe_fifo_FifoControllerBase_android.cpp | 68 + ...oe_fifo_FifoControllerIndirect_android.cpp | 32 + ...oboe_fifo_FifoControllerIndirect_android.h | 66 + .../oboe/oboe_fifo_FifoController_android.cpp | 30 + .../oboe/oboe_fifo_FifoController_android.h | 62 + ...lowgraph_ChannelCountConverter_android.cpp | 52 + ..._flowgraph_ChannelCountConverter_android.h | 52 + .../oboe_flowgraph_ClipToRange_android.cpp | 38 + .../oboe/oboe_flowgraph_ClipToRange_android.h | 68 + .../oboe_flowgraph_FlowGraphNode_android.cpp | 114 + .../oboe_flowgraph_FlowGraphNode_android.h | 450 + ...boe_flowgraph_FlowgraphUtilities_android.h | 70 + .../oboe/oboe_flowgraph_Limiter_android.cpp | 67 + .../oboe/oboe_flowgraph_Limiter_android.h | 64 + ...flowgraph_ManyToMultiConverter_android.cpp | 47 + ...e_flowgraph_ManyToMultiConverter_android.h | 53 + .../oboe/oboe_flowgraph_MonoBlend_android.cpp | 46 + .../oboe/oboe_flowgraph_MonoBlend_android.h | 48 + ...flowgraph_MonoToMultiConverter_android.cpp | 41 + ...e_flowgraph_MonoToMultiConverter_android.h | 49 + ...flowgraph_MultiToManyConverter_android.cpp | 47 + ...e_flowgraph_MultiToManyConverter_android.h | 49 + ...flowgraph_MultiToMonoConverter_android.cpp | 41 + ...e_flowgraph_MultiToMonoConverter_android.h | 49 + .../oboe_flowgraph_RampLinear_android.cpp | 81 + .../oboe/oboe_flowgraph_RampLinear_android.h | 96 + ..._flowgraph_SampleRateConverter_android.cpp | 72 + ...oe_flowgraph_SampleRateConverter_android.h | 63 + .../oboe/oboe_flowgraph_SinkFloat_android.cpp | 46 + .../oboe/oboe_flowgraph_SinkFloat_android.h | 45 + .../oboe/oboe_flowgraph_SinkI16_android.cpp | 57 + .../oboe/oboe_flowgraph_SinkI16_android.h | 43 + .../oboe/oboe_flowgraph_SinkI24_android.cpp | 66 + .../oboe/oboe_flowgraph_SinkI24_android.h | 44 + .../oboe/oboe_flowgraph_SinkI32_android.cpp | 55 + .../oboe/oboe_flowgraph_SinkI32_android.h | 40 + .../oboe/oboe_flowgraph_SinkI8_24_android.cpp | 55 + .../oboe/oboe_flowgraph_SinkI8_24_android.h | 40 + .../oboe_flowgraph_SourceFloat_android.cpp | 42 + .../oboe/oboe_flowgraph_SourceFloat_android.h | 44 + .../oboe/oboe_flowgraph_SourceI16_android.cpp | 54 + .../oboe/oboe_flowgraph_SourceI16_android.h | 42 + .../oboe/oboe_flowgraph_SourceI24_android.cpp | 65 + .../oboe/oboe_flowgraph_SourceI24_android.h | 43 + .../oboe/oboe_flowgraph_SourceI32_android.cpp | 54 + .../oboe/oboe_flowgraph_SourceI32_android.h | 42 + .../oboe_flowgraph_SourceI8_24_android.cpp | 54 + .../oboe/oboe_flowgraph_SourceI8_24_android.h | 42 + ...resampler_HyperbolicCosineWindow_android.h | 71 + ...owgraph_resampler_IntegerRatio_android.cpp | 50 + ...flowgraph_resampler_IntegerRatio_android.h | 54 + ...flowgraph_resampler_KaiserWindow_android.h | 90 + ...raph_resampler_LinearResampler_android.cpp | 42 + ...wgraph_resampler_LinearResampler_android.h | 47 + ...esampler_MultiChannelResampler_android.cpp | 171 + ..._resampler_MultiChannelResampler_android.h | 281 + ...sampler_PolyphaseResamplerMono_android.cpp | 63 + ...resampler_PolyphaseResamplerMono_android.h | 41 + ...mpler_PolyphaseResamplerStereo_android.cpp | 79 + ...sampler_PolyphaseResamplerStereo_android.h | 41 + ...h_resampler_PolyphaseResampler_android.cpp | 61 + ...aph_resampler_PolyphaseResampler_android.h | 53 + ...h_resampler_ResamplerDefinitions_android.h | 27 + ..._resampler_SincResamplerStereo_android.cpp | 81 + ...ph_resampler_SincResamplerStereo_android.h | 42 + ...wgraph_resampler_SincResampler_android.cpp | 72 + ...lowgraph_resampler_SincResampler_android.h | 50 + .../oboe/oboe_oboe_AudioClock_android.h | 74 + .../oboe/oboe_oboe_AudioStreamBase_android.h | 422 + .../oboe_oboe_AudioStreamBuilder_android.h | 782 + .../oboe_oboe_AudioStreamCallback_android.h | 291 + .../oboe/oboe_oboe_AudioStream_android.h | 958 + .../oboe/oboe_oboe_Definitions_android.h | 1217 + .../oboe/oboe_oboe_FifoBuffer_android.h | 164 + .../oboe_oboe_FifoControllerBase_android.h | 112 + .../oboe/oboe_oboe_FullDuplexStream_android.h | 356 + .../oboe/oboe_oboe_LatencyTuner_android.h | 150 + .../oboe/oboe_oboe_OboeExtensions_android.h | 69 + .../v3/internal/oboe/oboe_oboe_Oboe_android.h | 44 + .../oboe/oboe_oboe_ResultWithValue_android.h | 159 + .../oboe_oboe_StabilizedCallback_android.h | 75 + .../oboe/oboe_oboe_Utilities_android.h | 103 + .../internal/oboe/oboe_oboe_Version_android.h | 92 + ...nsles_AudioInputStreamOpenSLES_android.cpp | 359 + ...pensles_AudioInputStreamOpenSLES_android.h | 64 + ...sles_AudioOutputStreamOpenSLES_android.cpp | 457 + ...ensles_AudioOutputStreamOpenSLES_android.h | 78 + ...e_opensles_AudioStreamBuffered_android.cpp | 285 + ...boe_opensles_AudioStreamBuffered_android.h | 96 + ...e_opensles_AudioStreamOpenSLES_android.cpp | 523 + ...boe_opensles_AudioStreamOpenSLES_android.h | 145 + .../oboe_opensles_EngineOpenSLES_android.cpp | 206 + .../oboe_opensles_EngineOpenSLES_android.h | 107 + ...boe_opensles_OpenSLESUtilities_android.cpp | 103 + .../oboe_opensles_OpenSLESUtilities_android.h | 44 + ...e_opensles_OutputMixerOpenSLES_android.cpp | 74 + ...boe_opensles_OutputMixerOpenSLES_android.h | 57 + vendor/github.com/ebitengine/oto/v3/player.go | 95 + .../github.com/ebitengine/purego/.gitignore | 1 + vendor/github.com/ebitengine/purego/LICENSE | 201 + vendor/github.com/ebitengine/purego/README.md | 113 + .../github.com/ebitengine/purego/abi_amd64.h | 99 + .../github.com/ebitengine/purego/abi_arm64.h | 39 + .../ebitengine/purego/abi_loong64.h | 60 + vendor/github.com/ebitengine/purego/cgo.go | 19 + .../github.com/ebitengine/purego/dlerror.go | 17 + vendor/github.com/ebitengine/purego/dlfcn.go | 99 + .../ebitengine/purego/dlfcn_android.go | 34 + .../ebitengine/purego/dlfcn_darwin.go | 19 + .../ebitengine/purego/dlfcn_freebsd.go | 14 + .../ebitengine/purego/dlfcn_linux.go | 16 + .../ebitengine/purego/dlfcn_netbsd.go | 15 + .../ebitengine/purego/dlfcn_nocgo_freebsd.go | 11 + .../ebitengine/purego/dlfcn_nocgo_linux.go | 19 + .../ebitengine/purego/dlfcn_nocgo_netbsd.go | 9 + .../ebitengine/purego/dlfcn_playground.go | 24 + .../ebitengine/purego/dlfcn_stubs.s | 26 + vendor/github.com/ebitengine/purego/func.go | 489 + vendor/github.com/ebitengine/purego/gen.go | 6 + .../ebitengine/purego/go_runtime.go | 13 + .../purego/internal/cgo/dlfcn_cgo_unix.go | 56 + .../ebitengine/purego/internal/cgo/empty.go | 6 + .../purego/internal/cgo/syscall_cgo_unix.go | 55 + .../purego/internal/fakecgo/abi_amd64.h | 99 + .../purego/internal/fakecgo/abi_arm64.h | 39 + .../purego/internal/fakecgo/abi_loong64.h | 60 + .../purego/internal/fakecgo/asm_amd64.s | 39 + .../purego/internal/fakecgo/asm_arm64.s | 36 + .../purego/internal/fakecgo/asm_loong64.s | 40 + .../purego/internal/fakecgo/callbacks.go | 93 + .../ebitengine/purego/internal/fakecgo/doc.go | 32 + .../purego/internal/fakecgo/freebsd.go | 27 + .../internal/fakecgo/go_darwin_amd64.go | 73 + .../internal/fakecgo/go_darwin_arm64.go | 88 + .../internal/fakecgo/go_freebsd_amd64.go | 95 + .../internal/fakecgo/go_freebsd_arm64.go | 98 + .../purego/internal/fakecgo/go_libinit.go | 72 + .../purego/internal/fakecgo/go_linux_amd64.go | 95 + .../purego/internal/fakecgo/go_linux_arm64.go | 98 + .../internal/fakecgo/go_linux_loong64.go | 92 + .../purego/internal/fakecgo/go_netbsd.go | 106 + .../purego/internal/fakecgo/go_setenv.go | 18 + .../purego/internal/fakecgo/go_util.go | 37 + .../purego/internal/fakecgo/iscgo.go | 19 + .../purego/internal/fakecgo/libcgo.go | 39 + .../purego/internal/fakecgo/libcgo_darwin.go | 26 + .../purego/internal/fakecgo/libcgo_freebsd.go | 20 + .../purego/internal/fakecgo/libcgo_linux.go | 20 + .../purego/internal/fakecgo/libcgo_netbsd.go | 26 + .../purego/internal/fakecgo/netbsd.go | 23 + .../purego/internal/fakecgo/setenv.go | 19 + .../purego/internal/fakecgo/symbols.go | 231 + .../purego/internal/fakecgo/symbols_darwin.go | 30 + .../internal/fakecgo/symbols_freebsd.go | 30 + .../purego/internal/fakecgo/symbols_linux.go | 30 + .../purego/internal/fakecgo/symbols_netbsd.go | 30 + .../internal/fakecgo/trampolines_amd64.s | 104 + .../internal/fakecgo/trampolines_arm64.s | 72 + .../internal/fakecgo/trampolines_loong64.s | 71 + .../internal/fakecgo/trampolines_stubs.s | 94 + .../purego/internal/strings/strings.go | 40 + vendor/github.com/ebitengine/purego/is_ios.go | 13 + vendor/github.com/ebitengine/purego/nocgo.go | 25 + .../ebitengine/purego/struct_amd64.go | 264 + .../ebitengine/purego/struct_arm64.go | 284 + .../ebitengine/purego/struct_loong64.go | 190 + .../ebitengine/purego/struct_other.go | 20 + .../github.com/ebitengine/purego/sys_amd64.s | 164 + .../github.com/ebitengine/purego/sys_arm64.s | 92 + .../ebitengine/purego/sys_loong64.s | 96 + .../ebitengine/purego/sys_unix_arm64.s | 70 + .../ebitengine/purego/sys_unix_loong64.s | 75 + .../github.com/ebitengine/purego/syscall.go | 56 + .../ebitengine/purego/syscall_cgo_linux.go | 21 + .../ebitengine/purego/syscall_sysv.go | 226 + .../ebitengine/purego/syscall_windows.go | 46 + .../ebitengine/purego/zcallback_amd64.s | 2014 + .../ebitengine/purego/zcallback_arm64.s | 4014 ++ .../ebitengine/purego/zcallback_loong64.s | 4014 ++ vendor/github.com/fredbi/uri/.gitignore | 3 + vendor/github.com/fredbi/uri/.golangci.yml | 65 + vendor/github.com/fredbi/uri/LICENSE.md | 22 + vendor/github.com/fredbi/uri/README.md | 244 + vendor/github.com/fredbi/uri/builder.go | 59 + vendor/github.com/fredbi/uri/decode.go | 206 + vendor/github.com/fredbi/uri/default_ports.go | 131 + vendor/github.com/fredbi/uri/dns.go | 318 + vendor/github.com/fredbi/uri/errors.go | 101 + vendor/github.com/fredbi/uri/ip.go | 229 + vendor/github.com/fredbi/uri/post_go20.go | 14 + vendor/github.com/fredbi/uri/pre_go20.go | 64 + vendor/github.com/fredbi/uri/uri.go | 855 + .../github.com/fsnotify/fsnotify/.cirrus.yml | 14 + .../github.com/fsnotify/fsnotify/.gitignore | 10 + vendor/github.com/fsnotify/fsnotify/.mailmap | 2 + .../github.com/fsnotify/fsnotify/CHANGELOG.md | 602 + .../fsnotify/fsnotify/CONTRIBUTING.md | 145 + vendor/github.com/fsnotify/fsnotify/LICENSE | 25 + vendor/github.com/fsnotify/fsnotify/README.md | 182 + .../fsnotify/fsnotify/backend_fen.go | 467 + .../fsnotify/fsnotify/backend_inotify.go | 583 + .../fsnotify/fsnotify/backend_kqueue.go | 705 + .../fsnotify/fsnotify/backend_other.go | 22 + .../fsnotify/fsnotify/backend_windows.go | 680 + .../github.com/fsnotify/fsnotify/fsnotify.go | 496 + .../fsnotify/fsnotify/internal/darwin.go | 39 + .../fsnotify/internal/debug_darwin.go | 57 + .../fsnotify/internal/debug_dragonfly.go | 33 + .../fsnotify/internal/debug_freebsd.go | 42 + .../fsnotify/internal/debug_kqueue.go | 32 + .../fsnotify/fsnotify/internal/debug_linux.go | 56 + .../fsnotify/internal/debug_netbsd.go | 25 + .../fsnotify/internal/debug_openbsd.go | 28 + .../fsnotify/internal/debug_solaris.go | 45 + .../fsnotify/internal/debug_windows.go | 40 + .../fsnotify/fsnotify/internal/freebsd.go | 31 + .../fsnotify/fsnotify/internal/internal.go | 2 + .../fsnotify/fsnotify/internal/unix.go | 31 + .../fsnotify/fsnotify/internal/unix2.go | 7 + .../fsnotify/fsnotify/internal/windows.go | 41 + vendor/github.com/fsnotify/fsnotify/shared.go | 64 + .../fsnotify/fsnotify/staticcheck.conf | 3 + .../fsnotify/fsnotify/system_bsd.go | 7 + .../fsnotify/fsnotify/system_darwin.go | 8 + vendor/github.com/fyne-io/gl-js/LICENSE | 27 + vendor/github.com/fyne-io/gl-js/README.md | 49 + vendor/github.com/fyne-io/gl-js/consts.go | 355 + vendor/github.com/fyne-io/gl-js/doc.go | 40 + vendor/github.com/fyne-io/gl-js/gl_opengl.go | 1229 + .../github.com/fyne-io/gl-js/gl_opengles.go | 718 + .../gl-js/gl_webgl_convertions_wasm.go | 96 + .../github.com/fyne-io/gl-js/gl_webgl_wasm.go | 712 + vendor/github.com/fyne-io/gl-js/types.go | 37 + .../github.com/fyne-io/gl-js/types_opengl.go | 89 + .../fyne-io/gl-js/types_opengles.go | 115 + .../fyne-io/gl-js/types_webgl_wasm.go | 119 + vendor/github.com/fyne-io/glfw-js/.gitignore | 1 + vendor/github.com/fyne-io/glfw-js/LICENSE | 21 + vendor/github.com/fyne-io/glfw-js/README.md | 28 + .../fyne-io/glfw-js/browser_wasm.go | 1098 + .../fyne-io/glfw-js/clipboard_glfw.go | 19 + .../fyne-io/glfw-js/clipboard_wasm.go | 42 + .../fyne-io/glfw-js/context_webgl_wasm.go | 60 + vendor/github.com/fyne-io/glfw-js/desktop.go | 628 + vendor/github.com/fyne-io/glfw-js/glfw.go | 27 + .../github.com/fyne-io/glfw-js/hint_glfw.go | 56 + .../github.com/fyne-io/glfw-js/hint_wasm.go | 47 + vendor/github.com/fyne-io/image/LICENSE | 29 + .../fyne-io/image/ico/LICENSE-reader | 201 + .../fyne-io/image/ico/LICENSE-writer | 27 + vendor/github.com/fyne-io/image/ico/reader.go | 223 + vendor/github.com/fyne-io/image/ico/writer.go | 72 + vendor/github.com/fyne-io/oksvg/.gitignore | 2 + vendor/github.com/fyne-io/oksvg/LICENSE | 29 + vendor/github.com/fyne-io/oksvg/README.md | 39 + .../github.com/fyne-io/oksvg/definitions.go | 14 + vendor/github.com/fyne-io/oksvg/draw.go | 422 + .../github.com/fyne-io/oksvg/icon_cursor.go | 368 + .../github.com/fyne-io/oksvg/path_cursor.go | 412 + vendor/github.com/fyne-io/oksvg/path_style.go | 39 + vendor/github.com/fyne-io/oksvg/public.go | 282 + vendor/github.com/fyne-io/oksvg/svg_icon.go | 37 + vendor/github.com/fyne-io/oksvg/svg_path.go | 109 + vendor/github.com/fyne-io/oksvg/utils.go | 175 + vendor/github.com/go-gl/gl/LICENSE | 21 + .../github.com/go-gl/gl/v2.1/gl/KHR/dummy.go | 5 + .../go-gl/gl/v2.1/gl/KHR/khrplatform.h | 290 + .../go-gl/gl/v2.1/gl/build_cgo_hack.go | 17 + .../go-gl/gl/v2.1/gl/conversions.go | 116 + vendor/github.com/go-gl/gl/v2.1/gl/debug.go | 31 + vendor/github.com/go-gl/gl/v2.1/gl/package.go | 33159 ++++++++++++ .../github.com/go-gl/gl/v2.1/gl/procaddr.go | 75 + .../go-gl/gl/v3.1/gles2/KHR/dummy.go | 5 + .../go-gl/gl/v3.1/gles2/KHR/khrplatform.h | 290 + .../go-gl/gl/v3.1/gles2/build_cgo_hack.go | 17 + .../go-gl/gl/v3.1/gles2/conversions.go | 116 + .../github.com/go-gl/gl/v3.1/gles2/debug.go | 31 + .../github.com/go-gl/gl/v3.1/gles2/package.go | 11714 ++++ .../go-gl/gl/v3.1/gles2/procaddr.go | 75 + .../go-gl/glfw/v3.3/glfw/GLFW_C_REVISION.txt | 1 + .../github.com/go-gl/glfw/v3.3/glfw/LICENSE | 27 + .../github.com/go-gl/glfw/v3.3/glfw/build.go | 53 + .../go-gl/glfw/v3.3/glfw/build_cgo_hack.go | 19 + .../github.com/go-gl/glfw/v3.3/glfw/c_glfw.go | 12 + .../go-gl/glfw/v3.3/glfw/c_glfw_bsd.go | 30 + .../go-gl/glfw/v3.3/glfw/c_glfw_darwin.go | 14 + .../go-gl/glfw/v3.3/glfw/c_glfw_lin.go | 30 + .../go-gl/glfw/v3.3/glfw/c_glfw_windows.go | 13 + .../go-gl/glfw/v3.3/glfw/context.go | 94 + .../github.com/go-gl/glfw/v3.3/glfw/error.c | 3 + .../github.com/go-gl/glfw/v3.3/glfw/error.go | 203 + .../github.com/go-gl/glfw/v3.3/glfw/glfw.go | 118 + .../go-gl/glfw/v3.3/glfw/glfw/LICENSE.md | 23 + .../go-gl/glfw/v3.3/glfw/glfw/deps/dummy.go | 12 + .../go-gl/glfw/v3.3/glfw/glfw/deps/getopt.c | 230 + .../go-gl/glfw/v3.3/glfw/glfw/deps/getopt.h | 57 + .../glfw/v3.3/glfw/glfw/deps/glad/dummy.go | 5 + .../go-gl/glfw/v3.3/glfw/glfw/deps/glad/gl.h | 3840 ++ .../v3.3/glfw/glfw/deps/glad/khrplatform.h | 282 + .../v3.3/glfw/glfw/deps/glad/vk_platform.h | 84 + .../glfw/v3.3/glfw/glfw/deps/glad/vulkan.h | 5508 ++ .../go-gl/glfw/v3.3/glfw/glfw/deps/glad_gl.c | 1791 + .../glfw/v3.3/glfw/glfw/deps/glad_vulkan.c | 733 + .../go-gl/glfw/v3.3/glfw/glfw/deps/linmath.h | 574 + .../glfw/glfw/deps/mingw/_mingw_dxhelper.h | 117 + .../glfw/v3.3/glfw/glfw/deps/mingw/dinput.h | 2467 + .../glfw/v3.3/glfw/glfw/deps/mingw/dummy.go | 5 + .../glfw/v3.3/glfw/glfw/deps/mingw/xinput.h | 239 + .../go-gl/glfw/v3.3/glfw/glfw/deps/nuklear.h | 25539 +++++++++ .../v3.3/glfw/glfw/deps/nuklear_glfw_gl2.h | 381 + .../v3.3/glfw/glfw/deps/stb_image_write.h | 1724 + .../glfw/v3.3/glfw/glfw/deps/tinycthread.c | 594 + .../glfw/v3.3/glfw/glfw/deps/tinycthread.h | 443 + .../glfw/v3.3/glfw/glfw/deps/vs2008/dummy.go | 5 + .../glfw/v3.3/glfw/glfw/deps/vs2008/stdint.h | 247 + .../glfw/v3.3/glfw/glfw/include/GLFW/dummy.go | 5 + .../glfw/v3.3/glfw/glfw/include/GLFW/glfw3.h | 5936 +++ .../v3.3/glfw/glfw/include/GLFW/glfw3native.h | 634 + .../glfw/v3.3/glfw/glfw/src/cocoa_init.m | 633 + .../glfw/v3.3/glfw/glfw/src/cocoa_joystick.h | 51 + .../glfw/v3.3/glfw/glfw/src/cocoa_joystick.m | 493 + .../glfw/v3.3/glfw/glfw/src/cocoa_monitor.m | 627 + .../glfw/v3.3/glfw/glfw/src/cocoa_platform.h | 220 + .../glfw/v3.3/glfw/glfw/src/cocoa_time.c | 62 + .../glfw/v3.3/glfw/glfw/src/cocoa_window.m | 1940 + .../go-gl/glfw/v3.3/glfw/glfw/src/context.c | 767 + .../go-gl/glfw/v3.3/glfw/glfw/src/dummy.go | 5 + .../glfw/v3.3/glfw/glfw/src/egl_context.c | 850 + .../glfw/v3.3/glfw/glfw/src/egl_context.h | 217 + .../glfw/v3.3/glfw/glfw/src/glx_context.c | 706 + .../glfw/v3.3/glfw/glfw/src/glx_context.h | 178 + .../go-gl/glfw/v3.3/glfw/glfw/src/init.c | 426 + .../go-gl/glfw/v3.3/glfw/glfw/src/input.c | 1386 + .../go-gl/glfw/v3.3/glfw/glfw/src/internal.h | 789 + .../glfw/v3.3/glfw/glfw/src/linux_joystick.c | 435 + .../glfw/v3.3/glfw/glfw/src/linux_joystick.h | 64 + .../go-gl/glfw/v3.3/glfw/glfw/src/mappings.h | 1001 + .../go-gl/glfw/v3.3/glfw/glfw/src/monitor.c | 542 + .../glfw/v3.3/glfw/glfw/src/nsgl_context.h | 66 + .../glfw/v3.3/glfw/glfw/src/nsgl_context.m | 375 + .../go-gl/glfw/v3.3/glfw/glfw/src/null_init.c | 52 + .../glfw/v3.3/glfw/glfw/src/null_joystick.c | 44 + .../glfw/v3.3/glfw/glfw/src/null_joystick.h | 31 + .../glfw/v3.3/glfw/glfw/src/null_monitor.c | 77 + .../glfw/v3.3/glfw/glfw/src/null_platform.h | 62 + .../glfw/v3.3/glfw/glfw/src/null_window.c | 335 + .../glfw/v3.3/glfw/glfw/src/osmesa_context.c | 385 + .../glfw/v3.3/glfw/glfw/src/osmesa_context.h | 92 + .../glfw/v3.3/glfw/glfw/src/posix_thread.c | 105 + .../glfw/v3.3/glfw/glfw/src/posix_thread.h | 49 + .../glfw/v3.3/glfw/glfw/src/posix_time.c | 87 + .../glfw/v3.3/glfw/glfw/src/posix_time.h | 43 + .../go-gl/glfw/v3.3/glfw/glfw/src/vulkan.c | 334 + ...idle-inhibit-unstable-v1-client-protocol.c | 68 + ...idle-inhibit-unstable-v1-client-protocol.h | 232 + ...-constraints-unstable-v1-client-protocol.c | 108 + ...-constraints-unstable-v1-client-protocol.h | 667 + ...tive-pointer-unstable-v1-client-protocol.c | 79 + ...tive-pointer-unstable-v1-client-protocol.h | 297 + .../src/wayland-viewporter-client-protocol.c | 74 + .../src/wayland-viewporter-client-protocol.h | 398 + .../wayland-xdg-decoration-client-protocol.h | 377 + ...g-decoration-unstable-v1-client-protocol.c | 75 + .../src/wayland-xdg-shell-client-protocol.c | 183 + .../src/wayland-xdg-shell-client-protocol.h | 2315 + .../glfw/v3.3/glfw/glfw/src/wgl_context.c | 804 + .../glfw/v3.3/glfw/glfw/src/wgl_context.h | 158 + .../glfw/v3.3/glfw/glfw/src/win32_init.c | 638 + .../glfw/v3.3/glfw/glfw/src/win32_joystick.c | 762 + .../glfw/v3.3/glfw/glfw/src/win32_joystick.h | 57 + .../glfw/v3.3/glfw/glfw/src/win32_monitor.c | 548 + .../glfw/v3.3/glfw/glfw/src/win32_platform.h | 460 + .../glfw/v3.3/glfw/glfw/src/win32_thread.c | 99 + .../glfw/v3.3/glfw/glfw/src/win32_time.c | 60 + .../glfw/v3.3/glfw/glfw/src/win32_window.c | 2423 + .../go-gl/glfw/v3.3/glfw/glfw/src/window.c | 1101 + .../go-gl/glfw/v3.3/glfw/glfw/src/wl_init.c | 756 + .../glfw/v3.3/glfw/glfw/src/wl_monitor.c | 273 + .../glfw/v3.3/glfw/glfw/src/wl_platform.h | 530 + .../go-gl/glfw/v3.3/glfw/glfw/src/wl_window.c | 3050 ++ .../go-gl/glfw/v3.3/glfw/glfw/src/x11_init.c | 1274 + .../glfw/v3.3/glfw/glfw/src/x11_monitor.c | 614 + .../glfw/v3.3/glfw/glfw/src/x11_platform.h | 450 + .../glfw/v3.3/glfw/glfw/src/x11_window.c | 3237 ++ .../glfw/v3.3/glfw/glfw/src/xkb_unicode.c | 942 + .../glfw/v3.3/glfw/glfw/src/xkb_unicode.h | 30 + .../go-gl/glfw/v3.3/glfw/glfw_tree_rebuild.go | 10 + .../github.com/go-gl/glfw/v3.3/glfw/input.c | 49 + .../github.com/go-gl/glfw/v3.3/glfw/input.go | 955 + .../github.com/go-gl/glfw/v3.3/glfw/monitor.c | 19 + .../go-gl/glfw/v3.3/glfw/monitor.go | 267 + .../go-gl/glfw/v3.3/glfw/native_darwin.go | 40 + .../glfw/v3.3/glfw/native_linbsd_wayland.go | 48 + .../go-gl/glfw/v3.3/glfw/native_linbsd_x11.go | 67 + .../go-gl/glfw/v3.3/glfw/native_windows.go | 36 + .../github.com/go-gl/glfw/v3.3/glfw/time.go | 42 + .../github.com/go-gl/glfw/v3.3/glfw/util.go | 46 + .../github.com/go-gl/glfw/v3.3/glfw/vulkan.go | 85 + .../github.com/go-gl/glfw/v3.3/glfw/window.c | 40 + .../github.com/go-gl/glfw/v3.3/glfw/window.go | 990 + vendor/github.com/go-text/render/.gitignore | 3 + vendor/github.com/go-text/render/CODEOWNERS | 1 + vendor/github.com/go-text/render/LICENSE | 55 + vendor/github.com/go-text/render/README.md | 4 + vendor/github.com/go-text/render/bitmap.go | 52 + vendor/github.com/go-text/render/render.go | 151 + vendor/github.com/go-text/render/svg.go | 54 + vendor/github.com/go-text/typesetting/LICENSE | 55 + .../go-text/typesetting/di/README.md | 3 + .../go-text/typesetting/di/direction.go | 130 + .../go-text/typesetting/font/README.md | 6 + .../typesetting/font/aat_layout_kern_kerx.go | 322 + .../typesetting/font/aat_layout_morx.go | 108 + .../go-text/typesetting/font/bitmaps.go | 476 + .../go-text/typesetting/font/cache.go | 41 + .../go-text/typesetting/font/cff/cff2.go | 260 + .../go-text/typesetting/font/cff/cff_gen.go | 151 + .../go-text/typesetting/font/cff/cff_src.go | 162 + .../go-text/typesetting/font/cff/charsets.go | 423 + .../typesetting/font/cff/charstring.go | 315 + .../font/cff/interpreter/charstrings.go | 586 + .../font/cff/interpreter/interpreter.go | 370 + .../go-text/typesetting/font/cff/parser.go | 709 + .../go-text/typesetting/font/cmap.go | 702 + .../typesetting/font/cmap_arabic_pua_table.go | 161 + .../go-text/typesetting/font/font.go | 525 + .../go-text/typesetting/font/glyphs.go | 351 + .../go-text/typesetting/font/metadata.go | 453 + .../go-text/typesetting/font/metrics.go | 442 + .../typesetting/font/opentype/opentype.go | 87 + .../typesetting/font/opentype/reader.go | 371 + .../typesetting/font/opentype/reader_otf.go | 99 + .../typesetting/font/opentype/reader_woff.go | 96 + .../font/opentype/tables/aat_ankr_gen.go | 345 + .../font/opentype/tables/aat_ankr_src.go | 44 + .../font/opentype/tables/aat_common.go | 350 + .../font/opentype/tables/aat_feat_gen.go | 83 + .../font/opentype/tables/aat_feat_src.go | 26 + .../font/opentype/tables/aat_kerx_gen.go | 646 + .../font/opentype/tables/aat_kerx_src.go | 320 + .../font/opentype/tables/aat_ltag_gen.go | 49 + .../font/opentype/tables/aat_ltag_src.go | 25 + .../font/opentype/tables/aat_mortx_gen.go | 332 + .../font/opentype/tables/aat_mortx_src.go | 302 + .../font/opentype/tables/aat_properties.go | 268 + .../font/opentype/tables/aat_trak_gen.go | 139 + .../font/opentype/tables/aat_trak_src.go | 31 + .../font/opentype/tables/cmap_gen.go | 745 + .../font/opentype/tables/cmap_src.go | 132 + .../font/opentype/tables/glyphs.go | 17 + .../font/opentype/tables/glyphs_bitmap_gen.go | 363 + .../font/opentype/tables/glyphs_bitmap_src.go | 190 + .../font/opentype/tables/glyphs_glyf_gen.go | 135 + .../font/opentype/tables/glyphs_glyf_src.go | 350 + .../font/opentype/tables/glyphs_misc_gen.go | 111 + .../font/opentype/tables/glyphs_misc_src.go | 61 + .../font/opentype/tables/glyphs_sbix_gen.go | 92 + .../font/opentype/tables/glyphs_sbix_src.go | 62 + .../font/opentype/tables/head_gen.go | 43 + .../font/opentype/tables/head_src.go | 36 + .../font/opentype/tables/hhea_vhea_gen.go | 43 + .../font/opentype/tables/hhea_vhea_src.go | 25 + .../font/opentype/tables/hmtx_vmtx_gen.go | 46 + .../font/opentype/tables/hmtx_vmtx_src.go | 33 + .../typesetting/font/opentype/tables/kern.go | 101 + .../font/opentype/tables/kern_gen.go | 345 + .../font/opentype/tables/kern_src.go | 143 + .../font/opentype/tables/maxp_gen.go | 75 + .../font/opentype/tables/maxp_src.go | 30 + .../font/opentype/tables/name_gen.go | 58 + .../font/opentype/tables/name_src.go | 183 + .../font/opentype/tables/os2_gen.go | 66 + .../font/opentype/tables/os2_src.go | 58 + .../font/opentype/tables/ot_gdef_gen.go | 582 + .../font/opentype/tables/ot_gdef_src.go | 111 + .../font/opentype/tables/ot_gpos_gen.go | 1772 + .../font/opentype/tables/ot_gpos_src.go | 276 + .../font/opentype/tables/ot_gsub_gen.go | 1129 + .../font/opentype/tables/ot_gsub_src.go | 117 + .../font/opentype/tables/ot_layout.go | 814 + .../font/opentype/tables/ot_layout_gen.go | 513 + .../font/opentype/tables/ot_layout_src.go | 172 + .../font/opentype/tables/ot_properties.go | 315 + .../font/opentype/tables/post_gen.go | 92 + .../font/opentype/tables/post_src.go | 45 + .../font/opentype/tables/tables.go | 58 + .../font/opentype/tables/xvar_gen.go | 628 + .../font/opentype/tables/xvar_src.go | 426 + .../typesetting/font/opentype/writer.go | 80 + .../go-text/typesetting/font/os2.go | 69 + .../go-text/typesetting/font/ot_layout.go | 255 + .../go-text/typesetting/font/post.go | 380 + .../go-text/typesetting/font/renderer.go | 433 + .../go-text/typesetting/font/svg.go | 54 + .../go-text/typesetting/font/variations.go | 618 + .../typesetting/fontscan/fontconfig.go | 245 + .../go-text/typesetting/fontscan/fontmap.go | 636 + .../go-text/typesetting/fontscan/footprint.go | 128 + .../go-text/typesetting/fontscan/langset.go | 118 + .../typesetting/fontscan/langset_gen.go | 3092 ++ .../go-text/typesetting/fontscan/lru.go | 113 + .../go-text/typesetting/fontscan/match.go | 357 + .../go-text/typesetting/fontscan/readme.md | 63 + .../typesetting/fontscan/rune_coverage.go | 442 + .../go-text/typesetting/fontscan/scan.go | 302 + .../go-text/typesetting/fontscan/scandir.go | 52 + .../go-text/typesetting/fontscan/serialize.go | 303 + .../typesetting/fontscan/substitutions.go | 296 + .../fontscan/substitutions_table.go | 3534 ++ .../go-text/typesetting/harfbuzz/LICENSE | 34 + .../go-text/typesetting/harfbuzz/buffer.go | 902 + .../go-text/typesetting/harfbuzz/fonts.go | 387 + .../go-text/typesetting/harfbuzz/glyph.go | 347 + .../go-text/typesetting/harfbuzz/harfbuzz.go | 501 + .../typesetting/harfbuzz/ot_aat_layout.go | 1696 + .../typesetting/harfbuzz/ot_aat_map.go | 300 + .../go-text/typesetting/harfbuzz/ot_arabic.go | 900 + .../harfbuzz/ot_arabic_pua_table.go | 161 + .../typesetting/harfbuzz/ot_arabic_table.go | 1165 + .../typesetting/harfbuzz/ot_arabic_win1256.go | 130 + .../go-text/typesetting/harfbuzz/ot_hangul.go | 346 + .../go-text/typesetting/harfbuzz/ot_hebrew.go | 140 + .../go-text/typesetting/harfbuzz/ot_indic.go | 1439 + .../typesetting/harfbuzz/ot_indic_machine.go | 693 + .../typesetting/harfbuzz/ot_indic_machine.rl | 99 + .../typesetting/harfbuzz/ot_indic_table.go | 270 + .../go-text/typesetting/harfbuzz/ot_kern.go | 99 + .../go-text/typesetting/harfbuzz/ot_khmer.go | 299 + .../typesetting/harfbuzz/ot_khmer_machine.go | 384 + .../typesetting/harfbuzz/ot_khmer_machine.rl | 88 + .../typesetting/harfbuzz/ot_language.go | 73 + .../typesetting/harfbuzz/ot_language_table.go | 2482 + .../go-text/typesetting/harfbuzz/ot_layout.go | 373 + .../typesetting/harfbuzz/ot_layout_gpos.go | 683 + .../typesetting/harfbuzz/ot_layout_gsub.go | 298 + .../harfbuzz/ot_layout_gsubgpos.go | 1102 + .../go-text/typesetting/harfbuzz/ot_map.go | 550 + .../typesetting/harfbuzz/ot_myanmar.go | 265 + .../harfbuzz/ot_myanmar_machine.go | 472 + .../harfbuzz/ot_myanmar_machine.rl | 99 + .../typesetting/harfbuzz/ot_shape_complex.go | 251 + .../typesetting/harfbuzz/ot_shape_fallback.go | 429 + .../harfbuzz/ot_shape_normalize.go | 431 + .../go-text/typesetting/harfbuzz/ot_shaper.go | 833 + .../go-text/typesetting/harfbuzz/ot_tag.go | 212 + .../go-text/typesetting/harfbuzz/ot_thai.go | 354 + .../go-text/typesetting/harfbuzz/ot_use.go | 388 + .../typesetting/harfbuzz/ot_use_machine.go | 885 + .../typesetting/harfbuzz/ot_use_machine.rl | 167 + .../harfbuzz/ot_use_machine_defs.go | 59 + .../typesetting/harfbuzz/ot_use_table.go | 1486 + .../harfbuzz/ot_vowels_constraints.go | 350 + .../typesetting/harfbuzz/set_digest.go | 117 + .../go-text/typesetting/harfbuzz/shape.go | 156 + .../go-text/typesetting/harfbuzz/unicode.go | 639 + .../go-text/typesetting/language/language.go | 158 + .../go-text/typesetting/language/scripts.go | 50 + .../typesetting/language/scripts_table.go | 1352 + .../typesetting/segmenter/segmenter.go | 384 + .../typesetting/segmenter/unicode14_rules.go | 450 + .../typesetting/segmenter/unicode29_rules.go | 194 + .../go-text/typesetting/shaping/README.md | 3 + .../go-text/typesetting/shaping/input.go | 433 + .../go-text/typesetting/shaping/lru.go | 69 + .../go-text/typesetting/shaping/output.go | 351 + .../shaping/paired_delims_table.go | 95 + .../go-text/typesetting/shaping/shaping.go | 205 + .../go-text/typesetting/shaping/spacing.go | 127 + .../go-text/typesetting/shaping/wrapping.go | 1193 + .../unicodedata/combining_classes.go | 1334 + .../typesetting/unicodedata/decomposition.go | 3099 ++ .../unicodedata/east_asian_width.go | 131 + .../go-text/typesetting/unicodedata/emojis.go | 78 + .../unicodedata/general_category.go | 2207 + .../typesetting/unicodedata/grapheme_break.go | 1334 + .../go-text/typesetting/unicodedata/indic.go | 168 + .../typesetting/unicodedata/linebreak.go | 2495 + .../typesetting/unicodedata/mirroring.go | 436 + .../typesetting/unicodedata/sentence_break.go | 81 + .../typesetting/unicodedata/unicode.go | 218 + .../unicodedata/vertical_orientation.go | 73 + .../typesetting/unicodedata/word_break.go | 2650 + .../github.com/godbus/dbus/v5/CONTRIBUTING.md | 50 + vendor/github.com/godbus/dbus/v5/LICENSE | 25 + vendor/github.com/godbus/dbus/v5/MAINTAINERS | 3 + vendor/github.com/godbus/dbus/v5/README.md | 46 + vendor/github.com/godbus/dbus/v5/auth.go | 257 + .../godbus/dbus/v5/auth_anonymous.go | 16 + .../godbus/dbus/v5/auth_external.go | 26 + vendor/github.com/godbus/dbus/v5/auth_sha1.go | 102 + vendor/github.com/godbus/dbus/v5/call.go | 69 + vendor/github.com/godbus/dbus/v5/conn.go | 996 + .../github.com/godbus/dbus/v5/conn_darwin.go | 37 + .../github.com/godbus/dbus/v5/conn_other.go | 90 + vendor/github.com/godbus/dbus/v5/conn_unix.go | 17 + .../github.com/godbus/dbus/v5/conn_windows.go | 15 + vendor/github.com/godbus/dbus/v5/dbus.go | 430 + vendor/github.com/godbus/dbus/v5/decoder.go | 292 + .../godbus/dbus/v5/default_handler.go | 342 + vendor/github.com/godbus/dbus/v5/doc.go | 71 + vendor/github.com/godbus/dbus/v5/encoder.go | 235 + vendor/github.com/godbus/dbus/v5/escape.go | 84 + vendor/github.com/godbus/dbus/v5/export.go | 463 + vendor/github.com/godbus/dbus/v5/homedir.go | 25 + .../godbus/dbus/v5/introspect/call.go | 28 + .../godbus/dbus/v5/introspect/introspect.go | 86 + .../dbus/v5/introspect/introspectable.go | 77 + vendor/github.com/godbus/dbus/v5/match.go | 89 + vendor/github.com/godbus/dbus/v5/message.go | 390 + vendor/github.com/godbus/dbus/v5/object.go | 174 + vendor/github.com/godbus/dbus/v5/prop/prop.go | 348 + vendor/github.com/godbus/dbus/v5/sequence.go | 24 + .../godbus/dbus/v5/sequential_handler.go | 125 + .../godbus/dbus/v5/server_interfaces.go | 107 + vendor/github.com/godbus/dbus/v5/sig.go | 293 + .../godbus/dbus/v5/transport_darwin.go | 6 + .../godbus/dbus/v5/transport_generic.go | 52 + .../godbus/dbus/v5/transport_nonce_tcp.go | 39 + .../godbus/dbus/v5/transport_tcp.go | 41 + .../godbus/dbus/v5/transport_unix.go | 212 + .../dbus/v5/transport_unixcred_dragonfly.go | 95 + .../dbus/v5/transport_unixcred_freebsd.go | 92 + .../dbus/v5/transport_unixcred_linux.go | 25 + .../dbus/v5/transport_unixcred_netbsd.go | 14 + .../dbus/v5/transport_unixcred_openbsd.go | 14 + .../godbus/dbus/v5/transport_zos.go | 6 + vendor/github.com/godbus/dbus/v5/variant.go | 150 + .../godbus/dbus/v5/variant_lexer.go | 284 + .../godbus/dbus/v5/variant_parser.go | 817 + .../github.com/hack-pad/go-indexeddb/LICENSE | 201 + .../go-indexeddb/idb/base_object_store.go | 156 + .../hack-pad/go-indexeddb/idb/cursor.go | 196 + .../hack-pad/go-indexeddb/idb/db.go | 103 + .../hack-pad/go-indexeddb/idb/db_factory.go | 90 + .../hack-pad/go-indexeddb/idb/doc.go | 10 + .../go-indexeddb/idb/dom_exception.go | 80 + .../hack-pad/go-indexeddb/idb/events.go | 9 + .../hack-pad/go-indexeddb/idb/index.go | 134 + .../idb/internal/jscache/cacher.go | 25 + .../idb/internal/jscache/strings.go | 52 + .../hack-pad/go-indexeddb/idb/key_range.go | 107 + .../hack-pad/go-indexeddb/idb/object_store.go | 216 + .../go-indexeddb/idb/open_db_request.go | 126 + .../hack-pad/go-indexeddb/idb/request.go | 441 + .../hack-pad/go-indexeddb/idb/strings.go | 47 + .../hack-pad/go-indexeddb/idb/transaction.go | 307 + vendor/github.com/hack-pad/safejs/.env | 3 + vendor/github.com/hack-pad/safejs/.gitignore | 1 + .../github.com/hack-pad/safejs/.golangci.yml | 22 + vendor/github.com/hack-pad/safejs/LICENSE | 201 + vendor/github.com/hack-pad/safejs/Makefile | 39 + vendor/github.com/hack-pad/safejs/README.md | 86 + vendor/github.com/hack-pad/safejs/bytes.go | 27 + vendor/github.com/hack-pad/safejs/doc.go | 8 + vendor/github.com/hack-pad/safejs/error.go | 23 + vendor/github.com/hack-pad/safejs/func.go | 45 + vendor/github.com/hack-pad/safejs/global.go | 10 + .../hack-pad/safejs/internal/catch/catch.go | 47 + .../safejs/internal/stackerr/stackerr.go | 79 + vendor/github.com/hack-pad/safejs/type.go | 25 + vendor/github.com/hack-pad/safejs/value.go | 242 + .../jeandeaual/go-locale/.gitattributes | 1 + .../jeandeaual/go-locale/.gitignore | 47 + .../jeandeaual/go-locale/.golangci.yml | 37 + .../github.com/jeandeaual/go-locale/LICENSE | 21 + .../github.com/jeandeaual/go-locale/README.md | 141 + .../jeandeaual/go-locale/locale_android.c | 243 + .../jeandeaual/go-locale/locale_android.go | 115 + .../jeandeaual/go-locale/locale_darwin.go | 102 + .../jeandeaual/go-locale/locale_darwin.m | 29 + .../jeandeaual/go-locale/locale_darwin_cgo.go | 43 + .../go-locale/locale_darwin_nocgo.go | 13 + .../jeandeaual/go-locale/locale_ios.go | 51 + .../jeandeaual/go-locale/locale_ios.m | 17 + .../jeandeaual/go-locale/locale_js.go | 75 + .../jeandeaual/go-locale/locale_unix.go | 116 + .../jeandeaual/go-locale/locale_windows.go | 101 + .../github.com/jeandeaual/go-locale/util.go | 22 + vendor/github.com/jsummers/gobmp/.gitignore | 2 + vendor/github.com/jsummers/gobmp/COPYING.txt | 19 + vendor/github.com/jsummers/gobmp/reader.go | 587 + vendor/github.com/jsummers/gobmp/readme.md | 47 + vendor/github.com/jsummers/gobmp/rle.go | 146 + vendor/github.com/jsummers/gobmp/writer.go | 373 + vendor/github.com/nfnt/resize/.travis.yml | 7 + vendor/github.com/nfnt/resize/LICENSE | 13 + vendor/github.com/nfnt/resize/README.md | 151 + vendor/github.com/nfnt/resize/converter.go | 438 + vendor/github.com/nfnt/resize/filters.go | 143 + vendor/github.com/nfnt/resize/nearest.go | 318 + vendor/github.com/nfnt/resize/resize.go | 620 + vendor/github.com/nfnt/resize/thumbnail.go | 55 + vendor/github.com/nfnt/resize/ycc.go | 387 + .../github.com/nicksnyder/go-i18n/v2/LICENSE | 19 + .../nicksnyder/go-i18n/v2/i18n/bundle.go | 144 + .../nicksnyder/go-i18n/v2/i18n/bundlefs.go | 16 + .../nicksnyder/go-i18n/v2/i18n/doc.go | 28 + .../nicksnyder/go-i18n/v2/i18n/localizer.go | 247 + .../nicksnyder/go-i18n/v2/i18n/message.go | 269 + .../go-i18n/v2/i18n/message_template.go | 82 + .../nicksnyder/go-i18n/v2/i18n/parse.go | 185 + .../v2/i18n/template/identity_parser.go | 21 + .../go-i18n/v2/i18n/template/parser.go | 17 + .../go-i18n/v2/i18n/template/text_parser.go | 62 + .../go-i18n/v2/internal/plural/doc.go | 3 + .../go-i18n/v2/internal/plural/form.go | 16 + .../go-i18n/v2/internal/plural/operands.go | 192 + .../go-i18n/v2/internal/plural/rule.go | 44 + .../go-i18n/v2/internal/plural/rule_gen.go | 654 + .../go-i18n/v2/internal/plural/rules.go | 24 + .../go-i18n/v2/internal/template.go | 36 + vendor/github.com/pmezard/go-difflib/LICENSE | 27 + .../pmezard/go-difflib/difflib/difflib.go | 772 + vendor/github.com/rymdport/portal/.gitignore | 1 + .../github.com/rymdport/portal/CHANGELOG.md | 11 + .../rymdport/portal/CODE_OF_CONDUCT.md | 128 + .../rymdport/portal/CONTRIBUTING.md | 34 + vendor/github.com/rymdport/portal/LICENSE | 201 + vendor/github.com/rymdport/portal/README.md | 99 + vendor/github.com/rymdport/portal/SECURITY.md | 16 + .../rymdport/portal/filechooser/choices.go | 18 + .../portal/filechooser/filechooser.go | 32 + .../rymdport/portal/filechooser/filters.go | 21 + .../rymdport/portal/filechooser/open.go | 64 + .../rymdport/portal/filechooser/save.go | 121 + .../rymdport/portal/internal/apis/apis.go | 11 + .../rymdport/portal/internal/apis/call.go | 37 + .../rymdport/portal/internal/apis/changed.go | 23 + .../portal/internal/apis/properties.go | 21 + .../rymdport/portal/internal/convert/basic.go | 22 + .../portal/internal/convert/convert.go | 2 + .../portal/internal/convert/nullstr.go | 21 + .../portal/internal/request/request.go | 46 + .../portal/notification/notification.go | 60 + .../rymdport/portal/openuri/opendir.go | 20 + .../rymdport/portal/openuri/openfile.go | 20 + .../rymdport/portal/openuri/openuri.go | 42 + vendor/github.com/rymdport/portal/portal.go | 15 + .../portal/settings/appearance/appearance.go | 5 + .../portal/settings/appearance/color.go | 80 + .../portal/settings/appearance/contrast.go | 37 + .../rymdport/portal/settings/changed.go | 56 + .../rymdport/portal/settings/read.go | 34 + .../rymdport/portal/settings/settings.go | 7 + vendor/github.com/skip2/go-qrcode/.gitignore | 4 + vendor/github.com/skip2/go-qrcode/.travis.yml | 8 + vendor/github.com/skip2/go-qrcode/LICENSE | 19 + vendor/github.com/skip2/go-qrcode/README.md | 86 + .../skip2/go-qrcode/bitset/bitset.go | 273 + vendor/github.com/skip2/go-qrcode/encoder.go | 486 + vendor/github.com/skip2/go-qrcode/qrcode.go | 608 + .../skip2/go-qrcode/reedsolomon/gf2_8.go | 387 + .../skip2/go-qrcode/reedsolomon/gf_poly.go | 216 + .../go-qrcode/reedsolomon/reed_solomon.go | 73 + .../skip2/go-qrcode/regular_symbol.go | 315 + vendor/github.com/skip2/go-qrcode/symbol.go | 309 + vendor/github.com/skip2/go-qrcode/version.go | 3050 ++ vendor/github.com/srwiley/oksvg/.gitignore | 2 + vendor/github.com/srwiley/oksvg/LICENSE | 29 + vendor/github.com/srwiley/oksvg/README.md | 49 + .../github.com/srwiley/oksvg/definitions.go | 16 + vendor/github.com/srwiley/oksvg/draw.go | 392 + .../github.com/srwiley/oksvg/icon_cursor.go | 391 + .../github.com/srwiley/oksvg/path_cursor.go | 397 + vendor/github.com/srwiley/oksvg/path_style.go | 35 + vendor/github.com/srwiley/oksvg/public.go | 287 + vendor/github.com/srwiley/oksvg/svg_icon.go | 37 + vendor/github.com/srwiley/oksvg/svg_path.go | 109 + vendor/github.com/srwiley/oksvg/utils.go | 172 + vendor/github.com/srwiley/rasterx/LICENSE | 29 + vendor/github.com/srwiley/rasterx/README.md | 84 + vendor/github.com/srwiley/rasterx/dash.go | 202 + vendor/github.com/srwiley/rasterx/fill.go | 241 + vendor/github.com/srwiley/rasterx/geomx.go | 306 + vendor/github.com/srwiley/rasterx/gradient.go | 310 + vendor/github.com/srwiley/rasterx/matrix.go | 191 + vendor/github.com/srwiley/rasterx/scan.go | 181 + vendor/github.com/srwiley/rasterx/shapes.go | 221 + vendor/github.com/srwiley/rasterx/stroke.go | 677 + vendor/github.com/stretchr/testify/LICENSE | 21 + .../testify/assert/assertion_compare.go | 495 + .../testify/assert/assertion_format.go | 866 + .../testify/assert/assertion_format.go.tmpl | 5 + .../testify/assert/assertion_forward.go | 1723 + .../testify/assert/assertion_forward.go.tmpl | 5 + .../testify/assert/assertion_order.go | 81 + .../stretchr/testify/assert/assertions.go | 2295 + .../github.com/stretchr/testify/assert/doc.go | 50 + .../stretchr/testify/assert/errors.go | 10 + .../testify/assert/forward_assertions.go | 16 + .../testify/assert/http_assertions.go | 165 + .../testify/assert/yaml/yaml_custom.go | 24 + .../testify/assert/yaml/yaml_default.go | 36 + .../stretchr/testify/assert/yaml/yaml_fail.go | 17 + .../stretchr/testify/require/doc.go | 31 + .../testify/require/forward_requirements.go | 16 + .../stretchr/testify/require/require.go | 2180 + .../stretchr/testify/require/require.go.tmpl | 6 + .../testify/require/require_forward.go | 1724 + .../testify/require/require_forward.go.tmpl | 5 + .../stretchr/testify/require/requirements.go | 29 + vendor/github.com/yuin/goldmark/.gitignore | 19 + vendor/github.com/yuin/goldmark/.golangci.yml | 105 + vendor/github.com/yuin/goldmark/LICENSE | 21 + vendor/github.com/yuin/goldmark/Makefile | 13 + vendor/github.com/yuin/goldmark/README.md | 568 + vendor/github.com/yuin/goldmark/ast/ast.go | 521 + vendor/github.com/yuin/goldmark/ast/block.go | 547 + vendor/github.com/yuin/goldmark/ast/inline.go | 573 + vendor/github.com/yuin/goldmark/markdown.go | 141 + .../yuin/goldmark/parser/attribute.go | 329 + .../yuin/goldmark/parser/atx_heading.go | 248 + .../yuin/goldmark/parser/auto_link.go | 42 + .../yuin/goldmark/parser/blockquote.go | 70 + .../yuin/goldmark/parser/code_block.go | 102 + .../yuin/goldmark/parser/code_span.go | 84 + .../yuin/goldmark/parser/delimiter.go | 238 + .../yuin/goldmark/parser/emphasis.go | 50 + .../yuin/goldmark/parser/fcode_block.go | 122 + .../yuin/goldmark/parser/html_block.go | 229 + .../github.com/yuin/goldmark/parser/link.go | 449 + .../yuin/goldmark/parser/link_ref.go | 152 + .../github.com/yuin/goldmark/parser/list.go | 287 + .../yuin/goldmark/parser/list_item.go | 90 + .../yuin/goldmark/parser/paragraph.go | 72 + .../github.com/yuin/goldmark/parser/parser.go | 1261 + .../yuin/goldmark/parser/raw_html.go | 153 + .../yuin/goldmark/parser/setext_headings.go | 126 + .../yuin/goldmark/parser/thematic_break.go | 75 + .../yuin/goldmark/renderer/html/html.go | 1021 + .../yuin/goldmark/renderer/renderer.go | 174 + .../github.com/yuin/goldmark/text/package.go | 2 + .../github.com/yuin/goldmark/text/reader.go | 660 + .../github.com/yuin/goldmark/text/segment.go | 239 + .../yuin/goldmark/util/html5entities.go | 2155 + .../goldmark/util/unicode_case_folding.go | 1535 + vendor/github.com/yuin/goldmark/util/util.go | 988 + .../github.com/yuin/goldmark/util/util_cjk.go | 469 + .../yuin/goldmark/util/util_safe.go | 14 + .../yuin/goldmark/util/util_unsafe_go120.go | 24 + .../yuin/goldmark/util/util_unsafe_go121.go | 18 + vendor/golang.org/x/image/LICENSE | 27 + vendor/golang.org/x/image/PATENTS | 22 + vendor/golang.org/x/image/ccitt/reader.go | 795 + vendor/golang.org/x/image/ccitt/table.go | 972 + vendor/golang.org/x/image/ccitt/writer.go | 102 + .../x/image/colornames/colornames.go | 10 + vendor/golang.org/x/image/colornames/table.go | 457 + vendor/golang.org/x/image/draw/draw.go | 67 + vendor/golang.org/x/image/draw/impl.go | 8426 +++ vendor/golang.org/x/image/draw/scale.go | 525 + vendor/golang.org/x/image/math/f64/f64.go | 37 + vendor/golang.org/x/image/math/fixed/fixed.go | 410 + vendor/golang.org/x/image/tiff/buffer.go | 69 + vendor/golang.org/x/image/tiff/compress.go | 58 + vendor/golang.org/x/image/tiff/consts.go | 149 + vendor/golang.org/x/image/tiff/fuzz.go | 29 + vendor/golang.org/x/image/tiff/lzw/reader.go | 272 + vendor/golang.org/x/image/tiff/reader.go | 785 + vendor/golang.org/x/image/tiff/writer.go | 441 + vendor/golang.org/x/image/vector/acc_amd64.go | 29 + vendor/golang.org/x/image/vector/acc_amd64.s | 1028 + vendor/golang.org/x/image/vector/acc_other.go | 16 + .../x/image/vector/gen_acc_amd64.s.tmpl | 170 + .../golang.org/x/image/vector/raster_fixed.go | 330 + .../x/image/vector/raster_floating.go | 220 + vendor/golang.org/x/image/vector/vector.go | 472 + vendor/golang.org/x/net/LICENSE | 27 + vendor/golang.org/x/net/PATENTS | 22 + vendor/golang.org/x/net/html/atom/atom.go | 78 + vendor/golang.org/x/net/html/atom/table.go | 783 + .../golang.org/x/net/html/charset/charset.go | 257 + vendor/golang.org/x/net/html/const.go | 111 + vendor/golang.org/x/net/html/doc.go | 122 + vendor/golang.org/x/net/html/doctype.go | 156 + vendor/golang.org/x/net/html/entity.go | 2253 + vendor/golang.org/x/net/html/escape.go | 339 + vendor/golang.org/x/net/html/foreign.go | 221 + vendor/golang.org/x/net/html/iter.go | 56 + vendor/golang.org/x/net/html/node.go | 229 + vendor/golang.org/x/net/html/parse.go | 2464 + vendor/golang.org/x/net/html/render.go | 293 + vendor/golang.org/x/net/html/token.go | 1272 + vendor/golang.org/x/sys/LICENSE | 27 + vendor/golang.org/x/sys/PATENTS | 22 + vendor/golang.org/x/sys/unix/.gitignore | 2 + vendor/golang.org/x/sys/unix/README.md | 184 + .../golang.org/x/sys/unix/affinity_linux.go | 84 + vendor/golang.org/x/sys/unix/aliases.go | 13 + vendor/golang.org/x/sys/unix/asm_aix_ppc64.s | 17 + vendor/golang.org/x/sys/unix/asm_bsd_386.s | 27 + vendor/golang.org/x/sys/unix/asm_bsd_amd64.s | 27 + vendor/golang.org/x/sys/unix/asm_bsd_arm.s | 27 + vendor/golang.org/x/sys/unix/asm_bsd_arm64.s | 27 + vendor/golang.org/x/sys/unix/asm_bsd_ppc64.s | 29 + .../golang.org/x/sys/unix/asm_bsd_riscv64.s | 27 + vendor/golang.org/x/sys/unix/asm_linux_386.s | 65 + .../golang.org/x/sys/unix/asm_linux_amd64.s | 57 + vendor/golang.org/x/sys/unix/asm_linux_arm.s | 56 + .../golang.org/x/sys/unix/asm_linux_arm64.s | 50 + .../golang.org/x/sys/unix/asm_linux_loong64.s | 51 + .../golang.org/x/sys/unix/asm_linux_mips64x.s | 54 + .../golang.org/x/sys/unix/asm_linux_mipsx.s | 52 + .../golang.org/x/sys/unix/asm_linux_ppc64x.s | 42 + .../golang.org/x/sys/unix/asm_linux_riscv64.s | 47 + .../golang.org/x/sys/unix/asm_linux_s390x.s | 54 + .../x/sys/unix/asm_openbsd_mips64.s | 29 + .../golang.org/x/sys/unix/asm_solaris_amd64.s | 17 + vendor/golang.org/x/sys/unix/asm_zos_s390x.s | 382 + vendor/golang.org/x/sys/unix/auxv.go | 36 + .../golang.org/x/sys/unix/auxv_unsupported.go | 13 + .../golang.org/x/sys/unix/bluetooth_linux.go | 36 + vendor/golang.org/x/sys/unix/bpxsvc_zos.go | 657 + vendor/golang.org/x/sys/unix/bpxsvc_zos.s | 192 + vendor/golang.org/x/sys/unix/cap_freebsd.go | 195 + vendor/golang.org/x/sys/unix/constants.go | 13 + vendor/golang.org/x/sys/unix/dev_aix_ppc.go | 26 + vendor/golang.org/x/sys/unix/dev_aix_ppc64.go | 28 + vendor/golang.org/x/sys/unix/dev_darwin.go | 24 + vendor/golang.org/x/sys/unix/dev_dragonfly.go | 30 + vendor/golang.org/x/sys/unix/dev_freebsd.go | 30 + vendor/golang.org/x/sys/unix/dev_linux.go | 42 + vendor/golang.org/x/sys/unix/dev_netbsd.go | 29 + vendor/golang.org/x/sys/unix/dev_openbsd.go | 29 + vendor/golang.org/x/sys/unix/dev_zos.go | 28 + vendor/golang.org/x/sys/unix/dirent.go | 102 + vendor/golang.org/x/sys/unix/endian_big.go | 9 + vendor/golang.org/x/sys/unix/endian_little.go | 9 + vendor/golang.org/x/sys/unix/env_unix.go | 31 + vendor/golang.org/x/sys/unix/fcntl.go | 36 + vendor/golang.org/x/sys/unix/fcntl_darwin.go | 24 + .../x/sys/unix/fcntl_linux_32bit.go | 13 + vendor/golang.org/x/sys/unix/fdset.go | 29 + vendor/golang.org/x/sys/unix/gccgo.go | 59 + vendor/golang.org/x/sys/unix/gccgo_c.c | 44 + .../x/sys/unix/gccgo_linux_amd64.go | 20 + vendor/golang.org/x/sys/unix/ifreq_linux.go | 141 + vendor/golang.org/x/sys/unix/ioctl_linux.go | 334 + vendor/golang.org/x/sys/unix/ioctl_signed.go | 69 + .../golang.org/x/sys/unix/ioctl_unsigned.go | 69 + vendor/golang.org/x/sys/unix/ioctl_zos.go | 71 + vendor/golang.org/x/sys/unix/mkall.sh | 249 + vendor/golang.org/x/sys/unix/mkerrors.sh | 808 + vendor/golang.org/x/sys/unix/mmap_nomremap.go | 13 + vendor/golang.org/x/sys/unix/mremap.go | 57 + vendor/golang.org/x/sys/unix/pagesize_unix.go | 15 + .../golang.org/x/sys/unix/pledge_openbsd.go | 111 + vendor/golang.org/x/sys/unix/ptrace_darwin.go | 11 + vendor/golang.org/x/sys/unix/ptrace_ios.go | 11 + vendor/golang.org/x/sys/unix/race.go | 30 + vendor/golang.org/x/sys/unix/race0.go | 25 + .../x/sys/unix/readdirent_getdents.go | 12 + .../x/sys/unix/readdirent_getdirentries.go | 19 + .../x/sys/unix/sockcmsg_dragonfly.go | 16 + .../golang.org/x/sys/unix/sockcmsg_linux.go | 85 + vendor/golang.org/x/sys/unix/sockcmsg_unix.go | 106 + .../x/sys/unix/sockcmsg_unix_other.go | 46 + vendor/golang.org/x/sys/unix/sockcmsg_zos.go | 58 + .../golang.org/x/sys/unix/symaddr_zos_s390x.s | 75 + vendor/golang.org/x/sys/unix/syscall.go | 86 + vendor/golang.org/x/sys/unix/syscall_aix.go | 582 + .../golang.org/x/sys/unix/syscall_aix_ppc.go | 52 + .../x/sys/unix/syscall_aix_ppc64.go | 83 + vendor/golang.org/x/sys/unix/syscall_bsd.go | 609 + .../golang.org/x/sys/unix/syscall_darwin.go | 800 + .../x/sys/unix/syscall_darwin_amd64.go | 50 + .../x/sys/unix/syscall_darwin_arm64.go | 50 + .../x/sys/unix/syscall_darwin_libSystem.go | 26 + .../x/sys/unix/syscall_dragonfly.go | 359 + .../x/sys/unix/syscall_dragonfly_amd64.go | 56 + .../golang.org/x/sys/unix/syscall_freebsd.go | 455 + .../x/sys/unix/syscall_freebsd_386.go | 64 + .../x/sys/unix/syscall_freebsd_amd64.go | 64 + .../x/sys/unix/syscall_freebsd_arm.go | 60 + .../x/sys/unix/syscall_freebsd_arm64.go | 60 + .../x/sys/unix/syscall_freebsd_riscv64.go | 60 + vendor/golang.org/x/sys/unix/syscall_hurd.go | 30 + .../golang.org/x/sys/unix/syscall_hurd_386.go | 28 + .../golang.org/x/sys/unix/syscall_illumos.go | 78 + vendor/golang.org/x/sys/unix/syscall_linux.go | 2647 + .../x/sys/unix/syscall_linux_386.go | 314 + .../x/sys/unix/syscall_linux_alarm.go | 12 + .../x/sys/unix/syscall_linux_amd64.go | 145 + .../x/sys/unix/syscall_linux_amd64_gc.go | 12 + .../x/sys/unix/syscall_linux_arm.go | 216 + .../x/sys/unix/syscall_linux_arm64.go | 186 + .../golang.org/x/sys/unix/syscall_linux_gc.go | 14 + .../x/sys/unix/syscall_linux_gc_386.go | 16 + .../x/sys/unix/syscall_linux_gc_arm.go | 13 + .../x/sys/unix/syscall_linux_gccgo_386.go | 30 + .../x/sys/unix/syscall_linux_gccgo_arm.go | 20 + .../x/sys/unix/syscall_linux_loong64.go | 218 + .../x/sys/unix/syscall_linux_mips64x.go | 188 + .../x/sys/unix/syscall_linux_mipsx.go | 174 + .../x/sys/unix/syscall_linux_ppc.go | 204 + .../x/sys/unix/syscall_linux_ppc64x.go | 115 + .../x/sys/unix/syscall_linux_riscv64.go | 191 + .../x/sys/unix/syscall_linux_s390x.go | 296 + .../x/sys/unix/syscall_linux_sparc64.go | 112 + .../golang.org/x/sys/unix/syscall_netbsd.go | 371 + .../x/sys/unix/syscall_netbsd_386.go | 37 + .../x/sys/unix/syscall_netbsd_amd64.go | 37 + .../x/sys/unix/syscall_netbsd_arm.go | 37 + .../x/sys/unix/syscall_netbsd_arm64.go | 37 + .../golang.org/x/sys/unix/syscall_openbsd.go | 342 + .../x/sys/unix/syscall_openbsd_386.go | 41 + .../x/sys/unix/syscall_openbsd_amd64.go | 41 + .../x/sys/unix/syscall_openbsd_arm.go | 41 + .../x/sys/unix/syscall_openbsd_arm64.go | 41 + .../x/sys/unix/syscall_openbsd_libc.go | 26 + .../x/sys/unix/syscall_openbsd_mips64.go | 39 + .../x/sys/unix/syscall_openbsd_ppc64.go | 41 + .../x/sys/unix/syscall_openbsd_riscv64.go | 41 + .../golang.org/x/sys/unix/syscall_solaris.go | 1191 + .../x/sys/unix/syscall_solaris_amd64.go | 27 + vendor/golang.org/x/sys/unix/syscall_unix.go | 615 + .../golang.org/x/sys/unix/syscall_unix_gc.go | 14 + .../x/sys/unix/syscall_unix_gc_ppc64x.go | 22 + .../x/sys/unix/syscall_zos_s390x.go | 3213 ++ vendor/golang.org/x/sys/unix/sysvshm_linux.go | 20 + vendor/golang.org/x/sys/unix/sysvshm_unix.go | 51 + .../x/sys/unix/sysvshm_unix_other.go | 13 + vendor/golang.org/x/sys/unix/timestruct.go | 76 + .../golang.org/x/sys/unix/unveil_openbsd.go | 51 + .../golang.org/x/sys/unix/vgetrandom_linux.go | 13 + .../x/sys/unix/vgetrandom_unsupported.go | 11 + vendor/golang.org/x/sys/unix/xattr_bsd.go | 280 + .../golang.org/x/sys/unix/zerrors_aix_ppc.go | 1384 + .../x/sys/unix/zerrors_aix_ppc64.go | 1385 + .../x/sys/unix/zerrors_darwin_amd64.go | 1922 + .../x/sys/unix/zerrors_darwin_arm64.go | 1922 + .../x/sys/unix/zerrors_dragonfly_amd64.go | 1737 + .../x/sys/unix/zerrors_freebsd_386.go | 2042 + .../x/sys/unix/zerrors_freebsd_amd64.go | 2039 + .../x/sys/unix/zerrors_freebsd_arm.go | 2033 + .../x/sys/unix/zerrors_freebsd_arm64.go | 2033 + .../x/sys/unix/zerrors_freebsd_riscv64.go | 2147 + vendor/golang.org/x/sys/unix/zerrors_linux.go | 3783 ++ .../x/sys/unix/zerrors_linux_386.go | 876 + .../x/sys/unix/zerrors_linux_amd64.go | 876 + .../x/sys/unix/zerrors_linux_arm.go | 881 + .../x/sys/unix/zerrors_linux_arm64.go | 878 + .../x/sys/unix/zerrors_linux_loong64.go | 868 + .../x/sys/unix/zerrors_linux_mips.go | 882 + .../x/sys/unix/zerrors_linux_mips64.go | 882 + .../x/sys/unix/zerrors_linux_mips64le.go | 882 + .../x/sys/unix/zerrors_linux_mipsle.go | 882 + .../x/sys/unix/zerrors_linux_ppc.go | 934 + .../x/sys/unix/zerrors_linux_ppc64.go | 938 + .../x/sys/unix/zerrors_linux_ppc64le.go | 938 + .../x/sys/unix/zerrors_linux_riscv64.go | 865 + .../x/sys/unix/zerrors_linux_s390x.go | 937 + .../x/sys/unix/zerrors_linux_sparc64.go | 980 + .../x/sys/unix/zerrors_netbsd_386.go | 1779 + .../x/sys/unix/zerrors_netbsd_amd64.go | 1769 + .../x/sys/unix/zerrors_netbsd_arm.go | 1758 + .../x/sys/unix/zerrors_netbsd_arm64.go | 1769 + .../x/sys/unix/zerrors_openbsd_386.go | 1905 + .../x/sys/unix/zerrors_openbsd_amd64.go | 1905 + .../x/sys/unix/zerrors_openbsd_arm.go | 1905 + .../x/sys/unix/zerrors_openbsd_arm64.go | 1905 + .../x/sys/unix/zerrors_openbsd_mips64.go | 1905 + .../x/sys/unix/zerrors_openbsd_ppc64.go | 1904 + .../x/sys/unix/zerrors_openbsd_riscv64.go | 1903 + .../x/sys/unix/zerrors_solaris_amd64.go | 1556 + .../x/sys/unix/zerrors_zos_s390x.go | 990 + .../x/sys/unix/zptrace_armnn_linux.go | 40 + .../x/sys/unix/zptrace_linux_arm64.go | 17 + .../x/sys/unix/zptrace_mipsnn_linux.go | 49 + .../x/sys/unix/zptrace_mipsnnle_linux.go | 49 + .../x/sys/unix/zptrace_x86_linux.go | 79 + .../x/sys/unix/zsymaddr_zos_s390x.s | 364 + .../golang.org/x/sys/unix/zsyscall_aix_ppc.go | 1461 + .../x/sys/unix/zsyscall_aix_ppc64.go | 1420 + .../x/sys/unix/zsyscall_aix_ppc64_gc.go | 1188 + .../x/sys/unix/zsyscall_aix_ppc64_gccgo.go | 1069 + .../x/sys/unix/zsyscall_darwin_amd64.go | 2728 + .../x/sys/unix/zsyscall_darwin_amd64.s | 799 + .../x/sys/unix/zsyscall_darwin_arm64.go | 2728 + .../x/sys/unix/zsyscall_darwin_arm64.s | 799 + .../x/sys/unix/zsyscall_dragonfly_amd64.go | 1666 + .../x/sys/unix/zsyscall_freebsd_386.go | 1886 + .../x/sys/unix/zsyscall_freebsd_amd64.go | 1886 + .../x/sys/unix/zsyscall_freebsd_arm.go | 1886 + .../x/sys/unix/zsyscall_freebsd_arm64.go | 1886 + .../x/sys/unix/zsyscall_freebsd_riscv64.go | 1886 + .../x/sys/unix/zsyscall_illumos_amd64.go | 101 + .../golang.org/x/sys/unix/zsyscall_linux.go | 2240 + .../x/sys/unix/zsyscall_linux_386.go | 486 + .../x/sys/unix/zsyscall_linux_amd64.go | 653 + .../x/sys/unix/zsyscall_linux_arm.go | 601 + .../x/sys/unix/zsyscall_linux_arm64.go | 552 + .../x/sys/unix/zsyscall_linux_loong64.go | 486 + .../x/sys/unix/zsyscall_linux_mips.go | 653 + .../x/sys/unix/zsyscall_linux_mips64.go | 647 + .../x/sys/unix/zsyscall_linux_mips64le.go | 636 + .../x/sys/unix/zsyscall_linux_mipsle.go | 653 + .../x/sys/unix/zsyscall_linux_ppc.go | 658 + .../x/sys/unix/zsyscall_linux_ppc64.go | 704 + .../x/sys/unix/zsyscall_linux_ppc64le.go | 704 + .../x/sys/unix/zsyscall_linux_riscv64.go | 548 + .../x/sys/unix/zsyscall_linux_s390x.go | 495 + .../x/sys/unix/zsyscall_linux_sparc64.go | 648 + .../x/sys/unix/zsyscall_netbsd_386.go | 1848 + .../x/sys/unix/zsyscall_netbsd_amd64.go | 1848 + .../x/sys/unix/zsyscall_netbsd_arm.go | 1848 + .../x/sys/unix/zsyscall_netbsd_arm64.go | 1848 + .../x/sys/unix/zsyscall_openbsd_386.go | 2323 + .../x/sys/unix/zsyscall_openbsd_386.s | 699 + .../x/sys/unix/zsyscall_openbsd_amd64.go | 2323 + .../x/sys/unix/zsyscall_openbsd_amd64.s | 699 + .../x/sys/unix/zsyscall_openbsd_arm.go | 2323 + .../x/sys/unix/zsyscall_openbsd_arm.s | 699 + .../x/sys/unix/zsyscall_openbsd_arm64.go | 2323 + .../x/sys/unix/zsyscall_openbsd_arm64.s | 699 + .../x/sys/unix/zsyscall_openbsd_mips64.go | 2323 + .../x/sys/unix/zsyscall_openbsd_mips64.s | 699 + .../x/sys/unix/zsyscall_openbsd_ppc64.go | 2323 + .../x/sys/unix/zsyscall_openbsd_ppc64.s | 838 + .../x/sys/unix/zsyscall_openbsd_riscv64.go | 2323 + .../x/sys/unix/zsyscall_openbsd_riscv64.s | 699 + .../x/sys/unix/zsyscall_solaris_amd64.go | 2217 + .../x/sys/unix/zsyscall_zos_s390x.go | 3458 ++ .../x/sys/unix/zsysctl_openbsd_386.go | 280 + .../x/sys/unix/zsysctl_openbsd_amd64.go | 280 + .../x/sys/unix/zsysctl_openbsd_arm.go | 280 + .../x/sys/unix/zsysctl_openbsd_arm64.go | 280 + .../x/sys/unix/zsysctl_openbsd_mips64.go | 280 + .../x/sys/unix/zsysctl_openbsd_ppc64.go | 280 + .../x/sys/unix/zsysctl_openbsd_riscv64.go | 281 + .../x/sys/unix/zsysnum_darwin_amd64.go | 439 + .../x/sys/unix/zsysnum_darwin_arm64.go | 437 + .../x/sys/unix/zsysnum_dragonfly_amd64.go | 316 + .../x/sys/unix/zsysnum_freebsd_386.go | 393 + .../x/sys/unix/zsysnum_freebsd_amd64.go | 393 + .../x/sys/unix/zsysnum_freebsd_arm.go | 393 + .../x/sys/unix/zsysnum_freebsd_arm64.go | 393 + .../x/sys/unix/zsysnum_freebsd_riscv64.go | 393 + .../x/sys/unix/zsysnum_linux_386.go | 466 + .../x/sys/unix/zsysnum_linux_amd64.go | 389 + .../x/sys/unix/zsysnum_linux_arm.go | 430 + .../x/sys/unix/zsysnum_linux_arm64.go | 333 + .../x/sys/unix/zsysnum_linux_loong64.go | 329 + .../x/sys/unix/zsysnum_linux_mips.go | 450 + .../x/sys/unix/zsysnum_linux_mips64.go | 380 + .../x/sys/unix/zsysnum_linux_mips64le.go | 380 + .../x/sys/unix/zsysnum_linux_mipsle.go | 450 + .../x/sys/unix/zsysnum_linux_ppc.go | 457 + .../x/sys/unix/zsysnum_linux_ppc64.go | 429 + .../x/sys/unix/zsysnum_linux_ppc64le.go | 429 + .../x/sys/unix/zsysnum_linux_riscv64.go | 334 + .../x/sys/unix/zsysnum_linux_s390x.go | 395 + .../x/sys/unix/zsysnum_linux_sparc64.go | 408 + .../x/sys/unix/zsysnum_netbsd_386.go | 274 + .../x/sys/unix/zsysnum_netbsd_amd64.go | 274 + .../x/sys/unix/zsysnum_netbsd_arm.go | 274 + .../x/sys/unix/zsysnum_netbsd_arm64.go | 274 + .../x/sys/unix/zsysnum_openbsd_386.go | 219 + .../x/sys/unix/zsysnum_openbsd_amd64.go | 219 + .../x/sys/unix/zsysnum_openbsd_arm.go | 219 + .../x/sys/unix/zsysnum_openbsd_arm64.go | 218 + .../x/sys/unix/zsysnum_openbsd_mips64.go | 221 + .../x/sys/unix/zsysnum_openbsd_ppc64.go | 217 + .../x/sys/unix/zsysnum_openbsd_riscv64.go | 218 + .../x/sys/unix/zsysnum_zos_s390x.go | 2852 + .../golang.org/x/sys/unix/ztypes_aix_ppc.go | 353 + .../golang.org/x/sys/unix/ztypes_aix_ppc64.go | 357 + .../x/sys/unix/ztypes_darwin_amd64.go | 878 + .../x/sys/unix/ztypes_darwin_arm64.go | 878 + .../x/sys/unix/ztypes_dragonfly_amd64.go | 473 + .../x/sys/unix/ztypes_freebsd_386.go | 651 + .../x/sys/unix/ztypes_freebsd_amd64.go | 656 + .../x/sys/unix/ztypes_freebsd_arm.go | 642 + .../x/sys/unix/ztypes_freebsd_arm64.go | 636 + .../x/sys/unix/ztypes_freebsd_riscv64.go | 638 + vendor/golang.org/x/sys/unix/ztypes_linux.go | 6334 +++ .../golang.org/x/sys/unix/ztypes_linux_386.go | 705 + .../x/sys/unix/ztypes_linux_amd64.go | 719 + .../golang.org/x/sys/unix/ztypes_linux_arm.go | 699 + .../x/sys/unix/ztypes_linux_arm64.go | 698 + .../x/sys/unix/ztypes_linux_loong64.go | 699 + .../x/sys/unix/ztypes_linux_mips.go | 704 + .../x/sys/unix/ztypes_linux_mips64.go | 701 + .../x/sys/unix/ztypes_linux_mips64le.go | 701 + .../x/sys/unix/ztypes_linux_mipsle.go | 704 + .../golang.org/x/sys/unix/ztypes_linux_ppc.go | 712 + .../x/sys/unix/ztypes_linux_ppc64.go | 707 + .../x/sys/unix/ztypes_linux_ppc64le.go | 707 + .../x/sys/unix/ztypes_linux_riscv64.go | 786 + .../x/sys/unix/ztypes_linux_s390x.go | 721 + .../x/sys/unix/ztypes_linux_sparc64.go | 702 + .../x/sys/unix/ztypes_netbsd_386.go | 585 + .../x/sys/unix/ztypes_netbsd_amd64.go | 593 + .../x/sys/unix/ztypes_netbsd_arm.go | 590 + .../x/sys/unix/ztypes_netbsd_arm64.go | 593 + .../x/sys/unix/ztypes_openbsd_386.go | 568 + .../x/sys/unix/ztypes_openbsd_amd64.go | 568 + .../x/sys/unix/ztypes_openbsd_arm.go | 575 + .../x/sys/unix/ztypes_openbsd_arm64.go | 568 + .../x/sys/unix/ztypes_openbsd_mips64.go | 568 + .../x/sys/unix/ztypes_openbsd_ppc64.go | 570 + .../x/sys/unix/ztypes_openbsd_riscv64.go | 570 + .../x/sys/unix/ztypes_solaris_amd64.go | 516 + .../golang.org/x/sys/unix/ztypes_zos_s390x.go | 552 + vendor/golang.org/x/sys/windows/aliases.go | 12 + .../golang.org/x/sys/windows/dll_windows.go | 415 + .../golang.org/x/sys/windows/env_windows.go | 57 + vendor/golang.org/x/sys/windows/eventlog.go | 20 + .../golang.org/x/sys/windows/exec_windows.go | 248 + .../x/sys/windows/memory_windows.go | 48 + vendor/golang.org/x/sys/windows/mkerrors.bash | 70 + .../x/sys/windows/mkknownfolderids.bash | 27 + vendor/golang.org/x/sys/windows/mksyscall.go | 9 + vendor/golang.org/x/sys/windows/race.go | 30 + vendor/golang.org/x/sys/windows/race0.go | 25 + .../golang.org/x/sys/windows/registry/key.go | 214 + .../x/sys/windows/registry/mksyscall.go | 9 + .../x/sys/windows/registry/syscall.go | 32 + .../x/sys/windows/registry/value.go | 390 + .../sys/windows/registry/zsyscall_windows.go | 117 + .../x/sys/windows/security_windows.go | 1497 + vendor/golang.org/x/sys/windows/service.go | 257 + .../x/sys/windows/setupapi_windows.go | 1425 + vendor/golang.org/x/sys/windows/str.go | 22 + vendor/golang.org/x/sys/windows/syscall.go | 104 + .../x/sys/windows/syscall_windows.go | 1934 + .../golang.org/x/sys/windows/types_windows.go | 3848 ++ .../x/sys/windows/types_windows_386.go | 35 + .../x/sys/windows/types_windows_amd64.go | 34 + .../x/sys/windows/types_windows_arm.go | 35 + .../x/sys/windows/types_windows_arm64.go | 34 + .../x/sys/windows/zerrors_windows.go | 9468 ++++ .../x/sys/windows/zknownfolderids_windows.go | 149 + .../x/sys/windows/zsyscall_windows.go | 4695 ++ vendor/golang.org/x/text/LICENSE | 27 + vendor/golang.org/x/text/PATENTS | 22 + .../x/text/encoding/charmap/charmap.go | 249 + .../x/text/encoding/charmap/tables.go | 7410 +++ vendor/golang.org/x/text/encoding/encoding.go | 335 + .../x/text/encoding/htmlindex/htmlindex.go | 86 + .../x/text/encoding/htmlindex/map.go | 105 + .../x/text/encoding/htmlindex/tables.go | 362 + .../internal/identifier/identifier.go | 81 + .../text/encoding/internal/identifier/mib.go | 1627 + .../x/text/encoding/internal/internal.go | 75 + .../x/text/encoding/japanese/all.go | 12 + .../x/text/encoding/japanese/eucjp.go | 225 + .../x/text/encoding/japanese/iso2022jp.go | 299 + .../x/text/encoding/japanese/shiftjis.go | 189 + .../x/text/encoding/japanese/tables.go | 26971 ++++++++++ .../x/text/encoding/korean/euckr.go | 177 + .../x/text/encoding/korean/tables.go | 34152 ++++++++++++ .../x/text/encoding/simplifiedchinese/all.go | 12 + .../x/text/encoding/simplifiedchinese/gbk.go | 273 + .../encoding/simplifiedchinese/hzgb2312.go | 245 + .../text/encoding/simplifiedchinese/tables.go | 43999 ++++++++++++++++ .../text/encoding/traditionalchinese/big5.go | 199 + .../encoding/traditionalchinese/tables.go | 37142 +++++++++++++ .../x/text/encoding/unicode/override.go | 82 + .../x/text/encoding/unicode/unicode.go | 512 + .../x/text/internal/language/common.go | 16 + .../x/text/internal/language/compact.go | 29 + .../text/internal/language/compact/compact.go | 61 + .../internal/language/compact/language.go | 260 + .../text/internal/language/compact/parents.go | 120 + .../text/internal/language/compact/tables.go | 1015 + .../x/text/internal/language/compact/tags.go | 91 + .../x/text/internal/language/compose.go | 167 + .../x/text/internal/language/coverage.go | 28 + .../x/text/internal/language/language.go | 627 + .../x/text/internal/language/lookup.go | 412 + .../x/text/internal/language/match.go | 226 + .../x/text/internal/language/parse.go | 608 + .../x/text/internal/language/tables.go | 3494 ++ .../x/text/internal/language/tags.go | 48 + vendor/golang.org/x/text/internal/tag/tag.go | 100 + .../internal/utf8internal/utf8internal.go | 87 + vendor/golang.org/x/text/language/coverage.go | 187 + vendor/golang.org/x/text/language/doc.go | 98 + vendor/golang.org/x/text/language/language.go | 605 + vendor/golang.org/x/text/language/match.go | 735 + vendor/golang.org/x/text/language/parse.go | 256 + vendor/golang.org/x/text/language/tables.go | 298 + vendor/golang.org/x/text/language/tags.go | 145 + vendor/golang.org/x/text/runes/cond.go | 187 + vendor/golang.org/x/text/runes/runes.go | 355 + .../golang.org/x/text/transform/transform.go | 709 + vendor/golang.org/x/text/unicode/bidi/bidi.go | 359 + .../golang.org/x/text/unicode/bidi/bracket.go | 335 + vendor/golang.org/x/text/unicode/bidi/core.go | 1071 + vendor/golang.org/x/text/unicode/bidi/prop.go | 206 + .../x/text/unicode/bidi/tables10.0.0.go | 1815 + .../x/text/unicode/bidi/tables11.0.0.go | 1887 + .../x/text/unicode/bidi/tables12.0.0.go | 1923 + .../x/text/unicode/bidi/tables13.0.0.go | 1955 + .../x/text/unicode/bidi/tables15.0.0.go | 2042 + .../x/text/unicode/bidi/tables9.0.0.go | 1781 + .../golang.org/x/text/unicode/bidi/trieval.go | 48 + vendor/gopkg.in/yaml.v3/LICENSE | 50 + vendor/gopkg.in/yaml.v3/NOTICE | 13 + vendor/gopkg.in/yaml.v3/README.md | 150 + vendor/gopkg.in/yaml.v3/apic.go | 747 + vendor/gopkg.in/yaml.v3/decode.go | 1000 + vendor/gopkg.in/yaml.v3/emitterc.go | 2020 + vendor/gopkg.in/yaml.v3/encode.go | 577 + vendor/gopkg.in/yaml.v3/parserc.go | 1258 + vendor/gopkg.in/yaml.v3/readerc.go | 434 + vendor/gopkg.in/yaml.v3/resolve.go | 326 + vendor/gopkg.in/yaml.v3/scannerc.go | 3038 ++ vendor/gopkg.in/yaml.v3/sorter.go | 134 + vendor/gopkg.in/yaml.v3/writerc.go | 48 + vendor/gopkg.in/yaml.v3/yaml.go | 698 + vendor/gopkg.in/yaml.v3/yamlh.go | 807 + vendor/gopkg.in/yaml.v3/yamlprivateh.go | 198 + vendor/modules.txt | 239 + vendor/whisper/ggml-base.bin | 3 - 2101 files changed, 845400 insertions(+), 82 deletions(-) create mode 100644 vendor/fyne.io/fyne/v2/.gitignore create mode 100644 vendor/fyne.io/fyne/v2/.godocdown.import create mode 100644 vendor/fyne.io/fyne/v2/AUTHORS create mode 100644 vendor/fyne.io/fyne/v2/CHANGELOG.md create mode 100644 vendor/fyne.io/fyne/v2/CODE_OF_CONDUCT.md create mode 100644 vendor/fyne.io/fyne/v2/CONTRIBUTING.md create mode 100644 vendor/fyne.io/fyne/v2/LICENSE create mode 100644 vendor/fyne.io/fyne/v2/README.md create mode 100644 vendor/fyne.io/fyne/v2/SECURITY.md create mode 100644 vendor/fyne.io/fyne/v2/animation.go create mode 100644 vendor/fyne.io/fyne/v2/app.go create mode 100644 vendor/fyne.io/fyne/v2/app/app.go create mode 100644 vendor/fyne.io/fyne/v2/app/app_darwin.go create mode 100644 vendor/fyne.io/fyne/v2/app/app_darwin.m create mode 100644 vendor/fyne.io/fyne/v2/app/app_desktop_darwin.go create mode 100644 vendor/fyne.io/fyne/v2/app/app_desktop_darwin.m create mode 100644 vendor/fyne.io/fyne/v2/app/app_gl.go create mode 100644 vendor/fyne.io/fyne/v2/app/app_mobile.go create mode 100644 vendor/fyne.io/fyne/v2/app/app_mobile_and.c create mode 100644 vendor/fyne.io/fyne/v2/app/app_mobile_and.go create mode 100644 vendor/fyne.io/fyne/v2/app/app_mobile_ios.go create mode 100644 vendor/fyne.io/fyne/v2/app/app_mobile_ios.m create mode 100644 vendor/fyne.io/fyne/v2/app/app_mobile_xdg.go create mode 100644 vendor/fyne.io/fyne/v2/app/app_noos.go create mode 100644 vendor/fyne.io/fyne/v2/app/app_notlegacy_darwin.go create mode 100644 vendor/fyne.io/fyne/v2/app/app_openurl_wasm.go create mode 100644 vendor/fyne.io/fyne/v2/app/app_openurl_web.go create mode 100644 vendor/fyne.io/fyne/v2/app/app_other.go create mode 100644 vendor/fyne.io/fyne/v2/app/app_software.go create mode 100644 vendor/fyne.io/fyne/v2/app/app_wasm.go create mode 100644 vendor/fyne.io/fyne/v2/app/app_windows.go create mode 100644 vendor/fyne.io/fyne/v2/app/app_xdg.go create mode 100644 vendor/fyne.io/fyne/v2/app/cloud.go create mode 100644 vendor/fyne.io/fyne/v2/app/icon_cache_file.go create mode 100644 vendor/fyne.io/fyne/v2/app/icon_cache_noos.go create mode 100644 vendor/fyne.io/fyne/v2/app/icon_cache_other.go create mode 100644 vendor/fyne.io/fyne/v2/app/meta.go create mode 100644 vendor/fyne.io/fyne/v2/app/meta_development.go create mode 100644 vendor/fyne.io/fyne/v2/app/preferences.go create mode 100644 vendor/fyne.io/fyne/v2/app/preferences_android.go create mode 100644 vendor/fyne.io/fyne/v2/app/preferences_ios.go create mode 100644 vendor/fyne.io/fyne/v2/app/preferences_mobile.go create mode 100644 vendor/fyne.io/fyne/v2/app/preferences_nonweb.go create mode 100644 vendor/fyne.io/fyne/v2/app/preferences_other.go create mode 100644 vendor/fyne.io/fyne/v2/app/preferences_wasm.go create mode 100644 vendor/fyne.io/fyne/v2/app/settings.go create mode 100644 vendor/fyne.io/fyne/v2/app/settings_desktop.go create mode 100644 vendor/fyne.io/fyne/v2/app/settings_file.go create mode 100644 vendor/fyne.io/fyne/v2/app/settings_mobile.go create mode 100644 vendor/fyne.io/fyne/v2/app/settings_noos.go create mode 100644 vendor/fyne.io/fyne/v2/app/settings_wasm.go create mode 100644 vendor/fyne.io/fyne/v2/app/storage.go create mode 100644 vendor/fyne.io/fyne/v2/canvas.go create mode 100644 vendor/fyne.io/fyne/v2/canvas/animation.go create mode 100644 vendor/fyne.io/fyne/v2/canvas/arc.go create mode 100644 vendor/fyne.io/fyne/v2/canvas/base.go create mode 100644 vendor/fyne.io/fyne/v2/canvas/canvas.go create mode 100644 vendor/fyne.io/fyne/v2/canvas/circle.go create mode 100644 vendor/fyne.io/fyne/v2/canvas/gradient.go create mode 100644 vendor/fyne.io/fyne/v2/canvas/image.go create mode 100644 vendor/fyne.io/fyne/v2/canvas/line.go create mode 100644 vendor/fyne.io/fyne/v2/canvas/polygon.go create mode 100644 vendor/fyne.io/fyne/v2/canvas/raster.go create mode 100644 vendor/fyne.io/fyne/v2/canvas/rectangle.go create mode 100644 vendor/fyne.io/fyne/v2/canvas/square.go create mode 100644 vendor/fyne.io/fyne/v2/canvas/text.go create mode 100644 vendor/fyne.io/fyne/v2/canvasobject.go create mode 100644 vendor/fyne.io/fyne/v2/clipboard.go create mode 100644 vendor/fyne.io/fyne/v2/cloud.go create mode 100644 vendor/fyne.io/fyne/v2/container.go create mode 100644 vendor/fyne.io/fyne/v2/container/apptabs.go create mode 100644 vendor/fyne.io/fyne/v2/container/clip.go create mode 100644 vendor/fyne.io/fyne/v2/container/container.go create mode 100644 vendor/fyne.io/fyne/v2/container/doctabs.go create mode 100644 vendor/fyne.io/fyne/v2/container/innerwindow.go create mode 100644 vendor/fyne.io/fyne/v2/container/layouts.go create mode 100644 vendor/fyne.io/fyne/v2/container/multiplewindows.go create mode 100644 vendor/fyne.io/fyne/v2/container/navigation.go create mode 100644 vendor/fyne.io/fyne/v2/container/scroll.go create mode 100644 vendor/fyne.io/fyne/v2/container/split.go create mode 100644 vendor/fyne.io/fyne/v2/container/tabs.go create mode 100644 vendor/fyne.io/fyne/v2/container/theme.go create mode 100644 vendor/fyne.io/fyne/v2/data/binding/binding.go create mode 100644 vendor/fyne.io/fyne/v2/data/binding/bool.go create mode 100644 vendor/fyne.io/fyne/v2/data/binding/convert.go create mode 100644 vendor/fyne.io/fyne/v2/data/binding/convert_helper.go create mode 100644 vendor/fyne.io/fyne/v2/data/binding/items.go create mode 100644 vendor/fyne.io/fyne/v2/data/binding/lists.go create mode 100644 vendor/fyne.io/fyne/v2/data/binding/maps.go create mode 100644 vendor/fyne.io/fyne/v2/data/binding/pref_helper.go create mode 100644 vendor/fyne.io/fyne/v2/data/binding/preference.go create mode 100644 vendor/fyne.io/fyne/v2/data/binding/sprintf.go create mode 100644 vendor/fyne.io/fyne/v2/data/binding/trees.go create mode 100644 vendor/fyne.io/fyne/v2/device.go create mode 100644 vendor/fyne.io/fyne/v2/dialog/base.go create mode 100644 vendor/fyne.io/fyne/v2/dialog/color.go create mode 100644 vendor/fyne.io/fyne/v2/dialog/color_button.go create mode 100644 vendor/fyne.io/fyne/v2/dialog/color_channel.go create mode 100644 vendor/fyne.io/fyne/v2/dialog/color_picker.go create mode 100644 vendor/fyne.io/fyne/v2/dialog/color_preview.go create mode 100644 vendor/fyne.io/fyne/v2/dialog/color_wheel.go create mode 100644 vendor/fyne.io/fyne/v2/dialog/confirm.go create mode 100644 vendor/fyne.io/fyne/v2/dialog/custom.go create mode 100644 vendor/fyne.io/fyne/v2/dialog/entry.go create mode 100644 vendor/fyne.io/fyne/v2/dialog/file.go create mode 100644 vendor/fyne.io/fyne/v2/dialog/file_darwin.go create mode 100644 vendor/fyne.io/fyne/v2/dialog/file_mobile.go create mode 100644 vendor/fyne.io/fyne/v2/dialog/file_tamago.go create mode 100644 vendor/fyne.io/fyne/v2/dialog/file_unix.go create mode 100644 vendor/fyne.io/fyne/v2/dialog/file_wasm.go create mode 100644 vendor/fyne.io/fyne/v2/dialog/file_windows.go create mode 100644 vendor/fyne.io/fyne/v2/dialog/file_xdg.go create mode 100644 vendor/fyne.io/fyne/v2/dialog/file_xdg_flatpak.go create mode 100644 vendor/fyne.io/fyne/v2/dialog/file_xdg_notflatpak.go create mode 100644 vendor/fyne.io/fyne/v2/dialog/fileitem.go create mode 100644 vendor/fyne.io/fyne/v2/dialog/folder.go create mode 100644 vendor/fyne.io/fyne/v2/dialog/form.go create mode 100644 vendor/fyne.io/fyne/v2/dialog/information.go create mode 100644 vendor/fyne.io/fyne/v2/dialog/progress.go create mode 100644 vendor/fyne.io/fyne/v2/dialog/progressinfinite.go create mode 100644 vendor/fyne.io/fyne/v2/dialog/text.go create mode 100644 vendor/fyne.io/fyne/v2/driver.go create mode 100644 vendor/fyne.io/fyne/v2/driver/desktop/app.go create mode 100644 vendor/fyne.io/fyne/v2/driver/desktop/canvas.go create mode 100644 vendor/fyne.io/fyne/v2/driver/desktop/cursor.go create mode 100644 vendor/fyne.io/fyne/v2/driver/desktop/driver.go create mode 100644 vendor/fyne.io/fyne/v2/driver/desktop/key.go create mode 100644 vendor/fyne.io/fyne/v2/driver/desktop/mouse.go create mode 100644 vendor/fyne.io/fyne/v2/driver/desktop/shortcut.go create mode 100644 vendor/fyne.io/fyne/v2/driver/embedded/driver.go create mode 100644 vendor/fyne.io/fyne/v2/driver/embedded/event.go create mode 100644 vendor/fyne.io/fyne/v2/driver/embedded/keyboard.go create mode 100644 vendor/fyne.io/fyne/v2/driver/embedded/touch.go create mode 100644 vendor/fyne.io/fyne/v2/driver/mobile/device.go create mode 100644 vendor/fyne.io/fyne/v2/driver/mobile/driver.go create mode 100644 vendor/fyne.io/fyne/v2/driver/mobile/key.go create mode 100644 vendor/fyne.io/fyne/v2/driver/mobile/keyboard.go create mode 100644 vendor/fyne.io/fyne/v2/driver/mobile/touch.go create mode 100644 vendor/fyne.io/fyne/v2/driver/native.go create mode 100644 vendor/fyne.io/fyne/v2/driver/native_android.go create mode 100644 vendor/fyne.io/fyne/v2/driver/native_other.go create mode 100644 vendor/fyne.io/fyne/v2/driver/software/render.go create mode 100644 vendor/fyne.io/fyne/v2/driver/software/softwarecanvas.go create mode 100644 vendor/fyne.io/fyne/v2/event.go create mode 100644 vendor/fyne.io/fyne/v2/fyne.go create mode 100644 vendor/fyne.io/fyne/v2/geometry.go create mode 100644 vendor/fyne.io/fyne/v2/internal/animation/animation.go create mode 100644 vendor/fyne.io/fyne/v2/internal/animation/runner.go create mode 100644 vendor/fyne.io/fyne/v2/internal/app/config.go create mode 100644 vendor/fyne.io/fyne/v2/internal/app/config_desktop_darwin.go create mode 100644 vendor/fyne.io/fyne/v2/internal/app/config_mobile_and.go create mode 100644 vendor/fyne.io/fyne/v2/internal/app/config_mobile_ios.go create mode 100644 vendor/fyne.io/fyne/v2/internal/app/config_mobile_ios.m create mode 100644 vendor/fyne.io/fyne/v2/internal/app/config_noos.go create mode 100644 vendor/fyne.io/fyne/v2/internal/app/config_other.go create mode 100644 vendor/fyne.io/fyne/v2/internal/app/config_wasm.go create mode 100644 vendor/fyne.io/fyne/v2/internal/app/config_windows.go create mode 100644 vendor/fyne.io/fyne/v2/internal/app/config_xdg.go create mode 100644 vendor/fyne.io/fyne/v2/internal/app/focus_manager.go create mode 100644 vendor/fyne.io/fyne/v2/internal/app/lifecycle.go create mode 100644 vendor/fyne.io/fyne/v2/internal/app/meta.go create mode 100644 vendor/fyne.io/fyne/v2/internal/app/theme.go create mode 100644 vendor/fyne.io/fyne/v2/internal/app/theme_darwin.go create mode 100644 vendor/fyne.io/fyne/v2/internal/app/theme_darwin.m create mode 100644 vendor/fyne.io/fyne/v2/internal/app/theme_mobile.go create mode 100644 vendor/fyne.io/fyne/v2/internal/app/theme_other.go create mode 100644 vendor/fyne.io/fyne/v2/internal/app/theme_wasm.go create mode 100644 vendor/fyne.io/fyne/v2/internal/app/theme_web.go create mode 100644 vendor/fyne.io/fyne/v2/internal/app/theme_windows.go create mode 100644 vendor/fyne.io/fyne/v2/internal/app/theme_xdg.go create mode 100644 vendor/fyne.io/fyne/v2/internal/async/chan.go create mode 100644 vendor/fyne.io/fyne/v2/internal/async/chan_struct.go create mode 100644 vendor/fyne.io/fyne/v2/internal/async/doc.go create mode 100644 vendor/fyne.io/fyne/v2/internal/async/goroutine.go create mode 100644 vendor/fyne.io/fyne/v2/internal/async/goroutine_desktop.go create mode 100644 vendor/fyne.io/fyne/v2/internal/async/goroutine_mobile.go create mode 100644 vendor/fyne.io/fyne/v2/internal/async/map.go create mode 100644 vendor/fyne.io/fyne/v2/internal/async/map_clear.go create mode 100644 vendor/fyne.io/fyne/v2/internal/async/map_clear_go1.23.go create mode 100644 vendor/fyne.io/fyne/v2/internal/async/map_migratedfynedo.go create mode 100644 vendor/fyne.io/fyne/v2/internal/async/pool.go create mode 100644 vendor/fyne.io/fyne/v2/internal/async/queue.go create mode 100644 vendor/fyne.io/fyne/v2/internal/async/queue_migratedfynedo.go create mode 100644 vendor/fyne.io/fyne/v2/internal/build/animations_disabled.go create mode 100644 vendor/fyne.io/fyne/v2/internal/build/animations_enabled.go create mode 100644 vendor/fyne.io/fyne/v2/internal/build/build.go create mode 100644 vendor/fyne.io/fyne/v2/internal/build/driver_flatpak.go create mode 100644 vendor/fyne.io/fyne/v2/internal/build/driver_notflatpak.go create mode 100644 vendor/fyne.io/fyne/v2/internal/build/driver_notwayland.go create mode 100644 vendor/fyne.io/fyne/v2/internal/build/driver_wayland.go create mode 100644 vendor/fyne.io/fyne/v2/internal/build/hints_disabled.go create mode 100644 vendor/fyne.io/fyne/v2/internal/build/hints_enabled.go create mode 100644 vendor/fyne.io/fyne/v2/internal/build/menu_integrated.go create mode 100644 vendor/fyne.io/fyne/v2/internal/build/menu_native.go create mode 100644 vendor/fyne.io/fyne/v2/internal/build/metadata.go create mode 100644 vendor/fyne.io/fyne/v2/internal/build/metadata_disabled.go create mode 100644 vendor/fyne.io/fyne/v2/internal/build/migrated_fynedo.go create mode 100644 vendor/fyne.io/fyne/v2/internal/build/migrated_notfynedo.go create mode 100644 vendor/fyne.io/fyne/v2/internal/build/mode_debug.go create mode 100644 vendor/fyne.io/fyne/v2/internal/build/mode_release.go create mode 100644 vendor/fyne.io/fyne/v2/internal/build/mode_standard.go create mode 100644 vendor/fyne.io/fyne/v2/internal/cache/base.go create mode 100644 vendor/fyne.io/fyne/v2/internal/cache/canvases.go create mode 100644 vendor/fyne.io/fyne/v2/internal/cache/svg.go create mode 100644 vendor/fyne.io/fyne/v2/internal/cache/text.go create mode 100644 vendor/fyne.io/fyne/v2/internal/cache/texture_common.go create mode 100644 vendor/fyne.io/fyne/v2/internal/cache/texture_desktop.go create mode 100644 vendor/fyne.io/fyne/v2/internal/cache/texture_gomobile.go create mode 100644 vendor/fyne.io/fyne/v2/internal/cache/texture_wasm.go create mode 100644 vendor/fyne.io/fyne/v2/internal/cache/theme.go create mode 100644 vendor/fyne.io/fyne/v2/internal/cache/widget.go create mode 100644 vendor/fyne.io/fyne/v2/internal/clip.go create mode 100644 vendor/fyne.io/fyne/v2/internal/color/color.go create mode 100644 vendor/fyne.io/fyne/v2/internal/docs.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/common/canvas.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/common/driver.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/common/structures.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/common/window.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/context.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/embedded/device.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/embedded/driver.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/embedded/touchscreen.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/embedded/window.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/animation.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/canvas.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/clipboard.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/clipboard_wasm.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/device.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/device_desktop.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/device_wasm.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/driver.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/driver_darwin.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/driver_darwin.m create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/driver_desktop.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/driver_notwindows.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/driver_wasm.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/driver_windows.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/driver_xdg.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/glfw_core.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/glfw_es.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/glfw_wasm.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/key.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/keyboard.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/loop.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/loop_desktop.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/loop_wasm.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/menu.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/menu_bar.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/menu_bar_item.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/menu_darwin.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/menu_darwin.m create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/menu_notweb.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/menu_other.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/menu_wasm.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/scale.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/scroll_speed_darwin.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/scroll_speed_default.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/scroll_speed_wasm.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/window.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/window_darwin.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/window_darwin.m create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/window_desktop.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/window_notdarwin.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/window_notwindows.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/window_notxdg.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/window_wasm.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/window_wayland.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/window_windows.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/window_x11.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/glfw/window_xdg.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/README.txt create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/android.c create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/animation.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/app/GoNativeActivity.java create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/app/android.c create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/app/android.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/app/app.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/app/app_unix.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/app/callfn/callfn.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/app/callfn/callfn_386.s create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/app/callfn/callfn_amd64.s create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/app/callfn/callfn_arm.s create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/app/callfn/callfn_arm64.s create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/app/darwin_desktop.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/app/darwin_desktop.m create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/app/darwin_ios.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/app/darwin_ios.m create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/app/doc.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/app/keyboard.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/app/mobile.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/app/shiny.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/app/x11.c create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/app/x11.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/canvas.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/clipboard.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/clipboard_android.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/clipboard_desktop.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/clipboard_ios.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/clipboard_ios.m create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/device.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/device_android.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/device_desktop.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/device_ios.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/device_wayland.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/driver.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/driver_android.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/driver_ios.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/driver_ios.m create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/event/key/code_string.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/event/key/key.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/event/lifecycle/lifecycle.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/event/paint/paint.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/event/size/size.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/event/touch/touch.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/file.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/file_android.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/file_desktop.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/file_ios.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/file_ios.m create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/folder.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/folder_android.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/folder_desktop.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/folder_ios.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/folder_ios.m create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/consts.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/dll_windows.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/doc.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/fn.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/gl.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/interface.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/types.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/work.c create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/work.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/work.h create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/work_other.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/work_windows.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/keyboard.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/menu.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/menubutton.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/mobileinit/ctx_android.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/mobileinit/mobileinit.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/mobileinit/mobileinit_android.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/mobileinit/mobileinit_ios.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/mobileinit/mobileinit_ios.m create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/mobileinit/mobileinit_linux.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/repository.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/uri.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/uri_android.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/window.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/window_android.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/mobile/window_ios.go create mode 100644 vendor/fyne.io/fyne/v2/internal/driver/util.go create mode 100644 vendor/fyne.io/fyne/v2/internal/hints_disabled.go create mode 100644 vendor/fyne.io/fyne/v2/internal/hints_enabled.go create mode 100644 vendor/fyne.io/fyne/v2/internal/metadata/data.go create mode 100644 vendor/fyne.io/fyne/v2/internal/metadata/icon.go create mode 100644 vendor/fyne.io/fyne/v2/internal/metadata/load.go create mode 100644 vendor/fyne.io/fyne/v2/internal/metadata/save.go create mode 100644 vendor/fyne.io/fyne/v2/internal/overlay_stack.go create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/draw.go create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/font.go create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/font_prod.go create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/capture.go create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/context.go create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/draw.go create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/draw_desktop.go create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/draw_notdesktop.go create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/gl.go create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/gl_core.go create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/gl_es.go create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/gl_gomobile.go create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/gl_wasm.go create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/painter.go create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/shaders.go create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/arc.frag create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/arc_es.frag create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/line.frag create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/line.vert create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/line_es.frag create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/line_es.vert create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/polygon.frag create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/polygon_es.frag create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/rectangle.frag create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/rectangle.vert create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/rectangle_es.frag create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/rectangle_es.vert create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/round_rectangle.frag create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/round_rectangle_es.frag create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/simple.frag create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/simple.vert create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/simple_es.frag create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/simple_es.vert create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/shaders_es.go create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/gl/texture.go create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/image.go create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/software/draw.go create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/software/painter.go create mode 100644 vendor/fyne.io/fyne/v2/internal/painter/vector.go create mode 100644 vendor/fyne.io/fyne/v2/internal/preferences.go create mode 100644 vendor/fyne.io/fyne/v2/internal/repository/file.go create mode 100644 vendor/fyne.io/fyne/v2/internal/repository/http.go create mode 100644 vendor/fyne.io/fyne/v2/internal/repository/indexdb_file_wasm.go create mode 100644 vendor/fyne.io/fyne/v2/internal/repository/indexdb_wasm.go create mode 100644 vendor/fyne.io/fyne/v2/internal/repository/memory.go create mode 100644 vendor/fyne.io/fyne/v2/internal/repository/mime/mime.go create mode 100644 vendor/fyne.io/fyne/v2/internal/scale/scale.go create mode 100644 vendor/fyne.io/fyne/v2/internal/svg/svg.go create mode 100644 vendor/fyne.io/fyne/v2/internal/test/text.go create mode 100644 vendor/fyne.io/fyne/v2/internal/test/theme.go create mode 100644 vendor/fyne.io/fyne/v2/internal/test/util.go create mode 100644 vendor/fyne.io/fyne/v2/internal/test/util_helper.go create mode 100644 vendor/fyne.io/fyne/v2/internal/theme/feature.go create mode 100644 vendor/fyne.io/fyne/v2/internal/theme/render.go create mode 100644 vendor/fyne.io/fyne/v2/internal/theme/theme.go create mode 100644 vendor/fyne.io/fyne/v2/internal/widget/base.go create mode 100644 vendor/fyne.io/fyne/v2/internal/widget/base_renderer.go create mode 100644 vendor/fyne.io/fyne/v2/internal/widget/overlay_container.go create mode 100644 vendor/fyne.io/fyne/v2/internal/widget/scroller.go create mode 100644 vendor/fyne.io/fyne/v2/internal/widget/scroller_behavior_darwin.go create mode 100644 vendor/fyne.io/fyne/v2/internal/widget/scroller_behavior_darwin.m create mode 100644 vendor/fyne.io/fyne/v2/internal/widget/scroller_behavior_other.go create mode 100644 vendor/fyne.io/fyne/v2/internal/widget/shadow.go create mode 100644 vendor/fyne.io/fyne/v2/internal/widget/shadowing_renderer.go create mode 100644 vendor/fyne.io/fyne/v2/internal/widget/simple_renderer.go create mode 100644 vendor/fyne.io/fyne/v2/key.go create mode 100644 vendor/fyne.io/fyne/v2/key_darwin.go create mode 100644 vendor/fyne.io/fyne/v2/key_other.go create mode 100644 vendor/fyne.io/fyne/v2/lang/lang.go create mode 100644 vendor/fyne.io/fyne/v2/lang/lang_android.go create mode 100644 vendor/fyne.io/fyne/v2/lang/lang_notandroid.go create mode 100644 vendor/fyne.io/fyne/v2/lang/locale.go create mode 100644 vendor/fyne.io/fyne/v2/lang/translations/base.cs.json create mode 100644 vendor/fyne.io/fyne/v2/lang/translations/base.de.json create mode 100644 vendor/fyne.io/fyne/v2/lang/translations/base.el.json create mode 100644 vendor/fyne.io/fyne/v2/lang/translations/base.en.json create mode 100644 vendor/fyne.io/fyne/v2/lang/translations/base.es.json create mode 100644 vendor/fyne.io/fyne/v2/lang/translations/base.fr.json create mode 100644 vendor/fyne.io/fyne/v2/lang/translations/base.pl.json create mode 100644 vendor/fyne.io/fyne/v2/lang/translations/base.pt.json create mode 100644 vendor/fyne.io/fyne/v2/lang/translations/base.pt_BR.json create mode 100644 vendor/fyne.io/fyne/v2/lang/translations/base.ru.json create mode 100644 vendor/fyne.io/fyne/v2/lang/translations/base.sv.json create mode 100644 vendor/fyne.io/fyne/v2/lang/translations/base.ta.json create mode 100644 vendor/fyne.io/fyne/v2/lang/translations/base.uk.json create mode 100644 vendor/fyne.io/fyne/v2/lang/translations/base.zh_Hans.json create mode 100644 vendor/fyne.io/fyne/v2/layout.go create mode 100644 vendor/fyne.io/fyne/v2/layout/borderlayout.go create mode 100644 vendor/fyne.io/fyne/v2/layout/boxlayout.go create mode 100644 vendor/fyne.io/fyne/v2/layout/centerlayout.go create mode 100644 vendor/fyne.io/fyne/v2/layout/custompaddedlayout.go create mode 100644 vendor/fyne.io/fyne/v2/layout/formlayout.go create mode 100644 vendor/fyne.io/fyne/v2/layout/gridlayout.go create mode 100644 vendor/fyne.io/fyne/v2/layout/gridwraplayout.go create mode 100644 vendor/fyne.io/fyne/v2/layout/paddedlayout.go create mode 100644 vendor/fyne.io/fyne/v2/layout/rowwrap.go create mode 100644 vendor/fyne.io/fyne/v2/layout/spacer.go create mode 100644 vendor/fyne.io/fyne/v2/layout/stacklayout.go create mode 100644 vendor/fyne.io/fyne/v2/locale.go create mode 100644 vendor/fyne.io/fyne/v2/log.go create mode 100644 vendor/fyne.io/fyne/v2/math.go create mode 100644 vendor/fyne.io/fyne/v2/menu.go create mode 100644 vendor/fyne.io/fyne/v2/notification.go create mode 100644 vendor/fyne.io/fyne/v2/overlay_stack.go create mode 100644 vendor/fyne.io/fyne/v2/preferences.go create mode 100644 vendor/fyne.io/fyne/v2/resource.go create mode 100644 vendor/fyne.io/fyne/v2/scroll.go create mode 100644 vendor/fyne.io/fyne/v2/serialise.go create mode 100644 vendor/fyne.io/fyne/v2/settings.go create mode 100644 vendor/fyne.io/fyne/v2/shortcut.go create mode 100644 vendor/fyne.io/fyne/v2/staticcheck.conf create mode 100644 vendor/fyne.io/fyne/v2/storage.go create mode 100644 vendor/fyne.io/fyne/v2/storage/errors.go create mode 100644 vendor/fyne.io/fyne/v2/storage/file.go create mode 100644 vendor/fyne.io/fyne/v2/storage/filter.go create mode 100644 vendor/fyne.io/fyne/v2/storage/repository/errors.go create mode 100644 vendor/fyne.io/fyne/v2/storage/repository/generic.go create mode 100644 vendor/fyne.io/fyne/v2/storage/repository/parse.go create mode 100644 vendor/fyne.io/fyne/v2/storage/repository/repository.go create mode 100644 vendor/fyne.io/fyne/v2/storage/repository/uri.go create mode 100644 vendor/fyne.io/fyne/v2/storage/resource.go create mode 100644 vendor/fyne.io/fyne/v2/storage/uri.go create mode 100644 vendor/fyne.io/fyne/v2/storage/uri_root_error.go create mode 100644 vendor/fyne.io/fyne/v2/test/app.go create mode 100644 vendor/fyne.io/fyne/v2/test/app_helper.go create mode 100644 vendor/fyne.io/fyne/v2/test/canvas.go create mode 100644 vendor/fyne.io/fyne/v2/test/clipboard.go create mode 100644 vendor/fyne.io/fyne/v2/test/cloud.go create mode 100644 vendor/fyne.io/fyne/v2/test/device.go create mode 100644 vendor/fyne.io/fyne/v2/test/device_mobile.go create mode 100644 vendor/fyne.io/fyne/v2/test/device_other.go create mode 100644 vendor/fyne.io/fyne/v2/test/driver.go create mode 100644 vendor/fyne.io/fyne/v2/test/file.go create mode 100644 vendor/fyne.io/fyne/v2/test/markup_renderer.go create mode 100644 vendor/fyne.io/fyne/v2/test/notification.go create mode 100644 vendor/fyne.io/fyne/v2/test/notification_helper.go create mode 100644 vendor/fyne.io/fyne/v2/test/storage.go create mode 100644 vendor/fyne.io/fyne/v2/test/test.go create mode 100644 vendor/fyne.io/fyne/v2/test/test_helper.go create mode 100644 vendor/fyne.io/fyne/v2/test/theme.go create mode 100644 vendor/fyne.io/fyne/v2/test/theme_helper.go create mode 100644 vendor/fyne.io/fyne/v2/test/window.go create mode 100644 vendor/fyne.io/fyne/v2/test/window_helper.go create mode 100644 vendor/fyne.io/fyne/v2/text.go create mode 100644 vendor/fyne.io/fyne/v2/theme.go create mode 100644 vendor/fyne.io/fyne/v2/theme/bundled-emoji.go create mode 100644 vendor/fyne.io/fyne/v2/theme/bundled-fonts.go create mode 100644 vendor/fyne.io/fyne/v2/theme/bundled-icons.go create mode 100644 vendor/fyne.io/fyne/v2/theme/color.go create mode 100644 vendor/fyne.io/fyne/v2/theme/font.go create mode 100644 vendor/fyne.io/fyne/v2/theme/font/DejaVuSansMono-Powerline.ttf create mode 100644 vendor/fyne.io/fyne/v2/theme/font/EmojiOneColor.otf create mode 100644 vendor/fyne.io/fyne/v2/theme/font/InterSymbols-Regular.ttf create mode 100644 vendor/fyne.io/fyne/v2/theme/font/NotoSans-Bold.ttf create mode 100644 vendor/fyne.io/fyne/v2/theme/font/NotoSans-BoldItalic.ttf create mode 100644 vendor/fyne.io/fyne/v2/theme/font/NotoSans-Italic.ttf create mode 100644 vendor/fyne.io/fyne/v2/theme/font/NotoSans-Regular.ttf create mode 100644 vendor/fyne.io/fyne/v2/theme/icons.go create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/account.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/arrow-back.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/arrow-down.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/arrow-drop-down.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/arrow-drop-up.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/arrow-forward.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/arrow-up.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/broken-image.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/calendar.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/cancel.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/check-box-checked.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/check-box-fill.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/check-box-partial.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/check-box.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/check.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/color-achromatic.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/color-chromatic.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/color-palette.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/computer.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/content-add.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/content-copy.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/content-cut.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/content-paste.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/content-redo.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/content-remove.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/content-undo.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/delete.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/desktop.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/document-create.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/document-print.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/document-save.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/document.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/download.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/drag-corner-indicator.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/error.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/file-application.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/file-audio.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/file-image.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/file-text.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/file-video.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/file.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/folder-new.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/folder-open.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/folder.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/fyne.png create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/grid.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/help.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/history.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/home.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/info.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/list.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/login.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/logout.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/mail-attachment.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/mail-compose.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/mail-forward.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/mail-reply.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/mail-reply_all.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/mail-send.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/maximize.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/media-fast-forward.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/media-fast-rewind.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/media-music.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/media-pause.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/media-photo.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/media-play.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/media-record.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/media-replay.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/media-skip-next.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/media-skip-previous.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/media-stop.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/media-video.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/menu-expand.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/menu.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/minimize.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/more-horizontal.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/more-vertical.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/question.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/radio-button-checked.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/radio-button-fill.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/radio-button.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/search-replace.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/search.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/settings.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/storage.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/upload.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/view-fullscreen.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/view-refresh.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/view-zoom-fit.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/view-zoom-in.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/view-zoom-out.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/visibility-off.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/visibility.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/volume-down.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/volume-mute.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/volume-up.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/icons/warning.svg create mode 100644 vendor/fyne.io/fyne/v2/theme/json.go create mode 100644 vendor/fyne.io/fyne/v2/theme/legacy.go create mode 100644 vendor/fyne.io/fyne/v2/theme/size.go create mode 100644 vendor/fyne.io/fyne/v2/theme/theme.go create mode 100644 vendor/fyne.io/fyne/v2/theme/theme_desktop.go create mode 100644 vendor/fyne.io/fyne/v2/theme/theme_hints.go create mode 100644 vendor/fyne.io/fyne/v2/theme/theme_mobile.go create mode 100644 vendor/fyne.io/fyne/v2/theme/theme_other.go create mode 100644 vendor/fyne.io/fyne/v2/theme/theme_wasm.go create mode 100644 vendor/fyne.io/fyne/v2/theme/unbundled-emoji.go create mode 100644 vendor/fyne.io/fyne/v2/thread.go create mode 100644 vendor/fyne.io/fyne/v2/uri.go create mode 100644 vendor/fyne.io/fyne/v2/validation.go create mode 100644 vendor/fyne.io/fyne/v2/widget.go create mode 100644 vendor/fyne.io/fyne/v2/widget/accordion.go create mode 100644 vendor/fyne.io/fyne/v2/widget/activity.go create mode 100644 vendor/fyne.io/fyne/v2/widget/bind_helper.go create mode 100644 vendor/fyne.io/fyne/v2/widget/button.go create mode 100644 vendor/fyne.io/fyne/v2/widget/calendar.go create mode 100644 vendor/fyne.io/fyne/v2/widget/card.go create mode 100644 vendor/fyne.io/fyne/v2/widget/check.go create mode 100644 vendor/fyne.io/fyne/v2/widget/check_group.go create mode 100644 vendor/fyne.io/fyne/v2/widget/date_entry.go create mode 100644 vendor/fyne.io/fyne/v2/widget/entry.go create mode 100644 vendor/fyne.io/fyne/v2/widget/entry_cursor_anim.go create mode 100644 vendor/fyne.io/fyne/v2/widget/entry_password.go create mode 100644 vendor/fyne.io/fyne/v2/widget/entry_validation.go create mode 100644 vendor/fyne.io/fyne/v2/widget/fileicon.go create mode 100644 vendor/fyne.io/fyne/v2/widget/form.go create mode 100644 vendor/fyne.io/fyne/v2/widget/gridwrap.go create mode 100644 vendor/fyne.io/fyne/v2/widget/hyperlink.go create mode 100644 vendor/fyne.io/fyne/v2/widget/icon.go create mode 100644 vendor/fyne.io/fyne/v2/widget/importance.go create mode 100644 vendor/fyne.io/fyne/v2/widget/label.go create mode 100644 vendor/fyne.io/fyne/v2/widget/list.go create mode 100644 vendor/fyne.io/fyne/v2/widget/locale.go create mode 100644 vendor/fyne.io/fyne/v2/widget/markdown.go create mode 100644 vendor/fyne.io/fyne/v2/widget/markdown_image_notweb.go create mode 100644 vendor/fyne.io/fyne/v2/widget/markdown_image_wasm.go create mode 100644 vendor/fyne.io/fyne/v2/widget/menu.go create mode 100644 vendor/fyne.io/fyne/v2/widget/menu_item.go create mode 100644 vendor/fyne.io/fyne/v2/widget/menu_item_darwin.go create mode 100644 vendor/fyne.io/fyne/v2/widget/menu_item_other.go create mode 100644 vendor/fyne.io/fyne/v2/widget/popup.go create mode 100644 vendor/fyne.io/fyne/v2/widget/popup_menu.go create mode 100644 vendor/fyne.io/fyne/v2/widget/progressbar.go create mode 100644 vendor/fyne.io/fyne/v2/widget/progressbarinfinite.go create mode 100644 vendor/fyne.io/fyne/v2/widget/radio_group.go create mode 100644 vendor/fyne.io/fyne/v2/widget/radio_item.go create mode 100644 vendor/fyne.io/fyne/v2/widget/richtext.go create mode 100644 vendor/fyne.io/fyne/v2/widget/richtext_objects.go create mode 100644 vendor/fyne.io/fyne/v2/widget/select.go create mode 100644 vendor/fyne.io/fyne/v2/widget/select_entry.go create mode 100644 vendor/fyne.io/fyne/v2/widget/selectable.go create mode 100644 vendor/fyne.io/fyne/v2/widget/separator.go create mode 100644 vendor/fyne.io/fyne/v2/widget/slider.go create mode 100644 vendor/fyne.io/fyne/v2/widget/table.go create mode 100644 vendor/fyne.io/fyne/v2/widget/textgrid.go create mode 100644 vendor/fyne.io/fyne/v2/widget/toolbar.go create mode 100644 vendor/fyne.io/fyne/v2/widget/tree.go create mode 100644 vendor/fyne.io/fyne/v2/widget/widget.go create mode 100644 vendor/fyne.io/fyne/v2/window.go create mode 100644 vendor/fyne.io/systray/.gitignore create mode 100644 vendor/fyne.io/systray/CHANGELOG.md create mode 100644 vendor/fyne.io/systray/LICENSE create mode 100644 vendor/fyne.io/systray/Makefile create mode 100644 vendor/fyne.io/systray/README.md create mode 100644 vendor/fyne.io/systray/internal/generated/menu/dbus_menu.go create mode 100644 vendor/fyne.io/systray/internal/generated/notifier/status_notifier_item.go create mode 100644 vendor/fyne.io/systray/systray.go create mode 100644 vendor/fyne.io/systray/systray.h create mode 100644 vendor/fyne.io/systray/systray_darwin.go create mode 100644 vendor/fyne.io/systray/systray_darwin.m create mode 100644 vendor/fyne.io/systray/systray_menu_unix.go create mode 100644 vendor/fyne.io/systray/systray_notifier_unix.go create mode 100644 vendor/fyne.io/systray/systray_unix.go create mode 100644 vendor/fyne.io/systray/systray_windows.go create mode 100644 vendor/github.com/BurntSushi/toml/.gitignore create mode 100644 vendor/github.com/BurntSushi/toml/COPYING create mode 100644 vendor/github.com/BurntSushi/toml/README.md create mode 100644 vendor/github.com/BurntSushi/toml/decode.go create mode 100644 vendor/github.com/BurntSushi/toml/deprecated.go create mode 100644 vendor/github.com/BurntSushi/toml/doc.go create mode 100644 vendor/github.com/BurntSushi/toml/encode.go create mode 100644 vendor/github.com/BurntSushi/toml/error.go create mode 100644 vendor/github.com/BurntSushi/toml/internal/tz.go create mode 100644 vendor/github.com/BurntSushi/toml/lex.go create mode 100644 vendor/github.com/BurntSushi/toml/meta.go create mode 100644 vendor/github.com/BurntSushi/toml/parse.go create mode 100644 vendor/github.com/BurntSushi/toml/type_fields.go create mode 100644 vendor/github.com/BurntSushi/toml/type_toml.go create mode 100644 vendor/github.com/davecgh/go-spew/LICENSE create mode 100644 vendor/github.com/davecgh/go-spew/spew/bypass.go create mode 100644 vendor/github.com/davecgh/go-spew/spew/bypasssafe.go create mode 100644 vendor/github.com/davecgh/go-spew/spew/common.go create mode 100644 vendor/github.com/davecgh/go-spew/spew/config.go create mode 100644 vendor/github.com/davecgh/go-spew/spew/doc.go create mode 100644 vendor/github.com/davecgh/go-spew/spew/dump.go create mode 100644 vendor/github.com/davecgh/go-spew/spew/format.go create mode 100644 vendor/github.com/davecgh/go-spew/spew/spew.go create mode 100644 vendor/github.com/ebitengine/oto/v3/.clang-format create mode 100644 vendor/github.com/ebitengine/oto/v3/.gitattributes create mode 100644 vendor/github.com/ebitengine/oto/v3/.gitignore create mode 100644 vendor/github.com/ebitengine/oto/v3/LICENSE create mode 100644 vendor/github.com/ebitengine/oto/v3/README.md create mode 100644 vendor/github.com/ebitengine/oto/v3/api_darwin.go create mode 100644 vendor/github.com/ebitengine/oto/v3/api_wasapi_windows.go create mode 100644 vendor/github.com/ebitengine/oto/v3/api_winmm_windows.go create mode 100644 vendor/github.com/ebitengine/oto/v3/context.go create mode 100644 vendor/github.com/ebitengine/oto/v3/driver_android.go create mode 100644 vendor/github.com/ebitengine/oto/v3/driver_console.go create mode 100644 vendor/github.com/ebitengine/oto/v3/driver_darwin.go create mode 100644 vendor/github.com/ebitengine/oto/v3/driver_js.go create mode 100644 vendor/github.com/ebitengine/oto/v3/driver_nintendosdk.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/driver_playstation5.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/driver_unix.go create mode 100644 vendor/github.com/ebitengine/oto/v3/driver_wasapi_windows.go create mode 100644 vendor/github.com/ebitengine/oto/v3/driver_windows.go create mode 100644 vendor/github.com/ebitengine/oto/v3/driver_winmm_windows.go create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/mux/mux.go create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/.clang-format create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/LICENSE-oboe create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/README-oboe.md create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/binding_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/binding_android.go create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/binding_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/generate.go create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_aaudio_AAudioExtensions_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_aaudio_AAudioLoader_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_aaudio_AAudioLoader_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_aaudio_AudioStreamAAudio_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_aaudio_AudioStreamAAudio_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_AdpfWrapper_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_AdpfWrapper_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_AudioSourceCaller_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_AudioSourceCaller_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_AudioStreamBuilder_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_AudioStream_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_DataConversionFlowGraph_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_DataConversionFlowGraph_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_FilterAudioStream_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_FilterAudioStream_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_FixedBlockAdapter_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_FixedBlockAdapter_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_FixedBlockReader_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_FixedBlockReader_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_FixedBlockWriter_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_FixedBlockWriter_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_LatencyTuner_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_MonotonicCounter_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_OboeDebug_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_OboeExtensions_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_QuirksManager_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_QuirksManager_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_SourceFloatCaller_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_SourceFloatCaller_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_SourceI16Caller_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_SourceI16Caller_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_SourceI24Caller_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_SourceI24Caller_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_SourceI32Caller_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_SourceI32Caller_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_StabilizedCallback_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_Trace_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_Trace_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_Utilities_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_common_Version_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_fifo_FifoBuffer_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_fifo_FifoControllerBase_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_fifo_FifoControllerIndirect_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_fifo_FifoControllerIndirect_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_fifo_FifoController_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_fifo_FifoController_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_ChannelCountConverter_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_ChannelCountConverter_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_ClipToRange_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_ClipToRange_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_FlowGraphNode_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_FlowGraphNode_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_FlowgraphUtilities_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_Limiter_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_Limiter_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_ManyToMultiConverter_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_ManyToMultiConverter_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_MonoBlend_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_MonoBlend_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_MonoToMultiConverter_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_MonoToMultiConverter_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_MultiToManyConverter_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_MultiToManyConverter_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_MultiToMonoConverter_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_MultiToMonoConverter_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_RampLinear_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_RampLinear_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_SampleRateConverter_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_SampleRateConverter_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_SinkFloat_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_SinkFloat_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_SinkI16_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_SinkI16_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_SinkI24_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_SinkI24_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_SinkI32_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_SinkI32_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_SinkI8_24_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_SinkI8_24_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_SourceFloat_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_SourceFloat_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_SourceI16_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_SourceI16_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_SourceI24_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_SourceI24_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_SourceI32_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_SourceI32_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_SourceI8_24_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_SourceI8_24_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_resampler_HyperbolicCosineWindow_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_resampler_IntegerRatio_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_resampler_IntegerRatio_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_resampler_KaiserWindow_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_resampler_LinearResampler_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_resampler_LinearResampler_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_resampler_MultiChannelResampler_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_resampler_MultiChannelResampler_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_resampler_PolyphaseResamplerMono_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_resampler_PolyphaseResamplerMono_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_resampler_PolyphaseResamplerStereo_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_resampler_PolyphaseResamplerStereo_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_resampler_PolyphaseResampler_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_resampler_PolyphaseResampler_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_resampler_ResamplerDefinitions_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_resampler_SincResamplerStereo_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_resampler_SincResamplerStereo_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_resampler_SincResampler_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_flowgraph_resampler_SincResampler_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_oboe_AudioClock_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_oboe_AudioStreamBase_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_oboe_AudioStreamBuilder_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_oboe_AudioStreamCallback_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_oboe_AudioStream_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_oboe_Definitions_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_oboe_FifoBuffer_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_oboe_FifoControllerBase_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_oboe_FullDuplexStream_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_oboe_LatencyTuner_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_oboe_OboeExtensions_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_oboe_Oboe_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_oboe_ResultWithValue_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_oboe_StabilizedCallback_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_oboe_Utilities_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_oboe_Version_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_opensles_AudioInputStreamOpenSLES_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_opensles_AudioInputStreamOpenSLES_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_opensles_AudioOutputStreamOpenSLES_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_opensles_AudioOutputStreamOpenSLES_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_opensles_AudioStreamBuffered_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_opensles_AudioStreamBuffered_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_opensles_AudioStreamOpenSLES_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_opensles_AudioStreamOpenSLES_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_opensles_EngineOpenSLES_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_opensles_EngineOpenSLES_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_opensles_OpenSLESUtilities_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_opensles_OpenSLESUtilities_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_opensles_OutputMixerOpenSLES_android.cpp create mode 100644 vendor/github.com/ebitengine/oto/v3/internal/oboe/oboe_opensles_OutputMixerOpenSLES_android.h create mode 100644 vendor/github.com/ebitengine/oto/v3/player.go create mode 100644 vendor/github.com/ebitengine/purego/.gitignore create mode 100644 vendor/github.com/ebitengine/purego/LICENSE create mode 100644 vendor/github.com/ebitengine/purego/README.md create mode 100644 vendor/github.com/ebitengine/purego/abi_amd64.h create mode 100644 vendor/github.com/ebitengine/purego/abi_arm64.h create mode 100644 vendor/github.com/ebitengine/purego/abi_loong64.h create mode 100644 vendor/github.com/ebitengine/purego/cgo.go create mode 100644 vendor/github.com/ebitengine/purego/dlerror.go create mode 100644 vendor/github.com/ebitengine/purego/dlfcn.go create mode 100644 vendor/github.com/ebitengine/purego/dlfcn_android.go create mode 100644 vendor/github.com/ebitengine/purego/dlfcn_darwin.go create mode 100644 vendor/github.com/ebitengine/purego/dlfcn_freebsd.go create mode 100644 vendor/github.com/ebitengine/purego/dlfcn_linux.go create mode 100644 vendor/github.com/ebitengine/purego/dlfcn_netbsd.go create mode 100644 vendor/github.com/ebitengine/purego/dlfcn_nocgo_freebsd.go create mode 100644 vendor/github.com/ebitengine/purego/dlfcn_nocgo_linux.go create mode 100644 vendor/github.com/ebitengine/purego/dlfcn_nocgo_netbsd.go create mode 100644 vendor/github.com/ebitengine/purego/dlfcn_playground.go create mode 100644 vendor/github.com/ebitengine/purego/dlfcn_stubs.s create mode 100644 vendor/github.com/ebitengine/purego/func.go create mode 100644 vendor/github.com/ebitengine/purego/gen.go create mode 100644 vendor/github.com/ebitengine/purego/go_runtime.go create mode 100644 vendor/github.com/ebitengine/purego/internal/cgo/dlfcn_cgo_unix.go create mode 100644 vendor/github.com/ebitengine/purego/internal/cgo/empty.go create mode 100644 vendor/github.com/ebitengine/purego/internal/cgo/syscall_cgo_unix.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/abi_amd64.h create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/abi_arm64.h create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/abi_loong64.h create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/asm_amd64.s create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/asm_arm64.s create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/asm_loong64.s create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/callbacks.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/doc.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/freebsd.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/go_darwin_amd64.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/go_darwin_arm64.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/go_freebsd_amd64.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/go_freebsd_arm64.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/go_libinit.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/go_linux_amd64.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/go_linux_arm64.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/go_linux_loong64.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/go_netbsd.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/go_setenv.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/go_util.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/iscgo.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/libcgo.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/libcgo_darwin.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/libcgo_freebsd.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/libcgo_linux.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/libcgo_netbsd.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/netbsd.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/setenv.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/symbols.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/symbols_darwin.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/symbols_freebsd.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/symbols_linux.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/symbols_netbsd.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/trampolines_amd64.s create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/trampolines_arm64.s create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/trampolines_loong64.s create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/trampolines_stubs.s create mode 100644 vendor/github.com/ebitengine/purego/internal/strings/strings.go create mode 100644 vendor/github.com/ebitengine/purego/is_ios.go create mode 100644 vendor/github.com/ebitengine/purego/nocgo.go create mode 100644 vendor/github.com/ebitengine/purego/struct_amd64.go create mode 100644 vendor/github.com/ebitengine/purego/struct_arm64.go create mode 100644 vendor/github.com/ebitengine/purego/struct_loong64.go create mode 100644 vendor/github.com/ebitengine/purego/struct_other.go create mode 100644 vendor/github.com/ebitengine/purego/sys_amd64.s create mode 100644 vendor/github.com/ebitengine/purego/sys_arm64.s create mode 100644 vendor/github.com/ebitengine/purego/sys_loong64.s create mode 100644 vendor/github.com/ebitengine/purego/sys_unix_arm64.s create mode 100644 vendor/github.com/ebitengine/purego/sys_unix_loong64.s create mode 100644 vendor/github.com/ebitengine/purego/syscall.go create mode 100644 vendor/github.com/ebitengine/purego/syscall_cgo_linux.go create mode 100644 vendor/github.com/ebitengine/purego/syscall_sysv.go create mode 100644 vendor/github.com/ebitengine/purego/syscall_windows.go create mode 100644 vendor/github.com/ebitengine/purego/zcallback_amd64.s create mode 100644 vendor/github.com/ebitengine/purego/zcallback_arm64.s create mode 100644 vendor/github.com/ebitengine/purego/zcallback_loong64.s create mode 100644 vendor/github.com/fredbi/uri/.gitignore create mode 100644 vendor/github.com/fredbi/uri/.golangci.yml create mode 100644 vendor/github.com/fredbi/uri/LICENSE.md create mode 100644 vendor/github.com/fredbi/uri/README.md create mode 100644 vendor/github.com/fredbi/uri/builder.go create mode 100644 vendor/github.com/fredbi/uri/decode.go create mode 100644 vendor/github.com/fredbi/uri/default_ports.go create mode 100644 vendor/github.com/fredbi/uri/dns.go create mode 100644 vendor/github.com/fredbi/uri/errors.go create mode 100644 vendor/github.com/fredbi/uri/ip.go create mode 100644 vendor/github.com/fredbi/uri/post_go20.go create mode 100644 vendor/github.com/fredbi/uri/pre_go20.go create mode 100644 vendor/github.com/fredbi/uri/uri.go create mode 100644 vendor/github.com/fsnotify/fsnotify/.cirrus.yml create mode 100644 vendor/github.com/fsnotify/fsnotify/.gitignore create mode 100644 vendor/github.com/fsnotify/fsnotify/.mailmap create mode 100644 vendor/github.com/fsnotify/fsnotify/CHANGELOG.md create mode 100644 vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md create mode 100644 vendor/github.com/fsnotify/fsnotify/LICENSE create mode 100644 vendor/github.com/fsnotify/fsnotify/README.md create mode 100644 vendor/github.com/fsnotify/fsnotify/backend_fen.go create mode 100644 vendor/github.com/fsnotify/fsnotify/backend_inotify.go create mode 100644 vendor/github.com/fsnotify/fsnotify/backend_kqueue.go create mode 100644 vendor/github.com/fsnotify/fsnotify/backend_other.go create mode 100644 vendor/github.com/fsnotify/fsnotify/backend_windows.go create mode 100644 vendor/github.com/fsnotify/fsnotify/fsnotify.go create mode 100644 vendor/github.com/fsnotify/fsnotify/internal/darwin.go create mode 100644 vendor/github.com/fsnotify/fsnotify/internal/debug_darwin.go create mode 100644 vendor/github.com/fsnotify/fsnotify/internal/debug_dragonfly.go create mode 100644 vendor/github.com/fsnotify/fsnotify/internal/debug_freebsd.go create mode 100644 vendor/github.com/fsnotify/fsnotify/internal/debug_kqueue.go create mode 100644 vendor/github.com/fsnotify/fsnotify/internal/debug_linux.go create mode 100644 vendor/github.com/fsnotify/fsnotify/internal/debug_netbsd.go create mode 100644 vendor/github.com/fsnotify/fsnotify/internal/debug_openbsd.go create mode 100644 vendor/github.com/fsnotify/fsnotify/internal/debug_solaris.go create mode 100644 vendor/github.com/fsnotify/fsnotify/internal/debug_windows.go create mode 100644 vendor/github.com/fsnotify/fsnotify/internal/freebsd.go create mode 100644 vendor/github.com/fsnotify/fsnotify/internal/internal.go create mode 100644 vendor/github.com/fsnotify/fsnotify/internal/unix.go create mode 100644 vendor/github.com/fsnotify/fsnotify/internal/unix2.go create mode 100644 vendor/github.com/fsnotify/fsnotify/internal/windows.go create mode 100644 vendor/github.com/fsnotify/fsnotify/shared.go create mode 100644 vendor/github.com/fsnotify/fsnotify/staticcheck.conf create mode 100644 vendor/github.com/fsnotify/fsnotify/system_bsd.go create mode 100644 vendor/github.com/fsnotify/fsnotify/system_darwin.go create mode 100644 vendor/github.com/fyne-io/gl-js/LICENSE create mode 100644 vendor/github.com/fyne-io/gl-js/README.md create mode 100644 vendor/github.com/fyne-io/gl-js/consts.go create mode 100644 vendor/github.com/fyne-io/gl-js/doc.go create mode 100644 vendor/github.com/fyne-io/gl-js/gl_opengl.go create mode 100644 vendor/github.com/fyne-io/gl-js/gl_opengles.go create mode 100644 vendor/github.com/fyne-io/gl-js/gl_webgl_convertions_wasm.go create mode 100644 vendor/github.com/fyne-io/gl-js/gl_webgl_wasm.go create mode 100644 vendor/github.com/fyne-io/gl-js/types.go create mode 100644 vendor/github.com/fyne-io/gl-js/types_opengl.go create mode 100644 vendor/github.com/fyne-io/gl-js/types_opengles.go create mode 100644 vendor/github.com/fyne-io/gl-js/types_webgl_wasm.go create mode 100644 vendor/github.com/fyne-io/glfw-js/.gitignore create mode 100644 vendor/github.com/fyne-io/glfw-js/LICENSE create mode 100644 vendor/github.com/fyne-io/glfw-js/README.md create mode 100644 vendor/github.com/fyne-io/glfw-js/browser_wasm.go create mode 100644 vendor/github.com/fyne-io/glfw-js/clipboard_glfw.go create mode 100644 vendor/github.com/fyne-io/glfw-js/clipboard_wasm.go create mode 100644 vendor/github.com/fyne-io/glfw-js/context_webgl_wasm.go create mode 100644 vendor/github.com/fyne-io/glfw-js/desktop.go create mode 100644 vendor/github.com/fyne-io/glfw-js/glfw.go create mode 100644 vendor/github.com/fyne-io/glfw-js/hint_glfw.go create mode 100644 vendor/github.com/fyne-io/glfw-js/hint_wasm.go create mode 100644 vendor/github.com/fyne-io/image/LICENSE create mode 100644 vendor/github.com/fyne-io/image/ico/LICENSE-reader create mode 100644 vendor/github.com/fyne-io/image/ico/LICENSE-writer create mode 100644 vendor/github.com/fyne-io/image/ico/reader.go create mode 100644 vendor/github.com/fyne-io/image/ico/writer.go create mode 100644 vendor/github.com/fyne-io/oksvg/.gitignore create mode 100644 vendor/github.com/fyne-io/oksvg/LICENSE create mode 100644 vendor/github.com/fyne-io/oksvg/README.md create mode 100644 vendor/github.com/fyne-io/oksvg/definitions.go create mode 100644 vendor/github.com/fyne-io/oksvg/draw.go create mode 100644 vendor/github.com/fyne-io/oksvg/icon_cursor.go create mode 100644 vendor/github.com/fyne-io/oksvg/path_cursor.go create mode 100644 vendor/github.com/fyne-io/oksvg/path_style.go create mode 100644 vendor/github.com/fyne-io/oksvg/public.go create mode 100644 vendor/github.com/fyne-io/oksvg/svg_icon.go create mode 100644 vendor/github.com/fyne-io/oksvg/svg_path.go create mode 100644 vendor/github.com/fyne-io/oksvg/utils.go create mode 100644 vendor/github.com/go-gl/gl/LICENSE create mode 100644 vendor/github.com/go-gl/gl/v2.1/gl/KHR/dummy.go create mode 100644 vendor/github.com/go-gl/gl/v2.1/gl/KHR/khrplatform.h create mode 100644 vendor/github.com/go-gl/gl/v2.1/gl/build_cgo_hack.go create mode 100644 vendor/github.com/go-gl/gl/v2.1/gl/conversions.go create mode 100644 vendor/github.com/go-gl/gl/v2.1/gl/debug.go create mode 100644 vendor/github.com/go-gl/gl/v2.1/gl/package.go create mode 100644 vendor/github.com/go-gl/gl/v2.1/gl/procaddr.go create mode 100644 vendor/github.com/go-gl/gl/v3.1/gles2/KHR/dummy.go create mode 100644 vendor/github.com/go-gl/gl/v3.1/gles2/KHR/khrplatform.h create mode 100644 vendor/github.com/go-gl/gl/v3.1/gles2/build_cgo_hack.go create mode 100644 vendor/github.com/go-gl/gl/v3.1/gles2/conversions.go create mode 100644 vendor/github.com/go-gl/gl/v3.1/gles2/debug.go create mode 100644 vendor/github.com/go-gl/gl/v3.1/gles2/package.go create mode 100644 vendor/github.com/go-gl/gl/v3.1/gles2/procaddr.go create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/GLFW_C_REVISION.txt create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/LICENSE create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/build.go create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/build_cgo_hack.go create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/c_glfw.go create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/c_glfw_bsd.go create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/c_glfw_darwin.go create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/c_glfw_lin.go create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/c_glfw_windows.go create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/context.go create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/error.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/error.go create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw.go create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/LICENSE.md create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/deps/dummy.go create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/deps/getopt.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/deps/getopt.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/deps/glad/dummy.go create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/deps/glad/gl.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/deps/glad/khrplatform.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/deps/glad/vk_platform.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/deps/glad/vulkan.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/deps/glad_gl.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/deps/glad_vulkan.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/deps/linmath.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/deps/mingw/_mingw_dxhelper.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/deps/mingw/dinput.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/deps/mingw/dummy.go create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/deps/mingw/xinput.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/deps/nuklear.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/deps/nuklear_glfw_gl2.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/deps/stb_image_write.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/deps/tinycthread.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/deps/tinycthread.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/deps/vs2008/dummy.go create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/deps/vs2008/stdint.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/include/GLFW/dummy.go create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/include/GLFW/glfw3.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/include/GLFW/glfw3native.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/cocoa_init.m create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/cocoa_joystick.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/cocoa_joystick.m create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/cocoa_monitor.m create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/cocoa_platform.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/cocoa_time.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/cocoa_window.m create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/context.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/dummy.go create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/egl_context.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/egl_context.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/glx_context.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/glx_context.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/init.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/input.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/internal.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/linux_joystick.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/linux_joystick.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/mappings.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/monitor.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/nsgl_context.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/nsgl_context.m create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/null_init.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/null_joystick.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/null_joystick.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/null_monitor.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/null_platform.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/null_window.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/osmesa_context.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/osmesa_context.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/posix_thread.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/posix_thread.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/posix_time.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/posix_time.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/vulkan.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/wayland-idle-inhibit-unstable-v1-client-protocol.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/wayland-idle-inhibit-unstable-v1-client-protocol.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/wayland-pointer-constraints-unstable-v1-client-protocol.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/wayland-pointer-constraints-unstable-v1-client-protocol.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/wayland-relative-pointer-unstable-v1-client-protocol.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/wayland-relative-pointer-unstable-v1-client-protocol.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/wayland-viewporter-client-protocol.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/wayland-viewporter-client-protocol.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/wayland-xdg-decoration-client-protocol.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/wayland-xdg-decoration-unstable-v1-client-protocol.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/wayland-xdg-shell-client-protocol.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/wayland-xdg-shell-client-protocol.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/wgl_context.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/wgl_context.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/win32_init.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/win32_joystick.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/win32_joystick.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/win32_monitor.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/win32_platform.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/win32_thread.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/win32_time.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/win32_window.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/window.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/wl_init.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/wl_monitor.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/wl_platform.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/wl_window.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/x11_init.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/x11_monitor.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/x11_platform.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/x11_window.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/xkb_unicode.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/src/xkb_unicode.h create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/glfw_tree_rebuild.go create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/input.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/input.go create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/monitor.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/monitor.go create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/native_darwin.go create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/native_linbsd_wayland.go create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/native_linbsd_x11.go create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/native_windows.go create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/time.go create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/util.go create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/vulkan.go create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/window.c create mode 100644 vendor/github.com/go-gl/glfw/v3.3/glfw/window.go create mode 100644 vendor/github.com/go-text/render/.gitignore create mode 100644 vendor/github.com/go-text/render/CODEOWNERS create mode 100644 vendor/github.com/go-text/render/LICENSE create mode 100644 vendor/github.com/go-text/render/README.md create mode 100644 vendor/github.com/go-text/render/bitmap.go create mode 100644 vendor/github.com/go-text/render/render.go create mode 100644 vendor/github.com/go-text/render/svg.go create mode 100644 vendor/github.com/go-text/typesetting/LICENSE create mode 100644 vendor/github.com/go-text/typesetting/di/README.md create mode 100644 vendor/github.com/go-text/typesetting/di/direction.go create mode 100644 vendor/github.com/go-text/typesetting/font/README.md create mode 100644 vendor/github.com/go-text/typesetting/font/aat_layout_kern_kerx.go create mode 100644 vendor/github.com/go-text/typesetting/font/aat_layout_morx.go create mode 100644 vendor/github.com/go-text/typesetting/font/bitmaps.go create mode 100644 vendor/github.com/go-text/typesetting/font/cache.go create mode 100644 vendor/github.com/go-text/typesetting/font/cff/cff2.go create mode 100644 vendor/github.com/go-text/typesetting/font/cff/cff_gen.go create mode 100644 vendor/github.com/go-text/typesetting/font/cff/cff_src.go create mode 100644 vendor/github.com/go-text/typesetting/font/cff/charsets.go create mode 100644 vendor/github.com/go-text/typesetting/font/cff/charstring.go create mode 100644 vendor/github.com/go-text/typesetting/font/cff/interpreter/charstrings.go create mode 100644 vendor/github.com/go-text/typesetting/font/cff/interpreter/interpreter.go create mode 100644 vendor/github.com/go-text/typesetting/font/cff/parser.go create mode 100644 vendor/github.com/go-text/typesetting/font/cmap.go create mode 100644 vendor/github.com/go-text/typesetting/font/cmap_arabic_pua_table.go create mode 100644 vendor/github.com/go-text/typesetting/font/font.go create mode 100644 vendor/github.com/go-text/typesetting/font/glyphs.go create mode 100644 vendor/github.com/go-text/typesetting/font/metadata.go create mode 100644 vendor/github.com/go-text/typesetting/font/metrics.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/opentype.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/reader.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/reader_otf.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/reader_woff.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/aat_ankr_gen.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/aat_ankr_src.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/aat_common.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/aat_feat_gen.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/aat_feat_src.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/aat_kerx_gen.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/aat_kerx_src.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/aat_ltag_gen.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/aat_ltag_src.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/aat_mortx_gen.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/aat_mortx_src.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/aat_properties.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/aat_trak_gen.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/aat_trak_src.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/cmap_gen.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/cmap_src.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/glyphs.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/glyphs_bitmap_gen.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/glyphs_bitmap_src.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/glyphs_glyf_gen.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/glyphs_glyf_src.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/glyphs_misc_gen.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/glyphs_misc_src.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/glyphs_sbix_gen.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/glyphs_sbix_src.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/head_gen.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/head_src.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/hhea_vhea_gen.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/hhea_vhea_src.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/hmtx_vmtx_gen.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/hmtx_vmtx_src.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/kern.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/kern_gen.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/kern_src.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/maxp_gen.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/maxp_src.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/name_gen.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/name_src.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/os2_gen.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/os2_src.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/ot_gdef_gen.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/ot_gdef_src.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/ot_gpos_gen.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/ot_gpos_src.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/ot_gsub_gen.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/ot_gsub_src.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/ot_layout.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/ot_layout_gen.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/ot_layout_src.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/ot_properties.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/post_gen.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/post_src.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/tables.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/xvar_gen.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/tables/xvar_src.go create mode 100644 vendor/github.com/go-text/typesetting/font/opentype/writer.go create mode 100644 vendor/github.com/go-text/typesetting/font/os2.go create mode 100644 vendor/github.com/go-text/typesetting/font/ot_layout.go create mode 100644 vendor/github.com/go-text/typesetting/font/post.go create mode 100644 vendor/github.com/go-text/typesetting/font/renderer.go create mode 100644 vendor/github.com/go-text/typesetting/font/svg.go create mode 100644 vendor/github.com/go-text/typesetting/font/variations.go create mode 100644 vendor/github.com/go-text/typesetting/fontscan/fontconfig.go create mode 100644 vendor/github.com/go-text/typesetting/fontscan/fontmap.go create mode 100644 vendor/github.com/go-text/typesetting/fontscan/footprint.go create mode 100644 vendor/github.com/go-text/typesetting/fontscan/langset.go create mode 100644 vendor/github.com/go-text/typesetting/fontscan/langset_gen.go create mode 100644 vendor/github.com/go-text/typesetting/fontscan/lru.go create mode 100644 vendor/github.com/go-text/typesetting/fontscan/match.go create mode 100644 vendor/github.com/go-text/typesetting/fontscan/readme.md create mode 100644 vendor/github.com/go-text/typesetting/fontscan/rune_coverage.go create mode 100644 vendor/github.com/go-text/typesetting/fontscan/scan.go create mode 100644 vendor/github.com/go-text/typesetting/fontscan/scandir.go create mode 100644 vendor/github.com/go-text/typesetting/fontscan/serialize.go create mode 100644 vendor/github.com/go-text/typesetting/fontscan/substitutions.go create mode 100644 vendor/github.com/go-text/typesetting/fontscan/substitutions_table.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/LICENSE create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/buffer.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/fonts.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/glyph.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/harfbuzz.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_aat_layout.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_aat_map.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_arabic.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_arabic_pua_table.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_arabic_table.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_arabic_win1256.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_hangul.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_hebrew.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_indic.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_indic_machine.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_indic_machine.rl create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_indic_table.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_kern.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_khmer.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_khmer_machine.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_khmer_machine.rl create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_language.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_language_table.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_layout.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_layout_gpos.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_layout_gsub.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_layout_gsubgpos.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_map.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_myanmar.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_myanmar_machine.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_myanmar_machine.rl create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_shape_complex.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_shape_fallback.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_shape_normalize.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_shaper.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_tag.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_thai.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_use.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_use_machine.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_use_machine.rl create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_use_machine_defs.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_use_table.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/ot_vowels_constraints.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/set_digest.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/shape.go create mode 100644 vendor/github.com/go-text/typesetting/harfbuzz/unicode.go create mode 100644 vendor/github.com/go-text/typesetting/language/language.go create mode 100644 vendor/github.com/go-text/typesetting/language/scripts.go create mode 100644 vendor/github.com/go-text/typesetting/language/scripts_table.go create mode 100644 vendor/github.com/go-text/typesetting/segmenter/segmenter.go create mode 100644 vendor/github.com/go-text/typesetting/segmenter/unicode14_rules.go create mode 100644 vendor/github.com/go-text/typesetting/segmenter/unicode29_rules.go create mode 100644 vendor/github.com/go-text/typesetting/shaping/README.md create mode 100644 vendor/github.com/go-text/typesetting/shaping/input.go create mode 100644 vendor/github.com/go-text/typesetting/shaping/lru.go create mode 100644 vendor/github.com/go-text/typesetting/shaping/output.go create mode 100644 vendor/github.com/go-text/typesetting/shaping/paired_delims_table.go create mode 100644 vendor/github.com/go-text/typesetting/shaping/shaping.go create mode 100644 vendor/github.com/go-text/typesetting/shaping/spacing.go create mode 100644 vendor/github.com/go-text/typesetting/shaping/wrapping.go create mode 100644 vendor/github.com/go-text/typesetting/unicodedata/combining_classes.go create mode 100644 vendor/github.com/go-text/typesetting/unicodedata/decomposition.go create mode 100644 vendor/github.com/go-text/typesetting/unicodedata/east_asian_width.go create mode 100644 vendor/github.com/go-text/typesetting/unicodedata/emojis.go create mode 100644 vendor/github.com/go-text/typesetting/unicodedata/general_category.go create mode 100644 vendor/github.com/go-text/typesetting/unicodedata/grapheme_break.go create mode 100644 vendor/github.com/go-text/typesetting/unicodedata/indic.go create mode 100644 vendor/github.com/go-text/typesetting/unicodedata/linebreak.go create mode 100644 vendor/github.com/go-text/typesetting/unicodedata/mirroring.go create mode 100644 vendor/github.com/go-text/typesetting/unicodedata/sentence_break.go create mode 100644 vendor/github.com/go-text/typesetting/unicodedata/unicode.go create mode 100644 vendor/github.com/go-text/typesetting/unicodedata/vertical_orientation.go create mode 100644 vendor/github.com/go-text/typesetting/unicodedata/word_break.go create mode 100644 vendor/github.com/godbus/dbus/v5/CONTRIBUTING.md create mode 100644 vendor/github.com/godbus/dbus/v5/LICENSE create mode 100644 vendor/github.com/godbus/dbus/v5/MAINTAINERS create mode 100644 vendor/github.com/godbus/dbus/v5/README.md create mode 100644 vendor/github.com/godbus/dbus/v5/auth.go create mode 100644 vendor/github.com/godbus/dbus/v5/auth_anonymous.go create mode 100644 vendor/github.com/godbus/dbus/v5/auth_external.go create mode 100644 vendor/github.com/godbus/dbus/v5/auth_sha1.go create mode 100644 vendor/github.com/godbus/dbus/v5/call.go create mode 100644 vendor/github.com/godbus/dbus/v5/conn.go create mode 100644 vendor/github.com/godbus/dbus/v5/conn_darwin.go create mode 100644 vendor/github.com/godbus/dbus/v5/conn_other.go create mode 100644 vendor/github.com/godbus/dbus/v5/conn_unix.go create mode 100644 vendor/github.com/godbus/dbus/v5/conn_windows.go create mode 100644 vendor/github.com/godbus/dbus/v5/dbus.go create mode 100644 vendor/github.com/godbus/dbus/v5/decoder.go create mode 100644 vendor/github.com/godbus/dbus/v5/default_handler.go create mode 100644 vendor/github.com/godbus/dbus/v5/doc.go create mode 100644 vendor/github.com/godbus/dbus/v5/encoder.go create mode 100644 vendor/github.com/godbus/dbus/v5/escape.go create mode 100644 vendor/github.com/godbus/dbus/v5/export.go create mode 100644 vendor/github.com/godbus/dbus/v5/homedir.go create mode 100644 vendor/github.com/godbus/dbus/v5/introspect/call.go create mode 100644 vendor/github.com/godbus/dbus/v5/introspect/introspect.go create mode 100644 vendor/github.com/godbus/dbus/v5/introspect/introspectable.go create mode 100644 vendor/github.com/godbus/dbus/v5/match.go create mode 100644 vendor/github.com/godbus/dbus/v5/message.go create mode 100644 vendor/github.com/godbus/dbus/v5/object.go create mode 100644 vendor/github.com/godbus/dbus/v5/prop/prop.go create mode 100644 vendor/github.com/godbus/dbus/v5/sequence.go create mode 100644 vendor/github.com/godbus/dbus/v5/sequential_handler.go create mode 100644 vendor/github.com/godbus/dbus/v5/server_interfaces.go create mode 100644 vendor/github.com/godbus/dbus/v5/sig.go create mode 100644 vendor/github.com/godbus/dbus/v5/transport_darwin.go create mode 100644 vendor/github.com/godbus/dbus/v5/transport_generic.go create mode 100644 vendor/github.com/godbus/dbus/v5/transport_nonce_tcp.go create mode 100644 vendor/github.com/godbus/dbus/v5/transport_tcp.go create mode 100644 vendor/github.com/godbus/dbus/v5/transport_unix.go create mode 100644 vendor/github.com/godbus/dbus/v5/transport_unixcred_dragonfly.go create mode 100644 vendor/github.com/godbus/dbus/v5/transport_unixcred_freebsd.go create mode 100644 vendor/github.com/godbus/dbus/v5/transport_unixcred_linux.go create mode 100644 vendor/github.com/godbus/dbus/v5/transport_unixcred_netbsd.go create mode 100644 vendor/github.com/godbus/dbus/v5/transport_unixcred_openbsd.go create mode 100644 vendor/github.com/godbus/dbus/v5/transport_zos.go create mode 100644 vendor/github.com/godbus/dbus/v5/variant.go create mode 100644 vendor/github.com/godbus/dbus/v5/variant_lexer.go create mode 100644 vendor/github.com/godbus/dbus/v5/variant_parser.go create mode 100644 vendor/github.com/hack-pad/go-indexeddb/LICENSE create mode 100644 vendor/github.com/hack-pad/go-indexeddb/idb/base_object_store.go create mode 100644 vendor/github.com/hack-pad/go-indexeddb/idb/cursor.go create mode 100644 vendor/github.com/hack-pad/go-indexeddb/idb/db.go create mode 100644 vendor/github.com/hack-pad/go-indexeddb/idb/db_factory.go create mode 100644 vendor/github.com/hack-pad/go-indexeddb/idb/doc.go create mode 100644 vendor/github.com/hack-pad/go-indexeddb/idb/dom_exception.go create mode 100644 vendor/github.com/hack-pad/go-indexeddb/idb/events.go create mode 100644 vendor/github.com/hack-pad/go-indexeddb/idb/index.go create mode 100644 vendor/github.com/hack-pad/go-indexeddb/idb/internal/jscache/cacher.go create mode 100644 vendor/github.com/hack-pad/go-indexeddb/idb/internal/jscache/strings.go create mode 100644 vendor/github.com/hack-pad/go-indexeddb/idb/key_range.go create mode 100644 vendor/github.com/hack-pad/go-indexeddb/idb/object_store.go create mode 100644 vendor/github.com/hack-pad/go-indexeddb/idb/open_db_request.go create mode 100644 vendor/github.com/hack-pad/go-indexeddb/idb/request.go create mode 100644 vendor/github.com/hack-pad/go-indexeddb/idb/strings.go create mode 100644 vendor/github.com/hack-pad/go-indexeddb/idb/transaction.go create mode 100644 vendor/github.com/hack-pad/safejs/.env create mode 100644 vendor/github.com/hack-pad/safejs/.gitignore create mode 100644 vendor/github.com/hack-pad/safejs/.golangci.yml create mode 100644 vendor/github.com/hack-pad/safejs/LICENSE create mode 100644 vendor/github.com/hack-pad/safejs/Makefile create mode 100644 vendor/github.com/hack-pad/safejs/README.md create mode 100644 vendor/github.com/hack-pad/safejs/bytes.go create mode 100644 vendor/github.com/hack-pad/safejs/doc.go create mode 100644 vendor/github.com/hack-pad/safejs/error.go create mode 100644 vendor/github.com/hack-pad/safejs/func.go create mode 100644 vendor/github.com/hack-pad/safejs/global.go create mode 100644 vendor/github.com/hack-pad/safejs/internal/catch/catch.go create mode 100644 vendor/github.com/hack-pad/safejs/internal/stackerr/stackerr.go create mode 100644 vendor/github.com/hack-pad/safejs/type.go create mode 100644 vendor/github.com/hack-pad/safejs/value.go create mode 100644 vendor/github.com/jeandeaual/go-locale/.gitattributes create mode 100644 vendor/github.com/jeandeaual/go-locale/.gitignore create mode 100644 vendor/github.com/jeandeaual/go-locale/.golangci.yml create mode 100644 vendor/github.com/jeandeaual/go-locale/LICENSE create mode 100644 vendor/github.com/jeandeaual/go-locale/README.md create mode 100644 vendor/github.com/jeandeaual/go-locale/locale_android.c create mode 100644 vendor/github.com/jeandeaual/go-locale/locale_android.go create mode 100644 vendor/github.com/jeandeaual/go-locale/locale_darwin.go create mode 100644 vendor/github.com/jeandeaual/go-locale/locale_darwin.m create mode 100644 vendor/github.com/jeandeaual/go-locale/locale_darwin_cgo.go create mode 100644 vendor/github.com/jeandeaual/go-locale/locale_darwin_nocgo.go create mode 100644 vendor/github.com/jeandeaual/go-locale/locale_ios.go create mode 100644 vendor/github.com/jeandeaual/go-locale/locale_ios.m create mode 100644 vendor/github.com/jeandeaual/go-locale/locale_js.go create mode 100644 vendor/github.com/jeandeaual/go-locale/locale_unix.go create mode 100644 vendor/github.com/jeandeaual/go-locale/locale_windows.go create mode 100644 vendor/github.com/jeandeaual/go-locale/util.go create mode 100644 vendor/github.com/jsummers/gobmp/.gitignore create mode 100644 vendor/github.com/jsummers/gobmp/COPYING.txt create mode 100644 vendor/github.com/jsummers/gobmp/reader.go create mode 100644 vendor/github.com/jsummers/gobmp/readme.md create mode 100644 vendor/github.com/jsummers/gobmp/rle.go create mode 100644 vendor/github.com/jsummers/gobmp/writer.go create mode 100644 vendor/github.com/nfnt/resize/.travis.yml create mode 100644 vendor/github.com/nfnt/resize/LICENSE create mode 100644 vendor/github.com/nfnt/resize/README.md create mode 100644 vendor/github.com/nfnt/resize/converter.go create mode 100644 vendor/github.com/nfnt/resize/filters.go create mode 100644 vendor/github.com/nfnt/resize/nearest.go create mode 100644 vendor/github.com/nfnt/resize/resize.go create mode 100644 vendor/github.com/nfnt/resize/thumbnail.go create mode 100644 vendor/github.com/nfnt/resize/ycc.go create mode 100644 vendor/github.com/nicksnyder/go-i18n/v2/LICENSE create mode 100644 vendor/github.com/nicksnyder/go-i18n/v2/i18n/bundle.go create mode 100644 vendor/github.com/nicksnyder/go-i18n/v2/i18n/bundlefs.go create mode 100644 vendor/github.com/nicksnyder/go-i18n/v2/i18n/doc.go create mode 100644 vendor/github.com/nicksnyder/go-i18n/v2/i18n/localizer.go create mode 100644 vendor/github.com/nicksnyder/go-i18n/v2/i18n/message.go create mode 100644 vendor/github.com/nicksnyder/go-i18n/v2/i18n/message_template.go create mode 100644 vendor/github.com/nicksnyder/go-i18n/v2/i18n/parse.go create mode 100644 vendor/github.com/nicksnyder/go-i18n/v2/i18n/template/identity_parser.go create mode 100644 vendor/github.com/nicksnyder/go-i18n/v2/i18n/template/parser.go create mode 100644 vendor/github.com/nicksnyder/go-i18n/v2/i18n/template/text_parser.go create mode 100644 vendor/github.com/nicksnyder/go-i18n/v2/internal/plural/doc.go create mode 100644 vendor/github.com/nicksnyder/go-i18n/v2/internal/plural/form.go create mode 100644 vendor/github.com/nicksnyder/go-i18n/v2/internal/plural/operands.go create mode 100644 vendor/github.com/nicksnyder/go-i18n/v2/internal/plural/rule.go create mode 100644 vendor/github.com/nicksnyder/go-i18n/v2/internal/plural/rule_gen.go create mode 100644 vendor/github.com/nicksnyder/go-i18n/v2/internal/plural/rules.go create mode 100644 vendor/github.com/nicksnyder/go-i18n/v2/internal/template.go create mode 100644 vendor/github.com/pmezard/go-difflib/LICENSE create mode 100644 vendor/github.com/pmezard/go-difflib/difflib/difflib.go create mode 100644 vendor/github.com/rymdport/portal/.gitignore create mode 100644 vendor/github.com/rymdport/portal/CHANGELOG.md create mode 100644 vendor/github.com/rymdport/portal/CODE_OF_CONDUCT.md create mode 100644 vendor/github.com/rymdport/portal/CONTRIBUTING.md create mode 100644 vendor/github.com/rymdport/portal/LICENSE create mode 100644 vendor/github.com/rymdport/portal/README.md create mode 100644 vendor/github.com/rymdport/portal/SECURITY.md create mode 100644 vendor/github.com/rymdport/portal/filechooser/choices.go create mode 100644 vendor/github.com/rymdport/portal/filechooser/filechooser.go create mode 100644 vendor/github.com/rymdport/portal/filechooser/filters.go create mode 100644 vendor/github.com/rymdport/portal/filechooser/open.go create mode 100644 vendor/github.com/rymdport/portal/filechooser/save.go create mode 100644 vendor/github.com/rymdport/portal/internal/apis/apis.go create mode 100644 vendor/github.com/rymdport/portal/internal/apis/call.go create mode 100644 vendor/github.com/rymdport/portal/internal/apis/changed.go create mode 100644 vendor/github.com/rymdport/portal/internal/apis/properties.go create mode 100644 vendor/github.com/rymdport/portal/internal/convert/basic.go create mode 100644 vendor/github.com/rymdport/portal/internal/convert/convert.go create mode 100644 vendor/github.com/rymdport/portal/internal/convert/nullstr.go create mode 100644 vendor/github.com/rymdport/portal/internal/request/request.go create mode 100644 vendor/github.com/rymdport/portal/notification/notification.go create mode 100644 vendor/github.com/rymdport/portal/openuri/opendir.go create mode 100644 vendor/github.com/rymdport/portal/openuri/openfile.go create mode 100644 vendor/github.com/rymdport/portal/openuri/openuri.go create mode 100644 vendor/github.com/rymdport/portal/portal.go create mode 100644 vendor/github.com/rymdport/portal/settings/appearance/appearance.go create mode 100644 vendor/github.com/rymdport/portal/settings/appearance/color.go create mode 100644 vendor/github.com/rymdport/portal/settings/appearance/contrast.go create mode 100644 vendor/github.com/rymdport/portal/settings/changed.go create mode 100644 vendor/github.com/rymdport/portal/settings/read.go create mode 100644 vendor/github.com/rymdport/portal/settings/settings.go create mode 100644 vendor/github.com/skip2/go-qrcode/.gitignore create mode 100644 vendor/github.com/skip2/go-qrcode/.travis.yml create mode 100644 vendor/github.com/skip2/go-qrcode/LICENSE create mode 100644 vendor/github.com/skip2/go-qrcode/README.md create mode 100644 vendor/github.com/skip2/go-qrcode/bitset/bitset.go create mode 100644 vendor/github.com/skip2/go-qrcode/encoder.go create mode 100644 vendor/github.com/skip2/go-qrcode/qrcode.go create mode 100644 vendor/github.com/skip2/go-qrcode/reedsolomon/gf2_8.go create mode 100644 vendor/github.com/skip2/go-qrcode/reedsolomon/gf_poly.go create mode 100644 vendor/github.com/skip2/go-qrcode/reedsolomon/reed_solomon.go create mode 100644 vendor/github.com/skip2/go-qrcode/regular_symbol.go create mode 100644 vendor/github.com/skip2/go-qrcode/symbol.go create mode 100644 vendor/github.com/skip2/go-qrcode/version.go create mode 100644 vendor/github.com/srwiley/oksvg/.gitignore create mode 100644 vendor/github.com/srwiley/oksvg/LICENSE create mode 100644 vendor/github.com/srwiley/oksvg/README.md create mode 100644 vendor/github.com/srwiley/oksvg/definitions.go create mode 100644 vendor/github.com/srwiley/oksvg/draw.go create mode 100644 vendor/github.com/srwiley/oksvg/icon_cursor.go create mode 100644 vendor/github.com/srwiley/oksvg/path_cursor.go create mode 100644 vendor/github.com/srwiley/oksvg/path_style.go create mode 100644 vendor/github.com/srwiley/oksvg/public.go create mode 100644 vendor/github.com/srwiley/oksvg/svg_icon.go create mode 100644 vendor/github.com/srwiley/oksvg/svg_path.go create mode 100644 vendor/github.com/srwiley/oksvg/utils.go create mode 100644 vendor/github.com/srwiley/rasterx/LICENSE create mode 100644 vendor/github.com/srwiley/rasterx/README.md create mode 100644 vendor/github.com/srwiley/rasterx/dash.go create mode 100644 vendor/github.com/srwiley/rasterx/fill.go create mode 100644 vendor/github.com/srwiley/rasterx/geomx.go create mode 100644 vendor/github.com/srwiley/rasterx/gradient.go create mode 100644 vendor/github.com/srwiley/rasterx/matrix.go create mode 100644 vendor/github.com/srwiley/rasterx/scan.go create mode 100644 vendor/github.com/srwiley/rasterx/shapes.go create mode 100644 vendor/github.com/srwiley/rasterx/stroke.go create mode 100644 vendor/github.com/stretchr/testify/LICENSE create mode 100644 vendor/github.com/stretchr/testify/assert/assertion_compare.go create mode 100644 vendor/github.com/stretchr/testify/assert/assertion_format.go create mode 100644 vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl create mode 100644 vendor/github.com/stretchr/testify/assert/assertion_forward.go create mode 100644 vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl create mode 100644 vendor/github.com/stretchr/testify/assert/assertion_order.go create mode 100644 vendor/github.com/stretchr/testify/assert/assertions.go create mode 100644 vendor/github.com/stretchr/testify/assert/doc.go create mode 100644 vendor/github.com/stretchr/testify/assert/errors.go create mode 100644 vendor/github.com/stretchr/testify/assert/forward_assertions.go create mode 100644 vendor/github.com/stretchr/testify/assert/http_assertions.go create mode 100644 vendor/github.com/stretchr/testify/assert/yaml/yaml_custom.go create mode 100644 vendor/github.com/stretchr/testify/assert/yaml/yaml_default.go create mode 100644 vendor/github.com/stretchr/testify/assert/yaml/yaml_fail.go create mode 100644 vendor/github.com/stretchr/testify/require/doc.go create mode 100644 vendor/github.com/stretchr/testify/require/forward_requirements.go create mode 100644 vendor/github.com/stretchr/testify/require/require.go create mode 100644 vendor/github.com/stretchr/testify/require/require.go.tmpl create mode 100644 vendor/github.com/stretchr/testify/require/require_forward.go create mode 100644 vendor/github.com/stretchr/testify/require/require_forward.go.tmpl create mode 100644 vendor/github.com/stretchr/testify/require/requirements.go create mode 100644 vendor/github.com/yuin/goldmark/.gitignore create mode 100644 vendor/github.com/yuin/goldmark/.golangci.yml create mode 100644 vendor/github.com/yuin/goldmark/LICENSE create mode 100644 vendor/github.com/yuin/goldmark/Makefile create mode 100644 vendor/github.com/yuin/goldmark/README.md create mode 100644 vendor/github.com/yuin/goldmark/ast/ast.go create mode 100644 vendor/github.com/yuin/goldmark/ast/block.go create mode 100644 vendor/github.com/yuin/goldmark/ast/inline.go create mode 100644 vendor/github.com/yuin/goldmark/markdown.go create mode 100644 vendor/github.com/yuin/goldmark/parser/attribute.go create mode 100644 vendor/github.com/yuin/goldmark/parser/atx_heading.go create mode 100644 vendor/github.com/yuin/goldmark/parser/auto_link.go create mode 100644 vendor/github.com/yuin/goldmark/parser/blockquote.go create mode 100644 vendor/github.com/yuin/goldmark/parser/code_block.go create mode 100644 vendor/github.com/yuin/goldmark/parser/code_span.go create mode 100644 vendor/github.com/yuin/goldmark/parser/delimiter.go create mode 100644 vendor/github.com/yuin/goldmark/parser/emphasis.go create mode 100644 vendor/github.com/yuin/goldmark/parser/fcode_block.go create mode 100644 vendor/github.com/yuin/goldmark/parser/html_block.go create mode 100644 vendor/github.com/yuin/goldmark/parser/link.go create mode 100644 vendor/github.com/yuin/goldmark/parser/link_ref.go create mode 100644 vendor/github.com/yuin/goldmark/parser/list.go create mode 100644 vendor/github.com/yuin/goldmark/parser/list_item.go create mode 100644 vendor/github.com/yuin/goldmark/parser/paragraph.go create mode 100644 vendor/github.com/yuin/goldmark/parser/parser.go create mode 100644 vendor/github.com/yuin/goldmark/parser/raw_html.go create mode 100644 vendor/github.com/yuin/goldmark/parser/setext_headings.go create mode 100644 vendor/github.com/yuin/goldmark/parser/thematic_break.go create mode 100644 vendor/github.com/yuin/goldmark/renderer/html/html.go create mode 100644 vendor/github.com/yuin/goldmark/renderer/renderer.go create mode 100644 vendor/github.com/yuin/goldmark/text/package.go create mode 100644 vendor/github.com/yuin/goldmark/text/reader.go create mode 100644 vendor/github.com/yuin/goldmark/text/segment.go create mode 100644 vendor/github.com/yuin/goldmark/util/html5entities.go create mode 100644 vendor/github.com/yuin/goldmark/util/unicode_case_folding.go create mode 100644 vendor/github.com/yuin/goldmark/util/util.go create mode 100644 vendor/github.com/yuin/goldmark/util/util_cjk.go create mode 100644 vendor/github.com/yuin/goldmark/util/util_safe.go create mode 100644 vendor/github.com/yuin/goldmark/util/util_unsafe_go120.go create mode 100644 vendor/github.com/yuin/goldmark/util/util_unsafe_go121.go create mode 100644 vendor/golang.org/x/image/LICENSE create mode 100644 vendor/golang.org/x/image/PATENTS create mode 100644 vendor/golang.org/x/image/ccitt/reader.go create mode 100644 vendor/golang.org/x/image/ccitt/table.go create mode 100644 vendor/golang.org/x/image/ccitt/writer.go create mode 100644 vendor/golang.org/x/image/colornames/colornames.go create mode 100644 vendor/golang.org/x/image/colornames/table.go create mode 100644 vendor/golang.org/x/image/draw/draw.go create mode 100644 vendor/golang.org/x/image/draw/impl.go create mode 100644 vendor/golang.org/x/image/draw/scale.go create mode 100644 vendor/golang.org/x/image/math/f64/f64.go create mode 100644 vendor/golang.org/x/image/math/fixed/fixed.go create mode 100644 vendor/golang.org/x/image/tiff/buffer.go create mode 100644 vendor/golang.org/x/image/tiff/compress.go create mode 100644 vendor/golang.org/x/image/tiff/consts.go create mode 100644 vendor/golang.org/x/image/tiff/fuzz.go create mode 100644 vendor/golang.org/x/image/tiff/lzw/reader.go create mode 100644 vendor/golang.org/x/image/tiff/reader.go create mode 100644 vendor/golang.org/x/image/tiff/writer.go create mode 100644 vendor/golang.org/x/image/vector/acc_amd64.go create mode 100644 vendor/golang.org/x/image/vector/acc_amd64.s create mode 100644 vendor/golang.org/x/image/vector/acc_other.go create mode 100644 vendor/golang.org/x/image/vector/gen_acc_amd64.s.tmpl create mode 100644 vendor/golang.org/x/image/vector/raster_fixed.go create mode 100644 vendor/golang.org/x/image/vector/raster_floating.go create mode 100644 vendor/golang.org/x/image/vector/vector.go create mode 100644 vendor/golang.org/x/net/LICENSE create mode 100644 vendor/golang.org/x/net/PATENTS create mode 100644 vendor/golang.org/x/net/html/atom/atom.go create mode 100644 vendor/golang.org/x/net/html/atom/table.go create mode 100644 vendor/golang.org/x/net/html/charset/charset.go create mode 100644 vendor/golang.org/x/net/html/const.go create mode 100644 vendor/golang.org/x/net/html/doc.go create mode 100644 vendor/golang.org/x/net/html/doctype.go create mode 100644 vendor/golang.org/x/net/html/entity.go create mode 100644 vendor/golang.org/x/net/html/escape.go create mode 100644 vendor/golang.org/x/net/html/foreign.go create mode 100644 vendor/golang.org/x/net/html/iter.go create mode 100644 vendor/golang.org/x/net/html/node.go create mode 100644 vendor/golang.org/x/net/html/parse.go create mode 100644 vendor/golang.org/x/net/html/render.go create mode 100644 vendor/golang.org/x/net/html/token.go create mode 100644 vendor/golang.org/x/sys/LICENSE create mode 100644 vendor/golang.org/x/sys/PATENTS create mode 100644 vendor/golang.org/x/sys/unix/.gitignore create mode 100644 vendor/golang.org/x/sys/unix/README.md create mode 100644 vendor/golang.org/x/sys/unix/affinity_linux.go create mode 100644 vendor/golang.org/x/sys/unix/aliases.go create mode 100644 vendor/golang.org/x/sys/unix/asm_aix_ppc64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_386.s create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_amd64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_arm.s create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_arm64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_ppc64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_riscv64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_386.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_amd64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_arm.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_arm64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_loong64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_mips64x.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_mipsx.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_riscv64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_s390x.s create mode 100644 vendor/golang.org/x/sys/unix/asm_openbsd_mips64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_solaris_amd64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_zos_s390x.s create mode 100644 vendor/golang.org/x/sys/unix/auxv.go create mode 100644 vendor/golang.org/x/sys/unix/auxv_unsupported.go create mode 100644 vendor/golang.org/x/sys/unix/bluetooth_linux.go create mode 100644 vendor/golang.org/x/sys/unix/bpxsvc_zos.go create mode 100644 vendor/golang.org/x/sys/unix/bpxsvc_zos.s create mode 100644 vendor/golang.org/x/sys/unix/cap_freebsd.go create mode 100644 vendor/golang.org/x/sys/unix/constants.go create mode 100644 vendor/golang.org/x/sys/unix/dev_aix_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/dev_aix_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/dev_darwin.go create mode 100644 vendor/golang.org/x/sys/unix/dev_dragonfly.go create mode 100644 vendor/golang.org/x/sys/unix/dev_freebsd.go create mode 100644 vendor/golang.org/x/sys/unix/dev_linux.go create mode 100644 vendor/golang.org/x/sys/unix/dev_netbsd.go create mode 100644 vendor/golang.org/x/sys/unix/dev_openbsd.go create mode 100644 vendor/golang.org/x/sys/unix/dev_zos.go create mode 100644 vendor/golang.org/x/sys/unix/dirent.go create mode 100644 vendor/golang.org/x/sys/unix/endian_big.go create mode 100644 vendor/golang.org/x/sys/unix/endian_little.go create mode 100644 vendor/golang.org/x/sys/unix/env_unix.go create mode 100644 vendor/golang.org/x/sys/unix/fcntl.go create mode 100644 vendor/golang.org/x/sys/unix/fcntl_darwin.go create mode 100644 vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go create mode 100644 vendor/golang.org/x/sys/unix/fdset.go create mode 100644 vendor/golang.org/x/sys/unix/gccgo.go create mode 100644 vendor/golang.org/x/sys/unix/gccgo_c.c create mode 100644 vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ifreq_linux.go create mode 100644 vendor/golang.org/x/sys/unix/ioctl_linux.go create mode 100644 vendor/golang.org/x/sys/unix/ioctl_signed.go create mode 100644 vendor/golang.org/x/sys/unix/ioctl_unsigned.go create mode 100644 vendor/golang.org/x/sys/unix/ioctl_zos.go create mode 100644 vendor/golang.org/x/sys/unix/mkall.sh create mode 100644 vendor/golang.org/x/sys/unix/mkerrors.sh create mode 100644 vendor/golang.org/x/sys/unix/mmap_nomremap.go create mode 100644 vendor/golang.org/x/sys/unix/mremap.go create mode 100644 vendor/golang.org/x/sys/unix/pagesize_unix.go create mode 100644 vendor/golang.org/x/sys/unix/pledge_openbsd.go create mode 100644 vendor/golang.org/x/sys/unix/ptrace_darwin.go create mode 100644 vendor/golang.org/x/sys/unix/ptrace_ios.go create mode 100644 vendor/golang.org/x/sys/unix/race.go create mode 100644 vendor/golang.org/x/sys/unix/race0.go create mode 100644 vendor/golang.org/x/sys/unix/readdirent_getdents.go create mode 100644 vendor/golang.org/x/sys/unix/readdirent_getdirentries.go create mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_dragonfly.go create mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_linux.go create mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_unix.go create mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_unix_other.go create mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_zos.go create mode 100644 vendor/golang.org/x/sys/unix/symaddr_zos_s390x.s create mode 100644 vendor/golang.org/x/sys/unix/syscall.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_aix.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_aix_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_bsd.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_dragonfly.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_hurd.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_hurd_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_illumos.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_alarm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gc.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gc_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gc_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_loong64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_libc.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_solaris.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_unix.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_unix_gc.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_zos_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/sysvshm_linux.go create mode 100644 vendor/golang.org/x/sys/unix/sysvshm_unix.go create mode 100644 vendor/golang.org/x/sys/unix/sysvshm_unix_other.go create mode 100644 vendor/golang.org/x/sys/unix/timestruct.go create mode 100644 vendor/golang.org/x/sys/unix/unveil_openbsd.go create mode 100644 vendor/golang.org/x/sys/unix/vgetrandom_linux.go create mode 100644 vendor/golang.org/x/sys/unix/vgetrandom_unsupported.go create mode 100644 vendor/golang.org/x/sys/unix/xattr_bsd.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_386.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mips.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_zos_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/zptrace_armnn_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zptrace_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zptrace_x86_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zsymaddr_zos_s390x.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_zos_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_386.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_arm.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mips.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_zos_s390x.go create mode 100644 vendor/golang.org/x/sys/windows/aliases.go create mode 100644 vendor/golang.org/x/sys/windows/dll_windows.go create mode 100644 vendor/golang.org/x/sys/windows/env_windows.go create mode 100644 vendor/golang.org/x/sys/windows/eventlog.go create mode 100644 vendor/golang.org/x/sys/windows/exec_windows.go create mode 100644 vendor/golang.org/x/sys/windows/memory_windows.go create mode 100644 vendor/golang.org/x/sys/windows/mkerrors.bash create mode 100644 vendor/golang.org/x/sys/windows/mkknownfolderids.bash create mode 100644 vendor/golang.org/x/sys/windows/mksyscall.go create mode 100644 vendor/golang.org/x/sys/windows/race.go create mode 100644 vendor/golang.org/x/sys/windows/race0.go create mode 100644 vendor/golang.org/x/sys/windows/registry/key.go create mode 100644 vendor/golang.org/x/sys/windows/registry/mksyscall.go create mode 100644 vendor/golang.org/x/sys/windows/registry/syscall.go create mode 100644 vendor/golang.org/x/sys/windows/registry/value.go create mode 100644 vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go create mode 100644 vendor/golang.org/x/sys/windows/security_windows.go create mode 100644 vendor/golang.org/x/sys/windows/service.go create mode 100644 vendor/golang.org/x/sys/windows/setupapi_windows.go create mode 100644 vendor/golang.org/x/sys/windows/str.go create mode 100644 vendor/golang.org/x/sys/windows/syscall.go create mode 100644 vendor/golang.org/x/sys/windows/syscall_windows.go create mode 100644 vendor/golang.org/x/sys/windows/types_windows.go create mode 100644 vendor/golang.org/x/sys/windows/types_windows_386.go create mode 100644 vendor/golang.org/x/sys/windows/types_windows_amd64.go create mode 100644 vendor/golang.org/x/sys/windows/types_windows_arm.go create mode 100644 vendor/golang.org/x/sys/windows/types_windows_arm64.go create mode 100644 vendor/golang.org/x/sys/windows/zerrors_windows.go create mode 100644 vendor/golang.org/x/sys/windows/zknownfolderids_windows.go create mode 100644 vendor/golang.org/x/sys/windows/zsyscall_windows.go create mode 100644 vendor/golang.org/x/text/LICENSE create mode 100644 vendor/golang.org/x/text/PATENTS create mode 100644 vendor/golang.org/x/text/encoding/charmap/charmap.go create mode 100644 vendor/golang.org/x/text/encoding/charmap/tables.go create mode 100644 vendor/golang.org/x/text/encoding/encoding.go create mode 100644 vendor/golang.org/x/text/encoding/htmlindex/htmlindex.go create mode 100644 vendor/golang.org/x/text/encoding/htmlindex/map.go create mode 100644 vendor/golang.org/x/text/encoding/htmlindex/tables.go create mode 100644 vendor/golang.org/x/text/encoding/internal/identifier/identifier.go create mode 100644 vendor/golang.org/x/text/encoding/internal/identifier/mib.go create mode 100644 vendor/golang.org/x/text/encoding/internal/internal.go create mode 100644 vendor/golang.org/x/text/encoding/japanese/all.go create mode 100644 vendor/golang.org/x/text/encoding/japanese/eucjp.go create mode 100644 vendor/golang.org/x/text/encoding/japanese/iso2022jp.go create mode 100644 vendor/golang.org/x/text/encoding/japanese/shiftjis.go create mode 100644 vendor/golang.org/x/text/encoding/japanese/tables.go create mode 100644 vendor/golang.org/x/text/encoding/korean/euckr.go create mode 100644 vendor/golang.org/x/text/encoding/korean/tables.go create mode 100644 vendor/golang.org/x/text/encoding/simplifiedchinese/all.go create mode 100644 vendor/golang.org/x/text/encoding/simplifiedchinese/gbk.go create mode 100644 vendor/golang.org/x/text/encoding/simplifiedchinese/hzgb2312.go create mode 100644 vendor/golang.org/x/text/encoding/simplifiedchinese/tables.go create mode 100644 vendor/golang.org/x/text/encoding/traditionalchinese/big5.go create mode 100644 vendor/golang.org/x/text/encoding/traditionalchinese/tables.go create mode 100644 vendor/golang.org/x/text/encoding/unicode/override.go create mode 100644 vendor/golang.org/x/text/encoding/unicode/unicode.go create mode 100644 vendor/golang.org/x/text/internal/language/common.go create mode 100644 vendor/golang.org/x/text/internal/language/compact.go create mode 100644 vendor/golang.org/x/text/internal/language/compact/compact.go create mode 100644 vendor/golang.org/x/text/internal/language/compact/language.go create mode 100644 vendor/golang.org/x/text/internal/language/compact/parents.go create mode 100644 vendor/golang.org/x/text/internal/language/compact/tables.go create mode 100644 vendor/golang.org/x/text/internal/language/compact/tags.go create mode 100644 vendor/golang.org/x/text/internal/language/compose.go create mode 100644 vendor/golang.org/x/text/internal/language/coverage.go create mode 100644 vendor/golang.org/x/text/internal/language/language.go create mode 100644 vendor/golang.org/x/text/internal/language/lookup.go create mode 100644 vendor/golang.org/x/text/internal/language/match.go create mode 100644 vendor/golang.org/x/text/internal/language/parse.go create mode 100644 vendor/golang.org/x/text/internal/language/tables.go create mode 100644 vendor/golang.org/x/text/internal/language/tags.go create mode 100644 vendor/golang.org/x/text/internal/tag/tag.go create mode 100644 vendor/golang.org/x/text/internal/utf8internal/utf8internal.go create mode 100644 vendor/golang.org/x/text/language/coverage.go create mode 100644 vendor/golang.org/x/text/language/doc.go create mode 100644 vendor/golang.org/x/text/language/language.go create mode 100644 vendor/golang.org/x/text/language/match.go create mode 100644 vendor/golang.org/x/text/language/parse.go create mode 100644 vendor/golang.org/x/text/language/tables.go create mode 100644 vendor/golang.org/x/text/language/tags.go create mode 100644 vendor/golang.org/x/text/runes/cond.go create mode 100644 vendor/golang.org/x/text/runes/runes.go create mode 100644 vendor/golang.org/x/text/transform/transform.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/bidi.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/bracket.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/core.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/prop.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/tables11.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/tables12.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/trieval.go create mode 100644 vendor/gopkg.in/yaml.v3/LICENSE create mode 100644 vendor/gopkg.in/yaml.v3/NOTICE create mode 100644 vendor/gopkg.in/yaml.v3/README.md create mode 100644 vendor/gopkg.in/yaml.v3/apic.go create mode 100644 vendor/gopkg.in/yaml.v3/decode.go create mode 100644 vendor/gopkg.in/yaml.v3/emitterc.go create mode 100644 vendor/gopkg.in/yaml.v3/encode.go create mode 100644 vendor/gopkg.in/yaml.v3/parserc.go create mode 100644 vendor/gopkg.in/yaml.v3/readerc.go create mode 100644 vendor/gopkg.in/yaml.v3/resolve.go create mode 100644 vendor/gopkg.in/yaml.v3/scannerc.go create mode 100644 vendor/gopkg.in/yaml.v3/sorter.go create mode 100644 vendor/gopkg.in/yaml.v3/writerc.go create mode 100644 vendor/gopkg.in/yaml.v3/yaml.go create mode 100644 vendor/gopkg.in/yaml.v3/yamlh.go create mode 100644 vendor/gopkg.in/yaml.v3/yamlprivateh.go create mode 100644 vendor/modules.txt delete mode 100644 vendor/whisper/ggml-base.bin diff --git a/internal/player/unified_ffmpeg_player.go b/internal/player/unified_ffmpeg_player.go index 7f2f339..08ffa8f 100644 --- a/internal/player/unified_ffmpeg_player.go +++ b/internal/player/unified_ffmpeg_player.go @@ -122,7 +122,7 @@ func (p *UnifiedPlayer) Load(path string, offset time.Duration) error { if strings.Contains(path, "bbb_sunflower_2160p_60fps_normal.mp4") { logging.Debug(logging.CatPlayer, "Loading test video: Big Buck Bunny (%s)", path) } - + p.currentPath = path p.state = StateLoading @@ -135,27 +135,25 @@ func (p *UnifiedPlayer) Load(path string, offset time.Duration) error { // Create pipes for FFmpeg communication p.videoPipeReader, p.videoPipeWriter = io.Pipe() - p.audioPipeReader, p.audioPipeWriter = io.Pipe() + if !p.previewMode { + p.audioPipeReader, p.audioPipeWriter = io.Pipe() + } - // Build FFmpeg command with unified A/V output + // Build FFmpeg command - focus on video first args := []string{ "-hide_banner", "-loglevel", "error", "-ss", fmt.Sprintf("%.3f", offset.Seconds()), "-i", path, - // Video stream to pipe 4 "-map", "0:v:0", "-f", "rawvideo", "-pix_fmt", "rgb24", - "-r", "24", // We'll detect actual framerate - "pipe:4", - // Audio stream to pipe 5 - "-map", "0:a:0", - "-ac", "2", - "-ar", "48000", - "-f", "s16le", - "pipe:5", + "-r", "24", + "pipe:1", } + // Disable audio for now to get basic video working + args = append(args, "-an") + // Add hardware acceleration if available if p.config.HardwareAccel { if args = p.addHardwareAcceleration(args); args != nil { @@ -270,7 +268,8 @@ func (p *UnifiedPlayer) GetFrameImage() (*image.RGBA, error) { p.mu.Lock() defer p.mu.Unlock() - if p.state != StatePlaying || p.paused { + // Allow frame reading even when paused for UI updates + if p.state == StateStopped { return nil, nil } @@ -501,12 +500,25 @@ func (p *UnifiedPlayer) Play() error { return fmt.Errorf("no video loaded") } + if p.state == StateLoading { + // Still loading, wait + return fmt.Errorf("video still loading") + } + p.paused = false p.state = StatePlaying p.syncClock = time.Now() - + logging.Debug(logging.CatPlayer, "UnifiedPlayer: Play() called, state=%v", p.state) - + + // Start FFmpeg process if not already running + if p.cmd == nil || p.cmd.Process == nil { + if err := p.startVideoProcess(); err != nil { + p.state = StateStopped + return fmt.Errorf("failed to start video process: %w", err) + } + } + if p.stateCallback != nil { p.stateCallback(p.state) } @@ -608,49 +620,49 @@ func (p *UnifiedPlayer) startVideoProcess() error { // Start video frame reading goroutine if !p.previewMode { go func() { - rate := p.frameRate - if rate <= 0 { - rate = 24 - logging.Debug(logging.CatPlayer, "Frame rate unavailable; defaulting to %.0f fps", rate) - } - frameDuration := time.Second / time.Duration(rate) - frameTime := p.syncClock + rate := p.frameRate + if rate <= 0 { + rate = 24 + logging.Debug(logging.CatPlayer, "Frame rate unavailable; defaulting to %.0f fps", rate) + } + frameDuration := time.Second / time.Duration(rate) + frameTime := p.syncClock - for { - select { - case <-p.ctx.Done(): - logging.Debug(logging.CatPlayer, "Video processing goroutine stopped") - return + for { + select { + case <-p.ctx.Done(): + logging.Debug(logging.CatPlayer, "Video processing goroutine stopped") + return - default: - // Read frame from video pipe - frame, err := p.readVideoFrame() - if err != nil { - logging.Error(logging.CatPlayer, "Failed to read video frame: %v", err) - continue - } + default: + // Read frame from video pipe + frame, err := p.readVideoFrame() + if err != nil { + logging.Error(logging.CatPlayer, "Failed to read video frame: %v", err) + continue + } - if frame == nil { - continue - } + if frame == nil { + continue + } - // Update timing - p.currentTime = frameTime.Sub(p.syncClock) - frameTime = frameTime.Add(frameDuration) - p.syncClock = time.Now() + // Update timing + p.currentTime = frameTime.Sub(p.syncClock) + frameTime = frameTime.Add(frameDuration) + p.syncClock = time.Now() - // Notify callback - if p.frameCallback != nil { - p.frameCallback(p.GetCurrentFrame()) - } + // Notify callback + if p.frameCallback != nil { + p.frameCallback(p.GetCurrentFrame()) + } - // Sleep until next frame time - sleepTime := frameTime.Sub(time.Now()) - if sleepTime > 0 { - time.Sleep(sleepTime) + // Sleep until next frame time + sleepTime := frameTime.Sub(time.Now()) + if sleepTime > 0 { + time.Sleep(sleepTime) + } } } - } }() } @@ -686,10 +698,9 @@ func (p *UnifiedPlayer) readAudioStream() { // readVideoStream reads video frames from the video pipe func (p *UnifiedPlayer) readVideoFrame() (*image.RGBA, error) { - // Check if paused - skip reading frames while paused - if p.paused { - return nil, nil - } + // Allow frame reading when paused for UI updates + // but don't advance frame counter if paused + wasPaused := p.paused // Read RGB24 frame data from FFmpeg pipe frameSize := p.windowW * p.windowH * 3 // RGB24 = 3 bytes per pixel @@ -697,9 +708,16 @@ func (p *UnifiedPlayer) readVideoFrame() (*image.RGBA, error) { p.videoBuffer = make([]byte, frameSize) } - // Check for paused state before reading - if p.paused { - return nil, fmt.Errorf("player is paused") + // For non-blocking read when paused, use peek + if wasPaused { + // Return last known frame when paused (create placeholder if none) + img := p.frameBuffer.Get().(*image.RGBA) + if img.Rect.Dx() != p.windowW || img.Rect.Dy() != p.windowH { + img.Rect = image.Rect(0, 0, p.windowW, p.windowH) + img.Stride = p.windowW * 4 + img.Pix = make([]uint8, p.windowW*p.windowH*4) + } + return img, nil } // Read full frame - io.ReadFull ensures we get complete frame @@ -724,12 +742,13 @@ func (p *UnifiedPlayer) readVideoFrame() (*image.RGBA, error) { } utils.CopyRGBToRGBA(img.Pix, p.videoBuffer) - // Update frame counter - p.currentFrame++ - - // Notify time callback - if p.timeCallback != nil { - p.timeCallback(p.currentTime) + // Update frame counter only when not paused + if !wasPaused { + p.currentFrame++ + // Notify time callback + if p.timeCallback != nil { + p.timeCallback(p.currentTime) + } } return img, nil diff --git a/internal/player/unified_player_adapter.go b/internal/player/unified_player_adapter.go index 2afd54e..205c1c7 100644 --- a/internal/player/unified_player_adapter.go +++ b/internal/player/unified_player_adapter.go @@ -329,16 +329,16 @@ func (p *UnifiedPlayerAdapter) startFrameDisplayLoop() { return case <-ticker.C: p.mu.Lock() - if !p.paused && p.player != nil { - // Get frame from UnifiedPlayer - frame, err := p.player.GetFrameImage() - if err == nil && frame != nil { - fyne.CurrentApp().Driver().DoFromGoroutine(func() { - p.img.Image = frame - p.img.Refresh() - }, false) - } + // Always try to get frames, even when paused for UI updates + if p.player != nil { + frame, err := p.player.GetFrameImage() + if err == nil && frame != nil { + fyne.CurrentApp().Driver().DoFromGoroutine(func() { + p.img.Image = frame + p.img.Refresh() + }, false) } + } p.mu.Unlock() } } diff --git a/main.go b/main.go index 31f812c..9b02f8a 100644 --- a/main.go +++ b/main.go @@ -750,6 +750,7 @@ type convertConfig struct { AspectHandling string OutputAspect string AspectUserSet bool // Tracks if user explicitly set OutputAspect + ForceAspect bool // Force DAR/SAR metadata even when no aspect conversion TempDir string // Optional temp/cache directory override } @@ -818,6 +819,7 @@ func defaultConvertConfig() convertConfig { AspectHandling: "Auto", OutputAspect: "Source", AspectUserSet: false, + ForceAspect: true, TempDir: "", } } @@ -845,9 +847,14 @@ func loadPersistedConvertConfig() (convertConfig, error) { if err != nil { return cfg, err } + var raw map[string]json.RawMessage + _ = json.Unmarshal(data, &raw) if err := json.Unmarshal(data, &cfg); err != nil { return cfg, err } + if _, ok := raw["ForceAspect"]; !ok { + cfg.ForceAspect = true + } if cfg.OutputAspect == "" || strings.EqualFold(cfg.OutputAspect, "Source") { cfg.OutputAspect = "Source" cfg.AspectUserSet = false @@ -1236,6 +1243,14 @@ type appState struct { audioLeftPanel *fyne.Container audioSingleContent *fyne.Container audioBatchContent *fyne.Container + + // Application Preferences + defaultOutputDir string + defaultVideoCodec string // "libx264", "libx265", etc. + defaultAudioCodec string // "aac", "libmp3lame", etc. + hardwareAcceleration string // "auto", "none", "nvenc", "qsv", "vaapi" + uiTheme string // "Dark", "Light", "System" + autoPreview bool // Enable auto-preview functionality } type mergeClip struct { @@ -2398,8 +2413,10 @@ func (s *appState) addConvertToQueueForSource(src *videoSource, addToTop bool) e "coverArtPath": cfg.CoverArtPath, "aspectHandling": cfg.AspectHandling, "outputAspect": cfg.OutputAspect, + "forceAspect": cfg.ForceAspect, "sourceWidth": src.Width, "sourceHeight": src.Height, + "sampleAspectRatio": src.SampleAspectRatio, "sourceDuration": src.Duration, "sourceBitrate": src.Bitrate, "fieldOrder": src.FieldOrder, @@ -2528,8 +2545,10 @@ func (s *appState) addConvertToQueueForSourceWithOutputs(src *videoSource, used "coverArtPath": cfg.CoverArtPath, "aspectHandling": cfg.AspectHandling, "outputAspect": cfg.OutputAspect, + "forceAspect": cfg.ForceAspect, "sourceWidth": src.Width, "sourceHeight": src.Height, + "sampleAspectRatio": src.SampleAspectRatio, "sourceDuration": src.Duration, "sourceBitrate": src.Bitrate, "fieldOrder": src.FieldOrder, @@ -3414,8 +3433,10 @@ func (s *appState) batchAddToQueue(paths []string) { "coverArtPath": "", "aspectHandling": s.convert.AspectHandling, "outputAspect": s.convert.OutputAspect, + "forceAspect": s.convert.ForceAspect, "sourceWidth": src.Width, "sourceHeight": src.Height, + "sampleAspectRatio": src.SampleAspectRatio, "sourceBitrate": src.Bitrate, "sourceDuration": src.Duration, "fieldOrder": src.FieldOrder, @@ -4624,6 +4645,7 @@ func (s *appState) executeConvertJob(ctx context.Context, job *queue.Job, progre // Source metrics (used for filters and bitrate defaults) sourceWidth, _ := cfg["sourceWidth"].(int) sourceHeight, _ := cfg["sourceHeight"].(int) + sampleAspectRatio, _ := cfg["sampleAspectRatio"].(string) sourceBitrate := 0 if v, ok := cfg["sourceBitrate"].(float64); ok { sourceBitrate = int(v) @@ -4719,16 +4741,27 @@ func (s *appState) executeConvertJob(ctx context.Context, job *queue.Job, progre } } // Aspect ratio conversion - srcAspect := utils.AspectRatioFloat(sourceWidth, sourceHeight) + srcAspect := utils.DisplayAspectRatioFloat(sourceWidth, sourceHeight, sampleAspectRatio) outputAspect, _ := cfg["outputAspect"].(string) aspectHandling, _ := cfg["aspectHandling"].(string) + forceAspect := true + if v, ok := cfg["forceAspect"].(bool); ok { + forceAspect = v + } // Create temp source for aspect calculation - tempSrc := &videoSource{Width: sourceWidth, Height: sourceHeight} + tempSrc := &videoSource{Width: sourceWidth, Height: sourceHeight, SampleAspectRatio: sampleAspectRatio} targetAspect := resolveTargetAspect(outputAspect, tempSrc) if targetAspect > 0 && srcAspect > 0 && !utils.RatiosApproxEqual(targetAspect, srcAspect, 0.01) { vf = append(vf, aspectFilters(targetAspect, aspectHandling)...) } + if forceAspect && targetAspect > 0 { + if len(vf) == 0 { + vf = append(vf, fmt.Sprintf("setdar=%.6f", targetAspect), "setsar=1") + } else { + vf = appendAspectMetadata(vf, targetAspect) + } + } // Flip horizontal flipH, _ := cfg["flipHorizontal"].(bool) @@ -6207,7 +6240,8 @@ func buildFFmpegCommandFromJob(job *queue.Job) string { } // Aspect ratio handling (simplified) - if outputAspect, _ := cfg["outputAspect"].(string); outputAspect != "" && outputAspect != "Source" { + outputAspect, _ := cfg["outputAspect"].(string) + if outputAspect != "" && outputAspect != "Source" { aspectHandling, _ := cfg["aspectHandling"].(string) if aspectHandling == "letterbox" { vf = append(vf, fmt.Sprintf("pad=iw:iw*(%s/(sar*dar)):(ow-iw)/2:(oh-ih)/2", outputAspect)) @@ -6216,6 +6250,26 @@ func buildFFmpegCommandFromJob(job *queue.Job) string { } } + // Force aspect metadata when enabled + forceAspect := true + if v, ok := cfg["forceAspect"].(bool); ok { + forceAspect = v + } + if forceAspect { + sourceWidth, _ := cfg["sourceWidth"].(int) + sourceHeight, _ := cfg["sourceHeight"].(int) + sampleAspectRatio, _ := cfg["sampleAspectRatio"].(string) + tempSrc := &videoSource{Width: sourceWidth, Height: sourceHeight, SampleAspectRatio: sampleAspectRatio} + outputAspect, _ := cfg["outputAspect"].(string) + if targetAspect := resolveTargetAspect(outputAspect, tempSrc); targetAspect > 0 { + if len(vf) == 0 { + vf = append(vf, fmt.Sprintf("setdar=%.6f", targetAspect), "setsar=1") + } else { + vf = appendAspectMetadata(vf, targetAspect) + } + } + } + // Flipping if flipH, _ := cfg["flipHorizontal"].(bool); flipH { vf = append(vf, "hflip") @@ -6585,6 +6639,13 @@ func runGUI() { audioNormTruePeak: audioDefaults.NormTruePeak, audioOutputDir: audioDefaults.OutputDir, audioSelectedTracks: make(map[int]bool), + // Application Preferences defaults + defaultOutputDir: "", + defaultVideoCodec: "libx264", + defaultAudioCodec: "aac", + hardwareAcceleration: "auto", + uiTheme: "Dark", + autoPreview: true, } if cfg, err := loadPersistedConvertConfig(); err == nil { @@ -7916,6 +7977,26 @@ func buildConvertView(state *appState, src *videoSource) fyne.CanvasObject { targetAspectSelect *widget.Select targetAspectSelectSimple *widget.Select ) + var forceAspectChecks []*widget.Check + syncForceAspect := func(checked bool) { + state.convert.ForceAspect = checked + for _, c := range forceAspectChecks { + if c.Checked != checked { + c.SetChecked(checked) + } + } + if buildCommandPreview != nil { + buildCommandPreview() + } + } + makeForceAspectCheck := func() *widget.Check { + check := widget.NewCheck("Force aspect metadata (DAR/SAR)", func(checked bool) { + syncForceAspect(checked) + }) + check.SetChecked(state.convert.ForceAspect) + forceAspectChecks = append(forceAspectChecks, check) + return check + } // Aspect select widget - uses state manager to eliminate sync flag targetAspectSelect = widget.NewSelect(aspectTargets, func(value string) { setAspect(value, true) @@ -9451,6 +9532,7 @@ func buildConvertView(state *appState, src *videoSource) fyne.CanvasObject { widget.NewLabelWithStyle("Target Aspect Ratio", fyne.TextAlignLeading, fyne.TextStyle{Bold: true}), targetAspectSelectSimple, targetAspectHintContainer, + makeForceAspectCheck(), )) // Simple mode options - minimal controls, aspect locked to Source @@ -9530,6 +9612,7 @@ func buildConvertView(state *appState, src *videoSource) fyne.CanvasObject { targetAspectSelect, targetAspectHintContainer, aspectBox, + makeForceAspectCheck(), )) autoCropSection := buildConvertBox("Auto-Crop", container.NewVBox( @@ -10136,8 +10219,10 @@ func buildConvertView(state *appState, src *videoSource) fyne.CanvasObject { "coverArtPath": cfg.CoverArtPath, "aspectHandling": cfg.AspectHandling, "outputAspect": cfg.OutputAspect, + "forceAspect": cfg.ForceAspect, "sourceWidth": src.Width, "sourceHeight": src.Height, + "sampleAspectRatio": src.SampleAspectRatio, "sourceDuration": src.Duration, "fieldOrder": src.FieldOrder, } @@ -13057,8 +13142,12 @@ func (s *appState) startConvert(status *widget.Label, btn, cancelBtn *widget.But } targetAspect := resolveTargetAspect(cfg.OutputAspect, src) - if targetAspect > 0 && len(vf) > 0 { - vf = appendAspectMetadata(vf, targetAspect) + if cfg.ForceAspect && targetAspect > 0 { + if len(vf) == 0 { + vf = append(vf, fmt.Sprintf("setdar=%.6f", targetAspect), "setsar=1") + } else { + vf = appendAspectMetadata(vf, targetAspect) + } } // Flip horizontal @@ -13770,8 +13859,12 @@ func (s *appState) generateSnippet() { vf = append(vf, aspectFilters(targetAspect, s.convert.AspectHandling)...) } } - if targetAspect := resolveTargetAspect(s.convert.OutputAspect, src); targetAspect > 0 && len(vf) > 0 { - vf = appendAspectMetadata(vf, targetAspect) + if targetAspect := resolveTargetAspect(s.convert.OutputAspect, src); s.convert.ForceAspect && targetAspect > 0 { + if len(vf) == 0 { + vf = append(vf, fmt.Sprintf("setdar=%.6f", targetAspect), "setsar=1") + } else { + vf = appendAspectMetadata(vf, targetAspect) + } } // Frame rate conversion (only if explicitly set and different from source) diff --git a/vendor/fyne.io/fyne/v2/.gitignore b/vendor/fyne.io/fyne/v2/.gitignore new file mode 100644 index 0000000..a03d7f0 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/.gitignore @@ -0,0 +1,49 @@ +### Binaries and project specific files +cmd/fyne/fyne +cmd/fyne_demo/fyne_demo +cmd/fyne_settings/fyne_settings +cmd/hello/hello +fyne-cross +*.exe +*.apk +*.app +*.tar.xz +*.zip + +### Tests +**/testdata/failed + +### Go +# Output of the coverage tool +*.out + +### macOS +# General +.DS_Store + +# Thumbnails +._* + +### JetBrains +.idea + +### VSCode +.vscode + +### Vim +# Swap +[._]*.s[a-v][a-z] +[._]*.sw[a-p] +[._]s[a-v][a-z] +[._]sw[a-p] + +# Session +Session.vim + +# Temporary +.netrwhist +*~ +# Auto-generated tag files +tags +# Persistent undo +[._]*.un~ diff --git a/vendor/fyne.io/fyne/v2/.godocdown.import b/vendor/fyne.io/fyne/v2/.godocdown.import new file mode 100644 index 0000000..65b6416 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/.godocdown.import @@ -0,0 +1 @@ +fyne.io/fyne/v2 diff --git a/vendor/fyne.io/fyne/v2/AUTHORS b/vendor/fyne.io/fyne/v2/AUTHORS new file mode 100644 index 0000000..61109a4 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/AUTHORS @@ -0,0 +1,16 @@ +Andy Williams +Steve OConnor +Luca Corbo +Paul Hovey +Charles Corbett +Tilo Prütz +Stephen Houston +Storm Hess +Stuart Scott +Jacob Alzén +Charles A. Daniels +Pablo Fuentes +Changkun Ou +Cedric Bail +Drew Weymouth +Simon Dassow diff --git a/vendor/fyne.io/fyne/v2/CHANGELOG.md b/vendor/fyne.io/fyne/v2/CHANGELOG.md new file mode 100644 index 0000000..a4f74a4 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/CHANGELOG.md @@ -0,0 +1,1680 @@ +# Changelog + +This file lists the main changes with each version of the Fyne toolkit. +More detailed release notes can be found on the [releases page](https://github.com/fyne-io/fyne/releases). + +## 2.7.1 - 14 Nov 2025 + +### Fixed + +* Ensure tar files created in cli tool contain a root directory +* 2.7 regression in GL performance on Mac (#6010) +* GridWrap keyboard navigation does not change to next row at the end of previous row (#5994) +* Image border radius not always shown on image fill cover (#5980) +* Speed up file dialog rendering + + +## 2.7.0 - 16 Oct 2025 + +### Added + +* Canvas types: Arc, Polygon, Square (and Rectangle.Aspect) +* "Cover" image fill +* Fully rounded corner radius ("pill" rectangle) & per-corner +* Image corner radius +* New containers: Navigation & Clip +* New Embedded driver (for running on non-standard drvices) +* RowWrap layout +* Add Generics to List and Tree for data binding +* Support for IPv6 addresses in URIs +* Add storage.RemoveAll to recursively delete from a repository +* Added Portuguese, Russian & Chinese (Simplified) +* Support left-tap systray to show window (SetSystemTrayWindow) +* Support JSON theme with fallback +* Add RichText bullet start number +* Option to always show Entry validation + +### Changed + +* Massive performance increases on rendering +* optimisations galore in data handling, custom themes and TextGrid +* Smooth infinite progress by reversing animation not just looping +* Numerous memory leaks and potential race conditions addressed + +### Fixed + +* Theme Override container cannot be used to override layout paddings (#5019) +* Tree widget: First selected node stays highlighted after switching selection (#5796) +* Brave browser: Web app via fyne serve blinks and closes , works correctly in Chrome (and Edge) (#5705) +* layout.formLayout render canvas.Text as labels and values outside/off minSize area (#5163) +* Android: EGL_BAD_SURFACE fails to redraw app after OpenFile dialog closes (#3541) +* Tab and Shift +Tab not behaving as expected on folder dialog (#5974) + +### New Contributors + +Code in v2.7.0 contains work from the following first time contributors: + +* @kruitbosdotdev +* @cognusion +* @r3quie +* @redawl +* @generikvault +* @cwarden +* @Vinci10 +* @cpustejovsky +* @xfaris +* @rad756 +* @ystepanoff + + +## 2.6.3 - 21 August 2025 + +### Fixed + +* Resolve compile issue with Go 1.25.0 caused by golang.org/x/tools conflict + + +## 2.6.2 - 28 July 2025 + +### Changed + +* Added Czechoslovakia translations + +### Fixed + +* bounds check panic on undo after ctrl-deleting text on last line from MultiLineEntry (#5714) +* Entry OnChanged does not get triggered on undo and redo (#5710) +* SetText in TextGrid leaves trailing content (#5722) +* Desktop app with system tray hangs on app.Quit (#5724) +* CenterOnScreen Regression (#5733) +* TextGrid CursorLocationForPosition reports wrong location when scrolled (#5745) +* Language is always "en" on macOS (#5760) +* TextGrid is glitchy when calling SetText on a scrolled container. (#5762) +* When running for the second time in window.CenterOnScreen(), it will get stuck when running on the main thread (#5766) +* Text entry widget backspace deletes two characters on Android (#2774) +* Secondary windows is not refreshed correctly (#5782) +* Clicking a button rapidly causes the click animation to extend outside of the button (#5785) +* WASM cursor was ignored +* Corrected date format for Germany +* Hide() doesn't work at startup for widgets/containers (#5597) +* Android GBoard: first character typed into Entry is prefixed with "0" after focus (#5666) +* Use Scaled Monitor Size For Monitor Detection (#5802) +* Don't override user choice if a) xdg lookup fails or b) system updates (#5851) +* Entry with mobile.NumberKeyboard does not Type comma and separators (#5101) +* Padding value is ignored in ThemeOverride container +* Performance improvements in TextGrid and object positioning +* Improvements in WASM rendering performance + + +## 2.6.1 - 8 May 2025 + +### Changed + + * Added Russian translations + +### Fixed + + * Activity indicator is light and not visible when a light theme is active (#5661) + * Unsafe use of map in RichText on 2.6.0 (#5639) + * Image translucency causes blurriness on small icons (#5476) + * Infinite progress bar snapping and doesn't loop nicely (#5433) + * RichTextSegment SizeName is not SizeNameText by default (#5307) + * When there is an offline netdrive, the file dialog will freeze (#2411) + * Correctly reset image cache when Resource goes to nil + * Data race after migration to v2.6.0 (#5713) + +## 2.6.0 - 10 April 2025 + +### Added + + * Added [fyne.Do] and [fyne.DoAndWait] to call from goroutines. This makes it possible to eliminate race conditions. + * Add "Migrations" section to FyneApp.toml to mark migrations like `fyneDo = true` + * Add Calendar and DateEntry widgets + * Add a third state ([Check.Partial]) to the check widget (#3576) + * Add ability to select label text using new [Label.Selectable] + * Support for storage on web driver (#4634) + * test: Add RenderToMarkup and RenderObjectToMarkup (#5124) + * Add ability to choose a text size for label widget (#5561) + * Show soft keyboard on Web build with mobile device (#4394) + * APIs for testing dialogs (#2771) + * Add `ScrollToOffset` functions to collection widgets + * Add Prepend method to Accordion (#5418) + * Support Apple intel apps on M1/2 (using Rosetta) (#3971) + * Ability to turn off re-scaling when a window moves between monitors for Linux (#5164) + * Add functions to get text location for position (and vice-versa) with a TextGrid + * Add support for scrolling many lines in TextGrid + * Add `Append` function to TextGrid + * Add `Prepend` function to Accordion + * Support custom titles in file dialogs using `SetTitleText` + * Add utility methods to handle colouring of SVG images + * Add preference bind APIs for list (slice) types + * Added Greek, Ukrainian & Chinese (Simplified) translations + +### Changed + + * All callbacks from Fyne drivers and widgets now call on the same goroutine + * Shortcuts on menu items are now called before widget or canvas shortcuts (#2627) + * ActionItems in an Entry should now match the standard button size + * Tidy the fyne CLI and moved to tools repo (#4920) + * When scroll bar is expanded, clicking above or below the bar scrolls up or down (#4922) + * Add generics to data binding package + * File picker now ignores case (#5113) + * Consistent callback order for dialogs - data before OnClosed + * Improve drop-shadow to show light from top position + * load markdown images from origin when not a URL + * Debug now disabled by default for WASM builds + * Updated theme of inner window borders with circle style and more customisations + * Change Accordion.OpenAll when used with single-open accordion to open the first item instead of none + +### Fixed + + * Fixed all known race conditions + * Decouple clipboard from fyne.Window enhancement (#4418) + * Odd looking SelectEntry with long PlaceHolder (#4430) + * Crash when resizing mobile simulator window (#5397) + * Deadlock when creating widget too fast (#3203) + * Application crashes on .Resize() (#5206) + * Linux (ubuntu) menu shortcuts not working blocker (#5355) + * Slider snaps back to min-value on Android (#5430) + * SoftwareCanvas resize only works properly if it's the last step bug (#5548) + * Showing a disabled menu items with a non-SVG icon generates Fyne error bug (#5557) + * Trying to hide subsequently created popups in a goroutine results in Fyne runtime panic (#5564) + * Table passes negative index to onSelected function (#4917) + * storage.Move() fails to move directories (#5493) + * Tree and Table widgets refresh full content on any scroll or resize (#5456) + * Memory leak from widget renderers never being destroyed blocker (#4903) + * On MacOS SysTray menu does not show when clicked on an active space in second monitor (#5223) + * On MacOs systray tooltip does not show when full window app is active (#5282) + * Panic when opening and closing windows quickly bug (#3280) + * Goroutines showing same window at similar times can forget size races (#4535) + * Panic when confirming or dismissing file open dialog races (#3279) + * richImage may freeze the application in some cases. (#3510) + * Memory usage increases significantly per character in Entry (#2969) + * Submenus not working on mobile (#5398) + * ListWidget with data index out of bounds when modified bound data (#5227) + * After scrolling, first selection in a list jumps that item to the bottom of the container (#5605) + * Accordion could have incorrect layout with multiple items open + * Prevent tapping within a popup from dismissing it, even if non-modal (#5360) + * Resolved performance issues in text and custom theme handling + + +## 2.5.5 - 13 March 2025 + +### Fixed + +* Correct wasm build for Go 1.24 onwards + + +## 2.5.4 - 1 February 2025 + +### Changed + +* Added Tamil translation + +### Fixed + +* Checkbox not responding to click because it is too "large"? (#5331) +* Fix progressbar not showing label until first refresh +* FyneApp.toml causes BadLength error (#5272) +* Test suite: failure with locale/language different from 'en' (#5362) +* fix GridWrap crash when resizing to same size without creating renderer +* Submenus not working on mobile (#5398) +* Subtle scrolling bug in List when the last two items are of different size (#5281) +* File picker does not ignore case (#5113) +* Tab "OnSelected" doesn't appear to allow focussing tab content (#5454) +* Documentation fixes + + +## 2.5.3 - 15 December 2024 + +### Changed + +* Smoothly decelerate scroll on mobile +* Added Spanish translation + +### Fixed + +* Starting location can be wrong in file dialogs with custom repository (#5200) +* Improve how shortcut special keys for menu items are rendered on Windows and Linux (#5108) +* Blank page in Chrome for Android +* Mobile Entry: cursor arrows don't work (#5258) +* FileDialog does not handle relative file URIs well. (#5234) +* [Linux] Only change variant when color scheme changes +* [Linux] Window with list flickers in Wayland (#5133) +* Package command fails on OpenBSD (#5195) +* System theme fallback is not working with custom themes +* Translucency and images with Alpha channel (#1977) +* Performance regression when scrolling inside the file dialog (#4307) +* Empty but visible images consume high CPU on 2.4.x (#4345) +* Improved performance of text render caching +* nil pointer dereference in dialog.Resize() for color picker (#5236) +* Tiny files written in iOS may be empty +* Some SVG resources don't update appearance correctly with the theme (#3900) + + +## 2.5.2 - 15 October 2024 + +### Fixed + +* Sometimes fyne fails to setup dark mode on Windows (#4758) +* Memory leak in fontMetrics cache on desktop driver (#4010) +* Fix possible crash with badly formatted json translation +* Tree widget doesn't display higher elements until a user selects one (#5095, #4346) +* Update to the latest breaking API changes in go-text +* Fix wrapping / truncation of multi-font text runs (#4998) +* Test window title is not always set (#5116) +* Deadlock in Button CreateRenderer() (#5114) +* Fix possible crash in theme watching for windows +* Fix issue with Movies folder on darwin file dialog +* widget.Entry: validate when pasting from clipboard (#5058, #5028) +* Reduce contention in some widget locks +* Add Swedish translation +* Improvements to documentation +* Improved temp check for windows/msys +* Fix split in a theme override container + + +## 2.5.1 - 24 August 2024 + +### Fixed + + * Apps with translations in new languages would not be recognised (#5015) + * App ID can be ignored from metadata file with go build/run + * Typing Chinese characters in widget.Entry and perform undo/redo crashes the app (#5001) + * Assets would render Low-DPI before attaching to a canvas + * Single click in file dialog enters two directories (#5053) + * Light/Dark mode detection no longer works on Ubuntu with Fyne 2.5 (#5029) + * Scroll acceleration logic causes scrolling to "jump" suddenly on macOS (#5067) + * SetSystemTrayMenu doesn't work when run in goroutine (#5039) + * stack overflow when calling SetRowHeight in table UpdateCell callback (#5007) + * Resizing List causes visible items to refresh instead of resize (#4080) + * Child widget with Hoverable() interface keeps parent widget's Tapped() function from being called. (#3906) + * App Translation file is ignored / tries to load BR (#5015, #5040) + * Missing theme variant auto-switching (dark/light) for Windows (#4537) + * Get DoubleTapDelay from the OS if an API is available (#4448) + * Entry cursor is not visible with animations off (#4508) + * Redundant justify-content properties in CSS for centered-container class (#5045) + * Update go-text/render to avoid crashing when rendering certain bitmap fonts (#5042) + * Using container.NewThemeOverride leaks memory until window closing (#5000) + + +## 2.5.0 - 14 July 2024 + +### Added + + * Internationalisation support and translations (#605, #3249) + * Look up system fonts for glyphs that cannot be found embedded (#2572, #1579) + * Completed support for Wayland on Linux + * Completed support for the Web driver (*except file handling) + * Add support for XDG Desktop Portals when built with `-tags flatpak` on Linux + * Activity indicator widget + * InnerWindow and MultipleWindows containers + * ThemeOverride container for grouping items with a different theme + * Add `NativeWindow.RunNative` to use a native window handle (#4483) + * Ability to request display stays on - `SetDisableScreenBlanking` (#4534, #3007) + * Add Undo/Redo support for widget.Entry (#436) + * Add AppendMarkdown function to RichText + * Add option in List to hide separators (#3756) + * New CustomPaddedLayout for more fine-grained container padding + * Add SizeName property to Hyperlink widget + * Support Ctrl+[backspace/delete] to delete the word to the left or right of the cursor + * Add IntToFloat (and FloatToInt) in bindings Data binding (#4666) + * Add ScrollToOffset/GetScrollOffset APIs for collection widgets + * Add ColumnCount API to GridWrap widget + * Disable and Enable for Slider widget (#3551) + * Function `Remove` added to List bindings (#3100) + * Form layout can now be vertical (labels above field) or adaptive for mobile + * Add support for Bold, Italic and Underline for TextGrid (#1237) + * Add support for setting a custom resource as the font source for text (#808) + * New `test` functions `NewTempApp`, `NewTempWindow` and `TempWidgetRenderer` to free resources automatically + +### Changed + + * Fyne now depends on Go 1.19 at a minimum + * Round the corners of scroll bars with new theme value + * Improve contrast of text on highlight background colours + * Layout of iOS and Android apps will adapt when keyboard appears (#566, #2371) + * FyneApp.toml will now be loaded with `go build` (#4688) + * Text wrapping will now wrap in dialogs (#2602) + * System tray and tray menu icons on will now match theme on macOS (#4549) + * Triple clicking in an Entry widget now selects current line (#4328) + * About menu items will now override the macOS default About + * System tray no longer shows tooltips (until we have full support) + * Double tapping an item in a file dialog now selects and returns + * Widgets should now use `theme.ForWidget()` instead of `theme.Default()` or static helpers + +### Fixed + + * Kannada characters not rendering correctly (#2654) + * Notifications are not working on iOS (#4966) + * Incorrect scaling on Steam Deck screen Accessibility (#4896) + * Sometimes the last list row that should be visible doesn't show (#4909) + * RichText swallowing whitespace after Markdown links (#4613, #4340) + * Disabled app tabs can still be selected in popup menu (#4935) + * Don't show title when mouse hover on Systray menu (#4916) + * Trying to access a URL through canvas.NewImageFromURI() in a test results in a panic (#4863) + * Don't insert tab character in Entry when Shift+Tab typed + * Select Does Not Gain Focus When Tapped (#4767) + * binding.Untyped crashes when set to nil bug (#4807) + * Label and Slider not aligned in a FormItem (#4714) + * Windows: App Icon in Notification (#2592) + * Fix possible writing of empty preference data in some quit events + * Allow application to set default view (list/grid) of file dialog before showing it (#4595) + * Fix ScrollToOffset when viewport is larger than content size + * Incorrect row header width in widget.Table (#4370) + * Add missed truncation mode for hyperlink (#4335) + * AppTab does not display blue indicator line if you create it empty and then Append items to it later. + * Many optimisations in animation, draw speed, layout and widget size calculations + * DocTabItem update text doesn't update the underline select bar (graphic glitch) (#3106) + + +## 2.4.5 - 15 April 2024 + +### Fixed + +* iOS files write would fail when over 16KB +* storage.Delete not supported on Android/iOS (#2120) +* layout.formLayout do not handle canvas.Text well in second column (#4665) +* Fix building with ios17.4 (#4741) +* Support template icon for system tray menu icons +* Fix recognition of missing XDG user directories (#4650) +* FileDialog.SetOnClosed not always working (#4651) +* Upgrade GLFW for performance improvements and bug fixes +* Multiple select popups can crash during background operations (#4730) +* Controlling a negative slider with the left arrow key blocks after 8 steps (#4736) +* cmd/fyne: command "get" is broken with Go 1.22 (#4684) +* Race condition during system tray menu refresh (#4697) +* Fyne release on Linux does not set Metadata().Release to true (#4711) +* RichText leaks memory when replacing segments (#4723) + + +## 2.4.4 - 13 February 2024 + +### Fixed + +* Spaces could be appended to linux Exec command during packaging +* Secondary mobile windows would not size correctly when padded +* Setting Icon.Resource to nil will not clear rendering +* Dismiss iOS keyboard if "Done" is tapped +* Large speed improvement in Entry and GridWrap widgets +* tests fail with macOS Assertion failure in NSMenu (#4572) +* Fix image test failures on Apple Silicon +* High CPU use when showing CustomDialogs (#4574) +* Entry does not show the last (few) changes when updating a binding.String in a fast succession (#4082) +* Calling Entry.SetText and then Entry.Bind immediately will ignore the bound value (#4235) +* Changing theme while application is running doesn't change some parameters on some widgets (#4344) +* Check widget: hovering/tapping to the right of the label area should not activate widget (#4527) +* Calling entry.SetPlaceHolder inside of OnChanged callback freezes app (#4516) +* Hyperlink enhancement: underline and tappable area shouldn't be wider than the text label (#3528) +* Fix possible compile error from go-text/typesetting + + +## 2.4.3 - 23 December 2023 + +### Fixed + +* Fix OpenGL init for arm64 desktop devices +* System tray icon on Mac is showing the app ID (#4416) +* Failure with fyne release -os android/arm (#4174) +* Android GoBack with forcefully close the app even if the keyboard is up (#4257) +* *BSD systems using the wrong (and slow) window resize +* Optimisations to reduce memory allocations in List, GridWrap, driver and mime type handling +* Reduce calls to C and repeated size checks in painter and driver code + + +## 2.4.2 - 22 November 2023 + +### Fixed + +* Markdown only shows one horizontal rule (#4216) +* Spacer in HBox with hidden item will cause an additional trailing padding (#4259) +* Application crash when fast clicking the folders inside the file dialog (#4260) +* failed to initialise OpenGL (#437) +* App panic when clicking on a notification panel if there's a systray icon (#4385) +* Systray cannot be shown on Ubuntu (#3678, #4381) +* failed to initialise OpenGL on Windows dual-chip graphics cards (#437) +* Reduce memory allocations for each frame painted +* RichText may not refresh if segments manually replaced +* Correct URI.Extension() documentation +* Update for security fixes to x/sys and x/net +* Inconsistent rendering of Button widget (#4243) +* PasswordEntry initial text is not obscured (#4312) +* Pasting text in Entry does not update cursor position display (#4181) + + +## 2.4.1 - 9 October 2023 + +### Fixed + +* Left key on tree now collapses open branch +* Avoid memory leak in Android driver code +* Entry Field on Android in Landscape Mode Shows "0" (#4036) +* DocTabs Indicator remains visible after last tab is removed (#4220) +* Fix mobile simulation builds on OpenBSD +* Fix alignment of menu button on mobile +* Fix Compilation with Android NDK r26 +* Clicking table headers causes high CPU consumption (#4264) +* Frequent clicking on table may cause the program to not respond (#4210) +* Application stops responding when scrolling a table (#4263) +* Possible crash parsing malformed JSON color (#4270) +* NewFolderOpen: incomplete filenames (#2165) +* Resolve issue where storage.List could crash with short URI (#4271) +* TextTruncateEllipsis abnormally truncates strings with multi-byte UTF-8 characters (#4283) +* Last character doesn't appear in Select when there is a special character (#4293) +* Resolve random crash in DocTab (#3909) +* Selecting items from a list caused the keyboard to popup on Android (#4236) + + +## 2.4.0 - 1 September 2023 + +### Added + +* Rounded corners in rectangle (#1090) +* Support for emoji in text +* Layout debugging (with `-tags debug` build flag) (#3314) +* GridWrap collection widget +* Add table headers (#1658, #3594) +* Add mobile back button handling (#2910) +* Add option to disable UI animations (#1813) +* Text truncation ellipsis (#1659) +* Add support for binding tree data, include new `NewTreeWithData` +* Add support for OpenType fonts (#3245) +* Add `Window.SetOnDropped` to handle window-wide item drop on desktop +* Add lists to the types supported by preferences API +* Keyboard focus handling for all collection widgets +* Add APIs for refreshing individual items in collections (#3826) +* Tapping slider moves it to that position (#3650) +* Add `OnChangeEnded` callback to `Slider` (#3652) +* Added keyboard controls to `Slider` +* Add `NewWarningThemedResource` and `NewSuccessThemedResource` along with `NewColoredResource` (#4040) +* Custom hyperlink callback for rich text hyperlinks (#3335) +* Added `dialog.NewCustomWithoutButtons`, with a `SetButtons` method (#2127, #2782) +* Added `SetConfirmImportance` to `dialog.ConfirmDialog`. +* Added `FormDialog.Submit()` to close and submit the dialog if validation passes +* Rich Text image alignment (#3810) +* Bring back `theme.HyperlinkColor` (#3867) +* Added `Importance` field on `Label` to color the text +* Navigating in entry quickly with ctrl key (#2462) +* Support `.desktop` file metadata in `FyneApp.toml` for Linux and BSD +* Support mobile simulator on FreeBSD +* Add data binding boolean operators `Not`, `And` and `Or` +* Added `Entry.Append`, `Select.SetOptions`, `Check.SetText`, `FormDialog.Submit` +* Add `ShowPopUpAtRelativePosition` and `PopUp.ShowAtRelativePosition` +* Add desktop support to get key modifiers with `CurrentKeyModifiers` +* Add geometry helpers `NewSquareSize` and `NewSquareOffsetPos` +* Add `--pprof` option to fyne build commands to enable profiling +* Support compiling from Android (termux) + +### Changed + +* Go 1.17 or later is now required. +* Theme updated for rounded corners on buttons and input widgets +* `widget.ButtonImportance` is now `widget.Importance` +* The `Max` container and layout have been renamed `Stack` for clarity +* Refreshing an image will now happen in app-thread not render process, apps may wish to add async image load +* Icons for macOS bundles are now padded and rounded, disable with "-use-raw-icon" (#3752) +* Update Android target SDK to 33 for Play Store releases +* Focus handling for List/Tree/Table are now at the parent widget not child elements +* Accordion widget now fills available space - put it inside a `VBox` container for old behavior (#4126) +* Deprecated theme.FyneLogo() for later removal (#3296) +* Improve look of menu shortcuts (#2722) +* iOS and macOS packages now default to using "XCWildcard" provisioning profile +* Improving performance of lookup for theme data +* Improved application startup time + +### Fixed + +* Rendering performance enhancements +* `dialog.NewProgressInfinite` is deprecated, but dialog.NewCustom isn't equivalent +* Mouse cursor desync with Split handle when dragging (#3791) +* Minor graphic glitch with checkbox (#3792) +* binding.String===>Quick refresh *b.val will appear with new data reset by a call to OnChange (#3774) +* Fyne window becomes unresponsive when in background for a while (#2791) +* Hangs on repeated calls to `Select.SetSelected` in table. (#3684) +* `Select` has wrong height, padding and border (#4142) +* `widget.ImageSegment` can't be aligned. (#3505) +* Memory leak in font metrics cache (#4108) +* Don't panic when loading preferences with wrong type (#4039) +* Button with icon has wrong padding on right (#4124) +* Preferences don't all save when written in `CloseIntercept` (#3170) +* Text size does not update in Refresh for TextGrid +* DocTab selection underline not updated when deleting an Item (#3905) +* Single line Entry throws away selected text on submission (#4026) +* Significantly improve performance of large `TextGrid` and `Tree` widgets +* `List.ScrollToBottom` not scrolling to show the totality of the last Item (#3829) +* Setting `Position1` of canvas.Circle higher than `Position2` causes panic. (#3949) +* Enhance scroll wheel/touchpad scroll speed on desktop (#3492) +* Possible build issue on Windows with app metadata +* `Form` hint text has confusing padding to next widget (#4137) +* `Entry` Placeholder Style Only Applied On Click (#4035) +* Backspace and Delete key Do not Fire OnChanged Event (#4117) +* Fix `ProgressBar` text having the wrong color sometimes +* Window doesn't render when called for the first time from system tray and the last window was closed (#4163) +* Possible race condition in preference change listeners +* Various vulnerabilities resolved through updating dependencies +* Wrong background for color dialog (#4199) + + +## 2.3.5 - 6 June 2023 + +### Fixed + +* Panic with unsupported font (#3646) +* Temporary manifest file not closed after building on Windows +* Panic when using autogenerated quit menu and having unshown windows (#3870) +* Using `canvas.ImageScaleFastest` not working on arm64 (#3891) +* Disabled password Entry should also disable the ActionItem (#3908) +* Disabled RadioGroup does not display status (#3882) +* Negative TableCellID Row (#2857) +* Make sure we have sufficient space for the bar as well if content is tiny (#3898) +* Leak in image painter when replacing image.Image source regularly +* Links in Markdown/Rich Text lists breaks formatting (#2911) +* Crash when reducing window to taskbar with popup opened (#3877) +* RichText vertical scroll will truncate long content with horizontal lines (#3929) +* Custom metadata would not apply with `fyne release` command +* Horizontal CheckGroup overlap when having long text (#3005) +* Fix focused colour of coloured buttons (#3462) +* Menu separator not visible with light theme (#3814) + + +## 2.3.4 - 3 May 2023 + +### Fixed + +* Memory leak when switching theme (#3640) +* Systray MenuItem separators not rendered in macOS root menu (#3759) +* Systray leaks window handles on Windows (#3760) +* RadioGroup miscalculates label widths in horizontal mode (#3386) +* Start of selection in entry is shifted when moving too fast (#3804) +* Performance issue in widget.List (#3816) +* Moving canvas items (e.g. Images) does not cause canvas repaint (#2205) +* Minor graphic glitch with checkbox (#3792) +* VBox and HBox using heap memory that was not required +* Menu hover is slow on long menus + +## 2.3.3 - 24 March 2023 + +### Fixed + +* Linux, Windows and BSD builds could fail if gles was missing + + +## 2.3.2 - 20 March 2023 + +### Fixed + +* Fyne does not run perfectly on ARM-based MacOS platforms (#3639) * +* Panic on closing window in form submit on Мac M2 (#3397) * +* Wobbling slider effect for very small steps (#3648) +* Fix memory leak in test canvas refresh +* Optimise text texture memory by switching to single channel +* Packaging an android fyne app that uses tags can fail (#3641) +* NewAdaptiveGrid(0) blanks app window on start until first resize on Windows (#3669) +* Unnecessary refresh when sliding Split container +* Linux window resize refreshes all content +* Themed and unthemed svg resources can cache collide +* When packaging an ampersand in "Name" causes an error (#3195) +* Svg in ThemedResource without viewBox does not match theme (#3714) +* Missing menu icons in Windows system tray +* Systray Menu Separators don't respect the submenu placement (#3642) +* List row focus indicator disappears on scrolling (#3699) +* List row focus not reset when row widget is reused to display a new item (#3700) +* Avoid panic if accidental 5th nil is passed to Border container +* Mobile simulator not compiling on Apple M1/2 +* Cropped letters in certain cases with the new v2.3.0 theme (#3500) + +Many thanks indeed to [Dymium](https://dymium.io) for sponsoring an Apple +M2 device which allowed us to complete the marked (*) issues. + + +## 2.3.1 - 13 February 2023 + +### Changed + +* Pad app version to ensure Windows packages correctly (#3638) + +### Fixed + +* Custom shortcuts with fyne.KeyTab is not working (#3087) +* Running a systray app with root privileges resulted in panic (#3120) +* Markdown image with no title is not parsed (#3577) +* Systray app on macOS panic when started while machine sleeps (#3609) +* Runtime error with VNC on RaspbianOS (#2972) +* Hovered background in List widget isn't reset when scrolling reuses an existing list item (#3584) +* cmd/fyne package can't find FyneApp.toml when -src option has given (#3459) +* TextWrapWord will cause crash in RichText unverified (#3498) +* crash in widget.(*RichText).lineSizeToColumn (#3292) +* Crash in widget.(*Entry).SelectedText (#3290) +* Crash in widget.(*RichText).updateRowBounds.func1 (#3291) +* window is max size at all times (#3507) +* systray.Quit() is not called consistently when the app is closing (#3597) +* Software rendering would ignore scale for text +* crash when minimize a window which contains a stroked rectangle (#3552) +* Menu item would not appear disabled initially +* Wrong icon colour for danger and warning buttons +* Embedding Fyne apps in iFrame alignment issue +* Generated metadata can be in wrong directory +* Android RootURI may not exist when used for storage (#3207) + + +## 2.3.0 - 24 December 2022 + +### Added + +* Shiny new theme that was designed for us +* Improved text handling to support non-latin alphabets +* Add cloud storage and preference support +* Add menu icon and submenu support to system tray menus +* More button importance levels `ErrorImportance`, `WarningImportance` +* Support disabling of `AppTabs` and `DocTabs` items +* Add image support to rich text (#2366) +* Add CheckGroup.Remove (#3124) + +### Changed + +* The buttons on the default theme are no longer transparent, but we added more button importance types +* Expose a storage.ErrNotExists for non existing documents (#3083) +* Update `go-gl/glfw` to build against latest Glfw 3.3.8 +* List items in `widget.List` now implement the Focusable interface + +### Fixed + +* Displaying unicode or different language like Bengali doesn't work (#598) +* Cannot disable container.TabItem (#1904) +* Update Linux/XDG application theme to follow the FreeDesktop Dark Style Preference (#2657) +* Running `fyne package -os android` needs NDK 16/19c (#3066) +* Caret position lost when resizing a MultilineEntry (#3024) +* Fix possible crash in table resize (#3369) +* Memory usage surge when selecting/appending MultilineEntry text (#3426) +* Fyne bundle does not support appending when parameter is a directory +* Crash parsing invalid file URI (#3275) +* Systray apps on macOS can only be terminated via the systray menu quit button (#3395) +* Wayland Scaling support: sizes and distances are scaled wrong (#2850) +* Google play console minimum API level 31 (#3375) +* Data bound entry text replacing selection is ignored (#3340) +* Split Container does not respect item's Visible status (#3232) +* Android - Entry - OnSubmitted is not working (#3267) +* Can't set custom CGO_CFLAGS and CGO_LDFLAGS with "fyne package" on darwin (#3276) +* Text line not displayed in RichText (#3117) +* Segfault when adding items directly in form struct (#3153) +* Preferences RemoveValue does not save (#3229) +* Create new folder directly from FolderDialog (#3174) +* Slider drag handle is clipped off at minimum size (#2966) +* Entry text "flickering" while typing (#3461) +* Rendering of not changed canvas objects after an event (#3211) +* Form dialog not displaying hint text and validation errors (#2781) + + +## 2.2.4 - 9 November 2022 + +### Fixes + +* Iphone incorrect click coordinates in zoomed screen view (#3122) +* CachedFontFace seems to be causing crash (#3134) +* Fix possible compile error if "fyne build" is used without icon metadata +* Detect and use recent Android NDK toolchain +* Handle fyne package -release and fyne release properly for Android and iOS +* Fix issue with mobile simulation when systray used +* Fix incorrect size and position for radio focus indicator (#3137) + + +## 2.2.3 - 8 July 2022 + +### Fixed + +* Regression: Preferences are not parsed at program start (#3125) +* Wrappable RichText in a Split container causes crash (#3003, #2961) +* meta.Version is always 1.0.0 on android & ios (#3109) + + +## 2.2.2 - 30 June 2022 + +### Fixed + +* Windows missing version metadata when packaged (#3046) +* Fyne package would not build apps using old Fyne versions +* System tray icon may not be removed on app exit in Windows +* Emphasis in Markdown gives erroneous output in RichText (#2974) +* When last visible window is closed, hidden window is set visible (#3059) +* Do not close app when last window is closed but systrayMenu exists (#3092) +* Image with ImageFillOriginal not showing (#3102) + + +## 2.2.1 - 12 June 2022 + +### Fixed + +* Fix various race conditions and compatibility issues with System tray menus +* Resolve issue where macOS systray menu may not appear +* Updated yaml dependency to fix CVE-2022-28948 +* Tab buttons stop working after removing a tab (#3050) +* os.SetEnv("FYNE_FONT") doesn't work in v2.2.0 (#3056) + + +## 2.2.0 - 7 June 2022 + +### Added + +* Add SetIcon method on ToolbarAction (#2475) +* Access compiled app metadata using new `App.Metadata()` method +* Add support for System tray icon and menu (#283) +* Support for Android Application Bundle (.aab) (#2663) +* Initial support for OpenBSD and NetBSD +* Add keyboard shortcuts to menu (#682) +* Add technical preview of web driver and `fyne serve` command +* Added `iossimulator` build target (#1917) +* Allow dynamic themes via JSON templates (#211) +* Custom hyperlink callback (#2979) +* Add support for `.ico` file when compiling for windows (#2412) +* Add binding.NewStringWithFormat (#2890) +* Add Entry.SetMinRowsVisible +* Add Menu.Refresh() and MainMenu.Refresh() (#2853) +* Packages for Linux and BSD now support installing into the home directory +* Add `.RemoveAll()` to containers +* Add an AllString validator for chaining together string validators + +### Changed + +* Toolbar item constructors now return concrete types instead of ToolbarItem +* Low importance buttons no longer draw button color as a background +* ProgressBar widget height is now consistent with other widgets +* Include check in DocTabs menu to show current tab +* Don't call OnScrolled if offset did not change (#2646) +* Prefer ANDROID_NDK_HOME over the ANDROID_HOME ndk-bundle location (#2920) +* Support serialisation / deserialisation of the widget tree (#5) +* Better error reporting / handling when OpenGL is not available (#2689) +* Memory is now better reclaimed on Android when the OS requests it +* Notifications on Linux and BSD now show the application icon +* Change listeners for preferences no longer run when setting the same value +* The file dialog now shows extensions in the list view for better readability +* Many optimisations and widget performance enhancements +* Updated various dependencies to their latest versions + +### Fixed + +* SendNotification does not show app name on Windows (#1940) +* Copy-paste via keyboard don't work translated keyboard mappings on Windows (#1220) +* OnScrolled triggered when offset hasn't changed (#1868) +* Carriage Return (\r) is rendered as space (#2456) +* storage.List() returns list with nil elements for empty directories (#2858) +* Entry widget, position of cursor when clicking empty space (#2877) +* SelectEntry cause UI hang (#2925) +* Font cutoff with bold italics (#3001) +* Fyne error: Preferences load error (#2936, 3015) +* Scrolled List bad redraw when window is maximized (#3013) +* Linux and BSD packages not being installable if the name contained spaces + + +## 2.1.4 - 17 March 2022 + +### Fixed + +* SetTheme() is not fully effective for widget.Form (#2810) +* FolderOpenDialog SetDismissText is ineffective (#2830) +* window.Resize() does not work if SetFixedSize(true) is set after (#2819) +* Container.Remove() race causes crash (#2826, #2775, #2481) +* FixedSize Window improperly sized if contains image with ImageFillOriginal (#2800) + + +## 2.1.3 - 24 February 2022 + +### Fixed + +* The text on button can't be show correctly when use imported font (#2512) +* Fix issues with DocTabs scrolling (#2709) +* Fix possible crash for tapping extended Radio or Check item +* Resolve lookup of relative icons in FyneApp.toml +* Window not shown when SetFixedSize is used without Resize (#2784) +* Text and links in markdown can be rendered on top of each other (#2695) +* Incorrect cursor movement in a multiline entry with wrapping (#2698) + + +## 2.1.2 - 6 December 2021 + +### Fixed + +* Scrolling list bound to data programmatically causes nil pointer dereference (#2549) +* Rich text from markdown can get newlines wrong (#2589) +* Fix crash on 32bit operating systems (#2603) +* Compile failure on MacOS 10.12 Sierra (#2478) +* Don't focus widgets on mobile where keyboard should not display (#2598) +* storage.List doesn't return complete URI on Android for "content:" scheme (#2619) +* Last word of the line and first word of the next line are joined in markdown parse (#2647) +* Support for building `cmd/fyne` on Windows arm64 +* Fixed FreeBSD requiring installed glfw library dependency (#1928) +* Apple M1: error when using mouse drag to resize window (#2188) +* Struct binding panics in reload with slice field (#2607) +* File Dialog favourites can break for certain locations (#2595) +* Define user friendly names for Android Apps (#2653) +* Entry validator not updating if content is changed via data binding after SetContent (#2639) +* CenterOnScreen not working for FixedSize Window (#2550) +* Panic in boundStringListItem.Get() (#2643) +* Can't set an app/window icon to be an svg. (#1196) +* SetFullScreen(false) can give error (#2588) + + +## 2.1.1 - 22 October 2021 + +### Fixed + +* Fix issue where table could select cells beyond data bound +* Some fast taps could be ignored (#2484) +* iOS app stops re-drawing mid-frame after a while (#950) +* Mobile simulation mode did not work on Apple M1 computers +* TextGrid background color can show gaps in render (#2493) +* Fix alignment of files in list view of file dialog +* Crash setting visible window on macOS to fixed size (#2488) +* fyne bundle ignores -name flag in windows (#2395) +* Lines with nil colour would crash renderer +* Android -nm tool not found with NDK 23 (#2498) +* Runtime panic because out of touchID (#2407) +* Long text in Select boxes overflows out of the box (#2522) +* Calling SetText on Label may not refresh correctly +* Menu can be triggered by # key but not always Alt +* Cursor position updates twice with delay (#2525) +* widgets freeze after being in background and then a crash upon pop-up menu (#2536) +* too many Refresh() calls may now cause visual artifacts in the List widget (#2548) +* Entry.SetText may panic if called on a multiline entry with selected text (#2482) +* TextGrid not always drawing correctly when resized (#2501) + + +## 2.1.0 - 17 September 2021 + +### Added + +* DocTabs container for handling multiple open files +* Lifecycle API for handling foreground, background and other event +* Add RichText widget and Markdown parser +* Add TabWidth to TextStyle to specify tab size in spaces +* Add CheckGroup widget for multi-select +* Add FyneApp.toml metadata file to ease build commands +* Include http and https in standard repositories +* Add selection color to themes +* Include baseline information in driver font measurement +* Document storage API (App.Storage().Create() and others) +* Add "App Files" to file dialog for apps that use document storage +* Tab overflow on AppTabs +* Add URI and Unbound type to data bindings +* Add keyboard support for menus, pop-ups and buttons +* Add SimpleRenderer to help make simple widgets (#709) +* Add scroll functions for List, Table, Tree (#1892) +* Add selection and disabling to MenuItem +* Add Alignment to widget.Select (#2329) +* Expose ScanCode for keyboard events originating from hardware (#1523) +* Support macOS GPU switching (#2423) + +### Changed + +* Focusable widgets are no longer focused on tap, add canvas.Focus(obj) in Tapped handler if required +* Move to background based selection for List, Table and Tree +* Update fyne command line tool to use --posix style parameters +* Switch from gz to xz compression for unix packages +* Performance improvements with line, text and raster rendering +* Items not yet visible can no longer be focused +* Lines can now be drawn down to 1px (instead of 1dp) (#2298) +* Support multiple lines of text on button (#2378) +* Improved text layout speed by caching string size calculations +* Updated to require Go 1.14 so we can use some new features +* Window Resize request is now asynchronous +* Up/Down keys take cursor home/end when on first/last lines respectively + +### Fixed + +* Correctly align text tabs (#1791) +* Mobile apps theme does not match system (#472) +* Toolbar with widget.Label makes the ToolbarAction buttons higher (#2257) +* Memory leaks in renderers and canvases cache maps (#735) +* FileDialog SetFilter does not work on Android devices (#2353) +* Hover fix for List and Tree with Draggable objects +* Line resize can flip slope (#2208) +* Deadlocks when using widgets with data (#2348) +* Changing input type with keyboard visible would not update soft keyboards +* MainMenu() Close item does NOT call function defined in SetCloseIntercept (#2355) +* Entry cursor position with mouse is offset vertically by theme.SizeNameInputBorder (#2387) +* Backspace key is not working on Android AOSP (#1941) +* macOS: 'NSUserNotification' has been deprecated (#1833) +* macOS: Native menu would add new items if refreshed +* iOS builds fail since Go 1.16 +* Re-add support for 32 bit iOS devices, if built with Go 1.14 +* Android builds fail on Apple M1 (#2439) +* SetFullScreen(true) before ShowAndRun fails (#2446) +* Interacting with another app when window.SetFullScreen(true) will cause the application to hide itself. (#2448) +* Sequential writes to preferences does not save to file (#2449) +* Correct Android keyboard handling (#2447) +* MIUI-Android: The widget’s Hyperlink cannot open the URL (#1514) +* Improved performance of data binding conversions and text MinSize + + +## 2.0.4 - 6 August 2021 + +### Changed + +* Disable Form labels when the element it applys to is disabled (#1530) +* Entry popup menu now fires shortcuts so extended widgets can intercept +* Update Android builds to SDK 30 + +### Fixed + +* sendnotification show appID for name on windows (#1940) +* Fix accidental removal of windows builds during cross-compile +* Removing an item from a container did not update layout +* Update title bar on Windows 10 to match OS theme (#2184) +* Tapped triggered after Drag (#2235) +* Improved documentation and example code for file dialog (#2156) +* Preferences file gets unexpectedly cleared (#2241) +* Extra row dividers rendered on using SetColumnWidth to update a table (#2266) +* Fix resizing fullscreen issue +* Fullscreen changes my display resolution when showing a dialog (#1832) +* Entry validation does not work for empty field (#2179) +* Tab support for focus handling missing on mobile +* ScrollToBottom not always scrolling all the way when items added to container.Scroller +* Fixed scrollbar disappearing after changing content (#2303) +* Calling SetContent a second time with the same content will not show +* Drawing text can panic when Color is nil (#2347) +* Optimisations when drawing transparent rectangle or whitespace strings + + +## 2.0.3 - 30 April 2021 + +### Fixed + +* Optimisations for TextGrid rendering +* Data binding with widget.List sometimes crash while scrolling (#2125) +* Fix compilation on FreeBSD 13 +* DataLists should notify only once when change. +* Keyboard will appear on Android in disabled Entry Widget (#2139) +* Save dialog with filename for Android +* form widget can't draw hinttext of appended item. (#2028) +* Don't create empty shortcuts (#2148) +* Install directory for windows install command contains ".exe" +* Fix compilation for Linux Wayland apps +* Fix tab button layout on mobile (#2117) +* Options popup does not move if a SelectEntry widget moves with popup open +* Speed improvements to Select and SelectEntry drop down +* theme/fonts has an apache LICENSE file but it should have SIL OFL (#2193) +* Fix build requirements for target macOS platforms (#2154) +* ScrollEvent.Position and ScrollEvent.AbsolutePosition is 0,0 (#2199) + + +## 2.0.2 - 1 April 2021 + +### Changed + +* Text can now be copied from a disable Entry using keyboard shortcuts + +### Fixed + +* Slider offset position could be incorrect for mobile apps +* Correct error in example code +* When graphics init fails then don't try to continue running (#1593) +* Don't show global settings on mobile in fyne_demo as it's not supported (#2062) +* Empty selection would render small rectangle in Entry +* Do not show validation state for disabled Entry +* dialog.ShowFileSave did not support mobile (#2076) +* Fix issue that storage could not write to files on iOS and Android +* mobile app could crash in some focus calls +* Duplicate symbol error when compiling for Android with NDK 23 (#2064) +* Add internet permission by default for Android apps (#1715) +* Child and Parent support in storage were missing for mobile appps +* Various crashes with Entry and multiline selections (including #1989) +* Slider calls OnChanged for each value between steps (#1748) +* fyne command doesn't remove temporary binary from src (#1910) +* Advanced Color picker on mobile keeps updating values forever after sliding (#2075) +* exec.Command and widget.Button combination not working (#1857) +* After clicking a link on macOS, click everywhere in the app will be linked (#2112) +* Text selection - Shift+Tab bug (#1787) + + +## 2.0.1 - 4 March 2021 + +### Changed + +* An Entry with `Wrapping=fyne.TextWrapOff` no longer blocks scroll events from a parent + +### Fixed + +* Dialog.Resize() has no effect if called before Dialog.Show() (#1863) +* SelectTab does not always correctly set the blue underline to the selected tab (#1872) +* Entry Validation Broken when using Data binding (#1890) +* Fix background colour not applying until theme change +* android runtime error with fyne.dialog (#1896) +* Fix scale calculations for Wayland phones (PinePhone) +* Correct initial state of entry validation +* fix entry widget mouse drag selection when scrolled +* List widget panic when refreshing after changing content length (#1864) +* Fix image caching that was too aggressive on resize +* Pointer and cursor misalignment in widget.Entry (#1937) +* SIGSEGV Sometimes When Closing a Program by Clicking a Button (#1604) +* Advanced Color Picker shows Black for custom primary color as RGBA (#1970) +* Canvas.Focus() before window visible causes application to crash (#1893) +* Menu over Content (#1973) +* Error compiling fyne on Apple M1 arm64 (#1739) +* Cells are not getting draw in correct location after column resize. (#1951) +* Possible panic when selecting text in a widget.Entry (#1983) +* Form validation doesn't enable submit button (#1965) +* Creating a window shows it before calling .Show() and .Hide() does not work (#1835) +* Dialogs are not refreshed correctly on .Show() (#1866) +* Failed creating setting storage : no such directory (#2023) +* Erroneous custom filter types not supported error on mobile (#2012) +* High importance button show no hovered state (#1785) +* List widget does not render all visible content after content data gets shorter (#1948) +* Calling Select on List before draw can crash (#1960) +* Dialog not resizing in newly created window (#1692) +* Dialog not returning to requested size (#1382) +* Entry without scrollable content prevents scrolling of outside scroller (#1939) +* fyne_demo crash after selecting custom Theme and table (#2018) +* Table widget crash when scrolling rapidly (#1887) +* Cursor animation sometimes distorts the text (#1778) +* Extended password entry panics when password revealer is clicked (#2036) +* Data binding limited to 1024 simultaneous operations (#1838) +* Custom theme does not refresh when variant changes (#2006) + + +## 2.0 - 22 January 2021 + +### Changes that are not backward compatible + +These changes may break some apps, please read the +[upgrading doc](https://developer.fyne.io/api/v2.0/upgrading) for more info +The import path is now `fyne.io/fyne/v2` when you are ready to make the update. + +* Coordinate system to float32 + * Size and Position units were changed from int to float32 + * `Text.TextSize` moved to float32 and `fyne.MeasureText` now takes a float32 size parameter + * Removed `Size.Union` (use `Size.Max` instead) + * Added fyne.Delta for difference-based X, Y float32 representation + * DraggedEvent.DraggedX and DraggedY (int, int) to DraggedEvent.Dragged (Delta) + * ScrollEvent.DeltaX and DeltaY (int, int) moved to ScrollEvent.Scrolled (Delta) + +* Theme API update + * `fyne.Theme` moved to `fyne.LegacyTheme` and can be load to a new theme using `theme.FromLegacy` + * A new, more flexible, Theme interface has been created that we encourage developers to use + +* The second parameter of `theme.NewThemedResource` was removed, it was previously ignored +* The desktop.Cursor definition was renamed desktop.StandardCursor to make way for custom cursors +* Button `Style` and `HideShadow` were removed, use `Importance` + +* iOS apps preferences will be lost in this upgrade as we move to more advanced storage +* Dialogs no longer show when created, unless using the ShowXxx convenience methods +* Entry widget now contains scrolling so should no longer be wrapped in a scroll container + +* Removed deprecated types including: + - `dialog.FileIcon` (now `widget.FileIcon`) + - `widget.Radio` (now `widget.RadioGroup`) + - `widget.AccordionContainer` (now `widget.Accordion`) + - `layout.NewFixedGridLayout()` (now `layout.NewGridWrapLayout()`) + - `widget.ScrollContainer` (now `container.Scroll`) + - `widget.SplitContainer` (now `container.Spilt`) + - `widget.Group` (replaced by `widget.Card`) + - `widget.Box` (now `container.NewH/VBox`, with `Children` field moved to `Objects`) + - `widget.TabContainer` and `widget.AppTabs` (now `container.AppTabs`) +* Many deprecated fields have been removed, replacements listed in API docs 1.4 + - for specific information you can browse https://developer.fyne.io/api/v1.4/ + +### Added + +* Data binding API to connect data sources to widgets and sync data + - Add preferences data binding and `Preferences.AddChangeListener` + - Add bind support to `Check`, `Entry`, `Label`, `List`, `ProgressBar` and `Slider` widgets +* Animation API for handling smooth element transitions + - Add animations to buttons, tabs and entry cursor +* Storage repository API for connecting custom file sources + - Add storage functions `Copy`, `Delete` and `Move` for `URI` + - Add `CanRead`, `CanWrite` and `CanList` to storage APIs +* New Theme API for easier customisation of apps + - Add ability for custom themes to support light/dark preference + - Support for custom icons in theme definition + - New `theme.FromLegacy` helper to use old theme API definitions +* Add fyne.Vector for managing x/y float32 coordinates +* Add MouseButtonTertiary for middle mouse button events on desktop +* Add `canvas.ImageScaleFastest` for faster, less precise, scaling +* Add new `dialog.Form` that will phase out `dialog.Entry` +* Add keyboard control for main menu +* Add `Scroll.OnScrolled` event for seeing changes in scroll container +* Add `TextStyle` and `OnSubmitted` to `Entry` widget +* Add support for `HintText` and showing validation errors in `Form` widget +* Added basic support for tab character in `Entry`, `Label` and `TextGrid` + +### Changed + +* Coordinate system is now float32 - see breaking changes above +* ScrollEvent and DragEvent moved to Delta from (int, int) +* Change bundled resources to use more efficient string storage +* Left and Right mouse buttons on Desktop are being moved to `MouseButtonPrimary` and `MouseButtonSecondary` +* Many optimisations and widget performance enhancements + +* Moving to new `container.New()` and `container.NewWithoutLayout()` constructors (replacing `fyne.NewContainer` and `fyne.NewContainerWithoutLayout`) +* Moving storage APIs `OpenFileFromURI`, `SaveFileToURI` and `ListerForURI` to `Reader`, `Writer` and `List` functions + +### Fixed + +* Validating a widget in widget.Form before renderer was created could cause a panic +* Added file and folder support for mobile simulation support (#1470) +* Appending options to a disabled widget.RadioGroup shows them as enabled (#1697) +* Toggling toolbar icons does not refresh (#1809) +* Black screen when slide up application on iPhone (#1610) +* Properly align Label in FormItem (#1531) +* Mobile dropdowns are too low (#1771) +* Cursor does not go down to next line with wrapping (#1737) +* Entry: while adding text beyond visible reagion there is no auto-scroll (#912) + + +## 1.4.3 - 4 January 2021 + +### Fixed + +* Fix crash when showing file open dialog on iPadOS +* Fix possible missing icon on initial show of disabled button +* Capturing a canvas on macOS retina display would not capture full resolution +* Fix the release build flag for mobile +* Fix possible race conditions for canvas capture +* Improvements to `fyne get` command downloader +* Fix tree, so it refreshes visible nodes on Refresh() +* TabContainer Panic when removing selected tab (#1668) +* Incorrect clipping behaviour with nested scroll containers (#1682) +* MacOS Notifications are not shown on subsequent app runs (#1699) +* Fix the behavior when dragging the divider of split container (#1618) + + +## 1.4.2 - 9 December 2020 + +### Added + +* [fyne-cli] Add support for passing custom build tags (#1538) + +### Changed + +* Run validation on content change instead of on each Refresh in widget.Entry + +### Fixed + +* [fyne-cli] Android: allow to specify an inline password for the keystore +* Fixed Card widget MinSize (#1581) +* Fix missing release tag to enable BuildRelease in Settings.BuildType() +* Dialog shadow does not resize after Refresh (#1370) +* Android Duplicate Number Entry (#1256) +* Support older macOS by default - back to 10.11 (#886) +* Complete certification of macOS App Store releases (#1443) +* Fix compilation errors for early stage Wayland testing +* Fix entry.SetValidationError() not working correctly + + +## 1.4.1 - 20 November 2020 + +### Changed + +* Table columns can now be different sizes using SetColumnWidth +* Avoid unnecessary validation check on Refresh in widget.Form + +### Fixed + +* Tree could flicker on mouse hover (#1488) +* Content of table cells could overflow when sized correctly +* file:// based URI on Android would fail to list folder (#1495) +* Images in iOS release were not all correct size (#1498) +* iOS compile failed with Go 1.15 (#1497) +* Possible crash when minimising app containing List on Windows +* File chooser dialog ignores drive Z (#1513) +* Entry copy/paste is crashing on android 7.1 (#1511) +* Fyne package creating invalid windows packages (#1521) +* Menu bar initially doesn't respond to mouse input on macOS (#505) +* iOS: Missing CFBundleIconName and asset catalog (#1504) +* CenterOnScreen causes crash on MacOS when called from goroutine (#1539) +* desktop.MouseHover Button state is not reliable (#1533) +* Initial validation status in widget.Form is not respected +* Fix nil reference in disabled buttons (#1558) + + +## 1.4 - 1 November 2020 + +### Added (highlights) + +* List (#156), Table (#157) and Tree collection Widgets +* Card, FileItem, Separator widgets +* ColorPicker dialog +* User selection of primary colour +* Container API package to ease using layouts and container widgets +* Add input validation +* ListableURI for working with directories etc +* Added PaddedLayout + +* Window.SetCloseIntercept (#467) +* Canvas.InteractiveArea() to indicate where widgets should avoid +* TextFormatter for ProgressBar +* FileDialog.SetLocation() (#821) +* Added dialog.ShowFolderOpen (#941) +* Support to install on iOS and android with 'fyne install' +* Support asset bundling with go:generate +* Add fyne release command for preparing signed apps +* Add keyboard and focus support to Radio and Select widgets + +### Changed + +* Theme update - new blue highlight, move buttons to outline +* Android SDK target updated to 29 +* Mobile log entries now start "Fyne" instead of "GoLog" +* Don't expand Select to its largest option (#1247) +* Button.HideShadow replaced by Button.Importance = LowImportance + +* Deprecate NewContainer in favour of NewContainerWithoutLayout +* Deprecate HBox and VBox in favour of new container APIs +* Move Container.AddObject to Container.Add matching Container.Remove +* Start move from widget.TabContainer to container.AppTabs +* Replace Radio with RadioGroup +* Deprecate WidgetRenderer.BackgroundColor + +### Fixed + +* Support focus traversal in dialog (#948), (#948) +* Add missing AbsolutePosition in some mouse events (#1274) +* Don't let scrollbar handle become too small +* Ensure tab children are resized before being shown (#1331) +* Don't hang if OpenURL loads browser (#1332) +* Content not filling dialog (#1360) +* Overlays not adjusting on orientation change in mobile (#1334) +* Fix missing key events for some keypad keys (#1325) +* Issue with non-english folder names in Linux favourites (#1248) +* Fix overlays escaping screen interactive bounds (#1358) +* Key events not blocked by overlays (#814) +* Update scroll container content if it is changed (#1341) +* Respect SelectEntry datta changes on refresh (#1462) +* Incorrect SelectEntry dropdown button position (#1361) +* don't allow both single and double tap events to fire (#1381) +* Fix issue where long or tall images could jump on load (#1266, #1432) +* Weird behaviour when resizing or minimizing a ScrollContainer (#1245) +* Fix panic on NewTextGrid().Text() +* Fix issue where scrollbar could jump after mousewheel scroll +* Add missing raster support in software render +* Respect GOOS/GOARCH in fyne command utilities +* BSD support in build tools +* SVG Cache could return the incorrect resource (#1479) + +* Many optimisations and widget performance enhancements +* Various fixes to file creation and saving on mobile devices + + +## 1.3.3 - 10 August 2020 + +### Added + +* Use icons for file dialog favourites (#1186) +* Add ScrollContainer ScrollToBottom and ScrollToTop + +### Changed + +* Make file filter case sensitive (#1185) + +### Fixed + +* Allow popups to create dialogs (#1176) +* Use default cursor for dragging scrollbars (#1172) +* Correctly parse SVG files with missing X/Y for rect +* Fix visibility of Entry placeholder when text is set (#1193) +* Fix encoding issue with Windows notifications (#1191) +* Fix issue where content expanding on Windows could freeze (#1189) +* Fix errors on Windows when reloading Fyne settings (#1165) +* Dialogs not updating theme correctly (#1201) +* Update the extended progressbar on refresh (#1219) +* Segfault if font fails (#1200) +* Slider rendering incorrectly when window maximized (#1223) +* Changing form label not refreshed (#1231) +* Files and folders starting "." show no name (#1235) + + +## 1.3.2 - 11 July 2020 + +### Added + +* Linux packaged apps now include a Makefile to aid install + +### Changed + +* Fyne package supports specific architectures for Android +* Reset missing textures on refresh +* Custom confirm callbacks now called on implicitly shown dialogs +* SelectEntry can update drop-down list during OnChanged callback +* TextGrid whitespace color now matches theme changes +* Order of Window Resize(), SetFixedSize() and CenterOnScreen() does no matter before Show() +* Containers now refresh their visuals as well as their Children on Refresh() + +### Fixed + +* Capped StrokeWidth on canvas.Line (#831) +* Canvas lines, rectangles and circles do not resize and refresh correctly +* Black flickering on resize on MacOS and OS X (possibly not on Catalina) (#1122) +* Crash when resizing window under macOS (#1051, #1140) +* Set SetFixedSize to true, the menus are overlapped (#1105) +* Ctrl+v into text input field crashes app. Presumably clipboard is empty (#1123, #1132) +* Slider default value doesn't stay inside range (#1128) +* The position of window is changed when status change from show to hide, then to show (#1116) +* Creating a windows inside onClose handler causes Fyne to panic (#1106) +* Backspace in entry after SetText("") can crash (#1096) +* Empty main menu causes panic (#1073) +* Installing using `fyne install` on Linux now works on distributions that don't use `/usr/local` +* Fix recommendations from staticcheck +* Unable to overwrite file when using dialog.ShowFileSave (#1168) + + +## 1.3 - 5 June 2020 + +### Added + +* File open and save dialogs (#225) +* Add notifications support (#398) +* Add text wrap support (#332) +* Add Accordion widget (#206) +* Add TextGrid widget (#115) +* Add SplitContainer widget (#205) +* Add new URI type and handlers for cross-platform data access +* Desktop apps can now create splash windows +* Add ScaleMode to images, new ImageScalePixels feature for retro graphics +* Allow widgets to influence mouse cursor style (#726) +* Support changing the text on form submit/cancel buttons +* Support reporting CapsLock key events (#552) +* Add OnClosed callback for Dialog +* Add new image test helpers for validating render output +* Support showing different types of soft keyboard on mobile devices (#971, #975) + +### Changed + +* Upgraded underlying GLFW library to fix various issues (#183, #61) +* Add submenu support and hover effects (#395) +* Default to non-premultiplied alpha (NRGBA) across toolkit +* Rename FixedGridLayout to GridWrapLayout (deprecate old API) (#836) +* Windows redraw and animations continue on window resize and move +* New...PopUp() methods are being replaced by Show...Popup() or New...Popup().Show() +* Apps started on a goroutine will now panic as this is not supported +* On Linux apps now simulate 120DPI instead of 96DPI +* Improved fyne_settings scale picking user interface +* Reorganised fyne_demo to accommodate growing collection of widgets and containers +* Rendering now happens on a different thread to events for more consistent drawing +* Improved text selection on mobile devices + +### Fixed (highlights) + +* Panic when trying to paste empty clipboard into entry (#743) +* Scale does not match user configuration in Windows 10 (#635) +* Copy/Paste not working on Entry Field in Windows OS (#981) +* Select widgets with many options overflow UI without scrolling (#675) +* android: typing in entry expands only after full refresh (#972) +* iOS app stops re-drawing mid frame after a while (#950) +* Too many successive GUI updates do not properly update the view (904) +* iOS apps would not build using Apple's new certificates +* Preserve aspect ratio in SVG stroke drawing (#976) +* Fixed many race conditions in widget data handling +* Various crashes and render glitches in extended widgets +* Fix security issues reported by gosec (#742) + + +## 1.2.4 - 13 April 2020 + +### Added + + * Added Direction field to ScrollContainer and NewHScrollContainer, NewVScrollContainer constructors (#763) + * Added Scroller.SetMinSize() to enable better defaults for scrolled content + * Added "fyne vendor" subcommand to help packaging fyne dependencies in projects + * Added "fyne version" subcommand to help with bug reporting (#656) + * Clipboard (cut/copy/paste) is now supported on iOS and Android (#414) + * Preferences.RemoveValue() now allows deletion of a stored user preference + +### Changed + + * Report keys based on name not key code - fixes issue with shortcuts with AZERTY (#790) + +### Fixed + + * Mobile builds now support go modules (#660) + * Building for mobile would try to run desktop build first + * Mobile apps now draw the full safe area on a screen (#799) + * Preferences were not stored on mobile apps (#779) + * Window on Windows is not controllable after exiting FullScreen mode (#727) + * Soft keyboard not working on some Samsung/LG smart phones (#787) + * Selecting a tab on extended TabContainer doesn't refresh button (#810) + * Appending tab to empty TabContainer causes divide by zero on mobile (#820) + * Application crashes on startup (#816) + * Form does not always update on theme change (#842) + + +## 1.2.3 - 2 March 2020 + +### Added + + * Add media and volume icons to default themes (#649) + * Add Canvas.PixelCoordinateForPosition to find pixel locations if required + * Add ProgressInfinite dialog + +### Changed + + * Warn if -executable or -sourceDir flags are used for package on mobile (#652) + * Update scale based on device for mobile apps + * Windows without a title will now be named "Fyne Application" + * Revert fix to quit mobile apps - this is not allowed in guidelines + +### Fixed + + * App.UniqueID() did not return current app ID + * Fyne package ignored -name flag for ios and android builds (#657) + * Possible crash when appending tabs to TabContainer + * FixedSize windows not rescaling when dragged between monitors (#654) + * Fix issues where older Android devices may not background or rotate (#677) + * Crash when setting theme before window content set (#688) + * Correct form extend behaviour (#694) + * Select drop-down width is wrong if the drop-down is too tall for the window (#706) + + +## 1.2.2 - 29 January 2020 + +### Added + +* Add SelectedText() function to Entry widget +* New mobile.Device interface exposing ShowVirtualKeyboard() (and Hide...) + +### Changed + +* Scale calculations are now relative to system scale - the default "1" matches the system +* Update scale on Linux to be "auto" by default (and numbers are relative to 96DPI standard) (#595) +* When auto scaling check the monitor in the middle of the window, not top left +* bundled files now have a standard header to optimise some tools like go report card +* Shortcuts are now handled by the event queue - fixed possible deadlock + +### Fixed + +* Scroll horizontally when holding shift key (#579) +* Updating text and calling refresh for widget doesn't work (#607) +* Corrected visual behaviour of extended widgets including Entry, Select, Check, Radio and Icon (#615) +* Entries and Selects that are extended would crash on right click. +* PasswordEntry created from Entry with Password = true has no revealer +* Dialog width not always sufficient for title +* Pasting unicode characters could panic (#597) +* Setting theme before application start panics on macOS (#626) +* MenuItem type conflicts with other projects (#632) + + +## 1.2.1 - 24 December 2019 + +### Added + +* Add TouchDown, TouchUp and TouchCancel API in driver/mobile for device specific events +* Add support for adding and removing tabs from a tab container (#444) + +### Fixed + +* Issues when settings changes may not be monitored (#576) +* Layout of hidden tab container contents on mobile (#578) +* Mobile apps would not quit when Quit() was called (#580) +* Shadows disappeared when theme changes (#589) +* iOS apps could stop rendering after many refreshes (#584) +* Fyne package could fail on Windows (#586) +* Horizontal only scroll container may not refresh using scroll wheel + + +## 1.2 - 12 December 2019 + +### Added + +* Mobile support - iOS and Android, including "fyne package" command +* Support for OpenGL ES and embedded linux +* New BaseWidget for building custom widgets +* Support for diagonal gradients +* Global settings are now saved and can be set using the new fyne_settings app +* Support rendering in Go playground using playground.Render() helpers +* "fyne install" command to package and install apps on the local computer +* Add horizontal scrolling to ScrollContainer +* Add preferences API +* Add show/hide password icon when created from NewPasswordEntry +* Add NewGridLayoutWithRows to specify a grid layout with a set number of rows +* Add NewAdaptiveGridLayout which uses a column grid layout when horizontal and rows in vertical + + +### Changed + +* New Logo! Thanks to Storm for his work on this :) +* Applications no longer have a default (Fyne logo) icon +* Input events now execute one at a time to maintain the correct order +* Button and other widget callbacks no longer launch new goroutines +* FYNE_THEME and FYNE_SCALE are now overrides to the global configuration +* The first opened window no longer exits the app when closed (unless none others are open or Window.SetMaster() is called) +* "fyne package" now defaults icon to "Icon.png" so the parameter is optional +* Calling ExtendBaseWidget() sets up the renderer for extended widgets +* Entry widget now has a visible Disabled state, ReadOnly has been deprecated +* Bundled images optimised to save space +* Optimise rendering to reduce refresh on TabContainer and ScrollContainer + + +### Fixed + +* Correct the color of Entry widget cursor if theme changes +* Error where widgets created before main() function could crash (#490) +* App.Run panics if called without a window (#527) +* Support context menu for disabled entry widgets (#488) +* Fix issue where images using fyne.ImageFillOriginal may not show initially (#558) + + +## 1.1.2 - 12 October 2019 + +### Added + +### Changed + +* Default scale value for canvases is now 1.0 instead of Auto (DPI based) + +### Fixed + +* Correct icon name in linux packages +* Fullscreen before showing a window works again +* Incorrect MinSize of FixedGrid layout in some situations +* Update text size on theme change +* Text handling crashes (#411, #484, #485) +* Layout of image only buttons +* TabItem.Content changes are reflected when refreshing TabContainer (#456) + +## 1.1.1 - 17 August 2019 + +### Added + +* Add support for custom Windows manifest files in fyne package + +### Changed + +* Dismiss non-modal popovers on secondary tap +* Only measure visible objects in layouts and minSize calculations (#343) +* Don't propagate show/hide in the model - allowing children of tabs to remain hidden +* Disable cut/copy for password fields +* Correctly calculate grid layout minsize as width changes +* Select text at end of line when double tapping beyond width + +### Fixed + +* Scale could be too large on macOS Retina screens +* Window with fixed size changes size when un-minimized on Windows (#300) +* Setting text on a label could crash if it was not yet shown (#381) +* Multiple Entry widgets could have selections simultaneously (#341) +* Hover effect of radio widget too low (#383) +* Missing shadow on Select widget +* Incorrect rendering of subimages within Image object +* Size calculation caches could be skipped causing degraded performance + + +## 1.1 - 1 July 2019 + +### Added + +* Menubar and PopUpMenu (#41) +* PopUp widgets (regular and modal) and canvas overlay support (#242) +* Add gradient (linear and radial) to canvas +* Add shadow support for overlays, buttons and scrollcontainer +* Text can now be selected (#67) +* Support moving through inputs with Tab / Shift-Tab (#82) +* canvas.Capture() to save the content of a canvas +* Horizontal layout for widget.Radio +* Select widget (#21) +* Add support for disabling widgets (#234) +* Support for changing icon color (#246) +* Button hover effect +* Pointer drag event to main API +* support for desktop mouse move events +* Add a new "hints" build tag that can suggest UI improvements + +### Changed + +* TabContainer tab location can now be set with SetTabLocation() +* Dialog windows now appear as modal popups within a window +* Don't add a button bar to a form if it has no buttons +* Moved driver/gl package to internal/driver/gl +* Clicking/Tapping in an entry will position the cursor +* A container with no layout will not change the position or size of its content +* Update the fyne_demo app to reflect the expanding feature set + +### Fixed + +* Allow scrollbars to be dragged (#133) +* Unicode char input with Option key on macOS (#247) +* Resizng fixed size windows (#248) +* Fixed various bugs in window sizing and padding +* Button icons do not center align if label is empty (#284) + + +## 1.0.1 - 20 April 2019 + +### Added + +* Support for go modules +* Transparent backgrounds for widgets +* Entry.OnCursorChanged() +* Radio.Append() and Radio.SetSelected() (#229) + +### Changed + +* Clicking outside a focused element will unfocus it +* Handle key repeat for non-runes (#165) + +### Fixed + +* Remove duplicate options from a Radio widget (#230) +* Issue where paste shortcut is not called for Ctrl-V keyboard combination +* Cursor position when clearing text in Entry (#214) +* Antialias of lines and circles (fyne-io/examples#14) +* Crash on centering of windows (#220) +* Possible crash when closing secondary windows +* Possible crash when showing dialog +* Initial visibility of scroll bar in ScrollContainer +* Setting window icon when different from app icon. +* Possible panic on app.Quit() (#175) +* Various caches and race condition issues (#194, #217, #209). + + +## 1.0 - 19 March 2019 + +The first major release of the Fyne toolkit delivers a stable release of the +main functionality required to build basic GUI applications across multiple +platforms. + +### Features + +* Canvas API (rect, line, circle, text, image) +* Widget API (box, button, check, entry, form, group, hyperlink, icon, label, progress bar, radio, scroller, tabs and toolbar) +* Light and dark themes +* Pointer, key and shortcut APIs (generic and desktop extension) +* OpenGL driver for Linux, macOS and Windows +* Tools for embedding data and packaging releases + diff --git a/vendor/fyne.io/fyne/v2/CODE_OF_CONDUCT.md b/vendor/fyne.io/fyne/v2/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..ccb6229 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at info@fyne.io. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/vendor/fyne.io/fyne/v2/CONTRIBUTING.md b/vendor/fyne.io/fyne/v2/CONTRIBUTING.md new file mode 100644 index 0000000..48aeeac --- /dev/null +++ b/vendor/fyne.io/fyne/v2/CONTRIBUTING.md @@ -0,0 +1,63 @@ +Thanks very much for your interest in contributing to Fyne! +The community is what makes this project successful and we are glad to welcome you on board. + +There are various ways to contribute, perhaps the following helps you know how to get started. + +## Reporting a bug + +If you've found something wrong we want to know about it, please help us understand the problem so we can resolve it. + +1. Check to see if this already is recorded, if so add some more information [issue list](https://github.com/fyne-io/fyne/issues) +2. If not then create a new issue using the [bug report template](https://github.com/fyne-io/fyne/issues/new?assignees=&labels=&template=bug_report.md&title=) +3. Stay involved in the conversation on the issue as it is triaged and progressed. + + +## Fixing an issue + +Great! You found an issue and figured you can fix it for us. +If you can follow these steps then your code should get accepted fast. + +1. Read through the "Contributing Code" section further down this page. +2. Write a unit test to show it is broken. +3. Create the fix and you should see the test passes. +4. Run the tests and make sure everything still works as expected using `go test ./...`. +5. [Open a PR](https://github.com/fyne-io/fyne/compare) and work through the review checklist. + + +## Adding a feature + +It's always good news to hear that people want to contribute functionality. +But first of all check that it fits within our [Vision](https://github.com/fyne-io/fyne/wiki/Vision) and if we are already considering it on our [Roadmap](https://github.com/fyne-io/fyne/wiki/Roadmap). +If you're not sure then you should join our #fyne-contributors channel on the [Gophers Slack server](https://gophers.slack.com/app_redirect?channel=fyne-contributors). + +Once you are ready to code then the following steps should give you a smooth process: + +1. Read through the [Contributing Code](#contributing-code) section further down this page. +2. Think about how you would structure your code and how it can be tested. +3. Write some code and enjoy the ease of writing Go code for even a complex project :). +4. Run the tests and make sure everything still works as expected using `go test ./...`. +5. [Open a PR](https://github.com/fyne-io/fyne/compare) and work through the review checklist. + + +# Contributing Code + +We aim to maintain a very high standard of code, through design, test and implementation. +To manage this we have various checks and processes in place that everyone should follow, including: + +* We use the Go standard format (with tabs not spaces) - you can run `gofmt` before committing +* Imports should be ordered according to the GoImports spec - you can use the `goimports` tool instead of `gofmt`. +* Everything should have a unit test attached (as much as possible, to keep our coverage up) + +For detailed Code style, check [Contributing](https://github.com/fyne-io/fyne/wiki/Contributing#code-style) in our wiki please. + +# Decision Process + +The following points apply to our decision making process: + +* Any decisions or votes will be opened on the #fyne-votes Slack channel and follows lazy consensus. +* Any contributors not responding in 4 days will be deemed in agreement. +* Any PR that has not been responded to within 7 days can be automatically approved. +* No functionality will be added unless at least 2 developers agree it belongs. + +Bear in mind that this is a cross platform project so any new features would normally +be required to work on multiple desktop and mobile platforms. diff --git a/vendor/fyne.io/fyne/v2/LICENSE b/vendor/fyne.io/fyne/v2/LICENSE new file mode 100644 index 0000000..c6cb658 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/LICENSE @@ -0,0 +1,28 @@ +BSD 3-Clause License + +Copyright (C) 2018 Fyne.io developers (see AUTHORS) +All rights reserved. + + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Fyne.io nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/vendor/fyne.io/fyne/v2/README.md b/vendor/fyne.io/fyne/v2/README.md new file mode 100644 index 0000000..c8a88fd --- /dev/null +++ b/vendor/fyne.io/fyne/v2/README.md @@ -0,0 +1,184 @@ +

+ Go API Reference + Latest Release + Join us on Slack +
+ Code Status + Build Status + Coverage Status +

+ +# About + +[Fyne](https://fyne.io) is an easy-to-use UI toolkit and app API written in Go. +It is designed to build applications that run on desktop and mobile devices with a +single codebase. + +# Prerequisites + +To develop apps using Fyne you will need Go version 1.17 or later, a C compiler and your system's development tools. +If you're not sure if that's all installed or you don't know how then check out our +[Getting Started](https://fyne.io/develop/) document. + +Using the standard go tools you can install Fyne's core library using: + + go get fyne.io/fyne/v2@latest + +After importing a new module, run the following command before compiling the code for the first time. Avoid running it before writing code that uses the module to prevent accidental removal of dependencies: + + go mod tidy + +# Widget demo + +To run a showcase of the features of Fyne execute the following: + + go install fyne.io/fyne/v2/cmd/fyne_demo@latest + fyne_demo + +And you should see something like this (after you click a few buttons): + +

+ Fyne Demo Dark Theme +

+ +Or if you are using the light theme: + +

+ Fyne Demo Light Theme +

+ +And even running on a mobile device: + +

+ Fyne Demo Mobile Light Theme +

+ +# Getting Started + +Fyne is designed to be really easy to code with. +If you have followed the prerequisite steps above then all you need is a +Go IDE (or a text editor). + +Open a new file and you're ready to write your first app! + +```go +package main + +import ( + "fyne.io/fyne/v2/app" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/widget" +) + +func main() { + a := app.New() + w := a.NewWindow("Hello") + + hello := widget.NewLabel("Hello Fyne!") + w.SetContent(container.NewVBox( + hello, + widget.NewButton("Hi!", func() { + hello.SetText("Welcome :)") + }), + )) + + w.ShowAndRun() +} +``` + +And you can run that simply as: + + go run main.go + +> [!NOTE] +> The first compilation of Fyne on Windows _can_ take up to 10 minutes, depending on your hardware. Subsequent builds will be fast. + +It should look like this: + +
+ + +
+ Fyne Hello Dark Theme + + Fyne Hello Dark Theme +
+
+ +## Run in mobile simulation + +There is a helpful mobile simulation mode that gives a hint of how your app would work on a mobile device: + + go run -tags mobile main.go + +Another option is to use `fyne` command, see [Packaging for mobile](#packaging-for-mobile). + +# Installing + +Using `go install` will copy the executable into your go `bin` dir. +To install the application with icons etc into your operating system's standard +application location you can use the fyne utility and the "install" subcommand. + + go install fyne.io/tools/cmd/fyne@latest + fyne install + +# Packaging for mobile + +To run on a mobile device it is necessary to package up the application. +To do this we can use the fyne utility "package" subcommand. +You will need to add appropriate parameters as prompted, but the basic command is shown below. +Once packaged you can install using the platform development tools or the fyne "install" subcommand. + + fyne package -os android -appID my.domain.appname + fyne install -os android + +The built Android application can run either in a real device or an Android emulator. +However, building for iOS is slightly different. +If the "-os" argument is "ios", it is build only for a real iOS device. +Specify "-os" to "iossimulator" allows the application be able to run in an iOS simulator: + + fyne package -os ios -appID my.domain.appname + fyne package -os iossimulator -appID my.domain.appname + +# Preparing a release + +Using the fyne utility "release" subcommand you can package up your app for release +to app stores and market places. Make sure you have the standard build tools installed +and have followed the platform documentation for setting up accounts and signing. +Then you can execute something like the following, notice the `-os ios` parameter allows +building an iOS app from macOS computer. Other combinations work as well :) + + $ fyne release -os ios -certificate "Apple Distribution" -profile "My App Distribution" -appID "com.example.myapp" + +The above command will create a '.ipa' file that can then be uploaded to the iOS App Store. + +# Documentation + +More documentation is available at the [Fyne developer website](https://developer.fyne.io/) or on [pkg.go.dev](https://pkg.go.dev/fyne.io/fyne/v2?tab=doc). + +# Examples + +You can find many example applications in the [examples repository](https://github.com/fyne-io/examples/). +Alternatively a list of applications using fyne can be found at [our website](https://apps.fyne.io/). + +# Shipping the Fyne Toolkit + +All Fyne apps will work without pre-installed libraries, this is one reason the apps are so portable. +However, if looking to support Fyne in a bigger way on your operating system then you can install some utilities that help to make a more complete experience. + +## Additional apps + +It is recommended that you install the following additional apps: + +| app | go install | description | +| ------------- | ----------------------------------- | ---------------------------------------------------------------------- | +| fyne_settings | `fyne.io/fyne/v2/cmd/fyne_settings` | A GUI for managing your global Fyne settings like theme and scaling | +| apps | `github.com/fyne-io/apps` | A graphical installer for the Fyne apps listed at https://apps.fyne.io | + +These are optional applications but can help to create a more complete desktop experience. + +## FyneDesk (Linux / BSD) + +To go all the way with Fyne on your desktop / laptop computer you could install [FyneDesk](https://github.com/fyshos/fynedesk) as well :) + +![FyneDesk screenshopt in dark mode](https://fyshos.com/img/desktop.png) diff --git a/vendor/fyne.io/fyne/v2/SECURITY.md b/vendor/fyne.io/fyne/v2/SECURITY.md new file mode 100644 index 0000000..5976dc4 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/SECURITY.md @@ -0,0 +1,15 @@ +# Security Policy + +## Supported Versions + +Minor releases will receive security updates and fixes until the next minor or major release. + +| Version | Supported | +| ------- | ------------------ | +| 2.6.x | :white_check_mark: | +| < 2.6.0 | :x: | + +## Reporting a Vulnerability + +Report security vulnerabilities using the [advisories](https://github.com/fyne-io/fyne/security/advisories) page on GitHub. +The team of core developers will evaluate and address the issue as appropriate. diff --git a/vendor/fyne.io/fyne/v2/animation.go b/vendor/fyne.io/fyne/v2/animation.go new file mode 100644 index 0000000..2883774 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/animation.go @@ -0,0 +1,84 @@ +package fyne + +import "time" + +// AnimationCurve represents an animation algorithm for calculating the progress through a timeline. +// Custom animations can be provided by implementing the "func(float32) float32" definition. +// The input parameter will start at 0.0 when an animation starts and travel up to 1.0 at which point it will end. +// A linear animation would return the same output value as is passed in. +type AnimationCurve func(float32) float32 + +// AnimationRepeatForever is an AnimationCount value that indicates it should not stop looping. +// +// Since: 2.0 +const AnimationRepeatForever = -1 + +var ( + // AnimationEaseInOut is the default easing, it starts slowly, accelerates to the middle and slows to the end. + // + // Since: 2.0 + AnimationEaseInOut = animationEaseInOut + // AnimationEaseIn starts slowly and accelerates to the end. + // + // Since: 2.0 + AnimationEaseIn = animationEaseIn + // AnimationEaseOut starts at speed and slows to the end. + // + // Since: 2.0 + AnimationEaseOut = animationEaseOut + // AnimationLinear is a linear mapping for animations that progress uniformly through their duration. + // + // Since: 2.0 + AnimationLinear = animationLinear +) + +// Animation represents an animated element within a Fyne canvas. +// These animations may control individual objects or entire scenes. +// +// Since: 2.0 +type Animation struct { + AutoReverse bool + Curve AnimationCurve + Duration time.Duration + RepeatCount int + Tick func(float32) +} + +// NewAnimation creates a very basic animation where the callback function will be called for every +// rendered frame between [time.Now] and the specified duration. The callback values start at 0.0 and +// will be 1.0 when the animation completes. +// +// Since: 2.0 +func NewAnimation(d time.Duration, fn func(float32)) *Animation { + return &Animation{Duration: d, Tick: fn} +} + +// Start registers the animation with the application run-loop and starts its execution. +func (a *Animation) Start() { + CurrentApp().Driver().StartAnimation(a) +} + +// Stop will end this animation and remove it from the run-loop. +func (a *Animation) Stop() { + CurrentApp().Driver().StopAnimation(a) +} + +func animationEaseIn(val float32) float32 { + return val * val +} + +func animationEaseInOut(val float32) float32 { + if val <= 0.5 { + return val * val * 2 + } + + return -1 + (4-val*2)*val +} + +func animationEaseOut(val float32) float32 { + return val * (2 - val) +} + +func animationLinear(val float32) float32 { + return val +} diff --git a/vendor/fyne.io/fyne/v2/app.go b/vendor/fyne.io/fyne/v2/app.go new file mode 100644 index 0000000..ef02a6e --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app.go @@ -0,0 +1,145 @@ +package fyne + +import ( + "net/url" + "sync/atomic" +) + +// An App is the definition of a graphical application. +// Apps can have multiple windows, by default they will exit when all windows +// have been closed. This can be modified using SetMaster or SetCloseIntercept. +// To start an application you need to call Run somewhere in your main function. +// Alternatively use the [fyne.io/fyne/v2.Window.ShowAndRun] function for your main window. +type App interface { + // Create a new window for the application. + // The first window to open is considered the "master" and when closed + // the application will exit. + NewWindow(title string) Window + + // Open a URL in the default browser application. + OpenURL(url *url.URL) error + + // Icon returns the application icon, this is used in various ways + // depending on operating system. + // This is also the default icon for new windows. + Icon() Resource + + // SetIcon sets the icon resource used for this application instance. + SetIcon(Resource) + + // Run the application - this starts the event loop and waits until [App.Quit] + // is called or the last window closes. + // This should be called near the end of a main() function as it will block. + Run() + + // Calling Quit on the application will cause the application to exit + // cleanly, closing all open windows. + // This function does no thing on a mobile device as the application lifecycle is + // managed by the operating system. + Quit() + + // Driver returns the driver that is rendering this application. + // Typically not needed for day to day work, mostly internal functionality. + Driver() Driver + + // UniqueID returns the application unique identifier, if set. + // This must be set for use of the [App.Preferences]. see [NewWithID]. + UniqueID() string + + // SendNotification sends a system notification that will be displayed in the operating system's notification area. + SendNotification(*Notification) + + // Settings return the globally set settings, determining theme and so on. + Settings() Settings + + // Preferences returns the application preferences, used for storing configuration and state + Preferences() Preferences + + // Storage returns a storage handler specific to this application. + Storage() Storage + + // Lifecycle returns a type that allows apps to hook in to lifecycle events. + // + // Since: 2.1 + Lifecycle() Lifecycle + + // Metadata returns the application metadata that was set at compile time. + // The items of metadata are available after "fyne package" or when running "go run" + // Building with "go build" may cause this to be unavailable. + // + // Since: 2.2 + Metadata() AppMetadata + + // CloudProvider returns the current app cloud provider, + // if one has been registered by the developer or chosen by the user. + // + // Since: 2.3 + CloudProvider() CloudProvider // get the (if any) configured provider + + // SetCloudProvider allows developers to specify how this application should integrate with cloud services. + // See [fyne.io/cloud] package for implementation details. + // + // Since: 2.3 + SetCloudProvider(CloudProvider) // configure cloud for this app + + // Clipboard returns the system clipboard. + // + // Since: 2.6 + Clipboard() Clipboard +} + +var app atomic.Pointer[App] + +// SetCurrentApp is an internal function to set the app instance currently running. +func SetCurrentApp(current App) { + app.Store(¤t) +} + +// CurrentApp returns the current application, for which there is only 1 per process. +func CurrentApp() App { + val := app.Load() + if val == nil { + LogError("Attempt to access current Fyne app when none is started", nil) + return nil + } + return *val +} + +// AppMetadata captures the build metadata for an application. +// +// Since: 2.2 +type AppMetadata struct { + // ID is the unique ID of this application, used by many distribution platforms. + ID string + // Name is the human friendly name of this app. + Name string + // Version represents the version of this application, normally following semantic versioning. + Version string + // Build is the build number of this app, some times appended to the version number. + Build int + // Icon contains, if present, a resource of the icon that was bundled at build time. + Icon Resource + // Release if true this binary was build in release mode + // Since: 2.3 + Release bool + // Custom contain the custom metadata defined either in FyneApp.toml or on the compile command line + // Since: 2.3 + Custom map[string]string + // Migrations allows an app to opt into features before they are standard + // Since: 2.6 + Migrations map[string]bool +} + +// Lifecycle represents the various phases that an app can transition through. +// +// Since: 2.1 +type Lifecycle interface { + // SetOnEnteredForeground hooks into the app becoming foreground and gaining focus. + SetOnEnteredForeground(func()) + // SetOnExitedForeground hooks into the app losing input focus and going into the background. + SetOnExitedForeground(func()) + // SetOnStarted hooks into an event that says the app is now running. + SetOnStarted(func()) + // SetOnStopped hooks into an event that says the app is no longer running. + SetOnStopped(func()) +} diff --git a/vendor/fyne.io/fyne/v2/app/app.go b/vendor/fyne.io/fyne/v2/app/app.go new file mode 100644 index 0000000..ceddf3c --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/app.go @@ -0,0 +1,190 @@ +// Package app provides app implementations for working with Fyne graphical interfaces. +// The fastest way to get started is to call app.New() which will normally load a new desktop application. +// If the "ci" tag is passed to go (go run -tags ci myapp.go) it will run an in-memory application. +package app // import "fyne.io/fyne/v2/app" + +import ( + "strconv" + "time" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal" + "fyne.io/fyne/v2/internal/app" + intRepo "fyne.io/fyne/v2/internal/repository" + "fyne.io/fyne/v2/storage" + "fyne.io/fyne/v2/storage/repository" +) + +// Declare conformity with App interface +var _ fyne.App = (*fyneApp)(nil) + +type fyneApp struct { + driver fyne.Driver + clipboard fyne.Clipboard + icon fyne.Resource + uniqueID string + + cloud fyne.CloudProvider + lifecycle app.Lifecycle + settings *settings + storage fyne.Storage + prefs fyne.Preferences +} + +func (a *fyneApp) CloudProvider() fyne.CloudProvider { + return a.cloud +} + +func (a *fyneApp) Icon() fyne.Resource { + if a.icon != nil { + return a.icon + } + + if a.Metadata().Icon == nil || len(a.Metadata().Icon.Content()) == 0 { + return nil + } + return a.Metadata().Icon +} + +func (a *fyneApp) SetIcon(icon fyne.Resource) { + a.icon = icon +} + +func (a *fyneApp) UniqueID() string { + if a.uniqueID != "" { + return a.uniqueID + } + if a.Metadata().ID != "" { + return a.Metadata().ID + } + + fyne.LogError("Preferences API requires a unique ID, use app.NewWithID() or the FyneApp.toml ID field", nil) + a.uniqueID = "missing-id-" + strconv.FormatInt(time.Now().Unix(), 10) // This is a fake unique - it just has to not be reused... + return a.uniqueID +} + +func (a *fyneApp) NewWindow(title string) fyne.Window { + return a.driver.CreateWindow(title) +} + +func (a *fyneApp) Run() { + go a.lifecycle.RunEventQueue(a.driver.DoFromGoroutine) + + if !a.driver.Device().IsMobile() { + a.settings.watchSettings() + } + + a.driver.Run() +} + +func (a *fyneApp) Quit() { + for _, window := range a.driver.AllWindows() { + window.Close() + } + + a.driver.Quit() + a.settings.stopWatching() +} + +func (a *fyneApp) Driver() fyne.Driver { + return a.driver +} + +// Settings returns the application settings currently configured. +func (a *fyneApp) Settings() fyne.Settings { + return a.settings +} + +func (a *fyneApp) Storage() fyne.Storage { + return a.storage +} + +func (a *fyneApp) Preferences() fyne.Preferences { + if a.UniqueID() == "" { + fyne.LogError("Preferences API requires a unique ID, use app.NewWithID() or the FyneApp.toml ID field", nil) + } + return a.prefs +} + +func (a *fyneApp) Lifecycle() fyne.Lifecycle { + return &a.lifecycle +} + +func (a *fyneApp) newDefaultPreferences() *preferences { + p := newPreferences(a) + if a.uniqueID != "" { + p.load() + } + return p +} + +func (a *fyneApp) Clipboard() fyne.Clipboard { + return a.clipboard +} + +// New returns a new application instance with the default driver and no unique ID (unless specified in FyneApp.toml) +func New() fyne.App { + if meta.ID == "" { + checkLocalMetadata() // if no ID passed, check if it was in toml + if meta.ID == "" { + internal.LogHint("Applications should be created with a unique ID using app.NewWithID()") + } + } + return NewWithID(meta.ID) +} + +func makeStoreDocs(id string, s *store) *internal.Docs { + if id == "" { + return &internal.Docs{} // an empty impl to avoid crashes + } + if root := s.a.storageRoot(); root != "" { + uri, err := storage.ParseURI(root) + if err != nil { + uri = storage.NewFileURI(root) + } + + exists, err := storage.Exists(uri) + if !exists || err != nil { + err = storage.CreateListable(uri) + if err != nil { + fyne.LogError("Failed to create app storage space", err) + } + } + + root, _ := s.docRootURI() + return &internal.Docs{RootDocURI: root} + } else { + return &internal.Docs{} // an empty impl to avoid crashes + } +} + +func newAppWithDriver(d fyne.Driver, clipboard fyne.Clipboard, id string) fyne.App { + newApp := &fyneApp{uniqueID: id, clipboard: clipboard, driver: d} + fyne.SetCurrentApp(newApp) + + newApp.prefs = newApp.newDefaultPreferences() + newApp.lifecycle.InitEventQueue() + newApp.lifecycle.SetOnStoppedHookExecuted(func() { + if prefs, ok := newApp.prefs.(*preferences); ok { + prefs.forceImmediateSave() + } + }) + + newApp.registerRepositories() // for web this may provide docs / settings + newApp.settings = loadSettings() + store := &store{a: newApp} + store.Docs = makeStoreDocs(id, store) + newApp.storage = store + + httpHandler := intRepo.NewHTTPRepository() + repository.Register("http", httpHandler) + repository.Register("https", httpHandler) + return newApp +} + +// marker interface to pass system tray to supporting drivers +type systrayDriver interface { + SetSystemTrayMenu(*fyne.Menu) + SetSystemTrayIcon(fyne.Resource) + SetSystemTrayWindow(fyne.Window) +} diff --git a/vendor/fyne.io/fyne/v2/app/app_darwin.go b/vendor/fyne.io/fyne/v2/app/app_darwin.go new file mode 100644 index 0000000..3896ef9 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/app_darwin.go @@ -0,0 +1,60 @@ +//go:build !ci && !wasm && !test_web_driver && !mobile && !tinygo + +package app + +/* +#cgo CFLAGS: -x objective-c +#cgo LDFLAGS: -framework Foundation + +#include +#include + +bool isBundled(); +void sendNotification(char *title, char *content); +*/ +import "C" + +import ( + "fmt" + "os/exec" + "strings" + "unsafe" + + "fyne.io/fyne/v2" +) + +func (a *fyneApp) SendNotification(n *fyne.Notification) { + if C.isBundled() { + titleStr := C.CString(n.Title) + defer C.free(unsafe.Pointer(titleStr)) + contentStr := C.CString(n.Content) + defer C.free(unsafe.Pointer(contentStr)) + + C.sendNotification(titleStr, contentStr) + return + } + + fallbackNotification(n.Title, n.Content) +} + +func escapeNotificationString(in string) string { + noSlash := strings.ReplaceAll(in, "\\", "\\\\") + return strings.ReplaceAll(noSlash, "\"", "\\\"") +} + +//export fallbackSend +func fallbackSend(cTitle, cContent *C.char) { + title := C.GoString(cTitle) + content := C.GoString(cContent) + fallbackNotification(title, content) +} + +func fallbackNotification(title, content string) { + template := `display notification "%s" with title "%s"` + script := fmt.Sprintf(template, escapeNotificationString(content), escapeNotificationString(title)) + + err := exec.Command("osascript", "-e", script).Start() + if err != nil { + fyne.LogError("Failed to launch darwin notify script", err) + } +} diff --git a/vendor/fyne.io/fyne/v2/app/app_darwin.m b/vendor/fyne.io/fyne/v2/app/app_darwin.m new file mode 100644 index 0000000..443060c --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/app_darwin.m @@ -0,0 +1,60 @@ +//go:build !ci && !wasm && !test_web_driver && !mobile + +#import +#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 101400 || TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR +#import +#endif + +static int notifyNum = 0; + +extern void fallbackSend(char *cTitle, char *cBody); + +bool isBundled() { + return [[NSBundle mainBundle] bundleIdentifier] != nil; +} + +#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 101400 || TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR +void doSendNotification(UNUserNotificationCenter *center, NSString *title, NSString *body) { + UNMutableNotificationContent *content = [UNMutableNotificationContent new]; + [content autorelease]; + content.title = title; + content.body = body; + + notifyNum++; + NSString *identifier = [NSString stringWithFormat:@"fyne-notify-%d", notifyNum]; + UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:identifier + content:content trigger:nil]; + + [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) { + if (error != nil) { + NSLog(@"Could not send notification: %@", error); + } + }]; +} + +void sendNotification(char *cTitle, char *cBody) { + UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; + NSString *title = [NSString stringWithUTF8String:cTitle]; + NSString *body = [NSString stringWithUTF8String:cBody]; + + UNAuthorizationOptions options = UNAuthorizationOptionAlert; + [center requestAuthorizationWithOptions:options + completionHandler:^(BOOL granted, NSError *_Nullable error) { + if (!granted) { + if (error != NULL) { + NSLog(@"Error asking for permission to send notifications %@", error); + // this happens if our app was not signed, so do it the old way + fallbackSend((char *)[title UTF8String], (char *)[body UTF8String]); + } else { + NSLog(@"Unable to get permission to send notifications"); + } + } else { + doSendNotification(center, title, body); + } + }]; +} +#else +void sendNotification(char *cTitle, char *cBody) { + fallbackSend(cTitle, cBody); +} +#endif diff --git a/vendor/fyne.io/fyne/v2/app/app_desktop_darwin.go b/vendor/fyne.io/fyne/v2/app/app_desktop_darwin.go new file mode 100644 index 0000000..3828d8c --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/app_desktop_darwin.go @@ -0,0 +1,61 @@ +//go:build !ci && !ios && !wasm && !test_web_driver && !mobile + +package app + +/* +#cgo CFLAGS: -x objective-c +#cgo LDFLAGS: -framework Foundation + +#include + +bool isBundled(); +void watchTheme(); +*/ +import "C" + +import ( + "net/url" + "os" + "os/exec" + + "fyne.io/fyne/v2" +) + +func (a *fyneApp) OpenURL(url *url.URL) error { + cmd := exec.Command("open", url.String()) + cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr + return cmd.Run() +} + +// SetSystemTrayIcon sets a custom image for the system tray icon. +// You should have previously called `SetSystemTrayMenu` to initialise the menu icon. +func (a *fyneApp) SetSystemTrayIcon(icon fyne.Resource) { + a.Driver().(systrayDriver).SetSystemTrayIcon(icon) +} + +// SetSystemTrayMenu creates a system tray item and attaches the specified menu. +// By default, this will use the application icon. +func (a *fyneApp) SetSystemTrayMenu(menu *fyne.Menu) { + if desk, ok := a.Driver().(systrayDriver); ok { + desk.SetSystemTrayMenu(menu) + } +} + +// SetSystemTrayWindow assigns a window to be shown with the system tray menu is tapped. +// You should have previously called `SetSystemTrayMenu` to initialise the menu icon. +func (a *fyneApp) SetSystemTrayWindow(w fyne.Window) { + a.Driver().(systrayDriver).SetSystemTrayWindow(w) +} + +//export themeChanged +func themeChanged() { + fyne.CurrentApp().Settings().(*settings).setupTheme() +} + +func watchTheme(_ *settings) { + C.watchTheme() +} + +func (a *fyneApp) registerRepositories() { + // no-op +} diff --git a/vendor/fyne.io/fyne/v2/app/app_desktop_darwin.m b/vendor/fyne.io/fyne/v2/app/app_desktop_darwin.m new file mode 100644 index 0000000..3067f3f --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/app_desktop_darwin.m @@ -0,0 +1,12 @@ +//go:build !ci && !ios && !wasm && !test_web_driver && !mobile + +extern void themeChanged(); + +#import + +void watchTheme() { + [[NSDistributedNotificationCenter defaultCenter] addObserverForName:@"AppleInterfaceThemeChangedNotification" object:nil queue:nil + usingBlock:^(NSNotification *note) { + themeChanged(); // calls back into Go + }]; +} diff --git a/vendor/fyne.io/fyne/v2/app/app_gl.go b/vendor/fyne.io/fyne/v2/app/app_gl.go new file mode 100644 index 0000000..052b3b9 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/app_gl.go @@ -0,0 +1,14 @@ +//go:build !ci && !android && !ios && !mobile && !tamago && !noos && !tinygo + +package app + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/driver/glfw" +) + +// NewWithID returns a new app instance using the appropriate runtime driver. +// The ID string should be globally unique to this app. +func NewWithID(id string) fyne.App { + return newAppWithDriver(glfw.NewGLDriver(), glfw.NewClipboard(), id) +} diff --git a/vendor/fyne.io/fyne/v2/app/app_mobile.go b/vendor/fyne.io/fyne/v2/app/app_mobile.go new file mode 100644 index 0000000..8d277c2 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/app_mobile.go @@ -0,0 +1,26 @@ +//go:build !ci && (android || ios || mobile) + +package app + +import ( + "fyne.io/fyne/v2" + internalapp "fyne.io/fyne/v2/internal/app" + "fyne.io/fyne/v2/internal/driver/mobile" +) + +// NewWithID returns a new app instance using the appropriate runtime driver. +// The ID string should be globally unique to this app. +func NewWithID(id string) fyne.App { + d := mobile.NewGoMobileDriver() + a := newAppWithDriver(d, mobile.NewClipboard(), id) + d.(mobile.ConfiguredDriver).SetOnConfigurationChanged(func(c *mobile.Configuration) { + internalapp.SystemTheme = c.SystemTheme + + a.Settings().(*settings).setupTheme() + }) + return a +} + +func (a *fyneApp) registerRepositories() { + // no-op +} diff --git a/vendor/fyne.io/fyne/v2/app/app_mobile_and.c b/vendor/fyne.io/fyne/v2/app/app_mobile_and.c new file mode 100644 index 0000000..a21e330 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/app_mobile_and.c @@ -0,0 +1,130 @@ +//go:build !ci && android + +#include +#include +#include +#include + +#define LOG_FATAL(...) __android_log_print(ANDROID_LOG_FATAL, "Fyne", __VA_ARGS__) + +static jclass find_class(JNIEnv *env, const char *class_name) { + jclass clazz = (*env)->FindClass(env, class_name); + if (clazz == NULL) { + (*env)->ExceptionClear(env); + LOG_FATAL("cannot find %s", class_name); + return NULL; + } + return clazz; +} + +static jmethodID find_method(JNIEnv *env, jclass clazz, const char *name, const char *sig) { + jmethodID m = (*env)->GetMethodID(env, clazz, name, sig); + if (m == 0) { + (*env)->ExceptionClear(env); + LOG_FATAL("cannot find method %s %s", name, sig); + return 0; + } + return m; +} + +static jmethodID find_static_method(JNIEnv *env, jclass clazz, const char *name, const char *sig) { + jmethodID m = (*env)->GetStaticMethodID(env, clazz, name, sig); + if (m == 0) { + (*env)->ExceptionClear(env); + LOG_FATAL("cannot find method %s %s", name, sig); + return 0; + } + return m; +} + +jobject getSystemService(uintptr_t jni_env, uintptr_t ctx, char *service) { + JNIEnv *env = (JNIEnv*)jni_env; + jstring serviceStr = (*env)->NewStringUTF(env, service); + + jclass ctxClass = (*env)->GetObjectClass(env, (jobject)ctx); + jmethodID getSystemService = find_method(env, ctxClass, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;"); + + return (jobject)(*env)->CallObjectMethod(env, (jobject)ctx, getSystemService, serviceStr); +} + +int nextId = 1; + +bool isOreoOrLater(JNIEnv *env) { + jclass versionClass = find_class(env, "android/os/Build$VERSION" ); + jfieldID sdkIntFieldID = (*env)->GetStaticFieldID(env, versionClass, "SDK_INT", "I" ); + int sdkVersion = (*env)->GetStaticIntField(env, versionClass, sdkIntFieldID ); + + return sdkVersion >= 26; // O = Oreo, will not be defined for older builds +} + +jobject parseURL(uintptr_t jni_env, uintptr_t ctx, char* uriCstr) { + JNIEnv *env = (JNIEnv*)jni_env; + + jstring uriStr = (*env)->NewStringUTF(env, uriCstr); + jclass uriClass = find_class(env, "android/net/Uri"); + jmethodID parse = find_static_method(env, uriClass, "parse", "(Ljava/lang/String;)Landroid/net/Uri;"); + + return (jobject)(*env)->CallStaticObjectMethod(env, uriClass, parse, uriStr); +} + +void openURL(uintptr_t java_vm, uintptr_t jni_env, uintptr_t ctx, char *url) { + JNIEnv *env = (JNIEnv*)jni_env; + jobject uri = parseURL(jni_env, ctx, url); + + jclass intentClass = find_class(env, "android/content/Intent"); + jfieldID viewFieldID = (*env)->GetStaticFieldID(env, intentClass, "ACTION_VIEW", "Ljava/lang/String;" ); + jstring view = (*env)->GetStaticObjectField(env, intentClass, viewFieldID); + + jmethodID constructor = find_method(env, intentClass, "", "(Ljava/lang/String;Landroid/net/Uri;)V"); + jobject intent = (*env)->NewObject(env, intentClass, constructor, view, uri); + + jclass contextClass = find_class(env, "android/content/Context"); + jmethodID start = find_method(env, contextClass, "startActivity", "(Landroid/content/Intent;)V"); + (*env)->CallVoidMethod(env, (jobject)ctx, start, intent); +} + +void sendNotification(uintptr_t java_vm, uintptr_t jni_env, uintptr_t ctx, char *title, char *body) { + JNIEnv *env = (JNIEnv*)jni_env; + jstring titleStr = (*env)->NewStringUTF(env, title); + jstring bodyStr = (*env)->NewStringUTF(env, body); + + jclass cls = find_class(env, "android/app/Notification$Builder"); + jmethodID constructor = find_method(env, cls, "", "(Landroid/content/Context;)V"); + jobject builder = (*env)->NewObject(env, cls, constructor, ctx); + + jclass mgrCls = find_class(env, "android/app/NotificationManager"); + jobject mgr = getSystemService((uintptr_t)env, ctx, "notification"); + + if (isOreoOrLater(env)) { + jstring channelId = (*env)->NewStringUTF(env, "fyne-notif"); + jstring name = (*env)->NewStringUTF(env, "Fyne Notification"); + int importance = 4; // IMPORTANCE_HIGH + + jclass chanCls = find_class(env, "android/app/NotificationChannel"); + jmethodID constructor = find_method(env, chanCls, "", "(Ljava/lang/String;Ljava/lang/CharSequence;I)V"); + jobject channel = (*env)->NewObject(env, chanCls, constructor, channelId, name, importance); + + jmethodID createChannel = find_method(env, mgrCls, "createNotificationChannel", "(Landroid/app/NotificationChannel;)V"); + (*env)->CallVoidMethod(env, mgr, createChannel, channel); + + jmethodID setChannelId = find_method(env, cls, "setChannelId", "(Ljava/lang/String;)Landroid/app/Notification$Builder;"); + (*env)->CallObjectMethod(env, builder, setChannelId, channelId); + } + + jmethodID setContentTitle = find_method(env, cls, "setContentTitle", "(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;"); + (*env)->CallObjectMethod(env, builder, setContentTitle, titleStr); + + jmethodID setContentText = find_method(env, cls, "setContentText", "(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;"); + (*env)->CallObjectMethod(env, builder, setContentText, bodyStr); + + int iconID = 17629184; // constant of "unknown app icon" + jmethodID setSmallIcon = find_method(env, cls, "setSmallIcon", "(I)Landroid/app/Notification$Builder;"); + (*env)->CallObjectMethod(env, builder, setSmallIcon, iconID); + + jmethodID build = find_method(env, cls, "build", "()Landroid/app/Notification;"); + jobject notif = (*env)->CallObjectMethod(env, builder, build); + + jmethodID notify = find_method(env, mgrCls, "notify", "(ILandroid/app/Notification;)V"); + (*env)->CallVoidMethod(env, mgr, notify, nextId, notif); + nextId++; +} diff --git a/vendor/fyne.io/fyne/v2/app/app_mobile_and.go b/vendor/fyne.io/fyne/v2/app/app_mobile_and.go new file mode 100644 index 0000000..3b03e72 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/app_mobile_and.go @@ -0,0 +1,44 @@ +//go:build !ci && android + +package app + +/* +#cgo LDFLAGS: -landroid -llog + +#include + +void openURL(uintptr_t java_vm, uintptr_t jni_env, uintptr_t ctx, char *url); +void sendNotification(uintptr_t java_vm, uintptr_t jni_env, uintptr_t ctx, char *title, char *content); +*/ +import "C" + +import ( + "net/url" + "unsafe" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/driver/mobile/app" +) + +func (a *fyneApp) OpenURL(url *url.URL) error { + urlStr := C.CString(url.String()) + defer C.free(unsafe.Pointer(urlStr)) + + app.RunOnJVM(func(vm, env, ctx uintptr) error { + C.openURL(C.uintptr_t(vm), C.uintptr_t(env), C.uintptr_t(ctx), urlStr) + return nil + }) + return nil +} + +func (a *fyneApp) SendNotification(n *fyne.Notification) { + titleStr := C.CString(n.Title) + defer C.free(unsafe.Pointer(titleStr)) + contentStr := C.CString(n.Content) + defer C.free(unsafe.Pointer(contentStr)) + + app.RunOnJVM(func(vm, env, ctx uintptr) error { + C.sendNotification(C.uintptr_t(vm), C.uintptr_t(env), C.uintptr_t(ctx), titleStr, contentStr) + return nil + }) +} diff --git a/vendor/fyne.io/fyne/v2/app/app_mobile_ios.go b/vendor/fyne.io/fyne/v2/app/app_mobile_ios.go new file mode 100644 index 0000000..51ac509 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/app_mobile_ios.go @@ -0,0 +1,27 @@ +//go:build !ci && ios && !mobile + +package app + +/* +#cgo CFLAGS: -x objective-c +#cgo LDFLAGS: -framework Foundation -framework UIKit -framework UserNotifications + +#include + +void openURL(char *urlStr); +void sendNotification(char *title, char *content); +*/ +import "C" + +import ( + "net/url" + "unsafe" +) + +func (a *fyneApp) OpenURL(url *url.URL) error { + urlStr := C.CString(url.String()) + C.openURL(urlStr) + C.free(unsafe.Pointer(urlStr)) + + return nil +} diff --git a/vendor/fyne.io/fyne/v2/app/app_mobile_ios.m b/vendor/fyne.io/fyne/v2/app/app_mobile_ios.m new file mode 100644 index 0000000..bfdbfeb --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/app_mobile_ios.m @@ -0,0 +1,10 @@ +//go:build !ci && ios + +#import + +void openURL(char *urlStr) { + UIApplication *app = [UIApplication sharedApplication]; + NSURL *url = [NSURL URLWithString:[NSString stringWithUTF8String:urlStr]]; + [app openURL:url options:@{} completionHandler:nil]; +} + diff --git a/vendor/fyne.io/fyne/v2/app/app_mobile_xdg.go b/vendor/fyne.io/fyne/v2/app/app_mobile_xdg.go new file mode 100644 index 0000000..232e1d9 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/app_mobile_xdg.go @@ -0,0 +1,22 @@ +//go:build !ci && mobile && !android && !ios + +package app + +import ( + "errors" + "net/url" + + "fyne.io/fyne/v2" +) + +func (a *fyneApp) OpenURL(_ *url.URL) error { + return errors.New("mobile simulator does not support open URLs yet") +} + +func (a *fyneApp) SendNotification(_ *fyne.Notification) { + fyne.LogError("Notifications are not supported in the mobile simulator yet", nil) +} + +func watchTheme(_ *settings) { + // not implemented yet +} diff --git a/vendor/fyne.io/fyne/v2/app/app_noos.go b/vendor/fyne.io/fyne/v2/app/app_noos.go new file mode 100644 index 0000000..0af08ca --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/app_noos.go @@ -0,0 +1,23 @@ +//go:build tamago || noos || tinygo + +package app + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/driver/embedded" + intNoos "fyne.io/fyne/v2/internal/driver/embedded" + "fyne.io/fyne/v2/theme" +) + +func NewWithID(id string) fyne.App { + return newAppWithDriver(nil, nil, id) +} + +// SetDriverDetails provides the required information to our app to run without a standard +// driver. This is useful for embedded devices like GOOS=tamago, tinygo or noos. +// +// Since: 2.7 +func SetDriverDetails(a fyne.App, d embedded.Driver) { + a.(*fyneApp).Settings().SetTheme(theme.DefaultTheme()) + a.(*fyneApp).driver = intNoos.NewNoOSDriver(d.Render, d.Run, d.Queue(), d.ScreenSize) +} diff --git a/vendor/fyne.io/fyne/v2/app/app_notlegacy_darwin.go b/vendor/fyne.io/fyne/v2/app/app_notlegacy_darwin.go new file mode 100644 index 0000000..f1c065e --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/app_notlegacy_darwin.go @@ -0,0 +1,8 @@ +//go:build !ci && !legacy && !wasm && !test_web_driver + +package app + +/* +#cgo LDFLAGS: -framework Foundation -framework UserNotifications +*/ +import "C" diff --git a/vendor/fyne.io/fyne/v2/app/app_openurl_wasm.go b/vendor/fyne.io/fyne/v2/app/app_openurl_wasm.go new file mode 100644 index 0000000..c92224d --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/app_openurl_wasm.go @@ -0,0 +1,18 @@ +//go:build !ci && wasm + +package app + +import ( + "fmt" + "net/url" + "syscall/js" +) + +func (a *fyneApp) OpenURL(url *url.URL) error { + window := js.Global().Call("open", url.String(), "_blank", "") + if window.Equal(js.Null()) { + return fmt.Errorf("Unable to open a new window/tab for URL: %v.", url) + } + window.Call("focus") + return nil +} diff --git a/vendor/fyne.io/fyne/v2/app/app_openurl_web.go b/vendor/fyne.io/fyne/v2/app/app_openurl_web.go new file mode 100644 index 0000000..29b5a18 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/app_openurl_web.go @@ -0,0 +1,12 @@ +//go:build !ci && !wasm && test_web_driver + +package app + +import ( + "errors" + "net/url" +) + +func (a *fyneApp) OpenURL(url *url.URL) error { + return errors.New("OpenURL is not supported with the test web driver.") +} diff --git a/vendor/fyne.io/fyne/v2/app/app_other.go b/vendor/fyne.io/fyne/v2/app/app_other.go new file mode 100644 index 0000000..645720e --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/app_other.go @@ -0,0 +1,26 @@ +//go:build ci || (!ios && !android && !linux && !darwin && !windows && !freebsd && !openbsd && !netbsd && !wasm && !test_web_driver) || tamago || noos || tinygo + +package app + +import ( + "errors" + "net/url" + + "fyne.io/fyne/v2" +) + +func (a *fyneApp) OpenURL(_ *url.URL) error { + return errors.New("unable to open url for unknown operating system") +} + +func (a *fyneApp) SendNotification(_ *fyne.Notification) { + fyne.LogError("Refusing to show notification for unknown operating system", nil) +} + +func watchTheme(_ *settings) { + // no-op +} + +func (a *fyneApp) registerRepositories() { + // no-op +} diff --git a/vendor/fyne.io/fyne/v2/app/app_software.go b/vendor/fyne.io/fyne/v2/app/app_software.go new file mode 100644 index 0000000..2821ce9 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/app_software.go @@ -0,0 +1,15 @@ +//go:build ci + +package app + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/painter/software" + "fyne.io/fyne/v2/test" +) + +// NewWithID returns a new app instance using the test (headless) driver. +// The ID string should be globally unique to this app. +func NewWithID(id string) fyne.App { + return newAppWithDriver(test.NewDriverWithPainter(software.NewPainter()), test.NewClipboard(), id) +} diff --git a/vendor/fyne.io/fyne/v2/app/app_wasm.go b/vendor/fyne.io/fyne/v2/app/app_wasm.go new file mode 100644 index 0000000..5c3ac54 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/app_wasm.go @@ -0,0 +1,75 @@ +//go:build !ci && (!android || !ios || !mobile) && (wasm || test_web_driver) + +package app + +import ( + "encoding/base64" + "fmt" + "net/http" + "syscall/js" + + "fyne.io/fyne/v2" + intRepo "fyne.io/fyne/v2/internal/repository" + "fyne.io/fyne/v2/storage/repository" +) + +func (a *fyneApp) SendNotification(n *fyne.Notification) { + notification := js.Global().Get("window").Get("Notification") + if notification.IsUndefined() { + fyne.LogError("Current browser does not support notifications.", nil) + return + } + + permission := notification.Get("permission") + if permission.Type() != js.TypeString || permission.String() != "granted" { + request := js.FuncOf(func(this js.Value, args []js.Value) any { + if len(args) > 0 && args[0].Type() == js.TypeString && args[0].String() == "granted" { + a.showNotification(n, ¬ification) + } else { + fyne.LogError("User rejected the request for notifications.", nil) + } + return nil + }) + defer request.Release() + notification.Call("requestPermission", request) + return + } + + a.showNotification(n, ¬ification) +} + +func (a *fyneApp) showNotification(data *fyne.Notification, notification *js.Value) { + icon := a.icon.Content() + base64Str := base64.StdEncoding.EncodeToString(icon) + mimeType := http.DetectContentType(icon) + base64Img := fmt.Sprintf("data:%s;base64,%s", mimeType, base64Str) + notification.New(data.Title, map[string]any{ + "body": data.Content, + "icon": base64Img, + }) +} + +var themeChanged = js.FuncOf(func(this js.Value, args []js.Value) any { + if len(args) > 0 && args[0].Type() == js.TypeObject { + fyne.CurrentApp().Settings().(*settings).setupTheme() + } + return nil +}) + +func watchTheme(_ *settings) { + js.Global().Call("matchMedia", "(prefers-color-scheme: dark)").Call("addEventListener", "change", themeChanged) +} + +func stopWatchingTheme() { + js.Global().Call("matchMedia", "(prefers-color-scheme: dark)").Call("removeEventListener", "change", themeChanged) +} + +func (a *fyneApp) registerRepositories() { + repo, err := intRepo.NewIndexDBRepository() + if err != nil { + fyne.LogError("failed to create repository: %v", err) + return + } + + repository.Register("idbfile", repo) +} diff --git a/vendor/fyne.io/fyne/v2/app/app_windows.go b/vendor/fyne.io/fyne/v2/app/app_windows.go new file mode 100644 index 0000000..cc12e36 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/app_windows.go @@ -0,0 +1,106 @@ +//go:build !ci && !android && !ios && !wasm && !test_web_driver && !tinygo + +package app + +import ( + "fmt" + "net/url" + "os" + "os/exec" + "path/filepath" + "strings" + "syscall" + + "fyne.io/fyne/v2" + internalapp "fyne.io/fyne/v2/internal/app" +) + +const notificationTemplate = `$title = "%s" +$content = "%s" +$iconPath = "file:///%s" +[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] > $null +$template = [Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent([Windows.UI.Notifications.ToastTemplateType]::ToastImageAndText02) +$toastXml = [xml] $template.GetXml() +$toastXml.GetElementsByTagName("text")[0].AppendChild($toastXml.CreateTextNode($title)) > $null +$toastXml.GetElementsByTagName("text")[1].AppendChild($toastXml.CreateTextNode($content)) > $null +$toastXml.GetElementsByTagName("image")[0].SetAttribute("src", $iconPath) > $null +$xml = New-Object Windows.Data.Xml.Dom.XmlDocument +$xml.LoadXml($toastXml.OuterXml) +$toast = [Windows.UI.Notifications.ToastNotification]::new($xml) +[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier("%s").Show($toast);` + +func (a *fyneApp) OpenURL(url *url.URL) error { + cmd := exec.Command("rundll32", "url.dll,FileProtocolHandler", url.String()) + cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr + return cmd.Run() +} + +var scriptNum = 0 + +func (a *fyneApp) SendNotification(n *fyne.Notification) { + title := escapeNotificationString(n.Title) + content := escapeNotificationString(n.Content) + iconFilePath := a.cachedIconPath() + appID := a.UniqueID() + if appID == "" || strings.Index(appID, "missing-id") == 0 { + appID = a.Metadata().Name + } + + script := fmt.Sprintf(notificationTemplate, title, content, iconFilePath, appID) + go runScript("notify", script) +} + +// SetSystemTrayMenu creates a system tray item and attaches the specified menu. +// By default, this will use the application icon. +func (a *fyneApp) SetSystemTrayMenu(menu *fyne.Menu) { + a.Driver().(systrayDriver).SetSystemTrayMenu(menu) +} + +// SetSystemTrayIcon sets a custom image for the system tray icon. +// You should have previously called `SetSystemTrayMenu` to initialise the menu icon. +func (a *fyneApp) SetSystemTrayIcon(icon fyne.Resource) { + a.Driver().(systrayDriver).SetSystemTrayIcon(icon) +} + +// SetSystemTrayWindow assigns a window to be shown with the system tray menu is tapped. +// You should have previously called `SetSystemTrayMenu` to initialise the menu icon. +func (a *fyneApp) SetSystemTrayWindow(w fyne.Window) { + a.Driver().(systrayDriver).SetSystemTrayWindow(w) +} + +func escapeNotificationString(in string) string { + noSlash := strings.ReplaceAll(in, "`", "``") + return strings.ReplaceAll(noSlash, "\"", "`\"") +} + +func runScript(name, script string) { + scriptNum++ + appID := fyne.CurrentApp().UniqueID() + fileName := fmt.Sprintf("fyne-%s-%s-%d.ps1", appID, name, scriptNum) + + tmpFilePath := filepath.Join(os.TempDir(), fileName) + err := os.WriteFile(tmpFilePath, []byte(script), 0o600) + if err != nil { + fyne.LogError("Could not write script to show notification", err) + return + } + defer os.Remove(tmpFilePath) + + launch := "(Get-Content -Encoding UTF8 -Path " + tmpFilePath + " -Raw) | Invoke-Expression" + cmd := exec.Command("PowerShell", "-ExecutionPolicy", "Bypass", launch) + cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} + err = cmd.Run() + if err != nil { + fyne.LogError("Failed to launch windows notify script", err) + } +} + +func watchTheme(s *settings) { + go internalapp.WatchTheme(func() { + fyne.Do(s.setupTheme) + }) +} + +func (a *fyneApp) registerRepositories() { + // no-op +} diff --git a/vendor/fyne.io/fyne/v2/app/app_xdg.go b/vendor/fyne.io/fyne/v2/app/app_xdg.go new file mode 100644 index 0000000..edc1f2b --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/app_xdg.go @@ -0,0 +1,150 @@ +//go:build !ci && !wasm && !test_web_driver && !android && !ios && !mobile && (linux || openbsd || freebsd || netbsd) && !tinygo && !noos && !tamago + +package app + +import ( + "net/url" + "os" + "os/exec" + "sync/atomic" + + "github.com/godbus/dbus/v5" + "github.com/rymdport/portal/notification" + "github.com/rymdport/portal/openuri" + portalSettings "github.com/rymdport/portal/settings" + "github.com/rymdport/portal/settings/appearance" + + "fyne.io/fyne/v2" + internalapp "fyne.io/fyne/v2/internal/app" + "fyne.io/fyne/v2/internal/build" + "fyne.io/fyne/v2/theme" +) + +const systemTheme = fyne.ThemeVariant(99) + +func (a *fyneApp) OpenURL(url *url.URL) error { + if build.IsFlatpak { + err := openuri.OpenURI("", url.String(), nil) + if err != nil { + fyne.LogError("Opening url in portal failed", err) + } + return err + } + + cmd := exec.Command("xdg-open", url.String()) + cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr + return cmd.Start() +} + +// fetch color variant from dbus portal desktop settings. +func findFreedesktopColorScheme() fyne.ThemeVariant { + colorScheme, err := appearance.GetColorScheme() + if err != nil { + return systemTheme + } + + return colorSchemeToThemeVariant(colorScheme) +} + +func colorSchemeToThemeVariant(colorScheme appearance.ColorScheme) fyne.ThemeVariant { + switch colorScheme { + case appearance.Light: + return theme.VariantLight + case appearance.Dark: + return theme.VariantDark + } + + // Default to light theme to support Gnome's default see https://github.com/fyne-io/fyne/pull/3561 + return theme.VariantLight +} + +func (a *fyneApp) SendNotification(n *fyne.Notification) { + if build.IsFlatpak { + err := a.sendNotificationThroughPortal(n) + if err != nil { + fyne.LogError("Sending notification using portal failed", err) + } + return + } + + conn, err := dbus.SessionBus() // shared connection, don't close + if err != nil { + fyne.LogError("Unable to connect to session D-Bus", err) + return + } + + appIcon := a.cachedIconPath() + timeout := int32(0) // we don't support this yet + + obj := conn.Object("org.freedesktop.Notifications", "/org/freedesktop/Notifications") + call := obj.Call("org.freedesktop.Notifications.Notify", 0, a.uniqueID, uint32(0), + appIcon, n.Title, n.Content, []string{}, map[string]dbus.Variant{}, timeout) + if call.Err != nil { + fyne.LogError("Failed to send message to bus", call.Err) + } +} + +// Sending with same ID replaces the old notification. +var notificationID atomic.Uint64 + +// See https://flatpak.github.io/xdg-desktop-portal/docs/#gdbus-org.freedesktop.portal.Notification. +func (a *fyneApp) sendNotificationThroughPortal(n *fyne.Notification) error { + return notification.Add( + uint(notificationID.Add(1)), + notification.Content{ + Title: n.Title, + Body: n.Content, + Icon: a.uniqueID, + }, + ) +} + +// SetSystemTrayMenu creates a system tray item and attaches the specified menu. +// By default, this will use the application icon. +func (a *fyneApp) SetSystemTrayMenu(menu *fyne.Menu) { + if desk, ok := a.Driver().(systrayDriver); ok { // don't use this on mobile tag + desk.SetSystemTrayMenu(menu) + } +} + +// SetSystemTrayIcon sets a custom image for the system tray icon. +// You should have previously called `SetSystemTrayMenu` to initialise the menu icon. +func (a *fyneApp) SetSystemTrayIcon(icon fyne.Resource) { + if desk, ok := a.Driver().(systrayDriver); ok { // don't use this on mobile tag + desk.SetSystemTrayIcon(icon) + } +} + +// SetSystemTrayWindow assigns a window to be shown with the system tray menu is tapped. +// You should have previously called `SetSystemTrayMenu` to initialise the menu icon. +func (a *fyneApp) SetSystemTrayWindow(w fyne.Window) { + a.Driver().(systrayDriver).SetSystemTrayWindow(w) +} + +func watchTheme(s *settings) { + go func() { + // Theme lookup hangs on some desktops. Update theme variant cache from within goroutine. + themeVariant := findFreedesktopColorScheme() + if themeVariant != systemTheme { + internalapp.CurrentVariant.Store(uint64(themeVariant)) + fyne.Do(func() { s.applyVariant(themeVariant) }) + } + + portalSettings.OnSignalSettingChanged(func(changed portalSettings.Changed) { + if changed.Namespace == appearance.Namespace && changed.Key == "color-scheme" { + themeVariant := colorSchemeToThemeVariant(appearance.ColorScheme(changed.Value.(uint32))) + internalapp.CurrentVariant.Store(uint64(themeVariant)) + fyne.Do(func() { s.applyVariant(themeVariant) }) + } + }) + }() +} + +func (a *fyneApp) registerRepositories() { + // no-op +} + +func (s *settings) applyVariant(variant fyne.ThemeVariant) { + s.variant = variant + s.apply() +} diff --git a/vendor/fyne.io/fyne/v2/app/cloud.go b/vendor/fyne.io/fyne/v2/app/cloud.go new file mode 100644 index 0000000..22c43cf --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/cloud.go @@ -0,0 +1,47 @@ +package app + +import "fyne.io/fyne/v2" + +func (a *fyneApp) SetCloudProvider(p fyne.CloudProvider) { + if p == nil { + a.cloud = nil + return + } + + a.transitionCloud(p) +} + +func (a *fyneApp) transitionCloud(p fyne.CloudProvider) { + if a.cloud != nil { + a.cloud.Cleanup(a) + } + + err := p.Setup(a) + if err != nil { + fyne.LogError("Failed to set up cloud provider "+p.ProviderName(), err) + return + } + a.cloud = p + + listeners := a.prefs.ChangeListeners() + if pp, ok := p.(fyne.CloudProviderPreferences); ok { + a.prefs = pp.CloudPreferences(a) + } else { + a.prefs = a.newDefaultPreferences() + } + if cloud, ok := p.(fyne.CloudProviderStorage); ok { + a.storage = cloud.CloudStorage(a) + } else { + store := &store{a: a} + store.Docs = makeStoreDocs(a.uniqueID, store) + a.storage = store + } + + for _, l := range listeners { + a.prefs.AddChangeListener(l) + l() // assume that preferences have changed because we replaced the provider + } + + // after transition ensure settings listener is fired + a.settings.apply() +} diff --git a/vendor/fyne.io/fyne/v2/app/icon_cache_file.go b/vendor/fyne.io/fyne/v2/app/icon_cache_file.go new file mode 100644 index 0000000..3245dec --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/icon_cache_file.go @@ -0,0 +1,54 @@ +package app + +import ( + "os" + "path/filepath" + "sync" + + "fyne.io/fyne/v2" +) + +var once sync.Once + +func (a *fyneApp) cachedIconPath() string { + if a.Icon() == nil { + return "" + } + + dirPath := filepath.Join(rootCacheDir(), a.UniqueID()) + filePath := filepath.Join(dirPath, "icon.png") + once.Do(func() { + err := a.saveIconToCache(dirPath, filePath) + if err != nil { + filePath = "" + } + }) + + return filePath +} + +func (a *fyneApp) saveIconToCache(dirPath, filePath string) error { + err := os.MkdirAll(dirPath, 0o700) + if err != nil { + fyne.LogError("Unable to create application cache directory", err) + return err + } + + file, err := os.Create(filePath) + if err != nil { + fyne.LogError("Unable to create icon file", err) + return err + } + + defer file.Close() + + if icon := a.Icon(); icon != nil { + _, err = file.Write(icon.Content()) + if err != nil { + fyne.LogError("Unable to write icon contents", err) + return err + } + } + + return nil +} diff --git a/vendor/fyne.io/fyne/v2/app/icon_cache_noos.go b/vendor/fyne.io/fyne/v2/app/icon_cache_noos.go new file mode 100644 index 0000000..f837dc4 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/icon_cache_noos.go @@ -0,0 +1,13 @@ +//go:build noos || tinygo + +package app + +import ( + "os" + "path/filepath" +) + +func rootCacheDir() string { + home, _ := os.UserHomeDir() + return filepath.Join(home, ".config", "fyne") +} diff --git a/vendor/fyne.io/fyne/v2/app/icon_cache_other.go b/vendor/fyne.io/fyne/v2/app/icon_cache_other.go new file mode 100644 index 0000000..53773d8 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/icon_cache_other.go @@ -0,0 +1,13 @@ +//go:build !noos && !tinygo + +package app + +import ( + "os" + "path/filepath" +) + +func rootCacheDir() string { + desktopCache, _ := os.UserCacheDir() + return filepath.Join(desktopCache, "fyne") +} diff --git a/vendor/fyne.io/fyne/v2/app/meta.go b/vendor/fyne.io/fyne/v2/app/meta.go new file mode 100644 index 0000000..214f13b --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/meta.go @@ -0,0 +1,36 @@ +package app + +import ( + "fyne.io/fyne/v2" +) + +var meta = fyne.AppMetadata{ + ID: "", + Name: "", + Version: "0.0.1", + Build: 1, + Release: false, + Custom: map[string]string{}, + Migrations: map[string]bool{}, +} + +// SetMetadata overrides the packaged application metadata. +// This data can be used in many places like notifications and about screens. +func SetMetadata(m fyne.AppMetadata) { + meta = m + + if meta.Custom == nil { + meta.Custom = map[string]string{} + } + if meta.Migrations == nil { + meta.Migrations = map[string]bool{} + } +} + +func (a *fyneApp) Metadata() fyne.AppMetadata { + if meta.ID == "" && meta.Name == "" { + checkLocalMetadata() + } + + return meta +} diff --git a/vendor/fyne.io/fyne/v2/app/meta_development.go b/vendor/fyne.io/fyne/v2/app/meta_development.go new file mode 100644 index 0000000..0c29a7c --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/meta_development.go @@ -0,0 +1,65 @@ +package app + +import ( + "os" + "path/filepath" + "strings" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/build" + "fyne.io/fyne/v2/internal/metadata" +) + +func checkLocalMetadata() { + if build.NoMetadata || build.Mode == fyne.BuildRelease { + return + } + + dir := getProjectPath() + file := filepath.Join(dir, "FyneApp.toml") + ref, err := os.Open(file) + if err != nil { // no worries, this is just an optional fallback + return + } + defer ref.Close() + + data, err := metadata.Load(ref) + if err != nil || data == nil { + fyne.LogError("failed to parse FyneApp.toml", err) + return + } + + meta.ID = data.Details.ID + meta.Name = data.Details.Name + meta.Version = data.Details.Version + meta.Build = data.Details.Build + + if data.Details.Icon != "" { + res, err := fyne.LoadResourceFromPath(data.Details.Icon) + if err == nil { + meta.Icon = metadata.ScaleIcon(res, 512) + } + } + + meta.Release = false + meta.Custom = data.Development + meta.Migrations = data.Migrations +} + +func getProjectPath() string { + exe, err := os.Executable() + work, _ := os.Getwd() + + if err != nil { + fyne.LogError("failed to lookup build executable", err) + return work + } + + temp := os.TempDir() + if strings.Contains(exe, temp) || strings.Contains(exe, "go-build") { // this happens with "go run" + return work + } + + // we were called with an executable from "go build" + return filepath.Dir(exe) +} diff --git a/vendor/fyne.io/fyne/v2/app/preferences.go b/vendor/fyne.io/fyne/v2/app/preferences.go new file mode 100644 index 0000000..75ba039 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/preferences.go @@ -0,0 +1,191 @@ +package app + +import ( + "encoding/json" + "errors" + "io" + "sync" + "time" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal" +) + +type preferences struct { + *internal.InMemoryPreferences + + prefLock sync.RWMutex + savedRecently bool + changedDuringSaving bool + + app *fyneApp + needsSaveBeforeExit bool +} + +// Declare conformity with Preferences interface +var _ fyne.Preferences = (*preferences)(nil) + +// sentinel error to signal an empty preferences storage backend was loaded +var errEmptyPreferencesStore = errors.New("empty preferences store") + +// returned from storageWriter() - may be a file, browser local storage, etc +type writeSyncCloser interface { + io.WriteCloser + Sync() error +} + +// forceImmediateSave writes preferences to storage immediately, ignoring the debouncing +// logic in the change listener. Does nothing if preferences are not backed with a persistent store. +func (p *preferences) forceImmediateSave() { + if !p.needsSaveBeforeExit { + return + } + err := p.save() + if err != nil { + fyne.LogError("Failed on force saving preferences", err) + } +} + +func (p *preferences) resetSavedRecently() { + go func() { + time.Sleep(time.Millisecond * 100) // writes are not always atomic. 10ms worked, 100 is safer. + + // For test reasons we need to use current app not what we were initialised with as they can differ + fyne.DoAndWait(func() { + p.prefLock.Lock() + p.savedRecently = false + changedDuringSaving := p.changedDuringSaving + p.changedDuringSaving = false + p.prefLock.Unlock() + + if changedDuringSaving { + p.save() + } + }) + }() +} + +func (p *preferences) save() error { + storage, err := p.storageWriter() + if err != nil { + return err + } + return p.saveToStorage(storage) +} + +func (p *preferences) saveToStorage(writer writeSyncCloser) error { + p.prefLock.Lock() + p.savedRecently = true + p.prefLock.Unlock() + defer p.resetSavedRecently() + + defer writer.Close() + encode := json.NewEncoder(writer) + + var err error + p.InMemoryPreferences.ReadValues(func(values map[string]any) { + err = encode.Encode(&values) + }) + + err2 := writer.Sync() + if err == nil { + err = err2 + } + return err +} + +func (p *preferences) load() { + storage, err := p.storageReader() + if err == nil { + err = p.loadFromStorage(storage) + } + if err != nil && err != errEmptyPreferencesStore { + fyne.LogError("Preferences load error:", err) + } +} + +func (p *preferences) loadFromStorage(storage io.ReadCloser) (err error) { + defer func() { + if r := storage.Close(); r != nil && err == nil { + err = r + } + }() + decode := json.NewDecoder(storage) + + p.InMemoryPreferences.WriteValues(func(values map[string]any) { + err = decode.Decode(&values) + if err != nil { + return + } + convertLists(values) + }) + + return err +} + +func newPreferences(app *fyneApp) *preferences { + p := &preferences{} + p.app = app + p.InMemoryPreferences = internal.NewInMemoryPreferences() + + // don't load or watch if not setup + if app.uniqueID == "" && app.Metadata().ID == "" { + return p + } + + p.needsSaveBeforeExit = true + p.AddChangeListener(func() { + if p != app.prefs { + return + } + p.prefLock.Lock() + shouldIgnoreChange := p.savedRecently + if p.savedRecently { + p.changedDuringSaving = true + } + p.prefLock.Unlock() + + if shouldIgnoreChange { // callback after loading from storage, or too many updates in a row + return + } + + err := p.save() + if err != nil { + fyne.LogError("Failed on saving preferences", err) + } + }) + p.watch() + return p +} + +func convertLists(values map[string]any) { + for k, v := range values { + if items, ok := v.([]any); ok { + if len(items) == 0 { + continue + } + + switch items[0].(type) { + case bool: + bools := make([]bool, len(items)) + for i, item := range items { + bools[i] = item.(bool) + } + values[k] = bools + case float64: + floats := make([]float64, len(items)) + for i, item := range items { + floats[i] = item.(float64) + } + values[k] = floats + // case int: // json has no int! + case string: + strings := make([]string, len(items)) + for i, item := range items { + strings[i] = item.(string) + } + values[k] = strings + } + } + } +} diff --git a/vendor/fyne.io/fyne/v2/app/preferences_android.go b/vendor/fyne.io/fyne/v2/app/preferences_android.go new file mode 100644 index 0000000..ac9f834 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/preferences_android.go @@ -0,0 +1,24 @@ +//go:build android + +package app + +import ( + "path/filepath" + + "fyne.io/fyne/v2/internal/app" +) + +// storagePath returns the location of the settings storage +func (p *preferences) storagePath() string { + // we have no global storage, use app global instead - rootConfigDir looks up in app_mobile_and.go + return filepath.Join(p.app.storageRoot(), "preferences.json") +} + +// storageRoot returns the location of the app storage +func (a *fyneApp) storageRoot() string { + return app.RootConfigDir() // we are in a sandbox, so no app ID added to this path +} + +func (p *preferences) watch() { + // no-op on mobile +} diff --git a/vendor/fyne.io/fyne/v2/app/preferences_ios.go b/vendor/fyne.io/fyne/v2/app/preferences_ios.go new file mode 100644 index 0000000..b861eec --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/preferences_ios.go @@ -0,0 +1,25 @@ +//go:build ios + +package app + +import ( + "path/filepath" + + "fyne.io/fyne/v2/internal/app" +) +import "C" + +// storagePath returns the location of the settings storage +func (p *preferences) storagePath() string { + ret := filepath.Join(p.app.storageRoot(), "preferences.json") + return ret +} + +// storageRoot returns the location of the app storage +func (a *fyneApp) storageRoot() string { + return app.RootConfigDir() // we are in a sandbox, so no app ID added to this path +} + +func (p *preferences) watch() { + // no-op on mobile +} diff --git a/vendor/fyne.io/fyne/v2/app/preferences_mobile.go b/vendor/fyne.io/fyne/v2/app/preferences_mobile.go new file mode 100644 index 0000000..1fd186f --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/preferences_mobile.go @@ -0,0 +1,23 @@ +//go:build mobile + +package app + +import ( + "path/filepath" + + "fyne.io/fyne/v2/internal/app" +) + +// storagePath returns the location of the settings storage +func (p *preferences) storagePath() string { + return filepath.Join(p.app.storageRoot(), "preferences.json") +} + +// storageRoot returns the location of the app storage +func (a *fyneApp) storageRoot() string { + return filepath.Join(app.RootConfigDir(), a.UniqueID()) +} + +func (p *preferences) watch() { + // no-op as we are in mobile simulation mode +} diff --git a/vendor/fyne.io/fyne/v2/app/preferences_nonweb.go b/vendor/fyne.io/fyne/v2/app/preferences_nonweb.go new file mode 100644 index 0000000..74b7444 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/preferences_nonweb.go @@ -0,0 +1,67 @@ +//go:build !wasm + +package app + +import ( + "io" + "os" + "path/filepath" +) + +func (p *preferences) storageWriter() (writeSyncCloser, error) { + return p.storageWriterForPath(p.storagePath()) +} + +func (p *preferences) storageReader() (io.ReadCloser, error) { + return p.storageReaderForPath(p.storagePath()) +} + +func (p *preferences) storageWriterForPath(path string) (writeSyncCloser, error) { + err := os.MkdirAll(filepath.Dir(path), 0o700) + if err != nil { // this is not an exists error according to docs + return nil, err + } + file, err := os.Create(path) + if err != nil { + if !os.IsExist(err) { + return nil, err + } + file, err = os.Open(path) // #nosec + if err != nil { + return nil, err + } + } + return file, nil +} + +func (p *preferences) storageReaderForPath(path string) (io.ReadCloser, error) { + file, err := os.Open(path) // #nosec + if err != nil { + if os.IsNotExist(err) { + if err := os.MkdirAll(filepath.Dir(path), 0o700); err != nil { + return nil, err + } + return nil, errEmptyPreferencesStore + } + return nil, err + } + return file, nil +} + +// the following are only used in tests to save preferences to a tmp file + +func (p *preferences) saveToFile(path string) error { + file, err := p.storageWriterForPath(path) + if err != nil { + return err + } + return p.saveToStorage(file) +} + +func (p *preferences) loadFromFile(path string) error { + file, err := p.storageReaderForPath(path) + if err != nil { + return err + } + return p.loadFromStorage(file) +} diff --git a/vendor/fyne.io/fyne/v2/app/preferences_other.go b/vendor/fyne.io/fyne/v2/app/preferences_other.go new file mode 100644 index 0000000..3e698c2 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/preferences_other.go @@ -0,0 +1,32 @@ +//go:build !ios && !android && !mobile && !wasm + +package app + +import ( + "path/filepath" + + "fyne.io/fyne/v2/internal/app" +) + +// storagePath returns the location of the settings storage +func (p *preferences) storagePath() string { + return filepath.Join(p.app.storageRoot(), "preferences.json") +} + +// storageRoot returns the location of the app storage +func (a *fyneApp) storageRoot() string { + return filepath.Join(app.RootConfigDir(), a.UniqueID()) +} + +func (p *preferences) watch() { + watchFile(p.storagePath(), func() { + p.prefLock.RLock() + shouldIgnoreChange := p.savedRecently + p.prefLock.RUnlock() + if shouldIgnoreChange { + return + } + + p.load() + }) +} diff --git a/vendor/fyne.io/fyne/v2/app/preferences_wasm.go b/vendor/fyne.io/fyne/v2/app/preferences_wasm.go new file mode 100644 index 0000000..7493f1d --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/preferences_wasm.go @@ -0,0 +1,62 @@ +//go:build wasm + +package app + +import ( + "bytes" + "io" + "strings" + "syscall/js" +) + +const preferencesLocalStorageKey = "fyne-preferences.json" + +func (a *fyneApp) storageRoot() string { + return "idbfile:///fyne/" +} + +func (p *preferences) storageReader() (io.ReadCloser, error) { + key := js.ValueOf(preferencesLocalStorageKey) + data := js.Global().Get("localStorage").Call("getItem", key) + if data.IsNull() || data.IsUndefined() { + return nil, errEmptyPreferencesStore + } + + return readerNopCloser{reader: strings.NewReader(data.String())}, nil +} + +func (p *preferences) storageWriter() (writeSyncCloser, error) { + return &localStorageWriter{key: preferencesLocalStorageKey}, nil +} + +func (p *preferences) watch() { + // no-op for web driver +} + +type readerNopCloser struct { + reader io.Reader +} + +func (r readerNopCloser) Read(b []byte) (int, error) { + return r.reader.Read(b) +} + +func (r readerNopCloser) Close() error { + return nil +} + +type localStorageWriter struct { + bytes.Buffer + key string +} + +func (s *localStorageWriter) Sync() error { + text := s.String() + s.Reset() + js.Global().Get("localStorage").Call("setItem", js.ValueOf(s.key), js.ValueOf(text)) + return nil +} + +func (s *localStorageWriter) Close() error { + return nil +} diff --git a/vendor/fyne.io/fyne/v2/app/settings.go b/vendor/fyne.io/fyne/v2/app/settings.go new file mode 100644 index 0000000..35ff8ca --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/settings.go @@ -0,0 +1,151 @@ +package app + +import ( + "os" + "path/filepath" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/app" + "fyne.io/fyne/v2/internal/async" + "fyne.io/fyne/v2/internal/build" + "fyne.io/fyne/v2/theme" +) + +// SettingsSchema is used for loading and storing global settings +type SettingsSchema struct { + // these items are used for global settings load + ThemeName string `json:"theme"` + Scale float32 `json:"scale"` + PrimaryColor string `json:"primary_color"` + CloudName string `json:"cloud_name"` + CloudConfig string `json:"cloud_config"` + DisableAnimations bool `json:"no_animations"` +} + +// StoragePath returns the location of the settings storage +func (sc *SettingsSchema) StoragePath() string { + return filepath.Join(app.RootConfigDir(), "settings.json") +} + +// Declare conformity with Settings interface +var _ fyne.Settings = (*settings)(nil) + +type settings struct { + theme fyne.Theme + themeSpecified bool + variant fyne.ThemeVariant + + listeners []func(fyne.Settings) + changeListeners async.Map[chan fyne.Settings, bool] + watcher any // normally *fsnotify.Watcher or nil - avoid import in this file + + schema SettingsSchema +} + +func (s *settings) BuildType() fyne.BuildType { + return build.Mode +} + +func (s *settings) PrimaryColor() string { + return s.schema.PrimaryColor +} + +// OverrideTheme allows the settings app to temporarily preview different theme details. +// Please make sure that you remember the original settings and call this again to revert the change. +// +// Deprecated: Use container.NewThemeOverride to change the appearance of part of your application. +func (s *settings) OverrideTheme(theme fyne.Theme, name string) { + s.schema.PrimaryColor = name + s.theme = theme +} + +func (s *settings) Theme() fyne.Theme { + if s == nil { + fyne.LogError("Attempt to access current Fyne theme when no app is started", nil) + return nil + } + return s.theme +} + +func (s *settings) SetTheme(theme fyne.Theme) { + s.themeSpecified = true + s.applyTheme(theme, s.variant) +} + +func (s *settings) ShowAnimations() bool { + return !s.schema.DisableAnimations && !build.NoAnimations +} + +func (s *settings) ThemeVariant() fyne.ThemeVariant { + return s.variant +} + +func (s *settings) applyTheme(theme fyne.Theme, variant fyne.ThemeVariant) { + s.variant = variant + s.theme = theme + s.apply() +} + +func (s *settings) Scale() float32 { + if s.schema.Scale < 0.0 { + return 1.0 // catching any really old data still using the `-1` value for "auto" scale + } + return s.schema.Scale +} + +func (s *settings) AddChangeListener(listener chan fyne.Settings) { + s.changeListeners.Store(listener, true) // the boolean is just a dummy value here. +} + +func (s *settings) AddListener(listener func(fyne.Settings)) { + s.listeners = append(s.listeners, listener) +} + +func (s *settings) apply() { + s.changeListeners.Range(func(listener chan fyne.Settings, _ bool) bool { + select { + case listener <- s: + default: + l := listener + go func() { l <- s }() + } + return true + }) + + for _, l := range s.listeners { + l(s) + } +} + +func (s *settings) fileChanged() { + s.load() + s.apply() +} + +func (s *settings) setupTheme() { + name := s.schema.ThemeName + if env := os.Getenv("FYNE_THEME"); env != "" { + name = env + } + + variant := app.DefaultVariant() + effectiveTheme := s.theme + if !s.themeSpecified { + effectiveTheme = theme.DefaultTheme() + } + switch name { + case "light": + variant = theme.VariantLight + case "dark": + variant = theme.VariantDark + } + + s.applyTheme(effectiveTheme, variant) +} + +func loadSettings() *settings { + s := &settings{} + s.load() + + return s +} diff --git a/vendor/fyne.io/fyne/v2/app/settings_desktop.go b/vendor/fyne.io/fyne/v2/app/settings_desktop.go new file mode 100644 index 0000000..dc63aaa --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/settings_desktop.go @@ -0,0 +1,80 @@ +//go:build !android && !ios && !mobile && !wasm && !test_web_driver && !tamago && !noos && !tinygo + +package app + +import ( + "os" + "path/filepath" + + "fyne.io/fyne/v2" + "github.com/fsnotify/fsnotify" +) + +func watchFileAddTarget(watcher *fsnotify.Watcher, path string) { + dir := filepath.Dir(path) + ensureDirExists(dir) + + err := watcher.Add(dir) + if err != nil { + fyne.LogError("Settings watch error:", err) + } +} + +func ensureDirExists(dir string) { + if stat, err := os.Stat(dir); err == nil && stat.IsDir() { + return + } + + err := os.MkdirAll(dir, 0o700) + if err != nil { + fyne.LogError("Unable to create settings storage:", err) + } +} + +func watchFile(path string, callback func()) *fsnotify.Watcher { + watcher, err := fsnotify.NewWatcher() + if err != nil { + fyne.LogError("Failed to watch settings file:", err) + return nil + } + + go func() { + for event := range watcher.Events { + if event.Op.Has(fsnotify.Remove) { // if it was deleted then watch again + watcher.Remove(path) // fsnotify returns false positives, see https://github.com/fsnotify/fsnotify/issues/268 + + watchFileAddTarget(watcher, path) + } else { + fyne.Do(callback) + } + } + + err = watcher.Close() + if err != nil { + fyne.LogError("Settings un-watch error:", err) + } + }() + + watchFileAddTarget(watcher, path) + return watcher +} + +func (s *settings) watchSettings() { + if s.themeSpecified { + return // we only watch for theme changes at this time so don't bother + } + s.watcher = watchFile(s.schema.StoragePath(), s.fileChanged) + + a := fyne.CurrentApp() + if a != nil && s != nil && a.Settings() == s { // ignore if testing + watchTheme(s) + } +} + +func (s *settings) stopWatching() { + if s.watcher == nil { + return + } + + s.watcher.(*fsnotify.Watcher).Close() // fsnotify returns false positives, see https://github.com/fsnotify/fsnotify/issues/268 +} diff --git a/vendor/fyne.io/fyne/v2/app/settings_file.go b/vendor/fyne.io/fyne/v2/app/settings_file.go new file mode 100644 index 0000000..7d04bb3 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/settings_file.go @@ -0,0 +1,33 @@ +//go:build !wasm && !test_web_driver && !tamago && !noos && !tinygo + +package app + +import ( + "bufio" + "encoding/json" + "io" + "os" + + "fyne.io/fyne/v2" +) + +func (s *settings) load() { + err := s.loadFromFile(s.schema.StoragePath()) + if err != nil && err != io.EOF { // we can get an EOF in windows settings writes + fyne.LogError("Settings load error:", err) + } + + s.setupTheme() +} + +func (s *settings) loadFromFile(path string) error { + file, err := os.Open(path) // #nosec + if err != nil { + if os.IsNotExist(err) { + return nil + } + return err + } + defer file.Close() + return json.NewDecoder(bufio.NewReader(file)).Decode(&s.schema) +} diff --git a/vendor/fyne.io/fyne/v2/app/settings_mobile.go b/vendor/fyne.io/fyne/v2/app/settings_mobile.go new file mode 100644 index 0000000..642a7e7 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/settings_mobile.go @@ -0,0 +1,11 @@ +//go:build android || ios || mobile + +package app + +func (s *settings) watchSettings() { + // no-op on mobile +} + +func (s *settings) stopWatching() { + // no-op on mobile +} diff --git a/vendor/fyne.io/fyne/v2/app/settings_noos.go b/vendor/fyne.io/fyne/v2/app/settings_noos.go new file mode 100644 index 0000000..119b20f --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/settings_noos.go @@ -0,0 +1,24 @@ +//go:build tamago || noos || tinygo + +package app + +func (s *settings) load() { + s.schema.Scale = 1 +} + +func (s *settings) loadFromFile(_ string) error { + // not supported + return nil +} + +func watchFile(_ string, _ func()) { + // not supported +} + +func (s *settings) watchSettings() { + // not supported +} + +func (s *settings) stopWatching() { + // not supported +} diff --git a/vendor/fyne.io/fyne/v2/app/settings_wasm.go b/vendor/fyne.io/fyne/v2/app/settings_wasm.go new file mode 100644 index 0000000..0bde331 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/settings_wasm.go @@ -0,0 +1,23 @@ +//go:build wasm || test_web_driver + +package app + +func (s *settings) load() { + s.setupTheme() + s.schema.Scale = 1 +} + +func (s *settings) loadFromFile(path string) error { + return nil +} + +func watchFile(path string, callback func()) { +} + +func (s *settings) watchSettings() { + watchTheme(s) +} + +func (s *settings) stopWatching() { + stopWatchingTheme() +} diff --git a/vendor/fyne.io/fyne/v2/app/storage.go b/vendor/fyne.io/fyne/v2/app/storage.go new file mode 100644 index 0000000..52be0e4 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/app/storage.go @@ -0,0 +1,31 @@ +package app + +import ( + "os" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal" + "fyne.io/fyne/v2/storage" +) + +type store struct { + *internal.Docs + a *fyneApp +} + +func (s *store) RootURI() fyne.URI { + if s.a.UniqueID() == "" { + fyne.LogError("Storage API requires a unique ID, use app.NewWithID()", nil) + return storage.NewFileURI(os.TempDir()) + } + + u, err := storage.ParseURI(s.a.storageRoot()) + if err == nil { + return u + } + return storage.NewFileURI(s.a.storageRoot()) +} + +func (s *store) docRootURI() (fyne.URI, error) { + return storage.Child(s.RootURI(), "Documents") +} diff --git a/vendor/fyne.io/fyne/v2/canvas.go b/vendor/fyne.io/fyne/v2/canvas.go new file mode 100644 index 0000000..8fd97d7 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/canvas.go @@ -0,0 +1,58 @@ +package fyne + +import "image" + +// Canvas defines a graphical canvas to which a [CanvasObject] or Container can be added. +// Each canvas has a scale which is automatically applied during the render process. +type Canvas interface { + Content() CanvasObject + SetContent(CanvasObject) + + Refresh(CanvasObject) + + // Focus makes the provided item focused. + // The item has to be added to the contents of the canvas before calling this. + Focus(Focusable) + // FocusNext focuses the next focusable item. + // If no item is currently focused, the first focusable item is focused. + // If the last focusable item is currently focused, the first focusable item is focused. + // + // Since: 2.0 + FocusNext() + // FocusPrevious focuses the previous focusable item. + // If no item is currently focused, the last focusable item is focused. + // If the first focusable item is currently focused, the last focusable item is focused. + // + // Since: 2.0 + FocusPrevious() + Unfocus() + Focused() Focusable + + // Size returns the current size of this canvas + Size() Size + // Scale returns the current scale (multiplication factor) this canvas uses to render + // The pixel size of a [CanvasObject] can be found by multiplying by this value. + Scale() float32 + + // Overlays returns the overlay stack. + Overlays() OverlayStack + + OnTypedRune() func(rune) + SetOnTypedRune(func(rune)) + OnTypedKey() func(*KeyEvent) + SetOnTypedKey(func(*KeyEvent)) + AddShortcut(shortcut Shortcut, handler func(shortcut Shortcut)) + RemoveShortcut(shortcut Shortcut) + + Capture() image.Image + + // PixelCoordinateForPosition returns the x and y pixel coordinate for a given position on this canvas. + // This can be used to find absolute pixel positions or pixel offsets relative to an object top left. + PixelCoordinateForPosition(Position) (int, int) + + // InteractiveArea returns the position and size of the central interactive area. + // Operating system elements may overlap the portions outside this area and widgets should avoid being outside. + // + // Since: 1.4 + InteractiveArea() (Position, Size) +} diff --git a/vendor/fyne.io/fyne/v2/canvas/animation.go b/vendor/fyne.io/fyne/v2/canvas/animation.go new file mode 100644 index 0000000..9b2b2f9 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/canvas/animation.go @@ -0,0 +1,91 @@ +package canvas + +import ( + "image/color" + "time" + + "fyne.io/fyne/v2" +) + +const ( + // DurationStandard is the time a standard interface animation will run. + // + // Since: 2.0 + DurationStandard = time.Millisecond * 300 + // DurationShort is the time a subtle or small transition should use. + // + // Since: 2.0 + DurationShort = time.Millisecond * 150 +) + +// NewColorRGBAAnimation sets up a new animation that will transition from the start to stop Color over +// the specified Duration. The colour transition will move linearly through the RGB colour space. +// The content of fn should apply the color values to an object and refresh it. +// You should call Start() on the returned animation to start it. +// +// Since: 2.0 +func NewColorRGBAAnimation(start, stop color.Color, d time.Duration, fn func(color.Color)) *fyne.Animation { + r1, g1, b1, a1 := start.RGBA() + r2, g2, b2, a2 := stop.RGBA() + + rStart := int(r1 >> 8) + gStart := int(g1 >> 8) + bStart := int(b1 >> 8) + aStart := int(a1 >> 8) + rDelta := float32(int(r2>>8) - rStart) + gDelta := float32(int(g2>>8) - gStart) + bDelta := float32(int(b2>>8) - bStart) + aDelta := float32(int(a2>>8) - aStart) + + return &fyne.Animation{ + Duration: d, + Tick: func(done float32) { + fn(color.RGBA{ + R: scaleChannel(rStart, rDelta, done), G: scaleChannel(gStart, gDelta, done), + B: scaleChannel(bStart, bDelta, done), A: scaleChannel(aStart, aDelta, done), + }) + }, + } +} + +// NewPositionAnimation sets up a new animation that will transition from the start to stop Position over +// the specified Duration. The content of fn should apply the position value to an object for the change +// to be visible. You should call Start() on the returned animation to start it. +// +// Since: 2.0 +func NewPositionAnimation(start, stop fyne.Position, d time.Duration, fn func(fyne.Position)) *fyne.Animation { + xDelta := stop.X - start.X + yDelta := stop.Y - start.Y + + return &fyne.Animation{ + Duration: d, + Tick: func(done float32) { + fn(fyne.NewPos(scaleVal(start.X, xDelta, done), scaleVal(start.Y, yDelta, done))) + }, + } +} + +// NewSizeAnimation sets up a new animation that will transition from the start to stop Size over +// the specified Duration. The content of fn should apply the size value to an object for the change +// to be visible. You should call Start() on the returned animation to start it. +// +// Since: 2.0 +func NewSizeAnimation(start, stop fyne.Size, d time.Duration, fn func(fyne.Size)) *fyne.Animation { + widthDelta := stop.Width - start.Width + heightDelta := stop.Height - start.Height + + return &fyne.Animation{ + Duration: d, + Tick: func(done float32) { + fn(fyne.NewSize(scaleVal(start.Width, widthDelta, done), scaleVal(start.Height, heightDelta, done))) + }, + } +} + +func scaleChannel(start int, diff, done float32) uint8 { + return uint8(start + int(diff*done)) +} + +func scaleVal(start float32, delta, done float32) float32 { + return start + delta*done +} diff --git a/vendor/fyne.io/fyne/v2/canvas/arc.go b/vendor/fyne.io/fyne/v2/canvas/arc.go new file mode 100644 index 0000000..9bd6fa7 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/canvas/arc.go @@ -0,0 +1,95 @@ +package canvas + +import ( + "image/color" + + "fyne.io/fyne/v2" +) + +// Declare conformity with CanvasObject interface +var _ fyne.CanvasObject = (*Arc)(nil) + +// Arc represents a filled arc or annular sector primitive that can be drawn on a Fyne canvas. +// It allows for the creation of circular, ring-shaped or pie-shaped segment, with configurable cutout ratio +// as well as customizable start and end angles to define the arc's length as the absolute difference between the two angles. The arc is always centered on its position. +// The arc is drawn from StartAngle to EndAngle (in degrees, positive is clockwise, negative is counter-clockwise). +// 0°/360 is top, 90° is right, 180° is bottom, 270° is left +// 0°/-360 is top, -90° is left, -180° is bottom, -270° is right +// +// Since: 2.7 +type Arc struct { + baseObject + + FillColor color.Color // The arc fill colour + StartAngle float32 // Start angle in degrees + EndAngle float32 // End angle in degrees + CornerRadius float32 // Radius used to round the corners + StrokeColor color.Color // The arc stroke color + StrokeWidth float32 // The stroke width of the arc + CutoutRatio float32 // Controls what portion of the inner should be cut out. A value of 0.0 results in a pie slice, while 1.0 results in a stroke. +} + +// Hide will set this arc to not be visible. +func (a *Arc) Hide() { + a.baseObject.Hide() + + repaint(a) +} + +// Move the arc to a new position, relative to its parent / canvas. +// The position specifies the **center** of the arc. +func (a *Arc) Move(pos fyne.Position) { + if a.Position() == pos { + return + } + a.baseObject.Move(pos) + + repaint(a) +} + +// Refresh causes this arc to be redrawn with its configured state. +func (a *Arc) Refresh() { + Refresh(a) +} + +// Resize updates the logical size of the arc. +// The arc is always drawn centered on its Position(). +func (a *Arc) Resize(s fyne.Size) { + if s == a.Size() { + return + } + + a.baseObject.Resize(s) + + repaint(a) +} + +// NewArc returns a new Arc instance with the specified start and end angles (in degrees), fill color and cutout ratio. +func NewArc(startAngle, endAngle, cutoutRatio float32, color color.Color) *Arc { + return &Arc{ + StartAngle: startAngle, + EndAngle: endAngle, + FillColor: color, + CutoutRatio: cutoutRatio, + } +} + +// NewPieArc returns a new pie-shaped Arc instance with the specified start and end angles (in degrees), fill color and cutout ratio set to 0. +func NewPieArc(startAngle, endAngle float32, color color.Color) *Arc { + return &Arc{ + StartAngle: startAngle, + EndAngle: endAngle, + FillColor: color, + CutoutRatio: 0.0, + } +} + +// NewDoughnutArc returns a new doughnut-shaped Arc instance with the specified start and end angles (in degrees), fill color and cutout ratio set to 0.5. +func NewDoughnutArc(startAngle, endAngle float32, color color.Color) *Arc { + return &Arc{ + StartAngle: startAngle, + EndAngle: endAngle, + FillColor: color, + CutoutRatio: 0.5, + } +} diff --git a/vendor/fyne.io/fyne/v2/canvas/base.go b/vendor/fyne.io/fyne/v2/canvas/base.go new file mode 100644 index 0000000..5b4a1ee --- /dev/null +++ b/vendor/fyne.io/fyne/v2/canvas/base.go @@ -0,0 +1,69 @@ +// Package canvas contains all of the primitive CanvasObjects that make up a Fyne GUI. +// +// The types implemented in this package are used as building blocks in order +// to build higher order functionality. These types are designed to be +// non-interactive, by design. If additional functionality is required, +// it's usually a sign that this type should be used as part of a custom +// widget. +package canvas // import "fyne.io/fyne/v2/canvas" + +import ( + "fyne.io/fyne/v2" +) + +type baseObject struct { + size fyne.Size // The current size of the canvas object + position fyne.Position // The current position of the object + Hidden bool // Is this object currently hidden + + min fyne.Size // The minimum size this object can be +} + +// Hide will set this object to not be visible. +func (o *baseObject) Hide() { + o.Hidden = true +} + +// MinSize returns the specified minimum size, if set, or {1, 1} otherwise. +func (o *baseObject) MinSize() fyne.Size { + if o.min.IsZero() { + return fyne.Size{Width: 1, Height: 1} + } + + return o.min +} + +// Move the object to a new position, relative to its parent. +func (o *baseObject) Move(pos fyne.Position) { + o.position = pos +} + +// Position gets the current position of this canvas object, relative to its parent. +func (o *baseObject) Position() fyne.Position { + return o.position +} + +// Resize sets a new size for the canvas object. +func (o *baseObject) Resize(size fyne.Size) { + o.size = size +} + +// SetMinSize specifies the smallest size this object should be. +func (o *baseObject) SetMinSize(size fyne.Size) { + o.min = size +} + +// Show will set this object to be visible. +func (o *baseObject) Show() { + o.Hidden = false +} + +// Size returns the current size of this canvas object. +func (o *baseObject) Size() fyne.Size { + return o.size +} + +// Visible returns true if this object is visible, false otherwise. +func (o *baseObject) Visible() bool { + return !o.Hidden +} diff --git a/vendor/fyne.io/fyne/v2/canvas/canvas.go b/vendor/fyne.io/fyne/v2/canvas/canvas.go new file mode 100644 index 0000000..ae679dd --- /dev/null +++ b/vendor/fyne.io/fyne/v2/canvas/canvas.go @@ -0,0 +1,57 @@ +package canvas + +import ( + "image/color" + "math" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/svg" +) + +const ( + // RadiusMaximum can be applied to a canvas corner radius to achieve fully rounded corners. + // This constant represents the maximum possible corner radius, resulting in a circular appearance. + // Since: 2.7 + RadiusMaximum float32 = math.MaxFloat32 +) + +// Refresh instructs the containing canvas to refresh the specified obj. +func Refresh(obj fyne.CanvasObject) { + app := fyne.CurrentApp() + if app == nil || app.Driver() == nil { + return + } + + c := app.Driver().CanvasForObject(obj) + if c != nil { + c.Refresh(obj) + } +} + +// RecolorSVG takes a []byte containing SVG content, and returns +// new SVG content, re-colorized to be monochrome with the given color. +// The content can be assigned to a new fyne.StaticResource with an appropriate name +// to be used in a widget.Button, canvas.Image, etc. +// +// If an error occurs, the returned content will be the original un-modified content, +// and a non-nil error is returned. +// +// Since: 2.6 +func RecolorSVG(svgContent []byte, color color.Color) ([]byte, error) { + return svg.Colorize(svgContent, color) +} + +// repaint instructs the containing canvas to redraw, even if nothing changed. +func repaint(obj fyne.CanvasObject) { + app := fyne.CurrentApp() + if app == nil || app.Driver() == nil { + return + } + + c := app.Driver().CanvasForObject(obj) + if c != nil { + if paint, ok := c.(interface{ SetDirty() }); ok { + paint.SetDirty() + } + } +} diff --git a/vendor/fyne.io/fyne/v2/canvas/circle.go b/vendor/fyne.io/fyne/v2/canvas/circle.go new file mode 100644 index 0000000..415733c --- /dev/null +++ b/vendor/fyne.io/fyne/v2/canvas/circle.go @@ -0,0 +1,95 @@ +package canvas + +import ( + "image/color" + "math" + + "fyne.io/fyne/v2" +) + +// Declare conformity with CanvasObject interface +var _ fyne.CanvasObject = (*Circle)(nil) + +// Circle describes a colored circle primitive in a Fyne canvas +type Circle struct { + Position1 fyne.Position // The current top-left position of the Circle + Position2 fyne.Position // The current bottomright position of the Circle + Hidden bool // Is this circle currently hidden + + FillColor color.Color // The circle fill color + StrokeColor color.Color // The circle stroke color + StrokeWidth float32 // The stroke width of the circle +} + +// NewCircle returns a new Circle instance +func NewCircle(color color.Color) *Circle { + return &Circle{FillColor: color} +} + +// Hide will set this circle to not be visible +func (c *Circle) Hide() { + c.Hidden = true + + repaint(c) +} + +// MinSize for a Circle simply returns Size{1, 1} as there is no +// explicit content +func (c *Circle) MinSize() fyne.Size { + return fyne.NewSize(1, 1) +} + +// Move the circle object to a new position, relative to its parent / canvas +func (c *Circle) Move(pos fyne.Position) { + if c.Position1 == pos { + return + } + + size := c.Size() + c.Position1 = pos + c.Position2 = c.Position1.Add(size) + + repaint(c) +} + +// Position gets the current top-left position of this circle object, relative to its parent / canvas +func (c *Circle) Position() fyne.Position { + return c.Position1 +} + +// Refresh causes this object to be redrawn with its configured state. +func (c *Circle) Refresh() { + Refresh(c) +} + +// Resize sets a new bottom-right position for the circle object +// If it has a stroke width this will cause it to Refresh. +func (c *Circle) Resize(size fyne.Size) { + if size == c.Size() { + return + } + + c.Position2 = c.Position1.Add(size) + + Refresh(c) +} + +// Show will set this circle to be visible +func (c *Circle) Show() { + c.Hidden = false + + c.Refresh() +} + +// Size returns the current size of bounding box for this circle object +func (c *Circle) Size() fyne.Size { + return fyne.NewSize( + float32(math.Abs(float64(c.Position2.X)-float64(c.Position1.X))), + float32(math.Abs(float64(c.Position2.Y)-float64(c.Position1.Y))), + ) +} + +// Visible returns true if this circle is visible, false otherwise +func (c *Circle) Visible() bool { + return !c.Hidden +} diff --git a/vendor/fyne.io/fyne/v2/canvas/gradient.go b/vendor/fyne.io/fyne/v2/canvas/gradient.go new file mode 100644 index 0000000..984600e --- /dev/null +++ b/vendor/fyne.io/fyne/v2/canvas/gradient.go @@ -0,0 +1,238 @@ +package canvas + +import ( + "image" + "image/color" + "math" + + "fyne.io/fyne/v2" +) + +// LinearGradient defines a Gradient travelling straight at a given angle. +// The only supported values for the angle are `0.0` (vertical) and `90.0` (horizontal), currently. +type LinearGradient struct { + baseObject + + StartColor color.Color // The beginning color of the gradient + EndColor color.Color // The end color of the gradient + Angle float64 // The angle of the gradient (0/180 for vertical; 90/270 for horizontal) +} + +// Generate calculates an image of the gradient with the specified width and height. +func (g *LinearGradient) Generate(iw, ih int) image.Image { + w, h := float64(iw), float64(ih) + var generator func(x, y float64) float64 + switch g.Angle { + case 90, -270: // horizontal flipped + generator = func(x, _ float64) float64 { + return (w - x) / w + } + case 270, -90: // horizontal + generator = func(x, _ float64) float64 { + return x / w + } + case 45, -315: // diagonal negative flipped + generator = func(x, y float64) float64 { + return math.Abs((w - x + y) / (w + h)) // ((w+h)-(x+h-y)) / (w+h) + } + case 225, -135: // diagonal negative + generator = func(x, y float64) float64 { + return math.Abs((x + h - y) / (w + h)) + } + case 135, -225: // diagonal positive flipped + generator = func(x, y float64) float64 { + return math.Abs((w + h - (x + y)) / (w + h)) + } + case 315, -45: // diagonal positive + generator = func(x, y float64) float64 { + return math.Abs((x + y) / (w + h)) + } + case 180, -180: // vertical flipped + generator = func(_, y float64) float64 { + return (h - y) / h + } + default: // vertical + generator = func(_, y float64) float64 { + return y / h + } + } + return computeGradient(generator, iw, ih, g.StartColor, g.EndColor) +} + +// Hide will set this gradient to not be visible +func (g *LinearGradient) Hide() { + g.baseObject.Hide() + + repaint(g) +} + +// Move the gradient to a new position, relative to its parent / canvas +func (g *LinearGradient) Move(pos fyne.Position) { + if g.Position() == pos { + return + } + + g.baseObject.Move(pos) + + repaint(g) +} + +// Resize resizes the gradient to a new size. +func (g *LinearGradient) Resize(size fyne.Size) { + if size == g.Size() { + return + } + g.baseObject.Resize(size) + + // refresh needed to invalidate cached textures + g.Refresh() +} + +// Refresh causes this gradient to be redrawn with its configured state. +func (g *LinearGradient) Refresh() { + Refresh(g) +} + +// RadialGradient defines a Gradient travelling radially from a center point outward. +type RadialGradient struct { + baseObject + + StartColor color.Color // The beginning color of the gradient + EndColor color.Color // The end color of the gradient + // The offset of the center for generation of the gradient. + // This is not a DP measure but relates to the width/height. + // A value of 0.5 would move the center by the half width/height. + CenterOffsetX, CenterOffsetY float64 +} + +// Generate calculates an image of the gradient with the specified width and height. +func (g *RadialGradient) Generate(iw, ih int) image.Image { + w, h := float64(iw), float64(ih) + // define center plus offset + centerX := w/2 + w*g.CenterOffsetX + centerY := h/2 + h*g.CenterOffsetY + + // handle negative offsets + var a, b float64 + if g.CenterOffsetX < 0 { + a = w - centerX + } else { + a = centerX + } + if g.CenterOffsetY < 0 { + b = h - centerY + } else { + b = centerY + } + + generator := func(x, y float64) float64 { + // calculate distance from center for gradient multiplier + dx, dy := centerX-x, centerY-y + da := math.Sqrt(dx*dx + dy*dy*a*a/b/b) + if da > a { + return 1 + } + return da / a + } + return computeGradient(generator, iw, ih, g.StartColor, g.EndColor) +} + +// Hide will set this gradient to not be visible +func (g *RadialGradient) Hide() { + g.baseObject.Hide() + + repaint(g) +} + +// Move the gradient to a new position, relative to its parent / canvas +func (g *RadialGradient) Move(pos fyne.Position) { + g.baseObject.Move(pos) + + repaint(g) +} + +// Resize resizes the gradient to a new size. +func (g *RadialGradient) Resize(size fyne.Size) { + if size == g.Size() { + return + } + g.baseObject.Resize(size) + + // refresh needed to invalidate cached textures + g.Refresh() +} + +// Refresh causes this gradient to be redrawn with its configured state. +func (g *RadialGradient) Refresh() { + Refresh(g) +} + +func calculatePixel(d float64, startColor, endColor color.Color) color.Color { + // fetch RGBA values + aR, aG, aB, aA := startColor.RGBA() + bR, bG, bB, bA := endColor.RGBA() + + // Get difference + dR := float64(bR) - float64(aR) + dG := float64(bG) - float64(aG) + dB := float64(bB) - float64(aB) + dA := float64(bA) - float64(aA) + + // Apply gradations + pixel := &color.RGBA64{ + R: uint16(float64(aR) + d*dR), + B: uint16(float64(aB) + d*dB), + G: uint16(float64(aG) + d*dG), + A: uint16(float64(aA) + d*dA), + } + + return pixel +} + +func computeGradient(generator func(x, y float64) float64, w, h int, startColor, endColor color.Color) image.Image { + img := image.NewNRGBA(image.Rect(0, 0, w, h)) + + if startColor == nil && endColor == nil { + return img + } else if startColor == nil { + startColor = color.Transparent + } else if endColor == nil { + endColor = color.Transparent + } + + for x := 0; x < w; x++ { + for y := 0; y < h; y++ { + distance := generator(float64(x)+0.5, float64(y)+0.5) + img.Set(x, y, calculatePixel(distance, startColor, endColor)) + } + } + return img +} + +// NewHorizontalGradient creates a new horizontally travelling linear gradient. +// The start color will be at the left of the gradient and the end color will be at the right. +func NewHorizontalGradient(start, end color.Color) *LinearGradient { + g := &LinearGradient{StartColor: start, EndColor: end} + g.Angle = 270 + return g +} + +// NewLinearGradient creates a linear gradient at the specified angle. +// The angle parameter is the degree angle along which the gradient is calculated. +// A NewHorizontalGradient uses 270 degrees and NewVerticalGradient is 0 degrees. +func NewLinearGradient(start, end color.Color, angle float64) *LinearGradient { + g := &LinearGradient{StartColor: start, EndColor: end} + g.Angle = angle + return g +} + +// NewRadialGradient creates a new radial gradient. +func NewRadialGradient(start, end color.Color) *RadialGradient { + return &RadialGradient{StartColor: start, EndColor: end} +} + +// NewVerticalGradient creates a new vertically travelling linear gradient. +// The start color will be at the top of the gradient and the end color will be at the bottom. +func NewVerticalGradient(start color.Color, end color.Color) *LinearGradient { + return &LinearGradient{StartColor: start, EndColor: end} +} diff --git a/vendor/fyne.io/fyne/v2/canvas/image.go b/vendor/fyne.io/fyne/v2/canvas/image.go new file mode 100644 index 0000000..ea0bdb2 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/canvas/image.go @@ -0,0 +1,399 @@ +package canvas + +import ( + "bytes" + "errors" + "image" + _ "image/jpeg" // avoid users having to import when using image widget + _ "image/png" // avoid the same for PNG images + "io" + "os" + "path/filepath" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/cache" + "fyne.io/fyne/v2/internal/scale" + "fyne.io/fyne/v2/internal/svg" + "fyne.io/fyne/v2/storage" +) + +// ImageFill defines the different type of ways an image can stretch to fill its space. +type ImageFill int + +const ( + // ImageFillStretch will scale the image to match the Size() values. + // This is the default and does not maintain aspect ratio. + ImageFillStretch ImageFill = iota + // ImageFillContain makes the image fit within the object Size(), + // centrally and maintaining aspect ratio. + // There may be transparent sections top and bottom or left and right. + ImageFillContain // (Fit) + // ImageFillOriginal ensures that the container grows to the pixel dimensions + // required to fit the original image. The aspect of the image will be maintained so, + // as with ImageFillContain there may be transparent areas around the image. + // Note that the minSize may be smaller than the image dimensions if scale > 1. + ImageFillOriginal + + // ImageFillCover maintains the image aspect ratio whilst filling the space. + // The image content will be centered on the available space meaning that an equal amount of top and bottom + // or left and right will be clipped if the output aspect ratio does not match the source image. + // Since: 2.7 + ImageFillCover +) + +// ImageScale defines the different scaling filters used to scaling images +type ImageScale int32 + +const ( + // ImageScaleSmooth will scale the image using ApproxBiLinear filter (or GL equivalent) + ImageScaleSmooth ImageScale = iota + // ImageScalePixels will scale the image using NearestNeighbor filter (or GL equivalent) + ImageScalePixels + // ImageScaleFastest will scale the image using hardware GPU if available + // + // Since: 2.0 + ImageScaleFastest +) + +// Declare conformity with CanvasObject interface +var _ fyne.CanvasObject = (*Image)(nil) + +// Image describes a drawable image area that can render in a Fyne canvas +// The image may be a vector or a bitmap representation, it will fill the area. +// The fill mode can be changed by setting FillMode to a different ImageFill. +type Image struct { + baseObject + + aspect float32 + icon *svg.Decoder + isSVG bool + + // one of the following sources will provide our image data + File string // Load the image from a file + Resource fyne.Resource // Load the image from an in-memory resource + Image image.Image // Specify a loaded image to use in this canvas object + + Translucency float64 // Set a translucency value > 0.0 to fade the image + FillMode ImageFill // Specify how the image should expand to fill or fit the available space + ScaleMode ImageScale // Specify the type of scaling interpolation applied to the image + + // CornerRadius specifies a radius to apply to round corners of the image. + // + // Since: 2.7 + CornerRadius float32 + + previousRender bool // did we successfully draw before? if so a nil content will need a reset +} + +// Alpha is a convenience function that returns the alpha value for an image +// based on its Translucency value. The result is 1.0 - Translucency. +func (i *Image) Alpha() float64 { + return 1.0 - i.Translucency +} + +// Aspect will return the original content aspect after it was last refreshed. +// +// Since: 2.4 +func (i *Image) Aspect() float32 { + if i.aspect == 0 { + i.Refresh() + } + return i.aspect +} + +// Hide will set this image to not be visible +func (i *Image) Hide() { + i.baseObject.Hide() + + repaint(i) +} + +// MinSize returns the specified minimum size, if set, or {1, 1} otherwise. +func (i *Image) MinSize() fyne.Size { + if i.Image == nil || i.aspect == 0 { + if i.File != "" || i.Resource != nil { + i.Refresh() + } + } + return i.baseObject.MinSize() +} + +// Move the image object to a new position, relative to its parent top, left corner. +func (i *Image) Move(pos fyne.Position) { + if i.Position() == pos { + return + } + + i.baseObject.Move(pos) + + repaint(i) +} + +// Refresh causes this image to be redrawn with its configured state. +func (i *Image) Refresh() { + rc, err := i.updateReader() + if err != nil { + fyne.LogError("Failed to load image", err) + return + } + if rc != nil { + rcMem := rc + defer rcMem.Close() + } + + if i.File != "" || i.Resource != nil || i.Image != nil { + r, err := i.updateAspectAndMinSize(rc) + if err != nil { + fyne.LogError("Failed to load image", err) + return + } + rc = io.NopCloser(r) + } else if i.previousRender { + i.previousRender = false + + Refresh(i) + return + } else { + return + } + + if i.File != "" || i.Resource != nil { + size := i.Size() + width := size.Width + height := size.Height + + if width == 0 || height == 0 { + return + } + + if i.isSVG { + tex, err := i.renderSVG(width, height) + if err != nil { + fyne.LogError("Failed to render SVG", err) + return + } + i.Image = tex + } else { + if rc == nil { + return + } + + img, _, err := image.Decode(rc) + if err != nil { + fyne.LogError("Failed to render image", err) + return + } + i.Image = img + } + } + + i.previousRender = true + Refresh(i) +} + +// Resize on an image will scale the content or reposition it according to FillMode. +// It will normally cause a Refresh to ensure the pixels are recalculated. +func (i *Image) Resize(s fyne.Size) { + if s == i.Size() { + return + } + i.baseObject.Resize(s) + if i.FillMode == ImageFillOriginal && i.Size().Height > 2 { // we can just ask for a GPU redraw to align + Refresh(i) + return + } + + i.baseObject.Resize(s) + if i.isSVG || i.Image == nil { + i.Refresh() // we need to rasterise at the new size + } else { + Refresh(i) // just re-size using GPU scaling + } +} + +// NewImageFromFile creates a new image from a local file. +// Images returned from this method will scale to fit the canvas object. +// The method for scaling can be set using the Fill field. +func NewImageFromFile(file string) *Image { + return &Image{File: file} +} + +// NewImageFromURI creates a new image from named resource. +// File URIs will read the file path and other schemes will download the data into a resource. +// HTTP and HTTPs URIs will use the GET method by default to request the resource. +// Images returned from this method will scale to fit the canvas object. +// The method for scaling can be set using the Fill field. +// +// Since: 2.0 +func NewImageFromURI(uri fyne.URI) *Image { + if uri.Scheme() == "file" && len(uri.String()) > 7 { + return NewImageFromFile(uri.Path()) + } + + var read io.ReadCloser + + read, err := storage.Reader(uri) // attempt unknown / http file type + if err != nil { + fyne.LogError("Failed to open image URI", err) + return &Image{} + } + + defer read.Close() + return NewImageFromReader(read, filepath.Base(uri.String())) +} + +// NewImageFromReader creates a new image from a data stream. +// The name parameter is required to uniquely identify this image (for caching etc.). +// If the image in this io.Reader is an SVG, the name should end ".svg". +// Images returned from this method will scale to fit the canvas object. +// The method for scaling can be set using the Fill field. +// +// Since: 2.0 +func NewImageFromReader(read io.Reader, name string) *Image { + data, err := io.ReadAll(read) + if err != nil { + fyne.LogError("Unable to read image data", err) + return nil + } + + res := &fyne.StaticResource{ + StaticName: name, + StaticContent: data, + } + + return NewImageFromResource(res) +} + +// NewImageFromResource creates a new image by loading the specified resource. +// Images returned from this method will scale to fit the canvas object. +// The method for scaling can be set using the Fill field. +func NewImageFromResource(res fyne.Resource) *Image { + return &Image{Resource: res} +} + +// NewImageFromImage returns a new Image instance that is rendered from the Go +// image.Image passed in. +// Images returned from this method will scale to fit the canvas object. +// The method for scaling can be set using the Fill field. +func NewImageFromImage(img image.Image) *Image { + return &Image{Image: img} +} + +func (i *Image) name() string { + if i.Resource != nil { + return i.Resource.Name() + } else if i.File != "" { + return i.File + } + return "" +} + +func (i *Image) updateReader() (io.ReadCloser, error) { + i.isSVG = false + if i.Resource != nil { + i.isSVG = svg.IsResourceSVG(i.Resource) + content := i.Resource.Content() + if res, ok := i.Resource.(fyne.ThemedResource); i.isSVG && ok { + th := cache.WidgetTheme(i) + if th != nil { + col := th.Color(res.ThemeColorName(), fyne.CurrentApp().Settings().ThemeVariant()) + var err error + content, err = svg.Colorize(content, col) + if err != nil { + fyne.LogError("", err) + } + } + } + return io.NopCloser(bytes.NewReader(content)), nil + } else if i.File != "" { + var err error + + fd, err := os.Open(i.File) + if err != nil { + return nil, err + } + i.isSVG = svg.IsFileSVG(i.File) + return fd, nil + } + return nil, nil +} + +func (i *Image) updateAspectAndMinSize(reader io.Reader) (io.Reader, error) { + var pixWidth, pixHeight int + + if reader != nil { + r, width, height, aspect, err := i.imageDetailsFromReader(reader) + if err != nil { + return nil, err + } + reader = r + i.aspect = aspect + pixWidth, pixHeight = width, height + } else if i.Image != nil { + original := i.Image.Bounds().Size() + i.aspect = float32(original.X) / float32(original.Y) + pixWidth, pixHeight = original.X, original.Y + } else { + return nil, errors.New("no matching image source") + } + + if i.FillMode == ImageFillOriginal { + i.SetMinSize(scale.ToFyneSize(i, pixWidth, pixHeight)) + } + return reader, nil +} + +func (i *Image) imageDetailsFromReader(source io.Reader) (reader io.Reader, width, height int, aspect float32, err error) { + if source == nil { + return nil, 0, 0, 0, errors.New("no matching reading reader") + } + + if i.isSVG { + var err error + + i.icon, err = svg.NewDecoder(source) + if err != nil { + return nil, 0, 0, 0, err + } + config := i.icon.Config() + width, height = config.Width, config.Height + aspect = config.Aspect + } else { + var buf bytes.Buffer + tee := io.TeeReader(source, &buf) + reader = io.MultiReader(&buf, source) + + config, _, err := image.DecodeConfig(tee) + if err != nil { + return nil, 0, 0, 0, err + } + width, height = config.Width, config.Height + aspect = float32(width) / float32(height) + } + return reader, width, height, aspect, err +} + +func (i *Image) renderSVG(width, height float32) (image.Image, error) { + c := fyne.CurrentApp().Driver().CanvasForObject(i) + screenWidth, screenHeight := int(width), int(height) + if c != nil { + // We want real output pixel count not just the screen coordinate space (i.e. macOS Retina) + screenWidth, screenHeight = c.PixelCoordinateForPosition(fyne.Position{X: width, Y: height}) + } else { // no canvas info, assume HiDPI + screenWidth *= 2 + screenHeight *= 2 + } + + tex := cache.GetSvg(i.name(), i, screenWidth, screenHeight) + if tex != nil { + return tex, nil + } + + var err error + tex, err = i.icon.Draw(screenWidth, screenHeight) + if err != nil { + return nil, err + } + cache.SetSvg(i.name(), i, tex, screenWidth, screenHeight) + return tex, nil +} diff --git a/vendor/fyne.io/fyne/v2/canvas/line.go b/vendor/fyne.io/fyne/v2/canvas/line.go new file mode 100644 index 0000000..3295865 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/canvas/line.go @@ -0,0 +1,108 @@ +package canvas + +import ( + "image/color" + "math" + + "fyne.io/fyne/v2" +) + +// Declare conformity with CanvasObject interface +var _ fyne.CanvasObject = (*Line)(nil) + +// Line describes a colored line primitive in a Fyne canvas. +// Lines are special as they can have a negative width or height to indicate +// an inverse slope (i.e. slope up vs down). +type Line struct { + Position1 fyne.Position // The current top-left position of the Line + Position2 fyne.Position // The current bottom-right position of the Line + Hidden bool // Is this Line currently hidden + + StrokeColor color.Color // The line stroke color + StrokeWidth float32 // The stroke width of the line +} + +// Size returns the current size of bounding box for this line object +func (l *Line) Size() fyne.Size { + return fyne.NewSize( + float32(math.Abs(float64(l.Position2.X)-float64(l.Position1.X))), + float32(math.Abs(float64(l.Position2.Y)-float64(l.Position1.Y))), + ) +} + +// Resize sets a new bottom-right position for the line object, then it will then be refreshed. +func (l *Line) Resize(size fyne.Size) { + if size == l.Size() { + return + } + + if l.Position1.X <= l.Position2.X { + l.Position2.X = l.Position1.X + size.Width + } else { + l.Position1.X = l.Position2.X + size.Width + } + if l.Position1.Y <= l.Position2.Y { + l.Position2.Y = l.Position1.Y + size.Height + } else { + l.Position1.Y = l.Position2.Y + size.Height + } + Refresh(l) +} + +// Position gets the current top-left position of this line object, relative to its parent / canvas +func (l *Line) Position() fyne.Position { + return fyne.NewPos(fyne.Min(l.Position1.X, l.Position2.X), fyne.Min(l.Position1.Y, l.Position2.Y)) +} + +// Move the line object to a new position, relative to its parent / canvas +func (l *Line) Move(pos fyne.Position) { + oldPos := l.Position() + if oldPos == pos { + return + } + + deltaX := pos.X - oldPos.X + deltaY := pos.Y - oldPos.Y + + l.Position1 = l.Position1.AddXY(deltaX, deltaY) + l.Position2 = l.Position2.AddXY(deltaX, deltaY) + repaint(l) +} + +// MinSize for a Line simply returns Size{1, 1} as there is no +// explicit content +func (l *Line) MinSize() fyne.Size { + return fyne.NewSize(1, 1) +} + +// Visible returns true if this line// Show will set this circle to be visible is visible, false otherwise +func (l *Line) Visible() bool { + return !l.Hidden +} + +// Show will set this line to be visible +func (l *Line) Show() { + l.Hidden = false + + l.Refresh() +} + +// Hide will set this line to not be visible +func (l *Line) Hide() { + l.Hidden = true + + repaint(l) +} + +// Refresh causes this line to be redrawn with its configured state. +func (l *Line) Refresh() { + Refresh(l) +} + +// NewLine returns a new Line instance +func NewLine(color color.Color) *Line { + return &Line{ + StrokeColor: color, + StrokeWidth: 1, + } +} diff --git a/vendor/fyne.io/fyne/v2/canvas/polygon.go b/vendor/fyne.io/fyne/v2/canvas/polygon.go new file mode 100644 index 0000000..37b9cb2 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/canvas/polygon.go @@ -0,0 +1,71 @@ +package canvas + +import ( + "image/color" + + "fyne.io/fyne/v2" +) + +// Declare conformity with CanvasObject interface +var _ fyne.CanvasObject = (*Polygon)(nil) + +// Polygon describes a colored regular polygon primitive in a Fyne canvas. +// The rendered portion will be in the center of the available space. +// +// Since: 2.7 +type Polygon struct { + baseObject + + FillColor color.Color // The polygon fill color + StrokeColor color.Color // The polygon stroke color + StrokeWidth float32 // The stroke width of the polygon + CornerRadius float32 // The radius of the polygon corners + Angle float32 // Angle of polygon, in degrees (positive means clockwise, negative means counter-clockwise direction). + Sides uint // Amount of sides of polygon. +} + +// Hide will set this polygon to not be visible +func (r *Polygon) Hide() { + r.baseObject.Hide() + + repaint(r) +} + +// Move the polygon to a new position, relative to its parent / canvas +func (r *Polygon) Move(pos fyne.Position) { + if r.Position() == pos { + return + } + + r.baseObject.Move(pos) + + repaint(r) +} + +// Refresh causes this polygon to be redrawn with its configured state. +func (r *Polygon) Refresh() { + Refresh(r) +} + +// Resize on a polygon updates the new size of this object. +// If it has a stroke width this will cause it to Refresh. +func (r *Polygon) Resize(s fyne.Size) { + if s == r.Size() { + return + } + + r.baseObject.Resize(s) + if r.StrokeWidth == 0 { + return + } + + Refresh(r) +} + +// NewPolygon returns a new Polygon instance +func NewPolygon(sides uint, color color.Color) *Polygon { + return &Polygon{ + Sides: sides, + FillColor: color, + } +} diff --git a/vendor/fyne.io/fyne/v2/canvas/raster.go b/vendor/fyne.io/fyne/v2/canvas/raster.go new file mode 100644 index 0000000..8d3dfc9 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/canvas/raster.go @@ -0,0 +1,200 @@ +package canvas + +import ( + "image" + "image/color" + "image/draw" + + "fyne.io/fyne/v2" +) + +// Declare conformity with CanvasObject interface +var _ fyne.CanvasObject = (*Raster)(nil) + +// Raster describes a raster image area that can render in a Fyne canvas +type Raster struct { + baseObject + + // Render the raster image from code + Generator func(w, h int) image.Image + + // Set a translucency value > 0.0 to fade the raster + Translucency float64 + // Specify the type of scaling interpolation applied to the raster if it is not full-size + // Since: 1.4.1 + ScaleMode ImageScale +} + +// Alpha is a convenience function that returns the alpha value for a raster +// based on its Translucency value. The result is 1.0 - Translucency. +func (r *Raster) Alpha() float64 { + return 1.0 - r.Translucency +} + +// Hide will set this raster to not be visible +func (r *Raster) Hide() { + r.baseObject.Hide() + + repaint(r) +} + +// Move the raster to a new position, relative to its parent / canvas +func (r *Raster) Move(pos fyne.Position) { + if r.Position() == pos { + return + } + + r.baseObject.Move(pos) + + repaint(r) +} + +// Resize on a raster image causes the new size to be set and then calls Refresh. +// This causes the underlying data to be recalculated and a new output to be drawn. +func (r *Raster) Resize(s fyne.Size) { + if s == r.Size() { + return + } + + r.baseObject.Resize(s) + Refresh(r) +} + +// Refresh causes this raster to be redrawn with its configured state. +func (r *Raster) Refresh() { + Refresh(r) +} + +// NewRaster returns a new Image instance that is rendered dynamically using +// the specified generate function. +// Images returned from this method should draw dynamically to fill the width +// and height parameters passed to pixelColor. +func NewRaster(generate func(w, h int) image.Image) *Raster { + return &Raster{Generator: generate} +} + +type pixelRaster struct { + r *Raster + + img draw.Image +} + +// NewRasterWithPixels returns a new Image instance that is rendered dynamically +// by iterating over the specified pixelColor function for each x, y pixel. +// Images returned from this method should draw dynamically to fill the width +// and height parameters passed to pixelColor. +func NewRasterWithPixels(pixelColor func(x, y, w, h int) color.Color) *Raster { + pix := &pixelRaster{} + pix.r = &Raster{ + Generator: func(w, h int) image.Image { + if pix.img == nil || pix.img.Bounds().Size().X != w || pix.img.Bounds().Size().Y != h { + // raster first pixel, figure out color type + var dst draw.Image + rect := image.Rect(0, 0, w, h) + switch pixelColor(0, 0, w, h).(type) { + case color.Alpha: + dst = image.NewAlpha(rect) + case color.Alpha16: + dst = image.NewAlpha16(rect) + case color.CMYK: + dst = image.NewCMYK(rect) + case color.Gray: + dst = image.NewGray(rect) + case color.Gray16: + dst = image.NewGray16(rect) + case color.NRGBA: + dst = image.NewNRGBA(rect) + case color.NRGBA64: + dst = image.NewNRGBA64(rect) + case color.RGBA: + dst = image.NewRGBA(rect) + case color.RGBA64: + dst = image.NewRGBA64(rect) + default: + dst = image.NewRGBA(rect) + } + pix.img = dst + } + + for y := 0; y < h; y++ { + for x := 0; x < w; x++ { + pix.img.Set(x, y, pixelColor(x, y, w, h)) + } + } + + return pix.img + }, + } + return pix.r +} + +type subImg interface { + SubImage(r image.Rectangle) image.Image +} + +// NewRasterFromImage returns a new Raster instance that is rendered from the Go +// image.Image passed in. +// Rasters returned from this method will map pixel for pixel to the screen +// starting img.Bounds().Min pixels from the top left of the canvas object. +// Truncates rather than scales the image. +// If smaller than the target space, the image will be padded with zero-pixels to the target size. +func NewRasterFromImage(img image.Image) *Raster { + return &Raster{ + Generator: func(w int, h int) image.Image { + bounds := img.Bounds() + + rect := image.Rect(0, 0, w, h) + + switch { + case w == bounds.Max.X && h == bounds.Max.Y: + return img + case w >= bounds.Max.X && h >= bounds.Max.Y: + // try quickly truncating + if sub, ok := img.(subImg); ok { + return sub.SubImage(image.Rectangle{ + Min: bounds.Min, + Max: image.Point{ + X: bounds.Min.X + w, + Y: bounds.Min.Y + h, + }, + }) + } + default: + if !rect.Overlaps(bounds) { + return image.NewUniform(color.RGBA{}) + } + bounds = bounds.Intersect(rect) + } + + // respect the user's pixel format (if possible) + var dst draw.Image + switch i := img.(type) { + case *image.Alpha: + dst = image.NewAlpha(rect) + case *image.Alpha16: + dst = image.NewAlpha16(rect) + case *image.CMYK: + dst = image.NewCMYK(rect) + case *image.Gray: + dst = image.NewGray(rect) + case *image.Gray16: + dst = image.NewGray16(rect) + case *image.NRGBA: + dst = image.NewNRGBA(rect) + case *image.NRGBA64: + dst = image.NewNRGBA64(rect) + case *image.Paletted: + dst = image.NewPaletted(rect, i.Palette) + case *image.RGBA: + dst = image.NewRGBA(rect) + case *image.RGBA64: + dst = image.NewRGBA64(rect) + default: + dst = image.NewRGBA(rect) + } + + draw.Draw(dst, bounds, img, bounds.Min, draw.Over) + return dst + }, + } +} diff --git a/vendor/fyne.io/fyne/v2/canvas/rectangle.go b/vendor/fyne.io/fyne/v2/canvas/rectangle.go new file mode 100644 index 0000000..59ce921 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/canvas/rectangle.go @@ -0,0 +1,95 @@ +package canvas + +import ( + "image/color" + + "fyne.io/fyne/v2" +) + +// Declare conformity with CanvasObject interface +var _ fyne.CanvasObject = (*Rectangle)(nil) + +// Rectangle describes a colored rectangle primitive in a Fyne canvas +type Rectangle struct { + baseObject + + FillColor color.Color // The rectangle fill color + StrokeColor color.Color // The rectangle stroke color + StrokeWidth float32 // The stroke width of the rectangle + // The radius of the rectangle corners + // + // Since: 2.4 + CornerRadius float32 + + // Enforce an aspect ratio for the rectangle, the content will be made shorter or narrower + // to meet the requested aspect, if set. + // + // Since: 2.7 + Aspect float32 + + // The radius of the rectangle top-right corner only. + // + // Since: 2.7 + TopRightCornerRadius float32 + + // The radius of the rectangle top-left corner only. + // + // Since: 2.7 + TopLeftCornerRadius float32 + + // The radius of the rectangle bottom-right corner only. + // + // Since: 2.7 + BottomRightCornerRadius float32 + + // The radius of the rectangle bottom-left corner only. + // + // Since: 2.7 + BottomLeftCornerRadius float32 +} + +// Hide will set this rectangle to not be visible +func (r *Rectangle) Hide() { + r.baseObject.Hide() + + repaint(r) +} + +// Move the rectangle to a new position, relative to its parent / canvas +func (r *Rectangle) Move(pos fyne.Position) { + if r.Position() == pos { + return + } + + r.baseObject.Move(pos) + + repaint(r) +} + +// Refresh causes this rectangle to be redrawn with its configured state. +func (r *Rectangle) Refresh() { + Refresh(r) +} + +// Resize on a rectangle updates the new size of this object. +// If it has a stroke width this will cause it to Refresh. +// If Aspect is non-zero it may cause the rectangle to be smaller than the requested size. +func (r *Rectangle) Resize(s fyne.Size) { + if s == r.Size() { + return + } + + r.baseObject.Resize(s) + if r.StrokeWidth == 0 { + return + } + + Refresh(r) +} + +// NewRectangle returns a new Rectangle instance +func NewRectangle(color color.Color) *Rectangle { + return &Rectangle{ + FillColor: color, + } +} diff --git a/vendor/fyne.io/fyne/v2/canvas/square.go b/vendor/fyne.io/fyne/v2/canvas/square.go new file mode 100644 index 0000000..4931392 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/canvas/square.go @@ -0,0 +1,13 @@ +package canvas + +import "image/color" + +// NewSquare returns a new Rectangle instance that has a square aspect ratio. +// +// Since: 2.7 +func NewSquare(color color.Color) *Rectangle { + return &Rectangle{ + Aspect: 1, + FillColor: color, + } +} diff --git a/vendor/fyne.io/fyne/v2/canvas/text.go b/vendor/fyne.io/fyne/v2/canvas/text.go new file mode 100644 index 0000000..05c8bfa --- /dev/null +++ b/vendor/fyne.io/fyne/v2/canvas/text.go @@ -0,0 +1,85 @@ +package canvas + +import ( + "image/color" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/theme" +) + +// Declare conformity with CanvasObject interface +var _ fyne.CanvasObject = (*Text)(nil) + +// Text describes a text primitive in a Fyne canvas. +// A text object can have a style set which will apply to the whole string. +// No formatting or text parsing will be performed +type Text struct { + baseObject + Alignment fyne.TextAlign // The alignment of the text content + + Color color.Color // The main text draw color + Text string // The string content of this Text + TextSize float32 // Size of the text - if the Canvas scale is 1.0 this will be equivalent to point size + TextStyle fyne.TextStyle // The style of the text content + + // FontSource defines a resource that can be used instead of the theme for looking up the font. + // When a font source is set the `TextStyle` may not be effective, as it will be limited to the styles + // present in the data provided. + // + // Since: 2.5 + FontSource fyne.Resource +} + +// Hide will set this text to not be visible +func (t *Text) Hide() { + t.baseObject.Hide() + + repaint(t) +} + +// MinSize returns the minimum size of this text object based on its font size and content. +// This is normally determined by the render implementation. +func (t *Text) MinSize() fyne.Size { + s, _ := fyne.CurrentApp().Driver().RenderedTextSize(t.Text, t.TextSize, t.TextStyle, t.FontSource) + return s +} + +// Move the text to a new position, relative to its parent / canvas +func (t *Text) Move(pos fyne.Position) { + if t.Position() == pos { + return + } + + t.baseObject.Move(pos) + + repaint(t) +} + +// Resize on a text updates the new size of this object, which may not result in a visual change, depending on alignment. +func (t *Text) Resize(s fyne.Size) { + if s == t.Size() { + return + } + + t.baseObject.Resize(s) + Refresh(t) +} + +// SetMinSize has no effect as the smallest size this canvas object can be is based on its font size and content. +func (t *Text) SetMinSize(fyne.Size) { + // no-op +} + +// Refresh causes this text to be redrawn with its configured state. +func (t *Text) Refresh() { + Refresh(t) +} + +// NewText returns a new Text implementation +func NewText(text string, color color.Color) *Text { + return &Text{ + Color: color, + Text: text, + TextSize: theme.TextSize(), + } +} diff --git a/vendor/fyne.io/fyne/v2/canvasobject.go b/vendor/fyne.io/fyne/v2/canvasobject.go new file mode 100644 index 0000000..0566627 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/canvasobject.go @@ -0,0 +1,107 @@ +package fyne + +// CanvasObject describes any graphical object that can be added to a canvas. +// Objects have a size and position that can be controlled through this API. +// MinSize is used to determine the minimum size which this object should be displayed. +// An object will be visible by default but can be hidden with Hide() and re-shown with Show(). +// +// Note: If this object is controlled as part of a Layout you should not call +// Resize(Size) or Move(Position). +type CanvasObject interface { + // geometry + + // MinSize returns the minimum size this object needs to be drawn. + MinSize() Size + // Move moves this object to the given position relative to its parent. + // This should only be called if your object is not in a container with a layout manager. + Move(Position) + // Position returns the current position of the object relative to its parent. + Position() Position + // Resize resizes this object to the given size. + // This should only be called if your object is not in a container with a layout manager. + Resize(Size) + // Size returns the current size of this object. + Size() Size + + // visibility + + // Hide hides this object. + Hide() + // Visible returns whether this object is visible or not. + Visible() bool + // Show shows this object. + Show() + + // Refresh must be called if this object should be redrawn because its inner state changed. + Refresh() +} + +// Disableable describes any [CanvasObject] that can be disabled. +// This is primarily used with objects that also implement the Tappable interface. +type Disableable interface { + Enable() + Disable() + Disabled() bool +} + +// DoubleTappable describes any [CanvasObject] that can also be double tapped. +type DoubleTappable interface { + DoubleTapped(*PointEvent) +} + +// Draggable indicates that a [CanvasObject] can be dragged. +// This is used for any item that the user has indicated should be moved across the screen. +type Draggable interface { + Dragged(*DragEvent) + DragEnd() +} + +// Focusable describes any [CanvasObject] that can respond to being focused. +// It will receive the FocusGained and FocusLost events appropriately. +// When focused it will also have TypedRune called as text is input and +// TypedKey called when other keys are pressed. +// +// Note: You must not change canvas state (including overlays or focus) in FocusGained or FocusLost +// or you would end up with a dead-lock. +type Focusable interface { + // FocusGained is a hook called by the focus handling logic after this object gained the focus. + FocusGained() + // FocusLost is a hook called by the focus handling logic after this object lost the focus. + FocusLost() + + // TypedRune is a hook called by the input handling logic on text input events if this object is focused. + TypedRune(rune) + // TypedKey is a hook called by the input handling logic on key events if this object is focused. + TypedKey(*KeyEvent) +} + +// Scrollable describes any [CanvasObject] that can also be scrolled. +// This is mostly used to implement the widget.ScrollContainer. +type Scrollable interface { + Scrolled(*ScrollEvent) +} + +// SecondaryTappable describes a [CanvasObject] that can be right-clicked or long-tapped. +type SecondaryTappable interface { + TappedSecondary(*PointEvent) +} + +// Shortcutable describes any [CanvasObject] that can respond to shortcut commands (quit, cut, copy, and paste). +type Shortcutable interface { + TypedShortcut(Shortcut) +} + +// Tabbable describes any object that needs to accept the Tab key presses. +// +// Since: 2.1 +type Tabbable interface { + // AcceptsTab is a hook called by the key press handling logic. + // If it returns true then the Tab key events will be sent using TypedKey. + AcceptsTab() bool +} + +// Tappable describes any [CanvasObject] that can also be tapped. +// This should be implemented by buttons etc that wish to handle pointer interactions. +type Tappable interface { + Tapped(*PointEvent) +} diff --git a/vendor/fyne.io/fyne/v2/clipboard.go b/vendor/fyne.io/fyne/v2/clipboard.go new file mode 100644 index 0000000..fe51b9b --- /dev/null +++ b/vendor/fyne.io/fyne/v2/clipboard.go @@ -0,0 +1,9 @@ +package fyne + +// Clipboard represents the system clipboard interface +type Clipboard interface { + // Content returns the clipboard content + Content() string + // SetContent sets the clipboard content + SetContent(content string) +} diff --git a/vendor/fyne.io/fyne/v2/cloud.go b/vendor/fyne.io/fyne/v2/cloud.go new file mode 100644 index 0000000..2e815bb --- /dev/null +++ b/vendor/fyne.io/fyne/v2/cloud.go @@ -0,0 +1,39 @@ +package fyne + +// CloudProvider specifies the identifying information of a cloud provider. +// This information is mostly used by the [fyne.io/cloud.ShowSettings] user flow. +// +// Since: 2.3 +type CloudProvider interface { + // ProviderDescription returns a more detailed description of this cloud provider. + ProviderDescription() string + // ProviderIcon returns an icon resource that is associated with the given cloud service. + ProviderIcon() Resource + // ProviderName returns the name of this cloud provider, usually the name of the service it uses. + ProviderName() string + + // Cleanup is called when this provider is no longer used and should be disposed. + // This is guaranteed to execute before a new provider is `Setup` + Cleanup(App) + // Setup is called when this provider is being used for the first time. + // Returning an error will exit the cloud setup process, though it can be retried. + Setup(App) error +} + +// CloudProviderPreferences interface defines the functionality that a cloud provider will include if it is capable +// of synchronizing user preferences. +// +// Since: 2.3 +type CloudProviderPreferences interface { + // CloudPreferences returns a preference provider that will sync values to the cloud this provider uses. + CloudPreferences(App) Preferences +} + +// CloudProviderStorage interface defines the functionality that a cloud provider will include if it is capable +// of synchronizing user documents. +// +// Since: 2.3 +type CloudProviderStorage interface { + // CloudStorage returns a storage provider that will sync documents to the cloud this provider uses. + CloudStorage(App) Storage +} diff --git a/vendor/fyne.io/fyne/v2/container.go b/vendor/fyne.io/fyne/v2/container.go new file mode 100644 index 0000000..423bf98 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/container.go @@ -0,0 +1,202 @@ +package fyne + +// Declare conformity to [CanvasObject] +var _ CanvasObject = (*Container)(nil) + +// Container is a [CanvasObject] that contains a collection of child objects. +// The layout of the children is set by the specified Layout. +type Container struct { + size Size // The current size of the Container + position Position // The current position of the Container + Hidden bool // Is this Container hidden + + Layout Layout // The Layout algorithm for arranging child [CanvasObject]s + Objects []CanvasObject // The set of [CanvasObject]s this container holds +} + +// NewContainer returns a new [Container] instance holding the specified [CanvasObject]s. +// +// Deprecated: Use [fyne.io/fyne/v2/container.NewWithoutLayout] to create a container that uses manual layout. +func NewContainer(objects ...CanvasObject) *Container { + return NewContainerWithoutLayout(objects...) +} + +// NewContainerWithoutLayout returns a new [Container] instance holding the specified +// [CanvasObject]s that are manually arranged. +// +// Deprecated: Use [fyne.io/fyne/v2/container.NewWithoutLayout] instead. +func NewContainerWithoutLayout(objects ...CanvasObject) *Container { + ret := &Container{ + Objects: objects, + } + + ret.size = ret.MinSize() + return ret +} + +// NewContainerWithLayout returns a new [Container] instance holding the specified +// [CanvasObject]s which will be laid out according to the specified Layout. +// +// Deprecated: Use [fyne.io/fyne/v2/container.New] instead. +func NewContainerWithLayout(layout Layout, objects ...CanvasObject) *Container { + ret := &Container{ + Objects: objects, + Layout: layout, + } + + ret.size = layout.MinSize(objects) + ret.layout() + return ret +} + +// Add appends the specified object to the items this container manages. +// +// Since: 1.4 +func (c *Container) Add(add CanvasObject) { + if add == nil { + return + } + + c.Objects = append(c.Objects, add) + c.layout() +} + +// AddObject adds another [CanvasObject] to the set this Container holds. +// +// Deprecated: Use [Container.Add] instead. +func (c *Container) AddObject(o CanvasObject) { + c.Add(o) +} + +// Hide sets this container, and all its children, to be not visible. +func (c *Container) Hide() { + if c.Hidden { + return + } + + c.Hidden = true + repaint(c) +} + +// MinSize calculates the minimum size of c. +// This is delegated to the [Container.Layout], if specified, otherwise it will be calculated. +func (c *Container) MinSize() Size { + if c.Layout != nil { + return c.Layout.MinSize(c.Objects) + } + + minSize := NewSize(1, 1) + for _, child := range c.Objects { + minSize = minSize.Max(child.MinSize()) + } + + return minSize +} + +// Move the container (and all its children) to a new position, relative to its parent. +func (c *Container) Move(pos Position) { + c.position = pos + repaint(c) +} + +// Position gets the current position of c relative to its parent. +func (c *Container) Position() Position { + return c.position +} + +// Refresh causes this object to be redrawn in its current state +func (c *Container) Refresh() { + c.layout() + + for _, child := range c.Objects { + child.Refresh() + } + + // this is basically just canvas.Refresh(c) without the package loop + o := CurrentApp().Driver().CanvasForObject(c) + if o == nil { + return + } + o.Refresh(c) +} + +// Remove updates the contents of this container to no longer include the specified object. +// This method is not intended to be used inside a loop, to remove all the elements. +// It is much more efficient to call [Container.RemoveAll) instead. +func (c *Container) Remove(rem CanvasObject) { + if len(c.Objects) == 0 { + return + } + + for i, o := range c.Objects { + if o != rem { + continue + } + copy(c.Objects[i:], c.Objects[i+1:]) + c.Objects[len(c.Objects)-1] = nil + c.Objects = c.Objects[:len(c.Objects)-1] + c.layout() + return + } +} + +// RemoveAll updates the contents of this container to no longer include any objects. +// +// Since: 2.2 +func (c *Container) RemoveAll() { + c.Objects = nil + c.layout() +} + +// Resize sets a new size for c. +func (c *Container) Resize(size Size) { + if c.size == size { + return + } + + c.size = size + c.layout() +} + +// Show sets this container, and all its children, to be visible. +func (c *Container) Show() { + if !c.Hidden { + return + } + + c.Hidden = false +} + +// Size returns the current size c. +func (c *Container) Size() Size { + return c.size +} + +// Visible returns true if the container is currently visible, false otherwise. +func (c *Container) Visible() bool { + return !c.Hidden +} + +func (c *Container) layout() { + if c.Layout == nil { + return + } + + c.Layout.Layout(c.Objects, c.size) +} + +// repaint instructs the containing canvas to redraw, even if nothing changed. +// This method is a duplicate of what is in `canvas/canvas.go` to avoid a dependency loop or public API. +func repaint(obj *Container) { + app := CurrentApp() + if app == nil || app.Driver() == nil { + return + } + + c := app.Driver().CanvasForObject(obj) + if c != nil { + if paint, ok := c.(interface{ SetDirty() }); ok { + paint.SetDirty() + } + } +} diff --git a/vendor/fyne.io/fyne/v2/container/apptabs.go b/vendor/fyne.io/fyne/v2/container/apptabs.go new file mode 100644 index 0000000..6e9fdd0 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/container/apptabs.go @@ -0,0 +1,470 @@ +package container + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/layout" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +// Declare conformity with Widget interface. +var _ fyne.Widget = (*AppTabs)(nil) + +// AppTabs container is used to split your application into various different areas identified by tabs. +// The tabs contain text and/or an icon and allow the user to switch between the content specified in each TabItem. +// Each item is represented by a button at the edge of the container. +// +// Since: 1.4 +type AppTabs struct { + widget.BaseWidget + + Items []*TabItem + + // Deprecated: Use `OnSelected func(*TabItem)` instead. + OnChanged func(*TabItem) `json:"-"` + OnSelected func(*TabItem) `json:"-"` + OnUnselected func(*TabItem) `json:"-"` + + current int + location TabLocation + isTransitioning bool + + popUpMenu *widget.PopUpMenu +} + +// NewAppTabs creates a new tab container that allows the user to choose between different areas of an app. +// +// Since: 1.4 +func NewAppTabs(items ...*TabItem) *AppTabs { + tabs := &AppTabs{Items: items} + tabs.BaseWidget.ExtendBaseWidget(tabs) + return tabs +} + +// CreateRenderer is a private method to Fyne which links this widget to its renderer +func (t *AppTabs) CreateRenderer() fyne.WidgetRenderer { + t.BaseWidget.ExtendBaseWidget(t) + th := t.Theme() + v := fyne.CurrentApp().Settings().ThemeVariant() + + r := &appTabsRenderer{ + baseTabsRenderer: baseTabsRenderer{ + bar: &fyne.Container{}, + divider: canvas.NewRectangle(th.Color(theme.ColorNameShadow, v)), + indicator: canvas.NewRectangle(th.Color(theme.ColorNamePrimary, v)), + }, + appTabs: t, + } + r.action = r.buildOverflowTabsButton() + r.tabs = t + + // Initially setup the tab bar to only show one tab, all others will be in overflow. + // When the widget is laid out, and we know the size, the tab bar will be updated to show as many as can fit. + r.updateTabs(1) + r.updateIndicator(false) + r.applyTheme(t) + return r +} + +// Append adds a new TabItem to the end of the tab bar. +func (t *AppTabs) Append(item *TabItem) { + t.SetItems(append(t.Items, item)) +} + +// CurrentTab returns the currently selected TabItem. +// +// Deprecated: Use `AppTabs.Selected() *TabItem` instead. +func (t *AppTabs) CurrentTab() *TabItem { + if t.current < 0 || t.current >= len(t.Items) { + return nil + } + return t.Items[t.current] +} + +// CurrentTabIndex returns the index of the currently selected TabItem. +// +// Deprecated: Use `AppTabs.SelectedIndex() int` instead. +func (t *AppTabs) CurrentTabIndex() int { + return t.SelectedIndex() +} + +// DisableIndex disables the TabItem at the specified index. +// +// Since: 2.3 +func (t *AppTabs) DisableIndex(i int) { + disableIndex(t, i) +} + +// DisableItem disables the specified TabItem. +// +// Since: 2.3 +func (t *AppTabs) DisableItem(item *TabItem) { + disableItem(t, item) +} + +// EnableIndex enables the TabItem at the specified index. +// +// Since: 2.3 +func (t *AppTabs) EnableIndex(i int) { + enableIndex(t, i) +} + +// EnableItem enables the specified TabItem. +// +// Since: 2.3 +func (t *AppTabs) EnableItem(item *TabItem) { + enableItem(t, item) +} + +// ExtendBaseWidget is used by an extending widget to make use of BaseWidget functionality. +// +// Deprecated: Support for extending containers is being removed +func (t *AppTabs) ExtendBaseWidget(wid fyne.Widget) { + t.BaseWidget.ExtendBaseWidget(wid) +} + +// Hide hides the widget. +func (t *AppTabs) Hide() { + if t.popUpMenu != nil { + t.popUpMenu.Hide() + t.popUpMenu = nil + } + t.BaseWidget.Hide() +} + +// MinSize returns the size that this widget should not shrink below +func (t *AppTabs) MinSize() fyne.Size { + t.BaseWidget.ExtendBaseWidget(t) + return t.BaseWidget.MinSize() +} + +// Remove tab by value. +func (t *AppTabs) Remove(item *TabItem) { + removeItem(t, item) + t.Refresh() +} + +// RemoveIndex removes tab by index. +func (t *AppTabs) RemoveIndex(index int) { + removeIndex(t, index) + t.Refresh() +} + +// Select sets the specified TabItem to be selected and its content visible. +func (t *AppTabs) Select(item *TabItem) { + selectItem(t, item) +} + +// SelectIndex sets the TabItem at the specific index to be selected and its content visible. +func (t *AppTabs) SelectIndex(index int) { + selectIndex(t, index) +} + +// SelectTab sets the specified TabItem to be selected and its content visible. +// +// Deprecated: Use `AppTabs.Select(*TabItem)` instead. +func (t *AppTabs) SelectTab(item *TabItem) { + for i, child := range t.Items { + if child == item { + t.SelectTabIndex(i) + return + } + } +} + +// SelectTabIndex sets the TabItem at the specific index to be selected and its content visible. +// +// Deprecated: Use `AppTabs.SelectIndex(int)` instead. +func (t *AppTabs) SelectTabIndex(index int) { + if index < 0 || index >= len(t.Items) || t.current == index { + return + } + t.current = index + t.Refresh() + + if t.OnChanged != nil { + t.OnChanged(t.Items[t.current]) + } +} + +// Selected returns the currently selected TabItem. +func (t *AppTabs) Selected() *TabItem { + return selected(t) +} + +// SelectedIndex returns the index of the currently selected TabItem. +func (t *AppTabs) SelectedIndex() int { + return t.selected() +} + +// SetItems sets the containers items and refreshes. +func (t *AppTabs) SetItems(items []*TabItem) { + setItems(t, items) + t.Refresh() +} + +// SetTabLocation sets the location of the tab bar +func (t *AppTabs) SetTabLocation(l TabLocation) { + t.location = tabsAdjustedLocation(l, t) + t.Refresh() +} + +// Show this widget, if it was previously hidden +func (t *AppTabs) Show() { + t.BaseWidget.Show() + t.SelectIndex(t.current) +} + +func (t *AppTabs) onUnselected() func(*TabItem) { + return t.OnUnselected +} + +func (t *AppTabs) onSelected() func(*TabItem) { + return func(tab *TabItem) { + if f := t.OnChanged; f != nil { + f(tab) + } + if f := t.OnSelected; f != nil { + f(tab) + } + } +} + +func (t *AppTabs) items() []*TabItem { + return t.Items +} + +func (t *AppTabs) selected() int { + if len(t.Items) == 0 { + return -1 + } + return t.current +} + +func (t *AppTabs) setItems(items []*TabItem) { + t.Items = items +} + +func (t *AppTabs) setSelected(selected int) { + t.current = selected +} + +func (t *AppTabs) setTransitioning(transitioning bool) { + t.isTransitioning = transitioning +} + +func (t *AppTabs) tabLocation() TabLocation { + return t.location +} + +func (t *AppTabs) transitioning() bool { + return t.isTransitioning +} + +// Declare conformity with WidgetRenderer interface. +var _ fyne.WidgetRenderer = (*appTabsRenderer)(nil) + +type appTabsRenderer struct { + baseTabsRenderer + appTabs *AppTabs +} + +func (r *appTabsRenderer) Layout(size fyne.Size) { + // Try render as many tabs as will fit, others will appear in the overflow + if len(r.appTabs.Items) == 0 { + r.updateTabs(0) + } else { + for i := len(r.appTabs.Items); i > 0; i-- { + r.updateTabs(i) + barMin := r.bar.MinSize() + if r.appTabs.location == TabLocationLeading || r.appTabs.location == TabLocationTrailing { + if barMin.Height <= size.Height { + // Tab bar is short enough to fit + break + } + } else { + if barMin.Width <= size.Width { + // Tab bar is thin enough to fit + break + } + } + } + } + + r.layout(r.appTabs, size) + r.updateIndicator(r.appTabs.transitioning()) + if r.appTabs.transitioning() { + r.appTabs.setTransitioning(false) + } +} + +func (r *appTabsRenderer) MinSize() fyne.Size { + return r.minSize(r.appTabs) +} + +func (r *appTabsRenderer) Objects() []fyne.CanvasObject { + return r.objects(r.appTabs) +} + +func (r *appTabsRenderer) Refresh() { + r.Layout(r.appTabs.Size()) + + r.refresh(r.appTabs) + + canvas.Refresh(r.appTabs) +} + +func (r *appTabsRenderer) buildOverflowTabsButton() (overflow *widget.Button) { + overflow = &widget.Button{Icon: moreIcon(r.appTabs), Importance: widget.LowImportance, OnTapped: func() { + // Show pop up containing all tabs which did not fit in the tab bar + + itemLen, objLen := len(r.appTabs.Items), len(r.bar.Objects[0].(*fyne.Container).Objects) + items := make([]*fyne.MenuItem, 0, itemLen-objLen) + for i := objLen; i < itemLen; i++ { + index := i // capture + // FIXME MenuItem doesn't support icons (#1752) + // FIXME MenuItem can't show if it is the currently selected tab (#1753) + ti := r.appTabs.Items[i] + mi := fyne.NewMenuItem(ti.Text, func() { + r.appTabs.SelectIndex(index) + if r.appTabs.popUpMenu != nil { + r.appTabs.popUpMenu.Hide() + r.appTabs.popUpMenu = nil + } + }) + if ti.Disabled() { + mi.Disabled = true + } + items = append(items, mi) + } + + r.appTabs.popUpMenu = buildPopUpMenu(r.appTabs, overflow, items) + }} + + return overflow +} + +func (r *appTabsRenderer) buildTabButtons(count int) *fyne.Container { + buttons := &fyne.Container{} + + var iconPos buttonIconPosition + if isMobile(r.tabs) { + cells := count + if cells == 0 { + cells = 1 + } + if r.appTabs.location == TabLocationTop || r.appTabs.location == TabLocationBottom { + buttons.Layout = layout.NewGridLayoutWithColumns(cells) + } else { + buttons.Layout = layout.NewGridLayoutWithRows(cells) + } + iconPos = buttonIconTop + } else if r.appTabs.location == TabLocationLeading || r.appTabs.location == TabLocationTrailing { + buttons.Layout = layout.NewVBoxLayout() + iconPos = buttonIconTop + } else { + buttons.Layout = layout.NewHBoxLayout() + iconPos = buttonIconInline + } + + for i := 0; i < count; i++ { + item := r.appTabs.Items[i] + if item.button == nil { + item.button = &tabButton{ + onTapped: func() { r.appTabs.Select(item) }, + tabs: r.tabs, + } + if item.disabled { + item.button.Disable() + } + } + button := item.button + button.icon = item.Icon + button.iconPosition = iconPos + if i == r.appTabs.current { + button.importance = widget.HighImportance + } else { + button.importance = widget.MediumImportance + } + button.text = item.Text + button.textAlignment = fyne.TextAlignCenter + button.Refresh() + buttons.Objects = append(buttons.Objects, button) + } + return buttons +} + +func (r *appTabsRenderer) updateIndicator(animate bool) { + if len(r.appTabs.Items) == 0 || r.appTabs.current < 0 { + r.indicator.Hide() + return + } + r.indicator.Show() + + var selectedPos fyne.Position + var selectedSize fyne.Size + + buttons := r.bar.Objects[0].(*fyne.Container).Objects + if r.appTabs.current >= len(buttons) { + if a := r.action; a != nil { + selectedPos = a.Position() + selectedSize = a.Size() + } + } else { + selected := buttons[r.appTabs.current] + selectedPos = selected.Position() + selectedSize = selected.Size() + } + + var indicatorPos fyne.Position + var indicatorSize fyne.Size + th := r.appTabs.Theme() + pad := th.Size(theme.SizeNamePadding) + + switch r.appTabs.location { + case TabLocationTop: + indicatorPos = fyne.NewPos(selectedPos.X, r.bar.MinSize().Height) + indicatorSize = fyne.NewSize(selectedSize.Width, pad) + case TabLocationLeading: + indicatorPos = fyne.NewPos(r.bar.MinSize().Width, selectedPos.Y) + indicatorSize = fyne.NewSize(pad, selectedSize.Height) + case TabLocationBottom: + indicatorPos = fyne.NewPos(selectedPos.X, r.bar.Position().Y-pad) + indicatorSize = fyne.NewSize(selectedSize.Width, pad) + case TabLocationTrailing: + indicatorPos = fyne.NewPos(r.bar.Position().X-pad, selectedPos.Y) + indicatorSize = fyne.NewSize(pad, selectedSize.Height) + } + + r.moveIndicator(indicatorPos, indicatorSize, th, animate) +} + +func (r *appTabsRenderer) updateTabs(max int) { + tabCount := len(r.appTabs.Items) + + // Set overflow action + if tabCount <= max { + r.action.Hide() + r.bar.Layout = layout.NewStackLayout() + } else { + tabCount = max + r.action.Show() + + // Set layout of tab bar containing tab buttons and overflow action + if r.appTabs.location == TabLocationLeading || r.appTabs.location == TabLocationTrailing { + r.bar.Layout = layout.NewBorderLayout(nil, r.action, nil, nil) + } else { + r.bar.Layout = layout.NewBorderLayout(nil, nil, nil, r.action) + } + } + + buttons := r.buildTabButtons(tabCount) + + r.bar.Objects = []fyne.CanvasObject{buttons} + if a := r.action; a != nil { + r.bar.Objects = append(r.bar.Objects, a) + } + + r.bar.Refresh() +} diff --git a/vendor/fyne.io/fyne/v2/container/clip.go b/vendor/fyne.io/fyne/v2/container/clip.go new file mode 100644 index 0000000..ceca3eb --- /dev/null +++ b/vendor/fyne.io/fyne/v2/container/clip.go @@ -0,0 +1,70 @@ +package container + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/widget" +) + +// Declare conformity with Widget interface +var _ fyne.Widget = (*Clip)(nil) + +// Clip describes a rectangular region that will clip anything outside its bounds. +// +// Since: 2.7 +type Clip struct { + widget.BaseWidget + Content fyne.CanvasObject +} + +// NewClip returns a new rectangular clipping object. +// +// Since: 2.7 +func NewClip(content fyne.CanvasObject) *Clip { + return &Clip{Content: content} +} + +func (c *Clip) CreateRenderer() fyne.WidgetRenderer { + c.ExtendBaseWidget(c) + return newClipRenderer(c) +} + +// MinSize for a Clip simply returns Size{1, 1} as there is no +// explicit content +func (c *Clip) MinSize() fyne.Size { + c.ExtendBaseWidget(c) + return fyne.NewSize(1, 1) +} + +type clipRenderer struct { + c *Clip + objects []fyne.CanvasObject +} + +func newClipRenderer(c *Clip) *clipRenderer { + return &clipRenderer{c: c, objects: []fyne.CanvasObject{c.Content}} +} + +func (r *clipRenderer) Destroy() { +} + +func (r *clipRenderer) Layout(s fyne.Size) { + o := r.objects[0] + o.Resize(s.Max(o.MinSize())) +} + +func (r *clipRenderer) MinSize() fyne.Size { + return r.objects[0].MinSize() +} + +func (r *clipRenderer) Objects() []fyne.CanvasObject { + return r.objects +} + +func (r *clipRenderer) Refresh() { + r.objects[0] = r.c.Content + r.Layout(r.c.Size()) + r.objects[0].Refresh() +} + +// IsClip marks this widget as clipping. It is on the renderer to avoid a public API addition. +func (r *clipRenderer) IsClip() {} diff --git a/vendor/fyne.io/fyne/v2/container/container.go b/vendor/fyne.io/fyne/v2/container/container.go new file mode 100644 index 0000000..13e881d --- /dev/null +++ b/vendor/fyne.io/fyne/v2/container/container.go @@ -0,0 +1,20 @@ +// Package container provides containers that are used to lay out and organise applications. +package container + +import ( + "fyne.io/fyne/v2" +) + +// New returns a new Container instance holding the specified CanvasObjects which will be laid out according to the specified Layout. +// +// Since: 2.0 +func New(layout fyne.Layout, objects ...fyne.CanvasObject) *fyne.Container { + return &fyne.Container{Layout: layout, Objects: objects} +} + +// NewWithoutLayout returns a new Container instance holding the specified CanvasObjects that are manually arranged. +// +// Since: 2.0 +func NewWithoutLayout(objects ...fyne.CanvasObject) *fyne.Container { + return &fyne.Container{Objects: objects} +} diff --git a/vendor/fyne.io/fyne/v2/container/doctabs.go b/vendor/fyne.io/fyne/v2/container/doctabs.go new file mode 100644 index 0000000..dcdf024 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/container/doctabs.go @@ -0,0 +1,489 @@ +package container + +import ( + "image/color" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/layout" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +// Declare conformity with Widget interface. +var _ fyne.Widget = (*DocTabs)(nil) + +// DocTabs container is used to display various pieces of content identified by tabs. +// The tabs contain text and/or an icon and allow the user to switch between the content specified in each TabItem. +// Each item is represented by a button at the edge of the container. +// +// Since: 2.1 +type DocTabs struct { + widget.BaseWidget + + Items []*TabItem + + CreateTab func() *TabItem `json:"-"` + CloseIntercept func(*TabItem) `json:"-"` + OnClosed func(*TabItem) `json:"-"` + OnSelected func(*TabItem) `json:"-"` + OnUnselected func(*TabItem) `json:"-"` + + current int + location TabLocation + isTransitioning bool + + popUpMenu *widget.PopUpMenu +} + +// NewDocTabs creates a new tab container that allows the user to choose between various pieces of content. +// +// Since: 2.1 +func NewDocTabs(items ...*TabItem) *DocTabs { + tabs := &DocTabs{Items: items} + tabs.ExtendBaseWidget(tabs) + return tabs +} + +// Append adds a new TabItem to the end of the tab bar. +func (t *DocTabs) Append(item *TabItem) { + t.SetItems(append(t.Items, item)) +} + +// CreateRenderer is a private method to Fyne which links this widget to its renderer +func (t *DocTabs) CreateRenderer() fyne.WidgetRenderer { + t.ExtendBaseWidget(t) + th := t.Theme() + v := fyne.CurrentApp().Settings().ThemeVariant() + + r := &docTabsRenderer{ + baseTabsRenderer: baseTabsRenderer{ + bar: &fyne.Container{}, + divider: canvas.NewRectangle(th.Color(theme.ColorNameShadow, v)), + indicator: canvas.NewRectangle(th.Color(theme.ColorNamePrimary, v)), + }, + docTabs: t, + scroller: NewScroll(&fyne.Container{}), + } + r.action = r.buildAllTabsButton() + r.create = r.buildCreateTabsButton() + r.tabs = t + + r.box = NewHBox(r.create, r.action) + r.scroller.OnScrolled = func(offset fyne.Position) { + r.updateIndicator(false) + } + r.updateAllTabs() + r.updateCreateTab() + r.updateTabs() + r.updateIndicator(false) + r.applyTheme(t) + return r +} + +// DisableIndex disables the TabItem at the specified index. +// +// Since: 2.3 +func (t *DocTabs) DisableIndex(i int) { + disableIndex(t, i) +} + +// DisableItem disables the specified TabItem. +// +// Since: 2.3 +func (t *DocTabs) DisableItem(item *TabItem) { + disableItem(t, item) +} + +// EnableIndex enables the TabItem at the specified index. +// +// Since: 2.3 +func (t *DocTabs) EnableIndex(i int) { + enableIndex(t, i) +} + +// EnableItem enables the specified TabItem. +// +// Since: 2.3 +func (t *DocTabs) EnableItem(item *TabItem) { + enableItem(t, item) +} + +// Hide hides the widget. +func (t *DocTabs) Hide() { + if t.popUpMenu != nil { + t.popUpMenu.Hide() + t.popUpMenu = nil + } + t.BaseWidget.Hide() +} + +// MinSize returns the size that this widget should not shrink below +func (t *DocTabs) MinSize() fyne.Size { + t.ExtendBaseWidget(t) + return t.BaseWidget.MinSize() +} + +// Remove tab by value. +func (t *DocTabs) Remove(item *TabItem) { + removeItem(t, item) + t.Refresh() +} + +// RemoveIndex removes tab by index. +func (t *DocTabs) RemoveIndex(index int) { + removeIndex(t, index) + t.Refresh() +} + +// Select sets the specified TabItem to be selected and its content visible. +func (t *DocTabs) Select(item *TabItem) { + selectItem(t, item) + t.Refresh() +} + +// SelectIndex sets the TabItem at the specific index to be selected and its content visible. +func (t *DocTabs) SelectIndex(index int) { + selectIndex(t, index) +} + +// Selected returns the currently selected TabItem. +func (t *DocTabs) Selected() *TabItem { + return selected(t) +} + +// SelectedIndex returns the index of the currently selected TabItem. +func (t *DocTabs) SelectedIndex() int { + return t.selected() +} + +// SetItems sets the containers items and refreshes. +func (t *DocTabs) SetItems(items []*TabItem) { + setItems(t, items) + t.Refresh() +} + +// SetTabLocation sets the location of the tab bar +func (t *DocTabs) SetTabLocation(l TabLocation) { + t.location = tabsAdjustedLocation(l, t) + t.Refresh() +} + +// Show this widget, if it was previously hidden +func (t *DocTabs) Show() { + t.BaseWidget.Show() + t.SelectIndex(t.current) +} + +func (t *DocTabs) close(item *TabItem) { + if f := t.CloseIntercept; f != nil { + f(item) + } else { + t.Remove(item) + if f := t.OnClosed; f != nil { + f(item) + } + } +} + +func (t *DocTabs) onUnselected() func(*TabItem) { + return t.OnUnselected +} + +func (t *DocTabs) onSelected() func(*TabItem) { + return t.OnSelected +} + +func (t *DocTabs) items() []*TabItem { + return t.Items +} + +func (t *DocTabs) selected() int { + if len(t.Items) == 0 { + return -1 + } + return t.current +} + +func (t *DocTabs) setItems(items []*TabItem) { + t.Items = items +} + +func (t *DocTabs) setSelected(selected int) { + t.current = selected +} + +func (t *DocTabs) setTransitioning(transitioning bool) { + t.isTransitioning = transitioning +} + +func (t *DocTabs) tabLocation() TabLocation { + return t.location +} + +func (t *DocTabs) transitioning() bool { + return t.isTransitioning +} + +// Declare conformity with WidgetRenderer interface. +var _ fyne.WidgetRenderer = (*docTabsRenderer)(nil) + +type docTabsRenderer struct { + baseTabsRenderer + docTabs *DocTabs + scroller *Scroll + box *fyne.Container + create *widget.Button + lastSelected int +} + +func (r *docTabsRenderer) Layout(size fyne.Size) { + r.updateAllTabs() + r.updateCreateTab() + r.updateTabs() + r.layout(r.docTabs, size) + + // lay out buttons before updating indicator, which is relative to their position + buttons := r.scroller.Content.(*fyne.Container) + buttons.Layout.Layout(buttons.Objects, buttons.Size()) + r.updateIndicator(r.docTabs.transitioning()) + + if r.docTabs.transitioning() { + r.docTabs.setTransitioning(false) + } +} + +func (r *docTabsRenderer) MinSize() fyne.Size { + return r.minSize(r.docTabs) +} + +func (r *docTabsRenderer) Objects() []fyne.CanvasObject { + return r.objects(r.docTabs) +} + +func (r *docTabsRenderer) Refresh() { + r.Layout(r.docTabs.Size()) + + if c := r.docTabs.current; c != r.lastSelected { + if c >= 0 && c < len(r.docTabs.Items) { + r.scrollToSelected() + } + r.lastSelected = c + } + + r.refresh(r.docTabs) + + canvas.Refresh(r.docTabs) +} + +func (r *docTabsRenderer) buildAllTabsButton() (all *widget.Button) { + all = &widget.Button{Importance: widget.LowImportance, OnTapped: func() { + // Show pop up containing all tabs + + items := make([]*fyne.MenuItem, len(r.docTabs.Items)) + for i := 0; i < len(r.docTabs.Items); i++ { + index := i // capture + // FIXME MenuItem doesn't support icons (#1752) + items[i] = fyne.NewMenuItem(r.docTabs.Items[i].Text, func() { + r.docTabs.SelectIndex(index) + if r.docTabs.popUpMenu != nil { + r.docTabs.popUpMenu.Hide() + r.docTabs.popUpMenu = nil + } + }) + items[i].Checked = index == r.docTabs.current + } + + r.docTabs.popUpMenu = buildPopUpMenu(r.docTabs, all, items) + }} + + return all +} + +func (r *docTabsRenderer) buildCreateTabsButton() *widget.Button { + create := widget.NewButton("", func() { + if f := r.docTabs.CreateTab; f != nil { + if tab := f(); tab != nil { + r.docTabs.Append(tab) + r.docTabs.SelectIndex(len(r.docTabs.Items) - 1) + } + } + }) + create.Importance = widget.LowImportance + return create +} + +func (r *docTabsRenderer) buildTabButtons(count int, buttons *fyne.Container) { + buttons.Objects = nil + + var iconPos buttonIconPosition + if r.docTabs.location == TabLocationLeading || r.docTabs.location == TabLocationTrailing { + buttons.Layout = layout.NewVBoxLayout() + iconPos = buttonIconTop + } else { + buttons.Layout = layout.NewHBoxLayout() + iconPos = buttonIconInline + } + + for i := 0; i < count; i++ { + item := r.docTabs.Items[i] + if item.button == nil { + item.button = &tabButton{ + onTapped: func() { r.docTabs.Select(item) }, + onClosed: func() { r.docTabs.close(item) }, + tabs: r.tabs, + } + if item.disabled { + item.button.Disable() + } + } + button := item.button + button.icon = item.Icon + button.iconPosition = iconPos + if i == r.docTabs.current { + button.importance = widget.HighImportance + } else { + button.importance = widget.MediumImportance + } + button.text = item.Text + button.textAlignment = fyne.TextAlignLeading + button.Refresh() + buttons.Objects = append(buttons.Objects, button) + } +} + +func (r *docTabsRenderer) scrollToSelected() { + buttons := r.scroller.Content.(*fyne.Container) + + // https://github.com/fyne-io/fyne/issues/3909 + // very dirty temporary fix to this crash! + if r.docTabs.current < 0 || r.docTabs.current >= len(buttons.Objects) { + return + } + + button := buttons.Objects[r.docTabs.current] + pos := button.Position() + size := button.Size() + offset := r.scroller.Offset + viewport := r.scroller.Size() + if r.docTabs.location == TabLocationLeading || r.docTabs.location == TabLocationTrailing { + if pos.Y < offset.Y { + offset.Y = pos.Y + } else if pos.Y+size.Height > offset.Y+viewport.Height { + offset.Y = pos.Y + size.Height - viewport.Height + } + } else { + if pos.X < offset.X { + offset.X = pos.X + } else if pos.X+size.Width > offset.X+viewport.Width { + offset.X = pos.X + size.Width - viewport.Width + } + } + r.scroller.Offset = offset + r.updateIndicator(false) +} + +func (r *docTabsRenderer) updateIndicator(animate bool) { + th := r.docTabs.Theme() + if r.docTabs.current < 0 { + r.indicator.FillColor = color.Transparent + r.moveIndicator(fyne.NewPos(0, 0), fyne.NewSize(0, 0), th, animate) + return + } + + var selectedPos fyne.Position + var selectedSize fyne.Size + + buttons := r.scroller.Content.(*fyne.Container).Objects + + if r.docTabs.current >= len(buttons) { + if a := r.action; a != nil { + selectedPos = a.Position() + selectedSize = a.Size() + minSize := a.MinSize() + if minSize.Width > selectedSize.Width { + selectedSize = minSize + } + } + } else { + selected := buttons[r.docTabs.current] + selectedPos = selected.Position() + selectedSize = selected.Size() + minSize := selected.MinSize() + if minSize.Width > selectedSize.Width { + selectedSize = minSize + } + } + + scrollOffset := r.scroller.Offset + scrollSize := r.scroller.Size() + + var indicatorPos fyne.Position + var indicatorSize fyne.Size + pad := th.Size(theme.SizeNamePadding) + + switch r.docTabs.location { + case TabLocationTop: + indicatorPos = fyne.NewPos(selectedPos.X-scrollOffset.X, r.bar.MinSize().Height) + indicatorSize = fyne.NewSize(fyne.Min(selectedSize.Width, scrollSize.Width-indicatorPos.X), pad) + case TabLocationLeading: + indicatorPos = fyne.NewPos(r.bar.MinSize().Width, selectedPos.Y-scrollOffset.Y) + indicatorSize = fyne.NewSize(pad, fyne.Min(selectedSize.Height, scrollSize.Height-indicatorPos.Y)) + case TabLocationBottom: + indicatorPos = fyne.NewPos(selectedPos.X-scrollOffset.X, r.bar.Position().Y-pad) + indicatorSize = fyne.NewSize(fyne.Min(selectedSize.Width, scrollSize.Width-indicatorPos.X), pad) + case TabLocationTrailing: + indicatorPos = fyne.NewPos(r.bar.Position().X-pad, selectedPos.Y-scrollOffset.Y) + indicatorSize = fyne.NewSize(pad, fyne.Min(selectedSize.Height, scrollSize.Height-indicatorPos.Y)) + } + + if indicatorPos.X < 0 { + indicatorSize.Width = indicatorSize.Width + indicatorPos.X + indicatorPos.X = 0 + } + if indicatorPos.Y < 0 { + indicatorSize.Height = indicatorSize.Height + indicatorPos.Y + indicatorPos.Y = 0 + } + if indicatorSize.Width < 0 || indicatorSize.Height < 0 { + r.indicator.FillColor = color.Transparent + r.indicator.Refresh() + return + } + + r.moveIndicator(indicatorPos, indicatorSize, th, animate) +} + +func (r *docTabsRenderer) updateAllTabs() { + if len(r.docTabs.Items) > 0 { + r.action.Show() + } else { + r.action.Hide() + } +} + +func (r *docTabsRenderer) updateCreateTab() { + if r.docTabs.CreateTab != nil { + r.create.SetIcon(theme.ContentAddIcon()) + r.create.Show() + } else { + r.create.Hide() + } +} + +func (r *docTabsRenderer) updateTabs() { + tabCount := len(r.docTabs.Items) + r.buildTabButtons(tabCount, r.scroller.Content.(*fyne.Container)) + + // Set layout of tab bar containing tab buttons and overflow action + if r.docTabs.location == TabLocationLeading || r.docTabs.location == TabLocationTrailing { + r.bar.Layout = layout.NewBorderLayout(nil, r.box, nil, nil) + r.scroller.Direction = ScrollVerticalOnly + } else { + r.bar.Layout = layout.NewBorderLayout(nil, nil, nil, r.box) + r.scroller.Direction = ScrollHorizontalOnly + } + + r.bar.Objects = []fyne.CanvasObject{r.scroller, r.box} + r.bar.Refresh() +} diff --git a/vendor/fyne.io/fyne/v2/container/innerwindow.go b/vendor/fyne.io/fyne/v2/container/innerwindow.go new file mode 100644 index 0000000..57d02f0 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/container/innerwindow.go @@ -0,0 +1,444 @@ +package container + +import ( + "image/color" + "runtime" + "strings" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + intWidget "fyne.io/fyne/v2/internal/widget" + "fyne.io/fyne/v2/layout" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +type titleBarButtonMode int + +const ( + modeClose titleBarButtonMode = iota + modeMinimize + modeMaximize + modeIcon +) + +var _ fyne.Widget = (*InnerWindow)(nil) + +// InnerWindow defines a container that wraps content in a window border - that can then be placed inside +// a regular container/canvas. +// +// Since: 2.5 +type InnerWindow struct { + widget.BaseWidget + + CloseIntercept func() `json:"-"` + OnDragged, OnResized func(*fyne.DragEvent) `json:"-"` + OnMinimized, OnMaximized, OnTappedBar, OnTappedIcon func() `json:"-"` + Icon fyne.Resource + + // Alignment allows an inner window to specify if the buttons should be on the left + // (`ButtonAlignLeading`) or right of the window border. + // + // Since: 2.6 + Alignment widget.ButtonAlign + + title string + content *fyne.Container + maximized bool +} + +// NewInnerWindow creates a new window border around the given `content`, displaying the `title` along the top. +// This will behave like a normal contain and will probably want to be added to a `MultipleWindows` parent. +// +// Since: 2.5 +func NewInnerWindow(title string, content fyne.CanvasObject) *InnerWindow { + w := &InnerWindow{title: title, content: NewPadded(content)} + w.ExtendBaseWidget(w) + return w +} + +func (w *InnerWindow) Close() { + w.Hide() +} + +func (w *InnerWindow) CreateRenderer() fyne.WidgetRenderer { + w.ExtendBaseWidget(w) + th := w.Theme() + v := fyne.CurrentApp().Settings().ThemeVariant() + + min := newBorderButton(theme.WindowMinimizeIcon(), modeMinimize, th, w.OnMinimized) + if w.OnMinimized == nil { + min.Disable() + } + max := newBorderButton(theme.WindowMaximizeIcon(), modeMaximize, th, w.OnMaximized) + if w.OnMaximized == nil { + max.Disable() + } + + close := newBorderButton(theme.WindowCloseIcon(), modeClose, th, func() { + if f := w.CloseIntercept; f != nil { + f() + } else { + w.Close() + } + }) + buttons := NewCenter(NewHBox(close, min, max)) + + borderIcon := newBorderButton(w.Icon, modeIcon, th, func() { + if f := w.OnTappedIcon; f != nil { + f() + } + }) + if w.OnTappedIcon == nil { + borderIcon.Disable() + } + + if w.Icon == nil { + borderIcon.Hide() + } + title := newDraggableLabel(w.title, w) + title.Truncation = fyne.TextTruncateEllipsis + + height := w.Theme().Size(theme.SizeNameWindowTitleBarHeight) + off := (height - title.labelMinSize().Height) / 2 + barMid := New(layout.NewCustomPaddedLayout(off, 0, 0, 0), title) + if w.buttonPosition() == widget.ButtonAlignTrailing { + buttons = NewCenter(NewHBox(min, max, close)) + } + + bg := canvas.NewRectangle(th.Color(theme.ColorNameOverlayBackground, v)) + contentBG := canvas.NewRectangle(th.Color(theme.ColorNameBackground, v)) + corner := newDraggableCorner(w) + bar := New(&titleBarLayout{buttons: buttons, icon: borderIcon, title: barMid, win: w}, + buttons, borderIcon, barMid) + + if w.content == nil { + w.content = NewPadded(canvas.NewRectangle(color.Transparent)) + } + objects := []fyne.CanvasObject{bg, contentBG, bar, w.content, corner} + r := &innerWindowRenderer{ + ShadowingRenderer: intWidget.NewShadowingRenderer(objects, intWidget.DialogLevel), + win: w, bar: bar, buttonBox: buttons, buttons: []*borderButton{close, min, max}, bg: bg, + corner: corner, contentBG: contentBG, icon: borderIcon, + } + r.Layout(w.Size()) + return r +} + +func (w *InnerWindow) SetContent(obj fyne.CanvasObject) { + w.content.Objects[0] = obj + + w.content.Refresh() +} + +// SetMaximized tells the window if the maximized state should be set or not. +// +// Since: 2.6 +func (w *InnerWindow) SetMaximized(max bool) { + w.maximized = max + w.Refresh() +} + +func (w *InnerWindow) SetPadded(pad bool) { + if pad { + w.content.Layout = layout.NewPaddedLayout() + } else { + w.content.Layout = layout.NewStackLayout() + } + w.content.Refresh() +} + +func (w *InnerWindow) SetTitle(title string) { + w.title = title + w.Refresh() +} + +func (w *InnerWindow) buttonPosition() widget.ButtonAlign { + if w.Alignment != widget.ButtonAlignCenter { + return w.Alignment + } + + if runtime.GOOS == "windows" || runtime.GOOS == "linux" || strings.Contains(runtime.GOOS, "bsd") { + return widget.ButtonAlignTrailing + } + // macOS + return widget.ButtonAlignLeading +} + +var _ fyne.WidgetRenderer = (*innerWindowRenderer)(nil) + +type innerWindowRenderer struct { + *intWidget.ShadowingRenderer + + win *InnerWindow + bar, buttonBox *fyne.Container + buttons []*borderButton + icon *borderButton + bg, contentBG *canvas.Rectangle + corner fyne.CanvasObject +} + +func (i *innerWindowRenderer) Layout(size fyne.Size) { + th := i.win.Theme() + pad := th.Size(theme.SizeNamePadding) + + i.LayoutShadow(size, fyne.Position{}) + i.bg.Resize(size) + + barHeight := i.win.Theme().Size(theme.SizeNameWindowTitleBarHeight) + i.bar.Move(fyne.NewPos(pad, 0)) + i.bar.Resize(fyne.NewSize(size.Width-pad*2, barHeight)) + + innerPos := fyne.NewPos(pad, barHeight) + innerSize := fyne.NewSize(size.Width-pad*2, size.Height-pad-barHeight) + i.contentBG.Move(innerPos) + i.contentBG.Resize(innerSize) + i.win.content.Move(innerPos) + i.win.content.Resize(innerSize) + + cornerSize := i.corner.MinSize() + i.corner.Move(fyne.NewPos(size.Components()).Subtract(cornerSize).AddXY(1, 1)) + i.corner.Resize(cornerSize) +} + +func (i *innerWindowRenderer) MinSize() fyne.Size { + th := i.win.Theme() + pad := th.Size(theme.SizeNamePadding) + contentMin := i.win.content.MinSize() + barHeight := th.Size(theme.SizeNameWindowTitleBarHeight) + + innerWidth := fyne.Max(i.bar.MinSize().Width, contentMin.Width) + + return fyne.NewSize(innerWidth+pad*2, contentMin.Height+pad+barHeight) +} + +func (i *innerWindowRenderer) Refresh() { + th := i.win.Theme() + v := fyne.CurrentApp().Settings().ThemeVariant() + i.bg.FillColor = th.Color(theme.ColorNameOverlayBackground, v) + i.bg.Refresh() + i.contentBG.FillColor = th.Color(theme.ColorNameBackground, v) + i.contentBG.Refresh() + + if i.win.buttonPosition() == widget.ButtonAlignTrailing { + i.buttonBox.Objects[0].(*fyne.Container).Objects = []fyne.CanvasObject{i.buttons[1], i.buttons[2], i.buttons[0]} + } else { + i.buttonBox.Objects[0].(*fyne.Container).Objects = []fyne.CanvasObject{i.buttons[0], i.buttons[1], i.buttons[2]} + } + for _, b := range i.buttons { + b.setTheme(th) + } + i.bar.Refresh() + + if i.win.OnMinimized == nil { + i.buttons[1].Disable() + } else { + i.buttons[1].SetOnTapped(i.win.OnMinimized) + i.buttons[1].Enable() + } + + max := i.buttons[2] + if i.win.OnMaximized == nil { + i.buttons[2].Disable() + } else { + max.SetOnTapped(i.win.OnMaximized) + max.Enable() + } + if i.win.maximized { + max.b.SetIcon(theme.ViewRestoreIcon()) + } else { + max.b.SetIcon(theme.WindowMaximizeIcon()) + } + + title := i.bar.Objects[2].(*fyne.Container).Objects[0].(*draggableLabel) + title.SetText(i.win.title) + i.ShadowingRenderer.RefreshShadow() + if i.win.OnTappedIcon == nil { + i.icon.Disable() + } else { + i.icon.Enable() + } + if i.win.Icon != nil { + i.icon.b.SetIcon(i.win.Icon) + i.icon.Show() + } else { + i.icon.Hide() + } +} + +type draggableLabel struct { + widget.Label + win *InnerWindow +} + +func newDraggableLabel(title string, win *InnerWindow) *draggableLabel { + d := &draggableLabel{win: win} + d.ExtendBaseWidget(d) + d.Text = title + return d +} + +func (d *draggableLabel) Dragged(ev *fyne.DragEvent) { + if f := d.win.OnDragged; f != nil { + f(ev) + } +} + +func (d *draggableLabel) DragEnd() { +} + +func (d *draggableLabel) MinSize() fyne.Size { + width := d.Label.MinSize().Width + height := d.Label.Theme().Size(theme.SizeNameWindowButtonHeight) + return fyne.NewSize(width, height) +} + +func (d *draggableLabel) Tapped(_ *fyne.PointEvent) { + if f := d.win.OnTappedBar; f != nil { + f() + } +} + +func (d *draggableLabel) labelMinSize() fyne.Size { + return d.Label.MinSize() +} + +type draggableCorner struct { + widget.BaseWidget + win *InnerWindow +} + +func newDraggableCorner(w *InnerWindow) *draggableCorner { + d := &draggableCorner{win: w} + d.ExtendBaseWidget(d) + return d +} + +func (c *draggableCorner) CreateRenderer() fyne.WidgetRenderer { + prop := canvas.NewImageFromResource(fyne.CurrentApp().Settings().Theme().Icon(theme.IconNameDragCornerIndicator)) + prop.SetMinSize(fyne.NewSquareSize(16)) + return widget.NewSimpleRenderer(prop) +} + +func (c *draggableCorner) Dragged(ev *fyne.DragEvent) { + if f := c.win.OnResized; f != nil { + c.win.OnResized(ev) + } +} + +func (c *draggableCorner) DragEnd() { +} + +type borderButton struct { + widget.BaseWidget + + b *widget.Button + c *ThemeOverride + mode titleBarButtonMode +} + +func newBorderButton(icon fyne.Resource, mode titleBarButtonMode, th fyne.Theme, fn func()) *borderButton { + buttonImportance := widget.MediumImportance + if mode == modeIcon { + buttonImportance = widget.LowImportance + } + b := &widget.Button{Icon: icon, Importance: buttonImportance, OnTapped: fn} + c := NewThemeOverride(b, &buttonTheme{Theme: th, mode: mode}) + + ret := &borderButton{b: b, c: c, mode: mode} + ret.ExtendBaseWidget(ret) + return ret +} + +func (b *borderButton) CreateRenderer() fyne.WidgetRenderer { + return widget.NewSimpleRenderer(b.c) +} + +func (b *borderButton) Disable() { + b.b.Disable() +} + +func (b *borderButton) Enable() { + b.b.Enable() +} + +func (b *borderButton) SetOnTapped(fn func()) { + b.b.OnTapped = fn +} + +func (b *borderButton) MinSize() fyne.Size { + height := b.Theme().Size(theme.SizeNameWindowButtonHeight) + return fyne.NewSquareSize(height) +} + +func (b *borderButton) setTheme(th fyne.Theme) { + b.c.Theme = &buttonTheme{Theme: th, mode: b.mode} +} + +type buttonTheme struct { + fyne.Theme + mode titleBarButtonMode +} + +func (b *buttonTheme) Color(n fyne.ThemeColorName, v fyne.ThemeVariant) color.Color { + switch n { + case theme.ColorNameHover: + if b.mode == modeClose { + n = theme.ColorNameError + } + } + return b.Theme.Color(n, v) +} + +func (b *buttonTheme) Size(n fyne.ThemeSizeName) float32 { + switch n { + case theme.SizeNameInputRadius: + if b.mode == modeIcon { + return 0 + } + n = theme.SizeNameWindowButtonRadius + case theme.SizeNameInlineIcon: + n = theme.SizeNameWindowButtonIcon + } + + return b.Theme.Size(n) +} + +type titleBarLayout struct { + win *InnerWindow + buttons, icon, title fyne.CanvasObject +} + +func (t *titleBarLayout) Layout(_ []fyne.CanvasObject, s fyne.Size) { + buttonMinWidth := t.buttons.MinSize().Width + t.buttons.Resize(fyne.NewSize(buttonMinWidth, s.Height)) + t.icon.Resize(fyne.NewSquareSize(s.Height)) + usedWidth := buttonMinWidth + if t.icon.Visible() { + usedWidth += s.Height + } + t.title.Resize(fyne.NewSize(s.Width-usedWidth, s.Height)) + + if t.win.buttonPosition() == widget.ButtonAlignTrailing { + t.buttons.Move(fyne.NewPos(s.Width-buttonMinWidth, 0)) + t.icon.Move(fyne.Position{}) + if t.icon.Visible() { + t.title.Move(fyne.NewPos(s.Height, 0)) + } else { + t.title.Move(fyne.Position{}) + } + } else { + t.buttons.Move(fyne.NewPos(0, 0)) + t.icon.Move(fyne.NewPos(s.Width-s.Height, 0)) + t.title.Move(fyne.NewPos(buttonMinWidth, 0)) + } +} + +func (t *titleBarLayout) MinSize(_ []fyne.CanvasObject) fyne.Size { + buttonMin := t.buttons.MinSize() + iconMin := t.icon.MinSize() + titleMin := t.title.MinSize() // can truncate + + return fyne.NewSize(buttonMin.Width+iconMin.Width+titleMin.Width, + fyne.Max(fyne.Max(buttonMin.Height, iconMin.Height), titleMin.Height)) +} diff --git a/vendor/fyne.io/fyne/v2/container/layouts.go b/vendor/fyne.io/fyne/v2/container/layouts.go new file mode 100644 index 0000000..1e84463 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/container/layouts.go @@ -0,0 +1,124 @@ +package container // import "fyne.io/fyne/v2/container" + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal" + "fyne.io/fyne/v2/layout" +) + +// NewAdaptiveGrid creates a new container with the specified objects and using the grid layout. +// When in a horizontal arrangement the rowcols parameter will specify the column count, when in vertical +// it will specify the rows. On mobile this will dynamically refresh when device is rotated. +// +// Since: 1.4 +func NewAdaptiveGrid(rowcols int, objects ...fyne.CanvasObject) *fyne.Container { + return New(layout.NewAdaptiveGridLayout(rowcols), objects...) +} + +// NewBorder creates a new container with the specified objects and using the border layout. +// The top, bottom, left and right parameters specify the items that should be placed around edges. +// Nil can be used to an edge if it should not be filled. +// Passed objects not assigned to any edge (parameters 5 onwards) will be used to fill the space +// remaining in the middle. +// Parameters 6 onwards will be stacked over the middle content in the specified order as a Stack container. +// +// Since: 1.4 +func NewBorder(top, bottom, left, right fyne.CanvasObject, objects ...fyne.CanvasObject) *fyne.Container { + all := objects + if top != nil { + all = append(all, top) + } + if bottom != nil { + all = append(all, bottom) + } + if left != nil { + all = append(all, left) + } + if right != nil { + all = append(all, right) + } + + if len(objects) == 1 && objects[0] == nil { + internal.LogHint("Border layout requires only 4 parameters, optional items cannot be nil") + all = all[1:] + } + return New(layout.NewBorderLayout(top, bottom, left, right), all...) +} + +// NewCenter creates a new container with the specified objects centered in the available space. +// +// Since: 1.4 +func NewCenter(objects ...fyne.CanvasObject) *fyne.Container { + return New(layout.NewCenterLayout(), objects...) +} + +// NewGridWithColumns creates a new container with the specified objects and using the grid layout with +// a specified number of columns. The number of rows will depend on how many children are in the container. +// +// Since: 1.4 +func NewGridWithColumns(cols int, objects ...fyne.CanvasObject) *fyne.Container { + return New(layout.NewGridLayoutWithColumns(cols), objects...) +} + +// NewGridWithRows creates a new container with the specified objects and using the grid layout with +// a specified number of rows. The number of columns will depend on how many children are in the container. +// +// Since: 1.4 +func NewGridWithRows(rows int, objects ...fyne.CanvasObject) *fyne.Container { + return New(layout.NewGridLayoutWithRows(rows), objects...) +} + +// NewGridWrap creates a new container with the specified objects and using the gridwrap layout. +// Every element will be resized to the size parameter and the content will arrange along a row and flow to a +// new row if the elements don't fit. +// +// Since: 1.4 +func NewGridWrap(size fyne.Size, objects ...fyne.CanvasObject) *fyne.Container { + return New(layout.NewGridWrapLayout(size), objects...) +} + +// NewHBox creates a new container with the specified objects and using the HBox layout. +// The objects will be placed in the container from left to right and always displayed +// at their horizontal MinSize. Use a different layout if the objects are intended +// to be larger then their horizontal MinSize. +// +// Since: 1.4 +func NewHBox(objects ...fyne.CanvasObject) *fyne.Container { + return New(layout.NewHBoxLayout(), objects...) +} + +// NewMax creates a new container with the specified objects filling the available space. +// +// Since: 1.4 +// +// Deprecated: Use container.NewStack() instead. +func NewMax(objects ...fyne.CanvasObject) *fyne.Container { + return NewStack(objects...) +} + +// NewPadded creates a new container with the specified objects inset by standard padding size. +// +// Since: 1.4 +func NewPadded(objects ...fyne.CanvasObject) *fyne.Container { + return New(layout.NewPaddedLayout(), objects...) +} + +// NewStack returns a new container that stacks objects on top of each other. +// Objects at the end of the container will be stacked on top of objects before. +// Having only a single object has no impact as CanvasObjects will +// fill the available space even without a Stack. +// +// Since: 2.4 +func NewStack(objects ...fyne.CanvasObject) *fyne.Container { + return New(layout.NewStackLayout(), objects...) +} + +// NewVBox creates a new container with the specified objects and using the VBox layout. +// The objects will be stacked in the container from top to bottom and always displayed +// at their vertical MinSize. Use a different layout if the objects are intended +// to be larger then their vertical MinSize. +// +// Since: 1.4 +func NewVBox(objects ...fyne.CanvasObject) *fyne.Container { + return New(layout.NewVBoxLayout(), objects...) +} diff --git a/vendor/fyne.io/fyne/v2/container/multiplewindows.go b/vendor/fyne.io/fyne/v2/container/multiplewindows.go new file mode 100644 index 0000000..eb3bec5 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/container/multiplewindows.go @@ -0,0 +1,104 @@ +package container + +import ( + "fyne.io/fyne/v2" + intWidget "fyne.io/fyne/v2/internal/widget" + "fyne.io/fyne/v2/widget" +) + +// MultipleWindows is a container that handles multiple `InnerWindow` containers. +// Each inner window can be dragged, resized and the stacking will change when the title bar is tapped. +// +// Since: 2.5 +type MultipleWindows struct { + widget.BaseWidget + + Windows []*InnerWindow + + content *fyne.Container +} + +// NewMultipleWindows creates a new `MultipleWindows` container to manage many inner windows. +// The initial window list is passed optionally to this constructor function. +// You can add new more windows to this container by calling `Add` or updating the `Windows` +// field and calling `Refresh`. +// +// Since: 2.5 +func NewMultipleWindows(wins ...*InnerWindow) *MultipleWindows { + m := &MultipleWindows{Windows: wins} + m.ExtendBaseWidget(m) + return m +} + +func (m *MultipleWindows) Add(w *InnerWindow) { + m.Windows = append(m.Windows, w) + m.refreshChildren() +} + +func (m *MultipleWindows) CreateRenderer() fyne.WidgetRenderer { + m.content = New(&multiWinLayout{}) + m.refreshChildren() + return widget.NewSimpleRenderer(intWidget.NewScroll(m.content)) +} + +func (m *MultipleWindows) Refresh() { + m.refreshChildren() + // m.BaseWidget.Refresh() +} + +func (m *MultipleWindows) raise(w *InnerWindow) { + id := -1 + for i, ww := range m.Windows { + if ww == w { + id = i + break + } + } + if id == -1 { + return + } + + windows := append(m.Windows[:id], m.Windows[id+1:]...) + m.Windows = append(windows, w) + m.refreshChildren() +} + +func (m *MultipleWindows) refreshChildren() { + if m.content == nil { + return + } + + objs := make([]fyne.CanvasObject, len(m.Windows)) + for i, w := range m.Windows { + objs[i] = w + + m.setupChild(w) + } + m.content.Objects = objs + m.content.Refresh() +} + +func (m *MultipleWindows) setupChild(w *InnerWindow) { + w.OnDragged = func(ev *fyne.DragEvent) { + w.Move(w.Position().Add(ev.Dragged)) + } + w.OnResized = func(ev *fyne.DragEvent) { + size := w.Size().Add(ev.Dragged) + w.Resize(size.Max(w.MinSize())) + } + w.OnTappedBar = func() { + m.raise(w) + } +} + +type multiWinLayout struct{} + +func (m *multiWinLayout) Layout(objects []fyne.CanvasObject, _ fyne.Size) { + for _, w := range objects { // update the windows so they have real size + w.Resize(w.MinSize().Max(w.Size())) + } +} + +func (m *multiWinLayout) MinSize(_ []fyne.CanvasObject) fyne.Size { + return fyne.Size{} +} diff --git a/vendor/fyne.io/fyne/v2/container/navigation.go b/vendor/fyne.io/fyne/v2/container/navigation.go new file mode 100644 index 0000000..8dc44c5 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/container/navigation.go @@ -0,0 +1,215 @@ +package container + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/layout" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +// Navigation container is used to provide your application with a control bar and an area for content objects. +// Objects can be any CanvasObject, and only the most recent one will be visible. +// +// Since: 2.7 +type Navigation struct { + widget.BaseWidget + + Root fyne.CanvasObject + Title string + OnBack func() + OnForward func() + + level int + stack fyne.Container + titles []string +} + +// NewNavigation creates a new navigation container with a given root object. +// +// Since: 2.7 +func NewNavigation(root fyne.CanvasObject) *Navigation { + return NewNavigationWithTitle(root, "") +} + +// NewNavigationWithTitle creates a new navigation container with a given root object and a default title. +// +// Since: 2.7 +func NewNavigationWithTitle(root fyne.CanvasObject, s string) *Navigation { + var nav *Navigation + nav = &Navigation{ + Root: root, + Title: s, + OnBack: func() { _ = nav.Back() }, + OnForward: func() { _ = nav.Forward() }, + } + return nav +} + +// Push puts the given object on top of the navigation stack and hides the object below. +// +// Since: 2.7 +func (nav *Navigation) Push(obj fyne.CanvasObject) { + nav.PushWithTitle(obj, nav.Title) +} + +// PushWithTitle puts the given CanvasObject on top, hides the object below, and uses the given title as label text. +// +// Since: 2.7 +func (nav *Navigation) PushWithTitle(obj fyne.CanvasObject, s string) { + obj.Show() + objs := nav.stack.Objects[:nav.level] + if len(objs) > 0 { + objs[len(objs)-1].Hide() + } + nav.stack.Objects = append(objs, obj) + nav.titles = append(nav.titles[:nav.level], s) + nav.level++ + nav.Refresh() +} + +// Back returns the top level CanvasObject, adjusts the title accordingly, and disabled the back button +// when no more objects are left to go back to. +// +// Since: 2.7 +func (nav *Navigation) Back() fyne.CanvasObject { + if nav.level == 0 || nav.level == 1 && nav.Root != nil { + return nil + } + + objs := nav.stack.Objects + objs[nav.level-1].Hide() + if nav.level > 1 { + objs[nav.level-2].Show() + } + + nav.level-- + nav.Refresh() + + return objs[nav.level] +} + +// Forward shows the next object in the stack again. +// +// Since: 2.7 +func (nav *Navigation) Forward() fyne.CanvasObject { + if nav.level >= len(nav.stack.Objects) { + return nil + } + + nav.stack.Objects[nav.level-1].Hide() + nav.stack.Objects[nav.level].Show() + nav.level++ + + return nav.stack.Objects[nav.level-1] +} + +// SetTitle changes the root navigation title shown by default. +// +// Since: 2.7 +func (nav *Navigation) SetTitle(s string) { + nav.Title = s + nav.Refresh() +} + +// SetCurrentTitle changes the navigation title for the current level. +// +// Since: 2.7 +func (nav *Navigation) SetCurrentTitle(s string) { + if nav.level > 1 && nav.level-1 < len(nav.titles) { + nav.titles[nav.level-1] = s + nav.Refresh() + } +} + +func (nav *Navigation) setup() { + objs := []fyne.CanvasObject{} + titles := []string{} + if nav.Root != nil { + objs = append(objs, nav.Root) + titles = append(titles, nav.Title) + } + nav.level = len(objs) + nav.stack.Layout = layout.NewStackLayout() + nav.stack.Objects = objs + nav.titles = titles + nav.ExtendBaseWidget(nav) +} + +var _ fyne.WidgetRenderer = (*navigatorRenderer)(nil) + +type navigatorRenderer struct { + nav *Navigation + back widget.Button + forward widget.Button + title widget.Label + object fyne.CanvasObject +} + +func (nav *Navigation) CreateRenderer() fyne.WidgetRenderer { + r := &navigatorRenderer{ + nav: nav, + title: widget.Label{ + Text: nav.Title, + Alignment: fyne.TextAlignCenter, + }, + back: widget.Button{ + Icon: theme.NavigateBackIcon(), + OnTapped: nav.OnBack, + }, + forward: widget.Button{ + Icon: theme.NavigateNextIcon(), + OnTapped: nav.OnForward, + }, + } + r.back.Disable() + r.forward.Disable() + + nav.setup() + + r.object = NewBorder( + NewStack(NewHBox(&r.back, layout.NewSpacer(), &r.forward), &r.title), + nil, + nil, + nil, + &nav.stack, + ) + + return r +} + +func (r *navigatorRenderer) Destroy() { +} + +func (r *navigatorRenderer) Layout(s fyne.Size) { + r.object.Resize(s) +} + +func (r *navigatorRenderer) MinSize() fyne.Size { + return r.object.MinSize() +} + +func (r *navigatorRenderer) Objects() []fyne.CanvasObject { + return []fyne.CanvasObject{r.object} +} + +func (r *navigatorRenderer) Refresh() { + if r.nav.level < 1 || r.nav.level == 1 && r.nav.Root != nil { + r.back.Disable() + } else { + r.back.Enable() + } + + if r.nav.level == len(r.nav.stack.Objects) { + r.forward.Disable() + } else { + r.forward.Enable() + } + + if r.nav.level-1 >= 0 && r.nav.level-1 < len(r.nav.titles) { + r.title.Text = r.nav.titles[r.nav.level-1] + } else { + r.title.Text = r.nav.Title + } + + r.object.Refresh() +} diff --git a/vendor/fyne.io/fyne/v2/container/scroll.go b/vendor/fyne.io/fyne/v2/container/scroll.go new file mode 100644 index 0000000..dda8aa6 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/container/scroll.go @@ -0,0 +1,55 @@ +package container + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/widget" +) + +// Scroll defines a container that is smaller than the Content. +// The Offset is used to determine the position of the child widgets within the container. +// +// Since: 1.4 +type Scroll = widget.Scroll + +// ScrollDirection represents the directions in which a Scroll container can scroll its child content. +// +// Since: 1.4 +type ScrollDirection = fyne.ScrollDirection + +// Constants for valid values of ScrollDirection. +const ( + // ScrollBoth supports horizontal and vertical scrolling. + ScrollBoth ScrollDirection = fyne.ScrollBoth + // ScrollHorizontalOnly specifies the scrolling should only happen left to right. + ScrollHorizontalOnly = fyne.ScrollHorizontalOnly + // ScrollVerticalOnly specifies the scrolling should only happen top to bottom. + ScrollVerticalOnly = fyne.ScrollVerticalOnly + // ScrollNone turns off scrolling for this container. + // + // Since: 2.1 + ScrollNone = fyne.ScrollNone +) + +// NewScroll creates a scrollable parent wrapping the specified content. +// Note that this may cause the MinSize to be smaller than that of the passed object. +// +// Since: 1.4 +func NewScroll(content fyne.CanvasObject) *Scroll { + return widget.NewScroll(content) +} + +// NewHScroll create a scrollable parent wrapping the specified content. +// Note that this may cause the MinSize.Width to be smaller than that of the passed object. +// +// Since: 1.4 +func NewHScroll(content fyne.CanvasObject) *Scroll { + return widget.NewHScroll(content) +} + +// NewVScroll a scrollable parent wrapping the specified content. +// Note that this may cause the MinSize.Height to be smaller than that of the passed object. +// +// Since: 1.4 +func NewVScroll(content fyne.CanvasObject) *Scroll { + return widget.NewVScroll(content) +} diff --git a/vendor/fyne.io/fyne/v2/container/split.go b/vendor/fyne.io/fyne/v2/container/split.go new file mode 100644 index 0000000..31be62e --- /dev/null +++ b/vendor/fyne.io/fyne/v2/container/split.go @@ -0,0 +1,420 @@ +package container + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/driver/desktop" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +// Declare conformity with CanvasObject interface +var _ fyne.CanvasObject = (*Split)(nil) + +// Split defines a container whose size is split between two children. +// +// Since: 1.4 +type Split struct { + widget.BaseWidget + Offset float64 + Horizontal bool + Leading fyne.CanvasObject + Trailing fyne.CanvasObject + + // to communicate to the renderer that the next refresh + // is just an offset update (ie a resize and move only) + // cleared by renderer in Refresh() + offsetUpdated bool +} + +// NewHSplit creates a horizontally arranged container with the specified leading and trailing elements. +// A vertical split bar that can be dragged will be added between the elements. +// +// Since: 1.4 +func NewHSplit(leading, trailing fyne.CanvasObject) *Split { + return newSplitContainer(true, leading, trailing) +} + +// NewVSplit creates a vertically arranged container with the specified top and bottom elements. +// A horizontal split bar that can be dragged will be added between the elements. +// +// Since: 1.4 +func NewVSplit(top, bottom fyne.CanvasObject) *Split { + return newSplitContainer(false, top, bottom) +} + +func newSplitContainer(horizontal bool, leading, trailing fyne.CanvasObject) *Split { + s := &Split{ + Offset: 0.5, // Sensible default, can be overridden with SetOffset + Horizontal: horizontal, + Leading: leading, + Trailing: trailing, + } + s.BaseWidget.ExtendBaseWidget(s) + return s +} + +// CreateRenderer is a private method to Fyne which links this widget to its renderer +func (s *Split) CreateRenderer() fyne.WidgetRenderer { + s.BaseWidget.ExtendBaseWidget(s) + d := newDivider(s) + return &splitContainerRenderer{ + split: s, + divider: d, + objects: []fyne.CanvasObject{s.Leading, d, s.Trailing}, + } +} + +// ExtendBaseWidget is used by an extending widget to make use of BaseWidget functionality. +// +// Deprecated: Support for extending containers is being removed +func (s *Split) ExtendBaseWidget(wid fyne.Widget) { + s.BaseWidget.ExtendBaseWidget(wid) +} + +// SetOffset sets the offset (0.0 to 1.0) of the Split divider. +// 0.0 - Leading is min size, Trailing uses all remaining space. +// 0.5 - Leading & Trailing equally share the available space. +// 1.0 - Trailing is min size, Leading uses all remaining space. +func (s *Split) SetOffset(offset float64) { + if s.Offset == offset { + return + } + s.Offset = offset + s.offsetUpdated = true + s.Refresh() +} + +var _ fyne.WidgetRenderer = (*splitContainerRenderer)(nil) + +type splitContainerRenderer struct { + split *Split + divider *divider + objects []fyne.CanvasObject +} + +func (r *splitContainerRenderer) Destroy() { +} + +func (r *splitContainerRenderer) Layout(size fyne.Size) { + var dividerPos, leadingPos, trailingPos fyne.Position + var dividerSize, leadingSize, trailingSize fyne.Size + + dividerVisible := r.split.Leading.Visible() && r.split.Trailing.Visible() + if !r.split.Leading.Visible() { + trailingPos = fyne.NewPos(0, 0) + trailingSize = size + } else if !r.split.Trailing.Visible() { + leadingPos = fyne.NewPos(0, 0) + leadingSize = size + } else if dividerVisible { + if r.split.Horizontal { + lw, tw := r.computeSplitLengths(size.Width, r.minLeadingWidth(), r.minTrailingWidth()) + leadingPos.X = 0 + leadingSize.Width = lw + leadingSize.Height = size.Height + dividerPos.X = lw + dividerSize.Width = dividerThickness(r.divider) + dividerSize.Height = size.Height + trailingPos.X = lw + dividerSize.Width + trailingSize.Width = tw + trailingSize.Height = size.Height + } else { + lh, th := r.computeSplitLengths(size.Height, r.minLeadingHeight(), r.minTrailingHeight()) + leadingPos.Y = 0 + leadingSize.Width = size.Width + leadingSize.Height = lh + dividerPos.Y = lh + dividerSize.Width = size.Width + dividerSize.Height = dividerThickness(r.divider) + trailingPos.Y = lh + dividerSize.Height + trailingSize.Width = size.Width + trailingSize.Height = th + } + } + + r.divider.Move(dividerPos) + r.divider.Resize(dividerSize) + r.divider.Hidden = !dividerVisible + + r.split.Leading.Move(leadingPos) + r.split.Leading.Resize(leadingSize) + r.split.Trailing.Move(trailingPos) + r.split.Trailing.Resize(trailingSize) + canvas.Refresh(r.divider) +} + +func (r *splitContainerRenderer) MinSize() fyne.Size { + s := fyne.NewSize(0, 0) + dividerVisible := r.split.Leading.Visible() && r.split.Trailing.Visible() + for i, o := range r.objects { + if (i == 1 /*divider*/ && !dividerVisible) || (i != 1 && !o.Visible()) { + continue + } + min := o.MinSize() + if r.split.Horizontal { + s.Width += min.Width + s.Height = fyne.Max(s.Height, min.Height) + } else { + s.Width = fyne.Max(s.Width, min.Width) + s.Height += min.Height + } + } + return s +} + +func (r *splitContainerRenderer) Objects() []fyne.CanvasObject { + return r.objects +} + +func (r *splitContainerRenderer) Refresh() { + if r.split.offsetUpdated { + r.Layout(r.split.Size()) + r.split.offsetUpdated = false + return + } + + r.objects[0] = r.split.Leading + // [1] is divider which doesn't change + r.objects[2] = r.split.Trailing + r.Layout(r.split.Size()) + + r.split.Leading.Refresh() + r.divider.Refresh() + r.split.Trailing.Refresh() + canvas.Refresh(r.split) +} + +func (r *splitContainerRenderer) computeSplitLengths(total, lMin, tMin float32) (float32, float32) { + available := float64(total - dividerThickness(r.divider)) + if available <= 0 { + return 0, 0 + } + ld := float64(lMin) + tr := float64(tMin) + offset := r.split.Offset + + min := ld / available + max := 1 - tr/available + if min <= max { + if offset < min { + offset = min + } + if offset > max { + offset = max + } + } else { + offset = ld / (ld + tr) + } + + ld = offset * available + tr = available - ld + return float32(ld), float32(tr) +} + +func (r *splitContainerRenderer) minLeadingWidth() float32 { + if r.split.Leading.Visible() { + return r.split.Leading.MinSize().Width + } + return 0 +} + +func (r *splitContainerRenderer) minLeadingHeight() float32 { + if r.split.Leading.Visible() { + return r.split.Leading.MinSize().Height + } + return 0 +} + +func (r *splitContainerRenderer) minTrailingWidth() float32 { + if r.split.Trailing.Visible() { + return r.split.Trailing.MinSize().Width + } + return 0 +} + +func (r *splitContainerRenderer) minTrailingHeight() float32 { + if r.split.Trailing.Visible() { + return r.split.Trailing.MinSize().Height + } + return 0 +} + +// Declare conformity with interfaces +var ( + _ fyne.CanvasObject = (*divider)(nil) + _ fyne.Draggable = (*divider)(nil) + _ desktop.Cursorable = (*divider)(nil) + _ desktop.Hoverable = (*divider)(nil) +) + +type divider struct { + widget.BaseWidget + split *Split + hovered bool + startDragOff *fyne.Position + currentDragPos fyne.Position +} + +func newDivider(split *Split) *divider { + d := ÷r{ + split: split, + } + d.ExtendBaseWidget(d) + return d +} + +// CreateRenderer is a private method to Fyne which links this widget to its renderer +func (d *divider) CreateRenderer() fyne.WidgetRenderer { + d.ExtendBaseWidget(d) + th := d.Theme() + v := fyne.CurrentApp().Settings().ThemeVariant() + + background := canvas.NewRectangle(th.Color(theme.ColorNameShadow, v)) + foreground := canvas.NewRectangle(th.Color(theme.ColorNameForeground, v)) + return ÷rRenderer{ + divider: d, + background: background, + foreground: foreground, + objects: []fyne.CanvasObject{background, foreground}, + } +} + +func (d *divider) Cursor() desktop.Cursor { + if d.split.Horizontal { + return desktop.HResizeCursor + } + return desktop.VResizeCursor +} + +func (d *divider) DragEnd() { + d.startDragOff = nil +} + +func (d *divider) Dragged(e *fyne.DragEvent) { + if d.startDragOff == nil { + d.currentDragPos = d.Position().Add(e.Position) + start := e.Position.Subtract(e.Dragged) + d.startDragOff = &start + } else { + d.currentDragPos = d.currentDragPos.Add(e.Dragged) + } + + x, y := d.currentDragPos.Components() + var offset, leadingRatio, trailingRatio float64 + if d.split.Horizontal { + widthFree := float64(d.split.Size().Width - dividerThickness(d)) + leadingRatio = float64(d.split.Leading.MinSize().Width) / widthFree + trailingRatio = 1. - (float64(d.split.Trailing.MinSize().Width) / widthFree) + offset = float64(x-d.startDragOff.X) / widthFree + } else { + heightFree := float64(d.split.Size().Height - dividerThickness(d)) + leadingRatio = float64(d.split.Leading.MinSize().Height) / heightFree + trailingRatio = 1. - (float64(d.split.Trailing.MinSize().Height) / heightFree) + offset = float64(y-d.startDragOff.Y) / heightFree + } + + if offset < leadingRatio { + offset = leadingRatio + } + if offset > trailingRatio { + offset = trailingRatio + } + d.split.SetOffset(offset) +} + +func (d *divider) MouseIn(event *desktop.MouseEvent) { + d.hovered = true + d.Refresh() +} + +func (d *divider) MouseMoved(event *desktop.MouseEvent) {} + +func (d *divider) MouseOut() { + d.hovered = false + d.Refresh() +} + +var _ fyne.WidgetRenderer = (*dividerRenderer)(nil) + +type dividerRenderer struct { + divider *divider + background *canvas.Rectangle + foreground *canvas.Rectangle + objects []fyne.CanvasObject +} + +func (r *dividerRenderer) Destroy() { +} + +func (r *dividerRenderer) Layout(size fyne.Size) { + r.background.Resize(size) + var x, y, w, h float32 + if r.divider.split.Horizontal { + x = (dividerThickness(r.divider) - handleThickness(r.divider)) / 2 + y = (size.Height - handleLength(r.divider)) / 2 + w = handleThickness(r.divider) + h = handleLength(r.divider) + } else { + x = (size.Width - handleLength(r.divider)) / 2 + y = (dividerThickness(r.divider) - handleThickness(r.divider)) / 2 + w = handleLength(r.divider) + h = handleThickness(r.divider) + } + r.foreground.Move(fyne.NewPos(x, y)) + r.foreground.Resize(fyne.NewSize(w, h)) +} + +func (r *dividerRenderer) MinSize() fyne.Size { + if r.divider.split.Horizontal { + return fyne.NewSize(dividerThickness(r.divider), dividerLength(r.divider)) + } + return fyne.NewSize(dividerLength(r.divider), dividerThickness(r.divider)) +} + +func (r *dividerRenderer) Objects() []fyne.CanvasObject { + return r.objects +} + +func (r *dividerRenderer) Refresh() { + th := r.divider.Theme() + v := fyne.CurrentApp().Settings().ThemeVariant() + + if r.divider.hovered { + r.background.FillColor = th.Color(theme.ColorNameHover, v) + } else { + r.background.FillColor = th.Color(theme.ColorNameShadow, v) + } + r.background.Refresh() + r.foreground.FillColor = th.Color(theme.ColorNameForeground, v) + r.foreground.Refresh() + r.Layout(r.divider.Size()) +} + +func dividerTheme(d *divider) fyne.Theme { + if d == nil { + return theme.Current() + } + + return d.Theme() +} + +func dividerThickness(d *divider) float32 { + th := dividerTheme(d) + return th.Size(theme.SizeNamePadding) * 2 +} + +func dividerLength(d *divider) float32 { + th := dividerTheme(d) + return th.Size(theme.SizeNamePadding) * 6 +} + +func handleThickness(d *divider) float32 { + th := dividerTheme(d) + return th.Size(theme.SizeNamePadding) / 2 +} + +func handleLength(d *divider) float32 { + th := dividerTheme(d) + return th.Size(theme.SizeNamePadding) * 4 +} diff --git a/vendor/fyne.io/fyne/v2/container/tabs.go b/vendor/fyne.io/fyne/v2/container/tabs.go new file mode 100644 index 0000000..32cd75e --- /dev/null +++ b/vendor/fyne.io/fyne/v2/container/tabs.go @@ -0,0 +1,881 @@ +package container + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/driver/desktop" + "fyne.io/fyne/v2/internal" + "fyne.io/fyne/v2/internal/build" + intTheme "fyne.io/fyne/v2/internal/theme" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +// TabItem represents a single view in a tab view. +// The Text and Icon are used for the tab button and the Content is shown when the corresponding tab is active. +// +// Since: 1.4 +type TabItem struct { + Text string + Icon fyne.Resource + Content fyne.CanvasObject + + button *tabButton + + disabled bool +} + +// Disabled returns whether or not the TabItem is disabled. +// +// Since: 2.3 +func (ti *TabItem) Disabled() bool { + return ti.disabled +} + +func (ti *TabItem) disable() { + ti.disabled = true + if ti.button != nil { + ti.button.Disable() + } +} + +func (ti *TabItem) enable() { + ti.disabled = false + if ti.button != nil { + ti.button.Enable() + } +} + +// TabLocation is the location where the tabs of a tab container should be rendered +// +// Since: 1.4 +type TabLocation int + +// TabLocation values +const ( + TabLocationTop TabLocation = iota + TabLocationLeading + TabLocationBottom + TabLocationTrailing +) + +// NewTabItem creates a new item for a tabbed widget - each item specifies the content and a label for its tab. +// +// Since: 1.4 +func NewTabItem(text string, content fyne.CanvasObject) *TabItem { + return &TabItem{Text: text, Content: content} +} + +// NewTabItemWithIcon creates a new item for a tabbed widget - each item specifies the content and a label with an icon for its tab. +// +// Since: 1.4 +func NewTabItemWithIcon(text string, icon fyne.Resource, content fyne.CanvasObject) *TabItem { + return &TabItem{Text: text, Icon: icon, Content: content} +} + +type baseTabs interface { + fyne.Widget + + onUnselected() func(*TabItem) + onSelected() func(*TabItem) + + items() []*TabItem + setItems([]*TabItem) + + selected() int + setSelected(int) + + tabLocation() TabLocation + + transitioning() bool + setTransitioning(bool) +} + +func isMobile(b baseTabs) bool { + d := fyne.CurrentDevice() + mobile := intTheme.FeatureForWidget(intTheme.FeatureNameDeviceIsMobile, b) + if is, ok := mobile.(bool); ok { + return is + } + + return d.IsMobile() +} + +func tabsAdjustedLocation(l TabLocation, b baseTabs) TabLocation { + // Mobile has limited screen space, so don't put app tab bar on long edges + if isMobile(b) { + if o := fyne.CurrentDevice().Orientation(); fyne.IsVertical(o) { + if l == TabLocationLeading { + return TabLocationTop + } else if l == TabLocationTrailing { + return TabLocationBottom + } + } else { + if l == TabLocationTop { + return TabLocationLeading + } else if l == TabLocationBottom { + return TabLocationTrailing + } + } + } + + return l +} + +func buildPopUpMenu(t baseTabs, button *widget.Button, items []*fyne.MenuItem) *widget.PopUpMenu { + d := fyne.CurrentApp().Driver() + c := d.CanvasForObject(button) + popUpMenu := widget.NewPopUpMenu(fyne.NewMenu("", items...), c) + buttonPos := d.AbsolutePositionForObject(button) + buttonSize := button.Size() + popUpMin := popUpMenu.MinSize() + var popUpPos fyne.Position + switch t.tabLocation() { + case TabLocationLeading: + popUpPos.X = buttonPos.X + buttonSize.Width + popUpPos.Y = buttonPos.Y + buttonSize.Height - popUpMin.Height + case TabLocationTrailing: + popUpPos.X = buttonPos.X - popUpMin.Width + popUpPos.Y = buttonPos.Y + buttonSize.Height - popUpMin.Height + case TabLocationTop: + popUpPos.X = buttonPos.X + buttonSize.Width - popUpMin.Width + popUpPos.Y = buttonPos.Y + buttonSize.Height + case TabLocationBottom: + popUpPos.X = buttonPos.X + buttonSize.Width - popUpMin.Width + popUpPos.Y = buttonPos.Y - popUpMin.Height + } + if popUpPos.X < 0 { + popUpPos.X = 0 + } + if popUpPos.Y < 0 { + popUpPos.Y = 0 + } + popUpMenu.ShowAtPosition(popUpPos) + return popUpMenu +} + +func removeIndex(t baseTabs, index int) { + items := t.items() + if index < 0 || index >= len(items) { + return + } + setItems(t, append(items[:index], items[index+1:]...)) + if s := t.selected(); index < s { + t.setSelected(s - 1) + } +} + +func removeItem(t baseTabs, item *TabItem) { + for index, existingItem := range t.items() { + if existingItem == item { + removeIndex(t, index) + break + } + } +} + +func selected(t baseTabs) *TabItem { + selected := t.selected() + items := t.items() + if selected < 0 || selected >= len(items) { + return nil + } + return items[selected] +} + +func selectIndex(t baseTabs, index int) { + selected := t.selected() + + if selected == index { + // No change, so do nothing + return + } + + items := t.items() + + if f := t.onUnselected(); f != nil && selected >= 0 && selected < len(items) { + // Notification of unselected + f(items[selected]) + } + + if index < 0 || index >= len(items) { + // Out of bounds, so do nothing + return + } + + t.setTransitioning(true) + t.setSelected(index) + t.Refresh() + + if f := t.onSelected(); f != nil { + // Notification of selected + f(items[index]) + } +} + +func selectItem(t baseTabs, item *TabItem) { + for i, child := range t.items() { + if child == item { + selectIndex(t, i) + return + } + } +} + +func setItems(t baseTabs, items []*TabItem) { + if build.HasHints && mismatchedTabItems(items) { + internal.LogHint("Tab items should all have the same type of content (text, icons or both)") + } + t.setItems(items) + selected := t.selected() + count := len(items) + switch { + case count == 0: + // No items available to be selected + selectIndex(t, -1) // Unsure OnUnselected gets called if applicable + t.setSelected(-1) + case selected < 0: + // Current is first tab item + selectIndex(t, 0) + case selected >= count: + // Current doesn't exist, select last tab + selectIndex(t, count-1) + } +} + +func disableIndex(t baseTabs, index int) { + items := t.items() + if index < 0 || index >= len(items) { + return + } + + item := items[index] + item.disable() + + if selected(t) == item { + // the disabled tab is currently selected, so select the first enabled tab + for i, it := range items { + if !it.Disabled() { + selectIndex(t, i) + break + } + } + } + + if selected(t) == item { + selectIndex(t, -1) // no other tab is able to be selected + } +} + +func disableItem(t baseTabs, item *TabItem) { + for i, it := range t.items() { + if it == item { + disableIndex(t, i) + return + } + } +} + +func enableIndex(t baseTabs, index int) { + items := t.items() + if index < 0 || index >= len(items) { + return + } + + item := items[index] + item.enable() +} + +func enableItem(t baseTabs, item *TabItem) { + for i, it := range t.items() { + if it == item { + enableIndex(t, i) + return + } + } +} + +type baseTabsRenderer struct { + positionAnimation, sizeAnimation *fyne.Animation + + lastIndicatorPos fyne.Position + lastIndicatorSize fyne.Size + lastIndicatorHidden bool + + action *widget.Button + bar *fyne.Container + divider, indicator *canvas.Rectangle + + tabs baseTabs +} + +func (r *baseTabsRenderer) Destroy() { +} + +func (r *baseTabsRenderer) applyTheme(t baseTabs) { + if r.action != nil { + r.action.SetIcon(moreIcon(t)) + } + th := theme.CurrentForWidget(t) + v := fyne.CurrentApp().Settings().ThemeVariant() + + r.divider.FillColor = th.Color(theme.ColorNameShadow, v) + r.indicator.FillColor = th.Color(theme.ColorNamePrimary, v) + r.indicator.CornerRadius = th.Size(theme.SizeNameSelectionRadius) + + for _, tab := range r.tabs.items() { + tab.Content.Refresh() + } +} + +func (r *baseTabsRenderer) layout(t baseTabs, size fyne.Size) { + var ( + barPos, dividerPos, contentPos fyne.Position + barSize, dividerSize, contentSize fyne.Size + ) + + barMin := r.bar.MinSize() + + th := theme.CurrentForWidget(t) + padding := th.Size(theme.SizeNamePadding) + switch t.tabLocation() { + case TabLocationTop: + barHeight := barMin.Height + barPos = fyne.NewPos(0, 0) + barSize = fyne.NewSize(size.Width, barHeight) + dividerPos = fyne.NewPos(0, barHeight) + dividerSize = fyne.NewSize(size.Width, padding) + contentPos = fyne.NewPos(0, barHeight+padding) + contentSize = fyne.NewSize(size.Width, size.Height-barHeight-padding) + case TabLocationLeading: + barWidth := barMin.Width + barPos = fyne.NewPos(0, 0) + barSize = fyne.NewSize(barWidth, size.Height) + dividerPos = fyne.NewPos(barWidth, 0) + dividerSize = fyne.NewSize(padding, size.Height) + contentPos = fyne.NewPos(barWidth+padding, 0) + contentSize = fyne.NewSize(size.Width-barWidth-padding, size.Height) + case TabLocationBottom: + barHeight := barMin.Height + barPos = fyne.NewPos(0, size.Height-barHeight) + barSize = fyne.NewSize(size.Width, barHeight) + dividerPos = fyne.NewPos(0, size.Height-barHeight-padding) + dividerSize = fyne.NewSize(size.Width, padding) + contentPos = fyne.NewPos(0, 0) + contentSize = fyne.NewSize(size.Width, size.Height-barHeight-padding) + case TabLocationTrailing: + barWidth := barMin.Width + barPos = fyne.NewPos(size.Width-barWidth, 0) + barSize = fyne.NewSize(barWidth, size.Height) + dividerPos = fyne.NewPos(size.Width-barWidth-padding, 0) + dividerSize = fyne.NewSize(padding, size.Height) + contentPos = fyne.NewPos(0, 0) + contentSize = fyne.NewSize(size.Width-barWidth-padding, size.Height) + } + + r.bar.Move(barPos) + r.bar.Resize(barSize) + r.divider.Move(dividerPos) + r.divider.Resize(dividerSize) + selected := t.selected() + for i, ti := range t.items() { + if i == selected { + ti.Content.Move(contentPos) + ti.Content.Resize(contentSize) + ti.Content.Show() + } else { + ti.Content.Hide() + } + } +} + +func (r *baseTabsRenderer) minSize(t baseTabs) fyne.Size { + th := theme.CurrentForWidget(t) + pad := th.Size(theme.SizeNamePadding) + buttonPad := pad + barMin := r.bar.MinSize() + tabsMin := r.bar.Objects[0].MinSize() + accessory := r.bar.Objects[1] + accessoryMin := accessory.MinSize() + if scroll, ok := r.bar.Objects[0].(*Scroll); ok && len(scroll.Content.(*fyne.Container).Objects) == 0 { + tabsMin = fyne.Size{} // scroller forces 32 where we don't need any space + buttonPad = 0 + } else if group, ok := r.bar.Objects[0].(*fyne.Container); ok && len(group.Objects) > 0 { + tabsMin = group.Objects[0].MinSize() + buttonPad = 0 + } + if !accessory.Visible() || accessoryMin.Width == 0 { + buttonPad = 0 + accessoryMin = fyne.Size{} + } + + contentMin := fyne.NewSize(0, 0) + for _, content := range t.items() { + contentMin = contentMin.Max(content.Content.MinSize()) + } + + switch t.tabLocation() { + case TabLocationLeading, TabLocationTrailing: + return fyne.NewSize(barMin.Width+contentMin.Width+pad, + fyne.Max(contentMin.Height, accessoryMin.Height+buttonPad+tabsMin.Height)) + default: + return fyne.NewSize(fyne.Max(contentMin.Width, accessoryMin.Width+buttonPad+tabsMin.Width), + barMin.Height+contentMin.Height+pad) + } +} + +func (r *baseTabsRenderer) moveIndicator(pos fyne.Position, siz fyne.Size, th fyne.Theme, animate bool) { + isSameState := r.lastIndicatorPos == pos && r.lastIndicatorSize == siz && + r.lastIndicatorHidden == r.indicator.Hidden + if isSameState { + return + } + + if r.positionAnimation != nil { + r.positionAnimation.Stop() + r.positionAnimation = nil + } + if r.sizeAnimation != nil { + r.sizeAnimation.Stop() + r.sizeAnimation = nil + } + + v := fyne.CurrentApp().Settings().ThemeVariant() + r.indicator.FillColor = th.Color(theme.ColorNamePrimary, v) + if r.indicator.Position().IsZero() { + r.indicator.Move(pos) + r.indicator.Resize(siz) + r.indicator.Refresh() + return + } + + r.lastIndicatorPos = pos + r.lastIndicatorSize = siz + r.lastIndicatorHidden = r.indicator.Hidden + + if animate && fyne.CurrentApp().Settings().ShowAnimations() { + r.positionAnimation = canvas.NewPositionAnimation(r.indicator.Position(), pos, canvas.DurationShort, func(p fyne.Position) { + r.indicator.Move(p) + r.indicator.Refresh() + if pos == p { + r.positionAnimation.Stop() + r.positionAnimation = nil + } + }) + r.sizeAnimation = canvas.NewSizeAnimation(r.indicator.Size(), siz, canvas.DurationShort, func(s fyne.Size) { + r.indicator.Resize(s) + r.indicator.Refresh() + if siz == s { + r.sizeAnimation.Stop() + r.sizeAnimation = nil + } + }) + + r.positionAnimation.Start() + r.sizeAnimation.Start() + } else { + r.indicator.Move(pos) + r.indicator.Resize(siz) + r.indicator.Refresh() + } +} + +func (r *baseTabsRenderer) objects(t baseTabs) []fyne.CanvasObject { + objects := []fyne.CanvasObject{r.bar, r.divider, r.indicator} + if i, is := t.selected(), t.items(); i >= 0 && i < len(is) { + objects = append(objects, is[i].Content) + } + return objects +} + +func (r *baseTabsRenderer) refresh(t baseTabs) { + r.applyTheme(t) + + r.bar.Refresh() + r.divider.Refresh() + r.indicator.Refresh() +} + +type buttonIconPosition int + +const ( + buttonIconInline buttonIconPosition = iota + buttonIconTop +) + +var ( + _ fyne.Widget = (*tabButton)(nil) + _ fyne.Tappable = (*tabButton)(nil) + _ desktop.Hoverable = (*tabButton)(nil) +) + +type tabButton struct { + widget.DisableableWidget + hovered bool + icon fyne.Resource + iconPosition buttonIconPosition + importance widget.Importance + onTapped func() + onClosed func() + text string + textAlignment fyne.TextAlign + + tabs baseTabs +} + +func (b *tabButton) CreateRenderer() fyne.WidgetRenderer { + b.ExtendBaseWidget(b) + th := b.Theme() + v := fyne.CurrentApp().Settings().ThemeVariant() + + background := canvas.NewRectangle(th.Color(theme.ColorNameHover, v)) + background.CornerRadius = th.Size(theme.SizeNameSelectionRadius) + background.Hide() + icon := canvas.NewImageFromResource(b.icon) + if b.icon == nil { + icon.Hide() + } + + label := canvas.NewText(b.text, th.Color(theme.ColorNameForeground, v)) + label.TextStyle.Bold = true + + close := &tabCloseButton{ + parent: b, + onTapped: func() { + if f := b.onClosed; f != nil { + f() + } + }, + } + close.ExtendBaseWidget(close) + close.Hide() + + objects := []fyne.CanvasObject{background, label, close, icon} + return &tabButtonRenderer{ + button: b, + background: background, + icon: icon, + label: label, + close: close, + objects: objects, + } +} + +func (b *tabButton) MinSize() fyne.Size { + b.ExtendBaseWidget(b) + return b.BaseWidget.MinSize() +} + +func (b *tabButton) MouseIn(*desktop.MouseEvent) { + b.hovered = true + b.Refresh() +} + +func (b *tabButton) MouseMoved(*desktop.MouseEvent) { +} + +func (b *tabButton) MouseOut() { + b.hovered = false + b.Refresh() +} + +func (b *tabButton) Tapped(*fyne.PointEvent) { + if b.Disabled() { + return + } + + b.onTapped() +} + +type tabButtonRenderer struct { + button *tabButton + background *canvas.Rectangle + icon *canvas.Image + label *canvas.Text + close *tabCloseButton + objects []fyne.CanvasObject +} + +func (r *tabButtonRenderer) Destroy() { +} + +func (r *tabButtonRenderer) Layout(size fyne.Size) { + th := r.button.Theme() + pad := th.Size(theme.SizeNamePadding) + r.background.Resize(size) + padding := r.padding() + innerSize := size.Subtract(padding) + innerOffset := fyne.NewPos(padding.Width/2, padding.Height/2) + labelShift := float32(0) + if r.icon.Visible() { + iconSize := r.iconSize() + var iconOffset fyne.Position + if r.button.iconPosition == buttonIconTop { + iconOffset = fyne.NewPos((innerSize.Width-iconSize)/2, 0) + } else { + iconOffset = fyne.NewPos(0, (innerSize.Height-iconSize)/2) + } + r.icon.Resize(fyne.NewSquareSize(iconSize)) + r.icon.Move(innerOffset.Add(iconOffset)) + labelShift = iconSize + pad + } + if r.label.Text != "" { + var labelOffset fyne.Position + var labelSize fyne.Size + if r.button.iconPosition == buttonIconTop { + labelOffset = fyne.NewPos(0, labelShift) + labelSize = fyne.NewSize(innerSize.Width, r.label.MinSize().Height) + } else { + labelOffset = fyne.NewPos(labelShift, 0) + labelSize = fyne.NewSize(innerSize.Width-labelShift, innerSize.Height) + } + r.label.Resize(labelSize) + r.label.Move(innerOffset.Add(labelOffset)) + } + inlineIconSize := th.Size(theme.SizeNameInlineIcon) + r.close.Move(fyne.NewPos(size.Width-inlineIconSize-pad, (size.Height-inlineIconSize)/2)) + r.close.Resize(fyne.NewSquareSize(inlineIconSize)) +} + +func (r *tabButtonRenderer) MinSize() fyne.Size { + th := r.button.Theme() + var contentWidth, contentHeight float32 + textSize := r.label.MinSize() + iconSize := r.iconSize() + padding := th.Size(theme.SizeNamePadding) + if r.button.iconPosition == buttonIconTop { + contentWidth = fyne.Max(textSize.Width, iconSize) + if r.icon.Visible() { + contentHeight += iconSize + } + if r.label.Text != "" { + if r.icon.Visible() { + contentHeight += padding + } + contentHeight += textSize.Height + } + } else { + contentHeight = fyne.Max(textSize.Height, iconSize) + if r.icon.Visible() { + contentWidth += iconSize + } + if r.label.Text != "" { + if r.icon.Visible() { + contentWidth += padding + } + contentWidth += textSize.Width + } + } + if r.button.onClosed != nil { + inlineIconSize := th.Size(theme.SizeNameInlineIcon) + contentWidth += inlineIconSize + padding + contentHeight = fyne.Max(contentHeight, inlineIconSize) + } + return fyne.NewSize(contentWidth, contentHeight).Add(r.padding()) +} + +func (r *tabButtonRenderer) Objects() []fyne.CanvasObject { + return r.objects +} + +func (r *tabButtonRenderer) Refresh() { + th := r.button.Theme() + v := fyne.CurrentApp().Settings().ThemeVariant() + + if r.button.hovered && !r.button.Disabled() { + r.background.FillColor = th.Color(theme.ColorNameHover, v) + r.background.CornerRadius = th.Size(theme.SizeNameSelectionRadius) + r.background.Show() + } else { + r.background.Hide() + } + r.background.Refresh() + + r.label.Text = r.button.text + r.label.Alignment = r.button.textAlignment + if !r.button.Disabled() { + if r.button.importance == widget.HighImportance { + r.label.Color = th.Color(theme.ColorNamePrimary, v) + } else { + r.label.Color = th.Color(theme.ColorNameForeground, v) + } + } else { + r.label.Color = th.Color(theme.ColorNameDisabled, v) + } + r.label.TextSize = th.Size(theme.SizeNameText) + if r.button.text == "" { + r.label.Hide() + } else { + r.label.Show() + } + + r.icon.Resource = r.button.icon + if r.icon.Resource != nil { + r.icon.Show() + switch res := r.icon.Resource.(type) { + case *theme.ThemedResource: + if r.button.importance == widget.HighImportance { + r.icon.Resource = theme.NewPrimaryThemedResource(res) + } + case *theme.PrimaryThemedResource: + if r.button.importance != widget.HighImportance { + r.icon.Resource = res.Original() + } + } + r.icon.Refresh() + } else { + r.icon.Hide() + } + + if r.button.onClosed != nil && (isMobile(r.button.tabs) || r.button.hovered || r.close.hovered) { + r.close.Show() + } else { + r.close.Hide() + } + r.close.Refresh() + + canvas.Refresh(r.button) +} + +func (r *tabButtonRenderer) iconSize() float32 { + iconSize := r.button.Theme().Size(theme.SizeNameInlineIcon) + if r.button.iconPosition == buttonIconTop { + return 2 * iconSize + } + + return iconSize +} + +func (r *tabButtonRenderer) padding() fyne.Size { + padding := r.button.Theme().Size(theme.SizeNameInnerPadding) + if r.label.Text != "" && r.button.iconPosition == buttonIconInline { + return fyne.NewSquareSize(padding * 2) + } + return fyne.NewSize(padding, padding*2) +} + +var ( + _ fyne.Widget = (*tabCloseButton)(nil) + _ fyne.Tappable = (*tabCloseButton)(nil) + _ desktop.Hoverable = (*tabCloseButton)(nil) +) + +type tabCloseButton struct { + widget.BaseWidget + parent *tabButton + hovered bool + onTapped func() +} + +func (b *tabCloseButton) CreateRenderer() fyne.WidgetRenderer { + b.ExtendBaseWidget(b) + th := b.Theme() + v := fyne.CurrentApp().Settings().ThemeVariant() + + background := canvas.NewRectangle(th.Color(theme.ColorNameHover, v)) + background.CornerRadius = th.Size(theme.SizeNameSelectionRadius) + background.Hide() + icon := canvas.NewImageFromResource(theme.CancelIcon()) + + return &tabCloseButtonRenderer{ + button: b, + background: background, + icon: icon, + objects: []fyne.CanvasObject{background, icon}, + } +} + +func (b *tabCloseButton) MinSize() fyne.Size { + b.ExtendBaseWidget(b) + return b.BaseWidget.MinSize() +} + +func (b *tabCloseButton) MouseIn(*desktop.MouseEvent) { + b.hovered = true + b.parent.Refresh() +} + +func (b *tabCloseButton) MouseMoved(*desktop.MouseEvent) { +} + +func (b *tabCloseButton) MouseOut() { + b.hovered = false + b.parent.Refresh() +} + +func (b *tabCloseButton) Tapped(*fyne.PointEvent) { + b.onTapped() +} + +type tabCloseButtonRenderer struct { + button *tabCloseButton + background *canvas.Rectangle + icon *canvas.Image + objects []fyne.CanvasObject +} + +func (r *tabCloseButtonRenderer) Destroy() { +} + +func (r *tabCloseButtonRenderer) Layout(size fyne.Size) { + r.background.Resize(size) + r.icon.Resize(size) +} + +func (r *tabCloseButtonRenderer) MinSize() fyne.Size { + return fyne.NewSquareSize(r.button.Theme().Size(theme.SizeNameInlineIcon)) +} + +func (r *tabCloseButtonRenderer) Objects() []fyne.CanvasObject { + return r.objects +} + +func (r *tabCloseButtonRenderer) Refresh() { + th := r.button.Theme() + v := fyne.CurrentApp().Settings().ThemeVariant() + + if r.button.hovered { + r.background.FillColor = th.Color(theme.ColorNameHover, v) + r.background.CornerRadius = th.Size(theme.SizeNameSelectionRadius) + r.background.Show() + } else { + r.background.Hide() + } + r.background.Refresh() + switch res := r.icon.Resource.(type) { + case *theme.ThemedResource: + if r.button.parent.importance == widget.HighImportance { + r.icon.Resource = theme.NewPrimaryThemedResource(res) + } + case *theme.PrimaryThemedResource: + if r.button.parent.importance != widget.HighImportance { + r.icon.Resource = res.Original() + } + } + r.icon.Refresh() +} + +func mismatchedTabItems(items []*TabItem) bool { + var hasText, hasIcon bool + for _, tab := range items { + hasText = hasText || tab.Text != "" + hasIcon = hasIcon || tab.Icon != nil + } + + mismatch := false + for _, tab := range items { + if (hasText && tab.Text == "") || (hasIcon && tab.Icon == nil) { + mismatch = true + break + } + } + + return mismatch +} + +func moreIcon(t baseTabs) fyne.Resource { + if l := t.tabLocation(); l == TabLocationLeading || l == TabLocationTrailing { + return theme.MoreVerticalIcon() + } + return theme.MoreHorizontalIcon() +} diff --git a/vendor/fyne.io/fyne/v2/container/theme.go b/vendor/fyne.io/fyne/v2/container/theme.go new file mode 100644 index 0000000..ed3b53b --- /dev/null +++ b/vendor/fyne.io/fyne/v2/container/theme.go @@ -0,0 +1,116 @@ +package container + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/cache" + intTheme "fyne.io/fyne/v2/internal/theme" + "fyne.io/fyne/v2/widget" +) + +// ThemeOverride is a container where the child widgets are themed by the specified theme. +// Containers will be traversed and all child widgets will reflect the theme in this container. +// This should be used sparingly to avoid a jarring user experience. +// +// Since: 2.5 +type ThemeOverride struct { + widget.BaseWidget + + Content fyne.CanvasObject + Theme fyne.Theme + + holder *fyne.Container + + mobile bool +} + +// NewThemeOverride provides a container where the child widgets are themed by the specified theme. +// Containers will be traversed and all child widgets will reflect the theme in this container. +// This should be used sparingly to avoid a jarring user experience. +// +// If the content `obj` of this theme override is a container and items are later added to the container or any +// sub-containers ensure that you call `Refresh()` on this `ThemeOverride` to ensure the new items match the theme. +// +// Since: 2.5 +func NewThemeOverride(obj fyne.CanvasObject, th fyne.Theme) *ThemeOverride { + t := &ThemeOverride{Content: obj, Theme: th, holder: NewStack(obj)} + t.ExtendBaseWidget(t) + + cache.OverrideTheme(obj, addFeatures(th, t)) + obj.Refresh() // required as the widgets passed in could have been initially rendered with default theme + return t +} + +func (t *ThemeOverride) CreateRenderer() fyne.WidgetRenderer { + cache.OverrideTheme(t.Content, addFeatures(t.Theme, t)) + + return &overrideRenderer{parent: t, objs: []fyne.CanvasObject{t.holder}} +} + +func (t *ThemeOverride) Refresh() { + if t.holder.Objects[0] != t.Content { + t.holder.Objects[0] = t.Content + t.holder.Refresh() + } + + cache.OverrideTheme(t.Content, addFeatures(t.Theme, t)) + t.Content.Refresh() + t.BaseWidget.Refresh() +} + +// SetDeviceIsMobile allows a ThemeOverride container to shape the contained widgets as a mobile device. +// This will impact containers such as AppTabs and DocTabs, and more in the future, to display a layout +// that would automatically be used for a mobile device runtime. +// +// Since: 2.6 +func (t *ThemeOverride) SetDeviceIsMobile(on bool) { + t.mobile = on + t.BaseWidget.Refresh() +} + +type featureTheme struct { + fyne.Theme + + over *ThemeOverride +} + +func addFeatures(th fyne.Theme, o *ThemeOverride) fyne.Theme { + return &featureTheme{Theme: th, over: o} +} + +func (f *featureTheme) Feature(n intTheme.FeatureName) any { + if n == intTheme.FeatureNameDeviceIsMobile { + return f.over.mobile + } + + return nil +} + +type overrideRenderer struct { + parent *ThemeOverride + + objs []fyne.CanvasObject +} + +func (r *overrideRenderer) Destroy() { +} + +func (r *overrideRenderer) Layout(s fyne.Size) { + intTheme.PushRenderingTheme(r.parent.Theme) + defer intTheme.PopRenderingTheme() + + r.parent.holder.Resize(s) +} + +func (r *overrideRenderer) MinSize() fyne.Size { + intTheme.PushRenderingTheme(r.parent.Theme) + defer intTheme.PopRenderingTheme() + + return r.parent.Content.MinSize() +} + +func (r *overrideRenderer) Objects() []fyne.CanvasObject { + return r.objs +} + +func (r *overrideRenderer) Refresh() { +} diff --git a/vendor/fyne.io/fyne/v2/data/binding/binding.go b/vendor/fyne.io/fyne/v2/data/binding/binding.go new file mode 100644 index 0000000..6e9077c --- /dev/null +++ b/vendor/fyne.io/fyne/v2/data/binding/binding.go @@ -0,0 +1,169 @@ +//go:generate go run gen.go + +// Package binding provides support for binding data to widgets. +// All APIs in the binding package are safe to invoke directly from any goroutine. +package binding + +import ( + "errors" + "reflect" + "sync" + + "fyne.io/fyne/v2" +) + +var ( + errKeyNotFound = errors.New("key not found") + errOutOfBounds = errors.New("index out of bounds") + errParseFailed = errors.New("format did not match 1 value") + + // As an optimisation we connect any listeners asking for the same key, so that there is only 1 per preference item. + prefBinds = newPreferencesMap() +) + +// DataItem is the base interface for all bindable data items. +// All APIs on bindable data items are safe to invoke directly fron any goroutine. +// +// Since: 2.0 +type DataItem interface { + // AddListener attaches a new change listener to this DataItem. + // Listeners are called each time the data inside this DataItem changes. + // Additionally, the listener will be triggered upon successful connection to get the current value. + AddListener(DataListener) + // RemoveListener will detach the specified change listener from the DataItem. + // Disconnected listener will no longer be triggered when changes occur. + RemoveListener(DataListener) +} + +// DataListener is any object that can register for changes in a bindable DataItem. +// See NewDataListener to define a new listener using just an inline function. +// +// Since: 2.0 +type DataListener interface { + DataChanged() +} + +// NewDataListener is a helper function that creates a new listener type from a simple callback function. +// +// Since: 2.0 +func NewDataListener(fn func()) DataListener { + return &listener{fn} +} + +type listener struct { + callback func() +} + +func (l *listener) DataChanged() { + l.callback() +} + +type base struct { + listeners []DataListener + + lock sync.RWMutex +} + +// AddListener allows a data listener to be informed of changes to this item. +func (b *base) AddListener(l DataListener) { + fyne.Do(func() { + b.listeners = append(b.listeners, l) + l.DataChanged() + }) +} + +// RemoveListener should be called if the listener is no longer interested in being informed of data change events. +func (b *base) RemoveListener(l DataListener) { + fyne.Do(func() { + for i, listener := range b.listeners { + if listener == l { + // Delete without preserving order: + lastIndex := len(b.listeners) - 1 + b.listeners[i] = b.listeners[lastIndex] + b.listeners[lastIndex] = nil + b.listeners = b.listeners[:lastIndex] + return + } + } + }) +} + +func (b *base) trigger() { + fyne.Do(b.triggerFromMain) +} + +func (b *base) triggerFromMain() { + for _, listen := range b.listeners { + listen.DataChanged() + } +} + +// Untyped supports binding an any value. +// +// Since: 2.1 +type Untyped = Item[any] + +// NewUntyped returns a bindable any value that is managed internally. +// +// Since: 2.1 +func NewUntyped() Untyped { + return NewItem(func(a1, a2 any) bool { return a1 == a2 }) +} + +// ExternalUntyped supports binding a any value to an external value. +// +// Since: 2.1 +type ExternalUntyped = ExternalItem[any] + +// BindUntyped returns a bindable any value that is bound to an external type. +// The parameter must be a pointer to the type you wish to bind. +// +// Since: 2.1 +func BindUntyped(v any) ExternalUntyped { + t := reflect.TypeOf(v) + if t.Kind() != reflect.Ptr { + fyne.LogError("Invalid type passed to BindUntyped, must be a pointer", nil) + v = nil + } + + if v == nil { + v = new(any) // never allow a nil value pointer + } + + b := &boundExternalUntyped{} + b.val = reflect.ValueOf(v).Elem() + b.old = b.val.Interface() + return b +} + +type boundExternalUntyped struct { + base + + val reflect.Value + old any +} + +func (b *boundExternalUntyped) Get() (any, error) { + b.lock.RLock() + defer b.lock.RUnlock() + + return b.val.Interface(), nil +} + +func (b *boundExternalUntyped) Set(val any) error { + b.lock.Lock() + if b.old == val { + b.lock.Unlock() + return nil + } + b.val.Set(reflect.ValueOf(val)) + b.old = val + b.lock.Unlock() + + b.trigger() + return nil +} + +func (b *boundExternalUntyped) Reload() error { + return b.Set(b.val.Interface()) +} diff --git a/vendor/fyne.io/fyne/v2/data/binding/bool.go b/vendor/fyne.io/fyne/v2/data/binding/bool.go new file mode 100644 index 0000000..63632b9 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/data/binding/bool.go @@ -0,0 +1,118 @@ +package binding + +type not struct { + Bool +} + +var _ Bool = (*not)(nil) + +// Not returns a Bool binding that invert the value of the given data binding. +// This is providing the logical Not boolean operation as a data binding. +// +// Since 2.4 +func Not(data Bool) Bool { + return ¬{Bool: data} +} + +func (n *not) Get() (bool, error) { + v, err := n.Bool.Get() + return !v, err +} + +func (n *not) Set(value bool) error { + return n.Bool.Set(!value) +} + +type and struct { + booleans +} + +var _ Bool = (*and)(nil) + +// And returns a Bool binding that return true when all the passed Bool binding are +// true and false otherwise. It does apply a logical and boolean operation on all passed +// Bool bindings. This binding is two way. In case of a Set, it will propagate the value +// identically to all the Bool bindings used for its construction. +// +// Since 2.4 +func And(data ...Bool) Bool { + return &and{booleans: booleans{data: data}} +} + +func (a *and) Get() (bool, error) { + for _, d := range a.data { + v, err := d.Get() + if err != nil { + return false, err + } + if !v { + return false, nil + } + } + return true, nil +} + +func (a *and) Set(value bool) error { + for _, d := range a.data { + err := d.Set(value) + if err != nil { + return err + } + } + return nil +} + +type or struct { + booleans +} + +var _ Bool = (*or)(nil) + +// Or returns a Bool binding that return true when at least one of the passed Bool binding +// is true and false otherwise. It does apply a logical or boolean operation on all passed +// Bool bindings. This binding is two way. In case of a Set, it will propagate the value +// identically to all the Bool bindings used for its construction. +// +// Since 2.4 +func Or(data ...Bool) Bool { + return &or{booleans: booleans{data: data}} +} + +func (o *or) Get() (bool, error) { + for _, d := range o.data { + v, err := d.Get() + if err != nil { + return false, err + } + if v { + return true, nil + } + } + return false, nil +} + +func (o *or) Set(value bool) error { + for _, d := range o.data { + err := d.Set(value) + if err != nil { + return err + } + } + return nil +} + +type booleans struct { + data []Bool +} + +func (g *booleans) AddListener(listener DataListener) { + for _, d := range g.data { + d.AddListener(listener) + } +} + +func (g *booleans) RemoveListener(listener DataListener) { + for _, d := range g.data { + d.RemoveListener(listener) + } +} diff --git a/vendor/fyne.io/fyne/v2/data/binding/convert.go b/vendor/fyne.io/fyne/v2/data/binding/convert.go new file mode 100644 index 0000000..4d48c9c --- /dev/null +++ b/vendor/fyne.io/fyne/v2/data/binding/convert.go @@ -0,0 +1,409 @@ +package binding + +import ( + "fmt" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/storage" +) + +// BoolToString creates a binding that connects a Bool data item to a String. +// Changes to the Bool will be pushed to the String and setting the string will parse and set the +// Bool if the parse was successful. +// +// Since: 2.0 +func BoolToString(v Bool) String { + return toStringComparable(v, formatBool, parseBool) +} + +// BoolToStringWithFormat creates a binding that connects a Bool data item to a String and is +// presented using the specified format. Changes to the Bool will be pushed to the String and setting +// the string will parse and set the Bool if the string matches the format and its parse was successful. +// +// Since: 2.0 +func BoolToStringWithFormat(v Bool, format string) String { + return toStringWithFormatComparable[bool](v, format, "%t", formatBool, parseBool) +} + +// FloatToString creates a binding that connects a Float data item to a String. +// Changes to the Float will be pushed to the String and setting the string will parse and set the +// Float if the parse was successful. +// +// Since: 2.0 +func FloatToString(v Float) String { + return toStringComparable(v, formatFloat, parseFloat) +} + +// FloatToStringWithFormat creates a binding that connects a Float data item to a String and is +// presented using the specified format. Changes to the Float will be pushed to the String and setting +// the string will parse and set the Float if the string matches the format and its parse was successful. +// +// Since: 2.0 +func FloatToStringWithFormat(v Float, format string) String { + return toStringWithFormatComparable(v, format, "%f", formatFloat, parseFloat) +} + +// IntToFloat creates a binding that connects an Int data item to a Float. +// +// Since: 2.5 +func IntToFloat(val Int) Float { + v := &fromIntTo[float64]{from: val, parser: internalFloatToInt, formatter: internalIntToFloat} + val.AddListener(v) + return v +} + +// FloatToInt creates a binding that connects a Float data item to an Int. +// +// Since: 2.5 +func FloatToInt(v Float) Int { + i := &toInt[float64]{from: v, parser: internalFloatToInt, formatter: internalIntToFloat} + v.AddListener(i) + return i +} + +// IntToString creates a binding that connects a Int data item to a String. +// Changes to the Int will be pushed to the String and setting the string will parse and set the +// Int if the parse was successful. +// +// Since: 2.0 +func IntToString(v Int) String { + return toStringComparable(v, formatInt, parseInt) +} + +// IntToStringWithFormat creates a binding that connects a Int data item to a String and is +// presented using the specified format. Changes to the Int will be pushed to the String and setting +// the string will parse and set the Int if the string matches the format and its parse was successful. +// +// Since: 2.0 +func IntToStringWithFormat(v Int, format string) String { + return toStringWithFormatComparable(v, format, "%d", formatInt, parseInt) +} + +// URIToString creates a binding that connects a URI data item to a String. +// Changes to the URI will be pushed to the String and setting the string will parse and set the +// URI if the parse was successful. +// +// Since: 2.1 +func URIToString(v URI) String { + return toString(v, uriToString, storage.EqualURI, uriFromString) +} + +// StringToBool creates a binding that connects a String data item to a Bool. +// Changes to the String will be parsed and pushed to the Bool if the parse was successful, and setting +// the Bool update the String binding. +// +// Since: 2.0 +func StringToBool(str String) Bool { + v := &fromStringTo[bool]{from: str, formatter: parseBool, parser: formatBool} + str.AddListener(v) + return v +} + +// StringToBoolWithFormat creates a binding that connects a String data item to a Bool and is +// presented using the specified format. Changes to the Bool will be parsed and if the format matches and +// the parse is successful it will be pushed to the String. Setting the Bool will push a formatted value +// into the String. +// +// Since: 2.0 +func StringToBoolWithFormat(str String, format string) Bool { + if format == "%t" { // Same as not using custom format. + return StringToBool(str) + } + + v := &fromStringTo[bool]{from: str, format: format} + str.AddListener(v) + return v +} + +// StringToFloat creates a binding that connects a String data item to a Float. +// Changes to the String will be parsed and pushed to the Float if the parse was successful, and setting +// the Float update the String binding. +// +// Since: 2.0 +func StringToFloat(str String) Float { + v := &fromStringTo[float64]{from: str, formatter: parseFloat, parser: formatFloat} + str.AddListener(v) + return v +} + +// StringToFloatWithFormat creates a binding that connects a String data item to a Float and is +// presented using the specified format. Changes to the Float will be parsed and if the format matches and +// the parse is successful it will be pushed to the String. Setting the Float will push a formatted value +// into the String. +// +// Since: 2.0 +func StringToFloatWithFormat(str String, format string) Float { + if format == "%f" { // Same as not using custom format. + return StringToFloat(str) + } + + v := &fromStringTo[float64]{from: str, format: format} + str.AddListener(v) + return v +} + +// StringToInt creates a binding that connects a String data item to a Int. +// Changes to the String will be parsed and pushed to the Int if the parse was successful, and setting +// the Int update the String binding. +// +// Since: 2.0 +func StringToInt(str String) Int { + v := &fromStringTo[int]{from: str, parser: formatInt, formatter: parseInt} + str.AddListener(v) + return v +} + +// StringToIntWithFormat creates a binding that connects a String data item to a Int and is +// presented using the specified format. Changes to the Int will be parsed and if the format matches and +// the parse is successful it will be pushed to the String. Setting the Int will push a formatted value +// into the String. +// +// Since: 2.0 +func StringToIntWithFormat(str String, format string) Int { + if format == "%d" { // Same as not using custom format. + return StringToInt(str) + } + + v := &fromStringTo[int]{from: str, format: format} + str.AddListener(v) + return v +} + +// StringToURI creates a binding that connects a String data item to a URI. +// Changes to the String will be parsed and pushed to the URI if the parse was successful, and setting +// the URI update the String binding. +// +// Since: 2.1 +func StringToURI(str String) URI { + v := &fromStringTo[fyne.URI]{from: str, parser: uriToString, formatter: uriFromString} + str.AddListener(v) + return v +} + +func toString[T any](v Item[T], formatter func(T) (string, error), comparator func(T, T) bool, parser func(string) (T, error)) *toStringFrom[T] { + str := &toStringFrom[T]{from: v, formatter: formatter, comparator: comparator, parser: parser} + v.AddListener(str) + return str +} + +func toStringComparable[T bool | float64 | int](v Item[T], formatter func(T) (string, error), parser func(string) (T, error)) *toStringFrom[T] { + return toString(v, formatter, func(t1, t2 T) bool { return t1 == t2 }, parser) +} + +func toStringWithFormat[T any](v Item[T], format, defaultFormat string, formatter func(T) (string, error), comparator func(T, T) bool, parser func(string) (T, error)) String { + str := toString(v, formatter, comparator, parser) + if format != defaultFormat { // Same as not using custom formatting. + str.format = format + } + + return str +} + +func toStringWithFormatComparable[T bool | float64 | int](v Item[T], format, defaultFormat string, formatter func(T) (string, error), parser func(string) (T, error)) String { + return toStringWithFormat(v, format, defaultFormat, formatter, func(t1, t2 T) bool { return t1 == t2 }, parser) +} + +type convertBaseItem struct { + base +} + +func (s *convertBaseItem) DataChanged() { + s.triggerFromMain() +} + +type toStringFrom[T any] struct { + convertBaseItem + + format string + + formatter func(T) (string, error) + comparator func(T, T) bool + parser func(string) (T, error) + + from Item[T] +} + +func (s *toStringFrom[T]) Get() (string, error) { + val, err := s.from.Get() + if err != nil { + return "", err + } + + if s.format != "" { + return fmt.Sprintf(s.format, val), nil + } + + return s.formatter(val) +} + +func (s *toStringFrom[T]) Set(str string) error { + var val T + if s.format != "" { + safe := stripFormatPrecision(s.format) + n, err := fmt.Sscanf(str, safe+" ", &val) // " " denotes match to end of string + if err != nil { + return err + } + if n != 1 { + return errParseFailed + } + } else { + new, err := s.parser(str) + if err != nil { + return err + } + val = new + } + + old, err := s.from.Get() + if err != nil { + return err + } + if s.comparator(val, old) { + return nil + } + if err = s.from.Set(val); err != nil { + return err + } + + s.trigger() + return nil +} + +type fromStringTo[T any] struct { + convertBaseItem + + format string + formatter func(string) (T, error) + parser func(T) (string, error) + + from String +} + +func (s *fromStringTo[T]) Get() (T, error) { + str, err := s.from.Get() + if str == "" || err != nil { + return *new(T), err + } + + var val T + if s.format != "" { + n, err := fmt.Sscanf(str, s.format+" ", &val) // " " denotes match to end of string + if err != nil { + return *new(T), err + } + if n != 1 { + return *new(T), errParseFailed + } + } else { + formatted, err := s.formatter(str) + if err != nil { + return *new(T), err + } + val = formatted + } + + return val, nil +} + +func (s *fromStringTo[T]) Set(val T) error { + var str string + if s.format != "" { + str = fmt.Sprintf(s.format, val) + } else { + parsed, err := s.parser(val) + if err != nil { + return err + } + str = parsed + } + + old, err := s.from.Get() + if str == old { + return err + } + + err = s.from.Set(str) + if err != nil { + return err + } + + s.trigger() + return nil +} + +type toInt[T float64] struct { + convertBaseItem + + formatter func(int) (T, error) + parser func(T) (int, error) + + from Item[T] +} + +func (s *toInt[T]) Get() (int, error) { + val, err := s.from.Get() + if err != nil { + return 0, err + } + return s.parser(val) +} + +func (s *toInt[T]) Set(v int) error { + val, err := s.formatter(v) + if err != nil { + return err + } + + old, err := s.from.Get() + if err != nil { + return err + } + if val == old { + return nil + } + err = s.from.Set(val) + if err != nil { + return err + } + + s.trigger() + return nil +} + +type fromIntTo[T float64] struct { + convertBaseItem + + formatter func(int) (T, error) + parser func(T) (int, error) + from Item[int] +} + +func (s *fromIntTo[T]) Get() (T, error) { + val, err := s.from.Get() + if err != nil { + return *new(T), err + } + return s.formatter(val) +} + +func (s *fromIntTo[T]) Set(val T) error { + i, err := s.parser(val) + if err != nil { + return err + } + old, err := s.from.Get() + if i == old { + return nil + } + if err != nil { + return err + } + err = s.from.Set(i) + if err != nil { + return err + } + + s.trigger() + return nil +} diff --git a/vendor/fyne.io/fyne/v2/data/binding/convert_helper.go b/vendor/fyne.io/fyne/v2/data/binding/convert_helper.go new file mode 100644 index 0000000..8f44416 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/data/binding/convert_helper.go @@ -0,0 +1,98 @@ +package binding + +import ( + "strconv" + "strings" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/storage" +) + +func stripFormatPrecision(in string) string { + // quick exit if certainly not float + if !strings.ContainsRune(in, 'f') { + return in + } + + start := -1 + end := -1 + runes := []rune(in) + for i, r := range runes { + switch r { + case '%': + if i > 0 && start == i-1 { // ignore %% + start = -1 + } else { + start = i + } + case 'f': + if start == -1 { // not part of format + continue + } + end = i + } + + if end > -1 { + break + } + } + if end == start+1 { // no width/precision + return in + } + + sizeRunes := runes[start+1 : end] + width, err := parseFloat(string(sizeRunes)) + if err != nil { + return string(runes[:start+1]) + string(runes[:end]) + } + + if sizeRunes[0] == '.' { // formats like %.2f + return string(runes[:start+1]) + string(runes[end:]) + } + return string(runes[:start+1]) + strconv.Itoa(int(width)) + string(runes[end:]) +} + +func uriFromString(in string) (fyne.URI, error) { + return storage.ParseURI(in) +} + +func uriToString(in fyne.URI) (string, error) { + if in == nil { + return "", nil + } + + return in.String(), nil +} + +func parseBool(in string) (bool, error) { + return strconv.ParseBool(in) +} + +func parseFloat(in string) (float64, error) { + return strconv.ParseFloat(in, 64) +} + +func parseInt(in string) (int, error) { + out, err := strconv.ParseInt(in, 0, 64) + return int(out), err +} + +func formatBool(in bool) (string, error) { + return strconv.FormatBool(in), nil +} + +func formatFloat(in float64) (string, error) { + return strconv.FormatFloat(in, 'f', 6, 64), nil +} + +func formatInt(in int) (string, error) { + return strconv.FormatInt(int64(in), 10), nil +} + +func internalFloatToInt(val float64) (int, error) { + return int(val), nil +} + +func internalIntToFloat(val int) (float64, error) { + return float64(val), nil +} diff --git a/vendor/fyne.io/fyne/v2/data/binding/items.go b/vendor/fyne.io/fyne/v2/data/binding/items.go new file mode 100644 index 0000000..e7081ea --- /dev/null +++ b/vendor/fyne.io/fyne/v2/data/binding/items.go @@ -0,0 +1,284 @@ +package binding + +import ( + "bytes" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/storage" +) + +// Item supports binding any type T generically. +// +// Since: 2.6 +type Item[T any] interface { + DataItem + Get() (T, error) + Set(T) error +} + +// ExternalItem supports binding any external value of type T. +// +// Since: 2.6 +type ExternalItem[T any] interface { + Item[T] + Reload() error +} + +// NewItem returns a bindable value of type T that is managed internally. +// +// Since: 2.6 +func NewItem[T any](comparator func(T, T) bool) Item[T] { + return &item[T]{val: new(T), comparator: comparator} +} + +// BindItem returns a new bindable value that controls the contents of the provided variable of type T. +// If your code changes the content of the variable this refers to you should call Reload() to inform the bindings. +// +// Since: 2.6 +func BindItem[T any](val *T, comparator func(T, T) bool) ExternalItem[T] { + if val == nil { + val = new(T) // never allow a nil value pointer + } + b := &externalItem[T]{} + b.comparator = comparator + b.val = val + b.old = *val + return b +} + +// Bool supports binding a bool value. +// +// Since: 2.0 +type Bool = Item[bool] + +// ExternalBool supports binding a bool value to an external value. +// +// Since: 2.0 +type ExternalBool = ExternalItem[bool] + +// NewBool returns a bindable bool value that is managed internally. +// +// Since: 2.0 +func NewBool() Bool { + return newItemComparable[bool]() +} + +// BindBool returns a new bindable value that controls the contents of the provided bool variable. +// If your code changes the content of the variable this refers to you should call Reload() to inform the bindings. +// +// Since: 2.0 +func BindBool(v *bool) ExternalBool { + return bindExternalComparable(v) +} + +// Bytes supports binding a []byte value. +// +// Since: 2.2 +type Bytes = Item[[]byte] + +// ExternalBytes supports binding a []byte value to an external value. +// +// Since: 2.2 +type ExternalBytes = ExternalItem[[]byte] + +// NewBytes returns a bindable []byte value that is managed internally. +// +// Since: 2.2 +func NewBytes() Bytes { + return NewItem(bytes.Equal) +} + +// BindBytes returns a new bindable value that controls the contents of the provided []byte variable. +// If your code changes the content of the variable this refers to you should call Reload() to inform the bindings. +// +// Since: 2.2 +func BindBytes(v *[]byte) ExternalBytes { + return BindItem(v, bytes.Equal) +} + +// Float supports binding a float64 value. +// +// Since: 2.0 +type Float = Item[float64] + +// ExternalFloat supports binding a float64 value to an external value. +// +// Since: 2.0 +type ExternalFloat = ExternalItem[float64] + +// NewFloat returns a bindable float64 value that is managed internally. +// +// Since: 2.0 +func NewFloat() Float { + return newItemComparable[float64]() +} + +// BindFloat returns a new bindable value that controls the contents of the provided float64 variable. +// If your code changes the content of the variable this refers to you should call Reload() to inform the bindings. +// +// Since: 2.0 +func BindFloat(v *float64) ExternalFloat { + return bindExternalComparable(v) +} + +// Int supports binding a int value. +// +// Since: 2.0 +type Int = Item[int] + +// ExternalInt supports binding a int value to an external value. +// +// Since: 2.0 +type ExternalInt = ExternalItem[int] + +// NewInt returns a bindable int value that is managed internally. +// +// Since: 2.0 +func NewInt() Int { + return newItemComparable[int]() +} + +// BindInt returns a new bindable value that controls the contents of the provided int variable. +// If your code changes the content of the variable this refers to you should call Reload() to inform the bindings. +// +// Since: 2.0 +func BindInt(v *int) ExternalInt { + return bindExternalComparable(v) +} + +// Rune supports binding a rune value. +// +// Since: 2.0 +type Rune = Item[rune] + +// ExternalRune supports binding a rune value to an external value. +// +// Since: 2.0 +type ExternalRune = ExternalItem[rune] + +// NewRune returns a bindable rune value that is managed internally. +// +// Since: 2.0 +func NewRune() Rune { + return newItemComparable[rune]() +} + +// BindRune returns a new bindable value that controls the contents of the provided rune variable. +// If your code changes the content of the variable this refers to you should call Reload() to inform the bindings. +// +// Since: 2.0 +func BindRune(v *rune) ExternalRune { + return bindExternalComparable(v) +} + +// String supports binding a string value. +// +// Since: 2.0 +type String = Item[string] + +// ExternalString supports binding a string value to an external value. +// +// Since: 2.0 +type ExternalString = ExternalItem[string] + +// NewString returns a bindable string value that is managed internally. +// +// Since: 2.0 +func NewString() String { + return newItemComparable[string]() +} + +// BindString returns a new bindable value that controls the contents of the provided string variable. +// If your code changes the content of the variable this refers to you should call Reload() to inform the bindings. +// +// Since: 2.0 +func BindString(v *string) ExternalString { + return bindExternalComparable(v) +} + +// URI supports binding a fyne.URI value. +// +// Since: 2.1 +type URI = Item[fyne.URI] + +// ExternalURI supports binding a fyne.URI value to an external value. +// +// Since: 2.1 +type ExternalURI = ExternalItem[fyne.URI] + +// NewURI returns a bindable fyne.URI value that is managed internally. +// +// Since: 2.1 +func NewURI() URI { + return NewItem(storage.EqualURI) +} + +// BindURI returns a new bindable value that controls the contents of the provided fyne.URI variable. +// If your code changes the content of the variable this refers to you should call Reload() to inform the bindings. +// +// Since: 2.1 +func BindURI(v *fyne.URI) ExternalURI { + return BindItem(v, storage.EqualURI) +} + +func newItemComparable[T bool | float64 | int | rune | string]() Item[T] { + return NewItem[T](func(a, b T) bool { return a == b }) +} + +type item[T any] struct { + base + + comparator func(T, T) bool + val *T +} + +func (b *item[T]) Get() (T, error) { + b.lock.RLock() + defer b.lock.RUnlock() + + if b.val == nil { + return *new(T), nil + } + return *b.val, nil +} + +func (b *item[T]) Set(val T) error { + b.lock.Lock() + equal := b.comparator(*b.val, val) + *b.val = val + b.lock.Unlock() + + if !equal { + b.trigger() + } + + return nil +} + +func bindExternalComparable[T bool | float64 | int | rune | string](val *T) ExternalItem[T] { + return BindItem(val, func(t1, t2 T) bool { return t1 == t2 }) +} + +type externalItem[T any] struct { + item[T] + + old T +} + +func (b *externalItem[T]) Set(val T) error { + b.lock.Lock() + if b.comparator(b.old, val) { + b.lock.Unlock() + return nil + } + *b.val = val + b.old = val + b.lock.Unlock() + + b.trigger() + return nil +} + +func (b *externalItem[T]) Reload() error { + return b.Set(*b.val) +} diff --git a/vendor/fyne.io/fyne/v2/data/binding/lists.go b/vendor/fyne.io/fyne/v2/data/binding/lists.go new file mode 100644 index 0000000..a9f6fb7 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/data/binding/lists.go @@ -0,0 +1,563 @@ +package binding + +import ( + "bytes" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/storage" +) + +// List supports binding a list of values with type T. +// +// Since: 2.7 +type List[T any] interface { + DataList + + Append(value T) error + Get() ([]T, error) + GetValue(index int) (T, error) + Prepend(value T) error + Remove(value T) error + Set(list []T) error + SetValue(index int, value T) error +} + +// ExternalList supports binding a list of values, with type T, from an external variable. +// +// Since: 2.7 +type ExternalList[T any] interface { + List[T] + + Reload() error +} + +// NewList returns a bindable list of values with type T. +// +// Since: 2.7 +func NewList[T any](comparator func(T, T) bool) List[T] { + return newList[T](comparator) +} + +// BindList returns a bound list of values with type T, based on the contents of the passed slice. +// If your code changes the content of the slice this refers to you should call Reload() to inform the bindings. +// +// Since: 2.7 +func BindList[T any](v *[]T, comparator func(T, T) bool) ExternalList[T] { + return bindList(v, comparator) +} + +// DataList is the base interface for all bindable data lists. +// +// Since: 2.0 +type DataList interface { + DataItem + GetItem(index int) (DataItem, error) + Length() int +} + +// BoolList supports binding a list of bool values. +// +// Since: 2.0 +type BoolList = List[bool] + +// ExternalBoolList supports binding a list of bool values from an external variable. +// +// Since: 2.0 +type ExternalBoolList = ExternalList[bool] + +// NewBoolList returns a bindable list of bool values. +// +// Since: 2.0 +func NewBoolList() List[bool] { + return newListComparable[bool]() +} + +// BindBoolList returns a bound list of bool values, based on the contents of the passed slice. +// If your code changes the content of the slice this refers to you should call Reload() to inform the bindings. +// +// Since: 2.0 +func BindBoolList(v *[]bool) ExternalList[bool] { + return bindListComparable(v) +} + +// BytesList supports binding a list of []byte values. +// +// Since: 2.2 +type BytesList = List[[]byte] + +// ExternalBytesList supports binding a list of []byte values from an external variable. +// +// Since: 2.2 +type ExternalBytesList = ExternalList[[]byte] + +// NewBytesList returns a bindable list of []byte values. +// +// Since: 2.2 +func NewBytesList() List[[]byte] { + return newList(bytes.Equal) +} + +// BindBytesList returns a bound list of []byte values, based on the contents of the passed slice. +// If your code changes the content of the slice this refers to you should call Reload() to inform the bindings. +// +// Since: 2.2 +func BindBytesList(v *[][]byte) ExternalList[[]byte] { + return bindList(v, bytes.Equal) +} + +// FloatList supports binding a list of float64 values. +// +// Since: 2.0 +type FloatList = List[float64] + +// ExternalFloatList supports binding a list of float64 values from an external variable. +// +// Since: 2.0 +type ExternalFloatList = ExternalList[float64] + +// NewFloatList returns a bindable list of float64 values. +// +// Since: 2.0 +func NewFloatList() List[float64] { + return newListComparable[float64]() +} + +// BindFloatList returns a bound list of float64 values, based on the contents of the passed slice. +// If your code changes the content of the slice this refers to you should call Reload() to inform the bindings. +// +// Since: 2.0 +func BindFloatList(v *[]float64) ExternalList[float64] { + return bindListComparable(v) +} + +// IntList supports binding a list of int values. +// +// Since: 2.0 +type IntList = List[int] + +// ExternalIntList supports binding a list of int values from an external variable. +// +// Since: 2.0 +type ExternalIntList = ExternalList[int] + +// NewIntList returns a bindable list of int values. +// +// Since: 2.0 +func NewIntList() List[int] { + return newListComparable[int]() +} + +// BindIntList returns a bound list of int values, based on the contents of the passed slice. +// If your code changes the content of the slice this refers to you should call Reload() to inform the bindings. +// +// Since: 2.0 +func BindIntList(v *[]int) ExternalList[int] { + return bindListComparable(v) +} + +// RuneList supports binding a list of rune values. +// +// Since: 2.0 +type RuneList = List[rune] + +// ExternalRuneList supports binding a list of rune values from an external variable. +// +// Since: 2.0 +type ExternalRuneList = ExternalList[rune] + +// NewRuneList returns a bindable list of rune values. +// +// Since: 2.0 +func NewRuneList() List[rune] { + return newListComparable[rune]() +} + +// BindRuneList returns a bound list of rune values, based on the contents of the passed slice. +// If your code changes the content of the slice this refers to you should call Reload() to inform the bindings. +// +// Since: 2.0 +func BindRuneList(v *[]rune) ExternalList[rune] { + return bindListComparable(v) +} + +// StringList supports binding a list of string values. +// +// Since: 2.0 +type StringList = List[string] + +// ExternalStringList supports binding a list of string values from an external variable. +// +// Since: 2.0 +type ExternalStringList = ExternalList[string] + +// NewStringList returns a bindable list of string values. +// +// Since: 2.0 +func NewStringList() List[string] { + return newListComparable[string]() +} + +// BindStringList returns a bound list of string values, based on the contents of the passed slice. +// If your code changes the content of the slice this refers to you should call Reload() to inform the bindings. +// +// Since: 2.0 +func BindStringList(v *[]string) ExternalList[string] { + return bindListComparable(v) +} + +// UntypedList supports binding a list of any values. +// +// Since: 2.1 +type UntypedList = List[any] + +// ExternalUntypedList supports binding a list of any values from an external variable. +// +// Since: 2.1 +type ExternalUntypedList = ExternalList[any] + +// NewUntypedList returns a bindable list of any values. +// +// Since: 2.1 +func NewUntypedList() List[any] { + return newList(func(t1, t2 any) bool { return t1 == t2 }) +} + +// BindUntypedList returns a bound list of any values, based on the contents of the passed slice. +// If your code changes the content of the slice this refers to you should call Reload() to inform the bindings. +// +// Since: 2.1 +func BindUntypedList(v *[]any) ExternalList[any] { + return bindList(v, func(t1, t2 any) bool { return t1 == t2 }) +} + +// URIList supports binding a list of fyne.URI values. +// +// Since: 2.1 +type URIList = List[fyne.URI] + +// ExternalURIList supports binding a list of fyne.URI values from an external variable. +// +// Since: 2.1 +type ExternalURIList = ExternalList[fyne.URI] + +// NewURIList returns a bindable list of fyne.URI values. +// +// Since: 2.1 +func NewURIList() List[fyne.URI] { + return newList(storage.EqualURI) +} + +// BindURIList returns a bound list of fyne.URI values, based on the contents of the passed slice. +// If your code changes the content of the slice this refers to you should call Reload() to inform the bindings. +// +// Since: 2.1 +func BindURIList(v *[]fyne.URI) ExternalList[fyne.URI] { + return bindList(v, storage.EqualURI) +} + +type listBase struct { + base + items []DataItem +} + +// GetItem returns the DataItem at the specified index. +func (b *listBase) GetItem(i int) (DataItem, error) { + b.lock.RLock() + defer b.lock.RUnlock() + + if i < 0 || i >= len(b.items) { + return nil, errOutOfBounds + } + + return b.items[i], nil +} + +// Length returns the number of items in this data list. +func (b *listBase) Length() int { + b.lock.RLock() + defer b.lock.RUnlock() + + return len(b.items) +} + +func (b *listBase) appendItem(i DataItem) { + b.items = append(b.items, i) +} + +func (b *listBase) deleteItem(i int) { + b.items = append(b.items[:i], b.items[i+1:]...) +} + +func newList[T any](comparator func(T, T) bool) *boundList[T] { + return &boundList[T]{val: new([]T), comparator: comparator} +} + +func newListComparable[T comparable]() *boundList[T] { + return newList(func(t1, t2 T) bool { return t1 == t2 }) +} + +func newExternalList[T any](v *[]T, comparator func(T, T) bool) *boundList[T] { + return &boundList[T]{val: v, comparator: comparator, updateExternal: true} +} + +func bindList[T any](v *[]T, comparator func(T, T) bool) *boundList[T] { + if v == nil { + return newList(comparator) + } + + l := newExternalList(v, comparator) + for i := range *v { + l.appendItem(bindListItem(v, i, l.updateExternal, comparator)) + } + + return l +} + +func bindListComparable[T comparable](v *[]T) *boundList[T] { + return bindList(v, func(t1, t2 T) bool { return t1 == t2 }) +} + +type boundList[T any] struct { + listBase + + comparator func(T, T) bool + updateExternal bool + val *[]T + + parentListener func(int) +} + +func (l *boundList[T]) Append(val T) error { + l.lock.Lock() + *l.val = append(*l.val, val) + + trigger, err := l.doReload() + l.lock.Unlock() + + if trigger { + l.trigger() + } + + return err +} + +func (l *boundList[T]) Get() ([]T, error) { + l.lock.RLock() + defer l.lock.RUnlock() + + return *l.val, nil +} + +func (l *boundList[T]) GetValue(i int) (T, error) { + l.lock.RLock() + defer l.lock.RUnlock() + + if i < 0 || i >= l.Length() { + return *new(T), errOutOfBounds + } + + return (*l.val)[i], nil +} + +func (l *boundList[T]) Prepend(val T) error { + l.lock.Lock() + *l.val = append([]T{val}, *l.val...) + + trigger, err := l.doReload() + l.lock.Unlock() + + if trigger { + l.trigger() + } + + return err +} + +func (l *boundList[T]) Reload() error { + l.lock.Lock() + trigger, err := l.doReload() + l.lock.Unlock() + + if trigger { + l.trigger() + } + + return err +} + +func (l *boundList[T]) Remove(val T) error { + l.lock.Lock() + + v := *l.val + if len(v) == 0 { + l.lock.Unlock() + return nil + } + if l.comparator(v[0], val) { + *l.val = v[1:] + } else if l.comparator(v[len(v)-1], val) { + *l.val = v[:len(v)-1] + } else { + id := -1 + for i, v := range v { + if l.comparator(v, val) { + id = i + break + } + } + + if id == -1 { + l.lock.Unlock() + return nil + } + *l.val = append(v[:id], v[id+1:]...) + } + + trigger, err := l.doReload() + l.lock.Unlock() + + if trigger { + l.trigger() + } + + return err +} + +func (l *boundList[T]) Set(v []T) error { + l.lock.Lock() + *l.val = v + trigger, err := l.doReload() + l.lock.Unlock() + + if trigger { + l.trigger() + } + + return err +} + +func (l *boundList[T]) doReload() (trigger bool, retErr error) { + oldLen := len(l.items) + newLen := len(*l.val) + if oldLen > newLen { + for i := oldLen - 1; i >= newLen; i-- { + l.deleteItem(i) + } + trigger = true + } else if oldLen < newLen { + for i := oldLen; i < newLen; i++ { + item := bindListItem(l.val, i, l.updateExternal, l.comparator) + + if l.parentListener != nil { + index := i + item.AddListener(NewDataListener(func() { + l.parentListener(index) + })) + } + + l.appendItem(item) + } + trigger = true + } + + for i, item := range l.items { + if i > oldLen || i > newLen { + break + } + + var err error + if l.updateExternal { + err = item.(*boundExternalListItem[T]).setIfChanged((*l.val)[i]) + } else { + err = item.(*boundListItem[T]).doSet((*l.val)[i]) + } + if err != nil { + retErr = err + } + } + return trigger, retErr +} + +func (l *boundList[T]) SetValue(i int, v T) error { + l.lock.RLock() + len := l.Length() + l.lock.RUnlock() + + if i < 0 || i >= len { + return errOutOfBounds + } + + l.lock.Lock() + (*l.val)[i] = v + l.lock.Unlock() + + item, err := l.GetItem(i) + if err != nil { + return err + } + return item.(Item[T]).Set(v) +} + +func bindListItem[T any](v *[]T, i int, external bool, comparator func(T, T) bool) Item[T] { + if external { + ret := &boundExternalListItem[T]{old: (*v)[i]} + ret.val = v + ret.index = i + ret.comparator = comparator + return ret + } + + return &boundListItem[T]{val: v, index: i, comparator: comparator} +} + +type boundListItem[T any] struct { + base + + comparator func(T, T) bool + val *[]T + index int +} + +func (b *boundListItem[T]) Get() (T, error) { + b.lock.Lock() + defer b.lock.Unlock() + + if b.index < 0 || b.index >= len(*b.val) { + return *new(T), errOutOfBounds + } + + return (*b.val)[b.index], nil +} + +func (b *boundListItem[T]) Set(val T) error { + return b.doSet(val) +} + +func (b *boundListItem[T]) doSet(val T) error { + b.lock.Lock() + (*b.val)[b.index] = val + b.lock.Unlock() + + b.trigger() + return nil +} + +type boundExternalListItem[T any] struct { + boundListItem[T] + + old T +} + +func (b *boundExternalListItem[T]) setIfChanged(val T) error { + b.lock.Lock() + if b.comparator(val, b.old) { + b.lock.Unlock() + return nil + } + (*b.val)[b.index] = val + b.old = val + + b.lock.Unlock() + b.trigger() + return nil +} diff --git a/vendor/fyne.io/fyne/v2/data/binding/maps.go b/vendor/fyne.io/fyne/v2/data/binding/maps.go new file mode 100644 index 0000000..43b8db1 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/data/binding/maps.go @@ -0,0 +1,411 @@ +package binding + +import ( + "errors" + "reflect" + + "fyne.io/fyne/v2" +) + +// DataMap is the base interface for all bindable data maps. +// +// Since: 2.0 +type DataMap interface { + DataItem + GetItem(string) (DataItem, error) + Keys() []string +} + +// ExternalUntypedMap is a map data binding with all values untyped (any), connected to an external data source. +// +// Since: 2.0 +type ExternalUntypedMap interface { + UntypedMap + Reload() error +} + +// UntypedMap is a map data binding with all values Untyped (any). +// +// Since: 2.0 +type UntypedMap interface { + DataMap + Delete(string) + Get() (map[string]any, error) + GetValue(string) (any, error) + Set(map[string]any) error + SetValue(string, any) error +} + +// NewUntypedMap creates a new, empty map binding of string to any. +// +// Since: 2.0 +func NewUntypedMap() UntypedMap { + return &mapBase{items: make(map[string]reflectUntyped), val: &map[string]any{}} +} + +// BindUntypedMap creates a new map binding of string to any based on the data passed. +// If your code changes the content of the map this refers to you should call Reload() to inform the bindings. +// +// Since: 2.0 +func BindUntypedMap(d *map[string]any) ExternalUntypedMap { + if d == nil { + return NewUntypedMap().(ExternalUntypedMap) + } + m := &mapBase{items: make(map[string]reflectUntyped), val: d, updateExternal: true} + + for k := range *d { + m.setItem(k, bindUntypedMapValue(d, k, m.updateExternal)) + } + + return m +} + +// Struct is the base interface for a bound struct type. +// +// Since: 2.0 +type Struct interface { + DataMap + GetValue(string) (any, error) + SetValue(string, any) error + Reload() error +} + +// BindStruct creates a new map binding of string to any using the struct passed as data. +// The key for each item is a string representation of each exported field with the value set as an any. +// Only exported fields are included. +// +// Since: 2.0 +func BindStruct(i any) Struct { + if i == nil { + return NewUntypedMap().(Struct) + } + t := reflect.TypeOf(i) + if t.Kind() != reflect.Ptr || + (reflect.TypeOf(reflect.ValueOf(i).Elem()).Kind() != reflect.Struct) { + fyne.LogError("Invalid type passed to BindStruct, must be pointer to struct", nil) + return NewUntypedMap().(Struct) + } + + s := &boundStruct{orig: i} + s.items = make(map[string]reflectUntyped) + s.val = &map[string]any{} + s.updateExternal = true + + v := reflect.ValueOf(i).Elem() + t = v.Type() + for j := 0; j < v.NumField(); j++ { + f := v.Field(j) + if !f.CanSet() { + continue + } + + key := t.Field(j).Name + s.items[key] = bindReflect(f) + (*s.val)[key] = f.Interface() + } + + return s +} + +type reflectUntyped interface { + DataItem + get() (any, error) + set(any) error +} + +type mapBase struct { + base + + updateExternal bool + items map[string]reflectUntyped + val *map[string]any +} + +func (b *mapBase) GetItem(key string) (DataItem, error) { + b.lock.RLock() + defer b.lock.RUnlock() + + if v, ok := b.items[key]; ok { + return v, nil + } + + return nil, errKeyNotFound +} + +func (b *mapBase) Keys() []string { + b.lock.Lock() + defer b.lock.Unlock() + + ret := make([]string, len(b.items)) + i := 0 + for k := range b.items { + ret[i] = k + i++ + } + + return ret +} + +func (b *mapBase) Delete(key string) { + b.lock.Lock() + defer b.lock.Unlock() + + delete(b.items, key) + + b.trigger() +} + +func (b *mapBase) Get() (map[string]any, error) { + b.lock.RLock() + defer b.lock.RUnlock() + + if b.val == nil { + return map[string]any{}, nil + } + + return *b.val, nil +} + +func (b *mapBase) GetValue(key string) (any, error) { + b.lock.RLock() + defer b.lock.RUnlock() + + if i, ok := b.items[key]; ok { + return i.get() + } + + return nil, errKeyNotFound +} + +func (b *mapBase) Reload() error { + b.lock.Lock() + defer b.lock.Unlock() + + return b.doReload() +} + +func (b *mapBase) Set(v map[string]any) error { + b.lock.Lock() + defer b.lock.Unlock() + + if b.val == nil { // was not initialized with a blank value, recover + b.val = &v + b.trigger() + return nil + } + + *b.val = v + return b.doReload() +} + +func (b *mapBase) SetValue(key string, d any) error { + b.lock.Lock() + defer b.lock.Unlock() + + if i, ok := b.items[key]; ok { + return i.set(d) + } + + (*b.val)[key] = d + item := bindUntypedMapValue(b.val, key, b.updateExternal) + b.setItem(key, item) + return nil +} + +func (b *mapBase) doReload() (retErr error) { + changed := false + // add new + for key := range *b.val { + _, found := b.items[key] + if !found { + b.setItem(key, bindUntypedMapValue(b.val, key, b.updateExternal)) + changed = true + } + } + + // remove old + for key := range b.items { + _, found := (*b.val)[key] + if !found { + delete(b.items, key) + changed = true + } + } + if changed { + b.trigger() + } + + for k, item := range b.items { + var err error + + if b.updateExternal { + err = item.(*boundExternalMapValue).setIfChanged((*b.val)[k]) + } else { + err = item.(*boundMapValue).set((*b.val)[k]) + } + + if err != nil { + retErr = err + } + } + return retErr +} + +func (b *mapBase) setItem(key string, d reflectUntyped) { + b.items[key] = d + + b.trigger() +} + +type boundStruct struct { + mapBase + + orig any +} + +func (b *boundStruct) Reload() (retErr error) { + b.lock.Lock() + defer b.lock.Unlock() + + v := reflect.ValueOf(b.orig).Elem() + t := v.Type() + for j := 0; j < v.NumField(); j++ { + f := v.Field(j) + if !f.CanSet() { + continue + } + kind := f.Kind() + if kind == reflect.Slice || kind == reflect.Struct { + fyne.LogError("Data binding does not yet support slice or struct elements in a struct", nil) + continue + } + + key := t.Field(j).Name + old := (*b.val)[key] + if f.Interface() == old { + continue + } + + var err error + switch kind { + case reflect.Bool: + err = b.items[key].(*boundReflect[bool]).Set(f.Bool()) + case reflect.Float32, reflect.Float64: + err = b.items[key].(*boundReflect[float64]).Set(f.Float()) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + err = b.items[key].(*boundReflect[int]).Set(int(f.Int())) + case reflect.String: + err = b.items[key].(*boundReflect[string]).Set(f.String()) + } + if err != nil { + retErr = err + } + (*b.val)[key] = f.Interface() + } + return retErr +} + +func bindUntypedMapValue(m *map[string]any, k string, external bool) reflectUntyped { + if external { + ret := &boundExternalMapValue{old: (*m)[k]} + ret.val = m + ret.key = k + return ret + } + + return &boundMapValue{val: m, key: k} +} + +type boundMapValue struct { + base + + val *map[string]any + key string +} + +func (b *boundMapValue) get() (any, error) { + if v, ok := (*b.val)[b.key]; ok { + return v, nil + } + + return nil, errKeyNotFound +} + +func (b *boundMapValue) set(val any) error { + (*b.val)[b.key] = val + + b.trigger() + return nil +} + +type boundExternalMapValue struct { + boundMapValue + + old any +} + +func (b *boundExternalMapValue) setIfChanged(val any) error { + if val == b.old { + return nil + } + b.old = val + + return b.set(val) +} + +type boundReflect[T any] struct { + base + + val reflect.Value +} + +func (b *boundReflect[T]) Get() (T, error) { + var zero T + val, err := b.get() + if err != nil { + return zero, err + } + + casted, ok := val.(T) + if !ok { + return zero, errors.New("unable to convert value to type") + } + + return casted, nil +} + +func (b *boundReflect[T]) Set(val T) error { + return b.set(val) +} + +func (b *boundReflect[T]) get() (any, error) { + if !b.val.CanInterface() { + return nil, errors.New("unable to get value from data binding") + } + + return b.val.Interface(), nil +} + +func (b *boundReflect[T]) set(val any) error { + if !b.val.CanSet() { + return errors.New("unable to set value in data binding") + } + + b.val.Set(reflect.ValueOf(val)) + b.trigger() + return nil +} + +func bindReflect(field reflect.Value) reflectUntyped { + switch field.Kind() { + case reflect.Bool: + return &boundReflect[bool]{val: field} + case reflect.Float32, reflect.Float64: + return &boundReflect[float64]{val: field} + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return &boundReflect[int]{val: field} + case reflect.String: + return &boundReflect[string]{val: field} + } + return &boundReflect[any]{val: field} +} diff --git a/vendor/fyne.io/fyne/v2/data/binding/pref_helper.go b/vendor/fyne.io/fyne/v2/data/binding/pref_helper.go new file mode 100644 index 0000000..972aaea --- /dev/null +++ b/vendor/fyne.io/fyne/v2/data/binding/pref_helper.go @@ -0,0 +1,97 @@ +package binding + +import ( + "sync" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/async" +) + +type preferenceItem interface { + checkForChange() +} + +type preferenceBindings struct { + async.Map[string, preferenceItem] +} + +func (b *preferenceBindings) list() []preferenceItem { + ret := []preferenceItem{} + b.Range(func(_ string, item preferenceItem) bool { + ret = append(ret, item) + return true + }) + return ret +} + +type preferencesMap struct { + prefs async.Map[fyne.Preferences, *preferenceBindings] + + appPrefs fyne.Preferences // the main application prefs, to check if it changed... + appLock sync.Mutex +} + +func newPreferencesMap() *preferencesMap { + return &preferencesMap{} +} + +func (m *preferencesMap) ensurePreferencesAttached(p fyne.Preferences) *preferenceBindings { + binds, loaded := m.prefs.LoadOrStore(p, &preferenceBindings{}) + if loaded { + return binds + } + + p.AddChangeListener(func() { m.preferencesChanged(p) }) + return binds +} + +func (m *preferencesMap) getBindings(p fyne.Preferences) *preferenceBindings { + if p == fyne.CurrentApp().Preferences() { + m.appLock.Lock() + prefs := m.appPrefs + if m.appPrefs == nil { + m.appPrefs = p + } + m.appLock.Unlock() + if prefs != p { + m.migratePreferences(prefs, p) + } + } + binds, _ := m.prefs.Load(p) + return binds +} + +func (m *preferencesMap) preferencesChanged(p fyne.Preferences) { + binds := m.getBindings(p) + if binds == nil { + return + } + for _, item := range binds.list() { + item.checkForChange() + } +} + +func (m *preferencesMap) migratePreferences(src, dst fyne.Preferences) { + old, loaded := m.prefs.Load(src) + if !loaded { + return + } + + m.prefs.Store(dst, old) + m.prefs.Delete(src) + m.appLock.Lock() + m.appPrefs = dst + m.appLock.Unlock() + + binds := m.getBindings(dst) + if binds == nil { + return + } + for _, b := range binds.list() { + if backed, ok := b.(interface{ replaceProvider(fyne.Preferences) }); ok { + backed.replaceProvider(dst) + } + } + + m.preferencesChanged(dst) +} diff --git a/vendor/fyne.io/fyne/v2/data/binding/preference.go b/vendor/fyne.io/fyne/v2/data/binding/preference.go new file mode 100644 index 0000000..e2600b4 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/data/binding/preference.go @@ -0,0 +1,259 @@ +package binding + +import ( + "sync/atomic" + + "fyne.io/fyne/v2" +) + +// Work around Go not supporting generic methods on non-generic types: +type preferenceLookupSetter[T any] func(fyne.Preferences) (func(string) T, func(string, T)) + +const keyTypeMismatchError = "A previous preference binding exists with different type for key: " + +// BindPreferenceBool returns a bindable bool value that is managed by the application preferences. +// Changes to this value will be saved to application storage and when the app starts the previous values will be read. +// +// Since: 2.0 +func BindPreferenceBool(key string, p fyne.Preferences) Bool { + return bindPreferenceItem(key, p, + func(p fyne.Preferences) (func(string) bool, func(string, bool)) { + return p.Bool, p.SetBool + }) +} + +// BindPreferenceBoolList returns a bound list of bool values that is managed by the application preferences. +// Changes to this value will be saved to application storage and when the app starts the previous values will be read. +// +// Since: 2.6 +func BindPreferenceBoolList(key string, p fyne.Preferences) BoolList { + return bindPreferenceListComparable(key, p, + func(p fyne.Preferences) (func(string) []bool, func(string, []bool)) { + return p.BoolList, p.SetBoolList + }, + ) +} + +// BindPreferenceFloat returns a bindable float64 value that is managed by the application preferences. +// Changes to this value will be saved to application storage and when the app starts the previous values will be read. +// +// Since: 2.0 +func BindPreferenceFloat(key string, p fyne.Preferences) Float { + return bindPreferenceItem(key, p, + func(p fyne.Preferences) (func(string) float64, func(string, float64)) { + return p.Float, p.SetFloat + }) +} + +// BindPreferenceFloatList returns a bound list of float64 values that is managed by the application preferences. +// Changes to this value will be saved to application storage and when the app starts the previous values will be read. +// +// Since: 2.6 +func BindPreferenceFloatList(key string, p fyne.Preferences) FloatList { + return bindPreferenceListComparable(key, p, + func(p fyne.Preferences) (func(string) []float64, func(string, []float64)) { + return p.FloatList, p.SetFloatList + }, + ) +} + +// BindPreferenceInt returns a bindable int value that is managed by the application preferences. +// Changes to this value will be saved to application storage and when the app starts the previous values will be read. +// +// Since: 2.0 +func BindPreferenceInt(key string, p fyne.Preferences) Int { + return bindPreferenceItem(key, p, + func(p fyne.Preferences) (func(string) int, func(string, int)) { + return p.Int, p.SetInt + }) +} + +// BindPreferenceIntList returns a bound list of int values that is managed by the application preferences. +// Changes to this value will be saved to application storage and when the app starts the previous values will be read. +// +// Since: 2.6 +func BindPreferenceIntList(key string, p fyne.Preferences) IntList { + return bindPreferenceListComparable(key, p, + func(p fyne.Preferences) (func(string) []int, func(string, []int)) { + return p.IntList, p.SetIntList + }, + ) +} + +// BindPreferenceString returns a bindable string value that is managed by the application preferences. +// Changes to this value will be saved to application storage and when the app starts the previous values will be read. +// +// Since: 2.0 +func BindPreferenceString(key string, p fyne.Preferences) String { + return bindPreferenceItem(key, p, + func(p fyne.Preferences) (func(string) string, func(string, string)) { + return p.String, p.SetString + }) +} + +// BindPreferenceStringList returns a bound list of string values that is managed by the application preferences. +// Changes to this value will be saved to application storage and when the app starts the previous values will be read. +// +// Since: 2.6 +func BindPreferenceStringList(key string, p fyne.Preferences) StringList { + return bindPreferenceListComparable(key, p, + func(p fyne.Preferences) (func(string) []string, func(string, []string)) { + return p.StringList, p.SetStringList + }, + ) +} + +func bindPreferenceItem[T bool | float64 | int | string](key string, p fyne.Preferences, setLookup preferenceLookupSetter[T]) Item[T] { + if found, ok := lookupExistingBinding[T](key, p); ok { + return found + } + + listen := &prefBoundBase[T]{key: key, setLookup: setLookup} + listen.replaceProvider(p) + binds := prefBinds.ensurePreferencesAttached(p) + binds.Store(key, listen) + return listen +} + +func lookupExistingBinding[T any](key string, p fyne.Preferences) (Item[T], bool) { + binds := prefBinds.getBindings(p) + if binds == nil { + return nil, false + } + + if listen, ok := binds.Load(key); listen != nil && ok { + if l, ok := listen.(Item[T]); ok { + return l, ok + } + fyne.LogError(keyTypeMismatchError+key, nil) + } + + return nil, false +} + +func lookupExistingListBinding[T bool | float64 | int | string](key string, p fyne.Preferences) (*prefBoundList[T], bool) { + binds := prefBinds.getBindings(p) + if binds == nil { + return nil, false + } + + if listen, ok := binds.Load(key); listen != nil && ok { + if l, ok := listen.(*prefBoundList[T]); ok { + return l, ok + } + fyne.LogError(keyTypeMismatchError+key, nil) + } + + return nil, false +} + +type prefBoundBase[T bool | float64 | int | string] struct { + base + key string + + get func(string) T + set func(string, T) + setLookup preferenceLookupSetter[T] + cache atomic.Pointer[T] +} + +func (b *prefBoundBase[T]) Get() (T, error) { + cache := b.get(b.key) + b.cache.Store(&cache) + return cache, nil +} + +func (b *prefBoundBase[T]) Set(v T) error { + b.set(b.key, v) + + b.lock.RLock() + defer b.lock.RUnlock() + b.trigger() + return nil +} + +func (b *prefBoundBase[T]) checkForChange() { + val := b.cache.Load() + if val != nil && b.get(b.key) == *val { + return + } + b.trigger() +} + +func (b *prefBoundBase[T]) replaceProvider(p fyne.Preferences) { + b.get, b.set = b.setLookup(p) +} + +type prefBoundList[T bool | float64 | int | string] struct { + boundList[T] + key string + + get func(string) []T + set func(string, []T) + setLookup preferenceLookupSetter[[]T] +} + +func (b *prefBoundList[T]) checkForChange() { + val := *b.val + updated := b.get(b.key) + if val == nil || len(updated) != len(val) { + b.Set(updated) + return + } + + // incoming changes to a preference list are not at the child level + for i, v := range val { + if i >= len(updated) { + break + } + + if !b.comparator(v, updated[i]) { + _ = b.items[i].(Item[T]).Set(updated[i]) + } + } +} + +func (b *prefBoundList[T]) replaceProvider(p fyne.Preferences) { + b.get, b.set = b.setLookup(p) +} + +type internalPrefs = interface{ WriteValues(func(map[string]any)) } + +func bindPreferenceListComparable[T bool | float64 | int | string](key string, p fyne.Preferences, + setLookup preferenceLookupSetter[[]T], +) *prefBoundList[T] { + if found, ok := lookupExistingListBinding[T](key, p); ok { + return found + } + + listen := &prefBoundList[T]{key: key, setLookup: setLookup} + listen.replaceProvider(p) + + items := listen.get(listen.key) + listen.boundList = *bindList(nil, func(t1, t2 T) bool { return t1 == t2 }) + + listen.boundList.AddListener(NewDataListener(func() { + cached := *listen.val + replaced := listen.get(listen.key) + if len(cached) == len(replaced) { + return + } + + listen.set(listen.key, *listen.val) + listen.trigger() + })) + + listen.boundList.parentListener = func(index int) { + listen.set(listen.key, *listen.val) + + // the child changes are not seen on the write end so force it + if prefs, ok := p.(internalPrefs); ok { + prefs.WriteValues(func(map[string]any) {}) + } + } + listen.boundList.Set(items) + + binds := prefBinds.ensurePreferencesAttached(p) + binds.Store(key, listen) + return listen +} diff --git a/vendor/fyne.io/fyne/v2/data/binding/sprintf.go b/vendor/fyne.io/fyne/v2/data/binding/sprintf.go new file mode 100644 index 0000000..ac9422f --- /dev/null +++ b/vendor/fyne.io/fyne/v2/data/binding/sprintf.go @@ -0,0 +1,218 @@ +package binding + +import ( + "fmt" + + "fyne.io/fyne/v2/storage" +) + +type sprintfString struct { + String + + format string + source []DataItem + err error +} + +// NewSprintf returns a String binding that format its content using the +// format string and the provide additional parameter that must be other +// data bindings. This data binding use fmt.Sprintf and fmt.Scanf internally +// and will have all the same limitation as those function. +// +// Since: 2.2 +func NewSprintf(format string, b ...DataItem) String { + ret := &sprintfString{ + String: NewString(), + format: format, + source: b, + } + + for _, value := range b { + value.AddListener(ret) + } + + return ret +} + +func (s *sprintfString) DataChanged() { + data := make([]any, 0, len(s.source)) + + s.err = nil + for _, value := range s.source { + switch x := value.(type) { + case Bool: + b, err := x.Get() + if err != nil { + s.err = err + return + } + + data = append(data, b) + case Bytes: + b, err := x.Get() + if err != nil { + s.err = err + return + } + + data = append(data, b) + case Float: + f, err := x.Get() + if err != nil { + s.err = err + return + } + + data = append(data, f) + case Int: + i, err := x.Get() + if err != nil { + s.err = err + return + } + + data = append(data, i) + case Rune: + r, err := x.Get() + if err != nil { + s.err = err + return + } + + data = append(data, r) + case String: + str, err := x.Get() + if err != nil { + s.err = err + // Set error? + return + } + + data = append(data, str) + case URI: + u, err := x.Get() + if err != nil { + s.err = err + return + } + + data = append(data, u) + } + } + + r := fmt.Sprintf(s.format, data...) + s.String.Set(r) +} + +func (s *sprintfString) Get() (string, error) { + if s.err != nil { + return "", s.err + } + return s.String.Get() +} + +func (s *sprintfString) Set(str string) error { + data := make([]any, 0, len(s.source)) + + s.err = nil + for _, value := range s.source { + switch value.(type) { + case Bool: + data = append(data, new(bool)) + case Bytes: + return fmt.Errorf("impossible to convert '%s' to []bytes type", str) + case Float: + data = append(data, new(float64)) + case Int: + data = append(data, new(int)) + case Rune: + data = append(data, new(rune)) + case String: + data = append(data, new(string)) + case URI: + data = append(data, new(string)) + } + } + + count, err := fmt.Sscanf(str, s.format, data...) + if err != nil { + return err + } + + if count != len(data) { + return fmt.Errorf("impossible to decode more than %v parameters in '%s' with format '%s'", count, str, s.format) + } + + for i, value := range s.source { + switch x := value.(type) { + case Bool: + v := data[i].(*bool) + + err := x.Set(*v) + if err != nil { + return err + } + case Bytes: + return fmt.Errorf("impossible to convert '%s' to []bytes type", str) + case Float: + v := data[i].(*float64) + + err := x.Set(*v) + if err != nil { + return err + } + case Int: + v := data[i].(*int) + + err := x.Set(*v) + if err != nil { + return err + } + case Rune: + v := data[i].(*rune) + + err := x.Set(*v) + if err != nil { + return err + } + case String: + v := data[i].(*string) + + err := x.Set(*v) + if err != nil { + return err + } + case URI: + v := data[i].(*string) + + if v == nil { + return fmt.Errorf("URI can not be nil in '%s'", str) + } + + uri, err := storage.ParseURI(*v) + if err != nil { + return err + } + + err = x.Set(uri) + if err != nil { + return err + } + } + } + + return nil +} + +// StringToStringWithFormat creates a binding that converts a string to another string using the specified format. +// Changes to the returned String will be pushed to the passed in String and setting a new string value will parse and +// set the underlying String if it matches the format and the parse was successful. +// +// Since: 2.2 +func StringToStringWithFormat(str String, format string) String { + if format == "%s" { // Same as not using custom formatting. + return str + } + + return NewSprintf(format, str) +} diff --git a/vendor/fyne.io/fyne/v2/data/binding/trees.go b/vendor/fyne.io/fyne/v2/data/binding/trees.go new file mode 100644 index 0000000..2c4ea2c --- /dev/null +++ b/vendor/fyne.io/fyne/v2/data/binding/trees.go @@ -0,0 +1,617 @@ +package binding + +import ( + "bytes" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/storage" +) + +// DataTreeRootID const is the value used as ID for the root of any tree binding. +const DataTreeRootID = "" + +// Tree supports binding a tree of values with type T. +// +// Since: 2.7 +type Tree[T any] interface { + DataTree + + Append(parent, id string, value T) error + Get() (map[string][]string, map[string]T, error) + GetValue(id string) (T, error) + Prepend(parent, id string, value T) error + Remove(id string) error + Set(ids map[string][]string, values map[string]T) error + SetValue(id string, value T) error +} + +// ExternalTree supports binding a tree of values, of type T, from an external variable. +// +// Since: 2.7 +type ExternalTree[T any] interface { + Tree[T] + + Reload() error +} + +// NewTree returns a bindable tree of values with type T. +// +// Since: 2.7 +func NewTree[T any](comparator func(T, T) bool) Tree[T] { + return newTree[T](comparator) +} + +// BindTree returns a bound tree of values with type T, based on the contents of the passed values. +// The ids map specifies how each item relates to its parent (with id ""), with the values being in the v map. +// If your code changes the content of the maps this refers to you should call Reload() to inform the bindings. +// +// Since: 2.7 +func BindTree[T any](ids *map[string][]string, v *map[string]T, comparator func(T, T) bool) ExternalTree[T] { + return bindTree(ids, v, comparator) +} + +// DataTree is the base interface for all bindable data trees. +// +// Since: 2.4 +type DataTree interface { + DataItem + GetItem(id string) (DataItem, error) + ChildIDs(string) []string +} + +// BoolTree supports binding a tree of bool values. +// +// Since: 2.4 +type BoolTree = Tree[bool] + +// ExternalBoolTree supports binding a tree of bool values from an external variable. +// +// Since: 2.4 +type ExternalBoolTree = ExternalTree[bool] + +// NewBoolTree returns a bindable tree of bool values. +// +// Since: 2.4 +func NewBoolTree() Tree[bool] { + return newTreeComparable[bool]() +} + +// BindBoolTree returns a bound tree of bool values, based on the contents of the passed values. +// The ids map specifies how each item relates to its parent (with id ""), with the values being in the v map. +// If your code changes the content of the maps this refers to you should call Reload() to inform the bindings. +// +// Since: 2.4 +func BindBoolTree(ids *map[string][]string, v *map[string]bool) ExternalTree[bool] { + return bindTreeComparable(ids, v) +} + +// BytesTree supports binding a tree of []byte values. +// +// Since: 2.4 +type BytesTree = Tree[[]byte] + +// ExternalBytesTree supports binding a tree of []byte values from an external variable. +// +// Since: 2.4 +type ExternalBytesTree = ExternalTree[[]byte] + +// NewBytesTree returns a bindable tree of []byte values. +// +// Since: 2.4 +func NewBytesTree() Tree[[]byte] { + return newTree(bytes.Equal) +} + +// BindBytesTree returns a bound tree of []byte values, based on the contents of the passed values. +// The ids map specifies how each item relates to its parent (with id ""), with the values being in the v map. +// If your code changes the content of the maps this refers to you should call Reload() to inform the bindings. +// +// Since: 2.4 +func BindBytesTree(ids *map[string][]string, v *map[string][]byte) ExternalTree[[]byte] { + return bindTree(ids, v, bytes.Equal) +} + +// FloatTree supports binding a tree of float64 values. +// +// Since: 2.4 +type FloatTree = Tree[float64] + +// ExternalFloatTree supports binding a tree of float64 values from an external variable. +// +// Since: 2.4 +type ExternalFloatTree = ExternalTree[float64] + +// NewFloatTree returns a bindable tree of float64 values. +// +// Since: 2.4 +func NewFloatTree() Tree[float64] { + return newTreeComparable[float64]() +} + +// BindFloatTree returns a bound tree of float64 values, based on the contents of the passed values. +// The ids map specifies how each item relates to its parent (with id ""), with the values being in the v map. +// If your code changes the content of the maps this refers to you should call Reload() to inform the bindings. +// +// Since: 2.4 +func BindFloatTree(ids *map[string][]string, v *map[string]float64) ExternalTree[float64] { + return bindTreeComparable(ids, v) +} + +// IntTree supports binding a tree of int values. +// +// Since: 2.4 +type IntTree = Tree[int] + +// ExternalIntTree supports binding a tree of int values from an external variable. +// +// Since: 2.4 +type ExternalIntTree = ExternalTree[int] + +// NewIntTree returns a bindable tree of int values. +// +// Since: 2.4 +func NewIntTree() Tree[int] { + return newTreeComparable[int]() +} + +// BindIntTree returns a bound tree of int values, based on the contents of the passed values. +// The ids map specifies how each item relates to its parent (with id ""), with the values being in the v map. +// If your code changes the content of the maps this refers to you should call Reload() to inform the bindings. +// +// Since: 2.4 +func BindIntTree(ids *map[string][]string, v *map[string]int) ExternalTree[int] { + return bindTreeComparable(ids, v) +} + +// RuneTree supports binding a tree of rune values. +// +// Since: 2.4 +type RuneTree = Tree[rune] + +// ExternalRuneTree supports binding a tree of rune values from an external variable. +// +// Since: 2.4 +type ExternalRuneTree = ExternalTree[rune] + +// NewRuneTree returns a bindable tree of rune values. +// +// Since: 2.4 +func NewRuneTree() Tree[rune] { + return newTreeComparable[rune]() +} + +// BindRuneTree returns a bound tree of rune values, based on the contents of the passed values. +// The ids map specifies how each item relates to its parent (with id ""), with the values being in the v map. +// If your code changes the content of the maps this refers to you should call Reload() to inform the bindings. +// +// Since: 2.4 +func BindRuneTree(ids *map[string][]string, v *map[string]rune) ExternalTree[rune] { + return bindTreeComparable(ids, v) +} + +// StringTree supports binding a tree of string values. +// +// Since: 2.4 +type StringTree = Tree[string] + +// ExternalStringTree supports binding a tree of string values from an external variable. +// +// Since: 2.4 +type ExternalStringTree = ExternalTree[string] + +// NewStringTree returns a bindable tree of string values. +// +// Since: 2.4 +func NewStringTree() Tree[string] { + return newTreeComparable[string]() +} + +// BindStringTree returns a bound tree of string values, based on the contents of the passed values. +// The ids map specifies how each item relates to its parent (with id ""), with the values being in the v map. +// If your code changes the content of the maps this refers to you should call Reload() to inform the bindings. +// +// Since: 2.4 +func BindStringTree(ids *map[string][]string, v *map[string]string) ExternalTree[string] { + return bindTreeComparable(ids, v) +} + +// UntypedTree supports binding a tree of any values. +// +// Since: 2.5 +type UntypedTree = Tree[any] + +// ExternalUntypedTree supports binding a tree of any values from an external variable. +// +// Since: 2.5 +type ExternalUntypedTree = ExternalTree[any] + +// NewUntypedTree returns a bindable tree of any values. +// +// Since: 2.5 +func NewUntypedTree() Tree[any] { + return newTree(func(a1, a2 any) bool { return a1 == a2 }) +} + +// BindUntypedTree returns a bound tree of any values, based on the contents of the passed values. +// The ids map specifies how each item relates to its parent (with id ""), with the values being in the v map. +// If your code changes the content of the maps this refers to you should call Reload() to inform the bindings. +// +// Since: 2.4 +func BindUntypedTree(ids *map[string][]string, v *map[string]any) ExternalTree[any] { + return bindTree(ids, v, func(a1, a2 any) bool { return a1 == a2 }) +} + +// URITree supports binding a tree of fyne.URI values. +// +// Since: 2.4 +type URITree = Tree[fyne.URI] + +// ExternalURITree supports binding a tree of fyne.URI values from an external variable. +// +// Since: 2.4 +type ExternalURITree = ExternalTree[fyne.URI] + +// NewURITree returns a bindable tree of fyne.URI values. +// +// Since: 2.4 +func NewURITree() Tree[fyne.URI] { + return newTree(storage.EqualURI) +} + +// BindURITree returns a bound tree of fyne.URI values, based on the contents of the passed values. +// The ids map specifies how each item relates to its parent (with id ""), with the values being in the v map. +// If your code changes the content of the maps this refers to you should call Reload() to inform the bindings. +// +// Since: 2.4 +func BindURITree(ids *map[string][]string, v *map[string]fyne.URI) ExternalTree[fyne.URI] { + return bindTree(ids, v, storage.EqualURI) +} + +type treeBase struct { + base + + ids map[string][]string + items map[string]DataItem +} + +// GetItem returns the DataItem at the specified id. +func (t *treeBase) GetItem(id string) (DataItem, error) { + t.lock.RLock() + defer t.lock.RUnlock() + + if item, ok := t.items[id]; ok { + return item, nil + } + + return nil, errOutOfBounds +} + +// ChildIDs returns the ordered IDs of items in this data tree that are children of the specified ID. +func (t *treeBase) ChildIDs(id string) []string { + t.lock.RLock() + defer t.lock.RUnlock() + + if ids, ok := t.ids[id]; ok { + return ids + } + + return []string{} +} + +func (t *treeBase) appendItem(i DataItem, id, parent string) { + t.items[id] = i + + ids := t.ids[parent] + for _, in := range ids { + if in == id { + return + } + } + t.ids[parent] = append(ids, id) +} + +func (t *treeBase) deleteItem(id, parent string) { + delete(t.items, id) + + ids, ok := t.ids[parent] + if !ok { + return + } + + off := -1 + for i, id2 := range ids { + if id2 == id { + off = i + break + } + } + if off == -1 { + return + } + t.ids[parent] = append(ids[:off], ids[off+1:]...) +} + +func parentIDFor(id string, ids map[string][]string) string { + for parent, list := range ids { + for _, child := range list { + if child == id { + return parent + } + } + } + + return "" +} + +func newTree[T any](comparator func(T, T) bool) *boundTree[T] { + t := &boundTree[T]{val: &map[string]T{}, comparator: comparator} + t.ids = make(map[string][]string) + t.items = make(map[string]DataItem) + return t +} + +func newTreeComparable[T comparable]() *boundTree[T] { + return newTree(func(t1, t2 T) bool { return t1 == t2 }) +} + +func bindTree[T any](ids *map[string][]string, v *map[string]T, comparator func(T, T) bool) *boundTree[T] { + if v == nil { + return newTree(comparator) + } + + t := &boundTree[T]{val: v, updateExternal: true, comparator: comparator} + t.ids = make(map[string][]string) + t.items = make(map[string]DataItem) + + for parent, children := range *ids { + for _, leaf := range children { + t.appendItem(bindTreeItem(v, leaf, t.updateExternal, t.comparator), leaf, parent) + } + } + + return t +} + +func bindTreeComparable[T comparable](ids *map[string][]string, v *map[string]T) *boundTree[T] { + return bindTree(ids, v, func(t1, t2 T) bool { return t1 == t2 }) +} + +type boundTree[T any] struct { + treeBase + + comparator func(T, T) bool + val *map[string]T + updateExternal bool +} + +func (t *boundTree[T]) Append(parent, id string, val T) error { + t.lock.Lock() + + t.ids[parent] = append(t.ids[parent], id) + v := *t.val + v[id] = val + + trigger, err := t.doReload() + t.lock.Unlock() + + if trigger { + t.trigger() + } + + return err +} + +func (t *boundTree[T]) Get() (map[string][]string, map[string]T, error) { + t.lock.RLock() + defer t.lock.RUnlock() + + return t.ids, *t.val, nil +} + +func (t *boundTree[T]) GetValue(id string) (T, error) { + t.lock.RLock() + defer t.lock.RUnlock() + + if item, ok := (*t.val)[id]; ok { + return item, nil + } + + return *new(T), errOutOfBounds +} + +func (t *boundTree[T]) Prepend(parent, id string, val T) error { + t.lock.Lock() + + t.ids[parent] = append([]string{id}, t.ids[parent]...) + v := *t.val + v[id] = val + + trigger, err := t.doReload() + t.lock.Unlock() + + if trigger { + t.trigger() + } + + return err +} + +func (t *boundTree[T]) Remove(id string) error { + t.lock.Lock() + t.removeChildren(id) + delete(t.ids, id) + v := *t.val + delete(v, id) + + trigger, err := t.doReload() + t.lock.Unlock() + + if trigger { + t.trigger() + } + + return err +} + +func (t *boundTree[T]) removeChildren(id string) { + for _, cid := range t.ids[id] { + t.removeChildren(cid) + + delete(t.ids, cid) + v := *t.val + delete(v, cid) + } +} + +func (t *boundTree[T]) Reload() error { + t.lock.Lock() + trigger, err := t.doReload() + t.lock.Unlock() + + if trigger { + t.trigger() + } + + return err +} + +func (t *boundTree[T]) Set(ids map[string][]string, v map[string]T) error { + t.lock.Lock() + t.ids = ids + *t.val = v + + trigger, err := t.doReload() + t.lock.Unlock() + + if trigger { + t.trigger() + } + + return err +} + +func (t *boundTree[T]) doReload() (fire bool, retErr error) { + updated := []string{} + for id := range *t.val { + found := false + for child := range t.items { + if child == id { // update existing + updated = append(updated, id) + found = true + break + } + } + if found { + continue + } + + // append new + t.appendItem(bindTreeItem(t.val, id, t.updateExternal, t.comparator), id, parentIDFor(id, t.ids)) + updated = append(updated, id) + fire = true + } + + for id := range t.items { + remove := true + for _, done := range updated { + if done == id { + remove = false + break + } + } + + if remove { // remove item no longer present + fire = true + t.deleteItem(id, parentIDFor(id, t.ids)) + } + } + + for id, item := range t.items { + var err error + if t.updateExternal { + err = item.(*boundExternalTreeItem[T]).setIfChanged((*t.val)[id]) + } else { + err = item.(*boundTreeItem[T]).doSet((*t.val)[id]) + } + if err != nil { + retErr = err + } + } + return fire, retErr +} + +func (t *boundTree[T]) SetValue(id string, v T) error { + t.lock.Lock() + (*t.val)[id] = v + t.lock.Unlock() + + item, err := t.GetItem(id) + if err != nil { + return err + } + return item.(Item[T]).Set(v) +} + +func bindTreeItem[T any](v *map[string]T, id string, external bool, comparator func(T, T) bool) Item[T] { + if external { + ret := &boundExternalTreeItem[T]{old: (*v)[id], comparator: comparator} + ret.val = v + ret.id = id + return ret + } + + return &boundTreeItem[T]{id: id, val: v} +} + +type boundTreeItem[T any] struct { + base + + val *map[string]T + id string +} + +func (t *boundTreeItem[T]) Get() (T, error) { + t.lock.Lock() + defer t.lock.Unlock() + + v := *t.val + if item, ok := v[t.id]; ok { + return item, nil + } + + return *new(T), errOutOfBounds +} + +func (t *boundTreeItem[T]) Set(val T) error { + return t.doSet(val) +} + +func (t *boundTreeItem[T]) doSet(val T) error { + t.lock.Lock() + (*t.val)[t.id] = val + t.lock.Unlock() + + t.trigger() + return nil +} + +type boundExternalTreeItem[T any] struct { + boundTreeItem[T] + + comparator func(T, T) bool + old T +} + +func (t *boundExternalTreeItem[T]) setIfChanged(val T) error { + t.lock.Lock() + if t.comparator(val, t.old) { + t.lock.Unlock() + return nil + } + (*t.val)[t.id] = val + t.old = val + t.lock.Unlock() + + t.trigger() + return nil +} diff --git a/vendor/fyne.io/fyne/v2/device.go b/vendor/fyne.io/fyne/v2/device.go new file mode 100644 index 0000000..b5dba46 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/device.go @@ -0,0 +1,44 @@ +package fyne + +// DeviceOrientation represents the different ways that a mobile device can be held +type DeviceOrientation int + +const ( + // OrientationVertical is the default vertical orientation + OrientationVertical DeviceOrientation = iota + // OrientationVerticalUpsideDown is the portrait orientation held upside down + OrientationVerticalUpsideDown + // OrientationHorizontalLeft is used to indicate a landscape orientation with the top to the left + OrientationHorizontalLeft + // OrientationHorizontalRight is used to indicate a landscape orientation with the top to the right + OrientationHorizontalRight +) + +// IsVertical is a helper utility that determines if a passed orientation is vertical +func IsVertical(orient DeviceOrientation) bool { + return orient == OrientationVertical || orient == OrientationVerticalUpsideDown +} + +// IsHorizontal is a helper utility that determines if a passed orientation is horizontal +func IsHorizontal(orient DeviceOrientation) bool { + return !IsVertical(orient) +} + +// Device provides information about the devices the code is running on +type Device interface { + Orientation() DeviceOrientation + IsMobile() bool + IsBrowser() bool + HasKeyboard() bool + SystemScaleForWindow(Window) float32 + + // Locale returns the information about this device's language and region. + // + // Since: 2.5 + Locale() Locale +} + +// CurrentDevice returns the device information for the current hardware (via the driver) +func CurrentDevice() Device { + return CurrentApp().Driver().Device() +} diff --git a/vendor/fyne.io/fyne/v2/dialog/base.go b/vendor/fyne.io/fyne/v2/dialog/base.go new file mode 100644 index 0000000..5d606ef --- /dev/null +++ b/vendor/fyne.io/fyne/v2/dialog/base.go @@ -0,0 +1,259 @@ +// Package dialog defines standard dialog windows for application GUIs. +package dialog // import "fyne.io/fyne/v2/dialog" + +import ( + "image/color" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/container" + col "fyne.io/fyne/v2/internal/color" + "fyne.io/fyne/v2/layout" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +const ( + padWidth = 32 + padHeight = 16 +) + +// Dialog is the common API for any dialog window with a single dismiss button +type Dialog interface { + Show() + Hide() + SetDismissText(label string) + SetOnClosed(closed func()) + Refresh() + Resize(size fyne.Size) + + // MinSize returns the size that this dialog should not shrink below. + // + // Since: 2.1 + MinSize() fyne.Size + + // Dismiss instructs the dialog to close without any affirmative action. + // + // Since: 2.6 + Dismiss() +} + +// Declare conformity to Dialog interface +var _ Dialog = (*dialog)(nil) + +type dialog struct { + callback func(bool) + title string + icon fyne.Resource + desiredSize fyne.Size + + win *widget.PopUp + content fyne.CanvasObject + dismiss *widget.Button + parent fyne.Window + + // allows derived dialogs to inject logic that runs before Show() + beforeShowHook func() +} + +func (d *dialog) Dismiss() { + d.Hide() +} + +func (d *dialog) Hide() { + d.hideWithResponse(false) +} + +// MinSize returns the size that this dialog should not shrink below. +// +// Since: 2.1 +func (d *dialog) MinSize() fyne.Size { + return d.win.MinSize() +} + +func (d *dialog) Show() { + if d.beforeShowHook != nil { + d.beforeShowHook() + } + if !d.desiredSize.IsZero() { + d.win.Resize(d.desiredSize) + } + d.win.Show() +} + +func (d *dialog) Refresh() { + d.win.Refresh() +} + +// Resize dialog, call this function after dialog show +func (d *dialog) Resize(size fyne.Size) { + d.desiredSize = size + if d.win != nil { // could be called before popup is created! + d.win.Resize(size) + } +} + +// SetDismissText allows custom text to be set in the dismiss button +// This is a no-op for dialogs without dismiss buttons. +func (d *dialog) SetDismissText(label string) { + if d.dismiss == nil { + return + } + + d.dismiss.SetText(label) + d.win.Refresh() +} + +// SetOnClosed allows to set a callback function that is called when +// the dialog is closed +func (d *dialog) SetOnClosed(closed func()) { + // if there is already a callback set, remember it and call both + originalCallback := d.callback + + d.callback = func(response bool) { + if originalCallback != nil { + originalCallback(response) + } + closed() + } +} + +func (d *dialog) hideWithResponse(resp bool) { + d.win.Hide() + if d.callback != nil { + d.callback(resp) + } +} + +func (d *dialog) create(buttons fyne.CanvasObject) { + label := widget.NewLabelWithStyle(d.title, fyne.TextAlignLeading, fyne.TextStyle{Bold: true}) + + var image fyne.CanvasObject + if d.icon != nil { + image = &canvas.Image{Resource: d.icon} + } else { + image = &layout.Spacer{} + } + + content := container.New(&dialogLayout{d: d}, + image, + newThemedBackground(), + d.content, + buttons, + label, + ) + + d.win = widget.NewModalPopUp(content, d.parent.Canvas()) +} + +func (d *dialog) setButtons(buttons fyne.CanvasObject) { + d.win.Content.(*fyne.Container).Objects[3] = buttons + d.win.Refresh() +} + +func (d *dialog) setIcon(icon fyne.Resource) { + if icon == nil { + d.win.Content.(*fyne.Container).Objects[0] = &layout.Spacer{} + d.win.Refresh() + return + } + d.win.Content.(*fyne.Container).Objects[0] = &canvas.Image{Resource: icon} + d.win.Refresh() +} + +// The method .create() needs to be called before the dialog can be shown. +func newDialog(title, message string, icon fyne.Resource, callback func(bool), parent fyne.Window) *dialog { + d := &dialog{content: newCenterWrappedLabel(message), title: title, icon: icon, parent: parent} + d.callback = callback + + return d +} + +// =============================================================== +// ThemedBackground +// =============================================================== + +type themedBackground struct { + widget.BaseWidget +} + +func newThemedBackground() *themedBackground { + t := &themedBackground{} + t.ExtendBaseWidget(t) + return t +} + +func (t *themedBackground) CreateRenderer() fyne.WidgetRenderer { + t.ExtendBaseWidget(t) + rect := canvas.NewRectangle(theme.Color(theme.ColorNameOverlayBackground)) + return &themedBackgroundRenderer{rect, []fyne.CanvasObject{rect}} +} + +type themedBackgroundRenderer struct { + rect *canvas.Rectangle + objects []fyne.CanvasObject +} + +func (renderer *themedBackgroundRenderer) Destroy() { +} + +func (renderer *themedBackgroundRenderer) Layout(size fyne.Size) { + renderer.rect.Resize(size) +} + +func (renderer *themedBackgroundRenderer) MinSize() fyne.Size { + return renderer.rect.MinSize() +} + +func (renderer *themedBackgroundRenderer) Objects() []fyne.CanvasObject { + return renderer.objects +} + +func (renderer *themedBackgroundRenderer) Refresh() { + r, g, b, _ := col.ToNRGBA(theme.Color(theme.ColorNameOverlayBackground)) + bg := &color.NRGBA{R: uint8(r), G: uint8(g), B: uint8(b), A: 230} + renderer.rect.FillColor = bg +} + +// =============================================================== +// DialogLayout +// =============================================================== + +type dialogLayout struct { + d *dialog +} + +func (l *dialogLayout) Layout(obj []fyne.CanvasObject, size fyne.Size) { + btnMin := obj[3].MinSize() + labelMin := obj[4].MinSize() + + // icon + iconHeight := padHeight*2 + labelMin.Height*2 - theme.Padding() + obj[0].Resize(fyne.NewSize(iconHeight, iconHeight)) + obj[0].Move(fyne.NewPos(size.Width-iconHeight+theme.Padding(), -theme.Padding())) + + // background + obj[1].Move(fyne.NewPos(0, 0)) + obj[1].Resize(size) + + // content + contentStart := obj[4].Position().Y + labelMin.Height + padHeight + contentEnd := obj[3].Position().Y - theme.Padding() + obj[2].Move(fyne.NewPos(padWidth/2, labelMin.Height+padHeight)) + obj[2].Resize(fyne.NewSize(size.Width-padWidth, contentEnd-contentStart)) + + // buttons + obj[3].Resize(btnMin) + obj[3].Move(fyne.NewPos(size.Width/2-(btnMin.Width/2), size.Height-padHeight-btnMin.Height)) +} + +func (l *dialogLayout) MinSize(obj []fyne.CanvasObject) fyne.Size { + contentMin := obj[2].MinSize() + btnMin := obj[3].MinSize() + labelMin := obj[4].MinSize() + + width := fyne.Max(fyne.Max(contentMin.Width, btnMin.Width), labelMin.Width) + padWidth + height := contentMin.Height + btnMin.Height + labelMin.Height + theme.Padding() + padHeight*2 + + return fyne.NewSize(width, height) +} diff --git a/vendor/fyne.io/fyne/v2/dialog/color.go b/vendor/fyne.io/fyne/v2/dialog/color.go new file mode 100644 index 0000000..192937b --- /dev/null +++ b/vendor/fyne.io/fyne/v2/dialog/color.go @@ -0,0 +1,363 @@ +package dialog + +import ( + "fmt" + "image/color" + "math" + "math/cmplx" + "strings" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/container" + col "fyne.io/fyne/v2/internal/color" + "fyne.io/fyne/v2/lang" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +const ( + checkeredBoxSize = 8 + checkeredNumberOfRings = 12 + + preferenceRecents = "color_recents" + preferenceMaxRecents = 7 +) + +// ColorPickerDialog is a simple dialog window that displays a color picker. +// +// Since: 1.4 +type ColorPickerDialog struct { + *dialog + Advanced bool + color color.Color + callback func(c color.Color) + advanced *widget.Accordion + picker *colorAdvancedPicker +} + +// NewColorPicker creates a color dialog and returns the handle. +// Using the returned type you should call Show() and then set its color through SetColor(). +// The callback is triggered when the user selects a color. +// +// Since: 1.4 +func NewColorPicker(title, message string, callback func(c color.Color), parent fyne.Window) *ColorPickerDialog { + return &ColorPickerDialog{ + dialog: newDialog(title, message, theme.ColorPaletteIcon(), nil /*cancel?*/, parent), + color: theme.Color(theme.ColorNamePrimary), + callback: callback, + } +} + +// ShowColorPicker creates and shows a color dialog. +// The callback is triggered when the user selects a color. +// +// Since: 1.4 +func ShowColorPicker(title, message string, callback func(c color.Color), parent fyne.Window) { + NewColorPicker(title, message, callback, parent).Show() +} + +// Refresh causes this dialog to be updated +func (p *ColorPickerDialog) Refresh() { + p.updateUI() +} + +// SetColor updates the color of the color picker. +func (p *ColorPickerDialog) SetColor(c color.Color) { + if p.picker == nil && p.Advanced { + p.updateUI() + } else if !p.Advanced { + fyne.LogError("Advanced mode needs to be enabled to use SetColor", nil) + return + } + p.picker.SetColor(c) +} + +// Show causes this dialog to be displayed +func (p *ColorPickerDialog) Show() { + if p.win == nil || p.Advanced != (p.advanced != nil) { + p.updateUI() + } + p.dialog.Show() +} + +func (p *ColorPickerDialog) createSimplePickers() (contents []fyne.CanvasObject) { + contents = append(contents, newColorBasicPicker(p.selectColor), newColorGreyscalePicker(p.selectColor)) + if recent := newColorRecentPicker(p.selectColor); len(recent.(*fyne.Container).Objects) > 0 { + // Add divider and recents if there are any, + contents = append(contents, canvas.NewLine(theme.Color(theme.ColorNameShadow)), recent) + } + return contents +} + +func (p *ColorPickerDialog) selectColor(c color.Color) { + writeRecentColor(colorToString(c)) + if p.picker != nil { + p.picker.SetColor(c) + } + if f := p.callback; f != nil { + f(c) + } + p.dialog.Hide() + p.updateUI() +} + +func (p *ColorPickerDialog) updateUI() { + if w := p.win; w != nil { + w.Hide() + } + p.dialog.dismiss = &widget.Button{ + Text: lang.L("Cancel"), Icon: theme.CancelIcon(), + OnTapped: p.dialog.Hide, + } + if p.Advanced { + p.picker = newColorAdvancedPicker(p.color, func(c color.Color) { + p.color = c + }) + + advancedItem := widget.NewAccordionItem(lang.L("Advanced"), p.picker) + if p.advanced != nil { + advancedItem.Open = p.advanced.Items[0].Open + } + p.advanced = widget.NewAccordion(advancedItem) + + p.dialog.content = container.NewVBox( + container.NewCenter( + container.NewVBox( + p.createSimplePickers()..., + ), + ), + widget.NewSeparator(), + p.advanced, + ) + + confirm := &widget.Button{ + Text: lang.L("Confirm"), Icon: theme.ConfirmIcon(), Importance: widget.HighImportance, + OnTapped: func() { + p.selectColor(p.color) + }, + } + p.dialog.create(container.NewGridWithColumns(2, p.dialog.dismiss, confirm)) + } else { + p.dialog.content = container.NewVBox(p.createSimplePickers()...) + p.dialog.create(container.NewGridWithColumns(1, p.dialog.dismiss)) + } +} + +func clamp(value, min, max int) int { + if value < min { + return min + } + if value > max { + return max + } + return value +} + +func wrapHue(hue int) int { + for hue < 0 { + hue += 360 + } + for hue > 360 { + hue -= 360 + } + return hue +} + +func newColorButtonBox(colors []color.Color, icon fyne.Resource, callback func(color.Color)) fyne.CanvasObject { + var objects []fyne.CanvasObject + if icon != nil && len(colors) > 0 { + objects = append(objects, widget.NewIcon(icon)) + } + for _, c := range colors { + objects = append(objects, newColorButton(c, callback)) + } + return container.NewGridWithColumns(8, objects...) +} + +func newCheckeredBackground(radial bool) *canvas.Raster { + f := func(x, y, _, _ int) color.Color { + if (x/checkeredBoxSize)%2 == (y/checkeredBoxSize)%2 { + return color.Gray{Y: 58} + } + + return color.Gray{Y: 84} + } + + if radial { + rect := f + f = func(x, y, w, h int) color.Color { + r, t := cmplx.Polar(complex(float64(x)-float64(w)/2, float64(y)-float64(h)/2)) + limit := math.Min(float64(w), float64(h)) / 2.0 + if r > limit { + // Out of bounds + return &color.NRGBA{A: 0} + } + + x = int((t + math.Pi) / (2 * math.Pi) * checkeredNumberOfRings * checkeredBoxSize) + y = int(r) + return rect(x, y, 0, 0) + } + } + + return canvas.NewRasterWithPixels(f) +} + +func readRecentColors() (recents []string) { + for _, r := range strings.Split(fyne.CurrentApp().Preferences().String(preferenceRecents), ",") { + if r != "" { + recents = append(recents, r) + } + } + return recents +} + +func writeRecentColor(color string) { + recents := []string{color} + for _, r := range readRecentColors() { + if r == color { + continue // Color already in recents + } + recents = append(recents, r) + } + if len(recents) > preferenceMaxRecents { + recents = recents[:preferenceMaxRecents] + } + fyne.CurrentApp().Preferences().SetString(preferenceRecents, strings.Join(recents, ",")) +} + +func colorToString(c color.Color) string { + red, green, blue, alpha := col.ToNRGBA(c) + if alpha == 0xff { + return fmt.Sprintf("#%02x%02x%02x", red, green, blue) + } + return fmt.Sprintf("#%02x%02x%02x%02x", red, green, blue, alpha) +} + +func stringToColor(s string) (color.Color, error) { + var c color.NRGBA + var err error + if len(s) == 7 { + c.A = 0xFF + _, err = fmt.Sscanf(s, "#%02x%02x%02x", &c.R, &c.G, &c.B) + } else { + _, err = fmt.Sscanf(s, "#%02x%02x%02x%02x", &c.R, &c.G, &c.B, &c.A) + } + return c, err +} + +func stringsToColors(ss ...string) (colors []color.Color) { + for _, s := range ss { + if s == "" { + continue + } + c, err := stringToColor(s) + if err != nil { + fyne.LogError("Couldn't parse color:", err) + } else { + colors = append(colors, c) + } + } + return colors +} + +func colorToHSLA(c color.Color) (int, int, int, int) { + r, g, b, a := col.ToNRGBA(c) + h, s, l := rgbToHsl(r, g, b) + return h, s, l, a +} + +// https://www.niwa.nu/2013/05/math-behind-colorspace-conversions-rgb-hsl/ + +func rgbToHsl(r, g, b int) (int, int, int) { + red := float64(r) / 255.0 + green := float64(g) / 255.0 + blue := float64(b) / 255.0 + + min := math.Min(red, math.Min(green, blue)) + max := math.Max(red, math.Max(green, blue)) + + lightness := (max + min) / 2.0 + + delta := max - min + + if delta == 0.0 { + // Achromatic + return 0, 0, int(lightness * 100.0) + } + + // Chromatic + + var saturation float64 + + if lightness < 0.5 { + saturation = (max - min) / (max + min) + } else { + saturation = (max - min) / (2.0 - max - min) + } + + var hue float64 + + if red == max { + hue = (green - blue) / delta + } else if green == max { + hue = 2.0 + (blue-red)/delta + } else if blue == max { + hue = 4.0 + (red-green)/delta + } + + h := wrapHue(int(hue * 60.0)) + s := int(saturation * 100.0) + l := int(lightness * 100.0) + return h, s, l +} + +func hslToRgb(h, s, l int) (int, int, int) { + hue := float64(h) / 360.0 + saturation := float64(s) / 100.0 + lightness := float64(l) / 100.0 + + if saturation == 0.0 { + // Greyscale + g := int(lightness * 255.0) + return g, g, g + } + + var v1 float64 + if lightness < 0.5 { + v1 = lightness * (1.0 + saturation) + } else { + v1 = (lightness + saturation) - (lightness * saturation) + } + + v2 := 2.0*lightness - v1 + + red := hueToChannel(hue+(1.0/3.0), v1, v2) + green := hueToChannel(hue, v1, v2) + blue := hueToChannel(hue-(1.0/3.0), v1, v2) + + r := int(math.Round(255.0 * red)) + g := int(math.Round(255.0 * green)) + b := int(math.Round(255.0 * blue)) + + return r, g, b +} + +func hueToChannel(h, v1, v2 float64) float64 { + for h < 0.0 { + h += 1.0 + } + for h > 1.0 { + h -= 1.0 + } + if 6.0*h < 1.0 { + return v2 + (v1-v2)*6*h + } + if 2.0*h < 1.0 { + return v1 + } + if 3.0*h < 2.0 { + return v2 + (v1-v2)*6*((2.0/3.0)-h) + } + return v2 +} diff --git a/vendor/fyne.io/fyne/v2/dialog/color_button.go b/vendor/fyne.io/fyne/v2/dialog/color_button.go new file mode 100644 index 0000000..1cd5cf1 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/dialog/color_button.go @@ -0,0 +1,116 @@ +package dialog + +import ( + "image/color" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/driver/desktop" + internalwidget "fyne.io/fyne/v2/internal/widget" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +var ( + _ fyne.Widget = (*colorButton)(nil) + _ desktop.Hoverable = (*colorButton)(nil) +) + +// colorButton displays a color and triggers the callback when tapped. +type colorButton struct { + widget.BaseWidget + color color.Color + onTap func(color.Color) + hovered bool +} + +// newColorButton creates a colorButton with the given color and callback. +func newColorButton(color color.Color, onTap func(color.Color)) *colorButton { + b := &colorButton{ + color: color, + onTap: onTap, + } + b.ExtendBaseWidget(b) + return b +} + +// CreateRenderer is a private method to Fyne which links this widget to its renderer +func (b *colorButton) CreateRenderer() fyne.WidgetRenderer { + b.ExtendBaseWidget(b) + background := newCheckeredBackground(false) + rectangle := &canvas.Rectangle{ + FillColor: b.color, + } + return &colorButtonRenderer{ + BaseRenderer: internalwidget.NewBaseRenderer([]fyne.CanvasObject{background, rectangle}), + button: b, + background: background, + rectangle: rectangle, + } +} + +// MouseIn is called when a desktop pointer enters the widget +func (b *colorButton) MouseIn(*desktop.MouseEvent) { + b.hovered = true + b.Refresh() +} + +// MouseOut is called when a desktop pointer exits the widget +func (b *colorButton) MouseOut() { + b.hovered = false + b.Refresh() +} + +// MouseMoved is called when a desktop pointer hovers over the widget +func (b *colorButton) MouseMoved(*desktop.MouseEvent) { +} + +// MinSize returns the size that this widget should not shrink below +func (b *colorButton) MinSize() fyne.Size { + return b.BaseWidget.MinSize() +} + +// SetColor updates the color selected in this color widget +func (b *colorButton) SetColor(color color.Color) { + if b.color == color { + return + } + b.color = color + b.Refresh() +} + +// Tapped is called when a pointer tapped event is captured and triggers any change handler +func (b *colorButton) Tapped(*fyne.PointEvent) { + if f := b.onTap; f != nil { + f(b.color) + } +} + +type colorButtonRenderer struct { + internalwidget.BaseRenderer + button *colorButton + background *canvas.Raster + rectangle *canvas.Rectangle +} + +func (r *colorButtonRenderer) Layout(size fyne.Size) { + r.rectangle.Move(fyne.NewPos(0, 0)) + r.rectangle.Resize(size) + r.background.Resize(size) +} + +func (r *colorButtonRenderer) MinSize() fyne.Size { + return r.rectangle.MinSize().Max(fyne.NewSize(32, 32)) +} + +func (r *colorButtonRenderer) Refresh() { + if r.button.hovered { + r.rectangle.StrokeColor = theme.Color(theme.ColorNameHover) + r.rectangle.StrokeWidth = theme.Padding() + } else { + r.rectangle.StrokeWidth = 0 + } + r.rectangle.FillColor = r.button.color + r.background.Refresh() + canvas.Refresh(r.button) +} diff --git a/vendor/fyne.io/fyne/v2/dialog/color_channel.go b/vendor/fyne.io/fyne/v2/dialog/color_channel.go new file mode 100644 index 0000000..d16974a --- /dev/null +++ b/vendor/fyne.io/fyne/v2/dialog/color_channel.go @@ -0,0 +1,187 @@ +package dialog + +import ( + "strconv" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + internalwidget "fyne.io/fyne/v2/internal/widget" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +var _ fyne.Widget = (*colorChannel)(nil) + +// colorChannel controls a channel of a color and triggers the callback when changed. +type colorChannel struct { + widget.BaseWidget + name string + min, max int + value int + onChanged func(int) +} + +// newColorChannel returns a new color channel control for the channel with the given name. +func newColorChannel(name string, min, max, value int, onChanged func(int)) *colorChannel { + c := &colorChannel{ + name: name, + min: min, + max: max, + value: clamp(value, min, max), + onChanged: onChanged, + } + c.ExtendBaseWidget(c) + return c +} + +// CreateRenderer is a private method to Fyne which links this widget to its renderer +func (c *colorChannel) CreateRenderer() fyne.WidgetRenderer { + label := widget.NewLabelWithStyle(c.name, fyne.TextAlignTrailing, fyne.TextStyle{Bold: true}) + entry := newColorChannelEntry(c) + slider := &widget.Slider{ + Value: 0.0, + Min: float64(c.min), + Max: float64(c.max), + Step: 1.0, + Orientation: widget.Horizontal, + OnChanged: func(value float64) { + c.SetValue(int(value)) + }, + } + r := &colorChannelRenderer{ + BaseRenderer: internalwidget.NewBaseRenderer([]fyne.CanvasObject{ + label, + slider, + entry, + }), + control: c, + label: label, + entry: entry, + slider: slider, + } + r.updateObjects() + return r +} + +// MinSize returns the size that this widget should not shrink below +func (c *colorChannel) MinSize() fyne.Size { + c.ExtendBaseWidget(c) + return c.BaseWidget.MinSize() +} + +// SetValue updates the value in this color widget +func (c *colorChannel) SetValue(value int) { + value = clamp(value, c.min, c.max) + if c.value == value { + return + } + c.value = value + c.Refresh() + if f := c.onChanged; f != nil { + f(value) + } +} + +type colorChannelRenderer struct { + internalwidget.BaseRenderer + control *colorChannel + label *widget.Label + entry *colorChannelEntry + slider *widget.Slider +} + +func (r *colorChannelRenderer) Layout(size fyne.Size) { + lMin := r.label.MinSize() + eMin := r.entry.MinSize() + r.label.Move(fyne.NewPos(0, (size.Height-lMin.Height)/2)) + r.label.Resize(fyne.NewSize(lMin.Width, lMin.Height)) + r.slider.Move(fyne.NewPos(lMin.Width, 0)) + r.slider.Resize(fyne.NewSize(size.Width-lMin.Width-eMin.Width, size.Height)) + r.entry.Move(fyne.NewPos(size.Width-eMin.Width, 0)) + r.entry.Resize(fyne.NewSize(eMin.Width, size.Height)) +} + +func (r *colorChannelRenderer) MinSize() fyne.Size { + lMin := r.label.MinSize() + sMin := r.slider.MinSize() + eMin := r.entry.MinSize() + return fyne.NewSize( + lMin.Width+sMin.Width+eMin.Width, + fyne.Max(lMin.Height, fyne.Max(sMin.Height, eMin.Height)), + ) +} + +func (r *colorChannelRenderer) Refresh() { + r.updateObjects() + r.Layout(r.control.Size()) + canvas.Refresh(r.control) +} + +func (r *colorChannelRenderer) updateObjects() { + r.entry.SetText(strconv.Itoa(r.control.value)) + r.slider.Value = float64(r.control.value) + r.slider.Refresh() +} + +type colorChannelEntry struct { + userChangeEntry +} + +func newColorChannelEntry(c *colorChannel) *colorChannelEntry { + e := &colorChannelEntry{} + e.Text = "0" + e.ExtendBaseWidget(e) + e.setOnChanged(func(text string) { + value, err := strconv.Atoi(text) + if err != nil { + fyne.LogError("Couldn't parse: "+text, err) + return + } + c.SetValue(value) + }) + return e +} + +func (e *colorChannelEntry) MinSize() fyne.Size { + // Ensure space for 3 digits + min := fyne.MeasureText("000", theme.TextSize(), fyne.TextStyle{}) + min = min.Add(fyne.NewSize(theme.Padding()*6, theme.Padding()*4)) + return min.Max(e.Entry.MinSize()) +} + +type userChangeEntry struct { + widget.Entry + userTyped bool +} + +func newUserChangeEntry(text string) *userChangeEntry { + e := &userChangeEntry{} + e.Entry.Text = text + e.ExtendBaseWidget(e) + return e +} + +func (e *userChangeEntry) setOnChanged(onChanged func(s string)) { + e.Entry.OnChanged = func(text string) { + if !e.userTyped { + return + } + + e.userTyped = false + + if onChanged != nil { + onChanged(text) + } + } + e.ExtendBaseWidget(e) +} + +func (e *userChangeEntry) TypedRune(r rune) { + e.userTyped = true + e.Entry.TypedRune(r) +} + +func (e *userChangeEntry) TypedKey(ev *fyne.KeyEvent) { + e.userTyped = true + e.Entry.TypedKey(ev) +} diff --git a/vendor/fyne.io/fyne/v2/dialog/color_picker.go b/vendor/fyne.io/fyne/v2/dialog/color_picker.go new file mode 100644 index 0000000..7040e86 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/dialog/color_picker.go @@ -0,0 +1,304 @@ +package dialog + +import ( + "image/color" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/container" + col "fyne.io/fyne/v2/internal/color" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +// newColorBasicPicker returns a component for selecting basic colors. +func newColorBasicPicker(callback func(color.Color)) fyne.CanvasObject { + return newColorButtonBox( + stringsToColors( + "#f44336", // red + "#ff9800", // orange + "#ffeb3b", // yellow + "#8bc34a", // green + "#296ff6", // blue + "#9c27b0", // purple + "#795548", // brown + ), + theme.ColorChromaticIcon(), + callback, + ) +} + +// newColorGreyscalePicker returns a component for selecting greyscale colors. +func newColorGreyscalePicker(callback func(color.Color)) fyne.CanvasObject { + return newColorButtonBox( + stringsToColors( + "#ffffff", + "#cccccc", + "#aaaaaa", + "#808080", + "#555555", + "#333333", + "#000000", + ), + theme.ColorAchromaticIcon(), + callback, + ) +} + +// newColorRecentPicker returns a component for selecting recent colors. +func newColorRecentPicker(callback func(color.Color)) fyne.CanvasObject { + return newColorButtonBox(stringsToColors(readRecentColors()...), theme.HistoryIcon(), callback) +} + +var _ fyne.Widget = (*colorAdvancedPicker)(nil) + +// colorAdvancedPicker widget is a component for selecting a color. +type colorAdvancedPicker struct { + widget.BaseWidget + Red, Green, Blue, Alpha int // Range 0-255 + Hue int // Range 0-360 (degrees) + Saturation, Lightness int // Range 0-100 (percent) + ColorModel string + previousColor color.Color + + onChange func(color.Color) +} + +// newColorAdvancedPicker returns a new color widget set to the given color. +func newColorAdvancedPicker(color color.Color, onChange func(color.Color)) *colorAdvancedPicker { + c := &colorAdvancedPicker{ + onChange: onChange, + } + c.ExtendBaseWidget(c) + c.previousColor = color + c.updateColor(color) + return c +} + +// Color returns the currently selected color. +func (p *colorAdvancedPicker) Color() color.Color { + return &color.NRGBA{ + uint8(p.Red), + uint8(p.Green), + uint8(p.Blue), + uint8(p.Alpha), + } +} + +// SetColor updates the color selected in this color widget. +func (p *colorAdvancedPicker) SetColor(color color.Color) { + p.previousColor = color + if p.updateColor(color) { + p.Refresh() + if f := p.onChange; f != nil { + f(color) + } + } +} + +// SetHSLA updated the Hue, Saturation, Lightness, and Alpha components of the currently selected color. +func (p *colorAdvancedPicker) SetHSLA(h, s, l, a int) { + if p.updateHSLA(h, s, l, a) { + p.Refresh() + if f := p.onChange; f != nil { + f(p.Color()) + } + } +} + +// SetRGBA updated the Red, Green, Blue, and Alpha components of the currently selected color. +func (p *colorAdvancedPicker) SetRGBA(r, g, b, a int) { + if p.updateRGBA(r, g, b, a) { + p.Refresh() + if f := p.onChange; f != nil { + f(p.Color()) + } + } +} + +// MinSize returns the size that this widget should not shrink below. +func (p *colorAdvancedPicker) MinSize() fyne.Size { + p.ExtendBaseWidget(p) + return p.BaseWidget.MinSize() +} + +// CreateRenderer is a private method to Fyne which links this widget to its renderer. +func (p *colorAdvancedPicker) CreateRenderer() fyne.WidgetRenderer { + p.ExtendBaseWidget(p) + + // Preview + preview := newColorPreview(p.previousColor) + + // HSL + hueChannel := newColorChannel("H", 0, 360, p.Hue, func(h int) { + p.SetHSLA(h, p.Saturation, p.Lightness, p.Alpha) + }) + saturationChannel := newColorChannel("S", 0, 100, p.Saturation, func(s int) { + p.SetHSLA(p.Hue, s, p.Lightness, p.Alpha) + }) + lightnessChannel := newColorChannel("L", 0, 100, p.Lightness, func(l int) { + p.SetHSLA(p.Hue, p.Saturation, l, p.Alpha) + }) + hslBox := container.NewVBox( + hueChannel, + saturationChannel, + lightnessChannel, + ) + + // RGB + redChannel := newColorChannel("R", 0, 255, p.Red, func(r int) { + p.SetRGBA(r, p.Green, p.Blue, p.Alpha) + }) + greenChannel := newColorChannel("G", 0, 255, p.Green, func(g int) { + p.SetRGBA(p.Red, g, p.Blue, p.Alpha) + }) + blueChannel := newColorChannel("B", 0, 255, p.Blue, func(b int) { + p.SetRGBA(p.Red, p.Green, b, p.Alpha) + }) + rgbBox := container.NewVBox( + redChannel, + greenChannel, + blueChannel, + ) + + // Wheel + wheel := newColorWheel(func(hue, saturation, lightness, alpha int) { + p.SetHSLA(hue, saturation, lightness, alpha) + }) + + // Alpha + alphaChannel := newColorChannel("A", 0, 255, p.Alpha, func(a int) { + p.SetRGBA(p.Red, p.Green, p.Blue, a) + }) + + // Hex + hex := newUserChangeEntry("") + hex.setOnChanged(func(text string) { + c, err := stringToColor(text) + if err != nil { + fyne.LogError("Error parsing color: "+text, err) + // TODO trigger entry invalid state + } else { + p.SetColor(c) + } + }) + + contents := container.NewPadded(container.NewVBox( + container.NewGridWithColumns(3, + container.NewPadded(wheel), + hslBox, + rgbBox), + container.NewGridWithColumns(3, + container.NewPadded(preview), + + hex, + alphaChannel, + ), + )) + + r := &colorPickerRenderer{ + WidgetRenderer: widget.NewSimpleRenderer(contents), + picker: p, + redChannel: redChannel, + greenChannel: greenChannel, + blueChannel: blueChannel, + hueChannel: hueChannel, + saturationChannel: saturationChannel, + lightnessChannel: lightnessChannel, + wheel: wheel, + preview: preview, + alphaChannel: alphaChannel, + hex: hex, + contents: contents, + } + r.updateObjects() + return r +} + +func (p *colorAdvancedPicker) updateColor(color color.Color) bool { + r, g, b, a := col.ToNRGBA(color) + if p.Red == r && p.Green == g && p.Blue == b && p.Alpha == a { + return false + } + return p.updateRGBA(r, g, b, a) +} + +func (p *colorAdvancedPicker) updateHSLA(h, s, l, a int) bool { + h = wrapHue(h) + s = clamp(s, 0, 100) + l = clamp(l, 0, 100) + a = clamp(a, 0, 255) + if p.Hue == h && p.Saturation == s && p.Lightness == l && p.Alpha == a { + return false + } + p.Hue = h + p.Saturation = s + p.Lightness = l + p.Alpha = a + p.Red, p.Green, p.Blue = hslToRgb(p.Hue, p.Saturation, p.Lightness) + return true +} + +func (p *colorAdvancedPicker) updateRGBA(r, g, b, a int) bool { + r = clamp(r, 0, 255) + g = clamp(g, 0, 255) + b = clamp(b, 0, 255) + a = clamp(a, 0, 255) + if p.Red == r && p.Green == g && p.Blue == b && p.Alpha == a { + return false + } + p.Red = r + p.Green = g + p.Blue = b + p.Alpha = a + p.Hue, p.Saturation, p.Lightness = rgbToHsl(p.Red, p.Green, p.Blue) + return true +} + +var _ fyne.WidgetRenderer = (*colorPickerRenderer)(nil) + +type colorPickerRenderer struct { + fyne.WidgetRenderer + picker *colorAdvancedPicker + redChannel *colorChannel + greenChannel *colorChannel + blueChannel *colorChannel + hueChannel *colorChannel + saturationChannel *colorChannel + lightnessChannel *colorChannel + wheel *colorWheel + preview *colorPreview + alphaChannel *colorChannel + hex *userChangeEntry + contents fyne.CanvasObject +} + +func (r *colorPickerRenderer) Refresh() { + r.updateObjects() + r.WidgetRenderer.Refresh() +} + +func (r *colorPickerRenderer) updateObjects() { + // HSL + r.hueChannel.SetValue(r.picker.Hue) + r.saturationChannel.SetValue(r.picker.Saturation) + r.lightnessChannel.SetValue(r.picker.Lightness) + + // RGB + r.redChannel.SetValue(r.picker.Red) + r.greenChannel.SetValue(r.picker.Green) + r.blueChannel.SetValue(r.picker.Blue) + + // Wheel + r.wheel.SetHSLA(r.picker.Hue, r.picker.Saturation, r.picker.Lightness, r.picker.Alpha) + + color := r.picker.Color() + + // Preview + r.preview.SetColor(color) + + // Alpha + r.alphaChannel.SetValue(r.picker.Alpha) + + // Hex + r.hex.SetText(colorToString(color)) +} diff --git a/vendor/fyne.io/fyne/v2/dialog/color_preview.go b/vendor/fyne.io/fyne/v2/dialog/color_preview.go new file mode 100644 index 0000000..860040e --- /dev/null +++ b/vendor/fyne.io/fyne/v2/dialog/color_preview.go @@ -0,0 +1,78 @@ +package dialog + +import ( + "image/color" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + internalwidget "fyne.io/fyne/v2/internal/widget" + "fyne.io/fyne/v2/widget" +) + +// colorPreview displays a 2 part rectangle showing the current and previous selected colours +type colorPreview struct { + widget.BaseWidget + + previous, current color.Color +} + +func newColorPreview(previousColor color.Color) *colorPreview { + p := &colorPreview{previous: previousColor} + + p.ExtendBaseWidget(p) + return p +} + +// CreateRenderer is a private method to Fyne which links this widget to its renderer. +func (p *colorPreview) CreateRenderer() fyne.WidgetRenderer { + oldC := canvas.NewRectangle(p.previous) + newC := canvas.NewRectangle(p.current) + background := newCheckeredBackground(false) + return &colorPreviewRenderer{ + BaseRenderer: internalwidget.NewBaseRenderer([]fyne.CanvasObject{background, oldC, newC}), + preview: p, + background: background, + old: oldC, + new: newC, + } +} + +func (p *colorPreview) SetColor(c color.Color) { + p.current = c + p.Refresh() +} + +func (p *colorPreview) MinSize() fyne.Size { + p.ExtendBaseWidget(p) + return p.BaseWidget.MinSize() +} + +type colorPreviewRenderer struct { + internalwidget.BaseRenderer + preview *colorPreview + background *canvas.Raster + old, new *canvas.Rectangle +} + +func (r *colorPreviewRenderer) Layout(size fyne.Size) { + s := fyne.NewSize(size.Width/2, size.Height) + r.background.Resize(size) + r.old.Resize(s) + r.new.Resize(s) + r.new.Move(fyne.NewPos(s.Width, 0)) +} + +func (r *colorPreviewRenderer) MinSize() fyne.Size { + s := r.old.MinSize() + s.Width *= 2 + return s.Max(fyne.NewSize(16, 8)) +} + +func (r *colorPreviewRenderer) Refresh() { + r.background.Refresh() + + r.old.FillColor = r.preview.previous + r.old.Refresh() + r.new.FillColor = r.preview.current + r.new.Refresh() +} diff --git a/vendor/fyne.io/fyne/v2/dialog/color_wheel.go b/vendor/fyne.io/fyne/v2/dialog/color_wheel.go new file mode 100644 index 0000000..7a09943 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/dialog/color_wheel.go @@ -0,0 +1,212 @@ +package dialog + +import ( + "image" + "image/color" + "image/draw" + "math" + "math/cmplx" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/driver/desktop" + internalwidget "fyne.io/fyne/v2/internal/widget" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +var ( + _ fyne.Widget = (*colorWheel)(nil) + _ fyne.Tappable = (*colorWheel)(nil) + _ fyne.Draggable = (*colorWheel)(nil) +) + +// colorWheel displays a circular color gradient and triggers the callback when tapped. +type colorWheel struct { + widget.BaseWidget + generator func(w, h int) image.Image + cache draw.Image + onChange func(int, int, int, int) + + Hue int // Range 0-360 (degrees) + Saturation, Lightness int // Range 0-100 (percent) + Alpha int // Range 0-255 +} + +// newColorWheel returns a new color area that triggers the given onChange callback when tapped. +func newColorWheel(onChange func(int, int, int, int)) *colorWheel { + a := &colorWheel{ + onChange: onChange, + } + a.generator = func(w, h int) image.Image { + if a.cache == nil || a.cache.Bounds().Dx() != w || a.cache.Bounds().Dy() != h { + rect := image.Rect(0, 0, w, h) + a.cache = image.NewRGBA(rect) + } + for x := 0; x < w; x++ { + for y := 0; y < h; y++ { + if c := a.colorAt(x, y, w, h); c != nil { + a.cache.Set(x, y, c) + } + } + } + return a.cache + } + a.ExtendBaseWidget(a) + return a +} + +// Cursor returns the cursor type of this widget. +func (a *colorWheel) Cursor() desktop.Cursor { + return desktop.CrosshairCursor +} + +// CreateRenderer is a private method to Fyne which links this widget to its renderer. +func (a *colorWheel) CreateRenderer() fyne.WidgetRenderer { + raster := &canvas.Raster{ + Generator: a.generator, + } + background := newCheckeredBackground(true) + x := canvas.NewLine(color.Black) + y := canvas.NewLine(color.Black) + return &colorWheelRenderer{ + BaseRenderer: internalwidget.NewBaseRenderer([]fyne.CanvasObject{background, raster, x, y}), + area: a, + background: background, + raster: raster, + x: x, + y: y, + } +} + +// MinSize returns the size that this widget should not shrink below. +func (a *colorWheel) MinSize() fyne.Size { + a.ExtendBaseWidget(a) + return a.BaseWidget.MinSize() +} + +// SetHSLA updates the selected color in the wheel. +func (a *colorWheel) SetHSLA(hue, saturation, lightness, alpha int) { + if a.Hue == hue && a.Saturation == saturation && a.Lightness == lightness && a.Alpha == alpha { + return + } + a.Hue = hue + a.Saturation = saturation + a.Lightness = lightness + a.Alpha = alpha + a.Refresh() +} + +// Tapped is called when a pointer tapped event is captured and triggers any change handler. +func (a *colorWheel) Tapped(event *fyne.PointEvent) { + a.trigger(event.Position) +} + +// Dragged is called when a pointer drag event is captured and triggers any change handler +func (a *colorWheel) Dragged(event *fyne.DragEvent) { + a.trigger(event.Position) +} + +// DragEnd is called when a pointer drag ends +func (a *colorWheel) DragEnd() { +} + +func (a *colorWheel) colorAt(x, y, w, h int) color.Color { + width, height := float64(w), float64(h) + dx := float64(x) - (width / 2.0) + dy := float64(y) - (height / 2.0) + radius, radians := cmplx.Polar(complex(dx, dy)) + limit := math.Min(width, height) / 2.0 + if radius > limit { + // Out of bounds + return color.Transparent + } + degrees := radians * (180.0 / math.Pi) + hue := wrapHue(int(degrees)) + saturation := int(radius / limit * 100.0) + red, green, blue := hslToRgb(hue, saturation, a.Lightness) + return &color.NRGBA{ + R: uint8(red), + G: uint8(green), + B: uint8(blue), + A: uint8(a.Alpha), + } +} + +func (a *colorWheel) locationForPosition(pos fyne.Position) (x, y int) { + can := fyne.CurrentApp().Driver().CanvasForObject(a) + x, y = int(pos.X), int(pos.Y) + if can != nil { + x, y = can.PixelCoordinateForPosition(pos) + } + return x, y +} + +func (a *colorWheel) selection(width, height float32) (float32, float32) { + w, h := float64(width), float64(height) + radius := float64(a.Saturation) / 100.0 * math.Min(w, h) / 2.0 + degrees := float64(a.Hue) + radians := degrees * math.Pi / 180.0 + c := cmplx.Rect(radius, radians) + return float32(real(c) + w/2.0), float32(imag(c) + h/2.0) +} + +func (a *colorWheel) trigger(pos fyne.Position) { + x, y := a.locationForPosition(pos) + if c, f := a.cache, a.onChange; c != nil && f != nil { + b := c.Bounds() + width, height := float64(b.Dx()), float64(b.Dy()) + dx := float64(x) - (width / 2) + dy := float64(y) - (height / 2) + radius, radians := cmplx.Polar(complex(dx, dy)) + limit := math.Min(width, height) / 2.0 + if radius > limit { + // Out of bounds + return + } + degrees := radians * (180.0 / math.Pi) + a.Hue = wrapHue(int(degrees)) + a.Saturation = int(radius / limit * 100.0) + f(a.Hue, a.Saturation, a.Lightness, a.Alpha) + } + a.Refresh() +} + +type colorWheelRenderer struct { + internalwidget.BaseRenderer + area *colorWheel + background *canvas.Raster + raster *canvas.Raster + x, y *canvas.Line +} + +func (r *colorWheelRenderer) Layout(size fyne.Size) { + x, y := r.area.selection(size.Width, size.Height) + r.x.Position1 = fyne.NewPos(0, y) + r.x.Position2 = fyne.NewPos(size.Width, y) + r.y.Position1 = fyne.NewPos(x, 0) + r.y.Position2 = fyne.NewPos(x, size.Height) + r.raster.Move(fyne.NewPos(0, 0)) + r.raster.Resize(size) + r.background.Resize(size) +} + +func (r *colorWheelRenderer) MinSize() fyne.Size { + return r.raster.MinSize().Max(fyne.NewSize(128, 128)) +} + +func (r *colorWheelRenderer) Refresh() { + s := r.area.Size() + if s.IsZero() { + r.area.Resize(r.area.MinSize()) + } else { + r.Layout(s) + } + r.x.StrokeColor = theme.Color(theme.ColorNameForeground) + r.x.Refresh() + r.y.StrokeColor = theme.Color(theme.ColorNameForeground) + r.y.Refresh() + r.raster.Refresh() + r.background.Refresh() + canvas.Refresh(r.area) +} diff --git a/vendor/fyne.io/fyne/v2/dialog/confirm.go b/vendor/fyne.io/fyne/v2/dialog/confirm.go new file mode 100644 index 0000000..726449d --- /dev/null +++ b/vendor/fyne.io/fyne/v2/dialog/confirm.go @@ -0,0 +1,65 @@ +package dialog + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/lang" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +// ConfirmDialog is like the standard Dialog but with an additional confirmation button +type ConfirmDialog struct { + *dialog + + confirm *widget.Button +} + +// Confirm instructs the dialog to close agreeing with whatever content was displayed. +// +// Since: 2.6 +func (d *ConfirmDialog) Confirm() { + d.hideWithResponse(true) +} + +// SetConfirmText allows custom text to be set in the confirmation button +func (d *ConfirmDialog) SetConfirmText(label string) { + d.confirm.SetText(label) + d.win.Refresh() +} + +// SetConfirmImportance sets the importance level of the confirm button. +// +// Since 2.4 +func (d *ConfirmDialog) SetConfirmImportance(importance widget.Importance) { + d.confirm.Importance = importance +} + +// NewConfirm creates a dialog over the specified window for user confirmation. +// The title is used for the dialog window and message is the content. +// The callback is executed when the user decides. After creation you should call Show(). +func NewConfirm(title, message string, callback func(bool), parent fyne.Window) *ConfirmDialog { + d := newTextDialog(title, message, theme.QuestionIcon(), parent) + d.callback = callback + + d.dismiss = &widget.Button{ + Text: lang.L("No"), Icon: theme.CancelIcon(), + OnTapped: d.Hide, + } + confirm := &widget.Button{ + Text: lang.L("Yes"), Icon: theme.ConfirmIcon(), Importance: widget.HighImportance, + OnTapped: func() { + d.hideWithResponse(true) + }, + } + d.create(container.NewGridWithColumns(2, d.dismiss, confirm)) + + return &ConfirmDialog{dialog: d, confirm: confirm} +} + +// ShowConfirm shows a dialog over the specified window for a user +// confirmation. The title is used for the dialog window and message is the content. +// The callback is executed when the user decides. +func ShowConfirm(title, message string, callback func(bool), parent fyne.Window) { + NewConfirm(title, message, callback, parent).Show() +} diff --git a/vendor/fyne.io/fyne/v2/dialog/custom.go b/vendor/fyne.io/fyne/v2/dialog/custom.go new file mode 100644 index 0000000..f54ddb1 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/dialog/custom.go @@ -0,0 +1,107 @@ +package dialog + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +var _ Dialog = (*CustomDialog)(nil) + +// CustomDialog implements a custom dialog. +// +// Since: 2.4 +type CustomDialog struct { + *dialog +} + +// NewCustom creates and returns a dialog over the specified application using custom +// content. The button will have the dismiss text set. +// The MinSize() of the CanvasObject passed will be used to set the size of the window. +func NewCustom(title, dismiss string, content fyne.CanvasObject, parent fyne.Window) *CustomDialog { + d := &dialog{content: content, title: title, parent: parent} + + d.dismiss = &widget.Button{Text: dismiss, OnTapped: d.Hide} + d.create(container.NewGridWithColumns(1, d.dismiss)) + + return &CustomDialog{dialog: d} +} + +// ShowCustom shows a dialog over the specified application using custom +// content. The button will have the dismiss text set. +// The MinSize() of the CanvasObject passed will be used to set the size of the window. +func ShowCustom(title, dismiss string, content fyne.CanvasObject, parent fyne.Window) { + NewCustom(title, dismiss, content, parent).Show() +} + +// NewCustomWithoutButtons creates a new custom dialog without any buttons. +// The MinSize() of the CanvasObject passed will be used to set the size of the window. +// +// Since: 2.4 +func NewCustomWithoutButtons(title string, content fyne.CanvasObject, parent fyne.Window) *CustomDialog { + d := &dialog{content: content, title: title, parent: parent} + d.create(container.NewGridWithColumns(1)) + + return &CustomDialog{dialog: d} +} + +// SetButtons sets the row of buttons at the bottom of the dialog. +// Passing an empty slice will result in a dialog with no buttons. +// +// Since: 2.4 +func (d *CustomDialog) SetButtons(buttons []fyne.CanvasObject) { + d.dismiss = nil // New button row invalidates possible dismiss button. + d.setButtons(container.NewGridWithRows(1, buttons...)) +} + +// SetIcon sets an icon to be shown in the top right of the dialog. +// Passing a nil resource will remove the icon from the dialog. +// +// Since: 2.6 +func (d *CustomDialog) SetIcon(icon fyne.Resource) { + d.setIcon(icon) +} + +// ShowCustomWithoutButtons shows a dialog, without buttons, over the specified application +// using custom content. +// The MinSize() of the CanvasObject passed will be used to set the size of the window. +// +// Since: 2.4 +func ShowCustomWithoutButtons(title string, content fyne.CanvasObject, parent fyne.Window) { + NewCustomWithoutButtons(title, content, parent).Show() +} + +// NewCustomConfirm creates and returns a dialog over the specified application using +// custom content. The cancel button will have the dismiss text set and the "OK" will +// use the confirm text. The response callback is called on user action. +// The MinSize() of the CanvasObject passed will be used to set the size of the window. +func NewCustomConfirm(title, confirm, dismiss string, content fyne.CanvasObject, + callback func(bool), parent fyne.Window, +) *ConfirmDialog { + d := &dialog{content: content, title: title, parent: parent, callback: callback} + + d.dismiss = &widget.Button{ + Text: dismiss, Icon: theme.CancelIcon(), + OnTapped: d.Hide, + } + ok := &widget.Button{ + Text: confirm, Icon: theme.ConfirmIcon(), Importance: widget.HighImportance, + OnTapped: func() { + d.hideWithResponse(true) + }, + } + d.create(container.NewGridWithColumns(2, d.dismiss, ok)) + + return &ConfirmDialog{dialog: d, confirm: ok} +} + +// ShowCustomConfirm shows a dialog over the specified application using custom +// content. The cancel button will have the dismiss text set and the "OK" will use +// the confirm text. The response callback is called on user action. +// The MinSize() of the CanvasObject passed will be used to set the size of the window. +func ShowCustomConfirm(title, confirm, dismiss string, content fyne.CanvasObject, + callback func(bool), parent fyne.Window, +) { + NewCustomConfirm(title, confirm, dismiss, content, callback, parent).Show() +} diff --git a/vendor/fyne.io/fyne/v2/dialog/entry.go b/vendor/fyne.io/fyne/v2/dialog/entry.go new file mode 100644 index 0000000..3f5c542 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/dialog/entry.go @@ -0,0 +1,75 @@ +package dialog + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/lang" + "fyne.io/fyne/v2/widget" +) + +// EntryDialog is a variation of a dialog which prompts the user to enter some text. +// +// Deprecated: Use dialog.NewForm() or dialog.ShowForm() with a widget.Entry inside instead. +type EntryDialog struct { + *FormDialog + + entry *widget.Entry + + onClosed func() +} + +// SetText changes the current text value of the entry dialog, this can +// be useful for setting a default value. +func (i *EntryDialog) SetText(s string) { + i.entry.SetText(s) +} + +// SetPlaceholder defines the placeholder text for the entry +func (i *EntryDialog) SetPlaceholder(s string) { + i.entry.SetPlaceHolder(s) +} + +// SetOnClosed changes the callback which is run when the dialog is closed, +// which is nil by default. +// +// The callback is called unconditionally whether the user confirms or cancels. +// +// Note that the callback will be called after onConfirm, if both are non-nil. +// This way onConfirm can potential modify state that this callback needs to +// get the user input when the user confirms, while also being able to handle +// the case where the user cancelled. +func (i *EntryDialog) SetOnClosed(callback func()) { + i.onClosed = callback +} + +// NewEntryDialog creates a dialog over the specified window for the user to enter a value. +// +// onConfirm is a callback that runs when the user enters a string of +// text and clicks the "confirm" button. May be nil. +// +// Deprecated: Use dialog.NewForm() with a widget.Entry inside instead. +func NewEntryDialog(title, message string, onConfirm func(string), parent fyne.Window) *EntryDialog { + i := &EntryDialog{entry: widget.NewEntry()} + items := []*widget.FormItem{widget.NewFormItem(message, i.entry)} + i.FormDialog = NewForm(title, lang.L("OK"), lang.L("Cancel"), items, func(ok bool) { + // User has confirmed and entered an input + if ok && onConfirm != nil { + onConfirm(i.entry.Text) + } + + if i.onClosed != nil { + i.onClosed() + } + + i.entry.Text = "" + i.win.Hide() // Close directly without executing the callback. This is the callback. + }, parent) + + return i +} + +// ShowEntryDialog creates a new entry dialog and shows it immediately. +// +// Deprecated: Use dialog.ShowForm() with a widget.Entry inside instead. +func ShowEntryDialog(title, message string, onConfirm func(string), parent fyne.Window) { + NewEntryDialog(title, message, onConfirm, parent).Show() +} diff --git a/vendor/fyne.io/fyne/v2/dialog/file.go b/vendor/fyne.io/fyne/v2/dialog/file.go new file mode 100644 index 0000000..d1cbef2 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/dialog/file.go @@ -0,0 +1,991 @@ +package dialog + +import ( + "errors" + "fmt" + "os" + "path/filepath" + "runtime" + "sort" + "strings" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/lang" + "fyne.io/fyne/v2/storage" + "fyne.io/fyne/v2/storage/repository" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +// ViewLayout can be passed to SetView() to set the view of +// a FileDialog +// +// Since: 2.5 +type ViewLayout int + +const ( + defaultView ViewLayout = iota + ListView + GridView +) + +const ( + viewLayoutKey = "fyne:fileDialogViewLayout" + lastFolderKey = "fyne:fileDialogLastFolder" +) + +type textWidget interface { + fyne.Widget + SetText(string) +} + +type favoriteItem struct { + locName string + locIcon fyne.Resource + loc fyne.URI +} + +type fileDialogPanel interface { + fyne.Widget + + Unselect(int) +} + +type fileDialog struct { + file *FileDialog + fileName textWidget + title *widget.Label + dismiss *widget.Button + open *widget.Button + breadcrumb *fyne.Container + breadcrumbScroll *container.Scroll + files fileDialogPanel + filesScroll *container.Scroll + favorites []favoriteItem + favoritesList *widget.List + showHidden bool + + view ViewLayout + + data []fyne.URI + + win *widget.PopUp + selected fyne.URI + selectedID int + dir fyne.ListableURI + // this will be the initial filename in a FileDialog in save mode + initialFileName string + + toggleViewButton *widget.Button +} + +// FileDialog is a dialog containing a file picker for use in opening or saving files. +type FileDialog struct { + callback any + onClosedCallback func(bool) + parent fyne.Window + dialog *fileDialog + + titleText string + confirmText, dismissText string + desiredSize fyne.Size + filter storage.FileFilter + save bool + // this will be applied to dialog.dir when it's loaded + startingLocation fyne.ListableURI + // this will be the initial filename in a FileDialog in save mode + initialFileName string + // this will be the initial view in a FileDialog + initialView ViewLayout +} + +// Declare conformity to Dialog interface +var _ Dialog = (*FileDialog)(nil) + +func (f *fileDialog) makeUI() fyne.CanvasObject { + if f.file.save { + saveName := widget.NewEntry() + saveName.OnChanged = func(s string) { + if s == "" { + f.open.Disable() + } else { + f.open.Enable() + } + } + saveName.SetPlaceHolder(lang.L("Enter filename")) + saveName.OnSubmitted = func(s string) { + f.open.OnTapped() + } + f.fileName = saveName + } else { + f.fileName = widget.NewLabel("") + } + + label := lang.L("Open") + if f.file.save { + label = lang.L("Save") + } + if f.file.confirmText != "" { + label = f.file.confirmText + } + f.open = f.makeOpenButton(label) + + if f.file.save { + f.fileName.SetText(f.initialFileName) + } + + dismissLabel := lang.L("Cancel") + if f.file.dismissText != "" { + dismissLabel = f.file.dismissText + } + f.dismiss = f.makeDismissButton(dismissLabel) + + buttons := container.NewGridWithRows(1, f.dismiss, f.open) + + f.filesScroll = container.NewScroll(nil) // filesScroll's content will be set by setView function. + verticalExtra := float32(float64(fileIconSize) * 0.25) + itemMin := f.newFileItem(storage.NewFileURI("filename.txt"), false, false).MinSize() + f.filesScroll.SetMinSize(itemMin.AddWidthHeight(itemMin.Width+theme.Padding()*3, verticalExtra)) + + f.breadcrumb = container.NewHBox() + f.breadcrumbScroll = container.NewHScroll(container.NewPadded(f.breadcrumb)) + title := label + " " + lang.L("File") + if f.file.isDirectory() { + title = label + " " + lang.L("Folder") + } + if f.file.titleText != "" { + title = f.file.titleText + } + f.title = widget.NewLabelWithStyle(title, fyne.TextAlignLeading, fyne.TextStyle{Bold: true}) + + view := ViewLayout(fyne.CurrentApp().Preferences().Int(viewLayoutKey)) + + // handle invalid values + if view != GridView && view != ListView { + view = defaultView + } + + if view == defaultView { + // set GridView as default + view = GridView + + if f.file.initialView != defaultView { + view = f.file.initialView + } + } + + // icon of button is set in subsequent setView() call + f.toggleViewButton = widget.NewButtonWithIcon("", nil, func() { + if f.view == GridView { + f.setView(ListView) + } else { + f.setView(GridView) + } + }) + f.setView(view) + + f.loadFavorites() + + f.favoritesList = widget.NewList( + func() int { + return len(f.favorites) + }, + func() fyne.CanvasObject { + return container.NewHBox(container.New(&iconPaddingLayout{}, widget.NewIcon(theme.DocumentIcon())), widget.NewLabel("Template Object")) + }, + func(id widget.ListItemID, item fyne.CanvasObject) { + item.(*fyne.Container).Objects[0].(*fyne.Container).Objects[0].(*widget.Icon).SetResource(f.favorites[id].locIcon) + item.(*fyne.Container).Objects[1].(*widget.Label).SetText(f.favorites[id].locName) + }, + ) + f.favoritesList.OnSelected = func(id widget.ListItemID) { + f.setLocation(f.favorites[id].loc) + } + + var optionsButton *widget.Button + optionsButton = widget.NewButtonWithIcon("", theme.SettingsIcon(), func() { + f.optionsMenu(fyne.CurrentApp().Driver().AbsolutePositionForObject(optionsButton), optionsButton.Size()) + }) + + newFolderButton := widget.NewButtonWithIcon("", theme.FolderNewIcon(), func() { + newFolderEntry := widget.NewEntry() + ShowForm(lang.L("New Folder"), lang.L("Create Folder"), lang.L("Cancel"), []*widget.FormItem{ + { + Text: lang.X("file.name", "Name"), + Widget: newFolderEntry, + }, + }, func(s bool) { + if !s || newFolderEntry.Text == "" { + return + } + + newFolderPath := filepath.Join(f.dir.Path(), newFolderEntry.Text) + createFolderErr := os.MkdirAll(newFolderPath, 0o750) + if createFolderErr != nil { + fyne.LogError( + fmt.Sprintf("Failed to create folder with path %s", newFolderPath), + createFolderErr, + ) + ShowError(errors.New("folder cannot be created"), f.file.parent) + } + f.refreshDir(f.dir) + }, f.file.parent) + }) + + optionsbuttons := container.NewHBox( + newFolderButton, + f.toggleViewButton, + optionsButton, + ) + + header := container.NewBorder(nil, nil, nil, optionsbuttons, + f.title, + ) + + footer := container.NewBorder(nil, nil, nil, buttons, + container.NewHScroll(f.fileName), + ) + + body := container.NewHSplit( + f.favoritesList, + container.NewBorder(f.breadcrumbScroll, nil, nil, nil, + f.filesScroll, + ), + ) + body.SetOffset(0) // Set the minimum offset so that the favoritesList takes only its minimal width + + return container.NewBorder(header, footer, nil, nil, body) +} + +func (f *fileDialog) makeOpenButton(label string) *widget.Button { + btn := widget.NewButton(label, func() { + if f.file.callback == nil { + f.win.Hide() + if f.file.onClosedCallback != nil { + f.file.onClosedCallback(false) + } + return + } + + if f.file.save { + callback := f.file.callback.(func(fyne.URIWriteCloser, error)) + name := f.fileName.(*widget.Entry).Text + location, _ := storage.Child(f.dir, name) + + exists, _ := storage.Exists(location) + if !exists { + f.win.Hide() + if f.file.onClosedCallback != nil { + f.file.onClosedCallback(true) + } + callback(storage.Writer(location)) + return + } + + listable, err := storage.CanList(location) + if err == nil && listable { + ShowInformation("Cannot overwrite", + "Files cannot replace a directory,\ncheck the file name and try again", f.file.parent) + return + } + + ShowConfirm("Overwrite?", "Are you sure you want to overwrite the file\n"+name+"?", + func(ok bool) { + if !ok { + return + } + f.win.Hide() + + callback(storage.Writer(location)) + if f.file.onClosedCallback != nil { + f.file.onClosedCallback(true) + } + }, f.file.parent) + } else if f.selected != nil { + callback := f.file.callback.(func(fyne.URIReadCloser, error)) + f.win.Hide() + if f.file.onClosedCallback != nil { + f.file.onClosedCallback(true) + } + callback(storage.Reader(f.selected)) + } else if f.file.isDirectory() { + callback := f.file.callback.(func(fyne.ListableURI, error)) + f.win.Hide() + if f.file.onClosedCallback != nil { + f.file.onClosedCallback(true) + } + callback(f.dir, nil) + } + }) + + btn.Importance = widget.HighImportance + btn.Disable() + + return btn +} + +func (f *fileDialog) makeDismissButton(label string) *widget.Button { + btn := widget.NewButton(label, func() { + f.win.Hide() + if f.file.onClosedCallback != nil { + f.file.onClosedCallback(false) + } + if f.file.callback != nil { + if f.file.save { + f.file.callback.(func(fyne.URIWriteCloser, error))(nil, nil) + } else if f.file.isDirectory() { + f.file.callback.(func(fyne.ListableURI, error))(nil, nil) + } else { + f.file.callback.(func(fyne.URIReadCloser, error))(nil, nil) + } + } + }) + + return btn +} + +func (f *fileDialog) optionsMenu(position fyne.Position, buttonSize fyne.Size) { + hiddenFiles := widget.NewCheck(lang.L("Show Hidden Files"), func(changed bool) { + f.showHidden = changed + f.refreshDir(f.dir) + }) + hiddenFiles.Checked = f.showHidden + hiddenFiles.Refresh() + content := container.NewVBox(hiddenFiles) + + p := position.Add(buttonSize) + pos := fyne.NewPos(p.X-content.MinSize().Width-theme.Padding()*2, p.Y+theme.Padding()*2) + widget.ShowPopUpAtPosition(content, f.win.Canvas, pos) +} + +func getFavoriteLocations() (map[string]fyne.ListableURI, error) { + if runtime.GOOS == "js" { + return make(map[string]fyne.ListableURI), nil + } + + homeDir, err := os.UserHomeDir() + if err != nil { + return nil, err + } + homeURI := storage.NewFileURI(homeDir) + home, _ := storage.ListerForURI(homeURI) + + favoriteLocations := map[string]fyne.ListableURI{"Home": home} + for _, favName := range getFavoritesOrder() { + uri, err1 := getFavoriteLocation(homeURI, favName) + if err != nil { + err = err1 + continue + } + + listURI, err1 := storage.ListerForURI(uri) + if err1 != nil { + err = err1 + continue + } + favoriteLocations[favName] = listURI + } + + return favoriteLocations, err +} + +func (f *fileDialog) loadFavorites() { + favoriteLocations, err := getFavoriteLocations() + if err != nil { + fyne.LogError("Getting favorite locations", err) + } + + f.favorites = []favoriteItem{ + {locName: "Home", locIcon: theme.HomeIcon(), loc: favoriteLocations["Home"]}, + } + app := fyne.CurrentApp() + if hasAppFiles(app) { + f.favorites = append(f.favorites, + favoriteItem{locName: "App Files", locIcon: theme.FileIcon(), loc: storageURI(app)}) + } + f.favorites = append(f.favorites, f.getPlaces()...) + + for _, locName := range getFavoritesOrder() { + loc, ok := favoriteLocations[locName] + if !ok { + continue + } + locIcon := getFavoritesIcon(locName) + f.favorites = append(f.favorites, + favoriteItem{locName: locName, locIcon: locIcon, loc: loc}) + } +} + +func (f *fileDialog) refreshDir(dir fyne.ListableURI) { + f.data = nil + + files, err := dir.List() + if err != nil { + fyne.LogError("Unable to read ListableURI "+dir.String(), err) + return + } + + var icons []fyne.URI + parent, err := storage.Parent(dir) + if err != nil && err != repository.ErrURIRoot { + fyne.LogError("Unable to get parent of "+dir.String(), err) + return + } + if parent != nil && parent.String() != dir.String() { + icons = append(icons, parent) + } + + for _, file := range files { + if !f.showHidden && isHidden(file) { + continue + } + + listable, err := storage.ListerForURI(file) + if f.file.isDirectory() && err != nil { + continue + } else if err == nil { // URI points to a directory + icons = append(icons, listable) + } else if f.file.filter == nil || f.file.filter.Matches(file) { + icons = append(icons, file) + } + } + + toSort := icons + if parent != nil { + toSort = icons[1:] + } + sort.Slice(toSort, func(i, j int) bool { + if parent != nil { // avoiding the parent in [0] + i++ + j++ + } + + return strings.ToLower(icons[i].Name()) < strings.ToLower(icons[j].Name()) + }) + f.data = icons + + f.files.Refresh() + f.filesScroll.Offset = fyne.NewPos(0, 0) + f.filesScroll.Refresh() +} + +func (f *fileDialog) setLocation(dir fyne.URI) error { + if dir == nil { + return errors.New("failed to open nil directory") + } + + if f.selectedID > -1 { + f.files.Unselect(f.selectedID) + } + + list, err := storage.ListerForURI(dir) + if err != nil { + return err + } + + fyne.CurrentApp().Preferences().SetString(lastFolderKey, dir.String()) + isFav := false + for i, fav := range f.favorites { + if storage.EqualURI(fav.loc, dir) { + f.favoritesList.Select(i) + isFav = true + break + } + } + if !isFav { + f.favoritesList.UnselectAll() + } + + f.setSelected(nil, -1) + f.dir = list + + f.breadcrumb.Objects = nil + for parent := dir; parent != nil && err == nil; parent, err = storage.Parent(parent) { + currentParent := parent + f.breadcrumb.Add( + widget.NewButton(currentParent.Name(), func() { + err := f.setLocation(currentParent) + if err != nil { + fyne.LogError("Failed to set directory", err) + } + }), + ) + } + + // Use slices.Reverse with Go 1.21: + objects := f.breadcrumb.Objects + for i, j := 0, len(objects)-1; i < j; i, j = i+1, j-1 { + objects[i], objects[j] = objects[j], objects[i] + } + + f.breadcrumbScroll.Refresh() + f.breadcrumbScroll.Offset.X = f.breadcrumbScroll.Content.Size().Width - f.breadcrumbScroll.Size().Width + f.breadcrumbScroll.Refresh() + + if f.file.isDirectory() { + f.fileName.SetText(dir.Name()) + f.open.Enable() + } + f.refreshDir(list) + + return nil +} + +func (f *fileDialog) setSelected(file fyne.URI, id int) { + if file != nil { + if listable, err := storage.CanList(file); err == nil && listable { + f.setLocation(file) + return + } + } + f.selected = file + f.selectedID = id + + if file == nil || file.Path() == "" { + // keep user input while navigating + // in a FileSave dialog + if !f.file.save { + f.fileName.SetText("") + f.open.Disable() + } + } else { + f.fileName.SetText(file.Name()) + f.open.Enable() + } +} + +func (f *fileDialog) setView(view ViewLayout) { + f.view = view + fyne.CurrentApp().Preferences().SetInt(viewLayoutKey, int(view)) + var selectF func(id int) + choose := func(id int) { + if file, ok := f.getDataItem(id); ok { + f.selectedID = id + f.setSelected(file, id) + } + } + count := func() int { + return len(f.data) + } + template := func() fyne.CanvasObject { + return f.newFileItem(storage.NewFileURI("./tempfile"), true, false) + } + update := func(id widget.GridWrapItemID, o fyne.CanvasObject) { + if dir, ok := f.getDataItem(id); ok { + parent := id == 0 && len(dir.Path()) < len(f.dir.Path()) + _, isDir := dir.(fyne.ListableURI) + o.(*fileDialogItem).setLocation(dir, isDir || parent, parent) + o.(*fileDialogItem).choose = selectF + o.(*fileDialogItem).id = id + o.(*fileDialogItem).open = f.open.OnTapped + } + } + // Actually, during the real interaction, the OnSelected won't be called. + // It will be called only when we directly calls container.select(i) + if f.view == GridView { + grid := widget.NewGridWrap(count, template, update) + grid.OnSelected = choose + f.files = grid + f.toggleViewButton.SetIcon(theme.ListIcon()) + selectF = grid.Select + } else { + list := widget.NewList(count, template, update) + list.OnSelected = choose + f.files = list + f.toggleViewButton.SetIcon(theme.GridIcon()) + selectF = list.Select + } + + if f.dir != nil { + f.refreshDir(f.dir) + } + f.filesScroll.Content = container.NewPadded(f.files) + f.filesScroll.Refresh() +} + +func (f *fileDialog) getDataItem(id int) (fyne.URI, bool) { + if id >= len(f.data) { + return nil, false + } + + return f.data[id], true +} + +// effectiveStartingDir calculates the directory at which the file dialog should +// open, based on the values of startingDirectory, CWD, home, and any error +// conditions which occur. +// +// Order of precedence is: +// +// - file.startingDirectory if non-empty, os.Stat()-able, and uses the file:// +// URI scheme +// - previously used file open/close folder within this app +// - the current app's document storage, if App.Storage() documents have been saved +// - os.UserHomeDir() +// - os.Getwd() +// - "/" (should be filesystem root on all supported platforms) +func (f *FileDialog) effectiveStartingDir() fyne.ListableURI { + if f.startingLocation != nil { + if f.startingLocation.Scheme() == "file" { + path := f.startingLocation.Path() + + // the starting directory is set explicitly + if _, err := os.Stat(path); err != nil { + fyne.LogError("Error with StartingLocation", err) + } else { + return f.startingLocation + } + } + return f.startingLocation + } + + // last used + lastPath := fyne.CurrentApp().Preferences().String(lastFolderKey) + if lastPath != "" { + parsed, err := storage.ParseURI(lastPath) + if err == nil { + dir, err := storage.ListerForURI(parsed) + if err == nil { + return dir + } + } + } + + // Try app storage + app := fyne.CurrentApp() + if hasAppFiles(app) { + list, _ := storage.ListerForURI(storageURI(app)) + return list + } + + // Try home dir + dir, err := os.UserHomeDir() + if err == nil { + lister, err := storage.ListerForURI(storage.NewFileURI(dir)) + if err == nil { + return lister + } + fyne.LogError("Could not create lister for user home dir", err) + } + fyne.LogError("Could not load user home dir", err) + + // Try to get ./ + wd, err := os.Getwd() + if err == nil { + lister, err := storage.ListerForURI(storage.NewFileURI(wd)) + if err == nil { + return lister + } + fyne.LogError("Could not create lister for working dir", err) + } + + lister, err := storage.ListerForURI(storage.NewFileURI("/")) + if err != nil { + fyne.LogError("could not create lister for /", err) + return nil + } + return lister +} + +func showFile(file *FileDialog) *fileDialog { + d := &fileDialog{file: file, initialFileName: file.initialFileName, view: GridView} + ui := d.makeUI() + pad := theme.Padding() + itemMin := d.newFileItem(storage.NewFileURI("filename.txt"), false, false).MinSize() + size := ui.MinSize().Add(itemMin.AddWidthHeight(itemMin.Width+pad*4, pad*2)) + + d.win = widget.NewModalPopUp(ui, file.parent.Canvas()) + d.win.Resize(size) + + d.setLocation(file.effectiveStartingDir()) + d.win.Show() + if file.save { + d.win.Canvas.Focus(d.fileName.(*widget.Entry)) + } + return d +} + +// Dismiss instructs the dialog to close without any affirmative action. +// +// Since: 2.6 +func (f *FileDialog) Dismiss() { + f.dialog.dismiss.OnTapped() +} + +// MinSize returns the size that this dialog should not shrink below +// +// Since: 2.1 +func (f *FileDialog) MinSize() fyne.Size { + return f.dialog.win.MinSize() +} + +// Show shows the file dialog. +func (f *FileDialog) Show() { + if f.save { + if fileSaveOSOverride(f) { + return + } + } else { + if fileOpenOSOverride(f) { + return + } + } + if f.dialog != nil { + f.dialog.win.Show() + return + } + f.dialog = showFile(f) + if !f.desiredSize.IsZero() { + f.Resize(f.desiredSize) + } +} + +// Refresh causes this dialog to be updated +func (f *FileDialog) Refresh() { + f.dialog.win.Refresh() +} + +// Resize dialog to the requested size, if there is sufficient space. +// If the parent window is not large enough then the size will be reduced to fit. +func (f *FileDialog) Resize(size fyne.Size) { + f.desiredSize = size + if f.dialog == nil { + return + } + f.dialog.win.Resize(size) +} + +// Hide hides the file dialog. +func (f *FileDialog) Hide() { + if f.dialog == nil { + return + } + f.dialog.win.Hide() + if f.onClosedCallback != nil { + f.onClosedCallback(false) + } +} + +// SetConfirmText allows custom text to be set in the confirmation button +// +// Since: 2.2 +func (f *FileDialog) SetConfirmText(label string) { + f.confirmText = label + if f.dialog == nil { + return + } + f.dialog.open.SetText(label) + f.dialog.win.Refresh() +} + +// SetDismissText allows custom text to be set in the dismiss button +func (f *FileDialog) SetDismissText(label string) { + f.dismissText = label + if f.dialog == nil { + return + } + f.dialog.dismiss.SetText(label) + f.dialog.win.Refresh() +} + +// SetTitleText allows custom text to be set in the dialog title +// +// Since: 2.6 +func (f *FileDialog) SetTitleText(label string) { + f.titleText = label + if f.dialog == nil { + return + } + f.dialog.title.SetText(label) +} + +// SetLocation tells this FileDialog which location to display. +// This is normally called before the dialog is shown. +// +// Since: 1.4 +func (f *FileDialog) SetLocation(u fyne.ListableURI) { + f.startingLocation = u + if f.dialog != nil { + f.dialog.setLocation(u) + } +} + +// SetOnClosed sets a callback function that is called when +// the dialog is closed. +func (f *FileDialog) SetOnClosed(closed func()) { + // If there is already a callback set, remember it and call both. + originalCallback := f.onClosedCallback + + f.onClosedCallback = func(response bool) { + if f.dialog == nil { + return + } + if originalCallback != nil { + originalCallback(response) + } + closed() + } +} + +// SetFilter sets a filter for limiting files that can be chosen in the file dialog. +func (f *FileDialog) SetFilter(filter storage.FileFilter) { + if f.isDirectory() { + fyne.LogError("Cannot set a filter for a folder dialog", nil) + return + } + f.filter = filter + if f.dialog != nil { + f.dialog.refreshDir(f.dialog.dir) + } +} + +// SetFileName sets the filename in a FileDialog in save mode. +// This is normally called before the dialog is shown. +func (f *FileDialog) SetFileName(fileName string) { + if f.save { + f.initialFileName = fileName + // Update entry if fileDialog has already been created + if f.dialog != nil { + f.dialog.fileName.SetText(fileName) + } + } +} + +// SetView changes the default display view of the FileDialog +// This is normally called before the dialog is shown. +// +// Since: 2.5 +func (f *FileDialog) SetView(v ViewLayout) { + f.initialView = v + if f.dialog != nil { + f.dialog.setView(v) + } +} + +// NewFileOpen creates a file dialog allowing the user to choose a file to open. +// +// The callback function will run when the dialog closes and provide a reader for the chosen file. +// The reader will be nil when the user cancels or when nothing is selected. +// When the reader isn't nil it must be closed by the callback. +// +// The dialog will appear over the window specified when Show() is called. +func NewFileOpen(callback func(reader fyne.URIReadCloser, err error), parent fyne.Window) *FileDialog { + dialog := &FileDialog{callback: callback, parent: parent} + return dialog +} + +// NewFileSave creates a file dialog allowing the user to choose a file to save +// to (new or overwrite). If the user chooses an existing file they will be +// asked if they are sure. +// +// The callback function will run when the dialog closes and provide a writer for the chosen file. +// The writer will be nil when the user cancels or when nothing is selected. +// When the writer isn't nil it must be closed by the callback. +// +// The dialog will appear over the window specified when Show() is called. +func NewFileSave(callback func(writer fyne.URIWriteCloser, err error), parent fyne.Window) *FileDialog { + dialog := &FileDialog{callback: callback, parent: parent, save: true} + return dialog +} + +// ShowFileOpen creates and shows a file dialog allowing the user to choose a +// file to open. +// +// The callback function will run when the dialog closes and provide a reader for the chosen file. +// The reader will be nil when the user cancels or when nothing is selected. +// When the reader isn't nil it must be closed by the callback. +// +// The dialog will appear over the window specified. +func ShowFileOpen(callback func(reader fyne.URIReadCloser, err error), parent fyne.Window) { + dialog := NewFileOpen(callback, parent) + if fileOpenOSOverride(dialog) { + return + } + dialog.Show() +} + +// ShowFileSave creates and shows a file dialog allowing the user to choose a +// file to save to (new or overwrite). If the user chooses an existing file they +// will be asked if they are sure. +// +// The callback function will run when the dialog closes and provide a writer for the chosen file. +// The writer will be nil when the user cancels or when nothing is selected. +// When the writer isn't nil it must be closed by the callback. +// +// The dialog will appear over the window specified. +func ShowFileSave(callback func(writer fyne.URIWriteCloser, err error), parent fyne.Window) { + dialog := NewFileSave(callback, parent) + if fileSaveOSOverride(dialog) { + return + } + dialog.Show() +} + +func getFavoritesIcon(location string) fyne.Resource { + switch location { + case "Documents": + return theme.DocumentIcon() + case "Desktop": + return theme.DesktopIcon() + case "Downloads": + return theme.DownloadIcon() + case "Music": + return theme.MediaMusicIcon() + case "Pictures": + return theme.MediaPhotoIcon() + case "Videos": + return theme.MediaVideoIcon() + } + + if (runtime.GOOS == "darwin" && location == "Movies") || + (runtime.GOOS != "darwin" && location == "Videos") { + return theme.MediaVideoIcon() + } + + return nil +} + +func getFavoritesOrder() [6]string { + order := [6]string{ + "Desktop", + "Documents", + "Downloads", + "Music", + "Pictures", + "Videos", + } + + if runtime.GOOS == "darwin" { + order[5] = "Movies" + } + + return order +} + +func hasAppFiles(a fyne.App) bool { + if a.UniqueID() == "testApp" { + return false + } + + return len(a.Storage().List()) > 0 +} + +func storageURI(a fyne.App) fyne.URI { + dir, _ := storage.Child(a.Storage().RootURI(), "Documents") + return dir +} + +// iconPaddingLayout adds padding to the left of a widget.Icon(). +// NOTE: It assumes that the slice only contains one item. +type iconPaddingLayout struct{} + +func (i *iconPaddingLayout) Layout(objects []fyne.CanvasObject, size fyne.Size) { + padding := theme.Padding() * 2 + objects[0].Move(fyne.NewPos(padding, 0)) + objects[0].Resize(size.SubtractWidthHeight(padding, 0)) +} + +func (i *iconPaddingLayout) MinSize(objects []fyne.CanvasObject) fyne.Size { + return objects[0].MinSize().AddWidthHeight(theme.Padding()*2, 0) +} diff --git a/vendor/fyne.io/fyne/v2/dialog/file_darwin.go b/vendor/fyne.io/fyne/v2/dialog/file_darwin.go new file mode 100644 index 0000000..7bab6ed --- /dev/null +++ b/vendor/fyne.io/fyne/v2/dialog/file_darwin.go @@ -0,0 +1,12 @@ +//go:build !ios && !android && !wasm && !js + +package dialog + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/storage" +) + +func getFavoriteLocation(homeURI fyne.URI, name string) (fyne.URI, error) { + return storage.Child(homeURI, name) +} diff --git a/vendor/fyne.io/fyne/v2/dialog/file_mobile.go b/vendor/fyne.io/fyne/v2/dialog/file_mobile.go new file mode 100644 index 0000000..e05cf05 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/dialog/file_mobile.go @@ -0,0 +1,43 @@ +//go:build ios || android + +package dialog + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/driver/mobile" + "fyne.io/fyne/v2/storage" +) + +func (f *fileDialog) getPlaces() []favoriteItem { + return []favoriteItem{} +} + +func isHidden(file fyne.URI) bool { + if file.Scheme() != "file" { + fyne.LogError("Cannot check if non file is hidden", nil) + return false + } + return false +} + +func hideFile(filename string) error { + return nil +} + +func fileOpenOSOverride(f *FileDialog) bool { + if f.isDirectory() { + mobile.ShowFolderOpenPicker(f.callback.(func(fyne.ListableURI, error))) + } else { + mobile.ShowFileOpenPicker(f.callback.(func(fyne.URIReadCloser, error)), f.filter) + } + return true +} + +func fileSaveOSOverride(f *FileDialog) bool { + mobile.ShowFileSavePicker(f.callback.(func(fyne.URIWriteCloser, error)), f.filter, f.initialFileName) + return true +} + +func getFavoriteLocation(homeURI fyne.URI, name string) (fyne.URI, error) { + return storage.Child(homeURI, name) +} diff --git a/vendor/fyne.io/fyne/v2/dialog/file_tamago.go b/vendor/fyne.io/fyne/v2/dialog/file_tamago.go new file mode 100644 index 0000000..786080e --- /dev/null +++ b/vendor/fyne.io/fyne/v2/dialog/file_tamago.go @@ -0,0 +1,9 @@ +//go:build tamago || noos + +package dialog + +import "fyne.io/fyne/v2" + +func getFavoriteLocations() (map[string]fyne.ListableURI, error) { + return map[string]fyne.ListableURI{}, nil +} diff --git a/vendor/fyne.io/fyne/v2/dialog/file_unix.go b/vendor/fyne.io/fyne/v2/dialog/file_unix.go new file mode 100644 index 0000000..d32bc50 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/dialog/file_unix.go @@ -0,0 +1,38 @@ +//go:build !windows && !android && !ios && !wasm && !js + +package dialog + +import ( + "path/filepath" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/storage" + "fyne.io/fyne/v2/theme" +) + +func (f *fileDialog) getPlaces() []favoriteItem { + lister, err := storage.ListerForURI(storage.NewFileURI("/")) + if err != nil { + fyne.LogError("could not create lister for /", err) + return []favoriteItem{} + } + return []favoriteItem{{ + "Computer", + theme.ComputerIcon(), + lister, + }} +} + +func isHidden(file fyne.URI) bool { + if file.Scheme() != "file" { + fyne.LogError("Cannot check if non file is hidden", nil) + return false + } + + name := filepath.Base(file.Path()) + return name == "" || name[0] == '.' +} + +func hideFile(_ string) error { + return nil +} diff --git a/vendor/fyne.io/fyne/v2/dialog/file_wasm.go b/vendor/fyne.io/fyne/v2/dialog/file_wasm.go new file mode 100644 index 0000000..bbd55dd --- /dev/null +++ b/vendor/fyne.io/fyne/v2/dialog/file_wasm.go @@ -0,0 +1,33 @@ +//go:build wasm || js + +package dialog + +import ( + "fyne.io/fyne/v2" +) + +func (f *fileDialog) loadPlaces() []fyne.CanvasObject { + return nil +} + +func isHidden(file fyne.URI) bool { + return false +} + +func fileOpenOSOverride(f *FileDialog) bool { + // TODO #2737 + return true +} + +func fileSaveOSOverride(f *FileDialog) bool { + // TODO #2738 + return true +} + +func (f *fileDialog) getPlaces() []favoriteItem { + return []favoriteItem{} +} + +func getFavoriteLocation(homeURI fyne.URI, name string) (fyne.URI, error) { + return nil, nil +} diff --git a/vendor/fyne.io/fyne/v2/dialog/file_windows.go b/vendor/fyne.io/fyne/v2/dialog/file_windows.go new file mode 100644 index 0000000..8f46ed7 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/dialog/file_windows.go @@ -0,0 +1,102 @@ +package dialog + +import ( + "os" + "syscall" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/storage" + "fyne.io/fyne/v2/theme" +) + +func driveMask() uint32 { + dll, err := syscall.LoadLibrary("kernel32.dll") + if err != nil { + fyne.LogError("Error loading kernel32.dll", err) + return 0 + } + handle, err := syscall.GetProcAddress(dll, "GetLogicalDrives") + if err != nil { + fyne.LogError("Could not find GetLogicalDrives call", err) + return 0 + } + + ret, _, err := syscall.SyscallN(uintptr(handle)) + if err != syscall.Errno(0) { // for some reason Syscall returns something not nil on success + fyne.LogError("Error calling GetLogicalDrives", err) + return 0 + } + + return uint32(ret) +} + +func listDrives() []string { + var drives []string + mask := driveMask() + + for i := 0; i < 26; i++ { + if mask&1 == 1 { + letter := string('A' + rune(i)) + drives = append(drives, letter+":") + } + mask >>= 1 + } + + return drives +} + +func (f *fileDialog) getPlaces() []favoriteItem { + drives := listDrives() + places := make([]favoriteItem, len(drives)) + for i, drive := range drives { + driveRoot := drive + string(os.PathSeparator) // capture loop var + driveRootURI, _ := storage.ListerForURI(storage.NewFileURI(driveRoot)) + places[i] = favoriteItem{ + drive, + theme.StorageIcon(), + driveRootURI, + } + } + return places +} + +func isHidden(file fyne.URI) bool { + if file.Scheme() != "file" { + fyne.LogError("Cannot check if non file is hidden", nil) + return false + } + + point, err := syscall.UTF16PtrFromString(file.Path()) + if err != nil { + fyne.LogError("Error making string pointer", err) + return false + } + attr, err := syscall.GetFileAttributes(point) + if err != nil { + fyne.LogError("Error getting file attributes", err) + return false + } + + return attr&syscall.FILE_ATTRIBUTE_HIDDEN != 0 +} + +func hideFile(filename string) (err error) { + // git does not preserve windows hidden flag so we have to set it. + filenameW, err := syscall.UTF16PtrFromString(filename) + if err != nil { + return err + } + return syscall.SetFileAttributes(filenameW, syscall.FILE_ATTRIBUTE_HIDDEN) +} + +func fileOpenOSOverride(*FileDialog) bool { + return false +} + +func fileSaveOSOverride(*FileDialog) bool { + return false +} + +func getFavoriteLocation(homeURI fyne.URI, name string) (fyne.URI, error) { + return storage.Child(homeURI, name) +} diff --git a/vendor/fyne.io/fyne/v2/dialog/file_xdg.go b/vendor/fyne.io/fyne/v2/dialog/file_xdg.go new file mode 100644 index 0000000..403ef88 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/dialog/file_xdg.go @@ -0,0 +1,37 @@ +//go:build (linux || openbsd || freebsd || netbsd) && !android && !wasm && !js && !tamago && !noos + +package dialog + +import ( + "fmt" + "os/exec" + "strings" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/storage" +) + +func getFavoriteLocation(homeURI fyne.URI, name string) (fyne.URI, error) { + const cmdName = "xdg-user-dir" + if _, err := exec.LookPath(cmdName); err != nil { + return storage.Child(homeURI, name) // no lookup possible + } + + lookupName := strings.ToUpper(name) + cmd := exec.Command(cmdName, lookupName) + loc, err := cmd.Output() + if err != nil { + return storage.Child(homeURI, name) + } + + // Remove \n at the end + loc = loc[:len(loc)-1] + locURI := storage.NewFileURI(string(loc)) + + if strings.TrimRight(locURI.String(), "/") == strings.TrimRight(homeURI.String(), "/") { + fallback, _ := storage.Child(homeURI, name) + return fallback, fmt.Errorf("this computer does not define a %s folder", lookupName) + } + + return locURI, nil +} diff --git a/vendor/fyne.io/fyne/v2/dialog/file_xdg_flatpak.go b/vendor/fyne.io/fyne/v2/dialog/file_xdg_flatpak.go new file mode 100644 index 0000000..6f5e7ee --- /dev/null +++ b/vendor/fyne.io/fyne/v2/dialog/file_xdg_flatpak.go @@ -0,0 +1,189 @@ +//go:build flatpak && !windows && !android && !ios && !wasm && !js + +package dialog + +import ( + "strings" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/driver" + "fyne.io/fyne/v2/internal/build" + "fyne.io/fyne/v2/lang" + "fyne.io/fyne/v2/storage" + + "github.com/rymdport/portal" + "github.com/rymdport/portal/filechooser" +) + +func openFile(parentWindowHandle string, options *filechooser.OpenFileOptions) (fyne.URIReadCloser, error) { + title := lang.L("Open") + " " + lang.L("File") + uri, err := open(parentWindowHandle, title, options) + if err != nil || uri == nil { + return nil, err + } + + return storage.Reader(uri) +} + +func openFolder(parentWindowHandle string, options *filechooser.OpenFileOptions) (fyne.ListableURI, error) { + title := lang.L("Open") + " " + lang.L("Folder") + uri, err := open(parentWindowHandle, title, options) + if err != nil || uri == nil { + return nil, err + } + + return storage.ListerForURI(uri) +} + +func open(parentWindowHandle, title string, options *filechooser.OpenFileOptions) (fyne.URI, error) { + uris, err := filechooser.OpenFile(parentWindowHandle, title, options) + if err != nil { + return nil, err + } + + if len(uris) == 0 { + return nil, nil + } + + return storage.ParseURI(uris[0]) +} + +func saveFile(parentWindowHandle string, options *filechooser.SaveFileOptions) (fyne.URIWriteCloser, error) { + title := lang.L("Save") + " " + lang.L("File") + uris, err := filechooser.SaveFile(parentWindowHandle, title, options) + if err != nil { + return nil, err + } + + if len(uris) == 0 { + return nil, nil + } + + uri, err := storage.ParseURI(uris[0]) + if err != nil { + return nil, err + } + + return storage.Writer(uri) +} + +func fileOpenOSOverride(d *FileDialog) bool { + options := &filechooser.OpenFileOptions{ + Directory: d.isDirectory(), + AcceptLabel: d.confirmText, + } + if d.startingLocation != nil { + options.CurrentFolder = d.startingLocation.Path() + } + options.Filters, options.CurrentFilter = convertFilterForPortal(d.filter) + + windowHandle := windowHandleForPortal(d.parent) + + go func() { + if options.Directory { + folder, err := openFolder(windowHandle, options) + fyne.Do(func() { + folderCallback := d.callback.(func(fyne.ListableURI, error)) + folderCallback(folder, err) + }) + } else { + file, err := openFile(windowHandle, options) + fyne.Do(func() { + fileCallback := d.callback.(func(fyne.URIReadCloser, error)) + fileCallback(file, err) + }) + } + }() + + return true +} + +func fileSaveOSOverride(d *FileDialog) bool { + options := &filechooser.SaveFileOptions{ + AcceptLabel: d.confirmText, + CurrentName: d.initialFileName, + } + if d.startingLocation != nil { + options.CurrentFolder = d.startingLocation.Path() + } + options.Filters, options.CurrentFilter = convertFilterForPortal(d.filter) + + callback := d.callback.(func(fyne.URIWriteCloser, error)) + windowHandle := windowHandleForPortal(d.parent) + + go func() { + file, err := saveFile(windowHandle, options) + fyne.Do(func() { + callback(file, err) + }) + }() + + return true +} + +func windowHandleForPortal(window fyne.Window) string { + windowHandle := "" + if !build.IsWayland { + window.(driver.NativeWindow).RunNative(func(context any) { + handle := context.(driver.X11WindowContext).WindowHandle + windowHandle = portal.FormatX11WindowHandle(handle) + }) + } + + // TODO: We need to get the Wayland handle from the xdg_foreign protocol and convert to string on the form "wayland:{id}". + return windowHandle +} + +func convertFilterForPortal(fyneFilter storage.FileFilter) (list []*filechooser.Filter, current *filechooser.Filter) { + if fyneFilter == nil || fyneFilter == folderFilter { + return nil, nil + } + + if filter, ok := fyneFilter.(*storage.ExtensionFileFilter); ok { + rules := make([]filechooser.Rule, 0, 2*len(filter.Extensions)) + for _, ext := range filter.Extensions { + lowercase := filechooser.Rule{ + Type: filechooser.GlobPattern, + Pattern: "*" + strings.ToLower(ext), + } + uppercase := filechooser.Rule{ + Type: filechooser.GlobPattern, + Pattern: "*" + strings.ToUpper(ext), + } + rules = append(rules, lowercase, uppercase) + } + + name := formatFilterName(filter.Extensions, 3) + converted := &filechooser.Filter{Name: name, Rules: rules} + return []*filechooser.Filter{converted}, converted + } + + if filter, ok := fyneFilter.(*storage.MimeTypeFileFilter); ok { + rules := make([]filechooser.Rule, len(filter.MimeTypes)) + for i, mime := range filter.MimeTypes { + rules[i] = filechooser.Rule{ + Type: filechooser.MIMEType, + Pattern: mime, + } + } + + name := formatFilterName(filter.MimeTypes, 3) + converted := &filechooser.Filter{Name: name, Rules: rules} + return []*filechooser.Filter{converted}, converted + } + + return nil, nil +} + +func formatFilterName(patterns []string, count int) string { + if len(patterns) < count { + count = len(patterns) + } + + name := strings.Join(patterns[:count], ", ") + if len(patterns) > count { + name += "…" + } + + return name +} diff --git a/vendor/fyne.io/fyne/v2/dialog/file_xdg_notflatpak.go b/vendor/fyne.io/fyne/v2/dialog/file_xdg_notflatpak.go new file mode 100644 index 0000000..78528db --- /dev/null +++ b/vendor/fyne.io/fyne/v2/dialog/file_xdg_notflatpak.go @@ -0,0 +1,11 @@ +//go:build !flatpak && !windows && !android && !ios && !wasm && !js + +package dialog + +func fileOpenOSOverride(_ *FileDialog) bool { + return false +} + +func fileSaveOSOverride(_ *FileDialog) bool { + return false +} diff --git a/vendor/fyne.io/fyne/v2/dialog/fileitem.go b/vendor/fyne.io/fyne/v2/dialog/fileitem.go new file mode 100644 index 0000000..1cd9d96 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/dialog/fileitem.go @@ -0,0 +1,147 @@ +package dialog + +import ( + "path/filepath" + "time" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/lang" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +const ( + fileIconSize = 64 + fileInlineIconSize = 24 + fileIconCellWidth = fileIconSize * 1.25 +) + +type fileDialogItem struct { + widget.BaseWidget + picker *fileDialog + + name string + id int // id in the parent container + choose func(id int) + open func() + location fyne.URI + dir bool + + lastClick time.Time +} + +func (i *fileDialogItem) CreateRenderer() fyne.WidgetRenderer { + text := widget.NewLabelWithStyle(i.name, fyne.TextAlignCenter, fyne.TextStyle{}) + text.Truncation = fyne.TextTruncateEllipsis + text.Wrapping = fyne.TextWrapBreak + icon := widget.NewFileIcon(i.location) + + return &fileItemRenderer{ + item: i, + icon: icon, + text: text, + objects: []fyne.CanvasObject{icon, text}, + fileTextSize: widget.NewLabel("M\nM").MinSize().Height, // cache two-line label height, + } +} + +func (i *fileDialogItem) setLocation(l fyne.URI, dir, up bool) { + i.dir = dir + i.location = l + i.name = l.Name() + + if i.picker.view == GridView { + ext := filepath.Ext(i.name[1:]) + i.name = i.name[:len(i.name)-len(ext)] + } + + if up { + i.name = "(" + lang.X("file.parent", "Parent") + ")" + } + + i.Refresh() +} + +func (i *fileDialogItem) Tapped(*fyne.PointEvent) { + if i.choose != nil { + i.choose(i.id) + } + now := time.Now() + if !i.dir && now.Sub(i.lastClick) < fyne.CurrentApp().Driver().DoubleTapDelay() && i.open != nil { + // It is a double click, so we ask the dialog to open + i.open() + } + i.lastClick = now +} + +func (f *fileDialog) newFileItem(location fyne.URI, dir, up bool) *fileDialogItem { + item := &fileDialogItem{ + picker: f, + location: location, + name: location.Name(), + dir: dir, + } + + if f.view == GridView { + ext := filepath.Ext(item.name[1:]) + item.name = item.name[:len(item.name)-len(ext)] + } + + if up { + item.name = "(" + lang.X("file.parent", "Parent") + ")" + } + + item.ExtendBaseWidget(item) + return item +} + +type fileItemRenderer struct { + item *fileDialogItem + fileTextSize float32 + + icon *widget.FileIcon + text *widget.Label + objects []fyne.CanvasObject +} + +func (s *fileItemRenderer) Layout(size fyne.Size) { + if s.item.picker.view == GridView { + s.icon.Resize(fyne.NewSize(fileIconSize, fileIconSize)) + s.icon.Move(fyne.NewPos((size.Width-fileIconSize)/2, 0)) + + s.text.Alignment = fyne.TextAlignCenter + s.text.Resize(fyne.NewSize(size.Width, s.fileTextSize)) + s.text.Move(fyne.NewPos(0, size.Height-s.fileTextSize)) + } else { + s.icon.Resize(fyne.NewSize(fileInlineIconSize, fileInlineIconSize)) + s.icon.Move(fyne.NewPos(theme.Padding(), (size.Height-fileInlineIconSize)/2)) + + s.text.Alignment = fyne.TextAlignLeading + textMin := s.text.MinSize() + s.text.Resize(fyne.NewSize(size.Width, textMin.Height)) + s.text.Move(fyne.NewPos(fileInlineIconSize, (size.Height-textMin.Height)/2)) + } +} + +func (s *fileItemRenderer) MinSize() fyne.Size { + if s.item.picker.view == GridView { + return fyne.NewSize(fileIconCellWidth, fileIconSize+s.fileTextSize) + } + + textMin := s.text.MinSize() + return fyne.NewSize(fileInlineIconSize+textMin.Width+theme.Padding(), textMin.Height) +} + +func (s *fileItemRenderer) Refresh() { + s.fileTextSize = widget.NewLabel("M\nM").MinSize().Height // cache two-line label height + + s.text.SetText(s.item.name) + s.icon.SetURI(s.item.location) +} + +func (s *fileItemRenderer) Objects() []fyne.CanvasObject { + return s.objects +} + +func (s *fileItemRenderer) Destroy() { +} diff --git a/vendor/fyne.io/fyne/v2/dialog/folder.go b/vendor/fyne.io/fyne/v2/dialog/folder.go new file mode 100644 index 0000000..c2d8cb2 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/dialog/folder.go @@ -0,0 +1,42 @@ +package dialog + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/storage" +) + +var folderFilter = storage.NewMimeTypeFileFilter([]string{"application/x-directory"}) + +// NewFolderOpen creates a file dialog allowing the user to choose a folder to +// open. The callback function will run when the dialog closes. The URI will be +// nil when the user cancels or when nothing is selected. +// +// The dialog will appear over the window specified when Show() is called. +// +// Since: 1.4 +func NewFolderOpen(callback func(fyne.ListableURI, error), parent fyne.Window) *FileDialog { + dialog := &FileDialog{} + dialog.callback = callback + dialog.parent = parent + dialog.filter = folderFilter + return dialog +} + +// ShowFolderOpen creates and shows a file dialog allowing the user to choose a +// folder to open. The callback function will run when the dialog closes. The +// URI will be nil when the user cancels or when nothing is selected. +// +// The dialog will appear over the window specified. +// +// Since: 1.4 +func ShowFolderOpen(callback func(fyne.ListableURI, error), parent fyne.Window) { + dialog := NewFolderOpen(callback, parent) + if fileOpenOSOverride(dialog) { + return + } + dialog.Show() +} + +func (f *FileDialog) isDirectory() bool { + return f.filter == folderFilter +} diff --git a/vendor/fyne.io/fyne/v2/dialog/form.go b/vendor/fyne.io/fyne/v2/dialog/form.go new file mode 100644 index 0000000..a595d5a --- /dev/null +++ b/vendor/fyne.io/fyne/v2/dialog/form.go @@ -0,0 +1,87 @@ +package dialog + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +// FormDialog is a simple dialog window for displaying FormItems inside a form. +// +// Since: 2.4 +type FormDialog struct { + *dialog + items []*widget.FormItem + confirm *widget.Button + cancel *widget.Button +} + +// Submit will submit the form and then hide the dialog if validation passes. +// +// Since: 2.4 +func (d *FormDialog) Submit() { + if d.confirm.Disabled() { + return + } + + d.hideWithResponse(true) +} + +// setSubmitState is intended to run when the form validation changes to +// enable/disable the submit button accordingly. +func (d *FormDialog) setSubmitState(err error) { + if err != nil { + d.confirm.Disable() + return + } + + d.confirm.Enable() +} + +// NewForm creates and returns a dialog over the specified application using +// the provided FormItems. The cancel button will have the dismiss text set and the confirm button will +// use the confirm text. The response callback is called on user action after validation passes. +// If any Validatable widget reports that validation has failed, then the confirm +// button will be disabled. The initial state of the confirm button will reflect the initial +// validation state of the items added to the form dialog. +// +// Since: 2.0 +func NewForm(title, confirm, dismiss string, items []*widget.FormItem, callback func(bool), parent fyne.Window) *FormDialog { + form := widget.NewForm(items...) + + d := &dialog{content: form, callback: callback, title: title, parent: parent} + d.dismiss = &widget.Button{ + Text: dismiss, Icon: theme.CancelIcon(), + OnTapped: d.Hide, + } + confirmBtn := &widget.Button{ + Text: confirm, Icon: theme.ConfirmIcon(), Importance: widget.HighImportance, + OnTapped: func() { d.hideWithResponse(true) }, + } + formDialog := &FormDialog{ + dialog: d, + items: items, + confirm: confirmBtn, + cancel: d.dismiss, + } + + formDialog.setSubmitState(form.Validate()) + form.SetOnValidationChanged(formDialog.setSubmitState) + + d.create(container.NewGridWithColumns(2, d.dismiss, confirmBtn)) + return formDialog +} + +// ShowForm shows a dialog over the specified application using +// the provided FormItems. The cancel button will have the dismiss text set and the confirm button will +// use the confirm text. The response callback is called on user action after validation passes. +// If any Validatable widget reports that validation has failed, then the confirm +// button will be disabled. The initial state of the confirm button will reflect the initial +// validation state of the items added to the form dialog. +// The MinSize() of the CanvasObject passed will be used to set the size of the window. +// +// Since: 2.0 +func ShowForm(title, confirm, dismiss string, content []*widget.FormItem, callback func(bool), parent fyne.Window) { + NewForm(title, confirm, dismiss, content, callback, parent).Show() +} diff --git a/vendor/fyne.io/fyne/v2/dialog/information.go b/vendor/fyne.io/fyne/v2/dialog/information.go new file mode 100644 index 0000000..6e52ca3 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/dialog/information.go @@ -0,0 +1,53 @@ +package dialog + +import ( + "unicode" + "unicode/utf8" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/lang" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +func createInformationDialog(title, message string, icon fyne.Resource, parent fyne.Window) Dialog { + d := newTextDialog(title, message, icon, parent) + d.dismiss = &widget.Button{ + Text: lang.L("OK"), + OnTapped: d.Hide, + } + d.create(container.NewGridWithColumns(1, d.dismiss)) + return d +} + +// NewInformation creates a dialog over the specified window for user information. +// The title is used for the dialog window and message is the content. +// After creation you should call Show(). +func NewInformation(title, message string, parent fyne.Window) Dialog { + return createInformationDialog(title, message, theme.InfoIcon(), parent) +} + +// ShowInformation shows a dialog over the specified window for user information. +// The title is used for the dialog window and message is the content. +func ShowInformation(title, message string, parent fyne.Window) { + NewInformation(title, message, parent).Show() +} + +// NewError creates a dialog over the specified window for an application error. +// The message is extracted from the provided error (should not be nil). +// After creation you should call Show(). +func NewError(err error, parent fyne.Window) Dialog { + dialogText := err.Error() + r, size := utf8.DecodeRuneInString(dialogText) + if r != utf8.RuneError { + dialogText = string(unicode.ToUpper(r)) + dialogText[size:] + } + return createInformationDialog(lang.L("Error"), dialogText, theme.ErrorIcon(), parent) +} + +// ShowError shows a dialog over the specified window for an application error. +// The message is extracted from the provided error (should not be nil). +func ShowError(err error, parent fyne.Window) { + NewError(err, parent).Show() +} diff --git a/vendor/fyne.io/fyne/v2/dialog/progress.go b/vendor/fyne.io/fyne/v2/dialog/progress.go new file mode 100644 index 0000000..d816c3b --- /dev/null +++ b/vendor/fyne.io/fyne/v2/dialog/progress.go @@ -0,0 +1,39 @@ +package dialog + +import ( + "image/color" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +// ProgressDialog is a simple dialog window that displays text and a progress bar. +// +// Deprecated: Use NewCustomWithoutButtons() and add a widget.ProgressBar() inside. +type ProgressDialog struct { + *dialog + + bar *widget.ProgressBar +} + +// SetValue updates the value of the progress bar - this should be between 0.0 and 1.0. +func (p *ProgressDialog) SetValue(v float64) { + p.bar.SetValue(v) +} + +// NewProgress creates a progress dialog and returns the handle. +// Using the returned type you should call Show() and then set its value through SetValue(). +// +// Deprecated: Use NewCustomWithoutButtons() and add a widget.ProgressBar() inside. +func NewProgress(title, message string, parent fyne.Window) *ProgressDialog { + d := newTextDialog(title, message, theme.InfoIcon(), parent) + bar := widget.NewProgressBar() + rect := canvas.NewRectangle(color.Transparent) + rect.SetMinSize(fyne.NewSize(200, 0)) + + d.create(container.NewStack(rect, bar)) + return &ProgressDialog{d, bar} +} diff --git a/vendor/fyne.io/fyne/v2/dialog/progressinfinite.go b/vendor/fyne.io/fyne/v2/dialog/progressinfinite.go new file mode 100644 index 0000000..e347e39 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/dialog/progressinfinite.go @@ -0,0 +1,40 @@ +package dialog + +import ( + "image/color" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +// ProgressInfiniteDialog is a simple dialog window that displays text and a infinite progress bar. +// +// Deprecated: Use NewCustomWithoutButtons() and add a widget.ProgressBarInfinite() inside. +type ProgressInfiniteDialog struct { + *dialog + + bar *widget.ProgressBarInfinite +} + +// NewProgressInfinite creates a infinite progress dialog and returns the handle. +// Using the returned type you should call Show(). +// +// Deprecated: Use NewCustomWithoutButtons() and add a widget.ProgressBarInfinite() inside. +func NewProgressInfinite(title, message string, parent fyne.Window) *ProgressInfiniteDialog { + d := newTextDialog(title, message, theme.InfoIcon(), parent) + bar := widget.NewProgressBarInfinite() + rect := canvas.NewRectangle(color.Transparent) + rect.SetMinSize(fyne.NewSize(200, 0)) + + d.create(container.NewStack(rect, bar)) + return &ProgressInfiniteDialog{d, bar} +} + +// Hide this dialog and stop the infinite progress goroutine +func (d *ProgressInfiniteDialog) Hide() { + d.bar.Hide() + d.dialog.Hide() +} diff --git a/vendor/fyne.io/fyne/v2/dialog/text.go b/vendor/fyne.io/fyne/v2/dialog/text.go new file mode 100644 index 0000000..ca2a932 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/dialog/text.go @@ -0,0 +1,50 @@ +package dialog + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +const ( + // absolute max width of text dialogs + // (prevent them from looking unnaturally large on desktop) + maxTextDialogAbsoluteWidth float32 = 600 + + // max width of text dialogs as a percentage of the current window width + maxTextDialogWinPcntWidth float32 = .9 +) + +func newTextDialog(title, message string, icon fyne.Resource, parent fyne.Window) *dialog { + d := &dialog{ + title: title, + icon: icon, + parent: parent, + content: newCenterWrappedLabel(message), + } + d.beforeShowHook = createBeforeShowHook(d, message) + + return d +} + +// returns a beforeShowHook that sets the desired width of the dialog to the min of: +// - width needed to show message without wrapping +// - maxTextDialogAbsoluteWidth +// - current window width * maxTextDialogWinPcntWidth +func createBeforeShowHook(d *dialog, message string) func() { + // Until issue #4648 is resolved, we need to create a label here + // rather than just using fyne.MeasureText, because the label's minsize + // also depends on the internal padding that label adds, which is unknown here + noWrapWidth := widget.NewLabel(message).MinSize().Width + padWidth + theme.Padding()*2 + return func() { + if d.desiredSize.IsZero() { + maxWinWitth := d.parent.Canvas().Size().Width * maxTextDialogWinPcntWidth + w := fyne.Min(fyne.Min(noWrapWidth, maxTextDialogAbsoluteWidth), maxWinWitth) + d.desiredSize = fyne.NewSize(w, d.MinSize().Height) + } + } +} + +func newCenterWrappedLabel(message string) fyne.CanvasObject { + return &widget.Label{Text: message, Alignment: fyne.TextAlignCenter, Wrapping: fyne.TextWrapWord} +} diff --git a/vendor/fyne.io/fyne/v2/driver.go b/vendor/fyne.io/fyne/v2/driver.go new file mode 100644 index 0000000..4aa7c62 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/driver.go @@ -0,0 +1,57 @@ +package fyne + +import "time" + +// Driver defines an abstract concept of a Fyne render driver. +// Any implementation must provide at least these methods. +type Driver interface { + // CreateWindow creates a new UI Window for a certain implementation. + // Developers should use [App.NewWindow]. + CreateWindow(string) Window + // AllWindows returns a slice containing all app windows. + AllWindows() []Window + + // RenderedTextSize returns the size required to render the given string of specified + // font size and style. It also returns the height to text baseline, measured from the top. + // If the source is specified it will be used, otherwise the current theme will be asked for the font. + RenderedTextSize(text string, fontSize float32, style TextStyle, source Resource) (size Size, baseline float32) + + // CanvasForObject returns the canvas that is associated with a given [CanvasObject]. + CanvasForObject(CanvasObject) Canvas + // AbsolutePositionForObject returns the position of a given [CanvasObject] relative to the top/left of a canvas. + AbsolutePositionForObject(CanvasObject) Position + + // Device returns the device that the application is currently running on. + Device() Device + // Run starts the main event loop of the driver. + Run() + // Quit closes the driver and open windows, then exit the application. + // On some operating systems this does nothing, for example iOS and Android. + Quit() + + // StartAnimation registers a new animation with this driver and requests it be started. + // Developers should use the [Animation.Start] function. + StartAnimation(*Animation) + // StopAnimation stops an animation and unregisters from this driver. + // Developers should use the [Animation.Stop] function. + StopAnimation(*Animation) + + // DoubleTapDelay returns the maximum duration where a second tap after a first one + // will be considered a [DoubleTap] instead of two distinct [Tap] events. + // + // Since: 2.5 + DoubleTapDelay() time.Duration + + // SetDisableScreenBlanking allows an app to ask the device not to sleep/lock/blank displays + // + // Since: 2.5 + SetDisableScreenBlanking(bool) + + // DoFromGoroutine provides a way to queue a function `fn` that is running on a goroutine back to + // the central thread for Fyne updates, waiting for it to return if `wait` is true. + // The driver provides the implementation normally accessed through [fyne.Do]. + // This is required when background tasks want to execute code safely in the graphical context. + // + // Since: 2.6 + DoFromGoroutine(fn func(), wait bool) +} diff --git a/vendor/fyne.io/fyne/v2/driver/desktop/app.go b/vendor/fyne.io/fyne/v2/driver/desktop/app.go new file mode 100644 index 0000000..b7346be --- /dev/null +++ b/vendor/fyne.io/fyne/v2/driver/desktop/app.go @@ -0,0 +1,23 @@ +package desktop + +import "fyne.io/fyne/v2" + +// App defines the desktop specific extensions to a fyne.App. +// +// Since: 2.2 +type App interface { + SetSystemTrayMenu(menu *fyne.Menu) + // SetSystemTrayIcon sets the icon to be used in system tray. + // If you pass a `ThemedResource` then any OS that adjusts look to match theme will adapt the icon. + SetSystemTrayIcon(icon fyne.Resource) + + // SetSystemTrayWindow optionally sets a window that this system tray will help to control. + // On systems that support it (Windows, macOS and most Linux) the window will be shown on left-tap. + // If the window is decorated (a regular window) tapping will show it only, however for a splash window + // (without window decorations) tapping when the window is visible will hide it. + // If you also have a menu set this will be triggered with right-mouse tap. + // Note that your menu should probably include a "Show Window" menu item for less-compliant Linux systems. + // + // Since: 2.7 + SetSystemTrayWindow(fyne.Window) +} diff --git a/vendor/fyne.io/fyne/v2/driver/desktop/canvas.go b/vendor/fyne.io/fyne/v2/driver/desktop/canvas.go new file mode 100644 index 0000000..0a2ab0c --- /dev/null +++ b/vendor/fyne.io/fyne/v2/driver/desktop/canvas.go @@ -0,0 +1,11 @@ +package desktop + +import "fyne.io/fyne/v2" + +// Canvas defines the desktop specific extensions to a fyne.Canvas. +type Canvas interface { + OnKeyDown() func(*fyne.KeyEvent) + SetOnKeyDown(func(*fyne.KeyEvent)) + OnKeyUp() func(*fyne.KeyEvent) + SetOnKeyUp(func(*fyne.KeyEvent)) +} diff --git a/vendor/fyne.io/fyne/v2/driver/desktop/cursor.go b/vendor/fyne.io/fyne/v2/driver/desktop/cursor.go new file mode 100644 index 0000000..f5f3b51 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/driver/desktop/cursor.go @@ -0,0 +1,47 @@ +package desktop + +import "image" + +// Cursor interface is used for objects that desire a specific cursor. +// +// Since: 2.0 +type Cursor interface { + // Image returns the image for the given cursor, or nil if none should be shown. + // It also returns the x and y pixels that should act as the hot-spot (measured from top left corner). + Image() (image.Image, int, int) +} + +// StandardCursor represents a standard Fyne cursor. +// These values were previously of type `fyne.Cursor`. +// +// Since: 2.0 +type StandardCursor int + +// Image is not used for any of the StandardCursor types. +// +// Since: 2.0 +func (d StandardCursor) Image() (image.Image, int, int) { + return nil, 0, 0 +} + +const ( + // DefaultCursor is the default cursor typically an arrow + DefaultCursor StandardCursor = iota + // TextCursor is the cursor often used to indicate text selection + TextCursor + // CrosshairCursor is the cursor often used to indicate bitmaps + CrosshairCursor + // PointerCursor is the cursor often used to indicate a link + PointerCursor + // HResizeCursor is the cursor often used to indicate horizontal resize + HResizeCursor + // VResizeCursor is the cursor often used to indicate vertical resize + VResizeCursor + // HiddenCursor will cause the cursor to not be shown + HiddenCursor +) + +// Cursorable describes any CanvasObject that needs a cursor change +type Cursorable interface { + Cursor() Cursor +} diff --git a/vendor/fyne.io/fyne/v2/driver/desktop/driver.go b/vendor/fyne.io/fyne/v2/driver/desktop/driver.go new file mode 100644 index 0000000..7502648 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/driver/desktop/driver.go @@ -0,0 +1,15 @@ +// Package desktop provides desktop specific driver functionality. +package desktop + +import "fyne.io/fyne/v2" + +// Driver represents the extended capabilities of a desktop driver +type Driver interface { + // Create a new borderless window that is centered on screen + CreateSplashWindow() fyne.Window + + // Gets the set of key modifiers that are currently active + // + // Since: 2.4 + CurrentKeyModifiers() fyne.KeyModifier +} diff --git a/vendor/fyne.io/fyne/v2/driver/desktop/key.go b/vendor/fyne.io/fyne/v2/driver/desktop/key.go new file mode 100644 index 0000000..14a544d --- /dev/null +++ b/vendor/fyne.io/fyne/v2/driver/desktop/key.go @@ -0,0 +1,66 @@ +package desktop + +import ( + "fyne.io/fyne/v2" +) + +const ( + // KeyNone represents no key + KeyNone fyne.KeyName = "" + // KeyShiftLeft represents the left shift key + KeyShiftLeft fyne.KeyName = "LeftShift" + // KeyShiftRight represents the right shift key + KeyShiftRight fyne.KeyName = "RightShift" + // KeyControlLeft represents the left control key + KeyControlLeft fyne.KeyName = "LeftControl" + // KeyControlRight represents the right control key + KeyControlRight fyne.KeyName = "RightControl" + // KeyAltLeft represents the left alt key + KeyAltLeft fyne.KeyName = "LeftAlt" + // KeyAltRight represents the right alt key + KeyAltRight fyne.KeyName = "RightAlt" + // KeySuperLeft represents the left "Windows" key (or "Command" key on macOS) + KeySuperLeft fyne.KeyName = "LeftSuper" + // KeySuperRight represents the right "Windows" key (or "Command" key on macOS) + KeySuperRight fyne.KeyName = "RightSuper" + // KeyMenu represents the left or right menu / application key + KeyMenu fyne.KeyName = "Menu" + // KeyPrintScreen represents the key used to cause a screen capture + KeyPrintScreen fyne.KeyName = "PrintScreen" + + // KeyCapsLock represents the caps lock key, tapping once is the down event then again is the up + KeyCapsLock fyne.KeyName = "CapsLock" +) + +// Modifier captures any key modifiers (shift etc.) pressed during a key event +// +// Deprecated: Use fyne.KeyModifier instead. +type Modifier = fyne.KeyModifier + +const ( + // ShiftModifier represents a shift key being held + // + // Deprecated: Use fyne.KeyModifierShift instead. + ShiftModifier = fyne.KeyModifierShift + // ControlModifier represents the ctrl key being held + // + // Deprecated: Use fyne.KeyModifierControl instead. + ControlModifier = fyne.KeyModifierControl + // AltModifier represents either alt keys being held + // + // Deprecated: Use fyne.KeyModifierAlt instead. + AltModifier = fyne.KeyModifierAlt + // SuperModifier represents either super keys being held + // + // Deprecated: Use fyne.KeyModifierSuper instead. + SuperModifier = fyne.KeyModifierSuper +) + +// Keyable describes any focusable canvas object that can accept desktop key events. +// This is the traditional key down and up event that is not applicable to all devices. +type Keyable interface { + fyne.Focusable + + KeyDown(*fyne.KeyEvent) + KeyUp(*fyne.KeyEvent) +} diff --git a/vendor/fyne.io/fyne/v2/driver/desktop/mouse.go b/vendor/fyne.io/fyne/v2/driver/desktop/mouse.go new file mode 100644 index 0000000..2bf256b --- /dev/null +++ b/vendor/fyne.io/fyne/v2/driver/desktop/mouse.go @@ -0,0 +1,58 @@ +package desktop + +import "fyne.io/fyne/v2" + +// MouseButton represents a single button in a desktop MouseEvent +type MouseButton int + +const ( + // MouseButtonPrimary is the most common mouse button - on some systems the only one. + // This will normally be on the left side of a mouse. + // + // Since: 2.0 + MouseButtonPrimary MouseButton = 1 << iota + + // MouseButtonSecondary is the secondary button on most mouse input devices. + // This will normally be on the right side of a mouse. + // + // Since: 2.0 + MouseButtonSecondary + + // MouseButtonTertiary is the middle button on the mouse, assuming it has one. + // + // Since: 2.0 + MouseButtonTertiary + + // LeftMouseButton is the most common mouse button - on some systems the only one. + // + // Deprecated: use MouseButtonPrimary which will adapt to mouse configuration. + LeftMouseButton = MouseButtonPrimary + + // RightMouseButton is the secondary button on most mouse input devices. + // + // Deprecated: use MouseButtonSecondary which will adapt to mouse configuration. + RightMouseButton = MouseButtonSecondary +) + +// MouseEvent contains data relating to desktop mouse events +type MouseEvent struct { + fyne.PointEvent + Button MouseButton + Modifier fyne.KeyModifier +} + +// Mouseable represents desktop mouse events that can be sent to CanvasObjects +type Mouseable interface { + MouseDown(*MouseEvent) + MouseUp(*MouseEvent) +} + +// Hoverable is used when a canvas object wishes to know if a pointer device moves over it. +type Hoverable interface { + // MouseIn is a hook that is called if the mouse pointer enters the element. + MouseIn(*MouseEvent) + // MouseMoved is a hook that is called if the mouse pointer moved over the element. + MouseMoved(*MouseEvent) + // MouseOut is a hook that is called if the mouse pointer leaves the element. + MouseOut() +} diff --git a/vendor/fyne.io/fyne/v2/driver/desktop/shortcut.go b/vendor/fyne.io/fyne/v2/driver/desktop/shortcut.go new file mode 100644 index 0000000..facb547 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/driver/desktop/shortcut.go @@ -0,0 +1,58 @@ +package desktop + +import ( + "runtime" + "strings" + + "fyne.io/fyne/v2" +) + +// Declare conformity with Shortcut interface +var ( + _ fyne.Shortcut = (*CustomShortcut)(nil) + _ fyne.KeyboardShortcut = (*CustomShortcut)(nil) +) + +// CustomShortcut describes a shortcut desktop event. +type CustomShortcut struct { + fyne.KeyName + Modifier fyne.KeyModifier +} + +// Key returns the key name of this shortcut. +func (cs *CustomShortcut) Key() fyne.KeyName { + return cs.KeyName +} + +// Mod returns the modifier of this shortcut. +func (cs *CustomShortcut) Mod() fyne.KeyModifier { + return cs.Modifier +} + +// ShortcutName returns the shortcut name associated to the event. +func (cs *CustomShortcut) ShortcutName() string { + id := &strings.Builder{} + id.WriteString("CustomDesktop:") + writeModifiers(id, cs.Modifier) + id.WriteString(string(cs.KeyName)) + return id.String() +} + +func writeModifiers(w *strings.Builder, mods fyne.KeyModifier) { + if (mods & fyne.KeyModifierShift) != 0 { + w.WriteString("Shift+") + } + if (mods & fyne.KeyModifierControl) != 0 { + w.WriteString("Control+") + } + if (mods & fyne.KeyModifierAlt) != 0 { + w.WriteString("Alt+") + } + if (mods & fyne.KeyModifierSuper) != 0 { + if runtime.GOOS == "darwin" { + w.WriteString("Command+") + } else { + w.WriteString("Super+") + } + } +} diff --git a/vendor/fyne.io/fyne/v2/driver/embedded/driver.go b/vendor/fyne.io/fyne/v2/driver/embedded/driver.go new file mode 100644 index 0000000..9925669 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/driver/embedded/driver.go @@ -0,0 +1,19 @@ +package embedded + +import ( + "image" + + "fyne.io/fyne/v2" +) + +// Driver is an embedded driver designed for handling custom hardware. +// Various standard driver implementations are available in the fyne-x project. +// +// Since: 2.7 +type Driver interface { + Render(image.Image) + Run(func()) + + ScreenSize() fyne.Size + Queue() chan Event +} diff --git a/vendor/fyne.io/fyne/v2/driver/embedded/event.go b/vendor/fyne.io/fyne/v2/driver/embedded/event.go new file mode 100644 index 0000000..0460277 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/driver/embedded/event.go @@ -0,0 +1,8 @@ +package embedded + +// Event is the general type of all embedded device events. +// +// Since: 2.7 +type Event interface { + isEvent() +} diff --git a/vendor/fyne.io/fyne/v2/driver/embedded/keyboard.go b/vendor/fyne.io/fyne/v2/driver/embedded/keyboard.go new file mode 100644 index 0000000..ec02e86 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/driver/embedded/keyboard.go @@ -0,0 +1,39 @@ +package embedded + +import "fyne.io/fyne/v2" + +// KeyDirection specifies the press/release of a key event +// +// Since: 2.7 +type KeyDirection uint8 + +const ( + // KeyPressed specifies that a key was pushed down. + // + // Since: 2.7 + KeyPressed KeyDirection = iota + + // KeyReleased indicates a key was let back up. + // + // Since: 2.7 + KeyReleased +) + +// KeyEvent is an event from keyboard actions occurring in an embedded device keyboard. +// +// Since: 2.7 +type KeyEvent struct { + Name fyne.KeyName + Direction KeyDirection +} + +func (d *KeyEvent) isEvent() {} + +// CharacterEvent is an event specifying that a character was created by a hardware or virtual keyboard. +// +// Since: 2.7 +type CharacterEvent struct { + Rune rune +} + +func (c *CharacterEvent) isEvent() {} diff --git a/vendor/fyne.io/fyne/v2/driver/embedded/touch.go b/vendor/fyne.io/fyne/v2/driver/embedded/touch.go new file mode 100644 index 0000000..ac053cc --- /dev/null +++ b/vendor/fyne.io/fyne/v2/driver/embedded/touch.go @@ -0,0 +1,33 @@ +package embedded + +import "fyne.io/fyne/v2" + +// TouchDownEvent is for indicating that an embedded device touch screen or pointing device was pressed. +// +// Since: 2.7 +type TouchDownEvent struct { + Position fyne.Position + ID int +} + +func (t *TouchDownEvent) isEvent() {} + +// TouchMoveEvent is for indicating that an embedded device touch screen or pointing device was moved whilst being pressed. +// +// Since: 2.7 +type TouchMoveEvent struct { + Position fyne.Position + ID int +} + +func (t *TouchMoveEvent) isEvent() {} + +// TouchUpEvent is for indicating that an embedded device touch screen or pointing device was released. +// +// Since: 2.7 +type TouchUpEvent struct { + Position fyne.Position + ID int +} + +func (t *TouchUpEvent) isEvent() {} diff --git a/vendor/fyne.io/fyne/v2/driver/mobile/device.go b/vendor/fyne.io/fyne/v2/driver/mobile/device.go new file mode 100644 index 0000000..4444628 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/driver/mobile/device.go @@ -0,0 +1,12 @@ +// Package mobile provides mobile specific driver functionality. +package mobile + +// Device describes functionality only available on mobile +type Device interface { + // Request that the mobile device show the touch screen keyboard (standard layout) + ShowVirtualKeyboard() + // Request that the mobile device show the touch screen keyboard (custom layout) + ShowVirtualKeyboardType(KeyboardType) + // Request that the mobile device dismiss the touch screen keyboard + HideVirtualKeyboard() +} diff --git a/vendor/fyne.io/fyne/v2/driver/mobile/driver.go b/vendor/fyne.io/fyne/v2/driver/mobile/driver.go new file mode 100644 index 0000000..b0781fa --- /dev/null +++ b/vendor/fyne.io/fyne/v2/driver/mobile/driver.go @@ -0,0 +1,10 @@ +// Package mobile provides desktop specific mobile functionality. +package mobile + +// Driver represents the extended capabilities of a mobile driver +// +// Since: 2.4 +type Driver interface { + // GoBack asks the OS to go to the previous app / activity, where supported + GoBack() +} diff --git a/vendor/fyne.io/fyne/v2/driver/mobile/key.go b/vendor/fyne.io/fyne/v2/driver/mobile/key.go new file mode 100644 index 0000000..056b90a --- /dev/null +++ b/vendor/fyne.io/fyne/v2/driver/mobile/key.go @@ -0,0 +1,10 @@ +package mobile + +import ( + "fyne.io/fyne/v2" +) + +const ( + // KeyBack represents the back button which may be hardware or software + KeyBack fyne.KeyName = "Back" +) diff --git a/vendor/fyne.io/fyne/v2/driver/mobile/keyboard.go b/vendor/fyne.io/fyne/v2/driver/mobile/keyboard.go new file mode 100644 index 0000000..605c065 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/driver/mobile/keyboard.go @@ -0,0 +1,26 @@ +package mobile + +import ( + "fyne.io/fyne/v2" +) + +// KeyboardType represents a type of virtual keyboard +type KeyboardType int32 + +const ( + // DefaultKeyboard is the keyboard with default input style and "return" return key + DefaultKeyboard KeyboardType = iota + // SingleLineKeyboard is the keyboard with default input style and "Done" return key + SingleLineKeyboard + // NumberKeyboard is the keyboard with number input style and "Done" return key + NumberKeyboard + // PasswordKeyboard is used to ensure that text is not leaked to 3rd party keyboard providers + PasswordKeyboard +) + +// Keyboardable describes any CanvasObject that needs a keyboard +type Keyboardable interface { + fyne.Focusable + + Keyboard() KeyboardType +} diff --git a/vendor/fyne.io/fyne/v2/driver/mobile/touch.go b/vendor/fyne.io/fyne/v2/driver/mobile/touch.go new file mode 100644 index 0000000..3c11f1b --- /dev/null +++ b/vendor/fyne.io/fyne/v2/driver/mobile/touch.go @@ -0,0 +1,15 @@ +package mobile + +import "fyne.io/fyne/v2" + +// TouchEvent contains data relating to mobile touch events +type TouchEvent struct { + fyne.PointEvent +} + +// Touchable represents mobile touch events that can be sent to CanvasObjects +type Touchable interface { + TouchDown(*TouchEvent) + TouchUp(*TouchEvent) + TouchCancel(*TouchEvent) +} diff --git a/vendor/fyne.io/fyne/v2/driver/native.go b/vendor/fyne.io/fyne/v2/driver/native.go new file mode 100644 index 0000000..31b575d --- /dev/null +++ b/vendor/fyne.io/fyne/v2/driver/native.go @@ -0,0 +1,71 @@ +package driver + +// NativeWindow is an extension interface for `fyne.Window` that gives access +// to platform-native features of application windows. +// +// Since: 2.5 +type NativeWindow interface { + // RunNative provides a way to execute code within the platform-specific runtime context for a window. + // The context types are defined in the `driver` package and the specific context passed will differ by platform. + RunNative(func(context any)) +} + +// AndroidContext is passed to the RunNative callback when it is executed on an Android device. +// The VM, Env and Ctx pointers are required to make various calls into JVM methods. +// +// Since: 2.3 +type AndroidContext struct { + VM, Env, Ctx uintptr +} + +// AndroidWindowContext is passed to the NativeWindow.RunNative callback when it is executed +// on an Android device. The NativeWindow field is of type `*C.ANativeWindow`. +// The VM, Env and Ctx pointers are required to make various calls into JVM methods. +// +// Since: 2.5 +type AndroidWindowContext struct { + AndroidContext + NativeWindow uintptr +} + +// UnknownContext is passed to the RunNative callback when it is executed +// on devices or windows without special native context. +// +// Since: 2.3 +type UnknownContext struct{} + +// WindowsWindowContext is passed to the NativeWindow.RunNative callback +// when it is executed on a Microsoft Windows device. +// +// Since: 2.5 +type WindowsWindowContext struct { + // HWND is the window handle for the native window. + HWND uintptr +} + +// MacWindowContext is passed to the NativeWindow.RunNative callback +// when it is executed on a macOS device. +// +// Since: 2.5 +type MacWindowContext struct { + // NSWindow is the window handle for the native window. + NSWindow uintptr +} + +// X11WindowContext is passed to the NativeWindow.RunNative callback +// when it is executed on a device with the X11 windowing system. +// +// Since: 2.5 +type X11WindowContext struct { + // WindowHandle is the window handle for the native X11 window. + WindowHandle uintptr +} + +// WaylandWindowContext is passed to the NativeWindow.RunNative callback +// when it is executed on a device with the Wayland windowing system. +// +// Since: 2.5 +type WaylandWindowContext struct { + // WaylandSurface is the handle to the native Wayland surface. + WaylandSurface uintptr +} diff --git a/vendor/fyne.io/fyne/v2/driver/native_android.go b/vendor/fyne.io/fyne/v2/driver/native_android.go new file mode 100644 index 0000000..64cae33 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/driver/native_android.go @@ -0,0 +1,16 @@ +//go:build android + +package driver + +import "fyne.io/fyne/v2/internal/driver/mobile/app" + +// RunNative provides a way to execute code within the platform-specific runtime context for various runtimes. +// On Android this provides the JVM pointers required to execute various NDK calls or use JNI APIs. +// +// Since: 2.3 +func RunNative(fn func(any) error) error { + return app.RunOnJVM(func(vm, env, ctx uintptr) error { + data := &AndroidContext{VM: vm, Env: env, Ctx: ctx} + return fn(data) + }) +} diff --git a/vendor/fyne.io/fyne/v2/driver/native_other.go b/vendor/fyne.io/fyne/v2/driver/native_other.go new file mode 100644 index 0000000..0f61efb --- /dev/null +++ b/vendor/fyne.io/fyne/v2/driver/native_other.go @@ -0,0 +1,12 @@ +//go:build !android + +package driver + +// RunNative provides a way to execute code within the platform-specific runtime context for various runtimes. +// This is mostly useful for Android where the JVM provides functionality that is not accessible directly in CGo. +// The call for most platforms will just execute passing an `UnknownContext` and returning any error reported. +// +// Since: 2.3 +func RunNative(fn func(any) error) error { + return fn(&UnknownContext{}) +} diff --git a/vendor/fyne.io/fyne/v2/driver/software/render.go b/vendor/fyne.io/fyne/v2/driver/software/render.go new file mode 100644 index 0000000..2a22d43 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/driver/software/render.go @@ -0,0 +1,31 @@ +package software + +import ( + "image" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/app" +) + +// RenderCanvas takes a canvas and renders it to a regular Go image using the provided Theme. +// This is the same as setting the application theme and then calling Canvas.Capture(). +func RenderCanvas(c fyne.Canvas, t fyne.Theme) image.Image { + fyne.CurrentApp().Settings().SetTheme(t) + app.ApplyThemeTo(c.Content(), c) + + return c.Capture() +} + +// Render takes a canvas object and renders it to a regular Go image using the provided Theme. +// The returned image will be set to the object's minimum size. +// Use the theme.LightTheme() or theme.DarkTheme() to access the builtin themes. +func Render(obj fyne.CanvasObject, t fyne.Theme) image.Image { + fyne.CurrentApp().Settings().SetTheme(t) + + c := NewCanvas() + c.SetPadded(false) + c.SetContent(obj) + + app.ApplyThemeTo(obj, c) + return c.Capture() +} diff --git a/vendor/fyne.io/fyne/v2/driver/software/softwarecanvas.go b/vendor/fyne.io/fyne/v2/driver/software/softwarecanvas.go new file mode 100644 index 0000000..2112cff --- /dev/null +++ b/vendor/fyne.io/fyne/v2/driver/software/softwarecanvas.go @@ -0,0 +1,18 @@ +package software + +import ( + "fyne.io/fyne/v2/internal/painter/software" + "fyne.io/fyne/v2/test" +) + +// NewCanvas creates a new canvas in memory that can render without hardware support. +func NewCanvas() test.WindowlessCanvas { + return test.NewCanvasWithPainter(software.NewPainter()) +} + +// NewTransparentCanvas creates a new canvas in memory that can render without hardware support without a background color. +// +// Since: 2.2 +func NewTransparentCanvas() test.WindowlessCanvas { + return test.NewTransparentCanvasWithPainter(software.NewPainter()) +} diff --git a/vendor/fyne.io/fyne/v2/event.go b/vendor/fyne.io/fyne/v2/event.go new file mode 100644 index 0000000..0f00605 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/event.go @@ -0,0 +1,37 @@ +package fyne + +// HardwareKey contains information associated with physical key events +// Most applications should use [KeyName] for cross-platform compatibility. +type HardwareKey struct { + // ScanCode represents a hardware ID for (normally desktop) keyboard events. + ScanCode int +} + +// KeyEvent describes a keyboard input event. +type KeyEvent struct { + // Name describes the keyboard event that is consistent across platforms. + Name KeyName + // Physical is a platform specific field that reports the hardware information of physical keyboard events. + Physical HardwareKey +} + +// PointEvent describes a pointer input event. The position is relative to the +// top-left of the [CanvasObject] this is triggered on. +type PointEvent struct { + AbsolutePosition Position // The absolute position of the event + Position Position // The relative position of the event +} + +// ScrollEvent defines the parameters of a pointer or other scroll event. +// The DeltaX and DeltaY represent how large the scroll was in two dimensions. +type ScrollEvent struct { + PointEvent + Scrolled Delta +} + +// DragEvent defines the parameters of a pointer or other drag event. +// The DraggedX and DraggedY fields show how far the item was dragged since the last event. +type DragEvent struct { + PointEvent + Dragged Delta +} diff --git a/vendor/fyne.io/fyne/v2/fyne.go b/vendor/fyne.io/fyne/v2/fyne.go new file mode 100644 index 0000000..8975b89 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/fyne.go @@ -0,0 +1,28 @@ +// Package fyne describes the objects and components available to any Fyne app. +// These can all be created, manipulated and tested without rendering (for speed). +// Your main package should use the app package to create an application with +// a default driver that will render your UI. +// +// A simple application may look like this: +// +// package main +// +// import "fyne.io/fyne/v2/app" +// import "fyne.io/fyne/v2/container" +// import "fyne.io/fyne/v2/widget" +// +// func main() { +// a := app.New() +// w := a.NewWindow("Hello") +// +// hello := widget.NewLabel("Hello Fyne!") +// w.SetContent(container.NewVBox( +// hello, +// widget.NewButton("Hi!", func() { +// hello.SetText("Welcome :)") +// }), +// )) +// +// w.ShowAndRun() +// } +package fyne // import "fyne.io/fyne/v2" diff --git a/vendor/fyne.io/fyne/v2/geometry.go b/vendor/fyne.io/fyne/v2/geometry.go new file mode 100644 index 0000000..e0dec55 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/geometry.go @@ -0,0 +1,162 @@ +package fyne + +var ( + _ Vector2 = (*Delta)(nil) + _ Vector2 = (*Position)(nil) + _ Vector2 = (*Size)(nil) +) + +// Vector2 marks geometry types that can operate as a coordinate vector. +type Vector2 interface { + Components() (float32, float32) + IsZero() bool +} + +// Delta is a generic X, Y coordinate, size or movement representation. +type Delta struct { + DX, DY float32 +} + +// NewDelta returns a newly allocated [Delta] representing a movement in the X and Y axis. +func NewDelta(dx float32, dy float32) Delta { + return Delta{DX: dx, DY: dy} +} + +// Components returns the X and Y elements of v. +func (v Delta) Components() (float32, float32) { + return v.DX, v.DY +} + +// IsZero returns whether the Position is at the zero-point. +func (v Delta) IsZero() bool { + return v.DX == 0.0 && v.DY == 0.0 +} + +// Position describes a generic X, Y coordinate relative to a parent [Canvas] +// or [CanvasObject]. +type Position struct { + X float32 // The position from the parent's left edge + Y float32 // The position from the parent's top edge +} + +// NewPos returns a newly allocated [Position] representing the specified coordinates. +func NewPos(x float32, y float32) Position { + return Position{x, y} +} + +// NewSquareOffsetPos returns a newly allocated [Position] with the same x and y position. +// +// Since: 2.4 +func NewSquareOffsetPos(length float32) Position { + return Position{length, length} +} + +// Add returns a new [Position] that is the result of offsetting the current +// position by p2 X and Y. +func (p Position) Add(v Vector2) Position { + // NOTE: Do not simplify to `return p.AddXY(v.Components())`, it prevents inlining. + x, y := v.Components() + return Position{p.X + x, p.Y + y} +} + +// AddXY returns a new [Position] by adding x and y to the current one. +func (p Position) AddXY(x, y float32) Position { + return Position{p.X + x, p.Y + y} +} + +// Components returns the X and Y elements of p. +func (p Position) Components() (float32, float32) { + return p.X, p.Y +} + +// IsZero returns whether the Position is at the zero-point. +func (p Position) IsZero() bool { + return p.X == 0.0 && p.Y == 0.0 +} + +// Subtract returns a new [Position] that is the result of offsetting the current +// position by p2 -X and -Y. +func (p Position) Subtract(v Vector2) Position { + // NOTE: Do not simplify to `return p.SubtractXY(v.Components())`, it prevents inlining. + x, y := v.Components() + return Position{p.X - x, p.Y - y} +} + +// SubtractXY returns a new [Position] by subtracting x and y from the current one. +func (p Position) SubtractXY(x, y float32) Position { + return Position{p.X - x, p.Y - y} +} + +// Size describes something with width and height. +type Size struct { + Width float32 // The number of units along the X axis. + Height float32 // The number of units along the Y axis. +} + +// NewSize returns a newly allocated Size of the specified dimensions. +func NewSize(w float32, h float32) Size { + return Size{w, h} +} + +// NewSquareSize returns a newly allocated Size with the same width and height. +// +// Since: 2.4 +func NewSquareSize(side float32) Size { + return Size{side, side} +} + +// Add returns a new Size that is the result of increasing the current size by +// s2 Width and Height. +func (s Size) Add(v Vector2) Size { + // NOTE: Do not simplify to `return s.AddXY(v.Components())`, it prevents inlining. + w, h := v.Components() + return Size{s.Width + w, s.Height + h} +} + +// AddWidthHeight returns a new Size by adding width and height to the current one. +func (s Size) AddWidthHeight(width, height float32) Size { + return Size{s.Width + width, s.Height + height} +} + +// IsZero returns whether the Size has zero width and zero height. +func (s Size) IsZero() bool { + return s.Width == 0.0 && s.Height == 0.0 +} + +// Max returns a new [Size] that is the maximum of the current Size and s2. +func (s Size) Max(v Vector2) Size { + x, y := v.Components() + + maxW := Max(s.Width, x) + maxH := Max(s.Height, y) + + return NewSize(maxW, maxH) +} + +// Min returns a new [Size] that is the minimum of s and v. +func (s Size) Min(v Vector2) Size { + x, y := v.Components() + + minW := Min(s.Width, x) + minH := Min(s.Height, y) + + return NewSize(minW, minH) +} + +// Components returns the Width and Height elements of this Size +func (s Size) Components() (float32, float32) { + return s.Width, s.Height +} + +// Subtract returns a new Size that is the result of decreasing the current size +// by s2 Width and Height. +func (s Size) Subtract(v Vector2) Size { + // NOTE: Do not simplify to `return s.SubtractXY(v.Components())`, it prevents inlining. + w, h := v.Components() + return Size{s.Width - w, s.Height - h} +} + +// SubtractWidthHeight returns a new Size by subtracting width and height from the current one. +func (s Size) SubtractWidthHeight(width, height float32) Size { + return Size{s.Width - width, s.Height - height} +} diff --git a/vendor/fyne.io/fyne/v2/internal/animation/animation.go b/vendor/fyne.io/fyne/v2/internal/animation/animation.go new file mode 100644 index 0000000..7570da3 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/animation/animation.go @@ -0,0 +1,32 @@ +package animation + +import ( + "time" + + "fyne.io/fyne/v2" +) + +type anim struct { + a *fyne.Animation + end time.Time + repeatsLeft int + reverse bool + start time.Time + total int64 + stopped bool +} + +func newAnim(a *fyne.Animation) *anim { + animate := &anim{a: a, start: time.Now(), end: time.Now().Add(a.Duration)} + animate.total = animate.end.Sub(animate.start).Milliseconds() + animate.repeatsLeft = a.RepeatCount + return animate +} + +func (a *anim) setStopped() { + a.stopped = true +} + +func (a *anim) isStopped() bool { + return a.stopped +} diff --git a/vendor/fyne.io/fyne/v2/internal/animation/runner.go b/vendor/fyne.io/fyne/v2/internal/animation/runner.go new file mode 100644 index 0000000..0acdb71 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/animation/runner.go @@ -0,0 +1,174 @@ +package animation + +import ( + "sync" + "time" + + "fyne.io/fyne/v2" +) + +// Runner is the main driver for animations package +type Runner struct { + // animationMutex synchronizes access to `animations` and `pendingAnimations` + // between the runner goroutine and calls to Start and Stop + animationMutex sync.RWMutex + + // animations is the list of animations that are being ticked in the current frame + animations []*anim + + // pendingAnimations is animations that have been started but not yet picked up + // by the runner goroutine to be ticked each frame + pendingAnimations []*anim + + // nextFrameAnimations is the list of animations that will be ticked in the next frame. + // It is accessed only by the runner goroutine and accumulates the continuing animations + // during a tick that are not completed, plus the pendingAnimations picked up at the end of the frame. + // At the end of a full frame of animations, the nextFrameAnimations slice is swapped with + // the current `animations` slice which is then cleared out, while holding the mutex. + nextFrameAnimations []*anim + + runnerStarted bool +} + +// Start will register the passed application and initiate its ticking. +func (r *Runner) Start(a *fyne.Animation) { + r.animationMutex.Lock() + defer r.animationMutex.Unlock() + + if !r.runnerStarted { + r.runnerStarted = true + if r.animations == nil { + // initialize with excess capacity to avoid re-allocations + // on subsequent Starts + r.animations = make([]*anim, 0, 16) + } + r.animations = append(r.animations, newAnim(a)) + } else { + if r.pendingAnimations == nil { + // initialize with excess capacity to avoid re-allocations + // on subsequent Starts + r.pendingAnimations = make([]*anim, 0, 16) + } + r.pendingAnimations = append(r.pendingAnimations, newAnim(a)) + } +} + +// Stop causes an animation to stop ticking (if it was still running) and removes it from the runner. +func (r *Runner) Stop(a *fyne.Animation) { + r.animationMutex.Lock() + defer r.animationMutex.Unlock() + + newList := make([]*anim, 0, len(r.animations)) + stopped := false + for _, item := range r.animations { + if item.a != a { + newList = append(newList, item) + } else { + item.setStopped() + stopped = true + } + } + r.animations = newList + if stopped { + return + } + + newList = make([]*anim, 0, len(r.pendingAnimations)) + for _, item := range r.pendingAnimations { + if item.a != a { + newList = append(newList, item) + } else { + item.setStopped() + } + } + r.pendingAnimations = newList +} + +// TickAnimations progresses all running animations by one tick. +// This will be called from the driver to update objects immediately before next paint. +func (r *Runner) TickAnimations() { + if !r.runnerStarted { + return + } + + done := r.runOneFrame() + + if done { + r.animationMutex.Lock() + r.runnerStarted = false + r.animationMutex.Unlock() + } +} + +func (r *Runner) runOneFrame() (done bool) { + r.animationMutex.Lock() + oldList := r.animations + r.animationMutex.Unlock() + for _, a := range oldList { + if !a.isStopped() && r.tickAnimation(a) { + r.nextFrameAnimations = append(r.nextFrameAnimations, a) + } + } + + r.animationMutex.Lock() + // nil out old r.animations for re-use as next r.nextFrameAnimations + tmp := r.animations + for i := range tmp { + tmp[i] = nil + } + r.animations = append(r.nextFrameAnimations, r.pendingAnimations...) + r.nextFrameAnimations = tmp[:0] + // nil out r.pendingAnimations + for i := range r.pendingAnimations { + r.pendingAnimations[i] = nil + } + r.pendingAnimations = r.pendingAnimations[:0] + done = len(r.animations) == 0 + r.animationMutex.Unlock() + return done +} + +// tickAnimation will process a frame of animation and return true if this should continue animating +func (r *Runner) tickAnimation(a *anim) bool { + if time.Now().After(a.end) { + if a.reverse { + a.a.Tick(0.0) + if a.repeatsLeft == 0 { + return false + } + a.reverse = false + } else { + a.a.Tick(1.0) + if a.a.AutoReverse { + a.reverse = true + } + } + if !a.reverse { + if a.repeatsLeft == 0 { + return false + } + if a.repeatsLeft > 0 { + a.repeatsLeft-- + } + } + + a.start = time.Now() + a.end = a.start.Add(a.a.Duration) + return true + } + + delta := time.Since(a.start).Milliseconds() + + val := float32(delta) / float32(a.total) + curve := a.a.Curve + if curve == nil { + curve = fyne.AnimationEaseInOut + } + if a.reverse { + a.a.Tick(curve(1 - val)) + } else { + a.a.Tick(curve(val)) + } + + return true +} diff --git a/vendor/fyne.io/fyne/v2/internal/app/config.go b/vendor/fyne.io/fyne/v2/internal/app/config.go new file mode 100644 index 0000000..bb31841 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/app/config.go @@ -0,0 +1,5 @@ +package app + +func RootConfigDir() string { + return rootConfigDir() +} diff --git a/vendor/fyne.io/fyne/v2/internal/app/config_desktop_darwin.go b/vendor/fyne.io/fyne/v2/internal/app/config_desktop_darwin.go new file mode 100644 index 0000000..bde0b12 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/app/config_desktop_darwin.go @@ -0,0 +1,15 @@ +//go:build !ci && !ios && !wasm && !test_web_driver && !mobile && !noos && !tinygo + +package app + +import ( + "os" + "path/filepath" +) + +func rootConfigDir() string { + homeDir, _ := os.UserHomeDir() + + desktopConfig := filepath.Join(filepath.Join(homeDir, "Library"), "Preferences") + return filepath.Join(desktopConfig, "fyne") +} diff --git a/vendor/fyne.io/fyne/v2/internal/app/config_mobile_and.go b/vendor/fyne.io/fyne/v2/internal/app/config_mobile_and.go new file mode 100644 index 0000000..c4f4ca5 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/app/config_mobile_and.go @@ -0,0 +1,19 @@ +//go:build !ci && android && !noos && !tinygo + +package app + +import ( + "log" + "os" + "path/filepath" +) + +func rootConfigDir() string { + filesDir := os.Getenv("FILESDIR") + if filesDir == "" { + log.Println("FILESDIR env was not set by android native code") + return "/data/data" // probably won't work, but we can't make a better guess + } + + return filepath.Join(filesDir, "fyne") +} diff --git a/vendor/fyne.io/fyne/v2/internal/app/config_mobile_ios.go b/vendor/fyne.io/fyne/v2/internal/app/config_mobile_ios.go new file mode 100644 index 0000000..5bbefdb --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/app/config_mobile_ios.go @@ -0,0 +1,19 @@ +//go:build !ci && ios && !mobile && !noos && !tinygo + +package app + +import ( + "path/filepath" +) + +/* +#include + +char *documentsPath(void); +*/ +import "C" + +func rootConfigDir() string { + root := C.documentsPath() + return filepath.Join(C.GoString(root), "fyne") +} diff --git a/vendor/fyne.io/fyne/v2/internal/app/config_mobile_ios.m b/vendor/fyne.io/fyne/v2/internal/app/config_mobile_ios.m new file mode 100644 index 0000000..059005a --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/app/config_mobile_ios.m @@ -0,0 +1,9 @@ +//go:build !ci && ios + +#import + +char *documentsPath() { + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + NSString *path = paths.firstObject; + return [path UTF8String]; +} \ No newline at end of file diff --git a/vendor/fyne.io/fyne/v2/internal/app/config_noos.go b/vendor/fyne.io/fyne/v2/internal/app/config_noos.go new file mode 100644 index 0000000..97924a4 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/app/config_noos.go @@ -0,0 +1,13 @@ +//go:build noos || tinygo + +package app + +import ( + "os" + "path/filepath" +) + +func rootConfigDir() string { + home, _ := os.UserHomeDir() + return filepath.Join(home, ".config", "fyne") +} diff --git a/vendor/fyne.io/fyne/v2/internal/app/config_other.go b/vendor/fyne.io/fyne/v2/internal/app/config_other.go new file mode 100644 index 0000000..b1dc980 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/app/config_other.go @@ -0,0 +1,12 @@ +//go:build ci || (mobile && !android && !ios) || (!linux && !darwin && !windows && !freebsd && !openbsd && !netbsd && !wasm && !test_web_driver && !noos && !tinygo) + +package app + +import ( + "os" + "path/filepath" +) + +func rootConfigDir() string { + return filepath.Join(os.TempDir(), "fyne-test") +} diff --git a/vendor/fyne.io/fyne/v2/internal/app/config_wasm.go b/vendor/fyne.io/fyne/v2/internal/app/config_wasm.go new file mode 100644 index 0000000..8463675 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/app/config_wasm.go @@ -0,0 +1,7 @@ +//go:build !ci && (!android || !ios || !mobile) && (wasm || test_web_driver) && !noos && !tinygo + +package app + +func rootConfigDir() string { + return "/data/" +} diff --git a/vendor/fyne.io/fyne/v2/internal/app/config_windows.go b/vendor/fyne.io/fyne/v2/internal/app/config_windows.go new file mode 100644 index 0000000..88e4b1e --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/app/config_windows.go @@ -0,0 +1,15 @@ +//go:build !ci && !android && !ios && !wasm && !test_web_driver && !noos && !tinygo + +package app + +import ( + "os" + "path/filepath" +) + +func rootConfigDir() string { + homeDir, _ := os.UserHomeDir() + + desktopConfig := filepath.Join(filepath.Join(homeDir, "AppData"), "Roaming") + return filepath.Join(desktopConfig, "fyne") +} diff --git a/vendor/fyne.io/fyne/v2/internal/app/config_xdg.go b/vendor/fyne.io/fyne/v2/internal/app/config_xdg.go new file mode 100644 index 0000000..5214fde --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/app/config_xdg.go @@ -0,0 +1,13 @@ +//go:build !ci && !wasm && !test_web_driver && !android && !ios && !mobile && (linux || openbsd || freebsd || netbsd) && !noos && !tinygo + +package app + +import ( + "os" + "path/filepath" +) + +func rootConfigDir() string { + desktopConfig, _ := os.UserConfigDir() + return filepath.Join(desktopConfig, "fyne") +} diff --git a/vendor/fyne.io/fyne/v2/internal/app/focus_manager.go b/vendor/fyne.io/fyne/v2/internal/app/focus_manager.go new file mode 100644 index 0000000..63fbb3e --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/app/focus_manager.go @@ -0,0 +1,150 @@ +package app + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/driver" +) + +// FocusManager represents a standard manager of input focus for a canvas +type FocusManager struct { + content fyne.CanvasObject + focused fyne.Focusable +} + +// NewFocusManager returns a new instance of the standard focus manager for a canvas. +func NewFocusManager(c fyne.CanvasObject) *FocusManager { + return &FocusManager{content: c} +} + +// Focus focuses the given obj. +func (f *FocusManager) Focus(obj fyne.Focusable) bool { + if obj != nil { + var hiddenAncestor fyne.CanvasObject + hidden := false + found := driver.WalkCompleteObjectTree( + f.content, + func(object fyne.CanvasObject, _, _ fyne.Position, _ fyne.Size) bool { + if hiddenAncestor == nil && !object.Visible() { + hiddenAncestor = object + } + if object == obj.(fyne.CanvasObject) { + hidden = hiddenAncestor != nil + return true + } + return false + }, + func(object fyne.CanvasObject, pos fyne.Position, _ fyne.CanvasObject) { + if hiddenAncestor == object { + hiddenAncestor = nil + } + }, + ) + if !found { + return false + } + if hidden { + return true + } + if dis, ok := obj.(fyne.Disableable); ok && dis.Disabled() { + type selectableText interface { + SelectedText() string + } + if _, isSelectableText := obj.(selectableText); !isSelectableText || fyne.CurrentDevice().IsMobile() { + return true + } + } + } + f.focus(obj) + return true +} + +// Focused returns the currently focused object or nil if none. +func (f *FocusManager) Focused() fyne.Focusable { + return f.focused +} + +// FocusGained signals to the manager that its content got focus (due to window/overlay switch for instance). +func (f *FocusManager) FocusGained() { + if focused := f.Focused(); focused != nil { + focused.FocusGained() + } +} + +// FocusLost signals to the manager that its content lost focus (due to window/overlay switch for instance). +func (f *FocusManager) FocusLost() { + if focused := f.Focused(); focused != nil { + focused.FocusLost() + } +} + +// FocusNext will find the item after the current that can be focused and focus it. +// If current is nil then the first focusable item in the canvas will be focused. +func (f *FocusManager) FocusNext() { + f.focus(f.nextInChain(f.focused)) +} + +// FocusPrevious will find the item before the current that can be focused and focus it. +// If current is nil then the last focusable item in the canvas will be focused. +func (f *FocusManager) FocusPrevious() { + f.focus(f.previousInChain(f.focused)) +} + +func (f *FocusManager) focus(obj fyne.Focusable) { + if f.focused == obj { + return + } + + if f.focused != nil { + f.focused.FocusLost() + } + f.focused = obj + if obj != nil { + obj.FocusGained() + } +} + +func (f *FocusManager) nextInChain(current fyne.Focusable) fyne.Focusable { + return f.nextWithWalker(current, driver.WalkVisibleObjectTree) +} + +func (f *FocusManager) nextWithWalker(current fyne.Focusable, walker walkerFunc) fyne.Focusable { + var next fyne.Focusable + found := current == nil // if we have no starting point then pretend we matched already + walker(f.content, func(obj fyne.CanvasObject, _ fyne.Position, _ fyne.Position, _ fyne.Size) bool { + if w, ok := obj.(fyne.Disableable); ok && w.Disabled() { + // disabled widget cannot receive focus + return false + } + + focus, ok := obj.(fyne.Focusable) + if !ok { + return false + } + + if found { + next = focus + return true + } + if next == nil { + next = focus + } + + if obj == current.(fyne.CanvasObject) { + found = true + } + + return false + }, nil) + + return next +} + +func (f *FocusManager) previousInChain(current fyne.Focusable) fyne.Focusable { + return f.nextWithWalker(current, driver.ReverseWalkVisibleObjectTree) +} + +type walkerFunc func( + fyne.CanvasObject, + func(fyne.CanvasObject, fyne.Position, fyne.Position, fyne.Size) bool, + func(fyne.CanvasObject, fyne.Position, fyne.CanvasObject), +) bool diff --git a/vendor/fyne.io/fyne/v2/internal/app/lifecycle.go b/vendor/fyne.io/fyne/v2/internal/app/lifecycle.go new file mode 100644 index 0000000..2a7375f --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/app/lifecycle.go @@ -0,0 +1,121 @@ +package app + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/async" +) + +var _ fyne.Lifecycle = (*Lifecycle)(nil) + +// Lifecycle represents the various phases that an app can transition through. +// +// Since: 2.1 +type Lifecycle struct { + onForeground func() + onBackground func() + onStarted func() + onStopped func() + + onStoppedHookExecuted func() + + eventQueue *async.UnboundedChan[func()] +} + +// SetOnStoppedHookExecuted is an internal function that lets Fyne schedule a clean-up after +// the user-provided stopped hook. It should only be called once during an application start-up. +func (l *Lifecycle) SetOnStoppedHookExecuted(f func()) { + l.onStoppedHookExecuted = f +} + +// SetOnEnteredForeground hooks into the app becoming foreground. +func (l *Lifecycle) SetOnEnteredForeground(f func()) { + l.onForeground = f +} + +// SetOnExitedForeground hooks into the app having moved to the background. +// Depending on the platform it may still be visible but will not receive keyboard events. +// On some systems hover or desktop mouse move events may still occur. +func (l *Lifecycle) SetOnExitedForeground(f func()) { + l.onBackground = f +} + +// SetOnStarted hooks into an event that says the app is now running. +func (l *Lifecycle) SetOnStarted(f func()) { + l.onStarted = f +} + +// SetOnStopped hooks into an event that says the app is no longer running. +func (l *Lifecycle) SetOnStopped(f func()) { + l.onStopped = f +} + +// OnEnteredForeground returns the focus gained hook, if one is registered. +func (l *Lifecycle) OnEnteredForeground() func() { + return l.onForeground +} + +// OnExitedForeground returns the focus lost hook, if one is registered. +func (l *Lifecycle) OnExitedForeground() func() { + return l.onBackground +} + +// OnStarted returns the started hook, if one is registered. +func (l *Lifecycle) OnStarted() func() { + return l.onStarted +} + +// OnStopped returns the stopped hook, if one is registered. +func (l *Lifecycle) OnStopped() func() { + stopped := l.onStopped + stopHook := l.onStoppedHookExecuted + if stopped == nil && stopHook == nil { + return nil + } + + if stopHook == nil { + return stopped + } + + if stopped == nil { + return stopHook + } + + // we have a stopped handle and the onStoppedHook + return func() { + stopped() + stopHook() + } +} + +// DestroyEventQueue destroys the event queue. +func (l *Lifecycle) DestroyEventQueue() { + l.eventQueue.Close() +} + +// InitEventQueue initializes the event queue. +func (l *Lifecycle) InitEventQueue() { + // This channel should be closed when the window is closed. + l.eventQueue = async.NewUnboundedChan[func()]() +} + +// QueueEvent uses this method to queue up a callback that handles an event. This ensures +// user interaction events for a given window are processed in order. +func (l *Lifecycle) QueueEvent(fn func()) { + l.eventQueue.In() <- fn +} + +// RunEventQueue runs the event queue. This should called inside a go routine. +// This function blocks. +func (l *Lifecycle) RunEventQueue(run func(func(), bool)) { + for fn := range l.eventQueue.Out() { + run(fn, true) + } +} + +// WaitForEvents wait for all the events. +func (l *Lifecycle) WaitForEvents() { + done := make(chan struct{}) + + l.eventQueue.In() <- func() { done <- struct{}{} } + <-done +} diff --git a/vendor/fyne.io/fyne/v2/internal/app/meta.go b/vendor/fyne.io/fyne/v2/internal/app/meta.go new file mode 100644 index 0000000..54a545b --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/app/meta.go @@ -0,0 +1,10 @@ +package app + +// these internal variables are set by the fyne build command so that the "FyneApp.toml" data is readable at runtime. +var ( + MetaIcon = "" // this will contain base64 encoded icon bytes + MetaID = "com.example" + MetaName = "Fyne App" + MetaVersion = "1.0.0" + MetaBuild = "1" +) diff --git a/vendor/fyne.io/fyne/v2/internal/app/theme.go b/vendor/fyne.io/fyne/v2/internal/app/theme.go new file mode 100644 index 0000000..626a341 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/app/theme.go @@ -0,0 +1,52 @@ +package app + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/cache" +) + +// ApplyThemeTo ensures that the specified canvasobject and all widgets and themeable objects will +// be updated for the current theme. +func ApplyThemeTo(content fyne.CanvasObject, canv fyne.Canvas) { + if content == nil { + return + } + + switch o := content.(type) { + case fyne.Widget: + renderer := cache.Renderer(o) + for _, co := range renderer.Objects() { + ApplyThemeTo(co, canv) + } + renderer.Layout(content.Size()) // theme can cause sizing changes + case *fyne.Container: + for _, co := range o.Objects { + ApplyThemeTo(co, canv) + } + if l := o.Layout; l != nil { + l.Layout(o.Objects, o.Size()) // theme can cause sizing changes + } + } + content.Refresh() +} + +// ApplySettings ensures that all widgets and themeable objects in an application will be updated for the current theme. +// It also checks that scale changes are reflected if required +func ApplySettings(set fyne.Settings, app fyne.App) { + ApplySettingsWithCallback(set, app, nil) +} + +// ApplySettingsWithCallback ensures that all widgets and themeable objects in an application will be updated for the current theme. +// It also checks that scale changes are reflected if required. Also it will call `onEveryWindow` on every window +// interaction +func ApplySettingsWithCallback(set fyne.Settings, app fyne.App, onEveryWindow func(w fyne.Window)) { + for _, window := range app.Driver().AllWindows() { + ApplyThemeTo(window.Content(), window.Canvas()) + for _, overlay := range window.Canvas().Overlays().List() { + ApplyThemeTo(overlay, window.Canvas()) + } + if onEveryWindow != nil { + onEveryWindow(window) + } + } +} diff --git a/vendor/fyne.io/fyne/v2/internal/app/theme_darwin.go b/vendor/fyne.io/fyne/v2/internal/app/theme_darwin.go new file mode 100644 index 0000000..538455c --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/app/theme_darwin.go @@ -0,0 +1,28 @@ +//go:build !ios && !wasm && !test_web_driver && !mobile + +package app + +/* +#cgo CFLAGS: -x objective-c +#cgo LDFLAGS: -framework Foundation + +#include + +bool isDarkMode(); +*/ +import "C" + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/theme" +) + +// DefaultVariant returns the systems default fyne.ThemeVariant. +// Normally, you should not need this. It is extracted out of the root app package to give the +// settings app access to it. +func DefaultVariant() fyne.ThemeVariant { + if C.isDarkMode() { + return theme.VariantDark + } + return theme.VariantLight +} diff --git a/vendor/fyne.io/fyne/v2/internal/app/theme_darwin.m b/vendor/fyne.io/fyne/v2/internal/app/theme_darwin.m new file mode 100644 index 0000000..a5ad06a --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/app/theme_darwin.m @@ -0,0 +1,8 @@ +//go:build !ios && !wasm && !test_web_driver && !mobile + +#import + +bool isDarkMode() { + NSString *style = [[NSUserDefaults standardUserDefaults] stringForKey:@"AppleInterfaceStyle"]; + return [@"Dark" isEqualToString:style]; +} diff --git a/vendor/fyne.io/fyne/v2/internal/app/theme_mobile.go b/vendor/fyne.io/fyne/v2/internal/app/theme_mobile.go new file mode 100644 index 0000000..fc10428 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/app/theme_mobile.go @@ -0,0 +1,18 @@ +//go:build android || ios || mobile + +package app + +import ( + "fyne.io/fyne/v2" +) + +// SystemTheme contains the system’s theme variant. +// It is intended for internal use, only! +var SystemTheme fyne.ThemeVariant + +// DefaultVariant returns the systems default fyne.ThemeVariant. +// Normally, you should not need this. It is extracted out of the root app package to give the +// settings app access to it. +func DefaultVariant() fyne.ThemeVariant { + return SystemTheme +} diff --git a/vendor/fyne.io/fyne/v2/internal/app/theme_other.go b/vendor/fyne.io/fyne/v2/internal/app/theme_other.go new file mode 100644 index 0000000..9a6cc4d --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/app/theme_other.go @@ -0,0 +1,15 @@ +//go:build !linux && !darwin && !windows && !freebsd && !openbsd && !netbsd && !wasm && !test_web_driver + +package app + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/theme" +) + +// DefaultVariant returns the systems default fyne.ThemeVariant. +// Normally, you should not need this. It is extracted out of the root app package to give the +// settings app access to it. +func DefaultVariant() fyne.ThemeVariant { + return theme.VariantDark +} diff --git a/vendor/fyne.io/fyne/v2/internal/app/theme_wasm.go b/vendor/fyne.io/fyne/v2/internal/app/theme_wasm.go new file mode 100644 index 0000000..ca00087 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/app/theme_wasm.go @@ -0,0 +1,24 @@ +//go:build wasm + +package app + +import ( + "syscall/js" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/theme" +) + +// DefaultVariant returns the systems default fyne.ThemeVariant. +// Normally, you should not need this. It is extracted out of the root app package to give the +// settings app access to it. +func DefaultVariant() fyne.ThemeVariant { + matches := js.Global().Call("matchMedia", "(prefers-color-scheme: dark)") + if matches.Truthy() { + if matches.Get("matches").Bool() { + return theme.VariantDark + } + return theme.VariantLight + } + return theme.VariantDark +} diff --git a/vendor/fyne.io/fyne/v2/internal/app/theme_web.go b/vendor/fyne.io/fyne/v2/internal/app/theme_web.go new file mode 100644 index 0000000..fcb8660 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/app/theme_web.go @@ -0,0 +1,15 @@ +//go:build !wasm && test_web_driver + +package app + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/theme" +) + +// DefaultVariant returns the systems default fyne.ThemeVariant. +// Normally, you should not need this. It is extracted out of the root app package to give the +// settings app access to it. +func DefaultVariant() fyne.ThemeVariant { + return theme.VariantDark +} diff --git a/vendor/fyne.io/fyne/v2/internal/app/theme_windows.go b/vendor/fyne.io/fyne/v2/internal/app/theme_windows.go new file mode 100644 index 0000000..13d4a9c --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/app/theme_windows.go @@ -0,0 +1,63 @@ +//go:build !android && !ios && !wasm && !test_web_driver + +package app + +import ( + "syscall" + + "golang.org/x/sys/windows/registry" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/theme" +) + +const themeRegKey = `SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize` + +// DefaultVariant returns the systems default fyne.ThemeVariant. +// Normally, you should not need this. It is extracted out of the root app package to give the +// settings app access to it. +func DefaultVariant() fyne.ThemeVariant { + if isDark() { + return theme.VariantDark + } + return theme.VariantLight +} + +func isDark() bool { + k, err := registry.OpenKey(registry.CURRENT_USER, themeRegKey, registry.QUERY_VALUE) + if err != nil { // older version of Windows will not have this key + return false + } + defer k.Close() + + useLight, _, err := k.GetIntegerValue("AppsUseLightTheme") + if err != nil { // older version of Windows will not have this value + return false + } + + return useLight == 0 +} + +// WatchTheme calls the supplied function when the Windows dark/light theme changes. +func WatchTheme(onChanged func()) { + // implementation based on an MIT-licensed Github Gist by Jeremy Black (c) 2022 + // https://gist.github.com/jerblack/1d05bbcebb50ad55c312e4d7cf1bc909 + var regNotifyChangeKeyValue *syscall.Proc + if advapi32, err := syscall.LoadDLL("Advapi32.dll"); err == nil { + if p, err := advapi32.FindProc("RegNotifyChangeKeyValue"); err == nil { + regNotifyChangeKeyValue = p + } + } + if regNotifyChangeKeyValue == nil { + return + } + k, err := registry.OpenKey(registry.CURRENT_USER, themeRegKey, syscall.KEY_NOTIFY|registry.QUERY_VALUE) + if err != nil { + return // on older versions of windows the key may not exist + } + for { + // blocks until the registry key has been changed + regNotifyChangeKeyValue.Call(uintptr(k), 0, 0x00000001|0x00000004, 0, 0) + onChanged() + } +} diff --git a/vendor/fyne.io/fyne/v2/internal/app/theme_xdg.go b/vendor/fyne.io/fyne/v2/internal/app/theme_xdg.go new file mode 100644 index 0000000..8763469 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/app/theme_xdg.go @@ -0,0 +1,20 @@ +//go:build !wasm && !test_web_driver && !android && !ios && !mobile && (linux || openbsd || freebsd || netbsd) + +package app + +import ( + "sync/atomic" + + "fyne.io/fyne/v2" +) + +// CurrentVariant contains the system’s theme variant. +// It is intended for internal use, only! +var CurrentVariant atomic.Uint64 + +// DefaultVariant returns the systems default fyne.ThemeVariant. +// Normally, you should not need this. It is extracted out of the root app package to give the +// settings app access to it. +func DefaultVariant() fyne.ThemeVariant { + return fyne.ThemeVariant(CurrentVariant.Load()) +} diff --git a/vendor/fyne.io/fyne/v2/internal/async/chan.go b/vendor/fyne.io/fyne/v2/internal/async/chan.go new file mode 100644 index 0000000..7afe18d --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/async/chan.go @@ -0,0 +1,97 @@ +package async + +// UnboundedChan is a channel with an unbounded buffer for caching +// Func objects. A channel must be closed via Close method. +type UnboundedChan[T any] struct { + in, out chan T + close chan struct{} + q []T +} + +// NewUnboundedChan returns a unbounded channel with unlimited capacity. +func NewUnboundedChan[T any]() *UnboundedChan[T] { + ch := &UnboundedChan[T]{ + // The size of Func, Interface, and CanvasObject are all less than 16 bytes, we use 16 to fit + // a CPU cache line (L2, 256 Bytes), which may reduce cache misses. + in: make(chan T, 16), + out: make(chan T, 16), + close: make(chan struct{}), + } + go ch.processing() + return ch +} + +// In returns the send channel of the given channel, which can be used to +// send values to the channel. +func (ch *UnboundedChan[T]) In() chan<- T { return ch.in } + +// Out returns the receive channel of the given channel, which can be used +// to receive values from the channel. +func (ch *UnboundedChan[T]) Out() <-chan T { return ch.out } + +// Close closes the channel. +func (ch *UnboundedChan[T]) Close() { ch.close <- struct{}{} } + +func (ch *UnboundedChan[T]) processing() { + // This is a preallocation of the internal unbounded buffer. + // The size is randomly picked. But if one changes the size, the + // reallocation size at the subsequent for loop should also be + // changed too. Furthermore, there is no memory leak since the + // queue is garbage collected. + ch.q = make([]T, 0, 1<<10) + for { + select { + case e, ok := <-ch.in: + if !ok { + // We don't want the input channel be accidentally closed + // via close() instead of Close(). If that happens, it is + // a misuse, do a panic as warning. + panic("async: misuse of unbounded channel, In() was closed") + } + ch.q = append(ch.q, e) + case <-ch.close: + ch.closed() + return + } + for len(ch.q) > 0 { + select { + case ch.out <- ch.q[0]: + ch.q[0] = *new(T) // de-reference earlier to help GC (use clear() when Go 1.21 is base) + ch.q = ch.q[1:] + case e, ok := <-ch.in: + if !ok { + // We don't want the input channel be accidentally closed + // via close() instead of Close(). If that happens, it is + // a misuse, do a panic as warning. + panic("async: misuse of unbounded channel, In() was closed") + } + ch.q = append(ch.q, e) + case <-ch.close: + ch.closed() + return + } + } + // If the remaining capacity is too small, we prefer to + // reallocate the entire buffer. + if cap(ch.q) < 1<<5 { + ch.q = make([]T, 0, 1<<10) + } + } +} + +func (ch *UnboundedChan[T]) closed() { + close(ch.in) + for e := range ch.in { + ch.q = append(ch.q, e) + } + for len(ch.q) > 0 { + select { + case ch.out <- ch.q[0]: + ch.q[0] = *new(T) // de-reference earlier to help GC (use clear() when Go 1.21 is base) + ch.q = ch.q[1:] + default: + } + } + close(ch.out) + close(ch.close) +} diff --git a/vendor/fyne.io/fyne/v2/internal/async/chan_struct.go b/vendor/fyne.io/fyne/v2/internal/async/chan_struct.go new file mode 100644 index 0000000..2ad3e6e --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/async/chan_struct.go @@ -0,0 +1,84 @@ +package async + +// UnboundedStructChan is a channel with an unbounded buffer for caching +// struct{} objects. This implementation is a specialized version that +// optimizes for struct{} objects than other types. A channel must be +// closed via Close method. +type UnboundedStructChan struct { + in, out, close chan struct{} + n uint64 +} + +// NewUnboundedStructChan returns a unbounded channel with unlimited capacity. +func NewUnboundedStructChan() *UnboundedStructChan { + ch := &UnboundedStructChan{ + // The size of Struct is less than 16 bytes, we use 16 to fit + // a CPU cache line (L2, 256 Bytes), which may reduce cache misses. + in: make(chan struct{}, 16), + out: make(chan struct{}, 16), + close: make(chan struct{}), + } + go ch.processing() + return ch +} + +// In returns a send-only channel that can be used to send values +// to the channel. +func (ch *UnboundedStructChan) In() chan<- struct{} { return ch.in } + +// Out returns a receive-only channel that can be used to receive +// values from the channel. +func (ch *UnboundedStructChan) Out() <-chan struct{} { return ch.out } + +// Close closes the channel. +func (ch *UnboundedStructChan) Close() { ch.close <- struct{}{} } + +func (ch *UnboundedStructChan) processing() { + for { + select { + case _, ok := <-ch.in: + if !ok { + // We don't want the input channel be accidentally closed + // via close() instead of Close(). If that happens, it is + // a misuse, do a panic as warning. + panic("async: misuse of unbounded channel, In() was closed") + } + ch.n++ + case <-ch.close: + ch.closed() + return + } + for ch.n > 0 { + select { + case ch.out <- struct{}{}: + ch.n-- + case _, ok := <-ch.in: + if !ok { + // We don't want the input channel be accidentally closed + // via close() instead of Close(). If that happens, it is + // a misuse, do a panic as warning. + panic("async: misuse of unbounded channel, In() was closed") + } + ch.n++ + case <-ch.close: + ch.closed() + return + } + } + } +} + +func (ch *UnboundedStructChan) closed() { + close(ch.in) + for range ch.in { + ch.n++ + } + for ; ch.n > 0; ch.n-- { + select { + case ch.out <- struct{}{}: + default: + } + } + close(ch.out) + close(ch.close) +} diff --git a/vendor/fyne.io/fyne/v2/internal/async/doc.go b/vendor/fyne.io/fyne/v2/internal/async/doc.go new file mode 100644 index 0000000..9ac614f --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/async/doc.go @@ -0,0 +1,18 @@ +// Package async provides unbounded channel and queue structures that are +// designed for caching unlimited number of a concrete type. For better +// performance, a given type should be less or euqal than 16 bytes. +// +// The difference of an unbounded channel or queue is that unbounde channels +// can utilize select and channel semantics, whereas queue cannot. A user of +// this package should balance this tradeoff. For instance, an unbounded +// channel can provide zero waiting cost when trying to receiving an object +// when the receiving select statement has a default case, and a queue can +// only receive the object with a time amount of time, but depending on the +// number of queue item producer, the receiving time may increase accordingly. +// +// Delicate dance: One must aware that an unbounded channel may lead to +// OOM when the consuming speed of the buffer is lower than the producing +// speed constantly. However, such a channel may be fairly used for event +// delivering if the consumer of the channel consumes the incoming +// forever, such as even processing. +package async diff --git a/vendor/fyne.io/fyne/v2/internal/async/goroutine.go b/vendor/fyne.io/fyne/v2/internal/async/goroutine.go new file mode 100644 index 0000000..7a75dc2 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/async/goroutine.go @@ -0,0 +1,85 @@ +package async + +import ( + "log" + "runtime" + "strings" + "sync/atomic" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/build" +) + +// mainGoroutineID stores the main goroutine ID. +// This ID must be initialized during setup by calling `SetMainGoroutine` because +// a main goroutine may not equal to 1 due to the influence of a garbage collector. +var mainGoroutineID atomic.Uint64 + +func SetMainGoroutine() { + mainGoroutineID.Store(goroutineID()) +} + +// EnsureNotMain is part of our thread transition and makes sure that the passed function runs off main. +// If the context is running on a goroutine or the transition has been disabled this will blindly run. +// Otherwise, an error will be logged and the function will be called on a new goroutine. +// +// This will be removed later and should never be public +func EnsureNotMain(fn func()) { + if build.MigratedToFyneDo() || !IsMainGoroutine() { + fn() + return + } + + log.Println("*** Error in Fyne call thread, fyne.Do[AndWait] called from main goroutine ***") + + logStackTop(2) + go fn() +} + +// EnsureMain is part of our thread transition and makes sure that the passed function runs on main. +// If the context is main or the transition has been disabled this will blindly run. +// Otherwise, an error will be logged and the function will be called on the main goroutine. +// +// This will be removed later and should never be public +func EnsureMain(fn func()) { + if build.MigratedToFyneDo() || IsMainGoroutine() { + fn() + return + } + + log.Println("*** Error in Fyne call thread, this should have been called in fyne.Do[AndWait] ***") + + logStackTop(1) + fyne.DoAndWait(fn) +} + +func logStackTop(skip int) { + pc := make([]uintptr, 16) + _ = runtime.Callers(skip, pc) + frames := runtime.CallersFrames(pc) + frame, more := frames.Next() + + var nextFrame runtime.Frame + for more { + nextFrame, more = frames.Next() + if nextFrame.File == "" || strings.Contains(nextFrame.File, "runtime") { // don't descend into Go + break + } + + frame = nextFrame + if !strings.Contains(nextFrame.File, "/fyne/") { // skip library lines + break + } + } + log.Printf(" From: %s:%d", frame.File, frame.Line) +} + +func goroutineID() (id uint64) { + var buf [30]byte + runtime.Stack(buf[:], false) + for i := 10; buf[i] != ' '; i++ { + id = id*10 + uint64(buf[i]&15) + } + + return id +} diff --git a/vendor/fyne.io/fyne/v2/internal/async/goroutine_desktop.go b/vendor/fyne.io/fyne/v2/internal/async/goroutine_desktop.go new file mode 100644 index 0000000..2dc1fa7 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/async/goroutine_desktop.go @@ -0,0 +1,8 @@ +//go:build !mobile + +package async + +// IsMainGoroutine returns true if it is called from the main goroutine, false otherwise. +func IsMainGoroutine() bool { + return goroutineID() == mainGoroutineID.Load() +} diff --git a/vendor/fyne.io/fyne/v2/internal/async/goroutine_mobile.go b/vendor/fyne.io/fyne/v2/internal/async/goroutine_mobile.go new file mode 100644 index 0000000..d2b74b2 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/async/goroutine_mobile.go @@ -0,0 +1,9 @@ +//go:build mobile + +package async + +// IsMainGoroutine returns true if it is called from the main goroutine, false otherwise. +func IsMainGoroutine() bool { + routineID := mainGoroutineID.Load() + return routineID == 0 || goroutineID() == routineID +} diff --git a/vendor/fyne.io/fyne/v2/internal/async/map.go b/vendor/fyne.io/fyne/v2/internal/async/map.go new file mode 100644 index 0000000..e3aa859 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/async/map.go @@ -0,0 +1,67 @@ +//go:build !migrated_fynedo + +package async + +import "sync" + +// Map is a generic wrapper around [sync.Map]. +type Map[K, V any] struct { + sync.Map +} + +// Delete deletes the value for a key. +func (m *Map[K, V]) Delete(key K) { + m.Map.Delete(key) +} + +// Len returns the length of the map. It is O(n) over the number of items. +func (m *Map[K, V]) Len() (count int) { + m.Map.Range(func(_, _ any) bool { + count++ + return true + }) + return count +} + +// Load returns the value stored in the map for a key, or nil if no value is present. +// The ok result indicates whether value was found in the map. +func (m *Map[K, V]) Load(key K) (value V, ok bool) { + val, ok := m.Map.Load(key) + if val == nil { + return *new(V), ok + } + return val.(V), ok +} + +// LoadAndDelete deletes the value for a key, returning the previous value if any. +// The loaded result reports whether the key was present. +func (m *Map[K, V]) LoadAndDelete(key K) (value V, loaded bool) { + val, loaded := m.Map.LoadAndDelete(key) + if val == nil { + return *new(V), loaded + } + return val.(V), loaded +} + +// LoadOrStore returns the existing value for the key if present. +// Otherwise, it stores and returns the given value. +// The loaded result is true if the value was loaded, false if stored. +func (m *Map[K, V]) LoadOrStore(key K, value V) (actual V, loaded bool) { + act, loaded := m.Map.LoadOrStore(key, value) + if act == nil { + return *new(V), loaded + } + return act.(V), loaded +} + +// Range calls f sequentially for each key and value present in the map. If f returns false, range stops the iteration. +func (m *Map[K, V]) Range(f func(key K, value V) bool) { + m.Map.Range(func(key, value any) bool { + return f(key.(K), value.(V)) + }) +} + +// Store sets the value for a key. +func (m *Map[K, V]) Store(key K, value V) { + m.Map.Store(key, value) +} diff --git a/vendor/fyne.io/fyne/v2/internal/async/map_clear.go b/vendor/fyne.io/fyne/v2/internal/async/map_clear.go new file mode 100644 index 0000000..d365103 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/async/map_clear.go @@ -0,0 +1,12 @@ +//go:build !go1.23 && !migrated_fynedo + +package async + +// Clear deletes all the entries, resulting in an empty Map. +// This is O(n) over the number of entries when not using Go 1.23 or newer. +func (m *Map[K, V]) Clear() { + m.Map.Range(func(key, _ any) bool { + m.Map.Delete(key) + return true + }) +} diff --git a/vendor/fyne.io/fyne/v2/internal/async/map_clear_go1.23.go b/vendor/fyne.io/fyne/v2/internal/async/map_clear_go1.23.go new file mode 100644 index 0000000..c3ea5d6 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/async/map_clear_go1.23.go @@ -0,0 +1,8 @@ +//go:build go1.23 && !migrated_fynedo + +package async + +// Clear deletes all the entries, resulting in an empty Map. +func (m *Map[K, V]) Clear() { + m.Map.Clear() // More efficient than O(n) range and delete in older Go. +} diff --git a/vendor/fyne.io/fyne/v2/internal/async/map_migratedfynedo.go b/vendor/fyne.io/fyne/v2/internal/async/map_migratedfynedo.go new file mode 100644 index 0000000..bd7fa39 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/async/map_migratedfynedo.go @@ -0,0 +1,72 @@ +//go:build migrated_fynedo + +package async + +// Map is a generic wrapper around [sync.Map]. +type Map[K any, V any] struct { + // Use "comparable" as type constraint and map[K]V as the inner type + // once Go 1.20 is our minimum version so interfaces can be used as keys. + m map[any]V +} + +// Delete deletes the value for a key. +func (m *Map[K, V]) Delete(key K) { + delete(m.m, key) +} + +// Len returns the length of the map. It is O(n) over the number of items. +func (m *Map[K, V]) Len() (count int) { + return len(m.m) +} + +// Load returns the value stored in the map for a key, or nil if no value is present. +// The ok result indicates whether value was found in the map. +func (m *Map[K, V]) Load(key K) (value V, ok bool) { + val, ok := m.m[key] + return val, ok +} + +// LoadAndDelete deletes the value for a key, returning the previous value if any. +// The loaded result reports whether the key was present. +func (m *Map[K, V]) LoadAndDelete(key K) (value V, loaded bool) { + val, ok := m.m[key] + delete(m.m, key) + return val, ok +} + +// LoadOrStore returns the existing value for the key if present. +// Otherwise, it stores and returns the given value. +// The loaded result is true if the value was loaded, false if stored. +func (m *Map[K, V]) LoadOrStore(key K, value V) (actual V, loaded bool) { + if m.m == nil { + m.m = make(map[any]V) + } + + if val, ok := m.m[key]; ok { + return val, true + } + m.m[key] = value + return value, false +} + +// Range calls f sequentially for each key and value present in the map. If f returns false, range stops the iteration. +func (m *Map[K, V]) Range(f func(key K, value V) bool) { + for k, v := range m.m { + if !f(k.(K), v) { + return + } + } +} + +// Store sets the value for a key. +func (m *Map[K, V]) Store(key K, value V) { + if m.m == nil { + m.m = make(map[any]V) + } + m.m[key] = value +} + +// Clear removes all entries from the map. +func (m *Map[K, V]) Clear() { + m.m = make(map[any]V) // Use range-and-delete loop once Go 1.20 is the minimum version. +} diff --git a/vendor/fyne.io/fyne/v2/internal/async/pool.go b/vendor/fyne.io/fyne/v2/internal/async/pool.go new file mode 100644 index 0000000..a65f748 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/async/pool.go @@ -0,0 +1,30 @@ +package async + +import "sync" + +// Implementation inspired by https://github.com/tailscale/tailscale/blob/main/syncs/pool.go. + +// Pool is the generic version of sync.Pool. +type Pool[T any] struct { + pool sync.Pool + + // New specifies a function to generate + // a value when Get would otherwise return the zero value of T. + New func() T +} + +// Get selects an arbitrary item from the Pool, removes it from the Pool, +// and returns it to the caller. +func (p *Pool[T]) Get() T { + x, ok := p.pool.Get().(T) + if !ok && p.New != nil { + return p.New() + } + + return x +} + +// Put adds x to the pool. +func (p *Pool[T]) Put(x T) { + p.pool.Put(x) +} diff --git a/vendor/fyne.io/fyne/v2/internal/async/queue.go b/vendor/fyne.io/fyne/v2/internal/async/queue.go new file mode 100644 index 0000000..71681ea --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/async/queue.go @@ -0,0 +1,92 @@ +//go:build !migrated_fynedo + +package async + +import ( + "sync/atomic" + + "fyne.io/fyne/v2" +) + +// CanvasObjectQueue implements lock-free FIFO freelist based queue. +// +// Reference: https://dl.acm.org/citation.cfm?doid=248052.248106 +type CanvasObjectQueue struct { + head atomic.Pointer[itemCanvasObject] + tail atomic.Pointer[itemCanvasObject] + len atomic.Uint64 +} + +// NewCanvasObjectQueue returns a queue for caching values. +func NewCanvasObjectQueue() *CanvasObjectQueue { + head := &itemCanvasObject{} + queue := &CanvasObjectQueue{} + queue.head.Store(head) + queue.tail.Store(head) + return queue +} + +type itemCanvasObject struct { + next atomic.Pointer[itemCanvasObject] + v fyne.CanvasObject +} + +var itemCanvasObjectPool = Pool[*itemCanvasObject]{ + New: func() *itemCanvasObject { return &itemCanvasObject{} }, +} + +// In puts the given value at the tail of the queue. +func (q *CanvasObjectQueue) In(v fyne.CanvasObject) { + i := itemCanvasObjectPool.Get() + i.next.Store(nil) + i.v = v + + var last, lastnext *itemCanvasObject + for { + last = q.tail.Load() + lastnext = last.next.Load() + if q.tail.Load() == last { + if lastnext == nil { + if last.next.CompareAndSwap(lastnext, i) { + q.tail.CompareAndSwap(last, i) + q.len.Add(1) + return + } + } else { + q.tail.CompareAndSwap(last, lastnext) + } + } + } +} + +// Out removes and returns the value at the head of the queue. +// It returns nil if the queue is empty. +func (q *CanvasObjectQueue) Out() fyne.CanvasObject { + var first, last, firstnext *itemCanvasObject + for { + first = q.head.Load() + last = q.tail.Load() + firstnext = first.next.Load() + if first == q.head.Load() { + if first == last { + if firstnext == nil { + return nil + } + + q.tail.CompareAndSwap(last, firstnext) + } else { + v := firstnext.v + if q.head.CompareAndSwap(first, firstnext) { + q.len.Add(^uint64(0)) + itemCanvasObjectPool.Put(first) + return v + } + } + } + } +} + +// Len returns the length of the queue. +func (q *CanvasObjectQueue) Len() uint64 { + return q.len.Load() +} diff --git a/vendor/fyne.io/fyne/v2/internal/async/queue_migratedfynedo.go b/vendor/fyne.io/fyne/v2/internal/async/queue_migratedfynedo.go new file mode 100644 index 0000000..2f12a86 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/async/queue_migratedfynedo.go @@ -0,0 +1,60 @@ +//go:build migrated_fynedo + +package async + +import "fyne.io/fyne/v2" + +const defaultQueueCapacity = 64 + +// CanvasObjectQueue represents a single-threaded queue for managing canvas objects using a ring buffer. +type CanvasObjectQueue struct { + buffer []fyne.CanvasObject + head int + size int +} + +// NewCanvasObjectQueue returns a queue for caching values with an initial capacity. +func NewCanvasObjectQueue() *CanvasObjectQueue { + return &CanvasObjectQueue{buffer: make([]fyne.CanvasObject, defaultQueueCapacity)} +} + +// In adds the given value to the tail of the queue. +// If the queue is full, it grows the buffer dynamically. +func (q *CanvasObjectQueue) In(v fyne.CanvasObject) { + if q.size == len(q.buffer) { + buffer := make([]fyne.CanvasObject, len(q.buffer)*2) + copy(buffer, q.buffer[q.head:]) + copy(buffer[len(q.buffer)-q.head:], q.buffer[:q.head]) + q.buffer = buffer + q.head = 0 + } + + tail := (q.head + q.size) % len(q.buffer) + q.buffer[tail] = v + q.size++ +} + +// Out removes and returns the value at the head of the queue. +// It returns nil if the queue is empty. +func (q *CanvasObjectQueue) Out() fyne.CanvasObject { + if q.size == 0 { + return nil + } + + first := q.buffer[q.head] + q.buffer[q.head] = nil + q.head = (q.head + 1) % len(q.buffer) + q.size-- + + if q.size == 0 && len(q.buffer) > 4*defaultQueueCapacity { + q.buffer = make([]fyne.CanvasObject, defaultQueueCapacity) + q.head = 0 + } + + return first +} + +// Len returns the number of items in the queue. +func (q *CanvasObjectQueue) Len() uint64 { + return uint64(q.size) +} diff --git a/vendor/fyne.io/fyne/v2/internal/build/animations_disabled.go b/vendor/fyne.io/fyne/v2/internal/build/animations_disabled.go new file mode 100644 index 0000000..4d5a83d --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/build/animations_disabled.go @@ -0,0 +1,7 @@ +//go:build no_animations + +package build + +// NoAnimations is true if the application was built without animations by +// passing the no_animations build tag. +const NoAnimations = true diff --git a/vendor/fyne.io/fyne/v2/internal/build/animations_enabled.go b/vendor/fyne.io/fyne/v2/internal/build/animations_enabled.go new file mode 100644 index 0000000..e1eba8f --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/build/animations_enabled.go @@ -0,0 +1,7 @@ +//go:build !no_animations + +package build + +// NoAnimations is true if the application was built without animations by +// passing the no_animations build tag. +const NoAnimations = false diff --git a/vendor/fyne.io/fyne/v2/internal/build/build.go b/vendor/fyne.io/fyne/v2/internal/build/build.go new file mode 100644 index 0000000..8567284 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/build/build.go @@ -0,0 +1,29 @@ +// Package build contains information about they type of build currently running. +package build + +import ( + "sync" + + "fyne.io/fyne/v2" +) + +var ( + migrateCheck sync.Once + + migratedFyneDo bool +) + +func MigratedToFyneDo() bool { + if DisableThreadChecks { + return true + } + + migrateCheck.Do(func() { + v, ok := fyne.CurrentApp().Metadata().Migrations["fyneDo"] + if ok { + migratedFyneDo = v + } + }) + + return migratedFyneDo +} diff --git a/vendor/fyne.io/fyne/v2/internal/build/driver_flatpak.go b/vendor/fyne.io/fyne/v2/internal/build/driver_flatpak.go new file mode 100644 index 0000000..0261f7b --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/build/driver_flatpak.go @@ -0,0 +1,6 @@ +//go:build flatpak + +package build + +// IsFlatpak is true if the binary is compiled for a Flatpak package. +const IsFlatpak = true diff --git a/vendor/fyne.io/fyne/v2/internal/build/driver_notflatpak.go b/vendor/fyne.io/fyne/v2/internal/build/driver_notflatpak.go new file mode 100644 index 0000000..2f891ba --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/build/driver_notflatpak.go @@ -0,0 +1,6 @@ +//go:build !flatpak + +package build + +// IsFlatpak is true if the binary is compiled for a Flatpak package. +const IsFlatpak = false diff --git a/vendor/fyne.io/fyne/v2/internal/build/driver_notwayland.go b/vendor/fyne.io/fyne/v2/internal/build/driver_notwayland.go new file mode 100644 index 0000000..ba398c2 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/build/driver_notwayland.go @@ -0,0 +1,6 @@ +//go:build !wayland + +package build + +// IsWayland is true when compiling for the wayland windowing system. +const IsWayland = false diff --git a/vendor/fyne.io/fyne/v2/internal/build/driver_wayland.go b/vendor/fyne.io/fyne/v2/internal/build/driver_wayland.go new file mode 100644 index 0000000..d48bb51 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/build/driver_wayland.go @@ -0,0 +1,6 @@ +//go:build wayland + +package build + +// IsWayland is true when compiling for the wayland windowing system. +const IsWayland = true diff --git a/vendor/fyne.io/fyne/v2/internal/build/hints_disabled.go b/vendor/fyne.io/fyne/v2/internal/build/hints_disabled.go new file mode 100644 index 0000000..f8919d0 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/build/hints_disabled.go @@ -0,0 +1,7 @@ +//go:build !hints + +package build + +// HasHints is false to indicate that hints are not currently switched on. +// To enable please rebuild with "-tags hints" parameters. +const HasHints = false diff --git a/vendor/fyne.io/fyne/v2/internal/build/hints_enabled.go b/vendor/fyne.io/fyne/v2/internal/build/hints_enabled.go new file mode 100644 index 0000000..db627a3 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/build/hints_enabled.go @@ -0,0 +1,6 @@ +//go:build hints + +package build + +// HasHints is true to indicate that hints are currently switched on. +const HasHints = true diff --git a/vendor/fyne.io/fyne/v2/internal/build/menu_integrated.go b/vendor/fyne.io/fyne/v2/internal/build/menu_integrated.go new file mode 100644 index 0000000..2b5365f --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/build/menu_integrated.go @@ -0,0 +1,6 @@ +//go:build !darwin || no_native_menus + +package build + +// HasNativeMenu is true if the app is built with support for native menu. +const HasNativeMenu = false diff --git a/vendor/fyne.io/fyne/v2/internal/build/menu_native.go b/vendor/fyne.io/fyne/v2/internal/build/menu_native.go new file mode 100644 index 0000000..7181e52 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/build/menu_native.go @@ -0,0 +1,6 @@ +//go:build darwin && !no_native_menus + +package build + +// HasNativeMenu is true if the app is built with support for native menu. +const HasNativeMenu = true diff --git a/vendor/fyne.io/fyne/v2/internal/build/metadata.go b/vendor/fyne.io/fyne/v2/internal/build/metadata.go new file mode 100644 index 0000000..fa525f9 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/build/metadata.go @@ -0,0 +1,6 @@ +//go:build !no_metadata + +package build + +// NoMetadata is false if the compiler flags have not turned off metadata support. +const NoMetadata = false diff --git a/vendor/fyne.io/fyne/v2/internal/build/metadata_disabled.go b/vendor/fyne.io/fyne/v2/internal/build/metadata_disabled.go new file mode 100644 index 0000000..6217e15 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/build/metadata_disabled.go @@ -0,0 +1,6 @@ +//go:build no_metadata + +package build + +// NoMetadata is true if the compiler flags have turned off metadata support. +const NoMetadata = true diff --git a/vendor/fyne.io/fyne/v2/internal/build/migrated_fynedo.go b/vendor/fyne.io/fyne/v2/internal/build/migrated_fynedo.go new file mode 100644 index 0000000..089f766 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/build/migrated_fynedo.go @@ -0,0 +1,6 @@ +//go:build migrated_fynedo + +package build + +// DisableThreadChecks disables the thread safety checks for performance. +const DisableThreadChecks = true diff --git a/vendor/fyne.io/fyne/v2/internal/build/migrated_notfynedo.go b/vendor/fyne.io/fyne/v2/internal/build/migrated_notfynedo.go new file mode 100644 index 0000000..a9fbdd5 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/build/migrated_notfynedo.go @@ -0,0 +1,6 @@ +//go:build !migrated_fynedo + +package build + +// DisableThreadChecks set to false enables the thread safety checks for logging of incorrect usage. +const DisableThreadChecks = false diff --git a/vendor/fyne.io/fyne/v2/internal/build/mode_debug.go b/vendor/fyne.io/fyne/v2/internal/build/mode_debug.go new file mode 100644 index 0000000..9658ddc --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/build/mode_debug.go @@ -0,0 +1,8 @@ +//go:build debug + +package build + +import "fyne.io/fyne/v2" + +// Mode is the application's build mode. +const Mode = fyne.BuildDebug diff --git a/vendor/fyne.io/fyne/v2/internal/build/mode_release.go b/vendor/fyne.io/fyne/v2/internal/build/mode_release.go new file mode 100644 index 0000000..3b6937e --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/build/mode_release.go @@ -0,0 +1,8 @@ +//go:build release + +package build + +import "fyne.io/fyne/v2" + +// Mode is the application's build mode. +const Mode = fyne.BuildRelease diff --git a/vendor/fyne.io/fyne/v2/internal/build/mode_standard.go b/vendor/fyne.io/fyne/v2/internal/build/mode_standard.go new file mode 100644 index 0000000..7565646 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/build/mode_standard.go @@ -0,0 +1,8 @@ +//go:build !debug && !release + +package build + +import "fyne.io/fyne/v2" + +// Mode is the application's build mode. +const Mode = fyne.BuildStandard diff --git a/vendor/fyne.io/fyne/v2/internal/cache/base.go b/vendor/fyne.io/fyne/v2/internal/cache/base.go new file mode 100644 index 0000000..0946566 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/cache/base.go @@ -0,0 +1,122 @@ +package cache + +import ( + "os" + "time" + + "fyne.io/fyne/v2" +) + +var ( + ValidDuration = 1 * time.Minute + cleanTaskInterval = ValidDuration / 2 + + lastClean time.Time + skippedCleanWithCanvasRefresh = false + + // testing purpose only + timeNow = time.Now +) + +func init() { + if t, err := time.ParseDuration(os.Getenv("FYNE_CACHE")); err == nil { + ValidDuration = t + cleanTaskInterval = ValidDuration / 2 + } +} + +// Clean run cache clean task, it should be called on paint events. +func Clean(canvasRefreshed bool) { + now := timeNow() + // do not run clean task too fast + if now.Sub(lastClean) < 10*time.Second { + if canvasRefreshed { + skippedCleanWithCanvasRefresh = true + } + return + } + if skippedCleanWithCanvasRefresh { + skippedCleanWithCanvasRefresh = false + canvasRefreshed = true + } + if !canvasRefreshed && now.Sub(lastClean) < cleanTaskInterval { + return + } + destroyExpiredSvgs(now) + destroyExpiredFontMetrics(now) + if canvasRefreshed { + // Destroy renderers on canvas refresh to avoid flickering screen. + destroyExpiredRenderers(now) + // canvases cache should be invalidated only on canvas refresh, otherwise there wouldn't + // be a way to recover them later + destroyExpiredCanvases(now) + } + lastClean = timeNow() +} + +// CleanCanvas performs a complete remove of all the objects that belong to the specified +// canvas. Usually used to free all objects from a closing windows. +func CleanCanvas(canvas fyne.Canvas) { + canvases.Range(func(obj fyne.CanvasObject, cinfo *canvasInfo) bool { + if cinfo.canvas != canvas { + return true + } + + canvases.Delete(obj) + + wid, ok := obj.(fyne.Widget) + if !ok { + return true + } + rinfo, ok := renderers.LoadAndDelete(wid) + if !ok { + return true + } + rinfo.renderer.Destroy() + overrides.Delete(wid) + return true + }) +} + +// ResetThemeCaches clears all the svg and text size cache maps +func ResetThemeCaches() { + svgs.Clear() + fontSizeCache.Clear() +} + +// destroyExpiredCanvases deletes objects from the canvases cache. +func destroyExpiredCanvases(now time.Time) { + canvases.Range(func(obj fyne.CanvasObject, cinfo *canvasInfo) bool { + if cinfo.isExpired(now) { + canvases.Delete(obj) + } + return true + }) +} + +// destroyExpiredRenderers deletes the renderer from the cache and calls +// renderer.Destroy() +func destroyExpiredRenderers(now time.Time) { + renderers.Range(func(wid fyne.Widget, rinfo *rendererInfo) bool { + if rinfo.isExpired(now) { + rinfo.renderer.Destroy() + overrides.Delete(wid) + renderers.Delete(wid) + } + return true + }) +} + +type expiringCache struct { + expires time.Time +} + +// isExpired check if the cache data is expired. +func (c *expiringCache) isExpired(now time.Time) bool { + return c.expires.Before(now) +} + +// setAlive updates expiration time. +func (c *expiringCache) setAlive() { + c.expires = timeNow().Add(ValidDuration) +} diff --git a/vendor/fyne.io/fyne/v2/internal/cache/canvases.go b/vendor/fyne.io/fyne/v2/internal/cache/canvases.go new file mode 100644 index 0000000..61514e1 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/cache/canvases.go @@ -0,0 +1,35 @@ +package cache + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/async" +) + +var canvases async.Map[fyne.CanvasObject, *canvasInfo] + +// GetCanvasForObject returns the canvas for the specified object. +func GetCanvasForObject(obj fyne.CanvasObject) fyne.Canvas { + cinfo, ok := canvases.Load(obj) + if cinfo == nil || !ok { + return nil + } + cinfo.setAlive() + return cinfo.canvas +} + +// SetCanvasForObject sets the canvas for the specified object. +// The passed function will be called if the item was not previously attached to this canvas +func SetCanvasForObject(obj fyne.CanvasObject, c fyne.Canvas, setup func()) { + cinfo := &canvasInfo{canvas: c} + cinfo.setAlive() + + old, found := canvases.LoadOrStore(obj, cinfo) + if (!found || old.canvas != c) && setup != nil { + setup() + } +} + +type canvasInfo struct { + expiringCache + canvas fyne.Canvas +} diff --git a/vendor/fyne.io/fyne/v2/internal/cache/svg.go b/vendor/fyne.io/fyne/v2/internal/cache/svg.go new file mode 100644 index 0000000..74a4e22 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/cache/svg.go @@ -0,0 +1,63 @@ +package cache + +import ( + "image" + "time" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/async" +) + +var svgs async.Map[string, *svgInfo] + +// GetSvg gets svg image from cache if it exists. +func GetSvg(name string, o fyne.CanvasObject, w int, h int) *image.NRGBA { + svginfo, ok := svgs.Load(overriddenName(name, o)) + if !ok || svginfo == nil { + return nil + } + + if svginfo.w != w || svginfo.h != h { + return nil + } + + svginfo.setAlive() + return svginfo.pix +} + +// SetSvg sets a svg into the cache map. +func SetSvg(name string, o fyne.CanvasObject, pix *image.NRGBA, w int, h int) { + sinfo := &svgInfo{ + pix: pix, + w: w, + h: h, + } + sinfo.setAlive() + svgs.Store(overriddenName(name, o), sinfo) +} + +type svgInfo struct { + expiringCache + pix *image.NRGBA + w, h int +} + +// destroyExpiredSvgs destroys expired svgs cache data. +func destroyExpiredSvgs(now time.Time) { + svgs.Range(func(key string, sinfo *svgInfo) bool { + if sinfo.isExpired(now) { + svgs.Delete(key) + } + return true + }) +} + +func overriddenName(name string, o fyne.CanvasObject) string { + if o != nil { // for overridden themes get the cache key right + if over, ok := overrides.Load(o); ok { + return over.cacheID + name + } + } + + return name +} diff --git a/vendor/fyne.io/fyne/v2/internal/cache/text.go b/vendor/fyne.io/fyne/v2/internal/cache/text.go new file mode 100644 index 0000000..d9eec25 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/cache/text.go @@ -0,0 +1,68 @@ +package cache + +import ( + "image/color" + "time" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/async" +) + +var fontSizeCache async.Map[fontSizeEntry, *fontMetric] + +type fontMetric struct { + expiringCache + size fyne.Size + baseLine float32 +} + +type fontSizeEntry struct { + Text string + Size float32 + Style fyne.TextStyle + Source string +} + +type FontCacheEntry struct { + fontSizeEntry + + Canvas fyne.Canvas + Color color.Color +} + +// GetFontMetrics looks up a calculated size and baseline required for the specified text parameters. +func GetFontMetrics(text string, fontSize float32, style fyne.TextStyle, source fyne.Resource) (size fyne.Size, base float32) { + name := "" + if source != nil { + name = source.Name() + } + ent := fontSizeEntry{text, fontSize, style, name} + ret, ok := fontSizeCache.Load(ent) + if !ok { + return fyne.Size{Width: 0, Height: 0}, 0 + } + ret.setAlive() + return ret.size, ret.baseLine +} + +// SetFontMetrics stores a calculated font size and baseline for parameters that were missing from the cache. +func SetFontMetrics(text string, fontSize float32, style fyne.TextStyle, source fyne.Resource, size fyne.Size, base float32) { + name := "" + if source != nil { + name = source.Name() + } + ent := fontSizeEntry{text, fontSize, style, name} + metric := &fontMetric{size: size, baseLine: base} + metric.setAlive() + fontSizeCache.Store(ent, metric) +} + +// destroyExpiredFontMetrics destroys expired fontSizeCache entries +func destroyExpiredFontMetrics(now time.Time) { + fontSizeCache.Range(func(k fontSizeEntry, v *fontMetric) bool { + if v.isExpired(now) { + fontSizeCache.Delete(k) + } + return true + }) +} diff --git a/vendor/fyne.io/fyne/v2/internal/cache/texture_common.go b/vendor/fyne.io/fyne/v2/internal/cache/texture_common.go new file mode 100644 index 0000000..59672e8 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/cache/texture_common.go @@ -0,0 +1,111 @@ +package cache + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/async" +) + +var ( + textTextures async.Map[FontCacheEntry, *textureInfo] + objectTextures async.Map[fyne.CanvasObject, *textureInfo] +) + +// DeleteTexture deletes the texture from the cache map. +func DeleteTexture(obj fyne.CanvasObject) { + objectTextures.Delete(obj) +} + +// GetTextTexture gets cached texture for a text run. +func GetTextTexture(ent FontCacheEntry) (TextureType, bool) { + texInfo, ok := textTextures.Load(ent) + if texInfo == nil || !ok { + return NoTexture, false + } + texInfo.setAlive() + return texInfo.texture, true +} + +// GetTexture gets cached texture. +func GetTexture(obj fyne.CanvasObject) (TextureType, bool) { + texInfo, ok := objectTextures.Load(obj) + if texInfo == nil || !ok { + return NoTexture, false + } + texInfo.setAlive() + return texInfo.texture, true +} + +// RangeExpiredTexturesFor range over the expired textures for the specified canvas. +// +// Note: If this is used to free textures, then it should be called inside a current +// gl context to ensure textures are deleted from gl. +func RangeExpiredTexturesFor(canvas fyne.Canvas, f func(fyne.CanvasObject)) { + now := timeNow() + + textTextures.Range(func(key FontCacheEntry, tinfo *textureInfo) bool { + // Just free text directly when that string/style combo is done. + if tinfo.isExpired(now) && tinfo.canvas == canvas { + textTextures.Delete(key) + tinfo.textFree() + } + return true + }) + + objectTextures.Range(func(obj fyne.CanvasObject, tinfo *textureInfo) bool { + if tinfo.isExpired(now) && tinfo.canvas == canvas { + f(obj) + } + return true + }) +} + +// RangeTexturesFor range over the textures for the specified canvas. +// It will not return the texture for a `canvas.Text` as their render lifecycle is handled separately. +// +// Note: If this is used to free textures, then it should be called inside a current +// gl context to ensure textures are deleted from gl. +func RangeTexturesFor(canvas fyne.Canvas, f func(fyne.CanvasObject)) { + // Do nothing for texture cache, it lives outside the scope of an object. + objectTextures.Range(func(obj fyne.CanvasObject, tinfo *textureInfo) bool { + if tinfo.canvas == canvas { + f(obj) + } + return true + }) +} + +// DeleteTextTexturesFor deletes all text textures for the given canvas. +func DeleteTextTexturesFor(canvas fyne.Canvas) { + textTextures.Range(func(key FontCacheEntry, tinfo *textureInfo) bool { + if tinfo.canvas == canvas { + textTextures.Delete(key) + tinfo.textFree() + } + return true + }) +} + +// SetTextTexture sets cached texture for a text run. +func SetTextTexture(ent FontCacheEntry, texture TextureType, canvas fyne.Canvas, free func()) { + tinfo := prepareTexture(texture, canvas, free) + textTextures.Store(ent, tinfo) +} + +// SetTexture sets cached texture. +func SetTexture(obj fyne.CanvasObject, texture TextureType, canvas fyne.Canvas) { + tinfo := prepareTexture(texture, canvas, nil) + objectTextures.Store(obj, tinfo) +} + +func prepareTexture(texture TextureType, canvas fyne.Canvas, free func()) *textureInfo { + tinfo := &textureInfo{texture: texture, textFree: free} + tinfo.canvas = canvas + tinfo.setAlive() + return tinfo +} + +// textureCacheBase defines base texture cache object. +type textureCacheBase struct { + expiringCache + canvas fyne.Canvas +} diff --git a/vendor/fyne.io/fyne/v2/internal/cache/texture_desktop.go b/vendor/fyne.io/fyne/v2/internal/cache/texture_desktop.go new file mode 100644 index 0000000..9627731 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/cache/texture_desktop.go @@ -0,0 +1,21 @@ +//go:build !android && !ios && !mobile && !wasm && !test_web_driver + +package cache + +// TextureType represents an uploaded GL texture +type TextureType = uint32 + +// NoTexture used when there is no valid texture +var NoTexture = TextureType(0) + +type textureInfo struct { + textureCacheBase + + texture TextureType + textFree func() +} + +// IsValid will return true if the passed texture is potentially a texture +func IsValid(texture TextureType) bool { + return texture != NoTexture +} diff --git a/vendor/fyne.io/fyne/v2/internal/cache/texture_gomobile.go b/vendor/fyne.io/fyne/v2/internal/cache/texture_gomobile.go new file mode 100644 index 0000000..14ea8cc --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/cache/texture_gomobile.go @@ -0,0 +1,22 @@ +//go:build android || ios || mobile + +package cache + +import "fyne.io/fyne/v2/internal/driver/mobile/gl" + +// TextureType represents an uploaded GL texture +type TextureType = gl.Texture + +var NoTexture = gl.Texture{0} + +type textureInfo struct { + textureCacheBase + + texture TextureType + textFree func() +} + +// IsValid will return true if the passed texture is potentially a texture +func IsValid(texture TextureType) bool { + return texture != NoTexture +} diff --git a/vendor/fyne.io/fyne/v2/internal/cache/texture_wasm.go b/vendor/fyne.io/fyne/v2/internal/cache/texture_wasm.go new file mode 100644 index 0000000..246f902 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/cache/texture_wasm.go @@ -0,0 +1,22 @@ +//go:build wasm || test_web_driver + +package cache + +import "github.com/fyne-io/gl-js" + +// TextureType represents an uploaded GL texture +type TextureType = gl.Texture + +var NoTexture = gl.NoTexture + +type textureInfo struct { + textureCacheBase + + texture TextureType + textFree func() +} + +// IsValid will return true if the passed texture is potentially a texture +func IsValid(texture TextureType) bool { + return gl.Texture(texture).IsValid() +} diff --git a/vendor/fyne.io/fyne/v2/internal/cache/theme.go b/vendor/fyne.io/fyne/v2/internal/cache/theme.go new file mode 100644 index 0000000..f199843 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/cache/theme.go @@ -0,0 +1,93 @@ +package cache + +import ( + "strconv" + "sync/atomic" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/async" +) + +var ( + overrides async.Map[fyne.CanvasObject, *overrideScope] + overrideCount atomic.Uint32 +) + +type overrideScope struct { + th fyne.Theme + cacheID string +} + +// OverrideTheme allows an app to specify that a single object should use a different theme to the app. +// This should be used sparingly to avoid a jarring user experience. +// If the object is a container it will theme the children, if it is a canvas primitive it will do nothing. +// +// Since: 2.5 +func OverrideTheme(o fyne.CanvasObject, th fyne.Theme) { + id := overrideCount.Add(1) + s := &overrideScope{th: th, cacheID: strconv.Itoa(int(id))} + overrideTheme(o, s) +} + +func OverrideThemeMatchingScope(o, parent fyne.CanvasObject) bool { + scope, ok := overrides.Load(parent) + if !ok { // not overridden in parent + return false + } + + overrideTheme(o, scope) + return true +} + +func WidgetScopeID(o fyne.CanvasObject) string { + scope, ok := overrides.Load(o) + if !ok { + return "" + } + + return scope.cacheID +} + +func WidgetTheme(o fyne.CanvasObject) fyne.Theme { + scope, ok := overrides.Load(o) + if !ok { + return nil + } + + return scope.th +} + +func overrideContainer(c *fyne.Container, s *overrideScope) { + for _, o := range c.Objects { + overrideTheme(o, s) + } +} + +func overrideTheme(o fyne.CanvasObject, s *overrideScope) { + if _, ok := o.(interface{ SetDeviceIsMobile(bool) }); ok { // ThemeOverride without the import loop + return // do not apply this theme over a new scope + } + + switch c := o.(type) { + case fyne.Widget: + overrideWidget(c, s) + case *fyne.Container: + overrideContainer(c, s) + default: + overrides.Store(c, s) + } +} + +func overrideWidget(w fyne.Widget, s *overrideScope) { + ResetThemeCaches() + overrides.Store(w, s) + + r := Renderer(w) + if r == nil { + return + } + + for _, o := range r.Objects() { + overrideTheme(o, s) + } +} diff --git a/vendor/fyne.io/fyne/v2/internal/cache/widget.go b/vendor/fyne.io/fyne/v2/internal/cache/widget.go new file mode 100644 index 0000000..c3eee5a --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/cache/widget.go @@ -0,0 +1,74 @@ +package cache + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/async" +) + +var renderers async.Map[fyne.Widget, *rendererInfo] + +type isBaseWidget interface { + ExtendBaseWidget(fyne.Widget) + super() fyne.Widget +} + +// Renderer looks up the render implementation for a widget +// If one does not exist, it creates and caches a renderer for the widget. +func Renderer(wid fyne.Widget) fyne.WidgetRenderer { + renderer, ok := CachedRenderer(wid) + if !ok && wid != nil { + renderer = wid.CreateRenderer() + rinfo := &rendererInfo{renderer: renderer} + rinfo.setAlive() + renderers.Store(wid, rinfo) + } + + return renderer +} + +// CachedRenderer looks up the cached render implementation for a widget +// If a renderer does not exist in the cache, it returns nil, false. +func CachedRenderer(wid fyne.Widget) (fyne.WidgetRenderer, bool) { + if wid == nil { + return nil, false + } + + if wd, ok := wid.(isBaseWidget); ok { + if wd.super() != nil { + wid = wd.super() + } + } + + rinfo, ok := renderers.Load(wid) + if !ok { + return nil, false + } + + rinfo.setAlive() + return rinfo.renderer, true +} + +// DestroyRenderer frees a render implementation for a widget. +// This is typically for internal use only. +func DestroyRenderer(wid fyne.Widget) { + rinfo, ok := renderers.LoadAndDelete(wid) + if !ok { + return + } + if rinfo != nil { + rinfo.renderer.Destroy() + } + overrides.Delete(wid) +} + +// IsRendered returns true of the widget currently has a renderer. +// One will be created the first time a widget is shown but may be removed after it is hidden. +func IsRendered(wid fyne.Widget) bool { + _, found := renderers.Load(wid) + return found +} + +type rendererInfo struct { + expiringCache + renderer fyne.WidgetRenderer +} diff --git a/vendor/fyne.io/fyne/v2/internal/clip.go b/vendor/fyne.io/fyne/v2/internal/clip.go new file mode 100644 index 0000000..dc1ddbc --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/clip.go @@ -0,0 +1,89 @@ +package internal + +import "fyne.io/fyne/v2" + +// ClipStack keeps track of the areas that should be clipped when drawing a canvas. +// If no clips are present then adding one will be added as-is. +// Subsequent items pushed will be completely within the previous clip. +type ClipStack struct { + clips []*ClipItem +} + +// Pop removes the current top clip and returns it. +func (c *ClipStack) Pop() *ClipItem { + if len(c.clips) == 0 { + return nil + } + + top := len(c.clips) - 1 + ret := c.clips[top] + c.clips[top] = nil // release memory reference + c.clips = c.clips[:top] + return ret +} + +// Length returns the number of items in this clip stack. 0 means no clip. +func (c *ClipStack) Length() int { + return len(c.clips) +} + +// Push a new clip onto this stack at position and size specified. +// The returned clip item is the result of calculating the intersection of the requested clip and its parent. +func (c *ClipStack) Push(p fyne.Position, s fyne.Size) *ClipItem { + outer := c.Top() + inner := outer.Intersect(p, s) + + c.clips = append(c.clips, inner) + return inner +} + +// Top returns the current clip item - it will always be within the bounds of any parent clips. +func (c *ClipStack) Top() *ClipItem { + if len(c.clips) == 0 { + return nil + } + + return c.clips[len(c.clips)-1] +} + +// ClipItem represents a single clip in a clip stack, denoted by a size and position. +type ClipItem struct { + pos fyne.Position + size fyne.Size +} + +// Rect returns the position and size parameters of the clip. +func (i *ClipItem) Rect() (fyne.Position, fyne.Size) { + return i.pos, i.size +} + +// Intersect returns a new clip item that is the intersection of the requested parameters and this clip. +func (i *ClipItem) Intersect(p fyne.Position, s fyne.Size) *ClipItem { + ret := &ClipItem{p, s} + if i == nil { + return ret + } + + if ret.pos.X < i.pos.X { + ret.pos.X = i.pos.X + ret.size.Width -= i.pos.X - p.X + } + if ret.pos.Y < i.pos.Y { + ret.pos.Y = i.pos.Y + ret.size.Height -= i.pos.Y - p.Y + } + + if p.X+s.Width > i.pos.X+i.size.Width { + ret.size.Width = (i.pos.X + i.size.Width) - ret.pos.X + } + if p.Y+s.Height > i.pos.Y+i.size.Height { + ret.size.Height = (i.pos.Y + i.size.Height) - ret.pos.Y + } + + if ret.size.Width < 0 || ret.size.Height < 0 { + ret.size = fyne.NewSize(0, 0) + return ret + } + + return ret +} diff --git a/vendor/fyne.io/fyne/v2/internal/color/color.go b/vendor/fyne.io/fyne/v2/internal/color/color.go new file mode 100644 index 0000000..b0671c7 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/color/color.go @@ -0,0 +1,97 @@ +package color + +import ( + "image/color" +) + +// ToNRGBA converts a color to RGBA values which are not premultiplied, unlike color.RGBA(). +func ToNRGBA(c color.Color) (r, g, b, a int) { + // We use UnmultiplyAlpha with RGBA, RGBA64, and unrecognized implementations of Color. + // It works for all Colors whose RGBA() method is implemented according to spec, but is only necessary for those. + // Only RGBA and RGBA64 have components which are already premultiplied. + switch col := c.(type) { + // NRGBA and NRGBA64 are not premultiplied + case color.NRGBA: + r = int(col.R) + g = int(col.G) + b = int(col.B) + a = int(col.A) + case *color.NRGBA: + r = int(col.R) + g = int(col.G) + b = int(col.B) + a = int(col.A) + case color.NRGBA64: + r = int(col.R) >> 8 + g = int(col.G) >> 8 + b = int(col.B) >> 8 + a = int(col.A) >> 8 + case *color.NRGBA64: + r = int(col.R) >> 8 + g = int(col.G) >> 8 + b = int(col.B) >> 8 + a = int(col.A) >> 8 + // Gray and Gray16 have no alpha component + case *color.Gray: + r = int(col.Y) + g = int(col.Y) + b = int(col.Y) + a = 0xff + case color.Gray: + r = int(col.Y) + g = int(col.Y) + b = int(col.Y) + a = 0xff + case *color.Gray16: + r = int(col.Y) >> 8 + g = int(col.Y) >> 8 + b = int(col.Y) >> 8 + a = 0xff + case color.Gray16: + r = int(col.Y) >> 8 + g = int(col.Y) >> 8 + b = int(col.Y) >> 8 + a = 0xff + // Alpha and Alpha16 contain only an alpha component. + case color.Alpha: + r = 0xff + g = 0xff + b = 0xff + a = int(col.A) + case *color.Alpha: + r = 0xff + g = 0xff + b = 0xff + a = int(col.A) + case color.Alpha16: + r = 0xff + g = 0xff + b = 0xff + a = int(col.A) >> 8 + case *color.Alpha16: + r = 0xff + g = 0xff + b = 0xff + a = int(col.A) >> 8 + default: // RGBA, RGBA64, and unknown implementations of Color + r, g, b, a = unmultiplyAlpha(c) + } + return r, g, b, a +} + +// unmultiplyAlpha returns a color's RGBA components as 8-bit integers by calling c.RGBA() and then removing the alpha premultiplication. +// It is only used by ToRGBA. +func unmultiplyAlpha(c color.Color) (r, g, b, a int) { + red, green, blue, alpha := c.RGBA() + if alpha != 0 && alpha != 0xffff { + red = (red * 0xffff) / alpha + green = (green * 0xffff) / alpha + blue = (blue * 0xffff) / alpha + } + // Convert from range 0-65535 to range 0-255 + r = int(red >> 8) + g = int(green >> 8) + b = int(blue >> 8) + a = int(alpha >> 8) + return r, g, b, a +} diff --git a/vendor/fyne.io/fyne/v2/internal/docs.go b/vendor/fyne.io/fyne/v2/internal/docs.go new file mode 100644 index 0000000..a0ef109 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/docs.go @@ -0,0 +1,141 @@ +package internal + +import ( + "errors" + "net/url" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/storage" +) + +var errNoAppID = errors.New("storage API requires a unique ID, use app.NewWithID()") + +// Docs is an internal implementation of the document features of the Storage interface. +// It is based on top of the current `file` repository and is rooted at RootDocURI. +type Docs struct { + RootDocURI fyne.URI +} + +// Create will create a new document ready for writing, you must write something and close the returned writer +// for the create process to complete. +// If the document for this app with that name already exists a storage.ErrAlreadyExists error will be returned. +func (d *Docs) Create(name string) (fyne.URIWriteCloser, error) { + if d.RootDocURI == nil { + return nil, errNoAppID + } + + err := d.ensureRootExists() + if err != nil { + return nil, err + } + + u, err := d.childURI(name) + if err != nil { + return nil, err + } + + exists, err := storage.Exists(u) + if err != nil { + return nil, err + } + if exists { + return nil, storage.ErrAlreadyExists + } + + return storage.Writer(u) +} + +// List returns all documents that have been saved by the current application. +// Remember to use `app.NewWithID` so that your storage is unique. +func (d *Docs) List() []string { + if d.RootDocURI == nil { + return nil + } + + uris, err := storage.List(d.RootDocURI) + if err != nil { + return nil + } + + ret := make([]string, len(uris)) + for i, u := range uris { + ret[i] = u.Name() + if d.RootDocURI.Scheme() != "file" { + ret[i], _ = url.PathUnescape(u.Name()) + } + } + + return ret +} + +// Open will grant access to the contents of the named file. If an error occurs it is returned instead. +func (d *Docs) Open(name string) (fyne.URIReadCloser, error) { + if d.RootDocURI == nil { + return nil, errNoAppID + } + + u, err := d.childURI(name) + if err != nil { + return nil, err + } + + return storage.Reader(u) +} + +// Remove will delete the document with the specified name, if it exists +func (d *Docs) Remove(name string) error { + if d.RootDocURI == nil { + return errNoAppID + } + + u, err := d.childURI(name) + if err != nil { + return err + } + + return storage.Delete(u) +} + +// Save will open a document ready for writing, you close the returned writer for the save to complete. +// If the document for this app with that name does not exist a storage.ErrNotExists error will be returned. +func (d *Docs) Save(name string) (fyne.URIWriteCloser, error) { + if d.RootDocURI == nil { + return nil, errNoAppID + } + + u, err := d.childURI(name) + if err != nil { + return nil, err + } + + exists, err := storage.Exists(u) + if err != nil { + return nil, err + } + if !exists { + return nil, storage.ErrNotExists + } + + return storage.Writer(u) +} + +func (d *Docs) ensureRootExists() error { + exists, err := storage.Exists(d.RootDocURI) + if err != nil { + return err + } + if exists { + return nil + } + + return storage.CreateListable(d.RootDocURI) +} + +func (d *Docs) childURI(name string) (fyne.URI, error) { + encoded := name + if d.RootDocURI.Scheme() != "file" { + encoded = url.PathEscape(name) + } + + return storage.Child(d.RootDocURI, encoded) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/common/canvas.go b/vendor/fyne.io/fyne/v2/internal/driver/common/canvas.go new file mode 100644 index 0000000..faf6827 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/common/canvas.go @@ -0,0 +1,483 @@ +package common + +import ( + "image/color" + "reflect" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/internal" + "fyne.io/fyne/v2/internal/app" + "fyne.io/fyne/v2/internal/async" + "fyne.io/fyne/v2/internal/cache" + "fyne.io/fyne/v2/internal/driver" + "fyne.io/fyne/v2/internal/painter/gl" + "fyne.io/fyne/v2/internal/theme" +) + +// SizeableCanvas defines a canvas with size related functions. +type SizeableCanvas interface { + fyne.Canvas + Resize(fyne.Size) + MinSize() fyne.Size +} + +// Canvas defines common canvas implementation. +type Canvas struct { + OnFocus func(obj fyne.Focusable) + OnUnfocus func() + + impl SizeableCanvas + + contentFocusMgr *app.FocusManager + menuFocusMgr *app.FocusManager + overlays overlayStack + + shortcut fyne.ShortcutHandler + + painter gl.Painter + + // Any object that requests to enter to the refresh queue should + // not be omitted as it is always a rendering task's decision + // for skipping frames or drawing calls. + // + // If an object failed to ender the refresh queue, the object may + // disappear or blink from the view at any frames. As of this reason, + // the refreshQueue is an unbounded queue which is able to cache + // arbitrary number of fyne.CanvasObject for the rendering. + refreshQueue deduplicatedObjectQueue + dirty bool + + mWindowHeadTree, contentTree, menuTree *renderCacheTree +} + +// AddShortcut adds a shortcut to the canvas. +func (c *Canvas) AddShortcut(shortcut fyne.Shortcut, handler func(shortcut fyne.Shortcut)) { + c.shortcut.AddShortcut(shortcut, handler) +} + +func (c *Canvas) DrawDebugOverlay(obj fyne.CanvasObject, pos fyne.Position, size fyne.Size) { + switch obj.(type) { + case fyne.Widget: + r := canvas.NewRectangle(color.Transparent) + r.StrokeColor = color.NRGBA{R: 0xcc, G: 0x33, B: 0x33, A: 0xff} + r.StrokeWidth = 1 + r.Resize(obj.Size()) + c.Painter().Paint(r, pos, size) + + t := canvas.NewText(reflect.ValueOf(obj).Elem().Type().Name(), r.StrokeColor) + t.TextSize = 10 + c.Painter().Paint(t, pos.AddXY(2, 2), size) + case *fyne.Container: + r := canvas.NewRectangle(color.Transparent) + r.StrokeColor = color.NRGBA{R: 0x33, G: 0x33, B: 0xcc, A: 0xff} + r.StrokeWidth = 1 + r.Resize(obj.Size()) + c.Painter().Paint(r, pos, size) + } +} + +// EnsureMinSize ensure canvas min size. +// +// This function uses lock. +func (c *Canvas) EnsureMinSize() bool { + if c.impl.Content() == nil { + return false + } + windowNeedsMinSizeUpdate := false + csize := c.impl.Size() + min := c.impl.MinSize() + + var parentNeedingUpdate *RenderCacheNode + + setup := func(node *RenderCacheNode, pos fyne.Position) { + if !node.obj.Visible() { + return + } + if th, ok := node.Obj().(*container.ThemeOverride); ok { + theme.PushRenderingTheme(th.Theme) + } + } + ensureMinSize := func(node *RenderCacheNode, pos fyne.Position) { + obj := node.obj + cache.SetCanvasForObject(obj, c.impl, func() { + if img, ok := obj.(*canvas.Image); ok { + img.Refresh() // this may now have a different texScale + } + }) + + if parentNeedingUpdate == node { + c.updateLayout(obj) + parentNeedingUpdate = nil + } + + if !obj.Visible() { + return + } + minSize := obj.MinSize() + + minSizeChanged := node.minSize != minSize + if minSizeChanged { + node.minSize = minSize + if node.parent != nil { + parentNeedingUpdate = node.parent + } else { + windowNeedsMinSizeUpdate = true + size := obj.Size() + expectedSize := minSize.Max(size) + if expectedSize != size && size != csize { + obj.Resize(expectedSize) + } else { + c.updateLayout(obj) + } + } + } + + if _, ok := node.Obj().(*container.ThemeOverride); ok { + theme.PopRenderingTheme() + } + } + c.WalkTrees(setup, ensureMinSize) + + shouldResize := windowNeedsMinSizeUpdate && (csize.Width < min.Width || csize.Height < min.Height) + if shouldResize { + c.impl.Resize(csize.Max(min)) + } + return windowNeedsMinSizeUpdate +} + +// Focus makes the provided item focused. +func (c *Canvas) Focus(obj fyne.Focusable) { + focusMgr := c.focusManager() + if focusMgr != nil && focusMgr.Focus(obj) { // fast path – probably >99.9% of all cases + if c.OnFocus != nil { + c.OnFocus(obj) + } + return + } + + focusMgrs := append([]*app.FocusManager{c.contentFocusMgr, c.menuFocusMgr}, c.overlays.ListFocusManagers()...) + + for _, mgr := range focusMgrs { + if mgr == nil { + continue + } + if focusMgr != mgr && mgr.Focus(obj) { + if c.OnFocus != nil { + c.OnFocus(obj) + } + return + } + } + + fyne.LogError("Failed to focus object which is not part of the canvas’ content, menu or overlays.", nil) +} + +// Focused returns the current focused object. +func (c *Canvas) Focused() fyne.Focusable { + mgr := c.focusManager() + if mgr == nil { + return nil + } + return mgr.Focused() +} + +// FocusGained signals to the manager that its content got focus. +// Valid only on Desktop. +func (c *Canvas) FocusGained() { + mgr := c.focusManager() + if mgr == nil { + return + } + mgr.FocusGained() +} + +// FocusLost signals to the manager that its content lost focus. +// Valid only on Desktop. +func (c *Canvas) FocusLost() { + mgr := c.focusManager() + if mgr == nil { + return + } + mgr.FocusLost() +} + +// FocusNext focuses the next focusable item. +func (c *Canvas) FocusNext() { + mgr := c.focusManager() + if mgr == nil { + return + } + mgr.FocusNext() +} + +// FocusPrevious focuses the previous focusable item. +func (c *Canvas) FocusPrevious() { + mgr := c.focusManager() + if mgr == nil { + return + } + mgr.FocusPrevious() +} + +// FreeDirtyTextures frees dirty textures and returns the number of freed textures. +func (c *Canvas) FreeDirtyTextures() uint64 { + if c.painter == nil { + return 0 + } + + objectsToFree := c.refreshQueue.Len() + for object := c.refreshQueue.Out(); object != nil; object = c.refreshQueue.Out() { + c.freeObject(object) + } + + cache.RangeExpiredTexturesFor(c.impl, c.painter.Free) + return objectsToFree +} + +// Initialize initializes the canvas. +func (c *Canvas) Initialize(impl SizeableCanvas, onOverlayChanged func()) { + c.impl = impl + c.refreshQueue.queue = async.NewCanvasObjectQueue() + c.overlays.OverlayStack = internal.OverlayStack{ + OnChange: onOverlayChanged, + Canvas: impl, + } +} + +// ObjectTrees return canvas object trees. +// +// This function uses lock. +func (c *Canvas) ObjectTrees() []fyne.CanvasObject { + var content, menu fyne.CanvasObject + if c.contentTree != nil && c.contentTree.root != nil { + content = c.contentTree.root.obj + } + if c.menuTree != nil && c.menuTree.root != nil { + menu = c.menuTree.root.obj + } + trees := make([]fyne.CanvasObject, 0, len(c.Overlays().List())+2) + trees = append(trees, content) + if menu != nil { + trees = append(trees, menu) + } + trees = append(trees, c.Overlays().List()...) + return trees +} + +// Overlays returns the overlay stack. +func (c *Canvas) Overlays() fyne.OverlayStack { + return &c.overlays +} + +// Painter returns the canvas painter. +func (c *Canvas) Painter() gl.Painter { + return c.painter +} + +// Refresh refreshes a canvas object. +func (c *Canvas) Refresh(obj fyne.CanvasObject) { + c.refreshQueue.In(obj) + async.EnsureMain(c.SetDirty) +} + +// RemoveShortcut removes a shortcut from the canvas. +func (c *Canvas) RemoveShortcut(shortcut fyne.Shortcut) { + c.shortcut.RemoveShortcut(shortcut) +} + +// SetContentTreeAndFocusMgr sets content tree and focus manager. +// +// This function does not use the canvas lock. +func (c *Canvas) SetContentTreeAndFocusMgr(content fyne.CanvasObject) { + c.contentTree = &renderCacheTree{root: &RenderCacheNode{obj: content}} + + newFocusMgr := app.NewFocusManager(content) + if c.contentFocusMgr != nil { + focused := c.contentFocusMgr.Focused() + if focused != nil { + newFocusMgr.Focus(focused) // Focus old object if possible. + } + } + c.contentFocusMgr = newFocusMgr +} + +// CheckDirtyAndClear returns true if the canvas is dirty and +// clears the dirty state atomically. +func (c *Canvas) CheckDirtyAndClear() bool { + wasDirty := c.dirty + c.dirty = false + return wasDirty +} + +// SetDirty sets canvas dirty flag atomically. +func (c *Canvas) SetDirty() { + c.dirty = true +} + +// SetMenuTreeAndFocusMgr sets menu tree and focus manager. +// +// This function does not use the canvas lock. +func (c *Canvas) SetMenuTreeAndFocusMgr(menu fyne.CanvasObject) { + c.menuTree = &renderCacheTree{root: &RenderCacheNode{obj: menu}} + if menu != nil { + c.menuFocusMgr = app.NewFocusManager(menu) + } else { + c.menuFocusMgr = nil + } +} + +// SetMobileWindowHeadTree sets window head tree. +// +// This function does not use the canvas lock. +func (c *Canvas) SetMobileWindowHeadTree(head fyne.CanvasObject) { + c.mWindowHeadTree = &renderCacheTree{root: &RenderCacheNode{obj: head}} +} + +// SetPainter sets the canvas painter. +func (c *Canvas) SetPainter(p gl.Painter) { + c.painter = p +} + +// TypedShortcut handle the registered shortcut. +func (c *Canvas) TypedShortcut(shortcut fyne.Shortcut) { + c.shortcut.TypedShortcut(shortcut) +} + +// Unfocus unfocuses all the objects in the canvas. +func (c *Canvas) Unfocus() { + mgr := c.focusManager() + if mgr == nil { + return + } + if mgr.Focus(nil) && c.OnUnfocus != nil { + c.OnUnfocus() + } +} + +// WalkTrees walks over the trees. +func (c *Canvas) WalkTrees( + beforeChildren func(*RenderCacheNode, fyne.Position), + afterChildren func(*RenderCacheNode, fyne.Position), +) { + c.walkTree(c.contentTree, beforeChildren, afterChildren) + if c.mWindowHeadTree != nil && c.mWindowHeadTree.root.obj != nil { + c.walkTree(c.mWindowHeadTree, beforeChildren, afterChildren) + } + if c.menuTree != nil && c.menuTree.root.obj != nil { + c.walkTree(c.menuTree, beforeChildren, afterChildren) + } + for _, tree := range c.overlays.renderCaches { + if tree != nil { + c.walkTree(tree, beforeChildren, afterChildren) + } + } +} + +func (c *Canvas) focusManager() *app.FocusManager { + if focusMgr := c.overlays.TopFocusManager(); focusMgr != nil { + return focusMgr + } + if c.isMenuActive() { + return c.menuFocusMgr + } + return c.contentFocusMgr +} + +func (c *Canvas) freeObject(object fyne.CanvasObject) { + // Image.Refresh will trigger a refresh specific to the object, + // while recursing on parent widget would just lead to a double texture upload. + if img, ok := object.(*canvas.Image); ok { + c.painter.Free(img) + return + } + + driver.WalkCompleteObjectTree(object, func(obj fyne.CanvasObject, _ fyne.Position, _ fyne.Position, _ fyne.Size) bool { + if _, ok := obj.(*canvas.Image); !ok { // No image refresh while recursing to avoid double texture upload. + c.painter.Free(obj) + } + return false + }, nil) +} + +func (c *Canvas) isMenuActive() bool { + if c.menuTree == nil || c.menuTree.root == nil || c.menuTree.root.obj == nil { + return false + } + menu := c.menuTree.root.obj + if am, ok := menu.(activatableMenu); ok { + return am.IsActive() + } + return true +} + +func (c *Canvas) walkTree( + tree *renderCacheTree, + beforeChildren func(*RenderCacheNode, fyne.Position), + afterChildren func(*RenderCacheNode, fyne.Position), +) { + var node, parent, prev *RenderCacheNode + node = tree.root + + bc := func(obj fyne.CanvasObject, pos fyne.Position, _ fyne.Position, _ fyne.Size) bool { + if node != nil && node.obj != obj { + if parent.firstChild == node { + parent.firstChild = nil + } + node = nil + } + if node == nil { + node = &RenderCacheNode{parent: parent, obj: obj} + if parent.firstChild == nil { + parent.firstChild = node + } else { + prev.nextSibling = node + } + } + if prev != nil && prev.parent != parent { + prev = nil + } + + if beforeChildren != nil { + beforeChildren(node, pos) + } + + parent = node + node = parent.firstChild + return false + } + ac := func(obj fyne.CanvasObject, pos fyne.Position, _ fyne.CanvasObject) { + node = parent + parent = node.parent + if prev != nil && prev.parent != parent { + prev.nextSibling = nil + } + + if afterChildren != nil { + afterChildren(node, pos) + } + + prev = node + node = node.nextSibling + } + driver.WalkVisibleObjectTree(tree.root.obj, bc, ac) +} + +type activatableMenu interface { + IsActive() bool +} + +func (c *Canvas) updateLayout(objToLayout fyne.CanvasObject) { + switch cont := objToLayout.(type) { + case *fyne.Container: + if cont.Layout != nil { + layout := cont.Layout + objects := cont.Objects + layout.Layout(objects, cont.Size()) + } + case fyne.Widget: + renderer := cache.Renderer(cont) + renderer.Layout(cont.Size()) + } +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/common/driver.go b/vendor/fyne.io/fyne/v2/internal/driver/common/driver.go new file mode 100644 index 0000000..bcca9b8 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/common/driver.go @@ -0,0 +1,11 @@ +package common + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/cache" +) + +// CanvasForObject returns the canvas for the specified object. +func CanvasForObject(obj fyne.CanvasObject) fyne.Canvas { + return cache.GetCanvasForObject(obj) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/common/structures.go b/vendor/fyne.io/fyne/v2/internal/driver/common/structures.go new file mode 100644 index 0000000..1073498 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/common/structures.go @@ -0,0 +1,95 @@ +package common + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal" + "fyne.io/fyne/v2/internal/async" + "fyne.io/fyne/v2/internal/build" +) + +type deduplicatedObjectQueue struct { + queue *async.CanvasObjectQueue + dedup async.Map[fyne.CanvasObject, struct{}] +} + +// In adds an object to the queue if it is not already present. +func (q *deduplicatedObjectQueue) In(obj fyne.CanvasObject) { + _, exists := q.dedup.Load(obj) + if exists { + return + } + + q.queue.In(obj) + q.dedup.Store(obj, struct{}{}) +} + +// Out removes and returns the next object from the queue. +// It assumes that the whole queue is drained and defers clearing +// the deduplication map until it is empty. +func (q *deduplicatedObjectQueue) Out() fyne.CanvasObject { + if q.queue.Len() == 0 { + q.dedup.Clear() + return nil + } + + out := q.queue.Out() + if !build.MigratedToFyneDo() { + q.dedup.Delete(out) + } + return out +} + +// Len returns the number of elements in the queue. +func (q *deduplicatedObjectQueue) Len() uint64 { + return q.queue.Len() +} + +type renderCacheTree struct { + root *RenderCacheNode +} + +// RenderCacheNode represents a node in a render cache tree. +type RenderCacheNode struct { + // structural data + firstChild *RenderCacheNode + nextSibling *RenderCacheNode + obj fyne.CanvasObject + parent *RenderCacheNode + // cache data + minSize fyne.Size +} + +// Obj returns the node object. +func (r *RenderCacheNode) Obj() fyne.CanvasObject { + return r.obj +} + +type overlayStack struct { + internal.OverlayStack + + renderCaches []*renderCacheTree +} + +func (o *overlayStack) Add(overlay fyne.CanvasObject) { + if overlay == nil { + return + } + + o.renderCaches = append(o.renderCaches, &renderCacheTree{root: &RenderCacheNode{obj: overlay}}) + o.OverlayStack.Add(overlay) +} + +func (o *overlayStack) Remove(overlay fyne.CanvasObject) { + if overlay == nil || len(o.List()) == 0 { + return + } + + o.OverlayStack.Remove(overlay) + overlayCount := len(o.List()) + + for i := overlayCount; i < len(o.renderCaches); i++ { + o.renderCaches[i] = nil // release memory reference to removed element + } + + o.renderCaches = o.renderCaches[:overlayCount] +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/common/window.go b/vendor/fyne.io/fyne/v2/internal/driver/common/window.go new file mode 100644 index 0000000..afa8946 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/common/window.go @@ -0,0 +1,11 @@ +package common + +import ( + "fyne.io/fyne/v2/internal/async" +) + +var DonePool = async.Pool[chan struct{}]{ + New: func() chan struct{} { + return make(chan struct{}) + }, +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/context.go b/vendor/fyne.io/fyne/v2/internal/driver/context.go new file mode 100644 index 0000000..925eabb --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/context.go @@ -0,0 +1,9 @@ +package driver + +// WithContext allows drivers to execute within another context. +// Mostly this helps GLFW code execute within the painter's GL context. +type WithContext interface { + RunWithContext(f func()) + RescaleContext() + Context() any +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/embedded/device.go b/vendor/fyne.io/fyne/v2/internal/driver/embedded/device.go new file mode 100644 index 0000000..5d6d91a --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/embedded/device.go @@ -0,0 +1,31 @@ +package embedded + +import ( + "fyne.io/fyne/v2" +) + +type noosDevice struct{} + +func (n *noosDevice) Orientation() fyne.DeviceOrientation { + return fyne.OrientationVertical +} + +func (n *noosDevice) IsMobile() bool { + return false +} + +func (n *noosDevice) IsBrowser() bool { + return false +} + +func (n *noosDevice) HasKeyboard() bool { + return true +} + +func (n *noosDevice) SystemScaleForWindow(fyne.Window) float32 { + return 1.0 +} + +func (n *noosDevice) Locale() fyne.Locale { + return "en" +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/embedded/driver.go b/vendor/fyne.io/fyne/v2/internal/driver/embedded/driver.go new file mode 100644 index 0000000..739ba9f --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/embedded/driver.go @@ -0,0 +1,241 @@ +package embedded + +import ( + "image" + "math" + "time" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/driver/embedded" + "fyne.io/fyne/v2/internal/async" + "fyne.io/fyne/v2/internal/cache" + intdriver "fyne.io/fyne/v2/internal/driver" + "fyne.io/fyne/v2/internal/painter" +) + +type noosDriver struct { + events chan embedded.Event + queue chan funcData + render func(image.Image) + run func(func()) + size func() fyne.Size + done bool + + wins []fyne.Window + current int + device noosDevice +} + +func (n *noosDriver) CreateWindow(_ string) fyne.Window { + w := newWindow(n) + n.wins = append(n.wins, w) + n.current = len(n.wins) - 1 + + if f := n.size; f != nil { + w.Resize(f()) + } + return w +} + +func (n *noosDriver) AllWindows() []fyne.Window { + return n.wins +} + +func (n *noosDriver) RenderedTextSize(text string, fontSize float32, style fyne.TextStyle, source fyne.Resource) (size fyne.Size, baseline float32) { + return painter.RenderedTextSize(text, fontSize, style, source) +} + +func (n *noosDriver) CanvasForObject(obj fyne.CanvasObject) fyne.Canvas { + return cache.GetCanvasForObject(obj) +} + +func (n *noosDriver) AbsolutePositionForObject(o fyne.CanvasObject) fyne.Position { + c := n.CanvasForObject(o) + if c == nil { + return fyne.NewPos(0, 0) + } + + pos := intdriver.AbsolutePositionForObject(o, []fyne.CanvasObject{c.Content()}) + inset, _ := c.InteractiveArea() + return pos.Subtract(inset) +} + +func (n *noosDriver) Device() fyne.Device { + return &n.device +} + +func (n *noosDriver) Run() { + n.run(n.doRun) +} + +func (n *noosDriver) doRun() { + for _, w := range n.wins { + n.renderWindow(w) + } + + for !n.done { + select { + case fn := <-n.queue: + fn.f() + if fn.done != nil { + fn.done <- struct{}{} + } + case e := <-n.events: + if e == nil { + // closing + n.Quit() + continue + } + + w := n.wins[n.current].(*noosWindow) + + switch t := e.(type) { + case *embedded.CharacterEvent: + if focused := w.c.Focused(); focused != nil { + focused.TypedRune(t.Rune) + } else if tr := w.c.OnTypedRune(); tr != nil { + tr(t.Rune) + } + + n.renderWindow(n.wins[n.current]) + case *embedded.KeyEvent: + keyEvent := &fyne.KeyEvent{Name: t.Name} + + if t.Direction == embedded.KeyReleased { + // No desktop events so key/up down not reported + continue // ignore key up in other core events + } + + if t.Name == fyne.KeyTab { + captures := false + + if ent, ok := w.Canvas().Focused().(fyne.Tabbable); ok { + captures = ent.AcceptsTab() + } + if !captures { + // TODO handle shift + w.Canvas().FocusNext() + n.renderWindow(n.wins[n.current]) + continue + } + } + + // No shortcut detected, pass down to TypedKey + focused := w.c.Focused() + if focused != nil { + focused.TypedKey(keyEvent) + } else if tk := w.c.OnTypedKey(); tk != nil { + tk(keyEvent) + } + + n.renderWindow(n.wins[n.current]) + case *embedded.TouchDownEvent: + n.handleTouchDown(t, n.wins[n.current].(*noosWindow)) + case *embedded.TouchMoveEvent: + n.handleTouchMove(t, n.wins[n.current].(*noosWindow)) + case *embedded.TouchUpEvent: + n.handleTouchUp(t, n.wins[n.current].(*noosWindow)) + } + } + } +} + +func (n *noosDriver) handleTouchDown(ev *embedded.TouchDownEvent, w *noosWindow) { + w.c.tapDown(ev.Position, ev.ID) + n.renderWindow(w) +} + +func (n *noosDriver) handleTouchMove(ev *embedded.TouchMoveEvent, w *noosWindow) { + w.c.tapMove(ev.Position, ev.ID, func(wid fyne.Draggable, ev *fyne.DragEvent) { + wid.Dragged(ev) + }) + n.renderWindow(w) +} + +func (n *noosDriver) handleTouchUp(ev *embedded.TouchUpEvent, w *noosWindow) { + w.c.tapUp(ev.Position, ev.ID, func(wid fyne.Tappable, ev *fyne.PointEvent) { + wid.Tapped(ev) + }, func(wid fyne.SecondaryTappable, ev *fyne.PointEvent) { + wid.TappedSecondary(ev) + }, func(wid fyne.DoubleTappable, ev *fyne.PointEvent) { + wid.DoubleTapped(ev) + }, func(wid fyne.Draggable, ev *fyne.DragEvent) { + if math.Abs(float64(ev.Dragged.DX)) <= tapMoveEndThreshold && math.Abs(float64(ev.Dragged.DY)) <= tapMoveEndThreshold { + wid.DragEnd() + return + } + + go func() { + for math.Abs(float64(ev.Dragged.DX)) > tapMoveEndThreshold || math.Abs(float64(ev.Dragged.DY)) > tapMoveEndThreshold { + if math.Abs(float64(ev.Dragged.DX)) > 0 { + ev.Dragged.DX *= tapMoveDecay + } + if math.Abs(float64(ev.Dragged.DY)) > 0 { + ev.Dragged.DY *= tapMoveDecay + } + + n.DoFromGoroutine(func() { + wid.Dragged(ev) + }, false) + time.Sleep(time.Millisecond * 16) + } + + n.DoFromGoroutine(wid.DragEnd, false) + }() + }) + n.renderWindow(w) +} + +func (n *noosDriver) Quit() { + n.done = true + + go func() { + n.queue <- funcData{f: func() {}} + }() +} + +func (n *noosDriver) StartAnimation(*fyne.Animation) { + // no animations on embedded +} + +func (n *noosDriver) StopAnimation(*fyne.Animation) { + // no animations on embedded +} + +func (n *noosDriver) DoubleTapDelay() time.Duration { + return tapDoubleDelay +} + +func (n *noosDriver) SetDisableScreenBlanking(bool) {} + +func (n *noosDriver) DoFromGoroutine(fn func(), wait bool) { + if wait { + async.EnsureNotMain(func() { + done := make(chan struct{}) + + n.queue <- funcData{f: fn, done: done} + <-done + }) + } else { + n.queue <- funcData{f: fn} + } +} + +// TODO add some caching to stop allocating images... +func (n *noosDriver) renderWindow(w fyne.Window) { + img := w.Canvas().Capture() + + n.render(img) +} + +func NewNoOSDriver(render func(img image.Image), run func(func()), events chan embedded.Event, size func() fyne.Size) fyne.Driver { + return &noosDriver{ + events: events, queue: make(chan funcData), size: size, + render: render, run: run, wins: make([]fyne.Window, 0), + } +} + +type funcData struct { + f func() + done chan struct{} // Zero allocation signalling channel +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/embedded/touchscreen.go b/vendor/fyne.io/fyne/v2/internal/driver/embedded/touchscreen.go new file mode 100644 index 0000000..08ff3fd --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/embedded/touchscreen.go @@ -0,0 +1,236 @@ +package embedded + +import ( + "context" + "math" + "sync" + "time" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/driver/mobile" + "fyne.io/fyne/v2/driver/software" + "fyne.io/fyne/v2/internal/driver" + "fyne.io/fyne/v2/test" +) + +const ( + tapMoveDecay = 0.92 // how much should the scroll continue decay on each frame? + tapMoveEndThreshold = 2.0 // at what offset will we stop decaying? + tapMoveThreshold = 4.0 // how far can we move before it is a drag + tapSecondaryDelay = 300 * time.Millisecond // how long before secondary tap + tapDoubleDelay = 500 * time.Millisecond // max duration between taps for a DoubleTap event +) + +type touchCanvas struct { + test.WindowlessCanvas + + lastTapDown map[int]time.Time + lastTapDownPos map[int]fyne.Position + lastTapDelta map[int]fyne.Delta + + dragOffset fyne.Position + dragStart fyne.Position + dragging fyne.Draggable + + touched map[int]mobile.Touchable + touchCancelFunc context.CancelFunc + touchCancelLock sync.Mutex + touchLastTapped fyne.CanvasObject + touchTapCount int +} + +func newTouchCanvas() *touchCanvas { + ret := &touchCanvas{ + WindowlessCanvas: software.NewCanvas(), + lastTapDown: make(map[int]time.Time), + lastTapDownPos: make(map[int]fyne.Position), + lastTapDelta: make(map[int]fyne.Delta), + touched: make(map[int]mobile.Touchable), + } + return ret +} + +func (c *touchCanvas) tapDown(pos fyne.Position, tapID int) { + c.lastTapDown[tapID] = time.Now() + c.lastTapDownPos[tapID] = pos + c.dragging = nil + + co, objPos, layer := driver.FindObjectAtPositionMatching(pos, func(object fyne.CanvasObject) bool { + switch object.(type) { + case mobile.Touchable, fyne.Focusable: + return true + } + + return false + }, nil, nil, c.Content()) + + if wid, ok := co.(mobile.Touchable); ok { + touchEv := &mobile.TouchEvent{} + touchEv.Position = objPos + touchEv.AbsolutePosition = pos + wid.TouchDown(touchEv) + c.touched[tapID] = wid + } + + if layer != 1 { // 0 - overlay, 1 - window head / menu, 2 - content + if wid, ok := co.(fyne.Focusable); !ok || wid != c.Focused() { + c.Unfocus() + } + } +} + +func (c *touchCanvas) tapMove(pos fyne.Position, tapID int, + dragCallback func(fyne.Draggable, *fyne.DragEvent), +) { + previousPos := c.lastTapDownPos[tapID] + deltaX := pos.X - previousPos.X + deltaY := pos.Y - previousPos.Y + + if c.dragging == nil && (math.Abs(float64(deltaX)) < tapMoveThreshold && math.Abs(float64(deltaY)) < tapMoveThreshold) { + return + } + c.lastTapDownPos[tapID] = pos + offset := fyne.Delta{DX: deltaX, DY: deltaY} + c.lastTapDelta[tapID] = offset + + co, objPos, _ := driver.FindObjectAtPositionMatching(pos, func(object fyne.CanvasObject) bool { + if _, ok := object.(fyne.Draggable); ok { + return true + } else if _, ok := object.(mobile.Touchable); ok { + return true + } + + return false + }, nil, nil, c.Content()) + + if c.touched[tapID] != nil { + if touch, ok := co.(mobile.Touchable); !ok || c.touched[tapID] != touch { + touchEv := &mobile.TouchEvent{} + touchEv.Position = objPos + touchEv.AbsolutePosition = pos + c.touched[tapID].TouchCancel(touchEv) + c.touched[tapID] = nil + } + } + + if c.dragging == nil { + if drag, ok := co.(fyne.Draggable); ok { + c.dragging = drag + c.dragOffset = previousPos.Subtract(objPos) + c.dragStart = co.Position() + } else { + return + } + } + + ev := &fyne.DragEvent{} + draggedObjDelta := c.dragStart.Subtract(c.dragging.(fyne.CanvasObject).Position()) + ev.Position = pos.Subtract(c.dragOffset).Add(draggedObjDelta) + ev.Dragged = offset + + dragCallback(c.dragging, ev) +} + +func (c *touchCanvas) tapUp(pos fyne.Position, tapID int, + tapCallback func(fyne.Tappable, *fyne.PointEvent), + tapAltCallback func(fyne.SecondaryTappable, *fyne.PointEvent), + doubleTapCallback func(fyne.DoubleTappable, *fyne.PointEvent), + dragCallback func(fyne.Draggable, *fyne.DragEvent), +) { + if c.dragging != nil { + previousDelta := c.lastTapDelta[tapID] + ev := &fyne.DragEvent{Dragged: previousDelta} + draggedObjDelta := c.dragStart.Subtract(c.dragging.(fyne.CanvasObject).Position()) + ev.Position = pos.Subtract(c.dragOffset).Add(draggedObjDelta) + ev.AbsolutePosition = pos + dragCallback(c.dragging, ev) + + c.dragging = nil + return + } + + duration := time.Since(c.lastTapDown[tapID]) + + co, objPos, _ := driver.FindObjectAtPositionMatching(pos, func(object fyne.CanvasObject) bool { + if _, ok := object.(fyne.Tappable); ok { + return true + } else if _, ok := object.(fyne.SecondaryTappable); ok { + return true + } else if _, ok := object.(mobile.Touchable); ok { + return true + } else if _, ok := object.(fyne.DoubleTappable); ok { + return true + } + + return false + }, nil, nil, c.Content()) + + if wid, ok := co.(mobile.Touchable); ok { + touchEv := &mobile.TouchEvent{} + touchEv.Position = objPos + touchEv.AbsolutePosition = pos + wid.TouchUp(touchEv) + c.touched[tapID] = nil + } + + ev := &fyne.PointEvent{ + Position: objPos, + AbsolutePosition: pos, + } + + if duration < tapSecondaryDelay { + _, doubleTap := co.(fyne.DoubleTappable) + if doubleTap { + c.touchCancelLock.Lock() + c.touchTapCount++ + c.touchLastTapped = co + cancel := c.touchCancelFunc + c.touchCancelLock.Unlock() + if cancel != nil { + cancel() + return + } + go c.waitForDoubleTap(co, ev, tapCallback, doubleTapCallback) + } else { + if wid, ok := co.(fyne.Tappable); ok { + tapCallback(wid, ev) + } + } + } else { + if wid, ok := co.(fyne.SecondaryTappable); ok { + tapAltCallback(wid, ev) + } + } +} + +func (c *touchCanvas) waitForDoubleTap(co fyne.CanvasObject, ev *fyne.PointEvent, tapCallback func(fyne.Tappable, *fyne.PointEvent), doubleTapCallback func(fyne.DoubleTappable, *fyne.PointEvent)) { + ctx, cancel := context.WithDeadline(context.TODO(), time.Now().Add(tapDoubleDelay)) + c.touchCancelLock.Lock() + c.touchCancelFunc = cancel + c.touchCancelLock.Unlock() + defer cancel() + + <-ctx.Done() + fyne.CurrentApp().Driver().DoFromGoroutine(func() { + c.touchCancelLock.Lock() + touchCount := c.touchTapCount + touchLast := c.touchLastTapped + c.touchCancelLock.Unlock() + + if touchCount == 2 && touchLast == co { + if wid, ok := co.(fyne.DoubleTappable); ok { + doubleTapCallback(wid, ev) + } + } else { + if wid, ok := co.(fyne.Tappable); ok { + tapCallback(wid, ev) + } + } + + c.touchCancelLock.Lock() + c.touchTapCount = 0 + c.touchCancelFunc = nil + c.touchLastTapped = nil + c.touchCancelLock.Unlock() + }, true) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/embedded/window.go b/vendor/fyne.io/fyne/v2/internal/driver/embedded/window.go new file mode 100644 index 0000000..768a2f4 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/embedded/window.go @@ -0,0 +1,137 @@ +package embedded + +import ( + "fyne.io/fyne/v2" +) + +type noosWindow struct { + c *touchCanvas + d *noosDriver + + title string +} + +func (w *noosWindow) Title() string { + return w.title +} + +func (w *noosWindow) SetTitle(s string) { + w.title = s +} + +func (w *noosWindow) FullScreen() bool { + return true +} + +func (w *noosWindow) SetFullScreen(_ bool) { +} + +func (w *noosWindow) Resize(s fyne.Size) { + w.c.Resize(s) +} + +func (w *noosWindow) RequestFocus() { + // TODO implement me + panic("implement me") +} + +func (w *noosWindow) FixedSize() bool { + return true +} + +func (w *noosWindow) SetFixedSize(bool) {} + +func (w *noosWindow) CenterOnScreen() {} + +func (w *noosWindow) Padded() bool { + return w.c.Padded() +} + +func (w *noosWindow) SetPadded(pad bool) { + w.c.SetPadded(pad) +} + +func (w *noosWindow) Icon() fyne.Resource { + // TODO implement me + return nil +} + +func (w *noosWindow) SetIcon(fyne.Resource) { + // TODO implement me +} + +func (w *noosWindow) SetMaster() { + // TODO implement me +} + +func (w *noosWindow) MainMenu() *fyne.MainMenu { + // TODO implement me + return nil +} + +func (w *noosWindow) SetMainMenu(menu *fyne.MainMenu) { + // TODO implement me +} + +func (w *noosWindow) SetOnClosed(f func()) { + // TODO implement me +} + +func (w *noosWindow) SetCloseIntercept(f func()) { + // TODO implement me +} + +func (w *noosWindow) SetOnDropped(func(fyne.Position, []fyne.URI)) {} + +func (w *noosWindow) Show() { + w.d.renderWindow(w) +} + +func (w *noosWindow) Hide() {} + +func (w *noosWindow) Close() { + i := -1 + for _, win := range w.d.wins { + if win == w { + break + } + i++ + } + if i == -1 { + return + } + + copy(w.d.wins[i:], w.d.wins[i+1:]) + w.d.wins[len(w.d.wins)-1] = nil // Allow the garbage collector to reclaim the memory. + w.d.wins = w.d.wins[:len(w.d.wins)-1] + + if w.d.current > 0 { + w.d.current-- + } +} + +func (w *noosWindow) ShowAndRun() { + w.Show() + w.d.Run() +} + +func (w *noosWindow) Content() fyne.CanvasObject { + return w.c.Content() +} + +func (w *noosWindow) SetContent(object fyne.CanvasObject) { + w.c.SetContent(object) +} + +func (w *noosWindow) Canvas() fyne.Canvas { + return w.c +} + +func (w *noosWindow) Clipboard() fyne.Clipboard { + // TODO implement me + return nil +} + +func newWindow(d *noosDriver) fyne.Window { + return &noosWindow{c: newTouchCanvas(), d: d} +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/animation.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/animation.go new file mode 100644 index 0000000..ec7d72a --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/animation.go @@ -0,0 +1,11 @@ +package glfw + +import "fyne.io/fyne/v2" + +func (d *gLDriver) StartAnimation(a *fyne.Animation) { + d.animation.Start(a) +} + +func (d *gLDriver) StopAnimation(a *fyne.Animation) { + d.animation.Stop(a) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/canvas.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/canvas.go new file mode 100644 index 0000000..69af54a --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/canvas.go @@ -0,0 +1,312 @@ +package glfw + +import ( + "image" + "math" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/internal" + "fyne.io/fyne/v2/internal/app" + "fyne.io/fyne/v2/internal/build" + "fyne.io/fyne/v2/internal/driver" + "fyne.io/fyne/v2/internal/driver/common" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +// Declare conformity with Canvas interface +var _ fyne.Canvas = (*glCanvas)(nil) + +type glCanvas struct { + common.Canvas + + content fyne.CanvasObject + menu fyne.CanvasObject + padded bool + size fyne.Size + + onTypedRune func(rune) + onTypedKey func(*fyne.KeyEvent) + onKeyDown func(*fyne.KeyEvent) + onKeyUp func(*fyne.KeyEvent) + // shortcut fyne.ShortcutHandler + + scale, detectedScale, texScale float32 + + context driver.WithContext + webExtraWindows *container.MultipleWindows +} + +func (c *glCanvas) Capture() image.Image { + var img image.Image + c.context.(*window).RunWithContext(func() { + img = c.Painter().Capture(c) + }) + return img +} + +func (c *glCanvas) Content() fyne.CanvasObject { + return c.content +} + +func (c *glCanvas) DismissMenu() bool { + if c.menu != nil && c.menu.(*MenuBar).IsActive() { + c.menu.(*MenuBar).Toggle() + return true + } + return false +} + +func (c *glCanvas) InteractiveArea() (fyne.Position, fyne.Size) { + return fyne.Position{}, c.Size() +} + +func (c *glCanvas) MinSize() fyne.Size { + return c.canvasSize(c.content.MinSize()) +} + +func (c *glCanvas) OnKeyDown() func(*fyne.KeyEvent) { + return c.onKeyDown +} + +func (c *glCanvas) OnKeyUp() func(*fyne.KeyEvent) { + return c.onKeyUp +} + +func (c *glCanvas) OnTypedKey() func(*fyne.KeyEvent) { + return c.onTypedKey +} + +func (c *glCanvas) OnTypedRune() func(rune) { + return c.onTypedRune +} + +func (c *glCanvas) Padded() bool { + return c.padded +} + +func (c *glCanvas) PixelCoordinateForPosition(pos fyne.Position) (int, int) { + multiple := c.scale * c.texScale + scaleInt := func(x float32) int { + return int(math.Round(float64(x * multiple))) + } + + return scaleInt(pos.X), scaleInt(pos.Y) +} + +func (c *glCanvas) Resize(size fyne.Size) { + // This might not be the ideal solution, but it effectively avoid the first frame to be blurry due to the + // rounding of the size to the loower integer when scale == 1. It does not affect the other cases as far as we tested. + // This can easily be seen with fyne/cmd/hello and a scale == 1 as the text will happear blurry without the following line. + nearestSize := fyne.NewSize(float32(math.Ceil(float64(size.Width))), float32(math.Ceil(float64(size.Height)))) + + c.size = nearestSize + + if c.webExtraWindows != nil { + c.webExtraWindows.Resize(size) + } + for _, overlay := range c.Overlays().List() { + if p, ok := overlay.(*widget.PopUp); ok { + // TODO: remove this when #707 is being addressed. + // “Notifies” the PopUp of the canvas size change. + p.Refresh() + } else { + overlay.Resize(nearestSize) + } + } + + content := c.content + contentSize := c.contentSize(nearestSize) + contentPos := c.contentPos() + menu := c.menu + menuHeight := c.menuHeight() + + content.Resize(contentSize) + content.Move(contentPos) + + if menu != nil { + menu.Refresh() + menu.Resize(fyne.NewSize(nearestSize.Width, menuHeight)) + } +} + +func (c *glCanvas) Scale() float32 { + return c.scale +} + +func (c *glCanvas) SetContent(content fyne.CanvasObject) { + content.Resize(content.MinSize()) // give it the space it wants then calculate the real min + + // the pass above makes some layouts wide enough to wrap, so we ask again what the true min is. + newSize := c.size.Max(c.canvasSize(content.MinSize())) + + c.setContent(content) + + c.Resize(newSize) + c.SetDirty() +} + +func (c *glCanvas) SetOnKeyDown(typed func(*fyne.KeyEvent)) { + c.onKeyDown = typed +} + +func (c *glCanvas) SetOnKeyUp(typed func(*fyne.KeyEvent)) { + c.onKeyUp = typed +} + +func (c *glCanvas) SetOnTypedKey(typed func(*fyne.KeyEvent)) { + c.onTypedKey = typed +} + +func (c *glCanvas) SetOnTypedRune(typed func(rune)) { + c.onTypedRune = typed +} + +func (c *glCanvas) SetPadded(padded bool) { + c.padded = padded + + c.content.Move(c.contentPos()) +} + +func (c *glCanvas) reloadScale() { + w := c.context.(*window) + windowVisible := w.visible + if !windowVisible { + return + } + + c.scale = w.calculatedScale() + c.SetDirty() + + c.context.RescaleContext() +} + +func (c *glCanvas) Size() fyne.Size { + return c.size +} + +func (c *glCanvas) ToggleMenu() { + if c.menu != nil { + c.menu.(*MenuBar).Toggle() + } +} + +func (c *glCanvas) buildMenu(w *window, m *fyne.MainMenu) { + c.setMenuOverlay(nil) + if m == nil { + return + } + if build.HasNativeMenu { + setupNativeMenu(w, m) + } else { + c.setMenuOverlay(buildMenuOverlay(m, w)) + } +} + +// canvasSize computes the needed canvas size for the given content size +func (c *glCanvas) canvasSize(contentSize fyne.Size) fyne.Size { + canvasSize := contentSize.Add(fyne.NewSize(0, c.menuHeight())) + if c.Padded() { + return canvasSize.Add(fyne.NewSquareSize(theme.Padding() * 2)) + } + return canvasSize +} + +func (c *glCanvas) contentPos() fyne.Position { + contentPos := fyne.NewPos(0, c.menuHeight()) + if c.Padded() { + return contentPos.Add(fyne.NewSquareOffsetPos(theme.Padding())) + } + return contentPos +} + +func (c *glCanvas) contentSize(canvasSize fyne.Size) fyne.Size { + contentSize := fyne.NewSize(canvasSize.Width, canvasSize.Height-c.menuHeight()) + if c.Padded() { + return contentSize.Subtract(fyne.NewSquareSize(theme.Padding() * 2)) + } + return contentSize +} + +func (c *glCanvas) menuHeight() float32 { + if c.menu == nil { + return 0 // no menu or native menu -> does not consume space on the canvas + } + + return c.menu.MinSize().Height +} + +func (c *glCanvas) overlayChanged() { + c.SetDirty() +} + +func (c *glCanvas) paint(size fyne.Size) { + clips := &internal.ClipStack{} + if c.Content() == nil { + return + } + c.Painter().Clear() + + paint := func(node *common.RenderCacheNode, pos fyne.Position) { + obj := node.Obj() + if driver.IsClip(obj) { + inner := clips.Push(pos, obj.Size()) + c.Painter().StartClipping(inner.Rect()) + } + if size.Width <= 0 || size.Height <= 0 { // iconifying on Windows can do bad things + return + } + c.Painter().Paint(obj, pos, size) + } + afterPaint := func(node *common.RenderCacheNode, pos fyne.Position) { + if driver.IsClip(node.Obj()) { + clips.Pop() + if top := clips.Top(); top != nil { + c.Painter().StartClipping(top.Rect()) + } else { + c.Painter().StopClipping() + } + } + + if build.Mode == fyne.BuildDebug { + c.DrawDebugOverlay(node.Obj(), pos, size) + } + } + c.WalkTrees(paint, afterPaint) +} + +func (c *glCanvas) setContent(content fyne.CanvasObject) { + c.content = content + c.SetContentTreeAndFocusMgr(content) +} + +func (c *glCanvas) setMenuOverlay(b fyne.CanvasObject) { + c.menu = b + c.SetMenuTreeAndFocusMgr(b) + + if c.menu != nil && !c.size.IsZero() { + c.content.Resize(c.contentSize(c.size)) + c.content.Move(c.contentPos()) + + c.menu.Refresh() + c.menu.Resize(fyne.NewSize(c.size.Width, c.menu.MinSize().Height)) + } +} + +func (c *glCanvas) applyThemeOutOfTreeObjects() { + if c.menu != nil { + app.ApplyThemeTo(c.menu, c) // Ensure our menu gets the theme change message as it's out-of-tree + } + + c.SetPadded(c.padded) // refresh the padding for potential theme differences +} + +func newCanvas() *glCanvas { + c := &glCanvas{scale: 1.0, texScale: 1.0, padded: true} + connectKeyboard(c) + c.Initialize(c, c.overlayChanged) + c.setContent(&canvas.Rectangle{FillColor: theme.Color(theme.ColorNameBackground)}) + return c +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/clipboard.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/clipboard.go new file mode 100644 index 0000000..9171a5b --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/clipboard.go @@ -0,0 +1,64 @@ +//go:build !wasm && !test_web_driver + +package glfw + +import ( + "runtime" + "time" + + "fyne.io/fyne/v2" + + "github.com/go-gl/glfw/v3.3/glfw" +) + +// Declare conformity with Clipboard interface +var _ fyne.Clipboard = clipboard{} + +func NewClipboard() fyne.Clipboard { + return clipboard{} +} + +// clipboard represents the system clipboard +type clipboard struct{} + +// Content returns the clipboard content +func (c clipboard) Content() string { + // This retry logic is to work around the "Access Denied" error often thrown in windows PR#1679 + if runtime.GOOS != "windows" { + return c.content() + } + for i := 3; i > 0; i-- { + cb := c.content() + if cb != "" { + return cb + } + time.Sleep(50 * time.Millisecond) + } + // can't log retry as it would also log errors for an empty clipboard + return "" +} + +func (c clipboard) content() string { + return glfw.GetClipboardString() +} + +// SetContent sets the clipboard content +func (c clipboard) SetContent(content string) { + // This retry logic is to work around the "Access Denied" error often thrown in windows PR#1679 + if runtime.GOOS != "windows" { + c.setContent(content) + return + } + for i := 3; i > 0; i-- { + c.setContent(content) + if c.content() == content { + return + } + time.Sleep(50 * time.Millisecond) + } + fyne.LogError("GLFW clipboard set failed", nil) +} + +func (c clipboard) setContent(content string) { + glfw.SetClipboardString(content) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/clipboard_wasm.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/clipboard_wasm.go new file mode 100644 index 0000000..84594af --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/clipboard_wasm.go @@ -0,0 +1,28 @@ +//go:build wasm || test_web_driver + +package glfw + +import ( + "fyne.io/fyne/v2" + "github.com/fyne-io/glfw-js" +) + +// Declare conformity with Clipboard interface +var _ fyne.Clipboard = clipboard{} + +func NewClipboard() fyne.Clipboard { + return clipboard{} +} + +// clipboard represents the system clipboard +type clipboard struct{} + +// Content returns the clipboard content +func (c clipboard) Content() string { + return glfw.GetClipboardString() +} + +// SetContent sets the clipboard content +func (c clipboard) SetContent(content string) { + glfw.SetClipboardString(content) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/device.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/device.go new file mode 100644 index 0000000..e732b1b --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/device.go @@ -0,0 +1,29 @@ +package glfw + +import ( + "runtime" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/lang" +) + +type glDevice struct{} + +// Declare conformity with Device +var _ fyne.Device = (*glDevice)(nil) + +func (*glDevice) Locale() fyne.Locale { + return lang.SystemLocale() +} + +func (*glDevice) Orientation() fyne.DeviceOrientation { + return fyne.OrientationHorizontalLeft // TODO should we consider the monitor orientation or topmost window? +} + +func (*glDevice) HasKeyboard() bool { + return true // TODO actually check - we could be in tablet mode +} + +func (*glDevice) IsBrowser() bool { + return runtime.GOARCH == "js" || runtime.GOOS == "js" +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/device_desktop.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/device_desktop.go new file mode 100644 index 0000000..cff8ba9 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/device_desktop.go @@ -0,0 +1,33 @@ +//go:build !wasm + +package glfw + +import ( + "runtime" + + "fyne.io/fyne/v2" +) + +func (*glDevice) IsMobile() bool { + return false +} + +func (*glDevice) SystemScaleForWindow(w fyne.Window) float32 { + if runtime.GOOS == "darwin" { + return 1.0 // macOS scaling is done at the texture level + } + if runtime.GOOS == "windows" { + xScale, _ := w.(*window).viewport.GetContentScale() + return xScale + } + + return scaleAuto +} + +func connectKeyboard(*glCanvas) { + // no-op, mobile web compatibility +} + +func isMacOSRuntime() bool { + return runtime.GOOS == "darwin" +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/device_wasm.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/device_wasm.go new file mode 100644 index 0000000..cd2cf13 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/device_wasm.go @@ -0,0 +1,75 @@ +//go:build wasm + +package glfw + +import ( + "regexp" + "strings" + "syscall/js" + + "fyne.io/fyne/v2" +) + +var ( + isMobile bool + isMacOS bool + + setCursor func(name string) + + blurDummyEntry func(...any) js.Value + focusDummyEntry func(...any) js.Value +) + +func init() { + navigator := js.Global().Get("navigator") + isMobile = regexp.MustCompile("Android|iPhone|iPad|iPod"). + MatchString(navigator.Get("userAgent").String()) + isMacOS = strings.Contains(navigator.Get("platform").String(), "Mac") + + document := js.Global().Get("document") + style := document.Get("body").Get("style") + setStyleProperty := style.Get("setProperty").Call("bind", style) + setCursor = func(name string) { + setStyleProperty.Invoke("cursor", name) + } + + dummyEntry := document.Call("getElementById", "dummyEntry") + if dummyEntry.IsNull() { + return + } + + blurDummyEntry = dummyEntry.Get("blur").Call("bind", dummyEntry).Invoke + focusDummyEntry = dummyEntry.Get("focus").Call("bind", dummyEntry).Invoke +} + +func (*glDevice) IsMobile() bool { + return isMobile +} + +func (*glDevice) SystemScaleForWindow(w fyne.Window) float32 { + // Get the scale information from the web browser directly + return float32(js.Global().Get("devicePixelRatio").Float()) +} + +func (*glDevice) hideVirtualKeyboard() { + if blurDummyEntry == nil { + return + } + blurDummyEntry() +} + +func (*glDevice) showVirtualKeyboard() { + if focusDummyEntry == nil { + return + } + focusDummyEntry() +} + +func connectKeyboard(c *glCanvas) { + c.OnFocus = handleKeyboard + c.OnUnfocus = hideVirtualKeyboard +} + +func isMacOSRuntime() bool { + return isMacOS // Value depends on which OS the browser is running on. +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/driver.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/driver.go new file mode 100644 index 0000000..624e346 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/driver.go @@ -0,0 +1,181 @@ +// Package glfw provides a full Fyne desktop driver that uses the system OpenGL libraries. +// This supports Windows, Mac OS X and Linux using the gl and glfw packages from go-gl. +package glfw + +import ( + "bytes" + "image" + "os" + "runtime" + + "fyne.io/fyne/v2/internal/async" + "github.com/fyne-io/image/ico" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/animation" + intapp "fyne.io/fyne/v2/internal/app" + "fyne.io/fyne/v2/internal/driver" + "fyne.io/fyne/v2/internal/driver/common" + "fyne.io/fyne/v2/internal/painter" + intRepo "fyne.io/fyne/v2/internal/repository" + "fyne.io/fyne/v2/storage/repository" +) + +var curWindow *window + +// Declare conformity with Driver +var _ fyne.Driver = (*gLDriver)(nil) + +type gLDriver struct { + windows []fyne.Window + initialized bool + done chan struct{} + + animation animation.Runner + + currentKeyModifiers fyne.KeyModifier // desktop driver only + + trayStart, trayStop func() // shut down the system tray, if used + systrayMenu *fyne.Menu // cache the menu set so we know when to refresh +} + +func (d *gLDriver) init() { + if !d.initialized { + d.initialized = true + d.initGLFW() + } +} + +func toOSIcon(icon []byte) ([]byte, error) { + if runtime.GOOS != "windows" { + return icon, nil + } + + img, _, err := image.Decode(bytes.NewReader(icon)) + if err != nil { + return nil, err + } + + buf := &bytes.Buffer{} + err = ico.Encode(buf, img) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +func (d *gLDriver) DoFromGoroutine(f func(), wait bool) { + if wait { + async.EnsureNotMain(func() { + runOnMainWithWait(f, true) + }) + } else { + runOnMainWithWait(f, false) + } +} + +func (d *gLDriver) RenderedTextSize(text string, textSize float32, style fyne.TextStyle, source fyne.Resource) (size fyne.Size, baseline float32) { + return painter.RenderedTextSize(text, textSize, style, source) +} + +func (d *gLDriver) CanvasForObject(obj fyne.CanvasObject) fyne.Canvas { + return common.CanvasForObject(obj) +} + +func (d *gLDriver) AbsolutePositionForObject(co fyne.CanvasObject) fyne.Position { + c := d.CanvasForObject(co) + if c == nil { + return fyne.NewPos(0, 0) + } + + glc := c.(*glCanvas) + return driver.AbsolutePositionForObject(co, glc.ObjectTrees()) +} + +func (d *gLDriver) Device() fyne.Device { + return &glDevice{} +} + +func (d *gLDriver) Quit() { + if curWindow != nil { + if f := fyne.CurrentApp().Lifecycle().(*intapp.Lifecycle).OnExitedForeground(); f != nil { + f() + } + curWindow = nil + if d.trayStop != nil { + d.trayStop() + } + } + + // Only call close once to avoid panic. + if running.CompareAndSwap(true, false) { + close(d.done) + } +} + +func (d *gLDriver) addWindow(w *window) { + d.windows = append(d.windows, w) +} + +// a trivial implementation of "focus previous" - return to the most recently opened, or master if set. +// This may not do the right thing if your app has 3 or more windows open, but it was agreed this was not much +// of an issue, and the added complexity to track focus was not needed at this time. +func (d *gLDriver) focusPreviousWindow() { + var chosen *window + for _, w := range d.windows { + win := w.(*window) + if !win.visible { + continue + } + chosen = win + if win.master { + break + } + } + + if chosen == nil || chosen.view() == nil { + return + } + chosen.RequestFocus() +} + +func (d *gLDriver) windowList() []fyne.Window { + return d.windows +} + +func (d *gLDriver) initFailed(msg string, err error) { + fyne.LogError(msg, err) + + if !running.Load() { + d.Quit() + } else { + os.Exit(1) + } +} + +func (d *gLDriver) Run() { + if !async.IsMainGoroutine() { + panic("Run() or ShowAndRun() must be called from main goroutine") + } + + go d.catchTerm() + d.runGL() + + // Ensure lifecycle events run to completion before the app exits + l := fyne.CurrentApp().Lifecycle().(*intapp.Lifecycle) + l.WaitForEvents() + l.DestroyEventQueue() +} + +func (d *gLDriver) SetDisableScreenBlanking(disable bool) { + setDisableScreenBlank(disable) +} + +// NewGLDriver sets up a new Driver instance implemented using the GLFW Go library and OpenGL bindings. +func NewGLDriver() *gLDriver { + repository.Register("file", intRepo.NewFileRepository()) + + return &gLDriver{ + done: make(chan struct{}), + } +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/driver_darwin.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/driver_darwin.go new file mode 100644 index 0000000..58cbae2 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/driver_darwin.go @@ -0,0 +1,21 @@ +//go:build darwin + +package glfw + +/* +#import + +void setDisableDisplaySleep(bool); +double doubleClickInterval(); +*/ +import "C" +import "time" + +func setDisableScreenBlank(disable bool) { + C.setDisableDisplaySleep(C.bool(disable)) +} + +func (d *gLDriver) DoubleTapDelay() time.Duration { + millis := int64(float64(C.doubleClickInterval()) * 1000) + return time.Duration(millis) * time.Millisecond +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/driver_darwin.m b/vendor/fyne.io/fyne/v2/internal/driver/glfw/driver_darwin.m new file mode 100644 index 0000000..884aae3 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/driver_darwin.m @@ -0,0 +1,34 @@ +//go:build darwin + +#import +#import + +IOPMAssertionID currentDisableID; + +void setDisableDisplaySleep(BOOL disable) { + if (!disable) { + if (currentDisableID == 0) { + return; + } + + IOPMAssertionRelease(currentDisableID); + currentDisableID = 0; + return; + } + + if (currentDisableID != 0) { + return; + } + IOPMAssertionID assertionID; + IOReturn success = IOPMAssertionCreateWithName(kIOPMAssertionTypeNoDisplaySleep, + kIOPMAssertionLevelOn, (CFStringRef)@"App disabled screensaver", &assertionID); + + if (success == kIOReturnSuccess) { + currentDisableID = assertionID; + } +} + +// https://developer.apple.com/documentation/appkit/nsevent/1528384-doubleclickinterval?language=objc +double doubleClickInterval() { + return [NSEvent doubleClickInterval]; +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/driver_desktop.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/driver_desktop.go new file mode 100644 index 0000000..04adbd8 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/driver_desktop.go @@ -0,0 +1,233 @@ +//go:build !wasm && !test_web_driver + +package glfw + +import ( + "bytes" + "image/png" + "os" + "os/signal" + "runtime" + "syscall" + + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/internal/painter" + "fyne.io/fyne/v2/internal/svg" + "fyne.io/fyne/v2/lang" + "fyne.io/systray" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/theme" +) + +var ( + systrayIcon fyne.Resource + systrayRunning bool +) + +func (d *gLDriver) SetSystemTrayMenu(m *fyne.Menu) { + if !systrayRunning { + systrayRunning = true + d.runSystray(m) + } + + d.refreshSystray(m) +} + +func (d *gLDriver) runSystray(m *fyne.Menu) { + d.trayStart, d.trayStop = systray.RunWithExternalLoop(func() { + if systrayIcon != nil { + d.SetSystemTrayIcon(systrayIcon) + } else if fyne.CurrentApp().Icon() != nil { + d.SetSystemTrayIcon(fyne.CurrentApp().Icon()) + } else { + d.SetSystemTrayIcon(theme.BrokenImageIcon()) + } + + // Some XDG systray crash without a title (See #3678) + if runtime.GOOS == "linux" || runtime.GOOS == "openbsd" || runtime.GOOS == "freebsd" || runtime.GOOS == "netbsd" { + app := fyne.CurrentApp() + title := app.Metadata().Name + if title == "" { + title = app.UniqueID() + } + + systray.SetTitle(title) + } + + if m != nil { + // it must be refreshed after init, so an earlier call would have been ineffective + runOnMain(func() { + d.refreshSystray(m) + }) + } + }, func() { + // anything required for tear-down + }) + + // the only way we know the app was asked to quit is if this window is asked to close... + w := d.CreateWindow("SystrayMonitor") + w.(*window).create() + w.SetCloseIntercept(d.Quit) +} + +func itemForMenuItem(i *fyne.MenuItem, parent *systray.MenuItem) *systray.MenuItem { + if i.IsSeparator { + if parent != nil { + parent.AddSeparator() + } else { + systray.AddSeparator() + } + return nil + } + + var item *systray.MenuItem + if i.Checked { + if parent != nil { + item = parent.AddSubMenuItemCheckbox(i.Label, "", true) + } else { + item = systray.AddMenuItemCheckbox(i.Label, "", true) + } + } else { + if parent != nil { + item = parent.AddSubMenuItem(i.Label, "") + } else { + item = systray.AddMenuItem(i.Label, "") + } + } + if i.Disabled { + item.Disable() + } + if i.Icon != nil { + data := i.Icon.Content() + if svg.IsResourceSVG(i.Icon) { + b := &bytes.Buffer{} + res := i.Icon + if runtime.GOOS == "windows" && isDark() { // windows menus don't match dark mode so invert icons + res = theme.NewInvertedThemedResource(i.Icon) + } + img := painter.PaintImage(canvas.NewImageFromResource(res), nil, 64, 64) + err := png.Encode(b, img) + if err != nil { + fyne.LogError("Failed to encode SVG icon for menu", err) + } else { + data = b.Bytes() + } + } + + img, err := toOSIcon(data) + if err != nil { + fyne.LogError("Failed to convert systray icon", err) + } else { + if _, ok := i.Icon.(*theme.ThemedResource); ok { + item.SetTemplateIcon(img, img) + } else { + item.SetIcon(img) + } + } + } + return item +} + +func (d *gLDriver) refreshSystray(m *fyne.Menu) { + d.systrayMenu = m + + systray.ResetMenu() + d.refreshSystrayMenu(m, nil) + + addMissingQuitForMenu(m, d) +} + +func (d *gLDriver) refreshSystrayMenu(m *fyne.Menu, parent *systray.MenuItem) { + if m == nil { + return + } + + for _, i := range m.Items { + item := itemForMenuItem(i, parent) + if item == nil { + continue // separator + } + if i.ChildMenu != nil { + d.refreshSystrayMenu(i.ChildMenu, item) + } + + fn := i.Action + go func() { + for range item.ClickedCh { + if fn != nil { + runOnMain(fn) + } + } + }() + } +} + +func (d *gLDriver) SetSystemTrayIcon(resource fyne.Resource) { + systrayIcon = resource // in case we need it later + + img, err := toOSIcon(resource.Content()) + if err != nil { + fyne.LogError("Failed to convert systray icon", err) + return + } + + if _, ok := resource.(*theme.ThemedResource); ok { + systray.SetTemplateIcon(img, img) + } else { + systray.SetIcon(img) + } +} + +func (d *gLDriver) SetSystemTrayWindow(w fyne.Window) { + if !systrayRunning { + systrayRunning = true + d.runSystray(nil) + } + + w.SetCloseIntercept(w.Hide) + glw := w.(*window) + if glw.decorate { + systray.SetOnTapped(glw.Show) + } else { + systray.SetOnTapped(glw.toggleVisible) + } +} + +func (d *gLDriver) SystemTrayMenu() *fyne.Menu { + return d.systrayMenu +} + +func (d *gLDriver) CurrentKeyModifiers() fyne.KeyModifier { + return d.currentKeyModifiers +} + +// this function should be invoked from a goroutine +func (d *gLDriver) catchTerm() { + terminateSignal := make(chan os.Signal, 1) + signal.Notify(terminateSignal, syscall.SIGINT, syscall.SIGTERM) + + <-terminateSignal + fyne.Do(d.Quit) +} + +func addMissingQuitForMenu(menu *fyne.Menu, d *gLDriver) { + localQuit := lang.L("Quit") + var lastItem *fyne.MenuItem + if len(menu.Items) > 0 { + lastItem = menu.Items[len(menu.Items)-1] + if lastItem.Label == localQuit { + lastItem.IsQuit = true + } + } + if lastItem == nil || !lastItem.IsQuit { // make sure the menu always has a quit option + quitItem := fyne.NewMenuItem(localQuit, nil) + quitItem.IsQuit = true + menu.Items = append(menu.Items, fyne.NewMenuItemSeparator(), quitItem) + } + for _, item := range menu.Items { + if item.IsQuit && item.Action == nil { + item.Action = d.Quit + } + } +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/driver_notwindows.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/driver_notwindows.go new file mode 100644 index 0000000..436cc1f --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/driver_notwindows.go @@ -0,0 +1,7 @@ +//go:build !windows + +package glfw + +func isDark() bool { + return true // this is really a no-op placeholder for a windows menu workaround +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/driver_wasm.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/driver_wasm.go new file mode 100644 index 0000000..77357b6 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/driver_wasm.go @@ -0,0 +1,25 @@ +//go:build wasm || test_web_driver + +package glfw + +import ( + "time" + + "fyne.io/fyne/v2" +) + +const webDefaultDoubleTapDelay = 300 * time.Millisecond + +func (d *gLDriver) SetSystemTrayMenu(m *fyne.Menu) { + // no-op for wasm apps using this driver +} + +func (d *gLDriver) catchTerm() {} + +func setDisableScreenBlank(disable bool) { + // awaiting complete support for WakeLock +} + +func (d *gLDriver) DoubleTapDelay() time.Duration { + return webDefaultDoubleTapDelay +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/driver_windows.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/driver_windows.go new file mode 100644 index 0000000..609126b --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/driver_windows.go @@ -0,0 +1,80 @@ +package glfw + +import ( + "fmt" + "runtime" + "syscall" + "time" + "unsafe" +) + +type ( + MB uint32 + ES uint +) + +const ( + MB_OK MB = 0x0000_0000 + MB_ICONERROR MB = 0x0000_0010 + + ES_CONTINUOUS ES = 0x80000000 + ES_DISPLAY_REQUIRED ES = 0x00000002 +) + +var ( + kernel32 = syscall.NewLazyDLL("kernel32.dll") + user32 = syscall.NewLazyDLL("user32.dll") + + executionState = kernel32.NewProc("SetThreadExecutionState") + MessageBox = user32.NewProc("MessageBoxW") + getDoubleClickTime = user32.NewProc("GetDoubleClickTime") +) + +func toNativePtr(s string) *uint16 { + pstr, err := syscall.UTF16PtrFromString(s) + if err != nil { + panic(fmt.Sprintf("toNativePtr() failed \"%s\": %s", s, err)) + } + return pstr +} + +// https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messageboxw +func messageBoxError(text, caption string) { + uType := MB_OK | MB_ICONERROR + + syscall.SyscallN(MessageBox.Addr(), + uintptr(unsafe.Pointer(nil)), uintptr(unsafe.Pointer(toNativePtr(text))), + uintptr(unsafe.Pointer(toNativePtr(caption))), uintptr(uType)) +} + +func logError(msg string, err error) { + text := fmt.Sprintf("Fyne error: %v", msg) + if err != nil { + text = text + fmt.Sprintf("\n Cause:%v", err) + } + + _, file, line, ok := runtime.Caller(1) + if ok { + text = text + fmt.Sprintf("\n At: %s:%d", file, line) + } + + messageBoxError(text, "Fyne Error") +} + +func setDisableScreenBlank(disable bool) { + uType := ES_CONTINUOUS + if disable { + uType |= ES_DISPLAY_REQUIRED + } + + syscall.SyscallN(executionState.Addr(), uintptr(uType)) +} + +func (d *gLDriver) DoubleTapDelay() time.Duration { + // https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdoubleclicktime + if getDoubleClickTime == nil { + return desktopDefaultDoubleTapDelay + } + r1, _, _ := syscall.SyscallN(getDoubleClickTime.Addr()) + return time.Duration(uint64(r1) * uint64(time.Millisecond)) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/driver_xdg.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/driver_xdg.go new file mode 100644 index 0000000..502724c --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/driver_xdg.go @@ -0,0 +1,51 @@ +//go:build linux || freebsd || openbsd || netbsd + +package glfw + +import "C" + +import ( + "time" + + "github.com/godbus/dbus/v5" + + "fyne.io/fyne/v2" +) + +var inhibitCookie uint32 + +func setDisableScreenBlank(disable bool) { + conn, err := dbus.SessionBus() // shared connection, don't close + if err != nil { + fyne.LogError("Unable to connect to session D-Bus", err) + return + } + + if !disable { + if inhibitCookie != 0 { + obj := conn.Object("org.freedesktop.ScreenSaver", "/org/freedesktop/ScreenSaver") + call := obj.Call("org.freedesktop.ScreenSaver.UnInhibit", 0, inhibitCookie) + if call.Err != nil { + fyne.LogError("Failed to send message to bus", call.Err) + } + inhibitCookie = 0 + } + return + } + + if inhibitCookie != 0 { + return + } + obj := conn.Object("org.freedesktop.ScreenSaver", "/org/freedesktop/ScreenSaver") + call := obj.Call("org.freedesktop.ScreenSaver.Inhibit", 0, fyne.CurrentApp().Metadata().ID, + "App disabled screensaver") + if call.Err == nil { + inhibitCookie = call.Body[0].(uint32) + } else { + fyne.LogError("Failed to send message to bus", call.Err) + } +} + +func (d *gLDriver) DoubleTapDelay() time.Duration { + return desktopDefaultDoubleTapDelay +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/glfw_core.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/glfw_core.go new file mode 100644 index 0000000..4a0b1a1 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/glfw_core.go @@ -0,0 +1,12 @@ +//go:build ((!gles && !arm && !arm64) || darwin) && !wasm && !test_web_driver + +package glfw + +import "github.com/go-gl/glfw/v3.3/glfw" + +func initWindowHints() { + glfw.WindowHint(glfw.ContextVersionMajor, 2) + glfw.WindowHint(glfw.ContextVersionMinor, 1) + + glfw.WindowHint(glfw.CocoaGraphicsSwitching, glfw.True) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/glfw_es.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/glfw_es.go new file mode 100644 index 0000000..d3a7b11 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/glfw_es.go @@ -0,0 +1,11 @@ +//go:build (gles || arm || arm64) && !darwin && !wasm && !test_web_driver + +package glfw + +import "github.com/go-gl/glfw/v3.3/glfw" + +func initWindowHints() { + glfw.WindowHint(glfw.ClientAPI, glfw.OpenGLESAPI) + glfw.WindowHint(glfw.ContextVersionMajor, 2) + glfw.WindowHint(glfw.ContextVersionMinor, 0) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/glfw_wasm.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/glfw_wasm.go new file mode 100644 index 0000000..aec734c --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/glfw_wasm.go @@ -0,0 +1,5 @@ +//go:build wasm || test_web_driver + +package glfw + +func initWindowHints() {} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/key.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/key.go new file mode 100644 index 0000000..a83a110 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/key.go @@ -0,0 +1,13 @@ +package glfw + +// Action represents the change of state of a key or mouse button event +type action int + +const ( + // Release Keyboard button was released + release action = 0 + // Press Keyboard button was pressed + press action = 1 + // Repeat Keyboard button was hold pressed for long enough that it trigger a repeat + repeat action = 2 +) diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/keyboard.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/keyboard.go new file mode 100644 index 0000000..768a439 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/keyboard.go @@ -0,0 +1,31 @@ +//go:build wasm + +package glfw + +import ( + "fyne.io/fyne/v2" +) + +func hideVirtualKeyboard() { + if d, ok := fyne.CurrentDevice().(*glDevice); ok { + d.hideVirtualKeyboard() + } +} + +func handleKeyboard(obj fyne.Focusable) { + isDisabled := false + if disWid, ok := obj.(fyne.Disableable); ok { + isDisabled = disWid.Disabled() + } + if obj != nil && !isDisabled { + showVirtualKeyboard() + } else { + hideVirtualKeyboard() + } +} + +func showVirtualKeyboard() { + if d, ok := fyne.CurrentDevice().(*glDevice); ok { + d.showVirtualKeyboard() + } +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/loop.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/loop.go new file mode 100644 index 0000000..d66fb4f --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/loop.go @@ -0,0 +1,243 @@ +package glfw + +import ( + "runtime" + "sync/atomic" + "time" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/app" + "fyne.io/fyne/v2/internal/async" + "fyne.io/fyne/v2/internal/cache" + "fyne.io/fyne/v2/internal/driver/common" + "fyne.io/fyne/v2/internal/painter" + "fyne.io/fyne/v2/internal/scale" +) + +type funcData struct { + f func() + done chan struct{} // Zero allocation signalling channel +} + +// channel for queuing functions on the main thread +var ( + funcQueue = async.NewUnboundedChan[funcData]() + running, drained atomic.Bool +) + +// Arrange that main.main runs on main thread. +func init() { + runtime.LockOSThread() + async.SetMainGoroutine() +} + +// force a function f to run on the main thread +func runOnMain(f func()) { + runOnMainWithWait(f, true) +} + +// force a function f to run on the main thread and specify if we should wait for it to return +func runOnMainWithWait(f func(), wait bool) { + // If we are on main before app run just execute - otherwise add it to the main queue and wait. + // We also need to run it as-is if the app is in the process of shutting down as the queue will be stopped. + if (!running.Load() && async.IsMainGoroutine()) || drained.Load() { + f() + return + } + + if wait { + done := common.DonePool.Get() + defer common.DonePool.Put(done) + + funcQueue.In() <- funcData{f: f, done: done} + <-done + } else { + funcQueue.In() <- funcData{f: f} + } +} + +func (d *gLDriver) drawSingleFrame() { + refreshed := false + for _, win := range d.windowList() { + w := win.(*window) + if w.closing { + continue + } + + // CheckDirtyAndClear must be checked after visibility, + // because when a window becomes visible, it could be + // showing old content without a dirty flag set to true. + // Do the clear if and only if the window is visible. + if !w.visible || !w.canvas.CheckDirtyAndClear() { + // Window hidden or not being redrawn, mark canvasForObject + // cache alive if it hasn't been done recently + // n.b. we need to make sure threshold is a bit *after* + // time.Now() - CacheDuration() + threshold := time.Now().Add(10*time.Second - cache.ValidDuration) + if w.lastWalkedTime.Before(threshold) { + w.canvas.WalkTrees(nil, func(node *common.RenderCacheNode, _ fyne.Position) { + // marks canvas for object cache entry alive + _ = cache.GetCanvasForObject(node.Obj()) + // marks renderer cache entry alive + if wid, ok := node.Obj().(fyne.Widget); ok { + _, _ = cache.CachedRenderer(wid) + } + }) + w.lastWalkedTime = time.Now() + } + continue + } + + w.RunWithContext(func() { + if w.driver.repaintWindow(w) { + refreshed = true + } + }) + } + cache.Clean(refreshed) +} + +func (d *gLDriver) runGL() { + if !running.CompareAndSwap(false, true) { + return // Run was called twice. + } + + d.init() + if d.trayStart != nil { + d.trayStart() + } + + fyne.CurrentApp().Settings().AddListener(func(set fyne.Settings) { + painter.ClearFontCache() + cache.ResetThemeCaches() + app.ApplySettingsWithCallback(set, fyne.CurrentApp(), func(w fyne.Window) { + c, ok := w.Canvas().(*glCanvas) + if !ok { + return + } + c.applyThemeOutOfTreeObjects() + c.reloadScale() + }) + }) + + if f := fyne.CurrentApp().Lifecycle().(*app.Lifecycle).OnStarted(); f != nil { + f() + } + + eventTick := time.NewTicker(time.Second / 60) + for { + select { + case <-d.done: + eventTick.Stop() + d.Terminate() + l := fyne.CurrentApp().Lifecycle().(*app.Lifecycle) + if f := l.OnStopped(); f != nil { + l.QueueEvent(f) + } + + // as we are shutting down make sure we drain the pending funcQueue and close it out. + for len(funcQueue.Out()) > 0 { + f := <-funcQueue.Out() + if f.done != nil { + f.done <- struct{}{} + } + } + drained.Store(true) + funcQueue.Close() + return + case f := <-funcQueue.Out(): + f.f() + if f.done != nil { + f.done <- struct{}{} + } + case <-eventTick.C: + d.pollEvents() + for i := 0; i < len(d.windows); i++ { + w := d.windows[i].(*window) + if w.viewport == nil { + continue + } + + if w.viewport.ShouldClose() { + d.destroyWindow(w, i) + i-- // Trailing windows are moved forward one step. + continue + } + + expand := w.shouldExpand + fullScreen := w.fullScreen + + if expand && !fullScreen { + w.fitContent() + shouldExpand := w.shouldExpand + w.shouldExpand = false + view := w.viewport + + if shouldExpand && runtime.GOOS != "js" { + view.SetSize(w.shouldWidth, w.shouldHeight) + } + } + } + + d.animation.TickAnimations() + d.drawSingleFrame() + } + } +} + +func (d *gLDriver) destroyWindow(w *window, index int) { + w.visible = false + w.viewport.Destroy() + w.destroy(d) + + if index < len(d.windows)-1 { + copy(d.windows[index:], d.windows[index+1:]) + } + d.windows[len(d.windows)-1] = nil + d.windows = d.windows[:len(d.windows)-1] + + if len(d.windows) == 0 { + d.Quit() + } +} + +func (d *gLDriver) repaintWindow(w *window) bool { + canvas := w.canvas + freed := false + if canvas.EnsureMinSize() { + w.shouldExpand = true + } + freed = canvas.FreeDirtyTextures() > 0 + + updateGLContext(w) + canvas.paint(canvas.Size()) + + view := w.viewport + visible := w.visible + + if view != nil && visible { + view.SwapBuffers() + } + + // mark that we have walked the window and don't + // need to walk it again to mark caches alive + w.lastWalkedTime = time.Now() + return freed +} + +// refreshWindow requests that the specified window be redrawn +func refreshWindow(w *window) { + w.canvas.SetDirty() +} + +func updateGLContext(w *window) { + canvas := w.canvas + size := canvas.Size() + + // w.width and w.height are not correct if we are maximised, so figure from canvas + winWidth := float32(scale.ToScreenCoordinate(canvas, size.Width)) * canvas.texScale + winHeight := float32(scale.ToScreenCoordinate(canvas, size.Height)) * canvas.texScale + + canvas.Painter().SetFrameBufferScale(canvas.texScale) + canvas.Painter().SetOutputSize(int(winWidth), int(winHeight)) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/loop_desktop.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/loop_desktop.go new file mode 100644 index 0000000..5c22301 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/loop_desktop.go @@ -0,0 +1,27 @@ +//go:build !wasm && !test_web_driver + +package glfw + +import ( + "fyne.io/fyne/v2" + + "github.com/go-gl/glfw/v3.3/glfw" +) + +func (d *gLDriver) initGLFW() { + err := glfw.Init() + if err != nil { + fyne.LogError("failed to initialise GLFW", err) + return + } + + initCursors() +} + +func (d *gLDriver) pollEvents() { + glfw.PollEvents() // This call blocks while window is being resized, which prevents freeDirtyTextures from being called +} + +func (d *gLDriver) Terminate() { + glfw.Terminate() +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/loop_wasm.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/loop_wasm.go new file mode 100644 index 0000000..6536115 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/loop_wasm.go @@ -0,0 +1,26 @@ +//go:build wasm || test_web_driver + +package glfw + +import ( + "fyne.io/fyne/v2" + + "github.com/fyne-io/gl-js" + "github.com/fyne-io/glfw-js" +) + +func (d *gLDriver) initGLFW() { + err := glfw.Init(gl.ContextWatcher) + if err != nil { + fyne.LogError("failed to initialise GLFW", err) + return + } +} + +func (d *gLDriver) pollEvents() { + glfw.PollEvents() // This call blocks while window is being resized, which prevents freeDirtyTextures from being called +} + +func (d *gLDriver) Terminate() { + glfw.Terminate() +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/menu.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/menu.go new file mode 100644 index 0000000..9c1008c --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/menu.go @@ -0,0 +1,15 @@ +package glfw + +import ( + "fyne.io/fyne/v2" +) + +func buildMenuOverlay(menus *fyne.MainMenu, w *window) fyne.CanvasObject { + if len(menus.Items) == 0 { + fyne.LogError("Main menu must have at least one child menu", nil) + return nil + } + + menus = addMissingQuitForMainMenu(menus, w) + return NewMenuBar(menus, w.canvas) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/menu_bar.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/menu_bar.go new file mode 100644 index 0000000..02caddf --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/menu_bar.go @@ -0,0 +1,209 @@ +package glfw + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/driver/desktop" + "fyne.io/fyne/v2/internal/widget" + "fyne.io/fyne/v2/theme" +) + +var _ fyne.Widget = (*MenuBar)(nil) + +// MenuBar is a widget for displaying a fyne.MainMenu in a bar. +type MenuBar struct { + widget.Base + Items []fyne.CanvasObject + + active bool + activeItem *menuBarItem + canvas fyne.Canvas +} + +// NewMenuBar creates a menu bar populated with items from the passed main menu structure. +func NewMenuBar(mainMenu *fyne.MainMenu, canvas fyne.Canvas) *MenuBar { + items := make([]fyne.CanvasObject, len(mainMenu.Items)) + b := &MenuBar{Items: items, canvas: canvas} + b.ExtendBaseWidget(b) + for i, menu := range mainMenu.Items { + barItem := &menuBarItem{Menu: menu, Parent: b} + barItem.ExtendBaseWidget(barItem) + items[i] = barItem + } + return b +} + +// CreateRenderer returns a new renderer for the menu bar. +func (b *MenuBar) CreateRenderer() fyne.WidgetRenderer { + cont := container.NewHBox(b.Items...) + background := canvas.NewRectangle(theme.Color(theme.ColorNameBackground)) + underlay := &menuBarUnderlay{action: b.deactivate} + underlay.ExtendBaseWidget(underlay) + objects := []fyne.CanvasObject{underlay, background, cont} + for _, item := range b.Items { + objects = append(objects, item.(*menuBarItem).Child()) + } + return &menuBarRenderer{ + widget.NewShadowingRenderer(objects, widget.MenuLevel), + b, + background, + underlay, + cont, + } +} + +// IsActive returns whether the menu bar is active or not. +// An active menu bar shows the current selected menu and should have the focus. +func (b *MenuBar) IsActive() bool { + return b.active +} + +// Toggle changes the activation state of the menu bar. +// On activation, the first item will become active. +func (b *MenuBar) Toggle() { + b.toggle(b.Items[0].(*menuBarItem)) +} + +func (b *MenuBar) activateChild(item *menuBarItem) { + b.active = true + if item.Child() != nil { + item.Child().DeactivateChild() + } + if b.activeItem == item { + return + } + + if b.activeItem != nil { + if c := b.activeItem.Child(); c != nil { + c.Hide() + } + b.activeItem.Refresh() + } + b.activeItem = item + if item == nil { + return + } + + item.Refresh() + item.Child().Show() + b.Refresh() +} + +func (b *MenuBar) deactivate() { + if !b.active { + return + } + + b.active = false + if b.activeItem != nil { + if c := b.activeItem.Child(); c != nil { + defer c.Dismiss() + c.Hide() + } + b.activeItem.Refresh() + b.activeItem = nil + } + b.Refresh() +} + +func (b *MenuBar) toggle(item *menuBarItem) { + if b.active { + b.canvas.Unfocus() + b.deactivate() + } else { + b.activateChild(item) + b.canvas.Focus(item) + } +} + +type menuBarRenderer struct { + *widget.ShadowingRenderer + b *MenuBar + background *canvas.Rectangle + underlay *menuBarUnderlay + cont *fyne.Container +} + +func (r *menuBarRenderer) Layout(size fyne.Size) { + r.LayoutShadow(size, fyne.NewPos(0, 0)) + minSize := r.MinSize() + if size.Height != minSize.Height || size.Width < minSize.Width { + r.b.Resize(fyne.NewSize(fyne.Max(size.Width, minSize.Width), minSize.Height)) + return + } + + if r.b.active { + r.underlay.Resize(r.b.canvas.Size()) + } else { + r.underlay.Resize(fyne.NewSize(0, 0)) + } + innerPadding := theme.InnerPadding() + r.cont.Resize(fyne.NewSize(size.Width-2*innerPadding, size.Height)) + r.cont.Move(fyne.NewPos(innerPadding, 0)) + if item := r.b.activeItem; item != nil { + if item.Child().Size().IsZero() { + item.Child().Resize(item.Child().MinSize()) + } + item.Child().Move(fyne.NewPos(item.Position().X+innerPadding, item.Size().Height)) + } + r.background.Resize(size) +} + +func (r *menuBarRenderer) MinSize() fyne.Size { + return r.cont.MinSize().Add(fyne.NewSize(theme.InnerPadding()*2, 0)) +} + +func (r *menuBarRenderer) Refresh() { + r.Layout(r.b.Size()) + r.background.FillColor = theme.Color(theme.ColorNameBackground) + r.background.Refresh() + r.ShadowingRenderer.RefreshShadow() + canvas.Refresh(r.b) +} + +// Transparent underlay shown as soon as menu is active. +// It catches mouse events outside the menu's objects. +type menuBarUnderlay struct { + widget.Base + action func() +} + +var ( + _ fyne.Widget = (*menuBarUnderlay)(nil) + _ fyne.Tappable = (*menuBarUnderlay)(nil) // deactivate menu on click outside + _ desktop.Hoverable = (*menuBarUnderlay)(nil) // block hover events on main content +) + +func (u *menuBarUnderlay) CreateRenderer() fyne.WidgetRenderer { + return &menuUnderlayRenderer{} +} + +func (u *menuBarUnderlay) MouseIn(*desktop.MouseEvent) { +} + +func (u *menuBarUnderlay) MouseOut() { +} + +func (u *menuBarUnderlay) MouseMoved(*desktop.MouseEvent) { +} + +func (u *menuBarUnderlay) Tapped(*fyne.PointEvent) { + u.action() +} + +type menuUnderlayRenderer struct { + widget.BaseRenderer +} + +var _ fyne.WidgetRenderer = (*menuUnderlayRenderer)(nil) + +func (r *menuUnderlayRenderer) Layout(fyne.Size) { +} + +func (r *menuUnderlayRenderer) MinSize() fyne.Size { + return fyne.NewSize(0, 0) +} + +func (r *menuUnderlayRenderer) Refresh() { +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/menu_bar_item.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/menu_bar_item.go new file mode 100644 index 0000000..89095d6 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/menu_bar_item.go @@ -0,0 +1,172 @@ +package glfw + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/driver/desktop" + "fyne.io/fyne/v2/internal/widget" + "fyne.io/fyne/v2/theme" + publicWidget "fyne.io/fyne/v2/widget" +) + +var ( + _ fyne.Widget = (*menuBarItem)(nil) + _ desktop.Hoverable = (*menuBarItem)(nil) + _ fyne.Focusable = (*menuBarItem)(nil) +) + +// menuBarItem is a widget for displaying an item for a fyne.Menu in a MenuBar. +type menuBarItem struct { + widget.Base + Menu *fyne.Menu + Parent *MenuBar + + active bool + child *publicWidget.Menu + hovered bool +} + +func (i *menuBarItem) Child() *publicWidget.Menu { + if i.child == nil { + child := publicWidget.NewMenu(i.Menu) + child.Hide() + child.OnDismiss = i.Parent.deactivate + i.child = child + } + return i.child +} + +// CreateRenderer returns a new renderer for the menu bar item. +func (i *menuBarItem) CreateRenderer() fyne.WidgetRenderer { + background := canvas.NewRectangle(theme.Color(theme.ColorNameHover)) + background.CornerRadius = theme.SelectionRadiusSize() + background.Hide() + text := canvas.NewText(i.Menu.Label, theme.Color(theme.ColorNameForeground)) + objects := []fyne.CanvasObject{background, text} + + return &menuBarItemRenderer{ + widget.NewBaseRenderer(objects), + i, + text, + background, + } +} + +func (i *menuBarItem) FocusGained() { + i.active = true + if i.Parent.active { + i.Parent.activateChild(i) + } + i.Refresh() +} + +func (i *menuBarItem) FocusLost() { + i.active = false + i.Refresh() +} + +func (i *menuBarItem) Focused() bool { + return i.active +} + +// MouseIn activates the item and shows the menu if the bar is active. +// The menu that was displayed before will be hidden. +// +// If the bar is not active, the item will be hovered. +func (i *menuBarItem) MouseIn(_ *desktop.MouseEvent) { + i.hovered = true + if i.Parent.active { + i.Parent.canvas.Focus(i) + } + i.Refresh() +} + +// MouseMoved activates the item and shows the menu if the bar is active. +// The menu that was displayed before will be hidden. +// This might have an effect when mouse and keyboard control are mixed. +// Changing the active menu with the keyboard will make the hovered menu bar item inactive. +// On the next mouse move the hovered item is activated again. +// +// If the bar is not active, this will do nothing. +func (i *menuBarItem) MouseMoved(_ *desktop.MouseEvent) { + if i.Parent.active { + i.Parent.canvas.Focus(i) + } +} + +// MouseOut does nothing if the bar is active. +// +// IF the bar is not active, it changes the item to not be hovered. +func (i *menuBarItem) MouseOut() { + i.hovered = false + i.Refresh() +} + +// Tapped toggles the activation state of the menu bar. +// It shows the item’s menu if the bar is activated and hides it if the bar is deactivated. +func (i *menuBarItem) Tapped(*fyne.PointEvent) { + i.Parent.toggle(i) +} + +func (i *menuBarItem) TypedKey(event *fyne.KeyEvent) { + switch event.Name { + case fyne.KeyLeft: + if !i.Child().DeactivateLastSubmenu() { + i.Parent.canvas.FocusPrevious() + } + case fyne.KeyRight: + if !i.Child().ActivateLastSubmenu() { + i.Parent.canvas.FocusNext() + } + case fyne.KeyDown: + i.Child().ActivateNext() + case fyne.KeyUp: + i.Child().ActivatePrevious() + case fyne.KeyEnter, fyne.KeyReturn, fyne.KeySpace: + i.Child().TriggerLast() + } +} + +func (i *menuBarItem) TypedRune(_ rune) { +} + +type menuBarItemRenderer struct { + widget.BaseRenderer + i *menuBarItem + text *canvas.Text + background *canvas.Rectangle +} + +func (r *menuBarItemRenderer) Layout(size fyne.Size) { + padding := r.padding() + + r.text.TextSize = theme.TextSize() + r.text.Color = theme.Color(theme.ColorNameForeground) + r.text.Resize(r.text.MinSize()) + r.text.Move(fyne.NewPos(padding.Width/2, padding.Height/2)) + + r.background.Resize(size) +} + +func (r *menuBarItemRenderer) MinSize() fyne.Size { + return r.text.MinSize().Add(r.padding()) +} + +func (r *menuBarItemRenderer) Refresh() { + r.background.CornerRadius = theme.SelectionRadiusSize() + if r.i.active && r.i.Parent.active { + r.background.FillColor = theme.Color(theme.ColorNameFocus) + r.background.Show() + } else if r.i.hovered && !r.i.Parent.active { + r.background.FillColor = theme.Color(theme.ColorNameHover) + r.background.Show() + } else { + r.background.Hide() + } + r.background.Refresh() + canvas.Refresh(r.i) +} + +func (r *menuBarItemRenderer) padding() fyne.Size { + return fyne.NewSize(theme.InnerPadding()*2, theme.InnerPadding()) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/menu_darwin.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/menu_darwin.go new file mode 100644 index 0000000..e795be2 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/menu_darwin.go @@ -0,0 +1,354 @@ +//go:build darwin && !no_native_menus + +package glfw + +import ( + "bytes" + "fmt" + "image/color" + "image/png" + "strings" + "unsafe" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/internal/painter" + "fyne.io/fyne/v2/internal/svg" + "fyne.io/fyne/v2/theme" +) + +/* +#cgo CFLAGS: -x objective-c +#cgo LDFLAGS: -framework Foundation -framework AppKit + +#include + +// Using void* as type for pointers is a workaround. See https://github.com/golang/go/issues/12065. +void assignDarwinSubmenu(const void*, const void*); +void completeDarwinMenu(void* menu, bool prepend); +const void* createDarwinMenu(const char* label); +const void* darwinAppMenu(); +void getTextColorRGBA(int* r, int* g, int* b, int* a); +const void* insertDarwinMenuItem(const void* menu, const char* label, const char* keyEquivalent, unsigned int keyEquivalentModifierMask, int id, int index, bool isSeparator, const void *imageData, unsigned int imageDataLength); +int menuFontSize(); +void resetDarwinMenu(); + +// Used for tests. +const void* test_darwinMainMenu(); +const void* test_NSMenu_itemAtIndex(const void*, NSInteger); +NSInteger test_NSMenu_numberOfItems(const void*); +void test_NSMenu_performActionForItemAtIndex(const void*, NSInteger); +void test_NSMenu_removeItemAtIndex(const void* m, NSInteger i); +const char* test_NSMenu_title(const void*); +bool test_NSMenuItem_isSeparatorItem(const void*); +const char* test_NSMenuItem_keyEquivalent(const void*); +unsigned long test_NSMenuItem_keyEquivalentModifierMask(const void*); +const void* test_NSMenuItem_submenu(const void*); +const char* test_NSMenuItem_title(const void*); +*/ +import "C" + +type menuCallbacks struct { + action func() + enabled func() bool + checked func() bool +} + +var ( + callbacks []*menuCallbacks + ecb func(string) + specialKeys = map[fyne.KeyName]string{ + fyne.KeyBackspace: "\x08", + fyne.KeyDelete: "\x7f", + fyne.KeyDown: "\uf701", + fyne.KeyEnd: "\uf72b", + fyne.KeyEnter: "\x03", + fyne.KeyEscape: "\x1b", + fyne.KeyF10: "\uf70d", + fyne.KeyF11: "\uf70e", + fyne.KeyF12: "\uf70f", + fyne.KeyF1: "\uf704", + fyne.KeyF2: "\uf705", + fyne.KeyF3: "\uf706", + fyne.KeyF4: "\uf707", + fyne.KeyF5: "\uf708", + fyne.KeyF6: "\uf709", + fyne.KeyF7: "\uf70a", + fyne.KeyF8: "\uf70b", + fyne.KeyF9: "\uf70c", + fyne.KeyHome: "\uf729", + fyne.KeyInsert: "\uf727", + fyne.KeyLeft: "\uf702", + fyne.KeyPageDown: "\uf72d", + fyne.KeyPageUp: "\uf72c", + fyne.KeyReturn: "\n", + fyne.KeyRight: "\uf703", + fyne.KeySpace: " ", + fyne.KeyTab: "\t", + fyne.KeyUp: "\uf700", + } +) + +func addNativeMenu(w *window, menu *fyne.Menu, nextItemID int, prepend bool) int { + menu, nextItemID = handleSpecialItems(w, menu, nextItemID, true) + + containsItems := false + for _, item := range menu.Items { + if !item.IsSeparator { + containsItems = true + break + } + } + if !containsItems { + return nextItemID + } + + nsMenu, nextItemID := createNativeMenu(w, menu, nextItemID) + C.completeDarwinMenu(nsMenu, C.bool(prepend)) + return nextItemID +} + +func addNativeSubmenu(w *window, nsParentMenuItem unsafe.Pointer, menu *fyne.Menu, nextItemID int) int { + nsMenu, nextItemID := createNativeMenu(w, menu, nextItemID) + C.assignDarwinSubmenu(nsParentMenuItem, nsMenu) + return nextItemID +} + +func clearNativeMenu() { + C.resetDarwinMenu() +} + +func createNativeMenu(w *window, menu *fyne.Menu, nextItemID int) (unsafe.Pointer, int) { + nsMenu := C.createDarwinMenu(C.CString(menu.Label)) + for _, item := range menu.Items { + nsMenuItem := insertNativeMenuItem(nsMenu, item, nextItemID, -1) + nextItemID = registerCallback(w, item, nextItemID) + if item.ChildMenu != nil { + nextItemID = addNativeSubmenu(w, nsMenuItem, item.ChildMenu, nextItemID) + } + } + return nsMenu, nextItemID +} + +//export exceptionCallback +func exceptionCallback(e *C.char) { + msg := C.GoString(e) + if ecb == nil { + panic("unhandled Obj-C exception: " + msg) + } + ecb(msg) +} + +func handleSpecialItems(w *window, menu *fyne.Menu, nextItemID int, addSeparator bool) (*fyne.Menu, int) { + menu = fyne.NewMenu(menu.Label, menu.Items...) // copy so we can manipulate + for i := 0; i < len(menu.Items); i++ { + item := menu.Items[i] + switch item.Label { + case "About", "Settings", "Settings…", "Preferences", "Preferences…": + items := make([]*fyne.MenuItem, 0, len(menu.Items)-1) + items = append(items, menu.Items[:i]...) + items = append(items, menu.Items[i+1:]...) + menu, nextItemID = handleSpecialItems(w, fyne.NewMenu(menu.Label, items...), nextItemID, false) + i-- + + insertNativeMenuItem(C.darwinAppMenu(), item, nextItemID, 1) + if addSeparator && item.Label != "About" { + C.insertDarwinMenuItem( + C.darwinAppMenu(), + C.CString(""), + C.CString(""), + C.uint(0), + C.int(nextItemID), + C.int(1), + C.bool(true), + unsafe.Pointer(nil), + C.uint(0), + ) + } + nextItemID = registerCallback(w, item, nextItemID) + } + } + return menu, nextItemID +} + +// TODO: theme change support, see NSSystemColorsDidChangeNotification +func insertNativeMenuItem(nsMenu unsafe.Pointer, item *fyne.MenuItem, nextItemID, index int) unsafe.Pointer { + var imgData unsafe.Pointer + var imgDataLength uint + if item.Icon != nil { + if svg.IsResourceSVG(item.Icon) { + rsc := item.Icon + if _, isThemed := rsc.(*theme.ThemedResource); isThemed { + var r, g, b, a C.int + C.getTextColorRGBA(&r, &g, &b, &a) + content, err := svg.Colorize(rsc.Content(), color.NRGBA{R: uint8(r), G: uint8(g), B: uint8(b), A: uint8(a)}) + if err != nil { + fyne.LogError("", err) + } + rsc = &fyne.StaticResource{ + StaticName: rsc.Name(), + StaticContent: content, + } + } + size := int(C.menuFontSize()) + img := painter.PaintImage(&canvas.Image{Resource: rsc}, nil, size, size) + var buf bytes.Buffer + if err := png.Encode(&buf, img); err != nil { + fyne.LogError("failed to render menu icon", err) + } else { + imgData = unsafe.Pointer(&buf.Bytes()[0]) + imgDataLength = uint(buf.Len()) + } + } else { + imgData = unsafe.Pointer(&item.Icon.Content()[0]) + imgDataLength = uint(len(item.Icon.Content())) + } + } + return C.insertDarwinMenuItem( + nsMenu, + C.CString(item.Label), + C.CString(keyEquivalent(item)), + C.uint(keyEquivalentModifierMask(item)), + C.int(nextItemID), + C.int(index), + C.bool(item.IsSeparator), + imgData, + C.uint(imgDataLength), + ) +} + +func keyEquivalent(item *fyne.MenuItem) (key string) { + if s, ok := item.Shortcut.(fyne.KeyboardShortcut); ok { + if key = specialKeys[s.Key()]; key == "" { + if len(s.Key()) > 1 { + fyne.LogError(fmt.Sprintf("unsupported key “%s” for menu shortcut", s.Key()), nil) + } + key = strings.ToLower(string(s.Key())) + } + } + return key +} + +func keyEquivalentModifierMask(item *fyne.MenuItem) (mask uint) { + if s, ok := item.Shortcut.(fyne.KeyboardShortcut); ok { + if (s.Mod() & fyne.KeyModifierShift) != 0 { + mask |= 1 << 17 // NSEventModifierFlagShift + } + if (s.Mod() & fyne.KeyModifierAlt) != 0 { + mask |= 1 << 19 // NSEventModifierFlagOption + } + if (s.Mod() & fyne.KeyModifierControl) != 0 { + mask |= 1 << 18 // NSEventModifierFlagControl + } + if (s.Mod() & fyne.KeyModifierSuper) != 0 { + mask |= 1 << 20 // NSEventModifierFlagCommand + } + } + return mask +} + +func registerCallback(w *window, item *fyne.MenuItem, nextItemID int) int { + if !item.IsSeparator { + callbacks = append(callbacks, &menuCallbacks{ + action: func() { + if item.Action != nil { + item.Action() + } + }, + enabled: func() bool { + return !item.Disabled + }, + checked: func() bool { + return item.Checked + }, + }) + nextItemID++ + } + return nextItemID +} + +func setExceptionCallback(cb func(string)) { + ecb = cb +} + +//export menuCallback +func menuCallback(id int) { + callbacks[id].action() +} + +//export menuEnabled +func menuEnabled(id int) bool { + return callbacks[id].enabled() +} + +//export menuChecked +func menuChecked(id int) bool { + return callbacks[id].checked() +} + +func setupNativeMenu(w *window, main *fyne.MainMenu) { + clearNativeMenu() + nextItemID := 0 + callbacks = []*menuCallbacks{} + var helpMenu *fyne.Menu + for i := len(main.Items) - 1; i >= 0; i-- { + menu := main.Items[i] + if menu.Label == "Help" { + helpMenu = menu + continue + } + nextItemID = addNativeMenu(w, menu, nextItemID, true) + } + if helpMenu != nil { + addNativeMenu(w, helpMenu, nextItemID, false) + } +} + +// +// Test support methods +// These are needed because CGo is not supported inside test files. +// + +func testDarwinMainMenu() unsafe.Pointer { + return C.test_darwinMainMenu() +} + +func testNSMenuItemAtIndex(m unsafe.Pointer, i int) unsafe.Pointer { + return C.test_NSMenu_itemAtIndex(m, C.long(i)) +} + +func testNSMenuNumberOfItems(m unsafe.Pointer) int { + return int(C.test_NSMenu_numberOfItems(m)) +} + +func testNSMenuPerformActionForItemAtIndex(m unsafe.Pointer, i int) { + C.test_NSMenu_performActionForItemAtIndex(m, C.long(i)) +} + +func testNSMenuRemoveItemAtIndex(m unsafe.Pointer, i int) { + C.test_NSMenu_removeItemAtIndex(m, C.long(i)) +} + +func testNSMenuTitle(m unsafe.Pointer) string { + return C.GoString(C.test_NSMenu_title(m)) +} + +func testNSMenuItemIsSeparatorItem(i unsafe.Pointer) bool { + return bool(C.test_NSMenuItem_isSeparatorItem(i)) +} + +func testNSMenuItemKeyEquivalent(i unsafe.Pointer) string { + return C.GoString(C.test_NSMenuItem_keyEquivalent(i)) +} + +func testNSMenuItemKeyEquivalentModifierMask(i unsafe.Pointer) uint64 { + return uint64(C.ulong(C.test_NSMenuItem_keyEquivalentModifierMask(i))) +} + +func testNSMenuItemSubmenu(i unsafe.Pointer) unsafe.Pointer { + return C.test_NSMenuItem_submenu(i) +} + +func testNSMenuItemTitle(i unsafe.Pointer) string { + return C.GoString(C.test_NSMenuItem_title(i)) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/menu_darwin.m b/vendor/fyne.io/fyne/v2/internal/driver/glfw/menu_darwin.m new file mode 100644 index 0000000..b40be98 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/menu_darwin.m @@ -0,0 +1,236 @@ +//go:build !no_native_menus + +#import +#import + +const int menuTagMin = 5000; + +#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 101400 +NSControlStateValue STATE_ON = NSControlStateValueOn; +NSControlStateValue STATE_OFF = NSControlStateValueOff; +#else +NSCellStateValue STATE_ON = NSOnState; +NSCellStateValue STATE_OFF = NSOffState; +#endif + + +extern void menuCallback(int); +extern BOOL menuEnabled(int); +extern BOOL menuChecked(int); +extern void exceptionCallback(const char*); + +@interface FyneMenuHandler : NSObject { +} +@end + +@implementation FyneMenuHandler ++ (void) tapped:(NSMenuItem*) item { + menuCallback([item tag]-menuTagMin); +} ++ (BOOL) validateMenuItem:(NSMenuItem*) item { + BOOL checked = menuChecked([item tag]-menuTagMin); + if (checked) { + [item setState:STATE_ON]; + } else { + [item setState:STATE_OFF]; + } + + return menuEnabled([item tag]-menuTagMin); +} +@end + +// forward declaration … we want methods to be ordered alphabetically +NSMenu* nativeMainMenu(); + +void assignDarwinSubmenu(const void* i, const void* m) { + NSMenu* menu = (NSMenu*)m; // this menu is created in the createDarwinMenu() function + NSMenuItem *item = (NSMenuItem*)i; + [item setSubmenu:menu]; // this retains the menu + [menu release]; // release the menu +} + +void completeDarwinMenu(const void* m, bool prepend) { + NSMenu* main = nativeMainMenu(); + NSMenuItem* top = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""]; + [top setTag:menuTagMin]; + if (prepend) { + [main insertItem:top atIndex:1]; + } else { + [main addItem:top]; + } + assignDarwinSubmenu(top, m); +} + +const void* createDarwinMenu(const char* label) { + return (void*)[[NSMenu alloc] initWithTitle:[NSString stringWithUTF8String:label]]; +} + +const void* darwinAppMenu() { + return [[nativeMainMenu() itemAtIndex:0] submenu]; +} + +void getTextColorRGBA(int* r, int* g, int* b, int* a) { + CGFloat fr, fg, fb, fa; + NSColor *c = [[NSColor selectedMenuItemTextColor] colorUsingColorSpace: [NSColorSpace sRGBColorSpace]]; + [c getRed: &fr green: &fg blue: &fb alpha: &fa]; + *r = fr*255.0; + *g = fg*255.0; + *b = fb*255.0; + *a = fa*255.0; +} + +void handleException(const char* m, id e) { + exceptionCallback([[NSString stringWithFormat:@"%s failed: %@", m, e] UTF8String]); +} + +int replacedAbout = 0; + +const void* insertDarwinMenuItem(const void* m, const char* label, const char* keyEquivalent, unsigned int keyEquivalentModifierMask, int nextId, int index, bool isSeparator, const void *imageData, unsigned int imageDataLength) { + NSMenu* menu = (NSMenu*)m; + NSMenuItem* item; + + if (strcmp(label, "About") == 0 && !replacedAbout) { + replacedAbout = 1; + item = [menu itemArray][0]; + [item setAction:@selector(tapped:)]; + [item setTarget:[FyneMenuHandler class]]; + [item setTag:nextId+menuTagMin]; + return item; + } + + if (isSeparator) { + item = [NSMenuItem separatorItem]; + } else { + item = [[NSMenuItem alloc] + initWithTitle:[NSString stringWithUTF8String:label] + action:@selector(tapped:) + keyEquivalent:[NSString stringWithUTF8String:keyEquivalent]]; + if (keyEquivalentModifierMask) { + [item setKeyEquivalentModifierMask: keyEquivalentModifierMask]; + } + [item setTarget:[FyneMenuHandler class]]; + [item setTag:nextId+menuTagMin]; + if (imageData) { + char *x = (char *)imageData; + NSData *data = [[NSData alloc] initWithBytes: imageData length: imageDataLength]; + NSImage *image = [[NSImage alloc] initWithData: data]; + [item setImage: image]; + [data release]; + [image release]; + } + } + + if (index > -1) { + [menu insertItem:item atIndex:index]; + } else { + [menu addItem:item]; + } + [item release]; // retained by the menu + return item; +} + +int menuFontSize() { + return ceil([[NSFont menuFontOfSize: 0] pointSize]); +} + +NSMenu* nativeMainMenu() { + NSApplication* app = [NSApplication sharedApplication]; + return [app mainMenu]; +} + +void resetDarwinMenu() { + NSMenu *root = nativeMainMenu(); + NSEnumerator *items = [[root itemArray] objectEnumerator]; + + id object; + while (object = [items nextObject]) { + NSMenuItem *item = object; + if ([item tag] < menuTagMin) { + // check for inserted items (like Settings...) + NSMenu *menu = [item submenu]; + NSEnumerator *subItems = [[menu itemArray] objectEnumerator]; + + id sub; + while (sub = [subItems nextObject]) { + NSMenuItem *item = sub; + if ([item tag] >= menuTagMin) { + [menu removeItem: item]; + } + } + + continue; + } + [root removeItem: item]; + } +} + +const void* test_darwinMainMenu() { + return nativeMainMenu(); +} + +const void* test_NSMenu_itemAtIndex(const void* m, NSInteger i) { + NSMenu* menu = (NSMenu*)m; + @try { + return [menu itemAtIndex: i]; + } @catch(NSException* e) { + handleException("test_NSMenu_itemAtIndex", e); + return NULL; + } +} + +NSInteger test_NSMenu_numberOfItems(const void* m) { + NSMenu* menu = (NSMenu*)m; + return [menu numberOfItems]; +} + +void test_NSMenu_performActionForItemAtIndex(const void* m, NSInteger i) { + NSMenu* menu = (NSMenu*)m; + @try { + // Using performActionForItemAtIndex: would be better but sadly it crashes. + // We simulate the relevant effect for now. + // [menu performActionForItemAtIndex:i]; + NSMenuItem* item = [menu itemAtIndex:i]; + [[item target] performSelector:[item action] withObject:item]; + } @catch(NSException* e) { + handleException("test_NSMenu_performActionForItemAtIndex", e); + } +} + +void test_NSMenu_removeItemAtIndex(const void* m, NSInteger i) { + NSMenu* menu = (NSMenu*)m; + @try { + [menu removeItemAtIndex: i]; + } @catch(NSException* e) { + handleException("test_NSMenu_removeItemAtIndex", e); + } +} + +const char* test_NSMenu_title(const void* m) { + NSMenu* menu = (NSMenu*)m; + return [[menu title] UTF8String]; +} + +bool test_NSMenuItem_isSeparatorItem(const void* i) { + NSMenuItem* item = (NSMenuItem*)i; + return [item isSeparatorItem]; +} + +const char* test_NSMenuItem_keyEquivalent(const void *i) { + NSMenuItem* item = (NSMenuItem*)i; + return [[item keyEquivalent] UTF8String]; +} + +unsigned long test_NSMenuItem_keyEquivalentModifierMask(const void *i) { + NSMenuItem* item = (NSMenuItem*)i; + return [item keyEquivalentModifierMask]; +} + +const void* test_NSMenuItem_submenu(const void* i) { + NSMenuItem* item = (NSMenuItem*)i; + return [item submenu]; +} + +const char* test_NSMenuItem_title(const void* i) { + NSMenuItem* item = (NSMenuItem*)i; + return [[item title] UTF8String]; +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/menu_notweb.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/menu_notweb.go new file mode 100644 index 0000000..6802cfe --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/menu_notweb.go @@ -0,0 +1,38 @@ +//go:build !wasm && !test_web_driver + +package glfw + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/lang" +) + +func addMissingQuitForMainMenu(menus *fyne.MainMenu, w *window) *fyne.MainMenu { + localQuit := lang.L("Quit") + var lastItem *fyne.MenuItem + if len(menus.Items[0].Items) > 0 { + lastItem = menus.Items[0].Items[len(menus.Items[0].Items)-1] + if lastItem.Label == localQuit { + lastItem.IsQuit = true + } + } + if lastItem == nil || !lastItem.IsQuit { // make sure the first menu always has a quit option + quitItem := fyne.NewMenuItem(localQuit, nil) + quitItem.IsQuit = true + menus.Items[0].Items = append(menus.Items[0].Items, fyne.NewMenuItemSeparator(), quitItem) + } + for _, item := range menus.Items[0].Items { + if item.IsQuit && item.Action == nil { + item.Action = func() { + for _, win := range w.driver.AllWindows() { + if glWin, ok := win.(*window); ok { + glWin.closed(glWin.view()) + } else { + win.Close() // for test windows + } + } + } + } + } + return menus +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/menu_other.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/menu_other.go new file mode 100644 index 0000000..b26ce98 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/menu_other.go @@ -0,0 +1,9 @@ +//go:build !darwin || no_native_menus + +package glfw + +import "fyne.io/fyne/v2" + +func setupNativeMenu(_ *window, _ *fyne.MainMenu) { + // no-op +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/menu_wasm.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/menu_wasm.go new file mode 100644 index 0000000..215937b --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/menu_wasm.go @@ -0,0 +1,10 @@ +//go:build wasm || test_web_driver + +package glfw + +import "fyne.io/fyne/v2" + +func addMissingQuitForMainMenu(menus *fyne.MainMenu, w *window) *fyne.MainMenu { + // no-op for a web browser + return menus +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/scale.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/scale.go new file mode 100644 index 0000000..90eb62c --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/scale.go @@ -0,0 +1,61 @@ +package glfw + +import ( + "math" + "os" + "strconv" + + "fyne.io/fyne/v2" +) + +const ( + baselineDPI = 120.0 + scaleEnvKey = "FYNE_SCALE" + scaleAuto = float32(-1.0) // some platforms allow setting auto-scale (linux/BSD) +) + +func calculateDetectedScale(widthMm, widthPx int) float32 { + dpi := float32(widthPx) / (float32(widthMm) / 25.4) + if dpi > 1000 || dpi < 10 { + dpi = baselineDPI + } + + scale := float32(float64(dpi) / baselineDPI) + if scale < 1.0 { + return 1.0 + } + return scale +} + +func calculateScale(user, system, detected float32) float32 { + if user < 0 { + user = 1.0 + } + + if system == scaleAuto { + system = detected + } + + raw := system * user + return float32(math.Round(float64(raw*10.0))) / 10.0 +} + +func userScale() float32 { + env := os.Getenv(scaleEnvKey) + + if env != "" && env != "auto" { + scale, err := strconv.ParseFloat(env, 32) + if err == nil && scale != 0 { + return float32(scale) + } + fyne.LogError("Error reading scale", err) + } + + if env != "auto" { + if setting := fyne.CurrentApp().Settings().Scale(); setting > 0 { + return setting + } + } + + return 1.0 // user preference for auto is now passed as 1 so the system auto is picked up +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/scroll_speed_darwin.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/scroll_speed_darwin.go new file mode 100644 index 0000000..dcc985d --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/scroll_speed_darwin.go @@ -0,0 +1,11 @@ +//go:build darwin + +package glfw + +const ( + // MacOS applies its own scroll accelerate curve, so set + // scrollAccelerateRate to 1 for no acceleration effect + scrollAccelerateRate = float64(1) + scrollAccelerateCutoff = float64(5) + scrollSpeed = float32(10) +) diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/scroll_speed_default.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/scroll_speed_default.go new file mode 100644 index 0000000..c101868 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/scroll_speed_default.go @@ -0,0 +1,9 @@ +//go:build !darwin && !wasm && !test_web_driver + +package glfw + +const ( + scrollAccelerateRate = float64(125) + scrollAccelerateCutoff = float64(10) + scrollSpeed = float32(25) +) diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/scroll_speed_wasm.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/scroll_speed_wasm.go new file mode 100644 index 0000000..1a73c07 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/scroll_speed_wasm.go @@ -0,0 +1,9 @@ +//go:build wasm || test_web_driver + +package glfw + +const ( + scrollAccelerateRate = float64(10) + scrollAccelerateCutoff = float64(5) + scrollSpeed = float32(0.2) +) diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/window.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/window.go new file mode 100644 index 0000000..de4b12d --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/window.go @@ -0,0 +1,999 @@ +package glfw + +import ( + "context" + "image/color" + _ "image/png" // for the icon + "math" + "runtime" + "time" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/driver/desktop" + "fyne.io/fyne/v2/internal/app" + "fyne.io/fyne/v2/internal/async" + "fyne.io/fyne/v2/internal/build" + "fyne.io/fyne/v2/internal/cache" + "fyne.io/fyne/v2/internal/driver" + "fyne.io/fyne/v2/internal/driver/common" + "fyne.io/fyne/v2/internal/scale" +) + +const ( + dragMoveThreshold = 2 // how far can we move before it is a drag + windowIconSize = 256 +) + +func (w *window) Title() string { + return w.title +} + +func (w *window) SetTitle(title string) { + w.title = title + + w.runOnMainWhenCreated(func() { + w.view().SetTitle(title) + }) +} + +func (w *window) FullScreen() bool { + return w.fullScreen +} + +// minSizeOnScreen gets the padded minimum size of a window content in screen pixels +func (w *window) minSizeOnScreen() (int, int) { + // get minimum size of content inside the window + return w.screenSize(w.canvas.MinSize()) +} + +// screenSize computes the actual output size of the given content size in screen pixels +func (w *window) screenSize(canvasSize fyne.Size) (int, int) { + return scale.ToScreenCoordinate(w.canvas, canvasSize.Width), scale.ToScreenCoordinate(w.canvas, canvasSize.Height) +} + +func (w *window) Resize(size fyne.Size) { + w.canvas.size = size + // we cannot perform this until window is prepared as we don't know its scale! + bigEnough := size.Max(w.canvas.canvasSize(w.canvas.Content().MinSize())) + w.runOnMainWhenCreated(func() { + width, height := scale.ToScreenCoordinate(w.canvas, bigEnough.Width), scale.ToScreenCoordinate(w.canvas, bigEnough.Height) + if w.fixedSize || !w.visible { // fixed size ignores future `resized` and if not visible we may not get the event + w.shouldWidth, w.shouldHeight = width, height + w.width, w.height = width, height + } + + w.requestedWidth, w.requestedHeight = width, height + if runtime.GOOS != "js" { + w.view().SetSize(width, height) + w.processResized(width, height) + } + }) +} + +func (w *window) FixedSize() bool { + return w.fixedSize +} + +func (w *window) SetFixedSize(fixed bool) { + w.fixedSize = fixed + w.runOnMainWhenCreated(func() { + w.fitContent() + if !w.centered { + w.processResized(w.width, w.height) + } + }) +} + +func (w *window) Padded() bool { + return w.canvas.padded +} + +func (w *window) SetPadded(padded bool) { + w.canvas.SetPadded(padded) + + w.runOnMainWhenCreated(w.fitContent) +} + +func (w *window) Icon() fyne.Resource { + if w.icon == nil { + return fyne.CurrentApp().Icon() + } + + return w.icon +} + +func (w *window) MainMenu() *fyne.MainMenu { + return w.mainmenu +} + +func (w *window) SetMainMenu(menu *fyne.MainMenu) { + w.mainmenu = menu + w.runOnMainWhenCreated(func() { + w.canvas.buildMenu(w, menu) + }) +} + +func (w *window) SetOnClosed(closed func()) { + w.onClosed = closed +} + +func (w *window) SetCloseIntercept(callback func()) { + w.onCloseIntercepted = callback +} + +func (w *window) calculatedScale() float32 { + return calculateScale(userScale(), fyne.CurrentDevice().SystemScaleForWindow(w), w.detectScale()) +} + +func (w *window) detectTextureScale() float32 { + view := w.view() + winWidth, _ := view.GetSize() + texWidth, _ := view.GetFramebufferSize() + return float32(texWidth) / float32(winWidth) +} + +func (w *window) Show() { + async.EnsureMain(func() { + if w.view() != nil { + w.doShowAgain() + return + } + + if !w.created { + w.created = true + w.create() + } + + if w.view() == nil { + return + } + + w.visible = true + view := w.view() + view.SetTitle(w.title) + + if !build.IsWayland && w.centered { + w.doCenterOnScreen() // lastly center if that was requested + } + view.Show() + + // save coordinates + if !build.IsWayland { + w.xpos, w.ypos = view.GetPos() + } + + if w.fullScreen { // this does not work if called before viewport.Show() + w.doSetFullScreen(true) + } + + // show top canvas element + if content := w.canvas.Content(); content != nil { + w.RunWithContext(func() { + w.driver.repaintWindow(w) + }) + } + }) +} + +func (w *window) Hide() { + async.EnsureMain(func() { + if w.closing || w.viewport == nil { + return + } + + w.visible = false + w.viewport.Hide() + }) +} + +func (w *window) Close() { + async.EnsureMain(func() { + if w.isClosing() { + return + } + + // trigger callbacks - early so window still exists + if fn := w.onClosed; fn != nil { + w.onClosed = nil // avoid possibility of calling twice + fn() + } + + w.closing = true + w.viewport.SetShouldClose(true) + + cache.RangeTexturesFor(w.canvas, w.canvas.Painter().Free) + w.canvas.WalkTrees(nil, func(node *common.RenderCacheNode, _ fyne.Position) { + if wid, ok := node.Obj().(fyne.Widget); ok { + cache.DestroyRenderer(wid) + } + }) + }) +} + +func (w *window) ShowAndRun() { + w.Show() + fyne.CurrentApp().Run() +} + +// Clipboard returns the system clipboard +func (w *window) Clipboard() fyne.Clipboard { + return NewClipboard() +} + +func (w *window) Content() fyne.CanvasObject { + return w.canvas.Content() +} + +func (w *window) SetContent(content fyne.CanvasObject) { + w.canvas.SetContent(content) + + async.EnsureMain(func() { + w.RunWithContext(w.RescaleContext) + }) +} + +func (w *window) Canvas() fyne.Canvas { + return w.canvas +} + +func (w *window) processClosed() { + if w.onCloseIntercepted != nil { + w.onCloseIntercepted() + return + } + + w.Close() +} + +// destroy this window and, if it's the last window quit the app +func (w *window) destroy(d *gLDriver) { + cache.CleanCanvas(w.canvas) + + if w.master { + d.Quit() + } else if runtime.GOOS == "darwin" { + d.focusPreviousWindow() + } +} + +func (w *window) drainPendingEvents() { + for _, fn := range w.pending { + fn() + } + w.pending = nil +} + +func (w *window) processMoved(x, y int) { + if !w.fullScreen { // don't save the move to top left when changing to fullscreen + // save coordinates + w.xpos, w.ypos = x, y + } + + if w.canvas.detectedScale == w.detectScale() { + return + } + + w.canvas.detectedScale = w.detectScale() + w.canvas.reloadScale() +} + +func (w *window) processResized(width, height int) { + canvasSize := w.computeCanvasSize(width, height) + if !w.fullScreen { + w.width = scale.ToScreenCoordinate(w.canvas, canvasSize.Width) + w.height = scale.ToScreenCoordinate(w.canvas, canvasSize.Height) + } + + if !w.visible { // don't redraw if hidden + w.canvas.Resize(canvasSize) + return + } + + if w.fixedSize { + w.canvas.Resize(canvasSize) + w.fitContent() + return + } + + w.RunWithContext(func() { + w.platformResize(canvasSize) + }) +} + +func (w *window) processFrameSized(width, height int) { + if width == 0 || height == 0 || runtime.GOOS != "darwin" { + return + } + + winWidth, _ := w.view().GetSize() + newTexScale := float32(width) / float32(winWidth) // This will be > 1.0 on a HiDPI screen + if w.canvas.texScale != newTexScale { + w.canvas.texScale = newTexScale + w.canvas.Refresh(w.canvas.Content()) // reset graphics to apply texture scale + } +} + +func (w *window) processRefresh() { + refreshWindow(w) +} + +func (w *window) findObjectAtPositionMatching(canvas *glCanvas, mouse fyne.Position, matches func(object fyne.CanvasObject) bool) (fyne.CanvasObject, fyne.Position, int) { + return driver.FindObjectAtPositionMatching(mouse, matches, canvas.Overlays().Top(), canvas.menu, canvas.Content()) +} + +func (w *window) processMouseMoved(xpos float64, ypos float64) { + previousPos := w.mousePos + w.mousePos = fyne.NewPos(scale.ToFyneCoordinate(w.canvas, int(xpos)), scale.ToFyneCoordinate(w.canvas, int(ypos))) + mousePos := w.mousePos + mouseButton := w.mouseButton + mouseDragPos := w.mouseDragPos + mouseOver := w.mouseOver + + cursor := desktop.Cursor(desktop.DefaultCursor) + + obj, pos, _ := w.findObjectAtPositionMatching(w.canvas, mousePos, func(object fyne.CanvasObject) bool { + if cursorable, ok := object.(desktop.Cursorable); ok { + cursor = cursorable.Cursor() + } + + _, hover := object.(desktop.Hoverable) + return hover + }) + + if w.cursor != cursor { + // cursor has changed, store new cursor and apply change via glfw + rawCursor, isCustomCursor := fyneToNativeCursor(cursor) + w.cursor = cursor + + if rawCursor == nil { + w.view().SetInputMode(CursorMode, CursorHidden) + } else { + w.view().SetInputMode(CursorMode, CursorNormal) + w.SetCursor(rawCursor) + } + w.setCustomCursor(rawCursor, isCustomCursor) + } + + if w.mouseButton != 0 && w.mouseButton != desktop.MouseButtonSecondary && !w.mouseDragStarted { + obj, pos, _ := w.findObjectAtPositionMatching(w.canvas, previousPos, func(object fyne.CanvasObject) bool { + _, ok := object.(fyne.Draggable) + return ok + }) + + deltaX := mousePos.X - mouseDragPos.X + deltaY := mousePos.Y - mouseDragPos.Y + overThreshold := math.Abs(float64(deltaX)) >= dragMoveThreshold || math.Abs(float64(deltaY)) >= dragMoveThreshold + + if wid, ok := obj.(fyne.Draggable); ok && overThreshold { + w.mouseDragged = wid + w.mouseDraggedOffset = previousPos.Subtract(pos) + w.mouseDraggedObjStart = obj.Position() + w.mouseDragStarted = true + } + } + + if obj != nil && !w.objIsDragged(obj) { + ev := &desktop.MouseEvent{Button: mouseButton} + ev.AbsolutePosition = mousePos + ev.Position = pos + + if hovered, ok := obj.(desktop.Hoverable); ok { + if hovered == mouseOver { + hovered.MouseMoved(ev) + } else { + w.mouseOut() + w.mouseIn(hovered, ev) + } + } else if mouseOver != nil { + isChild := false + driver.WalkCompleteObjectTree(mouseOver.(fyne.CanvasObject), + func(co fyne.CanvasObject, p1, p2 fyne.Position, s fyne.Size) bool { + if co == obj { + isChild = true + return true + } + return false + }, nil) + if !isChild { + w.mouseOut() + } + } + } else if mouseOver != nil && !w.objIsDragged(mouseOver) { + w.mouseOut() + } + + mouseDragged := w.mouseDragged + mouseDragPos = w.mouseDragPos + if mouseDragged != nil && w.mouseButton != desktop.MouseButtonSecondary { + if w.mouseButton > 0 { + draggedObjDelta := w.mouseDraggedObjStart.Subtract(mouseDragged.(fyne.CanvasObject).Position()) + ev := &fyne.DragEvent{} + ev.AbsolutePosition = mousePos + ev.Position = mousePos.Subtract(w.mouseDraggedOffset).Add(draggedObjDelta) + ev.Dragged = fyne.NewDelta(mousePos.X-mouseDragPos.X, mousePos.Y-mouseDragPos.Y) + wd := mouseDragged + wd.Dragged(ev) + } + + w.mouseDragStarted = true + w.mouseDragPos = mousePos + } +} + +func (w *window) objIsDragged(obj any) bool { + if w.mouseDragged != nil && obj != nil { + draggedObj, _ := obj.(fyne.Draggable) + return draggedObj == w.mouseDragged + } + return false +} + +func (w *window) mouseIn(obj desktop.Hoverable, ev *desktop.MouseEvent) { + if obj != nil { + obj.MouseIn(ev) + } + w.mouseOver = obj +} + +func (w *window) mouseOut() { + mouseOver := w.mouseOver + if mouseOver != nil { + mouseOver.MouseOut() + w.mouseOver = nil + } +} + +func (w *window) processMouseClicked(button desktop.MouseButton, action action, modifiers fyne.KeyModifier) { + w.mouseDragPos = w.mousePos + mousePos := w.mousePos + mouseDragStarted := w.mouseDragStarted + if mousePos.IsZero() { // window may not be focused (darwin mostly) and so position callbacks not happening + xpos, ypos := w.view().GetCursorPos() + w.mousePos = fyne.NewPos(scale.ToFyneCoordinate(w.canvas, int(xpos)), scale.ToFyneCoordinate(w.canvas, int(ypos))) + mousePos = w.mousePos + } + + co, pos, _ := w.findObjectAtPositionMatching(w.canvas, mousePos, func(object fyne.CanvasObject) bool { + switch object.(type) { + case fyne.Tappable, fyne.SecondaryTappable, fyne.DoubleTappable, fyne.Focusable, desktop.Mouseable: + return true + case fyne.Draggable: + if mouseDragStarted { + return true + } + } + + return false + }) + ev := &fyne.PointEvent{ + Position: pos, + AbsolutePosition: mousePos, + } + + coMouse := co + if wid, ok := co.(desktop.Mouseable); ok { + mev := &desktop.MouseEvent{ + Button: button, + Modifier: modifiers, + } + mev.Position = ev.Position + mev.AbsolutePosition = mousePos + w.mouseClickedHandleMouseable(mev, action, wid) + } + + if wid, ok := co.(fyne.Focusable); !ok || wid != w.canvas.Focused() { + ignore := false + _, _, _ = w.findObjectAtPositionMatching(w.canvas, mousePos, func(object fyne.CanvasObject) bool { + switch object.(type) { + case fyne.Focusable: + ignore = true + return true + } + + return false + }) + + if !ignore { // if a parent item under the mouse has focus then ignore this tap unfocus + w.canvas.Unfocus() + } + } + + switch action { + case press: + w.mouseButton |= button + case release: + w.mouseButton &= ^button + } + + mouseDragged := w.mouseDragged + mouseDragStarted = w.mouseDragStarted + mouseOver := w.mouseOver + shouldMouseOut := w.objIsDragged(mouseOver) && !w.objIsDragged(coMouse) + mousePressed := w.mousePressed + + if action == release && mouseDragged != nil { + if mouseDragStarted { + mouseDragged.DragEnd() + w.mouseDragStarted = false + } + if shouldMouseOut { + w.mouseOut() + } + w.mouseDragged = nil + } + + _, tap := co.(fyne.Tappable) + secondary, altTap := co.(fyne.SecondaryTappable) + if tap || altTap { + switch action { + case press: + w.mousePressed = co + case release: + if co == mousePressed && button == desktop.MouseButtonSecondary && altTap { + secondary.TappedSecondary(ev) + } + } + } + + // Check for double click/tap on left mouse button + if action == release && button == desktop.MouseButtonPrimary && !mouseDragStarted { + w.mouseClickedHandleTapDoubleTap(co, ev) + } +} + +func (w *window) mouseClickedHandleMouseable(mev *desktop.MouseEvent, action action, wid desktop.Mouseable) { + switch action { + case press: + wid.MouseDown(mev) + case release: + mouseDragged := w.mouseDragged + mouseDraggedOffset := w.mouseDraggedOffset + if mouseDragged == nil { + wid.MouseUp(mev) + } else { + if dragged, ok := mouseDragged.(desktop.Mouseable); ok { + mev.Position = mev.AbsolutePosition.Subtract(mouseDraggedOffset) + dragged.MouseUp(mev) + } else { + wid.MouseUp(mev) + } + } + } +} + +func (w *window) mouseClickedHandleTapDoubleTap(co fyne.CanvasObject, ev *fyne.PointEvent) { + _, doubleTap := co.(fyne.DoubleTappable) + if doubleTap { + w.mouseClickCount++ + w.mouseLastClick = co + + mouseCancelFunc := w.mouseCancelFunc + if mouseCancelFunc != nil { + mouseCancelFunc() + return + } + + go w.waitForDoubleTap(co, ev) + } else { + if wid, ok := co.(fyne.Tappable); ok && co == w.mousePressed { + wid.Tapped(ev) + } + w.mousePressed = nil + } +} + +func (w *window) waitForDoubleTap(co fyne.CanvasObject, ev *fyne.PointEvent) { + ctx, mouseCancelFunc := context.WithDeadline(context.TODO(), time.Now().Add(w.driver.DoubleTapDelay())) + defer runOnMain(mouseCancelFunc) + runOnMain(func() { + w.mouseCancelFunc = mouseCancelFunc + }) + + <-ctx.Done() + + runOnMain(func() { + w.waitForDoubleTapEnded(co, ev) + }) +} + +func (w *window) waitForDoubleTapEnded(co fyne.CanvasObject, ev *fyne.PointEvent) { + if w.mouseClickCount == 2 && w.mouseLastClick == co { + if wid, ok := co.(fyne.DoubleTappable); ok { + wid.DoubleTapped(ev) + } + } else if co == w.mousePressed { + if wid, ok := co.(fyne.Tappable); ok { + wid.Tapped(ev) + } + } + + w.mouseClickCount = 0 + w.mousePressed = nil + w.mouseCancelFunc = nil + w.mouseLastClick = nil +} + +func (w *window) processMouseScrolled(xoff float64, yoff float64) { + mousePos := w.mousePos + co, pos, _ := w.findObjectAtPositionMatching(w.canvas, mousePos, func(object fyne.CanvasObject) bool { + _, ok := object.(fyne.Scrollable) + return ok + }) + switch wid := co.(type) { + case fyne.Scrollable: + if math.Abs(xoff) >= scrollAccelerateCutoff { + xoff *= scrollAccelerateRate + } + if math.Abs(yoff) >= scrollAccelerateCutoff { + yoff *= scrollAccelerateRate + } + + ev := &fyne.ScrollEvent{} + ev.Scrolled = fyne.NewDelta(float32(xoff)*scrollSpeed, float32(yoff)*scrollSpeed) + ev.Position = pos + ev.AbsolutePosition = mousePos + wid.Scrolled(ev) + } +} + +func (w *window) capturesTab(modifier fyne.KeyModifier) bool { + if ent, ok := w.canvas.Focused().(fyne.Tabbable); ok && ent.AcceptsTab() { + return true + } + + switch modifier { + case 0: + w.canvas.FocusNext() + case fyne.KeyModifierShift: + w.canvas.FocusPrevious() + } + + return false +} + +func (w *window) processKeyPressed(keyName fyne.KeyName, keyASCII fyne.KeyName, scancode int, action action, keyDesktopModifier fyne.KeyModifier) { + keyEvent := &fyne.KeyEvent{Name: keyName, Physical: fyne.HardwareKey{ScanCode: scancode}} + + pendingMenuToggle := w.menuTogglePending + w.menuTogglePending = desktop.KeyNone + pendingMenuDeactivation := w.menuDeactivationPending + w.menuDeactivationPending = desktop.KeyNone + switch action { + case release: + if action == release && keyName != "" { + switch keyName { + case pendingMenuToggle: + w.canvas.ToggleMenu() + case pendingMenuDeactivation: + if w.canvas.DismissMenu() { + return + } + } + } + + if w.canvas.Focused() != nil { + if focused, ok := w.canvas.Focused().(desktop.Keyable); ok { + focused.KeyUp(keyEvent) + } + } else if w.canvas.onKeyUp != nil { + w.canvas.onKeyUp(keyEvent) + } + return // ignore key up in other core events + case press: + switch keyName { + case desktop.KeyAltLeft, desktop.KeyAltRight: + // compensate for GLFW modifiers bug https://github.com/glfw/glfw/issues/1630 + if (runtime.GOOS == "linux" && keyDesktopModifier == 0) || (runtime.GOOS != "linux" && keyDesktopModifier == fyne.KeyModifierAlt) { + w.menuTogglePending = keyName + } + case fyne.KeyEscape: + w.menuDeactivationPending = keyName + } + if w.canvas.Focused() != nil { + if focused, ok := w.canvas.Focused().(desktop.Keyable); ok { + focused.KeyDown(keyEvent) + } + } else if w.canvas.onKeyDown != nil { + w.canvas.onKeyDown(keyEvent) + } + default: + // key repeat will fall through to TypedKey and TypedShortcut + } + + modifierOtherThanShift := (keyDesktopModifier & fyne.KeyModifierControl) | + (keyDesktopModifier & fyne.KeyModifierAlt) | + (keyDesktopModifier & fyne.KeyModifierSuper) + if (keyName == fyne.KeyTab && modifierOtherThanShift == 0 && !w.capturesTab(keyDesktopModifier)) || + w.triggersShortcut(keyName, keyASCII, keyDesktopModifier) { + return + } + + // No shortcut detected, pass down to TypedKey + focused := w.canvas.Focused() + if focused != nil { + focused.TypedKey(keyEvent) + } else if w.canvas.onTypedKey != nil { + w.canvas.onTypedKey(keyEvent) + } +} + +// charInput defines the character with modifiers callback which is called when a +// Unicode character is input. +// +// Characters do not map 1:1 to physical keys, as a key may produce zero, one or more characters. +func (w *window) processCharInput(char rune) { + if focused := w.canvas.Focused(); focused != nil { + focused.TypedRune(char) + } else if w.canvas.onTypedRune != nil { + w.canvas.onTypedRune(char) + } +} + +func (w *window) processFocused(focus bool) { + if focus { + if curWindow == nil { + if f := fyne.CurrentApp().Lifecycle().(*app.Lifecycle).OnEnteredForeground(); f != nil { + f() + } + } + curWindow = w + w.canvas.FocusGained() + } else { + w.canvas.FocusLost() + w.mousePos = fyne.Position{} + + // check whether another window was focused or not + if curWindow != w { + return + } + + curWindow = nil + if f := fyne.CurrentApp().Lifecycle().(*app.Lifecycle).OnExitedForeground(); f != nil { + f() + } + } +} + +func (w *window) triggersShortcut(localizedKeyName fyne.KeyName, key fyne.KeyName, modifier fyne.KeyModifier) bool { + ctrlMod := fyne.KeyModifierControl + if isMacOSRuntime() { + ctrlMod = fyne.KeyModifierSuper + } + // User pressing physical keys Ctrl+V while using a Russian (or any non-ASCII) keyboard layout + // is reported as a fyne.KeyUnknown key with Control modifier. We should still consider this + // as a "Paste" shortcut. + // See https://github.com/fyne-io/fyne/pull/2587 for discussion. + keyName := localizedKeyName + resemblesShortcut := (modifier&(fyne.KeyModifierControl|fyne.KeyModifierSuper) != 0) + if (localizedKeyName == fyne.KeyUnknown) && resemblesShortcut && key != fyne.KeyUnknown { + keyName = key + } + + var shortcut fyne.Shortcut + if modifier == ctrlMod { + switch keyName { + case fyne.KeyZ: // detect undo shortcut + shortcut = &fyne.ShortcutUndo{} + case fyne.KeyY: // detect redo shortcut + shortcut = &fyne.ShortcutRedo{} + case fyne.KeyV: // detect paste shortcut + shortcut = &fyne.ShortcutPaste{ + Clipboard: NewClipboard(), + } + case fyne.KeyC, fyne.KeyInsert: // detect copy shortcut + shortcut = &fyne.ShortcutCopy{ + Clipboard: NewClipboard(), + } + case fyne.KeyX: // detect cut shortcut + shortcut = &fyne.ShortcutCut{ + Clipboard: NewClipboard(), + } + case fyne.KeyA: // detect selectAll shortcut + shortcut = &fyne.ShortcutSelectAll{} + } + } + + if modifier == fyne.KeyModifierShift { + switch keyName { + case fyne.KeyInsert: // detect paste shortcut + shortcut = &fyne.ShortcutPaste{ + Clipboard: NewClipboard(), + } + case fyne.KeyDelete: // detect cut shortcut + shortcut = &fyne.ShortcutCut{ + Clipboard: NewClipboard(), + } + } + } + + if shortcut == nil && modifier != 0 && !isKeyModifier(keyName) && modifier != fyne.KeyModifierShift { + shortcut = &desktop.CustomShortcut{ + KeyName: keyName, + Modifier: modifier, + } + } + + if shortcut != nil { + if w.triggerMainMenuShortcut(shortcut) { + return true + } + if focused, ok := w.canvas.Focused().(fyne.Shortcutable); ok { + shouldRunShortcut := true + type selectableText interface { + fyne.Disableable + SelectedText() string + } + if selectableTextWid, ok := focused.(selectableText); ok && selectableTextWid.Disabled() { + shouldRunShortcut = shortcut.ShortcutName() == "Copy" + } + if shouldRunShortcut { + focused.TypedShortcut(shortcut) + } + return shouldRunShortcut + } + w.canvas.TypedShortcut(shortcut) + return true + } + + return false +} + +func (w *window) triggerMenuShortcut(sh fyne.Shortcut, m *fyne.Menu) bool { + for _, i := range m.Items { + if i.Shortcut != nil && i.Shortcut.ShortcutName() == sh.ShortcutName() { + if f := i.Action; f != nil { + f() + return true + } + } + + if i.ChildMenu != nil && w.triggerMenuShortcut(sh, i.ChildMenu) { + return true + } + } + + return false +} + +func (w *window) triggerMainMenuShortcut(sh fyne.Shortcut) bool { + if w.mainmenu == nil { + return false + } + + for _, m := range w.mainmenu.Items { + if w.triggerMenuShortcut(sh, m) { + return true + } + } + + return false +} + +func (w *window) RunWithContext(f func()) { + if w.isClosing() { + return + } + w.view().MakeContextCurrent() + + f() + + w.DetachCurrentContext() +} + +func (w *window) Context() any { + return nil +} + +func (w *window) runOnMainWhenCreated(fn func()) { + if w.view() != nil { + async.EnsureMain(fn) + return + } + + w.pending = append(w.pending, fn) +} + +func (d *gLDriver) CreateWindow(title string) (win fyne.Window) { + if runtime.GOOS != "js" { + async.EnsureMain(func() { + win = d.createWindow(title, true) + }) + return win + } + + // handling multiple windows by overlaying on the root for web + var root fyne.Window + hasVisible := false + for _, w := range d.windows { + if w.(*window).visible { + hasVisible = true + root = w + break + } + } + + if !hasVisible { + return d.createWindow(title, true) + } + + c := root.Canvas().(*glCanvas) + multi := c.webExtraWindows + if multi == nil { + multi = container.NewMultipleWindows() + multi.Resize(c.Size()) + c.webExtraWindows = multi + } + inner := container.NewInnerWindow(title, canvas.NewRectangle(color.Transparent)) + multi.Add(inner) + + return wrapInnerWindow(inner, root, d) +} + +func (d *gLDriver) createWindow(title string, decorate bool) fyne.Window { + var ret *window + if title == "" { + title = defaultTitle + } + + d.init() + + ret = &window{title: title, decorate: decorate, driver: d} + ret.canvas = newCanvas() + ret.canvas.context = ret + ret.SetIcon(ret.icon) + d.addWindow(ret) + return ret +} + +func (w *window) doShowAgain() { + if w.isClosing() { + return + } + + view := w.view() + if !build.IsWayland { + view.SetPos(w.xpos, w.ypos) + } + view.Show() + w.visible = true + + if w.fullScreen { + w.doSetFullScreen(true) + } + + w.RunWithContext(func() { + w.driver.repaintWindow(w) + }) +} + +func (w *window) isClosing() bool { + return w.closing || w.viewport == nil +} + +func (w *window) toggleVisible() { + if w.visible { + w.Hide() + } else { + w.Show() + } +} + +func (d *gLDriver) CreateSplashWindow() fyne.Window { + win := d.createWindow("", false) + win.SetPadded(false) + win.CenterOnScreen() + return win +} + +func (d *gLDriver) AllWindows() []fyne.Window { + return d.windows +} + +func isKeyModifier(keyName fyne.KeyName) bool { + return keyName == desktop.KeyShiftLeft || keyName == desktop.KeyShiftRight || + keyName == desktop.KeyControlLeft || keyName == desktop.KeyControlRight || + keyName == desktop.KeyAltLeft || keyName == desktop.KeyAltRight || + keyName == desktop.KeySuperLeft || keyName == desktop.KeySuperRight +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_darwin.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_darwin.go new file mode 100644 index 0000000..8a8ea4b --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_darwin.go @@ -0,0 +1,39 @@ +//go:build darwin + +package glfw + +/* +#cgo CFLAGS: -x objective-c +#cgo LDFLAGS: -framework Foundation -framework AppKit + +#import + +void setFullScreen(bool full, void *window); +*/ +import "C" + +import ( + "runtime" + + "fyne.io/fyne/v2/driver" +) + +// assert we are implementing driver.NativeWindow +var _ driver.NativeWindow = (*window)(nil) + +func (w *window) RunNative(f func(any)) { + context := driver.MacWindowContext{} + if v := w.view(); v != nil { + context.NSWindow = uintptr(v.GetCocoaWindow()) + } + + f(context) +} + +func (w *window) doSetFullScreen(full bool) { + if runtime.GOOS == "darwin" { + win := w.view().GetCocoaWindow() + C.setFullScreen(C.bool(full), win) + return + } +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_darwin.m b/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_darwin.m new file mode 100644 index 0000000..7224f81 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_darwin.m @@ -0,0 +1,14 @@ +#import +#import + +void setFullScreen(bool full, void *win) { + NSWindow *window = (NSWindow*)win; + + NSUInteger masks = [window styleMask]; + bool isFull = masks & NSWindowStyleMaskFullScreen; + if (isFull == full) { + return; + } + + [window toggleFullScreen:NULL]; +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_desktop.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_desktop.go new file mode 100644 index 0000000..8bcd31a --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_desktop.go @@ -0,0 +1,819 @@ +//go:build !wasm && !test_web_driver + +package glfw + +import ( + "bytes" + "context" + "image" + _ "image/png" // for the icon + "os" + "runtime" + "strings" + "time" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/driver/desktop" + "fyne.io/fyne/v2/internal/async" + "fyne.io/fyne/v2/internal/build" + "fyne.io/fyne/v2/internal/cache" + "fyne.io/fyne/v2/internal/painter" + "fyne.io/fyne/v2/internal/painter/gl" + "fyne.io/fyne/v2/internal/scale" + "fyne.io/fyne/v2/internal/svg" + "fyne.io/fyne/v2/storage" + + "github.com/go-gl/glfw/v3.3/glfw" +) + +const ( + defaultTitle = "Fyne Application" + disableDPIDetectionEnvKey = "FYNE_DISABLE_DPI_DETECTION" +) + +// Input modes. +const ( + CursorMode glfw.InputMode = glfw.CursorMode + StickyKeysMode glfw.InputMode = glfw.StickyKeysMode + StickyMouseButtonsMode glfw.InputMode = glfw.StickyMouseButtonsMode + LockKeyMods glfw.InputMode = glfw.LockKeyMods + RawMouseMotion glfw.InputMode = glfw.RawMouseMotion +) + +// Cursor mode values. +const ( + CursorNormal int = glfw.CursorNormal + CursorHidden int = glfw.CursorHidden + CursorDisabled int = glfw.CursorDisabled +) + +var cursors [desktop.HiddenCursor + 1]*glfw.Cursor + +func initCursors() { + cursors = [desktop.HiddenCursor + 1]*glfw.Cursor{ + desktop.DefaultCursor: glfw.CreateStandardCursor(glfw.ArrowCursor), + desktop.TextCursor: glfw.CreateStandardCursor(glfw.IBeamCursor), + desktop.CrosshairCursor: glfw.CreateStandardCursor(glfw.CrosshairCursor), + desktop.PointerCursor: glfw.CreateStandardCursor(glfw.HandCursor), + desktop.HResizeCursor: glfw.CreateStandardCursor(glfw.HResizeCursor), + desktop.VResizeCursor: glfw.CreateStandardCursor(glfw.VResizeCursor), + desktop.HiddenCursor: nil, + } +} + +// Declare conformity to Window interface +var _ fyne.Window = (*window)(nil) + +type window struct { + viewport *glfw.Window + created bool + decorate bool + closing bool + fixedSize bool + + cursor desktop.Cursor + customCursor *glfw.Cursor + canvas *glCanvas + driver *gLDriver + title string + icon fyne.Resource + mainmenu *fyne.MainMenu + + master bool + fullScreen bool + centered bool + visible bool + + mousePos fyne.Position + mouseDragged fyne.Draggable + mouseDraggedObjStart fyne.Position + mouseDraggedOffset fyne.Position + mouseDragPos fyne.Position + mouseDragStarted bool + mouseButton desktop.MouseButton + mouseOver desktop.Hoverable + mouseLastClick fyne.CanvasObject + mousePressed fyne.CanvasObject + mouseClickCount int + mouseCancelFunc context.CancelFunc + + onClosed func() + onCloseIntercepted func() + + menuTogglePending fyne.KeyName + menuDeactivationPending fyne.KeyName + + xpos, ypos int + width, height int + requestedWidth, requestedHeight int + shouldWidth, shouldHeight int + shouldExpand bool + + pending []func() + + lastWalkedTime time.Time +} + +func (w *window) SetFullScreen(full bool) { + w.fullScreen = full + + if w.view() != nil { + async.EnsureMain(func() { + w.doSetFullScreen(full) + }) + } +} + +func (w *window) CenterOnScreen() { + if build.IsWayland { + return + } + + w.centered = true + + w.runOnMainWhenCreated(w.doCenterOnScreen) +} + +func (w *window) SetOnDropped(dropped func(pos fyne.Position, items []fyne.URI)) { + w.runOnMainWhenCreated(func() { + w.viewport.SetDropCallback(func(win *glfw.Window, names []string) { + if dropped == nil { + return + } + + uris := make([]fyne.URI, len(names)) + for i, name := range names { + uris[i] = storage.NewFileURI(name) + } + + dropped(w.mousePos, uris) + }) + }) +} + +func (w *window) doCenterOnScreen() { + viewWidth, viewHeight := w.screenSize(w.canvas.size) + if w.width > viewWidth { // in case our window has not called back to canvas size yet + viewWidth = w.width + } + if w.height > viewHeight { + viewHeight = w.height + } + + // get window dimensions in pixels + monitor := w.getMonitorForWindow() + monMode := monitor.GetVideoMode() + + // these come into play when dealing with multiple monitors + monX, monY := monitor.GetPos() + + // math them to the middle + newX := (monMode.Width-viewWidth)/2 + monX + newY := (monMode.Height-viewHeight)/2 + monY + + // set new window coordinates + w.viewport.SetPos(newX, newY) +} + +func (w *window) RequestFocus() { + if build.IsWayland || w.view() == nil { + return + } + + w.runOnMainWhenCreated(w.viewport.Focus) +} + +func (w *window) SetIcon(icon fyne.Resource) { + w.icon = icon + if build.IsWayland { + return + } + + if icon == nil { + appIcon := fyne.CurrentApp().Icon() + if appIcon != nil { + w.SetIcon(appIcon) + } + return + } + + w.runOnMainWhenCreated(func() { + if w.icon == nil { + w.viewport.SetIcon(nil) + return + } + + var img image.Image + if svg.IsResourceSVG(w.icon) { + img = painter.PaintImage(&canvas.Image{Resource: w.icon}, nil, windowIconSize, windowIconSize) + } else { + pix, _, err := image.Decode(bytes.NewReader(w.icon.Content())) + if err != nil { + fyne.LogError("Failed to decode image for window icon", err) + return + } + img = pix + } + + w.viewport.SetIcon([]image.Image{img}) + }) +} + +func (w *window) SetMaster() { + w.master = true +} + +func (w *window) fitContent() { + if w.canvas.Content() == nil || (w.fullScreen && w.visible) { + return + } + + if w.isClosing() { + return + } + + minWidth, minHeight := w.minSizeOnScreen() + view := w.viewport + w.shouldWidth, w.shouldHeight = w.width, w.height + if w.width < minWidth || w.height < minHeight { + if w.width < minWidth { + w.shouldWidth = minWidth + } + if w.height < minHeight { + w.shouldHeight = minHeight + } + w.shouldExpand = true // queue the resize to happen on main + } + if w.fixedSize { + if w.shouldWidth > w.requestedWidth { + w.requestedWidth = w.shouldWidth + } + if w.shouldHeight > w.requestedHeight { + w.requestedHeight = w.shouldHeight + } + view.SetSizeLimits(w.requestedWidth, w.requestedHeight, w.requestedWidth, w.requestedHeight) + } else { + view.SetSizeLimits(minWidth, minHeight, glfw.DontCare, glfw.DontCare) + } +} + +// getMonitorScale returns the scale factor for a given monitor, handling platform-specific cases +func getMonitorScale(monitor *glfw.Monitor) float32 { + widthMm, heightMm := monitor.GetPhysicalSize() + if runtime.GOOS == "linux" && widthMm == 60 && heightMm == 60 { // Steam Deck incorrectly reports 6cm square! + return 1.0 + } + widthPx := monitor.GetVideoMode().Width + return calculateDetectedScale(widthMm, widthPx) +} + +// getScaledMonitorSize returns the monitor dimensions adjusted for scaling +func getScaledMonitorSize(monitor *glfw.Monitor) fyne.Size { + videoMode := monitor.GetVideoMode() + scale := getMonitorScale(monitor) + + scaledWidth := float32(videoMode.Width) / scale + scaledHeight := float32(videoMode.Height) / scale + return fyne.NewSize(scaledWidth, scaledHeight) +} + +func (w *window) getMonitorForWindow() *glfw.Monitor { + if !build.IsWayland { + x, y := w.xpos, w.ypos + if w.fullScreen { + x, y = w.viewport.GetPos() + } + xOff := x + (w.width / 2) + yOff := y + (w.height / 2) + + for _, monitor := range glfw.GetMonitors() { + x, y := monitor.GetPos() + + if x > xOff || y > yOff { + continue + } + + scaledSize := getScaledMonitorSize(monitor) + if x+int(scaledSize.Width) <= xOff || y+int(scaledSize.Height) <= yOff { + continue + } + + return monitor + } + } + + // try built-in function to detect monitor if above logic didn't succeed + // if it doesn't work then return primary monitor as default + monitor := w.viewport.GetMonitor() + if monitor == nil { + monitor = glfw.GetPrimaryMonitor() + } + return monitor +} + +func (w *window) detectScale() float32 { + if build.IsWayland { // Wayland controls scale through content scaling + return 1 + } + + // check if DPI detection is disabled + env := os.Getenv(disableDPIDetectionEnvKey) + if strings.EqualFold(env, "true") || strings.EqualFold(env, "t") || env == "1" { + return 1 + } + + monitor := w.getMonitorForWindow() + if monitor == nil { + return 1 + } + + return getMonitorScale(monitor) +} + +func (w *window) moved(_ *glfw.Window, x, y int) { + w.processMoved(x, y) +} + +func (w *window) resized(_ *glfw.Window, width, height int) { + w.processResized(width, height) +} + +func (w *window) scaled(_ *glfw.Window, x float32, y float32) { + if !build.IsWayland { // other platforms handle this using older APIs + return + } + + w.canvas.texScale = x + w.canvas.Refresh(w.canvas.content) +} + +func (w *window) frameSized(_ *glfw.Window, width, height int) { + w.processFrameSized(width, height) +} + +func (w *window) refresh(_ *glfw.Window) { + w.processRefresh() +} + +func (w *window) closed(viewport *glfw.Window) { + if viewport != nil { + viewport.SetShouldClose(false) // reset the closed flag until we check the veto in processClosed + } + + w.processClosed() +} + +func fyneToNativeCursor(cursor desktop.Cursor) (*glfw.Cursor, bool) { + cursorType, standard := cursor.(desktop.StandardCursor) + if !standard { + img, x, y := cursor.Image() + if img == nil { + return nil, true + } + return glfw.CreateCursor(img, x, y), true + } + + if cursorType < 0 || cursorType >= desktop.StandardCursor(len(cursors)) { + return cursors[desktop.DefaultCursor], false + } + + return cursors[cursorType], false +} + +func (w *window) SetCursor(cursor *glfw.Cursor) { + async.EnsureMain(func() { + w.viewport.SetCursor(cursor) + }) +} + +func (w *window) setCustomCursor(rawCursor *glfw.Cursor, isCustomCursor bool) { + if w.customCursor != nil { + w.customCursor.Destroy() + w.customCursor = nil + } + if isCustomCursor { + w.customCursor = rawCursor + } +} + +func (w *window) mouseMoved(_ *glfw.Window, xpos, ypos float64) { + w.processMouseMoved(xpos, ypos) +} + +func (w *window) mouseClicked(_ *glfw.Window, btn glfw.MouseButton, action glfw.Action, mods glfw.ModifierKey) { + button, modifiers := convertMouseButton(btn, mods) + mouseAction := convertAction(action) + + w.processMouseClicked(button, mouseAction, modifiers) +} + +func (w *window) mouseScrolled(viewport *glfw.Window, xoff float64, yoff float64) { + if runtime.GOOS != "darwin" && xoff == 0 && + (viewport.GetKey(glfw.KeyLeftShift) == glfw.Press || + viewport.GetKey(glfw.KeyRightShift) == glfw.Press) { + xoff, yoff = yoff, xoff + } + + w.processMouseScrolled(xoff, yoff) +} + +func convertMouseButton(btn glfw.MouseButton, mods glfw.ModifierKey) (desktop.MouseButton, fyne.KeyModifier) { + modifier := desktopModifier(mods) + rightClick := false + if runtime.GOOS == "darwin" { + if modifier&fyne.KeyModifierControl != 0 { + rightClick = true + modifier &^= fyne.KeyModifierControl + } + if modifier&fyne.KeyModifierSuper != 0 { + modifier |= fyne.KeyModifierControl + modifier &^= fyne.KeyModifierSuper + } + } + + switch btn { + case glfw.MouseButton1: + if rightClick { + return desktop.MouseButtonSecondary, modifier + } + return desktop.MouseButtonPrimary, modifier + case glfw.MouseButton2: + return desktop.MouseButtonSecondary, modifier + case glfw.MouseButton3: + return desktop.MouseButtonTertiary, modifier + default: + return 0, modifier + } +} + +//gocyclo:ignore +func glfwKeyToKeyName(key glfw.Key) fyne.KeyName { + switch key { + // numbers - lookup by code to avoid AZERTY using the symbol name instead of number + case glfw.Key0, glfw.KeyKP0: + return fyne.Key0 + case glfw.Key1, glfw.KeyKP1: + return fyne.Key1 + case glfw.Key2, glfw.KeyKP2: + return fyne.Key2 + case glfw.Key3, glfw.KeyKP3: + return fyne.Key3 + case glfw.Key4, glfw.KeyKP4: + return fyne.Key4 + case glfw.Key5, glfw.KeyKP5: + return fyne.Key5 + case glfw.Key6, glfw.KeyKP6: + return fyne.Key6 + case glfw.Key7, glfw.KeyKP7: + return fyne.Key7 + case glfw.Key8, glfw.KeyKP8: + return fyne.Key8 + case glfw.Key9, glfw.KeyKP9: + return fyne.Key9 + + // non-printable + case glfw.KeyEscape: + return fyne.KeyEscape + case glfw.KeyEnter: + return fyne.KeyReturn + case glfw.KeyTab: + return fyne.KeyTab + case glfw.KeyBackspace: + return fyne.KeyBackspace + case glfw.KeyInsert: + return fyne.KeyInsert + case glfw.KeyDelete: + return fyne.KeyDelete + case glfw.KeyRight: + return fyne.KeyRight + case glfw.KeyLeft: + return fyne.KeyLeft + case glfw.KeyDown: + return fyne.KeyDown + case glfw.KeyUp: + return fyne.KeyUp + case glfw.KeyPageUp: + return fyne.KeyPageUp + case glfw.KeyPageDown: + return fyne.KeyPageDown + case glfw.KeyHome: + return fyne.KeyHome + case glfw.KeyEnd: + return fyne.KeyEnd + + case glfw.KeySpace: + return fyne.KeySpace + case glfw.KeyKPEnter: + return fyne.KeyEnter + + // desktop + case glfw.KeyLeftShift: + return desktop.KeyShiftLeft + case glfw.KeyRightShift: + return desktop.KeyShiftRight + case glfw.KeyLeftControl: + return desktop.KeyControlLeft + case glfw.KeyRightControl: + return desktop.KeyControlRight + case glfw.KeyLeftAlt: + return desktop.KeyAltLeft + case glfw.KeyRightAlt: + return desktop.KeyAltRight + case glfw.KeyLeftSuper: + return desktop.KeySuperLeft + case glfw.KeyRightSuper: + return desktop.KeySuperRight + case glfw.KeyMenu: + return desktop.KeyMenu + case glfw.KeyPrintScreen: + return desktop.KeyPrintScreen + case glfw.KeyCapsLock: + return desktop.KeyCapsLock + + // functions + case glfw.KeyF1: + return fyne.KeyF1 + case glfw.KeyF2: + return fyne.KeyF2 + case glfw.KeyF3: + return fyne.KeyF3 + case glfw.KeyF4: + return fyne.KeyF4 + case glfw.KeyF5: + return fyne.KeyF5 + case glfw.KeyF6: + return fyne.KeyF6 + case glfw.KeyF7: + return fyne.KeyF7 + case glfw.KeyF8: + return fyne.KeyF8 + case glfw.KeyF9: + return fyne.KeyF9 + case glfw.KeyF10: + return fyne.KeyF10 + case glfw.KeyF11: + return fyne.KeyF11 + case glfw.KeyF12: + return fyne.KeyF12 + } + + return fyne.KeyUnknown +} + +func keyCodeToKeyName(code string) fyne.KeyName { + if len(code) != 1 { + return fyne.KeyUnknown + } + + char := code[0] + if char >= 'a' && char <= 'z' { + return fyne.KeyName(char ^ ('a' - 'A')) // Corresponding KeyName is uppercase. Convert with simple bit flip. + } + + switch char { + case '[': + return fyne.KeyLeftBracket + case '\\': + return fyne.KeyBackslash + case ']': + return fyne.KeyRightBracket + case '\'': + return fyne.KeyApostrophe + case ',': + return fyne.KeyComma + case '-': + return fyne.KeyMinus + case '.': + return fyne.KeyPeriod + case '/': + return fyne.KeySlash + case '*': + return fyne.KeyAsterisk + case '`': + return fyne.KeyBackTick + case ';': + return fyne.KeySemicolon + case '+': + return fyne.KeyPlus + case '=': + return fyne.KeyEqual + } + + return fyne.KeyUnknown +} + +func keyToName(code glfw.Key, scancode int) fyne.KeyName { + ret := glfwKeyToKeyName(code) + if ret != fyne.KeyUnknown { + return ret + } + + keyName := glfw.GetKeyName(code, scancode) + return keyCodeToKeyName(keyName) +} + +func convertAction(action glfw.Action) action { + switch action { + case glfw.Press: + return press + case glfw.Release: + return release + case glfw.Repeat: + return repeat + } + panic("Could not convert glfw.Action.") +} + +func convertASCII(key glfw.Key) fyne.KeyName { + if key < glfw.KeyA || key > glfw.KeyZ { + return fyne.KeyUnknown + } + + return fyne.KeyName(rune(key)) +} + +func (w *window) keyPressed(_ *glfw.Window, key glfw.Key, scancode int, action glfw.Action, mods glfw.ModifierKey) { + keyName := keyToName(key, scancode) + keyDesktopModifier := desktopModifier(mods) + w.driver.currentKeyModifiers = desktopModifierCorrected(mods, key, action) + keyAction := convertAction(action) + keyASCII := convertASCII(key) + + w.processKeyPressed(keyName, keyASCII, scancode, keyAction, keyDesktopModifier) +} + +func desktopModifier(mods glfw.ModifierKey) fyne.KeyModifier { + var m fyne.KeyModifier + if (mods & glfw.ModShift) != 0 { + m |= fyne.KeyModifierShift + } + if (mods & glfw.ModControl) != 0 { + m |= fyne.KeyModifierControl + } + if (mods & glfw.ModAlt) != 0 { + m |= fyne.KeyModifierAlt + } + if (mods & glfw.ModSuper) != 0 { + m |= fyne.KeyModifierSuper + } + return m +} + +func desktopModifierCorrected(mods glfw.ModifierKey, key glfw.Key, action glfw.Action) fyne.KeyModifier { + // On X11, pressing/releasing modifier keys does not include newly pressed/released keys in 'mod' mask. + // https://github.com/glfw/glfw/issues/1630 + if action == glfw.Press { + mods |= glfwKeyToModifier(key) + } else { + mods &= ^glfwKeyToModifier(key) + } + return desktopModifier(mods) +} + +func glfwKeyToModifier(key glfw.Key) glfw.ModifierKey { + switch key { + case glfw.KeyLeftControl, glfw.KeyRightControl: + return glfw.ModControl + case glfw.KeyLeftAlt, glfw.KeyRightAlt: + return glfw.ModAlt + case glfw.KeyLeftShift, glfw.KeyRightShift: + return glfw.ModShift + case glfw.KeyLeftSuper, glfw.KeyRightSuper: + return glfw.ModSuper + default: + return 0 + } +} + +// charInput defines the character with modifiers callback which is called when a +// Unicode character is input. +// +// Characters do not map 1:1 to physical keys, as a key may produce zero, one or more characters. +func (w *window) charInput(viewport *glfw.Window, char rune) { + w.processCharInput(char) +} + +func (w *window) focused(_ *glfw.Window, focused bool) { + w.processFocused(focused) +} + +func (w *window) DetachCurrentContext() { + glfw.DetachCurrentContext() +} + +func (w *window) RescaleContext() { + if w.isClosing() { + return + } + w.fitContent() + + if w.fullScreen { + w.width, w.height = w.viewport.GetSize() + scaledFull := fyne.NewSize( + scale.ToFyneCoordinate(w.canvas, w.width), + scale.ToFyneCoordinate(w.canvas, w.height)) + w.canvas.Resize(scaledFull) + return + } + + size := w.canvas.size.Max(w.canvas.MinSize()) + newWidth, newHeight := w.screenSize(size) + w.viewport.SetSize(newWidth, newHeight) + + // Ensure textures re-rasterize at the new scale + cache.DeleteTextTexturesFor(w.canvas) + w.canvas.content.Refresh() +} + +func (w *window) create() { + if !build.IsWayland { + // make the window hidden, we will set it up and then show it later + glfw.WindowHint(glfw.Visible, glfw.False) + } + if w.decorate { + glfw.WindowHint(glfw.Decorated, glfw.True) + } else { + glfw.WindowHint(glfw.Decorated, glfw.False) + } + if w.fixedSize { + glfw.WindowHint(glfw.Resizable, glfw.False) + } else { + glfw.WindowHint(glfw.Resizable, glfw.True) + } + glfw.WindowHint(glfw.AutoIconify, glfw.False) + initWindowHints() + + pixWidth, pixHeight := w.screenSize(w.canvas.size) + pixWidth = int(fyne.Max(float32(pixWidth), float32(w.width))) + if pixWidth == 0 { + pixWidth = 10 + } + pixHeight = int(fyne.Max(float32(pixHeight), float32(w.height))) + if pixHeight == 0 { + pixHeight = 10 + } + + win, err := glfw.CreateWindow(pixWidth, pixHeight, w.title, nil, nil) + if err != nil { + w.driver.initFailed("window creation error", err) + return + } + + w.viewport = win + if w.view() == nil { // something went wrong above, it will have been logged + return + } + + // run the GL init on the draw thread + w.RunWithContext(func() { + w.canvas.SetPainter(gl.NewPainter(w.canvas, w)) + w.canvas.Painter().Init() + }) + + w.setDarkMode() + + win.SetCloseCallback(w.closed) + win.SetPosCallback(w.moved) + win.SetSizeCallback(w.resized) + win.SetFramebufferSizeCallback(w.frameSized) + win.SetRefreshCallback(w.refresh) + win.SetContentScaleCallback(w.scaled) + win.SetCursorPosCallback(w.mouseMoved) + win.SetMouseButtonCallback(w.mouseClicked) + win.SetScrollCallback(w.mouseScrolled) + win.SetKeyCallback(w.keyPressed) + win.SetCharCallback(w.charInput) + win.SetFocusCallback(w.focused) + + w.canvas.detectedScale = w.detectScale() + w.canvas.scale = w.calculatedScale() + w.canvas.texScale = w.detectTextureScale() + // update window size now we have scaled detected + w.fitContent() + + w.drainPendingEvents() + + if w.FixedSize() && (w.requestedWidth == 0 || w.requestedHeight == 0) { + bigEnough := w.canvas.canvasSize(w.canvas.Content().MinSize()) + w.width, w.height = scale.ToScreenCoordinate(w.canvas, bigEnough.Width), scale.ToScreenCoordinate(w.canvas, bigEnough.Height) + w.shouldWidth, w.shouldHeight = w.width, w.height + } + + w.requestedWidth, w.requestedHeight = w.width, w.height + // order of operation matters so we do these last items in order + w.viewport.SetSize(w.shouldWidth, w.shouldHeight) // ensure we requested latest size +} + +func (w *window) view() *glfw.Window { + if w.closing { + return nil + } + return w.viewport +} + +// wrapInnerWindow is a no-op to match what the web driver provides +func wrapInnerWindow(*container.InnerWindow, fyne.Window, *gLDriver) fyne.Window { + return nil +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_notdarwin.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_notdarwin.go new file mode 100644 index 0000000..263d892 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_notdarwin.go @@ -0,0 +1,22 @@ +//go:build !darwin + +package glfw + +import "time" + +const desktopDefaultDoubleTapDelay = 300 * time.Millisecond + +func (w *window) doSetFullScreen(full bool) { + monitor := w.getMonitorForWindow() + mode := monitor.GetVideoMode() + + if full { + w.viewport.SetMonitor(monitor, 0, 0, mode.Width, mode.Height, mode.RefreshRate) + } else { + if w.width == 0 && w.height == 0 { // if we were fullscreen on creation... + s := w.canvas.Size().Max(w.canvas.MinSize()) + w.width, w.height = w.screenSize(s) + } + w.viewport.SetMonitor(nil, w.xpos, w.ypos, w.width, w.height, 0) + } +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_notwindows.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_notwindows.go new file mode 100644 index 0000000..0310843 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_notwindows.go @@ -0,0 +1,15 @@ +//go:build !windows + +package glfw + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/scale" +) + +func (w *window) setDarkMode() { +} + +func (w *window) computeCanvasSize(width, height int) fyne.Size { + return fyne.NewSize(scale.ToFyneCoordinate(w.canvas, width), scale.ToFyneCoordinate(w.canvas, height)) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_notxdg.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_notxdg.go new file mode 100644 index 0000000..e5c5226 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_notxdg.go @@ -0,0 +1,16 @@ +//go:build !linux && !freebsd && !openbsd && !netbsd + +package glfw + +import "fyne.io/fyne/v2" + +func (w *window) platformResize(canvasSize fyne.Size) { + d, ok := fyne.CurrentApp().Driver().(*gLDriver) + if !ok { // don't wait to redraw in this way if we are running on test + w.canvas.Resize(canvasSize) + return + } + + w.canvas.Resize(canvasSize) + d.repaintWindow(w) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_wasm.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_wasm.go new file mode 100644 index 0000000..2b1b2b7 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_wasm.go @@ -0,0 +1,706 @@ +//go:build wasm || test_web_driver + +package glfw + +import ( + "context" + _ "image/png" // for the icon + "time" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/driver/desktop" + "fyne.io/fyne/v2/internal/cache" + "fyne.io/fyne/v2/internal/painter/gl" + "fyne.io/fyne/v2/internal/scale" + + "github.com/fyne-io/glfw-js" +) + +type Cursor struct { + JSName string +} + +const defaultTitle = "Fyne Application" + +// Input modes. +const ( + CursorMode glfw.InputMode = glfw.CursorMode + StickyKeysMode glfw.InputMode = glfw.StickyKeysMode + StickyMouseButtonsMode glfw.InputMode = glfw.StickyMouseButtonsMode + LockKeyMods glfw.InputMode = glfw.LockKeyMods + RawMouseMotion glfw.InputMode = glfw.RawMouseMotion +) + +// Cursor mode values. +const ( + CursorNormal int = glfw.CursorNormal + CursorHidden int = glfw.CursorHidden + CursorDisabled int = glfw.CursorDisabled +) + +// Declare conformity to Window interface +var _ fyne.Window = (*window)(nil) + +type window struct { + viewport *glfw.Window + created bool + decorate bool + closing bool + fixedSize bool + + cursor desktop.Cursor + canvas *glCanvas + driver *gLDriver + title string + icon fyne.Resource + mainmenu *fyne.MainMenu + + master bool + fullScreen bool + centered bool + visible bool + + mousePos fyne.Position + mouseDragged fyne.Draggable + mouseDraggedObjStart fyne.Position + mouseDraggedOffset fyne.Position + mouseDragPos fyne.Position + mouseDragStarted bool + mouseButton desktop.MouseButton + mouseOver desktop.Hoverable + mouseLastClick fyne.CanvasObject + mousePressed fyne.CanvasObject + mouseClickCount int + mouseCancelFunc context.CancelFunc + + onClosed func() + onCloseIntercepted func() + + menuTogglePending fyne.KeyName + menuDeactivationPending fyne.KeyName + + xpos, ypos int + width, height int + requestedWidth, requestedHeight int + shouldWidth, shouldHeight int + shouldExpand bool + + pending []func() + + lastWalkedTime time.Time +} + +func (w *window) SetFullScreen(full bool) { + w.fullScreen = true +} + +// centerOnScreen handles the logic for centering a window +func (w *window) CenterOnScreen() { + // FIXME: not supported with WebGL + w.centered = true +} + +func (w *window) SetOnDropped(dropped func(pos fyne.Position, items []fyne.URI)) { + // FIXME: not implemented yet +} + +func (w *window) doCenterOnScreen() { + // FIXME: no meaning for defining center on screen in WebGL +} + +func (w *window) RequestFocus() { + // FIXME: no meaning for defining focus in WebGL +} + +func (w *window) SetIcon(icon fyne.Resource) { + // FIXME: no support for SetIcon yet +} + +func (w *window) SetMaster() { + // FIXME: there could really only be one window +} + +func (w *window) fitContent() { + w.shouldWidth, w.shouldHeight = w.requestedWidth, w.requestedHeight +} + +func (w *window) getMonitorForWindow() *glfw.Monitor { + return glfw.GetPrimaryMonitor() +} + +func scaleForDpi(xdpi int) float32 { + switch { + case xdpi > 1000: + // assume that this is a mistake and bail + return float32(1.0) + case xdpi > 192: + return float32(1.5) + case xdpi > 144: + return float32(1.35) + case xdpi > 120: + return float32(1.2) + default: + return float32(1.0) + } +} + +func (w *window) detectScale() float32 { + return scaleForDpi(int(96)) +} + +func (w *window) moved(_ *glfw.Window, x, y int) { + runOnMain(func() { + w.processMoved(x, y) + }) +} + +func (w *window) resized(_ *glfw.Window, width, height int) { + runOnMain(func() { + w.canvas.scale = w.calculatedScale() + w.processResized(width, height) + }) +} + +func (w *window) frameSized(_ *glfw.Window, width, height int) { + runOnMain(func() { + w.processFrameSized(width, height) + }) +} + +func (w *window) refresh(_ *glfw.Window) { + runOnMain(w.processRefresh) +} + +func (w *window) closed(viewport *glfw.Window) { + runOnMain(func() { + viewport.SetShouldClose(false) // reset the closed flag until we check the veto in processClosed + + w.processClosed() + }) +} + +func fyneToNativeCursor(cursor desktop.Cursor) (*Cursor, bool) { + if _, ok := cursor.(desktop.StandardCursor); !ok { + return nil, false // Custom cursors not implemented yet. + } + + name := "default" + switch cursor { + case desktop.TextCursor: + name = "text" + case desktop.CrosshairCursor: + name = "crosshair" + case desktop.DefaultCursor: + name = "default" + case desktop.PointerCursor: + name = "pointer" + case desktop.HResizeCursor: + name = "ew-resize" + case desktop.VResizeCursor: + name = "ns-resize" + case desktop.HiddenCursor: + name = "none" + } + + return &Cursor{JSName: name}, false +} + +func (w *window) SetCursor(cursor *Cursor) { + setCursor(cursor.JSName) +} + +func (w *window) setCustomCursor(rawCursor *Cursor, isCustomCursor bool) { +} + +func (w *window) mouseMoved(_ *glfw.Window, xpos, ypos float64) { + runOnMain(func() { + w.processMouseMoved(w.scaleInput(xpos), w.scaleInput(ypos)) + }) +} + +func (w *window) mouseClicked(viewport *glfw.Window, btn glfw.MouseButton, action glfw.Action, mods glfw.ModifierKey) { + runOnMain(func() { + button, modifiers := convertMouseButton(btn, mods) + mouseAction := convertAction(action) + + w.processMouseClicked(button, mouseAction, modifiers) + }) +} + +func (w *window) mouseScrolled(viewport *glfw.Window, xoff, yoff float64) { + runOnMain(func() { + if xoff == 0 && + (viewport.GetKey(glfw.KeyLeftShift) == glfw.Press || + viewport.GetKey(glfw.KeyRightShift) == glfw.Press) { + xoff, yoff = yoff, xoff + } + + w.processMouseScrolled(xoff, yoff) + }) +} + +func convertMouseButton(btn glfw.MouseButton, mods glfw.ModifierKey) (desktop.MouseButton, fyne.KeyModifier) { + modifier := desktopModifier(mods) + rightClick := false + if isMacOSRuntime() { + if modifier&fyne.KeyModifierControl != 0 { + rightClick = true + modifier &^= fyne.KeyModifierControl + } + if modifier&fyne.KeyModifierSuper != 0 { + modifier |= fyne.KeyModifierControl + modifier &^= fyne.KeyModifierSuper + } + } + + switch btn { + case glfw.MouseButton1: + if rightClick { + return desktop.MouseButtonSecondary, modifier + } + return desktop.MouseButtonPrimary, modifier + case glfw.MouseButton2: + return desktop.MouseButtonSecondary, modifier + case glfw.MouseButton3: + return desktop.MouseButtonTertiary, modifier + default: + return 0, modifier + } +} + +//gocyclo:ignore +func glfwKeyToKeyName(key glfw.Key) fyne.KeyName { + switch key { + // numbers - lookup by code to avoid AZERTY using the symbol name instead of number + case glfw.Key0, glfw.KeyKP0: + return fyne.Key0 + case glfw.Key1, glfw.KeyKP1: + return fyne.Key1 + case glfw.Key2, glfw.KeyKP2: + return fyne.Key2 + case glfw.Key3, glfw.KeyKP3: + return fyne.Key3 + case glfw.Key4, glfw.KeyKP4: + return fyne.Key4 + case glfw.Key5, glfw.KeyKP5: + return fyne.Key5 + case glfw.Key6, glfw.KeyKP6: + return fyne.Key6 + case glfw.Key7, glfw.KeyKP7: + return fyne.Key7 + case glfw.Key8, glfw.KeyKP8: + return fyne.Key8 + case glfw.Key9, glfw.KeyKP9: + return fyne.Key9 + + // non-printable + case glfw.KeyEscape: + return fyne.KeyEscape + case glfw.KeyEnter: + return fyne.KeyReturn + case glfw.KeyTab: + return fyne.KeyTab + case glfw.KeyBackspace: + return fyne.KeyBackspace + case glfw.KeyInsert: + return fyne.KeyInsert + case glfw.KeyDelete: + return fyne.KeyDelete + case glfw.KeyRight: + return fyne.KeyRight + case glfw.KeyLeft: + return fyne.KeyLeft + case glfw.KeyDown: + return fyne.KeyDown + case glfw.KeyUp: + return fyne.KeyUp + case glfw.KeyPageUp: + return fyne.KeyPageUp + case glfw.KeyPageDown: + return fyne.KeyPageDown + case glfw.KeyHome: + return fyne.KeyHome + case glfw.KeyEnd: + return fyne.KeyEnd + + case glfw.KeySpace: + return fyne.KeySpace + case glfw.KeyKPEnter: + return fyne.KeyEnter + + // desktop + case glfw.KeyLeftShift: + return desktop.KeyShiftLeft + case glfw.KeyRightShift: + return desktop.KeyShiftRight + case glfw.KeyLeftControl: + return desktop.KeyControlLeft + case glfw.KeyRightControl: + return desktop.KeyControlRight + case glfw.KeyLeftAlt: + return desktop.KeyAltLeft + case glfw.KeyRightAlt: + return desktop.KeyAltRight + case glfw.KeyLeftSuper: + return desktop.KeySuperLeft + case glfw.KeyRightSuper: + return desktop.KeySuperRight + case glfw.KeyMenu: + return desktop.KeyMenu + case glfw.KeyPrintScreen: + return desktop.KeyPrintScreen + case glfw.KeyCapsLock: + return desktop.KeyCapsLock + + // functions + case glfw.KeyF1: + return fyne.KeyF1 + case glfw.KeyF2: + return fyne.KeyF2 + case glfw.KeyF3: + return fyne.KeyF3 + case glfw.KeyF4: + return fyne.KeyF4 + case glfw.KeyF5: + return fyne.KeyF5 + case glfw.KeyF6: + return fyne.KeyF6 + case glfw.KeyF7: + return fyne.KeyF7 + case glfw.KeyF8: + return fyne.KeyF8 + case glfw.KeyF9: + return fyne.KeyF9 + case glfw.KeyF10: + return fyne.KeyF10 + case glfw.KeyF11: + return fyne.KeyF11 + case glfw.KeyF12: + return fyne.KeyF12 + } + + return fyne.KeyUnknown +} + +func keyCodeToKeyName(code string) fyne.KeyName { + if len(code) != 1 { + return fyne.KeyUnknown + } + + char := code[0] + if char >= 'a' && char <= 'z' { + // Our alphabetical keys are all upper case characters. + return fyne.KeyName('A' + char - 'a') + } + + switch char { + case '[': + return fyne.KeyLeftBracket + case '\\': + return fyne.KeyBackslash + case ']': + return fyne.KeyRightBracket + case '\'': + return fyne.KeyApostrophe + case ',': + return fyne.KeyComma + case '-': + return fyne.KeyMinus + case '.': + return fyne.KeyPeriod + case '/': + return fyne.KeySlash + case '*': + return fyne.KeyAsterisk + case '`': + return fyne.KeyBackTick + case ';': + return fyne.KeySemicolon + case '+': + return fyne.KeyPlus + case '=': + return fyne.KeyEqual + } + + return fyne.KeyUnknown +} + +func keyToName(code glfw.Key, scancode int) fyne.KeyName { + ret := glfwKeyToKeyName(code) + if ret != fyne.KeyUnknown { + return ret + } + + // keyName := glfw.GetKeyName(code, scancode) + // return keyCodeToKeyName(keyName) + return fyne.KeyUnknown +} + +func convertAction(action glfw.Action) action { + switch action { + case glfw.Press: + return press + case glfw.Release: + return release + case glfw.Repeat: + return repeat + } + panic("Could not convert glfw.Action.") +} + +func convertASCII(key glfw.Key) fyne.KeyName { + if key < glfw.KeyA || key > glfw.KeyZ { + return fyne.KeyUnknown + } + + return fyne.KeyName(rune(key)) +} + +func (w *window) keyPressed(viewport *glfw.Window, key glfw.Key, scancode int, action glfw.Action, mods glfw.ModifierKey) { + keyName := keyToName(key, scancode) + keyDesktopModifier := desktopModifier(mods) + keyAction := convertAction(action) + keyASCII := convertASCII(key) + + w.processKeyPressed(keyName, keyASCII, scancode, keyAction, keyDesktopModifier) +} + +func desktopModifier(mods glfw.ModifierKey) fyne.KeyModifier { + var m fyne.KeyModifier + if (mods & glfw.ModShift) != 0 { + m |= fyne.KeyModifierShift + } + if (mods & glfw.ModControl) != 0 { + m |= fyne.KeyModifierControl + } + if (mods & glfw.ModAlt) != 0 { + m |= fyne.KeyModifierAlt + } + if (mods & glfw.ModSuper) != 0 { + m |= fyne.KeyModifierSuper + } + return m +} + +// charInput defines the character with modifiers callback which is called when a +// Unicode character is input regardless of what modifier keys are used. +// +// Characters do not map 1:1 to physical keys, as a key may produce zero, one or more characters. +func (w *window) charInput(viewport *glfw.Window, char rune) { + w.processCharInput(char) +} + +func (w *window) focused(_ *glfw.Window, focused bool) { + w.processFocused(focused) +} + +func (w *window) DetachCurrentContext() { + glfw.DetachCurrentContext() +} + +func (w *window) RescaleContext() { + if w.viewport == nil { + return + } + + w.width, w.height = w.viewport.GetSize() + scaledFull := fyne.NewSize( + scale.ToFyneCoordinate(w.canvas, w.width), + scale.ToFyneCoordinate(w.canvas, w.height)) + w.canvas.Resize(scaledFull) + + // Ensure textures re-rasterize at the new scale + cache.DeleteTextTexturesFor(w.canvas) + w.canvas.content.Refresh() +} + +func (w *window) create() { + // we can't hide the window in webgl, so there might be some artifact + initWindowHints() + + pixWidth, pixHeight := w.screenSize(w.canvas.size) + pixWidth = int(fyne.Max(float32(pixWidth), float32(w.width))) + if pixWidth == 0 { + pixWidth = 10 + } + pixHeight = int(fyne.Max(float32(pixHeight), float32(w.height))) + if pixHeight == 0 { + pixHeight = 10 + } + + win, err := glfw.CreateWindow(pixWidth, pixHeight, w.title, nil, nil) + if err != nil { + w.driver.initFailed("window creation error", err) + return + } + + w.viewport = win + + if w.view() == nil { // something went wrong above, it will have been logged + return + } + + // run the GL init on the draw thread + w.RunWithContext(func() { + w.canvas.SetPainter(gl.NewPainter(w.canvas, w)) + w.canvas.Painter().Init() + }) + + w.setDarkMode() + + win.SetCloseCallback(w.closed) + win.SetPosCallback(w.moved) + win.SetSizeCallback(w.resized) + win.SetFramebufferSizeCallback(w.frameSized) + win.SetRefreshCallback(w.refresh) + win.SetCursorPosCallback(w.mouseMoved) + win.SetMouseButtonCallback(w.mouseClicked) + win.SetScrollCallback(w.mouseScrolled) + win.SetKeyCallback(w.keyPressed) + win.SetCharCallback(w.charInput) + win.SetFocusCallback(w.focused) + + w.canvas.detectedScale = w.detectScale() + w.canvas.scale = w.calculatedScale() + w.canvas.texScale = w.detectTextureScale() + // update window size now we have scaled detected + w.fitContent() + + w.drainPendingEvents() + + w.requestedWidth, w.requestedHeight = w.width, w.height + + width, height := win.GetSize() + w.processFrameSized(width, height) + w.processResized(width, height) +} + +func (w *window) view() *glfw.Window { + if w.closing { + return nil + } + return w.viewport +} + +// wrapInner represents a window that is provided by an InnerWindow container in the canvas. +type wrapInner struct { + fyne.Window + inner *container.InnerWindow + d *gLDriver + + centered bool + onClosed func() +} + +func wrapInnerWindow(w *container.InnerWindow, root fyne.Window, d *gLDriver) fyne.Window { + wrapped := &wrapInner{inner: w, d: d} + wrapped.Window = root + w.CloseIntercept = wrapped.doClose + return wrapped +} + +func (w *wrapInner) CenterOnScreen() { + w.centered = true + + w.doCenter() +} + +func (w *wrapInner) Close() { + w.inner.Close() +} + +func (w *wrapInner) Hide() { + w.inner.Hide() + w.updateVisibility() +} + +func (w *wrapInner) Move(p fyne.Position) { + w.inner.Move(p) +} + +func (w *wrapInner) Resize(s fyne.Size) { + w.inner.Resize(s) +} + +func (w *wrapInner) SetContent(o fyne.CanvasObject) { + w.inner.SetContent(o) +} + +func (w *wrapInner) SetOnClosed(fn func()) { + w.onClosed = fn +} + +func (w *wrapInner) Show() { + c := w.Window.Canvas().(*glCanvas) + multi := c.webExtraWindows + multi.Show() + w.inner.Show() + + c.Overlays().Add(multi) + + if w.centered { + w.doCenter() + } +} + +func (w *wrapInner) doCenter() { + c := w.Window.Canvas().(*glCanvas) + multi := c.webExtraWindows + + min := w.inner.MinSize() + min = min.Max(w.inner.Size()) + + x := (multi.Size().Width - min.Width) / 2 + y := (multi.Size().Height - min.Height) / 2 + + w.inner.Move(fyne.NewPos(x, y)) +} + +func (w *wrapInner) doClose() { + c := w.Window.Canvas().(*glCanvas) + multi := c.webExtraWindows + + pos := -1 + for i, child := range multi.Windows { + if child == w.inner { + pos = i + w.inner.Hide() + break + } + } + if pos != -1 { + count := len(multi.Windows) + copy(multi.Windows[pos:], multi.Windows[pos+1:]) + multi.Windows[count-1] = nil + multi.Windows = multi.Windows[:count-1] + } + + if w.onClosed != nil { + w.onClosed() + } + w.updateVisibility() +} + +func (w *wrapInner) updateVisibility() { + c := w.Window.Canvas().(*glCanvas) + multi := c.webExtraWindows + + visible := 0 + for _, win := range multi.Windows { + if win.Visible() { + visible++ + } + } + + if visible > 0 { + multi.Refresh() + } else { + multi.Hide() + c.Overlays().Remove(multi) + } +} + +func (w *window) scaleInput(in float64) float64 { + return in +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_wayland.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_wayland.go new file mode 100644 index 0000000..8194ef5 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_wayland.go @@ -0,0 +1,21 @@ +//go:build wayland && (linux || freebsd || openbsd || netbsd) + +package glfw + +import ( + "unsafe" + + "fyne.io/fyne/v2/driver" +) + +// assert we are implementing driver.NativeWindow +var _ driver.NativeWindow = (*window)(nil) + +func (w *window) RunNative(f func(any)) { + context := driver.WaylandWindowContext{} + if v := w.view(); v != nil { + context.WaylandSurface = uintptr(unsafe.Pointer(v.GetWaylandWindow())) + } + + f(context) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_windows.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_windows.go new file mode 100644 index 0000000..0b8e99d --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_windows.go @@ -0,0 +1,69 @@ +package glfw + +import ( + "runtime" + "syscall" + "unsafe" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/driver" + "fyne.io/fyne/v2/internal/scale" + + "golang.org/x/sys/windows/registry" +) + +func (w *window) setDarkMode() { + if runtime.GOOS == "windows" { + hwnd := w.view().GetWin32Window() + dark := isDark() + // cannot use a go bool. + var winBool int32 + if dark { + winBool = 1 + } + dwm := syscall.NewLazyDLL("dwmapi.dll") + setAtt := dwm.NewProc("DwmSetWindowAttribute") + ret, _, err := setAtt.Call(uintptr(unsafe.Pointer(hwnd)), // window handle + 20, // DWMWA_USE_IMMERSIVE_DARK_MODE + uintptr(unsafe.Pointer(&winBool)), // on or off + 4) // sizeof(bool for windows) + + if ret != 0 && ret != 0x80070057 { // err is always non-nil, we check return value (except erroneous code) + fyne.LogError("Failed to set dark mode", err) + } + } +} + +func isDark() bool { + k, err := registry.OpenKey(registry.CURRENT_USER, `SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize`, registry.QUERY_VALUE) + if err != nil { // older version of Windows will not have this key + return false + } + defer k.Close() + + useLight, _, err := k.GetIntegerValue("AppsUseLightTheme") + if err != nil { // older version of Windows will not have this value + return false + } + + return useLight == 0 +} + +func (w *window) computeCanvasSize(width, height int) fyne.Size { + if w.fixedSize { + return fyne.NewSize(scale.ToFyneCoordinate(w.canvas, w.width), scale.ToFyneCoordinate(w.canvas, w.height)) + } + return fyne.NewSize(scale.ToFyneCoordinate(w.canvas, width), scale.ToFyneCoordinate(w.canvas, height)) +} + +// assert we are implementing driver.NativeWindow +var _ driver.NativeWindow = (*window)(nil) + +func (w *window) RunNative(f func(any)) { + context := driver.WindowsWindowContext{} + if v := w.view(); v != nil { + context.HWND = uintptr(unsafe.Pointer(v.GetWin32Window())) + } + + f(context) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_x11.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_x11.go new file mode 100644 index 0000000..76cb4d9 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_x11.go @@ -0,0 +1,17 @@ +//go:build !wayland && (linux || freebsd || openbsd || netbsd) && !wasm && !test_web_driver + +package glfw + +import "fyne.io/fyne/v2/driver" + +// assert we are implementing driver.NativeWindow +var _ driver.NativeWindow = (*window)(nil) + +func (w *window) RunNative(f func(any)) { + context := driver.X11WindowContext{} + if v := w.view(); v != nil { + context.WindowHandle = uintptr(v.GetX11Window()) + } + + f(context) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_xdg.go b/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_xdg.go new file mode 100644 index 0000000..1c5c720 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/glfw/window_xdg.go @@ -0,0 +1,9 @@ +//go:build linux || freebsd || openbsd || netbsd + +package glfw + +import "fyne.io/fyne/v2" + +func (w *window) platformResize(canvasSize fyne.Size) { + w.canvas.Resize(canvasSize) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/README.txt b/vendor/fyne.io/fyne/v2/internal/driver/mobile/README.txt new file mode 100644 index 0000000..2ae9e08 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/README.txt @@ -0,0 +1,7 @@ +This directory is a fork of the golang.org/x/mobile package. It has largely +deviated from the original package to better support fyne. + +The full project, its license can be found at https://github.com/golang/mobile + +This package is for the purpose of removing the dependency of mobile drivers +and will be removed in due course. \ No newline at end of file diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/android.c b/vendor/fyne.io/fyne/v2/internal/driver/mobile/android.c new file mode 100644 index 0000000..db4f55c --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/android.c @@ -0,0 +1,533 @@ +//go:build android + +#include +#include +#include +#include +#include +#include +#include + +#define LOG_FATAL(...) __android_log_print(ANDROID_LOG_FATAL, "Fyne", __VA_ARGS__) + +static jclass find_class(JNIEnv *env, const char *class_name) { + jclass clazz = (*env)->FindClass(env, class_name); + if (clazz == NULL) { + (*env)->ExceptionClear(env); + LOG_FATAL("cannot find %s", class_name); + return NULL; + } + return clazz; +} + +static jmethodID find_method(JNIEnv *env, jclass clazz, const char *name, const char *sig) { + jmethodID m = (*env)->GetMethodID(env, clazz, name, sig); + if (m == 0) { + (*env)->ExceptionClear(env); + LOG_FATAL("cannot find method %s %s", name, sig); + return 0; + } + return m; +} + +static jmethodID find_static_method(JNIEnv *env, jclass clazz, const char *name, const char *sig) { + jmethodID m = (*env)->GetStaticMethodID(env, clazz, name, sig); + if (m == 0) { + (*env)->ExceptionClear(env); + LOG_FATAL("cannot find method %s %s", name, sig); + return 0; + } + return m; +} + +const char* getString(uintptr_t jni_env, uintptr_t ctx, jstring str) { + JNIEnv *env = (JNIEnv*)jni_env; + + const char *chars = (*env)->GetStringUTFChars(env, str, NULL); + + const char *copy = strdup(chars); + (*env)->ReleaseStringUTFChars(env, str, chars); + return copy; +} + +jobject parseURI(uintptr_t jni_env, uintptr_t ctx, char* uriCstr) { + JNIEnv *env = (JNIEnv*)jni_env; + + jstring uriStr = (*env)->NewStringUTF(env, uriCstr); + jclass uriClass = find_class(env, "android/net/Uri"); + jmethodID parse = find_static_method(env, uriClass, "parse", "(Ljava/lang/String;)Landroid/net/Uri;"); + + return (jobject)(*env)->CallStaticObjectMethod(env, uriClass, parse, uriStr); +} + +// clipboard + +jobject getClipboard(uintptr_t jni_env, uintptr_t ctx) { + JNIEnv *env = (JNIEnv*)jni_env; + jclass ctxClass = (*env)->GetObjectClass(env, (jobject)ctx); + jmethodID getSystemService = find_method(env, ctxClass, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;"); + + jstring service = (*env)->NewStringUTF(env, "clipboard"); + jobject ret = (*env)->CallObjectMethod(env, (jobject)ctx, getSystemService, service); + jthrowable err = (*env)->ExceptionOccurred(env); + + if (err != NULL) { + LOG_FATAL("cannot lookup clipboard"); + (*env)->ExceptionClear(env); + return NULL; + } + return ret; +} + +const char *getClipboardContent(uintptr_t java_vm, uintptr_t jni_env, uintptr_t ctx) { + JNIEnv *env = (JNIEnv*)jni_env; + jobject mgr = getClipboard(jni_env, ctx); + if (mgr == NULL) { + return NULL; + } + + jclass mgrClass = (*env)->GetObjectClass(env, mgr); + jmethodID getText = find_method(env, mgrClass, "getText", "()Ljava/lang/CharSequence;"); + + jobject content = (jstring)(*env)->CallObjectMethod(env, mgr, getText); + if (content == NULL) { + return NULL; + } + + jclass clzCharSequence = (*env)->GetObjectClass(env, content); + jmethodID toString = (*env)->GetMethodID(env, clzCharSequence, "toString", "()Ljava/lang/String;"); + jobject s = (*env)->CallObjectMethod(env, content, toString); + + return getString(jni_env, ctx, s); +} + +void setClipboardContent(uintptr_t java_vm, uintptr_t jni_env, uintptr_t ctx, char *content) { + JNIEnv *env = (JNIEnv*)jni_env; + jobject mgr = getClipboard(jni_env, ctx); + if (mgr == NULL) { + return; + } + + jclass mgrClass = (*env)->GetObjectClass(env, mgr); + jmethodID setText = find_method(env, mgrClass, "setText", "(Ljava/lang/CharSequence;)V"); + + jstring str = (*env)->NewStringUTF(env, content); + (*env)->CallVoidMethod(env, mgr, setText, str); +} + +// file handling + +jobject getContentResolver(uintptr_t jni_env, uintptr_t ctx) { + JNIEnv *env = (JNIEnv*)jni_env; + jclass ctxClass = (*env)->GetObjectClass(env, (jobject)ctx); + jmethodID getContentResolver = find_method(env, ctxClass, "getContentResolver", "()Landroid/content/ContentResolver;"); + + return (jobject)(*env)->CallObjectMethod(env, (jobject)ctx, getContentResolver); +} + +void* openStream(uintptr_t jni_env, uintptr_t ctx, char* uriCstr) { + JNIEnv *env = (JNIEnv*)jni_env; + jobject resolver = getContentResolver(jni_env, ctx); + + jclass resolverClass = (*env)->GetObjectClass(env, resolver); + jmethodID openInputStream = find_method(env, resolverClass, "openInputStream", "(Landroid/net/Uri;)Ljava/io/InputStream;"); + + jobject uri = parseURI(jni_env, ctx, uriCstr); + jobject stream = (jobject)(*env)->CallObjectMethod(env, resolver, openInputStream, uri); + jthrowable loadErr = (*env)->ExceptionOccurred(env); + + if (loadErr != NULL) { + (*env)->ExceptionClear(env); + return NULL; + } + + return (*env)->NewGlobalRef(env, stream); +} + +void* saveStream(uintptr_t jni_env, uintptr_t ctx, char* uriCstr, bool truncate) { + JNIEnv *env = (JNIEnv*)jni_env; + jobject resolver = getContentResolver(jni_env, ctx); + + jclass resolverClass = (*env)->GetObjectClass(env, resolver); + jmethodID saveOutputStream = find_method(env, resolverClass, "openOutputStream", "(Landroid/net/Uri;Ljava/lang/String;)Ljava/io/OutputStream;"); + + jobject uri = parseURI(jni_env, ctx, uriCstr); + jstring modes = NULL; + if (truncate) { + modes = (*env)->NewStringUTF(env, "wt"); // truncate before write + } else { + modes = (*env)->NewStringUTF(env, "wa"); + } + jobject stream = (jobject)(*env)->CallObjectMethod(env, resolver, saveOutputStream, uri, modes); + jthrowable loadErr = (*env)->ExceptionOccurred(env); + + if (loadErr != NULL) { + (*env)->ExceptionClear(env); + return NULL; + } + + return (*env)->NewGlobalRef(env, stream); +} + +jbyte* readStream(uintptr_t jni_env, uintptr_t ctx, void* stream, int len, int* total) { + JNIEnv *env = (JNIEnv*)jni_env; + jclass streamClass = (*env)->GetObjectClass(env, stream); + jmethodID read = find_method(env, streamClass, "read", "([BII)I"); + + jbyteArray data = (*env)->NewByteArray(env, len); + int count = (int)(*env)->CallIntMethod(env, stream, read, data, 0, len); + *total = count; + + if (count == -1) { + return NULL; + } + + jbyte* bytes = (jbyte*)malloc(sizeof(jbyte)*count); + (*env)->GetByteArrayRegion(env, data, 0, count, bytes); + return bytes; +} + +void writeStream(uintptr_t jni_env, uintptr_t ctx, void* stream, jbyte* buf, int len) { + JNIEnv *env = (JNIEnv*)jni_env; + jclass streamClass = (*env)->GetObjectClass(env, stream); + jmethodID write = find_method(env, streamClass, "write", "([BII)V"); + + jbyteArray data = (*env)->NewByteArray(env, len); + (*env)->SetByteArrayRegion(env, data, 0, len, buf); + + (*env)->CallVoidMethod(env, stream, write, data, 0, len); + + free(buf); +} + +void closeStream(uintptr_t jni_env, uintptr_t ctx, void* stream) { + JNIEnv *env = (JNIEnv*)jni_env; + jclass streamClass = (*env)->GetObjectClass(env, stream); + jmethodID close = find_method(env, streamClass, "close", "()V"); + (*env)->CallVoidMethod(env, stream, close); + + (*env)->DeleteGlobalRef(env, stream); +} + +bool hasPrefix(char* string, char* prefix) { + size_t lp = strlen(prefix); + size_t ls = strlen(string); + if (ls < lp) { + return false; + } + return memcmp(prefix, string, lp) == 0; +} + +bool canListContentURI(uintptr_t jni_env, uintptr_t ctx, char* uriCstr) { + JNIEnv *env = (JNIEnv*)jni_env; + jobject resolver = getContentResolver(jni_env, ctx); + jobject uri = parseURI(jni_env, ctx, uriCstr); + jthrowable loadErr = (*env)->ExceptionOccurred(env); + + if (loadErr != NULL) { + (*env)->ExceptionClear(env); + return false; + } + + jclass contractClass = find_class(env, "android/provider/DocumentsContract"); + if (contractClass == NULL) { // API 19 + return false; + } + jmethodID getDoc = find_static_method(env, contractClass, "getTreeDocumentId", "(Landroid/net/Uri;)Ljava/lang/String;"); + if (getDoc == NULL) { // API 21 + return false; + } + jstring docID = (jobject)(*env)->CallStaticObjectMethod(env, contractClass, getDoc, uri); + + jmethodID getTree = find_static_method(env, contractClass, "buildDocumentUriUsingTree", "(Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;"); + jobject treeUri = (jobject)(*env)->CallStaticObjectMethod(env, contractClass, getTree, uri, docID); + + jclass resolverClass = (*env)->GetObjectClass(env, resolver); + jmethodID getType = find_method(env, resolverClass, "getType", "(Landroid/net/Uri;)Ljava/lang/String;"); + jstring type = (jstring)(*env)->CallObjectMethod(env, resolver, getType, treeUri); + + if (type == NULL) { + return false; + } + + const char *str = getString(jni_env, ctx, type); + return strcmp(str, "vnd.android.document/directory") == 0; +} + +bool canListFileURI(char* uriCstr) { + // Get file path from URI + size_t length = strlen(uriCstr)-7;// -7 for 'file://' + char* path = malloc(sizeof(char)*(length+1));// +1 for '\0' + memcpy(path, &uriCstr[7], length); + path[length] = '\0'; + + // Stat path to determine if it points to a directory + struct stat statbuf; + int result = stat(path, &statbuf); + + free(path); + + return (result == 0) && S_ISDIR(statbuf.st_mode); +} + +bool canListURI(uintptr_t jni_env, uintptr_t ctx, char* uriCstr) { + if (hasPrefix(uriCstr, "file://")) { + return canListFileURI(uriCstr); + } else if (hasPrefix(uriCstr, "content://")) { + return canListContentURI(jni_env, ctx, uriCstr); + } + LOG_FATAL("Unrecognized scheme: %s", uriCstr); + return false; +} + +bool createListableFileURI(char* uriCstr) { + // Get file path from URI + size_t length = strlen(uriCstr)-7;// -7 for 'file://' + char* path = malloc(sizeof(char)*(length+1));// +1 for '\0' + memcpy(path, &uriCstr[7], length); + path[length] = '\0'; + + int result = mkdir(path, S_IRWXU); + free(path); + + return result == 0; +} + +bool createListableURI(uintptr_t jni_env, uintptr_t ctx, char* uriCstr) { + if (hasPrefix(uriCstr, "file://")) { + return createListableFileURI(uriCstr); + } + LOG_FATAL("Cannot create directory for scheme: %s", uriCstr); + return false; +} + +const char* contentURIGetFileName(uintptr_t jni_env, uintptr_t ctx, char* uriCstr) { + JNIEnv *env = (JNIEnv*)jni_env; + jobject resolver = getContentResolver(jni_env, ctx); + jobject uri = parseURI(jni_env, ctx, uriCstr); + jthrowable loadErr = (*env)->ExceptionOccurred(env); + + if (loadErr != NULL) { + (*env)->ExceptionClear(env); + return ""; + } + + jclass stringClass = find_class(env, "java/lang/String"); + jobjectArray project = (*env)->NewObjectArray(env, 1, stringClass, (*env)->NewStringUTF(env, "_display_name")); + + jclass resolverClass = (*env)->GetObjectClass(env, resolver); + jmethodID query = find_method(env, resolverClass, "query", "(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;"); + + jobject cursor = (jobject)(*env)->CallObjectMethod(env, resolver, query, uri, project, NULL, NULL, NULL); + jclass cursorClass = (*env)->GetObjectClass(env, cursor); + + jmethodID first = find_method(env, cursorClass, "moveToFirst", "()Z"); + jmethodID get = find_method(env, cursorClass, "getString", "(I)Ljava/lang/String;"); + + if (((jboolean)(*env)->CallBooleanMethod(env, cursor, first)) == JNI_TRUE) { + jstring name = (jstring)(*env)->CallObjectMethod(env, cursor, get, 0); + const char *fname = getString(jni_env, ctx, name); + return fname; + } + + return NULL; +} + +char *filePath(char *uriCstr) { + // Get file path from URI + size_t length = strlen(uriCstr)-7;// -7 for 'file://' + char* path = malloc(sizeof(char)*(length+1));// +1 for '\0' + memcpy(path, &uriCstr[7], length); + path[length] = '\0'; + + return path; +} + +bool deleteFileURI(char *uriCstr) { + char* path = filePath(uriCstr); + int result = remove(path); + + free(path); + + return result == 0; +} + +bool deleteURI(uintptr_t jni_env, uintptr_t ctx, char* uriCstr) { + if (!hasPrefix(uriCstr, "file://")) { + LOG_FATAL("Cannot delete for scheme: %s", uriCstr); + return false; + } + + return deleteFileURI(uriCstr); +} + +bool existsFileURI(char* uriCstr) { + char* path = filePath(uriCstr); + + // Stat path to determine if it points to an existing file + struct stat statbuf; + int result = stat(path, &statbuf); + + free(path); + + return result == 0; +} + +bool existsURI(uintptr_t jni_env, uintptr_t ctx, char* uriCstr) { + if (hasPrefix(uriCstr, "file://")) { + return existsFileURI(uriCstr); + } + LOG_FATAL("Cannot check exists for scheme: %s", uriCstr); + return false; +} + +char* listContentURI(uintptr_t jni_env, uintptr_t ctx, char* uriCstr) { + JNIEnv *env = (JNIEnv*)jni_env; + jobject resolver = getContentResolver(jni_env, ctx); + jobject uri = parseURI(jni_env, ctx, uriCstr); + jthrowable loadErr = (*env)->ExceptionOccurred(env); + + if (loadErr != NULL) { + (*env)->ExceptionClear(env); + return ""; + } + + jclass contractClass = find_class(env, "android/provider/DocumentsContract"); + if (contractClass == NULL) { // API 19 + return ""; + } + jmethodID getDoc = find_static_method(env, contractClass, "getTreeDocumentId", "(Landroid/net/Uri;)Ljava/lang/String;"); + if (getDoc == NULL) { // API 21 + return ""; + } + jstring docID = (jobject)(*env)->CallStaticObjectMethod(env, contractClass, getDoc, uri); + + jmethodID getChild = find_static_method(env, contractClass, "buildChildDocumentsUriUsingTree", "(Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;"); + jobject childrenUri = (jobject)(*env)->CallStaticObjectMethod(env, contractClass, getChild, uri, docID); + + jclass stringClass = find_class(env, "java/lang/String"); + jobjectArray project = (*env)->NewObjectArray(env, 1, stringClass, (*env)->NewStringUTF(env, "document_id")); + + jclass resolverClass = (*env)->GetObjectClass(env, resolver); + jmethodID query = find_method(env, resolverClass, "query", "(Landroid/net/Uri;[Ljava/lang/String;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Landroid/database/Cursor;"); + if (getDoc == NULL) { // API 26 + return ""; + } + + jobject cursor = (jobject)(*env)->CallObjectMethod(env, resolver, query, childrenUri, project, NULL, NULL); + jclass cursorClass = (*env)->GetObjectClass(env, cursor); + jmethodID next = find_method(env, cursorClass, "moveToNext", "()Z"); + jmethodID get = find_method(env, cursorClass, "getString", "(I)Ljava/lang/String;"); + jmethodID getChildURI = find_static_method(env, contractClass, "buildDocumentUriUsingTree", "(Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;"); + + char *ret = NULL; + int len = 0; + while (((jboolean)(*env)->CallBooleanMethod(env, cursor, next)) == JNI_TRUE) { + jstring childDocId = (jstring)(*env)->CallObjectMethod(env, cursor, get, 0); + jobject childUri = (jobject)(*env)->CallStaticObjectMethod(env, contractClass, getChildURI, uri, childDocId); + jclass uriClass = (*env)->GetObjectClass(env, childUri); + jmethodID toString = (*env)->GetMethodID(env, uriClass, "toString", "()Ljava/lang/String;"); + jstring s = (jstring)(*env)->CallObjectMethod(env, childUri, toString); + + const char *uid = getString(jni_env, ctx, s); + + // append + char *old = ret; + len = len + strlen(uid) + 1; + ret = malloc(sizeof(char)*(len+1)); + if (old != NULL) { + strcpy(ret, old); + free(old); + } else { + ret[0] = '\0'; + } + strcat(ret, uid); + strcat(ret, "|"); + } + + if (ret != NULL) { + ret[len-1] = '\0'; + } + return ret; +} + +char* listFileURI(char* uriCstr) { + + size_t uriLength = strlen(uriCstr); + + // Get file path from URI + size_t length = uriLength-7;// -7 for 'file://' + char* path = malloc(sizeof(char)*(length+1));// +1 for '\0' + memcpy(path, &uriCstr[7], length); + path[length] = '\0'; + + char *ret = NULL; + DIR *dfd; + if ((dfd = opendir(path)) != NULL) { + struct dirent *dp; + int len = 0; + while ((dp = readdir(dfd)) != NULL) { + if (strcmp(dp->d_name, ".") == 0) { + // Ignore current directory + continue; + } + if (strcmp(dp->d_name, "..") == 0) { + // Ignore parent directory + continue; + } + // append + char *old = ret; + len = len + uriLength + 1 /* / */ + strlen(dp->d_name) + 1 /* | */; + ret = malloc(sizeof(char)*(len+1)); + if (old != NULL) { + strcpy(ret, old); + free(old); + } else { + ret[0] = '\0'; + } + strcat(ret, uriCstr); + strcat(ret, "/"); + strcat(ret, dp->d_name); + strcat(ret, "|"); + } + if (ret != NULL) { + ret[len-1] = '\0'; + } + } + + free(path); + + return ret; +} + +char* listURI(uintptr_t jni_env, uintptr_t ctx, char* uriCstr) { + if (hasPrefix(uriCstr, "file://")) { + return listFileURI(uriCstr); + } else if (hasPrefix(uriCstr, "content://")) { + return listContentURI(jni_env, ctx, uriCstr); + } + LOG_FATAL("Unrecognized scheme: %s", uriCstr); + return ""; +} + +void keepScreenOn(uintptr_t jni_env, uintptr_t ctx, bool disabled) { + JNIEnv *env = (JNIEnv*)jni_env; + jclass activityClass = find_class(env, "android/app/Activity"); + jmethodID getWindow = find_method(env, activityClass, "getWindow", "()Landroid/view/Window;"); + + jobject win = (*env)->CallObjectMethod(env, (jobject)ctx, getWindow); + jclass windowClass = find_class(env, "android/view/Window"); + + jmethodID action = NULL; + if (disabled) { + action = find_method(env, windowClass, "addFlags", "(I)V"); + } else { + action = find_method(env, windowClass, "clearFlags", "(I)V"); + } + + jclass paramsClass = find_class(env, "android/view/WindowManager$LayoutParams" ); + jfieldID screenFlagField = (*env)->GetStaticFieldID(env, paramsClass, "FLAG_KEEP_SCREEN_ON", "I" ); + int screenFlag = (*env)->GetStaticIntField(env, paramsClass, screenFlagField); + + (*env)->CallVoidMethod(env, win, action, screenFlag); +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/animation.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/animation.go new file mode 100644 index 0000000..aab26dd --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/animation.go @@ -0,0 +1,11 @@ +package mobile + +import "fyne.io/fyne/v2" + +func (d *driver) StartAnimation(a *fyne.Animation) { + d.animation.Start(a) +} + +func (d *driver) StopAnimation(a *fyne.Animation) { + d.animation.Stop(a) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/GoNativeActivity.java b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/GoNativeActivity.java new file mode 100644 index 0000000..f324ef4 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/GoNativeActivity.java @@ -0,0 +1,356 @@ +package org.golang.app; + +import android.app.Activity; +import android.app.NativeActivity; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.content.pm.PackageManager; +import android.content.res.Configuration; +import android.graphics.Rect; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.text.Editable; +import android.text.InputType; +import android.text.TextWatcher; +import android.text.method.DigitsKeyListener; +import android.util.Log; +import android.view.Gravity; +import android.view.KeyCharacterMap; +import android.view.View; +import android.view.WindowInsets; +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputMethodManager; +import android.view.KeyEvent; +import android.widget.EditText; +import android.widget.FrameLayout; +import android.widget.TextView; +import android.widget.TextView.OnEditorActionListener; + +public class GoNativeActivity extends NativeActivity { + private static GoNativeActivity goNativeActivity; + private static final int FILE_OPEN_CODE = 1; + private static final int FILE_SAVE_CODE = 2; + + private static final int DEFAULT_INPUT_TYPE = InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS; + + private static final int DEFAULT_KEYBOARD_CODE = 0; + private static final int SINGLELINE_KEYBOARD_CODE = 1; + private static final int NUMBER_KEYBOARD_CODE = 2; + private static final int PASSWORD_KEYBOARD_CODE = 3; + + private native void filePickerReturned(String str); + private native void insetsChanged(int top, int bottom, int left, int right); + private native void keyboardTyped(String str); + private native void keyboardDelete(); + private native void backPressed(); + private native void setDarkMode(boolean dark); + + private EditText mTextEdit; + private boolean ignoreKey = false; + private boolean keyboardUp = false; + + public GoNativeActivity() { + super(); + goNativeActivity = this; + } + + String getTmpdir() { + return getCacheDir().getAbsolutePath(); + } + + void updateLayout() { + try { + WindowInsets insets = getWindow().getDecorView().getRootWindowInsets(); + if (insets == null) { + return; + } + + insetsChanged(insets.getSystemWindowInsetTop(), insets.getSystemWindowInsetBottom(), + insets.getSystemWindowInsetLeft(), insets.getSystemWindowInsetRight()); + } catch (java.lang.NoSuchMethodError e) { + Rect insets = new Rect(); + getWindow().getDecorView().getWindowVisibleDisplayFrame(insets); + + View view = findViewById(android.R.id.content).getRootView(); + insetsChanged(insets.top, view.getHeight() - insets.height() - insets.top, + insets.left, view.getWidth() - insets.width() - insets.left); + } + } + + static void showKeyboard(int keyboardType) { + goNativeActivity.doShowKeyboard(keyboardType); + goNativeActivity.keyboardUp = true; + } + + void doShowKeyboard(final int keyboardType) { + runOnUiThread(new Runnable() { + @Override + public void run() { + int imeOptions = EditorInfo.IME_FLAG_NO_ENTER_ACTION; + int inputType = DEFAULT_INPUT_TYPE; + String keys = ""; + switch (keyboardType) { + case DEFAULT_KEYBOARD_CODE: + imeOptions = EditorInfo.IME_FLAG_NO_ENTER_ACTION; + break; + case SINGLELINE_KEYBOARD_CODE: + imeOptions = EditorInfo.IME_ACTION_DONE; + break; + case NUMBER_KEYBOARD_CODE: + imeOptions = EditorInfo.IME_ACTION_DONE; + inputType |= InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_NORMAL; + keys = "0123456789.,-' "; // work around android bug where some number keys are blocked + break; + case PASSWORD_KEYBOARD_CODE: + imeOptions = EditorInfo.IME_ACTION_DONE; + inputType |= InputType.TYPE_TEXT_VARIATION_PASSWORD; + default: + Log.e("Fyne", "unknown keyboard type, use default"); + } + mTextEdit.setImeOptions(imeOptions|EditorInfo.IME_FLAG_NO_FULLSCREEN); + mTextEdit.setInputType(inputType); + if (keys != "") { + mTextEdit.setKeyListener(DigitsKeyListener.getInstance(keys)); + } + + mTextEdit.setOnEditorActionListener(new OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if (actionId == EditorInfo.IME_ACTION_DONE) { + keyboardTyped("\n"); + } + return false; + } + }); + + // always place one character so all keyboards can send backspace + ignoreKey = true; + mTextEdit.setText(" "); + mTextEdit.setSelection(mTextEdit.getText().length()); + ignoreKey = false; + + mTextEdit.setVisibility(View.VISIBLE); + mTextEdit.bringToFront(); + mTextEdit.requestFocus(); + + InputMethodManager m = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + m.showSoftInput(mTextEdit, 0); + } + }); + } + + static void hideKeyboard() { + goNativeActivity.doHideKeyboard(); + goNativeActivity.keyboardUp = false; + } + + void doHideKeyboard() { + InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + View view = findViewById(android.R.id.content).getRootView(); + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + + runOnUiThread(new Runnable() { + @Override + public void run() { + mTextEdit.setVisibility(View.GONE); + } + }); + } + + static void showFileOpen(String mimes) { + goNativeActivity.doShowFileOpen(mimes); + } + + void doShowFileOpen(String mimes) { + Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); + if ("application/x-directory".equals(mimes) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); // ask for a directory picker if OS supports it + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + } else if (mimes.contains("|") && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + intent.setType("*/*"); + intent.putExtra(Intent.EXTRA_MIME_TYPES, mimes.split("\\|")); + intent.addCategory(Intent.CATEGORY_OPENABLE); + } else { + intent.setType(mimes); + intent.addCategory(Intent.CATEGORY_OPENABLE); + } + startActivityForResult(Intent.createChooser(intent, "Open File"), FILE_OPEN_CODE); + } + + static void showFileSave(String mimes, String filename) { + goNativeActivity.doShowFileSave(mimes, filename); + } + + void doShowFileSave(String mimes, String filename) { + Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT); + if (mimes.contains("|") && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + intent.setType("*/*"); + intent.putExtra(Intent.EXTRA_MIME_TYPES, mimes.split("\\|")); + } else { + intent.setType(mimes); + } + intent.putExtra(Intent.EXTRA_TITLE, filename); + intent.addCategory(Intent.CATEGORY_OPENABLE); + startActivityForResult(Intent.createChooser(intent, "Save File"), FILE_SAVE_CODE); + } + static int getRune(int deviceId, int keyCode, int metaState) { + try { + int rune = KeyCharacterMap.load(deviceId).get(keyCode, metaState); + if (rune == 0) { + return -1; + } + return rune; + } catch (KeyCharacterMap.UnavailableException e) { + return -1; + } catch (Exception e) { + Log.e("Fyne", "exception reading KeyCharacterMap", e); + return -1; + } + } + + private void load() { + // Interestingly, NativeActivity uses a different method + // to find native code to execute, avoiding + // System.loadLibrary. The result is Java methods + // implemented in C with JNIEXPORT (and JNI_OnLoad) are not + // available unless an explicit call to System.loadLibrary + // is done. So we do it here, borrowing the name of the + // library from the same AndroidManifest.xml metadata used + // by NativeActivity. + try { + ActivityInfo ai = getPackageManager().getActivityInfo( + getIntent().getComponent(), PackageManager.GET_META_DATA); + if (ai.metaData == null) { + Log.e("Fyne", "loadLibrary: no manifest metadata found"); + return; + } + String libName = ai.metaData.getString("android.app.lib_name"); + System.loadLibrary(libName); + } catch (Exception e) { + Log.e("Fyne", "loadLibrary failed", e); + } + } + + @Override + public void onCreate(Bundle savedInstanceState) { + load(); + super.onCreate(savedInstanceState); + setupEntry(); + updateTheme(getResources().getConfiguration()); + + View view = findViewById(android.R.id.content).getRootView(); + view.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { + public void onLayoutChange (View v, int left, int top, int right, int bottom, + int oldLeft, int oldTop, int oldRight, int oldBottom) { + GoNativeActivity.this.updateLayout(); + } + }); + } + + private void setupEntry() { + runOnUiThread(new Runnable() { + @Override + public void run() { + mTextEdit = new EditText(goNativeActivity); + mTextEdit.setVisibility(View.GONE); + mTextEdit.setInputType(DEFAULT_INPUT_TYPE); + + FrameLayout.LayoutParams mEditTextLayoutParams = new FrameLayout.LayoutParams( + FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT); + mTextEdit.setLayoutParams(mEditTextLayoutParams); + addContentView(mTextEdit, mEditTextLayoutParams); + + // always place one character so all keyboards can send backspace + mTextEdit.setText(" "); + mTextEdit.setSelection(mTextEdit.getText().length()); + + mTextEdit.addTextChangedListener(new TextWatcher() { + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + if (ignoreKey) { + return; + } + if (count > 0) { + keyboardTyped(s.subSequence(start,start+count).toString()); + } + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + if (ignoreKey) { + return; + } + if (count > 0) { + for (int i = 0; i < count; i++) { + // send a backspace + keyboardDelete(); + } + } + } + + @Override + public void afterTextChanged(Editable s) { + // always place one character so all keyboards can send backspace + if (s.length() < 1) { + ignoreKey = true; + mTextEdit.setText(" "); + mTextEdit.setSelection(mTextEdit.getText().length()); + ignoreKey = false; + return; + } + } + }); + } + }); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + // unhandled request + if (requestCode != FILE_OPEN_CODE && requestCode != FILE_SAVE_CODE) { + return; + } + + // dialog was cancelled + if (resultCode != Activity.RESULT_OK) { + filePickerReturned(""); + return; + } + + Uri uri = data.getData(); + filePickerReturned(uri.toString()); + } + + @Override + public void onBackPressed() { + if (goNativeActivity.keyboardUp) { + hideKeyboard(); + return; + } + + // skip the default behaviour - we can call finishActivity if we want to go back + backPressed(); + } + + public void finishActivity() { + runOnUiThread(new Runnable() { + @Override + public void run() { + GoNativeActivity.super.onBackPressed(); + } + }); + } + + @Override + public void onConfigurationChanged(Configuration config) { + super.onConfigurationChanged(config); + updateTheme(config); + } + + protected void updateTheme(Configuration config) { + boolean dark = (config.uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES; + setDarkMode(dark); + } +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/android.c b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/android.c new file mode 100644 index 0000000..8980cb2 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/android.c @@ -0,0 +1,307 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build android + +#include +#include +#include +#include +#include +#include +#include +#include "_cgo_export.h" + +#define LOG_INFO(...) __android_log_print(ANDROID_LOG_INFO, "Fyne", __VA_ARGS__) +#define LOG_FATAL(...) __android_log_print(ANDROID_LOG_FATAL, "Fyne", __VA_ARGS__) + +static jclass current_class; + +static jclass find_class(JNIEnv *env, const char *class_name) { + jclass clazz = (*env)->FindClass(env, class_name); + if (clazz == NULL) { + (*env)->ExceptionClear(env); + LOG_FATAL("cannot find %s", class_name); + return NULL; + } + return clazz; +} + +static jmethodID find_method(JNIEnv *env, jclass clazz, const char *name, const char *sig) { + jmethodID m = (*env)->GetMethodID(env, clazz, name, sig); + if (m == 0) { + (*env)->ExceptionClear(env); + LOG_FATAL("cannot find method %s %s", name, sig); + return 0; + } + return m; +} + +static jmethodID find_static_method(JNIEnv *env, jclass clazz, const char *name, const char *sig) { + jmethodID m = (*env)->GetStaticMethodID(env, clazz, name, sig); + if (m == 0) { + (*env)->ExceptionClear(env); + LOG_FATAL("cannot find method %s %s", name, sig); + return 0; + } + return m; +} + +static jmethodID key_rune_method; +static jmethodID show_keyboard_method; +static jmethodID hide_keyboard_method; +static jmethodID show_file_open_method; +static jmethodID show_file_save_method; +static jmethodID finish_method; + +jint JNI_OnLoad(JavaVM* vm, void* reserved) { + JNIEnv* env; + if ((*vm)->GetEnv(vm, (void**)&env, JNI_VERSION_1_6) != JNI_OK) { + return -1; + } + + return JNI_VERSION_1_6; +} + +static int main_running = 0; + +// ensure we refresh context on resume in case something has changed... +void onResume(ANativeActivity *activity) { + JNIEnv* env = activity->env; + setCurrentContext(activity->vm, (*env)->NewGlobalRef(env, activity->clazz)); +} + +void onStart(ANativeActivity *activity) {} +void onPause(ANativeActivity *activity) {} +void onStop(ANativeActivity *activity) {} + +// Entry point from our subclassed NativeActivity. +// +// By here, the Go runtime has been initialized (as we are running in +// -buildmode=c-shared) but the first time it is called, Go's main.main +// hasn't been called yet. +// +// The Activity may be created and destroyed multiple times throughout +// the life of a single process. Each time, onCreate is called. +void ANativeActivity_onCreate(ANativeActivity *activity, void* savedState, size_t savedStateSize) { + if (!main_running) { + JNIEnv* env = activity->env; + + // Note that activity->clazz is mis-named. + current_class = (*env)->GetObjectClass(env, activity->clazz); + current_class = (*env)->NewGlobalRef(env, current_class); + key_rune_method = find_static_method(env, current_class, "getRune", "(III)I"); + show_keyboard_method = find_static_method(env, current_class, "showKeyboard", "(I)V"); + hide_keyboard_method = find_static_method(env, current_class, "hideKeyboard", "()V"); + show_file_open_method = find_static_method(env, current_class, "showFileOpen", "(Ljava/lang/String;)V"); + show_file_save_method = find_static_method(env, current_class, "showFileSave", "(Ljava/lang/String;Ljava/lang/String;)V"); + finish_method = find_method(env, current_class, "finishActivity", "()V"); + + setCurrentContext(activity->vm, (*env)->NewGlobalRef(env, activity->clazz)); + + jmethodID getfilesdir = find_method(env, current_class, "getFilesDir", "()Ljava/io/File;"); + jobject filesdirfile = (jobject)(*env)->CallObjectMethod(env, activity->clazz, getfilesdir, NULL); + jclass file_class = (*env)->GetObjectClass(env, filesdirfile); + jmethodID getabsolutepath = find_method(env, file_class, "getAbsolutePath", "()Ljava/lang/String;"); + jstring jpath = (jstring)(*env)->CallObjectMethod(env, filesdirfile, getabsolutepath, NULL); + const char* filesdir = (*env)->GetStringUTFChars(env, jpath, NULL); + + // Set FILESDIR + if (setenv("FILESDIR", filesdir, 1) != 0) { + LOG_INFO("setenv(\"FILESDIR\", \"%s\", 1) failed: %d", activity->internalDataPath, errno); + } + + // Set TMPDIR. + jmethodID gettmpdir = find_method(env, current_class, "getTmpdir", "()Ljava/lang/String;"); + jpath = (jstring)(*env)->CallObjectMethod(env, activity->clazz, gettmpdir, NULL); + const char* tmpdir = (*env)->GetStringUTFChars(env, jpath, NULL); + if (setenv("TMPDIR", tmpdir, 1) != 0) { + LOG_INFO("setenv(\"TMPDIR\", \"%s\", 1) failed: %d", tmpdir, errno); + } + (*env)->ReleaseStringUTFChars(env, jpath, tmpdir); + + // Call the Go main.main. + uintptr_t mainPC = (uintptr_t)dlsym(RTLD_DEFAULT, "main.main"); + if (!mainPC) { + LOG_FATAL("missing main.main"); + } + callMain(mainPC); + main_running = 1; + } + + // These functions match the methods on Activity, described at + // http://developer.android.com/reference/android/app/Activity.html + // + // Note that onNativeWindowResized is not called on resize. Avoid it. + // https://code.google.com/p/android/issues/detail?id=180645 + activity->callbacks->onStart = onStart; + activity->callbacks->onResume = onResume; + activity->callbacks->onSaveInstanceState = onSaveInstanceState; + activity->callbacks->onPause = onPause; + activity->callbacks->onStop = onStop; + activity->callbacks->onDestroy = onDestroy; + activity->callbacks->onWindowFocusChanged = onWindowFocusChanged; + activity->callbacks->onNativeWindowCreated = onNativeWindowCreated; + activity->callbacks->onNativeWindowRedrawNeeded = onNativeWindowRedrawNeeded; + activity->callbacks->onNativeWindowDestroyed = onNativeWindowDestroyed; + activity->callbacks->onInputQueueCreated = onInputQueueCreated; + activity->callbacks->onInputQueueDestroyed = onInputQueueDestroyed; + activity->callbacks->onConfigurationChanged = onConfigurationChanged; + activity->callbacks->onLowMemory = onLowMemory; + + onCreate(activity); +} + +// TODO(crawshaw): Test configuration on more devices. +static const EGLint RGB_888[] = { + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, + EGL_SURFACE_TYPE, EGL_WINDOW_BIT, + EGL_BLUE_SIZE, 8, + EGL_GREEN_SIZE, 8, + EGL_RED_SIZE, 8, + EGL_DEPTH_SIZE, 16, + EGL_CONFIG_CAVEAT, EGL_NONE, + EGL_NONE +}; + +EGLDisplay display = NULL; +EGLSurface surface = NULL; +EGLContext context = NULL; + +static char* initEGLDisplay() { + display = eglGetDisplay(EGL_DEFAULT_DISPLAY); + if (!eglInitialize(display, 0, 0)) { + return "EGL initialize failed"; + } + return NULL; +} + +char* createEGLSurface(ANativeWindow* window) { + char* err; + EGLint numConfigs, format; + EGLConfig config; + + if (display == 0) { + if ((err = initEGLDisplay()) != NULL) { + return err; + } + } + + if (!eglChooseConfig(display, RGB_888, &config, 1, &numConfigs)) { + return "EGL choose RGB_888 config failed"; + } + if (numConfigs <= 0) { + return "EGL no config found"; + } + + eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format); + if (ANativeWindow_setBuffersGeometry(window, 0, 0, format) != 0) { + return "EGL set buffers geometry failed"; + } + + surface = eglCreateWindowSurface(display, config, window, NULL); + if (surface == EGL_NO_SURFACE) { + return "EGL create surface failed"; + } + + if (context == NULL) { + const EGLint contextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; + context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs); + } + + if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE) { + return "eglMakeCurrent failed"; + } + return NULL; +} + +char* destroyEGLSurface() { + if (!eglDestroySurface(display, surface)) { + return "EGL destroy surface failed"; + } + return NULL; +} + +void finish(JNIEnv* env, jobject ctx) { + (*env)->CallVoidMethod( + env, + ctx, + finish_method); +} + +int32_t getKeyRune(JNIEnv* env, AInputEvent* e) { + return (int32_t)(*env)->CallStaticIntMethod( + env, + current_class, + key_rune_method, + AInputEvent_getDeviceId(e), + AKeyEvent_getKeyCode(e), + AKeyEvent_getMetaState(e) + ); +} + +void showKeyboard(JNIEnv* env, int keyboardType) { + (*env)->CallStaticVoidMethod( + env, + current_class, + show_keyboard_method, + keyboardType + ); +} + +void hideKeyboard(JNIEnv* env) { + (*env)->CallStaticVoidMethod( + env, + current_class, + hide_keyboard_method + ); +} + +void showFileOpen(JNIEnv* env, char* mimes) { + jstring mimesJString = (*env)->NewStringUTF(env, mimes); + (*env)->CallStaticVoidMethod( + env, + current_class, + show_file_open_method, + mimesJString + ); +} + +void showFileSave(JNIEnv* env, char* mimes, char* filename) { + jstring mimesJString = (*env)->NewStringUTF(env, mimes); + jstring filenameJString = (*env)->NewStringUTF(env, filename); + (*env)->CallStaticVoidMethod( + env, + current_class, + show_file_save_method, + mimesJString, + filenameJString + ); +} + +void Java_org_golang_app_GoNativeActivity_filePickerReturned(JNIEnv *env, jclass clazz, jstring str) { + const char* cstr = (*env)->GetStringUTFChars(env, str, JNI_FALSE); + filePickerReturned((char*)cstr); +} + +void Java_org_golang_app_GoNativeActivity_insetsChanged(JNIEnv *env, jclass clazz, int top, int bottom, int left, int right) { + insetsChanged(top, bottom, left, right); +} + +void Java_org_golang_app_GoNativeActivity_keyboardTyped(JNIEnv *env, jclass clazz, jstring str) { + const char* cstr = (*env)->GetStringUTFChars(env, str, JNI_FALSE); + keyboardTyped((char*)cstr); +} + +void Java_org_golang_app_GoNativeActivity_keyboardDelete(JNIEnv *env, jclass clazz) { + keyboardDelete(); +} + +void Java_org_golang_app_GoNativeActivity_backPressed(JNIEnv *env, jclass clazz) { + onBackPressed(); +} + +void Java_org_golang_app_GoNativeActivity_setDarkMode(JNIEnv *env, jclass clazz, jboolean dark) { + setDarkMode((bool)dark); +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/android.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/android.go new file mode 100644 index 0000000..ea925bb --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/android.go @@ -0,0 +1,898 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build android + +/* +Android Apps are built with -buildmode=c-shared. They are loaded by a +running Java process. + +Before any entry point is reached, a global constructor initializes the +Go runtime, calling all Go init functions. All cgo calls will block +until this is complete. Next JNI_OnLoad is called. When that is +complete, one of two entry points is called. + +All-Go apps built using NativeActivity enter at ANativeActivity_onCreate. + +Go libraries (for example, those built with gomobile bind) do not use +the app package initialization. +*/ + +package app + +/* +#cgo LDFLAGS: -landroid -llog -lEGL -lGLESv2 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern EGLDisplay display; +extern EGLSurface surface; + +char* createEGLSurface(ANativeWindow* window); +char* destroyEGLSurface(); +int32_t getKeyRune(JNIEnv* env, AInputEvent* e); + +void showKeyboard(JNIEnv* env, int keyboardType); +void hideKeyboard(JNIEnv* env); +void showFileOpen(JNIEnv* env, char* mimes); +void showFileSave(JNIEnv* env, char* mimes, char* filename); +void finish(JNIEnv* env, jobject ctx); + +void Java_org_golang_app_GoNativeActivity_filePickerReturned(JNIEnv *env, jclass clazz, jstring str); +*/ +import "C" + +import ( + "fmt" + "log" + "mime" + "os" + "strings" + "time" + "unsafe" + + "fyne.io/fyne/v2/internal/driver/mobile/app/callfn" + "fyne.io/fyne/v2/internal/driver/mobile/event/key" + "fyne.io/fyne/v2/internal/driver/mobile/event/lifecycle" + "fyne.io/fyne/v2/internal/driver/mobile/event/paint" + "fyne.io/fyne/v2/internal/driver/mobile/event/size" + "fyne.io/fyne/v2/internal/driver/mobile/event/touch" + "fyne.io/fyne/v2/internal/driver/mobile/mobileinit" +) + +// mimeMap contains standard mime entries that are missing on Android +var mimeMap = map[string]string{ + ".txt": "text/plain", +} + +// GoBack asks the OS to go to the previous app / activity +func GoBack() { + err := RunOnJVM(func(_, jniEnv, ctx uintptr) error { + env := (*C.JNIEnv)(unsafe.Pointer(jniEnv)) + C.finish(env, C.jobject(ctx)) + return nil + }) + if err != nil { + log.Fatalf("app: %v", err) + } +} + +// RunOnJVM runs fn on a new goroutine locked to an OS thread with a JNIEnv. +// +// RunOnJVM blocks until the call to fn is complete. Any Java +// exception or failure to attach to the JVM is returned as an error. +// +// The function fn takes vm, the current JavaVM*, +// env, the current JNIEnv*, and +// ctx, a jobject representing the global android.context.Context. +func RunOnJVM(fn func(vm, jniEnv, ctx uintptr) error) error { + return mobileinit.RunOnJVM(fn) +} + +//export setCurrentContext +func setCurrentContext(vm *C.JavaVM, ctx C.jobject) { + mobileinit.SetCurrentContext(unsafe.Pointer(vm), uintptr(ctx)) +} + +//export callMain +func callMain(mainPC uintptr) { + for _, name := range []string{"FILESDIR", "TMPDIR", "PATH", "LD_LIBRARY_PATH"} { + n := C.CString(name) + os.Setenv(name, C.GoString(C.getenv(n))) + C.free(unsafe.Pointer(n)) + } + + // Set timezone. + // + // Note that Android zoneinfo is stored in /system/usr/share/zoneinfo, + // but it is in some kind of packed TZiff file that we do not support + // yet. As a stopgap, we build a fixed zone using the tm_zone name. + var curtime C.time_t + var curtm C.struct_tm + C.time(&curtime) + C.localtime_r(&curtime, &curtm) + tzOffset := int(curtm.tm_gmtoff) + tz := C.GoString(curtm.tm_zone) + time.Local = time.FixedZone(tz, tzOffset) + + go callfn.CallFn(mainPC) +} + +//export onSaveInstanceState +func onSaveInstanceState(activity *C.ANativeActivity, outSize *C.size_t) unsafe.Pointer { + return nil +} + +//export onBackPressed +func onBackPressed() { + k := key.Event{ + Code: key.CodeBackButton, + Direction: key.DirPress, + } + theApp.events.In() <- k + + k.Direction = key.DirRelease + theApp.events.In() <- k +} + +//export onCreate +func onCreate(activity *C.ANativeActivity) { + // Set the initial configuration. + // + // Note we use unbuffered channels to talk to the activity loop, and + // NativeActivity calls these callbacks sequentially, so configuration + // will be set before <-windowRedrawNeeded is processed. + windowConfigChange <- windowConfigRead(activity) +} + +//export onDestroy +func onDestroy(activity *C.ANativeActivity) { + activityDestroyed <- struct{}{} +} + +//export onWindowFocusChanged +func onWindowFocusChanged(activity *C.ANativeActivity, hasFocus C.int) { +} + +//export onNativeWindowCreated +func onNativeWindowCreated(activity *C.ANativeActivity, window *C.ANativeWindow) { + windowCreated <- window +} + +//export onNativeWindowRedrawNeeded +func onNativeWindowRedrawNeeded(activity *C.ANativeActivity, window *C.ANativeWindow) { + // Called on orientation change and window resize. + // Send a request for redraw, and block this function + // until a complete draw and buffer swap is completed. + // This is required by the redraw documentation to + // avoid bad draws. + windowRedrawNeeded <- window + <-windowRedrawDone +} + +//export onNativeWindowDestroyed +func onNativeWindowDestroyed(activity *C.ANativeActivity, window *C.ANativeWindow) { + windowDestroyed <- window +} + +//export onInputQueueCreated +func onInputQueueCreated(activity *C.ANativeActivity, q *C.AInputQueue) { + inputQueue <- q + <-inputQueueDone +} + +//export onInputQueueDestroyed +func onInputQueueDestroyed(activity *C.ANativeActivity, q *C.AInputQueue) { + inputQueue <- nil + <-inputQueueDone +} + +//export onContentRectChanged +func onContentRectChanged(activity *C.ANativeActivity, rect *C.ARect) { +} + +//export setDarkMode +func setDarkMode(dark C.bool) { + darkMode = bool(dark) +} + +type windowConfig struct { + orientation size.Orientation + pixelsPerPt float32 +} + +func windowConfigRead(activity *C.ANativeActivity) windowConfig { + aconfig := C.AConfiguration_new() + C.AConfiguration_fromAssetManager(aconfig, activity.assetManager) + orient := C.AConfiguration_getOrientation(aconfig) + density := C.AConfiguration_getDensity(aconfig) + C.AConfiguration_delete(aconfig) + + // Calculate the screen resolution. This value is approximate. For example, + // a physical resolution of 200 DPI may be quantized to one of the + // ACONFIGURATION_DENSITY_XXX values such as 160 or 240. + // + // A more accurate DPI could possibly be calculated from + // https://developer.android.com/reference/android/util/DisplayMetrics.html#xdpi + // but this does not appear to be accessible via the NDK. In any case, the + // hardware might not even provide a more accurate number, as the system + // does not apparently use the reported value. See golang.org/issue/13366 + // for a discussion. + var dpi int + switch density { + case C.ACONFIGURATION_DENSITY_DEFAULT: + dpi = 160 + case C.ACONFIGURATION_DENSITY_LOW, + C.ACONFIGURATION_DENSITY_MEDIUM, + 213, // C.ACONFIGURATION_DENSITY_TV + C.ACONFIGURATION_DENSITY_HIGH, + 320, // ACONFIGURATION_DENSITY_XHIGH + 480, // ACONFIGURATION_DENSITY_XXHIGH + 640: // ACONFIGURATION_DENSITY_XXXHIGH + dpi = int(density) + case C.ACONFIGURATION_DENSITY_NONE: + log.Print("android device reports no screen density") + dpi = 72 + default: + log.Printf("android device reports unknown density: %d", density) + // All we can do is guess. + if density > 0 { + dpi = int(density) + } else { + dpi = 72 + } + } + + o := size.OrientationUnknown + switch orient { + case C.ACONFIGURATION_ORIENTATION_PORT: + o = size.OrientationPortrait + case C.ACONFIGURATION_ORIENTATION_LAND: + o = size.OrientationLandscape + } + + return windowConfig{ + orientation: o, + pixelsPerPt: float32(dpi) / 72, + } +} + +//export onConfigurationChanged +func onConfigurationChanged(activity *C.ANativeActivity) { + // A rotation event first triggers onConfigurationChanged, then + // calls onNativeWindowRedrawNeeded. We extract the orientation + // here and save it for the redraw event. + windowConfigChange <- windowConfigRead(activity) +} + +//export onLowMemory +func onLowMemory(activity *C.ANativeActivity) { + cleanCaches() +} + +var ( + inputQueue = make(chan *C.AInputQueue) + inputQueueDone = make(chan struct{}) + windowCreated = make(chan *C.ANativeWindow) + windowDestroyed = make(chan *C.ANativeWindow) + windowRedrawNeeded = make(chan *C.ANativeWindow) + windowRedrawDone = make(chan struct{}) + windowConfigChange = make(chan windowConfig) + activityDestroyed = make(chan struct{}) + + currentSize size.Event + darkMode bool +) + +func init() { + theApp.registerGLViewportFilter() +} + +func main(f func(App)) { + mainUserFn = f + // TODO: merge the runInputQueue and mainUI functions? + go func() { + if err := mobileinit.RunOnJVM(runInputQueue); err != nil { + log.Fatalf("app: %v", err) + } + }() + // Preserve this OS thread for: + // 1. the attached JNI thread + // 2. the GL context + if err := mobileinit.RunOnJVM(mainUI); err != nil { + log.Fatalf("app: %v", err) + } +} + +// driverShowVirtualKeyboard requests the driver to show a virtual keyboard for text input +func driverShowVirtualKeyboard(keyboard KeyboardType) { + err := mobileinit.RunOnJVM(func(vm, jniEnv, ctx uintptr) error { + env := (*C.JNIEnv)(unsafe.Pointer(jniEnv)) // not a Go heap pointer + C.showKeyboard(env, C.int(int32(keyboard))) + return nil + }) + if err != nil { + log.Fatalf("app: %v", err) + } +} + +// driverHideVirtualKeyboard requests the driver to hide any visible virtual keyboard +func driverHideVirtualKeyboard() { + if err := mobileinit.RunOnJVM(hideSoftInput); err != nil { + log.Fatalf("app: %v", err) + } +} + +func hideSoftInput(vm, jniEnv, ctx uintptr) error { + env := (*C.JNIEnv)(unsafe.Pointer(jniEnv)) // not a Go heap pointer + C.hideKeyboard(env) + return nil +} + +var fileCallback func(string, func()) + +//export filePickerReturned +func filePickerReturned(str *C.char) { + if fileCallback == nil { + return + } + + fileCallback(C.GoString(str), nil) + fileCallback = nil +} + +//export insetsChanged +func insetsChanged(top, bottom, left, right int) { + currentSize.InsetTopPx = top + currentSize.InsetBottomPx = bottom + currentSize.InsetLeftPx = left + currentSize.InsetRightPx = right + + theApp.events.In() <- currentSize +} + +func mimeStringFromFilter(filter *FileFilter) string { + mimes := "*/*" + if filter.MimeTypes != nil { + mimes = strings.Join(filter.MimeTypes, "|") + } else if filter.Extensions != nil { + var mimeTypes []string + for _, ext := range filter.Extensions { + if mimeEntry, ok := mimeMap[ext]; ok { + mimeTypes = append(mimeTypes, mimeEntry) + + continue + } + + mimeType := mime.TypeByExtension(ext) + if mimeType == "" { + log.Println("Could not find mime for extension " + ext + ", allowing all") + return "*/*" // could not find one, so allow all + } + + mimeTypes = append(mimeTypes, mimeType) + } + mimes = strings.Join(mimeTypes, "|") + } + return mimes +} + +func driverShowFileOpenPicker(callback func(string, func()), filter *FileFilter) { + fileCallback = callback + + mimes := mimeStringFromFilter(filter) + mimeStr := C.CString(mimes) + defer C.free(unsafe.Pointer(mimeStr)) + + open := func(vm, jniEnv, ctx uintptr) error { + // TODO pass in filter... + env := (*C.JNIEnv)(unsafe.Pointer(jniEnv)) // not a Go heap pointer + C.showFileOpen(env, mimeStr) + return nil + } + + if err := mobileinit.RunOnJVM(open); err != nil { + log.Fatalf("app: %v", err) + } +} + +func driverShowFileSavePicker(callback func(string, func()), filter *FileFilter, filename string) { + fileCallback = callback + + mimes := mimeStringFromFilter(filter) + mimeStr := C.CString(mimes) + defer C.free(unsafe.Pointer(mimeStr)) + filenameStr := C.CString(filename) + defer C.free(unsafe.Pointer(filenameStr)) + + save := func(vm, jniEnv, ctx uintptr) error { + env := (*C.JNIEnv)(unsafe.Pointer(jniEnv)) // not a Go heap pointer + C.showFileSave(env, mimeStr, filenameStr) + return nil + } + + if err := mobileinit.RunOnJVM(save); err != nil { + log.Fatalf("app: %v", err) + } +} + +var mainUserFn func(App) + +var DisplayMetrics struct { + WidthPx int + HeightPx int +} + +func mainUI(vm, jniEnv, ctx uintptr) error { + workAvailable := theApp.worker.WorkAvailable() + + donec := make(chan struct{}) + go func() { + mainUserFn(theApp) + close(donec) + }() + + var pixelsPerPt float32 + var surfaceInitialized, wasDestroyed bool + + for { + select { + case <-donec: + return nil + case cfg := <-windowConfigChange: + pixelsPerPt = cfg.pixelsPerPt + case w := <-windowCreated: + if surfaceInitialized && !wasDestroyed { + if errStr := C.destroyEGLSurface(); errStr != nil { + return fmt.Errorf("%s (%s)", C.GoString(errStr), eglGetError()) + } + if errStr := C.createEGLSurface(w); errStr != nil { + return fmt.Errorf("%s (%s)", C.GoString(errStr), eglGetError()) + } + } + case w := <-windowRedrawNeeded: + if C.surface == nil { + if errStr := C.createEGLSurface(w); errStr != nil { + return fmt.Errorf("%s (%s)", C.GoString(errStr), eglGetError()) + } + surfaceInitialized = true + DisplayMetrics.WidthPx = int(C.ANativeWindow_getWidth(w)) + DisplayMetrics.HeightPx = int(C.ANativeWindow_getHeight(w)) + } + theApp.sendLifecycle(lifecycle.StageFocused) + widthPx := int(C.ANativeWindow_getWidth(w)) + heightPx := int(C.ANativeWindow_getHeight(w)) + currentSize = size.Event{ + WidthPx: widthPx, + HeightPx: heightPx, + WidthPt: float32(widthPx) / pixelsPerPt, + HeightPt: float32(heightPx) / pixelsPerPt, + InsetTopPx: currentSize.InsetTopPx, + InsetBottomPx: currentSize.InsetBottomPx, + InsetLeftPx: currentSize.InsetLeftPx, + InsetRightPx: currentSize.InsetRightPx, + PixelsPerPt: pixelsPerPt, + Orientation: screenOrientation(widthPx, heightPx), // we are guessing orientation here as it was not always working + DarkMode: darkMode, + } + theApp.events.In() <- currentSize + theApp.events.In() <- paint.Event{External: true, Window: uintptr(unsafe.Pointer(w))} + case <-windowDestroyed: + if C.surface != nil { + if errStr := C.destroyEGLSurface(); errStr != nil { + return fmt.Errorf("%s (%s)", C.GoString(errStr), eglGetError()) + } + } + C.surface = nil + wasDestroyed = true + theApp.sendLifecycle(lifecycle.StageAlive) + case <-activityDestroyed: + theApp.sendLifecycle(lifecycle.StageDead) + case <-workAvailable: + theApp.worker.DoWork() + case <-theApp.publish: + // TODO: compare a generation number to redrawGen for stale paints? + if C.surface != nil { + // eglSwapBuffers blocks until vsync. + if C.eglSwapBuffers(C.display, C.surface) == C.EGL_FALSE { + log.Printf("app: failed to swap buffers (%s)", eglGetError()) + } + } + select { + case windowRedrawDone <- struct{}{}: + default: + } + theApp.publishResult <- PublishResult{} + } + } +} + +func runInputQueue(vm, jniEnv, ctx uintptr) error { + env := (*C.JNIEnv)(unsafe.Pointer(jniEnv)) // not a Go heap pointer + + // Android loopers select on OS file descriptors, not Go channels, so we + // translate the inputQueue channel to an ALooper_wake call. + l := C.ALooper_prepare(C.ALOOPER_PREPARE_ALLOW_NON_CALLBACKS) + pending := make(chan *C.AInputQueue, 1) + go func() { + for q := range inputQueue { + pending <- q + C.ALooper_wake(l) + } + }() + + var q *C.AInputQueue + for { + if C.ALooper_pollOnce(-1, nil, nil, nil) == C.ALOOPER_POLL_WAKE { + select { + default: + case p := <-pending: + if q != nil { + processEvents(env, q) + C.AInputQueue_detachLooper(q) + } + q = p + if q != nil { + C.AInputQueue_attachLooper(q, l, 0, nil, nil) + } + inputQueueDone <- struct{}{} + } + } + if q != nil { + processEvents(env, q) + } + } +} + +func processEvents(env *C.JNIEnv, q *C.AInputQueue) { + var e *C.AInputEvent + for C.AInputQueue_getEvent(q, &e) >= 0 { + if C.AInputQueue_preDispatchEvent(q, e) != 0 { + continue + } + processEvent(env, e) + C.AInputQueue_finishEvent(q, e, 0) + } +} + +func processEvent(env *C.JNIEnv, e *C.AInputEvent) { + switch C.AInputEvent_getType(e) { + case C.AINPUT_EVENT_TYPE_KEY: + processKey(env, e) + case C.AINPUT_EVENT_TYPE_MOTION: + // At most one of the events in this batch is an up or down event; get its index and change. + upDownIndex := C.size_t(C.AMotionEvent_getAction(e)&C.AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >> C.AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT + upDownType := touch.TypeMove + switch C.AMotionEvent_getAction(e) & C.AMOTION_EVENT_ACTION_MASK { + case C.AMOTION_EVENT_ACTION_DOWN, C.AMOTION_EVENT_ACTION_POINTER_DOWN: + upDownType = touch.TypeBegin + case C.AMOTION_EVENT_ACTION_UP, C.AMOTION_EVENT_ACTION_POINTER_UP: + upDownType = touch.TypeEnd + } + + for i, n := C.size_t(0), C.AMotionEvent_getPointerCount(e); i < n; i++ { + t := touch.TypeMove + if i == upDownIndex { + t = upDownType + } + theApp.events.In() <- touch.Event{ + X: float32(C.AMotionEvent_getX(e, i)), + Y: float32(C.AMotionEvent_getY(e, i)), + Sequence: touch.Sequence(C.AMotionEvent_getPointerId(e, i)), + Type: t, + } + } + default: + log.Printf("unknown input event, type=%d", C.AInputEvent_getType(e)) + } +} + +func processKey(env *C.JNIEnv, e *C.AInputEvent) { + deviceID := C.AInputEvent_getDeviceId(e) + if deviceID == 0 { + // Software keyboard input, leaving for scribe/IME. + return + } + + k := key.Event{ + Rune: rune(C.getKeyRune(env, e)), + Code: convAndroidKeyCode(int32(C.AKeyEvent_getKeyCode(e))), + } + if k.Rune >= '0' && k.Rune <= '9' { // GBoard generates key events for numbers, but we see them in textChanged + return + } + switch C.AKeyEvent_getAction(e) { + case C.AKEY_STATE_DOWN: + k.Direction = key.DirPress + case C.AKEY_STATE_UP: + k.Direction = key.DirRelease + default: + k.Direction = key.DirNone + } + // TODO(crawshaw): set Modifiers. + theApp.events.In() <- k +} + +func eglGetError() string { + switch errNum := C.eglGetError(); errNum { + case C.EGL_SUCCESS: + return "EGL_SUCCESS" + case C.EGL_NOT_INITIALIZED: + return "EGL_NOT_INITIALIZED" + case C.EGL_BAD_ACCESS: + return "EGL_BAD_ACCESS" + case C.EGL_BAD_ALLOC: + return "EGL_BAD_ALLOC" + case C.EGL_BAD_ATTRIBUTE: + return "EGL_BAD_ATTRIBUTE" + case C.EGL_BAD_CONTEXT: + return "EGL_BAD_CONTEXT" + case C.EGL_BAD_CONFIG: + return "EGL_BAD_CONFIG" + case C.EGL_BAD_CURRENT_SURFACE: + return "EGL_BAD_CURRENT_SURFACE" + case C.EGL_BAD_DISPLAY: + return "EGL_BAD_DISPLAY" + case C.EGL_BAD_SURFACE: + return "EGL_BAD_SURFACE" + case C.EGL_BAD_MATCH: + return "EGL_BAD_MATCH" + case C.EGL_BAD_PARAMETER: + return "EGL_BAD_PARAMETER" + case C.EGL_BAD_NATIVE_PIXMAP: + return "EGL_BAD_NATIVE_PIXMAP" + case C.EGL_BAD_NATIVE_WINDOW: + return "EGL_BAD_NATIVE_WINDOW" + case C.EGL_CONTEXT_LOST: + return "EGL_CONTEXT_LOST" + default: + return fmt.Sprintf("Unknown EGL err: %d", errNum) + } +} + +var androidKeycoe = map[int32]key.Code{ + C.AKEYCODE_HOME: key.CodeHome, + C.AKEYCODE_0: key.Code0, + C.AKEYCODE_1: key.Code1, + C.AKEYCODE_2: key.Code2, + C.AKEYCODE_3: key.Code3, + C.AKEYCODE_4: key.Code4, + C.AKEYCODE_5: key.Code5, + C.AKEYCODE_6: key.Code6, + C.AKEYCODE_7: key.Code7, + C.AKEYCODE_8: key.Code8, + C.AKEYCODE_9: key.Code9, + C.AKEYCODE_VOLUME_UP: key.CodeVolumeUp, + C.AKEYCODE_VOLUME_DOWN: key.CodeVolumeDown, + C.AKEYCODE_A: key.CodeA, + C.AKEYCODE_B: key.CodeB, + C.AKEYCODE_C: key.CodeC, + C.AKEYCODE_D: key.CodeD, + C.AKEYCODE_E: key.CodeE, + C.AKEYCODE_F: key.CodeF, + C.AKEYCODE_G: key.CodeG, + C.AKEYCODE_H: key.CodeH, + C.AKEYCODE_I: key.CodeI, + C.AKEYCODE_J: key.CodeJ, + C.AKEYCODE_K: key.CodeK, + C.AKEYCODE_L: key.CodeL, + C.AKEYCODE_M: key.CodeM, + C.AKEYCODE_N: key.CodeN, + C.AKEYCODE_O: key.CodeO, + C.AKEYCODE_P: key.CodeP, + C.AKEYCODE_Q: key.CodeQ, + C.AKEYCODE_R: key.CodeR, + C.AKEYCODE_S: key.CodeS, + C.AKEYCODE_T: key.CodeT, + C.AKEYCODE_U: key.CodeU, + C.AKEYCODE_V: key.CodeV, + C.AKEYCODE_W: key.CodeW, + C.AKEYCODE_X: key.CodeX, + C.AKEYCODE_Y: key.CodeY, + C.AKEYCODE_Z: key.CodeZ, + C.AKEYCODE_COMMA: key.CodeComma, + C.AKEYCODE_PERIOD: key.CodeFullStop, + C.AKEYCODE_ALT_LEFT: key.CodeLeftAlt, + C.AKEYCODE_ALT_RIGHT: key.CodeRightAlt, + C.AKEYCODE_SHIFT_LEFT: key.CodeLeftShift, + C.AKEYCODE_SHIFT_RIGHT: key.CodeRightShift, + C.AKEYCODE_TAB: key.CodeTab, + C.AKEYCODE_SPACE: key.CodeSpacebar, + C.AKEYCODE_ENTER: key.CodeReturnEnter, + C.AKEYCODE_DEL: key.CodeDeleteBackspace, + C.AKEYCODE_GRAVE: key.CodeGraveAccent, + C.AKEYCODE_MINUS: key.CodeHyphenMinus, + C.AKEYCODE_EQUALS: key.CodeEqualSign, + C.AKEYCODE_LEFT_BRACKET: key.CodeLeftSquareBracket, + C.AKEYCODE_RIGHT_BRACKET: key.CodeRightSquareBracket, + C.AKEYCODE_BACKSLASH: key.CodeBackslash, + C.AKEYCODE_SEMICOLON: key.CodeSemicolon, + C.AKEYCODE_APOSTROPHE: key.CodeApostrophe, + C.AKEYCODE_SLASH: key.CodeSlash, + C.AKEYCODE_PAGE_UP: key.CodePageUp, + C.AKEYCODE_PAGE_DOWN: key.CodePageDown, + C.AKEYCODE_ESCAPE: key.CodeEscape, + C.AKEYCODE_FORWARD_DEL: key.CodeDeleteForward, + C.AKEYCODE_CTRL_LEFT: key.CodeLeftControl, + C.AKEYCODE_CTRL_RIGHT: key.CodeRightControl, + C.AKEYCODE_CAPS_LOCK: key.CodeCapsLock, + C.AKEYCODE_META_LEFT: key.CodeLeftGUI, + C.AKEYCODE_META_RIGHT: key.CodeRightGUI, + C.AKEYCODE_INSERT: key.CodeInsert, + C.AKEYCODE_F1: key.CodeF1, + C.AKEYCODE_F2: key.CodeF2, + C.AKEYCODE_F3: key.CodeF3, + C.AKEYCODE_F4: key.CodeF4, + C.AKEYCODE_F5: key.CodeF5, + C.AKEYCODE_F6: key.CodeF6, + C.AKEYCODE_F7: key.CodeF7, + C.AKEYCODE_F8: key.CodeF8, + C.AKEYCODE_F9: key.CodeF9, + C.AKEYCODE_F10: key.CodeF10, + C.AKEYCODE_F11: key.CodeF11, + C.AKEYCODE_F12: key.CodeF12, + C.AKEYCODE_NUM_LOCK: key.CodeKeypadNumLock, + C.AKEYCODE_NUMPAD_0: key.CodeKeypad0, + C.AKEYCODE_NUMPAD_1: key.CodeKeypad1, + C.AKEYCODE_NUMPAD_2: key.CodeKeypad2, + C.AKEYCODE_NUMPAD_3: key.CodeKeypad3, + C.AKEYCODE_NUMPAD_4: key.CodeKeypad4, + C.AKEYCODE_NUMPAD_5: key.CodeKeypad5, + C.AKEYCODE_NUMPAD_6: key.CodeKeypad6, + C.AKEYCODE_NUMPAD_7: key.CodeKeypad7, + C.AKEYCODE_NUMPAD_8: key.CodeKeypad8, + C.AKEYCODE_NUMPAD_9: key.CodeKeypad9, + C.AKEYCODE_NUMPAD_DIVIDE: key.CodeKeypadSlash, + C.AKEYCODE_NUMPAD_MULTIPLY: key.CodeKeypadAsterisk, + C.AKEYCODE_NUMPAD_SUBTRACT: key.CodeKeypadHyphenMinus, + C.AKEYCODE_NUMPAD_ADD: key.CodeKeypadPlusSign, + C.AKEYCODE_NUMPAD_DOT: key.CodeKeypadFullStop, + C.AKEYCODE_NUMPAD_ENTER: key.CodeKeypadEnter, + C.AKEYCODE_NUMPAD_EQUALS: key.CodeKeypadEqualSign, + C.AKEYCODE_VOLUME_MUTE: key.CodeMute, +} + +func convAndroidKeyCode(aKeyCode int32) key.Code { + if code, ok := androidKeycoe[aKeyCode]; ok { + return code + } + return key.CodeUnknown +} + +/* + Many Android key codes do not map into USB HID codes. + For those, key.CodeUnknown is returned. This switch has all + cases, even the unknown ones, to serve as a documentation + and search aid. + C.AKEYCODE_UNKNOWN + C.AKEYCODE_SOFT_LEFT + C.AKEYCODE_SOFT_RIGHT + C.AKEYCODE_BACK + C.AKEYCODE_CALL + C.AKEYCODE_ENDCALL + C.AKEYCODE_STAR + C.AKEYCODE_POUND + C.AKEYCODE_DPAD_UP + C.AKEYCODE_DPAD_DOWN + C.AKEYCODE_DPAD_LEFT + C.AKEYCODE_DPAD_RIGHT + C.AKEYCODE_DPAD_CENTER + C.AKEYCODE_POWER + C.AKEYCODE_CAMERA + C.AKEYCODE_CLEAR + C.AKEYCODE_SYM + C.AKEYCODE_EXPLORER + C.AKEYCODE_ENVELOPE + C.AKEYCODE_AT + C.AKEYCODE_NUM + C.AKEYCODE_HEADSETHOOK + C.AKEYCODE_FOCUS + C.AKEYCODE_PLUS + C.AKEYCODE_MENU + C.AKEYCODE_NOTIFICATION + C.AKEYCODE_SEARCH + C.AKEYCODE_MEDIA_PLAY_PAUSE + C.AKEYCODE_MEDIA_STOP + C.AKEYCODE_MEDIA_NEXT + C.AKEYCODE_MEDIA_PREVIOUS + C.AKEYCODE_MEDIA_REWIND + C.AKEYCODE_MEDIA_FAST_FORWARD + C.AKEYCODE_MUTE + C.AKEYCODE_PICTSYMBOLS + C.AKEYCODE_SWITCH_CHARSET + C.AKEYCODE_BUTTON_A + C.AKEYCODE_BUTTON_B + C.AKEYCODE_BUTTON_C + C.AKEYCODE_BUTTON_X + C.AKEYCODE_BUTTON_Y + C.AKEYCODE_BUTTON_Z + C.AKEYCODE_BUTTON_L1 + C.AKEYCODE_BUTTON_R1 + C.AKEYCODE_BUTTON_L2 + C.AKEYCODE_BUTTON_R2 + C.AKEYCODE_BUTTON_THUMBL + C.AKEYCODE_BUTTON_THUMBR + C.AKEYCODE_BUTTON_START + C.AKEYCODE_BUTTON_SELECT + C.AKEYCODE_BUTTON_MODE + C.AKEYCODE_SCROLL_LOCK + C.AKEYCODE_FUNCTION + C.AKEYCODE_SYSRQ + C.AKEYCODE_BREAK + C.AKEYCODE_MOVE_HOME + C.AKEYCODE_MOVE_END + C.AKEYCODE_FORWARD + C.AKEYCODE_MEDIA_PLAY + C.AKEYCODE_MEDIA_PAUSE + C.AKEYCODE_MEDIA_CLOSE + C.AKEYCODE_MEDIA_EJECT + C.AKEYCODE_MEDIA_RECORD + C.AKEYCODE_NUMPAD_COMMA + C.AKEYCODE_NUMPAD_LEFT_PAREN + C.AKEYCODE_NUMPAD_RIGHT_PAREN + C.AKEYCODE_INFO + C.AKEYCODE_CHANNEL_UP + C.AKEYCODE_CHANNEL_DOWN + C.AKEYCODE_ZOOM_IN + C.AKEYCODE_ZOOM_OUT + C.AKEYCODE_TV + C.AKEYCODE_WINDOW + C.AKEYCODE_GUIDE + C.AKEYCODE_DVR + C.AKEYCODE_BOOKMARK + C.AKEYCODE_CAPTIONS + C.AKEYCODE_SETTINGS + C.AKEYCODE_TV_POWER + C.AKEYCODE_TV_INPUT + C.AKEYCODE_STB_POWER + C.AKEYCODE_STB_INPUT + C.AKEYCODE_AVR_POWER + C.AKEYCODE_AVR_INPUT + C.AKEYCODE_PROG_RED + C.AKEYCODE_PROG_GREEN + C.AKEYCODE_PROG_YELLOW + C.AKEYCODE_PROG_BLUE + C.AKEYCODE_APP_SWITCH + C.AKEYCODE_BUTTON_1 + C.AKEYCODE_BUTTON_2 + C.AKEYCODE_BUTTON_3 + C.AKEYCODE_BUTTON_4 + C.AKEYCODE_BUTTON_5 + C.AKEYCODE_BUTTON_6 + C.AKEYCODE_BUTTON_7 + C.AKEYCODE_BUTTON_8 + C.AKEYCODE_BUTTON_9 + C.AKEYCODE_BUTTON_10 + C.AKEYCODE_BUTTON_11 + C.AKEYCODE_BUTTON_12 + C.AKEYCODE_BUTTON_13 + C.AKEYCODE_BUTTON_14 + C.AKEYCODE_BUTTON_15 + C.AKEYCODE_BUTTON_16 + C.AKEYCODE_LANGUAGE_SWITCH + C.AKEYCODE_MANNER_MODE + C.AKEYCODE_3D_MODE + C.AKEYCODE_CONTACTS + C.AKEYCODE_CALENDAR + C.AKEYCODE_MUSIC + C.AKEYCODE_CALCULATOR + + Defined in an NDK API version beyond what we use today: + C.AKEYCODE_ASSIST + C.AKEYCODE_BRIGHTNESS_DOWN + C.AKEYCODE_BRIGHTNESS_UP + C.AKEYCODE_RO + C.AKEYCODE_YEN + C.AKEYCODE_ZENKAKU_HANKAKU +*/ diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/app.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/app.go new file mode 100644 index 0000000..d0aaa8e --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/app.go @@ -0,0 +1,166 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build freebsd || linux || darwin || windows || openbsd + +package app + +import ( + "fyne.io/fyne/v2/internal/async" + "fyne.io/fyne/v2/internal/driver/mobile/event/lifecycle" + "fyne.io/fyne/v2/internal/driver/mobile/event/size" + "fyne.io/fyne/v2/internal/driver/mobile/gl" + + // Initialize necessary mobile functionality, such as logging. + _ "fyne.io/fyne/v2/internal/driver/mobile/mobileinit" +) + +// Main is called by the main.main function to run the mobile application. +// +// It calls f on the App, in a separate goroutine, as some OS-specific +// libraries require being on 'the main thread'. +func Main(f func(App)) { + main(f) +} + +// App is how a GUI mobile application interacts with the OS. +type App interface { + // Events returns the events channel. It carries events from the system to + // the app. The type of such events include: + // - lifecycle.Event + // - mouse.Event + // - paint.Event + // - size.Event + // - touch.Event + // from the golang.org/x/mobile/event/etc packages. Other packages may + // define other event types that are carried on this channel. + Events() <-chan any + + // Send sends an event on the events channel. It does not block. + Send(event any) + + // Publish flushes any pending drawing commands, such as OpenGL calls, and + // swaps the back buffer to the screen. + Publish() PublishResult + + // TODO: replace filters (and the Events channel) with a NextEvent method? + + // Filter calls each registered event filter function in sequence. + Filter(event any) any + + // RegisterFilter registers a event filter function to be called by Filter. The + // function can return a different event, or return nil to consume the event, + // but the function can also return its argument unchanged, where its purpose + // is to trigger a side effect rather than modify the event. + RegisterFilter(f func(any) any) + + ShowVirtualKeyboard(KeyboardType) + HideVirtualKeyboard() + ShowFileOpenPicker(func(string, func()), *FileFilter) + ShowFileSavePicker(func(string, func()), *FileFilter, string) +} + +// FileFilter is a filter of files. +type FileFilter struct { + Extensions []string + MimeTypes []string +} + +// PublishResult is the result of an App.Publish call. +type PublishResult struct { + // BackBufferPreserved is whether the contents of the back buffer was + // preserved. If false, the contents are undefined. + BackBufferPreserved bool +} + +var theApp = &app{ + events: async.NewUnboundedChan[any](), + lifecycleStage: lifecycle.StageDead, + publish: make(chan struct{}), + publishResult: make(chan PublishResult), +} + +func init() { + theApp.glctx, theApp.worker = gl.NewContext() +} + +func (a *app) sendLifecycle(to lifecycle.Stage) { + if a.lifecycleStage == to { + return + } + a.events.In() <- lifecycle.Event{ + From: a.lifecycleStage, + To: to, + DrawContext: a.glctx, + } + a.lifecycleStage = to +} + +type app struct { + filters []func(any) any + + events *async.UnboundedChan[any] + lifecycleStage lifecycle.Stage + publish chan struct{} + publishResult chan PublishResult + + glctx gl.Context + worker gl.Worker +} + +func (a *app) Events() <-chan any { + return a.events.Out() +} + +func (a *app) Send(event any) { + a.events.In() <- event +} + +func (a *app) Publish() PublishResult { + // gl.Flush is a lightweight (on modern GL drivers) blocking call + // that ensures all GL functions pending in the gl package have + // been passed onto the GL driver before the app package attempts + // to swap the screen buffer. + // + // This enforces that the final receive (for this paint cycle) on + // gl.WorkAvailable happens before the send on endPaint. + a.glctx.Flush() + a.publish <- struct{}{} + return <-a.publishResult +} + +func (a *app) Filter(event any) any { + for _, f := range a.filters { + event = f(event) + } + return event +} + +func (a *app) RegisterFilter(f func(any) any) { + a.filters = append(a.filters, f) +} + +func (a *app) ShowVirtualKeyboard(keyboard KeyboardType) { + driverShowVirtualKeyboard(keyboard) +} + +func (a *app) HideVirtualKeyboard() { + driverHideVirtualKeyboard() +} + +func (a *app) ShowFileOpenPicker(callback func(string, func()), filter *FileFilter) { + driverShowFileOpenPicker(callback, filter) +} + +func (a *app) ShowFileSavePicker(callback func(string, func()), filter *FileFilter, filename string) { + driverShowFileSavePicker(callback, filter, filename) +} + +func screenOrientation(width, height int) size.Orientation { + if width > height { + return size.OrientationLandscape + } + + return size.OrientationPortrait +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/app_unix.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/app_unix.go new file mode 100644 index 0000000..e7e72b9 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/app_unix.go @@ -0,0 +1,19 @@ +//go:build freebsd || linux || openbsd + +package app + +import "fyne.io/fyne/v2/internal/driver/mobile/event/size" + +// TODO: do this for all build targets, not just linux (x11 and Android)? If +// so, should package gl instead of this package call RegisterFilter?? +// +// TODO: does Android need this?? It seems to work without it (Nexus 7, +// KitKat). If only x11 needs this, should we move this to x11.go?? +func (a *app) registerGLViewportFilter() { + a.RegisterFilter(func(e any) any { + if e, ok := e.(size.Event); ok { + a.glctx.Viewport(0, 0, e.WidthPx, e.HeightPx) + } + return e + }) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/callfn/callfn.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/callfn/callfn.go new file mode 100644 index 0000000..ecc3d45 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/callfn/callfn.go @@ -0,0 +1,16 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build android && (arm || 386 || amd64 || arm64) + +// Package callfn provides an android entry point. +// +// It is a separate package from app because it contains Go assembly, +// which does not compile in a package using cgo. +package callfn + +// CallFn calls a zero-argument function by its program counter. +// It is only intended for calling main.main. Using it for +// anything else will not end well. +func CallFn(fn uintptr) diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/callfn/callfn_386.s b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/callfn/callfn_386.s new file mode 100644 index 0000000..d2bb54f --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/callfn/callfn_386.s @@ -0,0 +1,11 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include "textflag.h" +#include "funcdata.h" + +TEXT ·CallFn(SB),$0-4 + MOVL fn+0(FP), AX + CALL AX + RET diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/callfn/callfn_amd64.s b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/callfn/callfn_amd64.s new file mode 100644 index 0000000..8769604 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/callfn/callfn_amd64.s @@ -0,0 +1,11 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include "textflag.h" +#include "funcdata.h" + +TEXT ·CallFn(SB),$0-8 + MOVQ fn+0(FP), AX + CALL AX + RET diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/callfn/callfn_arm.s b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/callfn/callfn_arm.s new file mode 100644 index 0000000..d71f748 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/callfn/callfn_arm.s @@ -0,0 +1,11 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include "textflag.h" +#include "funcdata.h" + +TEXT ·CallFn(SB),$0-4 + MOVW fn+0(FP), R0 + BL (R0) + RET diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/callfn/callfn_arm64.s b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/callfn/callfn_arm64.s new file mode 100644 index 0000000..545ad50 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/callfn/callfn_arm64.s @@ -0,0 +1,11 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include "textflag.h" +#include "funcdata.h" + +TEXT ·CallFn(SB),$0-8 + MOVD fn+0(FP), R0 + BL (R0) + RET diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/darwin_desktop.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/darwin_desktop.go new file mode 100644 index 0000000..0ca9b85 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/darwin_desktop.go @@ -0,0 +1,414 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build darwin && !ios + +package app + +// Simple on-screen app debugging for OS X. Not an officially supported +// development target for apps, as screens with mice are very different +// than screens with touch panels. + +/* +#cgo CFLAGS: -x objective-c -DGL_SILENCE_DEPRECATION +#cgo LDFLAGS: -framework Cocoa -framework OpenGL +#import // for HIToolbox/Events.h +#import +#include + +void runApp(void); +void stopApp(void); +void makeCurrentContext(GLintptr); +uint64 threadID(); +*/ +import "C" + +import ( + "log" + "runtime" + + "fyne.io/fyne/v2/internal/driver/mobile/event/key" + "fyne.io/fyne/v2/internal/driver/mobile/event/lifecycle" + "fyne.io/fyne/v2/internal/driver/mobile/event/paint" + "fyne.io/fyne/v2/internal/driver/mobile/event/size" + "fyne.io/fyne/v2/internal/driver/mobile/event/touch" +) + +var initThreadID uint64 + +func init() { + // Lock the goroutine responsible for initialization to an OS thread. + // This means the goroutine running main (and calling runApp below) + // is locked to the OS thread that started the program. This is + // necessary for the correct delivery of Cocoa events to the process. + // + // A discussion on this topic: + // https://groups.google.com/forum/#!msg/golang-nuts/IiWZ2hUuLDA/SNKYYZBelsYJ + runtime.LockOSThread() + initThreadID = uint64(C.threadID()) +} + +func main(f func(App)) { + if tid := uint64(C.threadID()); tid != initThreadID { + log.Fatalf("app.Main called on thread %d, but app.init ran on %d", tid, initThreadID) + } + + go func() { + f(theApp) + C.stopApp() + // TODO(crawshaw): trigger runApp to return + }() + + C.runApp() +} + +func GoBack() { + // When simulating mobile there are no other activities open (and we can't just force background) +} + +// loop is the primary drawing loop. +// +// After Cocoa has captured the initial OS thread for processing Cocoa +// events in runApp, it starts loop on another goroutine. It is locked +// to an OS thread for its OpenGL context. +// +// The loop processes GL calls until a publish event appears. +// Then it runs any remaining GL calls and flushes the screen. +// +// As NSOpenGLCPSwapInterval is set to 1, the call to CGLFlushDrawable +// blocks until the screen refresh. +func (a *app) loop(ctx C.GLintptr) { + runtime.LockOSThread() + C.makeCurrentContext(ctx) + + workAvailable := a.worker.WorkAvailable() + + for { + select { + case <-workAvailable: + a.worker.DoWork() + case <-theApp.publish: + loop1: + for { + select { + case <-workAvailable: + a.worker.DoWork() + default: + break loop1 + } + } + C.CGLFlushDrawable(C.CGLGetCurrentContext()) + theApp.publishResult <- PublishResult{} + select { + case drawDone <- struct{}{}: + default: + } + } + } +} + +var drawDone = make(chan struct{}) + +// drawgl is used by Cocoa to occasionally request screen updates. +// +//export drawgl +func drawgl() { + switch theApp.lifecycleStage { + case lifecycle.StageFocused, lifecycle.StageVisible: + theApp.Send(paint.Event{ + External: true, + }) + <-drawDone + } +} + +//export startloop +func startloop(ctx C.GLintptr) { + go theApp.loop(ctx) +} + +var windowHeightPx float32 + +//export setGeom +func setGeom(pixelsPerPt float32, widthPx, heightPx int) { + windowHeightPx = float32(heightPx) + theApp.events.In() <- size.Event{ + WidthPx: widthPx, + HeightPx: heightPx, + WidthPt: float32(widthPx) / pixelsPerPt, + HeightPt: float32(heightPx) / pixelsPerPt, + PixelsPerPt: pixelsPerPt, + Orientation: screenOrientation(widthPx, heightPx), + } +} + +func sendTouch(t touch.Type, x, y float32) { + theApp.events.In() <- touch.Event{ + X: x, + Y: windowHeightPx - y, + Sequence: 0, + Type: t, + } +} + +//export eventMouseDown +func eventMouseDown(x, y float32) { sendTouch(touch.TypeBegin, x, y) } + +//export eventMouseDragged +func eventMouseDragged(x, y float32) { sendTouch(touch.TypeMove, x, y) } + +//export eventMouseEnd +func eventMouseEnd(x, y float32) { sendTouch(touch.TypeEnd, x, y) } + +var stopped = false + +//export lifecycleDead +func lifecycleDead() { + if stopped { + return + } + stopped = true + + theApp.sendLifecycle(lifecycle.StageDead) + theApp.events.Close() +} + +//export eventKey +func eventKey(runeVal int32, direction uint8, code uint16, flags uint32) { + var modifiers key.Modifiers + for _, mod := range mods { + if flags&mod.flags == mod.flags { + modifiers |= mod.mod + } + } + + theApp.events.In() <- key.Event{ + Rune: convRune(rune(runeVal)), + Code: convVirtualKeyCode(code), + Modifiers: modifiers, + Direction: key.Direction(direction), + } +} + +//export eventFlags +func eventFlags(flags uint32) { + for _, mod := range mods { + if flags&mod.flags == mod.flags && lastFlags&mod.flags != mod.flags { + eventKey(-1, uint8(key.DirPress), mod.code, flags) + } + if lastFlags&mod.flags == mod.flags && flags&mod.flags != mod.flags { + eventKey(-1, uint8(key.DirRelease), mod.code, flags) + } + } + lastFlags = flags +} + +var lastFlags uint32 + +var mods = [...]struct { + flags uint32 + code uint16 + mod key.Modifiers +}{ + // Left and right variants of modifier keys have their own masks, + // but they are not documented. These were determined empirically. + {1<<17 | 0x102, C.kVK_Shift, key.ModShift}, + {1<<17 | 0x104, C.kVK_RightShift, key.ModShift}, + {1<<18 | 0x101, C.kVK_Control, key.ModControl}, + // TODO key.ControlRight + {1<<19 | 0x120, C.kVK_Option, key.ModAlt}, + {1<<19 | 0x140, C.kVK_RightOption, key.ModAlt}, + {1<<20 | 0x108, C.kVK_Command, key.ModMeta}, + {1<<20 | 0x110, C.kVK_Command, key.ModMeta}, // TODO: missing kVK_RightCommand +} + +//export lifecycleAlive +func lifecycleAlive() { theApp.sendLifecycle(lifecycle.StageAlive) } + +//export lifecycleVisible +func lifecycleVisible() { + theApp.sendLifecycle(lifecycle.StageVisible) +} + +//export lifecycleFocused +func lifecycleFocused() { theApp.sendLifecycle(lifecycle.StageFocused) } + +// driverShowVirtualKeyboard does nothing on desktop +func driverShowVirtualKeyboard(KeyboardType) { +} + +// driverHideVirtualKeyboard does nothing on desktop +func driverHideVirtualKeyboard() { +} + +// driverShowFileOpenPicker does nothing on desktop +func driverShowFileOpenPicker(func(string, func()), *FileFilter) { +} + +// driverShowFileSavePicker does nothing on desktop +func driverShowFileSavePicker(func(string, func()), *FileFilter, string) { +} + +// convRune marks the Carbon/Cocoa private-range unicode rune representing +// a non-unicode key event to -1, used for Rune in the key package. +// +// http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/CORPCHAR.TXT +func convRune(r rune) rune { + if '\uE000' <= r && r <= '\uF8FF' { + return -1 + } + return r +} + +var virtualKeyCodeMap = map[uint16]key.Code{ + C.kVK_ANSI_A: key.CodeA, + C.kVK_ANSI_B: key.CodeB, + C.kVK_ANSI_C: key.CodeC, + C.kVK_ANSI_D: key.CodeD, + C.kVK_ANSI_E: key.CodeE, + C.kVK_ANSI_F: key.CodeF, + C.kVK_ANSI_G: key.CodeG, + C.kVK_ANSI_H: key.CodeH, + C.kVK_ANSI_I: key.CodeI, + C.kVK_ANSI_J: key.CodeJ, + C.kVK_ANSI_K: key.CodeK, + C.kVK_ANSI_L: key.CodeL, + C.kVK_ANSI_M: key.CodeM, + C.kVK_ANSI_N: key.CodeN, + C.kVK_ANSI_O: key.CodeO, + C.kVK_ANSI_P: key.CodeP, + C.kVK_ANSI_Q: key.CodeQ, + C.kVK_ANSI_R: key.CodeR, + C.kVK_ANSI_S: key.CodeS, + C.kVK_ANSI_T: key.CodeT, + C.kVK_ANSI_U: key.CodeU, + C.kVK_ANSI_V: key.CodeV, + C.kVK_ANSI_W: key.CodeW, + C.kVK_ANSI_X: key.CodeX, + C.kVK_ANSI_Y: key.CodeY, + C.kVK_ANSI_Z: key.CodeZ, + C.kVK_ANSI_1: key.Code1, + C.kVK_ANSI_2: key.Code2, + C.kVK_ANSI_3: key.Code3, + C.kVK_ANSI_4: key.Code4, + C.kVK_ANSI_5: key.Code5, + C.kVK_ANSI_6: key.Code6, + C.kVK_ANSI_7: key.Code7, + C.kVK_ANSI_8: key.Code8, + C.kVK_ANSI_9: key.Code9, + C.kVK_ANSI_0: key.Code0, + // TODO: move the rest of these codes to constants in key.go + // if we are happy with them. + C.kVK_Return: key.CodeReturnEnter, + C.kVK_Escape: key.CodeEscape, + C.kVK_Delete: key.CodeDeleteBackspace, + C.kVK_Tab: key.CodeTab, + C.kVK_Space: key.CodeSpacebar, + C.kVK_ANSI_Minus: key.CodeHyphenMinus, + C.kVK_ANSI_Equal: key.CodeEqualSign, + C.kVK_ANSI_LeftBracket: key.CodeLeftSquareBracket, + C.kVK_ANSI_RightBracket: key.CodeRightSquareBracket, + C.kVK_ANSI_Backslash: key.CodeBackslash, + // 50: Keyboard Non-US "#" and ~ + C.kVK_ANSI_Semicolon: key.CodeSemicolon, + C.kVK_ANSI_Quote: key.CodeApostrophe, + C.kVK_ANSI_Grave: key.CodeGraveAccent, + C.kVK_ANSI_Comma: key.CodeComma, + C.kVK_ANSI_Period: key.CodeFullStop, + C.kVK_ANSI_Slash: key.CodeSlash, + C.kVK_CapsLock: key.CodeCapsLock, + C.kVK_F1: key.CodeF1, + C.kVK_F2: key.CodeF2, + C.kVK_F3: key.CodeF3, + C.kVK_F4: key.CodeF4, + C.kVK_F5: key.CodeF5, + C.kVK_F6: key.CodeF6, + C.kVK_F7: key.CodeF7, + C.kVK_F8: key.CodeF8, + C.kVK_F9: key.CodeF9, + C.kVK_F10: key.CodeF10, + C.kVK_F11: key.CodeF11, + C.kVK_F12: key.CodeF12, + // 70: PrintScreen + // 71: Scroll Lock + // 72: Pause + // 73: Insert + C.kVK_Home: key.CodeHome, + C.kVK_PageUp: key.CodePageUp, + C.kVK_ForwardDelete: key.CodeDeleteForward, + C.kVK_End: key.CodeEnd, + C.kVK_PageDown: key.CodePageDown, + C.kVK_RightArrow: key.CodeRightArrow, + C.kVK_LeftArrow: key.CodeLeftArrow, + C.kVK_DownArrow: key.CodeDownArrow, + C.kVK_UpArrow: key.CodeUpArrow, + C.kVK_ANSI_KeypadClear: key.CodeKeypadNumLock, + C.kVK_ANSI_KeypadDivide: key.CodeKeypadSlash, + C.kVK_ANSI_KeypadMultiply: key.CodeKeypadAsterisk, + C.kVK_ANSI_KeypadMinus: key.CodeKeypadHyphenMinus, + C.kVK_ANSI_KeypadPlus: key.CodeKeypadPlusSign, + C.kVK_ANSI_KeypadEnter: key.CodeKeypadEnter, + C.kVK_ANSI_Keypad1: key.CodeKeypad1, + C.kVK_ANSI_Keypad2: key.CodeKeypad2, + C.kVK_ANSI_Keypad3: key.CodeKeypad3, + C.kVK_ANSI_Keypad4: key.CodeKeypad4, + C.kVK_ANSI_Keypad5: key.CodeKeypad5, + C.kVK_ANSI_Keypad6: key.CodeKeypad6, + C.kVK_ANSI_Keypad7: key.CodeKeypad7, + C.kVK_ANSI_Keypad8: key.CodeKeypad8, + C.kVK_ANSI_Keypad9: key.CodeKeypad9, + C.kVK_ANSI_Keypad0: key.CodeKeypad0, + C.kVK_ANSI_KeypadDecimal: key.CodeKeypadFullStop, + C.kVK_ANSI_KeypadEquals: key.CodeKeypadEqualSign, + C.kVK_F13: key.CodeF13, + C.kVK_F14: key.CodeF14, + C.kVK_F15: key.CodeF15, + C.kVK_F16: key.CodeF16, + C.kVK_F17: key.CodeF17, + C.kVK_F18: key.CodeF18, + C.kVK_F19: key.CodeF19, + C.kVK_F20: key.CodeF20, + // 116: Keyboard Execute + C.kVK_Help: key.CodeHelp, + // 118: Keyboard Menu + // 119: Keyboard Select + // 120: Keyboard Stop + // 121: Keyboard Again + // 122: Keyboard Undo + // 123: Keyboard Cut + // 124: Keyboard Copy + // 125: Keyboard Paste + // 126: Keyboard Find + C.kVK_Mute: key.CodeMute, + C.kVK_VolumeUp: key.CodeVolumeUp, + C.kVK_VolumeDown: key.CodeVolumeDown, + // 130: Keyboard Locking Caps Lock + // 131: Keyboard Locking Num Lock + // 132: Keyboard Locking Scroll Lock + // 133: Keyboard Comma + // 134: Keyboard Equal Sign + // ...: Bunch of stuff + C.kVK_Control: key.CodeLeftControl, + C.kVK_Shift: key.CodeLeftShift, + C.kVK_Option: key.CodeLeftAlt, + C.kVK_Command: key.CodeLeftGUI, + C.kVK_RightControl: key.CodeRightControl, + C.kVK_RightShift: key.CodeRightShift, + C.kVK_RightOption: key.CodeRightAlt, +} + +// convVirtualKeyCode converts a Carbon/Cocoa virtual key code number +// into the standard keycodes used by the key package. +// +// To get a sense of the key map, see the diagram on +// +// http://boredzo.org/blog/archives/2007-05-22/virtual-key-codes +func convVirtualKeyCode(vkcode uint16) key.Code { + if code, ok := virtualKeyCodeMap[vkcode]; ok { + return code + } + + // TODO key.CodeRightGUI + return key.CodeUnknown +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/darwin_desktop.m b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/darwin_desktop.m new file mode 100644 index 0000000..ab97f10 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/darwin_desktop.m @@ -0,0 +1,244 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build darwin && !ios + +#include "_cgo_export.h" +#include +#include + +#import +#import +#import + +void makeCurrentContext(GLintptr context) { + NSOpenGLContext* ctx = (NSOpenGLContext*)context; + [ctx makeCurrentContext]; +} + +uint64 threadID() { + uint64 id; + if (pthread_threadid_np(pthread_self(), &id)) { + abort(); + } + return id; +} + +@interface MobileGLView : NSOpenGLView +{ +} +@end + +@implementation MobileGLView +- (void)prepareOpenGL { + [super prepareOpenGL]; + [self setWantsBestResolutionOpenGLSurface:YES]; + GLint swapInt = 1; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + [[self openGLContext] setValues:&swapInt forParameter:NSOpenGLCPSwapInterval]; +#pragma clang diagnostic pop + + // Using attribute arrays in OpenGL 3.3 requires the use of a VBA. + // But VBAs don't exist in ES 2. So we bind a default one. + GLuint vba; + glGenVertexArrays(1, &vba); + glBindVertexArray(vba); + + startloop((GLintptr)[self openGLContext]); +} + +- (void)reshape { + [super reshape]; + + // Calculate screen PPI. + // + // Note that the backingScaleFactor converts from logical + // pixels to actual pixels, but both of these units vary + // independently from real world size. E.g. + // + // 13" Retina Macbook Pro, 2560x1600, 227ppi, backingScaleFactor=2, scale=3.15 + // 15" Retina Macbook Pro, 2880x1800, 220ppi, backingScaleFactor=2, scale=3.06 + // 27" iMac, 2560x1440, 109ppi, backingScaleFactor=1, scale=1.51 + // 27" Retina iMac, 5120x2880, 218ppi, backingScaleFactor=2, scale=3.03 + NSScreen *screen = [NSScreen mainScreen]; + double screenPixW = [screen frame].size.width * [screen backingScaleFactor]; + + CGDirectDisplayID display = (CGDirectDisplayID)[[[screen deviceDescription] valueForKey:@"NSScreenNumber"] intValue]; + CGSize screenSizeMM = CGDisplayScreenSize(display); // in millimeters + float ppi = 25.4 * screenPixW / screenSizeMM.width; + float pixelsPerPt = ppi/72.0; + + // The width and height reported to the geom package are the + // bounds of the OpenGL view. Several steps are necessary. + // First, [self bounds] gives us the number of logical pixels + // in the view. Multiplying this by the backingScaleFactor + // gives us the number of actual pixels. + NSRect r = [self bounds]; + int w = r.size.width * [screen backingScaleFactor]; + int h = r.size.height * [screen backingScaleFactor]; + + setGeom(pixelsPerPt, w, h); +} + +- (void)drawRect:(NSRect)theRect { + // Called during resize. This gets rid of flicker when resizing. + drawgl(); +} + +- (void)mouseDown:(NSEvent *)theEvent { + double scale = [[NSScreen mainScreen] backingScaleFactor]; + NSPoint p = [theEvent locationInWindow]; + eventMouseDown(p.x * scale, p.y * scale); +} + +- (void)mouseUp:(NSEvent *)theEvent { + double scale = [[NSScreen mainScreen] backingScaleFactor]; + NSPoint p = [theEvent locationInWindow]; + eventMouseEnd(p.x * scale, p.y * scale); +} + +- (void)mouseDragged:(NSEvent *)theEvent { + double scale = [[NSScreen mainScreen] backingScaleFactor]; + NSPoint p = [theEvent locationInWindow]; + eventMouseDragged(p.x * scale, p.y * scale); +} + +- (void)windowDidBecomeKey:(NSNotification *)notification { + lifecycleFocused(); +} + +- (void)windowDidResignKey:(NSNotification *)notification { + if (![NSApp isHidden]) { + lifecycleVisible(); + } +} + +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { + lifecycleAlive(); + [[NSRunningApplication currentApplication] activateWithOptions:(NSApplicationActivateAllWindows | NSApplicationActivateIgnoringOtherApps)]; + [self.window makeKeyAndOrderFront:self]; + lifecycleVisible(); +} + +- (void)applicationWillTerminate:(NSNotification *)aNotification { + lifecycleDead(); +} + +- (void)applicationDidHide:(NSNotification *)aNotification { + lifecycleAlive(); +} + +- (void)applicationWillUnhide:(NSNotification *)notification { + lifecycleVisible(); +} + +- (void)windowWillClose:(NSNotification *)notification { + lifecycleDead(); +} + +- (BOOL)acceptsFirstResponder { + return true; +} + +- (void)keyDown:(NSEvent *)theEvent { + [self key:theEvent]; +} +- (void)keyUp:(NSEvent *)theEvent { + [self key:theEvent]; +} +- (void)key:(NSEvent *)theEvent { + NSRange range = [theEvent.characters rangeOfComposedCharacterSequenceAtIndex:0]; + + uint8_t buf[4] = {0, 0, 0, 0}; + if (![theEvent.characters getBytes:buf + maxLength:4 + usedLength:nil + encoding:NSUTF32LittleEndianStringEncoding + options:NSStringEncodingConversionAllowLossy + range:range + remainingRange:nil]) { + NSLog(@"failed to read key event %@", theEvent); + return; + } + + uint32_t rune = (uint32_t)buf[0]<<0 | (uint32_t)buf[1]<<8 | (uint32_t)buf[2]<<16 | (uint32_t)buf[3]<<24; + + uint8_t direction; + if ([theEvent isARepeat]) { + direction = 0; + } else if (theEvent.type == NSEventTypeKeyDown) { + direction = 1; + } else { + direction = 2; + } + eventKey((int32_t)rune, direction, theEvent.keyCode, theEvent.modifierFlags); +} + +- (void)flagsChanged:(NSEvent *)theEvent { + eventFlags(theEvent.modifierFlags); +} +@end + +void +runApp(void) { + [NSAutoreleasePool new]; + [NSApplication sharedApplication]; + [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular]; + + id menuBar = [[NSMenu new] autorelease]; + id menuItem = [[NSMenuItem new] autorelease]; + [menuBar addItem:menuItem]; + [NSApp setMainMenu:menuBar]; + + id menu = [[NSMenu new] autorelease]; + id name = [[NSProcessInfo processInfo] processName]; + + id hideMenuItem = [[[NSMenuItem alloc] initWithTitle:@"Hide" + action:@selector(hide:) keyEquivalent:@"h"] + autorelease]; + [menu addItem:hideMenuItem]; + + id quitMenuItem = [[[NSMenuItem alloc] initWithTitle:@"Quit" + action:@selector(terminate:) keyEquivalent:@"q"] + autorelease]; + [menu addItem:quitMenuItem]; + [menuItem setSubmenu:menu]; + + NSRect rect = NSMakeRect(0, 0, 600, 800); + + NSWindow* window = [[[NSWindow alloc] initWithContentRect:rect + styleMask:NSWindowStyleMaskTitled + backing:NSBackingStoreBuffered + defer:NO] + autorelease]; + window.styleMask |= NSWindowStyleMaskResizable; + window.styleMask |= NSWindowStyleMaskMiniaturizable; + window.styleMask |= NSWindowStyleMaskClosable; + window.title = name; + [window cascadeTopLeftFromPoint:NSMakePoint(20,20)]; + + NSOpenGLPixelFormatAttribute attr[] = { + NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core, + NSOpenGLPFAColorSize, 24, + NSOpenGLPFAAlphaSize, 8, + NSOpenGLPFADepthSize, 16, + NSOpenGLPFAAccelerated, + NSOpenGLPFADoubleBuffer, + NSOpenGLPFAAllowOfflineRenderers, + 0 + }; + id pixFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attr]; + MobileGLView* view = [[MobileGLView alloc] initWithFrame:rect pixelFormat:pixFormat]; + [window setContentView:view]; + [window setDelegate:view]; + [NSApp setDelegate:view]; + + [NSApp run]; +} + +void stopApp(void) { + [NSApp terminate:nil]; +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/darwin_ios.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/darwin_ios.go new file mode 100644 index 0000000..c018acf --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/darwin_ios.go @@ -0,0 +1,330 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build darwin && ios + +package app + +/* +#cgo CFLAGS: -x objective-c -DGL_SILENCE_DEPRECATION +#cgo LDFLAGS: -framework Foundation -framework UIKit -framework MobileCoreServices -framework GLKit -framework OpenGLES -framework QuartzCore -framework UserNotifications +#include +#include +#include +#include +#include +#import + +extern struct utsname sysInfo; + +void runApp(void); +void makeCurrentContext(GLintptr ctx); +void swapBuffers(GLintptr ctx); +uint64_t threadID(); + +UIEdgeInsets getDevicePadding(); +bool isDark(); +void showKeyboard(int keyboardType); +void hideKeyboard(); + +void showFileOpenPicker(char* mimes, char *exts); +void showFileSavePicker(char* mimes, char *exts); +void closeFileResource(void* urlPtr); +*/ +import "C" + +import ( + "log" + "runtime" + "strings" + "time" + "unsafe" + + "fyne.io/fyne/v2/internal/driver/mobile/event/lifecycle" + "fyne.io/fyne/v2/internal/driver/mobile/event/paint" + "fyne.io/fyne/v2/internal/driver/mobile/event/size" + "fyne.io/fyne/v2/internal/driver/mobile/event/touch" +) + +var initThreadID uint64 + +func init() { + // Lock the goroutine responsible for initialization to an OS thread. + // This means the goroutine running main (and calling the run function + // below) is locked to the OS thread that started the program. This is + // necessary for the correct delivery of UIKit events to the process. + // + // A discussion on this topic: + // https://groups.google.com/forum/#!msg/golang-nuts/IiWZ2hUuLDA/SNKYYZBelsYJ + runtime.LockOSThread() + initThreadID = uint64(C.threadID()) +} + +func main(f func(App)) { + //if tid := uint64(C.threadID()); tid != initThreadID { + // log.Fatalf("app.Run called on thread %d, but app.init ran on %d", tid, initThreadID) + //} + + go func() { + f(theApp) + // TODO(crawshaw): trigger runApp to return + }() + C.runApp() + panic("unexpected return from app.runApp") +} + +var ( + pixelsPerPt float32 + screenScale int // [UIScreen mainScreen].scale, either 1, 2, or 3. +) + +var DisplayMetrics struct { + WidthPx int + HeightPx int +} + +func GoBack() { + // Apple do not permit apps to exit in any way other than user pressing home button / gesture +} + +//export setDisplayMetrics +func setDisplayMetrics(width, height int, scale int) { + DisplayMetrics.WidthPx = width + DisplayMetrics.HeightPx = height +} + +//export setScreen +func setScreen(scale int) { + C.uname(&C.sysInfo) + name := C.GoString(&C.sysInfo.machine[0]) + + var v float32 + + switch { + case strings.HasPrefix(name, "iPhone"): + v = 163 + case strings.HasPrefix(name, "iPad"): + // TODO: is there a better way to distinguish the iPad Mini? + switch name { + case "iPad2,5", "iPad2,6", "iPad2,7", "iPad4,4", "iPad4,5", "iPad4,6", "iPad4,7": + v = 163 // iPad Mini + default: + v = 132 + } + default: + v = 163 // names like i386 and x86_64 are the simulator + } + + if v == 0 { + log.Printf("unknown machine: %s", name) + v = 163 // emergency fallback + } + + pixelsPerPt = v * float32(scale) / 72 + screenScale = scale +} + +//export updateConfig +func updateConfig(width, height, orientation int32) { + o := size.OrientationUnknown + switch orientation { + case C.UIDeviceOrientationPortrait, C.UIDeviceOrientationPortraitUpsideDown: + o = size.OrientationPortrait + case C.UIDeviceOrientationLandscapeLeft, C.UIDeviceOrientationLandscapeRight: + o = size.OrientationLandscape + width, height = height, width + } + insets := C.getDevicePadding() + + theApp.events.In() <- size.Event{ + WidthPx: int(width), + HeightPx: int(height), + WidthPt: float32(width) / pixelsPerPt, + HeightPt: float32(height) / pixelsPerPt, + InsetTopPx: int(float32(insets.top) * float32(screenScale)), + InsetBottomPx: int(float32(insets.bottom) * float32(screenScale)), + InsetLeftPx: int(float32(insets.left) * float32(screenScale)), + InsetRightPx: int(float32(insets.right) * float32(screenScale)), + PixelsPerPt: pixelsPerPt, + Orientation: o, + DarkMode: bool(C.isDark()), + } + theApp.events.In() <- paint.Event{External: true} +} + +// touchIDs is the current active touches. The position in the array +// is the ID, the value is the UITouch* pointer value. +// +// It is widely reported that the iPhone can handle up to 5 simultaneous +// touch events, while the iPad can handle 11. +var touchIDs [11]uintptr + +//export sendTouch +func sendTouch(cTouch, cTouchType uintptr, x, y float32) { + id := -1 + for i, val := range touchIDs { + if val == cTouch { + id = i + break + } + } + if id == -1 { + for i, val := range touchIDs { + if val == 0 { + touchIDs[i] = cTouch + id = i + break + } + } + if id == -1 { + panic("out of touchIDs") + } + } + + t := touch.Type(cTouchType) + if t == touch.TypeEnd { + // Clear all touchIDs when touch ends. The UITouch pointers are unique + // at every multi-touch event. See: + // https://github.com/fyne-io/fyne/issues/2407 + // https://developer.apple.com/documentation/uikit/touches_presses_and_gestures?language=objc + for idx := range touchIDs { + touchIDs[idx] = 0 + } + } + + theApp.events.In() <- touch.Event{ + X: x, + Y: y, + Sequence: touch.Sequence(id), + Type: t, + } +} + +//export lifecycleDead +func lifecycleDead() { theApp.sendLifecycle(lifecycle.StageDead) } + +//export lifecycleAlive +func lifecycleAlive() { theApp.sendLifecycle(lifecycle.StageAlive) } + +//export lifecycleVisible +func lifecycleVisible() { theApp.sendLifecycle(lifecycle.StageVisible) } + +//export lifecycleFocused +func lifecycleFocused() { theApp.sendLifecycle(lifecycle.StageFocused) } + +//export lifecycleMemoryWarning +func lifecycleMemoryWarning() { + cleanCaches() +} + +//export drawloop +func drawloop() { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + for workAvailable := theApp.worker.WorkAvailable(); ; { + select { + case <-workAvailable: + theApp.worker.DoWork() + case <-theApp.publish: + theApp.publishResult <- PublishResult{} + return + case <-time.After(100 * time.Millisecond): // in case the method blocked!! + return + } + } +} + +//export startloop +func startloop(ctx C.GLintptr) { + go theApp.loop(ctx) +} + +// loop is the primary drawing loop. +// +// After UIKit has captured the initial OS thread for processing UIKit +// events in runApp, it starts loop on another goroutine. It is locked +// to an OS thread for its OpenGL context. +func (a *app) loop(ctx C.GLintptr) { + runtime.LockOSThread() + C.makeCurrentContext(ctx) + + workAvailable := a.worker.WorkAvailable() + + for { + select { + case <-workAvailable: + a.worker.DoWork() + case <-theApp.publish: + loop1: + for { + select { + case <-workAvailable: + a.worker.DoWork() + default: + break loop1 + } + } + C.swapBuffers(ctx) + theApp.publishResult <- PublishResult{} + } + } +} + +func cStringsForFilter(filter *FileFilter) (*C.char, *C.char) { + mimes := strings.Join(filter.MimeTypes, "|") + + // extensions must have the '.' removed for UTI lookups on iOS + extList := []string{} + for _, ext := range filter.Extensions { + extList = append(extList, ext[1:]) + } + exts := strings.Join(extList, "|") + + return C.CString(mimes), C.CString(exts) +} + +// driverShowVirtualKeyboard requests the driver to show a virtual keyboard for text input +func driverShowVirtualKeyboard(keyboard KeyboardType) { + C.showKeyboard(C.int(int32(keyboard))) +} + +// driverHideVirtualKeyboard requests the driver to hide any visible virtual keyboard +func driverHideVirtualKeyboard() { + C.hideKeyboard() +} + +var fileCallback func(string, func()) + +//export filePickerReturned +func filePickerReturned(str *C.char, urlPtr unsafe.Pointer) { + if fileCallback == nil { + return + } + + fileCallback(C.GoString(str), func() { + C.closeFileResource(urlPtr) + }) + fileCallback = nil +} + +func driverShowFileOpenPicker(callback func(string, func()), filter *FileFilter) { + fileCallback = callback + + mimeStr, extStr := cStringsForFilter(filter) + defer C.free(unsafe.Pointer(mimeStr)) + defer C.free(unsafe.Pointer(extStr)) + + C.showFileOpenPicker(mimeStr, extStr) +} + +func driverShowFileSavePicker(callback func(string, func()), filter *FileFilter, filename string) { + fileCallback = callback + + mimeStr, extStr := cStringsForFilter(filter) + defer C.free(unsafe.Pointer(mimeStr)) + defer C.free(unsafe.Pointer(extStr)) + + C.showFileSavePicker(mimeStr, extStr) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/darwin_ios.m b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/darwin_ios.m new file mode 100644 index 0000000..bfdfbde --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/darwin_ios.m @@ -0,0 +1,434 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build darwin && ios + +#include "_cgo_export.h" +#include +#include +#include + +#import +#import +#import +#import + +struct utsname sysInfo; + +static CGFloat keyboardHeight; + +@interface GoAppAppController : GLKViewController +@end + +@interface GoInputView : UITextField +@end + +@interface GoAppAppDelegate : UIResponder +@property (strong, nonatomic) UIWindow *window; +@property (strong, nonatomic) GoAppAppController *controller; +@end + +@implementation GoAppAppDelegate +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + int scale = 1; + if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)]) { + scale = (int)[UIScreen mainScreen].scale; // either 1.0, 2.0, or 3.0. + } + CGSize size = [UIScreen mainScreen].nativeBounds.size; + setDisplayMetrics((int)size.width, (int)size.height, scale); + + lifecycleAlive(); + self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; + self.controller = [[GoAppAppController alloc] initWithNibName:nil bundle:nil]; + self.window.rootViewController = self.controller; + [self.window makeKeyAndVisible]; + + // update insets once key window is set + UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; + updateConfig((int)size.width, (int)size.height, orientation); + + UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; + center.delegate = (id) self; + + return YES; +} + +- (void)applicationDidBecomeActive:(UIApplication * )application { + lifecycleFocused(); +} + +- (void)applicationWillResignActive:(UIApplication *)application { + lifecycleVisible(); +} + +- (void)applicationDidEnterBackground:(UIApplication *)application { + lifecycleAlive(); +} + +- (void)applicationWillTerminate:(UIApplication *)application { + lifecycleDead(); +} + +- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application { + lifecycleMemoryWarning(); +} + +- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray *)urls { + if ([urls count] == 0) { + return; + } + + NSURL* url = urls[0]; + NSURL* toClose = NULL; + BOOL secured = [url startAccessingSecurityScopedResource]; + if (secured) { + toClose = url; + } + + filePickerReturned((char*)[[url description] UTF8String], toClose); +} + +- (void)documentPickerWasCancelled:(UIDocumentPickerViewController *)controller { + filePickerReturned("", NULL); +} + +- (void)userNotificationCenter:(UNUserNotificationCenter *)center + willPresentNotification:(UNNotification *)notification + withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler { + completionHandler(UNNotificationPresentationOptionAlert); +} +@end + +@interface GoAppAppController () +@property (strong, nonatomic) EAGLContext *context; +@property (strong, nonatomic) GLKView *glview; +@property (strong, nonatomic) GoInputView *inputView; +@end + +@implementation GoAppAppController +- (void)viewWillAppear:(BOOL)animated +{ + // TODO: replace by swapping out GLKViewController for a UIVIewController. + [super viewWillAppear:animated]; + self.paused = YES; + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; +} + +- (void)viewWillDisappear:(BOOL)animated { + [super viewWillDisappear:animated]; + + [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; + [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil]; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; + self.inputView = [[GoInputView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)]; + self.inputView.delegate = self.inputView; + self.inputView.autocapitalizationType = UITextAutocapitalizationTypeNone; + self.inputView.autocorrectionType = UITextAutocorrectionTypeNo; + [self.view addSubview:self.inputView]; + self.glview = (GLKView*)self.view; + self.glview.drawableDepthFormat = GLKViewDrawableDepthFormat24; + self.glview.multipleTouchEnabled = true; // TODO expose setting to user. + self.glview.context = self.context; + self.glview.userInteractionEnabled = YES; + //self.glview.enableSetNeedsDisplay = YES; // only invoked once + + // Do not use the GLKViewController draw loop. + //self.paused = YES; + //self.resumeOnDidBecomeActive = NO; + //self.preferredFramesPerSecond = 0; + + int scale = 1; + if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)]) { + scale = (int)[UIScreen mainScreen].scale; // either 1.0, 2.0, or 3.0. + } + setScreen(scale); + + CGSize size = [UIScreen mainScreen].nativeBounds.size; + UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; + updateConfig((int)size.width, (int)size.height, orientation); + + self.glview.enableSetNeedsDisplay = NO; + CADisplayLink* displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(render:)]; + [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; +} + +- (void)viewWillTransitionToSize:(CGSize)ptSize withTransitionCoordinator:(id)coordinator { + [coordinator animateAlongsideTransition:^(id context) { + // TODO(crawshaw): come up with a plan to handle animations. + } completion:^(id context) { + UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; + CGSize size = [UIScreen mainScreen].nativeBounds.size; + updateConfig((int)size.width, (int)size.height, orientation); + }]; +} + +- (void)render:(CADisplayLink*)displayLink { + [self.glview display]; +} + +- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect { + drawloop(); +} + +#define TOUCH_TYPE_BEGIN 0 // touch.TypeBegin +#define TOUCH_TYPE_MOVE 1 // touch.TypeMove +#define TOUCH_TYPE_END 2 // touch.TypeEnd + +static void sendTouches(int change, NSSet* touches) { + CGFloat scale = [UIScreen mainScreen].nativeScale; + for (UITouch* touch in touches) { + CGPoint p = [touch locationInView:touch.view]; + sendTouch((GoUintptr)touch, (GoUintptr)change, p.x*scale, p.y*scale); + } +} + +- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { + sendTouches(TOUCH_TYPE_BEGIN, touches); +} + +- (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event { + sendTouches(TOUCH_TYPE_MOVE, touches); +} + +- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event { + sendTouches(TOUCH_TYPE_END, touches); +} + +- (void)touchesCanceled:(NSSet*)touches withEvent:(UIEvent*)event { + sendTouches(TOUCH_TYPE_END, touches); +} + +- (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection { + [super traitCollectionDidChange: previousTraitCollection]; + + UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; + CGSize size = [UIScreen mainScreen].nativeBounds.size; + updateConfig((int)size.width, (int)size.height, orientation); +} + +- (void)keyboardWillShow:(NSNotification *)note { + CGSize keyboardSize = [[[note userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size; + keyboardHeight = keyboardSize.height; + + CGSize size = [UIScreen mainScreen].nativeBounds.size; + UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; + updateConfig((int)size.width, (int)size.height, orientation); +} + +- (void)keyboardWillHide:(NSNotification *)note { + keyboardHeight = 0; + + CGSize size = [UIScreen mainScreen].nativeBounds.size; + UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; + updateConfig((int)size.width, (int)size.height, orientation); +} + +@end + +@implementation GoInputView + +- (BOOL)canBecomeFirstResponder { + return YES; +} + +- (void)deleteBackward { + keyboardDelete(); +} + +-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { + keyboardTyped((char *)[string UTF8String]); + return NO; +} + +- (BOOL)textFieldShouldReturn:(UITextField *)textField { + if ([self returnKeyType] != UIReturnKeyDone) { + keyboardTyped("\n"); + return YES; + } + + dispatch_async(dispatch_get_main_queue(), ^{ + [self resignFirstResponder]; + }); + + return NO; +} + +@end + +void runApp(void) { + char * argv[] = {}; + @autoreleasepool { + UIApplicationMain(0, argv, nil, NSStringFromClass([GoAppAppDelegate class])); + } +} + +void makeCurrentContext(GLintptr context) { + EAGLContext* ctx = (EAGLContext*)context; + if (![EAGLContext setCurrentContext:ctx]) { + // TODO(crawshaw): determine how terrible this is. Exit? + NSLog(@"failed to set current context"); + } +} + +void swapBuffers(GLintptr context) { + __block EAGLContext* ctx = (EAGLContext*)context; + dispatch_sync(dispatch_get_main_queue(), ^{ + [EAGLContext setCurrentContext:ctx]; + [ctx presentRenderbuffer:GL_RENDERBUFFER]; + }); +} + +uint64_t threadID() { + uint64_t id; + if (pthread_threadid_np(pthread_self(), &id)) { + abort(); + } + return id; +} + +UIEdgeInsets getDevicePadding() { + if (@available(iOS 11.0, *)) { + UIWindow *window = UIApplication.sharedApplication.keyWindow; + + UIEdgeInsets inset = window.safeAreaInsets; + if (keyboardHeight != 0) { + inset.bottom = keyboardHeight; + } + return inset; + } + + return UIEdgeInsetsZero; +} + +bool isDark() { + UIViewController *rootVC = [[[[UIApplication sharedApplication] delegate] window] rootViewController]; + return rootVC.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark; +} + +#define DEFAULT_KEYBOARD_CODE 0 +#define SINGLELINE_KEYBOARD_CODE 1 +#define NUMBER_KEYBOARD_CODE 2 + +void showKeyboard(int keyboardType) { + GoAppAppDelegate *appDelegate = (GoAppAppDelegate *)[[UIApplication sharedApplication] delegate]; + GoInputView *view = appDelegate.controller.inputView; + + dispatch_async(dispatch_get_main_queue(), ^{ + switch (keyboardType) + { + case DEFAULT_KEYBOARD_CODE: + [view setKeyboardType:UIKeyboardTypeDefault]; + [view setReturnKeyType:UIReturnKeyDefault]; + break; + case SINGLELINE_KEYBOARD_CODE: + [view setKeyboardType:UIKeyboardTypeDefault]; + [view setReturnKeyType:UIReturnKeyDone]; + break; + case NUMBER_KEYBOARD_CODE: + [view setKeyboardType:UIKeyboardTypeNumberPad]; + [view setReturnKeyType:UIReturnKeyDone]; + break; + default: + NSLog(@"unknown keyboard type, use default"); + [view setKeyboardType:UIKeyboardTypeDefault]; + [view setReturnKeyType:UIReturnKeyDefault]; + break; + } + // refresh settings if keyboard is already open + [view reloadInputViews]; + + BOOL ret = [view becomeFirstResponder]; + }); +} + +void hideKeyboard() { + GoAppAppDelegate *appDelegate = (GoAppAppDelegate *)[[UIApplication sharedApplication] delegate]; + GoInputView *view = appDelegate.controller.inputView; + + dispatch_async(dispatch_get_main_queue(), ^{ + [view resignFirstResponder]; + }); +} + +NSMutableArray *docTypesForMimeExts(char *mimes, char *exts) { + NSMutableArray *docTypes = [NSMutableArray array]; + if (mimes != NULL && strlen(mimes) > 0) { + NSString *mimeList = [NSString stringWithUTF8String:mimes]; + + if ([mimeList isEqualToString:@"application/x-directory"]) { + [docTypes addObject:(NSString*)kUTTypeFolder]; + } else { + NSArray *mimeItems = [mimeList componentsSeparatedByString:@"|"]; + + for (NSString *mime in mimeItems) { + NSString *UTI = (NSString *) UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, (CFStringRef)mime, NULL); + + [docTypes addObject:UTI]; + } + } + } else if (exts != NULL && strlen(exts) > 0) { + NSString *extList = [NSString stringWithUTF8String:exts]; + NSArray *extItems = [extList componentsSeparatedByString:@"|"]; + + for (NSString *ext in extItems) { + NSString *UTI = (NSString *) UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (CFStringRef)ext, NULL); + + [docTypes addObject:UTI]; + } + } else { + [docTypes addObject:@"public.data"]; + } + + return docTypes; +} + +void showFileOpenPicker(char* mimes, char *exts) { + GoAppAppDelegate *appDelegate = (GoAppAppDelegate *)[[UIApplication sharedApplication] delegate]; + + NSMutableArray *docTypes = docTypesForMimeExts(mimes, exts); + + UIDocumentPickerViewController *documentPicker = [[UIDocumentPickerViewController alloc] + initWithDocumentTypes:docTypes inMode:UIDocumentPickerModeOpen]; + documentPicker.delegate = (id) appDelegate; + + dispatch_async(dispatch_get_main_queue(), ^{ + [appDelegate.controller presentViewController:documentPicker animated:YES completion:nil]; + }); +} + +void showFileSavePicker(char* mimes, char *exts) { + GoAppAppDelegate *appDelegate = (GoAppAppDelegate *)[[UIApplication sharedApplication] delegate]; + + NSMutableArray *docTypes = docTypesForMimeExts(mimes, exts); + + NSURL *temporaryDirectoryURL = [NSURL fileURLWithPath: NSTemporaryDirectory() isDirectory: YES]; + NSURL *temporaryFileURL = [temporaryDirectoryURL URLByAppendingPathComponent:@"filename"]; + + char* bytes = "\n"; + NSData *data = [NSData dataWithBytes:bytes length:1]; + BOOL ok = [data writeToURL:temporaryFileURL atomically:YES]; + + UIDocumentPickerViewController *documentPicker = [[UIDocumentPickerViewController alloc] + initWithURL:temporaryFileURL inMode:UIDocumentPickerModeMoveToService]; + documentPicker.delegate = (id) appDelegate; + + dispatch_async(dispatch_get_main_queue(), ^{ + [appDelegate.controller presentViewController:documentPicker animated:YES completion:nil]; + }); +} + +void closeFileResource(void* urlPtr) { + if (urlPtr == NULL) { + return; + } + + NSURL* url = (NSURL*) urlPtr; + [url stopAccessingSecurityScopedResource]; +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/doc.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/doc.go new file mode 100644 index 0000000..3ee2181 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/doc.go @@ -0,0 +1,88 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +Package app lets you write portable all-Go apps for Android and iOS. + +There are typically two ways to use Go on Android and iOS. The first +is to write a Go library and use `gomobile bind` to generate language +bindings for Java and Objective-C. Building a library does not +require the app package. The `gomobile bind` command produces output +that you can include in an Android Studio or Xcode project. For more +on language bindings, see https://golang.org/x/mobile/cmd/gobind. + +The second way is to write an app entirely in Go. The APIs are limited +to those that are portable between both Android and iOS, in particular +OpenGL, audio, and other Android NDK-like APIs. An all-Go app should +use this app package to initialize the app, manage its lifecycle, and +receive events. + +# Building apps + +Apps written entirely in Go have a main function, and can be built +with `gomobile build`, which directly produces runnable output for +Android and iOS. + +The gomobile tool can get installed with go get. For reference, see +https://golang.org/x/mobile/cmd/gomobile. + +For detailed instructions and documentation, see +https://golang.org/wiki/Mobile. + +# Event processing in Native Apps + +The Go runtime is initialized on Android when NativeActivity onCreate is +called, and on iOS when the process starts. In both cases, Go init functions +run before the app lifecycle has started. + +An app is expected to call the Main function in main.main. When the function +exits, the app exits. Inside the func passed to Main, call Filter on every +event received, and then switch on its type. Registered filters run when the +event is received, not when it is sent, so that filters run in the same +goroutine as other code that calls OpenGL. + + package main + + import ( + "log" + + "golang.org/x/mobile/app" + "golang.org/x/mobile/event/lifecycle" + "golang.org/x/mobile/event/paint" + ) + + func main() { + app.Main(func(a app.App) { + for e := range a.Events() { + switch e := a.Filter(e).(type) { + case lifecycle.Event: + // ... + case paint.Event: + log.Print("Call OpenGL here.") + a.Publish() + } + } + }) + } + +An event is represented by the any type, so any value can be an event. +Commonly used types include Event types defined by the following +packages: + - golang.org/x/mobile/event/lifecycle + - golang.org/x/mobile/event/mouse + - golang.org/x/mobile/event/paint + - golang.org/x/mobile/event/size + - golang.org/x/mobile/event/touch + +For example, touch.Event is the type that represents touch events. Other +packages may define their own events, and send them on an app's event channel. + +Other packages can also register event filters, e.g. to manage resources in +response to lifecycle events. Such packages should call: + + app.RegisterFilter(etc) + +in an init function inside that package. +*/ +package app // import "fyne.io/fyne/v2/internal/driver/mobile/app" diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/keyboard.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/keyboard.go new file mode 100644 index 0000000..9df0e07 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/keyboard.go @@ -0,0 +1,130 @@ +package app + +import "C" +import "fyne.io/fyne/v2/internal/driver/mobile/event/key" + +// KeyboardType represents the type of a keyboard +type KeyboardType int32 + +const ( + // DefaultKeyboard is the keyboard with default input style and "return" return key + DefaultKeyboard KeyboardType = iota + // SingleLineKeyboard is the keyboard with default input style and "Done" return key + SingleLineKeyboard + // NumberKeyboard is the keyboard with number input style and "Done" return key + NumberKeyboard +) + +//export keyboardTyped +func keyboardTyped(str *C.char) { + for _, r := range C.GoString(str) { + k := key.Event{ + Rune: r, + Code: getCodeFromRune(r), + Direction: key.DirPress, + } + theApp.events.In() <- k + + k.Direction = key.DirRelease + theApp.events.In() <- k + } +} + +//export keyboardDelete +func keyboardDelete() { + theApp.events.In() <- key.Event{ + Code: key.CodeDeleteBackspace, + Direction: key.DirPress, + Rune: '\x00', + } + theApp.events.In() <- key.Event{ + Code: key.CodeDeleteBackspace, + Direction: key.DirRelease, + Rune: '\x00', + } +} + +var codeRune = map[rune]key.Code{ + '0': key.Code0, + '1': key.Code1, + '2': key.Code2, + '3': key.Code3, + '4': key.Code4, + '5': key.Code5, + '6': key.Code6, + '7': key.Code7, + '8': key.Code8, + '9': key.Code9, + 'a': key.CodeA, + 'b': key.CodeB, + 'c': key.CodeC, + 'd': key.CodeD, + 'e': key.CodeE, + 'f': key.CodeF, + 'g': key.CodeG, + 'h': key.CodeH, + 'i': key.CodeI, + 'j': key.CodeJ, + 'k': key.CodeK, + 'l': key.CodeL, + 'm': key.CodeM, + 'n': key.CodeN, + 'o': key.CodeO, + 'p': key.CodeP, + 'q': key.CodeQ, + 'r': key.CodeR, + 's': key.CodeS, + 't': key.CodeT, + 'u': key.CodeU, + 'v': key.CodeV, + 'w': key.CodeW, + 'x': key.CodeX, + 'y': key.CodeY, + 'z': key.CodeZ, + 'A': key.CodeA, + 'B': key.CodeB, + 'C': key.CodeC, + 'D': key.CodeD, + 'E': key.CodeE, + 'F': key.CodeF, + 'G': key.CodeG, + 'H': key.CodeH, + 'I': key.CodeI, + 'J': key.CodeJ, + 'K': key.CodeK, + 'L': key.CodeL, + 'M': key.CodeM, + 'N': key.CodeN, + 'O': key.CodeO, + 'P': key.CodeP, + 'Q': key.CodeQ, + 'R': key.CodeR, + 'S': key.CodeS, + 'T': key.CodeT, + 'U': key.CodeU, + 'V': key.CodeV, + 'W': key.CodeW, + 'X': key.CodeX, + 'Y': key.CodeY, + 'Z': key.CodeZ, + ',': key.CodeComma, + '.': key.CodeFullStop, + ' ': key.CodeSpacebar, + '\n': key.CodeReturnEnter, + '`': key.CodeGraveAccent, + '-': key.CodeHyphenMinus, + '=': key.CodeEqualSign, + '[': key.CodeLeftSquareBracket, + ']': key.CodeRightSquareBracket, + '\\': key.CodeBackslash, + ';': key.CodeSemicolon, + '\'': key.CodeApostrophe, + '/': key.CodeSlash, +} + +func getCodeFromRune(r rune) key.Code { + if code, ok := codeRune[r]; ok { + return code + } + return key.CodeUnknown +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/mobile.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/mobile.go new file mode 100644 index 0000000..d6dbf84 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/mobile.go @@ -0,0 +1,16 @@ +//go:build ios || android + +package app + +import "C" + +import ( + "runtime" + "runtime/debug" +) + +// clean caches - called when the OS wants some memory back +func cleanCaches() { + runtime.GC() + debug.FreeOSMemory() +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/shiny.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/shiny.go new file mode 100644 index 0000000..b2c3afe --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/shiny.go @@ -0,0 +1,33 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build windows + +package app + +import "log" + +func main(f func(a App)) { + log.Fatalln("Running mobile simulation mode does not currently work on Windows.") +} + +func GoBack() { + // When simulating mobile there are no other activities open (and we can't just force background) +} + +// driverShowVirtualKeyboard does nothing on desktop +func driverShowVirtualKeyboard(KeyboardType) { +} + +// driverHideVirtualKeyboard does nothing on desktop +func driverHideVirtualKeyboard() { +} + +// driverShowFileOpenPicker does nothing on desktop +func driverShowFileOpenPicker(func(string, func()), *FileFilter) { +} + +// driverShowFileSavePicker does nothing on desktop +func driverShowFileSavePicker(func(string, func()), *FileFilter, string) { +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/x11.c b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/x11.c new file mode 100644 index 0000000..c83b2fd --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/x11.c @@ -0,0 +1,174 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build (linux && !android) || freebsd || openbsd + +#include "_cgo_export.h" +#include +#include +#include +#include +#include +#include + +static Atom wm_delete_window; + +static Window +new_window(Display *x_dpy, EGLDisplay e_dpy, int w, int h, EGLContext *ctx, EGLSurface *surf) { + static const EGLint attribs[] = { + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, + EGL_SURFACE_TYPE, EGL_WINDOW_BIT, + EGL_BLUE_SIZE, 8, + EGL_GREEN_SIZE, 8, + EGL_RED_SIZE, 8, + EGL_DEPTH_SIZE, 16, + EGL_CONFIG_CAVEAT, EGL_NONE, + EGL_NONE + }; + EGLConfig config; + EGLint num_configs; + if (!eglChooseConfig(e_dpy, attribs, &config, 1, &num_configs)) { + fprintf(stderr, "eglChooseConfig failed\n"); + exit(1); + } + EGLint vid; + if (!eglGetConfigAttrib(e_dpy, config, EGL_NATIVE_VISUAL_ID, &vid)) { + fprintf(stderr, "eglGetConfigAttrib failed\n"); + exit(1); + } + + XVisualInfo visTemplate; + visTemplate.visualid = vid; + int num_visuals; + XVisualInfo *visInfo = XGetVisualInfo(x_dpy, VisualIDMask, &visTemplate, &num_visuals); + if (!visInfo) { + fprintf(stderr, "XGetVisualInfo failed\n"); + exit(1); + } + + Window root = RootWindow(x_dpy, DefaultScreen(x_dpy)); + XSetWindowAttributes attr; + + attr.colormap = XCreateColormap(x_dpy, root, visInfo->visual, AllocNone); + if (!attr.colormap) { + fprintf(stderr, "XCreateColormap failed\n"); + exit(1); + } + + attr.event_mask = StructureNotifyMask | ExposureMask | + ButtonPressMask | ButtonReleaseMask | ButtonMotionMask; + Window win = XCreateWindow( + x_dpy, root, 0, 0, w, h, 0, visInfo->depth, InputOutput, + visInfo->visual, CWColormap | CWEventMask, &attr); + XFree(visInfo); + + XSizeHints sizehints; + sizehints.width = w; + sizehints.height = h; + sizehints.flags = USSize; + XSetNormalHints(x_dpy, win, &sizehints); + XSetStandardProperties(x_dpy, win, "App", "App", None, (char **)NULL, 0, &sizehints); + + static const EGLint ctx_attribs[] = { + EGL_CONTEXT_CLIENT_VERSION, 2, + EGL_NONE + }; + *ctx = eglCreateContext(e_dpy, config, EGL_NO_CONTEXT, ctx_attribs); + if (!*ctx) { + fprintf(stderr, "eglCreateContext failed\n"); + exit(1); + } + *surf = eglCreateWindowSurface(e_dpy, config, win, NULL); + if (!*surf) { + fprintf(stderr, "eglCreateWindowSurface failed\n"); + exit(1); + } + return win; +} + +Display *x_dpy; +EGLDisplay e_dpy; +EGLContext e_ctx; +EGLSurface e_surf; +Window win; + +void +createWindow(void) { + x_dpy = XOpenDisplay(NULL); + if (!x_dpy) { + fprintf(stderr, "XOpenDisplay failed\n"); + exit(1); + } + e_dpy = eglGetDisplay(x_dpy); + if (!e_dpy) { + fprintf(stderr, "eglGetDisplay failed\n"); + exit(1); + } + EGLint e_major, e_minor; + if (!eglInitialize(e_dpy, &e_major, &e_minor)) { + fprintf(stderr, "eglInitialize failed\n"); + exit(1); + } + eglBindAPI(EGL_OPENGL_ES_API); + win = new_window(x_dpy, e_dpy, 600, 800, &e_ctx, &e_surf); + + wm_delete_window = XInternAtom(x_dpy, "WM_DELETE_WINDOW", True); + if (wm_delete_window != None) { + XSetWMProtocols(x_dpy, win, &wm_delete_window, 1); + } + + XMapWindow(x_dpy, win); + if (!eglMakeCurrent(e_dpy, e_surf, e_surf, e_ctx)) { + fprintf(stderr, "eglMakeCurrent failed\n"); + exit(1); + } + + // Window size and DPI should be initialized before starting app. + XEvent ev; + while (1) { + if (XCheckMaskEvent(x_dpy, StructureNotifyMask, &ev) == False) { + continue; + } + if (ev.type == ConfigureNotify) { + onResize(ev.xconfigure.width, ev.xconfigure.height); + break; + } + } +} + +void +processEvents(void) { + while (XPending(x_dpy)) { + XEvent ev; + XNextEvent(x_dpy, &ev); + switch (ev.type) { + case ButtonPress: + onTouchBegin((float)ev.xbutton.x, (float)ev.xbutton.y); + break; + case ButtonRelease: + onTouchEnd((float)ev.xbutton.x, (float)ev.xbutton.y); + break; + case MotionNotify: + onTouchMove((float)ev.xmotion.x, (float)ev.xmotion.y); + break; + case ConfigureNotify: + onResize(ev.xconfigure.width, ev.xconfigure.height); + break; + case ClientMessage: + if (wm_delete_window != None && (Atom)ev.xclient.data.l[0] == wm_delete_window) { + onStop(); + return; + } + break; + } + } +} + +void +swapBuffers(void) { + if (eglSwapBuffers(e_dpy, e_surf) == EGL_FALSE) { + fprintf(stderr, "eglSwapBuffer failed\n"); + exit(1); + } +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/x11.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/x11.go new file mode 100644 index 0000000..ad40c8a --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/app/x11.go @@ -0,0 +1,147 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build (linux && !android) || freebsd || openbsd + +package app + +/* +Simple on-screen app debugging for X11. Not an officially supported +development target for apps, as screens with mice are very different +than screens with touch panels. +*/ + +/* +#cgo LDFLAGS: -lEGL -lGLESv2 -lX11 +#cgo freebsd CFLAGS: -I/usr/local/include/ +#cgo openbsd CFLAGS: -I/usr/X11R6/include/ + +void createWindow(void); +void processEvents(void); +void swapBuffers(void); +*/ +import "C" + +import ( + "runtime" + "time" + + "fyne.io/fyne/v2/internal/driver/mobile/event/lifecycle" + "fyne.io/fyne/v2/internal/driver/mobile/event/paint" + "fyne.io/fyne/v2/internal/driver/mobile/event/size" + "fyne.io/fyne/v2/internal/driver/mobile/event/touch" +) + +func init() { + theApp.registerGLViewportFilter() +} + +func main(f func(App)) { + runtime.LockOSThread() + + workAvailable := theApp.worker.WorkAvailable() + heartbeat := time.NewTicker(time.Second / 60) + + C.createWindow() + + // TODO: send lifecycle events when e.g. the X11 window is iconified or moved off-screen. + theApp.sendLifecycle(lifecycle.StageFocused) + + // TODO: translate X11 expose events to shiny paint events, instead of + // sending this synthetic paint event as a hack. + theApp.events.In() <- paint.Event{} + + donec := make(chan struct{}) + go func() { + f(theApp) + close(donec) + }() + + // TODO: can we get the actual vsync signal? + ticker := time.NewTicker(time.Second / 60) + defer ticker.Stop() + var tc <-chan time.Time + + for { + select { + case <-donec: + return + case <-heartbeat.C: + C.processEvents() + case <-workAvailable: + theApp.worker.DoWork() + case <-theApp.publish: + C.swapBuffers() + tc = ticker.C + case <-tc: + tc = nil + theApp.publishResult <- PublishResult{} + } + } +} + +func GoBack() { + // When simulating mobile there are no other activities open (and we can't just force background) +} + +//export onResize +func onResize(w, h int) { + // TODO(nigeltao): don't assume 72 DPI. DisplayWidth and DisplayWidthMM + // is probably the best place to start looking. + pixelsPerPt := float32(1) + theApp.events.In() <- size.Event{ + WidthPx: w, + HeightPx: h, + WidthPt: float32(w), + HeightPt: float32(h), + PixelsPerPt: pixelsPerPt, + Orientation: screenOrientation(w, h), + } +} + +func sendTouch(t touch.Type, x, y float32) { + theApp.events.In() <- touch.Event{ + X: x, + Y: y, + Sequence: 0, // TODO: button?? + Type: t, + } +} + +//export onTouchBegin +func onTouchBegin(x, y float32) { sendTouch(touch.TypeBegin, x, y) } + +//export onTouchMove +func onTouchMove(x, y float32) { sendTouch(touch.TypeMove, x, y) } + +//export onTouchEnd +func onTouchEnd(x, y float32) { sendTouch(touch.TypeEnd, x, y) } + +var stopped bool + +//export onStop +func onStop() { + if stopped { + return + } + stopped = true + theApp.sendLifecycle(lifecycle.StageDead) + theApp.events.Close() +} + +// driverShowVirtualKeyboard does nothing on desktop +func driverShowVirtualKeyboard(KeyboardType) { +} + +// driverHideVirtualKeyboard does nothing on desktop +func driverHideVirtualKeyboard() { +} + +// driverShowFileOpenPicker does nothing on desktop +func driverShowFileOpenPicker(func(string, func()), *FileFilter) { +} + +// driverShowFileSavePicker does nothing on desktop +func driverShowFileSavePicker(func(string, func()), *FileFilter, string) { +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/canvas.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/canvas.go new file mode 100644 index 0000000..f37a5a7 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/canvas.go @@ -0,0 +1,428 @@ +package mobile + +import ( + "context" + "image" + "math" + "sync" + "time" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/driver/mobile" + "fyne.io/fyne/v2/internal/app" + intdriver "fyne.io/fyne/v2/internal/driver" + "fyne.io/fyne/v2/internal/driver/common" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +var _ fyne.Canvas = (*canvas)(nil) + +type canvas struct { + common.Canvas + content fyne.CanvasObject + device *device + initialized bool + lastTapDown map[int]time.Time + lastTapDownPos map[int]fyne.Position + lastTapDelta map[int]fyne.Delta + menu fyne.CanvasObject + padded bool + scale float32 + size fyne.Size + touched map[int]mobile.Touchable + windowHead fyne.CanvasObject + + dragOffset fyne.Position + dragStart fyne.Position + dragging fyne.Draggable + + onTypedKey func(event *fyne.KeyEvent) + onTypedRune func(rune) + + touchCancelFunc context.CancelFunc + touchCancelLock sync.Mutex + touchLastTapped fyne.CanvasObject + touchTapCount int +} + +func newCanvas(dev fyne.Device) fyne.Canvas { + d, _ := dev.(*device) + ret := &canvas{ + Canvas: common.Canvas{ + OnFocus: d.handleKeyboard, + OnUnfocus: d.hideVirtualKeyboard, + }, + device: d, + lastTapDown: make(map[int]time.Time), + lastTapDownPos: make(map[int]fyne.Position), + lastTapDelta: make(map[int]fyne.Delta), + padded: true, + scale: dev.SystemScaleForWindow(nil), // we don't need a window parameter on mobile, + touched: make(map[int]mobile.Touchable), + } + ret.Initialize(ret, ret.overlayChanged) + return ret +} + +func (c *canvas) Capture() image.Image { + return c.Painter().Capture(c) +} + +func (c *canvas) Content() fyne.CanvasObject { + return c.content +} + +func (c *canvas) InteractiveArea() (fyne.Position, fyne.Size) { + var pos fyne.Position + var size fyne.Size + if c.device == nil { + // running in test mode + size = c.Size() + } else { + safeLeft := float32(c.device.safeLeft) / c.scale + safeTop := float32(c.device.safeTop) / c.scale + safeRight := float32(c.device.safeRight) / c.scale + safeBottom := float32(c.device.safeBottom) / c.scale + pos = fyne.NewPos(safeLeft, safeTop) + size = c.size.SubtractWidthHeight(safeLeft+safeRight, safeTop+safeBottom) + } + if c.windowHeadIsDisplacing() { + offset := c.windowHead.MinSize().Height + pos = pos.AddXY(0, offset) + size = size.SubtractWidthHeight(0, offset) + } + return pos, size +} + +func (c *canvas) MinSize() fyne.Size { + return c.size // TODO check +} + +func (c *canvas) OnTypedKey() func(*fyne.KeyEvent) { + return c.onTypedKey +} + +func (c *canvas) OnTypedRune() func(rune) { + return c.onTypedRune +} + +func (c *canvas) PixelCoordinateForPosition(pos fyne.Position) (int, int) { + return int(pos.X * c.scale), int(pos.Y * c.scale) +} + +func (c *canvas) Resize(size fyne.Size) { + if size == c.size { + return + } + + c.sizeContent(size) +} + +func (c *canvas) Scale() float32 { + return c.scale +} + +func (c *canvas) SetContent(content fyne.CanvasObject) { + c.setContent(content) + c.sizeContent(c.Size()) // fixed window size for mobile, cannot stretch to new content + c.SetDirty() +} + +func (c *canvas) SetOnTypedKey(typed func(*fyne.KeyEvent)) { + c.onTypedKey = typed +} + +func (c *canvas) SetOnTypedRune(typed func(rune)) { + c.onTypedRune = typed +} + +func (c *canvas) Size() fyne.Size { + return c.size +} + +func (c *canvas) applyThemeOutOfTreeObjects() { + if c.menu != nil { + app.ApplyThemeTo(c.menu, c) // Ensure our menu gets the theme change message as it's out-of-tree + } + if c.windowHead != nil { + app.ApplyThemeTo(c.windowHead, c) // Ensure our child windows get the theme change message as it's out-of-tree + } +} + +func (c *canvas) findObjectAtPositionMatching(pos fyne.Position, test func(object fyne.CanvasObject) bool) (fyne.CanvasObject, fyne.Position, int) { + if c.menu != nil { + return intdriver.FindObjectAtPositionMatching(pos, test, c.Overlays().Top(), c.menu) + } + + return intdriver.FindObjectAtPositionMatching(pos, test, c.Overlays().Top(), c.windowHead, c.content) +} + +func (c *canvas) overlayChanged() { + c.device.handleKeyboard(c.Focused()) + c.SetDirty() +} + +func (c *canvas) setContent(content fyne.CanvasObject) { + c.content = content + c.SetContentTreeAndFocusMgr(content) +} + +func (c *canvas) setMenu(menu fyne.CanvasObject) { + c.menu = menu + c.SetMenuTreeAndFocusMgr(menu) +} + +func (c *canvas) setWindowHead(head fyne.CanvasObject) { + if c.padded { + head = container.NewPadded(head) + } + c.windowHead = head + c.SetMobileWindowHeadTree(head) +} + +func (c *canvas) sizeContent(size fyne.Size) { + if c.content == nil { // window may not be configured yet + return + } + + c.size = size + areaPos, areaSize := c.InteractiveArea() + + if c.windowHead != nil { + var headSize fyne.Size + headPos := areaPos + if c.windowHeadIsDisplacing() { + headSize = fyne.NewSize(areaSize.Width, c.windowHead.MinSize().Height) + headPos = headPos.SubtractXY(0, headSize.Height) + } else { + headSize = c.windowHead.MinSize() + } + c.windowHead.Resize(headSize) + c.windowHead.Move(headPos) + } + + for _, overlay := range c.Overlays().List() { + if p, ok := overlay.(*widget.PopUp); ok { + // TODO: remove this when #707 is being addressed. + // “Notifies” the PopUp of the canvas size change. + p.Refresh() + } else { + overlay.Resize(areaSize) + overlay.Move(areaPos) + } + } + + if c.padded { + c.content.Resize(areaSize.Subtract(fyne.NewSize(theme.Padding()*2, theme.Padding()*2))) + c.content.Move(areaPos.Add(fyne.NewPos(theme.Padding(), theme.Padding()))) + } else { + c.content.Resize(areaSize) + c.content.Move(areaPos) + } +} + +func (c *canvas) tapDown(pos fyne.Position, tapID int) { + c.lastTapDown[tapID] = time.Now() + c.lastTapDownPos[tapID] = pos + c.dragging = nil + + co, objPos, layer := c.findObjectAtPositionMatching(pos, func(object fyne.CanvasObject) bool { + switch object.(type) { + case mobile.Touchable, fyne.Focusable: + return true + } + + return false + }) + + if wid, ok := co.(mobile.Touchable); ok { + touchEv := &mobile.TouchEvent{} + touchEv.Position = objPos + touchEv.AbsolutePosition = pos + wid.TouchDown(touchEv) + c.touched[tapID] = wid + } + + if layer != 1 { // 0 - overlay, 1 - window head / menu, 2 - content + if wid, ok := co.(fyne.Focusable); !ok || wid != c.Focused() { + c.Unfocus() + } + } +} + +func (c *canvas) tapMove(pos fyne.Position, tapID int, + dragCallback func(fyne.Draggable, *fyne.DragEvent), +) { + previousPos := c.lastTapDownPos[tapID] + deltaX := pos.X - previousPos.X + deltaY := pos.Y - previousPos.Y + + if c.dragging == nil && (math.Abs(float64(deltaX)) < tapMoveThreshold && math.Abs(float64(deltaY)) < tapMoveThreshold) { + return + } + c.lastTapDownPos[tapID] = pos + offset := fyne.Delta{DX: deltaX, DY: deltaY} + c.lastTapDelta[tapID] = offset + + co, objPos, _ := c.findObjectAtPositionMatching(pos, func(object fyne.CanvasObject) bool { + if _, ok := object.(fyne.Draggable); ok { + return true + } else if _, ok := object.(mobile.Touchable); ok { + return true + } + + return false + }) + + if c.touched[tapID] != nil { + if touch, ok := co.(mobile.Touchable); !ok || c.touched[tapID] != touch { + touchEv := &mobile.TouchEvent{} + touchEv.Position = objPos + touchEv.AbsolutePosition = pos + c.touched[tapID].TouchCancel(touchEv) + c.touched[tapID] = nil + } + } + + if c.dragging == nil { + if drag, ok := co.(fyne.Draggable); ok { + c.dragging = drag + c.dragOffset = previousPos.Subtract(objPos) + c.dragStart = co.Position() + } else { + return + } + } + + ev := &fyne.DragEvent{} + draggedObjDelta := c.dragStart.Subtract(c.dragging.(fyne.CanvasObject).Position()) + ev.Position = pos.Subtract(c.dragOffset).Add(draggedObjDelta) + ev.Dragged = offset + + dragCallback(c.dragging, ev) +} + +func (c *canvas) tapUp(pos fyne.Position, tapID int, + tapCallback func(fyne.Tappable, *fyne.PointEvent), + tapAltCallback func(fyne.SecondaryTappable, *fyne.PointEvent), + doubleTapCallback func(fyne.DoubleTappable, *fyne.PointEvent), + dragCallback func(fyne.Draggable, *fyne.DragEvent), +) { + if c.dragging != nil { + previousDelta := c.lastTapDelta[tapID] + ev := &fyne.DragEvent{Dragged: previousDelta} + draggedObjDelta := c.dragStart.Subtract(c.dragging.(fyne.CanvasObject).Position()) + ev.Position = pos.Subtract(c.dragOffset).Add(draggedObjDelta) + ev.AbsolutePosition = pos + dragCallback(c.dragging, ev) + + c.dragging = nil + return + } + + duration := time.Since(c.lastTapDown[tapID]) + + if c.menu != nil && c.Overlays().Top() == nil && pos.X > c.menu.Size().Width { + c.menu.Hide() + c.menu.Refresh() + c.setMenu(nil) + return + } + + co, objPos, _ := c.findObjectAtPositionMatching(pos, func(object fyne.CanvasObject) bool { + if _, ok := object.(fyne.Tappable); ok { + return true + } else if _, ok := object.(fyne.SecondaryTappable); ok { + return true + } else if _, ok := object.(mobile.Touchable); ok { + return true + } else if _, ok := object.(fyne.DoubleTappable); ok { + return true + } + + return false + }) + + if wid, ok := co.(mobile.Touchable); ok { + touchEv := &mobile.TouchEvent{} + touchEv.Position = objPos + touchEv.AbsolutePosition = pos + wid.TouchUp(touchEv) + c.touched[tapID] = nil + } + + ev := &fyne.PointEvent{ + Position: objPos, + AbsolutePosition: pos, + } + + if duration < tapSecondaryDelay { + _, doubleTap := co.(fyne.DoubleTappable) + if doubleTap { + c.touchCancelLock.Lock() + c.touchTapCount++ + c.touchLastTapped = co + cancel := c.touchCancelFunc + c.touchCancelLock.Unlock() + if cancel != nil { + cancel() + return + } + go c.waitForDoubleTap(co, ev, tapCallback, doubleTapCallback) + } else { + if wid, ok := co.(fyne.Tappable); ok { + tapCallback(wid, ev) + } + } + } else { + if wid, ok := co.(fyne.SecondaryTappable); ok { + tapAltCallback(wid, ev) + } + } +} + +func (c *canvas) waitForDoubleTap(co fyne.CanvasObject, ev *fyne.PointEvent, tapCallback func(fyne.Tappable, *fyne.PointEvent), doubleTapCallback func(fyne.DoubleTappable, *fyne.PointEvent)) { + ctx, cancel := context.WithDeadline(context.TODO(), time.Now().Add(tapDoubleDelay)) + c.touchCancelLock.Lock() + c.touchCancelFunc = cancel + c.touchCancelLock.Unlock() + defer cancel() + + <-ctx.Done() + fyne.CurrentApp().Driver().DoFromGoroutine(func() { + c.touchCancelLock.Lock() + touchCount := c.touchTapCount + touchLast := c.touchLastTapped + c.touchCancelLock.Unlock() + + if touchCount == 2 && touchLast == co { + if wid, ok := co.(fyne.DoubleTappable); ok { + doubleTapCallback(wid, ev) + } + } else { + if wid, ok := co.(fyne.Tappable); ok { + tapCallback(wid, ev) + } + } + + c.touchCancelLock.Lock() + c.touchTapCount = 0 + c.touchCancelFunc = nil + c.touchLastTapped = nil + c.touchCancelLock.Unlock() + }, true) +} + +func (c *canvas) windowHeadIsDisplacing() bool { + if c.windowHead == nil { + return false + } + + chromeBox := c.windowHead.(*fyne.Container) + if c.padded { + chromeBox = chromeBox.Objects[0].(*fyne.Container) // the padded container + } + return len(chromeBox.Objects) > 1 +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/clipboard.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/clipboard.go new file mode 100644 index 0000000..48f3f08 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/clipboard.go @@ -0,0 +1,15 @@ +package mobile + +import ( + "fyne.io/fyne/v2" +) + +// Declare conformity with Clipboard interface +var _ fyne.Clipboard = mobileClipboard{} + +func NewClipboard() fyne.Clipboard { + return mobileClipboard{} +} + +// mobileClipboard represents the system mobileClipboard +type mobileClipboard struct{} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/clipboard_android.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/clipboard_android.go new file mode 100644 index 0000000..cbb801d --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/clipboard_android.go @@ -0,0 +1,46 @@ +//go:build android + +package mobile + +/* +#cgo LDFLAGS: -landroid -llog -lEGL -lGLESv2 + +#include + +char *getClipboardContent(uintptr_t java_vm, uintptr_t jni_env, uintptr_t ctx); +void setClipboardContent(uintptr_t java_vm, uintptr_t jni_env, uintptr_t ctx, char *content); +*/ +import "C" + +import ( + "unsafe" + + "fyne.io/fyne/v2/internal/driver/mobile/app" +) + +// Content returns the clipboard content for Android +func (c mobileClipboard) Content() string { + content := "" + app.RunOnJVM(func(vm, env, ctx uintptr) error { + chars := C.getClipboardContent(C.uintptr_t(vm), C.uintptr_t(env), C.uintptr_t(ctx)) + if chars == nil { + return nil + } + + content = C.GoString(chars) + C.free(unsafe.Pointer(chars)) + return nil + }) + return content +} + +// SetContent sets the clipboard content for Android +func (c mobileClipboard) SetContent(content string) { + contentStr := C.CString(content) + defer C.free(unsafe.Pointer(contentStr)) + + app.RunOnJVM(func(vm, env, ctx uintptr) error { + C.setClipboardContent(C.uintptr_t(vm), C.uintptr_t(env), C.uintptr_t(ctx), contentStr) + return nil + }) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/clipboard_desktop.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/clipboard_desktop.go new file mode 100644 index 0000000..76e8b91 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/clipboard_desktop.go @@ -0,0 +1,16 @@ +//go:build !ios && !android + +package mobile + +import "fyne.io/fyne/v2" + +// Content returns the clipboard content for mobile simulator runs +func (c mobileClipboard) Content() string { + fyne.LogError("Clipboard is not supported in mobile simulation", nil) + return "" +} + +// SetContent sets the clipboard content for mobile simulator runs +func (c mobileClipboard) SetContent(content string) { + fyne.LogError("Clipboard is not supported in mobile simulation", nil) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/clipboard_ios.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/clipboard_ios.go new file mode 100644 index 0000000..1ff2c99 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/clipboard_ios.go @@ -0,0 +1,30 @@ +//go:build ios + +package mobile + +/* +#cgo CFLAGS: -x objective-c +#cgo LDFLAGS: -framework Foundation -framework UIKit -framework MobileCoreServices + +#include + +void setClipboardContent(char *content); +char *getClipboardContent(); +*/ +import "C" +import "unsafe" + +// Content returns the clipboard content for iOS +func (c mobileClipboard) Content() string { + content := C.getClipboardContent() + + return C.GoString(content) +} + +// SetContent sets the clipboard content for iOS +func (c mobileClipboard) SetContent(content string) { + contentStr := C.CString(content) + defer C.free(unsafe.Pointer(contentStr)) + + C.setClipboardContent(contentStr) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/clipboard_ios.m b/vendor/fyne.io/fyne/v2/internal/driver/mobile/clipboard_ios.m new file mode 100644 index 0000000..ea3827b --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/clipboard_ios.m @@ -0,0 +1,15 @@ +//go:build ios + +#import +#import + +void setClipboardContent(char *content) { + NSString *value = [NSString stringWithUTF8String:content]; + [[UIPasteboard generalPasteboard] setString:value]; +} + +char *getClipboardContent() { + NSString *str = [[UIPasteboard generalPasteboard] string]; + + return (char *) [str UTF8String]; +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/device.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/device.go new file mode 100644 index 0000000..ce24d92 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/device.go @@ -0,0 +1,60 @@ +package mobile + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/driver/mobile" + "fyne.io/fyne/v2/internal/driver/mobile/event/size" + "fyne.io/fyne/v2/lang" +) + +type device struct { + safeTop, safeLeft, safeBottom, safeRight int + + keyboardShown bool +} + +//lint:file-ignore U1000 Var currentDPI is used in other files, but not here +var ( + currentOrientation size.Orientation + currentDPI float32 +) + +// Declare conformity with Device +var _ fyne.Device = (*device)(nil) + +func (*device) Locale() fyne.Locale { + return lang.SystemLocale() +} + +func (*device) Orientation() fyne.DeviceOrientation { + switch currentOrientation { + case size.OrientationLandscape: + return fyne.OrientationHorizontalLeft + default: + return fyne.OrientationVertical + } +} + +func (*device) IsMobile() bool { + return true +} + +func (*device) IsBrowser() bool { + return false +} + +func (*device) HasKeyboard() bool { + return false +} + +func (d *device) ShowVirtualKeyboard() { + d.showVirtualKeyboard(mobile.DefaultKeyboard) +} + +func (d *device) ShowVirtualKeyboardType(keyboard mobile.KeyboardType) { + d.showVirtualKeyboard(keyboard) +} + +func (d *device) HideVirtualKeyboard() { + d.hideVirtualKeyboard() +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/device_android.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/device_android.go new file mode 100644 index 0000000..44c0398 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/device_android.go @@ -0,0 +1,20 @@ +//go:build android + +package mobile + +import "fyne.io/fyne/v2" + +const tapYOffset = -8.0 // to compensate for how we hold our fingers on the device + +func (*device) SystemScaleForWindow(_ fyne.Window) float32 { + if currentDPI >= 600 { + return 4 + } else if currentDPI >= 405 { + return 3 + } else if currentDPI >= 270 { + return 2 + } else if currentDPI >= 180 { + return 1.5 + } + return 1 +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/device_desktop.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/device_desktop.go new file mode 100644 index 0000000..2b51209 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/device_desktop.go @@ -0,0 +1,15 @@ +//go:build !ios && !android && !wayland + +package mobile + +import "fyne.io/fyne/v2" + +const tapYOffset = 0 // no finger compensation on desktop (simulation) + +func (*device) SystemScaleForWindow(_ fyne.Window) float32 { + return 2 // this is simply due to the high number of pixels on a mobile device - just an approximation +} + +func setDisableScreenBlank(_ bool) { + // ignore in mobile simulation mode +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/device_ios.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/device_ios.go new file mode 100644 index 0000000..284b6c0 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/device_ios.go @@ -0,0 +1,16 @@ +//go:build ios + +package mobile + +import "fyne.io/fyne/v2" + +const tapYOffset = -8.0 // to compensate for how we hold our fingers on the device + +func (*device) SystemScaleForWindow(_ fyne.Window) float32 { + if currentDPI >= 450 { + return 3 + } else if currentDPI >= 340 { + return 2.5 + } + return 2 +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/device_wayland.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/device_wayland.go new file mode 100644 index 0000000..8ad3e3a --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/device_wayland.go @@ -0,0 +1,15 @@ +//go:build wayland + +package mobile + +import "fyne.io/fyne/v2" + +const tapYOffset = -4.0 // to compensate for how we hold our fingers on the device + +func (*device) SystemScaleForWindow(_ fyne.Window) float32 { + return 1 // PinePhone simplification, our only wayland mobile currently +} + +func setDisableScreenBlank(_ bool) { + // ignore in mobile simulation mode +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/driver.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/driver.go new file mode 100644 index 0000000..984ae33 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/driver.go @@ -0,0 +1,670 @@ +package mobile + +import ( + "math" + "runtime" + "strconv" + "time" + + "fyne.io/fyne/v2" + fynecanvas "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/driver/mobile" + "fyne.io/fyne/v2/internal" + "fyne.io/fyne/v2/internal/animation" + intapp "fyne.io/fyne/v2/internal/app" + "fyne.io/fyne/v2/internal/async" + "fyne.io/fyne/v2/internal/build" + "fyne.io/fyne/v2/internal/cache" + intdriver "fyne.io/fyne/v2/internal/driver" + "fyne.io/fyne/v2/internal/driver/common" + "fyne.io/fyne/v2/internal/driver/mobile/app" + "fyne.io/fyne/v2/internal/driver/mobile/event/key" + "fyne.io/fyne/v2/internal/driver/mobile/event/lifecycle" + "fyne.io/fyne/v2/internal/driver/mobile/event/paint" + "fyne.io/fyne/v2/internal/driver/mobile/event/size" + "fyne.io/fyne/v2/internal/driver/mobile/event/touch" + "fyne.io/fyne/v2/internal/driver/mobile/gl" + "fyne.io/fyne/v2/internal/painter" + pgl "fyne.io/fyne/v2/internal/painter/gl" + "fyne.io/fyne/v2/internal/scale" + "fyne.io/fyne/v2/theme" +) + +const ( + tapMoveDecay = 0.92 // how much should the scroll continue decay on each frame? + tapMoveEndThreshold = 2.0 // at what offset will we stop decaying? + tapMoveThreshold = 4.0 // how far can we move before it is a drag + tapSecondaryDelay = 300 * time.Millisecond // how long before secondary tap + tapDoubleDelay = 500 * time.Millisecond // max duration between taps for a DoubleTap event +) + +// Configuration is the system information about the current device +type Configuration struct { + SystemTheme fyne.ThemeVariant +} + +// ConfiguredDriver is a simple type that allows packages to hook into configuration changes of this driver. +type ConfiguredDriver interface { + SetOnConfigurationChanged(func(*Configuration)) +} + +type driver struct { + app app.App + glctx gl.Context + + windows []fyne.Window + device device + animation animation.Runner + currentSize size.Event + + theme fyne.ThemeVariant + onConfigChanged func(*Configuration) + painting bool + running bool + queuedFuncs *async.UnboundedChan[func()] +} + +// Declare conformity with Driver +var ( + _ fyne.Driver = (*driver)(nil) + _ ConfiguredDriver = (*driver)(nil) +) + +func init() { + runtime.LockOSThread() +} + +func (d *driver) DoFromGoroutine(fn func(), wait bool) { + caller := func() { + if d.queuedFuncs == nil { + fn() // before the app actually starts + return + } + var done chan struct{} + if wait { + done = common.DonePool.Get() + defer common.DonePool.Put(done) + } + + d.queuedFuncs.In() <- func() { + fn() + if wait { + done <- struct{}{} + } + } + + if wait { + <-done + } + } + + if wait { + async.EnsureNotMain(caller) + } else { + caller() + } +} + +func (d *driver) CreateWindow(title string) fyne.Window { + c := newCanvas(fyne.CurrentDevice()).(*canvas) // silence lint + ret := &window{title: title, canvas: c, isChild: len(d.windows) > 0} + c.setContent(&fynecanvas.Rectangle{FillColor: theme.Color(theme.ColorNameBackground)}) + c.SetPainter(pgl.NewPainter(c, ret)) + d.windows = append(d.windows, ret) + return ret +} + +func (d *driver) AllWindows() []fyne.Window { + return d.windows +} + +// currentWindow returns the most recently opened window - we can only show one at a time. +func (d *driver) currentWindow() *window { + if len(d.windows) == 0 { + return nil + } + + var last *window + for i := len(d.windows) - 1; i >= 0; i-- { + last = d.windows[i].(*window) + if last.visible { + return last + } + } + + return last +} + +func (d *driver) Clipboard() fyne.Clipboard { + return NewClipboard() +} + +func (d *driver) RenderedTextSize(text string, textSize float32, style fyne.TextStyle, source fyne.Resource) (size fyne.Size, baseline float32) { + return painter.RenderedTextSize(text, textSize, style, source) +} + +func (d *driver) CanvasForObject(obj fyne.CanvasObject) fyne.Canvas { + if len(d.windows) == 0 { + return nil + } + + // TODO figure out how we handle multiple windows... + return d.currentWindow().Canvas() +} + +func (d *driver) AbsolutePositionForObject(co fyne.CanvasObject) fyne.Position { + c := d.CanvasForObject(co) + if c == nil { + return fyne.NewPos(0, 0) + } + + mc := c.(*canvas) + pos := intdriver.AbsolutePositionForObject(co, mc.ObjectTrees()) + inset, _ := c.InteractiveArea() + return pos.Subtract(inset) +} + +func (d *driver) GoBack() { + app.GoBack() +} + +func (d *driver) Quit() { + // Android and iOS guidelines say this should not be allowed! +} + +func (d *driver) Run() { + if d.running { + return // Run was called twice. + } + d.running = true + + app.Main(func(a app.App) { + async.SetMainGoroutine() + d.app = a + d.queuedFuncs = async.NewUnboundedChan[func()]() + + fyne.CurrentApp().Settings().AddListener(func(s fyne.Settings) { + painter.ClearFontCache() + cache.ResetThemeCaches() + intapp.ApplySettingsWithCallback(s, fyne.CurrentApp(), func(w fyne.Window) { + c, ok := w.Canvas().(*canvas) + if !ok { + return + } + c.applyThemeOutOfTreeObjects() + }) + }) + + draw := time.NewTicker(time.Second / 60) + defer func() { + l := fyne.CurrentApp().Lifecycle().(*intapp.Lifecycle) + + // exhaust the event queue + go func() { + l.WaitForEvents() + d.queuedFuncs.Close() + }() + for fn := range d.queuedFuncs.Out() { + fn() + } + + l.DestroyEventQueue() + }() + + for { + select { + case <-draw.C: + d.sendPaintEvent() + case fn := <-d.queuedFuncs.Out(): + fn() + case e, ok := <-a.Events(): + if !ok { + return // events channel closed, app done + } + current := d.currentWindow() + if current == nil { + continue + } + c := current.Canvas().(*canvas) + + switch e := a.Filter(e).(type) { + case lifecycle.Event: + d.handleLifecycle(e, current) + case size.Event: + if e.WidthPx <= 0 { + continue + } + d.currentSize = e + currentOrientation = e.Orientation + currentDPI = e.PixelsPerPt * 72 + d.setTheme(e.DarkMode) + + dev := &d.device + insetChange := dev.safeTop != e.InsetTopPx || dev.safeBottom != e.InsetBottomPx || + dev.safeLeft != e.InsetLeftPx || dev.safeRight != e.InsetRightPx + dev.safeTop = e.InsetTopPx + dev.safeLeft = e.InsetLeftPx + dev.safeBottom = e.InsetBottomPx + dev.safeRight = e.InsetRightPx + c.scale = fyne.CurrentDevice().SystemScaleForWindow(nil) + c.Painter().SetFrameBufferScale(1.0) + + if insetChange { + current.canvas.sizeContent(current.canvas.size) // even if size didn't change we invalidate + } + // make sure that we paint on the next frame + c.Content().Refresh() + case paint.Event: + d.handlePaint(e, current) + case touch.Event: + switch e.Type { + case touch.TypeBegin: + d.tapDownCanvas(current, e.X, e.Y, e.Sequence) + case touch.TypeMove: + d.tapMoveCanvas(current, e.X, e.Y, e.Sequence) + case touch.TypeEnd: + d.tapUpCanvas(current, e.X, e.Y, e.Sequence) + } + case key.Event: + if runtime.GOOS == "android" && e.Code == key.CodeDeleteBackspace && e.Rune < 0 && d.device.keyboardShown { + break // we are getting release/press on backspace during soft backspace + } + + if e.Direction == key.DirPress { + d.typeDownCanvas(c, e.Rune, e.Code, e.Modifiers) + } else if e.Direction == key.DirRelease { + d.typeUpCanvas(c, e.Rune, e.Code, e.Modifiers) + } + } + } + } + }) +} + +func (*driver) SetDisableScreenBlanking(disable bool) { + setDisableScreenBlank(disable) +} + +func (d *driver) handleLifecycle(e lifecycle.Event, w *window) { + c := w.Canvas().(*canvas) + switch e.Crosses(lifecycle.StageAlive) { + case lifecycle.CrossOn: + d.onStart() + case lifecycle.CrossOff: + d.onStop() + } + switch e.Crosses(lifecycle.StageVisible) { + case lifecycle.CrossOn: + d.glctx, _ = e.DrawContext.(gl.Context) + // this is a fix for some android phone to prevent the app from being drawn as a blank screen after being pushed in the background + c.Content().Refresh() + + d.sendPaintEvent() + case lifecycle.CrossOff: + d.glctx = nil + } + switch e.Crosses(lifecycle.StageFocused) { + case lifecycle.CrossOn: // foregrounding + if f := fyne.CurrentApp().Lifecycle().(*intapp.Lifecycle).OnEnteredForeground(); f != nil { + f() + } + case lifecycle.CrossOff: // will enter background + if runtime.GOOS == "darwin" || runtime.GOOS == "ios" { + if d.glctx == nil { + return + } + + s := fyne.NewSize(float32(d.currentSize.WidthPx)/c.scale, float32(d.currentSize.HeightPx)/c.scale) + d.paintWindow(w, s) + d.app.Publish() + } + if f := fyne.CurrentApp().Lifecycle().(*intapp.Lifecycle).OnExitedForeground(); f != nil { + f() + } + } +} + +func (d *driver) handlePaint(e paint.Event, w *window) { + c := w.Canvas().(*canvas) + if e.Window != 0 { // not all paint events come from hardware + w.handle = e.Window + } + d.painting = false + if d.glctx == nil || e.External { + return + } + if !c.initialized { + c.initialized = true + c.Painter().Init() // we cannot init until the context is set above + } + + d.animation.TickAnimations() + canvasNeedRefresh := c.FreeDirtyTextures() > 0 || c.CheckDirtyAndClear() + if canvasNeedRefresh { + newSize := fyne.NewSize(float32(d.currentSize.WidthPx)/c.scale, float32(d.currentSize.HeightPx)/c.scale) + + if c.EnsureMinSize() { + c.sizeContent(newSize) // force resize of content + } else { // if screen changed + w.Resize(newSize) + } + + d.paintWindow(w, newSize) + d.app.Publish() + } + cache.Clean(canvasNeedRefresh) +} + +func (d *driver) onStart() { + if f := fyne.CurrentApp().Lifecycle().(*intapp.Lifecycle).OnStarted(); f != nil { + f() + } +} + +func (d *driver) onStop() { + l := fyne.CurrentApp().Lifecycle().(*intapp.Lifecycle) + if f := l.OnStopped(); f != nil { + l.QueueEvent(f) + } +} + +func (d *driver) paintWindow(window fyne.Window, size fyne.Size) { + clips := &internal.ClipStack{} + c := window.Canvas().(*canvas) + + r, g, b, a := theme.Color(theme.ColorNameBackground).RGBA() + max16bit := float32(255 * 255) + d.glctx.ClearColor(float32(r)/max16bit, float32(g)/max16bit, float32(b)/max16bit, float32(a)/max16bit) + d.glctx.Clear(gl.ColorBufferBit) + + draw := func(node *common.RenderCacheNode, pos fyne.Position) { + obj := node.Obj() + if intdriver.IsClip(obj) { + inner := clips.Push(pos, obj.Size()) + c.Painter().StartClipping(inner.Rect()) + } + + if size.Width <= 0 || size.Height <= 0 { // iconifying on Windows can do bad things + return + } + c.Painter().Paint(obj, pos, size) + } + afterDraw := func(node *common.RenderCacheNode, pos fyne.Position) { + if intdriver.IsClip(node.Obj()) { + c.Painter().StopClipping() + clips.Pop() + if top := clips.Top(); top != nil { + c.Painter().StartClipping(top.Rect()) + } + } + + if build.Mode == fyne.BuildDebug { + c.DrawDebugOverlay(node.Obj(), pos, size) + } + } + + c.WalkTrees(draw, afterDraw) +} + +func (d *driver) sendPaintEvent() { + if d.painting { + return + } + d.app.Send(paint.Event{}) + d.painting = true +} + +func (d *driver) setTheme(dark bool) { + var mode fyne.ThemeVariant + if dark { + mode = theme.VariantDark + } else { + mode = theme.VariantLight + } + + if d.theme != mode && d.onConfigChanged != nil { + d.onConfigChanged(&Configuration{SystemTheme: mode}) + } + d.theme = mode +} + +func (d *driver) tapDownCanvas(w *window, x, y float32, tapID touch.Sequence) { + tapX := scale.ToFyneCoordinate(w.canvas, int(x)) + tapY := scale.ToFyneCoordinate(w.canvas, int(y)) + pos := fyne.NewPos(tapX, tapY+tapYOffset) + + w.canvas.tapDown(pos, int(tapID)) +} + +func (d *driver) tapMoveCanvas(w *window, x, y float32, tapID touch.Sequence) { + tapX := scale.ToFyneCoordinate(w.canvas, int(x)) + tapY := scale.ToFyneCoordinate(w.canvas, int(y)) + pos := fyne.NewPos(tapX, tapY+tapYOffset) + + w.canvas.tapMove(pos, int(tapID), func(wid fyne.Draggable, ev *fyne.DragEvent) { + wid.Dragged(ev) + }) +} + +func (d *driver) tapUpCanvas(w *window, x, y float32, tapID touch.Sequence) { + tapX := scale.ToFyneCoordinate(w.canvas, int(x)) + tapY := scale.ToFyneCoordinate(w.canvas, int(y)) + pos := fyne.NewPos(tapX, tapY+tapYOffset) + + w.canvas.tapUp(pos, int(tapID), func(wid fyne.Tappable, ev *fyne.PointEvent) { + wid.Tapped(ev) + }, func(wid fyne.SecondaryTappable, ev *fyne.PointEvent) { + wid.TappedSecondary(ev) + }, func(wid fyne.DoubleTappable, ev *fyne.PointEvent) { + wid.DoubleTapped(ev) + }, func(wid fyne.Draggable, ev *fyne.DragEvent) { + if math.Abs(float64(ev.Dragged.DX)) <= tapMoveEndThreshold && math.Abs(float64(ev.Dragged.DY)) <= tapMoveEndThreshold { + wid.DragEnd() + return + } + + go func() { + for math.Abs(float64(ev.Dragged.DX)) > tapMoveEndThreshold || math.Abs(float64(ev.Dragged.DY)) > tapMoveEndThreshold { + if math.Abs(float64(ev.Dragged.DX)) > 0 { + ev.Dragged.DX *= tapMoveDecay + } + if math.Abs(float64(ev.Dragged.DY)) > 0 { + ev.Dragged.DY *= tapMoveDecay + } + + d.DoFromGoroutine(func() { + wid.Dragged(ev) + }, false) + time.Sleep(time.Millisecond * 16) + } + + d.DoFromGoroutine(wid.DragEnd, false) + }() + }) +} + +var keyCodeMap = map[key.Code]fyne.KeyName{ + // non-printable + key.CodeEscape: fyne.KeyEscape, + key.CodeReturnEnter: fyne.KeyReturn, + key.CodeTab: fyne.KeyTab, + key.CodeDeleteBackspace: fyne.KeyBackspace, + key.CodeInsert: fyne.KeyInsert, + key.CodePageUp: fyne.KeyPageUp, + key.CodePageDown: fyne.KeyPageDown, + key.CodeHome: fyne.KeyHome, + key.CodeEnd: fyne.KeyEnd, + + key.CodeLeftArrow: fyne.KeyLeft, + key.CodeRightArrow: fyne.KeyRight, + key.CodeUpArrow: fyne.KeyUp, + key.CodeDownArrow: fyne.KeyDown, + + key.CodeF1: fyne.KeyF1, + key.CodeF2: fyne.KeyF2, + key.CodeF3: fyne.KeyF3, + key.CodeF4: fyne.KeyF4, + key.CodeF5: fyne.KeyF5, + key.CodeF6: fyne.KeyF6, + key.CodeF7: fyne.KeyF7, + key.CodeF8: fyne.KeyF8, + key.CodeF9: fyne.KeyF9, + key.CodeF10: fyne.KeyF10, + key.CodeF11: fyne.KeyF11, + key.CodeF12: fyne.KeyF12, + + key.CodeKeypadEnter: fyne.KeyEnter, + + // printable + key.CodeA: fyne.KeyA, + key.CodeB: fyne.KeyB, + key.CodeC: fyne.KeyC, + key.CodeD: fyne.KeyD, + key.CodeE: fyne.KeyE, + key.CodeF: fyne.KeyF, + key.CodeG: fyne.KeyG, + key.CodeH: fyne.KeyH, + key.CodeI: fyne.KeyI, + key.CodeJ: fyne.KeyJ, + key.CodeK: fyne.KeyK, + key.CodeL: fyne.KeyL, + key.CodeM: fyne.KeyM, + key.CodeN: fyne.KeyN, + key.CodeO: fyne.KeyO, + key.CodeP: fyne.KeyP, + key.CodeQ: fyne.KeyQ, + key.CodeR: fyne.KeyR, + key.CodeS: fyne.KeyS, + key.CodeT: fyne.KeyT, + key.CodeU: fyne.KeyU, + key.CodeV: fyne.KeyV, + key.CodeW: fyne.KeyW, + key.CodeX: fyne.KeyX, + key.CodeY: fyne.KeyY, + key.CodeZ: fyne.KeyZ, + key.Code0: fyne.Key0, + key.CodeKeypad0: fyne.Key0, + key.Code1: fyne.Key1, + key.CodeKeypad1: fyne.Key1, + key.Code2: fyne.Key2, + key.CodeKeypad2: fyne.Key2, + key.Code3: fyne.Key3, + key.CodeKeypad3: fyne.Key3, + key.Code4: fyne.Key4, + key.CodeKeypad4: fyne.Key4, + key.Code5: fyne.Key5, + key.CodeKeypad5: fyne.Key5, + key.Code6: fyne.Key6, + key.CodeKeypad6: fyne.Key6, + key.Code7: fyne.Key7, + key.CodeKeypad7: fyne.Key7, + key.Code8: fyne.Key8, + key.CodeKeypad8: fyne.Key8, + key.Code9: fyne.Key9, + key.CodeKeypad9: fyne.Key9, + + key.CodeSemicolon: fyne.KeySemicolon, + key.CodeEqualSign: fyne.KeyEqual, + + key.CodeSpacebar: fyne.KeySpace, + key.CodeApostrophe: fyne.KeyApostrophe, + key.CodeComma: fyne.KeyComma, + key.CodeHyphenMinus: fyne.KeyMinus, + key.CodeKeypadHyphenMinus: fyne.KeyMinus, + key.CodeFullStop: fyne.KeyPeriod, + key.CodeKeypadFullStop: fyne.KeyPeriod, + key.CodeSlash: fyne.KeySlash, + key.CodeLeftSquareBracket: fyne.KeyLeftBracket, + key.CodeBackslash: fyne.KeyBackslash, + key.CodeRightSquareBracket: fyne.KeyRightBracket, + key.CodeGraveAccent: fyne.KeyBackTick, + + key.CodeBackButton: mobile.KeyBack, +} + +func keyToName(code key.Code) fyne.KeyName { + ret, ok := keyCodeMap[code] + if !ok { + return "" + } + + return ret +} + +func runeToPrintable(r rune) rune { + if strconv.IsPrint(r) { + return r + } + + return 0 +} + +func (d *driver) typeDownCanvas(canvas *canvas, r rune, code key.Code, mod key.Modifiers) { + keyName := keyToName(code) + switch keyName { + case fyne.KeyTab: + capture := false + if ent, ok := canvas.Focused().(fyne.Tabbable); ok { + capture = ent.AcceptsTab() + } + if !capture { + switch mod { + case 0: + canvas.FocusNext() + return + case key.ModShift: + canvas.FocusPrevious() + return + } + } + } + + r = runeToPrintable(r) + keyEvent := &fyne.KeyEvent{Name: keyName} + + if canvas.Focused() != nil { + if keyName != "" { + canvas.Focused().TypedKey(keyEvent) + } + if r > 0 { + canvas.Focused().TypedRune(r) + } + } else { + if keyName != "" { + if canvas.onTypedKey != nil { + canvas.onTypedKey(keyEvent) + } else if keyName == mobile.KeyBack { + d.GoBack() + } + } + if r > 0 && canvas.onTypedRune != nil { + canvas.onTypedRune(r) + } + } +} + +func (d *driver) typeUpCanvas(_ *canvas, _ rune, _ key.Code, _ key.Modifiers) { +} + +func (d *driver) Device() fyne.Device { + return &d.device +} + +func (d *driver) SetOnConfigurationChanged(f func(*Configuration)) { + d.onConfigChanged = f +} + +func (d *driver) DoubleTapDelay() time.Duration { + return tapDoubleDelay +} + +// NewGoMobileDriver sets up a new Driver instance implemented using the Go +// Mobile extension and OpenGL bindings. +func NewGoMobileDriver() fyne.Driver { + d := &driver{ + theme: fyne.ThemeVariant(2), // unspecified + } + + registerRepository(d) + return d +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/driver_android.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/driver_android.go new file mode 100644 index 0000000..da28d4c --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/driver_android.go @@ -0,0 +1,23 @@ +//go:build android + +package mobile + +import driverDefs "fyne.io/fyne/v2/driver" + +/* +#include +#include + +void keepScreenOn(uintptr_t jni_env, uintptr_t ctx, bool disabled); +*/ +import "C" + +func setDisableScreenBlank(disable bool) { + driverDefs.RunNative(func(ctx any) error { + ac := ctx.(*driverDefs.AndroidContext) + + C.keepScreenOn(C.uintptr_t(ac.Env), C.uintptr_t(ac.Ctx), C.bool(disable)) + + return nil + }) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/driver_ios.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/driver_ios.go new file mode 100644 index 0000000..0affb73 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/driver_ios.go @@ -0,0 +1,15 @@ +//go:build ios + +package mobile + +/* +#cgo darwin LDFLAGS: -framework UIKit +#import + +void disableIdleTimer(BOOL disabled); +*/ +import "C" + +func setDisableScreenBlank(disable bool) { + C.disableIdleTimer(C.BOOL(disable)) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/driver_ios.m b/vendor/fyne.io/fyne/v2/internal/driver/mobile/driver_ios.m new file mode 100644 index 0000000..33c2916 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/driver_ios.m @@ -0,0 +1,12 @@ +//go:build ios + +#import +#import + +void disableIdleTimer(BOOL disabled) { + @autoreleasepool { + [[NSOperationQueue mainQueue] addOperationWithBlock:^ { + [UIApplication sharedApplication].idleTimerDisabled = disabled; + }]; + } +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/event/key/code_string.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/event/key/code_string.go new file mode 100644 index 0000000..63a6c74 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/event/key/code_string.go @@ -0,0 +1,183 @@ +// Code generated by "stringer -type=Code"; DO NOT EDIT. + +package key + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[CodeUnknown-0] + _ = x[CodeA-4] + _ = x[CodeB-5] + _ = x[CodeC-6] + _ = x[CodeD-7] + _ = x[CodeE-8] + _ = x[CodeF-9] + _ = x[CodeG-10] + _ = x[CodeH-11] + _ = x[CodeI-12] + _ = x[CodeJ-13] + _ = x[CodeK-14] + _ = x[CodeL-15] + _ = x[CodeM-16] + _ = x[CodeN-17] + _ = x[CodeO-18] + _ = x[CodeP-19] + _ = x[CodeQ-20] + _ = x[CodeR-21] + _ = x[CodeS-22] + _ = x[CodeT-23] + _ = x[CodeU-24] + _ = x[CodeV-25] + _ = x[CodeW-26] + _ = x[CodeX-27] + _ = x[CodeY-28] + _ = x[CodeZ-29] + _ = x[Code1-30] + _ = x[Code2-31] + _ = x[Code3-32] + _ = x[Code4-33] + _ = x[Code5-34] + _ = x[Code6-35] + _ = x[Code7-36] + _ = x[Code8-37] + _ = x[Code9-38] + _ = x[Code0-39] + _ = x[CodeReturnEnter-40] + _ = x[CodeEscape-41] + _ = x[CodeDeleteBackspace-42] + _ = x[CodeTab-43] + _ = x[CodeSpacebar-44] + _ = x[CodeHyphenMinus-45] + _ = x[CodeEqualSign-46] + _ = x[CodeLeftSquareBracket-47] + _ = x[CodeRightSquareBracket-48] + _ = x[CodeBackslash-49] + _ = x[CodeSemicolon-51] + _ = x[CodeApostrophe-52] + _ = x[CodeGraveAccent-53] + _ = x[CodeComma-54] + _ = x[CodeFullStop-55] + _ = x[CodeSlash-56] + _ = x[CodeCapsLock-57] + _ = x[CodeF1-58] + _ = x[CodeF2-59] + _ = x[CodeF3-60] + _ = x[CodeF4-61] + _ = x[CodeF5-62] + _ = x[CodeF6-63] + _ = x[CodeF7-64] + _ = x[CodeF8-65] + _ = x[CodeF9-66] + _ = x[CodeF10-67] + _ = x[CodeF11-68] + _ = x[CodeF12-69] + _ = x[CodePause-72] + _ = x[CodeInsert-73] + _ = x[CodeHome-74] + _ = x[CodePageUp-75] + _ = x[CodeDeleteForward-76] + _ = x[CodeEnd-77] + _ = x[CodePageDown-78] + _ = x[CodeRightArrow-79] + _ = x[CodeLeftArrow-80] + _ = x[CodeDownArrow-81] + _ = x[CodeUpArrow-82] + _ = x[CodeKeypadNumLock-83] + _ = x[CodeKeypadSlash-84] + _ = x[CodeKeypadAsterisk-85] + _ = x[CodeKeypadHyphenMinus-86] + _ = x[CodeKeypadPlusSign-87] + _ = x[CodeKeypadEnter-88] + _ = x[CodeKeypad1-89] + _ = x[CodeKeypad2-90] + _ = x[CodeKeypad3-91] + _ = x[CodeKeypad4-92] + _ = x[CodeKeypad5-93] + _ = x[CodeKeypad6-94] + _ = x[CodeKeypad7-95] + _ = x[CodeKeypad8-96] + _ = x[CodeKeypad9-97] + _ = x[CodeKeypad0-98] + _ = x[CodeKeypadFullStop-99] + _ = x[CodeKeypadEqualSign-103] + _ = x[CodeF13-104] + _ = x[CodeF14-105] + _ = x[CodeF15-106] + _ = x[CodeF16-107] + _ = x[CodeF17-108] + _ = x[CodeF18-109] + _ = x[CodeF19-110] + _ = x[CodeF20-111] + _ = x[CodeF21-112] + _ = x[CodeF22-113] + _ = x[CodeF23-114] + _ = x[CodeF24-115] + _ = x[CodeHelp-117] + _ = x[CodeMute-127] + _ = x[CodeVolumeUp-128] + _ = x[CodeVolumeDown-129] + _ = x[CodeLeftControl-224] + _ = x[CodeLeftShift-225] + _ = x[CodeLeftAlt-226] + _ = x[CodeLeftGUI-227] + _ = x[CodeRightControl-228] + _ = x[CodeRightShift-229] + _ = x[CodeRightAlt-230] + _ = x[CodeRightGUI-231] + _ = x[CodeCompose-65536] +} + +const ( + _Code_name_0 = "CodeUnknown" + _Code_name_1 = "CodeACodeBCodeCCodeDCodeECodeFCodeGCodeHCodeICodeJCodeKCodeLCodeMCodeNCodeOCodePCodeQCodeRCodeSCodeTCodeUCodeVCodeWCodeXCodeYCodeZCode1Code2Code3Code4Code5Code6Code7Code8Code9Code0CodeReturnEnterCodeEscapeCodeDeleteBackspaceCodeTabCodeSpacebarCodeHyphenMinusCodeEqualSignCodeLeftSquareBracketCodeRightSquareBracketCodeBackslash" + _Code_name_2 = "CodeSemicolonCodeApostropheCodeGraveAccentCodeCommaCodeFullStopCodeSlashCodeCapsLockCodeF1CodeF2CodeF3CodeF4CodeF5CodeF6CodeF7CodeF8CodeF9CodeF10CodeF11CodeF12" + _Code_name_3 = "CodePauseCodeInsertCodeHomeCodePageUpCodeDeleteForwardCodeEndCodePageDownCodeRightArrowCodeLeftArrowCodeDownArrowCodeUpArrowCodeKeypadNumLockCodeKeypadSlashCodeKeypadAsteriskCodeKeypadHyphenMinusCodeKeypadPlusSignCodeKeypadEnterCodeKeypad1CodeKeypad2CodeKeypad3CodeKeypad4CodeKeypad5CodeKeypad6CodeKeypad7CodeKeypad8CodeKeypad9CodeKeypad0CodeKeypadFullStop" + _Code_name_4 = "CodeKeypadEqualSignCodeF13CodeF14CodeF15CodeF16CodeF17CodeF18CodeF19CodeF20CodeF21CodeF22CodeF23CodeF24" + _Code_name_5 = "CodeHelp" + _Code_name_6 = "CodeMuteCodeVolumeUpCodeVolumeDown" + _Code_name_7 = "CodeLeftControlCodeLeftShiftCodeLeftAltCodeLeftGUICodeRightControlCodeRightShiftCodeRightAltCodeRightGUI" + _Code_name_8 = "CodeCompose" +) + +var ( + _Code_index_1 = [...]uint16{0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 105, 110, 115, 120, 125, 130, 135, 140, 145, 150, 155, 160, 165, 170, 175, 180, 195, 205, 224, 231, 243, 258, 271, 292, 314, 327} + _Code_index_2 = [...]uint8{0, 13, 27, 42, 51, 63, 72, 84, 90, 96, 102, 108, 114, 120, 126, 132, 138, 145, 152, 159} + _Code_index_3 = [...]uint16{0, 9, 19, 27, 37, 54, 61, 73, 87, 100, 113, 124, 141, 156, 174, 195, 213, 228, 239, 250, 261, 272, 283, 294, 305, 316, 327, 338, 356} + _Code_index_4 = [...]uint8{0, 19, 26, 33, 40, 47, 54, 61, 68, 75, 82, 89, 96, 103} + _Code_index_6 = [...]uint8{0, 8, 20, 34} + _Code_index_7 = [...]uint8{0, 15, 28, 39, 50, 66, 80, 92, 104} +) + +func (i Code) String() string { + switch { + case i == 0: + return _Code_name_0 + case 4 <= i && i <= 49: + i -= 4 + return _Code_name_1[_Code_index_1[i]:_Code_index_1[i+1]] + case 51 <= i && i <= 69: + i -= 51 + return _Code_name_2[_Code_index_2[i]:_Code_index_2[i+1]] + case 72 <= i && i <= 99: + i -= 72 + return _Code_name_3[_Code_index_3[i]:_Code_index_3[i+1]] + case 103 <= i && i <= 115: + i -= 103 + return _Code_name_4[_Code_index_4[i]:_Code_index_4[i+1]] + case i == 117: + return _Code_name_5 + case 127 <= i && i <= 129: + i -= 127 + return _Code_name_6[_Code_index_6[i]:_Code_index_6[i+1]] + case 224 <= i && i <= 231: + i -= 224 + return _Code_name_7[_Code_index_7[i]:_Code_index_7[i+1]] + case i == 65536: + return _Code_name_8 + default: + return "Code(" + strconv.FormatInt(int64(i), 10) + ")" + } +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/event/key/key.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/event/key/key.go new file mode 100644 index 0000000..2b20e3e --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/event/key/key.go @@ -0,0 +1,274 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:generate stringer -type=Code + +// Package key defines an event for physical keyboard keys. +// +// On-screen software keyboards do not send key events. +// +// See the golang.org/x/mobile/app package for details on the event model. +package key + +import ( + "fmt" + "strings" +) + +// Event is a key event. +type Event struct { + // Rune is the meaning of the key event as determined by the + // operating system. The mapping is determined by system-dependent + // current layout, modifiers, lock-states, etc. + // + // If non-negative, it is a Unicode codepoint: pressing the 'a' key + // generates different Runes 'a' or 'A' (but the same Code) depending on + // the state of the shift key. + // + // If -1, the key does not generate a Unicode codepoint. To distinguish + // them, look at Code. + Rune rune + + // Code is the identity of the physical key relative to a notional + // "standard" keyboard, independent of current layout, modifiers, + // lock-states, etc + // + // For standard key codes, its value matches USB HID key codes. + // Compare its value to uint32-typed constants in this package, such + // as CodeLeftShift and CodeEscape. + // + // Pressing the regular '2' key and number-pad '2' key (with Num-Lock) + // generate different Codes (but the same Rune). + Code Code + + // Modifiers is a bitmask representing a set of modifier keys: ModShift, + // ModAlt, etc. + Modifiers Modifiers + + // Direction is the direction of the key event: DirPress, DirRelease, + // or DirNone (for key repeats). + Direction Direction + + // TODO: add a Device ID, for multiple input devices? + // TODO: add a time.Time? +} + +func (e Event) String() string { + if e.Rune >= 0 { + return fmt.Sprintf("key.Event{%q (%v), %v, %v}", e.Rune, e.Code, e.Modifiers, e.Direction) + } + return fmt.Sprintf("key.Event{(%v), %v, %v}", e.Code, e.Modifiers, e.Direction) +} + +// Direction is the direction of the key event. +type Direction uint8 + +// All possibledirections of key event. +const ( + DirNone Direction = 0 + DirPress Direction = 1 + DirRelease Direction = 2 +) + +// Modifiers is a bitmask representing a set of modifier keys. +type Modifiers uint32 + +// All possible modifier keys. +const ( + ModShift Modifiers = 1 << 0 + ModControl Modifiers = 1 << 1 + ModAlt Modifiers = 1 << 2 + ModMeta Modifiers = 1 << 3 // called "Command" on OS X +) + +// Code is the identity of a key relative to a notional "standard" keyboard. +type Code uint32 + +// Physical key codes. +// +// For standard key codes, its value matches USB HID key codes. +// TODO: add missing codes. +const ( + CodeUnknown Code = 0 + + CodeA Code = 4 + CodeB Code = 5 + CodeC Code = 6 + CodeD Code = 7 + CodeE Code = 8 + CodeF Code = 9 + CodeG Code = 10 + CodeH Code = 11 + CodeI Code = 12 + CodeJ Code = 13 + CodeK Code = 14 + CodeL Code = 15 + CodeM Code = 16 + CodeN Code = 17 + CodeO Code = 18 + CodeP Code = 19 + CodeQ Code = 20 + CodeR Code = 21 + CodeS Code = 22 + CodeT Code = 23 + CodeU Code = 24 + CodeV Code = 25 + CodeW Code = 26 + CodeX Code = 27 + CodeY Code = 28 + CodeZ Code = 29 + + Code1 Code = 30 + Code2 Code = 31 + Code3 Code = 32 + Code4 Code = 33 + Code5 Code = 34 + Code6 Code = 35 + Code7 Code = 36 + Code8 Code = 37 + Code9 Code = 38 + Code0 Code = 39 + + CodeReturnEnter Code = 40 + CodeEscape Code = 41 + CodeDeleteBackspace Code = 42 + CodeTab Code = 43 + CodeSpacebar Code = 44 + CodeHyphenMinus Code = 45 // - + CodeEqualSign Code = 46 // = + CodeLeftSquareBracket Code = 47 // [ + CodeRightSquareBracket Code = 48 // ] + CodeBackslash Code = 49 // \ + CodeSemicolon Code = 51 // ; + CodeApostrophe Code = 52 // ' + CodeGraveAccent Code = 53 // ` + CodeComma Code = 54 // , + CodeFullStop Code = 55 // . + CodeSlash Code = 56 // / + CodeCapsLock Code = 57 + + CodeF1 Code = 58 + CodeF2 Code = 59 + CodeF3 Code = 60 + CodeF4 Code = 61 + CodeF5 Code = 62 + CodeF6 Code = 63 + CodeF7 Code = 64 + CodeF8 Code = 65 + CodeF9 Code = 66 + CodeF10 Code = 67 + CodeF11 Code = 68 + CodeF12 Code = 69 + + CodePause Code = 72 + CodeInsert Code = 73 + CodeHome Code = 74 + CodePageUp Code = 75 + CodeDeleteForward Code = 76 + CodeEnd Code = 77 + CodePageDown Code = 78 + + CodeRightArrow Code = 79 + CodeLeftArrow Code = 80 + CodeDownArrow Code = 81 + CodeUpArrow Code = 82 + + CodeKeypadNumLock Code = 83 + CodeKeypadSlash Code = 84 // / + CodeKeypadAsterisk Code = 85 // * + CodeKeypadHyphenMinus Code = 86 // - + CodeKeypadPlusSign Code = 87 // + + CodeKeypadEnter Code = 88 + CodeKeypad1 Code = 89 + CodeKeypad2 Code = 90 + CodeKeypad3 Code = 91 + CodeKeypad4 Code = 92 + CodeKeypad5 Code = 93 + CodeKeypad6 Code = 94 + CodeKeypad7 Code = 95 + CodeKeypad8 Code = 96 + CodeKeypad9 Code = 97 + CodeKeypad0 Code = 98 + CodeKeypadFullStop Code = 99 // . + CodeKeypadEqualSign Code = 103 // = + + CodeF13 Code = 104 + CodeF14 Code = 105 + CodeF15 Code = 106 + CodeF16 Code = 107 + CodeF17 Code = 108 + CodeF18 Code = 109 + CodeF19 Code = 110 + CodeF20 Code = 111 + CodeF21 Code = 112 + CodeF22 Code = 113 + CodeF23 Code = 114 + CodeF24 Code = 115 + + CodeHelp Code = 117 + + CodeMute Code = 127 + CodeVolumeUp Code = 128 + CodeVolumeDown Code = 129 + + CodeLeftControl Code = 224 + CodeLeftShift Code = 225 + CodeLeftAlt Code = 226 + CodeLeftGUI Code = 227 + CodeRightControl Code = 228 + CodeRightShift Code = 229 + CodeRightAlt Code = 230 + CodeRightGUI Code = 231 + + CodeBackButton Code = 301 // anything above 255 is not used in the USB spec + + // The following codes are not part of the standard USB HID Usage IDs for + // keyboards. See http://www.usb.org/developers/hidpage/Hut1_12v2.pdf + // + // Usage IDs are uint16s, so these non-standard values start at 0x10000. + + // CodeCompose is the Code for a compose key, sometimes called a multi key, + // used to input non-ASCII characters such as ñ being composed of n and ~. + // + // See https://en.wikipedia.org/wiki/Compose_key + CodeCompose Code = 0x10000 +) + +// TODO: Given we use runes outside the unicode space, should we provide a +// printing function? Related: it's a little unfortunate that printing a +// key.Event with %v gives not very readable output like: +// {100 7 key.Modifiers() Press} + +var mods = [...]struct { + m Modifiers + s string +}{ + {ModShift, "Shift"}, + {ModControl, "Control"}, + {ModAlt, "Alt"}, + {ModMeta, "Meta"}, +} + +func (m Modifiers) String() string { + var match []string + for _, mod := range mods { + if mod.m&m != 0 { + match = append(match, mod.s) + } + } + return "key.Modifiers(" + strings.Join(match, "|") + ")" +} + +func (d Direction) String() string { + switch d { + case DirNone: + return "None" + case DirPress: + return "Press" + case DirRelease: + return "Release" + default: + return fmt.Sprintf("key.Direction(%d)", d) + } +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/event/lifecycle/lifecycle.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/event/lifecycle/lifecycle.go new file mode 100644 index 0000000..7bd3945 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/event/lifecycle/lifecycle.go @@ -0,0 +1,137 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package lifecycle defines an event for an app's lifecycle. +// +// The app lifecycle consists of moving back and forth between an ordered +// sequence of stages. For example, being at a stage greater than or equal to +// StageVisible means that the app is visible on the screen. +// +// A lifecycle event is a change from one stage to another, which crosses every +// intermediate stage. For example, changing from StageAlive to StageFocused +// implicitly crosses StageVisible. +// +// Crosses can be in a positive or negative direction. A positive crossing of +// StageFocused means that the app has gained the focus. A negative crossing +// means it has lost the focus. +// +// See the golang.org/x/mobile/app package for details on the event model. +package lifecycle // import "fyne.io/fyne/v2/internal/driver/mobile/event/lifecycle" + +import ( + "fmt" +) + +// Cross is whether a lifecycle stage was crossed. +type Cross uint32 + +func (c Cross) String() string { + switch c { + case CrossOn: + return "on" + case CrossOff: + return "off" + } + return "none" +} + +// All possible cross of a lifecycle. +const ( + CrossNone Cross = 0 + CrossOn Cross = 1 + CrossOff Cross = 2 +) + +// Event is a lifecycle change from an old stage to a new stage. +type Event struct { + From, To Stage + + // DrawContext is the state used for painting, if any is valid. + // + // For OpenGL apps, a non-nil DrawContext is a gl.Context. + // + // TODO: make this an App method if we move away from an event channel? + DrawContext any +} + +func (e Event) String() string { + return fmt.Sprintf("lifecycle.Event{From:%v, To:%v, DrawContext:%v}", e.From, e.To, e.DrawContext) +} + +// Crosses reports whether the transition from From to To crosses the stage s: +// - It returns CrossOn if it does, and the lifecycle change is positive. +// - It returns CrossOff if it does, and the lifecycle change is negative. +// - Otherwise, it returns CrossNone. +// +// See the documentation for Stage for more discussion of positive and negative +// crosses. +func (e Event) Crosses(s Stage) Cross { + switch { + case e.From < s && e.To >= s: + return CrossOn + case e.From >= s && e.To < s: + return CrossOff + } + return CrossNone +} + +// Stage is a stage in the app's lifecycle. The values are ordered, so that a +// lifecycle change from stage From to stage To implicitly crosses every stage +// in the range (min, max], exclusive on the low end and inclusive on the high +// end, where min is the minimum of From and To, and max is the maximum. +// +// The documentation for individual stages talk about positive and negative +// crosses. A positive lifecycle change is one where its From stage is less +// than its To stage. Similarly, a negative lifecycle change is one where From +// is greater than To. Thus, a positive lifecycle change crosses every stage in +// the range (From, To] in increasing order, and a negative lifecycle change +// crosses every stage in the range (To, From] in decreasing order. +type Stage uint32 + +// TODO: how does iOS map to these stages? What do cross-platform mobile +// abstractions do? + +const ( + // StageDead is the zero stage. No lifecycle change crosses this stage, + // but: + // - A positive change from this stage is the very first lifecycle change. + // - A negative change to this stage is the very last lifecycle change. + StageDead Stage = iota + + // StageAlive means that the app is alive. + // - A positive cross means that the app has been created. + // - A negative cross means that the app is being destroyed. + // Each cross, either from or to StageDead, will occur only once. + // On Android, these correspond to onCreate and onDestroy. + StageAlive + + // StageVisible means that the app window is visible. + // - A positive cross means that the app window has become visible. + // - A negative cross means that the app window has become invisible. + // On Android, these correspond to onStart and onStop. + // On Desktop, an app window can become invisible if e.g. it is minimized, + // unmapped, or not on a visible workspace. + StageVisible + + // StageFocused means that the app window has the focus. + // - A positive cross means that the app window has gained the focus. + // - A negative cross means that the app window has lost the focus. + // On Android, these correspond to onResume and onFreeze. + StageFocused +) + +func (s Stage) String() string { + switch s { + case StageDead: + return "StageDead" + case StageAlive: + return "StageAlive" + case StageVisible: + return "StageVisible" + case StageFocused: + return "StageFocused" + default: + return fmt.Sprintf("lifecycle.Stage(%d)", s) + } +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/event/paint/paint.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/event/paint/paint.go new file mode 100644 index 0000000..933b7fe --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/event/paint/paint.go @@ -0,0 +1,27 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package paint defines an event for the app being ready to paint. +// +// See the golang.org/x/mobile/app package for details on the event model. +package paint // import "fyne.io/fyne/v2/internal/driver/mobile/event/paint" + +// Event indicates that the app is ready to paint the next frame of the GUI. +// +// A frame is completed by calling the App's Publish method. +type Event struct { + // External is true for paint events sent by the screen driver. + // + // An external event may be sent at any time in response to an + // operating system event, for example the window opened, was + // resized, or the screen memory was lost. + // + // Programs actively drawing to the screen as fast as vsync allows + // should ignore external paint events to avoid a backlog of paint + // events building up. + External bool + + // Window specifies a native handle for the window being painted into. + Window uintptr +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/event/size/size.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/event/size/size.go new file mode 100644 index 0000000..3e951ee --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/event/size/size.go @@ -0,0 +1,98 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package size defines an event for the dimensions, physical resolution and +// orientation of the app's window. +// +// See the golang.org/x/mobile/app package for details on the event model. +package size // import "fyne.io/fyne/v2/internal/driver/mobile/event/size" + +import ( + "image" +) + +// Event holds the dimensions, physical resolution and orientation of the app's +// window. +type Event struct { + // WidthPx and HeightPx are the window's dimensions in pixels. + WidthPx, HeightPx int + + // WidthPt and HeightPt are the window's physical dimensions in points + // (1/72 of an inch). + // + // The values are based on PixelsPerPt and are therefore approximate, as + // per the comment on PixelsPerPt. + WidthPt, HeightPt float32 + + // PixelsPerPt is the window's physical resolution. It is the number of + // pixels in a single float32. + // + // There are a wide variety of pixel densities in existing phones and + // tablets, so apps should be written to expect various non-integer + // PixelsPerPt values. + // + // The value is approximate, in that the OS, drivers or hardware may report + // approximate or quantized values. An N x N pixel square should be roughly + // 1 square inch for N = int(PixelsPerPt * 72), although different square + // lengths (in pixels) might be closer to 1 inch in practice. Nonetheless, + // this PixelsPerPt value should be consistent with e.g. the ratio of + // WidthPx to WidthPt. + PixelsPerPt float32 + + // Orientation is the orientation of the device screen. + Orientation Orientation + + // InsetTopPx, InsetBottomPx, InsetLeftPx and InsetRightPx define the size of any border area in pixels. + // These values define how far in from the screen edge any controls should be drawn. + // The inset can be caused by status bars, button overlays or devices cutouts. + InsetTopPx, InsetBottomPx, InsetLeftPx, InsetRightPx int + + // DarkMode is set to true if this window is currently shown in the OS configured dark / night mode. + DarkMode bool +} + +// Size returns the window's size in pixels, at the time this size event was +// sent. +func (e Event) Size() image.Point { + return image.Point{e.WidthPx, e.HeightPx} +} + +// Bounds returns the window's bounds in pixels, at the time this size event +// was sent. +// +// The top-left pixel is always (0, 0). The bottom-right pixel is given by the +// width and height. +func (e Event) Bounds() image.Rectangle { + return image.Rectangle{Max: image.Point{e.WidthPx, e.HeightPx}} +} + +// Orientation is the orientation of the device screen. +type Orientation int + +const ( + // OrientationUnknown means device orientation cannot be determined. + // + // Equivalent on Android to Configuration.ORIENTATION_UNKNOWN + // and on iOS to: + // UIDeviceOrientationUnknown + // UIDeviceOrientationFaceUp + // UIDeviceOrientationFaceDown + OrientationUnknown Orientation = iota + + // OrientationPortrait is a device oriented so it is tall and thin. + // + // Equivalent on Android to Configuration.ORIENTATION_PORTRAIT + // and on iOS to: + // UIDeviceOrientationPortrait + // UIDeviceOrientationPortraitUpsideDown + OrientationPortrait + + // OrientationLandscape is a device oriented so it is short and wide. + // + // Equivalent on Android to Configuration.ORIENTATION_LANDSCAPE + // and on iOS to: + // UIDeviceOrientationLandscapeLeft + // UIDeviceOrientationLandscapeRight + OrientationLandscape +) diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/event/touch/touch.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/event/touch/touch.go new file mode 100644 index 0000000..c03e0b0 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/event/touch/touch.go @@ -0,0 +1,72 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package touch defines an event for touch input. +// +// See the golang.org/x/mobile/app package for details on the event model. +package touch // import "fyne.io/fyne/v2/internal/driver/mobile/event/touch" + +// The best source on android input events is the NDK: include/android/input.h +// +// iOS event handling guide: +// https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS + +import ( + "fmt" +) + +// Event is a touch event. +type Event struct { + // X and Y are the touch location, in pixels. + X, Y float32 + + // Sequence is the sequence number. The same number is shared by all events + // in a sequence. A sequence begins with a single TypeBegin, is followed by + // zero or more TypeMoves, and ends with a single TypeEnd. A Sequence + // distinguishes concurrent sequences but its value is subsequently reused. + Sequence Sequence + + // Type is the touch type. + Type Type +} + +// Sequence identifies a sequence of touch events. +type Sequence int64 + +// Type describes the type of a touch event. +type Type byte + +const ( + // TypeBegin is a user first touching the device. + // + // On Android, this is a AMOTION_EVENT_ACTION_DOWN. + // On iOS, this is a call to touchesBegan. + TypeBegin Type = iota + + // TypeMove is a user dragging across the device. + // + // A TypeMove is delivered between a TypeBegin and TypeEnd. + // + // On Android, this is a AMOTION_EVENT_ACTION_MOVE. + // On iOS, this is a call to touchesMoved. + TypeMove + + // TypeEnd is a user no longer touching the device. + // + // On Android, this is a AMOTION_EVENT_ACTION_UP. + // On iOS, this is a call to touchesEnded. + TypeEnd +) + +func (t Type) String() string { + switch t { + case TypeBegin: + return "begin" + case TypeMove: + return "move" + case TypeEnd: + return "end" + } + return fmt.Sprintf("touch.Type(%d)", t) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/file.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/file.go new file mode 100644 index 0000000..6f3d2a4 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/file.go @@ -0,0 +1,137 @@ +package mobile + +import ( + "io" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/driver/mobile/app" + "fyne.io/fyne/v2/storage" +) + +type fileOpen struct { + io.ReadCloser + uri fyne.URI + done func() +} + +func (f *fileOpen) URI() fyne.URI { + return f.uri +} + +func fileReaderForURI(u fyne.URI) (fyne.URIReadCloser, error) { + file := &fileOpen{uri: u} + read, err := nativeFileOpen(file) + if read == nil { + return nil, err + } + file.ReadCloser = read + return file, err +} + +func mobileFilter(filter storage.FileFilter) *app.FileFilter { + mobile := &app.FileFilter{} + + if f, ok := filter.(*storage.MimeTypeFileFilter); ok { + mobile.MimeTypes = f.MimeTypes + } else if f, ok := filter.(*storage.ExtensionFileFilter); ok { + mobile.Extensions = f.Extensions + } else if filter != nil { + fyne.LogError("Custom filter types not supported on mobile", nil) + } + + return mobile +} + +type hasOpenPicker interface { + ShowFileOpenPicker(func(string, func()), *app.FileFilter) +} + +// ShowFileOpenPicker loads the native file open dialog and returns the chosen file path via the callback func. +func ShowFileOpenPicker(callback func(fyne.URIReadCloser, error), filter storage.FileFilter) { + drv := fyne.CurrentApp().Driver().(*driver) + if a, ok := drv.app.(hasOpenPicker); ok { + a.ShowFileOpenPicker(func(uri string, closer func()) { + if uri == "" { + callback(nil, nil) + return + } + f, err := fileReaderForURI(nativeURI(uri)) + if f != nil { + f.(*fileOpen).done = closer + } + callback(f, err) + }, mobileFilter(filter)) + } +} + +// ShowFolderOpenPicker loads the native folder open dialog and calls back the chosen directory path as a ListableURI. +func ShowFolderOpenPicker(callback func(fyne.ListableURI, error)) { + filter := storage.NewMimeTypeFileFilter([]string{"application/x-directory"}) + drv := fyne.CurrentApp().Driver().(*driver) + if a, ok := drv.app.(hasOpenPicker); ok { + a.ShowFileOpenPicker(func(path string, _ func()) { + if path == "" { + callback(nil, nil) + return + } + + uri, err := storage.ParseURI(path) + if err != nil { + callback(nil, err) + return + } + + callback(listerForURI(uri)) + }, mobileFilter(filter)) + } +} + +type fileSave struct { + io.WriteCloser + uri fyne.URI + done func() +} + +func (f *fileSave) URI() fyne.URI { + return f.uri +} + +func fileWriterForURI(u fyne.URI, truncate bool) (fyne.URIWriteCloser, error) { + file := &fileSave{uri: u} + write, err := nativeFileSave(file, truncate) + if write == nil { + return nil, err + } + file.WriteCloser = write + return file, err +} + +type hasSavePicker interface { + ShowFileSavePicker(func(string, func()), *app.FileFilter, string) +} + +// ShowFileSavePicker loads the native file save dialog and returns the chosen file path via the callback func. +func ShowFileSavePicker(callback func(fyne.URIWriteCloser, error), filter storage.FileFilter, filename string) { + drv := fyne.CurrentApp().Driver().(*driver) + if a, ok := drv.app.(hasSavePicker); ok { + a.ShowFileSavePicker(func(path string, closer func()) { + if path == "" { + callback(nil, nil) + return + } + + uri, err := storage.ParseURI(path) + if err != nil { + callback(nil, err) + return + } + + // TODO: does the save dialog want to truncate by default? + f, err := fileWriterForURI(uri, true) + if f != nil { + f.(*fileSave).done = closer + } + callback(f, err) + }, mobileFilter(filter), filename) + } +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/file_android.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/file_android.go new file mode 100644 index 0000000..095b5bf --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/file_android.go @@ -0,0 +1,180 @@ +//go:build android + +package mobile + +/* +#cgo LDFLAGS: -landroid -llog + +#include +#include + +bool deleteURI(uintptr_t jni_env, uintptr_t ctx, char* uriCstr); +bool existsURI(uintptr_t jni_env, uintptr_t ctx, char* uriCstr); +void* openStream(uintptr_t jni_env, uintptr_t ctx, char* uriCstr); +char* readStream(uintptr_t jni_env, uintptr_t ctx, void* stream, int len, int* total); +void* saveStream(uintptr_t jni_env, uintptr_t ctx, char* uriCstr, bool truncate); +void writeStream(uintptr_t jni_env, uintptr_t ctx, void* stream, char* data, int len); +void closeStream(uintptr_t jni_env, uintptr_t ctx, void* stream); +*/ +import "C" + +import ( + "errors" + "io" + "os" + "unsafe" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/driver/mobile/app" + "fyne.io/fyne/v2/storage" + "fyne.io/fyne/v2/storage/repository" +) + +type javaStream struct { + stream unsafe.Pointer // java.io.InputStream +} + +// Declare conformity to ReadCloser interface +var _ io.ReadCloser = (*javaStream)(nil) + +func (s *javaStream) Read(p []byte) (int, error) { + count := 0 + err := app.RunOnJVM(func(_, env, ctx uintptr) error { + cCount := C.int(0) + cBytes := unsafe.Pointer(C.readStream(C.uintptr_t(env), C.uintptr_t(ctx), s.stream, C.int(len(p)), &cCount)) + if cCount == -1 { + return io.EOF + } + defer C.free(cBytes) + count = int(cCount) // avoid sending -1 instead of 0 on completion + + bytes := C.GoBytes(cBytes, cCount) + for i := 0; i < int(count); i++ { + p[i] = bytes[i] + } + return nil + }) + + return int(count), err +} + +func (s *javaStream) Close() error { + app.RunOnJVM(func(_, env, ctx uintptr) error { + C.closeStream(C.uintptr_t(env), C.uintptr_t(ctx), s.stream) + + return nil + }) + + return nil +} + +func openStream(uri string) unsafe.Pointer { + uriStr := C.CString(uri) + defer C.free(unsafe.Pointer(uriStr)) + + var stream unsafe.Pointer + app.RunOnJVM(func(_, env, ctx uintptr) error { + streamPtr := C.openStream(C.uintptr_t(env), C.uintptr_t(ctx), uriStr) + if streamPtr == C.NULL { + return os.ErrNotExist + } + + stream = unsafe.Pointer(streamPtr) + return nil + }) + return stream +} + +func nativeFileOpen(f *fileOpen) (io.ReadCloser, error) { + if f.uri == nil || f.uri.String() == "" { + return nil, nil + } + + ret := openStream(f.uri.String()) + if ret == nil { + return nil, storage.ErrNotExists + } + + stream := &javaStream{} + stream.stream = ret + return stream, nil +} + +func saveStream(uri string, truncate bool) unsafe.Pointer { + uriStr := C.CString(uri) + defer C.free(unsafe.Pointer(uriStr)) + + var stream unsafe.Pointer + app.RunOnJVM(func(_, env, ctx uintptr) error { + streamPtr := C.saveStream(C.uintptr_t(env), C.uintptr_t(ctx), uriStr, C.bool(truncate)) + if streamPtr == C.NULL { + return os.ErrNotExist + } + + stream = unsafe.Pointer(streamPtr) + return nil + }) + return stream +} + +func nativeFileSave(f *fileSave, truncate bool) (io.WriteCloser, error) { + if f.uri == nil || f.uri.String() == "" { + return nil, nil + } + + ret := saveStream(f.uri.String(), truncate) + if ret == nil { + return nil, storage.ErrNotExists + } + + stream := &javaStream{} + stream.stream = ret + return stream, nil +} + +// Declare conformity to WriteCloser interface +var _ io.WriteCloser = (*javaStream)(nil) + +func (s *javaStream) Write(p []byte) (int, error) { + err := app.RunOnJVM(func(_, env, ctx uintptr) error { + C.writeStream(C.uintptr_t(env), C.uintptr_t(ctx), s.stream, (*C.char)(C.CBytes(p)), C.int(len(p))) + return nil + }) + + return len(p), err +} + +func deleteURI(u fyne.URI) error { + uriStr := C.CString(u.String()) + defer C.free(unsafe.Pointer(uriStr)) + + ok := false + app.RunOnJVM(func(_, env, ctx uintptr) error { + ok = bool(C.deleteURI(C.uintptr_t(env), C.uintptr_t(ctx), uriStr)) + return nil + }) + + if !ok { + return errors.New("failed to delete file " + u.String()) + } + return nil +} + +func existsURI(uri fyne.URI) (bool, error) { + uriStr := C.CString(uri.String()) + defer C.free(unsafe.Pointer(uriStr)) + + ok := false + app.RunOnJVM(func(_, env, ctx uintptr) error { + ok = bool(C.existsURI(C.uintptr_t(env), C.uintptr_t(ctx), uriStr)) + return nil + }) + + return ok, nil +} + +func registerRepository(d *driver) { + repo := &mobileFileRepo{} + repository.Register("file", repo) + repository.Register("content", repo) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/file_desktop.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/file_desktop.go new file mode 100644 index 0000000..aac22de --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/file_desktop.go @@ -0,0 +1,35 @@ +//go:build !ios && !android + +package mobile + +import ( + "io" + + "fyne.io/fyne/v2" + intRepo "fyne.io/fyne/v2/internal/repository" + "fyne.io/fyne/v2/storage/repository" +) + +func deleteURI(_ fyne.URI) error { + // no-op as we use the internal FileRepository + return nil +} + +func existsURI(fyne.URI) (bool, error) { + // no-op as we use the internal FileRepository + return false, nil +} + +func nativeFileOpen(*fileOpen) (io.ReadCloser, error) { + // no-op as we use the internal FileRepository + return nil, nil +} + +func nativeFileSave(*fileSave, bool) (io.WriteCloser, error) { + // no-op as we use the internal FileRepository + return nil, nil +} + +func registerRepository(_ *driver) { + repository.Register("file", intRepo.NewFileRepository()) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/file_ios.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/file_ios.go new file mode 100644 index 0000000..7e64c89 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/file_ios.go @@ -0,0 +1,158 @@ +//go:build ios + +package mobile + +/* +#cgo CFLAGS: -x objective-c +#cgo LDFLAGS: -framework Foundation + +#import +#import + +void iosDeletePath(const char* path); +bool iosExistsPath(const char* path); +void* iosParseUrl(const char* url); +const void* iosReadFromURL(void* url, int* len); + +const void* iosOpenFileWriter(void* url, bool truncate); +void iosCloseFileWriter(void* handle); +const int iosWriteToFile(void* handle, const void* bytes, int len); +*/ +import "C" + +import ( + "errors" + "io" + "unsafe" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/storage/repository" +) + +type secureReadCloser struct { + url unsafe.Pointer + closer func() + + data []byte + offset int +} + +// Declare conformity to ReadCloser interface +var _ io.ReadCloser = (*secureReadCloser)(nil) + +func (s *secureReadCloser) Read(p []byte) (int, error) { + if s.data == nil { + var length C.int + s.data = C.GoBytes(C.iosReadFromURL(s.url, &length), length) + } + + count := len(p) + remain := len(s.data) - s.offset + var err error + if count >= remain { + count = remain + err = io.EOF + } + + newOffset := s.offset + count + + o := 0 + for i := s.offset; i < newOffset; i++ { + p[o] = s.data[i] + o++ + } + s.offset = newOffset + return count, err +} + +func (s *secureReadCloser) Close() error { + if s.closer != nil { + s.closer() + } + s.url = nil + return nil +} + +type secureWriteCloser struct { + handle unsafe.Pointer + closer func() + + offset int +} + +// Declare conformity to WriteCloser interface +var _ io.WriteCloser = (*secureWriteCloser)(nil) + +func (s *secureWriteCloser) Write(p []byte) (int, error) { + count := int(C.iosWriteToFile(s.handle, C.CBytes(p), C.int(len(p)))) + s.offset += count + + return count, nil +} + +func (s *secureWriteCloser) Close() error { + if s.closer != nil { + s.closer() + } + C.iosCloseFileWriter(s.handle) + s.handle = nil + return nil +} + +func deleteURI(u fyne.URI) error { + if u.Scheme() != "file" { + return errors.New("cannot delete from " + u.Scheme() + " scheme on iOS") + } + + cStr := C.CString(u.Path()) + defer C.free(unsafe.Pointer(cStr)) + + C.iosDeletePath(cStr) + return nil +} + +func existsURI(u fyne.URI) (bool, error) { + if u.Scheme() != "file" { + return true, errors.New("cannot check existence of " + u.Scheme() + " scheme on iOS") + } + + cStr := C.CString(u.Path()) + defer C.free(unsafe.Pointer(cStr)) + + exists := C.iosExistsPath(cStr) + return bool(exists), nil +} + +func nativeFileOpen(f *fileOpen) (io.ReadCloser, error) { + if f.uri == nil || f.uri.String() == "" { + return nil, nil + } + + cStr := C.CString(f.uri.String()) + defer C.free(unsafe.Pointer(cStr)) + + url := C.iosParseUrl(cStr) + + fileStruct := &secureReadCloser{url: url, closer: f.done} + return fileStruct, nil +} + +func nativeFileSave(f *fileSave, truncate bool) (io.WriteCloser, error) { + if f.uri == nil || f.uri.String() == "" { + return nil, nil + } + + cStr := C.CString(f.uri.String()) + defer C.free(unsafe.Pointer(cStr)) + + url := C.iosParseUrl(cStr) + + handle := C.iosOpenFileWriter(url, C.bool(truncate)) + fileStruct := &secureWriteCloser{handle: handle, closer: f.done} + return fileStruct, nil +} + +func registerRepository(d *driver) { + repo := &mobileFileRepo{} + repository.Register("file", repo) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/file_ios.m b/vendor/fyne.io/fyne/v2/internal/driver/mobile/file_ios.m new file mode 100644 index 0000000..01498ac --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/file_ios.m @@ -0,0 +1,62 @@ +//go:build ios + +#import + +#import + +void iosDeletePath(const char* path) { + NSString *pathStr = [NSString stringWithUTF8String:path]; + [[NSFileManager defaultManager] removeItemAtPath:pathStr error:nil]; +} + +bool iosExistsPath(const char* path) { + NSString *pathStr = [NSString stringWithUTF8String:path]; + return [[NSFileManager defaultManager] fileExistsAtPath:pathStr]; +} + +void* iosParseUrl(const char* url) { + NSString *urlStr = [NSString stringWithUTF8String:url]; + return [NSURL URLWithString:urlStr]; +} + +const void* iosReadFromURL(void* urlPtr, int* len) { + NSURL* url = (NSURL*)urlPtr; + NSData* data = [NSData dataWithContentsOfURL:url]; + + *len = data.length; + return data.bytes; +} + +const void* iosOpenFileWriter(void* urlPtr, bool truncate) { + NSURL* url = (NSURL*)urlPtr; + + if (truncate || ![[NSFileManager defaultManager] fileExistsAtPath:url.path]) { + [[NSFileManager defaultManager] createFileAtPath:url.path contents:nil attributes:nil]; + } + + NSError *err = nil; + // TODO handle error + NSFileHandle* handle = [NSFileHandle fileHandleForWritingToURL:url error:&err]; + + if (!truncate) { + [handle seekToEndOfFile]; + } + + return handle; +} + +void iosCloseFileWriter(void* handlePtr) { + NSFileHandle* handle = (NSFileHandle*)handlePtr; + + [handle synchronizeFile]; + [handle closeFile]; +} + + +const int iosWriteToFile(void* handlePtr, const void* bytes, int len) { + NSFileHandle* handle = (NSFileHandle*)handlePtr; + NSData *data = [NSData dataWithBytes:bytes length:len]; + + [handle writeData:data]; + return data.length; +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/folder.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/folder.go new file mode 100644 index 0000000..4e5dba0 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/folder.go @@ -0,0 +1,23 @@ +package mobile + +import ( + "errors" + + "fyne.io/fyne/v2" +) + +type lister struct { + fyne.URI +} + +func (l *lister) List() ([]fyne.URI, error) { + return listURI(l) +} + +func listerForURI(uri fyne.URI) (fyne.ListableURI, error) { + if !canListURI(uri) { + return nil, errors.New("specified URI is not listable") + } + + return &lister{uri}, nil +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/folder_android.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/folder_android.go new file mode 100644 index 0000000..c42844e --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/folder_android.go @@ -0,0 +1,75 @@ +//go:build android + +package mobile + +/* +#cgo LDFLAGS: -landroid -llog -lEGL -lGLESv2 + +#include +#include + +bool canListURI(uintptr_t jni_env, uintptr_t ctx, char* uriCstr); +bool createListableURI(uintptr_t jni_env, uintptr_t ctx, char* uriCstr); +char *listURI(uintptr_t jni_env, uintptr_t ctx, char* uriCstr); +*/ +import "C" + +import ( + "errors" + "strings" + "unsafe" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/driver/mobile/app" + "fyne.io/fyne/v2/storage" +) + +func canListURI(uri fyne.URI) bool { + uriStr := C.CString(uri.String()) + defer C.free(unsafe.Pointer(uriStr)) + listable := false + + app.RunOnJVM(func(_, env, ctx uintptr) error { + listable = bool(C.canListURI(C.uintptr_t(env), C.uintptr_t(ctx), uriStr)) + return nil + }) + + return listable +} + +func createListableURI(uri fyne.URI) error { + uriStr := C.CString(uri.String()) + defer C.free(unsafe.Pointer(uriStr)) + + ok := false + app.RunOnJVM(func(_, env, ctx uintptr) error { + ok = bool(C.createListableURI(C.uintptr_t(env), C.uintptr_t(ctx), uriStr)) + return nil + }) + + if ok { + return nil + } + return errors.New("failed to create directory") +} + +func listURI(uri fyne.URI) ([]fyne.URI, error) { + uriStr := C.CString(uri.String()) + defer C.free(unsafe.Pointer(uriStr)) + + var str *C.char + app.RunOnJVM(func(_, env, ctx uintptr) error { + str = C.listURI(C.uintptr_t(env), C.uintptr_t(ctx), uriStr) + return nil + }) + + parts := strings.Split(C.GoString(str), "|") + var list []fyne.URI + for _, part := range parts { + if len(part) == 0 { + continue + } + list = append(list, storage.NewURI(part)) + } + return list, nil +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/folder_desktop.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/folder_desktop.go new file mode 100644 index 0000000..33badb1 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/folder_desktop.go @@ -0,0 +1,22 @@ +//go:build !ios && !android + +package mobile + +import ( + "fyne.io/fyne/v2" +) + +func canListURI(fyne.URI) bool { + // no-op as we use the internal FileRepository + return false +} + +func createListableURI(fyne.URI) error { + // no-op as we use the internal FileRepository + return nil +} + +func listURI(fyne.URI) ([]fyne.URI, error) { + // no-op as we use the internal FileRepository + return nil, nil +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/folder_ios.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/folder_ios.go new file mode 100644 index 0000000..ba72828 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/folder_ios.go @@ -0,0 +1,59 @@ +//go:build ios + +package mobile + +/* +#cgo CFLAGS: -x objective-c +#cgo LDFLAGS: -framework Foundation + +#import +#import + +bool iosCanList(const char* url); +bool iosCreateListable(const char* url); +char* iosList(const char* url); +*/ +import "C" + +import ( + "errors" + "strings" + "unsafe" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/storage" +) + +func canListURI(uri fyne.URI) bool { + uriStr := C.CString(uri.String()) + defer C.free(unsafe.Pointer(uriStr)) + + return bool(C.iosCanList(uriStr)) +} + +func createListableURI(uri fyne.URI) error { + uriStr := C.CString(uri.String()) + defer C.free(unsafe.Pointer(uriStr)) + + ok := bool(C.iosCreateListable(uriStr)) + if ok { + return nil + } + return errors.New("failed to create directory") +} + +func listURI(uri fyne.URI) ([]fyne.URI, error) { + uriStr := C.CString(uri.String()) + defer C.free(unsafe.Pointer(uriStr)) + + str := C.iosList(uriStr) + parts := strings.Split(C.GoString(str), "|") + var list []fyne.URI + for _, part := range parts { + if len(part) == 0 { + continue + } + list = append(list, storage.NewURI(part)) + } + return list, nil +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/folder_ios.m b/vendor/fyne.io/fyne/v2/internal/driver/mobile/folder_ios.m new file mode 100644 index 0000000..d8b890c --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/folder_ios.m @@ -0,0 +1,29 @@ +//go:build ios + +#import + +#import + +NSArray *listForURL(const char* urlCstr) { + NSString *urlStr = [NSString stringWithUTF8String:urlCstr]; + NSURL *url = [NSURL URLWithString:urlStr]; + + return [[NSFileManager defaultManager] contentsOfDirectoryAtURL:url includingPropertiesForKeys:nil options:0 error:nil]; +} + +bool iosCanList(const char* url) { + return listForURL(url) != nil; +} + +bool iosCreateListable(const char* urlCstr) { + NSString *urlStr = [NSString stringWithUTF8String:urlCstr]; + NSURL *url = [NSURL URLWithString:urlStr]; + + return [[NSFileManager defaultManager] createDirectoryAtURL:url withIntermediateDirectories:YES attributes:nil error:nil]; +} + +char* iosList(const char* url) { + NSArray *children = listForURL(url); + + return (char *) [[children componentsJoinedByString:@"|"] UTF8String]; +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/consts.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/consts.go new file mode 100644 index 0000000..b6be0e0 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/consts.go @@ -0,0 +1,80 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package gl + +/* +Partially generated from the Khronos OpenGL API specification in XML +format, which is covered by the license: + + Copyright (c) 2013-2014 The Khronos Group Inc. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and/or associated documentation files (the + "Materials"), to deal in the Materials without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Materials, and to + permit persons to whom the Materials are furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Materials. + + THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. + +*/ + +// Contains Khronos OpenGL API specification constants. +const ( + False = 0 + True = 1 + One = 1 + Triangles = 0x0004 + TriangleStrip = 0x0005 + SrcAlpha = 0x0302 + OneMinusSrcAlpha = 0x0303 + Front = 0x0404 + DepthTest = 0x0B71 + Blend = 0x0BE2 + ScissorTest = 0x0C11 + Texture2D = 0x0DE1 + + UnsignedByte = 0x1401 + Float = 0x1406 + RED = 0x1903 + RGBA = 0x1908 + + Nearest = 0x2600 + Linear = 0x2601 + TextureMagFilter = 0x2800 + TextureMinFilter = 0x2801 + TextureWrapS = 0x2802 + TextureWrapT = 0x2803 + + ConstantAlpha = 0x8003 + OneMinusConstantAlpha = 0x8004 + ClampToEdge = 0x812F + Texture0 = 0x84C0 + StaticDraw = 0x88E4 + DynamicDraw = 0x88E8 + FragmentShader = 0x8B30 + VertexShader = 0x8B31 + AttachedShaders = 0x8B85 + ActiveUniformMaxLength = 0x8B87 + ActiveAttributeMaxLength = 0x8B8A + ArrayBuffer = 0x8892 + CompileStatus = 0x8B81 + LinkStatus = 0x8B82 + InfoLogLength = 0x8B84 + ShaderSourceLength = 0x8B88 + + DepthBufferBit = 0x00000100 + ColorBufferBit = 0x00004000 +) diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/dll_windows.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/dll_windows.go new file mode 100644 index 0000000..a7f32a6 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/dll_windows.go @@ -0,0 +1,242 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package gl + +import ( + "archive/tar" + "compress/gzip" + "debug/pe" + "fmt" + "io" + "log" + "net/http" + "os" + "path/filepath" + "runtime" +) + +var debug = log.New(io.Discard, "gl: ", log.LstdFlags) + +func downloadDLLs() (path string, err error) { + url := "https://dl.google.com/go/mobile/angle-bd3f8780b-" + runtime.GOARCH + ".tgz" + debug.Printf("downloading %s", url) + resp, err := http.Get(url) + if err != nil { + return "", fmt.Errorf("gl: %v", err) + } + defer func() { + err2 := resp.Body.Close() + if err == nil && err2 != nil { + err = fmt.Errorf("gl: error reading body from %v: %v", url, err2) + } + }() + if resp.StatusCode != http.StatusOK { + err := fmt.Errorf("gl: error fetching %v, status: %v", url, resp.Status) + return "", err + } + + r, err := gzip.NewReader(resp.Body) + if err != nil { + return "", fmt.Errorf("gl: error reading gzip from %v: %v", url, err) + } + tr := tar.NewReader(r) + var bytesGLESv2, bytesEGL, bytesD3DCompiler []byte + for { + header, err := tr.Next() + if err == io.EOF { + break + } + if err != nil { + return "", fmt.Errorf("gl: error reading tar from %v: %v", url, err) + } + switch header.Name { + case "angle-" + runtime.GOARCH + "/libglesv2.dll": + bytesGLESv2, err = io.ReadAll(tr) + case "angle-" + runtime.GOARCH + "/libegl.dll": + bytesEGL, err = io.ReadAll(tr) + case "angle-" + runtime.GOARCH + "/d3dcompiler_47.dll": + bytesD3DCompiler, err = io.ReadAll(tr) + default: // skip + } + if err != nil { + return "", fmt.Errorf("gl: error reading %v from %v: %v", header.Name, url, err) + } + } + if len(bytesGLESv2) == 0 || len(bytesEGL) == 0 || len(bytesD3DCompiler) == 0 { + return "", fmt.Errorf("gl: did not find all DLLs in %v", url) + } + + writeDLLs := func(path string) error { + if err := os.WriteFile(filepath.Join(path, "libglesv2.dll"), bytesGLESv2, 0o755); err != nil { + return fmt.Errorf("gl: cannot install ANGLE: %v", err) + } + if err := os.WriteFile(filepath.Join(path, "libegl.dll"), bytesEGL, 0o755); err != nil { + return fmt.Errorf("gl: cannot install ANGLE: %v", err) + } + if err := os.WriteFile(filepath.Join(path, "d3dcompiler_47.dll"), bytesD3DCompiler, 0o755); err != nil { + return fmt.Errorf("gl: cannot install ANGLE: %v", err) + } + return nil + } + + // First, we attempt to install these DLLs in LOCALAPPDATA/Shiny. + // + // Traditionally we would use the system32 directory, but it is + // no longer writable by normal programs. + os.MkdirAll(appdataPath(), 0o775) + if err := writeDLLs(appdataPath()); err == nil { + return appdataPath(), nil + } + debug.Printf("DLLs could not be written to %s", appdataPath()) + + // Second, install in GOPATH/pkg if it exists. + gopath := os.Getenv("GOPATH") + gopathpkg := filepath.Join(gopath, "pkg") + if _, err := os.Stat(gopathpkg); err == nil && gopath != "" { + if err := writeDLLs(gopathpkg); err == nil { + return gopathpkg, nil + } + } + debug.Printf("DLLs could not be written to GOPATH") + + // Third, pick a temporary directory. + tmp := os.TempDir() + if err := writeDLLs(tmp); err != nil { + return "", fmt.Errorf("gl: unable to install ANGLE DLLs: %v", err) + } + return tmp, nil +} + +func appdataPath() string { + return filepath.Join(os.Getenv("LOCALAPPDATA"), "GoGL", runtime.GOARCH) +} + +func containsDLLs(dir string) bool { + compatible := func(name string) bool { + file, err := pe.Open(filepath.Join(dir, name)) + if err != nil { + return false + } + defer file.Close() + + switch file.Machine { + case pe.IMAGE_FILE_MACHINE_AMD64: + return "amd64" == runtime.GOARCH + case pe.IMAGE_FILE_MACHINE_ARM: + return "arm" == runtime.GOARCH + case pe.IMAGE_FILE_MACHINE_I386: + return "386" == runtime.GOARCH + } + return false + } + + return compatible("libglesv2.dll") && compatible("libegl.dll") && compatible("d3dcompiler_47.dll") +} + +func chromePath() string { + // dlls are stored in: + // //libglesv2.dll + + installdirs := []string{ + // Chrome User + filepath.Join(os.Getenv("LOCALAPPDATA"), "Google", "Chrome", "Application"), + // Chrome System + filepath.Join(os.Getenv("ProgramFiles(x86)"), "Google", "Chrome", "Application"), + // Chromium + filepath.Join(os.Getenv("LOCALAPPDATA"), "Chromium", "Application"), + // Chrome Canary + filepath.Join(os.Getenv("LOCALAPPDATA"), "Google", "Chrome SxS", "Application"), + } + + for _, installdir := range installdirs { + versiondirs, err := os.ReadDir(installdir) + if err != nil { + continue + } + + for _, versiondir := range versiondirs { + if !versiondir.IsDir() { + continue + } + + versionpath := filepath.Join(installdir, versiondir.Name()) + if containsDLLs(versionpath) { + return versionpath + } + } + } + + return "" +} + +func findDLLs() (err error) { + load := func(path string) (bool, error) { + if path != "" { + // don't try to start when one of the files is missing + if !containsDLLs(path) { + return false, nil + } + + LibD3DCompiler.Name = filepath.Join(path, filepath.Base(LibD3DCompiler.Name)) + LibGLESv2.Name = filepath.Join(path, filepath.Base(LibGLESv2.Name)) + LibEGL.Name = filepath.Join(path, filepath.Base(LibEGL.Name)) + } + + if err := LibGLESv2.Load(); err == nil { + if err := LibEGL.Load(); err != nil { + return false, fmt.Errorf("gl: loaded libglesv2 but not libegl: %v", err) + } + if err := LibD3DCompiler.Load(); err != nil { + return false, fmt.Errorf("gl: loaded libglesv2, libegl but not d3dcompiler: %v", err) + } + if path == "" { + debug.Printf("DLLs found") + } else { + debug.Printf("DLLs found in: %q", path) + } + return true, nil + } + + return false, nil + } + + // Look in the system directory. + if ok, err := load(""); ok || err != nil { + return err + } + + // Look in the AppData directory. + if ok, err := load(appdataPath()); ok || err != nil { + return err + } + + // Look for a Chrome installation + if dir := chromePath(); dir != "" { + if ok, err := load(dir); ok || err != nil { + return err + } + } + + // Look in GOPATH/pkg. + if ok, err := load(filepath.Join(os.Getenv("GOPATH"), "pkg")); ok || err != nil { + return err + } + + // Look in temporary directory. + if ok, err := load(os.TempDir()); ok || err != nil { + return err + } + + // Download the DLL binary. + path, err := downloadDLLs() + if err != nil { + return err + } + debug.Printf("DLLs written to %s", path) + if ok, err := load(path); !ok || err != nil { + return fmt.Errorf("gl: unable to load ANGLE after installation: %v", err) + } + return nil +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/doc.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/doc.go new file mode 100644 index 0000000..584800c --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/doc.go @@ -0,0 +1,44 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +Package gl implements Go bindings for OpenGL ES 2.0 and ES 3.0. + +The GL functions are defined on a Context object that is responsible for +tracking a GL context. Typically a windowing system package (such as +golang.org/x/exp/shiny/screen) will call NewContext and provide +a gl.Context for a user application. + +If the gl package is compiled on a platform capable of supporting ES 3.0, +the gl.Context object also implements gl.Context3. + +The bindings are deliberately minimal, staying as close the C API as +possible. The semantics of each function maps onto functions +described in the Khronos documentation: + +https://www.khronos.org/opengles/sdk/docs/man/ + +One notable departure from the C API is the introduction of types +to represent common uses of GLint: Texture, Surface, Buffer, etc. +*/ +package gl // import "fyne.io/fyne/v2/internal/driver/mobile/gl" + +/* +Implementation details. + +All GL function calls fill out a C.struct_fnargs and drop it on the work +queue. The Start function drains the work queue and hands over a batch +of calls to C.process which runs them. This allows multiple GL calls to +be executed in a single cgo call. + +A GL call is marked as blocking if it returns a value, or if it takes a +Go pointer. In this case the call will not return until C.process sends a +value on the retvalue channel. + +This implementation ensures any goroutine can make GL calls, but it does +not make the GL interface safe for simultaneous use by multiple goroutines. +For the purpose of analyzing this code for race conditions, picture two +separate goroutines: one blocked on gl.Start, and another making calls to +the gl package exported functions. +*/ diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/fn.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/fn.go new file mode 100644 index 0000000..5769cbe --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/fn.go @@ -0,0 +1,96 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package gl + +import "unsafe" + +type call struct { + args fnargs + parg unsafe.Pointer + blocking bool +} + +type fnargs struct { + fn glfn + + a0 uintptr + a1 uintptr + a2 uintptr + a3 uintptr + a4 uintptr + a5 uintptr + a6 uintptr + a7 uintptr + a8 uintptr + a9 uintptr +} + +type glfn int + +const ( + glfnUNDEFINED glfn = iota + glfnActiveTexture + glfnAttachShader + glfnBindBuffer + glfnBindTexture + glfnBindVertexArray + glfnBlendColor + glfnBlendFunc + glfnBufferData + glfnBufferSubData + glfnClear + glfnClearColor + glfnCompileShader + glfnCreateProgram + glfnCreateShader + glfnDeleteBuffer + glfnDeleteTexture + glfnDisable + glfnDrawArrays + glfnEnable + glfnEnableVertexAttribArray + glfnFlush + glfnGenBuffer + glfnGenTexture + glfnGenVertexArray + glfnGetAttribLocation + glfnGetError + glfnGetProgramInfoLog + glfnGetProgramiv + glfnGetShaderInfoLog + glfnGetShaderSource + glfnGetShaderiv + glfnGetTexParameteriv + glfnGetUniformLocation + glfnLinkProgram + glfnReadPixels + glfnScissor + glfnShaderSource + glfnTexImage2D + glfnTexParameteri + glfnUniform1f + glfnUniform2f + glfnUniform4f + glfnUniform4fv + glfnUseProgram + glfnVertexAttribPointer + glfnViewport +) + +func goString(buf []byte) string { + for i, b := range buf { + if b == 0 { + return string(buf[:i]) + } + } + panic("buf is not NUL-terminated") +} + +func glBoolean(b bool) uintptr { + if b { + return True + } + return False +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/gl.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/gl.go new file mode 100644 index 0000000..b31ae47 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/gl.go @@ -0,0 +1,561 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build darwin || linux || openbsd || freebsd || windows + +package gl + +// TODO(crawshaw): should functions on specific types become methods? E.g. +// func (t Texture) Bind(target Enum) +// this seems natural in Go, but moves us slightly +// further away from the underlying OpenGL spec. + +import ( + "math" + "unsafe" +) + +func (ctx *context) ActiveTexture(texture Enum) { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnActiveTexture, + a0: texture.c(), + }, + }) +} + +func (ctx *context) AttachShader(p Program, s Shader) { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnAttachShader, + a0: p.c(), + a1: s.c(), + }, + }) +} + +func (ctx *context) BindBuffer(target Enum, b Buffer) { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnBindBuffer, + a0: target.c(), + a1: b.c(), + }, + }) +} + +func (ctx *context) BindTexture(target Enum, t Texture) { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnBindTexture, + a0: target.c(), + a1: t.c(), + }, + }) +} + +func (ctx *context) BindVertexArray(va VertexArray) { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnBindVertexArray, + a0: va.c(), + }, + }) +} + +func (ctx *context) BlendColor(red, green, blue, alpha float32) { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnBlendColor, + a0: uintptr(math.Float32bits(red)), + a1: uintptr(math.Float32bits(green)), + a2: uintptr(math.Float32bits(blue)), + a3: uintptr(math.Float32bits(alpha)), + }, + }) +} + +func (ctx *context) BlendFunc(sfactor, dfactor Enum) { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnBlendFunc, + a0: sfactor.c(), + a1: dfactor.c(), + }, + }) +} + +func (ctx *context) BufferData(target Enum, src []byte, usage Enum) { + parg := unsafe.Pointer(nil) + if len(src) > 0 { + parg = unsafe.Pointer(&src[0]) + } + ctx.enqueue(call{ + args: fnargs{ + fn: glfnBufferData, + a0: target.c(), + a1: uintptr(len(src)), + a2: usage.c(), + }, + parg: parg, + }) +} + +func (ctx *context) BufferSubData(target Enum, src []byte) { + parg := unsafe.Pointer(nil) + if len(src) > 0 { + parg = unsafe.Pointer(&src[0]) + } + ctx.enqueue(call{ + args: fnargs{ + fn: glfnBufferSubData, + a0: target.c(), + a1: 0, + a2: uintptr(len(src)), + }, + parg: parg, + }) +} + +func (ctx *context) Clear(mask Enum) { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnClear, + a0: uintptr(mask), + }, + }) +} + +func (ctx *context) ClearColor(red, green, blue, alpha float32) { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnClearColor, + a0: uintptr(math.Float32bits(red)), + a1: uintptr(math.Float32bits(green)), + a2: uintptr(math.Float32bits(blue)), + a3: uintptr(math.Float32bits(alpha)), + }, + }) +} + +func (ctx *context) CompileShader(s Shader) { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnCompileShader, + a0: s.c(), + }, + }) +} + +func (ctx *context) CreateBuffer() Buffer { + return Buffer{Value: uint32(ctx.enqueue(call{ + args: fnargs{ + fn: glfnGenBuffer, + }, + blocking: true, + }))} +} + +func (ctx *context) CreateProgram() Program { + return Program{ + Init: true, + Value: uint32(ctx.enqueue(call{ + args: fnargs{ + fn: glfnCreateProgram, + }, + blocking: true, + }, + )), + } +} + +func (ctx *context) CreateShader(ty Enum) Shader { + return Shader{Value: uint32(ctx.enqueue(call{ + args: fnargs{ + fn: glfnCreateShader, + a0: uintptr(ty), + }, + blocking: true, + }))} +} + +func (ctx *context) CreateTexture() Texture { + return Texture{Value: uint32(ctx.enqueue(call{ + args: fnargs{ + fn: glfnGenTexture, + }, + blocking: true, + }))} +} + +func (ctx *context) CreateVertexArray() VertexArray { + return VertexArray{Value: uint32(ctx.enqueue(call{ + args: fnargs{ + fn: glfnGenVertexArray, + }, + blocking: true, + }))} +} + +func (ctx *context) DeleteBuffer(v Buffer) { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnDeleteBuffer, + a0: v.c(), + }, + }) +} + +func (ctx *context) DeleteTexture(v Texture) { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnDeleteTexture, + a0: v.c(), + }, + }) +} + +func (ctx *context) Disable(cap Enum) { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnDisable, + a0: cap.c(), + }, + }) +} + +func (ctx *context) DrawArrays(mode Enum, first, count int) { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnDrawArrays, + a0: mode.c(), + a1: uintptr(first), + a2: uintptr(count), + }, + }) +} + +func (ctx *context) Enable(cap Enum) { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnEnable, + a0: cap.c(), + }, + }) +} + +func (ctx *context) EnableVertexAttribArray(a Attrib) { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnEnableVertexAttribArray, + a0: a.c(), + }, + }) +} + +func (ctx *context) Flush() { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnFlush, + }, + blocking: true, + }) +} + +func (ctx *context) GetAttribLocation(p Program, name string) Attrib { + s, free := ctx.cString(name) + defer free() + return Attrib{Value: uint(ctx.enqueue(call{ + args: fnargs{ + fn: glfnGetAttribLocation, + a0: p.c(), + a1: s, + }, + blocking: true, + }))} +} + +func (ctx *context) GetError() Enum { + return Enum(ctx.enqueue(call{ + args: fnargs{ + fn: glfnGetError, + }, + blocking: true, + })) +} + +func (ctx *context) GetProgrami(p Program, pname Enum) int { + return int(ctx.enqueue(call{ + args: fnargs{ + fn: glfnGetProgramiv, + a0: p.c(), + a1: pname.c(), + }, + blocking: true, + })) +} + +func (ctx *context) GetProgramInfoLog(p Program) string { + infoLen := ctx.GetProgrami(p, InfoLogLength) + if infoLen == 0 { + return "" + } + buf := make([]byte, infoLen) + + ctx.enqueue(call{ + args: fnargs{ + fn: glfnGetProgramInfoLog, + a0: p.c(), + a1: uintptr(infoLen), + }, + parg: unsafe.Pointer(&buf[0]), + blocking: true, + }) + + return goString(buf) +} + +func (ctx *context) GetShaderi(s Shader, pname Enum) int { + return int(ctx.enqueue(call{ + args: fnargs{ + fn: glfnGetShaderiv, + a0: s.c(), + a1: pname.c(), + }, + blocking: true, + })) +} + +func (ctx *context) GetShaderInfoLog(s Shader) string { + infoLen := ctx.GetShaderi(s, InfoLogLength) + if infoLen == 0 { + return "" + } + buf := make([]byte, infoLen) + + ctx.enqueue(call{ + args: fnargs{ + fn: glfnGetShaderInfoLog, + a0: s.c(), + a1: uintptr(infoLen), + }, + parg: unsafe.Pointer(&buf[0]), + blocking: true, + }) + + return goString(buf) +} + +func (ctx *context) GetShaderSource(s Shader) string { + sourceLen := ctx.GetShaderi(s, ShaderSourceLength) + if sourceLen == 0 { + return "" + } + buf := make([]byte, sourceLen) + + ctx.enqueue(call{ + args: fnargs{ + fn: glfnGetShaderSource, + a0: s.c(), + a1: uintptr(sourceLen), + }, + parg: unsafe.Pointer(&buf[0]), + blocking: true, + }) + + return goString(buf) +} + +func (ctx *context) GetTexParameteriv(dst []int32, target, pname Enum) { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnGetTexParameteriv, + a0: target.c(), + a1: pname.c(), + }, + blocking: true, + }) +} + +func (ctx *context) GetUniformLocation(p Program, name string) Uniform { + s, free := ctx.cString(name) + defer free() + return Uniform{Value: int32(ctx.enqueue(call{ + args: fnargs{ + fn: glfnGetUniformLocation, + a0: p.c(), + a1: s, + }, + blocking: true, + }))} +} + +func (ctx *context) LinkProgram(p Program) { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnLinkProgram, + a0: p.c(), + }, + }) +} + +func (ctx *context) ReadPixels(dst []byte, x, y, width, height int, format, ty Enum) { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnReadPixels, + // TODO(crawshaw): support PIXEL_PACK_BUFFER in GLES3, uses offset. + a0: uintptr(x), + a1: uintptr(y), + a2: uintptr(width), + a3: uintptr(height), + a4: format.c(), + a5: ty.c(), + }, + parg: unsafe.Pointer(&dst[0]), + blocking: true, + }) +} + +func (ctx *context) Scissor(x, y, width, height int32) { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnScissor, + a0: uintptr(x), + a1: uintptr(y), + a2: uintptr(width), + a3: uintptr(height), + }, + }) +} + +func (ctx *context) ShaderSource(s Shader, src string) { + strp, free := ctx.cStringPtr(src) + defer free() + ctx.enqueue(call{ + args: fnargs{ + fn: glfnShaderSource, + a0: s.c(), + a1: 1, + a2: strp, + }, + blocking: true, + }) +} + +func (ctx *context) TexImage2D(target Enum, level int, internalFormat int, width, height int, format Enum, ty Enum, data []byte) { + // It is common to pass TexImage2D a nil data, indicating that a + // bound GL buffer is being used as the source. In that case, it + // is not necessary to block. + parg := unsafe.Pointer(nil) + if len(data) > 0 { + parg = unsafe.Pointer(&data[0]) + } + + ctx.enqueue(call{ + args: fnargs{ + fn: glfnTexImage2D, + // TODO(crawshaw): GLES3 offset for PIXEL_UNPACK_BUFFER and PIXEL_PACK_BUFFER. + a0: target.c(), + a1: uintptr(level), + a2: uintptr(internalFormat), + a3: uintptr(width), + a4: uintptr(height), + a5: format.c(), + a6: ty.c(), + }, + parg: parg, + blocking: parg != nil, + }) +} + +func (ctx *context) TexParameteri(target, pname Enum, param int) { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnTexParameteri, + a0: target.c(), + a1: pname.c(), + a2: uintptr(param), + }, + }) +} + +func (ctx *context) Uniform1f(dst Uniform, v float32) { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnUniform1f, + a0: dst.c(), + a1: uintptr(math.Float32bits(v)), + }, + }) +} + +func (ctx *context) Uniform2f(dst Uniform, v0, v1 float32) { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnUniform2f, + a0: dst.c(), + a1: uintptr(math.Float32bits(v0)), + a2: uintptr(math.Float32bits(v1)), + }, + }) +} + +func (ctx *context) Uniform4f(dst Uniform, v0, v1, v2, v3 float32) { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnUniform4f, + a0: dst.c(), + a1: uintptr(math.Float32bits(v0)), + a2: uintptr(math.Float32bits(v1)), + a3: uintptr(math.Float32bits(v2)), + a4: uintptr(math.Float32bits(v3)), + }, + }) +} + +func (ctx *context) Uniform4fv(dst Uniform, src []float32) { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnUniform4fv, + a0: dst.c(), + a1: uintptr(len(src) / 4), + }, + parg: unsafe.Pointer(&src[0]), + }) +} + +func (ctx *context) UseProgram(p Program) { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnUseProgram, + a0: p.c(), + }, + }) +} + +func (ctx *context) VertexAttribPointer(dst Attrib, size int, ty Enum, normalized bool, stride, offset int) { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnVertexAttribPointer, + a0: dst.c(), + a1: uintptr(size), + a2: ty.c(), + a3: glBoolean(normalized), + a4: uintptr(stride), + a5: uintptr(offset), + }, + }) +} + +func (ctx *context) Viewport(x, y, width, height int) { + ctx.enqueue(call{ + args: fnargs{ + fn: glfnViewport, + a0: uintptr(x), + a1: uintptr(y), + a2: uintptr(width), + a3: uintptr(height), + }, + }) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/interface.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/interface.go new file mode 100644 index 0000000..67e6841 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/interface.go @@ -0,0 +1,285 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package gl + +// Context is an OpenGL ES context. +// +// A Context has a method for every GL function supported by ES 2 or later. +// In a program compiled with ES 3 support. +// +// Calls are not safe for concurrent use. However calls can be made from +// any goroutine, the gl package removes the notion of thread-local +// context. +// +// Contexts are independent. Two contexts can be used concurrently. +type Context interface { + // ActiveTexture sets the active texture unit. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glActiveTexture.xhtml + ActiveTexture(texture Enum) + + // AttachShader attaches a shader to a program. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glAttachShader.xhtml + AttachShader(p Program, s Shader) + + // BindBuffer binds a buffer. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glBindBuffer.xhtml + BindBuffer(target Enum, b Buffer) + // BindTexture binds a texture. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glBindTexture.xhtml + BindTexture(target Enum, t Texture) + + // BindVertexArray binds a vertex array. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glBindVertexArray.xhtml + BindVertexArray(rb VertexArray) + + // BlendColor sets the blend color. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glBlendColor.xhtml + BlendColor(red, green, blue, alpha float32) + + // BlendFunc sets the pixel blending factors. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glBlendFunc.xhtml + BlendFunc(sfactor, dfactor Enum) + + // BufferData creates a new data store for the bound buffer object. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glBufferData.xhtml + BufferData(target Enum, src []byte, usage Enum) + + // BufferSubData updates the data store for a bound buffer object. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glBufferSubData.xhtml + BufferSubData(target Enum, src []byte) + + // Clear clears the window. + // + // The behavior of Clear is influenced by the pixel ownership test, + // the scissor test, dithering, and the buffer writemasks. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glClear.xhtml + Clear(mask Enum) + + // ClearColor specifies the RGBA values used to clear color buffers. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glClearColor.xhtml + ClearColor(red, green, blue, alpha float32) + + // CompileShader compiles the source code of s. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glCompileShader.xhtml + CompileShader(s Shader) + + // CreateBuffer creates a buffer object. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glGenBuffers.xhtml + CreateBuffer() Buffer + + // CreateProgram creates a new empty program object. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glCreateProgram.xhtml + CreateProgram() Program + + // CreateShader creates a new empty shader object. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glCreateShader.xhtml + CreateShader(ty Enum) Shader + + // CreateTexture creates a texture object. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glGenTextures.xhtml + CreateTexture() Texture + + // CreateTVertexArray creates a vertex array. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glGenVertexArrays.xhtml + CreateVertexArray() VertexArray + // DeleteBuffer deletes the given buffer object. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glDeleteBuffers.xhtml + DeleteBuffer(v Buffer) + + // DeleteTexture deletes the given texture object. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glDeleteTextures.xhtml + DeleteTexture(v Texture) + + // Disable disables various GL capabilities. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glDisable.xhtml + Disable(cap Enum) + + // DrawArrays renders geometric primitives from the bound data. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glDrawArrays.xhtml + DrawArrays(mode Enum, first, count int) + + // Enable enables various GL capabilities. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glEnable.xhtml + Enable(cap Enum) + + // EnableVertexAttribArray enables a vertex attribute array. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glEnableVertexAttribArray.xhtml + EnableVertexAttribArray(a Attrib) + // Flush empties all buffers. It does not block. + // + // An OpenGL implementation may buffer network communication, + // the command stream, or data inside the graphics accelerator. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glFlush.xhtml + Flush() + + // GetAttribLocation returns the location of an attribute variable. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glGetAttribLocation.xhtml + GetAttribLocation(p Program, name string) Attrib + + // GetError returns the next error. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glGetError.xhtml + GetError() Enum + + // GetProgrami returns a parameter value for a shader. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glGetProgramiv.xhtml + GetProgrami(p Program, pname Enum) int + + // GetProgramInfoLog returns the information log for a shader. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glGetProgramInfoLog.xhtml + GetProgramInfoLog(p Program) string + + // GetShaderi returns a parameter value for a shader. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glGetShaderiv.xhtml + GetShaderi(s Shader, pname Enum) int + + // GetShaderInfoLog returns the information log for a shader. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glGetShaderInfoLog.xhtml + GetShaderInfoLog(s Shader) string + + // GetUniformLocation returns the location of a uniform variable. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glGetUniformLocation.xhtml + GetUniformLocation(p Program, name string) Uniform + + // LinkProgram links the specified program. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glLinkProgram.xhtml + LinkProgram(p Program) + + // ReadPixels returns pixel data from a buffer. + // + // In GLES 3, the source buffer is controlled with ReadBuffer. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glReadPixels.xhtml + ReadPixels(dst []byte, x, y, width, height int, format, ty Enum) + + // Scissor defines the scissor box rectangle, in window coordinates. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glScissor.xhtml + Scissor(x, y, width, height int32) + + // ShaderSource sets the source code of s to the given source code. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glShaderSource.xhtml + ShaderSource(s Shader, src string) + // TexImage2D writes a 2D texture image. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glTexImage2D.xhtml + TexImage2D(target Enum, level int, internalFormat int, width, height int, format Enum, ty Enum, data []byte) + + // TexParameteri sets an integer texture parameter. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glTexParameter.xhtml + TexParameteri(target, pname Enum, param int) + + // Uniform1f writes a float uniform variable. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml + Uniform1f(dst Uniform, v float32) + + // Uniform2f writes a vec2 uniform variable. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml + Uniform2f(dst Uniform, v0, v1 float32) + + // Uniform4f writes a vec4 uniform variable. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml + Uniform4f(dst Uniform, v0, v1, v2, v3 float32) + + // Uniform4fv writes a vec4 uniform array of len(src)/4 elements. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glUniform.xhtml + Uniform4fv(dst Uniform, src []float32) + + // UseProgram sets the active program. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glUseProgram.xhtml + UseProgram(p Program) + + // VertexAttribPointer uses a bound buffer to define vertex attribute data. + // + // Direct use of VertexAttribPointer to load data into OpenGL is not + // supported via the Go bindings. Instead, use BindBuffer with an + // ARRAY_BUFFER and then fill it using BufferData. + // + // The size argument specifies the number of components per attribute, + // between 1-4. The stride argument specifies the byte offset between + // consecutive vertex attributes. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glVertexAttribPointer.xhtml + VertexAttribPointer(dst Attrib, size int, ty Enum, normalized bool, stride, offset int) + + // Viewport sets the viewport, an affine transformation that + // normalizes device coordinates to window coordinates. + // + // http://www.khronos.org/opengles/sdk/docs/man3/html/glViewport.xhtml + Viewport(x, y, width, height int) +} + +// Worker is used by display driver code to execute OpenGL calls. +// +// Typically display driver code creates a gl.Context for an application, +// and along with it establishes a locked OS thread to execute the cgo +// calls: +// +// go func() { +// runtime.LockOSThread() +// // ... platform-specific cgo call to bind a C OpenGL context +// // into thread-local storage. +// +// glctx, worker := gl.NewContext() +// workAvailable := worker.WorkAvailable() +// go userAppCode(glctx) +// for { +// select { +// case <-workAvailable: +// worker.DoWork() +// case <-drawEvent: +// // ... platform-specific cgo call to draw screen +// } +// } +// }() +// +// This interface is an internal implementation detail and should only be used +// by the package responsible for managing the screen. +type Worker interface { + // WorkAvailable returns a channel that communicates when DoWork should be + // called. + WorkAvailable() <-chan struct{} + + // DoWork performs any pending OpenGL calls. + DoWork() +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/types.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/types.go new file mode 100644 index 0000000..7ac3872 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/types.go @@ -0,0 +1,90 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build darwin || linux || openbsd || freebsd || windows + +package gl + +import "fmt" + +// Enum is equivalent to GLenum, and is normally used with one of the +// constants defined in this package. +type Enum uint32 + +// Types are defined a structs so that in debug mode they can carry +// extra information, such as a string name. See typesdebug.go. + +// Attrib identifies the location of a specific attribute variable. +type Attrib struct { + Value uint +} + +// Program identifies a compiled shader program. +type Program struct { + // Init is set by CreateProgram, as some GL drivers (in particular, + // ANGLE) return true for glIsProgram(0). + Init bool + Value uint32 +} + +// Shader identifies a GLSL shader. +type Shader struct { + Value uint32 +} + +// Buffer identifies a GL buffer object. +type Buffer struct { + Value uint32 +} + +// Framebuffer identifies a GL framebuffer. +type Framebuffer struct { + Value uint32 +} + +// A Renderbuffer is a GL object that holds an image in an internal format. +type Renderbuffer struct { + Value uint32 +} + +// A Texture identifies a GL texture unit. +type Texture struct { + Value uint32 +} + +// Uniform identifies the location of a specific uniform variable. +type Uniform struct { + Value int32 +} + +// A VertexArray is a GL object that holds vertices in an internal format. +type VertexArray struct { + Value uint32 +} + +func (v Attrib) c() uintptr { return uintptr(v.Value) } +func (v Enum) c() uintptr { return uintptr(v) } +func (v Program) c() uintptr { + if !v.Init { + ret := uintptr(0) + ret-- + return ret + } + return uintptr(v.Value) +} +func (v Shader) c() uintptr { return uintptr(v.Value) } +func (v Buffer) c() uintptr { return uintptr(v.Value) } +func (v Texture) c() uintptr { return uintptr(v.Value) } +func (v Uniform) c() uintptr { return uintptr(v.Value) } +func (v VertexArray) c() uintptr { return uintptr(v.Value) } + +func (v Attrib) String() string { return fmt.Sprintf("Attrib(%d)", v.Value) } +func (v Program) String() string { return fmt.Sprintf("Program(%d)", v.Value) } +func (v Shader) String() string { return fmt.Sprintf("Shader(%d)", v.Value) } +func (v Buffer) String() string { return fmt.Sprintf("Buffer(%d)", v.Value) } +func (v Framebuffer) String() string { return fmt.Sprintf("Framebuffer(%d)", v.Value) } +func (v Renderbuffer) String() string { return fmt.Sprintf("Renderbuffer(%d)", v.Value) } +func (v Texture) String() string { return fmt.Sprintf("Texture(%d)", v.Value) } +func (v Uniform) String() string { return fmt.Sprintf("Uniform(%d)", v.Value) } +func (v VertexArray) String() string { return fmt.Sprintf("VertexArray(%d)", v.Value) } diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/work.c b/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/work.c new file mode 100644 index 0000000..79b6bd1 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/work.c @@ -0,0 +1,181 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build darwin || linux || openbsd || freebsd + +#include +#include "_cgo_export.h" +#include "work.h" + +#if defined(GL_ES_VERSION_3_0) && GL_ES_VERSION_3_0 +#else +#include +static void gles3missing() { + printf("GLES3 function is missing\n"); + exit(2); +} +static void glBindVertexArray(GLuint array) { gles3missing(); } +static void glGenVertexArrays(GLsizei n, GLuint *arrays) { gles3missing(); } +#endif + +uintptr_t processFn(struct fnargs* args, char* parg) { + uintptr_t ret = 0; + switch (args->fn) { + case glfnUNDEFINED: + abort(); // bad glfn + break; + case glfnActiveTexture: + glActiveTexture((GLenum)args->a0); + break; + case glfnAttachShader: + glAttachShader((GLint)args->a0, (GLint)args->a1); + break; + case glfnBindBuffer: + glBindBuffer((GLenum)args->a0, (GLuint)args->a1); + break; + case glfnBindTexture: + glBindTexture((GLenum)args->a0, (GLint)args->a1); + break; + case glfnBindVertexArray: + glBindVertexArray((GLenum)args->a0); + break; + case glfnBlendColor: + glBlendColor(*(GLfloat*)&args->a0, *(GLfloat*)&args->a1, *(GLfloat*)&args->a2, *(GLfloat*)&args->a3); + break; + case glfnBlendFunc: + glBlendFunc((GLenum)args->a0, (GLenum)args->a1); + break; + case glfnBufferData: + glBufferData((GLenum)args->a0, (GLsizeiptr)args->a1, (GLvoid*)parg, (GLenum)args->a2); + break; + case glfnBufferSubData: + glBufferSubData((GLenum)args->a0, (GLsizeiptr)args->a1, (GLenum)args->a2, (GLvoid*)parg); + break; + case glfnClear: + glClear((GLenum)args->a0); + break; + case glfnClearColor: + glClearColor(*(GLfloat*)&args->a0, *(GLfloat*)&args->a1, *(GLfloat*)&args->a2, *(GLfloat*)&args->a3); + break; + case glfnCompileShader: + glCompileShader((GLint)args->a0); + break; + case glfnCreateProgram: + ret = glCreateProgram(); + break; + case glfnCreateShader: + ret = glCreateShader((GLenum)args->a0); + break; + case glfnDeleteBuffer: + glDeleteBuffers(1, (const GLuint*)(&args->a0)); + break; + case glfnDeleteTexture: + glDeleteTextures(1, (const GLuint*)(&args->a0)); + break; + case glfnDisable: + glDisable((GLenum)args->a0); + break; + case glfnDrawArrays: + glDrawArrays((GLenum)args->a0, (GLint)args->a1, (GLint)args->a2); + break; + case glfnEnable: + glEnable((GLenum)args->a0); + break; + case glfnEnableVertexAttribArray: + glEnableVertexAttribArray((GLint)args->a0); + break; + case glfnFlush: + glFlush(); + break; + case glfnGenBuffer: + glGenBuffers(1, (GLuint*)&ret); + break; + case glfnGenTexture: + glGenTextures(1, (GLuint*)&ret); + break; + case glfnGenVertexArray: + glGenVertexArrays(1, (GLuint*)&ret); + break; + case glfnGetAttribLocation: + ret = glGetAttribLocation((GLint)args->a0, (GLchar*)args->a1); + break; + case glfnGetError: + ret = glGetError(); + break; + case glfnGetProgramiv: + glGetProgramiv((GLint)args->a0, (GLenum)args->a1, (GLint*)&ret); + break; + case glfnGetProgramInfoLog: + glGetProgramInfoLog((GLuint)args->a0, (GLsizei)args->a1, 0, (GLchar*)parg); + break; + case glfnGetShaderiv: + glGetShaderiv((GLint)args->a0, (GLenum)args->a1, (GLint*)&ret); + break; + case glfnGetShaderInfoLog: + glGetShaderInfoLog((GLuint)args->a0, (GLsizei)args->a1, 0, (GLchar*)parg); + break; + case glfnGetShaderSource: + glGetShaderSource((GLuint)args->a0, (GLsizei)args->a1, 0, (GLchar*)parg); + break; + case glfnGetTexParameteriv: + glGetTexParameteriv((GLenum)args->a0, (GLenum)args->a1, (GLint*)parg); + break; + case glfnGetUniformLocation: + ret = glGetUniformLocation((GLint)args->a0, (GLchar*)args->a1); + break; + case glfnLinkProgram: + glLinkProgram((GLint)args->a0); + break; + case glfnReadPixels: + glReadPixels((GLint)args->a0, (GLint)args->a1, (GLsizei)args->a2, (GLsizei)args->a3, (GLenum)args->a4, (GLenum)args->a5, (void*)parg); + break; + case glfnScissor: + glScissor((GLint)args->a0, (GLint)args->a1, (GLint)args->a2, (GLint)args->a3); + break; + case glfnShaderSource: +#if defined(os_ios) || defined(os_macos) + glShaderSource((GLuint)args->a0, (GLsizei)args->a1, (const GLchar *const *)args->a2, NULL); +#else + glShaderSource((GLuint)args->a0, (GLsizei)args->a1, (const GLchar **)args->a2, NULL); +#endif + break; + case glfnTexImage2D: + glTexImage2D( + (GLenum)args->a0, + (GLint)args->a1, + (GLint)args->a2, + (GLsizei)args->a3, + (GLsizei)args->a4, + 0, // border + (GLenum)args->a5, + (GLenum)args->a6, + (const GLvoid*)parg); + break; + case glfnTexParameteri: + glTexParameteri((GLenum)args->a0, (GLenum)args->a1, (GLint)args->a2); + break; + case glfnUniform1f: + glUniform1f((GLint)args->a0, *(GLfloat*)&args->a1); + break; + case glfnUniform2f: + glUniform2f((GLint)args->a0, *(GLfloat*)&args->a1, *(GLfloat*)&args->a2); + break; + case glfnUniform4f: + glUniform4f((GLint)args->a0, *(GLfloat*)&args->a1, *(GLfloat*)&args->a2, *(GLfloat*)&args->a3, *(GLfloat*)&args->a4); + break; + case glfnUniform4fv: + glUniform4fv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)parg); + break; + case glfnUseProgram: + glUseProgram((GLint)args->a0); + break; + case glfnVertexAttribPointer: + glVertexAttribPointer((GLuint)args->a0, (GLint)args->a1, (GLenum)args->a2, (GLboolean)args->a3, (GLsizei)args->a4, (const GLvoid*)args->a5); + break; + case glfnViewport: + glViewport((GLint)args->a0, (GLint)args->a1, (GLint)args->a2, (GLint)args->a3); + break; + } + return ret; +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/work.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/work.go new file mode 100644 index 0000000..4640ce8 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/work.go @@ -0,0 +1,175 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build darwin || linux || openbsd || freebsd + +package gl + +/* +#cgo ios LDFLAGS: -framework OpenGLES +#cgo darwin,!ios LDFLAGS: -framework OpenGL +#cgo linux LDFLAGS: -lGLESv2 +#cgo openbsd LDFLAGS: -L/usr/X11R6/lib/ -lGLESv2 +#cgo freebsd LDFLAGS: -L/usr/local/lib/ -lGLESv2 + +#cgo android CFLAGS: -Dos_android +#cgo ios CFLAGS: -Dos_ios +#cgo darwin,!ios CFLAGS: -Dos_macos +#cgo darwin CFLAGS: -DGL_SILENCE_DEPRECATION +#cgo linux CFLAGS: -Dos_linux +#cgo openbsd CFLAGS: -Dos_openbsd +#cgo freebsd CFLAGS: -Dos_freebsd +#cgo openbsd CFLAGS: -I/usr/X11R6/include/ +#cgo freebsd CFLAGS: -I/usr/local/include/ + +#include +#include "work.h" + +uintptr_t process(struct fnargs* cargs, char* parg0, char* parg1, char* parg2, int count) { + uintptr_t ret; + + ret = processFn(&cargs[0], parg0); + if (count > 1) { + ret = processFn(&cargs[1], parg1); + } + if (count > 2) { + ret = processFn(&cargs[2], parg2); + } + + return ret; +} +*/ +import "C" + +import ( + "unsafe" + + "fyne.io/fyne/v2/internal/async" +) + +const workbufLen = 3 + +type context struct { + cptr uintptr + debug int32 + + workAvailable *async.UnboundedStructChan + + // work is a queue of calls to execute. + work chan call + + // retvalue is sent a return value when blocking calls complete. + // It is safe to use a global unbuffered channel here as calls + // cannot currently be made concurrently. + // + // TODO: the comment above about concurrent calls isn't actually true: package + // app calls package gl, but it has to do so in a separate goroutine, which + // means that its gl calls (which may be blocking) can race with other gl calls + // in the main program. We should make it safe to issue blocking gl calls + // concurrently, or get the gl calls out of package app, or both. + retvalue chan C.uintptr_t + + cargs [workbufLen]C.struct_fnargs + parg [workbufLen]*C.char +} + +func (ctx *context) WorkAvailable() <-chan struct{} { return ctx.workAvailable.Out() } + +type context3 struct { + *context +} + +// NewContext creates a cgo OpenGL context. +// +// See the Worker interface for more details on how it is used. +func NewContext() (Context, Worker) { + glctx := &context{ + workAvailable: async.NewUnboundedStructChan(), + work: make(chan call, workbufLen*4), + retvalue: make(chan C.uintptr_t), + } + if C.GLES_VERSION == "GL_ES_2_0" { + return glctx, glctx + } + return context3{glctx}, glctx +} + +// Version returns a GL ES version string, either "GL_ES_2_0" or "GL_ES_3_0". +// Future versions of the gl package may return "GL_ES_3_1". +func Version() string { + return C.GLES_VERSION +} + +func (ctx *context) enqueue(c call) uintptr { + ctx.work <- c + ctx.workAvailable.In() <- struct{}{} + + if c.blocking { + return uintptr(<-ctx.retvalue) + } + return 0 +} + +func (ctx *context) DoWork() { + queue := make([]call, 0, workbufLen) + for { + // Wait until at least one piece of work is ready. + // Accumulate work until a piece is marked as blocking. + select { + case w := <-ctx.work: + queue = append(queue, w) + default: + return + } + blocking := queue[len(queue)-1].blocking + enqueue: + for len(queue) < cap(queue) && !blocking { + select { + case w := <-ctx.work: + queue = append(queue, w) + blocking = queue[len(queue)-1].blocking + default: + break enqueue + } + } + + // Process the queued GL functions. + for i, q := range queue { + ctx.cargs[i] = *(*C.struct_fnargs)(unsafe.Pointer(&q.args)) + ctx.parg[i] = (*C.char)(q.parg) + } + ret := C.process(&ctx.cargs[0], ctx.parg[0], ctx.parg[1], ctx.parg[2], C.int(len(queue))) + + // Cleanup and signal. + queue = queue[:0] + if blocking { + ctx.retvalue <- ret + } + } +} + +// If C.GLint is not int32, one of these will cause a division by zero compile error. +const ( + _ = 1 / int(unsafe.Sizeof(C.GLint(0))/unsafe.Sizeof(int32(0))) + _ = 1 / int(unsafe.Sizeof(int32(0))/unsafe.Sizeof(C.GLint(0))) +) + +// cString creates C string off the Go heap. +// ret is a *char. +func (ctx *context) cString(str string) (uintptr, func()) { + ptr := unsafe.Pointer(C.CString(str)) + return uintptr(ptr), func() { C.free(ptr) } +} + +// cString creates a pointer to a C string off the Go heap. +// ret is a **char. +func (ctx *context) cStringPtr(str string) (uintptr, func()) { + s, free := ctx.cString(str) + ptr := C.malloc(C.size_t(unsafe.Sizeof((*int)(nil)))) + *(*uintptr)(ptr) = s + return uintptr(ptr), func() { + free() + C.free(ptr) + } +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/work.h b/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/work.h new file mode 100644 index 0000000..dd95434 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/work.h @@ -0,0 +1,104 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifdef os_android +// TODO(crawshaw): We could include and +// condition on __ANDROID_API__ to get GLES3 headers. However +// we also need to add -lGLESv3 to LDFLAGS, which we cannot do +// from inside an ifdef. +#include +#elif os_linux +#include // install on Ubuntu with: sudo apt-get install libegl1-mesa-dev libgles2-mesa-dev libx11-dev +#elif os_openbsd +#include +#elif os_freebsd +#include +#endif + +#ifdef os_ios +#include +#endif + +#ifdef os_macos +#include +#define GL_ES_VERSION_3_0 1 +#endif + +#if defined(GL_ES_VERSION_3_0) && GL_ES_VERSION_3_0 +#define GLES_VERSION "GL_ES_3_0" +#else +#define GLES_VERSION "GL_ES_2_0" +#endif + +#include +#include + +// TODO: generate this enum from fn.go. +typedef enum { + glfnUNDEFINED, + glfnActiveTexture, + glfnAttachShader, + glfnBindBuffer, + glfnBindTexture, + glfnBindVertexArray, + glfnBlendColor, + glfnBlendFunc, + glfnBufferData, + glfnBufferSubData, + glfnClear, + glfnClearColor, + glfnCompileShader, + glfnCreateProgram, + glfnCreateShader, + glfnDeleteBuffer, + glfnDeleteTexture, + glfnDisable, + glfnDrawArrays, + glfnEnable, + glfnEnableVertexAttribArray, + glfnFlush, + glfnGenBuffer, + glfnGenTexture, + glfnGenVertexArray, + glfnGetAttribLocation, + glfnGetError, + glfnGetProgramInfoLog, + glfnGetProgramiv, + glfnGetShaderInfoLog, + glfnGetShaderSource, + glfnGetShaderiv, + glfnGetTexParameteriv, + glfnGetUniformLocation, + glfnLinkProgram, + glfnReadPixels, + glfnScissor, + glfnShaderSource, + glfnTexImage2D, + glfnTexParameteri, + glfnUniform1f, + glfnUniform2f, + glfnUniform4f, + glfnUniform4fv, + glfnUseProgram, + glfnVertexAttribPointer, + glfnViewport, +} glfn; + +// TODO: generate this type from fn.go. +struct fnargs { + glfn fn; + + uintptr_t a0; + uintptr_t a1; + uintptr_t a2; + uintptr_t a3; + uintptr_t a4; + uintptr_t a5; + uintptr_t a6; + uintptr_t a7; + uintptr_t a8; + uintptr_t a9; +}; + +extern uintptr_t processFn(struct fnargs* args, char* parg); diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/work_other.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/work_other.go new file mode 100644 index 0000000..5168f0e --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/work_other.go @@ -0,0 +1,35 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build (!cgo || (!darwin && !linux && !openbsd && !freebsd)) && !windows + +package gl + +// This file contains stub implementations of what the other work*.go files +// provide. These stubs don't do anything, other than compile (e.g. when cgo is +// disabled). + +type context struct{} + +func (*context) enqueue(c call) uintptr { + panic("unimplemented; GOOS/CGO combination not supported") +} + +func (*context) cString(str string) (uintptr, func()) { + panic("unimplemented; GOOS/CGO combination not supported") +} + +func (*context) cStringPtr(str string) (uintptr, func()) { + panic("unimplemented; GOOS/CGO combination not supported") +} + +type context3 = context + +func NewContext() (Context, Worker) { + panic("unimplemented; GOOS/CGO combination not supported") +} + +func Version() string { + panic("unimplemented; GOOS/CGO combination not supported") +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/work_windows.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/work_windows.go new file mode 100644 index 0000000..226356b --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/gl/work_windows.go @@ -0,0 +1,349 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package gl + +import ( + "syscall" + "unsafe" +) + +// context is described in work.go. +type context struct { + debug int32 + workAvailable chan struct{} + work chan call + retvalue chan uintptr + + // TODO(crawshaw): will not work with a moving collector + cStringCounter int + cStrings map[int]unsafe.Pointer +} + +func (ctx *context) WorkAvailable() <-chan struct{} { return ctx.workAvailable } + +type context3 struct { + *context +} + +func NewContext() (Context, Worker) { + if err := findDLLs(); err != nil { + panic(err) + } + glctx := &context{ + workAvailable: make(chan struct{}, 1), + work: make(chan call, 3), + retvalue: make(chan uintptr), + cStrings: make(map[int]unsafe.Pointer), + } + return glctx, glctx +} + +func (ctx *context) enqueue(c call) uintptr { + ctx.work <- c + + select { + case ctx.workAvailable <- struct{}{}: + default: + } + + if c.blocking { + return <-ctx.retvalue + } + return 0 +} + +func (ctx *context) DoWork() { + // TODO: add a work queue + for { + select { + case w := <-ctx.work: + ret := ctx.doWork(w) + if w.blocking { + ctx.retvalue <- ret + } + default: + return + } + } +} + +func (ctx *context) cString(s string) (uintptr, func()) { + buf := make([]byte, len(s)+1) + for i := 0; i < len(s); i++ { + buf[i] = s[i] + } + ret := unsafe.Pointer(&buf[0]) + id := ctx.cStringCounter + ctx.cStringCounter++ + ctx.cStrings[id] = ret + return uintptr(ret), func() { delete(ctx.cStrings, id) } +} + +func (ctx *context) cStringPtr(str string) (uintptr, func()) { + s, sfree := ctx.cString(str) + sptr := [2]uintptr{s, 0} + ret := unsafe.Pointer(&sptr[0]) + id := ctx.cStringCounter + ctx.cStringCounter++ + ctx.cStrings[id] = ret + return uintptr(ret), func() { sfree(); delete(ctx.cStrings, id) } +} + +var glfnFuncs = [...]func(c call) (ret uintptr){ + glfnActiveTexture: func(c call) (ret uintptr) { + syscall.SyscallN(glActiveTexture.Addr(), c.args.a0) + return ret + }, + glfnAttachShader: func(c call) (ret uintptr) { + syscall.SyscallN(glAttachShader.Addr(), c.args.a0, c.args.a1) + return ret + }, + glfnBindBuffer: func(c call) (ret uintptr) { + syscall.SyscallN(glBindBuffer.Addr(), c.args.a0, c.args.a1) + return ret + }, + glfnBindTexture: func(c call) (ret uintptr) { + syscall.SyscallN(glBindTexture.Addr(), c.args.a0, c.args.a1) + return ret + }, + glfnBindVertexArray: func(c call) (ret uintptr) { + syscall.SyscallN(glBindVertexArray.Addr(), c.args.a0) + return ret + }, + glfnBlendColor: func(c call) (ret uintptr) { + syscall.SyscallN(glBlendColor.Addr(), c.args.a0, c.args.a1, c.args.a2, c.args.a3) + return ret + }, + glfnBlendFunc: func(c call) (ret uintptr) { + syscall.SyscallN(glBlendFunc.Addr(), c.args.a0, c.args.a1) + return ret + }, + glfnBufferData: func(c call) (ret uintptr) { + syscall.SyscallN(glBufferData.Addr(), c.args.a0, c.args.a1, uintptr(c.parg), c.args.a2) + return ret + }, + glfnBufferSubData: func(c call) (ret uintptr) { + syscall.SyscallN(glBufferSubData.Addr(), c.args.a0, c.args.a1, c.args.a2, uintptr(c.parg)) + return ret + }, + glfnClear: func(c call) (ret uintptr) { + syscall.SyscallN(glClear.Addr(), c.args.a0) + return ret + }, + glfnClearColor: func(c call) (ret uintptr) { + syscall.SyscallN(glClearColor.Addr(), c.args.a0, c.args.a1, c.args.a2, c.args.a3) + return ret + }, + glfnCompileShader: func(c call) (ret uintptr) { + syscall.SyscallN(glCompileShader.Addr(), c.args.a0) + return ret + }, + glfnCreateProgram: func(c call) (ret uintptr) { + ret, _, _ = syscall.SyscallN(glCreateProgram.Addr()) + return ret + }, + glfnCreateShader: func(c call) (ret uintptr) { + ret, _, _ = syscall.SyscallN(glCreateShader.Addr(), c.args.a0) + return ret + }, + glfnDeleteBuffer: func(c call) (ret uintptr) { + syscall.SyscallN(glDeleteBuffers.Addr(), 1, uintptr(unsafe.Pointer(&c.args.a0))) + return ret + }, + glfnDeleteTexture: func(c call) (ret uintptr) { + syscall.SyscallN(glDeleteTextures.Addr(), 1, uintptr(unsafe.Pointer(&c.args.a0))) + return ret + }, + glfnDisable: func(c call) (ret uintptr) { + syscall.SyscallN(glDisable.Addr(), c.args.a0) + return ret + }, + glfnDrawArrays: func(c call) (ret uintptr) { + syscall.SyscallN(glDrawArrays.Addr(), c.args.a0, c.args.a1, c.args.a2) + return ret + }, + glfnEnable: func(c call) (ret uintptr) { + syscall.SyscallN(glEnable.Addr(), c.args.a0) + return ret + }, + glfnEnableVertexAttribArray: func(c call) (ret uintptr) { + syscall.SyscallN(glEnableVertexAttribArray.Addr(), c.args.a0) + return ret + }, + glfnFlush: func(c call) (ret uintptr) { + syscall.SyscallN(glFlush.Addr()) + return ret + }, + glfnGenBuffer: func(c call) (ret uintptr) { + syscall.SyscallN(glGenBuffers.Addr(), 1, uintptr(unsafe.Pointer(&ret))) + return ret + }, + glfnGenVertexArray: func(c call) (ret uintptr) { + syscall.SyscallN(glGenVertexArrays.Addr(), 1, uintptr(unsafe.Pointer(&ret))) + return ret + }, + glfnGenTexture: func(c call) (ret uintptr) { + syscall.SyscallN(glGenTextures.Addr(), 1, uintptr(unsafe.Pointer(&ret))) + return ret + }, + glfnGetAttribLocation: func(c call) (ret uintptr) { + ret, _, _ = syscall.SyscallN(glGetAttribLocation.Addr(), c.args.a0, c.args.a1) + return ret + }, + glfnGetError: func(c call) (ret uintptr) { + ret, _, _ = syscall.SyscallN(glGetError.Addr()) + return ret + }, + glfnGetProgramInfoLog: func(c call) (ret uintptr) { + syscall.SyscallN(glGetProgramInfoLog.Addr(), c.args.a0, c.args.a1, 0, uintptr(c.parg)) + return ret + }, + glfnGetProgramiv: func(c call) (ret uintptr) { + syscall.SyscallN(glGetProgramiv.Addr(), c.args.a0, c.args.a1, uintptr(unsafe.Pointer(&ret))) + return ret + }, + glfnGetShaderInfoLog: func(c call) (ret uintptr) { + syscall.SyscallN(glGetShaderInfoLog.Addr(), c.args.a0, c.args.a1, 0, uintptr(c.parg)) + return ret + }, + glfnGetShaderSource: func(c call) (ret uintptr) { + syscall.SyscallN(glGetShaderSource.Addr(), c.args.a0, c.args.a1, 0, uintptr(c.parg)) + return ret + }, + glfnGetShaderiv: func(c call) (ret uintptr) { + syscall.SyscallN(glGetShaderiv.Addr(), c.args.a0, c.args.a1, uintptr(unsafe.Pointer(&ret))) + return ret + }, + glfnGetTexParameteriv: func(c call) (ret uintptr) { + syscall.SyscallN(glGetTexParameteriv.Addr(), c.args.a0, c.args.a1, uintptr(c.parg)) + return ret + }, + glfnGetUniformLocation: func(c call) (ret uintptr) { + ret, _, _ = syscall.SyscallN(glGetUniformLocation.Addr(), c.args.a0, c.args.a1) + return ret + }, + glfnLinkProgram: func(c call) (ret uintptr) { + syscall.SyscallN(glLinkProgram.Addr(), c.args.a0) + return ret + }, + glfnReadPixels: func(c call) (ret uintptr) { + syscall.SyscallN(glReadPixels.Addr(), c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5, uintptr(c.parg)) + return ret + }, + glfnScissor: func(c call) (ret uintptr) { + syscall.SyscallN(glScissor.Addr(), c.args.a0, c.args.a1, c.args.a2, c.args.a3) + return ret + }, + glfnShaderSource: func(c call) (ret uintptr) { + syscall.SyscallN(glShaderSource.Addr(), c.args.a0, c.args.a1, c.args.a2, 0) + return ret + }, + glfnTexImage2D: func(c call) (ret uintptr) { + syscall.SyscallN(glTexImage2D.Addr(), c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, 0, c.args.a5, c.args.a6, uintptr(c.parg)) + return ret + }, + glfnTexParameteri: func(c call) (ret uintptr) { + syscall.SyscallN(glTexParameteri.Addr(), c.args.a0, c.args.a1, c.args.a2) + return ret + }, + glfnUniform1f: func(c call) (ret uintptr) { + syscall.SyscallN(glUniform1f.Addr(), c.args.a0, c.args.a1) + return ret + }, + glfnUniform2f: func(c call) (ret uintptr) { + syscall.SyscallN(glUniform2f.Addr(), c.args.a0, c.args.a1, c.args.a2) + return ret + }, + glfnUniform4f: func(c call) (ret uintptr) { + syscall.SyscallN(glUniform4f.Addr(), c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4) + return ret + }, + glfnUniform4fv: func(c call) (ret uintptr) { + syscall.SyscallN(glUniform4fv.Addr(), c.args.a0, c.args.a1, uintptr(c.parg)) + return ret + }, + glfnUseProgram: func(c call) (ret uintptr) { + syscall.SyscallN(glUseProgram.Addr(), c.args.a0) + return ret + }, + glfnVertexAttribPointer: func(c call) (ret uintptr) { + syscall.SyscallN(glVertexAttribPointer.Addr(), c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5) + return ret + }, + glfnViewport: func(c call) (ret uintptr) { + syscall.SyscallN(glViewport.Addr(), c.args.a0, c.args.a1, c.args.a2, c.args.a3) + return ret + }, +} + +func (ctx *context) doWork(c call) (ret uintptr) { + if int(c.args.fn) < len(glfnFuncs) { + return glfnFuncs[c.args.fn](c) + } + panic("unknown GL function") +} + +// Exported libraries for a Windows GUI driver. +// +// LibEGL is not used directly by the gl package, but is needed by any +// driver hoping to use OpenGL ES. +// +// LibD3DCompiler is needed by libglesv2.dll for compiling shaders. +var ( + LibGLESv2 = syscall.NewLazyDLL("libglesv2.dll") + LibEGL = syscall.NewLazyDLL("libegl.dll") + LibD3DCompiler = syscall.NewLazyDLL("d3dcompiler_47.dll") +) + +var ( + libGLESv2 = LibGLESv2 + glActiveTexture = libGLESv2.NewProc("glActiveTexture") + glAttachShader = libGLESv2.NewProc("glAttachShader") + glBindBuffer = libGLESv2.NewProc("glBindBuffer") + glBindTexture = libGLESv2.NewProc("glBindTexture") + glBindVertexArray = libGLESv2.NewProc("glBindVertexArray") + glBlendColor = libGLESv2.NewProc("glBlendColor") + glBlendFunc = libGLESv2.NewProc("glBlendFunc") + glBufferData = libGLESv2.NewProc("glBufferData") + glBufferSubData = libGLESv2.NewProc("glBufferSubData") + glClear = libGLESv2.NewProc("glClear") + glClearColor = libGLESv2.NewProc("glClearColor") + glCompileShader = libGLESv2.NewProc("glCompileShader") + glCreateProgram = libGLESv2.NewProc("glCreateProgram") + glCreateShader = libGLESv2.NewProc("glCreateShader") + glDeleteBuffers = libGLESv2.NewProc("glDeleteBuffers") + glDeleteTextures = libGLESv2.NewProc("glDeleteTextures") + glDisable = libGLESv2.NewProc("glDisable") + glDrawArrays = libGLESv2.NewProc("glDrawArrays") + glEnable = libGLESv2.NewProc("glEnable") + glEnableVertexAttribArray = libGLESv2.NewProc("glEnableVertexAttribArray") + glFlush = libGLESv2.NewProc("glFlush") + glGenBuffers = libGLESv2.NewProc("glGenBuffers") + glGenTextures = libGLESv2.NewProc("glGenTextures") + glGenVertexArrays = libGLESv2.NewProc("glGenVertexArrays") + glGetAttribLocation = libGLESv2.NewProc("glGetAttribLocation") + glGetError = libGLESv2.NewProc("glGetError") + glGetProgramInfoLog = libGLESv2.NewProc("glGetProgramInfoLog") + glGetProgramiv = libGLESv2.NewProc("glGetProgramiv") + glGetShaderInfoLog = libGLESv2.NewProc("glGetShaderInfoLog") + glGetShaderSource = libGLESv2.NewProc("glGetShaderSource") + glGetShaderiv = libGLESv2.NewProc("glGetShaderiv") + glGetTexParameteriv = libGLESv2.NewProc("glGetTexParameteriv") + glGetUniformLocation = libGLESv2.NewProc("glGetUniformLocation") + glPixelStorei = libGLESv2.NewProc("glPixelStorei") + glLinkProgram = libGLESv2.NewProc("glLinkProgram") + glReadPixels = libGLESv2.NewProc("glReadPixels") + glScissor = libGLESv2.NewProc("glScissor") + glShaderSource = libGLESv2.NewProc("glShaderSource") + glTexImage2D = libGLESv2.NewProc("glTexImage2D") + glTexParameteri = libGLESv2.NewProc("glTexParameteri") + glUniform1f = libGLESv2.NewProc("glUniform1f") + glUniform2f = libGLESv2.NewProc("glUniform2f") + glUniform4f = libGLESv2.NewProc("glUniform4f") + glUniform4fv = libGLESv2.NewProc("glUniform4fv") + glUseProgram = libGLESv2.NewProc("glUseProgram") + glVertexAttribPointer = libGLESv2.NewProc("glVertexAttribPointer") + glViewport = libGLESv2.NewProc("glViewport") +) diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/keyboard.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/keyboard.go new file mode 100644 index 0000000..35c4d67 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/keyboard.go @@ -0,0 +1,46 @@ +package mobile + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/driver/mobile" + "fyne.io/fyne/v2/internal/driver/mobile/app" +) + +func (d *device) hideVirtualKeyboard() { + if drv, ok := fyne.CurrentApp().Driver().(*driver); ok { + if drv.app == nil { // not yet running + return + } + + drv.app.HideVirtualKeyboard() + d.keyboardShown = false + } +} + +func (d *device) handleKeyboard(obj fyne.Focusable) { + isDisabled := false + if disWid, ok := obj.(fyne.Disableable); ok { + isDisabled = disWid.Disabled() + } + if obj != nil && !isDisabled { + if keyb, ok := obj.(mobile.Keyboardable); ok { + d.showVirtualKeyboard(keyb.Keyboard()) + } else { + d.showVirtualKeyboard(mobile.DefaultKeyboard) + } + } else { + d.hideVirtualKeyboard() + } +} + +func (d *device) showVirtualKeyboard(keyboard mobile.KeyboardType) { + if drv, ok := fyne.CurrentApp().Driver().(*driver); ok { + if drv.app == nil { // not yet running + fyne.LogError("Cannot show keyboard before app is running", nil) + return + } + + d.keyboardShown = true + drv.app.ShowVirtualKeyboard(app.KeyboardType(keyboard)) + } +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/menu.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/menu.go new file mode 100644 index 0000000..cc446c9 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/menu.go @@ -0,0 +1,125 @@ +package mobile + +import ( + "image/color" + + "fyne.io/fyne/v2" + fynecanvas "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/layout" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +type menuLabel struct { + widget.BaseWidget + + menu *fyne.Menu + bar *fyne.Container + canvas *canvas +} + +func (m *menuLabel) Tapped(*fyne.PointEvent) { + pos := fyne.CurrentApp().Driver().AbsolutePositionForObject(m) + menu := widget.NewPopUpMenu(m.menu, m.canvas) + menu.ShowAtPosition(fyne.NewPos(pos.X+m.Size().Width, pos.Y)) + + menuDismiss := menu.OnDismiss // this dismisses the menu stack + menu.OnDismiss = func() { + menuDismiss() + m.bar.Hide() // dismiss the overlay menu bar + m.canvas.setMenu(nil) + } +} + +func (m *menuLabel) CreateRenderer() fyne.WidgetRenderer { + label := widget.NewLabel(m.menu.Label) + box := container.NewHBox(layout.NewSpacer(), label, layout.NewSpacer(), widget.NewIcon(theme.MenuExpandIcon())) + + return &menuLabelRenderer{menu: m, content: box} +} + +func newMenuLabel(item *fyne.Menu, parent *fyne.Container, c *canvas) *menuLabel { + l := &menuLabel{menu: item, bar: parent, canvas: c} + l.ExtendBaseWidget(l) + return l +} + +func (c *canvas) showMenu(menu *fyne.MainMenu) { + var panel *fyne.Container + top := container.NewHBox(widget.NewButtonWithIcon("", theme.CancelIcon(), func() { + panel.Hide() + c.setMenu(nil) + })) + panel = container.NewVBox(top) + for _, item := range menu.Items { + panel.Add(newMenuLabel(item, panel, c)) + } + if c.padded { + panel = container.NewPadded(panel) + } + + bg := fynecanvas.NewRectangle(theme.Color(theme.ColorNameBackground)) + shadow := fynecanvas.NewHorizontalGradient(theme.Color(theme.ColorNameShadow), color.Transparent) + + safePos, safeSize := c.InteractiveArea() + bg.Move(safePos) + bg.Resize(fyne.NewSize(panel.MinSize().Width+theme.Padding(), safeSize.Height)) + panel.Move(safePos) + panel.Resize(fyne.NewSize(panel.MinSize().Width+theme.Padding(), safeSize.Height)) + shadow.Resize(fyne.NewSize(theme.Padding()/2, safeSize.Height)) + shadow.Move(fyne.NewPos(panel.Size().Width+safePos.X, safePos.Y)) + + c.setMenu(container.NewWithoutLayout(bg, panel, shadow)) +} + +func (d *driver) findMenu(win *window) *fyne.MainMenu { + if win.menu != nil { + return win.menu + } + + matched := false + for x := len(d.windows) - 1; x >= 0; x-- { + w := d.windows[x] + if !matched { + if w == win { + matched = true + } + continue + } + + if w.(*window).menu != nil { + return w.(*window).menu + } + } + + return nil +} + +type menuLabelRenderer struct { + menu *menuLabel + content *fyne.Container +} + +func (m *menuLabelRenderer) BackgroundColor() color.Color { + return theme.Color(theme.ColorNameBackground) +} + +func (m *menuLabelRenderer) Destroy() { +} + +func (m *menuLabelRenderer) Layout(size fyne.Size) { + m.content.Resize(size) +} + +func (m *menuLabelRenderer) MinSize() fyne.Size { + return m.content.MinSize() +} + +func (m *menuLabelRenderer) Objects() []fyne.CanvasObject { + return []fyne.CanvasObject{m.content} +} + +func (m *menuLabelRenderer) Refresh() { + m.content.Refresh() +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/menubutton.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/menubutton.go new file mode 100644 index 0000000..923f76e --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/menubutton.go @@ -0,0 +1,52 @@ +package mobile + +import ( + "fyne.io/fyne/v2" + fynecanvas "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +type menuButton struct { + widget.BaseWidget + win *window + menu *fyne.MainMenu +} + +func (w *window) newMenuButton(menu *fyne.MainMenu) *menuButton { + b := &menuButton{win: w, menu: menu} + b.ExtendBaseWidget(b) + return b +} + +func (m *menuButton) CreateRenderer() fyne.WidgetRenderer { + return &menuButtonRenderer{btn: widget.NewButtonWithIcon("", theme.MenuIcon(), func() { + m.win.canvas.showMenu(m.menu) + }), bg: fynecanvas.NewRectangle(theme.Color(theme.ColorNameBackground))} +} + +type menuButtonRenderer struct { + btn *widget.Button + bg *fynecanvas.Rectangle +} + +func (m *menuButtonRenderer) Destroy() { +} + +func (m *menuButtonRenderer) Layout(size fyne.Size) { + m.bg.Move(fyne.NewPos(theme.Padding()/2, theme.Padding()/2)) + m.bg.Resize(size.Subtract(fyne.NewSize(theme.Padding(), theme.Padding()))) + m.btn.Resize(size) +} + +func (m *menuButtonRenderer) MinSize() fyne.Size { + return m.btn.MinSize() +} + +func (m *menuButtonRenderer) Objects() []fyne.CanvasObject { + return []fyne.CanvasObject{m.bg, m.btn} +} + +func (m *menuButtonRenderer) Refresh() { + m.bg.FillColor = theme.Color(theme.ColorNameBackground) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/mobileinit/ctx_android.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/mobileinit/ctx_android.go new file mode 100644 index 0000000..562cc38 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/mobileinit/ctx_android.go @@ -0,0 +1,135 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package mobileinit + +/* +#include +#include + +static char* lockJNI(JavaVM *vm, uintptr_t* envp, int* attachedp) { + JNIEnv* env; + + if (vm == NULL) { + return "no current JVM"; + } + + *attachedp = 0; + switch ((*vm)->GetEnv(vm, (void**)&env, JNI_VERSION_1_6)) { + case JNI_OK: + break; + case JNI_EDETACHED: + if ((*vm)->AttachCurrentThread(vm, &env, 0) != 0) { + return "cannot attach to JVM"; + } + *attachedp = 1; + break; + case JNI_EVERSION: + return "bad JNI version"; + default: + return "unknown JNI error from GetEnv"; + } + + *envp = (uintptr_t)env; + return NULL; +} + +static char* checkException(uintptr_t jnienv) { + jthrowable exc; + JNIEnv* env = (JNIEnv*)jnienv; + + if (!(*env)->ExceptionCheck(env)) { + return NULL; + } + + exc = (*env)->ExceptionOccurred(env); + (*env)->ExceptionClear(env); + + jclass clazz = (*env)->FindClass(env, "java/lang/Throwable"); + jmethodID toString = (*env)->GetMethodID(env, clazz, "toString", "()Ljava/lang/String;"); + jobject msgStr = (*env)->CallObjectMethod(env, exc, toString); + return (char*)(*env)->GetStringUTFChars(env, msgStr, 0); +} + +static void unlockJNI(JavaVM *vm) { + (*vm)->DetachCurrentThread(vm); +} + +static void deletePrevCtx(JNIEnv* env,jobject ctx){ + if (ctx == NULL) { return; } + (*env)->DeleteGlobalRef(env, ctx); +} +*/ +import "C" + +import ( + "errors" + "runtime" + "unsafe" +) + +// currentVM is stored to initialize other cgo packages. +// +// As all the Go packages in a program form a single shared library, +// there can only be one JNI_OnLoad function for initialization. In +// OpenJDK there is JNI_GetCreatedJavaVMs, but this is not available +// on android. +var currentVM *C.JavaVM + +// currentCtx is Android's android.context.Context. May be NULL. +var currentCtx C.jobject + +// SetCurrentContext populates the global Context object with the specified +// current JavaVM instance (vm) and android.context.Context object (ctx). +// The android.context.Context object must be a global reference. +func SetCurrentContext(vm unsafe.Pointer, ctx uintptr) { + currentVM = (*C.JavaVM)(vm) + currentCtxPrev := currentCtx + currentCtx = (C.jobject)(ctx) + RunOnJVM(func(vm, jniEnv, ctx uintptr) error { + env := (*C.JNIEnv)(unsafe.Pointer(jniEnv)) + C.deletePrevCtx(env, C.jobject(currentCtxPrev)) + return nil + }) +} + +// RunOnJVM runs fn on a new goroutine locked to an OS thread with a JNIEnv. +// +// RunOnJVM blocks until the call to fn is complete. Any Java +// exception or failure to attach to the JVM is returned as an error. +// +// The function fn takes vm, the current JavaVM*, +// env, the current JNIEnv*, and +// ctx, a jobject representing the global android.context.Context. +func RunOnJVM(fn func(vm, env, ctx uintptr) error) error { + errch := make(chan error) + go func() { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + env := C.uintptr_t(0) + attached := C.int(0) + if errStr := C.lockJNI(currentVM, &env, &attached); errStr != nil { + errch <- errors.New(C.GoString(errStr)) + return + } + if attached != 0 { + defer C.unlockJNI(currentVM) + } + + vm := uintptr(unsafe.Pointer(currentVM)) + if err := fn(vm, uintptr(env), uintptr(currentCtx)); err != nil { + errch <- err + return + } + + if exc := C.checkException(env); exc != nil { + errch <- errors.New(C.GoString(exc)) + C.free(unsafe.Pointer(exc)) + return + } + errch <- nil + }() + return <-errch +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/mobileinit/mobileinit.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/mobileinit/mobileinit.go new file mode 100644 index 0000000..65c0912 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/mobileinit/mobileinit.go @@ -0,0 +1,11 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package mobileinit contains common initialization logic for mobile platforms +// that is relevant to both all-Go apps and gobind-based apps. +// +// Long-term, some code in this package should consider moving into Go stdlib. +package mobileinit + +import "C" diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/mobileinit/mobileinit_android.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/mobileinit/mobileinit_android.go new file mode 100644 index 0000000..fec5a16 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/mobileinit/mobileinit_android.go @@ -0,0 +1,93 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package mobileinit + +/* +To view the log output run: +adb logcat Fyne:I *:S +*/ + +// Android redirects stdout and stderr to /dev/null. +// As these are common debugging utilities in Go, +// we redirect them to logcat. +// +// Unfortunately, logcat is line oriented, so we must buffer. + +/* +#cgo LDFLAGS: -landroid -llog + +#include +#include +#include +*/ +import "C" + +import ( + "bufio" + "log" + "os" + "syscall" + "unsafe" +) + +var ( + ctag = C.CString("Fyne") + // Store the writer end of the redirected stderr and stdout + // so that they are not garbage collected and closed. + stderr, stdout *os.File +) + +type infoWriter struct{} + +func (infoWriter) Write(p []byte) (n int, err error) { + cstr := C.CString(string(p)) + C.__android_log_write(C.ANDROID_LOG_INFO, ctag, cstr) + C.free(unsafe.Pointer(cstr)) + return len(p), nil +} + +func lineLog(f *os.File, priority C.int) { + const logSize = 1024 // matches android/log.h. + r := bufio.NewReaderSize(f, logSize) + for { + line, _, err := r.ReadLine() + str := string(line) + if err != nil { + str += " " + err.Error() + } + cstr := C.CString(str) + C.__android_log_write(priority, ctag, cstr) + C.free(unsafe.Pointer(cstr)) + if err != nil { + break + } + } +} + +func init() { + log.SetOutput(infoWriter{}) + // android logcat includes all of log.LstdFlags + log.SetFlags(log.Flags() &^ log.LstdFlags) + + r, w, err := os.Pipe() + if err != nil { + panic(err) + } + stderr = w + if err := syscall.Dup3(int(w.Fd()), int(os.Stderr.Fd()), 0); err != nil { + panic(err) + } + go lineLog(r, C.ANDROID_LOG_ERROR) + + r, w, err = os.Pipe() + if err != nil { + panic(err) + } + stdout = w + if err := syscall.Dup3(int(w.Fd()), int(os.Stdout.Fd()), 0); err != nil { + panic(err) + } + go lineLog(r, C.ANDROID_LOG_INFO) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/mobileinit/mobileinit_ios.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/mobileinit/mobileinit_ios.go new file mode 100644 index 0000000..ae33c12 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/mobileinit/mobileinit_ios.go @@ -0,0 +1,36 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build darwin && (arm || arm64) + +package mobileinit + +import ( + "log" + "unsafe" +) + +/* +#cgo CFLAGS: -x objective-c +#cgo LDFLAGS: -framework Foundation + +#include +#include + +void log_wrap(const char *logStr); +*/ +import "C" + +type aslWriter struct{} + +func (aslWriter) Write(p []byte) (n int, err error) { + cstr := C.CString(string(p)) + C.log_wrap(cstr) + C.free(unsafe.Pointer(cstr)) + return len(p), nil +} + +func init() { + log.SetOutput(aslWriter{}) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/mobileinit/mobileinit_ios.m b/vendor/fyne.io/fyne/v2/internal/driver/mobile/mobileinit/mobileinit_ios.m new file mode 100644 index 0000000..84ab98d --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/mobileinit/mobileinit_ios.m @@ -0,0 +1,7 @@ +//go:build darwin && (arm || arm64) + +#import + +void log_wrap(const char *logStr) { + NSLog(@"Fyne: %s", logStr); +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/mobileinit/mobileinit_linux.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/mobileinit/mobileinit_linux.go new file mode 100644 index 0000000..f43aec2 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/mobileinit/mobileinit_linux.go @@ -0,0 +1 @@ +package mobileinit diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/repository.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/repository.go new file mode 100644 index 0000000..f115c0e --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/repository.go @@ -0,0 +1,77 @@ +package mobile + +import ( + "fyne.io/fyne/v2" + + "fyne.io/fyne/v2/storage/repository" +) + +// declare conformance with repository types +var ( + _ repository.Repository = (*mobileFileRepo)(nil) + _ repository.HierarchicalRepository = (*mobileFileRepo)(nil) + _ repository.ListableRepository = (*mobileFileRepo)(nil) + _ repository.WritableRepository = (*mobileFileRepo)(nil) + _ repository.AppendableRepository = (*mobileFileRepo)(nil) +) + +type mobileFileRepo struct{} + +func (m *mobileFileRepo) CanList(u fyne.URI) (bool, error) { + return canListURI(u), nil +} + +func (m *mobileFileRepo) CanRead(u fyne.URI) (bool, error) { + return true, nil // TODO check a file can be read +} + +func (m *mobileFileRepo) CanWrite(u fyne.URI) (bool, error) { + return true, nil // TODO check a file can be written +} + +func (m *mobileFileRepo) Child(u fyne.URI, name string) (fyne.URI, error) { + if u == nil || u.Scheme() != "file" { + return nil, repository.ErrOperationNotSupported + } + + return repository.GenericChild(u, name) +} + +func (m *mobileFileRepo) CreateListable(u fyne.URI) error { + return createListableURI(u) +} + +func (m *mobileFileRepo) Delete(u fyne.URI) error { + return deleteURI(u) +} + +func (m *mobileFileRepo) Destroy(string) { +} + +func (m *mobileFileRepo) Exists(u fyne.URI) (bool, error) { + return existsURI(u) +} + +func (m *mobileFileRepo) List(u fyne.URI) ([]fyne.URI, error) { + return listURI(u) +} + +func (m *mobileFileRepo) Parent(u fyne.URI) (fyne.URI, error) { + if u == nil || u.Scheme() != "file" { + return nil, repository.ErrOperationNotSupported + } + + return repository.GenericParent(u) +} + +func (m *mobileFileRepo) Reader(u fyne.URI) (fyne.URIReadCloser, error) { + return fileReaderForURI(u) +} + +func (m *mobileFileRepo) Writer(u fyne.URI) (fyne.URIWriteCloser, error) { + return fileWriterForURI(u, true) +} + +func (m *mobileFileRepo) Appender(u fyne.URI) (fyne.URIWriteCloser, error) { + return fileWriterForURI(u, false) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/uri.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/uri.go new file mode 100644 index 0000000..8b2d05d --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/uri.go @@ -0,0 +1,16 @@ +//go:build !android + +package mobile + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/storage" +) + +func nativeURI(path string) fyne.URI { + uri, err := storage.ParseURI(path) + if err != nil { + fyne.LogError("Error on parsing uri", err) + } + return uri +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/uri_android.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/uri_android.go new file mode 100644 index 0000000..4c7ee88 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/uri_android.go @@ -0,0 +1,64 @@ +//go:build android + +package mobile + +/* +#cgo LDFLAGS: -landroid -llog + +#include + +char* contentURIGetFileName(uintptr_t jni_env, uintptr_t ctx, char* uriCstr); +*/ +import "C" + +import ( + "path/filepath" + "unsafe" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/driver/mobile/app" + "fyne.io/fyne/v2/storage" +) + +type androidURI struct { + systemURI string + fyne.URI +} + +// Override Name on android for content:// +func (a *androidURI) Name() string { + if a.Scheme() == "content" { + result := contentURIGetFileName(a.systemURI) + if result != "" { + return result + } + } + return a.URI.Name() +} + +func (a *androidURI) Extension() string { + return filepath.Ext(a.Name()) +} + +func contentURIGetFileName(uri string) string { + uriStr := C.CString(uri) + defer C.free(unsafe.Pointer(uriStr)) + + var filename string + app.RunOnJVM(func(_, env, ctx uintptr) error { + fnamePtr := C.contentURIGetFileName(C.uintptr_t(env), C.uintptr_t(ctx), uriStr) + vPtr := unsafe.Pointer(fnamePtr) + if vPtr == C.NULL { + return nil + } + filename = C.GoString(fnamePtr) + C.free(vPtr) + + return nil + }) + return filename +} + +func nativeURI(uri string) fyne.URI { + return &androidURI{URI: storage.NewURI(uri), systemURI: uri} +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/window.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/window.go new file mode 100644 index 0000000..85cdf09 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/window.go @@ -0,0 +1,209 @@ +package mobile + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/internal/cache" + "fyne.io/fyne/v2/internal/driver/common" + "fyne.io/fyne/v2/layout" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +type window struct { + title string + visible bool + onClosed func() + onCloseIntercepted func() + isChild bool + + canvas *canvas + icon fyne.Resource + menu *fyne.MainMenu + handle uintptr // the window handle - currently just Android +} + +func (w *window) Title() string { + return w.title +} + +func (w *window) SetTitle(title string) { + w.title = title +} + +func (w *window) FullScreen() bool { + return true +} + +func (w *window) SetFullScreen(bool) { + // no-op +} + +func (w *window) Resize(size fyne.Size) { + w.Canvas().(*canvas).Resize(size) +} + +func (w *window) RequestFocus() { + // no-op - we cannot change which window is focused +} + +func (w *window) FixedSize() bool { + return true +} + +func (w *window) SetFixedSize(bool) { + // no-op - all windows are fixed size +} + +func (w *window) CenterOnScreen() { + // no-op +} + +func (w *window) Padded() bool { + return w.canvas.padded +} + +func (w *window) SetPadded(padded bool) { + w.canvas.padded = padded +} + +func (w *window) Icon() fyne.Resource { + if w.icon == nil { + return fyne.CurrentApp().Icon() + } + + return w.icon +} + +func (w *window) SetIcon(icon fyne.Resource) { + w.icon = icon +} + +func (w *window) SetMaster() { + // no-op on mobile +} + +func (w *window) MainMenu() *fyne.MainMenu { + return w.menu +} + +func (w *window) SetMainMenu(menu *fyne.MainMenu) { + w.menu = menu +} + +func (w *window) SetOnClosed(callback func()) { + w.onClosed = callback +} + +func (w *window) SetCloseIntercept(callback func()) { + w.onCloseIntercepted = callback +} + +func (w *window) SetOnDropped(dropped func(fyne.Position, []fyne.URI)) { + // not implemented yet +} + +func (w *window) Show() { + menu := fyne.CurrentApp().Driver().(*driver).findMenu(w) + menuButton := w.newMenuButton(menu) + if menu == nil { + menuButton.Hide() + } + + if w.isChild { + exit := widget.NewButtonWithIcon("", theme.CancelIcon(), func() { + w.tryClose() + }) + title := widget.NewLabel(w.title) + title.Alignment = fyne.TextAlignCenter + w.canvas.setWindowHead(container.NewHBox(menuButton, + layout.NewSpacer(), title, layout.NewSpacer(), exit)) + w.canvas.Resize(w.canvas.size) + } else { + w.canvas.setWindowHead(container.NewHBox(menuButton)) + } + w.visible = true + + if w.Content() != nil { + w.Content().Refresh() + w.Content().Show() + } +} + +func (w *window) Hide() { + w.visible = false + + if w.Content() != nil { + w.Content().Hide() + } +} + +func (w *window) tryClose() { + if w.onCloseIntercepted != nil { + w.onCloseIntercepted() + return + } + + w.Close() +} + +func (w *window) Close() { + d := fyne.CurrentApp().Driver().(*driver) + pos := -1 + for i, win := range d.windows { + if win == w { + pos = i + } + } + if pos != -1 { + d.windows = append(d.windows[:pos], d.windows[pos+1:]...) + } + + cache.RangeTexturesFor(w.canvas, w.canvas.Painter().Free) + + w.canvas.WalkTrees(nil, func(node *common.RenderCacheNode, _ fyne.Position) { + if wid, ok := node.Obj().(fyne.Widget); ok { + cache.DestroyRenderer(wid) + } + }) + cache.CleanCanvas(w.canvas) + + if w.onClosed != nil { + w.onClosed() + } +} + +func (w *window) ShowAndRun() { + w.Show() + fyne.CurrentApp().Run() +} + +func (w *window) Content() fyne.CanvasObject { + return w.canvas.Content() +} + +func (w *window) SetContent(content fyne.CanvasObject) { + w.canvas.SetContent(content) +} + +func (w *window) Canvas() fyne.Canvas { + return w.canvas +} + +func (w *window) Clipboard() fyne.Clipboard { + return NewClipboard() +} + +func (w *window) RunWithContext(f func()) { + // ctx, _ = e.DrawContext.(gl.Context) + + f() +} + +func (w *window) RescaleContext() { + // TODO +} + +func (w *window) Context() any { + return fyne.CurrentApp().Driver().(*driver).glctx +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/window_android.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/window_android.go new file mode 100644 index 0000000..cb8b02d --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/window_android.go @@ -0,0 +1,26 @@ +//go:build android + +package mobile + +import ( + fyneDriver "fyne.io/fyne/v2/driver" + "fyne.io/fyne/v2/internal/driver/mobile/app" +) + +// Assert we are satisfying the driver.NativeWindow interface +var _ fyneDriver.NativeWindow = (*window)(nil) + +func (w *window) RunNative(f func(context any)) { + app.RunOnJVM(func(vm, env, ctx uintptr) error { + data := &fyneDriver.AndroidWindowContext{ + NativeWindow: w.handle, + AndroidContext: fyneDriver.AndroidContext{ + VM: vm, + Env: env, + Ctx: ctx, + }, + } + f(data) + return nil + }) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/mobile/window_ios.go b/vendor/fyne.io/fyne/v2/internal/driver/mobile/window_ios.go new file mode 100644 index 0000000..cad67cb --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/mobile/window_ios.go @@ -0,0 +1,14 @@ +//go:build ios + +package mobile + +import ( + fyneDriver "fyne.io/fyne/v2/driver" +) + +// Assert we are satisfying the driver.NativeWindow interface +var _ fyneDriver.NativeWindow = (*window)(nil) + +func (w *window) RunNative(fn func(context any)) { + fn(&fyneDriver.UnknownContext{}) +} diff --git a/vendor/fyne.io/fyne/v2/internal/driver/util.go b/vendor/fyne.io/fyne/v2/internal/driver/util.go new file mode 100644 index 0000000..d5d62c3 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/driver/util.go @@ -0,0 +1,220 @@ +package driver + +import ( + "math" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/cache" +) + +// AbsolutePositionForObject returns the absolute position of an object in a set of object trees. +// If the object is not part of any of the trees, the position (0,0) is returned. +func AbsolutePositionForObject(object fyne.CanvasObject, trees []fyne.CanvasObject) fyne.Position { + var pos fyne.Position + findPos := func(o fyne.CanvasObject, p fyne.Position, _ fyne.Position, _ fyne.Size) bool { + if o == object { + pos = p + return true + } + return false + } + for _, tree := range trees { + if WalkVisibleObjectTree(tree, findPos, nil) { + break + } + } + return pos +} + +// FindObjectAtPositionMatching is used to find an object in a canvas at the specified position. +// The matches function determines of the type of object that is found at this position is of a suitable type. +// The various canvas roots and overlays that can be searched are also passed in. +func FindObjectAtPositionMatching(mouse fyne.Position, matches func(object fyne.CanvasObject) bool, overlay fyne.CanvasObject, roots ...fyne.CanvasObject) (fyne.CanvasObject, fyne.Position, int) { + var found fyne.CanvasObject + var foundPos fyne.Position + + findFunc := func(walked fyne.CanvasObject, pos fyne.Position, clipPos fyne.Position, clipSize fyne.Size) bool { + if !walked.Visible() { + return false + } + + if mouse.X < clipPos.X || mouse.Y < clipPos.Y { + return false + } + + if mouse.X >= clipPos.X+clipSize.Width || mouse.Y >= clipPos.Y+clipSize.Height { + return false + } + + if mouse.X < pos.X || mouse.Y < pos.Y { + return false + } + + if mouse.X >= pos.X+walked.Size().Width || mouse.Y >= pos.Y+walked.Size().Height { + return false + } + + if matches(walked) { + found = walked + foundPos = fyne.NewPos(mouse.X-pos.X, mouse.Y-pos.Y) + } + return false + } + + layer := 0 + if overlay != nil { + WalkVisibleObjectTree(overlay, findFunc, nil) + } else { + for _, root := range roots { + layer++ + if root == nil { + continue + } + WalkVisibleObjectTree(root, findFunc, nil) + if found != nil { + break + } + } + } + + return found, foundPos, layer +} + +// ReverseWalkVisibleObjectTree will walk an object tree in reverse order for all visible objects +// executing the passed functions following the following rules: +// - beforeChildren is called for the start obj before traversing its children +// - the obj's children are traversed by calling walkObjects on each of the visible items +// - afterChildren is called for the obj after traversing the obj's children +// The walk can be aborted by returning true in one of the functions: +// - if beforeChildren returns true, further traversing is stopped immediately, the after function +// will not be called for the obj where the walk stopped, however, it will be called for all its +// parents +func ReverseWalkVisibleObjectTree( + obj fyne.CanvasObject, + beforeChildren func(fyne.CanvasObject, fyne.Position, fyne.Position, fyne.Size) bool, + afterChildren func(fyne.CanvasObject, fyne.Position, fyne.CanvasObject), +) bool { + clipSize := fyne.NewSize(math.MaxInt32, math.MaxInt32) + return walkObjectTree(obj, true, nil, fyne.NewPos(0, 0), fyne.NewPos(0, 0), clipSize, beforeChildren, afterChildren, true) +} + +// WalkCompleteObjectTree will walk an object tree for all objects (ignoring visible state) executing the passed +// functions following the following rules: +// - beforeChildren is called for the start obj before traversing its children +// - the obj's children are traversed by calling walkObjects on each of the items +// - afterChildren is called for the obj after traversing the obj's children +// The walk can be aborted by returning true in one of the functions: +// - if beforeChildren returns true, further traversing is stopped immediately, the after function +// will not be called for the obj where the walk stopped, however, it will be called for all its +// parents +func WalkCompleteObjectTree( + obj fyne.CanvasObject, + beforeChildren func(fyne.CanvasObject, fyne.Position, fyne.Position, fyne.Size) bool, + afterChildren func(fyne.CanvasObject, fyne.Position, fyne.CanvasObject), +) bool { + clipSize := fyne.NewSize(math.MaxInt32, math.MaxInt32) + return walkObjectTree(obj, false, nil, fyne.NewPos(0, 0), fyne.NewPos(0, 0), clipSize, beforeChildren, afterChildren, false) +} + +// WalkVisibleObjectTree will walk an object tree for all visible objects executing the passed functions following +// the following rules: +// - beforeChildren is called for the start obj before traversing its children +// - the obj's children are traversed by calling walkObjects on each of the visible items +// - afterChildren is called for the obj after traversing the obj's children +// The walk can be aborted by returning true in one of the functions: +// - if beforeChildren returns true, further traversing is stopped immediately, the after function +// will not be called for the obj where the walk stopped, however, it will be called for all its +// parents +func WalkVisibleObjectTree( + obj fyne.CanvasObject, + beforeChildren func(fyne.CanvasObject, fyne.Position, fyne.Position, fyne.Size) bool, + afterChildren func(fyne.CanvasObject, fyne.Position, fyne.CanvasObject), +) bool { + clipSize := fyne.NewSize(math.MaxInt32, math.MaxInt32) + return walkObjectTree(obj, false, nil, fyne.NewPos(0, 0), fyne.NewPos(0, 0), clipSize, beforeChildren, afterChildren, true) +} + +func walkObjectTree( + obj fyne.CanvasObject, + reverse bool, + parent fyne.CanvasObject, + offset, clipPos fyne.Position, + clipSize fyne.Size, + beforeChildren func(fyne.CanvasObject, fyne.Position, fyne.Position, fyne.Size) bool, + afterChildren func(fyne.CanvasObject, fyne.Position, fyne.CanvasObject), + requireVisible bool, +) bool { + if obj == nil { + return false + } + if requireVisible && !obj.Visible() { + return false + } + pos := obj.Position().Add(offset) + + var children []fyne.CanvasObject + switch co := obj.(type) { + case *fyne.Container: + children = co.Objects + case fyne.Widget: + if cache.IsRendered(co) || requireVisible { + children = cache.Renderer(co).Objects() + } + } + + if IsClip(obj) { + clipPos = pos + clipSize = obj.Size() + } + + if beforeChildren != nil { + if beforeChildren(obj, pos, clipPos, clipSize) { + return true + } + } + + cancelled := false + followChild := func(child fyne.CanvasObject) bool { + if walkObjectTree(child, reverse, obj, pos, clipPos, clipSize, beforeChildren, afterChildren, requireVisible) { + cancelled = true + return true + } + return false + } + if reverse { + for i := len(children) - 1; i >= 0; i-- { + if followChild(children[i]) { + break + } + } + } else { + for _, child := range children { + if followChild(child) { + break + } + } + } + + if afterChildren != nil { + afterChildren(obj, pos, parent) + } + return cancelled +} + +func IsClip(o fyne.CanvasObject) bool { + _, scroll := o.(fyne.Scrollable) + if scroll { + return true + } + + if _, isWid := o.(fyne.Widget); !isWid { + return false + } + r, rendered := cache.CachedRenderer(o.(fyne.Widget)) + if !rendered { + return false + } + + _, clip := r.(interface{ IsClip() }) + return clip +} diff --git a/vendor/fyne.io/fyne/v2/internal/hints_disabled.go b/vendor/fyne.io/fyne/v2/internal/hints_disabled.go new file mode 100644 index 0000000..2809524 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/hints_disabled.go @@ -0,0 +1,9 @@ +//go:build !hints + +package internal + +// LogHint reports a developer hint that should be followed to improve their app. +// This does nothing unless the "hints" build flag is used. +func LogHint(reason string) { + // no-op when hints not enabled +} diff --git a/vendor/fyne.io/fyne/v2/internal/hints_enabled.go b/vendor/fyne.io/fyne/v2/internal/hints_enabled.go new file mode 100644 index 0000000..3e4935a --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/hints_enabled.go @@ -0,0 +1,18 @@ +//go:build hints + +package internal + +import ( + "log" + "runtime" +) + +// LogHint reports a developer hint that should be followed to improve their app. +func LogHint(reason string) { + log.Println("Fyne hint: ", reason) + + _, file, line, ok := runtime.Caller(2) + if ok { + log.Printf(" Created at: %s:%d", file, line) + } +} diff --git a/vendor/fyne.io/fyne/v2/internal/metadata/data.go b/vendor/fyne.io/fyne/v2/internal/metadata/data.go new file mode 100644 index 0000000..30288fe --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/metadata/data.go @@ -0,0 +1,34 @@ +package metadata + +// FyneApp describes the top level metadata for building a fyne application +type FyneApp struct { + Website string `toml:",omitempty"` + Details AppDetails + Development map[string]string `toml:",omitempty"` + Release map[string]string `toml:",omitempty"` + Source *AppSource `toml:",omitempty"` + LinuxAndBSD *LinuxAndBSD `toml:",omitempty"` + Languages []string `toml:",omitempty"` + Migrations map[string]bool `toml:",omitempty"` +} + +// AppDetails describes the build information, this group may be OS or arch specific +type AppDetails struct { + Icon string `toml:",omitempty"` + Name, ID string `toml:",omitempty"` + Version string `toml:",omitempty"` + Build int `toml:",omitempty"` +} + +type AppSource struct { + Repo, Dir string `toml:",omitempty"` +} + +// LinuxAndBSD describes specific metadata for desktop files on Linux and BSD. +type LinuxAndBSD struct { + GenericName string `toml:",omitempty"` + Categories []string `toml:",omitempty"` + Comment string `toml:",omitempty"` + Keywords []string `toml:",omitempty"` + ExecParams string `toml:",omitempty"` +} diff --git a/vendor/fyne.io/fyne/v2/internal/metadata/icon.go b/vendor/fyne.io/fyne/v2/internal/metadata/icon.go new file mode 100644 index 0000000..745c547 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/metadata/icon.go @@ -0,0 +1,41 @@ +package metadata + +import ( + "bytes" + "image/png" + "strconv" + + "github.com/nfnt/resize" + + "fyne.io/fyne/v2" +) + +func ScaleIcon(data fyne.Resource, size int) fyne.Resource { + img, err := png.Decode(bytes.NewReader(data.Content())) + if err != nil { + fyne.LogError("Failed to decode app icon", err) + return data + } + + if img.Bounds().Dx() <= size { + return data + } + + sized := resize.Resize(uint(size), uint(size), img, resize.Lanczos3) + smallData := &bytes.Buffer{} + err = png.Encode(smallData, sized) + if err != nil { + fyne.LogError("Failed to encode smaller app icon", err) + return data + } + + name := data.Name() + nameLen := len(name) + suffix := "-" + strconv.Itoa(size) + ".png" + if nameLen <= 4 || name[nameLen-4] != '.' { + name = "appicon" + suffix + } else { + name = name[:nameLen-4] + suffix + } + return fyne.NewStaticResource(name, smallData.Bytes()) +} diff --git a/vendor/fyne.io/fyne/v2/internal/metadata/load.go b/vendor/fyne.io/fyne/v2/internal/metadata/load.go new file mode 100644 index 0000000..29fb8a3 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/metadata/load.go @@ -0,0 +1,34 @@ +package metadata + +import ( + "io" + "os" + "path/filepath" + + "github.com/BurntSushi/toml" +) + +// Load attempts to read a FyneApp metadata from the provided reader. +// If this cannot be done an error will be returned. +func Load(r io.Reader) (*FyneApp, error) { + var data FyneApp + _, err := toml.NewDecoder(r).Decode(&data) + if err != nil { + return nil, err + } + + return &data, nil +} + +// LoadStandard attempts to read a FyneApp metadata from the `FyneApp.toml` file in the specified dir. +// If the file cannot be found or parsed an error will be returned. +func LoadStandard(dir string) (*FyneApp, error) { + path := filepath.Join(dir, "FyneApp.toml") + r, err := os.Open(path) + if err != nil { + return nil, err + } + + defer r.Close() + return Load(r) +} diff --git a/vendor/fyne.io/fyne/v2/internal/metadata/save.go b/vendor/fyne.io/fyne/v2/internal/metadata/save.go new file mode 100644 index 0000000..df49e1e --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/metadata/save.go @@ -0,0 +1,36 @@ +package metadata + +import ( + "bytes" + "io" + "os" + "path/filepath" + + "github.com/BurntSushi/toml" +) + +// Save attempts to write a FyneApp metadata to the provided writer. +// If the encoding fails an error will be returned. +func Save(f *FyneApp, w io.Writer) error { + var buf bytes.Buffer + err := toml.NewEncoder(&buf).Encode(f) + if err != nil { + return err + } + + _, err = w.Write(buf.Bytes()) + return err +} + +// SaveStandard attempts to save a FyneApp metadata to the `FyneApp.toml` file in the specified dir. +// If the file cannot be written or encoding fails an error will be returned. +func SaveStandard(f *FyneApp, dir string) error { + path := filepath.Join(dir, "FyneApp.toml") + w, err := os.Create(path) + if err != nil { + return err + } + + defer w.Close() + return Save(f, w) +} diff --git a/vendor/fyne.io/fyne/v2/internal/overlay_stack.go b/vendor/fyne.io/fyne/v2/internal/overlay_stack.go new file mode 100644 index 0000000..5c689a7 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/overlay_stack.go @@ -0,0 +1,91 @@ +package internal + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/app" + "fyne.io/fyne/v2/internal/widget" +) + +// OverlayStack allows stacking overlays on top of each other. +// Removing an overlay will also remove all overlays above it. +type OverlayStack struct { + OnChange func() + Canvas fyne.Canvas + focusManagers []*app.FocusManager + overlays []fyne.CanvasObject +} + +// Add puts an overlay on the stack. +func (s *OverlayStack) Add(overlay fyne.CanvasObject) { + if overlay == nil { + return + } + + if s.OnChange != nil { + defer s.OnChange() + } + + s.overlays = append(s.overlays, overlay) + + // TODO this should probably apply to all once #707 is addressed + if _, ok := overlay.(*widget.OverlayContainer); ok { + safePos, safeSize := s.Canvas.InteractiveArea() + + overlay.Resize(safeSize) + overlay.Move(safePos) + } + + s.focusManagers = append(s.focusManagers, app.NewFocusManager(overlay)) +} + +// List returns all overlays on the stack from bottom to top. +func (s *OverlayStack) List() []fyne.CanvasObject { + return s.overlays +} + +// ListFocusManagers returns all focus managers on the stack from bottom to top. +func (s *OverlayStack) ListFocusManagers() []*app.FocusManager { + return s.focusManagers +} + +// Remove deletes an overlay and all overlays above it from the stack. +func (s *OverlayStack) Remove(overlay fyne.CanvasObject) { + if s.OnChange != nil { + defer s.OnChange() + } + + overlayIdx := -1 + for i, o := range s.overlays { + if o == overlay { + overlayIdx = i + break + } + } + if overlayIdx == -1 { + return + } + // set removed elements in backing array to nil to release memory references + for i := overlayIdx; i < len(s.overlays); i++ { + s.overlays[i] = nil + s.focusManagers[i] = nil + } + s.overlays = s.overlays[:overlayIdx] + s.focusManagers = s.focusManagers[:overlayIdx] +} + +// Top returns the top-most overlay of the stack. +func (s *OverlayStack) Top() fyne.CanvasObject { + if len(s.overlays) == 0 { + return nil + } + return s.overlays[len(s.overlays)-1] +} + +// TopFocusManager returns the app.FocusManager assigned to the top-most overlay of the stack. +func (s *OverlayStack) TopFocusManager() *app.FocusManager { + if len(s.focusManagers) == 0 { + return nil + } + + return s.focusManagers[len(s.focusManagers)-1] +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/draw.go b/vendor/fyne.io/fyne/v2/internal/painter/draw.go new file mode 100644 index 0000000..b7f9271 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/draw.go @@ -0,0 +1,673 @@ +package painter + +import ( + "image" + "image/color" + "math" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + + "github.com/srwiley/rasterx" + "golang.org/x/image/math/fixed" +) + +const quarterCircleControl = 1 - 0.55228 + +// DrawArc rasterizes the given arc object into an image. +// The scale function is used to understand how many pixels are required per unit of size. +// The arc is drawn from StartAngle to EndAngle (in degrees). +// 0°/360 is top, 90° is right, 180° is bottom, 270° is left +// 0°/-360 is top, -90° is left, -180° is bottom, -270° is right +func DrawArc(arc *canvas.Arc, vectorPad float32, scale func(float32) float32) *image.RGBA { + size := arc.Size() + + width := int(scale(size.Width + vectorPad*2)) + height := int(scale(size.Height + vectorPad*2)) + + raw := image.NewRGBA(image.Rect(0, 0, width, height)) + scanner := rasterx.NewScannerGV(int(size.Width), int(size.Height), raw, raw.Bounds()) + + centerX := float64(width) / 2 + centerY := float64(height) / 2 + + outerRadius := fyne.Min(size.Width, size.Height) / 2 + innerRadius := float32(float64(outerRadius) * math.Min(1.0, math.Max(0.0, float64(arc.CutoutRatio)))) + cornerRadius := fyne.Min(GetMaximumRadiusArc(outerRadius, innerRadius, arc.EndAngle-arc.StartAngle), arc.CornerRadius) + startAngle, endAngle := NormalizeArcAngles(arc.StartAngle, arc.EndAngle) + + // convert to radians + startRad := float64(startAngle * math.Pi / 180.0) + endRad := float64(endAngle * math.Pi / 180.0) + sweep := endRad - startRad + if sweep == 0 { + // nothing to draw + return raw + } + + if sweep > 2*math.Pi { + sweep = 2 * math.Pi + } else if sweep < -2*math.Pi { + sweep = -2 * math.Pi + } + + cornerRadius = scale(cornerRadius) + outerRadius = scale(outerRadius) + innerRadius = scale(innerRadius) + + if arc.FillColor != nil { + filler := rasterx.NewFiller(width, height, scanner) + filler.SetColor(arc.FillColor) + // rasterx.AddArc is not used because it does not support rounded corners + drawRoundArc(filler, centerX, centerY, float64(outerRadius), float64(innerRadius), startRad, sweep, float64(cornerRadius)) + filler.Draw() + } + + stroke := float64(scale(arc.StrokeWidth)) + if arc.StrokeColor != nil && stroke > 0 { + dasher := rasterx.NewDasher(width, height, scanner) + dasher.SetColor(arc.StrokeColor) + dasher.SetStroke(fixed.Int26_6(stroke*64), 0, nil, nil, nil, 0, nil, 0) + // rasterx.AddArc is not used because it does not support rounded corners + drawRoundArc(dasher, centerX, centerY, float64(outerRadius), float64(innerRadius), startRad, sweep, float64(cornerRadius)) + dasher.Draw() + } + + return raw +} + +// DrawCircle rasterizes the given circle object into an image. +// The bounds of the output image will be increased by vectorPad to allow for stroke overflow at the edges. +// The scale function is used to understand how many pixels are required per unit of size. +func DrawCircle(circle *canvas.Circle, vectorPad float32, scale func(float32) float32) *image.RGBA { + size := circle.Size() + radius := GetMaximumRadius(size) + + width := int(scale(size.Width + vectorPad*2)) + height := int(scale(size.Height + vectorPad*2)) + stroke := scale(circle.StrokeWidth) + + raw := image.NewRGBA(image.Rect(0, 0, width, height)) + scanner := rasterx.NewScannerGV(int(size.Width), int(size.Height), raw, raw.Bounds()) + + if circle.FillColor != nil { + filler := rasterx.NewFiller(width, height, scanner) + filler.SetColor(circle.FillColor) + rasterx.AddCircle(float64(width/2), float64(height/2), float64(scale(radius)), filler) + filler.Draw() + } + + dasher := rasterx.NewDasher(width, height, scanner) + dasher.SetColor(circle.StrokeColor) + dasher.SetStroke(fixed.Int26_6(float64(stroke)*64), 0, nil, nil, nil, 0, nil, 0) + rasterx.AddCircle(float64(width/2), float64(height/2), float64(scale(radius)), dasher) + dasher.Draw() + + return raw +} + +// DrawLine rasterizes the given line object into an image. +// The bounds of the output image will be increased by vectorPad to allow for stroke overflow at the edges. +// The scale function is used to understand how many pixels are required per unit of size. +func DrawLine(line *canvas.Line, vectorPad float32, scale func(float32) float32) *image.RGBA { + col := line.StrokeColor + size := line.Size() + width := int(scale(size.Width + vectorPad*2)) + height := int(scale(size.Height + vectorPad*2)) + stroke := scale(line.StrokeWidth) + if stroke < 1 { // software painter doesn't fade lines to compensate + stroke = 1 + } + + raw := image.NewRGBA(image.Rect(0, 0, width, height)) + scanner := rasterx.NewScannerGV(int(size.Width), int(size.Height), raw, raw.Bounds()) + dasher := rasterx.NewDasher(width, height, scanner) + dasher.SetColor(col) + dasher.SetStroke(fixed.Int26_6(float64(stroke)*64), 0, nil, nil, nil, 0, nil, 0) + position := line.Position() + p1x, p1y := scale(line.Position1.X-position.X+vectorPad), scale(line.Position1.Y-position.Y+vectorPad) + p2x, p2y := scale(line.Position2.X-position.X+vectorPad), scale(line.Position2.Y-position.Y+vectorPad) + + if stroke <= 1.5 { // adjust to support 1px + if p1x == p2x { + p1x -= 0.5 + p2x -= 0.5 + } + if p1y == p2y { + p1y -= 0.5 + p2y -= 0.5 + } + } + + dasher.Start(rasterx.ToFixedP(float64(p1x), float64(p1y))) + dasher.Line(rasterx.ToFixedP(float64(p2x), float64(p2y))) + dasher.Stop(true) + dasher.Draw() + + return raw +} + +// DrawPolygon rasterizes the given regular polygon object into an image. +// The bounds of the output image will be increased by vectorPad to allow for stroke overflow at the edges. +// The scale function is used to understand how many pixels are required per unit of size. +func DrawPolygon(polygon *canvas.Polygon, vectorPad float32, scale func(float32) float32) *image.RGBA { + size := polygon.Size() + + width := int(scale(size.Width + vectorPad*2)) + height := int(scale(size.Height + vectorPad*2)) + outerRadius := scale(fyne.Min(size.Width, size.Height) / 2) + cornerRadius := scale(fyne.Min(GetMaximumRadius(size), polygon.CornerRadius)) + sides := int(polygon.Sides) + angle := polygon.Angle + + raw := image.NewRGBA(image.Rect(0, 0, width, height)) + scanner := rasterx.NewScannerGV(int(size.Width), int(size.Height), raw, raw.Bounds()) + + if polygon.FillColor != nil { + filler := rasterx.NewFiller(width, height, scanner) + filler.SetColor(polygon.FillColor) + drawRegularPolygon(float64(width/2), float64(height/2), float64(outerRadius), float64(cornerRadius), float64(angle), int(sides), filler) + filler.Draw() + } + + if polygon.StrokeColor != nil && polygon.StrokeWidth > 0 { + dasher := rasterx.NewDasher(width, height, scanner) + dasher.SetColor(polygon.StrokeColor) + dasher.SetStroke(fixed.Int26_6(float64(scale(polygon.StrokeWidth))*64), 0, nil, nil, nil, 0, nil, 0) + drawRegularPolygon(float64(width/2), float64(height/2), float64(outerRadius), float64(cornerRadius), float64(angle), int(sides), dasher) + dasher.Draw() + } + + return raw +} + +// DrawRectangle rasterizes the given rectangle object with stroke border into an image. +// The bounds of the output image will be increased by vectorPad to allow for stroke overflow at the edges. +// The scale function is used to understand how many pixels are required per unit of size. +func DrawRectangle(rect *canvas.Rectangle, rWidth, rHeight, vectorPad float32, scale func(float32) float32) *image.RGBA { + topRightRadius := GetCornerRadius(rect.TopRightCornerRadius, rect.CornerRadius) + topLeftRadius := GetCornerRadius(rect.TopLeftCornerRadius, rect.CornerRadius) + bottomRightRadius := GetCornerRadius(rect.BottomRightCornerRadius, rect.CornerRadius) + bottomLeftRadius := GetCornerRadius(rect.BottomLeftCornerRadius, rect.CornerRadius) + return drawOblong(rect.FillColor, rect.StrokeColor, rect.StrokeWidth, topRightRadius, topLeftRadius, bottomRightRadius, bottomLeftRadius, rWidth, rHeight, vectorPad, scale) +} + +func drawOblong(fill, strokeCol color.Color, strokeWidth, topRightRadius, topLeftRadius, bottomRightRadius, bottomLeftRadius, rWidth, rHeight, vectorPad float32, scale func(float32) float32) *image.RGBA { + // The maximum possible corner radii for a circular shape + size := fyne.NewSize(rWidth, rHeight) + topRightRadius = GetMaximumCornerRadius(topRightRadius, topLeftRadius, bottomRightRadius, size) + topLeftRadius = GetMaximumCornerRadius(topLeftRadius, topRightRadius, bottomLeftRadius, size) + bottomRightRadius = GetMaximumCornerRadius(bottomRightRadius, bottomLeftRadius, topRightRadius, size) + bottomLeftRadius = GetMaximumCornerRadius(bottomLeftRadius, bottomRightRadius, topLeftRadius, size) + + width := int(scale(rWidth + vectorPad*2)) + height := int(scale(rHeight + vectorPad*2)) + stroke := scale(strokeWidth) + + raw := image.NewRGBA(image.Rect(0, 0, width, height)) + scanner := rasterx.NewScannerGV(int(rWidth), int(rHeight), raw, raw.Bounds()) + + scaledPad := scale(vectorPad) + p1x, p1y := scaledPad, scaledPad + p2x, p2y := scale(rWidth)+scaledPad, scaledPad + p3x, p3y := scale(rWidth)+scaledPad, scale(rHeight)+scaledPad + p4x, p4y := scaledPad, scale(rHeight)+scaledPad + + if fill != nil { + filler := rasterx.NewFiller(width, height, scanner) + filler.SetColor(fill) + if topRightRadius == topLeftRadius && bottomRightRadius == bottomLeftRadius && topRightRadius == bottomRightRadius { + // If all corners are the same, we can draw a simple rectangle + radius := topRightRadius + if radius == 0 { + rasterx.AddRect(float64(p1x), float64(p1y), float64(p3x), float64(p3y), 0, filler) + } else { + r := float64(scale(radius)) + rasterx.AddRoundRect(float64(p1x), float64(p1y), float64(p3x), float64(p3y), r, r, 0, rasterx.RoundGap, filler) + } + } else { + rTL, rTR, rBR, rBL := scale(topLeftRadius), scale(topRightRadius), scale(bottomRightRadius), scale(bottomLeftRadius) + // Top-left corner + c := quarterCircleControl * rTL + if c != 0 { + filler.Start(rasterx.ToFixedP(float64(p1x), float64(p1y+rTL))) + filler.CubeBezier(rasterx.ToFixedP(float64(p1x), float64(p1y+c)), rasterx.ToFixedP(float64(p1x+c), float64(p1y)), rasterx.ToFixedP(float64(p1x+rTL), float64(p1y))) + } else { + filler.Start(rasterx.ToFixedP(float64(p1x), float64(p1y))) + } + // Top edge to top-right + c = quarterCircleControl * rTR + filler.Line(rasterx.ToFixedP(float64(p2x-rTR), float64(p2y))) + if c != 0 { + filler.CubeBezier(rasterx.ToFixedP(float64(p2x-c), float64(p2y)), rasterx.ToFixedP(float64(p2x), float64(p2y+c)), rasterx.ToFixedP(float64(p2x), float64(p2y+rTR))) + } + // Right edge to bottom-right + c = quarterCircleControl * rBR + filler.Line(rasterx.ToFixedP(float64(p3x), float64(p3y-rBR))) + if c != 0 { + filler.CubeBezier(rasterx.ToFixedP(float64(p3x), float64(p3y-c)), rasterx.ToFixedP(float64(p3x-c), float64(p3y)), rasterx.ToFixedP(float64(p3x-rBR), float64(p3y))) + } + // Bottom edge to bottom-left + c = quarterCircleControl * rBL + filler.Line(rasterx.ToFixedP(float64(p4x+rBL), float64(p4y))) + if c != 0 { + filler.CubeBezier(rasterx.ToFixedP(float64(p4x+c), float64(p4y)), rasterx.ToFixedP(float64(p4x), float64(p4y-c)), rasterx.ToFixedP(float64(p4x), float64(p4y-rBL))) + } + // Left edge to top-left + filler.Line(rasterx.ToFixedP(float64(p1x), float64(p1y+rTL))) + filler.Stop(true) + } + filler.Draw() + } + + if strokeCol != nil && strokeWidth > 0 { + dasher := rasterx.NewDasher(width, height, scanner) + dasher.SetColor(strokeCol) + dasher.SetStroke(fixed.Int26_6(float64(stroke)*64), 0, nil, nil, nil, 0, nil, 0) + rTL, rTR, rBR, rBL := scale(topLeftRadius), scale(topRightRadius), scale(bottomRightRadius), scale(bottomLeftRadius) + c := quarterCircleControl * rTL + if c != 0 { + dasher.Start(rasterx.ToFixedP(float64(p1x), float64(p1y+rTL))) + dasher.CubeBezier(rasterx.ToFixedP(float64(p1x), float64(p1y+c)), rasterx.ToFixedP(float64(p1x+c), float64(p1y)), rasterx.ToFixedP(float64(p1x+rTL), float64(p2y))) + } else { + dasher.Start(rasterx.ToFixedP(float64(p1x), float64(p1y))) + } + c = quarterCircleControl * rTR + dasher.Line(rasterx.ToFixedP(float64(p2x-rTR), float64(p2y))) + if c != 0 { + dasher.CubeBezier(rasterx.ToFixedP(float64(p2x-c), float64(p2y)), rasterx.ToFixedP(float64(p2x), float64(p2y+c)), rasterx.ToFixedP(float64(p2x), float64(p2y+rTR))) + } + c = quarterCircleControl * rBR + dasher.Line(rasterx.ToFixedP(float64(p3x), float64(p3y-rBR))) + if c != 0 { + dasher.CubeBezier(rasterx.ToFixedP(float64(p3x), float64(p3y-c)), rasterx.ToFixedP(float64(p3x-c), float64(p3y)), rasterx.ToFixedP(float64(p3x-rBR), float64(p3y))) + } + c = quarterCircleControl * rBL + dasher.Line(rasterx.ToFixedP(float64(p4x+rBL), float64(p4y))) + if c != 0 { + dasher.CubeBezier(rasterx.ToFixedP(float64(p4x+c), float64(p4y)), rasterx.ToFixedP(float64(p4x), float64(p4y-c)), rasterx.ToFixedP(float64(p4x), float64(p4y-rBL))) + } + dasher.Stop(true) + dasher.Draw() + } + + return raw +} + +// drawRegularPolygon draws a regular n-sides centered at (cx,cy) with +// radius, rounded corners of cornerRadius, rotated by rot degrees. +func drawRegularPolygon(cx, cy, radius, cornerRadius, rot float64, sides int, p rasterx.Adder) { + if sides < 3 || radius <= 0 { + return + } + gf := rasterx.RoundGap + angleStep := 2 * math.Pi / float64(sides) + rotRads := rot*math.Pi/180 - math.Pi/2 + + // fully rounded, draw circle + if math.Min(cornerRadius, radius) == radius { + rasterx.AddCircle(cx, cy, radius, p) + return + } + + // sharp polygon fast path + if cornerRadius <= 0 { + x0 := cx + radius*math.Cos(rotRads) + y0 := cy + radius*math.Sin(rotRads) + p.Start(rasterx.ToFixedP(x0, y0)) + for i := 1; i < sides; i++ { + t := rotRads + angleStep*float64(i) + p.Line(rasterx.ToFixedP(cx+radius*math.Cos(t), cy+radius*math.Sin(t))) + } + p.Stop(true) + return + } + + norm := func(x, y float64) (nx, ny float64) { + l := math.Hypot(x, y) + if l == 0 { + return 0, 0 + } + return x / l, y / l + } + + // regular polygon vertices + xs := make([]float64, sides) + ys := make([]float64, sides) + for i := 0; i < sides; i++ { + t := rotRads + angleStep*float64(i) + xs[i] = cx + radius*math.Cos(t) + ys[i] = cy + radius*math.Sin(t) + } + + // interior angle and side length + alpha := math.Pi * (float64(sides) - 2) / float64(sides) + r := cornerRadius + + // distances for tangency and center placement + tTrim := r / math.Tan(alpha/2) // along each edge from vertex to tangency + d := r / math.Sin(alpha/2) // from vertex to arc center along interior bisector + + // precompute fillet geometry per vertex + type pt struct{ x, y float64 } + sPts := make([]pt, sides) // start tangency (on incoming edge) + vS := make([]pt, sides) // center->start vector + vE := make([]pt, sides) // center->end vector + cPts := make([]pt, sides) // arc centers + + for i := 0; i < sides; i++ { + prv := (i - 1 + sides) % sides + nxt := (i + 1) % sides + + // unit directions + uInX, uInY := xs[i]-xs[prv], ys[i]-ys[prv] // prev -> i + uOutX, uOutY := xs[nxt]-xs[i], ys[nxt]-ys[i] // i -> next + uInX, uInY = norm(uInX, uInY) + uOutX, uOutY = norm(uOutX, uOutY) + + // tangency points along edges from the vertex + sx, sy := xs[i]-uInX*tTrim, ys[i]-uInY*tTrim // incoming (toward prev) + ex, ey := xs[i]+uOutX*tTrim, ys[i]+uOutY*tTrim // outgoing (toward next) + + // interior bisector direction and arc center + bx, by := -uInX+uOutX, -uInY+uOutY + bx, by = norm(bx, by) + cxI, cyI := xs[i]+bx*d, ys[i]+by*d + + // center->tangent vectors + vsx, vsy := sx-cxI, sy-cyI + velx, vely := ex-cxI, ey-cyI + + sPts[i] = pt{sx, sy} + vS[i] = pt{vsx, vsy} + vE[i] = pt{velx, vely} + cPts[i] = pt{cxI, cyI} + } + + // start at s0, arc corner 0, then line+arc around, close last edge + p.Start(rasterx.ToFixedP(sPts[0].x, sPts[0].y)) + gf(p, + rasterx.ToFixedP(cPts[0].x, cPts[0].y), + rasterx.ToFixedP(vS[0].x, vS[0].y), + rasterx.ToFixedP(vE[0].x, vE[0].y), + ) + for i := 1; i < sides; i++ { + p.Line(rasterx.ToFixedP(sPts[i].x, sPts[i].y)) + gf(p, + rasterx.ToFixedP(cPts[i].x, cPts[i].y), + rasterx.ToFixedP(vS[i].x, vS[i].y), + rasterx.ToFixedP(vE[i].x, vE[i].y), + ) + } + p.Line(rasterx.ToFixedP(sPts[0].x, sPts[0].y)) + p.Stop(true) +} + +// drawRoundArc constructs a rounded pie slice or annular sector +// it uses the Unit circle coordinate system +func drawRoundArc(adder rasterx.Adder, cx, cy, outer, inner, start, sweep, cr float64) { + if sweep == 0 { + return + } + + cosSinPoint := func(cx, cy, r, ang float64) (x, y float64) { + return cx + r*math.Cos(ang), cy - r*math.Sin(ang) + } + + // addCircularArc appends a circular arc to the current path using cubic Bezier approximation. + // 'adder' must already be positioned at the arc start point. + // sweep is signed (positive = CCW, negative = CW). + addCircularArc := func(adder rasterx.Adder, cx, cy, r, start, sweep float64) { + if sweep == 0 || r == 0 { + return + } + segCount := int(math.Ceil(math.Abs(sweep) / (math.Pi / 2.0))) + da := sweep / float64(segCount) + + for i := 0; i < segCount; i++ { + a1 := start + float64(i)*da + a2 := a1 + da + + x1, y1 := cosSinPoint(cx, cy, r, a1) + x2, y2 := cosSinPoint(cx, cy, r, a2) + + k := 4.0 / 3.0 * math.Tan((a2-a1)/4.0) + // tangent unit vectors on our param (x = cx+rcos, y = cy-rsin) + c1x := x1 + k*r*(-math.Sin(a1)) + c1y := y1 + k*r*(-math.Cos(a1)) + c2x := x2 - k*r*(-math.Sin(a2)) + c2y := y2 - k*r*(-math.Cos(a2)) + + adder.CubeBezier( + rasterx.ToFixedP(c1x, c1y), + rasterx.ToFixedP(c2x, c2y), + rasterx.ToFixedP(x2, y2), + ) + } + } + + // full-circle/donut paths (two closed subpaths: outer CCW, inner CW if inner > 0) + if math.Abs(sweep) >= 2*math.Pi { + // outer loop (CCW) + ox, oy := cosSinPoint(cx, cy, outer, 0) + adder.Start(rasterx.ToFixedP(ox, oy)) + addCircularArc(adder, cx, cy, outer, 0, 2*math.Pi) + adder.Stop(true) + // inner loop reversed (CW) to create a hole + if inner > 0 { + ix, iy := cosSinPoint(cx, cy, inner, 0) + adder.Start(rasterx.ToFixedP(ix, iy)) + addCircularArc(adder, cx, cy, inner, 0, -2*math.Pi) + adder.Stop(true) + } + return + } + + if cr <= 0 { + // sharp-corner fallback + if inner <= 0 { + // pie slice + ox, oy := cosSinPoint(cx, cy, outer, start) + adder.Start(rasterx.ToFixedP(cx, cy)) + adder.Line(rasterx.ToFixedP(ox, oy)) + addCircularArc(adder, cx, cy, outer, start, sweep) + adder.Line(rasterx.ToFixedP(cx, cy)) + adder.Stop(true) + return + } + // annular sector + outerStartX, outerStartY := cosSinPoint(cx, cy, outer, start) + adder.Start(rasterx.ToFixedP(outerStartX, outerStartY)) + addCircularArc(adder, cx, cy, outer, start, sweep) + innerEndX, innerEndY := cosSinPoint(cx, cy, inner, start+sweep) + adder.Line(rasterx.ToFixedP(innerEndX, innerEndY)) + addCircularArc(adder, cx, cy, inner, start+sweep, -sweep) + adder.Stop(true) + return + } + + // rounded corners + sgn := 1.0 + if sweep < 0 { + sgn = -1.0 + } + absSweep := math.Abs(sweep) + + // clamp the corner radius if the value is too large + cr = math.Min(cr, outer/2) + + // trim angles due to rounds + sOut := math.Sqrt(math.Max(0, outer*(outer-2*cr))) + thetaOut := math.Atan2(cr, sOut) // positive + + crIn := math.Min(cr, 0.5*math.Min(outer-inner, math.Abs(sweep)*inner)) + var sIn, thetaIn float64 + if inner > 0 { + sIn = math.Sqrt(math.Max(0, inner*(inner+2*crIn))) + thetaIn = math.Atan2(crIn, sIn) + } + + // ensure the trim does not exceed half the sweep + thetaOut = math.Min(thetaOut, absSweep/2.0-1e-6) + if thetaOut < 0 { + thetaOut = 0 + } + if inner > 0 { + thetaIn = math.Min(thetaIn, absSweep/2.0-1e-6) + if thetaIn < 0 { + thetaIn = 0 + } + } + + // trimmed arc angles + startOuter := start + sgn*thetaOut + endOuter := start + sweep - sgn*thetaOut + + startInner := 0.0 + endInner := 0.0 + if inner > 0 { + startInner = start + sgn*thetaIn + endInner = start + sweep - sgn*thetaIn + } + + // direction frames at start/end radial lines + // start side + vSx, vSy := math.Cos(start), -math.Sin(start) + tSx, tSy := -math.Sin(start), -math.Cos(start) + nSx, nSy := sgn*tSx, sgn*tSy // interior side normal at start + + // end side + endRad := start + sweep + vEx, vEy := math.Cos(endRad), -math.Sin(endRad) + tEx, tEy := -math.Sin(endRad), -math.Cos(endRad) + nEx, nEy := -sgn*tEx, -sgn*tEy // interior side normal at end + + // key points on arcs + pOutStartX, pOutStartY := cosSinPoint(cx, cy, outer, startOuter) + pOutEndX, pOutEndY := cosSinPoint(cx, cy, outer, endOuter) + + var pInStartX, pInStartY, pInEndX, pInEndY float64 + if inner > 0 { + pInStartX, pInStartY = cosSinPoint(cx, cy, inner, startInner) + pInEndX, pInEndY = cosSinPoint(cx, cy, inner, endInner) + } + + angleAt := func(cx, cy, x, y float64) float64 { + return math.Atan2(cy-y, x-cx) + } + + // round geometry at start/end + // outer rounds + aOutSx, aOutSy := cx+sOut*vSx, cy+sOut*vSy // radial tangent (start) + fOutSx, fOutSy := aOutSx+cr*nSx, aOutSy+cr*nSy // round center (start) + aOutEx, aOutEy := cx+sOut*vEx, cy+sOut*vEy // radial tangent (end) + fOutEx, fOutEy := aOutEx+cr*nEx, aOutEy+cr*nEy // round center (end) + phiOutEndB := angleAt(fOutEx, fOutEy, pOutEndX, pOutEndY) // outer end trimmed point + phiOutEndA := angleAt(fOutEx, fOutEy, aOutEx, aOutEy) // end radial tangent + phiOutStartA := angleAt(fOutSx, fOutSy, aOutSx, aOutSy) // start radial tangent + phiOutStartB := angleAt(fOutSx, fOutSy, pOutStartX, pOutStartY) // outer start trimmed point + + // inner rounds + var aInSx, aInSy, fInSx, fInSy, aInEx, aInEy, fInEx, fInEy float64 + var phiInEndA, phiInEndB, phiInStartA, phiInStartB float64 + if inner > 0 { + aInSx, aInSy = cx+sIn*vSx, cy+sIn*vSy + fInSx, fInSy = aInSx+crIn*nSx, aInSy+crIn*nSy + aInEx, aInEy = cx+sIn*vEx, cy+sIn*vEy + fInEx, fInEy = aInEx+crIn*nEx, aInEy+crIn*nEy + + phiInEndA = angleAt(fInEx, fInEy, aInEx, aInEy) // end radial tangent + phiInEndB = angleAt(fInEx, fInEy, pInEndX, pInEndY) // inner end trimmed point + phiInStartB = angleAt(fInSx, fInSy, pInStartX, pInStartY) // inner start trimmed point + phiInStartA = angleAt(fInSx, fInSy, aInSx, aInSy) // start radial tangent + } + + angleDiff := func(delta float64) float64 { + return math.Atan2(math.Sin(delta), math.Cos(delta)) + } + + adder.Start(rasterx.ToFixedP(pOutStartX, pOutStartY)) // start at trimmed outer start + addCircularArc(adder, cx, cy, outer, startOuter, endOuter-startOuter) // outer arc (trimmed) + addCircularArc(adder, fOutEx, fOutEy, cr, phiOutEndB, angleDiff(phiOutEndA-phiOutEndB)) // end side: outer round to radial + + if inner > 0 { + adder.Line(rasterx.ToFixedP(aInEx, aInEy)) // end side: radial line to inner + addCircularArc(adder, fInEx, fInEy, crIn, phiInEndA, angleDiff(phiInEndB-phiInEndA)) // end side: inner round to inner arc + addCircularArc(adder, cx, cy, inner, endInner, startInner-endInner) // inner arc (reverse, trimmed) + addCircularArc(adder, fInSx, fInSy, crIn, phiInStartB, angleDiff(phiInStartA-phiInStartB)) // start side: inner round to radial + adder.Line(rasterx.ToFixedP(aOutSx, aOutSy)) // start side: radial line to outer + } else { + // pie slice: close via center with radial lines + adder.Line(rasterx.ToFixedP(cx, cy)) // to center from end side + adder.Line(rasterx.ToFixedP(aOutSx, aOutSy)) // to start-side radial tangent + } + + // start side: outer round from radial to outer start + addCircularArc(adder, fOutSx, fOutSy, cr, phiOutStartA, angleDiff(phiOutStartB-phiOutStartA)) + adder.Stop(true) +} + +// GetCornerRadius returns the effective corner radius for a rectangle or square corner. +// If the specific corner radius (perCornerRadius) is zero, it falls back to the baseCornerRadius. +// Otherwise, it uses the specific corner radius provided. +// +// This allows for per-corner customization while maintaining a default overall radius. +func GetCornerRadius(perCornerRadius, baseCornerRadius float32) float32 { + if perCornerRadius == 0.0 { + return baseCornerRadius + } + return perCornerRadius +} + +// GetMaximumRadius returns the maximum possible corner radius that fits within the given size. +// It calculates half of the smaller dimension (width or height) of the provided fyne.Size. +// +// This is typically used for drawing circular corners in rectangles, circles or squares with the same radius for all corners. +func GetMaximumRadius(size fyne.Size) float32 { + return fyne.Min(size.Height, size.Width) / 2 +} + +// GetMaximumCornerRadius returns the maximum possible corner radius for an individual corner, +// considering the specified corner radius, the radii of adjacent corners, and the maximum radii +// allowed for the width and height of the shape. Corner radius may utilize unused capacity from adjacent corners with radius smaller than maximum value +// so this corner can grow up to double the maximum radius of the smaller dimension (width or height) without causing overlaps. +// +// This is typically used for drawing circular corners in rectangles or squares with different corner radii. +func GetMaximumCornerRadius(radius, adjacentWidthRadius, adjacentHeightRadius float32, size fyne.Size) float32 { + maxWidthRadius := size.Width / 2 + maxHeightRadius := size.Height / 2 + // fast path: corner radius fits within both per-axis maxima + if radius <= fyne.Min(maxWidthRadius, maxHeightRadius) { + return radius + } + // expand per-axis limits by borrowing any unused capacity from adjacent corners + expandedMaxWidthRadius := 2*maxWidthRadius - fyne.Min(maxWidthRadius, adjacentWidthRadius) + expandedMaxHeightRadius := 2*maxHeightRadius - fyne.Min(maxHeightRadius, adjacentHeightRadius) + + // respect the smaller axis and never exceed the requested radius + expandedMaxRadius := fyne.Min(expandedMaxWidthRadius, expandedMaxHeightRadius) + return fyne.Min(expandedMaxRadius, radius) +} + +// GetMaximumRadiusArc returns the maximum possible corner radius for an arc segment based on the outer radius, +// inner radius, and sweep angle in degrees. +// It calculates half of the smaller dimension (thickness or effective length) of the provided arc parameters +func GetMaximumRadiusArc(outerRadius, innerRadius, sweepAngle float32) float32 { + // height (thickness), width (length) + thickness := outerRadius - innerRadius + // TODO: length formula can be improved to get a fully rounded (pill shape) outer edge for thin (small sweep) arc segments + span := math.Sin(0.5 * math.Min(math.Abs(float64(sweepAngle))*math.Pi/180.0, math.Pi)) // span in (0,1) + length := 1.5 * float64(outerRadius) * span / (1 + span) // no division-by-zero risk + + return GetMaximumRadius(fyne.NewSize( + thickness, float32(length), + )) +} + +// NormalizeArcAngles adjusts the given start and end angles for arc drawing. +// It converts the angles from the Unit circle coordinate system (where 0 degrees is along the positive X-axis) +// to the coordinate system used by the painter, where 0 degrees is at the top (12 o'clock position). +// The function also reverses the direction: positive is clockwise, negative is counter-clockwise +func NormalizeArcAngles(startAngle, endAngle float32) (float32, float32) { + return -(startAngle - 90), -(endAngle - 90) +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/font.go b/vendor/fyne.io/fyne/v2/internal/painter/font.go new file mode 100644 index 0000000..e32ba3c --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/font.go @@ -0,0 +1,389 @@ +package painter + +import ( + "bytes" + "image/color" + "image/draw" + "math" + "strings" + "sync" + + "github.com/go-text/render" + "github.com/go-text/typesetting/di" + "github.com/go-text/typesetting/font" + "github.com/go-text/typesetting/fontscan" + "github.com/go-text/typesetting/language" + "github.com/go-text/typesetting/shaping" + "golang.org/x/image/math/fixed" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/async" + "fyne.io/fyne/v2/internal/cache" + "fyne.io/fyne/v2/lang" + "fyne.io/fyne/v2/theme" +) + +const ( + // DefaultTabWidth is the default width in spaces + DefaultTabWidth = 4 + + fontTabSpaceSize = 10 +) + +var ( + fm *fontscan.FontMap + fontScanLock sync.Mutex + loaded bool +) + +func loadMap() { + loaded = true + + fm = fontscan.NewFontMap(noopLogger{}) + err := loadSystemFonts(fm) + if err != nil { + fm = nil // just don't fallback + } +} + +func lookupLangFont(family string, aspect font.Aspect) *font.Face { + fontScanLock.Lock() + defer fontScanLock.Unlock() + + if !loaded { + loadMap() + } + if fm == nil { + return nil + } + + fm.SetQuery(fontscan.Query{Families: []string{family}, Aspect: aspect}) + l, _ := fontscan.NewLangID(language.Language(lang.SystemLocale().LanguageString())) + return fm.ResolveFaceForLang(l) +} + +func lookupRuneFont(r rune, family string, aspect font.Aspect) *font.Face { + fontScanLock.Lock() + defer fontScanLock.Unlock() + + if !loaded { + loadMap() + } + if fm == nil { + return nil + } + + fm.SetQuery(fontscan.Query{Families: []string{family}, Aspect: aspect}) + return fm.ResolveFace(r) +} + +func lookupFaces(theme, fallback, emoji fyne.Resource, family string, style fyne.TextStyle) (faces *dynamicFontMap) { + f1 := loadMeasureFont(theme) + if theme == fallback { + faces = &dynamicFontMap{family: family, faces: []*font.Face{f1}} + } else { + f2 := loadMeasureFont(fallback) + faces = &dynamicFontMap{family: family, faces: []*font.Face{f1, f2}} + } + + aspect := font.Aspect{Style: font.StyleNormal} + if style.Italic { + aspect.Style = font.StyleItalic + } + if style.Bold { + aspect.Weight = font.WeightBold + } + + if emoji != nil { + faces.addFace(loadMeasureFont(emoji)) + } + + local := lookupLangFont(family, aspect) + if local != nil { + faces.addFace(local) + } + + return faces +} + +// CachedFontFace returns a Font face held in memory. These are loaded from the current theme. +func CachedFontFace(style fyne.TextStyle, source fyne.Resource, o fyne.CanvasObject) *FontCacheItem { + if source != nil { + val, ok := fontCustomCache.Load(source) + if !ok { + face := loadMeasureFont(source) + if face == nil { + face = loadMeasureFont(theme.TextFont()) + } + faces := &dynamicFontMap{family: source.Name(), faces: []*font.Face{face}} + + val = &FontCacheItem{Fonts: faces} + fontCustomCache.Store(source, val) + } + return val + } + + scope := "" + if o != nil { // for overridden themes get the cache key right + scope = cache.WidgetScopeID(o) + } + + val, ok := fontCache.Load(cacheID{style: style, scope: scope}) + if !ok { + var faces *dynamicFontMap + + th := theme.CurrentForWidget(o) + font1 := th.Font(style) + + emoji := theme.DefaultEmojiFont() // TODO only one emoji - maybe others too + switch { + case style.Monospace: + faces = lookupFaces(font1, theme.DefaultTextMonospaceFont(), emoji, fontscan.Monospace, style) + case style.Bold: + if style.Italic { + faces = lookupFaces(font1, theme.DefaultTextBoldItalicFont(), emoji, fontscan.SansSerif, style) + } else { + faces = lookupFaces(font1, theme.DefaultTextBoldFont(), emoji, fontscan.SansSerif, style) + } + case style.Italic: + faces = lookupFaces(font1, theme.DefaultTextItalicFont(), emoji, fontscan.SansSerif, style) + case style.Symbol: + th := theme.SymbolFont() + fallback := theme.DefaultSymbolFont() + f1 := loadMeasureFont(th) + + if th == fallback { + faces = &dynamicFontMap{family: fontscan.SansSerif, faces: []*font.Face{f1}} + } else { + f2 := loadMeasureFont(fallback) + faces = &dynamicFontMap{family: fontscan.SansSerif, faces: []*font.Face{f1, f2}} + } + default: + faces = lookupFaces(font1, theme.DefaultTextFont(), emoji, fontscan.SansSerif, style) + } + + val = &FontCacheItem{Fonts: faces} + fontCache.Store(cacheID{style: style, scope: scope}, val) + } + + return val +} + +// ClearFontCache is used to remove cached fonts in the case that we wish to re-load Font faces +func ClearFontCache() { + fontCache.Clear() + fontCustomCache.Clear() +} + +// DrawString draws a string into an image. +func DrawString(dst draw.Image, s string, color color.Color, f shaping.Fontmap, fontSize, scale float32, style fyne.TextStyle) { + r := render.Renderer{ + FontSize: fontSize, + PixScale: scale, + Color: color, + } + + advance := float32(0) + y := math.MinInt + walkString(f, s, float32ToFixed266(fontSize), style, &advance, scale, func(run shaping.Output, x float32) { + if y == math.MinInt { + y = int(math.Ceil(float64(fixed266ToFloat32(run.LineBounds.Ascent) * r.PixScale))) + } + if len(run.Glyphs) == 1 { + if run.Glyphs[0].GlyphID == 0 { + r.DrawStringAt(string([]rune{0xfffd}), dst, int(x), y, f.ResolveFace(0xfffd)) + return + } + } + + r.DrawShapedRunAt(run, dst, int(x), y) + }) +} + +func loadMeasureFont(data fyne.Resource) *font.Face { + loaded, err := font.ParseTTF(bytes.NewReader(data.Content())) + if err != nil { + fyne.LogError("font load error", err) + return nil + } + + return loaded +} + +// MeasureString returns how far dot would advance by drawing s with f. +// Tabs are translated into a dot location change. +func MeasureString(f shaping.Fontmap, s string, textSize float32, style fyne.TextStyle) (size fyne.Size, advance float32) { + return walkString(f, s, float32ToFixed266(textSize), style, &advance, 1, func(shaping.Output, float32) {}) +} + +// RenderedTextSize looks up how big a string would be if drawn on screen. +// It also returns the distance from top to the text baseline. +func RenderedTextSize(text string, fontSize float32, style fyne.TextStyle, source fyne.Resource) (size fyne.Size, baseline float32) { + size, base := cache.GetFontMetrics(text, fontSize, style, source) + if base != 0 { + return size, base + } + + size, base = measureText(text, fontSize, style, source) + cache.SetFontMetrics(text, fontSize, style, source, size, base) + return size, base +} + +func fixed266ToFloat32(i fixed.Int26_6) float32 { + return float32(float64(i) / (1 << 6)) +} + +func float32ToFixed266(f float32) fixed.Int26_6 { + return fixed.Int26_6(float64(f) * (1 << 6)) +} + +func measureText(text string, fontSize float32, style fyne.TextStyle, source fyne.Resource) (fyne.Size, float32) { + face := CachedFontFace(style, source, nil) + return MeasureString(face.Fonts, text, fontSize, style) +} + +func tabStop(spacew, x float32, tabWidth int) float32 { + if tabWidth <= 0 { + tabWidth = DefaultTabWidth + } + + tabw := spacew * float32(tabWidth) + tabs, _ := math.Modf(float64((x + tabw) / tabw)) + return tabw * float32(tabs) +} + +func walkString(faces shaping.Fontmap, s string, textSize fixed.Int26_6, style fyne.TextStyle, advance *float32, scale float32, + cb func(run shaping.Output, x float32), +) (size fyne.Size, base float32) { + s = strings.ReplaceAll(s, "\r", "") + + runes := []rune(s) + in := shaping.Input{ + Text: []rune{' '}, + RunStart: 0, + RunEnd: 1, + Direction: di.DirectionLTR, + Face: faces.ResolveFace(' '), + Size: textSize, + } + shaper := &shaping.HarfbuzzShaper{} + segmenter := &shaping.Segmenter{} + out := shaper.Shape(in) + + in.Text = runes + in.RunStart = 0 + in.RunEnd = len(runes) + + x := float32(0) + spacew := scale * fontTabSpaceSize + if style.Monospace { + spacew = scale * fixed266ToFloat32(out.Advance) + } + ins := segmenter.Split(in, faces) + for _, in := range ins { + inEnd := in.RunEnd + + pending := false + for i, r := range in.Text[in.RunStart:in.RunEnd] { + if r == '\t' { + if pending { + in.RunEnd = i + x = shapeCallback(shaper, in, x, scale, cb) + } + x = tabStop(spacew, x, style.TabWidth) + + in.RunStart = i + 1 + in.RunEnd = inEnd + pending = false + } else { + pending = true + } + } + + x = shapeCallback(shaper, in, x, scale, cb) + } + + *advance = x + return fyne.NewSize(*advance, fixed266ToFloat32(out.LineBounds.LineThickness())), + fixed266ToFloat32(out.LineBounds.Ascent) +} + +func shapeCallback(shaper shaping.Shaper, in shaping.Input, x, scale float32, cb func(shaping.Output, float32)) float32 { + out := shaper.Shape(in) + glyphs := out.Glyphs + start := 0 + pending := false + adv := fixed.I(0) + for i, g := range out.Glyphs { + if g.GlyphID == 0 { + if pending { + out.Glyphs = glyphs[start:i] + cb(out, x) + x += fixed266ToFloat32(adv) * scale + adv = 0 + } + + out.Glyphs = glyphs[i : i+1] + cb(out, x) + x += fixed266ToFloat32(glyphs[i].XAdvance) * scale + adv = 0 + + start = i + 1 + pending = false + } else { + pending = true + } + adv += g.XAdvance + } + + if pending { + out.Glyphs = glyphs[start:] + cb(out, x) + x += fixed266ToFloat32(adv) * scale + adv = 0 + } + return x + fixed266ToFloat32(adv)*scale +} + +type FontCacheItem struct { + Fonts shaping.Fontmap +} + +type cacheID struct { + style fyne.TextStyle + scope string +} + +var ( + fontCache async.Map[cacheID, *FontCacheItem] + fontCustomCache async.Map[fyne.Resource, *FontCacheItem] // for custom resources +) + +type noopLogger struct{} + +func (n noopLogger) Printf(string, ...any) {} + +type dynamicFontMap struct { + faces []*font.Face + family string +} + +func (d *dynamicFontMap) ResolveFace(r rune) *font.Face { + for _, f := range d.faces { + if _, ok := f.NominalGlyph(r); ok { + return f + } + } + + toAdd := lookupRuneFont(r, d.family, font.Aspect{}) + if toAdd != nil { + d.addFace(toAdd) + return toAdd + } + + return d.faces[0] +} + +func (d *dynamicFontMap) addFace(f *font.Face) { + d.faces = append(d.faces, f) +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/font_prod.go b/vendor/fyne.io/fyne/v2/internal/painter/font_prod.go new file mode 100644 index 0000000..fb57e31 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/font_prod.go @@ -0,0 +1,21 @@ +//go:build !test + +package painter + +import ( + "os" + "path/filepath" + "runtime" + + "github.com/go-text/typesetting/fontscan" +) + +func loadSystemFonts(fm *fontscan.FontMap) error { + cacheDir := "" + if runtime.GOOS == "android" { + parent := os.Getenv("FILESDIR") + cacheDir = filepath.Join(parent, "fontcache") + } + + return fm.UseSystemFonts(cacheDir) +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/capture.go b/vendor/fyne.io/fyne/v2/internal/painter/gl/capture.go new file mode 100644 index 0000000..ec3a922 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/capture.go @@ -0,0 +1,45 @@ +package gl + +import ( + "image" + "image/color" + + "fyne.io/fyne/v2" +) + +type captureImage struct { + pix []uint8 + width, height int +} + +func (c *captureImage) ColorModel() color.Model { + return color.RGBAModel +} + +func (c *captureImage) Bounds() image.Rectangle { + return image.Rect(0, 0, c.width, c.height) +} + +func (c *captureImage) At(x, y int) color.Color { + start := ((c.height-y-1)*c.width + x) * 4 + return color.RGBA{R: c.pix[start], G: c.pix[start+1], B: c.pix[start+2], A: c.pix[start+3]} +} + +func (p *painter) Capture(c fyne.Canvas) image.Image { + pos := fyne.NewPos(c.Size().Width, c.Size().Height) + width, height := c.PixelCoordinateForPosition(pos) + pixels := make([]uint8, width*height*4) + + p.contextProvider.RunWithContext(func() { + p.ctx.ReadBuffer(front) + p.logError() + p.ctx.ReadPixels(0, 0, width, height, colorFormatRGBA, unsignedByte, pixels) + p.logError() + }) + + return &captureImage{ + pix: pixels, + width: width, + height: height, + } +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/context.go b/vendor/fyne.io/fyne/v2/internal/painter/gl/context.go new file mode 100644 index 0000000..942c490 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/context.go @@ -0,0 +1,45 @@ +package gl + +type context interface { + ActiveTexture(textureUnit uint32) + AttachShader(program Program, shader Shader) + BindBuffer(target uint32, buf Buffer) + BindTexture(target uint32, texture Texture) + BlendColor(r, g, b, a float32) + BlendFunc(srcFactor, destFactor uint32) + BufferData(target uint32, points []float32, usage uint32) + BufferSubData(target uint32, points []float32) + Clear(mask uint32) + ClearColor(r, g, b, a float32) + CompileShader(shader Shader) + CreateBuffer() Buffer + CreateProgram() Program + CreateShader(typ uint32) Shader + CreateTexture() Texture + DeleteBuffer(buffer Buffer) + DeleteTexture(texture Texture) + Disable(capability uint32) + DrawArrays(mode uint32, first, count int) + Enable(capability uint32) + EnableVertexAttribArray(attribute Attribute) + GetAttribLocation(program Program, name string) Attribute + GetError() uint32 + GetProgrami(program Program, param uint32) int + GetProgramInfoLog(program Program) string + GetShaderi(shader Shader, param uint32) int + GetShaderInfoLog(shader Shader) string + GetUniformLocation(program Program, name string) Uniform + LinkProgram(program Program) + ReadBuffer(src uint32) + ReadPixels(x, y, width, height int, colorFormat, typ uint32, pixels []uint8) + Scissor(x, y, w, h int32) + ShaderSource(shader Shader, source string) + TexImage2D(target uint32, level, width, height int, colorFormat, typ uint32, data []uint8) + TexParameteri(target, param uint32, value int32) + Uniform1f(uniform Uniform, v float32) + Uniform2f(uniform Uniform, v0, v1 float32) + Uniform4f(uniform Uniform, v0, v1, v2, v3 float32) + UseProgram(program Program) + VertexAttribPointerWithOffset(attribute Attribute, size int, typ uint32, normalized bool, stride, offset int) + Viewport(x, y, width, height int) +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/draw.go b/vendor/fyne.io/fyne/v2/internal/painter/gl/draw.go new file mode 100644 index 0000000..53fd213 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/draw.go @@ -0,0 +1,642 @@ +package gl + +import ( + "image/color" + "math" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + paint "fyne.io/fyne/v2/internal/painter" +) + +const edgeSoftness = 1.0 + +func (p *painter) createBuffer(size int) Buffer { + vbo := p.ctx.CreateBuffer() + p.logError() + p.ctx.BindBuffer(arrayBuffer, vbo) + p.logError() + p.ctx.BufferData(arrayBuffer, make([]float32, size), staticDraw) + p.logError() + return vbo +} + +func (p *painter) drawCircle(circle *canvas.Circle, pos fyne.Position, frame fyne.Size) { + radius := paint.GetMaximumRadius(circle.Size()) + program := p.roundRectangleProgram + + // Vertex: BEG + bounds, points := p.vecSquareCoords(pos, circle, frame) + p.ctx.UseProgram(program.ref) + p.updateBuffer(program.buff, points) + p.UpdateVertexArray(program, "vert", 2, 4, 0) + p.UpdateVertexArray(program, "normal", 2, 4, 2) + + p.ctx.BlendFunc(srcAlpha, oneMinusSrcAlpha) + p.logError() + // Vertex: END + + // Fragment: BEG + frameWidthScaled, frameHeightScaled := p.scaleFrameSize(frame) + p.SetUniform2f(program, "frame_size", frameWidthScaled, frameHeightScaled) + + x1Scaled, x2Scaled, y1Scaled, y2Scaled := p.scaleRectCoords(bounds[0], bounds[2], bounds[1], bounds[3]) + p.SetUniform4f(program, "rect_coords", x1Scaled, x2Scaled, y1Scaled, y2Scaled) + + strokeWidthScaled := roundToPixel(circle.StrokeWidth*p.pixScale, 1.0) + p.SetUniform1f(program, "stroke_width_half", strokeWidthScaled*0.5) + + rectSizeWidthScaled := x2Scaled - x1Scaled - strokeWidthScaled + rectSizeHeightScaled := y2Scaled - y1Scaled - strokeWidthScaled + p.SetUniform2f(program, "rect_size_half", rectSizeWidthScaled*0.5, rectSizeHeightScaled*0.5) + + radiusScaled := roundToPixel(radius*p.pixScale, 1.0) + p.SetUniform4f(program, "radius", radiusScaled, radiusScaled, radiusScaled, radiusScaled) + + r, g, b, a := getFragmentColor(circle.FillColor) + p.SetUniform4f(program, "fill_color", r, g, b, a) + + strokeColor := circle.StrokeColor + if strokeColor == nil { + strokeColor = color.Transparent + } + r, g, b, a = getFragmentColor(strokeColor) + p.SetUniform4f(program, "stroke_color", r, g, b, a) + + edgeSoftnessScaled := roundToPixel(edgeSoftness*p.pixScale, 1.0) + p.SetUniform1f(program, "edge_softness", edgeSoftnessScaled) + p.logError() + // Fragment: END + + p.ctx.DrawArrays(triangleStrip, 0, 4) + p.logError() +} + +func (p *painter) drawGradient(o fyne.CanvasObject, texCreator func(fyne.CanvasObject) Texture, pos fyne.Position, frame fyne.Size) { + p.drawTextureWithDetails(o, texCreator, pos, o.Size(), frame, canvas.ImageFillStretch, 1.0, 0) +} + +func (p *painter) drawImage(img *canvas.Image, pos fyne.Position, frame fyne.Size) { + p.drawTextureWithDetails(img, p.newGlImageTexture, pos, img.Size(), frame, img.FillMode, float32(img.Alpha()), 0) +} + +func (p *painter) drawLine(line *canvas.Line, pos fyne.Position, frame fyne.Size) { + if line.StrokeColor == color.Transparent || line.StrokeColor == nil || line.StrokeWidth == 0 { + return + } + points, halfWidth, feather := p.lineCoords(pos, line.Position1, line.Position2, line.StrokeWidth, 0.5, frame) + p.ctx.UseProgram(p.lineProgram.ref) + p.updateBuffer(p.lineProgram.buff, points) + p.UpdateVertexArray(p.lineProgram, "vert", 2, 4, 0) + p.UpdateVertexArray(p.lineProgram, "normal", 2, 4, 2) + + p.ctx.BlendFunc(srcAlpha, oneMinusSrcAlpha) + p.logError() + + r, g, b, a := getFragmentColor(line.StrokeColor) + p.SetUniform4f(p.lineProgram, "color", r, g, b, a) + + p.SetUniform1f(p.lineProgram, "lineWidth", halfWidth) + + p.SetUniform1f(p.lineProgram, "feather", feather) + + p.ctx.DrawArrays(triangles, 0, 6) + p.logError() +} + +func (p *painter) drawObject(o fyne.CanvasObject, pos fyne.Position, frame fyne.Size) { + switch obj := o.(type) { + case *canvas.Circle: + p.drawCircle(obj, pos, frame) + case *canvas.Line: + p.drawLine(obj, pos, frame) + case *canvas.Image: + p.drawImage(obj, pos, frame) + case *canvas.Raster: + p.drawRaster(obj, pos, frame) + case *canvas.Rectangle: + p.drawRectangle(obj, pos, frame) + case *canvas.Text: + p.drawText(obj, pos, frame) + case *canvas.LinearGradient: + p.drawGradient(obj, p.newGlLinearGradientTexture, pos, frame) + case *canvas.RadialGradient: + p.drawGradient(obj, p.newGlRadialGradientTexture, pos, frame) + case *canvas.Polygon: + p.drawPolygon(obj, pos, frame) + case *canvas.Arc: + p.drawArc(obj, pos, frame) + } +} + +func (p *painter) drawRaster(img *canvas.Raster, pos fyne.Position, frame fyne.Size) { + p.drawTextureWithDetails(img, p.newGlRasterTexture, pos, img.Size(), frame, canvas.ImageFillStretch, float32(img.Alpha()), 0) +} + +func (p *painter) drawRectangle(rect *canvas.Rectangle, pos fyne.Position, frame fyne.Size) { + topRightRadius := paint.GetCornerRadius(rect.TopRightCornerRadius, rect.CornerRadius) + topLeftRadius := paint.GetCornerRadius(rect.TopLeftCornerRadius, rect.CornerRadius) + bottomRightRadius := paint.GetCornerRadius(rect.BottomRightCornerRadius, rect.CornerRadius) + bottomLeftRadius := paint.GetCornerRadius(rect.BottomLeftCornerRadius, rect.CornerRadius) + p.drawOblong(rect, rect.FillColor, rect.StrokeColor, rect.StrokeWidth, topRightRadius, topLeftRadius, bottomRightRadius, bottomLeftRadius, rect.Aspect, pos, frame) +} + +func (p *painter) drawOblong(obj fyne.CanvasObject, fill, stroke color.Color, strokeWidth, topRightRadius, topLeftRadius, bottomRightRadius, bottomLeftRadius, aspect float32, pos fyne.Position, frame fyne.Size) { + if (fill == color.Transparent || fill == nil) && (stroke == color.Transparent || stroke == nil || strokeWidth == 0) { + return + } + + roundedCorners := topRightRadius != 0 || topLeftRadius != 0 || bottomRightRadius != 0 || bottomLeftRadius != 0 + var program ProgramState + if roundedCorners { + program = p.roundRectangleProgram + } else { + program = p.rectangleProgram + } + + // Vertex: BEG + bounds, points := p.vecRectCoords(pos, obj, frame, aspect) + p.ctx.UseProgram(program.ref) + p.updateBuffer(program.buff, points) + p.UpdateVertexArray(program, "vert", 2, 4, 0) + p.UpdateVertexArray(program, "normal", 2, 4, 2) + + p.ctx.BlendFunc(srcAlpha, oneMinusSrcAlpha) + p.logError() + // Vertex: END + + // Fragment: BEG + frameWidthScaled, frameHeightScaled := p.scaleFrameSize(frame) + p.SetUniform2f(program, "frame_size", frameWidthScaled, frameHeightScaled) + + x1Scaled, x2Scaled, y1Scaled, y2Scaled := p.scaleRectCoords(bounds[0], bounds[2], bounds[1], bounds[3]) + p.SetUniform4f(program, "rect_coords", x1Scaled, x2Scaled, y1Scaled, y2Scaled) + + strokeWidthScaled := roundToPixel(strokeWidth*p.pixScale, 1.0) + if roundedCorners { + p.SetUniform1f(program, "stroke_width_half", strokeWidthScaled*0.5) + + rectSizeWidthScaled := x2Scaled - x1Scaled - strokeWidthScaled + rectSizeHeightScaled := y2Scaled - y1Scaled - strokeWidthScaled + p.SetUniform2f(program, "rect_size_half", rectSizeWidthScaled*0.5, rectSizeHeightScaled*0.5) + + // the maximum possible corner radii for a circular shape, calculated taking into account the rect coords with aspect ratio + size := fyne.NewSize(bounds[2]-bounds[0], bounds[3]-bounds[1]) + topRightRadiusScaled := roundToPixel( + paint.GetMaximumCornerRadius(topRightRadius, topLeftRadius, bottomRightRadius, size)*p.pixScale, + 1.0, + ) + topLeftRadiusScaled := roundToPixel( + paint.GetMaximumCornerRadius(topLeftRadius, topRightRadius, bottomLeftRadius, size)*p.pixScale, + 1.0, + ) + bottomRightRadiusScaled := roundToPixel( + paint.GetMaximumCornerRadius(bottomRightRadius, bottomLeftRadius, topRightRadius, size)*p.pixScale, + 1.0, + ) + bottomLeftRadiusScaled := roundToPixel( + paint.GetMaximumCornerRadius(bottomLeftRadius, bottomRightRadius, topLeftRadius, size)*p.pixScale, + 1.0, + ) + p.SetUniform4f(program, "radius", topRightRadiusScaled, bottomRightRadiusScaled, topLeftRadiusScaled, bottomLeftRadiusScaled) + + edgeSoftnessScaled := roundToPixel(edgeSoftness*p.pixScale, 1.0) + p.SetUniform1f(program, "edge_softness", edgeSoftnessScaled) + } else { + p.SetUniform1f(program, "stroke_width", strokeWidthScaled) + } + + r, g, b, a := getFragmentColor(fill) + p.SetUniform4f(program, "fill_color", r, g, b, a) + + strokeColor := stroke + if strokeColor == nil { + strokeColor = color.Transparent + } + r, g, b, a = getFragmentColor(strokeColor) + p.SetUniform4f(program, "stroke_color", r, g, b, a) + p.logError() + // Fragment: END + + p.ctx.DrawArrays(triangleStrip, 0, 4) + p.logError() +} + +func (p *painter) drawPolygon(polygon *canvas.Polygon, pos fyne.Position, frame fyne.Size) { + if ((polygon.FillColor == color.Transparent || polygon.FillColor == nil) && (polygon.StrokeColor == color.Transparent || polygon.StrokeColor == nil || polygon.StrokeWidth == 0)) || polygon.Sides < 3 { + return + } + size := polygon.Size() + + // Vertex: BEG + bounds, points := p.vecRectCoords(pos, polygon, frame, 0.0) + program := p.polygonProgram + p.ctx.UseProgram(program.ref) + p.updateBuffer(program.buff, points) + p.UpdateVertexArray(program, "vert", 2, 4, 0) + p.UpdateVertexArray(program, "normal", 2, 4, 2) + + p.ctx.BlendFunc(srcAlpha, oneMinusSrcAlpha) + p.logError() + // Vertex: END + + // Fragment: BEG + frameWidthScaled, frameHeightScaled := p.scaleFrameSize(frame) + p.SetUniform2f(program, "frame_size", frameWidthScaled, frameHeightScaled) + + x1Scaled, x2Scaled, y1Scaled, y2Scaled := p.scaleRectCoords(bounds[0], bounds[2], bounds[1], bounds[3]) + p.SetUniform4f(program, "rect_coords", x1Scaled, x2Scaled, y1Scaled, y2Scaled) + + edgeSoftnessScaled := roundToPixel(edgeSoftness*p.pixScale, 1.0) + p.SetUniform1f(program, "edge_softness", edgeSoftnessScaled) + + outerRadius := fyne.Min(size.Width, size.Height) / 2 + outerRadiusScaled := roundToPixel(outerRadius*p.pixScale, 1.0) + p.SetUniform1f(program, "outer_radius", outerRadiusScaled) + + p.SetUniform1f(program, "angle", polygon.Angle) + p.SetUniform1f(program, "sides", float32(polygon.Sides)) + + cornerRadius := fyne.Min(paint.GetMaximumRadius(size), polygon.CornerRadius) + cornerRadiusScaled := roundToPixel(cornerRadius*p.pixScale, 1.0) + p.SetUniform1f(program, "corner_radius", cornerRadiusScaled) + + strokeWidthScaled := roundToPixel(polygon.StrokeWidth*p.pixScale, 1.0) + p.SetUniform1f(program, "stroke_width", strokeWidthScaled) + + r, g, b, a := getFragmentColor(polygon.FillColor) + p.SetUniform4f(program, "fill_color", r, g, b, a) + + strokeColor := polygon.StrokeColor + if strokeColor == nil { + strokeColor = color.Transparent + } + r, g, b, a = getFragmentColor(strokeColor) + p.SetUniform4f(program, "stroke_color", r, g, b, a) + + p.logError() + // Fragment: END + + p.ctx.DrawArrays(triangleStrip, 0, 4) + p.logError() +} + +func (p *painter) drawArc(arc *canvas.Arc, pos fyne.Position, frame fyne.Size) { + if ((arc.FillColor == color.Transparent || arc.FillColor == nil) && (arc.StrokeColor == color.Transparent || arc.StrokeColor == nil || arc.StrokeWidth == 0)) || arc.StartAngle == arc.EndAngle { + return + } + + // Vertex: BEG + bounds, points := p.vecRectCoords(pos, arc, frame, 0.0) + program := p.arcProgram + p.ctx.UseProgram(program.ref) + p.updateBuffer(program.buff, points) + p.UpdateVertexArray(program, "vert", 2, 4, 0) + p.UpdateVertexArray(program, "normal", 2, 4, 2) + + p.ctx.BlendFunc(srcAlpha, oneMinusSrcAlpha) + p.logError() + // Vertex: END + + // Fragment: BEG + frameWidthScaled, frameHeightScaled := p.scaleFrameSize(frame) + p.SetUniform2f(program, "frame_size", frameWidthScaled, frameHeightScaled) + + x1Scaled, x2Scaled, y1Scaled, y2Scaled := p.scaleRectCoords(bounds[0], bounds[2], bounds[1], bounds[3]) + p.SetUniform4f(program, "rect_coords", x1Scaled, x2Scaled, y1Scaled, y2Scaled) + + edgeSoftnessScaled := roundToPixel(edgeSoftness*p.pixScale, 1.0) + p.SetUniform1f(program, "edge_softness", edgeSoftnessScaled) + + outerRadius := fyne.Min(arc.Size().Width, arc.Size().Height) / 2 + outerRadiusScaled := roundToPixel(outerRadius*p.pixScale, 1.0) + p.SetUniform1f(program, "outer_radius", outerRadiusScaled) + + innerRadius := outerRadius * float32(math.Min(1.0, math.Max(0.0, float64(arc.CutoutRatio)))) + innerRadiusScaled := roundToPixel(innerRadius*p.pixScale, 1.0) + p.SetUniform1f(program, "inner_radius", innerRadiusScaled) + + startAngle, endAngle := paint.NormalizeArcAngles(arc.StartAngle, arc.EndAngle) + p.SetUniform1f(program, "start_angle", startAngle) + p.SetUniform1f(program, "end_angle", endAngle) + + cornerRadius := fyne.Min(paint.GetMaximumRadiusArc(outerRadius, innerRadius, arc.EndAngle-arc.StartAngle), arc.CornerRadius) + cornerRadiusScaled := roundToPixel(cornerRadius*p.pixScale, 1.0) + p.SetUniform1f(program, "corner_radius", cornerRadiusScaled) + + strokeWidthScaled := roundToPixel(arc.StrokeWidth*p.pixScale, 1.0) + p.SetUniform1f(program, "stroke_width", strokeWidthScaled) + + r, g, b, a := getFragmentColor(arc.FillColor) + p.SetUniform4f(program, "fill_color", r, g, b, a) + + strokeColor := arc.StrokeColor + if strokeColor == nil { + strokeColor = color.Transparent + } + r, g, b, a = getFragmentColor(strokeColor) + p.SetUniform4f(program, "stroke_color", r, g, b, a) + + p.logError() + // Fragment: END + + p.ctx.DrawArrays(triangleStrip, 0, 4) + p.logError() +} + +func (p *painter) drawText(text *canvas.Text, pos fyne.Position, frame fyne.Size) { + if text.Text == "" || text.Text == " " { + return + } + + size := text.MinSize() + containerSize := text.Size() + switch text.Alignment { + case fyne.TextAlignTrailing: + pos = fyne.NewPos(pos.X+containerSize.Width-size.Width, pos.Y) + case fyne.TextAlignCenter: + pos = fyne.NewPos(pos.X+(containerSize.Width-size.Width)/2, pos.Y) + } + + if containerSize.Height > size.Height { + pos = fyne.NewPos(pos.X, pos.Y+(containerSize.Height-size.Height)/2) + } + + // text size is sensitive to position on screen + size, _ = roundToPixelCoords(size, text.Position(), p.pixScale) + size.Width += roundToPixel(paint.VectorPad(text), p.pixScale) + p.drawTextureWithDetails(text, p.newGlTextTexture, pos, size, frame, canvas.ImageFillStretch, 1.0, 0) +} + +func (p *painter) drawTextureWithDetails(o fyne.CanvasObject, creator func(canvasObject fyne.CanvasObject) Texture, + pos fyne.Position, size, frame fyne.Size, fill canvas.ImageFill, alpha float32, pad float32, +) { + texture, err := p.getTexture(o, creator) + if err != nil { + return + } + + cornerRadius := float32(0) + aspect := float32(0) + if img, ok := o.(*canvas.Image); ok { + aspect = img.Aspect() + if aspect == 0 { + aspect = 1 // fallback, should not occur - normally an image load error + } + if img.CornerRadius > 0 { + cornerRadius = img.CornerRadius + } + } + points, insets := p.rectCoords(size, pos, frame, fill, aspect, pad) + inner, _ := rectInnerCoords(size, pos, fill, aspect) + + p.ctx.UseProgram(p.program.ref) + p.updateBuffer(p.program.buff, points) + p.UpdateVertexArray(p.program, "vert", 3, 5, 0) + p.UpdateVertexArray(p.program, "vertTexCoord", 2, 5, 3) + + // Set corner radius and texture size in pixels + cornerRadius = fyne.Min(paint.GetMaximumRadius(size), cornerRadius) + p.SetUniform1f(p.program, "cornerRadius", cornerRadius*p.pixScale) + p.SetUniform2f(p.program, "size", inner.Width*p.pixScale, inner.Height*p.pixScale) + p.SetUniform4f(p.program, "inset", insets[0], insets[1], insets[2], insets[3]) // texture coordinate insets (minX, minY, maxX, maxY) + + p.SetUniform1f(p.program, "alpha", alpha) + + p.ctx.BlendFunc(one, oneMinusSrcAlpha) + p.logError() + + p.ctx.ActiveTexture(texture0) + p.ctx.BindTexture(texture2D, texture) + p.logError() + + p.ctx.DrawArrays(triangleStrip, 0, 4) + p.logError() +} + +func (p *painter) lineCoords(pos, pos1, pos2 fyne.Position, lineWidth, feather float32, frame fyne.Size) ([]float32, float32, float32) { + // Shift line coordinates so that they match the target position. + xPosDiff := pos.X - fyne.Min(pos1.X, pos2.X) + yPosDiff := pos.Y - fyne.Min(pos1.Y, pos2.Y) + pos1.X = roundToPixel(pos1.X+xPosDiff, p.pixScale) + pos1.Y = roundToPixel(pos1.Y+yPosDiff, p.pixScale) + pos2.X = roundToPixel(pos2.X+xPosDiff, p.pixScale) + pos2.Y = roundToPixel(pos2.Y+yPosDiff, p.pixScale) + + if lineWidth <= 1 { + offset := float32(0.5) // adjust location for lines < 1pt on regular display + if lineWidth <= 0.5 && p.pixScale > 1 { // and for 1px drawing on HiDPI (width 0.5) + offset = 0.25 + } + if pos1.X == pos2.X { + pos1.X -= offset + pos2.X -= offset + } + if pos1.Y == pos2.Y { + pos1.Y -= offset + pos2.Y -= offset + } + } + + x1Pos := pos1.X / frame.Width + x1 := -1 + x1Pos*2 + y1Pos := pos1.Y / frame.Height + y1 := 1 - y1Pos*2 + x2Pos := pos2.X / frame.Width + x2 := -1 + x2Pos*2 + y2Pos := pos2.Y / frame.Height + y2 := 1 - y2Pos*2 + + normalX := (pos2.Y - pos1.Y) / frame.Width + normalY := (pos2.X - pos1.X) / frame.Height + dirLength := float32(math.Sqrt(float64(normalX*normalX + normalY*normalY))) + normalX /= dirLength + normalY /= dirLength + + normalObjX := normalX * 0.5 * frame.Width + normalObjY := normalY * 0.5 * frame.Height + widthMultiplier := float32(math.Sqrt(float64(normalObjX*normalObjX + normalObjY*normalObjY))) + halfWidth := (roundToPixel(lineWidth+feather, p.pixScale) * 0.5) / widthMultiplier + featherWidth := feather / widthMultiplier + + return []float32{ + // coord x, y normal x, y + x1, y1, normalX, normalY, + x2, y2, normalX, normalY, + x2, y2, -normalX, -normalY, + x2, y2, -normalX, -normalY, + x1, y1, normalX, normalY, + x1, y1, -normalX, -normalY, + }, halfWidth, featherWidth +} + +// rectCoords calculates the openGL coordinate space of a rectangle +func (p *painter) rectCoords(size fyne.Size, pos fyne.Position, frame fyne.Size, + fill canvas.ImageFill, aspect float32, pad float32, +) ([]float32, [4]float32) { + size, pos = rectInnerCoords(size, pos, fill, aspect) + size, pos = roundToPixelCoords(size, pos, p.pixScale) + + xPos := (pos.X - pad) / frame.Width + x1 := -1 + xPos*2 + x2Pos := (pos.X + size.Width + pad) / frame.Width + x2 := -1 + x2Pos*2 + + yPos := (pos.Y - pad) / frame.Height + y1 := 1 - yPos*2 + y2Pos := (pos.Y + size.Height + pad) / frame.Height + y2 := 1 - y2Pos*2 + + xInset := float32(0.0) + yInset := float32(0.0) + + if fill == canvas.ImageFillCover { + viewAspect := size.Width / size.Height + + if viewAspect > aspect { + newHeight := size.Width / aspect + heightPad := (newHeight - size.Height) / 2 + yInset = heightPad / newHeight + } else if viewAspect < aspect { + newWidth := size.Height * aspect + widthPad := (newWidth - size.Width) / 2 + xInset = widthPad / newWidth + } + } + + insets := [4]float32{xInset, yInset, 1.0 - xInset, 1.0 - yInset} + + return []float32{ + // coord x, y, z texture x, y + x1, y2, 0, insets[0], insets[3], // top left + x1, y1, 0, insets[0], insets[1], // bottom left + x2, y2, 0, insets[2], insets[3], // top right + x2, y1, 0, insets[2], insets[1], // bottom right + }, insets +} + +func rectInnerCoords(size fyne.Size, pos fyne.Position, fill canvas.ImageFill, aspect float32) (fyne.Size, fyne.Position) { + if fill == canvas.ImageFillContain || fill == canvas.ImageFillOriginal { + // change pos and size accordingly + + viewAspect := size.Width / size.Height + + newWidth, newHeight := size.Width, size.Height + widthPad, heightPad := float32(0), float32(0) + if viewAspect > aspect { + newWidth = size.Height * aspect + widthPad = (size.Width - newWidth) / 2 + } else if viewAspect < aspect { + newHeight = size.Width / aspect + heightPad = (size.Height - newHeight) / 2 + } + + return fyne.NewSize(newWidth, newHeight), fyne.NewPos(pos.X+widthPad, pos.Y+heightPad) + } + + return size, pos +} + +func (p *painter) vecRectCoords(pos fyne.Position, rect fyne.CanvasObject, frame fyne.Size, aspect float32) ([4]float32, []float32) { + xPad, yPad := float32(0), float32(0) + + if aspect != 0 { + inner := rect.Size() + frameAspect := inner.Width / inner.Height + + if frameAspect > aspect { + newWidth := inner.Height * aspect + xPad = (inner.Width - newWidth) / 2 + } else if frameAspect < aspect { + newHeight := inner.Width / aspect + yPad = (inner.Height - newHeight) / 2 + } + } + + return p.vecRectCoordsWithPad(pos, rect, frame, xPad, yPad) +} + +func (p *painter) vecRectCoordsWithPad(pos fyne.Position, rect fyne.CanvasObject, frame fyne.Size, xPad, yPad float32) ([4]float32, []float32) { + size := rect.Size() + pos1 := rect.Position() + + xPosDiff := pos.X - pos1.X + xPad + yPosDiff := pos.Y - pos1.Y + yPad + pos1.X = roundToPixel(pos1.X+xPosDiff, p.pixScale) + pos1.Y = roundToPixel(pos1.Y+yPosDiff, p.pixScale) + size.Width = roundToPixel(size.Width-2*xPad, p.pixScale) + size.Height = roundToPixel(size.Height-2*yPad, p.pixScale) + + // without edge softness adjustment the rectangle has cropped edges + edgeSoftnessScaled := roundToPixel(edgeSoftness*p.pixScale, 1.0) + x1Pos := pos1.X + x1Norm := -1 + (x1Pos-edgeSoftnessScaled)*2/frame.Width + x2Pos := pos1.X + size.Width + x2Norm := -1 + (x2Pos+edgeSoftnessScaled)*2/frame.Width + y1Pos := pos1.Y + y1Norm := 1 - (y1Pos-edgeSoftnessScaled)*2/frame.Height + y2Pos := pos1.Y + size.Height + y2Norm := 1 - (y2Pos+edgeSoftnessScaled)*2/frame.Height + + // output a norm for the fill and the vert is unused, but we pass 0 to avoid optimisation issues + coords := []float32{ + 0, 0, x1Norm, y1Norm, // first triangle + 0, 0, x2Norm, y1Norm, // second triangle + 0, 0, x1Norm, y2Norm, + 0, 0, x2Norm, y2Norm, + } + + return [4]float32{x1Pos, y1Pos, x2Pos, y2Pos}, coords +} + +func (p *painter) vecSquareCoords(pos fyne.Position, rect fyne.CanvasObject, frame fyne.Size) ([4]float32, []float32) { + return p.vecRectCoordsWithPad(pos, rect, frame, 0, 0) +} + +func roundToPixel(v float32, pixScale float32) float32 { + if pixScale == 1.0 { + return float32(math.Round(float64(v))) + } + + return float32(math.Round(float64(v*pixScale))) / pixScale +} + +func roundToPixelCoords(size fyne.Size, pos fyne.Position, pixScale float32) (fyne.Size, fyne.Position) { + end := pos.Add(size) + end.X = roundToPixel(end.X, pixScale) + end.Y = roundToPixel(end.Y, pixScale) + pos.X = roundToPixel(pos.X, pixScale) + pos.Y = roundToPixel(pos.Y, pixScale) + size.Width = end.X - pos.X + size.Height = end.Y - pos.Y + + return size, pos +} + +// Returns FragmentColor(red,green,blue,alpha) from fyne.Color +func getFragmentColor(col color.Color) (float32, float32, float32, float32) { + if col == nil { + return 0, 0, 0, 0 + } + r, g, b, a := col.RGBA() + if a == 0 { + return 0, 0, 0, 0 + } + alpha := float32(a) + return float32(r) / alpha, float32(g) / alpha, float32(b) / alpha, alpha / 0xffff +} + +func (p *painter) scaleFrameSize(frame fyne.Size) (float32, float32) { + frameWidthScaled := roundToPixel(frame.Width*p.pixScale, 1.0) + frameHeightScaled := roundToPixel(frame.Height*p.pixScale, 1.0) + return frameWidthScaled, frameHeightScaled +} + +// Returns scaled RectCoords(x1,x2,y1,y2) in same order +func (p *painter) scaleRectCoords(x1, x2, y1, y2 float32) (float32, float32, float32, float32) { + x1Scaled := roundToPixel(x1*p.pixScale, 1.0) + x2Scaled := roundToPixel(x2*p.pixScale, 1.0) + y1Scaled := roundToPixel(y1*p.pixScale, 1.0) + y2Scaled := roundToPixel(y2*p.pixScale, 1.0) + return x1Scaled, x2Scaled, y1Scaled, y2Scaled +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/draw_desktop.go b/vendor/fyne.io/fyne/v2/internal/painter/gl/draw_desktop.go new file mode 100644 index 0000000..e0f4022 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/draw_desktop.go @@ -0,0 +1,12 @@ +//go:build windows || darwin || linux || openbsd || freebsd + +package gl + +func (p *painter) updateBuffer(vbo Buffer, points []float32) { + p.ctx.BindBuffer(arrayBuffer, vbo) + p.logError() + // BufferSubData seems significantly less performant on desktop + // so use BufferData instead + p.ctx.BufferData(arrayBuffer, points, staticDraw) + p.logError() +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/draw_notdesktop.go b/vendor/fyne.io/fyne/v2/internal/painter/gl/draw_notdesktop.go new file mode 100644 index 0000000..3b7f511 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/draw_notdesktop.go @@ -0,0 +1,10 @@ +//go:build !(windows || darwin || linux || openbsd || freebsd) + +package gl + +func (p *painter) updateBuffer(vbo Buffer, points []float32) { + p.ctx.BindBuffer(arrayBuffer, vbo) + p.logError() + p.ctx.BufferSubData(arrayBuffer, points) + p.logError() +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/gl.go b/vendor/fyne.io/fyne/v2/internal/painter/gl/gl.go new file mode 100644 index 0000000..e8f422f --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/gl.go @@ -0,0 +1,35 @@ +package gl + +import ( + "log" + "runtime" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/build" +) + +const ( + floatSize = 4 + max16bit = float32(255 * 255) +) + +// logGLError logs error in the GL renderer. +// +// Receives a function as parameter, to lazily get the error code only when +// needed, avoiding unneeded overhead. +func logGLError(getError func() uint32) { + if build.Mode != fyne.BuildDebug { + return + } + + err := getError() + if err == 0 { + return + } + + log.Printf("Error %x in GL Renderer", err) + _, file, line, ok := runtime.Caller(2) + if ok { + log.Printf(" At: %s:%d", file, line) + } +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/gl_core.go b/vendor/fyne.io/fyne/v2/internal/painter/gl/gl_core.go new file mode 100644 index 0000000..44bce50 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/gl_core.go @@ -0,0 +1,360 @@ +//go:build (!gles && !arm && !arm64 && !android && !ios && !mobile && !test_web_driver && !wasm) || (darwin && !mobile && !ios && !wasm && !test_web_driver) + +package gl + +import ( + "strings" + + "github.com/go-gl/gl/v2.1/gl" + + "fyne.io/fyne/v2" +) + +const ( + arrayBuffer = gl.ARRAY_BUFFER + bitColorBuffer = gl.COLOR_BUFFER_BIT + bitDepthBuffer = gl.DEPTH_BUFFER_BIT + clampToEdge = gl.CLAMP_TO_EDGE + colorFormatRGBA = gl.RGBA + compileStatus = gl.COMPILE_STATUS + constantAlpha = gl.CONSTANT_ALPHA + float = gl.FLOAT + fragmentShader = gl.FRAGMENT_SHADER + front = gl.FRONT + glFalse = gl.FALSE + linkStatus = gl.LINK_STATUS + one = gl.ONE + oneMinusConstantAlpha = gl.ONE_MINUS_CONSTANT_ALPHA + oneMinusSrcAlpha = gl.ONE_MINUS_SRC_ALPHA + scissorTest = gl.SCISSOR_TEST + srcAlpha = gl.SRC_ALPHA + staticDraw = gl.STATIC_DRAW + texture0 = gl.TEXTURE0 + texture2D = gl.TEXTURE_2D + textureMinFilter = gl.TEXTURE_MIN_FILTER + textureMagFilter = gl.TEXTURE_MAG_FILTER + textureWrapS = gl.TEXTURE_WRAP_S + textureWrapT = gl.TEXTURE_WRAP_T + triangles = gl.TRIANGLES + triangleStrip = gl.TRIANGLE_STRIP + unsignedByte = gl.UNSIGNED_BYTE + vertexShader = gl.VERTEX_SHADER +) + +const ( + noBuffer = Buffer(0) + noShader = Shader(0) +) + +type ( + // Attribute represents a GL attribute + Attribute int32 + // Buffer represents a GL buffer + Buffer uint32 + // Program represents a compiled GL program + Program uint32 + // Shader represents a GL shader + Shader uint32 + // Uniform represents a GL uniform + Uniform int32 +) + +var textureFilterToGL = [...]int32{gl.LINEAR, gl.NEAREST, gl.LINEAR} + +func (p *painter) Init() { + p.ctx = &coreContext{} + err := gl.Init() + if err != nil { + fyne.LogError("failed to initialise OpenGL", err) + return + } + + gl.Disable(gl.DEPTH_TEST) + gl.Enable(gl.BLEND) + p.logError() + p.program = ProgramState{ + ref: p.createProgram("simple"), + buff: p.createBuffer(20), + uniforms: make(map[string]*UniformState), + attributes: make(map[string]Attribute), + } + p.getUniformLocations(p.program, "text", "alpha", "cornerRadius", "size", "inset") + p.enableAttribArrays(p.program, "vert", "vertTexCoord") + + p.lineProgram = ProgramState{ + ref: p.createProgram("line"), + buff: p.createBuffer(24), + uniforms: make(map[string]*UniformState), + attributes: make(map[string]Attribute), + } + p.getUniformLocations(p.lineProgram, "feather", "color", "lineWidth") + p.enableAttribArrays(p.lineProgram, "vert", "normal") + + p.rectangleProgram = ProgramState{ + ref: p.createProgram("rectangle"), + buff: p.createBuffer(16), + uniforms: make(map[string]*UniformState), + attributes: make(map[string]Attribute), + } + p.getUniformLocations( + p.rectangleProgram, + "frame_size", "rect_coords", "stroke_width", "fill_color", "stroke_color", + ) + p.enableAttribArrays(p.rectangleProgram, "vert", "normal") + + p.roundRectangleProgram = ProgramState{ + ref: p.createProgram("round_rectangle"), + buff: p.createBuffer(16), + uniforms: make(map[string]*UniformState), + attributes: make(map[string]Attribute), + } + p.getUniformLocations(p.roundRectangleProgram, + "frame_size", "rect_coords", + "stroke_width_half", "rect_size_half", + "radius", "edge_softness", + "fill_color", "stroke_color", + ) + p.enableAttribArrays(p.roundRectangleProgram, "vert", "normal") + + p.polygonProgram = ProgramState{ + ref: p.createProgram("polygon"), + buff: p.createBuffer(16), + uniforms: make(map[string]*UniformState), + attributes: make(map[string]Attribute), + } + p.getUniformLocations(p.polygonProgram, + "frame_size", "rect_coords", "edge_softness", + "outer_radius", "angle", "sides", + "fill_color", "corner_radius", + "stroke_width", "stroke_color", + ) + p.enableAttribArrays(p.polygonProgram, "vert", "normal") + + p.arcProgram = ProgramState{ + ref: p.createProgram("arc"), + buff: p.createBuffer(16), + uniforms: make(map[string]*UniformState), + attributes: make(map[string]Attribute), + } + p.getUniformLocations(p.arcProgram, + "frame_size", "rect_coords", + "inner_radius", "outer_radius", + "start_angle", "end_angle", + "edge_softness", "corner_radius", + "stroke_width", "stroke_color", + "fill_color", + ) + p.enableAttribArrays(p.arcProgram, "vert", "normal") +} + +func (p *painter) getUniformLocations(pState ProgramState, names ...string) { + for _, name := range names { + u := p.ctx.GetUniformLocation(pState.ref, name) + pState.uniforms[name] = &UniformState{ref: u} + } +} + +func (p *painter) enableAttribArrays(pState ProgramState, names ...string) { + for _, name := range names { + a := p.ctx.GetAttribLocation(pState.ref, name) + p.ctx.EnableVertexAttribArray(a) + pState.attributes[name] = a + } +} + +type coreContext struct{} + +var _ context = (*coreContext)(nil) + +func (c *coreContext) ActiveTexture(textureUnit uint32) { + gl.ActiveTexture(textureUnit) +} + +func (c *coreContext) AttachShader(program Program, shader Shader) { + gl.AttachShader(uint32(program), uint32(shader)) +} + +func (c *coreContext) BindBuffer(target uint32, buf Buffer) { + gl.BindBuffer(target, uint32(buf)) +} + +func (c *coreContext) BindTexture(target uint32, texture Texture) { + gl.BindTexture(target, uint32(texture)) +} + +func (c *coreContext) BlendColor(r, g, b, a float32) { + gl.BlendColor(r, g, b, a) +} + +func (c *coreContext) BlendFunc(srcFactor, destFactor uint32) { + gl.BlendFunc(srcFactor, destFactor) +} + +func (c *coreContext) BufferData(target uint32, points []float32, usage uint32) { + gl.BufferData(target, 4*len(points), gl.Ptr(points), usage) +} + +func (c *coreContext) BufferSubData(target uint32, points []float32) { + gl.BufferSubData(target, 0, 4*len(points), gl.Ptr(points)) +} + +func (c *coreContext) Clear(mask uint32) { + gl.Clear(mask) +} + +func (c *coreContext) ClearColor(r, g, b, a float32) { + gl.ClearColor(r, g, b, a) +} + +func (c *coreContext) CompileShader(shader Shader) { + gl.CompileShader(uint32(shader)) +} + +func (c *coreContext) CreateBuffer() Buffer { + var vbo uint32 + gl.GenBuffers(1, &vbo) + return Buffer(vbo) +} + +func (c *coreContext) CreateProgram() Program { + return Program(gl.CreateProgram()) +} + +func (c *coreContext) CreateShader(typ uint32) Shader { + return Shader(gl.CreateShader(typ)) +} + +func (c *coreContext) CreateTexture() (texture Texture) { + var tex uint32 + gl.GenTextures(1, &tex) + return Texture(tex) +} + +func (c *coreContext) DeleteBuffer(buffer Buffer) { + gl.DeleteBuffers(1, (*uint32)(&buffer)) +} + +func (c *coreContext) DeleteTexture(texture Texture) { + tex := uint32(texture) + gl.DeleteTextures(1, &tex) +} + +func (c *coreContext) Disable(capability uint32) { + gl.Disable(capability) +} + +func (c *coreContext) DrawArrays(mode uint32, first, count int) { + gl.DrawArrays(mode, int32(first), int32(count)) +} + +func (c *coreContext) Enable(capability uint32) { + gl.Enable(capability) +} + +func (c *coreContext) EnableVertexAttribArray(attribute Attribute) { + gl.EnableVertexAttribArray(uint32(attribute)) +} + +func (c *coreContext) GetAttribLocation(program Program, name string) Attribute { + return Attribute(gl.GetAttribLocation(uint32(program), gl.Str(name+"\x00"))) +} + +func (c *coreContext) GetError() uint32 { + return gl.GetError() +} + +func (c *coreContext) GetProgrami(program Program, param uint32) int { + var value int32 + gl.GetProgramiv(uint32(program), param, &value) + return int(value) +} + +func (c *coreContext) GetProgramInfoLog(program Program) string { + var logLength int32 + gl.GetProgramiv(uint32(program), gl.INFO_LOG_LENGTH, &logLength) + info := strings.Repeat("\x00", int(logLength+1)) + gl.GetProgramInfoLog(uint32(program), logLength, nil, gl.Str(info)) + return info +} + +func (c *coreContext) GetShaderi(shader Shader, param uint32) int { + var value int32 + gl.GetShaderiv(uint32(shader), param, &value) + return int(value) +} + +func (c *coreContext) GetShaderInfoLog(shader Shader) string { + var logLength int32 + gl.GetShaderiv(uint32(shader), gl.INFO_LOG_LENGTH, &logLength) + info := strings.Repeat("\x00", int(logLength+1)) + gl.GetShaderInfoLog(uint32(shader), logLength, nil, gl.Str(info)) + return info +} + +func (c *coreContext) GetUniformLocation(program Program, name string) Uniform { + return Uniform(gl.GetUniformLocation(uint32(program), gl.Str(name+"\x00"))) +} + +func (c *coreContext) LinkProgram(program Program) { + gl.LinkProgram(uint32(program)) +} + +func (c *coreContext) ReadBuffer(src uint32) { + gl.ReadBuffer(src) +} + +func (c *coreContext) ReadPixels(x, y, width, height int, colorFormat, typ uint32, pixels []uint8) { + gl.ReadPixels(int32(x), int32(y), int32(width), int32(height), colorFormat, typ, gl.Ptr(pixels)) +} + +func (c *coreContext) Scissor(x, y, w, h int32) { + gl.Scissor(x, y, w, h) +} + +func (c *coreContext) ShaderSource(shader Shader, source string) { + csources, free := gl.Strs(source + "\x00") + defer free() + gl.ShaderSource(uint32(shader), 1, csources, nil) +} + +func (c *coreContext) TexImage2D(target uint32, level, width, height int, colorFormat, typ uint32, data []uint8) { + gl.TexImage2D( + target, + int32(level), + int32(colorFormat), + int32(width), + int32(height), + 0, + colorFormat, + typ, + gl.Ptr(data), + ) +} + +func (c *coreContext) TexParameteri(target, param uint32, value int32) { + gl.TexParameteri(target, param, value) +} + +func (c *coreContext) Uniform1f(uniform Uniform, v float32) { + gl.Uniform1f(int32(uniform), v) +} + +func (c *coreContext) Uniform2f(uniform Uniform, v0, v1 float32) { + gl.Uniform2f(int32(uniform), v0, v1) +} + +func (c *coreContext) Uniform4f(uniform Uniform, v0, v1, v2, v3 float32) { + gl.Uniform4f(int32(uniform), v0, v1, v2, v3) +} + +func (c *coreContext) UseProgram(program Program) { + gl.UseProgram(uint32(program)) +} + +func (c *coreContext) VertexAttribPointerWithOffset(attribute Attribute, size int, typ uint32, normalized bool, stride, offset int) { + gl.VertexAttribPointerWithOffset(uint32(attribute), int32(size), typ, normalized, int32(stride), uintptr(offset)) +} + +func (c *coreContext) Viewport(x, y, width, height int) { + gl.Viewport(int32(x), int32(y), int32(width), int32(height)) +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/gl_es.go b/vendor/fyne.io/fyne/v2/internal/painter/gl/gl_es.go new file mode 100644 index 0000000..ca15b29 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/gl_es.go @@ -0,0 +1,360 @@ +//go:build (gles || arm || arm64) && !android && !ios && !mobile && !darwin && !wasm && !test_web_driver + +package gl + +import ( + "strings" + + gl "github.com/go-gl/gl/v3.1/gles2" + + "fyne.io/fyne/v2" +) + +const ( + arrayBuffer = gl.ARRAY_BUFFER + bitColorBuffer = gl.COLOR_BUFFER_BIT + bitDepthBuffer = gl.DEPTH_BUFFER_BIT + clampToEdge = gl.CLAMP_TO_EDGE + colorFormatRGBA = gl.RGBA + compileStatus = gl.COMPILE_STATUS + constantAlpha = gl.CONSTANT_ALPHA + float = gl.FLOAT + fragmentShader = gl.FRAGMENT_SHADER + front = gl.FRONT + glFalse = gl.FALSE + linkStatus = gl.LINK_STATUS + one = gl.ONE + oneMinusConstantAlpha = gl.ONE_MINUS_CONSTANT_ALPHA + oneMinusSrcAlpha = gl.ONE_MINUS_SRC_ALPHA + scissorTest = gl.SCISSOR_TEST + srcAlpha = gl.SRC_ALPHA + staticDraw = gl.STATIC_DRAW + texture0 = gl.TEXTURE0 + texture2D = gl.TEXTURE_2D + textureMinFilter = gl.TEXTURE_MIN_FILTER + textureMagFilter = gl.TEXTURE_MAG_FILTER + textureWrapS = gl.TEXTURE_WRAP_S + textureWrapT = gl.TEXTURE_WRAP_T + triangles = gl.TRIANGLES + triangleStrip = gl.TRIANGLE_STRIP + unsignedByte = gl.UNSIGNED_BYTE + vertexShader = gl.VERTEX_SHADER +) + +const ( + noBuffer = Buffer(0) + noShader = Shader(0) +) + +type ( + // Attribute represents a GL attribute + Attribute int32 + // Buffer represents a GL buffer + Buffer uint32 + // Program represents a compiled GL program + Program uint32 + // Shader represents a GL shader + Shader uint32 + // Uniform represents a GL uniform + Uniform int32 +) + +var textureFilterToGL = [...]int32{gl.LINEAR, gl.NEAREST, gl.LINEAR} + +func (p *painter) Init() { + p.ctx = &esContext{} + err := gl.Init() + if err != nil { + fyne.LogError("failed to initialise OpenGL", err) + return + } + + gl.Disable(gl.DEPTH_TEST) + gl.Enable(gl.BLEND) + p.logError() + p.program = ProgramState{ + ref: p.createProgram("simple_es"), + buff: p.createBuffer(20), + uniforms: make(map[string]*UniformState), + attributes: make(map[string]Attribute), + } + p.getUniformLocations(p.program, "text", "alpha", "cornerRadius", "size", "inset") + p.enableAttribArrays(p.program, "vert", "vertTexCoord") + + p.lineProgram = ProgramState{ + ref: p.createProgram("line_es"), + buff: p.createBuffer(24), + uniforms: make(map[string]*UniformState), + attributes: make(map[string]Attribute), + } + p.getUniformLocations(p.lineProgram, "color", "feather", "lineWidth") + p.enableAttribArrays(p.lineProgram, "vert", "normal") + + p.rectangleProgram = ProgramState{ + ref: p.createProgram("rectangle_es"), + buff: p.createBuffer(16), + uniforms: make(map[string]*UniformState), + attributes: make(map[string]Attribute), + } + p.getUniformLocations( + p.rectangleProgram, + "frame_size", "rect_coords", "stroke_width", "fill_color", "stroke_color", + ) + p.enableAttribArrays(p.rectangleProgram, "vert", "normal") + + p.roundRectangleProgram = ProgramState{ + ref: p.createProgram("round_rectangle_es"), + buff: p.createBuffer(16), + uniforms: make(map[string]*UniformState), + attributes: make(map[string]Attribute), + } + p.getUniformLocations(p.roundRectangleProgram, + "frame_size", "rect_coords", + "stroke_width_half", "rect_size_half", + "radius", "edge_softness", + "fill_color", "stroke_color", + ) + p.enableAttribArrays(p.roundRectangleProgram, "vert", "normal") + + p.polygonProgram = ProgramState{ + ref: p.createProgram("polygon_es"), + buff: p.createBuffer(16), + uniforms: make(map[string]*UniformState), + attributes: make(map[string]Attribute), + } + p.getUniformLocations(p.polygonProgram, + "frame_size", "rect_coords", "edge_softness", + "outer_radius", "angle", "sides", + "fill_color", "corner_radius", + "stroke_width", "stroke_color", + ) + p.enableAttribArrays(p.polygonProgram, "vert", "normal") + + p.arcProgram = ProgramState{ + ref: p.createProgram("arc_es"), + buff: p.createBuffer(16), + uniforms: make(map[string]*UniformState), + attributes: make(map[string]Attribute), + } + p.getUniformLocations(p.arcProgram, + "frame_size", "rect_coords", + "inner_radius", "outer_radius", + "start_angle", "end_angle", + "edge_softness", "corner_radius", + "stroke_width", "stroke_color", + "fill_color", + ) + p.enableAttribArrays(p.arcProgram, "vert", "normal") +} + +func (p *painter) getUniformLocations(pState ProgramState, names ...string) { + for _, name := range names { + u := p.ctx.GetUniformLocation(pState.ref, name) + pState.uniforms[name] = &UniformState{ref: u} + } +} + +func (p *painter) enableAttribArrays(pState ProgramState, names ...string) { + for _, name := range names { + a := p.ctx.GetAttribLocation(pState.ref, name) + p.ctx.EnableVertexAttribArray(a) + pState.attributes[name] = a + } +} + +type esContext struct{} + +var _ context = (*esContext)(nil) + +func (c *esContext) ActiveTexture(textureUnit uint32) { + gl.ActiveTexture(textureUnit) +} + +func (c *esContext) AttachShader(program Program, shader Shader) { + gl.AttachShader(uint32(program), uint32(shader)) +} + +func (c *esContext) BindBuffer(target uint32, buf Buffer) { + gl.BindBuffer(target, uint32(buf)) +} + +func (c *esContext) BindTexture(target uint32, texture Texture) { + gl.BindTexture(target, uint32(texture)) +} + +func (c *esContext) BlendColor(r, g, b, a float32) { + gl.BlendColor(r, g, b, a) +} + +func (c *esContext) BlendFunc(srcFactor, destFactor uint32) { + gl.BlendFunc(srcFactor, destFactor) +} + +func (c *esContext) BufferData(target uint32, points []float32, usage uint32) { + gl.BufferData(target, 4*len(points), gl.Ptr(points), usage) +} + +func (c *esContext) BufferSubData(target uint32, points []float32) { + gl.BufferSubData(target, 0, 4*len(points), gl.Ptr(points)) +} + +func (c *esContext) Clear(mask uint32) { + gl.Clear(mask) +} + +func (c *esContext) ClearColor(r, g, b, a float32) { + gl.ClearColor(r, g, b, a) +} + +func (c *esContext) CompileShader(shader Shader) { + gl.CompileShader(uint32(shader)) +} + +func (c *esContext) CreateBuffer() Buffer { + var vbo uint32 + gl.GenBuffers(1, &vbo) + return Buffer(vbo) +} + +func (c *esContext) CreateProgram() Program { + return Program(gl.CreateProgram()) +} + +func (c *esContext) CreateShader(typ uint32) Shader { + return Shader(gl.CreateShader(typ)) +} + +func (c *esContext) CreateTexture() (texture Texture) { + var tex uint32 + gl.GenTextures(1, &tex) + return Texture(tex) +} + +func (c *esContext) DeleteBuffer(buffer Buffer) { + gl.DeleteBuffers(1, (*uint32)(&buffer)) +} + +func (c *esContext) DeleteTexture(texture Texture) { + tex := uint32(texture) + gl.DeleteTextures(1, &tex) +} + +func (c *esContext) Disable(capability uint32) { + gl.Disable(capability) +} + +func (c *esContext) DrawArrays(mode uint32, first, count int) { + gl.DrawArrays(mode, int32(first), int32(count)) +} + +func (c *esContext) Enable(capability uint32) { + gl.Enable(capability) +} + +func (c *esContext) EnableVertexAttribArray(attribute Attribute) { + gl.EnableVertexAttribArray(uint32(attribute)) +} + +func (c *esContext) GetAttribLocation(program Program, name string) Attribute { + return Attribute(gl.GetAttribLocation(uint32(program), gl.Str(name+"\x00"))) +} + +func (c *esContext) GetError() uint32 { + return gl.GetError() +} + +func (c *esContext) GetProgrami(program Program, param uint32) int { + var value int32 + gl.GetProgramiv(uint32(program), param, &value) + return int(value) +} + +func (c *esContext) GetProgramInfoLog(program Program) string { + var logLength int32 + gl.GetProgramiv(uint32(program), gl.INFO_LOG_LENGTH, &logLength) + info := strings.Repeat("\x00", int(logLength+1)) + gl.GetProgramInfoLog(uint32(program), logLength, nil, gl.Str(info)) + return info +} + +func (c *esContext) GetShaderi(shader Shader, param uint32) int { + var value int32 + gl.GetShaderiv(uint32(shader), param, &value) + return int(value) +} + +func (c *esContext) GetShaderInfoLog(shader Shader) string { + var logLength int32 + gl.GetShaderiv(uint32(shader), gl.INFO_LOG_LENGTH, &logLength) + info := strings.Repeat("\x00", int(logLength+1)) + gl.GetShaderInfoLog(uint32(shader), logLength, nil, gl.Str(info)) + return info +} + +func (c *esContext) GetUniformLocation(program Program, name string) Uniform { + return Uniform(gl.GetUniformLocation(uint32(program), gl.Str(name+"\x00"))) +} + +func (c *esContext) LinkProgram(program Program) { + gl.LinkProgram(uint32(program)) +} + +func (c *esContext) ReadBuffer(src uint32) { + gl.ReadBuffer(src) +} + +func (c *esContext) ReadPixels(x, y, width, height int, colorFormat, typ uint32, pixels []uint8) { + gl.ReadPixels(int32(x), int32(y), int32(width), int32(height), colorFormat, typ, gl.Ptr(pixels)) +} + +func (c *esContext) Scissor(x, y, w, h int32) { + gl.Scissor(x, y, w, h) +} + +func (c *esContext) ShaderSource(shader Shader, source string) { + csources, free := gl.Strs(source + "\x00") + defer free() + gl.ShaderSource(uint32(shader), 1, csources, nil) +} + +func (c *esContext) TexImage2D(target uint32, level, width, height int, colorFormat, typ uint32, data []uint8) { + gl.TexImage2D( + target, + int32(level), + int32(colorFormat), + int32(width), + int32(height), + 0, + colorFormat, + typ, + gl.Ptr(data), + ) +} + +func (c *esContext) TexParameteri(target, param uint32, value int32) { + gl.TexParameteri(target, param, value) +} + +func (c *esContext) Uniform1f(uniform Uniform, v float32) { + gl.Uniform1f(int32(uniform), v) +} + +func (c *esContext) Uniform2f(uniform Uniform, v0, v1 float32) { + gl.Uniform2f(int32(uniform), v0, v1) +} + +func (c *esContext) Uniform4f(uniform Uniform, v0, v1, v2, v3 float32) { + gl.Uniform4f(int32(uniform), v0, v1, v2, v3) +} + +func (c *esContext) UseProgram(program Program) { + gl.UseProgram(uint32(program)) +} + +func (c *esContext) VertexAttribPointerWithOffset(attribute Attribute, size int, typ uint32, normalized bool, stride, offset int) { + gl.VertexAttribPointerWithOffset(uint32(attribute), int32(size), typ, normalized, int32(stride), uintptr(offset)) +} + +func (c *esContext) Viewport(x, y, width, height int) { + gl.Viewport(int32(x), int32(y), int32(width), int32(height)) +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/gl_gomobile.go b/vendor/fyne.io/fyne/v2/internal/painter/gl/gl_gomobile.go new file mode 100644 index 0000000..e4ecb3d --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/gl_gomobile.go @@ -0,0 +1,368 @@ +//go:build (android || ios || mobile) && (!wasm || !test_web_driver) + +package gl + +import ( + "math" + + "fyne.io/fyne/v2/internal/driver/mobile/gl" +) + +const ( + arrayBuffer = gl.ArrayBuffer + bitColorBuffer = gl.ColorBufferBit + bitDepthBuffer = gl.DepthBufferBit + clampToEdge = gl.ClampToEdge + colorFormatRGBA = gl.RGBA + compileStatus = gl.CompileStatus + constantAlpha = gl.ConstantAlpha + float = gl.Float + fragmentShader = gl.FragmentShader + front = gl.Front + glFalse = gl.False + linkStatus = gl.LinkStatus + one = gl.One + oneMinusConstantAlpha = gl.OneMinusConstantAlpha + oneMinusSrcAlpha = gl.OneMinusSrcAlpha + scissorTest = gl.ScissorTest + srcAlpha = gl.SrcAlpha + staticDraw = gl.StaticDraw + texture0 = gl.Texture0 + texture2D = gl.Texture2D + textureMinFilter = gl.TextureMinFilter + textureMagFilter = gl.TextureMagFilter + textureWrapS = gl.TextureWrapS + textureWrapT = gl.TextureWrapT + triangles = gl.Triangles + triangleStrip = gl.TriangleStrip + unsignedByte = gl.UnsignedByte + vertexShader = gl.VertexShader +) + +type ( + // Attribute represents a GL attribute + Attribute gl.Attrib + // Buffer represents a GL buffer + Buffer gl.Buffer + // Program represents a compiled GL program + Program gl.Program + // Shader represents a GL shader + Shader gl.Shader + // Uniform represents a GL uniform + Uniform gl.Uniform +) + +var ( + compiled []ProgramState // avoid multiple compilations with the re-used mobile GUI context + noBuffer = Buffer{} + noShader = Shader{} + textureFilterToGL = [...]int32{gl.Linear, gl.Nearest} +) + +func (p *painter) glctx() gl.Context { + return p.contextProvider.Context().(gl.Context) +} + +func (p *painter) Init() { + p.ctx = &mobileContext{glContext: p.contextProvider.Context().(gl.Context)} + p.glctx().Disable(gl.DepthTest) + p.glctx().Enable(gl.Blend) + if compiled == nil { + p.program = ProgramState{ + ref: p.createProgram("simple_es"), + buff: p.createBuffer(20), + uniforms: make(map[string]*UniformState), + attributes: make(map[string]Attribute), + } + p.getUniformLocations(p.program, "text", "alpha", "cornerRadius", "size", "inset") + p.enableAttribArrays(p.program, "vert", "vertTexCoord") + + p.lineProgram = ProgramState{ + ref: p.createProgram("line_es"), + buff: p.createBuffer(24), + uniforms: make(map[string]*UniformState), + attributes: make(map[string]Attribute), + } + p.getUniformLocations(p.lineProgram, "color", "feather", "lineWidth") + p.enableAttribArrays(p.lineProgram, "vert", "normal") + + p.rectangleProgram = ProgramState{ + ref: p.createProgram("rectangle_es"), + buff: p.createBuffer(16), + uniforms: make(map[string]*UniformState), + attributes: make(map[string]Attribute), + } + p.getUniformLocations( + p.rectangleProgram, + "frame_size", "rect_coords", "stroke_width", "fill_color", "stroke_color", + ) + p.enableAttribArrays(p.rectangleProgram, "vert", "normal") + + p.roundRectangleProgram = ProgramState{ + ref: p.createProgram("round_rectangle_es"), + buff: p.createBuffer(16), + uniforms: make(map[string]*UniformState), + attributes: make(map[string]Attribute), + } + p.getUniformLocations(p.roundRectangleProgram, + "frame_size", "rect_coords", + "stroke_width_half", "rect_size_half", + "radius", "edge_softness", + "fill_color", "stroke_color", + ) + p.enableAttribArrays(p.roundRectangleProgram, "vert", "normal") + + p.polygonProgram = ProgramState{ + ref: p.createProgram("polygon_es"), + buff: p.createBuffer(16), + uniforms: make(map[string]*UniformState), + attributes: make(map[string]Attribute), + } + p.getUniformLocations(p.polygonProgram, + "frame_size", "rect_coords", "edge_softness", + "outer_radius", "angle", "sides", + "fill_color", "corner_radius", + "stroke_width", "stroke_color", + ) + p.enableAttribArrays(p.polygonProgram, "vert", "normal") + + p.arcProgram = ProgramState{ + ref: p.createProgram("arc_es"), + buff: p.createBuffer(16), + uniforms: make(map[string]*UniformState), + attributes: make(map[string]Attribute), + } + p.getUniformLocations(p.arcProgram, + "frame_size", "rect_coords", + "inner_radius", "outer_radius", + "start_angle", "end_angle", + "edge_softness", "corner_radius", + "stroke_width", "stroke_color", + "fill_color", + ) + p.enableAttribArrays(p.arcProgram, "vert", "normal") + compiled = []ProgramState{ + p.program, + p.lineProgram, + p.rectangleProgram, + p.roundRectangleProgram, + p.polygonProgram, + p.arcProgram, + } + } + + p.program = compiled[0] + p.lineProgram = compiled[1] + p.rectangleProgram = compiled[2] + p.roundRectangleProgram = compiled[3] + p.polygonProgram = compiled[4] + p.arcProgram = compiled[5] +} + +func (p *painter) getUniformLocations(pState ProgramState, names ...string) { + for _, name := range names { + u := p.ctx.GetUniformLocation(pState.ref, name) + pState.uniforms[name] = &UniformState{ref: u} + } +} + +func (p *painter) enableAttribArrays(pState ProgramState, names ...string) { + for _, name := range names { + a := p.ctx.GetAttribLocation(pState.ref, name) + p.ctx.EnableVertexAttribArray(a) + pState.attributes[name] = a + } +} + +type mobileContext struct { + glContext gl.Context +} + +var _ context = (*mobileContext)(nil) + +func (c *mobileContext) ActiveTexture(textureUnit uint32) { + c.glContext.ActiveTexture(gl.Enum(textureUnit)) +} + +func (c *mobileContext) AttachShader(program Program, shader Shader) { + c.glContext.AttachShader(gl.Program(program), gl.Shader(shader)) +} + +func (c *mobileContext) BindBuffer(target uint32, buf Buffer) { + c.glContext.BindBuffer(gl.Enum(target), gl.Buffer(buf)) +} + +func (c *mobileContext) BindTexture(target uint32, texture Texture) { + c.glContext.BindTexture(gl.Enum(target), gl.Texture(texture)) +} + +func (c *mobileContext) BlendColor(r, g, b, a float32) { + c.glContext.BlendColor(r, g, b, a) +} + +func (c *mobileContext) BlendFunc(srcFactor, destFactor uint32) { + c.glContext.BlendFunc(gl.Enum(srcFactor), gl.Enum(destFactor)) +} + +func (c *mobileContext) BufferData(target uint32, points []float32, usage uint32) { + data := toLEByteOrder(points...) + c.glContext.BufferData(gl.Enum(target), data, gl.Enum(usage)) +} + +func (c *mobileContext) BufferSubData(target uint32, points []float32) { + data := toLEByteOrder(points...) + c.glContext.BufferSubData(gl.Enum(target), data) +} + +func (c *mobileContext) Clear(mask uint32) { + c.glContext.Clear(gl.Enum(mask)) +} + +func (c *mobileContext) ClearColor(r, g, b, a float32) { + c.glContext.ClearColor(r, g, b, a) +} + +func (c *mobileContext) CompileShader(shader Shader) { + c.glContext.CompileShader(gl.Shader(shader)) +} + +func (c *mobileContext) CreateBuffer() Buffer { + return Buffer(c.glContext.CreateBuffer()) +} + +func (c *mobileContext) CreateProgram() Program { + return Program(c.glContext.CreateProgram()) +} + +func (c *mobileContext) CreateShader(typ uint32) Shader { + return Shader(c.glContext.CreateShader(gl.Enum(typ))) +} + +func (c *mobileContext) CreateTexture() (texture Texture) { + return Texture(c.glContext.CreateTexture()) +} + +func (c *mobileContext) DeleteBuffer(buffer Buffer) { + c.glContext.DeleteBuffer(gl.Buffer(buffer)) +} + +func (c *mobileContext) DeleteTexture(texture Texture) { + c.glContext.DeleteTexture(gl.Texture(texture)) +} + +func (c *mobileContext) Disable(capability uint32) { + c.glContext.Disable(gl.Enum(capability)) +} + +func (c *mobileContext) DrawArrays(mode uint32, first, count int) { + c.glContext.DrawArrays(gl.Enum(mode), first, count) +} + +func (c *mobileContext) Enable(capability uint32) { + c.glContext.Enable(gl.Enum(capability)) +} + +func (c *mobileContext) EnableVertexAttribArray(attribute Attribute) { + c.glContext.EnableVertexAttribArray(gl.Attrib(attribute)) +} + +func (c *mobileContext) GetAttribLocation(program Program, name string) Attribute { + return Attribute(c.glContext.GetAttribLocation(gl.Program(program), name)) +} + +func (c *mobileContext) GetError() uint32 { + return uint32(c.glContext.GetError()) +} + +func (c *mobileContext) GetProgrami(program Program, param uint32) int { + return c.glContext.GetProgrami(gl.Program(program), gl.Enum(param)) +} + +func (c *mobileContext) GetProgramInfoLog(program Program) string { + return c.glContext.GetProgramInfoLog(gl.Program(program)) +} + +func (c *mobileContext) GetShaderi(shader Shader, param uint32) int { + return c.glContext.GetShaderi(gl.Shader(shader), gl.Enum(param)) +} + +func (c *mobileContext) GetShaderInfoLog(shader Shader) string { + return c.glContext.GetShaderInfoLog(gl.Shader(shader)) +} + +func (c *mobileContext) GetUniformLocation(program Program, name string) Uniform { + return Uniform(c.glContext.GetUniformLocation(gl.Program(program), name)) +} + +func (c *mobileContext) LinkProgram(program Program) { + c.glContext.LinkProgram(gl.Program(program)) +} + +func (c *mobileContext) ReadBuffer(_ uint32) { +} + +func (c *mobileContext) ReadPixels(x, y, width, height int, colorFormat, typ uint32, pixels []uint8) { + c.glContext.ReadPixels(pixels, x, y, width, height, gl.Enum(colorFormat), gl.Enum(typ)) +} + +func (c *mobileContext) Scissor(x, y, w, h int32) { + c.glContext.Scissor(x, y, w, h) +} + +func (c *mobileContext) ShaderSource(shader Shader, source string) { + c.glContext.ShaderSource(gl.Shader(shader), source) +} + +func (c *mobileContext) TexImage2D(target uint32, level, width, height int, colorFormat, typ uint32, data []uint8) { + c.glContext.TexImage2D( + gl.Enum(target), + level, + int(colorFormat), + width, + height, + gl.Enum(colorFormat), + gl.Enum(typ), + data, + ) +} + +func (c *mobileContext) TexParameteri(target, param uint32, value int32) { + c.glContext.TexParameteri(gl.Enum(target), gl.Enum(param), int(value)) +} + +func (c *mobileContext) Uniform1f(uniform Uniform, v float32) { + c.glContext.Uniform1f(gl.Uniform(uniform), v) +} + +func (c *mobileContext) Uniform2f(uniform Uniform, v0, v1 float32) { + c.glContext.Uniform2f(gl.Uniform(uniform), v0, v1) +} + +func (c *mobileContext) Uniform4f(uniform Uniform, v0, v1, v2, v3 float32) { + c.glContext.Uniform4f(gl.Uniform(uniform), v0, v1, v2, v3) +} + +func (c *mobileContext) UseProgram(program Program) { + c.glContext.UseProgram(gl.Program(program)) +} + +func (c *mobileContext) VertexAttribPointerWithOffset(attribute Attribute, size int, typ uint32, normalized bool, stride, offset int) { + c.glContext.VertexAttribPointer(gl.Attrib(attribute), size, gl.Enum(typ), normalized, stride, offset) +} + +func (c *mobileContext) Viewport(x, y, width, height int) { + c.glContext.Viewport(x, y, width, height) +} + +// toLEByteOrder returns the byte representation of float32 values in little endian byte order. +func toLEByteOrder(values ...float32) []byte { + b := make([]byte, 4*len(values)) + for i, v := range values { + u := math.Float32bits(v) + b[4*i+0] = byte(u >> 0) + b[4*i+1] = byte(u >> 8) + b[4*i+2] = byte(u >> 16) + b[4*i+3] = byte(u >> 24) + } + return b +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/gl_wasm.go b/vendor/fyne.io/fyne/v2/internal/painter/gl/gl_wasm.go new file mode 100644 index 0000000..0ab63bc --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/gl_wasm.go @@ -0,0 +1,343 @@ +//go:build wasm || test_web_driver + +package gl + +import ( + "math" + + "github.com/fyne-io/gl-js" +) + +const ( + arrayBuffer = gl.ARRAY_BUFFER + bitColorBuffer = gl.COLOR_BUFFER_BIT + bitDepthBuffer = gl.DEPTH_BUFFER_BIT + clampToEdge = gl.CLAMP_TO_EDGE + colorFormatRGBA = gl.RGBA + compileStatus = gl.COMPILE_STATUS + constantAlpha = gl.CONSTANT_ALPHA + float = gl.FLOAT + fragmentShader = gl.FRAGMENT_SHADER + front = gl.FRONT + glFalse = gl.FALSE + linkStatus = gl.LINK_STATUS + one = gl.ONE + oneMinusConstantAlpha = gl.ONE_MINUS_CONSTANT_ALPHA + oneMinusSrcAlpha = gl.ONE_MINUS_SRC_ALPHA + scissorTest = gl.SCISSOR_TEST + srcAlpha = gl.SRC_ALPHA + staticDraw = gl.STATIC_DRAW + texture0 = gl.TEXTURE0 + texture2D = gl.TEXTURE_2D + textureMinFilter = gl.TEXTURE_MIN_FILTER + textureMagFilter = gl.TEXTURE_MAG_FILTER + textureWrapS = gl.TEXTURE_WRAP_S + textureWrapT = gl.TEXTURE_WRAP_T + triangles = gl.TRIANGLES + triangleStrip = gl.TRIANGLE_STRIP + unsignedByte = gl.UNSIGNED_BYTE + vertexShader = gl.VERTEX_SHADER +) + +type ( + // Attribute represents a GL attribute + Attribute gl.Attrib + // Buffer represents a GL buffer + Buffer gl.Buffer + // Program represents a compiled GL program + Program gl.Program + // Shader represents a GL shader + Shader gl.Shader + // Uniform represents a GL uniform + Uniform gl.Uniform +) + +var ( + noBuffer = Buffer(gl.NoBuffer) + noShader = Shader(gl.NoShader) + textureFilterToGL = [...]int32{gl.LINEAR, gl.NEAREST} +) + +func (p *painter) Init() { + p.ctx = &xjsContext{} + gl.Disable(gl.DEPTH_TEST) + gl.Enable(gl.BLEND) + p.logError() + p.program = ProgramState{ + ref: p.createProgram("simple_es"), + buff: p.createBuffer(20), + uniforms: make(map[string]*UniformState), + attributes: make(map[string]Attribute), + } + p.getUniformLocations(p.program, "text", "alpha", "cornerRadius", "size", "inset") + p.enableAttribArrays(p.program, "vert", "vertTexCoord") + + p.lineProgram = ProgramState{ + ref: p.createProgram("line_es"), + buff: p.createBuffer(24), + uniforms: make(map[string]*UniformState), + attributes: make(map[string]Attribute), + } + p.getUniformLocations(p.lineProgram, "color", "feather", "lineWidth") + p.enableAttribArrays(p.lineProgram, "vert", "normal") + + p.rectangleProgram = ProgramState{ + ref: p.createProgram("rectangle_es"), + buff: p.createBuffer(16), + uniforms: make(map[string]*UniformState), + attributes: make(map[string]Attribute), + } + p.getUniformLocations( + p.rectangleProgram, + "frame_size", "rect_coords", "stroke_width", "fill_color", "stroke_color", + ) + p.enableAttribArrays(p.rectangleProgram, "vert", "normal") + + p.roundRectangleProgram = ProgramState{ + ref: p.createProgram("round_rectangle_es"), + buff: p.createBuffer(16), + uniforms: make(map[string]*UniformState), + attributes: make(map[string]Attribute), + } + p.getUniformLocations(p.roundRectangleProgram, + "frame_size", "rect_coords", + "stroke_width_half", "rect_size_half", + "radius", "edge_softness", + "fill_color", "stroke_color", + ) + p.enableAttribArrays(p.roundRectangleProgram, "vert", "normal") + + p.polygonProgram = ProgramState{ + ref: p.createProgram("polygon_es"), + buff: p.createBuffer(16), + uniforms: make(map[string]*UniformState), + attributes: make(map[string]Attribute), + } + p.getUniformLocations(p.polygonProgram, + "frame_size", "rect_coords", "edge_softness", + "outer_radius", "angle", "sides", + "fill_color", "corner_radius", + "stroke_width", "stroke_color", + ) + p.enableAttribArrays(p.polygonProgram, "vert", "normal") + + p.arcProgram = ProgramState{ + ref: p.createProgram("arc_es"), + buff: p.createBuffer(16), + uniforms: make(map[string]*UniformState), + attributes: make(map[string]Attribute), + } + p.getUniformLocations(p.arcProgram, + "frame_size", "rect_coords", + "inner_radius", "outer_radius", + "start_angle", "end_angle", + "edge_softness", "corner_radius", + "stroke_width", "stroke_color", + "fill_color", + ) + p.enableAttribArrays(p.arcProgram, "vert", "normal") +} + +func (p *painter) getUniformLocations(pState ProgramState, names ...string) { + for _, name := range names { + u := p.ctx.GetUniformLocation(pState.ref, name) + pState.uniforms[name] = &UniformState{ref: u} + } +} + +func (p *painter) enableAttribArrays(pState ProgramState, names ...string) { + for _, name := range names { + a := p.ctx.GetAttribLocation(pState.ref, name) + p.ctx.EnableVertexAttribArray(a) + pState.attributes[name] = a + } +} + +type xjsContext struct{} + +var _ context = (*xjsContext)(nil) + +func (c *xjsContext) ActiveTexture(textureUnit uint32) { + gl.ActiveTexture(gl.Enum(textureUnit)) +} + +func (c *xjsContext) AttachShader(program Program, shader Shader) { + gl.AttachShader(gl.Program(program), gl.Shader(shader)) +} + +func (c *xjsContext) BindBuffer(target uint32, buf Buffer) { + gl.BindBuffer(gl.Enum(target), gl.Buffer(buf)) +} + +func (c *xjsContext) BindTexture(target uint32, texture Texture) { + gl.BindTexture(gl.Enum(target), gl.Texture(texture)) +} + +func (c *xjsContext) BlendColor(r, g, b, a float32) { + gl.BlendColor(r, g, b, a) +} + +func (c *xjsContext) BlendFunc(srcFactor, destFactor uint32) { + gl.BlendFunc(gl.Enum(srcFactor), gl.Enum(destFactor)) +} + +func (c *xjsContext) BufferData(target uint32, points []float32, usage uint32) { + gl.BufferData(gl.Enum(target), toLEByteOrder(points...), gl.Enum(usage)) +} + +func (c *xjsContext) BufferSubData(target uint32, points []float32) { + data := toLEByteOrder(points...) + gl.BufferSubData(gl.Enum(target), 0, data) +} + +func (c *xjsContext) Clear(mask uint32) { + gl.Clear(gl.Enum(mask)) +} + +func (c *xjsContext) ClearColor(r, g, b, a float32) { + gl.ClearColor(r, g, b, a) +} + +func (c *xjsContext) CompileShader(shader Shader) { + gl.CompileShader(gl.Shader(shader)) +} + +func (c *xjsContext) CreateBuffer() Buffer { + return Buffer(gl.CreateBuffer()) +} + +func (c *xjsContext) CreateProgram() Program { + return Program(gl.CreateProgram()) +} + +func (c *xjsContext) CreateShader(typ uint32) Shader { + return Shader(gl.CreateShader(gl.Enum(typ))) +} + +func (c *xjsContext) CreateTexture() (texture Texture) { + return Texture(gl.CreateTexture()) +} + +func (c *xjsContext) DeleteBuffer(buffer Buffer) { + gl.DeleteBuffer(gl.Buffer(buffer)) +} + +func (c *xjsContext) DeleteTexture(texture Texture) { + gl.DeleteTexture(gl.Texture(texture)) +} + +func (c *xjsContext) Disable(capability uint32) { + gl.Disable(gl.Enum(capability)) +} + +func (c *xjsContext) DrawArrays(mode uint32, first, count int) { + gl.DrawArrays(gl.Enum(mode), first, count) +} + +func (c *xjsContext) Enable(capability uint32) { + gl.Enable(gl.Enum(capability)) +} + +func (c *xjsContext) EnableVertexAttribArray(attribute Attribute) { + gl.EnableVertexAttribArray(gl.Attrib(attribute)) +} + +func (c *xjsContext) GetAttribLocation(program Program, name string) Attribute { + return Attribute(gl.GetAttribLocation(gl.Program(program), name)) +} + +func (c *xjsContext) GetError() uint32 { + return uint32(gl.GetError()) +} + +func (c *xjsContext) GetProgrami(program Program, param uint32) int { + return gl.GetProgrami(gl.Program(program), gl.Enum(param)) +} + +func (c *xjsContext) GetProgramInfoLog(program Program) string { + return gl.GetProgramInfoLog(gl.Program(program)) +} + +func (c *xjsContext) GetShaderi(shader Shader, param uint32) int { + return gl.GetShaderi(gl.Shader(shader), gl.Enum(param)) +} + +func (c *xjsContext) GetShaderInfoLog(shader Shader) string { + return gl.GetShaderInfoLog(gl.Shader(shader)) +} + +func (c *xjsContext) GetUniformLocation(program Program, name string) Uniform { + return Uniform(gl.GetUniformLocation(gl.Program(program), name)) +} + +func (c *xjsContext) LinkProgram(program Program) { + gl.LinkProgram(gl.Program(program)) +} + +func (c *xjsContext) ReadBuffer(_ uint32) { +} + +func (c *xjsContext) ReadPixels(x, y, width, height int, colorFormat, typ uint32, pixels []uint8) { + gl.ReadPixels(pixels, x, y, width, height, gl.Enum(colorFormat), gl.Enum(typ)) +} + +func (c *xjsContext) ShaderSource(shader Shader, source string) { + gl.ShaderSource(gl.Shader(shader), source) +} + +func (c *xjsContext) Scissor(x, y, w, h int32) { + gl.Scissor(x, y, w, h) +} + +func (c *xjsContext) TexImage2D(target uint32, level, width, height int, colorFormat, typ uint32, data []uint8) { + gl.TexImage2D( + gl.Enum(target), + level, + width, + height, + gl.Enum(colorFormat), + gl.Enum(typ), + data, + ) +} + +func (c *xjsContext) TexParameteri(target, param uint32, value int32) { + gl.TexParameteri(gl.Enum(target), gl.Enum(param), int(value)) +} + +func (c *xjsContext) Uniform1f(uniform Uniform, v float32) { + gl.Uniform1f(gl.Uniform(uniform), v) +} + +func (c *xjsContext) Uniform2f(uniform Uniform, v0, v1 float32) { + gl.Uniform2f(gl.Uniform(uniform), v0, v1) +} + +func (c *xjsContext) Uniform4f(uniform Uniform, v0, v1, v2, v3 float32) { + gl.Uniform4f(gl.Uniform(uniform), v0, v1, v2, v3) +} + +func (c *xjsContext) UseProgram(program Program) { + gl.UseProgram(gl.Program(program)) +} + +func (c *xjsContext) VertexAttribPointerWithOffset(attribute Attribute, size int, typ uint32, normalized bool, stride, offset int) { + gl.VertexAttribPointer(gl.Attrib(attribute), size, gl.Enum(typ), normalized, stride, offset) +} + +func (c *xjsContext) Viewport(x, y, width, height int) { + gl.Viewport(x, y, width, height) +} + +// toLEByteOrder returns the byte representation of float32 values in little endian byte order. +func toLEByteOrder(values ...float32) []byte { + b := make([]byte, 4*len(values)) + for i, v := range values { + u := math.Float32bits(v) + b[4*i+0] = byte(u >> 0) + b[4*i+1] = byte(u >> 8) + b[4*i+2] = byte(u >> 16) + b[4*i+3] = byte(u >> 24) + } + return b +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/painter.go b/vendor/fyne.io/fyne/v2/internal/painter/gl/painter.go new file mode 100644 index 0000000..86aff21 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/painter.go @@ -0,0 +1,219 @@ +// Package gl provides a full Fyne render implementation using system OpenGL libraries. +package gl + +import ( + "fmt" + "image" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/driver" + "fyne.io/fyne/v2/theme" +) + +// Painter defines the functionality of our OpenGL based renderer +type Painter interface { + // Init tell a new painter to initialise, usually called after a context is available + Init() + // Capture requests that the specified canvas be drawn to an in-memory image + Capture(fyne.Canvas) image.Image + // Clear tells our painter to prepare a fresh paint + Clear() + // Free is used to indicate that a certain canvas object is no longer needed + Free(fyne.CanvasObject) + // Paint a single fyne.CanvasObject but not its children. + Paint(fyne.CanvasObject, fyne.Position, fyne.Size) + // SetFrameBufferScale tells us when we have more than 1 framebuffer pixel for each output pixel + SetFrameBufferScale(float32) + // SetOutputSize is used to change the resolution of our output viewport + SetOutputSize(int, int) + // StartClipping tells us that the following paint actions should be clipped to the specified area. + StartClipping(fyne.Position, fyne.Size) + // StopClipping stops clipping paint actions. + StopClipping() +} + +// NewPainter creates a new GL based renderer for the provided canvas. +// If it is a master painter it will also initialise OpenGL +func NewPainter(c fyne.Canvas, ctx driver.WithContext) Painter { + p := &painter{canvas: c, contextProvider: ctx} + p.SetFrameBufferScale(1.0) + return p +} + +type painter struct { + canvas fyne.Canvas + ctx context + contextProvider driver.WithContext + program ProgramState + lineProgram ProgramState + rectangleProgram ProgramState + roundRectangleProgram ProgramState + polygonProgram ProgramState + arcProgram ProgramState + texScale float32 + pixScale float32 // pre-calculate scale*texScale for each draw +} + +type ProgramState struct { + ref Program + buff Buffer + uniforms map[string]*UniformState + attributes map[string]Attribute +} + +type UniformState struct { + ref Uniform + prev [4]float32 +} + +func (p *painter) SetUniform1f(pState ProgramState, name string, v float32) { + u := pState.uniforms[name] + if u.prev[0] == v { + return + } + u.prev[0] = v + p.ctx.Uniform1f(u.ref, v) +} + +func (p *painter) SetUniform2f(pState ProgramState, name string, v0, v1 float32) { + u := pState.uniforms[name] + if u.prev[0] == v0 && u.prev[1] == v1 { + return + } + u.prev[0] = v0 + u.prev[1] = v1 + p.ctx.Uniform2f(u.ref, v0, v1) +} + +func (p *painter) SetUniform4f(pState ProgramState, name string, v0, v1, v2, v3 float32) { + u := pState.uniforms[name] + if u.prev[0] == v0 && u.prev[1] == v1 && u.prev[2] == v2 && u.prev[3] == v3 { + return + } + u.prev[0] = v0 + u.prev[1] = v1 + u.prev[2] = v2 + u.prev[3] = v3 + p.ctx.Uniform4f(u.ref, v0, v1, v2, v3) +} + +func (p *painter) UpdateVertexArray(pState ProgramState, name string, size, stride, offset int) { + a := pState.attributes[name] + + p.ctx.VertexAttribPointerWithOffset(a, size, float, false, stride*floatSize, offset*floatSize) + p.logError() +} + +// Declare conformity to Painter interface +var _ Painter = (*painter)(nil) + +func (p *painter) Clear() { + r, g, b, a := theme.Color(theme.ColorNameBackground).RGBA() + p.ctx.ClearColor(float32(r)/max16bit, float32(g)/max16bit, float32(b)/max16bit, float32(a)/max16bit) + p.ctx.Clear(bitColorBuffer | bitDepthBuffer) + p.logError() +} + +func (p *painter) Free(obj fyne.CanvasObject) { + p.freeTexture(obj) +} + +func (p *painter) Paint(obj fyne.CanvasObject, pos fyne.Position, frame fyne.Size) { + if obj.Visible() { + p.drawObject(obj, pos, frame) + } +} + +func (p *painter) SetFrameBufferScale(scale float32) { + p.texScale = scale + p.pixScale = p.canvas.Scale() * p.texScale +} + +func (p *painter) SetOutputSize(width, height int) { + p.ctx.Viewport(0, 0, width, height) + p.logError() +} + +func (p *painter) StartClipping(pos fyne.Position, size fyne.Size) { + x := p.textureScale(pos.X) + y := p.textureScale(p.canvas.Size().Height - pos.Y - size.Height) + w := p.textureScale(size.Width) + h := p.textureScale(size.Height) + p.ctx.Scissor(int32(x), int32(y), int32(w), int32(h)) + p.ctx.Enable(scissorTest) + p.logError() +} + +func (p *painter) StopClipping() { + p.ctx.Disable(scissorTest) + p.logError() +} + +func (p *painter) compileShader(source string, shaderType uint32) (Shader, error) { + shader := p.ctx.CreateShader(shaderType) + + p.ctx.ShaderSource(shader, source) + p.logError() + p.ctx.CompileShader(shader) + p.logError() + + info := p.ctx.GetShaderInfoLog(shader) + if p.ctx.GetShaderi(shader, compileStatus) == glFalse { + return noShader, fmt.Errorf("failed to compile OpenGL shader:\n%s\n>>> SHADER SOURCE\n%s\n<<< SHADER SOURCE", info, source) + } + + // The info is probably a null terminated string. + // An empty info has been seen as "\x00" or "\x00\x00". + if len(info) > 0 && info != "\x00" && info != "\x00\x00" { + fmt.Printf("OpenGL shader compilation output:\n%s\n>>> SHADER SOURCE\n%s\n<<< SHADER SOURCE\n", info, source) + } + + return shader, nil +} + +func (p *painter) createProgram(shaderFilename string) Program { + // Why a switch over a filename? + // Because this allows for a minimal change, once we reach Go 1.16 and use go:embed instead of + // fyne bundle. + vertexSrc, fragmentSrc := shaderSourceNamed(shaderFilename) + if vertexSrc == nil { + panic("shader not found: " + shaderFilename) + } + + vertShader, err := p.compileShader(string(vertexSrc), vertexShader) + if err != nil { + panic(err) + } + fragShader, err := p.compileShader(string(fragmentSrc), fragmentShader) + if err != nil { + panic(err) + } + + prog := p.ctx.CreateProgram() + p.ctx.AttachShader(prog, vertShader) + p.ctx.AttachShader(prog, fragShader) + p.ctx.LinkProgram(prog) + + info := p.ctx.GetProgramInfoLog(prog) + if p.ctx.GetProgrami(prog, linkStatus) == glFalse { + panic(fmt.Errorf("failed to link OpenGL program:\n%s", info)) + } + + // The info is probably a null terminated string. + // An empty info has been seen as "\x00" or "\x00\x00". + if len(info) > 0 && info != "\x00" && info != "\x00\x00" { + fmt.Printf("OpenGL program linking output:\n%s\n", info) + } + + if glErr := p.ctx.GetError(); glErr != 0 { + panic(fmt.Sprintf("failed to link OpenGL program; error code: %x", glErr)) + } + + p.ctx.UseProgram(prog) + + return prog +} + +func (p *painter) logError() { + logGLError(p.ctx.GetError) +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders.go b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders.go new file mode 100644 index 0000000..3515da4 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders.go @@ -0,0 +1,52 @@ +//go:build (!gles && !arm && !arm64 && !android && !ios && !mobile && !test_web_driver && !wasm) || (darwin && !mobile && !ios && !wasm && !test_web_driver) + +package gl + +import _ "embed" + +var ( + //go:embed shaders/line.frag + shaderLineFrag []byte + + //go:embed shaders/line.vert + shaderLineVert []byte + + //go:embed shaders/rectangle.frag + shaderRectangleFrag []byte + + //go:embed shaders/rectangle.vert + shaderRectangleVert []byte + + //go:embed shaders/round_rectangle.frag + shaderRoundrectangleFrag []byte + + //go:embed shaders/simple.frag + shaderSimpleFrag []byte + + //go:embed shaders/simple.vert + shaderSimpleVert []byte + + //go:embed shaders/polygon.frag + shaderPolygonFrag []byte + + //go:embed shaders/arc.frag + shaderArcFrag []byte +) + +func shaderSourceNamed(name string) ([]byte, []byte) { + switch name { + case "line": + return shaderLineVert, shaderLineFrag + case "simple": + return shaderSimpleVert, shaderSimpleFrag + case "rectangle": + return shaderRectangleVert, shaderRectangleFrag + case "round_rectangle": + return shaderRectangleVert, shaderRoundrectangleFrag + case "polygon": + return shaderRectangleVert, shaderPolygonFrag + case "arc": + return shaderRectangleVert, shaderArcFrag + } + return nil, nil +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/arc.frag b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/arc.frag new file mode 100644 index 0000000..c45f88e --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/arc.frag @@ -0,0 +1,116 @@ +#version 110 + +// Note: This shader operates in the unit circle coordinate system, where angles are measured from the positive X axis. +// To adapt the arc orientation or coordinate system, adjust the start_angle and end_angle uniforms accordingly. + +uniform vec2 frame_size; +uniform vec4 rect_coords; +uniform float edge_softness; + +uniform float inner_radius; +uniform float outer_radius; +uniform float start_angle; +uniform float end_angle; +uniform vec4 fill_color; +uniform float corner_radius; +uniform float stroke_width; +uniform vec4 stroke_color; + +const float PI = 3.141592653589793; + +// Computes the signed distance for a rounded arc shape +// Parameters: +// position - The 2D coordinate to evaluate (vec2) +// inner radius - The inner radius of the arc (float) +// outer radius - The outer radius of the arc (float) +// start rad - The starting angle of the arc in radians (float) +// end rad - The ending angle of the arc in radians (float) +// corner radius - The radius for rounding the arc's corners (float) +// Returns: +// The signed distance from the given position to the edge of the rounded arc +// Negative values are inside the arc, positive values are outside, and zero is on the edge +float sd_rounded_arc(vec2 p, float r1, float r2, float a0, float a1, float cr) +{ + // center the arc for simpler calculations + float mid_angle = (a0 + a1) / 2.0; + float arc_span = abs(a1 - a0); + + float cs = cos(mid_angle); + float sn = sin(mid_angle); + p = mat2(cs, -sn, sn, cs) * p; + + // calculate distance to a rounded box in a pseudo-polar space + float r = length(p); + + // atan(y, x) for standard angle convention (0 degrees = right) + float a = atan(p.y, p.x); + + vec2 box_half_size = vec2(arc_span * 0.5 * r, (r2 - r1) * 0.5); + vec2 q = vec2(a * r, r - (r1 + r2) * 0.5); + + // the inner corner radius is clamped to half of the smaller dimension: + // thickness (r2 - r1), to prevent inner/outer corners on the same side from overlapping + // inner length (arc_span * r1), to prevent the start/end inner corners from overlapping + float inner_cr = min(cr, 0.5 * min(r2 - r1, arc_span * r1)); + // the outer corner radius is just cr + float outer_cr = cr; + + // interpolate between inner and outer corner radius based on the radial position + // 't' goes from 0 (inner) to 1 (outer). + float t = smoothstep(-box_half_size.y, box_half_size.y, q.y); + float effective_cr = mix(inner_cr, outer_cr, t); + + // use the standard SDF for a 2D rounded box with the effective radius + vec2 dist = abs(q) - box_half_size + effective_cr; + return length(max(dist, 0.0)) + min(max(dist.x, dist.y), 0.0) - effective_cr; +} + +void main() +{ + vec4 frag_rect_coords = vec4(rect_coords[0], rect_coords[1], frame_size.y - rect_coords[3], frame_size.y - rect_coords[2]); + vec2 vec_centered_pos = (gl_FragCoord.xy - vec2(frag_rect_coords[0] + frag_rect_coords[1], frag_rect_coords[2] + frag_rect_coords[3]) * 0.5); + float start_rad = radians(start_angle); + float end_rad = radians(end_angle); + + // check if the arc is a full circle (360 degrees or more) + // the sd_rounded_arc function creates segment at the start/end angle, which is undesirable for a complete circle + float dist; + if (abs(end_rad - start_rad) >= 2.0 * PI - 0.001) + { + // full circle + float r = length(vec_centered_pos); + + if (inner_radius < 0.5) + { + // no inner radius + dist = r - outer_radius; + } + else + { + float ring_center_radius = (inner_radius + outer_radius) * 0.5; + float ring_thickness = (outer_radius - inner_radius) * 0.5; + dist = abs(r - ring_center_radius) - ring_thickness; + } + } + else + { + dist = sd_rounded_arc(vec_centered_pos, inner_radius, outer_radius, start_rad, end_rad, corner_radius); + } + + vec4 final_color = fill_color; + + if (stroke_width > 0.0) + { + // create a mask for the fill area (inside, shrunk by stroke width) + float fill_mask = smoothstep(edge_softness, -edge_softness, dist + stroke_width); + + // combine fill mask and colors (fill + stroke) + final_color = mix(stroke_color, fill_color, fill_mask); + } + + // smooth edges + float final_alpha = smoothstep(edge_softness, -edge_softness, dist); + + // apply the final alpha to the combined color + gl_FragColor = vec4(final_color.rgb, final_color.a * final_alpha); +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/arc_es.frag b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/arc_es.frag new file mode 100644 index 0000000..5a0417c --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/arc_es.frag @@ -0,0 +1,126 @@ +#version 100 + +// Note: This shader operates in the unit circle coordinate system, where angles are measured from the positive X axis. +// To adapt the arc orientation or coordinate system, adjust the start_angle and end_angle uniforms accordingly. + +#ifdef GL_ES +# ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +# else +precision mediump float; +#endif +precision mediump int; +precision lowp sampler2D; +#endif + +uniform vec2 frame_size; +uniform vec4 rect_coords; +uniform float edge_softness; + +uniform float inner_radius; +uniform float outer_radius; +uniform float start_angle; +uniform float end_angle; +uniform vec4 fill_color; +uniform float corner_radius; +uniform float stroke_width; +uniform vec4 stroke_color; + +const float PI = 3.141592653589793; + +// Computes the signed distance for a rounded arc shape +// Parameters: +// position - The 2D coordinate to evaluate (vec2) +// inner radius - The inner radius of the arc (float) +// outer radius - The outer radius of the arc (float) +// start rad - The starting angle of the arc in radians (float) +// end rad - The ending angle of the arc in radians (float) +// corner radius - The radius for rounding the arc's corners (float) +// Returns: +// The signed distance from the given position to the edge of the rounded arc +// Negative values are inside the arc, positive values are outside, and zero is on the edge +float sd_rounded_arc(vec2 p, float r1, float r2, float a0, float a1, float cr) +{ + // center the arc for simpler calculations + float mid_angle = (a0 + a1) / 2.0; + float arc_span = abs(a1 - a0); + + float cs = cos(mid_angle); + float sn = sin(mid_angle); + p = mat2(cs, -sn, sn, cs) * p; + + // calculate distance to a rounded box in a pseudo-polar space + float r = length(p); + + // atan(y, x) for standard angle convention (0 degrees = right) + float a = atan(p.y, p.x); + + vec2 box_half_size = vec2(arc_span * 0.5 * r, (r2 - r1) * 0.5); + vec2 q = vec2(a * r, r - (r1 + r2) * 0.5); + + // the inner corner radius is clamped to half of the smaller dimension: + // thickness (r2 - r1), to prevent inner/outer corners on the same side from overlapping + // inner length (arc_span * r1), to prevent the start/end inner corners from overlapping + float inner_cr = min(cr, 0.5 * min(r2 - r1, arc_span * r1)); + // the outer corner radius is just cr + float outer_cr = cr; + + // interpolate between inner and outer corner radius based on the radial position + // 't' goes from 0 (inner) to 1 (outer). + float t = smoothstep(-box_half_size.y, box_half_size.y, q.y); + float effective_cr = mix(inner_cr, outer_cr, t); + + // use the standard SDF for a 2D rounded box with the effective radius + vec2 dist = abs(q) - box_half_size + effective_cr; + return length(max(dist, 0.0)) + min(max(dist.x, dist.y), 0.0) - effective_cr; +} + +void main() +{ + vec4 frag_rect_coords = vec4(rect_coords[0], rect_coords[1], frame_size.y - rect_coords[3], frame_size.y - rect_coords[2]); + vec2 vec_centered_pos = (gl_FragCoord.xy - vec2(frag_rect_coords[0] + frag_rect_coords[1], frag_rect_coords[2] + frag_rect_coords[3]) * 0.5); + float start_rad = radians(start_angle); + float end_rad = radians(end_angle); + + // check if the arc is a full circle (360 degrees or more) + // the sd_rounded_arc function creates segment at the start/end angle, which is undesirable for a complete circle + float dist; + if (abs(end_rad - start_rad) >= 2.0 * PI - 0.001) + { + // full circle + float r = length(vec_centered_pos); + + if (inner_radius < 0.5) + { + // no inner radius + dist = r - outer_radius; + } + else + { + float ring_center_radius = (inner_radius + outer_radius) * 0.5; + float ring_thickness = (outer_radius - inner_radius) * 0.5; + dist = abs(r - ring_center_radius) - ring_thickness; + } + } + else + { + dist = sd_rounded_arc(vec_centered_pos, inner_radius, outer_radius, start_rad, end_rad, corner_radius); + } + + vec4 final_color = fill_color; + + if (stroke_width > 0.0) + { + // create a mask for the fill area (inside, shrunk by stroke width) + float fill_mask = smoothstep(edge_softness, -edge_softness, dist + stroke_width); + + // combine fill mask and colors (fill + stroke) + final_color = mix(stroke_color, fill_color, fill_mask); + } + + // smooth edges + float final_alpha = smoothstep(edge_softness, -edge_softness, dist); + + // apply the final alpha to the combined color + gl_FragColor = vec4(final_color.rgb, final_color.a * final_alpha); +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/line.frag b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/line.frag new file mode 100644 index 0000000..266f159 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/line.frag @@ -0,0 +1,18 @@ +#version 110 + +uniform vec4 color; +uniform float lineWidth; +uniform float feather; + +varying vec2 delta; + +void main() { + float alpha = color.a; + float distance = length(delta); + + if (feather == 0.0 || distance <= lineWidth - feather) { + gl_FragColor = color; + } else { + gl_FragColor = vec4(color.r, color.g, color.b, mix(color.a, 0.0, (distance - (lineWidth - feather)) / feather)); + } +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/line.vert b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/line.vert new file mode 100644 index 0000000..a243b07 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/line.vert @@ -0,0 +1,14 @@ +#version 110 + +attribute vec2 vert; +attribute vec2 normal; + +uniform float lineWidth; + +varying vec2 delta; + +void main() { + delta = normal * lineWidth; + + gl_Position = vec4(vert + delta, 0, 1); +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/line_es.frag b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/line_es.frag new file mode 100644 index 0000000..577748a --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/line_es.frag @@ -0,0 +1,28 @@ +#version 100 + +#ifdef GL_ES +# ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +# else +precision mediump float; +#endif +precision mediump int; +precision lowp sampler2D; +#endif + +uniform vec4 color; +uniform float lineWidth; +uniform float feather; + +varying vec2 delta; + +void main() { + float alpha = color.a; + float distance = length(delta); + + if (feather == 0.0 || distance <= lineWidth - feather) { + gl_FragColor = color; + } else { + gl_FragColor = vec4(color.r, color.g, color.b, mix(color.a, 0.0, (distance - (lineWidth - feather)) / feather)); + } +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/line_es.vert b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/line_es.vert new file mode 100644 index 0000000..1fd10ea --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/line_es.vert @@ -0,0 +1,24 @@ +#version 100 + +#ifdef GL_ES +# ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +# else +precision mediump float; +#endif +precision mediump int; +precision lowp sampler2D; +#endif + +attribute vec2 vert; +attribute vec2 normal; + +uniform float lineWidth; + +varying vec2 delta; + +void main() { + delta = normal * lineWidth; + + gl_Position = vec4(vert + delta, 0, 1); +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/polygon.frag b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/polygon.frag new file mode 100644 index 0000000..97f5484 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/polygon.frag @@ -0,0 +1,59 @@ +#version 110 + +uniform vec2 frame_size; +uniform vec4 rect_coords; +uniform float edge_softness; + +uniform float outer_radius; +uniform float angle; +uniform float sides; + +uniform vec4 fill_color; +uniform float corner_radius; +uniform float stroke_width; +uniform vec4 stroke_color; + +const float PI = 3.141592653589793; + +mat2 rotate(float angle) { + float s = sin(-angle); + float c = cos(-angle); + return mat2(c, -s, s, c); +} + +// The signed distance (float) from the point to the regular polygon's edge +float regular_distance(vec2 p, float r, int s) +{ + float angle = PI / float(s); + float angle_cos = cos(angle); + float angle_sin = sin(angle); + float angular_offset = mod(atan(p.x, p.y), 2.0*angle) - angle; + vec2 distance = length(p) * vec2(cos(angular_offset), abs(sin(angular_offset))) - r*vec2(angle_cos, angle_sin); + distance.y += clamp(-distance.y, 0.0, r*angle_sin); + return length(distance) * sign(distance.x); +} + +void main() +{ + vec4 frag_rect_coords = vec4(rect_coords[0], rect_coords[1], frame_size.y - rect_coords[3], frame_size.y - rect_coords[2]); + vec2 vec_centered_pos = (gl_FragCoord.xy - vec2(frag_rect_coords[0] + frag_rect_coords[1], frag_rect_coords[2] + frag_rect_coords[3]) * 0.5); + + vec_centered_pos = rotate(radians(angle)) * vec_centered_pos; + float dist = regular_distance(vec_centered_pos, outer_radius - corner_radius, int(sides)) - corner_radius; + vec4 final_color = fill_color; + + if (stroke_width > 0.0) + { + // create a mask for the fill area (inside, shrunk by stroke width) + float fill_mask = smoothstep(-stroke_width + edge_softness, -stroke_width - edge_softness, dist); + + // combine fill mask and colors (fill + stroke) + final_color = mix(stroke_color, fill_color, fill_mask); + } + + // smooth edges + float final_alpha = smoothstep(edge_softness, -edge_softness, dist); + + // apply the final alpha to the combined color + gl_FragColor = vec4(final_color.rgb, final_color.a * final_alpha); +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/polygon_es.frag b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/polygon_es.frag new file mode 100644 index 0000000..3a935ab --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/polygon_es.frag @@ -0,0 +1,69 @@ +#version 100 + +#ifdef GL_ES +# ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +# else +precision mediump float; +#endif +precision mediump int; +precision lowp sampler2D; +#endif + +uniform vec2 frame_size; +uniform vec4 rect_coords; +uniform float edge_softness; + +uniform float outer_radius; +uniform float angle; +uniform float sides; + +uniform vec4 fill_color; +uniform float corner_radius; +uniform float stroke_width; +uniform vec4 stroke_color; + +const float PI = 3.141592653589793; + +mat2 rotate(float angle) { + float s = sin(-angle); + float c = cos(-angle); + return mat2(c, -s, s, c); +} + +// The signed distance (float) from the point to the regular polygon's edge +float regular_distance(vec2 p, float r, int s) +{ + float angle = PI / float(s); + float angle_cos = cos(angle); + float angle_sin = sin(angle); + float angular_offset = mod(atan(p.x, p.y), 2.0*angle) - angle; + vec2 distance = length(p) * vec2(cos(angular_offset), abs(sin(angular_offset))) - r*vec2(angle_cos, angle_sin); + distance.y += clamp(-distance.y, 0.0, r*angle_sin); + return length(distance) * sign(distance.x); +} + +void main() +{ + vec4 frag_rect_coords = vec4(rect_coords[0], rect_coords[1], frame_size.y - rect_coords[3], frame_size.y - rect_coords[2]); + vec2 vec_centered_pos = (gl_FragCoord.xy - vec2(frag_rect_coords[0] + frag_rect_coords[1], frag_rect_coords[2] + frag_rect_coords[3]) * 0.5); + + vec_centered_pos = rotate(radians(angle)) * vec_centered_pos; + float dist = regular_distance(vec_centered_pos, outer_radius - corner_radius, int(sides)) - corner_radius; + vec4 final_color = fill_color; + + if (stroke_width > 0.0) + { + // create a mask for the fill area (inside, shrunk by stroke width) + float fill_mask = smoothstep(-stroke_width + edge_softness, -stroke_width - edge_softness, dist); + + // combine fill mask and colors (fill + stroke) + final_color = mix(stroke_color, fill_color, fill_mask); + } + + // smooth edges + float final_alpha = smoothstep(edge_softness, -edge_softness, dist); + + // apply the final alpha to the combined color + gl_FragColor = vec4(final_color.rgb, final_color.a * final_alpha); +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/rectangle.frag b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/rectangle.frag new file mode 100644 index 0000000..b8c7e28 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/rectangle.frag @@ -0,0 +1,32 @@ +#version 110 + +/* scaled params */ +uniform vec2 frame_size; +uniform vec4 rect_coords; //x1 [0], x2 [1], y1 [2], y2 [3]; coords of the rect_frame +uniform float stroke_width; +/* colors params*/ +uniform vec4 fill_color; +uniform vec4 stroke_color; + + +void main() { + + // discard if outside rectangle coords, necessary to draw thin stroke and mitigate inconsistent borders issue + if (gl_FragCoord.x < rect_coords[0] || gl_FragCoord.x > rect_coords[1] || gl_FragCoord.y < frame_size.y - rect_coords[3] || gl_FragCoord.y > frame_size.y - rect_coords[2]) { + discard; + } + + vec4 color = fill_color; + + if (gl_FragCoord.x >= rect_coords[1] - stroke_width ){ + color = stroke_color; + } else if (gl_FragCoord.x <= rect_coords[0] + stroke_width){ + color = stroke_color; + } else if (gl_FragCoord.y <= frame_size.y - rect_coords[3] + stroke_width ){ + color = stroke_color; + } else if (gl_FragCoord.y >= frame_size.y - rect_coords[2] - stroke_width ){ + color = stroke_color; + } + + gl_FragColor = color; +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/rectangle.vert b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/rectangle.vert new file mode 100644 index 0000000..d2aae9b --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/rectangle.vert @@ -0,0 +1,8 @@ +#version 110 + +attribute vec2 vert; +attribute vec2 normal; + +void main() { + gl_Position = vec4(vert+normal, 0, 1); +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/rectangle_es.frag b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/rectangle_es.frag new file mode 100644 index 0000000..12d77a3 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/rectangle_es.frag @@ -0,0 +1,42 @@ +#version 100 + +#ifdef GL_ES +# ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +# else +precision mediump float; +#endif +precision mediump int; +precision lowp sampler2D; +#endif + +/* scaled params */ +uniform vec2 frame_size; +uniform vec4 rect_coords; //x1 [0], x2 [1], y1 [2], y2 [3]; coords of the rect_frame +uniform float stroke_width; +/* colors params*/ +uniform vec4 fill_color; +uniform vec4 stroke_color; + + +void main() { + + // discard if outside rectangle coords, necessary to draw thin stroke and mitigate inconsistent borders issue + if (gl_FragCoord.x < rect_coords[0] || gl_FragCoord.x > rect_coords[1] || gl_FragCoord.y < frame_size.y - rect_coords[3] || gl_FragCoord.y > frame_size.y - rect_coords[2]) { + discard; + } + + vec4 color = fill_color; + + if (gl_FragCoord.x >= rect_coords[1] - stroke_width ){ + color = stroke_color; + } else if (gl_FragCoord.x <= rect_coords[0] + stroke_width){ + color = stroke_color; + } else if (gl_FragCoord.y <= frame_size.y - rect_coords[3] + stroke_width ){ + color = stroke_color; + } else if (gl_FragCoord.y >= frame_size.y - rect_coords[2] - stroke_width ){ + color = stroke_color; + } + + gl_FragColor = color; +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/rectangle_es.vert b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/rectangle_es.vert new file mode 100644 index 0000000..c46159d --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/rectangle_es.vert @@ -0,0 +1,18 @@ +#version 100 + +#ifdef GL_ES +# ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +# else +precision mediump float; +#endif +precision mediump int; +precision lowp sampler2D; +#endif + +attribute vec2 vert; +attribute vec2 normal; + +void main() { + gl_Position = vec4(vert+normal, 0, 1); +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/round_rectangle.frag b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/round_rectangle.frag new file mode 100644 index 0000000..b6a15eb --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/round_rectangle.frag @@ -0,0 +1,86 @@ +#version 110 + +/* scaled params */ +uniform vec2 frame_size; +uniform vec4 rect_coords; //x1 [0], x2 [1], y1 [2], y2 [3]; coords of the rect_frame +uniform float stroke_width_half; +uniform vec2 rect_size_half; +uniform vec4 radius; +uniform float edge_softness; +/* colors params*/ +uniform vec4 fill_color; +uniform vec4 stroke_color; + +// distance is calculated for a single quadrant +// returns invalid output if corner radius exceed half of the shorter edge +float calc_distance(vec2 p, vec2 b, vec4 r) +{ + r.xy = (p.x > 0.0) ? r.xy : r.zw; + r.x = (p.y > 0.0) ? r.x : r.y; + + vec2 d = abs(p) - b + r.x; + return min(max(d.x, d.y), 0.0) + length(max(d, 0.0)) - r.x; +} + +// distance is calculated for all necessary quadrants +// corner radius may exceed half of the shorter edge +float calc_distance_all_quadrants(vec2 p, vec2 size, vec4 radius) { + vec2 d = abs(p) - size; + float dist = length(max(d, 0.0)) + min(max(d.x, d.y), 0.0); + + // top-left corner + vec2 p_tl = p - vec2(radius.z - size.x, size.y - radius.z); + if (p_tl.x < 0.0 && p_tl.y > 0.0) dist = max(dist, length(p_tl) - radius.z); + + // top-right corner + vec2 p_tr = p - vec2(size.x - radius.x, size.y - radius.x); + if (p_tr.x > 0.0 && p_tr.y > 0.0) dist = max(dist, length(p_tr) - radius.x); + + // bottom-right corner + vec2 p_br = p - vec2(size.x - radius.y, radius.y - size.y); + if (p_br.x > 0.0 && p_br.y < 0.0) dist = max(dist, length(p_br) - radius.y); + + // bottom-left corner + vec2 p_bl = p - vec2(radius.w - size.x, radius.w - size.y); + if (p_bl.x < 0.0 && p_bl.y < 0.0) dist = max(dist, length(p_bl) - radius.w); + + return dist; +} + +void main() { + vec4 frag_rect_coords = vec4(rect_coords[0], rect_coords[1], frame_size.y - rect_coords[3], frame_size.y - rect_coords[2]); + vec2 vec_centered_pos = (gl_FragCoord.xy - vec2(frag_rect_coords[0] + frag_rect_coords[1], frag_rect_coords[2] + frag_rect_coords[3]) * 0.5); + + float distance; + float max_radius = max(max(radius.x, radius.y), max(radius.z, radius.w)); + vec4 final_color = fill_color; + float final_alpha; + + // subtract a small threshold value to avoid calling calc_distance_all_quadrants when the largest corner radius is very close to half the length of the rectangle's shortest edge + if (max_radius - 0.9 > min(rect_size_half.x, rect_size_half.y) + stroke_width_half) + { + // at least one corner radius is larger than half of the shorter edge + distance = calc_distance_all_quadrants(vec_centered_pos, rect_size_half + stroke_width_half, radius); + final_alpha = 1.0 - smoothstep(-edge_softness, edge_softness, distance); + + if (stroke_width_half > 0.0) + { + float color_blend = 1.0 - smoothstep(stroke_width_half * 2.0 - edge_softness, stroke_width_half * 2.0 + edge_softness, abs(distance)); + final_color = mix(fill_color, stroke_color, color_blend); + } + } + else + { + distance = calc_distance(vec_centered_pos, rect_size_half, radius - stroke_width_half); + final_alpha = 1.0 - smoothstep(stroke_width_half - edge_softness, stroke_width_half + edge_softness, distance); + + if (stroke_width_half > 0.0) + { + float color_blend = smoothstep(-stroke_width_half - edge_softness, -stroke_width_half + edge_softness, distance); + final_color = mix(fill_color, stroke_color, color_blend); + } + } + + // final color + gl_FragColor = vec4(final_color.rgb, final_color.a * final_alpha); +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/round_rectangle_es.frag b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/round_rectangle_es.frag new file mode 100644 index 0000000..64e0f0a --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/round_rectangle_es.frag @@ -0,0 +1,96 @@ +#version 100 + +#ifdef GL_ES +# ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +# else +precision mediump float; +#endif +precision mediump int; +precision lowp sampler2D; +#endif + +/* scaled params */ +uniform vec2 frame_size; +uniform vec4 rect_coords; //x1 [0], x2 [1], y1 [2], y2 [3]; coords of the rect_frame +uniform float stroke_width_half; +uniform vec2 rect_size_half; +uniform vec4 radius; +uniform float edge_softness; +/* colors params*/ +uniform vec4 fill_color; +uniform vec4 stroke_color; + +// distance is calculated for a single quadrant +// returns invalid output if corner radius exceed half of the shorter edge +float calc_distance(vec2 p, vec2 b, vec4 r) +{ + r.xy = (p.x > 0.0) ? r.xy : r.zw; + r.x = (p.y > 0.0) ? r.x : r.y; + + vec2 d = abs(p) - b + r.x; + return min(max(d.x, d.y), 0.0) + length(max(d, 0.0)) - r.x; +} + +// distance is calculated for all necessary quadrants +// corner radius may exceed half of the shorter edge +float calc_distance_all_quadrants(vec2 p, vec2 size, vec4 radius) { + vec2 d = abs(p) - size; + float dist = length(max(d, 0.0)) + min(max(d.x, d.y), 0.0); + + // top-left corner + vec2 p_tl = p - vec2(radius.z - size.x, size.y - radius.z); + if (p_tl.x < 0.0 && p_tl.y > 0.0) dist = max(dist, length(p_tl) - radius.z); + + // top-right corner + vec2 p_tr = p - vec2(size.x - radius.x, size.y - radius.x); + if (p_tr.x > 0.0 && p_tr.y > 0.0) dist = max(dist, length(p_tr) - radius.x); + + // bottom-right corner + vec2 p_br = p - vec2(size.x - radius.y, radius.y - size.y); + if (p_br.x > 0.0 && p_br.y < 0.0) dist = max(dist, length(p_br) - radius.y); + + // bottom-left corner + vec2 p_bl = p - vec2(radius.w - size.x, radius.w - size.y); + if (p_bl.x < 0.0 && p_bl.y < 0.0) dist = max(dist, length(p_bl) - radius.w); + + return dist; +} + +void main() { + vec4 frag_rect_coords = vec4(rect_coords[0], rect_coords[1], frame_size.y - rect_coords[3], frame_size.y - rect_coords[2]); + vec2 vec_centered_pos = (gl_FragCoord.xy - vec2(frag_rect_coords[0] + frag_rect_coords[1], frag_rect_coords[2] + frag_rect_coords[3]) * 0.5); + + float distance; + float max_radius = max(max(radius.x, radius.y), max(radius.z, radius.w)); + vec4 final_color = fill_color; + float final_alpha; + + // subtract a small threshold value to avoid calling calc_distance_all_quadrants when the largest corner radius is very close to half the length of the rectangle's shortest edge + if (max_radius - 0.9 > min(rect_size_half.x, rect_size_half.y) + stroke_width_half) + { + // at least one corner radius is larger than half of the shorter edge + distance = calc_distance_all_quadrants(vec_centered_pos, rect_size_half + stroke_width_half, radius); + final_alpha = 1.0 - smoothstep(-edge_softness, edge_softness, distance); + + if (stroke_width_half > 0.0) + { + float color_blend = 1.0 - smoothstep(stroke_width_half * 2.0 - edge_softness, stroke_width_half * 2.0 + edge_softness, abs(distance)); + final_color = mix(fill_color, stroke_color, color_blend); + } + } + else + { + distance = calc_distance(vec_centered_pos, rect_size_half, radius - stroke_width_half); + final_alpha = 1.0 - smoothstep(stroke_width_half - edge_softness, stroke_width_half + edge_softness, distance); + + if (stroke_width_half > 0.0) + { + float color_blend = smoothstep(-stroke_width_half - edge_softness, -stroke_width_half + edge_softness, distance); + final_color = mix(fill_color, stroke_color, color_blend); + } + } + + // final color + gl_FragColor = vec4(final_color.rgb, final_color.a * final_alpha); +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/simple.frag b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/simple.frag new file mode 100644 index 0000000..106ec49 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/simple.frag @@ -0,0 +1,31 @@ +#version 110 + +uniform sampler2D tex; +uniform float cornerRadius; // in pixels +uniform vec2 size; // in pixels: size of the rendered image quad +uniform vec4 inset; // texture coordinate insets (minX, minY, maxX, maxY) + +varying vec2 fragTexCoord; +varying float fragAlpha; + +void main() { + float alpha = 1.0; + if (cornerRadius > 0.5) { + // normalize texture coords from [insetMin, insetMax] to [0, 1] + // this makes the rounding calculation work correctly for cropped/covered images + vec2 normalizedCoord = (fragTexCoord - inset.xy) / (inset.zw - inset.xy); + + vec2 pos = normalizedCoord * size; + vec2 halfSize = size * 0.5; + float dist = length(max(abs(pos - halfSize) - halfSize + cornerRadius, 0.0)) - cornerRadius; + alpha = 1.0 - smoothstep(-1.0, 1.0, dist); + } + + vec4 texColor = texture2D(tex, fragTexCoord); + texColor.a *= fragAlpha * alpha; + texColor.rgb *= fragAlpha * alpha; + + if(texColor.a < 0.01) + discard; + gl_FragColor = texColor; +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/simple.vert b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/simple.vert new file mode 100644 index 0000000..d76c898 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/simple.vert @@ -0,0 +1,16 @@ +#version 110 + +uniform float alpha; + +attribute vec3 vert; +attribute vec2 vertTexCoord; + +varying vec2 fragTexCoord; +varying float fragAlpha; + +void main() { + fragTexCoord = vertTexCoord; + fragAlpha = alpha; + + gl_Position = vec4(vert, 1); +} \ No newline at end of file diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/simple_es.frag b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/simple_es.frag new file mode 100644 index 0000000..4fc43aa --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/simple_es.frag @@ -0,0 +1,41 @@ +#version 100 + +#ifdef GL_ES +# ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +# else +precision mediump float; +#endif +precision mediump int; +precision lowp sampler2D; +#endif + +uniform sampler2D tex; +uniform float cornerRadius; // in pixels +uniform vec2 size; // in pixels: size of the rendered image quad +uniform vec4 inset; // texture coordinate insets (minX, minY, maxX, maxY) + +varying vec2 fragTexCoord; +varying float fragAlpha; + +void main() { + float alpha = 1.0; + if (cornerRadius > 0.5) { + // normalize texture coords from [insetMin, insetMax] to [0, 1] + // this makes the rounding calculation work correctly for cropped/covered images + vec2 normalizedCoord = (fragTexCoord - inset.xy) / (inset.zw - inset.xy); + + vec2 pos = normalizedCoord * size; + vec2 halfSize = size * 0.5; + float dist = length(max(abs(pos - halfSize) - halfSize + cornerRadius, 0.0)) - cornerRadius; + alpha = 1.0 - smoothstep(-1.0, 1.0, dist); + } + + vec4 texColor = texture2D(tex, fragTexCoord); + texColor.a *= fragAlpha * alpha; + texColor.rgb *= fragAlpha * alpha; + + if(texColor.a < 0.01) + discard; + gl_FragColor = texColor; +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/simple_es.vert b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/simple_es.vert new file mode 100644 index 0000000..d94769b --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders/simple_es.vert @@ -0,0 +1,26 @@ +#version 100 + +#ifdef GL_ES +# ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +# else +precision mediump float; +#endif +precision mediump int; +precision lowp sampler2D; +#endif + +uniform float alpha; + +attribute vec3 vert; +attribute vec2 vertTexCoord; + +varying vec2 fragTexCoord; +varying float fragAlpha; + +void main() { + fragTexCoord = vertTexCoord; + fragAlpha = alpha; + + gl_Position = vec4(vert, 1); +} \ No newline at end of file diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders_es.go b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders_es.go new file mode 100644 index 0000000..f16fa85 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/shaders_es.go @@ -0,0 +1,52 @@ +//go:build ((gles || arm || arm64) && !android && !ios && !mobile && !darwin && !wasm && !test_web_driver) || ((android || ios || mobile) && (!wasm || !test_web_driver)) || wasm || test_web_driver + +package gl + +import _ "embed" + +var ( + //go:embed shaders/line_es.frag + shaderLineesFrag []byte + + //go:embed shaders/line_es.vert + shaderLineesVert []byte + + //go:embed shaders/rectangle_es.frag + shaderRectangleesFrag []byte + + //go:embed shaders/rectangle_es.vert + shaderRectangleesVert []byte + + //go:embed shaders/round_rectangle_es.frag + shaderRoundrectangleesFrag []byte + + //go:embed shaders/simple_es.frag + shaderSimpleesFrag []byte + + //go:embed shaders/simple_es.vert + shaderSimpleesVert []byte + + //go:embed shaders/polygon_es.frag + shaderPolygonesFrag []byte + + //go:embed shaders/arc_es.frag + shaderArcesFrag []byte +) + +func shaderSourceNamed(name string) ([]byte, []byte) { + switch name { + case "line_es": + return shaderLineesVert, shaderLineesFrag + case "simple_es": + return shaderSimpleesVert, shaderSimpleesFrag + case "rectangle_es": + return shaderRectangleesVert, shaderRectangleesFrag + case "round_rectangle_es": + return shaderRectangleesVert, shaderRoundrectangleesFrag + case "polygon_es": + return shaderRectangleesVert, shaderPolygonesFrag + case "arc_es": + return shaderRectangleesVert, shaderArcesFrag + } + return nil, nil +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/gl/texture.go b/vendor/fyne.io/fyne/v2/internal/painter/gl/texture.go new file mode 100644 index 0000000..5cfda8b --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/gl/texture.go @@ -0,0 +1,210 @@ +package gl + +import ( + "errors" + "fmt" + "image" + "image/draw" + "math" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/internal/cache" + paint "fyne.io/fyne/v2/internal/painter" + "fyne.io/fyne/v2/theme" +) + +const floatEqualityThreshold = 1e-9 + +var noTexture = Texture(cache.NoTexture) + +// Texture represents an uploaded GL texture +type Texture cache.TextureType + +func (p *painter) freeTexture(obj fyne.CanvasObject) { + texture, ok := cache.GetTexture(obj) + if !ok { + return + } + + p.ctx.DeleteTexture(Texture(texture)) + p.logError() + cache.DeleteTexture(obj) +} + +func (p *painter) getTexture(object fyne.CanvasObject, creator func(canvasObject fyne.CanvasObject) Texture) (Texture, error) { + if t, ok := object.(*canvas.Text); ok { + custom := "" + if t.FontSource != nil { + custom = t.FontSource.Name() + } + ent := cache.FontCacheEntry{Color: t.Color, Canvas: p.canvas} + ent.Text = t.Text + ent.Size = t.TextSize + ent.Style = t.TextStyle + ent.Source = custom + + texture, ok := cache.GetTextTexture(ent) + + if !ok { + tex := creator(object) + texture = cache.TextureType(tex) + cache.SetTextTexture(ent, texture, p.canvas, func() { + p.ctx.DeleteTexture(tex) + }) + } + + return Texture(texture), nil + } + + texture, ok := cache.GetTexture(object) + + if !ok { + texture = cache.TextureType(creator(object)) + cache.SetTexture(object, texture, p.canvas) + } + if !cache.IsValid(texture) { + return noTexture, errors.New("no texture available") + } + return Texture(texture), nil +} + +func (p *painter) imgToTexture(img image.Image, textureFilter canvas.ImageScale) Texture { + switch i := img.(type) { + case *image.Uniform: + texture := p.newTexture(textureFilter) + r, g, b, a := i.RGBA() + r8, g8, b8, a8 := uint8(r>>8), uint8(g>>8), uint8(b>>8), uint8(a>>8) + data := []uint8{r8, g8, b8, a8} + p.ctx.TexImage2D( + texture2D, + 0, + 1, + 1, + colorFormatRGBA, + unsignedByte, + data, + ) + p.logError() + return texture + case *image.RGBA: + if len(i.Pix) == 0 { // image is empty + return noTexture + } + + texture := p.newTexture(textureFilter) + p.ctx.TexImage2D( + texture2D, + 0, + i.Rect.Size().X, + i.Rect.Size().Y, + colorFormatRGBA, + unsignedByte, + i.Pix, + ) + p.logError() + return texture + default: + rgba := image.NewRGBA(image.Rect(0, 0, img.Bounds().Dx(), img.Bounds().Dy())) + draw.Draw(rgba, rgba.Rect, img, image.Point{}, draw.Over) + return p.imgToTexture(rgba, textureFilter) + } +} + +func (p *painter) newGlImageTexture(obj fyne.CanvasObject) Texture { + img := obj.(*canvas.Image) + + width := p.textureScale(img.Size().Width) + height := p.textureScale(img.Size().Height) + + tex := paint.PaintImage(img, p.canvas, int(width), int(height)) + if tex == nil { + return noTexture + } + + return p.imgToTexture(tex, img.ScaleMode) +} + +func (p *painter) newGlLinearGradientTexture(obj fyne.CanvasObject) Texture { + gradient := obj.(*canvas.LinearGradient) + + w := gradient.Size().Width + h := gradient.Size().Height + switch a := gradient.Angle; { + case almostEqual(a, 90), almostEqual(a, 270): + h = 1 + case almostEqual(a, 0), almostEqual(a, 180): + w = 1 + } + width := p.textureScale(w) + height := p.textureScale(h) + + return p.imgToTexture(gradient.Generate(int(width), int(height)), canvas.ImageScaleSmooth) +} + +func (p *painter) newGlRadialGradientTexture(obj fyne.CanvasObject) Texture { + gradient := obj.(*canvas.RadialGradient) + + width := p.textureScale(gradient.Size().Width) + height := p.textureScale(gradient.Size().Height) + + return p.imgToTexture(gradient.Generate(int(width), int(height)), canvas.ImageScaleSmooth) +} + +func (p *painter) newGlRasterTexture(obj fyne.CanvasObject) Texture { + rast := obj.(*canvas.Raster) + + width := p.textureScale(rast.Size().Width) + height := p.textureScale(rast.Size().Height) + + return p.imgToTexture(rast.Generator(int(width), int(height)), rast.ScaleMode) +} + +func (p *painter) newGlTextTexture(obj fyne.CanvasObject) Texture { + text := obj.(*canvas.Text) + color := text.Color + if color == nil { + color = theme.Color(theme.ColorNameForeground) + } + + bounds := text.MinSize() + width := int(math.Ceil(float64(p.textureScale(bounds.Width) + paint.VectorPad(text)))) // potentially italic overspill + height := int(math.Ceil(float64(p.textureScale(bounds.Height)))) + img := image.NewNRGBA(image.Rect(0, 0, width, height)) + + face := paint.CachedFontFace(text.TextStyle, text.FontSource, text) + paint.DrawString(img, text.Text, color, face.Fonts, text.TextSize, p.pixScale, text.TextStyle) + return p.imgToTexture(img, canvas.ImageScaleSmooth) +} + +func (p *painter) newTexture(textureFilter canvas.ImageScale) Texture { + if int(textureFilter) >= len(textureFilterToGL) { + fyne.LogError(fmt.Sprintf("Invalid canvas.ImageScale value (%d), using canvas.ImageScaleSmooth as default value", textureFilter), nil) + textureFilter = canvas.ImageScaleSmooth + } + + texture := p.ctx.CreateTexture() + p.logError() + p.ctx.ActiveTexture(texture0) + p.ctx.BindTexture(texture2D, texture) + p.logError() + p.ctx.TexParameteri(texture2D, textureMinFilter, textureFilterToGL[textureFilter]) + p.ctx.TexParameteri(texture2D, textureMagFilter, textureFilterToGL[textureFilter]) + p.ctx.TexParameteri(texture2D, textureWrapS, clampToEdge) + p.ctx.TexParameteri(texture2D, textureWrapT, clampToEdge) + p.logError() + + return texture +} + +func (p *painter) textureScale(v float32) float32 { + if p.pixScale == 1.0 { + return float32(math.Round(float64(v))) + } + + return float32(math.Round(float64(v * p.pixScale))) +} + +func almostEqual(a, b float64) bool { + return math.Abs(a-b) < floatEqualityThreshold +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/image.go b/vendor/fyne.io/fyne/v2/internal/painter/image.go new file mode 100644 index 0000000..55dbb3a --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/image.go @@ -0,0 +1,68 @@ +package painter + +import ( + "image" + _ "image/jpeg" // avoid users having to import when using image widget + _ "image/png" // avoid the same for PNG images + + "golang.org/x/image/draw" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" +) + +// PaintImage renders a given fyne Image to a Go standard image +// If a fyne.Canvas is given and the image’s fill mode is “fill original” the image’s min size has +// to fit its original size. If it doesn’t, PaintImage does not paint the image but adjusts its min size. +// The image will then be painted on the next frame because of the min size change. +func PaintImage(img *canvas.Image, c fyne.Canvas, width, height int) image.Image { + if img.Size().IsZero() && c == nil { // an image without size or canvas won't get rendered unless we setup + img.Resize(fyne.NewSize(float32(width), float32(height))) + } + dst, err := paintImage(img, width, height) + if err != nil { + fyne.LogError("failed to paint image", err) + } + + return dst +} + +func paintImage(img *canvas.Image, width, height int) (dst image.Image, err error) { + if width <= 0 || height <= 0 { + return dst, err + } + + dst = img.Image + if dst == nil { + dst = image.NewNRGBA(image.Rect(0, 0, width, height)) + } + + size := dst.Bounds().Size() + if width != size.X || height != size.Y { + dst = scaleImage(dst, width, height, img.ScaleMode) + } + return dst, err +} + +func scaleImage(pixels image.Image, scaledW, scaledH int, scale canvas.ImageScale) image.Image { + if scale == canvas.ImageScaleFastest || scale == canvas.ImageScalePixels { + // do not perform software scaling + return pixels + } + + bounds := pixels.Bounds() + pixW := int(fyne.Min(float32(scaledW), float32(bounds.Dx()))) // don't push more pixels than we have to + pixH := int(fyne.Min(float32(scaledH), float32(bounds.Dy()))) // the GL calls will scale this up on GPU. + scaledBounds := image.Rect(0, 0, pixW, pixH) + tex := image.NewNRGBA(scaledBounds) + switch scale { + case canvas.ImageScalePixels: + draw.NearestNeighbor.Scale(tex, scaledBounds, pixels, bounds, draw.Over, nil) + default: + if scale != canvas.ImageScaleSmooth { + fyne.LogError("Invalid canvas.ImageScale value, using canvas.ImageScaleSmooth", nil) + } + draw.CatmullRom.Scale(tex, scaledBounds, pixels, bounds, draw.Over, nil) + } + return tex +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/software/draw.go b/vendor/fyne.io/fyne/v2/internal/painter/software/draw.go new file mode 100644 index 0000000..77b08a8 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/software/draw.go @@ -0,0 +1,376 @@ +package software + +import ( + "fmt" + "image" + "image/color" + "math" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/internal/painter" + "fyne.io/fyne/v2/internal/scale" + "fyne.io/fyne/v2/theme" + + "golang.org/x/image/draw" +) + +type gradient interface { + Generate(int, int) image.Image + Size() fyne.Size +} + +func drawArc(c fyne.Canvas, arc *canvas.Arc, pos fyne.Position, base *image.NRGBA, clip image.Rectangle) { + pad := painter.VectorPad(arc) + scaledWidth := scale.ToScreenCoordinate(c, arc.Size().Width+pad*2) + scaledHeight := scale.ToScreenCoordinate(c, arc.Size().Height+pad*2) + scaledX, scaledY := scale.ToScreenCoordinate(c, pos.X-pad), scale.ToScreenCoordinate(c, pos.Y-pad) + bounds := clip.Intersect(image.Rect(scaledX, scaledY, scaledX+scaledWidth, scaledY+scaledHeight)) + + raw := painter.DrawArc(arc, pad, func(in float32) float32 { + return float32(math.Round(float64(in) * float64(c.Scale()))) + }) + + // the clip intersect above cannot be negative, so we may need to compensate + offX, offY := 0, 0 + if scaledX < 0 { + offX = -scaledX + } + if scaledY < 0 { + offY = -scaledY + } + draw.Draw(base, bounds, raw, image.Point{offX, offY}, draw.Over) +} + +func drawCircle(c fyne.Canvas, circle *canvas.Circle, pos fyne.Position, base *image.NRGBA, clip image.Rectangle) { + pad := painter.VectorPad(circle) + scaledWidth := scale.ToScreenCoordinate(c, circle.Size().Width+pad*2) + scaledHeight := scale.ToScreenCoordinate(c, circle.Size().Height+pad*2) + scaledX, scaledY := scale.ToScreenCoordinate(c, pos.X-pad), scale.ToScreenCoordinate(c, pos.Y-pad) + bounds := clip.Intersect(image.Rect(scaledX, scaledY, scaledX+scaledWidth, scaledY+scaledHeight)) + + raw := painter.DrawCircle(circle, pad, func(in float32) float32 { + return float32(math.Round(float64(in) * float64(c.Scale()))) + }) + + // the clip intersect above cannot be negative, so we may need to compensate + offX, offY := 0, 0 + if scaledX < 0 { + offX = -scaledX + } + if scaledY < 0 { + offY = -scaledY + } + draw.Draw(base, bounds, raw, image.Point{offX, offY}, draw.Over) +} + +func drawGradient(c fyne.Canvas, g gradient, pos fyne.Position, base *image.NRGBA, clip image.Rectangle) { + bounds := g.Size() + width := scale.ToScreenCoordinate(c, bounds.Width) + height := scale.ToScreenCoordinate(c, bounds.Height) + tex := g.Generate(width, height) + drawTex(scale.ToScreenCoordinate(c, pos.X), scale.ToScreenCoordinate(c, pos.Y), width, height, base, tex, clip, 1.0) +} + +func drawImage(c fyne.Canvas, img *canvas.Image, pos fyne.Position, base *image.NRGBA, clip image.Rectangle) { + bounds := img.Size() + if bounds.IsZero() { + return + } + width := scale.ToScreenCoordinate(c, bounds.Width) + height := scale.ToScreenCoordinate(c, bounds.Height) + scaledX, scaledY := scale.ToScreenCoordinate(c, pos.X), scale.ToScreenCoordinate(c, pos.Y) + + origImg := img.Image + if img.FillMode != canvas.ImageFillCover { + origImg = painter.PaintImage(img, c, width, height) + } + + if img.FillMode == canvas.ImageFillContain { + imgAspect := img.Aspect() + objAspect := float32(width) / float32(height) + + if objAspect > imgAspect { + newWidth := int(float32(height) * imgAspect) + scaledX += (width - newWidth) / 2 + width = newWidth + } else if objAspect < imgAspect { + newHeight := int(float32(width) / imgAspect) + scaledY += (height - newHeight) / 2 + height = newHeight + } + } else if img.FillMode == canvas.ImageFillCover { + inner := origImg.Bounds() + imgAspect := img.Aspect() + objAspect := float32(width) / float32(height) + + if objAspect > imgAspect { + newHeight := float32(width) / imgAspect + heightPad := (newHeight - float32(height)) / 2 + pixPad := int((heightPad / newHeight) * float32(inner.Dy())) + + inner = image.Rect(inner.Min.X, inner.Min.Y+pixPad, inner.Max.X, inner.Max.Y-pixPad) + } else if objAspect < imgAspect { + newWidth := float32(height) * imgAspect + widthPad := (newWidth - float32(width)) / 2 + pixPad := int((widthPad / newWidth) * float32(inner.Dx())) + + inner = image.Rect(inner.Min.X+pixPad, inner.Min.Y, inner.Max.X-pixPad, inner.Max.Y) + } + + subImg := image.NewRGBA(inner.Bounds()) + draw.Copy(subImg, inner.Min, origImg, inner, draw.Over, nil) + origImg = subImg + } + + cornerRadius := fyne.Min(painter.GetMaximumRadius(bounds), img.CornerRadius) + drawPixels(scaledX, scaledY, width, height, img.ScaleMode, base, origImg, clip, img.Alpha(), cornerRadius*c.Scale()) +} + +func drawPixels(x, y, width, height int, mode canvas.ImageScale, base *image.NRGBA, origImg image.Image, clip image.Rectangle, alpha float64, radius float32) { + if origImg.Bounds().Dx() == width && origImg.Bounds().Dy() == height && radius < 0.5 { + // do not scale or duplicate image since not needed, draw directly + drawTex(x, y, width, height, base, origImg, clip, alpha) + return + } + + scaledBounds := image.Rect(0, 0, width, height) + scaledImg := image.NewNRGBA(scaledBounds) + switch mode { + case canvas.ImageScalePixels: + draw.NearestNeighbor.Scale(scaledImg, scaledBounds, origImg, origImg.Bounds(), draw.Over, nil) + case canvas.ImageScaleFastest: + draw.ApproxBiLinear.Scale(scaledImg, scaledBounds, origImg, origImg.Bounds(), draw.Over, nil) + default: + if mode != canvas.ImageScaleSmooth { + fyne.LogError(fmt.Sprintf("Invalid canvas.ImageScale value (%d), using canvas.ImageScaleSmooth as default value", mode), nil) + } + draw.CatmullRom.Scale(scaledImg, scaledBounds, origImg, origImg.Bounds(), draw.Over, nil) + } + + if radius > 0.5 { + applyRoundedCorners(scaledImg, width, height, radius) + } + + drawTex(x, y, width, height, base, scaledImg, clip, alpha) +} + +func drawLine(c fyne.Canvas, line *canvas.Line, pos fyne.Position, base *image.NRGBA, clip image.Rectangle) { + pad := painter.VectorPad(line) + scaledWidth := scale.ToScreenCoordinate(c, line.Size().Width+pad*2) + scaledHeight := scale.ToScreenCoordinate(c, line.Size().Height+pad*2) + scaledX, scaledY := scale.ToScreenCoordinate(c, pos.X-pad), scale.ToScreenCoordinate(c, pos.Y-pad) + bounds := clip.Intersect(image.Rect(scaledX, scaledY, scaledX+scaledWidth, scaledY+scaledHeight)) + + raw := painter.DrawLine(line, pad, func(in float32) float32 { + return float32(math.Round(float64(in) * float64(c.Scale()))) + }) + + // the clip intersect above cannot be negative, so we may need to compensate + offX, offY := 0, 0 + if scaledX < 0 { + offX = -scaledX + } + if scaledY < 0 { + offY = -scaledY + } + draw.Draw(base, bounds, raw, image.Point{offX, offY}, draw.Over) +} + +func drawTex(x, y, width, height int, base *image.NRGBA, tex image.Image, clip image.Rectangle, alpha float64) { + outBounds := image.Rect(x, y, x+width, y+height) + clippedBounds := clip.Intersect(outBounds) + srcPt := image.Point{X: clippedBounds.Min.X - outBounds.Min.X, Y: clippedBounds.Min.Y - outBounds.Min.Y} + if alpha == 1.0 { + draw.Draw(base, clippedBounds, tex, srcPt, draw.Over) + } else { + mask := &image.Uniform{C: color.NRGBA{R: 0xff, G: 0xff, B: 0xff, A: uint8(float64(0xff) * alpha)}} + draw.DrawMask(base, clippedBounds, tex, srcPt, mask, srcPt, draw.Over) + } +} + +func drawText(c fyne.Canvas, text *canvas.Text, pos fyne.Position, base *image.NRGBA, clip image.Rectangle) { + bounds := text.MinSize() + width := scale.ToScreenCoordinate(c, bounds.Width+painter.VectorPad(text)) + height := scale.ToScreenCoordinate(c, bounds.Height) + txtImg := image.NewRGBA(image.Rect(0, 0, width, height)) + + color := text.Color + if color == nil { + color = theme.Color(theme.ColorNameForeground) + } + + face := painter.CachedFontFace(text.TextStyle, text.FontSource, text) + painter.DrawString(txtImg, text.Text, color, face.Fonts, text.TextSize, c.Scale(), text.TextStyle) + + size := text.Size() + offsetX := float32(0) + offsetY := float32(0) + switch text.Alignment { + case fyne.TextAlignTrailing: + offsetX = size.Width - bounds.Width + case fyne.TextAlignCenter: + offsetX = (size.Width - bounds.Width) / 2 + } + if size.Height > bounds.Height { + offsetY = (size.Height - bounds.Height) / 2 + } + scaledX := scale.ToScreenCoordinate(c, pos.X+offsetX) + scaledY := scale.ToScreenCoordinate(c, pos.Y+offsetY) + imgBounds := image.Rect(scaledX, scaledY, scaledX+width, scaledY+height) + clippedBounds := clip.Intersect(imgBounds) + srcPt := image.Point{X: clippedBounds.Min.X - imgBounds.Min.X, Y: clippedBounds.Min.Y - imgBounds.Min.Y} + draw.Draw(base, clippedBounds, txtImg, srcPt, draw.Over) +} + +func drawRaster(c fyne.Canvas, rast *canvas.Raster, pos fyne.Position, base *image.NRGBA, clip image.Rectangle) { + bounds := rast.Size() + if bounds.IsZero() { + return + } + width := scale.ToScreenCoordinate(c, bounds.Width) + height := scale.ToScreenCoordinate(c, bounds.Height) + scaledX, scaledY := scale.ToScreenCoordinate(c, pos.X), scale.ToScreenCoordinate(c, pos.Y) + + pix := rast.Generator(width, height) + if pix.Bounds().Bounds().Dx() != width || pix.Bounds().Dy() != height { + drawPixels(scaledX, scaledY, width, height, rast.ScaleMode, base, pix, clip, 1.0, 0.0) + } else { + drawTex(scaledX, scaledY, width, height, base, pix, clip, 1.0) + } +} + +func drawOblongStroke(c fyne.Canvas, obj fyne.CanvasObject, width, height float32, pos fyne.Position, base *image.NRGBA, clip image.Rectangle) { + pad := painter.VectorPad(obj) + scaledWidth := scale.ToScreenCoordinate(c, width+pad*2) + scaledHeight := scale.ToScreenCoordinate(c, height+pad*2) + scaledX, scaledY := scale.ToScreenCoordinate(c, pos.X-pad), scale.ToScreenCoordinate(c, pos.Y-pad) + bounds := clip.Intersect(image.Rect(scaledX, scaledY, scaledX+scaledWidth, scaledY+scaledHeight)) + + raw := painter.DrawRectangle(obj.(*canvas.Rectangle), width, height, pad, func(in float32) float32 { + return float32(math.Round(float64(in) * float64(c.Scale()))) + }) + + // the clip intersect above cannot be negative, so we may need to compensate + offX, offY := 0, 0 + if scaledX < 0 { + offX = -scaledX + } + if scaledY < 0 { + offY = -scaledY + } + draw.Draw(base, bounds, raw, image.Point{offX, offY}, draw.Over) +} + +func drawPolygon(c fyne.Canvas, polygon *canvas.Polygon, pos fyne.Position, base *image.NRGBA, clip image.Rectangle) { + pad := painter.VectorPad(polygon) + scaledWidth := scale.ToScreenCoordinate(c, polygon.Size().Width+pad*2) + scaledHeight := scale.ToScreenCoordinate(c, polygon.Size().Height+pad*2) + scaledX, scaledY := scale.ToScreenCoordinate(c, pos.X-pad), scale.ToScreenCoordinate(c, pos.Y-pad) + bounds := clip.Intersect(image.Rect(scaledX, scaledY, scaledX+scaledWidth, scaledY+scaledHeight)) + + raw := painter.DrawPolygon(polygon, pad, func(in float32) float32 { + return float32(math.Round(float64(in) * float64(c.Scale()))) + }) + + // the clip intersect above cannot be negative, so we may need to compensate + offX, offY := 0, 0 + if scaledX < 0 { + offX = -scaledX + } + if scaledY < 0 { + offY = -scaledY + } + draw.Draw(base, bounds, raw, image.Point{offX, offY}, draw.Over) +} + +func drawRectangle(c fyne.Canvas, rect *canvas.Rectangle, pos fyne.Position, base *image.NRGBA, clip image.Rectangle) { + topRightRadius := painter.GetCornerRadius(rect.TopRightCornerRadius, rect.CornerRadius) + topLeftRadius := painter.GetCornerRadius(rect.TopLeftCornerRadius, rect.CornerRadius) + bottomRightRadius := painter.GetCornerRadius(rect.BottomRightCornerRadius, rect.CornerRadius) + bottomLeftRadius := painter.GetCornerRadius(rect.BottomLeftCornerRadius, rect.CornerRadius) + drawOblong(c, rect, rect.FillColor, rect.StrokeColor, rect.StrokeWidth, topRightRadius, topLeftRadius, bottomRightRadius, bottomLeftRadius, rect.Aspect, pos, base, clip) +} + +func drawOblong(c fyne.Canvas, obj fyne.CanvasObject, fill, stroke color.Color, strokeWidth, topRightRadius, topLeftRadius, bottomRightRadius, bottomLeftRadius, aspect float32, pos fyne.Position, base *image.NRGBA, clip image.Rectangle) { + width, height := obj.Size().Components() + if aspect != 0 { + frameAspect := width / height + + xPad, yPad := float32(0), float32(0) + if frameAspect > aspect { + newWidth := height * aspect + xPad = (width - newWidth) / 2 + width = newWidth + } else if frameAspect < aspect { + newHeight := width / aspect + yPad = (height - newHeight) / 2 + height = newHeight + } + + pos = pos.AddXY(xPad, yPad) + } + + if (stroke != nil && strokeWidth > 0) || topRightRadius != 0 || topLeftRadius != 0 || bottomRightRadius != 0 || bottomLeftRadius != 0 { // use a rasterizer if there is a stroke or radius + drawOblongStroke(c, obj, width, height, pos, base, clip) + return + } + + scaledWidth := scale.ToScreenCoordinate(c, width) + scaledHeight := scale.ToScreenCoordinate(c, height) + scaledX, scaledY := scale.ToScreenCoordinate(c, pos.X), scale.ToScreenCoordinate(c, pos.Y) + bounds := clip.Intersect(image.Rect(scaledX, scaledY, scaledX+scaledWidth, scaledY+scaledHeight)) + draw.Draw(base, bounds, image.NewUniform(fill), image.Point{}, draw.Over) +} + +// applyRoundedCorners rounds the corners of the image in-place +func applyRoundedCorners(img *image.NRGBA, w, h int, radius float32) { + rInt := int(math.Ceil(float64(radius))) + + aaWidth := float32(0.5) + outerR2 := (radius + aaWidth) * (radius + aaWidth) + innerR2 := (radius - aaWidth) * (radius - aaWidth) + + applyCorner := func(startX, endX, startY, endY int, cx, cy float32) { + for y := startY; y < endY; y++ { + for x := startX; x < endX; x++ { + dx := float32(x) - cx + dy := float32(y) - cy + dist2 := dx*dx + dy*dy + + i := img.PixOffset(x, y) + alpha := img.Pix[i+3] + + switch { + case dist2 >= outerR2: + img.Pix[i+3] = 0 // Fully transparent + case dist2 > innerR2: + // Linear falloff based on squared distance + t := (outerR2 - dist2) / (outerR2 - innerR2) // t ranges from 0 to 1 + newAlpha := uint8(float32(alpha) * t) + img.Pix[i+3] = newAlpha + } + } + } + } + + // Top-left + r := minInt(rInt, minInt(w, h)) + applyCorner(0, r, 0, r, radius, radius) + + // Top-right + applyCorner(w-r, w, 0, r, float32(w)-radius, radius) + + // Bottom-left + applyCorner(0, r, h-r, h, radius, float32(h)-radius) + + // Bottom-right + applyCorner(w-r, w, h-r, h, float32(w)-radius, float32(h)-radius) +} + +func minInt(x, y int) int { + if x < y { + return x + } + return y +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/software/painter.go b/vendor/fyne.io/fyne/v2/internal/painter/software/painter.go new file mode 100644 index 0000000..c75e712 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/software/painter.go @@ -0,0 +1,66 @@ +package software + +import ( + "image" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/internal/driver" + "fyne.io/fyne/v2/internal/scale" +) + +// Painter is a simple software painter that can paint a canvas in memory. +type Painter struct{} + +// NewPainter creates a new Painter. +func NewPainter() *Painter { + return &Painter{} +} + +// Paint is the main entry point for a simple software painter. +// The canvas to be drawn is passed in as a parameter and the return is an +// image containing the result of rendering. +func (*Painter) Paint(c fyne.Canvas) image.Image { + bounds := image.Rect(0, 0, scale.ToScreenCoordinate(c, c.Size().Width), scale.ToScreenCoordinate(c, c.Size().Height)) + base := image.NewNRGBA(bounds) + + paint := func(obj fyne.CanvasObject, pos, clipPos fyne.Position, clipSize fyne.Size) bool { + w := fyne.Min(clipPos.X+clipSize.Width, c.Size().Width) + h := fyne.Min(clipPos.Y+clipSize.Height, c.Size().Height) + clip := image.Rect( + scale.ToScreenCoordinate(c, clipPos.X), + scale.ToScreenCoordinate(c, clipPos.Y), + scale.ToScreenCoordinate(c, w), + scale.ToScreenCoordinate(c, h), + ) + switch o := obj.(type) { + case *canvas.Image: + drawImage(c, o, pos, base, clip) + case *canvas.Text: + drawText(c, o, pos, base, clip) + case gradient: + drawGradient(c, o, pos, base, clip) + case *canvas.Circle: + drawCircle(c, o, pos, base, clip) + case *canvas.Line: + drawLine(c, o, pos, base, clip) + case *canvas.Polygon: + drawPolygon(c, o, pos, base, clip) + case *canvas.Raster: + drawRaster(c, o, pos, base, clip) + case *canvas.Rectangle: + drawRectangle(c, o, pos, base, clip) + case *canvas.Arc: + drawArc(c, o, pos, base, clip) + } + + return false + } + + driver.WalkVisibleObjectTree(c.Content(), paint, nil) + for _, o := range c.Overlays().List() { + driver.WalkVisibleObjectTree(o, paint, nil) + } + + return base +} diff --git a/vendor/fyne.io/fyne/v2/internal/painter/vector.go b/vendor/fyne.io/fyne/v2/internal/painter/vector.go new file mode 100644 index 0000000..92f0b32 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/painter/vector.go @@ -0,0 +1,41 @@ +package painter + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" +) + +// VectorPad returns the number of additional points that should be added around a texture. +// This is to accommodate overflow caused by stroke and line endings etc. +// THe result is in fyne.Size type coordinates and should be scaled for output. +func VectorPad(obj fyne.CanvasObject) float32 { + switch co := obj.(type) { + case *canvas.Circle: + if co.StrokeWidth > 0 && co.StrokeColor != nil { + return co.StrokeWidth + 2 + } + return 1 // anti-alias on circle fill + case *canvas.Line: + if co.StrokeWidth > 0 { + return co.StrokeWidth + 2 + } + case *canvas.Polygon: + if co.StrokeWidth > 0 && co.StrokeColor != nil { + return co.StrokeWidth + 2 + } + case *canvas.Rectangle: + if co.StrokeWidth > 0 && co.StrokeColor != nil { + return co.StrokeWidth + 2 + } + case *canvas.Text: + if co.TextStyle.Italic { + return co.TextSize / 5 // make sure that even a 20% lean does not overflow + } + case *canvas.Arc: + if co.StrokeWidth > 0 && co.StrokeColor != nil { + return co.StrokeWidth + 2 + } + } + + return 0 +} diff --git a/vendor/fyne.io/fyne/v2/internal/preferences.go b/vendor/fyne.io/fyne/v2/internal/preferences.go new file mode 100644 index 0000000..4e76239 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/preferences.go @@ -0,0 +1,316 @@ +package internal + +import ( + "reflect" + "sync" + + "fyne.io/fyne/v2" +) + +// InMemoryPreferences provides an implementation of the fyne.Preferences API that is stored in memory. +type InMemoryPreferences struct { + values map[string]any + lock sync.RWMutex + changeListeners []func() +} + +// Declare conformity with Preferences interface +var _ fyne.Preferences = (*InMemoryPreferences)(nil) + +// AddChangeListener allows code to be notified when some preferences change. This will fire on any update. +// The passed 'listener' should not try to write values. +func (p *InMemoryPreferences) AddChangeListener(listener func()) { + p.lock.Lock() + defer p.lock.Unlock() + + p.changeListeners = append(p.changeListeners, listener) +} + +// Bool looks up a boolean value for the key +func (p *InMemoryPreferences) Bool(key string) bool { + return p.BoolWithFallback(key, false) +} + +func (p *InMemoryPreferences) BoolList(key string) []bool { + return p.BoolListWithFallback(key, []bool{}) +} + +func (p *InMemoryPreferences) BoolListWithFallback(key string, fallback []bool) []bool { + value, ok := p.get(key) + if !ok { + return fallback + } + valb, ok := value.([]bool) + if !ok { + return fallback + } + return valb +} + +// BoolWithFallback looks up a boolean value and returns the given fallback if not found +func (p *InMemoryPreferences) BoolWithFallback(key string, fallback bool) bool { + value, ok := p.get(key) + if !ok { + return fallback + } + valb, ok := value.(bool) + if !ok { + return fallback + } + return valb +} + +// ChangeListeners returns the list of listeners registered for this set of preferences. +func (p *InMemoryPreferences) ChangeListeners() []func() { + return p.changeListeners +} + +// Float looks up a float64 value for the key +func (p *InMemoryPreferences) Float(key string) float64 { + return p.FloatWithFallback(key, 0.0) +} + +func (p *InMemoryPreferences) FloatList(key string) []float64 { + return p.FloatListWithFallback(key, []float64{}) +} + +func (p *InMemoryPreferences) FloatListWithFallback(key string, fallback []float64) []float64 { + value, ok := p.get(key) + if !ok { + return fallback + } + valf, ok := value.([]float64) + if ok { + return valf + } + vali, ok := value.([]int) + if ok { + flts := make([]float64, len(vali)) + for i, f := range vali { + flts[i] = float64(f) + } + return flts + } + return fallback +} + +// FloatWithFallback looks up a float64 value and returns the given fallback if not found +func (p *InMemoryPreferences) FloatWithFallback(key string, fallback float64) float64 { + value, ok := p.get(key) + if !ok { + return fallback + } + valf, ok := value.(float64) + if ok { + return valf + } + vali, ok := value.(int) + if ok { + return float64(vali) + } + return fallback +} + +// Int looks up an integer value for the key +func (p *InMemoryPreferences) Int(key string) int { + return p.IntWithFallback(key, 0) +} + +func (p *InMemoryPreferences) IntList(key string) []int { + return p.IntListWithFallback(key, []int{}) +} + +func (p *InMemoryPreferences) IntListWithFallback(key string, fallback []int) []int { + value, ok := p.get(key) + if !ok { + return fallback + } + vali, ok := value.([]int) + if ok { + return vali + } + // integers can be de-serialised as floats, so support both + valf, ok := value.([]float64) + if ok { + ints := make([]int, len(valf)) + for i, f := range valf { + ints[i] = int(f) + } + return ints + } + return fallback +} + +// IntWithFallback looks up an integer value and returns the given fallback if not found +func (p *InMemoryPreferences) IntWithFallback(key string, fallback int) int { + value, ok := p.get(key) + if !ok { + return fallback + } + vali, ok := value.(int) + if ok { + return vali + } + // integers can be de-serialised as floats, so support both + valf, ok := value.(float64) + if !ok { + return fallback + } + return int(valf) +} + +// ReadValues provides read access to the underlying value map - for internal use only... +// You should not retain a reference to the map nor write to the values in the callback function +func (p *InMemoryPreferences) ReadValues(fn func(map[string]any)) { + p.lock.RLock() + fn(p.values) + p.lock.RUnlock() +} + +// RemoveValue deletes a value on the given key +func (p *InMemoryPreferences) RemoveValue(key string) { + p.remove(key) +} + +// SetBool saves a boolean value for the given key +func (p *InMemoryPreferences) SetBool(key string, value bool) { + p.set(key, value) +} + +func (p *InMemoryPreferences) SetBoolList(key string, value []bool) { + p.set(key, value) +} + +// SetFloat saves a float64 value for the given key +func (p *InMemoryPreferences) SetFloat(key string, value float64) { + p.set(key, value) +} + +func (p *InMemoryPreferences) SetFloatList(key string, value []float64) { + p.set(key, value) +} + +// SetInt saves an integer value for the given key +func (p *InMemoryPreferences) SetInt(key string, value int) { + p.set(key, value) +} + +func (p *InMemoryPreferences) SetIntList(key string, value []int) { + p.set(key, value) +} + +// SetString saves a string value for the given key +func (p *InMemoryPreferences) SetString(key string, value string) { + p.set(key, value) +} + +func (p *InMemoryPreferences) SetStringList(key string, value []string) { + p.set(key, value) +} + +// String looks up a string value for the key +func (p *InMemoryPreferences) String(key string) string { + return p.StringWithFallback(key, "") +} + +func (p *InMemoryPreferences) StringList(key string) []string { + return p.StringListWithFallback(key, []string{}) +} + +func (p *InMemoryPreferences) StringListWithFallback(key string, fallback []string) []string { + value, ok := p.get(key) + if !ok { + return fallback + } + vals, ok := value.([]string) + if !ok { + return fallback + } + return vals +} + +// StringWithFallback looks up a string value and returns the given fallback if not found +func (p *InMemoryPreferences) StringWithFallback(key, fallback string) string { + value, ok := p.get(key) + if !ok { + return fallback + } + vals, ok := value.(string) + if !ok { + return fallback + } + return vals +} + +// WriteValues provides write access to the underlying value map - for internal use only... +// You should not retain a reference to the map passed to the callback function +func (p *InMemoryPreferences) WriteValues(fn func(map[string]any)) { + p.lock.Lock() + fn(p.values) + p.lock.Unlock() + + p.fireChange() +} + +// NewInMemoryPreferences creates a new preferences implementation stored in memory +func NewInMemoryPreferences() *InMemoryPreferences { + return &InMemoryPreferences{values: make(map[string]any)} +} + +func (p *InMemoryPreferences) fireChange() { + p.lock.RLock() + listeners := p.changeListeners + p.lock.RUnlock() + + for _, l := range listeners { + l() + } +} + +func (p *InMemoryPreferences) get(key string) (any, bool) { + p.lock.RLock() + defer p.lock.RUnlock() + + v, err := p.values[key] + return v, err +} + +func (p *InMemoryPreferences) remove(key string) { + p.lock.Lock() + delete(p.values, key) + p.lock.Unlock() + + p.fireChange() +} + +func (p *InMemoryPreferences) set(key string, value any) { + p.lock.Lock() + + if reflect.TypeOf(value).Kind() == reflect.Slice { + s := reflect.ValueOf(value) + old := reflect.ValueOf(p.values[key]) + if p.values[key] != nil && s.Len() == old.Len() { + changed := false + for i := 0; i < s.Len(); i++ { + if s.Index(i).Interface() != old.Index(i).Interface() { + changed = true + break + } + } + if !changed { + p.lock.Unlock() + return + } + } + } else { + if stored, ok := p.values[key]; ok && stored == value { + p.lock.Unlock() + return + } + } + + p.values[key] = value + p.lock.Unlock() + + p.fireChange() +} diff --git a/vendor/fyne.io/fyne/v2/internal/repository/file.go b/vendor/fyne.io/fyne/v2/internal/repository/file.go new file mode 100644 index 0000000..02944c9 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/repository/file.go @@ -0,0 +1,338 @@ +package repository + +import ( + "io" + "io/fs" + "os" + "path" + "path/filepath" + "runtime" + "strings" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/storage" + "fyne.io/fyne/v2/storage/repository" +) + +// declare conformance with repository types +var ( + _ repository.Repository = (*FileRepository)(nil) + _ repository.WritableRepository = (*FileRepository)(nil) + _ repository.DeleteAllRepository = (*FileRepository)(nil) + _ repository.AppendableRepository = (*FileRepository)(nil) + _ repository.HierarchicalRepository = (*FileRepository)(nil) + _ repository.ListableRepository = (*FileRepository)(nil) + _ repository.MovableRepository = (*FileRepository)(nil) + _ repository.CopyableRepository = (*FileRepository)(nil) +) + +var ( + _ fyne.URIReadCloser = (*file)(nil) + _ fyne.URIWriteCloser = (*file)(nil) +) + +type file struct { + *os.File + uri fyne.URI +} + +func (f *file) URI() fyne.URI { + return f.uri +} + +// FileRepository implements a simple wrapper around Go's filesystem +// interface libraries. It should be registered by the driver on platforms +// where it is appropriate to do so. +// +// This repository is suitable to handle the file:// scheme. +// +// Since: 2.0 +type FileRepository struct{} + +// NewFileRepository creates a new FileRepository instance. +// The caller needs to call repository.Register() with the result of this function. +// +// Since: 2.0 +func NewFileRepository() *FileRepository { + return &FileRepository{} +} + +// Exists checks if the given URI exists. +// +// Since: 2.0 +func (r *FileRepository) Exists(u fyne.URI) (bool, error) { + p := u.Path() + _, err := os.Stat(p) + if err == nil { + return true, nil + } else if os.IsNotExist(err) { + return false, nil + } + + return false, err +} + +// Reader returns a reader for the given URI. +// +// Since: 2.0 +func (r *FileRepository) Reader(u fyne.URI) (fyne.URIReadCloser, error) { + return openFile(u, false, false) +} + +// CanRead checks if the given URI can be read. +// +// Since: 2.0 +func (r *FileRepository) CanRead(u fyne.URI) (bool, error) { + f, err := os.OpenFile(u.Path(), os.O_RDONLY, 0o666) + if err != nil { + if os.IsPermission(err) || os.IsNotExist(err) { + return false, nil + } + + return false, err + } + + return true, f.Close() +} + +// Destroy tears down the repository for the specified scheme. +func (r *FileRepository) Destroy(scheme string) { + // do nothing +} + +// Writer returns a truncating writer for the given URI. +// +// Since: 2.0 +func (r *FileRepository) Writer(u fyne.URI) (fyne.URIWriteCloser, error) { + return openFile(u, true, true) +} + +// Appender returns a writer that appends to the given URI. +// +// Since: 2.6 +func (r *FileRepository) Appender(u fyne.URI) (fyne.URIWriteCloser, error) { + return openFile(u, true, false) +} + +// CanWrite checks if the given URI can be written. +// +// Since: 2.0 +func (r *FileRepository) CanWrite(u fyne.URI) (bool, error) { + f, err := os.OpenFile(u.Path(), os.O_WRONLY, 0o666) + if err != nil { + if os.IsPermission(err) { + return false, nil + } + + if os.IsNotExist(err) { + // We may need to do extra logic to check if the + // directory is writable, but presumably the + // IsPermission check covers this. + return true, nil + } + + return false, err + } + + return true, f.Close() +} + +// Delete deletes the given URI. +// +// Since: 2.0 +func (r *FileRepository) Delete(u fyne.URI) error { + return os.Remove(u.Path()) +} + +// DeleteAll deletes the given URI and all its children. +// +// Since: 2.7 +func (r *FileRepository) DeleteAll(u fyne.URI) error { + return os.RemoveAll(u.Path()) +} + +// Parent returns the parent URI of the given URI. +// +// Since: 2.0 +func (r *FileRepository) Parent(u fyne.URI) (fyne.URI, error) { + child := path.Clean(u.Path()) + if child == "." || // Clean ending up empty returns ".". + strings.HasSuffix(child, "/") || // Only root has trailing slash. + runtime.GOOS == "windows" && len(child) == 2 && child[1] == ':' { + return nil, repository.ErrURIRoot + } + + parent := path.Dir(child) + if parent == "/" { + return storage.NewFileURI("/"), nil + } + + return storage.NewFileURI(parent + "/"), nil +} + +// Child creates a child URI from the given URI and component. +// +// Since: 2.0 +func (r *FileRepository) Child(u fyne.URI, component string) (fyne.URI, error) { + return storage.NewFileURI(path.Join(u.Path(), component)), nil +} + +// List returns a list of all child URIs of the given URI. +// +// Since: 2.0 +func (r *FileRepository) List(u fyne.URI) ([]fyne.URI, error) { + p := u.Path() + files, err := os.ReadDir(p) + if err != nil { + return nil, err + } + + urilist := make([]fyne.URI, len(files)) + for i, f := range files { + urilist[i] = storage.NewFileURI(path.Join(p, f.Name())) + } + + return urilist, nil +} + +// CreateListable creates a new directory at the given URI. +func (r *FileRepository) CreateListable(u fyne.URI) error { + path := u.Path() + return os.Mkdir(path, 0o755) +} + +// CanList checks if the given URI can be listed. +// +// Since: 2.0 +func (r *FileRepository) CanList(u fyne.URI) (bool, error) { + p := u.Path() + info, err := os.Stat(p) + if err != nil { + if os.IsNotExist(err) { + return false, nil + } + return false, err + } + + if !info.IsDir() { + return false, nil + } + + if runtime.GOOS == "windows" && len(p) <= 3 { + return true, nil // assume drives can be read, avoids hang if the drive is temporarily unresponsive + } + + // We know it is a directory, but we don't know if we can read it, so + // we'll just try to do so and see if we get a permission error. + f, err := os.Open(p) + if err == nil { + _, err = f.Readdir(1) + f.Close() + } + + if err != nil && err != io.EOF { + return false, err + } + + if os.IsPermission(err) { + return false, nil + } + + // it is a directory, and checking the permissions did not error out + return true, nil +} + +// Copy copies the contents of the source URI to the destination URI. +// +// Since: 2.0 +func (r *FileRepository) Copy(source, destination fyne.URI) error { + err := fastCopy(destination.Path(), source.Path()) + if err == nil { + return nil + } + + return repository.GenericCopy(source, destination) +} + +// Move moves the contents of the source URI to the destination URI. +// +// Since: 2.0 +func (r *FileRepository) Move(source, destination fyne.URI) error { + err := os.Rename(source.Path(), destination.Path()) + if err == nil { + return nil + } + + return repository.GenericMove(source, destination) +} + +func copyFile(dst, src string) error { + srcFile, err := os.Open(src) + if err != nil { + return err + } + defer srcFile.Close() + + dstFile, err := os.Create(dst) + if err != nil { + return err + } + defer dstFile.Close() + + _, err = io.Copy(dstFile, srcFile) + return err +} + +func fastCopy(dst, src string) error { + srcInfo, err := os.Stat(src) + if err != nil { + return err + } + + if !srcInfo.IsDir() { + return copyFile(dst, src) + } + + err = os.MkdirAll(dst, srcInfo.Mode()) + if err != nil { + return err + } + + return filepath.WalkDir(src, func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + + rel, err := filepath.Rel(src, path) + if err != nil { + return err + } + + dstPath := filepath.Join(dst, rel) + if d.IsDir() { + info, err := d.Info() + if err != nil { + return err + } + return os.MkdirAll(dstPath, info.Mode()) + } + + return copyFile(dstPath, path) + }) +} + +func openFile(uri fyne.URI, write bool, truncate bool) (*file, error) { + path := uri.Path() + var f *os.File + var err error + if write { + if truncate { + f, err = os.Create(path) // If it exists this will truncate which is what we wanted + } else { + f, err = os.OpenFile(path, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o666) + } + } else { + f, err = os.Open(path) + } + return &file{File: f, uri: uri}, err +} diff --git a/vendor/fyne.io/fyne/v2/internal/repository/http.go b/vendor/fyne.io/fyne/v2/internal/repository/http.go new file mode 100644 index 0000000..fb8fd5a --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/repository/http.go @@ -0,0 +1,99 @@ +package repository + +import ( + "errors" + "net/http" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/storage/repository" +) + +var _ repository.Repository = (*HTTPRepository)(nil) + +type remoteFile struct { + *http.Response + uri fyne.URI +} + +func (f *remoteFile) Close() error { + if f.Response == nil { + return nil + } + return f.Response.Body.Close() +} + +func (f *remoteFile) Read(p []byte) (int, error) { + if f.Response == nil { + return 0, nil + } + return f.Response.Body.Read(p) +} + +func (f *remoteFile) URI() fyne.URI { + return f.uri +} + +// HTTPRepository implements a proxy for interacting with remote resources +// using golang's net/http library. +// +// This repository is suitable to handle the http:// and https:// scheme. +// +// Since: 2.1 +type HTTPRepository struct{} + +// NewHTTPRepository creates a new HTTPRepository instance. +// The caller needs to call repository.Register() with the result of this function. +// +// Since: 2.1 +func NewHTTPRepository() *HTTPRepository { + return &HTTPRepository{} +} + +// Exists checks whether the resource at u returns a +// non "404 NOT FOUND" response header. +// +// Since: 2.1 +func (r *HTTPRepository) Exists(u fyne.URI) (bool, error) { + resp, err := http.Head(u.String()) + if err != nil { + return false, err + } + if resp.StatusCode == http.StatusNotFound { + return false, nil + } + + return true, nil +} + +// Reader provides a interface for reading the body of the response received +// from the request to u. +// +// Since: 2.1 +func (r *HTTPRepository) Reader(u fyne.URI) (fyne.URIReadCloser, error) { + resp, err := http.Get(u.String()) + return &remoteFile{Response: resp, uri: u}, err +} + +// CanRead makes a HEAD HTTP request to analyse the headers received +// from the remote server. +// Any response status code apart from 2xx is considered to be invalid. +// +// Since: 2.1 +func (r *HTTPRepository) CanRead(u fyne.URI) (bool, error) { + resp, err := http.Head(u.String()) + if err != nil { + return false, err + } + if resp.StatusCode < http.StatusOK || resp.StatusCode > http.StatusIMUsed { + return false, errors.New("remote server did not return a successful response") + } + + return true, nil +} + +// Destroy satisfies the repository.Repository interface. +// +// Since: 2.1 +func (r *HTTPRepository) Destroy(string) { + // do nothing +} diff --git a/vendor/fyne.io/fyne/v2/internal/repository/indexdb_file_wasm.go b/vendor/fyne.io/fyne/v2/internal/repository/indexdb_file_wasm.go new file mode 100644 index 0000000..bd95212 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/repository/indexdb_file_wasm.go @@ -0,0 +1,175 @@ +//go:build wasm + +package repository + +import ( + "context" + "fmt" + "io" + "syscall/js" + "time" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/storage" + + "github.com/hack-pad/go-indexeddb/idb" +) + +var ( + blob js.Value + uint8Array js.Value +) + +func init() { + blob = js.Global().Get("Blob") + uint8Array = js.Global().Get("Uint8Array") +} + +var ( + _ fyne.URIReadCloser = (*idbfile)(nil) + _ fyne.URIWriteCloser = (*idbfile)(nil) +) + +type idbfile struct { + db *idb.Database + path string + parent string + isDir bool + truncate bool + isTruncated bool + parts []any + add bool + isAdding bool +} + +func (f *idbfile) Close() error { + return nil +} + +func (f *idbfile) URI() fyne.URI { + u, _ := storage.ParseURI(idbfileSchemePrefix + f.path) + return u +} + +func (f *idbfile) rwstore(name string) (*idb.ObjectStore, error) { + txn, err := f.db.Transaction(idb.TransactionReadWrite, name) + if err != nil { + return nil, err + } + store, err := txn.ObjectStore(name) + if err != nil { + return nil, err + } + return store, nil +} + +func (f *idbfile) Write(data []byte) (int, error) { + p := f.path + ctx := context.Background() + + m := map[string]any{ + "parent": f.parent, + "size": 0, + "ctime": 0, + "mtime": 0, + } + + if f.truncate && !f.isTruncated { + store, err := f.rwstore("data") + if err != nil { + return 0, err + } + delreq, err := store.Delete(js.ValueOf(p)) + if err != nil { + return 0, err + } + if err := delreq.Await(ctx); err != nil { + return 0, err + } + f.isTruncated = true + + m["ctime"] = time.Now().UnixMilli() + m["mtime"] = m["ctime"] + } + + if f.add && !f.isAdding { + b, err := get(f.db, "data", f.path) + if err != nil { + return 0, err + } + + f.parts = []any{getBytes(b)} + f.isAdding = true + + meta, err := get(f.db, "meta", f.path) + if err != nil { + return 0, err + } + + m["ctime"] = meta.Get("ctime").Int() + m["mtime"] = time.Now().UnixMilli() + } + + a := uint8Array.New(len(data)) + n := js.CopyBytesToJS(a, data) + f.parts = append(f.parts, a) + b := blob.New(js.ValueOf(f.parts)) + + m["size"] = b.Get("size").Int() + + metastore, err := f.rwstore("meta") + if err != nil { + return 0, err + } + + metareq, err := metastore.PutKey(js.ValueOf(p), js.ValueOf(m)) + if err != nil { + return 0, err + } + + store, err := f.rwstore("data") + if err != nil { + return 0, err + } + req, err := store.PutKey(js.ValueOf(p), b) + if err != nil { + return 0, err + } + + if _, err := metareq.Await(ctx); err != nil { + return 0, err + } + + _, err = req.Await(ctx) + return n, err +} + +func getBytes(b js.Value) js.Value { + outch := make(chan js.Value) + send := js.FuncOf(func(this js.Value, args []js.Value) any { + outch <- args[0] + return nil + }) + defer send.Release() + + b.Call("arrayBuffer").Call("then", send) + buf := <-outch + return uint8Array.New(buf) +} + +func (f *idbfile) Read(data []byte) (int, error) { + b, err := get(f.db, "data", f.path) + if err != nil { + return 0, err + } + + if b.IsUndefined() { + return 0, fmt.Errorf("idbfile undefined") + } + + if !b.InstanceOf(blob) { + return 0, fmt.Errorf("returned object not of type blob") + } + + return js.CopyBytesToGo(data, getBytes(b)), io.EOF +} diff --git a/vendor/fyne.io/fyne/v2/internal/repository/indexdb_wasm.go b/vendor/fyne.io/fyne/v2/internal/repository/indexdb_wasm.go new file mode 100644 index 0000000..3773c0b --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/repository/indexdb_wasm.go @@ -0,0 +1,339 @@ +//go:build wasm + +package repository + +import ( + "context" + "syscall/js" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/storage" + "fyne.io/fyne/v2/storage/repository" + + "github.com/hack-pad/go-indexeddb/idb" +) + +// fileSchemePrefix is used for when we need a hard-coded version of "idbfile://" +// for string processing +const idbfileSchemePrefix string = "idbfile://" + +var ( + _ repository.Repository = (*IndexDBRepository)(nil) + _ repository.WritableRepository = (*IndexDBRepository)(nil) + _ repository.AppendableRepository = (*IndexDBRepository)(nil) + _ repository.HierarchicalRepository = (*IndexDBRepository)(nil) + _ repository.ListableRepository = (*IndexDBRepository)(nil) + _ repository.MovableRepository = (*IndexDBRepository)(nil) + _ repository.CopyableRepository = (*IndexDBRepository)(nil) +) + +type IndexDBRepository struct { + db *idb.Database +} + +func NewIndexDBRepository() (*IndexDBRepository, error) { + ctx := context.Background() + req, err := idb.Global().Open(ctx, "files", 1, func(db *idb.Database, oldVer, newVer uint) error { + metastore, err := db.CreateObjectStore("meta", idb.ObjectStoreOptions{}) + if err != nil { + return err + } + _, err = metastore.CreateIndex("path", js.ValueOf(""), idb.IndexOptions{Unique: true}) + if err != nil { + return err + } + _, err = metastore.CreateIndex("parent", js.ValueOf("parent"), idb.IndexOptions{}) + if err != nil { + return err + } + + datastore, err := db.CreateObjectStore("data", idb.ObjectStoreOptions{}) + if err != nil { + return err + } + _, err = datastore.CreateIndex("path", js.ValueOf(""), idb.IndexOptions{Unique: true}) + return err + }) + db, err := req.Await(ctx) + if err != nil { + return nil, err + } + + if err := mkdir(db, "/", ""); err != nil { + return nil, err + } + + return &IndexDBRepository{db: db}, nil +} + +func (r *IndexDBRepository) Exists(u fyne.URI) (bool, error) { + p := u.Path() + ctx := context.Background() + txn, err := r.db.Transaction(idb.TransactionReadOnly, "meta") + if err != nil { + return false, err + } + store, err := txn.ObjectStore("meta") + if err != nil { + return false, err + } + req, err := store.CountKey(js.ValueOf(p)) + if err != nil { + return false, err + } + n, err := req.Await(ctx) + if err != nil { + return false, err + } + + return n != 0, nil +} + +func get(db *idb.Database, s, p string) (js.Value, error) { + ctx := context.Background() + + txn, err := db.Transaction(idb.TransactionReadOnly, s) + if err != nil { + return js.Undefined(), err + } + store, err := txn.ObjectStore(s) + if err != nil { + return js.Undefined(), err + } + req, err := store.Get(js.ValueOf(p)) + if err != nil { + return js.Undefined(), err + } + + v, err := req.Await(ctx) + if err != nil { + return js.Undefined(), err + } + + return v, nil +} + +func (r *IndexDBRepository) CanList(u fyne.URI) (bool, error) { + p := u.Path() + + v, err := get(r.db, "meta", p) + if err != nil { + return false, err + } + + if v.IsUndefined() { + return false, nil + } + + isDir := v.Get("isDir") + if isDir.IsUndefined() { + return false, nil + } + + return isDir.Bool(), nil +} + +func mkdir(db *idb.Database, dir, parent string) error { + ctx := context.Background() + txn, err := db.Transaction(idb.TransactionReadWrite, "meta") + if err != nil { + return err + } + + store, err := txn.ObjectStore("meta") + if err != nil { + return err + } + + f := map[string]any{ + "isDir": true, + "parent": parent, + } + req, err := store.PutKey(js.ValueOf(dir), js.ValueOf(f)) + if err != nil { + return err + } + + _, err = req.Await(ctx) + return err +} + +func (r *IndexDBRepository) CreateListable(u fyne.URI) error { + pu, err := storage.Parent(u) + if err != nil { + return err + } + return mkdir(r.db, u.Path(), pu.Path()) +} + +func (r *IndexDBRepository) CanRead(u fyne.URI) (bool, error) { + p := u.Path() + + v, err := get(r.db, "meta", p) + if err != nil { + return false, err + } + + if v.IsUndefined() { + return false, nil + } + + return true, nil +} + +func (r *IndexDBRepository) Destroy(scheme string) { + // do nothing +} + +func (r *IndexDBRepository) List(u fyne.URI) ([]fyne.URI, error) { + p := u.Path() + ctx := context.Background() + txn, err := r.db.Transaction(idb.TransactionReadOnly, "meta") + if err != nil { + return nil, err + } + + store, err := txn.ObjectStore("meta") + if err != nil { + return nil, err + } + + idx, err := store.Index("parent") + if err != nil { + return nil, err + } + + creq, err := idx.OpenCursorKey(js.ValueOf(p), idb.CursorNext) + if err != nil { + return nil, err + } + + paths := []string{} + if err := creq.Iter(ctx, func(cwv *idb.CursorWithValue) error { + k, err := cwv.PrimaryKey() + if err != nil { + return err + } + paths = append(paths, idbfileSchemePrefix+k.String()) + return nil + }); err != nil { + return nil, err + } + + us := make([]fyne.URI, len(paths)) + for n, path := range paths { + us[n], err = storage.ParseURI(path) + if err != nil { + return nil, err + } + } + return us, nil +} + +func (r *IndexDBRepository) CanWrite(u fyne.URI) (bool, error) { + p := u.Path() + v, err := get(r.db, "meta", p) + if err != nil { + return false, err + } + + if v.IsUndefined() { + return true, nil + } + + isDir := v.Get("isDir") + if isDir.IsUndefined() { + return true, nil + } + + return !isDir.Bool(), nil +} + +func (r *IndexDBRepository) Delete(u fyne.URI) error { + p := u.Path() + ctx := context.Background() + txn, err := r.db.Transaction(idb.TransactionReadWrite, "meta", "data") + if err != nil { + return err + } + + metastore, err := txn.ObjectStore("meta") + if err != nil { + return err + } + + metareq, err := metastore.Delete(js.ValueOf(p)) + if err != nil { + return err + } + if err := metareq.Await(ctx); err != nil { + return err + } + + datastore, err := txn.ObjectStore("data") + if err != nil { + return err + } + datareq, err := datastore.Delete(js.ValueOf(p)) + if err != nil { + return err + } + return datareq.Await(ctx) +} + +func (r *IndexDBRepository) Reader(u fyne.URI) (fyne.URIReadCloser, error) { + pu, err := storage.Parent(u) + if err != nil { + return nil, err + } + + return &idbfile{ + db: r.db, + path: u.Path(), + parent: pu.Path(), + }, nil +} + +func (r *IndexDBRepository) Writer(u fyne.URI) (fyne.URIWriteCloser, error) { + pu, err := storage.Parent(u) + if err != nil { + return nil, err + } + + return &idbfile{ + db: r.db, + path: u.Path(), + parent: pu.Path(), + truncate: true, + }, nil +} + +func (r *IndexDBRepository) Appender(u fyne.URI) (fyne.URIWriteCloser, error) { + pu, err := storage.Parent(u) + if err != nil { + return nil, err + } + + return &idbfile{ + db: r.db, + path: u.Path(), + parent: pu.Path(), + add: true, + }, nil +} + +func (r *IndexDBRepository) Copy(src, dst fyne.URI) error { + return repository.GenericCopy(src, dst) +} + +func (r *IndexDBRepository) Move(source, destination fyne.URI) error { + return repository.GenericMove(source, destination) +} + +func (r *IndexDBRepository) Child(u fyne.URI, component string) (fyne.URI, error) { + return repository.GenericChild(u, component) +} + +func (r *IndexDBRepository) Parent(u fyne.URI) (fyne.URI, error) { + return repository.GenericParent(u) +} diff --git a/vendor/fyne.io/fyne/v2/internal/repository/memory.go b/vendor/fyne.io/fyne/v2/internal/repository/memory.go new file mode 100644 index 0000000..5a0aaa5 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/repository/memory.go @@ -0,0 +1,346 @@ +package repository + +import ( + "fmt" + "io" + "strings" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/storage" + "fyne.io/fyne/v2/storage/repository" +) + +// declare conformance to interfaces +var ( + _ io.ReadCloser = (*nodeReaderWriter)(nil) + _ io.WriteCloser = (*nodeReaderWriter)(nil) + _ fyne.URIReadCloser = (*nodeReaderWriter)(nil) + _ fyne.URIWriteCloser = (*nodeReaderWriter)(nil) +) + +// declare conformance with repository types +var ( + _ repository.Repository = (*InMemoryRepository)(nil) + _ repository.WritableRepository = (*InMemoryRepository)(nil) + _ repository.AppendableRepository = (*InMemoryRepository)(nil) + _ repository.HierarchicalRepository = (*InMemoryRepository)(nil) + _ repository.CopyableRepository = (*InMemoryRepository)(nil) + _ repository.MovableRepository = (*InMemoryRepository)(nil) + _ repository.ListableRepository = (*InMemoryRepository)(nil) +) + +// nodeReaderWriter allows reading or writing to elements in a InMemoryRepository +type nodeReaderWriter struct { + path string + repo *InMemoryRepository + writing bool + readCursor int + writeCursor int +} + +// InMemoryRepository implements an in-memory version of the +// repository.Repository type. It is useful for writing test cases, and may +// also be of use as a template for people wanting to implement their own +// "virtual repository". In future, we may consider moving this into the public +// API. +// +// Because of its design, this repository has several quirks: +// +// * The Parent() of a path that exists does not necessarily exist +// +// - Listing takes O(number of extant paths in the repository), rather than +// O(number of children of path being listed). +// +// This repository is not designed to be particularly fast or robust, but +// rather to be simple and easy to read. If you need performance, look +// elsewhere. +// +// Since: 2.0 +type InMemoryRepository struct { + // Data is exposed to allow tests to directly insert their own data + // without having to go through the API + Data map[string][]byte + + scheme string +} + +// Read reads data from the repository into the provided buffer. +func (n *nodeReaderWriter) Read(p []byte) (int, error) { + // first make sure the requested path actually exists + data, ok := n.repo.Data[n.path] + if !ok { + return 0, fmt.Errorf("path '%s' not present in InMemoryRepository", n.path) + } + + // copy it into p - we maintain counts since len(data) may be smaller + // than len(p) + count := 0 + j := 0 // index into p + for ; (j < len(p)) && (n.readCursor < len(data)); n.readCursor++ { + p[j] = data[n.readCursor] + count++ + j++ + } + + // generate EOF if needed + var err error = nil + if n.readCursor >= len(data) { + err = io.EOF + } + + return count, err +} + +// Close closes the reader and writer. +func (n *nodeReaderWriter) Close() error { + n.readCursor = 0 + n.writeCursor = 0 + n.writing = false + return nil +} + +// Write writes data to the repository. +// +// This implementation automatically creates the path n.path if it does not +// exist. If it does exist, it is overwritten. +func (n *nodeReaderWriter) Write(p []byte) (int, error) { + // overwrite the file if we haven't already started writing to it + if !n.writing { + n.repo.Data[n.path] = make([]byte, 0, len(p)) + n.writing = true + } + + // copy the data into the node buffer + for start := n.writeCursor; n.writeCursor < start+len(p); n.writeCursor++ { + // extend the file if needed + if len(n.repo.Data) < n.writeCursor+len(p) { + n.repo.Data[n.path] = append(n.repo.Data[n.path], 0) + } + n.repo.Data[n.path][n.writeCursor] = p[n.writeCursor-start] + } + + return len(p), nil +} + +// URI returns the URI of the node. +func (n *nodeReaderWriter) URI() fyne.URI { + // discarding the error because this should never fail + u, _ := storage.ParseURI(n.repo.scheme + "://" + n.path) + return u +} + +// NewInMemoryRepository creates a new InMemoryRepository instance. It must be +// given the scheme it is registered for. The caller needs to call +// repository.Register() on the result of this function. +// +// Since: 2.0 +func NewInMemoryRepository(scheme string) *InMemoryRepository { + return &InMemoryRepository{ + Data: make(map[string][]byte), + scheme: scheme, + } +} + +// Exists checks if the given URI exists. +// +// Since: 2.0 +func (m *InMemoryRepository) Exists(u fyne.URI) (bool, error) { + path := u.Path() + if path == "" { + return false, fmt.Errorf("invalid path '%s'", path) + } + + _, ok := m.Data[path] + return ok, nil +} + +// Reader reads the contents of the given URI. +// +// Since: 2.0 +func (m *InMemoryRepository) Reader(u fyne.URI) (fyne.URIReadCloser, error) { + path := u.Path() + + if path == "" { + return nil, fmt.Errorf("invalid path '%s'", path) + } + + _, ok := m.Data[path] + if !ok { + return nil, fmt.Errorf("no such path '%s' in InMemoryRepository", path) + } + + return &nodeReaderWriter{path: path, repo: m}, nil +} + +// CanRead checks if the given URI can be read. +// +// Since: 2.0 +func (m *InMemoryRepository) CanRead(u fyne.URI) (bool, error) { + path := u.Path() + if path == "" { + return false, fmt.Errorf("invalid path '%s'", path) + } + + _, ok := m.Data[path] + return ok, nil +} + +// Destroy tears down the InMemoryRepository. +func (m *InMemoryRepository) Destroy(scheme string) { + // do nothing +} + +// Writer writes to the given URI. +// +// Since: 2.0 +func (m *InMemoryRepository) Writer(u fyne.URI) (fyne.URIWriteCloser, error) { + path := u.Path() + if path == "" { + return nil, fmt.Errorf("invalid path '%s'", path) + } + + return &nodeReaderWriter{path: path, repo: m}, nil +} + +// Appender returns a writer that appends to the given URI. +// +// Since: 2.6 +func (m *InMemoryRepository) Appender(u fyne.URI) (fyne.URIWriteCloser, error) { + path := u.Path() + if path == "" { + return nil, fmt.Errorf("invalid path '%s'", path) + } + + return &nodeReaderWriter{path: path, repo: m, writing: true, writeCursor: len(m.Data[path])}, nil +} + +// CanWrite checks if the given URI can be written to. +// +// Since: 2.0 +func (m *InMemoryRepository) CanWrite(u fyne.URI) (bool, error) { + if p := u.Path(); p == "" { + return false, fmt.Errorf("invalid path '%s'", p) + } + + return true, nil +} + +// Delete deletes the given URI. +// +// Since: 2.0 +func (m *InMemoryRepository) Delete(u fyne.URI) error { + path := u.Path() + _, ok := m.Data[path] + if ok { + delete(m.Data, path) + } + + return nil +} + +// Parent returns the parent URI of the given URI. +// +// Since: 2.0 +func (m *InMemoryRepository) Parent(u fyne.URI) (fyne.URI, error) { + return repository.GenericParent(u) +} + +// Child returns the child URI created from the given URI and component. +// +// Since: 2.0 +func (m *InMemoryRepository) Child(u fyne.URI, component string) (fyne.URI, error) { + return repository.GenericChild(u, component) +} + +// Copy copies the source URI to the destination URI. +// +// Since: 2.0 +func (m *InMemoryRepository) Copy(source, destination fyne.URI) error { + return repository.GenericCopy(source, destination) +} + +// Move moves the contents of the source URI to the destination. +// +// Since: 2.0 +func (m *InMemoryRepository) Move(source, destination fyne.URI) error { + return repository.GenericMove(source, destination) +} + +// CanList checks if the given URI can be listed. +// +// Since: 2.0 +func (m *InMemoryRepository) CanList(u fyne.URI) (bool, error) { + path := u.Path() + exist, err := m.Exists(u) + if err != nil || !exist { + return false, err + } + + if path == "" || path[len(path)-1] == '/' { + return true, nil + } + + children, err := m.List(u) + return len(children) > 0, err +} + +// List returns a list of URIs that are children of the given URI. +// +// Since: 2.0 +func (m *InMemoryRepository) List(u fyne.URI) ([]fyne.URI, error) { + // Get the prefix, and make sure it ends with a path separator so that + // HasPrefix() will only find things that are children of it - this + // solves the edge case where you have say '/foo/bar' and + // '/foo/barbaz'. + prefix := u.Path() + + if len(prefix) > 0 && prefix[len(prefix)-1] != '/' { + prefix = prefix + "/" + } + + prefixSplit := strings.Split(prefix, "/") + prefixSplitLen := len(prefixSplit) + + // Now we can simply loop over all the paths and find the ones with an + // appropriate prefix, then eliminate those with too many path + // components. + listing := []fyne.URI{} + for p := range m.Data { + // We are going to compare ncomp with the number of elements in + // prefixSplit, which is guaranteed to have a trailing slash, + // so we want to also make pSplit be counted in ncomp like it + // does not have one. + pSplit := strings.Split(p, "/") + ncomp := len(pSplit) + if len(p) > 0 && p[len(p)-1] == '/' { + ncomp-- + } + + if strings.HasPrefix(p, prefix) && ncomp == prefixSplitLen { + uri, err := storage.ParseURI(m.scheme + "://" + p) + if err != nil { + return nil, err + } + + listing = append(listing, uri) + } + } + + return listing, nil +} + +// CreateListable makes the given URI a listable URI. +// +// Since: 2.0 +func (m *InMemoryRepository) CreateListable(u fyne.URI) error { + ex, err := m.Exists(u) + if err != nil { + return err + } + path := u.Path() + if ex { + return fmt.Errorf("cannot create '%s' as a listable path because it already exists", path) + } + m.Data[path] = []byte{} + return nil +} diff --git a/vendor/fyne.io/fyne/v2/internal/repository/mime/mime.go b/vendor/fyne.io/fyne/v2/internal/repository/mime/mime.go new file mode 100644 index 0000000..e3281d6 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/repository/mime/mime.go @@ -0,0 +1,13 @@ +package mime + +import "strings" + +// Split spits the mimetype into its main type and subtype. +func Split(mimeTypeFull string) (mimeType, mimeSubType string) { + mimeType, mimeSubType, ok := strings.Cut(mimeTypeFull, "/") + if !ok || mimeSubType == "" { + return "", "" + } + + return mimeType, mimeSubType +} diff --git a/vendor/fyne.io/fyne/v2/internal/scale/scale.go b/vendor/fyne.io/fyne/v2/internal/scale/scale.go new file mode 100644 index 0000000..fb98713 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/scale/scale.go @@ -0,0 +1,43 @@ +package scale + +import ( + "math" + + "fyne.io/fyne/v2" +) + +// ToScreenCoordinate converts a fyne coordinate in the given canvas to a screen coordinate +func ToScreenCoordinate(c fyne.Canvas, v float32) int { + return int(math.Ceil(float64(v * c.Scale()))) +} + +// ToFyneCoordinate converts a screen coordinate for a given canvas to a fyne coordinate +func ToFyneCoordinate(c fyne.Canvas, v int) float32 { + switch c.Scale() { + case 0.0: + panic("Incorrect scale most likely not set.") + case 1.0: + return float32(v) + default: + return float32(v) / c.Scale() + } +} + +// ToFyneSize returns the scaled size of an object based on pixel coordinates, typically for images. +// This method will attempt to find the canvas for an object to get its scale. +// In the event that this fails it will assume a 1:1 mapping (scale=1 or low DPI display). +func ToFyneSize(obj fyne.CanvasObject, width, height int) fyne.Size { + app := fyne.CurrentApp() + if app == nil { + return fyne.NewSize(float32(width), float32(height)) // can occur if called before app.New + } + driver := app.Driver() + if driver == nil { + return fyne.NewSize(float32(width), float32(height)) + } + c := driver.CanvasForObject(obj) + if c == nil { + return fyne.NewSize(float32(width), float32(height)) // this will happen a lot during init + } + return fyne.NewSize(ToFyneCoordinate(c, width), ToFyneCoordinate(c, height)) +} diff --git a/vendor/fyne.io/fyne/v2/internal/svg/svg.go b/vendor/fyne.io/fyne/v2/internal/svg/svg.go new file mode 100644 index 0000000..6d543d1 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/svg/svg.go @@ -0,0 +1,330 @@ +package svg + +import ( + "bytes" + "encoding/hex" + "encoding/xml" + "errors" + "fmt" + "image" + "image/color" + "io" + "path/filepath" + "strconv" + "strings" + + "github.com/fyne-io/oksvg" + "github.com/srwiley/rasterx" + + "fyne.io/fyne/v2" + col "fyne.io/fyne/v2/internal/color" +) + +// Colorize creates a new SVG from a given one by replacing all fill colors by the given color. +func Colorize(src []byte, clr color.Color) ([]byte, error) { + rdr := bytes.NewReader(src) + s, err := svgFromXML(rdr) + if err != nil { + return src, fmt.Errorf("could not load SVG, falling back to static content: %v", err) + } + if err := s.replaceFillColor(clr); err != nil { + return src, fmt.Errorf("could not replace fill color, falling back to static content: %v", err) + } + colorized, err := xml.Marshal(s) + if err != nil { + return src, fmt.Errorf("could not marshal svg, falling back to static content: %v", err) + } + return colorized, nil +} + +type Decoder struct { + icon *oksvg.SvgIcon +} + +type Config struct { + Width int + Height int + Aspect float32 +} + +func NewDecoder(stream io.Reader) (*Decoder, error) { + icon, err := oksvg.ReadIconStream(stream) + if err != nil { + return nil, err + } + + return &Decoder{ + icon: icon, + }, nil +} + +func (d *Decoder) Config() Config { + return Config{ + int(d.icon.ViewBox.W), + int(d.icon.ViewBox.H), + float32(d.icon.ViewBox.W / d.icon.ViewBox.H), + } +} + +func (d *Decoder) Draw(width, height int) (*image.NRGBA, error) { + config := d.Config() + + viewAspect := float32(width) / float32(height) + imgW, imgH := width, height + if viewAspect > config.Aspect { + imgW = int(float32(height) * config.Aspect) + } else if viewAspect < config.Aspect { + imgH = int(float32(width) / config.Aspect) + } + + x, y := svgOffset(d.icon, imgW, imgH) + d.icon.SetTarget(x, y, float64(imgW), float64(imgH)) + + img := image.NewNRGBA(image.Rect(0, 0, imgW, imgH)) + scanner := rasterx.NewScannerGV(config.Width, config.Height, img, img.Bounds()) + raster := rasterx.NewDasher(width, height, scanner) + + err := drawSVGSafely(d.icon, raster) + if err != nil { + err = fmt.Errorf("SVG render error: %w", err) + return nil, err + } + return img, nil +} + +func IsFileSVG(path string) bool { + return strings.EqualFold(filepath.Ext(path), ".svg") +} + +// IsResourceSVG checks if the resource is an SVG or not. +func IsResourceSVG(res fyne.Resource) bool { + if IsFileSVG(res.Name()) { + return true + } + + if len(res.Content()) < 5 { + return false + } + + switch strings.ToLower(string(res.Content()[:5])) { + case " 4 || delta < -4 { + return false + } + mismatches++ + } + + // Allow up to 1% of pixels to mismatch. + return mismatches == 0 || mismatches < len(a)/100 +} + +// NewCheckedImage returns a new black/white checked image with the specified size +// and the specified amount of horizontal and vertical tiles. +func NewCheckedImage(w, h, hTiles, vTiles int) image.Image { + img := image.NewNRGBA(image.Rect(0, 0, w, h)) + colors := []color.Color{color.White, color.Black} + tileWidth := float64(w) / float64(hTiles) + tileHeight := float64(h) / float64(vTiles) + for y := 0; y < h; y++ { + yTile := int(math.Floor(float64(y) / tileHeight)) + for x := 0; x < w; x++ { + xTile := int(math.Floor(float64(x) / tileWidth)) + img.Set(x, y, colors[(xTile+yTile)%2]) + } + } + return img +} + +func writeImage(path string, img image.Image) error { + if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil { + return err + } + f, err := os.Create(path) + if err != nil { + return err + } + if err = png.Encode(f, img); err != nil { + f.Close() + return err + } + return f.Close() +} diff --git a/vendor/fyne.io/fyne/v2/internal/test/util_helper.go b/vendor/fyne.io/fyne/v2/internal/test/util_helper.go new file mode 100644 index 0000000..44f8026 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/test/util_helper.go @@ -0,0 +1,73 @@ +//go:build !tamago && !noos + +package test + +import ( + "fmt" + "image" + "os" + "path/filepath" + "runtime" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// AssertImageMatches asserts that the given image is the same as the one stored in the master file. +// The master filename is relative to the `testdata` directory which is relative to the test. +// The test `t` fails if the given image is not equal to the loaded master image. +// In this case the given image is written into a file in `testdata/failed/` (relative to the test). +// This path is also reported, thus the file can be used as new master. +func AssertImageMatches(t *testing.T, masterFilename string, img image.Image, msgAndArgs ...any) bool { + wd, err := os.Getwd() + require.NoError(t, err) + masterPath := filepath.Join(wd, "testdata", masterFilename) + failedPath := filepath.Join(wd, "testdata/failed", masterFilename) + _, err = os.Stat(masterPath) + if os.IsNotExist(err) { + require.NoError(t, writeImage(failedPath, img)) + t.Errorf("Master not found at %s. Image written to %s might be used as master.", masterPath, failedPath) + return false + } + + file, err := os.Open(masterPath) + require.NoError(t, err) + defer file.Close() + raw, _, err := image.Decode(file) + require.NoError(t, err) + + masterPix := pixelsForImage(t, raw) // let's just compare the pixels directly + capturePix := pixelsForImage(t, img) + + // On darwin/arm64, there are slight differences in the rendering. + // Use a slower, more lenient comparison. If that fails, + // fall back to the strict comparison for a more detailed error message. + if runtime.GOOS == "darwin" && runtime.GOARCH == "arm64" && pixCloseEnough(masterPix, capturePix) { + return true + } + + var msg string + if len(msgAndArgs) > 0 { + msg = fmt.Sprintf(msgAndArgs[0].(string)+"\n", msgAndArgs[1:]...) + } + if !assert.Equal(t, masterPix, capturePix, "%sImage did not match master. Actual image written to file://%s.", msg, failedPath) { + require.NoError(t, writeImage(failedPath, img)) + return false + } + return true +} + +func pixelsForImage(t *testing.T, img image.Image) []uint8 { + var pix []uint8 + if data, ok := img.(*image.RGBA); ok { + pix = data.Pix + } else if data, ok := img.(*image.NRGBA); ok { + pix = data.Pix + } + if pix == nil { + t.Error("Master image is unsupported type") + } + + return pix +} diff --git a/vendor/fyne.io/fyne/v2/internal/theme/feature.go b/vendor/fyne.io/fyne/v2/internal/theme/feature.go new file mode 100644 index 0000000..dc3e479 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/theme/feature.go @@ -0,0 +1,29 @@ +package theme + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/cache" +) + +type FeatureName string + +const FeatureNameDeviceIsMobile = FeatureName("deviceIsMobile") + +// FeatureTheme defines the method to look up features that we use internally to apply functional +// differences through a theme override. +type FeatureTheme interface { + Feature(FeatureName) any +} + +// FeatureForWidget looks up the specified feature flag for the requested widget using the current theme. +// This is for internal purposes and will do nothing if the theme has not been overridden with the +// ThemeOverride container. +func FeatureForWidget(name FeatureName, w fyne.Widget) any { + if custom := cache.WidgetTheme(w); custom != nil { + if f, ok := custom.(FeatureTheme); ok { + return f.Feature(name) + } + } + + return nil +} diff --git a/vendor/fyne.io/fyne/v2/internal/theme/render.go b/vendor/fyne.io/fyne/v2/internal/theme/render.go new file mode 100644 index 0000000..55773a1 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/theme/render.go @@ -0,0 +1,30 @@ +package theme + +import ( + "fyne.io/fyne/v2" +) + +var themeStack []fyne.Theme + +// CurrentlyRenderingWithFallback returns the theme that is currently being used during rendering or layout +// calculations. If there is no override in effect then the fallback is returned. +func CurrentlyRenderingWithFallback(f fyne.Theme) fyne.Theme { + if len(themeStack) == 0 { + return f + } + + return themeStack[len(themeStack)-1] +} + +// PushRenderingTheme is used by the ThemeOverride container to stack the current theme during rendering +// and calculations. +func PushRenderingTheme(th fyne.Theme) { + themeStack = append(themeStack, th) +} + +// PopRenderingTheme is used by the ThemeOverride container to remove an overridden theme during rendering +// and calculations. +func PopRenderingTheme() { + themeStack[len(themeStack)-1] = nil + themeStack = themeStack[:len(themeStack)-1] +} diff --git a/vendor/fyne.io/fyne/v2/internal/theme/theme.go b/vendor/fyne.io/fyne/v2/internal/theme/theme.go new file mode 100644 index 0000000..8e122f1 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/theme/theme.go @@ -0,0 +1,93 @@ +package theme + +import ( + "image/color" + + "fyne.io/fyne/v2" +) + +// Primary color names. +const ( + ColorBlue = "blue" + ColorBrown = "brown" + ColorGray = "gray" + ColorGreen = "green" + ColorOrange = "orange" + ColorPurple = "purple" + ColorRed = "red" + ColorYellow = "yellow" +) + +// Theme variants; the public available ones are defined in /theme/theme.go. +const ( + VariantDark fyne.ThemeVariant = iota + VariantLight + VariantNameUserPreference // locally used in builtinTheme for backward compatibility +) + +var ( + colorLightOnPrimaryBlue = color.NRGBA{R: 0xff, G: 0xff, B: 0xff, A: 0xff} + colorLightOnPrimaryBrown = color.NRGBA{R: 0xff, G: 0xff, B: 0xff, A: 0xff} + colorLightOnPrimaryGray = color.NRGBA{R: 0x17, G: 0x17, B: 0x18, A: 0xff} + colorLightOnPrimaryGreen = color.NRGBA{R: 0x17, G: 0x17, B: 0x18, A: 0xff} + colorLightOnPrimaryOrange = color.NRGBA{R: 0x17, G: 0x17, B: 0x18, A: 0xff} + colorLightOnPrimaryPurple = color.NRGBA{R: 0xff, G: 0xff, B: 0xff, A: 0xff} + colorLightOnPrimaryRed = color.NRGBA{R: 0xff, G: 0xff, B: 0xff, A: 0xff} + colorLightOnPrimaryYellow = color.NRGBA{R: 0x17, G: 0x17, B: 0x18, A: 0xff} + colorLightPrimaryBlue = color.NRGBA{R: 0x29, G: 0x6f, B: 0xf6, A: 0xff} + colorLightPrimaryBrown = color.NRGBA{R: 0x79, G: 0x55, B: 0x48, A: 0xff} + colorLightPrimaryGray = color.NRGBA{R: 0x9e, G: 0x9e, B: 0x9e, A: 0xff} + colorLightPrimaryGreen = color.NRGBA{R: 0x8b, G: 0xc3, B: 0x4a, A: 0xff} + colorLightPrimaryOrange = color.NRGBA{R: 0xff, G: 0x98, B: 0x00, A: 0xff} + colorLightPrimaryPurple = color.NRGBA{R: 0x9c, G: 0x27, B: 0xb0, A: 0xff} + colorLightPrimaryRed = color.NRGBA{R: 0xf4, G: 0x43, B: 0x36, A: 0xff} + colorLightPrimaryYellow = color.NRGBA{R: 0xff, G: 0xeb, B: 0x3b, A: 0xff} +) + +// ForegroundOnPrimaryColorNamed returns a theme specific color used for text and icons against the named primary color. +func ForegroundOnPrimaryColorNamed(name string) color.Color { + switch name { + case ColorRed: + return colorLightOnPrimaryRed + case ColorOrange: + return colorLightOnPrimaryOrange + case ColorYellow: + return colorLightOnPrimaryYellow + case ColorGreen: + return colorLightOnPrimaryGreen + case ColorPurple: + return colorLightOnPrimaryPurple + case ColorBrown: + return colorLightOnPrimaryBrown + case ColorGray: + return colorLightOnPrimaryGray + } + + // We return the “on” value for ColorBlue for every other value. + // There is no need to have it in the switch above. + return colorLightOnPrimaryBlue +} + +// PrimaryColorNamed returns a theme specific color value for a named primary color. +func PrimaryColorNamed(name string) color.Color { + switch name { + case ColorRed: + return colorLightPrimaryRed + case ColorOrange: + return colorLightPrimaryOrange + case ColorYellow: + return colorLightPrimaryYellow + case ColorGreen: + return colorLightPrimaryGreen + case ColorPurple: + return colorLightPrimaryPurple + case ColorBrown: + return colorLightPrimaryBrown + case ColorGray: + return colorLightPrimaryGray + } + + // We return the value for ColorBlue for every other value. + // There is no need to have it in the switch above. + return colorLightPrimaryBlue +} diff --git a/vendor/fyne.io/fyne/v2/internal/widget/base.go b/vendor/fyne.io/fyne/v2/internal/widget/base.go new file mode 100644 index 0000000..e4aeef0 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/widget/base.go @@ -0,0 +1,143 @@ +package widget + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/internal/cache" +) + +// Base provides a helper that handles basic widget behaviours. +type Base struct { + hidden bool + position fyne.Position + size fyne.Size + impl fyne.Widget +} + +// ExtendBaseWidget is used by an extending widget to make use of BaseWidget functionality. +func (w *Base) ExtendBaseWidget(wid fyne.Widget) { + impl := w.super() + if impl != nil { + return + } + + w.impl = wid +} + +// Size gets the current size of this widget. +func (w *Base) Size() fyne.Size { + return w.size +} + +// Resize sets a new size for a widget. +// Note this should not be used if the widget is being managed by a Layout within a Container. +func (w *Base) Resize(size fyne.Size) { + if size == w.Size() { + return + } + + w.size = size + + impl := w.super() + if impl == nil { + return + } + cache.Renderer(impl).Layout(size) +} + +// Position gets the current position of this widget, relative to its parent. +func (w *Base) Position() fyne.Position { + return w.position +} + +// Move the widget to a new position, relative to its parent. +// Note this should not be used if the widget is being managed by a Layout within a Container. +func (w *Base) Move(pos fyne.Position) { + if w.Position() == pos { + return + } + + w.position = pos + + Repaint(w.super()) +} + +// MinSize for the widget - it should never be resized below this value. +func (w *Base) MinSize() fyne.Size { + impl := w.super() + + r := cache.Renderer(impl) + if r == nil { + return fyne.NewSize(0, 0) + } + + return r.MinSize() +} + +// Visible returns whether or not this widget should be visible. +// Note that this may not mean it is currently visible if a parent has been hidden. +func (w *Base) Visible() bool { + return !w.hidden +} + +// Show this widget so it becomes visible +func (w *Base) Show() { + if !w.hidden { + return // Visible already + } + + w.hidden = false + + impl := w.super() + if impl == nil { + return + } + impl.Refresh() +} + +// Hide this widget so it is no longer visible +func (w *Base) Hide() { + if w.hidden { + return // Hidden already + } + + w.hidden = true + + impl := w.super() + if impl == nil { + return + } + canvas.Refresh(impl) +} + +// Refresh causes this widget to be redrawn in it's current state +func (w *Base) Refresh() { + impl := w.super() + if impl == nil { + return + } + + cache.Renderer(impl).Refresh() +} + +// super will return the actual object that this represents. +// If extended then this is the extending widget, otherwise it is nil. +func (w *Base) super() fyne.Widget { + return w.impl +} + +// Repaint instructs the containing canvas to redraw, even if nothing changed. +// This method is a duplicate of what is in `canvas/canvas.go` to avoid a dependency loop or public API. +func Repaint(obj fyne.CanvasObject) { + app := fyne.CurrentApp() + if app == nil || app.Driver() == nil { + return + } + + c := app.Driver().CanvasForObject(obj) + if c != nil { + if paint, ok := c.(interface{ SetDirty() }); ok { + paint.SetDirty() + } + } +} diff --git a/vendor/fyne.io/fyne/v2/internal/widget/base_renderer.go b/vendor/fyne.io/fyne/v2/internal/widget/base_renderer.go new file mode 100644 index 0000000..6fc90e0 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/widget/base_renderer.go @@ -0,0 +1,27 @@ +package widget + +import "fyne.io/fyne/v2" + +// BaseRenderer is a renderer base that provides part of the widget.Renderer interface. +type BaseRenderer struct { + objects []fyne.CanvasObject +} + +// NewBaseRenderer creates a new BaseRenderer. +func NewBaseRenderer(objects []fyne.CanvasObject) BaseRenderer { + return BaseRenderer{objects} +} + +// Destroy does nothing in the base implementation. +func (r *BaseRenderer) Destroy() { +} + +// Objects returns the objects that should be rendered. +func (r *BaseRenderer) Objects() []fyne.CanvasObject { + return r.objects +} + +// SetObjects updates the objects of the renderer. +func (r *BaseRenderer) SetObjects(objects []fyne.CanvasObject) { + r.objects = objects +} diff --git a/vendor/fyne.io/fyne/v2/internal/widget/overlay_container.go b/vendor/fyne.io/fyne/v2/internal/widget/overlay_container.go new file mode 100644 index 0000000..0ea4bb2 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/widget/overlay_container.go @@ -0,0 +1,89 @@ +package widget + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/driver/desktop" +) + +var ( + _ fyne.Widget = (*OverlayContainer)(nil) + _ fyne.Tappable = (*OverlayContainer)(nil) + _ desktop.Hoverable = (*OverlayContainer)(nil) +) + +// OverlayContainer is a transparent widget containing one fyne.CanvasObject and meant to be used as overlay. +type OverlayContainer struct { + Base + Content fyne.CanvasObject + + canvas fyne.Canvas + onDismiss func() + shown bool +} + +// NewOverlayContainer creates an OverlayContainer. +func NewOverlayContainer(c fyne.CanvasObject, canvas fyne.Canvas, onDismiss func()) *OverlayContainer { + o := &OverlayContainer{canvas: canvas, Content: c, onDismiss: onDismiss} + o.ExtendBaseWidget(o) + return o +} + +// CreateRenderer returns a new renderer for the overlay container. +func (o *OverlayContainer) CreateRenderer() fyne.WidgetRenderer { + return &overlayRenderer{BaseRenderer{[]fyne.CanvasObject{o.Content}}, o} +} + +// Hide hides the overlay container. +func (o *OverlayContainer) Hide() { + if o.shown { + o.canvas.Overlays().Remove(o) + o.shown = false + } + o.Base.Hide() +} + +// MouseIn catches mouse-in events not handled by the container’s content. It does nothing. +func (o *OverlayContainer) MouseIn(*desktop.MouseEvent) { +} + +// MouseMoved catches mouse-moved events not handled by the container’s content. It does nothing. +func (o *OverlayContainer) MouseMoved(*desktop.MouseEvent) { +} + +// MouseOut catches mouse-out events not handled by the container’s content. It does nothing. +func (o *OverlayContainer) MouseOut() { +} + +// Show makes the overlay container visible. +func (o *OverlayContainer) Show() { + if !o.shown { + o.canvas.Overlays().Add(o) + o.shown = true + } + o.Base.Show() +} + +// Tapped catches tap events not handled by the container’s content. +// It performs the overlay container’s dismiss action. +func (o *OverlayContainer) Tapped(*fyne.PointEvent) { + if o.onDismiss != nil { + o.onDismiss() + } +} + +type overlayRenderer struct { + BaseRenderer + o *OverlayContainer +} + +var _ fyne.WidgetRenderer = (*overlayRenderer)(nil) + +func (r *overlayRenderer) Layout(fyne.Size) { +} + +func (r *overlayRenderer) MinSize() fyne.Size { + return r.o.canvas.Size() +} + +func (r *overlayRenderer) Refresh() { +} diff --git a/vendor/fyne.io/fyne/v2/internal/widget/scroller.go b/vendor/fyne.io/fyne/v2/internal/widget/scroller.go new file mode 100644 index 0000000..8e1b758 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/widget/scroller.go @@ -0,0 +1,687 @@ +package widget + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/driver/desktop" + "fyne.io/fyne/v2/internal/cache" + "fyne.io/fyne/v2/theme" +) + +// ScrollDirection represents the directions in which a Scroll can scroll its child content. +type ScrollDirection = fyne.ScrollDirection + +// Constants for valid values of ScrollDirection. +const ( + // ScrollBoth supports horizontal and vertical scrolling. + ScrollBoth ScrollDirection = iota + // ScrollHorizontalOnly specifies the scrolling should only happen left to right. + ScrollHorizontalOnly + // ScrollVerticalOnly specifies the scrolling should only happen top to bottom. + ScrollVerticalOnly + // ScrollNone turns off scrolling for this container. + // + // Since: 2.0 + ScrollNone +) + +type scrollBarOrientation int + +// We default to vertical as 0 due to that being the original orientation offered +const ( + scrollBarOrientationVertical scrollBarOrientation = 0 + scrollBarOrientationHorizontal scrollBarOrientation = 1 + scrollContainerMinSize = float32(32) // TODO consider the smallest useful scroll view? + + // what fraction of the page to scroll when tapping on the scroll bar area + pageScrollFraction = float32(0.95) +) + +type scrollBarRenderer struct { + BaseRenderer + scrollBar *scrollBar + background *canvas.Rectangle + minSize fyne.Size +} + +func (r *scrollBarRenderer) Layout(size fyne.Size) { + r.background.Resize(size) +} + +func (r *scrollBarRenderer) MinSize() fyne.Size { + return r.minSize +} + +func (r *scrollBarRenderer) Refresh() { + th := theme.CurrentForWidget(r.scrollBar) + v := fyne.CurrentApp().Settings().ThemeVariant() + + r.background.FillColor = th.Color(theme.ColorNameScrollBar, v) + r.background.CornerRadius = th.Size(theme.SizeNameScrollBarRadius) + r.background.Refresh() +} + +var ( + _ desktop.Hoverable = (*scrollBar)(nil) + _ fyne.Draggable = (*scrollBar)(nil) +) + +type scrollBar struct { + Base + area *scrollBarArea + draggedDistance float32 + dragStart float32 + orientation scrollBarOrientation +} + +func (b *scrollBar) CreateRenderer() fyne.WidgetRenderer { + th := theme.CurrentForWidget(b) + v := fyne.CurrentApp().Settings().ThemeVariant() + + background := canvas.NewRectangle(th.Color(theme.ColorNameScrollBar, v)) + background.CornerRadius = th.Size(theme.SizeNameScrollBarRadius) + r := &scrollBarRenderer{ + scrollBar: b, + background: background, + } + r.SetObjects([]fyne.CanvasObject{background}) + return r +} + +func (b *scrollBar) Cursor() desktop.Cursor { + return desktop.DefaultCursor +} + +func (b *scrollBar) DragEnd() { + b.area.isDragging = false + + if fyne.CurrentDevice().IsMobile() { + b.area.MouseOut() + return + } + b.area.Refresh() +} + +func (b *scrollBar) Dragged(e *fyne.DragEvent) { + if !b.area.isDragging { + b.area.isDragging = true + b.area.MouseIn(nil) + + switch b.orientation { + case scrollBarOrientationHorizontal: + b.dragStart = b.Position().X + case scrollBarOrientationVertical: + b.dragStart = b.Position().Y + } + b.draggedDistance = 0 + } + + switch b.orientation { + case scrollBarOrientationHorizontal: + b.draggedDistance += e.Dragged.DX + case scrollBarOrientationVertical: + b.draggedDistance += e.Dragged.DY + } + b.area.moveBar(b.draggedDistance+b.dragStart, b.Size()) +} + +func (b *scrollBar) MouseIn(e *desktop.MouseEvent) { + b.area.MouseIn(e) +} + +func (b *scrollBar) MouseMoved(*desktop.MouseEvent) { +} + +func (b *scrollBar) MouseOut() { + b.area.MouseOut() +} + +func newScrollBar(area *scrollBarArea) *scrollBar { + b := &scrollBar{area: area, orientation: area.orientation} + b.ExtendBaseWidget(b) + return b +} + +func (a *scrollBarArea) isLarge() bool { + return a.isMouseIn || a.isDragging +} + +type scrollBarAreaRenderer struct { + BaseRenderer + area *scrollBarArea + bar *scrollBar + background *canvas.Rectangle +} + +func (r *scrollBarAreaRenderer) Layout(size fyne.Size) { + r.layoutWithTheme(theme.CurrentForWidget(r.area), size) +} + +func (r *scrollBarAreaRenderer) layoutWithTheme(th fyne.Theme, size fyne.Size) { + var barHeight, barWidth, barX, barY float32 + var bkgHeight, bkgWidth, bkgX, bkgY float32 + switch r.area.orientation { + case scrollBarOrientationHorizontal: + barWidth, barHeight, barX, barY = r.barSizeAndOffset(th, r.area.scroll.Offset.X, r.area.scroll.Content.Size().Width, r.area.scroll.Size().Width) + r.area.barLeadingEdge = barX + r.area.barTrailingEdge = barX + barWidth + bkgWidth, bkgHeight, bkgX, bkgY = size.Width, barHeight, 0, barY + default: + barHeight, barWidth, barY, barX = r.barSizeAndOffset(th, r.area.scroll.Offset.Y, r.area.scroll.Content.Size().Height, r.area.scroll.Size().Height) + r.area.barLeadingEdge = barY + r.area.barTrailingEdge = barY + barHeight + bkgWidth, bkgHeight, bkgX, bkgY = barWidth, size.Height, barX, 0 + } + r.bar.Move(fyne.NewPos(barX, barY)) + r.bar.Resize(fyne.NewSize(barWidth, barHeight)) + r.background.Move(fyne.NewPos(bkgX, bkgY)) + r.background.Resize(fyne.NewSize(bkgWidth, bkgHeight)) +} + +func (r *scrollBarAreaRenderer) MinSize() fyne.Size { + th := theme.CurrentForWidget(r.area) + + barSize := th.Size(theme.SizeNameScrollBar) + min := barSize + if !r.area.isLarge() { + min = th.Size(theme.SizeNameScrollBarSmall) * 2 + } + switch r.area.orientation { + case scrollBarOrientationHorizontal: + return fyne.NewSize(barSize, min) + default: + return fyne.NewSize(min, barSize) + } +} + +func (r *scrollBarAreaRenderer) Refresh() { + th := theme.CurrentForWidget(r.area) + r.bar.Refresh() + r.background.FillColor = th.Color(theme.ColorNameScrollBarBackground, fyne.CurrentApp().Settings().ThemeVariant()) + r.background.Hidden = !r.area.isLarge() + r.layoutWithTheme(th, r.area.Size()) + canvas.Refresh(r.bar) + canvas.Refresh(r.background) +} + +func (r *scrollBarAreaRenderer) barSizeAndOffset(th fyne.Theme, contentOffset, contentLength, scrollLength float32) (length, width, lengthOffset, widthOffset float32) { + scrollBarSize := th.Size(theme.SizeNameScrollBar) + if scrollLength < contentLength { + portion := scrollLength / contentLength + length = float32(int(scrollLength)) * portion + length = fyne.Max(length, scrollBarSize) + } else { + length = scrollLength + } + if contentOffset != 0 { + lengthOffset = (scrollLength - length) * (contentOffset / (contentLength - scrollLength)) + } + if r.area.isLarge() { + width = scrollBarSize + } else { + widthOffset = th.Size(theme.SizeNameScrollBarSmall) + width = widthOffset + } + return length, width, lengthOffset, widthOffset +} + +var ( + _ desktop.Hoverable = (*scrollBarArea)(nil) + _ fyne.Tappable = (*scrollBarArea)(nil) +) + +type scrollBarArea struct { + Base + + isDragging bool + isMouseIn bool + scroll *Scroll + bar *scrollBar + orientation scrollBarOrientation + + // updated from renderer Layout + // coordinates Y in vertical orientation, X in horizontal + barLeadingEdge float32 + barTrailingEdge float32 +} + +func (a *scrollBarArea) CreateRenderer() fyne.WidgetRenderer { + th := theme.CurrentForWidget(a) + v := fyne.CurrentApp().Settings().ThemeVariant() + a.bar = newScrollBar(a) + background := canvas.NewRectangle(th.Color(theme.ColorNameScrollBarBackground, v)) + background.Hidden = !a.isLarge() + return &scrollBarAreaRenderer{BaseRenderer: NewBaseRenderer([]fyne.CanvasObject{background, a.bar}), area: a, bar: a.bar, background: background} +} + +func (a *scrollBarArea) Tapped(e *fyne.PointEvent) { + if isScrollerPageOnTap() { + a.scrollFullPageOnTap(e) + return + } + + // scroll to tapped position + barSize := a.bar.Size() + switch a.orientation { + case scrollBarOrientationHorizontal: + if e.Position.X < a.barLeadingEdge || e.Position.X > a.barTrailingEdge { + a.moveBar(fyne.Max(0, e.Position.X-barSize.Width/2), barSize) + } + case scrollBarOrientationVertical: + if e.Position.Y < a.barLeadingEdge || e.Position.Y > a.barTrailingEdge { + a.moveBar(fyne.Max(0, e.Position.Y-barSize.Height/2), a.bar.Size()) + } + } +} + +func (a *scrollBarArea) scrollFullPageOnTap(e *fyne.PointEvent) { + // when tapping above/below or left/right of the bar, scroll the content + // nearly a full page (pageScrollFraction) up/down or left/right, respectively + newOffset := a.scroll.Offset + switch a.orientation { + case scrollBarOrientationHorizontal: + if e.Position.X < a.barLeadingEdge { + newOffset.X = fyne.Max(0, newOffset.X-a.scroll.Size().Width*pageScrollFraction) + } else if e.Position.X > a.barTrailingEdge { + viewWid := a.scroll.Size().Width + newOffset.X = fyne.Min(a.scroll.Content.Size().Width-viewWid, newOffset.X+viewWid*pageScrollFraction) + } + default: + if e.Position.Y < a.barLeadingEdge { + newOffset.Y = fyne.Max(0, newOffset.Y-a.scroll.Size().Height*pageScrollFraction) + } else if e.Position.Y > a.barTrailingEdge { + viewHt := a.scroll.Size().Height + newOffset.Y = fyne.Min(a.scroll.Content.Size().Height-viewHt, newOffset.Y+viewHt*pageScrollFraction) + } + } + if newOffset == a.scroll.Offset { + return + } + + a.scroll.Offset = newOffset + if f := a.scroll.OnScrolled; f != nil { + f(a.scroll.Offset) + } + a.scroll.refreshWithoutOffsetUpdate() +} + +func (a *scrollBarArea) MouseIn(*desktop.MouseEvent) { + a.isMouseIn = true + a.scroll.refreshBars() +} + +func (a *scrollBarArea) MouseMoved(*desktop.MouseEvent) { +} + +func (a *scrollBarArea) MouseOut() { + a.isMouseIn = false + if a.isDragging { + return + } + + a.scroll.refreshBars() +} + +func (a *scrollBarArea) moveBar(offset float32, barSize fyne.Size) { + oldX := a.scroll.Offset.X + oldY := a.scroll.Offset.Y + switch a.orientation { + case scrollBarOrientationHorizontal: + a.scroll.Offset.X = a.computeScrollOffset(barSize.Width, offset, a.scroll.Size().Width, a.scroll.Content.Size().Width) + default: + a.scroll.Offset.Y = a.computeScrollOffset(barSize.Height, offset, a.scroll.Size().Height, a.scroll.Content.Size().Height) + } + if f := a.scroll.OnScrolled; f != nil && (a.scroll.Offset.X != oldX || a.scroll.Offset.Y != oldY) { + f(a.scroll.Offset) + } + a.scroll.refreshWithoutOffsetUpdate() +} + +func (a *scrollBarArea) computeScrollOffset(length, offset, scrollLength, contentLength float32) float32 { + maxOffset := scrollLength - length + if offset < 0 { + offset = 0 + } else if offset > maxOffset { + offset = maxOffset + } + ratio := offset / maxOffset + scrollOffset := ratio * (contentLength - scrollLength) + return scrollOffset +} + +func newScrollBarArea(scroll *Scroll, orientation scrollBarOrientation) *scrollBarArea { + a := &scrollBarArea{scroll: scroll, orientation: orientation} + a.ExtendBaseWidget(a) + return a +} + +type scrollContainerRenderer struct { + BaseRenderer + scroll *Scroll + vertArea *scrollBarArea + horizArea *scrollBarArea + leftShadow, rightShadow *Shadow + topShadow, bottomShadow *Shadow + oldMinSize fyne.Size +} + +func (r *scrollContainerRenderer) layoutBars(size fyne.Size) { + scrollerSize := r.scroll.Size() + if r.scroll.Direction == ScrollVerticalOnly || r.scroll.Direction == ScrollBoth { + r.vertArea.Resize(fyne.NewSize(r.vertArea.MinSize().Width, size.Height)) + r.vertArea.Move(fyne.NewPos(scrollerSize.Width-r.vertArea.Size().Width, 0)) + r.topShadow.Resize(fyne.NewSize(size.Width, 0)) + r.bottomShadow.Resize(fyne.NewSize(size.Width, 0)) + r.bottomShadow.Move(fyne.NewPos(0, scrollerSize.Height)) + } + + if r.scroll.Direction == ScrollHorizontalOnly || r.scroll.Direction == ScrollBoth { + r.horizArea.Resize(fyne.NewSize(size.Width, r.horizArea.MinSize().Height)) + r.horizArea.Move(fyne.NewPos(0, scrollerSize.Height-r.horizArea.Size().Height)) + r.leftShadow.Resize(fyne.NewSize(0, size.Height)) + r.rightShadow.Resize(fyne.NewSize(0, size.Height)) + r.rightShadow.Move(fyne.NewPos(scrollerSize.Width, 0)) + } + + r.updatePosition() +} + +func (r *scrollContainerRenderer) Layout(size fyne.Size) { + c := r.scroll.Content + c.Resize(c.MinSize().Max(size)) + + r.layoutBars(size) +} + +func (r *scrollContainerRenderer) MinSize() fyne.Size { + return r.scroll.MinSize() +} + +func (r *scrollContainerRenderer) Refresh() { + r.horizArea.Refresh() + r.vertArea.Refresh() + r.leftShadow.Refresh() + r.topShadow.Refresh() + r.rightShadow.Refresh() + r.bottomShadow.Refresh() + + if len(r.BaseRenderer.Objects()) == 0 || r.BaseRenderer.Objects()[0] != r.scroll.Content { + // push updated content object to baseRenderer + r.BaseRenderer.Objects()[0] = r.scroll.Content + } + size := r.scroll.Size() + newMin := r.scroll.Content.MinSize() + if r.oldMinSize == newMin && r.oldMinSize == r.scroll.Content.Size() && + (size.Width <= r.oldMinSize.Width && size.Height <= r.oldMinSize.Height) { + r.layoutBars(size) + return + } + + r.oldMinSize = newMin + r.Layout(size) +} + +func (r *scrollContainerRenderer) handleAreaVisibility(contentSize, scrollSize float32, area *scrollBarArea) { + if contentSize <= scrollSize { + area.Hide() + } else if r.scroll.Visible() { + area.Show() + } +} + +func (r *scrollContainerRenderer) handleShadowVisibility(offset, contentSize, scrollSize float32, shadowStart fyne.CanvasObject, shadowEnd fyne.CanvasObject) { + if !r.scroll.Visible() { + return + } + if offset > 0 { + shadowStart.Show() + } else { + shadowStart.Hide() + } + if offset < contentSize-scrollSize { + shadowEnd.Show() + } else { + shadowEnd.Hide() + } +} + +func (r *scrollContainerRenderer) updatePosition() { + if r.scroll.Content == nil { + return + } + scrollSize := r.scroll.Size() + contentSize := r.scroll.Content.Size() + + r.scroll.Content.Move(fyne.NewPos(-r.scroll.Offset.X, -r.scroll.Offset.Y)) + + if r.scroll.Direction == ScrollVerticalOnly || r.scroll.Direction == ScrollBoth { + r.handleAreaVisibility(contentSize.Height, scrollSize.Height, r.vertArea) + r.handleShadowVisibility(r.scroll.Offset.Y, contentSize.Height, scrollSize.Height, r.topShadow, r.bottomShadow) + cache.Renderer(r.vertArea).Layout(scrollSize) + } else { + r.vertArea.Hide() + r.topShadow.Hide() + r.bottomShadow.Hide() + } + if r.scroll.Direction == ScrollHorizontalOnly || r.scroll.Direction == ScrollBoth { + r.handleAreaVisibility(contentSize.Width, scrollSize.Width, r.horizArea) + r.handleShadowVisibility(r.scroll.Offset.X, contentSize.Width, scrollSize.Width, r.leftShadow, r.rightShadow) + cache.Renderer(r.horizArea).Layout(scrollSize) + } else { + r.horizArea.Hide() + r.leftShadow.Hide() + r.rightShadow.Hide() + } + + if r.scroll.Direction != ScrollHorizontalOnly { + canvas.Refresh(r.vertArea) // this is required to force the canvas to update, we have no "Redraw()" + } else { + canvas.Refresh(r.horizArea) // this is required like above but if we are horizontal + } +} + +// Scroll defines a container that is smaller than the Content. +// The Offset is used to determine the position of the child widgets within the container. +type Scroll struct { + Base + minSize fyne.Size + Direction ScrollDirection + Content fyne.CanvasObject + Offset fyne.Position + // OnScrolled can be set to be notified when the Scroll has changed position. + // You should not update the Scroll.Offset from this method. + // + // Since: 2.0 + OnScrolled func(fyne.Position) `json:"-"` +} + +// CreateRenderer is a private method to Fyne which links this widget to its renderer +func (s *Scroll) CreateRenderer() fyne.WidgetRenderer { + scr := &scrollContainerRenderer{ + BaseRenderer: NewBaseRenderer([]fyne.CanvasObject{s.Content}), + scroll: s, + } + scr.vertArea = newScrollBarArea(s, scrollBarOrientationVertical) + scr.topShadow = NewShadow(ShadowBottom, SubmergedContentLevel) + scr.bottomShadow = NewShadow(ShadowTop, SubmergedContentLevel) + scr.horizArea = newScrollBarArea(s, scrollBarOrientationHorizontal) + scr.leftShadow = NewShadow(ShadowRight, SubmergedContentLevel) + scr.rightShadow = NewShadow(ShadowLeft, SubmergedContentLevel) + scr.SetObjects(append(scr.Objects(), scr.topShadow, scr.bottomShadow, scr.leftShadow, scr.rightShadow, + scr.vertArea, scr.horizArea)) + scr.updatePosition() + + return scr +} + +// ScrollToBottom will scroll content to container bottom - to show latest info which end user just added +func (s *Scroll) ScrollToBottom() { + s.scrollBy(0, -1*(s.Content.MinSize().Height-s.Size().Height-s.Offset.Y)) + s.refreshBars() +} + +// ScrollToTop will scroll content to container top +func (s *Scroll) ScrollToTop() { + s.ScrollToOffset(fyne.Position{}) + s.refreshBars() +} + +// DragEnd will stop scrolling on mobile has stopped +func (s *Scroll) DragEnd() { +} + +// Dragged will scroll on any drag - bar or otherwise - for mobile +func (s *Scroll) Dragged(e *fyne.DragEvent) { + if !fyne.CurrentDevice().IsMobile() { + return + } + + if s.updateOffset(e.Dragged.DX, e.Dragged.DY) { + s.refreshWithoutOffsetUpdate() + } +} + +// MinSize returns the smallest size this widget can shrink to +func (s *Scroll) MinSize() fyne.Size { + min := fyne.NewSize(scrollContainerMinSize, scrollContainerMinSize).Max(s.minSize) + switch s.Direction { + case ScrollHorizontalOnly: + min.Height = fyne.Max(min.Height, s.Content.MinSize().Height) + case ScrollVerticalOnly: + min.Width = fyne.Max(min.Width, s.Content.MinSize().Width) + case ScrollNone: + return s.Content.MinSize() + } + return min +} + +// SetMinSize specifies a minimum size for this scroll container. +// If the specified size is larger than the content size then scrolling will not be enabled +// This can be helpful to appear larger than default if the layout is collapsing this widget. +func (s *Scroll) SetMinSize(size fyne.Size) { + s.minSize = size +} + +// Refresh causes this widget to be redrawn in it's current state +func (s *Scroll) Refresh() { + s.refreshBars() + + if s.Content != nil { + s.Content.Refresh() + } +} + +// Resize is called when this scroller should change size. We refresh to ensure the scroll bars are updated. +func (s *Scroll) Resize(sz fyne.Size) { + if sz == s.Size() { + return + } + + s.Base.Resize(sz) + s.refreshBars() +} + +// ScrollToOffset will update the location of the content of this scroll container. +// +// Since: 2.6 +func (s *Scroll) ScrollToOffset(p fyne.Position) { + if s.Offset == p { + return + } + + s.Offset = p + s.refreshBars() +} + +func (s *Scroll) refreshWithoutOffsetUpdate() { + s.Base.Refresh() +} + +// Scrolled is called when an input device triggers a scroll event +func (s *Scroll) Scrolled(ev *fyne.ScrollEvent) { + if s.Direction != ScrollNone { + s.scrollBy(ev.Scrolled.DX, ev.Scrolled.DY) + } +} + +func (s *Scroll) refreshBars() { + s.updateOffset(0, 0) + s.refreshWithoutOffsetUpdate() +} + +func (s *Scroll) scrollBy(dx, dy float32) { + min := s.Content.MinSize() + size := s.Size() + if size.Width < min.Width && size.Height >= min.Height && dx == 0 { + dx, dy = dy, dx + } + if s.updateOffset(dx, dy) { + s.refreshWithoutOffsetUpdate() + } +} + +func (s *Scroll) updateOffset(deltaX, deltaY float32) bool { + size := s.Size() + contentSize := s.Content.Size() + if contentSize.Width <= size.Width && contentSize.Height <= size.Height { + if s.Offset.X != 0 || s.Offset.Y != 0 { + s.Offset.X = 0 + s.Offset.Y = 0 + return true + } + return false + } + oldX := s.Offset.X + oldY := s.Offset.Y + min := s.Content.MinSize() + s.Offset.X = computeOffset(s.Offset.X, -deltaX, size.Width, min.Width) + s.Offset.Y = computeOffset(s.Offset.Y, -deltaY, size.Height, min.Height) + + moved := s.Offset.X != oldX || s.Offset.Y != oldY + if f := s.OnScrolled; f != nil && moved { + f(s.Offset) + } + return moved +} + +func computeOffset(start, delta, outerWidth, innerWidth float32) float32 { + offset := start + delta + if offset+outerWidth >= innerWidth { + offset = innerWidth - outerWidth + } + + return fyne.Max(offset, 0) +} + +// NewScroll creates a scrollable parent wrapping the specified content. +// Note that this may cause the MinSize to be smaller than that of the passed object. +func NewScroll(content fyne.CanvasObject) *Scroll { + s := newScrollContainerWithDirection(ScrollBoth, content) + s.ExtendBaseWidget(s) + return s +} + +// NewHScroll create a scrollable parent wrapping the specified content. +// Note that this may cause the MinSize.Width to be smaller than that of the passed object. +func NewHScroll(content fyne.CanvasObject) *Scroll { + s := newScrollContainerWithDirection(ScrollHorizontalOnly, content) + s.ExtendBaseWidget(s) + return s +} + +// NewVScroll create a scrollable parent wrapping the specified content. +// Note that this may cause the MinSize.Height to be smaller than that of the passed object. +func NewVScroll(content fyne.CanvasObject) *Scroll { + s := newScrollContainerWithDirection(ScrollVerticalOnly, content) + s.ExtendBaseWidget(s) + return s +} + +func newScrollContainerWithDirection(direction ScrollDirection, content fyne.CanvasObject) *Scroll { + s := &Scroll{ + Direction: direction, + Content: content, + } + s.ExtendBaseWidget(s) + return s +} diff --git a/vendor/fyne.io/fyne/v2/internal/widget/scroller_behavior_darwin.go b/vendor/fyne.io/fyne/v2/internal/widget/scroller_behavior_darwin.go new file mode 100644 index 0000000..cee48bd --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/widget/scroller_behavior_darwin.go @@ -0,0 +1,12 @@ +//go:build darwin + +package widget + +/* +int getScrollerPagingBehavior(); +*/ +import "C" + +func isScrollerPageOnTap() bool { + return C.getScrollerPagingBehavior() == 0 +} diff --git a/vendor/fyne.io/fyne/v2/internal/widget/scroller_behavior_darwin.m b/vendor/fyne.io/fyne/v2/internal/widget/scroller_behavior_darwin.m new file mode 100644 index 0000000..63eae18 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/widget/scroller_behavior_darwin.m @@ -0,0 +1,7 @@ +//go:build darwin + +#import + +int getScrollerPagingBehavior() { + return [[NSUserDefaults standardUserDefaults] boolForKey:@"AppleScrollerPagingBehavior"]; +} diff --git a/vendor/fyne.io/fyne/v2/internal/widget/scroller_behavior_other.go b/vendor/fyne.io/fyne/v2/internal/widget/scroller_behavior_other.go new file mode 100644 index 0000000..dbde695 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/widget/scroller_behavior_other.go @@ -0,0 +1,7 @@ +//go:build !darwin + +package widget + +func isScrollerPageOnTap() bool { + return false +} diff --git a/vendor/fyne.io/fyne/v2/internal/widget/shadow.go b/vendor/fyne.io/fyne/v2/internal/widget/shadow.go new file mode 100644 index 0000000..484aacf --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/widget/shadow.go @@ -0,0 +1,201 @@ +package widget + +import ( + "image/color" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/theme" +) + +var _ fyne.Widget = (*Shadow)(nil) + +// Shadow is a widget that renders a shadow. +type Shadow struct { + Base + level ElevationLevel + typ ShadowType +} + +// ElevationLevel is the level of elevation of the shadow casting object. +type ElevationLevel int + +// ElevationLevel constants inspired by: +// https://storage.googleapis.com/spec-host/mio-staging%2Fmio-design%2F1584058305895%2Fassets%2F0B6xUSjjSulxceF9udnA4Sk5tdU0%2Fbaselineelevation-chart.png +const ( + BaseLevel ElevationLevel = 0 + CardLevel ElevationLevel = 1 + ButtonLevel ElevationLevel = 2 + MenuLevel ElevationLevel = 4 + PopUpLevel ElevationLevel = 8 + SubmergedContentLevel ElevationLevel = 8 + DialogLevel ElevationLevel = 24 +) + +// ShadowType specifies the type of the shadow. +type ShadowType int + +// ShadowType constants +const ( + ShadowAround ShadowType = iota + ShadowLeft + ShadowRight + ShadowBottom + ShadowTop +) + +// NewShadow create a new Shadow. +func NewShadow(typ ShadowType, level ElevationLevel) *Shadow { + s := &Shadow{typ: typ, level: level} + s.ExtendBaseWidget(s) + return s +} + +// CreateRenderer returns a new renderer for the shadow. +func (s *Shadow) CreateRenderer() fyne.WidgetRenderer { + r := &shadowRenderer{s: s} + r.createShadows() + return r +} + +type shadowRenderer struct { + BaseRenderer + b, l, r, t *canvas.LinearGradient + bl, br, tl, tr *canvas.RadialGradient + minSize fyne.Size + s *Shadow +} + +func (r *shadowRenderer) Layout(size fyne.Size) { + depth := float32(r.s.level) + sideOff, topOff := float32(0.0), float32(0.0) + if r.s.typ == ShadowAround { + sideOff = depth * 0.2 + topOff = sideOff * 2 + } + + if r.tl != nil { + r.tl.Resize(fyne.NewSize(depth, depth)) + r.tl.Move(fyne.NewPos(-depth+sideOff, -depth+topOff)) + } + if r.t != nil { + r.t.Resize(fyne.NewSize(size.Width-sideOff*2, depth)) + r.t.Move(fyne.NewPos(sideOff, -depth+topOff)) + } + if r.tr != nil { + r.tr.Resize(fyne.NewSize(depth, depth)) + r.tr.Move(fyne.NewPos(size.Width-sideOff, -depth+topOff)) + } + if r.r != nil { + r.r.Resize(fyne.NewSize(depth, size.Height-topOff)) + r.r.Move(fyne.NewPos(size.Width-sideOff, topOff)) + } + if r.br != nil { + r.br.Resize(fyne.NewSize(depth, depth)) + r.br.Move(fyne.NewPos(size.Width-sideOff, size.Height)) + } + if r.b != nil { + r.b.Resize(fyne.NewSize(size.Width-sideOff*2, depth)) + r.b.Move(fyne.NewPos(sideOff, size.Height)) + } + if r.bl != nil { + r.bl.Resize(fyne.NewSize(depth, depth)) + r.bl.Move(fyne.NewPos(-depth+sideOff, size.Height)) + } + if r.l != nil { + r.l.Resize(fyne.NewSize(depth, size.Height-topOff)) + r.l.Move(fyne.NewPos(-depth+sideOff, topOff)) + } +} + +func (r *shadowRenderer) MinSize() fyne.Size { + return r.minSize +} + +func (r *shadowRenderer) Refresh() { + r.refreshShadows() + r.Layout(r.s.Size()) + canvas.Refresh(r.s) +} + +func (r *shadowRenderer) createShadows() { + th := theme.CurrentForWidget(r.s) + v := fyne.CurrentApp().Settings().ThemeVariant() + fg := th.Color(theme.ColorNameShadow, v) + + switch r.s.typ { + case ShadowLeft: + r.l = canvas.NewHorizontalGradient(color.Transparent, fg) + r.SetObjects([]fyne.CanvasObject{r.l}) + case ShadowRight: + r.r = canvas.NewHorizontalGradient(fg, color.Transparent) + r.SetObjects([]fyne.CanvasObject{r.r}) + case ShadowBottom: + r.b = canvas.NewVerticalGradient(fg, color.Transparent) + r.SetObjects([]fyne.CanvasObject{r.b}) + case ShadowTop: + r.t = canvas.NewVerticalGradient(color.Transparent, fg) + r.SetObjects([]fyne.CanvasObject{r.t}) + case ShadowAround: + r.tl = canvas.NewRadialGradient(fg, color.Transparent) + r.tl.CenterOffsetX = 0.5 + r.tl.CenterOffsetY = 0.5 + r.t = canvas.NewVerticalGradient(color.Transparent, fg) + r.tr = canvas.NewRadialGradient(fg, color.Transparent) + r.tr.CenterOffsetX = -0.5 + r.tr.CenterOffsetY = 0.5 + r.r = canvas.NewHorizontalGradient(fg, color.Transparent) + r.br = canvas.NewRadialGradient(fg, color.Transparent) + r.br.CenterOffsetX = -0.5 + r.br.CenterOffsetY = -0.5 + r.b = canvas.NewVerticalGradient(fg, color.Transparent) + r.bl = canvas.NewRadialGradient(fg, color.Transparent) + r.bl.CenterOffsetX = 0.5 + r.bl.CenterOffsetY = -0.5 + r.l = canvas.NewHorizontalGradient(color.Transparent, fg) + r.SetObjects([]fyne.CanvasObject{r.tl, r.t, r.tr, r.r, r.br, r.b, r.bl, r.l}) + } +} + +func (r *shadowRenderer) refreshShadows() { + th := theme.CurrentForWidget(r.s) + v := fyne.CurrentApp().Settings().ThemeVariant() + fg := th.Color(theme.ColorNameShadow, v) + + updateShadowEnd(r.l, fg) + updateShadowStart(r.r, fg) + updateShadowStart(r.b, fg) + updateShadowEnd(r.t, fg) + + updateShadowRadial(r.tl, fg) + updateShadowRadial(r.tr, fg) + updateShadowRadial(r.bl, fg) + updateShadowRadial(r.br, fg) +} + +func updateShadowEnd(g *canvas.LinearGradient, fg color.Color) { + if g == nil { + return + } + + g.EndColor = fg + g.Refresh() +} + +func updateShadowRadial(g *canvas.RadialGradient, fg color.Color) { + if g == nil { + return + } + + g.StartColor = fg + g.Refresh() +} + +func updateShadowStart(g *canvas.LinearGradient, fg color.Color) { + if g == nil { + return + } + + g.StartColor = fg + g.Refresh() +} diff --git a/vendor/fyne.io/fyne/v2/internal/widget/shadowing_renderer.go b/vendor/fyne.io/fyne/v2/internal/widget/shadowing_renderer.go new file mode 100644 index 0000000..6266a03 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/widget/shadowing_renderer.go @@ -0,0 +1,49 @@ +package widget + +import ( + "fyne.io/fyne/v2" +) + +// ShadowingRenderer is a renderer that adds a shadow around the rendered content. +// When using the ShadowingRenderer the embedding renderer should call +// LayoutShadow(contentSize, contentPos) to lay out the shadow. +type ShadowingRenderer struct { + BaseRenderer + shadow fyne.CanvasObject +} + +// NewShadowingRenderer creates a ShadowingRenderer. +func NewShadowingRenderer(objects []fyne.CanvasObject, level ElevationLevel) *ShadowingRenderer { + var s fyne.CanvasObject + if level > 0 { + s = NewShadow(ShadowAround, level) + } + r := &ShadowingRenderer{shadow: s} + r.SetObjects(objects) + return r +} + +// LayoutShadow adjusts the size and position of the shadow if necessary. +func (r *ShadowingRenderer) LayoutShadow(size fyne.Size, pos fyne.Position) { + if r.shadow == nil { + return + } + r.shadow.Resize(size) + r.shadow.Move(pos) +} + +// SetObjects updates the renderer's objects including the shadow if necessary. +func (r *ShadowingRenderer) SetObjects(objects []fyne.CanvasObject) { + if r.shadow != nil && len(objects) > 0 && r.shadow != objects[0] { + objects = append([]fyne.CanvasObject{r.shadow}, objects...) + } + r.BaseRenderer.SetObjects(objects) +} + +// RefreshShadow asks the shadow graphical element to update to current theme +func (r *ShadowingRenderer) RefreshShadow() { + if r.shadow == nil { + return + } + r.shadow.Refresh() +} diff --git a/vendor/fyne.io/fyne/v2/internal/widget/simple_renderer.go b/vendor/fyne.io/fyne/v2/internal/widget/simple_renderer.go new file mode 100644 index 0000000..33d4048 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/internal/widget/simple_renderer.go @@ -0,0 +1,55 @@ +package widget + +import "fyne.io/fyne/v2" + +var _ fyne.WidgetRenderer = (*SimpleRenderer)(nil) + +// SimpleRenderer is a basic renderer that satisfies widget.Renderer interface by wrapping +// a single fyne.CanvasObject. +// +// Since: 2.1 +type SimpleRenderer struct { + objects []fyne.CanvasObject +} + +// NewSimpleRenderer creates a new SimpleRenderer to render a widget using a +// single CanvasObject. +// +// Since: 2.1 +func NewSimpleRenderer(object fyne.CanvasObject) *SimpleRenderer { + return &SimpleRenderer{[]fyne.CanvasObject{object}} +} + +// Destroy does nothing in this implementation. +// +// Since: 2.1 +func (r *SimpleRenderer) Destroy() { +} + +// Layout updates the contained object to be the requested size. +// +// Since: 2.1 +func (r *SimpleRenderer) Layout(s fyne.Size) { + r.objects[0].Resize(s) +} + +// MinSize returns the smallest size that this render can use, returned from the underlying object. +// +// Since: 2.1 +func (r *SimpleRenderer) MinSize() fyne.Size { + return r.objects[0].MinSize() +} + +// Objects returns the objects that should be rendered. +// +// Since: 2.1 +func (r *SimpleRenderer) Objects() []fyne.CanvasObject { + return r.objects +} + +// Refresh requests the underlying object to redraw. +// +// Since: 2.1 +func (r *SimpleRenderer) Refresh() { + r.objects[0].Refresh() +} diff --git a/vendor/fyne.io/fyne/v2/key.go b/vendor/fyne.io/fyne/v2/key.go new file mode 100644 index 0000000..a950eb6 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/key.go @@ -0,0 +1,200 @@ +package fyne + +// KeyName represents the name of a key that has been pressed. +type KeyName string + +const ( + // KeyEscape is the "esc" key + KeyEscape KeyName = "Escape" + // KeyReturn is the carriage return (main keyboard) + KeyReturn KeyName = "Return" + // KeyTab is the tab advance key + KeyTab KeyName = "Tab" + // KeyBackspace is the delete-before-cursor key + KeyBackspace KeyName = "BackSpace" + // KeyInsert is the insert mode key + KeyInsert KeyName = "Insert" + // KeyDelete is the delete-after-cursor key + KeyDelete KeyName = "Delete" + // KeyRight is the right arrow key + KeyRight KeyName = "Right" + // KeyLeft is the left arrow key + KeyLeft KeyName = "Left" + // KeyDown is the down arrow key + KeyDown KeyName = "Down" + // KeyUp is the up arrow key + KeyUp KeyName = "Up" + // KeyPageUp is the page up num-pad key + KeyPageUp KeyName = "Prior" + // KeyPageDown is the page down num-pad key + KeyPageDown KeyName = "Next" + // KeyHome is the line-home key + KeyHome KeyName = "Home" + // KeyEnd is the line-end key + KeyEnd KeyName = "End" + + // KeyF1 is the first function key + KeyF1 KeyName = "F1" + // KeyF2 is the second function key + KeyF2 KeyName = "F2" + // KeyF3 is the third function key + KeyF3 KeyName = "F3" + // KeyF4 is the fourth function key + KeyF4 KeyName = "F4" + // KeyF5 is the fifth function key + KeyF5 KeyName = "F5" + // KeyF6 is the sixth function key + KeyF6 KeyName = "F6" + // KeyF7 is the seventh function key + KeyF7 KeyName = "F7" + // KeyF8 is the eighth function key + KeyF8 KeyName = "F8" + // KeyF9 is the ninth function key + KeyF9 KeyName = "F9" + // KeyF10 is the tenth function key + KeyF10 KeyName = "F10" + // KeyF11 is the eleventh function key + KeyF11 KeyName = "F11" + // KeyF12 is the twelfth function key + KeyF12 KeyName = "F12" + /* + F13 + ... + F25 + */ + + // KeyEnter is the enter/ return key (keypad) + KeyEnter KeyName = "KP_Enter" + + // Key0 represents the key 0 + Key0 KeyName = "0" + // Key1 represents the key 1 + Key1 KeyName = "1" + // Key2 represents the key 2 + Key2 KeyName = "2" + // Key3 represents the key 3 + Key3 KeyName = "3" + // Key4 represents the key 4 + Key4 KeyName = "4" + // Key5 represents the key 5 + Key5 KeyName = "5" + // Key6 represents the key 6 + Key6 KeyName = "6" + // Key7 represents the key 7 + Key7 KeyName = "7" + // Key8 represents the key 8 + Key8 KeyName = "8" + // Key9 represents the key 9 + Key9 KeyName = "9" + // KeyA represents the key A + KeyA KeyName = "A" + // KeyB represents the key B + KeyB KeyName = "B" + // KeyC represents the key C + KeyC KeyName = "C" + // KeyD represents the key D + KeyD KeyName = "D" + // KeyE represents the key E + KeyE KeyName = "E" + // KeyF represents the key F + KeyF KeyName = "F" + // KeyG represents the key G + KeyG KeyName = "G" + // KeyH represents the key H + KeyH KeyName = "H" + // KeyI represents the key I + KeyI KeyName = "I" + // KeyJ represents the key J + KeyJ KeyName = "J" + // KeyK represents the key K + KeyK KeyName = "K" + // KeyL represents the key L + KeyL KeyName = "L" + // KeyM represents the key M + KeyM KeyName = "M" + // KeyN represents the key N + KeyN KeyName = "N" + // KeyO represents the key O + KeyO KeyName = "O" + // KeyP represents the key P + KeyP KeyName = "P" + // KeyQ represents the key Q + KeyQ KeyName = "Q" + // KeyR represents the key R + KeyR KeyName = "R" + // KeyS represents the key S + KeyS KeyName = "S" + // KeyT represents the key T + KeyT KeyName = "T" + // KeyU represents the key U + KeyU KeyName = "U" + // KeyV represents the key V + KeyV KeyName = "V" + // KeyW represents the key W + KeyW KeyName = "W" + // KeyX represents the key X + KeyX KeyName = "X" + // KeyY represents the key Y + KeyY KeyName = "Y" + // KeyZ represents the key Z + KeyZ KeyName = "Z" + + // KeySpace is the space key + KeySpace KeyName = "Space" + // KeyApostrophe is the key "'" + KeyApostrophe KeyName = "'" + // KeyComma is the key "," + KeyComma KeyName = "," + // KeyMinus is the key "-" + KeyMinus KeyName = "-" + // KeyPeriod is the key "." (full stop) + KeyPeriod KeyName = "." + // KeySlash is the key "/" + KeySlash KeyName = "/" + // KeyBackslash is the key "\" + KeyBackslash KeyName = "\\" + // KeyLeftBracket is the key "[" + KeyLeftBracket KeyName = "[" + // KeyRightBracket is the key "]" + KeyRightBracket KeyName = "]" + // KeySemicolon is the key ";" + KeySemicolon KeyName = ";" + // KeyEqual is the key "=" + KeyEqual KeyName = "=" + // KeyAsterisk is the keypad key "*" + KeyAsterisk KeyName = "*" + // KeyPlus is the keypad key "+" + KeyPlus KeyName = "+" + // KeyBackTick is the key "`" on a US keyboard + KeyBackTick KeyName = "`" + + // KeyUnknown is used for key events where the underlying hardware generated an + // event that Fyne could not decode. + // + // Since: 2.1 + KeyUnknown KeyName = "" +) + +// KeyModifier represents any modifier key (shift etc.) that is being pressed together with a key. +// +// Since: 2.2 +type KeyModifier int + +const ( + // KeyModifierShift represents a shift key being held + // + // Since: 2.2 + KeyModifierShift KeyModifier = 1 << iota + // KeyModifierControl represents the ctrl key being held + // + // Since: 2.2 + KeyModifierControl + // KeyModifierAlt represents either alt keys being held + // + // Since: 2.2 + KeyModifierAlt + // KeyModifierSuper represents either super keys being held + // + // Since: 2.2 + KeyModifierSuper +) diff --git a/vendor/fyne.io/fyne/v2/key_darwin.go b/vendor/fyne.io/fyne/v2/key_darwin.go new file mode 100644 index 0000000..e3e4163 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/key_darwin.go @@ -0,0 +1,6 @@ +package fyne + +// KeyModifierShortcutDefault is the default key modifier for shortcuts (Control or Command). +// +// Since: 2.2 +const KeyModifierShortcutDefault = KeyModifierSuper diff --git a/vendor/fyne.io/fyne/v2/key_other.go b/vendor/fyne.io/fyne/v2/key_other.go new file mode 100644 index 0000000..f5fdd0d --- /dev/null +++ b/vendor/fyne.io/fyne/v2/key_other.go @@ -0,0 +1,8 @@ +//go:build !darwin + +package fyne + +// KeyModifierShortcutDefault is the default key modifier for shortcuts (Control or Command). +// +// Since: 2.2 +const KeyModifierShortcutDefault = KeyModifierControl diff --git a/vendor/fyne.io/fyne/v2/lang/lang.go b/vendor/fyne.io/fyne/v2/lang/lang.go new file mode 100644 index 0000000..69dd8ae --- /dev/null +++ b/vendor/fyne.io/fyne/v2/lang/lang.go @@ -0,0 +1,209 @@ +// Package lang introduces a translation and localisation API for Fyne applications +// +// Since 2.5 +package lang + +import ( + "embed" + "encoding/json" + "log" + "strings" + "sync" + "text/template" + + "github.com/jeandeaual/go-locale" + "github.com/nicksnyder/go-i18n/v2/i18n" + + "fyne.io/fyne/v2" + + "golang.org/x/text/language" +) + +var ( + // L is a shortcut to localize a string, similar to the gettext "_" function. + // More info available on the `Localize` function. + L = Localize + + // N is a shortcut to localize a string with plural forms, similar to the ngettext function. + // More info available on the `LocalizePlural` function. + N = LocalizePlural + + // X is a shortcut to get the localization of a string with specified key, similar to pgettext. + // More info available on the `LocalizeKey` function. + X = LocalizeKey + + // XN is a shortcut to get the localization plural form of a string with specified key, similar to npgettext. + // More info available on the `LocalizePluralKey` function. + XN = LocalizePluralKey + + bundle *i18n.Bundle + localizer *i18n.Localizer + setupOnce sync.Once + + //go:embed translations + translations embed.FS + translated []language.Tag +) + +// Localize asks the translation engine to translate a string, this behaves like the gettext "_" function. +// The string can be templated and the template data can be passed as a struct with exported fields, +// or as a map of string keys to any suitable value. +func Localize(in string, data ...any) string { + return LocalizeKey(in, in, data...) +} + +// LocalizeKey asks the translation engine for the translation with specific ID. +// If it cannot be found then the fallback will be used. +// The string can be templated and the template data can be passed as a struct with exported fields, +// or as a map of string keys to any suitable value. +func LocalizeKey(key, fallback string, data ...any) string { + var d0 any + if len(data) > 0 { + d0 = data[0] + } + + ret, err := localizer.Localize(&i18n.LocalizeConfig{ + DefaultMessage: &i18n.Message{ + ID: key, + Other: fallback, + }, + TemplateData: d0, + }) + if err != nil { + fyne.LogError("Translation failure", err) + return fallbackWithData(key, fallback, d0) + } + return ret +} + +// LocalizePlural asks the translation engine to translate a string from one of a number of plural forms. +// This behaves like the ngettext function, with the `count` parameter determining the plurality looked up. +// The string can be templated and the template data can be passed as a struct with exported fields, +// or as a map of string keys to any suitable value. +func LocalizePlural(in string, count int, data ...any) string { + return LocalizePluralKey(in, in, count, data...) +} + +// LocalizePluralKey asks the translation engine for the translation with specific ID in plural form. +// This behaves like the npgettext function, with the `count` parameter determining the plurality looked up. +// If it cannot be found then the fallback will be used. +// The string can be templated and the template data can be passed as a struct with exported fields, +// or as a map of string keys to any suitable value. +func LocalizePluralKey(key, fallback string, count int, data ...any) string { + var d0 any + if len(data) > 0 { + d0 = data[0] + } + + ret, err := localizer.Localize(&i18n.LocalizeConfig{ + DefaultMessage: &i18n.Message{ + ID: key, + Other: fallback, + }, + PluralCount: count, + TemplateData: d0, + }) + if err != nil { + fyne.LogError("Translation failure", err) + return fallbackWithData(key, fallback, d0) + } + return ret +} + +// AddTranslations allows an app to load a bundle of translations. +// The language that this relates to will be inferred from the resource name, for example "fr.json". +// The data should be in json format. +func AddTranslations(r fyne.Resource) error { + defer updateLocalizer() + return addLanguage(r.Content(), r.Name()) +} + +// AddTranslationsForLocale allows an app to load a bundle of translations for a specified locale. +// The data should be in json format. +func AddTranslationsForLocale(data []byte, l fyne.Locale) error { + defer updateLocalizer() + return addLanguage(data, l.String()+".json") +} + +// AddTranslationsFS supports adding all translations in one calling using an `embed.FS` setup. +// The `dir` parameter specifies the name or path of the directory containing translation files +// inside this embedded filesystem. +// Each file should be a json file with the name following pattern [prefix.]lang.json. +func AddTranslationsFS(fs embed.FS, dir string) (retErr error) { + files, err := fs.ReadDir(dir) + if err != nil { + return err + } + + for _, f := range files { + name := f.Name() + data, err := fs.ReadFile(dir + "/" + name) + if err != nil { + if retErr == nil { + retErr = err + } + continue + } + + err = addLanguage(data, name) + if err != nil { + if retErr == nil { + retErr = err + } + continue + } + } + + updateLocalizer() + + return retErr +} + +func addLanguage(data []byte, name string) error { + f, err := bundle.ParseMessageFileBytes(data, name) + if err != nil { + return err + } + + translated = append(translated, f.Tag) + return nil +} + +func init() { + bundle = i18n.NewBundle(language.English) + bundle.RegisterUnmarshalFunc("json", json.Unmarshal) + + translated = []language.Tag{language.Make("en")} // the first item in this list will be the fallback if none match + err := AddTranslationsFS(translations, "translations") + if err != nil { + fyne.LogError("Error occurred loading built-in translations", err) + } +} + +func fallbackWithData(key, fallback string, data any) string { + t, err := template.New(key).Parse(fallback) + if err != nil { + log.Println("Could not parse fallback template") + return fallback + } + str := &strings.Builder{} + _ = t.Execute(str, data) + return str.String() +} + +// A utility for setting up languages - available to unit tests for overriding system +func setupLang(lang string) { + localizer = i18n.NewLocalizer(bundle, lang) +} + +// updateLocalizer Finds the closest translation from the user's locale list and sets it up +func updateLocalizer() { + setupOnce.Do(initRuntime) + + all, err := locale.GetLocales() + if err != nil { + fyne.LogError("Failed to load user locales", err) + all = []string{"en"} + } + setupLang(closestSupportedLocale(all).LanguageString()) +} diff --git a/vendor/fyne.io/fyne/v2/lang/lang_android.go b/vendor/fyne.io/fyne/v2/lang/lang_android.go new file mode 100644 index 0000000..7c0f869 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/lang/lang_android.go @@ -0,0 +1,11 @@ +package lang + +import ( + "fyne.io/fyne/v2/internal/driver/mobile/app" + + "github.com/jeandeaual/go-locale" +) + +func initRuntime() { + locale.SetRunOnJVM(app.RunOnJVM) +} diff --git a/vendor/fyne.io/fyne/v2/lang/lang_notandroid.go b/vendor/fyne.io/fyne/v2/lang/lang_notandroid.go new file mode 100644 index 0000000..72537a1 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/lang/lang_notandroid.go @@ -0,0 +1,5 @@ +//go:build !android + +package lang + +func initRuntime() {} diff --git a/vendor/fyne.io/fyne/v2/lang/locale.go b/vendor/fyne.io/fyne/v2/lang/locale.go new file mode 100644 index 0000000..920cca1 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/lang/locale.go @@ -0,0 +1,56 @@ +package lang + +import ( + "github.com/jeandeaual/go-locale" + "golang.org/x/text/language" + + "fyne.io/fyne/v2" +) + +// SystemLocale returns the primary locale on the current system. +// This may refer to a language that Fyne does not have translations for. +func SystemLocale() fyne.Locale { + loc, err := locale.GetLocale() + if err != nil { + fyne.LogError("Failed to look up user locale", err) + } + if len(loc) < 2 { + loc = "en" + } + + tag, err := language.Parse(loc) + if err != nil { + fyne.LogError("Error parsing user locale "+loc, err) + } + return localeFromTag(tag) +} + +func closestSupportedLocale(locs []string) fyne.Locale { + matcher := language.NewMatcher(translated) + + tags := make([]language.Tag, len(locs)) + for i, loc := range locs { + tag, err := language.Parse(loc) + if err != nil { + fyne.LogError("Error parsing user locale "+loc, err) + } + tags[i] = tag + } + best, _, _ := matcher.Match(tags...) + return localeFromTag(best) +} + +func localeFromTag(in language.Tag) fyne.Locale { + b, s, r := in.Raw() + ret := b.String() + + if r.String() != "ZZ" { + ret += "-" + r.String() + + if s.String() != "Zzzz" { + ret += "-" + s.String() + } + } + + return fyne.Locale(ret) +} diff --git a/vendor/fyne.io/fyne/v2/lang/translations/base.cs.json b/vendor/fyne.io/fyne/v2/lang/translations/base.cs.json new file mode 100644 index 0000000..a1cb429 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/lang/translations/base.cs.json @@ -0,0 +1,45 @@ +{ + "Advanced": "Pokročilé", + "Cancel": "Zrušit", + "Confirm": "Potvrdit", + "Copy": "Kopírovat", + "Create Folder": "Vytvořit složku", + "Cut": "Vyjmout", + "Enter filename": "Zadejte název souboru", + "Error": "Chyba", + "Favourites": "Oblíbené", + "File": "Soubor", + "Folder": "Složka", + "New Folder": "Nová složka", + "No": "Ne", + "OK": "OK", + "Open": "Otevřít", + "Paste": "Vložit", + "Quit": "Odejít", + "Redo": "Opakovat", + "Save": "Uložit", + "Select all": "Vybrat vše", + "Show Hidden Files": "Zobrazit skryté soubory", + "Undo": "Zpět", + "Yes": "Ano", + "file.name": { + "other": "Název" + }, + "file.parent": { + "other": "Nadřazený" + }, + "friday": "Pátek", + "friday.short": "Pá", + "monday": "Pondělí", + "monday.short": "Po", + "saturday": "Sobota", + "saturday.short": "So", + "sunday": "Neděle", + "sunday.short": "Ne", + "thursday": "Čtvrtek", + "thursday.short": "Čt", + "tuesday": "Úterý", + "tuesday.short": "Út", + "wednesday": "Středa", + "wednesday.short": "St" +} diff --git a/vendor/fyne.io/fyne/v2/lang/translations/base.de.json b/vendor/fyne.io/fyne/v2/lang/translations/base.de.json new file mode 100644 index 0000000..6884c3f --- /dev/null +++ b/vendor/fyne.io/fyne/v2/lang/translations/base.de.json @@ -0,0 +1,45 @@ +{ + "Advanced": "Erweitert", + "Cancel": "Abbrechen", + "Confirm": "Bestätigen", + "Copy": "Kopieren", + "Create Folder": "Erstelle Ordner", + "Cut": "Ausschneiden", + "Enter filename": "Dateinamen eingeben", + "Error": "Fehler", + "Favourites": "Favoriten", + "File": "Datei", + "Folder": "Ordner", + "New Folder": "Neuer Ordner", + "No": "Nein", + "OK": "OK", + "Open": "Öffnen", + "Paste": "Einfügen", + "Quit": "Beenden", + "Redo": "Wiederholen", + "Save": "Speichern", + "Select all": "Alle auswählen", + "Show Hidden Files": "Versteckte Dateien anzeigen", + "Undo": "Rückgängig", + "Yes": "Ja", + "file.name": { + "other": "Name" + }, + "file.parent": { + "other": "../" + }, + "friday": "Freitag", + "friday.short": "Fr", + "monday": "Montag", + "monday.short": "Mo", + "saturday": "Samstag", + "saturday.short": "Sa", + "sunday": "Sonntag", + "sunday.short": "So", + "thursday": "Donnerstag", + "thursday.short": "Do", + "tuesday": "Dienstag", + "tuesday.short": "Di", + "wednesday": "Mittwoch", + "wednesday.short": "Mi" +} diff --git a/vendor/fyne.io/fyne/v2/lang/translations/base.el.json b/vendor/fyne.io/fyne/v2/lang/translations/base.el.json new file mode 100644 index 0000000..44390a4 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/lang/translations/base.el.json @@ -0,0 +1,45 @@ +{ + "Advanced": "Προχωρημένες", + "Cancel": "Ακύρωση", + "Confirm": "Επιβεβαίωση", + "Copy": "Αντιγραφή", + "Create Folder": "Δημιουργία Φακέλου", + "Cut": "Αποκοπή", + "Enter filename": "Εισαγωγή ονόματος αρχείου", + "Error": "Σφάλμα", + "Favourites": "Αγαπημένα", + "File": "Αρχείο", + "Folder": "Φάκελος", + "New Folder": "Νέος Φάκελος", + "No": "Όχι", + "OK": "ΟΚ", + "Open": "Άνοιγμα", + "Paste": "Επικόλληση", + "Quit": "Έξοδος", + "Redo": "Επανάληψη", + "Save": "Αποθήκευση", + "Select all": "Επιλογή όλων", + "Show Hidden Files": "Εμφάνιση Κρυμμένων Αρχείων", + "Undo": "Αναίρεση", + "Yes": "Ναι", + "file.name": { + "other": "Όνομα" + }, + "file.parent": { + "other": "Γονέας" + }, + "friday": "Παρασκευή", + "friday.short": "Παρ", + "monday": "Δευτέρα", + "monday.short": "Δευ", + "saturday": "Σαββάτο", + "saturday.short": "Σαβ", + "sunday": "Κυριακή", + "sunday.short": "Κυρ", + "thursday": "Πέμπτη", + "thursday.short": "Πεμ", + "tuesday": "Τρίτη", + "tuesday.short": "Τρι", + "wednesday": "Τετάρτη", + "wednesday.short": "Τερ" +} diff --git a/vendor/fyne.io/fyne/v2/lang/translations/base.en.json b/vendor/fyne.io/fyne/v2/lang/translations/base.en.json new file mode 100644 index 0000000..7670494 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/lang/translations/base.en.json @@ -0,0 +1,45 @@ +{ + "Advanced": "Advanced", + "Cancel": "Cancel", + "Confirm": "Confirm", + "Copy": "Copy", + "Create Folder": "Create Folder", + "Cut": "Cut", + "Enter filename": "Enter filename", + "Error": "Error", + "Favourites": "Favourites", + "File": "File", + "Folder": "Folder", + "New Folder": "New Folder", + "No": "No", + "OK": "OK", + "Open": "Open", + "Paste": "Paste", + "Quit": "Quit", + "Redo": "Redo", + "Save": "Save", + "Select all": "Select all", + "Show Hidden Files": "Show Hidden Files", + "Undo": "Undo", + "Yes": "Yes", + "file.name": { + "other": "Name" + }, + "file.parent": { + "other": "Parent" + }, + "friday": "Friday", + "friday.short": "Fri", + "monday": "Monday", + "monday.short": "Mon", + "saturday": "Saturday", + "saturday.short": "Sat", + "sunday": "Sunday", + "sunday.short": "Sun", + "thursday": "Thursday", + "thursday.short": "Thu", + "tuesday": "Tuesday", + "tuesday.short": "Tue", + "wednesday": "Wednesday", + "wednesday.short": "Wed" +} diff --git a/vendor/fyne.io/fyne/v2/lang/translations/base.es.json b/vendor/fyne.io/fyne/v2/lang/translations/base.es.json new file mode 100644 index 0000000..e960091 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/lang/translations/base.es.json @@ -0,0 +1,45 @@ +{ + "Advanced": "Avanzado", + "Cancel": "Cancelar", + "Confirm": "Confirmar", + "Copy": "Copiar", + "Create Folder": "Crear carpeta", + "Cut": "Cortar", + "Enter filename": "Introducir nombre del archivo", + "Error": "Error", + "Favourites": "Favoritos", + "File": "Archivo", + "Folder": "Carpeta", + "New Folder": "Nueva carpeta", + "No": "No", + "OK": "OK", + "Open": "Abrir", + "Paste": "Pegar", + "Quit": "Salir", + "Redo": "Rehacer", + "Save": "Guardar", + "Select all": "Seleccionar todo", + "Show Hidden Files": "Mostrar archivos ocultos", + "Undo": "Deshacer", + "Yes": "Si", + "file.name": { + "other": "Nombre" + }, + "file.parent": { + "other": "Padre" + }, + "monday": "Lunes", + "monday.short": "Lun", + "tuesday": "Martes", + "tuesday.short": "Mar", + "wednesday": "Miércoles", + "wednesday.short": "Mie", + "thursday": "Jueves", + "thursday.short": "Jue", + "friday": "Viernes", + "friday.short": "Vie", + "saturday": "Sábado", + "saturday.short": "Sab", + "sunday": "Domingo", + "sunday.short": "Dom" +} diff --git a/vendor/fyne.io/fyne/v2/lang/translations/base.fr.json b/vendor/fyne.io/fyne/v2/lang/translations/base.fr.json new file mode 100644 index 0000000..2134ad0 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/lang/translations/base.fr.json @@ -0,0 +1,31 @@ +{ + "Quit": "Quitter", + "Create Folder": "Créer un dossier", + "Cut": "Couper", + "Folder": "Dossier", + "Advanced": "Avancé", + "Cancel": "Annuler", + "Confirm": "Confirmer", + "Copy": "Copier", + "Enter filename": "Entrez un nom de fichier", + "Error": "Erreur", + "Favourites": "Favoris", + "File": "Fichier", + "New Folder": "Nouveau dossier", + "No": "Non", + "OK": "OK", + "Open": "Ouvrir", + "Paste": "Coller", + "Redo": "Rétablir", + "Save": "Enregistrer", + "Select all": "Tout sélectionner", + "Show Hidden Files": "Afficher les fichiers cachés", + "Undo": "Annuler", + "Yes": "Oui", + "file.name": { + "other": "Nom" + }, + "file.parent": { + "other": "Parent" + } +} diff --git a/vendor/fyne.io/fyne/v2/lang/translations/base.pl.json b/vendor/fyne.io/fyne/v2/lang/translations/base.pl.json new file mode 100644 index 0000000..8d8140e --- /dev/null +++ b/vendor/fyne.io/fyne/v2/lang/translations/base.pl.json @@ -0,0 +1,31 @@ +{ + "Advanced": "Zaawansowane", + "Cancel": "Anuluj", + "Confirm": "Potwierdz", + "Copy": "Kopiuj", + "Cut": "Wytnij", + "Error": "Błąd", + "Favourites": "Ulubione", + "File": "Plik", + "New Folder": "Nowy folder", + "No": "Nie", + "OK": "OK", + "Open": "Otwórz", + "Paste": "Wklej", + "Quit": "Wyjdz", + "Redo": "Przerób", + "Save": "Zapisz", + "Show Hidden Files": "Pokaż Ukryte Pliki", + "Enter filename": "Wprowadź Nazwę Pliku", + "Select all": "Zaznacz Wszystko", + "Yes": "Tak", + "file.name": { + "other": "Nawza" + }, + "Folder": "Folder", + "Create Folder": "Utwórz Folder", + "Undo": "Cofnij", + "file.parent": { + "other": "Rodzic" + } +} diff --git a/vendor/fyne.io/fyne/v2/lang/translations/base.pt.json b/vendor/fyne.io/fyne/v2/lang/translations/base.pt.json new file mode 100644 index 0000000..55599e0 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/lang/translations/base.pt.json @@ -0,0 +1,45 @@ +{ + "Advanced": "Avançado", + "Cancel": "Cancelar", + "Confirm": "Confirmar", + "Copy": "Copiar", + "Create Folder": "Criar Pasta", + "Cut": "Recortar", + "Enter filename": "Digite o nome do ficheiro", + "Error": "Erro", + "Favourites": "Favoritos", + "File": "Ficheiro", + "Folder": "Pasta", + "New Folder": "Pasta nova", + "No": "Não", + "OK": "OK", + "Open": "Abrir", + "Paste": "Colar", + "Quit": "Sair", + "Redo": "Refazer", + "Save": "Gravar", + "Select all": "Selecionar tudo", + "Show Hidden Files": "Mostrar ficheiros escondidos", + "Undo": "Desfazer", + "Yes": "Sim", + "file.name": { + "other": "Nome" + }, + "file.parent": { + "other": "Origem" + }, + "friday": "Sexta", + "friday.short": "Sex", + "monday": "Segunda", + "monday.short": "Seg", + "saturday": "Sábado", + "saturday.short": "Sáb", + "sunday": "Domingo", + "sunday.short": "Dom", + "thursday": "Quinta", + "thursday.short": "Qui", + "tuesday": "Terça", + "tuesday.short": "Ter", + "wednesday": "Quarta", + "wednesday.short": "Qua" +} diff --git a/vendor/fyne.io/fyne/v2/lang/translations/base.pt_BR.json b/vendor/fyne.io/fyne/v2/lang/translations/base.pt_BR.json new file mode 100644 index 0000000..4e532b3 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/lang/translations/base.pt_BR.json @@ -0,0 +1,31 @@ +{ + "Advanced": "Avançado", + "Cancel": "Cancelar", + "Confirm": "Confirmar", + "Copy": "Copiar", + "Create Folder": "Criar Pasta", + "Cut": "Recortar", + "Enter filename": "Digite o nome do arquivo", + "Error": "Erro", + "Favourites": "Favoritos", + "File": "Arquivo", + "Folder": "Pasta", + "New Folder": "Nova Pasta", + "No": "Não", + "OK": "OK", + "Open": "Abrir", + "Paste": "Colar", + "Quit": "Sair", + "Redo": "Refazer", + "Save": "Salvar", + "Select all": "Selecionar tudo", + "Show Hidden Files": "Mostrar Arquivos Ocultos", + "Undo": "Desfazer", + "Yes": "Sim", + "file.name": { + "other": "Nome" + }, + "file.parent": { + "other": "Origem" + } +} diff --git a/vendor/fyne.io/fyne/v2/lang/translations/base.ru.json b/vendor/fyne.io/fyne/v2/lang/translations/base.ru.json new file mode 100644 index 0000000..137e544 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/lang/translations/base.ru.json @@ -0,0 +1,45 @@ +{ + "Advanced": "Расширенные", + "Cancel": "Отмена", + "Confirm": "Подтвердить", + "Copy": "Копировать", + "Create Folder": "Создать папку", + "Cut": "Вырезать", + "Enter filename": "Введите имя файла", + "Error": "Ошибка", + "Favourites": "Избранное", + "File": "Файл", + "Folder": "Папка", + "New Folder": "Новая папка", + "No": "Нет", + "OK": "ОК", + "Open": "Открыть", + "Paste": "Вставить", + "Quit": "Выйти", + "Redo": "Повторить", + "Save": "Сохранить", + "Select all": "Выбрать всё", + "Show Hidden Files": "Показать скрытые файлы", + "Undo": "Отменить", + "Yes": "Да", + "file.name": { + "other": "Имя" + }, + "file.parent": { + "other": "Вверх" + }, + "friday": "Пятница", + "friday.short": "Пт", + "monday": "Понедельник", + "monday.short": "Пн", + "saturday": "Суббота", + "saturday.short": "Сб", + "sunday": "Воскресенье", + "sunday.short": "Вс", + "thursday": "Вторник", + "thursday.short": "Вт", + "tuesday": "Четверг", + "tuesday.short": "Чт", + "wednesday": "Среда", + "wednesday.short": "Ср" +} diff --git a/vendor/fyne.io/fyne/v2/lang/translations/base.sv.json b/vendor/fyne.io/fyne/v2/lang/translations/base.sv.json new file mode 100644 index 0000000..6979560 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/lang/translations/base.sv.json @@ -0,0 +1,45 @@ +{ + "OK": "OK", + "Save": "Spara", + "Advanced": "Avancerad", + "Confirm": "Bekräfta", + "Error": "Fel", + "Cancel": "Avbryt", + "Copy": "Kopiera", + "Create Folder": "Skapa mapp", + "Cut": "Klipp ut", + "Enter filename": "Ange filnamn", + "Favourites": "Favoriter", + "File": "Fil", + "Folder": "Mapp", + "New Folder": "Ny mapp", + "Open": "Öppna", + "Select all": "Markera allt", + "Undo": "Ångra", + "Yes": "Ja", + "file.name": { + "other": "Namn" + }, + "Show Hidden Files": "Visa dolda filer", + "thursday": "Torsdag", + "thursday.short": "Tor", + "friday": "Fredag", + "friday.short": "Fre", + "saturday": "Lördag", + "saturday.short": "Lör", + "sunday": "Söndag", + "sunday.short": "Sön", + "No": "Nej", + "Paste": "Klistra in", + "Quit": "Avsluta", + "Redo": "Gör om", + "monday": "Måndag", + "monday.short": "Mån", + "file.parent": { + "other": "Överordnad" + }, + "tuesday": "Tisdag", + "tuesday.short": "Tis", + "wednesday": "Onsdag", + "wednesday.short": "Ons" +} diff --git a/vendor/fyne.io/fyne/v2/lang/translations/base.ta.json b/vendor/fyne.io/fyne/v2/lang/translations/base.ta.json new file mode 100644 index 0000000..e8ba402 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/lang/translations/base.ta.json @@ -0,0 +1,45 @@ +{ + "Advanced": "மேம்பட்ட", + "Cancel": "ரத்துசெய்", + "Confirm": "உறுதிப்படுத்தவும்", + "Copy": "நகலெடு", + "Create Folder": "கோப்புறையை உருவாக்கவும்", + "Cut": "வெட்டு", + "Enter filename": "கோப்பு பெயரை உள்ளிடவும்", + "Error": "பிழை", + "Favourites": "பிடித்தவை", + "File": "கோப்பு", + "Folder": "கோப்புறை", + "New Folder": "புதிய கோப்புறை", + "No": "இல்லை", + "OK": "சரி", + "Open": "திற", + "Paste": "ஒட்டு", + "Quit": "வெளியேறு", + "Redo": "மீண்டும்செய்", + "Save": "சேமி", + "Select all": "அனைத்தையும் தெரிவுசெய்", + "Show Hidden Files": "மறைக்கப்பட்ட கோப்புகளைக் காட்டு", + "Undo": "செயல்தவிர்", + "Yes": "ஆம்", + "file.name": { + "other": "பெயர்" + }, + "file.parent": { + "other": "பெற்றோர்" + }, + "friday": "வெள்ளிக்கிழமை", + "friday.short": "வெள்ளி", + "monday": "திங்கள்", + "monday.short": "தி", + "saturday": "காரிக்கிழமை", + "saturday.short": "காரி", + "sunday": "ஞாயிற்றுக்கிழமை", + "sunday.short": "சூரியன்", + "thursday": "வியாழக்கிழமை", + "thursday.short": "வியாழன்", + "tuesday": "செவ்வாய்க்கிழமை", + "tuesday.short": "செவ்வாய்", + "wednesday": "புதன்கிழமை", + "wednesday.short": "அறிவன்" +} diff --git a/vendor/fyne.io/fyne/v2/lang/translations/base.uk.json b/vendor/fyne.io/fyne/v2/lang/translations/base.uk.json new file mode 100644 index 0000000..4af4368 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/lang/translations/base.uk.json @@ -0,0 +1,45 @@ +{ + "Advanced": "Розширені", + "Cancel": "Скасувати", + "Confirm": "Підтвердити", + "Copy": "Скопіювати", + "Create Folder": "Створити теку", + "Cut": "Вирізати", + "Enter filename": "Введіть назву теки", + "Error": "Помилка", + "Favourites": "Обране", + "File": "Файл", + "Folder": "Тека", + "New Folder": "Нова тека", + "No": "Ні", + "OK": "Добре", + "Open": "Відкрити", + "Paste": "Вставити", + "Quit": "Вийти", + "Redo": "Повторити", + "Save": "Зберегти", + "Select all": "Обрати все", + "Show Hidden Files": "Показувати приховані файли", + "Undo": "Відмінити", + "Yes": "Так", + "file.name": { + "other": "Назва" + }, + "file.parent": { + "other": "Батьківська" + }, + "friday": "П'ятниця", + "friday.short": "П'ят", + "monday": "Понеділок", + "monday.short": "Пон", + "saturday": "Субота", + "saturday.short": "Суб", + "sunday": "Неділя", + "sunday.short": "Нед", + "thursday": "Четвер", + "thursday.short": "Чет", + "tuesday": "Вівторок", + "tuesday.short": "Віт", + "wednesday": "Середа", + "wednesday.short": "Сер" +} diff --git a/vendor/fyne.io/fyne/v2/lang/translations/base.zh_Hans.json b/vendor/fyne.io/fyne/v2/lang/translations/base.zh_Hans.json new file mode 100644 index 0000000..0519f81 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/lang/translations/base.zh_Hans.json @@ -0,0 +1,45 @@ +{ + "Advanced": "高级", + "Cancel": "取消", + "Confirm": "确认", + "Copy": "复制", + "Create Folder": "新建文件夹", + "Cut": "剪切", + "Enter filename": "输入文件名", + "Error": "错误", + "Favourites": "收藏", + "File": "文件", + "Folder": "文件夹", + "New Folder": "新文件夹", + "No": "不", + "OK": "好", + "Open": "打开", + "Paste": "粘贴", + "Quit": "退出", + "Redo": "重做", + "Save": "保存", + "Select all": "选择全部", + "Show Hidden Files": "显示隐藏的文件", + "Undo": "撤消", + "Yes": "是", + "file.name": { + "other": "名字" + }, + "file.parent": { + "other": "父目录" + }, + "friday": "星期五", + "friday.short": "周五", + "monday": "星期一", + "monday.short": "周一", + "saturday": "星期六", + "saturday.short": "周六", + "sunday": "星期日", + "sunday.short": "周日", + "thursday": "星期四", + "thursday.short": "周四", + "tuesday": "星期二", + "tuesday.short": "周二", + "wednesday": "星期三", + "wednesday.short": "周三" +} diff --git a/vendor/fyne.io/fyne/v2/layout.go b/vendor/fyne.io/fyne/v2/layout.go new file mode 100644 index 0000000..8a3d804 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/layout.go @@ -0,0 +1,11 @@ +package fyne + +// Layout defines how [CanvasObject]s may be laid out in a specified Size. +type Layout interface { + // Layout will manipulate the listed [CanvasObject]s Size and Position + // to fit within the specified size. + Layout([]CanvasObject, Size) + // MinSize calculates the smallest size that will fit the listed + // [CanvasObject]s using this Layout algorithm. + MinSize(objects []CanvasObject) Size +} diff --git a/vendor/fyne.io/fyne/v2/layout/borderlayout.go b/vendor/fyne.io/fyne/v2/layout/borderlayout.go new file mode 100644 index 0000000..2cc420c --- /dev/null +++ b/vendor/fyne.io/fyne/v2/layout/borderlayout.go @@ -0,0 +1,108 @@ +package layout + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/theme" +) + +// Declare conformity with Layout interface +var _ fyne.Layout = (*borderLayout)(nil) + +type borderLayout struct { + top, bottom, left, right fyne.CanvasObject +} + +// NewBorderLayout creates a new BorderLayout instance with top, bottom, left +// and right objects set. All other items in the container will fill the remaining space in the middle. +// Multiple extra items will be stacked in the specified order as a Stack container. +func NewBorderLayout(top, bottom, left, right fyne.CanvasObject) fyne.Layout { + return &borderLayout{top, bottom, left, right} +} + +// Layout is called to pack all child objects into a specified size. +// For BorderLayout this arranges the top, bottom, left and right widgets at +// the sides and any remaining widgets are maximised in the middle space. +func (b *borderLayout) Layout(objects []fyne.CanvasObject, size fyne.Size) { + padding := theme.Padding() + var topSize, bottomSize, leftSize, rightSize fyne.Size + if b.top != nil && b.top.Visible() { + topHeight := b.top.MinSize().Height + b.top.Resize(fyne.NewSize(size.Width, topHeight)) + b.top.Move(fyne.NewPos(0, 0)) + topSize = fyne.NewSize(size.Width, topHeight+padding) + } + if b.bottom != nil && b.bottom.Visible() { + bottomHeight := b.bottom.MinSize().Height + b.bottom.Resize(fyne.NewSize(size.Width, bottomHeight)) + b.bottom.Move(fyne.NewPos(0, size.Height-bottomHeight)) + bottomSize = fyne.NewSize(size.Width, bottomHeight+padding) + } + if b.left != nil && b.left.Visible() { + leftWidth := b.left.MinSize().Width + b.left.Resize(fyne.NewSize(leftWidth, size.Height-topSize.Height-bottomSize.Height)) + b.left.Move(fyne.NewPos(0, topSize.Height)) + leftSize = fyne.NewSize(leftWidth+padding, size.Height-topSize.Height-bottomSize.Height) + } + if b.right != nil && b.right.Visible() { + rightWidth := b.right.MinSize().Width + b.right.Resize(fyne.NewSize(rightWidth, size.Height-topSize.Height-bottomSize.Height)) + b.right.Move(fyne.NewPos(size.Width-rightWidth, topSize.Height)) + rightSize = fyne.NewSize(rightWidth+padding, size.Height-topSize.Height-bottomSize.Height) + } + + middleSize := fyne.NewSize(size.Width-leftSize.Width-rightSize.Width, size.Height-topSize.Height-bottomSize.Height) + middlePos := fyne.NewPos(leftSize.Width, topSize.Height) + for _, child := range objects { + if !child.Visible() { + continue + } + + if child != b.top && child != b.bottom && child != b.left && child != b.right { + child.Resize(middleSize) + child.Move(middlePos) + } + } +} + +// MinSize finds the smallest size that satisfies all the child objects. +// For BorderLayout this is determined by the MinSize height of the top and +// plus the MinSize width of the left and right, plus any padding needed. +// This is then added to the union of the MinSize for any remaining content. +func (b *borderLayout) MinSize(objects []fyne.CanvasObject) fyne.Size { + minSize := fyne.NewSize(0, 0) + for _, child := range objects { + if !child.Visible() { + continue + } + + if child != b.top && child != b.bottom && child != b.left && child != b.right { + minSize = minSize.Max(child.MinSize()) + } + } + + padding := theme.Padding() + + if b.left != nil && b.left.Visible() { + leftMin := b.left.MinSize() + minHeight := fyne.Max(minSize.Height, leftMin.Height) + minSize = fyne.NewSize(minSize.Width+leftMin.Width+padding, minHeight) + } + if b.right != nil && b.right.Visible() { + rightMin := b.right.MinSize() + minHeight := fyne.Max(minSize.Height, rightMin.Height) + minSize = fyne.NewSize(minSize.Width+rightMin.Width+padding, minHeight) + } + + if b.top != nil && b.top.Visible() { + topMin := b.top.MinSize() + minWidth := fyne.Max(minSize.Width, topMin.Width) + minSize = fyne.NewSize(minWidth, minSize.Height+topMin.Height+padding) + } + if b.bottom != nil && b.bottom.Visible() { + bottomMin := b.bottom.MinSize() + minWidth := fyne.Max(minSize.Width, bottomMin.Width) + minSize = fyne.NewSize(minWidth, minSize.Height+bottomMin.Height+padding) + } + + return minSize +} diff --git a/vendor/fyne.io/fyne/v2/layout/boxlayout.go b/vendor/fyne.io/fyne/v2/layout/boxlayout.go new file mode 100644 index 0000000..bd00e5f --- /dev/null +++ b/vendor/fyne.io/fyne/v2/layout/boxlayout.go @@ -0,0 +1,227 @@ +package layout + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/theme" +) + +// NewVBoxLayout returns a vertical box layout for stacking a number of child +// canvas objects or widgets top to bottom. The objects are always displayed +// at their vertical MinSize. Use a different layout if the objects are intended +// to be larger than their vertical MinSize. +func NewVBoxLayout() fyne.Layout { + return vBoxLayout{ + paddingFunc: theme.Padding, + } +} + +// NewHBoxLayout returns a horizontal box layout for stacking a number of child +// canvas objects or widgets left to right. The objects are always displayed +// at their horizontal MinSize. Use a different layout if the objects are intended +// to be larger than their horizontal MinSize. +func NewHBoxLayout() fyne.Layout { + return hBoxLayout{ + paddingFunc: theme.Padding, + } +} + +// NewCustomPaddedHBoxLayout returns a layout similar to HBoxLayout that uses a custom +// amount of padding in between objects instead of the theme.Padding value. +// +// Since: 2.5 +func NewCustomPaddedHBoxLayout(padding float32) fyne.Layout { + return hBoxLayout{ + paddingFunc: func() float32 { return padding }, + } +} + +// NewCustomPaddedVBoxLayout returns a layout similar to VBoxLayout that uses a custom +// amount of padding in between objects instead of the theme.Padding value. +// +// Since: 2.5 +func NewCustomPaddedVBoxLayout(padding float32) fyne.Layout { + return vBoxLayout{ + paddingFunc: func() float32 { return padding }, + } +} + +// Declare conformity with Layout interface +var _ fyne.Layout = (*vBoxLayout)(nil) + +type vBoxLayout struct { + paddingFunc func() float32 +} + +// Layout is called to pack all child objects into a specified size. +// This will pack objects into a single column where each item +// is full width but the height is the minimum required. +// Any spacers added will pad the view, sharing the space if there are two or more. +func (v vBoxLayout) Layout(objects []fyne.CanvasObject, size fyne.Size) { + spacers := 0 + visibleObjects := 0 + // Size taken up by visible objects + total := float32(0) + + for _, child := range objects { + if !child.Visible() { + continue + } + + if isVerticalSpacer(child) { + spacers++ + continue + } + + visibleObjects++ + total += child.MinSize().Height + } + + padding := v.paddingFunc() + + // Amount of space not taken up by visible objects and inter-object padding + extra := size.Height - total - (padding * float32(visibleObjects-1)) + + // Spacers split extra space equally + spacerSize := float32(0) + if spacers > 0 { + spacerSize = extra / float32(spacers) + } + + x, y := float32(0), float32(0) + for _, child := range objects { + if !child.Visible() { + continue + } + + if isVerticalSpacer(child) { + child.Move(fyne.NewPos(x, y)) + child.Resize(fyne.NewSize(size.Width, spacerSize)) + y += spacerSize + continue + } + child.Move(fyne.NewPos(x, y)) + + height := child.MinSize().Height + y += padding + height + child.Resize(fyne.NewSize(size.Width, height)) + } +} + +// MinSize finds the smallest size that satisfies all the child objects. +// For a BoxLayout this is the width of the widest item and the height is +// the sum of all children combined with padding between each. +func (v vBoxLayout) MinSize(objects []fyne.CanvasObject) fyne.Size { + minSize := fyne.NewSize(0, 0) + addPadding := false + padding := v.paddingFunc() + for _, child := range objects { + if !child.Visible() || isVerticalSpacer(child) { + continue + } + + childMin := child.MinSize() + minSize.Width = fyne.Max(childMin.Width, minSize.Width) + minSize.Height += childMin.Height + if addPadding { + minSize.Height += padding + } + addPadding = true + } + return minSize +} + +// Declare conformity with Layout interface +var _ fyne.Layout = (*hBoxLayout)(nil) + +type hBoxLayout struct { + paddingFunc func() float32 +} + +// Layout is called to pack all child objects into a specified size. +// For a VBoxLayout this will pack objects into a single column where each item +// is full width but the height is the minimum required. +// Any spacers added will pad the view, sharing the space if there are two or more. +func (g hBoxLayout) Layout(objects []fyne.CanvasObject, size fyne.Size) { + spacers := 0 + visibleObjects := 0 + // Size taken up by visible objects + total := float32(0) + + for _, child := range objects { + if !child.Visible() { + continue + } + + if isHorizontalSpacer(child) { + spacers++ + continue + } + + visibleObjects++ + total += child.MinSize().Width + } + + padding := g.paddingFunc() + + // Amount of space not taken up by visible objects and inter-object padding + extra := size.Width - total - (padding * float32(visibleObjects-1)) + + // Spacers split extra space equally + spacerSize := float32(0) + if spacers > 0 { + spacerSize = extra / float32(spacers) + } + + x, y := float32(0), float32(0) + for _, child := range objects { + if !child.Visible() { + continue + } + + if isHorizontalSpacer(child) { + child.Move(fyne.NewPos(x, y)) + child.Resize(fyne.NewSize(spacerSize, size.Height)) + + x += spacerSize + continue + } + child.Move(fyne.NewPos(x, y)) + + width := child.MinSize().Width + x += padding + width + child.Resize(fyne.NewSize(width, size.Height)) + } +} + +// MinSize finds the smallest size that satisfies all the child objects. +// For a BoxLayout this is the width of the widest item and the height is +// the sum of all children combined with padding between each. +func (g hBoxLayout) MinSize(objects []fyne.CanvasObject) fyne.Size { + minSize := fyne.NewSize(0, 0) + addPadding := false + padding := g.paddingFunc() + for _, child := range objects { + if !child.Visible() || isHorizontalSpacer(child) { + continue + } + + childMin := child.MinSize() + minSize.Height = fyne.Max(childMin.Height, minSize.Height) + minSize.Width += childMin.Width + if addPadding { + minSize.Width += padding + } + addPadding = true + } + return minSize +} + +func isVerticalSpacer(obj fyne.CanvasObject) bool { + spacer, ok := obj.(SpacerObject) + return ok && spacer.ExpandVertical() +} + +func isHorizontalSpacer(obj fyne.CanvasObject) bool { + spacer, ok := obj.(SpacerObject) + return ok && spacer.ExpandHorizontal() +} diff --git a/vendor/fyne.io/fyne/v2/layout/centerlayout.go b/vendor/fyne.io/fyne/v2/layout/centerlayout.go new file mode 100644 index 0000000..26766ce --- /dev/null +++ b/vendor/fyne.io/fyne/v2/layout/centerlayout.go @@ -0,0 +1,38 @@ +package layout + +import "fyne.io/fyne/v2" + +// Declare conformity with Layout interface +var _ fyne.Layout = (*centerLayout)(nil) + +type centerLayout struct{} + +// NewCenterLayout creates a new CenterLayout instance +func NewCenterLayout() fyne.Layout { + return ¢erLayout{} +} + +// Layout is called to pack all child objects into a specified size. +// For CenterLayout this sets all children to their minimum size, centered within the space. +func (c *centerLayout) Layout(objects []fyne.CanvasObject, size fyne.Size) { + for _, child := range objects { + childMin := child.MinSize() + child.Resize(childMin) + child.Move(fyne.NewPos((size.Width-childMin.Width)/2, (size.Height-childMin.Height)/2)) + } +} + +// MinSize finds the smallest size that satisfies all the child objects. +// For CenterLayout this is determined simply as the MinSize of the largest child. +func (c *centerLayout) MinSize(objects []fyne.CanvasObject) fyne.Size { + minSize := fyne.NewSize(0, 0) + for _, child := range objects { + if !child.Visible() { + continue + } + + minSize = minSize.Max(child.MinSize()) + } + + return minSize +} diff --git a/vendor/fyne.io/fyne/v2/layout/custompaddedlayout.go b/vendor/fyne.io/fyne/v2/layout/custompaddedlayout.go new file mode 100644 index 0000000..b896994 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/layout/custompaddedlayout.go @@ -0,0 +1,61 @@ +package layout + +import ( + "fyne.io/fyne/v2" +) + +// Declare conformity with Layout interface +var _ fyne.Layout = (*CustomPaddedLayout)(nil) + +// CustomPaddedLayout is a layout similar to PaddedLayout, but uses +// custom values for padding on each side, rather than the theme padding value. +// +// Since: 2.5 +type CustomPaddedLayout struct { + TopPadding float32 + BottomPadding float32 + LeftPadding float32 + RightPadding float32 +} + +// NewCustomPaddedLayout creates a new CustomPaddedLayout instance +// with the specified paddings. +// +// Since: 2.5 +func NewCustomPaddedLayout(padTop, padBottom, padLeft, padRight float32) fyne.Layout { + return CustomPaddedLayout{ + TopPadding: padTop, + BottomPadding: padBottom, + LeftPadding: padLeft, + RightPadding: padRight, + } +} + +// Layout is called to pack all child objects into a specified size. +// For CustomPaddedLayout this sets all children to the full size passed minus the given paddings all around. +func (c CustomPaddedLayout) Layout(objects []fyne.CanvasObject, size fyne.Size) { + pos := fyne.NewPos(c.LeftPadding, c.TopPadding) + siz := fyne.Size{ + Width: size.Width - c.LeftPadding - c.RightPadding, + Height: size.Height - c.TopPadding - c.BottomPadding, + } + for _, child := range objects { + child.Resize(siz) + child.Move(pos) + } +} + +// MinSize finds the smallest size that satisfies all the child objects. +// For CustomPaddedLayout this is determined simply as the MinSize of the largest child plus the given paddings all around. +func (c CustomPaddedLayout) MinSize(objects []fyne.CanvasObject) (min fyne.Size) { + for _, child := range objects { + if !child.Visible() { + continue + } + + min = min.Max(child.MinSize()) + } + min.Width += c.LeftPadding + c.RightPadding + min.Height += c.TopPadding + c.BottomPadding + return min +} diff --git a/vendor/fyne.io/fyne/v2/layout/formlayout.go b/vendor/fyne.io/fyne/v2/layout/formlayout.go new file mode 100644 index 0000000..6e8a5ea --- /dev/null +++ b/vendor/fyne.io/fyne/v2/layout/formlayout.go @@ -0,0 +1,133 @@ +package layout + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/theme" +) + +const formLayoutCols = 2 + +// Declare conformity with Layout interface +var _ fyne.Layout = (*formLayout)(nil) + +// formLayout is two column grid where each row has a label and a widget. +type formLayout struct{} + +// calculateTableSizes calculates the izes of the table. +// This includes the width of the label column (maximum width of all labels), +// the width of the content column (maximum width of all content cells and remaining space in container) +// and the total minimum height of the form. +func (f *formLayout) calculateTableSizes(objects []fyne.CanvasObject, containerWidth float32) (labelWidth float32, contentWidth float32, height float32) { + if len(objects)%formLayoutCols != 0 { + return 0, 0, 0 + } + + rows := 0 + innerPadding := theme.InnerPadding() + for i := 0; i < len(objects); i += formLayoutCols { + labelCell, contentCell := objects[i], objects[i+1] + if !labelCell.Visible() && !contentCell.Visible() { + continue + } + + // Label column width is the maximum of all labels. + labelSize := labelCell.MinSize() + if _, ok := labelCell.(*canvas.Text); ok { + labelSize.Width += innerPadding * 2 + labelSize.Height += innerPadding * 2 + } + labelWidth = fyne.Max(labelWidth, labelSize.Width) + + // Content column width is the maximum of all content items. + contentSize := contentCell.MinSize() + if _, ok := contentCell.(*canvas.Text); ok { + contentSize.Width += innerPadding * 2 + contentSize.Height += innerPadding * 2 + } + contentWidth = fyne.Max(contentWidth, contentSize.Width) + + rowHeight := fyne.Max(labelSize.Height, contentSize.Height) + height += rowHeight + rows++ + } + + padding := theme.Padding() + contentWidth = fyne.Max(contentWidth, containerWidth-labelWidth-padding) + return labelWidth, contentWidth, height + float32(rows-1)*padding +} + +// Layout is called to pack all child objects into a table format with two columns. +func (f *formLayout) Layout(objects []fyne.CanvasObject, size fyne.Size) { + labelWidth, contentWidth, _ := f.calculateTableSizes(objects, size.Width) + + y := float32(0) + padding := theme.Padding() + innerPadding := theme.InnerPadding() + + // Calculate size and position of object. Position and size is returned (instead of calling Move() and Resize()) to make inlineable. + objectLayout := func(obj fyne.CanvasObject, offset, width, rowHeight, itemHeight float32) (fyne.Position, fyne.Size) { + pos := fyne.NewPos(offset, y) + size := fyne.NewSize(width, rowHeight) + if _, ok := obj.(*canvas.Text); ok { + pos = pos.AddXY(innerPadding, innerPadding) + size.Width -= innerPadding * 2 + size.Height = itemHeight + } + + return pos, size + } + + remainder := len(objects) % formLayoutCols + for i := 0; i < len(objects)-remainder; i += formLayoutCols { + labelCell, contentCell := objects[i], objects[i+1] + if !labelCell.Visible() && !contentCell.Visible() { + continue + } + + labelMin := labelCell.MinSize() + contentMin := contentCell.MinSize() + labelHeight := labelMin.Height + contentHeight := contentMin.Height + if _, ok := labelCell.(*canvas.Text); ok { + labelHeight += innerPadding * 2 + } + if _, ok := contentCell.(*canvas.Text); ok { + contentHeight += innerPadding * 2 + } + rowHeight := fyne.Max(labelHeight, contentHeight) + + pos, size := objectLayout(labelCell, 0, labelWidth, rowHeight, labelMin.Height) + labelCell.Move(pos) + labelCell.Resize(size) + + pos, size = objectLayout(contentCell, labelWidth+padding, contentWidth, rowHeight, contentMin.Height) + contentCell.Move(pos) + contentCell.Resize(size) + + y += rowHeight + padding + } + + // Handle remaining item in the case of uneven number of objects: + if remainder == 1 { + lastCell := objects[len(objects)-1] + lastMin := lastCell.MinSize() + objectLayout(lastCell, 0, labelWidth, lastMin.Height, lastMin.Height) + } +} + +// MinSize finds the smallest size that satisfies all the child objects. +// For a FormLayout this is the width of the widest label and content items and the height is +// the sum of all column children combined with padding between each. +func (f *formLayout) MinSize(objects []fyne.CanvasObject) fyne.Size { + labelWidth, contentWidth, height := f.calculateTableSizes(objects, 0) + return fyne.Size{ + Width: labelWidth + contentWidth + theme.Padding(), + Height: height, + } +} + +// NewFormLayout returns a new FormLayout instance +func NewFormLayout() fyne.Layout { + return &formLayout{} +} diff --git a/vendor/fyne.io/fyne/v2/layout/gridlayout.go b/vendor/fyne.io/fyne/v2/layout/gridlayout.go new file mode 100644 index 0000000..316b2ed --- /dev/null +++ b/vendor/fyne.io/fyne/v2/layout/gridlayout.go @@ -0,0 +1,156 @@ +package layout + +import ( + "math" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/theme" +) + +// Declare conformity with Layout interface +var _ fyne.Layout = (*gridLayout)(nil) + +type gridLayout struct { + Cols int + vertical, adapt bool +} + +// NewAdaptiveGridLayout returns a new grid layout which uses columns when horizontal but rows when vertical. +func NewAdaptiveGridLayout(rowcols int) fyne.Layout { + return &gridLayout{Cols: rowcols, adapt: true} +} + +// NewGridLayout returns a grid layout arranged in a specified number of columns. +// The number of rows will depend on how many children are in the container that uses this layout. +func NewGridLayout(cols int) fyne.Layout { + return NewGridLayoutWithColumns(cols) +} + +// NewGridLayoutWithColumns returns a new grid layout that specifies a column count and wrap to new rows when needed. +func NewGridLayoutWithColumns(cols int) fyne.Layout { + return &gridLayout{Cols: cols} +} + +// NewGridLayoutWithRows returns a new grid layout that specifies a row count that creates new rows as required. +func NewGridLayoutWithRows(rows int) fyne.Layout { + return &gridLayout{Cols: rows, vertical: true} +} + +func (g *gridLayout) horizontal() bool { + if g.adapt { + return fyne.IsHorizontal(fyne.CurrentDevice().Orientation()) + } + + return !g.vertical +} + +func (g *gridLayout) countRows(objects []fyne.CanvasObject) int { + if g.Cols < 1 { + g.Cols = 1 + } + count := 0 + for _, child := range objects { + if child.Visible() { + count++ + } + } + + return int(math.Ceil(float64(count) / float64(g.Cols))) +} + +// Get the leading (top or left) edge of a grid cell. +// size is the ideal cell size and the offset is which col or row its on. +func getLeading(size float64, offset int) float32 { + ret := (size + float64(theme.Padding())) * float64(offset) + return float32(ret) +} + +// Get the trailing (bottom or right) edge of a grid cell. +// size is the ideal cell size and the offset is which col or row its on. +func getTrailing(size float64, offset int) float32 { + return getLeading(size, offset+1) - theme.Padding() +} + +// Layout is called to pack all child objects into a specified size. +// For a GridLayout this will pack objects into a table format with the number +// of columns specified in our constructor. +func (g *gridLayout) Layout(objects []fyne.CanvasObject, size fyne.Size) { + rows := g.countRows(objects) + + padding := theme.Padding() + + primaryObjects := rows + secondaryObjects := g.Cols + if g.horizontal() { + primaryObjects, secondaryObjects = secondaryObjects, primaryObjects + } + + padWidth := float32(primaryObjects-1) * padding + padHeight := float32(secondaryObjects-1) * padding + cellWidth := float64(size.Width-padWidth) / float64(primaryObjects) + cellHeight := float64(size.Height-padHeight) / float64(secondaryObjects) + + row, col := 0, 0 + i := 0 + for _, child := range objects { + if !child.Visible() { + continue + } + + x1 := getLeading(cellWidth, col) + y1 := getLeading(cellHeight, row) + x2 := getTrailing(cellWidth, col) + y2 := getTrailing(cellHeight, row) + + child.Move(fyne.NewPos(x1, y1)) + child.Resize(fyne.NewSize(x2-x1, y2-y1)) + + if g.horizontal() { + if (i+1)%g.Cols == 0 { + row++ + col = 0 + } else { + col++ + } + } else { + if (i+1)%g.Cols == 0 { + col++ + row = 0 + } else { + row++ + } + } + i++ + } +} + +// MinSize finds the smallest size that satisfies all the child objects. +// For a GridLayout this is the size of the largest child object multiplied by +// the required number of columns and rows, with appropriate padding between +// children. +func (g *gridLayout) MinSize(objects []fyne.CanvasObject) fyne.Size { + rows := g.countRows(objects) + minSize := fyne.NewSize(0, 0) + for _, child := range objects { + if !child.Visible() { + continue + } + + minSize = minSize.Max(child.MinSize()) + } + + padding := theme.Padding() + + primaryObjects := rows + secondaryObjects := g.Cols + if g.horizontal() { + primaryObjects, secondaryObjects = secondaryObjects, primaryObjects + } + + width := minSize.Width * float32(primaryObjects) + height := minSize.Height * float32(secondaryObjects) + xpad := padding * fyne.Max(float32(primaryObjects-1), 0) + ypad := padding * fyne.Max(float32(secondaryObjects-1), 0) + + return fyne.NewSize(width+xpad, height+ypad) +} diff --git a/vendor/fyne.io/fyne/v2/layout/gridwraplayout.go b/vendor/fyne.io/fyne/v2/layout/gridwraplayout.go new file mode 100644 index 0000000..ec58aa5 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/layout/gridwraplayout.go @@ -0,0 +1,70 @@ +package layout + +import ( + "math" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/theme" +) + +// Declare conformity with Layout interface +var _ fyne.Layout = (*gridWrapLayout)(nil) + +type gridWrapLayout struct { + CellSize fyne.Size + colCount int + rowCount int +} + +// NewGridWrapLayout returns a new GridWrapLayout instance +func NewGridWrapLayout(size fyne.Size) fyne.Layout { + return &gridWrapLayout{size, 1, 1} +} + +// Layout is called to pack all child objects into a specified size. +// For a GridWrapLayout this will attempt to lay all the child objects in a row +// and wrap to a new row if the size is not large enough. +func (g *gridWrapLayout) Layout(objects []fyne.CanvasObject, size fyne.Size) { + padding := theme.Padding() + g.colCount = 1 + g.rowCount = 0 + + if size.Width > g.CellSize.Width { + g.colCount = int(math.Floor(float64(size.Width+padding) / float64(g.CellSize.Width+padding))) + } + + i, x, y := 0, float32(0), float32(0) + for _, child := range objects { + if !child.Visible() { + continue + } + + if i%g.colCount == 0 { + g.rowCount++ + } + + child.Move(fyne.NewPos(x, y)) + child.Resize(g.CellSize) + + if (i+1)%g.colCount == 0 { + x = 0 + y += g.CellSize.Height + padding + } else { + x += g.CellSize.Width + padding + } + i++ + } +} + +// MinSize finds the smallest size that satisfies all the child objects. +// For a GridWrapLayout this is simply the specified cellsize as a single column +// layout has no padding. The returned size does not take into account the number +// of columns as this layout re-flows dynamically. +func (g *gridWrapLayout) MinSize(objects []fyne.CanvasObject) fyne.Size { + rows := g.rowCount + if rows < 1 { + rows = 1 + } + return fyne.NewSize(g.CellSize.Width, + (g.CellSize.Height*float32(rows))+(float32(rows-1)*theme.Padding())) +} diff --git a/vendor/fyne.io/fyne/v2/layout/paddedlayout.go b/vendor/fyne.io/fyne/v2/layout/paddedlayout.go new file mode 100644 index 0000000..d8ceb55 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/layout/paddedlayout.go @@ -0,0 +1,44 @@ +package layout + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/theme" +) + +// Declare conformity with Layout interface +var _ fyne.Layout = (*paddedLayout)(nil) + +type paddedLayout struct{} + +// Layout is called to pack all child objects into a specified size. +// For PaddedLayout this sets all children to the full size passed minus padding all around. +func (l paddedLayout) Layout(objects []fyne.CanvasObject, size fyne.Size) { + padding := theme.Padding() + pos := fyne.NewSquareOffsetPos(padding) + siz := fyne.NewSize(size.Width-2*padding, size.Height-2*padding) + for _, child := range objects { + child.Resize(siz) + child.Move(pos) + } +} + +// MinSize finds the smallest size that satisfies all the child objects. +// For PaddedLayout this is determined simply as the MinSize of the largest child plus padding all around. +func (l paddedLayout) MinSize(objects []fyne.CanvasObject) (min fyne.Size) { + for _, child := range objects { + if !child.Visible() { + continue + } + + min = min.Max(child.MinSize()) + } + min = min.Add(fyne.NewSquareSize(2 * theme.Padding())) + return min +} + +// NewPaddedLayout creates a new PaddedLayout instance +// +// Since: 1.4 +func NewPaddedLayout() fyne.Layout { + return paddedLayout{} +} diff --git a/vendor/fyne.io/fyne/v2/layout/rowwrap.go b/vendor/fyne.io/fyne/v2/layout/rowwrap.go new file mode 100644 index 0000000..b66c3bd --- /dev/null +++ b/vendor/fyne.io/fyne/v2/layout/rowwrap.go @@ -0,0 +1,106 @@ +package layout + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/theme" +) + +type rowWrapLayout struct { + horizontalPadding float32 + minSize fyne.Size + verticalPadding float32 +} + +// NewRowWrapLayout returns a layout that dynamically arranges objects of similar height +// in rows and wraps them dynamically. +// Objects are separated with horizontal and vertical padding. +// +// Since: 2.7 +func NewRowWrapLayout() fyne.Layout { + p := theme.Padding() + return &rowWrapLayout{ + horizontalPadding: p, + verticalPadding: p, + } +} + +// NewRowWrapLayoutWithCustomPadding returns a new RowWrapLayout instance +// with custom horizontal and inner padding. +// +// Since: 2.7 +func NewRowWrapLayoutWithCustomPadding(horizontal, vertical float32) fyne.Layout { + return &rowWrapLayout{ + horizontalPadding: horizontal, + verticalPadding: vertical, + } +} + +var _ fyne.Layout = (*rowWrapLayout)(nil) + +// MinSize finds the smallest size that satisfies all the child objects. +// For a RowWrapLayout this is initially the width of the widest child +// and the height of the tallest child multiplied by the number of children, +// with appropriate padding between them. +// After Layout() has run it returns the actual min size. +func (l *rowWrapLayout) MinSize(objects []fyne.CanvasObject) fyne.Size { + if len(objects) == 0 { + return fyne.NewSize(0, 0) + } + if !l.minSize.IsZero() { + return l.minSize + } + var maxW, maxH float32 + var objCount int + for _, o := range objects { + if !o.Visible() { + continue + } + objCount++ + s := o.MinSize() + maxW = fyne.Max(maxW, s.Width) + maxH = fyne.Max(maxH, s.Height) + } + return fyne.NewSize(maxW, l.minHeight(maxH, objCount)) +} + +func (l *rowWrapLayout) minHeight(rowHeight float32, rowCount int) float32 { + return rowHeight*float32(rowCount) + l.verticalPadding*float32(rowCount-1) +} + +// Layout is called to pack all child objects into a specified size. +// For RowWrapLayout this will arrange all objects into rows of equal size +// and wrap objects into additional rows as needed. +func (l *rowWrapLayout) Layout(objects []fyne.CanvasObject, containerSize fyne.Size) { + if len(objects) == 0 { + return + } + var maxH float32 + for _, o := range objects { + if !o.Visible() { + continue + } + maxH = fyne.Max(maxH, o.MinSize().Height) + } + var minSize fyne.Size + pos := fyne.NewPos(0, 0) + rows := 1 + isFirst := true + for _, o := range objects { + if !o.Visible() { + continue + } + size := o.MinSize() + o.Resize(size) + if !isFirst && pos.X+size.Width+l.horizontalPadding >= containerSize.Width { + y := float32(rows) * (maxH + l.verticalPadding) + pos = fyne.NewPos(0, y) + rows++ + } + isFirst = false + minSize.Width = fyne.Max(minSize.Width, pos.X+size.Width) + minSize.Height = l.minHeight(maxH, rows) + o.Move(pos) + pos = pos.Add(fyne.NewPos(size.Width+l.horizontalPadding, 0)) + } + l.minSize = minSize +} diff --git a/vendor/fyne.io/fyne/v2/layout/spacer.go b/vendor/fyne.io/fyne/v2/layout/spacer.go new file mode 100644 index 0000000..589ea69 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/layout/spacer.go @@ -0,0 +1,80 @@ +package layout + +import "fyne.io/fyne/v2" + +// SpacerObject is any object that can be used to space out child objects +type SpacerObject interface { + ExpandVertical() bool + ExpandHorizontal() bool +} + +// Spacer is any simple object that can be used in a box layout to space +// out child objects +type Spacer struct { + FixHorizontal bool + FixVertical bool + + size fyne.Size + pos fyne.Position + hidden bool +} + +// NewSpacer returns a spacer object which can fill vertical and horizontal +// space. This is primarily used with a box layout. +func NewSpacer() fyne.CanvasObject { + return &Spacer{} +} + +// ExpandVertical returns whether or not this spacer expands on the vertical axis +func (s *Spacer) ExpandVertical() bool { + return !s.FixVertical +} + +// ExpandHorizontal returns whether or not this spacer expands on the horizontal axis +func (s *Spacer) ExpandHorizontal() bool { + return !s.FixHorizontal +} + +// Size returns the current size of this Spacer +func (s *Spacer) Size() fyne.Size { + return s.size +} + +// Resize sets a new size for the Spacer - this will be called by the layout +func (s *Spacer) Resize(size fyne.Size) { + s.size = size +} + +// Position returns the current position of this Spacer +func (s *Spacer) Position() fyne.Position { + return s.pos +} + +// Move sets a new position for the Spacer - this will be called by the layout +func (s *Spacer) Move(pos fyne.Position) { + s.pos = pos +} + +// MinSize returns a 0 size as a Spacer can shrink to no actual size +func (s *Spacer) MinSize() fyne.Size { + return fyne.NewSize(0, 0) +} + +// Visible returns true if this spacer should affect the layout +func (s *Spacer) Visible() bool { + return !s.hidden +} + +// Show sets the Spacer to be part of the layout calculations +func (s *Spacer) Show() { + s.hidden = false +} + +// Hide removes this Spacer from layout calculations +func (s *Spacer) Hide() { + s.hidden = true +} + +// Refresh does nothing for a spacer but is part of the CanvasObject definition +func (s *Spacer) Refresh() { +} diff --git a/vendor/fyne.io/fyne/v2/layout/stacklayout.go b/vendor/fyne.io/fyne/v2/layout/stacklayout.go new file mode 100644 index 0000000..a8f896a --- /dev/null +++ b/vendor/fyne.io/fyne/v2/layout/stacklayout.go @@ -0,0 +1,51 @@ +// Package layout defines the various layouts available to Fyne apps. +package layout // import "fyne.io/fyne/v2/layout" + +import "fyne.io/fyne/v2" + +// Declare conformity with Layout interface +var _ fyne.Layout = (*stackLayout)(nil) + +type stackLayout struct{} + +// NewStackLayout returns a new StackLayout instance. Objects are stacked +// on top of each other with later objects on top of those before. +// Having only a single object has no impact as CanvasObjects will +// fill the available space even without a Stack. +// +// Since: 2.4 +func NewStackLayout() fyne.Layout { + return stackLayout{} +} + +// NewMaxLayout creates a new MaxLayout instance +// +// Deprecated: Use layout.NewStackLayout() instead. +func NewMaxLayout() fyne.Layout { + return NewStackLayout() +} + +// Layout is called to pack all child objects into a specified size. +// For StackLayout this sets all children to the full size passed. +func (m stackLayout) Layout(objects []fyne.CanvasObject, size fyne.Size) { + topLeft := fyne.NewPos(0, 0) + for _, child := range objects { + child.Resize(size) + child.Move(topLeft) + } +} + +// MinSize finds the smallest size that satisfies all the child objects. +// For StackLayout this is determined simply as the MinSize of the largest child. +func (m stackLayout) MinSize(objects []fyne.CanvasObject) fyne.Size { + minSize := fyne.NewSize(0, 0) + for _, child := range objects { + if !child.Visible() { + continue + } + + minSize = minSize.Max(child.MinSize()) + } + + return minSize +} diff --git a/vendor/fyne.io/fyne/v2/locale.go b/vendor/fyne.io/fyne/v2/locale.go new file mode 100644 index 0000000..a7b1bf4 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/locale.go @@ -0,0 +1,25 @@ +package fyne + +import "strings" + +// Locale represents a user's locale (language, region and script) +// +// Since: 2.5 +type Locale string + +// LanguageString returns a version of the local without the script portion. +// For example "en" or "fr-FR". +func (l Locale) LanguageString() string { + count := strings.Count(string(l), "-") + if count < 2 { + return string(l) + } + + pos := strings.LastIndex(string(l), "-") + return string(l)[:pos] +} + +// String returns the complete locale as a standard string. +func (l Locale) String() string { + return string(l) +} diff --git a/vendor/fyne.io/fyne/v2/log.go b/vendor/fyne.io/fyne/v2/log.go new file mode 100644 index 0000000..53cd1b2 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/log.go @@ -0,0 +1,21 @@ +package fyne + +import ( + "log" + "runtime" +) + +// LogError reports an error to the command line with the specified err cause, +// if not nil. +// The function also reports basic information about the code location. +func LogError(reason string, err error) { + log.Println("Fyne error: ", reason) + if err != nil { + log.Println(" Cause:", err) + } + + _, file, line, ok := runtime.Caller(1) + if ok { + log.Printf(" At: %s:%d", file, line) + } +} diff --git a/vendor/fyne.io/fyne/v2/math.go b/vendor/fyne.io/fyne/v2/math.go new file mode 100644 index 0000000..3f66064 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/math.go @@ -0,0 +1,17 @@ +package fyne + +// Min returns the smaller of the passed values. +func Min(x, y float32) float32 { + if x < y { + return x + } + return y +} + +// Max returns the larger of the passed values. +func Max(x, y float32) float32 { + if x > y { + return x + } + return y +} diff --git a/vendor/fyne.io/fyne/v2/menu.go b/vendor/fyne.io/fyne/v2/menu.go new file mode 100644 index 0000000..6cbbccf --- /dev/null +++ b/vendor/fyne.io/fyne/v2/menu.go @@ -0,0 +1,100 @@ +package fyne + +type systemTrayDriver interface { + Driver + SetSystemTrayMenu(*Menu) + SystemTrayMenu() *Menu +} + +// Menu stores the information required for a standard menu. +// A menu can pop down from a [MainMenu] or could be a pop out menu. +type Menu struct { + Label string + Items []*MenuItem +} + +// NewMenu creates a new menu given the specified label (to show in a [MainMenu]) and list of items to display. +func NewMenu(label string, items ...*MenuItem) *Menu { + return &Menu{Label: label, Items: items} +} + +// Refresh will instruct this menu to update its display. +// +// Since: 2.2 +func (m *Menu) Refresh() { + for _, w := range CurrentApp().Driver().AllWindows() { + main := w.MainMenu() + if main != nil { + for _, menu := range main.Items { + if menu == m { + w.SetMainMenu(main) + break + } + } + } + } + + if d, ok := CurrentApp().Driver().(systemTrayDriver); ok { + if m == d.SystemTrayMenu() { + d.SetSystemTrayMenu(m) + } + } +} + +// MenuItem is a single item within any menu, it contains a display Label and Action function that is called when tapped. +type MenuItem struct { + ChildMenu *Menu + // Since: 2.1 + IsQuit bool + IsSeparator bool + Label string + Action func() `json:"-"` + // Since: 2.1 + Disabled bool + // Since: 2.1 + Checked bool + // Since: 2.2 + Icon Resource + // Since: 2.2 + Shortcut Shortcut +} + +// NewMenuItem creates a new menu item from the passed label and action parameters. +func NewMenuItem(label string, action func()) *MenuItem { + return &MenuItem{Label: label, Action: action} +} + +// NewMenuItemWithIcon creates a new menu item from the passed label, icon, and action parameters. +// +// Since: 2.7 +func NewMenuItemWithIcon(label string, icon Resource, action func()) *MenuItem { + return &MenuItem{Label: label, Icon: icon, Action: action} +} + +// NewMenuItemSeparator creates a menu item that is to be used as a separator. +func NewMenuItemSeparator() *MenuItem { + return &MenuItem{IsSeparator: true, Action: func() {}} +} + +// MainMenu defines the data required to show a menu bar (desktop) or other appropriate top level menu. +type MainMenu struct { + Items []*Menu +} + +// NewMainMenu creates a top level menu structure used by fyne.Window for displaying a menubar +// (or appropriate equivalent). +func NewMainMenu(items ...*Menu) *MainMenu { + return &MainMenu{Items: items} +} + +// Refresh will instruct any rendered menus using this struct to update their display. +// +// Since: 2.2 +func (m *MainMenu) Refresh() { + for _, w := range CurrentApp().Driver().AllWindows() { + menu := w.MainMenu() + if menu != nil && menu == m { + w.SetMainMenu(m) + } + } +} diff --git a/vendor/fyne.io/fyne/v2/notification.go b/vendor/fyne.io/fyne/v2/notification.go new file mode 100644 index 0000000..a068623 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/notification.go @@ -0,0 +1,11 @@ +package fyne + +// Notification represents a user notification that can be sent to the operating system. +type Notification struct { + Title, Content string +} + +// NewNotification creates a notification that can be passed to [App.SendNotification]. +func NewNotification(title, content string) *Notification { + return &Notification{Title: title, Content: content} +} diff --git a/vendor/fyne.io/fyne/v2/overlay_stack.go b/vendor/fyne.io/fyne/v2/overlay_stack.go new file mode 100644 index 0000000..eb7c9c7 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/overlay_stack.go @@ -0,0 +1,13 @@ +package fyne + +// OverlayStack is a stack of [CanvasObject]s intended to be used as overlays of a [Canvas]. +type OverlayStack interface { + // Add adds an overlay on the top of the overlay stack. + Add(overlay CanvasObject) + // List returns the overlays currently on the overlay stack. + List() []CanvasObject + // Remove removes the given object and all objects above it from the overlay stack. + Remove(overlay CanvasObject) + // Top returns the top-most object of the overlay stack. + Top() CanvasObject +} diff --git a/vendor/fyne.io/fyne/v2/preferences.go b/vendor/fyne.io/fyne/v2/preferences.go new file mode 100644 index 0000000..ead1293 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/preferences.go @@ -0,0 +1,95 @@ +package fyne + +// Preferences describes the ways that an app can save and load user preferences +type Preferences interface { + // Bool looks up a bool value for the key + Bool(key string) bool + // BoolWithFallback looks up a bool value and returns the given fallback if not found + BoolWithFallback(key string, fallback bool) bool + // SetBool saves a bool value for the given key + SetBool(key string, value bool) + + // BoolList looks up a list of bool values for the key + // + // Since: 2.4 + BoolList(key string) []bool + // BoolListWithFallback looks up a list of bool values and returns the given fallback if not found + // + // Since: 2.4 + BoolListWithFallback(key string, fallback []bool) []bool + // SetBoolList saves a list of bool values for the given key + // + // Since: 2.4 + SetBoolList(key string, value []bool) + + // Float looks up a float64 value for the key + Float(key string) float64 + // FloatWithFallback looks up a float64 value and returns the given fallback if not found + FloatWithFallback(key string, fallback float64) float64 + // SetFloat saves a float64 value for the given key + SetFloat(key string, value float64) + + // FloatList looks up a list of float64 values for the key + // + // Since: 2.4 + FloatList(key string) []float64 + // FloatListWithFallback looks up a list of float64 values and returns the given fallback if not found + // + // Since: 2.4 + FloatListWithFallback(key string, fallback []float64) []float64 + // SetFloatList saves a list of float64 values for the given key + // + // Since: 2.4 + SetFloatList(key string, value []float64) + + // Int looks up an integer value for the key + Int(key string) int + // IntWithFallback looks up an integer value and returns the given fallback if not found + IntWithFallback(key string, fallback int) int + // SetInt saves an integer value for the given key + SetInt(key string, value int) + + // IntList looks up a list of int values for the key + // + // Since: 2.4 + IntList(key string) []int + // IntListWithFallback looks up a list of int values and returns the given fallback if not found + // + // Since: 2.4 + IntListWithFallback(key string, fallback []int) []int + // SetIntList saves a list of string values for the given key + // + // Since: 2.4 + SetIntList(key string, value []int) + + // String looks up a string value for the key + String(key string) string + // StringWithFallback looks up a string value and returns the given fallback if not found + StringWithFallback(key, fallback string) string + // SetString saves a string value for the given key + SetString(key string, value string) + + // StringList looks up a list of string values for the key + // + // Since: 2.4 + StringList(key string) []string + // StringListWithFallback looks up a list of string values and returns the given fallback if not found + // + // Since: 2.4 + StringListWithFallback(key string, fallback []string) []string + // SetStringList saves a list of string values for the given key + // + // Since: 2.4 + SetStringList(key string, value []string) + + // RemoveValue removes a value for the given key (not currently supported on iOS) + RemoveValue(key string) + + // AddChangeListener allows code to be notified when some preferences change. This will fire on any update. + AddChangeListener(func()) + + // ChangeListeners returns a list of the known change listeners for this preference set. + // + // Since: 2.3 + ChangeListeners() []func() +} diff --git a/vendor/fyne.io/fyne/v2/resource.go b/vendor/fyne.io/fyne/v2/resource.go new file mode 100644 index 0000000..95e3237 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/resource.go @@ -0,0 +1,84 @@ +package fyne + +import ( + "io" + "net/http" + "os" + "path/filepath" +) + +// Resource represents a single binary resource, such as an image or font. +// A resource has an identifying name and byte array content. +// The serialised path of a resource can be obtained which may result in a +// blocking filesystem write operation. +type Resource interface { + Name() string + Content() []byte +} + +// ThemedResource is a version of a resource that can be updated to match a certain theme color. +// The [ThemeColorName] will be used to look up the color for the current theme and colorize the resource. +// +// Since: 2.5 +type ThemedResource interface { + Resource + ThemeColorName() ThemeColorName +} + +// StaticResource is a bundled resource compiled into the application. +// These resources are normally generated by the fyne_bundle command included in +// the Fyne toolkit. +type StaticResource struct { + StaticName string + StaticContent []byte +} + +// Name returns the unique name of this resource, usually matching the file it +// was generated from. +func (r *StaticResource) Name() string { + return r.StaticName +} + +// Content returns the bytes of the bundled resource, no compression is applied +// but any compression on the resource is retained. +func (r *StaticResource) Content() []byte { + return r.StaticContent +} + +// NewStaticResource returns a new static resource object with the specified +// name and content. Creating a new static resource in memory results in +// sharable binary data that may be serialised to the system cache location. +func NewStaticResource(name string, content []byte) *StaticResource { + return &StaticResource{ + StaticName: name, + StaticContent: content, + } +} + +// LoadResourceFromPath creates a new [StaticResource] in memory using the contents of the specified file. +func LoadResourceFromPath(path string) (Resource, error) { + bytes, err := os.ReadFile(filepath.Clean(path)) + if err != nil { + return nil, err + } + + name := filepath.Base(path) + return NewStaticResource(name, bytes), nil +} + +// LoadResourceFromURLString creates a new [StaticResource] in memory using the body of the specified URL. +func LoadResourceFromURLString(urlStr string) (Resource, error) { + res, err := http.Get(urlStr) + if err != nil { + return nil, err + } + defer res.Body.Close() + + bytes, err := io.ReadAll(res.Body) + if err != nil { + return nil, err + } + + name := filepath.Base(urlStr) + return NewStaticResource(name, bytes), nil +} diff --git a/vendor/fyne.io/fyne/v2/scroll.go b/vendor/fyne.io/fyne/v2/scroll.go new file mode 100644 index 0000000..98082d2 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/scroll.go @@ -0,0 +1,18 @@ +package fyne + +// ScrollDirection represents the directions in which a scrollable container or widget can scroll its child content. +// +// Since: 2.6 +type ScrollDirection int + +// Constants for valid values of ScrollDirection used in containers and widgets. +const ( + // ScrollBoth supports horizontal and vertical scrolling. + ScrollBoth ScrollDirection = iota + // ScrollHorizontalOnly specifies the scrolling should only happen left to right. + ScrollHorizontalOnly + // ScrollVerticalOnly specifies the scrolling should only happen top to bottom. + ScrollVerticalOnly + // ScrollNone turns off scrolling for this container. + ScrollNone +) diff --git a/vendor/fyne.io/fyne/v2/serialise.go b/vendor/fyne.io/fyne/v2/serialise.go new file mode 100644 index 0000000..e845fa3 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/serialise.go @@ -0,0 +1,26 @@ +package fyne + +import ( + "fmt" + "strings" +) + +// GoString converts a Resource object to Go code. +// This is useful if serialising to a Go file for compilation into a binary. +func (r *StaticResource) GoString() string { + buffer := strings.Builder{} + + buffer.WriteString("&fyne.StaticResource{\n\tStaticName: \"") + buffer.WriteString(r.StaticName) + buffer.WriteString("\",\n\tStaticContent: []byte{\n\t\t") + for i, v := range r.StaticContent { + if i > 0 { + buffer.WriteString(", ") + } + + fmt.Fprint(&buffer, v) + } + buffer.WriteString("}}") + + return buffer.String() +} diff --git a/vendor/fyne.io/fyne/v2/settings.go b/vendor/fyne.io/fyne/v2/settings.go new file mode 100644 index 0000000..234c4a6 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/settings.go @@ -0,0 +1,44 @@ +package fyne + +// BuildType defines different modes that an application can be built using. +type BuildType int + +const ( + // BuildStandard is the normal build mode - it is not debug, test or release mode. + BuildStandard BuildType = iota + // BuildDebug is used when a developer would like more information and visual output for app debugging. + BuildDebug + // BuildRelease is a final production build, it is like [BuildStandard] but will use distribution certificates. + // A release build is typically going to connect to live services and is not usually used during development. + BuildRelease +) + +// Settings describes the application configuration available. +type Settings interface { + Theme() Theme + SetTheme(Theme) + // ThemeVariant defines which preferred version of a theme should be used (i.e. light or dark) + // + // Since: 2.0 + ThemeVariant() ThemeVariant + Scale() float32 + // PrimaryColor indicates a user preference for a named primary color + // + // Since: 1.4 + PrimaryColor() string + + // AddChangeListener subscribes to settings change events over a channel. + // + // Deprecated: Use AddListener instead, which uses a callback-based API + // with the callback guaranteed to be invoked on the app goroutine. + AddChangeListener(chan Settings) + + // AddListener registers a callback that is invoked whenever the settings change. + // + // Since: 2.6 + AddListener(func(Settings)) + + BuildType() BuildType + + ShowAnimations() bool +} diff --git a/vendor/fyne.io/fyne/v2/shortcut.go b/vendor/fyne.io/fyne/v2/shortcut.go new file mode 100644 index 0000000..55c38b1 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/shortcut.go @@ -0,0 +1,172 @@ +package fyne + +import "sync" + +// ShortcutHandler is a default implementation of the shortcut handler +// for [CanvasObject]. +type ShortcutHandler struct { + entry sync.Map // map[string]func(Shortcut) +} + +// TypedShortcut handle the registered shortcut +func (sh *ShortcutHandler) TypedShortcut(shortcut Shortcut) { + val, ok := sh.entry.Load(shortcut.ShortcutName()) + if !ok { + return + } + + f := val.(func(Shortcut)) + f(shortcut) +} + +// AddShortcut register a handler to be executed when the shortcut action is triggered +func (sh *ShortcutHandler) AddShortcut(shortcut Shortcut, handler func(shortcut Shortcut)) { + sh.entry.Store(shortcut.ShortcutName(), handler) +} + +// RemoveShortcut removes a registered shortcut +func (sh *ShortcutHandler) RemoveShortcut(shortcut Shortcut) { + sh.entry.Delete(shortcut.ShortcutName()) +} + +// Shortcut is the interface used to describe a shortcut action +type Shortcut interface { + ShortcutName() string +} + +// KeyboardShortcut describes a shortcut meant to be triggered by a keyboard action. +type KeyboardShortcut interface { + Shortcut + Key() KeyName + Mod() KeyModifier +} + +var _ KeyboardShortcut = (*ShortcutPaste)(nil) + +// ShortcutPaste describes a shortcut paste action. +type ShortcutPaste struct { + Clipboard Clipboard +} + +// Key returns the [KeyName] for this shortcut. +func (se *ShortcutPaste) Key() KeyName { + return KeyV +} + +// Mod returns the [KeyModifier] for this shortcut. +func (se *ShortcutPaste) Mod() KeyModifier { + return KeyModifierShortcutDefault +} + +// ShortcutName returns the shortcut name +func (se *ShortcutPaste) ShortcutName() string { + return "Paste" +} + +var _ KeyboardShortcut = (*ShortcutCopy)(nil) + +// ShortcutCopy describes a shortcut copy action. +type ShortcutCopy struct { + Clipboard Clipboard +} + +// Key returns the [KeyName] for this shortcut. +func (se *ShortcutCopy) Key() KeyName { + return KeyC +} + +// Mod returns the [KeyModifier] for this shortcut. +func (se *ShortcutCopy) Mod() KeyModifier { + return KeyModifierShortcutDefault +} + +// ShortcutName returns the shortcut name +func (se *ShortcutCopy) ShortcutName() string { + return "Copy" +} + +var _ KeyboardShortcut = (*ShortcutCut)(nil) + +// ShortcutCut describes a shortcut cut action. +type ShortcutCut struct { + Clipboard Clipboard +} + +// Key returns the [KeyName] for this shortcut. +func (se *ShortcutCut) Key() KeyName { + return KeyX +} + +// Mod returns the [KeyModifier] for this shortcut. +func (se *ShortcutCut) Mod() KeyModifier { + return KeyModifierShortcutDefault +} + +// ShortcutName returns the shortcut name +func (se *ShortcutCut) ShortcutName() string { + return "Cut" +} + +var _ KeyboardShortcut = (*ShortcutSelectAll)(nil) + +// ShortcutSelectAll describes a shortcut selectAll action. +type ShortcutSelectAll struct{} + +// Key returns the [KeyName] for this shortcut. +func (se *ShortcutSelectAll) Key() KeyName { + return KeyA +} + +// Mod returns the [KeyModifier] for this shortcut. +func (se *ShortcutSelectAll) Mod() KeyModifier { + return KeyModifierShortcutDefault +} + +// ShortcutName returns the shortcut name +func (se *ShortcutSelectAll) ShortcutName() string { + return "SelectAll" +} + +var _ KeyboardShortcut = (*ShortcutUndo)(nil) + +// ShortcutUndo describes a shortcut undo action. +// +// Since: 2.5 +type ShortcutUndo struct{} + +// Key returns the [KeyName] for this shortcut. +func (se *ShortcutUndo) Key() KeyName { + return KeyZ +} + +// Mod returns the [KeyModifier] for this shortcut. +func (se *ShortcutUndo) Mod() KeyModifier { + return KeyModifierShortcutDefault +} + +// ShortcutName returns the shortcut name +func (se *ShortcutUndo) ShortcutName() string { + return "Undo" +} + +var _ KeyboardShortcut = (*ShortcutRedo)(nil) + +// ShortcutRedo describes a shortcut redo action. +// +// Since: 2.5 +type ShortcutRedo struct{} + +// Key returns the [KeyName] for this shortcut. +func (se *ShortcutRedo) Key() KeyName { + return KeyY +} + +// Mod returns the [KeyModifier] for this shortcut. +func (se *ShortcutRedo) Mod() KeyModifier { + return KeyModifierShortcutDefault +} + +// ShortcutName returns the shortcut name +func (se *ShortcutRedo) ShortcutName() string { + return "Redo" +} diff --git a/vendor/fyne.io/fyne/v2/staticcheck.conf b/vendor/fyne.io/fyne/v2/staticcheck.conf new file mode 100644 index 0000000..2817485 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/staticcheck.conf @@ -0,0 +1 @@ +checks = ["inherit", "ST1003", "ST1016", "ST1020", "ST1021", "ST1022"] diff --git a/vendor/fyne.io/fyne/v2/storage.go b/vendor/fyne.io/fyne/v2/storage.go new file mode 100644 index 0000000..f6f8585 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/storage.go @@ -0,0 +1,14 @@ +package fyne + +// Storage is used to manage file storage inside an application sandbox. +// The files managed by this interface are unique to the current application. +type Storage interface { + RootURI() URI + + Create(name string) (URIWriteCloser, error) + Open(name string) (URIReadCloser, error) + Save(name string) (URIWriteCloser, error) + Remove(name string) error + + List() []string +} diff --git a/vendor/fyne.io/fyne/v2/storage/errors.go b/vendor/fyne.io/fyne/v2/storage/errors.go new file mode 100644 index 0000000..34da267 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/storage/errors.go @@ -0,0 +1,15 @@ +package storage + +import "errors" + +var ( + // ErrAlreadyExists may be thrown by docs. E.g., save a document twice. + // + // Since: 2.3 + ErrAlreadyExists = errors.New("document already exists") + + // ErrNotExists may be thrown by docs. E.g., save an unknown document. + // + // Since: 2.3 + ErrNotExists = errors.New("document does not exist") +) diff --git a/vendor/fyne.io/fyne/v2/storage/file.go b/vendor/fyne.io/fyne/v2/storage/file.go new file mode 100644 index 0000000..42813fd --- /dev/null +++ b/vendor/fyne.io/fyne/v2/storage/file.go @@ -0,0 +1,48 @@ +// Package storage provides storage access and management functionality. +package storage + +import ( + "errors" + + "fyne.io/fyne/v2" +) + +// OpenFileFromURI loads a file read stream from a resource identifier. +// This is mostly provided so that file references can be saved using their URI and loaded again later. +// +// Deprecated: this has been replaced by storage.Reader(URI) +func OpenFileFromURI(uri fyne.URI) (fyne.URIReadCloser, error) { + return Reader(uri) +} + +// SaveFileToURI loads a file write stream to a resource identifier. +// This is mostly provided so that file references can be saved using their URI and written to again later. +// +// Deprecated: this has been replaced by storage.Writer(URI) +func SaveFileToURI(uri fyne.URI) (fyne.URIWriteCloser, error) { + return Writer(uri) +} + +// ListerForURI will attempt to use the application's driver to convert a +// standard URI into a listable URI. +// +// Since: 1.4 +func ListerForURI(uri fyne.URI) (fyne.ListableURI, error) { + listable, err := CanList(uri) + if err != nil { + return nil, err + } + if !listable { + return nil, errors.New("uri is not listable") + } + + return &legacyListable{uri}, nil +} + +type legacyListable struct { + fyne.URI +} + +func (l *legacyListable) List() ([]fyne.URI, error) { + return List(l.URI) +} diff --git a/vendor/fyne.io/fyne/v2/storage/filter.go b/vendor/fyne.io/fyne/v2/storage/filter.go new file mode 100644 index 0000000..07bfd12 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/storage/filter.go @@ -0,0 +1,65 @@ +package storage + +import ( + "strings" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/repository/mime" +) + +// FileFilter is an interface that can be implemented to provide a filter to a file dialog. +type FileFilter interface { + Matches(fyne.URI) bool +} + +// ExtensionFileFilter represents a file filter based on the ending of file names, +// for example ".txt" and ".png". +type ExtensionFileFilter struct { + Extensions []string +} + +// MimeTypeFileFilter represents a file filter based on the files mime type, +// for example "image/*", "audio/mp3". +type MimeTypeFileFilter struct { + MimeTypes []string +} + +// Matches returns true if a file URI has one of the filtered extensions. +func (e *ExtensionFileFilter) Matches(uri fyne.URI) bool { + extension := uri.Extension() + for _, ext := range e.Extensions { + if strings.EqualFold(extension, ext) { + return true + } + } + return false +} + +// NewExtensionFileFilter takes a string slice of extensions with a leading . and creates a filter for the file dialog. +// Example: .jpg, .mp3, .txt, .sh +func NewExtensionFileFilter(extensions []string) FileFilter { + return &ExtensionFileFilter{Extensions: extensions} +} + +// Matches returns true if a file URI has one of the filtered mimetypes. +func (mt *MimeTypeFileFilter) Matches(uri fyne.URI) bool { + mimeType, mimeSubType := mime.Split(uri.MimeType()) + for _, mimeTypeFull := range mt.MimeTypes { + mType, mSubType := mime.Split(mimeTypeFull) + if mType == "" || mSubType == "" { + continue + } + + mSubType, _, _ = strings.Cut(mSubType, ";") + if mType == mimeType && (mSubType == mimeSubType || mSubType == "*") { + return true + } + } + return false +} + +// NewMimeTypeFileFilter takes a string slice of mimetypes, including globs, and creates a filter for the file dialog. +// Example: image/*, audio/mp3, text/plain, application/* +func NewMimeTypeFileFilter(mimeTypes []string) FileFilter { + return &MimeTypeFileFilter{MimeTypes: mimeTypes} +} diff --git a/vendor/fyne.io/fyne/v2/storage/repository/errors.go b/vendor/fyne.io/fyne/v2/storage/repository/errors.go new file mode 100644 index 0000000..734d1dc --- /dev/null +++ b/vendor/fyne.io/fyne/v2/storage/repository/errors.go @@ -0,0 +1,24 @@ +package repository + +import ( + "errors" +) + +var ( + // ErrOperationNotSupported may be thrown by certain functions in the storage + // or repository packages which operate on URIs if an operation is attempted + // that is not supported for the scheme relevant to the URI, normally because + // the underlying repository has either not implemented the relevant function, + // or has explicitly returned this error. + // + // Since: 2.0 + ErrOperationNotSupported = errors.New("operation not supported for this URI") + + // ErrURIRoot should be thrown by fyne.URI implementations when the caller + // attempts to take the parent of the root. This way, downstream code that + // wants to programmatically walk up a URIs parent's will know when to stop + // iterating. + // + // Since: 2.0 + ErrURIRoot = errors.New("cannot take the parent of the root element in a URI") +) diff --git a/vendor/fyne.io/fyne/v2/storage/repository/generic.go b/vendor/fyne.io/fyne/v2/storage/repository/generic.go new file mode 100644 index 0000000..414c9fa --- /dev/null +++ b/vendor/fyne.io/fyne/v2/storage/repository/generic.go @@ -0,0 +1,322 @@ +package repository + +import ( + "io" + "path" + "strings" + + "fyne.io/fyne/v2" +) + +// GenericParent can be used as a common-case implementation of +// HierarchicalRepository.Parent(). It will create a parent URI based on +// IETF RFC3986. +// +// In short, the URI is separated into its component parts, the path component +// is split along instances of '/', and the trailing element is removed. The +// result is concatenated and parsed as a new URI. +// +// If the URI path is empty or '/', then a nil URI is returned, along with +// ErrURIRoot. +// +// NOTE: this function should not be called except by an implementation of +// the Repository interface - using this for unknown URIs may break. +// +// Since: 2.0 +func GenericParent(u fyne.URI) (fyne.URI, error) { + p := strings.TrimSuffix(u.Path(), "/") + if p == "" { + return nil, ErrURIRoot + } + + newURI := uri{ + scheme: u.Scheme(), + authority: u.Authority(), + path: path.Dir(p), + query: u.Query(), + fragment: u.Fragment(), + } + + // NOTE: we specifically want to use ParseURI, rather than &uri{}, + // since the repository for the URI we just created might be a + // CustomURIRepository that implements its own ParseURI. + // However, we can reuse &uri.String() to not duplicate string creation. + return ParseURI(newURI.String()) +} + +// GenericChild can be used as a common-case implementation of +// HierarchicalRepository.Child(). It will create a child URI by separating the +// URI into its component parts as described in IETF RFC 3986, then appending +// "/" + component to the path, then concatenating the result and parsing it as +// a new URI. +// +// NOTE: this function should not be called except by an implementation of +// the Repository interface - using this for unknown URIs may break. +// +// Since: 2.0 +func GenericChild(u fyne.URI, component string) (fyne.URI, error) { + newURI := uri{ + scheme: u.Scheme(), + authority: u.Authority(), + path: path.Join(u.Path(), component), + query: u.Query(), + fragment: u.Fragment(), + } + + // NOTE: we specifically want to use ParseURI, rather than &uri{}, + // since the repository for the URI we just created might be a + // CustomURIRepository that implements its own ParseURI. + // However, we can reuse &uri.String() to not duplicate string creation. + return ParseURI(newURI.String()) +} + +// GenericCopy can be used a common-case implementation of +// CopyableRepository.Copy(). It will perform the copy by obtaining a reader +// for the source URI, a writer for the destination URI, then writing the +// contents of the source to the destination. +// +// For obvious reasons, the destination URI must have a registered +// WritableRepository. +// +// NOTE: this function should not be called except by an implementation of +// the Repository interface - using this for unknown URIs may break. +// +// Since: 2.0 +func GenericCopy(source fyne.URI, destination fyne.URI) error { + // Look up repositories for the source and destination. + srcrepo, err := ForURI(source) + if err != nil { + return err + } + + dstrepo, err := ForURI(destination) + if err != nil { + return err + } + + // The destination must be writable. + destwrepo, ok := dstrepo.(WritableRepository) + if !ok { + return ErrOperationNotSupported + } + + if listable, ok := srcrepo.(ListableRepository); ok { + isParent, err := listable.CanList(source) + if err == nil && isParent { + if srcrepo != destwrepo { // cannot copy folders between repositories + return ErrOperationNotSupported + } + + return genericCopyMoveListable(source, destination, srcrepo, false) + } + } + + // Create a reader and a writer. + srcReader, err := srcrepo.Reader(source) + if err != nil { + return err + } + defer srcReader.Close() + + dstWriter, err := destwrepo.Writer(destination) + if err != nil { + return err + } + defer dstWriter.Close() + + // Perform the copy. + _, err = io.Copy(dstWriter, srcReader) + return err +} + +// GenericDeleteAll can be used a common-case implementation of +// DeletableRepository.DeleteAll(). It will perform the deletion by obtaining +// a list of all items in the URI, then deleting each one. +// +// For obvious reasons, the URI must be writable. +// +// NOTE: this function should not be called except by an implementation of +// the Repository interface - using this for unknown URIs may break. +// +// Since: 2.7 +func GenericDeleteAll(u fyne.URI) error { + repo, err := ForURI(u) + if err != nil { + return err + } + + wrepo, ok := repo.(WritableRepository) + if !ok { + return ErrOperationNotSupported + } + + lrepo, ok := repo.(ListableRepository) + if !ok { + return wrepo.Delete(u) + } + + return genericDeleteAll(u, wrepo, lrepo) +} + +// GenericMove can be used a common-case implementation of +// MovableRepository.Move(). It will perform the move by obtaining a reader +// for the source URI, a writer for the destination URI, then writing the +// contents of the source to the destination. Following this, the source +// will be deleted using WritableRepository.Delete. +// +// For obvious reasons, the source and destination URIs must both be writable. +// +// NOTE: this function should not be called except by an implementation of +// the Repository interface - using this for unknown URIs may break. +// +// Since: 2.0 +func GenericMove(source fyne.URI, destination fyne.URI) error { + // This looks a lot like GenericCopy(), but I duplicated the code + // to avoid having to look up the repositories more than once. + + // Look up repositories for the source and destination. + srcrepo, err := ForURI(source) + if err != nil { + return err + } + + dstrepo, err := ForURI(destination) + if err != nil { + return err + } + + // The source and destination must both be writable, since the source + // is being deleted, which requires WritableRepository. + destwrepo, ok := dstrepo.(WritableRepository) + if !ok { + return ErrOperationNotSupported + } + + srcwrepo, ok := srcrepo.(WritableRepository) + if !ok { + return ErrOperationNotSupported + } + + if listable, ok := srcrepo.(ListableRepository); ok { + isParent, err := listable.CanList(source) + if err == nil && isParent { + if srcrepo != destwrepo { // cannot move between repositories + return ErrOperationNotSupported + } + + return genericCopyMoveListable(source, destination, srcrepo, true) + } + } + + // Create the reader and writer to perform the copy operation. + srcReader, err := srcrepo.Reader(source) + if err != nil { + return err + } + + dstWriter, err := destwrepo.Writer(destination) + if err != nil { + return err + } + defer dstWriter.Close() + + // Perform the copy. + _, err = io.Copy(dstWriter, srcReader) + if err != nil { + return err + } + + // Finally, delete the source only if the move finished without error. + srcReader.Close() + return srcwrepo.Delete(source) +} + +func genericCopyMoveListable(source, destination fyne.URI, repo Repository, deleteSource bool) error { + lister, ok1 := repo.(ListableRepository) + mover, ok2 := repo.(MovableRepository) + copier, ok3 := repo.(CopyableRepository) + + if !ok1 || (deleteSource && !ok2) || (!deleteSource && !ok3) { + return ErrOperationNotSupported // cannot move a lister in a non-listable/movable repo + } + + err := lister.CreateListable(destination) + if err != nil { + return err + } + + list, err := lister.List(source) + if err != nil { + return err + } + for _, child := range list { + newChild, _ := repo.(HierarchicalRepository).Child(destination, child.Name()) + if deleteSource { + err = mover.Move(child, newChild) + } else { + err = copier.Copy(child, newChild) + } + if err != nil { + return err + } + } + + if !deleteSource { + return nil + } + // we know the repo is writable as well from earlier checks + writer, _ := repo.(WritableRepository) + return writer.Delete(source) +} + +func genericDeleteAll(u fyne.URI, wrepo WritableRepository, lrepo ListableRepository) error { + listable, err := lrepo.CanList(u) + if err != nil { + return err + } else if !listable { + return wrepo.Delete(u) + } + + children, err := lrepo.List(u) + if err != nil { + return err + } else if len(children) == 0 { + return wrepo.Delete(u) + } + + var folders []fyne.URI + var files []fyne.URI + for i := 0; i < len(children); i++ { + listable, err = lrepo.CanList(children[i]) + if err != nil { + return err + } + + if listable { + grandChildren, err := lrepo.List(children[i]) + if err != nil { + return err + } + folders = append(folders, children[i]) + children = append(children, grandChildren...) + } else { + files = append(files, children[i]) + } + } + + for i := len(files) - 1; i >= 0; i-- { + err = wrepo.Delete(files[i]) + if err != nil { + return err + } + } + + for i := len(folders) - 1; i >= 0; i-- { + err = wrepo.Delete(folders[i]) + if err != nil { + return err + } + } + + return wrepo.Delete(u) +} diff --git a/vendor/fyne.io/fyne/v2/storage/repository/parse.go b/vendor/fyne.io/fyne/v2/storage/repository/parse.go new file mode 100644 index 0000000..6ac50da --- /dev/null +++ b/vendor/fyne.io/fyne/v2/storage/repository/parse.go @@ -0,0 +1,114 @@ +package repository + +import ( + "errors" + "path/filepath" + "runtime" + "strings" + + uriParser "github.com/fredbi/uri" + + "fyne.io/fyne/v2" +) + +// NewFileURI implements the back-end logic to storage.NewFileURI, which you +// should use instead. This is only here because other functions in repository +// need to call it, and it prevents a circular import. +// +// Since: 2.0 +func NewFileURI(path string) fyne.URI { + // URIs are supposed to use forward slashes. On Windows, it + // should be OK to use the platform native filepath with UNIX + // or NT style paths, with / or \, but when we reconstruct + // the URI, we want to have / only. + if runtime.GOOS == "windows" { + // seems that sometimes we end up with + // double-backslashes + path = filepath.ToSlash(path) + } + + return &uri{ + scheme: "file", + path: path, + } +} + +// ParseURI implements the back-end logic for storage.ParseURI, which you +// should use instead. This is only here because other functions in repository +// need to call it, and it prevents a circular import. +// +// Since: 2.0 +func ParseURI(s string) (fyne.URI, error) { + // Extract the scheme. + scheme, path, ok := strings.Cut(s, ":") + if !ok { + return nil, errors.New("invalid URI, scheme must be present") + } + + if strings.EqualFold(scheme, "file") { + // Does this really deserve to be special? In principle, the + // purpose of this check is to pass it to NewFileURI, which + // allows platform path seps in the URI (against the RFC, but + // easier for people building URIs naively on Windows). Maybe + // we should punt this to whoever generated the URI in the + // first place? + + if len(path) <= 2 { // I.e. file: and // given we know scheme. + return nil, errors.New("not a valid URI") + } + + if path[:2] == "//" { + path = path[2:] + } + + // Windows files can break authority checks, so just return the parsed file URI + return NewFileURI(path), nil + } + + scheme = strings.ToLower(scheme) + repo, err := ForScheme(scheme) + if err == nil { + // If the repository registered for this scheme implements a parser + if c, ok := repo.(CustomURIRepository); ok { + return c.ParseURI(s) + } + } + + // There was no repository registered, or it did not provide a parser + + l, err := uriParser.Parse(s) + if err != nil { + return nil, err + } + + authority := l.Authority() + authBuilder := strings.Builder{} + authBuilder.Grow(len(authority.UserInfo()) + len(authority.Host()) + len(authority.Port()) + len("@[]:")) + + if userInfo := authority.UserInfo(); userInfo != "" { + authBuilder.WriteString(userInfo) + authBuilder.WriteByte('@') + } + + // Per RFC 3986, section 3.2.2, IPv6 addresses must be enclosed in square brackets. + if host := authority.Host(); strings.Contains(host, ":") { + authBuilder.WriteByte('[') + authBuilder.WriteString(host) + authBuilder.WriteByte(']') + } else { + authBuilder.WriteString(host) + } + + if port := authority.Port(); port != "" { + authBuilder.WriteByte(':') + authBuilder.WriteString(port) + } + + return &uri{ + scheme: scheme, + authority: authBuilder.String(), + path: authority.Path(), + query: l.Query().Encode(), + fragment: l.Fragment(), + }, nil +} diff --git a/vendor/fyne.io/fyne/v2/storage/repository/repository.go b/vendor/fyne.io/fyne/v2/storage/repository/repository.go new file mode 100644 index 0000000..763e16e --- /dev/null +++ b/vendor/fyne.io/fyne/v2/storage/repository/repository.go @@ -0,0 +1,301 @@ +// Package repository provides primitives for working with storage repositories. +package repository + +import ( + "fmt" + "strings" + + "fyne.io/fyne/v2" +) + +// repositoryTable stores the mapping of schemes to Repository implementations. +// It should only ever be used by ForURI() and Register(). +var repositoryTable = map[string]Repository{} + +// Repository represents a storage repository, which is a set of methods which +// implement specific functions on a URI. Repositories are registered to handle +// specific URI schemes, and the higher-level functions that operate on URIs +// internally look up an appropriate method from the relevant Repository. +// +// The repository interface includes only methods which must be implemented at +// a minimum. Without implementing all of the methods in this interface, a URI +// would not be usable in a useful way. Additional functionality can be exposed +// by using interfaces which extend Repository. +// +// Repositories are registered to handle a specific URI scheme (or schemes) +// using the Register() method. When a higher-level URI function such as +// storage.Copy() is called, the storage package will internally look up +// the repository associated with the scheme of the URI, then it will use +// a type assertion to check if the repository implements CopyableRepository. +// If so, the Copy() function will be run from the repository, otherwise +// storage.Copy() will return NotSupportedError. This works similarly for +// all other methods in repository-related interfaces. +// +// Note that a repository can be registered for multiple URI schemes. In such +// cases, the repository must internally select and implement the correct +// behavior for each URI scheme. +// +// A repository will only ever need to handle URIs with schemes for which it +// was registered, with the exception that functions with more than 1 operand +// such as Copy() and Move(), in which cases only the first operand is +// guaranteed to match a scheme for which the repository is registered. +// +// NOTE: most developers who use Fyne should *not* generally attempt to +// call repository methods directly. You should use the methods in the storage +// package, which will automatically detect the scheme of a URI and call into +// the appropriate repository. +// +// Since: 2.0 +type Repository interface { + // Exists will be used to implement calls to storage.Exists() for the + // registered scheme of this repository. + // + // Since: 2.0 + Exists(u fyne.URI) (bool, error) + + // Reader will be used to implement calls to storage.Reader() + // for the registered scheme of this repository. + // + // Since: 2.0 + Reader(u fyne.URI) (fyne.URIReadCloser, error) + + // CanRead will be used to implement calls to storage.CanRead() for the + // registered scheme of this repository. + // + // Since: 2.0 + CanRead(u fyne.URI) (bool, error) + + // Destroy is called when the repository is un-registered from a given + // URI scheme. + // + // The string parameter will be the URI scheme that the repository was + // registered for. This may be useful for repositories that need to + // handle more than one URI scheme internally. + // + // Since: 2.0 + Destroy(string) +} + +// CustomURIRepository is an extension of the repository interface which +// allows the behavior of storage.ParseURI to be overridden. This is only +// needed if you wish to generate custom URI types, rather than using Fyne's +// URI implementation and net/url based parsing. +// +// NOTE: even for URIs with non-RFC3986-compliant encoding, the URI MUST begin +// with 'scheme:', or storage.ParseURI() will not be able to determine which +// storage repository to delegate to for parsing. +// +// Since: 2.0 +type CustomURIRepository interface { + Repository + + // ParseURI will be used to implement calls to storage.ParseURI() + // for the registered scheme of this repository. + ParseURI(string) (fyne.URI, error) +} + +// WritableRepository is an extension of the Repository interface which also +// supports obtaining a writer for URIs of the scheme it is registered to. +// +// Since: 2.0 +type WritableRepository interface { + Repository + + // Writer will be used to implement calls to storage.WriterTo() for + // the registered scheme of this repository. + // + // Since: 2.0 + Writer(u fyne.URI) (fyne.URIWriteCloser, error) + + // CanWrite will be used to implement calls to storage.CanWrite() for + // the registered scheme of this repository. + // + // Since: 2.0 + CanWrite(u fyne.URI) (bool, error) + + // Delete will be used to implement calls to storage.Delete() for the + // registered scheme of this repository. + // + // Since: 2.0 + Delete(u fyne.URI) error +} + +// AppendableRepository is an extension of the WritableRepository interface which also +// supports opening a writer for URIs in append mode, without truncating their contents +// +// Since: 2.6 +type AppendableRepository interface { + WritableRepository + + // Appender will be used to call a Writer without truncating the + // file if it exists + // + // Since: 2.6 + Appender(u fyne.URI) (fyne.URIWriteCloser, error) +} + +// ListableRepository is an extension of the Repository interface which also +// supports obtaining directory listings (generally analogous to a directory +// listing) for URIs of the scheme it is registered to. +// +// Since: 2.0 +type ListableRepository interface { + Repository + + // CanList will be used to implement calls to storage.Listable() for + // the registered scheme of this repository. + // + // Since: 2.0 + CanList(u fyne.URI) (bool, error) + + // List will be used to implement calls to storage.List() for the + // registered scheme of this repository. + // + // Since: 2.0 + List(u fyne.URI) ([]fyne.URI, error) + + // CreateListable will be used to implement calls to + // storage.CreateListable() for the registered scheme of this + // repository. + // + // Since: 2.0 + CreateListable(u fyne.URI) error +} + +// HierarchicalRepository is an extension of the Repository interface which +// also supports determining the parent and child items of a URI. +// +// Since: 2.0 +type HierarchicalRepository interface { + Repository + + // Parent will be used to implement calls to storage.Parent() for the + // registered scheme of this repository. + // + // A generic implementation is provided in GenericParent(), which + // is based on the RFC3986 definition of a URI parent. + // + // Since: 2.0 + Parent(fyne.URI) (fyne.URI, error) + + // Child will be used to implement calls to storage.Child() for + // the registered scheme of this repository. + // + // A generic implementation is provided in GenericParent(), which + // is based on RFC3986. + // + // Since: 2.0 + Child(fyne.URI, string) (fyne.URI, error) +} + +// DeleteAllRepository is an extension of the WritableRepository interface which +// also supports deleting a URI and all its children. +// +// Since: 2.7 +type DeleteAllRepository interface { + WritableRepository + + // DeleteAll will be used to implement calls to storage.DeleteAll() for the + // registered scheme of this repository. + // + // A generic implementation is provided by GenericDeleteAll(). + // + // Since: 2.7 + DeleteAll(fyne.URI) error +} + +// CopyableRepository is an extension of the Repository interface which also +// supports copying referenced resources from one URI to another. +// +// Since: 2.0 +type CopyableRepository interface { + Repository + + // Copy will be used to implement calls to storage.Copy() for the + // registered scheme of this repository. + // + // A generic implementation is provided by GenericCopy(). + // + // NOTE: the first parameter is the source, the second is the + // destination. + // + // NOTE: if storage.Copy() is given two URIs of different schemes, it + // is possible that only the source URI will be of the type this + // repository is registered to handle. In such cases, implementations + // are suggested to fail-over to GenericCopy(). + // + // Since: 2.0 + Copy(fyne.URI, fyne.URI) error +} + +// MovableRepository is an extension of the Repository interface which also +// supports moving referenced resources from one URI to another. +// +// Note: both Moveable and Movable are correct spellings, but Movable is newer +// and more accepted. Source: https://grammarist.com/spelling/movable-moveable/ +// +// Since: 2.0 +type MovableRepository interface { + Repository + + // Move will be used to implement calls to storage.Move() for the + // registered scheme of this repository. + // + // A generic implementation is provided by GenericMove(). + // + // NOTE: the first parameter is the source, the second is the + // destination. + // + // NOTE: if storage.Move() is given two URIs of different schemes, it + // is possible that only the source URI will be of the type this + // repository is registered to handle. In such cases, implementations + // are suggested to fail-over to GenericMove(). + // + // Since: 2.0 + Move(fyne.URI, fyne.URI) error +} + +// Register registers a storage repository so that operations on URIs of the +// registered scheme will use methods implemented by the relevant repository +// implementation. +// +// Since: 2.0 +func Register(scheme string, repository Repository) { + scheme = strings.ToLower(scheme) + + if prev, ok := repositoryTable[scheme]; ok { + prev.Destroy(scheme) + } + + repositoryTable[scheme] = repository +} + +// ForURI returns the Repository instance which is registered to handle URIs of +// the given scheme. This is a helper method that calls ForScheme() on the +// scheme of the given URI. +// +// NOTE: this function is intended to be used specifically by the storage +// package. It generally should not be used outside of the fyne package - +// instead you should use the methods in the storage package. +// +// Since: 2.0 +func ForURI(u fyne.URI) (Repository, error) { + return ForScheme(u.Scheme()) +} + +// ForScheme returns the Repository instance which is registered to handle URIs +// of the given scheme. +// +// NOTE: this function is intended to be used specifically by the storage +// package. It generally should not be used outside of the fyne package - +// instead you should use the methods in the storage package. +// +// Since: 2.0 +func ForScheme(scheme string) (Repository, error) { + repo, ok := repositoryTable[scheme] + if !ok { + return nil, fmt.Errorf("no repository registered for scheme '%s'", scheme) + } + + return repo, nil +} diff --git a/vendor/fyne.io/fyne/v2/storage/repository/uri.go b/vendor/fyne.io/fyne/v2/storage/repository/uri.go new file mode 100644 index 0000000..34348de --- /dev/null +++ b/vendor/fyne.io/fyne/v2/storage/repository/uri.go @@ -0,0 +1,114 @@ +package repository + +import ( + "bufio" + "mime" + "path" + "strings" + "unicode/utf8" + + "fyne.io/fyne/v2" +) + +// EqualURI returns true if the two URIs are equal. +// +// Since: 2.6 +func EqualURI(t1, t2 fyne.URI) bool { + if t1 == nil || t2 == nil { + return t1 == t2 + } + + u1, ok1 := t1.(*uri) + u2, ok2 := t2.(*uri) + if ok1 && ok2 { + // Knowing the type, pointers are either the same or fields are the same. + return u1 == u2 || *u1 == *u2 + } + + return t1 == t2 || t1.String() == t2.String() +} + +// Declare conformance with fyne.URI interface. +var _ fyne.URI = &uri{} + +type uri struct { + scheme string + authority string + path string + query string + fragment string +} + +func (u *uri) Extension() string { + return path.Ext(u.path) +} + +func (u *uri) Name() string { + return path.Base(u.path) +} + +func (u *uri) MimeType() string { + mimeTypeFull := mime.TypeByExtension(u.Extension()) + if mimeTypeFull == "" { + mimeTypeFull = "text/plain" + + repo, err := ForURI(u) + if err != nil { + return "application/octet-stream" + } + + readCloser, err := repo.Reader(u) + if err == nil { + defer readCloser.Close() + scanner := bufio.NewScanner(readCloser) + if scanner.Scan() && !utf8.Valid(scanner.Bytes()) { + mimeTypeFull = "application/octet-stream" + } + } + } + + mimeType, _, _ := strings.Cut(mimeTypeFull, ";") + return mimeType +} + +func (u *uri) Scheme() string { + return u.scheme +} + +func (u *uri) String() string { + // NOTE: this string reconstruction is mandated by IETF RFC3986, + // section 5.3, pp. 35. + s := strings.Builder{} + s.Grow(len(u.scheme) + len(u.authority) + len(u.path) + len(u.query) + len(u.fragment) + len("://?#")) + + s.WriteString(u.scheme) + s.WriteString("://") + s.WriteString(u.authority) + s.WriteString(u.path) + + if len(u.query) > 0 { + s.WriteByte('?') + s.WriteString(u.query) + } + if len(u.fragment) > 0 { + s.WriteByte('#') + s.WriteString(u.fragment) + } + return s.String() +} + +func (u *uri) Authority() string { + return u.authority +} + +func (u *uri) Path() string { + return u.path +} + +func (u *uri) Query() string { + return u.query +} + +func (u *uri) Fragment() string { + return u.fragment +} diff --git a/vendor/fyne.io/fyne/v2/storage/resource.go b/vendor/fyne.io/fyne/v2/storage/resource.go new file mode 100644 index 0000000..d246d85 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/storage/resource.go @@ -0,0 +1,25 @@ +package storage + +import ( + "io" + + "fyne.io/fyne/v2" +) + +// LoadResourceFromURI creates a new StaticResource in memory using the contents of the specified URI. +// The URI will be opened using the current driver, so valid schemas will vary from platform to platform. +// The file:// schema will always work. +func LoadResourceFromURI(u fyne.URI) (fyne.Resource, error) { + read, err := Reader(u) + if err != nil { + return nil, err + } + + defer read.Close() + bytes, err := io.ReadAll(read) + if err != nil { + return nil, err + } + + return fyne.NewStaticResource(u.Name(), bytes), nil +} diff --git a/vendor/fyne.io/fyne/v2/storage/uri.go b/vendor/fyne.io/fyne/v2/storage/uri.go new file mode 100644 index 0000000..eb7977d --- /dev/null +++ b/vendor/fyne.io/fyne/v2/storage/uri.go @@ -0,0 +1,611 @@ +package storage + +import ( + "path" + "path/filepath" + "runtime" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/storage/repository" +) + +// EqualURI returns true if the two URIs are equal. +// +// Since: 2.6 +func EqualURI(t1, t2 fyne.URI) bool { + return repository.EqualURI(t1, t2) +} + +// NewFileURI creates a new URI from the given file path. +// Relative paths will be converted to absolute using filepath.Abs if required. +func NewFileURI(fpath string) fyne.URI { + if !(path.IsAbs(fpath) || runtime.GOOS == "windows" && filepath.IsAbs(fpath)) { + absolute, err := filepath.Abs(fpath) + if err == nil { + fpath = absolute + } + } + + return repository.NewFileURI(fpath) +} + +// NewURI creates a new URI from the given string representation. This could be +// a URI from an external source or one saved from URI.String() +// +// Deprecated: use ParseURI instead +func NewURI(s string) fyne.URI { + u, _ := ParseURI(s) + return u +} + +// ParseURI creates a new URI instance by parsing a URI string. +// +// Parse URI will parse up to the first ':' present in the URI string to +// extract the scheme, and then delegate further parsing to the registered +// repository for the given scheme. If no repository is registered for that +// scheme, the URI is parsed on a best-effort basis using net/url. +// +// As a special exception, URIs beginning with 'file:' are always parsed using +// NewFileURI(), which will correctly handle back-slashes appearing in the URI +// path component on Windows. +// +// Since: 2.0 +func ParseURI(s string) (fyne.URI, error) { + return repository.ParseURI(s) +} + +// Parent returns a URI referencing the parent resource of the resource +// referenced by the URI. For example, the Parent() of 'file://foo/bar.baz' is +// 'file://foo'. The URI which is returned will be listable. +// +// NOTE: it is not a given that Parent() return a parent URI with the same +// Scheme(), though this will normally be the case. +// +// This can fail in several ways: +// +// - If the URI refers to a filesystem root, then the Parent() implementation +// must return (nil, URIRootError). +// +// - If the URI refers to a resource which does not exist in a hierarchical +// context (e.g. the URI references something which does not have a +// semantically meaningful "parent"), the Parent() implementation may return +// an error. +// +// - If determining the parent of the referenced resource requires +// interfacing with some external system, failures may propagate +// through the Parent() implementation. For example if determining +// the parent of a file:// URI requires reading information from +// the filesystem, it could fail with a permission error. +// +// - If the scheme of the given URI does not have a registered +// HierarchicalRepository instance, then this method will fail with a +// repository.ErrOperationNotSupported. +// +// NOTE: since v2.0.0, Parent() is backed by the repository system - this +// function is a helper which calls into an appropriate repository instance for +// the scheme of the URI it is given. +// +// Since: 1.4 +func Parent(u fyne.URI) (fyne.URI, error) { + repo, err := repository.ForURI(u) + if err != nil { + return nil, err + } + + hrepo, ok := repo.(repository.HierarchicalRepository) + if !ok { + return nil, repository.ErrOperationNotSupported + } + + return hrepo.Parent(u) +} + +// Child returns a URI referencing a resource nested hierarchically below the +// given URI, identified by a string. For example, the child with the string +// component 'quux' of 'file://foo/bar' is 'file://foo/bar/quux'. +// +// This can fail in several ways: +// +// - If the URI refers to a resource which does not exist in a hierarchical +// context (e.g. the URI references something which does not have a +// semantically meaningful "child"), the Child() implementation may return an +// error. +// +// - If generating a reference to a child of the referenced resource requires +// interfacing with some external system, failures may propagate through the +// Child() implementation. It is expected that this case would occur very +// rarely if ever. +// +// - If the scheme of the given URI does not have a registered +// HierarchicalRepository instance, then this method will fail with a +// repository.ErrOperationNotSupported. +// +// NOTE: since v2.0.0, Child() is backed by the repository system - this +// function is a helper which calls into an appropriate repository instance for +// the scheme of the URI it is given. +// +// Since: 1.4 +func Child(u fyne.URI, component string) (fyne.URI, error) { + repo, err := repository.ForURI(u) + if err != nil { + return nil, err + } + + hrepo, ok := repo.(repository.HierarchicalRepository) + if !ok { + return nil, repository.ErrOperationNotSupported + } + + return hrepo.Child(u, component) +} + +// Exists determines if the resource referenced by the URI exists. +// +// This can fail in several ways: +// +// - If checking the existence of a resource requires interfacing with some +// external system, then failures may propagate through Exists(). For +// example, checking the existence of a resource requires reading a directory +// may result in a permissions error. +// +// It is understood that a non-nil error value signals that the existence or +// non-existence of the resource cannot be determined and is undefined. +// +// NOTE: since v2.0.0, Exists is backed by the repository system - this function +// calls into a scheme-specific implementation from a registered repository. +// +// Exists may call into either a generic implementation, or into a +// scheme-specific implementation depending on which storage repositories have +// been registered. +// +// Since: 1.4 +func Exists(u fyne.URI) (bool, error) { + repo, err := repository.ForURI(u) + if err != nil { + return false, err + } + + return repo.Exists(u) +} + +// Delete destroys, deletes, or otherwise removes the resource referenced +// by the URI. +// +// This can fail in several ways: +// +// - If removing the resource requires interfacing with some external system, +// failures may propagate through Destroy(). For example, deleting a file may +// fail with a permissions error. +// +// - If the referenced resource does not exist, attempting to destroy it should +// throw an error. +// +// - If the scheme of the given URI does not have a registered +// WritableRepository instance, then this method will fail with a +// repository.ErrOperationNotSupported. +// +// Delete is backed by the repository system - this function calls +// into a scheme-specific implementation from a registered repository. +// +// Since: 2.0 +func Delete(u fyne.URI) error { + repo, err := repository.ForURI(u) + if err != nil { + return err + } + + wrepo, ok := repo.(repository.WritableRepository) + if !ok { + return repository.ErrOperationNotSupported + } + + return wrepo.Delete(u) +} + +// DeleteAll destroys, deletes, or otherwise removes the resource referenced +// by the URI and any child resources for listable URIs. +// +// DeleteAll is backed by the repository system - this function calls +// into a scheme-specific implementation from a registered repository. +// +// Since: 2.7 +func DeleteAll(u fyne.URI) error { + repo, err := repository.ForURI(u) + if err != nil { + return err + } + + drepo, ok := repo.(repository.DeleteAllRepository) + if !ok { + return repository.GenericDeleteAll(u) + } + + return drepo.DeleteAll(u) +} + +// Reader returns URIReadCloser set up to read from the resource that the +// URI references. +// +// This method can fail in several ways: +// +// - Different permissions or credentials are required to read the +// referenced resource. +// +// - This URI scheme could represent some resources that can be read, +// but this particular URI references a resources that is not +// something that can be read. +// +// - Attempting to set up the reader depended on a lower level +// operation such as a network or filesystem access that has failed +// in some way. +// +// Reader is backed by the repository system - this function calls +// into a scheme-specific implementation from a registered repository. +// +// Since: 2.0 +func Reader(u fyne.URI) (fyne.URIReadCloser, error) { + repo, err := repository.ForURI(u) + if err != nil { + return nil, err + } + + return repo.Reader(u) +} + +// CanRead determines if a given URI could be written to using the Reader() +// method. It is preferred to check if a URI is readable using this method +// before calling Reader(), because the underlying operations required to +// attempt to read and then report an error may be slower than the operations +// needed to test if a URI is readable. Keep in mind however that even if +// CanRead returns true, you must still do appropriate error handling for +// Reader(), as the underlying filesystem may have changed since you called +// CanRead. +// +// The non-existence of a resource should not be treated as an error. In other +// words, a Repository implementation which for some URI u returns false, nil +// for Exists(u), CanRead(u) should also return false, nil. +// +// CanRead is backed by the repository system - this function calls into a +// scheme-specific implementation from a registered repository. +// +// Since: 2.0 +func CanRead(u fyne.URI) (bool, error) { + repo, err := repository.ForURI(u) + if err != nil { + return false, err + } + + return repo.CanRead(u) +} + +// Writer returns URIWriteCloser set up to write to the resource that the +// URI references. +// +// Writing to a non-extant resource should create that resource if possible +// (and if not possible, this should be reflected in the return of CanWrite()). +// Writing to an extant resource should overwrite it in-place. At present, this +// API does not provide a mechanism for appending to an already-extant +// resource, except for reading it in and writing all the data back out. +// +// This method can fail in several ways: +// +// - Different permissions or credentials are required to write to the +// referenced resource. +// +// - This URI scheme could represent some resources that can be +// written, but this particular URI references a resources that is +// not something that can be written. +// +// - Attempting to set up the writer depended on a lower level +// operation such as a network or filesystem access that has failed +// in some way. +// +// - If the scheme of the given URI does not have a registered +// WritableRepository instance, then this method will fail with a +// repository.ErrOperationNotSupported. +// +// Writer is backed by the repository system - this function calls into a +// scheme-specific implementation from a registered repository. +// +// Since: 2.0 +func Writer(u fyne.URI) (fyne.URIWriteCloser, error) { + repo, err := repository.ForURI(u) + if err != nil { + return nil, err + } + + wrepo, ok := repo.(repository.WritableRepository) + if !ok { + return nil, repository.ErrOperationNotSupported + } + + return wrepo.Writer(u) +} + +// Appender returns URIWriteCloser set up to write to the resource that the +// URI references without truncating it first +// +// Writing to a non-extant resource should create that resource if possible +// (and if not possible, this should be reflected in the return of CanWrite()). +// Writing to an extant resource should NOT overwrite it in-place. +// +// This method can fail in several ways: +// +// - Different permissions or credentials are required to write to the +// referenced resource. +// +// - This URI scheme could represent some resources that can be +// written, but this particular URI references a resources that is +// not something that can be written. +// +// - Attempting to set up the writer depended on a lower level +// operation such as a network or filesystem access that has failed +// in some way. +// +// - If the scheme of the given URI does not have a registered +// AppendableRepository instance, then this method will fail with a +// repository.ErrOperationNotSupported. +// +// Appender is backed by the repository system - this function calls into a +// scheme-specific implementation from a registered repository. +// +// Since: 2.6 +func Appender(u fyne.URI) (fyne.URIWriteCloser, error) { + repo, err := repository.ForURI(u) + if err != nil { + return nil, err + } + + wrepo, ok := repo.(repository.AppendableRepository) + if !ok { + return nil, repository.ErrOperationNotSupported + } + + return wrepo.Appender(u) +} + +// CanWrite determines if a given URI could be written to using the Writer() +// method. It is preferred to check if a URI is writable using this method +// before calling Writer(), because the underlying operations required to +// attempt to write and then report an error may be slower than the operations +// needed to test if a URI is writable. Keep in mind however that even if +// CanWrite returns true, you must still do appropriate error handling for +// Writer(), as the underlying filesystem may have changed since you called +// CanWrite. + +// CanWrite is backed by the repository system - this function calls into a +// scheme-specific implementation from a registered repository. +// +// Since: 2.0 +func CanWrite(u fyne.URI) (bool, error) { + repo, err := repository.ForURI(u) + if err != nil { + return false, err + } + + wrepo, ok := repo.(repository.WritableRepository) + if !ok { + return false, repository.ErrOperationNotSupported + } + + return wrepo.CanWrite(u) +} + +// Copy given two URIs, 'src', and 'dest' both of the same scheme, will copy +// one to the other. If the source and destination are of different schemes, +// then the Copy implementation for the storage repository registered to the +// scheme of the source will be used. Implementations are recommended to use +// repository.GenericCopy() as a fail-over in the case that they do not +// understand how to operate on the scheme of the destination URI. However, the +// behavior of calling Copy() on URIs of non-matching schemes is ultimately +// defined by the storage repository registered to the scheme of the source +// URI. +// +// This method may fail in several ways: +// +// - Different permissions or credentials are required to perform the +// copy operation. +// +// - This URI scheme could represent some resources that can be copied, +// but either the source, destination, or both are not resources +// that support copying. +// +// - Performing the copy operation depended on a lower level operation +// such as network or filesystem access that has failed in some way. +// +// - If the scheme of the given URI does not have a registered +// CopyableRepository instance, then this method will fail with a +// repository.ErrOperationNotSupported. +// +// Copy is backed by the repository system - this function calls into a +// scheme-specific implementation from a registered repository. +// +// Since: 2.0 +func Copy(source fyne.URI, destination fyne.URI) error { + repo, err := repository.ForURI(source) + if err != nil { + return err + } + + crepo, ok := repo.(repository.CopyableRepository) + if !ok { + return repository.ErrOperationNotSupported + } + + return crepo.Copy(source, destination) +} + +// Move returns a method that given two URIs, 'src' and 'dest' both of the same +// scheme this will move src to dest. This means the resource referenced by +// src will be copied into the resource referenced by dest, and the resource +// referenced by src will no longer exist after the operation is complete. +// +// If the source and destination are of different schemes, then the Move +// implementation for the storage repository registered to the scheme of the +// source will be used. Implementations are recommended to use +// repository.GenericMove() as a fail-over in the case that they do not +// understand how to operate on the scheme of the destination URI. However, the +// behavior of calling Move() on URIs of non-matching schemes is ultimately +// defined by the storage repository registered to the scheme of the source +// URI. +// +// This method may fail in several ways: +// +// - Different permissions or credentials are required to perform the +// rename operation. +// +// - This URI scheme could represent some resources that can be renamed, +// but either the source, destination, or both are not resources +// that support renaming. +// +// - Performing the rename operation depended on a lower level operation +// such as network or filesystem access that has failed in some way. +// +// - If the scheme of the given URI does not have a registered +// MovableRepository instance, then this method will fail with a +// repository.ErrOperationNotSupported. +// +// Move is backed by the repository system - this function calls into a +// scheme-specific implementation from a registered repository. +// +// Since: 2.0 +func Move(source fyne.URI, destination fyne.URI) error { + repo, err := repository.ForURI(source) + if err != nil { + return err + } + + mrepo, ok := repo.(repository.MovableRepository) + if !ok { + return repository.ErrOperationNotSupported + } + + return mrepo.Move(source, destination) +} + +// CanList will determine if the URI is listable or not. +// +// This method may fail in several ways: +// +// - Different permissions or credentials are required to check if the +// URI supports listing. +// +// - This URI scheme could represent some resources that can be listed, +// but this specific URI is not one of them (e.g. a file on a +// filesystem, as opposed to a directory). +// +// - Checking for listability depended on a lower level operation +// such as network or filesystem access that has failed in some way. +// +// - If the scheme of the given URI does not have a registered +// ListableRepository instance, then this method will fail with a +// repository.ErrOperationNotSupported. +// +// CanList is backed by the repository system - this function calls into a +// scheme-specific implementation from a registered repository. +// +// Since: 2.0 +func CanList(u fyne.URI) (bool, error) { + repo, err := repository.ForURI(u) + if err != nil { + return false, err + } + + lrepo, ok := repo.(repository.ListableRepository) + if !ok { + return false, repository.ErrOperationNotSupported + } + + return lrepo.CanList(u) +} + +// List returns a list of URIs that reference resources which are nested below +// the resource referenced by the argument. For example, listing a directory on +// a filesystem should return a list of files and directories it contains. +// +// This method may fail in several ways: +// +// - Different permissions or credentials are required to obtain a +// listing for the given URI. +// +// - This URI scheme could represent some resources that can be listed, +// but this specific URI is not one of them (e.g. a file on a +// filesystem, as opposed to a directory). This can be tested in advance +// using the Listable() function. +// +// - Obtaining the listing depended on a lower level operation such as +// network or filesystem access that has failed in some way. +// +// - If the scheme of the given URI does not have a registered +// ListableRepository instance, then this method will fail with a +// repository.ErrOperationNotSupported. +// +// List is backed by the repository system - this function either calls into a +// scheme-specific implementation from a registered repository, or fails with a +// URIOperationNotSupported error. +// +// Since: 2.0 +func List(u fyne.URI) ([]fyne.URI, error) { + repo, err := repository.ForURI(u) + if err != nil { + return nil, err + } + + lrepo, ok := repo.(repository.ListableRepository) + if !ok { + return nil, repository.ErrOperationNotSupported + } + + return lrepo.List(u) +} + +// CreateListable creates a new listable resource referenced by the given URI. +// CreateListable will error if the URI already references an extant resource. +// This method is used for storage repositories where listable resources are of +// a different underlying type than other resources - for example, in a typical +// filesystem ('file://'), CreateListable() corresponds to directory creation, +// and Writer() implies file creation for non-extant operands. +// +// For storage repositories where listable and non-listable resources are the +// of the same underlying type, CreateListable should be equivalent to calling +// Writer(), writing zero bytes, and then closing the `URIWriteCloser - in +// filesystem terms, the same as calling 'touch;'. +// +// Storage repositories which support listing, but not creation of listable +// objects may return repository.ErrOperationNotSupported. +// +// CreateListable should generally fail if the parent of its operand does not +// exist, however this can vary by the implementation details of the specific +// storage repository. In filesystem terms, this function is "mkdir" not "mkdir +// -p". +// +// This method may fail in several ways: +// +// - Different permissions or credentials are required to create the requested +// resource. +// +// - Creating the resource depended on a lower level operation such as network +// or filesystem access that has failed in some way. +// +// - If the scheme of the given URI does not have a registered +// ListableRepository instance, then this method will fail with a +// repository.ErrOperationNotSupported. +// +// CreateListable is backed by the repository system - this function either +// calls into a scheme-specific implementation from a registered repository, or +// fails with a URIOperationNotSupported error. +// +// Since: 2.0 +func CreateListable(u fyne.URI) error { + repo, err := repository.ForURI(u) + if err != nil { + return err + } + + lrepo, ok := repo.(repository.ListableRepository) + if !ok { + return repository.ErrOperationNotSupported + } + + return lrepo.CreateListable(u) +} diff --git a/vendor/fyne.io/fyne/v2/storage/uri_root_error.go b/vendor/fyne.io/fyne/v2/storage/uri_root_error.go new file mode 100644 index 0000000..d397181 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/storage/uri_root_error.go @@ -0,0 +1,10 @@ +package storage + +import ( + "fyne.io/fyne/v2/storage/repository" +) + +// URIRootError is a wrapper for repository.URIRootError +// +// Deprecated - use repository.ErrURIRoot instead +var URIRootError = repository.ErrURIRoot diff --git a/vendor/fyne.io/fyne/v2/test/app.go b/vendor/fyne.io/fyne/v2/test/app.go new file mode 100644 index 0000000..f15130c --- /dev/null +++ b/vendor/fyne.io/fyne/v2/test/app.go @@ -0,0 +1,264 @@ +// Package test provides utility drivers for running UI tests without rendering to a screen. +package test // import "fyne.io/fyne/v2/test" + +import ( + "net/url" + "sync" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal" + intapp "fyne.io/fyne/v2/internal/app" + "fyne.io/fyne/v2/internal/cache" + "fyne.io/fyne/v2/internal/painter" + "fyne.io/fyne/v2/internal/test" + "fyne.io/fyne/v2/theme" +) + +// ensure we have a dummy app loaded and ready to test +func init() { + NewApp() +} + +type app struct { + driver *driver + settings *testSettings + prefs fyne.Preferences + propertyLock sync.RWMutex + storage fyne.Storage + lifecycle intapp.Lifecycle + clip fyne.Clipboard + cloud fyne.CloudProvider + + // user action variables + appliedTheme fyne.Theme + lastNotification *fyne.Notification +} + +func (a *app) CloudProvider() fyne.CloudProvider { + return a.cloud +} + +func (a *app) Icon() fyne.Resource { + return nil +} + +func (a *app) SetIcon(fyne.Resource) { + // no-op +} + +func (a *app) NewWindow(title string) fyne.Window { + return a.driver.CreateWindow(title) +} + +func (a *app) OpenURL(url *url.URL) error { + // no-op + return nil +} + +func (a *app) Run() { + // no-op +} + +func (a *app) Quit() { + // no-op +} + +func (a *app) Clipboard() fyne.Clipboard { + return a.clip +} + +func (a *app) UniqueID() string { + return "testApp" // TODO should this be randomised? +} + +func (a *app) Driver() fyne.Driver { + return a.driver +} + +func (a *app) SendNotification(notify *fyne.Notification) { + a.propertyLock.Lock() + defer a.propertyLock.Unlock() + + a.lastNotification = notify +} + +func (a *app) SetCloudProvider(p fyne.CloudProvider) { + if p == nil { + a.cloud = nil + return + } + + a.transitionCloud(p) +} + +func (a *app) Settings() fyne.Settings { + return a.settings +} + +func (a *app) Preferences() fyne.Preferences { + return a.prefs +} + +func (a *app) Storage() fyne.Storage { + return a.storage +} + +func (a *app) Lifecycle() fyne.Lifecycle { + return &a.lifecycle +} + +func (a *app) Metadata() fyne.AppMetadata { + return fyne.AppMetadata{} // just dummy data +} + +func (a *app) lastAppliedTheme() fyne.Theme { + a.propertyLock.Lock() + defer a.propertyLock.Unlock() + + return a.appliedTheme +} + +func (a *app) transitionCloud(p fyne.CloudProvider) { + if a.cloud != nil { + a.cloud.Cleanup(a) + } + + err := p.Setup(a) + if err != nil { + fyne.LogError("Failed to set up cloud provider "+p.ProviderName(), err) + return + } + a.cloud = p + + listeners := a.prefs.ChangeListeners() + if pp, ok := p.(fyne.CloudProviderPreferences); ok { + a.prefs = pp.CloudPreferences(a) + } else { + a.prefs = internal.NewInMemoryPreferences() + } + if store, ok := p.(fyne.CloudProviderStorage); ok { + a.storage = store.CloudStorage(a) + } else { + a.storage = &testStorage{} + } + + for _, l := range listeners { + a.prefs.AddChangeListener(l) + l() // assume that preferences have changed because we replaced the provider + } + + // after transition ensure settings listener is fired + a.settings.apply() +} + +// NewApp returns a new dummy app used for testing. +// It loads a test driver which creates a virtual window in memory for testing. +func NewApp() fyne.App { + settings := &testSettings{scale: 1.0, theme: Theme()} + prefs := internal.NewInMemoryPreferences() + store := &testStorage{} + test := &app{settings: settings, prefs: prefs, storage: store, driver: NewDriver().(*driver), clip: NewClipboard()} + settings.app = test + root, _ := store.docRootURI() + store.Docs = &internal.Docs{RootDocURI: root} + painter.ClearFontCache() + cache.ResetThemeCaches() + fyne.SetCurrentApp(test) + + return test +} + +type testSettings struct { + primaryColor string + scale float32 + theme fyne.Theme + + listeners []func(fyne.Settings) + changeListeners []chan fyne.Settings + propertyLock sync.RWMutex + app *app +} + +func (s *testSettings) AddChangeListener(listener chan fyne.Settings) { + s.propertyLock.Lock() + defer s.propertyLock.Unlock() + s.changeListeners = append(s.changeListeners, listener) +} + +func (s *testSettings) AddListener(listener func(fyne.Settings)) { + s.propertyLock.Lock() + defer s.propertyLock.Unlock() + s.listeners = append(s.listeners, listener) +} + +func (s *testSettings) BuildType() fyne.BuildType { + return fyne.BuildStandard +} + +func (s *testSettings) PrimaryColor() string { + if s.primaryColor != "" { + return s.primaryColor + } + + return theme.ColorBlue +} + +func (s *testSettings) SetTheme(theme fyne.Theme) { + s.propertyLock.Lock() + s.theme = theme + s.propertyLock.Unlock() + + s.apply() +} + +func (s *testSettings) ShowAnimations() bool { + return true +} + +func (s *testSettings) Theme() fyne.Theme { + s.propertyLock.RLock() + defer s.propertyLock.RUnlock() + + if s.theme == nil { + return test.DarkTheme(theme.DefaultTheme()) + } + + return s.theme +} + +func (s *testSettings) ThemeVariant() fyne.ThemeVariant { + return 2 // not a preference +} + +func (s *testSettings) Scale() float32 { + s.propertyLock.RLock() + defer s.propertyLock.RUnlock() + return s.scale +} + +func (s *testSettings) apply() { + s.propertyLock.RLock() + listeners := s.changeListeners + listenersFns := s.listeners + s.propertyLock.RUnlock() + + for _, listener := range listeners { + listener <- s + } + + s.app.driver.DoFromGoroutine(func() { + s.app.propertyLock.Lock() + painter.ClearFontCache() + cache.ResetThemeCaches() + intapp.ApplySettings(s, s.app) + s.app.propertyLock.Unlock() + + for _, l := range listenersFns { + l(s) + } + }, false) + + s.app.propertyLock.Lock() + s.app.appliedTheme = s.Theme() + s.app.propertyLock.Unlock() +} diff --git a/vendor/fyne.io/fyne/v2/test/app_helper.go b/vendor/fyne.io/fyne/v2/test/app_helper.go new file mode 100644 index 0000000..aa21a75 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/test/app_helper.go @@ -0,0 +1,18 @@ +//go:build !tamago && !noos + +package test + +import ( + "testing" + + "fyne.io/fyne/v2" +) + +// NewTempApp returns a new dummy app and tears it down at the end of the test. +// +// Since: 2.5 +func NewTempApp(t testing.TB) fyne.App { + app := NewApp() + t.Cleanup(func() { NewApp() }) + return app +} diff --git a/vendor/fyne.io/fyne/v2/test/canvas.go b/vendor/fyne.io/fyne/v2/test/canvas.go new file mode 100644 index 0000000..4cdc047 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/test/canvas.go @@ -0,0 +1,321 @@ +package test + +import ( + "image" + "image/draw" + "sync" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/driver/desktop" + "fyne.io/fyne/v2/internal" + intapp "fyne.io/fyne/v2/internal/app" + "fyne.io/fyne/v2/internal/cache" + "fyne.io/fyne/v2/internal/scale" + "fyne.io/fyne/v2/theme" +) + +var dummyCanvas WindowlessCanvas + +// WindowlessCanvas provides functionality for a canvas to operate without a window +type WindowlessCanvas interface { + fyne.Canvas + + Padded() bool + Resize(fyne.Size) + SetPadded(bool) + SetScale(float32) +} + +type canvas struct { + size fyne.Size + resized bool + scale float32 + + content fyne.CanvasObject + overlays internal.OverlayStack + focusMgr *intapp.FocusManager + hovered desktop.Hoverable + padded bool + transparent bool + + onTypedRune func(rune) + onTypedKey func(*fyne.KeyEvent) + + fyne.ShortcutHandler + painter SoftwarePainter + propertyLock sync.RWMutex +} + +// Canvas returns a reusable in-memory canvas used for testing +func Canvas() fyne.Canvas { + if dummyCanvas == nil { + dummyCanvas = NewCanvas() + } + + return dummyCanvas +} + +// NewCanvas returns a single use in-memory canvas used for testing. +// This canvas has no painter so calls to Capture() will return a blank image. +func NewCanvas() WindowlessCanvas { + c := &canvas{ + focusMgr: intapp.NewFocusManager(nil), + padded: true, + scale: 1.0, + size: fyne.NewSize(100, 100), + } + c.overlays.Canvas = c + return c +} + +// NewCanvasWithPainter allows creation of an in-memory canvas with a specific painter. +// The painter will be used to render in the Capture() call. +func NewCanvasWithPainter(painter SoftwarePainter) WindowlessCanvas { + c := NewCanvas().(*canvas) + c.painter = painter + + return c +} + +// NewTransparentCanvasWithPainter allows creation of an in-memory canvas with a specific painter without a background color. +// The painter will be used to render in the Capture() call. +// +// Since: 2.2 +func NewTransparentCanvasWithPainter(painter SoftwarePainter) WindowlessCanvas { + c := NewCanvasWithPainter(painter).(*canvas) + c.transparent = true + + return c +} + +func (c *canvas) Capture() image.Image { + cache.Clean(true) + size := c.Size() + bounds := image.Rect(0, 0, scale.ToScreenCoordinate(c, size.Width), scale.ToScreenCoordinate(c, size.Height)) + img := image.NewNRGBA(bounds) + if !c.transparent { + draw.Draw(img, bounds, image.NewUniform(theme.Color(theme.ColorNameBackground)), image.Point{}, draw.Src) + } + + if c.painter != nil { + draw.Draw(img, bounds, c.painter.Paint(c), image.Point{}, draw.Over) + } + + return img +} + +func (c *canvas) Content() fyne.CanvasObject { + c.propertyLock.RLock() + defer c.propertyLock.RUnlock() + + return c.content +} + +func (c *canvas) Focus(obj fyne.Focusable) { + c.focusManager().Focus(obj) +} + +func (c *canvas) FocusNext() { + c.focusManager().FocusNext() +} + +func (c *canvas) FocusPrevious() { + c.focusManager().FocusPrevious() +} + +func (c *canvas) Focused() fyne.Focusable { + return c.focusManager().Focused() +} + +func (c *canvas) InteractiveArea() (fyne.Position, fyne.Size) { + return fyne.NewPos(2, 3), c.Size().SubtractWidthHeight(4, 5) +} + +func (c *canvas) OnTypedKey() func(*fyne.KeyEvent) { + c.propertyLock.RLock() + defer c.propertyLock.RUnlock() + + return c.onTypedKey +} + +func (c *canvas) OnTypedRune() func(rune) { + c.propertyLock.RLock() + defer c.propertyLock.RUnlock() + + return c.onTypedRune +} + +func (c *canvas) Overlays() fyne.OverlayStack { + c.propertyLock.Lock() + defer c.propertyLock.Unlock() + + return &c.overlays +} + +func (c *canvas) Padded() bool { + c.propertyLock.RLock() + defer c.propertyLock.RUnlock() + + return c.padded +} + +func (c *canvas) PixelCoordinateForPosition(pos fyne.Position) (int, int) { + return int(pos.X * c.scale), int(pos.Y * c.scale) +} + +func (c *canvas) Refresh(fyne.CanvasObject) { +} + +func (c *canvas) Resize(size fyne.Size) { + c.propertyLock.Lock() + c.resized = true + c.propertyLock.Unlock() + + c.doResize(size) +} + +func (c *canvas) doResize(size fyne.Size) { + c.propertyLock.Lock() + content := c.content + overlays := c.overlays + padded := c.padded + c.size = size + c.propertyLock.Unlock() + + if content == nil { + return + } + + // Ensure testcanvas mimics real canvas.Resize behavior + for _, overlay := range overlays.List() { + type popupWidget interface { + fyne.CanvasObject + ShowAtPosition(fyne.Position) + } + if p, ok := overlay.(popupWidget); ok { + // TODO: remove this when #707 is being addressed. + // “Notifies” the PopUp of the canvas size change. + p.Refresh() + } else { + overlay.Resize(size) + } + } + + if padded { + padding := theme.Padding() + content.Resize(size.Subtract(fyne.NewSquareSize(padding * 2))) + content.Move(fyne.NewSquareOffsetPos(padding)) + } else { + content.Resize(size) + content.Move(fyne.NewPos(0, 0)) + } +} + +func (c *canvas) Scale() float32 { + c.propertyLock.RLock() + defer c.propertyLock.RUnlock() + + return c.scale +} + +func (c *canvas) SetContent(content fyne.CanvasObject) { + c.propertyLock.Lock() + c.content = content + c.focusMgr = intapp.NewFocusManager(c.content) + resized := c.resized + c.propertyLock.Unlock() + + if content == nil { + return + } + + minSize := content.MinSize() + if c.padded { + minSize = minSize.Add(fyne.NewSquareSize(theme.Padding() * 2)) + } + + if resized { + c.doResize(c.Size().Max(minSize)) + } else { + c.doResize(minSize) + } +} + +func (c *canvas) SetOnTypedKey(handler func(*fyne.KeyEvent)) { + c.propertyLock.Lock() + defer c.propertyLock.Unlock() + + c.onTypedKey = handler +} + +func (c *canvas) SetOnTypedRune(handler func(rune)) { + c.propertyLock.Lock() + defer c.propertyLock.Unlock() + + c.onTypedRune = handler +} + +func (c *canvas) SetPadded(padded bool) { + c.propertyLock.Lock() + c.padded = padded + c.propertyLock.Unlock() + + c.doResize(c.Size()) +} + +func (c *canvas) SetScale(scale float32) { + c.propertyLock.Lock() + defer c.propertyLock.Unlock() + + c.scale = scale +} + +func (c *canvas) Size() fyne.Size { + c.propertyLock.RLock() + defer c.propertyLock.RUnlock() + + return c.size +} + +func (c *canvas) Unfocus() { + c.focusManager().Focus(nil) +} + +func (c *canvas) focusManager() *intapp.FocusManager { + c.propertyLock.RLock() + defer c.propertyLock.RUnlock() + if focusMgr := c.overlays.TopFocusManager(); focusMgr != nil { + return focusMgr + } + return c.focusMgr +} + +func (c *canvas) objectTrees() []fyne.CanvasObject { + overlays := c.Overlays().List() + trees := make([]fyne.CanvasObject, 0, len(overlays)+1) + if c.content != nil { + trees = append(trees, c.content) + } + trees = append(trees, overlays...) + return trees +} + +func layoutAndCollect(objects []fyne.CanvasObject, o fyne.CanvasObject, size fyne.Size) []fyne.CanvasObject { + objects = append(objects, o) + switch c := o.(type) { + case fyne.Widget: + r := c.CreateRenderer() + r.Layout(size) + for _, child := range r.Objects() { + objects = layoutAndCollect(objects, child, child.Size()) + } + case *fyne.Container: + if c.Layout != nil { + c.Layout.Layout(c.Objects, size) + } + for _, child := range c.Objects { + objects = layoutAndCollect(objects, child, child.Size()) + } + } + return objects +} diff --git a/vendor/fyne.io/fyne/v2/test/clipboard.go b/vendor/fyne.io/fyne/v2/test/clipboard.go new file mode 100644 index 0000000..db37f3c --- /dev/null +++ b/vendor/fyne.io/fyne/v2/test/clipboard.go @@ -0,0 +1,20 @@ +package test + +import "fyne.io/fyne/v2" + +type clipboard struct { + content string +} + +func (c *clipboard) Content() string { + return c.content +} + +func (c *clipboard) SetContent(content string) { + c.content = content +} + +// NewClipboard returns a single use in-memory clipboard used for testing +func NewClipboard() fyne.Clipboard { + return &clipboard{} +} diff --git a/vendor/fyne.io/fyne/v2/test/cloud.go b/vendor/fyne.io/fyne/v2/test/cloud.go new file mode 100644 index 0000000..8295b35 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/test/cloud.go @@ -0,0 +1,31 @@ +package test + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/theme" +) + +type mockCloud struct { + configured bool +} + +func (c *mockCloud) Cleanup(_ fyne.App) { + c.configured = false +} + +func (c *mockCloud) ProviderDescription() string { + return "Mock cloud implementation" +} + +func (c *mockCloud) ProviderIcon() fyne.Resource { + return theme.ComputerIcon() +} + +func (c *mockCloud) ProviderName() string { + return "mock" +} + +func (c *mockCloud) Setup(_ fyne.App) error { + c.configured = true + return nil +} diff --git a/vendor/fyne.io/fyne/v2/test/device.go b/vendor/fyne.io/fyne/v2/test/device.go new file mode 100644 index 0000000..740766e --- /dev/null +++ b/vendor/fyne.io/fyne/v2/test/device.go @@ -0,0 +1,36 @@ +package test + +import ( + "runtime" + + "fyne.io/fyne/v2" +) + +type device struct{} + +// Declare conformity with Device +var _ fyne.Device = (*device)(nil) + +func (d *device) Orientation() fyne.DeviceOrientation { + return fyne.OrientationVertical +} + +func (d *device) HasKeyboard() bool { + return false +} + +func (d *device) SystemScale() float32 { + return d.SystemScaleForWindow(nil) +} + +func (d *device) SystemScaleForWindow(fyne.Window) float32 { + return 1 +} + +func (d *device) Locale() fyne.Locale { + return "en" +} + +func (*device) IsBrowser() bool { + return runtime.GOARCH == "js" || runtime.GOOS == "js" +} diff --git a/vendor/fyne.io/fyne/v2/test/device_mobile.go b/vendor/fyne.io/fyne/v2/test/device_mobile.go new file mode 100644 index 0000000..781f0f7 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/test/device_mobile.go @@ -0,0 +1,7 @@ +//go:build mobile + +package test + +func (d *device) IsMobile() bool { + return true +} diff --git a/vendor/fyne.io/fyne/v2/test/device_other.go b/vendor/fyne.io/fyne/v2/test/device_other.go new file mode 100644 index 0000000..23b80f7 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/test/device_other.go @@ -0,0 +1,7 @@ +//go:build !mobile + +package test + +func (d *device) IsMobile() bool { + return false +} diff --git a/vendor/fyne.io/fyne/v2/test/driver.go b/vendor/fyne.io/fyne/v2/test/driver.go new file mode 100644 index 0000000..b116955 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/test/driver.go @@ -0,0 +1,153 @@ +package test + +import ( + "image" + "sync" + "time" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/async" + intdriver "fyne.io/fyne/v2/internal/driver" + "fyne.io/fyne/v2/internal/painter" + "fyne.io/fyne/v2/internal/painter/software" + intRepo "fyne.io/fyne/v2/internal/repository" + "fyne.io/fyne/v2/storage/repository" +) + +// SoftwarePainter describes a simple type that can render canvases +type SoftwarePainter interface { + Paint(fyne.Canvas) image.Image +} + +type driver struct { + device device + painter SoftwarePainter + windows []fyne.Window + windowsMutex sync.RWMutex +} + +// Declare conformity with Driver +var _ fyne.Driver = (*driver)(nil) + +// NewDriver sets up and registers a new dummy driver for test purpose +func NewDriver() fyne.Driver { + drv := &driver{windowsMutex: sync.RWMutex{}} + repository.Register("file", intRepo.NewFileRepository()) + + httpHandler := intRepo.NewHTTPRepository() + repository.Register("http", httpHandler) + repository.Register("https", httpHandler) + + // make a single dummy window for rendering tests + drv.CreateWindow("") + + return drv +} + +// NewDriverWithPainter creates a new dummy driver that will pass the given +// painter to all canvases created +func NewDriverWithPainter(painter SoftwarePainter) fyne.Driver { + return &driver{painter: painter} +} + +// DoFromGoroutine on a test driver ignores the wait flag as our threading is simple +func (d *driver) DoFromGoroutine(f func(), _ bool) { + // Tests all run on a single (but potentially different per-test) thread + async.EnsureNotMain(f) +} + +func (d *driver) AbsolutePositionForObject(co fyne.CanvasObject) fyne.Position { + c := d.CanvasForObject(co) + if c == nil { + return fyne.NewPos(0, 0) + } + + tc := c.(*canvas) + pos := intdriver.AbsolutePositionForObject(co, tc.objectTrees()) + inset, _ := c.InteractiveArea() + return pos.Subtract(inset) +} + +func (d *driver) AllWindows() []fyne.Window { + d.windowsMutex.RLock() + defer d.windowsMutex.RUnlock() + return d.windows +} + +func (d *driver) CanvasForObject(fyne.CanvasObject) fyne.Canvas { + d.windowsMutex.RLock() + defer d.windowsMutex.RUnlock() + // cheating: probably the last created window is meant + return d.windows[len(d.windows)-1].Canvas() +} + +func (d *driver) CreateWindow(title string) fyne.Window { + c := NewCanvas().(*canvas) + if d.painter != nil { + c.painter = d.painter + } else { + c.painter = software.NewPainter() + } + + w := &window{canvas: c, driver: d, title: title} + + d.windowsMutex.Lock() + d.windows = append(d.windows, w) + d.windowsMutex.Unlock() + return w +} + +func (d *driver) Device() fyne.Device { + return &d.device +} + +// RenderedTextSize looks up how bit a string would be if drawn on screen +func (d *driver) RenderedTextSize(text string, size float32, style fyne.TextStyle, source fyne.Resource) (fyne.Size, float32) { + return painter.RenderedTextSize(text, size, style, source) +} + +func (d *driver) Run() { + // no-op +} + +func (d *driver) StartAnimation(a *fyne.Animation) { + // currently no animations in test app, we just initialise it and leave + a.Tick(1.0) +} + +func (d *driver) StopAnimation(a *fyne.Animation) { + // currently no animations in test app, do nothing +} + +func (d *driver) Quit() { + // no-op +} + +func (d *driver) Clipboard() fyne.Clipboard { + return nil +} + +func (d *driver) removeWindow(w *window) { + d.windowsMutex.Lock() + i := 0 + for _, win := range d.windows { + if win == w { + break + } + i++ + } + + copy(d.windows[i:], d.windows[i+1:]) + d.windows[len(d.windows)-1] = nil // Allow the garbage collector to reclaim the memory. + d.windows = d.windows[:len(d.windows)-1] + + d.windowsMutex.Unlock() +} + +func (d *driver) DoubleTapDelay() time.Duration { + return 300 * time.Millisecond +} + +func (d *driver) SetDisableScreenBlanking(_ bool) { + // no-op for test +} diff --git a/vendor/fyne.io/fyne/v2/test/file.go b/vendor/fyne.io/fyne/v2/test/file.go new file mode 100644 index 0000000..6aca1bf --- /dev/null +++ b/vendor/fyne.io/fyne/v2/test/file.go @@ -0,0 +1,106 @@ +package test + +import ( + "errors" + "fmt" + "io" + "os" + "path/filepath" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/storage" +) + +var errUnsupportedURLProtocol = errors.New("unsupported URL protocol") + +type file struct { + *os.File + path string +} + +type directory struct { + fyne.URI +} + +// Declare conformity to the ListableURI interface +var _ fyne.ListableURI = (*directory)(nil) + +func (f *file) Open() (io.ReadCloser, error) { + return os.Open(f.path) +} + +func (f *file) Save() (io.WriteCloser, error) { + return os.Open(f.path) +} + +func (f *file) ReadOnly() bool { + return true +} + +func (f *file) Name() string { + return filepath.Base(f.path) +} + +func (f *file) URI() fyne.URI { + return storage.NewFileURI(f.path) +} + +func openFile(uri fyne.URI, create bool) (*file, error) { + if uri.Scheme() != "file" { + return nil, errUnsupportedURLProtocol + } + + path := uri.Path() + if create { + f, err := os.Create(path) + return &file{File: f, path: path}, err + } + + f, err := os.Open(path) + return &file{File: f, path: path}, err +} + +func (d *driver) FileReaderForURI(uri fyne.URI) (fyne.URIReadCloser, error) { + return openFile(uri, false) +} + +func (d *driver) FileWriterForURI(uri fyne.URI) (fyne.URIWriteCloser, error) { + return openFile(uri, true) +} + +func (d *driver) ListerForURI(uri fyne.URI) (fyne.ListableURI, error) { + if uri.Scheme() != "file" { + return nil, errUnsupportedURLProtocol + } + + path := uri.Path() + s, err := os.Stat(path) + if err != nil { + return nil, err + } + + if !s.IsDir() { + return nil, fmt.Errorf("path '%s' is not a directory, cannot convert to listable URI", path) + } + + return &directory{URI: uri}, nil +} + +func (d *directory) List() ([]fyne.URI, error) { + if d.Scheme() != "file" { + return nil, errUnsupportedURLProtocol + } + + path := d.Path() + files, err := os.ReadDir(path) + if err != nil { + return nil, err + } + + urilist := make([]fyne.URI, len(files)) + for i, f := range files { + urilist[i] = storage.NewFileURI(filepath.Join(path, f.Name())) + } + + return urilist, nil +} diff --git a/vendor/fyne.io/fyne/v2/test/markup_renderer.go b/vendor/fyne.io/fyne/v2/test/markup_renderer.go new file mode 100644 index 0000000..645ba6d --- /dev/null +++ b/vendor/fyne.io/fyne/v2/test/markup_renderer.go @@ -0,0 +1,658 @@ +package test + +import ( + "fmt" + "image/color" + "reflect" + "sort" + "strings" + "unsafe" + + "fyne.io/fyne/v2" + fynecanvas "fyne.io/fyne/v2/canvas" + col "fyne.io/fyne/v2/internal/color" + intdriver "fyne.io/fyne/v2/internal/driver" + "fyne.io/fyne/v2/layout" + "fyne.io/fyne/v2/theme" +) + +type markupRenderer struct { + indentation int + w strings.Builder +} + +// snapshot creates a new snapshot of the current render tree. +func snapshot(c fyne.Canvas) string { + r := markupRenderer{} + r.writeCanvas(c) + return r.w.String() +} + +func (r *markupRenderer) setAlignmentAttr(attrs map[string]*string, name string, a fyne.TextAlign) { + var value string + switch a { + case fyne.TextAlignLeading: + // default mode, don’t add an attr + case fyne.TextAlignCenter: + value = "center" + case fyne.TextAlignTrailing: + value = "trailing" + default: + value = fmt.Sprintf("unknown alignment: %d", a) + } + r.setStringAttr(attrs, name, value) +} + +func (r *markupRenderer) setBoolAttr(attrs map[string]*string, name string, b bool) { + if !b { + return + } + attrs[name] = nil +} + +func (r *markupRenderer) setColorAttr(attrs map[string]*string, name string, c color.Color) { + r.setColorAttrWithDefault(attrs, name, c, color.Transparent) +} + +func (r *markupRenderer) setColorAttrWithDefault(attrs map[string]*string, name string, c color.Color, d color.Color) { + if c == nil || c == d { + return + } + + if value := knownColor(c); value != "" { + r.setStringAttr(attrs, name, value) + return + } + + rd, g, b, a := col.ToNRGBA(c) + r.setStringAttr(attrs, name, fmt.Sprintf("rgba(%d,%d,%d,%d)", uint8(rd), uint8(g), uint8(b), uint8(a))) +} + +func (r *markupRenderer) setFillModeAttr(attrs map[string]*string, name string, m fynecanvas.ImageFill) { + var fillMode string + switch m { + case fynecanvas.ImageFillStretch: + // default mode, don’t add an attr + case fynecanvas.ImageFillContain: + fillMode = "contain" + case fynecanvas.ImageFillOriginal: + fillMode = "original" + default: + fillMode = fmt.Sprintf("unknown fill mode: %d", m) + } + r.setStringAttr(attrs, name, fillMode) +} + +func (r *markupRenderer) setFloatAttr(attrs map[string]*string, name string, f float64) { + r.setFloatAttrWithDefault(attrs, name, f, 0) +} + +func (r *markupRenderer) setFloatAttrWithDefault(attrs map[string]*string, name string, f float64, d float64) { + if f == d { + return + } + value := fmt.Sprintf("%g", f) + attrs[name] = &value +} + +func (r *markupRenderer) setFloatPosAttr(attrs map[string]*string, name string, x, y float64) { + if x == 0 && y == 0 { + return + } + value := fmt.Sprintf("%g,%g", x, y) + attrs[name] = &value +} + +func (r *markupRenderer) setSizeAttrWithDefault(attrs map[string]*string, name string, i float32, d float32) { + if int(i) == int(d) { + return + } + value := fmt.Sprintf("%d", int(i)) + attrs[name] = &value +} + +func (r *markupRenderer) setPosAttr(attrs map[string]*string, name string, pos fyne.Position) { + if int(pos.X) == 0 && int(pos.Y) == 0 { + return + } + value := fmt.Sprintf("%d,%d", int(pos.X), int(pos.Y)) + attrs[name] = &value +} + +func (r *markupRenderer) setResourceAttr(attrs map[string]*string, name string, rsc fyne.Resource) { + if rsc == nil { + return + } + + named := false + if value := knownResource(rsc); value != "" { + r.setStringAttr(attrs, name, value) + named = true + } + + var variant string + switch t := rsc.(type) { + case *theme.DisabledResource: + variant = "disabled" + case *theme.ErrorThemedResource: + variant = "error" + case *theme.InvertedThemedResource: + variant = "inverted" + case *theme.PrimaryThemedResource: + variant = "primary" + case *theme.ThemedResource: + variant = string(t.ColorName) + if variant == "" { + variant = "foreground" + } + default: + r.setStringAttr(attrs, name, rsc.Name()) + return + } + + if !named { + // That’s some magic to access the private `source` field of the themed resource. + v := reflect.ValueOf(rsc).Elem().Field(0) + src := reflect.NewAt(v.Type(), unsafe.Pointer(v.UnsafeAddr())).Elem().Interface().(fyne.Resource) + r.setResourceAttr(attrs, name, src) + } + r.setStringAttr(attrs, "themed", variant) +} + +func (r *markupRenderer) setScaleModeAttr(attrs map[string]*string, name string, m fynecanvas.ImageScale) { + var scaleMode string + switch m { + case fynecanvas.ImageScaleSmooth: + // default mode, don’t add an attr + case fynecanvas.ImageScalePixels: + scaleMode = "pixels" + default: + scaleMode = fmt.Sprintf("unknown scale mode: %d", m) + } + r.setStringAttr(attrs, name, scaleMode) +} + +func (r *markupRenderer) setSizeAttr(attrs map[string]*string, name string, size fyne.Size) { + value := fmt.Sprintf("%dx%d", int(size.Width), int(size.Height)) + attrs[name] = &value +} + +func (r *markupRenderer) setStringAttr(attrs map[string]*string, name string, s string) { + if s == "" { + return + } + attrs[name] = &s +} + +func (r *markupRenderer) writeCanvas(c fyne.Canvas) { + attrs := map[string]*string{} + r.setSizeAttr(attrs, "size", c.Size()) + if tc, ok := c.(WindowlessCanvas); ok { + r.setBoolAttr(attrs, "padded", tc.Padded()) + } + r.writeTag("canvas", false, attrs) + r.w.WriteRune('\n') + r.indentation++ + r.writeTag("content", false, nil) + r.w.WriteRune('\n') + r.indentation++ + intdriver.WalkVisibleObjectTree(c.Content(), r.writeCanvasObject, r.writeCloseCanvasObject) + r.indentation-- + r.writeIndent() + r.writeCloseTag("content") + for _, o := range c.Overlays().List() { + r.writeTag("overlay", false, nil) + r.w.WriteRune('\n') + r.indentation++ + intdriver.WalkVisibleObjectTree(o, r.writeCanvasObject, r.writeCloseCanvasObject) + r.indentation-- + r.writeIndent() + r.writeCloseTag("overlay") + } + r.indentation-- + r.writeIndent() + r.writeCloseTag("canvas") +} + +func (r *markupRenderer) writeCanvasObject(obj fyne.CanvasObject, _, _ fyne.Position, _ fyne.Size) bool { + attrs := map[string]*string{} + r.setPosAttr(attrs, "pos", obj.Position()) + r.setSizeAttr(attrs, "size", obj.Size()) + switch o := obj.(type) { + case *fynecanvas.Circle: + r.writeCircle(o, attrs) + case *fynecanvas.Image: + r.writeImage(o, attrs) + case *fynecanvas.Line: + r.writeLine(o, attrs) + case *fynecanvas.LinearGradient: + r.writeLinearGradient(o, attrs) + case *fynecanvas.RadialGradient: + r.writeRadialGradient(o, attrs) + case *fynecanvas.Raster: + r.writeRaster(o, attrs) + case *fynecanvas.Polygon: + r.writePolygon(o, attrs) + case *fynecanvas.Rectangle: + r.writeRectangle(o, attrs) + case *fynecanvas.Text: + r.writeText(o, attrs) + case *fyne.Container: + r.writeContainer(o, attrs) + case fyne.Widget: + r.writeWidget(o, attrs) + case *layout.Spacer: + r.writeSpacer(o, attrs) + case *fynecanvas.Arc: + r.writeArc(o, attrs) + default: + panic(fmt.Sprint("please add support for", reflect.TypeOf(o))) + } + + return false +} + +func (r *markupRenderer) writeArc(a *fynecanvas.Arc, attrs map[string]*string) { + r.setColorAttr(attrs, "fillColor", a.FillColor) + r.setFloatAttr(attrs, "cutoutRatio", float64(a.CutoutRatio)) + r.setFloatAttr(attrs, "startAngle", float64(a.StartAngle)) + r.setFloatAttr(attrs, "endAngle", float64(a.EndAngle)) + r.setFloatAttr(attrs, "radius", float64(a.CornerRadius)) + r.setColorAttr(attrs, "strokeColor", a.StrokeColor) + r.setFloatAttr(attrs, "strokeWidth", float64(a.StrokeWidth)) + r.writeTag("arc", true, attrs) +} + +func (r *markupRenderer) writeCircle(c *fynecanvas.Circle, attrs map[string]*string) { + r.setColorAttr(attrs, "fillColor", c.FillColor) + r.setColorAttr(attrs, "strokeColor", c.StrokeColor) + r.setFloatAttr(attrs, "strokeWidth", float64(c.StrokeWidth)) + r.writeTag("circle", true, attrs) +} + +func (r *markupRenderer) writeCloseCanvasObject(o fyne.CanvasObject, _ fyne.Position, _ fyne.CanvasObject) { + switch o.(type) { + case *fyne.Container: + r.indentation-- + r.writeIndent() + r.writeCloseTag("container") + case fyne.Widget: + r.indentation-- + r.writeIndent() + r.writeCloseTag("widget") + } +} + +func (r *markupRenderer) writeCloseTag(name string) { + r.w.WriteString("\n") +} + +func (r *markupRenderer) writeContainer(_ *fyne.Container, attrs map[string]*string) { + r.writeTag("container", false, attrs) + r.w.WriteRune('\n') + r.indentation++ +} + +func (r *markupRenderer) writeIndent() { + for i := 0; i < r.indentation; i++ { + r.w.WriteRune('\t') + } +} + +func (r *markupRenderer) writeImage(i *fynecanvas.Image, attrs map[string]*string) { + r.setStringAttr(attrs, "file", i.File) + r.setResourceAttr(attrs, "rsc", i.Resource) + if i.File == "" && i.Resource == nil { + r.setBoolAttr(attrs, "img", i.Image != nil) + } + r.setFloatAttr(attrs, "translucency", i.Translucency) + r.setFillModeAttr(attrs, "fillMode", i.FillMode) + r.setScaleModeAttr(attrs, "scaleMode", i.ScaleMode) + if i.Size().Width == theme.IconInlineSize() && i.Size().Height == i.Size().Width { + r.setStringAttr(attrs, "size", "iconInlineSize") + } + r.writeTag("image", true, attrs) +} + +func (r *markupRenderer) writeLine(l *fynecanvas.Line, attrs map[string]*string) { + r.setColorAttr(attrs, "strokeColor", l.StrokeColor) + r.setFloatAttrWithDefault(attrs, "strokeWidth", float64(l.StrokeWidth), 1) + r.writeTag("line", true, attrs) +} + +func (r *markupRenderer) writeLinearGradient(g *fynecanvas.LinearGradient, attrs map[string]*string) { + r.setColorAttr(attrs, "startColor", g.StartColor) + r.setColorAttr(attrs, "endColor", g.EndColor) + r.setFloatAttr(attrs, "angle", g.Angle) + r.writeTag("linearGradient", true, attrs) +} + +func (r *markupRenderer) writeRadialGradient(g *fynecanvas.RadialGradient, attrs map[string]*string) { + r.setColorAttr(attrs, "startColor", g.StartColor) + r.setColorAttr(attrs, "endColor", g.EndColor) + r.setFloatPosAttr(attrs, "centerOffset", g.CenterOffsetX, g.CenterOffsetY) + r.writeTag("radialGradient", true, attrs) +} + +func (r *markupRenderer) writeRaster(rst *fynecanvas.Raster, attrs map[string]*string) { + r.setFloatAttr(attrs, "translucency", rst.Translucency) + r.writeTag("raster", true, attrs) +} + +func (r *markupRenderer) writePolygon(rct *fynecanvas.Polygon, attrs map[string]*string) { + r.setColorAttr(attrs, "fillColor", rct.FillColor) + r.setColorAttr(attrs, "strokeColor", rct.StrokeColor) + r.setFloatAttr(attrs, "strokeWidth", float64(rct.StrokeWidth)) + r.setFloatAttr(attrs, "radius", float64(rct.CornerRadius)) + r.setFloatAttr(attrs, "angle", float64(rct.Angle)) + r.setFloatAttr(attrs, "sides", float64(rct.Sides)) + r.writeTag("polygon", true, attrs) +} + +func (r *markupRenderer) writeRectangle(rct *fynecanvas.Rectangle, attrs map[string]*string) { + r.setColorAttr(attrs, "fillColor", rct.FillColor) + r.setColorAttr(attrs, "strokeColor", rct.StrokeColor) + r.setFloatAttr(attrs, "strokeWidth", float64(rct.StrokeWidth)) + r.setFloatAttr(attrs, "radius", float64(rct.CornerRadius)) + r.setFloatAttr(attrs, "aspect", float64(rct.Aspect)) + r.setFloatAttr(attrs, "topRightRadius", float64(rct.TopRightCornerRadius)) + r.setFloatAttr(attrs, "topLeftRadius", float64(rct.TopLeftCornerRadius)) + r.setFloatAttr(attrs, "bottomRightRadius", float64(rct.BottomRightCornerRadius)) + r.setFloatAttr(attrs, "bottomLeftRadius", float64(rct.BottomLeftCornerRadius)) + r.writeTag("rectangle", true, attrs) +} + +func (r *markupRenderer) writeSpacer(_ *layout.Spacer, attrs map[string]*string) { + r.writeTag("spacer", true, attrs) +} + +func (r *markupRenderer) writeTag(name string, isEmpty bool, attrs map[string]*string) { + r.writeIndent() + r.w.WriteRune('<') + r.w.WriteString(name) + for _, key := range sortedKeys(attrs) { + r.w.WriteRune(' ') + r.w.WriteString(key) + if attrs[key] != nil { + r.w.WriteString("=\"") + r.w.WriteString(*attrs[key]) + r.w.WriteRune('"') + } + + } + if isEmpty { + r.w.WriteString("/>\n") + } else { + r.w.WriteRune('>') + } +} + +func (r *markupRenderer) writeText(t *fynecanvas.Text, attrs map[string]*string) { + r.setColorAttrWithDefault(attrs, "color", t.Color, theme.Color(theme.ColorNameForeground)) + r.setAlignmentAttr(attrs, "alignment", t.Alignment) + r.setSizeAttrWithDefault(attrs, "textSize", t.TextSize, theme.TextSize()) + r.setBoolAttr(attrs, "bold", t.TextStyle.Bold) + r.setBoolAttr(attrs, "italic", t.TextStyle.Italic) + r.setBoolAttr(attrs, "monospace", t.TextStyle.Monospace) + r.writeTag("text", false, attrs) + r.w.WriteString(t.Text) + r.writeCloseTag("text") +} + +func (r *markupRenderer) writeWidget(w fyne.Widget, attrs map[string]*string) { + r.setStringAttr(attrs, "type", reflect.TypeOf(w).String()) + r.writeTag("widget", false, attrs) + r.w.WriteRune('\n') + r.indentation++ +} + +func nrgbaColor(c color.Color) color.NRGBA { + // using ColorToNRGBA to avoid problems with colors with 16-bit components or alpha values that aren't 0 or the maximum possible alpha value + r, g, b, a := col.ToNRGBA(c) + return color.NRGBA{R: uint8(r), G: uint8(g), B: uint8(b), A: uint8(a)} +} + +//gocyclo:ignore +func knownColor(c color.Color) string { + switch nrgbaColor(c) { + case nrgbaColor(theme.Color(theme.ColorNameBackground)): + return "background" + case nrgbaColor(theme.Color(theme.ColorNameButton)): + return "button" + case nrgbaColor(theme.Color(theme.ColorNameDisabledButton)): + return "disabled button" + case nrgbaColor(theme.Color(theme.ColorNameDisabled)): + return "disabled" + case nrgbaColor(theme.Color(theme.ColorNameError)): + return "error" + case nrgbaColor(theme.Color(theme.ColorNameFocus)): + return "focus" + case nrgbaColor(theme.Color(theme.ColorNameForeground)): + return "foreground" + case nrgbaColor(theme.Color(theme.ColorNameForegroundOnError)): + return "foregroundOnError" + case nrgbaColor(theme.Color(theme.ColorNameForegroundOnPrimary)): + return "foregroundOnPrimary" + case nrgbaColor(theme.Color(theme.ColorNameForegroundOnSuccess)): + return "foregroundOnSuccess" + case nrgbaColor(theme.Color(theme.ColorNameForegroundOnWarning)): + return "foregroundOnWarning" + case nrgbaColor(theme.Color(theme.ColorNameHeaderBackground)): + return "headerBackground" + case nrgbaColor(theme.Color(theme.ColorNameHover)): + return "hover" + case nrgbaColor(theme.Color(theme.ColorNameHyperlink)): + return "hyperlink" + case nrgbaColor(theme.Color(theme.ColorNameInputBackground)): + return "inputBackground" + case nrgbaColor(theme.Color(theme.ColorNameInputBorder)): + return "inputBorder" + case nrgbaColor(theme.Color(theme.ColorNameMenuBackground)): + return "menuBackground" + case nrgbaColor(theme.Color(theme.ColorNameOverlayBackground)): + return "overlayBackground" + case nrgbaColor(theme.Color(theme.ColorNamePlaceHolder)): + return "placeholder" + case nrgbaColor(theme.Color(theme.ColorNamePressed)): + return "pressed" + case nrgbaColor(theme.Color(theme.ColorNamePrimary)): + return "primary" + case nrgbaColor(theme.Color(theme.ColorNameScrollBar)): + return "scrollbar" + case nrgbaColor(theme.Color(theme.ColorNameScrollBarBackground)): + return "scrollbarBackground" + case nrgbaColor(theme.Color(theme.ColorNameSelection)): + return "selection" + case nrgbaColor(theme.Color(theme.ColorNameSeparator)): + return "separator" + case nrgbaColor(theme.Color(theme.ColorNameSuccess)): + return "success" + case nrgbaColor(theme.Color(theme.ColorNameShadow)): + return "shadow" + case nrgbaColor(theme.Color(theme.ColorNameWarning)): + return "warning" + default: + return "" + } +} + +//gocyclo:ignore +func knownResource(rsc fyne.Resource) string { + switch rsc { + case theme.CancelIcon(): + return "cancelIcon" + case theme.CheckButtonCheckedIcon(): + return "checkButtonCheckedIcon" + case theme.CheckButtonFillIcon(): + return "checkButtonFillIcon" + case theme.CheckButtonIcon(): + return "checkButtonIcon" + case theme.ColorAchromaticIcon(): + return "colorAchromaticIcon" + case theme.ColorChromaticIcon(): + return "colorChromaticIcon" + case theme.ColorPaletteIcon(): + return "colorPaletteIcon" + case theme.ComputerIcon(): + return "computerIcon" + case theme.ConfirmIcon(): + return "confirmIcon" + case theme.ContentAddIcon(): + return "contentAddIcon" + case theme.ContentClearIcon(): + return "contentClearIcon" + case theme.ContentCopyIcon(): + return "contentCopyIcon" + case theme.ContentCutIcon(): + return "contentCutIcon" + case theme.ContentPasteIcon(): + return "contentPasteIcon" + case theme.ContentRedoIcon(): + return "contentRedoIcon" + case theme.ContentRemoveIcon(): + return "contentRemoveIcon" + case theme.ContentUndoIcon(): + return "contentUndoIcon" + case theme.DeleteIcon(): + return "deleteIcon" + case theme.DesktopIcon(): + return "desktopIcon" + case theme.DocumentCreateIcon(): + return "documentCreateIcon" + case theme.DocumentIcon(): + return "documentIcon" + case theme.DocumentPrintIcon(): + return "documentPrintIcon" + case theme.DocumentSaveIcon(): + return "documentSaveIcon" + case theme.DownloadIcon(): + return "downloadIcon" + case theme.ErrorIcon(): + return "errorIcon" + case theme.FileApplicationIcon(): + return "fileApplicationIcon" + case theme.FileAudioIcon(): + return "fileAudioIcon" + case theme.FileIcon(): + return "fileIcon" + case theme.FileImageIcon(): + return "fileImageIcon" + case theme.FileTextIcon(): + return "fileTextIcon" + case theme.FileVideoIcon(): + return "fileVideoIcon" + case theme.FolderIcon(): + return "folderIcon" + case theme.FolderNewIcon(): + return "folderNewIcon" + case theme.FolderOpenIcon(): + return "folderOpenIcon" + case theme.FyneLogo(): + return "fyneLogo" //lint:ignore SA1019 This needs to stay until the API is removed. + case theme.HelpIcon(): + return "helpIcon" + case theme.HistoryIcon(): + return "historyIcon" + case theme.HomeIcon(): + return "homeIcon" + case theme.InfoIcon(): + return "infoIcon" + case theme.MailAttachmentIcon(): + return "mailAttachementIcon" + case theme.MailComposeIcon(): + return "mailComposeIcon" + case theme.MailForwardIcon(): + return "mailForwardIcon" + case theme.MailReplyAllIcon(): + return "mailReplyAllIcon" + case theme.MailReplyIcon(): + return "mailReplyIcon" + case theme.MailSendIcon(): + return "mailSendIcon" + case theme.MediaFastForwardIcon(): + return "mediaFastForwardIcon" + case theme.MediaFastRewindIcon(): + return "mediaFastRewindIcon" + case theme.MediaPauseIcon(): + return "mediaPauseIcon" + case theme.MediaPlayIcon(): + return "mediaPlayIcon" + case theme.MediaRecordIcon(): + return "mediaRecordIcon" + case theme.MediaReplayIcon(): + return "mediaReplayIcon" + case theme.MediaSkipNextIcon(): + return "mediaSkipNextIcon" + case theme.MediaSkipPreviousIcon(): + return "mediaSkipPreviousIcon" + case theme.MenuDropDownIcon(): + return "menuDropDownIcon" + case theme.MenuDropUpIcon(): + return "menuDropUpIcon" + case theme.MenuExpandIcon(): + return "menuExpandIcon" + case theme.MenuIcon(): + return "menuIcon" + case theme.MoveDownIcon(): + return "moveDownIcon" + case theme.MoveUpIcon(): + return "moveUpIcon" + case theme.NavigateBackIcon(): + return "navigateBackIcon" + case theme.NavigateNextIcon(): + return "navigateNextIcon" + case theme.QuestionIcon(): + return "questionIcon" + case theme.RadioButtonCheckedIcon(): + return "radioButtonCheckedIcon" + case theme.RadioButtonFillIcon(): + return "radioButtonFillIcon" + case theme.RadioButtonIcon(): + return "radioButtonIcon" + case theme.SearchIcon(): + return "searchIcon" + case theme.SearchReplaceIcon(): + return "searchReplaceIcon" + case theme.SettingsIcon(): + return "settingsIcon" + case theme.StorageIcon(): + return "storageIcon" + case theme.ViewFullScreenIcon(): + return "viewFullScreenIcon" + case theme.ViewRefreshIcon(): + return "viewRefreshIcon" + case theme.ViewRestoreIcon(): + return "viewRestoreIcon" + case theme.VisibilityIcon(): + return "visibilityIcon" + case theme.VisibilityOffIcon(): + return "visibilityOffIcon" + case theme.VolumeDownIcon(): + return "volumeDownIcon" + case theme.VolumeMuteIcon(): + return "volumeMuteIcon" + case theme.VolumeUpIcon(): + return "volumeUpIcon" + case theme.WarningIcon(): + return "warningIcon" + case theme.ZoomFitIcon(): + return "zoomFitIcon" + case theme.ZoomInIcon(): + return "zoomInIcon" + case theme.ZoomOutIcon(): + return "zoomOutIcon" + default: + return "" + } +} + +func sortedKeys(m map[string]*string) []string { + keys := make([]string, 0, len(m)) + for k := range m { + keys = append(keys, k) + } + sort.Strings(keys) + return keys +} diff --git a/vendor/fyne.io/fyne/v2/test/notification.go b/vendor/fyne.io/fyne/v2/test/notification.go new file mode 100644 index 0000000..56e5404 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/test/notification.go @@ -0,0 +1 @@ +package test diff --git a/vendor/fyne.io/fyne/v2/test/notification_helper.go b/vendor/fyne.io/fyne/v2/test/notification_helper.go new file mode 100644 index 0000000..f73acd2 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/test/notification_helper.go @@ -0,0 +1,33 @@ +//go:build !tamago && !noos + +package test + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "fyne.io/fyne/v2" +) + +// AssertNotificationSent allows an app developer to assert that a notification was sent. +// After the content of f has executed this utility will check that the specified notification was sent. +func AssertNotificationSent(t *testing.T, n *fyne.Notification, f func()) { + require.NotNil(t, f, "function has to be specified") + require.IsType(t, &app{}, fyne.CurrentApp()) + a := fyne.CurrentApp().(*app) + a.lastNotification = nil + + f() + if n == nil { + assert.Nil(t, a.lastNotification) + return + } else if a.lastNotification == nil { + t.Error("No notification sent") + return + } + + assert.Equal(t, n.Title, a.lastNotification.Title) + assert.Equal(t, n.Content, a.lastNotification.Content) +} diff --git a/vendor/fyne.io/fyne/v2/test/storage.go b/vendor/fyne.io/fyne/v2/test/storage.go new file mode 100644 index 0000000..c904710 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/test/storage.go @@ -0,0 +1,21 @@ +package test + +import ( + "os" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal" + "fyne.io/fyne/v2/storage" +) + +type testStorage struct { + *internal.Docs +} + +func (s *testStorage) RootURI() fyne.URI { + return storage.NewFileURI(os.TempDir()) +} + +func (s *testStorage) docRootURI() (fyne.URI, error) { + return storage.Child(s.RootURI(), "Documents") +} diff --git a/vendor/fyne.io/fyne/v2/test/test.go b/vendor/fyne.io/fyne/v2/test/test.go new file mode 100644 index 0000000..9658fa5 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/test/test.go @@ -0,0 +1,243 @@ +package test + +import ( + "os" + "path/filepath" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/driver/desktop" + "fyne.io/fyne/v2/internal/cache" + intdriver "fyne.io/fyne/v2/internal/driver" +) + +// RenderObjectToMarkup renders the given [fyne.io/fyne/v2.CanvasObject] to a markup string. +// +// Since: 2.6 +func RenderObjectToMarkup(o fyne.CanvasObject) string { + c := NewCanvas() + c.SetPadded(false) + size := o.MinSize().Max(o.Size()) + c.SetContent(o) + c.Resize(size) // ensure we are large enough for current size + + return snapshot(c) +} + +// RenderToMarkup renders the given [fyne.io/fyne/v2.Canvas] to a markup string. +// +// Since: 2.6 +func RenderToMarkup(c fyne.Canvas) string { + return snapshot(c) +} + +// Drag drags at an absolute position on the canvas. +// deltaX/Y is the dragging distance: <0 for dragging up/left, >0 for dragging down/right. +func Drag(c fyne.Canvas, pos fyne.Position, deltaX, deltaY float32) { + matches := func(object fyne.CanvasObject) bool { + _, ok := object.(fyne.Draggable) + return ok + } + o, p, _ := intdriver.FindObjectAtPositionMatching(pos, matches, c.Overlays().Top(), c.Content()) + if o == nil { + return + } + e := &fyne.DragEvent{ + PointEvent: fyne.PointEvent{Position: p}, + Dragged: fyne.Delta{DX: deltaX, DY: deltaY}, + } + o.(fyne.Draggable).Dragged(e) + o.(fyne.Draggable).DragEnd() +} + +// FocusNext focuses the next focusable on the canvas. +func FocusNext(c fyne.Canvas) { + if tc, ok := c.(*canvas); ok { + tc.focusManager().FocusNext() + } else { + fyne.LogError("FocusNext can only be called with a test canvas", nil) + } +} + +// FocusPrevious focuses the previous focusable on the canvas. +func FocusPrevious(c fyne.Canvas) { + if tc, ok := c.(*canvas); ok { + tc.focusManager().FocusPrevious() + } else { + fyne.LogError("FocusPrevious can only be called with a test canvas", nil) + } +} + +// LaidOutObjects returns all fyne.CanvasObject starting at the given fyne.CanvasObject which is laid out previously. +func LaidOutObjects(o fyne.CanvasObject) (objects []fyne.CanvasObject) { + if o != nil { + objects = layoutAndCollect(objects, o, o.MinSize().Max(o.Size())) + } + return objects +} + +// MoveMouse simulates a mouse movement to the given position. +func MoveMouse(c fyne.Canvas, pos fyne.Position) { + if fyne.CurrentDevice().IsMobile() { + return + } + + tc, _ := c.(*canvas) + var oldHovered, hovered desktop.Hoverable + if tc != nil { + oldHovered = tc.hovered + } + matches := func(object fyne.CanvasObject) bool { + _, ok := object.(desktop.Hoverable) + return ok + } + o, p, _ := intdriver.FindObjectAtPositionMatching(pos, matches, c.Overlays().Top(), c.Content()) + if o != nil { + hovered = o.(desktop.Hoverable) + me := &desktop.MouseEvent{ + PointEvent: fyne.PointEvent{ + AbsolutePosition: pos, + Position: p, + }, + } + if hovered == oldHovered { + hovered.MouseMoved(me) + } else { + if oldHovered != nil { + oldHovered.MouseOut() + } + hovered.MouseIn(me) + } + } else if oldHovered != nil { + oldHovered.MouseOut() + } + if tc != nil { + tc.hovered = hovered + } +} + +// Scroll scrolls at an absolute position on the canvas. +// deltaX/Y is the scrolling distance: <0 for scrolling up/left, >0 for scrolling down/right. +func Scroll(c fyne.Canvas, pos fyne.Position, deltaX, deltaY float32) { + matches := func(object fyne.CanvasObject) bool { + _, ok := object.(fyne.Scrollable) + return ok + } + o, _, _ := intdriver.FindObjectAtPositionMatching(pos, matches, c.Overlays().Top(), c.Content()) + if o == nil { + return + } + + e := &fyne.ScrollEvent{Scrolled: fyne.Delta{DX: deltaX, DY: deltaY}} + o.(fyne.Scrollable).Scrolled(e) +} + +// DoubleTap simulates a double left mouse click on the specified object. +func DoubleTap(obj fyne.DoubleTappable) { + ev, c := prepareTap(obj, fyne.NewPos(1, 1)) + handleFocusOnTap(c, obj) + obj.DoubleTapped(ev) +} + +// Tap simulates a left mouse click on the specified object. +func Tap(obj fyne.Tappable) { + TapAt(obj, fyne.NewPos(1, 1)) +} + +// TapAt simulates a left mouse click on the passed object at a specified place within it. +func TapAt(obj fyne.Tappable, pos fyne.Position) { + ev, c := prepareTap(obj, pos) + tap(c, obj, ev) +} + +// TapCanvas taps at an absolute position on the canvas. +func TapCanvas(c fyne.Canvas, pos fyne.Position) { + if o, p := findTappable(c, pos); o != nil { + tap(c, o.(fyne.Tappable), &fyne.PointEvent{AbsolutePosition: pos, Position: p}) + } +} + +// TapSecondary simulates a right mouse click on the specified object. +func TapSecondary(obj fyne.SecondaryTappable) { + TapSecondaryAt(obj, fyne.NewPos(1, 1)) +} + +// TapSecondaryAt simulates a right mouse click on the passed object at a specified place within it. +func TapSecondaryAt(obj fyne.SecondaryTappable, pos fyne.Position) { + ev, c := prepareTap(obj, pos) + handleFocusOnTap(c, obj) + obj.TappedSecondary(ev) +} + +// Type performs a series of key events to simulate typing of a value into the specified object. +// The focusable object will be focused before typing begins. +// The chars parameter will be input one rune at a time to the focused object. +func Type(obj fyne.Focusable, chars string) { + obj.FocusGained() + + typeChars([]rune(chars), obj.TypedRune) +} + +// TypeOnCanvas is like the Type function but it passes the key events to the canvas object +// rather than a focusable widget. +func TypeOnCanvas(c fyne.Canvas, chars string) { + typeChars([]rune(chars), c.OnTypedRune()) +} + +// WidgetRenderer allows test scripts to gain access to the current renderer for a widget. +// This can be used for verifying correctness of rendered components for a widget in unit tests. +func WidgetRenderer(wid fyne.Widget) fyne.WidgetRenderer { + return cache.Renderer(wid) +} + +func findTappable(c fyne.Canvas, pos fyne.Position) (o fyne.CanvasObject, p fyne.Position) { + matches := func(object fyne.CanvasObject) bool { + _, ok := object.(fyne.Tappable) + return ok + } + o, p, _ = intdriver.FindObjectAtPositionMatching(pos, matches, c.Overlays().Top(), c.Content()) + return o, p +} + +func prepareTap(obj any, pos fyne.Position) (*fyne.PointEvent, fyne.Canvas) { + d := fyne.CurrentApp().Driver() + ev := &fyne.PointEvent{Position: pos} + var c fyne.Canvas + if co, ok := obj.(fyne.CanvasObject); ok { + c = d.CanvasForObject(co) + ev.AbsolutePosition = d.AbsolutePositionForObject(co).Add(pos) + } + return ev, c +} + +func tap(c fyne.Canvas, obj fyne.Tappable, ev *fyne.PointEvent) { + handleFocusOnTap(c, obj) + obj.Tapped(ev) +} + +func handleFocusOnTap(c fyne.Canvas, obj any) { + if c == nil { + return + } + + if focus, ok := obj.(fyne.Focusable); ok { + dis, ok := obj.(fyne.Disableable) + if (!ok || !dis.Disabled()) && focus == c.Focused() { + return + } + } + + c.Unfocus() +} + +func typeChars(chars []rune, keyDown func(rune)) { + for _, char := range chars { + keyDown(char) + } +} + +func writeMarkup(path string, markup string) error { + if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil { + return err + } + return os.WriteFile(path, []byte(markup), 0o644) +} diff --git a/vendor/fyne.io/fyne/v2/test/test_helper.go b/vendor/fyne.io/fyne/v2/test/test_helper.go new file mode 100644 index 0000000..800b7d8 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/test/test_helper.go @@ -0,0 +1,160 @@ +//go:build !tamago && !noos + +package test + +import ( + "fmt" + "image" + "os" + "path/filepath" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/internal/cache" + "fyne.io/fyne/v2/internal/painter/software" + "fyne.io/fyne/v2/internal/test" +) + +// AssertCanvasTappableAt asserts that the canvas is tappable at the given position. +func AssertCanvasTappableAt(t *testing.T, c fyne.Canvas, pos fyne.Position) bool { + if o, _ := findTappable(c, pos); o == nil { + t.Errorf("No tappable found at %#v", pos) + return false + } + return true +} + +// AssertObjectRendersToImage asserts that the given `CanvasObject` renders the same image as the one stored in the master file. +// The theme used is the standard test theme which may look different to how it shows on your device. +// The master filename is relative to the `testdata` directory which is relative to the test. +// The test `t` fails if the given image is not equal to the loaded master image. +// In this case the given image is written into a file in `testdata/failed/` (relative to the test). +// This path is also reported, thus the file can be used as new master. +// +// Since 2.3 +func AssertObjectRendersToImage(t *testing.T, masterFilename string, o fyne.CanvasObject, msgAndArgs ...any) bool { + c := NewCanvasWithPainter(software.NewPainter()) + c.SetPadded(false) + size := o.MinSize().Max(o.Size()) + c.SetContent(o) + c.Resize(size) // ensure we are large enough for current size + + return AssertRendersToImage(t, masterFilename, c, msgAndArgs...) +} + +// AssertObjectRendersToMarkup asserts that the given `CanvasObject` renders the same markup as the one stored in the master file. +// The master filename is relative to the `testdata` directory which is relative to the test. +// The test `t` fails if the rendered markup is not equal to the loaded master markup. +// In this case the rendered markup is written into a file in `testdata/failed/` (relative to the test). +// This path is also reported, thus the file can be used as new master. +// +// Be aware, that the indentation has to use tab characters ('\t') instead of spaces. +// Every element starts on a new line indented one more than its parent. +// Closing elements stand on their own line, too, using the same indentation as the opening element. +// The only exception to this are text elements which do not contain line breaks unless the text includes them. +// +// Since 2.3 +func AssertObjectRendersToMarkup(t *testing.T, masterFilename string, o fyne.CanvasObject, msgAndArgs ...any) bool { + c := NewCanvas() + c.SetPadded(false) + size := o.MinSize().Max(o.Size()) + c.SetContent(o) + c.Resize(size) // ensure we are large enough for current size + + return AssertRendersToMarkup(t, masterFilename, c, msgAndArgs...) +} + +// AssertImageMatches asserts that the given image is the same as the one stored in the master file. +// The master filename is relative to the `testdata` directory which is relative to the test. +// The test `t` fails if the given image is not equal to the loaded master image. +// In this case the given image is written into a file in `testdata/failed/` (relative to the test). +// This path is also reported, thus the file can be used as new master. +func AssertImageMatches(t *testing.T, masterFilename string, img image.Image, msgAndArgs ...any) bool { + return test.AssertImageMatches(t, masterFilename, img, msgAndArgs...) +} + +// AssertRendersToImage asserts that the given canvas renders the same image as the one stored in the master file. +// The master filename is relative to the `testdata` directory which is relative to the test. +// The test `t` fails if the given image is not equal to the loaded master image. +// In this case the given image is written into a file in `testdata/failed/` (relative to the test). +// This path is also reported, thus the file can be used as new master. +// +// Since 2.3 +func AssertRendersToImage(t *testing.T, masterFilename string, c fyne.Canvas, msgAndArgs ...any) bool { + return AssertImageMatches(t, masterFilename, c.Capture(), msgAndArgs...) +} + +// AssertRendersToMarkup asserts that the given canvas renders the same markup as the one stored in the master file. +// The master filename is relative to the `testdata` directory which is relative to the test. +// The test `t` fails if the rendered markup is not equal to the loaded master markup. +// In this case the rendered markup is written into a file in `testdata/failed/` (relative to the test). +// This path is also reported, thus the file can be used as new master. +// +// Be aware, that the indentation has to use tab characters ('\t') instead of spaces. +// Every element starts on a new line indented one more than its parent. +// Closing elements stand on their own line, too, using the same indentation as the opening element. +// The only exception to this are text elements which do not contain line breaks unless the text includes them. +// +// Since: 2.0 +func AssertRendersToMarkup(t *testing.T, masterFilename string, c fyne.Canvas, msgAndArgs ...any) bool { + wd, err := os.Getwd() + require.NoError(t, err) + + got := snapshot(c) + masterPath := filepath.Join(wd, "testdata", masterFilename) + failedPath := filepath.Join(wd, "testdata/failed", masterFilename) + _, err = os.Stat(masterPath) + if os.IsNotExist(err) { + require.NoError(t, writeMarkup(failedPath, got)) + t.Errorf("Master not found at %s. Markup written to %s might be used as master.", masterPath, failedPath) + return false + } + + raw, err := os.ReadFile(masterPath) + require.NoError(t, err) + master := strings.ReplaceAll(string(raw), "\r", "") + + var msg string + if len(msgAndArgs) > 0 { + msg = fmt.Sprintf(msgAndArgs[0].(string)+"\n", msgAndArgs[1:]...) + } + if !assert.Equal(t, master, got, "%sMarkup did not match master. Actual markup written to file://%s.", msg, failedPath) { + require.NoError(t, writeMarkup(failedPath, got)) + return false + } + return true +} + +// ApplyTheme sets the given theme and waits for it to be applied to the current app. +func ApplyTheme(t *testing.T, theme fyne.Theme) { + require.IsType(t, &app{}, fyne.CurrentApp()) + a := fyne.CurrentApp().(*app) + a.Settings().SetTheme(theme) + for a.lastAppliedTheme() != theme { + time.Sleep(5 * time.Millisecond) + } +} + +// TempWidgetRenderer allows test scripts to gain access to the current renderer for a widget. +// This can be used for verifying correctness of rendered components for a widget in unit tests. +// The widget renderer is automatically destroyed when the test ends. +// +// Since: 2.5 +func TempWidgetRenderer(t *testing.T, wid fyne.Widget) fyne.WidgetRenderer { + t.Cleanup(func() { cache.DestroyRenderer(wid) }) + return cache.Renderer(wid) +} + +// WithTestTheme runs a function with the testTheme temporarily set. +func WithTestTheme(t *testing.T, f func()) { + settings := fyne.CurrentApp().Settings() + current := settings.Theme() + ApplyTheme(t, NewTheme()) + defer ApplyTheme(t, current) + f() +} diff --git a/vendor/fyne.io/fyne/v2/test/theme.go b/vendor/fyne.io/fyne/v2/test/theme.go new file mode 100644 index 0000000..80b3fb2 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/test/theme.go @@ -0,0 +1,234 @@ +package test + +import ( + "fmt" + "image/color" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/theme" +) + +var defaultTheme fyne.Theme + +// Try to keep these in sync with the existing color names at theme/color.go. +var knownColorNames = [...]fyne.ThemeColorName{ + theme.ColorNameBackground, + theme.ColorNameButton, + theme.ColorNameDisabled, + theme.ColorNameDisabledButton, + theme.ColorNameError, + theme.ColorNameFocus, + theme.ColorNameForeground, + theme.ColorNameForegroundOnError, + theme.ColorNameForegroundOnPrimary, + theme.ColorNameForegroundOnSuccess, + theme.ColorNameForegroundOnWarning, + theme.ColorNameHeaderBackground, + theme.ColorNameHover, + theme.ColorNameHyperlink, + theme.ColorNameInputBackground, + theme.ColorNameInputBorder, + theme.ColorNameMenuBackground, + theme.ColorNameOverlayBackground, + theme.ColorNamePlaceHolder, + theme.ColorNamePressed, + theme.ColorNamePrimary, + theme.ColorNameScrollBar, + theme.ColorNameScrollBarBackground, + theme.ColorNameSelection, + theme.ColorNameSeparator, + theme.ColorNameShadow, + theme.ColorNameSuccess, + theme.ColorNameWarning, +} + +// KnownThemeVariants returns the known theme variants mapped by a descriptive key. +func KnownThemeVariants() map[string]fyne.ThemeVariant { + // Try to keep this in sync with the existing variants at theme/theme.go + return map[string]fyne.ThemeVariant{ + "dark": theme.VariantDark, + "light": theme.VariantLight, + } +} + +// NewTheme returns a new test theme using quiet ugly colors. +func NewTheme() fyne.Theme { + blue := func(alpha uint8) color.Color { + return &color.NRGBA{R: 0, G: 0, B: 255, A: alpha} + } + gray := func(level uint8) color.Color { + return &color.Gray{Y: level} + } + green := func(alpha uint8) color.Color { + return &color.NRGBA{R: 0, G: 255, B: 0, A: alpha} + } + red := func(alpha uint8) color.Color { + return &color.NRGBA{R: 200, G: 0, B: 0, A: alpha} + } + + return &configurableTheme{ + colors: map[fyne.ThemeColorName]color.Color{ + theme.ColorNameBackground: red(255), + theme.ColorNameButton: gray(100), + theme.ColorNameDisabled: gray(20), + theme.ColorNameDisabledButton: gray(230), + theme.ColorNameError: blue(255), + theme.ColorNameFocus: red(66), + theme.ColorNameForeground: gray(255), + theme.ColorNameForegroundOnError: red(210), + theme.ColorNameForegroundOnPrimary: red(200), + theme.ColorNameForegroundOnSuccess: blue(201), + theme.ColorNameForegroundOnWarning: blue(202), + theme.ColorNameHeaderBackground: red(22), + theme.ColorNameHover: green(200), + theme.ColorNameHyperlink: blue(240), + theme.ColorNameInputBackground: red(30), + theme.ColorNameInputBorder: gray(10), + theme.ColorNameMenuBackground: red(50), + theme.ColorNameOverlayBackground: red(44), + theme.ColorNamePlaceHolder: blue(200), + theme.ColorNamePressed: blue(250), + theme.ColorNamePrimary: green(255), + theme.ColorNameScrollBar: blue(220), + theme.ColorNameScrollBarBackground: red(20), + theme.ColorNameSelection: red(55), + theme.ColorNameSeparator: gray(30), + theme.ColorNameShadow: blue(150), + theme.ColorNameSuccess: green(150), + theme.ColorNameWarning: red(100), + }, + fonts: map[fyne.TextStyle]fyne.Resource{ + {}: theme.DefaultTextBoldFont(), + {Bold: true}: theme.DefaultTextItalicFont(), + {Bold: true, Italic: true}: theme.DefaultTextMonospaceFont(), + {Italic: true}: theme.DefaultTextBoldItalicFont(), + {Monospace: true}: theme.DefaultTextFont(), + {Symbol: true}: theme.DefaultSymbolFont(), + }, + name: "Ugly Test Theme", + sizes: map[fyne.ThemeSizeName]float32{ + theme.SizeNameInlineIcon: float32(24), + theme.SizeNameInnerPadding: float32(20), + theme.SizeNameLineSpacing: float32(6), + theme.SizeNamePadding: float32(10), + theme.SizeNameScrollBar: float32(10), + theme.SizeNameScrollBarSmall: float32(2), + theme.SizeNameSeparatorThickness: float32(1), + theme.SizeNameText: float32(18), + theme.SizeNameHeadingText: float32(30.6), + theme.SizeNameSubHeadingText: float32(24), + theme.SizeNameCaptionText: float32(15), + theme.SizeNameInputBorder: float32(5), + theme.SizeNameInputRadius: float32(2), + theme.SizeNameSelectionRadius: float32(6), + theme.SizeNameScrollBarRadius: float32(2), + }, + } +} + +// Theme returns a test theme useful for image based tests. +func Theme() fyne.Theme { + if defaultTheme == nil { + defaultTheme = &configurableTheme{ + colors: map[fyne.ThemeColorName]color.Color{ + theme.ColorNameBackground: color.NRGBA{R: 0x44, G: 0x44, B: 0x44, A: 0xff}, + theme.ColorNameButton: color.NRGBA{R: 0x33, G: 0x33, B: 0x33, A: 0xff}, + theme.ColorNameDisabled: color.NRGBA{R: 0x88, G: 0x88, B: 0x88, A: 0xff}, + theme.ColorNameDisabledButton: color.NRGBA{R: 0x22, G: 0x22, B: 0x22, A: 0xff}, + theme.ColorNameError: color.NRGBA{R: 0xf4, G: 0x43, B: 0x36, A: 0xff}, + theme.ColorNameFocus: color.NRGBA{R: 0x78, G: 0x3a, B: 0x3a, A: 0xff}, + theme.ColorNameForeground: color.NRGBA{R: 0xff, G: 0xff, B: 0xff, A: 0xff}, + theme.ColorNameForegroundOnError: color.NRGBA{R: 0x08, G: 0x0a, B: 0x0f, A: 0xff}, + theme.ColorNameForegroundOnPrimary: color.NRGBA{R: 0x08, G: 0x0c, B: 0x0f, A: 0xff}, + theme.ColorNameForegroundOnSuccess: color.NRGBA{R: 0x0a, G: 0x0c, B: 0x0f, A: 0xff}, + theme.ColorNameForegroundOnWarning: color.NRGBA{R: 0x08, G: 0x0c, B: 0x0a, A: 0xff}, + theme.ColorNameHeaderBackground: color.NRGBA{R: 0x25, G: 0x25, B: 0x25, A: 0xff}, + theme.ColorNameHover: color.NRGBA{R: 0x88, G: 0xff, B: 0xff, A: 0x22}, + theme.ColorNameHyperlink: color.NRGBA{R: 0xff, G: 0xcc, B: 0x80, A: 0xff}, + theme.ColorNameInputBackground: color.NRGBA{R: 0x66, G: 0x66, B: 0x66, A: 0xff}, + theme.ColorNameInputBorder: color.NRGBA{R: 0x86, G: 0x86, B: 0x86, A: 0xff}, + theme.ColorNameMenuBackground: color.NRGBA{R: 0x56, G: 0x56, B: 0x56, A: 0xff}, + theme.ColorNameOverlayBackground: color.NRGBA{R: 0x28, G: 0x28, B: 0x28, A: 0xff}, + theme.ColorNamePlaceHolder: color.NRGBA{R: 0xaa, G: 0xaa, B: 0xaa, A: 0xff}, + theme.ColorNamePressed: color.NRGBA{R: 0x00, G: 0x00, B: 0x00, A: 0x33}, + theme.ColorNamePrimary: color.NRGBA{R: 0xff, G: 0xc0, B: 0x80, A: 0xff}, + theme.ColorNameScrollBar: color.NRGBA{R: 0x00, G: 0x00, B: 0x00, A: 0xaa}, + theme.ColorNameScrollBarBackground: color.NRGBA{R: 0x67, G: 0x66, B: 0x66, A: 0xff}, + theme.ColorNameSelection: color.NRGBA{R: 0x78, G: 0x3a, B: 0x3a, A: 0x99}, + theme.ColorNameSeparator: color.NRGBA{R: 0x90, G: 0x90, B: 0x90, A: 0xff}, + theme.ColorNameShadow: color.NRGBA{R: 0x00, G: 0x00, B: 0x00, A: 0x88}, + theme.ColorNameSuccess: color.NRGBA{R: 0x00, G: 0x99, B: 0x00, A: 0xff}, + theme.ColorNameWarning: color.NRGBA{R: 0xee, G: 0xee, B: 0x00, A: 0xff}, + }, + fonts: map[fyne.TextStyle]fyne.Resource{ + {}: theme.DefaultTextFont(), + {Bold: true}: theme.DefaultTextBoldFont(), + {Bold: true, Italic: true}: theme.DefaultTextBoldItalicFont(), + {Italic: true}: theme.DefaultTextItalicFont(), + {Monospace: true}: theme.DefaultTextMonospaceFont(), + {Symbol: true}: theme.DefaultSymbolFont(), + }, + name: "Default Test Theme", + sizes: map[fyne.ThemeSizeName]float32{ + theme.SizeNameInlineIcon: float32(20), + theme.SizeNameInnerPadding: float32(8), + theme.SizeNameLineSpacing: float32(4), + theme.SizeNamePadding: float32(4), + theme.SizeNameScrollBar: float32(16), + theme.SizeNameScrollBarSmall: float32(3), + theme.SizeNameSeparatorThickness: float32(1), + theme.SizeNameText: float32(14), + theme.SizeNameHeadingText: float32(23.8), + theme.SizeNameSubHeadingText: float32(18), + theme.SizeNameCaptionText: float32(11), + theme.SizeNameInputBorder: float32(2), + theme.SizeNameInputRadius: float32(4), + theme.SizeNameSelectionRadius: float32(4), + theme.SizeNameScrollBarRadius: float32(3), + theme.SizeNameWindowTitleBarHeight: float32(20), + theme.SizeNameWindowButtonHeight: float32(10), + theme.SizeNameWindowButtonIcon: float32(8), + theme.SizeNameWindowButtonRadius: float32(5), + }, + } + } + return defaultTheme +} + +type configurableTheme struct { + colors map[fyne.ThemeColorName]color.Color + fonts map[fyne.TextStyle]fyne.Resource + name string + sizes map[fyne.ThemeSizeName]float32 +} + +var _ fyne.Theme = (*configurableTheme)(nil) + +func (t *configurableTheme) Color(n fyne.ThemeColorName, _ fyne.ThemeVariant) color.Color { + if t.colors[n] == nil { + fyne.LogError(fmt.Sprintf("color %s not defined in theme %s", n, t.name), nil) + } + + return t.colors[n] +} + +func (t *configurableTheme) Font(style fyne.TextStyle) fyne.Resource { + if t.fonts[style] == nil { + fyne.LogError(fmt.Sprintf("font for style %#v not defined in theme %s", style, t.name), nil) + } + + return t.fonts[style] +} + +func (t *configurableTheme) Icon(n fyne.ThemeIconName) fyne.Resource { + return theme.DefaultTheme().Icon(n) +} + +func (t *configurableTheme) Size(s fyne.ThemeSizeName) float32 { + if _, ok := t.sizes[s]; !ok { + fyne.LogError(fmt.Sprintf("size %s not defined in theme %s", s, t.name), nil) + return 0 + } + + return t.sizes[s] +} diff --git a/vendor/fyne.io/fyne/v2/test/theme_helper.go b/vendor/fyne.io/fyne/v2/test/theme_helper.go new file mode 100644 index 0000000..4e7e5f9 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/test/theme_helper.go @@ -0,0 +1,31 @@ +//go:build !tamago && !noos + +package test + +import ( + "image/color" + "testing" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/theme" + "github.com/stretchr/testify/assert" +) + +// AssertAllColorNamesDefined asserts that all known color names are defined for the given theme. +func AssertAllColorNamesDefined(t *testing.T, th fyne.Theme, themeName string) { + oldApp := fyne.CurrentApp() + defer fyne.SetCurrentApp(oldApp) + + for _, primaryName := range theme.PrimaryColorNames() { + testApp := NewTempApp(t) + testApp.Settings().(*testSettings).primaryColor = primaryName + for variantName, variant := range KnownThemeVariants() { + for _, cn := range knownColorNames { + assert.NotNil(t, th.Color(cn, variant), "undefined color %s variant %s in theme %s", cn, variantName, themeName) + // Transparent is used by the default theme as fallback for unknown color names. + // Built-in color names should have well-defined non-transparent values. + assert.NotEqual(t, color.Transparent, th.Color(cn, variant), "undefined color %s variant %s in theme %s", cn, variantName, themeName) + } + } + } +} diff --git a/vendor/fyne.io/fyne/v2/test/window.go b/vendor/fyne.io/fyne/v2/test/window.go new file mode 100644 index 0000000..1036ef0 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/test/window.go @@ -0,0 +1,140 @@ +package test + +import ( + "fyne.io/fyne/v2" +) + +type window struct { + title string + fullScreen bool + fixedSize bool + focused bool + onClosed func() + onCloseIntercepted func() + + canvas *canvas + driver *driver + menu *fyne.MainMenu +} + +// NewWindow creates and registers a new window for test purposes +func NewWindow(content fyne.CanvasObject) fyne.Window { + window := fyne.CurrentApp().NewWindow("") + window.SetContent(content) + return window +} + +func (w *window) Canvas() fyne.Canvas { + return w.canvas +} + +func (w *window) CenterOnScreen() { + // no-op +} + +func (w *window) Clipboard() fyne.Clipboard { + return NewClipboard() +} + +func (w *window) Close() { + if w.onClosed != nil { + w.onClosed() + } + w.focused = false + w.driver.removeWindow(w) +} + +func (w *window) Content() fyne.CanvasObject { + return w.Canvas().Content() +} + +func (w *window) FixedSize() bool { + return w.fixedSize +} + +func (w *window) FullScreen() bool { + return w.fullScreen +} + +func (w *window) Hide() { + w.focused = false +} + +func (w *window) Icon() fyne.Resource { + return fyne.CurrentApp().Icon() +} + +func (w *window) MainMenu() *fyne.MainMenu { + return w.menu +} + +func (w *window) Padded() bool { + return w.canvas.Padded() +} + +func (w *window) RequestFocus() { + for _, win := range w.driver.AllWindows() { + win.(*window).focused = false + } + + w.focused = true +} + +func (w *window) Resize(size fyne.Size) { + w.canvas.Resize(size) +} + +func (w *window) SetContent(obj fyne.CanvasObject) { + w.Canvas().SetContent(obj) +} + +func (w *window) SetFixedSize(fixed bool) { + w.fixedSize = fixed +} + +func (w *window) SetIcon(_ fyne.Resource) { + // no-op +} + +func (w *window) SetFullScreen(fullScreen bool) { + w.fullScreen = fullScreen +} + +func (w *window) SetMainMenu(menu *fyne.MainMenu) { + w.menu = menu +} + +func (w *window) SetMaster() { + // no-op +} + +func (w *window) SetOnClosed(closed func()) { + w.onClosed = closed +} + +func (w *window) SetCloseIntercept(callback func()) { + w.onCloseIntercepted = callback +} + +func (w *window) SetOnDropped(dropped func(fyne.Position, []fyne.URI)) { +} + +func (w *window) SetPadded(padded bool) { + w.canvas.SetPadded(padded) +} + +func (w *window) SetTitle(title string) { + w.title = title +} + +func (w *window) Show() { + w.RequestFocus() +} + +func (w *window) ShowAndRun() { + w.Show() +} + +func (w *window) Title() string { + return w.title +} diff --git a/vendor/fyne.io/fyne/v2/test/window_helper.go b/vendor/fyne.io/fyne/v2/test/window_helper.go new file mode 100644 index 0000000..235ff39 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/test/window_helper.go @@ -0,0 +1,19 @@ +//go:build !tamago && !noos + +package test + +import ( + "testing" + + "fyne.io/fyne/v2" +) + +// NewTempWindow creates and registers a new window for test purposes. +// This window will get removed automatically once the running test ends. +// +// Since: 2.5 +func NewTempWindow(t testing.TB, content fyne.CanvasObject) fyne.Window { + window := NewWindow(content) + t.Cleanup(window.Close) + return window +} diff --git a/vendor/fyne.io/fyne/v2/text.go b/vendor/fyne.io/fyne/v2/text.go new file mode 100644 index 0000000..a300811 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/text.go @@ -0,0 +1,74 @@ +package fyne + +// TextAlign represents the horizontal alignment of text within a widget or +// canvas object. +type TextAlign int + +const ( + // TextAlignLeading specifies a left alignment for left-to-right languages. + TextAlignLeading TextAlign = iota + // TextAlignCenter places the text centrally within the available space. + TextAlignCenter + // TextAlignTrailing will align the text right for a left-to-right language. + TextAlignTrailing +) + +// TextTruncation controls how a `Label` or `Entry` will truncate its text. +// The default value is `TextTruncateOff` which will not truncate. +// +// Since: 2.4 +type TextTruncation int + +const ( + // TextTruncateOff means no truncation will be applied, it is the default. + // This means that the minimum size of a text block will be the space required to display it fully. + TextTruncateOff TextTruncation = iota + // TextTruncateClip will truncate text when it reaches the end of the available space. + TextTruncateClip + // TextTruncateEllipsis is like regular truncation except that an ellipses (…) will be inserted + // wherever text has been shortened to fit. + // + // Since: 2.4 + TextTruncateEllipsis +) + +// TextWrap represents how text longer than the widget's width will be wrapped. +type TextWrap int + +const ( + // TextWrapOff extends the widget's width to fit the text, no wrapping is applied. + TextWrapOff TextWrap = iota + // TextTruncate trims the text to the widget's width, no wrapping is applied. + // If an entry is asked to truncate it will provide scrolling capabilities. + // + // Deprecated: Use [TextTruncateClip] value of the widget `Truncation` field instead + TextTruncate + // TextWrapBreak trims the line of characters to the widget's width adding the excess as new line. + // An Entry with text wrapping will scroll vertically if there is not enough space for all the text. + TextWrapBreak + // TextWrapWord trims the line of words to the widget's width adding the excess as new line. + // An Entry with text wrapping will scroll vertically if there is not enough space for all the text. + TextWrapWord +) + +// TextStyle represents the styles that can be applied to a text canvas object +// or text based widget. +type TextStyle struct { + Bold bool // Should text be bold + Italic bool // Should text be italic + Monospace bool // Use the system monospace font instead of regular + // Since: 2.2 + Symbol bool // Use the system symbol font. + // Since: 2.1 + TabWidth int // Width of tabs in spaces + // Since: 2.5 + // Currently only supported by [fyne.io/fyne/v2/widget.TextGrid]. + Underline bool // Should text be underlined. +} + +// MeasureText uses the current driver to calculate the size of text when rendered. +// The font used will be read from the current app's theme. +func MeasureText(text string, size float32, style TextStyle) Size { + s, _ := CurrentApp().Driver().RenderedTextSize(text, size, style, nil) + return s +} diff --git a/vendor/fyne.io/fyne/v2/theme.go b/vendor/fyne.io/fyne/v2/theme.go new file mode 100644 index 0000000..5d02233 --- /dev/null +++ b/vendor/fyne.io/fyne/v2/theme.go @@ -0,0 +1,63 @@ +package fyne + +import "image/color" + +// ThemeVariant indicates a variation of a theme, such as light or dark. +// +// Since: 2.0 +type ThemeVariant uint + +// ThemeColorName is used to look up a colour based on its name. +// +// Since: 2.0 +type ThemeColorName string + +// ThemeIconName is used to look up an icon based on its name. +// +// Since: 2.0 +type ThemeIconName string + +// ThemeSizeName is used to look up a size based on its name. +// +// Since: 2.0 +type ThemeSizeName string + +// Theme defines the method to look up colors, sizes and fonts that make up a Fyne theme. +// +// Since: 2.0 +type Theme interface { + Color(ThemeColorName, ThemeVariant) color.Color + Font(TextStyle) Resource + Icon(ThemeIconName) Resource + Size(ThemeSizeName) float32 +} + +// LegacyTheme defines the requirements of any Fyne theme. +// This was previously called Theme and is kept for simpler transition of applications built before v2.0.0. +// +// Since: 2.0 +type LegacyTheme interface { + BackgroundColor() color.Color + ButtonColor() color.Color + DisabledButtonColor() color.Color + TextColor() color.Color + DisabledTextColor() color.Color + PlaceHolderColor() color.Color + PrimaryColor() color.Color + HoverColor() color.Color + FocusColor() color.Color + ScrollBarColor() color.Color + ShadowColor() color.Color + + TextSize() int + TextFont() Resource + TextBoldFont() Resource + TextItalicFont() Resource + TextBoldItalicFont() Resource + TextMonospaceFont() Resource + + Padding() int + IconInlineSize() int + ScrollBarSize() int + ScrollBarSmallSize() int +} diff --git a/vendor/fyne.io/fyne/v2/theme/bundled-emoji.go b/vendor/fyne.io/fyne/v2/theme/bundled-emoji.go new file mode 100644 index 0000000..14d4b0e --- /dev/null +++ b/vendor/fyne.io/fyne/v2/theme/bundled-emoji.go @@ -0,0 +1,17 @@ +//go:build !no_emoji + +package theme + +import ( + _ "embed" + + "fyne.io/fyne/v2" +) + +//go:embed font/EmojiOneColor.otf +var emojiFontData []byte + +var emoji = &fyne.StaticResource{ + StaticName: "EmojiOneColor.otf", + StaticContent: emojiFontData, +} diff --git a/vendor/fyne.io/fyne/v2/theme/bundled-fonts.go b/vendor/fyne.io/fyne/v2/theme/bundled-fonts.go new file mode 100644 index 0000000..f48103b --- /dev/null +++ b/vendor/fyne.io/fyne/v2/theme/bundled-fonts.go @@ -0,0 +1,55 @@ +package theme + +import ( + _ "embed" + + "fyne.io/fyne/v2" +) + +//go:embed font/NotoSans-Regular.ttf +var notoSansRegular []byte + +var regular = &fyne.StaticResource{ + StaticName: "NotoSans-Regular.ttf", + StaticContent: notoSansRegular, +} + +//go:embed font/NotoSans-Bold.ttf +var notoSansBold []byte + +var bold = &fyne.StaticResource{ + StaticName: "NotoSans-Bold.ttf", + StaticContent: notoSansBold, +} + +//go:embed font/NotoSans-Italic.ttf +var notoSansItalic []byte + +var italic = &fyne.StaticResource{ + StaticName: "NotoSans-Italic.ttf", + StaticContent: notoSansItalic, +} + +//go:embed font/NotoSans-BoldItalic.ttf +var notoSansBoldItalic []byte + +var bolditalic = &fyne.StaticResource{ + StaticName: "NotoSans-BoldItalic.ttf", + StaticContent: notoSansBoldItalic, +} + +//go:embed font/DejaVuSansMono-Powerline.ttf +var dejaVuSansMono []byte + +var monospace = &fyne.StaticResource{ + StaticName: "DejaVuSansMono-Powerline.ttf", + StaticContent: dejaVuSansMono, +} + +//go:embed font/InterSymbols-Regular.ttf +var interSymbolsRegular []byte + +var symbol = &fyne.StaticResource{ + StaticName: "InterSymbols-Regular.ttf", + StaticContent: interSymbolsRegular, +} diff --git a/vendor/fyne.io/fyne/v2/theme/bundled-icons.go b/vendor/fyne.io/fyne/v2/theme/bundled-icons.go new file mode 100644 index 0000000..4389dad --- /dev/null +++ b/vendor/fyne.io/fyne/v2/theme/bundled-icons.go @@ -0,0 +1,783 @@ +package theme + +import ( + _ "embed" + + "fyne.io/fyne/v2" +) + +//go:embed icons/fyne.png +var fyneLogo []byte + +var fynelogo = &fyne.StaticResource{ + StaticName: "fyne.png", + StaticContent: fyneLogo, +} + +//go:embed icons/cancel.svg +var cancelIcon []byte + +var cancelIconRes = &fyne.StaticResource{ + StaticName: "cancel.svg", + StaticContent: cancelIcon, +} + +//go:embed icons/check.svg +var checkIcon []byte + +var checkIconRes = &fyne.StaticResource{ + StaticName: "check.svg", + StaticContent: checkIcon, +} + +//go:embed icons/delete.svg +var deleteIcon []byte + +var deleteIconRes = &fyne.StaticResource{ + StaticName: "delete.svg", + StaticContent: deleteIcon, +} + +//go:embed icons/search.svg +var searchIcon []byte + +var searchIconRes = &fyne.StaticResource{ + StaticName: "search.svg", + StaticContent: searchIcon, +} + +//go:embed icons/search-replace.svg +var searchreplaceIcon []byte + +var searchreplaceIconRes = &fyne.StaticResource{ + StaticName: "search-replace.svg", + StaticContent: searchreplaceIcon, +} + +//go:embed icons/menu.svg +var menuIcon []byte + +var menuIconRes = &fyne.StaticResource{ + StaticName: "menu.svg", + StaticContent: menuIcon, +} + +//go:embed icons/menu-expand.svg +var menuexpandIcon []byte + +var menuexpandIconRes = &fyne.StaticResource{ + StaticName: "menu-expand.svg", + StaticContent: menuexpandIcon, +} + +//go:embed icons/check-box.svg +var checkboxIcon []byte + +var checkboxIconRes = &fyne.StaticResource{ + StaticName: "check-box.svg", + StaticContent: checkboxIcon, +} + +//go:embed icons/check-box-checked.svg +var checkboxcheckedIcon []byte + +var checkboxcheckedIconRes = &fyne.StaticResource{ + StaticName: "check-box-checked.svg", + StaticContent: checkboxcheckedIcon, +} + +//go:embed icons/check-box-fill.svg +var checkboxfillIcon []byte + +var checkboxfillIconRes = &fyne.StaticResource{ + StaticName: "check-box-fill.svg", + StaticContent: checkboxfillIcon, +} + +//go:embed icons/check-box-partial.svg +var checkboxpartialIcon []byte + +var checkboxpartialIconRes = &fyne.StaticResource{ + StaticName: "check-box-partial.svg", + StaticContent: checkboxpartialIcon, +} + +//go:embed icons/radio-button.svg +var radiobuttonIcon []byte + +var radiobuttonIconRes = &fyne.StaticResource{ + StaticName: "radio-button.svg", + StaticContent: radiobuttonIcon, +} + +//go:embed icons/radio-button-checked.svg +var radiobuttoncheckedIcon []byte + +var radiobuttoncheckedIconRes = &fyne.StaticResource{ + StaticName: "radio-button-checked.svg", + StaticContent: radiobuttoncheckedIcon, +} + +//go:embed icons/radio-button-fill.svg +var radiobuttonfillIcon []byte + +var radiobuttonfillIconRes = &fyne.StaticResource{ + StaticName: "radio-button-fill.svg", + StaticContent: radiobuttonfillIcon, +} + +//go:embed icons/content-add.svg +var contentaddIcon []byte + +var contentaddIconRes = &fyne.StaticResource{ + StaticName: "content-add.svg", + StaticContent: contentaddIcon, +} + +//go:embed icons/content-remove.svg +var contentremoveIcon []byte + +var contentremoveIconRes = &fyne.StaticResource{ + StaticName: "content-remove.svg", + StaticContent: contentremoveIcon, +} + +//go:embed icons/content-cut.svg +var contentcutIcon []byte + +var contentcutIconRes = &fyne.StaticResource{ + StaticName: "content-cut.svg", + StaticContent: contentcutIcon, +} + +//go:embed icons/content-copy.svg +var contentcopyIcon []byte + +var contentcopyIconRes = &fyne.StaticResource{ + StaticName: "content-copy.svg", + StaticContent: contentcopyIcon, +} + +//go:embed icons/content-paste.svg +var contentpasteIcon []byte + +var contentpasteIconRes = &fyne.StaticResource{ + StaticName: "content-paste.svg", + StaticContent: contentpasteIcon, +} + +//go:embed icons/content-redo.svg +var contentredoIcon []byte + +var contentredoIconRes = &fyne.StaticResource{ + StaticName: "content-redo.svg", + StaticContent: contentredoIcon, +} + +//go:embed icons/content-undo.svg +var contentundoIcon []byte + +var contentundoIconRes = &fyne.StaticResource{ + StaticName: "content-undo.svg", + StaticContent: contentundoIcon, +} + +//go:embed icons/color-achromatic.svg +var colorachromaticIcon []byte + +var colorachromaticIconRes = &fyne.StaticResource{ + StaticName: "color-achromatic.svg", + StaticContent: colorachromaticIcon, +} + +//go:embed icons/color-chromatic.svg +var colorchromaticIcon []byte + +var colorchromaticIconRes = &fyne.StaticResource{ + StaticName: "color-chromatic.svg", + StaticContent: colorchromaticIcon, +} + +//go:embed icons/color-palette.svg +var colorpaletteIcon []byte + +var colorpaletteIconRes = &fyne.StaticResource{ + StaticName: "color-palette.svg", + StaticContent: colorpaletteIcon, +} + +//go:embed icons/document.svg +var documentIcon []byte + +var documentIconRes = &fyne.StaticResource{ + StaticName: "document.svg", + StaticContent: documentIcon, +} + +//go:embed icons/document-create.svg +var documentcreateIcon []byte + +var documentcreateIconRes = &fyne.StaticResource{ + StaticName: "document-create.svg", + StaticContent: documentcreateIcon, +} + +//go:embed icons/document-print.svg +var documentprintIcon []byte + +var documentprintIconRes = &fyne.StaticResource{ + StaticName: "document-print.svg", + StaticContent: documentprintIcon, +} + +//go:embed icons/document-save.svg +var documentsaveIcon []byte + +var documentsaveIconRes = &fyne.StaticResource{ + StaticName: "document-save.svg", + StaticContent: documentsaveIcon, +} + +//go:embed icons/drag-corner-indicator.svg +var dragcornerindicatorIcon []byte + +var dragcornerindicatorIconRes = &fyne.StaticResource{ + StaticName: "drag-corner-indicator.svg", + StaticContent: dragcornerindicatorIcon, +} + +//go:embed icons/more-horizontal.svg +var morehorizontalIcon []byte + +var morehorizontalIconRes = &fyne.StaticResource{ + StaticName: "more-horizontal.svg", + StaticContent: morehorizontalIcon, +} + +//go:embed icons/more-vertical.svg +var moreverticalIcon []byte + +var moreverticalIconRes = &fyne.StaticResource{ + StaticName: "more-vertical.svg", + StaticContent: moreverticalIcon, +} + +//go:embed icons/info.svg +var infoIcon []byte + +var infoIconRes = &fyne.StaticResource{ + StaticName: "info.svg", + StaticContent: infoIcon, +} + +//go:embed icons/question.svg +var questionIcon []byte + +var questionIconRes = &fyne.StaticResource{ + StaticName: "question.svg", + StaticContent: questionIcon, +} + +//go:embed icons/warning.svg +var warningIcon []byte + +var warningIconRes = &fyne.StaticResource{ + StaticName: "warning.svg", + StaticContent: warningIcon, +} + +//go:embed icons/error.svg +var errorIcon []byte + +var errorIconRes = &fyne.StaticResource{ + StaticName: "error.svg", + StaticContent: errorIcon, +} + +//go:embed icons/broken-image.svg +var brokenimageIcon []byte + +var brokenimageIconRes = &fyne.StaticResource{ + StaticName: "broken-image.svg", + StaticContent: brokenimageIcon, +} + +//go:embed icons/arrow-back.svg +var arrowbackIcon []byte + +var arrowbackIconRes = &fyne.StaticResource{ + StaticName: "arrow-back.svg", + StaticContent: arrowbackIcon, +} + +//go:embed icons/arrow-down.svg +var arrowdownIcon []byte + +var arrowdownIconRes = &fyne.StaticResource{ + StaticName: "arrow-down.svg", + StaticContent: arrowdownIcon, +} + +//go:embed icons/arrow-forward.svg +var arrowforwardIcon []byte + +var arrowforwardIconRes = &fyne.StaticResource{ + StaticName: "arrow-forward.svg", + StaticContent: arrowforwardIcon, +} + +//go:embed icons/arrow-up.svg +var arrowupIcon []byte + +var arrowupIconRes = &fyne.StaticResource{ + StaticName: "arrow-up.svg", + StaticContent: arrowupIcon, +} + +//go:embed icons/arrow-drop-down.svg +var arrowdropdownIcon []byte + +var arrowdropdownIconRes = &fyne.StaticResource{ + StaticName: "arrow-drop-down.svg", + StaticContent: arrowdropdownIcon, +} + +//go:embed icons/arrow-drop-up.svg +var arrowdropupIcon []byte + +var arrowdropupIconRes = &fyne.StaticResource{ + StaticName: "arrow-drop-up.svg", + StaticContent: arrowdropupIcon, +} + +//go:embed icons/file.svg +var fileIcon []byte + +var fileIconRes = &fyne.StaticResource{ + StaticName: "file.svg", + StaticContent: fileIcon, +} + +//go:embed icons/file-application.svg +var fileapplicationIcon []byte + +var fileapplicationIconRes = &fyne.StaticResource{ + StaticName: "file-application.svg", + StaticContent: fileapplicationIcon, +} + +//go:embed icons/file-audio.svg +var fileaudioIcon []byte + +var fileaudioIconRes = &fyne.StaticResource{ + StaticName: "file-audio.svg", + StaticContent: fileaudioIcon, +} + +//go:embed icons/file-image.svg +var fileimageIcon []byte + +var fileimageIconRes = &fyne.StaticResource{ + StaticName: "file-image.svg", + StaticContent: fileimageIcon, +} + +//go:embed icons/file-text.svg +var filetextIcon []byte + +var filetextIconRes = &fyne.StaticResource{ + StaticName: "file-text.svg", + StaticContent: filetextIcon, +} + +//go:embed icons/file-video.svg +var filevideoIcon []byte + +var filevideoIconRes = &fyne.StaticResource{ + StaticName: "file-video.svg", + StaticContent: filevideoIcon, +} + +//go:embed icons/folder.svg +var folderIcon []byte + +var folderIconRes = &fyne.StaticResource{ + StaticName: "folder.svg", + StaticContent: folderIcon, +} + +//go:embed icons/folder-new.svg +var foldernewIcon []byte + +var foldernewIconRes = &fyne.StaticResource{ + StaticName: "folder-new.svg", + StaticContent: foldernewIcon, +} + +//go:embed icons/folder-open.svg +var folderopenIcon []byte + +var folderopenIconRes = &fyne.StaticResource{ + StaticName: "folder-open.svg", + StaticContent: folderopenIcon, +} + +//go:embed icons/help.svg +var helpIcon []byte + +var helpIconRes = &fyne.StaticResource{ + StaticName: "help.svg", + StaticContent: helpIcon, +} + +//go:embed icons/history.svg +var historyIcon []byte + +var historyIconRes = &fyne.StaticResource{ + StaticName: "history.svg", + StaticContent: historyIcon, +} + +//go:embed icons/home.svg +var homeIcon []byte + +var homeIconRes = &fyne.StaticResource{ + StaticName: "home.svg", + StaticContent: homeIcon, +} + +//go:embed icons/settings.svg +var settingsIcon []byte + +var settingsIconRes = &fyne.StaticResource{ + StaticName: "settings.svg", + StaticContent: settingsIcon, +} + +//go:embed icons/mail-attachment.svg +var mailattachmentIcon []byte + +var mailattachmentIconRes = &fyne.StaticResource{ + StaticName: "mail-attachment.svg", + StaticContent: mailattachmentIcon, +} + +//go:embed icons/mail-compose.svg +var mailcomposeIcon []byte + +var mailcomposeIconRes = &fyne.StaticResource{ + StaticName: "mail-compose.svg", + StaticContent: mailcomposeIcon, +} + +//go:embed icons/mail-forward.svg +var mailforwardIcon []byte + +var mailforwardIconRes = &fyne.StaticResource{ + StaticName: "mail-forward.svg", + StaticContent: mailforwardIcon, +} + +//go:embed icons/mail-reply.svg +var mailreplyIcon []byte + +var mailreplyIconRes = &fyne.StaticResource{ + StaticName: "mail-reply.svg", + StaticContent: mailreplyIcon, +} + +//go:embed icons/mail-reply_all.svg +var mailreplyallIcon []byte + +var mailreplyallIconRes = &fyne.StaticResource{ + StaticName: "mail-reply_all.svg", + StaticContent: mailreplyallIcon, +} + +//go:embed icons/mail-send.svg +var mailsendIcon []byte + +var mailsendIconRes = &fyne.StaticResource{ + StaticName: "mail-send.svg", + StaticContent: mailsendIcon, +} + +//go:embed icons/media-music.svg +var mediamusicIcon []byte + +var mediamusicIconRes = &fyne.StaticResource{ + StaticName: "media-music.svg", + StaticContent: mediamusicIcon, +} + +//go:embed icons/media-photo.svg +var mediaphotoIcon []byte + +var mediaphotoIconRes = &fyne.StaticResource{ + StaticName: "media-photo.svg", + StaticContent: mediaphotoIcon, +} + +//go:embed icons/media-video.svg +var mediavideoIcon []byte + +var mediavideoIconRes = &fyne.StaticResource{ + StaticName: "media-video.svg", + StaticContent: mediavideoIcon, +} + +//go:embed icons/media-fast-forward.svg +var mediafastforwardIcon []byte + +var mediafastforwardIconRes = &fyne.StaticResource{ + StaticName: "media-fast-forward.svg", + StaticContent: mediafastforwardIcon, +} + +//go:embed icons/media-fast-rewind.svg +var mediafastrewindIcon []byte + +var mediafastrewindIconRes = &fyne.StaticResource{ + StaticName: "media-fast-rewind.svg", + StaticContent: mediafastrewindIcon, +} + +//go:embed icons/media-pause.svg +var mediapauseIcon []byte + +var mediapauseIconRes = &fyne.StaticResource{ + StaticName: "media-pause.svg", + StaticContent: mediapauseIcon, +} + +//go:embed icons/media-play.svg +var mediaplayIcon []byte + +var mediaplayIconRes = &fyne.StaticResource{ + StaticName: "media-play.svg", + StaticContent: mediaplayIcon, +} + +//go:embed icons/media-record.svg +var mediarecordIcon []byte + +var mediarecordIconRes = &fyne.StaticResource{ + StaticName: "media-record.svg", + StaticContent: mediarecordIcon, +} + +//go:embed icons/media-replay.svg +var mediareplayIcon []byte + +var mediareplayIconRes = &fyne.StaticResource{ + StaticName: "media-replay.svg", + StaticContent: mediareplayIcon, +} + +//go:embed icons/media-skip-next.svg +var mediaskipnextIcon []byte + +var mediaskipnextIconRes = &fyne.StaticResource{ + StaticName: "media-skip-next.svg", + StaticContent: mediaskipnextIcon, +} + +//go:embed icons/media-skip-previous.svg +var mediaskippreviousIcon []byte + +var mediaskippreviousIconRes = &fyne.StaticResource{ + StaticName: "media-skip-previous.svg", + StaticContent: mediaskippreviousIcon, +} + +//go:embed icons/media-stop.svg +var mediastopIcon []byte + +var mediastopIconRes = &fyne.StaticResource{ + StaticName: "media-stop.svg", + StaticContent: mediastopIcon, +} + +//go:embed icons/view-fullscreen.svg +var viewfullscreenIcon []byte + +var viewfullscreenIconRes = &fyne.StaticResource{ + StaticName: "view-fullscreen.svg", + StaticContent: viewfullscreenIcon, +} + +//go:embed icons/view-refresh.svg +var viewrefreshIcon []byte + +var viewrefreshIconRes = &fyne.StaticResource{ + StaticName: "view-refresh.svg", + StaticContent: viewrefreshIcon, +} + +//go:embed icons/view-zoom-fit.svg +var viewzoomfitIcon []byte + +var viewzoomfitIconRes = &fyne.StaticResource{ + StaticName: "view-zoom-fit.svg", + StaticContent: viewzoomfitIcon, +} + +//go:embed icons/view-zoom-in.svg +var viewzoominIcon []byte + +var viewzoominIconRes = &fyne.StaticResource{ + StaticName: "view-zoom-in.svg", + StaticContent: viewzoominIcon, +} + +//go:embed icons/view-zoom-out.svg +var viewzoomoutIcon []byte + +var viewzoomoutIconRes = &fyne.StaticResource{ + StaticName: "view-zoom-out.svg", + StaticContent: viewzoomoutIcon, +} + +//go:embed icons/volume-down.svg +var volumedownIcon []byte + +var volumedownIconRes = &fyne.StaticResource{ + StaticName: "volume-down.svg", + StaticContent: volumedownIcon, +} + +//go:embed icons/volume-mute.svg +var volumemuteIcon []byte + +var volumemuteIconRes = &fyne.StaticResource{ + StaticName: "volume-mute.svg", + StaticContent: volumemuteIcon, +} + +//go:embed icons/volume-up.svg +var volumeupIcon []byte + +var volumeupIconRes = &fyne.StaticResource{ + StaticName: "volume-up.svg", + StaticContent: volumeupIcon, +} + +//go:embed icons/visibility.svg +var visibilityIcon []byte + +var visibilityIconRes = &fyne.StaticResource{ + StaticName: "visibility.svg", + StaticContent: visibilityIcon, +} + +//go:embed icons/visibility-off.svg +var visibilityoffIcon []byte + +var visibilityoffIconRes = &fyne.StaticResource{ + StaticName: "visibility-off.svg", + StaticContent: visibilityoffIcon, +} + +//go:embed icons/download.svg +var downloadIcon []byte + +var downloadIconRes = &fyne.StaticResource{ + StaticName: "download.svg", + StaticContent: downloadIcon, +} + +//go:embed icons/computer.svg +var computerIcon []byte + +var computerIconRes = &fyne.StaticResource{ + StaticName: "computer.svg", + StaticContent: computerIcon, +} + +//go:embed icons/desktop.svg +var desktopIcon []byte + +var desktopIconRes = &fyne.StaticResource{ + StaticName: "desktop.svg", + StaticContent: desktopIcon, +} + +//go:embed icons/storage.svg +var storageIcon []byte + +var storageIconRes = &fyne.StaticResource{ + StaticName: "storage.svg", + StaticContent: storageIcon, +} + +//go:embed icons/upload.svg +var uploadIcon []byte + +var uploadIconRes = &fyne.StaticResource{ + StaticName: "upload.svg", + StaticContent: uploadIcon, +} + +//go:embed icons/account.svg +var accountIcon []byte + +var accountIconRes = &fyne.StaticResource{ + StaticName: "account.svg", + StaticContent: accountIcon, +} + +//go:embed icons/calendar.svg +var calendarIcon []byte + +var calendarIconRes = &fyne.StaticResource{ + StaticName: "calendar.svg", + StaticContent: calendarIcon, +} + +//go:embed icons/login.svg +var loginIcon []byte + +var loginIconRes = &fyne.StaticResource{ + StaticName: "login.svg", + StaticContent: loginIcon, +} + +//go:embed icons/logout.svg +var logoutIcon []byte + +var logoutIconRes = &fyne.StaticResource{ + StaticName: "logout.svg", + StaticContent: logoutIcon, +} + +//go:embed icons/list.svg +var listIcon []byte + +var listIconRes = &fyne.StaticResource{ + StaticName: "list.svg", + StaticContent: listIcon, +} + +//go:embed icons/grid.svg +var gridIcon []byte + +var gridIconRes = &fyne.StaticResource{ + StaticName: "grid.svg", + StaticContent: gridIcon, +} + +//go:embed icons/maximize.svg +var maximizeIcon []byte + +var maximizeIconRes = &fyne.StaticResource{ + StaticName: "maximize.svg", + StaticContent: maximizeIcon, +} + +//go:embed icons/minimize.svg +var minimizeIcon []byte + +var minimizeIconRes = &fyne.StaticResource{ + StaticName: "minimize.svg", + StaticContent: minimizeIcon, +} diff --git a/vendor/fyne.io/fyne/v2/theme/color.go b/vendor/fyne.io/fyne/v2/theme/color.go new file mode 100644 index 0000000..8aac84b --- /dev/null +++ b/vendor/fyne.io/fyne/v2/theme/color.go @@ -0,0 +1,482 @@ +package theme + +import ( + "image/color" + + "fyne.io/fyne/v2" + internaltheme "fyne.io/fyne/v2/internal/theme" +) + +// Keep in mind to add new constants to the tests at test/theme.go. +const ( + // ColorRed is the red primary color name. + // + // Since: 1.4 + ColorRed = internaltheme.ColorRed + // ColorOrange is the orange primary color name. + // + // Since: 1.4 + ColorOrange = internaltheme.ColorOrange + // ColorYellow is the yellow primary color name. + // + // Since: 1.4 + ColorYellow = internaltheme.ColorYellow + // ColorGreen is the green primary color name. + // + // Since: 1.4 + ColorGreen = internaltheme.ColorGreen + // ColorBlue is the blue primary color name. + // + // Since: 1.4 + ColorBlue = internaltheme.ColorBlue + // ColorPurple is the purple primary color name. + // + // Since: 1.4 + ColorPurple = internaltheme.ColorPurple + // ColorBrown is the brown primary color name. + // + // Since: 1.4 + ColorBrown = internaltheme.ColorBrown + // ColorGray is the gray primary color name. + // + // Since: 1.4 + ColorGray = internaltheme.ColorGray + + // ColorNameBackground is the name of theme lookup for background color. + // + // Since: 2.0 + ColorNameBackground fyne.ThemeColorName = "background" + + // ColorNameButton is the name of theme lookup for button color. + // + // Since: 2.0 + ColorNameButton fyne.ThemeColorName = "button" + + // ColorNameDisabledButton is the name of theme lookup for disabled button color. + // + // Since: 2.0 + ColorNameDisabledButton fyne.ThemeColorName = "disabledButton" + + // ColorNameDisabled is the name of theme lookup for disabled foreground color. + // + // Since: 2.0 + ColorNameDisabled fyne.ThemeColorName = "disabled" + + // ColorNameError is the name of theme lookup for error color. + // + // Since: 2.0 + ColorNameError fyne.ThemeColorName = "error" + + // ColorNameFocus is the name of theme lookup for focus color. + // + // Since: 2.0 + ColorNameFocus fyne.ThemeColorName = "focus" + + // ColorNameForeground is the name of theme lookup for foreground color. + // + // Since: 2.0 + ColorNameForeground fyne.ThemeColorName = "foreground" + + // ColorNameForegroundOnError is the name of theme lookup for a contrast color to the error color. + // + // Since: 2.5 + ColorNameForegroundOnError fyne.ThemeColorName = "foregroundOnError" + + // ColorNameForegroundOnPrimary is the name of theme lookup for a contrast color to the primary color. + // + // Since: 2.5 + ColorNameForegroundOnPrimary fyne.ThemeColorName = "foregroundOnPrimary" + + // ColorNameForegroundOnSuccess is the name of theme lookup for a contrast color to the success color. + // + // Since: 2.5 + ColorNameForegroundOnSuccess fyne.ThemeColorName = "foregroundOnSuccess" + + // ColorNameForegroundOnWarning is the name of theme lookup for a contrast color to the warning color. + // + // Since: 2.5 + ColorNameForegroundOnWarning fyne.ThemeColorName = "foregroundOnWarning" + + // ColorNameHeaderBackground is the name of theme lookup for background color of a collection header. + // + // Since: 2.4 + ColorNameHeaderBackground fyne.ThemeColorName = "headerBackground" + + // ColorNameHover is the name of theme lookup for hover color. + // + // Since: 2.0 + ColorNameHover fyne.ThemeColorName = "hover" + + // ColorNameHyperlink is the name of theme lookup for hyperlink color. + // + // Since: 2.4 + ColorNameHyperlink fyne.ThemeColorName = "hyperlink" + + // ColorNameInputBackground is the name of theme lookup for background color of an input field. + // + // Since: 2.0 + ColorNameInputBackground fyne.ThemeColorName = "inputBackground" + + // ColorNameInputBorder is the name of theme lookup for border color of an input field. + // + // Since: 2.3 + ColorNameInputBorder fyne.ThemeColorName = "inputBorder" + + // ColorNameMenuBackground is the name of theme lookup for background color of menus. + // + // Since: 2.3 + ColorNameMenuBackground fyne.ThemeColorName = "menuBackground" + + // ColorNameOverlayBackground is the name of theme lookup for background color of overlays like dialogs. + // + // Since: 2.3 + ColorNameOverlayBackground fyne.ThemeColorName = "overlayBackground" + + // ColorNamePlaceHolder is the name of theme lookup for placeholder text color. + // + // Since: 2.0 + ColorNamePlaceHolder fyne.ThemeColorName = "placeholder" + + // ColorNamePressed is the name of theme lookup for the tap overlay color. + // + // Since: 2.0 + ColorNamePressed fyne.ThemeColorName = "pressed" + + // ColorNamePrimary is the name of theme lookup for primary color. + // + // Since: 2.0 + ColorNamePrimary fyne.ThemeColorName = "primary" + + // ColorNameScrollBar is the name of theme lookup for scrollbar color. + // + // Since: 2.0 + ColorNameScrollBar fyne.ThemeColorName = "scrollBar" + + // ColorNameScrollBarBackground is the name of theme lookup for scrollbar background color. + // + // Since: 2.6 + ColorNameScrollBarBackground fyne.ThemeColorName = "scrollBarBackground" + + // ColorNameSelection is the name of theme lookup for selection color. + // + // Since: 2.1 + ColorNameSelection fyne.ThemeColorName = "selection" + + // ColorNameSeparator is the name of theme lookup for separator bars. + // + // Since: 2.3 + ColorNameSeparator fyne.ThemeColorName = "separator" + + // ColorNameShadow is the name of theme lookup for shadow color. + // + // Since: 2.0 + ColorNameShadow fyne.ThemeColorName = "shadow" + + // ColorNameSuccess is the name of theme lookup for success color. + // + // Since: 2.3 + ColorNameSuccess fyne.ThemeColorName = "success" + + // ColorNameWarning is the name of theme lookup for warning color. + // + // Since: 2.3 + ColorNameWarning fyne.ThemeColorName = "warning" +) + +var ( + colorDarkBackground = color.NRGBA{R: 0x17, G: 0x17, B: 0x18, A: 0xff} + colorDarkButton = color.NRGBA{R: 0x28, G: 0x29, B: 0x2e, A: 0xff} + colorDarkDisabled = color.NRGBA{R: 0x39, G: 0x39, B: 0x3a, A: 0xff} + colorDarkDisabledButton = color.NRGBA{R: 0x28, G: 0x29, B: 0x2e, A: 0xff} + colorDarkError = color.NRGBA{R: 0xf4, G: 0x43, B: 0x36, A: 0xff} + colorDarkForeground = color.NRGBA{R: 0xf3, G: 0xf3, B: 0xf3, A: 0xff} + colorDarkForegroundOnError = color.NRGBA{R: 0x17, G: 0x17, B: 0x18, A: 0xff} + colorDarkForegroundOnSuccess = color.NRGBA{R: 0x17, G: 0x17, B: 0x18, A: 0xff} + colorDarkForegroundOnWarning = color.NRGBA{R: 0x17, G: 0x17, B: 0x18, A: 0xff} + colorDarkHeaderBackground = color.NRGBA{R: 0x1b, G: 0x1b, B: 0x1b, A: 0xff} + colorDarkHover = color.NRGBA{R: 0xff, G: 0xff, B: 0xff, A: 0x0f} + colorDarkInputBackground = color.NRGBA{R: 0x20, G: 0x20, B: 0x23, A: 0xff} + colorDarkInputBorder = color.NRGBA{R: 0x39, G: 0x39, B: 0x3a, A: 0xff} + colorDarkMenuBackground = color.NRGBA{R: 0x28, G: 0x29, B: 0x2e, A: 0xff} + colorDarkOverlayBackground = color.NRGBA{R: 0x18, G: 0x1d, B: 0x25, A: 0xff} + colorDarkPlaceholder = color.NRGBA{R: 0xb2, G: 0xb2, B: 0xb2, A: 0xff} + colorDarkPressed = color.NRGBA{R: 0xff, G: 0xff, B: 0xff, A: 0x66} + colorDarkScrollBar = color.NRGBA{R: 0xff, G: 0xff, B: 0xff, A: 0x99} + colorDarkScrollBarBackground = color.NRGBA{R: 0x20, G: 0x20, B: 0x23, A: 0xff} + colorDarkSeparator = color.NRGBA{R: 0x00, G: 0x00, B: 0x00, A: 0xff} + colorDarkShadow = color.NRGBA{R: 0x00, G: 0x00, B: 0x00, A: 0x66} + colorDarkSuccess = color.NRGBA{R: 0x43, G: 0xf4, B: 0x36, A: 0xff} + colorDarkWarning = color.NRGBA{R: 0xff, G: 0x98, B: 0x00, A: 0xff} + + colorLightBackground = color.NRGBA{R: 0xff, G: 0xff, B: 0xff, A: 0xff} + colorLightButton = color.NRGBA{R: 0xf5, G: 0xf5, B: 0xf5, A: 0xff} + colorLightDisabled = color.NRGBA{R: 0xe3, G: 0xe3, B: 0xe3, A: 0xff} + colorLightDisabledButton = color.NRGBA{R: 0xf5, G: 0xf5, B: 0xf5, A: 0xff} + colorLightError = color.NRGBA{R: 0xf4, G: 0x43, B: 0x36, A: 0xff} + colorLightFocusBlue = color.NRGBA{R: 0x00, G: 0x6c, B: 0xff, A: 0x2a} + colorLightFocusBrown = color.NRGBA{R: 0x79, G: 0x55, B: 0x48, A: 0x7f} + colorLightFocusGray = color.NRGBA{R: 0x9e, G: 0x9e, B: 0x9e, A: 0x7f} + colorLightFocusGreen = color.NRGBA{R: 0x8b, G: 0xc3, B: 0x4a, A: 0x7f} + colorLightFocusOrange = color.NRGBA{R: 0xff, G: 0x98, B: 0x00, A: 0x7f} + colorLightFocusPurple = color.NRGBA{R: 0x9c, G: 0x27, B: 0xb0, A: 0x7f} + colorLightFocusRed = color.NRGBA{R: 0xf4, G: 0x43, B: 0x36, A: 0x7f} + colorLightFocusYellow = color.NRGBA{R: 0xff, G: 0xeb, B: 0x3b, A: 0x7f} + colorLightForeground = color.NRGBA{R: 0x56, G: 0x56, B: 0x56, A: 0xff} + colorLightForegroundOnError = color.NRGBA{R: 0xff, G: 0xff, B: 0xff, A: 0xff} + colorLightForegroundOnSuccess = color.NRGBA{R: 0xff, G: 0xff, B: 0xff, A: 0xff} + colorLightForegroundOnWarning = color.NRGBA{R: 0xff, G: 0xff, B: 0xff, A: 0xff} + colorLightHeaderBackground = color.NRGBA{R: 0xf9, G: 0xf9, B: 0xf9, A: 0xff} + colorLightHover = color.NRGBA{R: 0x00, G: 0x00, B: 0x00, A: 0x0f} + colorLightInputBackground = color.NRGBA{R: 0xf3, G: 0xf3, B: 0xf3, A: 0xff} + colorLightInputBorder = color.NRGBA{R: 0xe3, G: 0xe3, B: 0xe3, A: 0xff} + colorLightMenuBackground = color.NRGBA{R: 0xf5, G: 0xf5, B: 0xf5, A: 0xff} + colorLightOverlayBackground = color.NRGBA{R: 0xff, G: 0xff, B: 0xff, A: 0xff} + colorLightPlaceholder = color.NRGBA{R: 0x88, G: 0x88, B: 0x88, A: 0xff} + colorLightPressed = color.NRGBA{R: 0x00, G: 0x00, B: 0x00, A: 0x19} + colorLightScrollBar = color.NRGBA{R: 0x00, G: 0x00, B: 0x00, A: 0x99} + colorLightScrollBarBackground = color.NRGBA{R: 0xdb, G: 0xdb, B: 0xdb, A: 0xff} + colorLightSelectionBlue = color.NRGBA{R: 0x00, G: 0x6c, B: 0xff, A: 0x40} + colorLightSelectionBrown = color.NRGBA{R: 0x79, G: 0x55, B: 0x48, A: 0x3f} + colorLightSelectionGray = color.NRGBA{R: 0x9e, G: 0x9e, B: 0x9e, A: 0x3f} + colorLightSelectionGreen = color.NRGBA{R: 0x8b, G: 0xc3, B: 0x4a, A: 0x3f} + colorLightSelectionOrange = color.NRGBA{R: 0xff, G: 0x98, B: 0x00, A: 0x3f} + colorLightSelectionPurple = color.NRGBA{R: 0x9c, G: 0x27, B: 0xb0, A: 0x3f} + colorLightSelectionRed = color.NRGBA{R: 0xf4, G: 0x43, B: 0x36, A: 0x3f} + colorLightSelectionYellow = color.NRGBA{R: 0xff, G: 0xeb, B: 0x3b, A: 0x3f} + colorLightSeparator = color.NRGBA{R: 0xe3, G: 0xe3, B: 0xe3, A: 0xff} + colorLightShadow = color.NRGBA{R: 0x00, G: 0x00, B: 0x00, A: 0x33} + colorLightSuccess = color.NRGBA{R: 0x43, G: 0xf4, B: 0x36, A: 0xff} + colorLightWarning = color.NRGBA{R: 0xff, G: 0x98, B: 0x00, A: 0xff} +) + +// BackgroundColor returns the theme's background color. +// +// Deprecated: Use Color(theme.ColorNameBackground) instead. +func BackgroundColor() color.Color { + return safeColorLookup(ColorNameBackground, currentVariant()) +} + +// ButtonColor returns the theme's standard button color. +// +// Deprecated: Use Color(theme.ColorNameButton) instead. +func ButtonColor() color.Color { + return safeColorLookup(ColorNameButton, currentVariant()) +} + +// Color looks up the named colour for current theme and variant. +// +// Since: 2.5 +func Color(name fyne.ThemeColorName) color.Color { + return safeColorLookup(name, currentVariant()) +} + +// ColorForWidget looks up the named colour for the requested widget using the current theme and variant. +// If the widget theme has been overridden that theme will be used. +// +// Since: 2.5 +func ColorForWidget(name fyne.ThemeColorName, w fyne.Widget) color.Color { + return CurrentForWidget(w).Color(name, currentVariant()) +} + +// DisabledButtonColor returns the theme's disabled button color. +// +// Deprecated: Use Color(theme.ColorNameDisabledButton) instead. +func DisabledButtonColor() color.Color { + return safeColorLookup(ColorNameDisabledButton, currentVariant()) +} + +// DisabledColor returns the foreground color for a disabled UI element. +// +// Since: 2.0 +// +// Deprecated: Use Color(theme.ColorNameDisabled) instead. +func DisabledColor() color.Color { + return safeColorLookup(ColorNameDisabled, currentVariant()) +} + +// DisabledTextColor returns the theme's disabled text color - this is actually the disabled color since 1.4. +// +// Deprecated: Use Color(theme.ColorNameDisabled) instead. +func DisabledTextColor() color.Color { + return DisabledColor() +} + +// ErrorColor returns the theme's error foreground color. +// +// Since: 2.0 +// +// Deprecated: Use Color(theme.ColorNameError) instead. +func ErrorColor() color.Color { + return safeColorLookup(ColorNameError, currentVariant()) +} + +// FocusColor returns the color used to highlight a focused widget. +// +// Deprecated: Use Color(theme.ColorNameFocus) instead. +func FocusColor() color.Color { + return safeColorLookup(ColorNameFocus, currentVariant()) +} + +// ForegroundColor returns the theme's standard foreground color for text and icons. +// +// Since: 2.0 +// +// Deprecated: Use Color(theme.ColorNameForeground) instead. +func ForegroundColor() color.Color { + return safeColorLookup(ColorNameForeground, currentVariant()) +} + +// HeaderBackgroundColor returns the color used to draw underneath collection headers. +// +// Since: 2.4 +// +// Deprecated: Use Color(theme.ColorNameHeaderBackground) instead. +func HeaderBackgroundColor() color.Color { + return Current().Color(ColorNameHeaderBackground, currentVariant()) +} + +// HoverColor returns the color used to highlight interactive elements currently under a cursor. +// +// Deprecated: Use Color(theme.ColorNameHover) instead. +func HoverColor() color.Color { + return safeColorLookup(ColorNameHover, currentVariant()) +} + +// HyperlinkColor returns the color used for the Hyperlink widget and hyperlink text elements. +// +// Deprecated: Use Color(theme.ColorNameHyperlink) instead. +func HyperlinkColor() color.Color { + return safeColorLookup(ColorNameHyperlink, currentVariant()) +} + +// InputBackgroundColor returns the color used to draw underneath input elements. +// +// Deprecated: Use Color(theme.ColorNameInputBackground) instead. +func InputBackgroundColor() color.Color { + return Current().Color(ColorNameInputBackground, currentVariant()) +} + +// InputBorderColor returns the color used to draw underneath input elements. +// +// Since: 2.3 +// +// Deprecated: Use Color(theme.ColorNameInputBorder) instead. +func InputBorderColor() color.Color { + return Current().Color(ColorNameInputBorder, currentVariant()) +} + +// MenuBackgroundColor returns the theme's background color for menus. +// +// Since: 2.3 +// +// Deprecated: Use Color(theme.ColorNameMenuBackground) instead. +func MenuBackgroundColor() color.Color { + return safeColorLookup(ColorNameMenuBackground, currentVariant()) +} + +// OverlayBackgroundColor returns the theme's background color for overlays like dialogs. +// +// Since: 2.3 +// +// Deprecated: Use Color(theme.ColorNameOverlayBackground) instead. +func OverlayBackgroundColor() color.Color { + return safeColorLookup(ColorNameOverlayBackground, currentVariant()) +} + +// PlaceHolderColor returns the theme's standard text color. +// +// Deprecated: Use Color(theme.ColorNamePlaceHolder) instead. +func PlaceHolderColor() color.Color { + return safeColorLookup(ColorNamePlaceHolder, currentVariant()) +} + +// PressedColor returns the color used to overlap tapped features. +// +// Since: 2.0 +// +// Deprecated: Use Color(theme.ColorNamePressed) instead. +func PressedColor() color.Color { + return safeColorLookup(ColorNamePressed, currentVariant()) +} + +// PrimaryColor returns the color used to highlight primary features. +// +// Deprecated: Use Color(theme.ColorNamePrimary) instead. +func PrimaryColor() color.Color { + return safeColorLookup(ColorNamePrimary, currentVariant()) +} + +// PrimaryColorNamed returns a theme specific color value for a named primary color. +// +// Since: 1.4 +// +// Deprecated: You should not access named primary colors but access the primary color using Color(theme.ColorNamePrimary) instead. +func PrimaryColorNamed(name string) color.Color { + return internaltheme.PrimaryColorNamed(name) +} + +// PrimaryColorNames returns a list of the standard primary color options. +// +// Since: 1.4 +func PrimaryColorNames() []string { + return []string{ColorRed, ColorOrange, ColorYellow, ColorGreen, ColorBlue, ColorPurple, ColorBrown, ColorGray} +} + +// ScrollBarColor returns the color (and translucency) for a scrollBar. +// +// Deprecated: Use Color(theme.ColorNameScrollBar) instead. +func ScrollBarColor() color.Color { + return safeColorLookup(ColorNameScrollBar, currentVariant()) +} + +// SelectionColor returns the color for a selected element. +// +// Since: 2.1 +// +// Deprecated: Use Color(theme.ColorNameSelection) instead. +func SelectionColor() color.Color { + return safeColorLookup(ColorNameSelection, currentVariant()) +} + +// SeparatorColor returns the color for the separator element. +// +// Since: 2.3 +// +// Deprecated: Use Color(theme.ColorNameSeparator) instead. +func SeparatorColor() color.Color { + return safeColorLookup(ColorNameSeparator, currentVariant()) +} + +// ShadowColor returns the color (and translucency) for shadows used for indicating elevation. +// +// Deprecated: Use Color(theme.ColorNameShadow) instead. +func ShadowColor() color.Color { + return safeColorLookup(ColorNameShadow, currentVariant()) +} + +// SuccessColor returns the theme's success foreground color. +// +// Since: 2.3 +// +// Deprecated: Use Color(theme.ColorNameSuccess) instead. +func SuccessColor() color.Color { + return safeColorLookup(ColorNameSuccess, currentVariant()) +} + +// WarningColor returns the theme's warning foreground color. +// +// Since: 2.3 +// +// Deprecated: Use Color(theme.ColorNameWarning) instead. +func WarningColor() color.Color { + return safeColorLookup(ColorNameWarning, currentVariant()) +} + +func safeColorLookup(n fyne.ThemeColorName, v fyne.ThemeVariant) color.Color { + col := Current().Color(n, v) + if col == nil { + fyne.LogError("Loaded theme returned nil color", nil) + return fallbackColor + } + return col +} diff --git a/vendor/fyne.io/fyne/v2/theme/font.go b/vendor/fyne.io/fyne/v2/theme/font.go new file mode 100644 index 0000000..2ad102d --- /dev/null +++ b/vendor/fyne.io/fyne/v2/theme/font.go @@ -0,0 +1,119 @@ +package theme + +import ( + "image/color" + + "fyne.io/fyne/v2" +) + +// DefaultEmojiFont returns the font resource for the built-in emoji font. +// This may return nil if the application was packaged without an emoji font. +// +// Since: 2.4 +func DefaultEmojiFont() fyne.Resource { + return emoji +} + +// DefaultTextBoldFont returns the font resource for the built-in bold font style. +func DefaultTextBoldFont() fyne.Resource { + return bold +} + +// DefaultTextBoldItalicFont returns the font resource for the built-in bold and italic font style. +func DefaultTextBoldItalicFont() fyne.Resource { + return bolditalic +} + +// DefaultTextFont returns the font resource for the built-in regular font style. +func DefaultTextFont() fyne.Resource { + return regular +} + +// DefaultTextItalicFont returns the font resource for the built-in italic font style. +func DefaultTextItalicFont() fyne.Resource { + return italic +} + +// DefaultTextMonospaceFont returns the font resource for the built-in monospace font face. +func DefaultTextMonospaceFont() fyne.Resource { + return monospace +} + +// DefaultSymbolFont returns the font resource for the built-in symbol font. +// +// Since: 2.2 +func DefaultSymbolFont() fyne.Resource { + return symbol +} + +// Font looks up the font for current theme and text style. +// +// Since: 2.5 +func Font(style fyne.TextStyle) fyne.Resource { + return safeFontLookup(style) +} + +// TextBoldFont returns the font resource for the bold font style. +func TextBoldFont() fyne.Resource { + return safeFontLookup(fyne.TextStyle{Bold: true}) +} + +// TextBoldItalicFont returns the font resource for the bold and italic font style. +func TextBoldItalicFont() fyne.Resource { + return safeFontLookup(fyne.TextStyle{Bold: true, Italic: true}) +} + +// TextColor returns the theme's standard text color - this is actually the foreground color since 1.4. +// +// Deprecated: Use theme.ForegroundColor() colour instead. +func TextColor() color.Color { + return safeColorLookup(ColorNameForeground, currentVariant()) +} + +// TextFont returns the font resource for the regular font style. +func TextFont() fyne.Resource { + return safeFontLookup(fyne.TextStyle{}) +} + +// TextItalicFont returns the font resource for the italic font style. +func TextItalicFont() fyne.Resource { + return safeFontLookup(fyne.TextStyle{Italic: true}) +} + +// TextMonospaceFont returns the font resource for the monospace font face. +func TextMonospaceFont() fyne.Resource { + return safeFontLookup(fyne.TextStyle{Monospace: true}) +} + +// SymbolFont returns the font resource for the symbol font style. +// +// Since: 2.4 +func SymbolFont() fyne.Resource { + return safeFontLookup(fyne.TextStyle{Symbol: true}) +} + +func safeFontLookup(s fyne.TextStyle) fyne.Resource { + font := Current().Font(s) + if font != nil { + return font + } + fyne.LogError("Loaded theme returned nil font", nil) + + if s.Monospace { + return DefaultTextMonospaceFont() + } + if s.Bold { + if s.Italic { + return DefaultTextBoldItalicFont() + } + return DefaultTextBoldFont() + } + if s.Italic { + return DefaultTextItalicFont() + } + if s.Symbol { + return DefaultSymbolFont() + } + + return DefaultTextFont() +} diff --git a/vendor/fyne.io/fyne/v2/theme/font/DejaVuSansMono-Powerline.ttf b/vendor/fyne.io/fyne/v2/theme/font/DejaVuSansMono-Powerline.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3a6261aea68009eac022457654b73f634773276d GIT binary patch literal 341860 zcmeF(e_R#S{`mX%nzc8eAflq8@?-N$Fi}a-)PsqJiit@{hDC)*hK5Cjg@#2*iHb=@ zMny?QX+}jwMM_19W=TaSEILtPBH)Qro+2Z~+4nUYsm}TIeLU{>-oNgTrsrO3)~xkj zYt77_J^KfW5|KeX*u-b<+~kFKJW(4f_VW@b^`93%XKwcLyc@;#Ydz~P&P!UfIJ)SI zX<|E*Br@&fyv3K!Ubgw6d&SnBOMu2jiziGh?AiQ^h$^A}lI5$HWz}`0eMKm?58J%_ z)@;Y|huytIrZfyDWXc9fSTw zJb$)N$)LdFb;F(YWY)tnR%hqTKPT~G)=!9x+?;vi@@0N4|Be-z!RE;xtC!_u4Q{tZ zusw$Y#|_I?UmNpF`X;em)+iGEV%CkfWRL%{u~lqq^F{8MlXdg8S<~OICH|x;5%*DI z?Hl8&>U}G}%e#7D>@UU+YnUR3XII_Pm!2*-qwH^cOlRHNXti)Xy010^*e9Q!E^zwV z-#%OJ+UR<)StSEz8D270t`|2k#77>nBG@legT&6!P_|E15jn9>vOhw|z}{4UAuEi* z49nB4pZ2gBhOJ#jJO3`foi;=wt=LH`=A=uUIGj#5U(;7T>b_bXO%wI4ll^RsNHWf* zR$dI7x`f`}mSCA?_^90~Ri2d;^`J^u$7O}wBPXRqHj&##ev537JJoUZprp8#E*T}^ z)Zapl{bJSMBp=9X9>0(!l&+z44K26G1bI-V(eGgDm#R->g}Pi4nALEizAO9Wb{6Y# zpS&V_q*Ka>vX3}#%OGNvC}xqdz2Hvj@Ir1dN_-TjV1Nr{sM#lZf7O8{?<0 znxV#$o2}-muV}rBac@y6(nWuxT+6$R<&Q;(v;XY!0kg0c57!*lFb8Yd&iaFAmvFY$ zF!n!|G4x^0!dhNAyKHjJVH5MPmK65FzOzdPGs~d&dw#ctEq}I&I3C#l7gkXAXI4L2 z<}#*N{+rY3>|tN-q5n>ngY4Na{@^^x9{qE#e#~zlbKUg21o4(_9D{Aj;Yzo-_PDjz zdrjcj^s(Ch73+ixcg?qyqt|C2BlhL&c~_z(mUyvp6*KlA-s4i>I&(J3Od`gJzszD@ zAIJ@^Gvi$56W|)9n>b_~XWCTurgfGbmK?eD_wn?T2)R%ml|kZ1pQSRAWxc$>`D~@{ z$$CSpX;N-z*Dj8vnZAkCMn3*PgfbX5U`2qU~{&&T#EZtBwczr0?kNJ$nTA zo;^B!?KY_l*BEYmb)6Dq8Ge-Z`#)H$jH- zOg_wBK9BXGJm-eWee8qVrI!6%O;qdrT*ne9&#_FEN?PB}9$&`{R&Y*RXXt%$fXFG7 zmT^tVV7ZR57f2D~nj^b;EMZxpR&idGu~_kH7`L_D$`Reb@xGd4mLLPMf_=S{Eh|ZT zm#gJd`kg|&4|%r!BB8GG0G^doxC%ZZugOMfldm|Y+vs<{n#Izl9$~pyMYGQasZR9? z%L(-@%T+96)EFa7&9JDoEU&Xz+s;=7YJ#EE5>>8(REqhe3MYSs8cdt0zC}J$Th(y& z6;Xl|FCDHHGwE%KN+E8DS|Wc}6Ic$bAL;WeR}ZDCUfrUeR;Sc8#JZaNNqL=~W)iD} zE6t0HC~fMYi%dK|E-AsjJ2ou1}(Vv>8rc=GA7MLq?$MSXFbST}^*8 zWrRBJ3^M=a4066^W;s7rQ#iYx<(VALnNiB|Si`ep6KmF0xA(cbpEJTb2iI^Gt>Jm_ z0r|Nc@qM(NMDAgpJDXT9;COGMtW)C2Wy_P4Ch>f-uD&~{nJ7y+o^xHTHo01E<%ouu zSrWqYaGFdc`X+jPjO)Khn&fl-E#*0DMcBi(r&vBg})baKwmaLsF~qy}P}`dK7u30wd0FW|db0MYb!`ZeYvd-PTG!SIa)kM$x(uejLdrfkTf39m`>Yc6 zKHGa=4Xo=&@AG{feXRREu63R1yH@vI1A6zpHKsonE21@?S(I7hvFcd=-6naAbqbGZ zoEv%Ed0fgh=25wlvIpe~p0QKdzf-t(m_m&QF$>nVVD{sKlyBs`nMAyKJhMJm>*R=9 z%f6}M>hOll=NOdp_zC&hq%~@utN$8#OP*)j4$0uTmBID*E%}KSyEs$c;!Mh*{p0c* z>1B*FQWBJtSMPIKF6UYCIrkx-%RkgBO4M7Dh!KVt*Pw4Ohv$;DbV!G@o@FqLkJE=E z)!(`zIXj(I90w0Zb2qd2hCM%m=TZEhmS~>g#AQk4*|?p3aWBX2L()4~o{)oT3cWu- zuU2n;OK-0!u0E?=y$Nyq+P@?f%HwSNYB^srU01kVS;juNT^?c#t7HM^TrTI{a=Dhp zhb_z5(>G!;wUgNkOHXf-$9oRQ;@*X8U5>;%PZ-`Dv#Zs7=Ltqz#t3iVI&Y; zqZUeoa&V_Nh?-XsdlIp%=aY4J(Z_o3Sa(%@)}PJ)`3~zib*wup>p9fNm%U@Ajn>?x<$C^xaAIz5e&zO<8H*y+L0(jk{pW zU;SrYTP)UnLEk-=mF{!B9$VKo>$>{K9cSNtMc@4U?trYZT6b1|X7z8~PyJc%9i4R- zo56MAKNs$+%}g`XIm+qoeAl^+^Xd1+d8hNvGh5DVF+I+75%oV7=R)VgGjS~CXNt__ z=5n5YQ@B6)MMbC~yfz29+LoUwx7wO7n$~^N?~C)pvvHp=H*=NxkHtJr%sHmte~of3 zZC1F(@`m}e`5W=9Sy&@wRNN6vaYeTx{paj@*ZzBs|1lHU_uq5*?-+mC_aFTb-MNvg zMY#IW2;{zl+5fSx%&puFTw(r;@mc#Oh&zla)_7gDcs(`WaR#x4efIl)c$+iNnu#^) zE4YWalln8&@IOXnKFhtuv(As@Lhd+z{Hqg;>v6jE&Z_r6#rs>=UD$)XpZo0W!mB+| zXYy+5`cGA;VUl&+x|CWe?Zgi&-YJ&3eV5g)z)k+e+uLevVbKK2mXk#gzK@j{L!+npMG4$2$TTgP`OFbZG7wfrVF~Vhlg_g@W zPu)1Lo|Sog!ZDU-3k=0QMF!>TIcMB>-<6`oRnMy1yI4K-<*no2R~qih^=?h!2wUZ@ zwcZG>$8vFVcDl+%d2n3aIF5ZI54Un>d$V#=xYo?2Myac8F7LM!ShJQ(&R%cal%H!E zVVqPW&gT7$Uz8trcY_Qs9(@c?D9$)H+0MOOr{Sj#O02~GIW_#OHFeP1-dpFd*R48# zuGd%p|8Ckh9%rY@q30Zx(>IR4&i~K;3_q)k$DOW)oRMLbse?v_HLpJZv*n*ljFnua z_|MsCn@hBne{Ac`pWXYt$Dr@=E8by~x9*33-+s1?Ev{{@^1ggu+Sh)~@2&buT&Z=R z*w?@7o{{xG*L0mb|IxyAUj0YO+4{>k(_dn7 zp8vj#r^H$=Vc9OX@R}9G^|nTa$S|&ffn29AK?wKiKQj`m=5)px!}EBC%;eaP$qT7EnEDQXdq*88Z* z9M|={c3ZvQ&lSmPwT2^p4v&*Lb4I&Hm|~rijCu{9%S5Vs)xC`3ZD*;qxIPaml2g=A zVM$_dTWKCsk6$t$`$QwYV846`~OACyWlj7^mlG>)$2>AI1l$;kzCO_WrXuqE2rWu zI>fr_^sSLbV+pMH`J!G`t?a|g)$7KPzIMDOB>p~!Z}~)%T?~-eA1Q9mVU1EZkgvwnZGM# ztge*#Saa!{k8`^-P8K^`xN2Q3ue$D3T~}}(F5%wl|H8K_MEc+VCgrcb-{JE{-T?&h zDW~;J8D)KX$>*9WvX^J*49;gaj?h(H#e4sAon7pURei&Er4Mm@f~;fYdInjal~i%R zF@>W#LcTF+fcVrZb5F--7a;z+-3z3%zITE5X78=u4}0(Me%kvP@15Sy zd%x*jwSkWW zJ{I_7;0u8-2fi8jR^a=A9|e9Lcr5Vyz+VD?3mO^}5Hu%fVbEnkOM|Wmx-w{eP*qS} z&}Ttk1^pP*6=XX4J3<|!9p^cwJ7zlOI~F*ucHHE+&r#}l&9TSvRuwUFwN10kP=91r<1 z)Gc&q=!nqZ(8$oSq3c4|hi(Yn68cc+i=m%{g^r#udduk2(NB(kIl>mvFCrphLBzs{ zOCpv;TothjC&{m|(hr(ZaI z{It`|HhWB`^NiEUIUu~=l<}(4rn*$O>M_EM3yee~$=GWgFzSuZjTYBgAZO2lY`sqB za~9mEpVkffgzXyJ&9)-jQ?}i2PwYPSk@j=#OYO_-o7~*o`u%wz_a2Le9~Yzk}%>nv~{b-w3()AOBh3+}kJ z^UUcpC(m@8`RYvd$y-iNJbCWP2`9&&j5;~`WcbOjlc6U=PC8BooeVrVq-#)zSBHE1 znf9LcU)#TL|7ZL0_M`28Z*ORSzx|c=m)mb@U)_Fv`?c-M+OKZEs{M-gi`y5qFKD0N zKC69Z`{edX?dP^nXdl-e(H`C&+8*2<)E?L#(C*(ps(nPeU;FU(q3yoygWCtS`?Pzu z_iI<}(&lVC)%IIkTifStjcuQ`HMD))R^L|8c5mCAZR^_Bw%yitOWVzDH?`f+mf5zr zEwODuTS%LK+o-mYZGLS-+Xl9Iwe@TBIM#FQ)Ukgb`~KL`W8WP6_}E9s4jud8*nwkp z$Mzn3^Vl25UOl$^*fYoOJvOQJvered3tAIeryu?P=s%Bk9Bn_^cJ$cM?~Wch`t8wo zkG_5Mt)qL6Rv&%(XxY)njy~|6KJv?vr;j{z&Kf&;?72gueE#k8l+U9+5BL=LT;vlwpnkxi z0UvlZ^uA)at_J`A!~b{p0KX~{@rvo)0m{0kaKQSVj+HOtQ^tLy*N}dMqqrAs;I~8S zaq!6`-{Fedg>L+Y=h4G`M=t(ab*zXqW7`VON%l0fO`_*FGNy;&GW1rb}iFnWKW#hMe-gn_{$~j)%jKyMmjg+x? zGY{MAr0h$Jt(tUeFWZ}>#b8d>arS-$jNL~6-i+JZIxqH?k^f4>rvW@yZAU}`j9zwcQV(!k?E^`Dds*jAz%UG_ zoL|!gaP9Ps%a0*cXuA)61Sn z`WW7zd?6|G2zZD5D&fN$3?a{X66l9<%gNI&FavAJvws3}@d){^ zNUeIX|3=C_4rKq@PmxyO1@dP|EAcXUCn?7)ka%v2lzkca7I{1A0lZJ%os|6^_z`*b zU0@TwCO?3*1;@xU?!XRwPksdH5BP;V`!cW_jKwWncpHeJD5SX&$P`KSIhJgX+k0{R(1U zL7$QTn)GvgMV@g7S?fQN|2OGR=;C*uHqw(Y$+I6Ara1bO_aU`}x_%ofj?v`dK7rJ7 z9{Fg}X_!vlN;!8NGs*vrl({-MN8DL=aDG_a<4GC6#ogMT1Q-Y9`Fly<>gB$P-?no8TiiF3+IzWgA?5f552U=1lw%S+ocuP@5g1AS z0n&h8?!}}bz1$xn4eRB;os@Z7+#e=A2V=>Xkn+5-xIaqDxGnCFktX3{^2{N4F|7GM zL28W^?$47l#}Ljbch1=m#%A$|CS{Bv90ZSZN!j-n5B6sW=Tpcy^6cY~7|bAl0qHEP zB+vO2vKq|W<5tqGc!oT43E{dH@*4RUN!f=M53B4w93cNH=|}jKytVxwI8L5@9P(o? z54JND33a3VV^R-TV?Ipk2llDQQBr>dlRripj!5#~ld{h&9>fcsjCJHskgo65ZwhH1 zHi-1&+zKrKbLq$2Lm%qZk8>%M{Ts?W`o)o2C7^{v%Rw6?vW`5zDZKJmZfj?&WzYX$fAU+-k>IBHku{11ZPI z;+adj9~>`F_E|)8FV8zkTY7osk+$J`>fA;83w|Zf+{akhr=C1V#ykxA^W=FkhPoEd z`$$jWH2H1Tm&d(4?Jkwy6~ zQsy0X8+p$8sI}l6@MO+W%q@y}crx$te!V->g^8ALh8^2Nhtw>85o+f{Uv=Tf& zJdcr9;~nzH`AC0%FVBAqKmUP2`A?)A|I_SyPtKFm?CaC)8!xUUr`a#3caV=JrQg#p zke^7(`FEOlUQH^j5IVYZfWnEnWxtEP(Mk&yfE>)Zxor#Oq^G zpJ##bdwnA6i<6-K04;7te-5fJSpNTy{}jK8@BObY{g2ImTIp@6`ApKzcLDBvI@ym; zEIq}GZ)&~ycFBj|5DezK8ehIK8YaW}CTRrUo{ZufhyY&xgT%o%B_Ui$!g!L7mI%IU z8N;bImQOy%@$JY2*S9Pa`L-s8?=YtDealptCe!&YCzkJ3&gWZzIKDrb&385NGKcS0 z=Sc$Jl3XYY_@s3q-+e6NTa1hOM0qja8(hja6xKK4OZg=F3Vx4xCEs6NEoppfBK+=c zBi|Qn;rB)*{4VTizN;#iXXP1wxBDEw-rFq|{BG|hc~L6mWj?KbO{(|}K()NVw@`ce zw(M>9v3!q{&UY{?-N#7|za-0&>v_$%RaSXq^1alf9#iEOk1UUy_}1q(k3f%c9%Hq) zM;yP6%Qb%Gmw{(rGowmG^Ny4&-NzT6w$j177)lo_$uh8o(E3T6uBmY30cm zXIk}l#p~y)<-rN8mAfnN=Bi_Nu2*?8Lko)x75_8sn4v}J*GZw>QfW-Z+mt3 zdj0FkLi?|#{e(e_`K>R;k)U8D8SKTWXzd`kZ`LI2y-Crth0 zME!%W{?~Th$q+kD-C6DYG|p-JexCm4@pSt?x9j8Sy2I4%ZKLe%rfwUhkD0pldVSQ? z-|f{$T1ME9oYE~L^tapfH>UpD)XiTFwKtpktD*WI+x3@CL+xLhx@oJYy=kcaV!i%+ zx<1Ux;pw{3)Svymzx^{)|GmHd)YJ{8{$%qY`zQYT<6-(EQ`c|Thqi><51INyQ-82t zA2jv*raoZm{f`c?*O_{ssoyj8yQZ!sUahZw$4kHc)?WMDrhcpDO8Z-T^;>zin!Vxn znk#ipoNaHo-ec-Fx9jR{v+Qq}`gM}mPwCf)Rb}c|)AcLq`ekojIat4B>KDzpGx`Nn zSD5Qa?LLKT|%={>*w^K2ASv>ZeToq^ZkxjIfub z>m5({*msQ3Px$D^`|DCuKSn2ynflQI`jL|H_D4)zGG0GS{||51+aKC%-)`!MIJX|! zs~^g<6&Houi?7thakd9d{eY?OXZ`-Yx+q+4V`prerSD_5_xb9rp1P2N!gRfbowg-h zZyuyKnYzH#8%=%hJ%jA`n);qWI^WbAOnvvD+4j2^>$^;ym!t2zW4--OQ{S;(uMgC@ zroP=i zZ&)2^zhSXn9jP--ef>ne%G4_->WowRy1jaZsjoG4x~Z366KG#<>TATueodfWX6iIk zUv28EF88!w<*lzw*Qp2f6|7w0t1tJ|oY5)1`Z7~5G4-XRM%XW%sFO{-*wmMp`r`FE z$<&K{^+l#$sK(hBnmTc>UJ$7-obPA9@H{>Lg2DFremY@}pFP3U^H`gguII8gcdwq~ zr{gJzKTlsUdyxHt!TN$~BQCC=ZT75z_Su8<>}o?;n-%A6pEXd=s#dkE#m)4x$9e0x zYL&;@Os{_SnO=HkwTg>Nx1De584O{@DIII-zeVclrk=(Qo|dkso;%V$b%8$5)KkX! z+NYR$@&X+bJ<=YtKu;o>Wa^1joM`HE*?jIu9X(P{AUDBJkMB3kK7Owr7d6B_&R37C zHmq)=d6Na>|1|RkK(9|8lgv;dW5O{Og)?k!{_Q@ zL&w>N&DKMGee6TWXQ$>lYLnVS{#kzGeuz7VpHzSSzB-TG+q6xw1yj0>dk3raHr+03bPd0C z{ea&`tM(BHm7)H_Dv`sc{LB zKeByF=||juZRGB&Ty7+9jcfzs|C;-(E&O7(#5m49TNU?7`x%eP%dcxL>M*~fxzpHf z%rI6^Z$Hrld`iI#u7Kzf$+uLT$I{_+m+`qG z?>FpG$Oqfpa?n65FHA)`sN2s0w)Kxh2k(0*r;2!0^PYna2T_YZRzIj_u=P!L|u(n^3_Isk=qaZ55f=z~5M>h{VuI3}cu~I+-{w zUHqwcwa9tIo|?|znNLMNe>1)dog%U9pIFivX(&OR$jm4ZZzgf$=ritw$SlS%+lDHU z3w#iVBoI430c?+N5#BbzAu^Zw&!w-qsVD^X<`O3%49#F%^S!|OeEOK5j7;RC0u3S; zvVLI+YC!A-^t*t%3$oF{Db^{nkg|m_NJlAZMJ|dHSw!4L)Llf}MZ{S|+(m3(R3&n; z4gR3r#fhNp#caQr?H60yo6s$?*b8AG&SK&$&P4^9MUtnATuS++lwV5xON&tlwk^p* z0f@Dv9z7zL`63GONJTaZQH~lkqSLxW!XMO2Nfuek{FX+7IW0{Av6m8iX&I`~0QSY@ z0zX6}0cprV5q6;#Cq%9YL#0S6@l)BJ%Jx*^q&A>ik-ND#Z)ktjB1gUiO4}2 zsJF6HWEFK*5o;B(R%L=%tBAFVSgWYBim_hrgBT+}Bt53wpF1X%yk=cEuycY zPLcab@28&!Qb8XNrhxKd#!*}e>ONG86C&H`b31h(jzb0-MM@%3F7ikW>O>yR0&yOr z{bR%_O~*lz$Ep7~F`lRv*^wzyM!T|IpzO&!bcsBbhI)~w{Xzce8j}Rvl%;%@^pzmE_C;;1^BmW%v-F~P9^`EED=X1dJ3NIvrIu+d_FJ$mfuTb_P zWiM8M@w}7*=KfNPNM!3?7pxz$J_RxMWacbCBQ!nyXfympws6~&+J83Ax36WaHSX(3V zu0M$VZZR4~-irZs-fI%s=Z8p41@qWPn|;*V*C0|C1>)DWitLX=7V=PuS`cf0hsXgR zQ1<|J4kUv*2TD-^`hPzSbs`6w(JAr){e6%N;(SQE57R-s4_ibI*+AJL;vC9GK8jI} zD%7D-q+US3_32=HJ=^O$(Zj8LB2tk9wtYnGkD5e2rvAso{x}(I`Z8JQ0MPupxtNw$O2<)%m?#rtVILZ-q^#x zWaEoyFy_O#pzYy$kgW1S*xiJ;H+e6)yk#G)2WI3aSJHpd;9iaL>hCV=|?JP7K4 zp8@*nq>oPG{)_GZsuuZyet#g=54%Kuv>_VhB7~F^r6T|KftCt@?+PatW$8Fi5 zzDJX&ez7P*7jLICKpW3wQC=RX6g40osi4gO>JOk#?_H?IL3E&7)IjPCtPtg6gFj-B zh+H&^8We?CP&SDE22nPcJ_b`ZxCF!)k_`GBLfj$D+t-0Kl%h%0P%p$G1z9LV16o84 z^8xLL6@j|L9moUg!>KpC8r1cRMlqU2jR->_Xg{Jy)JVq2drLJk7t|S9jw;ln6x>I70JFbQd(USJ-IK;0n56_kw*Q4Z=k=!^HjDmWI@35mfj&}XP0s2fJi zupBgs3eN-SXvRCbOjJZ1ibX{dH!=gwqQ=CaOVl~kIj0ol$5Ll3V~k?{QOtc@GN?PQ zQ`C6k@cvkhZv=HFL?IT{Xc84ooahqaPmVzTTr1xrY9iyBm?dhGFA8uF9in0~&@E~* zF(y-g3iF$iBI-O3Bq0}dqNcKKYAR?mElt#P2MSRN#__jw>_Rn~M8#4!wgD}oX5^zD zCq$j^59-XM{>*Yv7UzRZ5Nnnfa=|{BRe?G*qf69m>dlTs92n#5EEIrk7trnk#&tms zYS1Vuo*41Om_zv-%I6Sg4t3{dqY(5zm%4MQJFf_xq7tZ=Kt7>c)O_+6`XdI!SRjZ( z0-8XqMCv3GVG$FeQI`&;iV#<@LlU#;MSnCaF5p`)AT172kY)j~C31eE4 zE9x?TG>b}MeQ6kqMP2TTgQBjW-W469QZqn*SC)vnN{|l5es!s+v`AEoT9yFXUc>q| z^t+t4%j-q)K382k6^)`+kiX6g)VZzzlwH>;DkB=Xs28=8F|5o)ji^-)WP>@aIw9)% zLeSUs)Vsb%RAv&YM6IU%YUzWuk7fAp?}%91qHFA^t5{AYL}H zvQLQO{ij;fBI;J!-Ac^cqEL=5Q90S7)_QY_EouW}+CcjawBx;{%BOxl{pOd8x`#OT zL?aDlXhOHBdnvn@vU`g_*+zflf;I*8QxJz5QJbcsP}F9|xtaKzyF_hCLWQV82Z}{) zrT$jxZ_PoAsQbv@N1OYaMQ!s!Ea+!jgQy~3q@WfZ=n-|l55hoS_gA4#)C078APuZP zXhVUhV)`l0MUAM3D0?UiY=5X*)b=Q(q6A%{9*#r~STAva_9e}t9!UV@k93H7lvs~Z z?=j*$)+nkp7Su2892h*_43Y!sp#HE0C=Jn4Zj#3C7)$VVxvP>)vhhvQda~)SwZaqMo+F zA2CQoI&x8r3e=$)U82gp5QbPJBNO>3MHTANiXKtV_#z7NNC)+vq24ppdxm+4G@?_~P8%GEMKUsxk5W{j9sK2L6)Lt)yfx3ICyEha0C`A?O(TW~XHNJ>KJW`R3LX@Khjp!8hmJR-hK_b$T zi(*uu4$bHi^|lwn5Q}7FA|IuwLOoj1BkCPrL?Irj$VMT`QG-TM_Z{lidchxYNJ0j< z2G?>OudT#Ew4htmyIfn}<@)k2*Xwr^kd9mwqXKnkMyIIvY#{D?F-Qb;-(wu_6=4@@ z(S#GC_7RuQnAASv?j!ELG~|G~`>4B*x_s88_H~G=6ZpV^sYpTw@=$_GP`|DT)Zb72 z{nX#jIR3Y!Q9lc%IEWLX4)}pM2bj-+0x;kAiT{2W^1$2=#)5VSY4ZW~J}AU4Q6Eyz zawthueJ+SwUk%1t-^HIh`5+qXqmODp`Nzq~Kp7hNXPjvNi9e=-ZJ!X^(%=jFYM|Yx zjOEjE)QkFizNpWL`&k@PVXf2WXPu%NlaP)a5TlVk8mqv#8=G-L)L|R^5Cvi!rq9ES z=Ws5HP!8f9rmw>-=;HUA9`Hvr;*o+(vexsLkh2~pn@?|bTe?*K8r?-JGN3*vVsBOAr2LL<6F{mU0INJch_Q3d+@ zSEr~S7{?Du$Oq*=(BF^r|08vOEJp(iHv44I(KPi+4=7P(+fKX-}h ziU!-eSpOvs^`cG|iTX8JR5#__tpDZ%_Q!8|pdO#`s8f+hL#HS{%TcE(?_s_@2SuI9 zLNRL4D$4Xi3{pW1lku9}qMV5+Lx&g=jU3dXM+_B?&gJbREgnkLn2DhB8Ep4GEk0IG5R@>3bywSC<$Aia}d%>U!scIs+ZZLai7+kszi|5n99;JI4?!w^9x?oA@5g-nDD$J8A9ejY#26tU)(H9>nT#Bip%P7E zjAHvJ>W`vNf5ztDB}PC!=p)b<(V#q#I)N2vMvoXlDX0>|;XoefD>xIaVua+15lY)I z4^StZ^3iFazlbojh!L3#$|H+GoybNp#`uE1##D=O4)xAq`#BZp6l3gE&`(r4=xbay zy2ThDg#sKDV?reIK|b088K@WI+!z#qu}_T0E-@xKKpK;PE-@w(e=_5qBB1V+I`oKf z9{rt1jHzj0pG-?Ztr*iikcetA{uYKD926s#_YY#ieB#Zd-pp<> z;^;q)y0g4cBgSm{ydV~xV#GI!F{e(9x%pzuBhEaw&7;o*+9aeP55!BLzXamXr+hwr z%%|Rb>RsrABou)-7c##EVJHOai2}xvNZW;RC`P^Tb01`&L5xMDix_VbagxfwxcE%N zxVTD;OGqzi7GrTP=wmV47t=o3hA1S1u_PZvhZvW7AQB14LJ4ZYwk2%ivkPNMCMv;L zFH007B?c*=kCal>pjnKilrJp=^SGRtm*Rl6$TvVY`jO7kwg0{K)5Y)MjI@cBBpconSm5~O< zzLHogGeE4B4d@VKmB0_tU<|8j(S#FXTu<5c*&y!q^m9GiG80h=VrRC9vDya}V%(5} zW-)H`M?Ol$$nroI@=$~_(05h?==&xC?Qcp$w-`6m$1TXF&o!jCCZJ1<+gQJiwzn~^ z+gQ(uLOSw5yd27NC|~P`Sfn5ajBA|@l&zy|9b;HWzqd2S+ovKQm7r}dguWi3?qjS!RwPELpBRrpLX77epxtwI=n`W$ z>$?*{yxsKkynr^(Pel@l^L!Or#Ncxfqk=J1q@o0^V!S|KFHrY|QZ$S4q90Pg_Lr#t zQXaa+sHD$I$|`HYJYQxGFGqt|FXy04j8}@#BgU(hV!Tl!#-3b|-%Fgm)Z0s04Rd*m z^|u>u%<&t_jSzNY`L>FXP|eQOh=C0mRm z(KsQ-cllx*Efu4c_0~Euj6CEJkON z7~J0*|Dx>=VW7>A#Q5=`7~HQL|7QK?A~Cv{>o2UIOcCQ(=F#0H#&5(r#rD(D=oX`= z0HkM1&>{x+(}t5aPS%|VMN5ZhRWI7`LI%id{!J~N3-Y!!(RPPuH=Ahp9?>2xqPgeQ zo_?aeC>!7_+B-({Kp!-S_GuJ7nDQY>qJ87hEP807=wXx%qrG3O=n=J|M-_elGYJ%jo)X&VhI zIppWYBL`LJ7Cn!4+<)nLo+2|C#mRM`4yEY$HqStwWKGzX*T^cA~N6d9~ zpzZBVqH`%*pMplwchL6EY|(kF=TYY_V&9dC3b38mP{NXsbD<3PU?GUb8oBYjg)OHL^W71h(spXSDQSLj52hI z=DQEQner_us6@Bu!X%JxCFXrGqPO{=LUd7+=m)&OICw465Bee-b)t&})Gf{c?TV|> zh!dh8av&MZ@u3#c+rz;6_Iwa)dxz+UW5Jjorq07vpzXswqD!b-l878ox1<4-KN5{} z(AOh1Xche^V|z3fnJ7iQXuki@k9CSJO#^XD$v;m1@qAQ>ej*CFI3aq64Xp2=?=sS| zU8n_Pep28-9Fo9zo-D&b(Do@muaunV2m9%ja@3#^?7LUl=dZGlUoAwb=qmPERj%mQi1}JNi1QkK zzIG5T=obCD2OOZz>(qHY8~LC;pQ-ED>p=Y1iT`?!=r@S}Mi^p|2->_sA8!i8!Pn3k4_x<9)LM9l{^jzz@+#KpLpK z*8^5cpEdMZL!UMDSwo*SjIX91t>_WWy@h^@vbPw=Tg50B{dSJ%cZl)MF4Uq4Cq&m$ zR!e`i9irc5?C-Juo&!^ngbdL3J?ieGuYL5xJ&N8(KXtx{0^_Ko{r)&KfcyagaSucz z0cjx4fgg_NjB-?=4vlC{zyhPiqR_i2yKoK=R3;2qwKp1SnJK`5`C2TM>&Q^8%4LqfS9f6$OiR}amE561`jV_iCldmh|y|LsB6)8zWC{j1mSPrEX>Uiv3+EJn}2s9NG^ zjqQoG9_uD{PNYLUX~-l!X=t!Z=#WqyIwW{@wSvPnq9ll&w6u zaz}<~sxistNi`uudHj-ml0Ok&rgoUi9yMQi#Jom5VR=Md^r+f#=6&-OX8pGLneB2n zUvcAKl$aptann2^!^C}zpDo;Xg3s_FDtt@WeL<1i0)4j(xle8L4i5COxrKQ|*~Qas z)DU~5!voe&zL4j0ob2qAP$j$mDW6kQu zbhYAxYtj!bKltHi@1(0mPbFXaWYWh?$7_su^CF#{e&uzas>f|vS1n0DUCW=-jvrHX z{%k{i81(w~$M<@F|GhnMLmoKq!N>>3-#_p{{eYkUsIeSNxBf#trN38r{}|7p{$stS z`*7~|bo%^Y{xHp&pmi*NVCE)sXVzAcHEZ8tlO|4K-k~9G?lDs)O&rEFnOT6leC;zcVrR^JyRCpQB$^UB zUHMWzto#TFln5^cZgsmvkJD?j+ZWR5R!mc+RGUdI$xZdON^qviQKnX&)C7~=mC();)6wM~;vd~XZ_hC*k-SiSy}G*|V2BEj9%&B7*!U4vpPUQa zaSMY2ZCrM%fZBHrdo)RpD{kB47UtOCG1)AVS#?WH5`{RYY&FN(RS##?pMtp(V;~;r zx=75sksjdR`OMC=OfX#~yDckG+(qt8IalAvCU??bn4`bYiA~lwc4C!tSf%{g!9%wm z(^s+u$8J4z@U~-Yfxhw>!BQA0+$k@R*MYvX1JS}$X0}CnN|S72yeuS|;?aql)&QP` zcN;(8K+wn-F9oZ0i*K;M>fLwfJ=h!QQPHEGeyC@NHL`X37vfJW4;;i7uuAA@qe?PM z5>%34$HRwH6a$XUE;SwAcpJ+*p)aNEK04ot>@#TwT*8vzZVQu9ep}GD!C#jV<4-{6 z$%HhgKQ%c62#0xGVC}AR7xDenh5W#WxCa9r-1DS7IZw$`^Rzruo;lBwXD!F=5anXI zR4$h*{54WyG*;xyDYn``-S~%zqnu8FYj0OtNXS6rv2vqmi^XV zf3%qJtE8Ldo0Xf@o3)!wH=F6je>73XI5v)P9&Iq_s5H^-@)Q+9dW+foYdU|zz8u)0 zW98sZ9s4h@sj8}3Q&qL*hhKjA;fISC#S0~sl_ebq4G=f$f76fXNAZuNBdY`{V zzeiuHKcL@(+e7bXi`goEc9$TBdg1IWLRKJJ3d&+oS)~a_`3%pyWo=3t%m=UL@Z)}iU0dU@`Ez5RYaUC(h%cntHV<9ri^A%PqrF;h_$ zUtGN8O~_PLrNZTY#vY8`APYg<5p5Bf#qUjXNf}A5CcNvw0Z6X!3ojlw_%G+S#B{xd zqtY_*?qal!;^LgdT5(raR45Y%b}%+qe7&#a?vDdmKW8RrPk@UaBzZ6)-^dZU6dmMZghdr(cTO4*(m zOy8i^#XOr68wKxRoIlIum(r4>&B-}fFBW|2JVXJo^E}X#5R{Y;FcA{7GQ=z?8HNbX zWyM!zar2@j)4I+2cfU;eaLVMjZr#3n_hTD3R&8FpV${B=3;x>o3{zH1$=Po|`rdb0 z8ApoSZ>V{oZu`A6<}7U0>a~=VPhMWQjo>Y!6M!Jk!a0iI-W7plW|!>nhT1FO_SAw3 zlUA9T%_8_svg)*DI9yFl#PGPtJ4Zi3QQ&e;J^~;gA+ZMSkF;0Lki^gQ9QIM_w{O3F zB(zdVYWhxkx2b5GzL`zjPq3>6?AqepNkUm5P1cg)gPOa_wI(`f7lXnod!1JAm;3_M z4ojNgO7_zsH-_n%6ExtZH(~`*!~p3ig_vmJ8o<#ZpAavG8goaq`8RXvU;aA(@Sw4; z-SW)KuRk+nBk;FgU+Z$}7rs5O|Co~UZehU-Tes}a%mg$de8wkaV0GzQa$L}o9CTTp zlhI0HjU0^K;Ht|^^9xz_G)+xpQOTLaZko;!V>XWSD;HN4@);N8B3~d0sq_>Or;u70 z%eZtm4p#cCe9gcEZ{^p|{QLJ8&+1J-v2+&QZ@qqY>H76cSFBp4?0GFSTmMY|*Tm`i zuRs3;g?TPp%kE`0$)P)5+qUhs7yt773!E;iaGu0dRiQW#r(}wfC}qluT%iD>k|Hsg zr3uLz*4oI0XWqs05kes<8I=ZD;?=2D($3JgABd(q?(er}{)M$nyL(+RlV z0tA^6&4=hQOamFvh@x6(n&Q-z>mFUcYTcvy(WPsD`rFB$)-K)fq^_Skr(bz;;F1OR zE?K;A!4mOs@S%t5g4L@Z8pl11f6u*3mKylK z7<=l)_mm-Y38Y1-LNN9@m%Yli#uZFcgNYl`>N2BLi6y6*{kE()I_7gwp2Nq?Y4#WF zE1yMlWhiVCCtMHg1+ZNxIz=g9#AqLyB@SDjGvY^#IhJZm0-$NOD6%Kj~Z+BgUuaLD9x%kH z^kSl&ENqu7A#Q{UoN0C_@!~fr#y>nUvSZ2g=}VVRpT4B};ml=2pZef~rz%%uys-9? zewOuPo(^|($}eBoS>L3O!xeO;Cw~`Hmu}j$^np#A^ncGP@A1%&R212qDOpVT z%Q7vJMaV=`AjtyxsRh{!5T6Q=Mdi&D%}Sod3K$vA6A)EIc$&CbsKGik48+J!Ch+6k zn#9<+K)eOrGwB9+8NCTb8SzN7rkYl;)uL&fFpf#7xa2ooN|n;Zsi$F&z4!||a&l(q zmpe`>=^RG65)om749rJ&$SisJajMK$x zz-(w3W~~A-YS6q&2s%~4Y1X7dTY=_x<$JJ@CbDx40D<{trgU(-vQpFCQ5;)ya2xX; z;mXk?SA+=@aW`uZ{SCcdKe_!fZhP&2`SN@vPhYPuftvj&UWEN0#ybb$N2`z%h*e3y zhMO-azi45Kxj=(jRAl4F(g-^&&p41~UPwCjVQF4yn7Af%m$<)aKIu8V>O)_Kb!^yZ z@<_~W7BT`+;ko4(!Cd*o?JdT{h7bYc=js)ySn1zLvqEFVNuf<}O4jRr>O&=*&rZf! zRpP9YgwjB2T)Yq~#Rn6wIWK=g9HQMFq6*bwsBz#DO=LbAdXj$1aJT(0C+AKtPL(T% z9Gj<~(;HcUC5_)%Ii&vP!-x03)qPUV$86)m{sUQ%&7uP=?r>sYU;PA*?}&anIhCyi z#si*ohJ83ZVXv5i;)`&bT2ug1DKNwA%r~IPMQ7G4Bz~tMYjvMJ@c4Jh0- zf17n`I>b8ZZvuVOzTrXk5j4NMCZ(v@x&?exuX(lG@mV-`H(6Y)|=P_%3t56J_ z19LUt2u0*QU|)Vo*k<6~02evyW{f#Fwf0VZnb`Y-UnlGu=i_ zdmz{x;d=-MQcaog^{R@N33JP&h>|4iv8d$zRoPWQxegdij2s_ae>Tw(CM5c<5g`Q}t5zlW6k#mp< zA7MY#(Tsc@HaZeG7Ni29y$aL=v&cJVoNi3&N5{mIO%s*V-1=nb2rS48@Hv~XJkZ7j z)mcNgLkq5QH;W>xuxQA#HUS(~uypi4R4l40=UG%C-%coP*m8NLa0fMe{}fn7WEn-Q zquovm6UGHH6qCj5Wj@Jk@|m+(j+AA}F?T@wybh+0W`|S5ABzN&J}MRF6fh9`cBc=A zj2EH4J73o?)#<;yhK-xV-+s?kvYWn_qJIAv`zGC=Y;v^@ z(JdEfZXurtoHHxH0_z3ZG}~}8Y`ERAg(Ps}OL`STJrC`hkXPr+dv~^GmJ;gr0s0cRaGnZ)iEa1h6YVotQdgaEtl`HEuuKeKFQ0UUH zO>jJYgS)ch^{*kp_v&Bc2Hn2;z4{XPDps+TYzeY}NS`ErIv21pq5E`hz{i3vI4f3p zTox0;GfJVoqg(Ksi=wdzkSjOKVH&}0(JbR2+TbaWbFoWS`)&2(n``s|Y|rmZ)URCr z_NbB zVT>d~$OliF6Sr~Uiiet@q=A&L`gAm}))FRStrlZ*5wt_Xw@M79K)3S_4 zUl&J(E1v_@;8{Q5S+?+Cpv-O)9o9^LvfpGDHA`l4vcJM&^(V_L=B4Ood_gyR zNq9yMW^QoTwenl6$qAZ}mC(si5Uq7e%WsA4z(;cqDk~T2VQB>wqnW&0I`=^~CR_|T zE@06F4WuS%A|uVL*^8fi1HVolBbzq^I<9na?5pEzx6gQV+WQCe-_rkLh}56nk;)*Z7sQx*&# zaZjq#cC=Hkiu!4{*LUyPSu8{Hk8Q@dxGtroUE;>xAzf;k`qi7|T{?H}(iOx?Yk`QB zAH!NyVL%{ivJw`=6{=a=}Qs-h~%)TCfRU1bRRYnk{D8VwNmccpF8l6?CD&_=8Ku zWYWY;$|bb1Ou<%Rfv7YgoV&+rvXOzP@_4CL6Y|2r(x%d8xnKy($b#^lJI^$d7AE4q zJ~JWG_+%+rPPUM%I@eMT$8<-_XmPY+^;)yU)^O^yR$7^I&6(CLTQM5(7R#NLE~d`r z_SO!zVYrufv^Y{4ArDu^sAIIDrV-|m)^WBerm40C(mZ*Ad7d>L$muRhVD!I~Ze{6* zYwJJQS$p`i{l|{N*M1qd(l&i6@B2Mhn%_ip@7bg_`yb*||gkjM~45xe(#2wnSc zfT#q{g>iw7c15=Olx)^Y%2BecBdzy{3zYd*D|njdG&xPtV!SC8wpy+!(^?EIWRz*7 zb&@zobdhj{K0zu4X%)jih88~PW4#;u>|^~AeeM}{5#se-u_#p0^o_U-joiJ2kJt*g z1x;w@*zWqhngkQ=)l@;^7OIV;$V?ODQpGQnYGzJ zsIQ0(!pkrjq%!h3HF1Yb6L&hL!ug9N0NnDtqpqWOkH)*j$h)Nm_KHI97RpqF>=20J2B7h7sJ&3xizQJX`Qwjj z^l$&DRb}JdeWV>Sqy>11F907G-j1Cs8gdy()?PdgW)VgP@lE#5Zhfu($ZqxyK>q=& z(&vh8Y5jtpB%jnN3gvtmjf-WJSdn{-v;;s;K6yD$pMgRl+AH(Q7sN~IWQ@%Wn9)=D zRhgCY$QHe={|n|}{a>xhWUY{{N((U{M7ukEx0sxi@3$I#kw_ii+77}OWc-t$GC9lnHYL;2_PDA z$8=%E?dW$#=!AH_xUcM~r|-SvvFF*VuXcH9$#cgq|NJXkv2OfYKAWn>_e#Rv3ZbGAN^=E?te%#>Be=(mz!ym$LPcrAs^u#ldT7P+ zRiQ82Y?^%Z-`^aYSl4dvUNP^(GoPG3_30V$o}nXQEdHQ>rym}1QwJ^WOc*OtUBIn&NH*!FPy;>!5X1~XW;>O-j zSSFK)Y#h{g-MGKJ_WI5Vk9F&mo69<~X#DBey3L#2I)DDR6JK=cN^n_-b$GBOmjM?= zh>ovzL|2>Y9Q)WN$t%N(>h1Pe`w(2{$ghP9B(ZUJhVB^KGO0rvy?1ZBx{1fW`S$3f zjk%}V;h)SZD()BRY&c!*Ck0}qRSks3VjnjuJGC#Ns|KhHNSWvjMj#p?x4;aiK|BgUYIrLZBYBh*6qgR#dyw8Vz@OBP26y zAOMc+e%A%Wv}jR4@+9Jlq?#6|k|$EmK6%?fwp3rdS3k{ipM6P16Go zy~v*B@X`Coo-ob!31r9F{0Z4+$x{^-Yp(XkRy!q7tlxR4)xp-;ae`{=t$IAEeL%2? zk?_-VojccP5UcAn`9%PsYw5>i^s`NRQ({6xyEa>2FfAHCmUU(tGqKLY zM}ymQ{0ICJIQ-fKd}d@#NjP8kKHDbP!>Z8F4oTiCnrM-eVktO3gg90Ta2bwV{7}SW zUa@k*tJCgWTD5m?!Hzl4Ju5bZ`iTv}HLpAuTB$~dwoSP03xeBjysrn|XGR>dT_DcX zAlMo$n}ma^*dR*-tV~q~2>mS@@;*ute<|hkUlcAI zbqGefMANpYPBK6OB zE5Y+T_O~1FwW57zXOq|Pv3L>FHhU$}x-;0^4DlRp$ z0pbY1hSjBW*QrZTaAm`l9QMU%q(=@_MUyF3^eH}5vDjYeVCp4KrVD=*uvn8R4m`xC z#HsO`&(uoFR$6IYq%MdccG5~r{iMFyD0P%JUAkSqUApS_haZ zN2uwzp`~!Q1m&KA`2fv}3DDx=F{3{E=FczdAG6QchWqZ{eCnX|pNBE;49q(Vw3a43 z9mw{1oMu@Qk`h!c##Wso?MpZq=h6hX(=<>W;3| zHI;IA2oJ%OmY%y`^w|Wesi^GtZ>nRz6^obfHhrllo_&`Qp;==Pdjxv{+pF<81maPnb|z z-m95j0gEX33tQ6b!5h;nnD7ng)mX(J)2lpT2Paq15#>Gf;e3w!bJS{&P;Db!#O!hQ zkUTM6eOw?J{GOtRk=PDpQnpA*5vNu^{BU*6!w=Vd^XsK=zqxct`s~byr$71R^oM6Q z>+kFT1WtXx+TzLxKWj(yyH6i355s#&9u@@>o8{p?M;$vP9ZZ5O?9HWO3rzt$wOLi5 z^sFMjPfCsfid~~S%zyP&5{du%_tD99?8lXc-mtPJbVRk(-ZTQ&pnnTB;m8Q~OIURv z+6FB2p>i_fo}{~AP0hN?K4)FRp}2!dTyyCS9j5D5Dcy2SEu}KNd@UI|oJ|8(E?>TS z_44H_#rU>$la74z@1sy(UVT-}r8Ph*haS3V6!LW3ES7a1aZ~MokeLJha~f!48Q|m= z2E)g%S&_RX1s(g$2Q|1Y1rvB1veroE!9jDJ&^4$X9Hlje_4-t9i#>ATL1lc=mUAeC-WDl zWe|**a2oicVm;Zy+(3Z)WxQdxj2HfyiX^{}duC#UDt17Qu8KL}t9HxPnfu_HNitkB zgA-IoUrmip>)FZ>m)E#vT>3AheIW~v)Y}%hml0>vb&eQvjW;LQ$t5VkwS; zi+Yk}@TRoje{Njgu~i>Ge(s4cPSlg?p**1$P9M>wC!cVbadaTd)@VC!fSxY|I_# zX@v;2m@VYFw_30)Gkg&$s?&`p9YHZQ-;z_(x6~91BSSLZ@q85R~m?IBpE* z4O|k2Z@=1VmaWM`GD{NUr9>IGIhhkI@z!KpmH@}On5E>XIa<1@jjfZ|LFuG+(uz!_ zww|WG=3dr*w&949jIfTfO%`vLCd;=g)6A2s^AI(;$8?|hE^Aw-B~B!#P@Ix%K_a)9 zt8^8+Dy5b_mQj{z;_b>*%R+Inv_M`g->ckbS#0qEZV?|3BOg!0p)HSZJ=CE8{=!SU zUjP8-ixr`L((21w#L1zJ#<>mvESCe8R^iz|A7~_qU3(>2qi=9%h)nV#7GkB`YKzxw zL0YxNYqbEnW-nli7>Uee6V6-=|0MP`sid`#AHvXD&P75-NH+omoBeW>e$?{cfT+f! zC4T5W+GKXSHjgdPRQOgk3|+_GlK#i^JVH@_2m~+j|;;fLBkmz51-< zEQe*w6GHzE?PYK32r>~=D6!6>Fr|TT~Mmt^O_P%zn z00(Us+wABeH7#Ct&2xz+x5*P{i?e4rvYZ{=ecgRMqwE&)BcrSU9#uo(EFs4gbp3X{ zZ%b?U(Af1ehK%j44?e^Ou-=E*)Vcfh-#QN(v~hf+Jg8~CbceCmV>nlrd@JO_QW)rn%C+ zCQA!9(w9=(&?0eJ)9dh^Ju2V2qv_KP^%9(8z?!rAZs{WQ;0$4Mpg7JMV^uTF@vfL8 ztCEr`3DyR)(7@g@za7&M^>U`oY*8{|TqWCN$?7LuW$!&gs+ z6C?ncmEpV^gic70EQ6FcV27VNaNY{*j^~--TWpbZG4P*fr&o9FS~Kn0{{(tf|7pz3 zS)>0{z3<`mXMYIZU3=GtAJ49<9kJ%O$JfLqtl9iqEh2@;llSOJ;yyJAJ|4=Gf4N1T zeA97m35ol5s!6{g=470~)xA#(lq6>+#M+#u1Zxb^%as%q;4~x%4e4(syzOjoznqyE z7a!xKY^V5`bdM~=C&!ez1gp$C-$?&+&!+>YRUF|my#ljoa*aR{(NbN*kr|0 zg1jtI)~m!5pkE1Cof>ed!U}m6J7_^-jEF3@tA$mri|6P-ijlzPjw*_Bqq2%htE5|X z{c?_2%O>fYLU%%sJFUMhXQH+y9#uAj0<9Ae^-hF7Qj=(|GSw)@Y>CHWeKGr-wmN%S zLX1Q6+Q90P{hpp_Ap28P2W43Bji7yq^RPb%x)t9!)d!(|0}wzA+nt4451|Ay*Uy+y zS0rb4f1td4Sw-ImI!*aPZ(`a%rgVBh|Hp${w#dahTeXp!HY#mf?MzOS^nWscEbDan zcUBg~lJzg(uFaJu*v{|W`yJ?uV!$I2|4I}}KLr2`+=>Us6`>}2f){r4mwiilgs4#@-L3doc^VQC;fB{sq9Xw}y4 z^Cy^F+uCNQ#yDlkd?neNK-UjuOILF2ZS#|JGE(ebk0UiZLv_Y@TKj!ASrzVyb$Ax2 z_q0mMK=~FtZ}2-C@y2FGK)6p>clDR#Luv8%8fT$Y;^nEPD8bRP2{*H{wQQpVrzE?? z%Z)N=;(cRAFIqHu%zeJ?qqqB${K-4UZ*MoIFn>b+wz1ojlah^p7quHNE*rgY;pnl8 z?q_#zAGf_=Tz=u0w%f-)L)COokKSH1u3h1{w%c#sfqxtH6NxAIgvEg#h$onN?8Hpp zB=EaviYG)@h??TE{mWzVD*uYnBw>}q$J~f+C=%@FQmZ=2ZuZBzCkdrd&Nv(%+yn5A z6rPW;L9XoKaUuOBOysKZ^`h2@I>2kM!5J5Ed1d3wBT)Ch$kNB4~|JL1FXr z=sNPFKn`G(J9jFNg)HKwCV{?kym|XdnQQ|t7Ybbwmo81u@OLV*x-(kKETK03J^u+W zs}~g&BT;r*8=aHHS z7Y-K@6qCj}8Y8*)c*-#aT#93UOtd##@@AmOH3kC@++Ho#g4G5eCh!H;t+eB&+D^Aj ze>dK7>VYxi$~qtaOW#c+My&5N`OdSx50{J^Q`+U7XZqCXHC@YUe(hRXt2AuO&aUh| zdXCdHf8(Ul)y3^+1lH_GO2X4&112wY+*3DsOl?7%**zb4GAVSr?dUw%gY=ckFp$Sv zuJn@Ds;G(uyipITivN&>vnJ&hncczzGe#i|Ku-C)>6zppD@QWus-s6$*U_U#F^7b| zixBf11YdUn?#u2G$hMzxSkAaV%{tYUoe|_S-jCx?b^W05WIt_ev|SkAM(Y@zqIDeA zBkybduuK1{keArN{Y<42iXK$8IE>GaJDJ16qFgLwLLx9szL2NP%H< z;269H(PU{t=UJWSuB?8b^5B}d_^IC5cXs~eXzWw{`uE>EZR#ui z2he}`{NDck`%M`=dd#QB$7q5@_kTKO^k{+&4)(P4CU6jmoruCr40JH7LR_-d>rjPO zKW7Qwd$ayW{odwI`62m2;`iJuvN{$x1W~o)S&u*S(ot`XBi@v?JkxWon$ZJ%H z9|7|qmB4QsFMR(Y;UuABSXM+_C1vco&4w*L zHq4(}w5WTJmF0VPhNg>~Llfo79)kh{Yv&}D>4DkZDpuXSv|1iLHa&H5V&cw_4H==t zpXVcQ+assLmP1W#z-tz*a+4~<dfJ9g|0uAt9a039rh!g=(;?!<) z+qBI?_3)m(%LmVzF}U*1*~*Uv?b_Z|@!%_aR<3w$>8#4iJ7x|VJlnwWkzZU$Tv% z!~dEzWa7|*JIlK*=(1*Kzxk5mu9^S5<=&#Q0T~&K5)+qC?=*id!H2P4VvV#JYi=cs z?MAH*qOiCa!Gf=5X2nl-{G`IIVTO0m3ipmhNW`L}(l?;E4HaY2af`EDizO7dxw!2b-&@!&yMF!RC*yD1_hRR}y7auW?WB1#XH@hXck6@^ZDx1r zIk#}_j*;?&m^&)(TM-kzAR&H8kA4I0C@<|;?(;5id*Y?MIk0gtDTh86tq1>6YPD!{3d3_dmO!dJDsLzIb9z=R3E<|v2WY{t3O`3 zA|xR9bhNtAm96y=_BIW7WeW>+UD)hW(ZvqubM^P(=UMa|@v^&xBTd7be_!3=^K-8x zMLrMa^`<^sIt$uJgHEp^p3*IZit=Zkc;<i4@o-6Eylan=9!=ww!Rdi$ z@tU!Nn#Vf$*u*`G+d*U9vmJ}w`HpgTiX+c0IGk=1UpTUqARl*XGe9>Eoavi^5w=Xb zEg><%k(rp_$KRyP#KeS@OcZqDuRSx>nQF^)*qqMP3R?oIJ%e`Xofz}O_9H2YNr}Fc z)MUFy^*a#wN)Rf2PPNkG>z|nC>7SbB`V{$o(3wbW3cIKbwHE@n^y{xl6^5}MmUBkN zW~3YnMyv6^;Wk~8OeuiT%k2+29`Y|wmTPUbwk7r@jwOBtKH-*OJq_hikpK@Djl5Dy z5=NB=MvN>kAN3fOOs((SZOdJEJr(G}b{dsa>ge)OBf6E39N82yNtLM!`rh@_Q+M^9 zm+|{*qm~L?bO1BlArB!QB}@sF*fX6D8~(a89ZrWU)9G}e>Q=G_-7bd2JT2&cL3+_{ zCXcaAaaa%{QpMXm7Dpa=Ts~}sz%U%-7cN}5Nbo_>wAogVY#s6*<~gY%{I8VGyi%%L zUX5z{BK=+T2>L?bGHEZ{c+XLW!rgGu4_mA+#XrECNhJn8fj3ial`Bi!H4z+I$fBL# z`C;s55XbLU#0!Am9ya#|&z;viCpPV-|t=*^%L>mFAMVm_|Ew{;HFobh>jpE1tBdD9-|aSB>44HC%*%j>CZuyVTu zQoRVqMd4KJDA-q{?5ZHgM!O270&~7E+HcjUunasH;=t9&PvxybUY!paltQ(KsOADY zakEH`7o7&%!^^r}*Pqi*E?UI$!o^<9r2nRzjudx^haVLe{(jP^`qFbB4Sj)qlFzP} zb}QD8wPK${-wQzBa#|GD5Bg3EL`CSE*HLg77GB4Le9b)Q`Y~5|(Dh>ow#GaW9%PI6 zd+<(kia!qxhMe&c9%Rf(JjfUy;X$_iR2r`g&JUzsyGA+>V{C*6As33qx@RXW_U9** z`%@C~{6d1$Z}1={Y!IH8yU4@9gW3fWEmSs%U?4)Kio{c@HKbHCvnmSI1BGW*)AvHs zsLZUy%)Dl%nNi0#Uf+5*8_#aOTi?pY-mO2aZ-WRO%f`>ezv+vV+_Rz zscIt28#I~!)X>ilE?c&Y?a_aF|I8;R^|c^h;SI#&7a`7-hyGjz@NvU?ZBG&8 z*0ELI`0A+E)zYS@x^_0RJt-v>=bw?Ss!3{wE4Hob>LK*XCllg0dQF{z6u`2`k3f!G zbm-DgQ-q6f-l&b{8jn$1a;;fq)RvHo(#Y0$i}UF@XgLQke*rlr7SM8cp*GOBti+jb^GF@6nI^&C-O7@y{51)t>a>!o4*Q+$ ztPRoZ%_3)Yp!2>~X>~nNmEg-Plkz<6lo-#zJYlZiIxxDsGO$DLoE}EP3AG>Lku0v6 za?1{e9fCdQ3!$5$@crUdHy$67A28<^=Xc02$?qtSW5sk3+};aY>q$&Wy-s5_OhEWL zkZ9e~qBlYjZZWyw*?UIaG`1i6e&C1^1K4-)im^$v2QMuwd9e4)M^mzw-?I7XclOV{ zZG6WEyAFJ?bj*F3sSl2Nel2^g&*(cx-Ljn3wht~}^>}WrGd=C8hl`4K=Hw0?R9U%m z+jB3Cyk|*n_Kx(_@<3U|_xgKuj)$NpAP1WCgsF7CNHpW{r<~-G{M`E(=MKW9@z+0} zcjM>clxv>T`C=ZoDon$3Xw!itqGHUq8#LU5zvt&`@ay{L5&XL5xm)G#Sv&q#9ZmG!e;X|-8fP9OJis|5s6?Mb=p35qlji{P^BH>0`CR`zaz58Q z51)@~k2BsM18%Q4p>N=r@IGT4y$|zZ9PtC+9%s808fVW>DQ}mOlGo0alH5*hF`mwp zkLP^Cx5w;HkZAm3|LlaD{gnxW{ec9G2cH-zY=AFt7Jky8Yh**Y(gj&pOr5wa8zaIT>56>6Q%3MZEM};(zjC{@3dvCWDA|l%lqVX`&qm4+kJR6 z|L)#fdLO!zGBQg#zA*4m#hdq1mS&gI*9I7Tfajudycl^6UR?h?f*033Z^jF2Y&>ZJ ziZfP-H}Jw3N9T-r-Jo5L7nXRh$j>=`w)f`vO7GzKfY-nap5MdQF_y1`zYjFdb4Zbo z+?+!ikAe!6Rn(dGA&2zvjdMuPUzbB_^mF=u$syH_gm&LJi4-_*td;g=tTiI*3|%MR zm1R%hdxqx$o&vKdIk0ClTn}Q3lqW)?!W>*4E0{~wmD8?l@gBO64-x^Zq4(nXU62#>d{pEU zc+PuxaJ>>1ChR?@Fq+$YbdH()Tp&>}%RCCTHIKjBl?_Ypes&*zgU{i4^LTN}=$3NG zn7>`g@mF@USy&I` zoRXr(V4Zfc^Oaq|#NK#;-KgaXNQ;HA{0iHgSlJ`^y-~|^60(JQiuDPY?Lu0jCjHCI z_A*-_F|9f_vD#G^yHD9<6_ahKmQ+m^wRfB+s!t|y0k9)4@uP6rQwUB2GAE#?Qh7>I z3~{IbrPfD3!3y^7-+$wZA6C5J(MK2j{`((P{m>a0z5$Mh9)fkNFig43H*hYUopG41vOZ+)j)VzK= zORSuqeMaOgq08KY=NJdsHZ}b+AJ2Q5Xfrr2!b^eqTl41&slJDBm$VB!?HAr}WIXm; zNY634#rUhVbnSS)-y4kQ`@MGl&>`xvf_*(NEV=T`>*O;2n(_TH-Y4{b!80UMr5Mm=3loIFxRoOxzeArR zyyHFCSW)n`mj_Z+(SsfVZd)*hnybLwX!FW`vr^!(M>D@m$VZ0}fByNl%e$xpi#%l8w$DGu zQlOZD#(BL`0#=e{j-`4fkE0>Ru2#qGbA^kRTv6^Av+8hJdnF=#eY^>4f$2vJf#?5I zEQ3-&c;X&cy(z_=Ql79fxOaFiP^2_s(W1TV7X8WpDrk}~ZM*m0ZTdk}N#G2~23583 zz#;A}!5P3m1x+T|XZ9249qbF3%YFIgJYR~LG!w$p-S|uo(zQtI!D&KE<)lH65TM9GFS{qhK%H&Zy^J&{XC~fE(46uJ52(~5rz1Fi_aVMdF}f_SLkyCI>9GF zC-)FjrS;-D>bCHFfbqPt<$5`O^LglfbWVJI@&xEdX#o!TMtzrtoIUEUM_dm1 zvlOBN=!@~SWmQ+Cq6_nhSFT+7T0XA)T|jy$x>>;`j5ay$x>SoVC1{OV6_*rDU{uOM^L`orUl!DSbTqO{^|^ zu=g$5S$c@o^y#ysTem={tvK%7xzN++&IQm{r(gd_W1YEkV`G&=E&BP$S1#-Q<%hug zsqT#WuJ;XOS*p#4QpAJ?k2|^1k+@0n9E|ogcrB8HsZKdHCMnA2NsLb+MfCWmrN>>L zqS<}xt!JYOC9oO%cWZ=av018>`fpP$Eb)V*=O_3#z? z%^>_HTn`64unLXn;r{=z9!@y;zm>z0C$QOL4g(7R|No#IPM)CWwJe7Ntlj~Q&(ZDx zUvTQ*vw7ePd4LHl-xRJnaCmOP7>hCH%2RyIV2mMt>}bJ{pG5DLFh9n;9|6|rdqih2 znIKKG(%EdmbJX9_^UL&{W}@feK1rm<2+v=cVSIwd6vXr^l z4jK(9HK6}oQ26Pd%H~R(^p5#K%6FrC&f>GqKCGnbaBq zcm*!RYYk(N|C$<&Ds8mvK%Cjp;G&X4t1Z?UC8^P}8?w)CjwJ_j6MV=<<{!P60>Zri zVkAQvHHc_1!Fd9f(p-ypx{@vA1&LiM^||4yM3!-K7Bh)?4~O=BGE@Ja!`SfcPp7jM zQaK&9khd!7qVu9PKx_ytA26=MS)qp$omFc(D~#sP58-(N_r*M)PtTjjW52yXr#yDR z^_td(j*aIDT*t;p(rYdn^T6F9Z{YlT2#V-5@fN)=eu2I(sD&s~eiD*|LR7FJr9+N! z1rs*Ju8PruYK&(03k6YLe=M56@S0yzL}3*pFiXe8+|im*3`^{@S$Kx)?BudhqyPNw zGo#zKx%GA-#< zED4p#y?UZFdDyTy&kg$%YMnY5tGZu28eB7GEQ*w==&`Wi&e;b1j5x?uIb4Xx(R*B? z6bm_O9t=602aC+G$G9IOB8x%gLowF0CrXs!;A_HJ8*^Qi$uyU1PrOM;A(>3}SWACM zSceSHz)Ex#FhTL1W$i*PRuMI-z^sLRn`tg3pk3<=@`*=F_>>u&@p<)vTi+w|>U z$xESCIScL{}qP05R`=(p1F3#JRlU~$?2*ONRZm zzW%SHmgHqVFk;uk;#zB#dF{&8PvnNa-SGoUfBqT$XZ`1A*ver~KU`e2GdHJuMUQR_ ztstl+MAvRzyOBGV&aoEfbrSY8c*&KQIWH-u=e*W)6?jRuFi&_-Aa3#}V?1~U`g##B zxr=xPM)UD0c#hgodcKODV|0u8$wtCR;w4ua$wo42NjWdUNa7_e?Dc-edW1N>o(_DT z(>OoX;BE1=n&IL3d2g<(HU@sva{N`Bs(CzgOZ4)>I(Kor#b{%G(nb0Djpxnd@!o!% z7h)vmg+_eYSP#W1Fp}0Eo+l6UpkG$={3YS%%kUiaoAexESXCGi84vhx>oNUTe52-Fp#$}y{bILzF@X2*_oMbS zL8u78gTf1=%P{{pu^DEcL6enhR6ES@R9AOvQI9O$AJhIA2RUs3Rci+LPxq zCld!FI|!VPpRM8J3)?^7b@23IWOl46iSxwR6qCUdjXAIKVVW^|PmCxj7jn7h?7oP#$I3VDOZe*venQk^?jcdcaB!Tl1^xnmLkKwt?;3dOp z&T-*6jq%*Re~4j+Fi4SlZuxwrzY3i*`2g8)cQQqqvtl~ z{)tZ=n=)0}bBx+a%AwvM!XQz$10mi@2`4rMXw$` zdaZa+zoX5@$w%+Tf5#^d7|?F-L0knf3M-y5^Yp2iGo_(JM{e3o4XvJdJh#nFHT1sw zfYaPxj@(%4X{DhTbAe!kR)-dy1wz0RZmu0}wY|Yy7k{J7=$@f! zRp_aW-t*=9A^i*V)b9K2Nb0FQyuP3EL{5%A1>N)>)~E5N+PF`q5Lwpw0T3YLdw*1& zg5E7ci;mr1=;shLfJ2gz6B9#Gs}3d7KU=i!9zEFGdi0;8hZVK??+)IrSzUBdAUbwDjm)MGR zblugP?3nx4cZ>Ax0-i!C=l2AJLqL1cOGS=&xNPF;aI+W&b zKEQ4>GRfkvW|1j*d0BTA^m_T}NG93k`9upO`>AKRNr=Te43^P_F$n9_6x^gy(gD}+ zNXvfM@x+D~ehBrHR_MKeqL+#%v4!7>M^-;lvrt~W{rB7x$DW$F-^mUVLluR`0kihN zQ47(R;G%Lao|qtE)@#BIUN^fr%!Qs7e>CC@Xrr>Jjil(qc>gfAXzw+R#YPTASt`9_ zm0l+IhQ4nVpjTyvUqI)epfs51D?Kfb74tITq7qzyz^M;a#P}1r<_LE>L>kGkXQEnl zoj3pRyG7TiZYW)>zdj`WxrU~W}5cGb|Kwv4~{oK7a@ zCi>c?M)_jwOj;jAgfp4vTYsVdGnhs2XxW!NH()WzFpI6KRD?E`bfFKbMglf9XtF@F zlY^!g#Yks%!+$_(6Z!-WLf?h`Xw1GQGz_h$bL+*VdiGj9;K1!S&?og)D+}1rL#@!& z!Hjr9G4+i>p(4o|+zLiL*IqKKLHmZJ*dU7wM%B^pkt=lZ;weZW^m2(J5rpnG;XZu^ zv5HaAbSG5FTq)|I4WLkvROnY~qWn?y`t|pl#cysh{SWg7%1(fAm!My;(L_1@H<;vC zblN-Fv&LOVT?1BJV}yjsxWcS_+-3y9fT|BHE*1;J?MEAOgxFxzi#f?JrQi~zx*S^G zd3+&*jB=}Z$pNLdHJ1q*)#xn^ExP-K?OnE-DQEirb-~nqqgJflT(xoIW4m{6zxA!j zxb^54{kzRla@y8~FP}|Gd978eg>z=yyS?s#nhouXk7Q(h_uiv#W6kC8BRm3{h{6UU zs&ory1-nm*4ZSSdLKoo>c;O)sIHk>^vweEl4M6)QUj*p_h<37=T*hgZ=4vsI#D#td z@e&bz;>26vI!33sAwys8Rd9P&mZ*QkT8+po?RAS8-lw{pR@65x;ll|NHs=@A!3R5N z&)DpkczRcR!1!_S#a0m>#jm|UC2BL9(m2cv1GEDb2&T&Zp+_UF@e{`nce|Z2qqj#5 zE6Qb+^%EN3I`CG-s`Guxz3I`_qd2_LeQtIg$B*b2Td-b?Y5&cFjV z-ix!M)APcn@$#37qW(7Z;&0P-^sDUS`mv*w-1_>adl#2=eQw(1w>aI?=Mn!Ph;WmP zD`t`C1kp8b=8q~C{Z}#E(*Hk9<8A$6pXs;5;SnSYjQ~0mbD=*v9vjBTRP@&1^+x!xw-R&-Zpk?fqaGu-$d-cXpe zSNqI)u})(7oUWi&v~1TF@qH;R+qOyHt`DQU?r!O?#++NQUh3b5Ih(zr+z{kmQM@6y z*)NKln9!xoeD*97ae1e<#x>$I4>uiILu-SjAaYw@7EjlvuD%v4V7%^^ZVt${xlP98r~ESgaXpqewSx43)f|4T=|OMTNc(I(z4=^ zr^($k9GSSB0u;lYOT~^iZmf0}`l{i^GQG({ebvx{+CqKRq)Wf&M*6BHf%fCDW)I+5 z1ls^KnS)VYZRjU>~?~^$&%W#7t@sFY0mq|PbcKmhz(f{g? zczLrt(Lmwmerr;*Y@po6M9kw7xyudwToMi3k-#LdZP1fE_E%lyt?^HpI``OE*S(90 znLBl_+t{Ncxcs%v@%7`(w6LaTq5j+6-{;lT%)JcVMFkIfhVmQ4r`ZCw4OUd)TGG8! z@O(Fqtv}5kBx^|+8YKDM7SFdqZn;ReiE?FvYP~4aN_WGMOc5C{+u&9uZP}pWuJ6rS z_w}wlv-FN<#Z_ewJ+xrKLl2dS--ugAIi6TX*9B~8nsbo8&GcMJy%pM#DN zC8W?hxEnVn@)9EA5*OdS8*h`;;lEc-dVkja|9au&nIC*RYxoNvMa3-c)@|{7t;}K` z+cPIKm^+hR^?2yF;2V$V`rI_!Z@FTI{?7`~r$|<{T!%CFlBUR93S8UROhi?~t5Z{= zVi~srP`&7u>-2Yq&m4D@w6zHn?#J!8!J$#Q{6QdgbImx}t8W_^8`=?3*@h0$KkcbM z@_5G{%h!cY;B|N(&qq=oL*-3tdLM6xQtZl3qn&^W7E+qHk+FqkVCxZ@X7f)br7d51 z*=+i-oo&oPO*0zTwR!be`Ji`SeHJBSdHU)??aYU4t3&?*cQ$NOn_Jl36gr~pWdDb_ z_kfG)=>CUy?!CK9hoy=jQUnxK%FQDYL5n8Z{~Vwy>m9sb`lcNZ3u=lA~J^7*_X<=(w_=FH5QGpC>Sy?wWS>VhCt z%^Lof$b0S$+oXm8lWbD+!vR`UNwiJQpP10cnw|g34V&!z?4)O6;tOheevTy7{I4bn z`Y~SH9Q_&+EJWK+#%|H+Z&T{(i&3WwKWEObzBhK=w3_Pjx2KG`KB|uYb@u(y8^`Tk zGw@`oc6WIAFPC~8{+B;~dPjG=KbFoecy;9H<9*)0zp5(pL}|s`K0A9W9fE@X zvupnPmM&7vf_}r|<4=c#ys~%h*5)oDnOS}E+P4=viJ2*!JEwP_d@=$$?2+9jQ@po3f3K14?*)lbJq^jSDQt5GJ2 z&*p#@>NUmnW%L>P&BS^y(;h{=IPi-h6w-mJlo|sn9)nr)5+#rWsZMctyt3?%it+r; zgJ1dQ6Ds~<@6KF$l*JucI#YXe|5ASERb-`Jhnhx7ud<*e`}b$_6Q6xUTHkLzV?DF? zt9@-jUvP>c%|wtu9GrqgKt%gg6&a2U>`_f=|Eq1=_TO@J>CBI3k6*hUT#b_U_&to* z(wf>^?W+QQ%$IUj`=O8`Wm-cc^JvPa$YUO!;C)_a8E+07*S=kDmTwP-;MV>vjmlIW zL22scMDsYd?oxz%2alzY6962|OEav;Tgo^(zqCj!rzYe|W0cLTN%PY9ydIfz){o6D zFb45X=Ml@}6Pp)lj7f}+_xJaXbSuBoF=b1}(gMnFCcQGRjkl*^y@O*L(Z^Q6PPy^v zyhd7kxNe}DCHyyllR+ZCJ)ia+|1+0Ape*;y<0uPe(?zO#^C9BWwy+meJvy}$k9=vC zcF+WZ2GI^xvu8n{$?dTJlKA$1zfzjBFZds9HEStyo$-Tv`1_k`So1w>B*xsl{;qNY z@PMj%U||AP)e(j+xKKtr93rkl0{Y#uVXUI8taRX>gKV-nK)%c?%NGtU%tbY_?-0lH z9y_uo3;)(E?U}ikovhi%dn84UEnoiWufKk(&aX{h%&4{r4iM)RBZij}>Z0st}3b9pxM zuns1=V*f<*q_FYA`i7`Vhr|SFB1e`u^Kf?X;PV5}{ONI*3PzU=8%Vw96%Jj%ZnN9_ z)^q2*nOTd`Lu}0XP!D(Ndt3yLVx~C&ylJKOMW?Q%aYI}v4vCOxEC+_i0=;lhqrB=X z1v$O*igF8w@Ib_Z`QPK8v9HbOo^NLpc=VV2CoiwIM*^K)nD0;Vp+o0LN$dCVvak95 zm}Wy(ps#1J?o@vmgOWeUIS31gUd1AGg$WhfzhM2I_s*a~aJ%3xx!)x5SEzh2 zo5#Oqheri?Z|czP*k{^R!%!)BaAx0{G`>#=01FF}Q%@#)FKJw_B{6>33@5J(cB zn}YJIcp-yVSQE9$e-Qz^7fL|Z$=t{8M1v1?+LsZ zzUtFonWkjwu^#Hau&x*O9&6fHVuBS1gTv#!kqsj;&9!vE^ZYugNcW9gG^}qPVc;v* zYxu+S?c%AAwzb^ISO*pRGS3ggyqyC*bhVr_(2WwugaAo=!FVK4T(1LtiWdy3oRit_ zKf{ZRz_9CwIn# zNt(I9gONDDT}Tqqf-o7q1l_<6a$`uSCJs`TaPnl_vb^_eb9&XiD^2c@H1qa>+5A17 zLrs_bn2D3Bc@e+M*8aVuOXr_46_SjG$%hfYAwYyk%H_+Xlpz|=IzVBL`ZI3fY+-!@ z(Rj8{bD5S7ckzRG*XLe`#kY?AEaS zX#Pe&*w(O5jmF&7VBEqkrjLcqW-abptXG;z_%vCZwJIEcKlwg9YBZAE@c!j*r zaXyhI!s0$^fMy6}3J%S<<>M`nOYjXkUfyBJf{dm7#_{7U@!$IaS3p>yF+fueKQDp_SSMhL5%lF_8H;EbTE5@}(JTKaB@;qoTp3lJZ)lHsn z^hr?H*Scp^9|rPCP~iuq7wtEk6&CoLKHmtx_4yU%FD<@32L+S~mUeF7zUtef-Y>M= zkHUS`S4X{{Xt}=#_f=n=gZ*e8is(M}bU~1#K0cw9B~g|ui%(3I zg{LZ2) zb9_3Emv(pMpGp59Y|NuQV+)Me~5+m39^-2KP)VXdbR z=#+Nr^We@!Y3*9ZbnP6{ecyWKuykVW)RF9MyKeo9L$j8T9g?0B?z*u3;F6&w#^Q;- zg)90x2PStP(V=a6gr7sF{#%yxczVcqY%|)|gg78NJ)y&NS5mGtaqfIHM!Vw)uTEr1t{GC17R2V9(&8}uGJ zeMn+h6mnhb8f<&sJ_aMqj>0GiEuB-B3Rzk3qVwePJ&$@s2YAlt78vH{pOjPfTexd#2Gnn-3cH~o{x<-AZu64gy zY?ES)TftwFt;h$wKO_qBe6rP(*c3=(R_#OG`G!hq5mx=Vrzn|*b-#l4DCc%Vd+?*O z(YsK4mQ2}p*7nSE8dGLBC|gACY^<3|bA`{#ztGS|pBF35eFOeL6e9&cHsK@FKofDF zVx+A1tu$1nS^vhLfEp3b5bbKhpVW%`*7rod51dfY18M%S;qPqULm4#e(i1lCHIAn# z&1)QwmF8Ldd6Exm@}4bx>@(4iI&aaSmC#S4cW{;BzVKIS~$eAt>kZ%RzX@_LiqF~MA8CGlr+lX9k zV}&duA|;ya1O%76=`DL9Tx2dMOTLhHNNEYL5IIim^rZLfkvp`Hdc;^dkMD1(7_+29 zl8XP6+t*3bJ31Y|#Api;B=^(`GNN+KsNwuJU|9rMNJpsCg#6cCX&t$cb)+-@+=n!H z)TXGVQWgK)eAKhl3I2enTp{+FsKW%A-kJQX8mcg%0F#R-z=T}SR2HbA_!819i1dd| zgIy$>s!NSEm(aefnF(C&Cv>c+!a*tgEhNOoA4sO@v})G9o^WO`{+PG3PoJIA-n`tr z{QSJ!->-@XQHlQ(6h{B_64q4+qZ-F88k;Evcsed1~?=z3RX}Lcyy3c4kf+OdxeFQC4%%x zY@!tB-na0L3(^O|6KK2r;gQ$#SQ=|llGiCIy==al!MwuFYv>!rFZPrqxs@&uI*YgG znJ>3#bH%Yfokbl%eKS;t_jGMumU*nFvs2x?@W5xt6$vm|WA^oAb+;#b6%vOwL)lB*5D|-^+ax3jQ&gbA{@@JL8-cdrj2`LFpKH1@`2>Dfk82 zMn^~p-lVXE->(=$5b_wkrSrjP-0>#LDifWeIi%X*1{N;8{o8L>css?eeOY)WpLT^W z9Vx%ZO3aI;IW=7}lSZ50HruhA=DX>D;Rbh8e1V_fDI4=Rt2t(%3~R}}q11t{If~(b zJhVpwX`>_k-@^BZBH>E zz3h~YcVznZ?N{!R*W|sQ$%FFedx(=cR<+&J``w*a-eu!A%58b-#JQ8o>e4P%ta`fY z;zofFUZ8)3N0i3|o&cnZBOz4ya_bsWY^N~9Y#={G04SkI#qBlkisW^9{(PG{&3DZA z8Vfj+oB0oBZ~CrL8p<_)sSIu`l!=u2Rn8R<(6*< zEt@3p{TkqGMz%1_5EQODJvP0K`4Ni5hI#smWs|Y->0S-?$8lHQdFM(M6$V#pfqOOD zAI(+LjJ=Y3Lv8TYfQf2iL81}fg+OLfwu&fU%nZ?3YcZ>m94CpH%_nc)wkc{gwshAX zp3E-nVSiaFTS=NNnCB$4Ni|xrW3A3>El}mb(jo?gRc#VM(w;G%x^oYzrXH%TO+LI} z|JAx*|Ehd?;Mvj_44zRUSg8ug%<=&lLD*ea!1}xAe-` zPymB3SqZw>DN0Ac5k&Z`jY||hmN=2U8(j6UHxrD3UY=0r z>%2UGGcdvgv!l)(qBn}u&r;WRm|oZSJiI3l=l9S>CTBjqc=)RFyb$9q2;w;TES=sS zrq>^O_?n?ZH`dalLl)Mo0y0yQ;M+)}WaZklAYF~t+Z2)z8`vY3JnqKCi8omHVpZl zj7J=tGn=?rqij!5VvtDgH2cq+4_F|U@o~xdQRB`QA3Rg{RjoA8ZU2(Wjncr!EEw9u z-}#UH&B(|T9g;4c(5=~eNaYJ``$!W$rS5J$sWPvq%4_v0^=_!+yVCh|3)J$ZI=;fI z6pZ)pzgsHx3a?V)jzkFp;SY{gNK{GNY`KNCP%qO0D4sU>E&+%$lv){ z7JPAc4eIow{5R(Q2=L9G@GX=qYsB)!%H%-=qA8B`uy{QzJW?Q(0u1;V2#t-@C0oxU zeSA~D-CQ?g%gPS9K{1P;8twBX-!QC)rO1!si72jhBVYjgh?;H;e4>vpdd|^ z>*9_4UVY!=gR_s99XR&lrtQyHuHCpi>p=Oa6S?pIzEB$Evtiuc6aM}Of>BB66U@da}Vz;T71>x8$IK1YpjLnyut7a1hg3b1eP>#fARWw zID%`3B_)-YpD|Ttbm-PCYhl;!rnE`Z=Zr{5!0n{YoqP4});)Q9NtVlt%Uk&O4vb#Z zIpqUw4B*Vn9JjZ$gdjDz$HfoLOH5qbHZmnMGSbNz@H#p5?mS}AhUyqNdG)`vo9Q|O zcu8}p{)Q5aGtZMaJQiqh3&I+cDbfOQTo}2-VN5z}6`Al>aOT?153oMdlRI?^T2WcK zBB;|W{&L@4JKq{Jbm*8XJ9qTuKgzfGK;F4ir|j&6fNcSZTc%8De_+GN)qeh~M{YQn za*h?Vm_LO~z^GCzmG9xL#mU2N!AW5a zNA`8l-3;O9A4btG$UWHTWk&9fjfh~aI1Os$VE`!*)KdB}BV%by^Nub2%gf(MUD~zx z!i1UQLn?|7zW3h2KW~nkGG+Y8@yftJi*wH7%a0c=e4_UB_bl1`347rdANtY9VqUiq zJQ$ZfSr*{AWa;T&t6u|HV~{+D|Ml;sucuAA#J-n0SX%$L%GX~!zXP3UW`jR0R-VxW zf)at;2N}dMBWN;7r0SMN-bq4B`S4cOC8N04$)-F=EFDHurV%}~+@GVno2r`f*I>4oyhxu3hS}pa^nnm0) zKb%%ENlN>LAAaHGUnNgIg{?C8-`=Ub9G+3gZ3s$N*KG(YnE_K?tsRT{ zp|!QK`zAN7ANu$2QlVNvRE@8r`r_mxr5Btxskj={$_)sp^I~%)(NgW`$qQD3o7(fv zss6?CIS1s}x!YJu+~U4GXCB}axdYHP?MQ3ejfz(r7xSjQ#Jo89r5B4!z_OJfFTlTa zW}6y-%9l6xDQQTyh(({MkAPkwW~oV7NO}h%iEqiNwid*l@zf z`Ut>*?UoWw;nLIXGg5E;u;+ODD78jk8}OFwv&p6DRhcN?*LM`#w7zv33Ups|5T*Kb zQq|hJ7vfV=QNR!RV}SSD&}SU_^rc;9>rD=vgmP1Kh}omV6R0WGl=Qp#-Sfv%`S%aw zBS^XW=uxdtk6xt~@ABKPJ@jRZ*4F*DbLZkLh@6-M&_lJ>xJKK+K2WO-nLE&kr*KWz zJ_mOLdZ#tdR`vlVK-d5gJTPh9ysREtAc0^%M2a9Qd1pavUq;6MR~E0k&lX6h_=$p% zy}O%!yOY&Bw{O>-MbGTa%v`*Z6`Su{fQ1g2cizWaS-iH~JwngN#BN%%I1BDvzY!ee z;Duqa{Ruy^xWiqNgI;(?F%eR%^opPc(hAZ=J}-O zm7X%sCy#dNsmD82k9N@ykN@BFqwZ$u|6V_Te<-yPCCM?KkywjSIM-oWQvGdxQF7D5 zMl^2qhCQ#!%W!qtE}ZpuZ928DPp_t>(EGHFx7I=*cJBJtIrF5APZUHSIMCE71Rc^i z52ODa^bg-Vt)*j}%{E>`7K)<>k@=ybGG6ND?|&+$Ti2p}g@q?e2Ttg0^1OMLB6O6= z`-jKI&Y1a~xm4P|WBZ^%dqn${Xg>h$2a-3E>V4EiQSW6Vvq;~yj~X!1)cM%4*rmm2 zzeS5QC9X0#)l)jWqjzt#h(sd;_YW_lPBH|OFeD=O5y3Rgd znUQ8ECEBHBEH{7P5|^=ZRYsgr(X{^h)8hsmIy7jU`Of0r0)IS2@L+zi<{3HRq!Tz#}in9H+-P>klv^DpR z$;gP&PS~@juKBdh{7e4DrfJO|JpcTUJ{6k~h#0WB!e?LIx#nHQ-?%xhOWlWZMzfyd zZr&K*6L7(AvHolMWzY_TMw2MCc{ZdX{Fx^8*}tXo>{8_8-KrAH@-FD#|Mp$^{@-6% z-yMPZSb%<^Q){5NDWp4Z6depkd49kCy@o!2M6D060^>P%?$!^^|4bF)UsVC3aj?;7 zPpw<8>ga4XlvOwPM4|b*HafeHEQRJ9--o47+i<4Qo>#SdB6bc-A%(PUTk->c{)k1r zM=+I?c+O2r1yIUl(H_7WJN7E(b|>&W7C4CcVYZC1IA0~Z{QRTuzdAas6`P1Ny{1PE4gyfJcC@w?Avk>WeVticu!SlP*I&~WI;z_pnqp@Qqn*X>s zBh6$=n;|(H5)uaTcUa3wtwMRYGO$<9-cc*rHvXT;$UX%T5&!6qq(E^0LUT;AtA`PG zP#x5qYIlhHx;}d1n6V%6IVWEn(y3G0?(+xHJ#TI4@1oSlZ{?`ndATUd-6pivBw|Vj zCM590h=_tdk#sD8mn>8~F}Ls+QEd(CK7or50uU*@`tk$hVU0Y>lE!@5z+$mrrztaNncHnod=Ln^_N)XBk z;L-=GeD&fHO7h?-BrD}y?ZN82k?Q(e-^V$`KqVW`KnrUKO@O5-gA(_Iw3ec_+Eiv6 zwJKLMZ+^ZJKHvy(o()G1g;H9iP;cpj@UUUmK0WecyLSBv>7`3`pO0+aruty5>@>#& zlqWbPO_R73tzf`t(ZP-pVWof+qrnFMrKBTM=Z_C^zkK41dwl*eevP@DF3LN9@K9N3 z_!eX5XrDKqonRV#>wV?m(bB@|)@?8wOtY7tQzCI@U@oy2z+zc;g0~m#41<)x2eRF2 zP8k--Z}4+0b&WJwB$P4lT*J>%8;f|6uve>X(2QCTM3s7j%#h!A~ zV5}POTGs%Fi19Mm+DE`(iE{*;Fd0Wwj9XnRb*!zfuI<{d-?Z1?lzuV4nVLFhV^NMU z25>v}7q^3HVE>5Nm>rkJOTRgN{76Ec89RD^a#8}n%Trgcj*Fimzq;pk_fZp;?Kn4N==P_}CZyfo zQ#NUQmq4vaq+S>K^4!nNufIPZx z6MZAS=V*Boy_bRamg^iuyl5(EY@u(U2w8L`#r4`S=V?TU#0ImAYM;ubOS35|)om3-N%Y2h`lmZmY+5buY(M$3eE8b>gc2Yv(V~X93#(|N5W}U4CRVbn_9hJ(yD=Lz|GuzTz)S5{r1a-ATlXm^(Z1MD$BAqSW8!(J88-rjvrz#RZU=^dRU;cIy;?q zrl@1b5r=Yn_v)3Mm)DnhEFU*^V$BsfU~=}*C7maGdqwUKF}QD=d#Yy2i~uwF=Ygm+ zv<(yy=SpG%9j*;JA3f0l+5K|O#IfV6m`C5dyzE}Rd*xEhLdU|hazNde(#n7tQ)*7l z-R5ox*&pfUJ-PFeq1lsFys~ZIXi%q(!XdC~xS$g)kvLm+`U=_~x19ed+V9od+P?I= z3`qZb`|u~Bxgi<@BGMFa>Q3~ahU9<}oO^Nvti!M)xfl*j7yq$pypq~v7?1BXnKoJv zSu;q}PMLz5?kJloY}@FUFdO71P?Lzs3KYmfE9BGgkq#psv}Mb!>sz+)YrHqVdTe+Z zYksk8`0`a{!@mj+ifSJm)Ma2$uoQoN>$YuMuirwOqF=h*Q;7k6*1yT8U>=Z+kaNX>x^6=c|>#6{3@ zBTmSRbQm;$ zQtXrtrsTloRaMIalTC@!SiwvRg(+NrpsZ~4(4nKt$_{LjZzZH`NrX-~p;x9Ufw9wU z_ms_iCf|21RVpfkirC)|D&nF-;B^A#XDsj{x`{s1BAgL+H|W1a&}I|;ru5EK*Z`jE z_{{Z+x%20IV$5jfoSIyD`l((4{!)wA(h`?uWoBkAU8w3gm00&3JDD?c-MP(Or)9SW zf&n&e-Y`0>i&f!?d10EhfQMvRN215V9Rcw&kY+DSEiPX+e{~rWXJ>Zi@e(rG6OLU5 zJ;vnWFEu_Cj0n6zZMhMU)sSEnzojj;wY5i2d&K7*1KPNp1Lt5oHba&xMu!=oVY~8p z=d%;j27mfC5^z1%5qAQR0MiW6x&EMY4!D4y49*sc@>lwwGT**0<(oG>kdjXEYNfQFt=V0zz2)mYGD8j?ku=OVM z?qxuFFBrTM6WqeXg7wlXZM$?GaB%#%apMmT=-Q=iN=oJF`Mq2CpX6=Q(mqMUzfaQk zl|{$w-YvQ9-W?NNcF~eVUF;aB_w1lEVDdP!pdT2z)jzwogWEiWx z{%`b-Z)xaI*0cZ*w*~m2$L`0n2p>QA(vh)PxbFr**Cb|MqAXItcLUp3_MhRy|HC}T zOOAX9+hP90ZD3HRq+Sbl?OM<)spDFj%6!ioTsSU8!dk2eE{h-%ykqePY2O0tb1)rYT6jjVjURyj~R>TU=y} zjWre($D)+rgpm07%-PvFIoY!_b*O)x}^0|)EBp7j`uqDcV1QZ44u5!v01HZ$qb$hCNRN5WbFRwmryHKNv& zF&Keb@Bq-gsLt$snXTeeBzrz&RIA06?2@lk%5Ig0jLw=>T|FynbjWxX?NlBS-!RRd zbzGLLOpYqQ`Fri~o>ZAoj^71Bp^;Ns>V^XJg>Q&IvZ*P+;mAM?W3Zi zqQ`dX)JaidrypULVj|^IeUSfTnoY)AwJYkKawDhU({|kn+J)N;?qH0(y(UfOBPLtj zKIHO(;MfJ034QcCd_YER`-|zHrHK_ZWf|r%1M>*1glyX|Z#G683-M|YqFb;|k~J<= z=@An%wt8ink55)+zw!x3$B!OeK55kGPEkjtajoMM(x)bOLILLt3k`)TcKc~4V&!Xf zQIx0gm6xh>%ZD8ls$bgk-ykRcJ+Y?n7G&yiDYSaF+6tOFV4%f5&8+MfX#s`GLO$Io zwR4w|BU*)xkJ^}=I-uma&e^@YEnjYzRq$+fx31=US=}>x4vCKo4PFwxphGMWu#Jaj zK|xv=)D?t+&z6=Lyjq0mJk1@K=M=iS@)PEFj6QztBJ;CaheSYc(OJ-^Pq6U616Bv} zB&E~Vi$T7QWF7|g$#Q88^GgKO6TOa>mJDv<&X;mGHVxYAb2}y^@OAb zVNE8nO(wC;da-8ey0um7)=oWH`Al`?N!tslFZW^J)3H3rRg>Gp*es)T7q^% zI`kkXJe%(|@{u*>F_xcbte9!}V`Z}X8^gm{a~M2tON_4>bTWaysP-#16toCX4Xb7n zgHBq^Kk3jrG`@27sfkZ5Up}k_`%t<7Cy=u@&0YBU(|e>@f8Upez9rgw19;|y_JYy4 zwF#Z7RvW6hk9rU$21^SOblMZ?59UMK8T{AiAY8E`bbUK5RL^qNzT)!F(MSr7} z#Hbb^k=IV`)ob9`Y17(F%A7S9$z_(X8U6Z=DdpSck^H5kq@`*fThNCjGPxN42iq!0 z5j)02OKPie#>qR^cWKs4+20{)=|a8~Z5NM5+fq!Q83_qRe*UD?kl^TjK)Q!9I10%e z2H*yx4(P5lW9rDsZCiGUo;p?QYF;>VY;i)NJb59(RgJMHVa-X8+8%_jiEdX;^l0xt zboA7zq05>h98%v4C#E;b$w#rF$6vxkk8^h>^f-aRbw2b;J~Jqmd6a}UD_==KG2JQS#kT*3Tf!X?nSM$ zqTspf&3?cXA}0R6G8Jn-0#V{u#Pz%Kn{qqU6F_*(6W8E6@%#hjob-k6bv(aStik8< z&(g2hXQT^{i&yu>umPE8V- zJiSEdgwa#_b!u*}Ub$1L1^MUP+;4j4rlu69nTo+M(7OZW)$$bGAOA&vfc{C*P5J|K z>sbk{TBS}h#>B=%8;uDEin@2}F=oCt#}tv6)yf1Ptihi44#nx^gG^lweEpMcW6xSR zU%_!&Wh$XZls=e0rboB*!UG9LV>FsKPD*XnDq)s32V&1SLs!$F^7LW{d(Xk}H8Qoz zN{lc8?l#I#GU}~B$ChYvQnb=3%}Ko?IqLKz#gg0B{n!rCs0w0VfXW~RCB?64^z~ACO+2Y+KfxQrJnotaW4!Z6`xe{-4{H zjqt#drIrs@96h$;q4E=(iL!{5$g9vw{#H5w`A61xm{5#KLCGBuI9ZnP*9Ae^r2UmT zcS;c`@FYb$R9=r*EFIOZqxbnW>42v0zq}9k90T63Q(q@MOX1JT8|tI*{z=i^EOV_~ zTpx|RJY6+I|GNCdz3KJa=^kj=ah#KWN(fFQ@byd%l0AZ?^22QSkt6(B=_AmOaE?b9 zJ1*U_JV#H7N9beG?&pk4zbYY!cpIkCaO^C=(|E5;y@xiC3|-zJ_a*rkzH}saA?he3 zUJBTB=gy`((lq*c2bxdnuM*gvDNV!pHN=C*U?Ynftl^1389bIR3JxaaDc0eQ&HS^ToDu#>=^ zW&(Sf;as&~51|&Y3fI6Y+^;{YVwES3L{eUWqt>e?eBlQwSL~QNWyg*wQ+HGpn@mMT zCR4HY_bEGfPNAD=#YLvhMQ}S|Y!9C%gS)^v7<|MLwZdwd&SdX`E*z9O2AqKRaRNeJ zbG_~YN?HaPpD2@yekHdV?IIHs0#jRtbqkn1B|fFNW&8H7u1g#oiUvfJ@tCoe+7|L* zT_U0{UNHq}-1RPw3Uk-HIx6m0ef7#!FGqi59nXAT)ka= z?EQREHo?!q&(Y7x&)Lt#&(+V(&*10o=h4!$rB_Su=03iDD6Y-aGM@SnagtLQ4*BC? zMlk65)xheU@f<Pj2XOYp=pxV zd5E`nR8*@r?sm;0B6EsHczTQp2#9SL0n>n;SD&86Lkxh|9etm{9MHa&84+7#wDd`o zU#@4)RqwoA#oQlNzWNFd<9GS#hYwi>i~Rg^8s|W~HwAne>9qeJoEu8X|8Q=!1zmey zTTE0fNZ8rr7Ti^urMy@92ue!Ete@+xpCdIio?yRJ%3CX093E=&3~@1(+(vFuS&4QY zNac_AN#&L5+}pI(^f~sby!FvO7Wc$+fGHI1iPp@^DwX#h?W+V{YCZrjQK$2C*Xdge zJYB^dDMFxG2M zx`1%7ToI~zo9OB9$<&n5c8jv88IFUC`VMxP;kbR>+U>fG?99yUHEY-6jI+>fz~hMm z7@uiARoD;$Nwh@mfSYD-zpZn-3J@^fG;O-Pj_ACod<%YB`BhHRT@*Xd%E9175k4o- zLt*D-exqmpv2h!^#(2-{Zz|MXtkG&st-1ykkM)lBj2{@ds2R0uIWI6zGtiM_r4N8h zuL(6ljyk1iPTFbovcj}_CfiXtfU5?o)FptVl&uGumWhm zab3!3E~Q|sV~wsxoNaWF*Hr3icsKT{3d>LObX^VdQEb#;*f>)+*2m#3z@>Q~>%A7d z5Wyv49E0Es!4|*0>@Vcdtoq#AC7X#p)id%o+5v88u3~J{@Y{ABEk0>JAwm?y zYu9aeoZ&LKZ_!{!Z5yo78d@vro3R_f&0xsHbRNTcDP8#am8a!5soX7NKZD2pQujL9 z8JSy1yf@Btqx8iu6DR(nJ_o^`0OF{27a0abXJ9u2+^R|Yb-Ig zz#0Rz0j$AsUMPK{K2HHI4WeiK@spH{@@*ueT(H3ssD$n$26NLp^-<{C!(;~r>^WV9@Zu19}&Yxd801IX` zrl%W?J@_}J3l@~p&Db94#<+B>BF*VD<}anM>pKBf1L;8&V55Z=Uj=xeCJ(W}-rz6L zvn#+Ww!vE-nk1yXcW^$%P)3kxP4*glHxG^59GUpV>sQ^V2;4*d1{g+Wa_))f_fc#X zbg9)$Hz3H0lns19Sh)0RQvA&6?TXq4XGL{PY1=k+RCK=*C#OXQ*XZ^EMMU~^;6N_suMPK;_tme5TwtA=A~}vz1xL_O?kn%EPx{}Sh1&n=EWBhr3IR_P#<=surPwr=Z z3H&|YIb0tP{(kBI2mJm2pR77BwsPo=tU9yGw6sT>@+-Ho^NC+cC4S}F2H+`V%ofTu zPBlEc5Z zGbAwcQm(rV=aY%GwWaZ@ z#wR}38x({+0)00Uo#$hF7-M@3onO0vaI-I8fPHjXoL@MZsQ51HTgAMp_yU%B?i>Vi z346_6>@~p)AS;Lg-elNq=8xERe(#$3V=0UeW#0S;8mrBo(?VYL@bn4^1Ai0}7LFh8 ziLp|7GWOgwm-6AR)154P?omGf#PI$KeavSV#vICLvVq2J^^p=Q1?D%l7Y^XjQz+nO>|$)ryxQp$u%yt+R4P@TpZR$D7><4rcN2~~0pfkCdyKpZ2*7S9K7UfiARhdb{uZ)Sj;8jd8-Q;z+J`Pf*$-JH zOuD1q=TJPN{qLnH>1%l~^+?zCE%970@!VbYIdeC`gj(5>yH{` z*5hS0NDU$SdjtJZE-T6%M*TyZOnIJhO&D*+EFkjZQX~_iv?^}SM>ZyyG@D})~ zezsaUn>Ea*P7{4piDH)7JR%*{vZ!P+nYvI2kfE|7>q0f5U=$lB(N-omn-K_frLHr|>D1KyT4U}|QzQBlIlPbq zRAm3OT{n54_?*^xnt;y;c$j7;uBm2-qbB*7WFMooBS`L2p(T4qJ&M&bEnycGq9p{= zgzB`8p)j*xMnbhZZNr?{lYAeqW~!Fmc?XgG`y%fs|55jubkBUI28nbelLf{o^hvn} zp>r27HSUFE6}Rwtf54>1faI7wf@8Ig{`O&-02e>swy~aWt$m{bW%BL&ZWmCgJ^2DE z=K)~Pu-2PdGfnf&ewEGv;hXK<99%X#N7W_Y21|~pYw;TsDO?(0i-1ICi6tT5fkX(E za3Qh8lY}=0l)Qat$efBHFR$mW>t7yHQ8Dz;diKlu?8vTNBeSn$M|A5Jp^cpGQ8MM; zy(#@Yrqb;y?tA^2&@Sxk8)a!zmr%4NX}xs zEfE{k5I7fgBoIaV5K5PwkDmlHj6stQ#xhFY=jZHV59Usks@r z`3$tceve53$B7sDj4fJuI?lf5Q5PSi~Ho1h&Vh%JqR z)pyPR;(Z`!m4ZMP`4yX`+&U@`-);Q#6FZFbO%IC>?{Rgyi2r@d@stoR;L} z>F(o|iJbi`@WHPv2s!(C4085w*@B$?` zWfJ}@_z3%r9uOf<5^vk?<)JA#nK^xzWQ^)GY|q=R?L*oG7LOlT(8kcdwB4GElc&#H zvrDr7_C8}1s!rSB8;-Qs+<(*`2vo-7`<}E3_`NEg-zG8tqnvMB^ zKkm*AI+=aj(vNT9_lG9H3pK?@$0n`v@JAkhn6qw2PUg8Kshs>T!dt`PPDVydMhM{ixQn>zn^C)$HWYo0hZN zBdXaMq$kSRQA8R4fVC5`WMNhuLLNw+;0PJ&@Z~FTEFoSs)Ix7Ll0v32)jOs@7WGJ>CVD-EZe&av|j zny9-Cb>?k7BGiyB#qT6)xUWD7_kB}ddQm$5c&9SBN%bU4Or-WU^lk=>t%J$YUgPf7 z&B4yyFV#}cJ~qbWVt-uYva%T>8r`35RvnX#SX?jQeIa|SjYd4L-ZIV_#-@0?or^ItEL59K{Ps7XVjRzT6Z1> zA-L7peiM%7=dt&d!RE+y?UAEm=yil`0FANE_dy#E6K|~n?~C~d$EhsUd6BG*Pznm% z!0rx-_fe#Ul5!p;g65rP_cEil#H2HK?eIs>%E@&Xl-P^&*>*`!?VaZZ%65f#TEVMp zrlP$rfE#fWVB)BjM`8j90(2UxRh?btH5XaX%(84nYUV%sRQL7~l`mHy&ZA(?{--9! zm(5tzZ_eai7yfe>4H101fQOU=DD1!BAqqbr4vEggK!c~&OYw1+4UGsH*unfXV>$f0 z+waL<<`t5g`Aw83dlD1C6k`N{hdnIu*4xtJ|I&zlhykwq)t@xKOZ+37COY39Q7+bH7>{f&UspPV=Qe!c+*=+ zDeR2i^Xcvg1n?5%hEH}u3WWtfAXjAY@YlfN_|fGMUv$ga{Ju4@yRDo|NT@u zuigBcyD!XVf(+VMuc^g6>;V2!-UNdt2s=%7)j0twY`hE5dz$QAkqzjad>mXRF`1#( zQ%}U2QS6!Yjk@{r`7@Mg;i|g#+>akOf3;4`!Hh-yE2eDu;>rh1-QQxbqZ3J!jk9Wr zQVxH=Hk#fhXFcr9vM#_oJjA_ugxev9ti0mee%JfmzkW12d_lN00F|qg@we*&S7`u9 zuA3ab(z~T*Wq{*p5ASNP^AQ@i`*&l1C&rX`w_q;=;1+5M*qKCfdtf0T7e~Gt)CShT z;3jK3mlo#a^oUqKWB&Z7UO(~XoO$!gw{(ul&h9l_zOv4oUq0aTPluIkTfB;Y#J}0} z3?I+dRX>Y^zU|_1{?9efnsWNq@R8DgSbMSe`e95n)xD>MU6sk=5DxV50Fm(!>kugY zw3`2UhD|*YwH4G#({&AVIKx*QkJ=WK&g&ns+2)(FJ^LD`GhZyVt^1t^%-gQ6$s)Af z3vK&hO|T*qEv-5L3HKekBCZs6p0w10lM839Ik9He!jlE5X(v{Cn~L@#ufoh*>y|M- zfvsc9*4>gS&GYvbnY`ueL^IMMn^Rmo=ofPrl>oxR$y|>B09cL;FpCos7>wk0i$BBN zWW|0_Y}Tp13%xuS6rak9U37XLb8llR4EC+@4K6gbacA?C!Tc}tnTnGmvopq=tdKf0 zJ7lr?;>*-^k~ATo&Em`QCrHw|)Gu+kdw`Bv_&wxMR^@uqR*17e;3D)uVY1-&8tx0a zC-_603O4+t`aJQIDt~C@8^svK^FEEwLuy=Ae_J`HYX!ZHFZtwCtr=n+^*SvHs;v+T zFJY^qejcJ<+|`MIi-S|I_03!EU)?jF{mAB=orVnTKTaLtV83AL`z$BckFW0fK$npJ z{C^UPG%gN+OhnXmMyTi zUr=@T^&K0X&+B_l9yqHkSDtug#$H9YtE!@NjYHO+$86s9OME_`d-2ANOY9!weMWEH zHV-f`@+Vd9Xn!O;V>(%QJjR7f00fCs!MsxO9pawl1Cx43T!|EBq8PA?(1k`Xu}gSz{;hXP+h0#SWT zNWV{;4~5H0!OPkj`9FD#ZHv~q@Vh^SxBiiT>!?I`RtCxY)|&ZC>;oPtF;-w+yY5f( z=M3JB{HhfAb9HSky2P5q@>pfPvYqlbXn_-ndY}P*VNVMFj#AoURT3?WLns5>pl9M0 z`L%~ZUd>(`d})=;QU+I+L^faDp(KCa!yu1{CvJwl{mcQD=n(i|>#(u>&pG|pbt_mr z=gN!aWACIGf`3{$aV)d9xoN&LBB%e(odlnxnTEANofOb=V2!3x=fsFMHCDXV8{{gB z`l()XWKacZpXLla#&$|iH>#h^@3Kw78%Sba#ukXO&U4Of4CWvQkWtVN>aIXWA?&nr z6Od74P5FW$wml-NS7JgNrnKSDzTR`dfI&l- z^lI$#75>Tk~%0Ml9buBOO}K~t99j5f~J0ty;m%B#%;uyHJDc&_*cMy z_;!#xYxYcl14n!u^+a~UtRcJXVCCQ!V}==9<+q*LF^hHPXI2b7&|yUTn6l_1Q@*lr z=jt+d_dWhCQu8M8x7L``o_>Ccm-n8QL0N+^-of>C%2SwMP+|BU$#k}OVLB5%P_mDx z49;uz)p*(Ihj70xi@wPlS;kA)JagN@5o1GMOV2;fKIZGBwU#Tiy%^)l zL9P?MkQ0!8#waT}{M*_u&0);9_DgwU-CF6QoMRqTP>p36Vy zRczox6>sC}e^u5gBSqW^wth%(e4JW$UO3jkw--f41c@-lB3HOTGY|_@+Kq7FH-)_9gziPp%K^}s8Z(;V!XLn2heTY^<`RgS)L?CdR z|Jit(rIqAh-&*AeFHImc6U6$0Vp%H0x?>Xs1sYl*S+!+DpC13zhgSJO%lz3sUe3Lx z8x|=+@+YalMo{2WYNU_bSd!UeE=b<9*i>|6Q^B>!-A{g6njAdPsB0(r8rm5fG1+pg zLT}zst$3+pJe4F)aFkNbXQVDvmDqICTCZ51^!bEUt0sO{!*5isTD6q*enNB3G`j(d zJ!lr;8Lc(8I3;n$4mZZ8F)yqXQYm0cMBJfb9~wGr^obFJ+@P*}HrU z|DEECnbYv`t;6Mm&JN9omA<(4#nNHTeP3|*-nvz4y>+X%9XwKiW7hs~j(bFltdl@4 zki?*1cM13``g{=w5CknZ_8xYD zA*2xA{StEjy1v36R`WkjAuE3cTLL>kI3LV*KKh8>osT`+8?+K5^$7A4@5)FVA2Of$ zU44i7o&2);tCQe6@!sQ|@?r7b9y&Mr;=KaMvCRaPg~u5jXoLjTh=w3@?u{tOW}F-~ zYW$)bRy1T^bh4lyzc_JXjkKSoE^dN@U)4zKtthD03&xnq#+E4jjMSV~pfPZX6=`UL zg2Ptye6jeA3m4uftjR=$0F<~*DQI=H5GtT^#$48TDr$1OLJxZM?#EZeAVX(RjxibTN+6z7$Yj7Yp&2v}B~Bc=(fB-A^xjd-Qx+*7VFRKH{x0Nj^#aqM0`$ zZ;33b%M^={Ls-)g49f;8XJ31D)0RWfNuH-V4u`fpbNcjiKGGCv<6VAp?z{P@-Z=qZ z)%owvMatlMXjQH2k}2#*3F4aei>)0^Tnm1;yGCQsTlihOqs-k^qmP7*3v*zx@j}Pb z4vk9nKcbB{afa%JgpM_GgP;k^L@cTdP@W~^9@d2*R>j?y0rLKHXASi7T8l&-e9gQ2 zn_a%Ye7fh})y!q1#LfG@?B3wqm6ZoanJ;KM>i7) zd;fyL2QI5oR|#dIOR}bb0Od0(DvOA+3_)y?D6{|<$?o@9#qjtgOZeYBU0y1^W&V^Z zEJ!1Gs_U7uT~|hyqjTVs1rFd7AjG)D9>YgkO|#=tj1s`&bm$-Ev7_>4R;i7Gy%eLx zzWJk)8_WxN6XZ*%1HcgBlu0j}-=&e{MwKX|y^Mtp)WBsv;4yHv8~ zcAI6rHtK5Z{aBbkqeF#*Hepk&2M{$#4>nVlz?c|=l*Cyzb#K(3JFO%eWX(}m2VGP$6iBf?9ip@P6r1erLhbFedKhT++8^EQ ze(c9g9?lv z2-bZ&5%(lEkn30 z(ltnquQ302`4=qujnDeM((ki3STz6QUFNU7VLl-BG4HKgA}v1!1JHY?%+uuxslWLE z#zy*%L_tSrusCBdwsefmUXyI{w^LwNx3{zJVkgPkqk4_KBHMxR$p#kffR(JHFcIJp zM%O_MPVa{OfbV|6gvaV3yy86ji%cDM+8d9J%G-}3mA4-o)p-?t+3bfR+@|>!`%28W zs{c|fFu7`4K@Az;!~z_kxw%ewfT_0EZPscwJ65`Aqmos8wxLtBkJwi}SIi(za{DVp zl3w9b14#lO5UKWAh(2un0SJcw!`pknMRjcP<2(1>-KDd@E*+#Ty-8VmM+HGd1VmIs zRIH%b6$|#>VmE4x&w|7*!PTg-y=c(9M5D39B${W+OH4O;iLjUdcjoRQ=H>m$|MUC( zVo2P}-I;UFoH=dIoP+a!@G@QiOfQ|+(>*Kw9D^OCu|yge(C%jb29mXwNcB`(ycSiwkWqb zsFrEeW-1Ntk|8BQg;3>F#$@*PTA9k$L915F?6tObT9wL{<^ZTzmWk@=K-xH5vctm zhu!5*&z-dB{{UqY!14QXbN5{*mMtyfuh*Yn)f4mU^a)Ak>s=pSz4lO;H_Jk75<3vM zKV-3Ws|9oufrZ%LqV2Kk!)sR`x>DLBob=M!e<5VjCg5rb9<*0*%Ph=OMVPgCa6*rWA5)Wl#OnL`eg;W7zvCP`W+|v>R zMykO|x1S=v0|O$>(E=bk#s-$stK%ijt;dT=wI zhj6bXI$fc2OadP0xD2@c(=9ALEzBsqgu?q!5~5}bOKusEA(#j&6$!~tfoFekG-ZG0 z5&oE9r@Mv7k~`&dM7lNhqot?0(o>FMu_@`W?MymbD9pKKmKfQFY8sjVk<7@_IXdu2 zW~0BL4Q+^Hq7O&CI+_Cmy{3@`W0ytQ+sHi4Egk9BkBXps-^yl-*>OjU7VBlQE#{^i z9Bmh?0_O>=dAZ_oIsWX@})dw=203u!PCYC*kM|e>aji!qS-D3cF4nlCXK{Yc9@$U5HOPlh)Qjf z_`h9m-#MtdAbIBWL9MNWF44I!QbDl4cl>4sz#ZfK9Md%>oI}!`&9+#{wpc7P*H{xJ zYCJ{R#mlTbEutO49XKhI)c6xH3e;YwDMjZs271WaZz$5=w6=cJ)-Zqm{7#H9VO`xP zAEN|2*3)G3y2<(=o5bM7gk~<;aBC|i~a6+|3vss1& zv6qZqD^>1sxj8j@&8;M(S8i%_PCY}!dZmzofGp26q(b%=pv=&DWde=HFr%}MujcCxh*RF3=> z)n?c`+uU6NrROqtnWux7+|$L{)ymVon+lwAJL;(lmxBA1-FAC85L^@Sr2Tut`$`T))o!>rd%z zdr1}nZF&V2b5g6p zGSfoXqLFX0TjpR+l?N@*1)JfNMr+}yH8;0Vs$ep}Vt^#TWi}s}9W<5J4r=>w=>}*p$T`-hnC3pv z({R8#2Q<#XT~RaSyXexbeSBs1HaM6xSEy4%a6Aj0f19#|O1a9;r^VN^C6HTXdERbY z2;~K;kX7iJp+evVAbJsaazS`T4XS^JB!*KZGmm5@vT`dXep> z+|wl)R-9^$wcObvWXg6bUwPS0&>hkbxcuL!i?;lSp(9Ji{qn?A7p>{q(BX?~SY0$; z+%U1QZw0w3zF(4+Rl0fm#0m3lT$V|7(V%Pq+)sc@E^|z`khSoah#*sN3h*jOi^WvVK78j|_Yi$nOwb*KlJ?Y?}K=%Uw?uk?C8sQoTf>|H*nZ8x2p&4v5y{`5XO{KM&hfIk0o z-U?2L7)*9DpL8<;H-Hp&mN=-V>rVlaBS*%n#gYO9t;DQwZ;hH$NJTE}V~II$rx%C1 zZ8;O?TT-DBDiPIc{q>x9^Iw~%5$7XxQuK1i9IpazD_KFhCeuR6nennq<_arbsSvCQ zC}B-SEByh>CSQ3P1zp5UPnDSyuXN%$-rR|^a6+3CZbY}?I!A$B8=4fHUklm5)^A}tDY;gSWqXF~KL->s)r=Q>a&3^mBG zm0aj9gywjI0qdSXuD0z4J^!5BVp?OR%st(PwBXzp+1qj)Q}(0=JtZo$7k4Kl^Nq72|VHM$gBfrxNs}b6Csx7WpMK;)Lf&%v2BC+0C+u_V#3H z=OY%zeV`ZL<^AateCuYq{V@mY)64RW2IB!Q8;}t>5bqOHMprM z>PY1~d{76J<$>A5navnGcE-bZuYRik^y<40^?H2dKXTdj>#uuUb~qAC6j})(mW~MZ zk8%`$#nHwc@mEK2vb>@Fpv#_Lf88eGN%iGohUXwgyV;O?6`&pC0dx5!tbYrS5=~|b z3!JB0fe9tSXSBU(RwT8>=#NmbxxHCWzSJ|3hRp_Yw(E?1{=8SY>-iu3EY38uts*UDuBoq7ERxw(TOfG$DV(9CLt2 zi3x6)*_X_O7GkNeFjL?J95y($z^TAymiLvHE$@={z{Vf(#{@Fp3Q}OqLeK&m1u=*) z@R7p0b2ybWoMd|gA2ypUp{6&Il3yAebnz8@+QZod>u8~2MiojKF&{Pnl`k}JgWBCe zu)FPHcPn19yDiOHY^d3NN!B8n-7j09G>r!-Q}p^P`N!|Gmn@(8yZ(1_jL2?&_w`3R z%F4^j4IN4cU-eu)QA~ zU+soh#P*_{32&z+)r~l|Zh6tf#Egrf!BStu9Xn`%gp(Bj=5_3h+!N6UUz6>}qnGa`xh)bT66Q0g}o6-o*U;y0IlCBMk{_ z>~8Jc`PrA-w|%HugEp6G@7#ZO@!~h+IW?l-Mm-cigfaLPQGX}8V*vqYBbezPTT4e- zX1W!#wax5g_SDpVNS*X9rgn=)-ePy@Po}n$g`?9;rgjpnF&|`0vs-J-)b=H0!=$(; z|BRpXEm6fbJ={!I>o1BT?=Y-{)ReZbBA+=fIMBGgZ8r?S1jub>FDYt}doqRUby?Qu zN+!?QbNSny&&T>61+59InOY3Fj!YF}$6CZlam0fi1!0RM{1@fWe9!C21u?yQA-71Uo{5CH~na0`PTBhuYiv+mW5k>DCzs#JD zcDcvho!R+^v&5XVj}HzcSyO9Asf8xYf35MrQWqy^rRLEax@1xg>0!^g7(O@e&w58E zpk*{og*P?LoY;RkS$Av%?G{aS;~ns)g4v{qlH|B_q zkxpAMB4(pL9n)dF1sxsZ?L8-MY-}Xs8@IjLENQ@Yr( z3qVoEThLw9mbQHPoZ~VzhQ;0RAgCU~)q&3mXpS}T0zNbrqNLrZX@G;CN7nSKME?C44A3razR zt7wl82h2nxIG(@j$w6^|q_xBxy`;$a_cqYYwL$y`r9X;AzF*c{4sgLk#uzc~U=CxS zjdmu&g;)`+4?7Q0(u!oTGkH1AKu}7gy8`DTEO2}SmcX;8H|UuND+_&>`L!e?ev+TMBtCBTZ0UrrN$fd&()UPqdNzAjQ(oRB;`7=r3l zd@&8y5YF91>>48LhWSr+oxh9V`}EEodSpVw=hEbzXTB2bRhWBr*SWiV_w?nltw)@Z7SRZ0Fq9 zu3flx%`|`P=AVAr9814z5Bj{_m0#G+9R|5jR()HJoR+B%$TP9&RJ-f z!#i>34exQ$2AsYS+!Od*SkjeuUW~&(UvAs+O_3~h1&~^i2d3PD z;qtqNk^nbXW5NpK6O51kpwO;)Z2jKF=dO7k>@2#=87gEudoKy^ZRw(er_$$ucR5%T z8<<)(Fev|17>9K3e{Qn#sVQCL@s{aK5b$;XA&=*oL;}Wt3Vxz@1!21)C+RN)a+e9l zCjLn%e-glC1vmXagtEU$YM5}q*(|O1rR}OpC?7JDNyr&J>Yq%F7{$kE@#k4geQ-lf zX(ND@-oK;v2*#0jRU0qHaW!cSqbN}u6$NMgLYjaFz>|~*ya10KjcnV}PD8lQ0%+)= z9SwT3HgtfGpY0nRA+5euvBVOZp4YG6Y2y4|Ec_El$6O;*kXg@zXm$dF_j7^9ET}bv z%u*f8o;6KE+W=yG%rM+7neSfQY24{yU(Jp7L;bVIPl%=XD>d!@(Y6a#)<@8zS7B() zL(e-NgvFP+d3r^+KOW*yH$Y?1hAwHFEdxc_rrWsf<+lTf^?e z_XZf@V)i;}%lgyWvUon-_*{Cw%Ux_^zLI3$zkt{DKBE`QEgSOEdRlq9*|YU@o97wn zmgec@7U3y#v-LEsC$opyof~LU>Vsi^b+fIfn+D%9pXWKzt*>Xgo4|OXP|1n+QSV4!zbH>{=PnQ(2&&Kl=)VG1e!SAPvKhrxN&~Gu) z`?$BzO_+|)*tPgQ{t<4ny`K2uGm8yVrwe^+I=; zqMJB<(edGt7m9g=)}g_BQw)m9TG>E=EtNAbtkRSLqofz zdkMYUo(+B_!QRVempaNLJ88zL*@9JDOX%SINVRTU6y|OKY=t$ZOcAVRx6DXP zoY68HelMhjFdO4K(mWt^dxKo|rf6WuXga1HZ=8!FAsd)E=Fg z(W*`yiy7k`9O6fp5^Jso6OhZP3$L$U+uD$n)X=(CTuHoDOrk?8d3W}y8A%e|#g$ElJCyX1`GZ40!?=}zw+`?Iv2g{O z`%a5DMx_dLA+QdBml6#066yldi_6OV$f)+L>(Nourqz~2Yx_*wGp#^-y>P|Zdl%Lg z^YbbWZ)+HyVckUXUhh75!Ru$o%sW;a8CiR5o?3nAhmDz;8-I}SnSpr+8ut~Olj1_M zxRvc_t>)PNO%w8b0IY;N-Yt~>O!f7j`QtCSBeDx~7*TDnYyyRiWS}vT5YTf!@D7$? zKgbxrFvMBv4UCE!I4fs`ThC)EpD16S7+<>;NGp)%cOU!4%=XFr{tXXb$<5pJ>4uo2;y=gj zt4oR=-}uepN%7A0hils(G}fd!yJw6mBp$Bm6vh(3I2$yQ_!q9y3#b?md&>cLCscfF z>zp|mGmq9zI6NaQbJpRp#9I8t#JweB6V;5MV&>Y``AIozKU%x`-uk?z%(@MGHcrfn zDIOQc$tj;fS_&zc6A_)Rw5A3jjhxb*nDT;aTXjqN(p^u!|IEZxhG@)F=pRh^4dZRc zcsh)S!CBW3@9o#Qo9(zM_?${jA{zo6r{MP<_&`}XDpe9QHXIW;bk9cHam%dzQYsU> zS)OstU2to0ACFUK&ft)clsL>Vq+(~F`YAO?@KWS{d5?6JL7Fg zTjaS#r}7j7DQpVS#%t6z0uyW~qvq?N_7o(xN0PP;(VdEkn7m|jQSy*}1!3b(_Z_w| z{`I!QgB)Y}&)PfowfClnM}(~~aCX|9y8V;$g4KehfA4u`7h8pB<#&Ef8`(>1ZtrG) zx2G;KMks#$hh6=5u9{XHIpXN|%NxELDaNGD96u;i>zg)U)YO#pnd8dR{f2!j?Taq- z_m=Y0y2xEd8_?fKbtY@2Eq+wX2#!W9(WZqUWt6^yI$DKkpfC20R)aFvv|^mj4+XUy zY~;xPa}uVte;P9=D`0f}RAT$uo8R9bcm2(+wW)E*n{SYGO+;K~V9L%>RVPYGlDIs& zuCAuCkF#qSn1k}?(2fs;NuY1IECEv?qU*?X1-+Wg_6@zKmP%BA5+k@6C}rS<6JcUS zzmfSnd~^KD-kX>+qa-4tWJb=Y3uRG>f08SP%#_?-Y58kYvsd!-4vO#1u3cEI8y42T z!oPRzy1KqWeKLpriwMoN-KnH;bfl6dW5W-Iak&d}`t(Td0XmrEGU(7nF5^1ge@bPs z-lS=|NagljO@ETf9J?zs3;0X@IeZjKf-2`!ztHp?v`NtUMT3!Oc>!^{djFq6`(2RBW>twKKSccO;A7GARR-B0yqz`!16VG^t>! z2k4mT7;`;vVJm6Fc>#@R<94JZLRf$q+8xO zlXg$e^$qM(muoo26=n`ea-I8h=B(ed#28#8-s z{_fzupLZ5;fiCtiN&&WvR_c&7as?tH>%MZ$}j+bo1<<(JRL*zJA*Hevu;&eLi>Q z7Z=xSn@Iki@Q|1a^38~*Sv|aBd-W~U2Bie5V+Pgt3Jf0h6NpduDd7Jf+Jac)|1Ddv zt%Z%d0enk!H24KNm7&Wt12tKwAlUFiF&NnecLtcjO?jW%<0dH}!RZY+k77J{gfEYW zLm?!IGY#qeV$3IEkx>C5NZV-QL+(9jbYj#)(zs&)=P0aS3LV!3W=y!E(*XB1@w(d6 z49v;wtuePEOQvLJ)D(nfj$6KN`MAv335`=GAF7ML<(@nwBYjAUXGm^U?d003+>ng9 zr>ECnS(ZcI&YRjd$Uk>%kDSWP@W{l0^N03ZUz?s@yS`t{fK(svr2bK{dGSG7|Lz%s zW))TLo0;8X&e50m-OIMlf8Tf1-}tMI2ZXs!8LDDApf7AQ7>@yrA(_0Si2j9mrK&lV z;~uQ5&^c;!6}g#15?md1`^Pp;O)<&Mq&XMGXBX!r-SX-+dH>{IUV-@&a}7s`omY2n zyOgO1CXU%SFsZsqrzzt)m4NPQ9!3Vv;2TFWkt_8Boin!kmX1Hx3t~^TZD!j+jOe|pq{%($}pAfuj z!((xsU|nH31Nd-W1<{EEMNeJ@gf+gLB6nDlvrE#joQt_tiO$Z6Rk;_J9vSH$F!JzH z{G~cDu=>c-i^54hV${AL4~~oC`RH+tKkge9!MA;@81U*t;`ne!seINfdFhUa;y0h{ z7$DzC`HQ1>sfC^3FArECG6$2iH1bgZ#efCFsdWzknf?kVKgUfz@!Ro9I^Cq>^}h){D)&s!vUUsh5YHTa_UtHs zFfgZj_NctzfSl18snxxy?+reO?~OaOQH(yl@R`yl2oR=%K7dGR1MT4t9l|sW1e6_Z zc0*kYJ5Qd(N)R#$W(PQh6?PGYY2AACuSy!j>aL$Va@$wE+j}6hv!iwcWrE z_s%bp-`Of&Bx!gB-twFs< zr9{mfo5O7l=s7eld(qeo;iu&B15$0R+`IQpPa0dAYU|({+6Uv#L|=w7MK#9FLO2J# z`Gl_pPbKayn8rmuG?nj?z@QBRs0kni4$y&zkiuPYBUYEDWM(ZIo$ixWl^)!$SFH6u zh0fF6-^s!=rdLo@B)4FW@YCdz3rihs{rXHRiXNEhuZhgld3o5mYt_MN!MG^kbs2M? z6@C)bIOC@N3#}ckIlGFxA^b#q56+@=l8r(=MVfB~eM@sQOm-N%KQ2`Pk}h?#xHW4A z$3^*!&dY{r)M#bnlG8W2(cPnWuDi#91Kz{aHc!gw5ngv;1Gn5TZ#vAuSzn?u(7d1G z;#1O|aP!-CS0<-n&Qpkmp))W&_e4|!Mj5@DZ``oa#wvEU$VgbQf@?CAvPyP`8o8Ed z&$g^-IV3u+6-yNsjl-%Q(LI!lv6c$cp-a48V1TuwwmVLzsmqCm!f3y(^7rEX!?sqB ze0^ea^2FCij@TA{y0P)J;mak&3O!t&tt>9fl6(4UaDlOj79)VeeLt@eW2e@|) zm?z<5g%M_H)E9{qMwt25jT;%%oe&%D(@{`baYSh;b7aEbY5lC7f1)j+txQFEf5Jtu5U{ z)O32WwtrsP_Fc3@AzfHQZ?1)+)joc$abY=GCJ46%^bVoXa`=5xNDa=k#^?lNWvNV} z?h00$N}V|N4kRT%j|(lCQ`Bd2et=%@lUp((rTW119`cc+EqhhZO3j&E6dF6AE?Juq z?Werr8WrfG@`>dls$Z{54lZ9i5;EJODKS6HzW=rdOV%!YqdF*{_n3@=$$45a*(-Ni zsTy{YXKauYv`M~$Fd_dV>P3`_Vb_=dzr>c|h|-}pJ1sIn&HK)f3U{`P49FQA?eM3MXNO zhqp^l+U@|hr^#vb5%4qB2@Qe253dH&!IK6#m{kZ;#%Ud#lyU+hn*?S6U2~yFxwqCq zNSOZSZ*NXZNEx%LQ2gorjbl+cM(vqZQ`omA+e6_N8@{ceCcB$Z*%URQwmNv$Kem*V zZ28BmrPo&%*`6fcRa$ZR%UFc11OAy3(gvYjN>{)%6 zJ*rT*ZKMR}>i_tSE5Zi-0w_Vhp2Pmpu=*f*&nb>?pr0%@4KSpBfyRc=P!1)rk)Q43 zSe%1($dtSR>K+)e#tOhnvElh_O^~L1dM|gqI;~`M(!iCK(N|g$isRkv?4z$Hc&YuO zy7_py#fw>P2?J94jL+(()(y=|7@iv}4?T|NYO!-)**nP4aVWI6&NFk`{*f0+<*UlD zw1PmdH21zGk=@-Q{WO;Le(g;?rj>S&8&aQL8a;FR_<-2@<(n8EQh7KO`;+Z+YG-$* zm32zPP2veE!#kxRWa^(~At!qcdngLD2&Psxfm)QJTau;u5>1e7l*+$M1qH|d-NMD$ zL7|R!)r}o7Byh%srMY_Nw0_m8gO?2oi`T8c6*Xt`VbM7tt1L2aRGNEO)%Ke1D5c5q z0=LE7BDha&wng71rzRN=HHPNIc%;{DFMoxEtXf;Kdum48Yh_b=dL$2CEf!x~L;o6{R|C|3v(YoFIkVjKG~1^aLV_Mru^ z#xPQ@QY`ne{=|Oqn`UGvuex$;2e<{l?m8!AYAizLoopy+3!-Wym0cJSJ?K7JYvRSW z-O{8)b{K2si#jDZRmH_K2qt5=ClwwIVkFo}$^c`KRBfXm^Ob5ZSI*5aB{)0MHF@~l zMRSKI2jtcC^3Cm$;<&8GKjx1;QlFJLbmrWdLlfUOb9J^~>lTsb7gaNP*4%}Qmu4qb zX8Ad2bv`4@$Hk4=Hau_By5)20D)UYI0X+#6vVOpj$bJSbJ{4YJJH8VpA&$v*=)ph>XbI|+=@O{ zPF|2}nvjgp#AWL?tZaz!>M=e)xjwG4&NH+!A|PICXK7wne)rD#3{8NiJ)`v~(CB~J z9%9br|9^W3Qo;fT5&l8GGUg4!+JsZ@1Qs_66?9o4#0TJBvETuV4QM4@gIIx*{elyM zj0@r5>S0OO%s;EUM^TQ4mx}j`OONx*ow2>J`tY2dVsJ=lc5t^aU0AoMw1wlcgYw33 z-}c?Ue)*hzSygIE-etaJ>ux zMH=}|JltK$(1gDW9YyTmu&5nh_`8kqvo5dH=QY$;h1GlaDjX7D z^=fTm;)K_#kFK~>pJ2$DGo_xJ>5?ZU{WYIUdLT#Q^RLCBoj!v} z3qbiAbq`0gS-4y1Q$l-MAS(d63qPdeL;Qo=3q>O4A|uG_d=0md#ZnyoP_ak|AR`tM zZqY)qeF3*HO_8uSUV-2Mm0jIY6M8fHD)})94%ZPOc4NJ3mhu$MY7XiUkY|OQaN(Dr zR0%>>NTii>TWl>flbpK^tM_!V@(h>rlgzC>{O#*pLaX{~yu3Zg+q-_7Cn_Q~k`F&7 zz6!_gQDZy4uix`tdJkVg>E}LVwvC36$htSYlYQKk^7eOQ+pj9J7e3G6K8EjYf-MO4 zMJ&)VmF9KQP!ra;mw_CE3jqy)i+n9w`?3p!{OtUU(!{9l@g==H{UcK1`|839($j|a zOv?_83v>4&WKAzp*A+-*P=$qu)=%x_#tjbkOAq%BwzhY!RjaIfrVY-^3AV9!^YSgu z@ol^O60Cx(95QseT+P;n^^&J+Lx1Rbt~MICS}!*@i(Bzy-Q3J=+-<1X{T%nMT;MrbkqEN*TlH+GBuY^2Vy5I+I&+K_FAQN4X*(anfENaH7m zNV<3dzak?917D-~3HA%3u83dIY6k(JqZ2)FfXu)V68HcM&c(*{af6if`uzI=i|Q4T?gDgp=l$+hJ~aoM01&XiG`~2?8)F zuVr8u!oaC?jUQkG{~K{Mo@yU0A_{ScDd6nmMPpmzkty~pZ8POTc>cOVp)d=GC@atT zOh4*k#julo$1jXdC@+r}MR7xYOtQu$Hlnn2dH!pc;uFqh^{gG(y&`sC>4K5lu{Tc0 zN`x@}Q(9k2OH1HUo?*PBLnfuhpO#cXKU_!rf^rr)5z#+8W=(Xg#&gv0s@n1qJ)^r< zl4}WxIf>=(eN}Qy;iC3-&hJ~CkvA)?Ajxv(7ZBp}Iupj@c( z7lt4gNGU+ql1q3Fzk*jQ#m?u8@q7tnTfS%|L<=o=K9jw_7&k;y>HDG;58u)FzCu_+ z$%pq{#9xG)!eBg~CB5G<$?ya{r>sESE08xlU14;)w9@Mp>OY>c@AMF_3CB1$)P3{j zLd9#iY8uI&f7aZ3#m3))OU4R;`iDejd`_bs4t`F8lg3Zl$Z}d$jrLlOMX|#;x&~!LeVO=O5g*)r z)O$X0xOjW>b8+Lrg|{o0k9=+EP(C1?kl5|k&1e6;yy9VvAUPlv$AYCW_i?$k~Uoj_rv#bC*q9RFo>dd3de4 zzTp-0%wl8kEp%+Y1Z$uWsNy9Z_M%$Y%6%_`2}*keNkS0Ri>5`Pfdc-j3y6sz(Nf7+ zY;pRV=qTEx2B=E!2e5CFRpuW4$-O2G9XZwBA!TnFicm&G=%RdFojFzTZhMtuWMFu> z-(JDLTgd3Wsoo`y1)0tnF5P-W=SC(sR?O@(c*Nv8UoUvP{7^_zPSmWLeHDYh*|FZY zkmu)&y7afzGjM6mUu=49Tak~sOV-?)_&|;WUJQP=KE7l)!)pxi;yP5o>jHYeTT!3V zScyf7S}1{$sVGVaP0o$&!~+{RnyCbeH7o5-)fSi2usU~apkI2gQTbQ$y06)OsJu)+ zZ{7nm@`wzN9^PlcpxGl1jZThA$<$_;ds{czSm?vEdxmMfYYG$%$;XQdW}dIf^K?}m zT{u6aw0z$6vxjc%SRWO{3rS;_jZVFtV;dI;kbw(>neW4RtuJ>9Yc!7H!tS5##U8Yx znba@g;sCj9l(Z(4xX}5lD70z4M&~Uvv^{#H&j-kF3>u)H+XkjSv`z@S~C_`}ni$9GNB4?jEM-Qyz{x(J@}3qF|F=U_(6=sXu^ z`yL*8*G&sgPX%0TetAzulQ~#tg)o7_)d2}4d?C|QxkT$ls)avL$r?0l?%0d_$~PDu z?Sc+6CZ5TjZsKg@=urH8xc7pg%eae;tiXz4lg@rk z3SR}I0~p4*QMmfv{)IMH+0|u51)1^LVaW-}1-&yZ3Ql|^~MS_i|x4XT{!nUk7IKZ;Z!qwFi7bD#x!u$D$wBL*;_WbeozT)=5%Ut5P zgnWHoY+~q;Fkd(1M`CRJ5*N*Nv!KH*>F?jOixtS`TAkbw2_D?bQ3uF$?r3e!QY(q$a zKef^y%S>atSbxS1l>H=S@2lX-X61)!VilUC!0;ru?AoY2muoXJ%DFv#2KVXP;%-(o zqwE9;2zE?JbXJ$yS-E9r2VQh9aP5oRQBMz7#{~y&T$JY5|3Fy$D;b5@<1(H2rm&i? zWIXT<*NU}EWNXLt4Eq1tvKt2ALX*g1kkShcM)^e9l(Wh7b|oY(Az{#vyv+Ko@3gEY z8}==#>~}z0%mokVQC}1qnh;*nCu7FR-Lp4d%PaBi{ll9DrzwvxUCJ%NJskKZv|=|a zpbd#naN_{?sUe1qHY3{)j1t`Av{2{hhzq4!5`HM`%z1Gvnf&^r?$g3nMo;-LA$4HR zLT5X2CBfS-E+kOUC%K@U=Yu2R#ijcE(JOhSb4bDncsyRIZJS zveP@b1*n~U=M0MLMu^qrNPpMSL_W1{;qVP%YG2=iUOwT$(TSl8H>X79W-d>0@eyzy znGh7}H7c@ z?Sfiy4gS;RT?430?etEQ$|%_!(G*yN3d0fw{NYKM^b5;zMVwX=nNs9HY4FIZ`vP%$7z6QJvh)g-l?Jf)y? zdr;jl*SznQN{zFRyScTy*4_-@QCvhvepSbBFL2Rz!9{cg8nqHCun!sDa;cxY@h#yD z`z@u(Y0$&~uBGv9qv7}xmhe9)nz2m%O7e#V+^IHt#oWP&pRJv}gM*J(H@A=;?{3(( z(yru8m@9baRtDBpAQJ;Wp!evBFsHvJ0U+m-VOm$_Auo3@AJK zJPDaUXGK8O^D8_x#~Q?(B2vcNmRNh7SkN#~TIP zIX>Fn!I4jH_V51cm6^F-d;Jl;nx4FPJj$UDA6k)%r$js6k7 zKIA)hCoej}J6U{D^DLd0S+iMi)w2owu(6X~6&;OZzAE3!Z7M08StCBjxbO|or$Eh4 zwq6>ybK%+2M@zMtvGnALvx-e}B_hxvGRI8OY@>-twy|jr?73r+cXSMnGzJVjkJ>vD z29su|npves?f=w8%Wt>XJh<5Q!pXgFNcxgT+zBa&6&7wNkhJ~S7c(^=7u!L{nn1Bf|*>4JD$i2lR@rN4a1tZ1c0ki zfI+FCbqr$S?724Wc`||x#)2+?ZDE_Xo|6y>>#xR#wQPp)AdTwb)#jkdD%70ZvpzyxR)ihrn^K| zdNwy3*1d?T7-K5vLD$iZf0bKF*G3K%Ym|1>)59O4Ypfd=;iB2>oY!~X*t0$5bv0`X z`&L#KOlaD@zb;3Cz5YMVLjj#%k^MtR7xL+zXLaZ04qCaxD`eD!IxjC)QV1$p!>+xIm7KtTi1XgP678^&qm&42McgsXb-KJ$$~5E>EtfKLo*UQDVCr;I-HNTCikjW2hHdyH}Ldy|hL z2Yv8-qF@eu;bUM8EjkX!hrk|(ucSpoJa~{ObjVyKqM_|Dx)J79bg|&5fyVjod7z6K zdMedEyp*#QNB8pDxMp`Fx4s!<%}w!ATzH!A zo>wRAoI1E5!mEl{t{7agY(@?hQ=kilW0*1?@P%?sz(^tN#V_C~b(|A6@L#~b($N#9 zK(sgnbe)a@IEVu4 z$D6Z>{}nP#T=AB8bM@YxgaZhWDKK^UYjSUy7xafcP&O%8T^F$eNT^Cy60^+O>=6aw zOR6TWnmM3!N@`?gTbe9hU2`Oqa!k^`a}l>HRokU)xjS!cS86y^^R+Pzv>E>0sW z3}2ya!Dsy5HuL<_-7{9$IlQ^*WO+X`@fHb_ySB|xhU@AZlB3Kvm<4pN86N7Zq~X&`)%3~Rr0eN4{xNK zTe+A8uJZ6cABytWPw^yD>#tGM##_Ac{|;)}YbVYQ>=zpYrbM$i7u1l9ft)Amw6sh@ z^4Wj)yz}KVji$AAeQ5qUvRVK6@&V7d%nU-(QhB-YFYTA#d$(0VCYpWlcE5h&`Sz=P zLem=X-uRABP={m$@HHkeJoa0Gce91k`&*LuVw?d(?8uYZ2VRx|I;2+@Q;7Dx) zC$+{=8xseGhwv{7`=k4(KN19-ba7rvkSc(h4geR-AdrDNxl?2=v7d)39Nl%Oi+v*pOj{wg1g(gWmqg1Q^esh!@qaYLNSRjTdnh^Qiw0X~F}csQ>?*Z0Hw zs5A3O{0I$tK+#h?ug|k5`}SFC2PK5BzV;?9#zXh;uc9;mv9JnpVQ*-1I44*sR1!ko zY#eA9Yp3!>R07@g{GAkWjsd!V@A-s`eD%ghQ>@Q<&pf(-Q{26IH;d;oGdaTVubXOk zW>_o!@#6=pEpGn8eMUxWyx&K;8*`Gu-l6l&Mz87;VLNP@AW(^UMp!C%#5}?fE=1`N z6QHJY9gC;JdMVho21G+@{oK90v~FI(&u7=`$;fN>A3W2ESKiOJ(|eBPD(SC$Jhg6I z;>;Q1eFKcDpfyGN33uwkXtGHzEb&~Dm)Df~5c3a1>6~|Q8ez$9-E^HFld^*maF8{@ ziqKFLT@!~$CHg&jd&S0t(e6=u_WW0FU$?+$}`rj-oWqm^73;d#M{fy-LUEiL8Usw zMME=QO5w=*el_2aaE=^1!;z`ydc|11?&Qq)hSnn}73P57-DRQa=57izg^JTCY$Dnr z5TyF%maCl4d&q1cI@~=Z(V=Q@kJS30odxQJ$?am~g2v9z$q_=rF2*lThfkzBJw2WL z4txAM!sq0xZ;8W$zmuSE@ihHgzT3Mze_1Sa`|R2^Zq3!195>@e`&H0q6LQlg2(N=a z)RO74rVc*vB$d3EhRP#56)HO8-#DBFFj>Tr2IC?=nKj*32ZUYjwEeuW!pE=o;-B?# zj@3Vz)(e{2|FKwj<-sj(GrHD4!l}G?u)T$k{8)U1z3+n9V=D4ssI2#u$^0OVs6=uA zN7H!~zW$W4s1!tvCrJ!){tXS{cMT2uf5P>H552n`ASc(y&0I+oyY$cMD;_rR`x^|O zoWA@|E?3E&KS9XI5qD~ye=OJjjoz^w3w%doJ|*-@YPwQk#hLjjY$Mu}sdQGV6<*E? z*C19>6BQX1cB_20;Uh|Nqa3Ec%wv_K#rYtU_EyspK$xF60b}>#^3cv}Yoaew= zsyH8_qdOQs;^#x|s< za{5_AO2n@}|9;4ft$MNfNb#im{N#r8_Q=yB6;|+pK_|1lV5h@Hrn&x17{;%ff+@Aj%b6h6@!sxcGYzoxL?f60XUG4_n zc9QjeSz^k&a60bH!OLag1v|QwiU5_gmN@mI#PpAgp*kj(ign=c0AG+_WaNIsEA%h^ zu3qF3#|S(?AXw0aQYsF8uuHd*Q-$A;6#PPRG zQ?;KwKqw6)*WCx#oz&L{@=iJ6rFg5uiKo({{jz@ zsjy!w1y=KoDjVrARoa})zEeiUlHvMuDEmC)$DrtzcXq7ff^bzlRQ!%OaJSq4E}oB% z-?6zKPK!~Ob>jAaU6=6>+Wr5hx@cdonkRmC@<>v+v@tolog1YTQr=N2CL-8OlCpF|T1ZI?Y;4?yQJ#y^5=3`RExCI=e z`Wo#={T|kzCESW#kUHzc?MTw7hk&_Rp!TQU4enwBu8EM7mh?=kt6n353sGzRIh>k6 zmLZUWPRMY6pyFt|RAm6P4e1H3PdSsAaS+;H4_KLP^-qp_pH`nO_`0gPP<-c$09Wpm z!miiv-rX1)Zu}-9E;rn!uYAIhVsh#uf=0;8MdYp?A&ta&Qt#pF3CVvj9-ROkR0aP* zE}dmTrRxYN1>;fc?-vl`1l^}}jP`86d7t|rJ;Jjf9kQ|6QN*S(qPw^Ykg5$`~WX&XZ&T{y!297%cVwJ7P zw)&jo{?Uf^ixRQ+k}2XUv89t#DP)@sY5&*u?)JrtrXAV+$`-@rzakrVvqw#z5fpy= zj<1As!Y;(wt!b{F%txbuf$1mxkEc3Tk}5W+$PkT{L~=DAP~RyIN2QX{;GiO|4J0Ft zkoD|;-;0$CRuS^fc|y*7_E_z~ohD@ep4jx#f9tc-B8cD$t0^Bp?HnOJNb13eZ7};! z%()@H)6;*IDl5pNn+wQ(dTq3JFm_j(2S9wmM{61Rhp?XNL~%gKrX+XLYq_yAPw3K>CP zaxG;8a2}!!P8{7BaJ`JX)&wmA0gfcf2qNk*7h~27sOZg;UCRbf=rKBdW1nA^*5#Gl zlFLaU`H~RBkK)s1wS+vnODeXJl_p^>{=tctL$beWA2^-}k>VyoW)@bA(Df59igg^B zQZWa6{v(bI=}BW;*vo+({=z}ns4U-$+9G@akp=jp;97tm&tZ=M+E`{9qwXFhE8&70 z8d~RbA;dYwWyZb*cg4?@=4b(JOUQ?}eMe3%Uv+deTD=L@4Q<<&a0MhN#bxR#X#f<$GP!%lMx`a< zIIdt-07F+c3WCHj8U`75ln|o?qdL`aqFijb3_Iy3w5#yWAnv6r8V&B5@gz;*A$By5 zyHD;F`U#{YyyuFwtLBo_6lx@KvYm)ic|%sHP_;ouAS2-a!sdg)3G-NG57`mp%Z(+c z^c{Os9(?h5e^OSeP%n-(xN+BsOX?1)zMpyQ<8Ho(~Y(@4{MFH%Tjab4hfX*3f=wDZ?r zKt(?N{!f4vJbcJ#*k3Tg20Qbwp<`qI6@=uIE~6TOESAQ_m4s-1X~zjPn*p4H4`dHd zqfjsW(QqNP8KW(n%dHtRjsoN{P5H!#mtUbN>rM z>SqvFE}{K#avF(OSPWgeqGxys5wZsyBjkSZ&`R+L79L4fT*r@wtHR@s+B7#SN=16^iP}QKBcUES$4YkVAJG&bpwOzhAQG#K zRZt7vgQ%5Wy4atB2?-9x3HX~IiHpRNb*ISA^}WdPUlcVYB!mkJo%4nG$>Q*d%ALyy zS$Jx2;Ogg$e}|$wX`$j5T8)hOfcc|fqDV0eYOK(MRR!{|u)NrO5I0mjYSc+IbS#~P zlfoZ~U)0=S|K2${4|grfEEKkLqXWgyuY8d2oS8j%tY510E7hstm7_T>HAc8b)Wm54 zfj+uBH$|{kjb1R=Z}GUQ_{1ba!g{WIof}$C##Kil%mZ*puJDLoru2l|Mpi{MZmQ!T zi|&Em_txCIw??j~|Gh^;X*jR=QSKx>Rw7wNcp#H03-OR6n}y%_B*i4q&I%(?7Y9qk zLw=8sm*oIO41l{6afL z@%G52h1{k&1s>>#V(%?bxg*4g$zpe?l!fGPtKXdaIvIDCAldOJ;z-OnFT*3wo4irH zVurihxq)s8r`Jsrr<2LNxJev`IcmiLu&XpuJWfjiwnx4uRt(v>N`%resamNKc$L-* zKY}n!G#3TJxsT`WoFcZ%!^u#xlFTAuC&lw(3rBjAoDeaT+$QhI`yX7hGCZUxe*!TV zKi*rct`*;e78cJ@bu8f*hq<>4Rx)oIXM*7oD}%C+a*9Ua!j937R(bcqUu6KrPl*a$ z_~=345PT9?EPhJL1{JE4n@F{|Uu?<^na|A}-C8bQpTgbV)NA^gZI46kEkS{6cl zZ>r*A{o^Q-3bwLx!GZJQV*;qk)d^8Vj1}XrU4v#XMz_boq~~dzqyGx!+cY^B9U17csLKh_!5>bL)}=k_A+{^E6UDVg(1FPq*|NQR+_>p7r#-ytq1 zOWbqd2+5pETv{HAC`RQ;z8pT>Fq4c~53}lrbK+y*40^M@sA0MpliKriHkE^~zXOmK zqJDhkU4nj=U%s>Pd)VT)$Yst~+;RW#=f@2o6FF5wpa=iHEC@Jy(U zt?zufU2OQEySlqbWe}AgMjoLz1pur};|q=tz|B5%4+8XR1z1oQtK!Cs-*H3F`-vwj z`lL>@{)7B~oV^D?lt&Xce)~LE=*{HOAykQEvJFcAw{t1NHsB|A&FV-0bY`?Ci|!?C$I( z^6pg6=RHfsC74-7G`jYsepQ1@oLvyIpGPjz4#Q7uCp!+-ke*h3;sqTACy@^U9|0_x zc-WiOBf15;GbY8-3>rc%Ug+UTZ{PhF*+VX#HGfZVFMu$GB{&QAvxx8?@*LvKp>&Zs zpKPW}={&g(lj<>e&-@0yLW8}*B}y-M%xmZoHWbh!5VIJXOh^v-nEJ0Yq@N-moyO|u zSK>~*g<$hn^Iw4Puom18VSuP+`%hfoWkOLRd4sq3NnYhd++9(mr0u&LPv3qX{~zQ4W*=>h8lJWI{f+wgmwMuL`NtPiJV(j(LEcQt7?$^d z$(v|Wvqi4T3#VytoZScm5WO9 zsZWW|$j3t8x(#{s`IO2^G=L}=FHNf7xQ&Dy@SOyRLoAEJ>JSTtjif0w@+9$v$@uN# zL90j%%M34w;{8Ssx{6Fbwrk{uSu+zmcRveyf+8He+N=CG&St~vYTZIalc;3UtCfUI zYtSmg$s^bOuH?Uh`9t&hvt%||M9;hKbD?+}L8xKzPJJ{1dKG-IY6NY$DBj?Vm{E zos^p!KWso}*y>ee+OqEM70ZcX=PvWU@|@i-?MR^;$ilzA8NOfGOg5anRQDkbBxK7R zvUTWCI_`14XUQtz@B#X$mfj#LKAucxMPoeu5g%bJ=c9;UM6H_&JF}8O^VXTPCS^3u zr@o6`nuP@MY#HF=D!n_X#2;NYW#$0lrj2sEBr)B=}GC6Sc%Lm7>9TazrK3Yas(pNqwt0vCi z{oM(fh!OwdJ_75n$xRiUg8OzD7q<|T(hD%eZ(+JKY3Nz#N{wgXG3Yqm=kyYubMt*A z68q_Em=S;QMNP|5R`I zWv0Vb@nR0b6!hog5Lx<& zetldZ6Ul6Uve*BMxBb&dNTPVN3NH(sI{O~!ikDrr^d0jFCO3 zd(5X^!tc9Qlh@`Q5EgDJ^sGBawZhv&aO7`TpGWk|o#qe7yqil-O^b|paaIJTkfon- zkXaUe;P#2FTfk?NWSL<4OahI>sJ(k5#`E|Yn4~|kpR5y9=EuY=w3#CGZS*E{=v2Bv zqQ`XFcFVZ2F<~PV<8H7SH!v*$R#g?~j&mu&qK7JQmq4P9BzvZvxw)mFVaLi=+DY)Bpsu);rmYv`cJRZZ|4&8eY2SeuA%U@;94$(HN+YLe2hhZ zc;t+Em#|Pwm#UaY7i!c%H1#@cDnORJ445p~jlnynSPL3LAw97)Ug*C%6eH?kLvUWaZxveMjb&tXD#AMvE)$i`9Sqk?-Q=xEn4bixQNUW~}GN6Hn_dDQMv z3B9_G8X|Q2K)iIGpiSInT6v6tWtzU(`h&;tl#;0FaEGj8$xqG(i4yb(aUy}0A>;)dE+=iH^g&whE)tX^kcV|7Vu zE-AMQxap3SBRXK@3O6QBl1dnTwg%%{-;i7;zNj~Wn$F^80PzyWK7Krm41fGj32qVp zyq|dfyk_f$ourCBM;e9?r}wTMC7WhUd2T^Lp#GEEwr$^75$PGfv_9E$Fspwm`f7qa zAz;Amj+-_f$D2hp)_O5gE3lrHJx>kuK(NIoO%WZudGF>Q%uC2OKS+qLI-MU9jX9J5 zSXi`V$)W|zmMviaC#Tnv{jYCFfc7~57G6F+lU^sE!#+9xK++(AKi;A*&{rDX6;_c& zdzWorK-R9x(+3^z6(9ZFz97%`&;QHcGxW7}QJ%?64jXVkG8XG6?)TyRaWK}AkUbTS z1q2(_8dwBKzCQ4Sjk)xpNZuir=uf4q>ED~qf3pVbVdyZZt3SIG9U|$13o-vj-#k>V zx{~qM`ApH1UMMI)^meu^3xiOP7t>NIKBaUTkcH+@ff<2XBZ5-yAqW|}GZ~AbT>@V9 zBE*5f;!mCol`PP}7savIbM=Hw3uNO2&l36%(FCH`4P@gJf*h|8_9gbvYh=@Dn3(2ZKKRrnQrZuBHQ~y+8&4!IDlf?A; zl0Ll;OeLG>=<4U_%vC>$_K>~T>G>}&syoqv^&_ZZBF5oibI zz8(`1RuSGJ;z>G2( z0_56+rnv9IAp<-CMgKVrRYOyS(*>Ra2_>3;5!#uWL~6ctjzpPXPWv9OwPqYgYPs{8H@-uyeHTVCQL|GqGL~!a9bG5kCp|))d?Jr?K$!%-9&HheET@T zzR;mx>9BJ+wuXew@6b1eG2}F%z34A5)a=BD%ZfgI=pB;yQ~n^5)fC#Hk>HRD)|XAw zRbg^`L%I)yUAs8kr3=9tLV@589s%&y3BOhkp4WX|_v(A(Hr~vez7_&g0p^J1la9|^ zOjOgWvqt#%zX)EQAc#vJHy!86fyGI$XF$0DFid~@ZT-l0;#E5R1pf)77Gw}+6-=kwA4UrPYenPHa zIsFTzng5wNk<`?xf+5vEu=Qx46L~`aoo~H*<^x7gRCK`JG2S=9n!rQR4HUhk(_T21 zhb5194A>i@=g;o~qKRXvGg$s={KRRLFopvB1f-i{C(`&&ci~L*3$;Z9O0%do=V%{X zA^ru&VnfRt9Vk;kcD(o z?B<0_c7&~VH3aQiV=^7-5SG_BH}}Zi!><(9&IvOfH0aaPQ@Z_!NcR)uHy`*Z1=wo# zEG&+gvJ=OwW$YdsSN{Ar7FNX*mwelfVTx|kx~BherGH83sH#B&`z+hgtJmWF&u=Emi9&Rj!iOlzxh1`LIa!B!ryxgjh zxw(z`lnbLU5Po|RR(J}P!j{_BShyX>^l&}67;R75Xqy$ZbG1d6&W8GWzRopgryMu9%o@A zh(9kxu*)wf_lqUW<77&lA3|W+wvo9F5~mh!Nm*)MJB$Q~<;XyCOE@)lB1;Mub8zyJ zgOXgQHBsd{yfwq-7Ggv!_o|3*aPbLxX{%PP5|+@m1Chckf%mryZD*vJN)K=nnXRG^D`Lr8iP=U{F0w; zC4mci(33qDsAkdv!L{-1&6~jdFUov{GOpZTM+_edg(WSDGiVG%hom#&C)eM4>lQuq zb$T@s`pkYy_1)mV2h%HqKl@DVF_^vn$N5JRKxZrH*ug^yMD2Ku6muxlAX*eei1aEk zKO>EoEy>Bv6Uv8<-n_A7K>srM3*KvX3>Z*0>Hsp2DZ}W;8U6D5kiy2a%(TR^3Bz*= zot&zRCRanB+14YUoy0qwT3NrilRp~f%-)rf_W7ktpPv){S^3(T73QhJPnT|dc2Vqs zW|2N<=OVO|?OR~Bv41St58x5#%yv4AoHf5|>0>K=HbMF0a{4%Nk@;P62H4wap6a{C zvx7+_*aG}c!U}P(>Q^2CHE#~yg(e^38 zcSmJ${!rS8{P9$8(2=2}JZVO^;+_x4goWEurU`E>2oE1HnOqxe{%GfXAE~?t>U-1L zK7xnv_zRB2V-8uhfvzJnw$e)#tdT2l`r;5gi9MzCG}@Vgaw|{{Q4cI+*l1+TA@7+_ ztG+Y)GM@V4^ON`-dW4vK**2WJXb{m6-$Q%$9;!K5@j?xV4kU*f&k8@#p5(L{-Yd#= zLAi}6hX4T1BVdtcKuRmpWfw`Q+eP1+0rI)RODOY_ne9on#77<2*2ZI);>J4q_O2Nu zl?^jP6??E^%(g~=Uwbgt4s7m7iJ`b6hC&Vub&C)57X1r`R1_3c47s_TzO`)|N!>0k zBolY;JoVa6QgHLeXXNCK8=#YhcCJG^?O;=zXAYY%%x0p=Z)_+WT3N)7U+vhld*_DP zs`>QY0a@93WwVi%h)qCbg8~i4do7ndf5b-($UehL%dekXXQZ$xIwN+@(uvVIsWavf z^|pP(>GR7=iw2h{jgDz$x33n*(&xnI)e+s?tWPkchQmxE?b zaHo!Ax_2AXu~V@4HDZz32L|d5h#Z2f;x^jyAJoC@3X=!? zCmI}y;r7hpF$>2P&sTxA7q6!*A3TJjy`ZR;bvXC8CbD^D#kAuZEq| zcsx|Y=c>hd!J6i9=!g+HJqC{_)zzUB`;VQobIW#;U)Fhga@VN|g)>8aJjEMnX^Cl5 zt8`&>YguC4*pjMoZrMHj{YH9uM?|#CW8>4ZZdp0PMe@?f8OCG>N#d65AVm-%^#54* zRZHDu1gpDv)Dw00M8B7z-)?-L6N`B{O(c2?-K69OmRV-eySm!1B5lt4^>fmO(Dw%B z4=5}gkgq(~*Sxx4WYkOBwj7Px^!g(f~pE#~m zsq0`$i;2(r&aWV=PoYn)y;fV?znx!&&L<))yi-MK#jxn^y?ngOJv|J;K_Lr{u(9C$ zP%}%<6c@YCjTVa*FO_*n%m#{X0}l=wbg-%2kgl`Wfg=@u)zxAd??3q}BKqi-Z7)Sd z_7g`knQW#h@tElvDIMDXEssf$#x1Rw%;`ph&kf+Sw5J4fW$Qsp#5Iz?hvn?p(1(HGK`-G9ph)0FPr#zhS( zD=DZNRz7<2xYQ|8DU;(Hj+TiJTzbW27dpF?xw=Gk42tTX8lKSEQ#-`XbwpXp0O%;& zI=P?4hEg_U>=A85b6QFya}GcK-*vw6KkLM}ll^>d*|WGZWC`73Bc$WG0p!Y45OP6N zq|rh~aM8PsA4Y+$>=88g?fpV_0_zgir5x3>1~j1DW;y1I^N z)25_Sl^JI`wqgBCQ8E3wO!Ov)#3jg0#@7u5x|q4T5LmWu7(_q6Bc$Cqabn68VW(io z&86Y=?0gghe-fcLw?OWh?*q$bQZf6C`^Sm3Bx)u7H|e&DJ|0-B7P0@Vyho>#9=#v) zav>;p1Y;S5a?&h;`j=dJ+h63QyTWp>Zjl9^U)5L&Yv zC+kKoOwX7@w~&#G(%AonDe*xD7L+F?Om|5rzUOR&IVg?c>$G~y!dj=Tb!Dh zR5iCIsa?D7J@Yz+RaXbZ#r7UMTB)ZK$93*fXb9>_*5v1!Vk_uQVM=*?JKuW9dot$I zX3%%!=hiIl7<-ot7diNV#l;F$g(W40MI|NoNa*%$8`f`AzBi+GT3y|=+8KjhXxMe| z;I0PFlS0s%4q9wg&3PhSvXZ2Y^F~7oBZkKAJ#}iYX-ITLY3Fe@Q^%$Z?x4Ky<8zdL zcvRO0My>vCz23m-C5zX2+nA3N3)cbZ3z;l=k>qV?NL@)$VTpLX;e{6(YG=%-1+REt z#OvHAV(tdwrF@+vZr(<3K7r5V^hMbQK<6>9Kprir-@&pHBxh@Cm<3q3ZccgyNi1Lr zQ22$uC06FPGyuHKIgpD5$Y}xZhj2&Q)0-r(#?UPby25`QNw+ZhCL_%&E%I#uzmBS0d2SBL zX(5K%k3Oz_yiw(9ekiz@SE4z%N8Ag6mL=jy4~?d$LSY`pVOs!86y|$qgd!`fr0Ib; zRhaCdQFXP#AWh;?VG3Ya?y#~7K~aZ%tR6gG0Bsz?`@^%Cim^BkXIY#02~3PV+@%l! z%Sy0#?&4Lem&{&#>i$oC_7A9R=)Q4Dr{~69`1ijrjNKG@YT4x*H^@#rO<-sw%67gd zBRcJV$!=D8DSa2A?Z4@}1B=(PzQ}79H#O!88?Wt%y~ZgkWSL>kzO<&2gCEK`x|)n{ z98bp5HDn^)fC$Jsp=vL^xOz2-+e=2RUQIW1It|E`>Yxr_YjwiJ&QEAo7}zs}wq+EB z*(F6cii-DrbhW8V2;Sjo&3wjPa;XOpCtU!SD4hwgcD-X6KvLT*?P))P@MiWMIoGpq9E~-qL@`v z%`}BT`U}0qIjVN>U9elrZl%Uax>19pnMRlxDOe?~H#KVP*y!Nn={yZV!m!ZDQj(V* zCl0X-_Ajp}-xqH(Ma5K_CSeC%sf?R>mV6p3+;a@E8zUDd3JGNcvkn)0ob2w15Am4Y<_UCdS8<&}m}-xCDA% zV>fle_-WI|r?7SH|C61+l3#XoSKO2?kyFyfO&&dXXjMT;`Jl*g-MUYSS-2%neBeAF zrEG+&+Yqg1=Y;Uo{!u|4qg-6eT$~HD<9eaaL72NU&}XjeAP0Ud`U*A56dl}XamIqw z=-+>@K6`e|B(+!&k(8Kg{u<`D)5sxAwg{<&{+)oi&+G;F!1d6;2JCHNg$KVRfd%hA z-ts=_vSC9~VpYTXq;`J7_EPd*uKDLuM{d##nT||Gxxe8IzdIO|qT-D5OMuUEIP{|T ze(q}&RJU?A*4C3)@yls7a5ZM^Y2|CoeucHUgdBdle&%_ZL!Ygm8+VX?TtN$@JNUK= zd=vSp6m(f5b)1EmObCSFTZpZ$K0!Ks`|Ta`n|FTu?SxvKH<{ikeK9xp#nKO1JBEP9 zMDPw#QfX$hpoAKeUYt0$Y7&Z)q@)^Qd(C)~o=YcYX0kH9QDzCsNO2x!?oc0=(!Jpv z-7%lPb4TS0*C;oaT$RSBC-9d6Um9OT!K}?=&Xt$A>@F*H_bzj;#Q(~T%gsgm*dEi1 z$V1Ee=)qUt=%t9W(#X?{ZCNh^JK-F~ZZ5E478X}m4?A~gdiCU5C%wsQauyMDy7@Sw z&yAgCP7$VhzT28ty)Zv1amo5&Q_mm_u{JZauzI4{ zp1FrMW!MQZUdC3+xM~Cgd3okURVVrR`d3W`9dUL>&q~>Sa-23+NS5idI3CQRjT{+h*SLeR#;_&f^rF@=e+Iu4H5NOtu9@D`VOcZ(PpWQZ{ht{H7=+s5KG z29Fx$mD*nN8k0Nkre6=RH0;^_V+iEc;-~&EJ1&Xu|6e=axRP)~E{_TN%WaP|e-SCO zI8;`bSn$ay(Ceau3j^{KOUedz?wr|QSX(=`Fn*v=KO`}6(OkNaOe-oHQ)(SE&}6e3 zXQ0?w?iL;|<0(#)OAZzky>QykKe=c74ub{-bPP)s0>irVlRNKcZ^LlW6su zU7)=J0SRRLCK|N?8z<~!8QUe%!}w@%Xo$-=xlTg+_U)UqVSP^DzTXvww^xzjs`lZ7 z=q`JGcwtevUge)((6B2XU%MI##FV(9L*r8D<*ZIADV=zIKc5fQ!( zG5!$|{;C6|r7K;#vNm*eT~u1S(76X|Ne|~T8tD>}I;}P(gmxyMId@2@otBDN5qM@< zn{>e+JeVuhg_JrLW<;{xE$;ssLsP`&{Uj*^v}BjX-00DXgF1E!2q8WWcd4&P`F&)NKWcHkwo|LFGSHgb#L0}J+qjIJ9uAvIbU zIk{6nwYAGBj)@6bGwR8gbc@m0w>%+Q+)_%~VqX^DrRIvHcD{?|sRYb}cy^r#JP8z* zi!Y-d7MFxZ=TFM=Xn>LFckaVr5fzI!X9J0MkGu&dCk#p>+Ks(3j?>$(bjw!0Qd(!6 zo?SF(|*T9nTCCO3B3!Ki_X*jkvu^B zYV1+l1l$0D+wDczAuTU&gE5Mo;6_H)b;1zwM;vD=6^yjc_|Rpm$*0cF<2oTC;iuR8 zfm|NQ?_M@KFTg~2zf5>PW+!Mf$}xx`OY77Y(HvfrFsyrS>Zo%scb?TfuD(ZYeNEMP z;>xNK4+QFJb7n5~@*L;eEzWnmaC%BUrf_&jeRM*`?g%`0M zpk}(9t=$w00XHb?tneN(d_UGglQg+*q0aCMfgd8n&tng?kmX1hR>v@Sh6SGvWpC{Q zez+w*;1a$BZ^qvyMlv_=`N8H2oCu8Lw(gL;k)WA%s1^}mhJL)0VO zLKRbsvE3mYt74zR-9jIiqAz(;Up{6~77b%?mRH0>>I;WsMJwT>&3Fls^`#{~;1a&n zmuCEJGXCjS_}gTBsV^4%S!gSxZxoKvhYAJW*g%U|djOZ{AG^n(7W}2uSEhfW6@6bB z{{-iu1^*r3_vP(B;lcWgm9SxxAmBHj!8f|2)w+tVF@yXRhp&nl@ zYaL}cj~S@`L>()5zq4dG8|Pj&bi!mfqwi}2&$i%WJbT&5tQ8+{UoIEYI9u^K{W!>= z3ub01MhGS3_WNoI-HeLS3JvK6I7$HSiScCg**K$Z=&^*K063%1;0XEyF5xdlz96YR zCoR|#eZZymNN`|t_y-tgHE;hZjt>Wg!;b^rgSTIT_mSa@KOe|*NP#(|W_SJ3&U=6# zm*7ny9Nw41mx2!;*zgC~5${Um0JT zXBPZ{;M?>T{KP5)?H>pD1W6b1_UFp&k?@;!DzI(v-O%6FTpL*N!H4NK{I}u*K7r3; zi9Z(n<)}B)M$V&U`dt3iGJT9XUpk?k%Rwj8hQ1Xaa92g2cLH}zslbMZZnnq?~9-26R-#|PrpN$7A2k3wn_|4-1Y#aRM@vz`ybd*;l{&GDW zC*hOPfX}z#Z-Go_HTZZ%;%`fQz~|fWw*|f=#|&R}PNtv2@SF9W>P;*CZ8Cj{@0RwY z&}}k(32vdk9QriNMn2+YI@bYLTiOr)Ku$Ryn0#cZ9$4q06(4Z5P5WEmTj{e*nrw6+ zqZqsEtc;}&j2y~XKZ^wac3aD-*&Q!lWPHTIc@wdtN z5KrXLtE54P2mZsh0nad8V+}2a7%xg{j>2eNmrRZwBZi*)LX$O+9QaR&)1~O+D|Re#!qo?7`+W z{Bw?92e{<_ABJykXnrc&Uxufj7Y6%pb*>T}j^1epvrz zeA{tQJ2vA>?NPAyILY{G^y`4^@2({^9%@p_@dE)rF8OVn!Dlk`34Hgar{i~j3O?uO zQ}8)ITjHZ%2XHtVdU7qR7p;-n1Nd>Nzb)|B11{MQiEqvJfcb6Aen@bOKDS4|-k1A3 zmG^fNr*8!O5c+FWOl=y*B#TVu@Me7Xrl;d~e+s_T-zV`CAkWiV;-mfVtJ?s6xM?b{ zS8fmBhgeQ=z-`+j%^O>L(S^5D(r?^eTw?m)GT-@pv9U+MZpMdx27SdNF3~8#<`?Au zh%Eooy2zG(v;14=XClARMwS;yfX#AKt8d8kTfsH1Plu~-KLh^TGvGfy1OCt!uDN1u z&z)z$f0yCBzr6k5F%6`?L9t@8@Sz#5aitR(9JxZkpJurFwi%=L6!>ovys2#~{2$Gz z8M#)}t>6!3_<7EM)_$oycck_-F@O6A@0SGsU22bl-;-eN5utZ%_}>a{<$o)^Ria>w;MMy{3qbQNpPxZh5utC z_yK%ywMD%TCAi{k*nMBlA5{zfw1Qjt(+Y0oPiwe^KMd|~L*K%m)^Lk_ayo1rMX5a& z`D_iB<+F+TIlVYPfywy^PXYXF1qVMl+?>`5|8^rHLf}tp_-`_NPb>T%8)tHSCU3U& zK9t}Tb^viDCZAG!?wETp{3qbQOK^g9k9e8$2P4-kpRM6m{{I*F4{Y!)`k^&k=07o_ zJre&V`ZE8CwiR6FKM7#%;ry5IW&S?_xA33It(x=y?i2EC1GmaESp!1;-t>1O`7hFkeB`GHKINca~1 zw}xBfzct(<|E=K`{qO>3DC=j| z9@}~!N^pey-zsk{@xf0nhxBAC_>b~@gcs4G-iIF14 zV*FQhSKtf&i3P3};Jx8*$sPkw@&l}R7PwlF)??hxFuz{1KUO>oTrD&*dIa2s-e!1Q zPg?L~y*&c)Dl@NFn&%9U>kA8>tY3g9!UID4Bzb3e+7|t=z}2EJ$CJjL;qmdc(zC$T zc;ArsA9k1fooZMBwC3`5nJ-p&`)9yAJOkeG>2O9FdLhihcME+P-pLlu##J5uBpnXN z4uDNNLqLbmPjw`Nt3Q+JG{X_$Zidq_R(#CYr@~`w;Z1F=_@E4YlSIEs-3rcL2n9cz z&NDb~XIu+9tF7>OTX?fyrG`YhX@tx4eLgOd9Kn95p=q89&v*tr^9eY!>qdz(deGBK zza_kv74FO1-}?zV5*&U|b9ltu(I#0uA zl);DDt?A3~Iks@#{<%-m;qZC3@TL#Yey(TL^ErKRgUjJ?D|~@1+`P;RU-%68B3n2; zX~mcLyjY@7cejEsk>UR^IBzHRMViN*9<{=;QfY?E`j_wRGC0%DTn@QjZr-10hJ(&V zrcc$&IerU$rJQZi@2&J0@R@#R<6_Zoe7()q;oKgmKeyD&=>x9*xCMR)?9CBrf11O; zlkp{Z6x&a>g*Smu&`YddV8Wje<#lEo8Lk#?@P2YV#p4PL&pLm|ugbTCTbQ>z642Cy zgnt8tM@@TW$wJmV>2utnL^cgPT*{7?3b%e+wdyz3+q7xej$^Pr0V+T7IAU#lH;ezB zDIV7>=do(EiS?P}!=_klR;YS4Yimm##9~F<#n#{sei9X}$*S7d{ zC3w-7(}8!)cqFg&17x^b_=53>mf-JR91mU!$AeA;{68{WEpXefScRix)5oELOv4;H`?c__~LEmdHwJT!t}t0LmQaa*T13d9@YrNN&%q^2)3_ zrxVZM&GKr6bNjFP96SLgs1sX!z}3RHygd30KY{U%<5}cUUQc1nWH>m&@Dd6ePw9K+{41cdYOAfwa7c+KEy;Y&`}$}5fQ6TH$|c!ke`pT;ZZy*Beo_EnmB z1&@W-!F?4QUbTR8UUA>X!Yhdm=N0AUrM*|Swqo@)$I4p4t-iG68!_H;x)$EbbQy0Y zxP`Z^=lbt*yIaq78P4TXn(Khr$R{FQTnDHH$UR$|;qMymLqFhna_olaRGH#h)^F?~ z@$#6LlObzqfS=+0hVI4RI^})gPc~M}n}ZBUwu|Y)&5RE%Z5P`!l6=3Ga3%xH_p`<4 zYZJyFNGtehnYR*sz%^VZEp+I9z6NBvjjug1Z=pBPzY{WCEqulPru)&~#a!n8lKLg% zL9=qWTKIL|!P zq&}C%h7TJ=ut^a@Eq1}FX z+2<9tA7bo-6^Q4!X%vH-99gp<6AJ35ywX$#S?b0=!A}M9dXvlIdtx~9;;0lp>5hs$ zB5oZh6@EAhajo&%C8>`%cdW(p$rl?hY^@aEyG-hlfE8b@%8GjwtSs?UpzJ+sS)>m! zXocv;cedbFoR8^To?Z)O*V9|VLugIpRX>iRNJe?`S*6LJjqhw7N+K^yrETlQd0eeQ zj1w+aZh1#049|C@QKoH7*V^M@Zp8^Fdk47#ei{(J$9Uj&?PJD5PMtFX z&)k9?qJpu5#<4mqt(I5=+Vqy#$oYa-zh32}!JBmF|3~sN*DlMvYuR?0dwR}8av3}n z-mBbtp+%EEhWzht>a2`ZUB?{~W4foE@}h&FSfc*WNz7A`{`PsuT<&(Q%RTfGeZBn$ zeg!Xi`U>0tV0X{lUdAKY>t06Ui}9-Kv~fGHT^yX0 z3gJViC7!N|Ja=bQpvrU9h@Pkdgd5opUd@FVK<>x5-H(Yv#voo1tBf6+#sO`;GE%OQ z)ynH9Vd2~tSi@UN8tu4E(S_R zZb{maSu)N9tz2c$m$BG%{DbrJMwb!);P_rC>LiD?Fe}V73)ldnjj< zX#B?VR2kCU?Uah$4r)Q^r?T_2$4o&@jZ9La6_KoCF;QA}HAnu=ZEO@xjg53fV@_%}N9EA& z8H1V(AwxKzmZ2RyU=HdzWJphj!ATuFV8c&G+|6pE=z(!7Ra7Yy z?lygiXSp1BA}PFYqJv!Eat|`eLp&`1m&61qwD@6t%l|_YY?z>W#_yJHO&_w1^>ZEL z!{gn{-p_Ebw|B@KJ}kr0j{kr8@?pa>9qjEKGx+}j8#;XH@P5gOd3lM+{YY*9o6R84gXgI7vx&dW(WO)2hwjYG1@KY#>;f$pP(D6fwv8+@tnFw6VIrFZn0ve z7^yVioO|1JCqdb$ID%)>6;o9jO!OE?w%Z@~lA?&0J@F!OVk90+52s;D!#Vl~{o@?j zjko}4>;;YK78)v%(NK}8nAuGCS!i$yxKy&2T&H26a#d-d<$1LH9MW||}jzI!k?3o=pqc-Fih}Fy0zg8iIn6B95Fv zZtnaeFVVvX56~B1K0;4aRnaDCo5pRjEL~f-A;1S*n1w_7h%q|B7Y1!2^`N9snnPp@* z0-G<4#S7j(x}Xr9k58M-;6Y)XI)x1?WIqcx_QBW2O?$ZY zcC-LrM~@X06pbHuabG0Ymc{lP80J0=dl+=*LC`Z#-{7pCp5u3koGk@-lr>!JGAd}qR$Gt=Sj z4Q2dd26Cl13-w_PAsc!x`JN=_N@#QX!BC!akc=Ro(H(8$+pWpZFD%-UH6toEEvZY@ z#Ojfz$f!=LZwFtpx6A1>e?gx<9v+k1y1G=B6b*B5^o0M1`>iX*T^JWXemC24Q%%;` z(jZ8QNOaz!bagl(o?V_RGZscoOHB!kiR-brcUGT1OLuL0^>9Q)#H+cbrMUw-;!Ab8 z%G0}l|DB!N`DbMmS*XNQO9mPNH3xA85qFAT^<1H*F%gn^wa+80LFrlk0d?y;m- z@9aKHcV}l8mmI<8O4r!fveMYtnCKyuG12sS#`WBtiCwa?moCoAsv33c>Vye)_Nbh+ z6TU=Vv`$>#K%}5@AdC7qVJGpScSj@JyN{~VKZF0lf2{4m7q5vYl_qY(fR6H8%_Eei z!K`2H#3A@>A3lSh#UzyZlM)8Q633lfA!>^kR& za(tvt4I(MP@k$C~DmzDVkWtfgJ@vB@K1J4mkJ|8}~tZeY``~d^h!UFTGdh>#L zboLyIGF>4@Yg7Taj~$qzl*T)KrLfIv}Y>pMyPLU>_6xIN*Z!?S}iYLit!1^`A6z>4f9x!<5a$b?on??zb z#1VjDf4~Oz4~M}AkYO2U%L-v0@`^y)%dlv`8aNDdUxp4c82kqD2(LHE3gh%x&J@i6 zE39XeySR+wrCDJmC_7bH4|<45$#sCc;sP-Q^`=WO*h+_{pOu$XKk}UVY=#SNHu+O{ z+SLSU6(-Fd;aKNIS#Nyx)f;^lCMV77y=KdnHNEF030hiC*3t>&i1`O{Bmr;j2^~pV zLc*TjJ%6Q%zxM1c=;qTG=hF)8Utl)YHSJdpRVQJ!6T#mB^VTJppbfo3jqI|blu6g9 zF(CN||ABzBAs($8Du|=h&c? zojqK4?_T#nyXx|S+(}siNlc;NM0HmEVy7Lo&%53AE*&0kE+2fgS1%!Lkca=`J04z_ z$w)H#3j5Z`o;Ddf3a*wX^~QO$j$X6mZ@kDzLeeJ-?-y; zv2}2mW5!Z<{45rmCknadm;UkvJWLEj@u8LTMbxx&YyKL-54%1d4v z+g*sW&E(?8jk?}TNE5;v1MZzW_uhM--A&otug{W{4b@~Zl4-3b_vjmk4v}uFSFavS zRKExKo$SzI+qGW!lhre>she^F?*DhdA8hf>9#ym`wK&91U=Ue4C^TEra9|J$giE1q{in8xvj;Up%_MD$;y;-Qq>- z=%x2ZPck1=U7wVi1c{`8z`yXxJK0iObx89}WmZjTI z8Vuz5PlXD`Ua5b$>jw)9;o|*68YZGMAWx1>qE2MUU+QC#R*Rr4A_WIh~FI)9r1=v6#Aqy zB@lxz(d$e^pJ3AA8?S8|*f$ck@_%tA_Oy=Cc%Jsp$&=gkS7)5W*tb7z+TNjWCF3Xj%3fr z*EY^xMIUZd&ZI-|d;MzSzFPIENI#=r(Y0jYgR75@la3^qOrVDzTvfr&VqH~-I~7;d zo*to!t86tdjGe*QLKGpWHv~Gvq?nlA#aZ!Fv}>r(Pu>Bq1RigG&^6 zY$(il$d}N7wh;(Y@D(g74{nIvtI!VToYzC~>s-Djt#2x9@m4 zrN<|i#(IWFxQ6P+U%b*i^>WAdB#^Wl@8lWo>Jh1R91DJQgsiY};5wKk9%RZAO9QTh zUp*pp`PzJjETHwmjDdqs-vN>9~HHGsv5_E7UjptBeK~I?3 z1f9wY-=L&1hQw)%co8;CIfaJ*m`g9-$)z7&{3M6?UC9wwlAVVR(cgAW_X531NK+9Vy5JyxN zc<9^qGa0*j2DND$78T*A_i>vS(N=Azc5>Hi1DzZl>|HfZj*TyARD*roJ)9lwOI_j& zX{BSHkLlFO)y1HV(FeDWX&>08ZLE8cot?d7hv?My?K2WXiK5)u(W{fMf4ijq{yJA@ zH+R2Gy4I_Wr=7;x$z4a2ItZU^9+fvP*;Kf0+OUxcX@R;J^7rVr35Jxo_VK}izVR_h z`H`MZj<2Sc1nKg-cB?2` zD6VVVHZ$Ef(Ywu}@p*H`3>{WBr2F>A4M8q0u0F0V7z;rWfw{8^W6?nohdFBmFL~k* zmS~3m4z5Zo!8mE{#mB`E6k@XuJH34Ugqi7uK~V`m+R1A3ehr@f$y|rl4?yN5B3n$lCWqvXC*udzt zw5UP*(KNiMi+CQlk!_KoGMHINtv-+i8oZf;!_aai&O8HrCwS>Y4O%_2pC`l{^kbIT1&rI9=`{f#qz4;+_3I3{1PMT7eS!6yaPM$KQ zdMKU->t6j+=R`~ZK@rzfqFk!3Mcv^LTLXKUhPitzS3Ts2`GlcHmJNrcGe&|eCXVbU z^S6X6E52QN@Zi#KSB$EdSUz}6<(R%{y^?B4(9qhdniUKCO_cAn ztX`@N2+q7QII5HKahl-nVI*t!n`aN`7@|6^JPr$+GP1wJQz`AZvd z@D|W*1A7h$TU78Cw2T`jjXn~Q%}nCG?~{FaZ?o%>g?rC!rKWA?_bxor{a6Z_pZdeO z3Nf!vurvQ%ce&2|H~U4ftGj&pa-DRU489y>;|gR0(N4l=3?_^Gz5yavd=OljYO&;5 z=ZR(6<9BEQV++!@r#aXs>|b4ex^&bV1HUECUfX{zzho4W8xM3kw595!DPyjUYNUUA z?D)dozSk0D_CKbvj~zN`VVBMy8I8ZapPf=y5@}zTR9UyQNADZq;on{Fn_lPW&@U28 zMK(V35cuqec%Jm83mXoDJBA+tL<|K~6dSKNK41xKz?cHSKc)ke{Yvr+h7T{uFDWW5 zDj9Zq%C&3Lj}I>^Dy7RvN%yI)E-r1xc31AbJ}Nx?@o(YbqptP}4ie}C;-#zkj3l{} zZWpU{cZBbSAj9K5;y=1>HHUVMcy(-dw8^3~dDd494F89==p&U=9T|ZQN z=<#1lL=~9*!X5z28^U9;8YFeX69TNIOvW&z%vs?X>k{+{EbUVmNl;Eopa%x(h#}zz zb$0H$z6tRIE`D)5r*7!^uh;hM>|nl|K)!T~&0h0+g6eu*?(Din1IxWU6A}*4Dl&an z+5VjL5p{jy`htsCW1;TtsJkuxz@ovT*F)feT68^mZqzia&GOLvd|g50KupzxRMnQ#*ijQNlVHclf@M-A%WZ^IBg^Mq8e*OLa{qzsww15A8A=-R- z194an`YW&oiiVu>Y*`^(!81{`T?Pf=p?GO#>I5=)=CB?4_U|u1+RRfVgLuzclTuQD zcfu$;$EAy$9Ofsacbc#2Lk=QG(`2$S)_-2d|` zuni)A?b+RaDN9w0sUX=M?+`o-!5#|XyE1MOgzxmR^u**sa;71B;J|D{W^#D{i24m1 z=XcB{A1*c@S}eSs(z|y`m#nN450@-?xLCFMc&z{S4eNIV#J(Kl*LdaHKfc-jTojc% z*R6fNfdn?}`1|^`zyH2=owZG5H;Ed*bOhN# zhSP0yB;Bf-^yqh$Gy5K9ULw>!3KPCGW0_AB`JmSe^Nh&|^h>iU5ZUetx7r9~D@}_} zEyiL{GVdmyhV9eNu34?1(uyjbmN-aDjn?YzKp8`^%L z4THmM4Xc7L#n^8eBU@dE=v3sr&F?JV>V-Nyf_c#p}{l*Ga5$G1E4Z<^qZX$#k^t5a*&x@}cMI_(H zxwv?7IH{yNUyg|}-Dba-1OIzz&{qYa(ofOJ{BNX;!t-6!eglbC?tR=}te=1MRBGqP zrOIQC^VqMb26ZbGv!ILnBKK2A__+X*AQyp!1DT(hDj=z{V3ge;7d$!>0SI%b__SjC ziSlzG%w!5xqfczg$;s|>V$|pp&t>=7bYjfxo5jVYB`0sz&$@ZCq_nvBX6X97!oocE zve&we8`rI`QT~**>D1_|*Rru=@EppW+LSf2xVYpiUH}DW)qhn|Tue{VpL=)j)_cID zaT6xe&se(=%TsRUJY!j)!AG=+$s^tvvuzZZ$HmGRy8F!vtVysJVXhFS{QBpg4<6Dv zVsvs?QDH|(K+U5Cq_-OO<<;vq%}Z3p<}KbG20p)YAlw61pF90qc^10BP2r;mWVeJv zv<4$QLaq$h4x)g7ea`Rib+dChJJ$(P=_dJbM3eL&A3#aJN8IALB{cCQTol?1d~ zw5Xj>=kL2{k*_cP`d5*VePjrdjP9c)bSEBPUga1Qqr4Fl^LVr}-!J5(dHabFW!&Rq ze!(Y&p(lgk^I{??Uk4xTVYNdMTVfi6D|6_0lZeNvw0db-iYdxx0p2!~n8XwAp?ypx zizmA#Cyxm2I&k_6--TDiy-1huPMbQyogNmte(~9`4(5l%(@U%Mnwt>PCp*|2bA-&^ z92Fh;0sT?v*JeRI)W3D<`AKC5VV}fG9cLj)E$9%=CO_k&05!5+IRfp~K;o*><6Z3? z>|Goj?A`6`?cD6`?Ygc~cV z@B01E?z`*wP7XVJfa4Vx@Ml!^fI^L%>I01%viIo{+Y|P~PL|Vl1^%uIK%~%mDw{TgL<~W|@v1Vwi6i&Wl&MH=R zhl=>%@n-0xGI^2@d-VG-{EGD@(-G_(n3|mf!{1BsH_H`d$tlFfke$I*D;9GeIX3-- zbxb()B7`pi<~k70hY5BjFc{O%BN%VTd9atF<2+6Jm^kK+@ZF}Ll;y%@D z@Zi~Z4ZBIu*5^pjo<@_KoA8}mVou$hxpg@Sw{uMS`CTe%dltV!x*mIpWE?$8|Mil# zw^mCg=9=>Q$0F3s^gUMF;+xRVOeZQNL5+r<4_q%3;IA=NhZT=LDahd7pjhLuIiVXKtOby@lQ5Iy}6-9cK!&6(2MX z1W$bFf1dhz4nD8opZ}m7j`BuD4J#qjL3E$dv3|bdiO;KTK4jg4Wcm*D2j2cxL1PP&w6J4Px)Na+gkp62tI3npJ$Y3pR@M0{M^z$U;5PY z|0nvIY)k#*Z=3OX3g0!E4AVL;e3USix+#8Ct`=vpyoTC1qSL^h=``Jlp}0Yu*tn*l zSg^}uf9!22W-^DpEy&ynWe&r)Cs_9|$B_u@ND#*%!O9%^b#X)E8gXJnF=3{%WgYg! zh~=TBe0D=psi0^FK72Ky(v6CF)Svilh0@sY_5+U2~cZUAzO6vXjUkXN^u*2P=RgBZF(fWNdL=-jSG&7h)WEM_m6OKFtusd z4lQ)ot48~D3W^C!j1M>I!`z*{(3b#xn?R2d!uPY2>9FtSgthVU@iQiO3QWeiE3J2! zNB7S0?c3>ez8w;xjNX1uuC5+l(^`)UpX)}0JX=f&I$;#sHfSh*w8=8Qn;sQocmZi1 z-j?%(jW2`*AwfPzyzrhWJWX$@gfvGUVaf`j5>-C;8bGyy-J5JBC&mPwNfr_V6TCQ~ z>d8_9WCpFV2nlF2I##{J+5=%ju#(T+IMBo^r~& z@QA=%nPz8EzEcD5#u2%EEL--T(UMIb}wUJ%X+oeMq>t< z?zF^a?6(vl8RKgokEhM0?e=$vfY^PVDI6s^J(MjrSoueblBT5tbJT;m&CZ3h|soP ztS#J>NWARIY%1CT?~qt|$->(B$KtE(A6AP@KS(iX)-p0q$guWleLz%lNGDG(Z|{!b z(b1`GbZy-{&_V}yt*))j2za#(jfja$>=GN-KFrH&uY;qThtA8ljgQXV!yW-1=Fc-d z%y<&a*N!cjfLKhkeBo6psbxIRI2wkR7g{k<9NU6BoA=U>E&L(KLfj!dDmux%t+$7( zll_DiTvZxcu`f(>KCshq>>u_p+4(s9Bg2!Tqry9QdyyCmx9P`wH{0;LvL(CyC)hi=dU&^08nDI+ zYo8F?nHxXmFf?4hZaV@UTMfXhw%)$3kSuhfSuYgg4-;#XKk`*e43`4#yrC9g8nNiX zP)SN;>0v#P<%Yp!s76-dB*0D&tE6$$!f{tRdh6Qy!bhC(ca0aqu$`= z?(XFuY;?leJxBYF_D)LCsuqY!6OD{jdA^y*X#*>8`G-uCA`GuCCUW zRkEFCQx)n=7h-rIn+HH&xLQc`CCEb#x(?@Mq6eR77C+11uXJsocd(;T4fVRA-owgh zJr36k&q)43rE9$#PxhMjmqvIFVMXe_%C}NK-ZTW_jDf1lJ>2%jRL%x479Z6)tAC$i zBXS2iv!kO}xxdrOqRP`F@`v`#$%<;(GA1LtU+-bgq~yeS^g9a< zX&s-^rcby@2D6yBv;{$?&5)t1ibP}Vg(k-tBh|1s5$UtqY^#C?g~TUxygkd=COIy_ z;V5TO(b>*{xg&=4>7Ug(DxUFlqp^zcK5bIsTZiCccSm@9VsesmSnqz>88IzeMrGyn z9hy%(<>VhypHQ32HNC~*UO6b3O}$nRtJPVa1qAO_fH)4R>n)gfJ~8&;nX#C|aw15- zl{E-jMJ~R+l}n-1`gB}bsaPv3Nu6nFG}kLH&{NoaWUKLV*ApyGo2J`s_>lS?I!rB7 zuF3r&Qd@Ed7V4;x5)Q`)7D*|0<@WB{H!<>`rcLgRCrxyQO@0$riO%06f_0X_Vmd@MOTj#x^I&F= z4k;I~ z9yM}6pTvZOcD?$R6iu5tYE(Ztj(V~$yBnSb(!H?vj0B&L4agMTF4q64X#n zbr3Dk(MM#U8*6PIW~|RqP8#H7j4zX`b8}@*awhFAeh}+;DrYR>4-gnE;2U0WFWxb4 zd2pk90H9XX&1L~C*rTJ5I2;09$8<8aRSTH?N#vA*ZssFvw5AC1}W6KOGB|sdzq{q8~ zI2OqDUg_HaOt;s;*We>eQzgaif1sL%&qLy*cZJDgYLxg)_7{yw15bl9;9`P%bb90I z`a~yC2gVjkBLm!d-8~`=Uh6Pvt&`|>+UQb|&iqceffzmLU$XMpE$I1I{x<PANbT8vS~iP1zK>sTz7u!A~%vT>M9 zM+*zZHnz!&K4VEq^m%M$T0?_XQrqcb&RP`~Vi132qOL>{&V_C~r5w3^0aV|RW+~i` zL>@+ErCTDukPRh$phTHWaebxCyQzIcils)2aVq<6ssIGsEF<*2*5PPBL6JJn5aw`x zkWp#rhsZB1JlmKS*Mn5w!(%I?$ihfkoJnx-NkKNf0q|*}!?qMwn%IjVlPQuV_}u76 zH**NKn>RY_M0-%U)8SsT>x*xGaA;xS&>?O-O^$&(g|gKip0?P}M*Be2^4Rsa)C^@j z&YHmI7b-oT&v-wx>foAjcc{EjPr?Y9?HmVPePHsb*vhgZi z=|#m;=NQHL9R3x3kVfqz z%XwP1_ONWsJaS7uXz78bVNc>46UtuG2RDDu zb#AfpsB7wCC6;wFhIQd$eBV%?Mij{&{YTF$!CJBsyVx~Vd33Ss9Dh%aW7bX9)H~X% zK5PI+_d?=3HPoI+-|iLSitO#%wr$IaDZ$_EqsGxB2xZ7u^?C+hy((wWzZq_8-9r<> zG}aXG&Cz$d(S)*3Hx-L3#*HG_B{4Y!JKM`op+l|I+mLxIjK8(ev<%A9ZUNn`revb30Vm`eo3dAmDuuwcO5j$Fnyk_#24^V+<2LAOb3_4 z9vfnLAT!b;Dkw5R|*s;ggCWSUVDp* zUi~1Ex&=291i{lbe_4vbg^FaqC=x#(`1X&r8x21+;ehBXEU zJzlGd8|zX`23FLD)j+;Znwj+l2~};h0wEpQ%yI}e^B!Z4w}<0AR*VDZW8o}k-Hskr znz*hE78}??g}JWtUydCceOll;7`E_)s6yM^@*i~0IdzdypF$H-p>Yr<6Nj+dlG9_} zV2e(Qs^jcVrNDJXX>wHj?7EKK|Ao4KKBT_lZkytnLb3gVmeUy`FJCwl;h7+vl1RY?$v0WMB4^2aHI!tLl=5)zXvGF)7I*E9+)-c^AiBCJnb5RCbZ*!1m9o!r6faA75eA2 z6ZCK?Cro3@<(wG_pJP8e73%(qN&>S7}3^C@o_BPM*!n+BgR1gsZ+XPGo%8B*_ z2^- ziD(I41ZQHX93^O)R!gCb7!7=nQ$2Qpg75hD6WXp5qcLd2Pbc_=6A)d9FhD|naiT)q zsP=|lq*>1GpCFJJzimBxiOP7F+Rw{Laj>6DLA{$`B^o=nX31J4)#Ci-Zr9k`S z=uzJG=+VJaWbY&$K{93TS4JVy7V#v^bZ6)xt*N@>+`T=O06(nU&$A+I6M=`gZ}v?` zTH&H4`JIAi&UB;GF*?$wUUKX4NBx45`{bqs`?1#IGyi~g{d3cU*caVX3kIk3 ztn8Uq*uD+z-O-GquZ%*1I&}&PsdNM-B?p4<=2}hCYpjZ4w>ivJ8)Fs5@~HTzxiF1) zF9eH~wxmzp+w#!c*Rhbdj+f(8U#fxmG@sbR=||VZO7IQKy%YE{0kLjah#AYb6DP17 z)A9D26KGx8Xomqyp-?5NQat6JI7d}tA@qfu;`JSr`g%E^yZeJ+05eRu?%56o@l%M+xWqv$)@! z_l0vGce!x4p}33PU*8UVm3Mj}#t{7!97wnGhQ~=gAkU}5$0$Tk!O!3p!6##S;&Mthm;b^xy*2T{e$Ge5J6gGT=TT?B2PeKsIPFKweGBVA#4bYn zSh2BV9>fSYPh6yDr0N#}bGwZh=kn30)I;2VQ_1Xc6Zb7F$w+7#-RDrBId@KD{-x>7 zy6wJKyxu;kZ}-%`>FvWt?zk^IzU3X0Uq1XudB1jjhm@?zf2Ms^t1EXtGk=w+dweMy zIw>QoL)XbeNB-?uoH`&`+6R5#61>9RfRij7<98o_Q5#6V%1qbRYId=j{a6hiDVBZL zcd0FH>F~-?mJ!Tx2x_Nu0S;89UuS9n!PSZGDR!&5PG>5I?fq^&*9d7LP?H zt^ZgwtY@38AJ?}VGsXZtZd|npWj|^&MF_hHycA16%LH}3x*PtFWDE8oAm^qJ_clh` zVsK2LZ{(h4S6plw7H*?`GdiV(*NDIjr)Uz7V_I!JaZ!iniHV7W2OmB=wtMEHi3>Zl zFyHpb{%v=kyzHE;$e`xDO?;c@v`^z&_u1XMH+>YS?wYtLv-{Y2v&W7doL|tUc?ZDqeb(` zrB@~W^V`Pyz+JOu%Gj0Ls^4Hk*aK|H8`T2_-8*(lH7H+keXv?!n+}gw0^KZ$Xnq1| zbR$~GfjbbcG@Nt^MS!ExmOT!g7|sWVhEp5K?X!3HD$DDMCaW`cCoZdf5Qj$}2wqgu ze?W&=AJ#Fg-X}Ib`&qTx|J6=sC)PYIF?c>@d9{eE=4%EFSP4v~jGaX`3bU-VJf#j+ zM?;ExT55fgYJF2{o1{K(RWCh{N&R`dda0JxS_9A3@|5Q-_#hk~1lL;dfg`0hB<1-4 zd=`k`AoUVU?!-c+nLreEWPu2rr&nN>n(w+4)@9=Tl2_lZUj41))%_E@gz-OGDw#*GR!`^}#@idr6T)B~qr9ui->fPm%|ga?JwIzz>!mHp zEahULnuQ!Gc1x>QELIlK-H$02AN5{tyVv3)Q|;jp=o=}>a9q3m~W$UthGLk*;qX~>BK0V4Aq{}>y{|K%#=3EF4M z4lRy15g)HBQMM}uV>i0=SV~I~@1T|;@9(X0Q_`GWq{cLS!T(lG^N`##Q@5b3jHFCQ zfIiqwv|w&m%No8=W3vwqcVpm?!bynOw-WeU#MfXEw*3uTMpH=m-;V7n$T~)ZH5^=r9uF zlu5Uuam79a6F+Zn6#gB8o}AKAEi!w)v!aeLfknx_v#L zgEt2(^=i0s8T|$e!pNr}5BD$}ey2ngm~ZGTOE^Y24ujx;c`C2YEa}|0xG*<&2HR0^ zZ+_4FhTXGg=Y3<=W_Em}ICEOZ%#v(=*XoJ)&zQYpkjKG+H!C zRAd&c7}WOaF3g^mR8+$fu#)9pVuM~24WdEa)i6e>aSdx+&XG#ndU2JnF)OpaCSJIt z?s5%NY8u9P!;6PKZiZ_aky9A`Mtp)X2T`hs%4W@Tvc}#qeMWW9td@ zyz|h|rmFulJonoPQ?oOpTW05^&MNsyJH&U5?vZs{R&-RP zv2JVZ<=JiX z=l4>q4_`ayd4mSIrJGo$K7_$bl5CN15mX`JDthKJf}22WH$SKLK(%b|>#Sb0XB7A9 zm7UJ?SA&u>M1k?TS9XT^VLGswP%=GhdFv*=k6k+_U$zSf+H%WJftO-Q7hBc8*e*)E zu>b6#I4;&hacW9}n-l-t=SpFx4)as`$H%6$NHJbSibJ>f?11~R`{8oi=-ES&DW>HE zx8+~kJ$H!l@=tsUeSFZeT5YD@7nta?ADTCw{)-R9h(No~ewHRiNPTw*WkU5b76s3! z%!epTWs(^r5;ecKtmfZ)mBBNDC+mB)Az_>K@t@l8hNI6#fYaKiBhHxs3Z}bw@V`HB zSfk#DSCq@t0+(nUmI>IF42@AXxLjC?xnAcNv@rEPaYjrMXZR3ISDfP;zM=d@A z%;|r*LCIXaM>}GU7=iLdC|@Sa4?z1UN9{{I7`TDh7WOa1wgk(yi#*qi!6ucZJzeTa z*qiY8WT<5WHV-bIALch`YUli^^_NE2PtEiYdTDsK8~zs2zu+pqW^NR;> z9-stw>zv`IMu#~&KifSgB35mZ>det$Tb>17eWYKJtR?fnHtpFbPXN<0+Xxf@8jT|5GZg0vBEVzErw zg}!PDZG|4PN={J<6;HdVl26jKP-7&sVunual)tI};D-yxtzDE97OA8bh zS&pFJXzgc5jIN{>PO@84Orqz_RI|Piv0UC}$c`?&lk;3nSTi=tH#Y zAb&%G*B-tZt#B)zyD?xxuCaw1goWQVZGQV}V#5Y*(e9f%Um5oM_#6Q`n+v@M&Odxz6-R)0{Qn8V&1;A`^?&6L#s z*~1?j;^(hRd8?RA_N0i(bo_oBfn|o=K6nJ&tEboF17!2EE|4 z4CvmvWny%v z`*~*#9k-M?`YZMw3o_9Cu7q6a4Vn}9uHaS@z^x1tfoQbC1Nl!`6 zAH9BjRwunjy7f;h9hJL&05G34wbg|6Y`33O2qF8zd`(@1fUMias{yiOnmw1^r8}V= zC=T83HIBB({((mPU)f6Y%^&FY-)F6>EiIzdE&nBh#o8L;F^&JN;IWSP&|BkecKNNu z;ZKRm%>qFTzx6Ek`;@Y}o8?7m@n6#I)mLtv$FP>A-yma7gsP=QRO3leUwSrtVa$!g z6H{)Q9HH@Q#3MB|N}QY|5v<;5mgKM%&Vtv8$a{ue1xs{7x*DF65Ne6GhQ=qxTGN$I zVxHK~itAos!?iZ-LDo;~t$Rg0&Hw)RzQ^sm_lf=bf7B)YnTxsOFlInVTLMiU@V&_F zH10T9C{@`#M#>`WVNfB^Ce268GOVQU(18Vm62kq?i)tmTMZ30ND2SoW9#fT)-J^4AYDS;T zw5l=LeG{XU?rKzG-)Ao|>AJpWInKz`E6#Uv=DLAaT;}pg@^hVMpVEPya(4 zw8K*J<9??_?dxi?)8w3PZHD_HqTP1iEA%;XJ(jsY*X^-a47=!_|#^xPPJN?L9I<1GJx_3moFnQQ)OS5cwM_^tkZs3=6eyfE zyeG_6llNph`AQ2D5z^tQ8AvdM5FyNVActTq0Luo8+6U%J)f^}`yLL50OmoWH|M#<~0*~=Zzb;VZ!`&ZQ4xAUhw43 zMT>Tm-Xa^#I>2bl(^3khMK13LKIQ-Ax%r=Ndd035n~-*#WVbKiF0Y{0=?b7cP@ zZp*~jNk`cIa87`fDtl_%|=s_ONO({P*iSQjtnPiSyLoy63N(f7qqh zS8#b8tJd~-+Sl{(LMxcQr7qn2!zBrwQP@7z7QsXsiPs-?o_ ze_NA^U|XP1Nbqe<{e9r}^zpR@SY$%x6y50w1Jl*{jX=@)4QWndAJZLiOsA>Hf-d4~ zuH0RDO6;rSHm&UH-IXU;|2j=5yI9VYkE<`%h&QKwSaXs3M6N}88vKylptT5T5I3ry0UvTusCV|>FMo18z2<0FxuH@cW- zYm0|&A}jnzbzP6e)%0qAciBJqQ>Ol8-~*kF8CGI*ORNYpO#b(wxYO1Cs5A;}}$$B2l5HDYDZ$GXko`a%I@wtqhx zSj7g^eJ7e=LcrHe@M&AlVzqsv0KPBtQQO$LMZ$*@)&t+sK}OvW2}Mer>#V8a*!~OO z)rps?#EZjeKWzB*Vd`S_3A~b;Bo)QIFdJ^xQe$-VYWUF`@w+9AAiZ^(^dt-g^-WlS z;X$Dq^bHp;NgN!shUGm^dsTeNMtyp8$I7KUKHW9pFl!~A`t40DUc0Z_hbm-?TWA1?=CKS)*ZDVBdo!q$gk;CWKlQYiI)6u!ghqVlhuC zeRKfB%|Vmc2b#F^(XYkde_)S1w&xt1o&2vQ``3$u&%S(0Y)Iy3=MIg}MT)-4tBupfadHEDun5@N_Fq;BTA7G3= zW!7*7gB1V`bnQS_AF#aWy5+;Sk#nurSTTloTkzx{)6#4AiJD+^->buIF_f|dsFMvE;y{}~dw2ODwm9z2b+Wmbyll)x& z2=dttd&WpKl5nfVvS)cD2erERruB~7U(#O})?XVfWDJK1v$&;}`o(NFM&_BKtb?Xk zUTzAIx5zN^!^p|UbSXyTef#LEtyC<7d-v&=->=`$bQ6KxJlE}}Km&;uk>o=3_iq^m zCt_p^9g(OgW^s!*;n7rGjJ|A#yi%3~&-%P^ck2EE!}~`|4lK$ck9QA|Zp+ZnJoIl5 z>fdH!ZvlH+#Py75Nq$Uo1sEMUb{E{Z+Q);XQ;>hMs_G>+HvM8z-Nb*Rzt8vtWXLr+ z@V(7Xe37m^JpgISbUx|$$y1HY3E_np7+r#ukQd|RFx35Q-I!ZE_^Mw{rn2qYJ2?>p zrBf?6uYaF`Iu8pvPu+D#tCqyX^z2yiDVv%v2C(n%e3FmslT*ID>iIfrEBLyiqPjho z8AZH|Zz|qKe6HPJGBm_GWAy&%7w)Nhlubz2aqSOT`cRJtPL(|-Z`;9CFx>1GT~WHe zFuOqU77HmCUN8^{A?FdZ^L6pMZZUzG62-=u;J`EJY%vdg`aGaT$+JDyRv0`97?(8o z?fT%y;GyyA#Ai?f_lXZ&yV**S-;ABo9-F;u;5C+3AeOP0A_NX`&Dk~ZSMhE=YhSNy z7|}mz{{FT34_3V{9!tKOzrUE-=hdwn{7}{FY+A~-L3Ks0Gev#9aG*@1v_cGr7PFEz zBlUo;Li6SrW==b^JC*jk?qP{yLQ8f~G)YDdk?Li;?iQc0T`ffqb}d=^8y_jI2Tf7J8g>clmg#jJ z=@u*2*Xfpo_#)PepVL~4S8%UdjVMvO|17c|*|SaL{LIFT$5cUMN|pTgrO4t0nlZvv zENL9F{nqqByffa(E5F3WZ}ZMEpHt62FV2ct*ma0|S$zGQc$$sB#3EmQY)8iN%vFzn z?mDCXEZ!SDTAcg&#P*e0d%E1c?UXS#yxUPR2PI@A5SC$9OiZdBp8#KeyEym!DduyI z%@Yr6gI;Elm)Lmm^l#$pmvQRs5i#qr<7Zr-KfWsSc!sj+=TqD6?y@Iq<@OUlv)IvC zFzEC=An9pA5u~@$k!}^)n8I7AN^^sw|E&mqu94oFbuy(yx4@uNT2&JjN@{^;l5{-XVo!ea*~@9DW*9Ga03 z>d^bbs~xLhc@X?Cn$OXmYIoQX(Z?S3w8PrUcEl@sJ5Qys;j$SPDx2Z{DcU*N49nG< zkv92m*v(^+!4E!kGn5bpB<=Xac?<`q_UeiC8#b&zj$PtI>kf|{x0dJb-mu~LTbnj) zJF<5Dm~kXKWZS#pIAweh1rNYpFt3>^;<;-I3op!0o!*U6|dj>q2 z#T??mSstgo+N8;VUCIeUuU*80ad{HkFVd^GY4f&y0Tq5zTQb-I)14C%PAAl51QS_1 zL;)o`D!i#Jaf$UltDWV&s4bRtb6fmDcU#h~B#lja0_ODZaGKQqEx27>UA^N5h8yb% z1W1@LyKoBXx`FAmD7lI61nvgbOMbKm?>~W$vNcJ9eg+j*yf^dVhBQLz^q%4I{0^eejSWBY|JXlayxTDPEZm7)BqO8hFL8~Wn)A(?0e(xvJzhW&?#Xh#; zGk<>)wAOL`c8WtG5WKMw&DFP~Q>3WvkO=MA#y7KV*3Z&iStN(!B4CTlxd8hZ;49`b z^c3RQ(6p0GHW_0}qGt>YI^?C6iHN=T6~dqK{j$}KM#=a!JXbv5V@P%Ndo!k>`!>Gq z9xvO{CwsLM>)nn`j+h&}(cZYBz##2ap1Wqe*I*jGbePf7W6aaFZ*LqEl{*=Iy9#TA zd>PM%Gdtw3pfsT}7%3eu0&OwTt(o@GM`Cr&BYU2Dq~<(wl{TE`6<>8yLbZrro_z8b z{=Mr*@#)uJd%+5l`?)v62?cnHafhpERU>c_)zy=6)ymH|!sNNtlWJ-vRZAVR7`kW! zyjqMd+PHl;vx}9S<7ox#7ioA03}19WUWO$SMVHVk~^917&sqr@x)>br47|u zcUpXtZt{Z5l4^PC^G3Z|YpnvfHXSY^HCe5iRBKI@ahhlb;h07oGYuuW(?Z?QaIu;n z0bm+~w*lW@Fb4fBeJ!;-saA2zO(BI$;<`&(*tswlb?lz}RWE(KKv)LP$KJ3eTlx9vw{ z$}m-vOcSN#PNbc@NhULv$gZodRy(_LtNAq9KJF@jPAi2>*}-6V;3(8lEhUaqsH9rl zum{hG_g>{>PG3mO7~-E*ZP=q0Q&gn_f8}&_rMeTb@^pKw#bU%y=|M~gaxip|Geb4w zvZW!S$3#Hop#Y9`VQdm2=`pPS?BT(K5s)ndwB0Y+J$hhvR!(-F5s;0Sz0Yk#V&#h) zq0SxZ&Vs>%$C}aE1^IZbM`m|1qOvz4PmCFjO|Qemj~nS~!Hv`>jp=ayZ*(|_|9=Yq zquQW9jkoxC3q1_W@MPTV5zO2J%92Ou_$y?6V(SuAo07@=73LqF(!xvJM}(IZkhb z9g|`i2#kTPygN|eAqvwkuY?uC{|7SoH0K1Im3w^t{OvpT&dDE`nK}5EKSkB%+Y=MU zWzN~Leg6E%*9@9BaFElS*XERs!uvEEBbvO z8P*`(f6;-%VsKc4*JQj|K#-(@30RxvP^M& zqd38wzbY+U-za+<-cicM+Z(Y}l|caMes>Q%KiHHeJj^F-zT_N*qwsxgIIpgv<(slnTo+f^u03oQy2YzJo!3IvgHVQaPI7~+ zidSpH;h!3_M~t~57>LvHgpXRkzfGlU5|P*1@wcUPXfvWOS1|N8i2jGT|4=rm8O?#-J&k=SL1X_@h(8LS(kc_|~M) zQ!*kMpYG^1>c^*c{d;JdgY6i+pkVNwgL%iQ+@z6v|Gld)wdVr`L*@@ACla%)!g-Z^ zo1e@v@4Yh{m=O~lrsf+<0*2#h=auXAgRHA*eNn&E`T}c%^##>W!dm4gs*n8BH>^?` zttfJ=FVruk+Sb+egXHRj=$UR=sZLez1xFwezIHZ}1v0v>fiuA^g7cLKvbYUl7XM~Q zagL9GGy8!j@o$uIs1y1MLVVdvxTm|NMaAg|9E-q79uiubWRa)n43+m`k0~cqr##7u zJyay!!QMZPa{3P&%KZO6>>vLas$?RLW#{#sJF(}Fb%J+{DuZm9(Mz|A=%udy{h(fK z5!bMnZyDIju3v?me}Zv={*MV{sTM~t{si$5?d!{Ien1GDaasFXxf?fMekwk~!J6Ae znQIm3@vaAM#aVEICJyxu@W{(zb3lmLc9}<7Ro5!qnAwK47axniu{FxwU>#^HzFrT1 zSQGRY_Enf%9qY&OWLyD;o4i!xc2FH_2@SEpp|n`c%q}R%#+4>B?tNk33bswm6#o)y z*kTrd5SSUqalkY51ly|k56Q|dsNT2o-WOfD>@Exhf3~bzeE-&QapA^x9WnZ06^vT_ zbc&~4d}2vYv&6*|v#r!Dww1S0vtkC@iU!NXIy63=Z9C3F#g8ZO^s2jA<&d~v{09o{ zzG@cn)^SGZ@+?K7hgycX8OkR?GD=wy;9>V{1k1s##0lMpPusyK_lp;+#7lMGDK(}e z-`p3z30^`|g6C^&1JTB>TIM>d#1S;C#JqN3Phu;84XDD2E`M`V0Gq+GPp}~<_qu2= z+XBWBa_QiWx>(-;*7qj(Iun9fPwGkNA6XCC1yL^n74_%^egB!SGl^kWu(f@I51hqg zqsD5p!t)M)sNw$(g|irEa$=u9C9a;sS^PQt1$e(Ni6_{I-{Ae$9mHyLw{zOHz;wI9 zIW5jf=k$&3(0*)UJe;8l9N%7^Uw-?SY>s&FoVW^KyYAT)XW{Mrjg1gbT!JTDZSHoq zHw3Zd!J}EMx3eAXh>hxE+wC~D)fT)9hl>?kPtw1eXqVo7SbDmn7q|Wrh25C$@13-3 z(2QX#%7>qP>S>W`CuhGn*DB_PT?cl*_uKx|51??yUrL)DJ8?#l?e^4PhmQVv%_#BH zUS_P;J-`8swgGTP zT6Yh3LwFvx2AsqfD&onRPGrv0*uYSMU##h-(`^qILfrn7G_l#->nahj0_74h`C>`|}^xmUyo(S>ZB+nYC4dtUv8oGs0#NC)1%K&}xi zk8coY=`Ny1UOE7f-l7-+T&Kez=ZPz~`4kCjIPOTH{pbYPTv$1HqK3k;W5+@g!zB4SH_@R*nig-=BbR!I3&R!OM2Vz z^y(2N*xJYLGen&NzjX0#gps+eDZ1r#^=_=!jVPIcDVqYtB~P0y(Sy`SdqKXG=K*rB zsTJ)aJVh zD9Uf%gZe`ZO`Yi8ib5P~0lT0sS6U!}cM`hwf;{77SwqNv zk!}rQp*Y<49;@Zae5v?=^*@TVi(>y#>XU~tZ*)`Nz={y2dn%>NK&B{P_AvW|ed2nT z*NI9|$=C2M+A*zcDf^iHRoo%lcv$JCcC}um^O{I_gdaYQeX?7;Bi`9MfY}y!(5SUasE<=FJa*ay ztvpaV(FCqY+`Fo4QAeI0rdssvRkLwzb#3WdPkqMDh<_`KaX%7hfDS{fBs;^ZF4x&Y zHeZ{Kk61CDbK^Pe+PHLu*Il-STs>#ovYDQH*N5GTn^VrzT^9eg$6lK)pL^Fw{B%&N z!bQ>LI`Qw#wk_a2Pq1uLpHq5C{0V~?N>s)FO$VpnDJ@lcm5vh8)JIJ%+xT{~oa7D4 zHKk%a!mAul;P0!?S?}?{qZ4x8@c1(T2zdN`zTGTG@W|Nph9}EG_pt>yXEjFhM=nrd zm#nE$#?*+{*^huTo^f@aH5l9vK%d21xkF6|X2FV@z#Z}5u@!8^x^-f?SPpZmu8!Ne zPhFjMm91a5j@`>vu3s7(l*l@W!7~BLZzroR-JYhVkBLBQPN& zI$VW_LV3V1Y-63uS*J%?O2ZN5VA~^0e_48j)v|H5MMbruqV&zVefrEH{?)OOYJ?hr zJw}`{mw8!yS%wpiW#ppyfVF?Df4V3T1?m0SGgt3th|yCcirPB0dTw*JjT*uOjj8BLdp77)Hl|zd3)neJEx~-eEOH=qfZZcr{^ciiFI$U zS$B*D&rQ8Qzx|Ec?r+fMY}C?hopED`iIM0H0G2oO2uo(Zbc2K?o(4G1$19 zKt|@K;7S9E<)x(>Zf4NWWXHDd!jL(eG&eSPkoW?ACoJF6=_ofscySt6e~%KJojJ4e z^IU@4dxKmK5K6Z{139BCk_YUS9ITg~@q&m&L4QmcQdHk9WOjO!05FX0tnK(NU(@RGKuw3I)iy(!y>#PdD+^V=C7$Dn>h zskVscXhVSmmW&p4pnVqgGQ(Nk=I*oa@bz`XOsVkDCUtkVi;M`c`36o4 z@(~uRPy7n5utURoWOQ=`whriv3=kjk`f_U5vP?ARZ`;@Da6{}(07|Zw=&%Q!YjFgp z1Mb^5!?mxg|22MvriolPTt1U^;MSRd%W+5S59)OF1mqGPAcwTY7%p`TjhV(u*hARn zC>3+R;^SF`7^j|aoja_=9zKl87vri8##uk;{U#U{!Q=@b>kTGcoPtzG;Z9uniWvDs zyLw6taa~Ztm{ok3c>H*x=(}o_n46V#{KTqN{1q`*i4pTylsGTG;$03N)Q;ixS2Fjb z6=(X};7mWY;REafrNxM2yI4Kr#v)G(%2%_FA3ulaw!di)5$u^W2{zloyAae;C8o3y z+;)}}_5yO?#{yEdR9pY-vEYRR?Q@ z<*$?VVuRTzWH(&Ema`3PJKN2kV+YyW>_hfX_A_hXm@~1m#F6f}nAr57wD2JPj=nU! zb%chrW3gRWS`Nc02G47!*K51iYwt4uSFaQPe}c*N|Et&D@c*xP^54L*r?g~7 zk5Lb%{$5{N<{K&x2+tpe~fTK~5`pjBXCtAINE;#Emt zR3Lup^nWG#GtWO+PcOMAaC$(%^g!2}IvAAkdN``lyAlI-BWTnbJ~v^T&3j{E)H4t@ zTA)_&)3`meg#H$?T81ZD>WWC!AFN^n#_SG~e${hu~6Ab>p+5TM4E2%G?6FPGqd zt5)pgR$`oFiwI+VEES$G1}Ee?q#+SqeSnCk+zeL9euWp$!{6}#>D@hp+S zY|ymqLDv^J4{;u8T3R9Fuhh5Nv4b?X^hGS=THc@LJS!t7KA)z2*_VCFKJD9qcj!;o zqV}h9($@oDA!Z6%Sz~&{Z+Z+5flnNMadwCt-{c*46_B3?hnLcn_iaz=_9R_~r@)Jk zyRR<^M=5{5*tYJP)jsN;*qUC`{By8un(xGs<~aEA#g> z)h%TQY7kqo2{14x-2j6;40MVKzswB{Gxkrv;!8w$161c;5y8KTof0NrQ>_#=!pX%!B+l6N$ke`=!s*Wq}%f#|J(B|6>6nOK2GS5a*=73;aB}`G?xTzP>-)P?q2PY|j z8LEeZ2gTg`%Tj#(`YZi)Dd+nwezg42^2L2ktokm-+ea7o1OI;2-rdxv&nBLNzYX#1 zKDcZzRLC z$KwU786z3?fJ$+_OCw7M#lI9wlor}!tP}e|Ea5*8EF=hoJZy$M&`6N?C6N6KEdWc~ zxYL#ODu<7LX1RD37hYBOru?vK^M-FLT^*DU^}Bt%V8~lls4|8(03jGezdl18DyM+w za+XW!SNTqv5EcL`2^6Ihm9pvPEA1ng90DF-5}b7&%ILZ-><-{wmtZ$_X8<^Kj{Go; zWoo;)4Pc5>vxz*s4K+RtJ0^89{Pz(+KX;Rm?iWw~ZL_Xt_AULKnPN zFtVr|3smvlio;?Nd*lO*@2=1--)-s>tjyTx+SjrO3syF`w*FbX5*6aPTJeMWZ`an1 z%*vW=>Vtlx7}+$870OKq&25Fs23e%IWxh2&S?cXqi%UzbV~j0JluSTh*PyQ{$2Ry& zOC5|B>Mh*;uEf9<5m}zZP6(fJ;mb~Ryuu#1a>e>F8zXkrw}ZcS4AN_UOu0K1T4s3h zm~44Sp@Td{PH@+OUlzB7lxAr|PAOFB#67koajD@2bpQ)3y}AWz^P;Pn@{MaD;CRLc z?WM{c!vqpz%oOR#pbPg<#VG5=IeZ^6)jL~xmaTNPs>UYS8nIp~_~KF4rS+?=9|13O zPNUndp^2F-gboD;+<$AN=7=2UfVSCHQ^N8jzO>e59i z?69Tny5OV%=LaV_a9H8*AsvQ&G9)=zoI(WS;Z7Sm5+95?)Fyc9Ea4>|+sMfk&% zTA95jdQ^&@>@cJ>-gX;_zxGqLwt+9K=8!uEReY1oIv}SsTQYm1LXa>`fc_l*B6~vg zVIg{E{1DOC_9W&^+d6TvxS~GKdJxb;t}T`_0_K)kuK==K2ST6HxWwR=dsFO?oZ@>~ zuRKz})7byMNk(FzfoUKkMLfP+upkGI>?oYIFrh+Tq*Yw5!*Tv4nsgZ^ceDi zC7wRd$}U}U!wkD~5BrO&6~?eSpy35^mwk4_US*SOq4Ev!xUr1*W8G+BFqfo|K-3tS z6Uut+5R27z>M|nkIVZOZFl@yqNcIi^pxwCTi?&|8hAsT-xND3Cw?91Se1HT-cB%Vm> z(LbquUOsIg>FwzGvldh>aHXxhGV5j; zp;<)UpBfVc*9Ad_jA%cj{6+SP_Ntfwn-Ov$X8>D6J#GsX7h$6 z9G^i3#wNsW^0|@zl%Kbx&-p(aeclb_>2rG%)Uq5m;V3_taL5AkfP>OmA41TC#~H08(()`p_3BSthm=8&KlbI0?a$mXtgH||G?Omd zlgRY|N=+N>`t|D>$CAK{$PoAugH%1xBGrrXKjrydIEhYpj#v1bJngFyc^?kuUn8p@s z4hdyY{rnGA#HfSkGXB6C7MR#H8t-i;&N!#^k@AqWukm?ippANiXd%1HwnzWmvJJhb z_Xf#lCFX|qm>b%W9(U&w#68Gl1kyK!h||!ZZ*&oc2Yt(wg2BV1TbIYhdvXfik>0hu zOZu2>cUHkpa}#1awhOe|)?O>K2SjHz&F(eIom;SFuwCqA6YRm!nOV~&(A)-G%A}1N z3Dk6Lipcvw*v0yoQG(#;r9&amg>Q;*n*%{<#HlJ&itxc91xoH}avHdl9(yBu>xt zz;?Rc+%XZ!P?2VC1zV2t(4*+z8rTa>EYWfYImRJlm0?*Y&>2R%5~t8Voclzc2e8-L zf*CATs>61XooudPTl%BmsvC=DV(*wQJnudiJ&j$fh zQ^T#7-`FeO3krEQI6&0C_{JMmtW!`Z-mrof;>#DjtAv3zCua!{muoANVt)|Nf%D{Mk=jku)Zh}_Hj-V)Vi|IshEeP2X(bh@1j8Mvbf_IWy;2kt zS|Af&(X`@4uayqkp1A3?Ez_1{KhkskrJ5y+Snaq$%}4Vc1tF|bOls1%DQnPv37+(9 zhg{*{69T4A5_?!^6U=gMo5RyqDsr;WhO*7>h*LVUL<|`$EEAFDwrJ~?(o2tY-kdXc z#>Uq+B~8w&e68m0yZF#v>3Io!M=9H;UGCTE+2Nt0DbsFC3e#%&q}yhk`PboQ*ujVH z%YY!CQO5<^6uTU^hsALCm6zc?_MI@kdqc)I%ID$oy`0a~<;FZ@tVZ0_5lBm2iQB7uGOjA#uR zlKvbu8y=A$neAWtbQ1Kv9msYU<}~xQU^|GeuBPoDJ^!TKP4KvXL`2-E(Rp2mPn*e1^bzW>(FsoZGzs{Aiy}yfV$Bq)!8*p{tY*81>C`4V*e2rh_zsAw(F6m6a zf$OvzWN@9R;g9iT80^U}{y)fA9xHof0-HWPc5=V*3(zHO;83Gah|qtO;)^%?LmKb? z!>1Ok(QIrc`f5E^ux$}-k%GH;vn^ebs~#&sBiGNZWykI&7#oYB30>rrjHBHNp%kJL zla7<#>B{`yk*4V(27Sb});g~XFO5WgtTsCFI)DTBz%MjZs`5-uC%81E4w_tD{n>=DlNH9H_YV{9o z>+3t7%{w;U*SBq`zt#9aJZOCI!i4c1(^9vNpU@#Kos^Vn>1`Q<`!9B3lo~e{1*di8 zDN#J+HjX<6Wcn-2={)u}X17`6FgtW*&J3pD!URkgVZDcMIeG5nmf`xp$je7w|Jfc9 zyQpGc#iG~Z>faNwS9S*VJ*N~;@3j{V0-oIypVQRaxTcq1AdLg<7e%FT&A|Bgsh26W*y?aGm6 zn@{_XXfEDwgljXjm*x~Ns!A5G4RYiF6Io$Ce7cYC z#85|0Zf=fas`i4eUK+s|d%gqFu4F)Q~8i0(?61xO9`jxPRlJ zXWwBz4Hv=Nd$W^T{oGv1JaD68AbX5mWKSzl{=^p-XqZj=By^P@d?cS8;}s%KbNS9c_FvLZ zb>&i?ea6meoWD7u45*KcZNGKczqi4YWGqZylIhb^zyvzMGtz zrCqQu{NkaVwNpks3Y$4dbMd#pe^}6T${JSylCv@aIp3n48O_kmSg0{AyY1uya|Vcp zE?t;1XwHGjZTRcaUABl`+V|X_y*##u$`0mDWG?`N??vD8&V-8y0WPa0E|iU4qJk6C zLHw<(+{x&oOLce6wXeSV$d2JtYIklvZ=a;o@2~v=eCQ-1(U1zv4`{#mmJ|J!KGxyt^MA0hkYcadm?Z(@%4$M+_RF&LvghVKFe=Rl7}6 zj8ya=b#4P12Qj5f7tt^PG`8ih$8;`dbv#1*MGTslcaW()#)^KxFM_?gr3>LBLV%A> zqg)W1N42@%fw_0p;rM7X@Eb%vett9fJ$wiFg7^^`=Rx#gEyCGb!s5H`iuBRR`>=4Q zq|7gxpkGD_KTb?KT~CSe_JF*g>SFC@)_zk3VGWt3M{A)^%|d1Q)500!LwQN z86eQJ5V~6uZSx55qt3oU_BZh(q5}L_aRm!!#*Pb%;$uF;8tFLeZah>hozdP_*`A*7 z-LTxG^;U}eK6~oFgamy75vmh{I)sN_hsu) zJ#QMR9$_o`DPW0AweGx37SV zsx#}c%Sg{d+|L2Qcn(_B(E2U%`3yPcjr!0Q>~q%L1R(3XpQFC{+yp>)>aqZSz!D zX5e6y)8*OZDYPv3Dy6_$9w<6tsDmXrF(#8pa__K|u`7pfXVPN{9FlT2Jgb@?NG!aK;afH|B>n=ohT zvI@RR4(L6l>r8akaJ}!{aJ}%Pl1BT0*{EEYKAr#(coI+5Ya}Cp_lJ1u`bw84_5XpV z-c!0x{$o77+V{fK&|#oQ*FCU9Nc%t)LO`W1B>f|GA$UoCSE(J0Qrd@PmSAjbt-)zI z;-yzv@R6*am~rmm|E9BI@`4M(chK=P)xsa?`J zW=Sj>yb!$!Pgy$Mfa?0EH=>@h2A)*bY~Kq}LyjPp3bW*Hu95be=YBlLO!2 zE6J!?o}ij~*C=j^sbsINe|7nD*D*P4>J>w@C0BGUWQ^~d+CgiEF7gZqw~8~zgm*iV zn{I7mDsi3te}J1I_mX@=^xfM0X52uJ-i|KSrcO0^c0)U~W~1_Y9XNl9BGOtka!AR! zdtA;*Zr;gyamF~O+L)JgRb!A9GMwl#80hI&cYDyKQlAi(q)$B~l~^dXiZ^X~J+vq1 zHngWxXU=alYCWvKiT65v5=)ahFTv1}^x!CEk7$x3&(!$(L~8KkCc4~pP|xTulZ#$V zBLVAGULI9rsW|XYoe1JnZ-w-0&O|+L>K0W0x^FX>~$nJa)TV68KZ> za>HJf0z6|ig0&s&n>I*IpdGb42m+ltq6@Z1t5# zqvHJfMRpkT%uyY#0vs8Bv07`etJjn;T#iviiww?|VD2u$c%pTbY+ugDOK2S=*KWr8 z&9KRj8go%7X)uycnuqj(YCQ_#UF38om~t-E=Qxz3AQQGknJpF&SZV32GpOHW`w~xF z;YjThR9)Lpc`cPptp%uZ6vjB@QNpM30-N2$g~ki|Th|)8U9KDkF7;gvxj?*E7~u^r zNKE2_LX=q`5dB3!N%cWZgQP<8#hBBKvU1dgGU7Gcq#Nh@%qIC_z%_6o$Rr(rU5C=H zEfxG7B}|z%*;&=rlN_nkeD}>4#PAz!saoMXTU#OSRqo&CCu8_Pz zry6n~<WYKL(V@)pQ40WvFzOlO1xg^^|uj!nUGGs8T{sI9pB*~Bu z$unL03|TVmT*){Hh0Zz{yM~OQP1EZj`9Qb=n>!`@ApE)wtq&cGqRW-UQ$|bc9E4?I z)RkN((W)@{Sbsr^mkvO-DaVMX%~0?KRwGxA03G4SgYbNp&z9C5BWRn!~k4;z$FM6o`SN&PqeynEfYf8+E15k<%Z%->mJ<@Kn3)m)iTO`Ns_J}9Ikz&n> zHe-ZT_hh}bZ6pRRAv zw{kq{<6Wvise3Tb(g0Q!V$7ivV5^vRq~Jgt?Bp2NuoT_%>kymEl-Rv+xuCu zKF1mLls#V0lmm^Q*}b2&X!MLv^LoaYHG0NQcs;}NK+dT~d#tVZv#yPvS=O7+Fw}RN zk8uC;bmEJB1^Vru{B9Bpis8k`%9P`mW-Q7c5-uaQ;}Bur4re%1ar!xjGJ#S&3B{6- zKb-#m+4ss{9&`PFw7mylR8{r|Jomo$re*qMN+xakr1zN#=^+UOQX!N;=!6z}C;|yh zdIt+AD55JCKokq=s;eUQvg^8Q*R`V3DId+xdC zo_k7U|Ni|raNK{n6vn=X9|^JJzt&&8CSmD1_&$ClEFGmZ*h^>acop`+eL66|)s8CI zq}IW!U<)FQw81uYs%!@AQ|HST!A4bTqYrK4g87N8eZpmD_U!-SJ@S?E={xiM%i^?G zUU`KbrN78^FN@P(#*ZD@Uu5r}#P*k7dWjvSKRS~o6sNJb;#BsCyZf7OzWMrV(e-uj zPr7B-!h!$&8^wygY%ZLEFX~=6GkSkHzElE!u#abdLht$CUBl7}E{TCc_%kwl`ip;9 zpwXH8_lqy>-%n>AIKa;T?s`A@y=hecMa#deaaofBtMV$&YI=2|U5t#@Zm| zFV!{rtY4YmOJ$Ayqcy^%kCt_0sR zoru17m`PymBWYUp=|p(B56&I$P1-Llvl*9}FB)}QIHMtzIO7OAE;~cx&YX#Sa;B4v zqH$!DcqHfGR;t_ot^VKJ343MU&nvSHvnx7=If*XAM*Wh-n@4^I`IGfIdgD~X2^Ze z+E4%7AfPxbJzqM1KQoMAiz=2-d*GXjcwME#9>t$#=pnjrh{K&v!cvr%MS+N zcOu|1;-HYO6u9CpxnobHr}@z|K~LY4{%3p~l#*S1i1faTPjM%CB>mhw)YCK2UGHj0 zs2}7e`kMOqk&o5X5Bh_rrY@0I*4Ma3K3G>@{|Wo6ud9D(sJG6;Ev|DnoUE&<`>4LI z?o+%uTUS^A0q*IOLlfN})zwEI4y~{Mz}uKqN4+(k#7}DKYCcJ7^wvZu|8%Xl-opjl z^-ghhVttL9=xXX6D6}SW+FetZAeH(cviuZ(tkB3)Qla(kp(pEW>OYFUsXL3pS)pW0 zed6%GQiqH>vK+8u##oXrbPkccS=8Wbeo}aX)Z3Gg`___uka_$S@a$4 z_YSm_S)#ESgf!4l0m$wqSeBXJQ+^)opgd7&57{pLSb z7s+xMHHjQ#jOUjb6>6gvL zIURYx02|usu;W9se%&UYq}T+{V%PS(fvCPn_A-}p?lCDTVAF@s$OkFmSZtBhtbfxc zguP@5J`zg+Wi)CwfDC-T6uxG{*bC?{Ou3A|kl=#1Fhcx{n}6;umPoAS7KpXINiVGn zQUbnMvhTQTY(?QK7zJX4+P_o-8v7A?UP^fhZ2RhRA&*O7OQLx|Z8ut({&`%O3*ha5 zO1K-jk+msu5NLA|XC&FaStajvf)GVumNM%0Kpflq1z5=oI3MN3k+1p}G7l=gSHU&K z3*<#Hc=2oL=~XzgH!p~x-dtE7$H2#RL$@y;^8tJjL>(VM`w-SevP*m<$l#}dSy#hJ z0p7j)%vAiIeU=@?_xm|XK!B}W<`aRrDqy}6NH%$)bHIR3F@z&s7cC4QUJA9 zGk0b>8@a!>;hA4w=sQo#Epu^HnREHZGgQnTl4VJ9U!oT4#W7Bz=>KQ zln3?dSbSa({);=yn^79hEJ~waW_VKr({l4O!&5IjjF>aLS?+0RMVaA;OO}-+)$OgL zom%Y`27~D9y^rjY?tjVlC&hI*eK|!naY^p{L6vDfCzsa$p+9?YQI5~q6KgbHVX=^R z2CN#8H2C0P+9}d1 zMrOf?D+BWv*AHV7^+rE_#X80b)Go~a9KOju6)vcia zWBex{Rk>YmS9LWG?h`9Y@$2ehNAarvFc|3M{ejrn06U21iDQt*Ge|s(Bl+?-F^tjW zzB*q9-OJ$CA2QK-DEgg(c@gvV`Z~E3>*>s>ZR2Sn^}ib6-DTOZ2<1E>fNZ zO3sW#crWR5mgo0?!R2}KWbk&@${oLzrxMn2G7@#jA~(`YGUbO!9$3C#acMn4&Ebt< z@OJU62m$X!Vsc4crF?t6MTCr(0-$%;pL^i)e8sbjPC;S%xAWCVap!tr0Pq@Jm*(9E z2!L3${T4L-OBsT+1A;RCZRX_Df0ymAfk8<4{4s7n=sdVK0nRcQY`OjWuM_`7a<1Dy zqV*mIJjVO=O9yXi60IkNd-pS9zJD*@&4~4J_})MN#rZGzzspl3nW2nC16WD+ZiI1+ z1%5{T@>gZkFUB{00ER~o1%-D(OKAZGCn|H7>3tcwu1U4p7OExB1 zj{k`|BiixLzt95KU6KbLPA*L-Qj=PLepi|DFNkw2=ILm6`T*mGa>Ik1#4Zbx)~k^ei5?aMFU5Un-aV01+%P=BnW53d~O z4sfqVaTubWSn&`;Rx;__7r2Jkk-?^?!s3?b2&$CBQ@MSYRC5M=m@8p}!HG9*Orj_8V_BD(jo zw9L6mJ{#xU^~`-r*Z0f2fH82%r=Nfkv%}Ha^;dzFPG* zq?g8_Zm_C1=SYS1Rgn31k;8>3^TM>EuW!H)T^OGXkPLR9lTo=7~;6eGN_=Li?|5a`e?*i_#y}*9BuP6Y6#A40Ei6mLEWorBO zZByH~79U&Leb@1o-ACy!)3$7zI%VsYsoh79b#>o$^m4vW@-zax1ZNG0R*bLix1hR= zN4y|cV@biu_e*){8br?4Lz4Q*GD-B-Kjp$S7r*WEdD9n+gjX#6MnKw2_X&hK9m$V*{N1_ATG~ z!As)VefS!%dg#{+J>WzCwn=M3cs@Bn9=v=>DABU3_`maeB_0?&VlVBH_<>6a`fS-(=GV2dtSxCF3?j0*$x3S1-^(b4|Xgz@iK5%zb4?QMw&{4imBe@=({SsPmQ zP3KpuKtti)EToORcS)I!UzZ7gYrTHodW(juwLUuCyJ+bcKOyS#?HwykihN{yd;Em{ zg$A^tsG~Qjuc${G60iDZRY)r~v2rgTUlQ$D#zo}{uV4v$JSq>kEFBi>KwNk{kk-gN-}3?& z>SUDovUFire>sI0`L;&oWfam$EkB=+2gJe6^wGiBxU`G*Os_-DXu#lHb z;O&KZ`CtK01sC4A0ti?eJuC99EOF46-*=L7pp7LwUm}p-XPwH4+?g7}lbtspvFe9ISdGsk3~f=nRmi5zlR`dY{p#IJdt7?U$du5L13nOnP~+4_c1D)jw-d-?>L`wZvI;-1On#_{6U0^}$X%<`~)zlpqx zmZE)VOemk(d&6C}90q$p$zl>HC?_^{$g_nwnRa8X#_n#hl*i;Ht;VV(r!K=#E}v~rs!F0%(H0is%cQd0GC6-YR{U(I8UV?6no$m*=!a`y zILTFD*coH>#GOroVZ67(S8zFDE^Iu3U>NB~t}% z7NXNwlOQN-QxnOD>8ZTRn`O?>km(0*8Y9DA`xwOQStc9>KW4-Zg$uqA#>zIxPRQOR zN@5^(;w1HC8QNnF=gSrTK)w}b@gc|*?_4TyVCnpI+?&Eo#A|p+qky8&(bUGqJx>ggk$G*~-x`m|}&XV&H=k+&AumzXDfI?QfJ7_{i{@6Mk6 z-Qh)b4!w2Qr-Q|{$pu<%K{97haj|AjrK3rCdOb}0bxPhG%PS2eC%HhUV+j+&~5x6V>WOBd6x6R!w!pn50l78Hqwc)mqA{&lwUFiUb2y$l=b33QDSX zD3uO9RSGl)LR&?op88S(Y41~CYDyYffg``zn50xD8L3i1Vl-3$?N3mt5{yK}bD9_` zSBklPl~SVCs1%o&he{=KtWvSO0xCF+79`4Y`1^%U%nL5e3RT#Ln`R%*Xn{hmCx|nE;ft|JLpD6HA;6HeoP@H8UtxyhdN|2uV;7{34fOx;AOM%! z|0cz+@=#pNBl-#G^>3E)8=3y6PyTyNqbbOo(k#8tFnFBNpXkXX@8% zf1S}@FzaFXj*3;P<5k40UTKXH%)Qq$EYh_j#;jh%k|<&vY9yg>*%7^tRqg0at~RTQ zzb`q7Rqwv|d{4jJMQXiR)Jy&Hc`KSo%KyoJ&&e~j>w=l)QGz?Iq-t!sdOTH4oH*U6 z(H2(v#?AGX4k9|6O2gZ9f=kWW^zzTFDve;($=xd6s+XU&sbU1HUWnd(fjcRsinHtF zk*C>9_F)Xg?J4%st`pqIMkgohtg0Bf6)%yGL3pG$sawU$IAxdekxNMxJq<{Td{~h< z9%OeY+QX6x$80LKVArB@tc-n98CrbE?tqryWAyw!KA*`J%&vIi63jlqTttqn-$0It zw{H*+i?^?*2bmMwbK;y|ej(R@-z$>E;+p~Z23o!szY23cf%Cayi0iWNbJ~fDnC6lM z@%EYR;$Z|byGESTo1I>K@$u(L#j`9pC#%nMh;*hBUS~21_*aNUNRhDF7iKd^n1r}j z22fRGCH#Q+#qbA__so^_>KNg58uDr)8zSGI6$=9sXo1ZZUrskd<%#824E>NQOJc9NM*MQ`>*8x9^YzU?ZrJeS=8~3{5`T@?Tf^$12i#5xiO}@2f(pqHQKgTy z@Ljz0`y^HZG={+wOjEGH>*N`~0oR@Esl;F))L(uc0uAyp2uL}gu&L+P!scc~5^mz$ zX5*mkQ>SjLE*m-iyiDAEUN&x0RW(E-I|k`=WmH4d*(2 zY;)(rLx&c2HV;-#+j!&q@87twooi@5bLh~SX1#XhO>Z$N2t0+vCZWX=lLTJMFNrFc%S9{S+8iFx*toDMlGQjM+|+~{ zE+8KL*AL>+@j6}2w#jHt)x>eK^JJdv{J4>2)!U{_-CARWcfvu{Q>IkcOlDDACL?&u zWHJ3y@nJIf(>vGej3d82di2|oEnLUWJ3s&Y&Rw%q^`qF6Q5M6M3@<4BLlORf@B(B_ z@n}WAE&v~BH83PG0LnJ_mM`D+{PVkZKL6|=%%5@vA1IuZQ3_$R(;*9$iM72cP_m7Q0L-iLbjT2TD0g8?uTKT zefQ39?!ng|m7Y+qnm=7^U27rT1UlT}afs6!qrEp5a z^^?~1jU?9Zf!|aOV_6XjY_#~o;UWdFP^hq?m z@8V^Mlo2>@iY7AmyQb3xQnG1hZ1L+^meTady%}Ye?AME9cWxq&)U96Lvv$R*`mx=k zTf4eiTf4}Rnp}kN!QTj@Mq@H*G{(O3TrHC#i(sc1upI4&sw#@s)^C? zypg)?lct0OlQ|(F@{ic~_*h(!&y)Qz8oA!+)5M5F3_h(|FzS6+OJR}b@|v)*Y%-Y+ zY1}50Q7(6xO@hW~GP@PL(PVl~j#n;)bQE9L3u=vDXB5<0A30%=$7p;;y<8Im%8BuS zs5bobh`nP3SLK6_Q-8eamTi_@gQ!tY$leCtKnWH7CE*9q7pu;hLoJ zK>MOg=~#cF>wy5~e%C%Zx*v!FbV1-vT$eE}O)m7M1qS%~U2}bD6>_V&-!=1)b}7;Z zdNCS#`><0CT(|Y&dKlavct1wIvWdmRL}`o>4EV$3FAn9LSsa-)hfmr*W<^))=>xhLTQwRr zhhvO}RB$-O@Y3<0y*OwG`n}wH9j8$6S+&a+_Z(Zito9*axi9!!jaLDdAf$C@NNB@) zg}3_oAfD?ogD%(c+!SH;?dKhd=WkynPszR8=?rFYj)KJnDFvt5ec~bjQrSGiUDoz~OT^e4kvC(!2Au-fpx4R8i5jngA%$0O5PmYbA^eA|q`+4w1 zfA3SzNBDV&nZ~|@T&4e)3g9x9E*`lDLXRN${(K-zI5ZRSorQDfg+^}P#9-pt3_hks zHF&q7vm;;dWY)~BMhLcZklFCYp*>e}tLF1rDdO`Vr@2n@1>+VEU$t%|n};~aB?P{n zds`~kacQ|&^FSTTqJRpcC!iu*xyR6eDt-u;9~sL+1(zX6xuyhB1;rn@5~2~m=icIb zf)Jm)Sl#m&SJjGGAeJ!jllmgXHEyK|~fL zeh^R%N#_;(SmxAcocJUaALquAYVlE_D)NPjoHLA#KtGrpLv4}I$HBPCq5ySBIN!rR zAOxlP&H+u@3{Z$N*(x@Vu$2`SMZRBM*nay-zgPd?1WzQHS}OQd#J-BH$YH;iS2_bme+(JBX_(sU!)(KbQN)Nwg*??({ zY$5C_HUeMdHdiQ&XkBvnV0MLAcwC@npuiK5E0_oego|A;d}Z7ulwf1!idd_SN$@cH za#o1!T~=t(un1oeRK+S>=%;Ydi-jS?iZ;KoAm3$0@V#hO=_CNIA0=`uUr!nH#Tv{{ z0@I`6(v;NF^Mx7XfIh31=gU(|-BxN#A;h1WlRUuc6;k81^?r+CgeaHSkV%|e+h9}B z=2w0qg1s`*=AaGt)@u2lF~HTG8czJ1mvY+TeLMV|-R7TGYH#voBQ9Pe#4YEQTtv`j zD0y0#!Yi`qu5f+sa0@SfU`O!3N2aeLwS_H)Vev^BD{6gYKy^r)nA$P8xq|*!ux5Bi z`)yk$rqxYfbgtSOtKT_fxJ{)}>j${hI;{WYlr|YPyjp4giX>!G>-asp{gx`8q{kUe zcJkM3N6E+;6_vpzS30(5!9x~eZE?NuH%ab{XmVzd8Z%@%E{@Q794GuuyyD#boSd&G8^vJHMDAu%$7ldSk5c{?;m>T1hg=X1Bw&_>=^XOUft13i zv6`GU2!F=Mk8}9CnyiuI8$ZfEij9DQ$RH}m28RVMi-{VU;E^pE&}TX(*kD2nHj$YW zo)Fh}i{1wYM3)&hI{a{9RYGFbz^aVFY3iEmewsNx-Vu^(rxjb3aTz&r@xzL4OrBS} zIqAmY=J>drbcf1PJWVSPIpW97qN{!xF?Mu;skL>SJ9);04~M5Z)z)ChXv_*stVy!E z)bTAJiGTR#Kgqz4TH@6%Yf{a`K$g)E4qDaDR0)pRREwn&!4V1FJ`#&19J7KYIVxT*YnQ7_1WR#;*1$F58L_0{DeW4M6dO| z67^0+eYKyImz{1c82+4=5?8hozMY*z)a7Kof#2e6E;l4syHXp(vrEh9)xCX4bZEm0 z$e3h=*>^IZ|KWTl0mpS2DJJ14?~A9du#}*TUt}F569a*<8&3DK68AEnj-bhP4d?Kbm0HfNUp8blJ3W z+7auwX1gK}Q$mb-vn?n8G}&SfSnX!-3@%ltGh4D;M8_%9iV_VLdyXS@fQrUwv+bz^ z)Q;@9)I>Xt;Z&MzM~bvAr!pOJ@K0f{-^EtL#EiA03#_W&0!tNz%PpNeI298GJLM~w zL|y_XJGtDrV_*!RLAU}0IeuDkAYS}1-5gm^RYm8k#Sf~gWakz4S5@saIkVT z;kVTjQvWbKWV2i1<04lNC1fbQ#t|Yp?z~cxN7p8$X3^4;($bQO(xS4`Vmm=Ns2DP` zh3H3)AexaQ3Q4{tP**D|Cm?e1x-j3ySE_A@%jOO?9>Pbwd)#%o&)taWKuALG-w& zre&Eu_mV|JbDd;L$jSv;S|U_SrVbx2o>u*>rRBJ(yrm^!93kWC_+#vJh9kx7EbirL zWIQ3`d;a386t||8)ls&l@81__2c$5;0?_&V=!xBVTmg1M_n?#H7LwzVFp1%jtrv;d z30TvMJn}g-xvDD9u(PV_eueCORh9UGn$EAPiYzdviyy`ZpsjkOG|x?PLJoQj>ww7B z9PzO(IWMCRvo6}km*AG<6_=J3l~%CcD5Y7cNs$@!Zf`y*95GTuMvT;xmXYY15hGY% zoc|epaVm;Wuy;aVhJiQigpihbK?Lu?3B7|p@_U4U4>*I3TZDbU#<&7kFv(_&9#$*S z(~%){^|f_Pwe|HwhSH(}Z_npRTw`V#t)4Lx-7sU8iQq!V4)ng3meSbcEiLb<#AjMs z$P{gaw6t&mTZl|{?e$;l=A%Cy*j~hMkY{L)l4&HI)Xkm8bc~ zVMVzHtEt_xn`Fna3V&4gvg|dis@|72iWK@QARa8-;TRUo=-0hI_+5k@*B!GGMsZ!}mtwj=0-vtrCQ0T68v7HQTo z=R?;jge?4Q6=m^(jb`<*u`RWrpKZ&s;#s`{K?G>W{#h95Bsn~G+%O9ukp)|dZiRrM z6SjoWJvOZ5!U2W!7j+-Wo`FZiyZoSlH&%;PVtV{RIYP{%*2ux{QNYEu^m#x^4iD$Z zj{VUk|CpcAAei|T?s$1lC^o11vFv+;LyGeFKyY`_x{aYjes@e-QFYN>pR^RnLtIjv zH*1<%HO%pRqxelwuqoAQojOjxq@baC^0jfX4zJ-nAoCh2Bo5^eHK;nd8vhO9&?+&|!xOhuZYx*9Q z+-+6p&4PlY#c*b|N&G_he(cBQ0~Q)Gaii^e^Gfq*bCF$KGFm7Q)cW93hi)ewp}os* zP-XM>S}~uqna!ijH^gep`dI!CH?&p{7}ruSr2F%8v)a=W%szRmOFvAl^Css_npD@^ z+#EZ&E#&j4)x-45<(V7MMZB!+s?1-%z>Nz^xeLCk(ZPAtds=>;EU8`!u`5jO=FG(s;wzL@@ADd)R^7_d! z^_Hq&VvMjhRh>1`mp<07NL?qse2eBlcv|v~64Q|S%E=8$^Xu~S>na9^V!YS|OHukY zDSRLx_Y1i+o6p2AFO^S;Ny!vaQrdamkQK-rQEpGNH`Nu6@M>Hm^7Z^}DMDsRijd+6 z$Wvoeg;XwuPgSNuSrI&x>ijwWIpH-)E-W!laBv-K^D$P~17%LOU zh4!s;XgEIJ+U$I(IjI8DH>TsQ1kd+8{}f~?UibkofxqomR0+H57U&LQBylJm`aFUk zY>(W+bWNOQ3^OQJ!kK@-%=X#CW;rLv_-BI_*N`2%7*}t$3em=}!5wWxh)y8kH^zzQ z4<2)fFaEWenD&u}Hf{R;@fjcQd4O2{Pz$-l_tq_)cLuWLslK}webyk}{tunuh(NUs z6cI4u;yp*EiwCMQW5X_=yfVvJ?Bq|0ukAc8e*MZ7q-f`E8!`WR_O`ljb{&L}aUpT6 z*r+A;lUz@FElG>Bi?0u+yNerm?PvF@)#B^i;w8JX{V5ibQu(jSB!5x5qbezxFV2F} zpB!s%1@sNFrM-(paM;bVS%3>ONgp||y0vZk!)e8txjCs>SydS~KDcP0rUmtRddS*F3> z4Y7HOfbE&^bX&aLbz>zjjw=@8mXq>a#EBbNvv_@y+m*0l_ON1JpR<4A5=G9q2NmP@)ONNPYs?EUu-XMOyfxhRN`cfkoB$;CP3O?#x6)A zqC*UVjs8N}HrchZ{g`ELg|zoLB1k_ZdrWpp_N?qB*{g60g4l9lzs(PF9u9~{exDNvgkrcA9fR#3Uzybq*@?$-g5afW6^l*ZqP_;mvKDv6u)IjZ{ z8hT~L9*EFyX-&|Prb(q{=eufqGL~?Baaw92W@0DR*=JXa=Xts`yZJ`A$-heAXJ-!8 zkh*H|9?H)gJoyE!idGYT>!iK(^M46s#=z>m)pw=*2?}nFFrKC57Gz)K*A~v$DgP zks)!Z9WAK=&#ZB#Ov8`{{Q#O^jR$? zjw584l?-eg{^LUKk4~$pJx`siv)HP&+@b+V2Bj%tNG_~$a&30EvZuSiUf_?<&#+>L z*BHo~kbl!~&4`qN<%uSx%@Y_w`i)8^ZkG^QXS zMv;{28`M~C)~XXz65_jJ$U94vi_EhY@mz`3qI0VAQ~VP~nDn~1oJ1NlCK^i0^hx33 z3{OF9TTyaT%F;^X^ue2I6pP2~8mL||VO4>xL+!~ZHcUw_Y749~RxYhrrKs67>`L{( zU6W_q3RX=#@(207wVvxn$n)Zfl@PTz*6fXq^_pY7YH*mb@p4_5@f5onY*X=#D zYcz|}aMRxF4)X7vp!CGfg=0IXJ@g%=-<@ikD*h`>M9l-ok3T@ZhXT54D$3?$%fb7# z3UA}e3Aq{KJ;6E{Y!1S%S@IDA(+Jc>ETcdWqDk4n_s<;%oI;PAaskxOW#_GV0AA%c;eoZJ*UL0#g(tWe&!6> zN~WXTMD`NqU_p49*(yl-Wnc*5zye1En1tRQ^zy=JE{@P2)0~vwEtlU-LJEcWg8Zah zd`T`R1;+*9xbU*DUw(~zf&4n5XCow_D}?KCbB%nzR7Mzkef#-#7XOW~tUUl7M4qew z==nlx4H6eTfcqX+B;EktctuW=Aw0i~921%Z{1-iAS^|sre+@h$&sZ{*Bc@T%gL?$7~obC_5$w{0@!V2y$d;wC*b5Tu|p}E zMUaY4`9aM1>>WJ$TP*>FCm03}(7A@YZ{r^mzd1aV=;n02xN2@ix>bDd(V3)RGx>!I zxra9tY~M%=Hs2ux*5-&`Z~dM4heyjYgo#!)vEBJHS^DQjarOyr-eLXRx!j3)Fk)u* zT1p(A=bywbZj)>ZvqvY4V`hIrv>zfQEDu263)reI&%))0u(SQ1Lx)KTOgO-a+sFF!9~{gC^d^ z$2T|IcsExtu5{P#S09PvZ+J-j^jS)Gnzp)y!eNJ>dh9qUd2IBEw{IK3(YUs2?(rYH zW}qOi+IfJIlxGwj=o3wZryI8J(nE5^)-f2dkhg+q3_~r`z=45dt0uO8 zz~(r)jj1%C^;mqdbrO@+!aNSrfP6L^VxGm|W=o=Ms8hsZs{t7SkUsVf*K}5Col&7J9f%raj0rT8!LqeH2VO}?~{(*I88 z)~Y$7aL3?HqwaCjQ1O8z-%UhK@?O8*xZuzyd(#c`YDPYC_ry-)Krv-w&Ez%pi*40K z*LJk6nlNBLBqJExQJn|3Bom9Wq!8&zXoZMWU;vonDv$?=?gz&PoQG_rcO~gogy_*f z+_|j%hK2On4R>!@^eR0J6+Ek1-nM%G^5dh0eTqjvp7yXU^uqi}iA|HY2(H7MAH8S! z+C|q+YT(4#U2-d#=BR5sK5e@CBaN`_dJSosoBaNmlAM*WL666t%Srwac6v;}e+Og+ zGIOs^1>5)!$Jz)dmzk}$coKq{IlwLp7~{#9?|&d;#M^)PUc7zTMAA(6i(hWuwvX1` zyit6Mj2k00~ssch7@;_(cj-ck!&MVIPuHKKezMb?_!*MExtd~`s8V1=ER#B z9`V?T7a#}wJ!+C9OF^_JP=0Va5G56`swf~N%(M32P!|gPZr}p+2zB zfYgf5{<3xVfz__;Y!~~0{kgJpoWF=SlZi+=Aq8O+bGTh+aUw+hp~_cg9kn=7=lu;4XhrM=vtXXmvMlgA#$){0kDDK-mnLO zCsD=@5XUtr1)gIH##b=sMLr1Nj-yX{LO%0*XZpN8Uw(ntFXpDFw^~{%V;URK-D%s^I8XdpVZ5o>M4QdR z>-zFYk3sntV=+yTn+{cI#TOlk>Uj;~Yu03>q-XMd_<@A^{k}z|rMo7T57m@4+eT+( zj5dxgkEtu4xVyA;%k=VEWqI_eX=J&wwtT{#&-BVa8%s7Q^#@7~;?0Sc4RzDf?GEMC zdhw{;shwN(hs5}e&68&9lz+9CtX1gumDm|x2*Al(`Fn%{j3I^>Iamn+N0~mcL}M6f z_5)AZ@QI=dqS}BtG5L5i`14-ox=)?ib@b>zzdL&5$kFfqdGzSgEt{Wsa?2L+t0$k> zyoJ1WYiUSNG=$d&8v~;_zO4mwT-HclXd5mdSon8Gj~!!Q;oE;czGdsyEssA%44XHL z@2g*e61PeG;f1^T);2*gs*UeG|G%s|RI#bx&Z>in?d-rE>Yyd2(UKY_VKupC|A$XI}!|FU7~KMlyu{6r(1u&sNG8%u*=k&5E9x zf3Utf{o2NX$qoL`tQ^3S^kEey8>d2w^&FOpavq@MJc*Rr)${nmIH%&Ob|$+nEdzmG~7nBh!i;`fTpQ z&oBdsoiKoCG_T96-9F6nx=<$c{eK4r5P8pV?rdfNF~0XZ@>=1fT=y7l!SuZ4jAy?A z^fM?tgH%suXfcygyAo;)cHuOAwFVd_Z_w+;QY7aaClJPTqL@Sy&KkeYeTLsdc5? zDKSA@e8$cX-}_D5I29=*q@9gjidD4&mLh+P*2(9Du)#n=5ZIs^Fx&*o$E35UAgUJ* zGJ>gq7{>qxjN30R6~CHEw%>biPFAz{#j5?Jar1<|DPkdM&XA8f^y%;fGWOPk3bOpJ zXUJwkrs@?1hGVW>eCE4?-oom_q!?+15@s!xZ*lg74vGbGoSm7wv z{%prE%Bg?~hb;;l+{Oj-qYNCt14fQ1bTLkZ={ZQ(sG%gi?L!U7Zn-AEdu8|ZO)ve4 zta$u!x^2eFm2N*CZ5%mlo_FrBksDXKfAP*6HgeRcu4SV}jU2|8#JRifJF#Sf?r8|4 z9)Duo)7ptkPTbe!jgKpZXULxYXmcjqOv{b z5AYR28Rj31M<#8SG|$U%EgVdm9yy8pYi;Y2x}#6DR&*)B1^%BJ;Ox-TL$? zkg2K*S zDPIFW6f#Jo*(RN#T5m#{(<^Bf3_i&a6tbqp#>m6Q3imzKSBx{O#(6Af%_B z-nw<$LV9>itN88j$B!qv)-fC3p8ndO$xQmTe&*VzPP1y9erhe`HxyRY`}s$O9O$sJ zve7{bIqL~)IOI1+g?vG#m4_Z9KA3GOjI4j@En~Y74}NUhs@3DhC=KgQl83KcOV?d_ z@4cgmLwtWOxpIN{Nuxr}dB!r@Ey4xu*tQ?V<~3{9KFFP1w^kt^MhtYWxMl(Ih+mJm z_XNWu0`D7X{8r((v|eMjM!h`&n;@prDK(#YB4$f0^68>x^x@*pVa+?gzw5;E6*FGn zwX3I|CX->q&alqyq{n~k>NW`78eL1W@>NWb;ljEcHh2m;rd-w1FxDjW5|$Q{E}Tqj_eYzp0Q&2iIH!1(v=Gq zR4+c%JZzCTQR>So*#>^6&;oeEPX+5s#!shM1pN zn+2Fq0M*3$HG0oneqfkhc%92o5X8sx^r>lq@jYTN=Dxe z;qU5dH+Ockx>DI2vNY}&^p^>8MeH3S+_p3TT*jz19aFtxM3-UERm&^%o z8wRE?3-uLjurpgU@PsBwHUZTJ_QptyUtTdTwPEtWB{NCPM1kjoi6my$;(?PJQpPWT znNlsiRXnqE@%F{HM%vOno^*QnR^03)36XJ;@6ev$`Jeb3pjV-U_AYQk9@W?dPf|wn zEp7_HN*ID69z_szj1&hGLS#B~;lYC+-gIMUd(pt5-8&|%X*ZZWt_2_6eCVTvPOr%@ zb=~+KyTX;l^!G>pdFP$~JkrJIg|6AzdR{h0ueG~Z96R>yx5tjHaK~x%V~DJE=QSbl z^;oNDuvU3RlH9VfALN}Z$U1h6EncS(gvL(@Mz#TxwRszH&<%3|RLSuEgn3S@cwje;KSjfd0=T;@gPy7G_YdDWadman*T zWXTJnwPD`8{qyF227z1p%0G(XzBkX)b=~)Nci$^!5P!;&rex2w8@8T0C4M=%b}-#4 zz3HaIXdq=#QxaZnJ9TQ?mPtcu8QzsbU+)^=gqn>KnWQs{3fin@sj^U@1}$dJf24jg zMMFkom}5_XO}FSZMxQ}5Lw-`den6b#%7Ft59gdezAKdrEd2VU>=%NKvMz8AGy?DX; zRI5|x&YV8|`P5i@=8VM)EW=1e{<_M_B8OvbWfkq%apKg0!{XqBbGgRySshdECbu13 zx@U7|aCK<(6N9Ivq>P@GlN&5(Pt7bRPob))d$#x)bVXJ}2c20}Lb4{U@)EJj0XTzy ziDl|pQrKSXR|gQW7F4K!?M_G+uvfH|K?x%Sr3r;wPM*wcN!%997~me4lMY$mjHRxE zCEc4w%c(ncLdI-sT;gi&tl8}?4#QgV?McYEEYtYa*G*}=Y0Vw`C$^n}0lu66 z43ZEJ8}|@Gx`O$=r~(Rr2SE?u3&6AGDyY>+K5*_WvRz!aV|f=A=6} z-+OE1oK(L;=;&R~Kg%p`011~R7qb&)V#NFiuzT*W;zZis`9x>r+GaXioIuTdUDrqw z`2%_ORUDp)OdL&b?gCsbkP|+NxX%G-g#kBAjIW7~GS)~)1Vd&J9FRao0SyH67y$$_ zSiuJQ18$nvS`|C?ruLOfmaJ~~&RDp0Rr{#af}F(l!rH}imaTXBeeQM=S3i5bLRhzw zeAcd9&Hr6~cUuPZsR zwXv#ZMOl-{zoIOVV)T5+`#%|;tj7B$gTE^&ag6jjkYe^pU$FON^Aicvrsd^Ln-=$h z_xU-Y(CqfS{PyQ-Nb?g3?d|#b?d^E}!kjRk=NC+S0X8^9HUVpeMS=%DOJxLBn+o79 zV$Kp9;su+`VHpR_BNGWA&hMXJOZaXN(b~lb;o`*a_k5S|m-z2@i{IO^(IZA2M6>7n zcv{biZ;GEFz%McEgGNXJCw?lvNm7WN6JHYlxljBCu1pE^J=vHSpyed+JNY$O&pSb9 zN5IxX22ls-5Vo`!UBc!qQ)OZrl`PP@G|vzWA_8At(OoKlF{)K2F$B@A0Y=XfAx4Yp zbKxVSv{9DVmyM3ld_v*_h07LHmJcw(B6ALrn~Vd>Di)R$4+uE0qjd+Zj;wSh28WN> z*IZhZU{`BfTAEv0G-`W7aY^&O5yK0ToMNllV>G+X_;2)>>1P~uS)65^Wn~MJV&w9e zqy=TTaavrI6DvRcRD6f{)W+1k!&~+Zv(xxot(;2@4ICIsh014cJhczo*D`!>s!=Vz z!!3w)#^S#Th6!v72D8v8EWo>{ z=EY0y*rr}@O3n3hh!i{x{87rLvj56!&^FXqXT-Z?~NO|{}bm+@dqxz3tuv!>XnXSXY#*itOG@w4qTBXWQ72|>^q4DouM!)S=t$>m?o+yzr+ zy*^&2kH=9DpF=}hv16f2)Zx7@-eAzm<>FWMUY$m3FgWzO1ifAtqxrabwNj;v*Bcx< zJk)DBj?>UuYrtX&SaS_xH+2jKkBR>tN8~hJWb?s@CpKVBHAlA5u-6%VSE-47LAJ&_ zqo37^2gMQO*n7tYWZmprwTkdgay6`@<52(#HlQ%E(@qD$`Z+$4RTYQGQ?YQWg3AP* zE+H{q$LijcT@^UhW4MA?-qckNoaf%L3jwR7{i8**~Ext$|MbVi#Se~o8b7FGk5I$S zotv)HBo`D{asx}s+%YPh-Rbs}x!q+Rx6`gy#<Ec(u5>JKOUEwLn6#v0z=cLFmJ9HIGp&=PNNkCc!&LJ{#pEgvAyk!GMuB zzyJ_XK=ubto9T4e6cCtzabPMeLCzMd@VH9}roMn2J1Gh);1*Uecv^WIG7ldAuF9^r?2O8H5sfJlI2^Y^el7?#RiE{ojf9AJsgdD3XO735Q>yG*FA}4p4`|R zuW?B1h{l9@wowB!U;(S5&nCnEigOyveI7l}#Wqgvm?i!kiOe(f&WiUGAA-j_EL4GFIp^1>Ew*gKP3F@UY@^J56A2DImfdbIFfJeO-z2q&5PE2o? zK}b^IRe(EUvk8MPc`m&^HN8G9y&*NFzE)$2(O6)s7NfRm$myPs%T(R-5|XS2XGKx0 zH8#fRDoRc&cIma|SX*IbveBB5IB%t@hRZ2VwE7VZDJd^#Vq;=r zH8HSXvi4{hho8Re-6Dg=l2}+)wlFzHp|>QJ4{$mMlqXsAikReuWo3nl7LB3k-DT^Hr7Xqd)%gY##W6a@{2@7upK8VZVvXBCEmK0D^pC#fTHG%-H6p>fC10iih9oi{WL zZD`P_td3CO&>f8pISGm4Qj^nQavF_Jlfh{s>0-`R&uTU4**POKGcpn_^cb}yre|c0 z$j#2sXrI9?mlT^gpkqMM%mlSuu1=U)gqy_JB#w%c-*`j(h8R=^|MvQZ?R8e-$kYln zkXKro7l7M~Ob4;nZEvXG4oyJu8!p$BY&0gDj822W8M$-k&Z`BbeN=XKYqrf8NAZg@ z+HjLS%B~c^)rVk5bpW)iR#p$({J)%iT?qf-vg~M3+cRvo3>%+yDy>Ry%ZRh3Ls4bF zCrs?=R$GRhhLiXDY#G+Lbh~O$-K!pZy3L+$k7>R#QcZV6?xl^9d$~%|U`w-F(`*Gs zv7HvzVgAHy>P?6oq6h2&Tbjj^X3H=~+UXd-+sYDJYqXJ<$nWAk(a-9|&0-OG=5TrW zw-pspI&}^Bv{JO2`9NZx+-1_-feM@d>kNZfeLsPjTJ!RU+uoTlbm)Yh(G!?T^Mp6H zQAf|c+`aYnJ!i*`sFroJTsG(Pod*0=e`D=ERdl> zk{5~p&Flfc&wgy+Uzj||5r+a3go_ZDr#w1AlzUv|m>?`xdzqI_97)+Kxx?{c&kyff zzS_Qh;`Z(24mJ%W6%}$Gys1*50l#T zGt*k9;eQl{GoahpAvht!%fej9Lg9hdW8n?;swlmev8|IpxR>6uiNGc)6+p=xW)g5R z0=@rGFyJOO-keX#Pocp>>nwga5Bh7M=k6FXPg6Q)`1rI5?Y7aHw9%?ES6l8ioWfM< z6Gk|v#i`2VA+kG*)CyGrzTUkpFnEoYh;Q_Kn47nq$Yx$AU(dG!P>(CEahdGN$yaPr%d@ht{HnsJu_u*QRj+VslzMw|4V!LjlI;eC#=WAt zsx-;2HB@|cWi}H=$<{zFI1GERSaCB6Z?7^1)>R(x25_REZ;m`roc-2drBK{*!>-mOq2Z%}u|?wXih=6CJ|-52 z>CCJ4-ZkAP{z-fPBM1*%wxK(D=Qx|VJK0ik?4hd$Fg(Ma0P0r(cqlQ0!g9(YQ}|IO z6;Ef8H^eH3Mx0kf{whu&hskXS5ZM$tC`2AkP*L4rHFZYbkGw;DezmcB$s7c!jSae)1v04=F-v{!&6P> zW6t7dTWHl$VGteu!i^(hUkIfs2UT!2_S}1lg{I%9XH8n4Yr8F!cgHBT@R3qHJ4O&@ z5feRgTVeJS)oL3pE^Hg9IXp_w+R4dQ%Qo`Eg=UPWlIZRYiK@{s=BTgh(eskJZ!nC? znZj}~Pe2f+CCoaEoueJZ;)dh6XJ zP;#sI;Ou$VXDIF~TE4{<7q{og7d;i`q19*ufv&{{{u#g+?4Sf=wztG;25trRtrA2@ z@$C~mlqS}VnSX4iOW-&lUq9+ zmg_TJ*Hyo1%d-ii?i`Rkce7bIk(G1TaJBqng?I*gI33U`IeYtn>{C^0VcZ_)?W6SK z*K2N9bIQBJ%Nvrvvj(TkpL+vLUmgr_N^U`0xp(hi-Qk`cwkB?viQyR!I;Y@&2YROi zKbnD=AFC>;#X>j%wg~@1zDsX~OK;7R$rwC*NTd>;)#Tt`onU71Em;+_lpL1F*fs<- z{8l2wTtROaVr=VEG~8BVkGX=}CaCdF%Wd^;KCoB(T6|0Vdhh);3HuWIg?a_goEX+x%UKGFC@*P-iverZqn!u`jGR^Bvi-O5+)TpAj;YPYy7Wmi+< zuIA=ljZM2!T!rPE{~zYw13ZrE>KoUcva@}6w)fTczUo>vOR~CTNtWf_yDi(;#tq{F zu3%$h8)9sFXn{}?s$(Fe7(xhv5K0nCfB*rKkU#?DBL%GS_q(%_B^yKDH_!Kfp1)So z&YhXt&pr3tQ@6IZZr$5Z6+nl`+JXQ(m%m%~UjwN*rk^5A*;5|k4qICkk7fc-ySShE zXG00%ZsCiz>r(7R-Ys^njyp(U?$&|;SA_hKc0lSrB=7@jpi>@$H4&7%pvqNh7n#a_ zrSrCT*KwZeSEky3UGe_YwwV+8yA_eL+NNEX&GZ$GZ)%P?Pnxbsesim}jzbJe(7$uJ zrTpzUBNY%HZIcf@a?`{}zNG*%>eEjouQ8W1-z)q1w<8mJ2ERDi;C%Mx#H4Zj?LX$e z$bBPzJ-5-q=GYf+I%(fgA$&tvSI9PS2k0C#==WCc1lFNL=7P~mz)8sgm4Pz?DKBk3 z%7+GI1@}Yth9poMZ0Z zzFjV#v=l_x1CR$%PmFYgMA-k>>>%k(aqKO7Uop86S+<<)*Isiz^fym# zc$@uHT0N2Bcb+s#56mI{+my7uF^$^2~W$*p}gx*UOcadX&0d!0Ja&`!ITwF zdHKJ9VGu(?MNZZRjlj!qL}dPv=Fex@^VgBJe43L!=41Tk&CG?H@lA}B4yX0LQ_Wl= zR7p3NZ|54MKfx0Svs-!;Uq#iIDyqriie2@@z_S0^MrsBhm2TKYAdn=`JC>k#?15D` zWS-FC!I7836EH~`F!%5kFgfKEc)_H~Ut!;+TA0WHon*8>6b({MI^<=NSKZWJVpUC< zLOi9N-#omIb(Y1p#LArPx;<>GPMRO2){qU3*hUiIsgL33#(*nbfdz7;T1bgunNAPs z6|mZ(Tn|}K#$LvTa1++!WuW+Q;78~q1&Ba8)Ku*U`zik0ph-zNA5_>1LiU&DWWq9$ zxuV~aNLZxrMU&B3ZJfkwV$noQ@$_-!iWSP^Pp_IaYv#;VPajvUSfN5{=FC~MR?SB;T)Ln1#rFf6i=d}`E7yzug@7k3!QtrvcXA_aK(B_^llw4p0hrBU<;%*%l{qT0 z9Rre=ZgF&K=xkQnt!Bt&LH8D6edp*t0X>EAKqM4Yi$fN zKi03|#)zKPs>>1^7biR<-1*(XpBjYeF^=oLOv7?KBknegH89=Wd_6ObY`liCc98cu zmbeSu496cayNy_HK-{QF>Q7IObG zh%BdG5K;b3w@bmi0v9$!`b5L*QXN&Ze^~yTRlU#ZUMMuwl=U@c*-`LeM8Oeh4vD=#H)(U zQSI8PuytKV4EXO6#s;`w(LJ%QK+PTDsvu|dgKnTJv`hqEpo#zis&@i6o;iC=P(aWD znHOk7s4Ir7v7D6>I58IdV5@~-j&l&!Q~8I$#>{v^-neM*;n^2~Z@Qz)_+Qwu}_oO>KnQZK;MfZE-Au^q$%_7V8Mp1R`63r+yQ!rvEq*)I?oOwpSI)o36AzI3rn=A?gEwaOL_~M5N#9=WE-6&? z{3%yeRx#k}e%Q4o77p`k9Ol*mW!Z}5rOH^U{qrj6<)Unq?SS#F>)~$amO@_9{dpBh z7TK}KU_4qd=LfhX_J}dyeJsRy6Tn|dF3)!&!eub@o+@3&S7a?rYv8%f&x#wR4u(!oQ<&)$+BgxM|)gb z0=%MUu!D-oe|pcQqE9AIgsN z78l2_A9%!@3Nss@Bx&i_9V=IMO24bE%T=%TOnB0>D+NaJCa1OQd}VGO&Nj)Sany~@ zJs(;m7TymKU><4h=O=e`OjK(o+I2@=Y;4}I|27!j&1 zBO46mtV3Mqk>SZJk^IMD`I_}HJB9`&i;B)ml{)IjGJI2f;=DzZ<}BK@)SVl=@xMhN zuV*J^GLy0=It=QTDDUlWZJxMc#gZ+`!8b-wNIaBBASo&PLA>eH&dcc(JGPr%y zNwIXKDi!47jk_-T<~OfOn@y!xFFEcR{LZ$Hh9dKQnJ#a(ICkxlW4>gFIT4k{!Ai_i zQ(IZJ%H8+4dq*-7Q*3lvI#(%kYtOGxCbC^bStmVJS`ue3AS+k8AD`gb5#)tF>EE@a zro@RIgGJv8(6@1*g<|kED)Yv^7U_L;mwNxpj_j?etE^h-?mK}FM5D9=9jk=gn)54E zatCUqr%Fl^>_)QcJon>$uASKO`lNr=l3LmUML{*}{H}q2R3mIZV(>cC0ZB9FN2cFE zMFl{r!E8rBS|&>?!CQa?N+!`@h+wnJL>Y|n=t&>uPjt5g0cK$-`4xhf?>y}VUW9{$ z)6QHMe}Psy)yZDvQumB63}5kc%lXC#vwJJksqxLx>@r%U&NA*E z28`Lb)5aV%Ij&_dZs)kyriO8Zt7@2?V18-j;sQ~b+19cDTxWQ~7Lrc9Ao{w~3hiIS zNtRdD#sAX!t%P$p=J`}9MmjmwB1m6|Q(oWA!8mnZI6R-ir!aKZ--=UJ1Q@LjD|i+> zBV*@>QXQ0$M{Lk3)ryh8xKNUY66)X~$c`F9l*a+P4bY>dIS{Qu9@IRgEwKfb*<(CN z{W4HWAUwe~gGZ4H9*37a?K#IvGLLpizudZ?l^(vo@sleDys=r9%*(=Jrm;?MG)ulm z73|tllP%hjs8y3cZJ5zz>G5k$J~yUXx!lHB&l75vlkH3S1uVDAlbyhbu1`2=S?L7J z32v+O!6i5H((#9CNOIdnaiV!-(fLgOjg07E6b}amMAaM1HBZjd&z@_)i~Ys2@P##* z_?(FNK)THQ!{8&Y{+Kz|%Fo}!X!(wwKA)=9&;E{%ml8ORgAL(QSvFM!sBZ$y%qzg5 zl3>87&UpwX`?CEW^t)?uvl59YZYn@9fc&F}fQlRl{}2T$5cHG?#7NVDL8Jjt`p~ep z;(0kjwL;WTnzMp60b?@y6hu9Uc`zAC$%8%8yIXFQes*s=iEfuR6ZHk#!bJa_R_Wsl z_epQw*-C!;m$)f4rr+|5npI{?O^ZFSj=4uS9r{_HFEvgWw_)(s=T|aJEprj4+Q2{; zv7Z0TVA?5e50m7b z_0q|W#8lo{$Xx4UVn6n(DjJ`dr@h$>eVMzQ;)0(wKg@(*Fj`d4>8#7czw9t@uM2#` zgUh(*xt>4-bVHucL}O;zK~?8ux`ArzVPF2zXyOzJu!9c}n9o5l42PizX;21X0(A%) z3q`&(+8nujWmnVIOUPnUd2GD&yNhm;p18l0q;`U!peZ#-u^s?Z*8n!S^2do-QJ3KI%p{6KA*#Ha@sVf62fP`e5t|iF&=>@s`QgXia6OEqx zL_;poY}t_HKGyG)=4!ggqYKYF@2Qnlo@B_zbY61h?g)Hcgts0d&unL>DWq?Owg|me zs8F0(|AjlZ@~5lLTU4I-QAJJXC7qp3hhd1yV&(HV-^|5K$nnAeegI5*_>@_*7-P!s zjzwVsOv8%=$SJ+iZYeCZ+KhU=!EP<|TkS@@RL@O48D{65yqPJNZ=Ctk;3wRSFYegN zE|AYt!}S$G4}fyqzpBQsx=q7hDLG^Dn|fEI16s(f@8D=@|^$AM^N~x5&th%&;Mp* z;Wg&#&;#o^2e?Vyr$>HdO^%G`$h~u})2GidS0e~V-n;9dS8{}#avFv=791)#48Gl0 z&cav0E3CB7xw8LX!#(rIa}Hy%-rxZ4wa`^Oa&?XY|9`ncnAFIWeeD&=p5w7pFmm%8 z6E(7^n8uM8PhXvUcVsDHufom=`P6!FW96921Rng23q>FMN>O^q zccRR|6~uVmQK;m;CVhPLTCnS{x#VLae0<4eA8+6G=^o}$SJvssy4)FuGsCSvEd5n_ zS^D(qtKr@)Nlb?apW6NLZv5{0`_7$zzo9hibY@G791egM_OmSZ&)c|7Lv5-AO#P2r z6^7QXg|;tC$}9gjO&t6~N!I1cxM-8PP5;B@-svbBYC77@j2cVV*=-)yFO;=kztk@B zpd;gUWgSjBUgsFBC8z7b2w~1n{R88(9OFaJT4#;U88wA5gF{NTLB-csJGcf7zyP?i zB^hq{mj+-|6E=-Z7XigC!0O^CT7~Fl)<8d(`Qlec57BvKMm-bqPb2gV@{rWSY^MK@ z9y)|KnS!H`)zos2f$u@bt&+>Z_$DfVtdCKqS0&iMq9P2ve-hb4w!d=Uj}E>EQ~ zAM@P(zxcr)r3K&UW!$O9LgeGXk{v;2TqE_ZVvCm*|flX zcA3YU$cIgD{_u@w|1CA$IEni>o3)27xv*w%#n{(cB&a~p{4tzu@8;sNeO`?6oOAXZ zyeSQR+srWm$B!cDtH*Lo%{hpPwaY! zJo&fX2QKk1@b5mj`)_}}(;03v2v= z>Oio%&{q?9MByuBSYC127i~ICyZzs7eC>+qb7|}aEA&&U7FSd*s;Mfm*+@cqrN4Vc z9mBSN?r2x*TQ8o&o+_*wX9LJAK?rT&ci8K)4538Vfe+ekw}v58`k1 z5EdIa(LvCK&fqkRvopGbQNRJ2h8?r#2>f~r#2O=TGXbX)c-cp&=L54n1p40&7CbU= z`mjM@Pd=b9M5-9a3ssg@bK8a@!et68*$urd-tN+ekC%3PTYEQhpo6_<5===Wc8w=mS|aa z`uqt+6``_lP&$TCVA2jF*P)oQDb`8e*e=z=YtHqzI&_`5ht$)jpe^$V&(=9v}^bOJRE%{pGel|NQe( z3;r?p-JJAa`8*R2?QCz`(ZT#;@bl-GjvWVfMndG5*E&+S#G^l)KmUiZCz+LlhpVgQ z|IEJ&O}@b+W!d72in;JFGkA6R+=`0gY#Flx>cOG)>p%T;J@B3ly2_7nEASnpcyIIx zkuG6?Y0N~-Ar|(s@KY5slb82hkceDe<<=F>opWcsvu4GXBQw6kKG;6D;gzN2<;Hm( zT)JN2+gdXwm0q4s*IimUzNqvy@X{o&R7ZV|$bU})ZkU2Dz|9`uL>=T)1!w9=o2_NG z${fOdQ5kD48fFm)BJbD@NQLgN6n#9O?n|cn(%IfrqVHS$B~M)~Edo0w5(gmk^xXUE z#fs{RmhPU*uH4_-(^ASMruL@Oy;J*=Nona`a%bR~J-au)e8Zu27sL6@E80B@e{}EF z`?|XJUA;F7Ln6AzL0^M=2>7o7CnTH;3&7#Q+Qxbx`VV)k7#^%=`rkkls2rF8a_^!4 zVEN#f4;(@NHxN@HjLQovjS7nb5q~O6nb!7@tGaSleR*lzbG}bEm*eK@eCK=OrRDXr zDyv-~Jg%uY_v4Bh*KeiQVCNot@$KG~y}c{BUvb+t&dHJTm8mjaYgdJ@##`Cdsw+#a zERRfbXt(kFHmzgQ@Z(Bvjjw_}PM=2~Yqp;%cu9Kgg%?O{)~cSKRXw!-2CQW*_iesG z*26P_%J#r6BMN^E#gGZrU{qQlMY|Gj(wzZ5{NN*&;fCs5v2(GC=f3J;P z$@25kq&zs8v6eHrM7k_~@@;!~eorXqpFc@V>YLhhTa&PA(w=(N+UXmM?Tb{wWKKWZTRAzrK^(KHcB9a= zt$VYoe$TAM_Tr5*%9^t!O-&`)=6Ek*RKWI~z@E{`QJyGyX z0U{^UwPhV5Ua5T*pcyO8mc#Z30XU`r!f)J)(FvgXAM}G4guE>%ogjQL8TrY=yYLzW zaWkZ8c1lDIF`uwS(gF|$h`OJUIZ=xIB+6yVd@^`{07p7+Fjt8cMoXk^pf$+#QrSGM z54Gb-MY){96ZufeMb(YGkWD7DB+CmWr5=y>-m+pP=kj*cN!i4dMO8Jb@7A~7GZ*G4XLOf&{ zQopOcv$K7dD;U&)MPh`%|MK!2z6|zImgBq!)0k>En7ckEe1#V^u zy#s)wT1L3Z0=xjBRJRCk%YN!8T!Ge-eGTDJl)^yXa0bplk(2Hx6u*F8lWU0L=uZ_I zPn!WMa-)uK^@O=DSRBhJ*>qtdd8!~36N=5`Hie~vWg{ebsvsGOq*-kuoeut~-R0?> z&M-G$)fr0#uONql;W*!Q_!h!U@Aa6*+r`ontH+ln+Uj)qn29!zr>7>DuF;Z=&toYm z6*Dt$pE=|9nX~VhI_(arbN~3B{o}g#_w-)QlpZ{+^H1M$WR_F6;GyQJq@`==*rtW& z=ep-K^^or3s}^Y7vyN<-9nc*njs1~v40GN9qZqIm#-}#^hLGQEOpQmhssS9l&SRKy z;Xb!-#))Y$e`AZfxF%utZQST1retlgx)mOKr=6JL+j#8unKN%c_U)N7+q*8mW?xUw zzH2V;0yP|j?*Dx_f6!>^R>+nLpc-xs#6ksjd{q<(rB+xkvz6wv@CUP+XKKFKp-?at zMk&rdELG}r5tA`y3hQCG2x~@ID!RD%7w;%QAFeuiw^qS+>?@YK$@i0kf7Ck-2B$v% z9~HuPx{~YUgF_mFR$?jRtaiws5b7_4z$RQ$YaV=~kMs*CpVBgw1JdJqgeEd8q-cGo zwtnz#vx3oT>c<-DX<2{A2LBd(g7QcN%rv&gy=21=ejx3CjDJru1`h{Pw)jhFW^8HG~WQXY39DPvijA!M|dM~*PT zrU;R?NX}1P9S10PKLEQ<8RsFNthV z>^8Fz6{}4Km)$j#atao`QEM=m5lc;LG~4I{mr=x9S_4$nU1lx9)oHSUl}*KSY2k9o zv^x9^)kx>2hBRhDs8VWmA*a*nl@khvbBmkDOREiP zg+|5kD#55V>b+_WVjFU5-mEd|j}1Rk>oCNKTe{UaTmC`P!%a2mqeDYHHOZFMiOr8F;j#K$&kFRV*Ie zNb22cxC<1ZBQm`kiOQRT+z5HNXldj|CC@7rVpT)d?{|9aI-O4AHWzvWg+8yttwNyU z`C~r5zF|&GVWs{-t%}5~hU-5bGe5xVbatmF;0?JwcCQM#oaUf6kgaMk{@5ZYfhDmK zC~!d&0<||4h7#v|5)2yPwIGkD^oIXgf@ob!+%QvDa@b__E?cS1W)juFSTy0xHnhU% zn0J_Wl8NLNZ)4?=lS{N%2j=!MS*OjVH{nIKXtE)joZyrin3VnWNM)l}+Is~2M#KkG z@a*sfbB#i&<~hNpQQ6I2SCh-`HUXoOA1|Ra&d^&_N}Fombb-btVK@ z-nzXO#DCUk%noP7?)NwxW<-KiJP-9~xUH6dQ3s9lMN=H^a^$izlFS*eN^mg^{Dwt~ z?MS8Id4*~?h2Wo;o{>Ziqh4)LCwZuBs|BOlXtS6^omQ#D7G|^9H^pK4B%I?Ech`PEe<~l;N0?p zcJ4;*7(B&pFZc%5>d5K=UL1i;3h$#x5S#=@ZF3{&H4oWXs#(O%MQ*wi%HebKE1EtY z*-b-1yA1g`Y?1kl&}A6fE@f&;Uf5(ai&*tay+NF?V$t-e?OmZzC^)Wl`n1LKXXaDZ z!ro*e5t}@I>C!c81{O@3kfNyxi?53bue+Ii&bM#&kR_GJS z(jvcY=A?GJ(PC2s%6yi%%Hhu>Odf?n6LLhXb`~IJ)T+XPn9HLSbn#?y6!=vEYQ2H` z4&u8Sz`;pFBWzj0Wtc6BS93#qBM=09Fu=|PZYn4)HRF5*Z@u{;rYxB}LOP95&qQ#D zI6H!s=uzs-xsRQd`D|=V!o?1reM_M?xSU~w;vgKq|u1=%Ex7&14}opUA|!Yq*Nx8oQ%|l3y_+afw~UPBV!8cum{ehI+$j-hc5$o zN7*u1gdl1g{lgdntEXUjVhzcEArp2+A(ZQP7mr)D@|F1ZSyNUwj$7BZ_Nj`n!x64{ zYHi!PagD2|%-SA*W#y`I#mpEV`>m_h!VAQ(rfz=S5wk9!Gatd#8lrqfsXBTa-HUl} z_11CUV2{ccKS7+y(H;^BAdnIF@p6<^*fli$oP{R$ar31 z^SByZus#cucIi;t7xo)d2-&3FLQUN(&Bcx_ATfwBdsnMPU>H`I#X+lZRvZ zSSF)4+@>FjuH=APLkYUhqG%buK$zr_A$>$EhsPo`8!CXb?wq+Y2K~2uDRdF#8-&tu zZ#Z2X3Pll5{5VV7=I z5wB7O1CC;=VN2&f>_L;a!xviOSZP>aT7SggPUkxOO`Tb$wy0{RBYm@-*QqoU{4+Nv zK!oxtXV#W@abk71S}?Fw`!xy8Pp3(#P?-u{230H-_m)RoOuXE#E7bFxPDoDEDb1#O ztxClq^q@M&dd4P9_bF97kAe$Skt_D9 zwU9Sr?#n1xg%I_OJ~!vHAus`MRz@hXOS!Q!l^!mHox(UP%}@qF&>-ErhQAzY81(~i6?Y+Q}Ff{$F#EGd;Z)Fbqs7?bQ%xwl=%u(N)_j7=@~bJxArfZ z-d)*pWbX8PnmYGan6m*JTm!~pE80B}?^E96)PmjIX6_E~vfSWpB_N}li1P5R=%On8o2zGb6k%SKXW z82n=Jy`v2Gswhn%S*4o1G&m{k*6PXav!t0kGeb;Db2}3T5wHt$^u*0%{%&3~3RtJ=v_Zzd61Fk^1axE`U8EmJ85< z3UK(d2EueeAitAw97U5uf=`6TrEh`2WO!D2#1IY}jwo54Ir)d?=H{(inc3uSY0BVj zTmMWxG&u)<&rAtPZu0)%2E5LL^TR6`2^y^qm*6|lzbPFii&3_pr?B!EVCBs( z!3ug#4`*sgyy5AG}ST zJYK0003rYsdiYiVa4@kt1Gx*6uadId6x=1n7F#A=V}4xVlsfg`ZJLc+G#kHr^Q#Ph zWbpmL&rb{>Vj;k4HK1_jEOI-b@K1n2od(B51%*4U8izO(jME>dRJ}p&t_09hIAIEE z5nlW#I~&%t&ESxg$7~Va8leoXAsUh59eiZgSH#MPg-W0KOMo{m_ zjRYk(%?GAHy@(VGqBf%+QEw_hjlKml!szXL{1;gMfS0V&WK~(aO7pG5JZBttY zpIZ^RBwcJNZ5T6!IY=v6cI{Y!u^1eKTYl1P*KE0AL&^hOV-Oz$-1?28I1)$;3mMY>RDy56~yzA z^q%zoN5mt&_YrX;$^4Wi-SR);{z!Ts_vA8mo%)dL<$fglV4+|)g3K|8)RTye+2wIn zu=4oIn4J>f!)qDyEU##Mvp-kr^m)P+Em}<7@&GsY&rn;MY_^;g6iIO$;#qB)g@p(!0`D zvYU9BLr^{4Pc{$}xd1q_8ag-Ea7&QKKy!_185|=pPmq_T#FuIrIMN%ZaNQ%kL(md&TX&$*5(SvUxMdWniW>i>k zJ#>>2(7Tb_JW@OJESV$S`jT`jne!5R;-x_w^XHey9MpL+Yy~F5kA(rW66AhR@I(AI zIN_wcjf71`GacFOnU319j95OyDeXfTyUP?;S4~-fi6FrnEEtAn$T-2_fK8K<*Q#8A~ zwIx>;@I<2?e?@tF)A-pQUu9WG{X}-f#QKi1s;b%Jo7&4O{PcxDSw&lG_wWlRkK|uq zIIpLww6kt9yL?hzTVbhzmws~J)c52o?yp!WPf0(O7ZuD&Cw%bdKY#GS zH50D6MtbVn3DVh(WLU$f_0#8xQlpkM;LWgLf{Mgb*I3!VY zJBAWbGNu}$p30c!nm{5sGnoj~I1bFJnBEPBPq=$}#jFF4uX@1D{K_|-2WHYDz??%7 zGY>dV7eVn1De#>78}~i#vVvVmL}j%VKt*2jRi;?-IxYYOIl7AMCIoW5ymL93mdUFy zQdpBUnPB`z!G$Wu;Dc_C6qheue(Q85$~QP&97<;*TH#irG}xSQ;@aSF=pmz>`>iTk4n?XtBtSXboeO6X`p+RdT z|3WBAA`dsGHCuo{*<0pHn6RMiov= zV44gjj~ctW-)9iLj&vxUiX_}#(SVd-Q5XvKhO$7~saENgzGyU=3B|k~lhJ7Mcw?aq zOrCv8y-MwmhKmgrmr7?Ad`6nnod{12=Zi7=1hYlTlgB>!wY1dt>2r3QY#jgEqMY?`yOsrO%HRJ893u zC`K+*iJtonbi*pJpL(DBKDU=(9~+W#f0YpP`jBJdyH5pP6T5 zW-$-&-7tEhho*`~0sh)ddGHuL{iC2|WWMQ|t&n52j3%pw+KC!QWg0ro$nBQ9kq4+V z`hft&6~oP?N2QU9P|v7L%z)iw)f*_s+n_W+Tw}5rY_`KygE

N6xp-sv+ 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 M0SAJ>%O>U%7o0(QP-hYQ9&*6N8lriI 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 literal 0 HcmV?d00001 diff --git a/vendor/fyne.io/fyne/v2/theme/font/EmojiOneColor.otf b/vendor/fyne.io/fyne/v2/theme/font/EmojiOneColor.otf new file mode 100644 index 0000000000000000000000000000000000000000..f76d8b6c7aa197753acf63b278ae0f36c261a7e5 GIT binary patch literal 4232712 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 G9ix=t)e%* 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

    k#bL(bk_!=0Si2 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

    HA0 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

    ?qYD?r&Pg`Q3Ci2S=tfj*fa?ymMv> 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∨ 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:>xD_565%m;2i`z#hM`^FC9%*HC;QZDQjSq=Z7?0}Pe zEjt}~*7!bxdnsE5vlPB=olLmZ62|dY>sDU@nKM~i1ni;{s?_8tC$>EwM{^7&Gkqd+ zbDVWDRSLVZY3~tT8bvjUQ@6JRtckihKv4EEdiK!H`VxG+FR?LQ0R?1MxmA7VQfgQIEPEPJHv`Bk# zK`uG3WrWjLFXJD?5PR`3zAon6*we*WH+_|tTNd$kvDmL(#cpD~D%#Bu;iE&u=lCjx z6(qLWj&9Jo8NPIm^%Y9^h3-;V%FtYhC`Yoia;hd}F=k2HD!3FX=8jT6!DwbKt=w!f zgZmg8`GTG%kR_(2kv~&BOlUUQDNkhuESkuunyBOdFku2Er(z|6!s?{C$X(O1v1JV? zDHKjTGmku^;^ z0c)F03}PrIWD&0E*u(SZAy@Gc_*23S&JhMn%Ui!Ez+qt95r~78f%o2h6_N_e>KklM zW1LP_H05cj{THiM;h81UVJ2)ar3zdh9lwVh6+3ClQ_x&{&#*VrzT_JPC2?3p>q7L}=1CZjqY_9~vkgVM!g0uZ@Hv+mYgr*?7RJ#NKst z?Pk0d&ef62Mkdj|)V^;vDg2mL;=>a5@S)by%J6HvJC1aGPW(GoW;e}P&JWpu#;c;_ z$oY^RxmRI15}#^lxY%1>>?7AjcQ9f-I>18LPyo_FUUQwWfnvf4;p_IL9jkq6DpQDX|KLjmd9%pt5t<7YC%3z2qUTbD%~#<_|c&iHNaI9WvIT>FnPTeU(h z7d@Al0>(+O`p=wTn5Mh6%3Q!M2@|Hq)M>{!uHgrO98q?Phflpd3mg!F90>(MeEFft zSh=)YWXDTv1LuCa_7eQ!p9aHR&DS6fB~a!uCMzfc<)ya3S+1yj6hZ*es;+OanWTvJ z=Z9IDj0u_+FHF+uzZ)5{7ca<(Q;5-S{46F;{V+ zShf-5-koizFQe0@%2s9SJy%%Sn_EMl$pB7I7$sRIWp_inD~3pR84%yH`TOCNgr{Xt z<|4T}v-Tw62&^=xMLRuwFr;En7$}XLkH=2cga)pXJlwu2l86mN%q18Rop7hLlG$aZ zcGQ4Mune+E4J?a#Ciu$ zyxpiz0pjN)^XDPByfYWF{JkiVw&?lq)bA&8*2)%7q0+AmS6 zRif-HP4XIdA*bnS1b;;0q^8_`eml)(aUkr|$C@Ij$Ao#roki<)DxCZ>44v=*wsida z9G??BSx8f9l&%lSfC>u(Wju3n=|N^kC-+ie6cj>IA%_@vlQ*a^09bT+%cGlq6l){p zHI?Omk?Ffi>LytHD~8l}CxtH=^qZ8XCL^*IF7Pi2mQDf>`IS6eIZnIoXHv3y5JKtr zfa5?)3#u}fm|$(%2n%Q6byLR8l~PH1fFR(=fC?nn6j zDVq5~1&IN8(uDs;peI$0v6^3ChTc$AxLFje$t&x|XTy5iGsv5L2J6JZq$i8*IqjHk zg1A@h(3OlVKMGMw6ZXd6c~dI>52^iNd5~$;$DFBGWs%R8Hr2_ec;NE#LTrNKzCb{N zuJo%S0yfJ}U0OtC=R3*|a@KO!mR;{Z-*^}b3{f*ynl3pbT z2B=$|goo}U$*&aif+Pw#ss$n`WtarEoTISvRu%ddEIjj7#A9U~?}hBm&ODy9$>2&5 zUu5ih+7c6J$UC4au5abl7sXE0QsD@@o&L{#$VBS#MttInRTfF6;7Lv=v`8fS^a10d z`7+_7TSx10m^=^hC8K1(o8bpI4)ayuc?RvDT_stG;05oi;3*Rtq5RbxvNbHMZ3^l0>5+$9=Uo%T(P3Jyd|ic!!enHF10es_pnVeiDo5l zhlxbk5>KjVoC$O`?+c8F_a^kaq#fxdxR{5pVm9$h{v-^21Mq@CUOh!Nv)cS7fHL1n-7?=1PPz1cJI|* zmOGJ9{LiKHgNQSw9q&laeF~zmb;mwZc_2%Hdl4^Mpj1jY`%?*Ldy@Na2!aDNm;D!D zT`y(}``Y1B-={3fId&Txr=@ni&y=q;8|8U2ML9aLb@q!|lNGs(63`~FpH#xMaIMH6 zNagQE%6cV@<@ITwv2lUjSZS)WzqP?H&SoR{2@DJz)X&C9dQAbMy?ymt6~p@xXb|~O zUR{f_Es68Va>G+MikE~*YC2N+-XohWU0)l^XzR(9=qNeG&jheW*k`A8KF)jHO`!mn zBqUFhIT9$e639VSnRFU zA8Tih%z}UxlKNF?uPFBT457a4u&pyQgN+SNT+WXe)PrcYjiLO_Ot22mTW?CLrafd- zN9`HtLLI@_mME?~bU`*Nh_z!){Mc8lg|$hw)Q-Wr`V5XvWa9Eo1Od)LP(t!m?j6fL z9x`9sS0kgsD+$10noD8RwV^D@LXT=+AwPCE?gEAz#@ItPE@4ep&g?4a;xR_cTWN`C zMhpxvdWk7OpUfm-s1M!3uG*Ow?8V>9qR0PLyi}B(@dL&KbX$6m?r%Gm%Qho!z_3M1T$ zFiEdCHGCUKF)Qb)vAAdA+OX>4`AoaU?OEG3hQ@xVR8|*BUh=#E?fMAN^y^6)u?O?P zTm)wBbY7{Y6Q5-E&l5?3S9Br4l4h~gJ@7T2Zd<<|bcY%Pf+ohGmYSyH%T)A72@p#_ zu!U`sjP7egdcV_Ry6S^@*?P1DxnUzFSnGM5A@-_Risp0eG0C1Ky^bSI`9-lf-{EWy zdTSKHZ>tJ$*Z@i5t9OkvzQ>GUQQbU2sO&RX)*m`^NFLb*6is!I4^*`oIL8H0LUl{FvPtFyR;u3DC$ zd$s2X!Wb1Z7&kIWk-;@`0@_2*=pDCs*`$iM+=lWFVdU!Fdiw(3+Rg`#jW8b zA(!=%=-DF+nut(1Lj1Z-Ni1cr7LQVuR}vR{`Uq)U^9V*vCPehk|NJ46x#r~1?bNaz{mCxawY)W!gyMCiu};3P@-z1xh9k=TQv#m zuQjqQQx$`@t{^Ec3J3 zh>kFf?IqPoGSdSj!KP-<<{AN!wHo0e z5d#O)K=d5h#6i&e%B2{&cB~^-Bc&%>aJC%A2R%&k6JP*lcd9GnFxeYqaCEUsod0LK)r*25&2NDjUtelnO2g(1) zF7OzZnbWRQt}0(yOjuuWf=&0m9fiNYgfi)!fkpm5yw|Prz-tuJlqG(t+n5^t0 zPy+ji_+pQMwz1Dcf1KDj?4KcIZZU)0oK!FRr3x*fWSAftJ^-4X@IKuch%3?FKvajf zEjSx4IICM~=N02yX+9FJ*Z_ozeZ1(VPQ1$W&toh7Wd9`k(4H zu#`mtv3N%=zBQqEdiL~KAxir-Xr%oVci9W(jOPs_N3ejOU@uGX@QNApIh~#6(upzw zldJ_vV|6K}PTUu~?+xsnR;kz{hXPb3hg&SavxAsL_DAQ?|5zvS?%4mu(rG=FdxHpL zATTKfQZwuwFB9~pczTCTSuz*&m**q%g*Cum?j`MV)gFu(7x(UJ0W;^~4 z)wg;HTdyE7h;>iVEzbJFEIK-@c&TkCHs)ep%;_GNEo*Tf)>mr`J2d*&>SZ)?r|N_u zpdmG@!k^$eqp+_dP{)LNiD!Bs#3atSuD>1ELckW!G(1RZ;OJr)V_YSLn(<4>iOipt z#|~)S5`?@kC;LeI0ovP<4+mwYwwClI01V?5NMuQ2%jFTshWGH{kO-blFlbwMm9Xt< zi3)Z%4z#K4*Qgqr@Q!rGHf=5O2X zA{6v%#uxp)AeWxTU4tOk7(KIqp1!KS^2S9Ha9ZnSIN!tktUKeOyZuWBh~4oYE8nuM5AfL8Z}hu{ zbFSG$*7%X-4B&8Eaj)!_{k#CN$Q~?jF9UE#<~H^}=$=Gjd;O&X(=gde`EpDuN^@gDa@)(eyjUdSZWYfeSZ{=diNyKBR`fvtefv!CCn$FA| zZcRaB!t9U`!)I0I$A~o8ikzLeTG;P0vQ3RyWV#eX@1|pnvMYHE?8osPNQ7+4MktFk zVrcIQvoHpWWc4e2L#f)wpSV|WND&{B&Vj#0N z^>0DzQ}1U!8CkS*xugYP_a4kH^EaaFtwehNdBsigH%ZkHYXF7<>z{)1dbYZC@BxET zn?uey(i*Aw+tfPJQ0gkR6IFqa4_1gnYqejMf#A%KkBgaiw7XoMY(+*R0nI+V^x*9$+iiyf zzbYwBIS!sGrd?>pCNx&hNNIVsC{X)(x7DY7H$wEL-g|Yb2xbej=7F;t)^mCtX2At1 zuQ6l*)X{ov$hzqLtk#Fp&JYog-dMYhqp(Kk_V=Z^l;37?!B8l0F?YAlEg_d8_86hu#smUtfuWNEBpXJ3Fwf@1XdoEJ+(^?4t5o* z-T;D@u*4G3%2pb=5y^JYnL`jH%{eP<-I`o*9D~1)n2POWG!xxPq6&KMKtOzaLUEmI zWZ9An{n>r?oRw3<>9VowF(J|KN%QtRu$SmT=I+?BCh<)0+cU4w$@Q{Xwv_LN1Z}pM z$^Fo7`v8K5`y5!VSt!uu%)3WOM$>_cV=r{_(SSlQo7Qy`v^;F#)Zzge%u;d=!E8LHSCR)ai730 zDe#UuEm{4J#k145mG8wfG`bB`u)0+Un~Htp?O9AQEPL%%1foMa7h{xmO%w05&PY;$ z7udv|gmy@jLkh>%#m|L2c;!S{DU#~GOUxUJwzD3+XgXjlWjgROw;w?8JG`KMUuxsw z;BG;>R}NXf%eQ?TXAV=_`Y=YLAou?!qC#VS@|<8WcMDg$fNUmd75vA!l9_ue z%o`H~Acd=?h1$2@K&ROIL0Mx}HswIcLE_#%!KHbpOt-#KR zIiN0uGn{u*Ifae>jjD4IicWbwt2gEv>pAMUqe&&@lY3PW(FaFbRf`R*7k9^0(IOKi z5Dbx3i$s4om{`e}g4!M=Z|Y25l2gYD;T&-M%r~7Ab`*)8DTRyWzO#@adoOp>7Xyd{J{Z>x3gTSXsObTuEmbqggq%9Yh{u zdJ6swd-CF*=yUfXNl7jBXanxu1a^WHrqIQEDGZSOEq861&Cps3>HgcuTD}ynY?8%q z-HqkG7vYYeSWfUdX{Cj{q-7xvqfKTQT7_<^T@UiW$Kn+%gNc&qo{;x(x=EH!#e8kG znwuCDr}dHhZS*^7F`r7m)Io1s?`(+LX|@eo;&jbJqW160^np~)sBfi%4^E<}g-E@yYu zu6WX+)AMLK`NaBb5phk=krZnvrtU%9+C>IAe55xlD$svOHSO7E0_VBCt1yeFkd4zs zV_igOtaA<@ss;4dUG~7hVclcy<0TbC{CB7bG}QWAVIes82oYG0UzG1}QcExjoFI&7 z2?(C7Vr(hP`Bn|>T*cc?kb=Ic*z||=yX4==FBu{qekYT-8h?_TxwD>tQasB~wc!5t zw@VLph<$sKyrOPMiByi`DI0~cgSqI%L^7Yr#`lI)l8I8R1_hh|L8N?A&0@-)Nqb;J0VU`9 zF%+EYu04uT{8*dYT8O^ZVCCdkZYld`5e1u|UnLP3S&PTEpE;yG|Kq+!;IZ;}Xm3RU zL_+L_lVtIil|p~=MHHE|*$UmujG@n2_sFqp0YkC(_q&Ycg+m<~DSMM+S3YNacp6vo z*0d3N-xr!XtY^%sejf%q4`BC2vMKTUj{tSVizv`H29*G zTfZmf^)&*498aQ)=qTAP`bsT3Zl#D3g<11C(|;H?_4%FoQj^0q&-8sln;^*Iyp=yep~(wZM`cNf{`h-e`#G`o_Sn0WuDkRnhC5b zZw%Bh_B9V~W>=Q6g+9abU`M;dMyzL$xUKp1d-7nrHJE7{3xTdHn6$Gj%!plg9 zLw@aUZ&^B}fblNm%v%(aJ`iu5KwkU+?{z(8wrcC6NpCC1+jQm}?D92YaG zmzP`nVy60@6$Q_;w{{AjYU~}$0xrg$8JP;7wA$5}#U>e4UQQ?XE-K?NW1)%GkpPnA zt=mw|B!)LrC=kvCCM`j*uOYKWH93xZ(x6E~dEnGpxP%$F|L%SI4$z z4RkZW-_ekhz7#`Hy#Fz}!DfhcqqKf^2g&Ni9(k$9SNML@+L$_ajT9&K-Pf;P#sG%8 z%SDp1zF1zwPIXc_S!g2-<+txocMq&yN*DUby6y0m1bW2g!)lnl;WnOhP1~*Xp`CX; zeb_hB%Y0xfPu)z~3$l2Kqixs}(YY#wK%ViFGB-{IhMMe9R_vW0G%j*z1;ogzUz#hg zY~7kyezxK!uk6%pa=?udV}cAixPb9WsDWgstb3^q3i2-2 z#ZUbGeJ)n=RxvaLB*LoOe;fh><U86MQJ%$K=fRoW@C9sr? z8?L|}W`8_CQ=yO7A1;-b{w@~9UC11=7wsb(iz$e@4ArU^J-jQwIO1gPep1oT83$Mn z^-WA2jvt98*Mlj1hs11DA;s`U;-BzbL+!?xm%%axO|^F@8!!_maeXx3Y~Ft-ljt^n z?7aye#4N%GL=?`zN@Aa`noRsQ<2ik836NqICS?enD?2&R1Xj|qbB9YI|K730aADL1 zSwJYaasS4S#H+^;L*ml{HO)B-BfEn9vq@?SFVzYslMH6<)30i2jR~{n+E} zTVu9G=P?LyItelFI<{#Kc|6k$4q!1%kha1Ab!DE$p7y=LP)9SE+G{tXaX-Uw7MjQ- zTxfUZkWAuFRAOGKr~||{n6jEtTqs^5AHUF!UwPvZ_uhe0WHdV0P@!lq^ucov#~ZoB z`yr29=x~y%b}HCTg^E--WFk`}3ff1_g5fH%LPbU?@<3pX^P}ZbZ9>P&4A6!@FFOifjTAvPhpX8D2W400!K8_v+ zXI~PcrX6vNlp~V>xpcpaG{d&VHFZB%0^Ig1P%-C5X-s{^^ZW5Ix_{&PA8WT}``_aO z31y%;Rveiz!yxH5aw!BJ?vhlRlrcsRbLA?q7r0u=GUF#Bk5-Y50JQMk+Eo#P?dphx zu#@Z{n+YlwrD=Dw$vXWyulpmy<|MZWuMu8-=YVmMa(eQZq3$@fGfj!_4py@XiSt;0 zpzckSe=rDWHKwj_jS36GYsy_tuyh(~y3}RA!}u zcTHSw0&nueZ(`2Kp39PANlz_O!R`h)m`+>Gt33XG+WEQ)oiL&I)Z35@^4a4GPWns& zcv$?cGv_l`Z;_bX1fwi~gKW&8BOfvRyNBnKJDk#~w@k=kf&eW$l7g2W`SM5kKvB;( z0qB>NaPB#s!2G$OHjXGei7egF+J4FpnRee#^MhF32UI9Qh4!exO%uQ|;A%+YS(W2_ zkMf(m$SY>fjQInCe-fIgz3-Vbyq=OP z?=qIgV^7V9zM^0_UmDp>-q+~fw~VWS2{h;T+EjvZ*Wv!!y*j}esJ@3{)xN)0;+bkL z(F>dSF?Z!8EM~zWYONIBB=MvlTbs8X%{<6$StBM!Nh?2u&B>nfpdCIye@NEkkI3H+ zXNki@dT&pC9|ynpGCt|qoh#wXv7A0FLq z+sS?Qx%hhEvIfA)PLA0Mh^ZE@h*gRCbsa@@zc#}mRb{6Tk^NLGE&?aT?*WjG@mCBP zRFDjrV-!(5%i4L%jNfIVDT;bb+VwQWaJlwB6RJyZ)8cdJiig_Y1Ni2_vkHf1hv;5}-d(vb^InE5Gsx}HlhbgP% zB^y!Fq?`bw9^ED|O=Y7{LytwI4nIblBh@=l>s4t?J?Tl2^&ep2SiBShWTPKLe_#ez zz$ppQO}|Bh$2QX7T{~9$yCI7>3Fq7-V`jdsd#-rpjXz6JX*M4Cl>REbQD{AZtU^Dl zcjkr58Ey+jtk)7!%mGvaKN);VN;rp+#H|eXUNSNTMsTPT7$pGTEh)^Zf z5<~%OfbA25TMiPw)ev>oYFIfQ+%PTY;zy39`Ho+2R`b0%ksz_WbPX{cTD5{_nd-X` z8pMbmTY5}+BB-I*;=N3a()1yW7YK2vc~7HyMw`cHXWXDPJY?u|VXT324Ads%LRQe; zIEg5R`3&nW$VXSABEFB9WUa`J^ava%482NCQc-FuJs~9&b@DbtwkQSVr`**F6I>u! zc6?#8M1_|T+-M?S8~>fEPz68_?IYidB8|RIxCU7fOVGoM%Fqg~6*PU3*}#$Kf-V0P zD{7=3GT|>c{R#A$*t;S8`@T#4l2(VR;R9aj2qBH(w>rBtyN z)_r?c@Gar%ABkRaNGgoF9-{rTh0g`VpL+riTB;Z^kKQC`#8-`2cBRHle}AUnDMe~% z?HXaC-_X-+3EQVoJlxPpR%SWmRAy^`wnMLbK zf6m{vTi>Iztr$=Q$;>iaXKD4kA$V_&{JK5Ig)s*MJV_38(pTh4fDOU!QUMxG<#TWE&F$c*q&)#cq@!y1?Q99QRb%!gvbOtR3ezDk zyvx26pB;UO-Ehc+dm7&?HANiJ`0v_0xf3?@wx|-jrH;NoQxUZ zK((VQo0vp1@6!)=b{XZQ43ge43>DrnbpBI-V=&cZ@#qp9AUMe)s9w=6IUakRtHNw9 z6_h$;*>4gu1k5eEN3iapRP{QKf3Cu35IarigxbW!iWZyJt5Znx~2*g8?X`@*?iGDnTg+E2=)Q;sk`{$=*o%N z(IH$tN-P>h8dkGRbKTSHfQZNVCQW+f+F>y=HQrcEGEo+!@tT&z6R{bIX`Z!D8QL>aax{s z5jZRhnwb3?0aMmn8Vf)%^|a( zIj8uZGq95eRTCrP(JWXwIW*G%HT)+p`OIWO*V}H60?7mS?PAZ_|EwGz5%ulY(QP>3 zJ3D1jV*`s=^a1jxhufO)0z*)*PWeIMmm~t@fAr_yQeOqoXOK8m)UfnmmA@*BLQT%FIRe$ zoz$f8mzrIaZY5%&pg9o)6#nF3Q!++}M4MmGXDDP(Y^ukOf@+K{92t{7kO zY!mmyf@y_D;5tb&iKJGge95;aTu1p{Cq*zqvU|t&~X^mx;6yyelb2 zCCXfTs_6LLEEEc6!VD7uAd=8SG`!5{P`1gRis^y}ke!Ls>MjSQE6LOF19^mg|B5Z< zc7fR&W46Kn38eO&MCjb1B%vlby)l7R3_-gXdy*t7Q3~=R+3&l|N}@g6tNLAz_rN{>x4W>tVKnPFVJ)Dqt0ei)aJ0WqaC2k1xA ztcSmnguX6vMQcj+N^!fW9Kl^9y&R`s#2~)A;la><%$q9GO65=`IJ8DZS{gJ`WMG&} z;78u^u>j=q&K%U~l27{mS^Aw45Kjy+%%@mYS6;#kCT0>N&1izdXVSlqSe)W zoevA*F~9Gx!k+VSZEkIQuBe1f_8#kTZy$(8D*gtm{kr}-6@0gKUqKUBWC|bBx^c+r z!?zQO_OP0*oCub_JJ&tL`jk=nP(C)SWIyL2899WH^_)p-FVt3G55OI;8A)L%W$nJ; zv{@HQn;=+x3cS>s<;7W?2~Y;D(EhrDLSUp+n?Xe@A88cHf9z0oA`x~oC|Rge&9@EZ zx#`QJIyZzV$+|eRAS6TnJ9?t^UawC0(Sq3I=JLrNCeEW4V(whGh9fTJ*{wE0H+xrb zhRSjLS+g;u+Ruq+>r-S^d!&B=gbpimaz9pvYKGz6{Qc@Ji>P>_B@F?r)a;CYs_K$0 zHhhnXP#1wqb%9g=n@;p4W{%@v9a)tYYJitpd=t-%Ks6bJt-;=lK5IWKx=5QIz^lqc zXOR*NX&;HEs#8(MQWH6IP}Ed$_Fn{glCV@hBq&!MIm-zI_Qp+j>?Zn?r6c! z7f7O_p5((ZYJ5|;8|k@X2sNsF!%V~&Un)rt%r7eRfB_;E`J8H-+;LR=2K6b$MU*X* zE7mSi(rO)EKmm67z*46TV<@%734WoZFZpL;SP!dq*-3h$n`m{Db}r_R(kaL^33qdE z=DNPP6NBU#9YAkiXf}yC7e@9Zj<#I)O z^#4}!br+xPHDU*DT}lqAk<7U@uYEuIA5=vLhbTKOl2;0H}~2)RI5>O|QSt=s5$;f92w+SdC530^gjranT>x0j`VKygoN1utRpty;4B za)p3A?do8T==7(#{GSu+m~~n3Pw?5~lFui-Ar6%V@MCud3IN9H1>sS zOJfG<3panvij9^YNP_#64zcObYJtqt%E|N=iNf_y+5eC|iqatR?9A6G>$nd`x>alI zOgSA^ty4W1i^P-E+6ft`O$@_w#!y@3%b{_R{vjemI)+gUFg)TZhfJqbv-43El6I5L zs=2CAesn5rBFM>!(P3Olo+n~5O?b;uG*%I90C@~C zV6b!=d=6^`MZ`}rpg)i`wn#N7oeDI51if&#T*CWyEm}w9G%ywakKi&Vb~yPoR;YiQ zBPKMT5c#YqOXRdvh;5QYtm*$p*LlZBRc(*{1Whv8ne+)HaCSlw2%!ih6p<((-6+K< zq7g;7fa2vwxF7;HAb@}Zic*XqMdb>FD54>PAiabpp&F171SEhUW%``=T@!u3`#$fz zKVT*^XLeb8?bVCp6&cj>_bqjb}YAC z_={Li$_vtgAwd^07L(VPn9>;tArKQOOlI2pvp@`I4o-_KTQfXCxwtLVJu<`4Ol*`A z=%E5Fz(k5qOlO3XTnIrA&Zp&|5;ImzD=o0G*o8Vbn+bf*E52(%ghk9_41#7N#f`8A z2$fDFNXBa9ADtwCthR)n1Qz zhLH8I5l5^IgHW1{Ja%S%N8m!}pKP2uLk~jLk(;DD63rVI^7KuW1=G!$Aa!A* zK{Ff`;&CVU9&g+by0&q^1a`cwXPWVss4&CN#^+3w>hCbz-dQN;#GA$T=jmG#8J$3& zt}R!5{U3@vaWZE@B28;7t1*EdMnt`?5T-m0Az69NOWw} zfC$b)G97D4+I0ODW#BBJ;h-+K7D_2pP@eX!_w$1WL}(>6Lj;ND!+3~;(Uwpc8mJPz z@HVqNsk}wN`FGZ^Of0z{c1uaZQM+A~l+B!Qg4q22v1l>gBlINW6g5R+7Xi;>VxIdI zOObU{eE;V~D?f7Gk?h6?Y8}mEq~A_}s7FfqoZ=J!Ye_LFFW{7sx_Vk7QmPe_{cu2D z1M9ceFyrkkwviYlYgG}sUm?~No^7x>4}rC=c;A}|39FA_V5AeVVKkJMjcHJB>svY0 z)9lKh3R>T0{+r1K9z>ETIfRCbxM3yoiz#z*le**W%vTG-QK zx#H{?%e;4r{H!U2?F1LrsDI=NbJp#RymHiRmTX4<4Cx`L(x`=`XPst)2F+p2sG6c* z2l8plHH-)j>8oZ{V0#ROQBX6?|1e|~L^Se5zUY-wlH^9ujc&jv36j;o<3<90K*PSI zg!CQO6?5c@AXA@QX|3Y_k3uaA{Xx%0RfgEuLloJ~z4=kgf^-=>j9fQ61fZmU*@5G)#@ss}EDfe6HC0BDFtJ zV=h;9H>}x64^5#$we*YRVWJc1CW>cYGIOcfhbm{i+Tr|<($A5;rlP(6(clCP*hrUm ztWzE*gc1wIVYXBUTP<#rm_Eu~ho7QW;aMY>b)m-^`mpo5fNKB9 z4$o8`Cs?#zk3`^(S>>FX8!*^V94kGSGXZ$ui!(>tQrsR6ve9 zuh^auRTQSH4M8--TmY)hpAZW590+J}`^yxq7!VNBB@=|l@#{_@g2R$vW5B*cEn z@gj(Y3$;!mRw`JzC^A&LX*_)w2r@!~sl9pH`wtj#QqCA%H7% ztPW^S8wM01Ld;bl!rhH%1!OnNC7M!-T)rc`FwwW3G5X%h2=z@QHw;WN*4Yo35uLSH zRF#`&OJ+HDX}qw+t{I=8k%kPFfEZ)1#FI^x+tFKG89hXt?~F_uk~aIGW$eqyv;yZ( zEwqe@XgP~QBNC@(sai_R1 z2^;=R(~BVX#3@_NkKpiZe&lirO3~M-ZYofZ27KD@!?F~L{UGKe26EtijDYS*7Zh&O zc0!!2z4dy+3(YjLAP2}5;JRXU*sTe$0XDnKC_B37*rRSoQSc( zYKwwny)L0=o96+HU>xAr2)9O;lJkvWAGv8(U@N+PNH$vt$?lfIo$FKphwFrI+#zIk z2+TG%f;TV2QxbBy&e&jxA4^!P7J!iSQr-$AMRC9??YgOLNj5*B-bXrm7Un6%cyPVbhd)xb<$L#f)z~K-|;eB8j`Dq;e z!xl)8eZV(gxu-~he`;Ddv%&U_^pftZJnxX8B0UlORJ*B=dh&)3dERI|CL>WSP7$Is z^uw_f`Jg5mM+$z2S|Rgu(=psJVL`o~5`;=N-msz66ovb5*g?G6WGOd{9B=${10IXd zFW)uee&)*#UEW7~mVA=UgL{(UG#$wA&s#}etQjitAB#E}6y`=IGtrs%0KtfwdafEk zMAxd@94KvGj2mM((6pS1NSR77wiy?~2&RqQIC9lTCAcCmp@mpHio47KA6g+I8FTVe zS!)b77wZIf-}om2xAkEsLJY;4eMr={cID}T@xm)_G5>QXfVz0zR*0~Wd1JX}3M*XA z4i>#_xL)Ur;T5d^8PTm1MiI!B&Q}vJ-*t(9ET3J`7lXEYgd|a&_5xQI+0Qx|YIdU* z#Mw<89c@~k*CWBeV$=fTDI&0~F9+j^3l{uHo%0-)jH-Nk;=RZSjTSJd8`(N)o$?hh zQImQ-D9XnbEJ$~KB(Fn``}gp9!s=4g-Ab?n~p>w`Oy``c2H80L{Gr<>jK&`e88KN1YCyS zk2W<4v}J7<>0t0NpI7cKv?0i;2x)~b-D;pGH>kdfE^Q=&y4LTaaG75WgK6`cyqLBd zX8Z+y=@uxME6Ru$HlrG7*Hl)~u167dm;fLd5@PK!n#jr5M=CcQZMOQa@KpkuW>^ir zil*d@l!3D|JytBwGklgZavH@oO$Xjvn56A7{|o>` z9yYWZ;m$e=UABst!rCuUiSF#fOEkVMGtwsY+HeOA?&`@@@3|>_`ikyD(AFd z<$@TBSyEYrvTI(R_K4Had*}s|x|7G0=QHg;hzOhTHea0)wZ6gwJw7Jo=&wqi%#rdm z;<()edwj_gmkD2rSin@5mUVZYgym&$${n?Dn0ilaBW65BexUnJ+~;}ba0acSj`P9E z6(>x`JzONDE2GKuwGzbx4a4OSJ72yQZ(VJ%%AKp^{?#9HLUL?8M@7=<5e^?)BC)e{ zUNXH?7@#qBqWG;0P#1$^>;XQhx2&fJA&`@#lbgasYTC!~_JH!xp>RJdIg9#YRlozS z3+Ns6+du{&ajFTs)N9Mm8{FUO--EW0niOJBpdz`YpSZ=k600^2aKd*hkV>n_%+s6J)PiRp{c@HM5y%ds0)+3-#YI zo;dVpnC4lzIy?Pbi`OJm-kZU2C;D9mfxut0860(;72wXqa7iQ`(`Z~Z6=llk22HXS z5buG8Y`sM=Jcz$OlNyZ7Dg7||OEgD>jX!_e*HJ31T9p#)Ny?{3;6o@M*Np3D?d|lQ6C zqYnaBRH#r&{_f<#YhC7~2HN96$F;@LBW6eaA^D^mw;F+X2HY*X*&%k2?|Nr3`*%46 zd$kus!wy6WqkDTaj@EHiW^`ka=LL4#EO{}+D_9P&N+gfCF|7eGMvO={W0(UMl7 zesC{RKZ=_JiW=TkFLGYjzBw#GT?gr)?I!IbZD!0HlDte%7aJGmol2In)Pket7$H)= z$=X{V&nlI8v2*m!LSb?B<3Q-p#C@GV(fuFR)I9Dg_qc`Z`lwiibBl9)lY?&FUqLvd zYe5rF437^PDc3!{=~QveqxJ=Q@Qmr8`Y(D#*aX0PQ3S-M7!X1pm+<21s49Ic)3i?l z)~CwTr2J3x7M5~eF2wKPVGKvB1l6QhAnBVAXy;_@C;V+cmUBEHu;i|K`CLVW;OPYC^?epg=8Hg6X_Z$3Uv4XJtFuecv*02Mx8ZN~QjxX&a%P5J?l z!jD=>WZ<%t68e{5i!ij9D^r6;Y0Gkn|Fl^E;zL}ybzX>;vWsM*esDw zpmky5S?#)4J9{&k$j8?(R@>j#uBR9uL7p0F7=!JzIHpJd>{5Z5L=C7_I*_DY1bR1D zqu{1SClSf>wi<~pkjeTz?n<>}nj|crLPx2R^ZW#!X$gHK*WHZ$OjAqTx0$j>5Rle7 z1>zy*f%C{p{yZ}}z+dLPt4{&V=$ReS^g_q6HqW9({<$i!MY_kC39FS0t31WMJec_3 z#P9r}a?Rqx-_~vl?)79A+so2|LLFsELei}AMMD0*za9_gm{7r4-pYE_Q;&iFxa@M? zgr@hCYEozV3^L=I39g|)8uyhR2Z2Y*_$qN$Vj7w!K+za$2J=x5AQrghgMj^Zr1`!a)n4;-!E zqP++Sn zmmgj{wHTbecyZWE@++A0JTk0D>N?(8tl+J|Jz3-xDj*QUYTA>bI|0U_LXx)=e^a@7 zH8?{YEg}vTacu#DOv#`k=K3rj^wqVG6S#L-1;Agr<3YGzTa5)P6$g==HJNgQYyNdb}?mHXR==PH|FHe zqs&_uM`DgCA2xykKFPya@o@0?cNKkx96D$dqBS9!js)gN05UC>b>$OLEg$If0-$?f z;KC0Xx`jB64#HHi?iWH6_}@(E#0&=q@x`t$Mo2ZJ%?N}c?+R>;osC9t0^vp8r?8cb z?`v6U3xw)B^OifOXbG8GR|rtO)Gaz?v{k}%-bVw3kb8tOyJ#y@3m zMd5!?_Ct=B0`N&J9ktmW;B1euSVM`+VOR1((>6fcK89t8=yYi0RF^2cbjlFOn$ZZv zasL8LNy&=<=Y!)(!G4fRs`1!Ndn(LNsnh}?#uaxf{~ie%wCo)08KOw^9_^t!Yfpyz zlcbNO($U4Vy{hL(cNdpP%#zn+9c(()vYtozu~N-+m=w+(%bZZb;yRQ~1o?$mZ6hn* zdR_G36C-Z3j(Qnw`LDRI8_IGHz}4Gb#L@Z0c-0CK%=ipR$`Ccc+EW0zt;7><`O8Gr zBjpX|LWq)=we(?W{)O#*++O~L1rSA5Z>lvpzzVqyg+9^Ezm?Ij+!#4|bgKKMyQP1eLJ`=#aa@ol~dx(iKSZ1sg z8&32s&UgI+{`Y-TpnDTHHx%y zp6e?ZazIexpj@!;0JK$&RXBB z&)~@%;g?uVc(R9(h(lvC*qxLMv%b%-%XROa#Z&#ooIiL71ldUcVgv{10AsokXj6@( zC*|FD-BLsSuYoP^b;AZ^)L&pn>u7MCYatav4uCGw4uonlCFcO*vJNO*?Yq?lh~MRc zDVZR9qdY7m3xM#`I*L%twjo$%%X6Mhx9`h;J-8k%WE-tzxb9;>8f(p==h%#c zsyx;f;dYHhU2TOa&*;n!jZWgeD(`nyo{Ym{`Z@l4Rw#z8?^0Odc6qXCMkfD>XxQDK z7b&v$Y18jxcK- z#%vZ>ORmg7)P&d$aE}d$_B;#<;lw~ zY@EY}$s%Wi4ZR@HMn{k{MqK`7Vm8_sUKr}E3F74wWx-l7l^H!ZLu}K8r=F!jQfH3n z0s&i;R}|k_3}s{Nbbc@+F|QiaW*@+T3&RZiRR^}i{783x5uqZI3~zGvW}~*yN*oKH zb=^a43{r=ZmAeV{%=Z*@mLSgTgEpq=!quFKd@Cscu~hc$Bq+ZWueWyB(WH`)%6gqJ z!#u75@n+Hgl4=2-*Oez;0!m#>7(rHwsBA_i`QWC#JKH;oNz~dD0|r3-&4e^&docST zS5&x6RWZn)(4dUCbkp%Kp1xEyjj9R^~wv{lv~9KmSu>(+}KGL{7L*EALlG*B+_&6phXryPBYN zeiy*>7x{~r2IkM7}RNsL3ZaQXU(d(vLRaG1?Jy?BinHWVvs<#F!5`}NY|a%)>2U;FoT_RA-4n3CPldsP!H;v1@vIDiDHu> zSM?veY1_7sI$M%JXOhyo1~sFu_8`g908>JBJZ-hBjri(h&k-*wr^wRc0g2bBD~uDF zvJo;-HZc(oCrHq2C&I}isEAf+E%tLx#M2!@$*#;kAli>9b?gY7BR1BIN|Jb&)?$b1 zlfwXZkqg@oV3gjt;jGhyg;|x^rD8o-p-Z62XTcVCi<)nVbpnC&&ps%@e~xKQL~s$Z z|Kpme-(KI^OxP`VK63R8ml%E`iHxzlhGD7|C{NnsVi5nTJMLMUV5jJ4|}O9FD;mFG$Aenrze!v8F==p#^jlpwkFBA`%|iQ^b@VzXsry=_3qMWi`n zLMX2a;iwW#1$jP?BJ%gIDSg!9;z!WfW6o-Gbd}G1k#WQLRYJP%JvqA zC6?eb?V*zQ?@Yna6FZhMj+9MW&&Sv9Y)hfUM}=G+KD{CS`kz^x)LDj0LsTm^Y)|xt zDjsp4;fu?F?Fv^P2{1;x6BM&a*1)kDI$r>({j8#t3(prJk80x*VIGQ8>4GSp7{UsGF&hY~y$;ff|;;n0*iWI+v z%76hU0k4jA12vL;PLhik&d?#v!;56y72TPRt&@H8*LnreRa%uV+E3kO?nnWuwplXIy<1<0i3X#e0$H7BO75EV1 zPvB|XME*gC*yIhOYgJRgE0f|UfZ5L#J0>M!iGmgJeOo^GyILA+8>?sULxL2a4ZRr& z4T2XM<3j7Ey3ht=hr-(e>9D#QpC7rJXobAUM*Rn~OWkj1PZPegz7s*Rpu8D=deM7M zbt~CXv$6x&&KFSc{vMW=Me*)H$)rM>(J?ytdg!&{+9c zl>HhfB02CultCf63^s%z&)ScPGG;!UEnbsD%LD~!2;*-Xv|S-=X*0)w^rE2SjwtZB zuJ%3%l06pefO6qh2DK|OEZoW^Dw{`7GSLx&5i|N=$Z2@Psrq- z|JNdxi7<9+&Y<8Z!G~nH;8QZy-)sGt^fO2PU#p=zeQ-`p8~?MM2?EA;R8^K8Fwnd! ze+@(>oxj&?Eu(Zstc=1G|JNgCL?!z+f+GK5SO3K7RgP(GMt==hZ_PgV7a-Z%*Tf<$ z0(7w=zXMGHo-BTlOwJ5EvL17OR2g$sPaXtsY!JKxP3D;zgVb@q=iJ|`;m7trs}IMF zpxh}iH0`_K_6?bcZy45$+bpn^N?#lWll*{`XB~;V8XQ9&U}N$?HRMLsWEvBZIB;NQ z#~@s!0BjI+((QqV#5%+mZH-fKI18wD%n6{Yayg37niro#6W9Tv)`4Dg7Fwv6;YsO&iq7nzCEJT(t6R_Hp zk`ASCuX1@CXS95ihZ|-eM!Z0tp+uUk3gF(yucN+`PaqIDq&t~WVrC4vh{)1Vbqt8> z@xFO5OeL|Y4e$6%?>ub7w`Oj!iFBQO8DN{EXOl6Y&yh*Py7YBkFMV^isbw$(D#E(IKx%OYvbv*l( zzYT@A80+?sGXGW;=&9VqAKyolzEq*|kz`gFi9-EL_I09=3ARNle z+JA|BU>roHGlmOI{uw#ncy8uHP;4RfkIWNq(BwQQRqfm~ID`E6VLb}FGFtn-R-m`) z2x;!I86R_Q$|mwOM8ax28+y=o&a-?bqknW6x=!?lxaND9v`XfU{h%MO++ADihe($* z&YzC)%e@`s(d31P1lx1OFS|`F_id&0&N4ZukCPWsgZv;BBST)Lw41**dx#vn^$j+E zMmY_Dl&5_pzzkz24=NA7eIqjF1)8h-YRMEU%3K)Gf6)GWAMG zeczBo#zQ>agsUFo=1s#f!Pe)qFm=bwW}**d&{oL{xpGUf5*bY~t5_Q|xB_$1TsRK4 zVuh^4>}LIjC7l|}LTdWE^O)!e!LYEbh!JGny@B8r&8|sgd_?(Zd$B}+hdc}%X*>|7%kp5+=M6?EqkExufvBi5vI8a8cN{- zBG^eTDU)OaQeRy70m428*mw(~2T4H!&tB#xGL)+hGEy^y<%sFSH{wpUs2RRNHhs33 zKvG_d`v-D(r5lRWXtxe;n`?&SPO}aUP~Iu>!KsCAr>07eUtF)h_gIIYh#gs1;06xy zj9(#!IG6%ig?WO8$Y#`^!NAI36yF2OxOANxKspA*&|^S)z>_yc1`<{Tfc2Gl!MX{1 zDxO}5u=N>mGjc^08Ap^xTsD7=p1!8e*Jf0>a^Gg-_L%3e7>{zW0OySr((;R*P-xN# zLq#u6=FE-S$pvoW*i3#~v$8DJO-OhR=;&q@XsP`#Y2Pj_WeSb(K^uv^vy(BxDM+6- zHI(riqv;u;5_s3LY5r?sB1Fiu@@0juTqnRh0VUr?Hd{-c4f|p^4J}g5d&kP4EOTYe5~K<~(OKI*?{adqC)llFsV_)4`*xgS;jr?oFxx~H3p3ur`hHxh75 z!X$Q+m_C1M5}oUOVJg(whY`}m>E4R2dQcprO`k!)YlJ9eugt--jL+Np(v^eRsK*-6 zbu40%H4P)Q(L(G%PrqehjG6%Xc)NZ7B5VbhR1!8$%Q-WPBZXs8<;S0<+{@9*zDBt1 z2Z8+t;1Z9GBr65KCC{`DRG@cx8X>DHjcT6^YbNiV@(U3_qcr z&yz%}rkD}jv+#Qrl}?sICY-gfb@(PpgHX%L=$7&ma%>z;AUwr@@SmbK)x9{(w%Uxq zXK5rBq+?7H?|5f1PGt&?w=$_$Ud6r;R;+zh(_rL+AE$_2K(`4mq*WeY%mH1jox)n* zipeE=80r+a8ehNiF5z3kv{KE`e{uJ&DevRjc})9uvmA2bJdg4qiPre%tSe*yhMkvL z1mliWo=9@SD#K2S+UxAb!EELs9Mw>=8YmW<;Kq0+fY%{8+}utfW*AWw#@r3tOotQ9 znT>E@v_a7_o|pQ>ppY56p9i{>RG2Y!coS@6+;oB6^O89C-k+HjtWL8^B5q&q0jKP+ zdPW_JeNatA2+f-!|A2AB#f^B0@jHsdF`26w_6vjc-)c}*gzK^%x=|tsT3@^z`#k5I zQ{ib=dqGM}Ca{n(0>wiZNZylrMQyeOF1U!qrUl^y4H_cCVCP}=j zNU6Tpr6rBzQUfuQ{@-TgV&$ro8ah(8iYiGWc7%R0JXgvUQJlk!#lDs>lWR8@!1^S3 zJf%|l`(!r&I9HAYS`FQJ$xi_Xo}W&DWB~Vmr()>ze7_8T{^1PVu)@ zu0s0ad7DF{&TB6sjvdPbjXqn`gx$M|LL|gr^ItP{RT40p)v^WlGQ>!sRi7XiSmokR zSR9P}`f_GRD%k_puf|X_>pMo@TUo{xZAxbZlfKDj%y|kkve>pDtMs{z`<_1rc_6@_ zG&pXmrx|!T<>4afhd`qiEG9?_KWcvmOpgGnmq<~WVp;04ZLVd7-B^zQA?|8w;5Fi4 zSNF+Hl(uqI{!o9){mMti}C#?)OH-tp1hTT3A}C={6B<&lr6uH!+yfbK?kIoStI8 z`EGZ?yS;V{>UCI)!cQ{}DV>8Mn!~7o$ z<59ZQtKctLSFlt*3zK0Xprc7_J}-v7n-yK1Z^(8~RT!|sj9VnjVXvMctnoVfmbJf6 zF6(AMo~#~keI`QgHi!ZXWvixRgK{MS=Qtd6>=fbRCUTmcZ~=@m*$~!$5y8lqjBMIc z7=g%40R#A0!yx%xN%UWXZjU}HQWo{yVnHvs{*w8CC0ag672nc-FvdpquSybfWlWruPmi1JM4 z(z4R*1JngI)pL-L_By!Jj^q0iSt7RPq`&tmu6d(FF_=e=2hU@4i$Ytr&M$}%z{zMR zgN#NQ0omTo$`hgzj8Bdn^F^QN#sFjk$ zR=v#N**U(ZfvTnhB*UqPfRMo8xImT#6JEz+6rXc+PYLi+Q8BF&e;!s34@*MFkK8Od z=kC7J;c=o4#45@u5(BkNV=rb@qXorA;)#n0&6hkN-vP;?HX~kB9_n=qKmBvUg}^c# zK{^nn1L;!G$M?Kq7$@Se(FlyNer}(GI0fh3X}a1dH-Q?q2yTBDMDP2wvzJ;3YhXZ= zw0G9lgMv0+2lWZRFp@)*7guk3By{Um(;2>%VlHknAKI3U?+8LgB1tn;Na$1%Gn65| zY#qR}hl_KlSSDE5Yr;9Na9~`zT(qG~)02OYNJ#TZ)SjESIK*s{dlJIssWv+}oiMS^ z9vPGA9ms2S0qUS*swSy;v$v{N3J{J z0wpuKh1PNr0NM%{C5My;cc3^&ZAV9mQOHm1z-T3Oc)Jk0&a#68?0~;X7PcemvKmO>g8x$d;NCZN-~`WK=$#d;z<(C!tI;Aq1!T0LZ{p(!99MxAQm4)tRx(12ir^!GciJYZ!0vr7-6OL$kLk$4%9{|zBf5hp9 zAi5K)at`DN@n$nhBb4hvH=KUTLoFb18DB|sOYKF#Nw6s|HltVA0w_wI9e=1`AO~kW zQAoNwyBJFi0%SygN|0Ln5c?xAX;VgWs7qAPNTdcMDeKkod{%S*M3;wGJ>*0%WrtTY zOynEPie|(Eys49sAyMK+{ShSAzsIBDV_Fl|6CvipcEA$Ma&R;et$*zae?;NqllN z(J1v$rKu6do2GYBP)M`t#gNbI__Erul5>*}rK zb^DS{s8CI^^4RJ0HBMCGE8r*e&I~0LfD_%JQ)ZGE<)>uFqna{X=;WbOIh9d5iK2H8 zGsN|r@$R7cy*ynyynjL<{3I0h^7>$2gq z6wC-Ch1c2xJEG#Q?AIK-Er(_l@wVNV}2 zZfi0-snH-chA~5nehF~o+?JpoL=sqI?G)8Nxv(aNkQz5`wY02zi&ntHe;?uU%d$=) zn@$&xAWpKXg}Nnot@eWV!F*`D$zE>YAV+_?Skan)=5n_^Iq&A zReIcYHoI0izvS0Rc0fg_puxrFLm)V$y(g%0 z49DC`>@@3+eo=p{si#XtS^BdHt&1Brd=f9UAc(fN5hl?HWU3%nJUGBk@{b#oa^US& z!GPw|v+!oo=_ zvo0#|KKT|@cMm}e*4ZOhnQy{*q=vvKeOr|WE5s(VqKG3^HkLPtauwWmM=?SP@dAx_ z##2lAuCUD0r3ZKMLVT$QbEWMjkQ^j5iyy}~8up3yb6R)ZnFMcDF16zabs_xEx$0s5-Cl& zLCUJSUS-rTmA6-LrT$Uc{j1udJj8Oq8X{4~ICUZ(65JGS% zkd*sRO&$XFwJ$~lhVknZG-63EG2@rAJ`7_Vh7`Dnh`WqXZN|T&U0YdV3x=Uv*u{)Tg##}^)FGd8lJ=5_kS1mk| z2OH<6nYIMpv~cCP@G=>W1vd9bEbY|T9d539lo(shMkB;&Lm2xNoVOzW{|mNlWaS~n zBnWFc2H^@^Df$AxMGKMvjJvoK0!PJSJ+dH;9IaFaN)u3H(lkusctYLEBhfDvVpe%* zd|wtjQdp}SFKtNEQW(?Ehn~X@wwt8n8w)TeybScmj)3~F8{9RO&3}g?USqk`^`WiI zB(^4IjhhIR_PfZN4~oGgos_6ZE@O2TJN(08tk>S2i5Dp!9w0v zHCXxr7BieA&>&RCWPV7>J)6MV7(w8T1A9pP$AV#=^K=M<-(qu%Xen>n_s3xbtlp7w zQj_wr$F0ZJVzt6GZnbDcAV4*gTC(ktix#E^p%kG7N<1r2;=eLI(O{if=Q&Ba4hFBQ~r=z(~5>X-BOk>7=SDEcod@BCLC4~Q3mndcx^)mQBons5{ zo#ovuq_&9`N45Qa<->y#`I@dH|4AGK4FOaDgXK>Yq-zLPJ;rwKt~kD3Q~0fpnE)zO zCx5pV|IupF(i?!Nw9s>uKBV18B} zE1wU-TI;|->s#@x9uWK3#X*}e$kzCEa8D~_R~Md| z3hYvpr2eUe67OPkBVjBaU$@b9{`lvV7up>A3v}U0?ICZXrVjih{De6wJy5X5?^o@GJBn5|P(BFSfC&=|!F_{^#`e+P?b?$M zyp{x=BsU8kXi!1B5T*gDH=rsRj(XkweW9snB1Ub0o)kik?4cxe&f1xFTWa}OhfB`6 zUWV;tFweMxH1hRvITCq9!2@e=8j*0Hue$vr*4*)&^je9GTiGHpSYV=H!*&khNxVMI z0M}BHl)n;cw{%QvuxjZW$hJ!*&*Diz_OEg#y53Q#Gx&apc=#l$(L21MX` zNG?OO-VfnB6{B)v32|w^yU>gp#+Px+NY49*7G8?(61oq5g@hVL>jN=8HZ;?#OF&f~ zXB|%yPH)ta$edW*sdR*uv5VML7YXjRZhU6OqvKeo38Ndq>q_Xf<6GXG%}oQt`|-?~ z45D`=x8yhJJ%VwKrA7h_>klv?b}1+_i%%MZeb#QcQ*{}yEi<#sIMHjjUK~yyKLJFL z+DKF|s|@;KopFrkKl=e;X|vGmYkWckm+2VE1#cm#*=8i}59@fnuAqJm`(aYq=t+VOWlypP@2P~rwA%{LolqY|m zB~;qFEFAv~%CvQPCRlckkQ*xab6>GL-#bd%+_yP9#00Axl`wWK;+A-)B_|4pK2eMO zac#qPqCHW0;;Ot2c=9?e`e;mVh7X37KgKJD$oD0p!>C){#2vw1Owit6g0L6UMCsWQ z$$%thSXNQeLz0Z5g(u7w%jg@z7`}2$6t5b$Io(V*@8!lzcaUKDgJu+zR#YReA|v&f zCe5)jU*ISYGq(*`Z9vX)pg%0T*%z36)O$`j>oUVgi#(5U*s~S>< z(Ov>0_g;slEu|=PRA)weSkA2U|~iU@N1sV(=gq70m?Cpf4kP(g-t z!AT-gER@V`Atn7~^8?{lAtA|&*>W%JIx)L>{1Fi=#N2PRrVKUK#Y4H=VerD}UU`xx z%1CblvJ7!YG^nKlud(C?WfRC_k^~KAsDbCv@gph6Tn_;csy9t{97BJ3cOJPs||y6n40$UJsv04SQI1+*5q9KO=);PrMEx7@)H03`8&d zXx3q2#>Yhj=nNv$NsHJAge0To3ek#Xac$Y0QCmVI+EFSYOpGa6r3cKYXL&TM$2uqa zn~?>9vaYm;^=CmVt(t;yx7`{~kcKj!m8;(Hk4Z zN8)pc>tfV+5+_b^yUFc2X{s`|yw};}5pjUfHni>l{gYlREvE9g-hq_>(Ap&+cq{G-5E;9by_QWP1fc0OGxBG>N;yd> zwIynaM<*=T1D}qo0SJh$#3%@v$(hI{oV70tU$X>Uln6}ovSEbRx}~Q2KH!nB$j^(G ztGm8;7C71zlCfjO36}Je$c}BZFoQjbrBgNLz@GN!abP)j!0dja##1O4_9*gXyFn$i zF?p8lG{?1Sv?IwV91*~1!&#V-1OOQ^rxtp9L%L9r6J8LNq2EZnM6GzH$8=}}0my(D zrNihVq^tfwsPTh1f?Pb%^^I4}1e6k^dqxJ_eSF?ZD`d?H8!Z01WMYn!>z6LR_Rm&N zGsE$YTH6s{tc!QHZst9~wt>%it;{}5UOIQ7kh>Ucf4*gBijTW!?XZ^?X_uw1D*7k* zY3eas6F5Ta74CR>8tV|{YLv(r6K}O;|G|PM@f6bVSuwe+VjTq1`UaN`HZ$VG+7Dp1 zLqvs$Ib8bTnUNhCs%!RvkI)&m8eEUhNp3O{g|7C!%r6o}rtT_Eb%i!##OJ3{WZQpF zkn`Xf1}9A0N`>$iHk@_U)`5;<10lbd3i|;&gj_7b71SH^%j@p7L}I{z=vavs(OI>8Q?7Gh%%_SL4J0g>VM6ZW+Uy9-)BedUI}mq;f)|)+`HM7_k5yocA^?~< zqCQvi>Gb2&li~g2Fu*8JobrW2NU_d#XK9!8zF?8>Z0)~aQxMHhlLyQI5&c=8TOZdu zH1T25<|z)X(QYR^zF1*o5jo0Rp4V9VZmV zF)6e!9&`v?c@q$IM|%$YAP}XCJ0g=WzGI;1J#TBPQ zxpKV%Ot-2+kOXv?sy*YW&Y_7&poc8Q4VCi&EtWUKK4%b{C(tB8V^e)j`3g0uN;vw0 zttu+@ZS5(P_F{Cc5O32Ve!Nimu_Mt%46l=Gv39Q2?-7ct2$*2dAF-g+1{oHBMi&$* zLF{krR!%WpB9>asyBZXd^4mZj=;O&DCN8iO^7qAXGfq^O9d98ApC^^kD#g+VRj&`Z ztTAw~MB`-kMwHrr12N*K=|yIw9eDg$(X~$CS*p=PwVjVD-ljSk#^?#VvVNzGqy4s+ zpRG@E7F$29I0@mz1Z?drE#?2sljm0RUu!*ahQ|FBJ#je4v4|Pdi!kpII6mPVkF6?i z5-bb*F5(h}1I3zszsOMJF!S@Wi44@?JkRZlffq?5XzM39ruAvCbB)n+0jF|C9Wx`- zkXgbd8m*)%-$N+|66PSKRgARfP%aod3(?m2cNf;Q_l;5PU--o0+-87o;N-aoC(s>{ zCgKKdG-I9oRaflRPl?L@)cOnpI4I&e7ounN62kQThHW6^Aeg)VHHab=8Qc;|w`aly zsd{EDX}K~WHBzmAiR|Bz*h-@nMBex(qMh|Y0aBecS+txt5weY50|{5yM68POx={7k zZ>(hKoOxIHPfR)^gwnRouS-l=&UjYa@p=;1(8wex)%F{2nu;<~2A49jA+pvt5+T!8 zPVp_uV#Gefs$Sue(0d2_64htI`tixatp?sD-c-=S#R~j6KF6x@;^euBp1Y{>e&wyJ zaB2A6>VUR6Q9IvJu0O#yg0R8~yK<{w1b^6r$bv{>e&T0W!wLV+g@%=j8?>XVuVtm6Lb}&#<_U#}j${~L zMoT~0_TOi!`U&w5ck(O9^TpzL4 z@N&ifDy)u@w-jmaW_sG|g@W?<)Xm5SBIWz`a*0Cbyg-$ncZ3@$|HPmX<261`tTD&t zxh-_gw-CT$ZI8Ty;f*etlntOdsIwTgXc~2`$p5>neTmA)Dd0xK5$YKRc8mZZ?=cz& zP0ENF_Kk9n;TP^Q#YOfE#|Z)NEM|Y#fyZ&}e@N4|ifKh1zd6Ds?Ez^!)EI#M3|Mbf z&G1q-Lt-=oB_jF9^v)u5VU(UnK(!h51US}99YfrvpwBYpZ>T0vGcDCKj*0JOXZ0B3 zDln9kv6#6GOnDL0{y`Aw$Qa_f(4XQpDM#YpMjdJjKct@5uHO{O2O=$^zI`00w@%1K zPc&~M^Nm*%q4Ca@%9W{I7{Qpmj*k<@^6&4!4udx-IQ>srOxRR=bvICy=_XpucUiec z>lwayfdtj(cs`mS2Cns|%11h(&k}s?vCbu;Wx~EJnVb(|o&)b57m0ofslXCs&)&2z zN4=rWNh1&HmaS%+cNP_xp~c$eQ{qtzMX!J#WATnWVe{h43>~iAwSd;UK!#F1cB$?FYZLH` zA%_?JF%prHdQOdb`d96=C?%ujo3>^g^jyZ9j7A*_xbpP;gY>?j_{qo0b3)-}be3uF ztK>x#QN0`i0sk50z|7EcMTZK&{!AVu_LT`_*r~@N2^z) zN(~;kc~_jrwHIWv?#{d7*~P44Nvc9vR`;@(PDoe_0BD4idZ9!Iy7E8h&+(2_djny^ zf6y+jAC$`sov!>d;Zn2s`5)B$vbBy4QYA*GtJ(*SsP<@{8;YV(tM$R$y9LW)+LcRS^Oo^O|9P|@^eA-2XT_OH96 zYJwxgAc+4AC(%?yt0OsZPc9MXpbk7t$CpQ4vK`CxBpcL%GGJ9@=BA^9L;Q(g~1kZfS?(;u;|* ziwq)VU_*vXkeUeB&~QR}jfcNKS&CHJ5*6MWx4VcjE8!5R_1C z?E9P1()P;y0(VjF#yOyND1Ii_I>JE|nVNe;{T3yHYiFPKl1QSnOX)3gQ=I`T zUV;$eC=CCD0z&~3eIAko@!3>s3d~odf#-N8kRP;@(7Kp>wi@z_(?pV1Bh-pJi*P|M-QN<^1U>roLN6{Ypu0ATP;o9)yU zMNwUG95reT-+eKt1hJ+7iKfr^zKBUucBbKqldyR##{~#f5_NEHcaeyW9YvjOi5<{d zkDzbeJ9ZmzdqIBtaX~smiB5l1w8y5H;Ei^Z=d%C#tEZlVPLkUYe}a=cwCXm$XrfPiUj z7?bH)$~1L$7kb5Hzr3{6gFV*@nifiAyzegG70mC3O(mp0mO9J&DDAdoyn)ltdaj}; z(%XE9V3*LkmTulo`EL z+9vzw01~yz1qBy5Whl25WurJJiLHt(9g{O2DL`c*j~#j;FPLW+kpm{LVKEi?;K{y` zQ=L!o$IsUtUfF&HEd>y);FgVs&Nic_DOUi^TB4n9BbWwzgwU@R{bYgdG+)F+T*Zc4 zBJP1E;FYz5{_af>c)%;>IgrhkiFz>K_)%I6T59^7WR8}S2dZ;Jyy=PC7# z^JClxfAV4CE%tJ=>LW1K~Mk?{#lq6%o*ezB7Xa zXZaY+(AOOku~-nlQ-<0`W_e(&UZRl|sUaPpGYZkpfiL-bXAkuLL-QxTAT9jvc}DOZ zizE2{2Bh7{Z;$PBjM(R%Y&1efoj$-06eGO+^3yheS>4i?)CYg+z>A7fWtaii6N-+* z!BK~Y_piE}C$aMsQ?O$)xO|slg{C6_ppvSly8gv6yo9NmjeH*rrH@>xJ$2b3VYCr^ z>6piHAPvOOoN6NToiDinI*HLSfyC6f2L#@$T&|uJg9^0L-hKQXiue7HI{+OtK?G~=&n0A7N0Pzgl{iX3=6j8>j=f!++#Kk zsCDo<5?o9p23!qTe$P$Ekd)iZ`!cH_&%G(ZxO4gEnXj@#OrO~a^uIU^z|XrJ zKzbZNZy(B@JV#Mo9!BJw~+HCi9Q2sx)f2ADEysF{M zv50s_rV%%WUyR1&?Y#^Sf#+HK<#1?VEi`zC8U8fUE+8C!5vZ+yDjqD?809$<>_kfN za5LoEBm7&g1L8ERDRq#3pMY!ocjc$?08yvP`79@SOmaNEuOby?NvtLsA2w$1T)kT5 zv#RiYS-wrYMp9Qi_7M(B%=GSxuJkulf!!iUJfIR z#V!B9f>%|bBUgzm%s@}|j!HVOZ-KyN2%+1#Pj7HY&uQOfija6I6+;8+dsN_S(CB4N zAmUJcTDuPPX~Syr6nlsF6zk*ZyE zV1jm`=b`c}SFR`39OXf)2|Fu*TuB)@DYWOkNQjlc9zgmSoSO#>DBuGh$|h)?I7XbM zU+M9RQK(Pun^#@0!}^C1qU2Jz!7QXxhf@q%A2xZ45}_9v^Z7%JU>KujCdsS4o})Qu5V|GW9IVTXX0!68_U!$Wynb`AGo^CWh)j zZ~dtm4%Q^d6B(CX*w{l;eGl@-VC>n}YqfZMR^AG_#fpQZ&5h3?mshEKy#+}%=+h=- zI(CirnQV|gQq=76rt;vo6cUJ|%;z(rNv_4HYe`Ut8Ffbcka1(_K!OHkdzw4Fjg$IV zyPBw_f!Fmy=Zk#2mgd@`WrN?yxz=@prPeY|p!=BC&edpR^HEh$gz@!AK93oDkO@z$ zI8FggP-$G`$`Kt#`aV_IU;5*e^{gOk|!C{8I-@bdQkvAzJC zlex4}6aLq>Xa&#EokaL=FjllNA+k}iGI%*T+*9~;jz;r968#_tN#I2LzOn*Al5>)} zyi5E%`wIz_YRGUjx)(bP3wUERgR?TDwH$iwmdjCm=8tET(W0uUEQVg|+n9Aq6v zTFLqU5Av+K4g6ZClz^tUsQG5t_jROPt80+kYt!toXI6GOhWJ0An1B3m{9p8#Nx(= z9Rx)L9+UKA7y|kzHnf=bYB5OGgMl!3G~ha2nmh;pi5Z3O#g)K=4^o)Sj3$0H78^@7 ztgCVAGcztium5jE!3PrYy`rl;P~L}zWVEH(52ws1_3*%QC6a*P|GpA`|Cam!!SrzU z7DGXLB8i<>p#uqH_>7iW$7NApkO1EgQ!Gvf2OH)qv8iG0k&suI4cszHF;Bec8u(49 z*6f58?-CHNI6|!=3cjp29nFEmE>Vs43wykDk(*bOkGQq}g|1>puie5S+ru^{Db`~s zn(Gp~$zc)4OU*QX8@?`B&D%(cd5)N4*3fFiZT`cjX}_p~N&4q*Wdevj0|7)2yOfs` zVK5$xXSFc+1%}iMcXk8?!lQ_`6ul<^tR3VV$K!Ipo!z$(va!1Z;^sran&J#VhzP-7 z|ED;4lwbyX*o)9(v>Ur4aXpvn$Q8L%0AN34fzyU8{QX-Fc*9l}PhbY{OR6S%dqdGX+mZ9M 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�rriaYU!YCQzHy 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�l?;*ow#I9} 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

    2k*XarN~bXQ+kwuZVfKZJ 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%0Du*OAz8xrs(jSIyzH@ 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

    w>Qa19xa5IPx<$v)!<~VViRuCwTb*-jc)89>A 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 z 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 Y>IHg;^I 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

    gOH^xLKPWW*;l2e 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⪙A;p&9*z+{v9fcO6BS#g! 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�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 C*lv0DBAokuD{48xer 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

    5y+oNbpbh7%86ie+v8}kS#^7^hlh*IB5 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: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�ajL7!8kg9N zA{v8>7$ht8bzd~&ryzOY8f{+92HVs&&9~|b@kBy;%T)wG#^;UWPa5QF)W-K~3FPy} zH+9T~4ct+jDq>xse@eGiNwA-v$!1LMcb)UWqU)r_} z5asMCTE5Mmf|aOBH-WQI?h}`jTk(A27{bKAr;~ACv5xZ}{+E|DL)4e9T!kS2Hkm5w z&2GPuCX*VjwMfB6@cSe12z9C_;4w?SjU0)v_Mv3MiUHNC>y5=+oM)4u+ z-?uVOb|&Qk_jxpDRsNF`TvnFejMB8Rs zL>PFO{LV{;kQ^mR{sUb{F%n@A&zxcVP^WlTbJVoqfuMA&qJpR1b}yG%u+4s9x+9Tz1Zga+Y2`a`69nxGG;GfM98D&MI(Lr`um>C{1soqhb<&X zM$LL=PBcvR^0)uoa`vNthfg&&LX!(*T)0>p1WIVFh`4thB<_+EM4;8p63&5G(Zysw zxR?=r$(aAdeIm77XEXH;Vp>;eCPvv>R!B+t9uqXxMz|4Uq)M}r^J9&jj@XJyO2ii> z2zC(`Lpohp@TH zl@>;4vZ&M!)8R3K{7*O!aQ+>e98 z_js%8>W7kqrb7~UeWQGLI?tI9{__2cA4-xsh*U=zof04zT)R)4r`orw{OO={ma9E= zUn*(@x?{tn$gZIKyD@u8ze+0viD>ns!JpuRU4&Az4U>N7pSizVctc5HUzg0yGC|L37ql99`=yOs z&0;|0yG&kp*?OY3_cH2}6X#LiA=}KCOdoVw%iAKP!3dPn*=P zGQt>P{lrYeC6T!xV){bbl#Lk5S^>DI5lkqZGW(>^TA2!GwS+0@y8)R~3%Vo_< zbYduUGoy9YMzlvaYg9c3;rc1kTa{+(M%RcbTDtf;`w+rTA&^E43<8PU4YnqZA`&$& zDn{@tjpPaGpWcr;co|*c=LQpryZR)@eBJ%GtXiB-mKLz0|7@Df6yx#36h_+L-_nmu zEOK?lLIC(qTpFR<80}mE)+J8#QPX2Gyx1=}R$j?M$yM!^(G!;m=pxr&N&UcN^b5yx zK(wp49K`ve5lpj)$Db7;`GM(oQf9Is(Xn|($;IK+^jMp|sXM6Qc4BJsLN}W(2PwPe zY799Ua4s-5&zk&vPekadY#G(N>ojdT#egnywdC;HQ0(S=FI5|3hlB`&H9myl%SJGH zTXyA)O-|mYah7ZreH&mpd|@fxjn0`%88gX$*uI!B04-3X^@o7{m>*@GC0*&U2$0D64T4}-SQMz6>roNYBSm1G9T)LVsqbPBBfvB z@tH-u>pM&=WTabNmEon*Hmh>#*`KmeRZF<}E)xqC3&nIjGOS(N<`S4dtI=HW-+@P0 z@#H3+i^kN|Hus8+;LCT2sX2tkW|)iQm3MVB@TwG$x4>Sl1UBZQn@7H$+Oz-#E z*V{CAvOEe$35f+3&ZB6Pm6==77i}XFOQF^nMB#b*Mb^8)0A zQz4Ac4`Q?=J~H|sr;DD`X$3BFB_n0AQ~wbd%+)jh6O79&3lm$>WuIe@)%|YGTUgC& zc7Bf3hdADTmL41?>pHI1U|fH33kHAX_KIdYOeA(2$CdI&>62sal!-y8Mny$u#;T@5 z7<6%Q9~a!heZEJu?P?5nafwaWD%x?<-Wi2FKcs%6zP zqM{z_KWH&q!4{y zv%b>b3QhWqe&yQYc|3P_>bcTvsv7%BLCVo3C0ksTtTAeNBian;6Iwf0uVDAOPNg5DLJ z+5KNnSu4u)#p|!)x#7@tlx^dHiK{eO7nSwvPxPuy*$jh{yu)s&6goQ?s6}5Elzh)_ zK_D+>>iZ1-5yNl9=H8(B`hsy#Mpmv%nT#z-*14o{O8jz-e5knIRf$JjWUI>aO%CK{ zinH>zj7%EWCj=i?F-zl#X#9TbT=97Q5uoI1?*jfVZf=&WFy+f8ks6H>qT8=ZmRX3k zRIwQQTYPC{G!?rM^~41SPjI;4f1&7p$|+koi^IPW@_@DY5{Xk3_aFJ$-A=B#H&KjV zfm72a%+6D`kDFRkh0&-gMSUG3`7x389Io1aB}y<}PjU}feh0@#e8sY-aM~%}6eDHd zs^7!@hX{YFU_&9+yV#@Q57lNFT%NB!C>O7a6X*b1ZR?g&`)g~{T&qef?Oqn^g~;)xgQkIQ&BU%HvU{GF5ZdOE$ZW0I-DDPHi$mdNuNBTEYGtA^{&SZCwjj$-$ z=X*^e*V((#O~`KNjHdhdJ)wS#wvHGrR&2kL_Wpn{-DK3zzwREMIhaHlUjz;LPEomY zW@1L9$y}wRwtw%*jXa-c9Fo*XSPg2vhX$pIq`!-5B(7$S zBum0LoFywgyxohJ;m0#CBz1m#_nl$ONX~XvOd}*(MSL*7<;`-#-T@fGU?XI~QP(;s zBg3sDMEq==9xJU2a^&%>TFX)(#s+qb2&OuY`MP0?mxl??CB1`KCI&e;#G#TzmT;{E zA@$r%!D&*CeB<5Sw&AiN`I{kuH`3+*#HEqBBglU@ovjZt!*NI~3(EKs2n&}17r%OW zoWrfSr9Z(aBR^5XYJZ*5`uvjftiiu9vg zu;`D%S7G#YQ2r9l-#)MrQL&Dx(l(X?F<(W|Le6DICp+C<-RG@AO) z-gbYO{07dS)6DvXX)}BHXV$i75eoe;mkZ0dNij$+)TOv=bD{2@W2Jk>Rji6G#HTg- zIx<NNndjfaVq>>pG*?9>KFVgWvFEWT z)s`$v!Z~hPBNF2N-vJM{E^3~@37yXVGQB>{n%*}aVTYt*jm`=DbTx@#{YQ4rWRd@! zVXFo`ZL^?8^R&Sw|1P&PCu)iJ{mZMvYF+^H+*(H3zAdo|!aPnR2I2=2y<;*z@L!L`nQE5k->>{~)^kk{bGZ>|Vy z|1CW{8QT@suxsTearcA!lrk31=F+`nc}!6J9LO5WcRR^Nv^-FDfcPCjiR%`VEg23q z*8@QB#Av}mg^ly(iypJ{xt3L$qm8K>~WZaaAx130~~YaW{YEZW$`Tp7uPR% z1%AwxzRsaU`5EiJ!}?Opd+kl7z(7P6;2B`6HHKla-n zP}U>UaB$v3;qF)u^sgqg*4?hBS$L`aQ)2X&FeAh2|B*)ExzFEvP2nB>ow_zlkRif# z`Ajw#&E*<5YPo;|?OiJz+B?$Xw z_6DxY9)B6$v)ZTl%utAQ?COi!P(N=nj|Z?M3g5*4?fz=~c;Y!1FaX@f?qloj&EcJM zSM+aLjAKEG{2SGgAadWW!A9-*4(&Yvu;Yo+fC+XdWesuO*@1K^tNvGwKETm9N_1s9^{3-Og>?U@)bi$USwX6VTqpjc;KP2fR z9i^MnrP~C`Y0qy7o5>%Ss05Ycj_e)DSQ9&g?=y`(VSDcH6$G0ijh<_1zN7S_u(=h- zyWgr~TpL>xgr;WNv-tKmw(`bS@$MC9LJ|*O2i-gX!hb-NY{SVk_eBo`r7h}UJ)ZsG zQkwsSfa&-YNFe@|Aj*Y^<&k9W0XDOcW$7{I(ltRrwcCz`CsER@?Tla{>s;Hl}^Ln#&%9H zkX|LgI!jtP3M@eP5#@V&chT(mR_XWEH04I z?tk*qyf4z@CP|HJ)*^!M$7&3t>?*a?>bMdfA>NlVF$ppPW8v<%q_6>yeKjvcW3 zXBgXKJ6<1=EF9J6$M(MpeNBT`aAm^rv9Y!)I!r2#;uDZ<>w{cO<$t(sec_+@>vI!s zU^wOFlUz%2CeXX~7R(W>26yoh{2Go^qqs$qj}XEgAYRE&-NJD>d#!Yd{Gz4heEl`M z0p;?#S+T56NME`TuKQENDWLj9km=*H;xKUp()k^O8O}bL|F1QBs>13Jj`%eUP^%8F z?&U~(Kjh-RH9a%ieS($H15aJ+E3R67 z5z=$rz0ss4r?BHcWTE2t&j-w)+*U8MV*WH{yMjRe_e^C9e)9Rv^M3K7gN2J&7W|yC5YfU?xOy>D z{~5_~`IF^9>Lcm=XtO|1&jeKG%_X1W*XiOC9X`Ee%pQ_-@_|w8BM91>m@II z6)-q=ygU|fl0w@5PO0szcyoWd>WE1E-Lf6>RDSSs;g0|RyJ4b91hM$xuwID~+h<+` zgSRUe`1n037+Bk~=dD~-_$faQpMD4Vy?)2j`C{&XGtKUl?w5BLaIBvjBDAO?rO{4k z=KYnBuV~*nYpMOk8p&303}-9{Rid8}(zdhKs44T}<*PXsww;A_P6tX3E+#M8J`5Z# z!6m(jJau5J9tm#5y-OT@N&5h>7E6p`$2o!6OL{P&JvNBJ_T7}--!|Vq*mr}kHb4I= zX7&6_0siJqhevQ$bt&n&f~CCqhqaghS8j#&ZV?@yf^bPyiADZw{xH*RLks;j(gMnn4{|q_5Kp{ut0d1rxz;k;DyY32$5&wp2iOH6;oIZfxGnelL%3rkd7BQYd%Dj8ghSj*!VEQ zCRU6EkKmWh*d?-)LUiTG?N_#-#v7+Ip06(964Ncry4A?Az`x?)VEBWH&_Q%oWwA&Um7{lq+hIx zV1VBQ|Eg(1f5Y>bw@qu)Q9!x}Nomc4iSIX86<}Dja0!9?dH(l&o!C!$){ z4q!@?U@7xZ`ojcE7`}G~WwI@P407pdIE59{z47nq`f24fT6zhZV5?Yj=k3khK{_m{ zAeDGQMEr;8T-)|Hy!D&W*XGyq@2|K}g!-Q>+kvcA$jvaz;He?L*l=oO^40VLGGmm# zh(YK72CY-^J*?p{F&?JUkP5Sl$JU<0;wc z!1`;-l|GRLBL!dh8vgn)p(r4(IgzKPUDA7mHVUtrwXtv^KYV`efFJ|tNI|dS2U@HC zh|_jJceUQ(o>QDLb2uA_j!P=nN6A8Iei=-ZvkB3<>(o+2YA`8Goe=I3H58cDk~RE2 zS2=*c4MC{jZ;~*DOBH&b_3)v5KuI30G|%kMbhzll8NF#WyQ2u^TZ%lvK72 z?260f6HbKk=KFQ`Q+98}2kX1GJWPF3J^NE80g@JNlST8hYLdseJl6Ko654NYRpxL^ zX;i-B$&HjH+uiAtpO)w&%`v8(5?B2k+Un#UGCS;MZF~!I;ddI&sZEEBpIp=P2=CwT zZ`azA<_YqtV+DmxvtWU^BteG&fBhq;^Q$1Qsa#L3{EDBqeTNh$VZX=T8Xi3k?I9E| zkw_xC5=B-wbFi?WO4Xsy5=aBq0?nQt#-R|EDszvjJn*%(12b+*8JZ{IqFey0JMSeM+Q zTLdm@F7_jL%dOU9F7|R> zWRkT_t|KBe-+jACrusRR&Ni(3?AKmx*!iqHshlu7$g@9m4P|bS+zi!mZI`>M2N}JK zGA#6h$iY?GrbLa1%XhIZ#DQu|kk`gKF}+&BHSLGw+3XhY9v*x)(kp9Y!PRTDE}^X` zpPRmj=N4m&kych~>)BOo(p-9Rxv;^atu8mDPBZe>XUAwUQ`bv;-Bp@DI5%D!$46{a zqS7{44w-xU%uGh&PlyFw)nvZNW`)emVK#=!>nHJRzm0i>n7&+6&#qo^L9RkuH@;wN z(nww-k85ncAl6~)Q|w-_t(BN<3np#Du4r2sXK&RAOWG!KfrN@L?>a?!R^rZ=`o%_7 z3vb{#r+0my#_7VH5)V-Y7&vEioHOj4SkKs8bh7Xj+;$ITjcuotwB_QOwn+$`>Y|PB zwU!MgRGXyKUCcJ1;wuE_piS^ReS~^{W|^=M4f&QohJgx=J;JR0dm0004O9BHS=)U5 zCNNTin@CGEhH4v0M4m*BmtRaxYEXc&_CYwwQI^<-{n>HbJ*fOG4_?K>ul|oZQSA%Y zUrCcdQ+FvL&}SvNT+9T0Z{%TWxbdE{#{ge#LOW@DoB7phSvOzg5KPscS==VnCpil# zX|VfjFM5cfqTBY6J9jWqe?aKC zCK;P2GFn$H!tupHIom*c7rS1g&6upri(p+%2Ph&o1cq?cVmMbP26Dp;X+>j&oROi^ zPPMCiUWAs>?0nXGJ7$DXZG@J}(t|(M%dGvOd74F+N&n*uwLhORec%R}MyT*ziv`27 zX@wysFdFq;S8t=OoR9ADXV)=87qPv)N^=ND^<55;LexZ43b9*F03^hq{**|}#f29a z-7k_kE4D^FiCJrnB;)OU)OaI`flZokmF*f<&3;Sm#f~nnnYzF*J7j{!-z_EW-?Mr3 z_iC3hE^Xv@TmO9~RJ=5UKPkNX<3^rdIC4=F5+$RA3R~tLS3fSHcU?lW;9`P1DTB2d zTTe+CObB8eG1gpCf|aW`R%i;11r5J_qDEn}xwMZh|m!Y%cYca|E%L z6@10#jRG@kMNwsA`ZsMnBc{!yro(2G5gYk~#m(R94@C0SH)6FD)##2*%>d`Sm8e15Wgs0I6VXcr^&853`r6Pjbr zc)8N(A#1c0H(Vbw>K&RD)r~TI^-F2^oQeFywi8rRM3pZZ#PZv(RL?5~nUe;Y9;5Kw zZYh&`$pn`&)%3Qhy8*KwDirzUJB_OA#c^E7w3jk!Dz3-kR_Zs1X0pbcWuul8hRtNN zdXAca&n(lyfiuF98>=3C(UeTDTKeqez~7}L2V4+eubOBZWrw(r0|n|Qq0zdbCLfX- zi9c&K@in5Eu6}X%anTaDuWOu*qBMWTD8FEQ*D5OVSsQawJL0ZNssoR!zV1v-W%PAd zFYNowaTv7Hm5{sEb=5jqk_3>HBQV( z#=3grh$@48!wSu=LQ318Y}R+XcdN`rh?H@4qH|Xz?7Qd^Q*;M5@;t<7wRgAV#tC85 zH5w%hF^E;+s{x+7G}--?;^bDgqWvqr0p#?d3JWzYGN7&Yq6 zRZB1UQ<@#e9q*;a;X!T*YY*x!zwfhjYmQ<=eskSD{4@$@OHD?8|J%q164t#fs+%z3 zCN8?zwWN*3{)8)zzNQ7y_l7;O6t5&}EdQjoF7!9mPj}q=HC6~SvCCJ`=?h2puqDLN zdj#EcL)0s`Whm(;O~0{x7LgDywFXtJdx?PvQ`)`w2)nuNYh;Z<&I=m=cv&8V*t$;Rj#j=piP}zE#vmci6ANmDHS(WcQtOji#+l z=QiMNs3^v(F?#Rub0Lm;~uDh?Q0>q^6=N``y}si2*=UCdZa%Lu`+c)_FQwFu`o3GQ3!91} z=E)=&#lMarXN^=x)82*!@$6L~e1%8Q;NmcmZ2L$&Z@XsU17W zjnZW&y42oX$ocyuW)6>o=femDBdKaKOx}XDVK-P#KUV*P{xAPBw|Tj%*FVihSa=ah z=!Kw<;!bj8HX`I?{&@OXFb~%QCsV$MArXj*@^Rp^Jbs)pzjjB`_iJLg4rQ>j?4z4 z<(S2OCX8O{jUMx6t?e#?c@0=x^C$&cKy(XC=#>Xc_Q?6E)gD)BsYqNtz|9vX^A!U0Wudk0*g;u!3q81VjnZ4KCMkK~;?gg!UeNFzFU`}t zdDS>kv1=IQ$e9=OJZ#Ngem!LG#%1~YjOIcbCD}+L!81}pRvZ~;=)o6X(#j~9Lrd3W zva@CMbv)OZJ$8=qR-YuI3ryblT^+oYlXNHlhrU(R3c|JR6yNm7O7wlE*}AhgQ13Q^ zYnQT-ylXP4V+-(iwI(5QCTY$QZ4h67C1rkXmS2aNb^T|3-3_tl&UJ913nX30ETKM| zHeAMYMwI6Jw;{cJzsZk`VYXVDiZCPfFw|_tgpK*gCG_A@dFhkm2CK43mmcXEf7a~4 zAze0}9VXq45|TETP|$NVg0?@Pu~kgC+wpu_8qY<|5-yuo>6L_bv6)CI7Zr`UI-~YB zn`v>wINr)!Ei0f=V{p+xbMF>pd`5PcKeSmrcRr`l2GV=jw_t%A%1^6)inLHft6JZu z`T8!C@%0nuQD47I^0jF5&Fy0({$0aP-+oEBC<@u0g< z^Kwly+u3KT*8SV`L~sjfH?_C*;}giPoyMjd%kl1&{rJbP9DN-jeBx>URqkN$>8JSn zo;h$JWH7EpOIu3bst6=F@#5{ z;%F+xkv$l2W+>NQ{>sue0)7JQ$+}-7dmm1{CKK+&3T`#y^3d2|&=A^Y+!_R;8+G|B z|A8ppw`v%Fa7(V-M;Wn$qM#Djk7?}jsB8dTGvFw9l@ci|Vt4nFj5Vpv#-_RYm zWnhC?6-SfExX0cqn~;fVUPKy#GcMTK#B*FE=Z5I(K5J}vN`&ef+9mdDjOCO1Iybne zW!3bBluZXVQZ`==v$*qYzP0i7^l+k%cYR+Jn7BBBD~#F9#>0b<=@L^PRC}K{0oA)& zaL(G1snle>6@6wdWy5OV?90y$;kk8&2=u7Ir^-Y@g&8bSW752hFebsy;&-BzK*kqL zXgBFy*DT`aSZzpIZERICyd8sOu+7*^dre^0+8oQ`BUfw6G%khZ^VVmo z;WW>u)u%6tLVT~`#qV3qb8e6ZOpOi%@P!ME-trQXzFTG%*NcjldZz<(S7nBIwT-_* zCXH)drk;XWy-PxxhHR&uHd^;pnqdo@>iRSucNf3R~rqO>H)aQ~fDXH_7WR<-N4k6wS5P z)h>LtZm=&14}M_0WZr=BO1bNY{7M2SY7T3>zSE%9XCvw~WtF*Q74_vozBG8Gr3QUY zkZ?nr@8r49q($=zp54$CPY)_|+OkSKCZ0P1bhXTux2Vd<&A7u0e(si)Ue`w^@c*wV7|N_HO-t!Lm*~ z>JnER)LS;+y>~mF2iA#>>Yv<5Il}N(zd`UhGarb#>amiwM~#YmCX1T`(Vg#>PVgn; zuwJA0GvZ6X-(*Rh_|Ko1pz+s4^;T+-ljNH6C#^p5yeKGTP(!BglH zj%A8=YK(i5lF2GXpa|<}JNz24hkD>V_M{-V>$! z0|t|7(}YKj>XXJ#)ixJDe;n`z+4aSSjON{446~5b~Y{s~}%Z|()G49VU0xvFZhUa-Z86gQ64Th#0yBFTT zyT3QeJZu!zWQN%2ZJKq%Oz`W8J)=BhyxVzuGxbAHz|B5q5I!`OuXBx~U^`&4Gd~A9 zL=qpR>=9I5gW-M8G<|)f!M11XD1PnlfCgN>eZ5bkB0Gzqan7LjxKDI=%-~sR+*c#_ z3I{B$+>_wff>{SC)9r<4_%2BxnGpx9^z{RxQeU*1(f0LbX)V{VM)et!6KBVZ8mpT5 zt{=D@%JC&>U^nEYd6ZG3_NYnpGvXRw)))QJ^-ojgMN2I5M0=+tQ(c8|U&63oz8y~V zXAIh>4ce!SenP`+k4##hv9U$uQgP=P-p`oE>sV$uRU21h`XOmtHbgjebz^o@j-1CB z-1!F2?tM?tThT^dH%OU}10Sy7)|flS?B#ic(SMI=kBHedRhZ$p0j?sdGV-tc+oNH_ zW+IW0f$tug;+2y7gS|!8?z8vKz$X1sJ8pz$1v39n{jUzj{rGEk&K$uZ6?_PCDI6BY z2k)2Qatoe!1rwKgcSt5S=cPWj)UzqCk=JoW9aRSwYKZ%~RMjx32yAdeG+aW=q#{#~ z3vGeWNaCu5?j)(qf+ z85Io@eC{&CQU5S0p6+&yIodB)IXYjI&|y8FIK&)%lZcyNU*-9%VPvS-+XWI#E}}m1 zbxGisuGXq5FhQ1<0Cht(BbSg^aS=0ndd)oU+afPokA#T(=p+QXi)yWn!7SleSfidB zj9P;2P>Vlmy`@(RFL7g)$nJ$a*OH@!qSogoi=a~`R<7&Scv>QYPiQb1D*U<%qpm_fLV>`X^}N*~CUlV}UsP`zp=*7T znfksZVwIR-VIT{RT;(RIrAk|kw%n!h98YPSzD@6zTLrzG3BhU!be}%~99)ZicSNgr zq}HIcOSo`VX7t7kRt5Q3d}oP1NtSt-=lv22zT;}f@82@4jb1L?)oRQxwnNIP+DxVs z8iPyDk$_7Wwe(9pyLuaco6Rn^=^!;NW_F&vP1F?_lydV0r3S&)HHdC~ahv+Dn2N~r zC(O`2A-Z)H68*kRdMEI!Ir=jOfnsna&u2Ae*DB+{4c{+(ZC(E~Wv6jsosBbNMp(B| zW1l$1ACtObL3$BoX_>xw)~Ip#G-m2c^3=Iu_VpH9LgppPUBci~G+OGB0ql!5s-%si z)DF!3fMkn{Of)}+>Rr>G6!m3O2JhV`N{9_AX@kkWkTDY)6Vj%4t>~(2oy?;q8ES5X zskFbg8J#rTjj;Yl8t=!<(5)25k>F5xJT1z1i9poeV^rO@K)J4AY6SS$6$>@@XwUj}!OEYpq zjDFtJ`287S+@BTg`2kUmKV|amh)Kc<+rx<*+09#xMqLe7UuEAdj339zOQI|nwx*;H zUO2M*$J#`@$oA8QOF?~p!gMaSAS2|qXNhyE>(+7B7j-(|u^EBv-Y(@nde% z)YnGvnQK=PnL1Gw7vHj~ZRz{5%VF{=LM5kI@UlNP`nrGl7f59EwG_xn+~0?Z(RU#i zgmWV8q8R%s_bfWdNrtP}u_1Ts)YoFlto~*BaK6$-AmwATHqypjsc7oG!=7kk2%F(+ zPE=QNj<-C3GrC-yIFAu?!3w*7D~VQhC%2B`@Pn^t-?m<-Ar%F`Fu@cC%sf0Z5kB$# zCR>jgXXb=s7c3IBB~3F$O@|Gix`UQnE>BrBv$0PU>=Khj87Y%T5nD3ljQ?|SxX$;? z6{ocha_MTgg8fk>j{lQsyX^Dgx?ZFEW1MT>Q-OOi^~9!7aOhS-2sBk84>iu4~#a{_ivstYA{+ z?2V$};1=mK&)FBGo)&Yy)2xA_#^!3Q{|b}-Jtm#UYiw@#SdF=BMoMiYDO}R{Gis1L zYh00)4sh|gND3D>nVd_leVah{>&0&&g z&YAvr*V-qK0b&34P9V%F|F?L~7|&Ne2u%Dj&Dx&|Rrborbu%Q3-8lx^flbme=Sz?J zoJsRDYxHZiddz5eqK`bV|N?g?Yk|4hVRZFRG&sy{l=Tk#s#$pHd3E4iP=0}l$md) zPgiHWnY1q^1y$cUM%3PE(C#tKTGeqsH66kl*+oQMmD2aFcFtVt%VR`2-J%Cy77e?L z1$lqWB*uF?n1xqr0q`Zda-(dH4f>+*vRMq3Uh#dGOS11Vz8Gn|(_?ZVZq(jrnyJS| zH8AW6`l){KD$3Asnlg&6H;;hmWRD7YMV&QEleA{(SL%jnQ!bgz40uZV+rs z5!rAZ8#Kb0QAN&d+_YIjJvQ<>(V@?4Y3S;uA^d5L+0{0S4ijdR#U}GB$BnO{reQq2 z`I8IbAm4EUIYR~~VSK2;u*K*hb6^uS(JLh7N}^s@Yy8sDA!_e5Tx3micMX2UWI|rh zc9l1Z-lCh1((;UrFl`ijR&TjV!^rVjVB95*cMjWk>!<72I+J*f&7!5t#)*2XW-$`~ zn%ek-;$q(|$wsng^?yhh@o$UHy*K->DQYxq^0s#$xbS`ZR?&XA>Dv9WFmQv)9vw1W zUx{fwLyY`f>W>%}B68RI9;3{tS!|;YUCRZ5H=}mQ6u~A!l>7?hFy!z5vyrP>zFaEl z&SdvdqW&wkYq%8)cDzo-#9jjZA6_ondzr)Zlq~!Fint7(pDFVH2Azbw;qq6|<&~Qz zIUo5L#}x@;6)60>+VOaoQ}P_;8?scoy>V+82G8-4m~32knJzE-gCffRFzdw_U3_BU z4dne$vH%ipur~F39BOow&O;oKB=bA9zx)xM&=_|;VX%oXeu$lqa}=pQQR>BAdV7l< z%Rz~sv;8WL{TyVz7hnFW6;T@8fu?p#wE6s0@A%<#xt_D}DSFXq;t^8%|E)-$=NH}- z*8c-!=`P{0zWZEs6eqmDzEJY!9?_A#wB5>t z{L5WJ^lyo^@f)R=+$c@~gOrPT95a($o%0PEH(>?2FB*&gw~lrFH+)Xe&OeM@00Skcu= zw7EJl8%d_bkbe9)%9D2?_*krjl;@bx93ob6bx(?{drW+!#{zF(GC~YYOr&g)6qq2Z z0r>QMa+V z0tmLP=egBXNb(jj%zIn-l@K$T8od(A{)qbVCuc~w^qMlr+NfGzVs`$>z4}mXHz?9*(TBBbN4;V^Jo(jQ8Te?<;L)*O$0Q`Tp+kl zhQ+1o*_TZ)HEJZTUf*@i2H`dli92_U%E}oD>zR4^jKMIvM0n{oK`_)Hc35+CO~Q!p zF<6~vi;qUJz0WO>!ah^d?DBi)&D9xxoh=34v2WGcQp1^NvQiY{YGu~=E~A00jWhP3 zpw}T|!Vd&IyJ{12HT_a2-L~kAs=XUEMUtS_sP44Xs*7y6lrlP7Y9l6N$em{}IY&(5 z2X2Lw-T4wIu6~YawO{JWX9O$XDYRDkN0_k7tP{1=$$)bWbEO6@ zkjin5CeT|&8!YtiqqjZmv~OC7esxJbpeS^rx>D#m4N5DN}N1 zjRI4)v^`;TTYPQ^Z8pnr^uL;^4q8ozwhIO~*p^CwLf z9o83JtJ?dnMKXK?nNZ}rXTCloT)1XirYCj-D_1v1BRuIGR6O%QD8z+ zj?}}``SqC1B5yFyS zB>PRSHrkjI*4t-fi1^c^ucPdg$>>I#(e|gQ!s7wsuej-pvKd~91#qYvt=?RG7xQvM zM47Hde9Eq=MxI+Eevg_)tDJc;&%ImiVi;_ z8cuE!WmbzH-RO-noBHj!deCSyNtiTA-fM768w`h-WUCqtFJqp{b=NDZ^T&+$FSh>2 z2ysO`8FeRP{#xMbl-~#uw@Nm(eCJEVv7d&bv(GjF_TXZ(qyVfM3ri z82Hz>!M7E=Uz*41zpEd%C;sNfO%*qI_oj?v_cyyq3NS_SzEcd=%jHi0U+dS9+WnT5 z{Ql?$jFLy?dH5IOuQkuiC39tz_`C(;MmJvv%D=h>hsAv94gd1kdoW!7Kg!+&z^Cf{ zAAim{?|a|-GW%j??7J*cNs5#uDJqdj%6m}?rA0!LEoqZask9*}l#ruFyu33M@_d+YJ6yp&iqZ)0;=A;AD2|9u5q{w69J}o}fIX8_!n%x0 zKQ7m(tl2;>X9P|u$26+Bl;?a{yx>uZIp;g)puNFb)}0Ez)N;;CHgrxreN)LeJQ7#i zjAuIwu4fBKosYRWWfknnGV8Ke{+n0NIUzDX$9n3Nu{BU_&V!u8a;|)tai}O2?H=v{ z58CYwOqB=|xfDOYWv_Wa*1k|8%sIAHs<8xC;+$W_1>a;TlAPll5RYc$@mNx149Ga$ zEJw-|3v-E;S50EhT@s@%;wR%!NcLw`Uvji;)(huPnO(Yg^fd8FzEM23^r6g|A~xNa zrQvL6JtUv_4DTf9FzD65`aD9)6Rj^5Uy?3`msHLaoH93Cn;D2Tqq;K3)3PpGBo{cw z9tDrUh1YcUie8`Y&3s~F8$0mEyIWJ zo*cmC8qWvpd(u+5hgQWr!tgTA#VUEP&)LT9&PCZR)Dn%0dDc$RGVarBvBx@_#HDaO zcni=key)K;&XDA`h3s*i6Jqxf3izp;{$7Ld0)tqy#O!kO)yfE9M`&-r@ zFXu8S6LYR{PHeEM=~T2>at+}VKbOQ&-Kmf`g)*SvMTRf?kCi?7mykx zfEw=~LN2h5$9!?g9JJUxHp-Pgllt*!OE{i8MQ`v-(d;N2oFenIL#LAoIJ#qSki#4DV24JLepS(&RLPa zw>8hShG=Y(*zECz6Y=RWk&=>}+QYHYIV#>MeFE0bDHHp;FuD-m&H8}XcQ2pa`P$tJv}2SneJ#ReOQrlm@Ru{lRT5sWRx&9Ze4ZQ(U?v&Nzz#w$r#gvO~^Wn`KCWzPxIo3`o_f5Z&-`c1f9CF*YY(cxv)`gNJs^f|0Xenbmb;?--aa$)#ifjv%$2NX(Eo(a-z{Pn-Lmr7*b07C$$#vMNE7-D3+up!BEEA__ zD35R#b7H%TwJ2v;Dq4<+&J>GQC$D1p7fXI|vJv8lb4GMH!gl0rVXscfte;LX`*6Bk z`kLvyF3DmGC&Z4< z${lRQb$NDWd<};i`nQ88Ad;yw7c@$deAVTXIi^(bOkE={2PO^RQAJoooTH*$X>2=4 z-a4W^S>{;4IzaUbxS#WHcz_kMMisMp?!|2TWJ{@bcPHouCCRMMl(Bu4h?mnNu(D1O zdm$8WnP2l272XiRn90|Ulmp3R;TK&?=AFL*^`-CS;=9rO1ec@g9-qu*o##_T68;K7=`=R3#xi|6o$Jlo8V@^nt!lKnKo;7|8 z4>_O(dWF(4OEtAAzU3Shf3ih9!%4|HQpJ}Zm6mfHkr;)7zKLRHYv3?ytH#H zgU543=9s&@7w8kBjR!BqAYMDF!RtbJG%Y?oBkP{SdP|LD)(r(avxKRRj69Y70M#1B zEsfbWsV&c`I9B4B5`V5iPd0B&Vd!pIudhb-~=Zqe<4 z#Mu_BUO~H?W$T>hih_fuvZJL2$2Diya$eJ*M7o1T&^Kx*Hr`NTV#PA{haUD(lqp`_ zw+!E+W}NvryVgTi&H>S)64oo{3}0V3C%I=Ocl^OOUuDeHK%+E z4D&iVM_C^zkjj}%RyoTsMLcRD+laGcCZE?om)9#SS<|sbXF+=|3%LCx`#N&(=RS+u@k~=*ML)Q_W-ZE-$nKuj z9-r>!)pyDz(gm5*Dc-`ewIzGW=U9Lj^ezJCa3aV3=kpc|XZewG@T74r z*V?sDMizx6mU)mR;2dW^6>BE7Ur9jq=4@b1i7$Tk{1lMul%1lVMNK)z zrS9i`&M#XHJjR~HImI$}3Z`IQlp?Y%Dq|U@i8PM!+;OGD63CU26W5ZR?IOd}@?N0N z%KDxYIh^8toJ!Uo3b4OV*;_hiS@$S~$9b_T>n*e#V;}C6&fNlBA@fRM z$y0M)L8tOI&M1mlXDB0|Ws<~makgy3>QkE7)JT5%TNmr6Jpy%;u&j+*FLqIeQODOXXmV3+vKzSopp7$1JARr z({+-6R7t%iyKOJDmr8`rPi09S5eqElp2?CcxAWrnv$pW34(}>b)?d6*+Xt`*@rY%f z(Okz#mHZ|s>z?r@kKurvtKbOc?kpFno{;|YU*#V57V}yZOSC@5a>KjqW&A893eS%N z&5}9bImG>7_noaSbpoF&y%RLp*&_PtEn<&$P$XGamt~bISzW5w!zuQ;$Y_D&=H75s z&w7>3HjGTPJ@71BlvCRMI$*x|f{H56S`N+R^*t*wK=+$1^b+oe(2`R?li{zA4Fr$TOY z%M?$yH#`75UXfmv#KKdY$vFqa1El6~&&jNxc;7Ftl$$No*}o2wC%;6~Le7;blO<1j z=u}{c{l0U2l6a5hEcx(?M}fI)%S4i+91w}s6YHxiX^HkA>xpx4E$2_QSpzA13-?)z z^_&__VPAQSvnA)0c+ZUuc)be5UN*A5&}BS3Jf4wzYxpVTfZV7Qv{!7fDa*tu`}P3v z1drL-Ad=iG*D8LVkyEt{zQ{Q$l61*++6mT1a)};B#J{D8{-0w1PARKi0k-3K+sZTu5LFwnXMBk)TwxfL#UqdDA@eZ*4;&)hupsTvG^_8TucZ!H*W%6n|``o;C z5y{)a950-cqOrB5-H89pY|ZDrQhfLkjXs^dtZBG=fqSbzfm;rXt>q0vJLO2vCuBw^ z#oL?~Kj!^_^?9S%Z_TxQ-V~NUxnyj`lD!?{G2?ePZ0~znACTAX12$a6a|v0{WFTwl zRylhzM|vWu6r7Q)rAR#XE?LJS_CJ)xo{)UvfAVD(=Q(mwvc!Ta-krxypGSZfMGuo@ zjz^{}0Z*=Y1H;~ra@k&-y-ToOcnKU|1Jt~Yd#)q7`-~5|p}ka#m;RQ=OdRzogC#(X zMRSf0h0H07wacmEYa3_ZOj!}J`l}=dx@-zt%_-5Yvl5Sz#WyCqF&^j0boLmQ=y?IJ znsZX3Qt^~UXb(s=A!9#Ag5Ml-?qXfR*0D$8m(97gQz(%!S!Ne(eK}exWnK15?D&Ii zlWd7c^+X&0SqJP$604K%i48g8+86;9j0a?lOpl7YX@-qMv-#~kHN|3@i;}j z*)!ycwm1!W2upe*^%UUGMI=c3=1{Se~JNv|wUnS!_$fKf~1?-CgyPE-R@lP>yB=%0@Ku7Y(!)t0W5AR-(nZ{Ojj%7|s?Kr-t4&ZoHE|Sk@>5)&O zXO{Si6!zPc&3%&1*9;VrwK&mW2)?zY9s7h+5<^d0e3q24Bha#6{O9lDInyPMc=)P- z0_^Rb3vxY^EB!Yd%4f_K>uxLARL(XY|2gpq7i5+5BmyRj{L93$%H&-2Wo7;1GfBLC zOPOgC)?}(Fd0H9AAWCA}boR5AIfvL5sGdZ|L+m+8i!|JP{qLOX4EuHVvWDO#LoBfr z@tjHUz__n|;I#IRGkwb#3rw#cpFDtn0|3p!4Q^BUj=cDSv-pIrS@8&7(26pIjcUa3 zu_JKL;Qjf0Yasm?AA*+;G#=R!PaDTxvwMki5f2Zu{2TG;+pgG%zAx|x{DHG+X=~i5 z*I{?#_x*U1Oet>Fqse23;YsAUq*@Cza<=t*lZUYBzHaP3+UGQ?fxq5-d=;O)S-)BM zpGg@n#n?<)3a2O&pM=G&hIyiNnHa=gPN|%eV(w?yQ8|a?BKIhpptGF~jvBHnr2waL zR8x|;JuO*mNprE7)VMnWi&MT9rcV(`!4Akmm5TUJv74uMqQZquvDA3xF%+D_oGwuf zP63?rqYHt@*_fQIMSLz_qjGMM#mwPF#=}TU`CH71UxG~q-YDU*NP?J_64UX8lfhXf zj%VM%<)Dx3;4x>2o6#d%g3e_#b$-srrr!y$;pa)9hx!}25ygEK9U3&N;iE4_wT64)b*m*dItfsu934 zG46{}Y-u8E*P72o-gW55IbN|3v|Ai`jiHl3XRvuWzY3>EK8^6mo!z{G6p=NxQb(bs zu!JRZP@J4c0*H}7RP$w)M%L~|KqC@PpM*0ydq%P5)N*s6s1Tz+-VSGX&hq6vwUkeN zlH%1UfrCdW<9ndpb09EHWFBEhOO1GyDSbVM6nh!#Oi=XdXl=-uYO*OiJH)LXSdKF~ z=OtA%>u?sljGHeAP8`QfoytqeS}|6fT1cN^S)*F)Dx8zNM$S0?)G3no7UBRhJJ&)> ziMW;)GRM|SnCJKczLY7Hu#h_px`8Joa+-NmbmmBTFVJOWoFE)-#3^SQyB}(t#O~+d zn=IinajQXg{LTUC^I$;cDB*4cOVv3j-_4uNvdwg}h9t9&IY*as|EJh_JEvsz&+yri z4nGD=6MMYKYvJsY01}baKl>>=@9g~;WUJ@Sof%oq>XiQnCB3?XJ;3W(>cwWjMwq8+|G+zO%o^TSx}B|<*=4gxO;nG zfNh-8*ta-G#J=`(FvOGJMx*7Rj4-t>U!rA>hLrH&68Jre@M==>LdHziOzO<`=xp(^ zoo2F4(KWKBg`ChiXZWI)nswz=&cj+kZ;DKkCB+Mi%_gyIosvuXS;100Uz>eY9;YNu zx!B{CBY54wg<&hy0G_fD&!Jj4@=V7BOcXrC<@M$<5Phxda@+VtE>JQaUk!SnSZ@1rK9`SI)>+TerdpDQB#mb2trG7MmTzUTr*#hVOnGA9Y_f17 zFqduF+0OP$HD!cB8AB7%gkuYMj+fs4cvx)ecNxhMNi_1=OH(6WQ)d(Fp;PsS2Q96| z8>|xRzCMr7dyd(P=X9jP@r~6n#oH7~JA>k|&dvr^}_?@iXUo!XH z-fThpOL%rkY`>H-fO`wd>>>r|jgnZN)QPp%*}?vY0&?EgGLnOAO-@-BBu4c)f1qr+ z2uPJNU*xz$H5&2wck)^|TP23p)vuu4&l>9-5}gl^>IM3Y*wJy3NnQ3H&TnnmS05Ft zRHFYGtQF3dy4%r1ko`8*mh?G8WPTzefKONQES&x9@$hUzmiBhmJ!e;6wx(mUrbX;s zsX+#}>=LhQiD&aR;Pf*hmqbBH3Dfvnl*OxwE%G72gVK^cyBX-B`P`Df0(wh9)&Xaq z%+c=aK}+ff-MBYjd$j+?GI#cihM(lziPBgTh{P(3MFCYaVh??WSos+WhGM5>(kYKwU}r^N0KN=&~fS!nJkZa>FbhYWKyu&|0p(o%Fgqd^?BEk0p?caDHH>aq_h zXK#j^EqSJArEuO$bl`WkcWNU3ZNJRjd|Swz^4)r(6}IGKL5ZH_k{cA2@p&)YcOy8n zzhw`|Cx$?z_JQH*A?QUuI|WIb5bI& z!+AB{e8L&jad@GM6?jY39X`K(@k`$x-)6imXpV2I?`?j|9A3_wp5r=?=XAQx;}=tX zdO!pCwZA#8!#=;OGAY+zgQ2RYuh3UBC+Rw$yAbc8N~@1shBr3FK81b8cP@gis)pcc z=;vqPMN|FpO0*fiD!haTXUoHDKl!Yc9i;Wbk2sNUI9?=zH$LX1?DKt%x0+P>&h^XX z*HK=?yLRkTc!^ZysoaX;_t;46PH_q->!(#`)eqf^y!e>azm z4E^T1E8F7xKjmKhjo*sy!ux#Bec`M6&F8Op6t6le#Ore|y{Ze6!8?Z*`zl627*!wV zmSf}}q|$^6sjKi}rD^E=Kg ze{N+h%#auC-%pCqx8h?ggiM#mB`uX7`((~F{pC|~XJJh)G{WfL!mG$;U_@TLaNEBX z|835_(1HKWN!kusY|brzJQuoh>iw{DR z4&n`$8x9S@17_y&L$*5LZDuaKcebh^_tI-vD)COMoa6<*npNX`7qfHAFZcPM%MInE z_3>3E`TQ+?&c*o9iT=vfz6)>o_c%cTdXtA-XuD-F?3N))tBonCS>k1(_HmjeOyai zo2+KmWV@q1$6n;lb2oC|?!Mre>{;$P<8^sM-df&v-W$EQdhhby?|sPogm=7mns=u6 zUGD<#7v9}?@?vHnC(tD@BJfsVb)YDi8SE5%DENACW$;)iHFRBQNN7gr`_Q3qB-}0> z4Zjp#9zGBWM6QesicE`q8OcxbBwd~~AZc>alBAuES6pf>a z)qZ^7_nXiCR;B7Q>>SPsn#pNH0xDh zx-|osX}t!_vStEn;C}mNbUC%9>*z-6PQ9oP4WRpJ2o0mhXf%zd$uym2&@6hF=2`#3 zH?;LS&{%H(Eo&Cgw%!D~t+#+4>usRdnho?>?*RSQyTG9J9x!CR4-8u$03+5MV6rtA zm}1QXrdl5Y)2#Wx4C^CcrnLZ=ZG8-^L8sw%^^&K$F z`W~2VtpL^_H$^C&a;Oe9qUO}b`T?!B^&`+@tpxh5pMU{t6)PTIv2i;D0(LjpQgEWGkfQ?R|sq_-fw6=g-TYm$M zwH0Vt+km#U9q6`p06o@Dpx4?3^jW)sL2C~%WaR_H)?Q$ewGWtV?FXh<2Y{(o0Wi%f z1g2XDftl7JVD^8^#I%7icaFWa(C;!~GZ1hlME zK-($?2CdV;kaY$awn~5zs}z`Ql>t+%v%pmA954-j%XevYt#bTrTjzlxs{$CYDuGG= z$8%p0{wkoyx(M{5mG=~<@r}U+rjBjZ>1?aL< zftH;HwC!}D+s*)b>`b87&H@JPY+%r?0SwtWz_6VQjM#a=B)cXs*{%glv1jN|G2EZ)4Au!u+1gt@U|FoC?@m_Xge6H;#K$qPVXxq(zZu>Hz$8HYv z*)4!UyCpDUw*n^FmjhGm*1&YT4X_5Hl*_&XR0zlajZXcKzqYRgkG8J@+ICx@+rAp; zvD*Q?_BFtO-5waUuLXwe>wsaq12Dzz2u!uF2d3GbfSL9Uz-&49ji4Z5%ryCuR@xAh5>&m*{8T z3r=kh0=n$`fR=qf&}|O}dh96BYsY|oI}Qxk31HA30u0#?0K@i!z=%B*m|{N!OtT*b zX4u1knf7pCjp`o89)UJ(KLYgFj{-yXNMNe{7%8-hKkD+I|w~vPS`J`zfHu z9u4%_PXojD7$94Sjd6~}|K0XDV5+S0GoaW~`Lpr-fBRWr8X4qB@Z|Oc{H5*ZfFXM# zFq6M!v4%AfiZ$*M#hP}BVr{!bvBq7ZSnDoPta+Cx*1k&=Yv3iS(?1kz;-xm$#3ui) zi8O_@iXtv(6{F{Yad--?67&LaNHxwE(Go@cV9u9;al~lmd=)rEVoy6*?%jwsqtVA( z^a(Ae)$}LrrXy5J6^fLt0_qk>qp?O{GaOg&)?JK@BY>P zp04hczi0i!-}|4xFY))O_V;w05&h$g|8u@xSfT$l0-U`s=J>zPuI~DWo~~{eTF#>G z_=ldZdNIwtVZ^Ut=24mnjM2Ywq!(9T=zezy$pPtj_r-TB7t9Fh-kzaoP+_&=z2I&aG&P(l%g>wgcm| z1DJpw{wL>dv_xqSFh=>nIPC={Xdke8p9jzqr2=4#3W0Gt2uwh;|C93wTB39m7^7pr zI2{KjU;+QhS%j7-odU+F7#OG1zyvJiKRHX$5~VU=jLrh%bPkw+Mg1pd1zMt135?MN zV4SLe3AzZZHX~gAf>SAAOu;$kz_@A+OsF=%>YP`jC92v1W9k}UT(t)#)V09soE^{-RULsbbv-byIsp^v z24Hp0E@+9WuE3b;28^qlfC<$dSe^4hv_#cVU`#y(jH`!%2{jB@opS_QqUsS~Og##W ztC7HjdJI^d^9i&>)sw)O8U>82r+^7H8d#lk3|gXUEHI|V0psc!U_y-tR_C06mZ*9T z7*i90aWx5;P?LexIj5o}s-6eN)HGmRy#P$8>A>ooFQFx>IGV@QE5NvV6_`*nfYmu? zq9v+0%Ei>{z_@w?m{7BT)j8inOH{oLjH%hcxOxYeQ11e(bH0z3sQLgHQ*(fEH5Zsr z^MKVk=c6U6J_5$n0$^Ny3{0p`fYmt{p(Uyo17qq_U|ex5NT?;i>YQJoC90MJW9my_ zTyZQ&sIP$4IhUg)s=fin)VIL6`VN>--vg_2{(zRK`VkmYD}izK6ELAx0jqPaMoUz2 zEQqOJfN`}Jm{7k0t8=bHOH}<1jH&g&xcUQ_P#b{NIsZgURQ&~vsZGGR+6+vnEx_uW zThS6#5)ssP;oKpdJO7Jww{Y$O##BBquJ!^GY9FwAp9jzqRRzG9Dg?%rL%$s zyZmz`=0+^`H2hGkftlO-87EXkNT z35*+-VZyKst8=m>qlP6JGbO;dVHqY2%dk2pOEPL$k}-207&jHbgsB8p=d40Y)LaC{ zj023j2$*mw;1IsbaW~^tF!TO>73>%BY1DoR7_-?I#clRQ37dUUwf^nb&=R$00%JD& zqPWezC}FcNs?PZ)TB7z_z?jXxC~mVaO4#g+s&l@FmZ<$cFlK)MjN5a7341QEI_HOI ziQ4mlF`Io++-6^tu-O+?=Uj-EsLj48X0tDf+n)jxHv6LLoS&m5YO^nj+3btr_Lsnf z&AzBQ=htY7+U$#B_BX(|{VgzIvoEU7xdJUwn|)Et{t+0rR{|6EPr&M&KcgjTvoDI- zYk+b47hu9>UsRp*H?%};_C+z9eNo(IUzD)f7ggunh?c0$z9?q@1&rJ5ixM{bqUxM~ zqa|vyFN)dQfN`6BQNm^ms?N!F6t&roVm8}R+-6^tu-SsDak~9ziMj*8m^%oJyFrrvT&bRA9oL2CUARftIK{6Bu)60psp$V8UGkSe-K$Em3zKFy^ia zjJsYVk_5_LBK#@r2oad#tN!rd6imNEuc>ISt+3s+}uToHOvwe-Vt1yM@~ zqkfr$>&p~W9@0>c$UrS23$>;is95Ks!c`OX=h~=U*G2ubKCVI={(J2o*X2ua9r``4 zM1Q4?^f&FI{dAa4QVE?WM_J0Rl2nGuRdrQk)k3vZ*Qw6x0X1AbuAWxUswwJ4^_qH9 zy{A4@3)Sc9YqdiCtbS7))!%BD+OH0)ld42jn(NI#v)$yILUYU%o3rME>oa@0J;R=5 zziZF4Ke3nCU)kT=tL$Ix4fYm$r`zX_xYP0e=X%8d_!w9sIOxs;_@fBYFhqU+ghNS! zT;N#l+K&yWZIF;fboX-5lOZdcXux&g-vp_-iSCJj{tfcO&ec6Tz;h6i^b+0s1KKy@ zJUG*!7eRjk>0%S?z7F8&1vv+Z?tdBWCn515(cm$lzlH2WMA0k3QyZ%gCW`e%`=3}3 zoG0E8?Qddbl86#3LC3I0$wUv-$Cz)%YNZej9RWHO>y}FN@I=r9u!3ns!}p<|HCW4Z z+`920zS{$drvo$$^P7Zm;!2|d4w?d4=v~k{$m99rpl_t6 zIB0qc&^KXUq#4mmqd@J z(c7iqcVVyVay;U>9PN438V7v<*{QA61_#YKf%cAc1rGWU=hGXoLx*+yr~==;j;_K% z3)`aoQPgPg|HYWEx=2^!pwAY7uEZ`%JEG4aPd%Nk!9ibQOsX~Z`PvgLyB~Bdx)uk0 zH37P6W8V#Ww_+;zS5pTZw6X`0U5h&6pkE#$!qxKiIB0E8&?VR{>_qe{{-Y1+1|0M& z%eItm#6jzJp`Y>883+B*AM`!c1qW?h4!S9I#ew(O;k(~aHypI-U9`VLH{qbaF;-l4 zbjLwkm!f?a-Hd~Fyo9;$!oCp3wdVmM*LJ!E2OYqebQkPg-bz$B1@uMgiGvPLLO-8k zC$SgNQOH-{LAT+cG!TdKV$F0e-HSu{aSk1!K{!+}fj&3UeK=GYYm8mg`*En$b>LY{ zgK?;gC(+Mi*e{Ec%03SMc@)E;a$W{cFYM^XN#*SYeJ3SwsM^poy`6^OQ1t?!8_@$e zR0D2rf;#Afq#6x`oM+Hb9I9C{`aD1n;ZV&tfqs`B#-Un{0RJxR(+-1rVV(358jeF< z37MPC*t;7+s+~>bZ9-xA!qpeQ++<5qcbl z>c1WQcVh?e2~vZxMrIT}i9^Mq^VUr4QI8_^5Omk|0X>C7jo>-%gu$1u)!X%Y^#E*b65B8E*Swc$04&7f*M zh18#~gLb2KJrzs)4rmuD*w2&N@`3P7Lls(Wod;T@n*9Q)?ejrfG#!W9xe#<;dJ%`( zqlJEnULv&@`lkn@zWp+({ojMWA64#GNEPOR9)Vi-tE3LWj`Sm_|IUC~LsxO-@EQ(v z;s(&yqaHjHsy`9*4X6tLi`1F5pgW>A{5q+#ZqOZ2A%26@dDye*h8_7?aL4G=T#0Jx zn=p^n!v7XmRpI9d*CcP_&^BxvzH2sDSiO+HX^1K-^4Y+rpc`Rd|6S7It)Q3FdpL9o z_xUxwk3(m`kC>&XyCTEQE(iSus;|g%^PmH0pUYL)I`@G7jOO9c4WQ3vDm)W%-o`UQ zPewf!neS!UpeLa!i~P6cd!V01Z5CN@n_8fsL4_8%@KxMC8hHk;&acVB+SQe&F_M~7WG?X%01x&K`+6fduO80P4qbq-S-&i z4T#vtn)@#Y{W~hU$er(f4)j{ob&)|2?hbk(s=LUe<7J?iBIo&v^n>v2u50LP9C}y* z=)S1*BBve+{dDy}y%(AFlkjh@n-T4iUqAg9=sxhW$g;;b1br7Wr|(HmdFmmu&FjQPYt-_&a-wOI}`Wc6Q z4`VZT&}tldPNmRmxLQ1)dHT{XIP}LKf*y{#F*5YUsh}T17WXUZCF4PRkm(>#Uy2xH zGLbbPTmR~P&>>Wkk+XlpdJ>@ZIP~}5f^LASGV=Ey_kpg1eTfaEe`Z@qqK!E8niQhY zJIHR3%Wqx+`f*g7kl4FuwuPk_E2IqEJlogg3E zkNu?GFq@^I-N<_Okhv9eu|23)=Oc|+1v-eT^p4hf4CHLJp+h*#v)w?qL%w_%CNY61 z@HBR}j*yvA1$ro|+(*g0Hw1Kl)VhyB1%C$J2Nmz*FiY4%U@+?5C&;WuJ{cH>?D8a; zKcUa|b;xj$<8EsNx;<*(r^xJyf^L9Hcrl)MG7WS?)Wc7cIr=&1D^L|bL*~>W&`pp{ zlt3LLpobzWEG2W{Y0$$^Auodp9tHg{>f~q1wwe%`-T|W}^?Q{``tNR+z zw~&Lw)f;}>jKsbl%%JZi(2pwoL$15e39S`&S_dKzF^?#NfbP0)C+LTiOCh_DbrIT9 z7P*Fe0i8UB-9wvPL)o_hZ285s&m< zT+{f;HF^;b1bdJHay?@}w^u>b=3UQq06jy6P@#8CVSAsV!l=``rr!nnS`|UH-u24A zK=;O#5w1OELY}UrDp@6y>&@AqKT#>D+`Hbzm|Z(ns!Ao-+*+Vdsx(ybT?>Ms-&5(R z<+~Q~7(T=GRR*~}?+?1S%2b);TJ{;}TT~Y6`mS#-fWAj%qq^_VrID*djtNuc}VDlL~>zr*KXJb5aQTz}RCyhq;aaaQ(uK!BZ&3A+&$&)^0=-k!M;_)nlLLCcYM>gB>n!x# zbw)K*4be61)U{nT!Y+XYe?+cbxMFOK`*P+$m%6GZ3Omhy*1Zm@scK4AGVAtLs+np= zR_48+FIShT%gD-m6?ALW9D4{>J;Xk{4X!&|kkzCdea2Kv)sn0hh)u5hRV&qstkyqD z`{n9#vf4r?T@R?%$jhzvFM=MV+Nd^Ubvy}ru)0EBL00Ep$hA(WE7g@`b!`v&Lv@w9 zimYz?p&P?-h1-^_o55o(R9CC3$?8=J`eW5jwIi#~JkX2PHQ1N12HYk*?NxiS?!y{c zpQvlqwPYpcgZ>oP$=8wfaBt9ms}8CIStA>R-mf~Uj$}RM1HDsSudXL+Tp{Q!s*~zO z)WZBWYyM@R z2dQqV8(E7mcl#c76LvYQFW8@8r$coo>l=*O?yGKAHemu)<%|jf7O%sd$-&Ho61+cc+Y!#E6|73Z3=t8yE8zyP`C3Q`Ciuf z3UvqXkr#Hv_&-yXVC4@wFO;A4OWB6 z?szwNzCyh@N_H3cQksHFb`10zpr@jq9fw-OzCb5b0`y11GX(V-yIXV6lTjym0Q8sW z=PmW1dXVf}5xcE-)KKg%*>}Jmty$_J>@wN?o&){1dKi06_Pxk0t=Vdr8b)>$e$1MQ zYRho4ALQ>|t4631WDkDcJ&HXj`>9o+Gt@{mlI(FiK-X7~smI8E z4!JklA6Ji){d^kew(1G>1lcd$0=k)cQawrbYfpi0q(~Yz9 zuK|67n#}c`Lgv2$Rj4UsA6<&|ZLOxNsbrr#1iF=a9=l%l8R#e4r(y5QKHD91JN1Hk zf$WNjLQhxI$-ejl=oYADy-03-5`DH+FR7Qv?Wqs?R`oLW#N0vX8^-pEdWGD{i$Ql# zuVR19opD0iXQ&zE&TRm?3o2r-k-HB3u>Fggsb-S9@#Ub`s()d}%-sTW0sXpqo!nQh z1pTXe1G{JLYo~(#P0hj{n)^o9$yKPUy-DtyQ!utG)m!QV5S-xgT5xdc68TeL(I!_LXWSc>?=DcTqp7pYZfd=nUvp*cJ4oL1&O-{H%T^Pu9m6 z+k0xYT1}qZZlFI@Yt$O@)PjDR57aN}7xL75NqE+(wd84Znb5zgU&+&SJ?M8(hefTk z#RH&csC8-`c`k?jn%C6tsM&e0|l5qcBqDV}?fn|ZEKo7HCW#14aQuePWy z_;2z&f$>;htF5TbdB)TN{gv9Lwvp#q*YP;G_o+I;0MfXWPx7ze1J!FnM+>^x0A!L2b)(0P)doqK>Mg zG4d3#jW<)r)p7EaA})YFp-$jU?9d0hDQe{>$&1_+$$~0UMYt1k9Ox11lsZLTf059| zs+hb<13^EePOH=8OE^5BeEZrK-r=?jFz`)kV}#z1O@0dV_LM9`cyHYRp8nc}I*zwjW6)i+g?f$mw&56CU2SU{ zmm)LJK2N)~o4j{kDgAgfc1QZahfsm`YE<|8R7tx}`^eiDF^CRozxI>&F6fEn*8v?M z?>&EEj%RdG2g!T?&*)R@kPeY|@EXt!bXbSU8$FKmrs@c4h~BsZxq(ui)A0oP_Gq7|Gjs-d zpI!+%TW9J_@{ZXlbe7H{@7PlGlc}?HHhISfK!2obX#BEZ!cvSmP3Pzw@=pF0=lw?K zqSoo1_AJ^z(s??Mye~IGKb5+su1VfkVT1aduBB^{cP8ZHuCHtB+T?w^1Nf)tI=T*d z--AqCn<3r0(J^Au_Vr6@^>;u{AW@pjiZ$TtOZ)W!N{>_7RYAx5}|=^nZV`DUOW^QgW>-$K5B zErL9U>s$4$Yn6#KON_qu6v>O?fY;J=DtMVrf(zPC%2OQC``&JJC-AeaG?bY`i*3O%* z@4`NlZ_`}Ruj+ofANh8-A@V<^@78yd@9<*uIYRf>{mEC9i!o&D0oXJ1ongP%N8f{e z5#KrVV?NRY^+57f;=9nLd-c8KyU6R(PY=?A$Zw9~yIb^q`abe|uojlB??-LdAB62& z>-AvNeElgegHF{^9VLGz#$(ObF&!g+-c6Xx86DSg^4Gow{r{*FIzj$=73lLOXz>v8 zH@*QppXmqm1LSXd1~NRXAJh+$zs(Mee~ccghm!xAJ5lp#qaV@_;aSGdgXeAiuzr~Q zy%38%AL(Iw82Rt|9lG%#GdyY*hz0sv{V4XX{Euc5 z1+(=?J(B#-T#ohqPCup}Bmd-+82>8$xPF}c)1m)XbNz&Vg8Z-Ufo!w&lln>W&prqK zC-f*iiv05)#u#Slr}R_gUu=Q@lpd`|lm83&BKXOt_0#14`ViXJ=rMW>`ByB&cR$i& z^;q(+fj+qA>v4J<`F|@%|LgQK`Wf>7&DSQ+>+yO#`FGt6{#^a6ewO?PhJYtiPtX&{ ze{wwJ8Pd<`=g43D5@<_L)Dy{H@*4Qd^dvor{FTsid!3%FCsP1AM>&#q`cquS7zmm8_UpIx+Z1?UIOg)Mo~>u2)EET) zfqn;jeu0NRMV}M(yZT)U42KT5a`k)qJqnEMiGHrp@9Xy|@WeF8v$_62e?Wn;%fUZO z&(U)zFrIUO(R!|)OMwaNF!$Yho}Nd6>GRQlss2!ZNP(B$0?$`^zMfBkSHbVP2NCHb z3j7P>bZycL^a2XJ^$g}XUw^DWroe*wkk9S<6a5JVK7A5AFYASRAqAG&XpiYddJzS_ z8H#gF(u?(C3al!|*mmkq^`{hAhcVdoU`d}*;Ljr1OGGcxOYqDw_)P!3`g8p`1&-VU zT|J_|&|gsCbZ30mrSZlZtDzff@GvpCl+ zdaYhd!7&>!mv{89`d12$$JneF^>6w&3QmFzrjOF=^g0U8hK*oVe%HTK@VzYXw}h3f zr{Em;H1oCoL;rzgLrApl)Eo2$JQEK-$~>bt>WviqbPK-ww*FK9Nx{#dd+tj8m;Q@_ z-#mzUmFZ1-69vD!7yQHYX1$q$Km38Y?9*HH77DI`Zg~IFf9t;~$k+IuetN6kiq|%8 zL!Wc>Hoc94JD);7=k#{Hor1eDPIW-<&^suY4;%MJ^-jH$f``Atc~8QccTw;Ze6s&N zy<6|5U?pU3@6>zr9tt5JLY+tF>wNsO204q1>fp%zihYo9)-4^pT#{DyaS_dVPX z+K;U89EIM7U06z&>v9UcKMdoUrO)g06q*M+wL-c=S5W9<%*EY6SL#X%Eop~7AJ7-{ z1qywEwSXp7=_(2>W8G-0FY1dF`u-z)H%mJj51aUDCFntN+fHb0EsXOXl=&5f{(ybC zZa~V9Uqbx_9?x8Ze<-wbFvhUnxUlCL%5MSwv&J$Og$}Ym8Eb5VU&J1tgYW)m+{R6z z;`>1FFdpoCg~~8C`$gk5UJ6yNML&~_&-f_hV6B5kjNkYv9Bc!d4Hz60&gh8o-)Mp+ zNa3uB;ID~auH(+C9L&q5P1xY>o?5V3HOE9ugu->Yf~V9ZnIsA~Kn~z}*d&`|3O8SX zIrcIsCWXSSVRybxCe@@;_&S!=`zFn#QMltyd^cgzO*(~dgrD(`G8ra=!acu1|G%0{ z?A3*DgI$|dCd*_|_|6;9e;1Q&vMGEI@&tdLsbOkRcnD`qTHwM;DvKWl;RXKEYVxAfdV^fSoRF?H~!F8DFb zwyvp*=MBPsO)FE+)T8i=7tv=gQ{U9b8$aQ%%pB9eG@$Ss@YOE2X=oZ!`0aC8_a{sv z>^+C)LYG{Bn8v0tg%@D%=)H+)Lg9r2FrG!GscA~#&pn_Anr5aMg};hpj{D7J<}wQZ z2-&(bOmowm!oOf_);QC`w4m_syU`vqElo=bZ-(5wOEJ1u6y9BmvCTD?o69L&@CN9Z zX>D3l_~-@Dt4$lzhQh_rEBA}$3UdX8%WuJVuQFF+e?5ZQBJ|u`Wv;@neRIH*ZrYl* zcvlDfuqiWFo2w}jX$V<;ZrYi46iMEWdHrCnG1pKe<8|;9nD(YUMQX6`YGbZ7*HR>B zG3YDIb=aGa=^6;I6pqDbl1b&fC~@GMy;WYCP!X z<_6p=5NZ3V&^O|Kf=CCRdo$A+d;gKHkej=y>0-K29 z3}6{ffLjxGYJEn)}L6H&gIcB)I#oR)X$1*`r zG`E^tDe~lO&`V8E(~}}k_eB3b)64Xt$g};>{)xHG+(wZ}1~REIx0~B3@_ZF!HQwBT zee1|{*tNde^ftXI@)G>EzQNpS?xe^o=W*VjO&`;TBCmgs?^=*bUy8i-6L^N?%UTON7eiV7{6wdX!xf}c9k-3xb-Rn$$)1M*>e#UsdG6T#2ihKt7>r%|@9*TSc z-Lp^Qe#3zj`3Cyqe%#z^?xo1e&7dDNgUld`{CX|uVdg$_A4N98AG(K{`_27$X*%o( zJcG?(isbWJJY=FKN|A#n(Em6SGck%BLA*n2+{Ez!xDB8`hczcCatir_`N9k_Lnu_NSn}^Ip6uAgnrZ3II=3$CB{XrL+ zVP+U5Q3uckSefCJr0Re!F(b?fNwVCL z<}uvElw?8A!T-2<9KVQ8fIerQFi%jD8}b3qljccE@^k`yz>LEEKuO+upjVow%u}EX zK_4`uaSun5?>Eo|=4taZCHWVDK5xdDF_aX5Z$v+1%~(nb!bi~|GtP{oq|k8CE6p?J z8A=LcP0>EyjHjdskH647Yn}xSeV{Tk!Azi}q$1D-<~j2mB_$(~YkqW6K z$x;$Rl%z&H`&^?Aah3NG?AkfG0qBr+)dqH4Wjry8g1Q!7U z<2V0o*vIVyfyon;2XK*GBnXDOVJr>fqPQr$BX>9AL0mK!4Fcs8w9OkM`T$;thP8la#U11h zg1`x5j~F5w9Rh)?HTHFdOW^SQ=&WxT^Tk{umk0t6%p-c2OX8A1us9TT2zQt}41#5Q zF;<6iN4O&(SY3cRXKsD8I-Z=Z=FQtPE|Q zf{cCw1bbDm9VvH`I|+hVW0bGuQn(Zl#2v*p8Fz|11%d>eYpiyuTq+0-=c0}Vm&T=m zAQ{&uSaDBtr$KPM3H5`xbS@nPY3?}oTx5$gAUKVjBUi+o<<5fOOeOZ!mpjLu13@bH3Dt3=B{#ALC}61^+$90Ts{ciV-4k(aM!qNAox;_ z`bW3|t^fpG-iWVZ#1(=H?ymvK=Zd%@ybl36Tp@)k=88c@uodkb!d>UC<5#w`P-g*F z`x~I5j%!Z2c&>yi0Tm7OGjBV0le-BjS{P%mQYy|m*sl~j@HGgT@cy|7Iyu7;}t6)$_#$>VCdT2NX12j%^^yWCw+S%U4b zO70$a4^;f$V*BY_9aje`0myZHeeOPYA5=Eyp}v@_=juTvxEA%hxCh(=P}zksARovz za1Edmi8-ryA5V!t1eHV~j?0RB#61F)lxc`ZagAIfsAOWCD~#rvxF%4!f^(-}!9C_4 zgUSuGN5PV7M*dT&9{CSH;hum>!zz4dY~-GDPeG-{0dXt$jC%$upG*O0{08@#RHtC>qkcQr4ytZjaP3jWz2)A5>io%wtGRdFJ5XJM zx!>z9_nvzXs;k=m$vS5$k{yeUe>jc#l%sc)pT%~>i)w3D@biQ(5LG>d4pZpu1S5v*}iEYl~zTJ%|nK9*hUnIBB(83*#3IboAd@XUz`_`LX?OS zsIBP9*%71M2F~rTDBJI+#r2oEM)Zk3sFh$la!ZK;F#xsFdThs-3?KtQtrC4M*Fp@5A*fZq z!hYWqBVq(<_pmO=3&}t-5Y!qmw&`6mhztU?XUJV7gcuWJPCld;Xc#Eh8XudPOiCy=3JCRQ zu_Trtls!W1Oh%DWAk;TRdrZk_G8%-2v#=diVnwV#IM5HD^&(@)7`$*3IgOVxiXAlzVu&&m-u;s(MXYvczDGM!8Z z;f}z6a(Chm!d)BC4}bASxEc7p`}P0uOfnOM;i!WVGmFdu;XdRvx!DB&17Xw;?Dr$i z{2UPOfBkPPbIDu~9$bq3ej@V-{>{u0v{NpX%qR0fc=Ru}(?&dq2MAMI5sxLF#1n++ z`iS+37x4mN2G#;@Jy}2&fbcwWyJ9X`NEU+dT90jBWD!{e!U7x@=Hp_r7=%TbN4yWj zn|OopI`+%^M0|)32urYE#aCnrSpvcu952~ImXf6)tV1s4ogu!&7lifRh)c;bvJ5X( zABc92B7VdVgpV*bp|Gn<3l0YKsJD|8@WzSjcg;FDJt+4*`)D#w{a2SXMmBr4MaLOu+4R3JJ}8*{Slb6v&asz14M%&5l51pWG9G*YWCC`vWx5j z(P*3_%2z{2SBv?7q;U<4w8c)3h0T+0pt)lgxj^qQJf}8APFGav=7@9l0=dSqL35#Y%@tB zNg&!Dg1CVkCWk?^YX<6{CP&B-5QQO!BY!57WDrH**m>6EC^-tE$ljzY1ENgK9d?PFC1*jD(=(@9 zmbJcYv5fX zH^>bTV{8F0k(7`Uyw3``g1463BsW3KKZ5-VNGT}=aj#62Tj6MKfmop(eWgLlNEwI) z6m3W&<)j?(In*)0NUQ*{3f5oNhukK&K`eQO^YV^Vl1lvC0@ejy7pWpuAl5EJ`AAYt zszI!a@gp~t+#z>BtcNkl+e2zd4T$ycqfefbT2c$*fjQXMHFB5S1@Rz^RcIvl$UP7n zPx&XWBXuA);Um6J@IS;&h_8}*QV-(6$RVizfII+k&pCh0!3NR*VpAM1)RTwgA!3XH zxJ@3BM<6z<_=g)wBZ!CYM|&isi8O(D*jdEdNt;}~z?is?Ow=SHE9H~Bz5;8p4PELTK2 zNC$|$E@I6sA|J^|5HDSWIxER1@(IMg&#@hU@|k=F@p318_c@0vzD^Ja_HavY@`Zc> zaS+-DpU7A86*2M~uZDah-$1+>ISuN_ck&&?TaZ7Ymi!<;KpgCgI`-rz`3d3>j5kOo zzsN5TZ=H(x9O)umh<_l?B)`dT5N}IG{l27|bc1+%Pi!QSKjaUHceo&qAb$y7mb?Sw z95N|jn2LAqLHzfH+PU@lmQs z6+s+d{15l0y+M4?6ZMOz5>*26A?<&-5AB1vCk8IkzO*lh6EQdC;;1rJ2Jw-ezTByR z3P7B^@n2smR0YIGol*XPs!~-DAIJ5EoGw+PYWV%;2`GO|g;WUQQ^*5yPpF9EUuq-u z;@_N7F%^UO431sy6O~X2h%=BMVUXN2XQ*prMe(4#%JXs zXg}Hy#3dO2kVX5`{vf_d5Z|DBR1a}aoII!cR3F5p7~Ale8c+ie-`asVjSip#KwQ?7 zzc;8MHAMUlaVs^VMj$Rn{()3FkPZZK1=emTrGw}o5Z@kyI0NqlHb&h3Pi{g@KwO!H z_%a<#2ZOlE8*vI9LWh93x)R=r9o9 z?aB8vI-Cv%ah)~lmr`?Tj@QR?C~u=9=m-$kW506G=}0;f#1AV`{*YQw3lKM+M0p*x zq?RCV##rJVprhz05I^mW@&Y=Vjt24b9>4ihD{2MemJz74ijJXUK>P}GL2eqgrq&>C z!(5ZQL&wswAa2Kbi6H)~j(827L??j+&o=<~fKH~9 z@kYc2sGm+9r~^oPDIkZN(J6EaNR&pS4x>})RFEj!V83eAkvf7z(8GZ_)QLKQL>2XU zYpFAJ#t)oq!FH^v3v~gBC?DmmbQ+xo5(&m6FPFMfSCB|&p`Y`p8+8MTh5+SdbUK|5 z5>2e9aE-cCcaUhsq1>O&pff-s;~`F_GwDo_=p02nlFp*DK%)Bq`|_l->1>ebnWNl- z&Y^QaqVJFP-=%ZuT#yXJIhFfM=h1l}F~L}pyF%yF`5+nc74@~L2lW7nnJVJv)RTIG zWGHee?=tnGULYBM25}c%Ko@{y#3_6>f-a;BL1Jl!_%K~W7lC9na~`LYL8H zAeo$l?U+(O>Iaf3udp30x|}WtiL)HaCDfn#gJhZ%@ou_;t^kSKG4xv~T}fAhWcmQa z;dB+AbCFCx|4+V}t_F$wNW{D78oCDYwSPKm=~|G?u>YsCj;=#og?Kj&paCG6>54dv z2GT&pSdZW$T~F78WY#{!*>nTl0Fv1~`ErSFq#F@`{-+Z}gFrF|eTDXHqMJZ6*BJ3G zx|wc9oQ*b5rd#M1kj%$eg;O+`27|-{=M;|65E=p!Ppf};E8U71{fWl zT)L0$14;7GfBKO$5+ujR0w`C~C>jNl3z!RiH_~Vt4U+3S@L4g9p)nx2fqlvO&{!G^ zl2SC8_lxeQ`$2LG{ebxrN8>(P{!?tHogSe_@Uuh6 zOFU(oOp`(K5dAFqK#$U+Ao)~=>*3e*7(E7(U&yiCMS7eb2g#p>_?x%^JwZ=^x?&i% zGl8C@CqZ2a-yP)QX$nmNb!FrzUNk*LPl37s=R)ZsO{J-zF6-gCaWsvlfx2!h>cr5~ z^fajVUypMnr0Fyr)Q3c%-)iU?dIr?T&PDwIdX}CAb(>nWCy1V-=Rn=T0p*@FgJyvG zROCJ6=S-Rj>P}d5d0S`}%>s27CG^iFdY+y~+%tB4noYAoeH!+QS#g100QH$OP%fYs z=|xbVwFL2UdWl{F_1SfZt7s0*0rj~(J`~Z*^fG?;9rKZANONf}sL$`I_0jYSy#nf< z7<*Vx@jv{;lmXiImtLh;L4C14%CFIUnh)yU&oP!v=rwu`)cyP5yG$l6paq~Fh&jj; z(n4AY>g(?!?oW$o5vXrK{!!dci)k^a?+iq_C%sOugZi#|#K-9kdIQu$QI1hkLQ6n> zAFg?nHqe{&Ca5R&#M>cSN=rfgum;M9(p&TvsHZ#PdhZV{qh+9e3F935DyQY3p0fh& znN2Hb1*jL|yvrHV+w?Z57k8k|M`_PgNKF04_hN7I&X4(u=rG1F==@a?{ zqg|>inVoxsYr?2QMkUF3raGlvoTR}SIBFbH88*Kxr6Nenar?2U2kh&_MZOQZv zeFIYW)2RQ8w$pZy&OCwha*n>GZ$Y}i3EPjN@8~;_`t`(~jJ~JuLAv}ma?V2ffqnq# zmL6`br5&^bq``wxXAu2JKY}!5HugJ#exjd1x((wQEB9ym8Kk@4A$Fmiv=gKe$hR18 zUnt%SbFdKQ<@7843eqFHvEP&Q8~uh~0PmSEJNlh|2kDufm>)ua&>tW@i*wpnh5n>J z@gpmlD37MU=r537!@7X$lP=l?(gMsWT#x;xzd>5)gX8^6yJ-RZ0seh3HK zhhnC{6hMPrMn9x7MWzTEz2~7lr&({-8#L5#tt&T?DKRC`5Mdt4sj@z-4`@ix|2!G% z%ld+bI<9|sx=fiVgN8I2@hB!>0?^RF+~Iv;Doh15w5kxVVX90OG-T*2xX#p=8sfj0 zYlE1O2|>eTAmV5yVj|EO)f3x>Ow7cfG5Q5!1twt<(6GXJl)J*znL22UO~J8fF)70v zoouh8jseqP8lW-04e@HG$uvR39_t#H%CwjkXiWNp_%zdI+MqEt74V0BCSx+tn2+;F zU6>Bj0gZ*I!?R<$Ocyj3+hQ(Qv3{%{XeE zebCrYjQ$re17-jk+mYXtg4qBz05qcU-G`gN44ENl?8kg(%kWPwjX)y-$IeY;193k? z|LmBzz8wwgXUZc)+HjE7ejhk3U_`TV1HXJl6F*Y~} zGiT_1DcYT*w+na%WOfj|0!(eAREudgQgzlulzn{$Lv7UxB~TuGkaza znkL{6_!eGY94Xn&WcO zo+LJfO#w|8SCluhscb4}x)~z|=ExjD(;YD{hB+}O(40|#IE6VgXV9F5yeBt+xiA;d zoD+t=JnoA84FJaT!bkJNDh3#lFcjgY7ei>-z zC^m!50L{Rj7!G7J*-X&fFdxVMn9X9dKy#xd%5SsTY&K|aLSB`d!sf6!pt;2fmO3Ve3>t3-Wi8-g4wVPG;8b-D>6Uk z2b#5*FPOi}*>cdlTa4`pm_PFe%{t5}E`qIKD?qaWeZrf^R&Gx<+OY2zx3joc}yV158 z7}0^C`Ry^v1K4`D9yI?>!@eTe2DSmT0LQ{jXB*i@(8Ax?Kro#Ju^`YA?!wwMo^4{A zKufD!o}tG)E&{aHVQkPxY#-YPT0uAd;Ybz=Mix_O9yQ|^aDP7hMfUzBObP|&d##4plvEe+=rcG=RkX; zA!03-!7@PG+8!}wnJg2u?Hv$nuq>7Z+Ecv|E8jH~O5uXSpmFv?FdI z{=}}ZE1(^li})kUV|k!`C=GE1yUMPDb~5&h`uQv$v{NuQX)E4Zcn!4Aj7QrNSph2m z?QF~)egrFIg`k~>^UL4QidYe77ym{a!-`okXqWFpe286V*Fn2hA8{nR!ES(d!$oZK z5-VXPpxul^8{w=7=}4N>&LnrA)-DSrw}SnVJmo8dlA!K_-ns?1lF* z-T|4;C&WRlhSh*}zb z=6!Y_WD{?qZI@X+s|T555aKlUfIR@2o9;i{z#2d{3%P?z2iF-}nD8G8n@gI6(0TG(^;9At-(uc#7x!Crvu2tG?g*-Q2kWG9EB{w>zRT0nN@ z2g*CxEA|Rx=i4xT=CW4S3bH&~)LFvXSR2TS(@}nwy=JdLRxur8{tA1;-hk{*Z{)E( ztev%k?BM~_&tz}eTaZ1&T7cT`*gKH5Va??$vG?pf$Ub0>D+IF->;uStU>uTc*1Xs) z4A@up6?80-_vEYDH}(y5Y%$m9ZT6jg2c1b+BXBkOgZ%&n zycTgMANT+|yK#QyT=+ab4|KvV<6PA6<@j=-6TS=EG{NKi9Oy(|Kzlyp(H;Ui@hQmF zjkwKEK_?*?aUL%D8R#5A?jn|a{0BP6F*nH-zC2$ZbW)K|XcoU0zZdA7ZNPTEhd3%AoW3EBa(JU%(fDPU~vKEBPvX70~H;hIj*Cm9GjqKW8EKU?$3HG6}28(+$og6?R{ zwO%s5244eo?ZOdj;T@@(pzD~5J}=~J@wGsA2FAR6DSly38+1L55SR01d>QC2!CXeU z4qpd!SE0}4Z}4^bx}dwUCmycx`|IB*%?fNuc0Nsa&H1NZ|#_c+Ep$_@F3pqq;J)1`bPz7go2Gx&!GVm;B#j>I{t z<`3cz0^Q3P8#Iw`%r^$zeDtT>TG?KC_%2AADfidirE*z`sq$~(agX=$m*!+-EbMZz zeSN(<>_zGU8~=z!C-gi$E%ifv^eEnZ5?ub2v>%Zgn_%l5IwgKKw;&~#ukrx`147=MbZ z`JmOg@2qyOE61$f2A!OJ<4;A0!HAHm{D5cWyEo@ZrYKg;lX8pC{0U#ZsipZzZ8uM; z;!V~ltb_kMTF3pBE1Jgjwr}{UX!Gdy$>)CByWZPtkVlJ~wj58r%o}N@S>p8TYk}sY zrPSuc?!%Si*Ie2>cIDOP8uy|{A=;Pkt(O&j&+0fEylIqHVZ_T`my>^ zla4J@yyE`6b!u~SGdXIny>QYraptQ%i?2Q_Zn;{q_{6bY%8Nd(IX`F2WN*Vg;aPgc ziw`|aOdL1YWJJ;=pLZ3~zV2;;8!MbzEYH3)a8hE&%I>v|3>MHslB~KD?_Hzz|VL2A*=fA_&IW@} z_qDErhMlp{elEZIboGcAerE5L^*`0QFJhB@`KA6gD^ES2^X0CAgU7aCWbce0Ml(Vk zOU-vZj+xr_SukhWXhHnSE4fdL|7L#m6n`?=8-v9CzX9RyTCt+ZRC!F>5b|~4w2RRt z3l?K_JPdD_smeeW;d+yvz{e>RTU%&d$(pKiO?_pYAL4wrjA7xmm_ zx&=!5MxCeAuk=YyJlB3$^-r%M%dA!n-JUXij<(nF$IZ>vhwX+f&#_Dysi77uSCFT> z(q~M>f%0|Q+ujB&KBl;CJqxflpB(5%y>dv%nxs#*pFGxn2{pR?RUyY^-R$ZhdWW zmP_4DR{0G+=AJkBl;8Zu{7a_>-#-(PytDC4jp_N}!{txiHymxy99`+9dpSyb;Hndq zCby0#-bz{e@XWBXs=~E%TL+m>d+_k^_GQ@<&-wpYdE`&ExPN!wy!_I+Ussrp+F$zJJlWXpX~&3y$&tekRr$Cm3`M2D+qu|W-HHkW(dU#_~e+o!$C zV2-={2NG6syY~n!ZC-D&G=L0mcJ^@$4)iLxniM2khndk(nmEkbG2Xo$yl=~ z*GKHSu{X%EqoL2(!a~n3lfb_`ogb%N9OVA*ESNhx?!95E+&yT)wcCq_PEMQ9sBL$% z(xYI={9GeDlbqpKi-J$ydwzYNv_!y)4* zx15Fv-n?Vx-`g(bk6DJRq;(D+TT|PgEbYqPx8!S6*{qV=THky+Y;qp0u*?;98^I?0;CyKrtSYp%vx`kdxt6aq|d&9foy(UE8^x5UO zaq$kjHA82A)?8C|YV4L<-6oZuW6l41+lzYPy6OMKmAP|epY2#J<9!O+zuC+!#y>p` z6K6e98mOOcyVd36TNC9G`=`E1bKU4Si;A`=_(&Ruow{SWjyGby zJzW&>YlY6D?llK}9JUGcr>PXcg_Jqd9?bXkY?(hd>4uHSvSyLasg-?qwrzZQN0m#| zzdyIJ%qwtwHd79{=eX*=gVx5dJ&OG$?S|UI3l@cYY6qO0pv878M#RnA=_TGA?&t3$ zO^E*PU%b*YcXLcP@AI7gIzMsk_rJVn?s^w_ulME;o{}eLjrYe+nl?T*^tj=-3sI75 zgZn(ouu;)_Ul=@bfO+q|2O`T}PD|7_EP-%a>cNIuYPn64KcWO&iSd$y{N|vCu_z|Fba?wihQ{;pNOnk(lu3Q-p<^u zGW)`gIm1F*ho+QI7x?-1aR`jcPfP2y#L`bEML%ZT-Ejl6_v|9Q!(6txKAUCEJDftk z+>SbbYsR`0(I=OFTRzyPe}YcF+O53P8?+)52hMWvhlA~3jA(ejYrEa{;Bl3-c!^x8 zgYxvO8|8PxW(_*#F()aA=MZh;(|Ig=P2r0ghh+8XGqQSrzHMl|=;)QfPt5bUJ!=LX zwV9Ub=lOX1+~;NQ+LQXnNgQ+9^H2EK_gycokUBlQEO+#^^$tlh0u z&rVGE>N{fAvP0=j{(4I;ZQDzRd$;ko4a)8KuJNs-v)`}oC*AyyH{W@v{+9)v9aru! z?cF^nW_^a{0H?=hywG0m^Mc+NEX1O3aw4p@`&X)G=p5&u(C-UIkFCjQ4^dcJ;{AH4 zOQokpvf}Gh-yioz-3p8OH2iX-N{rJAm$e~bPt#6;>yzVdYq+?LnJMrybzn|~ZJ}Wq!j}iTU$roAOlYBcpPtDG1 zToE$PEN+MH<7+`9!%QX%<#uj&Ub*djLQAF3k`epAoz(q0Wyk8ZewK0x)*qVu&X?4B zsCPbb8{%81ZlD}PM@MI8{?14kt`n~2uIE8!FPjk`F!So3YkqCRHK)gPTJc<2zS_3V zTZ3Vnw~=DZH_L}(T+VTN>#kOY^%GAN*2xd~rsk&h`FhQC{TnMP1Ao1bIuQIwwqfDU zoA>{lWz(*&xMA9ROs9BSpnvmCr^Aa+Xd3Jcd=%exKl`%lNabUqZ(rBW3G3HY5!CT$ z^@D@i?%gvpnw|%@pQ~^GHte^@vgY|&X$@x*Q+pX~f0>t2D{<>J|7`ZysVmFoX6*ai z=kSZoUwxYI16n`u;rrO$+Oj0RVv=V0b`$YIc-Qnn@bs`I0Wg>hG-K5Y}Y-Y8J=G79Lu+t-d8@zY@Rs5=fz zc0{z)hN~2qSlRW-3;3W@(yQiCtj^Ehy?ui41TNWl=r-y*JX^>Q2dhYJ?^mn zO|NpQcYc=focYntYs(+)z62wDH7(n2t`NJ*8BARmU}4tMnB1`cXj4Ve!J=31f5}Yv zMTvv{JJ`rdg&n49b|LzYS4??g?Rwu{@FunC!`__9IvFPxUh;f;dV~6*>V&-gO8X~# zi{BAAWyv8J9`bm7`SplJ>veB#iYh4f&+3&H7rT{9T>dia{b9~N=B7&N*<BHfdJ0~tV;FW$Q+-zUz zP3jak)Y!_Y&gjNr{oEs)-aYPEI=@U5Vt0mZe*T}ZcX#>6J7d0k+C4ItH2u^`I2M}T z?wkL?I=fHw1>s$V#_nI#B}O!R&GNBDOY*Np?0aoJ=+VthPh(?VeA5aU9KSrP;g4la zn(y|>B^#HnnQ+tU`YB0%-Iq0m?kYVKmE`!L(kJ_>M*9X8&-oGYn}?QhTHDnEw);8# zDg32t8TYfW%5BQu)&4T2vR9L1e1hue(th^zP;o}+_V?wy=y^%ASA9F8wV}q`NB)8O zuC1?!$@#zk-4!R%8j~qONT_7a3klvL2>{`2@)xq$oW~JZJViu3sef)}^Y66qOJl;q_ys`+=Oo$Qcb#(5x*)rKsA=fW-Obef6+Y7CSt8vcCTt;>;Tn@+-nOSbk^6J1)XQ_j3U z>#~2XhAnSc&g{+{&Q*Wjo|c-d?-i2Tp=s&&wD^CAEKlXdu4q);ZQE#B<6`+-$-!T) z?R4G|XTjLt{q{}Bn`W{2@pA9okDQiX8nHlnM51~w&0{UmZPqd!(uP@x$`} z8IQXwzE+zmTeS_5|K^Z+Wpl=?ht`*DR#?7Ll*893!|(;_(_*taqA$Fiu5*+6tk+h| zO#PnG_;>c(_dhm1T>YT^rT69|4}#W@(h3f2wyGJ<4;sBC~iYuY$h#Wq+^`Ev_R<|r-gtNp!gjcm1Lv;PdO34Nl{n!TT8 zZkcnvZp&ha$4QdYEkkEH&wIGxb9!#Lt&ghVmq#LpOwaZT1$yT|_?9BL%xiB=Rf%)? zcyOL^#Kmg8H}i&$Pm#^@Ze4ungsJ@YDXn`B9^ZJrdWWyJwBXR$xN*yt4W1e>t*SoR z>)H=(!J5cpN@4qr(pF`P_dPY6mab}>?6@;%C*NS@pQf^dS0{#!(;0W1w)n)^wI4X7 z8vAoi`YzXj<>F^!W>0*fa^XaS$ES3I;$LTM(hU!uN**WFd4Ia>2Jhy9emUpkb$se> z-Z3x#{7kvAZIqtz!vkKMiC?J+}Cgb;-L*dNM3B-aN?AYS$%J%SXtM&cPmqn=q7Fv>nm_RabU@Y&&n<^eO4dlei@7KEv+q$}T$kZNT!4kLS%_;qv*%Tknv; zSLSD}hP2V{pFd2N`hMDYd-16h+no04VQ2M@p9@&H&~I}3()l~>6rPBE$HrGE4*2S= z;yUtNY}2aMW+$y?IwlOftr)PRSOn&4?OgR;^~5Qs?f4V!|WhIPHs^R>^du*JOt8fl=v!@(a%mJ1xIwheEAzoG>03X7qp(ivZ7#Kh0mEn0;Ce^_(5o^)H^iMB?pB{Jvm&9oVBjS5AV)+yF2 zohTo*z$(4rOKD70=U7qEhx(9=)I^hx|E$;@-Tv)QB9Y>DRK~%qEo#|){guDO`gQDz zox>g*oL3rM(Xjr?g>BNI2k-Z(c>b>a&xR*~`E3D3%^}ySr+0nmuKClky16E;uBoBE zeNEoZy*nF90!z(q37`GX{$xR6R@cA%$+6w7!A;4&>koY!(%jJ;T=b#n^-FHdv3KN( z>4PZmF<#-_%hndz-fqgO+dO5%@}fd6Z9uy2Wa(-0Al!DUcbH8^AGKv8W~pdcEWUj{ zrc-TvKc2zfUxWXoMt;-mbLM_?Gf(dTZ(#j#gGZI6Yrg8+oiuuJq-B)c+0wc4Q98$l z8ZLb;u$flMmZ;PCBNLyue2p>6U50-+J7k*X`IPBAK6grTCaK?(8z(%re7!$xlJESm z^Bs1bDpl;L%H!#sL;LiLI5)-FMsB7ovD|;C^`e7stqfAicP5-RT<-em=OnY<`s>dY zn_t|WEjPD3=3M0DcAd+^w;PY@5ZIr}Hv1G;p6q!pJvCbYvUUBy-7Ds)Q$`4=j z@(w*y@uKGBg6G42@>=vA#^PqD)&8BagMva1Mm({4R?thyb^EDz(*}qA$scjFS+#9k z?SV(fmyA18Z6s-Gaj+SWv_$bv9pg@OdfoG@z7^8yeq;_&rQ7HnkUzAV8E2TIHkTLN6Od54zQhc zcjykuVwJe!Mqm6xH3gC1sFLEq(%6)TwjW1!J}hpI8rzVddeL6NVqS@V!h&j(vfT?W z8ob!;W#)N3-dwYE%XNO<_r6C=%4|=4=9>&r63kJQE;k%>HSt-CS8k&Lzn+QJ>W&SIJA2~UC#(AVhip#Xv$u20ti7~q z_lABOa?ZHLy$sXu?BBTRTWvo#wfXh7;=V@`HJ%jwxxMjC`=#iMO>5nsDV)-aH`e%Y zwV&=MHKm|^OkZQ+HSweS9=5~7uP#@0dC`0C58LxG_l+VgxJ{9{tsfOTFB};uA7Ap; z#$%h!3a03GsX)5(`FmBB^EZvxTxvGFFx01y?xX8_@*<|a5V_6G>{OlOTexsXiuaox zOAQZU>R&!zqg{95xkRV0x59x#%gXK#k2|qC<;ixv zO>fgYlq(0DMO0^9Nj+ToJ^0n1Egn@@I@bT?nGL=r(ora5ZY(ZW`}ozJxS zK25ieSTADRsnlF?iB0l@y|*t9aV$;FFjIfGZuNmSGV9H1`zLAjn^wwgNM0j*^I`l& zy2pF#Pp6p~rV3v?CY)Biz;h6e43(4|GB%3nU$o0`SD|3R=~g$pd)lIp7j}mVv-z{@=ZKICNlwE1B7&7_!WpXQI{pE`$H@dLlc zY#&xImuuN^Lq5z`e(Uqw7LV>2?mRqM{k)pmwzc7_hflLSrabD_;sn*@E~0XS;L*1q z@2eOx>)Z@2t}Xug1>Gzqy%gJClV>VaUJ095bESM!rdtX>bH>d1s`aZbr}i)VBtLb{ z)v6`0uAe##zH%#l8RY%_=0LW62qDsX@eO-hW179$menM5p)Gnk|YqGq3Z;Pqi{1Gu1t(QhQ;0 zqn^s#lb4q@j_IB{OAzb-!@Bcg;o~6l;DD>nQNG2;>bpmG&l@#nURIso{F=_*7enjv zvhL2AtC(5uZ&kH2ZBtstGC5+uvAz1LXKS!kN1csUS=^{@mB6{V-WlJvZ;Jb2_{sQs zd(g#9`vmK(61RsY;|Jx{g)Z_+y=^ZaQ8E5)_8QWXxcHR3JKTuf->X(fai^Jd+ljT@ zwze4uY{N=B6a2eh*yqf76?<`@-3MoT?;&UQ>L!RZ7wqc&;I5Z+ssGel;}?x*2^Q*n zQNi+->;gG@MNk|p$_Nnk zIXvNp?ahV|-9lMR!_n8laP?2|BJ2N-IjXvcAa>SV+m%yrBj|m=Z#R9*>0zop6rntE z%@nm0l3!oUFKJ$t`VM{?;q$ih-rnaYw^`3GJ8cqHx#ZWVk;-iwHy;?<7Lo92_*Yle z7-NetZ;O_Lb*FeL@izV6Io3Ytp5JU5@J1(cyn~WeLh}rNE-drexxJntTLwVB(6p81Bw4cz#Vf6dc+ksUQUng>KCBb0z(e%Lfg(w?OtnP=zl&CtJE-MH0t~`K$vYL@%FYSL+&|? zPcY$>`Ji2yfQqzzRR)7QP8Q2|{h4K0l_I6MK@(m#b3-XyT3I}y`5j?R=Q6Qyt$S!3 zUbKpIwqVn@=;CH>T2J2Pdim@{lU@% zzgz$DDO3DiCdAOE@Sv0|VpTZ8=~@GTz-MZZQBq6p6A!Y=-nR-#C_tcSdv07e3r^Hd zj|E47T?KKd@hnTVlOKb;${4#MzvoyoV333;aE_V3>nJzH?yT-ZbAYWOqbtSs9Y?$* z#4tpO3s)P1EvnxKW)NnAjA@rO9;sAgtc$%N3~W}ZcBJ$BPu3^U1CeiYG0LP^Ao8-_ z5HmOuLjhFm-{xKwE2H6H%UixyFOh0N^2Crl?K)15+b6}v?12_=hubJx+ejg^H8Ty+ zNuf%vhbZOR$5O>*I#zm$fXaGEP-Z6LstOEBu6(~k!}lnebZ&l=$`y!EiBv^ZMpaC} z>?l-6?ZenH_gBcWwEY~s!78^7y3KcD1Q%pC6Du+SU;U2pKBYz1+8(TcyZ^0MgvcnA zeW_qg^mpWTEFn3At2#R-Yebz)XK<}#eg(!a$=ZIpHUOTYYp_dFK{ld+;KUy zq=}j+4hj@jGP}!6MiB0&me-W`afPPtmfPjE7w<)MPI2e$0iRxsALE&YUuSmL^xcK) zpNzS64-Poi=@q`#r~dJa;q_rpqZBl9_49Q0^39gyeh;p$7XHwE2VNiPY5AK{dD~uB zj1B&)CstdY$&5wsEAIEUOG4i1eO4}mca@u3I-$-|vm8m|$GDbo#s#k%srcq_MK{Jc zEg8P>6d|2-Rhj|C4Wmw7EdfS1!Zf2Z!Ei`Np~e$6TIxUF+OW$kB4rR@pLM~IJss9daMtX~c*N+MPZ zHP$}cl%xmqm1r8>$487X8(4qMsEsw!%V?pKX!Qypd_V;5xr5njP_G1{XvpFa5aQBOQx}~vURu+!uT1{v=+d=KYNA1o1!OquHnpew zT87lWUWVq)F*@_K2+x(FZ2WnC-%Ute^w2$usk(8x%;p{DZHRB=<1rh^3g4m2i6z1) zWrqICEL?+!04kp25tb?gn&~a3-I)sF@4Zh%#)1jP?aw1d%7Iu9!T^brXp{%B*Eb3t zOcV=e-oz?3Il%HIq@TP=KD=x@ioM0&k&+HMKL!7Zq(78;|MSrA82#;Ibs|dWKghV8 zMQ6w5z+DMD7+`i91yL8i+TAg7Rx8N#d^fy&mQEgeye!BX)R(OJ6!GC<~4`8>{CDy|L@z2016wgDd1 zsWH|#f!$nYvIsBX<~M$RPaG9EsaBv^?<%fpO9oYPx?)KQL?SYH7#e9+W++%XY@KC* zP(ewKm5X~_Oe$ytHSy$_Fn}(o!^E15M#5}H=ek(Mry6H&$T@NpA*L`=+BN zg^?}KNH)8~GJ4YAD1OhfE{~oxi&$CKe_?^Uq6!V1p6J+TI@(GvK_`gekSBTfts^80|>c`AUcJ*J@^e|IUL)n z&LS$??~O;V?*Cp zN-?49C1XKX+z4oh_dwjPUsIRr|%Xznr|k zKLB05xU+60Z^zet#|snb=Z;VIuiam7Zd)_PP10S;ZnEs`9{1bvwvrzlUY#_SH{WCl zFHgFr=L4J#EA)>a5Tw(Zn>p5<7SF1mimfL5pC`T;8xy%X)>X^Z4R-S8x#alL2NBII z<?i8oqIfaxa4fu#}c@i29#UrlkW?tzq8QSbzvYU>UJjz z^^HaeCgUuF$WDTcuU8@1_g7vUAVgz~zv<2(_jT8hEXq#bNX(&2BteqKa!-{LtJu(* z#y8ELZwjo?7Mp8vrJxsk=8sY*i=o z>pni4rpndbpG$`c_xs~61j~+7y|i`OXfn$JqM}NI5Hz?r3RG+>gIS;X4`(a7wRN}t7?p7Cx=MO zcMy9G7<67+cx77}RI81=rk|K22a=Eg%8)F4B;hq@pXLwU?f#p7T3;X`ZB%|F*1zd8 z=6}7+kWZ-tUE&;yp#LJ~pkezXUu`r|A$>lT#nahwK#g^0-TiZ;?)HAqP!3ecb!La4 z!GGPl@7Lojop5nVd!yIuJka!o=t1BS`&>R71PBspMB=9UFgCmut1(W5Q|E5*dHx(c z1Pgg!OK7%iCr@syCQd&PT_SY=*5Gxl9?G>1fML-o5vF$ z7Lr95;;mF&!{R)(U+`M{_JXR`c|KNbP0u5EEcP0H5i_>ZGb_ipOI=+1u4&!70FiKC zifCy536H!=|0^+mg-5TXUpFL*c=0@JqB%|fu|P0iED$c4O}DT3BX>V048d(I&(hI@ z>t8wk=66G1enRs9Ajp^LvnGDM>f`Et_wMa|-M#TcCPyg?5zp;Sx#_3SlxCZpwhG1e zxh>yjF1jn{Hkmu8r!%(c^^XWX-nlD&er?f|<%3znR7*@A}`Hq4?UxmqnO^5=e{!KiI z$^f)}l9aa`{$BLjSS=>%A@=&<-^>~IS=t;EV87qK3&Z9M97=Fev>%$w4Ez5+YJG5m z;i6e=BL4nk(b9NK0r{-PVDi-CfpP$+6I=`XPxCUWl#a;5xmU21j9_d97Zq8&#@s1} z^FXw0Z(m*HH(W+pY9pi&C=W(V{B;X|PpYx!EW8HxF)56#Am{mjcSW7X8%_kGVtA3r zHeR?22vr$Fe-sQAAupZSPq%~pJ0W_)%hOB7yd#9Ro&R4mYF+NT;Fo7ue015HcxGX( zf<}V88A8)nupt(af&=?9Pgge;B#pDC%Rif9e4;zCs;_`2*H#=?F*(yQN?+mb>1O)O z*4Nw1>!WKkTaJ<&hPU&)In!y2#5;Qn>8Y4dp0J%uzNkPs%BrhlCB}-YgKijjvTM(C zd1UA5q+8{ajroN*zqIn{Uys~9-Ws)=@_u@I@f>eNZu8_-YSR~-h6j5x3`fOj%BPi$ z)s3nY*urAi)hu$zw6Y>PVyrBZ3~1rF;Yll|Zo?q32P0NeamQI3wW_nly znT0KL?`>BVP0bBmw3TQiM>;23?*wme+|dDDi(S7Q5Q-?^g|Yk*3hBAi2kSY*z-_Y1 z#)gb%b)`OWfG{W(7MGg9cB&JK!IDSAl0l<2KFBWD8499F43co`JcwW^NfXr)5E*J& zx-jAvrXiTAND_u+KXh*?`lKqX^5k2XM$%7=DNd=0mIC^?{oGxoeK~_OlEfoCiw6?2 znujE=Z26n`a^^R@ayU#g8z$J33*bnAa=C78{1jh;`w{w?xn_lKbR`C!Px$Wiq(d8T zAf$2!6W8!*0EK)-pyHbsT@miv+7MzR?)ot&K=4}|OI_Ow(=b7Dg+(xI8v5PWzN_%n z%`|RPI)wv$;;t#ex##`woo{eQZFUSR|EAGcd8>XV_`z<#O;r<#_HB3EJ(JYQujS3q zWpaOOdK-&1pVw0AA1v~z+i3E(@+o>z`dOF7>xQ`niw|b6ye^)cIY`yAtkbL$5J2N? zcM)rd(pF7J$iRi8mpq_HwB`M#D^q9*+g`urq9)Y@{}U)xRsM%fzI_Es zRdhgsh^6^!4Z6>|IJ{m8)W}jkeR`9A_n&xptJoEI>YS1Ggz9X4xA~7_(=Gfh!mGjK zlZ&U_={wUdKM#+$Ha)_aVeiDZ>jrIBl*(G~Y`rJ9VLK$djI^RM&0@^$msd-UuJI2G zt_|7l$IyP$kNjqi!=f*taoE?=opUMQGTYJBrInNI`F7*z=W*ofeFS6UV>W(}9^|O1 ztwyeXN;_703UDHgl4(pbd5n&Xqf>kg5t;?iItUAfPuH4Q@zDnrgi($yjZ3j|$d9B} zS(-F$)YTRSXzveXx4XPaE7d)Pm>WWnE0(oNz~NQ&TcYgLESu#T=9yH+g}W0OpQ*&s z{Z-Zy9%UP%QmI*)Gy*{z%J0L6vGS8|ZJzjI6#%5`=+l)O?s~G}72D$2#E?JZt z6oaZcEypJ&G*slWl1$SfbPiw#(EG5Bj0sjWL+n|t0uIOA(Laq+QyVEC$TH#5)tPV_ zIHV!=N`g6yx-46jp}{)n|9l52GYA{V%%_b2;Wamt@HcETz$QncrZqKGE1BD=q_?7I zV9X;CDbpl^cSat$86_lCejY?u9q)WLXj4Tz=o3Us|JJaOTe=9T?4Ye1@%{jnL~AJI8iDivB>u61*oz zi2{Ma=#%>mM@8PyUB6f6Sq~9<9cHbWeR)Ieu%#0#Iq(6M}4~@a(V+qrL zuSxN^)9?xe?_>A4_X3dIT($Rlf(MCNA7Ou@g0gY&4NE^`x#Ec(Vyl1^FFJrl$brtX zMHfLTwBXF4a}6^QKlCc^_M-iCWZS!Z-5#y-1q%_aU!<`;bw-Mr&5?qY;k4LaecV2ses+^VInt&`UY*X8P=}wj;bTan zsYX$o9#mjqG^U$?>UC~E8WyocNjx87eYY}uiz088csQ_&JY|WI!DyH*{E_P8&Tpp07I0GxXtV0K3GfBTv3FQn# zE|pYVp3RCX`CVB7Z(o|%0p6xHqf(`yxYiIMY>*(-DK#e+Mchh;Mnl|EVLpym+4mE{ zO~tD$(Mr6(@K86z@RW!Q)Q+HImzv}^n;4p+&Mb}`SetOIFuIw1{_N6}KsEUxn9nGS z1-Md#CzQ5rKNLs^f+e{vauL_F|LUe+KqrTS(#0$=JBfMwsd1QS;fg)&_Wjt4sPn5%ociQ5{f1N(q<9G3if)F5JKvDrEv>C4*aS%LSVn) zqTh-wBjY5{HlUj6{LcEyz^Ge;(XN|UCnt0Ap0yvxq|2O`mJ3=ADj8w&X|oWI)wFhEHc!k>iHsVxAeJSxK!s@>*ItAg z(j1(RSxa|Z2=i|ADf0NL8RJBZWnCu@ItuVxq^cBkj8Bb3vR8z6VXs217&n$3h)#_I zOKjFFMT6~lgTvA)SxE;5xFb5aG~<+O+%O3V8}TpztObN(M(!7qt4JnA9hQX^i{8>t;Me=Y2wnt@%riKHYBH&|GT-9nwNxgZ%A!<)|q zBOfA4W1Ccp!kY>L%I{q)CD@sTYle#>am8z9V@JZer&t?ssXfGhqm*Ycc26vbN{U`% zleqhsdDMQ8DFvVeE7la##H7Jfa_m%F&(t)iA;XxF;cjkf4?TETIDzxBW!pdmYo!h! zAb&?IKQXSF)PyvLUzK^mRB@i~5@QGqbD`HE*=+{_bWd?^dIy z5khj8^vgn>{S)oQ7n^VIr(reYhscs2$a{>KoyR|}t1xl;zk1EkvGcJd} zZtFb~E}fm7B?4`O>`XRtih;bgc{$A(ZrcP+l%I(Qto?*9-iLch3H#@?g$_je4Tz`V z?#MZFvCJxw@#b|%sj~j~UW;=SI$qn8ru7cc*?^XvBy{7cy^#neF*PrJV;mGxCKAtVPz#>d{CL$DT=oaX@qkjV##52#}QX^zVGD=H8VQTrL}*v?;=-Xyh3 zK>%xH2xAEg@>R6CNGcgaN@zR`c?Ph;H6VR*h(I!#l;WBBjym&*%}wph*h*khk3VQMWqfi^+Q*Nlws#6!>c3EG z=<=n}<~l!|Md1YU0%}PNJK_LF5cI|%vSR*~9wKZCLb%+#&Wsa{V#ce1^Qp!ZjU>B3Bvp2Y>V`{=;LV7j{2eiql`2uSd^oasw^q}K8_O>+$CJ_oI z4qP~zzdmk5UUC9&+PG2h8U75)HRTBX^ zj~nF~1X8ytWLGKIOydtsB}q>Y^zUjY_>w3Eyq}4nx3Eow;8Tyk@tv4ue{mCbggxlh zxkL{}6OM5d?rG7eNkviNbYaHgMQBFdRU|zQ4?mqEX&nyV*8Y=2eN-nM(Rtx{j_I31 z%EhfT>#UU}5$Vn^e%?SVfMlr9$4V*DUEeqG{CshRAx?_?@qy#gtUY$v|Fn7fxW8Dl z{@Kw!%TwX&z3S)Ff@@1ac%@gp9NO=XD71a)c7|@OV+^c$_5E^dN9!@=#8q|iRTF-p zXXBd>ht6L77yOlc+m}!3{pA;r7uvM_mVJ7X*nU&{ydj(w!0>jY7>;pYR-cp_Lidk( zu_Zca)G%3NvZxR{GvJ4a4e1X z#~^Bepj69Dvji#ADUz@z5+sK)ZP|^}&gvI|O#fLPrU4rxRG3)LDJPdSX-`(fLjf3j ze_n|p^(VVK-?OJ{$K|}h_RJiw_dwW}?#I57B^xA_xhD zo?Zwh-L{Dz=rnXrk@!)K{c~lyklD+_U3_=)16AVa#ri84EYkaRNH;(eg<2O5Xc11) zn=?lC?Z=!ylL*fStQs4#Dee9#L_aL6G6KWyWC-!C2q{<8&}=E~19^Fn-I6AXx-}xp znej+%$EUeVFm=ClIA5buhR|LoOIJDl;MKN$%1rBVQ-oNBP@|Ek>83HA zxYwZ2`L%w~qPyc;Y&9EJOuh4~2m^ls0x@-=;JoiRe~zCV`*^(wefFw2zYXKJ(&E;0 z?&p^9y!>?gz7My*mlyYjE*~#XwbwbB z;ORoOZ~a=M6?bOQOI17n#9iBG&F0pYx4QM>B!#x zK^)g%cO>=4y!)Hy)~78ivc3|e2y89LSP-~SuetFUOYGpF_>n)TYB8~pQtdBQ0$2${ z?PzL5GJ#*=X7JA+mqmhtWe|8_M9Q$Hj0<#Jp+~K?p^01~kaBnuLKB#WnDj}IUUAgW zREk7rHEW60vxHoBkz#b@(18@N%M=L$2m10h`|9HN*^^E0Ro1BHF8C>&IACR4UJFL} zNq^r-G_R8XFx;>~qla&m5m%g6QfQ*9RY}8t1642XfvdCj96_ADOQpfcnz3|}Wx<0+ zuaEi>(XJvxiYhB?qq=T-Y8Yi1QIXvm>xw4$t30h0%CsbXn*bGkKafJenP2e-Wi8={ zBSX{pjO&fax!7o7l1-@DYcd-`B_?>)WAFfS6n%L@Rbf^Z=aU>pG$J9a=%a z{BqJivhhMq)(%bZ>spU~Me!W*@!aO)N29_^`7Evj>xoCOO^_fTZrdYTXtz4LJ znaR@6{WV{^w~EYd-ir3K>2crAcaQej4Y!!>rtPcb_oI)G#|xv{^$T;XzemHK#9Khf zuY|w*I)1r1xnK9Bt1`#1THMX4-#mR$43vF(@NCz8w5zIOU_=Wb=^Y+Wv2qa*K!(5&j#dmQ=MJSAUhh+C%iY9#o1NusW@c7?6o$o7oa*xgrY#CZCSy_P&mxXR0$KYR{-ZTF5go;(scFjt zXp0P)H`%~444P}@>}w!~?2@g7qd(xH zUe!=kesQn<$dEGoLVRR5HnU||9@+R@Q=wv7r}9iidZ+PnVOld(<32JN1_AfKS|v5f6m~12&X=S7 zQ48}Dy#M{Y^NU+X&SU%VDJiz~4PHd`8(KQu=p)TN4kE2YY059mGnVkNZLMCUJ;uM}MYkh_GDW55?#ZTITzV# zn@7MpeH;DDWu@24m*dA}+tq49!Yh7yOyK+0)t_!J4SLR?n%`dAyf(H^SZ>qfe9n>` z&X)3izD?Zx-#L)>ADe)+tF|fc!x?Hz?xbR7A^b`WZJu2WC>hGTJpCy>`lpEpswO>&{qLm<*5Y%!8 ztGMvD253~&;I~p^5D;1h_faF~T%yPcD%uh~SepC;quV$e87iUxYS1T_rlwva|pFsbf;0=YGqKSm^b@dg7GOJs*r<)B0&tr7RWt9 z7owlN2pH6-X}s4G zSDLynvJ%vm z!~Htp?3dGM-h+YM-;*Ins4Qp&MOj0^Do1Kr3J4;{NvQcWeNe6ZRI+Z%J!{3l)oHL& z8!BRi4sgVyp(>x0tH&1uYB7(1&{TXCat8mTREI%MARk)I{GmB7_x||i3y%3`>|YU^ z)a$tL-<=_!2$>dcz43VR3=1ygzV0N`ND+~m1uL?3QGoeZniAPIx^jZYm|})q{D5+}D9w2p+hS@& z2%e?|Cl^;5WL1zCta?B1M%{)`1oa_N?NNyP#sc9l0@B71Y!TRYi6KwgU)f~ohvE4S z*|_mG+5WOBMi_xv8eTl^k`Eoq{;RS0QU-k*2{D!~ujG9=n2}`Z zr9xcO+#qmlI2Qzs2QrD+VDmdylZQEopc(WGU8E||@h+joM!ign=2^2}jC8GdGrVF* z7in3h)yXRDJqtjp%T4psE#GucnUj1*t;{gR>HPIUZtj5}SB|IwI}$u-#y$;@A`lk# z6AH{h%Kp@9YLS(*M%%9IzaaM_HkWVS=(V>g;e(fY$YJRVED@($I*B^gaaL`KGs%wt z1TUIYoC0a>EsOGkj-OC^M5A z%wg4a!XGK}U~xG4cl@&_k2C%^-ONw0_sk9|W2pZ-bo+ckQfU8!q_k{1qmQTgOHLrE zJNJoal;S1))g%`hczDg&si}x!Nve6%ZZfYXE+=BhUHL$JS>M&PbZUNTsseluq%oX~fVvi0$5MBFkTf}bgdBD*S!K0| zpj0`LsAl0h2^Lvml62gTWqqVVbYTr*q>40I_C#?O6Qf!a;Syp}t)%>{#59#g@@jnr zrE#HJaVyGMcZ~{Ul51R2G$yqDKF^`jsE5$hq8ZXB`8QH4NW;%qVExNWB#jF!$ZU!h ze{~w8=u6YwxLCR2d?Y{|feDBPtmWpgtK}eWjXc38~-<7*BeHUWNhFRHwr72~P z;5=Y~1Kmw3>%Q-fvLyh`tcWd2HPEGIgM$bAEvXV1W1lA;jNIKsDApgF+mALB&&`&W z0(G1}HuXzRz184i(y7$5phPCOKa~n*1JY>7UfFmBDetg@zeo6Vq*YC|an3Tz?C77SrC3(X9^%IHxO=o?C}6p-kS*-cH^(*oIU~ zHxuZ)eivKj@gww;k#6R~b0uuQbm!?~?se_HG=k2nzo_!SC5XvsnwG}GrN|XKJ+!r3 zx?4m7`g&V;A?&v}6RMR1y%d-4n|MVt^yTihigw!c*PGizeK}LHiQ2bE0d3sm^)O+_ zSR-!%Z;UUgAWknoyIIHEL;H{7NriI$;521>6N611Pzx-~HRCX$PZQD6m+?yYgq23Y zQ>}(}At<2Rpf6$)Cp?3wtQbwKlGYrV*8U|$E~kVp(DP?nr#hefLo;;~1PxOvOXNQ# zq#gVdHCKhVH2nvZ>0{{%yY}1sl~tkFHwM$45k6RxqOP{XIb3KXX(FWv$=Wyw`5Tk6 zpuc~TCRBI!%zDExG4Ly0LBt*xby#%rxy7o^$Pc#w5DiM?x$+7c>*f-xa05NXE1t$x z0Y5^8F0!@$lvVg9TUEA~G@T<5CF@W&PJi8F1o#R6Xx_o?#xGI%h|s_0_3i4*sk+YD zFAbQ-u&=v{JQT8paLr~ouyfaA6!+@7sP24+=|WOGI{oKV7ZW#awV2_DtAUuat2WW{ z=PNI%zawTHn?qBl*aeJ!L($me__`vBRyOhVkeOtzNWK9n`ReEQ*KE3{+aE4pT2M|m z=Bqb9*sj=*?{4mxbQrK&L^$8{kkEy&**cwK)(KM>LyJAIGMQ?mAI~uBABIKLEICw*;7(3&`>Rhgsl*MNZrj40JiO0Ew9pjA4N7jnlsDk}`}klK$Q3_k%k z0{QvQm+mW<)1KONM2o{{sduym3jcx|7!nF7EF94h_;Zz!*S_G6mxu?I zd|NEC#8Bo7-y&0Jd8PC*>%FZ%u-Iz$aBC(zM87YnZ*;HZI}@mu$lK17;r0cg2Q_++ z$!!gI7#*k>jNn~>dBq;5 zHnm7%n`Ej*d1p&69n3(LF+VjG0r#u~KUTXLB8g0cwm^l)^spOIZf#J~Yg#2nxgdwc z*21JH`LWO?bdzlzy529)LAWVqaSsVfPXKE7pPF@+%B0d4fyQ@-`E$K|x%QW2)6XDb z;ns%%G-n}PmINUvb0OgUdjTE(n(?ePhYM|628UlAUY-6gm3AlEWF;Jc6XgPGu(2y?v|VyK5m z!ygcv+q0zf==ltK$_l{TD7Bnf396;Yp8*kG8dT#+H`G;u8!54Do|9CNZ1-O*18r69 zEn|6$6m<^xe3*zbngjUIQ2cPp;C##vp@uWTf}+lhh10%CzSf>N(v&Dksu0a@3xNNL z)BQ-v_Kc~Ca76|8mUqT9 zb9698Nn`oV{&u@TV?EWf!qU1jQaTD@{0$KenX=5uIvT%tReie7>I%a(0@Tp)Zo933 zEv0*1OZQ_A(5#%Z4XS~1r7O6e&TB@aY^qZKstW{61CBz3YLE)7k-1U5o~;b5p|P%t zk>?A?ax4hELr|i?feIC}_j#kZE6ke%PfMP}%4BD!1*Q=#_Yh?BK z=9FV0ik({d9~a<~G;8~v3tlwm4lCpfVo5+3RTPa6b!oN(q69a~g0(MzUx_T z2+kORdsWOT>>chd9z32khi=a6y8%P*_@`qgAKR~TrgFNsE(rDYvbXUNQ^tcClDgjB z?G;SmI(3Pt8bocW)nu4o^2H-d*dTkC&V4&09}D$)4vM zRr0>ZERw=m67c)p#-Y|5IVXy#(H}R}*c2we+`k(C(k^b#$jI2oywu)Fe%OBB{dl~t z=ez4VL4%DTNm3cIFl4EYi09}}DyI`e0bkCvThQXwC1iEENZp(1QyEN&-k1^0q7BNz z%qx>7A7)6hj2dL#ZDAL+K6YTE@OLJz{Id|<$kMUEUd~FEy4vzHy9F^)e2?VH|E(2O z^)bYH_|ycR9n7Iq;}4?J@84{Lc;ENrch7Tm`Xp< z6HI6GyQR7R%u~;Wih(E?3y)*w{BE)No8A3D)g|B_!Xg{fMIG6en%t$3=)|~_%W3zG zk0e^tG4=Q)vEf@T-OTzR>Yf(hUhink;$onPeyPL4u=&h=v8P1AFejv{M?XY1!ku93 z!L(?L<#WWB4KFEdu8!6GQ-W6Ax((yA{P<`aBd!+*r-V5sID<#5pk^S|1C|T|r+V=TrIkEycEkA~uRgNo~$=s_-KG0)02FBe^t$ zLpb^Fxf{9iO$rCtO*O1olNb}{}=(2?|=FMyLrzAXJW{gzK8#foucnScGm zKcycsrGf(DQNs(*_5X-Ugq+^$@jyu+qHemX8HYN z0V!s(`kl#oZ5j#b=_!4^NSqGsviXH?7xu!kosS@-d2{y#Glxz4?WV?$4?GA$KPbyY z-^x~IUb8fT#A3;0PO0;ijSuEpq1DbV|jA9Vj`J8ny9j+5~yWjRU;S;MCuAno@0m)w_t!BstO89*HJVqqLNu^ z64ujR*&s%AY#ONqT0XUqOlsjHJm3zs?BdR(K|7cXW`z0$K)!T~I$e5|91?O=kn})$ z)M@gPv1+T>!q4D=8^Kuhx7diob$q^}Vo`SAK*5pRER!3K3jHnT{9YtO8osR~b^?^f z486oqT75u7m})qY{3OZJI~xZrtdO-z937-$<{^q#6j-m7#<^`BN6zJMb`uA@PBjNG z_==FuwIbj1gKl0YQD`nY2D6r`u9)NtZc%LkRPlw0Yag-Y^^{-DAM95t8O_5<9^0KCD{mW9 zz{R_}{oz&X=Ji>*zq=M(``G*NCq7SgUE4mM?paT@tmGFRy6=0Q9xX!;^DV7cUDX^J z9-q6Hmyb(M+ffo&L$Bzs90`bqi>+7d`9&nIRJCX9_bv5QHR$uv6m;)o|&lG?}Cd zA)nD5aMcmwXx5pBQZBe)kIlIiey=LH{_Q2x3RQ0Z&deegr9O*W5O2&(2Kr2X?1N_3 z#8djpVI%MO!v-hOGVA^qo+4$`MgDkqgzAUBx3#^6s_d!;W%=(EQWG~v`6%89;UYR7 zlUR&%bm*)d{iMJxmOij?$oL|%8j57o6O*V!3P%<@BO$q9N(|s2xysm4iBhOK!jEsn z@~*~}B%vk+5+Ee%NYu&;s9U@1pIpu^{cQDk@VTiy#f zj=y&w?_nuEG9b_Y<6V;ezk0=&BP~B%I$OCj`%d1PTj<6Ep(TY%Jwp|qo?Lu9K>`h` z1!M7RdTl?=iSLRbI_At4Xt7%DHVuqQ?(%xA1A6K_X3SfBy7KYoOy5l0?ABx}OIbwU zcX@4Wb{YG4~&tE-%}szue1ecWZll=Z^)vxbdKumtpUo#Mc*R zqtBa$moz(yE0~v=JAW-1C2-9J(|v*319s>k9&_u&ZxN#IC9_h(GFs6q62V~N7D0uH zKNd6!UF%n^@swofL(!A8M^?}yRp7*IG0w=7n8i^9t92&FYY_0bEN09BGwIRj)ZYQj zfL`yLHuT&&cR>t0S78hrI)gDOP&LkeDgO?)e4>a`k%DJN=tRfR0_QMET*{s;qTLX7}14LsM9 zR&GLld7}t6?K9EvN~Ps(lqC^C)Ie|AwqGe)+7h=o7_Fq@M63;3{DC@5NhQou<1F-_ zSa>quaK*;nhGAG3c!{wQn9)40u?2fMfSKwo1II=#KeQaqH{zIz6>{7xX4%Se!IB@0 z(rL)7c}Px=B+ml_M)T*#@yj&6gu8%g#`KT+sxI(h?T78%e~(_}f85^J^r7-e7gwJ5 zbnzgrfgo)@Fq@vH0|+=ecyFJwPzW5+@F0_@;j_!rveUY0LW1S~N1&t5Rrb^O^8M?3 zHWPuZ$F=vH;WO?ZWi30qYSMEE$}TB=b{l& z3P59W_@CIliEsxsOEk+mo*kI8f?5+;>SQV9=+eerYcZVS$j8hD!uZ@CfZUI!B6r)U zWAsAv9f<||^v2wGTkJ8x{O}2CGJ`@ja8XHwEG^j6G6ShT?`q?|H1wE+kx`dyGT5it zAAx4JAM|MZ3_h_VQd)Flf=%j%N1GSb#}}YoMPV169{MFZom$}- zKNR-SzaQevLvJCwt77+L_DZD7AdpqEj$Pu+K#QrEhS^l?EbmxHC(@x?*H1>1<&i>) z(L5$AFdaFMObiI( z>1PUFVvR{(%>KCoY7y@xW0eKnJHCphcLobzz;3ofi+-UvOeq*EKic_rl>+-b*Fwv< z_N!*x9V1R&bVZ+puPDzI;X*a=eMw-15Q~tJrc3NhhegwUxWY=q0RIEa^#-m~;|=cV z-y{?_DfdN>4^MkVQ0bs?xb78*o*`PF4+-b8v`Gcao;BF=@FHf-1c8j+gx-G+y0Q?; zRi1uLxqM7{Po}M$vU>+AoL$_sbTa}R@C@&3el|dI9mB?1xty}^_h0H*6>|zGFlXpZ ztTS4*3D4UtSS>#_c4=3um!~#Zid;(W{Q`W0k;97cnEgN;!X`L@jR((GfbCffx zSM5txkHASAUHN$k<=+oY)x0E2tG1Jd?rE1x!%O)nQ0%pIKXV@LG&!u>Zw5OM_gB_3 z4jpU5EM-$Vd(C)toiiY9d?;S^Td-ex^|@k*u;#>LkA$TC&ps6p{qla$o9{60Ok1K~+vRuEK~EO29-8&T?r2y`p=%sKZs9m_Sin^G3UNx(eT)J-cu9@8rqG zKLrl{A?~A6W^M7B5ksn{wdtBTczYu0;!vqETo_OBwjYQCEYh*kr*W#y zsQBIU442#8yvbnzukO1%|G1q&(HTGsjE*ZE82dJRgp+m*ttHacz%9wcZOecX#_l8 zKc4iDE15p{1$aOoGa8LrWx=Xhv`xhSKUBSAkYru7wOh7r+qP}Hs>`-*+qP}nc6Hh8 zvdykr@A>YDI32P7lc?5ReQ0jQIb9KoT^vp z8(U-}o9p z=EYRe2ZT19D=DoG3r+Uk6xMQ33Szcx_agP%n3Sye_AUFRI9594&~1GS=ys8cwWw~( zmyUj`3u-|$E*5=R@m^Z-T9<_d;}MR@!SYrmi2JD)g<(Aj!NRh7mJ=3?t}T_*dIVtE zi%)^nQRT9){aFl&($h^m$_niFN2o`AwUlhYO~wn?lwDg&^2qx6+tp`^rI13|?==y{ zD6p&T<31aL9sx3Iw=p;&E&=^XEYyH-0g#tTAcJD1)@klkFcI^KW`mW2O$Zxm0RkM| zQY?BZb*x;FS>scc1&aX1T5EROyS!3E`#yQG`Ls^ihmbAP_~kvJ9J>9h$P%+5FuH$` zxZ7oKy7Un#RvK%gow~2@_!|A5EwUnKm zz0K|%4HsaRxXu99zI?0CGpMZ@h{+_6m^^`YrBKQQhEMD*5oNX^?(0=FEn1+yRwLbN z9Gcl3V_hYb$+%Kwh8lV){xUp;V7;N_7Ph*h|H2do3~>-D#B3bN2+<^~zwj;-NXE4? zdL1>c`Yv?O#yIRE5UD~2R1B+_L7byo6wdya^`^I=Ap0brRQDwV0A1K2h;o7pd-XC^ zX$D15B$ldYT!a85F6E)v8ASWw`3Ma}zIY*oDIM_fkz-TJi!u1Je@+SPDo>p0O3Yah8lr(%AgBu}d z3i)ugIIm)#)J83Hq4c{P0hgRr62ygnr!_Otnso~9p*GZK3jqnWOQk386H-$ek901) zCa(#mQc+!?$K}xDw;5eGm{XUd?l&=}K%h+k*EtEa)yHQ6HFt$wcNASW5?uKC5K$Hm z0Q_yd12oy50k$?gXAc)YC)eMoXB$IuIlT(*|19%6syRebDhK6grn4xd_a;6RPLGDd z0B{&X+0r;T?dE&U#75J))`@7aK{RkF&&X%Qzpfp`oY-j2g6X3 z$I@q*Cc@ZoshOp$bmHf`YqtzWBdaOl6}MRIwl0np={gr(|H(3?q&Ut%QDEGl;-hE> zDHWxoljFG@HBgxWQqh6SKOh`BW7Y`D$5>xdQ9G5bn-(4yk4qhGqS+fq&VK?x#2N}! zSYg&N*vs}O>@=vfhaab~q zIP|ZPC6n77{6#~7N)F@pw~nc??w93`OT``^G*N6j>FkKP(+A@pYSKZKRbR~Gtj2H; zuJyG@>LL$pH#bZNhuRqaPw>BsdPa6@7p?IBw@OG+*_7L2K=3*K0beiQdD7vaTerV<E>a_4Slsu-LPNW zeLg?Ge_6I{Ufs*xFUK{ZrYWgW;D>cZ(RabCzg#rHs5Zf&_1&G`UY_2*FJ8UfJ{{aU z^7d|8%gI&80C(nLktWzk8h0qfbC>x9knI;Y zy(i};RGi$r55{z$RfY)MI* zR5}nipvciOD_S-LQNyR`dFIX*`r%ZP>!< zUQpt+dXXAg2{loiTOuw(>_Cy^y|s}BE!KMT+JUwLo+PexwOE|MQ2$VXL?J>;4Kz{` zXrhL0Yglm%6-v)mNkhfSp(DL=egHJqB>Qh6xo# zb;cN+P>(GNf`G0)J`b|gA6+x0ITp|}(#DW|B!F6+ni|KuJgxvuAaMBY5G@j+D!HYE z07n1dKm~?T4eiz~Ly%Fl6Ybq)jOqC}mUtpnqDm9s+u;cb9grP`Hb5UBoal|eB5mRI z@#ZO3(lnYys>y~`oHw=TidUNEzL{(~p#~Xa+N-xBn>uPh!Glls}H&{?A0Ma>KY#6yt%ox zo^_SFDS5r$Ps{r=Zga79J3j@M%f{X9W}Ka$=lA97`%su$-tPAH?rxix7614Bxt!OH z+nO)W=lk);2fgp#tMvx_!7Tj5yu*jGIy}Cc-mlyD+o7yByF6TeuebY=D4a21YwxS9 zC+S_1%#$?{?R0CdmpQMTviC`Qr{8Ze@YdQ{wxwCVhgt5tM}&SjH@W;hA6*Tk#7k~Q zYjn))39XL0)g61Et)|vRA)As}Z%0NkJT5%-(sqQMPh`;WnF|G}i?=hUqiIjKN7cVg z?-BH}qRDaFZ+(8U_ zf(Y6Y=*aCj(`=2*FIsNDiP(ej=&-B}AFm@}K&f#AGWZi>aK~JYHpC6M!w@g_Em^Ih z`t!0susQ1#MvO-ElD=UQ*>5+-Uhg%hcS&3X$$0@bbpZN6Ah_Mu01$^kUn4*U0s#yQ ze;Lb~A%vpv`n+oj@?iu`+3Vb$55mgOWp$zN{7QR6L1h9cJ~WlyS^- z*{wVJ3lSI`$3nH!+(J-8#{RCA=HSdOon44>g;i+uXhpq%GU)<*t|N4@LY5?q$S!uV zhp%gt*PWtv>Z`?sQQ<9QY-~(mXgDfSyRquv=koCe2@}MRfIekHK*pSr^G)xj*XdbRWa z@)8xE*cZg0UYg?lWXIqm@_qdd!(nj5&holID=87G?8?m#V-`506Iw4- ziiCaLpUqZMAN7P-mP`OYvSq^d#1klv9ROFXk-Gh2a17KL@WfP#MUrzq_nu!67?9@j z0(8a{#K|97=%3FpQZNJL+|XHa7pJW*^}#t+tdpQ6(0$(ALkfrwHGSbh%AnnMVO|JxVAYHEjFA;DiEu0)|5Q}JZc*|c=rwZUqBo$c& z-vwvPE+{4JY zh_+n-Mglw-UMDzafC{CLC5}7zZu{%Qm#5e3jv)w^wUTPTc&yIuhR$(#o4NE#iP$z7 zZci~bIWlh6I0T5_t`lLB4+zI1P|FFG?^K59fF2o&)l@@0Q9xK7RZes4NeV2J=%U9X z_tIPvfRRM>dqNaMbeKxiAbonk`||Pr5(~YWXqYiDHiaTY5y&bwa3+y%RG+^^{`rct z=H0`C04J-1! zkT&;P7ram=p!vpHKXp&6Gd>x*5^Mp}zM#}bZADU6UA0MQzyEYhE0o1%sg??;>O2c3 zI2FQc`DA)fj=hFHRAw>;$GI7vtBEYC9bF7YUG+?}kWMD7x1Dk<;+J;#ss>9D*JP$= zia1F$`jgo0?U6#th!a#b?e#jSqraqtgw({M%MMj;;vhl^%m623u82)#pmGD04V--qL4v01w zIA5=1%G43Xsb50ZF5DHb;+^|!}MiK&LN$NbmCi^ zRav2NU|$plzA?!syDgHW@ru4)!J}Q5j@BPszj%n1*FW}xIi=S{04nqTrt(A8zDLe@ zsOl=`hWIIx_9%EOca>O?$YtK#PQ7KHpqt2EK+AJgWcXv(tsV#D2M_#!)|k%6>Tv(J z#tHcWcK%N&!pMg1jHgkZUpWMLemFF|;t$64D3wCwKSm=gL5roTg&K3%muX23ZfuLW zo>ci^hZRl`N6*NMFyst_bDUI3G6Uw;OUrMO;(M-eqb}*FuL=;P)P#^Oh~uVrY1K`2 z2Xfs_3~6_bI(6z3K^2ef)60{E4{MNfw{cG2-|7;`8;FZ|SI#0=Au8Vm*70TgcCT!j z+Yj@f)#G~Wnf?Rli9=%AG|g3Hpjy8Z#q#Xswot%$H%XDPZb+KCO9*a2@po&F`Dgh7 zL$HNez5f|zg#3_df8d*+s3LV3w~eFakxu4|`na$wp62#V!hoFSE8qRm5pT> zbJMV~bNBn|5A*i8G`_XSrU$c6E;gQMqwjJRDM>P7_#pNC7B!NS%cZN|i~C#lGgQgr z)^xqPZxtK1=7+IYT^QJZ>$h#$T92zqI{*i#qJaaBEgc_kjM~p@M$id(anE2|1YV%l z&`PRVpm>cEFhhUy9d^g5Ksy;S`J7Bl&RyMv3eZa14+>C7eV8F}SinLc(b3S?&T4Pu zq(c=~?e}4L$|-N+G%-YWaQgkSw0w_wg13`|yc+!XE6)x5q?o{f?Wseq_t4tRjMnpp zKZs^mh1f<$F1P9B7^Mw>L4N=F2AUXK59q^kHn`Fz3jTwKS2W<7`ObX8D29f50X9~G z5Lm`Fc$uZ)93=>tVTxsr-Q3aSaTUhJV*fyh!K0$8`5Uo7?iZjvQ&GP2zWv)>mPkEc`k-_0fVo=szEFB>8_*07K_|p#^&qi`LswTj5bZb=t5i#M@q(BLV=S5&uAyEa&^(e#Ra$*6? zfevj2drZcg)(Yks=;IYO!dmP5IE78p{zt_5ffnjU%}gYEZuTSMbne;w$@Q>rD;8))vs!TWddH=*$a3}br(J6l$&KT= zKfC(!Z12>Gy|{|YlCAwu=KgWz%4vIjZM#E<*0mk$8d2L%c&Y+o*TAe%7h?bBfG1lvefgp5Bgj4*oe4ocKNA)Oh3A0A|gE2;_>R_ydv{EoyhI z27_9#>g4?8G|=70JBFJ%6eFm{b3IgMjgM~X342G!dncXj96DXf3C-Op!3fey)r9!U za~@Ku(WJSS2vo>P5@Q98a3@Hik`j+dlHWqbOVeXY3~Y09)1iu(9cF}b;X)gh3X@b2 zDN1k<%RE#koJ7LHOIU)z`K%bChw(@a=I#Z(O@CvQ6)bjN zrYmZkR(Q>>v%A4-aF=2Q7n#db;LeLi-zBu-B;MwVpZJUC(?{?mL2X16fzP17avt$z zQBfdQ7)q7yyZsy*w(%FbEfk&hLiIsa8ETp1ErIIYqG!miU;^tJOxhCBW0;fsiIABE zD}=N%w}#8%*I;180?|Q*0V@(woCqr%+zBrxGU_<6(2;$Z%GyU1l^-4xbyNc?15HbI z_+4o`IxIL{?6g4fnS%wnR>Yf8XR2&XT6v?CO!8_tL&Qq#7N!T}4Ttvc;HvjnN6`ne zGref7T*A|(I8vXp?qV@TB&b^pKsu(AI(y>V&2y+Iqhp4>K;*py6s~+9gdzG0wj_>= zm|}^js&I*(l=PD%%Y*A*0aIGdZVxzshk*fec@4h+f6nZ?_&_$08h?`!2oRnvzPMBFQORmUnwnm% zXE5i%Hhn#Gp7qUbKHYZu#BZ_D#|?&KAD^&K^!0=^LL3Y>#FerzTB3gW%WAY zaJ#~*9>w>`%yD|&U$sDAD*Vr<8|V9+C*73wg#B%ZINIDdaYRR|@xADeV6QM+Trt1% z7ara$smP}~bSX!ZUG_v1h26x)7OCNi0FsCU30nh?MwvB1YOxIXLP82*#CZNu$@m=U zaWc!%@RAH!684S%I5jy57+nIiy&NZW*QyT0LB*w|D~cjZ;T3Er*l;c-Q3|pLf8xwXU8p+YCoOYs4Vz)y&*K0Tj!bi<@Fka#l?%2K3JQeYT#TmWTuuQiI-sJk z!#!eygQKN7M48fb@ZC9w#svmjh9PMwwtXyEnSUOV_#a?7$VY#Gq7@P`%Nt$L>C@S9 z=Mfq8X_c93p;D+uXQ9#^f<;tjACpom)6T$Bx_K4Y8pG1s=_PGbb>m8*QcGhrrbd3^ zAz5a&oP=c(G2=y-rxED;G(7B?4_P1}Q?dC~Px0++hiLC5+ml>2E&+YdUp z`ZpaxgEmNc^Vd5rx4(c5G4*qLN4Ascpz%wmxtjcDMj#nhSz3yZ7zHpz1<=k3l)JZO;wI8T3O3mj~<(!+Qn1z7h~S;?${EW z+95h;DIrI6egqB^gvpqJ4maFi??0S8Qnj|E;|oP^R$mQk_%`fW&UsOyJtJXn8Zt=3 z)*aT+ma5XNrwD|W)na(C4h9f>K%#e08HM6Na-JqE?9V*8N<{VHT~ziF<~l=`+|_w= zM2k#6((q98)PySls}l)*(s8c8!&(gT%0pW>`czf-ho4 z>Mjr{OS6G&Y6wX<7WRn6_3RSsofp>K%6`WCVrWRx^~8+j$N8!ZK}kqm)b{vkHD|q_ z9C9@{KN{9N0KkWZfXIk?Zd37(U?7kWHSX{&`eF z<`tm>84$p4>zHa^HnZC_3;2THM5jyZl~l5QKUxFB;{&;`zwPDNjx&=d{IeQsAw&}B;>MXi&cG;`+H;%97USC``YF)c#R(ttz;O_PR zOu4ROm#D<;+cfF%<6rCTl-5|{NSO2ZY^)n|X2D!sG4QeXtsZjN^zrcV@x0En0gq}` z^LC#&Lqku>vKCxS(<^YCs`?rR3(dE zWaA|{>zd0x%>0CT`#Z#ow6J+7GUMtWpBhK^5?g`mc7Onugq)YNMB}Ex;tFxl@r6;; zfF5AYi&Yp_^Urp1u*uVn>nGW(d5#FAi=_svwZUokBN}3G!#HW>gUc>Dz^ntDLK*bs>%wWdA9SQzP%>RN-dLe17TFu0t02#pZNGfBXvS1VT%uh`H*}O zq-+;M3Q?KmHgC&6*t~Y;oTz%c{U`aS4V_qo+~&i-+L4VI!hDZW{uAeZP><7b%}tJr{TH0^ z8;(b+FlUI_rYWFy}`iwQ8%G*~Ph8zNDB+Oiha`SPcCas;$Ug<6v8 z5Mp#H)PLg0cEy!u&M;%F(jI&!Y?M*t^^uQ@5VH_nqhG8T-=ae zePBnV=r`?gRL*4*R(;6A)@IXB@O_XJdM6CXP_lD(hAeU>)EIWFJ?&zHOIjtqE(A>q z!1A=PJ(LvUlM?Xpfu-No3G@7_v`+ItK9&99sWm9 zk&?VEhyA~G)yjqY=wZVzL^_D0T6jepi|}ML5rhCfpE-BrPQ^1((ly*M{)d^2!=9}^ z>&~k-lfLyH-W{{Eu2uZ5yblw<@6XRyj|L7LxW5QrLyM*Zgu$SxFWXbk*Y;nxotMIC z!_sBXt9rj|Yw52B9*+J}gLpy`a3Ynk%jk4h&(!iP6nIE(8{= zYOdQYv1$zOB8s98lwHOy8{R9AW;J|$0O+dHHOTF8@>w}?)SYm`_M%XDfRhF!9R^O2 z!0$70Kd>e-c*YLK!)V-1hcAs{$21faTZt4xqV!41=OxS>1VUQ3;3R|}30toQg*RhS z5}W><7>iVgUw{~71{hBIrvt+4lnCCT)E7I#ptdkj44+7i>tzu3nT{}*F^zadp~94q zu#a55r0SCv)S&2-CFl318Zu$uW;n_oj~vritX{}?_#|igKwK*I^I-u}BJ^v`SbD0- zKDdjtK>lIT`AF$u`|citb*O`2CdpqqmZ6%)?4XswAZ3-1W-D& zG6FRYl{d7WMC%NCV%E;1-y}ImBsU)wjy6;0EiCLt{2>L@PJ=4_*P_< z@nCTJ4ynN_lpeqb6Udg`7J_9Y3iohkTOc|osd&pDAW^sx3X0YR{8F{yzEcOjKRjjf zPVYQrC&a#g`Mq-%9}@78BPJv8wkzL2{6d{gg!Rtqh!c@%RFNj9=buacF94F>dqf;=;-^9G947t0hC(L*r8?m_ZeLX*vGHy+S z9JbpNbPGvMU`4|m(gyQAxO2u7~ei6V?kxG!-xeuEa8QNmD%NzL(6|f}x=>pf$|xtX$R4l)DVL>^^!blcQdTRY?-pUP`G!V%fl9 zab0}`*_ap#hFb&cGV-my4Kb+L8kK`75prz?vzdpWDy|07`n~>Cf~(=AgIGl)p3sm+ z8}q`q{RvOHa$H_A23x5r=BqTPHCg(BL@g;_qOd85%MzBj`sSNRbX#)YGqwjD^g{Op zX3Wtk!5E36qARocO=5<)&J>S-Sz=;*@0Wv8zJg9rN4q$?1dE5UY3?TJrdS$dnXb*O zI~praO*5V;2cRm-D)1AU0~MA2Wwg=BAF!i{`k1Y%11ka!o(2w{b;kDjc;*+Zb`Gq; z;JDfSPAJS+SMd}UW}bzDR;8l?;)N*}Zk$9xRV%6rSwdqRUGZc`)=d=4_1kprQ^ z&Ph->)gg!^Nf8_Ov@J!|793r+E|-=d=)%Ezc>@x)+1fu<0KXLi&sEB>bdJcZjK{m7p_P_p%a*vM=%pRz|RMaYx}lnqcgI`y!EyE$qA3(XAy za{)tBA3liG&_LD(d`M;c4XeMO*Z=d{n;30%_y9_?oe0{>nA&hZM#EkF688T&`(fxi zb^Q^kQa3@@GKW;n4}a~^7T(UUhi}K$ug`Ds@JHe{ z_Iwg{ahMf{zw77c;^OAkwzK@St=FcW`lE5XKips3+`aa7e|dXPho4dB2l>@Xs4mYEhOWT|sL|?tTtec~D}`WiP4Gr8P()#n(w} z-yi+`mi7Qnp7e$Dg3R@jceosNqW&%Ta%z)`yKRVjJTYlml$+YERpIXG%3}nQTk}*> z-60!Y6=&1HYSv#(YCTkl5mndJHq>NR)@^E~p$_(PVz{;FVVE0aw%l>IH%UzEMucXN zGNHN>r63_FJXgS)bjs-->cq!wuz?Y=2)c%?=`PtCYre5a{7bH`gFJUuwnaAD2ZnC4 zrdWD@ox}Bn`9Xi)*gt1LYxl6}ccMAzSyK6&%u*P{QklO$3U;Xm@f(*IV&*c5L%0Bj zc~UX#+#L~1;K8` zxE~VGERXyTw@5lkczA<1!vxo4u9vL|R_T=T`h~C-^YTMymx1LXPegd)0On$oWr5h9 zVnZx783pSGqQ~WOIsBW-6%wMtu7J`^e0Imo?r7YbTtDz9~-qAqY7EvNH29qYOegEo~{E8!s0MUmP4?Dq03 zL4G(Fub`Q*zvbb3-%G!+x|HQjof9q3x1^sZiGVu>W#Mp;QFStl^m!(I1_(S+X~%+^ ztys`J@b2}7NZKCJu(jL;C+aVgH7H|*x?dnV*LSFwVsP9&z}Qx~dZXKzgTg_gW70&h zTbrBE_nZDS%5Ui>`cz~q>mD9p*aHNwVHXLlmTqGdSsKVfg+mH|VO$t%lPwiJmFevv zAXHTJWhbS*w9@i`G%En2*3N*|8!LJ*T&Pf*|_GP$ifP0%8`pZ28 zkP3#K6dx`Px5xchFEmlLg(Ph#mJ(NC_i;5r9-igcI5{TN2w$PAEKbnAj0E~H=CVMF zNTO$o_acgSVU$jtImOcw!zFRWHNPVBxWd~pMG(F7aqJ2E(zGYEPqw{7@~!LL-N(4L zY4mTPT>P=!%zqe2|4ljnnX)VWo$A*t}+jN zZsp&zn~U^x>Wj>^ZimOEAH6%)$6sL=7gf~aYlzp9x4wMcZtf$#t?k*kwl;lyTfI9K z*|N5Kg+)SpERa>^5H zO&)Fz4vbW&wq+yA<;i8#=Qtb*YLF4xHWpytNbN+J;PdUN1Y3q-%&lo;$97aA63~S| ziSl_!UV_KfCKSb{v=4&9Phh% zQ$L08f4d`C5_Oni-z$VQe&I}RVw{Eyj;22nbZW!K(`s2JF{D~HM?x@R+4@YarJ8bE zSY4LE$L4nXy3a0uDi_@D-?cA~cI+Q3@-u&}+Snl@9w{HMom#e%)_@OAuPuHoKd(<0 z_M$$P%lKdH8@rRMhi)$n-`#6hw?p{6A6aPW*%d)gNt9+_x(Kw&sE>_ zCOS=t`5`BZ*;fW4lujSimHHDx3AX|%#R52vq`_uaWI*Sj41Ba&Fzc)MQ;D7 zdZv$jp3^?Irp2RBqjH~es}zURBu_fSQleKv>rRG9Ida(;D9jpJ9tpV+^a3iYJQ!<) z={Up@V1{LDtD2NJ9N5a5NDyi(Vcl>FjSfSXU#OB)A%k25XkG+~M(sJlSgs&z8>tht z4|u|vsoyF`S^rrb0FY)|y z@qi!8Qoyb&X|ig&dmZGFQG;}tO@UJR6T z+bx5!G>1)8$8xTA_iiME7LYigbPWsQb+TBjqA?h#Q{WMnV3y|`(*V`-M7&8_VW zx|DgtBg70{d-)8fNn;Dc z?vfqCj5yz@^{Y*#pYlh4={e*`iah>l`&^VZW3vQce0KUU8tQ`X+1CF3u2?3i$k9#vHVNQf?QeRb>}J zl0x>k)PloPiqX%Dyz+Ws^EQD}jP(CJC||N&*)BStl=`Xnb@uL}&AEKNp9>dYO|+1> z|GK5|7iCq?_SJ#2>V5eXOQiSgb@ImuY;B;V)%dMJb}QG<(Q%74_8WoY1YgLDkWG{F z_vi#R4joNJ8JG(Ilo+=JAGj=l2(h(}1}1?*XGqDP+$09AO?wbK$CIvlevd%$Hy2!) za=Uxj^mrC0Wh8|I%|6IG{MeE(41BswBtrdJfp8M!AlAFtqAW86BH%)@dPYbsi3n0W zLXHJ68h%!^Xkr_CgI2~ z;=_3gF7)pP+?Wfj-BIE$`Zb*zPeQ@X0GdVn>(!h388}1LyvlR zn>L&KI5gcCF%Gz$?Y73B+kLL9l9PeKk@;QL^~=^aZRnZf5^tvNM@ewr%fqv^U9yz{ z*svqmD|-(?xc%eH;QZv^{gPeKGn@bIX16Zt7+~ZQ^wZXO$3Z)hQum-{3)iWMzi;St z*wqRy8BkZ$$TV=w%xsX(t|!{4T67MorCy#L`rK^nn6XfXc(E5bU~vIv9$-_LXSTkA zFOn)UitcAJcTBE)xcJxS>KH>N2pQ7fdO+nagyRDeRp@Q|sJSPzEWq^C(tR{Pot&pnN&&s`r-{tq(C$7uQ*sh!+YjQ}HhEGmd&LRHt z6}siKyYsUbK2C&wV|vW(xvp@G?5u?Vf5-8<;IJH1Pcod^sRHex7^U!7sp$YjX5y}9 z07BMWV~Wx*a>!sqtHY*e~2NwtG;eFJOb2r(!VN=~a=iE*D#aW>Yse?HH57rSwvj4ociE zOqR$ObJvqLdOli-I3oicYCXsjQLX3m7dikC_9E1$5*1tk-DU~=y0&TZ>y_Ex8OdD9 z;k;~{Blkw?PGkZ(EYm_XqFeSSp7A97`xGZXa)r+|#@nU$&-Ul@PZ7nqgii`9OP|W- z<`q70@f$!BnMH8%`OM9nvmy)-I5E7GBJl({XY=r)bo1|zpLhFXzoNa@>!ZhukM5&v z@$A;6fg^9u8LruHorZ^*9%09=ZgcFR?Q65~gibUv=d`S^YkO-OZZpl`W$kO@+I8yh zl&6m$ea8*hFj(AEPYu0ByIwRo9KW1=ntQ_Q9%7tt@0biJI`X7GFsR*{T4L}Bsde~% z(GSElF~h1}h7;r|{sE$N*rV~68*}}{Q4@1SB?h=2nJM_i8ci1E2Ukae3o3QBKN(9x zM945FPllBfex)IuLC-8*9XVuq^cshTeDA1Y;84SbXR}brG@BTp&b~esULj?>cZ+m& z5rhURQB0Wvf)&tm<{o`A^10&lJi<7s9S*y6sK^9&v0?1(hC~4xYpIPWSvAAmw1G}S zOP8i-95WtMGdi#=sHhPOx(n=p?@RAGza9n8tBT38TiDn0Td)OG0FqGGyd$YST?_P9 zccy;B+YJkeb6U(8iSeV9WMLzu=SZ&*Z9^QwiO5ndv7@2{3a5s7oM=NtQwWbK*r^CP z(Lw%DECIJEv4JpoKHJ2et|F~U4f2Bq;9Cx|2BqbD=5K&>P9t3gFWoX0^qSnUhG?Ly zpnSC1VW7cbNK+Hplb{_*gRhYeRfH}6V9OW(7{Qr=_Q;Y<&LF>ITR7+&P~AYtR9C8k zh2Mb^+`pNms$`l?>!SxJVN>6*Q*#y?^O`TSQ&n|-+h4x>q+~SRn**{lH#maMEJIgu2F6W!$LM_qZGQpAk83PH|N9&!D9Qu<5VG># z(5Ae%J+D@5xrgrZ$FuMUWq9Z~Ljd;s_ItbyBhY}dxej*-I92w8Zv-pHkO+uWjGmR@~{ z>D8n;en4oM6uq9hdvm_qJWxT6pIqIzmfN^-U7M9yV~ApbSG_g!oa&NYYGuC6J2rDI zu2c;5k&6pcqFp*HU%i-Y=Oy@|TD#S&RjM*ttiPoxJUh;HhtDj@HvY470`hY@Bh-?J zL5$2fr|+HfC!f(fcXpK-y(A@%xr+du^z4Hmc0k5MX@*+!02PW*dK@ArC&yUf3=4@_ zlQH3qn_c)XNRv6WCKeQ8EuaLF>KkGMNH-w1=hMbh{yGer*=uBH;z{m6n9*q$r)Rdm z4~m5;l#vW&eodTaue;G}%ks5)1MK4u+&cK@2l@}K_&*)t%YVA7#s73y5{`^+J^vf+ zpbwjAE8j=FEV~G(y*C~>9DhPAuLd8tY5VQ6Z3o{M+g1IO5%P6=Xs~@FS9TcY!1Lc? z=KSr%9r@xb;=ap!eKU)Hlef}yBO}?Rk@rLN?)^C*Ec^9h=`n%YycdS z&LMqQdUE5pRXfysH(Zi$JZ%!-Bo-u0V1f?_yi=H)?2nYPKwvVL8)oDzP#NTT#k%AP zLAuC9S^>I}nGRL$sLTrCAb_=)kfW?5P=`20S*e3V}r7-XO^ExmKQ-aJj4gZi`m2^#VAx5 zkhPE7?cMSlfE}$lm**nd>ke!jXP@w1?T<$VFnZ8Qcnzj4oB|>MS$yt3YDEvs`QDj^ zcEv3Xh=?=Hii~+4lP;W->22SFYk-B`=M0-4z`=nvdDcJWkdN~JA1x^Cm12=V0$g4A28JkJQmFk={k{R|&m%$HW z2>CU@`BgB*5Oiw9?;-~N=a5&7j%$mK#I5U=AImse$QwyVWzZawu#2G?Zya12fwu)Q zxcey{sWlwI5pw>cz(p(RG3HboBu&N9J~;D^3Jp-o94z#x(Iq}m-KG%a*Rj9qZ<$CG z1=C`JKex?{g(V6bC`^SN(x$2t+RPFLg`kl?2rDLi2`C)S7D$a^fH-7*uU!9i^CG|1T3$PxRLI zKTQ7@j3ixZ?b-~U;cX|0Kr5KVe6!Cx?ucx>{^>Hn&^x23?}@ zBG=2k*T;#)P7Qq6_K5)pUYs+`W4j*gA87X31mGf@iF0U;p_FEZ-$3=tvvVN`Gp(9Htl>5)WiVpMN^D#}->b*KX) zB>DhDReXvF+8M3-)o`VQfkeZ*Of5q{;pdfN@8X|(Kfnot=$t@;sxsT~7*eQN#X}kX zw-BJ97f_v|94w^V)LmS$TRGMirhXvPR9TNA#ea!$RZ_^QRB~P*RS^eMmG@^1AIh{wgz7o2Ha@| zN;SyT8Toyk>X?QBc)LQDzllzmh!rKoQWW6xcuVaxuMhCO4082!JT6tI=w}D+5L^8= zO>=YgW}Gl{HK?q}UAGITyY@5p5p><+`WuR^9u)%sxwdCisa6m4PiYXN^gk&L-aC32=T$P&B%+d{*%w-CVr9oQ&p0<8EX!3)5t97W-8k zpBE(7#)PPr9|HaJlaoBvkQNLKM6C4AsD(FD=Io+f|2RE>uF|101?dxj{t7XiN5fy> z!TyuT6I$P{4Y@!Lkqm0K7a;ZP?uGEX-L~s&boHYrbjTw8nhrYijD0i^7)FtdGWsQL z$AE+SAQL&ZV&z@)od1tu35}iQ8ue!1GM~0@f(A_(u=TQ4F%eI5M587)rG*W#a=(#g zZ?kb zbz1&IKw0Z=V#Fendb}sB%jA-LOAcd_CK*e(?BwIelF` z%y_>%KHeVg+w4z~?Bw0%?to?DPbQu|BQ-`m19T1g9SS0g zL8}ny)Ici~u731JmBf4i3l0_uhc^Jt0yaHfV#2p}Z$!c9nn9Cx( zfv8Xle*$!61a}D438@&UVCiKWlmQ=9b}j3!y)@qF@r4RX2~-$(=yU|T)Y-13>u8Wt z*wO2|+x1JAc(z6mC>0ta>M-Y5Ewkw;%!6G9eplID%+xzDDzYK(5Ww`{{Ylr6nRjHA z6?+S7W+zj5Gi#m!u|i!Q#GpW84zV9WIF0wV*+8!jFX)QVTgy^Nzv#!i+gO%u66u!A zFB`y<&nfzqZKIhJ``FLF#sp1jx0IT@E5+!AKnH zswobtj=GOi+-@*RR_>ZnrZCgt)ehc>fLse+mdvAx){r?fD(j(7oNTSjfk%pKXWKNf zU!z?wC?Vj0f$1&qO#JkvM;G+gAr_{+3>>u__@J}%hOo$My7raY5Io)^D zSh4|K-F;68vwTTbX|rCk@%8{GV}xbI0%$rqIl|dz?R&9wvwrHsW4F@2boRjKbHUxs zhtu*b!z_a=jmOs6;}Etg-l;lbz{+ban=OWlp+3a*;I%wsX0n>>P`n-DaPhF^*seZU zq!ON!a6D$x~g22V)`8>PWR)5$^ z*iVE+qYZiLDD?j z#>n2p-u-Rrd##!g7Rv}v+IP%KYU@hs{hos^AG|MK%8}*A>A?s*epS>!RCoX1-s(@{ z4wkF8@KCuKSG)I5GaSDY_KJ8-==MPx_jF5ZO`(`1H`)4zV3bUSJat7utw@lV6zcW< zj-)c@gt8R7Y1_9egKu`z@Ie%j?#{h5MOdLZnrl7s;-o&lvgX%5egGr_1V{nW3BNuO z45cYSB6dtVIyy8U4_3W64=1!U9r+*M0IZ~fC_7;Z-5`^~p^#6ZgBc8uta~j|qM|^m zKb8(M+&CjUwAphvHf99ojjDAL?C0X#b+kP(p9w;;J_L1Mt#=b76Dc}~jbuoQ#(P@< zYPn8acvB=;lBTU}p|g4?y6YytR|fpd4P4D;T(deXc;<Ug$B5z<%+n%ygZCPQQoII2CF4q*8Z1f0gr`N1@p88eg(!1{99tzL zxmTEj7HJ9uqQd~g7G36cnVVGQ;NFTmU3+$wPy%CJ5>lt!BQ)8$Pl6XpSnca;kO5=U zM#4Q>^+hnEu%V0D%o-kRk3GP8KQ1#n$@6Ls{~krvlWASBGTp3O76CP9e^t1vlZp;< zdXS(Q1wl}K6mo`2qCJ@P%C+z01Tj%gyI26A4py2LRS&l@WL+);b#V>tR>_(&*8U(7 z(_PW*S`+cz;Lq@}L}lpVvg2vcuu-+G;c9-^-3xl^@rKtx!y->mMRp7~Ls)Yf*G@=9 zhmgzAsH_J4E`jEkso)0BKh@AGjo2KO9*5DwZbxyAS|U_50i|-h=wlnw2t1l&*}=bQ z?Zq)|hnm+GTI17Hk)lTCR(Jp|g4pM|(#GB9 zNg#Ml>qSlXTu2_=KG@Jv3#_NzBzb`thS&e@OQ|;;U9o$tzYVcw17tW6Qj=483~n5u zpQw9#_fn6U$?TLBcI&{$$D0Z5+_Jqt@#@*RUeKNQ=*)7Oc8|Fs^wQY6+NsT*4#km9 z4B6)&7+SmAzc6j?#nin@BPVZ)J@?E!XAV=c=Kwrbr>7)5~A_-qZZ}AK`c#Z zS|Mg5A9L={960F(a{A(YNz-@g?)3C`tr+G4ak~qr)u@iAVH}&1Mv@B8s<^2lGYU`8 zEW}ix+QJt{NcOjQks)E0Y-c54Lf#f<-b_rsx!Q^@N%5R4M-Asyp@x_hir1z;s1j>I;4fEXVk2aDTjc_UZEF;8YNh4-0K#@lKQ~VGvWqXTSU%P{P)Y;+1 z@XZI&PpMhZq}(1`6>b2o?cZ2f0+a!|RDKX8*qW4%uZn)0KosbxwgM6bK!tp&)bWks z&gzXDEsaWwV!ZMc@5!W$dsh{0999Bhq2yq}XY1#NYUu2Ln}(~AsbT-yGowyjW7hB&3oJ8@bn%LwumNL4xrGua(1 z>-Z|;bgsV%nKb7^cHlTcvX}kCQJ$|om8g=FGsqI>35C5zZznlb&dn_POGY+6pn0Ym z^xA!(p7c=>*z>VeoYGF}l6C@aB;;}U(MjL+S-BeBS6;|4c;(EYy@{Q)rrgY-%^Xsl zTCqDiDiA-sWHAOV*{|(F>`%Uj{>QE{m3XBn6t2q;gUn+(ImwLZA(~1age_wyP+Kl$@*@lki9 zbDJ7{D8SpZXW;^%ng;mLZW0+$n8_lnX@IdJ>PzyLnW;m(_ zOB)fx6wE_4xdWYiFYxdj%{oKfx_8`}LFcnM@da$K4S$0F$1m9Z1Ifc-hv9wKqiIo# zRxJ{jq_W08Bl%0ZvKeU6!B%GjQ(K>Txbm#Pd=RxjB2EW*F^8={?9=tjkUqBb^Z2T^ z^78BE_N(RS@_2wh)HhabV`F6GeaE%){uO72v&VP!nxnXB;P&$P_w&`q$UD5+Mw3E# z1LOCGuHIEG{YYo%?TzjI^VXhy^XKJKB|3eTH9PUN>F}F_CVpMfWsR@H_tUKlryUtR z<_Y4ARYko9WR~F^TZw<6JS>)m2>}mlQkuGOM0-lSA<~dfeiUvp+o8DTikp*zgTo-A zNk22{kPD+g`4K}=T0%dh6n4GZ51$}oPyUfR^>L6O zL?{k+GbXX+?e$*89YK9F62-B!aO*(j?pJ;(t_K0(9*}{?@)bbJ;%*lUN@bvc(=YW;fg_Va7v{F+mulXnTRa+VUEGWD_acdya*zLJ<`GkRvx3%M5Q-c zKGIJ|zRQ!>Mbz9kSU!s(a_?X{ty>9dzDx4Ilhj=I5whr;>%aUHmEit|N<<$)<-01otTYA2VUdjpjyp2y%-Z5$9H0DFdL`2bL zmGEN!?0|ZRur-gLM9Wq&hc+{HdLT{&R6Z#4pm!0dq)OCOEA3<$_7==91*^sdpJxCU zL#~w}u)9(gULy@AYdJGy0t)mvpDJdEL~C_UVDIU|AjVPtzGNMIXQ&iuw3H)Y zY8?4_L|C{M4zUg|@vz@bk4DF#P&YvgW15vcTcQa*Ch!gL77_Q@oFz0Z*X1rb1#Xwv zK2i^^b|%jrysTH`R^+U9<;-emdbS1--k(xym`>`ar+CO62q9qonQh*x7pdOn<0ETW znZjmNUC7_qqE#_diHMbTM0K+>0+>EO1T47#m3JIbqA+b5?lurCg%4>r;Ou0l-%3De zm{RRXFEp9iU}Z3v9Hm0e)*wXrF(dc&55nuNI(HMDzgHEoGuDg9{&lI)@z&@X^)`Ry zxeW<8c{O<`c)&b<=p)i)I&YkE;4iilvDHDdP|VSr{=Cxk^2^Tw?ABAMBULO({aMvO zaH}d>=Q5=GgDqVy25e|HkN6K;+LYPf`DoxzJcdGlf+NYt&0`(9wer}u#lNM?ju$#| z{f-~{=;rO~`|i`sg%@i-Y46mkqabNva&>T1*U9D6=B^!UfdGcLnCsxwvX%9?rL&_4 zyW{fy>EY$-?(UFpg46M8+VEl}TJTg}7J(Arjm6>FDe2sCpD@d+S;hBW_k#eiIjGacvs{%U7QNUkOGIp(CiP|&*G^jzt(%CR?N{`_L4_UmN5YRA2 ztW`BqJjirrNul8HET*NUX$4phrcfe+x=aboCWWzll9PiOawcsdqHJCjAgX-!6wo^U zKCMI?fZBvmN_wX=WV7Z`KdY)fV(o_zVV9yln*yvoGn7mg1nD^~LqfEs+uya{`sB1I zROX~oQ^no#Va%XPn@a){=B0nO6Dow~jLGdGt=D4o=qFDJXlgNL&`Un2J>6|3fUSP@ zsY*X?&aT!!&NKxsYaYrHSUv=@4-{nyVD<<3^T+oPWqdtptbTxqBxpWM{WC3fPW+!Z z1pZH1!MHDzntwX5{%C{G=w^dNpcTkszV7`g&aIJ+3X4POLUN0f(Bt8u>ztW8;nVEB zRh{{?HBozcU24+HhvTA$7I|OliSILYD$35CU?VWOSN1T?@p6^{Mliid%)5@;>zg{Ckd%aX4WeQgo)RbiwF+Ch*; zi^0ZQ4v7BZlYc5Og)RHxD*HGmY4E7QQlAk70ZZQv?$G@`7@F=U?hUwsh6Q{{G%eWp8bf)_NZF@s;} zlOS#r%VFs+`$G=f$RQDw9<)%xlN!bx${95Ka$Q&ie z1hGU|@!Yf|)-Gl>qZqlP{sFXl_m{yLll>aoLA?YGM83PYAys*5xU)+C;n!KWNhaj# zZ(7D?=@@pjEEaH9Fz&Hkt;WJ}^;GCOc2v*L+HWBEhI4b~fAkRi@15v=ZCSzT(E6h- zJfoWqQlHg-df@vkBiX{zAAurr+Ue!D}&{3=O~Xfj(EMP<%Q(F{5AO&Ki6>{G^j%D&@T$?iNp=1bTaN`x$yrE`G2)FF2( z4U}UQw8f!9VM&NI5Co%0$%t{*ET&owsnw0*BQ4pFHO83T?r9^A?;tNd%9|emAsYyg z@oSHWk0Z>I+N(g^mqLVtb%vFqf(>mP%T6$&6_r!bzDXF%^TmmwRGhvzha!X+^faH6 zR_td3ud02H!u$C0@l$_$p=+vXPW<;OqXfiQDPd50VeR-fMno&3#SKcIC165)iT$K@ z;7HLN(-Ml#EDFK0X7v`J=!E|ii+op$NLKaQ)4VZeZ6U`{(O_W^S@`mzc(Kj;>Exia;bo^9+iysx(h|4-K4<8vrKo?YxUzwg(>=hW1~ z!opM0#t8qloulL_*g|Y5J-(0k+up&-h7lLa#)bT=lh^&**VMTjzpsz)%jLkpz~ybH z>-Ba|wK`(ux3USg5y)d~r?;^;HSPPaC3&aWsPpWkDaR9z+|tAQOwOC~mO8mR*So!? z%1&?8DhBjtNLp>{kLTNC$)h;c2AO2_0Y&(PR>C6`n+Xk}^`@lNR%Ke_vT}ua(=DMb z#W|%xCy2djyn8aEUD=_c>gW(Fx}@i`Bt|rvbdu1JV5utg$uV0s@dS- z*ga-0GTksIsjrDB7?WzSKj+Q41mi`&wyIdI6Rl!QDi_73IQcRa%6KSiML}y#SXW86 z%+=W02U>K&tAjC(7DRHRN)}++Hl{|sC#n_vB>k`kSTHk_vFMuGQQ3Duid5ejuUCy< znV0PAuBjUofbrr(fLz+kgQ$krWb?0V zwlM`ovAL-}ejS0t+uuSN$%00Iq-b~?tlNm=PE#_#Nm_%zgkjMAZ4O!a*O%Cq6@d!u zct5!a?8H=ImNA06DP|uS5@@3|n3IuD?945nCT%1V4L(i@I#7TVwUmiMkEY)&JJOo+ zh#M4Qh+^{w5S5lSrsD0d=mM&FrAHM##Bo7S)!9Y`-}T+bccPx!qq|xxxagS%F9)7; z){>sN2iV0I6_g!!Z*HYhpn#P;t8Dy*7H$&Ilk@p%FJi7Zty@p>d>U{#<_=VX<3ykw zEi*oi$~utI`ZDZ#H(OtTzsN70`2_l3u{kD5H4K#mL%S?5(@B|Q1f!bJY}BfM`OA}n zO?G2ju8Z-k4h0O;Ez%v>mFc#y+Qg)te1b%ypA8i9M7O#p+QP`cS*TqLC_F!jP)Qwq>!Eg1az#`n_0W8 z5Oth$31EXX0Jnf^@dta*z{mxOz|K55EDE~TY_JF7EMONbj6}x}1K8W%mK@hFR(FcO zwk3ZE)UaLgKngq%F~peL97GRMUE}zFhq;finCMVMyyVm0fC@IbyQKXBe97cPbJ13i zQ%@3a@MbhrDcku_jrZKcg*;uU;Qq+SLNV_@HC{q$R2mgudY+R ztqX25Yx9M`46$+JN*V>W%n0!jFHd8dVQuU$Lnle^Zt;{iy(K$bvSL5PDik0z;8@k} z0G=b94#Y=;z!Vp#1m)7{6Heu;6xKNl0Io-Yat6^^D)OJLe12b?k^?w~8qql&1x5kq z0oOs*Gypbl!c!+ zu`gkDhM;QCn-1nH^4oR$19(Na*pmeI|25bZE6>SlF~a;L=vH*9kw@c>NRW*KgKj?| zF6gLHITr$n_}A`8tP^!Gwpc9LIM$-#Z;WvAb$hDIs_K~zIDR&@*O;X7_-Og|X2PyK zKWD}+oVs*AZv3^gO;v&k+GX$Z=+h%g(zK!I!eRzFO7tX8v zbt8|tYsj0?gLaK0zEgPEtJJ*>rFM<3BzeE5Q$5dS$2Fr1rZzxL3%5~A!YZ}BA?CO9 z3{p7k?1reX_~D9$;v!9}h)LjP1cn6Jfri>((v2ZbjdSJ!DIDNI^_UA&`(}E_8XRQ{ zJl*}``aq7Wju90|s8G@i2^13`q$oE@?2>Q)FviqKAV>z|5FW}q@IeerYe3*NE*7K1IVhA5X)6qE$12x%q1dyTJGhGj!@kpAfcqR~t^?}2Eg7Fw659vmBq zn85X}%aKly{#D-nyXc#7cE$$)N(hn*^q-CYejBOPe5NcisR^?g<2YbRHFFmP~r zvvT`;J+{~QT_D$X*kIU$N&(vF!-iiovU!ao>ywxMdd5v|Zg|UAQz3jxm6}u3(xh3@ zX#UNxn9PB@6V#F~=VW1NeQIhXww-3#xcTsz+18@*d@r{2omy~NE{b<_>AIp`94_M| zynrQ>L^Bc6PAc;*$Ub5bvJtchZC*sZ1P8&CYN82Dx>Q{mcxaeVbWi`>CaqpKU{Diu zp(ub-4(UjrIm!W!ayN&nOSGV2^2`{#&Hy1QKywkRsqK~ewlTCd`n<$}ttRMQ)piN>M>{C73 z>!nKG41dK-MSJu9DCuHJ`xH()i~5TBv94oPnOTO_p@>o>Y_MOH3Ypmcs?Lfkxh)ik6|}+~0^z@06ud>bqd~bph}* z3h0N!*;lCUEBJ}8Y0Q>MX@qa+hKa4>4uW2ySA_;_RHN>31~c&vF$tiVYAO#vC>T&n z1~dIL*@%7rBzgNvx~U``4qDa~^$NP06mM z&|C;4QAm566=kc`HSA+MVgPJ*UZ$?B)DJ6N&D5Y5Hroy6!*~MeJODRVjy@)(GJkbh zTAzCaZ@OvvLU)(sK&OT#Oj$8#R!9Lzdck)~1D=D>EoBm%AYSwoc)tfZ$(KzCM}_L~ zLO}TE2V*lgtN8mQVz&QoJCAX%$wA#lx`*V`#SVFVrNaV3yoaY%xodQ5$YZqnVciQd z2?bVZJ_7_LMDQ=o=k@@1Cx3(CK9wKRcG%2Kpk=E)-SMw7+pL+Gj6?~(P;(20w|Cd| z5_OpNe&5u-edz(C$8|;gGwOF%oRcMHg!xD|zh=E%4?iF&ZGrE5gyh?A0^gAIluwQT z?fJ^G4u;}Vjc0B!yNGJ8JV~9q_^#@7@Zi3HsAsPAEgd;=ZspE~sVrS_4kcr%i}&c5va~i^#ScB*=D8@f*!oi06UeoY+@m}{vJ!87!5F)Cd3?vSd-9Wh}LWo5E zB^Wt2w#y_khKB2YGq?~re6(bK5sZ9+7` zCA9CC$A-{l-Uk*;MWz!FLvJC#TAdTPBA%e*pY+42bO{($z@)XJ$AGT+VFR=bpN)_Q zGZwM^X#q^^N3qlt@|LY|$9LMu29xbUy9aVj@(0E=@laKvHK@uC$F4R!+VW|5^?9XV z{PwtqckpG2hyACk`Y+b({|?nq{u`=^zty>Tum3EW{cp$6X70aKvoVc5+e!m@_5`kz zxTm)-2kwhryWz{d*S13OAJore>~`U@P7kEgnKZUjTGWE`4G9hDUvf6xuoYU z;hHf~IZEZ~n7~0E{Kx?ZnB+-?vI|3TmFzFf(C~ob3nWD{H*ppmq6BEp?6_KUmpKE& z1it`^=L79-T_AjP@-+!S21kMjYF&k1mJBJ|l}}D5DMHLF|Eb>*gsOeUf#LNUh4X9_ z1IHPq5FR+nC@EELKxp;ujM6<;LPTlWsZJX#l9M1CYOsA}8kWr+jSSdg<-bdT6*zDP@YQXc}3@`^IBv z)Isl1I3UB02l>E{4wdWxZW<-kOK|ee1IKj$9Tg2nY&~w>&X3N1$|JLo>yMp*SLNvAmTwCm46~GC6mR^2LK@MuDC9v z%bQceN7H$_bTx7_TOA!f`S4oz)(-!iwjRRqBYS%%S1Xs6o10rYzF8%oKKM_R+FMoR zF^saK_@VEYM_&s|1C~*Nl5vC^%sDw#@62{T^s%EGqt1=$VR&@(lauzJot1~6yZeK? zoKdz?W`Y0Xa#L?-=^Of%{gphJWkvgD8&Hk=_8zb&xyBt z@$D%-u$^*}38QGV6;rFI^Kcty`e4FpYF?JtSz&0;rnN9-Iv?%QLp&_SGL(ohQ+0D^ zv3nZn;*~up{w5l$Lqd6L|0IL%JaeMfcw)t zIZ$fxo29;$m;A0SN?6g54TZTS7Y9`V0`Wc;yi)+IVMekJY&(;rlm$4bk3wI2rb7Ht zT?{8SV$CY0SD6>o_gDzunq=fA0P6@$u^N z?A*YG1LvaH+Sa=yIq4esboc0J=jrPFbl^HE|AF-!aOY-gM_+q5^^KC<~RhEpmv^oru3E0pZ6zhp`!Eq&7w=%RN{U?VgsAQ*IWEip{#+zW;_I~^wS(7Au2GS0SlR17IRSuC`IDY}TGIjqUYfB^zd5oYvE$wHC-HCS4#N z<>Af0iTYNa z-4^7_lREH}4*Rw1-${{K}7_Q=Ue z=$F`mfvdBd(>Dj!JAFwm6yK5iqo&U6C$)jtEuUU2er;V{?IbQZWE|1~KHN)MnAphs zqp8;S%dvKp&#b*D#U4#EDN+hKMkUo~p=DB4s_sD~=644gCFyj{Gk+t?B&*RP?bs2t zaW2LqQ$gfM97Qq@!!>sI-X{^;sgkxivtmlB8U^vsfqx#Z8}HObg+`Q-6bDVeo2>)2BMo++BusG>A43xUB> z@Z?1X9D9RT$6-Wuq=05S4L)en!$GNliS8z1T;B13L*@+mfvy81zSXMkq-FRTINQL?)I(6OCn zALov%xztB6zoZ4Q6*7T9_U;i^(S@K;2GqaSdumdV%hOBObpyZBr`xl8r%ulM`OfP3 z-C@ZtC+CWvKK1=G=PCXQZ+T+3Td%+OI;XYuJ+d=Z<+_uEBzw7)pI<9CH+mz~!FA(v z^U9_2Yhh|?Dfzeudk-7O3B$dK{v7-e&kYvwm5s;NVL9H`UCU3>zHE6{N@QSLyG z#S92HMSVDOzBLb1eF$OPb4Ujxn0}-{#;AJfBZj!N4r!SL?m<<$mVl(5EK@;RjCtR^;lMyT{(sbef1LY$P^B5MvLl+Bmpr%ZYB zQ8CbW^?@GZDuBhiva_E{L!7aTvm6u#Dd(4ltSHllZ8Qmrv^@2@d)dL_)@jh{NlCNg zyU5G^fL2pX^7EvY8J$%|y zpdf(^Odi_90I!DAz=fzL8FR0Z^9s z;kEufDOKlWe>R7`e%>gawRp9cF0Gfy1f){(x_5|kB!DCd!hpD`KlEB2({#=&c{tnC zde69q-rsuiBBw&&waK+2eSk(>HI9EyY`F zYin6uhlc@5_(jrlBPDS3B}}BbPTZ#Vn@8?R~gDp5b> zIMKq$wYvIGjBZlCO73b}3c;>$sVY%NVojm!Os&u_{vs;5FS7FVqJ%8R{l(2Z4Y2Y9 zg9*!n4sILg!S+`G8(7_6vwzOP`a8RXENoz(M5;~+*sRt63aY021SzELKJGYB()#OHc{{1LF@UP^^mp zx$=%xW)KCAdl=-HJBU9aThE?Fg^M*QGyoweOB?;_A@?D@*X%^o9ov&mpjMiuL5CkO z09#!6-AB68@^e_GT-FVGM!955&hVPh$gAwiAk@_fZPF45Xpg$(sM36;kfDg)OFaFZ zuxZF|18O%~G#Pgo?vQKfo6w|#>FB})NYfCTaDcz^DaPI7scSIsl_{vIm!VNDN`*)z zhN1ZVdm4(EuNk=jyoJ-5W$l(dHq?i2tB;908iKc>4-y8VmAxYNm;1J1Qk}uXTL5HH zC^}n>B1{U7q1G9GM_bg#_y3k8WPK8~MP9q|&bN*)(0S8IVg`r6icQ4K0}>T;e}pNc zPC5x=g4o>;s7h<}DhPdW*%9ze98~$tKjJWj!$45RO!bLte@69N0!uc$GB%zU04wQu z+S?M!p*&xu7MrfF_cqeX2-%t?Qc6P`LzSg>#0$r>MOMvAQg`p1qs{}!*OSYdd3?N{ zF;7+GY`GoK_<<+WrRD~=Xkkf0iG)>(B;Ql5e zb$+=|LGG%|nLBX@<}qGjq6{6PxX3~+u4_?{q`U9#C-#xcO1YB18fTJYzLY`;b{K^A z*0jPTX1H}`*aRK=ya;Ae5S$%%f<4U;e58SXMFXQnwn@LkC`{7IHEA^cle`!c(qM85 z=O`sYFoYQJn8uS=Fc`7NjZQu(Oo5~gw@scLV+2WK0tw;i0x~ft zu>+wsFiE0Lxl2<>#*l&r*P$Hq?YTrXp|Ql^5YVb+RJc1Mq-e$q_TMp}8CY-$1Mh8tnf^DC>(l_z_plyu4wmHT3E5a%*U zU&hmr?f3dabj35VQOO_r$lnEUudDdand6=K=f4q>z|1?eaOZrJh++~831^c|o$xba z;076B7pr(+$JUCR>cuqPG8B+I;!vrX$Kyj+C7i2O3 z%+B*FGhdDitcF#l*S7LZ==;~%t%;5G5oqzeLFSZYt44FE(#Dn=d}xhU=FG34Ccp%m`xY3<_O6NV6VX1~Yw(`j-h3W90E zM`g)0w)15i5?HSv@~I*J4#C%~5|ih2LNTi_DGfQPG|96nMpZx&%2jM@c9&y0(~>(D zWXcrze^pU)Pjy>f8sqbzIo8A+C>q|8==LkG+qhZd|uL@aZ~*%d)o z?9s1(0CqacQhNSVI|l!l7=M19;M)8D!T}fy#6Mvr=v1rJ{ud4aHo9Cuo6+(U4$y9a zf^rTtqDnH(!}D=bb%ozLaCPFbd6jEdyO!+W_SXIF)QeY(k7xT+J%$eW!wIpwZWOyt z(<1W2#dcN>q-K^r{td}160RC))39N$v~Xp=tPRoY{Pf}VdGo*|X>&+JpvGG{dG!d5 z#7@mzx{M7yH>%^P)g1w}?5QkFXq*#b3>gEH6s=NhxfpZ$!$8`SRaRuYX^cBWG^`+Q zm>$Gzy2w1OA(b7^M1zK`1oa2190YkZ)sWcYwnRRKCH9)ReNt>Rc=Nc>;vW4>Lc1cN zt3sh9ts63?OTdi&xfrd*=9k{K$@}C{J#oyOTQLzuEG31D(j6wNNVK@NVqzK$m1!<{ z@#r6YoJIZ4!~pqd8{Xllf&{U}HuVbyak@Wbo3Xvw#U8JtPO8eLJYBLfi6UY>{fKl- z(sA0pW~zbQmAPk{Y+=yF)vDh*V>T)_(UUSWptc&Q#t%TZ{;P!1@`5dVCv&a7XXjMm z<|dmidCXTasEwq znN5orGUY1nGJaHWquQH(mULUX@6^@G(J-}In@wxB5uMlti%Sf1vi<^NRjtQk#Pl- zDH$qy(_8Ww-^q8{1$FqPAfJ%N4%4Lx2!#!NF|UG!obtM>@;aQ9XaD?@`Z{vz(_rys zyVt;cRvpWA{Y4oIZgNRsL*V>x`3yYCE_l+vh~of%+(`8DdG60(##`yXbl7|W6~SNA z6aTr>`%l`~KVHHge{SU^ZInMISedmRi$%?RXxZjs{UMtI(vU<>5BPFSeMQOgR~vpGu+iUatXB&=P?oVShbMjwfB<%{H>25zg^&{<>jm*!~ z&eWs7ArvHm%SPI?Y?VVE?{(W-F#N5ZTaF*Uot@pwEpV2@j{M%wfBW`LMc*&&f4whU zGODZefPn~4u{$U`vMGwQ*4Pv&uR@ue1B2?#N{?yf{-^DAuKE691!-&E`kBA+yAD%| zmhhc+7VWVsnD?Kw0nnr`v7zOw?z6%*SO;UjBv*g#wS9#rpsKR6#Didx* zcmkQAR?;5UiS`B~Q3;F6?AU6zhAIN0lmAVeB=Txs99M=8EpH)EnuZioU@m%Bg?;BiiIw@#%j`$4x2;oPUttPaJ&_!_A9Ah;qFHI7(MDlkdrW3Do!mba%@0 zO8HmkDL*=A|DVpGA6+CII0kzApF~mq%ip*Dp{cF^=R@~-%Mq6Bw_P9$p;g$Ab8E-2*7`1(STe-cSaqS#gSvk>reqT5}lsn_^=D9F}Fo=EGdN?{g zINd6(b?syzy=OD|y1KH%zp_g$O+9*Xc)LG!>)QCd`{Ouf!cH5u6!vWA^-M@G107<} zdR>|0>+9WB^Lq2eyCSe?m*6eSCUsN4zMmjBC7SExJoQUKtvjuHBoaB7W(r7ys?nX5 zhQ6nKYUo7qJ#@JwkR`Wb3Q>!gp(54K*?;BTcfM3!2?@_|Y9 z%$oYvV|z89aL{2SA9N2}_umcU%eSX*rn!usz|H{?5hL<}^|aK#)dan*N&0eA7BRZb z(=Y+JJ)%ZYEu6b7>c^ZF8JO|!t0g^=ZM(p{wh;jTFTWFF#3Njm}o2& zH7euwy6F|Oo(_mu(kJ-Rrq@O&7KHdUU}}r~{j!Kv_3?a66Zz14%n)(PU9!utsXZLnxX zyg@0#W}}9pU-8b@*9_|qhrQsZ7p4S}!5W2VsB&&pp=JxNjyjH)z48@EDg!uW zqML_$>dI8yA{z%%sA#n6S8)eJ@y^~JAe_BBLRBLIt=K9b#?=HgD9P)_&y(!F=T@z} zCF)riF{B`cXjy}PGGNL96vV5_4EIUlYIiNIP6HZ6m!IK@WA>Ps`RhcVZ&hHAU0 zs4n)|f3qVwH%@0C_wXS`TW3Lp!>~PoA(WW_&IwXhHE5BjP986IlDe8Cq|14UoQ|@Y zT1I&D$Hi%q&0jnxtRe?^&*6rJN_33|9n8a(F?ezT*~rk;?`J(Ef$DAiwt4uBodc0I zu@+?6ijZkFblR>Pv%oZeI^~+hSvZO?6&bn=AfqE@`HMLvGml>oUP*8G&79GV#rhyTm+@)l8lCK)=MC9`F|AM(C7yYi7K!c$By+U2+3-z*~GsL>XyH z17pn?BZIhLXop4_Rz6(6S8^em;~5W587GxSC_VBC>sQ>^KLxvjVR6=%KsL5Xe>XhK zl-Tw|fxHEpUHwx6to6(Kz8y44w`I^w;dC~cg{yDK0hLg+yo-n$9c(WLk^F3HP zTW}a&N$)pTZ&L@QtXT^0yFovkZ_(PiW@VP>vi5nF+GQzAsfHSDV{Q9N zdsWJt_6n6_faz3Yb&mCwRV5tewc5lzkrfqaM8t7;h5a8(jo&uabndM6^?Xn&h7){J zIgzn5o?)G9ifZ>=FBwI&-cy>fuxjgB1{iG8PHfs!@R6rYMXaRRBc(Me%q~tZEX%kl ztwvR5a#jvuw$uDHe0a8ek;`^7Jnrki&Wo(hVyYXUy3jIBQ2$a^a(w)RCXojbvWBIh ztH%ZHgU+#Nmr7f5@p2Y7hZ0r7t_*i{?1t+?H+STg1LN6Q+1O+GVCL8q#O>)^gx~z> zoHWCR>nnrhzTq&>McY=(%B(?iaYOggypEfj#N~ohSeX~ngIkf*X1r3R{rJ<^2lcQk zS;AJGBu5rwwTvv1iJfGH6m~r9T;I1Zv_h%Sd{bd8 zu0G{21pd{5*r9`6EaIy+#HGAIURW_&2-cg++WbdtfL0>ByM%jW+_ z)j4)&7Hz>gwmP|d}x?KRh|s;7uP9xLy| zHq{vf#9q$T-5CA_n&K+~4Dy8ubT1Pb;da0jg3lg6J&AKEOg!Yt?p92caD6Mb`jnu_ zIQ|(>_}dqj9-{bajma}ZSpf@;kH}A=3DLz?{ch&He>p=Fm{$K_)xTYYUZaV^T?%q* zseK2I$}4@%$YEv$S-}zLzl+YpSHt-!hAuyh$WO5jr4}^t$tw$k;;reCP(lm@wiX0} z(M=72KQN5Zjcz}z0H&?OL?%x_K*|Z~2i1rl8m51tL6zpZ!7!=-E$N41cIf8a=^%p< zV_vpelW&y3o{EPcQGKC>COAQM!eEc~CJyRPqq~fN7-sY{q;(Q_jL&i=JsvYy5Xvvr z8&jlO>kGcifFz?0LKehHZ*eJs5XI(LBs7}SQy9BxXXVE6DBH-#Hs?LDfab;q8|f1L z9kd>35s?T@GpiLuk3;5(fKN+u2&qlXeLy$CIV=rj=^%6lVfBPm9xYZ)G5QG7fMBHu z!8X_;&LgqwOqMr93~RxR>AUnFL+8Ool9V)=6-vc0^0JXiY929;s`;OaLF(nCRg_r6 zDr>4j0G(oSim6!$3XO&vP9=J6-pBed{4IVI15m^~)lrK?6SV zVj@Mq6}~8}Yhx;MyvqSRs#F7VO#tgb8O8r{vRVS@KdChs1b_e zF>HHKyQy}q0!xF+!faWQ@>CZCuQddy)(@n1s@&# zJ?;mBpRygIzijz~Aem_p2SSXUZ9a5!v$;Wdx%L6#fZwtA zuA18n^Nwg5gQF+q^W5ei#UFk z3Rv%FFui4&M{I}Wdu)g6`$xFpYUaN8c&PTpqt^6vYkRoH4yLjsb8)K>GajE48J?c6 zzp0gvgw^vCNN4jM{fa1-Mey*p)MHaVkfg}*N8acD17z21HIgNAGv+0RHGM{LSA(fR zrmYFDu-AvtUn8I>-zeU&8s5U*6A?fv(PM4?>pq*QUwjY)QPID27uXP#kDaRG>UsgG z`3tCpf&j#|EjLmY?mg;gT{G;ed6V5wqDbP=cOqWAcnG|7h&)D2zEGmmvJm#`7Tm)t zYw&{nLZNfAFX(}>41sR&Gdz)g(c>oikt7v;IB;jXPmW6 zby@Y!96wQok_HdN1A{7lO7}^t_?psrC5T zK#Cu;1}Q}WNyLxACk8#XbebAUdo+W&+1X!mAck!;6Vr(mF``* zp=pXl+Q{lAZE($7YCIl*i|TYGf$J!euOz27Kw@UA7LDB*xqy(i`uz;$^AtsAU&POY zW3G+P@R~Nx6*XA26><$`Xegc(t{vlk!SJ$Cmzvg!&7|X%8Ph(*I*So_asr4F3lK*z z-lWgnz1=|N)O3K$uE7tn_dKfu=b?0!PPNAdbFiP_N{XjxXVC7R;&6_R-bZyL87<6d zxdqP+u8y8w-Q)|s{Mx>({f0b8n`Y}m`)`+dw8o|rUOT+^ihkBY&x`^oRNPL=Wf|MtI|q|#6SUzTrx`5dXoxwWA2ZSB=i$Bn-+zAvKF%jgmCh~? zpL+#9_HREgOKbIeKfK+3h+IiIR&STN&u$6MJ%jJ9srI?wZx569y}iBD7>h-zBLb}i zf4BYIpATpC1$4ijUUzptFXgQ^T(RHk2McHSB0s ztVbpTRo%4NlGRpo&M042i}h+Ylxw|d_75U3is%!DQmG@!Y+aM%yINljEu}Ip>=Cm_ zq@@e>qep+RjcWDQJCgb@U_-DW)L99DOO(hK(GM8ynF)jn+1_ zoNe>j^B~DPk2Sv4;~hvXJ5@O*in3SP}q#)4+A!^_R z&iACw?mPTXwK(=p)^t^Gtp=s?>Yn#A)VTd!ZcJ*1e!SI3RJtIcWR>7d=f(7JBD$c{ zs-6uHs}7>TLOU2yn?TMZf~+2WSNs1a)xxnPq}bg{RfYa=oeDWsugx0Pz(81q6`*J#JXSok&7K+~AYwcXChL6lZqH-$bN zeb$LF;c7{In2pDZQKA3W05}mji5EN@dOExM3(BLuR-2>x;WOFs( z5_qjZ`ClVSR@F#47X`i${wbS}Z+iBbUhRNbEeYItn5y+OQ}i?x3PK*DN;Zrle3GnC z+yjJA!XVts2%Ai6frS9&(eBLT5v#@`#uDlPBg#n~b7auK#q1e^0UzEPk`8DMLKT3J ztbbN;!v2N9tuS40N5!r?9J+AE{Nh3G)e~4@CLv-Yh0bi$1ulj=!sib_#Y)iVVZdLd z0!7Ul5mtqL#2VYp%&g2~#3f*4iGp6JYGhTcheQcD@iSB`X}Q*T;7VA7`K4;og*R(PBCm5qZHy^0zyJe&4dTDG(X%oj_8`^Ksr6@QLI&U2il97VoN87h5d)t z9Y)MSe2v4rmEEyB)(wG*d_FndJjGqjI5Or!sW=3I)tQy$)oif8Is--xGha;!MfFf` zCe)r!WE$b&%1-x0HWt|e$qS`Gm>y{x9*eUp0#Nq^7&<{&i5MzrV865(9tG8BX^bLu zv!{|lKRI#n==|n#9fiB3f#4f7B)_OzhWH~&1B`lt)e|O!JBbgRqfkVJSd%#o<7x&= zgJK#^p2~6|AFKfa9-STH*{4sc%l7T+vRq{9MJ%}A(c%M5T-L|L`L9Gi3H8mqsL*t=x>`>XsMuVa1JbsK0W%5By-1_ zD9LS!FB61Yzo?{=WN=uDgt;tD0Jq{AoCCYA8@l-f&>gC-vFjOxiSrJQVBxA%@)jO} zmJHxMLQhpzpQl!OC&i+8Hd}D7Y2U9Aj~kt-#i$j=rrqO`L`}$f3=W9`=b4yU9a1XC zh|thzsr@M@b%ru7PHwkR&aZ76Bd&T72+kLK+o5(Ey8DL0xbYvtUSL1j3^((a3T#A{ zW^1g+h;c)$Stz@Uhbka)rDLT5iK8hdQ9hIcGV2Pt!yY6sM=3Le+f_Z`oY{j@mNs{R zrAK0#58lcDmmAl885CA$k_F&=A{MMGgW1zQ6$I@t>cPyvMKO&dJNqOFsc0cec;#&B0QEnQtfe zt{wsW8v>a`u+-^Jg5AHAF7*v9R-<4nbGPNL(IUoh&YWR|mrUD@C6LAyjyZi&f=P}# z?V*f2p2AdsV{aD!S>|E$`)Qu4h!QbSh6+8x3x6ViV>`hUF2-PwJq|Y8L~s!x&^>X3 zXqqmZ-BqhnMwyolh!9}OjY_T57_?q6T>hFRsEj=h2t@XmgrtD=ys-j%oqxaSrLyWq z3bmI9gg>FE?S4sM{b8xL|9e}m5Z7*PgB?o}n?Xi;*d1p4OaDy%khM0V#3f6ys-p}6WL51$)d@O%8y6HtWoZ0EZ8@&6H3qlA*N<~ zBhH-0w6E_$%lf4cIeR}uZJ6*Otw?yKJ}Xj(p!1s*^!(YL`bfI3E<6!imlt^H-|*K)giLO8Im|IrEmCVCkm*IuMRHVvMgD5PTT_^JZp&w(ef7oB z;zfCbyAX!48!8sp2=EaRCXR|}c!`+^B~NPVG|ZfW??}XL zkr7!eNoH9~4M~1Yb;Nu|mC&_x-CMymQ4vS^ZAzaI(J3Nsp1hn9O_=p^hb;;5&z|oc zd;r5AJc_Bni21)8)h%3!|6~mbz?B?=}-zPj2RKsskHTa zq8>zH9K!{eo>T6&xiu~{@#B>xEo%nJg^62S6WH2z@)>2>r>P_bwX zPJ})UOmBGlHW-g0XWf0)72oX*S1e0rDtBXt92Sd`#gK9X2O2L5NVO$r;udKlii0RQ zOm))OhHe{ZXI+RAlc6bne4bp}Q<^G?RGu|x6L#a)DL3f;O8UoAQ{7>CKO#xBWU;)nF)$~(ur$%R3zQ@;bl6@XbN;i2O{OBb;R1ebKEzE z{Vy0Wb-C?|!CqSJ{A7^o21(;AK@E-<3{#LUeFZdi_xYz6)q;sKy_xe}92HGUNQD7S ztjsWk8fw^gG4^h%xv>;5H9Ap>k4;FWUBO4pJ*X_8=H{~&uo{Ec6%7_M1yfZ-C{Sni zNElBw>8d**+@Y8hjnflM*mgYqmMe8;Ax)>g7+3^A+YS*>RqCj(9cFL95S0J?38#}X zSfI0I!U?s-`bwh)z5`%T3R>e~t1Mate6V1KUIkBL8T1Cn8|lrQPDz@X{;SuCBKOdYlZefeyuB_!Jf{EF4EI2S;)XPQn9eaI{!#31zw6Ly&!3C<8O8 zgAAsmw_$q=3{?gSt~s02nvZgCay~0`P+jXLsmi9IQw0S?=SA$!KI$R- z)U`2ZnCfF25j?_MX@i<9H_+L`G||1j?3{3la+$c}hv^*ptS&XwIP=i=!gRB0Fe7S; z0U0-C*aJemWZ1TsT?Cm=Hc$znMii8-K|*>LcdE93{n`0w*pJ6qyu8WdcD8kkCj#C| z2J%$$oG5{?b>Q*;6rjA{PVa8_Bd{Zk`BY~3h~;kHX6MMhIPjN!VcQ6P6oOQNLu1JSS3tw<&xqmnjgX(qlc+buDN4T zrR*j=Q&r5v1}Qll3yVgWxnjViscSB4N&s8?L}GJRdcgHVROQKAR6#-lrasZI>H}npBtn?x?OIhHBc3AChjR(| z?cOEARJT-~rYn70;K;Q&yb1mJ8n6_x96b3B4)rT{E;)!wQWLiwEc+ah^gsHZDXYY9 z1fn-XzgBTfo-42BoBHdk7om{JX?6J5`KQj#hmq1NR+^w@0A5a|T0T~G^1%Sa>vp`0 zCK(s4aCLMJ-7C#Bc~TUhJj^p>dop~G zXa!;G*A%>qiT+AbX0PL@{I~*0C+=Diu@7uM5`<|hMPd%e4 z0e1BJxl6+*)fH2;j+bf_AhcR`m>O#T|o_N@lq|cFxo*nI(vVI2UlTGOiiq#)< zC30Wg+s;dfqE)(<4T_1}*}LJzY7*NL44b3Y+;C&mA~DH^`so&=5NAzUvxxTCs-v67 zF2~EETN0uu;Q4E7gsyC2MJc+JNNx!pP9~lpD(ZX1>{%X-;a++^%2AV<6cO$lp7iS z9BEEW50+TO4BiuIP^r}?Mq^~z$9i!Q{~JTEa3JOJTUW(VtDArQ5@O5-ly~j~$KVX2 z#>pA$ka{&+GK1&QSX?o9b=rI(62O+3Q9 zqs^u0f2f+d^!XKqM1VcL7qC!TD0$tV+IJFpK9)cJk^T)&!}Ns+&_LFN2znwce<%eR zPM09s%GFCccO4C`B;`aQ>o;tjm*h-hu1% zwdSZXP)&g`bIOFwfB;b&povKrU_<@t-|;~QliD21jN%0`*Z{jkf;QODfKRreo;VEo z!3Pe$Z+HCGH*yYf0%Lbab3*nCq^=}=s!n6LTrZMte$4YnffRvxlXZ#n;*n$0Gyz&& zUyZ?d_90JB3Uj%%h;9-lIR;H=79y>REDn9_e!~c-(QZI~qY4g8?EAyWMzy%<2I zvi5CtalL+DM&}wL8i0xbNk_~38{~*2CdMYD*M=pek=1%A0xCVf0z~~;^t;)y*Gl)K ziN7zI5{Q(vMcT`3zEQR8GJ+kWqRz_tNRXP&ui)3bo5ogd+zkYgIjwX`WQq7;60L6@ zl;uT^%`>yoPDt6po)7k4iUduFbjdu?1RaNF#;lO~_;L2czwG9jiZ;{L8dizRfJ$+) z(j6M=bPE%M{RMGG9!IL=L7mO9vc{+xoMgwc{&Z}5+cPVfu0E84X1ONGlM1FwCU`7% zbLJx2(nv@b!$c;iabxDPDfVo6g8?LeDd$rr9Dm-E10=%i5?OX0BIsku5sG19AdVhG zrx-MT$|tEokW%{X^vOAO=4~#>_>f^cN#bnF1;xZDJ6SV=?N^-xI~0-Lrd2~xUGBu< z;q+~CS|&}kDYZGRDnkxm$GO1~W7c%o05HeQGE=OQ$QNZ7ZN=X-x6Bs5Rmjr&!nds| zYia32F8*l|H>F|9Ew(193*8yeWr?p<&K>wLs|#FP{Vzzz#M*1F zC7Zp=VT)Zk&V-bru|bg;M8w>h)XabMh^wu+*Z=-B4c;9Sv|ba?BVP0Sc71>C?cLro z@oROxJNV>N6~kr;(B|6x<^THqe0)emM>g7}@`b1O<#6fu-0SPz`r+&B<>m2G^YwC8 zYRpGlce6nn!xXr;-l|H94sEIWC&R1Hn%-j>b#hF|S!TEewfND1iAHWDpU)zeM4dLe zsGqiED^<2obudE>p6tw`QVfSLDos51&aA%Q73TgQuBoI&-E!&0yXilM^VU!9!(l{L z+_L)gJk-$;-6?k8P&icwb2%0EZZHj=6;rNT)2weuVGh@!BEp6TCgQ<2M#-#uY9`VmE`*d`ax{(j#Ws z;BByNWF77drYYz?gPpC-KL1!_MFX@9tqXLRMSMVHRUEJlpbR=?!f6WcmSh4DAcEJk zis!rw7oeZA8mccWL{*>jjPX{s)Vn~FES+9`1 zCQ2*a$9gIPl3QNuG58OTL6BQ3|<3fFNsafHl6@4pXSMCg^wsKZ4?d=;wH#mOV z7E@Ut0J|AgVev+QxbdRD;d5D=4n=-3d;Z#~E=i#1Nhf+L&Z~07>YYN14pG!xoVsB; z*MZqSNF#NW`iY?$qExXLoMKQhn5?&sbAEMu8JuaEn@ET`5m(W zP%aoS%XJ~@*#J~_9;iDUNud}7C8lfpKkW|u=XxjIj&q_|3d+>oU*@7YbJR*M~jnQhR2ieHn<(XYp zuJ7fh!#$N)sM!UTfpa42d@Abte8)nd0jTVf!5PX5pq^vv3kA>SoP9g8sHnE#k;p^s zZoJoIson0{2G~pNk}{>KxvDg!-=d|MWBI{Ie{}zR?SAfFAQQ>oZW`=UA6Np6;ih#vWy2#zCnfi{?_9RuPK&+l z{sgxO<#;mTH^mo;Bz681jB+p@2ULwLt3pag#1i}piIF|sU2DiR0;g zZMO!H1k))E*lA}p_N7z!Mcyl4%QHD%XZw9}RNG!urJeg!T;~rY2coMH=%k5QZ=16I zF4afI>R8bl?CI%pzcpKpxJCNBm>Np;gTC^6O<|GZ*Dzf4x6hKd#K(Y~FOQXjR(Qln zQ8Rtcs5~=%m3l(y^EB{0LMj_-yPiqqFkcy1-(;!p>abdHB?VFjHSw>lwp&ISca;Ma za%2w&&(94<6F+(XDU<+TZo_Sp#SPxmO#tQlVD8}PGDFs?aj-5qCz@ctda zA~EyUw|#kh-uX;%?5F1KhL1S;xjp?J`+^GT58-J|e!nujln;@OrH{idu>92BYaX9_ z&hQQL7=qPufcW1xYe@2>oiPVo=&A?o{*;;oIu)P*!V#TqLs#7=aF10s$}@wIX=IV# z$4|)>*DZn^O73^Q`|GPzyU*ua-Nt82I{uR%p8)b{)7z8j_wl)zCogV}K<(;(%IclH zJv}s>0haLZmX9uOejmH1n`VGYVnwxO-_p*_u+Gh6eZ<(xe{S!eW^YZl0xe1x(p_Pj=d(foEU?Z1#u zFD<{+d{oN?iO?)#J5GILdY|!nbr>#cYsxEtF-34hajPI0iI&+^n}KZb5qc)E-IR*? z#bB*13Q=pODZ8HsyPprcA9toe^GUXR>aF zX9D$$Q#m@e;xEW`OBu<+A@MRWCaEJ-ZEMEm4O=m+5=|C0N;H~-5n5O@4K?~Q3bw`~ zErWHX{x(&un_>iTK zdFO&F8@#eO*7gr4v|7~aZ)xfjWd*Sxdm`<53**`fqZ`QooxWiWyM>`!{z)do^apw^z zx~`y?z(-*;E7eGSS&d0pl9Wa@miZ6_$iIFPA^4N^F0)-aFIj2P9^V zJ^mBVV-_0IdyYBgN^!z^c{Jy$B4*PkzkB*MMXzYc>x`kya zaTEIXzB~E7znl%Op8ITAM!T4QtoL?xyg%LFydS%Dwmz5s2uB!ruj2aGZfggvza%X4 zQ`WR|N>LkA;%>CTW0zoZs#)a@uI|5x*)1ea9;(ZjUaQw0uBe^}_F1me!*ki=N9Tqa*cPA8aUX7U8Gg=4vt|g{ zp8yoZE!4>$n!y{89*sC!;>N1PmT6IVl>qhqX>h`78T#rL=<4GB(1D7BclJ{f9?n&U z9vi9L?Cz+dQScBv^QLl14v8};I41=;;SEutN>i!(9jp=&WS+y!Brg|9OzVN0PXqfqeAbUnXcI_P%BeI9oQTXnWfHRhS(Ge-FzZM^T34C z=x3I3#msEj7&LZ5M(0DE)eWSOkPYy#0?1PpiTRW(acH2RJ+L_&A^=4tg>{e?DGxML zng&f{lLCm`F3z=b^JjLM?Y#lzGI>$OwgU_7TZq=0gSdi3`6UDGDyjGnZ6sw&M=CAA zvO+a+Pt=jH8M7UnHX%$tANRk#x_dvJ-oFMjIo`LuJN#b0HmUQ7E*~rRi3u4m%8ts# zq?Y6$^v8hGP<8)sP@%)DsjlM@1puE`SmQnrc??UN(vYr&v}gz(3qqKL@F;k%w4Z*ib_ zP75s!b50j7oxe(i502ePsV=!!D=u?`;hfnnH(@y%;SEpa!t#-7uMu2{Yj_m)o3LO; z&3`C#O@nL0Q?V-pk=D{g{0DP+@wv9d@nyeT1j2tud!ZS0nt|j&@Squ#t3Hn7_^G6Mz?({S%wMC|rCn7WCLc#keVWJcxp!hzRT4{*!@q7m1m(24mBFE7D3&)em?beUNkVL|k zZm4%+yid&5Y<$!n_!N*t_+bB1W(kjB;aB#}&hP=u2mJ83f!oT9h+CG5^W{fHXa6kA;a^2VXLSkEM+*f^bqVQU47QLvd&cj zP69Io)qJe@H|6k(%z&64M#~e!XwG4#I)|$(T{vdgQdA+i&=B-nX%|r2i>>KRQsr4I z0g2RJYN(DzWET1?o{z`+v<7(j&3+$H6zR{*ErB~f35`4p&x;6Ro+bii&M4sUf@iWJ zO#cnpU_-cx-tb9b!Xp9^IjuGZ8|(mazlCQUspG)B)2B41`w3&XEx$4lX>yCYR2zZ> zd&ubUYZtAeK?wVuXxB(W|0!~4Cmxn%^R{G2+xYkAoxzQ^x_WO$RN>8@zew%87N|m> z?Rg*gihd5^XVV4RF_T>r%?tcfT|a)y8pqrqglC&SKcC?~!f!>Avu-WTYB8^gE^+<(tP&FY%+BoauzNBU9Z41bmuuL>(-p-AXV==AO;crr|F zr6IIO2I_kG^<82a48{S_S}m0)9kci|1i2;CADeC2^m=M6=Q5kT{}}M`M=xy}H9xtq zZCkawA3fW1VzQXbz`j~MGXB{zq|WZIu*zg)5DHulzdr1FyL6_r{X32vZu^{0o8+yx z1%32$Udl>r(1UF8F$V&f!7Xp(exal&ojLW#DYXsvIc|$CfBbstFemnkToS@f$gnO<>su)0o;r%VP!})E1<0 zg^W<4dg3dwl*x?Map#itG($aEWfstTG@7^o4hzEq8}ped@?2prrWPKEUwRG5K`JA! zMRU0kwYG7gk;SRhz;X88Y4M%A8mI);-Eis;WNOt=iv{|-_}~oi)~X8^L4+|mS!j6t zI{h6i!V0MU5l`{1qp$XM+Leq;lsFxO*vKe>`52_(26u_9K6l;yY_AEz4>55C6|}b{ z7Vapcl^1a+EJk7gZ3tj+mx?lX?5Ld-0A%S@NJ8gCynTc>6LZE&TuNl>>7AkZj31f2 z?GRarVXR0R@U{zxwM9&E6sh-JJ__`bV<$CGL^#YgPNG zFJa`F3-fapFX54{ohg9JF*QkN9Q;VR*a?Lz|QS+EPZw z8!I#m$_suH!-mcfADr!tk>py^m=Yyd?O;DC597NusgA2Ccz}q^3zh=U?_h?W2-2;f zZU21cd?LIA409)DE5#!Lhs@21M4LNF8v<^b2v7if4ZDPdPTeNjxUuNp&J^PkUvi|2&Pz4R<*Qm?#%`RY|hm_Zub`~?r!9!g( zB%94>XbKmf^!PoXj2e|V=DZ@`Zq2N{U2%iGWAPROwX<^ZUs0EW+)4Av($i=0o+*As0c(Pb<5LRnuKeKKQi8;w)LVgb zKR0MOjj!ePJG(Sm+GrIC>4O!w&k_%MPz+jcWCUv5%*V^Y{pZ6s-yeRM-OBy(zxi_V zjS`$4s*@`33n#lS?=G^hLZ5DrmV5h5&C_R~Tr;=(Q=9uU53285iJ@Tun2Q)S&;R*B zMJN4Vo@nU*!woF%2_>;h8ziV1m z?|kF+<@(FsOdbJPaTXSY47Xc^C#9(f4%t`xwSpUUxdfi*cn3^2bc$X##CKMvV?N%EK$s_6q#5_gp~3AP6TK541u*0nFA%j`=tj4caw9Moly< zr-7INT65aVvx!V{uO`Ixh{JQUGCRYTN|69epGRbMM9mO+epUraJZDsCoNeO1xGF^q zr;0DfZ&v&(^wS}C=^k70P9PIgBkPHm7F%f`#ZBIH=(9tCu}O=heqZ?<^@9dtc^1yv zzE_5wE|A-%>1b+s=*fN(AE=ld2nh2Zw@%ja!&ad3C=csBRT)9?H7 zeD%><&+mKxvwIlxy8g@I`Eb9pw$|_a$sycLZ^cRd)%oS{`1v?j{`=))_e!5YzBFu5 z|8JM){dw)J10;!GrQ;L-@uQybt_b2dSu{m3I{~n}1hQZbPffn_G*ki;v^pxT|^%Li@s{1|ZCYW&{OCzkMnO=!(;aH}68OuO-P%DE z-N4q?=caz&Noq9WkV?hU(IrMx&TbnbtUGIS+VzIfUKA15rPlE4!9j4=KjB|iNs=7c z=h!ZSzxWv9;o3<>Mdu+2ZmrBO!QBvU3_grjBhS*lS@_QS7YH-wtYPPmPr)1{@<=FE z`Jze#LJn9jEqg(~Y^7xDmj+!0krXegKt#;a0@-KI16QV_Q`>LB?4pALsKlOvE(C}* zNA3rqxvxYu{%+6Q?_P#FuvD=iz)>QE<3`h~+-6Ux$C-;UPC*%&t8lBaV%yt>xA~YE zDU#Q4Rc^IBmqd9gh(ABeyVFtc)*sNd1r8QEty(n7(SjRV`t{~JtmnsZg-7Y(;}`@1 zb@t{`Qb2^?iJ1-{#cD#+UNv-XTbV0f>Qwik>EElF3aPgA`gJa!s)^;G&ImD*FX8Hw z8C1_v3q>$mw&F%UooZN`2i^R|VXO6KqaLVV#|Y(5+1HQ=5+*7Z{53{HRu7q= zk>485NQuMSpCIl++@=QX!bFd$MyPyHF!>Nal`N%Gw%rFAfj}G+^fxX;B@rxGchZ zK$-SJ#qQcy^q3J!Asi4Qe%qDaaR~Zro##PD;Hf4xf}BK|THCFIzbrgFBmWA?6F6As zI1hRsZHCKZPy-jQdAN{Nr&6(1Jg5Kj6v~q#3&lyWp*EZit{utI_(=>BUV3jQKe`_L zlgIf))+Ebpn}SQS#U%)0YHqWBN*D;5l(7v;#CQs2;C=z6 zqm`KDXD8jMqYT(meEm$rlZ8wS5LBA#2e=!(Gbw3g5k;}42EOei4nRzNK1K= zXiyLRpn7>N=&Op6p%cY9Mb&Hqehs0a!_85>+Eg;y{sjKR{lvZ-4TEC-x=f2R9lXT=_3TuX&C##ckFkc_?1x?miI6h87AK~4-6d$ty3oem@zju zyovp!89BCB0t#6fI#dWxxzXsQV5^iE)^K2C44iZy<*F!Lq?8c$_yCuSDyD26Cy}Q! zU@^L5D`hw@39yyevs;#)sL+_^?Nu$akUZT)F2aaGjh+kLr4sdb4?!qFZy{3-tYSSK z`o>XTfhE)^NZHVmBjS-R5Zal)rMcjtr>P}ce4;;P_8jlaKy&~gP`~C91>>QGB4wKt zYw~3Wdg>qOoi7C?wW(CS5QY>JnJ z)Lc>n?d*q^s?xbgpib>Xblp?ZLtp|wlKL^UOZIN?hpQ0kq>7ycCQG>C(9wA6OuV5B z8QuxDTZg(MxS9K#EBhtYmNU!ZD=&2JE+$Fm_@HsJ($o*JH-4*H+6s>B2oAr`FG;(y zaks~rQV$ma^T>7y6JbkQ`^_-(1b76f+$+Gk5G^~9E#p5Gb?h%W94?{fIG-gerQ#LS zdjWJ^vpOy~UDlng(ib`%seN63d*hT|ZTrS6+s{IxSMmngs7PW|Gmp^4D|I(oyD=G{ zIoBJUBuw*833r&-49tu2+LobaP&I>bI!T8g)MV^s{Gb&r4*rg(EX4no`JIX0lfHKn2t0EX!Q$D6F+KHlv^%5GM{FMQk7>77N4iF54|ZJSMnCMJ7iuht=n@KSk*6jaF$-sX7W3(q!~-M z!L@E4XRsLOys?$yk@3oA?{_!TMIw)j5liJG-!}|NCTHy4FD;2>yt$Wr7hu-ojBnWh z?wO0z<-F7sicyuG(RHzVCHJ4VfmUx!>s-=Bv&}a9-rLtd68-NOiUb$T-hZ_`k=RM) zCM=+uEheN-xPmLAomEW=MF+oSiXOK`t%Rd4t^;v6L~^Shg#<_3@D--9?$NK>O~3`iE$D-Bb*x>iZbVQO^7-Lk`1k6BD%pkv55I z{6bYR-uHkEtx_tB&LEo`-j|5xGtieq^8fs{HM`*g6b9h`9aK^KI%HD1xLIa`cR@>A zfGY+I4G;;Q=nAsd_?0!Z%mtesy4R?AEx;;muYEup?K8`uKjWF0pzUH^o-F}E0Smbr zU=>n#j3qUjDtq_O zGSm+`jmA!=jr;TA@RQ*iR59!1Ko;}A7bnT;KNBPeocB{Nr;dJegJ}F46= zkP++u*SFW&db=1mIgP1BqLyn`*VU@TVS@y>!{__9FE^{1U)%S$a4#AYzAxvohq+>OfemmpWD6O4sPFHcax(Z z+qbuWM>D_RT5D~0e|v6lqCd5ju2{f0j@Cq>+J$L2j?7=B3zHa+)2v`Xej>YQFuiUG ztg5P~O@?x4qRn-J9!kKl^@*}#zs&r6EIvw~CH2k?H#Mz6?8K+4yO&X$Q{%j_3&M~Q zyU>f}Xe3+XoT}PoHTLv!EA91EA<)dUcYFq2d#_t7uMxfK@qy-#50#A=(mj)yx0-~l zI5ngT^2I8%XC1R);G~0!$c=)dglKQKUY{P<(D*t3d^HXGZs_B+tl`~j$oUBFS+X9| zzA!zfvo#p@;(k#7V}YdCw&yezHe&7XQ8##91bsV4d?VXyCDY#GhT@Vweh2vkuzp z#fCzaJ1Bd=XM7@9I|_UMjhuPgxT?gUCKdt&QrRCyx3WGG2fb+CITe)66KK-#vO_1= z5gA2uHu;-*L!x}oToVx7-r|+2+#pDU%)_cw2}UB=O1Lp4)CyM_j%s2MX?1YJfRL42 zu<>+5Z>~Y(rbd?C{LcJ3NFPFP#Zle+IG-JpbJYTBb#{_yNBSR+Nt&R>Q8c_ghP&o{ zzc}OZ3H&>ZP|!n>>;_bWz}hCe9b}IMhl{4HPMYQ-K5>ODciTM>B5^b}?wl1-@q}r_ z*qtTNkgyX(E;}Lfk%{vuyk6N>>=38D0RZf1K}~((yrb2i$wmsWbdEoZT(a5o4tEGD zcgW@w#4Yix{X&D`#T%b{4<^h?2zUQ@qfTvB=1dmRO+;RDy(1GlTkB=WoHQo{kB12S zdVO4uNLA*sCTU{oxFw*hI<*xGNNvgW`?Y4YRkOM)GFW-4f|hskKjdNwMZ`aE79{1l zi}gxdn4hQvBG+VslgYOvV5}@2_*)XE2x3BTf|vqWV@fkMaN^n`Vjy+!CgA{=s4C#n z#er)z<#Y08$wn#GZY)Y^kS-7)nC^o)fJq1kA*StPJ_PpgCA_+|HpKz}lmXVuQY9*; zQu37`LxvH>&=&@a4ZQo01UdF9etXPP9&RGcngURPu5pX{@*=SNq^>TmCYP*6l;}l7 zn4%&-21Ow}}E?~1{BW9 zh=*fsss?hHAa%Oab2bTVK%N!uAQN?lGl5WiV zNM|329Dr=MWWaUq9&V+*ri9#3P;)#FJuuCPc%acwz0L1S+cSQ8ar|aftg490r^G+w z+R%%@_5gC34Ki$Hh@vRas6Z_0T^#($_||0vw`6PLOUWdG6?>poMdCKZO0>`obD_VQ#Pm?4ZbK}sie+t7YYb>uv#@@4Y&pO9TG z2w!TsyM+FVSm-kF*ZNfW0-$5lp?xRd^R>xLe^O_4J zW?3I+iSZn(u`6IBjNrNqH?>bt9jl?RbSqp$7xC3leC_>5mLQTzr&T8ei-ZiJD!z#o zI1N70Fj(v$*V%R9iCkbW~u+Y zKXl2)6&mH6xFR>`I_W4Rnxv~*oX4Iv8&ny;C;Imjbu19mV#>okQNh=Ufprp4plL{D zu*&Kj*GExo8^`_Oj&)~PE9nsCnF%_+6|LX*%f$!?s%Yv0V0-+M*6DA8Nq-JGwmiBx z^5E<#U^E9ccw$%}hd9ov6v4t^LU|#vfjDrtbz<*-C(&m> zM)$mv^)xCj0@G4H?WARe>FfSsa%l(p17R8|48cC=g%oL_$zbm5XtHo_bUz?tbserE z@c*wK#;EDUVvoZ7Ix6*TUC;km){XtpQvfVTcqrt)K}JY5Fp2`oVYRrm{ z^!4p(%v!>X(V|3dV&(Mk;Bvp8FTU?TZ)fpDuD|a-ezSbuo-RN4lc}?O+}zxJe5a=w zejlrcK`Dy3bwA&CPm8;`yPwY=l^>4wldk5UTR;B}504+;Qt9yEdVM)_^|pVGuP<9~ zcalGVvOb%Wxig4)ByJkX%GWE1$N!q8G_Qy>G^J2}t9;4R#0J=;Xx)x-KEg{eebgCu zVL*U-mqe}qZ1HWq`|j#(T50)s&2}HaOfP(ZU9N|cVt7@8I>q=N;R6czx1&qCj&#bbi#;q^*-0-#lesz1~Ta6Qzl{zPabN@b@oW z7b%U#sWh9Y?d`zZ;N+SbKPSLf!>I4NLGJTf?!7fKKfQk)o&(uoVE3IU+Z9_Qo#1W* z;2=tA;~uju)Mup{t{=gJk%%wE(O2Ln%4>H>W+s|J7?p+ETCaf5dVbH9f*81|ufW&H z$n|!vz&66qzatViu-ONCEqff}ZV3G`nm9X{d+|l1!N>Uoj~q}_D@H&Uoviw5WEqmo zjeXlfx#WP;m4O9h{dF@QBz0V3sd=d3X$Ql^CK3Qsa|LaU5Tl`%1gxH*+zFrI%RuGI z9E8^@=WQ3;ntj_Tkf(L*S&-W1ttC0`!o??fd-7P=gkxUoUf+bOl7F-@_s;JW#RJSd z0Kmb_hsg`|{XTJ>HuPnGu?d++XH>ar7%6aP62`jidAf5^4TX?~Hd@iDZc@TJ$_(0p7f zN1%{*z5^d3R$nm+dzy%bkyz>Jj#*h#ErdEDfL0EsjbcfrGa0u{t6Mqa?MhV+iayZO6Bl)Xfx zYoNgE-bXUFF~ahFQ;D@d(xRw7rTjh z5;}3S8pd>^q5clSVh+qT#*gAO=Km16m(`I+9S{I{zyZ8kVlC1LxY9}VFQW*BU+&5F zEb{Ik{tGLYPPBAQkyNfq7$xDRsQqP5UE@-dkTbH3%Grm91NLTK6kI>10aw5aiO^da zRaY4K8k4e^0f_z5_x5RHiPmp7F7FM?e30{0ZcCdAYYPnd-V=||C!?;klRd1Ra z*AoWRq3|=PL6;U&KA9|(!P^rw$}JFPN#qF|NA`dw$-ovdeN0UhQHmITT@f+Ap4^3;5lSn@*>s#$*+WwH5-|5WJsQ!?}+koBlo4^vz_CI~T~JSkAh<)>S26#s!jY5fSL$*3UiP;^|nTNAuw9`Q;Zs;UOb6fiIcZ7TD*zQAr5Q3>*S@ZV>U>P_x8&`szza2LrJI zx{k?6m4o1=bjH8|tUatxotIBfILAQ+J=Hio!9L#U4hY|~1qoRs+FTUn< zv1aB*7@3L8c>O-pjYUgoV!U} z_u#w>w7ptu?cI>uO*4EpU_Kg+@$J4w?j=-j*alsyglXKmPBmdA9ofHNgNd3skd{)4 z1OJ>IM(P!bldB5CGGq9vVZCc{OH4r$d|H?cRDv_C;-N&!yAqkla&Z`d_Wh=s1ith(5ExvpSSef%# zAaUr-H+67rarMm?n*K`E1=Cq|>KPR)q=hcQybqlIq?&bUpnH|uhvbx@Q0y5UlpjWE z7?=M?G)q8_DT1=ll!NMCJUEgL<}6(_s%w~^7$G7o*?%8&;4~ZP)!&NQY3=P^0!i(VC##UQ;VCKhV@*FiMM7OXQ{Cayr4o+3) zWVK9+`F}LCZmY#sa$e@+l1+=rcH59eKC4Jq#O_{YK`Dt=LgEkdispPBlfB{q*1`W? zBrnN!sQ|3cA0q70c&53zOyMWMH~2FxVSM=av5`>v1mg)nue6*A=uyDxh2#nH`YZaX z*7i??4J?;Pn9UDh%pm1OBh@lcAYVfI1ky%69Wp6!AoqY9yqculRHf!BVTKH&k|8hl z=RCjsZ%c*yRSpH_s+6PY^X9Qm;F^N6K!dPZgwxnr*pqG6Ahi04aTsW@2gA}?VTm*Q z4DqJbf(-ClIZ?w$FxJ8tZpIbBx`1gw=Yo)xnS!vv`4F-c@Pe!9=Om^I4;Dj!ELi(I zodRtWyHMtohH=OTqd=f)ym_&*_r%ku)Wa!@w$(W=^P63+Z!zZ;q-FAMtxm+Z40GW7 zP_KCczcnN7B-Z>96rgR&l7~q3uYS5$OXr_siVtMFy>_pi^?6TJ+*o4`-Iam`+d=}_ z^TQ{~MV=PMN@F4mSzr4EliLvTjL?J=h@8m^5O{X00_P&P6M*2KZ! zfi1^DhFr`i)h;-_j#_+orQ1tca=(x;5kVlUy)mh%vTUljI z2+Vhgm7By0hBy&Ln#XyGEg6z2BGi)s8OuNjh#Iom1spOG7>s0_P<~wCBA9%Z=~m|O z?=Exl^NFg8s*Yjxt-w?71JE25L5C58P{stAm4uLl4%yG@+Nb~`No~_K0I0x&;O6Z6 z0-cbEDzf+|G$K^?gNv>5bk#+IUYM8>qf2V3>UxN8(LR?GSu!*I^Of?~seN(Cgd=hS zqWJ*>AtV*{MY#z!s+o*@)&4{b(F#|~|7{s!U|Rtgs0h-^rdSqb&uF05EVIp~RAtvg z#?1q#r<3QlK@*c~KF0<%rVr}^{)SB`Y->!cDI*O8PJsFCX#>j>4^q0IEGMJS5fHE` zW`{(0j16ET6KS$PYh4@c`iJysz$ZR|ImHiYa6m_x+s0``eDi~Vphboi$rhNUPTa~_D}Fq(-<8u1c^tX+De(Qk=ga82Jn~8H*Hu-Q z)}^3XH-02)O za6j(sU0gr+_dX4tZ6EKokG*)mn4Zt){q;BJOQ+XUrT6f@d3$?9GvXfm7S=h7x8v*a zw7D84)b-eq(mC-Hmh0zP`h)lLeg3u0$Cot=7uMV5`}Urycd!qO`mK7nVFl?b`G2YW z?1Uu;orO$uXf)sY&QZhjUkj7!YMe)PFG_=|9jV{q0|2O3@Klo@r?%eaFDow%-4u(> z%?-w#I+o_=lBQ;7sPfvu35rl~I#FCHt!giEi|TTk@jX30)oH2WfoaTEH@>=Uy_eO@ z>#k?*K$t7q?9~4cl=u4&l<#-?Unn2H$@L56aX+BN!SeK;*XX#e25~=_a-P7!IpLp) zZWMd@=0W*`1nitfLO729X)3pZvrShqY%`4*kjWOP&O&~Wl6dNH&!}X^LfP;TN z)WfYv*-i{@Gf-C}cl9ZpbpLhXubG;)@iNA+VW}O`uZ;#`gV6hf(XBLRy!SUG3{A=_J>6|d0`cPI8YFV=^O5AcjmWnk4<$O~pg z)VGY?-??gr!=>UM^mNNV*ou3_s$1IMFMts+_2@oWyic0cvp3Z&V%EqFGVMhF<0C~E zaxDtB*<-x38vY+9&wpWR3x|lz^=20ixo>yKNMpXC?UsHiJF&tJ4y7*qC~zVNp5*Xy z7vRg)p6n)c4NJ$yFC$F`E{wD(i1zx`gg~Ur8jXWAHx>*fF(K1U<4LQi7 zn_Q{bgdq(FdE)yS-dbRYBefHUf+QQMRXEORfh=73<$k#PFvNF&2cd(Dr4*FbfhXt5 z^jY*$@QL4JRPx8E<0@2Zfm$-75`q1|YNvsUyz}{xP0Q1E{ZK+3c7dK?^_8;RGDK8D z&cA5cky^9VsKn-ZuM>ee1?Yge)|&}(XYGo~AoiGjWnMl7UKSoaGC6@62%zfO{Aie; z6;PoP-z~pOP5u#bofK`8ehq$Yr|4H2vvDttpc%B zMRYQ*5o5`)Vi@?rU;&%&;Ef)n3;7GbU|6^{TzIlfd=7yT3%erR05)q?qp14>L1qA- zM1hZT0>Ld)qrm%5SU2Bpa%A^uaY61_Rb(|64_>??e0+R}e-yGZYZx_pt^G_n(unif z80ii1zGe)GrLn-r0XPX+01_a-PHkCg-JxNB%(B@RlXOIo7b_uDxf|k6W)j;px7_4oE1xDT#*~U=p(eFXo~=Z+VhXyYyFp64a| zpsNy&KdPvSim5^}s62lusQ#3MJefE)Y1sh0lMHxFhr!J}RQRkl-mw_XP2Z$RRd`Ry%+m zfFrf9%>uP0DdQDC2o82w6wsmMd#4lOsgUMDCJ(i2k}lJ7h6E5D^+Qks3MM90RN0Hn zNJG&cR)nbcEe6~m;IRrx-KUBSmY_>$Q$peJD+GWUiOqU&_G}Vn4 zwJ*ObxNWHS(}F&=WS3|eLbwCPE=ZSNsj2*V{{pF(OBb*BYgFWl*>CwHoT%SgCE0ZA zF`n5qC+cY&$tZI|cTy~6YfS=Xk2+;!6*5Y2t}*Wt%L>tHL5d6!4pg0mOy_J75()q6 z999SwYJ$R!i){7T3kl*?<%qI}3{xCsp%B=lovE>Pk&CKK-@`6SkD2TgF@@>9e2U89 zhyEJNGQvC)aN@X;9NDEI#%+D8n)fUSQKiHq-(j@ntWe70^qau*k*q4AtjuJ^WJu%w zEbVj7hahd4Elb>FbrcdeN|^}RLypD`O>4-0JMXl}*YWo2B)-HGH04w2w#Sw;)ohNe3DxiIG;hYmT&aj8>;TO-+S5RD=nq5%(Eo)K-Jb8*Imgf-6M>nQ?b* zENGRF=ET)XhD;wi6p|g2ILXGi&&2R(;yNA4lgQW+?Bue;^BfBtA{FBm<22LEBpk~V zLe1nD8z0;YZO`Tv2kCu+U$m6z|MZm>MRj$Tm?LUkd$PdGdnT1iGfgM4Ys@OHJ-B!z zT4!Z54{O4Sr<+)f$|UQ{6y%#b8ju$|%v80o13Ye3&yuq< zKlT+2QV%^AIm+C=SLMoBmWg&wbRK0&R8;iP+;Nfog(_juNb{lZSN~j~Uf?-L&QBWF zfF%QQoZQ%Z>ASj^GotFxS3CQ*4|DDWxRRR~#Wl~mF>K$P(yl2|KLORr1@oA(Z!3)@ z*yG8luSP03dnu4pa2b(bo^Z0agvO4+obbfg~O6=47@i2Nm+d26)`th-uOGk@~i#s3$oBQ3- z6Ni2X@_g%-Yv=3b{&+rl%zI-AVY2$#>i6{U{^|Cy|9yD#lDT;9__MftS=nlL=nF>H z+l1akLN<#0enxvN-_V9knUjp){)((om$O8&BPF?MJcm6dIF0amS?XW<*>(${c%whBm);(F?RWaRngr%pG(Pg%|A zESlB499K<7zms?fOH&jhbOrHG|5^Ti2&=hx6!*%<`!pM^Y9 z^P^Bru&7oF0RW1)_^A}G8Vh4oCN08$V^3vYXA&?pNygG zE#vDY!&Q1yv>_Y%Oqw@m+vzVv4@AF;@$TQ*Q1s9wZ2sC3WZ2L?B!`QD{lK_nDSjt# z_)QJvWNQHHI={L$f8Oz8z^Ib~JXcv`VaZ(HVO+;Kx!2V*NERN&y;d#C|a*zXb49T;f+Ugr5>sCro(J# zlsaq7l`;rkDD*<*QN&qn{NUfk0<8=WB@>ETXEPrRv_TD%Y?A@0tg1SK!F9!NF!Af1 zlpVr2@+S+1V@)&0e~9kkOLOj285IiwU`AY3ui0Bnr6`NgF<&w;3mli2_=KGbsl$yo zfxqux4c~yApJ5Q0FT*Cu3&A2VyHb=gj?4m-2KGA+^_|fYDOTtTWCliIOt}>rgz8|< zz@;nMR}b|YfOY&jCkxf2V@4sk;I)0Ck_^aY+mW({*w{fZ?0<;Zgzf!p8{Lu0N+a1| zl~OAx7Dvt-?|`)q^oImh39ggNE3@Ah7Z!Fy|8~bx&1oF{cFD0@WI-yH^{IZ5#P0>w z0l>t?*o-BwY51#jIJ~oO&HR{_9sAplOb}0Wte+RX5HS(6E^%tBOBIVlt4eD z%DP`>*nK`2ocwc(jm=fH&k+I@o6lsKQxA_KgPUU?A!zKKXCCIn9$g3&6wz}PW@xOp z$d+rx`^)yC=U@uk;m2Loby?o4r35P(XRPd|rCez?u);{sSoW_fW5!g~3qfqh;ljKr zxX}K?Q5x9Y(kH}skDthO4OO)UkXhz_Z7Wr&#&iXu;``5w1-dUlp&;^#917SVOjBvc z*KC}Av}Q{vv&d0N_!esc1^%eNGsM_5z#9c2pU4p#0!m6q4v}C6qaQsrf=%4lCWmc} zNpJpjqTEr>C$&sIMqr;oz7Epq-fM=JSuedZ2{HiC}vz9aktV6py*Fgu|K_$U*X zq!{elzye!#3eZuEkz_>-sQ(!|#J=p%O%A?KDJhdXtbY%{E{vUSUo3`q`uq>L*B36A z=qOyBQVqk4+Es*Dh{H&aKvOd2=YaPU+}-yoYbxx2A?shW0lW1-A%I_GJrlhq!^#IZ z>EGOtlU4c&XmmIRNL#h|O5@$oTfFZV`H{Rof6rhDT6ZF9ps>bTli z%NnYSD)Y2!!?c+e!>{2dZgRy-ugbc)*$G#xRec1tn>vK=JrKf>de!2`?dQPtn(eyt zK_}fxY*TXte7C9@PjXXoHtNa7y}gK}KQjJfgY~vP&1U(+687W0o%2KE{@C>IrkJ1B2W%j9*$1TYIJgtd1Sg+_sL*tHq4IN8myC=ve420)<8)t*^5v}YSY zq&C}FC$}*7TbgvE&xJO+*q3Q4&@Uq{iWAt}p2Y$}K#GH>;j(c{vWXjgn9MYDttX+S zFeesA1LH`WL>nNDW{1SXM=CJnZ*$&5%t1=2utU}-*qV$l_*xtkC7^}QH6f>?CqN^l z8#&NY0RE}xY>+v-W2{m|bY$I}R$OK{859=tlqBa5 zqELJB`Dd~R0XJX*{kOwTh(KA{({{2lOYxdnhD_`;4zT6d@dA<$Q_k6?qo4(2N0PO$ z2#3-L)KLJ3%N=KSG6B(}0Nt%~Z*Un%DF(`qwo4;_MD8uM>ttW4183{Ijcl{i3RjV` zQ%3(ziHvc#kY!;w_Psf~oxp2B{#l|&ycr!yE_45GG?iwl(X(3+^!O(M3j>W?>w04O z$Is-ZIb&Ea*_2a1V_(6L3Zv_%V6`O;y;0J8P^V?6fMw60t<9$_S%8at~xcc zd$CxiU^9Byy&}lSN_#ER>)}4vzboFNd}5taA)+RXHkSgOU=S!Adwr^wGi)Id*kiz_ zNFyLhgAoC+@D6yPW-bdmW8$x!P7or~7b*JSstgHkHmJZ%$;IGbO9TID^M2 z5(KW~q`t5>j5U|8gM>JS1&`N;6i7rzASu&f5$h4P7YHNHO(9k7f4`xsC;=# z7u|n6hd!)EvE<2{6t0p6^DjML9gV?hes%Ken)mDE3uT8{O5Bg77y#)2ZDI{%Uxv1R zvPNs-qB&m!*=eHPaP5o60w2R!L};$kK+1QvA&?&|7S%L71t7xuI$i@?CZ4<&r2U84 zlX&u+G#gTwitXH&z?B~EC6erB^w{YCY3#NJLs4or42d|dqT)dGxpuFwSO~8=B*Cea z$0TJmBo87Yy)w1HMn@cB8m;OulY}WIM&fZS0NPS9Au@JXAkWqjib^oYdujl1F5s>F zfNF>@Fy-=Mk@y~`?a#|S3J)W&!#}g!q$w__vJjVkuN$}?Z@Jc}r(8AHO|*z!g0<_^ z8pOnwc!fcf$V8dV^)3CoHi+t-pugD=&4*$Fw3^U>c^M>Sxx6xwW!&)~vIv1YXad)I zBK6k8LX=65AuEKNVko4HjcQoBrY4Zk$m2RG>=sJ3w6GzHN(Wo9DRq1x z$Qw|kEpqwdbpcpnIY4o^ZIv8oY7 zA`K)mh6-v>YbtVlfK8Qea-j7?i>yVR?LIvVLg%DDwiD#1UJj##*zh>FA_{s0`mDlV zw|p=uXdq5*85;?=axb5kf=a;ITnTi8JEttsKa^$~n@ZR^Jl1kZ_=<3dmq2SlC;U*= z5b|}(Uj&0*0gF?V@`KZAg}O#Ke^9spfS@ETSUn{|ndET5IIEotj`?F?d>BE63?7N* zl^clC<-x=ZeBX?3?3#L>Y?wOHQ2fxyqkwqkWk{TnOzyyuq40sy*j#~bF7v3-pZKZ1 z#Um}zF_tpnsE9|nIkBUnOqCKo(ZWopd5~rH(Pu7ECKYgJgZM^dh-X~~S0J39i?69hQGn%=C+0E zAj@oZ;z@$)rTq~}F{HibfiP6IX`8sGE6Tj2101s8-$~fQSeni-lCn39!ymQ^th*h=>(xF8gr zvw~&{`Aqc%3oXi^Pz_@o3FYP&oSpX*(DcL~4Lt?~a2q7K`g^C+4=7hrPB6?Lm1{4x zGk_%b2h1cvtkeNR#x^lR5R!8lV~#*xRp(PqZ{*&m#~ZVgF4S5xUW+ETqf&DmtZvI! zS@3l2TUW15cd0Y)?I&u-o>CEaM6~i5oWQY`kG`VI(GR@N$NGwaMS}LI#4-74FKNvm zJ0lMxP}GW3VMk$`U&!nbj5m8ZoBifmmZ_ zM@9MP``v$fa6YELZ~k2$f<^s$7Qdm>UR>K}JYK)=*U6`+!^6Xev=lzRZJkm00hae$ zH@%x(zMb#4CsRDvoYXF=&(5Fg)y~J=*x%Ht!OQ5^xpU*s=A~NgZWqJ{4(gj1gcKF) za3M|e>i9xJqD%{W&M`>|^QK|3Gz1?-kCcbSFM3Z^yd-!kPM7n!PbrePoaZQ2n=b(lKjmVOzU->2lrFbfk2(mYsdlKpg9&Wq78^Nvr#KB^B;r8I?NXrV9HPEvFPc zW$nY6Vf;87wbyt31%me4{;TWhtLy%&>FEn%R@0n`HD?>HtN3Yap{>dcb zZvSp^ybkLH<5Em+>$~gz)BF65Y}C%It<7Wp_p~{YxS8wWv*YfwIPLDW&xqOv~`E_BP~o zxi(pFaCtjo)}O?V(BMeeo0vVC7*Q2qgp&D85*6+0L>_JvS=_Z7-B>1{L5c>770kHB zlJ-u|KH+So)0Ok8v3?Gmu<9&irJz&H)qy9k$Kd#Y7O+7@aVREhfYiUOAaI`HjVkT( zY+IOVWXuD+gqY4=*Qc_HoG}`w443?t5ZScj8c}kZpW%N*Zm?13EXj%%N+Pli%tNBi zr|W&*5wwJ~J&{7$^Xm8jsYYc69nw%eVsMkGRyRZzc>(FE{#a!}o?2H^2J=z`Z$1N! z0E@66HN7j}^HJ(1L!|)ZNbIe*s7+0qP0im1$V&MPpAcKyZUW6ga{};C5uL5`^3M{_ zWS(S@HZB;tqog@SkV;8L}j%AeQn=M(^ zaV_W^`FfgbbI^{}=a0}iyN!kQ{DXuMLYtScBO+m&C^H@S8IVis|fgMb}g{{&E?hOXdz!TMm`(j#1Sif6s6ltvc!qk<$(PTt&W<$ys-}ne}1Q7-xKm=+);6 z8_Vq+0w*nLN9Jx;6b_FNNgh?AwO>_X*q`aAwUW1d^KF+2{wRp-mI}O1Ymb+uN_Y5c zuP?7kQdxoFPlOZwpN%VEQ^5B8Am$KWwJ-@B*Q@yUaUcn(vUbjN+h0`{j4Vi0JJz(^<&S<>9N81jT8772a8SXF_@ ztgX45?0h*z0<*W!H}zx@^cjB18X-RXmT|%t#D2i}@>C^4>Vu}{H!$^`kxj=<-v*B2 zM)j5BN#eJWlmbZZp@zytGgIEa0a?XF-89{5XPX(YQ&JVtl9}RC(pvlIjs8!2XdI z_8ux2A!R|50l5KHCZGh)5DF=XaW!iB#RzU1o+&E>Bx1Av;eREUb96|%qk=N}A!K*{ z)h^3v^0JhkMX+Y3nmDFpQK9sX!n%F3K2BPL!cocGKr$~_)t!z;zS z0*qk!MH4QP)vz4ST4%cKn z6-I>H$b!%y{Sr9gfAIZ8F32O4fl!yj0?jLjX2+rw)}iKcJ10(yNK7Yy3=_D(R)lE` zuplZKYb5;?fzsnDz`*B42HQXoe_W+^*>E*BF;UyFgRhmSxRLu8oH{1Z-D zbZf9)Ord7e=I}Y4;M8$EcB{x@Q|7QMcigc*?%JR5m`wICKc7f`wIJVAt=Y=>BvjMA zfq_;r?_D8>C#;eDQ6*CGER=0us}4_3!)B)ViymF1Pz3r}AYSa+-y<55s4vP55w(=W zb+zdI&khLn(I4bhP42wTaF8f4#aeS-OsFaWc`elPgq@xfq0oVP2q2z0i7?=TXjOh0 z;zBc+-%4RUk0Yuqvs8a->tl?8G0xF?y7!#oCoUbZ&e1BXb%>9Ykx5HQ<200)U4ZR? zT*LIKJmU{hmBm&vq_h5Y&7eF=_ZWuCXks#Ixpn!)7R%pw*4G|r#zb`l+4&I(5pTAr znwHdG>7bK33+aYjp$`h;8cp!n1Ih zbkQRI?3%^7VT}%V?nRFjJ9P_`b+y}`Zp7D4?UkYa!+U%U-MKhLDFIZrpQ-K~< z;@oS7dG<1@9YK&IizL`ZP0nDJF(JYVZLDRJ;M$r}p?oS`?B7QD#1(`E+9EHRJ3_|85%ss2{CJ}n> z)>*T!0LyM-+Rkg#A-lc~f%|AwM;L#NWyYXI`9<-L1wZDB?3gGpf)FBYC{Qi#$oqG8il>t&p(_IaUqk8oQTtLk=T$B)Z!eek z>*&}0_Hk_Nty0A3;Hsa__m{n&_s{v_Xz$Lp&)WluH^qMI?(X(6`XSEAZ(fJ5>+9j7 zwf1Gyy${(Z1VW~HFcFv@8T$Tlcv_sX^*@tSYhGQr zwXNM!=)>AMcQ*%GpVb7H*& zxXA`?+#Fsy+d6%==w5Ax_V=Axxb|sdthSKs9#CIwmdyrt1VukpqiG>((mbqlX%^jj zqdIzH-i_v7sJ6Dau^g?FH&~8#g|}`AZ(b0>K$=^uhF+w$wm$g~*wFc=HK4cu)X`UX zXp0G!Sp_!cqX_mk13M{BmWF~Awp$vg>T`BZ(DT63rlA_SGAwDsVcAP!zP7VgGa~`6 zo3+zdptOV{KcZ}|?bOv9fmVdEB}0)KUD!a&MCI>ev`}QBRl6T?oI*k8hH$-b!)*rI zNXK>no5Q1bEelS%mPCzYi-{5rp8ZijE4&(oqd3ZF=cvFqakd4Th4uC#1f(}t?Lpwm z$#f}bfyr1hAcr<0*E(-2p};0eQs;8yuFmBl8YHn)%yfY_Y(x1Sn}XVjcIGN^7`de&Veh*fIt3JYC&ppn=S6>U^{Hfy~y5;#d1xOU**dA*%L0l?;;}dkEHrm>8(sdgMj&Q)TUP z&4%WjmDh-8=l_VchyFa4mfXI-0FnA}56Gk>OYfxu1jL25r_tlWwk0`KDZBzp-!Hfh zIbI(3pUEi<+YrMD20NwrQpP#KcP_ zhcG3HIeYss8WGz)2CVc8X|=30=j6T!hIUd4m`ceudC(aXP-TP2e{t_NrwAdI@yvr> zIlK7LJp&H>={Om{3ljV6C-VMm`X3Pm0TcWKc+xvF%m>bA-HyT7mFVBu+nA$5j?~2y z4I&$caWD)Z+Q34s;}ge!ggjK%^{4|hC+O}gK8EEo3jiX6XFcUW*0a;}evh_-F< zUTKS_a9G%%G7p@J!C+#Pm8vXiv?lVQ-8^F3s#%B?#TlbMBA8kQK4i3#JrOVHm(ysl z%X`kG!E3$(^Hi1l^RU&h13bW3XNNQ!bXNeVR+d8Pj@b>VyM;b3l-E#zDm12xlto&0 zQ-y>LgbYhMp@g zj?!w6?FJJP?Aw64&BM{6_G}k;U-@k#QE3SeX`*8cBOYXhumcMQ(-o6IBkDr05zz2Q z8){KiRIF8ji($DWACVg*o|#mIB5#_OIz9kw#7S_tpUB(tYM~B0ldfwBTQcpCo1mJ+ zgfl_m-+Eb04LscXHOx2c-`a=DXUoqBvole|Y{QPsAxxvDDP<`lKzQyv*YFyFA@G4T z$@2$l))JbEgSiWc$}0^Y$q%|Wz+CvjRyt6Of>OIZo#SvCC(<) z5wj0-hhs7sB`N(Rrpd&}*q)MyaOQSrh3vhRrZg7TW)C?uNNc)ME>JBM?qlYK0$L6s z!cLi@3o)Yl`2*t^lt}*4gzChe7KVxz%vi_#)}$R8C73N0g0hx&qJ}srf&|m`mAsdb zWWa%|){^L@Ciguq3cfOt?bfwdxZ<^|RteYKA9rX^HtlC6D79_6%uy77K376bSO|n{ z*_w?FBLa2>5+|Km7A&i2UONt^-Bu-Q6a^*J0;!A4l;erJY#L-~dUgOLbd9d)=Gsf>B68lk- zn>3L;n4w$X4|eDlXGn-OVwYW7f1!yL<}*gC9-)c*RU7Kh3_G~13^~nb+rC4Q6nHxO zW+Wm(yq}8g6mSm7ZxUfX<~Nl?!g9h@%kR?^p)wqJYWFCHjwyFPjn?aEr6d97hSta2e){Zc`C z!ryA1*NaQ(+^M-uOA?Lv`U&cC*t?Xu#zU@EhFG1III#B1Zc5*>P&osm4lKo(mn7)y zaw)MYYgCC(rOir1`LXMQ^tO(M6)3_wD@2*cd&q(w$aor!bX?jV0>2H$(uGdDb`tH4 z)%X|hE#Gz#BGxz3bny%5PqAS|`!w<_P+q(g`7boUgb7p8o<(S;0X%7k|HwM3`|6WV zBEd8E-^)2#R%1#eU?j8imP;i&d(p0{?{;7qLd1!S3!kBh#H~{{#hMuAoho4Z83Hsf zJbgNSUtjN@H@U9%FIW% zPR(QdGbEE*ZsNE9Yd?(|A(xNVd%-Y^%QjiuIalY1YB32ok6D(`PmYfF_X@lD&az*$ zD5sRfOzcoB>_7^}-&-_bc3{Hq_q!e|=PD|M*&ewyyg}X#mD-mW)-&k{FT;vWh#M4H zN0fAJ$+Am-NEH#j=2Ye-NlkoVG2Fb}guJ^iHShze5PzBmZYK}2u;~@hR8*%qMmjfTOQTHfKccJDhRYo|J2m=) z`1aHW4P1J|-(5s? z$Y-^iBcj}5u(Rvyk;K;eNtMeDi{bYW3ZhR7$|OyS$n9-@=7I@3gD(xMnu>F9^jm=; z+iXn;(Ue3=b?%mY-|9;wk=+6IwrzkgY?!^B0H}6u7Nqc-=6#i3YsOEJ2z!GWq zht>$NA=wxKp7IYclY=p^qqT&PvFB9>PF{dy48VL``#Y!KpTO?bcOFrM4;P+rG27y1Mfi$7H6MHzh0gux$AKlj{k zf{l`oP&5-(M*1aZX+n%pP{)f`R#Vfsvib|&lGL;O$QFri?QM%x_W9ySbQTb#X-}Lm z-TWICWWhM6)6`jQs-szTIAtKp7aw86iy^sbLv@?MXYqSbGO5$>t9e65xe`)`7$}2L zOoa&rpd+3cCUj#TErNbH0oqm%#=C2r%%Mr8Zm_A7O8Im_-Dr$Ua0!fon9A-HWC=`0 zQ@Tskdfj!J%1xnzj>3$wQp_o8Ty06FG7otn3+uVquTPqIbbt&3=Qm0-VzkqV9wQ8! zCqu|@zn0~l2`qi9$wLHAM}qFgtRO^ewqeS#Vqq58Ao9p8J)){S@k-VhG7RngEIR`E z7*rJ!tq2N@{{50+>O+`znaR{xNRu{!#BZ3eTU2hkj3o*&qEs|FDs>CL&$2A~A<@UE zaIuT=>X~yVN)%;X6boEMR{9*=N=PV`L;UwZUTZJK5oBbJ=X|bxszX-};Ce5?SSHM+ z)wwP;?w)Hn#{c@j?Ir-RrvTyeOt13Twg0%i!q?gaXRXriY1R)olTK2R4b5u8K6zoT9T_%GV8bQ|h zfKS%2_gP)cUq-{$OfW0SePZvQL2rK3g;p9xNxfQL%i7 zuE)ba;>0E6T;YhPAcWSWh7ORyE|JKgc0GSPuyVC3jF#%E@+zN5&vN7-Tn(~oZ8)K` zX*Cem)<*9n#8pL4D>LEsE0GT?k+_xedkpt#c=lzv zp&?P&E^++m^{bd&l@&LVR7%t3+Z88~RBTVc_@n}S~aT3*D z8{SI@8?s(VX@(4r!B~eRP=j6qg9Kv;#d*Oh9O#g`IgKoO(-w2TO9Ph((=N^;{25Wn zE!_=qZJHGPsXgrrA*pZ&7GUH4OH z70OmEijowrpxBy-HVkE-UndrenYfsTUIPRna~h z`E0$y9&=V+2kr`U19x|7*fwZcMA<^1?;4)=3~|v46m8<50wf7uuEbdV*0Pug_k>F0m0irvI* zJ)gmgu_g|>oQ1@Ml$1>UpY9LvgtzIYsuya};4DiYzbIVYx6yUN&SCA49OAqG%&hcf zKIk|7ah?#OzpbT%6`O=nX9r`GSy`Uko_NFjG|PeE%RLmg5sMytm&0gx{psDQyZ)(r zEadwt} ziBXfhYgQ5^M)?;~5UPL8_7d74h!Or+Z~dhCVnQRItzF?qrt|n+NzN6v**2|CezqJ= z1At)1R_QyVblY{)ue+!fOdZ=ZSJ3WX7oYtXXhl%NY~MGpF~Y*<)E zn@O;Mvg}EF;?%k%Kh5*ah?1(*Y{tqA_E*cb1%10Dk0LGGJx=r$PBaK3Mt z$k~tk*VjkiFM%Y18*(ZlziEmDo$^_P%* zr&w#d9=lxaqsuq%O&w^TWB#>vb$ zLQFp2b;(8y8}k^U2ksh?Lf?j)S-81PI?~z)A?PD@aS)0nwf~}_^HK!hF1(}mpdDcf zzd3xJ4sOpnI^qX-_Gen6u$X0yB>{sK=e@+ZEC{jFPY-C}I=_%mj&OH;snEq^ZbzNCTM)V|lfHZM|9cU>w%CY{kwA8?kva zNud+;?qiUda$$$^Tb(F(VEf5h>BgVC%yxR!{LWD}OFe@E zdc^*C4%P%{kq}N^G&>@L`7X$tWAP;W+sgc+9Vv&FNzDYF5~b>!3`znHS$2iII(gMk zm?AYbmC_)%O`bIz@*?5Dj=vFbT1wyMuAGM2Ww^~QNoZF!z|Uy$S`;qQCi3N~ZXkxe z=hUp@IF<;CN6mOpG8l$U6&Wm7y;!kxeo}nXjyzO~6^7O6LOt80e_Ro%>V&|{xhVV) zL@3D>Gn=z+EU-0c&gkl_!(8l5y}6j=b!}-EsvA=Jhe1hKM4~3P|VS3`Ez?DaA6^<@XvWS`!LcW$q zZ_C+vy0{Q(R=ZnSlAkDF&#*Ho;L}#y`>{fP!T#-hWvQe!ZJ34aEfff1nr+?(&6DCk zvr*NJ(|!U5SOs}lv_euuyc+P3IhOGgAG-b!oYN;YqO`UMMNy*w>%-zvSMCF7TF9IJ zV$PS?{ze($9wakl9ThYMCoB>40?8Vh)zir{U`o&+ycl6{jSUdFhOJ=E$e=&L#y)Tv zhN(BBCbVQGy%6xs0M}EI3cT7I*-JL~nQ(cDDS}uVoigzDIi$x7k;-a40GVR#pVOj5 zFu0fnTP#yyfVBhbFsvWb9So4bcq9^mrlPb7#Q3?89VJ*%py_~!9QCcRi9dS@CWk{5 zp$271Y`&N5jitP%zAoI)s;CCpo~a`;VhzGBWor2mjUHT)cBKy{DNUN?GCC+9cS^4s zEH?b{tH>O%4ds_h*AWsnI2l;BFba_omAWUzQs$6p=^)x5Jcm>LcUs#kOE>Cs{{7xi zh!I7Q?mt#nrY3LyvywWr{v9jKoqq8kUfe3eMa84v{uw2BlM=LvQ#z<@dokWQscsE` z03Q?4<~3$=v1t3%V!QIvqib)_MsMmg{qQm!?{}*aKKN|1N*FK2!^VG;Mi`3nZPH_U z@onGp{dKE*P8`$<(6i;+mNVOCh+KWL>D_$39X@=JCgvEM`ZWMkilHPHljjRZgsD{` znKH7636N#<9y-5uX|X6APWz#4D?xBnM2iwcsQ}6B7SMGwd*b0CqcmL%mKo$lhbOFF z%Tmc%!>ofK98}zsI93}}qLrVTz(@*ZC!;9h;=^7e&B|**fR2Dzs3JIPxGVGyu}XlhvmH7EzgSOYPad7VOGi! z`gu2AXBp`TWT*$Hr^3Sue%jZIyTpT%Ls=rAuG?o)`#Yte3swKvT@t8_)L{^dH~!}k zz^pZC-WY5uOlg=ARsAdjfq6<2l0_Dhqj4TXv;Vh2waRV0{@C^X2O8vC*M%FQ@4 zQ1%hGiIpKC8OhkQT0@NNY&tiKw6WOS%b`b+$JO2Y@;>hiY~79F2?OHaYmlGnzhe9S zZVYiYs^z0G-0%6!u%RhE&~K-O`mm>^f=c;!kQ zQGSV&?8Mc5K7u1p@Py0S5T-QkSQ|H!#z2F?lwFHTkrh4AG_f^7M1HiA z$U4msU&-nADJZUzYjf#Zgu1IhIJl|gtnx# zUl9aM-O?%6A2RVOcKGHVmrl)eR!uF5;ApTnmY_DFAYmy4+BXVgFiIUTtf-et>{oF! zD`Q!Ng7ModQ+ZDx>512eZy1VzXC@6!QP9;Wk7z%MNKvL2*EW-*v?in&u^$)I0^+Qc z>!4Fp=yX}+NlG&~UiE+Hmdt7Co`YG4ODNyFdE>U7xckPDXRd$o(0)DA zr7pP7DsL4zeE3k#K@UBpCGv^$Vcl79(|@}@>-KWGjGNdV8(zT{2!w-7S=#@9Amsli z5JrtoGy3FTEDqkgbziJ_sE{Iu8lU{(&S*+Q3X&3Ph+3|sQ>1b%@9fB83vV#f_fhn$ zCE_LjQG%;+Oi7Y^435?xvcMp)5(2#o zPJuGqd4M`xgMrVXSgU(aq}JEKP=!a*&hQy$jAt+Q3sYGA_Z{a$QJsmertYXW>b~j< z^ucx=K8q?HRcJS@>7gV^OEDfT4v>RkFtZkdNcJPuV=RfPGyZSk3Kc>8Hkg)=%E>OM zh{V_19g@O5hs(~+13U>aH0!mpiG@}QND>GtNPkl5J-Cz#O4ZjaX zMS!VR6fnnX9xa|fadds~ut_^0zkPE0!F{-Ysc>Igf!wR>GOt#vtJF6~}`KH6W`h!W&`qZXJqa|RM3+9WHB^8i^!1~Q; zoR13*s0JL~7Ab&>HCCm3W>lZvLndY5q`TJ~ds&A`gUi&e-IvFK(z#g6eg+R-qy_c> z2Czqnv;rq-IXF%r@^=J!Y$5vs#-+hMF4DX%wKqprc6Q^Ta4!p(OhLtp1Rd+(umV%C zO3PJA!gu;aOtAxOlPdsF3Y;XeGMdE9dDme`Y>^~tUyK*@^w6-CSu6ikV@Hckr!c^u z9avLmvs)#QLaMRxA*x<25=;MF`d+p2j~aBl^w^h|+ex;lrIOX0df^+lx<7Dz|A0BR|o>@C{v&hm0u`#~3*JBd0X~C6#ea7AWZgTTy~Yi zPAuXW;^ok7oFp>7>!J{DgR+`y@p)7E7X%7_pw6=ieUb%a2?#QFKfUxbax-sYmK}7R z=4Ttm2kQbM5dRMZ_7e8Kw_nkYtY!CI=B>PhZ-$@t4=dtyOkO+vj}C0scM)Gsn>!NI z>=R0?YQNP-^2et5KC1DD_Y;u z9@;Ozn7k+7WPUeR&?I=3b5O<lA|128fpQQ_ZaNzM~sosI8lgWZ%)h+ zGDtKg#b85RP$~dZgGxm3knH?5k*&eGwhX@_v3RwKqfa?X1$#2XR+;2`@K(E>Tmo)ZwjW)# zEeB1ZSTD^SWwKiF_1d2DGjjg0pJ%iBGM>Z?;In!%o&fMyUTnJ29t`a?jTJYTaQQT? zVw`N%96>1v5#dDdSKcCvxx5DlEGLYbV`E$7EAP|B#s-oQe}rtUO~sbrG%NVbL&+UL ziWGYSD#pSj2Sq$hBSQVUxl7PsDx#Q`L%_twyNrr;Tdj;G9l(}38n@XVx>NY>=Qd02 z+Py!aKV$K%;r~Mfa#dC07g-SedjnKLSC?W5`4s2A!BQ#yydziUX_E=gc3-@XGmKxX zJyS$TsHhrIxSBP*nvD)0b!-1%>w3EJ>g(6idwH~b`S|XdedzS%j-yzPop1C}Ia@rHTjWh}IPC@Vm zRZue4m4QM1P$VPP)C`T9dlYu{A+|_pE!2Yet)no7I4}|@iao-Kwxj;vZtU$f;ELR{ z!K}MsTPlt}%$5W>UBP+k(?wn+j@1I=T7>qaZOLnTIUxJXGMV>H!NMImkuhl z_s|P{;`gl;+UNl>12!tmxW<2o!!(OOfsvL=q5E?Ek!+Fz@NwV}mjo8VZ0ix6>ObAS zFQ|{3XUTiZ2d;dS{SZ8p0H{KCl+x(uNI!x-U_l)0t@g7DBJ9 z^K6$ST}oX*CMbq=f$O}0X|m{dI2^O1Mb~7J&G+Cl>;)JzYTgR-`-6VJ;L1q$A0UWT z13o^mA^;yBur{m3qf^9XLUYBq)^(LWf{e2_pteRDf_ctYJt+9>qo@=RgG(Ti*bhuj z-^0z?KfBJ-v&*lef-k#AZ?lQtCHlJhcKvgvk;1_V`M0mr*qvsk_jWyyFE%*!~h)d?<7w zR#-F`SgE1JMPoQj>9`{Sa+x?YO4(jZHw{pJv+-$sD-5=rp9&99uLXG+zQ*7j6BrO` zc-SsX{j>hh7KKpbhtr-6DcH`ou12Lp)=T152-((39%X34!;TtJ2qqQ!AflBx%h%e- z3gq7?elwA5(h78Z4jU8H*K_7>9{aJ0P)S6x31_#pq96CaO$@#Xmr`6-I5vqW3ntv7 zqv%!h+BCt|{}P#%v{6w=OW3bSTuKp(Q`jKdb(@JrXI5Ct>cYY?o3ym2Evr*&!;zV>-3m#ohB3V}#!a8+`Ay)sxPl0-{LU|3 zpcbA;%Nt`dP_P%`cAUl;=0_$IHJpOhxX9~`Ph*1zromJyTQS4AMu{?jLjTvm*=~?! z(4*WxgDC(stRHT2=D%Pi@;|V`j=okel87oQ8JHp6d|gpBRJH|d25#agqEP$!NnH+E z&6iYum)5fy$4y}8>+3Oe%dVE_+Yr22soC;C-fb7M$NqS`v43&m;v+zEjc{!?oTdn2 z8GQHi=<5^&rp`0G%~4Wb*L=J`{JHS$efMs^>9uRyl=vc5=S1`i|DCT|mXs65+ObFG z^gB|1lGT(j*y1@oL2j6|-Y-j)lp|8uhtKBu&{0aJWzl<1FKMB5aRX}uyz#|`oFXU@9| zCs_ALR9}%}_shKJ?;D9FnZ_W9FKSQBN5{XDm<4ksF^YLp=jT%4fakLa-=3Go@9z~j zp?`!^n>9s7`A1Qg2bav+uGk|E`xQlO@*P^);0Rtc2&c&g9pet!$3z>DXj@)0dG)@SN9CC*`yz|$kEM@FL%3aD1#&by zdZHg>XV7PE#R4R)#8!n1zuC=9l5Z_sfxr&N)~#1~o+U(guo#~}c|a}D5Y;hUfJtcN z9GxIY7btiKIyL_SmFE?X!Ik~NvOjBn5M&wRA1wlsNnw!zunx+U1JtWAAWvKuB?3C2 z5VBE8%&Mman0={5rtapg3`-vjf0eqlP5u|G{zI)Wp6HChTTOPoFR(E-m$>%0L~Pe& z`g+N0O(-lAmRKm5GzW13M+Ud?m-g=_8}%MaFZdeg-J^!xyYE(gyaYEwN>t^Gk&1aY zL@Ve{GYXEqw{e@Bi+^vNHoBQ;tgtWp^7ZR2R$q3Jvu{q_+q0kZ?N3}3wmg8&m15#Y z>^J8)Xp5ZtAsyR-ia)l^NHc7k@(i{TwHP&+4Muf>^=Z|O&IT~&ZF@sQ#%u))IUUghNRUj2XK+m?Ti_-X6e zFTb0rWpzb>nLD;_V^uInT~@PQrpn5!sO+0M{S+U25F2jA-_Niu8uE<5E>7E6F@i-M zArw&%88VeLzmwt7-OXE0NgJfMV~qa(&T?hX?A2npi+ESD^i(#0+_@v3+iBoFz^-~7vN1MnNx02#v~WRF_`!HM zA;;>5(0nYNv)%z3iz3lb#LFnj2Yoo!Jg_KYa@SmUbWk{ZfKi`_=@_UYv}&Jf_U+d za(QFA2d>0A2t2_@*;(T|;*-N3lo;+NuCNktNL%BerC0AG&^n(2%iQ;OlkY3t)y7PpMUA>vr^oNg^ z_vt&A?oGz2a4pVCZt#JC*i2c|>b#$)^STb;jT+drR=gWE#U4|2DDZqL)R;El44K)p zQHW_K55E$YV)hTf_TfTlRBMv2*d zv^z^vmY1!o^iV{*1Xkxsd(~QZL=g6lJ6z5w?PQflEW5EsXhiWK>L~!#()_q%Ca|cg z10-|u{g*=~vpiq(&y;>qUS3_xC{60;7ie%=zm`2T3!4Nx=2AKf)NI`I=q$nyIYkU` z@auMA%CFeWM#R41)-KgSPDZd?!&uXkne(v*D;>v|~0mojg8rMytN2 zSc>AEXi--d2O!jDnsM#1p;k6&>b|07W$G#V`b+BzDeh$d;?wxYU#f@RIs+FeIp=x+ z5q24}GPZ1uzs+X6umMCE;o*c$s~tl0p}5}K8)|HVI1piklHKB$v<(A`Qb2?ev}CYD zv73vyoT@dXrLf*mhK=`5QUE&`N=L?Ty8?uw_&hxJ_2cb(f9}BbxAo{AevJgLU5oz*VdKZrl0P5vs}7h z>HZict2sp4x(}IZGhoL|f0qg29HhdDvIB*(VGoOj7oTJjzfp-I<;7iw!dB%7;svFn z{ktBD!N8}mj-nMR8@E3lM>{a?#aPx6gsMe~5_F`+^$VVolRrn3E5vMO8#GavYW&FP z?N2FG`5qd69u6fn0#z(rcC+^3+WZ*)rh3H`!gyk zBM=>*t&nzr&+7jzhcECY!1tmao3omSzD|Zc(#}&wQk>4 z{saiAcb+^l<^7$!rK$1wdq)0~+tWYdC2SY;)-9f3UMIdqaducb*}X2oco7f6c)UH2 zMWNgiWNDwtPa>KII_69d{@8+Z2NJD@B6Pyh?;9+t0gAnR%!*PLtGR+Fl5@&<-Psj` zWyTSY#8{r()w}KcC!pY@BsNnxV=t3L2Sy}1i+!cX(A@K21K;xxH0EC)INtwKv`u?F zRusP(!N(F{hsXUmZ7X zLRcT(FTUNR3Vtt-HZSk~^A1Er_CmAf?;nC!lv`W176c|a`@XvZ_Vq7@4tZF9S4mL+ zSh2}JZ_fVjAKw>0wr<>`Khfc9d7cTk0_1p8#1%~<62s1ll7)4A;mVGUl9A@o|DZ*T zH+$FN;2Qz)HmXQa+6EF_i@QAx`7@OyQi^#wF)yZHPMVi@I0uCe|Biqn`qZeC2aFz< zhGmW*15KDz$Bk1hCW2Db5dhdG$y?ew*#Fr`&ftOzdI!O#O&y3o%d8OeL(cks2^Z3g z#Y$~0SN%{)h_8M#Y4XCFb6EjLstVtQkpHg>CbqyB1w(qVh*^!*A;4)uVX^`0q+np} z5JN|0VO*F_4rN|vltNi;TBJy^e`|8=OPRqCfj6&CgM#lkvA8e>cYmb5eou$Ehr``~ zV@bys0h5o%AeMi8&hfA(!7N{lO8&~UCFnhPaS&TkKXmk}Y)nl@kqpYF5(qa_6RYh+ zU4iU-+HzoK<5gX}cI^nTcv{+RVbFoUd(F#LQ$1~O7ll7@#a)a#nR^fanf81W+EUSS z*gNa-tiSW+-l6Xh`Kd%sK?KLtrpMve}BCnlWRB+46#uT$`X>-Bmc`k#f*YXE|fvuSP#gMW@&C z*h5+R*~MB=g4A6sYDWDt_aki__Kpo{`0*M46L6{Oukc)J>AY4hOWvg3mnpTTv&mOl0P;oZmO z=jL}l10nvco=w}hQ4=2Lj-I{^q~uyC&xR;#Lk&7RbhD1#aPzU z$?>GeSAYohADxZG2}L03mOQJb(Q4U@#`m;G<~-;^!-Lt}&{y%psu8u{hU|vv+e&f) z3F1tp%ALFlKj^ztz^#W5qzRP-TYr^yoY6u>F3Zu#=ArDQDJ!=z^cm)BMR*2#G zg(1^0$}|nwWKTZ!$Zt+pDy0}}&ScD``3#P~ge97#gIjQ=Q8XqiYTAOtys|3IJCSf5 z(CEx;pw*=eA1BD>&J}lrL`Bhi>gg?zoPmLZnMABqaf%h9=wbjg!8x^AI-+Fsb95|u zf56dB8>_V}itZCdeh|P2!jxiCqZVJWMTs$#urFO+6Ar6l>xiB>Ti;}o8fcfZ!s*qJ zkINvcPa?q-0XW+sIpGHa>7X4r(kVLVA&l-qh&yWa^SO#;3Q(yEtdgujO8TYeC$40+ zvM#8-udQ2m_3#Qi@i;DzP}hSUI7&O%w^WhmWnSFd=3_iKu#sO>S+isn2%RD%YSHk8 zV}puIdGjp#=`4jxv+$4JlJ<(!WV>OrW>a^8#7yn9f?tj&1{Zy-^H*$ay_)v5n6(cR`orf<&_GIE5L8 zDvlyB5>ln%%GdAWDZzv>A~{g^={c>+dS>|k;risWecRRN_04fqqkKAD2q}QbV{v=}D<>~;Ne$gAV$I1S8i6p;Boh4p2t|k!;YmlhB%Be_>sBd;j{AQOi z4z!Y#&UWlN9L5-GmBw9YrmUng5GHak{4fgD@}ZQ&!K9->YD}1!ukdh9nbAMOi(YYYslU3L;VE5fT^i;YF=cGi zdl8;f(+OQQcE=tFUXSb7uB&;S-ZSh+Hz;UB^m+?2j~@S~Q9#=rRwpzlJ$^}`Z8`mf z*u(Aiyb8!J=*DvS5zEFFHUZ>)!7}TMVxURym_-$Dc5w2JIpk z$Y4Y`!2tX>cU9Ic@#)}bd(L#nY6BZxPTvhx2o2rhi4!;O$<8C$1h;e7J{boWpHBxX z+={GQ{hwo(a8nN_be2=}UOgQi#@S$dN+I$LmaSp4@v!6P4kbDigp)@hB&VgboQG~G zqbK;us0q=~`iwP=y|;mAMHRxrKltDB-|IrmEnxM_lY<_S;h;1d@-dd&HIy|WpGt$e z=pw%IlY?x!0#xQ6zvwL;FiO<>A1nl6fsOf(I=}8jf8EInC!=0b6y!p*e32QQaD#<4 z2Y$z#!__fu#;iTvk?3R6Y)z-^BL2b2*u>Wycw1nC@pwk=x>T0@pSiZ)P6R)#^@lgo00 zWaFPkZ0O2lhRhDtRaCP`@vDQ^hMV`^UxzngEpdY{%jlMcJ>CIm@PgiRkK56zbk&D}!8_F=Q_?;q~I@1MT`@Uh?nUx~R# z*+boG`ff6WeBXgbD#^CTmkzI+_x%gMpKH^-w4r#>hyN-=Kb+k$jMdi`hMWp4-6PF` z2MK_6n^aPHLiT#*aizddFPA_chCDIbWl~#u!G1_}XJun4j4F;c8vDQ|7Lp8uTzv*iDrfE@ML0(#e=9OgY)Z|Y&MBK8^Wx9YH&I&m z^q9~k=iBt3Ptg?JK#%pkq(qTVt8oA&B;G4Z5iGiYWFD|0+2Nv*4xak0P{J)FD2hIV zDGs2_@dFf`McgLM{6JZY0ghS|oLk>k7?ZY>r*)1E6qa$?cxl5IUc#H=-i4%sBt;`f zGNx(rUks`-aJZ$(>yoB4r7b_n8{bcLbY7unYIaP?Sy5J9?*}W_gKxn~f<^f)=Y1FE zOxn*58UU);0b+Ok*s`95f$<$QB}v8d5#1G|b}DbEw$fh*c>Q{nC1=8+DK?>uO6Ic{ zTZWbgcCVH)KPp|SzrSv7;WOIF{e%72@E%=i7bR&LQV!xTIALg37p(S^OLc{IU@2OZ z8>7mxq`}2h6lxsSYNDXQ*s> zHTxKp2<@Cs1~ZfihP`CE58Qbag9ITqS~Q`u)wgL+ng38XKF9`5`2MIFORNic?E?0J4)(zgmg>_040MNC`VuoL!iIQ5|KU$LhmvKrxUBPGAki0v z4e*S!XG$o8Vly+}yDp9YNnjgdZ-e41bs#kts!)|S@771;70jIHhc^2K3bU4vA^l$z zngsf|e+CnPKJGbTds=gkwIOqR>p6v4izd>}sEL(da%6n9JPUaBhwtRh`j3(G2O7EP z!PV;hlR@{N8v)%taT_E1`wySHz|Y>kKELL5f_SNKaDJWL8;&sF|1ok;Cx`df>EYKn zVI?JEZGHE@4=#QmJmV(&chM-aE^Y7GNx7*PZmGs&-H3&CP#)YJ3n zBJjG+6RD)oyYycSLMx*P zV(2-*QPEyp_=iI02*k=dOO~Ol-_p;0GTU^G^J&)WdWwMz;`YA8mT}Ldh;}Mb$#riM zg+vKK_JUK47`8k#qP2g!+F6m64O$qAb!goB zEERC9oh+Qzyg~oVpkgwCq*q=PJ>gQ!a?pRbaiOZ%mC9*A8#jeC8R;ECtuIh*Q ztgKJ^6?giGWgTF`5y+rBAcJne9x(pJplzTXsI>C@UkaVkak^7r$WqThDMOZsW$;Gp zK0H;GWp`VB-P4+(D{|z-z?C~}qLMb<@od>i4L4KwGz@wC%&{|H#m4vIVL@1M{y|BT zsd{ZsRflkL^+VzGBK^FwnQ`Wsg@`8ZfWLIxiI0FLWF%&EryR;S}?WOigS%a=t#)cvQ2etX#)&KB^i5|8We_z0KfK1)ArtbDKk^6OEo%-%Kw5WMp z9M6CA#~EJ=0qEhhvgx66Kv|g6D}r(Vq^b6jv^r6!vo^}AWxDqY#%d>_l{O_~jBn== zA`or=`fdGn?C$pUZr-)+=hGp_t5{thaPzt0P}W^u9{zIqwC}hV{QGotvvmk(wIN@_ z@J5JG(D$<|^MDS2v+C8OtGBDC*BjW%Z~rv6g*l8HiPxF-OROXI&^N#hulUR1Kd!*6|cQ%mu|eJa~~ zA{%RKz;cUYz+ESy=K=|R*E*4&C{oN8M_%_HP>)jCSKEw1i$z1LQoHW}OxPNMz^fry zY!^=rEUz*oRW?4NL#d)V9d31|Ly*>86 zk$W}qI=z-W>+Z8KZa>wiZE5|t5j5??v`Z|QB-v_9&Y7JM%YFoV#A=+Ji!6*61XK)Q zkedJITm`cw*I7yf`1fQt=+Mxj({E(+ygTgP$-ARh`IJH;p|LI^)LvM71gU0Qn22hL z!&>ACu}o5v!@Ya8DJrlh!c{IBx_HvOEB$%QB#0T|-{dg9jpA!hzr;V>EZXdt$8dGw z;?C@Hq3dC!T0M1S{#v@!F+l2sK{Po<5+mQMQFFzxxYg+MA?NPT`2)Vo#7NM7D$twI$7yqNQuo>Y#_84}KYM2SC3Zfg zxX>vmb$rG*5t=?>#Rp6dJbo;7_SQhE&ntF5b^I#IIsej}F`(sEyTg_c{5UCgbj6Be z3dJ{`B-89bnK9+zgR_v@zv_bt*Y?3;>Tuj=$YF0DGqZ4Q3pi}G>7CCWt|lHAd>Q9M z1=kCXQ=jXpS2i2WPC2MohUGGcS+gX-k6V2$f9M;y3;_8%q{}M&-}L!Eb8(tU#zL=f z4B+^ro&P!lX>SGsJ0QuM9-b;sEU5r7(>J1RWjqxBlWZt;My+$G_BbXCL0<#G&;HZrSpTbo9SDy}G~rc|EyYbdM2RDEO!Ryj`5UU3?xM zUf->51Iy2sQK1LHDCqvK1@#}UdnR>FeZZ*V+I<|E@(6wQm!Lfp_>z!|f*n!j&9uK z)RNMQ+RIx#`9n5Wx#$~M;Q^chwiGQ5#xIama;;_t^l;MMR!($j*r0#AkhqG{)bhmQn5Fk4HYQ9fmv6#H$)Q$;Fql`>D;nW@lXcmc`lqj@~emh;QXnc8?Z#XJjn;vQ0-+cx*5BU58OTe^W2 zsQt*7^fw>|mAsK%4$QoF%0g4q=%$ERp=d#DQK{wXy*9KeI`m|5T;v5A>CFYYlnH6# zq9BKlraHJIND-;-{Bu|&_3O6a^T5bskSV6+uM#!*wsk=_M?>~Zv)$)_@G;SqX+a*s z(w8yG%vR|Sf7ZErs4UTDyRIU)-RLvQvI-8VcE<4=(59K8A4~>sW0U=o6>SIRZuj6@ z19<9kXK!spp23EK?^ZuQLHT~HH7oxIk3!W|9JaU+{BQbLerje?Cl)avc7pJgdu`;w zJ^BHAy?)stI*Zg_*Y8T@UT=)2?cbOJ(xm+WfN#2YOTtWn#E78VL{s31$J9Ax7V|dGk~WJJK&gDT+>X4yi#~ z`5jJ^5`~+^7~tT+yuG_s@_8WWnUtdcm;xZ`dC+f(Wm3NTpm-@EjqO$a?dL422jLv~ zp+m%zz&!4xbd?-^0A{#yvfZsp!H9`XjSWVLoMH_XMtfvqM#rYP)f?$eh z!iY@wyg|z%J-i3s-9n;t;%!ujcJUnI_N`aslTPXuxi2Eozi^Bc#}f(nkIaxCwfg0e zDISU`8pva?>DfqlvgxQv5um9W%iy8lIn#GdLOc()m5b~{1#$+(7hsFh!uRAUr% z4g}_9z>KipW0V5nml}nuQ3RuYgY~#@VMS-ZTfP0EYjqDCSLthBc~K;d1hpt!ScY+& z<9RR-4!8dmulsY5jewP(eq}Q;-S|$ST0{0J{BsRz(C;li$q!BD3Of4db(2^dUr)UF z{FAZQU!jR3sD9YwdArZGgm&5Ge)xC3Kg5xwm9iFg@KtES6BFlEf&(?O8VLP`1&JQ*57 zCKA;soN%S~JDkEJOHe+V)Jryw7ZAfFHHPQOxI455V3jC)lIq^f^85N63*V(`zS5V@ zEb^c|o=?6lvU9y!duiU{JLY&(%)LzwN=73Yd}-x};WI>&xgDa8`k__!1>{WmS<6xe z1!}V#5o#47N3t^d9fclB-f@+43rq2=;~-d#ea*2*@HUkMLgC0>v~raSH9McQV`#A5 zw9||fw@Tl{EGyw#5*9-v@%L1Aa^7*7S^bO^eH=)tMy0lRxiFpI+@P)n0-XRhb;Nqy z3O{rF^%gXy8aA>g70k9Z8MMC^aW-Bs!;wkiAsW)CjA*xiBt-Yf(FZ-xhag4R^kDB+ zBDGGmyo4JqI``E0Q|B-yhJK-7(uEDXxJ_x0uE;9OFZjtS65+6T?^jb zWG%%14`28AT=}={4LeT9w(X8>+qP}ncG5{Y-7!11ZQFLoHdb)2-`@LFJ^MUWr)vEH z>&-Pk^E>ApW6+LYk)U7T{*C&PeI?A|H)=FVU8Vw_RY@YIp+m3vH4GTJeK_6E$1nP( z!dviVGWZDSZYs3DZ*|03$t8t_{(BPALDef79aL!*8FT4h+h0XklCw*#BWET=(HDBs z2^BNz16pt8h1OPjuFTAO_nWJVy5%v*&lz7}s60cqvGN~kmK1Dc5hMzi@UG6d-$H&Tstc<+;D6jXjlAMf8XbahZ}%{XPe%|&<0~-3$MrYWo?gr_jX`6 zez)I7OLel5DB5FB*S|l14o<6I&p+MPTY9$e5lNIcdOx6NmbqCrQ(D@vIr@5G^Luyg z!tYB)Jy8YYV+DB77?hbvR`HEuOPW5Iz3^grGWfr&JU4Ex6F9Hz1tX{|{U<58@JtD_ zob_kn2((?S>r*g*FCPcn$%l2n6MDcn+ds=Kr&)1nd(1&NMvYt_O=Y^)s+50Eh!~ZC zPAkA;C*Snqi$?!N+0l-#X5)loT{@aEynZ!wZcjG5TLGoHIwa(C#yxXD0FG_t$DSIlA33J5BgY?O^0RtZgPH%jcqtM^u<`KDKK`lLBx*gqZ zH~6k}`>z>e-a*-8&|->iW=X*dM+w?FxND|#Srf*HmGRk+2(!cBL)^i-Zg{}8`8s2= zhA5|5@1k3^l?^ud^-3r}7zV9@h>|ifTpA=4AgP#UMmd51x`uRQY>Si=?(UUUZg5Iu z^IhcMhNO{Na-$RbB=%)@iE3^S{$+?C9B9bL9%}R*KIsc+=yN1CnN(tV?L#Rs zRB+-OftIDb)Lp>ZYyS?(Na3d3r`uVyfGByFr0@jaxD$hMwVei$`wf=AG*|S3Y7?B$ zPW}@IRfs|)Nu)AWL38u3gz}s^Ax*d??WnX;!_kFNl7PcP-O%!fBB%fAcef&YI*9LWEKP>4@)Yt|mTIHm!3(|pdl zYS1P)dlP~k-hi!H%KKZVsJ~bY8rGAHXiUcM^cg2N_fM~l%`bmDN5x#CE2$=Xfe+ue zYd^c|oE*Xce*Ew0u{~m6d$&)$Bw^soEmI?a=k!dZ+yr|owNAFN&yDj6;4jis(Q``h zxn!a4Lp+uo#vc4RQ2dD`=^(gZW~dGgTDGWn_ag0nW6(2WTOpJLGMz7(3ndq_Sz>+N zk^D_ z=BM7jqS6VzGbG&63100SH3r#3wq@;H+@!f+YUK>T2Xbh)lqyCUmuD_)WvDFkOv&u= zRs2?sBMSK>8VLEdvK4n``Opd7O4&J0(-WTKxtDYCN53@06y8vhX-oru9CydMFAg=t z=Me+G1sg}%qz)F1xvqghi&nlX9Lf8rde#Y*;mD&jK%h-37Px|-;*jx7_K+*T$) z&c~>BN~+)52){@rAa}Z5kcsv%Ci8%pZt$z%DzVv+?9rBPP}CCf%kojYW&>!Pg|*wU zyFxI1$3nb<3qoB@&7bQUp!IBJ&kthe0!nFpp=f@w&xXur=k&4otqPBI9jHJm00Avl z0RbI+9C-Qkn2mDkVe9hl)5q+7zOJs%H+%CnhXFie_7R?_r>K2GBT;d1GB@*W0LWEd zw!>wfQs|QL-a-^4;J3p0SO!?c6_HrU4R1O3A%2us9H}i&AS)lZK^psw6x&myTTpEq zq$MF}zp(yxKs*&%ztc%eBs`<{<@ynd)HU#YNH6{!niufk;f5XFD4!6zoV2Yr*01` z{g>X8oAtWu_uSIN3gGJY**>rb@cAJ06WBP1s6)`O`D5Vxd;u^8d|fcoHOM&gjHf_j z4}3D(EfBE2u<*F&ZOZ!vk3o=^7)g;v zMxqkkwOSR{T8Xa|TwKPyPL^$46_@^xi7+W=@D^LmWirj5pWx}EG|*{6eytwY+g(sP)&aAk{qei^CmWHI^x52a2KzZL{+*K=s(8a6Nd0>Q?308AAYYbfMkq$%O z&!7$%rUv2RC=%;WA;*zg4mbU%zEsvRgR87V0Rg3=R(!Aky%GyX?nJ;37Z$b?0XH)_ zj*F8>jlt*y(H!g720N~Z9dupR{T?}pF@!BvAWW8^gK_%Az;l4Np>oTkz1nH% zBD(B2wpVQZ0#DuyDlA4RYW1Q{juyTP(qWM9G&_!Sg^@x>80IVZkrX^^hKg>G7?Q>J zuH@3J)k;8Nh>k>;w(|6CVp{V{UlKY$hR#rN?>vYwXm!V*10O6K}L*WK{x0!cpd_qQ0dE6L9Eu z*KdgOfW`3X_x`I#)T~hG$Rmr!OJnxTvVu3acdEp_zP^(k4qRAClxA6^_csd^3}r;y zWjWvh8wXBKw9uQ+*!)V<&+C^QW*5)o2#k~YB*)!0Xm6WrXW&Cn{L$5r+;F*i+!1@k z*J&D@ak|0UZs5e%YV{XX;HtYF;(v#Xx_sh>1U!(*w=;J(LYL9kZ_99QX;(DdkfU8n zDO-@67Ihs_z>pD0Fc&Z1KyRj)wi3JRlAPC^F}!Mz6ny&F+S@qbx4!DA2_*dV*?xXz zWK68_>^QhRNt_D|Xy0)DW*m9%|9rT2aC>yW;!nhb!Kh#F80hcr>HqiwnDBo--E&%f z?r|#8Mf8V$z9t1AkKRhnrJt=vhf=5*JKc^SithW$6Dh@{(C&CQm1*k_XbrCI}0z zmC7Y-*WHK+=f*#tO^A`>PRd$r%4!(S31iV7b+!6Cs-kqjfuD??QW~(@7&*2JUAWU| z+?T!VLIB|@NY~ohcT=sAC}und6xKuDQur_j7%`8%d8zxY96=>kK~iTwM;Urf_pEvR z^l&dC=t9?Fs;EN%E&h&@fGg`Aw5u;6bjM!hjN(yBLRvGEB)&W=*C>q+hJ#cBRPhq# zL~3#~VgV~Ruo_EYOeDdytR>6umSdJfTQY}D{Qd3*V6z2WRTxATV_PyVEkCnpahY-{ zcF1e>Kj4Zj=i*f|_3>m5k5lhN{(l>4 z^(0{3EaVN;1j!TBvWe!^;9^FsD@5mF}YWOW&)m3V9Y=W%-?- zB+M3!<1huV7UBWRmHDQ5q}O1U~>tL?}FLkZUXoxKDHp{02h$<+8n z=F+bb()dzJcZ^`V$}2v=lLoY2T|` z)K7)GHVB@8dr_T_9C4vkI0y2rhL9aAUcpBXU5bZX1>C*iCJ2HA20cis3F=`vMZ|fQ zI773gp9|K`jvWRavLVmrN!ey*O9IU^Xt--C^d?Wy9g)K?K^B7}nJ619a^5NCqDhsD zL_jF5yUN{a2)eR;_j$9p*tMWLT1zf>)-E;3q~rUbkIkA?h*rXRbuZQ+tzReMZ~Ime zzF$>^<6LJpk``U($!ky@MB*UPMghB>E-!4jo6Awf=$kQpCGG^9h&*}){ucrRG$#$T zNf}KiW}dvx=i&*Q{WUMU%l*k-PPVZNNrf(4C&tEZE9KrivzS!e1HF zV?0#PkUjIj$DLue)GUog0Z}|!U=lU0UKak7$E|q8%*Y*kR|`hJ{GsFc7v+_B{-ml8 z=+T}a{(-hF6|<&(-DgsZ55^*6J+j3&tBp7qonk)Ikvv1bZN(LDUS*b}l~BF0&$DWP zRIAU)0S#2XnA&sl{BpXl-zMm`M5*7!YXx-vUKK%KI0N5K{0)j$^MQV`6y*4KeY^X^ zrxzK65%f_IJckS&bmDObm^by;Z^Bt5k{QA1{_XT*ty0(!83R`RcTPA_Ufv zl-aRAA5EMNM$=d9YtzIoFAWXl8}(4khR$D!9zqpqr8HXbaS_zLkU0{_n!GXi$1O*FF~vr8P(=o$U$mE2nT35agl-5f2IC;F z9j%{(qpm}?3OHMeSQf!r2;cBE(CscwG&>xtjOX$KSY^!OC_k8u2v#}$6JJOoEygO= z6Rpn!WV&Is1l}^h@k~mFqZ$+o;oolAC2j*6sT+(vk2d2#i>M_^(u#Mu|ufj^DJ7if%I2MPKg%+CxJo4AVxdoIV8*G2}yxL5~I2bIr7s$K*JPx zcc#S@_G-kZ2q`ngHmdojuDiC(4HD!nZ667H%|h4qMa(#t^i$pys_rV`DkNv~hNJC+ ztDWi|dFV$yF4iYQ)Ui8sjEhwEkGziB4Pcaq zY7?ptD{Jzyoa-k}a;$z(gGoUgfFCzSC>HiHNYWSYYQPIro$q?g?x9{*T(M?_2$%*h zR*F+OM=NgnB$Kt=&i%cnHcP^CNkX@E3N@v0Zip zAjHVpWIs2}HWqUdNm(*2XbuN!rZVvq-?Pv*&um0(Y7iY=a|e`MNAWkYdmN4FfDx?~ z(y-)GQuKV%-H`DpE;yrv#pDW?mM~rdnRomctobB9Eum-OC?;=&vie+F>GwCg;IzsT z*Ih=NE`IzgB0@*QpB)2+4N+P=7mAr>I#DJ%T_XTyR-^r<+>kEZ8=dXdsi_w5h|)7u zr7zZ9ZV{B)$*%;ZFQonzuLy$^6xSlKQ9|HW3{@n3BJxwg{RE}~Y!-v_D6 zG)CI^AGQRGmjNG$?w8Zjf*SBrE;P~UK(_l+k9!{uw>JQvwv9l)PAZ0pp-92!K!W87 zKuO66u-55~>%S9iVj)w=#+INlpf3mhRRs6hrw-zYY zW5?&{Dz>7+@WHQp?jAU27bd%3kMz~I?G64>vBhz`Vk!<-8E+4xm)f3}yMI;9^VhhgDCnBT1d$d9t^yF0uGGsMoxwng|cAOf1?$$Ll0?!+!sleF`4Rz zfX#aB1nD4sOf8M;jXCp8Tgy2jhka*_#rW_UKD}SE8nJnnCy^c-MopUYyAch-OLa9x z-ld9V!BdzEvw+7A=lRT72POb{=ssKPI>-Qnux_t0t1th6Gt3R!aC%_Y1>?TbQ9FM|nE zp@Vzz{9e#o=nP2jQdB{dfo5}f!&8*=X#EGIPBA<D`vax~Bj9UiS9ghB-i_4dbwI zy;`6ZXjU1{!FJOZvU^u!@4)YLtmBRjdiF_@N(s&a8-8MmJY$-Q@Skzx8i{3Rp2bhD->^diuK%7L2^$Y zoT9LdeL>FYkwNGQnM?TMm-;X>A6$Frt1^bGz&Rg6&6DUd*t(A&kzXee?9k+29vzt5 zA^bzBr5HOWlV6$`@_mva1yh(>V?I6+@8V6KfRBNLy({xRUB6jUGZ?^uk2Zs6=m#Qz z86Tap`2+u=0@QEO7(X#uU!fC1 zgntSBpJZQ15S)XS8EPXhCE*Q@Aa0iPV9q>xfJwWOozkSwOgvUhZg6*V6UDibNQ77c z*l9i=xLp_^z^T$C`r`V0ZPnl5=jVTKUCUA^@hgAb0t`gR(%`++XcApHD%R}yZ&pvp zP)v;PTl%~Dx3&fR^KktU@NwI!|Ft`B@YrrZ^3Is%YR%rXX}h6Ff#py(sOlcDU(46M zxvK53e%yjeb!Qi0Sxm2y2pO5-gL%hm|6A8kU;o4I_&z&(M`?zP-s;^l<6>ldedr z1I$e&B_;my1mq=L`Q44nNHDhDc-0Kff*=m4j8KLY65Wy=uC^0-=|U|@SKpuh^e2S| z4jEV(JyhqbQA`MvLgY$*WUK-;R9#F;rP;MpXemm|^5fG*v z?OQCVzZCVm4!S=5`dTK$GA7SnP!%De5}#WzEOIn=t*tE78uJ;ZS!O?t%Hmut6t|=~ zANP3NP11%G^vF6GFEtWaFz3sO>Snc9bSa|(=%5vsxQ_$6fk-14R?qeK4)|zh^%-upVOiD*`pD3y0U8v)`Ei z1J>2?AFxwk{{egH8)Qe~6tc=(k!9+I=>~mYh7f8_3GHj5aC5<`(*=om5p6c?kWVB2}=JaF2ov$lmAH+W(bG&8to}3LTU$hN#cJy-uKi^z>-Y$)MdbGZ3yV|c-IL|Tq zzf`!>4OC|g01mWmwI!&U$*=3WwD%!h+PiAa867Y09{)tGb5&~Q^3vK`w~_vjV+jvN ze%I&R$JXwp13Z)8xD3V$7$0rh@1h^-4YqUI{35V>7^BqnnfS(T<=UN!srvq;n@Rf; zw_+~$&2%vPaEkE9Jjus8e)~Utmz*Ub_AEENw$Tb&DMuGFe${FzI$CKa{RmIT!OZCY zv+2Lh{Lw`w#x7(#H6X)YG5B4}W>oby&pT2+T=BBX>@*cZs*+;=VwC}8UzkLTmpVcj z)z$$XWV(G-XhTQegNCe}^wD6$PVpWQ_Lj9jMy3nw?ag7)#PxZ~!G;1)_C$OQ6goaL zgcFVocy~8$rzH+Kh|Th^uUZ&!&fk|L_@wW46F$_Lr@|V@RUbckV9W-`n>e`; z3|-j6t0EGstYgwe&>cF~cWqr05#~DXP<9TiFo^uD?a`~OICQAZ zz2Sob7l2pvx)?FKhU&Cg@o>Gr44PB7M=brqxluE=?bZ9z&wnQhzlQWv+*>hxH*|W% z63yrYm;djO{kfxHDhWSa;~h)g#c#>-^fJ>5R)m`5GbbRHrXnQMVI@4_klUSmOuj+S zu%S*tEWj#|Gb8AWKbQV8m%BqKFN}W*|;HFV78i+LXpwaE~@X( zyeYTy8$c`yl?g4n@sEbwJ-Qvt9UHxr+p5~@;)_FCm zW>R>NK9Aa9jUobtGO}`#$8EE^<3oth7f55#x^9rS!-dkJqpON3@+L0ZGx0;v$UJuM z2A2B7Q1Nhrj?y3=QHkP&9zwRllj_(HHbOrWWMJ-ys|Z@CWta&pA-uOG>=wm-9FYFi zB?nJ=x=?B9HiZaRa`gU5BV0~O#JGg+Qo*EGWWhq4>@#WXIYDTh!Tn~H>vn#s!61v{ z9X-3eMwV5+v;e-9kn@k$ta*$>@d@U6OneR`sxa$91A?lo=-Z3Y`ol5f11_%S95~{f zclrgRn6;6#UY?;ons97{622VX;*^ro^_Iy(fXV2-cwp*xp6rk}%35rpwMK+BvbBVb zUuLHB`$f{thiRPJqqu${iDnqTPl+dPPG`S09zi$GT?T24#A~&K@Q09uJXaMb&Ie84 z$dc{F3`jE9pkDQ&pn^M0p0cgN`b;$;H3yjCEg{tb#bM#qDkI7bmr+}! zGmE9)s5h@V#|=l6lYh{=DOUaUe-nAFuycF{W^BpE3e5FQ@lO(%qmo$n`+0(i>$49PyoJne6^*`T$rnZwd+uehTDXdvvr;+)k`aWvR-zt|B!!B6)V4 zGwuMF3+ZU{Kc6_?895|#J1(F0ZciPajt4wCume<^E5--x;#*jTmRXJjF~OBn!&H0r zxnTlsE5(&@kJ7R3rylsvoyXkWJ9rM13ubG){oW5=KX)CP+S`=zEOz%(w9Jxw*_SIP zM3iM=QpwVL@yqHNM?)mG@a$FP>`WjNv}mOzA->6rpAv3&p)qVu zsosLQn~V)$k&vK6;sesyB^9h@o%;haT`u}=0__qavC?MzE(5?r(@7&7ZHN~ZQt>Pl zI+O9`WMElgokRt9lEgj->VRT)ZGaY-^i!n{xlR6GEg?%mGJK*Jh3zwUUHvictkOgg zsWmACG3`IN(^X+sUnxxja#W)d?E3w~W=ksU8V=f?OhcI>FXzyRr?|@s;&)u$8oP7}gj9XgR-K=#bvB3!bLyoc{{HH1>6dU<>9sT49FbNZ&CZEs3M~k@KWgP$ z;LRrdO+?Dn)pkPm@EcJ-0{my3%tc+&xY)@v z{<_R$v2vd6pH6tRel_B^bO4E&@gN$0t$%zp;$P?F5(VhfKLPwVUEkkZ_5Y^MgB_3T zO?+H_zTK|?o3W-*hrU{NcCHfoJ9u^gB1<;*W&m3b+@B_GdP{tWc%4J&y7#Xwhf?TE zR``TA-er@BFc??q0->eK6N;b$@3(%>AAx(V`IjtT4BLUw4g-T`&d zWpY14Og9Mn&RAfeX0^8v@SO^gibX*a*ePq6Nc>FwAXJb~n5$7LiRTb17Wt}=9^xD8-y(GWty_TuFJDuqh{kxW@b*z z{u_x28vDzbh=#nw0vpFj@VKYGD47qVlEWZpcNV!HSjfA-(HB) ze$r4b4hVBi#-3A;8^}UM&?6jCWNOMXHmc}1ThI8Z3a02DbGzqAma8&iTyXz!Be*2y zoviN~U!BNUBG{1X%;Tlq#BRsa#JSdX|6!1w7w55vBg?h-mD}1=Lo{aC3K@J_&WptG z9JRPfwm+yUjyr5~(dV$O6_r&%8oc!C9U~O_%-1?r2>v62oW|Al4AJ>QgD)p7nXjrR zN+CQT+(hWKU6$n4o z0EY5-;tx;9fWIrm6V$1Wz|YJ~A~Kq9V{vBJ2B9O15Vs7EeC)oWmmNVP@VrIGCAK~V`8W$x`WUxbN2-MLic*^rN*ErQ?Qq`y>5n{JKM_Fx2 z-Cl3)ID`W9BU4X+1ODIf11*Ugii#7rpRcdC&qF3H8$;QHGlm>+3N#G0f%w4Up37>% zK-~oES^RsWPaMYoPZquaj63ubdT`P!#t&+TY4TSyo_iQ23rZypZXoZAUWW9}RbwY& zhb%sG#PyuJy4v{vLC6Ry@cHN$DAdvAom;JO0HXO`Mp1tRj6%xue-H|;+o8snIpwlt zvWX8YH_9`!!>JV@SJC4_(boMH;#L{&rO^mPIP|v|$$K>g6&lPngFNOZ$eWT@!E_h@ zIgAfW!dw3!GtOfU*Q7|YvQ`R?3468C|*`VW>L~BZhLCGxbQ^YLyUBXI%lB2M;m8o+^ z#0g%UW)4+2_Tu4TYDSeM!O~8)g#y>!DR>u!CZf`VB8}SRNrF9tVL!=Nl%@my0a?B8z zd0N{&!yu2?UXJw?UxECc>dCPK1X76)&bZ@j`GAg}HqBQpORZdLNNWmwVu}&V^1hT;d)BAwudvQu|3eyiLUSO`>t9oZzs2;QB6|yJ;25F-jy6O zpO0)UQ*n>EDGmg{8jz6DRq!O*YZ^hI6qx-_6w(5tFmV1}!|1;d#;eZ(3+v$hfKm8l z&{QuKlj;@)PVR8G7$CMcK>_Nw0z9VWFbov6-yANp&oZ9)@l$p>N%ZvnbOSj4b;YG~ zPJCrgg-A{P+u_Oz969M3Tqgat;^eNeaMAji^%4{V; zWw~Id!(2UQu9LugG$E%UAmR9-!2Xjqm>#ty8au!S$*&mVs&KB zm&hTQ(jFEc5mlUREpS|2S|zH7v~+HY-{02e#~>peic{I26f0_;IcL&yd$Q%t%`@B&Z+}lKIvNUcc5DGJfTqq80b5sg zZ)0r+Y&jabousM0iMP)U(bSm>jc+0DEPkd{iN%kvr*FiI5gU(7kD$~O8iEr4)RbRg z9I2dB-CIK*_UKI6WwahHoAZK?Mek3v&zQ8S5yoCMq+L*!UC4ajLR+F2!<$Knmafi_ zV#Sc3mgb^^k*Gj>w>Pa(p^awetY|p4dFKK3yL?RNrwk;@ul}PB5YhLs_-Ph4+s^R2 zh?1{rZ!FA8TQ4Av1kP7xPs~WJ!K^Mr2yfh`*}Snfn?&^1qH-oHb^%*DY5ONm)Ml`j z9Q%+u%;V`&A86qZ`sUG=d^lEO`R9^?1nmv}j!921=(ju$y z-XuYC9;b~aN=_jYtFFadsZ25twMqW!ri=ZLQC8>7XwXHdu@nUAZ}Ft6k3}Ia-$~{- zyhg?szXKk_3HG5^=<-Ea-N}blW7&oihfsgUJTRnfYNr%9akSES!8-sNu>KghR-v!s z@*VbS0;0}(a6WoKdsVlSX7Z&96Xs&yaV}7hC^#_QMa~+r^Pt+SFRAU zj?nqSB1Q@R$)dsf^(D^TZ+lW|{^~B`D8r7Yw zze^U=1hPa@#Mn;3&|X+V?xRItzh(>;)WP5_N0x{;?7JOe{y@sbyU?$_kQ2gx_{9i* z)A^i(UYB`U(9U8r@3lyd+r{>ai8GzrGto4R6cXxL=LRlCNHohX&XmnAd({}tP@y0> zDd>t_WftP;^gtY6mMd!(hCY84SLEQ=-zYP2&X?jCNN&j;CDHxiO5qp6TTdXq%)jc6 zo8&4_8Vgp{AWU%IZCvbnF$MUS3}cB2}C|-QIq# z9NwLt(g;ce`B{t=r&25{#@2YQC}QRIRQ;)Enrgp!k+&@2Jn-z=+TIe>WBhF2aL`;} zoPO-QZCo|#8vFp*kd7a*F?1UxzJx@(yLPm9`aqkmosCdG2MTO=3pKhr zLWL&*BA4j1{*lKDJ{rAmv1M7OR~{$*ye8w(pw>*0eieN~GPmyPE<@R7Lpn98=c3TB zZ98D)?BY@%T|8b!zPwpE^)mc&2zt`Avh(cy?i<#Uq2YhT!0&oK_AS_5l|@>Z{8MlIU0Y}JR5D#X@~-5YCu>3Q>mN!@*`D4CV29fjk8-n|u9C#1 z@$Kr0`0T&eSYjoFV-|&x(T0wG+NOx*L<8jDvoO&Wmx+nl#$`d2$7DJ{tOeKWP@7@{ z+#MoU`_6#f$mIyMZx=};Z|k-C)snmOfAHF>pie=uLnaDeUM?h*uISN)*F$k~?=A_L zypd%St;z&1?^#aG3$^Ff@Qv%wLP@1f?J=`Sd7Qd>RmO|s4-=0xc@m-3Nl?hm<0AA^ z)zw3a9LBV8IF-A`@zSR8y09LCP^jDR;@+elp-;Ks8qxhk6w+lYSPEdgB;fNno#%0|IJbDtH78uxjX{o9gw{GJw^%^v)0Vmv%dOnp%90ABNkw*)O%hi33T<&7K> zkqKVE1;lfM*v~2w4i9m}4Xru$?ZxGg>_W{_^A%i0gpB9to{jI@+1QLO2ZP@R=RHfH zJn+Rf3Gfj98Ym(lYET!}0vpHf7Pd1o z=j$VY+B&QKyT=^y?>!~-*B3FBHl9uakByp%Pv__6omH#1E5J@iAmT*8{ayW6rxviI zkiXf-!+R^S=_J^b|8u)PS9MM|qwj)ui9XifmY!~(&hGUE`&N@ zMTQ~~#t@34ZR&jtdP)J{j)rcbcU`<;bqVb(pSh6I?b&!`Jd7BCc0@jeCJ5sWGV z2zxQiuuyg$=CnAq38}m{F!nv`-gU$V6@~F^Wl1}0eqK)7EvUvydrQ4RvOL_FvrA4{?DBk1lxiX;&v;G zJVO1Az{$l^ap|+++hbHl-iJ;QcMkt&gTtUPiM9k%t4`p$Ml=7nUsk6$W z1n6@yN-Gl9UJnVkKdi+9rK$2ddQp!1CC)J*Dws20aYFjX2OL_qhy<*H0hwy5gWP?s zl-iu6(kI{sO5XNyU0e@KHvEPZ?mdHSf0+#3hv};f4{w;jew{^I!xnq^FJczY+0Cs^ zN#^;E+?Pw4OOB;lO2)xPm4I0G?R4P8K_9mc>isT(!e>2#I}PL3Fb`uo4SGwi1J5kS zP(DI`O4d`G)xlL7v5F+6t7|=0`jauJBnZ`cf*{G+;<;!AI}bZntXxz{pg=HkxQE_C zA(1hO<;c+r@nZ;Eu2!l(?7aDRteRdYX?l{r^)mUOSE|egNsG6{G0c7DSw(pA7>#ct{;p5P@@`1nEz^c30xY;IN|xPd$8qzO9T32TNHSurRl@GYS1>;f}KgP zeH>Sm=kv;Qa)$F+yVYDTjw-6SfIvW;V}fJi)>Vu9SL;`RSAm@W^X2mg(TMxk!<)}b zt4_88m9Gil{jT+Hx((w2aAp7Ow9Xf(`&=E{7x8_pq^HZfvy0o$+yAWl>IvZfwcz0^ znK|PRecv-^=SO%;ZYjdHUCS9z1S|dg*9&(wLT(sAsTO61i#r*9?Ibq(&n0=LO0w

    T;rwGgQw?637)NR=k)6WGKS- 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

    6v^t{@rlyW7?J||Kw4b)A_?=Iy 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


    SM#F4*( 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⋙7lUtm>E_Zs` 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

    -ulNLJj~H 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

    raV+N~ZD@2jYHIPHiN}mCdT={bR9$hHvRdej6K- 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�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

    E3e8sUZ7G?gGdDSSb&UmrI;wpE<_s91uCt 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⪙OWzA;!?jh{VImf@=?Occ%#Zv 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�NBL;PYdj@9<6u;bW*ml3b^7}v%QTt}-1 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