fltk 1.4.20

Rust bindings for the FLTK GUI library
Documentation
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();
}