📄 tablegui.m
字号:
hand.hEdits(i,j) = uicontrol('Style','edit','unit','pixels','backgroundcolor','w','position', ...
[arr_pos_xi(j) hand.arr_pos_y(i) arr_pos_xw(j) 20],'String',hand.array{i,j},...
'HorizontalAlignment',hand.HorAlin);
end
if (~isempty(hand.RowNumbers))
set(hand.hEdits(i,1),'String',i,'Enable','inactive','Background',[200 200 145]/255,'UserData',i)
else
set(hand.hEdits(i,1),'UserData',i)
end
end
if (~isempty(hand.HdrButtons)) % Create the header pushbutton uicontrols
for (j = 1:hand.NumCol-d_col) % The d_col is to account for an eventual 'RowNumbers' option
uicontrol('Style','pushbutton','unit','pixels','Enable','inactive','position', ...
[arr_pos_xi(j+d_col) hand.arr_pos_y(1)+hand.RowHeight hand.ColWidth(j+d_col) 20],'String',hand.ColNames{j})
end
end
if (~isempty(hand.RowNames)) % Create the header pushbutton uicontrols
for (i = 1:length(hand.RowNames))
uicontrol('Style','pushbutton','unit','pixels','Enable','inactive','position', ...
hand.RowNames_pos_orig(i,:),'String',hand.RowNames{i})
end
end
% ---------------- See if we need a slider ---------------------------
pos_t = get(hand.hEdits(1,hand.NumCol),'pos'); % Get top right edit position
pos_b = get(hand.hEdits(hand.MAX_ROWS,1),'pos'); % Get last visible edit position
if (hand.NumRows > hand.MAX_ROWS)
set(hand.hEdits(hand.MAX_ROWS+1:hand.NumRows,1:hand.NumCol),'Visible','off') % Hide those who are out of view
if (~isempty(hand.checks))
set(hand.hChecks(hand.MAX_ROWS+1:hand.NumRows),'Visible','off')
end
pos = [pos_t(1)+pos_t(3) pos_b(2) 15 pos_t(2)+pos_t(4)-pos_b(2)];
sld_step = 1 / (hand.NumRows-1);
sld_step(2) = 5 * sld_step(1);
hand.hSlid = uicontrol('style','slider','units','pixels','position',pos,...
'min',1,'max',hand.NumRows,'Value',hand.NumRows,'SliderStep',sld_step);
set(hand.hSlid,'callback',{@slider_Callback,hand})
set(hand.hSlid,'UserData',hand.NumRows) % Store current value
end
% ---------------- See if the window is MODAL ---------------------------
if (~isempty(hand.modal))
uicontrol('Style','pushbutton','unit','pixels','String','OK','position',...
[pos_t(1)+pos_t(3)-110 5 40 20],'FontName','Helvetica','FontSize',9,...
'callback','uiresume','tag','OK');
uicontrol('Style','pushbutton','unit','pixels','String','Cancel','position', ...
[pos_t(1)+pos_t(3)-60 5 60 20],'FontName','Helvetica','FontSize',9,...
'callback','uiresume','tag','cancel');
uiwait(hand.hFig) % It also sets the Figure's visibility 'on'
but = gco;
if strcmp(get(but,'tag'),'OK')
out = reshape(get(hand.hEdits,'String'),hand.NumRows,hand.NumCol);
if (~isempty(hand.checks))
if(length(hand.hChecks)~=1)
unchecked = (cell2mat(get(hand.hChecks,'Value')) == 0);
out(unchecked,:) = []; % Remove unchecked rows
end
end
if (~isempty(hand.RowNumbers)) % Do not output the row numbers
out = out(:,2:end);
end
delete(hand.hFig)
elseif strcmp(get(but,'tag'),'cancel')
out = []; delete(hand.hFig)
else % Figure was killed
out = [];
end
else
set(hand.hFig,'Visible','on','UserData',hand)
if (nargout), out = hand.hFig; end
end
% ---------------------------------------------------------------------------
function slider_Callback(obj,event,hand)
val = round(get(hand.hSlid,'Value'));
old_val = get(hand.hSlid,'UserData');
ds = val - old_val;
if (ds < 0) % Slider moved down
n = hand.NumRows - val + 1; d_col = hand.NumRows - val;
if (n+hand.MAX_ROWS-1 > hand.NumRows) % Case we jumped into the midle zone
adj = (n+hand.MAX_ROWS-1 - hand.NumRows);
n = n - adj; d_col = d_col - adj;
end
for (i = n:min(n+hand.MAX_ROWS-1,hand.NumRows)) % Update positions
for (j = 1:hand.NumCol)
pos = hand.Edits_pos_orig{i,j};
set(hand.hEdits(i,j),'pos',[pos(1) hand.arr_pos_y(i-d_col) pos(3:4)],'Visible','on')
end
if (~isempty(hand.checks)) % If we have checkboxes
pos = hand.Checks_pos_orig(i,:);
set(hand.hChecks(i),'pos',[pos(1) hand.arr_pos_y(i-d_col)+3 pos(3:4)],'Visible','on')
end
end
if (i == get(hand.hEdits(hand.NumRows,1),'UserData')) % Bottom reached. Jump to there
val = 1; set(hand.hSlid,'Value',val) % This also avoids useless UIs repositioning
end
elseif (ds > 0) % Slider moved up
n = hand.NumRows - val + 1; k = hand.MAX_ROWS;
if (n < hand.MAX_ROWS) % Case we jumped into the midle zone
adj = (hand.MAX_ROWS - n - 0);
n = n + adj;
end
for (i = n:-1:max(n-hand.MAX_ROWS+1,1)) % Update positions
for (j = 1:hand.NumCol)
pos = hand.Edits_pos_orig{i,j};
set(hand.hEdits(i,j),'pos',[pos(1) hand.arr_pos_y(k) pos(3:4)],'Visible','on')
end
if (~isempty(hand.checks)) % If we have checkboxes
pos = hand.Checks_pos_orig(i,:);
set(hand.hChecks(i),'pos',[pos(1) hand.arr_pos_y(k)+3 pos(3:4)],'Visible','on')
end
k = k - 1;
end
set(hand.hEdits(n+1:end,1:end),'Visible','off')
if (~isempty(hand.checks)), set(hand.hChecks(n+1:end),'Visible','off'); end
if (i == get(hand.hEdits(1,1),'UserData')) % Reached Top. Jump to there
set(hand.hSlid,'Value',hand.NumRows) % This also avoids useless UIs repositioning
val = hand.NumRows;
end
end
set(hand.hSlid,'UserData',val) % Save old 'Value'
% ----------------------------------------------------------------------------
function params = parse_pv_pairs(params,pv_pairs)
% parse_pv_pairs: parses sets of property value pairs, allows defaults
% usage: params=parse_pv_pairs(default_params,pv_pairs)
%
% arguments: (input)
% default_params - structure, with one field for every potential
% property/value pair. Each field will contain the default
% value for that property. If no default is supplied for a
% given property, then that field must be empty.
%
% pv_array - cell array of property/value pairs.
% Case is ignored when comparing properties to the list
% of field names. Also, any unambiguous shortening of a
% field/property name is allowed.
%
% arguments: (output)
% params - parameter struct that reflects any updated property/value
% pairs in the pv_array.
%
% Example usage:
% First, set default values for the parameters. Assume we have four
% parameters that we wish to use optionally in the function examplefun.
%
% - 'viscosity', which will have a default value of 1
% - 'volume', which will default to 1
% - 'pie' - which will have default value 3.141592653589793
% - 'description' - a text field, left empty by default
%
% The first argument to examplefun is one which will always be supplied.
%
% function examplefun(dummyarg1,varargin)
% params.Viscosity = 1;
% params.Volume = 1;
% params.Pie = 3.141592653589793
%
% params.Description = '';
% params=parse_pv_pairs(params,varargin);
% params
%
% Use examplefun, overriding the defaults for 'pie', 'viscosity'
% and 'description'. The 'volume' parameter is left at its default.
%
% examplefun(rand(10),'vis',10,'pie',3,'Description','Hello world')
%
% params =
% Viscosity: 10
% Volume: 1
% Pie: 3
% Description: 'Hello world'
%
% Note that capitalization was ignored, and the property 'viscosity' was truncated
% as supplied. Also note that the order the pairs were supplied was arbitrary.
n = length(pv_pairs) / 2;
if n ~= floor(n)
error 'Property/value pairs must come in PAIRS.'
end
if (n <= 0), return; end % just return the defaults
if ~isstruct(params)
error 'No structure for defaults was supplied'
end
% there was at least one pv pair. process any supplied
propnames = fieldnames(params);
lpropnames = lower(propnames);
for i=1:n
p_i = lower(pv_pairs{2*i-1});
v_i = pv_pairs{2*i};
ind = strmatch(p_i,lpropnames,'exact');
if isempty(ind)
ind = find(strncmp(p_i,lpropnames,length(p_i)));
if isempty(ind)
error(['No matching property found for: ',pv_pairs{2*i-1}])
elseif (length(ind) > 1)
error(['Ambiguous property name: ',pv_pairs{2*i-1}])
end
end
p_i = propnames{ind};
params = setfield(params,p_i,v_i); % override the corresponding default in params
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -