diff options
Diffstat (limited to 'iced_builder/src/views')
| -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 |
5 files changed, 182 insertions, 0 deletions
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() + } +} |
