Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
EqualMa committed Sep 12, 2023
1 parent 85431f9 commit f43ac85
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 87 deletions.
49 changes: 19 additions & 30 deletions crates/frender-csr-web/src/renderer.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
use std::borrow::Cow;

use frender_html::{
renderer::{CreateElementOfType, RenderTextFrom},
RenderHtml,
};
use frender_html::{renderer::RenderTextFrom, RenderHtml};
use wasm_bindgen::{JsCast, UnwrapThrowExt};

use crate::try_behavior::{TryBehavior, TryWithTryBehavior};
Expand Down Expand Up @@ -172,35 +169,20 @@ impl<V: ?Sized + to_text_node::ToTextNode, TB: TryBehavior> RenderTextFrom<Node<
}
}

impl<TB: TryBehavior, ET: frender_html::renderer::ElementType<Element<Self> = Node<E>>, E>
CreateElementOfType<ET> for Renderer<'_, TB>
where
E: JsCast,
{
fn create_element_of_type(
&mut self,
) -> <ET as frender_html::renderer::ElementType>::Element<Self>
where
Self: RenderHtml,
{
let element = self
.document
.create_element(ET::INTRINSIC_COMPONENT_TAG)
.unwrap_with_behavior(&mut self.try_behavior);
Node(
element
.dyn_into()
.unwrap_with_behavior(&mut self.try_behavior),
)
}
}

impl<TB: TryBehavior> RenderHtml for Renderer<'_, TB> {
type EventListenerId = gloo_events::EventListener;
type Event = web_sys::Event;
type Text = Node<web_sys::Text>;

type div = Node<web_sys::HtmlDivElement>;

fn div(&mut self) -> Self::div {
let element = self
.document
.create_element(<frender_html::element_types::div as frender_html::renderer::HasIntrinsicComponentTag>::INTRINSIC_COMPONENT_TAG)
.unwrap_with_behavior(&mut self.try_behavior);
Node(element.unchecked_into())
}
}

