📄 fm_axesdlg.m
字号:
% get text size
ut = uicontrol(tProps,...
'Visible','off',...
'String','Title');
charSize = get(ut,'Extent');
charH = charSize(4);
delete(ut);
% charOffset = (RowH-charH)/2;
editH = charH + 4/fy;
uiH = RowH-RowPadH;
YTitleRow = figPos(4)-TitleH-TopMarginH-uiH;
% Title row
charOffset = uiH-charH;
uicontrol(tProps,...
'FontWeight','bold',...
'String', 'Title:',...
'Position', ...
[ LMarginW YTitleRow + uiH + uiH - charH ...
RowLabelW charH]);
% Check for similar titles
titleHandle = get(ax,{'Title'});
titleString = get([titleHandle{:}],{'String'});
if isempty(titleString{1}) | ...
(length(titleString) > 1 & ~isequal(titleString{:})),
% use a cell array, so spaces aren't padded out.
CommonFlag = 0;
titleString = {};
else
CommonFlag = 1;
titleString=titleString{1};
end
titleU = uicontrol(editProps,...
'Tag', 'Title',...
'UserData',CommonFlag, ...
'Callback', '',...
'HorizontalAlignment','center',...
'Max', 2, ... % allow multi line titles
'String', titleString,...
'Position', ...
[ XCol(2) YTitleRow ...
nCols*ColW+(nCols-1)*ColPadW uiH + uiH]);
iGroup=1;
localData.LimCheck(iGroup)=titleU;
localData.Prop{iGroup} = 'Title';
% put down the row headings
rowLabelStrings = {...
'','left',
'Label:','right',
'Limits:','right',
'Tick Step:','right',
'Scale:','right',
'','right',
'Grid:','right',
'','right',
};
nRows = size(rowLabelStrings,1);
Y = YTitleRow - HeaderH + RowPadH;
headingPosition = [LMarginW Y RowLabelW charH];
for iRow = 1:nRows,
if ~isempty(rowLabelStrings{iRow,1})
headingPosition(2) = Y;
uicontrol(tProps,...
'FontWeight', 'bold',...
'String', rowLabelStrings{iRow,1},...
'HorizontalAlignment', rowLabelStrings{iRow,2},...
'Position', headingPosition);
end
Y = Y-RowH;
end
% fill each column
cCol = ' XYZ';
for iCol = 2:nCols+1,
X = XCol(iCol);
col = cCol(iCol);
% heading
Y = YTitleRow - HeaderH + RowPadH;
uicontrol(tProps,...
'Style', 'text',...
'FontWeight', 'bold',...
'HorizontalAlignment', 'center',...
'Position', [X Y-charOffset ColW charH],...
'String', col);
% label
Y = Y-RowH;
% Check for similar labels
labelHandle = get(ax,{[col 'Label']});
labelString = get([labelHandle{:}],{'String'});
if isempty(labelString{1}) | ...
(length(labelString)>1 & ~isequal(labelString{:})),
% use a cell array, so spaces aren't padded out.
CommonFlag = 0;
labelString = {};
else
labelString=labelString{1};
CommonFlag = 1;
end
if size(labelString,1)>1 % multiline label
multiline = 2;
else
multiline = 1;
end
labelU = uicontrol(editProps,...
'Enable', 'on',...
'Tag', [col 'Label'],...
'ToolTip', [col 'Label'],...
'UserData',CommonFlag, ...
'Position', [X Y ColW uiH ],...
'String', labelString,...
'Max', multiline,...
'Callback', '');
iGroup = iGroup+1;
localData.LimCheck(iGroup) = labelU;
localData.Prop{iGroup} = 'Title';
% range
Y = Y-RowH;
% Check if all axes are manual or auto
AllMods = strcmp(get(ax, [col 'LimMode']),'manual');
MultMods = 0;
if all(~AllMods)
checkProps.Value = 0;
elseif all(AllMods)
checkProps.Value = 1;
else
MultMods = 1;
checkProps.Value = length(find(AllMods))>=length(find(~AllMods));
end
CheckVal = checkProps.Value;
clim = uicontrol(checkProps,...
'String', 'Manual',...
'Tag', [col 'LimMode'],...
'ToolTip', [col 'LimMode'],...
'Position', [X Y ColW/2 uiH]);
% Add a second checkbox when editing multiple axes
if MultMods,
% Overwrite the other checkbox, since it's callback will never
% be invoked
clim2 = uicontrol(checkProps,...
'ButtonDownFcn','fm_axesdlg toggle me', ...
'Enable','off', ...
'Tag', [col 'LimMode'],...
'ToolTip', [col 'LimMode'],...
'UserData',struct('Value',checkProps.Value,'Sibling',clim), ...
'Position', [X Y 3 uiH]);
checkProps.Value = 0;
set(clim,'UserData',clim2,'Tag','')
end
% Check for common limits
lim = get(ax,{[col 'Lim']});
lim = cat(1,lim{:});
Umin = unique(lim(:,1));
Umax = unique(lim(:,2));
if length(Umin)>1, uminStr = '';
else, uminStr = num2str(Umin);
end
if length(Umax)>1, umaxStr = '';
else, umaxStr = num2str(Umax);
end
umin = uicontrol(editProps,...
'Tag', [col 'LimMin'],...
'ToolTip', [col ' Min'],...
'Enable', enable{checkProps.Value+1},...
'String', uminStr,...
'Position', [X+ColW/2 Y ColW/4 uiH]);
iGroup=iGroup+1;
localData.LimCheck(iGroup) = umin;
localData.OldVal{iGroup} = min(lim);
umax = uicontrol(editProps,...
'Tag', [col 'LimMax'],...
'Enable', enable{checkProps.Value+1},...
'String', umaxStr,...
'Position', [X+ColW*3/4 Y ColW/4 uiH],...
'ToolTip', [col ' Max']);
iGroup = iGroup+1;
localData.LimCheck(iGroup) = umax;
localData.OldVal{iGroup} = max(lim);
iGroup = iGroup+1;
localData.LimGroup{iGroup} = [umin umax];
localData.LimCheck(iGroup) = clim;
localData.Prop{iGroup} = [col 'LimMode'];
if MultMods
iGroup = iGroup+1;
localData.LimGroup{iGroup} = [umin umax];
localData.LimCheck(iGroup) = clim2;
localData.Prop{iGroup} = [col 'LimMode'];
end
% Check if all axes use a linear scale
AllScales = strcmp(get(ax,[col 'Scale']),'linear');
MultScales = 0;
if all(~AllScales)
linearScale = 0;
elseif all(AllScales)
linearScale = 1;
else
MultScales = 1;
linearScale=0;
end
% tickstep
Y = Y-RowH;
% Check if all TickModes are manual or auto
AllMods = strcmp(get(ax, [col 'TickMode']),'manual');
MultMods = 0;
if all(~AllMods)
checkProps.Value = 0;
elseif all(AllMods)
checkProps.Value = 1;
else
MultMods = 1;
checkProps.Value = length(find(AllMods))>=length(find(~AllMods));
end
CheckVal = checkProps.Value;
clim = uicontrol(checkProps,...
'String', 'Manual',...
'Tag', [col 'TickMode'],...
'Enable', enable{linearScale+1},...
'ToolTip', [col 'TickMode'],...
'Position', [X Y ColW/2 uiH]);
% Add a second checkbox when editing multiple axes
if MultMods,
% Overwrite the other checkbox, since it's callback will never
% be invoked
clim2 = uicontrol(checkProps,...
'ButtonDownFcn','fm_axesdlg toggle me', ...
'Enable','off', ...
'Tag', [col 'TickMode'],...
'ToolTip', [col 'TickMode'],...
'UserData',struct('Value',checkProps.Value,'Sibling',clim), ...
'Position', [X Y 3 uiH]);
checkProps.Value = 0;
set(clim,'UserData',clim2,'Tag','')
end
if linearScale
editProps.Enable = enable{checkProps.Value+1};
% Check for common tick marks
tick = get(ax,{[col 'Tick']});
if (length(tick)>1 & ~isequal(tick{:})) | isempty(tick{1}) | length(tick{1})<2
tickstep = [];
else
tickstep = tick{1}(2)-tick{1}(1);
end
else
editProps.Enable = enable{0+1};
tickstep = [];
end
utick = uicontrol(editProps,...
'Tag', [col 'TickStep'],...
'ToolTip', [col ' Tick step size'],...
'HorizontalAlignment','center',...
'String', num2str(min(tickstep)),...
'Position', [X+ColW/2 Y ColW/2 uiH]);
iGroup = iGroup+1;
localData.LimCheck(iGroup) = utick;
localData.OldVal{iGroup} = tickstep;
iGroup = iGroup+1;
localData.LimGroup{iGroup} = utick;
localData.LimCheck(iGroup) = clim;
if MultMods,
iGroup = iGroup+1;
localData.LimGroup{iGroup} = utick;
localData.LimCheck(iGroup) = clim2;
end
% Scale
Y = Y-RowH;
radioProps.Value = linearScale;
rlin = uicontrol(radioProps,...
'Position', [X Y ColW/2 uiH],...
'String', 'Linear',...
'Tag', [col 'ScaleLinear'],...
'ToolTip',[col 'Scale=''linear''']);
% Add a second set of radio buttons when editing multiple axes
if MultScales,
rlin2 = uicontrol(radioProps,...
'ButtonDownFcn','fm_axesdlg radio me', ...
'Enable','off', ...
'Position', [X Y 3 uiH],...
'String', '',...
'Tag', [col 'ScaleLinear'],...
'ToolTip',[col 'Scale=''linear'''], ...
'Value',0);
set(rlin,'UserData',rlin2,'Tag','');
end
Y = Y-RowH*2/3;
rlog = uicontrol(radioProps,...
'Position', [X Y ColW/2 uiH],...
'String', 'Log',...
'Value', ~radioProps.Value,...
'Tag', [col 'ScaleLog'],...
'ToolTip',[col 'Scale=''log''']);
% Add a second set of radio buttons when editing multiple axes
if MultScales,
rlog2 = uicontrol(radioProps,...
'Enable','off', ...
'Position', [X Y 3 uiH],...
'String', '',...
'Value', ~radioProps.Value,...
'Tag', [col 'ScaleLog'],...
'ToolTip',[col 'Scale=''log'''], ...
'Value',0);
set(rlog,'UserData',rlog2,'Tag','');
set(rlin2,'UserData',...
struct('Value',0,'Sibling',rlin,'OtherRadio',rlog2));
set(rlog2,'UserData',...
struct('Value',0,'Sibling',rlog,'OtherRadio',rlin2));
end
Y = Y-RowH*1/3;
iGroup = iGroup+1;
localData.LimGroup{iGroup} = [rlin];
localData.LimCheck(iGroup) = rlog;
localData.Enable{iGroup} = [];
localData.Disable{iGroup} = struct('Controls',[clim utick], ...
'CheckValue',CheckVal);
iGroup = iGroup+1;
localData.LimGroup{iGroup} = [rlog];
localData.LimCheck(iGroup) = rlin;
localData.Enable{iGroup} = [clim utick]; % checkbox then
% other control
localData.Disable{iGroup} = [];
if MultScales
iGroup = iGroup+1;
localData.LimGroup{iGroup} = [rlin2];
localData.LimCheck(iGroup) = rlog2;
localData.Enable{iGroup} = [];
localData.Disable{iGroup} = struct('Controls',[clim utick], ...
'CheckValue',CheckVal);
iGroup = iGroup+1;
localData.LimGroup{iGroup} = [rlog2];
localData.LimCheck(iGroup) = rlin2;
localData.Enable{iGroup} = [clim utick]; % checkbox then
% other control
localData.Disable{iGroup} = [];
end
% Direction
Y = Y+RowH;
% Check if all axes use a normal dirction
AllDirs = strcmp(get(ax, [col 'Dir']),'normal');
MultDirs = 0;
if all(~AllDirs)
radioProps.Value = 0;
elseif all(AllDirs)
radioProps.Value = 1;
else
MultDirs= 1;
radioProps.Value = 0;
end
rnormal = uicontrol(radioProps,...
'Position', [X+ColW/2 Y ColW/2 uiH],...
'String', 'Normal',...
'Tag', [col 'DirNormal'],...
'ToolTip',[col 'Dir=''normal''']);
if MultDirs
rnormal2 = uicontrol(radioProps,...
'ButtonDownFcn','fm_axesdlg radio me', ...
'Enable','off', ...
'Position', [X+ColW/2 Y 3 uiH],...
'String', '',...
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -