Button redone. Implemented a radio button demo.
This commit is contained in:
@@ -24,8 +24,8 @@ namespace JUI
|
||||
public:
|
||||
Event<Vector2> MouseEnter;
|
||||
Event<Vector2> MouseExit;
|
||||
Event<Vector2> MousePress;
|
||||
Event<Vector2, bool> MouseRelease;
|
||||
//Event<Vector2> MousePress;
|
||||
//Event<Vector2, bool> MouseRelease;
|
||||
public:
|
||||
void SetCornerRounding(float radius);
|
||||
void SetCornerRounding(float tlRadius, float trRadius, float blRadius, float brRadius);
|
||||
@@ -36,7 +36,7 @@ namespace JUI
|
||||
|
||||
void SetClipsDescendants(bool clipping);
|
||||
void BGColor(const Color4& col);
|
||||
void SetBorderColor(const Color4& col);
|
||||
void BorderColor(const Color4& col);
|
||||
void SetBorderWidth(float w);
|
||||
|
||||
|
||||
|
@@ -14,8 +14,19 @@ namespace JUI
|
||||
Disabled
|
||||
};
|
||||
|
||||
enum class MouseBtn {
|
||||
Left = 1,
|
||||
Middle = 2,
|
||||
Right = 3
|
||||
};
|
||||
|
||||
class Button : public Widget, public RectBase, public Clickable
|
||||
{
|
||||
public:
|
||||
Event<Vector2> OnHoverEvent;
|
||||
Event<Vector2> OnExitEvent;
|
||||
Event<Vector2> OnPressEvent;
|
||||
Event<Vector2, bool> OnReleaseEvent;
|
||||
public:
|
||||
Button();
|
||||
explicit Button(Widget* parent);
|
||||
@@ -47,8 +58,27 @@ namespace JUI
|
||||
void SetEnabled(bool enabled);
|
||||
void Draw() override;
|
||||
void Update(float delta) override;
|
||||
|
||||
void GotoHoverColor();
|
||||
|
||||
#pragma region Overrides
|
||||
virtual void OnHover(const Vector2& MousePos) {
|
||||
OnHoverEvent.Invoke(MousePos);
|
||||
};
|
||||
virtual void OnExit(const Vector2& MousePos) {
|
||||
OnExitEvent.Invoke(MousePos);
|
||||
};
|
||||
virtual void OnPress(const Vector2& MousePos) {
|
||||
//BGColor(GetPressedBGColor());
|
||||
//BorderColor(GetPressedBorderColor());
|
||||
OnPressEvent.Invoke(MousePos);
|
||||
};
|
||||
virtual void OnRelease(const Vector2& MousePos, bool MouseStillOver) {
|
||||
OnReleaseEvent.Invoke(MousePos, MouseStillOver);
|
||||
};
|
||||
#pragma endregion
|
||||
protected:
|
||||
bool mouse_inside_debounce;
|
||||
bool hover_debounce;
|
||||
bool is_pressed;
|
||||
private:
|
||||
};
|
||||
|
91
main.cpp
91
main.cpp
@@ -18,6 +18,71 @@
|
||||
#include <rewindow/types/window.h>
|
||||
#include <jlog/jlog.hpp>
|
||||
|
||||
class CoolButton : public JUI::Button {
|
||||
public:
|
||||
CoolButton();
|
||||
CoolButton(Widget* parent);
|
||||
~CoolButton() override {};
|
||||
void Update(float delta);
|
||||
void OnHover(const Vector2& MousePos);
|
||||
void OnExit(const Vector2& MousePos);
|
||||
void OnPress(const Vector2& MousePos);
|
||||
void OnRelease(const Vector2& MousePos, bool MouseStillOver);
|
||||
};
|
||||
|
||||
CoolButton::CoolButton(): Button() {}
|
||||
|
||||
CoolButton::CoolButton(Widget *parent): Button(parent) {};
|
||||
|
||||
void CoolButton::Update(float delta) {
|
||||
if (IsHovered() && !hover_debounce) {
|
||||
OnHover(last_known_mouse_pos);
|
||||
hover_debounce = true;
|
||||
}
|
||||
|
||||
if (!IsHovered() && hover_debounce) {
|
||||
OnExit(last_known_mouse_pos);
|
||||
hover_debounce = false;
|
||||
}
|
||||
|
||||
if (hover_debounce && (lmb_state == true && prev_lmb_state != true)) {
|
||||
if (!is_pressed) {
|
||||
OnPress(last_known_mouse_pos);
|
||||
is_pressed = true;
|
||||
} else {
|
||||
OnRelease(last_known_mouse_pos, lmb_state);
|
||||
is_pressed = false;
|
||||
}
|
||||
}
|
||||
|
||||
//if (IsPressed() && (lmb_state == true && prev_lmb_state == true)) {
|
||||
// OnRelease(last_known_mouse_pos, IsHovered());
|
||||
// is_pressed = false;
|
||||
//}
|
||||
|
||||
prev_lmb_state = lmb_state;
|
||||
}
|
||||
|
||||
void CoolButton::OnHover(const Vector2& MousePos) {
|
||||
DEBUG("Hovered CoolButton")
|
||||
OnHoverEvent.Invoke(MousePos);
|
||||
}
|
||||
|
||||
void CoolButton::OnExit(const Vector2& MousePos) {
|
||||
DEBUG("Exited CoolButton")
|
||||
OnExitEvent.Invoke(MousePos);
|
||||
}
|
||||
|
||||
void CoolButton::OnPress(const Vector2& MousePos) {
|
||||
DEBUG("Pressed CoolButton")
|
||||
OnPressEvent.Invoke(MousePos);
|
||||
}
|
||||
|
||||
void CoolButton::OnRelease(const Vector2& MousePos, bool MouseStillOver) {
|
||||
DEBUG("Released CoolButton")
|
||||
OnReleaseEvent.Invoke(MousePos, MouseStillOver);
|
||||
}
|
||||
|
||||
JGL::Font FreeSans;
|
||||
JUI::Scene* scene;
|
||||
|
||||
@@ -38,7 +103,7 @@ JUI::Scene* CreateScene() {
|
||||
auto size = UDim2(64, 64, 0, 0);
|
||||
rect_element->SetSize({0, 0, 0.5f, 0.5f});
|
||||
rect_element->SetClipsDescendants(true);
|
||||
rect_element->SetBorderColor({255,255,255});
|
||||
rect_element->BorderColor({255, 255, 255});
|
||||
rect_element->SetBorderWidth(2.f);
|
||||
|
||||
rect_element->MouseEnter += [rect_element] (auto coords) {
|
||||
@@ -59,30 +124,28 @@ JUI::Scene* CreateScene() {
|
||||
|
||||
|
||||
// Button //
|
||||
Button* button_element = new Button(root);
|
||||
CoolButton* button_element = new CoolButton(root);
|
||||
button_element->SetName("BobJim");
|
||||
button_element->BGColor({0,0,64});
|
||||
button_element->SetSize({0, 0, 0.1f, 0.1f});
|
||||
button_element->SetClipsDescendants(true);
|
||||
button_element->SetBorderColor({255,255,255});
|
||||
button_element->BorderColor({255, 255, 255});
|
||||
button_element->SetBorderWidth(2.f);
|
||||
auto bpos = rect_element->GetSize();
|
||||
DEBUG(std::format("Just testing shit {} {}", bpos.X.Scale, bpos.Y.Scale));
|
||||
//exit(1);
|
||||
button_element->SetPosition({bpos.X.Pixels, bpos.Y.Pixels, bpos.X.Scale - 0.2f, 0}); // I don't know how to use sx and sy - maxine
|
||||
button_element->MousePress += [&, button_element, rect_element] (auto dummy) {
|
||||
DEBUG("Get FUCKED lol")
|
||||
rect_element->BGColor({128, 0, 0});
|
||||
button_element->OnPressEvent += [rect_element] (Vector2 MouseCoords) {
|
||||
rect_element->BGColor({64, 0, 0});
|
||||
};
|
||||
button_element->MouseRelease += [&, button_element, rect_element] (auto coords, bool stillover) {
|
||||
DEBUG("Get FUCKED kek")
|
||||
if (stillover) {
|
||||
rect_element->BGColor({0, 0, 64});
|
||||
} else {
|
||||
rect_element->BGColor({0, 64, 0});
|
||||
}
|
||||
button_element->OnReleaseEvent += [rect_element] (Vector2 MouseCoords, bool MouseStillOver) {
|
||||
rect_element->BGColor({0, 64, 0});
|
||||
};
|
||||
|
||||
Text* btntext = new Text(button_element);
|
||||
btntext->SetContent("I AM BUTTON");
|
||||
btntext->SetFont(FreeSans);
|
||||
btntext->SetTextSize(8);
|
||||
btntext->SetTextColor({255, 0, 0});
|
||||
// End Button //
|
||||
|
||||
|
||||
|
@@ -12,7 +12,7 @@ namespace JUI {
|
||||
|
||||
void RectBase::BGColor(const Color4 &col) { bg_color = col;}
|
||||
|
||||
void RectBase::SetBorderColor(const Color4 &col) { border_color = col;}
|
||||
void RectBase::BorderColor(const Color4 &col) { border_color = col;}
|
||||
|
||||
void RectBase::SetBorderWidth(float w) {border_width = w;}
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace JUI {
|
||||
Color4 RectBase::BGColor() const { return bg_color; }
|
||||
|
||||
void RectBase::SetBorderStyling(const Color4 &color, float width) {
|
||||
SetBorderColor(color);
|
||||
BorderColor(color);
|
||||
SetBorderWidth(width);
|
||||
}
|
||||
|
||||
|
@@ -30,6 +30,10 @@ namespace JUI
|
||||
return is_pressed;
|
||||
}
|
||||
|
||||
bool Button::IsHovered() const {
|
||||
return IsMouseInside();
|
||||
}
|
||||
|
||||
void Button::Draw() {
|
||||
if (!visible)
|
||||
return;
|
||||
@@ -72,6 +76,31 @@ namespace JUI
|
||||
J2D::End();
|
||||
}
|
||||
|
||||
void Button::Update(float delta) {
|
||||
if (IsHovered() && !hover_debounce) {
|
||||
OnHover(last_known_mouse_pos);
|
||||
hover_debounce = true;
|
||||
}
|
||||
|
||||
if (!IsHovered() && hover_debounce) {
|
||||
OnExit(last_known_mouse_pos);
|
||||
hover_debounce = false;
|
||||
}
|
||||
|
||||
if (hover_debounce && (lmb_state == true && prev_lmb_state != true)) {
|
||||
OnPress(last_known_mouse_pos);
|
||||
is_pressed = true;
|
||||
}
|
||||
|
||||
if (IsPressed() && (lmb_state != true && prev_lmb_state == true)) {
|
||||
OnRelease(last_known_mouse_pos, IsHovered());
|
||||
is_pressed = false;
|
||||
}
|
||||
|
||||
prev_lmb_state = lmb_state;
|
||||
}
|
||||
|
||||
/*
|
||||
void Button::Update(float delta) {
|
||||
if (IsMouseInside() && !mouse_inside_debounce)
|
||||
{
|
||||
@@ -102,4 +131,5 @@ namespace JUI
|
||||
|
||||
prev_lmb_state = lmb_state;
|
||||
}
|
||||
*/
|
||||
}
|
Reference in New Issue
Block a user