How to disable or delete cameratoolbar context menu

5 次查看(过去 30 天)
Hello Matlab community!
Does anyone here know how to disable or delete the cameratoolbar context menu while maintaining the programmatic functionality of the cameratoolbar? I am asking because I am building a GUI that has is own custom context menu which gets broken when the cameratoolbar is enabled. This issue has been flaggegd five years ago in this post, but received no attention from MathWorks.
I am currently using Matlab R2024a.
Here is the screenshot of the context menu I am referring to:
Up to this point, I tried retrieving ContextMenu handles from the cameratoolbar, and the parent UIFigure, and deleting them but this did not work. Any helpful advice on this problem would be greatly appreciated.
Thanks!

回答(2 个)

Adam Danz
Adam Danz 2024-12-17
编辑:Adam Danz 2024-12-17
This stumped me for a bit but I've found a potential workaround. I'll also make a note of this issue for discussion.
Workaround: When creating the custom context menu, assign its Tag property as CameratoolbarContextMenu.
h.ContextMenu = uicontextmenu(fig,'Tag','CameratoolbarContextMenu');
This will trick cameratoolbar into thinking that it already created its context menu.
Another possibility I found is calling cameratoolbar("SetMode","nomode") after creating the axes toolbar. This removes the cameratoolbar context menu. Then you can reassign the original context menu which is in the figure's children. However, this command will also disable some camera motion controls.
  2 个评论
Anton Semechko
Anton Semechko 2024-12-17
Hi Adam,
Your second suggesting does not work for me because I need to use the 'orbit' SetMode. The reason I need to use it in the first place is because the default rotate3D interaction does not provide intuitive control over the camera pose (please add this point to your internal discussion as well).
The first suggestion only works when there is only one custom context menu for the entire UIFigure. It will not work when:
  1. The custom context menu is assigned to a particular element of the figure (e.g., panel). Right clicking outside the element will erroneously show the context menu when using the cameratoolbar functionality, which is not expected behaviour.
  2. There is more than one custom context menu assigned to different figure elements, which is the case I am dealing with. Right clicking on the element with the custom-assigned context menu, while using the cameratoolbar functionality, will break that element's custom menu.
Adam Danz
Adam Danz 2024-12-17
Now you know why I called it a potential workaround.
I'm storing my playground code here in case I ever decide to pick this back up. When cameratoolbar is called, the context menu in the first axes is replaced with the cx menu from the second axes which makes sense given how cameratoolbar cleanup works.
fig = uifigure;
tcl = tiledlayout(fig,1,2);
ax1 = nexttile(tcl);
s1 = surf(ax1,peaks);
s1.ContextMenu = uicontextmenu(fig,'tag','CameratoolbarContextMenu');
uimenu(s1.ContextMenu ,'Text','ChangeColor1','MenuSelectedFcn',@(~,~)colormap(ax1,rand(5,3)));
ax2 = nexttile(tcl);
s2 = surf(ax2,peaks);
s2.ContextMenu = uicontextmenu(fig,'tag','CameratoolbarContextMenu');
uimenu(s2.ContextMenu ,'Text','ChangeColor2','MenuSelectedFcn',@(~,~)colormap(ax2,rand(5,3)));
% cameratoolbar

请先登录,再进行评论。


Alex Balan
Alex Balan 2025-1-7
Issue:
Camera Toolbar context menu overwrites existing context menus and does not restore them properly.
Cause:
The line 432 in matlab.graphics.internal.CameraToolBarManager in R2024b:
hObj.CurrentObj.UIContextMenu = get(h, 'UIContextMenu');
is problematic because h and hObj.CurrentObj both reference the same object as set on line 420. This makes the line redundant because it is essentially setting the property to its current value.
Suggested Fix:
The correct approach is to store the UIContextMenu of h in hObj.UIContextMenu instead, similar to how it is done on line 422. This allows the code to keep track of the original UIContextMenu of h and restore it later as intended on line 1198.
Proposed Code Change:
Replace:
hObj.CurrentObj.UIContextMenu = get(h, 'UIContextMenu');
with:
hObj.UIContextMenu = get(h, 'UIContextMenu');
This change ensures that the original UIContextMenu is stored separately in hObj, allowing for proper management and restoration of the context menu.

类别

Help CenterFile Exchange 中查找有关 Interactive Control and Callbacks 的更多信息

产品


版本

R2024a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by