Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

menus with check/uncheck values becomes assigned to different ones when a submenu exist above them #117

Closed
nokotto opened this issue Mar 25, 2023 · 6 comments · Fixed by #119

Comments

@nokotto
Copy link

nokotto commented Mar 25, 2023

Hi, it may be some kind of array key misaligned? but I wasn't able to locate were. I hope it don't takes much of your time,

Description of the Issue

The menus with check/uncheck values becomes assigned to different ones when a submenu exist above them.
Adding a sepparator or other menu also affects such wrong assigment.

To Reproduce

  • Notepad++ v8.5 or 8.4( v8.5.1 and v8.4.8 what I tested )
  • jN v2.2.185.8 x64
var mainmenu = Editor.addMenu('DebugMenu');
var submenu  = mainmenu.addMenu('SubmenuOne');

var menu_1 = submenu.addItem({ text: 'menu_1', 
	cmd :function(){
		menu_1.checked = !menu_1.checked;
	}
});
menu_1.checked = false;

var menu_2 = submenu.addItem({ text: 'menu_2', 
	cmd :function(){
		menu_2.checked = !menu_2.checked;
	}
});
menu_2.checked = false;

var menu_3 = submenu.addItem({ text: 'menu_3', 
	cmd :function(){
		menu_3.checked = !menu_3.checked;
	}
});
menu_3.checked = false;

//mainmenu.addSeparator(); //This separator affects the order of above checked items also.

var menu_4 = mainmenu.addItem({ text: 'menu_4', 
	cmd :function(){
		menu_4.checked = !menu_4.checked;
	}
});
menu_4.checked = true;

var menu_5 = mainmenu.addItem({ text: 'menu_5', 
	cmd :function(){
		menu_5.checked = !menu_5.checked;
	}
});
menu_5.checked = true;

Expected behavior
It's expected the above code render as,

SubmenuOne >
menu_1 : unchecked
menu_2 : unchecked
menu_3 : unchecked
menu_4 : checked <<
menu_5 : checked <<

if a menu is clicked it gets checked/unchecked and none of the other menus gets affected.
A separator or other menu would not affect the above neither.

Actual Behavior
Actually the menus are wrongly rendered as,

SubMenu 1 >
menu_1 : checked <<
menu_2 : checked <<
menu_3 : unchecked
menu_4 : unchecked
menu_5 : unchecked

if menu_4 is clicked, what gets checked/unchecked is menu_1
if menu_5 is clicked, what gets checked/unchecked is menu_2

If a separator or menu is added before menu_4, then menu_1 renders unchecked, and menu_2 and menu_3 as checked.

I took as temporal workaround not to use submenus at the top.

.

@sieukrem
Copy link
Owner

Thanks for investigation and report. I can not check now. Could you please check whether menu.text is expected one in the cmd functions!

@nokotto
Copy link
Author

nokotto commented Mar 25, 2023

don't worry, for when you have a spare time,

menu.text is Not the expected one in cmd functions:

  • menu_4.text in cmd is menu_1 (just as happens with .checked )
  • menu_5.text in cmd is menu_2 (just as happens with .checked )

If a separator is added before menu_4, it get displaced one element:

  • menu_4.text in cmd is menu_2 (just as happens with .checked )
  • menu_5.text in cmd is menu_3 (just as happens with .checked )

In both cases the submenu behavior seems the expected:

  • menu_1.text in cmd is menu_1 (just as happens with .checked )
  • menu_2.text in cmd is menu_2 (just as happens with .checked )
  • menu_3.text in cmd is menu_3 (just as happens with .checked )

Also it gets displaced if it's added a menu at the top:

var mainmenu = Editor.addMenu('DebugMenu2');

// menu_0

var menu_0 = mainmenu.addItem({ text: 'menu_0', 
	cmd :function(){
		menu_0.checked = !menu_0.checked;
		alert(menu_0.text);
	}
});
menu_0.checked = false;

// SubMenuOne

var submenu  = mainmenu.addMenu('SubmenuOne');

var menu_1 = submenu.addItem({ text: 'menu_1', 
	cmd :function(){
		menu_1.checked = !menu_1.checked;
		alert(menu_1.text);
	}
});
menu_1.checked = false;

