]> git.lizzy.rs Git - nothing.git/blobdiff - src/game/level/level_editor/background_layer.c
Merge pull request #1093 from tsoding/1092
[nothing.git] / src / game / level / level_editor / background_layer.c
index 88c5d81e0be1d4805beac55f7b7d96bfc84f0b36..bdb77fa42529422267c9becf96079e73df142bf4 100644 (file)
@@ -1,26 +1,70 @@
+#include <string.h>
 #include <SDL.h>
 
 #include "system/stacktrace.h"
+#include "game/camera.h"
 #include "math/rect.h"
 #include "color.h"
 #include "background_layer.h"
+#include "undo_history.h"
 
-// TODO: UndoHistory is not support in BackgroundLayer
+
+BackgroundLayer create_background_layer(Color color)
+{
+    BackgroundLayer layer = {
+        .color_picker = create_color_picker_from_rgba(color),
+        .prev_color = color
+    };
+    return layer;
+}
+
+int background_layer_read_from_line_stream(BackgroundLayer *layer,
+                                           LineStream *line_stream)
+{
+    if (color_picker_read_from_line_stream(
+            &layer->color_picker,
+            line_stream) < 0) {
+        return -1;
+    }
+
+    layer->prev_color = color_picker_rgba(&layer->color_picker);
+
+    return 0;
+}
 
 int background_layer_render(BackgroundLayer *layer,
-                            Camera *camera,
+                            const Camera *camera,
                             int active)
 {
     trace_assert(layer);
     trace_assert(camera);
 
     if (active) {
-        return color_picker_render(&layer->color_picker, camera);
+        return color_picker_render(
+            &layer->color_picker,
+            camera);
     }
 
     return 0;
 }
 
+typedef struct {
+    BackgroundLayer *layer;
+    Color color;
+} UndoContext;
+
+static
+void background_undo_color(void *context, size_t context_size)
+{
+    trace_assert(context);
+    trace_assert(sizeof(UndoContext) == context_size);
+
+    UndoContext *undo_context = context;
+    BackgroundLayer *background_layer = undo_context->layer;
+
+    background_layer->color_picker = create_color_picker_from_rgba(undo_context->color);
+}
+
 int background_layer_event(BackgroundLayer *layer,
                            const SDL_Event *event,
                            const Camera *camera,
@@ -31,9 +75,30 @@ int background_layer_event(BackgroundLayer *layer,
     trace_assert(camera);
     trace_assert(undo_history);
 
-    return color_picker_event(
-        &layer->color_picker, event,
-        NULL);
+    int selected = 0;
+
+    if (color_picker_event(
+            &layer->color_picker,
+            event,
+            camera,
+            &selected) < 0) {
+        return -1;
+    }
+
+    if (selected && !color_picker_drag(&layer->color_picker)) {
+        UndoContext context = {
+            .layer = layer,
+            .color = layer->prev_color
+        };
+
+        undo_history_push(
+            undo_history,
+            background_undo_color,
+            &context, sizeof(context));
+        layer->prev_color = color_picker_rgba(&layer->color_picker);
+    }
+
+    return 0;
 }
 
 int background_layer_dump_stream(BackgroundLayer *layer,
@@ -46,5 +111,5 @@ int background_layer_dump_stream(BackgroundLayer *layer,
         color_picker_rgba(&layer->color_picker),
         stream);
 
-    return fprintf(stream, "\n");;
+    return fprintf(stream, "\n");
 }