Make iced_core::Button customizable
Now it supports: - Any kind of content - Custom border radius - Custom background
This commit is contained in:
parent
a0234d5bce
commit
10e10e5e06
35 changed files with 288 additions and 160 deletions
|
|
@ -41,6 +41,10 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
pub fn node(&self, renderer: &Renderer) -> Node {
|
||||
self.widget.node(renderer)
|
||||
}
|
||||
|
||||
pub fn draw(
|
||||
&self,
|
||||
renderer: &mut Renderer,
|
||||
|
|
@ -97,22 +101,22 @@ where
|
|||
///
|
||||
/// ```
|
||||
/// # mod counter {
|
||||
/// # use iced_native::{button, Button};
|
||||
/// # use iced_native::{text, Text};
|
||||
/// #
|
||||
/// # #[derive(Debug, Clone, Copy)]
|
||||
/// # pub enum Message {}
|
||||
/// # pub struct Counter(button::State);
|
||||
/// # pub struct Counter;
|
||||
/// #
|
||||
/// # impl Counter {
|
||||
/// # pub fn view(&mut self) -> Button<Message> {
|
||||
/// # Button::new(&mut self.0, "_")
|
||||
/// # pub fn view(&mut self) -> Text {
|
||||
/// # Text::new("")
|
||||
/// # }
|
||||
/// # }
|
||||
/// # }
|
||||
/// #
|
||||
/// # mod iced_wgpu {
|
||||
/// # use iced_native::{
|
||||
/// # button, row, Button, Node, Point, Rectangle, Style, Layout, Row
|
||||
/// # text, row, Text, Node, Point, Rectangle, Style, Layout, Row
|
||||
/// # };
|
||||
/// # pub struct Renderer;
|
||||
/// #
|
||||
|
|
@ -127,16 +131,15 @@ where
|
|||
/// # ) {}
|
||||
/// # }
|
||||
/// #
|
||||
/// # impl button::Renderer for Renderer {
|
||||
/// # fn node<Message>(&self, _button: &Button<'_, Message>) -> Node {
|
||||
/// # impl text::Renderer for Renderer {
|
||||
/// # fn node(&self, _text: &Text) -> Node {
|
||||
/// # Node::new(Style::default())
|
||||
/// # }
|
||||
/// #
|
||||
/// # fn draw<Message>(
|
||||
/// # fn draw(
|
||||
/// # &mut self,
|
||||
/// # _button: &Button<'_, Message>,
|
||||
/// # _text: &Text,
|
||||
/// # _layout: Layout<'_>,
|
||||
/// # _cursor_position: Point,
|
||||
/// # ) {}
|
||||
/// # }
|
||||
/// # }
|
||||
|
|
@ -289,7 +292,7 @@ where
|
|||
A: Copy,
|
||||
Renderer: crate::Renderer,
|
||||
{
|
||||
fn node(&self, renderer: &mut Renderer) -> Node {
|
||||
fn node(&self, renderer: &Renderer) -> Node {
|
||||
self.widget.node(renderer)
|
||||
}
|
||||
|
||||
|
|
@ -359,7 +362,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>
|
|||
where
|
||||
Renderer: crate::Renderer + renderer::Debugger,
|
||||
{
|
||||
fn node(&self, renderer: &mut Renderer) -> Node {
|
||||
fn node(&self, renderer: &Renderer) -> Node {
|
||||
self.element.widget.node(renderer)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -89,14 +89,14 @@
|
|||
//! # impl button::Renderer for Renderer {
|
||||
//! # fn node<Message>(
|
||||
//! # &self,
|
||||
//! # _button: &Button<'_, Message>
|
||||
//! # _button: &Button<'_, Message, Self>
|
||||
//! # ) -> Node {
|
||||
//! # Node::new(Style::default())
|
||||
//! # }
|
||||
//! #
|
||||
//! # fn draw<Message>(
|
||||
//! # &mut self,
|
||||
//! # _button: &Button<'_, Message>,
|
||||
//! # _button: &Button<'_, Message, Self>,
|
||||
//! # _layout: Layout<'_>,
|
||||
//! # _cursor_position: Point,
|
||||
//! # ) {}
|
||||
|
|
@ -125,7 +125,7 @@
|
|||
//! .push(
|
||||
//! // The increment button. We tell it to produce an
|
||||
//! // `IncrementPressed` message when pressed
|
||||
//! Button::new(&mut self.increment_button, "+")
|
||||
//! Button::new(&mut self.increment_button, Text::new("+"))
|
||||
//! .on_press(Message::IncrementPressed),
|
||||
//! )
|
||||
//! .push(
|
||||
|
|
@ -135,7 +135,7 @@
|
|||
//! .push(
|
||||
//! // The decrement button. We tell it to produce a
|
||||
//! // `DecrementPressed` message when pressed
|
||||
//! Button::new(&mut self.decrement_button, "-")
|
||||
//! Button::new(&mut self.decrement_button, Text::new("-"))
|
||||
//! .on_press(Message::DecrementPressed),
|
||||
//! )
|
||||
//! }
|
||||
|
|
@ -212,7 +212,9 @@ mod user_interface;
|
|||
|
||||
pub(crate) use iced_core::Vector;
|
||||
|
||||
pub use iced_core::{Align, Color, Justify, Length, Point, Rectangle};
|
||||
pub use iced_core::{
|
||||
Align, Background, Color, Justify, Length, Point, Rectangle,
|
||||
};
|
||||
|
||||
#[doc(no_inline)]
|
||||
pub use stretch::{geometry::Size, number::Number};
|
||||
|
|
|
|||
|
|
@ -74,12 +74,12 @@ impl Style {
|
|||
self
|
||||
}
|
||||
|
||||
pub(crate) fn align_items(mut self, align: Align) -> Self {
|
||||
pub fn align_items(mut self, align: Align) -> Self {
|
||||
self.0.align_items = into_align_items(align);
|
||||
self
|
||||
}
|
||||
|
||||
pub(crate) fn justify_content(mut self, justify: Justify) -> Self {
|
||||
pub fn justify_content(mut self, justify: Justify) -> Self {
|
||||
self.0.justify_content = into_justify_content(justify);
|
||||
self
|
||||
}
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ where
|
|||
/// [`Node`]: ../struct.Node.html
|
||||
/// [`Widget`]: trait.Widget.html
|
||||
/// [`Layout`]: ../struct.Layout.html
|
||||
fn node(&self, renderer: &mut Renderer) -> Node;
|
||||
fn node(&self, renderer: &Renderer) -> Node;
|
||||
|
||||
/// Draws the [`Widget`] using the associated `Renderer`.
|
||||
///
|
||||
|
|
|
|||
|
|
@ -10,14 +10,18 @@ use crate::input::{mouse, ButtonState};
|
|||
use crate::{Element, Event, Hasher, Layout, Node, Point, Widget};
|
||||
use std::hash::Hash;
|
||||
|
||||
pub use iced_core::button::*;
|
||||
pub use iced_core::button::State;
|
||||
|
||||
impl<'a, Message, Renderer> Widget<Message, Renderer> for Button<'a, Message>
|
||||
pub type Button<'a, Message, Renderer> =
|
||||
iced_core::Button<'a, Message, Element<'a, Message, Renderer>>;
|
||||
|
||||
impl<'a, Message, Renderer> Widget<Message, Renderer>
|
||||
for Button<'a, Message, Renderer>
|
||||
where
|
||||
Renderer: self::Renderer,
|
||||
Message: Copy + std::fmt::Debug,
|
||||
{
|
||||
fn node(&self, renderer: &mut Renderer) -> Node {
|
||||
fn node(&self, renderer: &Renderer) -> Node {
|
||||
renderer.node(&self)
|
||||
}
|
||||
|
||||
|
|
@ -68,9 +72,9 @@ where
|
|||
}
|
||||
|
||||
fn hash_layout(&self, state: &mut Hasher) {
|
||||
self.label.hash(state);
|
||||
self.width.hash(state);
|
||||
self.align_self.hash(state);
|
||||
self.content.hash_layout(state);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -81,31 +85,33 @@ where
|
|||
///
|
||||
/// [`Button`]: struct.Button.html
|
||||
/// [renderer]: ../../renderer/index.html
|
||||
pub trait Renderer: crate::Renderer {
|
||||
pub trait Renderer: crate::Renderer + Sized {
|
||||
/// Creates a [`Node`] for the provided [`Button`].
|
||||
///
|
||||
/// [`Node`]: ../../struct.Node.html
|
||||
/// [`Button`]: struct.Button.html
|
||||
fn node<Message>(&self, button: &Button<'_, Message>) -> Node;
|
||||
fn node<Message>(&self, button: &Button<'_, Message, Self>) -> Node;
|
||||
|
||||
/// Draws a [`Button`].
|
||||
///
|
||||
/// [`Button`]: struct.Button.html
|
||||
fn draw<Message>(
|
||||
&mut self,
|
||||
button: &Button<'_, Message>,
|
||||
button: &Button<'_, Message, Self>,
|
||||
layout: Layout<'_>,
|
||||
cursor_position: Point,
|
||||
) -> Self::Primitive;
|
||||
}
|
||||
|
||||
impl<'a, Message, Renderer> From<Button<'a, Message>>
|
||||
impl<'a, Message, Renderer> From<Button<'a, Message, Renderer>>
|
||||
for Element<'a, Message, Renderer>
|
||||
where
|
||||
Renderer: self::Renderer,
|
||||
Renderer: 'static + self::Renderer,
|
||||
Message: 'static + Copy + std::fmt::Debug,
|
||||
{
|
||||
fn from(button: Button<'a, Message>) -> Element<'a, Message, Renderer> {
|
||||
fn from(
|
||||
button: Button<'a, Message, Renderer>,
|
||||
) -> Element<'a, Message, Renderer> {
|
||||
Element::new(button)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ impl<Message, Renderer> Widget<Message, Renderer> for Checkbox<Message>
|
|||
where
|
||||
Renderer: self::Renderer,
|
||||
{
|
||||
fn node(&self, renderer: &mut Renderer) -> Node {
|
||||
fn node(&self, renderer: &Renderer) -> Node {
|
||||
renderer.node(&self)
|
||||
}
|
||||
|
||||
|
|
@ -64,7 +64,7 @@ pub trait Renderer: crate::Renderer {
|
|||
///
|
||||
/// [`Node`]: ../../struct.Node.html
|
||||
/// [`Checkbox`]: struct.Checkbox.html
|
||||
fn node<Message>(&mut self, checkbox: &Checkbox<Message>) -> Node;
|
||||
fn node<Message>(&self, checkbox: &Checkbox<Message>) -> Node;
|
||||
|
||||
/// Draws a [`Checkbox`].
|
||||
///
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>
|
|||
where
|
||||
Renderer: self::Renderer,
|
||||
{
|
||||
fn node(&self, renderer: &mut Renderer) -> Node {
|
||||
fn node(&self, renderer: &Renderer) -> Node {
|
||||
let mut children: Vec<Node> = self
|
||||
.children
|
||||
.iter()
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ where
|
|||
Renderer: self::Renderer<I>,
|
||||
I: Clone,
|
||||
{
|
||||
fn node(&self, renderer: &mut Renderer) -> Node {
|
||||
fn node(&self, renderer: &Renderer) -> Node {
|
||||
renderer.node(&self)
|
||||
}
|
||||
|
||||
|
|
@ -45,7 +45,7 @@ pub trait Renderer<I>: crate::Renderer {
|
|||
///
|
||||
/// [`Node`]: ../../struct.Node.html
|
||||
/// [`Image`]: struct.Image.html
|
||||
fn node(&mut self, image: &Image<I>) -> Node;
|
||||
fn node(&self, image: &Image<I>) -> Node;
|
||||
|
||||
/// Draws an [`Image`].
|
||||
///
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ where
|
|||
Renderer: self::Renderer,
|
||||
Message: Copy + std::fmt::Debug,
|
||||
{
|
||||
fn node(&self, renderer: &mut Renderer) -> Node {
|
||||
fn node(&self, renderer: &Renderer) -> Node {
|
||||
renderer.node(&self)
|
||||
}
|
||||
|
||||
|
|
@ -61,7 +61,7 @@ pub trait Renderer: crate::Renderer {
|
|||
///
|
||||
/// [`Node`]: ../../struct.Node.html
|
||||
/// [`Radio`]: struct.Radio.html
|
||||
fn node<Message>(&mut self, radio: &Radio<Message>) -> Node;
|
||||
fn node<Message>(&self, radio: &Radio<Message>) -> Node;
|
||||
|
||||
/// Draws a [`Radio`] button.
|
||||
///
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>
|
|||
where
|
||||
Renderer: self::Renderer,
|
||||
{
|
||||
fn node(&self, renderer: &mut Renderer) -> Node {
|
||||
fn node(&self, renderer: &Renderer) -> Node {
|
||||
let mut children: Vec<Node> = self
|
||||
.children
|
||||
.iter()
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer> for Slider<'a, Message>
|
|||
where
|
||||
Renderer: self::Renderer,
|
||||
{
|
||||
fn node(&self, renderer: &mut Renderer) -> Node {
|
||||
fn node(&self, renderer: &Renderer) -> Node {
|
||||
renderer.node(&self)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ impl<Message, Renderer> Widget<Message, Renderer> for Text
|
|||
where
|
||||
Renderer: self::Renderer,
|
||||
{
|
||||
fn node(&self, renderer: &mut Renderer) -> Node {
|
||||
fn node(&self, renderer: &Renderer) -> Node {
|
||||
renderer.node(&self)
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue