summaryrefslogtreecommitdiff
path: root/iced_builder/src/views
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--iced_builder/src/views/code_view.rs50
-rw-r--r--iced_builder/src/views/designer_view.rs40
-rw-r--r--iced_builder/src/views/element_list.rs48
-rw-r--r--iced_builder/src/views/mod.rs4
-rw-r--r--iced_builder/src/views/style.rs40
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()
+ }
+}