1
+ use cascade:: cascade;
1
2
use glib:: subclass;
2
3
use gtk:: prelude:: * ;
3
4
use gtk:: subclass:: prelude:: * ;
@@ -10,28 +11,21 @@ use crate::{
10
11
DaemonClient ,
11
12
DaemonDummy ,
12
13
DaemonServer ,
14
+ DerefCell ,
13
15
} ;
14
16
use super :: {
15
17
Keyboard ,
16
18
Picker ,
17
19
shortcuts_window,
18
20
} ;
19
21
20
- #[ derive( Default , gtk :: CompositeTemplate ) ]
22
+ #[ derive( Default ) ]
21
23
pub struct MainWindowInner {
22
- #[ template_child]
23
- board_dropdown : TemplateChild < gtk:: ComboBoxText > ,
24
+ board_dropdown : DerefCell < gtk:: ComboBoxText > ,
24
25
count : AtomicUsize ,
25
- #[ template_child]
26
- header_bar : TemplateChild < gtk:: HeaderBar > ,
27
- #[ template_child]
28
- vbox : TemplateChild < gtk:: Box > ,
29
- #[ template_child]
30
- layer_switcher : TemplateChild < gtk:: StackSwitcher > ,
31
- #[ template_child]
32
- picker : TemplateChild < Picker > ,
33
- #[ template_child]
34
- stack : TemplateChild < gtk:: Stack > ,
26
+ layer_switcher : DerefCell < gtk:: StackSwitcher > ,
27
+ picker : DerefCell < Picker > ,
28
+ stack : DerefCell < gtk:: Stack > ,
35
29
}
36
30
37
31
impl ObjectSubclass for MainWindowInner {
@@ -46,23 +40,47 @@ impl ObjectSubclass for MainWindowInner {
46
40
47
41
glib:: object_subclass!( ) ;
48
42
49
- fn class_init ( klass : & mut Self :: Class ) {
50
- Picker :: static_type ( ) ;
51
- klass. set_template ( include_bytes ! ( "main_window.ui" ) ) ;
52
- Self :: bind_template_children ( klass) ;
53
- }
54
-
55
43
fn new ( ) -> Self {
56
44
Self :: default ( )
57
45
}
58
46
}
59
47
60
48
impl ObjectImpl for MainWindowInner {
61
49
fn constructed ( & self , window : & MainWindow ) {
62
- window. init_template ( ) ;
63
50
self . parent_constructed ( window) ;
64
51
65
- self . board_dropdown . connect_changed ( clone ! ( @weak window => @default -panic, move |combobox| {
52
+ let layer_switcher = gtk:: StackSwitcher :: new ( ) ;
53
+
54
+ let menu = cascade ! {
55
+ gio:: Menu :: new( ) ;
56
+ ..append_section( None , & cascade! {
57
+ gio:: Menu :: new( ) ;
58
+ ..append( Some ( "Load Layout" ) , Some ( "kbd.load" ) ) ;
59
+ ..append( Some ( "Save Layout" ) , Some ( "kbd.save" ) ) ;
60
+ ..append( Some ( "Reset Layout" ) , Some ( "kbd.reset" ) ) ;
61
+ } ) ;
62
+ ..append_section( None , & cascade! {
63
+ gio:: Menu :: new( ) ;
64
+ ..append( Some ( "Keyboard Shortcuts" ) , Some ( "win.show-help-overlay" ) ) ;
65
+ ..append( Some ( "About Keyboard Configurator" ) , Some ( "app.about" ) ) ;
66
+ } ) ;
67
+ } ;
68
+
69
+ let header_bar = cascade ! {
70
+ gtk:: HeaderBar :: new( ) ;
71
+ ..set_show_close_button( true ) ;
72
+ ..set_custom_title( Some ( & layer_switcher) ) ;
73
+ ..pack_end( & cascade! {
74
+ gtk:: MenuButton :: new( ) ;
75
+ ..set_menu_model( Some ( & menu) ) ;
76
+ ..add( & cascade! {
77
+ gtk:: Image :: from_icon_name( Some ( "open-menu-symbolic" ) , gtk:: IconSize :: Button ) ;
78
+ } ) ;
79
+ } ) ;
80
+ } ;
81
+
82
+ let board_dropdown = gtk:: ComboBoxText :: new ( ) ;
83
+ board_dropdown. connect_changed ( clone ! ( @weak window => @default -panic, move |combobox| {
66
84
let self_ = window. inner( ) ;
67
85
if let Some ( id) = combobox. get_active_id( ) {
68
86
self_. stack. set_visible_child_name( & id) ;
@@ -73,10 +91,37 @@ impl ObjectImpl for MainWindowInner {
73
91
}
74
92
} ) ) ;
75
93
76
- window. set_help_overlay ( Some ( & shortcuts_window ( ) ) ) ;
77
-
78
- window. set_focus :: < gtk:: Widget > ( None ) ;
79
- window. show_all ( ) ;
94
+ let stack = gtk:: Stack :: new ( ) ;
95
+ let picker = Picker :: new ( ) ;
96
+
97
+ let vbox = cascade ! {
98
+ gtk:: Box :: new( gtk:: Orientation :: Vertical , 32 ) ;
99
+ ..set_property_margin( 10 ) ;
100
+ ..set_halign( gtk:: Align :: Center ) ;
101
+ ..add( & board_dropdown) ;
102
+ ..add( & stack) ;
103
+ ..add( & picker) ;
104
+ } ;
105
+
106
+ cascade ! {
107
+ window;
108
+ ..set_title( "System76 Keyboard Configurator" ) ;
109
+ ..set_position( gtk:: WindowPosition :: Center ) ;
110
+ ..set_default_size( 1024 , 768 ) ;
111
+ ..set_titlebar( Some ( & header_bar) ) ;
112
+ ..add( & cascade! {
113
+ gtk:: ScrolledWindow :: new:: <gtk:: Adjustment , gtk:: Adjustment >( None , None ) ;
114
+ ..add( & vbox) ;
115
+ } ) ;
116
+ ..set_help_overlay( Some ( & shortcuts_window( ) ) ) ;
117
+ ..set_focus( None :: <& gtk:: Widget >) ;
118
+ ..show_all( ) ;
119
+ } ;
120
+
121
+ self . board_dropdown . set ( board_dropdown) ;
122
+ self . layer_switcher . set ( layer_switcher) ;
123
+ self . picker . set ( picker) ;
124
+ self . stack . set ( stack) ;
80
125
}
81
126
}
82
127
impl WidgetImpl for MainWindowInner {
0 commit comments