Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
5fc2802
feat(gui): input hit-testing, measure pass, z-order runs, typed slot …
MrChampz Aug 18, 2026
e18fdf2
feat(gui): clip stack, ScrollBox, and popup layers
MrChampz Aug 19, 2026
636866f
fix(gui): stop ForEachChild double-incrementing and skipping children
MrChampz Aug 19, 2026
8986404
test(gui): cover clip stack, ScrollBox, and popup layers
MrChampz Aug 19, 2026
7f69f03
fix(gui): make ComputeDesiredSize respect SSizeParam like LayoutChild…
MrChampz Aug 19, 2026
73376f9
feat(gui): unify Canvas/ScrollBox size API, clamp Canvas to available…
MrChampz Aug 20, 2026
6c71d55
fix(gui): draw widget outlines inset instead of bleeding outside geom…
MrChampz Aug 20, 2026
26b06a7
fix(gui): reserve scrollbar gutter in ScrollBox content measurement
MrChampz Aug 20, 2026
e3c2062
fix(gui): scale debug rect geometry by DPI in DebugRenderPass
MrChampz Aug 20, 2026
2744cbd
feat(gui): keyboard focus navigation (Tab/Shift+Tab, Escape, focus ring)
MrChampz Aug 20, 2026
a02b08f
fix(gui): drop the Manager's default focus ring
MrChampz Aug 20, 2026
1f14a31
feat(gui): TextField renders its own focus state
MrChampz Aug 20, 2026
1cd0f5a
feat(gui): per-widget visual state styling (Normal/Hovered/Pressed/Di…
MrChampz Aug 21, 2026
cdca939
fix(gui): make Outline/InsetShadow/DropShadow real per-layer style ov…
MrChampz Aug 21, 2026
8b7bf31
feat(gui): migrate Panel and TextField onto the shared StyleSet
MrChampz Aug 21, 2026
3039b0b
feat(gui): make Focused a real StyleSet layer
MrChampz Aug 21, 2026
8360a59
fix(gui): disabling the focused widget blocks keyboard input and Tab
MrChampz Aug 21, 2026
c0c2eb4
feat(gui): default Button/TextField styling to the chakra-ui subtle p…
MrChampz Aug 21, 2026
ff8ac6b
feat(gui): add typed widget style system
MrChampz Aug 22, 2026
a0541fb
fix(gui): inherit absent state appearances
MrChampz Aug 22, 2026
32781af
Add editor icon controls and clipping hit testing
MrChampz Aug 22, 2026
2effe63
Refactor icons into engine resources
MrChampz Aug 22, 2026
3fc7662
Move LunaSVG loader into platform layer
MrChampz Aug 22, 2026
f43cfca
Match editor menu bar layout
MrChampz Aug 22, 2026
c40d92a
Style editor chrome and scrollbars
MrChampz Aug 22, 2026
3c2bbc3
chore: Dissolve.cmake
MrChampz Aug 22, 2026
495efa6
Add keyframe widget animations
MrChampz Aug 23, 2026
aad1bb9
chore: deleted Docs folder
MrChampz Aug 24, 2026
08c0f56
Fix GUI typed style tests
MrChampz Aug 24, 2026
efebad4
Merge pull request #23 from MrChampz/fix-icontest-foreground-error
MrChampz Aug 24, 2026
f90681f
Fix GUI typed style tests
MrChampz Aug 24, 2026
a6b7ab9
Merge feature/editor-gui into fix-icontest-foreground-error
Copilot Aug 24, 2026
3376720
Resolve merge conflicts with feature/editor-gui
Copilot Aug 24, 2026
ee23ba6
Merge pull request #24 from MrChampz/fix-icontest-foreground-error
MrChampz Aug 24, 2026
db01133
chore: adde build to .gitignore
MrChampz Aug 24, 2026
b3c4fde
Remove accidental googletest gitlink from build deps
Copilot Aug 24, 2026
039599d
chore: removed build
MrChampz Aug 24, 2026
d559982
Prevent TPanel copying and export only concrete Canvas
MrChampz Aug 24, 2026
a4b8ef4
Merge pull request #25 from MrChampz/fix/windows
MrChampz Aug 24, 2026
e8e95c7
Fix GUI linker exports for checkbox style resolution
MrChampz Aug 24, 2026
419ae3d
Merge pull request #26 from MrChampz/fix-gui-linker-errors
MrChampz Aug 24, 2026
0816509
Keep box measurements aligned after collapsed slots
MrChampz Aug 24, 2026
fd3219a
fix(animation): defer animator mutations during updates
MrChampz Aug 24, 2026
f79758a
fix(gui): wrap text into measured lines
MrChampz Aug 24, 2026
4236433
fix(gui): constrain text overflow to widget bounds
MrChampz Aug 24, 2026
3c5b0c7
Merge pull request #27 from MrChampz/fix/fixes-gui
MrChampz Aug 24, 2026
a2302af
Export Font class from the engine API
MrChampz Aug 25, 2026
ccafedb
Merge pull request #28 from MrChampz/fix/fixes-gui
MrChampz Aug 25, 2026
22e32c4
fix(gui): invalidate rendering after style changes
MrChampz Aug 25, 2026
0714176
fix(gui): route input to active widgets
MrChampz Aug 25, 2026
9b822a0
fix(gui): clear stale input routing
MrChampz Aug 25, 2026
eea046f
fix(gui): account for scrollbar gutters
MrChampz Aug 25, 2026
427435e
fix(gui): invalidate scrollbar rendering
MrChampz Aug 25, 2026
fed3f0e
fix(gui): detach children before removing slots
MrChampz Aug 25, 2026
d325d3d
fix(gui): provide a fallback for missing styles
MrChampz Aug 25, 2026
c01e1e4
fix(gui): render panels with transparent fills
MrChampz Aug 25, 2026
ffc9acf
fix(gui): grow render pass buffers
MrChampz Aug 25, 2026
b9d5a68
fix(gui): keep debug commands out of layer spans
MrChampz Aug 25, 2026
20312c8
Merge pull request #29 from MrChampz/fix/fixes-gui
MrChampz Aug 25, 2026
aaff15e
fix(animation): ignore nested animator updates
MrChampz Aug 25, 2026
375e1e6
fix(font): preserve leading wrapped whitespace
MrChampz Aug 25, 2026
70a5a95
Merge pull request #30 from MrChampz/fix/fixes-gui
MrChampz Aug 25, 2026
28e9bb0
fix(gui): initialize debug command scissor
MrChampz Aug 25, 2026
ea9b733
fix(gui): keep scroll layout within its viewport
MrChampz Aug 25, 2026
b85e8e9
fix(gui): honor slot constraints in desired size
MrChampz Aug 25, 2026
baf8f42
fix(gui): reset cursor for disabled checkbox
MrChampz Aug 25, 2026
21db730
fix(gui): wrap text at zero width
MrChampz Aug 25, 2026
394dae4
refactor(icon): separate icon implementation
MrChampz Aug 25, 2026
4ec82d1
Merge pull request #31 from MrChampz/fix/fixes-gui
MrChampz Aug 25, 2026
84c6676
fix(gui): distribute constrained fill slots
MrChampz Aug 25, 2026
7364e19
fix(gui): reserve scrollbars only when needed
MrChampz Aug 25, 2026
181f273
Merge pull request #32 from MrChampz/fix/fixes-gui
MrChampz Aug 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
.idea/
.claude/
Build/
build/
Bin/
Intermediate/
out/
Expand Down
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@
[submodule "msdf-atlas-gen"]
path = Elixir/Vendor/msdf-atlas-gen
url = https://github.com/Chlumsky/msdf-atlas-gen
[submodule "Elixir/Vendor/lunasvg"]
path = Elixir/Vendor/lunasvg
url = https://github.com/sammycage/lunasvg.git
[submodule "Vendor/vcpkg"]
path = Vendor/vcpkg
url = https://github.com/microsoft/vcpkg
5 changes: 5 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Instructions for AI agents

## C++ naming

- Never use `b` as a prefix or suffix to denote a `bool`. Prefer concise names that are clear from their context, such as `Cancelled` or `Completed`; use predicates such as `IsVisible`, `HasFocus`, `CanRender`, or `ShouldUpdate` when needed for clarity.
3 changes: 3 additions & 0 deletions Assets/Icons/chevron-right.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions Assets/Icons/close.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions Assets/Icons/git-branch.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions Assets/Icons/hierarchy.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 6 additions & 0 deletions Assets/Icons/inspector.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions Assets/Icons/move.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions Assets/Icons/pause.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions Assets/Icons/play.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions Assets/Icons/rotate.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions Assets/Icons/scale.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions Assets/Icons/script.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ endif()
include(Shaders/Shaders.cmake)
include(Elixir/Elixir.cmake)
include(Dissolve/Dissolve.cmake)
include(Editor/Editor.cmake)

# Ensure shaders are compiled before the engine builds
add_dependencies(Elixir CompileShaders)
Expand Down
7 changes: 4 additions & 3 deletions Dissolve/Dissolve.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@ include (Utils.cmake)
project("Dissolve")

# Files
add_executable(${PROJECT_NAME}
${CMAKE_CURRENT_LIST_DIR}/Source/Dissolve.h
${CMAKE_CURRENT_LIST_DIR}/Source/Dissolve.cpp
file(GLOB_RECURSE SOURCES
"${CMAKE_CURRENT_LIST_DIR}/Source/*.h"
"${CMAKE_CURRENT_LIST_DIR}/Source/*.cpp"
)
add_executable(${PROJECT_NAME} ${SOURCES})

# Set output name
set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "${PROJECT_NAME}")
Expand Down
69 changes: 69 additions & 0 deletions Editor/Editor.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
include (Utils.cmake)

project("Editor")

# Files
file(GLOB_RECURSE SOURCES
"${CMAKE_CURRENT_LIST_DIR}/Source/*.h"
"${CMAKE_CURRENT_LIST_DIR}/Source/*.cpp"
)
add_executable(${PROJECT_NAME} ${SOURCES})

# Set output name
set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "${PROJECT_NAME}")

