Skip to content

Commit aa0b53b

Browse files
committed
Add toggle switch on/off labels
1 parent 218e29e commit aa0b53b

File tree

1 file changed

+42
-5
lines changed

1 file changed

+42
-5
lines changed

src/widget/switch.rs

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ use crate::widget::Align;
2121
use crate::{
2222
BaseState, BoxConstraints, Env, Event, EventCtx, LayoutCtx, PaintCtx, UpdateCtx, Widget,
2323
};
24+
use crate::piet::{
25+
FontBuilder, PietText, PietTextLayout, Text, TextLayout, TextLayoutBuilder,
26+
};
2427

2528
#[derive(Debug, Clone)]
2629
pub struct Switch;
@@ -50,9 +53,11 @@ impl Widget<bool> for SwitchRaw {
5053
let knob_size = env.get(theme::BASIC_WIDGET_HEIGHT);
5154
let size = env.get(theme::BASIC_WIDGET_HEIGHT);
5255
let switch_thickness = 8. + knob_size;
56+
let font_name = env.get(theme::FONT_NAME);
57+
let font_size = env.get(theme::TEXT_SIZE_NORMAL);
5358

5459
let background_rect =
55-
RoundedRect::from_origin_size(Point::ORIGIN, Size::new(switch_thickness * 2., switch_thickness).to_vec2(), switch_thickness / 2.);
60+
RoundedRect::from_origin_size(Point::ORIGIN, Size::new(switch_thickness * 2.5, switch_thickness).to_vec2(), switch_thickness / 2.);
5661

5762
let background_gradient = if *data {
5863
LinearGradient::new(
@@ -74,17 +79,49 @@ impl Widget<bool> for SwitchRaw {
7479
)
7580
};
7681

77-
78-
7982
paint_ctx.stroke(background_rect, &env.get(theme::BORDER), 2.0);
8083

8184
paint_ctx.fill(background_rect, &background_gradient);
8285

86+
let label = if *data {
87+
"ON"
88+
} else {
89+
"OFF"
90+
};
91+
92+
let font = paint_ctx.text()
93+
.new_font_by_name(font_name, font_size)
94+
.unwrap()
95+
.build()
96+
.unwrap();
97+
98+
let text_layout = paint_ctx.text().new_text_layout(&font, label).unwrap().build().unwrap();
99+
100+
let mut origin = UnitPoint::LEFT.resolve(Rect::from_origin_size(
101+
Point::ORIGIN,
102+
Size::new(
103+
(base_state.size().width - text_layout.width()).max(0.0),
104+
base_state.size().height + (font_size * 1.2) / 2.,
105+
),
106+
));
107+
108+
//Make sure we don't draw the text too low
109+
origin.y = origin.y.min(base_state.size().height) + 4.;
110+
111+
if *data {
112+
origin.x = 8.
113+
} else {
114+
origin.x = switch_thickness * 2.5 - text_layout.width() - 8.
115+
}
116+
117+
paint_ctx.draw_text(&text_layout, origin, &env.get(theme::LABEL_COLOR));
118+
119+
83120
let is_active = base_state.is_active();
84121
let is_hovered = self.knob_hovered;
85122

86123
let knob_position = if *data {
87-
switch_thickness * 2. - knob_size / 2. - 4.
124+
switch_thickness * 2.5 - knob_size / 2. - 4.
88125
} else {
89126
knob_size / 2. + 4.
90127
};
@@ -134,7 +171,7 @@ impl Widget<bool> for SwitchRaw {
134171
_data: &bool,
135172
env: &Env,
136173
) -> Size {
137-
let width = (8. + env.get(theme::BASIC_WIDGET_HEIGHT)) * 2.;
174+
let width = (8. + env.get(theme::BASIC_WIDGET_HEIGHT)) * 2.5;
138175
bc.constrain(Size::new(
139176
width,
140177
env.get(theme::BASIC_WIDGET_HEIGHT),

0 commit comments

Comments
 (0)