Skip to content

Commit

Permalink
ready
Browse files Browse the repository at this point in the history
  • Loading branch information
alex committed Mar 8, 2022
1 parent fa13a58 commit 5e72d29
Show file tree
Hide file tree
Showing 7 changed files with 489 additions and 19 deletions.
11 changes: 9 additions & 2 deletions src/main/java/app/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import controls.InputFactory;
import dialogs.PanelInfo;
import dialogs.PanelSelectFile;
import io.github.humbleui.jwm.*;
import io.github.humbleui.jwm.skija.EventFrameSkija;
import io.github.humbleui.skija.Canvas;
Expand Down Expand Up @@ -90,6 +91,10 @@ public enum Mode {
* Текущий режим(по умолчанию рабочий)
*/
public static Mode currentMode = Mode.WORK;
/**
* Панель выбора файла
*/
private final PanelSelectFile panelSelectFile;

/**
* Конструктор окна приложения
Expand All @@ -101,6 +106,8 @@ public Application() {
// панель информации
panelInfo = new PanelInfo(window, true, DIALOG_BACKGROUND_COLOR, PANEL_PADDING);

// Панель выбора файла
panelSelectFile = new PanelSelectFile(window, true, DIALOG_BACKGROUND_COLOR, PANEL_PADDING);

// создаём панель рисования
panelRendering = new PanelRendering(
Expand Down Expand Up @@ -236,7 +243,7 @@ else if (e instanceof EventWindowClose) {

switch (currentMode) {
case INFO -> panelInfo.accept(e);
case FILE -> {}
case FILE -> panelSelectFile.accept(e);
case WORK -> {
// передаём события на обработку панелям
panelControl.accept(e);
Expand Down Expand Up @@ -267,7 +274,7 @@ public void paint(Canvas canvas, CoordinateSystem2i windowCS) {
// рисуем диалоги
switch (currentMode) {
case INFO -> panelInfo.paint(canvas, windowCS);
case FILE -> {}
case FILE -> panelSelectFile.paint(canvas, windowCS);
}
}
}
8 changes: 8 additions & 0 deletions src/main/java/app/Colors.java
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,14 @@ public class Colors {
* Цвет заливки панели
*/
public static final int DIALOG_BACKGROUND_COLOR = Misc.getColor(230, 70, 38, 83);
/**
* Цвет заливки панели
*/
public static final int SCROLLER_BACKGROUND_COLOR = Misc.getColor(150, 83, 38, 70);
/**
* Цвет заливки панели
*/
public static final int SCROLLER_COLOR = Misc.getColor(255, 83, 38, 70);


/**
Expand Down
256 changes: 256 additions & 0 deletions src/main/java/dialogs/PanelSelectFile.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,256 @@
package dialogs;

import app.Application;
import app.Button;
import controls.Input;
import controls.Label;
import controls.MultiLineLabel;
import io.github.humbleui.jwm.*;
import io.github.humbleui.skija.Canvas;
import misc.CoordinateSystem2i;
import misc.Vector2i;
import panels.Panel;
import panels.PanelList;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.function.Consumer;

import static app.Colors.*;

/**
* Панель управления
*/
public class PanelSelectFile extends Panel {
/**
* Отступы в панели управления
*/
private static final int CONTROL_PADDING = 5;
/**
* Строка для обозначения родительской папки
*/
private static final String PARENT_FOLDER_STR = "..";
/**
* Кнопка принять
*/
private final Button accept;
/**
* Кнопка отмена
*/
private final Button cancel;
/**
* заголовок
*/
private final MultiLineLabel infoLabel;
/**
* заголовок пути
*/
private final Input pathInput;
/**
* текст заголовка делаем статическим, чтобы можно было менять его
* из любого места, каждый экземпляр панели информации будет обращаться
* к этому полю при рисовании, но логика работы программы
* не предполагает создания нескольких экземпляров, так что всё ок
*/
private static String labelText;
/**
* Путь к файлу
*/
static String folderPath = "src/main/resources";
/**
* Панель списка
*/
private final PanelList listPanel;
/**
* путь к тексту
*/
private static String pathText = "";
/**
* Обработчик выбранного файла
*/
private static Consumer<String> processFile;
/**
* Заголовок поля ввода пути файла
*/
private static Label pathLabel;

/**
* Панель управления
*
* @param window окно
* @param drawBG флаг, нужно ли рисовать подложку
* @param color цвет подложки
* @param padding отступы
*/
public PanelSelectFile(Window window, boolean drawBG, int color, int padding) {
super(window, drawBG, color, padding);

// добавление вручную
infoLabel = new MultiLineLabel(window, false, backgroundColor, CONTROL_PADDING,
6, 5, 2, 0, 2, 1, "",
true, true);


listPanel = new PanelList(window, false, APP_BACKGROUND_COLOR, CONTROL_PADDING,
6, 5, 2, 1, 2, 2, PanelSelectFile::getFileList,
s -> {
processSelectedFile(s);
window.requestFrame();
}, 10);


pathInput = new Input(window, false, backgroundColor, CONTROL_PADDING,
6, 5, 2, 4, 2, 1, "",
true, MULTILINE_TEXT_COLOR);
pathLabel = new Label(window, false, backgroundColor, CONTROL_PADDING,
6, 5, 1, 4, 1, 1, "Путь к файлу:",
true, true);

accept = new Button(
window, false, BUTTON_COLOR, CONTROL_PADDING,
6, 5, 2, 3, 1, 1, "ОК",
true, true);

accept.setOnClick(PanelSelectFile::accept);

cancel = new Button(
window, false, BUTTON_COLOR, CONTROL_PADDING,
6, 5, 3, 3, 1, 1, "Отмена",
true, true);

cancel.setOnClick(() -> Application.currentMode = Application.Mode.WORK);

}

/**
* Выбрать текущий файл
*/
private static void accept() {
// переводим режим обратно в основной
Application.currentMode = Application.Mode.WORK;
// обрабатываем полученный файл
processFile.accept(pathText);
}

/**
* Вывести информацию
*
* @param caption текст заголовка
* @param processFileConsumer обработчик выбранного файла
*/
public static void show(String caption, Consumer<String> processFileConsumer) {
// задаём новый текст
labelText = caption;
// переключаем вывод приложения на режим информации
Application.currentMode = Application.Mode.FILE;
// сохраняем обработчик выбранного файла
processFile = processFileConsumer;

}

/**
* ОБработчик выбранного файла
*
* @param fileName название файла
*/
public static void processSelectedFile(String fileName) {
if (fileName.equals(PARENT_FOLDER_STR)) {
int lastIndex = folderPath.lastIndexOf("/");
if (lastIndex > 0)
folderPath = folderPath.substring(0, lastIndex);
} else if (new File(folderPath + "/" + fileName).isDirectory())
folderPath += "/" + fileName;
else
pathText = folderPath + "/" + fileName;

}

/**
* Получить список файлов
*
* @return список текстовых представлений файлов
*/
public static List<String> getFileList() {
ArrayList<String> lst = new ArrayList<>();
lst.add(PARENT_FOLDER_STR);
for (File file : Objects.requireNonNull(new File(folderPath).listFiles())) {
if (file.isDirectory() || file.getName().matches("[a-zA-Z-_0-9]*.json"))
lst.add(file.getName());
}

return lst;
}


/**
* Обработчик событий
*
* @param e событие
*/
@Override
public void accept(Event e) {
// вызываем обработчик предка
super.accept(e);
// событие движения мыши
if (e instanceof EventMouseMove ee) {
accept.checkOver(lastWindowCS.getRelativePos(new Vector2i(ee)));
cancel.checkOver(lastWindowCS.getRelativePos(new Vector2i(ee)));
listPanel.accept(e);
pathInput.accept(e);
// событие нажатия мыши
} else if (e instanceof EventMouseButton) {
if (!lastInside)
return;


Vector2i relPos = lastWindowCS.getRelativePos(lastMove);

accept.click(relPos);
cancel.click(relPos);
listPanel.accept(e);
pathInput.accept(e);
// перерисовываем окно
window.requestFrame();
// обработчик ввода текста
} else if (e instanceof EventMouseScroll) {
listPanel.accept(e);
} else if (e instanceof EventKey ee) {
if (ee.isPressed()) {
// получаем код клавиши
Key key = ee.getKey();
// перебираем варианты
switch (key) {
// если esc
case ESCAPE -> Application.currentMode = Application.Mode.WORK;
// если enter
case ENTER -> accept();
}
}
pathInput.accept(e);
pathText = pathInput.getText();
} else if (e instanceof EventTextInput) {
pathInput.accept(e);
pathText = pathInput.getText();
}
}

/**
* Метод под рисование в конкретной реализации
*
* @param canvas область рисования
* @param windowCS СК окна
*/
@Override
public void paintImpl(Canvas canvas, CoordinateSystem2i windowCS) {
infoLabel.text = labelText;
pathInput.setText(pathText);
accept.paint(canvas, windowCS);
cancel.paint(canvas, windowCS);
infoLabel.paint(canvas, windowCS);
pathLabel.paint(canvas, windowCS);
pathInput.paint(canvas, windowCS);
listPanel.paint(canvas, windowCS);
}
}
Loading

0 comments on commit 5e72d29

Please sign in to comment.