feat(collection): add collection creation flow
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
package ru.project.presenter;
|
||||
|
||||
import com.googlecode.lanterna.gui2.WindowBasedTextGUI;
|
||||
import ru.project.model.AppState;
|
||||
import ru.project.model.FillMethod;
|
||||
import ru.project.view.CreateCollectionView;
|
||||
import ru.project.view.FillMethodView;
|
||||
|
||||
public class CreateCollectionPresenter extends BasePresenter {
|
||||
|
||||
private final CreateCollectionView view;
|
||||
|
||||
private int size;
|
||||
private FillMethod fillMethod;
|
||||
|
||||
public CreateCollectionPresenter(
|
||||
AppState state, CreateCollectionView view, WindowBasedTextGUI gui) {
|
||||
|
||||
super(state, gui);
|
||||
|
||||
this.view = view;
|
||||
this.size = 0;
|
||||
this.fillMethod = FillMethod.CUSTOM;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start() {
|
||||
bindActions();
|
||||
view.show(gui);
|
||||
}
|
||||
|
||||
private void bindActions() {
|
||||
view.setSetSizeAction(this::setSize);
|
||||
view.setConfigureFillMethodAction(this::configureFillMethod);
|
||||
view.setCreateCollectionAction(this::createCollection);
|
||||
}
|
||||
|
||||
private void setSize() {
|
||||
view.showSetSizeDialog(gui, this::handleSizeEntered);
|
||||
}
|
||||
|
||||
private void handleSizeEntered(int sizeValue) {
|
||||
if (sizeValue <= 0) {
|
||||
view.showMessage(gui, "Размер должен быть больше 0.");
|
||||
return;
|
||||
}
|
||||
|
||||
size = sizeValue;
|
||||
view.updateSize(size);
|
||||
}
|
||||
|
||||
private void configureFillMethod() {
|
||||
FillMethodView fillMethodView = new FillMethodView();
|
||||
|
||||
FillMethodPresenter presenter =
|
||||
new FillMethodPresenter(state, fillMethodView, gui, this::handleFillMethodSelected);
|
||||
|
||||
presenter.start();
|
||||
}
|
||||
|
||||
private void handleFillMethodSelected(FillMethod selectedMethod) {
|
||||
fillMethod = selectedMethod;
|
||||
|
||||
view.updateFillMethod(fillMethod);
|
||||
}
|
||||
|
||||
private void createCollection() {
|
||||
if (size <= 0) {
|
||||
view.showMessage(gui, "Сначала задайте размер коллекции.");
|
||||
return;
|
||||
}
|
||||
|
||||
switch (fillMethod) {
|
||||
case CUSTOM:
|
||||
view.showMessage(gui, "Выбран способ заполнения: пользовательские данные.");
|
||||
break;
|
||||
|
||||
case RANDOM:
|
||||
view.showMessage(gui, "Выбран способ заполнения: случайные данные.");
|
||||
break;
|
||||
|
||||
case FILE:
|
||||
view.showMessage(gui, "Выбран способ заполнения: данные из файла.");
|
||||
break;
|
||||
}
|
||||
|
||||
// TODO:
|
||||
// state.setCollection(...);
|
||||
// view.close();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
package ru.project.view;
|
||||
|
||||
import com.googlecode.lanterna.gui2.Label;
|
||||
import com.googlecode.lanterna.gui2.TextBox;
|
||||
import com.googlecode.lanterna.gui2.WindowBasedTextGUI;
|
||||
import java.util.function.IntConsumer;
|
||||
import ru.project.model.FillMethod;
|
||||
|
||||
public class CreateCollectionView extends PanelView {
|
||||
|
||||
private final Label sizeLabel;
|
||||
private final Label fillMethodLabel;
|
||||
|
||||
private Runnable setSizeAction = this::defaultAction;
|
||||
private Runnable configureFillMethodAction = this::defaultAction;
|
||||
private Runnable createCollectionAction = this::defaultAction;
|
||||
|
||||
public CreateCollectionView() {
|
||||
super("Создание новой коллекции");
|
||||
|
||||
sizeLabel = addLabel("Размер: не задан");
|
||||
|
||||
fillMethodLabel = addLabel("Способ заполнения: Пользовательские данные");
|
||||
|
||||
addButton("Задать размер", () -> setSizeAction.run());
|
||||
|
||||
addButton("Настроить способ заполнения", () -> configureFillMethodAction.run());
|
||||
|
||||
addButton("Создать новую коллекцию", () -> createCollectionAction.run());
|
||||
|
||||
addButton("Выйти", this::close);
|
||||
}
|
||||
|
||||
public void setSetSizeAction(Runnable action) {
|
||||
setSizeAction = action;
|
||||
}
|
||||
|
||||
public void setConfigureFillMethodAction(Runnable action) {
|
||||
configureFillMethodAction = action;
|
||||
}
|
||||
|
||||
public void setCreateCollectionAction(Runnable action) {
|
||||
createCollectionAction = action;
|
||||
}
|
||||
|
||||
public void updateSize(int size) {
|
||||
sizeLabel.setText("Размер: " + size);
|
||||
}
|
||||
|
||||
public void updateFillMethod(FillMethod fillMethod) {
|
||||
fillMethodLabel.setText("Способ заполнения: " + getFillMethodName(fillMethod));
|
||||
}
|
||||
|
||||
public void showMessage(WindowBasedTextGUI gui, String message) {
|
||||
PanelView messageView = new PanelView("Информация");
|
||||
|
||||
messageView.addLabel(message);
|
||||
|
||||
messageView.addButton("OK", messageView::close);
|
||||
|
||||
messageView.show(gui);
|
||||
}
|
||||
|
||||
public void showSetSizeDialog(WindowBasedTextGUI gui, IntConsumer onSizeEntered) {
|
||||
PanelView dialog = new PanelView("Задать размер");
|
||||
|
||||
dialog.addLabel("Введите размер:");
|
||||
|
||||
TextBox textBox = dialog.addTextBox();
|
||||
|
||||
dialog.addButton("Подтвердить", () -> handleSizeInput(gui, dialog, textBox, onSizeEntered));
|
||||
|
||||
dialog.addButton("Вернуться", dialog::close);
|
||||
|
||||
dialog.show(gui);
|
||||
}
|
||||
|
||||
private void handleSizeInput(
|
||||
WindowBasedTextGUI gui, PanelView dialog, TextBox textBox, IntConsumer onSizeEntered) {
|
||||
try {
|
||||
int size = Integer.parseInt(textBox.getText().trim());
|
||||
|
||||
dialog.close();
|
||||
onSizeEntered.accept(size);
|
||||
|
||||
} catch (NumberFormatException e) {
|
||||
showMessage(gui, "Введите целое число.");
|
||||
}
|
||||
}
|
||||
|
||||
private String getFillMethodName(FillMethod fillMethod) {
|
||||
return switch (fillMethod) {
|
||||
case CUSTOM -> "Пользовательские данные";
|
||||
case RANDOM -> "Случайные данные";
|
||||
case FILE -> "Данные из файла";
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user