mirror of https://github.com/linebender/xilem
Unify names/locations of memoize and adapt.
Also use adapt macro to generate adapt view for xilem.
This commit is contained in:
parent
00dd6c15f3
commit
f99baa3969
|
@ -17,7 +17,6 @@
|
||||||
|
|
||||||
mod any_view;
|
mod any_view;
|
||||||
mod id;
|
mod id;
|
||||||
mod memoize;
|
|
||||||
mod message;
|
mod message;
|
||||||
mod sequence;
|
mod sequence;
|
||||||
mod vec_splice;
|
mod vec_splice;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! impl_adapt_view {
|
macro_rules! generate_adapt_view {
|
||||||
($viewtrait:ident, $cx:ty, $changeflags:ty) => {
|
($viewtrait:ident, $cx:ty, $changeflags:ty) => {
|
||||||
/// A view that wraps a child view and modifies the state that callbacks have access to.
|
/// A view that wraps a child view and modifies the state that callbacks have access to.
|
||||||
///
|
///
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
mod adapt;
|
mod adapt;
|
||||||
|
mod memoize;
|
||||||
|
|
||||||
/// Create the `View` trait for a particular xilem context (e.g. html, native, ...).
|
/// Create the `View` trait for a particular xilem context (e.g. html, native, ...).
|
||||||
///
|
///
|
|
@ -101,7 +101,7 @@ xilem_core::generate_view_trait! {View, DomNode, Cx, ChangeFlags;}
|
||||||
xilem_core::generate_viewsequence_trait! {ViewSequence, View, ViewMarker, DomNode, Cx, ChangeFlags, Pod;}
|
xilem_core::generate_viewsequence_trait! {ViewSequence, View, ViewMarker, DomNode, Cx, ChangeFlags, Pod;}
|
||||||
xilem_core::generate_anyview_trait! {AnyView, View, ViewMarker, Cx, ChangeFlags, AnyNode, BoxedView;}
|
xilem_core::generate_anyview_trait! {AnyView, View, ViewMarker, Cx, ChangeFlags, AnyNode, BoxedView;}
|
||||||
xilem_core::generate_memoize_view! {Memoize, MemoizeState, View, ViewMarker, Cx, ChangeFlags, s, memoize}
|
xilem_core::generate_memoize_view! {Memoize, MemoizeState, View, ViewMarker, Cx, ChangeFlags, s, memoize}
|
||||||
xilem_core::impl_adapt_view! {View, Cx, ChangeFlags}
|
xilem_core::generate_adapt_view! {View, Cx, ChangeFlags}
|
||||||
|
|
||||||
/// This view container can switch between two views.
|
/// This view container can switch between two views.
|
||||||
///
|
///
|
||||||
|
|
|
@ -1,94 +0,0 @@
|
||||||
// Copyright 2022 The Druid Authors.
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
use std::{any::Any, marker::PhantomData};
|
|
||||||
|
|
||||||
use crate::{event::EventResult, id::Id};
|
|
||||||
|
|
||||||
use super::{Cx, View};
|
|
||||||
|
|
||||||
pub struct Adapt<T, A, U, B, F: Fn(&mut T, AdaptThunk<U, B, C>) -> EventResult<A>, C: View<U, B>> {
|
|
||||||
f: F,
|
|
||||||
child: C,
|
|
||||||
phantom: PhantomData<fn() -> (T, A, U, B)>,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// A "thunk" which dispatches an event to an adapt node's child.
|
|
||||||
///
|
|
||||||
/// The closure passed to Adapt should call this thunk with the child's
|
|
||||||
/// app state.
|
|
||||||
pub struct AdaptThunk<'a, U, B, C: View<U, B>> {
|
|
||||||
child: &'a C,
|
|
||||||
state: &'a mut C::State,
|
|
||||||
id_path: &'a [Id],
|
|
||||||
event: Box<dyn Any>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T, A, U, B, F: Fn(&mut T, AdaptThunk<U, B, C>) -> EventResult<A>, C: View<U, B>>
|
|
||||||
Adapt<T, A, U, B, F, C>
|
|
||||||
{
|
|
||||||
pub fn new(f: F, child: C) -> Self {
|
|
||||||
Adapt {
|
|
||||||
f,
|
|
||||||
child,
|
|
||||||
phantom: Default::default(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a, U, B, C: View<U, B>> AdaptThunk<'a, U, B, C> {
|
|
||||||
pub fn call(self, app_state: &mut U) -> EventResult<B> {
|
|
||||||
self.child
|
|
||||||
.event(self.id_path, self.state, self.event, app_state)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T, A, U, B, F: Fn(&mut T, AdaptThunk<U, B, C>) -> EventResult<A> + Send, C: View<U, B>>
|
|
||||||
View<T, A> for Adapt<T, A, U, B, F, C>
|
|
||||||
{
|
|
||||||
type State = C::State;
|
|
||||||
|
|
||||||
type Element = C::Element;
|
|
||||||
|
|
||||||
fn build(&self, cx: &mut Cx) -> (Id, Self::State, Self::Element) {
|
|
||||||
self.child.build(cx)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn rebuild(
|
|
||||||
&self,
|
|
||||||
cx: &mut Cx,
|
|
||||||
prev: &Self,
|
|
||||||
id: &mut Id,
|
|
||||||
state: &mut Self::State,
|
|
||||||
element: &mut Self::Element,
|
|
||||||
) -> bool {
|
|
||||||
self.child.rebuild(cx, &prev.child, id, state, element)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn event(
|
|
||||||
&self,
|
|
||||||
id_path: &[Id],
|
|
||||||
state: &mut Self::State,
|
|
||||||
event: Box<dyn Any>,
|
|
||||||
app_state: &mut T,
|
|
||||||
) -> EventResult<A> {
|
|
||||||
let thunk = AdaptThunk {
|
|
||||||
child: &self.child,
|
|
||||||
state,
|
|
||||||
id_path,
|
|
||||||
event,
|
|
||||||
};
|
|
||||||
(self.f)(app_state, thunk)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -12,7 +12,6 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
// mod adapt;
|
|
||||||
// mod async_list;
|
// mod async_list;
|
||||||
mod button;
|
mod button;
|
||||||
// mod layout_observer;
|
// mod layout_observer;
|
||||||
|
@ -29,4 +28,4 @@ pub use xilem_core::{Id, IdPath, VecSplice};
|
||||||
pub use button::button;
|
pub use button::button;
|
||||||
pub use linear_layout::{h_stack, v_stack, LinearLayout};
|
pub use linear_layout::{h_stack, v_stack, LinearLayout};
|
||||||
pub use list::{list, List};
|
pub use list::{list, List};
|
||||||
pub use view::{Cx, View, ViewMarker, ViewSequence};
|
pub use view::{Adapt, Cx, Memoize, View, ViewMarker, ViewSequence};
|
||||||
|
|
|
@ -27,6 +27,7 @@ xilem_core::generate_view_trait! {View, Widget, Cx, ChangeFlags; : Send}
|
||||||
xilem_core::generate_viewsequence_trait! {ViewSequence, View, ViewMarker, Widget, Cx, ChangeFlags, Pod; : Send}
|
xilem_core::generate_viewsequence_trait! {ViewSequence, View, ViewMarker, Widget, Cx, ChangeFlags, Pod; : Send}
|
||||||
xilem_core::generate_anyview_trait! {AnyView, View, ViewMarker, Cx, ChangeFlags, AnyWidget, BoxedView; + Send}
|
xilem_core::generate_anyview_trait! {AnyView, View, ViewMarker, Cx, ChangeFlags, AnyWidget, BoxedView; + Send}
|
||||||
xilem_core::generate_memoize_view! {Memoize, MemoizeState, View, ViewMarker, Cx, ChangeFlags, s, memoize}
|
xilem_core::generate_memoize_view! {Memoize, MemoizeState, View, ViewMarker, Cx, ChangeFlags, s, memoize}
|
||||||
|
xilem_core::generate_adapt_view! {View, Cx, ChangeFlags}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct Cx {
|
pub struct Cx {
|
||||||
|
|
Loading…
Reference in New Issue