3535 return ;
3636 end
3737
38- root = fileparts(mfilename(' fullpath' ));
39- apps = discoverApps(root );
40-
4138 if mode == " list"
39+ root = fileparts(mfilename(' fullpath' ));
40+ apps = discoverApps(root );
4241 varargout = {appCatalogTable(apps )};
4342 return ;
4443 end
4746 ' labkit_launcher returns at most the launcher figure handle.' );
4847 end
4948
49+ root = fileparts(mfilename(' fullpath' ));
5050 initializeLauncherPath(root );
51- fig = runLauncher(root , apps );
51+ fig = runLauncher(root );
5252 if nargout == 1
5353 varargout = {fig };
5454 end
8686 info = struct( ...
8787 " name" , " labkit_launcher" , ...
8888 " displayName" , " LabKit App Launcher" , ...
89- " version" , " 1.2.2 " , ...
89+ " version" , " 1.2.3 " , ...
9090 " updated" , " 2026-07-02" );
9191end
9292
@@ -109,7 +109,7 @@ function addPathIfMissing(folder, varargin)
109109
110110%% Section: Main launcher window
111111
112- function fig = runLauncher(root , apps )
112+ function fig = runLauncher(root )
113113 panelFontSize = 15 ;
114114 tableFontSize = 15 ;
115115
@@ -123,6 +123,7 @@ function addPathIfMissing(folder, varargin)
123123 fig = uifigure(figArgs{: });
124124 fig.Name = char(launcherVersionTitle());
125125 applyLauncherGuiTestMode(fig );
126+ paintVisibleLauncherFigure();
126127 main = uigridlayout(fig , [1 3 ]);
127128 main.ColumnWidth = {360 , 5 , ' 1x' };
128129 main.RowHeight = {' 1x' };
@@ -199,7 +200,7 @@ function addPathIfMissing(folder, varargin)
199200 btnProfile.Layout.Column = 2 ;
200201 if isprop(btnProfile , ' Tooltip' )
201202 btnProfile.Tooltip = [' Profile the next app launched from this launcher ' ...
202- ' until that app window closes.' ];
203+ ' until that app window closes. Saves the report without opening a browser. ' ];
203204 end
204205 txtInfo = uitextarea(controlsGrid , ' Editable' , ' off' , ' Value' , {' Ready.' });
205206
@@ -220,8 +221,17 @@ function addPathIfMissing(folder, varargin)
220221 ui.controls.appTable = struct(' table' , appTable );
221222 setappdata(fig , ' labkitUiRegistry' , ui );
222223
223- state = struct(' apps' , apps , ' visibleApps' , apps , ' selectedRow' , 1 , ...
224- ' status' , integrityStatus(root , apps ), ' profileNextLaunch' , false );
224+ state = struct(' apps' , emptyAppStruct(), ' visibleApps' , emptyAppStruct(), ...
225+ ' selectedRow' , 1 , ' status' , " Loading app list..." , ...
226+ ' profileNextLaunch' , false );
227+ appTable.Data = cell(0 , 5 );
228+ setLaunchEnabled(false );
229+ updateInfo(" Loading app list..." );
230+ drawnow limitrate ;
231+
232+ state.apps = discoverApps(root );
233+ state.visibleApps = state .apps;
234+ state.status = integrityStatus(root , state .apps);
225235 refreshTable();
226236
227237 function onRefreshApps(varargin )
@@ -1110,7 +1120,7 @@ function validateCleanArtifactsTarget(root, target, relativeTarget)
11101120 targetFile = fullfile(root , char(app .relativePath));
11111121 target = @() launchProfileTarget(app , debugMode );
11121122 [htmlFile , artifacts ] = profileLabKitTarget(target , htmlFile , ...
1113- ' OpenReport' , launcherGuiTestMode() ~= " hidden " , ...
1123+ ' OpenReport' , false , ...
11141124 ' WaitForGuiClose' , true , ...
11151125 ' CloseFiguresAfterRun' , false , ...
11161126 ' ProjectRoot' , root , ...
@@ -1482,6 +1492,13 @@ function applyLauncherGuiTestMode(fig)
14821492 end
14831493end
14841494
1495+ function paintVisibleLauncherFigure()
1496+ if launcherGuiTestMode() ~= " visible"
1497+ return ;
1498+ end
1499+ drawnow limitrate ;
1500+ end
1501+
14851502function tf = confirmUpdate(root , sourceLabel )
14861503 message = sprintf([' Download %s zip and replace the LabKit runtime in:\n\n%s\n\n ' ...
14871504 ' The LabKit folder should contain only LabKit runtime files. Before ' ...
0 commit comments