mirror of
https://github.com/IllusionMan1212/C2048.git
synced 2026-10-24 02:12:31 +00:00
zephr/ui: make color picker slider and canvas draggability work outside their rects
This commit is contained in:
@@ -493,7 +493,10 @@ bool draw_icon_button(UIConstraints *constraints, Color btn_color, const Texture
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_color_picker_slider(UIConstraints *constraints, Alignment align) {
|
f32 draw_color_picker_slider(UIConstraints *constraints, Alignment align) {
|
||||||
|
static f32 slider_selection = 0;
|
||||||
|
static bool slider_dragging = false;
|
||||||
|
|
||||||
use_shader(color_chooser_shader);
|
use_shader(color_chooser_shader);
|
||||||
|
|
||||||
set_bool(color_chooser_shader, "isSlider", true);
|
set_bool(color_chooser_shader, "isSlider", true);
|
||||||
@@ -509,6 +512,19 @@ void draw_color_picker_slider(UIConstraints *constraints, Alignment align) {
|
|||||||
constraints->x = pos.x;
|
constraints->x = pos.x;
|
||||||
constraints->y = pos.y;
|
constraints->y = pos.y;
|
||||||
|
|
||||||
|
if (inside_rect(&(Rect){{constraints->x, constraints->y}, {constraints->width, constraints->height}}, &zephr_ctx->mouse.pos) &&
|
||||||
|
zephr_ctx->mouse.pressed && zephr_ctx->mouse.button == ZEPHR_MOUSE_BUTTON_LEFT) {
|
||||||
|
slider_dragging = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (zephr_ctx->mouse.released && zephr_ctx->mouse.button == ZEPHR_MOUSE_BUTTON_LEFT) {
|
||||||
|
slider_dragging = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (slider_dragging) {
|
||||||
|
slider_selection = CORE_CLAMP((zephr_ctx->mouse.pos.y - constraints->y) / constraints->height, 0, 1);
|
||||||
|
}
|
||||||
|
|
||||||
Matrix4x4 model = identity();
|
Matrix4x4 model = identity();
|
||||||
apply_translation(&model, pos);
|
apply_translation(&model, pos);
|
||||||
|
|
||||||
@@ -536,9 +552,14 @@ void draw_color_picker_slider(UIConstraints *constraints, Alignment align) {
|
|||||||
|
|
||||||
glBindVertexArray(0);
|
glBindVertexArray(0);
|
||||||
set_bool(color_chooser_shader, "isSlider", false);
|
set_bool(color_chooser_shader, "isSlider", false);
|
||||||
|
|
||||||
|
return slider_selection;
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_color_picker_canvas(UIConstraints *constraints, f32 slider_percentage, Alignment align) {
|
Vec2f draw_color_picker_canvas(UIConstraints *constraints, f32 slider_percentage, Alignment align) {
|
||||||
|
static bool canvas_dragging = false;
|
||||||
|
static Vec2f canvas_pos = {0};
|
||||||
|
|
||||||
use_shader(color_chooser_shader);
|
use_shader(color_chooser_shader);
|
||||||
|
|
||||||
set_bool(color_chooser_shader, "isSlider", false);
|
set_bool(color_chooser_shader, "isSlider", false);
|
||||||
@@ -555,6 +576,23 @@ void draw_color_picker_canvas(UIConstraints *constraints, f32 slider_percentage,
|
|||||||
constraints->x = pos.x;
|
constraints->x = pos.x;
|
||||||
constraints->y = pos.y;
|
constraints->y = pos.y;
|
||||||
|
|
||||||
|
if (inside_rect(&(Rect){{constraints->x, constraints->y}, {constraints->width, constraints->height}}, &zephr_ctx->mouse.pos) &&
|
||||||
|
zephr_ctx->mouse.pressed && zephr_ctx->mouse.button == ZEPHR_MOUSE_BUTTON_LEFT) {
|
||||||
|
canvas_dragging = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (zephr_ctx->mouse.released && zephr_ctx->mouse.button == ZEPHR_MOUSE_BUTTON_LEFT) {
|
||||||
|
canvas_dragging = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (canvas_dragging) {
|
||||||
|
f32 x = (zephr_ctx->mouse.pos.x - constraints->x) / constraints->width;
|
||||||
|
f32 y = (zephr_ctx->mouse.pos.y - constraints->y) / constraints->height;
|
||||||
|
|
||||||
|
canvas_pos.x = CORE_CLAMP(x, 0, 1);
|
||||||
|
canvas_pos.y = CORE_CLAMP(y, 0, 1);
|
||||||
|
}
|
||||||
|
|
||||||
Matrix4x4 model = identity();
|
Matrix4x4 model = identity();
|
||||||
apply_translation(&model, pos);
|
apply_translation(&model, pos);
|
||||||
|
|
||||||
@@ -581,6 +619,8 @@ void draw_color_picker_canvas(UIConstraints *constraints, f32 slider_percentage,
|
|||||||
glDrawArrays(GL_TRIANGLES, 0, 6);
|
glDrawArrays(GL_TRIANGLES, 0, 6);
|
||||||
|
|
||||||
glBindVertexArray(0);
|
glBindVertexArray(0);
|
||||||
|
|
||||||
|
return canvas_pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: consume mouse events on the popup
|
// TODO: consume mouse events on the popup
|
||||||
@@ -599,15 +639,8 @@ void draw_color_picker_popup(UIConstraints *picker_button_con) {
|
|||||||
set_y_constraint(&color_slider_con, 0.05f, UI_CONSTRAINT_RELATIVE);
|
set_y_constraint(&color_slider_con, 0.05f, UI_CONSTRAINT_RELATIVE);
|
||||||
set_height_constraint(&color_slider_con, 400 * 0.9f, UI_CONSTRAINT_RELATIVE_PIXELS);
|
set_height_constraint(&color_slider_con, 400 * 0.9f, UI_CONSTRAINT_RELATIVE_PIXELS);
|
||||||
set_width_constraint(&color_slider_con, 0.1f, UI_CONSTRAINT_ASPECT_RATIO);
|
set_width_constraint(&color_slider_con, 0.1f, UI_CONSTRAINT_ASPECT_RATIO);
|
||||||
draw_color_picker_slider(&color_slider_con, ALIGN_TOP_RIGHT);
|
f32 slider_selection = draw_color_picker_slider(&color_slider_con, ALIGN_TOP_RIGHT);
|
||||||
|
|
||||||
static f32 slider_selection = 0;
|
|
||||||
static Vec2f canvas_pos = {0};
|
|
||||||
|
|
||||||
if (inside_rect(&(Rect){{color_slider_con.x, color_slider_con.y}, {color_slider_con.width, color_slider_con.height}}, &zephr_ctx->mouse.pos) &&
|
|
||||||
zephr_ctx->mouse.pressed && zephr_ctx->mouse.button == ZEPHR_MOUSE_BUTTON_LEFT) {
|
|
||||||
slider_selection = (zephr_ctx->mouse.pos.y - color_slider_con.y) / color_slider_con.height;
|
|
||||||
}
|
|
||||||
|
|
||||||
UIConstraints triangle_con = default_constraints;
|
UIConstraints triangle_con = default_constraints;
|
||||||
set_parent_constraint(&triangle_con, &color_slider_con);
|
set_parent_constraint(&triangle_con, &color_slider_con);
|
||||||
@@ -627,16 +660,7 @@ void draw_color_picker_popup(UIConstraints *picker_button_con) {
|
|||||||
set_x_constraint(&color_slider_con, 0.04f, UI_CONSTRAINT_RELATIVE);
|
set_x_constraint(&color_slider_con, 0.04f, UI_CONSTRAINT_RELATIVE);
|
||||||
set_y_constraint(&color_slider_con, 0.05f, UI_CONSTRAINT_RELATIVE);
|
set_y_constraint(&color_slider_con, 0.05f, UI_CONSTRAINT_RELATIVE);
|
||||||
set_width_constraint(&color_slider_con, popup_con.width * 0.8f, UI_CONSTRAINT_FIXED);
|
set_width_constraint(&color_slider_con, popup_con.width * 0.8f, UI_CONSTRAINT_FIXED);
|
||||||
draw_color_picker_canvas(&color_slider_con, slider_selection, ALIGN_TOP_LEFT);
|
Vec2f canvas_pos = draw_color_picker_canvas(&color_slider_con, slider_selection, ALIGN_TOP_LEFT);
|
||||||
|
|
||||||
if (inside_rect(&(Rect){{color_slider_con.x, color_slider_con.y}, {color_slider_con.width, color_slider_con.height}}, &zephr_ctx->mouse.pos) &&
|
|
||||||
zephr_ctx->mouse.pressed && zephr_ctx->mouse.button == ZEPHR_MOUSE_BUTTON_LEFT) {
|
|
||||||
f32 x = (zephr_ctx->mouse.pos.x - color_slider_con.x) / color_slider_con.width;
|
|
||||||
f32 y = (zephr_ctx->mouse.pos.y - color_slider_con.y) / color_slider_con.height;
|
|
||||||
|
|
||||||
canvas_pos.x = x;
|
|
||||||
canvas_pos.y = y;
|
|
||||||
}
|
|
||||||
|
|
||||||
set_parent_constraint(&triangle_con, &color_slider_con);
|
set_parent_constraint(&triangle_con, &color_slider_con);
|
||||||
set_x_constraint(&triangle_con, canvas_pos.x, UI_CONSTRAINT_RELATIVE);
|
set_x_constraint(&triangle_con, canvas_pos.x, UI_CONSTRAINT_RELATIVE);
|
||||||
|
|||||||
Reference in New Issue
Block a user