Matlab App Custom Component Not Behaving as Expected
9 次查看(过去 30 天)
显示 更早的评论
Hi everyone,
First attempt at making my own custom component.
It is a 4 way button lineup, with 3 options + blank as the 4th.
I got5 the base functionality down, so that the buttons can be toggled on or off and only 1 can be selectd at one time. I also go it to output this info to a public varibale to be sued by another app.
What I can't get to work is the reverse communcation. As in: from the main app, I want to SET the current button that is pushed and force the component to update as such. Im aware there is an "update" area in the callbacks that is code that is supposed to run when the any part of the component is interracted with, but |I am ending up in a recursive loop.
An example of the functioning is:
- VC button is pressed
- Program needs to determine if the button was on or off before
- Check the status variable
- Status is [0 0 0], therefore the VC button was unselected.
- Select it
- End.
From the main app, I would like to then set the status to [1 0 0] and see the VC button being selected as if the user had interracted with it, like a normal matlab toggle UI would work.
The code is included below and the component is attached.
Personally, I think it is a gap of knowledge on my side rgarding implementaion of callbacks and the use of the Notify function, as stated in matlab documentation, but I really can figure it out. I think it would be helpful if said documentation, regarding the communication between a main app and component, would actually state WHERE these parts of the code should be placed rather than vaguely mentioneing "write this code".
% Events with associated public callbacks
events (HasCallbackProperty, NotifyAccess = private)
OpTypeSet
end
properties (Access = private)
OpType string {mustBeText(OpType)}
end
properties (Access = public)
Status (1,3) double = [0,0,0];
end
methods (Access = private)
function ResetComp(comp)
comp.vc_OFF.Visible = "on"; comp.vc_OFF.Enable = "on";
comp.rpm_OFF.Visible = "on"; comp.rpm_OFF.Enable = "on";
comp.od_OFF.Visible = "on"; comp.od_OFF.Enable = "on";
comp.vc_ON.Visible = "off"; comp.vc_ON.Enable = "off";
comp.rpm_ON.Visible = "off"; comp.rpm_ON.Enable = "off";
comp.od_ON.Visible = "off"; comp.od_ON.Enable = "off";
end
function SetComp(comp, event)
status = comp.Status;
try
event = event.Source.Tag;
catch
end
ResetComp(comp)
switch event
case "VC"
if status(1) == 1 % VC currently on
% comp.vc_OFF.Visible = "on"; comp.vc_ON.Visible = "off"; comp.vc_OFF.Enable = "on"; comp.vc_ON.Enable = "off";
comp.OpType = "";
comp.Status = [0 0 0];
elseif status(1) == 0 % VC currently off
comp.vc_ON.Visible = "on"; comp.vc_ON.Enable = "on";
comp.OpType = "VC";
comp.Status = [1 0 0];
end
case "RPM"
if status(2) == 1 % RPM currently on
% comp.rpm_OFF.Visible = "on"; comp.rpm_ON.Visible = "off"; comp.rpm_OFF.Enable = "on"; comp.rpm_ON.Enable = "off";
comp.OpType = "";
comp.Status = [0 0 0];
elseif status(2) == 0 % RPM currently off
comp.rpm_ON.Visible = "on"; comp.rpm_ON.Enable = "on";
comp.OpType = "RPM";
comp.Status = [0 1 0];
end
case "OD"
if status(3) == 1 % OD currently on
% comp.od_OFF.Visible = "on"; comp.od_ON.Visible = "off"; comp.od_OFF.Enable = "on"; comp.od_ON.Enable = "off";
comp.OpType = "";
comp.Status = [0 0 0];
elseif status(2) == 0 % OD currently off
comp.od_ON.Visible = "on"; comp.od_ON.Enable = "on";
comp.OpType = "OD";
comp.Status = [0 0 1];
end
case ""
comp.vc_OFF.Visible = "on"; comp.vc_ON.Visible = "off"; comp.vc_OFF.Enable = "on"; comp.vc_ON.Enable = "off";
comp.vc_OFF.Visible = "on"; comp.vc_ON.Visible = "off"; comp.vc_OFF.Enable = "on"; comp.vc_ON.Enable = "off";
comp.od_OFF.Visible = "on"; comp.od_ON.Visible = "off"; comp.od_OFF.Enable = "on"; comp.od_ON.Enable = "off";
comp.OpType = "";
comp.Status = [0 0 0];
end
end
notify(comp, 'OpTypeSet');
end
% Callbacks that handle component events
methods (Access = private)
% Image clicked function: vc_ON
function vc_ONImageClicked(comp, event)
SetComp(comp, event)
end
% Image clicked function: rpm_ON
function rpm_ONImageClicked(comp, event)
SetComp(comp, event)
end
% Image clicked function: od_ON
function od_ONImageClicked(comp, event)
SetComp(comp, event)
end
% Image clicked function: vc_OFF
function vc_OFFImageClicked(comp, event)
SetComp(comp, event)
end
% Image clicked function: rpm_OFF
function rpm_OFFImageClicked(comp, event)
SetComp(comp, event)
end
% Image clicked function: od_OFF
function od_OFFImageClicked(comp, event)
SetComp(comp, event)
end
end
methods (Access = protected)
% Code that executes when the value of a public property is changed
function update(comp)
SetComp(comp,comp.OpType);
end
3 个评论
chrisw23
2023-10-24
编辑:chrisw23
2023-10-24
Without goin too deep...
Instanciating your component returns a figure object with full access to all user control app uicontrols, while giving the callers (main app) reference as an argument to your custom control app, gives full access to the main app uicontrols from the custom control.
Hope it helps
回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Migrate GUIDE Apps 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!