use std::io;
use num_enum::IntoPrimitive;
use windows::Win32::Foundation::HWND;
use windows::Win32::UI::Shell::{
ITaskbarList3,
TBPF_ERROR,
TBPF_INDETERMINATE,
TBPF_NOPROGRESS,
TBPF_NORMAL,
TBPF_PAUSED,
TBPFLAG,
TaskbarList,
};
use windows::core::GUID;
use crate::com::ComInterfaceExt;
use crate::internal::custom_err_with_code;
use crate::ui::window::WindowHandle;
#[derive(IntoPrimitive, Copy, Clone, Eq, PartialEq, Default, Debug)]
#[repr(i32)]
pub enum ProgressState {
#[default]
NoProgress = TBPF_NOPROGRESS.0,
Indeterminate = TBPF_INDETERMINATE.0,
Normal = TBPF_NORMAL.0,
Error = TBPF_ERROR.0,
Paused = TBPF_PAUSED.0,
}
impl From<ProgressState> for TBPFLAG {
fn from(value: ProgressState) -> Self {
TBPFLAG(value.into())
}
}
pub struct Taskbar {
taskbar_list_3: ITaskbarList3,
}
impl Taskbar {
pub fn new() -> io::Result<Self> {
let result = Taskbar {
taskbar_list_3: ITaskbarList3::new_instance()?,
};
Ok(result)
}
pub fn set_progress_state(&self, window: WindowHandle, state: ProgressState) -> io::Result<()> {
let ret_val = unsafe {
self.taskbar_list_3
.SetProgressState(HWND::from(window), state.into())
};
ret_val.map_err(|err| custom_err_with_code("Error setting progress state", err.code()))
}
pub fn set_progress_value(
&self,
window: WindowHandle,
completed: u64,
total: u64,
) -> io::Result<()> {
let ret_val = unsafe {
self.taskbar_list_3
.SetProgressValue(HWND::from(window), completed, total)
};
ret_val.map_err(|err| custom_err_with_code("Error setting progress value", err.code()))
}
}
impl ComInterfaceExt for ITaskbarList3 {
const CLASS_GUID: GUID = TaskbarList;
}