toMessages method

List<Msg> toMessages()

Expands this action into one or more low-level replay messages.

Implementation

List<Msg> toMessages() {
  final times = math.max(1, repeat);
  final output = <Msg>[];
  switch (type) {
    case 'text':
      for (var r = 0; r < times; r++) {
        for (final rune in value.runes) {
          output.add(KeyMsg(Key(KeyType.runes, runes: [rune])));
        }
      }
      return output;
    case 'special':
      final parsed = _parseKeyType(key);
      for (var i = 0; i < times; i++) {
        output.add(KeyMsg(Key(parsed)));
      }
      return output;
    case 'wheel':
      final button = _parseWheelButton(direction);
      for (var i = 0; i < times; i++) {
        output.add(
          ReplayMouseMsg(
            action: MouseAction.wheel,
            button: button,
            x: x,
            y: y,
          ),
        );
      }
      return output;
    case 'tap':
      for (var i = 0; i < times; i++) {
        output.add(
          ReplayMouseMsg(
            action: MouseAction.press,
            button: MouseButton.left,
            x: x,
            y: y,
          ),
        );
        output.add(
          ReplayMouseMsg(
            action: MouseAction.release,
            button: MouseButton.left,
            x: x,
            y: y,
          ),
        );
      }
      return output;
    case 'move':
      for (var i = 0; i < times; i++) {
        output.add(
          ReplayMouseMsg(
            action: MouseAction.motion,
            button: MouseButton.none,
            x: x,
            y: y,
          ),
        );
      }
      return output;
    case 'drag':
      final dragSteps = math.max(1, steps);
      for (var r = 0; r < times; r++) {
        output.add(
          ReplayMouseMsg(
            action: MouseAction.press,
            button: MouseButton.left,
            x: x,
            y: y,
          ),
        );
        for (var i = 1; i <= dragSteps; i++) {
          final t = i / dragSteps;
          output.add(
            ReplayMouseMsg(
              action: MouseAction.motion,
              button: MouseButton.left,
              x: x + ((x2 - x) * t).round(),
              y: y + ((y2 - y) * t).round(),
            ),
          );
        }
        output.add(
          ReplayMouseMsg(
            action: MouseAction.release,
            button: MouseButton.left,
            x: x2,
            y: y2,
          ),
        );
      }
      return output;
    case 'event':
      final event = customEvent;
      if (event == null) return const <Msg>[];
      for (var i = 0; i < times; i++) {
        output.add(ReplayEventMsg(event));
      }
      return output;
    default:
      return const <Msg>[];
  }
}