mirror of
https://github.com/emilk/egui.git
synced 2026-06-28 07:23:13 -04:00
* Update to ehttp 0.3.1 with better error messages
* Explain why we are using an old cocoa
* cargo update
❯ cargo update
Updating crates.io index
Updating accesskit v0.11.0 -> v0.11.2
Updating accesskit_consumer v0.15.0 -> v0.15.2
Updating accesskit_macos v0.7.0 -> v0.9.0
Updating accesskit_unix v0.5.0 -> v0.5.2
Updating accesskit_windows v0.14.0 -> v0.14.3
Updating accesskit_winit v0.14.0 -> v0.14.4
Updating addr2line v0.19.0 -> v0.21.0
Removing ahash v0.7.6
Updating aho-corasick v1.0.1 -> v1.1.1
Adding allocator-api2 v0.2.16
Updating android-activity v0.4.1 -> v0.4.3
Adding android-tzdata v0.1.1
Updating anyhow v1.0.71 -> v1.0.75
Updating arboard v3.2.0 -> v3.2.1
Updating arrayvec v0.7.2 -> v0.7.4
Updating async-channel v1.8.0 -> v1.9.0
Updating async-executor v1.5.1 -> v1.5.3
Adding async-fs v1.6.0
Updating async-lock v2.7.0 -> v2.8.0
Adding async-process v1.8.0
Updating async-recursion v1.0.4 -> v1.0.5
Adding async-signal v0.2.1
Updating async-task v4.4.0 -> v4.4.1
Updating async-trait v0.1.68 -> v0.1.73
Adding atomic-waker v1.1.2
Updating backtrace v0.3.67 -> v0.3.69
Adding base64 v0.21.4
Updating bindgen v0.65.1 -> v0.68.1
Updating bitflags v2.3.1 -> v2.4.0
Adding blocking v1.4.0
Updating bumpalo v3.13.0 -> v3.14.0
Updating bytemuck v1.13.1 -> v1.14.0
Updating bytemuck_derive v1.4.1 -> v1.5.0
Updating bytes v1.4.0 -> v1.5.0
Updating calloop v0.10.5 -> v0.10.6
Updating cc v1.0.79 -> v1.0.83
Updating cfg-expr v0.15.1 -> v0.15.5
Updating chrono v0.4.24 -> v0.4.31
Updating cocoa-foundation v0.1.1 -> v0.1.2
Updating concurrent-queue v2.2.0 -> v2.3.0
Updating core-graphics-types v0.1.1 -> v0.1.2
Updating cpufeatures v0.2.7 -> v0.2.9
Updating crossbeam-utils v0.8.15 -> v0.8.16
Adding deranged v0.3.8
Removing dirs v4.0.0
Removing dirs-sys v0.3.7
Updating dlib v0.5.0 -> v0.5.2
Updating dyn-clone v1.0.11 -> v1.0.14
Updating either v1.8.1 -> v1.9.0
Updating enum-map v2.5.0 -> v2.6.3
Updating enum-map-derive v0.11.0 -> v0.14.0
Updating enumflags2 v0.7.7 -> v0.7.8
Updating enumflags2_derive v0.7.7 -> v0.7.8
Updating enumn v0.1.8 -> v0.1.12
Adding equivalent v1.0.1
Updating errno v0.3.1 -> v0.3.3
Adding event-listener v3.0.0
Updating fancy-regex v0.7.1 -> v0.11.0
Adding fastrand v2.0.1
Adding fdeflate v0.3.0
Updating flate2 v1.0.25 -> v1.0.27
Updating form_urlencoded v1.1.0 -> v1.2.0
Updating getrandom v0.2.9 -> v0.2.10
Updating gimli v0.27.2 -> v0.28.0
Updating glutin v0.30.8 -> v0.30.10
Updating glutin_egl_sys v0.5.0 -> v0.5.1
Updating gpu-descriptor v0.2.3 -> v0.2.4
Updating gpu-descriptor-types v0.1.1 -> v0.1.2
Adding hashbrown v0.14.0
Updating hermit-abi v0.3.1 -> v0.3.3
Updating iana-time-zone v0.1.56 -> v0.1.57
Updating idna v0.3.0 -> v0.4.0
Updating image v0.24.6 -> v0.24.7
Adding indexmap v2.0.0
Updating io-lifetimes v1.0.10 -> v1.0.11
Updating is-terminal v0.4.7 -> v0.4.9
Updating itoa v1.0.6 -> v1.0.9
Updating libc v0.2.144 -> v0.2.148
Adding linux-raw-sys v0.4.7
Updating lock_api v0.4.9 -> v0.4.10
Updating log v0.4.17 -> v0.4.20
Updating memchr v2.5.0 -> v2.6.3
Adding memoffset v0.7.1
Updating miniz_oxide v0.6.2 -> v0.7.1
Updating mio v0.8.6 -> v0.8.8
Adding nix v0.26.4
Updating num-traits v0.2.15 -> v0.2.16
Adding num_enum v0.6.1
Adding num_enum_derive v0.6.1
Updating object v0.30.3 -> v0.32.1
Updating once_cell v1.17.1 -> v1.18.0
Updating orbclient v0.3.45 -> v0.3.46
Updating os_str_bytes v6.5.0 -> v6.5.1
Updating parking v2.1.0 -> v2.1.1
Updating parking_lot_core v0.9.7 -> v0.9.8
Updating paste v1.0.12 -> v1.0.14
Updating percent-encoding v2.2.0 -> v2.3.0
Updating pin-project-lite v0.2.9 -> v0.2.13
Adding piper v0.2.1
Updating plist v1.4.0 -> v1.5.0
Updating png v0.17.7 -> v0.17.10
Updating prettyplease v0.2.5 -> v0.2.15
Updating proc-macro2 v1.0.58 -> v1.0.67
Updating profiling v1.0.8 -> v1.0.11
Updating quick-xml v0.26.0 -> v0.29.0
Updating quote v1.0.27 -> v1.0.33
Updating regex v1.8.2 -> v1.9.5
Adding regex-automata v0.3.8
Removing regex-syntax v0.6.29
Removing regex-syntax v0.7.2
Adding regex-syntax v0.7.5
Updating ron v0.8.0 -> v0.8.1
Removing rustix v0.37.19
Adding rustix v0.37.23
Adding rustix v0.38.14
Updating rustls v0.20.8 -> v0.21.7
Adding rustls-webpki v0.100.3
Adding rustls-webpki v0.101.6
Updating ryu v1.0.13 -> v1.0.15
Updating scopeguard v1.1.0 -> v1.2.0
Updating serde v1.0.163 -> v1.0.188
Updating serde_derive v1.0.163 -> v1.0.188
Updating serde_json v1.0.96 -> v1.0.107
Updating serde_repr v0.1.12 -> v0.1.16
Updating serde_spanned v0.6.2 -> v0.6.3
Updating sha1 v0.10.5 -> v0.10.6
Updating shlex v1.1.0 -> v1.2.0
Adding signal-hook-registry v1.4.1
Adding simd-adler32 v0.3.7
Updating siphasher v0.3.10 -> v0.3.11
Updating slab v0.4.8 -> v0.4.9
Updating smallvec v1.10.0 -> v1.11.1
Updating smithay-client-toolkit v0.16.0 -> v0.16.1
Updating strict-num v0.1.0 -> v0.1.1
Updating syn v2.0.16 -> v2.0.37
Updating syntect v5.0.0 -> v5.1.0
Updating system-deps v6.1.0 -> v6.1.1
Updating target-lexicon v0.12.7 -> v0.12.11
Updating tempfile v3.5.0 -> v3.8.0
Updating termcolor v1.2.0 -> v1.3.0
Updating thiserror v1.0.40 -> v1.0.49
Updating thiserror-impl v1.0.40 -> v1.0.49
Removing time v0.1.45
Removing time v0.3.21
Adding time v0.3.29
Updating time-core v0.1.1 -> v0.1.2
Updating time-macros v0.2.9 -> v0.2.15
Updating toml v0.7.4 -> v0.7.8
Updating toml_datetime v0.6.2 -> v0.6.3
Updating toml_edit v0.19.9 -> v0.19.15
Updating tracing-attributes v0.1.24 -> v0.1.26
Updating ttf-parser v0.19.0 -> v0.19.2
Updating tts v0.25.5 -> v0.25.6
Updating typenum v1.16.0 -> v1.17.0
Updating unicode-ident v1.0.8 -> v1.0.12
Updating unicode-width v0.1.10 -> v0.1.11
Updating ureq v2.6.2 -> v2.7.1
Updating url v2.3.1 -> v2.4.1
Updating waker-fn v1.1.0 -> v1.1.1
Updating walkdir v2.3.3 -> v2.4.0
Removing wasi v0.10.0+wasi-snapshot-preview1
Updating wasm-bindgen-futures v0.4.36 -> v0.4.37
Updating webbrowser v0.8.10 -> v0.8.11
Removing webpki v0.22.1
Updating webpki-roots v0.22.6 -> v0.23.1
Updating which v4.4.0 -> v4.4.2
Updating winapi-util v0.1.5 -> v0.1.6
Adding windows v0.51.1
Adding windows-core v0.51.1
Updating windows-implement v0.44.0 -> v0.48.0
Updating windows-interface v0.44.0 -> v0.48.0
Updating windows-targets v0.48.0 -> v0.48.5
Updating windows_aarch64_gnullvm v0.48.0 -> v0.48.5
Updating windows_aarch64_msvc v0.48.0 -> v0.48.5
Updating windows_i686_gnu v0.48.0 -> v0.48.5
Updating windows_i686_msvc v0.48.0 -> v0.48.5
Updating windows_x86_64_gnu v0.48.0 -> v0.48.5
Updating windows_x86_64_gnullvm v0.48.0 -> v0.48.5
Updating windows_x86_64_msvc v0.48.0 -> v0.48.5
Updating winnow v0.4.6 -> v0.5.15
Adding xdg-home v1.0.0
Updating xml-rs v0.8.15 -> v0.8.19
Updating zbus v3.10.0 -> v3.14.1
Updating zbus_macros v3.10.0 -> v3.14.1
Updating zbus_names v2.5.1 -> v2.6.0
Updating zvariant v3.14.0 -> v3.15.0
Updating zvariant_derive v3.14.0 -> v3.15.0
❯ cargo update -p ureq --precise 2.6.2
Updating crates.io index
Downgrading rustls v0.21.7 -> v0.20.9
Removing rustls-webpki v0.100.3
Removing rustls-webpki v0.101.6
Downgrading ureq v2.7.1 -> v2.6.2
Adding webpki v0.22.1
Downgrading webpki-roots v0.23.1 -> v0.22.6
❯ cargo update -p plist --precise 1.4.0
Updating crates.io index
Downgrading plist v1.5.0 -> v1.4.0
Downgrading quick-xml v0.29.0 -> v0.26.0
❯ cargo update -p ron --precise 0.8.0
Updating crates.io index
Removing base64 v0.21.4
Downgrading ron v0.8.1 -> v0.8.0
* Remove unnecessary mut
* Silence over-eager clippy
* Add misisng `'static` lifetime to `run_simple_native`
* ❯ cargo update -p android-activity --precise 0.4.1
Updating crates.io index
Downgrading android-activity v0.4.2 -> v0.4.1
Removing num_enum v0.6.1
Removing num_enum_derive v0.6.1
354 lines
11 KiB
Rust
354 lines
11 KiB
Rust
//! eframe - the [`egui`] framework crate
|
|
//!
|
|
//! If you are planning to write an app for web or native,
|
|
//! and want to use [`egui`] for everything, then `eframe` is for you!
|
|
//!
|
|
//! To get started, see the [examples](https://github.com/emilk/egui/tree/master/examples).
|
|
//! To learn how to set up `eframe` for web and native, go to <https://github.com/emilk/eframe_template/> and follow the instructions there!
|
|
//!
|
|
//! In short, you implement [`App`] (especially [`App::update`]) and then
|
|
//! call [`crate::run_native`] from your `main.rs`, and/or use `eframe::WebRunner` from your `lib.rs`.
|
|
//!
|
|
//! ## Usage, native:
|
|
//! ``` no_run
|
|
//! use eframe::egui;
|
|
//!
|
|
//! fn main() {
|
|
//! let native_options = eframe::NativeOptions::default();
|
|
//! eframe::run_native("My egui App", native_options, Box::new(|cc| Box::new(MyEguiApp::new(cc))));
|
|
//! }
|
|
//!
|
|
//! #[derive(Default)]
|
|
//! struct MyEguiApp {}
|
|
//!
|
|
//! impl MyEguiApp {
|
|
//! fn new(cc: &eframe::CreationContext<'_>) -> Self {
|
|
//! // Customize egui here with cc.egui_ctx.set_fonts and cc.egui_ctx.set_visuals.
|
|
//! // Restore app state using cc.storage (requires the "persistence" feature).
|
|
//! // Use the cc.gl (a glow::Context) to create graphics shaders and buffers that you can use
|
|
//! // for e.g. egui::PaintCallback.
|
|
//! Self::default()
|
|
//! }
|
|
//! }
|
|
//!
|
|
//! impl eframe::App for MyEguiApp {
|
|
//! fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) {
|
|
//! egui::CentralPanel::default().show(ctx, |ui| {
|
|
//! ui.heading("Hello World!");
|
|
//! });
|
|
//! }
|
|
//! }
|
|
//! ```
|
|
//!
|
|
//! ## Usage, web:
|
|
//! ``` no_run
|
|
//! # #[cfg(target_arch = "wasm32")]
|
|
//! use wasm_bindgen::prelude::*;
|
|
//!
|
|
//! /// Your handle to the web app from JavaScript.
|
|
//! # #[cfg(target_arch = "wasm32")]
|
|
//! #[derive(Clone)]
|
|
//! #[wasm_bindgen]
|
|
//! pub struct WebHandle {
|
|
//! runner: eframe::WebRunner,
|
|
//! }
|
|
//!
|
|
//! # #[cfg(target_arch = "wasm32")]
|
|
//! #[wasm_bindgen]
|
|
//! impl WebHandle {
|
|
//! /// Installs a panic hook, then returns.
|
|
//! #[allow(clippy::new_without_default)]
|
|
//! #[wasm_bindgen(constructor)]
|
|
//! pub fn new() -> Self {
|
|
//! // Redirect [`log`] message to `console.log` and friends:
|
|
//! eframe::WebLogger::init(log::LevelFilter::Debug).ok();
|
|
//!
|
|
//! Self {
|
|
//! runner: eframe::WebRunner::new(),
|
|
//! }
|
|
//! }
|
|
//!
|
|
//! /// Call this once from JavaScript to start your app.
|
|
//! #[wasm_bindgen]
|
|
//! pub async fn start(&self, canvas_id: &str) -> Result<(), wasm_bindgen::JsValue> {
|
|
//! self.runner
|
|
//! .start(
|
|
//! canvas_id,
|
|
//! eframe::WebOptions::default(),
|
|
//! Box::new(|cc| Box::new(MyEguiApp::new(cc))),
|
|
//! )
|
|
//! .await
|
|
//! }
|
|
//!
|
|
//! // The following are optional:
|
|
//!
|
|
//! /// Shut down eframe and clean up resources.
|
|
//! #[wasm_bindgen]
|
|
//! pub fn destroy(&self) {
|
|
//! self.runner.destroy();
|
|
//! }
|
|
//!
|
|
//! /// Example on how to call into your app from JavaScript.
|
|
//! #[wasm_bindgen]
|
|
//! pub fn example(&self) {
|
|
//! if let Some(app) = self.runner.app_mut::<MyEguiApp>() {
|
|
//! app.example();
|
|
//! }
|
|
//! }
|
|
//!
|
|
//! /// The JavaScript can check whether or not your app has crashed:
|
|
//! #[wasm_bindgen]
|
|
//! pub fn has_panicked(&self) -> bool {
|
|
//! self.runner.has_panicked()
|
|
//! }
|
|
//!
|
|
//! #[wasm_bindgen]
|
|
//! pub fn panic_message(&self) -> Option<String> {
|
|
//! self.runner.panic_summary().map(|s| s.message())
|
|
//! }
|
|
//!
|
|
//! #[wasm_bindgen]
|
|
//! pub fn panic_callstack(&self) -> Option<String> {
|
|
//! self.runner.panic_summary().map(|s| s.callstack())
|
|
//! }
|
|
//! }
|
|
//! ```
|
|
//!
|
|
//! ## Simplified usage
|
|
//! If your app is only for native, and you don't need advanced features like state persistence,
|
|
//! then you can use the simpler function [`run_simple_native`].
|
|
//!
|
|
//! ## Feature flags
|
|
#![cfg_attr(feature = "document-features", doc = document_features::document_features!())]
|
|
//!
|
|
|
|
#![warn(missing_docs)] // let's keep eframe well-documented
|
|
#![allow(clippy::needless_doctest_main)]
|
|
|
|
// Re-export all useful libraries:
|
|
pub use {egui, egui::emath, egui::epaint};
|
|
|
|
#[cfg(feature = "glow")]
|
|
pub use {egui_glow, glow};
|
|
|
|
#[cfg(feature = "wgpu")]
|
|
pub use {egui_wgpu, wgpu};
|
|
|
|
mod epi;
|
|
|
|
// Re-export everything in `epi` so `eframe` users don't have to care about what `epi` is:
|
|
pub use epi::*;
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// When compiling for web
|
|
|
|
#[cfg(target_arch = "wasm32")]
|
|
pub use wasm_bindgen;
|
|
|
|
#[cfg(target_arch = "wasm32")]
|
|
pub use web_sys;
|
|
|
|
#[cfg(target_arch = "wasm32")]
|
|
pub mod web;
|
|
|
|
#[cfg(target_arch = "wasm32")]
|
|
pub use web::{WebLogger, WebRunner};
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// When compiling natively
|
|
|
|
#[cfg(not(target_arch = "wasm32"))]
|
|
#[cfg(any(feature = "glow", feature = "wgpu"))]
|
|
mod native;
|
|
|
|
#[cfg(not(target_arch = "wasm32"))]
|
|
#[cfg(any(feature = "glow", feature = "wgpu"))]
|
|
#[cfg(feature = "persistence")]
|
|
pub use native::file_storage::storage_dir;
|
|
|
|
/// This is how you start a native (desktop) app.
|
|
///
|
|
/// The first argument is name of your app, used for the title bar of the native window
|
|
/// and the save location of persistence (see [`App::save`]).
|
|
///
|
|
/// Call from `fn main` like this:
|
|
/// ``` no_run
|
|
/// use eframe::egui;
|
|
///
|
|
/// fn main() -> eframe::Result<()> {
|
|
/// let native_options = eframe::NativeOptions::default();
|
|
/// eframe::run_native("MyApp", native_options, Box::new(|cc| Box::new(MyEguiApp::new(cc))))
|
|
/// }
|
|
///
|
|
/// #[derive(Default)]
|
|
/// struct MyEguiApp {}
|
|
///
|
|
/// impl MyEguiApp {
|
|
/// fn new(cc: &eframe::CreationContext<'_>) -> Self {
|
|
/// // Customize egui here with cc.egui_ctx.set_fonts and cc.egui_ctx.set_visuals.
|
|
/// // Restore app state using cc.storage (requires the "persistence" feature).
|
|
/// // Use the cc.gl (a glow::Context) to create graphics shaders and buffers that you can use
|
|
/// // for e.g. egui::PaintCallback.
|
|
/// Self::default()
|
|
/// }
|
|
/// }
|
|
///
|
|
/// impl eframe::App for MyEguiApp {
|
|
/// fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) {
|
|
/// egui::CentralPanel::default().show(ctx, |ui| {
|
|
/// ui.heading("Hello World!");
|
|
/// });
|
|
/// }
|
|
/// }
|
|
/// ```
|
|
///
|
|
/// # Errors
|
|
/// This function can fail if we fail to set up a graphics context.
|
|
#[cfg(not(target_arch = "wasm32"))]
|
|
#[cfg(any(feature = "glow", feature = "wgpu"))]
|
|
#[allow(clippy::needless_pass_by_value)]
|
|
pub fn run_native(
|
|
app_name: &str,
|
|
native_options: NativeOptions,
|
|
app_creator: AppCreator,
|
|
) -> Result<()> {
|
|
let renderer = native_options.renderer;
|
|
|
|
#[cfg(not(feature = "__screenshot"))]
|
|
assert!(
|
|
std::env::var("EFRAME_SCREENSHOT_TO").is_err(),
|
|
"EFRAME_SCREENSHOT_TO found without compiling with the '__screenshot' feature"
|
|
);
|
|
|
|
match renderer {
|
|
#[cfg(feature = "glow")]
|
|
Renderer::Glow => {
|
|
log::debug!("Using the glow renderer");
|
|
native::run::run_glow(app_name, native_options, app_creator)
|
|
}
|
|
|
|
#[cfg(feature = "wgpu")]
|
|
Renderer::Wgpu => {
|
|
log::debug!("Using the wgpu renderer");
|
|
native::run::run_wgpu(app_name, native_options, app_creator)
|
|
}
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
/// The simplest way to get started when writing a native app.
|
|
///
|
|
/// This does NOT support persistence. For that you need to use [`run_native`].
|
|
///
|
|
/// # Example
|
|
/// ``` no_run
|
|
/// fn main() -> eframe::Result<()> {
|
|
/// // Our application state:
|
|
/// let mut name = "Arthur".to_owned();
|
|
/// let mut age = 42;
|
|
///
|
|
/// let options = eframe::NativeOptions::default();
|
|
/// eframe::run_simple_native("My egui App", options, move |ctx, _frame| {
|
|
/// egui::CentralPanel::default().show(ctx, |ui| {
|
|
/// ui.heading("My egui Application");
|
|
/// ui.horizontal(|ui| {
|
|
/// let name_label = ui.label("Your name: ");
|
|
/// ui.text_edit_singleline(&mut name)
|
|
/// .labelled_by(name_label.id);
|
|
/// });
|
|
/// ui.add(egui::Slider::new(&mut age, 0..=120).text("age"));
|
|
/// if ui.button("Click each year").clicked() {
|
|
/// age += 1;
|
|
/// }
|
|
/// ui.label(format!("Hello '{name}', age {age}"));
|
|
/// });
|
|
/// })
|
|
/// }
|
|
/// ```
|
|
///
|
|
/// # Errors
|
|
/// This function can fail if we fail to set up a graphics context.
|
|
#[cfg(not(target_arch = "wasm32"))]
|
|
#[cfg(any(feature = "glow", feature = "wgpu"))]
|
|
pub fn run_simple_native(
|
|
app_name: &str,
|
|
native_options: NativeOptions,
|
|
update_fun: impl FnMut(&egui::Context, &mut Frame) + 'static,
|
|
) -> Result<()> {
|
|
struct SimpleApp<U> {
|
|
update_fun: U,
|
|
}
|
|
|
|
impl<U: FnMut(&egui::Context, &mut Frame) + 'static> App for SimpleApp<U> {
|
|
fn update(&mut self, ctx: &egui::Context, frame: &mut Frame) {
|
|
(self.update_fun)(ctx, frame);
|
|
}
|
|
}
|
|
|
|
run_native(
|
|
app_name,
|
|
native_options,
|
|
Box::new(|_cc| Box::new(SimpleApp { update_fun })),
|
|
)
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
/// The different problems that can occur when trying to run `eframe`.
|
|
#[derive(thiserror::Error, Debug)]
|
|
pub enum Error {
|
|
/// An error from [`winit`].
|
|
#[cfg(not(target_arch = "wasm32"))]
|
|
#[error("winit error: {0}")]
|
|
Winit(#[from] winit::error::OsError),
|
|
|
|
/// An error from [`glutin`] when using [`glow`].
|
|
#[cfg(all(feature = "glow", not(target_arch = "wasm32")))]
|
|
#[error("glutin error: {0}")]
|
|
Glutin(#[from] glutin::error::Error),
|
|
|
|
/// An error from [`glutin`] when using [`glow`].
|
|
#[cfg(all(feature = "glow", not(target_arch = "wasm32")))]
|
|
#[error("Found no glutin configs matching the template: {0:?}. Error: {1:?}")]
|
|
NoGlutinConfigs(glutin::config::ConfigTemplate, Box<dyn std::error::Error>),
|
|
|
|
/// An error from [`wgpu`].
|
|
#[cfg(feature = "wgpu")]
|
|
#[error("WGPU error: {0}")]
|
|
Wgpu(#[from] egui_wgpu::WgpuError),
|
|
}
|
|
|
|
/// Short for `Result<T, eframe::Error>`.
|
|
pub type Result<T> = std::result::Result<T, Error>;
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
mod profiling_scopes {
|
|
#![allow(unused_macros)]
|
|
#![allow(unused_imports)]
|
|
|
|
/// Profiling macro for feature "puffin"
|
|
macro_rules! profile_function {
|
|
($($arg: tt)*) => {
|
|
#[cfg(feature = "puffin")]
|
|
#[cfg(not(target_arch = "wasm32"))] // Disabled on web because of the coarse 1ms clock resolution there.
|
|
puffin::profile_function!($($arg)*);
|
|
};
|
|
}
|
|
pub(crate) use profile_function;
|
|
|
|
/// Profiling macro for feature "puffin"
|
|
macro_rules! profile_scope {
|
|
($($arg: tt)*) => {
|
|
#[cfg(feature = "puffin")]
|
|
#[cfg(not(target_arch = "wasm32"))] // Disabled on web because of the coarse 1ms clock resolution there.
|
|
puffin::profile_scope!($($arg)*);
|
|
};
|
|
}
|
|
pub(crate) use profile_scope;
|
|
}
|
|
|
|
#[allow(unused_imports)]
|
|
pub(crate) use profiling_scopes::*;
|