diff options
| author | 2020-01-13 20:28:21 +0100 | |
|---|---|---|
| committer | 2020-01-13 20:28:21 +0100 | |
| commit | 142dc1e9628fba934bdfd83f3fbaf0fbfd852285 (patch) | |
| tree | 0da6149ae1c9be912270b74261ad67b906474939 | |
| parent | bad1bab9e894f917e5bfc8bfccfe7763af6d1a67 (diff) | |
| parent | 0cbd6668759c8246c5224b5876e7ef0888fe445f (diff) | |
| download | iced-142dc1e9628fba934bdfd83f3fbaf0fbfd852285.tar.gz iced-142dc1e9628fba934bdfd83f3fbaf0fbfd852285.tar.bz2 iced-142dc1e9628fba934bdfd83f3fbaf0fbfd852285.zip | |
Merge pull request #155 from ejmahler/remove-clone
Remove Clone bound on Application::Message
| -rw-r--r-- | native/src/element.rs | 6 | ||||
| -rw-r--r-- | src/application.rs | 2 | ||||
| -rw-r--r-- | src/sandbox.rs | 2 | ||||
| -rw-r--r-- | web/src/bus.rs | 11 | ||||
| -rw-r--r-- | web/src/element.rs | 8 | ||||
| -rw-r--r-- | web/src/lib.rs | 18 | ||||
| -rw-r--r-- | web/src/widget/checkbox.rs | 15 | ||||
| -rw-r--r-- | web/src/widget/scrollable.rs | 2 | ||||
| -rw-r--r-- | web/src/widget/slider.rs | 4 | ||||
| -rw-r--r-- | web/src/widget/text_input.rs | 2 | 
10 files changed, 44 insertions, 26 deletions
| diff --git a/native/src/element.rs b/native/src/element.rs index fab73f77..ae47e893 100644 --- a/native/src/element.rs +++ b/native/src/element.rs @@ -171,7 +171,7 @@ where      /// ```      pub fn map<F, B>(self, f: F) -> Element<'a, B, Renderer>      where -        Message: 'static + Clone, +        Message: 'static,          Renderer: 'a,          B: 'static,          F: 'static + Fn(Message) -> B, @@ -269,7 +269,6 @@ impl<'a, A, B, Renderer> Map<'a, A, B, Renderer> {  impl<'a, A, B, Renderer> Widget<B, Renderer> for Map<'a, A, B, Renderer>  where -    A: Clone,      Renderer: crate::Renderer,  {      fn width(&self) -> Length { @@ -309,8 +308,7 @@ where          );          original_messages -            .iter() -            .cloned() +            .drain(..)              .for_each(|message| messages.push((self.mapper)(message)));      } diff --git a/src/application.rs b/src/application.rs index 7dd76774..5ea64ba8 100644 --- a/src/application.rs +++ b/src/application.rs @@ -83,7 +83,7 @@ pub trait Application: Sized {      /// The type of __messages__ your [`Application`] will produce.      ///      /// [`Application`]: trait.Application.html -    type Message: std::fmt::Debug + Send + Clone; +    type Message: std::fmt::Debug + Send;      /// Initializes the [`Application`].      /// diff --git a/src/sandbox.rs b/src/sandbox.rs index 75020b16..dda4c3f5 100644 --- a/src/sandbox.rs +++ b/src/sandbox.rs @@ -81,7 +81,7 @@ pub trait Sandbox {      /// The type of __messages__ your [`Sandbox`] will produce.      ///      /// [`Sandbox`]: trait.Sandbox.html -    type Message: std::fmt::Debug + Send + Clone; +    type Message: std::fmt::Debug + Send;      /// Initializes the [`Sandbox`].      /// diff --git a/web/src/bus.rs b/web/src/bus.rs index 1b650b28..b3984aff 100644 --- a/web/src/bus.rs +++ b/web/src/bus.rs @@ -8,14 +8,21 @@ use std::rc::Rc;  ///  /// [`Application`]: trait.Application.html  #[allow(missing_debug_implementations)] -#[derive(Clone)]  pub struct Bus<Message> {      publish: Rc<Box<dyn Fn(Message, &mut dyn dodrio::RootRender)>>,  } +impl<Message> Clone for Bus<Message> { +    fn clone(&self) -> Self { +        Self { +            publish: Rc::clone(&self.publish), +        } +    } +} +  impl<Message> Bus<Message>  where -    Message: 'static + Clone, +    Message: 'static,  {      pub(crate) fn new() -> Self {          Self { diff --git a/web/src/element.rs b/web/src/element.rs index 85fa7c34..0315d7d6 100644 --- a/web/src/element.rs +++ b/web/src/element.rs @@ -38,8 +38,8 @@ impl<'a, Message> Element<'a, Message> {      /// [`Element`]: struct.Element.html      pub fn map<F, B>(self, f: F) -> Element<'a, B>      where -        Message: 'static + Clone, -        B: 'static + Clone, +        Message: 'static, +        B: 'static,          F: 'static + Fn(Message) -> B,      {          Element { @@ -82,8 +82,8 @@ impl<'a, A, B> Map<'a, A, B> {  impl<'a, A, B> Widget<B> for Map<'a, A, B>  where -    A: 'static + Clone, -    B: 'static + Clone, +    A: 'static, +    B: 'static,  {      fn node<'b>(          &self, diff --git a/web/src/lib.rs b/web/src/lib.rs index d4c422d2..7ea22e85 100644 --- a/web/src/lib.rs +++ b/web/src/lib.rs @@ -91,7 +91,7 @@ pub trait Application {      /// The type of __messages__ your [`Application`] will produce.      ///      /// [`Application`]: trait.Application.html -    type Message: Clone; +    type Message;      /// Initializes the [`Application`].      /// @@ -148,16 +148,26 @@ pub trait Application {      }  } -#[derive(Clone)] +  struct Instance<Message> {      title: String,      ui: Rc<RefCell<Box<dyn Application<Message = Message>>>>,      vdom: Rc<RefCell<Option<dodrio::VdomWeak>>>,  } +impl<Message> Clone for Instance<Message> { +    fn clone(&self) -> Self { +        Self { +            title: self.title.clone(), +            ui: Rc::clone(&self.ui), +            vdom: Rc::clone(&self.vdom), +        } +    } +} +  impl<Message> Instance<Message>  where -    Message: 'static + Clone, +    Message: 'static  {      fn new(ui: impl Application<Message = Message> + 'static) -> Self {          Self { @@ -221,7 +231,7 @@ where  impl<Message> dodrio::Render for Instance<Message>  where -    Message: 'static + Clone, +    Message: 'static,  {      fn render<'a, 'bump>(          &'a self, diff --git a/web/src/widget/checkbox.rs b/web/src/widget/checkbox.rs index b81a0d52..34d13a1b 100644 --- a/web/src/widget/checkbox.rs +++ b/web/src/widget/checkbox.rs @@ -1,6 +1,7 @@  use crate::{style, Bus, Color, Element, Widget};  use dodrio::bumpalo; +use std::rc::Rc;  /// A box that can be checked.  /// @@ -22,7 +23,7 @@ use dodrio::bumpalo;  #[allow(missing_debug_implementations)]  pub struct Checkbox<Message> {      is_checked: bool, -    on_toggle: Box<dyn Fn(bool) -> Message>, +    on_toggle: Rc<dyn Fn(bool) -> Message>,      label: String,      label_color: Option<Color>,  } @@ -44,7 +45,7 @@ impl<Message> Checkbox<Message> {      {          Checkbox {              is_checked, -            on_toggle: Box::new(f), +            on_toggle: Rc::new(f),              label: String::from(label),              label_color: None,          } @@ -61,7 +62,7 @@ impl<Message> Checkbox<Message> {  impl<Message> Widget<Message> for Checkbox<Message>  where -    Message: 'static + Clone, +    Message: 'static,  {      fn node<'b>(          &self, @@ -74,7 +75,8 @@ where          let checkbox_label = bumpalo::format!(in bump, "{}", self.label);          let event_bus = bus.clone(); -        let msg = (self.on_toggle)(!self.is_checked); +        let on_toggle = self.on_toggle.clone(); +        let is_checked = self.is_checked;          // TODO: Complete styling          label(bump) @@ -83,7 +85,8 @@ where                      .attr("type", "checkbox")                      .bool_attr("checked", self.is_checked)                      .on("click", move |root, vdom, _event| { -                        event_bus.publish(msg.clone(), root); +                        let msg = on_toggle(!is_checked); +                        event_bus.publish(msg, root);                          vdom.schedule_render();                      }) @@ -96,7 +99,7 @@ where  impl<'a, Message> From<Checkbox<Message>> for Element<'a, Message>  where -    Message: 'static + Clone, +    Message: 'static,  {      fn from(checkbox: Checkbox<Message>) -> Element<'a, Message> {          Element::new(checkbox) diff --git a/web/src/widget/scrollable.rs b/web/src/widget/scrollable.rs index 710bb70a..f146e007 100644 --- a/web/src/widget/scrollable.rs +++ b/web/src/widget/scrollable.rs @@ -134,7 +134,7 @@ where  impl<'a, Message> From<Scrollable<'a, Message>> for Element<'a, Message>  where -    Message: 'static + Clone, +    Message: 'static,  {      fn from(scrollable: Scrollable<'a, Message>) -> Element<'a, Message> {          Element::new(scrollable) diff --git a/web/src/widget/slider.rs b/web/src/widget/slider.rs index 5b203e07..fc955781 100644 --- a/web/src/widget/slider.rs +++ b/web/src/widget/slider.rs @@ -82,7 +82,7 @@ impl<'a, Message> Slider<'a, Message> {  impl<'a, Message> Widget<Message> for Slider<'a, Message>  where -    Message: 'static + Clone, +    Message: 'static,  {      fn node<'b>(          &self, @@ -130,7 +130,7 @@ where  impl<'a, Message> From<Slider<'a, Message>> for Element<'a, Message>  where -    Message: 'static + Clone, +    Message: 'static,  {      fn from(slider: Slider<'a, Message>) -> Element<'a, Message> {          Element::new(slider) diff --git a/web/src/widget/text_input.rs b/web/src/widget/text_input.rs index eedc25bc..a478874a 100644 --- a/web/src/widget/text_input.rs +++ b/web/src/widget/text_input.rs @@ -82,7 +82,7 @@ impl<'a, Message> TextInput<'a, Message> {          self.is_secure = true;          self      } -     +      /// Sets the width of the [`TextInput`].      ///      /// [`TextInput`]: struct.TextInput.html | 
