From 62ce9e02d81a5d15f5f0d8383e9cafaade190580 Mon Sep 17 00:00:00 2001
From: doralitze <doralitze@chaotikum.org>
Date: Tue, 18 Jul 2023 14:15:23 +0200
Subject: [PATCH] add: gui structure skeleton

---
 src/app/rmrf.cpp                              |  9 +-
 src/ui-imgui/graphics_context_gl3.cpp         |  2 +-
 ...context_gl3.h => graphics_context_gl3.hpp} |  0
 src/ui-imgui/imgui_application.cpp            | 91 +++++++++++++++++++
 src/ui-imgui/imgui_application.hpp            | 44 +++++++++
 src/ui-imgui/imgui_theme.cpp                  |  2 +-
 .../{imgui_theme.h => imgui_theme.hpp}        |  0
 7 files changed, 144 insertions(+), 4 deletions(-)
 rename src/ui-imgui/{graphics_context_gl3.h => graphics_context_gl3.hpp} (100%)
 create mode 100644 src/ui-imgui/imgui_application.cpp
 create mode 100644 src/ui-imgui/imgui_application.hpp
 rename src/ui-imgui/{imgui_theme.h => imgui_theme.hpp} (100%)

diff --git a/src/app/rmrf.cpp b/src/app/rmrf.cpp
index d1a0f63..858efed 100644
--- a/src/app/rmrf.cpp
+++ b/src/app/rmrf.cpp
@@ -3,16 +3,21 @@
 //
 
 #include "macros.hpp"
-#include "ui-imgui/graphics_context_gl3.h"
+#include "ui-imgui/graphics_context_gl3.hpp"
+#include "ui-imgui/imgui_application.hpp"
 
 int main(int argc, char *argv[], char *env[]) {
     // TODO later use command line arguments as the ncurses app
     MARK_UNUSED(argc);
     MARK_UNUSED(argv);
     MARK_UNUSED(env);
-    graphics_context_gl3 context(gui_style::DARK);
+    rmrf::ui::graphics_context_gl3 context(gui_style::DARK);
+
+    // TODO start event thread and open post offices
+    rmrf::ui::imgui_application app;
 
     while(!context.should_application_close()) {
+        app.render();
         context.perform_mainloop_actions();
     }
 
diff --git a/src/ui-imgui/graphics_context_gl3.cpp b/src/ui-imgui/graphics_context_gl3.cpp
index 34d7d3b..6101d19 100644
--- a/src/ui-imgui/graphics_context_gl3.cpp
+++ b/src/ui-imgui/graphics_context_gl3.cpp
@@ -2,7 +2,7 @@
 // Created by Doralitze on 17.07.23.
 //
 
-#include "graphics_context_gl3.h"
+#include "graphics_context_gl3.hpp"
 
 #include <iostream>
 
diff --git a/src/ui-imgui/graphics_context_gl3.h b/src/ui-imgui/graphics_context_gl3.hpp
similarity index 100%
rename from src/ui-imgui/graphics_context_gl3.h
rename to src/ui-imgui/graphics_context_gl3.hpp
diff --git a/src/ui-imgui/imgui_application.cpp b/src/ui-imgui/imgui_application.cpp
new file mode 100644
index 0000000..caf482c
--- /dev/null
+++ b/src/ui-imgui/imgui_application.cpp
@@ -0,0 +1,91 @@
+//
+// Created by Leon Dietrich on 18.07.23.
+//
+
+#include "imgui_application.hpp"
+
+#include "lib/imgui/imgui.h"
+
+namespace rmrf {
+    namespace ui {
+
+        imgui_application::imgui_application() {
+
+        }
+
+        void imgui_application::render() {
+            // TODO check if the window was resized
+            ImGUI::Begin(this->window_title.c_str());
+            render_head_toolbar();
+            if(this->side_panel_displayed) {
+                render_sidepanel();
+            }
+            switch(this->open_window) {
+                default:
+                    render_exception_window();
+                    break;
+                case window_state::INBOX:
+                    render_inbox();
+                    break;
+                case window_state::READ_MAIL:
+                    render_read_mail();
+                    break;
+                case window_state::COMPOSE:
+                    render_send_mail_dialog();
+                    break;
+                case window_state::SEARCH_RESULTS:
+                    render_search_results_dialog();
+                    break;
+                case window_state::SETTINGS:
+                    render_settings_panel();
+                    break;
+            }
+            render_footer();
+            ImGUI::End();
+        }
+
+        void imgui_application::window_resized() {
+            // TODO disable side panel if window became too small
+        }
+
+        void imgui_application::render_exception_window() {
+            ImGui::Text("Something went wrong.");
+        }
+
+        void imgui_application::render_head_toolbar() {
+            // TODO display title of current page
+            // TODO display back button
+            // TODO display side panel toggle button
+        }
+
+        void imgui_application::render_sidepanel() {
+            // TODO display navigation structure
+            // TODO display search text box
+        }
+
+        void imgui_application::render_footer() {
+            // TODO display progress bar if applicable
+        }
+
+        void imgui_application::render_inbox() {
+            // TODO draw list of mails
+        }
+
+        void imgui_application::render_read_mail() {
+            //
+        }
+
+        void imgui_application::render_send_mail_dialog() {
+            //
+        }
+
+        void imgui_application::render_search_results_dialog() {
+            //
+        }
+
+        void imgui_application::render_settings_panel() {
+            //
+        }
+
+    } // rmrf
+} // ui
\ No newline at end of file
diff --git a/src/ui-imgui/imgui_application.hpp b/src/ui-imgui/imgui_application.hpp
new file mode 100644
index 0000000..69e2ac0
--- /dev/null
+++ b/src/ui-imgui/imgui_application.hpp
@@ -0,0 +1,44 @@
+//
+// Created by Doralitze on 18.07.23.
+//
+
+#pragma once
+
+#include <cstdint>
+#include <string>
+
+namespace rmrf::ui {
+
+    enum class window_state : uint8_t {
+        INBOX,
+        READ_MAIL,
+        COMPOSE,
+        SEARCH_RESULTS,
+        SETTINGS,
+    };
+
+    class imgui_application {
+        window_state open_window = window_state::INBOX;
+        bool side_panel_displayed = false;
+        std::string window_title = "RMRF";
+    public:
+        imgui_application();
+
+        void render();
+    private:
+        void window_resized();
+
+        void render_head_toolbar();
+        void render_sidepanel();
+        void render_footer();
+
+        void render_exception_window();
+        void render_inbox();
+        void render_read_mail();
+        void render_send_mail_dialog();
+        void render_search_results_dialog();
+        void render_settings_panel();
+    };
+
+}
+
diff --git a/src/ui-imgui/imgui_theme.cpp b/src/ui-imgui/imgui_theme.cpp
index 523ecb3..f37cfd3 100644
--- a/src/ui-imgui/imgui_theme.cpp
+++ b/src/ui-imgui/imgui_theme.cpp
@@ -2,7 +2,7 @@
 // Created by Leon Dietrich on 17.07.23.
 //
 
-#include "imgui_theme.h"
+#include "imgui_theme.hpp"
 
 namespace Spectrum {
     const float CHECKBOX_BORDER_SIZE = 2.0f;
diff --git a/src/ui-imgui/imgui_theme.h b/src/ui-imgui/imgui_theme.hpp
similarity index 100%
rename from src/ui-imgui/imgui_theme.h
rename to src/ui-imgui/imgui_theme.hpp
-- 
GitLab