use std::any::Any;
use crate::co;
use crate::decl::*;
use crate::gui::{privs::*, *};
use crate::msg::*;
use crate::prelude::*;
#[derive(Clone)]
enum RawDlg {
Raw(RawMain),
Dlg(DlgMain),
}
#[derive(Clone)]
pub struct WindowMain(RawDlg);
unsafe impl Send for WindowMain {}
impl AsRef<BaseWnd> for WindowMain {
fn as_ref(&self) -> &BaseWnd {
match &self.0 {
RawDlg::Raw(r) => r.raw_base().base(),
RawDlg::Dlg(d) => d.dlg_base().base(),
}
}
}
impl GuiWindow for WindowMain {
fn hwnd(&self) -> &HWND {
self.as_ref().hwnd()
}
fn as_any(&self) -> &dyn Any {
self
}
}
impl GuiParent for WindowMain {}
impl WindowMain {
#[must_use]
pub fn new(opts: WindowMainOpts) -> Self {
Self(RawDlg::Raw(RawMain::new(opts)))
}
#[must_use]
pub fn new_dlg(dlg_id: u16, icon_id: Option<u16>, accel_tbl_id: Option<u16>) -> Self {
Self(RawDlg::Dlg(DlgMain::new(dlg_id, icon_id, accel_tbl_id)))
}
pub fn run_main(&self, cmd_show: Option<co::SW>) -> AnyResult<i32> {
initial_gui_setup();
let hinst = HINSTANCE::GetModuleHandle(None).expect(DONTFAIL);
let res = match &self.0 {
RawDlg::Raw(r) => r.run_main(&hinst, cmd_show),
RawDlg::Dlg(d) => d.run_main(&hinst, cmd_show),
};
ui_font::delete(); res
}
#[must_use]
pub fn on(&self) -> &impl GuiEventsParent {
self.as_ref().on()
}
pub fn close(&self) {
unsafe {
self.hwnd().PostMessage(wm::Close {}).unwrap();
}
}
}