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"
)
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")

View file

@ -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
}
}

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
Add gradient to listbox selection
Add gradient to menubar background and selection
Add cursor stack
Add MacOS global menu integration
@ -61,7 +63,7 @@ Implement following widgets:
***ListBox
***Context Menu
***MenuBar
Toolbar
***Toolbar
StatusBar
ComboBox
TreeView

View file

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

View file

@ -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 };

View file

@ -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)

View file

@ -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);

View file

@ -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<i32>(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<i32>(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<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 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; }

View file

@ -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");

View file

@ -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())

View file

@ -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);