Compare commits
9 Commits
a21fc048ad
...
7f9a962ff7
| Author | SHA1 | Date | |
|---|---|---|---|
| 7f9a962ff7 | |||
| 8b7e3b3009 | |||
| 74813f5f13 | |||
| 4a4bce90d0 | |||
| fabfc6de31 | |||
| 7dc48f1b33 | |||
| c0a05464f3 | |||
| 84e283f5c2 | |||
| faee5488df |
862
Cargo.lock
generated
862
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
33
Cargo.toml
33
Cargo.toml
@ -33,17 +33,17 @@ strip = false
|
||||
|
||||
[dependencies]
|
||||
parsing = { path = "./parsing" }
|
||||
eframe = { git = "https://github.com/titaniumtown/egui.git", rev = "b088efb9fa917845ecb54729a0d2fc592d2399e7", default-features = false, features = [
|
||||
eframe = { git = "https://github.com/titaniumtown/egui.git", default-features = false, features = [
|
||||
"glow",
|
||||
] }
|
||||
egui = { git = "https://github.com/titaniumtown/egui.git", rev = "b088efb9fa917845ecb54729a0d2fc592d2399e7", default-features = false, features = [
|
||||
egui = { git = "https://github.com/titaniumtown/egui.git", default-features = false, features = [
|
||||
"serde",
|
||||
] }
|
||||
epaint = { git = "https://github.com/titaniumtown/egui.git", rev = "b088efb9fa917845ecb54729a0d2fc592d2399e7", default-features = false , features = [
|
||||
epaint = { git = "https://github.com/titaniumtown/egui.git", default-features = false , features = [
|
||||
"bytemuck",
|
||||
] }
|
||||
emath = { git = "https://github.com/titaniumtown/egui.git", rev = "b088efb9fa917845ecb54729a0d2fc592d2399e7", default-features = false }
|
||||
egui_plot = { git = "https://github.com/titaniumtown/egui.git", rev = "b088efb9fa917845ecb54729a0d2fc592d2399e7", default-features = false }
|
||||
emath = { git = "https://github.com/titaniumtown/egui.git", default-features = false }
|
||||
egui_plot = { git = "https://github.com/emilk/egui_plot.git", default-features = false }
|
||||
|
||||
|
||||
|
||||
@ -63,10 +63,10 @@ benchmarks = { path = "./benchmarks" }
|
||||
|
||||
[build-dependencies]
|
||||
shadow-rs = "0.12"
|
||||
epaint = { git = "https://github.com/titaniumtown/egui.git", rev = "b088efb9fa917845ecb54729a0d2fc592d2399e7", default-features = false, features = [
|
||||
epaint = { git = "https://github.com/titaniumtown/egui.git", default-features = false, features = [
|
||||
"bytemuck",
|
||||
] }
|
||||
egui = { git = "https://github.com/titaniumtown/egui.git", rev = "b088efb9fa917845ecb54729a0d2fc592d2399e7", default-features = false, features = [
|
||||
egui = { git = "https://github.com/titaniumtown/egui.git", default-features = false, features = [
|
||||
"serde",
|
||||
] }
|
||||
bincode = "1.3"
|
||||
@ -94,3 +94,22 @@ wasm-bindgen-futures = "=0.4.54"
|
||||
|
||||
[package.metadata.cargo-all-features]
|
||||
skip_optional_dependencies = true #don't test optional dependencies, only features
|
||||
|
||||
# various dependency patches fix issues with nix complication such as:
|
||||
# ````
|
||||
# ln: failed to create symbolic link '/nix/store/plh3y4gfxgwcacjccv72f551y1k89x75-cargo-vendor-dir/ecolor-0.33.2/qb43vsx43av6kf4h9y4bsmisvbjlcxd1-ecolor-0.33.2': Permission denied
|
||||
# ````
|
||||
|
||||
[patch."https://github.com/emilk/egui_plot.git"]
|
||||
egui = { git = "https://github.com/titaniumtown/egui.git" }
|
||||
eframe = { git = "https://github.com/titaniumtown/egui.git" }
|
||||
epaint = { git = "https://github.com/titaniumtown/egui.git" }
|
||||
emath = { git = "https://github.com/titaniumtown/egui.git" }
|
||||
ecolor = { git = "https://github.com/titaniumtown/egui.git" }
|
||||
|
||||
[patch.crates-io]
|
||||
egui = { git = "https://github.com/titaniumtown/egui.git" }
|
||||
eframe = { git = "https://github.com/titaniumtown/egui.git" }
|
||||
epaint = { git = "https://github.com/titaniumtown/egui.git" }
|
||||
emath = { git = "https://github.com/titaniumtown/egui.git" }
|
||||
ecolor = { git = "https://github.com/titaniumtown/egui.git" }
|
||||
|
||||
16
build.rs
16
build.rs
@ -4,11 +4,12 @@ use std::{
|
||||
fs::File,
|
||||
io::{BufWriter, Write},
|
||||
path::Path,
|
||||
sync::Arc,
|
||||
};
|
||||
|
||||
use epaint::{
|
||||
FontFamily,
|
||||
text::{FontData, FontDefinitions, FontTweak},
|
||||
FontFamily,
|
||||
};
|
||||
|
||||
use run_script::ScriptOptions;
|
||||
@ -104,38 +105,39 @@ fn main() {
|
||||
font_data: BTreeMap::from([
|
||||
(
|
||||
"Ubuntu-Light".to_owned(),
|
||||
FontData::from_owned(
|
||||
Arc::new(FontData::from_owned(
|
||||
font_stripper(
|
||||
"Ubuntu-Light.ttf",
|
||||
"ubuntu-light.ttf",
|
||||
[main_chars, vec!['∫']].concat(),
|
||||
)
|
||||
.unwrap(),
|
||||
),
|
||||
)),
|
||||
),
|
||||
(
|
||||
"NotoEmoji-Regular".to_owned(),
|
||||
FontData::from_owned(
|
||||
Arc::new(FontData::from_owned(
|
||||
font_stripper(
|
||||
"NotoEmoji-Regular.ttf",
|
||||
"noto-emoji.ttf",
|
||||
vec!['🌞', '🌙', '✖'],
|
||||
)
|
||||
.unwrap(),
|
||||
),
|
||||
)),
|
||||
),
|
||||
(
|
||||
"emoji-icon-font".to_owned(),
|
||||
Arc::new(
|
||||
FontData::from_owned(
|
||||
font_stripper("emoji-icon-font.ttf", "emoji-icon.ttf", vec!['⚙']).unwrap(),
|
||||
)
|
||||
.tweak(FontTweak {
|
||||
scale: 0.8,
|
||||
y_offset_factor: 0.07,
|
||||
y_offset: 0.0,
|
||||
baseline_offset_factor: -0.0333,
|
||||
y_offset: -0.0333,
|
||||
}),
|
||||
),
|
||||
),
|
||||
]),
|
||||
families: BTreeMap::from([
|
||||
(
|
||||
|
||||
@ -45,7 +45,8 @@
|
||||
cargoLock = {
|
||||
lockFile = ./Cargo.lock;
|
||||
outputHashes = {
|
||||
"ecolor-0.25.0" = "sha256-9s5LCngwvIIL43txT6sBs4JlRXqmYt1Kw8hlDnwx+DI=";
|
||||
"ecolor-0.33.2" = "sha256-jdQK55yKZptadwosrJXIhoQDGNeELQmPExWRsGc0VG0=";
|
||||
"egui_plot-0.34.0" = "sha256-CfqrpAnLNcB3StuZ9YSDTWih8OUVEa9SJi9RwS1i4ok=";
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@ -449,7 +449,7 @@ impl FunctionEntry {
|
||||
Some(integral_data) => {
|
||||
if integral_step > step {
|
||||
plot_ui.bar_chart(
|
||||
BarChart::new(integral_data.0.clone())
|
||||
BarChart::new("integral bar chart", integral_data.0.clone())
|
||||
.color(Color32::BLUE)
|
||||
.width(integral_step),
|
||||
);
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
use crate::{
|
||||
consts::COLORS, function_entry::FunctionEntry, misc::random_u64, widgets::widgets_ontop,
|
||||
};
|
||||
use egui::{Button, Id, Key, Modifiers, TextEdit, WidgetText};
|
||||
use egui::{Button, Id, Key, Modifiers, PopupCloseBehavior, TextEdit, WidgetText};
|
||||
use emath::vec2;
|
||||
use parsing::Movement;
|
||||
use serde::ser::SerializeStruct;
|
||||
@ -147,7 +147,12 @@ impl FunctionManager {
|
||||
|
||||
let autocomplete_popup_id = Id::new("autocomplete popup");
|
||||
|
||||
egui::popup_below_widget(ui, autocomplete_popup_id, &re, |ui| {
|
||||
egui::popup_below_widget(
|
||||
ui,
|
||||
autocomplete_popup_id,
|
||||
&re,
|
||||
PopupCloseBehavior::CloseOnClickOutside,
|
||||
|ui| {
|
||||
hints.iter().enumerate().for_each(|(i, candidate)| {
|
||||
if ui
|
||||
.selectable_label(i == function.autocomplete.i, *candidate)
|
||||
@ -157,7 +162,8 @@ impl FunctionManager {
|
||||
function.autocomplete.i = i;
|
||||
}
|
||||
});
|
||||
});
|
||||
},
|
||||
);
|
||||
|
||||
if clicked {
|
||||
function
|
||||
@ -172,10 +178,14 @@ impl FunctionManager {
|
||||
|
||||
// Push cursor to end if needed
|
||||
if movement == Movement::Complete {
|
||||
// TODO! proper error handling
|
||||
let mut state =
|
||||
unsafe { TextEdit::load_state(ui.ctx(), te_id).unwrap_unchecked() };
|
||||
let ccursor = egui::text::CCursor::new(function.autocomplete.string.len());
|
||||
state.set_ccursor_range(Some(egui::text::CCursorRange::one(ccursor)));
|
||||
state
|
||||
.cursor
|
||||
.set_char_range(Some(egui::text::CCursorRange::one(ccursor)));
|
||||
|
||||
TextEdit::store_state(ui.ctx(), te_id, state);
|
||||
}
|
||||
}
|
||||
|
||||
@ -22,6 +22,7 @@ pub use crate::{
|
||||
cfg_if::cfg_if! {
|
||||
if #[cfg(target_arch = "wasm32")] {
|
||||
use wasm_bindgen::prelude::*;
|
||||
use web_sys::HtmlCanvasElement;
|
||||
|
||||
use lol_alloc::{FreeListAllocator, LockedAllocator};
|
||||
#[global_allocator]
|
||||
@ -51,12 +52,12 @@ cfg_if::cfg_if! {
|
||||
|
||||
/// Call this once from JavaScript to start your app.
|
||||
#[wasm_bindgen]
|
||||
pub async fn start(&self, canvas_id: &str) -> Result<(), wasm_bindgen::JsValue> {
|
||||
pub async fn start(&self, canvas_id: HtmlCanvasElement) -> Result<(), wasm_bindgen::JsValue> {
|
||||
self.runner
|
||||
.start(
|
||||
canvas_id,
|
||||
eframe::WebOptions::default(),
|
||||
Box::new(|cc| Box::new(math_app::MathApp::new(cc))),
|
||||
Box::new(|cc| Ok(Box::new(math_app::MathApp::new(cc)))),
|
||||
)
|
||||
.await
|
||||
}
|
||||
@ -66,9 +67,11 @@ cfg_if::cfg_if! {
|
||||
pub async fn start() {
|
||||
tracing::info!("Starting...");
|
||||
|
||||
let document = web_sys::window().unwrap().document().unwrap();
|
||||
let canvas = document.get_element_by_id("canvas").unwrap().dyn_into::<HtmlCanvasElement>().unwrap();
|
||||
|
||||
let web_handle = WebHandle::new();
|
||||
web_handle.start("canvas").await.unwrap()
|
||||
web_handle.start(canvas).await.unwrap()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -6,13 +6,13 @@ use crate::{
|
||||
};
|
||||
use eframe::App;
|
||||
use egui::{
|
||||
Button, CentralPanel, Color32, ComboBox, Context, DragValue, Frame, Key, Layout, SidePanel,
|
||||
TopBottomPanel, Ui, Vec2, Window, style::Margin,
|
||||
Button, CentralPanel, Color32, ComboBox, Context, CornerRadius, DragValue, Frame, Key, Layout,
|
||||
SidePanel, TopBottomPanel, Ui, Vec2, Window,
|
||||
};
|
||||
use egui_plot::Plot;
|
||||
|
||||
use emath::{Align, Align2};
|
||||
use epaint::Rounding;
|
||||
use epaint::{Margin, Rounding};
|
||||
use instant::Instant;
|
||||
use itertools::Itertools;
|
||||
use std::{io::Read, ops::BitXorAssign};
|
||||
@ -535,11 +535,11 @@ impl App for MathApp {
|
||||
// Central panel which contains the central plot (or an error created when parsing)
|
||||
CentralPanel::default()
|
||||
.frame(Frame {
|
||||
inner_margin: Margin::symmetric(0.0, 0.0),
|
||||
rounding: Rounding::ZERO,
|
||||
inner_margin: Margin::ZERO,
|
||||
corner_radius: CornerRadius::ZERO,
|
||||
// fill: crate::style::STYLE.window_fill(),
|
||||
fill: Color32::from_gray(27),
|
||||
..Frame::none()
|
||||
..Frame::NONE
|
||||
})
|
||||
.show(ctx, |ui| {
|
||||
// Display an error if it exists
|
||||
|
||||
16
src/misc.rs
16
src/misc.rs
@ -8,13 +8,13 @@ use parsing::FlatExWrapper;
|
||||
/// Implements traits that are useful when dealing with Vectors of egui's `Value`
|
||||
pub trait EguiHelper {
|
||||
/// Converts to `egui::plot::Values`
|
||||
fn to_values(self) -> PlotPoints;
|
||||
fn to_values(self) -> PlotPoints<'static>;
|
||||
|
||||
/// Converts to `egui::plot::Line`
|
||||
fn to_line(self) -> Line;
|
||||
fn to_line(self) -> Line<'static>;
|
||||
|
||||
/// Converts to `egui::plot::Points`
|
||||
fn to_points(self) -> Points;
|
||||
fn to_points(self) -> Points<'static>;
|
||||
|
||||
/// Converts Vector of Values into vector of tuples
|
||||
fn to_tuple(self) -> Vec<(f64, f64)>;
|
||||
@ -22,18 +22,18 @@ pub trait EguiHelper {
|
||||
|
||||
impl EguiHelper for Vec<PlotPoint> {
|
||||
#[inline(always)]
|
||||
fn to_values(self) -> PlotPoints {
|
||||
fn to_values(self) -> PlotPoints<'static> {
|
||||
PlotPoints::from(unsafe { std::mem::transmute::<Vec<PlotPoint>, Vec<[f64; 2]>>(self) })
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
fn to_line(self) -> Line {
|
||||
Line::new(self.to_values())
|
||||
fn to_line(self) -> Line<'static> {
|
||||
Line::new("", self.to_values())
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
fn to_points(self) -> Points {
|
||||
Points::new(self.to_values())
|
||||
fn to_points(self) -> Points<'static> {
|
||||
Points::new("", self.to_values())
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
|
||||
@ -56,9 +56,10 @@
|
||||
margin-left: auto;
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 0%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, 0%);
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user