feat(collection): add collection creation flow

This commit is contained in:
2026-08-27 00:12:39 +04:00
parent 51e7859520
commit ea868cc687
2 changed files with 189 additions and 0 deletions
@@ -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 -> "Данные из файла";
};
}
}