Improve GUI

This commit is contained in:
Jeff 2023-12-31 19:46:23 -05:00
parent b72d11b500
commit 415c9863e6
3 changed files with 173 additions and 23 deletions

57
Cargo.lock generated
View File

@ -945,7 +945,9 @@ dependencies = [
"csv", "csv",
"eframe", "eframe",
"egui", "egui",
"egui_extras",
"env_logger", "env_logger",
"getrandom",
"libc", "libc",
"log", "log",
"rand", "rand",
@ -1035,6 +1037,19 @@ dependencies = [
"winit", "winit",
] ]
[[package]]
name = "egui_extras"
version = "0.24.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97624eaf17a16058265d3a3e712e167798655baf7c8f693de25be75cdd6c57b5"
dependencies = [
"egui",
"enum-map",
"log",
"mime_guess2",
"serde",
]
[[package]] [[package]]
name = "egui_glow" name = "egui_glow"
version = "0.24.1" version = "0.24.1"
@ -1081,6 +1096,27 @@ version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d"
[[package]]
name = "enum-map"
version = "2.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9"
dependencies = [
"enum-map-derive",
"serde",
]
[[package]]
name = "enum-map-derive"
version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.43",
]
[[package]] [[package]]
name = "enumflags2" name = "enumflags2"
version = "0.7.8" version = "0.7.8"
@ -1386,8 +1422,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"js-sys",
"libc", "libc",
"wasi", "wasi",
"wasm-bindgen",
] ]
[[package]] [[package]]
@ -1877,6 +1915,16 @@ version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
[[package]]
name = "mime_guess2"
version = "2.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "25a3333bb1609500601edc766a39b4c1772874a4ce26022f4d866854dc020c41"
dependencies = [
"mime",
"unicase",
]
[[package]] [[package]]
name = "miniz_oxide" name = "miniz_oxide"
version = "0.7.1" version = "0.7.1"
@ -3111,6 +3159,15 @@ dependencies = [
"winapi", "winapi",
] ]
[[package]]
name = "unicase"
version = "2.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89"
dependencies = [
"version_check",
]
[[package]] [[package]]
name = "unicode-bidi" name = "unicode-bidi"
version = "0.3.14" version = "0.3.14"

View File

@ -33,16 +33,18 @@ log = "0.4.20"
rand = "0.8.5" rand = "0.8.5"
rayon = "1.8.0" rayon = "1.8.0"
reqwest = { version = "0.11.20", features = ["blocking", "json"] } reqwest = { version = "0.11.20", features = ["blocking", "json"] }
rustyline = { version = "12.0.0", features = ["derive", "with-file-history"] }
serde = { version = "1.0.188", features = ["derive"] } serde = { version = "1.0.188", features = ["derive"] }
serde_json = "1.0.107" serde_json = "1.0.107"
toml = "0.8.1" toml = "0.8.1"
tree-sitter = "0.20.10" tree-sitter = "0.20.10"
egui_extras = "0.24.2"
[target.'cfg(not(target_arch = "wasm32"))'.dependencies] [target.'cfg(not(target_arch = "wasm32"))'.dependencies]
env_logger = "0.10" env_logger = "0.10"
rustyline = { version = "12.0.0", features = ["derive", "with-file-history"] }
[target.'cfg(target_arch = "wasm32")'.dependencies] [target.'cfg(target_arch = "wasm32")'.dependencies]
getrandom = { version = "0.2", features = ["js"] }
wasm-bindgen-futures = "0.4" wasm-bindgen-futures = "0.4"
[build-dependencies] [build-dependencies]

View File

