From 2ea0c58652fb9223562431e026297af3c1d189f3 Mon Sep 17 00:00:00 2001
From: TheUltimateOptimist <digitalConfidence@web.de>
Date: Mon, 27 Jan 2025 23:40:19 +0100
Subject: [PATCH] basic leveleditor

---
 CMakeLists.txt                   |  3 +++
 README.md                        |  3 +++
 leveleditor/CMakeLists.txt       | 16 ++++++++++++++++
 leveleditor/src/MainWindow.cpp   | 26 ++++++++++++++++++++++++++
 leveleditor/src/MainWindow.hpp   |  6 ++++++
 leveleditor/src/Tile.cpp         |  8 ++++++++
 leveleditor/src/Tile.hpp         | 13 +++++++++++++
 leveleditor/src/TileProvider.cpp | 18 ++++++++++++++++++
 leveleditor/src/TileProvider.hpp | 12 ++++++++++++
 leveleditor/src/main.cpp         | 12 ++++++++++++
 10 files changed, 117 insertions(+)
 create mode 100644 leveleditor/CMakeLists.txt
 create mode 100644 leveleditor/src/MainWindow.cpp
 create mode 100644 leveleditor/src/MainWindow.hpp
 create mode 100644 leveleditor/src/Tile.cpp
 create mode 100644 leveleditor/src/Tile.hpp
 create mode 100644 leveleditor/src/TileProvider.cpp
 create mode 100644 leveleditor/src/TileProvider.hpp
 create mode 100644 leveleditor/src/main.cpp

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2a9b703..85d2f7e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -108,6 +108,9 @@ else()
     )
 endif()
 
