Struct DynamicUi

Source
pub struct DynamicUi<T: DynamicUiWrapper> {
    ui_list: RefCell<Vec<PluginData<T>>>,
    event_queue: RefCell<VecDeque<Box<dyn FnOnce(&Rc<T>)>>>,
    delay_events: Cell<bool>,
    should_destroy: Cell<bool>,
    event_handlers: RefCell<Vec<EventHandlerData>>,
    prevent_recursive_events: Cell<bool>,
    self_wrapper_ty: PhantomData<T>,
}
Expand description

Stores many [nwg::PartialUi] type. Usually behind an Rc pointer stored inside DynamicUiRef.

Fields§

§ui_list: RefCell<Vec<PluginData<T>>>

Can be mutably borrowed when rebuilding. The type id indicates which plugin owns the parent control.

§Lock pattern

For write locks:

  1. Check if Self::delay_events is set and if so don’t acquire a lock.
  2. Create a DelayEventsGuard that sets the Self::delay_events field to true (and then to false when dropped)
  3. Acquiring the std::cell::RefMut guard.
  4. Don’t call into plugin hooks while holding the guard.

For read locks:

These should be okay everywhere except in functions that use DelayEventsGuard.

§event_queue: RefCell<VecDeque<Box<dyn FnOnce(&Rc<T>)>>>

Used to store events that should be handled after rebuilding some plugins.

§delay_events: Cell<bool>

Used to delay events while rebuilding. We take mutable references to plugins while rebuilding so this prevents issues where events are handled recursively while building new UI elements.

§should_destroy: Cell<bool>

true if the UI should be destroyed.

§event_handlers: RefCell<Vec<EventHandlerData>>

Event handlers that are bound to plugin windows.

Raw event handlers can fail to be registered in which case we ignore the error (this only happens if raw event handler was registered previously with the same id for the same window).

§prevent_recursive_events: Cell<bool>

Prevent recursive event handling.

§self_wrapper_ty: PhantomData<T>

Implementations§

Source§

impl<T> DynamicUi<T>

Source

pub fn new(ui_list: Vec<Box<T::Hooks>>) -> Self

Source

pub fn set_prevent_recursive_events(&self, value: bool)

Source

pub fn with_paused_events<R>(&self, f: impl FnOnce() -> R) -> R

Run some code while delaying other event handlers.

Source

pub fn get_ui<U: DynamicUiHooks<T>>(&self) -> Option<Ref<'_, U>>

Get a reference to a ui item managed by this dynamic ui.

Warning: the returned ui item might not have been built.

Source

pub fn with_all_ui<R>( &self, f: impl FnOnce(&mut dyn Iterator<Item = &T::Hooks>) -> R, ) -> R

Source

pub fn for_each_ui(&self, f: impl FnMut(&T::Hooks))

Source

pub fn maybe_preform_action<R>( wrapper: &Rc<T>, action: impl FnOnce(&Rc<T>) -> R, ) -> Option<R>

Preforms an action and rebuilds the UI if needed. The action will be skipped if the UI is currently being rebuilt.

Source

