use super::{MenuData, MenuItem};
use crate::{
config::{Config, FontWeight},
MenuIconKind, MenuItemType,
};
use gtk::{
ffi::{GtkMenu, GtkMenuItem, GtkWindow},
glib::{
translate::{FromGlibPtrNone, ToGlibPtr},
IsA, ObjectExt,
},
prelude::GtkSettingsExt,
AccelGroup, Widget,
};
use std::path::Path;
pub(crate) fn get_menu_data<'a>(gtk_menu_handle: isize) -> &'a MenuData {
let menu = to_gtk_menu(gtk_menu_handle);
unsafe { menu.data::<MenuData>("data").unwrap().as_ref() }
}
pub(crate) fn get_menu_data_mut<'a>(gtk_menu_handle: isize) -> &'a mut MenuData {
let menu = to_gtk_menu(gtk_menu_handle);
unsafe { menu.data::<MenuData>("data").unwrap().as_mut() }
}
pub(crate) fn get_accel_group<'a>(gtk_menu_handle: isize) -> &'a AccelGroup {
let menu = to_gtk_menu(gtk_menu_handle);
unsafe { menu.data::<AccelGroup>("accel_group").unwrap().as_ref() }
}
pub(crate) fn get_menu_item_data<'a>(gtk_menu_item: &impl IsA<Widget>) -> &'a MenuItem {
unsafe { gtk_menu_item.data::<MenuItem>("data").unwrap().as_mut() }
}
pub(crate) fn get_menu_item_data_mut<'a>(gtk_menu_item: &impl IsA<Widget>) -> &'a mut MenuItem {
unsafe { gtk_menu_item.data::<MenuItem>("data").unwrap().as_mut() }
}
pub(crate) fn to_gtk_window(gtk_window_handle: isize) -> gtk::Window {
let window: gtk::Window = unsafe { gtk::Window::from_glib_none(gtk_window_handle as *mut GtkWindow) };
window
}
pub(crate) fn from_gtk_window(gtk_window: >k::Window) -> isize {
let ptr: *mut GtkWindow = gtk_window.to_glib_none().0;
ptr as isize
}
pub(crate) fn to_gtk_menu(gtk_menu_handle: isize) -> gtk::Menu {
let menu: gtk::Menu = unsafe { gtk::Menu::from_glib_none(gtk_menu_handle as *mut GtkMenu) };
menu
}
pub(crate) fn from_gtk_menu(gtk_menu: >k::Menu) -> isize {
let ptr: *mut GtkMenu = gtk_menu.to_glib_none().0;
ptr as isize
}
pub(crate) fn to_gtk_menu_item(gtk_menu_item_handle: isize) -> gtk::MenuItem {
let menu_item: gtk::MenuItem = unsafe { gtk::MenuItem::from_glib_none(gtk_menu_item_handle as *mut GtkMenuItem) };
menu_item
}
pub(crate) fn from_gtk_menu_item(gtk_menu_item: >k::MenuItem) -> isize {
let ptr: *mut GtkMenuItem = gtk_menu_item.to_glib_none().0;
ptr as isize
}
pub(crate) fn to_font_weight(weight: FontWeight) -> u32 {
match weight {
FontWeight::Thin => 100,
FontWeight::Light => 300,
FontWeight::Normal => 400,
FontWeight::Medium => 500,
FontWeight::Bold => 700,
}
}
pub(crate) fn is_sys_dark() -> bool {
if let Some(settings) = gtk::Settings::default() {
if let Some(theme_name) = settings.gtk_theme_name() {
return theme_name.as_str().to_lowercase().contains("dark");
}
}
false
}
pub(crate) fn get_custom_check_width(config: &Config) -> Option<u32> {
if let Some(check) = &config.icon.as_ref().unwrap().check {
match &check.icon {
MenuIconKind::Path(_) => None,
MenuIconKind::Data(data) => Some(data.width),
MenuIconKind::Svg(svg) => Some(svg.width),
}
} else {
None
}
}
pub(crate) fn is_svg(file_path: &Path) -> bool {
if let Some(extension) = file_path.extension() {
extension.eq("svg") || extension.eq("SVG")
} else {
false
}
}
pub(crate) fn is_check_menu_item(menu_item_type: MenuItemType) -> bool {
menu_item_type == MenuItemType::Checkbox || menu_item_type == MenuItemType::Radio
}