Compare commits

..

No commits in common. "7f9a962ff7ef9643825e03d7a6851cd0918b6036" and "a21fc048ad7fd54947ee62c3d8e2d5c4371121dd" have entirely different histories.

10 changed files with 453 additions and 575 deletions

862
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -33,17 +33,17 @@ strip = false
[dependencies] [dependencies]
parsing = { path = "./parsing" } parsing = { path = "./parsing" }
eframe = { git = "https://github.com/titaniumtown/egui.git", default-features = false, features = [ eframe = { git = "https://github.com/titaniumtown/egui.git", rev = "b088efb9fa917845ecb54729a0d2fc592d2399e7", default-features = false, features = [
"glow", "glow",
] } ] }
egui = { git = "https://github.com/titaniumtown/egui.git", default-features = false, features = [ egui = { git = "https://github.com/titaniumtown/egui.git", rev = "b088efb9fa917845ecb54729a0d2fc592d2399e7", default-features = false, features = [
"serde", "serde",
] } ] }
epaint = { git = "https://github.com/titaniumtown/egui.git", default-features = false , features = [ epaint = { git = "https://github.com/titaniumtown/egui.git", rev = "b088efb9fa917845ecb54729a0d2fc592d2399e7", default-features = false , features = [
"bytemuck", "bytemuck",
] } ] }
emath = { git = "https://github.com/titaniumtown/egui.git", default-features = false } emath = { git = "https://github.com/titaniumtown/egui.git", rev = "b088efb9fa917845ecb54729a0d2fc592d2399e7", default-features = false }
egui_plot = { git = "https://github.com/emilk/egui_plot.git", default-features = false } egui_plot = { git = "https://github.com/titaniumtown/egui.git", rev = "b088efb9fa917845ecb54729a0d2fc592d2399e7", default-features = false }
@ -63,10 +63,10 @@ benchmarks = { path = "./benchmarks" }
[build-dependencies] [build-dependencies]
shadow-rs = "0.12" shadow-rs = "0.12"
epaint = { git = "https://github.com/titaniumtown/egui.git", default-features = false, features = [ epaint = { git = "https://github.com/titaniumtown/egui.git", rev = "b088efb9fa917845ecb54729a0d2fc592d2399e7", default-features = false, features = [
"bytemuck", "bytemuck",
] } ] }
egui = { git = "https://github.com/titaniumtown/egui.git", default-features = false, features = [ egui = { git = "https://github.com/titaniumtown/egui.git", rev = "b088efb9fa917845ecb54729a0d2fc592d2399e7", default-features = false, features = [
"serde", "serde",
] } ] }
bincode = "1.3" bincode = "1.3"
@ -94,22 +94,3 @@ wasm-bindgen-futures = "=0.4.54"
[package.metadata.cargo-all-features] [package.metadata.cargo-all-features]
skip_optional_dependencies = true #don't test optional dependencies, only 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" }

View File

