diff options
Diffstat (limited to '')
| -rw-r--r-- | iced_builder/src/codegen/mod.rs (renamed from src/codegen/mod.rs) | 10 | ||||
| -rw-r--r-- | iced_builder/src/lib.rs (renamed from src/lib.rs) | 0 | ||||
| -rw-r--r-- | iced_builder/src/main.rs (renamed from src/main.rs) | 51 | ||||
| -rw-r--r-- | iced_builder/src/types/mod.rs | 54 | ||||
| -rw-r--r-- | iced_builder/src/types/rendered_element.rs (renamed from src/types/rendered_element.rs) | 0 |
5 files changed, 96 insertions, 19 deletions
diff --git a/src/codegen/mod.rs b/iced_builder/src/codegen/mod.rs index 2dd9cff..88c0c61 100644 --- a/src/codegen/mod.rs +++ b/iced_builder/src/codegen/mod.rs @@ -1,5 +1,3 @@ -use std::path::PathBuf; - use rust_format::{Config, Edition, Formatter, RustFmt}; use crate::types::{rendered_element::RenderedElement, ElementName}; @@ -74,11 +72,11 @@ impl RenderedElement { } ElementName::Image(path) => { imports = format!("{imports}image,"); - view = format!("{view}\nimage(\"{}\"){props}", path.display().to_string()); + view = format!("{view}\nimage(\"{path}\"){props}"); } ElementName::SVG(path) => { imports = format!("{imports}svg,"); - view = format!("{view}\nsvg(\"{}\"){props}", path.display().to_string()); + view = format!("{view}\nsvg(\"{path}\"){props}"); } } @@ -149,9 +147,9 @@ impl RenderedElement { vec![ text1, RenderedElement::new(ElementName::Text("heh")), - RenderedElement::new(ElementName::SVG(PathBuf::from( + RenderedElement::new(ElementName::SVG( "/mnt/drive_d/git/obs-website/src/lib/assets/bars-solid.svg", - ))), + )), ], )); diff --git a/src/lib.rs b/iced_builder/src/lib.rs index e69de29..e69de29 100644 --- a/src/lib.rs +++ b/iced_builder/src/lib.rs 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() diff --git a/iced_builder/src/types/mod.rs b/iced_builder/src/types/mod.rs new file mode 100644 index 0000000..db06ffa --- /dev/null +++ b/iced_builder/src/types/mod.rs @@ -0,0 +1,54 @@ +pub mod rendered_element; + +use rendered_element::RenderedElement; + +pub struct DesignerState { + pub designer_content: Vec<RenderedElement>, + pub designer_page: DesignerPage, +} + +#[derive(Debug, Clone, Copy)] +pub enum ElementName { + Text(&'static str), + Button(&'static str), + SVG(&'static str), + Image(&'static str), + Container, + Row, + Column, +} + +impl ElementName { + pub const ALL: [Self; 7] = [ + Self::Text(""), + Self::Button(""), + Self::SVG(""), + Self::Image(""), + Self::Container, + Self::Row, + Self::Column, + ]; +} + +impl std::fmt::Display for ElementName { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "{}", + match self { + Self::Text(_) => "Text", + Self::Button(_) => "Button", + Self::SVG(_) => "SVG", + Self::Image(_) => "Image", + Self::Container => "Container", + Self::Row => "Row", + Self::Column => "Column", + } + ) + } +} + +pub enum DesignerPage { + Designer, + CodeView, +} diff --git a/src/types/rendered_element.rs b/iced_builder/src/types/rendered_element.rs index f05594d..f05594d 100644 --- a/src/types/rendered_element.rs +++ b/iced_builder/src/types/rendered_element.rs |
