Skip to content

Commit 63a4b63

Browse files
authored
Split off troubleshooting-related buttons into their own page (#256)
1 parent 704f819 commit 63a4b63

7 files changed

Lines changed: 164 additions & 70 deletions

File tree

i18n/en/cachyos_hello.ftl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ advanced-btn-tooltip = Toggle an extended selection of packages
2525
reset-btn-tooltip = Reset your current selections...
2626
update-system-app-btn-tooltip = Apply your current selections to the system
2727
28+
# Troubleshooting page
29+
troubleshooting = Troubleshooting
30+
2831
# Dns Connections page
2932
dns-settings = DNS Settings
3033
select-connection = Select Connection:
@@ -121,6 +124,7 @@ outdated-version-warning = You are using an older version of CachyOS ISO, please
121124
testing-iso-warning = You are using a testing ISO, testing ISOs are not considered stable and ready for use
122125
tweaksbrowser-label = Apps/Tweaks
123126
appbrowser-label = Install Apps
127+
troubleshooting-label = Troubleshooting
124128
launch-start-label = Launch at start
125129
welcome-title = Welcome to CachyOS!
126130
welcome-body =

src/pages/i18n.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@ pub fn update_translations(builder: &Builder) {
8383
appbrowser_btn.set_label(&fl!("appbrowser-label"));
8484
appbrowser_btn.set_tooltip_text(Some(&fl!("appbrowser-label")));
8585

86+
let troubleshooting_btn: gtk::Button = builder.object("troubleshooting").unwrap();
87+
troubleshooting_btn.set_label(&fl!("troubleshooting-label"));
88+
troubleshooting_btn.set_tooltip_text(Some(&fl!("troubleshooting-label")));
89+
8690
let stack: gtk::Stack = builder.object("stack").unwrap();
8791
{
8892
if let Some(widget) = stack.child_by_name("tweaksBrowserpage")

src/pages/mod.rs

Lines changed: 134 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -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

280327
pub 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+
296362
fn on_resetkeyring_btn_clicked(_: &gtk::Button) {
297363
// Spawn child process in separate thread.
298364
std::thread::spawn(move || {

src/utils.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ pub const fn const_min(v1: usize, v2: usize) -> usize {
4646
#[inline]
4747
pub const fn string_substr(src_str: &str, pos: usize, n: usize) -> Result<&str, str::Utf8Error> {
4848
let rlen = const_min(n, src_str.len() - pos);
49-
49+
5050
unsafe {
5151
// First, we build a &[u8]...
5252
let slice = slice::from_raw_parts(src_str.as_ptr().add(pos), rlen);

src/window.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ impl HelloWindow {
198198

199199
pages::create_appbrowser_page(&builder);
200200
pages::create_tweaks_page(&builder);
201+
pages::create_troubleshooting_page(&builder);
201202

202203
if Path::new("/usr/bin/nmcli").exists() {
203204
pages::dns::create_connections_page(&builder);

ui/cachyos-hello.glade

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,23 @@ We, the CachyOS Developers, hope that you will enjoy using CachyOS as much as we
425425
<property name="position">1</property>
426426
</packing>
427427
</child>
428+
<child>
429+
<object class="GtkButton" id="troubleshooting">
430+
<property name="label" translatable="yes">Troubleshooting</property>
431+
<property name="name">troubleshooting</property>
432+
<property name="can-focus">True</property>
433+
<property name="receives-default">True</property>
434+
<property name="tooltip-text" translatable="yes">Tools for resolving issues with the system</property>
435+
<property name="margin-left">15</property>
436+
<property name="margin-right">15</property>
437+
<signal name="clicked" handler="on_btn_clicked" swapped="no"/>
438+
</object>
439+
<packing>
440+
<property name="expand">False</property>
441+
<property name="fill">True</property>
442+
<property name="position">2</property>
443+
</packing>
444+
</child>
428445
</object>
429446
<packing>
430447
<property name="left-attach">0</property>

ui/style.css

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ window {
33
border-bottom-right-radius: 7px;
44
}
55

6-
#tweaksBrowserpage button {
6+
#tweaksBrowserpage button,
7+
#troubleshootingpage button
8+
{
79
padding: 5px 15px;
810
border: none;
911
border-radius: 5px 5px 5px 5px;

0 commit comments

Comments
 (0)