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