summaryrefslogtreecommitdiff
path: root/tests/curve.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/curve.c')
-rw-r--r--tests/curve.c184
1 files changed, 184 insertions, 0 deletions
diff --git a/tests/curve.c b/tests/curve.c
new file mode 100644
index 0000000000..45b08c89ab
--- /dev/null
+++ b/tests/curve.c
@@ -0,0 +1,184 @@
+#include <gtk/gtk.h>
+#include "curve-editor.h"
+
+
+static GskPath *
+make_circle_path (void)
+{
+ float w = 200;
+ float h = 200;
+ float cx = w / 2;
+ float cy = h / 2;
+ float pad = 20;
+ float r = (w - 2 * pad) / 2;
+ float k = 0.55228;
+ float kr = k * r;
+ GskPathBuilder *builder;
+
+ builder = gsk_path_builder_new ();
+
+ gsk_path_builder_move_to (builder, cx, pad);
+ gsk_path_builder_curve_to (builder, cx + kr, pad,
+ w - pad, cy - kr,
+ w - pad, cy);
+ gsk_path_builder_curve_to (builder, w - pad, cy + kr,
+ cx + kr, h - pad,
+ cx, h - pad);
+ gsk_path_builder_curve_to (builder, cx - kr, h - pad,
+ pad, cy + kr,
+ pad, cy);
+ gsk_path_builder_curve_to (builder, pad, cy - kr,
+ cx - kr, pad,
+ cx, pad);
+ gsk_path_builder_close (builder);
+
+ return gsk_path_builder_free_to_path (builder);
+}
+
+static void
+edit_changed (GtkToggleButton *button,
+ GParamSpec *pspec,
+ CurveEditor *editor)
+{
+ curve_editor_set_edit (editor, gtk_toggle_button_get_active (button));
+}
+
+static void
+reset (GtkButton *button,
+ CurveEditor *editor)
+{
+ GskPath *path;
+
+ path = make_circle_path ();
+ curve_editor_set_path (editor, path);
+ gsk_path_unref (path);
+}
+
+static void
+width_changed (GtkRange *range,
+ CurveEditor *editor)
+{
+ GskStroke *stroke;
+
+ stroke = gsk_stroke_copy (curve_editor_get_stroke (editor));
+ gsk_stroke_set_line_width (stroke, gtk_range_get_value (range));
+ curve_editor_set_stroke (editor, stroke);
+ gsk_stroke_free (stroke);
+}
+
+static void
+cap_changed (GtkDropDown *combo,
+ GParamSpec *pspec,
+ CurveEditor *editor)
+{
+ GskStroke *stroke;
+
+ stroke = gsk_stroke_copy (curve_editor_get_stroke (editor));
+ gsk_stroke_set_line_cap (stroke, (GskLineCap)gtk_drop_down_get_selected (combo));
+ curve_editor_set_stroke (editor, stroke);
+ gsk_stroke_free (stroke);
+}
+
+static void
+join_changed (GtkDropDown *combo,
+ GParamSpec *pspec,
+ CurveEditor *editor)
+{
+ GskStroke *stroke;
+
+ stroke = gsk_stroke_copy (curve_editor_get_stroke (editor));
+ gsk_stroke_set_line_join (stroke, (GskLineJoin)gtk_drop_down_get_selected (combo));
+ curve_editor_set_stroke (editor, stroke);
+ gsk_stroke_free (stroke);
+}
+
+static void
+color_changed (GtkColorChooser *chooser,
+ CurveEditor *editor)
+{
+ GdkRGBA color;
+
+ gtk_color_chooser_get_rgba (chooser, &color);
+ curve_editor_set_color (editor, &color);
+}
+
+int
+main (int argc, char *argv[])
+{
+ GtkWindow *window;
+ GtkWidget *demo;
+ GtkWidget *edit_toggle;
+ GtkWidget *reset_button;
+ GtkWidget *titlebar;
+ GtkWidget *scale;
+ GtkWidget *stroke_button;
+ GtkWidget *popover;
+ GtkWidget *grid;
+ GtkWidget *cap_combo;
+ GtkWidget *join_combo;
+ GtkWidget *color_button;
+
+ gtk_init ();
+
+ window = GTK_WINDOW (gtk_window_new ());
+ gtk_window_set_default_size (GTK_WINDOW (window), 250, 250);
+
+ edit_toggle = gtk_toggle_button_new ();
+ gtk_button_set_icon_name (GTK_BUTTON (edit_toggle), "document-edit-symbolic");
+
+ reset_button = gtk_button_new_from_icon_name ("edit-undo-symbolic");
+
+ stroke_button = gtk_menu_button_new ();
+ gtk_menu_button_set_icon_name (GTK_MENU_BUTTON (stroke_button), "open-menu-symbolic");
+ popover = gtk_popover_new ();
+ gtk_menu_button_set_popover (GTK_MENU_BUTTON (stroke_button), popover);
+
+ grid = gtk_grid_new ();
+ gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
+ gtk_grid_set_column_spacing (GTK_GRID (grid), 6);
+ gtk_popover_set_child (GTK_POPOVER (popover), grid);
+
+ gtk_grid_attach (GTK_GRID (grid), gtk_label_new ("Line Width:"), 0, 0, 1, 1);
+ scale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 1, 10, 1);
+ gtk_widget_set_size_request (scale, 60, -1);
+ gtk_grid_attach (GTK_GRID (grid), scale, 1, 0, 1, 1);
+
+ gtk_grid_attach (GTK_GRID (grid), gtk_label_new ("Line cap:"), 0, 1, 1, 1);
+ cap_combo = gtk_drop_down_new_from_strings ((const char *[]){"Butt", "Round", "Square", NULL});
+ gtk_grid_attach (GTK_GRID (grid), cap_combo, 1, 1, 1, 1);
+
+ gtk_grid_attach (GTK_GRID (grid), gtk_label_new ("Line join:"), 0, 2, 1, 1);
+ join_combo = gtk_drop_down_new_from_strings ((const char *[]){"Miter", "Round", "Bevel", NULL});
+ gtk_grid_attach (GTK_GRID (grid), join_combo, 1, 2, 1, 1);
+
+ gtk_grid_attach (GTK_GRID (grid), gtk_label_new ("Stroke color:"), 0, 3, 1, 1);
+ color_button = gtk_color_button_new_with_rgba (&(GdkRGBA){ 0., 0., 0., 1.});
+ gtk_grid_attach (GTK_GRID (grid), color_button, 1, 3, 1, 1);
+
+ titlebar = gtk_header_bar_new ();
+ gtk_header_bar_pack_start (GTK_HEADER_BAR (titlebar), edit_toggle);
+ gtk_header_bar_pack_start (GTK_HEADER_BAR (titlebar), reset_button);
+ gtk_header_bar_pack_start (GTK_HEADER_BAR (titlebar), stroke_button);
+
+ gtk_window_set_titlebar (GTK_WINDOW (window), titlebar);
+
+ demo = curve_editor_new ();
+
+ g_signal_connect (edit_toggle, "notify::active", G_CALLBACK (edit_changed), demo);
+ g_signal_connect (reset_button, "clicked", G_CALLBACK (reset), demo);
+ g_signal_connect (scale, "value-changed", G_CALLBACK (width_changed), demo);
+ g_signal_connect (cap_combo, "notify::selected", G_CALLBACK (cap_changed), demo);
+ g_signal_connect (join_combo, "notify::selected", G_CALLBACK (join_changed), demo);
+ g_signal_connect (color_button, "color-set", G_CALLBACK (color_changed), demo);
+
+ reset (NULL, CURVE_EDITOR (demo));
+
+ gtk_window_set_child (window, demo);
+
+ gtk_window_present (window);
+
+ while (g_list_model_get_n_items (gtk_window_get_toplevels ()) > 0)
+ g_main_context_iteration (NULL, TRUE);
+
+ return 0;
+}