diff options
| author | pml68 <contact@pml68.me> | 2024-10-25 21:16:54 +0200 |
|---|---|---|
| committer | pml68 <contact@pml68.me> | 2024-10-25 21:17:54 +0200 |
| commit | cb844f573a438ff3a9b2f71fb88e6537edb20f54 (patch) | |
| tree | 8d66ab7bd614a92d2824735ee55f91ff85c77f42 /iced_builder/src | |
| parent | Merge pull request #2 from pml68/feat/drag-and-drop (diff) | |
| download | iced-builder-cb844f573a438ff3a9b2f71fb88e6537edb20f54.tar.gz | |
refactor: extract views from `main.rs` file
Diffstat (limited to '')
| -rw-r--r-- | iced_builder/src/lib.rs | 1 | ||||
| -rw-r--r-- | iced_builder/src/main.rs | 174 | ||||
| -rw-r--r-- | iced_builder/src/types/project.rs | 5 | ||||
| -rwxr-xr-x | iced_builder/src/types/rendered_element.rs | 8 | ||||
| -rw-r--r-- | iced_builder/src/views/code_view.rs | 50 | ||||
| -rw-r--r-- | iced_builder/src/views/designer_view.rs | 40 | ||||
| -rw-r--r-- | iced_builder/src/views/element_list.rs | 48 | ||||
| -rw-r--r-- | iced_builder/src/views/mod.rs | 4 | ||||
| -rw-r--r-- | iced_builder/src/views/style.rs | 40 |
9 files changed, 206 insertions, 164 deletions
diff --git a/iced_builder/src/lib.rs b/iced_builder/src/lib.rs index 420b14c..f18e31d 100644 --- a/iced_builder/src/lib.rs +++ b/iced_builder/src/lib.rs @@ -1,4 +1,5 @@ pub mod types; +pub mod views; use std::path::PathBuf; diff --git a/iced_builder/src/main.rs b/iced_builder/src/main.rs index fc7f18c..32b52c5 100644 --- a/iced_builder/src/main.rs +++ b/iced_builder/src/main.rs @@ -2,19 +2,21 @@ use std::path::PathBuf; use iced::{ advanced::widget::Id, - clipboard, highlighter, keyboard, + clipboard, keyboard, widget::{ - button, column, container, + button, container, pane_grid::{self, Pane, PaneGrid}, - row, text, text_editor, themer, tooltip, Column, Space, + row, text_editor, Column, }, - Alignment, Element, Font, Length, Settings, Task, Theme, + Alignment, Element, Length, Settings, Task, Theme, }; -use iced_builder::types::{ - element_name::ElementName, project::Project, rendered_element::ActionKind, DesignerPage, +use iced_builder::{ + types::{ + element_name::ElementName, project::Project, rendered_element::ActionKind, DesignerPage, + }, + views::{designer_view, element_list}, }; -use iced_builder::Message; -use iced_drop::droppable; +use iced_builder::{views::code_view, Message}; fn main() -> iced::Result { iced::application(App::title, App::update, App::view) @@ -242,96 +244,16 @@ impl App { let is_focused = Some(id) == self.focus; match pane { Panes::Designer => match &self.designer_page { - DesignerPage::Designer => { - let el_tree = match self.project.content.clone() { - Some(tree) => tree.as_element(), - None => text("Open a project or begin creating one").into(), - }; - let content = container(themer(self.project.get_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 - }) - } + DesignerPage::Designer => designer_view::view( + &self.project.content, + self.project.get_theme(), + is_focused, + ), DesignerPage::CodeView => { - let title = row![ - text("Generated Code"), - Space::with_width(Length::Fill), - tooltip( - button( - container( - text('\u{0e801}').font(Font::with_name("editor-icons")) - ) - .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::Designer)) - ] - .align_y(Alignment::Center); - let title_bar = pane_grid::TitleBar::new(title) - .padding(10) - .style(style::title_bar); - pane_grid::Content::new( - text_editor(&self.editor_content) - .on_action(Message::EditorAction) - .highlight( - "rs", - if self.dark_theme { - 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 - }) + code_view::view(&self.editor_content, self.dark_theme, is_focused) } }, - Panes::ElementList => { - let items_list = items_list_view(self.element_list.clone()); - 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 - }) - } + Panes::ElementList => element_list::view(&self.element_list, is_focused), } }) .width(Length::Fill) @@ -351,65 +273,3 @@ impl App { container(content).height(Length::Fill).into() } } - -fn items_list_view<'a>(items: Vec<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() -} - -mod style { - 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/project.rs b/iced_builder/src/types/project.rs index 0e0442a..95de9e6 100644 --- a/iced_builder/src/types/project.rs +++ b/iced_builder/src/types/project.rs @@ -103,7 +103,7 @@ impl Project { {app_code} fn main() -> iced::Result {{ - iced::run("{}", State::update, State::view) + iced::application("{}", State::update, State::view).theme(iced::Theme::{}).run() }} #[derive(Default)] @@ -122,7 +122,8 @@ impl Project { match &self.title { Some(t) => t, None => "New app", - } + }, + self.get_theme().to_string().replace(" ", "") ); let config = Config::new_str() .edition(Edition::Rust2021) diff --git a/iced_builder/src/types/rendered_element.rs b/iced_builder/src/types/rendered_element.rs index e2bebfa..3be0d2e 100755 --- a/iced_builder/src/types/rendered_element.rs +++ b/iced_builder/src/types/rendered_element.rs @@ -109,10 +109,7 @@ 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| Id::new(x.id.clone()) == 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,7 +175,8 @@ impl RenderedElement { iced_drop::droppable( widget::container( widget::column![widget::text(self.name.clone().to_string()), children] - .width(Length::Fill), + .width(Length::Fill) + .spacing(10), ) .padding(10) .style(widget::container::bordered_box), diff --git a/iced_builder/src/views/code_view.rs b/iced_builder/src/views/code_view.rs new file mode 100644 index 0000000..4515687 --- /dev/null +++ b/iced_builder/src/views/code_view.rs @@ -0,0 +1,50 @@ +use super::style; +use crate::{types::DesignerPage, Message}; +use iced::{ + highlighter, + widget::{button, container, pane_grid, row, text, text_editor, tooltip, Space}, + Alignment, Font, Length, +}; + +pub fn view<'a>( + editor_content: &'a text_editor::Content, + dark_theme: bool, + is_focused: bool, +) -> pane_grid::Content<'a, Message> { + let title = row![ + text("Generated Code"), + Space::with_width(Length::Fill), + tooltip( + button(container(text('\u{0e801}').font(Font::with_name("editor-icons"))).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::Designer)) + ] + .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 dark_theme { + 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 new file mode 100644 index 0000000..6f31a51 --- /dev/null +++ b/iced_builder/src/views/designer_view.rs @@ -0,0 +1,40 @@ +use super::style; +use crate::{ + types::{rendered_element::RenderedElement, DesignerPage}, + Message, +}; +use iced::{ + widget::{button, container, pane_grid, row, text, themer, Space}, + Alignment, Length, +}; + +pub fn view<'a>( + element_tree: &Option<RenderedElement>, + designer_theme: iced::Theme, + is_focused: bool, +) -> pane_grid::Content<'a, Message> { + let el_tree = match element_tree { + Some(tree) => tree.clone().as_element(), + 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 new file mode 100644 index 0000000..f0fdd2f --- /dev/null +++ b/iced_builder/src/views/element_list.rs @@ -0,0 +1,48 @@ +use super::style; +use crate::{types::element_name::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<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 Vec<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 new file mode 100644 index 0000000..387662a --- /dev/null +++ b/iced_builder/src/views/mod.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/views/style.rs b/iced_builder/src/views/style.rs new file mode 100644 index 0000000..1eefb2d --- /dev/null +++ b/iced_builder/src/views/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() + } +} |
