@@ -13,22 +13,13 @@ use crate::{
13
13
Rgb ,
14
14
} ;
15
15
16
- #[ derive( Default , gtk :: CompositeTemplate ) ]
16
+ #[ derive( Default ) ]
17
17
pub struct KeyboardColorButtonInner {
18
- #[ template_child]
19
- button : TemplateChild < ColorCircle > ,
20
18
circles : RefCell < Vec < ColorCircle > > ,
21
- #[ template_child]
22
- grid : TemplateChild < gtk:: Grid > ,
19
+ grid : DerefCell < gtk:: Grid > ,
23
20
current_circle : RefCell < Option < ColorCircle > > ,
24
- #[ template_child]
25
- add_circle : TemplateChild < ColorCircle > ,
26
- #[ template_child]
27
- remove_button : TemplateChild < gtk:: Button > ,
28
- #[ template_child]
29
- edit_button : TemplateChild < gtk:: Button > ,
30
- #[ template_child]
31
- popover : TemplateChild < gtk:: Popover > ,
21
+ add_circle : DerefCell < ColorCircle > ,
22
+ remove_button : DerefCell < gtk:: Button > ,
32
23
board : DerefCell < DaemonBoard > ,
33
24
rgb : Cell < Rgb > ,
34
25
}
@@ -45,36 +36,68 @@ impl ObjectSubclass for KeyboardColorButtonInner {
45
36
46
37
glib:: object_subclass!( ) ;
47
38
48
- fn class_init ( klass : & mut Self :: Class ) {
49
- ColorCircle :: static_type ( ) ;
50
- klass. set_template ( include_bytes ! ( "keyboard_color_button.ui" ) ) ;
51
- Self :: bind_template_children ( klass) ;
52
- }
53
-
54
39
fn new ( ) -> Self {
55
40
Self :: default ( )
56
41
}
57
42
}
58
43
59
44
impl ObjectImpl for KeyboardColorButtonInner {
60
45
fn constructed ( & self , obj : & KeyboardColorButton ) {
61
- obj. init_template ( ) ;
62
46
self . parent_constructed ( obj) ;
63
47
64
- let popover: & gtk:: Popover = & * & self . popover ;
65
- self . button
66
- . connect_clicked ( clone ! ( @weak popover => move |_| popover. popup( ) ) ) ;
48
+ let button = ColorCircle :: new ( 30 ) ;
49
+
50
+ let grid = cascade ! {
51
+ gtk:: Grid :: new( ) ;
52
+ ..set_column_spacing( 6 ) ;
53
+ ..set_row_spacing( 6 ) ;
54
+ ..set_halign( gtk:: Align :: Center ) ;
55
+ } ;
56
+
57
+ let remove_button = cascade ! {
58
+ gtk:: Button :: with_label( "Remove" ) ;
59
+ ..connect_clicked( clone!( @weak obj => move |_| obj. remove_clicked( ) ) ) ;
60
+ } ;
61
+
62
+ let edit_button = cascade ! {
63
+ gtk:: Button :: with_label( "Edit" ) ;
64
+ ..connect_clicked( clone!( @weak obj => move |_| obj. edit_clicked( ) ) ) ;
65
+ } ;
67
66
68
- self . add_circle . set_alpha ( 0. ) ;
69
- self . add_circle . set_symbol ( "+" ) ;
70
- self . add_circle
71
- . connect_clicked ( clone ! ( @weak obj => move |_| obj. add_clicked( ) ) ) ;
67
+ let popover = cascade ! {
68
+ gtk:: Popover :: new( Some ( obj) ) ;
69
+ ..add( & cascade! {
70
+ gtk:: Box :: new( gtk:: Orientation :: Vertical , 0 ) ;
71
+ ..add( & grid) ;
72
+ ..add( & gtk:: Separator :: new( gtk:: Orientation :: Horizontal ) ) ;
73
+ ..add( & cascade! {
74
+ gtk:: Box :: new( gtk:: Orientation :: Horizontal , 0 ) ;
75
+ ..add( & remove_button) ;
76
+ ..add( & edit_button) ;
77
+ } ) ;
78
+ } ) ;
79
+ ..show_all( ) ;
80
+ ..hide( ) ;
81
+ } ;
82
+ button. connect_clicked ( clone ! ( @weak popover => move |_| popover. popup( ) ) ) ;
72
83
73
- self . remove_button
74
- . connect_clicked ( clone ! ( @weak obj => move |_| obj. remove_clicked( ) ) ) ;
84
+ let add_circle = cascade ! {
85
+ ColorCircle :: new( 45 ) ;
86
+ ..set_alpha( 0. ) ;
87
+ ..set_symbol( "+" ) ;
88
+ ..connect_clicked( clone!( @weak obj => move |_| obj. add_clicked( ) ) ) ;
89
+ } ;
75
90
76
- self . edit_button
77
- . connect_clicked ( clone ! ( @weak obj => move |_| obj. edit_clicked( ) ) ) ;
91
+ cascade ! {
92
+ obj;
93
+ ..bind_property( "rgb" , & button, "rgb" ) . flags( glib:: BindingFlags :: SYNC_CREATE ) . build( ) ;
94
+ ..add( & button) ;
95
+ ..show_all( ) ;
96
+ }
97
+
98
+ self . grid . set ( grid) ;
99
+ self . add_circle . set ( add_circle) ;
100
+ self . remove_button . set ( remove_button) ;
78
101
}
79
102
80
103
fn properties ( ) -> & ' static [ glib:: ParamSpec ] {
@@ -176,7 +199,7 @@ impl KeyboardColorButton {
176
199
let circles = self . inner ( ) . circles . borrow ( ) ;
177
200
for ( i, circle) in circles
178
201
. iter ( )
179
- . chain ( iter:: once ( & self . inner ( ) . add_circle . get ( ) ) )
202
+ . chain ( iter:: once ( & * self . inner ( ) . add_circle ) )
180
203
. enumerate ( )
181
204
{
182
205
let x = i as i32 % 3 ;
0 commit comments