@@ -23,23 +23,18 @@ macro_rules! create_gtk_button {
2323 } } ;
2424}
2525
26- fn create_fixes_section ( builder : & Builder ) -> gtk:: Box {
26+ fn create_utilities_section ( builder : & Builder ) -> gtk:: Box {
2727 let topbox = gtk:: Box :: new ( gtk:: Orientation :: Vertical , 2 ) ;
2828 let button_box_f = gtk:: Box :: new ( gtk:: Orientation :: Horizontal , 10 ) ;
2929 let button_box_s = gtk:: Box :: new ( gtk:: Orientation :: Horizontal , 10 ) ;
3030 let button_box_t = gtk:: Box :: new ( gtk:: Orientation :: Horizontal , 10 ) ;
31- let button_box_frth = gtk:: Box :: new ( gtk:: Orientation :: Horizontal , 10 ) ;
3231 let label = gtk:: Label :: new ( None ) ;
3332 label. set_line_wrap ( true ) ;
3433 label. set_justify ( gtk:: Justification :: Center ) ;
3534 label. set_text ( & fl ! ( "fixes" ) ) ;
3635
37- let removelock_btn = create_gtk_button ! ( "remove-lock-title" ) ;
38- let reinstall_btn = create_gtk_button ! ( "reinstall-title" ) ;
39- let resetkeyring_btn = create_gtk_button ! ( "reset-keyrings-title" ) ;
4036 let update_system_btn = create_gtk_button ! ( "update-system-title" ) ;
4137 let remove_orphans_btn = create_gtk_button ! ( "remove-orphans-title" ) ;
42- let clear_pkgcache_btn = create_gtk_button ! ( "clear-pkgcache-title" ) ;
4338 let rankmirrors_btn = create_gtk_button ! ( "rankmirrors-title" ) ;
4439
4540 let install_gaming_btn = create_gtk_button ! ( "install-gaming-title" ) ;
@@ -54,23 +49,9 @@ fn create_fixes_section(builder: &Builder) -> gtk::Box {
5449 let ( dialog_tx, dialog_rx) = async_channel:: unbounded ( ) ;
5550
5651 // Connect signals.
57- let dialog_tx_clone = dialog_tx. clone ( ) ;
5852 let dialog_tx_gaming = dialog_tx. clone ( ) ;
5953 let dialog_tx_winboat = dialog_tx. clone ( ) ;
6054 let dialog_tx_vram_management = dialog_tx. clone ( ) ;
61- removelock_btn. connect_clicked ( move |_| {
62- let dialog_tx_clone = dialog_tx_clone. clone ( ) ;
63- std:: thread:: spawn ( move || {
64- actions:: remove_dblock ( dialog_tx_clone) ;
65- } ) ;
66- } ) ;
67- reinstall_btn. connect_clicked ( move |_| {
68- // Spawn child process in separate thread.
69- std:: thread:: spawn ( move || {
70- actions:: reinstall_packages ( crate :: gui:: run_command) ;
71- } ) ;
72- } ) ;
73- resetkeyring_btn. connect_clicked ( on_resetkeyring_btn_clicked) ;
7455 update_system_btn. connect_clicked ( on_update_system_btn_clicked) ;
7556 remove_orphans_btn. connect_clicked ( move |_| {
7657 // Spawn child process in separate thread.
@@ -79,7 +60,6 @@ fn create_fixes_section(builder: &Builder) -> gtk::Box {
7960 actions:: remove_orphans ( crate :: gui:: run_command, dialog_tx_clone) ;
8061 } ) ;
8162 } ) ;
82- clear_pkgcache_btn. connect_clicked ( on_clear_pkgcache_btn_clicked) ;
8363 rankmirrors_btn. connect_clicked ( move |_| {
8464 // Spawn child process in separate thread.
8565 std:: thread:: spawn ( move || {
@@ -113,15 +93,13 @@ fn create_fixes_section(builder: &Builder) -> gtk::Box {
11393 }
11494
11595 // Setup receiver.
116- let removelock_btn_clone = removelock_btn. clone ( ) ;
11796 let remove_orphans_btn_clone = remove_orphans_btn. clone ( ) ;
11897 let install_gaming_btn_clone = install_gaming_btn. clone ( ) ;
11998 let install_winboat_btn_clone = install_winboat_btn. clone ( ) ;
12099 let install_vram_management_btn_clone = install_vram_management_btn. clone ( ) ;
121100 glib:: MainContext :: default ( ) . spawn_local ( async move {
122101 while let Ok ( msg) = dialog_rx. recv ( ) . await {
123102 let widget_obj = match msg. action {
124- Action :: RemoveLock => & removelock_btn_clone,
125103 Action :: RemoveOrphans => & remove_orphans_btn_clone,
126104 Action :: InstallGaming => & install_gaming_btn_clone,
127105 Action :: InstallWinboat => & install_winboat_btn_clone,
@@ -140,16 +118,12 @@ fn create_fixes_section(builder: &Builder) -> gtk::Box {
140118
141119 topbox. pack_start ( & label, true , false , 1 ) ;
142120 button_box_f. pack_start ( & update_system_btn, true , true , 2 ) ;
143- button_box_f. pack_start ( & reinstall_btn, true , true , 2 ) ;
144- button_box_f. pack_end ( & resetkeyring_btn, true , true , 2 ) ;
145- button_box_s. pack_start ( & removelock_btn, true , true , 2 ) ;
146- button_box_s. pack_start ( & clear_pkgcache_btn, true , true , 2 ) ;
147- button_box_s. pack_end ( & remove_orphans_btn, true , true , 2 ) ;
148- button_box_t. pack_end ( & rankmirrors_btn, true , true , 2 ) ;
149- button_box_t. pack_end ( & install_gaming_btn, true , true , 2 ) ;
150- button_box_t. pack_end ( & install_winboat_btn, true , true , 2 ) ;
121+ button_box_f. pack_end ( & remove_orphans_btn, true , true , 2 ) ;
122+ button_box_f. pack_end ( & rankmirrors_btn, true , true , 2 ) ;
123+ button_box_s. pack_end ( & install_gaming_btn, true , true , 2 ) ;
124+ button_box_s. pack_end ( & install_winboat_btn, true , true , 2 ) ;
151125 if let Some ( button) = & install_vram_management_btn {
152- button_box_frth . pack_end ( button, true , true , 2 ) ;
126+ button_box_s . pack_end ( button, true , true , 2 ) ;
153127 }
154128
155129 if Path :: new ( "/usr/bin/nmcli" ) . exists ( ) {
@@ -159,30 +133,18 @@ fn create_fixes_section(builder: &Builder) -> gtk::Box {
159133 let stack: gtk:: Stack = builder. object( "stack" ) . unwrap( ) ;
160134 stack. set_visible_child_name( & format!( "{name}page" ) ) ;
161135 } ) ) ;
162- button_box_frth. pack_end ( & dnsserver_btn, true , true , 2 ) ;
136+ let row_to_add =
137+ if install_vram_management_btn. is_some ( ) { & button_box_t } else { & button_box_s } ;
138+ row_to_add. pack_end ( & dnsserver_btn, true , true , 2 ) ;
163139 }
164140
165141 button_box_f. set_halign ( gtk:: Align :: Fill ) ;
166142 button_box_s. set_halign ( gtk:: Align :: Fill ) ;
167143 button_box_t. set_halign ( gtk:: Align :: Fill ) ;
168- button_box_frth. set_halign ( gtk:: Align :: Fill ) ;
169- topbox. pack_end ( & button_box_frth, true , true , 5 ) ;
170144 topbox. pack_end ( & button_box_t, true , true , 5 ) ;
171145 topbox. pack_end ( & button_box_s, true , true , 5 ) ;
172146 topbox. pack_end ( & button_box_f, true , true , 5 ) ;
173147
174- if utils:: is_kwin_wayland ( ) {
175- let kwinw_debug_btn = create_gtk_button ! ( "show-kwinw-debug-title" ) ;
176- kwinw_debug_btn. connect_clicked ( move |_| {
177- // Spawn child process in separate thread.
178- std:: thread:: spawn ( move || {
179- // do we even need to start that in separate thread. should be fine without
180- actions:: launch_kwin_debug_window ( ) ;
181- } ) ;
182- } ) ;
183- button_box_frth. pack_end ( & kwinw_debug_btn, true , true , 2 ) ;
184- }
185-
186148 topbox. set_hexpand ( true ) ;
187149 topbox
188150}
@@ -217,14 +179,86 @@ fn create_apps_section() -> Option<gtk::Box> {
217179 if box_collection. children ( ) . is_empty ( ) { None } else { Some ( topbox) }
218180}
219181
220- pub fn create_tweaks_page ( builder : & Builder ) {
221- let install: gtk:: Button = builder. object ( "tweaksBrowser" ) . unwrap ( ) ;
222- install. set_visible ( true ) ;
223- install. set_label ( & fl ! ( "tweaksbrowser-label" ) ) ;
182+ fn create_troubleshooting_section ( ) -> gtk:: Box {
183+ let topbox = gtk:: Box :: new ( gtk:: Orientation :: Vertical , 2 ) ;
184+ let button_box_f = gtk:: Box :: new ( gtk:: Orientation :: Horizontal , 10 ) ;
185+ let button_box_s = gtk:: Box :: new ( gtk:: Orientation :: Horizontal , 10 ) ;
186+ let button_box_t = gtk:: Box :: new ( gtk:: Orientation :: Horizontal , 10 ) ;
187+ let label = gtk:: Label :: new ( None ) ;
188+ label. set_line_wrap ( true ) ;
189+ label. set_justify ( gtk:: Justification :: Center ) ;
190+ label. set_text ( & fl ! ( "troubleshooting" ) ) ;
224191
225- // fire cache
226- systemd_units:: refresh_cache ( ) ;
192+ let removelock_btn = create_gtk_button ! ( "remove-lock-title" ) ;
193+ let reinstall_btn = create_gtk_button ! ( "reinstall-title" ) ;
194+ let resetkeyring_btn = create_gtk_button ! ( "reset-keyrings-title" ) ;
195+ let clear_pkgcache_btn = create_gtk_button ! ( "clear-pkgcache-title" ) ;
196+
197+ let ( dialog_tx, dialog_rx) = async_channel:: unbounded ( ) ;
198+ let dialog_tx_clone = dialog_tx. clone ( ) ;
199+
200+ removelock_btn. connect_clicked ( move |_| {
201+ let dialog_tx_clone = dialog_tx_clone. clone ( ) ;
202+ std:: thread:: spawn ( move || {
203+ actions:: remove_dblock ( dialog_tx_clone) ;
204+ } ) ;
205+ } ) ;
206+ reinstall_btn. connect_clicked ( move |_| {
207+ std:: thread:: spawn ( move || {
208+ actions:: reinstall_packages ( crate :: gui:: run_command) ;
209+ } ) ;
210+ } ) ;
211+ resetkeyring_btn. connect_clicked ( on_resetkeyring_btn_clicked) ;
212+ clear_pkgcache_btn. connect_clicked ( on_clear_pkgcache_btn_clicked) ;
213+
214+ let removelock_btn_clone = removelock_btn. clone ( ) ;
215+ glib:: MainContext :: default ( ) . spawn_local ( async move {
216+ while let Ok ( msg) = dialog_rx. recv ( ) . await {
217+ let widget_obj = match msg. action {
218+ Action :: RemoveLock => & removelock_btn_clone,
219+ _ => panic ! ( "Unexpected action!!" ) ,
220+ } ;
221+ let widget_window =
222+ utils:: get_window_from_widget ( widget_obj) . expect ( "Failed to retrieve window" ) ;
223+ let ui_comp = crate :: gui:: Gui :: new ( widget_window) ;
227224
225+ ui_comp. show_message ( msg. msg_type , & msg. msg , msg. msg_type . to_string ( ) ) ;
226+ }
227+ } ) ;
228+
229+ topbox. pack_start ( & label, true , false , 1 ) ;
230+
231+ button_box_f. pack_start ( & clear_pkgcache_btn, true , true , 2 ) ;
232+ button_box_f. pack_start ( & removelock_btn, true , true , 2 ) ;
233+ button_box_f. pack_start ( & resetkeyring_btn, true , true , 2 ) ;
234+
235+ button_box_s. pack_start ( & reinstall_btn, true , true , 2 ) ;
236+
237+ if utils:: is_kwin_wayland ( ) {
238+ let kwinw_debug_btn = create_gtk_button ! ( "show-kwinw-debug-title" ) ;
239+ kwinw_debug_btn. connect_clicked ( move |_| {
240+ // Spawn child process in separate thread.
241+ std:: thread:: spawn ( move || {
242+ // do we even need to start that in separate thread. should be fine without
243+ actions:: launch_kwin_debug_window ( ) ;
244+ } ) ;
245+ } ) ;
246+ button_box_t. pack_end ( & kwinw_debug_btn, true , true , 2 ) ;
247+ }
248+
249+ button_box_f. set_halign ( gtk:: Align :: Fill ) ;
250+ button_box_s. set_halign ( gtk:: Align :: Fill ) ;
251+ button_box_t. set_halign ( gtk:: Align :: Fill ) ;
252+
253+ topbox. pack_end ( & button_box_t, true , true , 5 ) ;
254+ topbox. pack_end ( & button_box_s, true , true , 5 ) ;
255+ topbox. pack_end ( & button_box_f, true , true , 5 ) ;
256+
257+ topbox. set_hexpand ( true ) ;
258+ topbox
259+ }
260+
261+ fn create_child_viewport < T : IsA < gtk:: Widget > > ( child : & T , builder : & Builder , child_name : & str ) {
228262 let viewport = gtk:: Viewport :: new ( gtk:: Adjustment :: NONE , gtk:: Adjustment :: NONE ) ;
229263 let image = gtk:: Image :: from_icon_name ( Some ( "go-previous" ) , gtk:: IconSize :: Button ) ;
230264 let back_btn = gtk:: Button :: new ( ) ;
@@ -237,8 +271,34 @@ pub fn create_tweaks_page(builder: &Builder) {
237271 stack. set_visible_child_name( & format!( "{name}page" ) ) ;
238272 } ) ) ;
239273
274+ let grid = gtk:: Grid :: new ( ) ;
275+ grid. set_hexpand ( true ) ;
276+ grid. set_margin_start ( 10 ) ;
277+ grid. set_margin_end ( 10 ) ;
278+ grid. set_margin_top ( 5 ) ;
279+ grid. set_margin_bottom ( 5 ) ;
280+ grid. attach ( & back_btn, 0 , 1 , 1 , 1 ) ;
281+
282+ let box_collection_s = gtk:: Box :: new ( gtk:: Orientation :: Vertical , 5 ) ;
283+ box_collection_s. pack_start ( & grid, false , false , 0 ) ;
284+ box_collection_s. pack_start ( child, false , false , 10 ) ;
285+ viewport. add ( & box_collection_s) ;
286+
287+ let stack: gtk:: Stack = builder. object ( "stack" ) . unwrap ( ) ;
288+ stack. add_named ( & viewport, child_name) ;
289+ viewport. show_all ( ) ;
290+ }
291+
292+ pub fn create_tweaks_page ( builder : & Builder ) {
293+ let install: gtk:: Button = builder. object ( "tweaksBrowser" ) . unwrap ( ) ;
294+ install. set_visible ( true ) ;
295+ install. set_label ( & fl ! ( "tweaksbrowser-label" ) ) ;
296+
297+ // fire cache
298+ systemd_units:: refresh_cache ( ) ;
299+
240300 let options_section_box = tweaks:: create_options_section ( ) ;
241- let fixes_section_box = create_fixes_section ( builder) ;
301+ let fixes_section_box = create_utilities_section ( builder) ;
242302 let apps_section_box_opt = create_apps_section ( ) ;
243303
244304 let child_name = "tweaksBrowserpage" ;
@@ -248,14 +308,6 @@ pub fn create_tweaks_page(builder: &Builder) {
248308 apps_section_box. set_widget_name ( & format ! ( "{child_name}_apps" ) ) ;
249309 }
250310
251- let grid = gtk:: Grid :: new ( ) ;
252- grid. set_hexpand ( true ) ;
253- grid. set_margin_start ( 10 ) ;
254- grid. set_margin_end ( 10 ) ;
255- grid. set_margin_top ( 5 ) ;
256- grid. set_margin_bottom ( 5 ) ;
257- grid. attach ( & back_btn, 0 , 1 , 1 , 1 ) ;
258- let box_collection_s = gtk:: Box :: new ( gtk:: Orientation :: Vertical , 5 ) ;
259311 let box_collection = gtk:: Box :: new ( gtk:: Orientation :: Vertical , 5 ) ;
260312 box_collection. set_widget_name ( child_name) ;
261313
@@ -268,13 +320,8 @@ pub fn create_tweaks_page(builder: &Builder) {
268320
269321 box_collection. set_valign ( gtk:: Align :: Center ) ;
270322 box_collection. set_halign ( gtk:: Align :: Center ) ;
271- box_collection_s. pack_start ( & grid, false , false , 0 ) ;
272- box_collection_s. pack_start ( & box_collection, false , false , 10 ) ;
273- viewport. add ( & box_collection_s) ;
274- viewport. show_all ( ) ;
275323
276- let stack: gtk:: Stack = builder. object ( "stack" ) . unwrap ( ) ;
277- stack. add_named ( & viewport, child_name) ;
324+ create_child_viewport ( & box_collection, builder, child_name) ;
278325}
279326
280327pub fn create_appbrowser_page ( builder : & Builder ) {
@@ -293,6 +340,25 @@ pub fn create_appbrowser_page(builder: &Builder) {
293340 } ) ;
294341}
295342
343+ pub fn create_troubleshooting_page ( builder : & Builder ) {
344+ let troubleshooting_button: gtk:: Button = builder. object ( "troubleshooting" ) . unwrap ( ) ;
345+ troubleshooting_button. set_visible ( true ) ;
346+ troubleshooting_button. set_label ( & fl ! ( "troubleshooting-label" ) ) ;
347+
348+ let child_name = "troubleshootingpage" ;
349+
350+ let content: gtk:: Box = gtk:: Box :: new ( gtk:: Orientation :: Vertical , 5 ) ;
351+ content. set_widget_name ( child_name) ;
352+
353+ let section = create_troubleshooting_section ( ) ;
354+ content. pack_start ( & section, false , false , 10 ) ;
355+
356+ content. set_valign ( gtk:: Align :: Center ) ;
357+ content. set_halign ( gtk:: Align :: Center ) ;
358+
359+ create_child_viewport ( & content, builder, child_name) ;
360+ }
361+
296362fn on_resetkeyring_btn_clicked ( _: & gtk:: Button ) {
297363 // Spawn child process in separate thread.
298364 std:: thread:: spawn ( move || {
0 commit comments