Skip to content

Commit

Permalink
Panel control start
Browse files Browse the repository at this point in the history
  • Loading branch information
alex committed Mar 7, 2022
1 parent a8cbab7 commit 6ec8a2d
Show file tree
Hide file tree
Showing 5 changed files with 258 additions and 12 deletions.
22 changes: 21 additions & 1 deletion src/main/java/app/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
import panels.PanelRendering;

import java.io.File;
import java.util.Calendar;
import java.util.Date;
import java.util.function.Consumer;

import static app.Colors.*;
Expand Down Expand Up @@ -47,7 +49,10 @@ public class Application implements Consumer<Event> {
* панель событий
*/
private final PanelLog panelLog;

/**
* время последнего нажатия клавиши мыши
*/
Date prevEventMouseButtonTime;

/**
* Конструктор окна приложения
Expand Down Expand Up @@ -124,6 +129,21 @@ public Application() {
*/
@Override
public void accept(Event e) {
// если событие кнопка мыши
if (e instanceof EventMouseButton) {
// получаем текущие дату и время
Date now = Calendar.getInstance().getTime();
// если уже было нажатие
if (prevEventMouseButtonTime != null) {
// если между ними прошло больше 200 мс
long delta = now.getTime() - prevEventMouseButtonTime.getTime();
if (delta < 200)
return;
}
// сохраняем время последнего события
prevEventMouseButtonTime = now;
}

// если событие - это закрытие окна
if (e instanceof EventWindowClose) {
// завершаем работу приложения
Expand Down
43 changes: 43 additions & 0 deletions src/main/java/app/Task.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package app;

import io.github.humbleui.jwm.MouseButton;
import io.github.humbleui.skija.Canvas;
import io.github.humbleui.skija.Paint;
import io.github.humbleui.skija.Rect;
import misc.CoordinateSystem2d;
import misc.CoordinateSystem2i;
import misc.Vector2d;
import misc.Vector2i;
import panels.PanelLog;

import java.util.ArrayList;

Expand Down Expand Up @@ -34,6 +37,10 @@ public class Task {
* Размер точки
*/
private static final int POINT_SIZE = 3;
/**
* Последняя СК окна
*/
private CoordinateSystem2i lastWindowCS;

/**
* Задача
Expand All @@ -53,6 +60,9 @@ public Task(CoordinateSystem2d ownCS, ArrayList<Point> points) {
* @param windowCS СК окна
*/
public void paint(Canvas canvas, CoordinateSystem2i windowCS) {
// Сохраняем последнюю СК
lastWindowCS = windowCS;

canvas.save();
// создаём перо
try (var paint = new Paint()) {
Expand All @@ -69,4 +79,37 @@ public void paint(Canvas canvas, CoordinateSystem2i windowCS) {
canvas.restore();
}

/**
* Добавить точку
*
* @param pos положение
* @param pointSet множество
*/
public void addPoint(Vector2d pos, Point.PointSet pointSet) {
Point newPoint = new Point(pos, pointSet);
points.add(newPoint);
PanelLog.info("точка " + newPoint + " добавлена в " + newPoint.getSetName());
}


/**
* Клик мыши по пространству задачи
*
* @param pos положение мыши
* @param mouseButton кнопка мыши
*/
public void click(Vector2i pos, MouseButton mouseButton) {
if (lastWindowCS == null) return;
// получаем положение на экране
Vector2d taskPos = ownCS.getCoords(pos, lastWindowCS);
// если левая кнопка мыши, добавляем в первое множество
if (mouseButton.equals(MouseButton.PRIMARY)) {
addPoint(taskPos, Point.PointSet.FIRST_SET);
// если правая, то во второе
} else if (mouseButton.equals(MouseButton.SECONDARY)) {
addPoint(taskPos, Point.PointSet.SECOND_SET);
}
}


}
41 changes: 41 additions & 0 deletions src/main/java/misc/Misc.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package misc;

import java.util.ArrayList;
import java.util.List;

/**
* Вспомогательная библиотека
*/
Expand All @@ -18,6 +21,44 @@ public static int getColor(int a, int r, int g, int b) {
return ((a * 256 + r) * 256 + g) * 256 + b;
}

/**
* Сформировать набор строк не превышающих заданную длину
*
* @param line исходная длинная строка
* @param maxLength максимальная длина строки
* @return список строк
*/
public static List<String> limit(String line, int maxLength) {
// создаём список
List<String> lst = new ArrayList<>();
// если вся строка умещается в огланичение
if (line.length() < maxLength) {
// добавляем её к списку
lst.add(line);
// возвращаем его
return lst;
}
// теперь будем извлекать из строки максимально длинную последовательность слов,
// начиная с первого, такую, чтобы длина полученной строки умещалась
// в заданный диапазон
int spacePos;
do {
// ищем последний индекс пробела в подстроке заданной длины
spacePos = line.substring(0, maxLength).lastIndexOf(' ');
// если индекс пробела найден
if (spacePos > 0) {
// добавляем в список подстроку до этого пробела
lst.add(line.substring(0, spacePos));
// а саму строку обрезаем начиная со следующего после пробела символа
line = line.substring(spacePos + 1);
}
// повторяем пока есть пробел в
} while (spacePos > 0 && line.length() > maxLength);
// добавляем оставшуюся строку к списку
lst.add(line);
// возвращаем его
return lst;
}

/**
* Запрещаем вызов конструктора
Expand Down
150 changes: 140 additions & 10 deletions src/main/java/panels/PanelLog.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,75 @@
import io.github.humbleui.jwm.Event;
import io.github.humbleui.jwm.Window;
import io.github.humbleui.skija.Canvas;
import io.github.humbleui.skija.FontMetrics;
import io.github.humbleui.skija.Paint;
import misc.CoordinateSystem2i;
import misc.Misc;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import static app.Application.PANEL_PADDING;
import static app.Colors.PANEL_BACKGROUND_COLOR;
import static app.Fonts.FONT12;

/**
* Панель управления
*/
public class PanelLog extends GridPanel {
/**
* Заголовок
* Кол-во строчек лога
*/
private static final int LOG_LINES_CNT = 15;
/**
* Максимальная длина строки лога
*/
private static final int MAX_LOG_LINE_LENGTH = 80;
/**
* Список записей лога
*/
private final Label label;
private static final List<Record> logs = new ArrayList<>();

/**
* Тип записи
*/
enum RecordType {
/**
* Информация
*/
INFO,
/**
* Предупреждение
*/
WARNING,
/**
* Ошибка
*/
ERROR,
/**
* Успех
*/
SUCCESS
}

/**
* Запись
*/
record Record(RecordType recordType, String text, Date date) {
/**
* Строковое представление объекта
*
* @return строковое представление объекта
*/
@Override
public String toString() {
return new SimpleDateFormat(" HH:mm:ss").format(date) + ": " + text;
}
}


/**
* Панель управления
Expand All @@ -38,21 +94,74 @@ public PanelLog(
) {
super(window, drawBG, color, padding, gridWidth, gridHeight, gridX, gridY, colspan, rowspan);

}

/**
* Получить цвет строки лога
*
* @param recordType тип записи
* @return цвет строки лога
*/
public static int getColor(RecordType recordType) {
return switch (recordType) {
case INFO -> Misc.getColor(144, 255, 255, 255);
case WARNING -> Misc.getColor(144, 255, 255, 0);
case ERROR -> Misc.getColor(144, 255, 0, 0);
case SUCCESS -> Misc.getColor(144, 0, 255, 0);
};
}


// создаём первый заголовок
label = new Label(window, false, PANEL_BACKGROUND_COLOR, PANEL_PADDING,
1, 1, 0, 0, 1, 1, "Панель лога", true, true);
/**
* Добавить в лога
*
* @param recordType тип записи
* @param text текст записи
*/
public static void addToLog(RecordType recordType, String text) {
for (String line : text.split("\n")) {
for (String limitedLine : Misc.limit(line, MAX_LOG_LINE_LENGTH)) {
while (logs.size() > LOG_LINES_CNT)
logs.remove(0);
logs.add(new Record(recordType, limitedLine, Calendar.getInstance().getTime()));
}
}
}

/**
* Добавить info запись
*
* @param text текст записи
*/
public static void success(String text) {
addToLog(RecordType.SUCCESS, text);
}

/**
* Обработчик событий
* Добавить info запись
*
* @param e событие
* @param text текст записи
*/
@Override
public void accept(Event e) {
public static void info(String text) {
addToLog(RecordType.INFO, text);
}

/**
* Добавить warning запись
*
* @param text текст записи
*/
public static void warning(String text) {
addToLog(RecordType.WARNING, text);
}

/**
* Добавить error запись
*
* @param text текст записи
*/
public static void error(String text) {
addToLog(RecordType.ERROR, text);
}

/**
Expand All @@ -63,6 +172,27 @@ public void accept(Event e) {
*/
@Override
public void paintImpl(Canvas canvas, CoordinateSystem2i windowCS) {
label.paint(canvas, windowCS);
// создаём перо
try (Paint paint = new Paint()) {
// получаем метрики шрифта
FontMetrics metrics = FONT12.getMetrics();
// сохраняем область рисования
canvas.save();
// смещаем область рисования
canvas.translate(padding, windowCS.getSize().y - padding - metrics.getDescent());
// перебираем записи лога
for (int i = logs.size() - 1; i >= 0; --i) {
// получаем запись лога
Record log = logs.get(i);
// задаём цвет лога
paint.setColor(getColor(log.recordType));
// выводим строку на экран
canvas.drawString(log.toString(), 0, 0, FONT12, paint);
// смещаем область к следующей линии
canvas.translate(0, -metrics.getCapHeight() - 8);
}
// восстанавливаем область рисования
canvas.restore();
}
}
}
14 changes: 13 additions & 1 deletion src/main/java/panels/PanelRendering.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import app.Point;
import app.Task;
import io.github.humbleui.jwm.Event;
import io.github.humbleui.jwm.EventMouseButton;
import io.github.humbleui.jwm.EventMouseScroll;
import io.github.humbleui.jwm.Window;
import io.github.humbleui.skija.Canvas;
import misc.CoordinateSystem2d;
Expand Down Expand Up @@ -62,12 +64,22 @@ public PanelRendering(

/**
* Обработчик событий
* при перегрузке обязателен вызов реализации предка
*
* @param e событие
*/
@Override
public void accept(Event e) {

super.accept(e);
if (e instanceof EventMouseButton ee) {
// если последнее положение мыши сохранено и курсор был внутри
if (lastMove != null && lastInside) {
// обрабатываем клик по задаче
task.click(lastWindowCS.getRelativePos(lastMove), ee.getButton());
// перерисовываем окно
window.requestFrame();
}
}
}

/**
Expand Down

0 comments on commit 6ec8a2d

Please sign in to comment.