summaryrefslogtreecommitdiff
path: root/iced_builder
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--iced_builder/Cargo.toml21
-rw-r--r--iced_builder/fonts/icons.ttf (renamed from fonts/icons.ttf)bin6352 -> 6352 bytes
-rw-r--r--iced_builder/src/codegen/mod.rs (renamed from src/codegen/mod.rs)10
-rw-r--r--iced_builder/src/lib.rs (renamed from src/lib.rs)0
-rw-r--r--iced_builder/src/main.rs (renamed from src/main.rs)51
-rw-r--r--iced_builder/src/types/mod.rs54
-rw-r--r--iced_builder/src/types/rendered_element.rs (renamed from src/types/rendered_element.rs)0
7 files changed, 117 insertions, 19 deletions
diff --git a/iced_builder/Cargo.toml b/iced_builder/Cargo.toml
new file mode 100644
index 0000000..febff28
--- /dev/null
+++ b/iced_builder/Cargo.toml
@@ -0,0 +1,21 @@
+[package]
+name = "iced_builder"
+description = "GUI builder for iced, built with iced."
+version = "0.1.0"
+edition = "2021"
+authors = ["pml68 <contact@pml68.me>"]
+repository = "https://github.com/pml68/iced-builder"
+license = "GPL-3.0-or-later"
+keywords = ["gui", "iced"]
+
+[dependencies]
+iced = { version = "0.12.1", features = [ "image","svg","canvas","qr_code","advanced","tokio","highlighter"] }
+iced_aw = { version = "0.9.3", default-features = false, features = ["menu","color_picker"] }
+iced_drop = { path = "../iced_drop" }
+tokio = { version = "1.40.0", features = ["fs"] }
+rust-format = "0.3.4"
+unique_id = "0.1.5"
+
+[[bin]]
+name = "iced-builder"
+path = "src/main.rs"
diff --git a/fonts/icons.ttf b/iced_builder/fonts/icons.ttf
index 393c692..393c692 100644
--- a/fonts/icons.ttf
+++ b/iced_builder/fonts/icons.ttf
Binary files differ
diff --git a/src/codegen/mod.rs b/iced_builder/src/codegen/mod.rs
index 2dd9cff..88c0c61 100644
--- a/src/codegen/mod.rs
+++ b/iced_builder/src/codegen/mod.rs
@@ -1,5 +1,3 @@
-use std::path::PathBuf;
-
use rust_format::{Config, Edition, Formatter, RustFmt};
use crate::types::{rendered_element::RenderedElement, ElementName};
@@ -74,11 +72,11 @@ impl RenderedElement {
}
ElementName::Image(path) => {
imports = format!("{imports}image,");
- view = format!("{view}\nimage(\"{}\"){props}", path.display().to_string());
+ view = format!("{view}\nimage(\"{path}\"){props}");
}
ElementName::SVG(path) => {
imports = format!("{imports}svg,");
- view = format!("{view}\nsvg(\"{}\"){props}", path.display().to_string());
+ view = format!("{view}\nsvg(\"{path}\"){props}");
}
}
@@ -149,9 +147,9 @@ impl RenderedElement {
vec![
text1,
RenderedElement::new(ElementName::Text("heh")),
- RenderedElement::new(ElementName::SVG(PathBuf::from(
+ RenderedElement::new(ElementName::SVG(
"/mnt/drive_d/git/obs-website/src/lib/assets/bars-solid.svg",
- ))),
+ )),
],
));
diff --git a/src/lib.rs b/iced_builder/src/lib.rs
index e69de29..e69de29 100644
--- a/src/lib.rs
+++ b/iced_builder/src/lib.rs
diff --git a/src/main.rs b/iced_builder/src/main.rs
index d3fafc6..e966614 100644
--- a/src/main.rs
+++ b/iced_builder/src/main.rs
@@ -12,6 +12,7 @@ use iced::{
},
Alignment, Application, Color, Command, Element, Font, Length, Settings,
};
+use iced_drop::droppable;
use types::{rendered_element::RenderedElement, DesignerPage, DesignerState};
fn main() -> iced::Result {
@@ -28,7 +29,7 @@ struct App {
pane_state: pane_grid::State<Panes>,
focus: Option<Pane>,
designer_state: DesignerState,
- element_list: Vec<String>,
+ element_list: Vec<types::ElementName>,
editor_content: text_editor::Content,
}
@@ -36,8 +37,14 @@ struct App {
enum Message {
ToggleTheme,
CopyCode,
+ Drop(types::ElementName, iced::Point, iced::Rectangle),
+ HandleZones(
+ types::ElementName,
+ Vec<(iced::advanced::widget::Id, iced::Rectangle)>,
+ ),
Resized(pane_grid::ResizeEvent),
Clicked(pane_grid::Pane),
+ PaneDragged(pane_grid::DragEvent),
}
#[derive(Clone, Debug)]
@@ -68,12 +75,9 @@ impl Application for App {
focus: None,
designer_state: DesignerState {
designer_content: vec![],
- designer_page: DesignerPage::CodeView,
+ designer_page: DesignerPage::Designer,
},
- element_list: vec!["Column", "Row", "PickList", "PaneGrid", "Button", "Text"]
- .into_iter()
- .map(|c| c.to_owned())
- .collect(),
+ element_list: types::ElementName::ALL.to_vec(),
editor_content: text_editor::Content::with_text(&RenderedElement::test()),
},
Command::none(),
@@ -109,6 +113,22 @@ impl Application for App {
Message::Clicked(pane) => {
self.focus = Some(pane);
}
+ Message::Drop(name, point, _) => {
+ return iced_drop::zones_on_point(
+ move |zones| Message::HandleZones(name, zones),
+ point,
+ None,
+ None,
+ )
+ .into()
+ }
+ Message::HandleZones(name, zones) => {
+ println!("{:?}\n{name}", zones);
+ }
+ Message::PaneDragged(pane_grid::DragEvent::Dropped { pane, target }) => {
+ self.pane_state.drop(pane, target);
+ }
+ Message::PaneDragged(_) => {}
}
Command::none()
@@ -124,8 +144,8 @@ impl Application for App {
match pane {
Panes::Designer => match self.designer_state.designer_page {
DesignerPage::Designer => {
- let content = column![text("Designer"),]
- .align_items(Alignment::Center)
+ let content = container("")
+ .id(iced::widget::container::Id::new("drop_zone"))
.height(Length::Fill)
.width(Length::Fill);
let title = text("Designer").style(if is_focused {
@@ -189,7 +209,7 @@ impl Application for App {
}
},
Panes::ElementList => {
- let items_list = items_list_view(&self.element_list);
+ let items_list = items_list_view(self.element_list.clone());
let content = column![items_list]
.align_items(Alignment::Center)
.height(Length::Fill)
@@ -216,7 +236,8 @@ impl Application for App {
.height(Length::Fill)
.spacing(10)
.on_resize(10, Message::Resized)
- .on_click(Message::Clicked);
+ .on_click(Message::Clicked)
+ .on_drag(Message::PaneDragged);
let content = Column::new()
.push(header)
@@ -244,14 +265,18 @@ const PANE_ID_COLOR_FOCUSED: Color = from_grayscale(1.0);
// #e8e8e8
const PANE_ID_COLOR_UNFOCUSED: Color = from_grayscale(0xE8 as f32 / 255.0);
-fn items_list_view(items: &Vec<String>) -> Element<'static, Message> {
+fn items_list_view(items: Vec<types::ElementName>) -> Element<'static, Message> {
let mut column = Column::new()
.spacing(20)
.align_items(Alignment::Center)
.width(Length::Fill);
- for value in items {
- column = column.push(text(value));
+ for item in items {
+ let value = item.clone();
+ column = column.push(
+ droppable(text(value.to_string()))
+ .on_drop(move |point, rect| Message::Drop(value, point, rect)),
+ );
}
container(column).height(250.0).width(300).into()
diff --git a/iced_builder/src/types/mod.rs b/iced_builder/src/types/mod.rs
new file mode 100644
index 0000000..db06ffa
--- /dev/null
+++ b/iced_builder/src/types/mod.rs
@@ -0,0 +1,54 @@
+pub mod rendered_element;
+
+use rendered_element::RenderedElement;
+
+pub struct DesignerState {
+ pub designer_content: Vec<RenderedElement>,
+ pub designer_page: DesignerPage,
+}
+
+#[derive(Debug, Clone, Copy)]
+pub enum ElementName {
+ Text(&'static str),
+ Button(&'static str),
+ SVG(&'static str),
+ Image(&'static str),
+ Container,
+ Row,
+ Column,
+}
+
+impl ElementName {
+ pub const ALL: [Self; 7] = [
+ Self::Text(""),
+ Self::Button(""),
+ Self::SVG(""),
+ Self::Image(""),
+ Self::Container,
+ Self::Row,
+ Self::Column,
+ ];
+}
+
+impl std::fmt::Display for ElementName {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ write!(
+ f,
+ "{}",
+ match self {
+ Self::Text(_) => "Text",
+ Self::Button(_) => "Button",
+ Self::SVG(_) => "SVG",
+ Self::Image(_) => "Image",
+ Self::Container => "Container",
+ Self::Row => "Row",
+ Self::Column => "Column",
+ }
+ )
+ }
+}
+
+pub enum DesignerPage {
+ Designer,
+ CodeView,
+}
diff --git a/src/types/rendered_element.rs b/iced_builder/src/types/rendered_element.rs
index f05594d..f05594d 100644
--- a/src/types/rendered_element.rs
+++ b/iced_builder/src/types/rendered_element.rs