Finished first stage of ToolBar

This commit is contained in:
OmniaX-Dev 2026-04-26 03:28:40 +02:00
parent c47782280b
commit 74c14791ee
13 changed files with 72 additions and 18 deletions

View file

@ -148,9 +148,6 @@ if (WIN32)
"${MSYS2_UCRT64}/include/c++/13.2.0/x86_64-w64-mingw32" "${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() endif()
if(CMAKE_BUILD_TYPE STREQUAL "Debug") if(CMAKE_BUILD_TYPE STREQUAL "Debug")

View file

@ -332,4 +332,13 @@ const $accentColorDark = #6B0A1DFF
showBorder = true showBorder = true
borderColor = color_black borderColor = color_black
showIcon = true showIcon = true
(icon) {
tint = color_crimson
}
}
(@tool_button button:hover) {
borderColor = color_white
(icon) {
tint = color_white
}
} }

BIN
extra/icons.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

View file

@ -37,6 +37,8 @@ Add icons to ListView
FIX: Limit FPS even when continuous events happen FIX: Limit FPS even when continuous events happen
Add gradient to listbox selection Add gradient to listbox selection
Add gradient to menubar background and selection Add gradient to menubar background and selection
Add cursor stack
Add MacOS global menu integration
@ -61,7 +63,7 @@ Implement following widgets:
***ListBox ***ListBox
***Context Menu ***Context Menu
***MenuBar ***MenuBar
Toolbar ***Toolbar
StatusBar StatusBar
ComboBox ComboBox
TreeView TreeView

View file

@ -54,9 +54,9 @@ namespace ogfx
{ {
const Vec2 iconPos = contentTL + m_drawIconOffset; const Vec2 iconPos = contentTL + m_drawIconOffset;
if (isAnimatedEnabled()) if (isAnimatedEnabled())
gfx.drawAnimation(m_anim, iconPos, m_drawIconSize); gfx.drawAnimation(m_anim, iconPos, m_drawIconSize, getIconTintColor());
else else
gfx.drawImage(m_icon, iconPos, m_drawIconSize); gfx.drawImage(m_icon, iconPos, m_drawIconSize, getIconTintColor());
} }
// --- Text --- // --- Text ---
@ -110,6 +110,7 @@ namespace ogfx
enableAutoSize(getThemeValue<bool>(theme, "autoSize", m_autoSize)); enableAutoSize(getThemeValue<bool>(theme, "autoSize", m_autoSize));
enableAnimated(getThemeValue<bool>(theme, "icon.animated", m_animated)); enableAnimated(getThemeValue<bool>(theme, "icon.animated", m_animated));
setAnimationData(getThemeValue<AnimationData>(theme, "icon.animation", m_animData)); setAnimationData(getThemeValue<AnimationData>(theme, "icon.animation", m_animData));
setIconTintColor(getThemeValue<Color>(theme, "icon.tint", getIconTintColor()));
String filePath = getThemeValue<String>(theme, "icon.path", m_icon.getFilePath()); String filePath = getThemeValue<String>(theme, "icon.path", m_icon.getFilePath());
if (filePath != m_icon.getFilePath()) if (filePath != m_icon.getFilePath())
setIcon(filePath); setIcon(filePath);

View file

@ -62,6 +62,7 @@ namespace ogfx
OSTD_PARAM_GETSET(ostd::AnimationData, AnimationData, m_animData); OSTD_PARAM_GETSET(ostd::AnimationData, AnimationData, m_animData);
OSTD_PARAM_GETSET(Vec2, IconSize, m_iconSize); OSTD_PARAM_GETSET(Vec2, IconSize, m_iconSize);
OSTD_PARAM_GETSET(f32, IconSpacing, m_iconSpacing); OSTD_PARAM_GETSET(f32, IconSpacing, m_iconSpacing);
OSTD_PARAM_GETSET(Color, IconTintColor, m_iconTint);
private: private:
// Force a layout recompute on the next draw. // Force a layout recompute on the next draw.
@ -85,6 +86,7 @@ namespace ogfx
Animation m_anim; Animation m_anim;
Vec2 m_iconSize { 0, 0 }; Vec2 m_iconSize { 0, 0 };
f32 m_iconSpacing { 10 }; f32 m_iconSpacing { 10 };
Color m_iconTint { Colors::White };
// Computed layout state (refreshed by recompute_layout). // Computed layout state (refreshed by recompute_layout).
bool m_layoutDirty { true }; bool m_layoutDirty { true };

View file

@ -262,7 +262,7 @@ namespace ogfx
// ===================================================== SPECIALIZED ===================================================== // ===================================================== 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()) if (!m_initialized || !image.isLoaded())
return; return;
@ -319,16 +319,16 @@ namespace ogfx
// 5. Push quad // 5. Push quad
u32 inds[6] = QUAD_INDICES_ARR; 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 (!m_initialized) return;
if (!anim.hasImage()) return; if (!anim.hasImage()) return;
const Image& img = anim.getSpriteSheet(); const Image& img = anim.getSpriteSheet();
if (!img.isLoaded() || !img.isValid()) return; 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) void BasicRenderer2D::fillGradientRect(const Rectangle& rect, ColorGradient& gradient)

View file

@ -81,8 +81,8 @@ namespace ogfx
inline bool isInitialized(void) { return m_initialized; } inline bool isInitialized(void) { return m_initialized; }
inline FontGlyphAtlas& getFontGlyphAtlas(void) { return m_fontGlyphAtlas; } 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 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 }); 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 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 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); void drawCenteredString(const String& str, const Vec2& center, const Color& color, i32 fontSize = 0, f32 scale = 1.0f);

