From 4c23a9fa6e373c2f6508131a6c18d2f9ac5b60f4 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 20 Nov 2020 11:11:23 -0500 Subject: 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)); } -- cgit v1.2.1