CLIOptionScreen.java

package com.github.quizclash.plugin.cli.screen;

import com.github.quizclash.application.TerminationException;
import com.github.quizclash.application.action.Action;
import com.github.quizclash.application.screen.OptionScreen;
import com.github.quizclash.domain.Displayable;
import com.github.quizclash.plugin.cli.CLIWindowManager;

import java.util.List;
import java.util.ListIterator;

public class CLIOptionScreen extends OptionScreen {
  private final CLIWindowManager cliWindow;
  private int userOption;

  public CLIOptionScreen(String screenName,
                         List<? extends Displayable> displayableList,
                         CLIWindowManager cliWindow) {
    super(screenName, displayableList);
    this.cliWindow = cliWindow;
  }

  @Override
  public void render() {
    cliWindow.clearAllCanvas();
    cliWindow.printAnimated(this.getScreenName(), 20);
    cliWindow.moveOnCanvas(0, 2);
    List<? extends Displayable> optionList = this.getScreenOptions();
    userOption = selectFromOptions(optionList);
  }

  @Override
  public Action<Integer> getOptionInput() {
    return new Action<>(userOption);
  }

  private int selectFromOptions(List<? extends Displayable> optionList) {
    ListIterator<? extends Displayable> gameModeListIterator = optionList.listIterator();
    while (gameModeListIterator.hasNext()) {
      cliWindow.println(gameModeListIterator.nextIndex() + 1 + ") " + gameModeListIterator
          .next()
          .getDisplayName());
    }
    cliWindow.moveToActionField();
    int selected = 0;
    while (selected == 0) {
      selected = cliWindow.getRangeSelect(1, optionList.size());
      if (selected == 0) {
        cliWindow.clearActionField();
        System.out.print("\u001b[1D");
        System.out.print("\u001b[1A");
        cliWindow.print("Please only enter numeric values!");
        try {
          Thread.sleep(2000);
        } catch (InterruptedException e) {
          throw new TerminationException("QuizClash was interrupted");
        }
        cliWindow.clearActionField();
        System.out.print("\u001b[1D");
        System.out.print("\u001b[1A");
      }
    }
    return selected;
  }
}