From a8cbab7d48ae4cc6b0d2b701c0b72f5b4c1e719b Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 7 Mar 2022 18:58:46 +0300 Subject: [PATCH] Panel ready --- src/main/java/app/Application.java | 33 ++++++++++++++--------- src/main/java/panels/Panel.java | 42 ++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 13 deletions(-) diff --git a/src/main/java/app/Application.java b/src/main/java/app/Application.java index 57ee508..75160aa 100644 --- a/src/main/java/app/Application.java +++ b/src/main/java/app/Application.java @@ -55,19 +55,6 @@ public class Application implements Consumer { public Application() { // создаём окно window = App.makeWindow(); - // задаём обработчиком событий текущий объект - window.setEventListener(this); - // задаём заголовок - window.setTitle("Java 2D"); - // задаём размер окна - window.setWindowSize(900, 900); - // задаём его положение - window.setWindowPosition(100, 100); - // задаём иконку - switch (Platform.CURRENT) { - case WINDOWS -> window.setIcon(new File("src/main/resources/windows.ico")); - case MACOS -> window.setIcon(new File("src/main/resources/macos.icns")); - } // создаём панель рисования panelRendering = new PanelRendering( @@ -90,6 +77,21 @@ public Application() { 2, 1 ); + // задаём обработчиком событий текущий объект + window.setEventListener(this); + // задаём заголовок + window.setTitle("Java 2D"); + // задаём размер окна + window.setWindowSize(900, 900); + // задаём его положение + window.setWindowPosition(100, 100); + + // задаём иконку + switch (Platform.CURRENT) { + case WINDOWS -> window.setIcon(new File("src/main/resources/windows.ico")); + case MACOS -> window.setIcon(new File("src/main/resources/macos.icns")); + } + // названия слоёв, которые будем перебирать String[] layerNames = new String[]{ "LayerGLSkija", "LayerRasterSkija" @@ -133,6 +135,11 @@ public void accept(Event e) { paint(s.getCanvas(), new CoordinateSystem2i(0, 0, s.getWidth(), s.getHeight()) ); } + + // передаём события на обработку панелям + panelControl.accept(e); + panelRendering.accept(e); + panelLog.accept(e); } /** diff --git a/src/main/java/panels/Panel.java b/src/main/java/panels/Panel.java index 47cd94a..f8097ff 100644 --- a/src/main/java/panels/Panel.java +++ b/src/main/java/panels/Panel.java @@ -4,6 +4,7 @@ import io.github.humbleui.skija.Canvas; import io.github.humbleui.skija.Paint; import misc.CoordinateSystem2i; +import misc.Vector2i; import java.util.function.Consumer; @@ -30,6 +31,18 @@ public abstract class Panel implements Consumer { * цвет подложки */ protected final int backgroundColor; + /** + * последнее движение мыши + */ + protected Vector2i lastMove = new Vector2i(0, 0); + /** + * было ли оно внутри панели + */ + protected boolean lastInside = false; + /** + * последняя СК окна + */ + protected CoordinateSystem2i lastWindowCS; /** * Конструктор панели @@ -71,6 +84,8 @@ public void paint(Canvas canvas, CoordinateSystem2i windowCS) { paintImpl(canvas, windowCS); // восстанавливаем область рисования canvas.restore(); + // сохраняем СК окна + lastWindowCS = windowCS; } /** @@ -81,4 +96,31 @@ public void paint(Canvas canvas, CoordinateSystem2i windowCS) { */ public abstract void paintImpl(Canvas canvas, CoordinateSystem2i windowCS); + /** + * Проверка, содержит ли панель координаты + * + * @param pos положение + * @return флаг, содержит или нет + */ + public boolean contains(Vector2i pos) { + if (lastWindowCS != null) + return lastWindowCS.checkCoords(pos); + return false; + } + + /** + * Обработчик событий + * при перегрузке обязателен вызов реализации предка + * + * @param e событие + */ + @Override + public void accept(Event e) { + if (e instanceof EventMouseMove ee) { + // сохраняем последнее положение мыши + lastMove = new Vector2i(ee); + // сохраняем флаг, был ли курсор внутри панели + lastInside = contains(lastMove); + } + } } \ No newline at end of file