mirror of
https://github.com/danbulant/cushy
synced 2026-07-05 03:00:43 +00:00
Dynamic::try_lock
Plus other minor changes.
This commit is contained in:
parent
3f8fed65c3
commit
0e5976de10
7 changed files with 38 additions and 7 deletions
|
|
@ -215,6 +215,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
- `Delimiter` is a new widget that is similar to html's `hr` tag.
|
- `Delimiter` is a new widget that is similar to html's `hr` tag.
|
||||||
- `List` is a new widget that creates lists similar to HTML's `ol` and `ul`
|
- `List` is a new widget that creates lists similar to HTML's `ol` and `ul`
|
||||||
tags.
|
tags.
|
||||||
|
- `Dynamic::try_lock()` is a panic-free version of `Dynamic::lock()`.
|
||||||
|
|
||||||
[plotters]: https://github.com/plotters-rs/plotters
|
[plotters]: https://github.com/plotters-rs/plotters
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1363,7 +1363,7 @@ pub(crate) mod sealed {
|
||||||
fn inner_invalidate_when_changed(&self, handle: WindowHandle, id: WidgetId);
|
fn inner_invalidate_when_changed(&self, handle: WindowHandle, id: WidgetId);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default, Clone)]
|
#[derive(Debug, Default, Clone)]
|
||||||
pub struct InvalidationStatus {
|
pub struct InvalidationStatus {
|
||||||
refresh_sent: Arc<AtomicBool>,
|
refresh_sent: Arc<AtomicBool>,
|
||||||
invalidated: Arc<Mutex<Set<WidgetId>>>,
|
invalidated: Arc<Mutex<Set<WidgetId>>>,
|
||||||
|
|
|
||||||
17
src/value.rs
17
src/value.rs
|
|
@ -1089,6 +1089,23 @@ impl<T> Dynamic<T> {
|
||||||
self.lock_inner()
|
self.lock_inner()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns an exclusive reference to the contents of this dynamic.
|
||||||
|
///
|
||||||
|
/// This call will block until all other guards for this dynamic have been
|
||||||
|
/// dropped.
|
||||||
|
///
|
||||||
|
/// # Errors
|
||||||
|
///
|
||||||
|
/// Returns an error if the current thread already holds a lock to this
|
||||||
|
/// dynamic.
|
||||||
|
pub fn try_lock(&self) -> Result<DynamicGuard<'_, T>, DeadlockError> {
|
||||||
|
Ok(DynamicGuard {
|
||||||
|
guard: self.0.state()?,
|
||||||
|
accessed_mut: false,
|
||||||
|
prevent_notifications: false,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
fn lock_inner<const READONLY: bool>(&self) -> DynamicGuard<'_, T, READONLY> {
|
fn lock_inner<const READONLY: bool>(&self) -> DynamicGuard<'_, T, READONLY> {
|
||||||
DynamicGuard {
|
DynamicGuard {
|
||||||
guard: self.0.state().expect("deadlocked"),
|
guard: self.0.state().expect("deadlocked"),
|
||||||
|
|
|
||||||
|
|
@ -2129,6 +2129,18 @@ impl Dynamic<WidgetList> {
|
||||||
self.clone().into_layers()
|
self.clone().into_layers()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns `self` as an unordered [`List`].
|
||||||
|
#[must_use]
|
||||||
|
pub fn into_list(self) -> List {
|
||||||
|
List::new(self)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns `self` as an unordered [`List`].
|
||||||
|
#[must_use]
|
||||||
|
pub fn to_list(self) -> List {
|
||||||
|
self.clone().into_list()
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns a [`Wrap`] that lays the children out horizontally, wrapping
|
/// Returns a [`Wrap`] that lays the children out horizontally, wrapping
|
||||||
/// into additional rows as needed.
|
/// into additional rows as needed.
|
||||||
#[must_use]
|
#[must_use]
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ use crate::ConstraintLimit;
|
||||||
///
|
///
|
||||||
/// Some parent widgets support weighting children when there is more than one
|
/// Some parent widgets support weighting children when there is more than one
|
||||||
/// [`Expand`]ed widget.
|
/// [`Expand`]ed widget.
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct Expand {
|
pub struct Expand {
|
||||||
kind: ExpandKind,
|
kind: ExpandKind,
|
||||||
child: WidgetRef,
|
child: WidgetRef,
|
||||||
|
|
|
||||||
|
|
@ -476,7 +476,8 @@ fn build_grid_widgets(style: &ListStyle, children: &WidgetList) -> GridWidgets<2
|
||||||
.list_indicator(index.wrapping_add(1))
|
.list_indicator(index.wrapping_add(1))
|
||||||
.unwrap_or_default(),
|
.unwrap_or_default(),
|
||||||
)
|
)
|
||||||
.align_right(),
|
.align_right()
|
||||||
|
.align_top(),
|
||||||
child.clone().align_left().make_widget(),
|
child.clone().align_left().make_widget(),
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -1964,7 +1964,7 @@ pub(crate) mod sealed {
|
||||||
pub on_closed: Option<OnceCallback>,
|
pub on_closed: Option<OnceCallback>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub enum WindowCommand {
|
pub enum WindowCommand {
|
||||||
Redraw,
|
Redraw,
|
||||||
RequestClose,
|
RequestClose,
|
||||||
|
|
@ -2079,7 +2079,7 @@ fn default_family(query: Family<'_>) -> Option<FamilyOwned> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A handle to an open Cushy window.
|
/// A handle to an open Cushy window.
|
||||||
#[derive(Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct WindowHandle {
|
pub struct WindowHandle {
|
||||||
inner: InnerWindowHandle,
|
inner: InnerWindowHandle,
|
||||||
pub(crate) redraw_status: InvalidationStatus,
|
pub(crate) redraw_status: InvalidationStatus,
|
||||||
|
|
@ -2140,7 +2140,7 @@ impl Hash for WindowHandle {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Debug, Clone)]
|
||||||
enum InnerWindowHandle {
|
enum InnerWindowHandle {
|
||||||
Pending(Arc<PendingWindowHandle>),
|
Pending(Arc<PendingWindowHandle>),
|
||||||
Known(kludgine::app::WindowHandle<WindowCommand>),
|
Known(kludgine::app::WindowHandle<WindowCommand>),
|
||||||
|
|
@ -2233,7 +2233,7 @@ impl PendingWindow {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Debug, Default)]
|
||||||
struct PendingWindowHandle {
|
struct PendingWindowHandle {
|
||||||
handle: OnceLock<kludgine::app::WindowHandle<WindowCommand>>,
|
handle: OnceLock<kludgine::app::WindowHandle<WindowCommand>>,
|
||||||
commands: Mutex<Vec<WindowCommand>>,
|
commands: Mutex<Vec<WindowCommand>>,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue