www.gusucode.com > mbcdata 工具箱 matlab 源码程序 > mbcdata/@cgprec/guiChooserEditor.m
function [obj, ok] = guiChooserEditor(obj, varargin) %GUIEDITOR Open a dialog for editing precision class and settings % % [OBJ, OK] = GUIEDITOR(OBJ) displays a blocking dialog that allows the % user to edit the class and parameters of a precision object. % % GUIEDITOR(OBJ, 'Parent', HFIG) specifies a parent figure to center the % dialog on. % Copyright 2006-2015 The MathWorks, Inc. [Classes, Descs] = cgprecClassList; ThisClass = class(obj); Objects = cell(size(Classes)); ObjectIndex = 0; for n = 1:numel(Objects) if strcmp(Classes{n}, ThisClass) Objects{n} = obj; ObjectIndex = n; else Objects{n} = @(dlg) i_createobject(dlg, Classes{n}); end end if ObjectIndex==0 Objects = [Objects, {obj}]; Descs = [Descs, {'<Unknown Type>'}]; ObjectIndex = length(Objects); end hDialog = mbcgui.dialog.MultiObjectDialog( ... 'PageInfoFunction', @generateEditorPages, ... 'DisplaySinglePageAsTab', false, ... 'Title', 'Edit Precision', ... 'ChooserLabel', 'Precision type:', ... 'ChooserLabelWidth', 85, ... 'OptionStrings', Descs, ... 'OptionFunctions', Objects, ... 'CurrentOption', ObjectIndex, ... 'LayoutFunction', @i_LayoutFunction, ... 'DialogPanelSize', [380 450], ... varargin{:}); ok = hDialog.show; if ok obj = hDialog.Object; end delete(hDialog); function lyt = i_LayoutFunction( dlg, hLabel, hCards ) ud = dlg.UserData; ud.hWriteableCheck = uicontrol('Parent', dlg.Figure, ... 'Visible', 'off', ... 'Style', 'checkbox', ... 'String', 'Read-only', ... 'Callback', {@i_editcheck, dlg}); div = xregGui.dividerline('Parent', dlg.Figure, 'Visible', 'off'); ud.upperClip = mbcgui.widget.Spinner('Parent', dlg.Figure, ... 'Visible', 'off', ... 'Callback', {@i_editclips, dlg}); ud.lowerClip = mbcgui.widget.Spinner('Parent', dlg.Figure, ... 'Visible', 'off', ... 'Callback', {@i_editclips, dlg}); clipLabel = xregGui.labelcontrol('parent', dlg.Figure, ... 'Visible', 'off', ... 'LabelSizeMode', 'absolute', ... 'LabelSize', 85, ... 'ControlSizeMode', 'absolute', ... 'ControlSize', 70, ... 'String', 'Value limits:', ... 'Control', ud.lowerClip); clipTo = xregGui.labelcontrol('parent', dlg.Figure, ... 'Visible', 'off', ... 'LabelSizeMode', 'absolute', ... 'LabelSize', 10, ... 'ControlSizeMode', 'absolute', ... 'ControlSize', 70, ... 'Gap', 10, ... 'String', 'to', ... 'Control', ud.upperClip); lyt = xreggridbaglayout(dlg.Figure, ... 'dimension', [4 3], ... 'rowsizes', [20 20 2 -1], ... 'colsizes', [160 90 -1], ... 'gapy', 10, ... 'gapx', 10, ... 'mergeblock', {[1 1], [1 2]}, ... 'mergeblock', {[3 3], [1 3]}, ... 'mergeblock', {[4 4], [1 3]}, ... 'elements', {hLabel, clipLabel, div, hCards, ... [], clipTo, [], [], ... ud.hWriteableCheck}); % Listener to keep checkbox and range updated with object changes ud.hListener = event.listener( dlg, 'OptionChanged', @i_update ); ud.WritableFlag = 1; ud.Range = [-inf inf]; dlg.UserData = ud; function i_update(dlg, ~) ud = dlg.UserData; prec = dlg.Object; set(ud.hWriteableCheck, 'Value', 1-get(prec, 'writable')); lims = get(prec, 'PhysRange'); ud.lowerClip.Value = lims(1); ud.upperClip.Value = lims(2); % Save writable flag and range for use when creating objects ud.WritableFlag = get(prec, 'writable'); ud.Range = lims; dlg.UserData = ud; function i_editcheck(src, ~, dlg) Writeable = 1-get(src, 'Value'); % Set all existing objects to the same writable value for n = 1:length(dlg.OptionStrings) if dlg.isOptionCreated(n) prec = dlg.getOptionObject(n); prec = set(prec, 'Writable', Writeable); dlg.updateOptionObject(n, prec); end end % Save writable flag for use when creating new objects ud = dlg.UserData; ud.WritableFlag = Writeable; dlg.UserData = ud; function i_editclips(~, ~, dlg) ud = dlg.UserData; lims = sort([ud.lowerClip.Value, ud.upperClip.Value]); if lims(2)<=lims(1); lims(2) = lims(1)+1; end % Set all existing objects to the same range value for n = 1:length(dlg.OptionStrings) if dlg.isOptionCreated(n) prec = dlg.getOptionObject(n); prec = set(prec, 'PhysRange', lims); dlg.updateOptionObject(n, prec); end end % Save range for use when creating new objects ud.Range = lims; dlg.UserData = ud; function obj = i_createobject(dlg, ClassName) obj = feval(ClassName); % Set correct initial writable state ud = dlg.UserData; obj = set(obj, 'Writable', ud.WritableFlag); obj = set(obj, 'PhysRange', ud.Range);