mirror of
https://github.com/emilk/egui.git
synced 2026-06-28 07:23:13 -04:00
* rework loading around `Arc<Loaders>` * use `Bytes` instead of splitting api * remove unwraps in `texture_handle` * make `FileLoader` optional under `file` feature * hide http load error stack trace from UI * implement image fit * support more image sources * center spinner if we know size ahead of time * allocate final size for spinner * improve image format guessing * remove `ui.image`, `Image`, add `RawImage` * deprecate `RetainedImage` * `image2` -> `image` * add viewer example * update `examples/image` + remove `svg` and `download_image` exapmles * fix lints and tests * fix doc link * add image controls to `images` example * add more `From` str-like types * add api to forget all images * fix max size * do not scale original size unless necessary * fix doc link * add more docs for `Image` and `RawImage` * make paint_at `pub` * update `ImageButton` to use new `Image` API * fix double rendering * `SizeHint::Original` -> `Scale` + remove `Option` wrapper * Update crates/egui/src/load.rs Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com> * remove special `None` value for `forget` * Update crates/egui/src/load.rs Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com> * add more examples to `ui.image` + add `include_image` macro * Update crates/egui/src/ui.rs Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com> * update `menu_image_button` to use `ImageSource` * `OrderedFloat::get` -> `into_inner` * derive `Eq` on `SizedTexture` * add `id` to loaders + `is_installed` check * move `images` to demo + simplify `images` example * log trace when installing loaders * fix lint * fix doc link * add more documentation * more `egui_extras::loaders` docs * Update examples/images/src/main.rs Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com> * update `images` example screenshots + readme * remove unused `rfd` from `images` example * Update crates/egui_extras/src/loaders/ehttp_loader.rs Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com> * add `must_use` on `Image` and `RawImage` * document `loaders::install` multiple call safety * Update crates/egui_extras/Cargo.toml Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com> * reshuffle `is_loader_installed` * make `include_image` produce `ImageSource` + update docs * update `include_image` docs * remove `None` mentions from loader `forget` * inline `From` texture id + size for `SizedTexture` * add warning about statically known path * change image load error + use in image button * add `.size()` to `Image` * Update crates/egui_demo_app/Cargo.toml Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com> * add explanations to image viewer ui --------- Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
139 lines
3.2 KiB
Rust
139 lines
3.2 KiB
Rust
//! Total order on floating point types.
|
|
//! Can be used for sorting, min/max computation, and other collection algorithms.
|
|
|
|
use std::cmp::Ordering;
|
|
use std::hash::{Hash, Hasher};
|
|
|
|
/// Wraps a floating-point value to add total order and hash.
|
|
/// Possible types for `T` are `f32` and `f64`.
|
|
///
|
|
/// See also [`FloatOrd`].
|
|
#[derive(Clone, Copy)]
|
|
pub struct OrderedFloat<T>(T);
|
|
|
|
impl<T: Float + Copy> OrderedFloat<T> {
|
|
#[inline]
|
|
pub fn into_inner(self) -> T {
|
|
self.0
|
|
}
|
|
}
|
|
|
|
impl<T: Float> Eq for OrderedFloat<T> {}
|
|
|
|
impl<T: Float> PartialEq<Self> for OrderedFloat<T> {
|
|
#[inline]
|
|
fn eq(&self, other: &Self) -> bool {
|
|
// NaNs are considered equal (equivalent) when it comes to ordering
|
|
if self.0.is_nan() {
|
|
other.0.is_nan()
|
|
} else {
|
|
self.0 == other.0
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<T: Float> PartialOrd<Self> for OrderedFloat<T> {
|
|
#[inline]
|
|
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
|
|
match self.0.partial_cmp(&other.0) {
|
|
Some(ord) => Some(ord),
|
|
None => Some(self.0.is_nan().cmp(&other.0.is_nan())),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<T: Float> Ord for OrderedFloat<T> {
|
|
#[inline]
|
|
fn cmp(&self, other: &Self) -> Ordering {
|
|
match self.partial_cmp(other) {
|
|
Some(ord) => ord,
|
|
None => unreachable!(),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<T: Float> Hash for OrderedFloat<T> {
|
|
fn hash<H: Hasher>(&self, state: &mut H) {
|
|
self.0.hash(state);
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
/// Extension trait to provide `ord()` method.
|
|
///
|
|
/// Example with `f64`:
|
|
/// ```
|
|
/// use epaint::util::FloatOrd;
|
|
///
|
|
/// let array = [1.0, 2.5, 2.0];
|
|
/// let max = array.iter().max_by_key(|val| val.ord());
|
|
///
|
|
/// assert_eq!(max, Some(&2.5));
|
|
/// ```
|
|
pub trait FloatOrd {
|
|
/// Type to provide total order, useful as key in sorted contexts.
|
|
fn ord(self) -> OrderedFloat<Self>
|
|
where
|
|
Self: Sized;
|
|
}
|
|
|
|
impl FloatOrd for f32 {
|
|
#[inline]
|
|
fn ord(self) -> OrderedFloat<f32> {
|
|
OrderedFloat(self)
|
|
}
|
|
}
|
|
|
|
impl FloatOrd for f64 {
|
|
#[inline]
|
|
fn ord(self) -> OrderedFloat<f64> {
|
|
OrderedFloat(self)
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
/// Internal abstraction over floating point types
|
|
#[doc(hidden)]
|
|
pub trait Float: PartialOrd + PartialEq + private::FloatImpl {}
|
|
|
|
impl Float for f32 {}
|
|
|
|
impl Float for f64 {}
|
|
|
|
// Keep this trait in private module, to avoid exposing its methods as extensions in user code
|
|
mod private {
|
|
use super::*;
|
|
|
|
pub trait FloatImpl {
|
|
fn is_nan(&self) -> bool;
|
|
|
|
fn hash<H: Hasher>(&self, state: &mut H);
|
|
}
|
|
|
|
impl FloatImpl for f32 {
|
|
#[inline]
|
|
fn is_nan(&self) -> bool {
|
|
f32::is_nan(*self)
|
|
}
|
|
|
|
#[inline]
|
|
fn hash<H: Hasher>(&self, state: &mut H) {
|
|
crate::f32_hash(state, *self);
|
|
}
|
|
}
|
|
|
|
impl FloatImpl for f64 {
|
|
#[inline]
|
|
fn is_nan(&self) -> bool {
|
|
f64::is_nan(*self)
|
|
}
|
|
|
|
#[inline]
|
|
fn hash<H: Hasher>(&self, state: &mut H) {
|
|
crate::f64_hash(state, *self);
|
|
}
|
|
}
|
|
}
|