feat(studio): real install progress in the store dialog and the wizard

Both surfaces showed an indeterminate spinner for the whole install,
because the hub only offered a unary call. They now follow
HubAdmin/InstallModuleStream:

- The store's install dialog shows the phase in plain language, the
  overall percentage, megabytes while the size is known, and a seconds
  counter. The counter is the second, independent signal: it keeps
  running even if the hub goes quiet, which is what tells 'slow' apart
  from 'stuck'.
- The setup wizard shows the same bar per module instead of a spinner
  inside the button.
- New strings in both locales for the phases, the byte line and the
  elapsed counter.

progress_bar_visual_test writes the four waiting states to
build/progress/ in either theme, so the result can be judged without
launching the desktop app. Writing it turned up a real trap worth
recording: awaiting toImage() directly in a widget test leaves the
binding waiting forever - the file passed in six seconds, then sat
there until the ten-minute timeout failed the whole suite.
tester.runAsync() is the fix. Full suite: 186 passed.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
flemming-it 2026-09-08 14:00:24 +02:00
parent 2bc556e0f5
commit 1549334767
9 changed files with 490 additions and 74 deletions

View file

@ -1982,6 +1982,42 @@ abstract class AppLocalizations {
/// **'Fetching, verifying, unpacking…'**
String get storeInstallProgressBody;
/// No description provided for @installPhaseResolve.
///
/// In en, this message translates to:
/// **'Looking up the module'**
String get installPhaseResolve;
/// No description provided for @installPhaseDownload.
///
/// In en, this message translates to:
/// **'Downloading'**
String get installPhaseDownload;
/// No description provided for @installPhaseInstall.
///
/// In en, this message translates to:
/// **'Verifying and unpacking'**
String get installPhaseInstall;
/// No description provided for @installPhaseDone.
///
/// In en, this message translates to:
/// **'Done'**
String get installPhaseDone;
/// No description provided for @installBytes.
///
/// In en, this message translates to:
/// **'{done} of {total} MB'**
String installBytes(String done, String total);
/// No description provided for @installElapsed.
///
/// In en, this message translates to:
/// **'{seconds} s elapsed'**
String installElapsed(int seconds);
/// No description provided for @storeLoadDocs.
///
/// In en, this message translates to: