Skip to content

Commit 68354bf

Browse files
committed
feat: make headerbars better
1 parent be48f75 commit 68354bf

File tree

4 files changed

+200
-122
lines changed

4 files changed

+200
-122
lines changed

src/headerbar.rs

Lines changed: 59 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,77 @@
1-
use gtk4::gio::Menu;
1+
use crate::state::FmState;
2+
use gtk4::gio::{Menu, SimpleAction};
23
use gtk4::prelude::*;
3-
use gtk4::{Box as GtkBox, MenuButton};
4+
use gtk4::{Box as GtkBox, MenuButton, ApplicationWindow, Application};
5+
use std::cell::RefCell;
6+
use std::rc::Rc;
7+
use gtk4::glib;
48

59
pub fn build_headerbar() -> GtkBox {
610
let headerbar = GtkBox::new(gtk4::Orientation::Horizontal, 6);
711

8-
// Main menu
12+
// Main menu model
913
let menu = Menu::new();
10-
menu.append(Some("File"), Some("app.file"));
11-
menu.append(Some("Edit"), Some("app.edit"));
14+
15+
// "File" submenu
16+
let file_submenu = Menu::new();
17+
file_submenu.append(Some("New Window"), Some("win.open_new_window"));
18+
file_submenu.append(Some("Close Window"), Some("win.close_window"));
19+
menu.append_submenu(Some("File"), &file_submenu);
20+
21+
// "Edit" submenu
22+
let edit_submenu = Menu::new();
23+
edit_submenu.append(Some("Undo"), Some("win.undo_history"));
24+
edit_submenu.append(Some("Redo"), Some("win.redo_history"));
25+
menu.append_submenu(Some("Edit"), &edit_submenu);
1226

1327
// "View" submenu
1428
let view_submenu = Menu::new();
1529
view_submenu.append(Some("Show Hidden Files"), Some("win.show_hidden"));
16-
1730
menu.append_submenu(Some("View"), &view_submenu);
1831

32+
// Menu button
1933
let menu_button = MenuButton::new();
2034
menu_button.set_menu_model(Some(&menu));
2135

2236
headerbar.append(&menu_button);
2337
headerbar
2438
}
39+
40+
pub fn implement_actions(window: &ApplicationWindow, app: &Application, fmstate: Rc<RefCell<FmState>>) {
41+
// Show Hidden Files action
42+
let show_hidden_initial = fmstate.borrow().settings.show_hidden;
43+
let show_hidden_action =
44+
SimpleAction::new_stateful("show_hidden", None, &show_hidden_initial.into());
45+
46+
show_hidden_action.connect_activate(glib::clone!(#[strong] fmstate, move |action, _| {
47+
let current: bool = action.state().unwrap().get().unwrap();
48+
action.set_state(&(!current).into());
49+
fmstate.borrow_mut().settings.show_hidden = !current;
50+
}));
51+
52+
window.add_action(&show_hidden_action);
53+
54+
let new_window_action = SimpleAction::new("open_new_window", None);
55+
new_window_action.connect_activate(glib::clone!(#[weak] window, #[weak] app, move |_, _| {
56+
crate::build_fm(&app);
57+
}));
58+
window.add_action(&new_window_action);
59+
60+
let close_window_action = SimpleAction::new("close_window", None);
61+
close_window_action.connect_activate(glib::clone!(#[weak] window, move |_, _| {
62+
window.close();
63+
}));
64+
window.add_action(&close_window_action);
65+
66+
let undo_action = SimpleAction::new("undo_history", None);
67+
undo_action.connect_activate(move |_, _| {
68+
println!("Undo triggered");
69+
});
70+
window.add_action(&undo_action);
71+
72+
let redo_action = SimpleAction::new("redo_history", None);
73+
redo_action.connect_activate(move |_, _| {
74+
println!("Redo triggered");
75+
});
76+
window.add_action(&redo_action);
77+
}

src/main.rs

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ mod state;
77
mod style;
88
mod utils;
99

10-
use gtk4::gio::SimpleAction;
1110
use gtk4::prelude::*;
1211
use gtk4::{Application, ApplicationWindow, Box as GtkBox, GestureClick, Orientation, Paned};
1312
use gtk4::{gio, glib};
@@ -38,20 +37,8 @@ fn build_fm(app: &Application) {
3837
let home_path = gio::File::for_path(glib::home_dir());
3938
let fmstate = Rc::new(RefCell::new(state::FmState::new(home_path.clone())));
4039

41-
// TODO: Move it to its own module
42-
let initial = fmstate.borrow().settings.show_hidden;
43-
let show_hidden_action = SimpleAction::new_stateful("show_hidden", None, &initial.into());
44-
45-
show_hidden_action.connect_activate(glib::clone!(
46-
#[strong]
47-
fmstate,
48-
move |action, _| {
49-
let current: bool = action.state().unwrap().get().unwrap();
50-
action.set_state(&(!current).into());
51-
fmstate.borrow_mut().settings.show_hidden = !current;
52-
}
53-
));
54-
window.add_action(&show_hidden_action);
40+
// implement all actions for the headerbar
41+
headerbar::implement_actions(&window, &app, fmstate.clone());
5542

5643
let (files_scroll, files_list, list_view) = files_panel::build_files_panel(fmstate.clone());
5744
let (sidebar_box, sidebar_selection) = sidebar::build_sidebar(fmstate.clone(), &files_list);

0 commit comments

Comments
 (0)