[gtk/matthiasc/lottie] Tweak editing some more



commit 4c23a9fa6e373c2f6508131a6c18d2f9ac5b60f4
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Nov 20 11:11:23 2020 -0500

    Tweak editing some more

 tests/curve.c | 116 +++++++++++++++++++++++++++++++++-------------------------
 1 file changed, 67 insertions(+), 49 deletions(-)
---
diff --git a/tests/curve.c b/tests/curve.c
index 65f8a67541..055b49f02f 100644
--- a/tests/curve.c
+++ b/tests/curve.c
@@ -5,6 +5,7 @@
 
 typedef struct
 {
+  gboolean edit;
   gboolean smooth;
 } PointData;
 
@@ -51,8 +52,6 @@ drag_begin (GtkGestureDrag *gesture,
       {
         if (dist (&self->points[i], &p) < RADIUS)
           {
-            gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_CLAIMED);
-
             self->dragged = i;
             self->symmetric = (gtk_event_controller_get_current_event_state (GTK_EVENT_CONTROLLER (gesture)) 
& GDK_CONTROL_MASK) == 0;
 
@@ -77,6 +76,8 @@ drag_update (GtkGestureDrag *gesture,
   if (self->dragged == -1)
     return;
 
+  gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_CLAIMED);
+
   gtk_gesture_drag_get_start_point (gesture, &x, &y);
 
   x += offset_x;
@@ -124,21 +125,14 @@ drag_update (GtkGestureDrag *gesture,
           double a, l;
 
           a = atan2 (self->points[self->dragged].y - p->y, self->points[self->dragged].x - p->x) + M_PI;
-          l = dist (c, p);
+
+          if (self->symmetric)
+            l = dist (d, p);
+          else
+            l = dist (c, p);
           c->x = p->x + l * cos (a);
           c->y = p->y + l * sin (a);
         }
-
-      if (self->symmetric)
-        {
-          double l, l2;
-
-          l = dist (d, p);
-          l2 = dist (c, p);
-
-          c->x = p->x + (l / l2) * (c->x - p->x);
-          c->y = p->y + (l / l2) * (c->y - p->y);
-        }
     }
 
   gtk_widget_queue_draw (GTK_WIDGET (self));
@@ -174,25 +168,32 @@ released (GtkGestureClick *gesture,
         {
           if (i % 3 == 0)
             {
-              self->point_data[i / 3].smooth = !self->point_data[i / 3].smooth;
-              if (self->point_data[i / 3].smooth)
+              int button = gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture));
+              if (button == GDK_BUTTON_PRIMARY)
                 {
-                  graphene_point_t *p, *c, *c2;
-                  float a, d;
-
-                  p = &self->points[i];
-                  c = &self->points[(i - 1 + self->n_points) % self->n_points];
-                  c2 = &self->points[(i + 1 + self->n_points) % self->n_points];
-
-                  a = atan2 (c2->y - p->y, c2->x - p->x) + M_PI;
-                  d = dist (c, p);
-                  c->x = p->x + d * cos (a);
-                  c->y = p->y + d * sin (a);
+                  self->point_data[i / 3].edit = !self->point_data[i / 3].edit;
+                }
+              else if (button == GDK_BUTTON_SECONDARY)
+                {
+                  self->point_data[i / 3].smooth = !self->point_data[i / 3].smooth;
+                  if (self->point_data[i / 3].smooth)
+                    {
+                      graphene_point_t *p, *c, *c2;
+                      float a, d;
+
+                      p = &self->points[i];
+                      c = &self->points[(i - 1 + self->n_points) % self->n_points];
+                      c2 = &self->points[(i + 1 + self->n_points) % self->n_points];
+
+                      a = atan2 (c2->y - p->y, c2->x - p->x) + M_PI;
+                      d = dist (c, p);
+                      c->x = p->x + d * cos (a);
+                      c->y = p->y + d * sin (a);
+                    }
                 }
 
               gtk_widget_queue_draw (GTK_WIDGET (self));
             }
-          break;
         }
     }
 }
