Button implemented very cool
This commit is contained in:
@@ -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(
|
||||
|
@@ -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};
|
||||
|
@@ -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;
|
||||
|
@@ -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:
|
||||
};
|
||||
}
|
65
main.cpp
65
main.cpp
@@ -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)
|
||||
|
@@ -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);
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user