Fixed issues in native menus. #5503

1. Lock layout selection from native menus not reflecting in preferences dialogue.
2. Sort sub menus with labels and priority in the toolbar and context menus
pull/5630/head
Nikhil Mohite 2022-12-09 14:08:35 +05:30 committed by GitHub
parent adfef8e2bb
commit c752183199
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 67 additions and 37 deletions

View File

@ -296,9 +296,10 @@ function launchPgAdminWindow() {
if (pgadminWindow?.window?.pgAdmin?.Browser?.Events && pgadminWindow?.window?.pgAdmin?.Browser?.MainMenus?.length > 0) {
pgadminWindow.window.pgAdmin.Browser.Events.on('pgadmin:nw-enable-disable-menu-items', enableDisableMenuItem);
pgadminWindow.window.pgAdmin.Browser.Events.on('pgadmin:nw-refresh-menu-item', refreshMenuItems);
pgadminWindow.window.pgAdmin.Browser.Events.on('pgadmin:nw-update-checked-menu-item', updateCheckedMenuItem);
// Add Main Menus to native menu.
pgadminWindow.window.pgAdmin.Browser.MainMenus.forEach((menu)=> {
addMenu(pgadminWindow.window.pgAdmin.Browser, menu)
addMenu(menu)
})
clearInterval(addMenuInterval);
}
@ -380,11 +381,11 @@ splashWindow.on('close', function () {
});
function addCommonMenus(pgBrowser, menu) {
function addCommonMenus(menu) {
let _menu = new gui.Menu();
menu.menuItems.forEach((menuItem) => {
var submenu = getSubMenu(pgBrowser, menuItem);
var submenu = getSubMenu(menuItem);
let _menuItem = new gui.MenuItem({
label: menuItem.label,
@ -427,7 +428,7 @@ function addCommonMenus(pgBrowser, menu) {
}
function getSubMenu(pgBrowser, menuItem) {
function getSubMenu(menuItem) {
let submenu = new gui.Menu();
if (menuItem.menu_items) {
menuItem.menu_items.forEach((item) => {
@ -460,12 +461,12 @@ function getSubMenu(pgBrowser, menuItem) {
return submenu;
}
function addMacMenu(pgBrowser, menu) {
function addMacMenu(menu) {
if (menu.name == 'file' && platform() === 'darwin') {
var rootMenu = nativeMenu.items[0].submenu;
let indx = 0;
menu.menuItems.forEach((menuItem) => {
let submenu = getSubMenu(pgBrowser, menuItem);
let submenu = getSubMenu(menuItem);
rootMenu.insert(
new gui.MenuItem({
@ -489,21 +490,21 @@ function addMacMenu(pgBrowser, menu) {
pgAdminMainScreen.menu = nativeMenu;
} else {
addCommonMenus(pgBrowser, menu)
addCommonMenus(menu)
}
}
function addOtherOsMenu(pgBrowser, menu) {
addCommonMenus(pgBrowser, menu)
function addOtherOsMenu(menu) {
addCommonMenus(menu)
}
function addMenu(pgBrowser, menu) {
function addMenu(menu) {
pgAdminMainScreen.isCustomMenusAdded = true;
if (platform() === 'darwin') {
addMacMenu(pgBrowser, menu);
addMacMenu(menu);
} else {
addOtherOsMenu(pgBrowser, menu);
addOtherOsMenu(menu);
}
addMenuCompleted = true;
}
@ -523,6 +524,25 @@ function enableDisableMenuItem(menu, menuItem) {
}
}
function updateCheckedMenuItem(menuItem) {
// check/ uncheck specific menu item
pgAdminMainScreen.menu.items.forEach(el => {
el.submenu.items.forEach((sub) => {
if(sub.label == menuItem.parentMenu.label) {
sub.submenu.items.forEach((sm)=> {
if (sm.label == menuItem.label && sm.type == 'checkbox') {
sm.checked = menuItem.checked
}
})
} else {
if (sub.label == menuItem.label && type == 'checkbox') {
sub.checked = menuItem.checked
}
}
});
});
}
function refreshMenuItems(menu) {
// Add menu item/option in specific menu.
pgAdminMainScreen.menu.items.forEach(el => {

View File

@ -398,6 +398,9 @@ define('pgadmin.browser', [
let is_all_option_dis = true;
category[c].forEach((c)=> {
c.is_disabled = c.disabled(d, item);
c.setDisabled( c.is_disabled);
if(is_all_option_dis)
is_all_option_dis = c.is_disabled;
});
@ -478,8 +481,8 @@ define('pgadmin.browser', [
let {name: browser} = getBrowser();
if(browser == 'Nwjs') {
pgBrowser.MainMenus.forEach((menu) => {
menu.menuItems.forEach((_item) => {
_item.setDisabled(_item.disabled(d, item));
menu.menuItems.forEach((item) => {
item.setDisabled(item.disabled(d, item));
});
});
}else {

View File

@ -79,6 +79,8 @@ export class MainMenuItemFactory {
}
}}, (menu, item)=> {
pgAdmin.Browser.Events.trigger('pgadmin:nw-enable-disable-menu-items', menu, item);
}, (item) => {
pgAdmin.Browser.Events.trigger('pgadmin:nw-update-checked-menu-item', item);
});
}
}

View File

@ -31,16 +31,7 @@ export default class Menu {
this.menuItems.splice(index, 0, menuItem);
} else {
this.menuItems.push(menuItem);
// Sort by alphanumeric ordered first
this.menuItems.sort(function (a, b) {
return a.label.localeCompare(b.label);
});
// Sort by priority
this.menuItems.sort(function (a, b) {
return a.priority - b.priority;
});
Menu.sortMenus(this.menuItems);
}
} else {
throw new Error(gettext('Invalid MenuItem instance'));
@ -54,6 +45,12 @@ export default class Menu {
if (item instanceof MenuItem) {
item.parentMenu = this;
this.menuItems.push(item);
if(item?.menu_items && item.menu_items.length > 0) {
item.menu_items.forEach((i)=> {
i.parentMenu = item;
});
Menu.sortMenus(item.menu_items);
}
} else {
let subItems = Object.values(item);
subItems.forEach((subItem)=> {
@ -81,16 +78,25 @@ export default class Menu {
setMenuItems(menuItems) {
this.menuItems = menuItems;
Menu.sortMenus(this.menuItems);
this.menuItems.forEach((item)=> {
if(item?.menu_items?.length > 0) {
Menu.sortMenus(item.menu_items);
}
});
}
static sortMenus(menuItems) {
// Sort by alphanumeric ordered first
this.menuItems.sort(function (a, b) {
menuItems.sort(function (a, b) {
return a.label.localeCompare(b.label);
});
// Sort by priority
this.menuItems.sort(function (a, b) {
menuItems.sort(function (a, b) {
return a.priority - b.priority;
});
}
getMenuItems() {
@ -98,15 +104,7 @@ export default class Menu {
}
static getContextMenus(menuList, item, node) {
// Sort by alphanumeric ordered first
menuList.sort(function (a, b) {
return a.label.localeCompare(b.label);
});
// Sort by priority
menuList.sort(function (a, b) {
return a.priority - b.priority;
});
Menu.sortMenus(menuList);
let ctxMenus = {};
let ctxIndex = 1;
@ -115,6 +113,7 @@ export default class Menu {
let sub_ctx_item = {};
ctx.is_disabled = ctx.disabled(node, item);
if ('menu_items' in ctx && ctx.menu_items) {
Menu.sortMenus(ctx.menu_items);
ctx.menu_items.forEach((c) => {
c.is_disabled = c.disabled(node, item);
if (!c.is_disabled) {
@ -138,7 +137,7 @@ export default class Menu {
export class MenuItem {
constructor(options, onDisableChange) {
constructor(options, onDisableChange, onChangeChacked) {
let menu_opts = [
'name', 'label', 'priority', 'module', 'callback', 'data', 'enable',
'category', 'target', 'url', 'node',
@ -159,12 +158,18 @@ export class MenuItem {
};
}
this.onDisableChange = onDisableChange;
this.changeChecked = onChangeChacked;
}
static create(options) {
return MenuItem(options);
}
change_checked(isChecked) {
this.checked = isChecked;
this.changeChecked?.(this);
}
contextMenuCallback(self) {
self.callback();
}