feat(creation): add random fill settings and strategy

This commit is contained in:
2026-08-31 11:38:28 +04:00
parent 482184d9c8
commit 7d646c7fa7
4 changed files with 413 additions and 6 deletions
@@ -14,6 +14,9 @@ import ru.project.ui.creation.file.FileFillStrategy;
import ru.project.ui.creation.manual.ManualDataSettingsWindow;
import ru.project.ui.creation.manual.ManualFillSettings;
import ru.project.ui.creation.manual.ManualFillStrategy;
import ru.project.ui.creation.random.RandomDataSettingsWindow;
import ru.project.ui.creation.random.RandomFillSettings;
import ru.project.ui.creation.random.RandomFillStrategy;
public class CreateCollectionMenu extends BaseModalWindow {
@@ -26,6 +29,7 @@ public class CreateCollectionMenu extends BaseModalWindow {
private final ManualDataSettingsWindow manualDataSettingsWindow;
private final FileDataSettingsWindow fileDataSettingsWindow;
private final RandomDataSettingsWindow randomDataSettingsWindow;
public CreateCollectionMenu(WindowBasedTextGUI gui, AppState state) {
@@ -37,6 +41,7 @@ public class CreateCollectionMenu extends BaseModalWindow {
this.manualDataSettingsWindow = new ManualDataSettingsWindow(gui, this::setManualFillStrategy);
this.fileDataSettingsWindow = new FileDataSettingsWindow(gui, this::setFileFillStrategy);
this.randomDataSettingsWindow = new RandomDataSettingsWindow(gui, this::setRandomFillStrategy);
Panel panel = new Panel();
panel.setLayoutManager(new LinearLayout());
@@ -65,9 +70,9 @@ public class CreateCollectionMenu extends BaseModalWindow {
fillStrategy = new FileFillStrategy(settings);
}
// private void setRandomFillStrategy(RandomFillSettings settings) {
// fillStrategy = new RandomFillStrategy(settings);
// }
private void setRandomFillStrategy(RandomFillSettings settings) {
fillStrategy = new RandomFillStrategy(settings);
}
private void setupCurrentFillMethod() {
switch (selectedFillMethod) {
@@ -75,9 +80,7 @@ public class CreateCollectionMenu extends BaseModalWindow {
case FILE -> fileDataSettingsWindow.showModal();
case RANDOM ->
MessageWindow.showModal(
gui, "Для случайных данных дополнительные настройки не требуются.");
case RANDOM -> randomDataSettingsWindow.showModal();
}
}
@@ -0,0 +1,313 @@
package ru.project.ui.creation.random;
import com.googlecode.lanterna.gui2.Button;
import com.googlecode.lanterna.gui2.Label;
import com.googlecode.lanterna.gui2.LinearLayout;
import com.googlecode.lanterna.gui2.Panel;
import com.googlecode.lanterna.gui2.WindowBasedTextGUI;
import java.util.function.Consumer;
import ru.project.ui.base.BaseModalWindow;
import ru.project.ui.common.InputValueWindow;
import ru.project.ui.common.MessageWindow;
public class RandomDataSettingsWindow extends BaseModalWindow {
private final RandomFillSettings settings;
private final Consumer<RandomFillSettings> onApply;
private final Label minGroupNumberLabel;
private final Label maxGroupNumberLabel;
private final Label minAverageGradeLabel;
private final Label maxAverageGradeLabel;
private final Label minRecordBookNumberLabel;
private final Label maxRecordBookNumberLabel;
public RandomDataSettingsWindow(WindowBasedTextGUI gui, Consumer<RandomFillSettings> onApply) {
super("Настройка случайного заполнения", gui);
this.settings = new RandomFillSettings();
this.onApply = onApply;
Panel panel = new Panel();
panel.setLayoutManager(new LinearLayout());
minGroupNumberLabel =
new Label("Минимальный номер группы: " + getValueOrDefault(settings.getMinGroupNumber()));
maxGroupNumberLabel =
new Label("Максимальный номер группы: " + getValueOrDefault(settings.getMaxGroupNumber()));
minAverageGradeLabel =
new Label("Минимальный средний балл: " + getValueOrDefault(settings.getMinAverageGrade()));
maxAverageGradeLabel =
new Label("Максимальный средний балл: " + getValueOrDefault(settings.getMaxAverageGrade()));
minRecordBookNumberLabel =
new Label(
"Минимальный номер зачётной книжки: "
+ getValueOrDefault(settings.getMinRecordBookNumber()));
maxRecordBookNumberLabel =
new Label(
"Максимальный номер зачётной книжки: "
+ getValueOrDefault(settings.getMaxRecordBookNumber()));
panel.addComponent(minGroupNumberLabel);
panel.addComponent(maxGroupNumberLabel);
panel.addComponent(minAverageGradeLabel);
panel.addComponent(maxAverageGradeLabel);
panel.addComponent(minRecordBookNumberLabel);
panel.addComponent(maxRecordBookNumberLabel);
panel.addComponent(new Button("Задать минимальный номер группы", this::setMinGroupNumber));
panel.addComponent(new Button("Задать максимальный номер группы", this::setMaxGroupNumber));
panel.addComponent(new Button("Задать минимальный средний балл", this::setMinAverageGrade));
panel.addComponent(new Button("Задать максимальный средний балл", this::setMaxAverageGrade));
panel.addComponent(
new Button("Задать минимальный номер зачётной книжки", this::setMinRecordBookNumber));
panel.addComponent(
new Button("Задать максимальный номер зачётной книжки", this::setMaxRecordBookNumber));
panel.addComponent(new Button("Применить", this::apply));
panel.addComponent(new Button("Назад", this::close));
setComponent(panel);
}
private void setMinGroupNumber() {
showGroupNumberInput(
"Минимальный номер группы",
settings.getMinGroupNumber(),
value -> {
if (!value.matches("[A-Z]\\d{2}")) {
MessageWindow.showModal(gui, "Номер группы должен соответствовать формату A12.");
return false;
}
if (settings.getMaxGroupNumber() != null
&& value.compareTo(settings.getMaxGroupNumber()) > 0) {
MessageWindow.showModal(
gui, "Минимальный номер группы не может быть больше максимального.");
return false;
}
settings.setMinGroupNumber(value);
minGroupNumberLabel.setText("Минимальный номер группы: " + value);
return true;
});
}
private void setMaxGroupNumber() {
showGroupNumberInput(
"Максимальный номер группы",
settings.getMaxGroupNumber(),
value -> {
if (!value.matches("[A-Z]\\d{2}")) {
MessageWindow.showModal(gui, "Номер группы должен соответствовать формату A12.");
return false;
}
if (settings.getMinGroupNumber() != null
&& value.compareTo(settings.getMinGroupNumber()) < 0) {
MessageWindow.showModal(
gui, "Максимальный номер группы не может быть меньше минимального.");
return false;
}
settings.setMaxGroupNumber(value);
maxGroupNumberLabel.setText("Максимальный номер группы: " + value);
return true;
});
}
private void showGroupNumberInput(
String title, String initialValue, java.util.function.Predicate<String> onSave) {
InputValueWindow window =
new InputValueWindow(
gui, title, "Введите номер группы (например, A12):", initialValue, onSave);
window.showModal();
}
private void setMinAverageGrade() {
showAverageGradeInput(
"Минимальный средний балл",
settings.getMinAverageGrade(),
value -> {
if (settings.getMaxAverageGrade() != null && value > settings.getMaxAverageGrade()) {
MessageWindow.showModal(
gui, "Минимальный средний балл не может быть больше максимального.");
return false;
}
settings.setMinAverageGrade(value);
minAverageGradeLabel.setText("Минимальный средний балл: " + value);
return true;
});
}
private void setMaxAverageGrade() {
showAverageGradeInput(
"Максимальный средний балл",
settings.getMaxAverageGrade(),
value -> {
if (settings.getMinAverageGrade() != null && value < settings.getMinAverageGrade()) {
MessageWindow.showModal(
gui, "Максимальный средний балл не может быть меньше минимального.");
return false;
}
settings.setMaxAverageGrade(value);
maxAverageGradeLabel.setText("Максимальный средний балл: " + value);
return true;
});
}
private void showAverageGradeInput(
String title, Double initialValue, java.util.function.Predicate<Double> onSave) {
InputValueWindow window =
new InputValueWindow(
gui,
title,
"Введите значение от " + "0.0 до 5.0:",
initialValue == null ? null : String.valueOf(initialValue),
value -> {
try {
double parsedValue = Double.parseDouble(value);
if (parsedValue < ru.project.student.Student.getMinAverageGrade()
|| parsedValue > ru.project.student.Student.getMaxAverageGrade()) {
MessageWindow.showModal(gui, "Средний балл должен быть от 0.0 до 5.0.");
return false;
}
return onSave.test(parsedValue);
} catch (NumberFormatException e) {
MessageWindow.showModal(gui, "Введите корректное число.");
return false;
}
});
window.showModal();
}
private void setMinRecordBookNumber() {
showRecordBookNumberInput(
"Минимальный номер зачётной книжки",
settings.getMinRecordBookNumber(),
value -> {
if (settings.getMaxRecordBookNumber() != null
&& value > settings.getMaxRecordBookNumber()) {
MessageWindow.showModal(
gui, "Минимальный номер зачётной книжки не может быть больше максимального.");
return false;
}
settings.setMinRecordBookNumber(value);
minRecordBookNumberLabel.setText("Минимальный номер зачётной книжки: " + value);
return true;
});
}
private void setMaxRecordBookNumber() {
showRecordBookNumberInput(
"Максимальный номер зачётной книжки",
settings.getMaxRecordBookNumber(),
value -> {
if (settings.getMinRecordBookNumber() != null
&& value < settings.getMinRecordBookNumber()) {
MessageWindow.showModal(
gui, "Максимальный номер зачётной книжки не может быть меньше минимального.");
return false;
}
settings.setMaxRecordBookNumber(value);
maxRecordBookNumberLabel.setText("Максимальный номер зачётной книжки: " + value);
return true;
});
}
private void showRecordBookNumberInput(
String title, Integer initialValue, java.util.function.Predicate<Integer> onSave) {
InputValueWindow window =
new InputValueWindow(
gui,
title,
"Введите номер зачётной книжки:",
initialValue == null ? null : String.valueOf(initialValue),
value -> {
try {
int parsedValue = Integer.parseInt(value);
if (parsedValue < ru.project.student.Student.getMinRecordBookNumber()) {
MessageWindow.showModal(gui, "Номер зачётной книжки должен быть положительным.");
return false;
}
return onSave.test(parsedValue);
} catch (NumberFormatException e) {
MessageWindow.showModal(gui, "Введите целое число.");
return false;
}
});
window.showModal();
}
private void apply() {
onApply.accept(settings);
MessageWindow.showModal(gui, "Настройки создания коллекции случайно успешно применены.");
}
private String getValueOrDefault(Object value) {
return value == null ? "не задан" : String.valueOf(value);
}
}
@@ -0,0 +1,72 @@
package ru.project.ui.creation.random;
public class RandomFillSettings {
private String minGroupNumber;
private String maxGroupNumber;
private Double minAverageGrade;
private Double maxAverageGrade;
private Integer minRecordBookNumber;
private Integer maxRecordBookNumber;
public RandomFillSettings() {
this.minGroupNumber = null;
this.maxGroupNumber = null;
this.minAverageGrade = null;
this.maxAverageGrade = null;
this.minRecordBookNumber = null;
this.maxRecordBookNumber = null;
}
public String getMinGroupNumber() {
return minGroupNumber;
}
public void setMinGroupNumber(String minGroupNumber) {
this.minGroupNumber = minGroupNumber;
}
public String getMaxGroupNumber() {
return maxGroupNumber;
}
public void setMaxGroupNumber(String maxGroupNumber) {
this.maxGroupNumber = maxGroupNumber;
}
public Double getMinAverageGrade() {
return minAverageGrade;
}
public void setMinAverageGrade(Double minAverageGrade) {
this.minAverageGrade = minAverageGrade;
}
public Double getMaxAverageGrade() {
return maxAverageGrade;
}
public void setMaxAverageGrade(Double maxAverageGrade) {
this.maxAverageGrade = maxAverageGrade;
}
public Integer getMinRecordBookNumber() {
return minRecordBookNumber;
}
public void setMinRecordBookNumber(Integer minRecordBookNumber) {
this.minRecordBookNumber = minRecordBookNumber;
}
public Integer getMaxRecordBookNumber() {
return maxRecordBookNumber;
}
public void setMaxRecordBookNumber(Integer maxRecordBookNumber) {
this.maxRecordBookNumber = maxRecordBookNumber;
}
}
@@ -0,0 +1,19 @@
package ru.project.ui.creation.random;
import ru.project.collection.MyList;
import ru.project.student.Student;
import ru.project.ui.creation.FillStrategy;
public class RandomFillStrategy implements FillStrategy {
// private final RandomFillSettings settings;
public RandomFillStrategy(RandomFillSettings settings) {
// this.settings = settings;
}
@Override
public MyList<Student> create() {
return null;
}
}