diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index a48efb6..36bcb63 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -4,15 +4,24 @@
-
+
+
-
+
+
+
+
+
@@ -60,7 +69,7 @@
1681325355114
-
+
1681326097454
@@ -76,7 +85,14 @@
1681326123893
-
+
+ 1681330563711
+
+
+
+ 1681330563711
+
+
@@ -95,6 +111,7 @@
-
+
+
\ No newline at end of file
diff --git a/src/main/java/app/Colors.java b/src/main/java/app/Colors.java
index c457b54..7ca1ea7 100644
--- a/src/main/java/app/Colors.java
+++ b/src/main/java/app/Colors.java
@@ -20,6 +20,11 @@ public class Colors {
*/
public static final int PANEL_BACKGROUND_COLOR = Misc.getColor(32, 0, 0, 0);
+ /**
+ * Цвет текста
+ */
+ public static final int MULTILINE_TEXT_COLOR = Misc.getColor(64, 255, 255, 255);
+
/**
* Запрещённый конструктор
diff --git a/src/main/java/controls/MultiLineLabel.java b/src/main/java/controls/MultiLineLabel.java
new file mode 100644
index 0000000..a11c0a0
--- /dev/null
+++ b/src/main/java/controls/MultiLineLabel.java
@@ -0,0 +1,129 @@
+package controls;
+
+import io.github.humbleui.jwm.Window;
+import io.github.humbleui.skija.Canvas;
+import io.github.humbleui.skija.Paint;
+import io.github.humbleui.skija.TextLine;
+import misc.CoordinateSystem2i;
+import panels.GridPanel;
+
+import static app.Colors.MULTILINE_TEXT_COLOR;
+import static app.Fonts.FONT12;
+
+/**
+ * Многострочный заголовок
+ */
+public class MultiLineLabel extends GridPanel {
+ /**
+ * Текст
+ */
+ public String text;
+ /**
+ * Последняя высота текста
+ */
+ protected int lastTextHeight;
+ /**
+ * Последняя ширина текста
+ */
+ protected int lastTextWidth;
+ /**
+ * Флаг, нужно ли выравнивать текст по центру по горизонтали
+ */
+ protected boolean centered;
+ /**
+ * Флаг, нужно ли выравнивать текст по центру по вертикали
+ */
+ protected boolean vcentered;
+
+ /**
+ * Панель на сетке
+ *
+ * @param window окно
+ * @param drawBG флаг, нужно ли рисовать подложку
+ * @param backgroundColor цвет подложки
+ * @param padding отступы
+ * @param gridWidth кол-во ячеек сетки по ширине
+ * @param gridHeight кол-во ячеек сетки по высоте
+ * @param gridX координата в сетке x
+ * @param gridY координата в сетке y
+ * @param colspan кол-во колонок, занимаемых панелью
+ * @param rowspan кол-во строк, занимаемых панелью
+ * @param text текст
+ * @param centered флаг, нужно ли выравнивать текст по центру по горизонтали
+ * @param vcentered флаг, нужно ли выравнивать текст по центру по вертикали
+ */
+ public MultiLineLabel(
+ Window window, boolean drawBG, int backgroundColor, int padding, int gridWidth,
+ int gridHeight, int gridX, int gridY, int colspan, int rowspan, String text,
+ boolean centered, boolean vcentered) {
+ super(window, drawBG, backgroundColor, padding, gridWidth, gridHeight,
+ gridX, gridY, colspan, rowspan);
+ this.text = text;
+ this.centered = centered;
+ this.vcentered = vcentered;
+ }
+
+ /**
+ * Метод под рисование в конкретной реализации
+ *
+ * @param canvas область рисования
+ * @param windowCS СК окна
+ */
+ @Override
+ public void paintImpl(Canvas canvas, CoordinateSystem2i windowCS) {
+ // сохраняем области рисования
+ canvas.save();
+ // высота текста
+ int capHeight = (int) FONT12.getMetrics().getCapHeight();
+ // говорим, что первая y координата - это высота текста
+ int y = capHeight;
+ // начальное значение для последней сохранённой высоты
+ lastTextHeight = y;
+ // начальное значение для последней сохранённой ширины
+ lastTextWidth = 0;
+
+
+ // перебираем строки текста
+ for (String lineText : text.split("\n")) {
+ // создаём линию как объект рисования
+ try (TextLine line = TextLine.make(lineText, FONT12)) {
+ // последняя сохранённая ширина будет равна максимальной ширине строки
+ lastTextWidth = Math.max((int) line.getWidth() + 2 * padding, lastTextWidth);
+ }
+ // последняя сохранённая высота равна y-координате
+ lastTextHeight += 2 * capHeight;
+ }
+ // увеличиваем последнюю сохранённую высоту на высоту текста
+ lastTextHeight += capHeight;
+
+ // если нужно центрировать по горизонтали
+ if (centered)
+ canvas.translate((windowCS.getSize().x - lastTextWidth) / 2.0f, 0);
+ if (vcentered)
+ canvas.translate(0, (windowCS.getSize().y - lastTextHeight) / 2.0f);
+
+
+ try (Paint fg = new Paint().setColor(MULTILINE_TEXT_COLOR)) {
+ // перебираем строки текста
+ for (String lineText : text.split("\n")) {
+ // создаём линию как объект рисования
+ try (TextLine line = TextLine.make(lineText, FONT12)) {
+ // рисуем линию
+ canvas.save();
+
+ // если нужно центрировать по горизонтали
+ if (centered)
+ canvas.translate((lastTextWidth - line.getWidth()) / 2, 0);
+
+ canvas.drawTextLine(line, padding, y + padding + capHeight, fg);
+ // увеличиваем y координату на двойную высоту текста
+ y += 2 * capHeight;
+ canvas.restore();
+ }
+ }
+ }
+
+ // восстанавливаем области рисования
+ canvas.restore();
+ }
+}
diff --git a/src/main/java/panels/PanelControl.java b/src/main/java/panels/PanelControl.java
index d5bc9f8..e4d4e21 100644
--- a/src/main/java/panels/PanelControl.java
+++ b/src/main/java/panels/PanelControl.java
@@ -1,21 +1,20 @@
package panels;
-import controls.Label;
+import app.Task;
+import controls.MultiLineLabel;
import io.github.humbleui.jwm.*;
import io.github.humbleui.skija.Canvas;
import misc.CoordinateSystem2i;
import static app.Application.PANEL_PADDING;
-import static app.Colors.PANEL_BACKGROUND_COLOR;
-
/**
* Панель управления
*/
public class PanelControl extends GridPanel {
/**
- * Заголовок
+ * Текст задания
*/
- private final Label label;
+ MultiLineLabel task;
/**
* Панель управления
@@ -37,10 +36,11 @@ public PanelControl(
) {
super(window, drawBG, color, padding, gridWidth, gridHeight, gridX, gridY, colspan, rowspan);
- // создаём первый заголовок
- label = new Label(window, false, PANEL_BACKGROUND_COLOR, PANEL_PADDING,
- 1, 1, 0, 0, 1, 1, "Панель управления", true, true);
-
+ // задание
+ task = new MultiLineLabel(
+ window, false, backgroundColor, PANEL_PADDING,
+ 6, 7, 0, 0, 6, 2, Task.TASK_TEXT,
+ false, true);
}
@@ -51,7 +51,8 @@ public PanelControl(
*/
@Override
public void accept(Event e) {
-
+ // вызываем обработчик предка
+ super.accept(e);
}
/**
@@ -62,6 +63,6 @@ public void accept(Event e) {
*/
@Override
public void paintImpl(Canvas canvas, CoordinateSystem2i windowCS) {
- label.paint(canvas, windowCS);
+ task.paint(canvas, windowCS);
}
}