Foundational editor infrastructure for Open 3D Engine (O3DE) projects. Provides a unified Settings window and a page-registration API that lets any Heathen gem contribute its own settings panel — no hard dependencies between gems.
- License: Apache 2.0
- Origin: Heathen Group
- Platforms: Windows, Linux, macOS
Tip
Looking for the easiest way to install?
You can add this gem—along with all of Heathen's free O3DE tools—by using the centralized O3DE-Gems repository. Step-by-step setup instructions are available directly in its README.
- O3DE engine 25.10.2 or compatible
Support Heathen by becoming a GitHub Sponsor. Sponsorship directly funds the development and maintenance of free tools like this, as well as our game development Knowledge Base and community on Discord.
Sponsors also get access to our private SourceRepo, which includes developer tools for O3DE, Unreal, Unity, and Godot. Learn more or explore other ways to support @ heathen.group/kb
Editor Extensions gives every Heathen gem a shared foundation for editor tooling:
| Component | Purpose |
|---|---|
| Heathen menu | Top-level menu entry in the O3DE editor menu bar (between Tools and View) |
| Settings window | Non-dockable panel modelled after Unity's Project Settings — nav tree on the left, page content on the right |
ISettingsPageRegistry |
AZ::Interface<> singleton other gems call to register their settings pages |
ISettingsPage |
Interface each settings page must implement to provide its nav-tree path and Qt widget |
The Settings window is opened via Heathen → Settings in the menu bar. It supports live search filtering of the nav tree, lazy widget creation, and persists window geometry, splitter position, and last-selected page across editor sessions.
Register the gem with the O3DE Project Manager, or add it directly to your project's project.json:
"gem_names": [
"EditorExtensions"
]Then re-run CMake configuration so the build system picks up the new gem.
The Settings panel (under Heathen in the O3DE Editor menu bar) provides a single unified location for all Heathen gem configuration:
┌─ Settings ───────────────────────────────────────────────┐
│ [🔍 Search settings... ] │
├──────────────────────┬───────────────────────────────────┤
│ Gameplay Tags │ [page widget for selected item] │
│ ▾ Player │ │
│ Steamworks │ │
│ Localisation │ │
│ Lexicon │ │
└──────────────────────┴───────────────────────────────────┘
- Nav tree is built from each page's
GetPath()— segments separated by/become nested groups - Search bar filters the nav tree in real time
- Page widgets are created lazily on first selection
- Window state (geometry, splitter, last page) is restored between sessions
#include <EditorExtensions/ISettingsPage.h>
class MySettingsPage : public EditorExtensions::ISettingsPage
{
public:
// Top-level entry: "My Feature"
// Nested under a group: "Player/My Feature"
AZStd::string GetPath() const override { return "Player/My Feature"; }
QWidget* CreateWidget(QWidget* parent) override
{
// Build and return your Qt widget.
// The Settings window takes ownership.
return new MySettingsWidget(parent);
}
};#include <EditorExtensions/ISettingsPageRegistry.h>
void MyEditorSystemComponent::Activate()
{
if (auto* reg = AZ::Interface<EditorExtensions::ISettingsPageRegistry>::Get())
reg->RegisterPage(AZStd::make_unique<MySettingsPage>());
}Register during Activate() — pages are read when the Settings window is first opened, so registration is safe at any point before the user opens the window.
Other gems can contribute their own menu actions to heathen.menu.main from their own OnActionRegistrationHook and OnMenuBindingHook implementations on AzToolsFramework::ActionManagerRegistrationNotificationBus.
All public headers live under Code/Include/EditorExtensions/.
| Method | Description |
|---|---|
GetPath() |
Nav-tree path for this page, e.g. "Localisation Lexicon" or "Player/Steamworks". Use / to create nested groups. |
CreateWidget(parent) |
Creates the Qt content widget. Called once on first page selection. The Settings window takes ownership. |
Accessed via AZ::Interface<ISettingsPageRegistry>::Get().
| Method | Description |
|---|---|
RegisterPage(page) |
Register a page. The registry takes ownership of the page object. Safe to call before the window has opened. |
GetPages() |
Returns all registered pages in registration order (non-owning raw pointers). |
| Method | Description |
|---|---|
ShowOrRaise() (static) |
Opens the Settings window, or brings it to the front if already open. |
CloseIfOpen() (static) |
Closes the window if it is open. Called automatically on editor shutdown. |
| Header | Contents |
|---|---|
EditorExtensions/ISettingsPage.h |
ISettingsPage interface |
EditorExtensions/ISettingsPageRegistry.h |
ISettingsPageRegistry interface |
EditorExtensions/EditorExtensionsTypeIds.h |
AZ type ID constants |