diff --git a/packages/puter-js/src/modules/UI.js b/packages/puter-js/src/modules/UI.js
index c84b45da..08b0839f 100644
--- a/packages/puter-js/src/modules/UI.js
+++ b/packages/puter-js/src/modules/UI.js
@@ -678,6 +678,26 @@ class UI extends EventListener {
this.#postMessageWithObject('setMenubar', spec);
}
+ disableMenuItem = function(item_id) {
+ this.#postMessageWithObject('disableMenuItem', {id: item_id});
+ }
+
+ enableMenuItem = function(item_id) {
+ this.#postMessageWithObject('enableMenuItem', {id: item_id});
+ }
+
+ setMenuItemIcon = function(item_id, icon) {
+ this.#postMessageWithObject('setMenuItemIcon', {id: item_id, icon: icon});
+ }
+
+ setMenuItemIconActive = function(item_id, icon) {
+ this.#postMessageWithObject('setMenuItemIconActive', {id: item_id, icon: icon});
+ }
+
+ setMenuItemChecked = function(item_id, checked) {
+ this.#postMessageWithObject('setMenuItemChecked', {id: item_id, checked: checked});
+ }
+
contextMenu = function(spec) {
this.#postMessageWithObject('contextMenu', spec);
}
diff --git a/src/IPC.js b/src/IPC.js
index f00b6a13..b0c1e0b6 100644
--- a/src/IPC.js
+++ b/src/IPC.js
@@ -393,7 +393,6 @@ window.addEventListener('message', async (event) => {
// get parent window
const el_window = window.window_for_app_instance(event.data.appInstanceID);
-
let items = value.items ?? [];
const sanitize_items = items => {
return items.map(item => {
@@ -432,6 +431,36 @@ window.addEventListener('message', async (event) => {
$(target_iframe).get(0).focus({preventScroll:true});
}
+ // --------------------------------------------------------
+ // disableMenuItem
+ // --------------------------------------------------------
+ else if(event.data.msg === 'disableMenuItem'){
+ set_menu_item_prop(window.menubars[event.data.appInstanceID], event.data.value.id, 'disabled', true);
+ }
+ // --------------------------------------------------------
+ // enableMenuItem
+ // --------------------------------------------------------
+ else if(event.data.msg === 'enableMenuItem'){
+ set_menu_item_prop(window.menubars[event.data.appInstanceID], event.data.value.id, 'disabled', false);
+ }
+ //--------------------------------------------------------
+ // setMenuItemIcon
+ //--------------------------------------------------------
+ else if(event.data.msg === 'setMenuItemIcon'){
+ set_menu_item_prop(window.menubars[event.data.appInstanceID], event.data.value.id, 'icon', event.data.value.icon);
+ }
+ //--------------------------------------------------------
+ // setMenuItemIconActive
+ //--------------------------------------------------------
+ else if(event.data.msg === 'setMenuItemIconActive'){
+ set_menu_item_prop(window.menubars[event.data.appInstanceID], event.data.value.id, 'icon_active', event.data.value.icon_active);
+ }
+ //--------------------------------------------------------
+ // setMenuItemChecked
+ //--------------------------------------------------------
+ else if(event.data.msg === 'setMenuItemChecked'){
+ set_menu_item_prop(window.menubars[event.data.appInstanceID], event.data.value.id, 'checked', event.data.value.checked);
+ }
//--------------------------------------------------------
// setMenubar
//--------------------------------------------------------
@@ -452,6 +481,9 @@ window.addEventListener('message', async (event) => {
e.preventDefault();
});
+ if(!window.menubars[event.data.appInstanceID])
+ window.menubars[event.data.appInstanceID] = value.items;
+
const sanitize_items = items => {
return items.map(item => {
// Check if the item is just '-'
@@ -461,6 +493,10 @@ window.addEventListener('message', async (event) => {
// Otherwise, proceed as before
return {
html: item.label,
+ disabled: item.disabled,
+ checked: item.checked,
+ icon: item.icon ? `` : undefined,
+ icon_active: item.icon_active ? `
` : undefined,
action: item.action,
items: item.items ? sanitize_items(item.items) : undefined
};
@@ -489,8 +525,8 @@ window.addEventListener('message', async (event) => {
// Open the context menu
const ctxMenu = UIContextMenu({
- delay,
- parent_element,
+ delay: delay,
+ parent_element: parent_element,
position: {top: pos.top + 30, left: pos.left},
css: {
'box-shadow': '0px 2px 6px #00000059'
@@ -517,9 +553,13 @@ window.addEventListener('message', async (event) => {
const item = items[i];
const label = html_encode(item.label);
const el_item = $(`