Added scroll functionality to Panel widget
This commit is contained in:
parent
8128baa107
commit
40b51bf3dc
11 changed files with 156 additions and 142 deletions
|
|
@ -1,20 +1,20 @@
|
||||||
% ================== DefaultTheme.oss ==================
|
% ================== DefaultTheme.oss ==================
|
||||||
|
|
||||||
|
|
||||||
% ---- Variables ----
|
% ==== Variables ====
|
||||||
const $accentColor = #DC143CFF
|
const $accentColor = #DC143CFF
|
||||||
const $textColor = #111111FF
|
const $textColor = #111111FF
|
||||||
const $accentColorLight = #F16A85FF
|
const $accentColorLight = #F16A85FF
|
||||||
const $accentColorDark = #6B0A1DFF
|
const $accentColorDark = #6B0A1DFF
|
||||||
% -------------------
|
% ===================
|
||||||
|
|
||||||
|
|
||||||
% ------ Root Widget ------
|
% ====== Root Widget ======
|
||||||
window.backgroundColor = rgba(160, 160, 160, 255)
|
window.backgroundColor = rgba(160, 160, 160, 255)
|
||||||
% -------------------------
|
% =========================
|
||||||
|
|
||||||
|
|
||||||
% ------ Panel ------
|
% ====== Panel ======
|
||||||
(panel) {
|
(panel) {
|
||||||
backgroundColor = #AAAAAAFF
|
backgroundColor = #AAAAAAFF
|
||||||
titleColor = $accentColorDark
|
titleColor = $accentColorDark
|
||||||
|
|
@ -30,14 +30,25 @@ window.backgroundColor = rgba(160, 160, 160, 255)
|
||||||
titlebarHeight = 18
|
titlebarHeight = 18
|
||||||
titlebarFontSize = 18
|
titlebarFontSize = 18
|
||||||
titlebarTextAlign = text_left
|
titlebarTextAlign = text_left
|
||||||
|
% scrollSpeed = Vec2(0.8, 0.8)
|
||||||
padding = Rect(15, 15, 15, 15)
|
padding = Rect(15, 15, 15, 15)
|
||||||
margin = Rect(0, 0, 0, 0)
|
margin = Rect(0, 0, 0, 0)
|
||||||
}
|
}
|
||||||
% -------------------
|
% ===================
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% ------ CheckBox ------
|
% ====== Scrollbar ======
|
||||||
|
% (scrollbar) {
|
||||||
|
% (handle) {
|
||||||
|
|
||||||
|
% }
|
||||||
|
% }
|
||||||
|
% =======================
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% ====== CheckBox ======
|
||||||
(checkbox) {
|
(checkbox) {
|
||||||
checkBorderColor = $accentColorDark
|
checkBorderColor = $accentColorDark
|
||||||
checkBoxColor = $accentColor
|
checkBoxColor = $accentColor
|
||||||
|
|
@ -67,11 +78,11 @@ window.backgroundColor = rgba(160, 160, 160, 255)
|
||||||
checkBorderColor = $accentColor
|
checkBorderColor = $accentColor
|
||||||
textColor = $accentColorDark
|
textColor = $accentColorDark
|
||||||
}
|
}
|
||||||
% ----------------------
|
% ======================
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% ------ Label ------
|
% ====== Label ======
|
||||||
(label) {
|
(label) {
|
||||||
textColor = $textColor
|
textColor = $textColor
|
||||||
backgroundColor = color_transparent
|
backgroundColor = color_transparent
|
||||||
|
|
@ -84,4 +95,4 @@ window.backgroundColor = rgba(160, 160, 160, 255)
|
||||||
padding = Rect(15, 15, 15, 15)
|
padding = Rect(15, 15, 15, 15)
|
||||||
margin = Rect(0, 0, 0, 0)
|
margin = Rect(0, 0, 0, 0)
|
||||||
}
|
}
|
||||||
% -------------------
|
% ===================
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,21 @@
|
||||||
/*
|
/*
|
||||||
OmniaFramework - A collection of useful functionality
|
OmniaFramework - A collection of useful functionality
|
||||||
Copyright (C) 2025 OmniaX-Dev
|
Copyright (C) 2025 OmniaX-Dev
|
||||||
|
|
||||||
This file is part of OmniaFramework.
|
This file is part of OmniaFramework.
|
||||||
|
|
||||||
OmniaFramework is free software: you can redistribute it and/or modify
|
OmniaFramework is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
(at your option) any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
OmniaFramework is distributed in the hope that it will be useful,
|
OmniaFramework is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with OmniaFramework. If not, see <https://www.gnu.org/licenses/>.
|
along with OmniaFramework. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
@ -102,7 +102,7 @@ namespace ogfx
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
inline Event(WindowCore& _window) : window(_window), drop(window, DropEventData::eDropType::None) { }
|
inline Event(WindowCore& _window) : window(_window), drop(window, DropEventData::eDropType::None) { }
|
||||||
inline void handle(void) { m_handled = true; }
|
inline void handle(void) const { m_handled = true; }
|
||||||
inline bool isHandled(void) const { return m_handled; }
|
inline bool isHandled(void) const { return m_handled; }
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
@ -114,7 +114,7 @@ namespace ogfx
|
||||||
u32 __original_signal_id { 0 };
|
u32 __original_signal_id { 0 };
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool m_handled { false };
|
mutable bool m_handled { false };
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -130,6 +130,7 @@ namespace ogfx
|
||||||
if (w == nullptr) continue;
|
if (w == nullptr) continue;
|
||||||
if (w->isInvalid()) continue;
|
if (w->isInvalid()) continue;
|
||||||
w->__applyTheme(theme, true);
|
w->__applyTheme(theme, true);
|
||||||
|
w->reloadTheme();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,21 @@
|
||||||
/*
|
/*
|
||||||
OmniaFramework - A collection of useful functionality
|
OmniaFramework - A collection of useful functionality
|
||||||
Copyright (C) 2025 OmniaX-Dev
|
Copyright (C) 2025 OmniaX-Dev
|
||||||
|
|
||||||
This file is part of OmniaFramework.
|
This file is part of OmniaFramework.
|
||||||
|
|
||||||
OmniaFramework is free software: you can redistribute it and/or modify
|
OmniaFramework is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
(at your option) any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
OmniaFramework is distributed in the hope that it will be useful,
|
OmniaFramework is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with OmniaFramework. If not, see <https://www.gnu.org/licenses/>.
|
along with OmniaFramework. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
@ -61,6 +61,7 @@ namespace ogfx
|
||||||
|
|
||||||
inline i32 widgetCount(void) const { return m_widgetList.size(); }
|
inline i32 widgetCount(void) const { return m_widgetList.size(); }
|
||||||
inline WindowCore& getWindow(void) { return m_window; }
|
inline WindowCore& getWindow(void) { return m_window; }
|
||||||
|
inline const stdvec<Widget*>& getWidgets(void) const { return m_widgetList; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void processDragAndDrop(Widget* widget, const Event& event);
|
void processDragAndDrop(Widget* widget, const Event& event);
|
||||||
|
|
|
||||||
|
|
@ -562,9 +562,9 @@ namespace ogfx
|
||||||
|
|
||||||
namespace gui
|
namespace gui
|
||||||
{
|
{
|
||||||
void Window::addWidget(Widget& widget)
|
void Window::addWidget(Widget& widget, const Vec2& position)
|
||||||
{
|
{
|
||||||
m_rootWidget.addChild(widget);
|
m_rootWidget.addWidget(widget, position);
|
||||||
setTheme(*m_guiTheme);
|
setTheme(*m_guiTheme);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -572,6 +572,7 @@ namespace ogfx
|
||||||
{
|
{
|
||||||
m_guiTheme = &theme;
|
m_guiTheme = &theme;
|
||||||
m_rootWidget.__applyTheme(theme, true);
|
m_rootWidget.__applyTheme(theme, true);
|
||||||
|
m_rootWidget.reloadTheme(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window::__on_window_init(i32 width, i32 height, const String& title)
|
void Window::__on_window_init(i32 width, i32 height, const String& title)
|
||||||
|
|
|
||||||
|
|
@ -212,7 +212,7 @@ namespace ogfx
|
||||||
public:
|
public:
|
||||||
inline Window(void) { }
|
inline Window(void) { }
|
||||||
inline Window(i32 width, i32 height, const String& title) { initialize(width, height, title); }
|
inline Window(i32 width, i32 height, const String& title) { initialize(width, height, title); }
|
||||||
void addWidget(Widget& widget);
|
void addWidget(Widget& widget, const Vec2& position = { 0, 0 });
|
||||||
void setTheme(const ostd::Stylesheet& theme) override;
|
void setTheme(const ostd::Stylesheet& theme) override;
|
||||||
|
|
||||||
inline virtual void onInitialize(void) { }
|
inline virtual void onInitialize(void) { }
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,7 @@ namespace ogfx
|
||||||
disableDrawBox();
|
disableDrawBox();
|
||||||
disableFocus();
|
disableFocus();
|
||||||
enableStopEvents();
|
enableStopEvents();
|
||||||
|
allowScroll(true);
|
||||||
validate();
|
validate();
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
@ -49,6 +50,7 @@ namespace ogfx
|
||||||
setBorderColor(getThemeValue<Color>(theme, "panel.borderColor", Colors::Black));
|
setBorderColor(getThemeValue<Color>(theme, "panel.borderColor", Colors::Black));
|
||||||
setPadding(getThemeValue<Rectangle>(theme, "panel.padding", { 15, 15, 15, 15 }));
|
setPadding(getThemeValue<Rectangle>(theme, "panel.padding", { 15, 15, 15, 15 }));
|
||||||
setMargin(getThemeValue<Rectangle>(theme, "panel.margin", { 0, 0, 0, 0 }));
|
setMargin(getThemeValue<Rectangle>(theme, "panel.margin", { 0, 0, 0, 0 }));
|
||||||
|
m_scrollSpeed = getThemeValue<Vec2>(theme, "panel.scrollSpeed", { 0.0f, 0.8f });
|
||||||
m_basePadding = getPadding();
|
m_basePadding = getPadding();
|
||||||
m_titleColor = getThemeValue<Color>(theme, "panel.titleColor", Colors::Black);
|
m_titleColor = getThemeValue<Color>(theme, "panel.titleColor", Colors::Black);
|
||||||
m_titlebarColor = getThemeValue<Color>(theme, "panel.titlebarColor", Colors::Transparent);
|
m_titlebarColor = getThemeValue<Color>(theme, "panel.titlebarColor", Colors::Transparent);
|
||||||
|
|
@ -61,10 +63,38 @@ namespace ogfx
|
||||||
}
|
}
|
||||||
|
|
||||||
void Panel::onDraw(ogfx::BasicRenderer2D& gfx)
|
void Panel::onDraw(ogfx::BasicRenderer2D& gfx)
|
||||||
|
{
|
||||||
|
if (isScrollAllowed())
|
||||||
|
gfx.fillRect(getContentExtents() + Rectangle { getGlobalPosition(), 0, 0 }, { 80, 0, 0, 30 });
|
||||||
|
}
|
||||||
|
|
||||||
|
void Panel::afterDraw(ogfx::BasicRenderer2D& gfx)
|
||||||
{
|
{
|
||||||
draw_titlebar(gfx);
|
draw_titlebar(gfx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Panel::onMouseScrolled(const Event& event)
|
||||||
|
{
|
||||||
|
if (!isScrollAllowed())
|
||||||
|
return;
|
||||||
|
auto ext = getContentExtents();
|
||||||
|
auto cont = getContentBounds();
|
||||||
|
f32 maxScroll = -(ext.h - cont.h);
|
||||||
|
if (event.mouse->scroll == MouseEventData::eScrollDirection::Down && m_scrollOffset.y > maxScroll)
|
||||||
|
{
|
||||||
|
m_scrollOffset -= (m_scrollSpeed * 15.0f);
|
||||||
|
if (m_scrollOffset.y < maxScroll)
|
||||||
|
m_scrollOffset.y = maxScroll;
|
||||||
|
}
|
||||||
|
else if (event.mouse->scroll == MouseEventData::eScrollDirection::Up && m_scrollOffset.y < 0)
|
||||||
|
{
|
||||||
|
m_scrollOffset += (m_scrollSpeed * 15.0f);
|
||||||
|
if (m_scrollOffset.y > 0)
|
||||||
|
m_scrollOffset.y = 0;
|
||||||
|
}
|
||||||
|
event.handle();
|
||||||
|
}
|
||||||
|
|
||||||
void Panel::setTitlebarType(const String& type)
|
void Panel::setTitlebarType(const String& type)
|
||||||
{
|
{
|
||||||
String t = type.new_toLower().trim();
|
String t = type.new_toLower().trim();
|
||||||
|
|
|
||||||
|
|
@ -45,18 +45,22 @@ namespace ogfx
|
||||||
Panel& create(void);
|
Panel& create(void);
|
||||||
void applyTheme(const ostd::Stylesheet& theme) override;
|
void applyTheme(const ostd::Stylesheet& theme) override;
|
||||||
void onDraw(ogfx::BasicRenderer2D& gfx) override;
|
void onDraw(ogfx::BasicRenderer2D& gfx) override;
|
||||||
|
void afterDraw(ogfx::BasicRenderer2D& gfx) override;
|
||||||
|
void onMouseScrolled(const Event& event) override;
|
||||||
void setTitlebarType(const String& type);
|
void setTitlebarType(const String& type);
|
||||||
String getTitlebarType(void) const;
|
String getTitlebarType(void) const;
|
||||||
inline void setBackGroundColor(const Color& color) { m_backgroundColor = color; }
|
inline void setBackGroundColor(const Color& color) { m_backgroundColor = color; }
|
||||||
inline Color getBackgroundColor(void) { return m_backgroundColor; }
|
inline Color getBackgroundColor(void) { return m_backgroundColor; }
|
||||||
inline String getTitle(void) const { return m_title; }
|
inline String getTitle(void) const { return m_title; }
|
||||||
inline void setTitle(const String& title) { m_title = title; }
|
inline void setTitle(const String& title) { m_title = title; }
|
||||||
|
inline Vec2 getScrollOffset(void) const override { return m_scrollOffset; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void draw_titlebar(BasicRenderer2D& gfx);
|
void draw_titlebar(BasicRenderer2D& gfx);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
String m_title { "Panel" };
|
String m_title { "Panel" };
|
||||||
|
Vec2 m_scrollOffset { 0, 0 };
|
||||||
|
|
||||||
Color m_titleColor { Colors::Black };
|
Color m_titleColor { Colors::Black };
|
||||||
i32 m_titlebarType = TitleBarTypes::NoneValue;
|
i32 m_titlebarType = TitleBarTypes::NoneValue;
|
||||||
|
|
@ -67,6 +71,7 @@ namespace ogfx
|
||||||
Color m_titlebarBorderColor { Colors::Black };
|
Color m_titlebarBorderColor { Colors::Black };
|
||||||
Rectangle m_basePadding { 0, 0, 0, 0 };
|
Rectangle m_basePadding { 0, 0, 0, 0 };
|
||||||
i32 m_titleTextAlign { 0 };
|
i32 m_titleTextAlign { 0 };
|
||||||
|
Vec2 m_scrollSpeed { 0.8f, 0.8f };
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -36,10 +36,12 @@ namespace ogfx
|
||||||
m_window = &window;
|
m_window = &window;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Widget::addChild(Widget& child)
|
bool Widget::addWidget(Widget& child, const Vec2& position)
|
||||||
{
|
{
|
||||||
if (!m_allowChildren)
|
if (!m_allowChildren)
|
||||||
return false;
|
return false;
|
||||||
|
if (position.x != 0 || position.y != 0)
|
||||||
|
child.setPosition(position);
|
||||||
child.reloadTheme();
|
child.reloadTheme();
|
||||||
return m_widgets.addWidget(child);
|
return m_widgets.addWidget(child);
|
||||||
}
|
}
|
||||||
|
|
@ -48,7 +50,7 @@ namespace ogfx
|
||||||
{
|
{
|
||||||
Vec2 glob = getPosition();
|
Vec2 glob = getPosition();
|
||||||
if (!m_rootChild && m_parent != nullptr)
|
if (!m_rootChild && m_parent != nullptr)
|
||||||
glob += m_parent->getGlobalPosition() + m_parent->getPadding().getPosition();
|
glob += m_parent->getGlobalPosition() + m_parent->getPadding().getPosition() + m_parent->getScrollOffset();
|
||||||
glob += m_margin.getPosition();
|
glob += m_margin.getPosition();
|
||||||
return glob;
|
return glob;
|
||||||
}
|
}
|
||||||
|
|
@ -75,6 +77,19 @@ namespace ogfx
|
||||||
return { getGlobalContentPosition(), getContentBounds().getSize() };
|
return { getGlobalContentPosition(), getContentBounds().getSize() };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Rectangle Widget::getContentExtents(void) const
|
||||||
|
{
|
||||||
|
f32 maxX = 0, maxY = 0;
|
||||||
|
for (auto* child : m_widgets.getWidgets())
|
||||||
|
{
|
||||||
|
if (!child || child->isInvalid()) continue;
|
||||||
|
Vec2 localPos = getPadding().getPosition() + child->getPosition() + child->getMargin().getPosition() + child->getContentBounds().getPosition();
|
||||||
|
maxX = std::max(maxX, localPos.x + child->getw() + child->getMargin().w);
|
||||||
|
maxY = std::max(maxY, localPos.y + child->geth() + child->getMargin().h);
|
||||||
|
}
|
||||||
|
return { 0, 0, maxX, maxY };
|
||||||
|
}
|
||||||
|
|
||||||
bool Widget::contains(Vec2 p, bool includeBounds) const
|
bool Widget::contains(Vec2 p, bool includeBounds) const
|
||||||
{
|
{
|
||||||
return Rectangle(getGlobalPosition(), getSize()).contains(p, includeBounds);
|
return Rectangle(getGlobalPosition(), getSize()).contains(p, includeBounds);
|
||||||
|
|
@ -91,7 +106,7 @@ namespace ogfx
|
||||||
m_themeOverrides.push_back({ fullKey, value });
|
m_themeOverrides.push_back({ fullKey, value });
|
||||||
}
|
}
|
||||||
|
|
||||||
void Widget::reloadTheme(void)
|
void Widget::reloadTheme(bool propagate)
|
||||||
{
|
{
|
||||||
if (getWindow().theme() == nullptr)
|
if (getWindow().theme() == nullptr)
|
||||||
return;
|
return;
|
||||||
|
|
@ -116,7 +131,7 @@ namespace ogfx
|
||||||
backup.push_back({ currentValuePtr, currentValue, rule.fullKey });
|
backup.push_back({ currentValuePtr, currentValue, rule.fullKey });
|
||||||
const_cast_theme.setFull(rule.fullKey, rule.value);
|
const_cast_theme.setFull(rule.fullKey, rule.value);
|
||||||
}
|
}
|
||||||
__applyTheme(const_cast_theme, false);
|
__applyTheme(const_cast_theme, propagate);
|
||||||
for (auto&[ptr, val, key] : backup)
|
for (auto&[ptr, val, key] : backup)
|
||||||
{
|
{
|
||||||
if (ptr == nullptr)
|
if (ptr == nullptr)
|
||||||
|
|
@ -189,6 +204,7 @@ namespace ogfx
|
||||||
m_widgets.draw(gfx);
|
m_widgets.draw(gfx);
|
||||||
if (m_showBorder)
|
if (m_showBorder)
|
||||||
gfx.drawRoundRect({ getGlobalPosition(), getSize() }, m_borderColor, m_borderRadius, m_borderWidth);
|
gfx.drawRoundRect({ getGlobalPosition(), getSize() }, m_borderColor, m_borderRadius, m_borderWidth);
|
||||||
|
afterDraw(gfx);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Widget::__update(void)
|
void Widget::__update(void)
|
||||||
|
|
|
||||||
|
|
@ -41,18 +41,20 @@ namespace ogfx
|
||||||
public: using EventCallback = std::function<void(const Event&)>;
|
public: using EventCallback = std::function<void(const Event&)>;
|
||||||
public:
|
public:
|
||||||
Widget(const Rectangle& bounds, WindowCore& window);
|
Widget(const Rectangle& bounds, WindowCore& window);
|
||||||
bool addChild(Widget& child);
|
bool addWidget(Widget& child, const Vec2& position = { 0, 0 });
|
||||||
virtual Vec2 getGlobalPosition(void) const;
|
virtual Vec2 getGlobalPosition(void) const;
|
||||||
virtual Vec2 getGlobalContentPosition(void) const;
|
virtual Vec2 getGlobalContentPosition(void) const;
|
||||||
virtual Rectangle getGlobalBounds(void) const;
|
virtual Rectangle getGlobalBounds(void) const;
|
||||||
virtual Rectangle getContentBounds(void) const;
|
virtual Rectangle getContentBounds(void) const;
|
||||||
virtual Rectangle getGlobalContentBounds(void) const;
|
virtual Rectangle getGlobalContentBounds(void) const;
|
||||||
|
virtual Rectangle getContentExtents(void) const;
|
||||||
using Rectangle::contains;
|
using Rectangle::contains;
|
||||||
bool contains(Vec2 p, bool includeBounds = false) const override;
|
bool contains(Vec2 p, bool includeBounds = false) const override;
|
||||||
void enable(bool enable = true);
|
void enable(bool enable = true);
|
||||||
virtual void applyTheme(const ostd::Stylesheet& theme) = 0;
|
virtual void applyTheme(const ostd::Stylesheet& theme) = 0;
|
||||||
|
inline virtual Vec2 getScrollOffset(void) const { return { 0, 0 }; }
|
||||||
void addThemeOverride(const String& fullKey, ostd::Stylesheet::TypeVariant value);
|
void addThemeOverride(const String& fullKey, ostd::Stylesheet::TypeVariant value);
|
||||||
void reloadTheme(void);
|
void reloadTheme(bool propagate = false);
|
||||||
void setThemeQualifier(const String& qualifier, bool value = true);
|
void setThemeQualifier(const String& qualifier, bool value = true);
|
||||||
bool getThemeQualifier(const String& qualifier) const;
|
bool getThemeQualifier(const String& qualifier) const;
|
||||||
bool addThemeID(const String& id);
|
bool addThemeID(const String& id);
|
||||||
|
|
@ -61,6 +63,7 @@ namespace ogfx
|
||||||
inline const ostd::Stylesheet::QualifierList& getThemeQualifierList(void) const { return m_qualifierList; }
|
inline const ostd::Stylesheet::QualifierList& getThemeQualifierList(void) const { return m_qualifierList; }
|
||||||
|
|
||||||
inline virtual void onDraw(ogfx::BasicRenderer2D& gfx) { }
|
inline virtual void onDraw(ogfx::BasicRenderer2D& gfx) { }
|
||||||
|
inline virtual void afterDraw(ogfx::BasicRenderer2D& gfx) { }
|
||||||
inline virtual void onUpdate(void) { }
|
inline virtual void onUpdate(void) { }
|
||||||
|
|
||||||
inline virtual void onMousePressed(const Event& event) { }
|
inline virtual void onMousePressed(const Event& event) { }
|
||||||
|
|
@ -156,6 +159,8 @@ namespace ogfx
|
||||||
inline bool isVisible(void) const { return m_visible; }
|
inline bool isVisible(void) const { return m_visible; }
|
||||||
inline void show(void) { setVisible(true); }
|
inline void show(void) { setVisible(true); }
|
||||||
inline void hide(void) { setVisible(false); }
|
inline void hide(void) { setVisible(false); }
|
||||||
|
inline void allowScroll(bool allow = true) { m_allowScroll = allow; }
|
||||||
|
inline bool isScrollAllowed(void) const { return m_allowScroll; }
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline T getThemeValue(const ostd::Stylesheet &theme, const String& key, const T& fallback)
|
inline T getThemeValue(const ostd::Stylesheet &theme, const String& key, const T& fallback)
|
||||||
|
|
@ -215,6 +220,7 @@ namespace ogfx
|
||||||
bool m_clipContents { true };
|
bool m_clipContents { true };
|
||||||
bool m_acceptDragAndDrop { false };
|
bool m_acceptDragAndDrop { false };
|
||||||
bool m_visible { true };
|
bool m_visible { true };
|
||||||
|
bool m_allowScroll { false };
|
||||||
MouseEventData::eButton m_pressedButton { MouseEventData::eButton::None };
|
MouseEventData::eButton m_pressedButton { MouseEventData::eButton::None };
|
||||||
|
|
||||||
stdvec<String> m_themeIDList;
|
stdvec<String> m_themeIDList;
|
||||||
|
|
|
||||||
|
|
@ -31,115 +31,59 @@ class Window : public ogfx::gui::Window
|
||||||
inline Window(void) { }
|
inline Window(void) { }
|
||||||
inline void onInitialize(void) override
|
inline void onInitialize(void) override
|
||||||
{
|
{
|
||||||
m_img.loadFromFile("./img.png", m_gfx);
|
// m_img.loadFromFile("./img.png", m_gfx);
|
||||||
ogfx::Animation::AnimationData ad;
|
// ogfx::Animation::AnimationData ad;
|
||||||
ad.backwards = false;
|
// ad.backwards = false;
|
||||||
ad.columns = 9;
|
// ad.columns = 9;
|
||||||
ad.rows = 4;
|
// ad.rows = 4;
|
||||||
ad.frame_width = 256;
|
// ad.frame_width = 256;
|
||||||
ad.frame_height = 256;
|
// ad.frame_height = 256;
|
||||||
ad.length = 36;
|
// ad.length = 36;
|
||||||
ad.random = false;
|
// ad.random = false;
|
||||||
ad.still = false;
|
// ad.still = false;
|
||||||
ad.speed = 0;
|
// ad.speed = 0;
|
||||||
m_anim.create(ad);
|
// m_anim.create(ad);
|
||||||
m_anim.setSpriteSheet(m_img);
|
// m_anim.setSpriteSheet(m_img);
|
||||||
|
|
||||||
m_panel1.setSize(300, 140);
|
|
||||||
m_panel1.setPosition(350, 50);
|
|
||||||
m_panel1.setMousePressedCallback([&](const ogfx::gui::Event& event) -> void {
|
|
||||||
pos = { event.mouse->position_x, event.mouse->position_y };
|
|
||||||
});
|
|
||||||
m_panel1.setMouseDraggedCallback([&](const ogfx::gui::Event& event) -> void {
|
|
||||||
if (m_panel1.getPressedMouseButton() == ogfx::MouseEventData::eButton::None)
|
|
||||||
return;
|
|
||||||
ostd::Vec2 pos2 { event.mouse->position_x, event.mouse->position_y };
|
|
||||||
m_panel1.addPos(pos2 - pos);
|
|
||||||
pos = pos2;
|
|
||||||
});
|
|
||||||
m_panel1.setMouseScrolledCallback([&](const ogfx::gui::Event& event) -> void {
|
|
||||||
std::cout << "SCROLLED IN THE PANEL LOL \n";
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
m_panel2.setSize(600, 400);
|
|
||||||
m_panel2.setPosition(170, 200);
|
|
||||||
m_panel2.setMousePressedCallback([&](const ogfx::gui::Event& event) -> void {
|
|
||||||
ogfx::gui::Widget::setDragAndDropData(m_label3);
|
|
||||||
setCursor(eCursor::Move);
|
|
||||||
});
|
|
||||||
m_panel2.setMouseReleasedCallback([&](const ogfx::gui::Event& event) -> void {
|
|
||||||
setCursor(eCursor::Default);
|
|
||||||
});
|
|
||||||
|
|
||||||
m_label1.setPosition(100, 200);
|
m_label1.setText("Show Panel2");
|
||||||
m_label1.setText("Hello World!");
|
|
||||||
m_label1.setMousePressedCallback([&](const ogfx::gui::Event& event) -> void {
|
m_label1.setMousePressedCallback([&](const ogfx::gui::Event& event) -> void {
|
||||||
std::cout << "PRESS!\n";
|
|
||||||
m_check1.setChecked(!m_check1.isChecked());
|
m_check1.setChecked(!m_check1.isChecked());
|
||||||
});
|
});
|
||||||
m_label1.setMouseScrolledCallback([&](const ogfx::gui::Event& event) -> void {
|
m_label1.addThemeOverride("@.label.showBackground", true);
|
||||||
std::cout << "SCROLL!\n";
|
m_label1.addThemeOverride("@.label.backgroundColor", Colors::Beige);
|
||||||
});
|
m_label1.addThemeOverride("@.label.showBorder", true);
|
||||||
addWidget(m_label1);
|
m_label1.addThemeOverride("@.label.borderWidth", 2);
|
||||||
m_panel2.addChild(m_panel1);
|
m_label1.addThemeOverride("@.label.borderColor", Colors::DarkMagenta);
|
||||||
addWidget(m_panel2);
|
m_label1.addThemeOverride("@:pressed.label.backgroundColor", Colors::Crimson);
|
||||||
|
m_label1.addThemeOverride("@:hover.label.backgroundColor", Colors::DarkRed);
|
||||||
|
m_label1.reloadTheme();
|
||||||
|
|
||||||
|
|
||||||
m_check1.setPosition(30, 30);
|
|
||||||
m_check1.setText("Check this out!");
|
m_check1.setText("Check this out!");
|
||||||
|
m_check1.setChecked(true);
|
||||||
m_check1.setStateChangedCallback([&](ogfx::gui::widgets::CheckBox& sender, bool state) -> void {
|
m_check1.setStateChangedCallback([&](ogfx::gui::widgets::CheckBox& sender, bool state) -> void {
|
||||||
m_panel1.setVisible(state);
|
m_panel1.setVisible(state);
|
||||||
});
|
});
|
||||||
addWidget(m_check1);
|
|
||||||
|
|
||||||
m_label2.setPosition(0, 0);
|
m_label2.setText("Label2");
|
||||||
m_label2.setText("Ciccia Bella!");
|
m_label3.setText("Label3");
|
||||||
m_label2.connectSignal(ostd::BuiltinSignals::FileDragAndDropped);
|
|
||||||
m_label2.addThemeID("testLabel");
|
|
||||||
m_label2.addThemeID("testLabel2");
|
|
||||||
m_label2.setSignalCallback([&](ostd::Signal& signal) -> void {
|
|
||||||
if (signal.ID == ostd::BuiltinSignals::FileDragAndDropped)
|
|
||||||
{
|
|
||||||
auto& data = (ogfx::DropEventData&)signal.userData;
|
|
||||||
if (ostd::FileSystem::fileExists(data.textOrFilePath))
|
|
||||||
{
|
|
||||||
m_theme.loadFromFile(data.textOrFilePath);
|
|
||||||
m_rootWidget.reloadTheme();
|
|
||||||
}
|
|
||||||
std::cout << data.textOrFilePath << "\n";
|
|
||||||
}
|
|
||||||
});
|
|
||||||
m_label2.setMouseScrolledCallback([&](const ogfx::gui::Event& event) -> void {
|
|
||||||
std::cout << "BARBABARBA!\n";
|
|
||||||
});
|
|
||||||
m_label2.enableDragAndDrop();
|
|
||||||
m_label2.setDragAndDropCallback([&](const ogfx::gui::Event& event) -> void {
|
|
||||||
if (event.drop.userObject->getTypeName() == "ogfx::gui::widgets::Label")
|
|
||||||
{
|
|
||||||
std::cout << cast<ogfx::gui::widgets::Label&>(*event.drop.userObject).getText() << "!\n";
|
|
||||||
}
|
|
||||||
});
|
|
||||||
m_panel1.addChild(m_label2);
|
|
||||||
|
|
||||||
m_label1.addThemeOverride("@:pressed.label.textColor", Colors::Crimson);
|
m_panel1.setSize(300, 140);
|
||||||
|
m_panel1.allowScroll(false);
|
||||||
|
|
||||||
|
m_panel2.setSize(600, 400);
|
||||||
|
|
||||||
|
m_panel1.addWidget(m_label2);
|
||||||
|
|
||||||
|
m_panel2.addWidget(m_label3);
|
||||||
|
m_panel2.addWidget(m_panel1, { 0, 50 });
|
||||||
|
m_panel2.addWidget(m_label1, { 0, 340 });
|
||||||
|
|
||||||
|
addWidget(m_check1, { 30, 30 });
|
||||||
|
addWidget(m_panel2, { 30, 100 });
|
||||||
|
|
||||||
m_theme.loadFromFile("./DefaultTheme.oss", true, getDefaultStylesheetVariableList());
|
m_theme.loadFromFile("./DefaultTheme.oss", true, getDefaultStylesheetVariableList());
|
||||||
|
|
||||||
m_label2.addThemeOverride("@:hover.label.showBackground", true);
|
|
||||||
m_label2.addThemeOverride("@:hover.label.backgroundColor", Colors::DarkGreen);
|
|
||||||
|
|
||||||
m_label3.setPosition(0, 30);
|
|
||||||
m_label3.setText("Bella!");
|
|
||||||
m_label3.setMousePressedCallback([&](const ogfx::gui::Event& event) -> void {
|
|
||||||
std::cout << "BALALLA!\n";
|
|
||||||
});
|
|
||||||
m_label3.addThemeID("label3");
|
|
||||||
m_panel1.addChild(m_label3);
|
|
||||||
|
|
||||||
wout().setFontSize(80);
|
|
||||||
|
|
||||||
|
|
||||||
setTheme(m_theme);
|
setTheme(m_theme);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -171,7 +115,6 @@ class Window : public ogfx::gui::Window
|
||||||
ogfx::gui::widgets::Panel m_panel2 { *this };
|
ogfx::gui::widgets::Panel m_panel2 { *this };
|
||||||
ogfx::gui::widgets::CheckBox m_check1 { *this };
|
ogfx::gui::widgets::CheckBox m_check1 { *this };
|
||||||
ostd::Stylesheet m_theme;
|
ostd::Stylesheet m_theme;
|
||||||
ostd::Vec2 pos { 0, 0 };
|
|
||||||
ogfx::Animation m_anim;
|
ogfx::Animation m_anim;
|
||||||
ogfx::Image m_img;
|
ogfx::Image m_img;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue