Button redone. Implemented a radio button demo.

This commit is contained in:
2024-07-30 20:43:58 -04:00
parent 0fc4238115
commit a28048b19b
5 changed files with 143 additions and 20 deletions

View File

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

View File

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

View File

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

View File

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

View File

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