From bf494c7d17d85c700c79ec25fe25a80a63a17ad5 Mon Sep 17 00:00:00 2001 From: Dmitry Stepanov Date: Wed, 29 May 2024 11:40:45 +0300 Subject: [PATCH] project manager: item mockup --- project-manager/resources/icon.png | Bin 0 -> 5196 bytes project-manager/src/main.rs | 108 +++++++++++++++++++++++++++-- 2 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 project-manager/resources/icon.png diff --git a/project-manager/resources/icon.png b/project-manager/resources/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7c95f21dc25e4bde7fbb490dab0826fed3c41010 GIT binary patch literal 5196 zcmV-S6tnAzP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vH6WdHy@WdTporTzc_6X8ijK~#8N?VSsp zT}6GzXU^WuCXs{yDwKyWtb$lu9@SQhFNjLAuLMG=s~C3gF3<325pA_?fNHgfJVeCZ zyGbxAm1rKjARnwB#78Za3ZFvTPwR(j3#e4IG(iZP>^=Yfe&?J`ZtmWD&YW}R-1nEy z%$d35-aY5cfBy5Ing7gaWf>XiU#7JBL#1V0PfSbjafg&hzW)$h&Q_u(^yHN5f0`aA zxLQH-D;J{hKaJ#SCEB`hwK)qBK92W$maJW2?cG`v0MvX(>8?>EhY*fL=m>yS^otQ4 zits6w>pH>v$O85>fL6Z;_4F4=EkJm=a&?#Yc?V0#D}%%_c-c3|=)jU7p9(7ifc9xA zF4rSaO34!C$Pq!hgB^|yuH-Z&auMEpYAu^u03^SPH}OG)H+diI$C{dIcO*Z+cU<~D znTNL3so!yW4IsteLVP7cxir2ZxOPa32+Qg9er6ww@jq^su`|1ad?Hc_fDHF{quBoj zNm{7ooDy6+q(*uWl?wnlRk?fL8>ADFP6KE)i1;)=Gmn!YARR-{23o%k@r(S-0pt)q z1cPwS_KHnn0YJBJDFoodNb)8saX5bc)j_&LI^GgoEAd)15yL?`Hfc1#IS9Y)Co95c z;f;Q>LrP8!u9aXJo-g^nqx@_<5(xmT(nC=DFGey<#q+mM?~DbfL&gRd;SweQ?Ry2ifM+;*2x+uw3$kon{~j+8bmm9RiNxP0$!825BQ=Y5?~zM7@66 znB$aoJHx_>(Cel8Yk zWO#s0uMsgdfc#OAh)X|&fF3O!OwpREJjr~@Vak!^K{^s+0f0oZi}Cw@E;h$OdnEmC z+adYY8Wm;@lGFlmp{6y~95FP2eh(s(?nov0cZOu7w=*|jg3NMkf2E&E#OX5Z4Io7l zrwO0{q-n=jD(!TfM9g>_LLBSAoWo&w8}$Z^1VHku*dGm>kT8K>Ly0FX+65WuUw~?M zK9XrF+ai3s+(D-zh8kd&!@leSrezGxfU$+zmN-JgFWzuoW!`EsDrhJGnzMdM43ct= zLNjn?knT_k(HA1FHpL!?6I5;~wQeY;HUI^{Mn9gvae<8XrE+6xRb*s~-**b6yqXtLd!yw7#I}abIbin+KUtk<4e--t2P2M@q!`ekyi7(` zcC=YBd91SOnW0QLme zthi6Pv$H|Ez0g9z|0h3_2}Q_2XazPAfd37yS@CT>`Sl>#Ug*NqUR?gc&t<~%_$x02 z>57;Lz%vMtq)ga}@b7-IZTSI0R(95N%FU$|0IhZ*-tA|s^CN_3{bXfiv@a)P-VPZ} zhm7<(xc?|Oxc^4@m7lcEuk_^B(B?H-07U%)acCi>;J@(uP*atW^SG!;pQl_|Bg6eB z+NxoY`~bSR&M5lfy%CNXY+|4Clh*mq;93;}4WR!AF`I!bcr0|&Lnp^I1so&)Jnr

