]> git.lizzy.rs Git - nothing.git/blobdiff - src/game/level/level_editor/color_picker.c
(#1108) add development ding
[nothing.git] / src / game / level / level_editor / color_picker.c
index b8727ae11c4056d7aa6dfccb98e9f308039b26bf..d126dc5e56d23d5725e0c8aa4829b49d6ea2f02d 100644 (file)
@@ -1,16 +1,21 @@
 #include <stdbool.h>
+#include <string.h>
 
 #include "game/level/boxes.h"
 #include "system/stacktrace.h"
 #include "system/line_stream.h"
 #include "system/log.h"
 #include "game/camera.h"
-#include "proto_rect.h"
 #include "color_picker.h"
 #include "color.h"
+#include "undo_history.h"
 
-#define COLOR_SLIDER_HEIGHT 50.0f
-#define COLOR_SLIDER_WIDTH 300.0f
+#define COLOR_SLIDER_HEIGHT 60.0f
+#define COLOR_PICKER_WIDTH 300.0f
+#define COLOR_PICKER_HEIGHT (COLOR_SLIDER_HEIGHT * COLOR_SLIDER_N)
+#define COLOR_PICKER_REFERENCE 1920.0f
+#define COLOR_PICKER_HW_RATIO (COLOR_PICKER_HEIGHT/ COLOR_PICKER_WIDTH)
+#define COLOR_PICKER_WR_RATIO (COLOR_PICKER_WIDTH / COLOR_PICKER_REFERENCE)
 
 const char *slider_labels[COLOR_SLIDER_N] = {
     "Hue",
@@ -18,15 +23,6 @@ const char *slider_labels[COLOR_SLIDER_N] = {
     "Lightness"
 };
 
-LayerPtr color_picker_as_layer(ColorPicker *color_picker)
-{
-    LayerPtr layer = {
-        .ptr = color_picker,
-        .type = LAYER_COLOR_PICKER
-    };
-    return layer;
-}
-
 ColorPicker create_color_picker_from_rgba(Color color)
 {
     Color color_hsla = rgba_to_hsla(color);
@@ -58,26 +54,36 @@ int color_picker_read_from_line_stream(ColorPicker *color_picker,
     return 0;
 }
 
-// TODO(#930): Color Picker doesn't have any visual indication about the current color
 int color_picker_render(const ColorPicker *color_picker,
-                        Camera *camera)
+                        const Camera *camera)
 {
     trace_assert(color_picker);
     trace_assert(camera);
 
-    /* TODO(#931): Color Picker sliders don't have any labels */
+    const Rect viewport = camera_view_port_screen(camera);
+    const Rect boundary = rect(
+        0.0f, 0.0f,
+        viewport.w * COLOR_PICKER_WR_RATIO,
+        viewport.w * COLOR_PICKER_WR_RATIO * COLOR_PICKER_HW_RATIO);
+
+    const float color_slider_height =
+        boundary.h / (COLOR_SLIDER_N + 1.0f);
+
     if (camera_fill_rect_screen(
             camera,
-            rect(0.0f, 0.0f, COLOR_SLIDER_WIDTH, COLOR_SLIDER_HEIGHT),
+            rect(boundary.x, boundary.y,
+                 boundary.w, color_slider_height),
             color_picker_rgba(color_picker)) < 0) {
         return -1;
     }
 
     for (ColorPickerSlider index = 0; index < COLOR_SLIDER_N; ++index) {
         const Rect slider_rect =
-            rect(0.0f, COLOR_SLIDER_HEIGHT * (float) (index + 1),
-                 COLOR_SLIDER_WIDTH, COLOR_SLIDER_HEIGHT);
-        const Point label_size = vec(2.5f, 2.5f);
+            rect(boundary.x,
+                 boundary.y + color_slider_height * (float) (index + 1),
+                 boundary.w, color_slider_height);
+        const float font_scale = boundary.w / COLOR_PICKER_WIDTH;
+        const Vec2f label_size = vec(2.5f * font_scale, 2.5f * font_scale);
 
         if (slider_render(
                 &color_picker->sliders[index],
@@ -91,8 +97,8 @@ int color_picker_render(const ColorPicker *color_picker,
                 slider_labels[index],
                 label_size,
                 COLOR_BLACK,
-                vec(slider_rect.x + COLOR_SLIDER_WIDTH,
-                    slider_rect.y + COLOR_SLIDER_HEIGHT * 0.5f - label_size.y * (float) FONT_CHAR_HEIGHT * 0.5f)) < 0) {
+                vec(slider_rect.x + boundary.w,
+                    slider_rect.y + color_slider_height * 0.5f - label_size.y * (float) FONT_CHAR_HEIGHT * 0.5f)) < 0) {
             return -1;
         }
     }
@@ -101,21 +107,35 @@ int color_picker_render(const ColorPicker *color_picker,
 }
 
 // TODO(#932): the `selected` event propagation control is cumbersome
-int color_picker_event(ColorPicker *color_picker, const SDL_Event *event, int *selected_out)
+int color_picker_event(ColorPicker *color_picker,
+                       const SDL_Event *event,
+                       const Camera *camera,
+                       int *selected_out)
 {
     trace_assert(color_picker);
     trace_assert(event);
+    trace_assert(camera);
 
     int selected = 0;
 
+    const Rect viewport = camera_view_port_screen(camera);
+    const Rect boundary = rect(
+        0.0f, 0.0f,
+        viewport.w * COLOR_PICKER_WR_RATIO,
+        viewport.w * COLOR_PICKER_WR_RATIO * COLOR_PICKER_HW_RATIO);
+
+    const float color_slider_height =
+        boundary.h / (COLOR_SLIDER_N + 1.0f);
+
     for (ColorPickerSlider index = 0;
          !selected && index < COLOR_SLIDER_N;
          ++index) {
         if (slider_event(
                 &color_picker->sliders[index],
                 event,
-                rect(0.0f, COLOR_SLIDER_HEIGHT * (float) (index + 1),
-                     COLOR_SLIDER_WIDTH, COLOR_SLIDER_HEIGHT),
+                rect(boundary.x,
+                     boundary.y + color_slider_height * (float) (index + 1),
+                     boundary.w, color_slider_height),
                 &selected) < 0) {
             return -1;
         }