+# leveleditor
+add_subdirectory(leveleditor)
+
 # writelevel
 add_executable(writelevel ${PROJECT_SOURCE_DIR}/writelevel.cpp)
 target_include_directories(writelevel
diff --git a/README.md b/README.md
index 8e5bcd0..9213cba 100644
--- a/README.md
+++ b/README.md
@@ -57,3 +57,6 @@ CMake kann mit verschiedenen Optionen konfiguriert werden:
 cmake .. -DCMAKE_BUILD_TYPE=Release    # Release-Build
 cmake .. -DCMAKE_BUILD_TYPE=Debug      # Debug-Build
 ```
+
+## Prerequisites for Leveleditor
+- QT 6: ```sudo apt install qt6-base-dev```
\ No newline at end of file
diff --git a/leveleditor/CMakeLists.txt b/leveleditor/CMakeLists.txt
new file mode 100644
index 0000000..248c3ea
--- /dev/null
+++ b/leveleditor/CMakeLists.txt
@@ -0,0 +1,16 @@
+# Find Qt
+find_package(Qt6 REQUIRED COMPONENTS Widgets)
+
+file(GLOB_RECURSE LEVELEDITOR_SOURCES
+        "${PROJECT_SOURCE_DIR}/leveleditor/src/*.cpp"
+        "${PROJECT_SOURCE_DIR}/leveleditor/src/*.hpp"
+)
+
+# Add executable
+add_executable(editor ${LEVELEDITOR_SOURCES})
+
+# Link Qt libraries
+target_link_libraries(editor PRIVATE Qt6::Widgets)
+
+
+
diff --git a/leveleditor/src/MainWindow.cpp b/leveleditor/src/MainWindow.cpp
new file mode 100644
index 0000000..a8a07b6
--- /dev/null
+++ b/leveleditor/src/MainWindow.cpp
@@ -0,0 +1,26 @@
+#include <QGraphicsScene>
+#include <QVBoxLayout>
+#include <QGraphicsView>
+#include "TileProvider.hpp"
+#include "MainWindow.hpp"
+
+MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
+    // Create the main widget and layout
+    QWidget *centralWidget = new QWidget(this);
+    QVBoxLayout *mainLayout = new QVBoxLayout(centralWidget);
+    setWindowTitle("Level Editor");
+
+    QGraphicsScene* scene = new QGraphicsScene(this);
+    scene->setSceneRect(0, 0, 400, 400); // Set the scene dimensions
+    TileProvider tileprovider = TileProvider::from_spritesheet("spritesheet.h5");
+    QPixmap pixmap = tileprovider.get_tile(0);
+    QGraphicsPixmapItem* pixmapitem = scene->addPixmap(pixmap);
+
+    // Create a view to display the scene
+    QGraphicsView* view = new QGraphicsView(scene, this);
+    view->setFixedSize(300, 300);
+    view->scale(10, 10);
+    mainLayout->addWidget(view);
+
+    setCentralWidget(centralWidget);
+}
\ No newline at end of file
diff --git a/leveleditor/src/MainWindow.hpp b/leveleditor/src/MainWindow.hpp
new file mode 100644
index 0000000..ef962da
--- /dev/null
+++ b/leveleditor/src/MainWindow.hpp
@@ -0,0 +1,6 @@
+#include <QMainWindow>
+
+class MainWindow : public QMainWindow {
+public:
+    MainWindow(QWidget *parent = nullptr);
+};
\ No newline at end of file
diff --git a/leveleditor/src/Tile.cpp b/leveleditor/src/Tile.cpp
new file mode 100644
index 0000000..8489d68
--- /dev/null
+++ b/leveleditor/src/Tile.cpp
@@ -0,0 +1,8 @@
+#include "Tile.hpp"
+#include <iostream>
+
+Tile::Tile(const QPixmap &pixmap, uint8_t id) : QGraphicsPixmapItem(pixmap) {}
+
+void Tile::mousePressEvent(QGraphicsSceneMouseEvent *event) {
+    std::cout << "clicked" << std::endl;
+}
diff --git a/leveleditor/src/Tile.hpp b/leveleditor/src/Tile.hpp
new file mode 100644
index 0000000..726e0e6
--- /dev/null
+++ b/leveleditor/src/Tile.hpp
@@ -0,0 +1,13 @@
+#include <QApplication>
+#include <QGraphicsPixmapItem>
+#include <QGraphicsSceneMouseEvent>
+
+class Tile : public QGraphicsPixmapItem {
+public:
+    explicit Tile(const QPixmap& pixmap, uint8_t id);
+
+protected:
+    // Override mousePressEvent to handle mouse clicks
+    void mousePressEvent(QGraphicsSceneMouseEvent* event) override;
+    
+};
\ No newline at end of file
diff --git a/leveleditor/src/TileProvider.cpp b/leveleditor/src/TileProvider.cpp
new file mode 100644
index 0000000..07b8671
--- /dev/null
+++ b/leveleditor/src/TileProvider.cpp
@@ -0,0 +1,18 @@
+#include "TileProvider.hpp"
+
+TileProvider::TileProvider(std::vector<std::vector<uint32_t>> sprites) : sprites(sprites){}
+
+QPixmap TileProvider::get_tile(uint8_t id) {
+    QImage image(16, 16, QImage::Format::Format_ARGB32);
+    for (int y = 0; y < 16; y++) {
+        for (int x = 0; x < 16; x++) {
+            image.setPixel(x, y, 0xFF228B22);
+        }
+    }
+    return QPixmap::fromImage(image);
+}
+
+TileProvider TileProvider::from_spritesheet(const std::string path)
+{
+    return TileProvider({});
+}
diff --git a/leveleditor/src/TileProvider.hpp b/leveleditor/src/TileProvider.hpp
new file mode 100644
index 0000000..c3fee5b
--- /dev/null
+++ b/leveleditor/src/TileProvider.hpp
@@ -0,0 +1,12 @@
+#include <QPixmap>
+#include <vector>
+
+class TileProvider {
+public: 
+    TileProvider(std::vector<std::vector<uint32_t>> sprites);
+    QPixmap get_tile(uint8_t id);
+    TileProvider static from_spritesheet(const std::string path);
+
+private:
+    std::vector<std::vector<uint32_t>> sprites;
+};
\ No newline at end of file
diff --git a/leveleditor/src/main.cpp b/leveleditor/src/main.cpp
new file mode 100644
index 0000000..fdad82e
--- /dev/null
+++ b/leveleditor/src/main.cpp
@@ -0,0 +1,12 @@
+#include <QApplication>
+#include "MainWindow.hpp"
+
+int main(int argc, char *argv[]) {
+    QApplication app(argc, argv);
+
+    MainWindow window;
+    window.resize(320, 320); // Adjust size as needed
+    window.show();
+
+    return app.exec();
+}
\ No newline at end of file
-- 
GitLab