📄 fmri_input_condition_ui.m
字号:
set(new_c_hdls(1),'String','','Position',pos,'Visible',v,'UserData',i);
% init each edit box setup, insert callback property while doing setup
pos = get(new_c_hdls(2),'Position'); pos(2) = v_pos(i);
set(new_c_hdls(2),'String','', 'Position',pos, 'Visible',v, ...
'UserData',i,'Callback',edit_cbf);
pos = get(new_c_hdls(4),'Position'); pos(2) = v_pos(i);
set(new_c_hdls(4),'String','', 'Position',pos, 'Visible',v, ...
'UserData',i,'Callback',edit_cbf4);
pos = get(new_c_hdls(5),'Position'); pos(2) = v_pos(i);
set(new_c_hdls(5),'String','', 'Position',pos, 'Visible',v, ...
'UserData',i,'Callback',edit_cbf5);
% init each delete button setup, insert callback property while doing setup
pos = get(new_c_hdls(3),'Position'); pos(2) = v_pos(i);
set(new_c_hdls(3),'String','Delete','Position',pos,'Visible',v, ...
'UserData',i,'Callback',delete_cbf);
end
setappdata(gcf,'Cond_hlist',cond_hdls);
setappdata(gcf,'NumRows',rows);
return; % SetupConditionRows
%----------------------------------------------------------------------------
function DisplayConditions()
protected_cond = getappdata(gcf,'ProtectedConditions');
cond_map = getappdata(gcf,'ConditionMap');
curr_cond = getappdata(gcf,'CurrConditions');
curr_cond_baseline = getappdata(gcf,'CurrConditionBaseline');
top_cond_idx = getappdata(gcf,'TopConditionIdx');
cond_hdls = getappdata(gcf,'Cond_hlist');
rows = getappdata(gcf,'NumRows');
num_cond = length(curr_cond);
last_row = 0;
cond_idx = top_cond_idx;
for i=1:rows
c_hdls = cond_hdls(i,:);
if (cond_idx <= num_cond),
set(c_hdls(1),'String',sprintf('%d.',cond_idx),'Visible','on');
set(c_hdls(2),'String',sprintf('%s',curr_cond{cond_idx}), ...
'Visible','on');
set(c_hdls(4),'String',sprintf('%s', ...
num2str(curr_cond_baseline{cond_idx}(1))), ...
'Visible','on');
set(c_hdls(5),'String',sprintf('%s', ...
num2str(curr_cond_baseline{cond_idx}(2))), ...
'Visible','on');
set(c_hdls(3),'String','Delete','Visible','on');
if isempty(protected_cond) | isempty(cond_map)
set(c_hdls(3),'String','Delete','Enable','on');
elseif isempty(find(protected_cond == cond_map(cond_idx)))
set(c_hdls(3),'String','Delete','Enable','on');
else
set(c_hdls(3),'String','Delete','Enable','off');
end
cond_idx = cond_idx + 1;
last_row = i;
else
set(c_hdls(1),'String','','Visible','off');
set(c_hdls(2),'String','','Visible','off');
set(c_hdls(4),'String','','Visible','off');
set(c_hdls(5),'String','','Visible','off');
set(c_hdls(3),'String','Delete','Visible','off');
end;
end;
% display or hide the add row
%
if (last_row < rows)
row_idx = last_row+1;
c_hdls = cond_hdls(row_idx,:);
pos = get(c_hdls(2),'Position');
ShowAddRow(cond_idx,pos(2),row_idx);
else
HideAddRow;
end;
% display or hide the slider
%
if (top_cond_idx ~= 1) | (last_row == rows)
ShowSlider;
else
HideSlider;
end;
return; % DisplayConditions
%----------------------------------------------------------------------------
function CreateAddRow()
cond_template = getappdata(gcf,'ConditionTemplate');
a_hdls = copyobj(cond_template,gcf);
set(a_hdls(1),'String','','Foreground',[0.4 0.4 0.4],'Visible','off', ...
'UserData',1);
set(a_hdls(2),'String','','Enable','on','Background',[1 1 1], ...
'Visible','off');
set(a_hdls(4),'String','0','Enable','on','Background',[1 1 1], ...
'Visible','off');
set(a_hdls(5),'String','1','Enable','on','Background',[1 1 1], ...
'Visible','off');
set(a_hdls(3),'String','Add','Visible','off', ...
'Callback','fmri_input_condition_ui(''ADD_CONDITION'');');
setappdata(gcf,'AddRowHdls',a_hdls);
return; % CreateAddRow
%----------------------------------------------------------------------------
function ShowAddRow(cond_idx,v_pos,row_idx)
%
% Add row with 'Add' button at 'v_pos' position
% Also display the subject row number, with its 'UserData' updated with row_idx
%
a_hdls = getappdata(gcf,'AddRowHdls');
for j=1:length(a_hdls),
new_pos = get(a_hdls(j),'Position');
if j==1
new_pos(2) = v_pos-0.01;
else
new_pos(2) = v_pos;
end
set(a_hdls(j),'Position',new_pos);
set(a_hdls(j),'Visible','on');
end;
set(a_hdls(2),'String','');
set(a_hdls(1),'Visible','On','String',sprintf('%d.',cond_idx),'UserData',row_idx);
return; % ShowAddRow
%----------------------------------------------------------------------------
function HideAddRow()
a_hdls = getappdata(gcf,'AddRowHdls');
for j=1:length(a_hdls),
set(a_hdls(j),'Visible','off');
end;
return; % HideAddRow
%----------------------------------------------------------------------------
function UpdateCondition(cond_idx)
curr_cond = getappdata(gcf,'CurrConditions');
cond_hdls = getappdata(gcf,'Cond_hlist');
row_idx = get(gcbo,'UserData');
cond_idx = str2num(get(cond_hdls(row_idx,1),'String'));
condname = get(gcbo,'String');
condname = deblank(fliplr(deblank(fliplr(condname))));
curr_cond{cond_idx} = condname;
setappdata(gcf,'CurrConditions',curr_cond);
return; % UpdateCondition
%----------------------------------------------------------------------------
function DeleteCondition()
curr_cond = getappdata(gcf,'CurrConditions');
curr_cond_baseline = getappdata(gcf,'CurrConditionBaseline');
cond_hdls = getappdata(gcf,'Cond_hlist');
protected_cond = getappdata(gcf,'ProtectedConditions');
cond_map = getappdata(gcf,'ConditionMap');
row_idx = get(gcbo,'UserData');
cond_idx = str2num(get(cond_hdls(row_idx,1),'String'));
% check whether the condition is not allowed to be removed
%
if ~isempty(protected_cond) & ~isempty(cond_map) ...
& ~isempty(find(protected_cond == cond_map(cond_idx)))
msg = 'ERROR: The condition cannot be removed.';
set(findobj(gcf,'Tag','MessageLine'),'String',msg);
return;
end;
% update the removed condition list, don't do it for the new conditions.
removed_cond = getappdata(gcf,'RemovedConditions');
if cond_map(cond_idx) ~= 0,
removed_cond = [removed_cond cond_map(cond_idx)];
end;
mask = ones(1,length(curr_cond)); mask(cond_idx) = 0;
idx = find(mask == 1);
curr_cond = curr_cond(idx);
curr_cond_baseline = curr_cond_baseline(idx);
cond_map = cond_map(idx);
setappdata(gcf,'RemovedConditions',removed_cond);
setappdata(gcf,'CurrConditions',curr_cond);
setappdata(gcf,'CurrConditionBaseline',curr_cond_baseline);
setappdata(gcf,'ConditionMap',cond_map);
DisplayConditions;
UpdateSlider;
return; % DeleteCondition
%----------------------------------------------------------------------------
function AddCondition()
curr_cond = getappdata(gcf,'CurrConditions');
curr_cond_baseline = getappdata(gcf,'CurrConditionBaseline');
cond_map = getappdata(gcf,'ConditionMap');
rows = getappdata(gcf,'NumRows');
a_hdls = getappdata(gcf,'AddRowHdls');
cond_idx = str2num(get(a_hdls(1),'String'));
condname = get(a_hdls(2),'String');
condname = deblank(fliplr(deblank(fliplr(condname))));
baseline_offset = str2num(get(a_hdls(4),'String'));
baseline_length = str2num(get(a_hdls(5),'String'));
num_cond = length(curr_cond);
% num_cond = length(curr_cond)+1;
% curr_cond{num_cond} = '';
if isempty(condname)
msg = 'ERROR: All conditions must have name specified.';
set(findobj(gcf,'Tag','MessageLine'),'String',msg);
return;
end;
if isempty(baseline_offset) | isempty(baseline_length)
msg = 'ERROR: Baseline offset and length must be numbers.';
set(findobj(gcf,'Tag','MessageLine'),'String',msg);
return;
end
if baseline_length < 1
msg = 'ERROR: Baseline length should not be less than 1.';
set(findobj(gcf,'Tag','MessageLine'),'String',msg);
return;
end
for i=1:num_cond
if(strcmp(curr_cond{i},condname))
msg = 'ERROR: No conditions should be duplicated.';
set(findobj(gcf,'Tag','MessageLine'),'String',msg);
return;
end;
end
num_cond = num_cond + 1;
curr_cond{num_cond} = condname;
curr_cond_baseline{num_cond}(1) = baseline_offset;
curr_cond_baseline{num_cond}(2) = baseline_length;
cond_map(num_cond) = 0;
setappdata(gcf,'CurrConditions',curr_cond);
setappdata(gcf,'CurrConditionBaseline',curr_cond_baseline);
setappdata(gcf,'ConditionMap',cond_map);
new_cond_row = get(a_hdls(1),'UserData');
if (new_cond_row == rows), % the new condition row is the last row
top_cond_idx = getappdata(gcf,'TopConditionIdx');
setappdata(gcf,'TopConditionIdx',top_cond_idx+1);
end;
DisplayConditions;
cond_hdls = getappdata(gcf,'Cond_hlist');
if (new_cond_row == rows), % the new condition row is the last row
set(gcf,'CurrentObject',cond_hdls(rows-1,2));
else
set(gcf,'CurrentObject',cond_hdls(new_cond_row,2));
end;
UpdateSlider;
return; % AddConditions
%----------------------------------------------------------------------------
function MoveSlider()
slider_hdl = findobj(gcf,'Tag','CondSlider');
curr_value = round(get(slider_hdl,'Value'));
total_rows = round(get(slider_hdl,'Max'));
top_cond_idx = total_rows - curr_value + 1;
setappdata(gcf,'TopConditionIdx',top_cond_idx);
DisplayConditions;
return; % MoveSlider
%----------------------------------------------------------------------------
function SetupSlider()
cond_hdls = getappdata(gcf,'Cond_hlist');
top_pos = get(cond_hdls(1,1),'Position');
bottom_pos = get(cond_hdls(end,1),'Position');
slider_hdl = findobj(gcf,'Tag','CondSlider');
pos = get(slider_hdl,'Position');
pos(2) = bottom_pos(2);
pos(4) = top_pos(2)+top_pos(4) - pos(2);
set(slider_hdl,'Position', pos);
return; % SetupSlider
%----------------------------------------------------------------------------
function UpdateSlider()
top_cond_idx = getappdata(gcf,'TopConditionIdx');
rows = getappdata(gcf,'NumRows');
curr_cond = getappdata(gcf,'CurrConditions');
num_cond = length(curr_cond);
total_rows = num_cond+1;
slider_hdl = findobj(gcf,'Tag','CondSlider');
if (num_cond ~= 0) % don't need to update when no condition
set(slider_hdl,'Min',1,'Max',total_rows, ...
'Value',total_rows-top_cond_idx+1, ...
'Sliderstep',[1/(total_rows-1)-0.00001 1/(total_rows-1)]);
end;
return; % UpdateSlider
%----------------------------------------------------------------------------
function ShowSlider()
slider_hdl = findobj(gcf,'Tag','CondSlider');
set(slider_hdl,'visible','on');
return; % ShowSlider
%----------------------------------------------------------------------------
function HideSlider()
slider_hdl = findobj(gcf,'Tag','CondSlider');
set(slider_hdl,'visible','off');
return; % HideSlider
%----------------------------------------------------------------------------
function UpdateOffset(cond_idx)
curr_cond_baseline = getappdata(gcf,'CurrConditionBaseline');
cond_hdls = getappdata(gcf,'Cond_hlist');
row_idx = get(gcbo,'UserData');
cond_idx = str2num(get(cond_hdls(row_idx,1),'String'));
curr_cond_baseline{cond_idx}(1) = str2num(get(gcbo,'String'));
setappdata(gcf,'CurrConditionBaseline',curr_cond_baseline);
return;
%----------------------------------------------------------------------------
function UpdateLength(cond_idx)
curr_cond_baseline = getappdata(gcf,'CurrConditionBaseline');
cond_hdls = getappdata(gcf,'Cond_hlist');
row_idx = get(gcbo,'UserData');
cond_idx = str2num(get(cond_hdls(row_idx,1),'String'));
old_baseline_length = curr_cond_baseline{cond_idx}(2);
curr_baseline_length = str2num(get(gcbo,'String'));
if curr_baseline_length < 1
set(gcbo,'string',num2str(old_baseline_length));
msg = 'ERROR: Baseline length should not be less than 1.';
set(findobj(gcf,'Tag','MessageLine'),'String',msg);
return;
else
curr_cond_baseline{cond_idx}(2) = str2num(get(gcbo,'String'));
end
setappdata(gcf,'CurrConditionBaseline',curr_cond_baseline);
return;
%----------------------------------------------------------------------------
function delete_fig()
try
load('pls_profile');
pls_profile = which('pls_profile.mat');
fmri_input_condition_pos = get(gcbf,'position');
save(pls_profile, '-append', 'fmri_input_condition_pos');
catch
end
return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -