Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/gui/gui2_button.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
GuiButton::GuiButton(GuiContainer* owner, string id, string text, func_t func)
: GuiElement(owner, id), text(text), func(func)
{
intercepts_pointer = true;
text_size = -1;
back_style = theme->getStyle("button.back");
front_style = theme->getStyle("button.front");
Expand Down
5 changes: 1 addition & 4 deletions src/gui/gui2_button.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
#ifndef GUI2_BUTTON_H
#define GUI2_BUTTON_H
#pragma once

#include "gui2_element.h"

Expand Down Expand Up @@ -33,5 +32,3 @@ class GuiButton : public GuiElement
string getText() const;
string getIcon() const;
};

#endif//GUI2_BUTTON_H
6 changes: 2 additions & 4 deletions src/gui/gui2_canvas.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ void GuiCanvas::render(sp::RenderTarget& renderer)

runUpdates(this);
updateLayout(window_rect);
drawElements(mouse_position, window_rect, renderer);
GuiElement* hovered = getHoverElement(mouse_position);
drawElements(mouse_position, hovered, window_rect, renderer);

if (enable_debug_rendering)
{
Expand Down Expand Up @@ -172,9 +173,6 @@ void GuiCanvas::runUpdates(GuiContainer* parent)
element->owner = nullptr;
delete element;
}else{
element->hover = element->rect.contains(mouse_position);
element->hover_coordinates = mouse_position;

element->onUpdate();
if (element->isVisible())
runUpdates(element);
Expand Down
40 changes: 31 additions & 9 deletions src/gui/gui2_container.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,31 +11,36 @@ GuiContainer::~GuiContainer()
}
}

