From ea868cc6874a0573cc824854a0cc207b0869bc52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=BE=D0=BB=D0=BE=D0=B4=D0=B8=D0=BD=20=D0=93=D0=B5?= =?UTF-8?q?=D1=80=D0=BC=D0=B0=D0=BD?= Date: Thu, 27 Aug 2026 00:12:39 +0400 Subject: [PATCH] feat(collection): add collection creation flow --- .../presenter/CreateCollectionPresenter.java | 91 +++++++++++++++++ .../ru/project/view/CreateCollectionView.java | 98 +++++++++++++++++++ 2 files changed, 189 insertions(+) create mode 100644 app/src/main/java/ru/project/presenter/CreateCollectionPresenter.java create mode 100644 app/src/main/java/ru/project/view/CreateCollectionView.java diff --git a/app/src/main/java/ru/project/presenter/CreateCollectionPresenter.java b/app/src/main/java/ru/project/presenter/CreateCollectionPresenter.java new file mode 100644 index 0000000..326466a --- /dev/null +++ b/app/src/main/java/ru/project/presenter/CreateCollectionPresenter.java @@ -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(); + } +} diff --git a/app/src/main/java/ru/project/view/CreateCollectionView.java b/app/src/main/java/ru/project/view/CreateCollectionView.java new file mode 100644 index 0000000..55825a1 --- /dev/null +++ b/app/src/main/java/ru/project/view/CreateCollectionView.java @@ -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 -> "Данные из файла"; + }; + } +}