diff --git a/druid/src/env.rs b/druid/src/env.rs index 9bb69da77b..a3503e4b74 100644 --- a/druid/src/env.rs +++ b/druid/src/env.rs @@ -16,7 +16,7 @@ use std::any; use std::borrow::Borrow; -use std::collections::HashMap; +use std::collections::{hash_map::Entry, HashMap}; use std::fmt::{Debug, Formatter}; use std::marker::PhantomData; use std::ops::Deref; @@ -342,13 +342,18 @@ impl Env { ) -> Result<(), ValueTypeError> { let env = Arc::make_mut(&mut self.0); let key = key.into(); - // TODO: use of Entry might be more efficient - if let Some(existing) = env.map.get(&key) { - if !existing.is_same_type(&raw) { - return Err(ValueTypeError::new(any::type_name::(), raw)); + match env.map.entry(key) { + Entry::Occupied(mut e) => { + let existing = e.get_mut(); + if !existing.is_same_type(&raw) { + return Err(ValueTypeError::new(any::type_name::(), raw)); + } + *existing = raw; + } + Entry::Vacant(e) => { + e.insert(raw); } } - env.map.insert(key, raw); Ok(()) } diff --git a/druid/src/scroll_component.rs b/druid/src/scroll_component.rs index eba0c4af68..f553d15387 100644 --- a/druid/src/scroll_component.rs +++ b/druid/src/scroll_component.rs @@ -22,11 +22,6 @@ use crate::theme; use crate::widget::{Axis, Viewport}; use crate::{Env, Event, EventCtx, LifeCycle, LifeCycleCtx, PaintCtx, RenderContext, TimerToken}; -//TODO: Add this to env -/// Minimum length for any scrollbar to be when measured on that -/// scrollbar's primary axis. -pub const SCROLLBAR_MIN_SIZE: f64 = 45.0; - #[derive(Debug, Copy, Clone)] /// Which scroll bars of a scroll area are currently enabled. pub enum ScrollbarsEnabled { @@ -187,12 +182,13 @@ impl ScrollComponent { let bar_width = env.get(theme::SCROLLBAR_WIDTH); let bar_pad = env.get(theme::SCROLLBAR_PAD); + let bar_min_size = env.get(theme::SCROLLBAR_MIN_SIZE); let percent_visible = viewport_size.height / content_size.height; let percent_scrolled = scroll_offset.y / (content_size.height - viewport_size.height); let length = (percent_visible * viewport_size.height).ceil(); - let length = length.max(SCROLLBAR_MIN_SIZE); + let length = length.max(bar_min_size); let vertical_padding = bar_pad + bar_pad + bar_width; @@ -222,12 +218,13 @@ impl ScrollComponent { let bar_width = env.get(theme::SCROLLBAR_WIDTH); let bar_pad = env.get(theme::SCROLLBAR_PAD); + let bar_min_size = env.get(theme::SCROLLBAR_MIN_SIZE); let percent_visible = viewport_size.width / content_size.width; let percent_scrolled = scroll_offset.x / (content_size.width - viewport_size.width); let length = (percent_visible * viewport_size.width).ceil(); - let length = length.max(SCROLLBAR_MIN_SIZE); + let length = length.max(bar_min_size); let horizontal_padding = bar_pad + bar_pad + bar_width; diff --git a/druid/src/theme.rs b/druid/src/theme.rs index 9b1a519e95..9c821e4643 100644 --- a/druid/src/theme.rs +++ b/druid/src/theme.rs @@ -100,6 +100,9 @@ pub const SCROLLBAR_PAD: Key = Key::new("org.linebender.druid.theme.scrollb pub const SCROLLBAR_RADIUS: Key = Key::new("org.linebender.druid.theme.scrollbar_radius"); pub const SCROLLBAR_EDGE_WIDTH: Key = Key::new("org.linebender.druid.theme.scrollbar_edge_width"); +/// Minimum length for any scrollbar to be when measured on that +/// scrollbar's primary axis. +pub const SCROLLBAR_MIN_SIZE: Key = Key::new("org.linebender.theme.scrollbar_min_size"); /// An initial theme. pub(crate) fn add_to_env(env: Env) -> Env { @@ -140,6 +143,7 @@ pub(crate) fn add_to_env(env: Env) -> Env { .adding(SCROLLBAR_FADE_DELAY, 1500u64) .adding(SCROLLBAR_WIDTH, 8.) .adding(SCROLLBAR_PAD, 2.) + .adding(SCROLLBAR_MIN_SIZE, 45.) .adding(SCROLLBAR_RADIUS, 5.) .adding(SCROLLBAR_EDGE_WIDTH, 1.) .adding(WIDGET_PADDING_VERTICAL, 10.0)