summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón <hector0193@gmail.com>2020-01-13 20:28:21 +0100
committerLibravatar GitHub <noreply@github.com>2020-01-13 20:28:21 +0100
commit142dc1e9628fba934bdfd83f3fbaf0fbfd852285 (patch)
tree0da6149ae1c9be912270b74261ad67b906474939
parentbad1bab9e894f917e5bfc8bfccfe7763af6d1a67 (diff)
parent0cbd6668759c8246c5224b5876e7ef0888fe445f (diff)
downloadiced-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.rs6
-rw-r--r--src/application.rs2
-rw-r--r--src/sandbox.rs2
-rw-r--r--web/src/bus.rs11
-rw-r--r--web/src/element.rs8
-rw-r--r--web/src/lib.rs18
-rw-r--r--web/src/widget/checkbox.rs15
-rw-r--r--web/src/widget/scrollable.rs2
-rw-r--r--web/src/widget/slider.rs4
-rw-r--r--web/src/widget/text_input.rs2
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