#![allow(unsafe_op_in_unsafe_fn)]
use crate::types::*;
use super::base::Component;
use crate::ui::builder::ControlBuilder;
use crate::ui::controls::apply_button_theme;
use crate::ui::layout::{layout_horizontal, LayoutItem, SizePolicy};
const ICON_SETTINGS: &[u16] = &[0xE713, 0]; const ICON_KEYBOARD: &[u16] = &[0xE765, 0]; const ICON_ABOUT: &[u16] = &[0xE946, 0]; const ICON_CONSOLE: &[u16] = &[0xE756, 0]; const ICON_WATCHER: &[u16] = &[0xE9D2, 0];
pub struct HeaderPanelIds {
pub btn_settings: u16,
pub btn_about: u16,
pub btn_shortcuts: u16,
pub btn_console: u16,
pub btn_watcher: u16,
}
pub struct HeaderPanel {
hwnd_settings: HWND,
hwnd_about: HWND,
hwnd_shortcuts: HWND,
hwnd_console: HWND,
hwnd_watcher: HWND,
ids: HeaderPanelIds,
}
impl HeaderPanel {
pub fn new(ids: HeaderPanelIds) -> Self {
Self {
hwnd_settings: std::ptr::null_mut(),
hwnd_about: std::ptr::null_mut(),
hwnd_shortcuts: std::ptr::null_mut(),
hwnd_console: std::ptr::null_mut(),
hwnd_watcher: std::ptr::null_mut(),
ids,
}
}
#[inline]
pub fn settings_hwnd(&self) -> HWND {
self.hwnd_settings
}
#[inline]
pub fn about_hwnd(&self) -> HWND {
self.hwnd_about
}
#[inline]
pub fn shortcuts_hwnd(&self) -> HWND {
self.hwnd_shortcuts
}
#[inline]
pub fn console_hwnd(&self) -> HWND {
self.hwnd_console
}
#[inline]
pub fn watcher_hwnd(&self) -> HWND {
self.hwnd_watcher
}
pub unsafe fn set_font(&self, hfont: HFONT) {
let _ = hfont;
}
}
impl Component for HeaderPanel {
unsafe fn create(&mut self, parent: HWND) -> Result<(), String> {
unsafe {
let _module = GetModuleHandleW(std::ptr::null());
let is_dark = crate::ui::theme::is_system_dark_mode();
let icon_font = crate::ui::theme::get_icon_font();
self.hwnd_settings = ControlBuilder::new(parent, self.ids.btn_settings)
.text_w(ICON_SETTINGS)
.pos(0, 0).size(30, 25).dark_mode(is_dark)
.font(icon_font)
.build();
self.hwnd_about = ControlBuilder::new(parent, self.ids.btn_about)
.text_w(ICON_ABOUT)
.pos(0, 0).size(30, 25).dark_mode(is_dark)
.font(icon_font)
.build();
self.hwnd_shortcuts = ControlBuilder::new(parent, self.ids.btn_shortcuts)
.text_w(ICON_KEYBOARD)
.pos(0, 0).size(30, 25).dark_mode(is_dark)
.font(icon_font)
.build();
self.hwnd_console = ControlBuilder::new(parent, self.ids.btn_console)
.text_w(ICON_CONSOLE)
.pos(0, 0).size(30, 25).dark_mode(is_dark)
.font(icon_font)
.build();
self.hwnd_watcher = ControlBuilder::new(parent, self.ids.btn_watcher)
.text_w(ICON_WATCHER)
.pos(0, 0).size(30, 25).dark_mode(is_dark)
.font(icon_font)
.build();
Ok(())
}
}
fn hwnd(&self) -> Option<HWND> {
None
}
unsafe fn on_resize(&mut self, parent_rect: &RECT) {
unsafe {
let padding = 10;
let items = [
LayoutItem { hwnd: std::ptr::null_mut(), policy: SizePolicy::Flex(1.0) },
LayoutItem { hwnd: self.hwnd_watcher, policy: SizePolicy::Fixed(30) },
LayoutItem { hwnd: self.hwnd_console, policy: SizePolicy::Fixed(30) },
LayoutItem { hwnd: self.hwnd_shortcuts, policy: SizePolicy::Fixed(30) },
LayoutItem { hwnd: self.hwnd_about, policy: SizePolicy::Fixed(30) },
LayoutItem { hwnd: self.hwnd_settings, policy: SizePolicy::Fixed(30) },
];
let rect_h = 25 + (padding * 2);
let layout_rect = RECT {
left: parent_rect.left,
top: parent_rect.top,
right: parent_rect.right,
bottom: parent_rect.top + rect_h,
};
layout_horizontal(&layout_rect, &items, padding, 5);
}
}
unsafe fn on_theme_change(&mut self, is_dark: bool) {
unsafe {
apply_button_theme(self.hwnd_settings, is_dark);
apply_button_theme(self.hwnd_about, is_dark);
apply_button_theme(self.hwnd_shortcuts, is_dark);
apply_button_theme(self.hwnd_console, is_dark);
apply_button_theme(self.hwnd_watcher, is_dark);
}
}
}