@@ -235,7 +236,10 @@ init_points (DemoWidget *self)
   self->points[11] = GRAPHENE_POINT_INIT (cx - kr, pad);
 
   for (i = 0; i < self->n_points / 3; i++)
-    self->point_data[i].smooth = TRUE;
+    {
+      self->point_data[i].edit = FALSE;
+      self->point_data[i].smooth = TRUE;
+    }
 }
 
 static void
@@ -254,7 +258,7 @@ demo_widget_init (DemoWidget *self)
   gtk_widget_add_controller (GTK_WIDGET (self), GTK_EVENT_CONTROLLER (gesture));
 
   gesture = gtk_gesture_click_new ();
-  gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), GDK_BUTTON_SECONDARY);
+  gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), 0);
   g_signal_connect (gesture, "released", G_CALLBACK (released), self);
   gtk_widget_add_controller (GTK_WIDGET (self), GTK_EVENT_CONTROLLER (gesture));
 
@@ -283,12 +287,23 @@ demo_widget_snapshot (GtkWidget   *widget,
       gsk_path_builder_move_to (builder, self->points[0].x, self->points[0].y);
       for (i = 1; i < self->n_points; i++)
         {
+          gboolean edit;
+
           if (i % 3 == 2)
-            gsk_path_builder_move_to (builder, self->points[i].x, self->points[i].y);
+            edit = self->point_data[((i + 3) % self->n_points) / 3].edit;
           else
-            gsk_path_builder_line_to (builder, self->points[i].x, self->points[i].y);
+            edit = self->point_data[i / 3].edit;
+
+          if (edit)
+            {
+              if (i % 3 == 2)
+                gsk_path_builder_move_to (builder, self->points[i].x, self->points[i].y);
+              else
+                gsk_path_builder_line_to (builder, self->points[i].x, self->points[i].y);
+            }
         }
-      gsk_path_builder_line_to (builder, self->points[0].x, self->points[0].y);
+      if (self->point_data[0].edit)
+        gsk_path_builder_line_to (builder, self->points[0].x, self->points[0].y);
     }
 
   gsk_path_builder_move_to (builder, self->points[0].x, self->points[0].y);
@@ -315,14 +330,13 @@ demo_widget_snapshot (GtkWidget   *widget,
   if (self->edit)
     {
       const char *colors[] = {
-        "white",
         "red",
         "green",
         "blue"
       };
       GdkRGBA color;
 
-      for (j = 0; j < 4; j++)
+      for (j = 0; j < 3; j++)
         {
           builder = gsk_path_builder_new ();
 
@@ -331,30 +345,27 @@ demo_widget_snapshot (GtkWidget   *widget,
               switch (j)
                 {
                 case 0:
-                  if (i == self->dragged)
-                    break;
-                  else
-                    continue;
-
-                case 1:
-                  if (i != self->dragged &&
-                      i % 3 == 0 &&
+                  if (i % 3 == 0 &&
+                      self->edit &&
                       self->point_data[i / 3].smooth)
                     break;
                   else
                     continue;
 
-                case 2:
-                  if (i != self->dragged &&
-                      i % 3 == 0 &&
+                case 1:
+                  if (i % 3 == 0 &&
+                      self->edit &&
                       !self->point_data[i / 3].smooth)
                     break;
                   else
                     continue;
 
-                case 3:
-                  if (i != self->dragged &&
-                      i % 3 != 0)
+                case 2:
+                  if (self->edit &&
+                      ((i % 3 == 1 &&
+                        self->point_data[i / 3].edit) ||
+                       (i % 3 == 2 &&
+                        self->point_data[((i + 3) % self->n_points) / 3].edit)))
                     break;
                   else
                     continue;
@@ -419,7 +430,14 @@ edit_changed (GtkToggleButton *button,
               GParamSpec      *pspec,
               DemoWidget      *self)
 {
+  int i;
+
   self->edit = gtk_toggle_button_get_active (button);
+  if (!self->edit)
+    {
+      for (i = 0; i < self->n_points / 3; i++)
+        self->point_data[i].edit = FALSE;
+    }
   gtk_widget_queue_draw (GTK_WIDGET (self));
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]