var menu_2 = submenu.addItem({ text: 'menu_2', 
	cmd :function(){
		menu_2.checked = !menu_2.checked;
		alert(menu_2.text);
	}
});
menu_2.checked = false;

var menu_3 = submenu.addItem({ text: 'menu_3', 
	cmd :function(){
		menu_3.checked = !menu_3.checked;
		alert(menu_3.text);
	}
});
menu_3.checked = false;

// SubMenuTwo

var submenu2  = mainmenu.addMenu('SubmenuTwo');

var menu_21 = submenu2.addItem({ text: 'menu_21', 
	cmd :function(){
		menu_21.checked = !menu_21.checked;
		alert(menu_21.text);
	}
});
menu_21.checked = false;

var menu_22 = submenu2.addItem({ text: 'menu_22', 
	cmd :function(){
		menu_22.checked = !menu_22.checked;
		alert(menu_22.text);
	}
});
menu_22.checked = false;

var menu_23 = submenu2.addItem({ text: 'menu_23', 
	cmd :function(){
		menu_23.checked = !menu_23.checked;
		alert(menu_23.text);
	}
});
menu_23.checked = false;

//mainmenu.addSeparator(); //This separator affects the order of above checked items also.

var menu_4 = mainmenu.addItem({ text: 'menu_4', 
	cmd :function(){
		menu_4.checked = !menu_4.checked;
		alert(menu_4.text);
	}
});
menu_4.checked = true;

var menu_5 = mainmenu.addItem({ text: 'menu_5', 
	cmd :function(){
		menu_5.checked = !menu_5.checked;
		alert(menu_5.text);
	}
});
menu_5.checked = true;

The above rendered as:

menu_0 : unchecked
SubmenuOne >
menu_1 : unchecked
menu_2 : checked << unchecked expected
menu_3 : checked << unchecked expected
SubmenuTwo >
menu_21 : unchecked
menu_22 : unchecked
menu_23 : unchecked
menu_4 : unchecked << checked expected. In cmd behaves as menu_2 ( menu.text and menu.checked )
menu_5 : unchecked << checked expected. In cmd behaves as menu_3 ( menu.text and menu.checked )

And if the separator before menu_4 is enabled, it gets displaced again (with strange pattern) , rendered as:

menu_0 : unchecked
SubmenuOne >
menu_1 : unchecked
menu_2 : unchecked
menu_3 : checked << unchecked expected
SubmenuTwo >
menu_21 : unchecked
menu_22 : unchecked
menu_23 : unchecked
-------------
menu_4 : unchecked << checked expected. In cmd behaves as menu_3 ( menu.text and menu.checked )
menu_5 : checked << OK

there menu_5.text in cmd is menu_5 (just as happens with .checked ), what is the expected behavior.

In all cases the submenus behavior seems correct.

@sieukrem
Copy link
Owner

@nokotto I could reproduce this issue. Please check the build.

@nokotto
Copy link
Author

nokotto commented Mar 26, 2023

Thank you so much @sieukrem

The build works as expected with the second debug code ( DebugMenu2 ) , but with the code of the first post ( DebugMenu ) the issue keeps happening .

First post "DebugMenu", before patched build:

SubMenu 1 >
menu_1 : checked <
menu_2 : checked <
menu_3 : unchecked
menu_4 : unchecked << behaves as menu_1
menu_5 : unchecked << behaves as menu_2

First post "DebugMenu", with patched build ( gets one element displaced ):

SubMenu 1 >
menu_1 : unchecked
menu_2 : checked <
menu_3 : checked <
menu_4 : unchecked << behaves as menu_2
menu_5 : unchecked << behaves as menu_3

First post "DebugMenu", with patched build, enabled separator ( gets two elements displaced ):

SubMenu 1 >
menu_1 : unchecked
menu_2 : unchecked
menu_3 : checked <
----------------
menu_4 : unchecked << behaves as menu_3
menu_5 : checked << OK

I disabled menu elements of DebugMenu2 with the patched build until the issue raised. It seems the menu_0 and SubmenuTwo absence may be what alters the elements position that are seen with DebugMenu in the patched build:

