104104
105105 % Check input
106106 if nargin < 1
107- % Allow selection of TANK if not assigned directly
108- tankObj = nigeLab .Tank();
107+ obj = nigeLab .libs.DashBoard([0 ,0 ]); % Empty DashBoard
108+ close(gcf ); % If a figure is opened
109+ return ; % Should always be called from tankObj anyways
110+ elseif isnumeric(tankObj )
111+ dims = tankObj ;
112+ obj = repmat(obj ,dims );
113+ return ;
109114 end
110115
111116 % Add current path and initialize properties
112117 addpath(pwd ); % (In case path is changed while GUI is open)
113118 obj.Tank = tankObj ;
114- obj .initRefProps ();
119+ obj.Color = nigeLab .libs.DashBoard.initColors ();
115120
116121 % Build figure and all container panels
117122 obj.nigelGUI = obj .buildGUI();
@@ -221,41 +226,103 @@ function delete(obj)
221226 % % % GET.PROPERTY METHODS % % % % % % % % % % % %
222227 % [DEPENDENT] Return .Fields property
223228 function value = get .Fields(obj )
229+ if isempty(obj .Tank)
230+ value = {};
231+ return ;
232+ end
224233 value = obj .Tank.Fields;
225234 end
226235
227236 % [DEPENDENT] Return .FieldType property
228237 function value = get .FieldType(obj )
238+ if isempty(obj .Tank)
239+ value = {};
240+ return ;
241+ end
229242 value = obj .Tank.FieldType;
230243 end
231244
232245 % [DEPENDENT] Return .ParametersPanel property
233246 function value = get .ParametersPanel(obj )
247+ value = [];
248+ if isempty(obj .Children)
249+ return ;
250+ elseif numel(obj .Children) < 4
251+ return ;
252+ elseif ~iscell(obj .Children)
253+ return ;
254+ elseif ~isvalid(obj.Children{4 })
255+ return ;
256+ end
234257 value = obj.Children{4 };
235258 end
236259
237260 % [DEPENDENT] Return .QueuePanel property
238261 function value = get .QueuePanel(obj )
262+ value = [];
263+ if isempty(obj .Children)
264+ return ;
265+ elseif numel(obj .Children) < 3
266+ return ;
267+ elseif ~iscell(obj .Children)
268+ return ;
269+ elseif ~isvalid(obj.Children{3 })
270+ return ;
271+ end
239272 value = obj.Children{3 };
240273 end
241274
242275 % [DEPENDENT] Return .StatsPanel property
243276 function value = get .StatsPanel(obj )
277+ value = [];
278+ if isempty(obj .Children)
279+ return ;
280+ elseif numel(obj .Children) < 2
281+ return ;
282+ elseif ~iscell(obj .Children)
283+ return ;
284+ elseif ~isvalid(obj.Children{2 })
285+ return ;
286+ end
244287 value = obj.Children{2 };
245288 end
246289
247290 % [DEPENDENT] Return .TreePanel property
248291 function value = get .TreePanel(obj )
292+ value = [];
293+ if isempty(obj .Children)
294+ return ;
295+ elseif numel(obj .Children) < 1
296+ return ;
297+ elseif ~iscell(obj .Children)
298+ return ;
299+ elseif ~isvalid(obj.Children{1 })
300+ return ;
301+ end
249302 value = obj.Children{1 };
250303 end
251304
252305 % [DEPENDENT] Return .QueuePanel property
253306 function value = get .TitleBar(obj )
307+ value = [];
308+ if isempty(obj .Children)
309+ return ;
310+ elseif numel(obj .Children) < 5
311+ return ;
312+ elseif ~iscell(obj .Children)
313+ return ;
314+ elseif ~isvalid(obj.Children{5 })
315+ return ;
316+ end
254317 value = obj.Children{5 };
255318 end
256319
257320 % [DEPENDENT] Return .Visible property
258321 function value = get .Visible(obj )
322+ if isempty(obj .nigelGUI)
323+ value = ' invalid' ;
324+ return ;
325+ end
259326 if isvalid(obj .nigelGUI)
260327 value = obj .nigelGUI.Visible;
261328 else
@@ -329,8 +396,10 @@ function Show(obj)
329396
330397 % [DEPENDENT] Set .Visible property
331398 function set .Visible(obj ,value )
332- if isvalid(obj .nigelGUI)
333- obj.nigelGUI.Visible = value ;
399+ if ~isempty(obj .nigelGUI)
400+ if isvalid(obj .nigelGUI)
401+ obj.nigelGUI.Visible = value ;
402+ end
334403 end
335404 end
336405 % % % % % % % % % % END SET.PROPERTY METHODS % % %
@@ -655,7 +724,7 @@ function buildButtons(obj,nigelPanelObj)
655724 end
656725
657726 % Returns figure handle, with layout mediated by core nigelPanels
658- function fig = buildGUI(obj , fig )
727+ function fig = buildGUI(obj )
659728 % LOADPANELS Method to create all custom uipanels (nigelPanels)
660729 % that populate most of the GUI interface.
661730 %
@@ -669,17 +738,16 @@ function buildButtons(obj,nigelPanelObj)
669738 % obj.Children{3} <--> 'QueuePanel'
670739 % obj.Children{4} <--> 'ParametersPanel'
671740
672- % Check input
673- if nargin < 2
674- fig = figure(' Name' ,' nigelDash Interface' ,...
675- ' Units' ,' Normalized' ,...
676- ' Position' ,[0.1 0.1 0.8 0.8 ],...
677- ' Color' ,obj .Color.fig,...
678- ' ToolBar' ,' none' ,...
679- ' MenuBar' ,' none' ,...
680- ' NumberTitle' ,' off' ,...
681- ' DeleteFcn' ,@(~,~)obj .delete);
682- end
741+
742+ fig = figure(' Name' ,' nigelDash Interface' ,...
743+ ' Units' ,' Normalized' ,...
744+ ' Position' ,[0.1 0.1 0.8 0.8 ],...
745+ ' Color' ,obj .Color.fig,...
746+ ' ToolBar' ,' none' ,...
747+ ' MenuBar' ,' none' ,...
748+ ' NumberTitle' ,' off' ,...
749+ ' DeleteFcn' ,@(~,~)obj .delete);
750+
683751
684752 % Create "Tree" panel (nodes are: Tank > Animal > Block)
685753 str = {' TreePanel' };
@@ -920,21 +988,6 @@ function deleteListeners(obj)
920988 obj .Listener(: ) = [];
921989 end
922990
923- % Initialize reference property values
924- function initRefProps(obj )
925- % INITREFPROPS Initialize property values for referencing later
926- %
927- % obj.initRefProps(tankObj); Takes references from parameters of
928- % tankObj, which should be
929- % identical for all Blocks and
930- % Animals that are under
931- % consideration by DashBoard.
932-
933- obj.Color = nigeLab .libs.DashBoard.initColors();
934- obj.Fields = obj .Tank.Pars.Block.Fields;
935- obj.FieldType = obj .Tank.Pars.Block.FieldType;
936- end
937-
938991 % Initialize UI context menu for tree click interactions
939992 function treeContextMenu = initUICMenu(obj )
940993 % INITUICMENU Initialize UI Context menu. Adds all 'do' methods
0 commit comments