refactoring
This commit is contained in:
parent
06b062b5b4
commit
5d153f4842
20
Cargo.lock
generated
20
Cargo.lock
generated
@ -485,7 +485,7 @@ checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650"
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "eframe"
|
name = "eframe"
|
||||||
version = "0.17.0"
|
version = "0.17.0"
|
||||||
source = "git+https://github.com/Titaniumtown/egui.git#b2fd225aa1e3177e8ec0b5c348f7240b0b7b0be0"
|
source = "git+https://github.com/Titaniumtown/egui.git#01e11a8e5b87aa1d7c35c637315b850b941b5e59"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"egui",
|
"egui",
|
||||||
"egui-winit",
|
"egui-winit",
|
||||||
@ -497,7 +497,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "egui"
|
name = "egui"
|
||||||
version = "0.17.0"
|
version = "0.17.0"
|
||||||
source = "git+https://github.com/Titaniumtown/egui.git#b2fd225aa1e3177e8ec0b5c348f7240b0b7b0be0"
|
source = "git+https://github.com/Titaniumtown/egui.git#01e11a8e5b87aa1d7c35c637315b850b941b5e59"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ahash",
|
"ahash",
|
||||||
"epaint",
|
"epaint",
|
||||||
@ -508,7 +508,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "egui-winit"
|
name = "egui-winit"
|
||||||
version = "0.17.0"
|
version = "0.17.0"
|
||||||
source = "git+https://github.com/Titaniumtown/egui.git#b2fd225aa1e3177e8ec0b5c348f7240b0b7b0be0"
|
source = "git+https://github.com/Titaniumtown/egui.git#01e11a8e5b87aa1d7c35c637315b850b941b5e59"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"arboard",
|
"arboard",
|
||||||
"egui",
|
"egui",
|
||||||
@ -523,7 +523,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "egui_glow"
|
name = "egui_glow"
|
||||||
version = "0.17.0"
|
version = "0.17.0"
|
||||||
source = "git+https://github.com/Titaniumtown/egui.git#b2fd225aa1e3177e8ec0b5c348f7240b0b7b0be0"
|
source = "git+https://github.com/Titaniumtown/egui.git#01e11a8e5b87aa1d7c35c637315b850b941b5e59"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytemuck",
|
"bytemuck",
|
||||||
"egui",
|
"egui",
|
||||||
@ -540,7 +540,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "egui_web"
|
name = "egui_web"
|
||||||
version = "0.17.0"
|
version = "0.17.0"
|
||||||
source = "git+https://github.com/Titaniumtown/egui.git#b2fd225aa1e3177e8ec0b5c348f7240b0b7b0be0"
|
source = "git+https://github.com/Titaniumtown/egui.git#01e11a8e5b87aa1d7c35c637315b850b941b5e59"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytemuck",
|
"bytemuck",
|
||||||
"egui",
|
"egui",
|
||||||
@ -563,7 +563,7 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "emath"
|
name = "emath"
|
||||||
version = "0.17.0"
|
version = "0.17.0"
|
||||||
source = "git+https://github.com/Titaniumtown/egui.git#b2fd225aa1e3177e8ec0b5c348f7240b0b7b0be0"
|
source = "git+https://github.com/Titaniumtown/egui.git#01e11a8e5b87aa1d7c35c637315b850b941b5e59"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytemuck",
|
"bytemuck",
|
||||||
]
|
]
|
||||||
@ -571,7 +571,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "epaint"
|
name = "epaint"
|
||||||
version = "0.17.0"
|
version = "0.17.0"
|
||||||
source = "git+https://github.com/Titaniumtown/egui.git#b2fd225aa1e3177e8ec0b5c348f7240b0b7b0be0"
|
source = "git+https://github.com/Titaniumtown/egui.git#01e11a8e5b87aa1d7c35c637315b850b941b5e59"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ab_glyph",
|
"ab_glyph",
|
||||||
"ahash",
|
"ahash",
|
||||||
@ -585,7 +585,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "epi"
|
name = "epi"
|
||||||
version = "0.17.0"
|
version = "0.17.0"
|
||||||
source = "git+https://github.com/Titaniumtown/egui.git#b2fd225aa1e3177e8ec0b5c348f7240b0b7b0be0"
|
source = "git+https://github.com/Titaniumtown/egui.git#01e11a8e5b87aa1d7c35c637315b850b941b5e59"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"egui",
|
"egui",
|
||||||
"glow",
|
"glow",
|
||||||
@ -1820,9 +1820,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tracing-log"
|
name = "tracing-log"
|
||||||
version = "0.1.2"
|
version = "0.1.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a6923477a48e41c1951f1999ef8bb5a3023eb723ceadafe78ffb65dc366761e3"
|
checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"log",
|
"log",
|
||||||
|
|||||||
@ -23,8 +23,9 @@ strip = true
|
|||||||
|
|
||||||
[profile.dev]
|
[profile.dev]
|
||||||
debug = true
|
debug = true
|
||||||
opt-level = 2
|
opt-level = 0
|
||||||
lto = false
|
lto = true
|
||||||
|
strip = false
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
eframe = { git = "https://github.com/Titaniumtown/egui.git", default-features = false }
|
eframe = { git = "https://github.com/Titaniumtown/egui.git", default-features = false }
|
||||||
|
|||||||
12
build.sh
12
build.sh
@ -18,8 +18,9 @@ if test "$1" == "" || test "$1" == "release"; then
|
|||||||
wasm_opt #apply wasm optimizations
|
wasm_opt #apply wasm optimizations
|
||||||
echo "Binary size (pre-strip): $(du -sb pkg/ytbn_graphing_software_bg.wasm)"
|
echo "Binary size (pre-strip): $(du -sb pkg/ytbn_graphing_software_bg.wasm)"
|
||||||
llvm-strip --strip-all pkg/ytbn_graphing_software_bg.wasm
|
llvm-strip --strip-all pkg/ytbn_graphing_software_bg.wasm
|
||||||
|
|
||||||
elif test "$1" == "debug"; then
|
elif test "$1" == "debug"; then
|
||||||
RUSTFLAGS=--cfg=web_sys_unstable_apis wasm-pack build --target web --debug --no-typescript
|
RUSTFLAGS=--cfg=web_sys_unstable_apis wasm-pack build --target web --dev --no-typescript
|
||||||
else
|
else
|
||||||
echo "ERROR: build.sh, argument invalid"
|
echo "ERROR: build.sh, argument invalid"
|
||||||
exit 1
|
exit 1
|
||||||
@ -27,12 +28,13 @@ fi
|
|||||||
|
|
||||||
mkdir tmp
|
mkdir tmp
|
||||||
cp -r pkg/ytbn_graphing_software_bg.wasm tmp/
|
cp -r pkg/ytbn_graphing_software_bg.wasm tmp/
|
||||||
|
|
||||||
|
sed -i 's/fatal: true/fatal: false/g' pkg/ytbn_graphing_software.js
|
||||||
|
|
||||||
|
sed -i "s/TextEncoder('utf-8')/TextEncoder('utf-8', { ignoreBOM: true, fatal: false })/g" pkg/ytbn_graphing_software.js
|
||||||
|
|
||||||
minify pkg/ytbn_graphing_software.js > tmp/ytbn_graphing_software.js
|
minify pkg/ytbn_graphing_software.js > tmp/ytbn_graphing_software.js
|
||||||
|
|
||||||
sed -i 's/fatal: true/fatal: false/g' tmp/ytbn_graphing_software.js
|
|
||||||
|
|
||||||
sed -i "s/TextEncoder('utf-8')/TextEncoder('utf-8', { ignoreBOM: true, fatal: false })/g" tmp/ytbn_graphing_software.js
|
|
||||||
|
|
||||||
cp www/* tmp/
|
cp www/* tmp/
|
||||||
minify www/index.html > tmp/index.html
|
minify www/index.html > tmp/index.html
|
||||||
minify www/sw.js > tmp/sw.js
|
minify www/sw.js > tmp/sw.js
|
||||||
|
|||||||
2
push.sh
2
push.sh
@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -e #kill script if error occurs
|
set -e #kill script if error occurs
|
||||||
|
|
||||||
cargo test
|
cargo test-all-features
|
||||||
|
|
||||||
bash build.sh
|
bash build.sh
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
use crate::function::Riemann;
|
use crate::function_entry::Riemann;
|
||||||
use std::ops::RangeInclusive;
|
use std::ops::RangeInclusive;
|
||||||
|
|
||||||
use const_format::formatc;
|
use const_format::formatc;
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
#![allow(clippy::too_many_arguments)] // Clippy, shut
|
#![allow(clippy::too_many_arguments)] // Clippy, shut
|
||||||
|
|
||||||
|
use crate::function_handling::parsing::{process_func_str, BackingFunction};
|
||||||
|
use crate::function_handling::suggestions::Hint;
|
||||||
use crate::math_app::AppSettings;
|
use crate::math_app::AppSettings;
|
||||||
use crate::misc::*;
|
use crate::misc::*;
|
||||||
use crate::parsing::{process_func_str, BackingFunction};
|
|
||||||
use crate::suggestions::Hint;
|
|
||||||
use crate::widgets::{widgets_ontop, AutoComplete, Movement};
|
use crate::widgets::{widgets_ontop, AutoComplete, Movement};
|
||||||
use eframe::{egui, emath, epaint};
|
use eframe::{egui, emath, epaint};
|
||||||
use egui::{
|
use egui::{
|
||||||
2
src/function_handling/mod.rs
Normal file
2
src/function_handling/mod.rs
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
pub mod parsing;
|
||||||
|
pub mod suggestions;
|
||||||
@ -235,7 +235,7 @@ pub fn process_func_str(function_in: &str) -> String {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::suggestions::SUPPORTED_FUNCTIONS;
|
use crate::function_handling::suggestions::SUPPORTED_FUNCTIONS;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
/// returns if function with string `func_str` is valid after processing through [`process_func_str`]
|
/// returns if function with string `func_str` is valid after processing through [`process_func_str`]
|
||||||
@ -6,11 +6,10 @@ extern crate static_assertions;
|
|||||||
|
|
||||||
mod autocomplete_helper;
|
mod autocomplete_helper;
|
||||||
mod consts;
|
mod consts;
|
||||||
mod function;
|
mod function_entry;
|
||||||
|
mod function_handling;
|
||||||
mod math_app;
|
mod math_app;
|
||||||
mod misc;
|
mod misc;
|
||||||
mod parsing;
|
|
||||||
mod suggestions;
|
|
||||||
mod widgets;
|
mod widgets;
|
||||||
|
|
||||||
cfg_if::cfg_if! {
|
cfg_if::cfg_if! {
|
||||||
|
|||||||
@ -6,11 +6,10 @@ extern crate static_assertions;
|
|||||||
|
|
||||||
mod autocomplete_helper;
|
mod autocomplete_helper;
|
||||||
mod consts;
|
mod consts;
|
||||||
mod function;
|
mod function_entry;
|
||||||
|
mod function_handling;
|
||||||
mod math_app;
|
mod math_app;
|
||||||
mod misc;
|
mod misc;
|
||||||
mod parsing;
|
|
||||||
mod suggestions;
|
|
||||||
mod widgets;
|
mod widgets;
|
||||||
|
|
||||||
// For running the program natively! (Because why not?)
|
// For running the program natively! (Because why not?)
|
||||||
|
|||||||
370
src/math_app.rs
370
src/math_app.rs
@ -1,5 +1,5 @@
|
|||||||
use crate::consts::*;
|
use crate::consts::*;
|
||||||
use crate::function::{FunctionEntry, Riemann, DEFAULT_FUNCTION_ENTRY};
|
use crate::function_entry::{FunctionEntry, Riemann, DEFAULT_FUNCTION_ENTRY};
|
||||||
use crate::misc::{dyn_mut_iter, option_vec_printer, JsonFileOutput, SerdeValueHelper};
|
use crate::misc::{dyn_mut_iter, option_vec_printer, JsonFileOutput, SerdeValueHelper};
|
||||||
use eframe::{egui, emath, epi};
|
use eframe::{egui, emath, epi};
|
||||||
use egui::{
|
use egui::{
|
||||||
@ -14,221 +14,6 @@ use std::{io::Read, ops::BitXorAssign, str};
|
|||||||
#[cfg(threading)]
|
#[cfg(threading)]
|
||||||
use rayon::iter::{IndexedParallelIterator, ParallelIterator};
|
use rayon::iter::{IndexedParallelIterator, ParallelIterator};
|
||||||
|
|
||||||
// Stores data loaded from files
|
|
||||||
struct Assets {
|
|
||||||
// Stores `FontDefinitions`
|
|
||||||
pub fonts: FontDefinitions,
|
|
||||||
|
|
||||||
// Help blurbs
|
|
||||||
pub text_help_expr: String,
|
|
||||||
pub text_help_vars: String,
|
|
||||||
pub text_help_panel: String,
|
|
||||||
pub text_help_function: String,
|
|
||||||
pub text_help_other: String,
|
|
||||||
pub text_welcome: String,
|
|
||||||
|
|
||||||
// Explanation of license
|
|
||||||
pub text_license_info: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Assets {
|
|
||||||
pub fn new(fonts: FontDefinitions, json: JsonFileOutput) -> Self {
|
|
||||||
Self {
|
|
||||||
fonts,
|
|
||||||
text_help_expr: json.help_expr,
|
|
||||||
text_help_vars: json.help_vars,
|
|
||||||
text_help_panel: json.help_panel,
|
|
||||||
text_help_function: json.help_function,
|
|
||||||
text_help_other: json.help_other,
|
|
||||||
text_license_info: json.license_info,
|
|
||||||
text_welcome: json.welcome_text,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)] // Only used for testing
|
|
||||||
pub fn get_json_file_output(&self) -> JsonFileOutput {
|
|
||||||
JsonFileOutput {
|
|
||||||
help_expr: self.text_help_expr.clone(),
|
|
||||||
help_vars: self.text_help_vars.clone(),
|
|
||||||
help_panel: self.text_help_panel.clone(),
|
|
||||||
help_function: self.text_help_function.clone(),
|
|
||||||
help_other: self.text_help_other.clone(),
|
|
||||||
license_info: self.text_license_info.clone(),
|
|
||||||
welcome_text: self.text_welcome.clone(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
lazy_static::lazy_static! {
|
|
||||||
/// Load all of the data from the compressed tarball
|
|
||||||
static ref ASSETS: Assets = {
|
|
||||||
let start = instant::Instant::now();
|
|
||||||
|
|
||||||
tracing::info!("Loading assets...");
|
|
||||||
let mut tar_file_data = Vec::new();
|
|
||||||
let _ = ruzstd::StreamingDecoder::new(&mut include_bytes!("../assets.tar.zst").as_slice()).expect("failed to decompress assets").read_to_end(&mut tar_file_data).expect("failed to read assets");
|
|
||||||
|
|
||||||
let mut tar_archive = tar::Archive::new(&*tar_file_data);
|
|
||||||
|
|
||||||
// Stores fonts
|
|
||||||
let mut font_ubuntu_light: Option<FontData> = None;
|
|
||||||
let mut font_notoemoji: Option<FontData> = None;
|
|
||||||
let mut font_hack: Option<FontData> = None;
|
|
||||||
let mut font_emoji_icon: Option<FontData> = None;
|
|
||||||
|
|
||||||
// Stores text
|
|
||||||
let mut text_data: Option<JsonFileOutput> = None;
|
|
||||||
|
|
||||||
|
|
||||||
tracing::info!("Reading assets...");
|
|
||||||
// Iterate through all entries in the tarball
|
|
||||||
for file in tar_archive.entries().unwrap() {
|
|
||||||
let mut file = file.unwrap();
|
|
||||||
let mut data: Vec<u8> = Vec::new();
|
|
||||||
file.read_to_end(&mut data).unwrap();
|
|
||||||
let path = file.header().path().unwrap();
|
|
||||||
let path_string = path.to_string_lossy();
|
|
||||||
|
|
||||||
tracing::debug!("Loading file: {}", path_string);
|
|
||||||
|
|
||||||
// Match the file extention
|
|
||||||
if path_string.ends_with(".ttf") {
|
|
||||||
// Parse font files
|
|
||||||
let font_data = FontData::from_owned(data);
|
|
||||||
match path_string.as_ref() {
|
|
||||||
"Hack-Regular.ttf" => {
|
|
||||||
font_hack = Some(font_data);
|
|
||||||
},
|
|
||||||
"NotoEmoji-Regular.ttf" => {
|
|
||||||
font_notoemoji = Some(font_data);
|
|
||||||
},
|
|
||||||
"Ubuntu-Light.ttf" => {
|
|
||||||
font_ubuntu_light = Some(font_data);
|
|
||||||
},
|
|
||||||
"emoji-icon-font.ttf" => {
|
|
||||||
font_emoji_icon = Some(font_data.tweak(
|
|
||||||
egui::FontTweak {
|
|
||||||
scale: 0.8, // make it smaller
|
|
||||||
y_offset_factor: 0.07, // move it down slightly
|
|
||||||
y_offset: 0.0,
|
|
||||||
},
|
|
||||||
))
|
|
||||||
}
|
|
||||||
_ => {
|
|
||||||
panic!("Font File {} not expected!", path_string);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if path_string == "text.json" {
|
|
||||||
text_data = Some(SerdeValueHelper::new(str::from_utf8(&data).expect("unable to read text.json")).parse_values());
|
|
||||||
} else {
|
|
||||||
panic!("File {} not expected!", path_string);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tracing::info!("Done loading assets! Took: {:?}", start.elapsed());
|
|
||||||
|
|
||||||
let font_data: BTreeMap<String, FontData> = BTreeMap::from([
|
|
||||||
("Hack".to_owned(), font_hack.expect("Hack -Regular.ttf not found!")),
|
|
||||||
("Ubuntu-Light".to_owned(), font_ubuntu_light.expect("Ubuntu-Light.ttf not found!")),
|
|
||||||
("NotoEmoji-Regular".to_owned(), font_notoemoji.expect("NotoEmoji-Regular.ttf not found!")),
|
|
||||||
("emoji-icon-font".to_owned(), font_emoji_icon.expect("emoji-icon-font.ttf not found!"))
|
|
||||||
]);
|
|
||||||
|
|
||||||
let families = BTreeMap::from([
|
|
||||||
(FontFamily::Monospace,
|
|
||||||
vec![
|
|
||||||
"Hack".to_owned(),
|
|
||||||
"Ubuntu-Light".to_owned(),
|
|
||||||
"NotoEmoji-Regular".to_owned(),
|
|
||||||
"emoji-icon-font".to_owned(),
|
|
||||||
|
|
||||||
]),
|
|
||||||
(FontFamily::Proportional,
|
|
||||||
vec!["Ubuntu-Light".to_owned(), "NotoEmoji-Regular".to_owned(),
|
|
||||||
"emoji-icon-font".to_owned()])
|
|
||||||
]);
|
|
||||||
|
|
||||||
let fonts = FontDefinitions {
|
|
||||||
font_data,
|
|
||||||
families,
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// Create and return Assets struct
|
|
||||||
Assets::new(
|
|
||||||
fonts, text_data.expect("text.json not found!"))
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Tests to make sure archived (and compressed) assets match expected data
|
|
||||||
#[test]
|
|
||||||
fn test_file_data() {
|
|
||||||
let font_data: BTreeMap<String, FontData> = BTreeMap::from([
|
|
||||||
(
|
|
||||||
"Hack".to_owned(),
|
|
||||||
FontData::from_owned(include_bytes!("../assets/Hack-Regular.ttf").to_vec()),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"Ubuntu-Light".to_owned(),
|
|
||||||
FontData::from_owned(include_bytes!("../assets/Ubuntu-Light.ttf").to_vec()),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"NotoEmoji-Regular".to_owned(),
|
|
||||||
FontData::from_owned(include_bytes!("../assets/NotoEmoji-Regular.ttf").to_vec()),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"emoji-icon-font".to_owned(),
|
|
||||||
FontData::from_owned(include_bytes!("../assets/emoji-icon-font.ttf").to_vec()).tweak(
|
|
||||||
egui::FontTweak {
|
|
||||||
scale: 0.8,
|
|
||||||
y_offset_factor: 0.07,
|
|
||||||
y_offset: 0.0,
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
]);
|
|
||||||
|
|
||||||
let families = BTreeMap::from([
|
|
||||||
(
|
|
||||||
FontFamily::Monospace,
|
|
||||||
vec![
|
|
||||||
"Hack".to_owned(),
|
|
||||||
"Ubuntu-Light".to_owned(),
|
|
||||||
"NotoEmoji-Regular".to_owned(),
|
|
||||||
"emoji-icon-font".to_owned(),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
(
|
|
||||||
FontFamily::Proportional,
|
|
||||||
vec![
|
|
||||||
"Ubuntu-Light".to_owned(),
|
|
||||||
"NotoEmoji-Regular".to_owned(),
|
|
||||||
"emoji-icon-font".to_owned(),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
]);
|
|
||||||
|
|
||||||
let fonts = FontDefinitions {
|
|
||||||
font_data,
|
|
||||||
families,
|
|
||||||
};
|
|
||||||
|
|
||||||
assert_eq!(ASSETS.fonts, fonts);
|
|
||||||
|
|
||||||
let json_data: SerdeValueHelper = SerdeValueHelper::new(include_str!("../assets/text.json"));
|
|
||||||
|
|
||||||
let asset_json = ASSETS.get_json_file_output();
|
|
||||||
let json_data_parsed = json_data.parse_values();
|
|
||||||
|
|
||||||
assert_eq!(asset_json, json_data_parsed);
|
|
||||||
|
|
||||||
// NOTE: UPDATE THIS STRING IF `license_info` IN `text.json` IS MODIFIED
|
|
||||||
let target_license_info = "The AGPL license ensures that the end user, even if not hosting the program itself, is still guaranteed access to the source code of the project in question.";
|
|
||||||
|
|
||||||
assert_eq!(target_license_info, asset_json.license_info);
|
|
||||||
assert_eq!(target_license_info, json_data_parsed.license_info);
|
|
||||||
}
|
|
||||||
|
|
||||||
cfg_if::cfg_if! {
|
cfg_if::cfg_if! {
|
||||||
if #[cfg(target_arch = "wasm32")] {
|
if #[cfg(target_arch = "wasm32")] {
|
||||||
use wasm_bindgen::JsCast;
|
use wasm_bindgen::JsCast;
|
||||||
@ -325,22 +110,12 @@ pub struct MathApp {
|
|||||||
/// Stores opened windows/elements for later reference
|
/// Stores opened windows/elements for later reference
|
||||||
opened: Opened,
|
opened: Opened,
|
||||||
|
|
||||||
|
text: JsonFileOutput,
|
||||||
|
|
||||||
/// Stores settings (pretty self-explanatory)
|
/// Stores settings (pretty self-explanatory)
|
||||||
settings: AppSettings,
|
settings: AppSettings,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for MathApp {
|
|
||||||
fn default() -> Self {
|
|
||||||
Self {
|
|
||||||
functions: vec![DEFAULT_FUNCTION_ENTRY.clone()],
|
|
||||||
last_info: (vec![None], Duration::ZERO),
|
|
||||||
dark_mode: true,
|
|
||||||
opened: Opened::default(),
|
|
||||||
settings: AppSettings::default(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl MathApp {
|
impl MathApp {
|
||||||
#[allow(dead_code)] // This is used lol
|
#[allow(dead_code)] // This is used lol
|
||||||
/// Create new instance of [`MathApp`] and return it
|
/// Create new instance of [`MathApp`] and return it
|
||||||
@ -361,8 +136,128 @@ impl MathApp {
|
|||||||
tracing::info!("Web Info: {:?}", web_info);
|
tracing::info!("Web Info: {:?}", web_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let start = instant::Instant::now();
|
||||||
|
|
||||||
|
tracing::info!("Loading assets...");
|
||||||
|
let mut tar_file_data = Vec::new();
|
||||||
|
let _ = ruzstd::StreamingDecoder::new(&mut include_bytes!("../assets.tar.zst").as_slice())
|
||||||
|
.expect("failed to decompress assets")
|
||||||
|
.read_to_end(&mut tar_file_data)
|
||||||
|
.expect("failed to read assets");
|
||||||
|
|
||||||
|
let mut tar_archive = tar::Archive::new(&*tar_file_data);
|
||||||
|
|
||||||
|
// Stores fonts
|
||||||
|
let mut font_ubuntu_light: Option<FontData> = None;
|
||||||
|
let mut font_notoemoji: Option<FontData> = None;
|
||||||
|
let mut font_hack: Option<FontData> = None;
|
||||||
|
let mut font_emoji_icon: Option<FontData> = None;
|
||||||
|
|
||||||
|
// Stores text
|
||||||
|
let mut text_data: Option<JsonFileOutput> = None;
|
||||||
|
|
||||||
|
tracing::info!("Reading assets...");
|
||||||
|
// Iterate through all entries in the tarball
|
||||||
|
for file in tar_archive.entries().unwrap() {
|
||||||
|
let mut file = file.unwrap();
|
||||||
|
let mut data: Vec<u8> = Vec::new();
|
||||||
|
file.read_to_end(&mut data).unwrap();
|
||||||
|
let path = file.header().path().unwrap();
|
||||||
|
let path_string = path.to_string_lossy();
|
||||||
|
|
||||||
|
tracing::debug!("Loading file: {}", path_string);
|
||||||
|
|
||||||
|
// Match the file extention
|
||||||
|
if path_string.ends_with(".ttf") {
|
||||||
|
// Parse font files
|
||||||
|
let font_data = FontData::from_owned(data);
|
||||||
|
match path_string.as_ref() {
|
||||||
|
"Hack-Regular.ttf" => {
|
||||||
|
font_hack = Some(font_data);
|
||||||
|
}
|
||||||
|
"NotoEmoji-Regular.ttf" => {
|
||||||
|
font_notoemoji = Some(font_data);
|
||||||
|
}
|
||||||
|
"Ubuntu-Light.ttf" => {
|
||||||
|
font_ubuntu_light = Some(font_data);
|
||||||
|
}
|
||||||
|
"emoji-icon-font.ttf" => {
|
||||||
|
font_emoji_icon = Some(font_data.tweak(egui::FontTweak {
|
||||||
|
scale: 0.8, // make it smaller
|
||||||
|
y_offset_factor: 0.07, // move it down slightly
|
||||||
|
y_offset: 0.0,
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
panic!("Font File {} not expected!", path_string);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if path_string == "text.json" {
|
||||||
|
text_data = Some(
|
||||||
|
SerdeValueHelper::new(str::from_utf8(&data).expect("unable to read text.json"))
|
||||||
|
.parse_values(),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
panic!("File {} not expected!", path_string);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let fonts = FontDefinitions {
|
||||||
|
font_data: BTreeMap::from([
|
||||||
|
(
|
||||||
|
"Hack".to_owned(),
|
||||||
|
font_hack.expect("Hack -Regular.ttf not found!"),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"Ubuntu-Light".to_owned(),
|
||||||
|
font_ubuntu_light.expect("Ubuntu-Light.ttf not found!"),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"NotoEmoji-Regular".to_owned(),
|
||||||
|
font_notoemoji.expect("NotoEmoji-Regular.ttf not found!"),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"emoji-icon-font".to_owned(),
|
||||||
|
font_emoji_icon.expect("emoji-icon-font.ttf not found!"),
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
families: BTreeMap::from([
|
||||||
|
(
|
||||||
|
FontFamily::Monospace,
|
||||||
|
vec![
|
||||||
|
"Hack".to_owned(),
|
||||||
|
"Ubuntu-Light".to_owned(),
|
||||||
|
"NotoEmoji-Regular".to_owned(),
|
||||||
|
"emoji-icon-font".to_owned(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
FontFamily::Proportional,
|
||||||
|
vec![
|
||||||
|
"Ubuntu-Light".to_owned(),
|
||||||
|
"NotoEmoji-Regular".to_owned(),
|
||||||
|
"emoji-icon-font".to_owned(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
};
|
||||||
|
|
||||||
|
tracing::info!("Done loading assets! Took: {:?}", start.elapsed());
|
||||||
|
|
||||||
|
// Initialize fonts
|
||||||
|
// this used to be in the `update` method, but (after a ton of digging) this actually caused OOMs. that was a pain to debug
|
||||||
|
cc.egui_ctx.set_fonts(fonts);
|
||||||
|
|
||||||
tracing::info!("egui app initialized.");
|
tracing::info!("egui app initialized.");
|
||||||
Self::default() // initialize `MathApp`
|
|
||||||
|
Self {
|
||||||
|
functions: vec![DEFAULT_FUNCTION_ENTRY.clone()],
|
||||||
|
last_info: (vec![None], Duration::ZERO),
|
||||||
|
dark_mode: true,
|
||||||
|
text: text_data.expect("text.json failed to load"),
|
||||||
|
opened: Opened::default(),
|
||||||
|
settings: AppSettings::default(),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates SidePanel which contains configuration options
|
/// Creates SidePanel which contains configuration options
|
||||||
@ -477,7 +372,7 @@ impl MathApp {
|
|||||||
ui.label(
|
ui.label(
|
||||||
RichText::new("(and licensed under AGPLv3)").color(Color32::LIGHT_GRAY),
|
RichText::new("(and licensed under AGPLv3)").color(Color32::LIGHT_GRAY),
|
||||||
)
|
)
|
||||||
.on_hover_text(&ASSETS.text_license_info);
|
.on_hover_text(&self.text.license_info);
|
||||||
|
|
||||||
// Hyperlink to project's github
|
// Hyperlink to project's github
|
||||||
ui.hyperlink_to(
|
ui.hyperlink_to(
|
||||||
@ -509,9 +404,6 @@ impl epi::App for MathApp {
|
|||||||
.bitxor_assign(ctx.input_mut().consume_key(egui::Modifiers::NONE, Key::H));
|
.bitxor_assign(ctx.input_mut().consume_key(egui::Modifiers::NONE, Key::H));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize fonts
|
|
||||||
ctx.set_fonts(ASSETS.fonts.clone());
|
|
||||||
|
|
||||||
// Creates Top bar that contains some general options
|
// Creates Top bar that contains some general options
|
||||||
TopBottomPanel::top("top_bar").show(ctx, |ui| {
|
TopBottomPanel::top("top_bar").show(ctx, |ui| {
|
||||||
ui.horizontal(|ui| {
|
ui.horizontal(|ui| {
|
||||||
@ -589,23 +481,23 @@ impl epi::App for MathApp {
|
|||||||
ui.heading("Help With...");
|
ui.heading("Help With...");
|
||||||
|
|
||||||
ui.collapsing("Supported Expressions", |ui| {
|
ui.collapsing("Supported Expressions", |ui| {
|
||||||
ui.label(&ASSETS.text_help_expr);
|
ui.label(&self.text.help_expr);
|
||||||
});
|
});
|
||||||
|
|
||||||
ui.collapsing("Supported Constants", |ui| {
|
ui.collapsing("Supported Constants", |ui| {
|
||||||
ui.label(&ASSETS.text_help_vars);
|
ui.label(&self.text.help_vars);
|
||||||
});
|
});
|
||||||
|
|
||||||
ui.collapsing("Panel", |ui| {
|
ui.collapsing("Panel", |ui| {
|
||||||
ui.label(&ASSETS.text_help_panel);
|
ui.label(&self.text.help_panel);
|
||||||
});
|
});
|
||||||
|
|
||||||
ui.collapsing("Functions", |ui| {
|
ui.collapsing("Functions", |ui| {
|
||||||
ui.label(&ASSETS.text_help_function);
|
ui.label(&self.text.help_function);
|
||||||
});
|
});
|
||||||
|
|
||||||
ui.collapsing("Other", |ui| {
|
ui.collapsing("Other", |ui| {
|
||||||
ui.label(&ASSETS.text_help_other);
|
ui.label(&self.text.help_other);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -616,7 +508,7 @@ impl epi::App for MathApp {
|
|||||||
.resizable(false)
|
.resizable(false)
|
||||||
.collapsible(false)
|
.collapsible(false)
|
||||||
.show(ctx, |ui| {
|
.show(ctx, |ui| {
|
||||||
ui.label(&*ASSETS.text_welcome);
|
ui.label(&self.text.welcome);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Window with information about the build and current commit
|
// Window with information about the build and current commit
|
||||||
|
|||||||
@ -189,7 +189,7 @@ pub struct JsonFileOutput {
|
|||||||
pub help_function: String,
|
pub help_function: String,
|
||||||
pub help_other: String,
|
pub help_other: String,
|
||||||
pub license_info: String,
|
pub license_info: String,
|
||||||
pub welcome_text: String,
|
pub welcome: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Helps parsing text data from `text.json`
|
/// Helps parsing text data from `text.json`
|
||||||
@ -228,7 +228,7 @@ impl SerdeValueHelper {
|
|||||||
help_function: self.parse_multiline("help_function"),
|
help_function: self.parse_multiline("help_function"),
|
||||||
help_other: self.parse_multiline("help_other"),
|
help_other: self.parse_multiline("help_other"),
|
||||||
license_info: self.parse_singleline("license_info"),
|
license_info: self.parse_singleline("license_info"),
|
||||||
welcome_text: self.parse_multiline("welcome"),
|
welcome: self.parse_multiline("welcome"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
use crate::suggestions::{generate_hint, Hint};
|
use crate::function_handling::suggestions::{self, generate_hint, Hint};
|
||||||
|
|
||||||
use eframe::{egui, epaint};
|
use eframe::{egui, epaint};
|
||||||
use egui::{text::CCursor, text_edit::CursorRange, TextEdit};
|
use egui::{text::CCursor, text_edit::CursorRange, TextEdit};
|
||||||
@ -27,7 +27,7 @@ impl<'a> Default for AutoComplete<'a> {
|
|||||||
fn default() -> AutoComplete<'a> {
|
fn default() -> AutoComplete<'a> {
|
||||||
AutoComplete {
|
AutoComplete {
|
||||||
i: 0,
|
i: 0,
|
||||||
hint: &crate::suggestions::HINT_EMPTY,
|
hint: &suggestions::HINT_EMPTY,
|
||||||
string: String::new(),
|
string: String::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user