wcpopup 0.9.3

Context menu for Windows and Linux
Documentation
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: &gtk::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: &gtk::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: &gtk::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
}