showBitRangeDialog function

Future<(int, int)?> showBitRangeDialog(
  1. BuildContext context, {
  2. required String signalName,
  3. required int width,
})

Show a dialog to select a bit range for a signal.

Returns (high, low) or null if cancelled.

Implementation

Future<(int, int)?> showBitRangeDialog(
  BuildContext context, {
  required String signalName,
  required int width,
}) async {
  final maxBit = width - 1;
  final controller = TextEditingController(text: '$maxBit:0');
  controller.selection = TextSelection(
    baseOffset: 0,
    extentOffset: controller.text.length,
  );

  final result = await showDialog<String>(
    context: context,
    barrierColor: Colors.black26,
    builder: (ctx) => AlertDialog(
      title: Text(
        '$signalName  [$width bits]',
        style: const TextStyle(fontSize: 14, fontWeight: FontWeight.bold),
      ),
      content: TextField(
        controller: controller,
        autofocus: true,
        decoration: InputDecoration(
          labelText: 'Bit range (high:low) or single bit',
          hintText: '$maxBit:0',
          isDense: true,
        ),
        onSubmitted: (value) => Navigator.of(ctx).pop(value),
      ),
      actions: [
        TextButton(
          onPressed: () => Navigator.of(ctx).pop(),
          child: const Text('Cancel'),
        ),
        TextButton(
          onPressed: () => Navigator.of(ctx).pop(controller.text),
          child: const Text('OK'),
        ),
      ],
    ),
  );

  if (result == null || result.trim().isEmpty) {
    return null;
  }
  return BitFieldUtils.parseBitRange(result.trim(), maxBit);
}