pub fn preform_action<R>( wrapper: &Rc<T>, action: impl FnOnce(&Rc<T>, bool) -> R + 'static, ) -> Option<R>

Preforms an action and then rebuilds the UI if needed. The action will be queued if UI is currently being rebuilt.

The action will be called with the wrapper and a bool that is true if the action was delayed.

Source

pub fn preform_action_adv<S>( wrapper: &Rc<T>, state: S, delay_action: impl FnOnce(S) -> Option<Box<dyn FnOnce(&Rc<T>) + 'static>>, preform_action: impl FnOnce(S), )

Source

fn preform_action_and_maybe_rebuild( wrapper: &Rc<T>, action: Option<&mut dyn FnMut(&Rc<T>)>, )

Source

fn initial_build(wrapper: &Rc<T>) -> Result<(), NwgError>

Source

fn all_handles(wrapper: &Rc<T>) -> Vec<(TypeId, bool, ControlHandle)>

Source

fn process_events_for_plugin_and_children( wrapper: &Rc<T>, plugin_id: TypeId, f: impl FnMut(&PluginData<T>), )

Source

fn process_event( wrapper: &Rc<T>, evt: Event, evt_data: &EventData, handle: ControlHandle, window: ControlHandle, plugin_id: TypeId, )

Source

fn process_raw_event( wrapper: &Rc<T>, hwnd: isize, msg: u32, w: usize, l: isize, window: ControlHandle, plugin_id: TypeId, ) -> Option<isize>

Source

fn unbind_specific_event_handlers( wrapper: &Rc<T>, window_handles: &[&ControlHandle], )

Source

fn unbind_event_handlers(wrapper: &Rc<T>)

Source

fn bind_event_handlers(wrapper: &Rc<T>)

Source

fn destroy_ui(wrapper: &Rc<T>)

To make sure that everything is freed without issues, the default handler must be unbound.

Trait Implementations§

Source§

impl<T> Debug for DynamicUi<T>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<T: DynamicUiWrapper> Default for DynamicUi<T>

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl<T> !Freeze for DynamicUi<T>

§

impl<T> !RefUnwindSafe for DynamicUi<T>

§

impl<T> !Send for DynamicUi<T>

§

impl<T> !Sync for DynamicUi<T>

§

impl<T> Unpin for DynamicUi<T>
where T: Unpin,

§

impl<T> !UnwindSafe for DynamicUi<T>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<Src, Scheme> ApproxFrom<Src, Scheme> for Src
where Scheme: ApproxScheme,

§

type Err = NoError

The error type produced by a failed conversion.
§

fn approx_from(src: Src) -> Result<Src, <Src as ApproxFrom<Src, Scheme>>::Err>

Convert the given value into an approximately equivalent representation.
§

impl<Dst, Src, Scheme> ApproxInto<Dst, Scheme> for Src
where Dst: ApproxFrom<Src, Scheme>, Scheme: ApproxScheme,

§

type Err = <Dst as ApproxFrom<Src, Scheme>>::Err

The error type produced by a failed conversion.
§

fn approx_into(self) -> Result<Dst, <Src as ApproxInto<Dst, Scheme>>::Err>

Convert the subject into an approximately equivalent representation.
Source§

impl<T> AsAny for T
where T: 'static,

Source§

fn as_any(&self) -> &(dyn Any + 'static)

Source§

fn type_name(&self) -> &'static str

Source§

fn swap_dyn(&mut self, other: &mut (dyn Any + 'static)) -> bool

Swap 2 values. Returns true if both values had the same type and so the swap was successful.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T, Dst> ConvAsUtil<Dst> for T

§

fn approx(self) -> Result<Dst, Self::Err>
where Self: Sized + ApproxInto<Dst>,

Approximate the subject with the default scheme.
§

fn approx_by<Scheme>(self) -> Result<Dst, Self::Err>
where Self: Sized + ApproxInto<Dst, Scheme>, Scheme: ApproxScheme,

Approximate the subject with a specific scheme.
§

impl<T> ConvUtil for T

§

fn approx_as<Dst>(self) -> Result<Dst, Self::Err>
where Self: Sized + ApproxInto<Dst>,

Approximate the subject to a given type with the default scheme.
§

fn approx_as_by<Dst, Scheme>(self) -> Result<Dst, Self::Err>
where Self: Sized + ApproxInto<Dst, Scheme>, Scheme: ApproxScheme,

Approximate the subject to a given type with a specific scheme.
§

fn into_as<Dst>(self) -> Dst
where Self: Sized + Into<Dst>,

Convert the subject to a given type.
§

fn try_as<Dst>(self) -> Result<Dst, Self::Err>
where Self: Sized + TryInto<Dst>,

Attempt to convert the subject to a given type.
§

fn value_as<Dst>(self) -> Result<Dst, Self::Err>
where Self: Sized + ValueInto<Dst>,

Attempt a value conversion of the subject to a given type.
Source§

impl<T> DynWithDefault for T
where T: Default + AsAny + 'static,

Source§

fn with_default_mut( &mut self, f: &mut dyn FnMut(&mut dyn DynWithDefault, &mut (dyn Any + 'static)), )

Create a temporary default value of the current type and provide it in a closure. The callback’s first argument is self and the second argument is the new temporary default value. The callback can then modify the value as needed.
Source§

fn clear_and_inspect_old( &mut self, f: &mut dyn FnMut(&mut dyn DynWithDefault, &mut (dyn Any + 'static)), )

Set self to a new default value and inspect the previous value as the second argument to the callback.
Source§

fn clear(&mut self)

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
§

impl<Src> TryFrom<Src> for Src

§

type Err = NoError

The error type produced by a failed conversion.
§

fn try_from(src: Src) -> Result<Src, <Src as TryFrom<Src>>::Err>

Convert the given value into the subject type.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
§

impl<Src, Dst> TryInto<Dst> for Src
where Dst: TryFrom<Src>,

§

type Err = <Dst as TryFrom<Src>>::Err

The error type produced by a failed conversion.
§

fn try_into(self) -> Result<Dst, <Src as TryInto<Dst>>::Err>

Convert the subject into the destination type.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<Src> ValueFrom<Src> for Src

§

type Err = NoError

The error type produced by a failed conversion.
§

fn value_from(src: Src) -> Result<Src, <Src as ValueFrom<Src>>::Err>

Convert the given value into an exactly equivalent representation.
§

impl<Src, Dst> ValueInto<Dst> for Src
where Dst: ValueFrom<Src>,

§

type Err = <Dst as ValueFrom<Src>>::Err

The error type produced by a failed conversion.
§

fn value_into(self) -> Result<Dst, <Src as ValueInto<Dst>>::Err>

Convert the subject into an exactly equivalent representation.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more