UI: applied coding guidelines

master
Martin Gerhardy 2022-05-26 17:27:49 +02:00
parent 384df5885b
commit b879def00a
3 changed files with 53 additions and 48 deletions

View File

@ -1,11 +1,14 @@
//
// Created by Matty on 2022-01-28.
//
#include "core/StandardLib.h"
#define IMGUI_DEFINE_MATH_OPERATORS
#include "imgui_neo_sequencer.h"
#include "imgui_internal.h"
#include "imgui_neo_internal.h"
#include "imgui_neo_sequencer.h"
#include <unordered_map>
@ -61,6 +64,9 @@ static ImVector<ImGuiColorMod> sequencerColorStack;
// Data of all sequencers, this is main c++ part and I should create C alternative or use imgui ImVector or something
static Map sequencerData;
static uint32_t idCounter = 0;
static char idBuffer[16];
///////////// STATIC HELPERS ///////////////////////
static float getPerFrameWidth(ImGuiNeoSequencerInternalData &context) {
@ -103,8 +109,9 @@ static void processCurrentFrame(uint32_t *frame, ImGuiNeoSequencerInternalData &
const ImVec2 timelineXRange = {timelineXmin, // min
timelineXmin + context.Size.x - context.ValuesWidth};
if (!ItemAdd(pointerRect, 0))
if (!ItemAdd(pointerRect, 0)) {
return;
}
context.CurrentFrameColor = GetStyleNeoSequencerColorVec4(ImGuiNeoSequencerCol_FramePointer);
@ -176,14 +183,11 @@ static bool createKeyframe(uint32_t *frame) {
return true;
}
static uint32_t idCounter = 0;
static char idBuffer[16];
static const char *generateID() {
idBuffer[0] = '#';
idBuffer[1] = '#';
memset(idBuffer + 2, 0, 14);
snprintf(idBuffer + 2, 14, "%o", idCounter++);
core_memset(idBuffer + 2, 0, 14);
SDL_snprintf(idBuffer + 2, 14, "%o", idCounter++);
return &idBuffer[0];
}
@ -222,23 +226,9 @@ static void processAndRenderZoom(ImGuiNeoSequencerInternalData &context, bool al
const float size = allowEditingLength ? context.Size.x - 2 * inputWidthWithPadding : context.Size.x;
const ImRect bb{cursor, cursor + ImVec2{size, zoomHeight}};
const ImVec2 frameNumberBorderSize{inputWidth - imStyle.FramePadding.x, zoomHeight};
// const ImVec2 startFrameTextCursor{context.StartCursor + ImVec2{imStyle.FramePadding.x, 0}};
// Text number borders
// drawList->AddRect(startFrameTextCursor, startFrameTextCursor +
// frameNumberBorderSize,ColorConvertFloat4ToU32(GetStyleNeoSequencerColorVec4(ImGuiNeoSequencerCol_TimelineBorder)));
const ImVec2 zoomBarEndWithSpacing = ImVec2{bb.Max.x + imStyle.ItemSpacing.x, context.StartCursor.y};
/*
drawList->AddRect(zoomBarEndWithSpacing,
zoomBarEndWithSpacing +
frameNumberBorderSize,ColorConvertFloat4ToU32(GetStyleNeoSequencerColorVec4(ImGuiNeoSequencerCol_TimelineBorder)));
*/
int32_t startFrameVal = (int32_t)*start;
int32_t endFrameVal = (int32_t)*end;
@ -258,14 +248,17 @@ static void processAndRenderZoom(ImGuiNeoSequencerInternalData &context, bool al
window->DC.CursorPos = prevWindowCursor;
}
if (startFrameVal < 0)
if (startFrameVal < 0) {
startFrameVal = (int32_t)*start;
}
if (endFrameVal < 0)
if (endFrameVal < 0) {
endFrameVal = (int32_t)*end;
}
if (endFrameVal <= startFrameVal)
if (endFrameVal <= startFrameVal) {
endFrameVal = (int32_t)*end;
}
*start = startFrameVal;
*end = endFrameVal;
@ -360,7 +353,7 @@ static void processAndRenderZoom(ImGuiNeoSequencerInternalData &context, bool al
const ImVec2 sliderCenter = finalSliderBB.GetCenter();
char overlayTextBuffer[128];
snprintf(overlayTextBuffer, sizeof(overlayTextBuffer), "%d - %d", viewStart, viewEnd);
SDL_snprintf(overlayTextBuffer, sizeof(overlayTextBuffer), "%d - %d", viewStart, viewEnd);
const ImVec2 overlaySize = CalcTextSize(overlayTextBuffer);
drawList->AddText(sliderCenter - overlaySize / 2.0f, IM_COL32_WHITE, overlayTextBuffer);
@ -383,11 +376,13 @@ bool BeginNeoSequencer(const char *idin, uint32_t *frame, uint32_t *startFrame,
ImGuiWindow *window = GetCurrentWindow();
const ImGuiStyle &imStyle = GetStyle();
if (inSequencer)
if (inSequencer) {
return false;
}
if (window->SkipItems)
if (window->SkipItems) {
return false;
}
ImDrawList *drawList = GetWindowDrawList();
@ -395,17 +390,19 @@ bool BeginNeoSequencer(const char *idin, uint32_t *frame, uint32_t *startFrame,
const ImVec2 area = ImGui::GetContentRegionAvail();
PushID(idin);
const unsigned int id = window->IDStack[window->IDStack.size() - 1];
const ImGuiID id = window->IDStack[window->IDStack.size() - 1];
inSequencer = true;
Map::mapped_type &context = sequencerData[id];
ImVec2 realSize = ImFloor(size);
if (realSize.x <= 0.0f)
if (realSize.x <= 0.0f) {
realSize.x = ImMax(4.0f, area.x);
if (realSize.y <= 0.0f)
}
if (realSize.y <= 0.0f) {
realSize.y = ImMax(4.0f, context.FilledHeight);
}
const bool showZoom = !(flags & ImGuiNeoSequencerFlags_HideZoom);
@ -417,7 +414,7 @@ bool BeginNeoSequencer(const char *idin, uint32_t *frame, uint32_t *startFrame,
context.EndFrame = *endFrame;
context.Size = realSize;
currentSequencer = window->IDStack[window->IDStack.size() - 1];
currentSequencer = id;
RenderNeoSequencerBackground(GetStyleNeoSequencerColorVec4(ImGuiNeoSequencerCol_Bg), context.StartCursor,
context.Size, drawList, style.SequencerRounding);
@ -436,11 +433,13 @@ bool BeginNeoSequencer(const char *idin, uint32_t *frame, uint32_t *startFrame,
context.TopBarSize = ImVec2(context.Size.x, style.TopBarHeight);
if (context.TopBarSize.y <= 0.0f)
if (context.TopBarSize.y <= 0.0f) {
context.TopBarSize.y = CalcTextSize("100").y + imStyle.FramePadding.y * 2.0f;
}
if (context.Size.y < context.FilledHeight)
if (context.Size.y < context.FilledHeight) {
context.Size.y = context.FilledHeight;
}
context.FilledHeight = context.TopBarSize.y + style.TopBarSpacing +
(showZoom ? imStyle.FramePadding.y + style.ZoomHeightScale + GetFontSize() : 0.0f);
@ -480,7 +479,7 @@ IMGUI_API void EndNeoGroup() {
return EndNeoTimeLine();
}
static bool groupBehaviour(const ImGuiID id, bool *open, const ImVec2 labelSize) {
static bool groupBehaviour(const ImGuiID id, bool *open, const ImVec2 &labelSize) {
Map::mapped_type &context = sequencerData[currentSequencer];
ImGuiWindow *window = GetCurrentWindow();
@ -495,8 +494,9 @@ static bool groupBehaviour(const ImGuiID id, bool *open, const ImVec2 labelSize)
const ImGuiID arrowID = window->GetID(generateID());
const bool addArrowRes = ItemAdd(arrowBB, arrowID);
if (addArrowRes) {
if (IsItemClicked() && closable)
if (IsItemClicked() && closable) {
(*open) = !(*open);
}
}
const bool addGroupRes = ItemAdd(groupBB, id);
@ -510,11 +510,10 @@ static bool groupBehaviour(const ImGuiID id, bool *open, const ImVec2 labelSize)
return addGroupRes && addArrowRes;
}
static bool timelineBehaviour(const ImGuiID id, const ImVec2 labelSize) {
static bool timelineBehaviour(const ImGuiID id, const ImVec2 &labelSize) {
Map::mapped_type &context = sequencerData[currentSequencer];
// ImGuiWindow *window = GetCurrentWindow();
const ImRect groupBB = {context.ValuesCursor, context.ValuesCursor + labelSize};
const ImRect groupBB{context.ValuesCursor, context.ValuesCursor + labelSize};
const bool addGroupRes = ItemAdd(groupBB, id);
if (addGroupRes) {
@ -566,8 +565,9 @@ bool BeginNeoTimeline(const char *label, uint32_t **keyframes, uint32_t keyframe
GetStyleNeoSequencerColorVec4(ImGuiNeoSequencerCol_SelectedTimeline));
ImVec4 color = GetStyleColorVec4(ImGuiCol_Text);
if (IsItemHovered())
if (IsItemHovered()) {
color.w *= 0.7f;
}
RenderNeoTimelineLabel(label,
context.ValuesCursor + imStyle.FramePadding +

View File

@ -17,7 +17,6 @@ enum ImGuiNeoSequencerFlags_ {
ImGuiNeoSequencerFlags_AllowSelection = 1 << 1,
ImGuiNeoSequencerFlags_HideZoom = 1 << 2,
ImGuiNeoSequencerFlags_ZoomBottomOverlay = 1 << 3,
};
// Flags for ImGui::BeginNeoTimeline()
@ -68,6 +67,7 @@ struct ImGuiNeoSequencerStyle {
};
namespace ImGui {
IMGUI_API const ImVec4 &GetStyleNeoSequencerColorVec4(ImGuiNeoSequencerCol idx);
IMGUI_API ImGuiNeoSequencerStyle &GetNeoSequencerStyle();
@ -78,14 +78,16 @@ IMGUI_API void PopNeoSequencerStyleColor(int count = 1);
IMGUI_API bool BeginNeoSequencer(const char *id, uint32_t *frame, uint32_t *startFrame, uint32_t *endFrame,
const ImVec2 &size = ImVec2(0, 0),
ImGuiNeoSequencerFlags flags = ImGuiNeoSequencerFlags_None);
IMGUI_API void EndNeoSequencer(); // Call only when BeginNeoSequencer() returns true!!
// Call only when BeginNeoSequencer() returns true!!
IMGUI_API void EndNeoSequencer();
IMGUI_API bool BeginNeoGroup(const char *label, bool *open = nullptr);
IMGUI_API void EndNeoGroup();
IMGUI_API bool BeginNeoTimeline(const char *label, uint32_t **keyframes, uint32_t keyframeCount, bool *open = nullptr,
ImGuiNeoTimelineFlags flags = ImGuiNeoTimelineFlags_None);
IMGUI_API void EndNeoTimeLine(); // Call only when BeginNeoTimeline() returns true!!
// Call only when BeginNeoTimeline() returns true!!
IMGUI_API void EndNeoTimeLine();
IMGUI_API bool NeoBeginCreateKeyframe(uint32_t *frame);

View File

@ -6,8 +6,8 @@
#include "IconsForkAwesome.h"
#include "core/ArrayLength.h"
#include "core/collection/DynamicArray.h"
#include "ui/imgui/dearimgui/imgui_neo_sequencer.h"
#include "ui/imgui/dearimgui/imgui.h"
#include "ui/imgui/dearimgui/imgui_neo_sequencer.h"
#include "voxedit-util/SceneManager.h"
#include "voxelformat/SceneGraph.h"
#include "voxelformat/SceneGraphNode.h"
@ -22,15 +22,15 @@ void AnimationTimeline::update(const char *sequencerTitle, ImGuiID dockIdMainDow
ImGui::SetNextWindowDockID(dockIdMainDown, ImGuiCond_Appearing);
if (ImGui::Begin(sequencerTitle, nullptr, ImGuiWindowFlags_NoSavedSettings)) {
if (ImGui::Button(ICON_FA_PLUS_SQUARE " Add")) {
sceneMgr().nodeForeachGroup([&] (int nodeId) {
voxelformat::SceneGraphNode& node = sceneGraph.node(nodeId);
sceneMgr().nodeForeachGroup([&](int nodeId) {
voxelformat::SceneGraphNode &node = sceneGraph.node(nodeId);
node.addKeyFrame(currentFrame);
});
}
ImGui::SameLine();
if (ImGui::Button(ICON_FA_MINUS_SQUARE " Remove")) {
sceneMgr().nodeForeachGroup([&] (int nodeId) {
voxelformat::SceneGraphNode& node = sceneGraph.node(nodeId);
sceneMgr().nodeForeachGroup([&](int nodeId) {
voxelformat::SceneGraphNode &node = sceneGraph.node(nodeId);
node.removeKeyFrame(currentFrame);
});
}
@ -43,7 +43,10 @@ void AnimationTimeline::update(const char *sequencerTitle, ImGuiID dockIdMainDow
for (voxelformat::SceneGraphKeyFrame &kf : modelNode.keyFrames()) {
keys.push_back(&kf.frame);
}
if (ImGui::BeginNeoTimeline(modelNode.name().c_str(), keys.data(), keys.size(), nullptr)) {
const char *label = modelNode.name().c_str();
uint32_t **keyframes = keys.data();
const uint32_t keyframeCount = keys.size();
if (ImGui::BeginNeoTimeline(label, keyframes, keyframeCount, nullptr, ImGuiNeoTimelineFlags_None)) {
sceneMgr().setCurrentFrame(currentFrame);
ImGui::EndNeoTimeLine();
}