package ge.edu.freeuni.sdp.snake.view.terminal;
import ge.edu.freeuni.sdp.snake.presenter.LevelPresenter;
import ge.edu.freeuni.sdp.snake.presenter.LevelSelectionListener;
import ge.edu.freeuni.sdp.snake.view.LevelView;
import ge.edu.freeuni.sdp.snake.view.LevelViewUpdater;
import com.googlecode.lanterna.input.Key;
import com.googlecode.lanterna.terminal.Terminal;
public class TerminalLevelView implements LevelView {
private Terminal _terminal;
private LevelPresenter _presenter;
private int _lvlCount;
private int _oldIndex;
private int _selectedIndex;
private static final String DESCR = "Description: ";
private static final String HINT = "Press ENTER to start.";
public TerminalLevelView(LevelPresenter presenter, Terminal terminal) {
_presenter = presenter;
_terminal = terminal;
LevelSelectionListener listener = new LevelViewUpdater(this);
_presenter.setLevelSelectionListener(listener);
_oldIndex = -1;
_selectedIndex = -1;
}
@Override
public void show() {
_terminal.clearScreen();
String[] names = _presenter.getLevelNames();
_lvlCount = names.length;
for (int i = 0; i < names.length; i++) {
_terminal.moveCursor(6, 6 + i);
writeLine(String.format("[%1$s] - %2$s", i+1, names[i]));
}
_terminal.flush();
boolean isAccepted = false;
boolean isSelected = false;
while (!isAccepted) {
Key p = _terminal.readInput();
if (p == null) continue;
if (p.getKind() == Key.Kind.Enter && isSelected) {
isAccepted = true;
break;
}
char ch = p.getCharacter();
if (!Character.isDigit(ch)) continue;
int index = Character.getNumericValue(ch) - 1;
updateIndexTracker(index);
isSelected = _presenter.setSelection(index);
}
}
private void updateIndexTracker(int index) {
if (_oldIndex == -1) {
_oldIndex = index;
_selectedIndex = index;
} else {
_oldIndex = _selectedIndex;
_selectedIndex = index;
}
}
@Override
public void showDescription(String description) {
_terminal.moveCursor(5, 6 + _oldIndex);
_terminal.putCharacter(' ');
_terminal.moveCursor(5, 6 + _selectedIndex);
_terminal.putCharacter('*');
_terminal.moveCursor(6, 6 + _lvlCount + 1);
clearLine();
_terminal.moveCursor(6, 6 + _lvlCount + 1);
writeLine(DESCR);
writeLine(description);
_terminal.moveCursor(6, 6 + _lvlCount + 3);
writeLine(HINT);
_terminal.flush();
}
private void writeLine(String print) {
char[] printToChar = print.toCharArray();
for (int i = 0; i < print.length(); i++) {
_terminal.putCharacter(printToChar[i]);
}
}
private void clearLine() {
for (int i = 0; i < _terminal.getTerminalSize().getColumns(); ++i)
_terminal.putCharacter(' ');
}
}