[NativeMenu] Do not auto toggle check/multi-state items. Add is_native_menu method.

This commit is contained in:
bruvzg
2024-07-08 09:36:56 +03:00
parent 42e5b3ac2d
commit eddc9cea11
9 changed files with 62 additions and 64 deletions

View File

@ -81,22 +81,6 @@ void NativeMenuWindows::_menu_activate(HMENU p_menu, int p_index) const {
if (GetMenuItemInfoW(md->menu, p_index, true, &item)) {
MenuItemData *item_data = (MenuItemData *)item.dwItemData;
if (item_data) {
if (item_data->max_states > 0) {
item_data->state++;
if (item_data->state >= item_data->max_states) {
item_data->state = 0;
}
}
if (item_data->checkable_type == CHECKABLE_TYPE_CHECK_BOX) {
if ((item.fState & MFS_CHECKED) == MFS_CHECKED) {
item.fState &= ~MFS_CHECKED;
} else {
item.fState |= MFS_CHECKED;
}
SetMenuItemInfoW(md->menu, p_index, true, &item);
}
if (item_data->callback.is_valid()) {
Variant ret;
Callable::CallError ce;
@ -619,9 +603,12 @@ bool NativeMenuWindows::is_item_checked(const RID &p_rid, int p_idx) const {
MENUITEMINFOW item;
ZeroMemory(&item, sizeof(item));
item.cbSize = sizeof(item);
item.fMask = MIIM_STATE;
item.fMask = MIIM_STATE | MIIM_DATA;
if (GetMenuItemInfoW(md->menu, p_idx, true, &item)) {
return (item.fState & MFS_CHECKED) == MFS_CHECKED;
MenuItemData *item_data = (MenuItemData *)item.dwItemData;
if (item_data) {
return item_data->checked;
}
}
return false;
}
@ -861,12 +848,16 @@ void NativeMenuWindows::set_item_checked(const RID &p_rid, int p_idx, bool p_che
MENUITEMINFOW item;
ZeroMemory(&item, sizeof(item));
item.cbSize = sizeof(item);
item.fMask = MIIM_STATE;
item.fMask = MIIM_STATE | MIIM_DATA;
if (GetMenuItemInfoW(md->menu, p_idx, true, &item)) {
if (p_checked) {
item.fState |= MFS_CHECKED;
} else {
item.fState &= ~MFS_CHECKED;
MenuItemData *item_data = (MenuItemData *)item.dwItemData;
if (item_data) {
item_data->checked = p_checked;
if (p_checked) {
item.fState |= MFS_CHECKED;
} else {
item.fState &= ~MFS_CHECKED;
}
}
SetMenuItemInfoW(md->menu, p_idx, true, &item);
}