diff m-toolbox/m/gui/gltpda/pan8nested.m @ 0:f0afece42f48

Import.
author Daniele Nicolodi <nicolodi@science.unitn.it>
date Wed, 23 Nov 2011 19:22:13 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/m-toolbox/m/gui/gltpda/pan8nested.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,610 @@
+function pan8nested(varargin)
+
+% ========================================================================
+% =================== Panel to organize nested loops =====================
+% ========================================================================
+%
+%  $Id: pan8nested.m,v 1.3 2008/11/07 17:59:42 nicola Exp $
+
+scaleX = getappdata(0, 'ltpda_gui_scalefactor');
+guiFontSize = round(10*scaleX);
+currPanel   = varargin{1};
+panelDimens = get(currPanel, 'Position');
+backColor   = get(currPanel, 'BackgroundColor');
+
+global paramLoop currSys enabledNestedParams
+currSys = '';
+   
+alltimers = timerfindall;
+stop(alltimers(2));
+set(alltimers(2),'TimerFcn',@ContinuousCheck,'Period',1);
+start(alltimers(2));
+
+%%
+ %----------------------------------------------------------------------
+ function buildNestedPanel(varargin)
+ %----------------------------------------------------------------------
+
+   delete(findobj(gcf,'Parent',currPanel))
+   
+ % Check if nested loops execution is enabled or not:
+   nestBlock = find_system(bdroot,'SearchDepth',1,'BlockType','SubSystem','Tag','nestedloops');
+   if isempty(nestBlock)
+      nestedStatus = 0;
+      nestBlock = {''};
+   elseif isempty(get_param(nestBlock{1},'Description'))
+      set_param(nestBlock{1},'Description','0');
+      nestedStatus = 0;
+   else
+      nestedStatus = str2double(get_param(nestBlock{1},'Description'));
+   end
+   
+
+  % Enable nested loops:
+  uicontrol('Parent',currPanel,'BackgroundColor',backColor,'TooltipString','Enable or disable the execution of nested loops: when disabled the variables won''t be cleared','Units','normalized','Position',[0.2 0.92 0.2 0.040],'String',' Enable nested loops','FontName','Times New Roman','FontSize',guiFontSize+1,'FontWeight','normal','Value',nestedStatus,'Visible','on','Callback',{@enableNested,currPanel,nestBlock{1}},'Style','checkbox');
+
+   % Current system:
+  uicontrol('Parent',currPanel,'BackgroundColor',backColor,'HorizontalAlignment','left','Units','normalized','Position',[0.5 0.92 0.125 0.040],'String','Current system:','FontName','Times New Roman','FontSize',guiFontSize+1,'FontWeight','normal','Visible','on','Style','text');
+    currsystem = bdroot;
+    if isempty(currsystem) || isempty(find_system(currsystem,'FindAll','on','Type','Annotation','Tag','ltpda model')), currsystem = 'None'; end
+  uicontrol('Parent',currPanel,'BackgroundColor',backColor,'HorizontalAlignment','left','Units','normalized','Position',[0.65 0.92 0.25 0.040],'String',currsystem,'FontName','Times New Roman','FontSize',guiFontSize+1,'FontWeight','normal','Visible','on','UserData','currsystem','Style','text');
+   
+   if isempty(nestBlock{1})
+      paramLoop = {};
+      paramnumb = 0;
+      enabledNestedParams = [];
+   else
+      paramLoop = get_param(nestBlock{1},'UserData');
+      paramnumb = size(paramLoop,1);
+      enabledNestedParams = get_param(nestBlock{1},'MaskDescription');
+      if ~isempty(enabledNestedParams)
+         eval(enabledNestedParams);
+      else
+         enabledNestedParams = ones(1,paramnumb);
+         set_param(nestBlock{1},'MaskDescription',['enabledNestedParams = ',mat2str(enabledNestedParams),';'])
+      end
+   end
+   
+   for i=1:paramnumb %ie, for every row
+    % Set the proper number to each row:
+      paramLoop{i,1}=i;
+    % Check that every parameter has a valid order value:
+      if isempty(paramLoop{i,2}), paramLoop{i,2}=1; end
+    % Check that every parameter has a name (not empty):
+      if isempty(paramLoop{i,3})
+         ii=1;
+         while ~isempty(findstr(['loop.var',num2str(ii)],[paramLoop{:,3}])), ii=ii+1; end
+         paramLoop{i,3}=['loop.var',num2str(ii)];
+      end
+    % Check that every parameter has a values array (even empty):
+      if isempty(paramLoop{i,6}), paramLoop{i,6}={}; end
+   end
+   
+% % %  % Defining the array with the names/handles of all the elements in the GUI:
+% % %    global AllNames
+
+ % Dimensions of all the objects which can be created inside the Loop Panel:
+   AddButtDimension      = [20 20];   RemButtDimension      = [20 20];
+   LeftArrDimension      = [20 20];   RightArrDimension     = [20 20];
+   UpArrDimension        = [20 15];   DownArrDimension      = [20 15];
+   Param2ChangeDimension = [150 20];  IterValDimension      = [60 20];
+
+ % Legend (static part of the window):
+  uicontrol('Parent',currPanel,'BackgroundColor',backColor,'HorizontalAlignment','center','Position',[40 panelDimens(4)-80 50 30],'String',{'Add /','Remove'},'FontName','Times New Roman','FontSize',guiFontSize,'Visible','on','Style','text');
+  uicontrol('Parent',currPanel,'BackgroundColor',backColor,'HorizontalAlignment','left','Position',[110 panelDimens(4)-85 45 30],'String','Position','FontName','Times New Roman','FontSize',guiFontSize,'Visible','on','Style','text');
+  uicontrol('Parent',currPanel,'BackgroundColor',backColor,'HorizontalAlignment','center','Position',[195 panelDimens(4)-85 110 30],'String','Parameter name','FontName','Times New Roman','FontSize',guiFontSize,'Visible','on','Style','text');
+  uicontrol('Parent',currPanel,'BackgroundColor',backColor,'HorizontalAlignment','left','Position',[360 panelDimens(4)-85 70 30],'String','Iterations','FontName','Times New Roman','FontSize',guiFontSize,'Visible','on','Style','text');
+
+% =========================================================================
+% This part build the dynamic part of the window:
+% =========================================================================
+  if 40*(paramnumb+3)+20 < panelDimens(4), possible2add = 'on';
+  else possible2add = 'off';
+  end
+
+  for i=1:paramnumb
+     AddButtPosition      = [45 panelDimens(4)-40*(i+2)];
+     RemButtPosition      = [67 panelDimens(4)-40*(i+2)];
+     LeftArrPosition      = [105+30*(paramLoop{i,2}-1) panelDimens(4)-40*(i+2)];
+     UpArrPosition        = [125+30*(paramLoop{i,2}-1) panelDimens(4)+8-40*(i+2)];
+     DownArrPosition      = [125+30*(paramLoop{i,2}-1) panelDimens(4)-8-40*(i+2)];
+     RightArrPosition     = [145+30*(paramLoop{i,2}-1) panelDimens(4)-40*(i+2)];
+     Param2ChangePosition = [180+30*(paramLoop{i,2}-1) panelDimens(4)-40*(i+2)];
+     IterValPosition      = [355+30*(paramLoop{i,2}-1) panelDimens(4)-40*(i+2)];
+
+   % Checkbox to enable this param:
+     uicontrol('Parent',currPanel,'Value',enabledNestedParams(i),'TooltipString','Enable or disable this parameter only','Units','pixels','BackGroundColor',[1 1 1],'Position',[15 panelDimens(4)-40*(i+2)+2 15 15],'Visible','on','Enable',possible2add,'UserData',i,'Callback',{@EnableNestedParam,currPanel,nestBlock{1}},'Style','checkbox');     
+
+       uicontrol('Parent',currPanel,'TooltipString','Add another parameter','Units','pixels','Position',[AddButtPosition,AddButtDimension],'String','+','Visible','on','Enable',possible2add,'UserData',i,'Callback', @AddButtCallback,'Style','pushbutton');
+       uicontrol('Parent',currPanel,'TooltipString','Remove this parameter','Units','pixels','Position',[RemButtPosition,RemButtDimension],'String','-','Visible','on','Enable','on','UserData',i,'Callback', @RemButtCallback,'Style','pushbutton');
+     LeftArrNames{i} = uicontrol('Parent',currPanel,'TooltipString','Move this parameter to the left','Units','pixels','Position',[LeftArrPosition,LeftArrDimension],'String','<','Visible','on','Enable','on','UserData',i,'Callback', @LeftArrCallback,'Style','pushbutton');
+     RightArrNames{i} = uicontrol('Parent',currPanel,'TooltipString','Move this parameter to the right','Units','pixels','Position',[RightArrPosition,RightArrDimension],'String','>','Visible','on','Enable','on','UserData',i,'Callback', @RightArrCallback,'Style','pushbutton');
+     UpArrNames{i}   = uicontrol('Parent',currPanel,'TooltipString','Move this parameter up','Units','pixels','Position',[UpArrPosition,DownArrDimension],'String','','Visible','on','Enable','on','UserData',i,'Callback', @UpArrCallback,'Style','pushbutton');
+     DownArrNames{i} = uicontrol('Parent',currPanel,'TooltipString','Move this parameter down','Units','pixels','Position',[DownArrPosition,UpArrDimension],'String','','Visible','on','Enable','on','UserData',i,'Callback', @DownArrCallback,'Style','pushbutton');
+       uicontrol('Parent',currPanel,'Units','pixels','Position',[Param2ChangePosition,Param2ChangeDimension],'String',paramLoop{i,3},'Visible','on','Enable','on','UserData',i,'Callback',@ParamNameChange,'Style','edit');
+     IterValNames{i} = uicontrol('Parent',currPanel,'TooltipString','The number of iterations associated to this parameter','Units','pixels','Position',[IterValPosition,IterValDimension],'String','-','Visible','on','Enable','on','UserData',i,'Callback',@SetIterations,'Tag',['iterButton',num2str(i)],'Style','pushbutton');
+     if ~isempty(paramLoop{i,4}), set(IterValNames{i},'String',num2str(paramLoop{i,4})); end
+
+     if i==1, set(UpArrNames{i},'Enable','off'); end
+     if i==paramnumb, set(DownArrNames{i},'Enable','off'); end
+
+     if paramLoop{i,2}==paramLoop{i,1}, set(RightArrNames{i},'Enable','off');
+     else set(RightArrNames{i},'Enable','on');
+     end
+
+     if paramLoop{i,2}==1, set(LeftArrNames{i},'Enable','off');
+     else set(LeftArrNames{i},'Enable','on');
+     end
+
+  end
+
+% Last button to add a parameter:
+  paramnumb = paramnumb+1;
+  uicontrol('Parent',currPanel,'Units','pixels','Position',[45 panelDimens(4)-40*(paramnumb+2) 20 20],'String','+','Visible','on','Enable',possible2add,'UserData',paramnumb,'Callback', @AddButtCallback,'Tag','lastaddbutton','Style','pushbutton');
+
+  if ~nestedStatus
+     set([findobj(currPanel,'Style','pushbutton');findobj(currPanel,'Style','edit')],'Enable','off');
+     set(findobj(currPanel,'Style','text'),'ForegroundColor',[.8 .8 .8]);
+     set(findobj(currPanel,'Tag','lastaddbutton'),'enable','on')
+  end
+
+ end
+
+
+%%
+
+% ======================================================================
+% ======================================================================
+% ============================= FUNCTIONS ==============================
+% ======================================================================
+% ======================================================================
+
+%%
+    %----------------------------------------------------------------------
+    function ContinuousCheck(varargin)
+  % This is the function to execute a continuous check on the status
+  % of the current selection, to verify that a valid LTPDA model is
+  % selected.
+  
+       % Clear if nothing's selected
+         if isempty(bdroot) || strcmp(get_param(bdroot,'BlockDiagramType'),'library') || isempty(find_system(bdroot,'FindAll','on','Type','Annotation','Tag','ltpda model'))
+            delete(findobj(gcf,'Parent',currPanel))
+            currSys = '';
+            paramLoop = [];
+            enabledNestedParams = [];
+            return
+         else
+            if ~strcmp(gcs,currSys)
+              % The selection changed: redraw the panel.
+                currSys = gcs;
+                enabledNestedParams = [];
+                buildNestedPanel();
+            end
+         end
+         
+    end
+    %----------------------------------------------------------------------
+
+    %----------------------------------------------------------------------
+    function enableNested(hObject, varargin)   
+    % Callback for the 'Enable nested loops' checkbox.
+    
+         currStatus = get(hObject,'Value');
+         currPanel = varargin{2};
+         nestBlock = varargin{3};
+         allElements = [findobj(currPanel,'Style','pushbutton');findobj(currPanel,'Style','edit');findobj(currPanel,'Style','checkbox')];
+         allTexts = findobj(currPanel,'Style','text');
+         
+         if isempty(nestBlock)
+            paramLoop = {1,1,[],[],[],{},[]};
+            nestBlock = add_block('ltpda_library/Commonly Used Blocks/Globals',[bdroot '/Nested loops']);
+            annotation = find_system(bdroot,'FindAll','on','Type','Annotation','Tag','ltpda model');
+            position = get_param(annotation,'Position');
+            set_param(nestBlock,'LinkStatus','inactive','Showname','off','MaskDisplay','disp(''Nested loops'')','Tag','nestedloops','DropShadow','on','Position',[position(1)+20  position(2)-42 position(1)+150  position(2)-27 ])
+            set_param(nestBlock,'UserData',paramLoop,'UserDataPersistent','on')
+         end
+                  
+         switch currStatus
+            case 1
+               set_param(nestBlock,'Description','1');
+               set_param(nestBlock,'UserData',paramLoop);
+               buildNestedPanel();
+            case 0
+               set_param(nestBlock,'Description','0');
+               set(allElements,'Enable','off');
+               set(hObject,'Enable','on')
+               set(findobj(currPanel,'Tag','lastaddbutton'),'enable','on')
+               set(allTexts,'ForegroundColor',[.8 .8 .8]);
+         end
+
+    end
+    %----------------------------------------------------------------------
+
+    %----------------------------------------------------------------------
+    function EnableNestedParam(hObject, varargin)   
+    % Callback for the 'Enable nested param' checkbox, for EVERY PARAM.
+    
+         currStatus = get(hObject,'Value');
+         currPanel = varargin{2};
+         nestBlock = varargin{3};
+         currParamIndex = get(hObject,'UserData');
+         
+         enabledNestedParams(currParamIndex) = currStatus;
+         set_param(nestBlock,'MaskDescription',['enabledNestedParams = ',mat2str(enabledNestedParams),';'])
+
+    end
+    %----------------------------------------------------------------------
+
+    %----------------------------------------------------------------------
+    function AddButtCallback(hObject, varargin)   
+    % Callback function: run when the user click on the Add button: another
+    % parameter is added BELOW the row where user has clicked.
+    
+         % Retrieve the index (row) of the clicked button:
+         currParamIndex = get(hObject,'UserData');
+         if currParamIndex==1 && isempty(paramLoop)
+            paramLoop = {1,1,[],[],[],{},[]};
+            nestBlock = add_block('ltpda_library/Commonly Used Blocks/Globals',[bdroot '/Nested loops']);
+            annotation = find_system(bdroot,'FindAll','on','Type','Annotation','Tag','ltpda model');
+            position = get_param(annotation,'Position');
+            set_param(nestBlock,'LinkStatus','inactive','Showname','off','MaskDisplay','disp(''Nested loops'')','Tag','nestedloops','DropShadow','on','Position',[position(1)+20  position(2)-42 position(1)+150  position(2)-27 ])
+            set_param(nestBlock,'Description','1','UserData',paramLoop,'UserDataPersistent','on')
+            enabledNestedParams = 1;
+            set_param(nestBlock,'MaskDescription','enabledNestedParams = 1;')
+            
+         else
+            if currParamIndex > size(paramLoop,1), currParamIndex = size(paramLoop,1); end
+            paramLoop = [paramLoop(1:currParamIndex,:);cell(1,7);paramLoop(currParamIndex+1:end,:)];
+            currParamIndex = currParamIndex+1;
+            paramLoop{currParamIndex,1} = currParamIndex;
+            paramLoop{currParamIndex,2} = paramLoop{currParamIndex-1,2};
+            nestBlock = find_system(bdroot,'SearchDepth',1,'BlockType','SubSystem','Tag','nestedloops');
+            set_param(nestBlock{1},'Description','1','UserData',paramLoop);
+            enabledNestedParams = [enabledNestedParams , 1];
+            set_param(nestBlock{1},'MaskDescription',['enabledNestedParams = ',mat2str(enabledNestedParams),';'])
+         end
+         
+         
+         buildNestedPanel()
+
+    end
+    %----------------------------------------------------------------------
+
+    %----------------------------------------------------------------------
+    function RemButtCallback(hObject, varargin)   
+    % Callback function: run when the user click on the Remove button
+    
+         % Retrieve the index of the clicked button:
+         currParamIndex = get(hObject,'UserData');
+         nestBlock = find_system(bdroot,'SearchDepth',1,'BlockType','SubSystem','Tag','nestedloops');
+         
+         if currParamIndex==1 && size(paramLoop,1)==1
+            clear paramLoop enabledNestedParams
+            delete_block(nestBlock{1})
+         else
+            xx = size(paramLoop,1);
+            ii = currParamIndex+1;
+            while ii <= xx && paramLoop{ii,2} > paramLoop{currParamIndex,2}
+               paramLoop{ii,2} = paramLoop{ii,2}-1;
+               ii = ii+1;
+            end
+            paramLoop = [paramLoop(1:currParamIndex-1,:);paramLoop(currParamIndex+1:end,:)];
+            set_param(nestBlock{1},'UserData',paramLoop);
+            enabledNestedParams(currParamIndex) = [];
+            set_param(nestBlock{1},'MaskDescription',['enabledNestedParams = ',mat2str(enabledNestedParams),';'])
+         end
+         
+         buildNestedPanel()
+
+    end
+    %----------------------------------------------------------------------
+
+    %----------------------------------------------------------------------
+    function LeftArrCallback(hObject, varargin)   
+    % Callback function: run when the user click on the Left Arrow button
+    
+         % Retrieve the number of the modified parameter:
+         currParamIndex = get(hObject,'UserData');
+         
+         xx = size(paramLoop,1);
+         ii = currParamIndex+1;
+         while ii <= xx && paramLoop{ii,2} > paramLoop{currParamIndex,2}
+            paramLoop{ii,2} = paramLoop{ii,2}-1;
+            ii = ii+1;
+         end
+         paramLoop{currParamIndex,2} = paramLoop{currParamIndex,2}-1;
+         
+         nestBlock = find_system(bdroot,'SearchDepth',1,'BlockType','SubSystem','Tag','nestedloops');
+         set_param(nestBlock{1},'UserData',paramLoop);
+         buildNestedPanel()
+
+    end
+    %----------------------------------------------------------------------
+
+    %----------------------------------------------------------------------
+    function RightArrCallback(hObject, varargin)   
+    % Callback function: run when the user click on the Right Arrow button
+    
+       % Retrieve the number of the modified parameter:
+         currParamIndex = get(hObject,'UserData');
+         
+       % Move to the right the parents parameters:
+         ii=currParamIndex;
+         if ii>1 && paramLoop{currParamIndex,2}<paramLoop{currParamIndex,1}
+             while paramLoop{ii-1,2}==paramLoop{ii,2}-1
+                 % ie, till when the previous parameters are parents:
+                 ii=ii-1;
+                 if ii==2, break; end
+             end
+             % ii is the first parent parameter
+             if paramLoop{currParamIndex,2}<=paramLoop{currParamIndex,1}
+                 for i=ii:currParamIndex,  paramLoop{i,2}=paramLoop{i,2}+1; end
+             end
+         end
+         
+         nestBlock = find_system(bdroot,'SearchDepth',1,'BlockType','SubSystem','Tag','nestedloops');
+         set_param(nestBlock{1},'UserData',paramLoop);
+         buildNestedPanel()
+
+    end
+    %----------------------------------------------------------------------
+
+    %----------------------------------------------------------------------
+    function UpArrCallback(hObject, varargin)
+    % Callback function: run when the user click on the Up Arrow button
+    
+         % Retrieve the number of the modified parameter:
+         currParamIndex = get(hObject,'UserData');
+         xx = size(paramLoop,1);
+
+         % Move to the left the parameters children:
+         ii=currParamIndex;
+         if ii<xx
+             while paramLoop{ii+1,2}==paramLoop{ii,2}+1
+                 % ie, till when the next parameters are children:
+                 ii=ii+1;
+                 if ii==xx, break; end
+             end
+         end
+         % ii is the last children parameter
+         for i=currParamIndex+1:ii, paramLoop{i,2}=paramLoop{i,2}-1; end
+         
+         % We move up the selected row:
+         paramLoop([currParamIndex-1,currParamIndex],:) = paramLoop([currParamIndex,currParamIndex-1],:);
+         paramLoop{currParamIndex-1,2} = paramLoop{currParamIndex,2};
+         enabledNestedParams([currParamIndex-1,currParamIndex]) = enabledNestedParams([currParamIndex,currParamIndex-1]);
+
+         for i=1:xx, paramLoop{i,1}=i; end
+         nestBlock = find_system(bdroot,'SearchDepth',1,'BlockType','SubSystem','Tag','nestedloops');
+         set_param(nestBlock{1},'UserData',paramLoop);
+         set_param(nestBlock{1},'MaskDescription',['enabledNestedParams = ',mat2str(enabledNestedParams),';'])
+         buildNestedPanel()
+
+    end
+    %----------------------------------------------------------------------
+
+    %----------------------------------------------------------------------
+    function DownArrCallback(hObject, varargin)   
+    % Callback function: run when the user click on the Down Arrow button
+    
+         % Retrieve the number of the modified parameter:
+         currParamIndex = get(hObject,'UserData');
+         xx = size(paramLoop,1);
+
+         % Move to the left the parameters children:
+         ii=currParamIndex;
+         if ii<xx
+             while paramLoop{ii+1,2}==paramLoop{ii,2}+1
+                 % ie, till when the next parameters are children:
+                 ii=ii+1;
+                 if ii==xx, break; end
+             end
+         end
+         for i=currParamIndex+1:ii, paramLoop{i,2}=paramLoop{i,2}-1; end
+
+         % We move down the selected row:
+         paramLoop([currParamIndex,currParamIndex+1],:) = paramLoop([currParamIndex+1,currParamIndex],:);
+         paramLoop{currParamIndex,2}=paramLoop{currParamIndex+1,2};
+         enabledNestedParams([currParamIndex,currParamIndex+1]) = enabledNestedParams([currParamIndex+1,currParamIndex]);
+
+         for i=1:xx, paramLoop{i,1}=i; end
+         nestBlock = find_system(bdroot,'SearchDepth',1,'BlockType','SubSystem','Tag','nestedloops');
+         set_param(nestBlock{1},'UserData',paramLoop);
+         set_param(nestBlock{1},'MaskDescription',['enabledNestedParams = ',mat2str(enabledNestedParams),';'])
+         buildNestedPanel()
+
+    end
+    %----------------------------------------------------------------------
+
+    %----------------------------------------------------------------------
+    function ParamNameChange(hObject, varargin)   
+    % Callback function: run when the user changes the name of the variable
+
+         % Retrieve the number of the modified parameter:
+         currParamIndex = get(hObject,'UserData');
+
+         newName = get(hObject,'String');
+         oldName = paramLoop{currParamIndex,3};
+         
+         if isempty(newName) || ismember(newName,paramLoop(:,3)), set(hObject,'String',oldName), return; end
+         if numel(newName)<6 || ~strcmp(newName(1:5),'loop.'), newName = ['loop.',strrep(newName,'.','')]; set(hObject,'String',newName); end
+         
+         paramLoop{currParamIndex,3} = newName;
+         nestBlock = find_system(bdroot,'SearchDepth',1,'BlockType','SubSystem','Tag','nestedloops');
+         set_param(nestBlock{1},'UserData',paramLoop);
+
+    end
+    %----------------------------------------------------------------------
+
+%%
+    %----------------------------------------------------------------------
+    function SetIterations(hObject,varargin)
+       
+         existingFig = findobj('Name','Set iterations');
+         if ~isempty(existingFig), close(existingFig); end
+    
+        % Retrieve the number of the modified parameter:
+         currParamIndex = get(hObject,'UserData');
+         if ~isempty(paramLoop{currParamIndex,5}) % then there are range settings
+            range = paramLoop{currParamIndex,5};
+            min   = num2str(range(1));  step  = num2str(range(2));  max   = num2str(range(3));
+            range = 1;
+         else % there are just direct values settings
+            min   = '';  step  = '';  max   = '';
+            range = 0;
+         end
+
+         screenSize = get(0,'ScreenSize');
+         backColor   = [1 1 1];
+         setIterSize = [570, 280];
+         position   = [(screenSize(3)-setIterSize(1))/2 , (screenSize(4)-setIterSize(2))/2 , setIterSize];
+         setIterFig = figure('Position',position,'Name','Set iterations','Tag','setiterations','Resize','off','NumberTitle','off','Toolbar','none','Menubar','none');
+       % Texts
+         uicontrol('Parent',setIterFig,'BackgroundColor',backColor,'HorizontalAlignment','center','Position',[30 position(4)-40 80 20],'String','Default:','FontName','Times New Roman','FontSize',guiFontSize+3,'FontWeight','bold','Visible','on','Style','text');
+         uicontrol('Parent',setIterFig,'BackgroundColor',backColor,'HorizontalAlignment','center','Position',[30 position(4)-80 80 20],'String','Iterations:','FontName','Times New Roman','FontSize',guiFontSize+3,'FontWeight','bold','Visible','on','Style','text');
+       % Radio buttons:
+         rangeORvalues = uibuttongroup('Parent',setIterFig,'BackgroundColor',backColor,'visible','on','SelectionChangeFcn',@enableRangeOrValues);
+         uicontrol('Parent',rangeORvalues,'BackgroundColor',backColor,'UserData',0,'HorizontalAlignment','center','Position',[150 position(4)-80 100 20],'String','Range:','FontName','Times New Roman','FontSize',guiFontSize+1,'Visible','on','Value',range,'Style','radiobutton');
+         uicontrol('Parent',rangeORvalues,'BackgroundColor',backColor,'UserData',1,'HorizontalAlignment','center','Position',[150 position(4)-110 100 20],'String','Values:','FontName','Times New Roman','FontSize',guiFontSize+1,'Visible','on','Value',~range,'Style','radiobutton');
+         
+       % Default:
+         defVal = paramLoop{currParamIndex,7};
+         if isempty(defVal), defVal = ''; end
+         uicontrol('Parent',setIterFig,'BackgroundColor',backColor,'Units','pixels','HorizontalAlignment','center','Position',[140 position(4)-40 100 20],'String',defVal,'TooltipString','This value will be used whenever this variable isn''t looping, or nested loops are disabled','Enable','on','Tag','defaultvalue','Style','edit');
+
+       % GUI elements for range settings:
+         inputExamples = {'Insert only';...
+                          'scalar';...
+                          'numbers:'};
+         uicontrol('Parent',setIterFig,'BackgroundColor',backColor,'Units','pixels','HorizontalAlignment','center','Position',[270 position(4)-250 80 170],'String',inputExamples,'Visible','on','Tag','range','Style','text');
+         uicontrol('Parent',setIterFig,'BackgroundColor',backColor,'Units','pixels','HorizontalAlignment','center','Position',[350 position(4)-85 50 20],'String','Min:','Visible','off','Enable','on','Tag','range','Style','text');
+         uicontrol('Parent',setIterFig,'BackgroundColor',backColor,'Units','pixels','HorizontalAlignment','center','Position',[400 position(4)-80 50 20],'String',min,'Visible','off','Enable','on','Tag','rangemin','Style','edit');
+         uicontrol('Parent',setIterFig,'BackgroundColor',backColor,'Units','pixels','HorizontalAlignment','center','Position',[350 position(4)-115 50 20],'String','Step:','Visible','off','Enable','on','Tag','range','Style','text');
+         uicontrol('Parent',setIterFig,'BackgroundColor',backColor,'Units','pixels','HorizontalAlignment','center','Position',[400 position(4)-110 50 20],'String',step,'Visible','off','Enable','on','Tag','rangestep','Style','edit');
+         uicontrol('Parent',setIterFig,'BackgroundColor',backColor,'Units','pixels','HorizontalAlignment','center','Position',[350 position(4)-145 50 20],'String','Max:','Visible','off','Enable','on','Tag','range','Style','text');
+         uicontrol('Parent',setIterFig,'BackgroundColor',backColor,'Units','pixels','HorizontalAlignment','center','Position',[400 position(4)-140 50 20],'String',max,'Visible','off','Enable','on','Tag','rangemax','Style','edit');
+       % Apply button:
+         uicontrol('Parent',setIterFig,'BackgroundColor',[.9 .9 .9],'Units','pixels','Position',[250 15 60 25],'String','Apply >','Visible','off','Enable','on','Callback',@calcIterRange,'UserData',0,'Tag','range','Style','pushbutton');
+         uicontrol('Parent',setIterFig,'BackgroundColor',backColor,'Units','pixels','HorizontalAlignment','left','Position',[325 17 200 20],'String','---','FontSize',guiFontSize+1,'Visible','off','Tag','rangeIter','Style','text');
+       
+       % GUI elements for direct values settings:
+         listInput = paramLoop{currParamIndex,6};
+         inputExamples = {'Examples:';...
+                          '       1';...
+                          '       2';...
+                          ' ';...
+                          '  or:';...
+                          '       ''one''';...
+                          '       ''two''';...
+                          ' ';...
+                          '  or:';...
+                          '       [1:5]';...
+                          '       [10:10:50]'};
+         uicontrol('Parent',setIterFig,'BackgroundColor',backColor,'Units','pixels','HorizontalAlignment','left','Position',[270 position(4)-230 140 170],'String',inputExamples,'Visible','on','Tag','values','Style','text');
+         uicontrol('Parent',setIterFig,'BackgroundColor',backColor,'Units','pixels','HorizontalAlignment','center','Position',[360 position(4)-210 150 150],'String',listInput,'Max',10,'FontSize',guiFontSize,'Visible','on','Enable','on','Callback',@valuesListCallback,'Tag','valuesList','UserData',currParamIndex,'Style','edit');
+       % Apply button:
+         uicontrol('Parent',setIterFig,'BackgroundColor',[.9 .9 .9],'Units','pixels','Position',[250 15 60 25],'String','Apply >','Visible','on','Enable','on','Callback',@calcIterRange,'UserData',1,'Tag','values','Style','pushbutton');
+         uicontrol('Parent',setIterFig,'BackgroundColor',backColor,'Units','pixels','HorizontalAlignment','left','Position',[325 17 200 20],'String','---','FontSize',guiFontSize+1,'Visible','on','Tag','valuesIter','Style','text');
+
+         if ~isempty(paramLoop{currParamIndex,6}) % then there are values
+            numbIter = numel(paramLoop{currParamIndex,6});
+            set(findobj(gcf,'tag','valuesIter'),'String',[num2str(numbIter),' iterations'])
+            set(findobj(gcf,'tag','rangeIter'),'String',[num2str(numbIter),' iterations'])
+         end
+         
+         if range, enableRangeOrValues(-1,0)
+         else enableRangeOrValues(-1,1)
+         end
+         
+    end
+    %----------------------------------------------------------------------
+
+    %----------------------------------------------------------------------
+    function enableRangeOrValues(hObject,varargin)
+       
+       if hObject==-1, rangeORvalue = varargin{1};
+       else rangeORvalue = get(get(hObject,'SelectedObject'),'userdata');
+       end
+       
+       if rangeORvalue % value
+          set(findobj(gcf,'-regexp','Tag','^range'),'visible','off')
+          set(findobj(gcf,'-regexp','Tag','^values'),'visible','on')
+       else            % range
+          set(findobj(gcf,'-regexp','Tag','^range'),'visible','on')
+          set(findobj(gcf,'-regexp','Tag','^values'),'visible','off')
+       end
+       
+    end  
+    %----------------------------------------------------------------------
+
+    %----------------------------------------------------------------------
+    function calcIterRange(hObject,varargin)
+       
+       rangeORvalue = get(hObject,'userdata');
+       defaultVal = findobj(gcf,'Tag','defaultvalue');
+       if isempty(get(defaultVal,'String'))
+          set(findobj(gcf,'tag','valuesIter'),'String','Please insert a default value')
+          return
+       end
+          
+       if rangeORvalue % value
+          try
+             listField      = findobj(gcf,'tag','valuesList');
+             valuesList     = get(listField,'String');
+             currParamIndex = get(listField,'UserData');
+             numbIter = size(valuesList,1);
+             paramLoop{currParamIndex,4} = numbIter;
+             paramLoop{currParamIndex,5} = [];
+             paramLoop{currParamIndex,6} = valuesList;
+             nestBlock = find_system(bdroot,'SearchDepth',1,'BlockType','SubSystem','Tag','nestedloops');
+             set_param(nestBlock{1},'UserData',paramLoop);
+             
+             set(findobj(gcf,'tag','rangemin'),'String','')
+             set(findobj(gcf,'tag','rangestep'),'String','')
+             set(findobj(gcf,'tag','rangemax'),'String','')
+             set(findobj(gcf,'tag','valuesIter'),'String',[num2str(numbIter),' iterations'])
+             set(findobj('Tag',['iterButton',num2str(currParamIndex)]),'String',num2str(numbIter))
+          catch
+             set(findobj(gcf,'tag','valuesIter'),'String','Error')
+          end
+       else            % range
+          try
+             minVal  = str2double(get(findobj(gcf,'tag','rangemin'),'String'));
+             stepVal = str2double(get(findobj(gcf,'tag','rangestep'),'String'));
+             maxVal  = str2double(get(findobj(gcf,'tag','rangemax'),'String'));
+             valuesList = num2cell([minVal:stepVal:maxVal]'); %#ok<NBRAK>
+             if  ~iscell(valuesList) && isnan(valuesList), error(''); end
+             listField      = findobj(gcf,'tag','valuesList');
+             currParamIndex = get(listField,'UserData');
+             numbIter = size(valuesList,1);
+             paramLoop{currParamIndex,4} = numbIter;
+             paramLoop{currParamIndex,5} = [minVal,stepVal,maxVal];
+             paramLoop{currParamIndex,6} = valuesList;
+             nestBlock = find_system(bdroot,'SearchDepth',1,'BlockType','SubSystem','Tag','nestedloops');
+             set_param(nestBlock{1},'UserData',paramLoop);
+
+             set(findobj(gcf,'tag','valuesList'),'String',valuesList)
+             set(findobj(gcf,'tag','rangeIter'),'String',[num2str(numbIter),' iterations'])
+             set(findobj('Tag',['iterButton',num2str(currParamIndex)]),'String',num2str(numbIter))
+          catch
+             set(findobj(gcf,'tag','rangeIter'),'String','Error')
+          end
+       end
+       paramLoop{currParamIndex,7} = get(defaultVal,'String');
+       
+       nestBlock = find_system(bdroot,'SearchDepth',1,'BlockType','SubSystem','Tag','nestedloops');
+       set_param(nestBlock{1},'UserData',paramLoop);
+    end  
+    %----------------------------------------------------------------------
+          
+    %----------------------------------------------------------------------
+    function valuesListCallback(hObject, varargin)   
+
+       valuesList = get(hObject,'String');
+       currParamIndex = get(hObject,'UserData');
+       paramLoop{currParamIndex,6} = valuesList;
+              
+    end  
+    %----------------------------------------------------------------------
+
+end