New debug code DebugMenu3

enable_menu0     = 1;  // 0 or 1
nsubmenu_one     = 3;  // number of elements in menu, 0 to 3
nsubmenu_two     = 3;  // number of elements in menu, 0 to 3
enable_separator = 1;  // 0 or 1

//Test1: Issue keeps with the first patch
enable_menu0     = 0;
nsubmenu_one     = 2;
nsubmenu_two     = 0;
enable_separator = 0;

/* //Test2: Issue keeps with the first patch
enable_menu0     = 0;
nsubmenu_one     = 3;
nsubmenu_two     = 0;
enable_separator = 0; */

/* //Test3: Issue keeps with the first patch
enable_menu0     = 1;
nsubmenu_one     = 3;
nsubmenu_two     = 0;
enable_separator = 0; */

/* //Test4: Issue SOLVED with the first patch
enable_menu0     = 1;
nsubmenu_one     = 3;
nsubmenu_two     = 3;
enable_separator = 0; */

/* //Test5: Issue SOLVED with the first patch
enable_menu0     = 1;
nsubmenu_one     = 3;
nsubmenu_two     = 3;
enable_separator = 1; */


var mainmenu = Editor.addMenu('DebugMenu3');

// menu_0
if(enable_menu0){
	var menu_0 = mainmenu.addItem({ text: 'menu_0', 
		cmd :function(){
			menu_0.checked = !menu_0.checked;
			alert(menu_0.text);
		}
	});
	menu_0.checked = false;
}

// SubMenuOne
if(nsubmenu_one){
	var submenu  = mainmenu.addMenu('SubmenuOne');
	
	if(nsubmenu_one > 0){
	  var menu_1 = submenu.addItem({ text: 'menu_1', 
	  	cmd :function(){
	  		menu_1.checked = !menu_1.checked;
	  		alert(menu_1.text);
	  	}
	  });
	  menu_1.checked = false;
	}
	
	if(nsubmenu_one > 1){
	  var menu_2 = submenu.addItem({ text: 'menu_2', 
	  	cmd :function(){
	  		menu_2.checked = !menu_2.checked;
	  		alert(menu_2.text);
	  	}
	  });
	}
	menu_2.checked = false;
	
	if(nsubmenu_one > 2){
	  var menu_3 = submenu.addItem({ text: 'menu_3', 
	  	cmd :function(){
	  		menu_3.checked = !menu_3.checked;
	  		alert(menu_3.text);
	  	}
	  });
	  menu_3.checked = false;
	}
}

// SubMenuTwo
if(nsubmenu_two){
	var submenu2  = mainmenu.addMenu('SubmenuTwo');
	
	if(nsubmenu_two > 0){
	 var menu_21 = submenu2.addItem({ text: 'menu_21', 
	 	cmd :function(){
	 		menu_21.checked = !menu_21.checked;
	 		alert(menu_21.text);
	 	}
	 });
	 menu_21.checked = false;
	}
	
	if(nsubmenu_two > 1){
	 var menu_22 = submenu2.addItem({ text: 'menu_22', 
	 	cmd :function(){
	 		menu_22.checked = !menu_22.checked;
	 		alert(menu_22.text);
	 	}
	 });
	 menu_22.checked = false;
	}
	
	if(nsubmenu_two > 2){
	 var menu_23 = submenu2.addItem({ text: 'menu_23', 
	 	cmd :function(){
	 		menu_23.checked = !menu_23.checked;
	 		alert(menu_23.text);
	 	}
	 });
	 menu_23.checked = false;
	}
}

if(enable_separator){
	mainmenu.addSeparator(); //This separator affects the order of above checked items also.
}

var menu_4 = mainmenu.addItem({ text: 'menu_4', 
	cmd :function(){
		menu_4.checked = !menu_4.checked;
		alert(menu_4.text);
	}
});
menu_4.checked = true;

var menu_5 = mainmenu.addItem({ text: 'menu_5', 
	cmd :function(){
		menu_5.checked = !menu_5.checked;
		alert(menu_5.text);
	}
});
menu_5.checked = true;

