@@ -21,6 +21,9 @@ use crate::widget::Align;
21
21
use crate :: {
22
22
BaseState , BoxConstraints , Env , Event , EventCtx , LayoutCtx , PaintCtx , UpdateCtx , Widget ,
23
23
} ;
24
+ use crate :: piet:: {
25
+ FontBuilder , PietText , PietTextLayout , Text , TextLayout , TextLayoutBuilder ,
26
+ } ;
24
27
25
28
#[ derive( Debug , Clone ) ]
26
29
pub struct Switch ;
@@ -50,9 +53,11 @@ impl Widget<bool> for SwitchRaw {
50
53
let knob_size = env. get ( theme:: BASIC_WIDGET_HEIGHT ) ;
51
54
let size = env. get ( theme:: BASIC_WIDGET_HEIGHT ) ;
52
55
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 ) ;
53
58
54
59
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. ) ;
56
61
57
62
let background_gradient = if * data {
58
63
LinearGradient :: new (
@@ -74,17 +79,49 @@ impl Widget<bool> for SwitchRaw {
74
79
)
75
80
} ;
76
81
77
-
78
-
79
82
paint_ctx. stroke ( background_rect, & env. get ( theme:: BORDER ) , 2.0 ) ;
80
83
81
84
paint_ctx. fill ( background_rect, & background_gradient) ;
82
85
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
+
83
120
let is_active = base_state. is_active ( ) ;
84
121
let is_hovered = self . knob_hovered ;
85
122
86
123
let knob_position = if * data {
87
- switch_thickness * 2. - knob_size / 2. - 4.
124
+ switch_thickness * 2.5 - knob_size / 2. - 4.
88
125
} else {
89
126
knob_size / 2. + 4.
90
127
} ;
@@ -134,7 +171,7 @@ impl Widget<bool> for SwitchRaw {
134
171
_data : & bool ,
135
172
env : & Env ,
136
173
) -> Size {
137
- let width = ( 8. + env. get ( theme:: BASIC_WIDGET_HEIGHT ) ) * 2. ;
174
+ let width = ( 8. + env. get ( theme:: BASIC_WIDGET_HEIGHT ) ) * 2.5 ;
138
175
bc. constrain ( Size :: new (
139
176
width,
140
177
env. get ( theme:: BASIC_WIDGET_HEIGHT ) ,
0 commit comments