diff --git a/Cargo.lock b/Cargo.lock index d6b747b..dd7d2bd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -95,7 +95,7 @@ dependencies = [ "accesskit_unix", "accesskit_windows", "raw-window-handle", - "winit", + "winit 0.30.5", ] [[package]] @@ -113,6 +113,17 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.16", + "once_cell", + "version_check", +] + [[package]] name = "ahash" version = "0.8.12" @@ -332,13 +343,22 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" +[[package]] +name = "ash" +version = "0.37.3+1.3.251" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356a25ecd4a" +dependencies = [ + "libloading 0.7.4", +] + [[package]] name = "ash" version = "0.38.0+1.3.281" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" dependencies = [ - "libloading", + "libloading 0.8.8", ] [[package]] @@ -427,6 +447,17 @@ dependencies = [ "slab", ] +[[package]] +name = "async-fs" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5" +dependencies = [ + "async-lock 3.4.1", + "blocking", + "futures-lite 2.6.1", +] + [[package]] name = "async-io" version = "1.13.0" @@ -755,15 +786,30 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec 0.6.3", +] + [[package]] name = "bit-set" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0481a0e032742109b1133a095184ee93d88f3dc9e0d28a5d033dc77a073f44f" dependencies = [ - "bit-vec", + "bit-vec 0.7.0", ] +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + [[package]] name = "bit-vec" version = "0.7.0" @@ -1037,7 +1083,7 @@ checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" dependencies = [ "glob", "libc", - "libloading", + "libloading 0.8.8", ] [[package]] @@ -1100,6 +1146,26 @@ dependencies = [ "objc_id", ] +[[package]] +name = "clipboard_macos" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b7f4aaa047ba3c3630b080bb9860894732ff23e2aee290a418909aa6d5df38f" +dependencies = [ + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "clipboard_wayland" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "003f886bc4e2987729d10c1db3424e7f80809f3fc22dbc16c685738887cb37b8" +dependencies = [ + "smithay-clipboard 0.7.2", +] + [[package]] name = "clipboard_wayland" version = "0.2.2" @@ -1107,7 +1173,17 @@ source = "git+https://github.com/pop-os/window_clipboard.git?tag=pop-0.13-2#6b9f dependencies = [ "dnd", "mime 0.1.0", - "smithay-clipboard", + "smithay-clipboard 0.8.0", +] + +[[package]] +name = "clipboard_x11" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4274ea815e013e0f9f04a2633423e14194e408a0576c943ce3d14ca56c50031c" +dependencies = [ + "thiserror 1.0.69", + "x11rb", ] [[package]] @@ -1128,8 +1204,8 @@ dependencies = [ "bitflags 1.3.2", "block", "cocoa-foundation", - "core-foundation", - "core-graphics", + "core-foundation 0.9.4", + "core-graphics 0.23.2", "foreign-types", "libc", "objc", @@ -1143,8 +1219,8 @@ checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" dependencies = [ "bitflags 1.3.2", "block", - "core-foundation", - "core-graphics-types", + "core-foundation 0.9.4", + "core-graphics-types 0.1.3", "libc", "objc", ] @@ -1243,6 +1319,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -1256,8 +1342,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" dependencies = [ "bitflags 1.3.2", - "core-foundation", - "core-graphics-types", + "core-foundation 0.9.4", + "core-graphics-types 0.1.3", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" +dependencies = [ + "bitflags 2.9.4", + "core-foundation 0.10.1", + "core-graphics-types 0.2.0", "foreign-types", "libc", ] @@ -1269,7 +1368,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" dependencies = [ "bitflags 1.3.2", - "core-foundation", + "core-foundation 0.9.4", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.9.4", + "core-foundation 0.10.1", "libc", ] @@ -1279,8 +1389,8 @@ version = "20.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9d2790b5c08465d49f8dc05c8bcae9fea467855947db39b0f8145c091aaced5" dependencies = [ - "core-foundation", - "core-graphics", + "core-foundation 0.9.4", + "core-graphics 0.23.2", "foreign-types", "libc", ] @@ -1331,7 +1441,7 @@ dependencies = [ "cosmic-settings-daemon", "dirs 6.0.0", "futures-util", - "iced_futures", + "iced_futures 0.14.0-dev", "known-folders", "notify", "ron 0.11.0", @@ -1399,6 +1509,29 @@ dependencies = [ "zbus 5.11.0", ] +[[package]] +name = "cosmic-text" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59fd57d82eb4bfe7ffa9b1cec0c05e2fd378155b47f255a67983cb4afe0e80c2" +dependencies = [ + "bitflags 2.9.4", + "fontdb 0.16.2", + "log", + "rangemap", + "rayon", + "rustc-hash 1.1.0", + "rustybuzz 0.14.1", + "self_cell", + "swash 0.1.19", + "sys-locale", + "ttf-parser 0.21.1", + "unicode-bidi", + "unicode-linebreak", + "unicode-script", + "unicode-segmentation", +] + [[package]] name = "cosmic-text" version = "0.14.2" @@ -1413,7 +1546,7 @@ dependencies = [ "self_cell", "skrifa 0.36.0", "smol_str", - "swash", + "swash 0.2.5", "sys-locale", "unicode-bidi", "unicode-linebreak", @@ -1586,6 +1719,17 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" +[[package]] +name = "d3d12" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e3d747f100290a1ca24b752186f61f6637e1deffe3bf6320de6fcb29510a307" +dependencies = [ + "bitflags 2.9.4", + "libloading 0.8.8", + "winapi", +] + [[package]] name = "d3d12" version = "22.0.0" @@ -1593,10 +1737,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bdbd1f579714e3c809ebd822c81ef148b1ceaeb3d535352afc73fd0c4c6a0017" dependencies = [ "bitflags 2.9.4", - "libloading", + "libloading 0.8.8", "winapi", ] +[[package]] +name = "dark-light" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a76fa97167fa740dcdbfe18e8895601e1bc36525f09b044e00916e717c03a3c" +dependencies = [ + "dconf_rs", + "detect-desktop-environment", + "dirs 4.0.0", + "objc", + "rust-ini", + "web-sys", + "winreg", + "zbus 4.4.0", +] + [[package]] name = "darling" version = "0.20.11" @@ -1644,6 +1804,12 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" +[[package]] +name = "dconf_rs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7046468a81e6a002061c01e6a7c83139daf91b11c30e66795b13217c2d885c8b" + [[package]] name = "der" version = "0.7.10" @@ -1699,6 +1865,12 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "detect-desktop-environment" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21d8ad60dd5b13a4ee6bd8fa2d5d88965c597c67bce32b5fc49c94f55cb50810" + [[package]] name = "diff" version = "0.1.13" @@ -1717,6 +1889,15 @@ dependencies = [ "subtle", ] +[[package]] +name = "dirs" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +dependencies = [ + "dirs-sys 0.3.7", +] + [[package]] name = "dirs" version = "5.0.1" @@ -1735,6 +1916,17 @@ dependencies = [ "dirs-sys 0.5.0", ] +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users 0.4.6", + "winapi", +] + [[package]] name = "dirs-sys" version = "0.4.1" @@ -1794,9 +1986,15 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" dependencies = [ - "libloading", + "libloading 0.8.8", ] +[[package]] +name = "dlv-list" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" + [[package]] name = "dnd" version = "0.1.0" @@ -1806,7 +2004,7 @@ dependencies = [ "mime 0.1.0", "raw-window-handle", "smithay-client-toolkit 0.19.2", - "smithay-clipboard", + "smithay-clipboard 0.8.0", ] [[package]] @@ -1835,6 +2033,20 @@ name = "dpi" version = "0.1.1" source = "git+https://github.com/pop-os/winit.git?tag=iced-xdg-surface-0.13#dbe91fcc363c101f1d6ed5301d49911b01a26f61" +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" + +[[package]] +name = "dragking" +version = "0.1.0" +source = "git+https://github.com/airstrike/dragking#ed2713cbabc2861682274d96dcfeab865893c035" +dependencies = [ + "iced 0.13.1", +] + [[package]] name = "drm" version = "0.11.1" @@ -1843,7 +2055,20 @@ checksum = "a0f8a69e60d75ae7dab4ef26a59ca99f2a89d4c142089b537775ae0c198bdcde" dependencies = [ "bitflags 2.9.4", "bytemuck", - "drm-ffi", + "drm-ffi 0.7.1", + "drm-fourcc", + "rustix 0.38.44", +] + +[[package]] +name = "drm" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98888c4bbd601524c11a7ed63f814b8825f420514f78e96f752c437ae9cbb5d1" +dependencies = [ + "bitflags 2.9.4", + "bytemuck", + "drm-ffi 0.8.0", "drm-fourcc", "rustix 0.38.44", ] @@ -1854,7 +2079,17 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41334f8405792483e32ad05fbb9c5680ff4e84491883d2947a4757dc54cb2ac6" dependencies = [ - "drm-sys", + "drm-sys 0.6.1", + "rustix 0.38.44", +] + +[[package]] +name = "drm-ffi" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97c98727e48b7ccb4f4aea8cfe881e5b07f702d17b7875991881b41af7278d53" +dependencies = [ + "drm-sys 0.7.0", "rustix 0.38.44", ] @@ -1874,6 +2109,16 @@ dependencies = [ "linux-raw-sys 0.6.5", ] +[[package]] +name = "drm-sys" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd39dde40b6e196c2e8763f23d119ddb1a8714534bf7d77fa97a65b0feda3986" +dependencies = [ + "libc", + "linux-raw-sys 0.6.5", +] + [[package]] name = "dwrote" version = "0.11.4" @@ -2254,8 +2499,8 @@ checksum = "2c7e611d49285d4c4b2e1727b72cf05353558885cc5252f93707b845dfcaf3d3" dependencies = [ "bitflags 2.9.4", "byteorder", - "core-foundation", - "core-graphics", + "core-foundation 0.9.4", + "core-graphics 0.23.2", "core-text", "dirs 6.0.0", "dwrote", @@ -2271,6 +2516,15 @@ dependencies = [ "yeslogic-fontconfig-sys", ] +[[package]] +name = "font-types" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3971f9a5ca983419cdc386941ba3b9e1feba01a0ab888adf78739feb2798492" +dependencies = [ + "bytemuck", +] + [[package]] name = "font-types" version = "0.9.0" @@ -2289,6 +2543,20 @@ dependencies = [ "roxmltree", ] +[[package]] +name = "fontdb" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0299020c3ef3f60f526a4f64ab4a3d4ce116b1acbf24cdd22da0068e5d81dc3" +dependencies = [ + "fontconfig-parser", + "log", + "memmap2", + "slotmap", + "tinyvec", + "ttf-parser 0.20.0", +] + [[package]] name = "fontdb" version = "0.18.0" @@ -2687,6 +2955,15 @@ dependencies = [ "web-sys", ] +[[package]] +name = "glutin_wgl_sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8098adac955faa2d31079b65dc48841251f69efd3ac25477903fc424362ead" +dependencies = [ + "gl_generator", +] + [[package]] name = "glutin_wgl_sys" version = "0.6.1" @@ -2726,6 +3003,19 @@ dependencies = [ "bitflags 2.9.4", ] +[[package]] +name = "gpu-allocator" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f56f6318968d03c18e1bcf4857ff88c61157e9da8e47c5f29055d60e1228884" +dependencies = [ + "log", + "presser", + "thiserror 1.0.69", + "winapi", + "windows 0.52.0", +] + [[package]] name = "gpu-allocator" version = "0.26.0" @@ -2739,6 +3029,17 @@ dependencies = [ "windows 0.52.0", ] +[[package]] +name = "gpu-descriptor" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c" +dependencies = [ + "bitflags 2.9.4", + "gpu-descriptor-types 0.1.2", + "hashbrown 0.14.5", +] + [[package]] name = "gpu-descriptor" version = "0.3.2" @@ -2746,10 +3047,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" dependencies = [ "bitflags 2.9.4", - "gpu-descriptor-types", + "gpu-descriptor-types 0.2.0", "hashbrown 0.15.5", ] +[[package]] +name = "gpu-descriptor-types" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bf0b36e6f090b7e1d8a4b49c0cb81c1f8376f72198c65dd3ad9ff3556b8b78c" +dependencies = [ + "bitflags 2.9.4", +] + [[package]] name = "gpu-descriptor-types" version = "0.2.0" @@ -2986,6 +3296,19 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash 0.8.12", + "allocator-api2", +] [[package]] name = "hashbrown" @@ -3016,7 +3339,7 @@ dependencies = [ "bitflags 2.9.4", "com", "libc", - "libloading", + "libloading 0.8.8", "thiserror 1.0.69", "widestring", "winapi", @@ -3185,6 +3508,20 @@ dependencies = [ "cc", ] +[[package]] +name = "iced" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88acfabc84ec077eaf9ede3457ffa3a104626d79022a9bf7f296093b1d60c73f" +dependencies = [ + "iced_core 0.13.2", + "iced_futures 0.13.2", + "iced_renderer 0.13.0", + "iced_widget 0.13.4", + "iced_winit 0.13.0", + "thiserror 1.0.69", +] + [[package]] name = "iced" version = "0.14.0-dev" @@ -3192,15 +3529,15 @@ source = "git+https://github.com/pop-os/libcosmic#0e797b244043ee86610113d5479502 dependencies = [ "dnd", "iced_accessibility", - "iced_core", - "iced_futures", - "iced_renderer", - "iced_widget", - "iced_winit", + "iced_core 0.14.0-dev", + "iced_futures 0.14.0-dev", + "iced_renderer 0.14.0-dev", + "iced_widget 0.14.0-dev", + "iced_winit 0.14.0-dev", "image", "mime 0.1.0", "thiserror 1.0.69", - "window_clipboard", + "window_clipboard 0.4.1 (git+https://github.com/pop-os/window_clipboard.git?tag=pop-0.13-2)", ] [[package]] @@ -3212,6 +3549,26 @@ dependencies = [ "accesskit_winit", ] +[[package]] +name = "iced_core" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0013a238275494641bf8f1732a23a808196540dc67b22ff97099c044ae4c8a1c" +dependencies = [ + "bitflags 2.9.4", + "bytes", + "dark-light", + "glam", + "log", + "num-traits", + "once_cell", + "palette", + "rustc-hash 2.1.1", + "smol_str", + "thiserror 1.0.69", + "web-time", +] + [[package]] name = "iced_core" version = "0.14.0-dev" @@ -3233,7 +3590,21 @@ dependencies = [ "smol_str", "thiserror 1.0.69", "web-time", - "window_clipboard", + "window_clipboard 0.4.1 (git+https://github.com/pop-os/window_clipboard.git?tag=pop-0.13-2)", +] + +[[package]] +name = "iced_futures" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c04a6745ba2e80f32cf01e034fd00d853aa4f4cd8b91888099cb7aaee0d5d7c" +dependencies = [ + "futures", + "iced_core 0.13.2", + "log", + "rustc-hash 2.1.1", + "wasm-bindgen-futures", + "wasm-timer", ] [[package]] @@ -3242,7 +3613,7 @@ version = "0.14.0-dev" source = "git+https://github.com/pop-os/libcosmic#0e797b244043ee86610113d547950204258dea83" dependencies = [ "futures", - "iced_core", + "iced_core 0.14.0-dev", "log", "rustc-hash 2.1.1", "tokio", @@ -3253,13 +3624,46 @@ dependencies = [ [[package]] name = "iced_glyphon" version = "0.6.0" -source = "git+https://github.com/pop-os/glyphon.git?tag=iced-0.14-dev#6ef9d12a20cfd0f7bdf38136a26ded9f7459ec8b" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41c3bb56f1820ca252bc1d0994ece33d233a55657c0c263ea7cb16895adbde82" dependencies = [ - "cosmic-text", + "cosmic-text 0.12.1", "etagere", "lru", "rustc-hash 2.1.1", - "wgpu", + "wgpu 0.19.4", +] + +[[package]] +name = "iced_glyphon" +version = "0.6.0" +source = "git+https://github.com/pop-os/glyphon.git?tag=iced-0.14-dev#6ef9d12a20cfd0f7bdf38136a26ded9f7459ec8b" +dependencies = [ + "cosmic-text 0.14.2", + "etagere", + "lru", + "rustc-hash 2.1.1", + "wgpu 22.1.0", +] + +[[package]] +name = "iced_graphics" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba25a18cfa6d5cc160aca7e1b34f73ccdff21680fa8702168c09739767b6c66f" +dependencies = [ + "bitflags 2.9.4", + "bytemuck", + "cosmic-text 0.12.1", + "half", + "iced_core 0.13.2", + "iced_futures 0.13.2", + "log", + "once_cell", + "raw-window-handle", + "rustc-hash 2.1.1", + "thiserror 1.0.69", + "unicode-segmentation", ] [[package]] @@ -3269,10 +3673,10 @@ source = "git+https://github.com/pop-os/libcosmic#0e797b244043ee86610113d5479502 dependencies = [ "bitflags 2.9.4", "bytemuck", - "cosmic-text", + "cosmic-text 0.14.2", "half", - "iced_core", - "iced_futures", + "iced_core 0.14.0-dev", + "iced_futures 0.14.0-dev", "image", "kamadak-exif", "log", @@ -3284,18 +3688,44 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "iced_renderer" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73558208059f9e622df2bf434e044ee2f838ce75201a023cf0ca3e1244f46c2a" +dependencies = [ + "iced_graphics 0.13.0", + "iced_tiny_skia 0.13.0", + "iced_wgpu 0.13.5", + "log", + "thiserror 1.0.69", +] + [[package]] name = "iced_renderer" version = "0.14.0-dev" source = "git+https://github.com/pop-os/libcosmic#0e797b244043ee86610113d547950204258dea83" dependencies = [ - "iced_graphics", - "iced_tiny_skia", - "iced_wgpu", + "iced_graphics 0.14.0-dev", + "iced_tiny_skia 0.14.0-dev", + "iced_wgpu 0.14.0-dev", "log", "thiserror 1.0.69", ] +[[package]] +name = "iced_runtime" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "348b5b2c61c934d88ca3b0ed1ed913291e923d086a66fa288ce9669da9ef62b5" +dependencies = [ + "bytes", + "iced_core 0.13.2", + "iced_futures 0.13.2", + "raw-window-handle", + "thiserror 1.0.69", +] + [[package]] name = "iced_runtime" version = "0.14.0-dev" @@ -3304,11 +3734,27 @@ dependencies = [ "bytes", "dnd", "iced_accessibility", - "iced_core", - "iced_futures", + "iced_core 0.14.0-dev", + "iced_futures 0.14.0-dev", "raw-window-handle", "thiserror 1.0.69", - "window_clipboard", + "window_clipboard 0.4.1 (git+https://github.com/pop-os/window_clipboard.git?tag=pop-0.13-2)", +] + +[[package]] +name = "iced_tiny_skia" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c625d368284fcc43b0b36b176f76eff1abebe7959dd58bd8ce6897d641962a50" +dependencies = [ + "bytemuck", + "cosmic-text 0.12.1", + "iced_graphics 0.13.0", + "kurbo 0.10.4", + "log", + "rustc-hash 2.1.1", + "softbuffer 0.4.6", + "tiny-skia", ] [[package]] @@ -3317,13 +3763,13 @@ version = "0.14.0-dev" source = "git+https://github.com/pop-os/libcosmic#0e797b244043ee86610113d547950204258dea83" dependencies = [ "bytemuck", - "cosmic-text", - "iced_graphics", + "cosmic-text 0.14.2", + "iced_graphics 0.14.0-dev", "kurbo 0.10.4", "log", "resvg 0.42.0", "rustc-hash 2.1.1", - "softbuffer", + "softbuffer 0.4.1", "tiny-skia", ] @@ -3344,6 +3790,26 @@ dependencies = [ "url", ] +[[package]] +name = "iced_wgpu" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15708887133671d2bcc6c1d01d1f176f43a64d6cdc3b2bf893396c3ee498295f" +dependencies = [ + "bitflags 2.9.4", + "bytemuck", + "futures", + "glam", + "guillotiere", + "iced_glyphon 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "iced_graphics 0.13.0", + "log", + "once_cell", + "rustc-hash 2.1.1", + "thiserror 1.0.69", + "wgpu 0.19.4", +] + [[package]] name = "iced_wgpu" version = "0.14.0-dev" @@ -3356,8 +3822,8 @@ dependencies = [ "futures", "glam", "guillotiere", - "iced_glyphon", - "iced_graphics", + "iced_glyphon 0.6.0 (git+https://github.com/pop-os/glyphon.git?tag=iced-0.14-dev)", + "iced_graphics 0.14.0-dev", "log", "lyon", "once_cell", @@ -3371,10 +3837,25 @@ dependencies = [ "wayland-client", "wayland-protocols", "wayland-sys", - "wgpu", + "wgpu 22.1.0", "x11rb", ] +[[package]] +name = "iced_widget" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81429e1b950b0e4bca65be4c4278fea6678ea782030a411778f26fa9f8983e1d" +dependencies = [ + "iced_renderer 0.13.0", + "iced_runtime 0.13.2", + "num-traits", + "once_cell", + "rustc-hash 2.1.1", + "thiserror 1.0.69", + "unicode-segmentation", +] + [[package]] name = "iced_widget" version = "0.14.0-dev" @@ -3382,8 +3863,8 @@ source = "git+https://github.com/pop-os/libcosmic#0e797b244043ee86610113d5479502 dependencies = [ "dnd", "iced_accessibility", - "iced_renderer", - "iced_runtime", + "iced_renderer 0.14.0-dev", + "iced_runtime 0.14.0-dev", "log", "num-traits", "once_cell", @@ -3391,7 +3872,27 @@ dependencies = [ "rustc-hash 2.1.1", "thiserror 1.0.69", "unicode-segmentation", - "window_clipboard", + "window_clipboard 0.4.1 (git+https://github.com/pop-os/window_clipboard.git?tag=pop-0.13-2)", +] + +[[package]] +name = "iced_winit" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f44cd4e1c594b6334f409282937bf972ba14d31fedf03c23aa595d982a2fda28" +dependencies = [ + "iced_futures 0.13.2", + "iced_graphics 0.13.0", + "iced_runtime 0.13.2", + "log", + "rustc-hash 2.1.1", + "thiserror 1.0.69", + "tracing", + "wasm-bindgen-futures", + "web-sys", + "winapi", + "window_clipboard 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winit 0.30.12", ] [[package]] @@ -3401,9 +3902,9 @@ source = "git+https://github.com/pop-os/libcosmic#0e797b244043ee86610113d5479502 dependencies = [ "dnd", "iced_accessibility", - "iced_futures", - "iced_graphics", - "iced_runtime", + "iced_futures 0.14.0-dev", + "iced_graphics 0.14.0-dev", + "iced_runtime 0.14.0-dev", "log", "rustc-hash 2.1.1", "rustix 0.38.44", @@ -3413,8 +3914,8 @@ dependencies = [ "wayland-client", "web-sys", "winapi", - "window_clipboard", - "winit", + "window_clipboard 0.4.1 (git+https://github.com/pop-os/window_clipboard.git?tag=pop-0.13-2)", + "winit 0.30.5", ] [[package]] @@ -3813,7 +4314,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" dependencies = [ "libc", - "libloading", + "libloading 0.8.8", "pkg-config", ] @@ -3888,27 +4389,6 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" -[[package]] -name = "lexpr" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a84de6a9df442363b08f5dbf0cd5b92edc70097b89c4ce4bfea4679fe48bc67" -dependencies = [ - "itoa", - "lexpr-macros", - "ryu", -] - -[[package]] -name = "lexpr-macros" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36b5cb8bb985c81a8ac1a0f8b5c4865214f574ddd64397ef7a99c236e21f35bb" -dependencies = [ - "proc-macro2", - "quote", -] - [[package]] name = "libc" version = "0.2.175" @@ -3935,16 +4415,16 @@ dependencies = [ "futures", "i18n-embed", "i18n-embed-fl", - "iced", + "iced 0.14.0-dev", "iced_accessibility", - "iced_core", - "iced_futures", - "iced_renderer", - "iced_runtime", - "iced_tiny_skia", - "iced_wgpu", - "iced_widget", - "iced_winit", + "iced_core 0.14.0-dev", + "iced_futures 0.14.0-dev", + "iced_renderer 0.14.0-dev", + "iced_runtime 0.14.0-dev", + "iced_tiny_skia 0.14.0-dev", + "iced_wgpu 0.14.0-dev", + "iced_widget 0.14.0-dev", + "iced_winit 0.14.0-dev", "image", "libc", "mime 0.3.17", @@ -3975,6 +4455,16 @@ dependencies = [ "cc", ] +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + [[package]] name = "libloading" version = "0.8.8" @@ -4101,11 +4591,11 @@ dependencies = [ "colors-transform", "crisp", "dirs 6.0.0", + "dragking", "gstreamer", "gstreamer-app", "iced_video_player", "image", - "lexpr", "libcosmic", "miette", "mupdf", @@ -4117,7 +4607,6 @@ dependencies = [ "rodio", "ron 0.8.1", "serde", - "serde-lexpr", "sqlx", "strum", "strum_macros", @@ -4260,6 +4749,21 @@ dependencies = [ "autocfg", ] +[[package]] +name = "metal" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25" +dependencies = [ + "bitflags 2.9.4", + "block", + "core-graphics-types 0.1.3", + "foreign-types", + "log", + "objc", + "paste", +] + [[package]] name = "metal" version = "0.29.0" @@ -4268,7 +4772,7 @@ checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" dependencies = [ "bitflags 2.9.4", "block", - "core-graphics-types", + "core-graphics-types 0.1.3", "foreign-types", "log", "objc", @@ -4310,7 +4814,7 @@ name = "mime" version = "0.1.0" source = "git+https://github.com/pop-os/window_clipboard.git?tag=pop-0.13-2#6b9faab87bea9cebec6ae036906fd67fed254f5f" dependencies = [ - "smithay-clipboard", + "smithay-clipboard 0.8.0", ] [[package]] @@ -4394,6 +4898,26 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13d2233c9842d08cfe13f9eac96e207ca6a2ea10b80259ebe8ad0268be27d2af" +[[package]] +name = "naga" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e3524642f53d9af419ab5e8dd29d3ba155708267667c2f3f06c88c9e130843" +dependencies = [ + "bit-set 0.5.3", + "bitflags 2.9.4", + "codespan-reporting", + "hexf-parse", + "indexmap 2.11.3", + "log", + "num-traits", + "rustc-hash 1.1.0", + "spirv", + "termcolor", + "thiserror 1.0.69", + "unicode-xid", +] + [[package]] name = "naga" version = "22.1.0" @@ -4401,7 +4925,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8bd5a652b6faf21496f2cfd88fc49989c8db0825d1f6746b1a71a6ede24a63ad" dependencies = [ "arrayvec", - "bit-set", + "bit-set 0.6.0", "bitflags 2.9.4", "cfg_aliases 0.1.1", "codespan-reporting", @@ -4493,6 +5017,19 @@ dependencies = [ "libc", ] +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.9.4", + "cfg-if", + "cfg_aliases 0.2.1", + "libc", + "memoffset 0.9.1", +] + [[package]] name = "nix" version = "0.30.1" @@ -4688,6 +5225,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ "malloc_buf", + "objc_exception", ] [[package]] @@ -4984,6 +5522,15 @@ dependencies = [ "objc2-foundation 0.2.2", ] +[[package]] +name = "objc_exception" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +dependencies = [ + "cc", +] + [[package]] name = "objc_id" version = "0.1.1" @@ -5038,6 +5585,16 @@ dependencies = [ "libredox", ] +[[package]] +name = "ordered-multimap" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd5344d8924a" +dependencies = [ + "dlv-list", + "hashbrown 0.12.3", +] + [[package]] name = "ordered-stream" version = "0.2.0" @@ -5728,6 +6285,16 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "read-fonts" +version = "0.22.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69aacb76b5c29acfb7f90155d39759a29496aebb49395830e928a9703d2eec2f" +dependencies = [ + "bytemuck", + "font-types 0.7.3", +] + [[package]] name = "read-fonts" version = "0.29.3" @@ -5735,7 +6302,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04ca636dac446b5664bd16c069c00a9621806895b8bb02c2dc68542b23b8f25d" dependencies = [ "bytemuck", - "font-types", + "font-types 0.9.0", ] [[package]] @@ -5746,7 +6313,7 @@ checksum = "8941f8e9d5f8ad3aebea330d01ac68c0167600eb31a86ecd86e97be4d13b51f5" dependencies = [ "bytemuck", "core_maths", - "font-types", + "font-types 0.9.0", ] [[package]] @@ -5758,6 +6325,15 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "redox_syscall" version = "0.5.17" @@ -6008,6 +6584,16 @@ dependencies = [ "walkdir", ] +[[package]] +name = "rust-ini" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6d5f2436026b4f6e79dc829837d467cc7e9a55ee40e750d716713540715a2df" +dependencies = [ + "cfg-if", + "ordered-multimap", +] + [[package]] name = "rustc-demangle" version = "0.1.26" @@ -6089,6 +6675,7 @@ checksum = "cfb9cf8877777222e4a3bc7eb247e398b56baba500c38c1c46842431adc8b55c" dependencies = [ "bitflags 2.9.4", "bytemuck", + "libm", "smallvec", "ttf-parser 0.21.1", "unicode-bidi-mirroring 0.2.0", @@ -6223,16 +6810,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "serde-lexpr" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb4cda13396159f59e7946118cdac0beadeecfb7cf76b197f4147e546f4ead6f" -dependencies = [ - "lexpr", - "serde", -] - [[package]] name = "serde_core" version = "1.0.225" @@ -6417,6 +6994,16 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" +[[package]] +name = "skrifa" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1c44ad1f6c5bdd4eefed8326711b7dbda9ea45dfd36068c427d332aa382cbe" +dependencies = [ + "bytemuck", + "read-fonts 0.22.7", +] + [[package]] name = "skrifa" version = "0.31.3" @@ -6516,6 +7103,17 @@ dependencies = [ "xkeysym", ] +[[package]] +name = "smithay-clipboard" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc8216eec463674a0e90f29e0ae41a4db573ec5b56b1c6c1c71615d249b6d846" +dependencies = [ + "libc", + "smithay-client-toolkit 0.19.2", + "wayland-backend", +] + [[package]] name = "smithay-clipboard" version = "0.8.0" @@ -6565,8 +7163,8 @@ dependencies = [ "bytemuck", "cfg_aliases 0.2.1", "cocoa", - "core-graphics", - "drm", + "core-graphics 0.23.2", + "drm 0.11.1", "fastrand 2.3.0", "foreign-types", "js-sys", @@ -6586,6 +7184,38 @@ dependencies = [ "x11rb", ] +[[package]] +name = "softbuffer" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18051cdd562e792cad055119e0cdb2cfc137e44e3987532e0f9659a77931bb08" +dependencies = [ + "as-raw-xcb-connection", + "bytemuck", + "cfg_aliases 0.2.1", + "core-graphics 0.24.0", + "drm 0.12.0", + "fastrand 2.3.0", + "foreign-types", + "js-sys", + "log", + "memmap2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall 0.5.17", + "rustix 0.38.44", + "tiny-xlib", + "wasm-bindgen", + "wayland-backend", + "wayland-client", + "wayland-sys", + "web-sys", + "windows-sys 0.59.0", + "x11rb", +] + [[package]] name = "spin" version = "0.9.8" @@ -6902,6 +7532,17 @@ dependencies = [ "siphasher", ] +[[package]] +name = "swash" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbd59f3f359ddd2c95af4758c18270eddd9c730dde98598023cdabff472c2ca2" +dependencies = [ + "skrifa 0.22.3", + "yazi 0.1.6", + "zeno 0.2.3", +] + [[package]] name = "swash" version = "0.2.5" @@ -6909,8 +7550,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f745de914febc7c9ab4388dfaf94bbc87e69f57bb41133a9b0c84d4be49856f3" dependencies = [ "skrifa 0.31.3", - "yazi", - "zeno", + "yazi 0.2.1", + "zeno 0.3.3", ] [[package]] @@ -7376,7 +8017,7 @@ checksum = "0324504befd01cab6e0c994f34b2ffa257849ee019d3fb3b64fb2c858887d89e" dependencies = [ "as-raw-xcb-connection", "ctor-lite", - "libloading", + "libloading 0.8.8", "pkg-config", "tracing", ] @@ -7596,6 +8237,12 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "ttf-parser" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" + [[package]] name = "ttf-parser" version = "0.21.1" @@ -8189,6 +8836,31 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" +[[package]] +name = "wgpu" +version = "0.19.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbd7311dbd2abcfebaabf1841a2824ed7c8be443a0f29166e5d3c6a53a762c01" +dependencies = [ + "arrayvec", + "cfg-if", + "cfg_aliases 0.1.1", + "js-sys", + "log", + "naga 0.19.2", + "parking_lot 0.11.2", + "profiling", + "raw-window-handle", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core 0.19.4", + "wgpu-hal 0.19.5", + "wgpu-types 0.19.2", +] + [[package]] name = "wgpu" version = "22.1.0" @@ -8200,7 +8872,7 @@ dependencies = [ "document-features", "js-sys", "log", - "naga", + "naga 22.1.0", "parking_lot 0.12.4", "profiling", "raw-window-handle", @@ -8209,9 +8881,35 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "wgpu-core", - "wgpu-hal", - "wgpu-types", + "wgpu-core 22.1.0", + "wgpu-hal 22.0.0", + "wgpu-types 22.0.0", +] + +[[package]] +name = "wgpu-core" +version = "0.19.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28b94525fc99ba9e5c9a9e24764f2bc29bad0911a7446c12f446a8277369bf3a" +dependencies = [ + "arrayvec", + "bit-vec 0.6.3", + "bitflags 2.9.4", + "cfg_aliases 0.1.1", + "codespan-reporting", + "indexmap 2.11.3", + "log", + "naga 0.19.2", + "once_cell", + "parking_lot 0.11.2", + "profiling", + "raw-window-handle", + "rustc-hash 1.1.0", + "smallvec", + "thiserror 1.0.69", + "web-sys", + "wgpu-hal 0.19.5", + "wgpu-types 0.19.2", ] [[package]] @@ -8221,13 +8919,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0348c840d1051b8e86c3bcd31206080c5e71e5933dabd79be1ce732b0b2f089a" dependencies = [ "arrayvec", - "bit-vec", + "bit-vec 0.7.0", "bitflags 2.9.4", "cfg_aliases 0.1.1", "document-features", "indexmap 2.11.3", "log", - "naga", + "naga 22.1.0", "once_cell", "parking_lot 0.12.4", "profiling", @@ -8235,8 +8933,53 @@ dependencies = [ "rustc-hash 1.1.0", "smallvec", "thiserror 1.0.69", - "wgpu-hal", - "wgpu-types", + "wgpu-hal 22.0.0", + "wgpu-types 22.0.0", +] + +[[package]] +name = "wgpu-hal" +version = "0.19.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfabcfc55fd86611a855816326b2d54c3b2fd7972c27ce414291562650552703" +dependencies = [ + "android_system_properties", + "arrayvec", + "ash 0.37.3+1.3.251", + "bit-set 0.5.3", + "bitflags 2.9.4", + "block", + "cfg_aliases 0.1.1", + "core-graphics-types 0.1.3", + "d3d12 0.19.0", + "glow", + "glutin_wgl_sys 0.5.0", + "gpu-alloc", + "gpu-allocator 0.25.0", + "gpu-descriptor 0.2.4", + "hassle-rs", + "js-sys", + "khronos-egl", + "libc", + "libloading 0.8.8", + "log", + "metal 0.27.0", + "naga 0.19.2", + "ndk-sys 0.5.0+25.2.9519653", + "objc", + "once_cell", + "parking_lot 0.11.2", + "profiling", + "range-alloc", + "raw-window-handle", + "renderdoc-sys", + "rustc-hash 1.1.0", + "smallvec", + "thiserror 1.0.69", + "wasm-bindgen", + "web-sys", + "wgpu-types 0.19.2", + "winapi", ] [[package]] @@ -8247,26 +8990,26 @@ checksum = "f6bbf4b4de8b2a83c0401d9e5ae0080a2792055f25859a02bf9be97952bbed4f" dependencies = [ "android_system_properties", "arrayvec", - "ash", - "bit-set", + "ash 0.38.0+1.3.281", + "bit-set 0.6.0", "bitflags 2.9.4", "block", "cfg_aliases 0.1.1", - "core-graphics-types", - "d3d12", + "core-graphics-types 0.1.3", + "d3d12 22.0.0", "glow", - "glutin_wgl_sys", + "glutin_wgl_sys 0.6.1", "gpu-alloc", - "gpu-allocator", - "gpu-descriptor", + "gpu-allocator 0.26.0", + "gpu-descriptor 0.3.2", "hassle-rs", "js-sys", "khronos-egl", "libc", - "libloading", + "libloading 0.8.8", "log", - "metal", - "naga", + "metal 0.29.0", + "naga 22.1.0", "ndk-sys 0.5.0+25.2.9519653", "objc", "once_cell", @@ -8280,10 +9023,21 @@ dependencies = [ "thiserror 1.0.69", "wasm-bindgen", "web-sys", - "wgpu-types", + "wgpu-types 22.0.0", "winapi", ] +[[package]] +name = "wgpu-types" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b671ff9fb03f78b46ff176494ee1ebe7d603393f42664be55b64dc8d53969805" +dependencies = [ + "bitflags 2.9.4", + "js-sys", + "web-sys", +] + [[package]] name = "wgpu-types" version = "22.0.0" @@ -8342,15 +9096,29 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "window_clipboard" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6d692d46038c433f9daee7ad8757e002a4248c20b0a3fbc991d99521d3bcb6d" +dependencies = [ + "clipboard-win", + "clipboard_macos 0.1.1", + "clipboard_wayland 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "clipboard_x11 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "raw-window-handle", + "thiserror 1.0.69", +] + [[package]] name = "window_clipboard" version = "0.4.1" source = "git+https://github.com/pop-os/window_clipboard.git?tag=pop-0.13-2#6b9faab87bea9cebec6ae036906fd67fed254f5f" dependencies = [ "clipboard-win", - "clipboard_macos", - "clipboard_wayland", - "clipboard_x11", + "clipboard_macos 0.1.0", + "clipboard_wayland 0.2.2 (git+https://github.com/pop-os/window_clipboard.git?tag=pop-0.13-2)", + "clipboard_x11 0.4.2 (git+https://github.com/pop-os/window_clipboard.git?tag=pop-0.13-2)", "dnd", "mime 0.1.0", "raw-window-handle", @@ -8796,7 +9564,7 @@ name = "winit" version = "0.30.5" source = "git+https://github.com/pop-os/winit.git?tag=iced-xdg-surface-0.13#dbe91fcc363c101f1d6ed5301d49911b01a26f61" dependencies = [ - "ahash", + "ahash 0.8.12", "android-activity", "atomic-waker", "bitflags 2.9.4", @@ -8805,10 +9573,10 @@ dependencies = [ "calloop 0.13.0", "cfg_aliases 0.2.1", "concurrent-queue", - "core-foundation", - "core-graphics", + "core-foundation 0.9.4", + "core-graphics 0.23.2", "cursor-icon", - "dpi", + "dpi 0.1.1", "js-sys", "libc", "memmap2", @@ -8842,6 +9610,58 @@ dependencies = [ "xkbcommon-dl", ] +[[package]] +name = "winit" +version = "0.30.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c66d4b9ed69c4009f6321f762d6e61ad8a2389cd431b97cb1e146812e9e6c732" +dependencies = [ + "ahash 0.8.12", + "android-activity", + "atomic-waker", + "bitflags 2.9.4", + "block2 0.5.1", + "bytemuck", + "calloop 0.13.0", + "cfg_aliases 0.2.1", + "concurrent-queue", + "core-foundation 0.9.4", + "core-graphics 0.23.2", + "cursor-icon", + "dpi 0.1.2", + "js-sys", + "libc", + "memmap2", + "ndk", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", + "objc2-ui-kit", + "orbclient", + "percent-encoding", + "pin-project", + "raw-window-handle", + "redox_syscall 0.4.1", + "rustix 0.38.44", + "sctk-adwaita", + "smithay-client-toolkit 0.19.2", + "smol_str", + "tracing", + "unicode-segmentation", + "wasm-bindgen", + "wasm-bindgen-futures", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-plasma", + "web-sys", + "web-time", + "windows-sys 0.52.0", + "x11-dl", + "x11rb", + "xkbcommon-dl", +] + [[package]] name = "winnow" version = "0.5.40" @@ -8860,6 +9680,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi", +] + [[package]] name = "wio" version = "0.2.2" @@ -8901,7 +9730,7 @@ dependencies = [ "as-raw-xcb-connection", "gethostname", "libc", - "libloading", + "libloading 0.8.8", "once_cell", "rustix 1.1.2", "x11rb-protocol", @@ -9004,6 +9833,12 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" +[[package]] +name = "yazi" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c94451ac9513335b5e23d7a8a2b61a7102398b8cca5160829d313e84c9d98be1" + [[package]] name = "yazi" version = "0.2.1" @@ -9081,6 +9916,44 @@ dependencies = [ "zvariant 3.15.2", ] +[[package]] +name = "zbus" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" +dependencies = [ + "async-broadcast 0.7.2", + "async-executor", + "async-fs", + "async-io 2.6.0", + "async-lock 3.4.1", + "async-process 2.5.0", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener 5.4.1", + "futures-core", + "futures-sink", + "futures-util", + "hex", + "nix 0.29.0", + "ordered-stream", + "rand 0.8.5", + "serde", + "serde_repr", + "sha1", + "static_assertions", + "tracing", + "uds_windows", + "windows-sys 0.52.0", + "xdg-home", + "zbus_macros 4.4.0", + "zbus_names 3.0.0", + "zvariant 4.2.0", +] + [[package]] name = "zbus" version = "5.11.0" @@ -9129,6 +10002,19 @@ dependencies = [ "zvariant_utils 1.0.1", ] +[[package]] +name = "zbus_macros" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" +dependencies = [ + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.106", + "zvariant_utils 2.1.0", +] + [[package]] name = "zbus_macros" version = "5.11.0" @@ -9155,6 +10041,17 @@ dependencies = [ "zvariant 3.15.2", ] +[[package]] +name = "zbus_names" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" +dependencies = [ + "serde", + "static_assertions", + "zvariant 4.2.0", +] + [[package]] name = "zbus_names" version = "4.2.0" @@ -9167,6 +10064,12 @@ dependencies = [ "zvariant 5.7.0", ] +[[package]] +name = "zeno" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd15f8e0dbb966fd9245e7498c7e9e5055d9e5c8b676b95bd67091cd11a1e697" + [[package]] name = "zeno" version = "0.3.3" @@ -9291,6 +10194,19 @@ dependencies = [ "zvariant_derive 3.15.2", ] +[[package]] +name = "zvariant" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" +dependencies = [ + "endi", + "enumflags2", + "serde", + "static_assertions", + "zvariant_derive 4.2.0", +] + [[package]] name = "zvariant" version = "5.7.0" @@ -9319,6 +10235,19 @@ dependencies = [ "zvariant_utils 1.0.1", ] +[[package]] +name = "zvariant_derive" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" +dependencies = [ + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.106", + "zvariant_utils 2.1.0", +] + [[package]] name = "zvariant_derive" version = "5.7.0" @@ -9343,6 +10272,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "zvariant_utils" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "zvariant_utils" version = "3.2.1" diff --git a/Cargo.toml b/Cargo.toml index 4d7b10c..916c8b5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,11 +8,9 @@ description = "A cli presentation system" [dependencies] clap = { version = "4.5.20", features = ["debug", "derive"] } -lexpr = "0.2.7" miette = { version = "7.2.0", features = ["fancy"] } pretty_assertions = "1.4.1" serde = { version = "1.0.213", features = ["derive"] } -serde-lexpr = "0.1.3" tracing = "0.1.40" tracing-log = "0.2.0" tracing-subscriber = { version = "0.3.18", features = ["fmt", "std", "chrono", "time", "local-time", "env-filter"] } @@ -36,12 +34,13 @@ resvg = "0.45.1" image = "0.25.8" rapidhash = "4.0.0" rapidfuzz = "0.5.0" +dragking = { git = "https://github.com/airstrike/dragking" } # femtovg = { version = "0.16.0", features = ["wgpu"] } # wgpu = "26.0.1" # mupdf = "0.5.0" mupdf = { version = "0.5.0", git = "https://github.com/messense/mupdf-rs", rev="2425c1405b326165b06834dcc1ca859015f92787"} -# rfd = { version = "0.12.1", features = ["xdg-portal"], default-features = false } +# rfd = { version = "0.14.1" } [dependencies.libcosmic] git = "https://github.com/pop-os/libcosmic" diff --git a/flake.lock b/flake.lock index d20281c..4780b18 100644 --- a/flake.lock +++ b/flake.lock @@ -6,11 +6,11 @@ "rust-analyzer-src": "rust-analyzer-src" }, "locked": { - "lastModified": 1755585599, - "narHash": "sha256-tl/0cnsqB/Yt7DbaGMel2RLa7QG5elA8lkaOXli6VdY=", + "lastModified": 1758177713, + "narHash": "sha256-4Mesi0sOxCzrwnFHeAhL/vv1K1Wcwsl4D9duQ7ndYS8=", "owner": "nix-community", "repo": "fenix", - "rev": "6ed03ef4c8ec36d193c18e06b9ecddde78fb7e42", + "rev": "60316bdc00603b483992560baa14841e42e58a7b", "type": "github" }, "original": { @@ -80,11 +80,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1755186698, - "narHash": "sha256-wNO3+Ks2jZJ4nTHMuks+cxAiVBGNuEBXsT29Bz6HASo=", + "lastModified": 1758035966, + "narHash": "sha256-qqIJ3yxPiB0ZQTT9//nFGQYn8X/PBoJbofA7hRKZnmE=", "owner": "nixos", "repo": "nixpkgs", - "rev": "fbcf476f790d8a217c3eab4e12033dc4a0f6d23c", + "rev": "8d4ddb19d03c65a36ad8d189d001dc32ffb0306b", "type": "github" }, "original": { @@ -112,11 +112,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1755615617, - "narHash": "sha256-HMwfAJBdrr8wXAkbGhtcby1zGFvs+StOp19xNsbqdOg=", + "lastModified": 1758035966, + "narHash": "sha256-qqIJ3yxPiB0ZQTT9//nFGQYn8X/PBoJbofA7hRKZnmE=", "owner": "nixos", "repo": "nixpkgs", - "rev": "20075955deac2583bb12f07151c2df830ef346b4", + "rev": "8d4ddb19d03c65a36ad8d189d001dc32ffb0306b", "type": "github" }, "original": { @@ -137,11 +137,11 @@ "rust-analyzer-src": { "flake": false, "locked": { - "lastModified": 1755504847, - "narHash": "sha256-VX0B9hwhJypCGqncVVLC+SmeMVd/GAYbJZ0MiiUn2Pk=", + "lastModified": 1757362324, + "narHash": "sha256-/PAhxheUq4WBrW5i/JHzcCqK5fGWwLKdH6/Lu1tyS18=", "owner": "rust-lang", "repo": "rust-analyzer", - "rev": "a905e3b21b144d77e1b304e49f3264f6f8d4db75", + "rev": "9edc9cbe5d8e832b5864e09854fa94861697d2fd", "type": "github" }, "original": { diff --git a/justfile b/justfile index 8eb74f5..1da1804 100644 --- a/justfile +++ b/justfile @@ -8,6 +8,8 @@ build: sbuild: RUST_LOG=debug sccache cargo build run: + RUST_LOG=debug cargo run -- {{ui}} +run-file: RUST_LOG=debug cargo run -- {{ui}} {{file}} srun: RUST_LOG=debug sccache cargo run -- {{ui}} {{file}} @@ -20,5 +22,6 @@ profile: alias b := build alias r := run +alias rf := run-file alias sr := srun alias c := clean diff --git a/src/core/lisp.rs b/src/core/lisp.rs deleted file mode 100644 index 2c1a666..0000000 --- a/src/core/lisp.rs +++ /dev/null @@ -1,157 +0,0 @@ -use lexpr::Value; -use strum_macros::EnumString; - -#[derive(Debug, Clone, Default, PartialEq, Eq, EnumString)] -pub(crate) enum Symbol { - #[strum(ascii_case_insensitive)] - Slide, - #[strum(ascii_case_insensitive)] - Image, - #[strum(ascii_case_insensitive)] - Text, - #[strum(ascii_case_insensitive)] - Video, - #[strum(ascii_case_insensitive)] - Song, - #[strum(disabled)] - ImageFit(ImageFit), - #[strum(disabled)] - VerseOrder(VerseOrder), - #[strum(disabled)] - #[default] - None, -} - -#[derive(Debug, Clone, PartialEq, Eq, EnumString)] -pub(crate) enum Keyword { - ImageFit(ImageFit), -} - -#[derive(Debug, Default, Clone, PartialEq, Eq, EnumString)] -pub(crate) enum ImageFit { - #[strum(ascii_case_insensitive)] - #[default] - Cover, - #[strum(ascii_case_insensitive)] - Fill, - #[strum(ascii_case_insensitive)] - Crop, -} - -#[derive(Clone, Debug, Default, PartialEq, Eq, EnumString)] -pub(crate) enum VerseOrder { - #[strum(ascii_case_insensitive)] - #[default] - V1, - #[strum(ascii_case_insensitive)] - V2, - #[strum(ascii_case_insensitive)] - V3, - #[strum(ascii_case_insensitive)] - V4, - #[strum(ascii_case_insensitive)] - V5, - #[strum(ascii_case_insensitive)] - V6, - #[strum(ascii_case_insensitive)] - C1, - #[strum(ascii_case_insensitive)] - C2, - #[strum(ascii_case_insensitive)] - C3, - #[strum(ascii_case_insensitive)] - C4, - #[strum(ascii_case_insensitive)] - B1, - #[strum(ascii_case_insensitive)] - B2, - #[strum(ascii_case_insensitive)] - B3, - #[strum(ascii_case_insensitive)] - B4, - #[strum(ascii_case_insensitive)] - O1, - #[strum(ascii_case_insensitive)] - O2, - #[strum(ascii_case_insensitive)] - O3, - #[strum(ascii_case_insensitive)] - O4, - #[strum(ascii_case_insensitive)] - E1, - #[strum(ascii_case_insensitive)] - E2, - #[strum(ascii_case_insensitive)] - I1, - #[strum(ascii_case_insensitive)] - I2, -} - -#[derive(Clone, Debug, PartialEq, Eq, EnumString)] -pub(crate) enum SongKeyword { - #[strum(ascii_case_insensitive)] - Title, - #[strum(ascii_case_insensitive)] - Author, - #[strum(ascii_case_insensitive)] - Ccli, - #[strum(ascii_case_insensitive)] - Audio, - #[strum(ascii_case_insensitive)] - Font, - #[strum(ascii_case_insensitive)] - FontSize, - #[strum(ascii_case_insensitive)] - Background, - #[strum(ascii_case_insensitive)] - VerseOrder(VerseOrder), -} - -#[derive(Clone, Debug, PartialEq, Eq, EnumString)] -pub(crate) enum ImageKeyword { - #[strum(ascii_case_insensitive)] - Source, - #[strum(ascii_case_insensitive)] - Fit, -} - -#[derive(Clone, Debug, Eq, PartialEq, EnumString)] -pub(crate) enum VideoKeyword { - #[strum(ascii_case_insensitive)] - Source, - #[strum(ascii_case_insensitive)] - Fit, -} - -pub(crate) fn get_lists(exp: &Value) -> Vec { - if exp.is_cons() { - exp.as_cons().unwrap().to_vec().0 - } else { - vec![] - } -} - -#[cfg(test)] -mod test { - - // #[test] - // fn test_list() { - // let lisp = - // read_to_string("./test_presentation.lisp").expect("oops"); - // // println!("{lisp}"); - // let mut parser = - // Parser::from_str_custom(&lisp, Options::elisp()); - // for atom in parser.value_iter() { - // match atom { - // Ok(atom) => { - // // println!("{atom}"); - // let lists = get_lists(&atom); - // assert_eq!(lists, vec![Value::Null]) - // } - // Err(e) => { - // panic!("{e}"); - // } - // } - // } - // } -} diff --git a/src/core/mod.rs b/src/core/mod.rs index e23192e..3cae43a 100644 --- a/src/core/mod.rs +++ b/src/core/mod.rs @@ -1,7 +1,6 @@ pub mod content; pub mod images; pub mod kinds; -pub mod lisp; pub mod model; pub mod presentations; pub mod service_items; diff --git a/src/core/thumbnail.rs b/src/core/thumbnail.rs index 2ff2f70..108ed52 100644 --- a/src/core/thumbnail.rs +++ b/src/core/thumbnail.rs @@ -95,7 +95,10 @@ mod test { let screenshot = bg_path_from_video(video); let screenshot_string = screenshot.to_str().expect("Should be thing"); - assert_eq!(screenshot_string, "/home/chris/.local/share/lumina/thumbnails/moms-funeral.png"); + assert_eq!( + screenshot_string, + "/home/chris/.local/share/lumina/thumbnails/moms-funeral.png" + ); // let runtime = tokio::runtime::Runtime::new().unwrap(); let result = bg_from_video(video, &screenshot); @@ -118,6 +121,9 @@ mod test { let screenshot = bg_path_from_video(video); let screenshot_string = screenshot.to_str().expect("Should be thing"); - assert_ne!(screenshot_string, "/home/chris/.local/share/lumina/thumbnails/All WebDev Sucks and you know it.webm"); + assert_ne!( + screenshot_string, + "/home/chris/.local/share/lumina/thumbnails/All WebDev Sucks and you know it.webm" + ); } } diff --git a/src/main.rs b/src/main.rs index fe94c0f..1799207 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,26 +9,34 @@ use cosmic::app::{Core, Settings, Task}; use cosmic::iced::alignment::Vertical; use cosmic::iced::keyboard::{Key, Modifiers}; use cosmic::iced::window::{Mode, Position}; -use cosmic::iced::{self, event, window, Length, Point}; +use cosmic::iced::{ + self, event, window, Background as IcedBackground, Border, Color, + Length, +}; +use cosmic::iced_core::text::Wrapping; use cosmic::iced_futures::Subscription; use cosmic::iced_widget::{column, row, stack}; use cosmic::theme; use cosmic::widget::dnd_destination::dnd_destination; +use cosmic::widget::menu::key_bind::Modifier; +use cosmic::widget::menu::{ItemWidth, KeyBind}; use cosmic::widget::nav_bar::nav_bar_style; use cosmic::widget::tooltip::Position as TPosition; -use cosmic::widget::Container; use cosmic::widget::{ - button, horizontal_space, mouse_area, nav_bar, search_input, - tooltip, vertical_space, Space, + button, context_menu, horizontal_space, mouse_area, nav_bar, + nav_bar_toggle, responsive, scrollable, search_input, tooltip, + vertical_space, Space, }; use cosmic::widget::{container, text}; use cosmic::widget::{icon, slider}; +use cosmic::widget::{menu, Container}; use cosmic::{executor, Application, ApplicationExt, Element}; use crisp::types::Value; use lisp::parse_lisp; use miette::{miette, Result}; use rayon::prelude::*; use resvg::usvg::fontdb; +use std::collections::HashMap; use std::fs::read_to_string; use std::path::PathBuf; use std::sync::Arc; @@ -42,6 +50,7 @@ use ui::EditorMode; use crate::core::kinds::ServiceItemKind; use crate::ui::text_svg::{self}; +use crate::ui::widgets::draggable; pub mod core; pub mod lisp; @@ -54,7 +63,7 @@ struct Cli { watch: bool, #[arg(short = 'i', long)] ui: bool, - file: PathBuf, + file: Option, } fn main() -> Result<()> { @@ -106,7 +115,9 @@ struct App { presenter: Presenter, windows: Vec, service: Vec, + selected_items: Vec, current_item: (usize, usize), + hovered_item: Option, presentation_open: bool, cli_mode: bool, library: Option, @@ -119,6 +130,8 @@ struct App { search_id: cosmic::widget::Id, library_dragged_item: Option, fontdb: Arc, + menu_keys: HashMap, + context_menu: Option, } #[derive(Debug, Clone)] @@ -129,7 +142,7 @@ enum Message { File(PathBuf), OpenWindow, CloseWindow(Option), - WindowOpened(window::Id, Option), + WindowOpened(window::Id), WindowClosed(window::Id), AddLibrary(Library), LibraryToggle, @@ -138,15 +151,53 @@ enum Message { None, EditorToggle(bool), ChangeServiceItem(usize), + SelectServiceItem(usize), + AddSelectServiceItem(usize), + HoveredServiceItem(Option), AddServiceItem(usize, ServiceItem), + RemoveServiceItem(usize), AddServiceItemDrop(usize), AppendServiceItem(ServiceItem), - AddService(Vec), + ReorderService(usize, usize), + ContextMenuItem(usize), SearchFocus, Search(String), CloseSearch, UpdateSearchResults(Vec), OpenEditor(ServiceItem), + New, + Open, + OpenFile(PathBuf), + Save(Option), + SaveAs, + OpenSettings, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum MenuAction { + New, + Save, + SaveAs, + Open, + OpenSettings, + DeleteItem(usize), +} + +impl menu::Action for MenuAction { + type Message = Message; + + fn message(&self) -> Self::Message { + match self { + MenuAction::New => Message::New, + MenuAction::Save => Message::Save(None), + MenuAction::SaveAs => Message::SaveAs, + MenuAction::Open => Message::Open, + MenuAction::OpenSettings => Message::OpenSettings, + MenuAction::DeleteItem(index) => { + Message::RemoveServiceItem(*index) + } + } + } } const HEADER_SPACE: u16 = 6; @@ -179,30 +230,36 @@ impl cosmic::Application for App { windows.push(core.main_window_id().unwrap()); } - let items = match read_to_string(input.file) { - Ok(lisp) => { - let mut service_items = vec![]; - let lisp = crisp::reader::read(&lisp); - match lisp { - Value::List(vec) => { - // let items = vec - // .into_par_iter() - // .map(|value| parse_lisp(value)) - // .collect(); - // slide_vector.append(items); - for value in vec { - let mut inner_vector = parse_lisp(value); - service_items.append(&mut inner_vector); + let items = if let Some(file) = input.file { + match read_to_string(file) { + Ok(lisp) => { + let mut service_items = vec![]; + let lisp = crisp::reader::read(&lisp); + match lisp { + Value::List(vec) => { + // let items = vec + // .into_par_iter() + // .map(|value| parse_lisp(value)) + // .collect(); + // slide_vector.append(items); + for value in vec { + let mut inner_vector = + parse_lisp(value); + service_items + .append(&mut inner_vector); + } } + _ => todo!(), } - _ => todo!(), + service_items + } + Err(e) => { + warn!("Missing file or could not read: {e}"); + vec![] } - service_items - } - Err(e) => { - warn!("Missing file or could not read: {e}"); - vec![] } + } else { + vec![] }; let items: Vec = items @@ -230,12 +287,35 @@ impl cosmic::Application for App { // nav_model.insert().text(item.title()).data(item.clone()); // } + let mut menu_keys = HashMap::new(); + menu_keys.insert( + KeyBind { + modifiers: vec![Modifier::Ctrl], + key: Key::Character("s".into()), + }, + MenuAction::Save, + ); + menu_keys.insert( + KeyBind { + modifiers: vec![Modifier::Ctrl], + key: Key::Character("o".into()), + }, + MenuAction::Open, + ); + menu_keys.insert( + KeyBind { + modifiers: vec![Modifier::Ctrl], + key: Key::Character(".".into()), + }, + MenuAction::OpenSettings, + ); // nav_model.activate_position(0); let mut app = Self { presenter, core, nav_model, service: items, + selected_items: vec![], file: PathBuf::default(), windows, presentation_open: false, @@ -251,6 +331,9 @@ impl cosmic::Application for App { current_item: (0, 0), library_dragged_item: None, fontdb: Arc::clone(&fontdb), + menu_keys, + hovered_item: None, + context_menu: None, }; let mut batch = vec![]; @@ -270,7 +353,82 @@ impl cosmic::Application for App { } fn header_start(&self) -> Vec> { - vec![] + let file_menu = menu::Tree::with_children( + Into::>::into(menu::root("File")), + menu::items( + &self.menu_keys, + vec![ + menu::Item::Button( + "New", + Some( + icon::from_name("document-new") + .symbolic(true) + .into(), + ), + MenuAction::New, + ), + menu::Item::Button( + "Open", + Some( + icon::from_name("document-open") + .symbolic(true) + .into(), + ), + MenuAction::Open, + ), + menu::Item::Button( + "Save", + Some( + icon::from_name("document-save") + .symbolic(true) + .into(), + ), + MenuAction::Save, + ), + menu::Item::Button( + "Save As", + Some( + icon::from_name("document-save-as") + .symbolic(true) + .into(), + ), + MenuAction::SaveAs, + ), + ], + ), + ); + let settings_menu = menu::Tree::with_children( + Into::>::into( + menu::root("Settings").on_press(Message::None), + ), + menu::items( + &self.menu_keys, + vec![menu::Item::Button( + "Open Settings", + Some( + icon::from_name("settings") + .symbolic(true) + .into(), + ), + MenuAction::OpenSettings, + )], + ), + ); + let menu_bar = + menu::bar::(vec![file_menu, settings_menu]) + .item_width(ItemWidth::Static(250)) + .main_offset(10); + let library_button = tooltip( + nav_bar_toggle().on_toggle(Message::LibraryToggle), + if self.library_open { + "Hide library" + } else { + "Show library" + }, + TPosition::Bottom, + ) + .gap(cosmic::theme::spacing().space_xs); + vec![library_button.into(), menu_bar.into()] } fn header_center(&self) -> Vec> { @@ -309,7 +467,8 @@ impl cosmic::Application for App { .on_press(Message::SearchFocus), "Search Library", TPosition::Bottom, - ), + ) + .gap(cosmic::theme::spacing().space_xs), tooltip( button::custom( row!( @@ -332,7 +491,8 @@ impl cosmic::Application for App { )), "Enter Edit Mode", TPosition::Bottom, - ), + ) + .gap(cosmic::theme::spacing().space_xs), tooltip( button::custom( row!( @@ -363,7 +523,8 @@ impl cosmic::Application for App { }), "Start Presentation", TPosition::Bottom, - ), + ) + .gap(cosmic::theme::spacing().space_xs), tooltip( button::custom( row!( @@ -385,6 +546,7 @@ impl cosmic::Application for App { "Open Library", TPosition::Bottom, ) + .gap(cosmic::theme::spacing().space_xs), ] .spacing(HEADER_SPACE) .into(); @@ -434,23 +596,33 @@ impl cosmic::Application for App { debug!("Closing window"); Some(Message::CloseWindow(Some(id))) } - window::Event::Opened { - position, .. - } => { + window::Event::Opened { .. } => { debug!(?window_event, ?id); - Some(Message::WindowOpened(id, position)) + Some(Message::WindowOpened(id)) } window::Event::Closed => { debug!("Closed window"); Some(Message::WindowClosed(id)) } + window::Event::FileHovered(file) => { + debug!(?file); + None + } + window::Event::FileDropped(file) => { + debug!(?file); + None + } _ => None, } } iced::Event::Touch(_touch) => None, iced::Event::A11y(_id, _action_request) => None, - iced::Event::Dnd(_dnd_event) => None, - iced::Event::PlatformSpecific(_platform_specific) => { + iced::Event::Dnd(_dnd_event) => { + // debug!(?dnd_event); + None + } + iced::Event::PlatformSpecific(platform_specific) => { + debug!(?platform_specific); None } } @@ -580,7 +752,7 @@ impl cosmic::Application for App { }) } song_editor::Action::UpdateSong(song) => { - if let Some(library) = &mut self.library { + if let Some(_) = &mut self.library { self.update(Message::Library( library::Message::UpdateSong(song), )) @@ -612,19 +784,11 @@ impl cosmic::Application for App { self.service.get(item_index) { if item.slides.len() > slide_index + 1 { - // let slide_length = item.slides.len(); - // debug!( - // slide_index, - // slide_length, - // ?item, - // "Slides are longer" - // ); - let slide = item.slides - [slide_index + 1] - .clone(); + let slide_index = slide_index + 1; let action = self.presenter.update( - presenter::Message::SlideChange( - slide, + presenter::Message::ActivateSlide( + item_index, + slide_index, ), ); match action { @@ -644,10 +808,12 @@ impl cosmic::Application for App { // debug!("Slides are not longer"); self.current_item = (item_index + 1, 0); - if let Some(item) = - self.service.get(item_index + 1) + if self + .service + .get(item_index + 1) + .is_some() { - let action = self.presenter.update(presenter::Message::SlideChange(item.slides[0].clone())); + let action = self.presenter.update(presenter::Message::ActivateSlide(self.current_item.0, self.current_item.1)); match action { presenter::Action::Task( task, @@ -678,12 +844,11 @@ impl cosmic::Application for App { self.service.get(item_index) { if slide_index != 0 { - let slide = item.slides - [slide_index - 1] - .clone(); + let slide_index = slide_index - 1; let action = self.presenter.update( - presenter::Message::SlideChange( - slide, + presenter::Message::ActivateSlide( + item_index, + slide_index, ), ); match action { @@ -718,10 +883,12 @@ impl cosmic::Application for App { item_index - 1, previous_item_slides_length - 1, ); - if let Some(item) = - self.service.get(item_index - 1) + if self + .service + .get(item_index - 1) + .is_some() { - let action = self.presenter.update(presenter::Message::SlideChange(item.slides[previous_item_slides_length - 1].clone())); + let action = self.presenter.update(presenter::Message::ActivateSlide(self.current_item.0, self.current_item.1)); match action { presenter::Action::Task( task, @@ -818,9 +985,7 @@ impl cosmic::Application for App { .set_window_title(format!("window_{count}"), id); spawn_window.map(|id| { - cosmic::Action::App(Message::WindowOpened( - id, None, - )) + cosmic::Action::App(Message::WindowOpened(id)) }) } Message::CloseWindow(id) => { @@ -830,7 +995,7 @@ impl cosmic::Application for App { Task::none() } } - Message::WindowOpened(id, _) => { + Message::WindowOpened(id) => { debug!(?id, "Window opened"); if self.cli_mode || id > self.core.main_window_id().expect("Cosmic core seems to be missing a main window, was this started in cli mode?") @@ -873,10 +1038,6 @@ impl cosmic::Application for App { self.library = Some(library); Task::none() } - Message::AddService(service) => { - self.service = service; - Task::none() - } Message::None => Task::none(), Message::EditorToggle(edit) => { if edit { @@ -892,6 +1053,18 @@ impl cosmic::Application for App { self.search_id.clone(), ) } + Message::HoveredServiceItem(index) => { + self.hovered_item = index; + Task::none() + } + Message::SelectServiceItem(index) => { + self.selected_items = vec![index]; + Task::none() + } + Message::AddSelectServiceItem(index) => { + self.selected_items.push(index); + Task::none() + } Message::ChangeServiceItem(index) => { if let Some((index, item)) = self .service @@ -902,8 +1075,9 @@ impl cosmic::Application for App { { self.current_item = (index, 0); self.presenter.update( - presenter::Message::SlideChange( - slide.clone(), + presenter::Message::ActivateSlide( + self.current_item.0, + self.current_item.1, ), ); } @@ -925,6 +1099,15 @@ impl cosmic::Application for App { self.presenter.update_items(self.service.clone()); Task::none() } + Message::RemoveServiceItem(index) => { + self.service.remove(index); + self.presenter.update_items(self.service.clone()); + Task::none() + } + Message::ContextMenuItem(index) => { + self.context_menu = Some(index); + Task::none() + } Message::AddServiceItemDrop(index) => { if let Some(item) = &self.library_dragged_item { self.service.insert(index, item.clone()); @@ -947,6 +1130,12 @@ impl cosmic::Application for App { self.presenter.update_items(self.service.clone()); Task::none() } + Message::ReorderService(index, target_index) => { + let item = self.service.remove(index); + self.service.insert(target_index, item); + self.presenter.update_items(self.service.clone()); + Task::none() + } Message::Search(query) => { self.search_query = query.clone(); self.search(query) @@ -978,6 +1167,34 @@ impl cosmic::Application for App { ServiceItemKind::Content(_slide) => todo!(), } } + Message::New => { + debug!("new file"); + Task::none() + } + Message::Open => { + debug!("Open file"); + Task::none() + } + Message::OpenFile(file) => { + debug!(?file, "opening file"); + Task::none() + } + Message::Save(file) => { + let Some(file) = file else { + debug!("saving current"); + return Task::none(); + }; + debug!(?file, "saving new file"); + Task::none() + } + Message::SaveAs => { + debug!("saving as a file"); + Task::none() + } + Message::OpenSettings => { + debug!("Opening settings"); + Task::none() + } } } @@ -1069,8 +1286,7 @@ impl cosmic::Application for App { let song_editor = self.song_editor.view().map(Message::SongEditor); - let row = row![ - library, + let service_row = row![ service_list, Container::new( button::icon(icon_left) @@ -1104,23 +1320,33 @@ impl cosmic::Application for App { .height(Length::Fill) .spacing(20); - let column = column![ - Container::new(row).center_y(Length::Fill), + let preview_bar = if self.editor_mode.is_none() { Container::new( - self.presenter.preview_bar().map(Message::Present) + self.presenter.preview_bar().map(Message::Present), ) .clip(true) .width(Length::Fill) .center_y(180) - ]; + } else { + Container::new(horizontal_space()) + }; - if let Some(_editor) = &self.editor_mode { + let main_area = if let Some(editor) = &self.editor_mode { container(song_editor) .padding(cosmic::theme::spacing().space_xxl) - .into() } else { - Element::from(column) - } + Container::new(service_row).center_y(Length::Fill) + }; + + let column = column![ + row![ + library.width(Length::FillPortion(1)), + main_area.width(Length::FillPortion(4)) + ], + preview_bar + ]; + + column.into() } // View for presentation @@ -1159,9 +1385,8 @@ where }); self.windows.push(id); _ = self.set_window_title("Lumina Presenter".to_owned(), id); - spawn_window.map(|id| { - cosmic::Action::App(Message::WindowOpened(id, None)) - }) + spawn_window + .map(|id| cosmic::Action::App(Message::WindowOpened(id))) } fn add_library(&self) -> Task { @@ -1185,36 +1410,6 @@ where } } - fn add_service( - &self, - items: Vec, - fontdb: Arc, - ) -> Task { - Task::perform( - async move { - let items: Vec = items - .into_par_iter() - .map(|mut item| { - item.slides = item - .slides - .into_par_iter() - .map(|mut slide| { - text_svg::text_svg_generator( - &mut slide, - Arc::clone(&fontdb), - ); - slide - }) - .collect(); - item - }) - .collect(); - items - }, - |x| cosmic::Action::App(Message::AddService(x)), - ) - } - fn process_key_press( &mut self, key: Key, @@ -1237,6 +1432,15 @@ where } } match (key, modifiers) { + (Key::Character(k), Modifiers::CTRL) if k == *"s" => { + self.update(Message::Save(None)) + } + (Key::Character(k), Modifiers::CTRL) if k == *"o" => { + self.update(Message::Open) + } + (Key::Character(k), Modifiers::CTRL) if k == *"." => { + self.update(Message::OpenSettings) + } (Key::Character(k), Modifiers::CTRL) if k == *"k" || k == *"f" => { @@ -1278,65 +1482,189 @@ where } fn service_list(&self) -> Element { - let list = self - .service - .iter() - .enumerate() - .map(|(index, item)| { - let button = button::standard(item.title.clone()) - .leading_icon({ - match item.kind { - core::kinds::ServiceItemKind::Song(_) => { - icon::from_name("folder-music-symbolic") - }, - core::kinds::ServiceItemKind::Video(_) => { - icon::from_name("folder-videos-symbolic") - }, - core::kinds::ServiceItemKind::Image(_) => { - icon::from_name("folder-pictures-symbolic") - }, - core::kinds::ServiceItemKind::Presentation(_) => { - icon::from_name("x-office-presentation-symbolic") - }, - core::kinds::ServiceItemKind::Content(_) => { - icon::from_name("x-office-presentation-symbolic") - }, - } - }) - // .icon_size(cosmic::theme::spacing().space_l) - .class(cosmic::theme::style::Button::HeaderBar) - // .spacing(cosmic::theme::spacing().space_l) - // .padding(cosmic::theme::spacing().space_m) - // .height(cosmic::theme::spacing().space_xxxl) - .width(Length::Fill) - .on_press(Message::ChangeServiceItem(index)); - let tooltip = tooltip(button, - text::body(item.kind.to_string()), - TPosition::Right); - dnd_destination(tooltip, vec!["application/service-item".into()]) - .data_received_for::( move |item| { - if let Some(item) = item { - Message::AddServiceItem(index, item) - } else { - Message::None - } - }).on_finish(move |mime, data, action, x, y| { - debug!(mime, ?data, ?action, x, y); - let Ok(item) = ServiceItem::try_from((data, mime)) else { - return Message::None; - }; - debug!(?item); - Message::AddServiceItem(index, item) - }) + let list = + self.service.iter().enumerate().map(|(index, item)| { + let icon = match item.kind { + ServiceItemKind::Song(_) => { + icon::from_name("folder-music-symbolic") + } + ServiceItemKind::Video(_) => { + icon::from_name("folder-videos-symbolic") + } + ServiceItemKind::Image(_) => { + icon::from_name("folder-pictures-symbolic") + } + ServiceItemKind::Presentation(_) => { + icon::from_name( + "x-office-presentation-symbolic", + ) + } + ServiceItemKind::Content(_) => icon::from_name( + "x-office-presentation-symbolic", + ), + }; + let title = responsive(|size| { + text::heading(library::elide_text( + &item.title, + size.width, + )) + .align_y(Vertical::Center) + .wrapping(Wrapping::None) .into() + }); + let container = container( + row![icon, title] + .align_y(Vertical::Center) + .spacing(cosmic::theme::spacing().space_xs), + ) + .height(cosmic::theme::spacing().space_xl) + .padding(cosmic::theme::spacing().space_s) + .class(cosmic::theme::style::Container::Secondary) + .style(move |t| { + container::Style::default() + .background(IcedBackground::Color( + if self.hovered_item.is_some_and( + |hovered_index| { + index == hovered_index + }, + ) || self + .selected_items + .contains(&index) + { + t.cosmic().button.hover.into() + } else { + t.cosmic().button.base.into() + }, + )) + .border(Border::default().rounded( + t.cosmic().corner_radii.radius_m, + )) + }) + .width(Length::Fill); + let mouse_area = mouse_area(container) + .on_enter(Message::HoveredServiceItem(Some( + index, + ))) + .on_exit(Message::HoveredServiceItem(None)) + .on_double_press(Message::ChangeServiceItem( + index, + )) + .on_drag(Message::None) + .on_right_press(Message::ContextMenuItem(index)) + .on_release(Message::SelectServiceItem(index)); + let single_item = if let Some(context_menu_item) = + self.context_menu + { + if context_menu_item == index { + let context_menu = context_menu( + mouse_area, + self.context_menu.map_or_else( + || None, + |i| { + if i == index { + let menu = + vec![menu::Item::Button( + "Delete", + None, + MenuAction::DeleteItem(index), + )]; + Some(menu::items( + &HashMap::new(), + menu, + )) + } else { + None + } + }, + ), + ) + .close_on_escape(true); + Element::from(context_menu) + } else { + Element::from(mouse_area) + } + } else { + Element::from(mouse_area) + }; + let tooltip = tooltip( + single_item, + text::body(item.kind.to_string()), + TPosition::Right, + ) + .gap(cosmic::theme::spacing().space_xs); + dnd_destination( + tooltip, + vec!["application/service-item".into()], + ) + .data_received_for::(move |item| { + if let Some(item) = item { + Message::AddServiceItem(index, item) + } else { + Message::None + } + }) + .on_finish(move |mime, data, action, x, y| { + debug!(mime, ?data, ?action, x, y); + let Ok(item) = + ServiceItem::try_from((data, mime)) + else { + return Message::None; + }; + debug!(?item); + Message::AddServiceItem(index, item) + }) + .into() }); + let scrollable = scrollable( + draggable::column::column(list) + .spacing(10) + .on_drag(|event| match event { + draggable::DragEvent::Picked { .. } => { + Message::None + } + draggable::DragEvent::Dropped { + index, + target_index, + .. + } => Message::ReorderService(index, target_index), + draggable::DragEvent::Canceled { .. } => { + Message::None + } + }) + .style(|t| draggable::column::Style { + scale: 1.05, + moved_item_overlay: Color::from( + t.cosmic().primary.base, + ) + .scale_alpha(0.2) + .into(), + ghost_border: Border { + width: 1.0, + color: t.cosmic().secondary.base.into(), + radius: t.cosmic().radius_m().into(), + }, + ghost_background: Color::from( + t.cosmic().secondary.base, + ) + .scale_alpha(0.2) + .into(), + }) + .height(Length::Shrink), + ) + .anchor_top() + .height(Length::Fill); + let column = column![ text::heading("Service List") .center() .width(Length::Fill), iced::widget::horizontal_rule(1), - column(list).spacing(10), + scrollable + ] + .padding(10) + .spacing(10); + let container = Container::new(stack![ dnd_destination( vertical_space().width(Length::Fill), vec!["application/service-item".into()] @@ -1358,33 +1686,11 @@ where debug!(?item); Message::AppendServiceItem(item) } - ) - ] - .padding(10) - .spacing(10); - let container = Container::new(column) - // .height(Length::Fill) - .style(nav_bar_style); + ), + column + ]) + .style(nav_bar_style); container.center(Length::FillPortion(2)).into() } } - -#[cfg(test)] -mod test { - - fn test_slide() -> String { - let slide = r#"(slide (image :source "./somehting.jpg" :fill cover - (text "Something cooler" :font-size 50)))"#; - String::from(slide) - } - // #[test] - // fn test_lisp() { - // let slide = test_slide(); - // if let Ok(data) = lexpr::parse::from_str_elisp(slide.as_str()) { - // assert_eq!(slide, data) - // } else { - // assert!(false) - // } - // } -} diff --git a/src/ui/library.rs b/src/ui/library.rs index 09e5256..ff5d64f 100644 --- a/src/ui/library.rs +++ b/src/ui/library.rs @@ -52,7 +52,6 @@ pub struct Library { enum MenuMessage { Delete((LibraryKind, i32)), Open, - None, } impl MenuAction for MenuMessage { @@ -64,7 +63,6 @@ impl MenuAction for MenuMessage { Message::DeleteItem((*kind, *index)) } MenuMessage::Open => todo!(), - MenuMessage::None => todo!(), } } } @@ -314,9 +312,44 @@ impl<'a> Library { }) .ok() } - LibraryKind::Video => todo!(), - LibraryKind::Image => todo!(), - LibraryKind::Presentation => todo!(), + LibraryKind::Video => { + let video = Video::default(); + self.video_library + .add_item(video) + .map(|_| { + let index = + self.video_library.items.len(); + (LibraryKind::Video, index as i32) + }) + .ok() + } + LibraryKind::Image => { + let image = Image::default(); + self.image_library + .add_item(image) + .map(|_| { + let index = + self.image_library.items.len(); + (LibraryKind::Image, index as i32) + }) + .ok() + } + LibraryKind::Presentation => { + let presentation = Presentation::default(); + self.presentation_library + .add_item(presentation) + .map(|_| { + let index = self + .presentation_library + .items + .len(); + ( + LibraryKind::Presentation, + index as i32, + ) + }) + .ok() + } }; return self.update(Message::OpenItem(item)); } @@ -591,40 +624,43 @@ impl<'a> Library { column({ model.items.iter().enumerate().map( |(index, item)| { + let service_item = item.to_service_item(); let visual_item = self .single_item(index, item, model) .map(|()| Message::None); + DndSource::::new({ - let mouse_area = Element::from(mouse_area(visual_item) - .on_drag(Message::DragItem(service_item.clone())) - .on_enter(Message::HoverItem( - Some(( - model.kind, - index as i32, - )), - )) - .on_double_click( - Message::OpenItem(Some(( - model.kind, - index as i32, - ))), - ) - .on_right_press(Message::OpenContext(index as i32)) - .on_exit(Message::HoverItem(None)) - .on_press(Message::SelectItem( - Some(( - model.kind, - index as i32, - )), - ))); + let mouse_area = mouse_area(visual_item); + let mouse_area = mouse_area.on_enter(Message::HoverItem( + Some(( + model.kind, + index as i32, + )), + )) + .on_double_click( + Message::OpenItem(Some(( + model.kind, + index as i32, + ))), + ) + .on_right_press(Message::OpenContext(index as i32)) + .on_exit(Message::HoverItem(None)) + .on_press(Message::SelectItem( + Some(( + model.kind, + index as i32, + )), + )); + if let Some(context_id) = self.context_menu { if index == context_id as usize { + let menu_items = vec![menu::Item::Button("Delete", None, MenuMessage::Delete((model.kind, index as i32)))]; let context_menu = context_menu( mouse_area, self.context_menu.map_or_else(|| None, |_| { Some(menu::items(&self.menu_keys, - vec![menu::Item::Button("Delete", None, MenuMessage::Delete((model.kind, index as i32)))])) + menu_items)) }) ); Element::from(context_menu) @@ -958,7 +994,7 @@ async fn add_db() -> Result { SqlitePool::connect(&db_url).await.into_diagnostic() } -fn elide_text(text: impl AsRef, width: f32) -> String { +pub fn elide_text(text: impl AsRef, width: f32) -> String { const CHAR_SIZE: f32 = 8.0; let text: String = text.as_ref().to_owned(); let text_length = text.len() as f32 * CHAR_SIZE; diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 8372371..81eed17 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -3,6 +3,7 @@ use crate::core::model::LibraryKind; pub mod double_ended_slider; pub mod library; pub mod presenter; +pub mod service; pub mod slide_editor; pub mod song_editor; pub mod text_svg; diff --git a/src/ui/presenter.rs b/src/ui/presenter.rs index b17ad5a..20b4c63 100644 --- a/src/ui/presenter.rs +++ b/src/ui/presenter.rs @@ -1,5 +1,10 @@ use miette::{IntoDiagnostic, Result}; -use std::{fs::File, io::BufReader, path::PathBuf, sync::Arc}; +use std::{ + fs::File, + io::BufReader, + path::PathBuf, + sync::{Arc, LazyLock}, +}; use cosmic::{ iced::{ @@ -31,7 +36,8 @@ use crate::{ }; const REFERENCE_WIDTH: f32 = 1920.0; -const REFERENCE_HEIGHT: f32 = 1080.0; +static DEFAULT_SLIDE: LazyLock = + LazyLock::new(|| Slide::default()); // #[derive(Default, Clone, Debug)] pub(crate) struct Presenter { @@ -62,6 +68,7 @@ pub(crate) enum Message { NextSlide, PrevSlide, SlideChange(Slide), + ActivateSlide(usize, usize), EndVideo, StartVideo, StartAudio, @@ -147,14 +154,22 @@ impl Presenter { let total_slides: usize = items.iter().fold(0, |a, item| a + item.slides.len()); + let slide = + items.get(0).map(|item| item.slides.get(0)).flatten(); + let audio = items + .get(0) + .map(|item| item.slides.get(0).map(|slide| slide.audio())) + .flatten() + .flatten(); + Self { - current_slide: items[0].slides[0].clone(), + current_slide: slide.unwrap_or(&DEFAULT_SLIDE).clone(), current_item: 0, current_slide_index: 0, absolute_slide_index: 0, total_slides, video, - audio: items[0].slides[0].audio(), + audio, service: items, video_position: 0.0, hovered_slide: None, @@ -200,6 +215,19 @@ impl Presenter { // self.current_slide_index - 1, // )); } + Message::ActivateSlide(item_index, slide_index) => { + if let Some(slide) = self + .service + .get(item_index) + .map(|item| item.slides.get(slide_index)) + .flatten() + { + self.current_item = item_index; + self.current_slide_index = slide_index; + return self + .update(Message::SlideChange(slide.clone())); + } + } Message::SlideChange(slide) => { let slide_text = slide.text(); debug!(slide_text, "slide changed"); @@ -221,10 +249,34 @@ impl Presenter { self.reset_video(); } + let mut target_item = 0; + + self.service.iter().enumerate().try_for_each( + |(index, item)| { + item.slides.iter().enumerate().try_for_each( + |(slide_index, _)| { + target_item += 1; + if (index, slide_index) + == ( + self.current_item, + self.current_slide_index, + ) + { + None + } else { + Some(()) + } + }, + ) + }, + ); + + debug!(target_item); + let offset = AbsoluteOffset { x: { - if self.current_slide_index > 2 { - (self.current_slide_index as f32) + if target_item > 2 { + (target_item as f32) .mul_add(187.5, -187.5) } else { 0.0 @@ -232,7 +284,7 @@ impl Presenter { }, y: 0.0, }; - debug!(?offset); + let mut tasks = vec![]; tasks.push(scroll_to(self.scroll_id.clone(), offset)); @@ -399,21 +451,11 @@ impl Presenter { } pub fn view(&self) -> Element { - slide_view( - self.current_slide.clone(), - &self.video, - false, - true, - ) + slide_view(&self.current_slide, &self.video, false, true) } pub fn view_preview(&self) -> Element { - slide_view( - self.current_slide.clone(), - &self.video, - false, - false, - ) + slide_view(&self.current_slide, &self.video, false, false) } pub fn preview_bar(&self) -> Element { @@ -423,19 +465,6 @@ impl Presenter { let mut slides = vec![]; item.slides.iter().enumerate().for_each( |(slide_index, slide)| { - let font_name = slide.font().into_boxed_str(); - let family = - Family::Name(Box::leak(font_name)); - let weight = Weight::Normal; - let stretch = Stretch::Normal; - let style = Style::Normal; - let font = Font { - family, - weight, - stretch, - style, - }; - let is_current_slide = (item_index, slide_index) == ( @@ -444,7 +473,7 @@ impl Presenter { ); let container = slide_view( - slide.clone(), + &slide, &self.video, true, false, @@ -518,8 +547,9 @@ impl Presenter { ))) }) .on_exit(Message::HoveredSlide(None)) - .on_press(Message::SlideChange( - slide.clone(), + .on_press(Message::ActivateSlide( + item_index, + slide_index, )); slides.push(delegate.into()); }, @@ -705,7 +735,7 @@ fn scale_font(font_size: f32, width: f32) -> f32 { } pub(crate) fn slide_view<'a>( - slide: Slide, + slide: &'a Slide, video: &'a Option