View file

@ -30,6 +30,7 @@ namespace ogfx
m_timer.create(m_animData.fps, [&](f64 dt) -> void { m_timer.create(m_animData.fps, [&](f64 dt) -> void {
update_animation(); update_animation();
}); });
update_animation();
return *this; return *this;
} }
@ -76,10 +77,15 @@ namespace ogfx
else else
m_currentFrame = 0; m_currentFrame = 0;
} }
i32 x = m_animData.pixelOffsetX + (((m_currentFrame % m_animData.columns) + m_animData.columnOffset) * m_animData.frameWidth); i32 col = m_currentFrame % m_animData.columns;
i32 y = m_animData.pixelOffsetY + (m_animData.rowOffset * m_animData.frameHeight); i32 row = (m_animData.rows > 1) ? cast<i32>(m_currentFrame / m_animData.columns) : 0;
if (m_animData.rows > 1)
y = m_animData.pixelOffsetY + ((cast<i32>(m_currentFrame / m_animData.columns) + m_animData.rowOffset) * m_animData.frameHeight); 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<f32>(x), cast<f32>(y), m_animData.frameWidth, m_animData.frameHeight }; m_frameRect = { cast<f32>(x), cast<f32>(y), m_animData.frameWidth, m_animData.frameHeight };
} }
} }

View file

@ -45,6 +45,8 @@ namespace ogfx
inline void setRowOffset(i32 o) { m_animData.rowOffset = o; } inline void setRowOffset(i32 o) { m_animData.rowOffset = o; }
inline void setPixelOffsetX(f32 o) { m_animData.pixelOffsetX = o; } inline void setPixelOffsetX(f32 o) { m_animData.pixelOffsetX = o; }
inline void setPixelOffsetY(f32 o) { m_animData.pixelOffsetY = 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 setNRows(i32 n) { m_animData.rows = n; }
inline void setNColumns(i32 n) { m_animData.columns = n; } inline void setNColumns(i32 n) { m_animData.columns = n; }
inline void setFrameWidth(i32 f) { m_animData.frameWidth = f; } inline void setFrameWidth(i32 f) { m_animData.frameWidth = f; }
@ -60,6 +62,8 @@ namespace ogfx
inline i32 getRowOffset(void) { return m_animData.rowOffset; } inline i32 getRowOffset(void) { return m_animData.rowOffset; }
inline f32 getPixelOffsetX(void) { return m_animData.pixelOffsetX; } inline f32 getPixelOffsetX(void) { return m_animData.pixelOffsetX; }
inline f32 getPixelOffsetY(void) { return m_animData.pixelOffsetY; } 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 getNRows(void) { return m_animData.rows; }
inline i32 getNColumns(void) { return m_animData.columns; } inline i32 getNColumns(void) { return m_animData.columns; }
inline i32 getFrameWidth(void) { return m_animData.frameWidth; } inline i32 getFrameWidth(void) { return m_animData.frameWidth; }

View file

@ -34,6 +34,8 @@ namespace ostd
i32 columnOffset { 0 }; i32 columnOffset { 0 };
f32 pixelOffsetX { 0.0f }; f32 pixelOffsetX { 0.0f };
f32 pixelOffsetY { 0.0f }; f32 pixelOffsetY { 0.0f };
f32 spacingX { 0.0f };;
f32 spacingY { 0.0f };;
i32 rows { 1 }; i32 rows { 1 };
i32 columns { 1 }; i32 columns { 1 };
f32 frameWidth{ 32 }; f32 frameWidth{ 32 };
@ -53,6 +55,8 @@ namespace ostd
str.add(" ").add("columnOffset: ").add(columnOffset).add(",\n"); str.add(" ").add("columnOffset: ").add(columnOffset).add(",\n");
str.add(" ").add("pixelOffsetX: ").add(pixelOffsetX, 2).add(",\n"); str.add(" ").add("pixelOffsetX: ").add(pixelOffsetX, 2).add(",\n");
str.add(" ").add("pixelOffsetY: ").add(pixelOffsetY, 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("rows: ").add(rows).add(",\n");
str.add(" ").add("columns: ").add(columns).add(",\n"); str.add(" ").add("columns: ").add(columns).add(",\n");
str.add(" ").add("frameWidth: ").add(frameWidth, 2).add(",\n"); str.add(" ").add("frameWidth: ").add(frameWidth, 2).add(",\n");

View file

@ -593,6 +593,18 @@ namespace ostd
return l_error(true); return l_error(true);
ad.pixelOffsetY = val.toFloat(); 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") else if (prop == "rows")
{ {
if (!val.isInt()) if (!val.isInt())

View file

@ -52,6 +52,17 @@ class Window : public ogfx::gui::Window
getToolBar().setHeight(30); 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.setText("Show Panel2");
m_label1.setCallback(ogfx::gui::Widget::eCallback::MousePressed, [&](const ogfx::gui::Event& event) -> void { m_label1.setCallback(ogfx::gui::Widget::eCallback::MousePressed, [&](const ogfx::gui::Event& event) -> void {
m_check1.setChecked(!m_check1.isChecked()); m_check1.setChecked(!m_check1.isChecked());
@ -136,9 +147,15 @@ class Window : public ogfx::gui::Window
for (i32 i = 0; i < 20; i++) for (i32 i = 0; i < 20; i++)
{ {
auto& btn = getToolBar().addButton("./img.png"); iconsAD.columnOffset = ostd::Random::getui32(0, 7);
btn.setAnimationData(ad); 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.enableAnimated();
btn.setAnimationData(iconsAD);
} }
m_tabs.setSize(900, 700); m_tabs.setSize(900, 700);