Button implemented very cool

This commit is contained in:
2024-07-30 17:22:24 -04:00
parent ea182adf30
commit 0fc4238115
8 changed files with 133 additions and 23 deletions

View File

@@ -48,7 +48,7 @@ CPMAddPackage(
CPMAddPackage(
NAME ReWindow
URL https://git.redacted.cc/Redacted/ReWindow/archive/Prerelease-7.zip
URL https://git.redacted.cc/Redacted/ReWindow/archive/Prerelease-8.zip
)
CPMAddPackage(

View File

@@ -25,7 +25,7 @@ namespace JUI
Event<Vector2> MouseEnter;
Event<Vector2> MouseExit;
Event<Vector2> MousePress;
Event<Vector2> MouseRelease;
Event<Vector2, bool> MouseRelease;
public:
void SetCornerRounding(float radius);
void SetCornerRounding(float tlRadius, float trRadius, float blRadius, float brRadius);
@@ -56,6 +56,7 @@ namespace JUI
protected:
BorderMode border_mode = BorderMode::Middle;
protected:
bool mouse_press_debounce;
bool mouse_inside_debounce;
float border_width = 1.f;
Color4 bg_color = {128,128,128, 255};

View File

@@ -216,6 +216,10 @@ namespace JUI
void DrawChildWidgets();
void UpdateChildWidgets(float delta);
protected:
bool lmb_state;
bool prev_lmb_state;
//int last_known_mouse_button;
//bool last_known_mouse_button_state;
Vector2 last_known_mouse_pos;
UDim2 position;
UDim2 size;

View File

@@ -45,9 +45,11 @@ namespace JUI
void SetEnabled(bool enabled);
void Draw() override;
void Update(float delta) override;
protected:
bool mouse_inside_debounce;
bool is_pressed;
private:
};
}

View File

