From 74c14791ee7b9e02af21e8424ad62043d39ed9ce Mon Sep 17 00:00:00 2001 From: OmniaX-Dev Date: Sun, 26 Apr 2026 03:28:40 +0200 Subject: [PATCH] Finished first stage of ToolBar --- CMakeLists.txt | 3 --- extra/DefaultTheme.oss | 9 +++++++++ extra/icons.png | Bin 0 -> 70651 bytes other/TODO.txt | 4 +++- src/ogfx/gui/widgets/Button.cpp | 5 +++-- src/ogfx/gui/widgets/Button.hpp | 2 ++ src/ogfx/render/BasicRenderer.cpp | 8 ++++---- src/ogfx/render/BasicRenderer.hpp | 4 ++-- src/ogfx/utils/Animation.cpp | 14 ++++++++++---- src/ogfx/utils/Animation.hpp | 4 ++++ src/ostd/data/AnimationData.hpp | 4 ++++ src/ostd/io/Stylesheet.cpp | 12 ++++++++++++ src/test/GuiTest.cpp | 21 +++++++++++++++++++-- 13 files changed, 72 insertions(+), 18 deletions(-) create mode 100644 extra/icons.png diff --git a/CMakeLists.txt b/CMakeLists.txt index acd06ea..b69ae79 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -148,9 +148,6 @@ if (WIN32) "${MSYS2_UCRT64}/include/c++/13.2.0/x86_64-w64-mingw32" ) - file(WRITE ${CMAKE_CURRENT_LIST_DIR}/.clangd "CompileFlags:\n CompilationDatabase: bin\n Add: [\"--target=x86_64-w64-mingw32\"]\nDiagnostics:\n MissingIncludes: None") -else() - file(WRITE ${CMAKE_CURRENT_LIST_DIR}/.clangd "CompileFlags:\n CompilationDatabase: bin\nDiagnostics:\n MissingIncludes: None") endif() if(CMAKE_BUILD_TYPE STREQUAL "Debug") diff --git a/extra/DefaultTheme.oss b/extra/DefaultTheme.oss index 81d0ba7..682e61d 100644 --- a/extra/DefaultTheme.oss +++ b/extra/DefaultTheme.oss @@ -332,4 +332,13 @@ const $accentColorDark = #6B0A1DFF showBorder = true borderColor = color_black showIcon = true + (icon) { + tint = color_crimson + } +} +(@tool_button button:hover) { + borderColor = color_white + (icon) { + tint = color_white + } } diff --git a/extra/icons.png b/extra/icons.png new file mode 100644 index 0000000000000000000000000000000000000000..43768d4ab3946dd17cba86042e8d3d899747595a GIT binary patch literal 70651 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, "autoSize", m_autoSize)); enableAnimated(getThemeValue(theme, "icon.animated", m_animated)); setAnimationData(getThemeValue(theme, "icon.animation", m_animData)); + setIconTintColor(getThemeValue(theme, "icon.tint", getIconTintColor())); String filePath = getThemeValue(theme, "icon.path", m_icon.getFilePath()); if (filePath != m_icon.getFilePath()) setIcon(filePath); diff --git a/src/ogfx/gui/widgets/Button.hpp b/src/ogfx/gui/widgets/Button.hpp index c2c414b..015738d 100644 --- a/src/ogfx/gui/widgets/Button.hpp +++ b/src/ogfx/gui/widgets/Button.hpp @@ -62,6 +62,7 @@ namespace ogfx OSTD_PARAM_GETSET(ostd::AnimationData, AnimationData, m_animData); OSTD_PARAM_GETSET(Vec2, IconSize, m_iconSize); OSTD_PARAM_GETSET(f32, IconSpacing, m_iconSpacing); + OSTD_PARAM_GETSET(Color, IconTintColor, m_iconTint); private: // Force a layout recompute on the next draw. @@ -85,6 +86,7 @@ namespace ogfx Animation m_anim; Vec2 m_iconSize { 0, 0 }; f32 m_iconSpacing { 10 }; + Color m_iconTint { Colors::White }; // Computed layout state (refreshed by recompute_layout). bool m_layoutDirty { true }; diff --git a/src/ogfx/render/BasicRenderer.cpp b/src/ogfx/render/BasicRenderer.cpp index bacb400..fcefac5 100644 --- a/src/ogfx/render/BasicRenderer.cpp +++ b/src/ogfx/render/BasicRenderer.cpp @@ -262,7 +262,7 @@ namespace ogfx // ===================================================== SPECIALIZED ===================================================== - void BasicRenderer2D::drawImage(const ogfx::Image& image, const Vec2& position, const Vec2& size, const Rectangle& srcRect) + void BasicRenderer2D::drawImage(const ogfx::Image& image, const Vec2& position, const Vec2& size, const Color& tint, const Rectangle& srcRect) { if (!m_initialized || !image.isLoaded()) return; @@ -319,16 +319,16 @@ namespace ogfx // 5. Push quad u32 inds[6] = QUAD_INDICES_ARR; - push_polygon(verts, uvs, 4, inds, 6, Colors::White, tex, false); + push_polygon(verts, uvs, 4, inds, 6, tint, tex, false); } - void BasicRenderer2D::drawAnimation(const Animation& anim, const Vec2& position, const Vec2& size) + void BasicRenderer2D::drawAnimation(const Animation& anim, const Vec2& position, const Vec2& size, const Color& tint) { if (!m_initialized) return; if (!anim.hasImage()) return; const Image& img = anim.getSpriteSheet(); if (!img.isLoaded() || !img.isValid()) return; - drawImage(img, position, size, anim.getFrameRect()); + drawImage(img, position, size, tint, anim.getFrameRect()); } void BasicRenderer2D::fillGradientRect(const Rectangle& rect, ColorGradient& gradient) diff --git a/src/ogfx/render/BasicRenderer.hpp b/src/ogfx/render/BasicRenderer.hpp index 9cdc177..78b6f91 100644 --- a/src/ogfx/render/BasicRenderer.hpp +++ b/src/ogfx/render/BasicRenderer.hpp @@ -81,8 +81,8 @@ namespace ogfx inline bool isInitialized(void) { return m_initialized; } inline FontGlyphAtlas& getFontGlyphAtlas(void) { return m_fontGlyphAtlas; } - void drawImage(const ogfx::Image& image, const Vec2& position, const Vec2& size = { 0, 0 }, const Rectangle& srcRect = { 0, 0, 0, 0 }); - void drawAnimation(const Animation& anim, const Vec2& position, const Vec2& size = { 0, 0 }); + void drawImage(const ogfx::Image& image, const Vec2& position, const Vec2& size = { 0, 0 }, const Color& tint = Colors::White, const Rectangle& srcRect = { 0, 0, 0, 0 }); + void drawAnimation(const Animation& anim, const Vec2& position, const Vec2& size = { 0, 0 }, const Color& tint = Colors::White); void fillGradientRect(const Rectangle& rect, ColorGradient& gradient); void drawString(const String& str, const Vec2& position, const Color& color, i32 fontSize = 0, f32 scale = 1.0f); void drawCenteredString(const String& str, const Vec2& center, const Color& color, i32 fontSize = 0, f32 scale = 1.0f); diff --git a/src/ogfx/utils/Animation.cpp b/src/ogfx/utils/Animation.cpp index 8b35022..40701be 100644 --- a/src/ogfx/utils/Animation.cpp +++ b/src/ogfx/utils/Animation.cpp @@ -30,6 +30,7 @@ namespace ogfx m_timer.create(m_animData.fps, [&](f64 dt) -> void { update_animation(); }); + update_animation(); return *this; } @@ -76,10 +77,15 @@ namespace ogfx else m_currentFrame = 0; } - i32 x = m_animData.pixelOffsetX + (((m_currentFrame % m_animData.columns) + m_animData.columnOffset) * m_animData.frameWidth); - i32 y = m_animData.pixelOffsetY + (m_animData.rowOffset * m_animData.frameHeight); - if (m_animData.rows > 1) - y = m_animData.pixelOffsetY + ((cast(m_currentFrame / m_animData.columns) + m_animData.rowOffset) * m_animData.frameHeight); + i32 col = m_currentFrame % m_animData.columns; + i32 row = (m_animData.rows > 1) ? cast(m_currentFrame / m_animData.columns) : 0; + + i32 x = m_animData.pixelOffsetX + + ((col + m_animData.columnOffset) * (m_animData.frameWidth + m_animData.spacingX)); + + i32 y = m_animData.pixelOffsetY + + ((row + m_animData.rowOffset) * (m_animData.frameHeight + m_animData.spacingY)); + m_frameRect = { cast(x), cast(y), m_animData.frameWidth, m_animData.frameHeight }; } } diff --git a/src/ogfx/utils/Animation.hpp b/src/ogfx/utils/Animation.hpp index c019dca..11f4f13 100644 --- a/src/ogfx/utils/Animation.hpp +++ b/src/ogfx/utils/Animation.hpp @@ -45,6 +45,8 @@ namespace ogfx inline void setRowOffset(i32 o) { m_animData.rowOffset = o; } inline void setPixelOffsetX(f32 o) { m_animData.pixelOffsetX = o; } inline void setPixelOffsetY(f32 o) { m_animData.pixelOffsetY = o; } + inline void setSpacingX(f32 s) { m_animData.spacingX = s; } + inline void setSpacingY(f32 s) { m_animData.spacingY = s; } inline void setNRows(i32 n) { m_animData.rows = n; } inline void setNColumns(i32 n) { m_animData.columns = n; } inline void setFrameWidth(i32 f) { m_animData.frameWidth = f; } @@ -60,6 +62,8 @@ namespace ogfx inline i32 getRowOffset(void) { return m_animData.rowOffset; } inline f32 getPixelOffsetX(void) { return m_animData.pixelOffsetX; } inline f32 getPixelOffsetY(void) { return m_animData.pixelOffsetY; } + inline f32 getSpacingX(void) { return m_animData.spacingX; } + inline f32 getSpacingY(void) { return m_animData.spacingY; } inline i32 getNRows(void) { return m_animData.rows; } inline i32 getNColumns(void) { return m_animData.columns; } inline i32 getFrameWidth(void) { return m_animData.frameWidth; } diff --git a/src/ostd/data/AnimationData.hpp b/src/ostd/data/AnimationData.hpp index a075d92..bdbbdae 100644 --- a/src/ostd/data/AnimationData.hpp +++ b/src/ostd/data/AnimationData.hpp @@ -34,6 +34,8 @@ namespace ostd i32 columnOffset { 0 }; f32 pixelOffsetX { 0.0f }; f32 pixelOffsetY { 0.0f }; + f32 spacingX { 0.0f };; + f32 spacingY { 0.0f };; i32 rows { 1 }; i32 columns { 1 }; f32 frameWidth{ 32 }; @@ -53,6 +55,8 @@ namespace ostd str.add(" ").add("columnOffset: ").add(columnOffset).add(",\n"); str.add(" ").add("pixelOffsetX: ").add(pixelOffsetX, 2).add(",\n"); str.add(" ").add("pixelOffsetY: ").add(pixelOffsetY, 2).add(",\n"); + str.add(" ").add("spacingX: ").add(spacingX, 2).add(",\n"); + str.add(" ").add("CpacingY: ").add(spacingY, 2).add(",\n"); str.add(" ").add("rows: ").add(rows).add(",\n"); str.add(" ").add("columns: ").add(columns).add(",\n"); str.add(" ").add("frameWidth: ").add(frameWidth, 2).add(",\n"); diff --git a/src/ostd/io/Stylesheet.cpp b/src/ostd/io/Stylesheet.cpp index 8b43b9d..42fab78 100644 --- a/src/ostd/io/Stylesheet.cpp +++ b/src/ostd/io/Stylesheet.cpp @@ -593,6 +593,18 @@ namespace ostd return l_error(true); ad.pixelOffsetY = val.toFloat(); } + else if (prop == "spacingx") + { + if (!val.isNumeric(true)) + return l_error(true); + ad.spacingX = val.toFloat(); + } + else if (prop == "spacingy") + { + if (!val.isNumeric(true)) + return l_error(true); + ad.spacingY = val.toFloat(); + } else if (prop == "rows") { if (!val.isInt()) diff --git a/src/test/GuiTest.cpp b/src/test/GuiTest.cpp index 20b72d2..08ad85a 100644 --- a/src/test/GuiTest.cpp +++ b/src/test/GuiTest.cpp @@ -52,6 +52,17 @@ class Window : public ogfx::gui::Window getToolBar().setHeight(30); + ogfx::AnimationData iconsAD; + iconsAD.frameCount = 1; + iconsAD.fps = 1; + iconsAD.columns = 8; + iconsAD.rows = 5; + iconsAD.frameWidth = 64; + iconsAD.frameHeight = 64; + iconsAD.spacingX = 50; + iconsAD.spacingY = 48; + iconsAD.still = true; + m_label1.setText("Show Panel2"); m_label1.setCallback(ogfx::gui::Widget::eCallback::MousePressed, [&](const ogfx::gui::Event& event) -> void { m_check1.setChecked(!m_check1.isChecked()); @@ -136,9 +147,15 @@ class Window : public ogfx::gui::Window for (i32 i = 0; i < 20; i++) { - auto& btn = getToolBar().addButton("./img.png"); - btn.setAnimationData(ad); + iconsAD.columnOffset = ostd::Random::getui32(0, 7); + iconsAD.rowOffset = ostd::Random::getui32(0, 4); + + if (iconsAD.rowOffset == 3) + iconsAD.columnOffset = ostd::Random::getui32(0, 4); + + auto& btn = getToolBar().addButton("./icons.png"); btn.enableAnimated(); + btn.setAnimationData(iconsAD); } m_tabs.setSize(900, 700);