# Properties

set_target_properties(${PROJECT_NAME} PROPERTIES
CXX_STANDARD 20
CXX_STANDARD_REQUIRED YES
CXX_EXTENSIONS NO
POSITION_INDEPENDENT_CODE False
INTERPROCEDURAL_OPTIMIZATION False
MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL"
)

set_target_properties(${PROJECT_NAME} PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY "${OUTPUT_DIR}/${PROJECT_NAME}"
LIBRARY_OUTPUT_DIRECTORY "${OUTPUT_DIR}/${PROJECT_NAME}"
RUNTIME_OUTPUT_DIRECTORY "${OUTPUT_DIR}/${PROJECT_NAME}"
)

# Compile definitions

target_compile_definitions(${PROJECT_NAME} PRIVATE
$<$<BOOL:${ELIXIR_PROFILE}>:EE_PROFILE>
$<$<CONFIG:Debug>:EE_DEBUG>
$<$<CONFIG:Release>:EE_RELEASE>
$<$<CONFIG:Dist>:EE_DIST>
)

if (WIN32)
target_compile_definitions(${PROJECT_NAME} PRIVATE
_CRT_SECURE_NO_WARNINGS
EE_PLATFORM_WINDOWS
)
elseif (APPLE)
target_compile_definitions(${PROJECT_NAME} PRIVATE
EE_PLATFORM_MACOS
)
endif()