@@ -26,31 +26,66 @@ JUI::Scene* CreateScene() {
Scene* root = new Scene();
Rect* element = new Rect(root);
//Button* element = new Button(elementr);
element->SetName("JimBob");
// Rect //
Rect* rect_element = new Rect(root);
rect_element->SetName("JimBob");
//Rect* element = new Rect(root);
//rect_element->SetName("JimBob");
//element->BGColor({0,255,0});
element->BGColor({0, 64, 0});
rect_element->BGColor({0, 64, 0});
auto size = UDim2(64, 64, 0, 0);
element->SetSize({0, 0, 0.5f, 0.5f});
element->SetClipsDescendants(true);
element->SetBorderColor({255,255,255});
element->SetBorderWidth(2.f);
rect_element->SetSize({0, 0, 0.5f, 0.5f});
rect_element->SetClipsDescendants(true);
rect_element->SetBorderColor({255,255,255});
rect_element->SetBorderWidth(2.f);
element->MouseEnter += [element] (auto coords) {
DEBUG("COCKSUCKER")
element->BGColor({0, 128, 0});
rect_element->MouseEnter += [rect_element] (auto coords) {
DEBUG("Hello I am the rect please give me money")
rect_element->BGColor({0, 128, 0});
};
element->MouseExit += [element] (auto coords) {
element->BGColor({0, 64, 0});
rect_element->MouseExit += [rect_element] (auto coords) {
rect_element->BGColor({0, 64, 0});
};
Text* text = new Text(element);
Text* text = new Text(rect_element);
text->SetContent("YO MAMA");
text->SetFont(FreeSans);
text->SetTextSize(48);
text->SetTextColor({255, 0, 0});
// End Rect //
// Button //
Button* button_element = new Button(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->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->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});
}
};
// End Button //
root->SetViewportSize(800, 600);
@@ -146,6 +181,8 @@ int main()
};
window->OnMouseButtonDownEvent += [&] (MouseButtonDownEvent e) {
DEBUG(std::format("FUCK {} {}", e.Button.ButtonIndex, MouseButtons::Left.ButtonIndex))
if (e.Button == MouseButtons::Left)
scene->ObserveMouseInput(1, true);
if (e.Button == MouseButtons::Middle)

View File

@@ -1,4 +1,5 @@
#include "JUI/Base/Widget.hpp"
#include "jlog/jlog.hpp"
namespace JUI {
@@ -265,6 +266,12 @@ namespace JUI {
}
void Widget::ObserveMouseInput(int btn, bool pressed) {
if (btn == 1)
lmb_state = pressed;
DEBUG(std::format("BTN {}", btn))
DEBUG(std::format("PRESSED {}", pressed))
for (Widget* child : children)
{
child->ObserveMouseInput(btn, pressed);

View File

@@ -1,3 +1,4 @@
#include "JGL/JGL.h"
#include <JUI/Widgets/Button.hpp>
#include <jlog/jlog.hpp>
@@ -9,6 +10,8 @@ namespace JUI
this->SetParent(parent);
};
// We need to like make this generic as part of RectBase
bool Button::IsMouseInside() const {
float x = last_known_mouse_pos.x;
@@ -23,11 +26,57 @@ namespace JUI
return false;
}
bool Button::IsPressed() const {
return is_pressed;
}
void Button::Draw() {
if (!visible)
return;
J2D::Begin();
Vector2 abs_pos = GetAbsolutePosition();
Vector2 abs_size = GetAbsoluteSize();
auto root_size = GetFamilyTreeRoot()->GetAbsoluteSize();
GLint *old_scissor_bounds;
bool clip_was_enabled;
// TODO: Re-enable clipping
if (clips_descendants) {
clip_was_enabled = glIsEnabled(GL_SCISSOR_TEST);
if (clip_was_enabled)
glGetIntegerv(GL_SCISSOR_BOX, old_scissor_bounds);
float presumed_screen_height = 600;
glScissor(abs_pos.x, presumed_screen_height-abs_size.y-abs_pos.y, abs_size.x, abs_size.y);
glEnable(GL_SCISSOR_TEST);
}
RectBase::Draw(abs_pos, abs_size);
// Draw Child Elements with scissor clipping still active
Widget::Draw();
// Returns clip to previous state
if (clips_descendants)
{
//glScissor(old_scissor_bounds[0], old_scissor_bounds[1], old_scissor_bounds[2], old_scissor_bounds[3]);
if (!clip_was_enabled) {}
glDisable(GL_SCISSOR_TEST);
}
J2D::End();
}
void Button::Update(float delta) {
DEBUG("FUCK")
if (IsMouseInside() && !mouse_inside_debounce)
{
MouseEnter.Invoke(last_known_mouse_pos);
//DEBUG(std::format("mb state {}", last_known_mouse_button_state))
mouse_inside_debounce = true;
}
@@ -36,5 +85,21 @@ namespace JUI
MouseExit.Invoke(last_known_mouse_pos);
mouse_inside_debounce = false;
}
if (IsMouseInside() && (lmb_state == true && prev_lmb_state != true)) {
DEBUG("PRESSED LOL");
Vector2 dummy = {0, 0};
MousePress.Invoke(dummy);
is_pressed = true;
}
if (IsPressed() && (lmb_state != true && prev_lmb_state == true)) {
DEBUG("PRESSED KEK");
//Vector2 dummy = {0, 0};
MouseRelease.Invoke(last_known_mouse_pos, IsMouseInside());
is_pressed = false;
}
prev_lmb_state = lmb_state;
}
}

View File

@@ -55,21 +55,16 @@ namespace JUI {
void Rect::Update(float delta) {
if (IsMouseInside() && !mouse_inside_debounce)
{
DEBUG("DICK")
MouseEnter.Invoke(last_known_mouse_pos);
mouse_inside_debounce = true;
}
if (!IsMouseInside() && mouse_inside_debounce)
{
DEBUG("BALLS")
MouseExit.Invoke(last_known_mouse_pos);
mouse_inside_debounce = false;
}
Widget::Update(delta);
}
@@ -82,7 +77,6 @@ namespace JUI {
//DEBUG(std::format("X {} {} Y {} {}", x,pos.x, y,pos.y));
if (x > pos.x && y > pos.y && x < pos.x + size.x && y < pos.y + size.y){
DEBUG("HOLY FUCKIGN SHIT")
return true;
}
return false;