extern crate native_windows_gui as nwg;
extern crate native_windows_derive as nwd;
use nwd::{NwgUi, NwgPartial};
use nwg::NativeUi;
#[derive(Default, NwgUi)]
pub struct PartialDemo {
#[nwg_control(size: (500, 400), position: (300, 300), title: "Many UI")]
#[nwg_events( OnWindowClose: [PartialDemo::exit] )]
window: nwg::Window,
#[nwg_layout(parent: window)]
layout: nwg::FlexboxLayout,
#[nwg_control(collection: vec!["People", "Animals", "Food"])]
#[nwg_layout_item(layout: layout)]
#[nwg_events( OnListBoxSelect: [PartialDemo::change_interface] )]
menu: nwg::ListBox<&'static str>,
#[nwg_control]
#[nwg_layout_item(layout: layout)]
frame1: nwg::Frame,
#[nwg_control(flags: "BORDER")]
frame2: nwg::Frame,
#[nwg_control(flags: "BORDER")]
frame3: nwg::Frame,
#[nwg_partial(parent: frame1)]
#[nwg_events( (save_btn, OnButtonClick): [PartialDemo::save] )]
people_ui: PeopleUi,
#[nwg_partial(parent: frame2)]
#[nwg_events( (save_btn, OnButtonClick): [PartialDemo::save] )]
animal_ui: AnimalUi,
#[nwg_partial(parent: frame3)]
#[nwg_events( (save_btn, OnButtonClick): [PartialDemo::save] )]
food_ui: FoodUi,
}
impl PartialDemo {
fn change_interface(&self) {
self.frame1.set_visible(false);
self.frame2.set_visible(false);
self.frame3.set_visible(false);
let layout = &self.layout;
if layout.has_child(&self.frame1) { layout.remove_child(&self.frame1); }
if layout.has_child(&self.frame2) { layout.remove_child(&self.frame2); }
if layout.has_child(&self.frame3) { layout.remove_child(&self.frame3); }
use nwg::stretch::{geometry::Size, style::{Style, Dimension as D}};
let mut style = Style::default();
style.size = Size { width: D::Percent(1.0), height: D::Auto };
match self.menu.selection() {
None | Some(0) => {
layout.add_child(&self.frame1, style).unwrap();
self.frame1.set_visible(true);
},
Some(1) => {
layout.add_child(&self.frame2, style).unwrap();
self.frame2.set_visible(true);
},
Some(2) => {
layout.add_child(&self.frame3, style).unwrap();
self.frame3.set_visible(true);
},
Some(_) => unreachable!()
}
}
fn save(&self) {
nwg::simple_message("Saved!", "Data saved!");
}
fn exit(&self) {
nwg::stop_thread_dispatch();
}
}
#[derive(Default, NwgPartial)]
pub struct PeopleUi {
#[nwg_layout(max_size: [1000, 150], min_size: [100, 120])]
layout: nwg::GridLayout,
#[nwg_layout(min_size: [100, 200], max_column: Some(2), max_row: Some(6))]
layout2: nwg::GridLayout,
#[nwg_control(text: "Name:", h_align: HTextAlign::Right)]
#[nwg_layout_item(layout: layout, col: 0, row: 0)]
label1: nwg::Label,
#[nwg_control(text: "Age:", h_align: HTextAlign::Right)]
#[nwg_layout_item(layout: layout, col: 0, row: 1)]
label2: nwg::Label,
#[nwg_control(text: "Job:", h_align: HTextAlign::Right)]
#[nwg_layout_item(layout: layout, col: 0, row: 2)]
label3: nwg::Label,
#[nwg_control(text: "John Doe")]
#[nwg_layout_item(layout: layout, col: 1, row: 0)]
#[nwg_events(OnChar: [print_char(EVT_DATA)])]
name_input: nwg::TextInput,
#[nwg_control(text: "75", flags: "NUMBER|VISIBLE")]
#[nwg_layout_item(layout: layout, col: 1, row: 1)]
age_input: nwg::TextInput,
#[nwg_control(text: "Programmer")]
#[nwg_layout_item(layout: layout, col: 1, row: 2)]
job_input: nwg::TextInput,
#[nwg_control(text: "Save")]
#[nwg_layout_item(layout: layout2, col: 1, row: 5)]
save_btn: nwg::Button,
}
#[derive(Default, NwgPartial)]
pub struct AnimalUi {
#[nwg_layout(max_size: [1000, 150], min_size: [100, 120])]
layout: nwg::GridLayout,
#[nwg_layout(min_size: [100, 200], max_column: Some(2), max_row: Some(6))]
layout2: nwg::GridLayout,
#[nwg_control(text: "Name:", h_align: HTextAlign::Right)]
#[nwg_layout_item(layout: layout, col: 0, row: 0)]
label1: nwg::Label,
#[nwg_control(text: "Race:", h_align: HTextAlign::Right)]
#[nwg_layout_item(layout: layout, col: 0, row: 1)]
label2: nwg::Label,
#[nwg_control(text: "Is fluffy:", h_align: HTextAlign::Right)]
#[nwg_layout_item(layout: layout, col: 0, row: 2)]
label3: nwg::Label,
#[nwg_control(text: "Mittens")]
#[nwg_layout_item(layout: layout, col: 1, row: 0)]
#[nwg_events(OnChar: [print_char(EVT_DATA)])]
name_input: nwg::TextInput,
#[nwg_control(collection: vec!["Cat", "Dog", "Pidgeon", "Monkey"], selected_index: Some(0))]
#[nwg_layout_item(layout: layout, col: 1, row: 1)]
race_input: nwg::ComboBox<&'static str>,
#[nwg_control(text: "", check_state: CheckBoxState::Checked)]
#[nwg_layout_item(layout: layout, col: 1, row: 2)]
is_soft_input: nwg::CheckBox,
#[nwg_control(text: "Save")]
#[nwg_layout_item(layout: layout2, col: 1, row: 5)]
save_btn: nwg::Button,
}
#[derive(Default, NwgPartial)]
pub struct FoodUi {
#[nwg_layout(max_size: [1000, 90], min_size: [100, 80])]
layout: nwg::GridLayout,
#[nwg_layout(min_size: [100, 200], max_column: Some(2), max_row: Some(6))]
layout2: nwg::GridLayout,
#[nwg_control(text: "Name:", h_align: HTextAlign::Right)]
#[nwg_layout_item(layout: layout, col: 0, row: 0)]
label1: nwg::Label,
#[nwg_control(text: "Tasty:", h_align: HTextAlign::Right)]
#[nwg_layout_item(layout: layout, col: 0, row: 1)]
label2: nwg::Label,
#[nwg_control(text: "Banana")]
#[nwg_layout_item(layout: layout, col: 1, row: 0)]
#[nwg_events(OnChar: [print_char(EVT_DATA)])]
name_input: nwg::TextInput,
#[nwg_control(text: "", check_state: CheckBoxState::Checked)]
#[nwg_layout_item(layout: layout, col: 1, row: 1)]
tasty_input: nwg::CheckBox,
#[nwg_control(text: "Save")]
#[nwg_layout_item(layout: layout2, col: 1, row: 5)]
save_btn: nwg::Button,
}
fn print_char(data: &nwg::EventData) {
println!("{:?}", data.on_char());
}
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 _ui = PartialDemo::build_ui(Default::default()).expect("Failed to build UI");
nwg::dispatch_thread_events();
}