From 726e9023c4629d70410174ddbd1e6d43f7583fe5 Mon Sep 17 00:00:00 2001 From: pml68 Date: Mon, 28 Oct 2024 01:00:07 +0100 Subject: feat: implement very basic playground fix: `is_dirty` was never checked for in the main update fn, allowing unsaved work to easily be overwritten --- iced_builder/src/views/element_list.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'iced_builder/src/views/element_list.rs') diff --git a/iced_builder/src/views/element_list.rs b/iced_builder/src/views/element_list.rs index f0fdd2f..a9aeb1f 100644 --- a/iced_builder/src/views/element_list.rs +++ b/iced_builder/src/views/element_list.rs @@ -1,5 +1,5 @@ use super::style; -use crate::{types::element_name::ElementName, Message}; +use crate::{types::ElementName, Message}; use iced::{ widget::{column, container, pane_grid, text, Column}, Alignment, Element, Length, -- cgit v1.2.3 From 87e745b8e60225a789b51d5011fa620051c4cfbe Mon Sep 17 00:00:00 2001 From: pml68 Date: Wed, 30 Oct 2024 03:00:17 +0100 Subject: feat: add error dialogs, windows manifest --- Cargo.lock | 332 +++++++++++++++++++--- iced_builder/Cargo.toml | 12 +- iced_builder/assets/windows/iced_builder.manifest | 8 + iced_builder/assets/windows/iced_builder.rc | 3 + iced_builder/build.rs | 7 + iced_builder/src/error.rs | 61 ++++ iced_builder/src/lib.rs | 78 +---- iced_builder/src/main.rs | 55 ++-- iced_builder/src/types/element_name.rs | 2 +- iced_builder/src/types/mod.rs | 33 +++ iced_builder/src/types/project.rs | 14 +- iced_builder/src/types/rendered_element.rs | 2 +- iced_builder/src/views/code_view.rs | 2 +- iced_builder/src/views/designer_view.rs | 5 +- iced_builder/src/views/element_list.rs | 2 +- rustfmt.toml | 3 + 16 files changed, 458 insertions(+), 161 deletions(-) create mode 100644 iced_builder/assets/windows/iced_builder.manifest create mode 100644 iced_builder/assets/windows/iced_builder.rc create mode 100644 iced_builder/build.rs create mode 100644 iced_builder/src/error.rs create mode 100644 rustfmt.toml (limited to 'iced_builder/src/views/element_list.rs') diff --git a/Cargo.lock b/Cargo.lock index 867bd8b..1e590ce 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -279,7 +279,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -314,7 +314,19 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", +] + +[[package]] +name = "atk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "251e0b7d90e33e0ba930891a505a9a35ece37b2dd37a14f3ffc306c13b980009" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", ] [[package]] @@ -474,7 +486,7 @@ checksum = "0cc8b54b395f2fcfbb3d90c47b01c7f444d94d05bdeb775811dec868ac3bbc26" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -489,6 +501,16 @@ version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "libc", + "system-deps", +] + [[package]] name = "calloop" version = "0.13.0" @@ -532,6 +554,16 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -846,7 +878,7 @@ dependencies = [ "objc", "rust-ini", "web-sys", - "winreg", + "winreg 0.10.1", "zbus", ] @@ -985,6 +1017,20 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +[[package]] +name = "embed-resource" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e24052d7be71f0efb50c201557f6fe7d237cfd5a64fd5bcd7fd8fe32dbbffa" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml", + "vswhom", + "winreg 0.52.0", +] + [[package]] name = "endi" version = "1.1.0" @@ -1009,7 +1055,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -1212,7 +1258,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -1300,7 +1346,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -1333,6 +1379,36 @@ dependencies = [ "slab", ] +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31ff856cb3386dae1703a920f803abafcc580e9b5f711ca62ed1620c25b51ff2" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -1380,6 +1456,19 @@ version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + [[package]] name = "gl_generator" version = "0.14.0" @@ -1397,6 +1486,16 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "151665d9be52f9bb40fc7966565d39666f2d1e69233571b71b87791c7e0528b3" +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + [[package]] name = "glow" version = "0.13.1" @@ -1418,6 +1517,17 @@ dependencies = [ "gl_generator", ] +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + [[package]] name = "gpu-alloc" version = "0.6.0" @@ -1470,6 +1580,24 @@ dependencies = [ "bitflags 2.6.0", ] +[[package]] +name = "gtk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771437bf1de2c1c0b496c11505bdf748e26066bbe942dfc8f614c9460f6d7722" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + [[package]] name = "guillotiere" version = "0.6.2" @@ -1530,6 +1658,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.3.9" @@ -1585,6 +1719,7 @@ dependencies = [ name = "iced_builder" version = "0.1.0" dependencies = [ + "embed-resource", "iced", "iced_aw", "iced_drop", @@ -1596,6 +1731,7 @@ dependencies = [ "thiserror", "tokio", "unique_id", + "windows_exe_info", ] [[package]] @@ -2299,7 +2435,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -2623,7 +2759,19 @@ dependencies = [ "by_address", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", ] [[package]] @@ -2722,7 +2870,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -2757,7 +2905,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -2830,12 +2978,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "pollster" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22686f4785f02a4fcc856d3b3bb19bf6c8160d103f7a99cc258bddd0251dc7f2" - [[package]] name = "portable-atomic" version = "1.9.0" @@ -3081,14 +3223,15 @@ checksum = "8af382a047821a08aa6bfc09ab0d80ff48d45d8726f7cd8e44891f7cb4a4278e" dependencies = [ "ashpd", "block2", + "glib-sys", + "gobject-sys", + "gtk-sys", "js-sys", "log", "objc2", "objc2-app-kit", "objc2-foundation", - "pollster", "raw-window-handle", - "urlencoding", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -3144,6 +3287,15 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + [[package]] name = "rustix" version = "0.38.37" @@ -3220,31 +3372,37 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d369a96f978623eb3dc28807c4852d6cc617fed53da5d3c400feff1ef34a714a" +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" + [[package]] name = "serde" -version = "1.0.210" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] name = "serde_json" -version = "1.0.128" +version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" dependencies = [ "itoa", "memchr", @@ -3260,7 +3418,16 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", ] [[package]] @@ -3500,9 +3667,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.79" +version = "2.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" dependencies = [ "proc-macro2", "quote", @@ -3540,6 +3707,25 @@ dependencies = [ "libc", ] +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck", + "pkg-config", + "toml", + "version-compare", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + [[package]] name = "tempfile" version = "3.13.0" @@ -3579,7 +3765,7 @@ checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -3680,19 +3866,34 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.40.0" +version = "1.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" dependencies = [ "backtrace", "pin-project-lite", ] +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + [[package]] name = "toml_datetime" version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] [[package]] name = "toml_edit" @@ -3701,6 +3902,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ "indexmap", + "serde", + "serde_spanned", "toml_datetime", "winnow", ] @@ -3724,7 +3927,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -3869,12 +4072,6 @@ dependencies = [ "serde", ] -[[package]] -name = "urlencoding" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - [[package]] name = "usvg" version = "0.42.0" @@ -3911,12 +4108,38 @@ dependencies = [ "getrandom", ] +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + [[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3b17ae1f6c8a2b28506cd96d412eebf83b4a0ff2cbefeeb952f2f9dfa44ba18" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "walkdir" version = "2.5.0" @@ -3955,7 +4178,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", "wasm-bindgen-shared", ] @@ -3989,7 +4212,7 @@ checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4445,6 +4668,15 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_exe_info" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7e7bfd02caf5cd98a197cec15c852685c8c42605f91d7be3083541a0b40a7ff" +dependencies = [ + "embed-resource", +] + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -4611,6 +4843,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "x11-dl" version = "2.21.0" @@ -4752,7 +4994,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", "zvariant_utils", ] @@ -4791,7 +5033,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -4826,7 +5068,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", "zvariant_utils", ] @@ -4838,5 +5080,5 @@ checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] diff --git a/iced_builder/Cargo.toml b/iced_builder/Cargo.toml index d08d485..e62f965 100644 --- a/iced_builder/Cargo.toml +++ b/iced_builder/Cargo.toml @@ -12,15 +12,19 @@ keywords = ["gui", "iced"] iced = { version = "0.13.1", features = [ "image","svg","canvas","qr_code","advanced","tokio","highlighter"] } iced_aw = { version = "0.11.0", default-features = false, features = ["menu","color_picker"] } iced_drop = { path = "../iced_drop" } -serde = { version = "1.0.210", features = ["derive"] } -serde_json = "1.0.128" -tokio = { version = "1.40.0", features = ["fs"] } -rfd = "0.15.0" +serde = { version = "1.0.214", features = ["derive"] } +serde_json = "1.0.132" +tokio = { version = "1.41.0", features = ["fs"] } +rfd = { version = "0.15.0", default-features = false, features = ["async-std", "gtk3"] } rust-format = "0.3.4" unique_id = "0.1.5" indexmap = { version = "2.6.0", features = ["serde"] } thiserror = "1.0.65" +[target.'cfg(windows)'.build-dependencies] +embed-resource = "2.5.0" +windows_exe_info = "0.4" + [[bin]] name = "iced-builder" path = "src/main.rs" diff --git a/iced_builder/assets/windows/iced_builder.manifest b/iced_builder/assets/windows/iced_builder.manifest new file mode 100644 index 0000000..82039bf --- /dev/null +++ b/iced_builder/assets/windows/iced_builder.manifest @@ -0,0 +1,8 @@ + + + + + PerMonitorV2, unaware + + + diff --git a/iced_builder/assets/windows/iced_builder.rc b/iced_builder/assets/windows/iced_builder.rc new file mode 100644 index 0000000..7255b65 --- /dev/null +++ b/iced_builder/assets/windows/iced_builder.rc @@ -0,0 +1,3 @@ +#define RT_MANIFEST 24 + +1 RT_MANIFEST "iced_builder.manifest" diff --git a/iced_builder/build.rs b/iced_builder/build.rs new file mode 100644 index 0000000..75261f8 --- /dev/null +++ b/iced_builder/build.rs @@ -0,0 +1,7 @@ +fn main() { + #[cfg(windows)] + { + embed_resource::compile("assets/windows/iced_builder.rc", embed_resource::NONE); + windows_exe_info::versioninfo::link_cargo_env(); + } +} diff --git a/iced_builder/src/error.rs b/iced_builder/src/error.rs new file mode 100644 index 0000000..5bf41b1 --- /dev/null +++ b/iced_builder/src/error.rs @@ -0,0 +1,61 @@ +use rfd::{MessageButtons, MessageDialog, MessageLevel}; +use std::io; +use thiserror::Error; + +#[derive(Debug, Clone, Error)] +pub enum Error { + #[error("An I/O error accured: {0}")] + IOError(String), + #[error("A Serde error accured: {0}")] + SerdeError(String), + #[error("A RustFmt error accured: {0}")] + FormatError(String), + #[error("The element tree contains no matching element")] + NonExistentElement, + #[error("The file dialog has been closed without selecting a valid option")] + DialogClosed, + #[error("{0}")] + Other(String), +} + +impl From for Error { + fn from(value: io::Error) -> Self { + Self::IOError(value.to_string()) + } +} + +impl From for Error { + fn from(value: serde_json::Error) -> Self { + Self::SerdeError(value.to_string()) + } +} + +impl From for Error { + fn from(value: rust_format::Error) -> Self { + Self::FormatError(value.to_string()) + } +} + +impl From<&'static str> for Error { + fn from(value: &'static str) -> Self { + Self::Other(value.to_owned()) + } +} + +pub fn error_dialog(description: impl Into) { + MessageDialog::new() + .set_level(MessageLevel::Error) + .set_buttons(MessageButtons::Ok) + .set_title("Oops! Something went wrong.") + .set_description(description) + .show(); +} + +pub fn warning_dialog(title: impl Into, description: impl Into) { + MessageDialog::new() + .set_level(MessageLevel::Warning) + .set_buttons(MessageButtons::Ok) + .set_title(title) + .set_description(description) + .show(); +} diff --git a/iced_builder/src/lib.rs b/iced_builder/src/lib.rs index c6f3616..ddb080c 100644 --- a/iced_builder/src/lib.rs +++ b/iced_builder/src/lib.rs @@ -1,79 +1,5 @@ +pub mod error; pub mod types; pub mod views; -use std::{io, path::PathBuf}; - -use iced::widget::{pane_grid, text_editor}; -use types::{ - element_name::ElementName, project::Project, rendered_element::RenderedElement, DesignerPage, -}; - -use thiserror::Error; - -#[derive(Debug, Clone, Error)] -pub enum Error { - #[error("an I/O error accured: {0}")] - IOError(String), - #[error("a Serde error accured: {0}")] - SerdeError(String), - #[error("an RustFmt error accured: {0}")] - FormatError(String), - #[error("the element tree contains no matching element")] - NonExistentElement, - #[error("the file dialog has been closed without selecting a valid option")] - DialogClosed, - #[error("{0}")] - Other(String), -} - -impl From for Error { - fn from(value: io::Error) -> Self { - Self::IOError(value.to_string()) - } -} - -impl From for Error { - fn from(value: serde_json::Error) -> Self { - Self::SerdeError(value.to_string()) - } -} - -impl From for Error { - fn from(value: rust_format::Error) -> Self { - Self::FormatError(value.to_string()) - } -} - -impl From<&'static str> for Error { - fn from(value: &'static str) -> Self { - Self::Other(value.to_owned()) - } -} - -#[derive(Debug, Clone)] -pub enum Message { - ToggleDarkMode, - CopyCode, - SwitchPage(DesignerPage), - EditorAction(text_editor::Action), - RefreshEditorContent, - DropNewElement(ElementName, iced::Point, iced::Rectangle), - HandleNew( - ElementName, - Vec<(iced::advanced::widget::Id, iced::Rectangle)>, - ), - MoveElement(RenderedElement, iced::Point, iced::Rectangle), - HandleMove( - RenderedElement, - Vec<(iced::advanced::widget::Id, iced::Rectangle)>, - ), - PaneResized(pane_grid::ResizeEvent), - PaneClicked(pane_grid::Pane), - PaneDragged(pane_grid::DragEvent), - NewFile, - OpenFile, - FileOpened(Result<(PathBuf, Project), Error>), - SaveFile, - SaveFileAs, - FileSaved(Result), -} +pub type Result = std::result::Result; diff --git a/iced_builder/src/main.rs b/iced_builder/src/main.rs index d022f29..bbf01c5 100644 --- a/iced_builder/src/main.rs +++ b/iced_builder/src/main.rs @@ -11,9 +11,9 @@ use iced::{ Alignment, Element, Length, Settings, Task, Theme, }; use iced_builder::{ - types::{Action, DesignerPage, ElementName, Project}, + error::error_dialog, + types::{Action, DesignerPage, ElementName, Message, Project}, views::{code_view, designer_view, element_list}, - Message, }; fn main() -> iced::Result { @@ -109,14 +109,12 @@ impl App { self.editor_content.perform(action); } } - Message::RefreshEditorContent => { - let code = self - .project - .clone() - .app_code() - .unwrap_or_else(|err| err.to_string()); - self.editor_content = text_editor::Content::with_text(&code); - } + Message::RefreshEditorContent => match self.project.clone().app_code() { + Ok(code) => { + self.editor_content = text_editor::Content::with_text(&code); + } + Err(error) => error_dialog(error.to_string()), + }, Message::DropNewElement(name, point, _) => { return iced_drop::zones_on_point( move |zones| Message::HandleNew(name.clone(), zones), @@ -131,8 +129,10 @@ impl App { if ids.len() > 0 { let action = Action::new(ids, &mut self.project.element_tree.clone(), None); let result = name.handle_action(self.project.element_tree.as_mut(), action); - if let Ok(Some(ref element)) = result { - self.project.element_tree = Some(element.clone()); + match result { + Ok(Some(ref element)) => self.project.element_tree = Some(element.clone()), + Err(error) => error_dialog(error.to_string()), + _ => {} } self.is_dirty = true; @@ -157,7 +157,10 @@ impl App { &mut self.project.element_tree.clone(), Some(element.get_id()), ); - let _ = element.handle_action(self.project.element_tree.as_mut(), action); + let result = element.handle_action(self.project.element_tree.as_mut(), action); + if let Err(error) = result { + error_dialog(error.to_string()); + } self.is_dirty = true; } @@ -185,19 +188,22 @@ impl App { if !self.is_loading && !self.is_dirty { self.is_loading = true; - return Task::perform(Project::from_file(), Message::FileOpened); + return Task::perform(Project::from_path(), Message::FileOpened); } } Message::FileOpened(result) => { self.is_loading = false; self.is_dirty = false; - if let Ok((path, project)) = result { - self.project = project.clone(); - self.project_path = Some(path); - self.editor_content = text_editor::Content::with_text( - &project.app_code().unwrap_or_else(|err| err.to_string()), - ); + match result { + Ok((path, project)) => { + self.project = project.clone(); + self.project_path = Some(path); + self.editor_content = text_editor::Content::with_text( + &project.app_code().unwrap_or_else(|err| err.to_string()), + ); + } + Err(error) => error_dialog(error.to_string()), } } Message::SaveFile => { @@ -225,9 +231,12 @@ impl App { Message::FileSaved(result) => { self.is_loading = false; - if let Ok(path) = result { - self.project_path = Some(path); - self.is_dirty = false; + match result { + Ok(path) => { + self.project_path = Some(path); + self.is_dirty = false; + } + Err(error) => error_dialog(error.to_string()), } } } diff --git a/iced_builder/src/types/element_name.rs b/iced_builder/src/types/element_name.rs index bf38120..d71ae30 100644 --- a/iced_builder/src/types/element_name.rs +++ b/iced_builder/src/types/element_name.rs @@ -1,6 +1,6 @@ use serde::{Deserialize, Serialize}; -use crate::Error; +use crate::error::Error; use super::rendered_element::{ button, column, container, image, row, svg, text, Action, RenderedElement, diff --git a/iced_builder/src/types/mod.rs b/iced_builder/src/types/mod.rs index 0012905..841b255 100644 --- a/iced_builder/src/types/mod.rs +++ b/iced_builder/src/types/mod.rs @@ -6,6 +6,39 @@ pub use element_name::ElementName; pub use project::Project; pub use rendered_element::*; +use std::path::PathBuf; + +use crate::error::Error; +use iced::widget::{pane_grid, text_editor}; + +#[derive(Debug, Clone)] +pub enum Message { + ToggleDarkMode, + CopyCode, + SwitchPage(DesignerPage), + EditorAction(text_editor::Action), + RefreshEditorContent, + DropNewElement(ElementName, iced::Point, iced::Rectangle), + HandleNew( + ElementName, + Vec<(iced::advanced::widget::Id, iced::Rectangle)>, + ), + MoveElement(RenderedElement, iced::Point, iced::Rectangle), + HandleMove( + RenderedElement, + Vec<(iced::advanced::widget::Id, iced::Rectangle)>, + ), + PaneResized(pane_grid::ResizeEvent), + PaneClicked(pane_grid::Pane), + PaneDragged(pane_grid::DragEvent), + NewFile, + OpenFile, + FileOpened(Result<(PathBuf, Project), Error>), + SaveFile, + SaveFileAs, + FileSaved(Result), +} + #[derive(Debug, Clone)] pub enum DesignerPage { Designer, diff --git a/iced_builder/src/types/project.rs b/iced_builder/src/types/project.rs index 52da41c..8d24a75 100644 --- a/iced_builder/src/types/project.rs +++ b/iced_builder/src/types/project.rs @@ -4,7 +4,7 @@ use std::path::{Path, PathBuf}; use iced::Theme; use serde::{Deserialize, Serialize}; -use crate::Error; +use crate::error::Error; use super::rendered_element::RenderedElement; @@ -55,10 +55,10 @@ impl Project { } } - pub async fn from_file() -> Result<(PathBuf, Self), Error> { + pub async fn from_path() -> Result<(PathBuf, Self), Error> { let picked_file = rfd::AsyncFileDialog::new() .set_title("Open a JSON file...") - .add_filter("*.JSON, *.json", &["JSON", "json"]) + .add_filter("*.json, *.JSON", &["json", "JSON"]) .pick_file() .await .ok_or(Error::DialogClosed)?; @@ -77,7 +77,7 @@ impl Project { } else { rfd::AsyncFileDialog::new() .set_title("Save to JSON file...") - .add_filter("*.JSON, *.json", &["JSON", "json"]) + .add_filter("*.json, *.JSON", &["json", "JSON"]) .save_file() .await .as_ref() @@ -103,7 +103,7 @@ impl Project { {app_code} fn main() -> iced::Result {{ - iced::application("{}", State::update, State::view).theme(iced::Theme::{}).run() + iced::application("{}", State::update, State::view).theme(State::theme).run() }} #[derive(Default)] @@ -115,6 +115,10 @@ impl Project { impl State {{ fn update(&mut self, _message: Message) {{}} + fn theme(&self) -> iced::Theme {{ + iced::Theme::{} + }} + fn view(&self) -> Element {{ {view}.into() }} diff --git a/iced_builder/src/types/rendered_element.rs b/iced_builder/src/types/rendered_element.rs index 3dad8e7..58fd18d 100755 --- a/iced_builder/src/types/rendered_element.rs +++ b/iced_builder/src/types/rendered_element.rs @@ -5,7 +5,7 @@ use iced::{widget, Element, Length}; use serde::{Deserialize, Serialize}; use unique_id::{string::StringGenerator, Generator}; -use crate::{Error, Message}; +use crate::{error::Error, types::Message}; use super::ElementName; diff --git a/iced_builder/src/views/code_view.rs b/iced_builder/src/views/code_view.rs index 4515687..e872e3d 100644 --- a/iced_builder/src/views/code_view.rs +++ b/iced_builder/src/views/code_view.rs @@ -1,5 +1,5 @@ use super::style; -use crate::{types::DesignerPage, Message}; +use crate::types::{DesignerPage, Message}; use iced::{ highlighter, widget::{button, container, pane_grid, row, text, text_editor, tooltip, Space}, diff --git a/iced_builder/src/views/designer_view.rs b/iced_builder/src/views/designer_view.rs index 2d88493..1f7de88 100644 --- a/iced_builder/src/views/designer_view.rs +++ b/iced_builder/src/views/designer_view.rs @@ -1,8 +1,5 @@ use super::style; -use crate::{ - types::{DesignerPage, RenderedElement}, - Message, -}; +use crate::types::{DesignerPage, Message, RenderedElement}; use iced::{ widget::{button, container, pane_grid, row, text, themer, Space}, Alignment, Element, Length, diff --git a/iced_builder/src/views/element_list.rs b/iced_builder/src/views/element_list.rs index a9aeb1f..6e78ae0 100644 --- a/iced_builder/src/views/element_list.rs +++ b/iced_builder/src/views/element_list.rs @@ -1,5 +1,5 @@ use super::style; -use crate::{types::ElementName, Message}; +use crate::types::{ElementName, Message}; use iced::{ widget::{column, container, pane_grid, text, Column}, Alignment, Element, Length, diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 0000000..334de43 --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1,3 @@ +edition = "2021" +imports_granularity = "Module" +group_imports = "StdExternalCrate" -- cgit v1.2.3 From 699e380dd2d6ebf61849dba8c225b512e9fa816a Mon Sep 17 00:00:00 2001 From: pml68 Date: Tue, 24 Dec 2024 00:44:27 +0100 Subject: style: add `max_width=80` to rustfmt.toml --- iced_builder/build.rs | 5 +- iced_builder/src/dialogs.rs | 4 +- iced_builder/src/error.rs | 5 +- iced_builder/src/main.rs | 152 +++++++++++++++++------------ iced_builder/src/types/element_name.rs | 3 +- iced_builder/src/types/mod.rs | 12 +-- iced_builder/src/types/project.rs | 8 +- iced_builder/src/types/rendered_element.rs | 91 ++++++++++------- iced_builder/src/views/code_view.rs | 12 +-- iced_builder/src/views/designer_view.rs | 10 +- iced_builder/src/views/element_list.rs | 19 ++-- rustfmt.toml | 1 + 12 files changed, 187 insertions(+), 135 deletions(-) (limited to 'iced_builder/src/views/element_list.rs') diff --git a/iced_builder/build.rs b/iced_builder/build.rs index 54edc54..438ce37 100644 --- a/iced_builder/build.rs +++ b/iced_builder/build.rs @@ -3,7 +3,10 @@ fn main() { iced_fontello::build("fonts/icons.toml").expect("Build icons font"); #[cfg(windows)] { - embed_resource::compile("assets/windows/iced_builder.rc", embed_resource::NONE); + embed_resource::compile( + "assets/windows/iced_builder.rc", + embed_resource::NONE, + ); windows_exe_info::versioninfo::link_cargo_env(); } } diff --git a/iced_builder/src/dialogs.rs b/iced_builder/src/dialogs.rs index edd6cea..047ffd2 100644 --- a/iced_builder/src/dialogs.rs +++ b/iced_builder/src/dialogs.rs @@ -9,7 +9,9 @@ pub fn error_dialog(description: impl Into) { .show(); } -pub fn unsaved_changes_dialog(description: impl Into) -> MessageDialogResult { +pub fn unsaved_changes_dialog( + description: impl Into, +) -> MessageDialogResult { MessageDialog::new() .set_level(MessageLevel::Warning) .set_buttons(MessageButtons::OkCancel) diff --git a/iced_builder/src/error.rs b/iced_builder/src/error.rs index 2fea184..8876016 100644 --- a/iced_builder/src/error.rs +++ b/iced_builder/src/error.rs @@ -1,5 +1,6 @@ use std::io; use std::sync::Arc; + use thiserror::Error; #[derive(Debug, Clone, Error)] @@ -10,7 +11,9 @@ pub enum Error { FormatError(Arc), #[error("The element tree contains no matching element")] NonExistentElement, - #[error("The file dialog has been closed without selecting a valid option")] + #[error( + "The file dialog has been closed without selecting a valid option" + )] DialogClosed, #[error("{0}")] Other(String), diff --git a/iced_builder/src/main.rs b/iced_builder/src/main.rs index e42e854..ab708df 100644 --- a/iced_builder/src/main.rs +++ b/iced_builder/src/main.rs @@ -1,22 +1,16 @@ use std::path::PathBuf; -use iced::{ - advanced::widget::Id, - clipboard, keyboard, - widget::{ - container, - pane_grid::{self, Pane, PaneGrid}, - pick_list, row, text_editor, Column, - }, - Alignment, Element, Length, Task, Theme, -}; +use iced::advanced::widget::Id; +use iced::widget::pane_grid::{self, Pane, PaneGrid}; +use iced::widget::{container, pick_list, row, text_editor, Column}; +use iced::{clipboard, keyboard, Alignment, Element, Length, Task, Theme}; use iced_anim::{Animation, Spring}; -use iced_builder::{ - dialogs::{error_dialog, unsaved_changes_dialog}, - icon, - types::{Action, DesignerPage, ElementName, Message, Project}, - views::{code_view, designer_view, element_list}, +use iced_builder::dialogs::{error_dialog, unsaved_changes_dialog}; +use iced_builder::icon; +use iced_builder::types::{ + Action, DesignerPage, ElementName, Message, Project, }; +use iced_builder::views::{code_view, designer_view, element_list}; use rfd::MessageDialogResult; const THEMES: &'static [Theme] = &[Theme::SolarizedDark, Theme::SolarizedLight]; @@ -50,12 +44,14 @@ enum Panes { impl App { fn new() -> (Self, Task) { - let state = pane_grid::State::with_configuration(pane_grid::Configuration::Split { - axis: pane_grid::Axis::Vertical, - ratio: 0.8, - a: Box::new(pane_grid::Configuration::Pane(Panes::Designer)), - b: Box::new(pane_grid::Configuration::Pane(Panes::ElementList)), - }); + let state = pane_grid::State::with_configuration( + pane_grid::Configuration::Split { + axis: pane_grid::Axis::Vertical, + ratio: 0.8, + a: Box::new(pane_grid::Configuration::Pane(Panes::Designer)), + b: Box::new(pane_grid::Configuration::Pane(Panes::ElementList)), + }, + ); ( Self { is_dirty: false, @@ -98,19 +94,24 @@ impl App { Message::ToggleTheme(event) => { self.theme.update(event); } - Message::CopyCode => return clipboard::write(self.editor_content.text()), + Message::CopyCode => { + return clipboard::write(self.editor_content.text()) + } Message::SwitchPage(page) => self.designer_page = page, Message::EditorAction(action) => { if let text_editor::Action::Scroll { lines: _ } = action { self.editor_content.perform(action); } } - Message::RefreshEditorContent => match self.project.clone().app_code() { - Ok(code) => { - self.editor_content = text_editor::Content::with_text(&code); + Message::RefreshEditorContent => { + match self.project.clone().app_code() { + Ok(code) => { + self.editor_content = + text_editor::Content::with_text(&code); + } + Err(error) => error_dialog(error.to_string()), } - Err(error) => error_dialog(error.to_string()), - }, + } Message::DropNewElement(name, point, _) => { return iced_drop::zones_on_point( move |zones| Message::HandleNew(name.clone(), zones), @@ -123,10 +124,19 @@ impl App { Message::HandleNew(name, zones) => { let ids: Vec = zones.into_iter().map(|z| z.0).collect(); if ids.len() > 0 { - let action = Action::new(ids, &mut self.project.element_tree.clone(), None); - let result = name.handle_action(self.project.element_tree.as_mut(), action); + let action = Action::new( + ids, + &mut self.project.element_tree.clone(), + None, + ); + let result = name.handle_action( + self.project.element_tree.as_mut(), + action, + ); match result { - Ok(Some(ref element)) => self.project.element_tree = Some(element.clone()), + Ok(Some(ref element)) => { + self.project.element_tree = Some(element.clone()) + } Err(error) => error_dialog(error.to_string()), _ => {} } @@ -152,7 +162,10 @@ impl App { &mut self.project.element_tree.clone(), Some(element.get_id()), ); - let result = element.handle_action(self.project.element_tree.as_mut(), action); + let result = element.handle_action( + self.project.element_tree.as_mut(), + action, + ); if let Err(error) = result { error_dialog(error.to_string()); } @@ -167,7 +180,10 @@ impl App { Message::PaneClicked(pane) => { self.focus = Some(pane); } - Message::PaneDragged(pane_grid::DragEvent::Dropped { pane, target }) => { + Message::PaneDragged(pane_grid::DragEvent::Dropped { + pane, + target, + }) => { self.pane_state.drop(pane, target); } Message::PaneDragged(_) => {} @@ -192,7 +208,10 @@ impl App { if !self.is_dirty { self.is_loading = true; - return Task::perform(Project::from_path(), Message::FileOpened); + return Task::perform( + Project::from_path(), + Message::FileOpened, + ); } else { if let MessageDialogResult::Ok = unsaved_changes_dialog("You have unsaved changes. Do you wish to discard these and open another project?") { self.is_dirty = false; @@ -211,7 +230,9 @@ impl App { self.project = project.clone(); self.project_path = Some(path); self.editor_content = text_editor::Content::with_text( - &project.app_code().unwrap_or_else(|err| err.to_string()), + &project + .app_code() + .unwrap_or_else(|err| err.to_string()), ); } Err(error) => error_dialog(error.to_string()), @@ -260,11 +281,13 @@ impl App { if modifiers.command() { match key.as_ref() { keyboard::Key::Character("o") => Some(Message::OpenFile), - keyboard::Key::Character("s") => Some(if modifiers.shift() { - Message::SaveFileAs - } else { - Message::SaveFile - }), + keyboard::Key::Character("s") => { + Some(if modifiers.shift() { + Message::SaveFileAs + } else { + Message::SaveFile + }) + } keyboard::Key::Character("n") => Some(Message::NewFile), _ => None, } @@ -281,30 +304,33 @@ impl App { |theme| { Message::ToggleTheme(theme.into()) } )] .width(200); - let pane_grid = PaneGrid::new(&self.pane_state, |id, pane, _is_maximized| { - let is_focused = Some(id) == self.focus; - match pane { - Panes::Designer => match &self.designer_page { - DesignerPage::DesignerView => designer_view::view( - &self.project.element_tree, - self.project.get_theme(), - is_focused, - ), - DesignerPage::CodeView => code_view::view( - &self.editor_content, - self.theme.value().clone(), - is_focused, - ), - }, - Panes::ElementList => element_list::view(&self.element_list, is_focused), - } - }) - .width(Length::Fill) - .height(Length::Fill) - .spacing(10) - .on_resize(10, Message::PaneResized) - .on_click(Message::PaneClicked) - .on_drag(Message::PaneDragged); + let pane_grid = + PaneGrid::new(&self.pane_state, |id, pane, _is_maximized| { + let is_focused = Some(id) == self.focus; + match pane { + Panes::Designer => match &self.designer_page { + DesignerPage::DesignerView => designer_view::view( + &self.project.element_tree, + self.project.get_theme(), + is_focused, + ), + DesignerPage::CodeView => code_view::view( + &self.editor_content, + self.theme.value().clone(), + is_focused, + ), + }, + Panes::ElementList => { + element_list::view(&self.element_list, is_focused) + } + } + }) + .width(Length::Fill) + .height(Length::Fill) + .spacing(10) + .on_resize(10, Message::PaneResized) + .on_click(Message::PaneClicked) + .on_drag(Message::PaneDragged); let content = Column::new() .push(header) diff --git a/iced_builder/src/types/element_name.rs b/iced_builder/src/types/element_name.rs index cdbdf8f..5567cff 100644 --- a/iced_builder/src/types/element_name.rs +++ b/iced_builder/src/types/element_name.rs @@ -1,10 +1,9 @@ use serde::{Deserialize, Serialize}; -use crate::{Error, Result}; - use super::rendered_element::{ button, column, container, image, row, svg, text, Action, RenderedElement, }; +use crate::{Error, Result}; #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub enum ElementName { diff --git a/iced_builder/src/types/mod.rs b/iced_builder/src/types/mod.rs index 02fab4a..161b5e1 100644 --- a/iced_builder/src/types/mod.rs +++ b/iced_builder/src/types/mod.rs @@ -2,18 +2,16 @@ pub mod element_name; pub mod project; pub mod rendered_element; +use std::path::PathBuf; + pub use element_name::ElementName; +use iced::widget::{pane_grid, text_editor}; +use iced::Theme; +use iced_anim::SpringEvent; pub use project::Project; pub use rendered_element::*; -use std::path::PathBuf; - use crate::Result; -use iced::{ - widget::{pane_grid, text_editor}, - Theme, -}; -use iced_anim::SpringEvent; #[derive(Debug, Clone)] pub enum Message { diff --git a/iced_builder/src/types/project.rs b/iced_builder/src/types/project.rs index 3bd5975..f4dbcc4 100644 --- a/iced_builder/src/types/project.rs +++ b/iced_builder/src/types/project.rs @@ -1,12 +1,11 @@ -use rust_format::{Config, Edition, Formatter, RustFmt}; use std::path::{Path, PathBuf}; use iced::Theme; +use rust_format::{Config, Edition, Formatter, RustFmt}; use serde::{Deserialize, Serialize}; -use crate::{Error, Result}; - use super::rendered_element::RenderedElement; +use crate::{Error, Result}; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Project { @@ -96,7 +95,8 @@ impl Project { match self.element_tree { Some(ref element_tree) => { let (imports, view) = element_tree.codegen(); - let mut app_code = format!("use iced::{{widget::{{{imports}}},Element}};"); + let mut app_code = + format!("use iced::{{widget::{{{imports}}},Element}};"); app_code = format!( r#"// Automatically generated by iced Builder diff --git a/iced_builder/src/types/rendered_element.rs b/iced_builder/src/types/rendered_element.rs index 3bb3626..35198a1 100755 --- a/iced_builder/src/types/rendered_element.rs +++ b/iced_builder/src/types/rendered_element.rs @@ -1,12 +1,13 @@ +use std::collections::BTreeMap; + use blob_uuid::random_blob; use iced::advanced::widget::Id; use iced::{widget, Element, Length}; use serde::{Deserialize, Serialize}; -use crate::{types::Message, Result}; -use std::collections::BTreeMap; - use super::ElementName; +use crate::types::Message; +use crate::Result; #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct RenderedElement { @@ -55,7 +56,10 @@ impl RenderedElement { } } - pub fn find_parent(&mut self, child_element: &RenderedElement) -> Option<&mut Self> { + pub fn find_parent( + &mut self, + child_element: &RenderedElement, + ) -> Option<&mut Self> { if child_element == self { return Some(self); } else if self.child_elements.is_some() { @@ -92,7 +96,9 @@ impl RenderedElement { pub fn remove(&mut self, element: &RenderedElement) { if let Some(child_elements) = self.child_elements.as_mut() { - if let Some(index) = child_elements.iter().position(|x| x == element) { + if let Some(index) = + child_elements.iter().position(|x| x == element) + { let _ = child_elements.remove(index); } } @@ -106,7 +112,9 @@ impl RenderedElement { pub fn insert_after(&mut self, id: Id, element: &RenderedElement) { if let Some(child_elements) = self.child_elements.as_mut() { - if let Some(index) = child_elements.iter().position(|x| x.get_id() == id) { + if let Some(index) = + child_elements.iter().position(|x| x.get_id() == id) + { child_elements.insert(index + 1, element.clone()); } else { child_elements.push(element.clone()); @@ -178,16 +186,21 @@ impl RenderedElement { } iced_drop::droppable( widget::container( - widget::column![widget::text(self.name.clone().to_string()), children] - .width(Length::Fill) - .spacing(10), + widget::column![ + widget::text(self.name.clone().to_string()), + children + ] + .width(Length::Fill) + .spacing(10), ) .padding(10) .style(widget::container::bordered_box), ) .id(self.get_id()) .drag_hide(true) - .on_drop(move |point, rect| Message::MoveElement(self.clone(), point, rect)) + .on_drop(move |point, rect| { + Message::MoveElement(self.clone(), point, rect) + }) .into() } @@ -327,28 +340,32 @@ impl<'a> From for Element<'a, Message> { } ElementName::SVG(p) => widget::svg(p).into(), ElementName::Image(p) => widget::image(p).into(), - ElementName::Container => widget::container(if child_elements.len() == 1 { - child_elements[0].clone().into() - } else { - Element::from("") - }) + ElementName::Container => { + widget::container(if child_elements.len() == 1 { + child_elements[0].clone().into() + } else { + Element::from("") + }) + .padding(20) + .into() + } + ElementName::Row => widget::Row::from_iter( + child_elements.into_iter().map(|el| el.into()), + ) + .padding(20) + .into(), + ElementName::Column => widget::Column::from_iter( + child_elements.into_iter().map(|el| el.into()), + ) .padding(20) .into(), - ElementName::Row => { - widget::Row::from_iter(child_elements.into_iter().map(|el| el.into())) - .padding(20) - .into() - } - ElementName::Column => { - widget::Column::from_iter(child_elements.into_iter().map(|el| el.into())) - .padding(20) - .into() - } }; iced_drop::droppable(content) .id(value.get_id()) .drag_hide(true) - .on_drop(move |point, rect| Message::MoveElement(value.clone(), point, rect)) + .on_drop(move |point, rect| { + Message::MoveElement(value.clone(), point, rect) + }) .into() } } @@ -378,8 +395,10 @@ impl Action { } else { let id: Id = match source_id { Some(id) if ids.contains(&id) => { - let element_id = ids[ids.iter().position(|x| *x == id).unwrap()].clone(); - if ids.len() > 2 && ids[ids.clone().len() - 1] == element_id { + let element_id = + ids[ids.iter().position(|x| *x == id).unwrap()].clone(); + if ids.len() > 2 && ids[ids.clone().len() - 1] == element_id + { return Self::Stop; } element_id @@ -394,7 +413,8 @@ impl Action { // Element IS a parent but ISN'T a non-empty container match element.is_parent() - && !(element.name == ElementName::Container && !element.is_empty()) + && !(element.name == ElementName::Container + && !element.is_empty()) { true => { action = Self::PushFront(id); @@ -425,12 +445,8 @@ impl Action { } pub fn text(text: &str) -> RenderedElement { - RenderedElement::new(ElementName::Text(text.to_owned())).preset_options(vec![ - "size", - "line_height", - "width", - "height", - ]) + RenderedElement::new(ElementName::Text(text.to_owned())) + .preset_options(vec!["size", "line_height", "width", "height"]) } pub fn button(text: &str) -> RenderedElement { @@ -457,5 +473,8 @@ pub fn row(child_elements: Option>) -> RenderedElement { } pub fn column(child_elements: Option>) -> RenderedElement { - RenderedElement::with(ElementName::Column, child_elements.unwrap_or_default()) + RenderedElement::with( + ElementName::Column, + child_elements.unwrap_or_default(), + ) } diff --git a/iced_builder/src/views/code_view.rs b/iced_builder/src/views/code_view.rs index 5b5fd37..1be75d9 100644 --- a/iced_builder/src/views/code_view.rs +++ b/iced_builder/src/views/code_view.rs @@ -1,11 +1,10 @@ +use iced::widget::{ + button, container, pane_grid, row, text, text_editor, tooltip, Space, +}; +use iced::{Alignment, Length, Theme}; use super::style; use crate::icon::copy; use crate::types::{DesignerPage, Message}; -use iced::{ - highlighter, - widget::{button, container, pane_grid, row, text, text_editor, tooltip, Space}, - Alignment, Length, -}; pub fn view<'a>( editor_content: &'a text_editor::Content, @@ -21,7 +20,8 @@ pub fn view<'a>( tooltip::Position::FollowCursor ), Space::with_width(20), - button("Switch to Designer view").on_press(Message::SwitchPage(DesignerPage::DesignerView)) + button("Switch to Designer view") + .on_press(Message::SwitchPage(DesignerPage::DesignerView)) ] .align_y(Alignment::Center); let title_bar = pane_grid::TitleBar::new(title) diff --git a/iced_builder/src/views/designer_view.rs b/iced_builder/src/views/designer_view.rs index 1f7de88..76456db 100644 --- a/iced_builder/src/views/designer_view.rs +++ b/iced_builder/src/views/designer_view.rs @@ -1,9 +1,8 @@ +use iced::widget::{button, container, pane_grid, row, text, themer, Space}; +use iced::{Alignment, Element, Length}; + use super::style; use crate::types::{DesignerPage, Message, RenderedElement}; -use iced::{ - widget::{button, container, pane_grid, row, text, themer, Space}, - Alignment, Element, Length, -}; pub fn view<'a>( element_tree: &Option, @@ -21,7 +20,8 @@ pub fn view<'a>( let title = row![ text("Designer"), Space::with_width(Length::Fill), - button("Switch to Code view").on_press(Message::SwitchPage(DesignerPage::CodeView)), + button("Switch to Code view") + .on_press(Message::SwitchPage(DesignerPage::CodeView)), ] .align_y(Alignment::Center); let title_bar = pane_grid::TitleBar::new(title) diff --git a/iced_builder/src/views/element_list.rs b/iced_builder/src/views/element_list.rs index 6e78ae0..0a75a93 100644 --- a/iced_builder/src/views/element_list.rs +++ b/iced_builder/src/views/element_list.rs @@ -1,10 +1,9 @@ +use iced::widget::{column, container, pane_grid, text, Column}; +use iced::{Alignment, Element, Length}; +use iced_drop::droppable; + use super::style; use crate::types::{ElementName, Message}; -use iced::{ - widget::{column, container, pane_grid, text, Column}, - Alignment, Element, Length, -}; -use iced_drop::droppable; fn items_list_view<'a>(items: &'a Vec) -> Element<'a, Message> { let mut column = Column::new() @@ -13,10 +12,12 @@ fn items_list_view<'a>(items: &'a Vec) -> Element<'a, Message> { .width(Length::Fill); for item in items { - column = column.push( - droppable(text(item.clone().to_string())) - .on_drop(move |point, rect| Message::DropNewElement(item.clone(), point, rect)), - ); + column = + column.push(droppable(text(item.clone().to_string())).on_drop( + move |point, rect| { + Message::DropNewElement(item.clone(), point, rect) + }, + )); } container(column) diff --git a/rustfmt.toml b/rustfmt.toml index 334de43..197262a 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -1,3 +1,4 @@ edition = "2021" imports_granularity = "Module" group_imports = "StdExternalCrate" +max_width = 80 -- cgit v1.2.3 From 87086cde68a5b573abcdf0884a2b48d0fbeafa97 Mon Sep 17 00:00:00 2001 From: pml68 Date: Wed, 25 Dec 2024 20:02:40 +0100 Subject: refactor: remove uses find_parent internally, change element_list to &[] --- iced_builder/src/main.rs | 6 +++--- iced_builder/src/types/element_name.rs | 2 +- iced_builder/src/types/rendered_element.rs | 24 +++++++++++++----------- iced_builder/src/views/element_list.rs | 4 ++-- 4 files changed, 19 insertions(+), 17 deletions(-) (limited to 'iced_builder/src/views/element_list.rs') diff --git a/iced_builder/src/main.rs b/iced_builder/src/main.rs index ab708df..d428a8f 100644 --- a/iced_builder/src/main.rs +++ b/iced_builder/src/main.rs @@ -32,7 +32,7 @@ struct App { pane_state: pane_grid::State, focus: Option, designer_page: DesignerPage, - element_list: Vec, + element_list: &'static [ElementName], editor_content: text_editor::Content, } @@ -62,7 +62,7 @@ impl App { pane_state: state, focus: None, designer_page: DesignerPage::DesignerView, - element_list: ElementName::ALL.to_vec(), + element_list: ElementName::ALL, editor_content: text_editor::Content::new(), }, Task::none(), @@ -321,7 +321,7 @@ impl App { ), }, Panes::ElementList => { - element_list::view(&self.element_list, is_focused) + element_list::view(self.element_list, is_focused) } } }) diff --git a/iced_builder/src/types/element_name.rs b/iced_builder/src/types/element_name.rs index 5567cff..e172227 100644 --- a/iced_builder/src/types/element_name.rs +++ b/iced_builder/src/types/element_name.rs @@ -17,7 +17,7 @@ pub enum ElementName { } impl ElementName { - pub const ALL: [Self; 7] = [ + pub const ALL: &'static [Self; 7] = &[ Self::Text(String::new()), Self::Button(String::new()), Self::SVG(String::new()), diff --git a/iced_builder/src/types/rendered_element.rs b/iced_builder/src/types/rendered_element.rs index 35198a1..d4d1a6c 100755 --- a/iced_builder/src/types/rendered_element.rs +++ b/iced_builder/src/types/rendered_element.rs @@ -95,7 +95,8 @@ impl RenderedElement { } pub fn remove(&mut self, element: &RenderedElement) { - if let Some(child_elements) = self.child_elements.as_mut() { + let parent = self.find_parent(element).unwrap(); + if let Some(child_elements) = parent.child_elements.as_mut() { if let Some(index) = child_elements.iter().position(|x| x == element) { @@ -132,8 +133,7 @@ impl RenderedElement { match action { Action::Stop => Ok(()), Action::Drop => { - let parent = element_tree.find_parent(self).unwrap(); - parent.remove(self); + element_tree.remove(self); Ok(()) } @@ -141,8 +141,7 @@ impl RenderedElement { "the action was of kind `AddNew`, but invoking it on an existing element tree is not possible".into(), ), Action::PushFront(id) => { - let old_parent = element_tree.find_parent(self).unwrap(); - old_parent.remove(self); + element_tree.remove(self); let new_parent = element_tree.find_by_id(id).unwrap(); new_parent.push_front(self); @@ -150,8 +149,7 @@ impl RenderedElement { Ok(()) } Action::InsertAfter(parent_id, target_id) => { - let old_parent = element_tree.find_parent(self).unwrap(); - old_parent.remove(self); + element_tree.remove(self); let new_parent = element_tree.find_by_id(parent_id).unwrap(); new_parent.insert_after(target_id, self); @@ -161,9 +159,9 @@ impl RenderedElement { } } - fn preset_options(mut self, options: Vec<&str>) -> Self { + fn preset_options<'a>(mut self, options: &[&'a str]) -> Self { for opt in options { - let _ = self.options.insert(opt.to_owned(), None); + let _ = self.options.insert(opt.to_string(), None); } self } @@ -445,8 +443,12 @@ impl Action { } pub fn text(text: &str) -> RenderedElement { - RenderedElement::new(ElementName::Text(text.to_owned())) - .preset_options(vec!["size", "line_height", "width", "height"]) + RenderedElement::new(ElementName::Text(text.to_owned())).preset_options(&[ + "size", + "line_height", + "width", + "height", + ]) } pub fn button(text: &str) -> RenderedElement { diff --git a/iced_builder/src/views/element_list.rs b/iced_builder/src/views/element_list.rs index 0a75a93..74188af 100644 --- a/iced_builder/src/views/element_list.rs +++ b/iced_builder/src/views/element_list.rs @@ -5,7 +5,7 @@ use iced_drop::droppable; use super::style; use crate::types::{ElementName, Message}; -fn items_list_view<'a>(items: &'a Vec) -> Element<'a, Message> { +fn items_list_view<'a>(items: &'a [ElementName]) -> Element<'a, Message> { let mut column = Column::new() .spacing(20) .align_x(Alignment::Center) @@ -27,7 +27,7 @@ fn items_list_view<'a>(items: &'a Vec) -> Element<'a, Message> { } pub fn view<'a>( - element_list: &'a Vec, + element_list: &'a [ElementName], is_focused: bool, ) -> pane_grid::Content<'a, Message> { let items_list = items_list_view(element_list); -- cgit v1.2.3 From 72e527f51acc44195df5cafda7d8f3d6dc12695c Mon Sep 17 00:00:00 2001 From: pml68 Date: Thu, 26 Dec 2024 00:04:43 +0100 Subject: refactor: `views` -> `panes`, `mod.rs` -> `{panes,types}.rs` --- Cargo.lock | 195 ++++++++++++++------------------ iced_builder/Cargo.toml | 2 +- iced_builder/fonts/icons.ttf | Bin 6348 -> 6348 bytes iced_builder/src/lib.rs | 2 +- iced_builder/src/main.rs | 2 +- iced_builder/src/panes.rs | 4 + iced_builder/src/panes/code_view.rs | 50 ++++++++ iced_builder/src/panes/designer_view.rs | 37 ++++++ iced_builder/src/panes/element_list.rs | 49 ++++++++ iced_builder/src/panes/style.rs | 40 +++++++ iced_builder/src/types.rs | 48 ++++++++ iced_builder/src/types/mod.rs | 48 -------- iced_builder/src/views/code_view.rs | 50 -------- iced_builder/src/views/designer_view.rs | 37 ------ iced_builder/src/views/element_list.rs | 49 -------- iced_builder/src/views/mod.rs | 4 - iced_builder/src/views/style.rs | 40 ------- 17 files changed, 318 insertions(+), 339 deletions(-) create mode 100644 iced_builder/src/panes.rs create mode 100644 iced_builder/src/panes/code_view.rs create mode 100644 iced_builder/src/panes/designer_view.rs create mode 100644 iced_builder/src/panes/element_list.rs create mode 100644 iced_builder/src/panes/style.rs create mode 100644 iced_builder/src/types.rs delete mode 100644 iced_builder/src/types/mod.rs delete mode 100644 iced_builder/src/views/code_view.rs delete mode 100644 iced_builder/src/views/designer_view.rs delete mode 100644 iced_builder/src/views/element_list.rs delete mode 100644 iced_builder/src/views/mod.rs delete mode 100644 iced_builder/src/views/style.rs (limited to 'iced_builder/src/views/element_list.rs') diff --git a/Cargo.lock b/Cargo.lock index 8caff6b..4d0f16d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -174,14 +174,14 @@ dependencies = [ "wayland-backend", "wayland-client", "wayland-protocols", - "zbus 5.1.1", + "zbus 5.2.0", ] [[package]] name = "async-broadcast" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cd0e2e25ea8e5f7e9df04578dc6cf5c83577fd09b1a46aaf5c85e1c33f2a7e" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" dependencies = [ "event-listener", "event-listener-strategy", @@ -293,7 +293,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -328,7 +328,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -485,22 +485,22 @@ checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" [[package]] name = "bytemuck" -version = "1.20.0" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a" +checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" +checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -574,9 +574,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.4" +version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9157bbaa6b165880c27a4293a474c91cdcf265cc68cc829bf10be0964a391caf" +checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e" dependencies = [ "jobserver", "libc", @@ -870,9 +870,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -889,9 +889,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" @@ -983,7 +983,7 @@ checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -1037,7 +1037,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -1173,7 +1173,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -1375,7 +1375,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -1469,7 +1469,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -1881,9 +1881,9 @@ checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "hyper" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" +checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" dependencies = [ "bytes", "futures-channel", @@ -1901,9 +1901,9 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.3" +version = "0.27.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", "http", @@ -1985,18 +1985,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5b89898a5300d2800451406a3d6cfaed89ef08797dc392143f7c16c5c747e95" dependencies = [ "quote", - "syn 2.0.90", -] - -[[package]] -name = "iced_aw" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42e05df3019f20c6decea93d035b32a2afc7b329d89cc5a68cca097d0e0a1889" -dependencies = [ - "cfg-if", - "iced", - "iced_fonts", + "syn 2.0.91", ] [[package]] @@ -2007,14 +1996,13 @@ dependencies = [ "embed-resource 3.0.1", "iced", "iced_anim", - "iced_aw", "iced_drop", "iced_fontello", "rfd", "rust-format", "serde", "serde_json", - "thiserror 2.0.7", + "thiserror 2.0.9", "tokio", "windows_exe_info", ] @@ -2060,15 +2048,6 @@ dependencies = [ "zip", ] -[[package]] -name = "iced_fonts" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df7deb0800a850ee25c8a42559f72c0f249e577feb3aad37b9b65dc1e517e52a" -dependencies = [ - "iced_core", -] - [[package]] name = "iced_futures" version = "0.13.2" @@ -2348,7 +2327,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -2540,9 +2519,9 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.168" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libloading" @@ -2761,9 +2740,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" dependencies = [ "adler2", "simd-adler32", @@ -2919,7 +2898,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -3146,9 +3125,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.5" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] @@ -3204,7 +3183,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -3284,7 +3263,7 @@ dependencies = [ "by_address", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -3405,7 +3384,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -3440,7 +3419,7 @@ checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -3487,9 +3466,9 @@ dependencies = [ [[package]] name = "png" -version = "0.17.15" +version = "0.17.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67582bd5b65bdff614270e2ea89a1cf15bef71245cc1e5f7ea126977144211d" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -4018,9 +3997,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.1" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" +checksum = "1863fd3768cd83c56a7f60faa4dc0d403f1b6df0a38c3c25f44b7894e45370d5" dependencies = [ "core-foundation-sys", "libc", @@ -4055,14 +4034,14 @@ checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "serde_json" -version = "1.0.133" +version = "1.0.134" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" dependencies = [ "itoa", "memchr", @@ -4078,7 +4057,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -4369,9 +4348,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.90" +version = "2.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035" dependencies = [ "proc-macro2", "quote", @@ -4395,7 +4374,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -4502,11 +4481,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.7" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93605438cbd668185516ab499d589afb7ee1859ea3d5fc8f6b0755e1c7443767" +checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" dependencies = [ - "thiserror-impl 2.0.7", + "thiserror-impl 2.0.9", ] [[package]] @@ -4517,18 +4496,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "thiserror-impl" -version = "2.0.7" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d8749b4531af2117677a5fcd12b1348a3fe2b81e36e61ffeac5c4aa3273e36" +checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -4624,9 +4603,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" dependencies = [ "tinyvec_macros", ] @@ -4744,7 +4723,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -4799,15 +4778,15 @@ dependencies = [ [[package]] name = "unicase" -version = "2.8.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-bidi" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-bidi-mirroring" @@ -5019,7 +4998,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", "wasm-bindgen-shared", ] @@ -5054,7 +5033,7 @@ checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5647,9 +5626,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winit" -version = "0.30.5" +version = "0.30.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0be9e76a1f1077e04a411f0b989cbd3c93339e1771cb41e71ac4aee95bfd2c67" +checksum = "dba50bc8ef4b6f1a75c9274fb95aa9a8f63fbc66c56f391bd85cf68d51e7b1a3" dependencies = [ "ahash 0.8.11", "android-activity", @@ -5851,7 +5830,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", "synstructure", ] @@ -5895,9 +5874,9 @@ dependencies = [ [[package]] name = "zbus" -version = "5.1.1" +version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1162094dc63b1629fcc44150bcceeaa80798cd28bcbe7fa987b65a034c258608" +checksum = "fb67eadba43784b6fb14857eba0d8fc518686d3ee537066eb6086dc318e2c8a1" dependencies = [ "async-broadcast", "async-executor", @@ -5924,7 +5903,7 @@ dependencies = [ "windows-sys 0.59.0", "winnow", "xdg-home", - "zbus_macros 5.1.1", + "zbus_macros 5.2.0", "zbus_names 4.1.0", "zvariant 5.1.0", ] @@ -5938,20 +5917,20 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", "zvariant_utils 2.1.0", ] [[package]] name = "zbus_macros" -version = "5.1.1" +version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cd2dcdce3e2727f7d74b7e33b5a89539b3cc31049562137faf7ae4eb86cd16d" +checksum = "2c9d49ebc960ceb660f2abe40a5904da975de6986f2af0d7884b39eec6528c57" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", "zbus_names 4.1.0", "zvariant 5.1.0", "zvariant_utils 3.0.2", @@ -6004,7 +5983,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -6024,7 +6003,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", "synstructure", ] @@ -6045,7 +6024,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -6067,14 +6046,14 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "zip" -version = "2.2.1" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d52293fc86ea7cf13971b3bb81eb21683636e7ae24c729cdaf1b7c4157a352" +checksum = "ae9c1ea7b3a5e1f4b922ff856a129881167511563dc219869afe3787fc0c1a45" dependencies = [ "aes", "arbitrary", @@ -6092,7 +6071,7 @@ dependencies = [ "pbkdf2", "rand", "sha1", - "thiserror 2.0.7", + "thiserror 2.0.9", "time", "zeroize", "zopfli", @@ -6188,7 +6167,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", "zvariant_utils 2.1.0", ] @@ -6201,7 +6180,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", "zvariant_utils 3.0.2", ] @@ -6213,7 +6192,7 @@ checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -6226,6 +6205,6 @@ dependencies = [ "quote", "serde", "static_assertions", - "syn 2.0.90", + "syn 2.0.91", "winnow", ] diff --git a/iced_builder/Cargo.toml b/iced_builder/Cargo.toml index 41a8b51..a1b41cc 100644 --- a/iced_builder/Cargo.toml +++ b/iced_builder/Cargo.toml @@ -10,7 +10,7 @@ keywords = ["gui", "iced"] [dependencies] iced = { version = "0.13.1", features = [ "image","svg","canvas","qr_code","advanced","tokio","highlighter"] } -iced_aw = { version = "0.11.0", default-features = false, features = ["menu","color_picker"] } +# iced_aw = { version = "0.11.0", default-features = false, features = ["menu","color_picker"] } iced_anim = { version = "0.1.4", features = ["derive", "serde"] } iced_drop = { path = "../iced_drop" } serde = { version = "1.0.216", features = ["derive"] } diff --git a/iced_builder/fonts/icons.ttf b/iced_builder/fonts/icons.ttf index dba1266..7af6b0e 100644 Binary files a/iced_builder/fonts/icons.ttf and b/iced_builder/fonts/icons.ttf differ diff --git a/iced_builder/src/lib.rs b/iced_builder/src/lib.rs index 48a2728..d04c594 100644 --- a/iced_builder/src/lib.rs +++ b/iced_builder/src/lib.rs @@ -1,8 +1,8 @@ pub mod dialogs; pub mod error; pub mod icon; +pub mod panes; pub mod types; -pub mod views; pub use error::Error; pub type Result = core::result::Result; diff --git a/iced_builder/src/main.rs b/iced_builder/src/main.rs index d428a8f..a041c6f 100644 --- a/iced_builder/src/main.rs +++ b/iced_builder/src/main.rs @@ -7,10 +7,10 @@ use iced::{clipboard, keyboard, Alignment, Element, Length, Task, Theme}; use iced_anim::{Animation, Spring}; use iced_builder::dialogs::{error_dialog, unsaved_changes_dialog}; use iced_builder::icon; +use iced_builder::panes::{code_view, designer_view, element_list}; use iced_builder::types::{ Action, DesignerPage, ElementName, Message, Project, }; -use iced_builder::views::{code_view, designer_view, element_list}; use rfd::MessageDialogResult; const THEMES: &'static [Theme] = &[Theme::SolarizedDark, Theme::SolarizedLight]; diff --git a/iced_builder/src/panes.rs b/iced_builder/src/panes.rs new file mode 100644 index 0000000..387662a --- /dev/null +++ b/iced_builder/src/panes.rs @@ -0,0 +1,4 @@ +pub mod code_view; +pub mod designer_view; +pub mod element_list; +mod style; diff --git a/iced_builder/src/panes/code_view.rs b/iced_builder/src/panes/code_view.rs new file mode 100644 index 0000000..1be75d9 --- /dev/null +++ b/iced_builder/src/panes/code_view.rs @@ -0,0 +1,50 @@ +use iced::widget::{ + button, container, pane_grid, row, text, text_editor, tooltip, Space, +}; +use iced::{Alignment, Length, Theme}; +use super::style; +use crate::icon::copy; +use crate::types::{DesignerPage, Message}; + +pub fn view<'a>( + editor_content: &'a text_editor::Content, + theme: Theme, + is_focused: bool, +) -> pane_grid::Content<'a, Message> { + let title = row![ + text("Generated Code"), + Space::with_width(Length::Fill), + tooltip( + button(container(copy()).center_x(30)).on_press(Message::CopyCode), + "Copy code to clipboard", + tooltip::Position::FollowCursor + ), + Space::with_width(20), + button("Switch to Designer view") + .on_press(Message::SwitchPage(DesignerPage::DesignerView)) + ] + .align_y(Alignment::Center); + let title_bar = pane_grid::TitleBar::new(title) + .padding(10) + .style(style::title_bar); + pane_grid::Content::new( + text_editor(editor_content) + .on_action(Message::EditorAction) + .highlight( + "rs", + if theme.to_string().contains("Dark") { + highlighter::Theme::SolarizedDark + } else { + highlighter::Theme::InspiredGitHub + }, + ) + .height(Length::Fill) + .padding(20), + ) + .title_bar(title_bar) + .style(if is_focused { + style::pane_focused + } else { + style::pane_active + }) +} diff --git a/iced_builder/src/panes/designer_view.rs b/iced_builder/src/panes/designer_view.rs new file mode 100644 index 0000000..76456db --- /dev/null +++ b/iced_builder/src/panes/designer_view.rs @@ -0,0 +1,37 @@ +use iced::widget::{button, container, pane_grid, row, text, themer, Space}; +use iced::{Alignment, Element, Length}; + +use super::style; +use crate::types::{DesignerPage, Message, RenderedElement}; + +pub fn view<'a>( + element_tree: &Option, + designer_theme: iced::Theme, + is_focused: bool, +) -> pane_grid::Content<'a, Message> { + let el_tree: Element<'a, Message> = match element_tree { + Some(tree) => tree.clone().into(), + None => text("Open a project or begin creating one").into(), + }; + let content = container(themer(designer_theme, el_tree)) + .id(iced::widget::container::Id::new("drop_zone")) + .height(Length::Fill) + .width(Length::Fill); + let title = row![ + text("Designer"), + Space::with_width(Length::Fill), + button("Switch to Code view") + .on_press(Message::SwitchPage(DesignerPage::CodeView)), + ] + .align_y(Alignment::Center); + let title_bar = pane_grid::TitleBar::new(title) + .padding(10) + .style(style::title_bar); + pane_grid::Content::new(content) + .title_bar(title_bar) + .style(if is_focused { + style::pane_focused + } else { + style::pane_active + }) +} diff --git a/iced_builder/src/panes/element_list.rs b/iced_builder/src/panes/element_list.rs new file mode 100644 index 0000000..74188af --- /dev/null +++ b/iced_builder/src/panes/element_list.rs @@ -0,0 +1,49 @@ +use iced::widget::{column, container, pane_grid, text, Column}; +use iced::{Alignment, Element, Length}; +use iced_drop::droppable; + +use super::style; +use crate::types::{ElementName, Message}; + +fn items_list_view<'a>(items: &'a [ElementName]) -> Element<'a, Message> { + let mut column = Column::new() + .spacing(20) + .align_x(Alignment::Center) + .width(Length::Fill); + + for item in items { + column = + column.push(droppable(text(item.clone().to_string())).on_drop( + move |point, rect| { + Message::DropNewElement(item.clone(), point, rect) + }, + )); + } + + container(column) + .width(Length::Fill) + .height(Length::Fill) + .into() +} + +pub fn view<'a>( + element_list: &'a [ElementName], + is_focused: bool, +) -> pane_grid::Content<'a, Message> { + let items_list = items_list_view(element_list); + let content = column![items_list] + .align_x(Alignment::Center) + .height(Length::Fill) + .width(Length::Fill); + let title = text("Element List"); + let title_bar = pane_grid::TitleBar::new(title) + .padding(10) + .style(style::title_bar); + pane_grid::Content::new(content) + .title_bar(title_bar) + .style(if is_focused { + style::pane_focused + } else { + style::pane_active + }) +} diff --git a/iced_builder/src/panes/style.rs b/iced_builder/src/panes/style.rs new file mode 100644 index 0000000..1eefb2d --- /dev/null +++ b/iced_builder/src/panes/style.rs @@ -0,0 +1,40 @@ +use iced::widget::container::Style; +use iced::{Border, Theme}; + +pub fn title_bar(theme: &Theme) -> Style { + let palette = theme.extended_palette(); + + Style { + text_color: Some(palette.background.strong.text), + background: Some(palette.background.strong.color.into()), + ..Default::default() + } +} + +pub fn pane_active(theme: &Theme) -> Style { + let palette = theme.extended_palette(); + + Style { + background: Some(palette.background.weak.color.into()), + border: Border { + width: 1.0, + color: palette.background.strong.color, + ..Border::default() + }, + ..Default::default() + } +} + +pub fn pane_focused(theme: &Theme) -> Style { + let palette = theme.extended_palette(); + + Style { + background: Some(palette.background.weak.color.into()), + border: Border { + width: 4.0, + color: palette.background.strong.color, + ..Border::default() + }, + ..Default::default() + } +} diff --git a/iced_builder/src/types.rs b/iced_builder/src/types.rs new file mode 100644 index 0000000..161b5e1 --- /dev/null +++ b/iced_builder/src/types.rs @@ -0,0 +1,48 @@ +pub mod element_name; +pub mod project; +pub mod rendered_element; + +use std::path::PathBuf; + +pub use element_name::ElementName; +use iced::widget::{pane_grid, text_editor}; +use iced::Theme; +use iced_anim::SpringEvent; +pub use project::Project; +pub use rendered_element::*; + +use crate::Result; + +#[derive(Debug, Clone)] +pub enum Message { + ToggleTheme(SpringEvent), + CopyCode, + SwitchPage(DesignerPage), + EditorAction(text_editor::Action), + RefreshEditorContent, + DropNewElement(ElementName, iced::Point, iced::Rectangle), + HandleNew( + ElementName, + Vec<(iced::advanced::widget::Id, iced::Rectangle)>, + ), + MoveElement(RenderedElement, iced::Point, iced::Rectangle), + HandleMove( + RenderedElement, + Vec<(iced::advanced::widget::Id, iced::Rectangle)>, + ), + PaneResized(pane_grid::ResizeEvent), + PaneClicked(pane_grid::Pane), + PaneDragged(pane_grid::DragEvent), + NewFile, + OpenFile, + FileOpened(Result<(PathBuf, Project)>), + SaveFile, + SaveFileAs, + FileSaved(Result), +} + +#[derive(Debug, Clone)] +pub enum DesignerPage { + DesignerView, + CodeView, +} diff --git a/iced_builder/src/types/mod.rs b/iced_builder/src/types/mod.rs deleted file mode 100644 index 161b5e1..0000000 --- a/iced_builder/src/types/mod.rs +++ /dev/null @@ -1,48 +0,0 @@ -pub mod element_name; -pub mod project; -pub mod rendered_element; - -use std::path::PathBuf; - -pub use element_name::ElementName; -use iced::widget::{pane_grid, text_editor}; -use iced::Theme; -use iced_anim::SpringEvent; -pub use project::Project; -pub use rendered_element::*; - -use crate::Result; - -#[derive(Debug, Clone)] -pub enum Message { - ToggleTheme(SpringEvent), - CopyCode, - SwitchPage(DesignerPage), - EditorAction(text_editor::Action), - RefreshEditorContent, - DropNewElement(ElementName, iced::Point, iced::Rectangle), - HandleNew( - ElementName, - Vec<(iced::advanced::widget::Id, iced::Rectangle)>, - ), - MoveElement(RenderedElement, iced::Point, iced::Rectangle), - HandleMove( - RenderedElement, - Vec<(iced::advanced::widget::Id, iced::Rectangle)>, - ), - PaneResized(pane_grid::ResizeEvent), - PaneClicked(pane_grid::Pane), - PaneDragged(pane_grid::DragEvent), - NewFile, - OpenFile, - FileOpened(Result<(PathBuf, Project)>), - SaveFile, - SaveFileAs, - FileSaved(Result), -} - -#[derive(Debug, Clone)] -pub enum DesignerPage { - DesignerView, - CodeView, -} diff --git a/iced_builder/src/views/code_view.rs b/iced_builder/src/views/code_view.rs deleted file mode 100644 index 1be75d9..0000000 --- a/iced_builder/src/views/code_view.rs +++ /dev/null @@ -1,50 +0,0 @@ -use iced::widget::{ - button, container, pane_grid, row, text, text_editor, tooltip, Space, -}; -use iced::{Alignment, Length, Theme}; -use super::style; -use crate::icon::copy; -use crate::types::{DesignerPage, Message}; - -pub fn view<'a>( - editor_content: &'a text_editor::Content, - theme: Theme, - is_focused: bool, -) -> pane_grid::Content<'a, Message> { - let title = row![ - text("Generated Code"), - Space::with_width(Length::Fill), - tooltip( - button(container(copy()).center_x(30)).on_press(Message::CopyCode), - "Copy code to clipboard", - tooltip::Position::FollowCursor - ), - Space::with_width(20), - button("Switch to Designer view") - .on_press(Message::SwitchPage(DesignerPage::DesignerView)) - ] - .align_y(Alignment::Center); - let title_bar = pane_grid::TitleBar::new(title) - .padding(10) - .style(style::title_bar); - pane_grid::Content::new( - text_editor(editor_content) - .on_action(Message::EditorAction) - .highlight( - "rs", - if theme.to_string().contains("Dark") { - highlighter::Theme::SolarizedDark - } else { - highlighter::Theme::InspiredGitHub - }, - ) - .height(Length::Fill) - .padding(20), - ) - .title_bar(title_bar) - .style(if is_focused { - style::pane_focused - } else { - style::pane_active - }) -} diff --git a/iced_builder/src/views/designer_view.rs b/iced_builder/src/views/designer_view.rs deleted file mode 100644 index 76456db..0000000 --- a/iced_builder/src/views/designer_view.rs +++ /dev/null @@ -1,37 +0,0 @@ -use iced::widget::{button, container, pane_grid, row, text, themer, Space}; -use iced::{Alignment, Element, Length}; - -use super::style; -use crate::types::{DesignerPage, Message, RenderedElement}; - -pub fn view<'a>( - element_tree: &Option, - designer_theme: iced::Theme, - is_focused: bool, -) -> pane_grid::Content<'a, Message> { - let el_tree: Element<'a, Message> = match element_tree { - Some(tree) => tree.clone().into(), - None => text("Open a project or begin creating one").into(), - }; - let content = container(themer(designer_theme, el_tree)) - .id(iced::widget::container::Id::new("drop_zone")) - .height(Length::Fill) - .width(Length::Fill); - let title = row![ - text("Designer"), - Space::with_width(Length::Fill), - button("Switch to Code view") - .on_press(Message::SwitchPage(DesignerPage::CodeView)), - ] - .align_y(Alignment::Center); - let title_bar = pane_grid::TitleBar::new(title) - .padding(10) - .style(style::title_bar); - pane_grid::Content::new(content) - .title_bar(title_bar) - .style(if is_focused { - style::pane_focused - } else { - style::pane_active - }) -} diff --git a/iced_builder/src/views/element_list.rs b/iced_builder/src/views/element_list.rs deleted file mode 100644 index 74188af..0000000 --- a/iced_builder/src/views/element_list.rs +++ /dev/null @@ -1,49 +0,0 @@ -use iced::widget::{column, container, pane_grid, text, Column}; -use iced::{Alignment, Element, Length}; -use iced_drop::droppable; - -use super::style; -use crate::types::{ElementName, Message}; - -fn items_list_view<'a>(items: &'a [ElementName]) -> Element<'a, Message> { - let mut column = Column::new() - .spacing(20) - .align_x(Alignment::Center) - .width(Length::Fill); - - for item in items { - column = - column.push(droppable(text(item.clone().to_string())).on_drop( - move |point, rect| { - Message::DropNewElement(item.clone(), point, rect) - }, - )); - } - - container(column) - .width(Length::Fill) - .height(Length::Fill) - .into() -} - -pub fn view<'a>( - element_list: &'a [ElementName], - is_focused: bool, -) -> pane_grid::Content<'a, Message> { - let items_list = items_list_view(element_list); - let content = column![items_list] - .align_x(Alignment::Center) - .height(Length::Fill) - .width(Length::Fill); - let title = text("Element List"); - let title_bar = pane_grid::TitleBar::new(title) - .padding(10) - .style(style::title_bar); - pane_grid::Content::new(content) - .title_bar(title_bar) - .style(if is_focused { - style::pane_focused - } else { - style::pane_active - }) -} diff --git a/iced_builder/src/views/mod.rs b/iced_builder/src/views/mod.rs deleted file mode 100644 index 387662a..0000000 --- a/iced_builder/src/views/mod.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub mod code_view; -pub mod designer_view; -pub mod element_list; -mod style; diff --git a/iced_builder/src/views/style.rs b/iced_builder/src/views/style.rs deleted file mode 100644 index 1eefb2d..0000000 --- a/iced_builder/src/views/style.rs +++ /dev/null @@ -1,40 +0,0 @@ -use iced::widget::container::Style; -use iced::{Border, Theme}; - -pub fn title_bar(theme: &Theme) -> Style { - let palette = theme.extended_palette(); - - Style { - text_color: Some(palette.background.strong.text), - background: Some(palette.background.strong.color.into()), - ..Default::default() - } -} - -pub fn pane_active(theme: &Theme) -> Style { - let palette = theme.extended_palette(); - - Style { - background: Some(palette.background.weak.color.into()), - border: Border { - width: 1.0, - color: palette.background.strong.color, - ..Border::default() - }, - ..Default::default() - } -} - -pub fn pane_focused(theme: &Theme) -> Style { - let palette = theme.extended_palette(); - - Style { - background: Some(palette.background.weak.color.into()), - border: Border { - width: 4.0, - color: palette.background.strong.color, - ..Border::default() - }, - ..Default::default() - } -} -- cgit v1.2.3