^f3zouiKW7<%1_(ntoQCG& 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, run: Handle, delete: Handle, + rename: Handle, search_bar: Handle, } @@ -165,6 +172,89 @@ fn make_button( .build(ctx) } +fn load_image(data: &[u8]) -> Option { + Some( + TextureResource::load_from_memory( + Default::default(), + data, + TextureImportOptions::default() + .with_compression(CompressionOptions::NoCompression) + .with_minification_filter(TextureMinificationFilter::Linear), + ) + .ok()? + .into(), + ) +} + +fn make_project_item(name: &str, path: &str, ctx: &mut BuildContext) -> Handle { + DecoratorBuilder::new( + BorderBuilder::new( + WidgetBuilder::new() + .with_margin(Thickness::uniform(1.0)) + .with_child( + GridBuilder::new( + WidgetBuilder::new() + .with_child( + ImageBuilder::new( + WidgetBuilder::new() + .with_margin(Thickness::uniform(4.0)) + .with_width(40.0) + .with_height(40.0) + .on_column(0), + ) + .with_opt_texture(load_image(include_bytes!( + "../resources/icon.png" + ))) + .build(ctx), + ) + .with_child( + GridBuilder::new( + WidgetBuilder::new() + .on_column(1) + .with_child( + TextBuilder::new( + WidgetBuilder::new() + .on_row(0) + .with_margin(Thickness::uniform(2.0)) + .with_vertical_alignment( + VerticalAlignment::Center, + ), + ) + .with_font_size(18.0) + .with_text(name) + .build(ctx), + ) + .with_child( + TextBuilder::new( + WidgetBuilder::new() + .on_row(1) + .with_margin(Thickness::uniform(2.0)) + .with_vertical_alignment( + VerticalAlignment::Center, + ), + ) + .with_font_size(13.0) + .with_text(path) + .build(ctx), + ), + ) + .add_column(Column::auto()) + .add_row(Row::auto()) + .add_row(Row::auto()) + .build(ctx), + ), + ) + .add_column(Column::auto()) + .add_column(Column::stretch()) + .add_row(Row::auto()) + .build(ctx), + ), + ) + .with_corner_radius(4.0), + ) + .build(ctx) +} + impl ProjectManager { fn new(ctx: &mut BuildContext) -> Self { let create = make_button("+ Create", 100.0, 25.0, 0, ctx); @@ -189,23 +279,30 @@ impl ProjectManager { let edit = make_button("Edit", 100.0, 25.0, 3, ctx); let run = make_button("Run", 100.0, 25.0, 4, ctx); - let delete = make_button("Delete", 100.0, 25.0, 5, ctx); + let rename = make_button("Rename", 100.0, 25.0, 5, ctx); + let delete = make_button("Delete", 100.0, 25.0, 6, ctx); let sidebar = StackPanelBuilder::new( WidgetBuilder::new() .on_column(1) .with_child(edit) .with_child(run) + .with_child(rename) .with_child(delete), ) .build(ctx); let projects = ListViewBuilder::new( WidgetBuilder::new() - .with_tab_index(Some(6)) + .with_tab_index(Some(7)) .with_margin(Thickness::uniform(1.0)) .on_column(0), ) + .with_items(vec![make_project_item( + "Project Name", + "path/to/project", + ctx, + )]) .build(ctx); let inner_content = GridBuilder::new( @@ -244,6 +341,7 @@ impl ProjectManager { edit, run, delete, + rename, search_bar, } } @@ -259,6 +357,8 @@ impl ProjectManager { } else if message.destination() == self.run { // TODO: Delete project. } else if message.destination() == self.delete { + } else if message.destination() == self.rename { + // TODO: Rename project. } } else if let Some(ListViewMessage::SelectionChanged(Some(_index))) = message.data() { if message.destination() == self.projects