native-windows-gui 1.0.13

A rust library to develop native GUI applications on the desktop for Microsoft Windows. Native-windows-gui wraps the native win32 window controls in a rustic API
Documentation
/*!

    An application that show how to use the TreeView control.

    Requires the following features: `cargo run --example treeview_d --features "tree-view tree-view-iterator listbox image-list frame"`
*/


extern crate native_windows_gui as nwg;
extern crate native_windows_derive as nwd;

use nwd::NwgUi;
use nwg::NativeUi;


#[derive(Default, NwgUi)]
pub struct TreeViewApp {
    #[nwg_control(size: (600, 350), position: (300, 300), title: "TreeView - Musteloidea")]
    #[nwg_events( OnWindowClose: [TreeViewApp::exit], OnInit: [TreeViewApp::load_data] )]
    window: nwg::Window,

    #[nwg_resource(initial: 5, size: (16, 16))]
    view_icons: nwg::ImageList,

    #[nwg_layout(parent: window)]
    layout: nwg::GridLayout,

    #[nwg_control(focus: true)]
    #[nwg_layout_item(layout: layout, col: 0, col_span: 3, row: 0, row_span: 6)]
    #[nwg_events(
        OnTreeViewClick: [TreeViewApp::log_events(SELF, EVT)],
        OnTreeViewDoubleClick: [TreeViewApp::log_events(SELF, EVT)],
        OnTreeViewRightClick: [TreeViewApp::log_events(SELF, EVT)],
        OnTreeFocusLost: [TreeViewApp::log_events(SELF, EVT)],
        OnTreeFocus: [TreeViewApp::log_events(SELF, EVT)],
        OnTreeItemDelete: [TreeViewApp::log_events(SELF, EVT)],
        OnTreeItemExpanded: [TreeViewApp::log_events(SELF, EVT)],
        OnTreeItemChanged: [TreeViewApp::log_events(SELF, EVT)],
        OnTreeItemSelectionChanged: [TreeViewApp::log_events(SELF, EVT)],
    )]
    tree_view: nwg::TreeView,

    #[nwg_control(flags: "VISIBLE")]
    #[nwg_layout_item(layout: layout, col: 3, col_span: 2, row: 0, row_span: 3,)]
    control_frame: nwg::Frame,

    #[nwg_layout(parent: control_frame, spacing: 3, margin: [0,0,0,0])]
    control_layout: nwg::GridLayout,

    #[nwg_control(parent: control_frame, text: "Options:")]
    #[nwg_layout_item(layout: control_layout, col: 0, row: 0)]
    label1: nwg::Label,

    #[nwg_control(parent: control_frame, text: "New item name")]
    #[nwg_layout_item(layout: control_layout, col: 0, col_span: 2, row: 1)]
    new_item: nwg::TextInput,

    #[nwg_control(parent: control_frame, text: "Add")]
    #[nwg_layout_item(layout: control_layout, col: 0, row: 2)]
    #[nwg_events(OnButtonClick: [TreeViewApp::button_actions(SELF, CTRL)])]
    add_btn: nwg::Button,

    #[nwg_control(parent: control_frame, text: "Del")]
    #[nwg_layout_item(layout: control_layout, col: 1, row: 2)]
    #[nwg_events(OnButtonClick: [TreeViewApp::button_actions(SELF, CTRL)])]
    remove_btn: nwg::Button,

    #[nwg_control(text: "Events:")]
    #[nwg_layout_item(layout: layout, col: 3, col_span: 2, row: 3)]
    label2: nwg::Label,

    #[nwg_control]
    #[nwg_layout_item(layout: layout, col: 3, col_span: 2, row: 4, row_span: 2)]
    events_log: nwg::ListBox<String>,
}

impl TreeViewApp {
    
    fn load_data(&self) {
        let tv = &self.tree_view;
        let icons = &self.view_icons;

        icons.add_icon_from_filename("./test_rc/cog.ico").unwrap();
        icons.add_icon_from_filename("./test_rc/love.ico").unwrap();

        tv.set_image_list(Some(icons));

        let root = tv.insert_item("Caniformia", None, nwg::TreeInsert::Root);
        tv.insert_item("Canidae (dogs and other canines)", Some(&root), nwg::TreeInsert::Last);
        
        let arc = tv.insert_item("Arctoidea", Some(&root), nwg::TreeInsert::Last);
        tv.insert_item("Ursidae (bears)", Some(&arc), nwg::TreeInsert::Last);
        
        let mus = tv.insert_item("Musteloidea (weasel)", Some(&arc), nwg::TreeInsert::Last);

        tv.insert_item("Mephitidae (skunks)", Some(&mus), nwg::TreeInsert::Last);
        tv.insert_item("Ailuridae (red panda)", Some(&mus), nwg::TreeInsert::Last);
        tv.insert_item("Procyonidae (raccoons and allies)", Some(&mus), nwg::TreeInsert::Last);
        tv.insert_item("Mustelidae (weasels and allies)", Some(&mus), nwg::TreeInsert::Last);

        tv.set_text_color(50, 50, 200);

        // Expand and sets the selected icon for each item in the tree
        for item in tv.iter() {
            tv.set_expand_state(&item, nwg::ExpandState::Expand);
            tv.set_item_image(&item, 1, true);
        }
    }

    fn button_actions(&self, btn: &nwg::Button) {
        let tv = &self.tree_view;

        if btn == &self.add_btn {
            let text = self.new_item.text();
            let item = match tv.selected_item() {
                Some(i) => { tv.insert_item(&text, Some(&i), nwg::TreeInsert::Last) },
                None => { tv.insert_item(&text, None, nwg::TreeInsert::Root) }
            };

            tv.set_item_image(&item, 1, true);
        } else if btn == &self.remove_btn {
            if let Some(item) = tv.selected_item() {
                tv.remove_item(&item);
            }
        }
    }

    fn log_events(&self, evt: nwg::Event) {
        self.events_log.insert(0, format!("{:?}", evt));
    }

    fn exit(&self) {
        nwg::stop_thread_dispatch();
    }

}

fn main() {
    nwg::init().expect("Failed to init Native Windows GUI");
    nwg::Font::set_global_family("Segoe UI").expect("Failed to set default font");

    let _app = TreeViewApp::build_ui(Default::default()).expect("Failed to build UI");

    nwg::dispatch_thread_events();
}