if (APPLE)
target_compile_options(${PROJECT_NAME} PRIVATE -stdlib=libc++)
target_link_options(${PROJECT_NAME} PRIVATE -stdlib=libc++)
endif()

# Include dirs

target_include_directories(${PROJECT_NAME} PRIVATE
${CMAKE_SOURCE_DIR}/Elixir/Source
)

# Linking

add_dependencies(${PROJECT_NAME}
Elixir
)

link_target_to_engine(${PROJECT_NAME})
64 changes: 64 additions & 0 deletions Editor/Source/Editor.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#include "Editor.h"

#include <Engine/Core/Entrypoint.h>

#include "UI/Panels/ViewportPanel.h"

Editor::Editor()
{
EE_PROFILE_ZONE_SCOPED()

m_Window->SetTitle("Editor");

m_EditorUI = CreateScope<EditorUI>(m_GUIManager.get());
m_EditorUI->AddMenuItem("File");
m_EditorUI->AddMenuItem("Edit");
m_EditorUI->AddMenuItem("Assets");
m_EditorUI->AddMenuItem("GameObject");
m_EditorUI->AddMenuItem("Component");
m_EditorUI->AddMenuItem("Window");
m_EditorUI->AddMenuItem("Help");

m_EditorUI->AddTab("Scene", true);
m_EditorUI->AddTab("Game", false);

// Worked example of GUI::Manager's popup layer stack + GUI::ScrollBox: more items than
// fit the dropdown's fixed height, so opening it actually exercises scrolling.
m_EditorUI->AddDropdownMenu("Examples", {
"Scene", "Prefab", "Material", "Texture 2D", "Cubemap",
"Render Texture", "Animation", "Animator Controller",
"Audio Mixer", "Physics Material", "Shader Graph",
});

m_EditorUI->AddPanel(CreateScope<ViewportPanel>());

m_GraphicsContext->SetClearColor({ 0.49f, 0.65f, 0.98f, 1.0f });
}

Editor::~Editor() = default;

void Editor::OnGUI(const Timestep frameTime)
{
EE_PROFILE_ZONE_SCOPED()
Application::OnGUI(frameTime);

m_EditorUI->Update(frameTime);
}

void Editor::OnRender(const Timestep frameTime)
{
EE_PROFILE_ZONE_SCOPED()
Application::OnRender(frameTime);
m_GraphicsContext->Clear();
}

void Editor::OnEvent(Event& event)
{
Application::OnEvent(event);
}

Application* Elixir::CreateApplication()
{
EE_PROFILE_ZONE_SCOPED()
return new Editor();
}
20 changes: 20 additions & 0 deletions Editor/Source/Editor.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#pragma once

#include <Engine.h>

#include "UI/EditorUI.h"

class Editor final : public Elixir::Application
{
public:
Editor();
~Editor() override;

void OnGUI(Timestep frameTime) override;
void OnRender(Timestep frameTime) override;

void OnEvent(Event& event) override;

private:
Scope<EditorUI> m_EditorUI;
};
19 changes: 19 additions & 0 deletions Editor/Source/UI/EditorPanel.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#pragma once

#include <Engine.h>

// Base class for a pluggable editor UI panel (Hierarchy, Inspector, Viewport, ...).
// A panel owns a single root widget that EditorUI docks into the editor's content area.
class EditorPanel
{
public:
virtual ~EditorPanel() = default;

virtual const char* GetName() const = 0;

// Build (or rebuild) this panel's widget tree and return its root widget.
virtual Ref<GUI::Widget> Build() = 0;

// Called once per frame, after the base Application has ticked its own GUI.
virtual void OnUpdate(Timestep frameTime) {}
};
Loading
Loading