128 lines
4.2 KiB
C
128 lines
4.2 KiB
C
|
|
#pragma once
|
||
|
|
|
||
|
|
#include <XCEngine/UI/DrawData.h>
|
||
|
|
|
||
|
|
#include <cstddef>
|
||
|
|
#include <cstdint>
|
||
|
|
#include <string>
|
||
|
|
#include <vector>
|
||
|
|
|
||
|
|
namespace XCEngine::UI::Editor::Widgets {
|
||
|
|
|
||
|
|
enum class UIEditorEnumFieldHitTargetKind : std::uint8_t {
|
||
|
|
None = 0,
|
||
|
|
Row,
|
||
|
|
PreviousButton,
|
||
|
|
NextButton,
|
||
|
|
ValueBox
|
||
|
|
};
|
||
|
|
|
||
|
|
struct UIEditorEnumFieldSpec {
|
||
|
|
std::string fieldId = {};
|
||
|
|
std::string label = {};
|
||
|
|
std::vector<std::string> options = {};
|
||
|
|
std::size_t selectedIndex = 0u;
|
||
|
|
bool readOnly = false;
|
||
|
|
};
|
||
|
|
|
||
|
|
struct UIEditorEnumFieldState {
|
||
|
|
UIEditorEnumFieldHitTargetKind hoveredTarget = UIEditorEnumFieldHitTargetKind::None;
|
||
|
|
bool focused = false;
|
||
|
|
bool active = false;
|
||
|
|
};
|
||
|
|
|
||
|
|
struct UIEditorEnumFieldMetrics {
|
||
|
|
float rowHeight = 32.0f;
|
||
|
|
float horizontalPadding = 12.0f;
|
||
|
|
float labelControlGap = 20.0f;
|
||
|
|
float controlColumnStart = 236.0f;
|
||
|
|
float buttonWidth = 24.0f;
|
||
|
|
float controlGap = 4.0f;
|
||
|
|
float valueBoxMinWidth = 96.0f;
|
||
|
|
float valueBoxHeight = 24.0f;
|
||
|
|
float labelTextInsetY = 8.0f;
|
||
|
|
float valueTextInsetX = 8.0f;
|
||
|
|
float valueTextInsetY = 6.0f;
|
||
|
|
float buttonTextInsetX = 8.0f;
|
||
|
|
float buttonTextInsetY = 6.0f;
|
||
|
|
float cornerRounding = 6.0f;
|
||
|
|
float borderThickness = 1.0f;
|
||
|
|
float focusedBorderThickness = 2.0f;
|
||
|
|
};
|
||
|
|
|
||
|
|
struct UIEditorEnumFieldPalette {
|
||
|
|
::XCEngine::UI::UIColor surfaceColor =
|
||
|
|
::XCEngine::UI::UIColor(0.14f, 0.14f, 0.14f, 1.0f);
|
||
|
|
::XCEngine::UI::UIColor borderColor =
|
||
|
|
::XCEngine::UI::UIColor(0.29f, 0.29f, 0.29f, 1.0f);
|
||
|
|
::XCEngine::UI::UIColor focusedBorderColor =
|
||
|
|
::XCEngine::UI::UIColor(0.84f, 0.84f, 0.84f, 1.0f);
|
||
|
|
::XCEngine::UI::UIColor rowHoverColor =
|
||
|
|
::XCEngine::UI::UIColor(0.22f, 0.22f, 0.22f, 1.0f);
|
||
|
|
::XCEngine::UI::UIColor rowActiveColor =
|
||
|
|
::XCEngine::UI::UIColor(0.28f, 0.28f, 0.28f, 1.0f);
|
||
|
|
::XCEngine::UI::UIColor valueBoxColor =
|
||
|
|
::XCEngine::UI::UIColor(0.18f, 0.18f, 0.18f, 1.0f);
|
||
|
|
::XCEngine::UI::UIColor buttonColor =
|
||
|
|
::XCEngine::UI::UIColor(0.24f, 0.24f, 0.24f, 1.0f);
|
||
|
|
::XCEngine::UI::UIColor buttonHoverColor =
|
||
|
|
::XCEngine::UI::UIColor(0.30f, 0.30f, 0.30f, 1.0f);
|
||
|
|
::XCEngine::UI::UIColor readOnlyColor =
|
||
|
|
::XCEngine::UI::UIColor(0.17f, 0.17f, 0.17f, 1.0f);
|
||
|
|
::XCEngine::UI::UIColor controlBorderColor =
|
||
|
|
::XCEngine::UI::UIColor(0.36f, 0.36f, 0.36f, 1.0f);
|
||
|
|
::XCEngine::UI::UIColor labelColor =
|
||
|
|
::XCEngine::UI::UIColor(0.92f, 0.92f, 0.92f, 1.0f);
|
||
|
|
::XCEngine::UI::UIColor valueColor =
|
||
|
|
::XCEngine::UI::UIColor(0.92f, 0.92f, 0.92f, 1.0f);
|
||
|
|
};
|
||
|
|
|
||
|
|
struct UIEditorEnumFieldLayout {
|
||
|
|
::XCEngine::UI::UIRect bounds = {};
|
||
|
|
::XCEngine::UI::UIRect labelRect = {};
|
||
|
|
::XCEngine::UI::UIRect controlRect = {};
|
||
|
|
::XCEngine::UI::UIRect valueRect = {};
|
||
|
|
::XCEngine::UI::UIRect previousRect = {};
|
||
|
|
::XCEngine::UI::UIRect nextRect = {};
|
||
|
|
};
|
||
|
|
|
||
|
|
struct UIEditorEnumFieldHitTarget {
|
||
|
|
UIEditorEnumFieldHitTargetKind kind = UIEditorEnumFieldHitTargetKind::None;
|
||
|
|
};
|
||
|
|
|
||
|
|
std::string ResolveUIEditorEnumFieldValueText(const UIEditorEnumFieldSpec& spec);
|
||
|
|
|
||
|
|
UIEditorEnumFieldLayout BuildUIEditorEnumFieldLayout(
|
||
|
|
const ::XCEngine::UI::UIRect& bounds,
|
||
|
|
const UIEditorEnumFieldSpec& spec,
|
||
|
|
const UIEditorEnumFieldMetrics& metrics = {});
|
||
|
|
|
||
|
|
UIEditorEnumFieldHitTarget HitTestUIEditorEnumField(
|
||
|
|
const UIEditorEnumFieldLayout& layout,
|
||
|
|
const ::XCEngine::UI::UIPoint& point);
|
||
|
|
|
||
|
|
void AppendUIEditorEnumFieldBackground(
|
||
|
|
::XCEngine::UI::UIDrawList& drawList,
|
||
|
|
const UIEditorEnumFieldLayout& layout,
|
||
|
|
const UIEditorEnumFieldSpec& spec,
|
||
|
|
const UIEditorEnumFieldState& state,
|
||
|
|
const UIEditorEnumFieldPalette& palette = {},
|
||
|
|
const UIEditorEnumFieldMetrics& metrics = {});
|
||
|
|
|
||
|
|
void AppendUIEditorEnumFieldForeground(
|
||
|
|
::XCEngine::UI::UIDrawList& drawList,
|
||
|
|
const UIEditorEnumFieldLayout& layout,
|
||
|
|
const UIEditorEnumFieldSpec& spec,
|
||
|
|
const UIEditorEnumFieldPalette& palette = {},
|
||
|
|
const UIEditorEnumFieldMetrics& metrics = {});
|
||
|
|
|
||
|
|
void AppendUIEditorEnumField(
|
||
|
|
::XCEngine::UI::UIDrawList& drawList,
|
||
|
|
const ::XCEngine::UI::UIRect& bounds,
|
||
|
|
const UIEditorEnumFieldSpec& spec,
|
||
|
|
const UIEditorEnumFieldState& state,
|
||
|
|
const UIEditorEnumFieldPalette& palette = {},
|
||
|
|
const UIEditorEnumFieldMetrics& metrics = {});
|
||
|
|
|
||
|
|
} // namespace XCEngine::UI::Editor::Widgets
|