void GuiContainer::drawElements(glm::vec2 mouse_position, sp::Rect parent_rect, sp::RenderTarget& renderer)
void GuiContainer::drawElements(glm::vec2 mouse_position, GuiElement* hovered_element, sp::Rect parent_rect, sp::RenderTarget& renderer)
{
for(auto it = children.begin(); it != children.end(); )
for (auto it = children.begin(); it != children.end(); )
{
GuiElement* element = *it;
if (element->destroyed)
{
//Find the owning cancas, as we need to remove ourselves if we are the focus or click element.
// Find the owning canvas, as we need to remove ourselves if we are
// the focus or click element.
GuiCanvas* canvas = dynamic_cast<GuiCanvas*>(element->getTopLevelContainer());
if (canvas)
canvas->unfocusElementTree(element);
if (canvas) canvas->unfocusElementTree(element);

//Delete it from our list.
// Delete it from our list.
it = children.erase(it);

// Free up the memory used by the element.
element->owner = nullptr;
delete element;
}else{
element->hover = element->rect.contains(mouse_position);
}
else
{
// Manage this element's hover state.
element->hover = (element == hovered_element);
element->hover_coordinates = (element == hovered_element) ? mouse_position : glm::vec2{-100, -100};

// Draw the element.
if (element->visible)
{
element->onDraw(renderer);
element->drawElements(mouse_position, element->rect, renderer);
element->drawElements(mouse_position, hovered_element, element->rect, renderer);
}

it++;
Expand Down Expand Up @@ -97,6 +102,23 @@ GuiElement* GuiContainer::executeScrollOnElement(glm::vec2 position, float value
return nullptr;
}

GuiElement* GuiContainer::getHoverElement(glm::vec2 mouse_position)
{
for (auto it = children.rbegin(); it != children.rend(); it++)
{
GuiElement* element = *it;

if (element->visible && element->enabled && element->rect.contains(mouse_position))
{
GuiElement* hovered = element->getHoverElement(mouse_position);
if (hovered) return hovered;
if (element->intercepts_pointer) return element;
}
}

return nullptr;
}

void GuiContainer::updateLayout(const sp::Rect& rect)
{
this->rect = rect;
Expand Down
9 changes: 4 additions & 5 deletions src/gui/gui2_container.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
#ifndef GUI2_CONTAINER_H
#define GUI2_CONTAINER_H
#pragma once

#include <list>
#include <memory>
Expand All @@ -17,6 +16,7 @@ namespace sp {
class GuiElement;
class GuiLayout;
class GuiTheme;

class GuiContainer : sp::NonCopyable
{
public:
Expand Down Expand Up @@ -59,16 +59,15 @@ class GuiContainer : sp::NonCopyable

virtual void setAttribute(const string& key, const string& value);
protected:
virtual void drawElements(glm::vec2 mouse_position, sp::Rect parent_rect, sp::RenderTarget& window);
virtual void drawElements(glm::vec2 mouse_position, GuiElement* hovered_element, sp::Rect parent_rect, sp::RenderTarget& window);
virtual void drawDebugElements(sp::Rect parent_rect, sp::RenderTarget& window);
GuiElement* getClickElement(sp::io::Pointer::Button button, glm::vec2 position, sp::io::Pointer::ID id);
GuiElement* executeScrollOnElement(glm::vec2 position, float value);
GuiElement* getHoverElement(glm::vec2 mouse_position);

friend class GuiElement;

sp::Rect rect{0,0,0,0};
private:
std::unique_ptr<GuiLayout> layout_manager = nullptr;
};

#endif//GUI2_CONTAINER_H
2 changes: 1 addition & 1 deletion src/gui/gui2_element.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@


GuiElement::GuiElement(GuiContainer* owner, const string& id)
: owner(owner), visible(true), enabled(true), hover(false), focus(false), id(id)
: owner(owner), id(id)
{
owner->children.push_back(this);
destroyed = false;
Expand Down
22 changes: 10 additions & 12 deletions src/gui/gui2_element.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
#ifndef GUI2_ELEMENT_H
#define GUI2_ELEMENT_H
#pragma once

#include <functional>
#include "stringImproved.h"
Expand All @@ -10,24 +9,25 @@
#include "graphics/renderTarget.h"
#include "io/textinput.h"


class Layout;

class GuiElement : public GuiContainer
{
private:
bool destroyed;
protected:
GuiContainer* owner;
bool visible;
bool enabled;
bool hover;
bool visible = true;
bool enabled = true;
bool hover = false;
glm::vec2 hover_coordinates;
bool focus;
bool focus = false;
bool intercepts_pointer = false;
string id;
public:
constexpr static float GuiSizeMatchHeight = -1.0;
constexpr static float GuiSizeMatchWidth = -1.0;
constexpr static float GuiSizeMax = -2.0;
constexpr static float GuiSizeMatchHeight = -1.0f;
constexpr static float GuiSizeMatchWidth = -1.0f;
constexpr static float GuiSizeMax = -2.0f;

enum class State
{
Expand Down Expand Up @@ -91,5 +91,3 @@ class GuiElement : public GuiContainer
protected:
State getState() const;
};

#endif//GUI2_ELEMENT_H
1 change: 1 addition & 0 deletions src/gui/gui2_listbox.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
GuiListbox::GuiListbox(GuiContainer* owner, string id, func_t func)
: GuiEntryList(owner, id, func), text_size(30), button_height(50), text_alignment(sp::Alignment::Center)
{
intercepts_pointer = true;
scroll = new GuiScrollbar(this, id + "_SCROLL", 0, 0, 0, [](int value) {});
scroll
->setClickChange(button_height)
Expand Down
1 change: 1 addition & 0 deletions src/gui/gui2_panel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
GuiPanel::GuiPanel(GuiContainer* owner, string id)
: GuiElement(owner, id)
{
intercepts_pointer = true;
style = theme->getStyle("panel");
}

Expand Down
7 changes: 2 additions & 5 deletions src/gui/gui2_panel.h
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
#ifndef GUI2_PANEL_H
#define GUI2_PANEL_H
#pragma once

#include "gui2_element.h"


class GuiThemeStyle;

class GuiPanel : public GuiElement
{
protected:
Expand All @@ -15,5 +14,3 @@ class GuiPanel : public GuiElement
virtual void onDraw(sp::RenderTarget& renderer) override;
virtual bool onMouseDown(sp::io::Pointer::Button button, glm::vec2 position, sp::io::Pointer::ID id) override;
};

#endif//GUI2_PANEL_H
7 changes: 2 additions & 5 deletions src/gui/gui2_progressbar.h
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
#ifndef GUI2_PROGRESSBAR_H
#define GUI2_PROGRESSBAR_H
#pragma once

#include "gui2_element.h"


class GuiThemeStyle;

class GuiProgressbar : public GuiElement
{
protected:
Expand All @@ -28,5 +27,3 @@ class GuiProgressbar : public GuiElement
GuiProgressbar* setColor(glm::u8vec4 color);
GuiProgressbar* setDrawBackground(bool drawBackground);
};

#endif//GUI2_PROGRESSBAR_H
1 change: 1 addition & 0 deletions src/gui/gui2_progressslider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
GuiProgressSlider::GuiProgressSlider(GuiContainer* owner, string id, float min_value, float max_value, float start_value, func_t func)
: GuiProgressbar(owner, id, min_value, max_value, start_value), callback(func)
{
intercepts_pointer = true;
}

bool GuiProgressSlider::onMouseDown(sp::io::Pointer::Button button, glm::vec2 position, sp::io::Pointer::ID id)
Expand Down
1 change: 1 addition & 0 deletions src/gui/gui2_rotationdial.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
GuiRotationDial::GuiRotationDial(GuiContainer* owner, string id, float min_value, float max_value, float start_value, float rotation_offset, float ring_thickness, func_t func)
: GuiElement(owner, id), min_value(min_value), max_value(max_value), value(start_value), rotation_offset(rotation_offset), ring_thickness(ring_thickness), func(func)
{
intercepts_pointer = true;
radius = std::min(rect.size.x, rect.size.y) * 0.5f;

// Fetch styles
Expand Down
1 change: 1 addition & 0 deletions src/gui/gui2_scrollbar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
GuiScrollbar::GuiScrollbar(GuiContainer* owner, string id, int min_value, int max_value, int start_value, func_t func)
: GuiElement(owner, id), min_value(min_value), max_value(max_value), desired_value(start_value), value_size(1), func(func)
{
intercepts_pointer = true;
back_style = theme->getStyle("scrollbar.back");
front_style = theme->getStyle("scrollbar.front");

Expand Down
7 changes: 2 additions & 5 deletions src/gui/gui2_scrollbar.h
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
#ifndef GUI2_SCROLLBAR_H
#define GUI2_SCROLLBAR_H
#pragma once

#include "gui2_element.h"


class GuiThemeStyle;

class GuiScrollbar : public GuiElement
{
typedef std::function<void(int value)> func_t;
Expand Down Expand Up @@ -51,5 +50,3 @@ class GuiScrollbar : public GuiElement
int getCorrectedMax() const;
int getMin() const;
};

#endif//GUI2_SCROLLBAR_H
1 change: 1 addition & 0 deletions src/gui/gui2_selector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
GuiSelector::GuiSelector(GuiContainer* owner, string id, func_t func)
: GuiEntryList(owner, id, func)
{
intercepts_pointer = true;
back_style = theme->getStyle("selector.back");
front_style = theme->getStyle("selector.front");
left = new GuiArrowButton(this, id + "_ARROW_LEFT", 0, [this]() {
Expand Down
1 change: 0 additions & 1 deletion src/gui/gui2_selector.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

#include "gui2_entrylist.h"


class GuiArrowButton;
class GuiThemeStyle;
class GuiToggleButton;
Expand Down
2 changes: 2 additions & 0 deletions src/gui/gui2_slider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
GuiBasicSlider::GuiBasicSlider(GuiContainer* owner, string id, float min_value, float max_value, float start_value, func_t func)
: GuiElement(owner, id), min_value(min_value), max_value(max_value), value(start_value), func(func)
{
intercepts_pointer = true;
front_style = theme->getStyle("slider.front");
back_style = theme->getStyle("slider.back");
}
Expand Down Expand Up @@ -229,6 +230,7 @@ GuiSlider* GuiSlider::addOverlay(unsigned int precision, float font_size)
GuiSlider2D::GuiSlider2D(GuiContainer* owner, string id, glm::vec2 min_value, glm::vec2 max_value, glm::vec2 start_value, func_t func)
: GuiElement(owner, id), min_value(min_value), max_value(max_value), value(start_value), func(func)
{
intercepts_pointer = true;
front_style = theme->getStyle("slider.front");
back_style = theme->getStyle("slider.back");
}
Expand Down
6 changes: 2 additions & 4 deletions src/gui/gui2_slider.h
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
#ifndef GUI2_SLIDER_H
#define GUI2_SLIDER_H
#pragma once

#include "gui2_element.h"
#include "gui2_label.h"

class GuiThemeStyle;

class GuiBasicSlider : public GuiElement
{
public:
Expand Down Expand Up @@ -92,5 +92,3 @@ class GuiSlider2D : public GuiElement
GuiSlider2D* setValue(glm::vec2 value);
glm::vec2 getValue();
};

#endif//GUI2_SLIDER_H
1 change: 1 addition & 0 deletions src/gui/gui2_textentry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
GuiTextEntry::GuiTextEntry(GuiContainer* owner, string id, string text)
: GuiElement(owner, id), text(text), text_size(30), func(nullptr)
{
intercepts_pointer = true;
blink_timer.repeat(blink_rate);
front_style = theme->getStyle("textentry.front");
back_style = theme->getStyle("textentry.back");
Expand Down
7 changes: 2 additions & 5 deletions src/gui/gui2_textentry.h
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
#ifndef GUI2_TEXTENTRY_H
#define GUI2_TEXTENTRY_H
#pragma once

#include "gui2_element.h"
#include "timer.h"


class GuiThemeStyle;

class GuiTextEntry : public GuiElement
{
public:
Expand Down Expand Up @@ -64,5 +63,3 @@ class GuiTextEntry : public GuiElement
int getTextOffsetForPosition(glm::vec2 position);
void runChangeCallback();
};

#endif//GUI2_TEXTENTRY_H
1 change: 1 addition & 0 deletions src/gui/hotkeyBinder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
GuiHotkeyBinder::GuiHotkeyBinder(GuiContainer* owner, string id, sp::io::Keybinding* key)
: GuiElement(owner, id), key(key)
{
intercepts_pointer = true;
front_style = theme->getStyle("textentry.front");
back_style = theme->getStyle("textentry.back");
}
Expand Down
Loading
Loading