From fcd5eb2d2a4380fb1510b19fa2b8a00879536177 Mon Sep 17 00:00:00 2001 From: IlyaShurupov Date: Fri, 18 Oct 2024 10:56:42 +0300 Subject: [PATCH] Replace Old Widgets --- .back/WidBack/CMakeLists.txt | 21 +++ .../WidBack}/examples/ChatGUI.cpp | 0 .../WidBack}/examples/ChatGUI.hpp | 0 .../WidBack}/examples/Font.ttf | Bin .../WidBack}/examples/SimpleGUI.cpp | 0 .../WidBack}/examples/SimpleGUI.hpp | 0 .../WidBack}/private/Animations.cpp | 0 .../WidBack}/private/ButtonWidget.cpp | 0 .../WidBack}/private/CollapsableMenu.cpp | 0 .../WidBack}/private/FloatSpaceWidget.cpp | 0 .../WidBack}/private/FloatingWidget.cpp | 0 .../WidBack}/private/GridLayoutWidget.cpp | 0 .../WidBack}/private/LabelWidget.cpp | 0 .../WidBack}/private/ScrollableWidget.cpp | 0 .../WidBack}/private/SliderWidget.cpp | 0 .../WidBack}/private/TextInputWidget.cpp | 0 .../WidBack}/private/WidgetBase.cpp | 0 .../WidBack}/private/WidgetManager.cpp | 0 .../WidBack}/private/WorkspaceWidget.cpp | 0 .../WidBack}/public/Animations.hpp | 0 .../WidBack}/public/ButtonWidget.hpp | 0 .../WidBack}/public/CollapsableMenu.hpp | 0 .../WidBack}/public/FloatingLayoutWidget.hpp | 0 .../WidBack}/public/FloatingWidget.hpp | 0 .../WidBack}/public/GridLayoutWidget.hpp | 0 .../WidBack}/public/LabelWidget.hpp | 0 .../WidBack}/public/ScrollableWidget.hpp | 0 .../WidBack}/public/SliderWidget.hpp | 0 .../WidBack}/public/TextInputWidget.hpp | 0 .../WidBack}/public/WidgetBase.hpp | 0 .../WidBack}/public/WidgetManager.hpp | 0 {Widgets => .back/WidBack}/public/Widgets.hpp | 0 .../WidBack}/public/WorkspaceWidget.hpp | 0 3DEditor/applications/Entry.cpp | 19 +-- 3DEditor/private/Editor.cpp | 2 + 3DEditor/public/EditorWidget.hpp | 126 ++++++++-------- CMakeLists.txt | 1 - Graphics/private/Canvas.cpp | 4 + Graphics/public/Graphics.hpp | 1 + LibraryViewer/applications/Entry.cpp | 18 +-- LibraryViewer/private/Library.cpp | 1 - LibraryViewer/public/GUI.hpp | 138 +++++++++++------- Sketch3D/applications/Entry.cpp | 18 +-- Sketch3D/public/Sketch3DWidget.hpp | 132 +++++++++-------- Widgets/CMakeLists.txt | 12 +- {WidgetsNew => Widgets}/examples/Example.cpp | 42 ++---- {WidgetsNew => Widgets}/private/Layout.cpp | 0 .../private/RootWidget.cpp | 9 +- {WidgetsNew => Widgets}/private/Widget.cpp | 5 + Widgets/private/WidgetApplication.cpp | 10 ++ .../private/layouts/BasicLayout.cpp | 0 .../private/layouts/DockLayout.cpp | 2 +- .../private/layouts/FloatingLayout.cpp | 0 .../private/layouts/OverlayLayout.cpp | 0 .../private/layouts/ScrollableLayout.cpp | 0 .../private/managers/DebugManager.cpp | 0 .../private/managers/LayoutManager.cpp | 0 .../private/managers/UpdateManager.cpp | 0 .../private/widgets/AnimationTestWidget.cpp | 0 .../private/widgets/DockWidget.cpp | 0 .../private/widgets/FloatingWidget.cpp | 6 +- .../private/widgets/ScrollableWidget.cpp | 0 .../private/widgets/SimpleWidgets.cpp | 0 {WidgetsNew => Widgets}/public/Layout.hpp | 4 + {WidgetsNew => Widgets}/public/RootWidget.hpp | 2 + {WidgetsNew => Widgets}/public/Widget.hpp | 7 + Widgets/public/WidgetApplication.hpp | 49 +++++++ .../public/layouts/BasicLayout.hpp | 0 .../public/layouts/DockLayout.hpp | 4 +- .../public/layouts/FloatingLayout.hpp | 0 .../public/layouts/OverlayLayout.hpp | 0 .../public/layouts/ScrollableLayout.hpp | 0 .../public/mangers/DebugManager.hpp | 2 + .../public/mangers/LayoutManager.hpp | 0 .../public/mangers/UpdateManager.hpp | 0 .../public/widgets/AnimationTestWidget.hpp | 0 .../public/widgets/DockWidget.hpp | 0 .../public/widgets/FloatingWidget.hpp | 10 ++ .../public/widgets/ScrollableWidget.hpp | 0 .../public/widgets/SimpleWidgets.hpp | 4 +- WidgetsNew/CMakeLists.txt | 17 --- 81 files changed, 388 insertions(+), 278 deletions(-) create mode 100644 .back/WidBack/CMakeLists.txt rename {Widgets => .back/WidBack}/examples/ChatGUI.cpp (100%) rename {Widgets => .back/WidBack}/examples/ChatGUI.hpp (100%) rename {WidgetsNew => .back/WidBack}/examples/Font.ttf (100%) rename {Widgets => .back/WidBack}/examples/SimpleGUI.cpp (100%) rename {Widgets => .back/WidBack}/examples/SimpleGUI.hpp (100%) rename {Widgets => .back/WidBack}/private/Animations.cpp (100%) rename {Widgets => .back/WidBack}/private/ButtonWidget.cpp (100%) rename {Widgets => .back/WidBack}/private/CollapsableMenu.cpp (100%) rename {Widgets => .back/WidBack}/private/FloatSpaceWidget.cpp (100%) rename {Widgets => .back/WidBack}/private/FloatingWidget.cpp (100%) rename {Widgets => .back/WidBack}/private/GridLayoutWidget.cpp (100%) rename {Widgets => .back/WidBack}/private/LabelWidget.cpp (100%) rename {Widgets => .back/WidBack}/private/ScrollableWidget.cpp (100%) rename {Widgets => .back/WidBack}/private/SliderWidget.cpp (100%) rename {Widgets => .back/WidBack}/private/TextInputWidget.cpp (100%) rename {Widgets => .back/WidBack}/private/WidgetBase.cpp (100%) rename {Widgets => .back/WidBack}/private/WidgetManager.cpp (100%) rename {Widgets => .back/WidBack}/private/WorkspaceWidget.cpp (100%) rename {Widgets => .back/WidBack}/public/Animations.hpp (100%) rename {Widgets => .back/WidBack}/public/ButtonWidget.hpp (100%) rename {Widgets => .back/WidBack}/public/CollapsableMenu.hpp (100%) rename {Widgets => .back/WidBack}/public/FloatingLayoutWidget.hpp (100%) rename {Widgets => .back/WidBack}/public/FloatingWidget.hpp (100%) rename {Widgets => .back/WidBack}/public/GridLayoutWidget.hpp (100%) rename {Widgets => .back/WidBack}/public/LabelWidget.hpp (100%) rename {Widgets => .back/WidBack}/public/ScrollableWidget.hpp (100%) rename {Widgets => .back/WidBack}/public/SliderWidget.hpp (100%) rename {Widgets => .back/WidBack}/public/TextInputWidget.hpp (100%) rename {Widgets => .back/WidBack}/public/WidgetBase.hpp (100%) rename {Widgets => .back/WidBack}/public/WidgetManager.hpp (100%) rename {Widgets => .back/WidBack}/public/Widgets.hpp (100%) rename {Widgets => .back/WidBack}/public/WorkspaceWidget.hpp (100%) rename {WidgetsNew => Widgets}/examples/Example.cpp (85%) rename {WidgetsNew => Widgets}/private/Layout.cpp (100%) rename {WidgetsNew => Widgets}/private/RootWidget.cpp (91%) rename {WidgetsNew => Widgets}/private/Widget.cpp (97%) create mode 100644 Widgets/private/WidgetApplication.cpp rename {WidgetsNew => Widgets}/private/layouts/BasicLayout.cpp (100%) rename {WidgetsNew => Widgets}/private/layouts/DockLayout.cpp (99%) rename {WidgetsNew => Widgets}/private/layouts/FloatingLayout.cpp (100%) rename {WidgetsNew => Widgets}/private/layouts/OverlayLayout.cpp (100%) rename {WidgetsNew => Widgets}/private/layouts/ScrollableLayout.cpp (100%) rename {WidgetsNew => Widgets}/private/managers/DebugManager.cpp (100%) rename {WidgetsNew => Widgets}/private/managers/LayoutManager.cpp (100%) rename {WidgetsNew => Widgets}/private/managers/UpdateManager.cpp (100%) rename {WidgetsNew => Widgets}/private/widgets/AnimationTestWidget.cpp (100%) rename {WidgetsNew => Widgets}/private/widgets/DockWidget.cpp (100%) rename {WidgetsNew => Widgets}/private/widgets/FloatingWidget.cpp (95%) rename {WidgetsNew => Widgets}/private/widgets/ScrollableWidget.cpp (100%) rename {WidgetsNew => Widgets}/private/widgets/SimpleWidgets.cpp (100%) rename {WidgetsNew => Widgets}/public/Layout.hpp (96%) rename {WidgetsNew => Widgets}/public/RootWidget.hpp (96%) rename {WidgetsNew => Widgets}/public/Widget.hpp (94%) create mode 100644 Widgets/public/WidgetApplication.hpp rename {WidgetsNew => Widgets}/public/layouts/BasicLayout.hpp (100%) rename {WidgetsNew => Widgets}/public/layouts/DockLayout.hpp (97%) rename {WidgetsNew => Widgets}/public/layouts/FloatingLayout.hpp (100%) rename {WidgetsNew => Widgets}/public/layouts/OverlayLayout.hpp (100%) rename {WidgetsNew => Widgets}/public/layouts/ScrollableLayout.hpp (100%) rename {WidgetsNew => Widgets}/public/mangers/DebugManager.hpp (95%) rename {WidgetsNew => Widgets}/public/mangers/LayoutManager.hpp (100%) rename {WidgetsNew => Widgets}/public/mangers/UpdateManager.hpp (100%) rename {WidgetsNew => Widgets}/public/widgets/AnimationTestWidget.hpp (100%) rename {WidgetsNew => Widgets}/public/widgets/DockWidget.hpp (100%) rename {WidgetsNew => Widgets}/public/widgets/FloatingWidget.hpp (85%) rename {WidgetsNew => Widgets}/public/widgets/ScrollableWidget.hpp (100%) rename {WidgetsNew => Widgets}/public/widgets/SimpleWidgets.hpp (95%) delete mode 100644 WidgetsNew/CMakeLists.txt diff --git a/.back/WidBack/CMakeLists.txt b/.back/WidBack/CMakeLists.txt new file mode 100644 index 0000000..dc1b591 --- /dev/null +++ b/.back/WidBack/CMakeLists.txt @@ -0,0 +1,21 @@ +project(Widgets) + +### ---------------------- Static Library --------------------- ### +file(GLOB SOURCES "./private/*.cpp" "./private/*/*.cpp") +file(GLOB HEADERS "./public/*.hpp") + +add_library(${PROJECT_NAME} STATIC ${SOURCES} ${HEADERS}) +target_include_directories(${PROJECT_NAME} PUBLIC ./public/) +target_link_libraries(${PROJECT_NAME} PUBLIC Math Graphics Imgui) + +### -------------------------- Applications -------------------------- ### + +add_executable(SimpleGui examples/SimpleGUI.cpp) +target_link_libraries(SimpleGui ${PROJECT_NAME} ${GLEW_LIB}) +target_include_directories(SimpleGui PUBLIC ../Externals/glfw/include ${GLEW_INCLUDE_DIR}) + +add_executable(ChatGui examples/ChatGUI.cpp) +target_link_libraries(ChatGui ${PROJECT_NAME} ${GLEW_LIB}) +target_include_directories(ChatGui PUBLIC ../Externals/glfw/include ${GLEW_INCLUDE_DIR}) + +file(COPY "examples/Font.ttf" DESTINATION "${CMAKE_BINARY_DIR}/${PROJECT_NAME}/") \ No newline at end of file diff --git a/Widgets/examples/ChatGUI.cpp b/.back/WidBack/examples/ChatGUI.cpp similarity index 100% rename from Widgets/examples/ChatGUI.cpp rename to .back/WidBack/examples/ChatGUI.cpp diff --git a/Widgets/examples/ChatGUI.hpp b/.back/WidBack/examples/ChatGUI.hpp similarity index 100% rename from Widgets/examples/ChatGUI.hpp rename to .back/WidBack/examples/ChatGUI.hpp diff --git a/WidgetsNew/examples/Font.ttf b/.back/WidBack/examples/Font.ttf similarity index 100% rename from WidgetsNew/examples/Font.ttf rename to .back/WidBack/examples/Font.ttf diff --git a/Widgets/examples/SimpleGUI.cpp b/.back/WidBack/examples/SimpleGUI.cpp similarity index 100% rename from Widgets/examples/SimpleGUI.cpp rename to .back/WidBack/examples/SimpleGUI.cpp diff --git a/Widgets/examples/SimpleGUI.hpp b/.back/WidBack/examples/SimpleGUI.hpp similarity index 100% rename from Widgets/examples/SimpleGUI.hpp rename to .back/WidBack/examples/SimpleGUI.hpp diff --git a/Widgets/private/Animations.cpp b/.back/WidBack/private/Animations.cpp similarity index 100% rename from Widgets/private/Animations.cpp rename to .back/WidBack/private/Animations.cpp diff --git a/Widgets/private/ButtonWidget.cpp b/.back/WidBack/private/ButtonWidget.cpp similarity index 100% rename from Widgets/private/ButtonWidget.cpp rename to .back/WidBack/private/ButtonWidget.cpp diff --git a/Widgets/private/CollapsableMenu.cpp b/.back/WidBack/private/CollapsableMenu.cpp similarity index 100% rename from Widgets/private/CollapsableMenu.cpp rename to .back/WidBack/private/CollapsableMenu.cpp diff --git a/Widgets/private/FloatSpaceWidget.cpp b/.back/WidBack/private/FloatSpaceWidget.cpp similarity index 100% rename from Widgets/private/FloatSpaceWidget.cpp rename to .back/WidBack/private/FloatSpaceWidget.cpp diff --git a/Widgets/private/FloatingWidget.cpp b/.back/WidBack/private/FloatingWidget.cpp similarity index 100% rename from Widgets/private/FloatingWidget.cpp rename to .back/WidBack/private/FloatingWidget.cpp diff --git a/Widgets/private/GridLayoutWidget.cpp b/.back/WidBack/private/GridLayoutWidget.cpp similarity index 100% rename from Widgets/private/GridLayoutWidget.cpp rename to .back/WidBack/private/GridLayoutWidget.cpp diff --git a/Widgets/private/LabelWidget.cpp b/.back/WidBack/private/LabelWidget.cpp similarity index 100% rename from Widgets/private/LabelWidget.cpp rename to .back/WidBack/private/LabelWidget.cpp diff --git a/Widgets/private/ScrollableWidget.cpp b/.back/WidBack/private/ScrollableWidget.cpp similarity index 100% rename from Widgets/private/ScrollableWidget.cpp rename to .back/WidBack/private/ScrollableWidget.cpp diff --git a/Widgets/private/SliderWidget.cpp b/.back/WidBack/private/SliderWidget.cpp similarity index 100% rename from Widgets/private/SliderWidget.cpp rename to .back/WidBack/private/SliderWidget.cpp diff --git a/Widgets/private/TextInputWidget.cpp b/.back/WidBack/private/TextInputWidget.cpp similarity index 100% rename from Widgets/private/TextInputWidget.cpp rename to .back/WidBack/private/TextInputWidget.cpp diff --git a/Widgets/private/WidgetBase.cpp b/.back/WidBack/private/WidgetBase.cpp similarity index 100% rename from Widgets/private/WidgetBase.cpp rename to .back/WidBack/private/WidgetBase.cpp diff --git a/Widgets/private/WidgetManager.cpp b/.back/WidBack/private/WidgetManager.cpp similarity index 100% rename from Widgets/private/WidgetManager.cpp rename to .back/WidBack/private/WidgetManager.cpp diff --git a/Widgets/private/WorkspaceWidget.cpp b/.back/WidBack/private/WorkspaceWidget.cpp similarity index 100% rename from Widgets/private/WorkspaceWidget.cpp rename to .back/WidBack/private/WorkspaceWidget.cpp diff --git a/Widgets/public/Animations.hpp b/.back/WidBack/public/Animations.hpp similarity index 100% rename from Widgets/public/Animations.hpp rename to .back/WidBack/public/Animations.hpp diff --git a/Widgets/public/ButtonWidget.hpp b/.back/WidBack/public/ButtonWidget.hpp similarity index 100% rename from Widgets/public/ButtonWidget.hpp rename to .back/WidBack/public/ButtonWidget.hpp diff --git a/Widgets/public/CollapsableMenu.hpp b/.back/WidBack/public/CollapsableMenu.hpp similarity index 100% rename from Widgets/public/CollapsableMenu.hpp rename to .back/WidBack/public/CollapsableMenu.hpp diff --git a/Widgets/public/FloatingLayoutWidget.hpp b/.back/WidBack/public/FloatingLayoutWidget.hpp similarity index 100% rename from Widgets/public/FloatingLayoutWidget.hpp rename to .back/WidBack/public/FloatingLayoutWidget.hpp diff --git a/Widgets/public/FloatingWidget.hpp b/.back/WidBack/public/FloatingWidget.hpp similarity index 100% rename from Widgets/public/FloatingWidget.hpp rename to .back/WidBack/public/FloatingWidget.hpp diff --git a/Widgets/public/GridLayoutWidget.hpp b/.back/WidBack/public/GridLayoutWidget.hpp similarity index 100% rename from Widgets/public/GridLayoutWidget.hpp rename to .back/WidBack/public/GridLayoutWidget.hpp diff --git a/Widgets/public/LabelWidget.hpp b/.back/WidBack/public/LabelWidget.hpp similarity index 100% rename from Widgets/public/LabelWidget.hpp rename to .back/WidBack/public/LabelWidget.hpp diff --git a/Widgets/public/ScrollableWidget.hpp b/.back/WidBack/public/ScrollableWidget.hpp similarity index 100% rename from Widgets/public/ScrollableWidget.hpp rename to .back/WidBack/public/ScrollableWidget.hpp diff --git a/Widgets/public/SliderWidget.hpp b/.back/WidBack/public/SliderWidget.hpp similarity index 100% rename from Widgets/public/SliderWidget.hpp rename to .back/WidBack/public/SliderWidget.hpp diff --git a/Widgets/public/TextInputWidget.hpp b/.back/WidBack/public/TextInputWidget.hpp similarity index 100% rename from Widgets/public/TextInputWidget.hpp rename to .back/WidBack/public/TextInputWidget.hpp diff --git a/Widgets/public/WidgetBase.hpp b/.back/WidBack/public/WidgetBase.hpp similarity index 100% rename from Widgets/public/WidgetBase.hpp rename to .back/WidBack/public/WidgetBase.hpp diff --git a/Widgets/public/WidgetManager.hpp b/.back/WidBack/public/WidgetManager.hpp similarity index 100% rename from Widgets/public/WidgetManager.hpp rename to .back/WidBack/public/WidgetManager.hpp diff --git a/Widgets/public/Widgets.hpp b/.back/WidBack/public/Widgets.hpp similarity index 100% rename from Widgets/public/Widgets.hpp rename to .back/WidBack/public/Widgets.hpp diff --git a/Widgets/public/WorkspaceWidget.hpp b/.back/WidBack/public/WorkspaceWidget.hpp similarity index 100% rename from Widgets/public/WorkspaceWidget.hpp rename to .back/WidBack/public/WorkspaceWidget.hpp diff --git a/3DEditor/applications/Entry.cpp b/3DEditor/applications/Entry.cpp index 786018a..004bae3 100644 --- a/3DEditor/applications/Entry.cpp +++ b/3DEditor/applications/Entry.cpp @@ -1,12 +1,12 @@ #include "EditorWidget.hpp" -#include "GraphicApplication.hpp" +#include "WidgetApplication.hpp" +#include "RootWidget.hpp" using namespace tp; - -class EditorGUI : public Application { +class EditorGUI : public WidgetApplication { public: EditorGUI() { auto canvas = this->mGraphics->getCanvas(); @@ -14,25 +14,14 @@ public: mEditor.loadDefaults(); + setRoot(mGui); // mScene.mCamera.lookAtPoint({ 0, 0, 0 }, { 3, 3, 2 }, { 0, 0, 1 }); } ~EditorGUI() override { delete mGui; } - void processFrame(EventHandler* eventHandler, halnf delta) override { - auto rec = RectF({ 0, 0 }, mWindow->getSize()); - - mGui->setArea(rec); - mGui->setVisible(true); - mGui->updateConfigWrapper(mWidgetManager); - mGui->procWrapper(*eventHandler, rec); - } - - void drawFrame(Canvas* canvas) override { mGui->drawWrapper(*canvas); } - private: Editor mEditor; - WidgetManager mWidgetManager; EditorWidget* mGui; }; diff --git a/3DEditor/private/Editor.cpp b/3DEditor/private/Editor.cpp index e8838cf..26599a0 100644 --- a/3DEditor/private/Editor.cpp +++ b/3DEditor/private/Editor.cpp @@ -57,6 +57,8 @@ void Editor::loadDefaults() { } void Editor::setViewportSize(const Vec2F& size) { + if (size.x < 0 || size.y < 0) return; + // TODO remove // mScene.mCamera.rotate(0.01f, 0.0); diff --git a/3DEditor/public/EditorWidget.hpp b/3DEditor/public/EditorWidget.hpp index 95e3ad8..00899df 100644 --- a/3DEditor/public/EditorWidget.hpp +++ b/3DEditor/public/EditorWidget.hpp @@ -1,6 +1,8 @@ -#include "Widgets.hpp" +#include "Widget.hpp" +#include "DockWidget.hpp" #include "Editor.hpp" +#include "FloatingWidget.hpp" namespace tp { @@ -12,15 +14,17 @@ namespace tp { mCanvas = canvas; } - ~ViewportWidget() { mCanvas->deleteImageHandle(mImage); } + ~ViewportWidget() override { mCanvas->deleteImageHandle(mImage); } - void eventProcess(const Events& events) override { mEditor->setViewportSize(this->mArea.size); } + void process(const EventHandler& events) override { + mEditor->setViewportSize(getArea().size); + } - void eventDraw(Canvas& canvas) override { + void draw(Canvas& canvas) override { mEditor->renderViewport(); canvas.updateTextureID(mImage, mEditor->getViewportTexID()); - canvas.drawImage(this->mArea, &mImage, PI); + canvas.drawImage(getArea().relative(), &mImage, PI); } public: @@ -30,98 +34,96 @@ namespace tp { Canvas::ImageHandle mImage; }; - class EditorWidget : public WorkspaceWidget { + class EditorWidget : public DockWidget { public: EditorWidget(Canvas* canvas, Editor* editor) : mViewport(canvas, editor) { mEditor = editor; - mDockSpace.addSideWidget(&mNavigationMenu, DockWidget::RIGHT); - mDockSpace.addSideWidget(&mRenderMenu, DockWidget::LEFT); - mDockSpace.setCenterWidget(&mViewport); + mPanel.setText("Controls"); + mPanel.addToMenu(&mNavigationMenu); + mPanel.addToMenu(&mRenderMenu); + + dockWidget(&mPanel, DockLayout::RIGHT); + setCenterWidget(&mViewport); // Render { - mRenderPathTracer.setLabel("Render with Path Tracer"); - mRenderRaster.setLabel("Render with Raster"); - mRenderDeNoise.setLabel("Denoise (IntelOpenImage)"); + mRenderPathTracer.setText("Render with Path Tracer"); + mRenderRaster.setText("Render with Raster"); + mRenderDeNoise.setText("Denoise (IntelOpenImage)"); - mRenderMenu.addWidgetToMenu(&mRenderPathTracer); - mRenderMenu.addWidgetToMenu(&mRenderRaster); - mRenderMenu.addWidgetToMenu(&mRenderDeNoise); + mRenderMenu.addToMenu(&mRenderPathTracer); + mRenderMenu.addToMenu(&mRenderRaster); + mRenderMenu.addToMenu(&mRenderDeNoise); - mRenderMenu.setLabel("Render"); + mRenderMenu.setText("Render"); } // Navigation { - mNavigationPan.setLabel("Pan"); - mNavigationOrbit.setLabel("Orbit"); - mNavigationZoom.setLabel("Zoom"); - mNavigationReset.setLabel("Reset"); + mNavigationPan.setText("Pan"); + mNavigationOrbit.setText("Orbit"); + mNavigationZoom.setText("Zoom"); + mNavigationReset.setText("Reset"); - mNavigationMenu.addWidgetToMenu(&mNavigationPan); - mNavigationMenu.addWidgetToMenu(&mNavigationOrbit); - mNavigationMenu.addWidgetToMenu(&mNavigationZoom); - mNavigationMenu.addWidgetToMenu(&mNavigationReset); + mNavigationMenu.addToMenu(&mNavigationPan); + mNavigationMenu.addToMenu(&mNavigationOrbit); + mNavigationMenu.addToMenu(&mNavigationZoom); + mNavigationMenu.addToMenu(&mNavigationReset); - mNavigationMenu.setLabel("Navigation"); + mNavigationMenu.setText("Navigation"); } - mRenderPathTracer.mCallback = [this]() { + mRenderPathTracer.setAction([this]() { mEditor->renderPathFrame(); mEditor->setRenderType(Editor::RenderType::PATH_TRACER); - }; + }); - mRenderRaster.mCallback = [this]() { mEditor->setRenderType(Editor::RenderType::RASTER); }; - mRenderDeNoise.mCallback = [this]() { mEditor->denoisePathRenderBuffers(); }; - mNavigationOrbit.mCallback = [this]() { mNavigationType = ORBIT; }; - mNavigationPan.mCallback = [this]() { mNavigationType = PAN; }; - mNavigationZoom.mCallback = [this](){ mNavigationType = ZOOM; }; - mNavigationReset.mCallback = [this]() { mEditor->navigationReset(); }; + mRenderRaster.setAction( [this]() { mEditor->setRenderType(Editor::RenderType::RASTER); }); + mRenderDeNoise.setAction( [this]() { mEditor->denoisePathRenderBuffers(); }); + mNavigationOrbit.setAction( [this]() { mNavigationType = ORBIT; }); + mNavigationPan.setAction( [this]() { mNavigationType = PAN; }); + mNavigationZoom.setAction( [this](){ mNavigationType = ZOOM; }); + mNavigationReset.setAction( [this]() { mEditor->navigationReset(); }); } - void eventProcess(const Events& events) override { - // navigation - { - const auto& activeArea = mViewport.mArea; - if (mViewport.isHolding()) { - switch (mNavigationType) { - case ORBIT: mEditor->navigationOrbit(events.getPointerDelta() / activeArea.size * 3); break; + void process(const EventHandler& events) override { + DockWidget::process(events); - case PAN: - { - auto pointer = (((events.getPointer() - activeArea.pos) / activeArea.size) - 0.5f) * 2; - auto prevPointer = (((events.getPointerPrev() - activeArea.pos) / activeArea.size) - 0.5f) * 2; - mEditor->navigationPan(prevPointer, pointer); - } - break; + auto pointer = events.getPointer(); + auto pointerPrev = events.getPointerPrev(); - case ZOOM: mEditor->navigationZoom(1 + (events.getPointerDelta().y / activeArea.size.y)); break; - } + const auto& activeArea = mViewport.getArea(); + + if (activeArea.isInside(pointer) && events.isDown(InputID::MOUSE1)) { + switch (mNavigationType) { + case ORBIT: mEditor->navigationOrbit(events.getPointerDelta() / activeArea.size * 3); break; + + case PAN: + { + auto pointerRelative = (((pointer - activeArea.pos) / activeArea.size) - 0.5f) * 2; + auto prevPointerRelative = (((pointerPrev - activeArea.pos) / activeArea.size) - 0.5f) * 2; + mEditor->navigationPan(prevPointerRelative, pointerRelative); + } + break; + + case ZOOM: mEditor->navigationZoom(1 + (events.getPointerDelta().y / activeArea.size.y)); break; } } - - WorkspaceWidget::eventProcess(events); } - void eventDraw(Canvas& canvas) override { canvas.rect(this->mArea, mBaseColor); } - - void eventUpdateConfiguration(WidgetManager& wm) override { - wm.setActiveId("3DEditor"); - mBaseColor = wm.getColor("Base", "Base"); - } + void draw(Canvas& canvas) override { canvas.rect(getArea().relative(), mBaseColor); } public: Editor* mEditor = nullptr; - // SplitView mSplitView; - ViewportWidget mViewport; - // ScrollableWindow mSettingsWidget; + + FloatingMenu mPanel; // Controls - FloatingWidget mRenderMenu; + FloatingMenu mRenderMenu; ButtonWidget mRenderPathTracer; ButtonWidget mRenderRaster; ButtonWidget mRenderDeNoise; @@ -129,7 +131,7 @@ namespace tp { // Navigation enum NavigationType { ORBIT, PAN, ZOOM } mNavigationType = ORBIT; - FloatingWidget mNavigationMenu; + FloatingMenu mNavigationMenu; ButtonWidget mNavigationPan; ButtonWidget mNavigationOrbit; ButtonWidget mNavigationZoom; diff --git a/CMakeLists.txt b/CMakeLists.txt index c47acef..a8086b5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,7 +20,6 @@ add_subdirectory(Graphics) add_subdirectory(DataAnalysis) add_subdirectory(Objects) add_subdirectory(Widgets) -add_subdirectory(WidgetsNew) add_subdirectory(LibraryViewer) add_subdirectory(RasterRender) add_subdirectory(3DScene) diff --git a/Graphics/private/Canvas.cpp b/Graphics/private/Canvas.cpp index cb91af2..c4b118d 100644 --- a/Graphics/private/Canvas.cpp +++ b/Graphics/private/Canvas.cpp @@ -117,6 +117,10 @@ void Canvas::popClamp() { } } +const RectF& Canvas::getClampedArea() const { + return mScissors.last(); +} + void Canvas::text( const char* string, const RectF& aRec, halnf size, Align align, halnf marging, const RGBA& col ) { diff --git a/Graphics/public/Graphics.hpp b/Graphics/public/Graphics.hpp index 9cd3507..c193080 100644 --- a/Graphics/public/Graphics.hpp +++ b/Graphics/public/Graphics.hpp @@ -59,6 +59,7 @@ namespace tp { void pushClamp(const RectF& rec); void popClamp(); + const RectF& getClampedArea() const; void debugCross(RectF rec, const RGBA& col); void rect(RectF rec, const RGBA& col, halnf round = 0); diff --git a/LibraryViewer/applications/Entry.cpp b/LibraryViewer/applications/Entry.cpp index 8de5b87..ad43539 100644 --- a/LibraryViewer/applications/Entry.cpp +++ b/LibraryViewer/applications/Entry.cpp @@ -1,10 +1,10 @@ #include "GUI.hpp" -#include "GraphicApplication.hpp" +#include "WidgetApplication.hpp" using namespace tp; -class LibraryViewer : public Application { +class LibraryViewer : public WidgetApplication { public: LibraryViewer() : gui(&library, &player) { @@ -12,24 +12,14 @@ public: library.checkExisting(); gui.updateTracks(); + + setRoot(&gui); } - void processFrame(EventHandler* eventHandler, halnf delta) override { - auto rec = RectF{ { 0, 0 }, mWindow->getSize() }; - - gui.setVisible(true); - gui.setArea(rec); - gui.updateConfigWrapper(mWidgetManager); - gui.procWrapper(*eventHandler, rec); - } - - void drawFrame(Canvas* canvas) override { gui.drawWrapper(*canvas); } - private: Player player; Library library; - tp::WidgetManager mWidgetManager; LibraryWidget gui; }; diff --git a/LibraryViewer/private/Library.cpp b/LibraryViewer/private/Library.cpp index d94ea1b..a0127cd 100644 --- a/LibraryViewer/private/Library.cpp +++ b/LibraryViewer/private/Library.cpp @@ -1,7 +1,6 @@ #include "Library.hpp" #include "LocalConnection.hpp" -#include "WidgetBase.hpp" #include "picojson.h" #include diff --git a/LibraryViewer/public/GUI.hpp b/LibraryViewer/public/GUI.hpp index e99079e..9ab1060 100644 --- a/LibraryViewer/public/GUI.hpp +++ b/LibraryViewer/public/GUI.hpp @@ -2,7 +2,8 @@ #include "Library.hpp" #include "Player.hpp" -#include "Widgets.hpp" +#include "FloatingWidget.hpp" +#include "DockWidget.hpp" #include "imgui.h" @@ -10,54 +11,83 @@ namespace tp { class TrackWidget : public Widget { public: - explicit TrackWidget(const Track* track = nullptr) : - mTrack(track) { - this->mArea.w = 70; - col.mColor.setAnimTime(0); - col.mColor.setNoTransition({ 0.15f, 0.15f, 0.15f, 0.f }); + enum State { + IDLE, + HOVER, + SELECTED, }; - void eventProcess(const Events& events) override { - mSelected = false; - if (!mTrack) return; - if (this->mArea.isInside(events.getPointer())) { - col.set({ 0.15f, 0.15f, 0.15f, 1.f }); - mSelected = events.isReleased(InputID::MOUSE1); - } else { - col.set({ 0.15f, 0.15f, 0.15f, 0.f }); + explicit TrackWidget(const Track* track = nullptr) : + mTrack(track) { + + getLayout()->setMinSize({ 70, 70 }); + }; + + void process(const EventHandler& events) override { + mState = IDLE; + + if (!mTrack) { + mState = IDLE; + return; + } + + switch (mState) { + case HOVER: + case IDLE: + mState = getArea().relative().isInside(events.getPointer()) ? HOVER : IDLE; + if (events.isPressed(InputID::MOUSE1)) { + mState = SELECTED; + } + break; + + case SELECTED: + break; } } - void eventDraw(Canvas& canvas) override { + void draw(Canvas& canvas) override { if (!mTrack) return; + auto area = getArea().relative(); - canvas.rect(this->mArea, col.get(), 4.f); + switch (mState) { + case IDLE: canvas.rect(area, colorIdle, rounding); break; + case HOVER: canvas.rect(area, colorHover, rounding); break; + case SELECTED: canvas.rect(area, colorSelected, rounding); break; + } - const RectF imageArea = { - this->mArea.x + margin, this->mArea.y + margin, this->mArea.w - margin * 2, this->mArea.w - margin * 2 + + const RectF imageArea = { area.x + margin, area.y + margin, area.w - margin * 2, area.w - margin * 2 }; + canvas.rect(imageArea, colorImage, rounding); + + const RectF textArea = { + area.x + area.w + margin, area.y + margin, area.z - area.w - margin * 2, area.w - margin * 2 }; - canvas.rect(imageArea, { 0.25f, 0.25f, 0.25f, 1.f }, 4.f); - - const RectF textArea = { this->mArea.x + this->mArea.w + margin, - this->mArea.y + margin, - this->mArea.z - this->mArea.w - margin * 2, - this->mArea.w - margin * 2 }; - // canvas.rect(textArea, { 0.25f, 0.25f, 0.25f, 1.f }, 4.f); const RectF textAreaName = { textArea.x, textArea.y, textArea.z, textArea.w * 0.5f }; const RectF textAreaAuthor = { textArea.x, textArea.y + textArea.w * 0.5f, textArea.z, textArea.w * 0.5f }; - canvas.text(mTrack->mName.c_str(), textAreaName, 15.f, Canvas::LC, 4.f, { 0.9f, 0.9f, 0.9f, 1.f }); - canvas.text(mTrack->mArtist.c_str(), textAreaAuthor, 12.f, Canvas::LC, 4.f, { 0.8f, 0.8f, 0.8f, 1.f }); + canvas.text(mTrack->mName.c_str(), textAreaName, 15.f, Canvas::LC, rounding, colorNameTrack); + canvas.text(mTrack->mArtist.c_str(), textAreaAuthor, 12.f, Canvas::LC, rounding, colorNameArtist); } + [[nodiscard]] bool processesEvents() const override { return true; } + public: - halnf margin = 5.f; - AnimColor col; const Track* mTrack; - bool mSelected = false; + State mState = IDLE; + + private: + halnf margin = 5.f; + halnf rounding = 5.f; + + RGBA colorIdle = 0; + RGBA colorNameTrack = { 0.9f, 0.9f, 0.9f, 1.f }; + RGBA colorNameArtist = { 0.8f, 0.8f, 0.8f, 1.f }; + RGBA colorImage = { 0.5, 0.5, 0.5, 1.0 }; + RGBA colorHover = { 0.13, 0.13, 0.13, 0.9 }; + RGBA colorSelected = { 0.43, 0.43, 0.43, 0.9 }; }; class TrackInfoWidget : public Widget { @@ -74,21 +104,23 @@ namespace tp { items.append({ "Date Last Played" }); } - void eventDraw(Canvas&) override { + void draw(Canvas&) override { if (!mTrack) return; // canvas.rect(this->mArea, { 0.13f, 0.13f, 0.13f, 1.f }, 4.f); renderUI(); } void renderUI() { - ImGui::SetNextWindowPos({ this->mArea.x, this->mArea.y }); - ImGui::SetNextWindowSize({ this->mArea.z, this->mArea.w }); + // auto area = getArea(); + + // ImGui::SetNextWindowPos({ area.x, this->mArea.y }); + // ImGui::SetNextWindowSize({ area.z, this->mArea.w }); ImGui::Begin( "InfoWindow", - nullptr, - ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoBackground | - ImGuiWindowFlags_NoResize + nullptr //, + //ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoBackground | + // ImGuiWindowFlags_NoResize ); if (mTrack) { @@ -184,18 +216,18 @@ namespace tp { int filterExisting = 0; // all existing no-existing }; - class LibraryWidget : public WorkspaceWidget { + class LibraryWidget : public DockWidget { public: LibraryWidget(Library* lib, Player* player) { mLibrary = (lib); mPlayer = (player); - updateTracks(); + // updateTracks(); mCurrentTrackInfo.mPlayer = mPlayer; - mDockSpace.setCenterWidget(&mSongList); - mDockSpace.addSideWidget(&mCurrentTrackInfo, DockWidget::RIGHT); + setCenterWidget(&mSongList); + dockWidget(&mCurrentTrackInfo, DockLayout::RIGHT); // this->mChildWidgets.pushBack(&mCurrentTrackInfo); // this->mChildWidgets.pushBack(&mCurrentTrack); @@ -203,24 +235,30 @@ namespace tp { void updateTracks() { mTracks.clear(); + + for (auto track : mTracks) { + delete track.data(); + } + for (auto track : mLibrary->mTraks) { - mTracks.append(TrackWidget(&track.data())); + mTracks.append(new TrackWidget(&track.data())); } } - void eventProcess(const Events& events) override { + void process(const EventHandler& events) override { filter(); for (auto track : mSongList.getContent()) { - auto trackWidget = (TrackWidget*) track.data(); - if (trackWidget->mSelected) { - mCurrentTrackInfo.mTrack = trackWidget->mTrack; + if (auto trackWidget = dynamic_cast(track.data())) { + if (trackWidget->mState == TrackWidget::SELECTED) { + mCurrentTrackInfo.mTrack = trackWidget->mTrack; + } } } // mCurrentTrack.proc(events, this->mArea, mSplitView.getFirst()); - WorkspaceWidget::eventProcess(events); + DockWidget::process(events); } // void eventDraw(Canvas& canvas) override { @@ -230,7 +268,7 @@ namespace tp { void filter() { if (!mCurrentTrackInfo.isSongFilterChanged) return; - mSongList.clearContent(); + mSongList.clearChildren(); for (auto track : mTracks) { if (!mCurrentTrackInfo.songFilter.PassFilter(track->mTrack->mName.c_str()) && @@ -252,7 +290,7 @@ namespace tp { break; } - mSongList.addWidget(&track.data()); + mSongList.addToMenu(track.data()); } mCurrentTrackInfo.isSongFilterChanged = false; @@ -262,9 +300,9 @@ namespace tp { Library* mLibrary = nullptr; Player* mPlayer = nullptr; - Buffer mTracks; + Buffer mTracks; - ScrollableWindow mSongList; + FloatingMenu mSongList; TrackInfoWidget mCurrentTrackInfo; TrackWidget mCurrentTrack; }; diff --git a/Sketch3D/applications/Entry.cpp b/Sketch3D/applications/Entry.cpp index 4e9d353..db4d6af 100644 --- a/Sketch3D/applications/Entry.cpp +++ b/Sketch3D/applications/Entry.cpp @@ -1,29 +1,19 @@ -#include "GraphicApplication.hpp" +#include "WidgetApplication.hpp" #include "Sketch3D.hpp" #include "Sketch3DWidget.hpp" using namespace tp; -class Sketch3DApplication : public Application { +class Sketch3DApplication : public WidgetApplication { public: Sketch3DApplication() : - mGui(*mGraphics->getCanvas(), { 1920, 1080 }) {} - - void processFrame(EventHandler* eventHandler, halnf delta) override { - auto rec = RectF({ 0, 0 }, mWindow->getSize()); - - mGui.setVisible(true); - mGui.setArea(rec); - mGui.updateConfigWrapper(mWidgetManager); - mGui.procWrapper(*eventHandler, rec); + mGui(*mGraphics->getCanvas(), { 1920, 1080 }) { + setRoot(&mGui); } - void drawFrame(Canvas* canvas) override { mGui.drawWrapper(*canvas); } - private: - WidgetManager mWidgetManager; Sketch3DGUI mGui; }; diff --git a/Sketch3D/public/Sketch3DWidget.hpp b/Sketch3D/public/Sketch3DWidget.hpp index 3ff027a..9859525 100644 --- a/Sketch3D/public/Sketch3DWidget.hpp +++ b/Sketch3D/public/Sketch3DWidget.hpp @@ -1,7 +1,9 @@ #pragma once #include "Sketch3D.hpp" -#include "Widgets.hpp" +#include "Widget.hpp" +#include "DockWidget.hpp" +#include "FloatingWidget.hpp" namespace tp { @@ -17,30 +19,31 @@ namespace tp { ~Sketch3DWidget() { mCanvas->deleteImageHandle(mImage); } - void eventProcess(const Events& events) override { - if (!this->mArea.isInside(events.getPointer())) { + void process(const EventHandler& events) override { + auto area = getArea().relative(); + + Vec2F pointer = events.getPointer(); + auto crs = events.getPointer(); + + if (!area.isInside(events.getPointer())) { return; } - auto crs = (events.getPointer() - this->mArea.pos); - crs.x /= this->mArea.z; - crs.y /= this->mArea.w; + crs.x /= area.z; + crs.y /= area.w; crs = (crs - 0.5) * 2; - // TODO : make better api for events - Vec2F absolutePos = events.getPointer() - this->mArea.pos; - if (events.isPressed(InputID::MOUSE1)) { mAction = true; } else if (events.isReleased(InputID::MOUSE1)) { mAction = false; } - Vec2F relativePos = ((absolutePos / this->mArea.size) - 0.5f) * 2.f; - Vec2F relativePosPrev = ((mActionPosAbsolutePrev / this->mArea.size) - 0.5f) * 2.f; + Vec2F relativePos = ((pointer / area.size) - 0.5f) * 2.f; + Vec2F relativePosPrev = ((mActionPosAbsolutePrev / area.size) - 0.5f) * 2.f; Vec2F relativeDelta = relativePos - relativePosPrev; - mProject.mCamera.setRatio(this->mArea.w / this->mArea.z); + mProject.mCamera.setRatio(area.w / area.z); switch (mMode) { case Mode::MOVE: @@ -50,7 +53,7 @@ namespace tp { } case Mode::ZOOM: { - halnf factor = absolutePos.y / mActionPosAbsolutePrev.y; + halnf factor = pointer.y / mActionPosAbsolutePrev.y; if (mAction) mProject.mCamera.zoom(factor); break; } @@ -61,22 +64,25 @@ namespace tp { } case Mode::DRAW: { - mProject.sample(events.getPointerPressure(), this->mArea.w / this->mArea.z, crs); + mProject.sample(events.getPointerPressure(), area.w / area.z, crs); break; } default: break; } - mActionPosAbsolutePrev = absolutePos; + mActionPosAbsolutePrev = pointer; } - void eventDraw(Canvas& canvas) override { - mRenderer.renderToTexture(&mProject, this->mArea.size); - canvas.drawImage(this->mArea, &mImage, 0, 1, 12); + void draw(Canvas& canvas) override { + auto area = getArea().relative(); + mRenderer.renderToTexture(&mProject, area.size); + canvas.drawImage(area, &mImage, 0, 1, 12); } void setColor(const RGBA& color) { ((PencilBrush*) mProject.mBrushes.get("pencil"))->mCol = color; } + [[nodiscard]] bool processesEvents() const override { return true; } + public: enum class Mode { MOVE, ROTATE, ZOOM, DRAW, NONE } mMode = Mode::NONE; @@ -90,62 +96,72 @@ namespace tp { Canvas* mCanvas = nullptr; }; - - class Sketch3DGUI : public WorkspaceWidget { + class Sketch3DGUI : public DockWidget { public: - Sketch3DGUI(Canvas& canvas, Vec2F renderResolution) : - mViewport(canvas, renderResolution) - { + explicit Sketch3DGUI(Canvas& canvas, Vec2F renderResolution) : + DockWidget(), + mViewport(canvas, renderResolution) { - mControls.addWidgetToMenu(&mDrawButton); - mControls.addWidgetToMenu(&mMoveButton); - mControls.addWidgetToMenu(&mRotateButton); - mControls.addWidgetToMenu(&mZoomButton); + mControls.addToMenu(&mDrawButton); + mControls.addToMenu(&mMoveButton); + mControls.addToMenu(&mRotateButton); + mControls.addToMenu(&mZoomButton); - mColorPicker.addWidgetToMenu(&mRed); - mColorPicker.addWidgetToMenu(&mGreen); - mColorPicker.addWidgetToMenu(&mBlue); + mColorPicker.addToMenu(&mRed); + mColorPicker.addToMenu(&mGreen); + mColorPicker.addToMenu(&mBlue); - mDockSpace.setCenterWidget(&mViewport); + setCenterWidget(&mViewport); - mFloatingLayer.mChildWidgets.pushBack(&mControls); - mFloatingLayer.mChildWidgets.pushBack(&mColorPicker); + mPanel.addToMenu(&mControls); + mPanel.addToMenu(&mColorPicker); + + // addChild(&mPanel); + dockWidget(&mPanel, DockLayout::RIGHT); + + mDrawButton.setAction([this]() { mViewport.mMode = Sketch3DWidget::Mode::DRAW; }); + mMoveButton.setAction([this]() { mViewport.mMode = Sketch3DWidget::Mode::MOVE; }); + mRotateButton.setAction([this]() { mViewport.mMode = Sketch3DWidget::Mode::ROTATE; }); + mZoomButton.setAction([this]() { mViewport.mMode = Sketch3DWidget::Mode::ZOOM; }); + + mDrawButton.setText("Draw"); + mMoveButton.setText("Pan"); + mRotateButton.setText("Orbit"); + mZoomButton.setText("Zoom"); + + mPanel.setText("Controls"); + mControls.setText("Tools"); + mColorPicker.setText("Color"); + + mPanel.setArea({110, 110, 300, 500 }); + mControls.setArea({0, 0, 300, 400 }); + mColorPicker.setArea({0, 0, 300, 300 }); - mDrawButton.mCallback = [this]() { mViewport.mMode = Sketch3DWidget::Mode::DRAW; }; - mMoveButton.mCallback = [this]() { mViewport.mMode = Sketch3DWidget::Mode::MOVE; }; - mRotateButton.mCallback = [this]() { mViewport.mMode = Sketch3DWidget::Mode::ROTATE; }; - mZoomButton.mCallback = [this]() { mViewport.mMode = Sketch3DWidget::Mode::ZOOM; }; } - void eventProcess(const Events& events) override { - WorkspaceWidget::eventProcess(events); + void process(const EventHandler& events) override { + DockWidget::process(events); - mViewport.setColor(RGBA(mRed.mSlider.mFactor, mGreen.mSlider.mFactor, mBlue.mSlider.mFactor, 1.f)); + mViewport.setColor(RGBA(mRed.val(), mGreen.val(), mBlue.val(), 1.f)); } - void eventDraw(Canvas& canvas) override { canvas.rect(this->mArea, mBackgroundColor, mRounding); } - - void eventUpdateConfiguration(WidgetManager& wm) override { - wm.setActiveId("Sketch3DGui"); - - mBackgroundColor = wm.getColor("Background", "Background"); - mRounding = wm.getNumber("Rounding", "Rounding"); - } + void draw(Canvas& canvas) override { canvas.rect(getArea().relative(), mBackgroundColor, mRounding); } private: Sketch3DWidget mViewport; - ScrollableWindow mOptions; - FloatingWidget mControls; - ButtonWidget mDrawButton = ButtonWidget("Draw", { 0, 0, 100, 30 }); - ButtonWidget mMoveButton = ButtonWidget("Pan", { 0, 0, 100, 30 }); - ButtonWidget mRotateButton = ButtonWidget("Orbit", { 0, 0, 100, 30 }); - ButtonWidget mZoomButton = ButtonWidget("Zoom", { 0, 0, 100, 30 }); + FloatingMenu mPanel; - FloatingWidget mColorPicker; - NamedSliderWidget mRed = NamedSliderWidget("Red"); - NamedSliderWidget mGreen = NamedSliderWidget("Green"); - NamedSliderWidget mBlue = NamedSliderWidget("Blue"); + FloatingMenu mControls; + ButtonWidget mDrawButton; + ButtonWidget mMoveButton; + ButtonWidget mRotateButton; + ButtonWidget mZoomButton; + + FloatingMenu mColorPicker; + SliderWidget mRed; + SliderWidget mGreen; + SliderWidget mBlue; RGBA mBackgroundColor; halnf mRounding = 0; diff --git a/Widgets/CMakeLists.txt b/Widgets/CMakeLists.txt index dc1b591..126d59f 100644 --- a/Widgets/CMakeLists.txt +++ b/Widgets/CMakeLists.txt @@ -5,17 +5,13 @@ file(GLOB SOURCES "./private/*.cpp" "./private/*/*.cpp") file(GLOB HEADERS "./public/*.hpp") add_library(${PROJECT_NAME} STATIC ${SOURCES} ${HEADERS}) -target_include_directories(${PROJECT_NAME} PUBLIC ./public/) +target_include_directories(${PROJECT_NAME} PUBLIC ./public/ ./public/layouts ./public/mangers ./public/widgets) target_link_libraries(${PROJECT_NAME} PUBLIC Math Graphics Imgui) ### -------------------------- Applications -------------------------- ### -add_executable(SimpleGui examples/SimpleGUI.cpp) -target_link_libraries(SimpleGui ${PROJECT_NAME} ${GLEW_LIB}) -target_include_directories(SimpleGui PUBLIC ../Externals/glfw/include ${GLEW_INCLUDE_DIR}) - -add_executable(ChatGui examples/ChatGUI.cpp) -target_link_libraries(ChatGui ${PROJECT_NAME} ${GLEW_LIB}) -target_include_directories(ChatGui PUBLIC ../Externals/glfw/include ${GLEW_INCLUDE_DIR}) +add_executable(Widgets2Example examples/Example.cpp) +target_link_libraries(Widgets2Example ${PROJECT_NAME} ${GLEW_LIB}) +target_include_directories(Widgets2Example PUBLIC ../Externals/glfw/include ${GLEW_INCLUDE_DIR}) file(COPY "examples/Font.ttf" DESTINATION "${CMAKE_BINARY_DIR}/${PROJECT_NAME}/") \ No newline at end of file diff --git a/WidgetsNew/examples/Example.cpp b/Widgets/examples/Example.cpp similarity index 85% rename from WidgetsNew/examples/Example.cpp rename to Widgets/examples/Example.cpp index 4fcb4d7..288d1b1 100644 --- a/WidgetsNew/examples/Example.cpp +++ b/Widgets/examples/Example.cpp @@ -1,5 +1,5 @@ -#include "GraphicApplication.hpp" +#include "WidgetApplication.hpp" #include "RootWidget.hpp" #include "FloatingWidget.hpp" @@ -10,10 +10,10 @@ using namespace tp; -class WidgetApplication : public Application { +class Example : public WidgetApplication { public: - WidgetApplication() { - exampleBasic(); + Example() { + exampleScrolling(); } void exampleAll() { @@ -33,7 +33,7 @@ public: menus[0].addToMenu(&menu); } - mRootWidget.setRootWidget(&dock); + setRoot(&dock); } void exampleBasic() { @@ -46,7 +46,7 @@ public: widget.addChild(&button); widget.addChild(&slider); - mRootWidget.setRootWidget(&widget); + setRoot(&widget); } void exampleScrolling() { @@ -55,7 +55,7 @@ public: static ButtonWidget buttons[10]; static ScrollableBarWidget scrollBar; - mRootWidget.setRootWidget(&widget); + setRoot(&widget); widget.addChild(&scrollBar); widget.addChild(&content); @@ -91,7 +91,7 @@ public: RootWidget::setWidgetArea(openButton, { 333, 333, 222, 222 }); - mRootWidget.setRootWidget(&root); + setRoot(&root); } void exampleNestedMenus() { @@ -100,7 +100,7 @@ public: static FloatingMenu menu2; static ButtonWidget buttons[15]; - mRootWidget.setRootWidget(&dock); + setRoot(&dock); dock.addChild(&menu1); dock.addChild(&menu2); @@ -140,7 +140,7 @@ public: static Widget widgets[15]; static ButtonWidget buttons[15]; - mRootWidget.setRootWidget(&widgets[0]); + setRoot(&widgets[0]); widgets[0].addChild(&widgets[1]); @@ -173,7 +173,7 @@ public: static FloatingMenu menu2; static ButtonWidget buttons[15]; - mRootWidget.setRootWidget(&dock); + setRoot(&dock); dock.addChild(&menu2); dock.addChild(&menu1); @@ -203,29 +203,11 @@ public: RootWidget::setWidgetArea(menu2, { 300, 100, 150, 500 }); RootWidget::setWidgetArea(menu1, { 100, 100, 150, 300 }); } - - void processFrame(EventHandler* eventHandler, halnf deltaTime) override { - const auto rec = RectF({ 0, 0 }, mWindow->getSize()); - mRootWidget.processFrame(eventHandler, rec); - } - - void drawFrame(Canvas* canvas) override { - mRootWidget.drawFrame(*canvas); - - // drawDebug(); - } - - bool forceNewFrame() override { - return mRootWidget.needsUpdate(); - } - -private: - RootWidget mRootWidget; }; int main() { { - WidgetApplication gui; + Example gui; gui.run(); } } diff --git a/WidgetsNew/private/Layout.cpp b/Widgets/private/Layout.cpp similarity index 100% rename from WidgetsNew/private/Layout.cpp rename to Widgets/private/Layout.cpp diff --git a/WidgetsNew/private/RootWidget.cpp b/Widgets/private/RootWidget.cpp similarity index 91% rename from WidgetsNew/private/RootWidget.cpp rename to Widgets/private/RootWidget.cpp index bdb232c..1203b58 100644 --- a/WidgetsNew/private/RootWidget.cpp +++ b/Widgets/private/RootWidget.cpp @@ -80,10 +80,12 @@ void RootWidget::drawRecursion(Canvas& canvas, Widget* active, const Vec2F& pos) canvas.setOrigin(pos); canvas.pushClamp({ pos, active->getArea().size }); - active->draw(canvas); + if (canvas.getClampedArea().size.length2() > EPSILON) { + active->draw(canvas); - for (auto child = active->mDepthOrder.lastNode(); child; child = child->prev) { - drawRecursion(canvas, child->data, pos + child->data->getArea().pos); + for (auto child = active->mDepthOrder.lastNode(); child; child = child->prev) { + drawRecursion(canvas, child->data, pos + child->data->getArea().pos); + } } canvas.setOrigin(pos); @@ -150,3 +152,4 @@ void RootWidget::closePopup(Widget* widget) { void RootWidget::lockFocus(Widget* widget) { mUpdateManager.lockFocus(widget); } void RootWidget::freeFocus(Widget* widget) { mUpdateManager.freeFocus(widget); } +bool RootWidget::isDebug() const { return gDebugWidget.isDebug(); } diff --git a/WidgetsNew/private/Widget.cpp b/Widgets/private/Widget.cpp similarity index 97% rename from WidgetsNew/private/Widget.cpp rename to Widgets/private/Widget.cpp index 5f74899..5b7dc2c 100644 --- a/WidgetsNew/private/Widget.cpp +++ b/Widgets/private/Widget.cpp @@ -51,6 +51,11 @@ void Widget::removeChild(Widget* child) { child->triggerWidgetUpdate("parent changed"); } +void Widget::clear() { + mChildren.clear(); + mDepthOrder.removeAll(); +} + void Widget::endAnimations() { mArea.endAnimation(); } bool Widget::processesEvents() const { return false; } void Widget::updateAnimations() { mArea.updateCurrentRect(); } diff --git a/Widgets/private/WidgetApplication.cpp b/Widgets/private/WidgetApplication.cpp new file mode 100644 index 0000000..9f0e99d --- /dev/null +++ b/Widgets/private/WidgetApplication.cpp @@ -0,0 +1,10 @@ +#include "WidgetApplication.hpp" + +#include "imgui.h" + +using namespace tp; + +void WidgetApplication::debugUI() { + ImGui::Text("Proc ms : %i", (int) mProcTime); + ImGui::SameLine(); ImGui::Text("Draw ms : %i", (int) mDrawTime); +} diff --git a/WidgetsNew/private/layouts/BasicLayout.cpp b/Widgets/private/layouts/BasicLayout.cpp similarity index 100% rename from WidgetsNew/private/layouts/BasicLayout.cpp rename to Widgets/private/layouts/BasicLayout.cpp diff --git a/WidgetsNew/private/layouts/DockLayout.cpp b/Widgets/private/layouts/DockLayout.cpp similarity index 99% rename from WidgetsNew/private/layouts/DockLayout.cpp rename to Widgets/private/layouts/DockLayout.cpp index adcf48e..e4c60d7 100644 --- a/WidgetsNew/private/layouts/DockLayout.cpp +++ b/Widgets/private/layouts/DockLayout.cpp @@ -169,7 +169,7 @@ void DockLayout::calculateHeaderAreas() { } } -ualni DockLayout::getVisibleSidesSize() { +ualni DockLayout::getVisibleSidesSize() const { ualni out = 0; for (ualni i = 0; i < 4; i++) { if (isSideVisible(Side(i))) out++; diff --git a/WidgetsNew/private/layouts/FloatingLayout.cpp b/Widgets/private/layouts/FloatingLayout.cpp similarity index 100% rename from WidgetsNew/private/layouts/FloatingLayout.cpp rename to Widgets/private/layouts/FloatingLayout.cpp diff --git a/WidgetsNew/private/layouts/OverlayLayout.cpp b/Widgets/private/layouts/OverlayLayout.cpp similarity index 100% rename from WidgetsNew/private/layouts/OverlayLayout.cpp rename to Widgets/private/layouts/OverlayLayout.cpp diff --git a/WidgetsNew/private/layouts/ScrollableLayout.cpp b/Widgets/private/layouts/ScrollableLayout.cpp similarity index 100% rename from WidgetsNew/private/layouts/ScrollableLayout.cpp rename to Widgets/private/layouts/ScrollableLayout.cpp diff --git a/WidgetsNew/private/managers/DebugManager.cpp b/Widgets/private/managers/DebugManager.cpp similarity index 100% rename from WidgetsNew/private/managers/DebugManager.cpp rename to Widgets/private/managers/DebugManager.cpp diff --git a/WidgetsNew/private/managers/LayoutManager.cpp b/Widgets/private/managers/LayoutManager.cpp similarity index 100% rename from WidgetsNew/private/managers/LayoutManager.cpp rename to Widgets/private/managers/LayoutManager.cpp diff --git a/WidgetsNew/private/managers/UpdateManager.cpp b/Widgets/private/managers/UpdateManager.cpp similarity index 100% rename from WidgetsNew/private/managers/UpdateManager.cpp rename to Widgets/private/managers/UpdateManager.cpp diff --git a/WidgetsNew/private/widgets/AnimationTestWidget.cpp b/Widgets/private/widgets/AnimationTestWidget.cpp similarity index 100% rename from WidgetsNew/private/widgets/AnimationTestWidget.cpp rename to Widgets/private/widgets/AnimationTestWidget.cpp diff --git a/WidgetsNew/private/widgets/DockWidget.cpp b/Widgets/private/widgets/DockWidget.cpp similarity index 100% rename from WidgetsNew/private/widgets/DockWidget.cpp rename to Widgets/private/widgets/DockWidget.cpp diff --git a/WidgetsNew/private/widgets/FloatingWidget.cpp b/Widgets/private/widgets/FloatingWidget.cpp similarity index 95% rename from WidgetsNew/private/widgets/FloatingWidget.cpp rename to Widgets/private/widgets/FloatingWidget.cpp index 184867a..0a8579a 100644 --- a/WidgetsNew/private/widgets/FloatingWidget.cpp +++ b/Widgets/private/widgets/FloatingWidget.cpp @@ -69,4 +69,8 @@ FloatingMenu::FloatingMenu() : FloatingWidget() { // getLayout()->setLayoutPolicy(LayoutPolicy::Vertical); // mBodyLayout.getLayout()->setLayoutPolicy(LayoutPolicy::Vertical); -} \ No newline at end of file +} + +void FloatingMenu::setText(const std::string& text) { + mHeader.setText(text); +} diff --git a/WidgetsNew/private/widgets/ScrollableWidget.cpp b/Widgets/private/widgets/ScrollableWidget.cpp similarity index 100% rename from WidgetsNew/private/widgets/ScrollableWidget.cpp rename to Widgets/private/widgets/ScrollableWidget.cpp diff --git a/WidgetsNew/private/widgets/SimpleWidgets.cpp b/Widgets/private/widgets/SimpleWidgets.cpp similarity index 100% rename from WidgetsNew/private/widgets/SimpleWidgets.cpp rename to Widgets/private/widgets/SimpleWidgets.cpp diff --git a/WidgetsNew/public/Layout.hpp b/Widgets/public/Layout.hpp similarity index 96% rename from WidgetsNew/public/Layout.hpp rename to Widgets/public/Layout.hpp index a0c314d..2b437fe 100644 --- a/WidgetsNew/public/Layout.hpp +++ b/Widgets/public/Layout.hpp @@ -20,6 +20,7 @@ namespace tp { class WidgetLayout { friend class DebugManager; + friend class LayoutManager; public: explicit WidgetLayout(Widget* widget) { mWidget = widget; } @@ -62,5 +63,8 @@ namespace tp { Vec2 mSizePolicy = { SizePolicy::Fixed, SizePolicy::Fixed }; Vec2F mMinSize = { 50, 50 }; Vec2F mMaxSize = { FLT_MAX / 2, FLT_MAX / 2 }; + + private: + // RectF mPrevArea{}; }; } \ No newline at end of file diff --git a/WidgetsNew/public/RootWidget.hpp b/Widgets/public/RootWidget.hpp similarity index 96% rename from WidgetsNew/public/RootWidget.hpp rename to Widgets/public/RootWidget.hpp index d66b1b0..75f5dbd 100644 --- a/WidgetsNew/public/RootWidget.hpp +++ b/Widgets/public/RootWidget.hpp @@ -18,6 +18,8 @@ namespace tp { void setRootWidget(Widget* widget); static void setWidgetArea(Widget& widget, const RectF& rect); + [[nodiscard]] bool isDebug() const; + // Graphic Application Interface public: void processFrame(EventHandler* events, const RectF& screenArea); diff --git a/WidgetsNew/public/Widget.hpp b/Widgets/public/Widget.hpp similarity index 94% rename from WidgetsNew/public/Widget.hpp rename to Widgets/public/Widget.hpp index 1cf44f9..6c3ca28 100644 --- a/WidgetsNew/public/Widget.hpp +++ b/Widgets/public/Widget.hpp @@ -39,11 +39,18 @@ namespace tp { }; public: + Widget(const Widget&&) = delete; + Widget(const Widget&) = delete; + void operator=(const Widget&) = delete; + Widget(); virtual ~Widget(); void addChild(Widget* child, bool front = false); void removeChild(Widget* child); + void clear(); + + const List& getChildren() { return mDepthOrder; } void bringToFront(); void bringToBack(); diff --git a/Widgets/public/WidgetApplication.hpp b/Widgets/public/WidgetApplication.hpp new file mode 100644 index 0000000..3548c6e --- /dev/null +++ b/Widgets/public/WidgetApplication.hpp @@ -0,0 +1,49 @@ +#pragma once + +#include "GraphicApplication.hpp" +#include "RootWidget.hpp" +#include "Timing.hpp" + +namespace tp { + class WidgetApplication : public Application { + public: + WidgetApplication() = default; + + void setRoot(Widget* widget) { + mRootWidget.setRootWidget(widget); + } + + private: + void processFrame(EventHandler* eventHandler, halnf deltaTime) override { + const auto rec = RectF({ 0, 0 }, mWindow->getSize()); + + Timer timer; + mRootWidget.processFrame(eventHandler, rec); + mProcTime = timer.timePassed(); + } + + void drawFrame(Canvas* canvas) override { + Timer timer; + mRootWidget.drawFrame(*canvas); + mDrawTime = timer.timePassed(); + + if (mRootWidget.isDebug()) { + drawDebug(); + debugUI(); + } + } + + bool forceNewFrame() override { + return mRootWidget.needsUpdate(); + } + + private: + void debugUI(); + + private: + time_ms mProcTime = 0; + time_ms mDrawTime = 0; + + RootWidget mRootWidget; + }; +} \ No newline at end of file diff --git a/WidgetsNew/public/layouts/BasicLayout.hpp b/Widgets/public/layouts/BasicLayout.hpp similarity index 100% rename from WidgetsNew/public/layouts/BasicLayout.hpp rename to Widgets/public/layouts/BasicLayout.hpp diff --git a/WidgetsNew/public/layouts/DockLayout.hpp b/Widgets/public/layouts/DockLayout.hpp similarity index 97% rename from WidgetsNew/public/layouts/DockLayout.hpp rename to Widgets/public/layouts/DockLayout.hpp index 5853cbe..e5b49ab 100644 --- a/WidgetsNew/public/layouts/DockLayout.hpp +++ b/Widgets/public/layouts/DockLayout.hpp @@ -17,7 +17,7 @@ namespace tp { struct SideWidgetData { Widget* widget = nullptr; bool hidden = false; - halnf absoluteSize = 200; + halnf absoluteSize = 300; alni order = -1; Side side = { TOP }; @@ -76,7 +76,7 @@ namespace tp { const std::vector& getDockedWidgets(); private: - ualni getVisibleSidesSize(); + ualni getVisibleSidesSize() const; void calculateSideAreas(); void calculateResizeHandles(); diff --git a/WidgetsNew/public/layouts/FloatingLayout.hpp b/Widgets/public/layouts/FloatingLayout.hpp similarity index 100% rename from WidgetsNew/public/layouts/FloatingLayout.hpp rename to Widgets/public/layouts/FloatingLayout.hpp diff --git a/WidgetsNew/public/layouts/OverlayLayout.hpp b/Widgets/public/layouts/OverlayLayout.hpp similarity index 100% rename from WidgetsNew/public/layouts/OverlayLayout.hpp rename to Widgets/public/layouts/OverlayLayout.hpp diff --git a/WidgetsNew/public/layouts/ScrollableLayout.hpp b/Widgets/public/layouts/ScrollableLayout.hpp similarity index 100% rename from WidgetsNew/public/layouts/ScrollableLayout.hpp rename to Widgets/public/layouts/ScrollableLayout.hpp diff --git a/WidgetsNew/public/mangers/DebugManager.hpp b/Widgets/public/mangers/DebugManager.hpp similarity index 95% rename from WidgetsNew/public/mangers/DebugManager.hpp rename to Widgets/public/mangers/DebugManager.hpp index f33425d..938fd6f 100644 --- a/WidgetsNew/public/mangers/DebugManager.hpp +++ b/Widgets/public/mangers/DebugManager.hpp @@ -27,6 +27,8 @@ namespace tp { } } + [[nodiscard]] bool isDebug() const { return mDebug; } + private: void recursiveDraw(Canvas& canvas, Widget* active, const Vec2F& pos, int depthOrder); diff --git a/WidgetsNew/public/mangers/LayoutManager.hpp b/Widgets/public/mangers/LayoutManager.hpp similarity index 100% rename from WidgetsNew/public/mangers/LayoutManager.hpp rename to Widgets/public/mangers/LayoutManager.hpp diff --git a/WidgetsNew/public/mangers/UpdateManager.hpp b/Widgets/public/mangers/UpdateManager.hpp similarity index 100% rename from WidgetsNew/public/mangers/UpdateManager.hpp rename to Widgets/public/mangers/UpdateManager.hpp diff --git a/WidgetsNew/public/widgets/AnimationTestWidget.hpp b/Widgets/public/widgets/AnimationTestWidget.hpp similarity index 100% rename from WidgetsNew/public/widgets/AnimationTestWidget.hpp rename to Widgets/public/widgets/AnimationTestWidget.hpp diff --git a/WidgetsNew/public/widgets/DockWidget.hpp b/Widgets/public/widgets/DockWidget.hpp similarity index 100% rename from WidgetsNew/public/widgets/DockWidget.hpp rename to Widgets/public/widgets/DockWidget.hpp diff --git a/WidgetsNew/public/widgets/FloatingWidget.hpp b/Widgets/public/widgets/FloatingWidget.hpp similarity index 85% rename from WidgetsNew/public/widgets/FloatingWidget.hpp rename to Widgets/public/widgets/FloatingWidget.hpp index 5b19f02..71f1686 100644 --- a/WidgetsNew/public/widgets/FloatingWidget.hpp +++ b/Widgets/public/widgets/FloatingWidget.hpp @@ -39,6 +39,16 @@ namespace tp { mContentWidget.addChild(widget); } + const List& getContent() { + return mContentWidget.getChildren(); + } + + void clearChildren() { + mContentWidget.clear(); + } + + void setText(const std::string& text); + private: // VerticalLayout mMenuLayout; Widget mBodyLayout; diff --git a/WidgetsNew/public/widgets/ScrollableWidget.hpp b/Widgets/public/widgets/ScrollableWidget.hpp similarity index 100% rename from WidgetsNew/public/widgets/ScrollableWidget.hpp rename to Widgets/public/widgets/ScrollableWidget.hpp diff --git a/WidgetsNew/public/widgets/SimpleWidgets.hpp b/Widgets/public/widgets/SimpleWidgets.hpp similarity index 95% rename from WidgetsNew/public/widgets/SimpleWidgets.hpp rename to Widgets/public/widgets/SimpleWidgets.hpp index c618c96..b67ba75 100644 --- a/WidgetsNew/public/widgets/SimpleWidgets.hpp +++ b/Widgets/public/widgets/SimpleWidgets.hpp @@ -73,8 +73,10 @@ namespace tp { [[nodiscard]] bool processesEvents() const override { return true; } [[nodiscard]] bool needsNextFrame() const override { return mState != SLIDING; } + [[nodiscard]] halnf val() const { return mFactor; } + private: - RectF getHandleArea() const; + [[nodiscard]] RectF getHandleArea() const; private: halnf mFactor = 0; diff --git a/WidgetsNew/CMakeLists.txt b/WidgetsNew/CMakeLists.txt deleted file mode 100644 index ffeec33..0000000 --- a/WidgetsNew/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -project(WidgetsNew) - -### ---------------------- Static Library --------------------- ### -file(GLOB SOURCES "./private/*.cpp" "./private/*/*.cpp") -file(GLOB HEADERS "./public/*.hpp") - -add_library(${PROJECT_NAME} STATIC ${SOURCES} ${HEADERS}) -target_include_directories(${PROJECT_NAME} PUBLIC ./public/ ./public/layouts ./public/mangers ./public/widgets) -target_link_libraries(${PROJECT_NAME} PUBLIC Math Graphics Imgui) - -### -------------------------- Applications -------------------------- ### - -add_executable(Widgets2Example examples/Example.cpp) -target_link_libraries(Widgets2Example ${PROJECT_NAME} ${GLEW_LIB}) -target_include_directories(Widgets2Example PUBLIC ../Externals/glfw/include ${GLEW_INCLUDE_DIR}) - -file(COPY "examples/Font.ttf" DESTINATION "${CMAKE_BINARY_DIR}/${PROJECT_NAME}/") \ No newline at end of file