diff --git a/.github/workflows/build.yml b/.gitea/workflows/build.yml similarity index 100% rename from .github/workflows/build.yml rename to .gitea/workflows/build.yml diff --git a/GEMINI.md b/GEMINI.md index 18d2c04..ad59810 100644 --- a/GEMINI.md +++ b/GEMINI.md @@ -16,6 +16,7 @@ The project uses Gradle. * **Dependency Injection:** Uses `avaje-inject`. Components are marked with `@Component` and injected via constructor. * **Boilerplate:** Uses `lombok` for boilerplate reduction. * **Rendering:** Built on LibGDX. Main entry point is `DiceOS.java` which extends `ApplicationAdapter`. +* **Asset Loading:** All assets, including textures, fonts, and NinePatches, must be loaded via the `ResourceLoader` service to ensure proper lifecycle management and caching. * **Project Structure:** * `src/main/java/be/seeseemelk/diceos/system`: Core OS services (Display, Window, Input, etc.). * `src/main/resources`: Assets (backgrounds, system textures, fonts). diff --git a/src/main/java/be/seeseemelk/diceos/system/DiceOS.java b/src/main/java/be/seeseemelk/diceos/system/DiceOS.java index 64d204a..bb0546c 100644 --- a/src/main/java/be/seeseemelk/diceos/system/DiceOS.java +++ b/src/main/java/be/seeseemelk/diceos/system/DiceOS.java @@ -2,6 +2,7 @@ package be.seeseemelk.diceos.system; import be.seeseemelk.diceos.system.gfx.GraphicsContext; import com.badlogic.gdx.ApplicationAdapter; +import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.BitmapFont; @@ -71,6 +72,10 @@ public class DiceOS extends ApplicationAdapter { @Override public void render() { + int mouseX = Gdx.input.getX(); + int mouseY = display.getHeight() - Gdx.input.getY(); + windowService.update(mouseX, mouseY, Gdx.input.isTouched()); + cursorService.updateCursor(); ScreenUtils.clear(Color.BLACK); @@ -84,6 +89,9 @@ public class DiceOS extends ApplicationAdapter { // Render background gc.draw(clouds, 0, 0); + // Render windows + windowService.render(gc); + gc.scissor(0, 0, gc.getWidth(), gc.getHeight(), windowService::paint); // Render borders diff --git a/src/main/java/be/seeseemelk/diceos/system/WindowService.java b/src/main/java/be/seeseemelk/diceos/system/WindowService.java index 36c92b5..3bd5bde 100644 --- a/src/main/java/be/seeseemelk/diceos/system/WindowService.java +++ b/src/main/java/be/seeseemelk/diceos/system/WindowService.java @@ -2,26 +2,49 @@ package be.seeseemelk.diceos.system; import be.seeseemelk.diceos.system.gfx.GraphicsContext; import be.seeseemelk.diceos.system.toolkit.Menubar; +import be.seeseemelk.diceos.system.toolkit.Window; import com.badlogic.gdx.graphics.g2d.NinePatch; import io.avaje.inject.Component; import lombok.RequiredArgsConstructor; +import java.util.ArrayList; +import java.util.List; + @RequiredArgsConstructor @Component public class WindowService implements OnStartup { private final ResourceLoader resourceLoader; + private final List windows = new ArrayList<>(); private NinePatch menubar; + private NinePatch windowDecoration; private Menubar systemMenubar; @Override public void onStartup() { menubar = resourceLoader.loadNinePatch("system/menubar.png"); + windowDecoration = resourceLoader.loadNinePatch("system/window.png"); systemMenubar = new Menubar() .addItem("Dice") .addItem("System"); } + public void spawnWindow(int x, int y, int width, int height) { + windows.add(new Window(x, y, width, height, windowDecoration)); + } + + public void update(int mouseX, int mouseY, boolean isTouched) { + for (Window window : windows) { + window.handleInput(mouseX, mouseY, isTouched); + } + } + + public void render(GraphicsContext gc) { + for (Window window : windows) { + window.paint(gc); + } + } + void paint(GraphicsContext gc) { // Render menubar gc.draw(menubar, 0, 0, gc.getWidth(), 14); diff --git a/src/main/java/be/seeseemelk/diceos/system/toolkit/Window.java b/src/main/java/be/seeseemelk/diceos/system/toolkit/Window.java index 6b0f619..65b224f 100644 --- a/src/main/java/be/seeseemelk/diceos/system/toolkit/Window.java +++ b/src/main/java/be/seeseemelk/diceos/system/toolkit/Window.java @@ -1,6 +1,7 @@ package be.seeseemelk.diceos.system.toolkit; import be.seeseemelk.diceos.system.gfx.GraphicsContext; +import com.badlogic.gdx.graphics.g2d.NinePatch; import lombok.Getter; import lombok.Setter; @@ -8,9 +9,43 @@ import lombok.Setter; @Getter public class Window extends Container { private String title; + private int x, y, width, height; + private boolean active; + private NinePatch decoration; + + public Window(int x, int y, int width, int height, NinePatch decoration) { + this.x = x; + this.y = y; + this.width = width; + this.height = height; + this.decoration = decoration; + } + + private int dragOffsetX, dragOffsetY; + private boolean isDragging; + + public void handleInput(int mouseX, int mouseY, boolean isTouched) { + if (isTouched) { + if (!isDragging && isHovered(mouseX, mouseY)) { + isDragging = true; + dragOffsetX = mouseX - x; + dragOffsetY = mouseY - y; + } + } else { + isDragging = false; + } + + if (isDragging) { + x = mouseX - dragOffsetX; + y = mouseY - dragOffsetY; + } + } @Override public void paint(GraphicsContext gc) { + if (decoration != null) { + decoration.draw(gc.getBatch(), x, y, width, height); + } super.paint(gc); } }