Files
3D_EDFM_SIM-X/gui_support/app/EDFMGuideComponent.m
T
2026-04-28 22:00:30 +08:00

322 lines
9.2 KiB
Matlab

classdef EDFMGuideComponent < handle
%EDFMGUIDECOMPONENT Compatibility adapter from GUIDE/uicontrol to App Designer-style properties.
properties (Constant, Access = private)
NumericFieldType = 'numeric'
end
properties (SetAccess = private)
Handle
end
properties (Dependent)
Value
Items
Text
Position
Visible
Enable
Editable
Data
ColumnName
ColumnWidth
RowName
ColumnEditable
ValueChangedFcn
ButtonPushedFcn
CellSelectionCallback
Limits
MajorTicks
MinorTicks
UserData
end
properties (Access = private)
StoredMajorTicks = []
StoredMinorTicks = []
IsNumericEditField logical = false
end
methods
function obj = EDFMGuideComponent(handleObj)
obj.Handle = handleObj;
obj.IsNumericEditField = obj.detectNumericEditField();
end
function value = get.Value(obj)
if isa(obj.Handle, 'matlab.ui.control.Table')
value = get(obj.Handle, 'Data');
return;
end
style = obj.getStyle();
switch style
case 'popupmenu'
items = obj.Items;
idx = get(obj.Handle, 'Value');
if isempty(items)
value = '';
else
idx = min(max(1, idx), numel(items));
value = items{idx};
end
case 'slider'
value = get(obj.Handle, 'Value');
case 'edit'
if obj.isNumericEditField()
value = str2double(string(get(obj.Handle, 'String')));
if isnan(value)
value = NaN;
end
else
raw = get(obj.Handle, 'String');
if ischar(raw)
value = cellstr(raw);
else
value = raw;
end
end
otherwise
value = get(obj.Handle, 'Value');
end
end
function set.Value(obj, value)
if isa(obj.Handle, 'matlab.ui.control.Table')
set(obj.Handle, 'Data', value);
return;
end
style = obj.getStyle();
switch style
case 'popupmenu'
items = obj.Items;
textValue = char(string(value));
idx = find(strcmp(items, textValue), 1);
if isempty(idx)
items{end + 1} = textValue;
obj.Items = items;
idx = numel(items);
end
set(obj.Handle, 'Value', idx);
case 'slider'
set(obj.Handle, 'Value', double(value));
case 'edit'
if obj.isNumericEditField()
if isempty(value)
set(obj.Handle, 'String', '');
else
set(obj.Handle, 'String', num2str(double(value)));
end
else
if isstring(value)
value = cellstr(value);
end
set(obj.Handle, 'String', value);
end
otherwise
set(obj.Handle, 'Value', value);
end
end
function value = get.Items(obj)
raw = get(obj.Handle, 'String');
if ischar(raw)
value = cellstr(raw);
else
value = raw;
end
end
function set.Items(obj, value)
if isstring(value)
value = cellstr(value);
end
if isempty(value)
value = {''};
end
set(obj.Handle, 'String', value, 'Value', min(get(obj.Handle, 'Value'), numel(value)));
end
function value = get.Text(obj)
value = get(obj.Handle, 'String');
end
function set.Text(obj, value)
set(obj.Handle, 'String', char(string(value)));
end
function value = get.Position(obj)
value = get(obj.Handle, 'Position');
end
function set.Position(obj, value)
set(obj.Handle, 'Position', value);
end
function value = get.Visible(obj)
value = get(obj.Handle, 'Visible');
end
function set.Visible(obj, value)
set(obj.Handle, 'Visible', obj.onOff(value));
end
function value = get.Enable(obj)
value = get(obj.Handle, 'Enable');
end
function set.Enable(obj, value)
set(obj.Handle, 'Enable', obj.onOff(value));
end
function value = get.Editable(obj)
if isprop(obj.Handle, 'Editable')
value = get(obj.Handle, 'Editable');
else
value = strcmp(get(obj.Handle, 'Enable'), 'on');
end
end
function set.Editable(obj, value)
if isprop(obj.Handle, 'Editable')
set(obj.Handle, 'Editable', obj.onOff(value));
else
set(obj.Handle, 'Enable', obj.onOff(value));
end
end
function value = get.Data(obj)
value = get(obj.Handle, 'Data');
end
function set.Data(obj, value)
set(obj.Handle, 'Data', value);
end
function value = get.ColumnName(obj)
value = get(obj.Handle, 'ColumnName');
end
function set.ColumnName(obj, value)
set(obj.Handle, 'ColumnName', value);
end
function value = get.ColumnWidth(obj)
value = get(obj.Handle, 'ColumnWidth');
end
function set.ColumnWidth(obj, value)
set(obj.Handle, 'ColumnWidth', value);
end
function value = get.RowName(obj)
value = get(obj.Handle, 'RowName');
end
function set.RowName(obj, value)
set(obj.Handle, 'RowName', value);
end
function value = get.ColumnEditable(obj)
value = get(obj.Handle, 'ColumnEditable');
end
function set.ColumnEditable(obj, value)
set(obj.Handle, 'ColumnEditable', value);
end
function value = get.ValueChangedFcn(obj)
value = get(obj.Handle, 'Callback');
end
function set.ValueChangedFcn(obj, value)
set(obj.Handle, 'Callback', value);
end
function value = get.ButtonPushedFcn(obj)
value = get(obj.Handle, 'Callback');
end
function set.ButtonPushedFcn(obj, value)
set(obj.Handle, 'Callback', value);
end
function value = get.CellSelectionCallback(obj)
value = get(obj.Handle, 'CellSelectionCallback');
end
function set.CellSelectionCallback(obj, value)
set(obj.Handle, 'CellSelectionCallback', value);
end
function value = get.Limits(obj)
value = [get(obj.Handle, 'Min'), get(obj.Handle, 'Max')];
end
function set.Limits(obj, value)
set(obj.Handle, 'Min', value(1), 'Max', value(2));
end
function value = get.UserData(obj)
value = get(obj.Handle, 'UserData');
end
function set.UserData(obj, value)
set(obj.Handle, 'UserData', value);
end
function value = get.MajorTicks(obj)
value = obj.StoredMajorTicks;
end
function set.MajorTicks(obj, value)
obj.StoredMajorTicks = value;
end
function value = get.MinorTicks(obj)
value = obj.StoredMinorTicks;
end
function set.MinorTicks(obj, value)
obj.StoredMinorTicks = value;
end
end
methods (Access = private)
function style = getStyle(obj)
if isprop(obj.Handle, 'Style')
style = get(obj.Handle, 'Style');
else
style = '';
end
end
function tf = isNumericEditField(obj)
tf = obj.IsNumericEditField;
end
function tf = detectNumericEditField(obj)
userData = get(obj.Handle, 'UserData');
tf = isstruct(userData) && isfield(userData, 'Type') && strcmp(userData.Type, obj.NumericFieldType);
end
end
methods (Static, Access = private)
function value = onOff(input)
if islogical(input)
if input
value = 'on';
else
value = 'off';
end
else
value = char(string(input));
if strcmpi(value, 'true')
value = 'on';
elseif strcmpi(value, 'false')
value = 'off';
end
end
end
end
end