pub struct Node<N>(N);
Expand All @@ -214,12 +196,19 @@ mod node {

impl<'a, TB: TryBehavior> Renderer<'a, TB> {
fn readd_node(&mut self, node: &web_sys::Node, force_reposition: bool) {
web_sys::console::log_3(&"readd_node".into(), node, &force_reposition.into());
if force_reposition {
match &self.next_node_position {
NextNodePosition::FirstChildOf(parent) => parent
.prepend_with_node_1(node)
.unwrap_with_behavior(&mut self.try_behavior),
NextNodePosition::FirstChildOf(parent) => {
web_sys::console::log_2(&"FirstChildOf".into(), parent);

parent
.prepend_with_node_1(node)
.unwrap_with_behavior(&mut self.try_behavior)
}
NextNodePosition::InsertAfter(pre) => {
web_sys::console::log_2(&"InsertAfter".into(), pre);

pre.parent_node()
.unwrap()
.insert_before(node, pre.next_sibling().as_ref())
Expand Down
73 changes: 37 additions & 36 deletions crates/frender-html-simple/src/component.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ pub trait ElementWithChildren<Children> {
mod imp {
use frender_csr::element::intrinsic::ElementAndMounted;
use frender_html::{
renderer::{node_behaviors, CreateElementOfType},
renderer::{node_behaviors, CreateElement},
Element, ElementOfType, IntrinsicComponent, RenderHtml, RenderState,
UpdateElementNonReactive,
};
Expand Down Expand Up @@ -206,34 +206,33 @@ mod imp {
children,
attributes,
} = P::into_element_props(self.1);
if let Some(element_and_mounted) = render_state.element_and_mounted {
update_element_maybe_reposition(
element_and_mounted,
renderer,
|element, renderer| {
<P::Attrs>::update_element_non_reactive(
attributes,
renderer,
element,
props_state.attrs_state,
);
<C::ElementTagType as frender_html::ElementSupportChildren<P::Children>>::children_render_update(

let element_and_mounted =
render_state
.element_and_mounted
.get_or_insert_with(|| ElementAndMounted {
element: <C::ElementType as CreateElement>::create_element(renderer),
mounted: false,
});

update_element_maybe_reposition(
element_and_mounted,
renderer,
|element, renderer| {
<P::Attrs>::update_element_non_reactive(
attributes,
renderer,
element,
props_state.attrs_state,
);
<C::ElementTagType as frender_html::ElementSupportChildren<P::Children>>::children_render_update(
children,
renderer,
props_state.children_render_state,
)
},
force_reposition,
)
} else {
*render_state.element_and_mounted = Some(ElementAndMounted {
element:
<Renderer as CreateElementOfType<C::ElementType>>::create_element_of_type(
renderer,
),
mounted: true,
});
}
},
force_reposition,
)
}
}

Expand All @@ -248,22 +247,24 @@ mod imp {
) {
let ElementAndMounted { element, mounted } = element_and_mounted;

{
element.move_cursor_at_the_first_child_of_self(renderer);
update(element, renderer);
};

if *mounted && !force_reposition {
element.move_cursor_after_self(renderer);
// element.move_cursor_after_self(renderer);
} else {
if *mounted && element.cursor_is_at_self(renderer) {
element.move_cursor_after_self(renderer);
return;
}
// if *mounted && element.cursor_is_at_self(renderer) {
// element.move_cursor_after_self(renderer);
// return;
// }

element.readd_self(renderer, force_reposition);
element.readd_self(renderer, true);
*mounted = true;
}

{
element.move_cursor_at_the_first_child_of_self(renderer);
update(element, renderer);
};

element.move_cursor_after_self(renderer);
}
}

Expand Down
4 changes: 3 additions & 1 deletion crates/frender-html/src/elements/str.rs
Original file line number Diff line number Diff line change
Expand Up @@ -160,8 +160,10 @@ impl<Cache, Text> State<Cache, Text> {
pub fn initialize_with_str<R: RenderHtml<Text = Text>, S>(data: S, renderer: &mut R) -> Self
where
S: RenderingStr<Cache = Cache>,
Text: crate::renderer::node_behaviors::Node<R>,
{
let text = renderer.render_text_from(&*data);
let mut text = renderer.render_text_from(&*data);
text.readd_self(renderer, true);
State {
node: text,
cache: S::create_cache(data),
Expand Down
33 changes: 13 additions & 20 deletions crates/frender-html/src/renderer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ macro_rules! define_node_type_traits {
}
) => {
pub trait $node_type_trait
: HasIntrinsicComponentTag
: HasIntrinsicComponentTag + CreateElement
$(+ $super_trait)? {
type $node_trait<R: ?Sized + crate::RenderHtml>: crate::renderer::node_behaviors::$node_trait<R>
$(+ crate::Identity<This = <Self as $super_trait>::$super_trait_element<R>>)?
Expand Down Expand Up @@ -58,6 +58,7 @@ macro_rules! define_nodes_types {
) => {
$($(
type $tags: crate::renderer::node_behaviors::$node_trait<Self>;
fn $tags(&mut self) -> Self::$tags;
)*)?

expand! { if ($($sub_mods)*) {
Expand All @@ -79,6 +80,12 @@ macro_rules! define_element_type {
const INTRINSIC_COMPONENT_TAG: &'static str = stringify!($tag);
}

impl crate::renderer::CreateElement for $tag {
fn create_element<R: ?Sized + crate::RenderHtml>(renderer: &mut R) -> crate::ElementOfType<Self, R> {
renderer.$tag()
}
}

$(
impl super::$super_trait for $tag {
type $super_trait_element<R: ?Sized + crate::RenderHtml> = R::$tag;
Expand Down Expand Up @@ -159,9 +166,6 @@ macro_rules! trait_create_element {

macro_rules! define {
(
$vis_create_element:vis trait $trait_create_element:ident {
}

#[alias($element_type_traits:ident)]
$vis_element_types:vis mod $element_types:ident {
$($element_types_defs:tt)*
Expand All @@ -171,11 +175,6 @@ macro_rules! define {
$($render_html_items:tt)*
}
) => {
trait_create_element! {
[$vis_create_element trait $trait_create_element]
{$($element_types_defs)*}
[]
}
define_node_type_traits! { $($element_types_defs)* }
$vis_element_types mod $element_types {
mod_element_types! { $($element_types_defs)* }
Expand Down Expand Up @@ -210,8 +209,6 @@ pub mod element_types {
}

define!(
pub trait CreateElement {}

#[alias(element_type_traits)]
pub mod element_types {
mod Element {
Expand Down Expand Up @@ -240,8 +237,7 @@ define!(
+ RenderTextFrom<Self::Text, f32>
+ RenderTextFrom<Self::Text, f64>
+ RenderTextFrom<Self::Text, bool>
+ RenderTextFrom<Self::Text, char>
+ CreateElement],
+ RenderTextFrom<Self::Text, char>],
)
{
#![allow(non_camel_case_types)]
Expand All @@ -266,17 +262,14 @@ pub trait HasIntrinsicComponentTag {
const INTRINSIC_COMPONENT_TAG: &'static str;
}

pub trait CreateElementOfType<ET: ElementType> {
fn create_element_of_type(&mut self) -> ET::Element<Self>
pub trait CreateElement {
fn create_element<R: RenderHtml>(renderer: &mut R) -> Self::Element<R>
where
Self: RenderHtml;
Self: ElementType;
}

pub trait RenderTextFrom<Text, V: ?Sized> {
// let text = dom_ctx.document.create_text_node(&data);
// dom_ctx
// .next_node_position
// .add_node(Cow::Owned(text.clone().into()));
/// should not move cursor
fn render_text_from(&mut self, v: &V) -> Text;
fn update_text_from(&mut self, text: &mut Text, v: &V);
}
Expand Down

0 comments on commit f43ac85

Please sign in to comment.