use fltk::{ app::{self, App}, dialog, enums::{Color, Shortcut}, group::Flex, menu::{CMenuItem, MenuBar, MenuFlag, MenuItem}, prelude::*, text::{TextBuffer, TextEditor}, window::Window, }; fn menu_cb(m: &mut impl MenuExt) { let ed: TextEditor = app::widget_from_id("ed").unwrap(); if let Ok(mpath) = m.item_pathname(None) { match mpath.as_str() { "&File/&New" => println!("new"), "&File/&Open" => println!("open"), "&File/&Quit" => app::quit(), "&Edit/Cut" => ed.cut(), "&Edit/Copy" => ed.copy(), "&Edit/Paste" => ed.paste(), "&Help/About" => dialog::message_default("Dialog box"), _ => (), } } } fn main() { let a = App::default(); let cmenu = &[ CMenuItem { text: Some("&File"), flags: MenuFlag::Submenu, ..Default::default() }, CMenuItem { text: Some("&New"), shortcut: Shortcut::Ctrl | 'n', ..Default::default() }, CMenuItem { text: Some("&Open"), shortcut: Shortcut::Ctrl | 'o', flags: MenuFlag::MenuDivider, ..Default::default() }, CMenuItem { text: Some("&Quit"), shortcut: Shortcut::Ctrl | 'q', labelcolor: Color::Red, ..Default::default() }, CMenuItem::empty(), CMenuItem { text: Some("&Edit"), flags: MenuFlag::Submenu, ..Default::default() }, CMenuItem { text: Some("Cut"), shortcut: Shortcut::Ctrl | 'x', ..Default::default() }, CMenuItem { text: Some("Copy"), shortcut: Shortcut::Ctrl | 'c', ..Default::default() }, CMenuItem { text: Some("Paste"), shortcut: Shortcut::Ctrl | 'v', ..Default::default() }, CMenuItem::empty(), CMenuItem { text: Some("&Help"), flags: MenuFlag::Submenu, ..Default::default() }, CMenuItem { text: Some("About"), ..Default::default() }, CMenuItem::empty(), CMenuItem::empty(), ]; let cmenu = MenuItem::new_from_cmenu(cmenu); let buf = TextBuffer::default(); let mut w = Window::default().with_size(400, 300); let mut col = Flex::default_fill().column(); let mut c = MenuBar::default(); c.set_callback(menu_cb); unsafe { c.set_menu(cmenu); } col.fixed(&c, 30); let mut ed = TextEditor::default().with_id("ed"); ed.set_buffer(buf); col.end(); w.end(); w.show(); a.run().unwrap(); }