classdef EDFMGuideComponent < handle %EDFMGUIDECOMPONENT Compatibility adapter from GUIDE/uicontrol to App Designer-style properties. properties (Constant, Access = private) NUMERIC_FIELD_TYPE = 'numeric' end properties (SetAccess = private) Handle end properties (Dependent) Value Items Text Position Visible Enable Editable Data ColumnName RowName ColumnEditable ValueChangedFcn ButtonPushedFcn CellSelectionCallback Limits MajorTicks MinorTicks UserData end properties (Access = private) StoredMajorTicks = [] StoredMinorTicks = [] end methods function obj = EDFMGuideComponent(handleObj) obj.Handle = handleObj; 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 = []; 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.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) userData = get(obj.Handle, 'UserData'); tf = isstruct(userData) && isfield(userData, 'Type') && strcmp(userData.Type, obj.NUMERIC_FIELD_TYPE); 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