Is there any way to find out which specific instance of a UIContextMenu is being called?
1 view (last 30 days)
Show older comments
So here's my basic setup:
A UIFigure with a UITree, containing multiple UITreeNodes. I want to be able to right click on one of the UITreeNodes, which will do an operation specifically on that node. Let's say I just want to display the text present in the node from which I right clicked.
For example, consider this setup:
figHandle = uifigure;
ctxMenu = uicontextmenu(figHandle);
menuOpt = uimenu(ctxMenu,'text','printNodeText','Callback',@doSomethingCallback);
baseTree = uitree(figHandle);
node1 = uitreenode(baseTree,'text','node1text','ContextMenu',ctxMenu);
node2 = uitreenode(baseTree,'text','node2text','ContextMenu',ctxMenu);
function doSomethingCallback(src,ev)
%for example, display right-clicked UITReeNode's text, either "node1text" or "node2text"
end
When I right click node1 and click printNodeText from there, I want "node1text" displayed. When I right click node2 and click printNodeText from there, I want "node2text" diplayed.
Solutions that I'm pretty sure don't work:
Get the current object - passing figHandle to the callback and then accessing figHandle.CurrentObject will get me just to baseTree, not to node1.
get the current object then selected uitreenode - So close! Except it doesn't work because the node I right clicked isn't necessarily the same as the current seelcted node, given a right click doesn't change the selected node. If I just opened my figure and right clicked on node1,
baseTree = figHandle.CurrentObject;
selectedNodes = baseTree.SelectedNodes;
disp(selectedNodes.Text);
selectedNodes would be empty, meaning that disp() command would fail, rather than displaying "node1text"
Utilizing ContextMenuOpeningFcn - Unfortunately this doesn't seem to have any path to the node I selected, again just to the figure and UITree
Creating individual context menus - not that this doesn't work per say, but it clutters like nobody's business, given how many nodes I have. The top level figure would end up insanely cluttered with all those contextMenus anchored to it. I'd love to avoid this.
0 Comments
Answers (1)
Samay Sagar
on 22 Feb 2024
Starting from MATLAB R2021b, you can access the node for which the context menu is opened using the “CurrentObject” property. Here’s a simple example of how you can achieve this:
figHandle = uifigure;
ctxMenu = uicontextmenu(figHandle);
menuOpt = uimenu(ctxMenu, 'Text', 'Print Node Text', 'MenuSelectedFcn', @doSomethingCallback);
baseTree = uitree(figHandle, 'Position', [20 20 150 150]);
node1 = uitreenode(baseTree, 'Text', 'node1text');
node1.ContextMenu = ctxMenu;
node1.NodeData = node1;
node2 = uitreenode(baseTree, 'Text', 'node2text');
node2.ContextMenu = ctxMenu;
node2.NodeData = node2;
function doSomethingCallback(src, ~)
ctxMenuHandle = src.Parent;
figHandle = ctxMenuHandle.Parent;
treeNode = figHandle.CurrentObject;
disp(treeNode.Text);
end
0 Comments
See Also
Categories
Find more on Interactive Control and Callbacks in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!