mirror of
https://github.com/emilk/egui.git
synced 2026-09-02 14:50:03 -04:00
Merge branch 'master' of https://github.com/emilk/egui into multiples_viewports
This commit is contained in:
10
Cargo.lock
generated
10
Cargo.lock
generated
@@ -1152,6 +1152,7 @@ dependencies = [
|
|||||||
"js-sys",
|
"js-sys",
|
||||||
"log",
|
"log",
|
||||||
"objc",
|
"objc",
|
||||||
|
"parking_lot",
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
"pollster",
|
"pollster",
|
||||||
"puffin",
|
"puffin",
|
||||||
@@ -1265,6 +1266,7 @@ dependencies = [
|
|||||||
"egui",
|
"egui",
|
||||||
"image",
|
"image",
|
||||||
"log",
|
"log",
|
||||||
|
"puffin",
|
||||||
"resvg",
|
"resvg",
|
||||||
"serde",
|
"serde",
|
||||||
"tiny-skia",
|
"tiny-skia",
|
||||||
@@ -4064,9 +4066,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "web-time"
|
name = "web-time"
|
||||||
version = "0.1.0"
|
version = "0.2.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "fa75ec260dcf59cc310827bae1d7f629809b173dbfe808a633e19754dd4282a5"
|
checksum = "19353897b48e2c4d849a2d73cb0aeb16dc2be4e00c565abfc11eb65a806e47de"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"js-sys",
|
"js-sys",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
@@ -4092,9 +4094,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "webpki"
|
name = "webpki"
|
||||||
version = "0.22.0"
|
version = "0.22.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd"
|
checksum = "f0e74f82d49d545ad128049b7e88f6576df2da6b02e9ce565c6f533be576957e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ring",
|
"ring",
|
||||||
"untrusted",
|
"untrusted",
|
||||||
|
|||||||
61
clippy.toml
61
clippy.toml
@@ -1,7 +1,68 @@
|
|||||||
# There is also a scripts/clippy_wasm/clippy.toml which forbids some mthods that are not available in wasm.
|
# There is also a scripts/clippy_wasm/clippy.toml which forbids some mthods that are not available in wasm.
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Section identical to scripts/clippy_wasm/clippy.toml:
|
||||||
|
|
||||||
msrv = "1.67"
|
msrv = "1.67"
|
||||||
|
|
||||||
|
allow-unwrap-in-tests = true
|
||||||
|
|
||||||
|
# https://doc.rust-lang.org/nightly/clippy/lint_configuration.html#avoid-breaking-exported-api
|
||||||
|
# We want suggestions, even if it changes public API.
|
||||||
|
avoid-breaking-exported-api = false
|
||||||
|
|
||||||
|
max-fn-params-bools = 2 # TODO(emilk): decrease this to 1
|
||||||
|
|
||||||
|
# https://rust-lang.github.io/rust-clippy/master/index.html#/large_include_file
|
||||||
|
max-include-file-size = 100000
|
||||||
|
|
||||||
|
too-many-lines-threshold = 100
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# https://rust-lang.github.io/rust-clippy/master/index.html#disallowed_macros
|
||||||
|
disallowed-macros = [
|
||||||
|
'dbg',
|
||||||
|
'std::unimplemented',
|
||||||
|
|
||||||
|
# TODO(emilk): consider forbidding these to encourage the use of proper log stream, and then explicitly allow legitimate uses
|
||||||
|
# 'std::eprint',
|
||||||
|
# 'std::eprintln',
|
||||||
|
# 'std::print',
|
||||||
|
# 'std::println',
|
||||||
|
]
|
||||||
|
|
||||||
|
# https://rust-lang.github.io/rust-clippy/master/index.html#disallowed_methods
|
||||||
|
disallowed-methods = [
|
||||||
|
"std::env::temp_dir", # Use the tempdir crate instead
|
||||||
|
|
||||||
|
# There are many things that aren't allowed on wasm,
|
||||||
|
# but we cannot disable them all here (because of e.g. https://github.com/rust-lang/rust-clippy/issues/10406)
|
||||||
|
# so we do that in `clipppy_wasm.toml` instead.
|
||||||
|
|
||||||
|
"std::thread::spawn", # Use `std::thread::Builder` and name the thread
|
||||||
|
|
||||||
|
"sha1::Digest::new", # SHA1 is cryptographically broken
|
||||||
|
|
||||||
|
"std::panic::catch_unwind", # We compile with `panic = "abort"`
|
||||||
|
]
|
||||||
|
|
||||||
|
# https://rust-lang.github.io/rust-clippy/master/index.html#disallowed_names
|
||||||
|
disallowed-names = []
|
||||||
|
|
||||||
|
# https://rust-lang.github.io/rust-clippy/master/index.html#disallowed_types
|
||||||
|
disallowed-types = [
|
||||||
|
# Use the faster & simpler non-poisonable primitives in `parking_lot` instead
|
||||||
|
"std::sync::Mutex",
|
||||||
|
"std::sync::RwLock",
|
||||||
|
"std::sync::Condvar",
|
||||||
|
# "std::sync::Once", # enabled for now as the `log_once` macro uses it internally
|
||||||
|
|
||||||
|
"ring::digest::SHA1_FOR_LEGACY_USE_ONLY", # SHA1 is cryptographically broken
|
||||||
|
]
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
# Allow-list of words for markdown in dosctrings https://rust-lang.github.io/rust-clippy/master/index.html#doc_markdown
|
# Allow-list of words for markdown in dosctrings https://rust-lang.github.io/rust-clippy/master/index.html#doc_markdown
|
||||||
doc-valid-idents = [
|
doc-valid-idents = [
|
||||||
# You must also update the same list in the root `clippy.toml`!
|
# You must also update the same list in the root `clippy.toml`!
|
||||||
|
|||||||
@@ -96,6 +96,8 @@ egui = { version = "0.22.0", path = "../egui", default-features = false, feature
|
|||||||
"log",
|
"log",
|
||||||
] }
|
] }
|
||||||
log = { version = "0.4", features = ["std"] }
|
log = { version = "0.4", features = ["std"] }
|
||||||
|
parking_lot = "0.12"
|
||||||
|
static_assertions = "1.1.0"
|
||||||
thiserror.workspace = true
|
thiserror.workspace = true
|
||||||
|
|
||||||
#! ### Optional dependencies
|
#! ### Optional dependencies
|
||||||
@@ -106,7 +108,6 @@ egui_glow = { version = "0.22.0", path = "../egui_glow", optional = true, defaul
|
|||||||
glow = { version = "0.12", optional = true }
|
glow = { version = "0.12", optional = true }
|
||||||
ron = { version = "0.8", optional = true, features = ["integer128"] }
|
ron = { version = "0.8", optional = true, features = ["integer128"] }
|
||||||
serde = { version = "1", optional = true, features = ["derive"] }
|
serde = { version = "1", optional = true, features = ["derive"] }
|
||||||
static_assertions = "1.1.0"
|
|
||||||
|
|
||||||
# -------------------------------------------
|
# -------------------------------------------
|
||||||
# native:
|
# native:
|
||||||
|
|||||||
@@ -1771,6 +1771,7 @@ mod wgpu_integration {
|
|||||||
|
|
||||||
use egui::ViewportRender;
|
use egui::ViewportRender;
|
||||||
use egui_winit::create_winit_window_builder;
|
use egui_winit::create_winit_window_builder;
|
||||||
|
use parking_lot::Mutex;
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
@@ -1830,7 +1831,7 @@ mod wgpu_integration {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct WgpuWinitApp {
|
struct WgpuWinitApp {
|
||||||
repaint_proxy: Arc<std::sync::Mutex<EventLoopProxy<UserEvent>>>,
|
repaint_proxy: Arc<Mutex<EventLoopProxy<UserEvent>>>,
|
||||||
app_name: String,
|
app_name: String,
|
||||||
native_options: epi::NativeOptions,
|
native_options: epi::NativeOptions,
|
||||||
app_creator: Option<epi::AppCreator>,
|
app_creator: Option<epi::AppCreator>,
|
||||||
@@ -1855,7 +1856,7 @@ mod wgpu_integration {
|
|||||||
);
|
);
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
repaint_proxy: Arc::new(std::sync::Mutex::new(event_loop.create_proxy())),
|
repaint_proxy: Arc::new(Mutex::new(event_loop.create_proxy())),
|
||||||
app_name: app_name.to_owned(),
|
app_name: app_name.to_owned(),
|
||||||
native_options,
|
native_options,
|
||||||
running: None,
|
running: None,
|
||||||
@@ -1983,11 +1984,7 @@ mod wgpu_integration {
|
|||||||
let mut state = egui_winit::State::new(event_loop);
|
let mut state = egui_winit::State::new(event_loop);
|
||||||
#[cfg(feature = "accesskit")]
|
#[cfg(feature = "accesskit")]
|
||||||
{
|
{
|
||||||
integration.init_accesskit(
|
integration.init_accesskit(&mut state, &window, self.repaint_proxy.lock().clone());
|
||||||
&mut state,
|
|
||||||
&window,
|
|
||||||
self.repaint_proxy.lock().unwrap().clone(),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
let theme = system_theme.unwrap_or(self.native_options.default_theme);
|
let theme = system_theme.unwrap_or(self.native_options.default_theme);
|
||||||
integration.egui_ctx.set_visuals(theme.egui_visuals());
|
integration.egui_ctx.set_visuals(theme.egui_visuals());
|
||||||
@@ -2006,7 +2003,6 @@ mod wgpu_integration {
|
|||||||
|
|
||||||
event_loop_proxy
|
event_loop_proxy
|
||||||
.lock()
|
.lock()
|
||||||
.unwrap()
|
|
||||||
.send_event(UserEvent::RequestRepaint {
|
.send_event(UserEvent::RequestRepaint {
|
||||||
when,
|
when,
|
||||||
frame_nr,
|
frame_nr,
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ egui = { version = "0.22.0", path = "../egui", default-features = false, feature
|
|||||||
] }
|
] }
|
||||||
log = { version = "0.4", features = ["std"] }
|
log = { version = "0.4", features = ["std"] }
|
||||||
raw-window-handle = "0.5.0"
|
raw-window-handle = "0.5.0"
|
||||||
web-time = { version = "0.1" } # We use web-time so we can (maybe) compile for web
|
web-time = { version = "0.2" } # We use web-time so we can (maybe) compile for web
|
||||||
winit = { version = "0.28", default-features = false }
|
winit = { version = "0.28", default-features = false }
|
||||||
|
|
||||||
#! ### Optional dependencies
|
#! ### Optional dependencies
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
// #![warn(missing_docs)]
|
#![warn(missing_docs)] // Let's keep `Context` well-documented.
|
||||||
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
@@ -1889,6 +1890,7 @@ impl Context {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Context {
|
impl Context {
|
||||||
|
/// Show a ui for settings (style and tessellation options).
|
||||||
pub fn settings_ui(&self, ui: &mut Ui) {
|
pub fn settings_ui(&self, ui: &mut Ui) {
|
||||||
use crate::containers::*;
|
use crate::containers::*;
|
||||||
|
|
||||||
@@ -1911,6 +1913,7 @@ impl Context {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Show the state of egui, including its input and output.
|
||||||
pub fn inspection_ui(&self, ui: &mut Ui) {
|
pub fn inspection_ui(&self, ui: &mut Ui) {
|
||||||
use crate::containers::*;
|
use crate::containers::*;
|
||||||
crate::trace!(ui);
|
crate::trace!(ui);
|
||||||
@@ -2040,6 +2043,7 @@ impl Context {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Shows the contents of [`Self::memory`].
|
||||||
pub fn memory_ui(&self, ui: &mut crate::Ui) {
|
pub fn memory_ui(&self, ui: &mut crate::Ui) {
|
||||||
if ui
|
if ui
|
||||||
.button("Reset all")
|
.button("Reset all")
|
||||||
@@ -2140,6 +2144,7 @@ impl Context {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Context {
|
impl Context {
|
||||||
|
/// Edit the active [`Style`].
|
||||||
pub fn style_ui(&self, ui: &mut Ui) {
|
pub fn style_ui(&self, ui: &mut Ui) {
|
||||||
let mut style: Style = (*self.style()).clone();
|
let mut style: Style = (*self.style()).clone();
|
||||||
style.ui(ui);
|
style.ui(ui);
|
||||||
@@ -2155,6 +2160,8 @@ impl Context {
|
|||||||
/// the function is still called, but with no other effect.
|
/// the function is still called, but with no other effect.
|
||||||
///
|
///
|
||||||
/// No locks are held while the given closure is called.
|
/// No locks are held while the given closure is called.
|
||||||
|
#[allow(clippy::unused_self)]
|
||||||
|
#[inline]
|
||||||
pub fn with_accessibility_parent(&self, _id: Id, f: impl FnOnce()) {
|
pub fn with_accessibility_parent(&self, _id: Id, f: impl FnOnce()) {
|
||||||
// TODO(emilk): this isn't thread-safe - another thread can call this function between the push/pop calls
|
// TODO(emilk): this isn't thread-safe - another thread can call this function between the push/pop calls
|
||||||
#[cfg(feature = "accesskit")]
|
#[cfg(feature = "accesskit")]
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
/// An `enum` of common operating systems.
|
||||||
|
#[allow(clippy::upper_case_acronyms)] // `Ios` looks too ugly
|
||||||
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
|
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
|
||||||
pub enum OperatingSystem {
|
pub enum OperatingSystem {
|
||||||
/// Unknown OS - could be wasm
|
/// Unknown OS - could be wasm
|
||||||
@@ -26,6 +28,7 @@ impl Default for OperatingSystem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl OperatingSystem {
|
impl OperatingSystem {
|
||||||
|
/// Uses the compile-time `target_arch` to identify the OS.
|
||||||
pub const fn from_target_os() -> Self {
|
pub const fn from_target_os() -> Self {
|
||||||
if cfg!(target_arch = "wasm32") {
|
if cfg!(target_arch = "wasm32") {
|
||||||
Self::Unknown
|
Self::Unknown
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// #![warn(missing_docs)]
|
#![warn(missing_docs)] // Let's keep `Ui` well-documented.
|
||||||
|
|
||||||
use std::hash::Hash;
|
use std::hash::Hash;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
@@ -249,11 +249,6 @@ impl Ui {
|
|||||||
self.painter.is_visible()
|
self.painter.is_visible()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[deprecated = "Renamed is_visible"]
|
|
||||||
pub fn visible(&self) -> bool {
|
|
||||||
self.painter.is_visible()
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Calling `set_visible(false)` will cause all further widgets to be invisible,
|
/// Calling `set_visible(false)` will cause all further widgets to be invisible,
|
||||||
/// yet still allocate space.
|
/// yet still allocate space.
|
||||||
///
|
///
|
||||||
@@ -281,6 +276,7 @@ impl Ui {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Read the [`Layout`].
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn layout(&self) -> &Layout {
|
pub fn layout(&self) -> &Layout {
|
||||||
self.placer.layout()
|
self.placer.layout()
|
||||||
@@ -611,6 +607,7 @@ impl Ui {
|
|||||||
Id::new(self.next_auto_id_source)
|
Id::new(self.next_auto_id_source)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Same as `ui.next_auto_id().with(id_source)`
|
||||||
pub fn auto_id_with<IdSource>(&self, id_source: IdSource) -> Id
|
pub fn auto_id_with<IdSource>(&self, id_source: IdSource) -> Id
|
||||||
where
|
where
|
||||||
IdSource: Hash,
|
IdSource: Hash,
|
||||||
@@ -618,6 +615,7 @@ impl Ui {
|
|||||||
Id::new(self.next_auto_id_source).with(id_source)
|
Id::new(self.next_auto_id_source).with(id_source)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Pretend like `count` widgets have been allocated.
|
||||||
pub fn skip_ahead_auto_ids(&mut self, count: usize) {
|
pub fn skip_ahead_auto_ids(&mut self, count: usize) {
|
||||||
self.next_auto_id_source = self.next_auto_id_source.wrapping_add(count as u64);
|
self.next_auto_id_source = self.next_auto_id_source.wrapping_add(count as u64);
|
||||||
}
|
}
|
||||||
@@ -2038,11 +2036,6 @@ impl Ui {
|
|||||||
InnerResponse::new(inner, self.interact(rect, child_ui.id, Sense::hover()))
|
InnerResponse::new(inner, self.interact(rect, child_ui.id, Sense::hover()))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[deprecated = "Use ui.vertical_centered or ui.centered_and_justified"]
|
|
||||||
pub fn centered<R>(&mut self, add_contents: impl FnOnce(&mut Self) -> R) -> InnerResponse<R> {
|
|
||||||
self.vertical_centered(add_contents)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// This will make the next added widget centered and justified in the available space.
|
/// This will make the next added widget centered and justified in the available space.
|
||||||
///
|
///
|
||||||
/// Only one widget may be added to the inner `Ui`!
|
/// Only one widget may be added to the inner `Ui`!
|
||||||
|
|||||||
@@ -451,10 +451,13 @@ impl EguiWindows {
|
|||||||
|
|
||||||
#[cfg(not(target_arch = "wasm32"))]
|
#[cfg(not(target_arch = "wasm32"))]
|
||||||
fn call_after_delay(delay: std::time::Duration, f: impl FnOnce() + Send + 'static) {
|
fn call_after_delay(delay: std::time::Duration, f: impl FnOnce() + Send + 'static) {
|
||||||
std::thread::spawn(move || {
|
std::thread::Builder::new()
|
||||||
|
.name("call_after_delay".to_owned())
|
||||||
|
.spawn(move || {
|
||||||
std::thread::sleep(delay);
|
std::thread::sleep(delay);
|
||||||
f();
|
f();
|
||||||
});
|
})
|
||||||
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_arch = "wasm32")]
|
#[cfg(target_arch = "wasm32")]
|
||||||
|
|||||||
@@ -29,12 +29,17 @@ default = []
|
|||||||
## Enable [`DatePickerButton`] widget.
|
## Enable [`DatePickerButton`] widget.
|
||||||
datepicker = ["chrono"]
|
datepicker = ["chrono"]
|
||||||
|
|
||||||
## Support loading svg images.
|
|
||||||
svg = ["resvg", "tiny-skia", "usvg"]
|
|
||||||
|
|
||||||
## Log warnings using [`log`](https://docs.rs/log) crate.
|
## Log warnings using [`log`](https://docs.rs/log) crate.
|
||||||
log = ["dep:log", "egui/log"]
|
log = ["dep:log", "egui/log"]
|
||||||
|
|
||||||
|
## Enable profiling with the [`puffin`](https://docs.rs/puffin) crate.
|
||||||
|
##
|
||||||
|
## Only enabled on native, because of the low resolution (1ms) of clocks in browsers.
|
||||||
|
puffin = ["dep:puffin", "egui/puffin"]
|
||||||
|
|
||||||
|
## Support loading svg images.
|
||||||
|
svg = ["resvg", "tiny-skia", "usvg"]
|
||||||
|
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
egui = { version = "0.22.0", path = "../egui", default-features = false }
|
egui = { version = "0.22.0", path = "../egui", default-features = false }
|
||||||
@@ -65,6 +70,8 @@ image = { version = "0.24", optional = true, default-features = false }
|
|||||||
# feature "log"
|
# feature "log"
|
||||||
log = { version = "0.4", optional = true, features = ["std"] }
|
log = { version = "0.4", optional = true, features = ["std"] }
|
||||||
|
|
||||||
|
puffin = { version = "0.16", optional = true }
|
||||||
|
|
||||||
# svg feature
|
# svg feature
|
||||||
resvg = { version = "0.28", optional = true, default-features = false }
|
resvg = { version = "0.28", optional = true, default-features = false }
|
||||||
tiny-skia = { version = "0.8", optional = true, default-features = false } # must be updated in lock-step with resvg
|
tiny-skia = { version = "0.8", optional = true, default-features = false } # must be updated in lock-step with resvg
|
||||||
|
|||||||
@@ -203,6 +203,7 @@ use egui::ColorImage;
|
|||||||
/// On invalid image or unsupported image format.
|
/// On invalid image or unsupported image format.
|
||||||
#[cfg(feature = "image")]
|
#[cfg(feature = "image")]
|
||||||
pub fn load_image_bytes(image_bytes: &[u8]) -> Result<egui::ColorImage, String> {
|
pub fn load_image_bytes(image_bytes: &[u8]) -> Result<egui::ColorImage, String> {
|
||||||
|
crate::profile_function!();
|
||||||
let image = image::load_from_memory(image_bytes).map_err(|err| err.to_string())?;
|
let image = image::load_from_memory(image_bytes).map_err(|err| err.to_string())?;
|
||||||
let size = [image.width() as _, image.height() as _];
|
let size = [image.width() as _, image.height() as _];
|
||||||
let image_buffer = image.to_rgba8();
|
let image_buffer = image.to_rgba8();
|
||||||
@@ -235,6 +236,7 @@ pub fn load_svg_bytes_with_size(
|
|||||||
svg_bytes: &[u8],
|
svg_bytes: &[u8],
|
||||||
fit_to: FitTo,
|
fit_to: FitTo,
|
||||||
) -> Result<egui::ColorImage, String> {
|
) -> Result<egui::ColorImage, String> {
|
||||||
|
crate::profile_function!();
|
||||||
let opt = usvg::Options::default();
|
let opt = usvg::Options::default();
|
||||||
|
|
||||||
let rtree = usvg::Tree::from_data(svg_bytes, &opt).map_err(|err| err.to_string())?;
|
let rtree = usvg::Tree::from_data(svg_bytes, &opt).map_err(|err| err.to_string())?;
|
||||||
|
|||||||
@@ -28,6 +28,38 @@ pub use crate::sizing::Size;
|
|||||||
pub use crate::strip::*;
|
pub use crate::strip::*;
|
||||||
pub use crate::table::*;
|
pub use crate::table::*;
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
mod profiling_scopes {
|
||||||
|
#![allow(unused_macros)]
|
||||||
|
#![allow(unused_imports)]
|
||||||
|
|
||||||
|
/// Profiling macro for feature "puffin"
|
||||||
|
macro_rules! profile_function {
|
||||||
|
($($arg: tt)*) => {
|
||||||
|
#[cfg(not(target_arch = "wasm32"))] // Disabled on web because of the coarse 1ms clock resolution there.
|
||||||
|
#[cfg(feature = "puffin")]
|
||||||
|
puffin::profile_function!($($arg)*);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
pub(crate) use profile_function;
|
||||||
|
|
||||||
|
/// Profiling macro for feature "puffin"
|
||||||
|
macro_rules! profile_scope {
|
||||||
|
($($arg: tt)*) => {
|
||||||
|
#[cfg(not(target_arch = "wasm32"))] // Disabled on web because of the coarse 1ms clock resolution there.
|
||||||
|
#[cfg(feature = "puffin")]
|
||||||
|
puffin::profile_scope!($($arg)*);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
pub(crate) use profile_scope;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(unused_imports)]
|
||||||
|
pub(crate) use profiling_scopes::*;
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
/// Log an error with either `log` or `eprintln`
|
/// Log an error with either `log` or `eprintln`
|
||||||
macro_rules! log_err {
|
macro_rules! log_err {
|
||||||
($fmt: literal, $($arg: tt)*) => {{
|
($fmt: literal, $($arg: tt)*) => {{
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
#![allow(clippy::many_single_char_names)]
|
#![allow(clippy::many_single_char_names)]
|
||||||
|
#![allow(clippy::wrong_self_convention)] // False positives
|
||||||
|
|
||||||
use std::ops::Range;
|
use std::ops::Range;
|
||||||
|
|
||||||
use crate::{shape::Shape, Color32, PathShape, Stroke};
|
use crate::{shape::Shape, Color32, PathShape, Stroke};
|
||||||
|
|||||||
@@ -374,6 +374,8 @@ where
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
#![allow(clippy::disallowed_methods)] // Ok for tests
|
||||||
|
|
||||||
use crate::mutex::Mutex;
|
use crate::mutex::Mutex;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
@@ -414,6 +416,8 @@ mod tests {
|
|||||||
#[cfg(feature = "deadlock_detection")]
|
#[cfg(feature = "deadlock_detection")]
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests_rwlock {
|
mod tests_rwlock {
|
||||||
|
#![allow(clippy::disallowed_methods)] // Ok for tests
|
||||||
|
|
||||||
use crate::mutex::RwLock;
|
use crate::mutex::RwLock;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#![allow(clippy::derive_hash_xor_eq)] // We need to impl Hash for f32, but we don't implement Eq, which is fine
|
#![allow(clippy::derive_hash_xor_eq)] // We need to impl Hash for f32, but we don't implement Eq, which is fine
|
||||||
|
#![allow(clippy::wrong_self_convention)] // We use `from_` to indicate conversion direction. It's non-diomatic, but makes sense in this context.
|
||||||
|
|
||||||
use std::ops::Range;
|
use std::ops::Range;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ unmaintained = "warn"
|
|||||||
yanked = "deny"
|
yanked = "deny"
|
||||||
ignore = [
|
ignore = [
|
||||||
"RUSTSEC-2020-0071", # https://rustsec.org/advisories/RUSTSEC-2020-0071 - chrono/time: Potential segfault in the time crate
|
"RUSTSEC-2020-0071", # https://rustsec.org/advisories/RUSTSEC-2020-0071 - chrono/time: Potential segfault in the time crate
|
||||||
"RUSTSEC-2023-0052", # https://rustsec.org/advisories/RUSTSEC-2023-0052 - can be fixed by `cargo update -p ureq`, but then we run into duplicate crates: https://github.com/algesten/ureq/issues/653
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[bans]
|
[bans]
|
||||||
|
|||||||
@@ -3,8 +3,26 @@
|
|||||||
# We cannot forbid all these methods in the main `clippy.toml` because of
|
# We cannot forbid all these methods in the main `clippy.toml` because of
|
||||||
# https://github.com/rust-lang/rust-clippy/issues/10406
|
# https://github.com/rust-lang/rust-clippy/issues/10406
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Section identical to the root clippy.toml:
|
||||||
|
|
||||||
msrv = "1.67"
|
msrv = "1.67"
|
||||||
|
|
||||||
|
allow-unwrap-in-tests = true
|
||||||
|
|
||||||
|
# https://doc.rust-lang.org/nightly/clippy/lint_configuration.html#avoid-breaking-exported-api
|
||||||
|
# We want suggestions, even if it changes public API.
|
||||||
|
avoid-breaking-exported-api = false
|
||||||
|
|
||||||
|
max-fn-params-bools = 2 # TODO(emilk): decrease this to 1
|
||||||
|
|
||||||
|
# https://rust-lang.github.io/rust-clippy/master/index.html#/large_include_file
|
||||||
|
max-include-file-size = 100000
|
||||||
|
|
||||||
|
too-many-lines-threshold = 100
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
# https://rust-lang.github.io/rust-clippy/master/index.html#disallowed_methods
|
# https://rust-lang.github.io/rust-clippy/master/index.html#disallowed_methods
|
||||||
disallowed-methods = [
|
disallowed-methods = [
|
||||||
"std::time::Instant::now", # use `instant` crate instead for wasm/web compatibility
|
"std::time::Instant::now", # use `instant` crate instead for wasm/web compatibility
|
||||||
@@ -17,8 +35,9 @@ disallowed-methods = [
|
|||||||
|
|
||||||
# https://rust-lang.github.io/rust-clippy/master/index.html#disallowed_types
|
# https://rust-lang.github.io/rust-clippy/master/index.html#disallowed_types
|
||||||
disallowed-types = [
|
disallowed-types = [
|
||||||
# Cannot spawn threads on wasm:
|
{ path = "instant::SystemTime", reason = "Known bugs. Use web-time." },
|
||||||
"std::thread::Builder",
|
{ path = "std::thread::Builder", reason = "Cannot spawn threads on wasm" },
|
||||||
|
# { path = "std::path::PathBuf", reason = "Can't read/write files on web" }, // TODO(emilk): consider banning Path on wasm
|
||||||
]
|
]
|
||||||
|
|
||||||
# Allow-list of words for markdown in dosctrings https://rust-lang.github.io/rust-clippy/master/index.html#doc_markdown
|
# Allow-list of words for markdown in dosctrings https://rust-lang.github.io/rust-clippy/master/index.html#doc_markdown
|
||||||
|
|||||||
Reference in New Issue
Block a user