summaryrefslogtreecommitdiff
path: root/iced_builder/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--iced_builder/src/lib.rs1
-rw-r--r--iced_builder/src/main.rs174
-rw-r--r--iced_builder/src/types/project.rs5
-rwxr-xr-xiced_builder/src/types/rendered_element.rs8
-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
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()
+ }
+}