Auswertung Experiment
Database tüddelei DBHanlder läuft gut für DIESE Datanbank struktur... App begonnen aber weit entfernt von gutem Stand
This commit is contained in:
11
Libs/settingsdlg/.gitignore
vendored
Normal file
11
Libs/settingsdlg/.gitignore
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
slprj/
|
||||
*.mexw32
|
||||
*.mexglx
|
||||
*.mexmaci
|
||||
*.mexw64
|
||||
*.mexmaci64
|
||||
*.mexa64
|
||||
*.zip
|
||||
*.m~
|
||||
*.asv
|
||||
|
||||
26
Libs/settingsdlg/License.txt
Normal file
26
Libs/settingsdlg/License.txt
Normal file
@@ -0,0 +1,26 @@
|
||||
Copyright (c) 2018, Rody Oldenhuis
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
The views and conclusions contained in the software and documentation are those
|
||||
of the authors and should not be interpreted as representing official policies,
|
||||
either expressed or implied, of this project.
|
||||
114
Libs/settingsdlg/README.md
Normal file
114
Libs/settingsdlg/README.md
Normal file
@@ -0,0 +1,114 @@
|
||||
[](https://www.mathworks.com/matlabcentral/fileexchange/26312-settings-dialog)
|
||||
|
||||
|
||||
[](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=4M7RMVNMKAXXQ&source=url)
|
||||
|
||||
|
||||
# FEX-settingsdlg
|
||||
|
||||
The function settingsdlg() is a GUI-dialog much like MATLAB's default errordlg(), questiondlg() and warndlg(), which provides a standardized way to assign specific values to a structure. This structure can then be used to insert specific settings
|
||||
into one of MATLAB's many standard algorithms, or your own. The most basic usage is as follows:
|
||||
|
||||
[ settings, button] = settingsdlg(...
|
||||
'TolX' , 1e-6,...
|
||||
'TolFun', 1e-6);
|
||||
which will produce a nice dialog box with the fields and edit boxes as you'd expect them. After pressing OK or Cancel, the structure settings will be
|
||||
|
||||
settings =
|
||||
|
||||
TolX: 1.0000e-006
|
||||
TolFun: 1.0000e-006
|
||||
button =
|
||||
'ok'
|
||||
|
||||
or any relevant values you have assigned. Naturally, you can add as many fields as you want; the dialog will automatically adjust its size to match your input. If you would like the user to not just insert numeric values, but select values from a
|
||||
string list, use
|
||||
|
||||
settings = settingsdlg(...
|
||||
'TolX' , 1e-6,...
|
||||
'TolFun' , 1e-6,...
|
||||
'Algorithm', {'active-set','interior-point'});
|
||||
|
||||
which will produce the same dialog, with a popup-list added. The resulting structure in this case is:
|
||||
|
||||
settings =
|
||||
|
||||
TolX: 1.0000e-006
|
||||
TolFun: 1.0000e-006
|
||||
Algorithm: 'active-set'
|
||||
|
||||
Of course, it isn't always convenient to have the text for each option in the dialog box equal to the fieldname in the resulting structure. If you want the fieldname to be different from the displayed string, you can use something like:
|
||||
|
||||
settings = settingsdlg(...
|
||||
{'Tolerance X' ;'TolX' }, 1e-6,...
|
||||
{'Tolerance Fun';'TolFun'}, 1e-6,...
|
||||
'Algorithm', {'active-set','interior-point'});
|
||||
|
||||
which produces the dialog displaying the *first* entries in the cell-arrays, but the associated structure has the fieldnames
|
||||
|
||||
settings =
|
||||
|
||||
TolX: 1.0000e-006
|
||||
TolFun: 1.0000e-006
|
||||
Algorithm: 'active-set'
|
||||
|
||||
Also, you can add separators, a different dialog title, and a brief description:
|
||||
|
||||
settings = settingsdlg(...
|
||||
'Description', 'This dialog will set the parameters used by FMINCON()',...
|
||||
'title' , 'FMINCON() options',...
|
||||
'separator' , 'Unconstrained/General',...
|
||||
{'Tolerance X' ;'TolX' }, 1e-6,...
|
||||
{'Tolerance on Function';'TolFun'}, 1e-6,...
|
||||
'Algorithm' , {'active-set','interior-point'},...
|
||||
'separator' , 'Constrained',...
|
||||
{'Tolerance on Constraint';'TolCon'}, 1e-6);
|
||||
|
||||
The 'title' and 'description' options can appear anywhere in the argument list, they will not affect the fields in the output structure. The order of the 'separator' option of course *does* matter, but, it will *not* be added as a field to the output structure. You can also use logicals, which produce checkboxes:
|
||||
|
||||
settings = settingsdlg(...
|
||||
'Description', 'This dialog will set the parameters used by FMINCON()',...
|
||||
'title' , 'FMINCON() options',...
|
||||
'separator' , 'Unconstrained/General',...
|
||||
{'Tolerance X';'TolX'}, 1e-6,...
|
||||
{'Tolerance on Function';'TolFun'}, 1e-6,...
|
||||
'Algorithm' , {'active-set','interior-point'},...
|
||||
'separator' , 'Constrained',...
|
||||
{'This is a checkbox'; 'Check'}, true,...
|
||||
{'Tolerance on Constraints';'TolCon'}, 1e-6);
|
||||
|
||||
which results in
|
||||
|
||||
settings =
|
||||
|
||||
TolX: 1.0000e-006
|
||||
TolFun: 1.0000e-006
|
||||
Algorithm: 'active-set'
|
||||
Check: 1
|
||||
TolCon: 1.0000e-006
|
||||
|
||||
You can also assign multiple (logical!) values to a single checkbox, in which case the fields below the checkbox are all disabled/enabled when you check it:
|
||||
|
||||
settings = settingsdlg(...
|
||||
'Description', 'This dialog will set the parameters used by FMINCON()',...
|
||||
'title' , 'FMINCON() options',...
|
||||
'separator' , 'Unconstrained/General',...
|
||||
{'This is a checkbox'; 'Check'}, [true, true],...
|
||||
{'Tolerance X';'TolX'}, 1e-6,...
|
||||
{'Tolerance on Function';'TolFun'}, 1e-6,...
|
||||
'Algorithm' , {'active-set','interior-point'},...
|
||||
'separator' , 'Constrained',...
|
||||
{'Tolerance on Constraints';'TolCon'}, 1e-6);
|
||||
|
||||
Setting the checkbox value to [true, true] will cause the dialog box to appear with all fields below the appropriate separator disabled, whereas a value of [true, false] will have all fields initially enabled. Checking or un-checking the checkbox will simply swap the enabled/disabled states.
|
||||
|
||||
Finally, you can insert a single structure as a (single!) argument, which produces a dialog box according to its settings and fieldnames:
|
||||
|
||||
settings = struct(...
|
||||
'TolX' , 1e-6,...
|
||||
'TolFun', 1e-6);
|
||||
settings = settingsdlg(settings);
|
||||
|
||||
Naturally, since all other information is absent in this last example, the functionality in this case is rather limited. But if the intent is to change a fairly simple structure, it certainly suffices.
|
||||
|
||||
If you like this work, please consider [a donation](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=4M7RMVNMKAXXQ&source=url).
|
||||
BIN
Libs/settingsdlg/Screen.png
Normal file
BIN
Libs/settingsdlg/Screen.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.1 KiB |
488
Libs/settingsdlg/settingsdlg.m
Normal file
488
Libs/settingsdlg/settingsdlg.m
Normal file
@@ -0,0 +1,488 @@
|
||||
function [settings, button] = settingsdlg(varargin)
|
||||
% SETTINGSDLG Default dialog to produce a settings-structure
|
||||
%
|
||||
% settings = SETTINGSDLG('fieldname', default_value, ...) creates a modal
|
||||
% dialog box that returns a structure formed according to user input. The
|
||||
% input should be given in the form of 'fieldname', default_value - pairs,
|
||||
% where 'fieldname' is the fieldname in the structure [settings], and
|
||||
% default_value the initial value displayed in the dialog box.
|
||||
%
|
||||
% SETTINGSDLG uses UIWAIT to suspend execution until the user responds.
|
||||
%
|
||||
% settings = SETTINGSDLG(settings) uses the structure [settings] to form
|
||||
% the various input fields. This is the most basic (and limited) usage of
|
||||
% SETTINGSDLG.
|
||||
%
|
||||
% [settings, button] = SETTINGSDLG(settings) returns which button was
|
||||
% pressed, in addition to the (modified) structure [settings]. Either 'ok',
|
||||
% 'cancel' or [] are possible values. The empty output means that the
|
||||
% dialog was closed before either Cancel or OK were pressed.
|
||||
%
|
||||
% SETTINGSDLG('title', 'window_title') uses 'window_title' as the dialog's
|
||||
% title. The default is 'Adjust settings'.
|
||||
%
|
||||
% SETTINGSDLG('description', 'brief_description',...) starts the dialog box
|
||||
% with 'brief_description', followed by the input fields.
|
||||
%
|
||||
% SETTINGSDLG('windowposition', P, ...) positions the dialog box according to
|
||||
% the string or vector [P]; see movegui() for valid values.
|
||||
%
|
||||
% SETTINGSDLG( {'display_string', 'fieldname'}, default_value,...) uses the
|
||||
% 'display_string' in the dialog box, while assigning the corresponding
|
||||
% user-input to fieldname 'fieldname'.
|
||||
%
|
||||
% SETTINGSDLG(..., 'checkbox_string', true, ...) displays a checkbox in
|
||||
% stead of the default edit box, and SETTINGSDLG('fieldname', {'string1',
|
||||
% 'string2'},... ) displays a popup box with the strings given in
|
||||
% the second cell-array.
|
||||
%
|
||||
% Additionally, you can put [..., 'separator', 'seperator_string',...]
|
||||
% anywhere in the argument list, which will divide all the arguments into
|
||||
% sections, with section headings 'seperator_string'.
|
||||
%
|
||||
% You can also modify the display behavior in the case of checkboxes. When
|
||||
% defining checkboxes with a 2-element logical array, the second boolean
|
||||
% determines whether all fields below that checkbox are initially disabled
|
||||
% (true) or not (false).
|
||||
%
|
||||
% Example:
|
||||
%
|
||||
% [settings, button] = settingsdlg(...
|
||||
% 'Description', 'This dialog will set the parameters used by FMINCON()',...
|
||||
% 'title' , 'FMINCON() options',...
|
||||
% 'separator' , 'Unconstrained/General',...
|
||||
% {'This is a checkbox'; 'Check'}, [true true],...
|
||||
% {'Tolerance X';'TolX'}, 1e-6,...
|
||||
% {'Tolerance on Function';'TolFun'}, 1e-6,...
|
||||
% 'Algorithm' , {'active-set','interior-point'},...
|
||||
% 'separator' , 'Constrained',...
|
||||
% {'Tolerance on Constraints';'TolCon'}, 1e-6)
|
||||
%
|
||||
% See also inputdlg, dialog, errordlg, helpdlg, listdlg, msgbox, questdlg, textwrap,
|
||||
% uiwait, warndlg.
|
||||
|
||||
|
||||
% Please report bugs and inquiries to:
|
||||
%
|
||||
% Name : Rody P.S. Oldenhuis
|
||||
% E-mail : oldenhuis@gmail.com
|
||||
% Licence: 2-clause BSD (See Licence.txt)
|
||||
|
||||
|
||||
% If you find this work useful, please consider a donation:
|
||||
% https://www.paypal.me/RodyO/3.5
|
||||
|
||||
%% Initialize
|
||||
|
||||
% errortraps
|
||||
narg = nargin;
|
||||
if verLessThan('MATLAB', '8.6')
|
||||
error(nargchk(1, inf, narg, 'struct')); %#ok<NCHKN>
|
||||
else
|
||||
narginchk(1, inf);
|
||||
end
|
||||
|
||||
% parse input (+errortrap)
|
||||
have_settings = 0;
|
||||
if isstruct(varargin{1})
|
||||
settings = varargin{1}; have_settings = 1; end
|
||||
if (narg == 1)
|
||||
if isstruct(varargin{1})
|
||||
parameters = fieldnames(settings);
|
||||
values = cellfun(@(x)settings.(x), parameters, 'UniformOutput', false);
|
||||
else
|
||||
error('settingsdlg:incorrect_input',...
|
||||
'When pasing a single argument, that argument must be a structure.')
|
||||
end
|
||||
else
|
||||
parameters = varargin(1+have_settings : 2 : end);
|
||||
values = varargin(2+have_settings : 2 : end);
|
||||
end
|
||||
|
||||
% Initialize data
|
||||
button = [];
|
||||
fields = cell(numel(parameters),1);
|
||||
tags = fields;
|
||||
|
||||
% Fill [settings] with default values & collect data
|
||||
for ii = 1:numel(parameters)
|
||||
|
||||
% Extract fields & tags
|
||||
if iscell(parameters{ii})
|
||||
tags{ii} = parameters{ii}{1};
|
||||
fields{ii} = parameters{ii}{2};
|
||||
else
|
||||
% More errortraps
|
||||
if ~ischar(parameters{ii})
|
||||
error('settingsdlg:nonstring_parameter',...
|
||||
'Arguments should be given as [''parameter'', value,...] pairs.')
|
||||
end
|
||||
tags{ii} = parameters{ii};
|
||||
fields{ii} = parameters{ii};
|
||||
end
|
||||
|
||||
% More errortraps
|
||||
if ~ischar(fields{ii})
|
||||
error('settingsdlg:fieldname_not_char',...
|
||||
'Fieldname should be a string.')
|
||||
end
|
||||
if ~ischar(tags{ii})
|
||||
error('settingsdlg:tag_not_char',...
|
||||
'Display name should be a string.')
|
||||
end
|
||||
|
||||
% NOTE: 'Separator' is now in 'fields' even though
|
||||
% it will not be used as a fieldname
|
||||
|
||||
% Make sure all fieldnames are properly formatted
|
||||
% (alternating capitals, no whitespace)
|
||||
if ~strcmpi(fields{ii}, {'Separator';'Title';'Description'})
|
||||
whitespace = isspace(fields{ii});
|
||||
capitalize = circshift(whitespace,[0,1]);
|
||||
fields{ii}(capitalize) = upper(fields{ii}(capitalize));
|
||||
fields{ii} = fields{ii}(~whitespace);
|
||||
% insert associated value in output
|
||||
if iscell(values{ii})
|
||||
settings.(fields{ii}) = values{ii}{1};
|
||||
elseif (length(values{ii}) > 1)
|
||||
settings.(fields{ii}) = values{ii}(1);
|
||||
else
|
||||
settings.(fields{ii}) = values{ii};
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
% Avoid (some) confusion
|
||||
clear parameters
|
||||
|
||||
% Use default colorscheme from the OS
|
||||
bgcolor = get(0, 'defaultUicontrolBackgroundColor');
|
||||
% Default fontsize
|
||||
fontsize = get(0, 'defaultuicontrolfontsize');
|
||||
% Edit-bgcolor is platform-dependent.
|
||||
% MS/Windows: white.
|
||||
% UNIX: same as figure bgcolor
|
||||
% if ispc, edit_bgcolor = 'White';
|
||||
% else edit_bgcolor = bgcolor;
|
||||
% end
|
||||
|
||||
% TODO: not really applicable since defaultUicontrolBackgroundColor
|
||||
% doesn't really seem to work on Unix...
|
||||
edit_bgcolor = 'White';
|
||||
|
||||
% Get basic window properties
|
||||
title = getValue('Adjust settings', 'Title');
|
||||
description = getValue( [], 'Description');
|
||||
total_width = getValue(325, 'WindowWidth');
|
||||
control_width = getValue(100, 'ControlWidth');
|
||||
|
||||
% Window positioning:
|
||||
% Put the window in the center of the screen by default.
|
||||
% This will usually work fine, except on some multi-monitor setups.
|
||||
scz = get(0, 'ScreenSize');
|
||||
scxy = round(scz(3:4)/2-control_width/2);
|
||||
scx = min(scz(3),max(1,scxy(1)));
|
||||
scy = min(scz(4),max(1,scxy(2)));
|
||||
|
||||
% String to pass on to movegui
|
||||
window_position = getValue('center', 'WindowPosition');
|
||||
|
||||
|
||||
% Calculate best height for all uicontrol()
|
||||
control_height = max(18, (fontsize+6));
|
||||
|
||||
% Calculate figure height (will be adjusted later according to description)
|
||||
total_height = numel(fields)*1.25*control_height + ... % to fit all controls
|
||||
1.5*control_height + 20; % to fit "OK" and "Cancel" buttons
|
||||
|
||||
% Total number of separators
|
||||
num_separators = nnz(strcmpi(fields,'Separator'));
|
||||
|
||||
% Draw figure in background
|
||||
fighandle = figure(...
|
||||
'integerhandle' , 'off',... % use non-integers for the handle (prevents accidental plots from going to the dialog)
|
||||
'Handlevisibility', 'off',... % only visible from within this function
|
||||
'position' , [scx, scy, total_width, total_height],...% figure position
|
||||
'visible' , 'off',... % hide the dialog while it is being constructed
|
||||
'backingstore' , 'off',... % DON'T save a copy in the background
|
||||
'resize' , 'off', ... % but just keep it resizable
|
||||
'renderer' , 'zbuffer', ... % best choice for speed vs. compatibility
|
||||
'WindowStyle' ,'modal',... % window is modal
|
||||
'units' , 'pixels',... % better for drawing
|
||||
'DockControls' , 'off',... % force it to be non-dockable
|
||||
'name' , title,... % dialog title
|
||||
'menubar' ,'none', ... % no menubar of course
|
||||
'toolbar' ,'none', ... % no toolbar
|
||||
'NumberTitle' , 'off',... % "Figure 1.4728...:" just looks corny
|
||||
'color' , bgcolor); % use default colorscheme
|
||||
|
||||
%% Draw all required uicontrols(), and unhide window
|
||||
|
||||
% Define X-offsets (different when separators are used)
|
||||
separator_offset_X = 2;
|
||||
if num_separators > 0
|
||||
text_offset_X = 20;
|
||||
text_width = (total_width-control_width-text_offset_X);
|
||||
else
|
||||
text_offset_X = separator_offset_X;
|
||||
text_width = (total_width-control_width);
|
||||
end
|
||||
|
||||
% Handle description
|
||||
description_offset = 0;
|
||||
if ~isempty(description)
|
||||
|
||||
% create textfield (negligible height initially)
|
||||
description_panel = uicontrol(...
|
||||
'parent' , fighandle,...
|
||||
'style' , 'text',...
|
||||
'Horizontalalignment', 'left',...
|
||||
'position', [separator_offset_X,...
|
||||
total_height,total_width,1]);
|
||||
|
||||
% wrap the description
|
||||
description = textwrap(description_panel, {description});
|
||||
|
||||
% adjust the height of the figure
|
||||
textheight = size(description,1)*(fontsize+6);
|
||||
description_offset = textheight + 20;
|
||||
total_height = total_height + description_offset;
|
||||
set(fighandle,...
|
||||
'position', [scx, scy, total_width, total_height])
|
||||
|
||||
% adjust the position of the textfield and insert the description
|
||||
set(description_panel, ...
|
||||
'string' , description,...
|
||||
'position', [separator_offset_X, total_height-textheight, ...
|
||||
total_width, textheight]);
|
||||
end
|
||||
|
||||
% Define Y-offsets (different when descriptions are used)
|
||||
control_offset_Y = total_height-control_height-description_offset;
|
||||
|
||||
% initialize loop
|
||||
controls = zeros(numel(tags)-num_separators,1);
|
||||
ii = 1; sep_ind = 1;
|
||||
enable = 'on'; separators = zeros(num_separators,1);
|
||||
|
||||
% loop through the controls
|
||||
if numel(tags) > 0
|
||||
while true
|
||||
|
||||
% Should we draw a separator?
|
||||
if strcmpi(tags{ii}, 'Separator')
|
||||
|
||||
% Print separator
|
||||
uicontrol(...
|
||||
'style' , 'text',...
|
||||
'parent' , fighandle,...
|
||||
'string' , values{ii},...
|
||||
'horizontalalignment', 'left',...
|
||||
'fontweight', 'bold',...
|
||||
'position', [separator_offset_X,control_offset_Y-4, ...
|
||||
total_width, control_height]);
|
||||
|
||||
% remove separator, but save its position
|
||||
fields(ii) = [];
|
||||
tags(ii) = []; separators(sep_ind) = ii;
|
||||
values(ii) = []; sep_ind = sep_ind + 1;
|
||||
|
||||
% reset enable (when neccessary)
|
||||
if strcmpi(enable, 'off')
|
||||
enable = 'on'; end
|
||||
|
||||
% NOTE: DON'T increase loop index
|
||||
|
||||
% ... or a setting?
|
||||
else
|
||||
|
||||
% logicals: use checkbox
|
||||
if islogical(values{ii})
|
||||
|
||||
% First draw control
|
||||
controls(ii) = uicontrol(...
|
||||
'style' , 'checkbox',...
|
||||
'parent' , fighandle,...
|
||||
'enable' , enable,...
|
||||
'string' , tags{ii},...
|
||||
'value' , values{ii}(1),...
|
||||
'position', [text_offset_X,control_offset_Y-4, ...
|
||||
total_width, control_height]);
|
||||
|
||||
% Should everything below here be OFF?
|
||||
if (length(values{ii})>1)
|
||||
% turn next controls off when asked for
|
||||
if values{ii}(2)
|
||||
enable = 'off'; end
|
||||
% Turn on callback function
|
||||
set(controls(ii),...
|
||||
'Callback', @(varargin) EnableDisable(ii,varargin{:}));
|
||||
end
|
||||
|
||||
% doubles : use edit box
|
||||
% cells : use popup
|
||||
% cell-of-cells: use table
|
||||
else
|
||||
% First print parameter
|
||||
uicontrol(...
|
||||
'style' , 'text',...
|
||||
'parent' , fighandle,...
|
||||
'string' , [tags{ii}, ':'],...
|
||||
'horizontalalignment', 'left',...
|
||||
'position', [text_offset_X,control_offset_Y-4, ...
|
||||
text_width, control_height]);
|
||||
|
||||
% Popup, edit box or table?
|
||||
style = 'edit';
|
||||
draw_table = false;
|
||||
if iscell(values{ii})
|
||||
style = 'popup';
|
||||
if all(cellfun('isclass', values{ii}, 'cell'))
|
||||
draw_table = true; end
|
||||
end
|
||||
|
||||
% Draw appropriate control
|
||||
if ~draw_table
|
||||
controls(ii) = uicontrol(...
|
||||
'enable' , enable,...
|
||||
'style' , style,...
|
||||
'Background', edit_bgcolor,...
|
||||
'parent' , fighandle,...
|
||||
'string' , values{ii},...
|
||||
'position', [text_width,control_offset_Y,...
|
||||
control_width, control_height]);
|
||||
else
|
||||
% TODO
|
||||
% ...table? ...radio buttons? How to do this?
|
||||
warning(...
|
||||
'settingsdlg:not_yet_implemented',...
|
||||
'Treatment of cells is not yet implemented.');
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
% increase loop index
|
||||
ii = ii + 1;
|
||||
end
|
||||
|
||||
% end loop?
|
||||
if ii > numel(tags)
|
||||
break, end
|
||||
|
||||
% Decrease offset
|
||||
control_offset_Y = control_offset_Y - 1.25*control_height;
|
||||
end
|
||||
end
|
||||
|
||||
% Draw cancel button
|
||||
uicontrol(...
|
||||
'style' , 'pushbutton',...
|
||||
'parent' , fighandle,...
|
||||
'string' , 'Cancel',...
|
||||
'position', [separator_offset_X,2, total_width/2.5,control_height*1.5],...
|
||||
'Callback', @Cancel)
|
||||
|
||||
% Draw OK button
|
||||
uicontrol(...
|
||||
'style' , 'pushbutton',...
|
||||
'parent' , fighandle,...
|
||||
'string' , 'OK',...
|
||||
'position', [total_width*(1-1/2.5)-separator_offset_X,2, ...
|
||||
total_width/2.5,control_height*1.5],...
|
||||
'Callback', @OK)
|
||||
|
||||
% move to center of screen and make visible
|
||||
movegui(fighandle, window_position);
|
||||
set(fighandle, 'Visible', 'on');
|
||||
|
||||
% WAIT until OK/Cancel is pressed
|
||||
uiwait(fighandle);
|
||||
|
||||
|
||||
|
||||
%% Helper funcitons
|
||||
|
||||
% Get a value from the values array:
|
||||
% - if it does not exist, return the default value
|
||||
% - if it exists, assign it and delete the appropriate entries from the
|
||||
% data arrays
|
||||
function val = getValue(default, tag)
|
||||
index = strcmpi(fields, tag);
|
||||
if any(index)
|
||||
val = values{index};
|
||||
values(index) = [];
|
||||
fields(index) = [];
|
||||
tags(index) = [];
|
||||
else
|
||||
val = default;
|
||||
end
|
||||
end
|
||||
|
||||
%% callback functions
|
||||
|
||||
% Enable/disable controls associated with (some) checkboxes
|
||||
function EnableDisable(which, varargin) %#ok<VANUS>
|
||||
|
||||
% find proper range of controls to switch
|
||||
if (num_separators > 1)
|
||||
range = (which+1):(separators(separators > which)-1);
|
||||
else range = (which+1):numel(controls);
|
||||
end
|
||||
|
||||
% enable/disable these controls
|
||||
if strcmpi(get(controls(range(1)), 'enable'), 'off')
|
||||
set(controls(range), 'enable', 'on')
|
||||
else
|
||||
set(controls(range), 'enable', 'off')
|
||||
end
|
||||
end
|
||||
|
||||
% OK button:
|
||||
% - update fields in [settings]
|
||||
% - assign [button] output argument ('ok')
|
||||
% - kill window
|
||||
function OK(varargin) %#ok<VANUS>
|
||||
|
||||
% button pressed
|
||||
button = 'OK';
|
||||
|
||||
% fill settings
|
||||
for i = 1:numel(controls)
|
||||
|
||||
% extract current control's string, value & type
|
||||
str = get(controls(i), 'string');
|
||||
val = get(controls(i), 'value');
|
||||
style = get(controls(i), 'style');
|
||||
|
||||
% popups/edits
|
||||
if ~strcmpi(style, 'checkbox')
|
||||
% extract correct string (popups only)
|
||||
if strcmpi(style, 'popupmenu'), str = str{val}; end
|
||||
% try to convert string to double
|
||||
val = str2double(str);
|
||||
% insert this double in [settings]. If it was not a
|
||||
% double, insert string instead
|
||||
if ~isnan(val), settings.(fields{i}) = val;
|
||||
else settings.(fields{i}) = str;
|
||||
end
|
||||
|
||||
% checkboxes
|
||||
else
|
||||
% we can insert value immediately
|
||||
settings.(fields{i}) = val;
|
||||
end
|
||||
end
|
||||
|
||||
% kill window
|
||||
delete(fighandle);
|
||||
end
|
||||
|
||||
% Cancel button:
|
||||
% - assign [button] output argument ('cancel')
|
||||
% - delete figure (so: return default settings)
|
||||
function Cancel(varargin) %#ok<VANUS>
|
||||
button = 'cancel';
|
||||
delete(fighandle);
|
||||
end
|
||||
|
||||
end
|
||||
BIN
Libs/settingsdlg/settingsdlg.odt
Normal file
BIN
Libs/settingsdlg/settingsdlg.odt
Normal file
Binary file not shown.
BIN
Libs/settingsdlg/settingsdlg.pdf
Normal file
BIN
Libs/settingsdlg/settingsdlg.pdf
Normal file
Binary file not shown.
Reference in New Issue
Block a user