|
1 | | -use gtk4::gio::Menu; |
| 1 | +use crate::state::FmState; |
| 2 | +use gtk4::gio::{Menu, SimpleAction}; |
2 | 3 | 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; |
4 | 8 |
|
5 | 9 | pub fn build_headerbar() -> GtkBox { |
6 | 10 | let headerbar = GtkBox::new(gtk4::Orientation::Horizontal, 6); |
7 | 11 |
|
8 | | - // Main menu |
| 12 | + // Main menu model |
9 | 13 | 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); |
12 | 26 |
|
13 | 27 | // "View" submenu |
14 | 28 | let view_submenu = Menu::new(); |
15 | 29 | view_submenu.append(Some("Show Hidden Files"), Some("win.show_hidden")); |
16 | | - |
17 | 30 | menu.append_submenu(Some("View"), &view_submenu); |
18 | 31 |
|
| 32 | + // Menu button |
19 | 33 | let menu_button = MenuButton::new(); |
20 | 34 | menu_button.set_menu_model(Some(&menu)); |
21 | 35 |
|
22 | 36 | headerbar.append(&menu_button); |
23 | 37 | headerbar |
24 | 38 | } |
| 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 | +} |
0 commit comments