Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Customize Checkbox #192

Merged
merged 2 commits into from
Feb 18, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 3 additions & 6 deletions native/src/renderer/null.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,7 @@ impl row::Renderer for Null {
}

impl text::Renderer for Null {
fn default_size(&self) -> u16 {
20
}
const DEFAULT_SIZE: u16 = 20;

fn measure(
&self,
Expand Down Expand Up @@ -179,9 +177,8 @@ impl radio::Renderer for Null {
impl checkbox::Renderer for Null {
type Style = ();

fn default_size(&self) -> u32 {
20
}
const DEFAULT_SIZE: u16 = 20;
const DEFAULT_SPACING: u16 = 15;

fn draw(
&mut self,
Expand Down
61 changes: 50 additions & 11 deletions native/src/widget/checkbox.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,20 @@ use crate::{
///
/// ![Checkbox drawn by `iced_wgpu`](https://github.com/hecrj/iced/blob/7760618fb112074bc40b148944521f312152012a/docs/images/checkbox.png?raw=true)
#[allow(missing_debug_implementations)]
pub struct Checkbox<Message, Renderer: self::Renderer> {
pub struct Checkbox<Message, Renderer: self::Renderer + text::Renderer> {
is_checked: bool,
on_toggle: Box<dyn Fn(bool) -> Message>,
label: String,
width: Length,
size: u16,
spacing: u16,
text_size: u16,
style: Renderer::Style,
}

impl<Message, Renderer: self::Renderer> Checkbox<Message, Renderer> {
impl<Message, Renderer: self::Renderer + text::Renderer>
Checkbox<Message, Renderer>
{
/// Creates a new [`Checkbox`].
///
/// It expects:
Expand All @@ -54,10 +59,21 @@ impl<Message, Renderer: self::Renderer> Checkbox<Message, Renderer> {
on_toggle: Box::new(f),
label: String::from(label),
width: Length::Shrink,
size: <Renderer as self::Renderer>::DEFAULT_SIZE,
spacing: Renderer::DEFAULT_SPACING,
text_size: <Renderer as text::Renderer>::DEFAULT_SIZE,
style: Renderer::Style::default(),
}
}

/// Sets the size of the [`Checkbox`].
///
/// [`Checkbox`]: struct.Checkbox.html
pub fn size(mut self, size: u16) -> Self {
self.size = size;
self
}

/// Sets the width of the [`Checkbox`].
///
/// [`Checkbox`]: struct.Checkbox.html
Expand All @@ -66,6 +82,22 @@ impl<Message, Renderer: self::Renderer> Checkbox<Message, Renderer> {
self
}

/// Sets the spacing between the [`Checkbox`] and the text.
///
/// [`Checkbox`]: struct.Checkbox.html
pub fn spacing(mut self, spacing: u16) -> Self {
self.spacing = spacing;
self
}

/// Sets the text size of the [`Checkbox`].
///
/// [`Checkbox`]: struct.Checkbox.html
pub fn text_size(mut self, text_size: u16) -> Self {
self.text_size = text_size;
self
}

/// Sets the style of the [`Checkbox`].
///
/// [`Checkbox`]: struct.Checkbox.html
Expand Down Expand Up @@ -93,18 +125,20 @@ where
renderer: &Renderer,
limits: &layout::Limits,
) -> layout::Node {
let size = self::Renderer::default_size(renderer);

Row::<(), Renderer>::new()
.width(self.width)
.spacing(15)
.spacing(self.spacing)
.align_items(Align::Center)
.push(
Row::new()
.width(Length::Units(size as u16))
.height(Length::Units(size as u16)),
.width(Length::Units(self.size))
.height(Length::Units(self.size)),
)
.push(
Text::new(&self.label)
.width(self.width)
.size(self.text_size),
)
.push(Text::new(&self.label).width(self.width))
.layout(renderer, limits)
}

Expand Down Expand Up @@ -151,7 +185,7 @@ where
defaults,
label_layout.bounds(),
&self.label,
text::Renderer::default_size(renderer),
self.text_size,
Font::Default,
None,
HorizontalAlignment::Left,
Expand Down Expand Up @@ -186,10 +220,15 @@ pub trait Renderer: crate::Renderer {
/// The style supported by this renderer.
type Style: Default;

/// Returns the default size of a [`Checkbox`].
/// The default size of a [`Checkbox`].
///
/// [`Checkbox`]: struct.Checkbox.html
const DEFAULT_SIZE: u16;

/// The default spacing of a [`Checkbox`].
///
/// [`Checkbox`]: struct.Checkbox.html
fn default_size(&self) -> u32;
const DEFAULT_SPACING: u16;

/// Draws a [`Checkbox`].
///
Expand Down
2 changes: 1 addition & 1 deletion native/src/widget/radio.rs
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ where
defaults,
label_layout.bounds(),
&self.label,
text::Renderer::default_size(renderer),
<Renderer as text::Renderer>::DEFAULT_SIZE,
Font::Default,
None,
HorizontalAlignment::Left,
Expand Down
8 changes: 4 additions & 4 deletions native/src/widget/text.rs
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ where
) -> layout::Node {
let limits = limits.width(self.width).height(self.height);

let size = self.size.unwrap_or(renderer.default_size());
let size = self.size.unwrap_or(Renderer::DEFAULT_SIZE);

let bounds = limits.max();

Expand All @@ -154,7 +154,7 @@ where
defaults,
layout.bounds(),
&self.content,
self.size.unwrap_or(renderer.default_size()),
self.size.unwrap_or(Renderer::DEFAULT_SIZE),
self.font,
self.color,
self.horizontal_alignment,
Expand All @@ -179,10 +179,10 @@ where
/// [renderer]: ../../renderer/index.html
/// [`UserInterface`]: ../../struct.UserInterface.html
pub trait Renderer: crate::Renderer {
/// Returns the default size of the [`Text`].
/// The default size of [`Text`].
///
/// [`Text`]: struct.Text.html
fn default_size(&self) -> u16;
const DEFAULT_SIZE: u16;

/// Measures the [`Text`] in the given bounds and returns the minimum
/// boundaries that can fit the contents.
Expand Down
7 changes: 2 additions & 5 deletions wgpu/src/renderer/widget/checkbox.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,11 @@ use iced_native::{
checkbox, HorizontalAlignment, MouseCursor, Rectangle, VerticalAlignment,
};

const SIZE: f32 = 28.0;

impl checkbox::Renderer for Renderer {
type Style = Box<dyn StyleSheet>;

fn default_size(&self) -> u32 {
SIZE as u32
}
const DEFAULT_SIZE: u16 = 20;
const DEFAULT_SPACING: u16 = 15;

fn draw(
&mut self,
Expand Down
7 changes: 1 addition & 6 deletions wgpu/src/renderer/widget/text.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,8 @@ use iced_native::{

use std::f32;

// TODO: Obtain from renderer configuration
const DEFAULT_TEXT_SIZE: f32 = 20.0;

impl text::Renderer for Renderer {
fn default_size(&self) -> u16 {
DEFAULT_TEXT_SIZE as u16
}
const DEFAULT_SIZE: u16 = 20;

fn measure(
&self,
Expand Down