@ -1,7 +1,8 @@
use std::{fs::read_to_string, path::PathBuf}; use std::{fs::read_to_string, path::PathBuf};
use dust_lang::{Interpreter, Map, Result, Value}; use dust_lang::{Interpreter, Map, Result, Value};
use egui::{Align, Color32, Layout, RichText}; use egui::{Align, Color32, Layout, RichText, ScrollArea};
use egui_extras::{Column, TableBuilder};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
#[derive(Deserialize, Serialize)] #[derive(Deserialize, Serialize)]
@ -12,6 +13,7 @@ pub struct App {
#[serde(skip)] #[serde(skip)]
interpreter: Interpreter, interpreter: Interpreter,
output: Result<Value>, output: Result<Value>,
error: Option<String>,
} }
impl App { impl App {
@ -33,6 +35,7 @@ impl App {
context, context,
interpreter, interpreter,
output, output,
error: None,
} }
} }
@ -77,30 +80,50 @@ impl eframe::App for App {
}); });
egui::CentralPanel::default().show(ctx, |ui| { egui::CentralPanel::default().show(ctx, |ui| {
ui.with_layout(Layout::left_to_right(Align::Min), |ui| { ui.columns(2, |columns| {
ui.with_layout(Layout::top_down(Align::Min).with_main_justify(true), |ui| { ScrollArea::vertical()
ui.with_layout(Layout::left_to_right(Align::Min), |ui| { .id_source("source")
.show(&mut columns[0], |ui| {
if let Some(error) = &self.error {
ui.label(RichText::new(error).color(Color32::LIGHT_RED));
}
ui.text_edit_singleline(&mut self.path); ui.text_edit_singleline(&mut self.path);
ui.code_editor(&mut self.source);
if ui.button("read").clicked() { if ui.button("read").clicked() {
self.source = read_to_string(&self.path).unwrap(); match read_to_string(&self.path) {
Ok(source) => {
self.source = source;
self.error = None;
}
Err(error) => self.error = Some(error.to_string()),
}
} }
if ui.button("run").clicked() { if ui.button("run").clicked() {
self.output = self.interpreter.run(&self.source); self.output = self.interpreter.run(&self.source);
} }
}); });
ui.code_editor(&mut self.source); ScrollArea::vertical()
}); .id_source("output")
.show(&mut columns[1], |ui| match &self.output {
Ok(value) => display_value(value, ui),
Err(error) => {
ui.label(RichText::new(error.to_string()).color(Color32::LIGHT_RED));
match &self.output { display_value(&Value::Map(self.context.clone()), ui);
Ok(value) => {
display_value(value, ui); match &self.output {
} Ok(value) => {
Err(error) => { display_value(value, ui);
ui.label(error.to_string()); }
} Err(error) => {
} ui.label(error.to_string());
}
}
}
});
}); });
}); });
} }
@ -109,13 +132,57 @@ impl eframe::App for App {
fn display_value(value: &Value, ui: &mut egui::Ui) { fn display_value(value: &Value, ui: &mut egui::Ui) {
match value { match value {
Value::List(list) => { Value::List(list) => {
ui.collapsing("list", |ui| { let table = TableBuilder::new(ui)
for value in list.items().iter() { .striped(true)
display_value(value, ui); .resizable(true)
} .column(Column::auto())
}); .column(Column::auto());
table
.header(20.0, |mut header| {
header.col(|ui| {
ui.strong("index");
});
})
.body(|mut body| {
for (index, value) in list.items().iter().enumerate() {
body.row(20.0, |mut row| {
row.col(|ui| {
ui.label(index.to_string());
});
row.col(|ui| {
display_value(value, ui);
});
});
}
});
}
Value::Map(map) => {
let table = TableBuilder::new(ui)
.striped(true)
.resizable(true)
.column(Column::auto())
.column(Column::auto());
table
.header(20.0, |mut header| {
header.col(|ui| {
ui.strong("key");
});
})
.body(|mut body| {
for (key, (value, _)) in map.variables().unwrap().iter() {
body.row(20.0, |mut row| {
row.col(|ui| {
ui.label(key);
});
row.col(|ui| {
display_value(value, ui);
});
});
}
});
} }
Value::Map(_) => todo!(),
Value::Function(function) => { Value::Function(function) => {
ui.label(function.to_string()); ui.label(function.to_string());
} }
@ -131,6 +198,30 @@ fn display_value(value: &Value, ui: &mut egui::Ui) {
Value::Boolean(boolean) => { Value::Boolean(boolean) => {
ui.label(RichText::new(boolean.to_string()).color(Color32::RED)); ui.label(RichText::new(boolean.to_string()).color(Color32::RED));
} }
Value::Option(_) => todo!(), Value::Option(option) => match option {
Some(value) => {
let table = TableBuilder::new(ui)
.striped(true)
.resizable(true)
.column(Column::auto());
table
.header(20.0, |mut header| {
header.col(|ui| {
ui.strong("some");
});
})
.body(|mut body| {
body.row(20.0, |mut row| {
row.col(|ui| {
display_value(value, ui);
});
});
});
}
None => {
ui.label("none");
}
},
} }
} }