How To Migrate / Connect an Uicontrol Spinner Function To GUI created by GUIDE

3 views (last 30 days)
Dear Community,
I have a question about how to connect Uicontrol Function of Spinner to be displayed in my GUI created by GUIDE. I just so confused because GUIDE didnt provide a spinner and it provided by App Designer Matlab. I just want to create a spinner by a function and display it on my GUIDE.
And this is an example of spinner function i get from internet :
function [obj] = uispinner(varargin)
%UISPINNER GUI Control to accept a scalar for the user
% The spinner has up/down buttons which the user can press to
% adjust the value with the mouse. The callback is continuously
% called as he does this.
% 'Min' - minimum value (default 0)
% 'Max' - maximum value (default 1)
% 'Step' - increment (default 0.01)
% 'Position' - position matrix
% 'Value' - the initial value (default 0)
% 'Format' - printf format controls display of value (default '%g')
% 'Callback' - callback of form (hObject, eventdata, value ...)
% (callback is called continuous as users spins the spinner.
% Extra arguments can be passed in a cell array.)
%
% Example use uispinner('Max' 100, 'Step', 1, 'Format' '%03d', ...
% 'Callback', {@spinme, 'Fred', 'Bloggs'})
%
% function spinme(hOBject, eventdata, value, opt)
% fprintf(1, '%s %s is spun to %f\n', opt{1}, opt{2}, value);
% end
val = 0;
min = 0;
max = 1;
step = 0.01;
pos = [80 80 100 25];
callback = [];
fmt = '%g';
for ii =1:2:nargin
if(ii == nargin)
error('option without value (%s)', varargin{ii});
end
if(strcmpi(varargin{ii}, 'Value'))
val = varargin{ii+1};
elseif(strcmpi(varargin{ii}, 'Min'))
min = varargin{ii+1};
elseif(strcmpi(varargin{ii}, 'Max'))
max = varargin{ii+1};
elseif(strcmpi(varargin{ii}, 'Step'))
step = varargin{ii+1};
elseif(strcmpi(varargin{ii}, 'Position'))
pos = varargin{ii+1};
elseif(strcmpi(varargin{ii}, 'Callback'))
callback = varargin{ii+1};
elseif(strcmpi(varargin{ii}, 'Format'))
fmt = varargin{ii+1};
else
error('Urecognised option %s', varargin{ii});
end
end
if(val < min)
val = min;
end
if(val > max)
val = max;
end
obj = uipanel('Position', pos);
hedit = uicontrol('Style', 'edit', 'String', sprintf(fmt, val), ...
'Position', [pos(1), pos(2), pos(3)-10, pos(4)], 'Callback', @edited, ...
'BackgroundColor', 'white');
if(step ~= 0 && min < max)
sstep = [step/(max-min) 0.1];
else
sstep = [0.001 0.1];
end
if(max > min)
sval = (val-min)/(max-min);
else
sval = 0;
end
hslider = uicontrol('Style', 'slider', ...
'Position', [pos(1)+pos(3)-10, pos(2), 10, pos(4)], ...
'Callback', @slide, 'SliderStep', sstep, 'Value', sval);
if(iscell(callback))
cbdata = callback;
callback = cbdata{1};
cbdata(1) = [];
else
cbdata = [];
end
s = struct('hedit', hedit, 'hslider', hslider, 'min', min, 'max', max, ...
'val', val, 'step', step, 'callback', callback, ...
'cbdata', {cbdata}, 'fmt', fmt);
set(obj, 'UserData', s);
set(hslider, 'UserData', obj);
set(hedit, 'UserData', obj);
function slide(hObject, eventdata)
t = get(hObject, 'Value');
hpanel = get(hObject, 'UserData');
s = get(hpanel, 'UserData');
v = s.min + (s.max-s.min)*t;
if(s.step ~= 0)
v = v - mod(v, s.step);
end
if(s.step == fix(s.step))
v = floor(v + 0.5);
end
set(s.hedit, 'String', sprintf(s.fmt, v));
s.val = v;
set(hpanel, 'UserData', s);
if(isempty(s.callback))
return;
elseif(isempty(s.cbdata))
s.callback(hpanel, [], s.val);
else
s.callback(hpanel, [], s.val, s.cbdata);
end
function edited(hObject, eventdata)
t = get(hObject, 'String');
hpanel = get(hObject, 'UserData');
s = get(hpanel, 'Userdata');
v = str2double(t);
if(isnan(v) || v < s.min || v > s.max)
set(s.hedit, 'String', sprintf(s.fmt, s.val));
else
if(s.step ~= 0)
v = v - mod(v, s.step);
end
s.val = v;
set(s.hedit, 'String', sprintf(s.fmt, s.val));
set(hpanel, 'UserData', s);
set(s.hslider, 'Value', (v - s.min) /(s.max-s.min));
if(isempty(s.callback))
return;
elseif(isempty(s.cbdata))
s.callback(hpanel, [], s.val);
else
s.callback(hpanel, [], s.val, s.cbdata);
end
end
If the code above is running, then the result would be like this :
The spinner would appear in Figure 1 Uipanel. In my question, i want to migrate and put the spinner in Figure 1 to FMI_methods.fig (the first picture) as one of handles structure in it.... Would anyone help me out to find the code or the solution? Iam very grateful if anyone can solve my problem.... Thank you so much.... /.\ /.\ /.\

Accepted Answer

Rik
Rik on 27 Jan 2022
What you want is not possible with the builtin uispinner function. As its documentation states the parent can only be a uifigure or one of its decendants. It is thus not possible to implement it in a GUIDE-created GUI.
If you have an implementation from someone else, you should ask them for usage examples. It is also a good idea to avoid the function names Matlab has chosen, so you should probably rename the function if you actually intend to use it.
Also, you shouldn't be using GUIDE. For general advice and examples for how to create a GUI (and avoid using GUIDE), have look at this thread.
  3 Comments
Rik
Rik on 28 Jan 2022
The spinner is composed of an edit field and two buttons. The edit field can display text, so you can rig it to display a date as well (e.g. with the datestr function). You will also have to change the increment/decrement functions to first convert the date to a number, then add or subtract the step, then convert back to a char vector.
Tyann Hardyn
Tyann Hardyn on 1 Feb 2022
@Rik Thank you so much, iam following your HINTS, and it work. Logic , Debug, and Behavior is The Key of all programming language, thought....

Sign in to comment.

More Answers (0)

Categories

Find more on Migrate GUIDE Apps in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!