diff options
| author | pml68 <contact@pml68.me> | 2024-09-22 23:53:02 +0200 |
|---|---|---|
| committer | pml68 <contact@pml68.me> | 2024-09-23 00:00:45 +0200 |
| commit | f5c35e48c480355036778d26aacde498e5c15e68 (patch) | |
| tree | bf949b406bd8f0719f06095bb14bf9872a7493e5 /iced_builder/src/main.rs | |
| parent | Merge pull request #1 from pml68/feat/codegen (diff) | |
| download | iced-builder-f5c35e48c480355036778d26aacde498e5c15e68.tar.gz | |
feat: restructure project, start drag and drop
Diffstat (limited to '')
| -rw-r--r-- | iced_builder/src/main.rs (renamed from src/main.rs) | 51 |
1 files changed, 38 insertions, 13 deletions
diff --git a/src/main.rs b/iced_builder/src/main.rs index d3fafc6..e966614 100644 --- a/src/main.rs +++ b/iced_builder/src/main.rs @@ -12,6 +12,7 @@ use iced::{ }, Alignment, Application, Color, Command, Element, Font, Length, Settings, }; +use iced_drop::droppable; use types::{rendered_element::RenderedElement, DesignerPage, DesignerState}; fn main() -> iced::Result { @@ -28,7 +29,7 @@ struct App { pane_state: pane_grid::State<Panes>, focus: Option<Pane>, designer_state: DesignerState, - element_list: Vec<String>, + element_list: Vec<types::ElementName>, editor_content: text_editor::Content, } @@ -36,8 +37,14 @@ struct App { enum Message { ToggleTheme, CopyCode, + Drop(types::ElementName, iced::Point, iced::Rectangle), + HandleZones( + types::ElementName, + Vec<(iced::advanced::widget::Id, iced::Rectangle)>, + ), Resized(pane_grid::ResizeEvent), Clicked(pane_grid::Pane), + PaneDragged(pane_grid::DragEvent), } #[derive(Clone, Debug)] @@ -68,12 +75,9 @@ impl Application for App { focus: None, designer_state: DesignerState { designer_content: vec![], - designer_page: DesignerPage::CodeView, + designer_page: DesignerPage::Designer, }, - element_list: vec!["Column", "Row", "PickList", "PaneGrid", "Button", "Text"] - .into_iter() - .map(|c| c.to_owned()) - .collect(), + element_list: types::ElementName::ALL.to_vec(), editor_content: text_editor::Content::with_text(&RenderedElement::test()), }, Command::none(), @@ -109,6 +113,22 @@ impl Application for App { Message::Clicked(pane) => { self.focus = Some(pane); } + Message::Drop(name, point, _) => { + return iced_drop::zones_on_point( + move |zones| Message::HandleZones(name, zones), + point, + None, + None, + ) + .into() + } + Message::HandleZones(name, zones) => { + println!("{:?}\n{name}", zones); + } + Message::PaneDragged(pane_grid::DragEvent::Dropped { pane, target }) => { + self.pane_state.drop(pane, target); + } + Message::PaneDragged(_) => {} } Command::none() @@ -124,8 +144,8 @@ impl Application for App { match pane { Panes::Designer => match self.designer_state.designer_page { DesignerPage::Designer => { - let content = column![text("Designer"),] - .align_items(Alignment::Center) + let content = container("") + .id(iced::widget::container::Id::new("drop_zone")) .height(Length::Fill) .width(Length::Fill); let title = text("Designer").style(if is_focused { @@ -189,7 +209,7 @@ impl Application for App { } }, Panes::ElementList => { - let items_list = items_list_view(&self.element_list); + let items_list = items_list_view(self.element_list.clone()); let content = column![items_list] .align_items(Alignment::Center) .height(Length::Fill) @@ -216,7 +236,8 @@ impl Application for App { .height(Length::Fill) .spacing(10) .on_resize(10, Message::Resized) - .on_click(Message::Clicked); + .on_click(Message::Clicked) + .on_drag(Message::PaneDragged); let content = Column::new() .push(header) @@ -244,14 +265,18 @@ const PANE_ID_COLOR_FOCUSED: Color = from_grayscale(1.0); // #e8e8e8 const PANE_ID_COLOR_UNFOCUSED: Color = from_grayscale(0xE8 as f32 / 255.0); -fn items_list_view(items: &Vec<String>) -> Element<'static, Message> { +fn items_list_view(items: Vec<types::ElementName>) -> Element<'static, Message> { let mut column = Column::new() .spacing(20) .align_items(Alignment::Center) .width(Length::Fill); - for value in items { - column = column.push(text(value)); + for item in items { + let value = item.clone(); + column = column.push( + droppable(text(value.to_string())) + .on_drop(move |point, rect| Message::Drop(value, point, rect)), + ); } container(column).height(250.0).width(300).into() |
