From 72e527f51acc44195df5cafda7d8f3d6dc12695c Mon Sep 17 00:00:00 2001 From: pml68 Date: Thu, 26 Dec 2024 00:04:43 +0100 Subject: refactor: `views` -> `panes`, `mod.rs` -> `{panes,types}.rs` --- iced_builder/src/panes/code_view.rs | 50 +++++++++++++++++++++++++++++++++ iced_builder/src/panes/designer_view.rs | 37 ++++++++++++++++++++++++ iced_builder/src/panes/element_list.rs | 49 ++++++++++++++++++++++++++++++++ iced_builder/src/panes/style.rs | 40 ++++++++++++++++++++++++++ 4 files changed, 176 insertions(+) create mode 100644 iced_builder/src/panes/code_view.rs create mode 100644 iced_builder/src/panes/designer_view.rs create mode 100644 iced_builder/src/panes/element_list.rs create mode 100644 iced_builder/src/panes/style.rs (limited to 'iced_builder/src/panes') diff --git a/iced_builder/src/panes/code_view.rs b/iced_builder/src/panes/code_view.rs new file mode 100644 index 0000000..1be75d9 --- /dev/null +++ b/iced_builder/src/panes/code_view.rs @@ -0,0 +1,50 @@ +use iced::widget::{ + button, container, pane_grid, row, text, text_editor, tooltip, Space, +}; +use iced::{Alignment, Length, Theme}; +use super::style; +use crate::icon::copy; +use crate::types::{DesignerPage, Message}; + +pub fn view<'a>( + editor_content: &'a text_editor::Content, + theme: Theme, + is_focused: bool, +) -> pane_grid::Content<'a, Message> { + let title = row![ + text("Generated Code"), + Space::with_width(Length::Fill), + tooltip( + button(container(copy()).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::DesignerView)) + ] + .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 theme.to_string().contains("Dark") { + 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/panes/designer_view.rs b/iced_builder/src/panes/designer_view.rs new file mode 100644 index 0000000..76456db --- /dev/null +++ b/iced_builder/src/panes/designer_view.rs @@ -0,0 +1,37 @@ +use iced::widget::{button, container, pane_grid, row, text, themer, Space}; +use iced::{Alignment, Element, Length}; + +use super::style; +use crate::types::{DesignerPage, Message, RenderedElement}; + +pub fn view<'a>( + element_tree: &Option, + designer_theme: iced::Theme, + is_focused: bool, +) -> pane_grid::Content<'a, Message> { + let el_tree: Element<'a, Message> = match element_tree { + Some(tree) => tree.clone().into(), + 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/panes/element_list.rs b/iced_builder/src/panes/element_list.rs new file mode 100644 index 0000000..74188af --- /dev/null +++ b/iced_builder/src/panes/element_list.rs @@ -0,0 +1,49 @@ +use iced::widget::{column, container, pane_grid, text, Column}; +use iced::{Alignment, Element, Length}; +use iced_drop::droppable; + +use super::style; +use crate::types::{ElementName, Message}; + +fn items_list_view<'a>(items: &'a [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 [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/panes/style.rs b/iced_builder/src/panes/style.rs new file mode 100644 index 0000000..1eefb2d --- /dev/null +++ b/iced_builder/src/panes/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() + } +} -- cgit v1.2.3 From 0515571231b387c2fa9c15f23b0d5a13958fae8b Mon Sep 17 00:00:00 2001 From: pml68 Date: Thu, 26 Dec 2024 00:05:21 +0100 Subject: feat: add `tip` widget helper from `hecrj/icebreaker` --- iced_builder/src/lib.rs | 1 + iced_builder/src/panes/code_view.rs | 11 +++++------ iced_builder/src/widget.rs | 21 +++++++++++++++++++++ 3 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 iced_builder/src/widget.rs (limited to 'iced_builder/src/panes') diff --git a/iced_builder/src/lib.rs b/iced_builder/src/lib.rs index d04c594..f3165f5 100644 --- a/iced_builder/src/lib.rs +++ b/iced_builder/src/lib.rs @@ -3,6 +3,7 @@ pub mod error; pub mod icon; pub mod panes; pub mod types; +pub mod widget; pub use error::Error; pub type Result = core::result::Result; diff --git a/iced_builder/src/panes/code_view.rs b/iced_builder/src/panes/code_view.rs index 1be75d9..fe7801c 100644 --- a/iced_builder/src/panes/code_view.rs +++ b/iced_builder/src/panes/code_view.rs @@ -1,10 +1,9 @@ -use iced::widget::{ - button, container, pane_grid, row, text, text_editor, tooltip, Space, -}; +use iced::widget::{button, pane_grid, row, text, text_editor, Space}; use iced::{Alignment, Length, Theme}; use super::style; use crate::icon::copy; use crate::types::{DesignerPage, Message}; +use crate::widget::tip; pub fn view<'a>( editor_content: &'a text_editor::Content, @@ -14,10 +13,10 @@ pub fn view<'a>( let title = row![ text("Generated Code"), Space::with_width(Length::Fill), - tooltip( - button(container(copy()).center_x(30)).on_press(Message::CopyCode), + tip( + button(copy()).on_press(Message::CopyCode), "Copy code to clipboard", - tooltip::Position::FollowCursor + tip::Position::FollowCursor ), Space::with_width(20), button("Switch to Designer view") diff --git a/iced_builder/src/widget.rs b/iced_builder/src/widget.rs new file mode 100644 index 0000000..ed2073a --- /dev/null +++ b/iced_builder/src/widget.rs @@ -0,0 +1,21 @@ +use iced::widget::{container, text, tooltip}; +use iced::Element; + +pub mod tip { + pub use super::tooltip::Position; +} + +pub fn tip<'a, Message: 'a>( + target: impl Into>, + tip: &'a str, + position: tip::Position, +) -> Element<'a, Message> { + tooltip( + target, + container(text(tip).size(14)) + .padding(5) + .style(container::rounded_box), + position, + ) + .into() +} -- cgit v1.2.3