Begin port of front end to ICED.

This commit is contained in:
jess 2026-05-17 00:53:45 -07:00
parent 822b9009a6
commit 9cebfa128f
6 changed files with 1134 additions and 107 deletions

1135
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -8,6 +8,7 @@ members = [
"desktop/platform/mac", "desktop/platform/mac",
"desktop/platform/win", "desktop/platform/win",
"editor", "editor",
"frontend/iced",
"frontend/wrapper", "frontend/wrapper",
"libraries/dyn-any", "libraries/dyn-any",
"libraries/math-parser", "libraries/math-parser",

21
frontend/iced/Cargo.toml Normal file
View File

@ -0,0 +1,21 @@
[package]
name = "graphite-iced-frontend"
description = "Pure-Rust GUI for Graphite built on iced"
publish = false
version.workspace = true
authors.workspace = true
edition.workspace = true
license.workspace = true
rust-version.workspace = true
[[bin]]
name = "graphite-iced"
path = "src/main.rs"
[dependencies]
graphite-editor = { workspace = true }
iced = { version = "0.14", default-features = false, features = ["wgpu", "tokio"] }
rand = { workspace = true, features = ["thread_rng"] }
tracing = { workspace = true }
tracing-subscriber = { workspace = true }

74
frontend/iced/src/main.rs Normal file
View File

@ -0,0 +1,74 @@
use graphite_editor::application::{Editor, Environment, Host, Platform};
use graphite_editor::messages::prelude::*;
use iced::widget::{column, container, text};
use iced::{Element, Length, Task, Theme};
use rand::Rng;
#[derive(Debug, Clone)]
enum Message {
Init,
}
struct App {
editor: Editor,
last_frontend_count: usize,
}
impl App {
fn boot() -> (Self, Task<Message>) {
let environment = Environment {
platform: Platform::Desktop,
host: detect_host(),
};
let seed = rand::rng().random();
let editor = Editor::new(environment, seed);
(Self { editor, last_frontend_count: 0 }, Task::done(Message::Init))
}
fn title(&self) -> String {
String::from("Graphite")
}
fn update(&mut self, message: Message) -> Task<Message> {
match message {
Message::Init => {
let responses = self.editor.handle_message(PortfolioMessage::Init);
self.last_frontend_count = responses.len();
tracing::info!(count = responses.len(), "editor responded to PortfolioMessage::Init");
for response in &responses {
tracing::info!(kind = %response.to_discriminant().local_name(), "frontend message");
}
}
}
Task::none()
}
fn view(&self) -> Element<'_, Message> {
container(column![text("Graphite").size(40), text(format!("editor produced {} frontend messages at boot", self.last_frontend_count)).size(14),].spacing(8))
.padding(24)
.width(Length::Fill)
.height(Length::Fill)
.into()
}
fn theme(&self) -> Theme {
Theme::Dark
}
}
fn detect_host() -> Host {
if cfg!(target_os = "macos") {
Host::Mac
} else if cfg!(target_os = "windows") {
Host::Windows
} else {
Host::Linux
}
}
fn main() -> iced::Result {
tracing_subscriber::fmt().with_env_filter(tracing_subscriber::EnvFilter::from_default_env().add_directive(tracing::Level::INFO.into())).init();
iced::application(App::boot, App::update, App::view).title(App::title).theme(App::theme).run()
}

View File

@ -12,6 +12,7 @@ pub enum Action {
pub enum Target { pub enum Target {
Web, Web,
Desktop, Desktop,
Iced,
Cli, Cli,
} }
@ -45,6 +46,7 @@ impl Task {
let (target, args) = match args.first() { let (target, args) = match args.first() {
Some(&"desktop") => (Target::Desktop, &args[1..]), Some(&"desktop") => (Target::Desktop, &args[1..]),
Some(&"web") => (Target::Web, &args[1..]), Some(&"web") => (Target::Web, &args[1..]),
Some(&"iced") => (Target::Iced, &args[1..]),
Some(&"cli") => (Target::Cli, &args[1..]), Some(&"cli") => (Target::Cli, &args[1..]),
_ => (Target::Web, args), _ => (Target::Web, args),
}; };

View File

@ -10,6 +10,7 @@ fn usage() {
println!("COMMON USAGE:"); println!("COMMON USAGE:");
println!(" cargo run Run the web app"); println!(" cargo run Run the web app");
println!(" cargo run desktop Run the desktop app"); println!(" cargo run desktop Run the desktop app");
println!(" cargo run iced Run ICED frontend");
println!(); println!();
println!("OPTIONS:"); println!("OPTIONS:");
println!("<command>:"); println!("<command>:");
@ -20,6 +21,7 @@ fn usage() {
println!("<target>:"); println!("<target>:");
println!(" [web] Web app (default)"); println!(" [web] Web app (default)");
println!(" desktop Desktop app"); println!(" desktop Desktop app");
println!(" iced ICED frontend");
println!(" cli Graphene CLI"); println!(" cli Graphene CLI");
println!("<profile>:"); println!("<profile>:");
println!(" [debug] Optimizations disabled (default for run)"); println!(" [debug] Optimizations disabled (default for run)");
@ -127,6 +129,12 @@ fn run_task(task: &Task) -> Result<(), Error> {
(Action::Build, Target::Cli, Profile::Debug) => run("cargo build -p graphene-cli")?, (Action::Build, Target::Cli, Profile::Debug) => run("cargo build -p graphene-cli")?,
(Action::Build, Target::Cli, Profile::Release | Profile::Default) => run("cargo build -r -p graphene-cli")?, (Action::Build, Target::Cli, Profile::Release | Profile::Default) => run("cargo build -r -p graphene-cli")?,
(Action::Run, Target::Iced, Profile::Debug | Profile::Default) => run(&format!("cargo run -p graphite-iced-frontend -- {}", task.args.join(" ")))?,
(Action::Run, Target::Iced, Profile::Release) => run(&format!("cargo run -r -p graphite-iced-frontend -- {}", task.args.join(" ")))?,
(Action::Build, Target::Iced, Profile::Debug) => run("cargo build -p graphite-iced-frontend")?,
(Action::Build, Target::Iced, Profile::Release | Profile::Default) => run("cargo build -r -p graphite-iced-frontend")?,
(Action::Explore(_), _, _) => unreachable!(), (Action::Explore(_), _, _) => unreachable!(),
} }
Ok(()) Ok(())