blob: 57cb465c1c74e986a190b5c7065792888e09fb16 [file]
// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:io' as io;
import 'package:cli_util/cli_components.dart';
import 'package:cli_util/windows_compatibility.dart';
Future<void> main() async {
final stdin = io.Platform.isWindows ? Win32AnsiStdin() : io.stdin;
// These streams are single subscription, but need to be listenable from
// multiple places, so we convert them to broadcast streams.
//
// In a real app, you would probably have your own stdin listener, which
// should ignore events while the dialogs are open.
final inputStream = stdin.asBroadcastStream(
// Cancel stdin subscription once we have no listeners.
onCancel: (subscription) => subscription.cancel(),
);
// Hacky way to keep open the stream until we reach the finally block.
final subscription = inputStream.listen((_) {});
try {
print('How many items do you want in the multiselect dialog?');
final counts = List.generate(9, (i) => '${(i + 1) * 5}');
final countResult = await showSingleSelectDialog(counts, inputStream);
if (countResult == null) {
print('No count selected, exiting.');
io.exitCode = 1;
return;
}
final count = int.parse(counts[countResult]);
print('Got result $count');
final allOptions = List.generate(count, (i) => 'Item #$i');
print('Select multiple items:');
final selectedOptions = await showMultiSelectDialog(
allOptions,
inputStream,
initialSelected: {1, 2},
);
if (selectedOptions == null) {
print('Selection cancelled, exiting.');
io.exitCode = 1;
return;
}
print('Selection complete, selected ${selectedOptions.length} item(s):');
for (final index in selectedOptions) {
print(' - ${allOptions[index]}');
}
} finally {
await subscription.cancel();
}
}