Test1: Issue keeps with the first patch

enable_menu0 = 0;
nsubmenu_one = 2;
nsubmenu_two = 0;
enable_separator = 0;

SubMenu 1 >
menu_1 : unchecked
menu_2 : checked <
menu_4 : unchecked << behaves as menu_2
menu_5 : checked << OK

Before the first patch:
menu_4 behaves as menu_1
menu_5 behaves as menu_2

--

Test2: Issue keeps with the first patch

enable_menu0 = 0;
nsubmenu_one = 3;
nsubmenu_two = 0;
enable_separator = 0;

SubMenu 1 >
menu_1 : unchecked
menu_2 : checked <
menu_3 : checked <
menu_4 : unchecked << behaves as menu_2
menu_5 : unchecked << behaves as menu_3

Before the first patch:
menu_4 behaves as menu_1
menu_5 behaves as menu_2

--

Test3: Issue keeps with the first patch

enable_menu0 = 1;
nsubmenu_one = 3;
nsubmenu_two = 0;
enable_separator = 0;

menu_0 : unchecked
SubMenu 1 >
menu_1 : unchecked
menu_2 : unchecked
menu_3 : checked <
menu_4 : unchecked << behaves as menu_3
menu_5 : checked << OK

Before the first patch:
menu_4 behaves as menu_2
menu_5 behaves as menu_3

--

Test:4: Issue SOLVED with the first patch

enable_menu0 = 1;
nsubmenu_one = 3;
nsubmenu_two = 3;
enable_separator = 0;

menu_0 : unchecked
SubMenu 1 >
menu_1 : unchecked
menu_2 : unchecked
menu_3 : unchecked
SubMenu 2 >
menu_21 : unchecked
menu_22 : unchecked
menu_23 : unchecked
menu_4 : unchecked << OK
menu_5 : checked << OK

Before the first patch:
menu_4 behaves as menu_2
menu_5 behaves as menu_3

--

Test5: Issue SOLVED with the first patch

enable_menu0 = 1;
nsubmenu_one = 3;
nsubmenu_two = 3;
enable_separator = 1;

menu_0 : unchecked
SubMenu 1 >
menu_1 : unchecked
menu_2 : unchecked
menu_3 : unchecked
SubMenu 2 >
menu_21 : unchecked
menu_22 : unchecked
menu_23 : unchecked
--------------------
menu_4 : unchecked << OK
menu_5 : checked << OK

Before the first patch:
menu_4 behaves as menu_3
menu_5 behaves OK

--

PS: Take care when you uncomment the blocks in the above debug code by selecting the lines and right-clicking, as I just realized there is some kind of issue with Notepad++ what do an unexpected uncomment of unselected lines. One select Test2 variables for uncomment, and it turns that Test2 and Test3 variables becomes uncommented.

Edit: updated code to 5 test

@sieukrem
Copy link
Owner

@nokotto please check the next build

@nokotto
Copy link
Author

nokotto commented Mar 26, 2023

Perfect. This new build seems to solve all the issues @sieukrem , thank you so much for your time!

The tests what I've tried are:

// OK
enable_menu0 = 0;
nsubmenu_one = 2;
nsubmenu_two = 0;
enable_separator = 0;

// OK
enable_menu0 = 0;
nsubmenu_one = 3;
nsubmenu_two = 0;
enable_separator = 0;

// OK
enable_menu0 = 0;
nsubmenu_one = 3;
nsubmenu_two = 0;
enable_separator = 1;

// OK
enable_menu0 = 1;
nsubmenu_one = 3;
nsubmenu_two = 0;
enable_separator = 1;

// OK
enable_menu0 = 1;
nsubmenu_one = 3;
nsubmenu_two = 0;
enable_separator = 0;

// OK
enable_menu0 = 1;
nsubmenu_one = 3;
nsubmenu_two = 3;
enable_separator = 0;

// OK
enable_menu0 = 1;
nsubmenu_one = 3;
nsubmenu_two = 3;
enable_separator = 1;

Additionally, I added more submenus, submenus of submenus, separators, and other combinations, in Notepad++ v8.4 and 8.5.

All works as expected with this build.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants