summaryrefslogtreecommitdiffstats
path: root/pure/src/lib.rs
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2022-02-11 17:50:12 +0700
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2022-02-11 17:50:12 +0700
commit897188317b5875cc00a0f1c797790df8ac13687f (patch)
tree2a2eeedc8d582f616eaa0030000d15d403c1092b /pure/src/lib.rs
parente03de019881f31d69b70a64c3e278ae5200d5080 (diff)
downloadiced-897188317b5875cc00a0f1c797790df8ac13687f.tar.gz
iced-897188317b5875cc00a0f1c797790df8ac13687f.tar.bz2
iced-897188317b5875cc00a0f1c797790df8ac13687f.zip
Rename `iced_virtual` to `iced_pure`
`virtual` is a reserved keyword in Rust :grimacing:
Diffstat (limited to 'pure/src/lib.rs')
-rw-r--r--pure/src/lib.rs146
1 files changed, 146 insertions, 0 deletions
diff --git a/pure/src/lib.rs b/pure/src/lib.rs
new file mode 100644
index 00000000..4381bfc8
--- /dev/null
+++ b/pure/src/lib.rs
@@ -0,0 +1,146 @@
+pub mod widget;
+
+pub(crate) mod flex;
+
+pub use widget::*;
+
+use iced_native::event::{self, Event};
+use iced_native::layout::{self, Layout};
+use iced_native::mouse;
+use iced_native::renderer;
+use iced_native::{Clipboard, Hasher, Length, Point, Rectangle, Shell};
+
+pub struct Pure<'a, Message, Renderer> {
+ state: &'a mut State<Message, Renderer>,
+}
+
+impl<'a, Message, Renderer> Pure<'a, Message, Renderer>
+where
+ Message: 'static,
+ Renderer: iced_native::Renderer + 'static,
+{
+ pub fn new(
+ state: &'a mut State<Message, Renderer>,
+ content: impl Into<Element<Message, Renderer>>,
+ ) -> Self {
+ let _ = state.diff(content.into());
+
+ Self { state }
+ }
+}
+
+pub struct State<Message, Renderer> {
+ state_tree: widget::Tree<Message, Renderer>,
+ last_element: Element<Message, Renderer>,
+}
+
+impl<Message, Renderer> State<Message, Renderer>
+where
+ Message: 'static,
+ Renderer: iced_native::Renderer + 'static,
+{
+ pub fn new() -> Self {
+ let last_element = Element::new(widget::Column::new());
+
+ Self {
+ state_tree: widget::Tree::new(&last_element),
+ last_element,
+ }
+ }
+
+ fn diff(&mut self, new_element: Element<Message, Renderer>) {
+ self.state_tree.diff(&self.last_element, &new_element);
+
+ self.last_element = new_element;
+ }
+}
+
+impl<'a, Message, Renderer> iced_native::Widget<Message, Renderer>
+ for Pure<'a, Message, Renderer>
+where
+ Renderer: iced_native::Renderer,
+{
+ fn width(&self) -> Length {
+ self.state.last_element.as_widget().width()
+ }
+
+ fn height(&self) -> Length {
+ self.state.last_element.as_widget().height()
+ }
+
+ fn hash_layout(&self, state: &mut Hasher) {
+ self.state.last_element.as_widget().hash_layout(state)
+ }
+
+ fn layout(
+ &self,
+ renderer: &Renderer,
+ limits: &layout::Limits,
+ ) -> layout::Node {
+ self.state.last_element.as_widget().layout(renderer, limits)
+ }
+
+ fn on_event(
+ &mut self,
+ event: Event,
+ layout: Layout<'_>,
+ cursor_position: Point,
+ renderer: &Renderer,
+ clipboard: &mut dyn Clipboard,
+ shell: &mut Shell<'_, Message>,
+ ) -> event::Status {
+ self.state.last_element.as_widget_mut().on_event(
+ &mut self.state.state_tree,
+ event,
+ layout,
+ cursor_position,
+ renderer,
+ clipboard,
+ shell,
+ )
+ }
+
+ fn draw(
+ &self,
+ renderer: &mut Renderer,
+ style: &renderer::Style,
+ layout: Layout<'_>,
+ cursor_position: Point,
+ viewport: &Rectangle,
+ ) {
+ self.state.last_element.as_widget().draw(
+ &self.state.state_tree,
+ renderer,
+ style,
+ layout,
+ cursor_position,
+ viewport,
+ )
+ }
+
+ fn mouse_interaction(
+ &self,
+ layout: Layout<'_>,
+ cursor_position: Point,
+ viewport: &Rectangle,
+ renderer: &Renderer,
+ ) -> mouse::Interaction {
+ self.state.last_element.as_widget().mouse_interaction(
+ &self.state.state_tree,
+ layout,
+ cursor_position,
+ viewport,
+ renderer,
+ )
+ }
+}
+
+impl<'a, Message, Renderer> Into<iced_native::Element<'a, Message, Renderer>>
+ for Pure<'a, Message, Renderer>
+where
+ Renderer: iced_native::Renderer,
+{
+ fn into(self) -> iced_native::Element<'a, Message, Renderer> {
+ iced_native::Element::new(self)
+ }
+}