use crate::co;
use crate::comctl::privs::*;
use crate::decl::*;
use crate::kernel::privs::*;
use crate::prelude::*;
pub enum BmpIconCurMeta {
Bmp(HBITMAP),
Icon(HICON),
Cur(HCURSOR),
Meta(HDC),
}
impl BmpIconCurMeta {
#[must_use]
pub fn as_isize(&self) -> isize {
unsafe {
use BmpIconCurMeta::*;
std::mem::transmute(match self {
Bmp(hbmp) => hbmp.ptr(),
Icon(hicon) => hicon.ptr(),
Cur(hcur) => hcur.ptr(),
Meta(hdc) => hdc.ptr(),
})
}
}
}
pub enum BmpIdbRes {
Bmp(HBITMAP),
Idb(co::IDB),
Res(IdStr, HINSTANCE),
}
pub enum BmpInstId {
Bmp(HBITMAP),
InstId(HINSTANCE, u16),
}
pub enum ClrDefNone {
Clr(COLORREF),
None,
Default,
}
impl ClrDefNone {
#[must_use]
pub const fn as_u32(&self) -> u32 {
use ClrDefNone::*;
match self {
Clr(c) => c.raw(),
None => CLR_NONE,
Default => CLR_DEFAULT,
}
}
}
pub enum IconId<'a> {
None,
Icon(&'a HICON),
Id(u16),
}
impl<'a> Default for IconId<'a> {
fn default() -> Self {
Self::None
}
}
pub enum IconIdTd<'a> {
None,
Icon(&'a HICON),
Id(u16),
Td(co::TD_ICON),
}
impl<'a> Default for IconIdTd<'a> {
fn default() -> Self {
Self::None
}
}
#[derive(Clone)]
pub enum IconRes<'a> {
None,
Res(&'a HINSTANCE, IdStr),
Warn,
Error,
Info,
Shield,
}
impl<'a> IconRes<'a> {
#[must_use]
pub fn as_ptr(&self) -> (HINSTANCE, *const u16) {
use IconRes::*;
match self {
None => (HINSTANCE::NULL, std::ptr::null()),
Res(hinst, id_str) => (unsafe { hinst.raw_copy() }, id_str.as_ptr()),
Warn => (HINSTANCE::NULL, MAKEINTRESOURCE(co::TD_ICON::WARNING.raw() as _)),
Error => (HINSTANCE::NULL, MAKEINTRESOURCE(co::TD_ICON::ERROR.raw() as _)),
Info => (HINSTANCE::NULL, MAKEINTRESOURCE(co::TD_ICON::INFORMATION.raw() as _)),
Shield => (HINSTANCE::NULL, MAKEINTRESOURCE(co::TD_ICON::SHIELD.raw() as _)),
}
}
}
#[derive(Clone, Copy)]
pub enum IdxCbNone {
Idx(u32),
Cb,
None,
}
impl From<IdxCbNone> for isize {
fn from(v: IdxCbNone) -> Self {
use IdxCbNone::*;
match v {
Idx(idx) => idx as _,
Cb => I_IMAGECALLBACK,
None => I_IMAGENONE,
}
}
}
#[derive(Clone)]
pub enum IdxStr {
Idx(u16),
Str(WString),
}
pub enum PtIdx {
Pt(POINT),
Idx(u32),
}
pub enum ResStrs {
Res(IdStr, HINSTANCE),
Strs(WString),
}
impl ResStrs {
#[must_use]
pub fn from_strs(texts: &[impl AsRef<str>]) -> Self {
Self::Strs(WString::from_str_vec(texts))
}
}
pub enum Tdn {
ButtonClicked(u16),
Created,
Destroyed,
DialogConstructed,
ExpandoButtonClicked(bool),
Help,
HyperlinkClicked(String),
Navigated,
RadioButtonClicked(u16),
Timer(u32),
VerificationClicked(bool),
}
impl Tdn {
#[must_use]
pub unsafe fn from_msg(tdn: co::TDN, wp: usize, lp: isize) -> Self {
match tdn {
co::TDN::BUTTON_CLICKED => Self::ButtonClicked(wp as _),
co::TDN::CREATED => Self::Created,
co::TDN::DESTROYED => Self::Destroyed,
co::TDN::DIALOG_CONSTRUCTED => Self::DialogConstructed,
co::TDN::EXPANDO_BUTTON_CLICKED => Self::ExpandoButtonClicked(wp != 0),
co::TDN::HELP => Self::Help,
co::TDN::HYPERLINK_CLICKED => {
Self::HyperlinkClicked(unsafe { WString::from_wchars_nullt(lp as _) }.to_string())
},
co::TDN::NAVIGATED => Self::Navigated,
co::TDN::RADIO_BUTTON_CLICKED => Self::RadioButtonClicked(wp as _),
co::TDN::TIMER => Self::Timer(wp as _),
co::TDN::VERIFICATION_CLICKED => Self::VerificationClicked(wp != 0),
_ => panic!("Invalid TDN value."),
}
}
}
pub enum TreeitemTvi {
Treeitem(HTREEITEM),
Tvi(co::TVI),
}
impl From<TreeitemTvi> for isize {
fn from(v: TreeitemTvi) -> Self {
use TreeitemTvi::*;
match v {
Treeitem(htreeitem) => htreeitem.ptr() as _,
Tvi(tvi) => tvi.raw(),
}
}
}
impl TreeitemTvi {
#[must_use]
pub const fn from_isize(val: isize) -> Self {
match unsafe { co::TVI::from_raw(val) } {
co::TVI::FIRST => Self::Tvi(co::TVI::FIRST),
co::TVI::LAST => Self::Tvi(co::TVI::LAST),
co::TVI::ROOT => Self::Tvi(co::TVI::ROOT),
co::TVI::SORT => Self::Tvi(co::TVI::SORT),
val => Self::Treeitem(unsafe { HTREEITEM::from_ptr(val.raw() as _) }),
}
}
}