@ -4,12 +4,11 @@ use std::{
fs::File, fs::File,
io::{BufWriter, Write}, io::{BufWriter, Write},
path::Path, path::Path,
sync::Arc,
}; };
use epaint::{ use epaint::{
text::{FontData, FontDefinitions, FontTweak},
FontFamily, FontFamily,
text::{FontData, FontDefinitions, FontTweak},
}; };
use run_script::ScriptOptions; use run_script::ScriptOptions;
@ -105,38 +104,37 @@ fn main() {
font_data: BTreeMap::from([ font_data: BTreeMap::from([
( (
"Ubuntu-Light".to_owned(), "Ubuntu-Light".to_owned(),
Arc::new(FontData::from_owned( FontData::from_owned(
font_stripper( font_stripper(
"Ubuntu-Light.ttf", "Ubuntu-Light.ttf",
"ubuntu-light.ttf", "ubuntu-light.ttf",
[main_chars, vec!['∫']].concat(), [main_chars, vec!['∫']].concat(),
) )
.unwrap(), .unwrap(),
)), ),
), ),
( (
"NotoEmoji-Regular".to_owned(), "NotoEmoji-Regular".to_owned(),
Arc::new(FontData::from_owned( FontData::from_owned(
font_stripper( font_stripper(
"NotoEmoji-Regular.ttf", "NotoEmoji-Regular.ttf",
"noto-emoji.ttf", "noto-emoji.ttf",
vec!['🌞', '🌙', '✖'], vec!['🌞', '🌙', '✖'],
) )
.unwrap(), .unwrap(),
)), ),
), ),
( (
"emoji-icon-font".to_owned(), "emoji-icon-font".to_owned(),
Arc::new( FontData::from_owned(
FontData::from_owned( font_stripper("emoji-icon-font.ttf", "emoji-icon.ttf", vec!['⚙']).unwrap(),
font_stripper("emoji-icon-font.ttf", "emoji-icon.ttf", vec!['⚙']).unwrap(), )
) .tweak(FontTweak {
.tweak(FontTweak { scale: 0.8,
scale: 0.8, y_offset_factor: 0.07,
y_offset_factor: 0.07, y_offset: 0.0,
y_offset: -0.0333, baseline_offset_factor: -0.0333,
}), }),
),
), ),
]), ]),
families: BTreeMap::from([ families: BTreeMap::from([

View File

@ -45,8 +45,7 @@
cargoLock = { cargoLock = {
lockFile = ./Cargo.lock; lockFile = ./Cargo.lock;
outputHashes = { outputHashes = {
"ecolor-0.33.2" = "sha256-jdQK55yKZptadwosrJXIhoQDGNeELQmPExWRsGc0VG0="; "ecolor-0.25.0" = "sha256-9s5LCngwvIIL43txT6sBs4JlRXqmYt1Kw8hlDnwx+DI=";
"egui_plot-0.34.0" = "sha256-CfqrpAnLNcB3StuZ9YSDTWih8OUVEa9SJi9RwS1i4ok=";
}; };
}; };

View File

@ -449,7 +449,7 @@ impl FunctionEntry {
Some(integral_data) => { Some(integral_data) => {
if integral_step > step { if integral_step > step {
plot_ui.bar_chart( plot_ui.bar_chart(
BarChart::new("integral bar chart", integral_data.0.clone()) BarChart::new(integral_data.0.clone())
.color(Color32::BLUE) .color(Color32::BLUE)
.width(integral_step), .width(integral_step),
); );

View File

@ -1,7 +1,7 @@
use crate::{ use crate::{
consts::COLORS, function_entry::FunctionEntry, misc::random_u64, widgets::widgets_ontop, consts::COLORS, function_entry::FunctionEntry, misc::random_u64, widgets::widgets_ontop,
}; };
use egui::{Button, Id, Key, Modifiers, PopupCloseBehavior, TextEdit, WidgetText}; use egui::{Button, Id, Key, Modifiers, TextEdit, WidgetText};
use emath::vec2; use emath::vec2;
use parsing::Movement; use parsing::Movement;
use serde::ser::SerializeStruct; use serde::ser::SerializeStruct;
@ -147,23 +147,17 @@ impl FunctionManager {
let autocomplete_popup_id = Id::new("autocomplete popup"); let autocomplete_popup_id = Id::new("autocomplete popup");
egui::popup_below_widget( egui::popup_below_widget(ui, autocomplete_popup_id, &re, |ui| {
ui, hints.iter().enumerate().for_each(|(i, candidate)| {
autocomplete_popup_id, if ui
&re, .selectable_label(i == function.autocomplete.i, *candidate)
PopupCloseBehavior::CloseOnClickOutside, .clicked()
|ui| { {
hints.iter().enumerate().for_each(|(i, candidate)| { clicked = true;
if ui function.autocomplete.i = i;
.selectable_label(i == function.autocomplete.i, *candidate) }
.clicked() });
{ });
clicked = true;
function.autocomplete.i = i;
}
});
},
);
if clicked { if clicked {
function function
@ -178,14 +172,10 @@ impl FunctionManager {
// Push cursor to end if needed // Push cursor to end if needed
if movement == Movement::Complete { if movement == Movement::Complete {
// TODO! proper error handling
let mut state = let mut state =
unsafe { TextEdit::load_state(ui.ctx(), te_id).unwrap_unchecked() }; unsafe { TextEdit::load_state(ui.ctx(), te_id).unwrap_unchecked() };
let ccursor = egui::text::CCursor::new(function.autocomplete.string.len()); let ccursor = egui::text::CCursor::new(function.autocomplete.string.len());
state state.set_ccursor_range(Some(egui::text::CCursorRange::one(ccursor)));
.cursor
.set_char_range(Some(egui::text::CCursorRange::one(ccursor)));
TextEdit::store_state(ui.ctx(), te_id, state); TextEdit::store_state(ui.ctx(), te_id, state);
} }
} }

View File

@ -22,7 +22,6 @@ pub use crate::{
cfg_if::cfg_if! { cfg_if::cfg_if! {
if #[cfg(target_arch = "wasm32")] { if #[cfg(target_arch = "wasm32")] {
use wasm_bindgen::prelude::*; use wasm_bindgen::prelude::*;
use web_sys::HtmlCanvasElement;
use lol_alloc::{FreeListAllocator, LockedAllocator}; use lol_alloc::{FreeListAllocator, LockedAllocator};
#[global_allocator] #[global_allocator]
@ -50,28 +49,26 @@ cfg_if::cfg_if! {
} }
} }
/// Call this once from JavaScript to start your app. /// Call this once from JavaScript to start your app.
#[wasm_bindgen] #[wasm_bindgen]
pub async fn start(&self, canvas_id: HtmlCanvasElement) -> Result<(), wasm_bindgen::JsValue> { pub async fn start(&self, canvas_id: &str) -> Result<(), wasm_bindgen::JsValue> {
self.runner self.runner
.start( .start(
canvas_id, canvas_id,
eframe::WebOptions::default(), eframe::WebOptions::default(),
Box::new(|cc| Ok(Box::new(math_app::MathApp::new(cc)))), Box::new(|cc| Box::new(math_app::MathApp::new(cc))),
) )
.await .await
} }
} }
#[wasm_bindgen(start)] #[wasm_bindgen(start)]
pub async fn start() { pub async fn start() {
tracing::info!("Starting..."); 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(); let web_handle = WebHandle::new();
web_handle.start(canvas).await.unwrap() web_handle.start("canvas").await.unwrap()
} }
} }
} }

View File

@ -6,13 +6,13 @@ use crate::{
}; };
use eframe::App; use eframe::App;
use egui::{ use egui::{
Button, CentralPanel, Color32, ComboBox, Context, CornerRadius, DragValue, Frame, Key, Layout, Button, CentralPanel, Color32, ComboBox, Context, DragValue, Frame, Key, Layout, SidePanel,
SidePanel, TopBottomPanel, Ui, Vec2, Window, TopBottomPanel, Ui, Vec2, Window, style::Margin,
}; };
use egui_plot::Plot; use egui_plot::Plot;
use emath::{Align, Align2}; use emath::{Align, Align2};
use epaint::{Margin, Rounding}; use epaint::Rounding;
use instant::Instant; use instant::Instant;
use itertools::Itertools; use itertools::Itertools;
use std::{io::Read, ops::BitXorAssign}; 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) // Central panel which contains the central plot (or an error created when parsing)
CentralPanel::default() CentralPanel::default()
.frame(Frame { .frame(Frame {
inner_margin: Margin::ZERO, inner_margin: Margin::symmetric(0.0, 0.0),
corner_radius: CornerRadius::ZERO, rounding: Rounding::ZERO,
// fill: crate::style::STYLE.window_fill(), // fill: crate::style::STYLE.window_fill(),
fill: Color32::from_gray(27), fill: Color32::from_gray(27),
..Frame::NONE ..Frame::none()
}) })
.show(ctx, |ui| { .show(ctx, |ui| {
// Display an error if it exists // Display an error if it exists

View File

@ -8,13 +8,13 @@ use parsing::FlatExWrapper;
/// Implements traits that are useful when dealing with Vectors of egui's `Value` /// Implements traits that are useful when dealing with Vectors of egui's `Value`
pub trait EguiHelper { pub trait EguiHelper {
/// Converts to `egui::plot::Values` /// Converts to `egui::plot::Values`
fn to_values(self) -> PlotPoints<'static>; fn to_values(self) -> PlotPoints;
/// Converts to `egui::plot::Line` /// Converts to `egui::plot::Line`
fn to_line(self) -> Line<'static>; fn to_line(self) -> Line;
/// Converts to `egui::plot::Points` /// Converts to `egui::plot::Points`
fn to_points(self) -> Points<'static>; fn to_points(self) -> Points;
/// Converts Vector of Values into vector of tuples /// Converts Vector of Values into vector of tuples
fn to_tuple(self) -> Vec<(f64, f64)>; fn to_tuple(self) -> Vec<(f64, f64)>;
@ -22,18 +22,18 @@ pub trait EguiHelper {
impl EguiHelper for Vec<PlotPoint> { impl EguiHelper for Vec<PlotPoint> {
#[inline(always)] #[inline(always)]
fn to_values(self) -> PlotPoints<'static> { fn to_values(self) -> PlotPoints {
PlotPoints::from(unsafe { std::mem::transmute::<Vec<PlotPoint>, Vec<[f64; 2]>>(self) }) PlotPoints::from(unsafe { std::mem::transmute::<Vec<PlotPoint>, Vec<[f64; 2]>>(self) })
} }
#[inline(always)] #[inline(always)]
fn to_line(self) -> Line<'static> { fn to_line(self) -> Line {
Line::new("", self.to_values()) Line::new(self.to_values())
} }
#[inline(always)] #[inline(always)]
fn to_points(self) -> Points<'static> { fn to_points(self) -> Points {
Points::new("", self.to_values()) Points::new(self.to_values())
} }
#[inline(always)] #[inline(always)]

View File

@ -56,10 +56,9 @@
margin-left: auto; margin-left: auto;
display: block; display: block;
position: absolute; position: absolute;
top: 0; top: 0%;
left: 0; left: 50%;
width: 100%; transform: translate(-50%, 0%);
height: 100%;
} }
</style> </style>
</head> </head>