File: TwoStateQuery.m

package info (click to toggle)
psychtoolbox-3 3.0.9%2Bsvn2579.dfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 63,408 kB
  • sloc: ansic: 73,310; cpp: 11,139; objc: 3,129; sh: 1,669; python: 382; php: 272; makefile: 172; java: 113
file content (128 lines) | stat: -rw-r--r-- 5,312 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
function UserResponse = TwoStateQuery(TheQuestion,TheChoices)
% Syntax: UserResponse = TwoStateQuery(TheQuestion,[TheChoices])
% 
% Purpose: Create simple dialog box asking user an either/or question
%
% History: 5/5/04		mpr		decided whether or not to celebrate cinco de mayo
%					 10/13/04	mpr		set Yes Button automatically to be enlarged for large
%                           strings 
%						1/21/05	mpr		allowed fontsize to shrink for longer questions
%					  1/27/05	mpr		allowed question to break at file separator instead of
%                           just spaces 
%						6/30/05	mpr		forced underscores to remain as underscores instead of
%                           indicating subscript
%						3/27/06	mpr		changed returned value to -1 when user deletes window;
%                           note that this is dangerous because how a closed
%                           window affects subsequent program behavior is not
%                           implemented the same way in all code calling this
%                           function... 
%           5/3/06  mpr   set menubar to none for Version 2006a
%           8/25/06 mpr   resized No Button as needed; could be done better, but  
%                           the plan is to keep the 'Yes' and 'No' strings short
%                           so that the code doesn't need to be pushed hard
%           9/29/06 mpr   repainted buttons in version 7
%           1/14/07 mpr   undid previoius fix because button color bug is almost
%                             fixed

if nargin < 2 || isempty(TheChoices)
	TheChoices{1} = 'Yes';
	TheChoices{2} = 'No';
elseif length(TheChoices) ~= 2 | ~iscell(TheChoices)
	warning('I don''t like the choices I received.  Am substituting unadulterated originals.');
	disp('But for kicks, this is what I was passed:');
	TheChoices
	TheChoices{1} = 'Yes';
	TheChoices{2} = 'No';
end	

UnderScoreSpots = find(TheQuestion == '_');
for k=length(UnderScoreSpots):-1:1
	TheQuestion = [TheQuestion(1:(UnderScoreSpots(k)-1)) '\' TheQuestion(UnderScoreSpots(k):end)];
end

FigPos = [300 600];
FigWidth = 500;
FigHeight = 200;
YesBPos = [125 30];
YesBWidth = 80;
YesBHeight = 50;
NoBPos = [295 30];

PrimeFontSize = 36;

QueryFigh = figure('Position',[FigPos FigWidth FigHeight],'Resize','off','NumberTitle','off', ...
									'Name','Cross the Rubicon','MenuBar','none','Color','k');
set(QueryFigh,'Tag',['Questionable Figure ' int2str(QueryFigh)]);
axes('Position',[0 0 1 1],'XLim',[0 FigWidth],'YLim',[0 FigHeight],'XColor','k','YColor','k');
th=text(FigWidth/2,0.65*FigHeight,TheQuestion,'FontSize',36,'Color',get_color('hot pink'), ...
				'HorizontalAlignment','Center');
TextExt = get(th,'Extent');
if TextExt(1) < 0
	SpaceLocs = find(TheQuestion == 32 | TheQuestion == abs(filesep));
	[MinDist, MinInd] = min(abs(floor(length(TheQuestion)/2)-SpaceLocs));
	if TheQuestion(SpaceLocs(MinInd)) == abs(filesep)
		set(th,'String',sprintf('%s\n%s',TheQuestion(1:SpaceLocs(MinInd)),TheQuestion((SpaceLocs(MinInd)+1):end)));
	else
		set(th,'String',sprintf('%s\n%s',TheQuestion(1:(SpaceLocs(MinInd)-1)),TheQuestion((SpaceLocs(MinInd)+1):end)));
	end
	while TextExt(1) < 0 & get(th,'FontSize') > 8
		set(th,'FontSize',get(th,'FontSize')-1);
		TextExt = get(th,'Extent');
		% I should create an error if font size does get down to 8, but I don't expect it ever to happen, so I'm not
		% going to deal with it.
	end
end
YesBh = uicontrol('Style','PushButton','Position',[YesBPos YesBWidth YesBHeight],'String',TheChoices{1}, ...
									'ForeGroundColor',get_color('midnight blue'),'BackgroundColor', ...
									get_color('wheat'),'FontSize',36,'Tag','YesButton','UserData',-1);
set(YesBh,'CallBack',['set(findobj(' int2str(QueryFigh) ',''Tag'',''YesButton''),''UserData'',1);']);
NoBWidth = YesBWidth;
NoBHeight = YesBHeight; 
NoBh = uicontrol('Style','PushButton','Position',[NoBPos YesBWidth YesBHeight],'String',TheChoices{2}, ...
                'ForeGroundColor',get_color('midnight blue'),'BackgroundColor', ...
                get_color('wheat'),'FontSize',36,'CallBack', ...
                ['set(findobj(' int2str(QueryFigh) ',''Tag'',''YesButton''),''UserData'',0);']);
YesBSSize = get(YesBh,'Extent');
while YesBSSize(3) > YesBWidth
	if YesBPos(1)+YesBWidth > NoBPos(1) - YesBWidth/2
		set(YesBh,'FontSize',get(YesBh,'FontSize')-12);
		if ~get(uih,'FontSize')
			error('Yes string is too big!');
		end
	else
		YesBPos(1) = YesBPos(1) - (YesBSSize(3)-YesBWidth)/2;
		YesBWidth = 1.1*YesBSSize(3);
		set(YesBh,'Position',[YesBPos YesBWidth YesBHeight]);
	end
	YesBSSize = get(YesBh,'Extent');
end

NoBSSize = get(NoBh,'Extent');
while NoBSSize(3) > NoBWidth
  if NoBWidth < YesBWidth
    NoBWidth = YesBWidth;
    set(NoBh,'Position',[NoBPos NoBWidth NoBHeight]);
  elseif NoBPos(1)+NoBWidth < 0.9*FigWidth
    NoBWidth = NoBWidth*1.1;
    set(NoBh,'Position',[NoBPos NoBWidth NoBHeight]);
  else
		set(NoBh,'FontSize',get(NoBh,'FontSize')-12);
		if ~get(NoBh,'FontSize')
			error('No string is too big!');
		end
	end
	NoBSSize = get(NoBh,'Extent');
end

drawnow;
waitfor(YesBh,'UserData');

% just in case user deletes figure rather than clicking button
if isempty(findobj('Tag',['Questionable Figure ' int2str(QueryFigh) ]))
	UserResponse = -1;
else
	UserResponse = get(YesBh,'UserData');
	delete(QueryFigh);
end

return;