/*!
    Small example that shows how to accept file drop in an application

    Requires the following features: `cargo run --example drop_files_d --features "textbox"`
*/


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

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

use std::fs;


#[derive(Default, NwgUi)]
pub struct DropApp {
    #[nwg_control(size: (360, 360), position: (300, 300), title: "Drag & Drop", accept_files: true)]
    #[nwg_events( OnWindowClose: [nwg::stop_thread_dispatch()], OnFileDrop: [DropApp::load_text(SELF, EVT_DATA)] )]
    window: nwg::Window,

    #[nwg_layout(parent: window, spacing: 1)]
    grid: nwg::GridLayout,

    #[nwg_control]
    #[nwg_layout_item(layout: grid)]
    text: nwg::TextBox,
}

impl DropApp {
    pub fn load_text(&self, data: &nwg::EventData) {
        let drop = data.on_file_drop();

        let mut text = String::with_capacity(1000);

        for file in drop.files() {
            text.push_str(&fs::read_to_string(file).unwrap_or("Invalid file".into()));
        }

        self.text.set_text(&text);
    }
}

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

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

    nwg::dispatch_thread_events();
}