]> Pileus Git - grits/blob - src/plugins/test.c
Switch to GDK_KEY_*
[grits] / src / plugins / test.c
1 /*
2  * Copyright (C) 2009-2011 Andy Spencer <andy753421@gmail.com>
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17
18 /**
19  * SECTION:test
20  * @short_description: Testing plugin
21  *
22  * #GritsPluginTest is a testing plugin used during development and as an example
23  * for how to create a plugin.
24  */
25
26 #include <string.h>
27
28 #include <gdk/gdkkeysyms.h>
29 #include <grits.h>
30
31 #include "test.h"
32
33 static gboolean on_poly_enter(GritsPoly *poly)
34 {
35         g_debug("GritsPluginTest: on_poly_enter");
36         poly->color[3] = 0.50;
37         grits_object_queue_draw(GRITS_OBJECT(poly));
38         return FALSE;
39 }
40
41 static gboolean on_poly_leave(GritsPoly *poly)
42 {
43         g_debug("GritsPluginTest: on_poly_leave");
44         poly->color[3] = 0.2;
45         grits_object_queue_draw(GRITS_OBJECT(poly));
46         return FALSE;
47 }
48
49 static gboolean on_poly_button(GritsPoly *poly, GdkEventButton *event)
50 {
51         g_debug("GritsPluginTest: on_poly_button");
52         static int i = 0;
53         gdouble colors[][3] = {
54                 {1, 0, 0}, {1, 1, 0},
55                 {0, 1, 0}, {0, 1, 1},
56                 {0, 0, 1}, {1, 0, 1},
57         };
58         int idx = i++ % G_N_ELEMENTS(colors);
59         memcpy(poly->color, colors[idx], sizeof(gdouble)*3);
60         grits_object_queue_draw(GRITS_OBJECT(poly));
61         return TRUE;
62 }
63
64 static gboolean on_poly_key(GritsPoly *poly, GdkEventKey *event)
65 {
66         g_debug("GritsPluginTest: on_poly_key - %d", event->keyval);
67         gdouble colors[0xff][3] = {
68                 [GDK_KEY_r] {1, 0, 0},
69                 [GDK_KEY_g] {0, 1, 0},
70                 [GDK_KEY_b] {0, 0, 1},
71         };
72         if (event->keyval >= G_N_ELEMENTS(colors))
73                 return FALSE;
74         int key = event->keyval;
75         memcpy(poly->color, colors[key], sizeof(gdouble)*3);
76         grits_object_queue_draw(GRITS_OBJECT(poly));
77         return TRUE;
78 }
79
80 static gboolean on_marker_button(GritsMarker *marker, GdkEventButton *event)
81 {
82         g_debug("GritsPluginTest: on_marker_button");
83         GtkWidget *dialog = gtk_dialog_new_with_buttons(
84                         "St. Charles!", NULL, 0, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL);
85         gtk_dialog_run(GTK_DIALOG(dialog));
86         return TRUE;
87 }
88
89 /***********
90  * Methods *
91  ***********/
92 void _load_marker(GritsPluginTest *test)
93 {
94         test->marker = grits_marker_new("St. Charles");
95         GRITS_OBJECT(test->marker)->center.lat  =  38.841847;
96         GRITS_OBJECT(test->marker)->center.lon  = -90.491982;
97         GRITS_OBJECT(test->marker)->center.elev =   0.0;
98         GRITS_OBJECT(test->marker)->lod         = EARTH_R*3;
99         grits_object_set_cursor(GRITS_OBJECT(test->marker), GDK_HAND2);
100         grits_viewer_add(test->viewer, GRITS_OBJECT(test->marker), GRITS_LEVEL_HUD, FALSE);
101         g_signal_connect(test->marker, "clicked", G_CALLBACK(on_marker_button), test->viewer);
102 }
103
104 void _load_poly(GritsPluginTest *test)
105 {
106         test->poly = grits_poly_parse("35,-90 35,-110 45,-110 45,-90", "\t", " ", ",");
107         test->poly->color[0]  = test->poly->border[0] = 1;
108         test->poly->color[1]  = test->poly->border[1] = 0;
109         test->poly->color[2]  = test->poly->border[2] = 0;
110         test->poly->color[3]  = 0.2;
111         test->poly->border[3] = 1;
112         test->poly->width     = 6;
113         grits_viewer_add(test->viewer, GRITS_OBJECT(test->poly),  GRITS_LEVEL_OVERLAY, FALSE);
114         g_signal_connect(test->poly, "enter",     G_CALLBACK(on_poly_enter),  NULL);
115         g_signal_connect(test->poly, "leave",     G_CALLBACK(on_poly_leave),  NULL);
116         g_signal_connect(test->poly, "clicked",   G_CALLBACK(on_poly_button), NULL);
117         g_signal_connect(test->poly, "key-press", G_CALLBACK(on_poly_key),    NULL);
118 }
119
120 void _load_line(GritsPluginTest *test)
121 {
122         test->line = grits_line_parse("30,-80 30,-120 50,-120 50,-80", "\t", " ", ",");
123         test->line->color[0]  = 1;
124         test->line->color[1]  = 0;
125         test->line->color[2]  = 0;
126         test->line->color[3]  = 1;
127         test->line->width     = 8;
128         grits_viewer_add(test->viewer, GRITS_OBJECT(test->line),  GRITS_LEVEL_OVERLAY, FALSE);
129         g_signal_connect(test->line, "enter",        G_CALLBACK(on_poly_enter),  NULL);
130         g_signal_connect(test->line, "leave",        G_CALLBACK(on_poly_leave),  NULL);
131         g_signal_connect(test->line, "button-press", G_CALLBACK(on_poly_button), NULL);
132         g_signal_connect(test->line, "key-press",    G_CALLBACK(on_poly_key),    NULL);
133 }
134
135 /**
136  * grits_plugin_test_new:
137  * @viewer: the #GritsViewer to use for drawing
138  *
139  * Create a new instance of the testing plugin.
140  *
141  * Returns: the new #GritsPluginTest
142  */
143 GritsPluginTest *grits_plugin_test_new(GritsViewer *viewer)
144 {
145         g_debug("GritsPluginTest: new");
146         GritsPluginTest *test = g_object_new(GRITS_TYPE_PLUGIN_TEST, NULL);
147         test->viewer = g_object_ref(viewer);
148         _load_marker(test);
149         _load_poly(test);
150         _load_line(test);
151         return test;
152 }
153
154
155 /****************
156  * GObject code *
157  ****************/
158 /* Plugin init */
159 static void grits_plugin_test_plugin_init(GritsPluginInterface *iface);
160 G_DEFINE_TYPE_WITH_CODE(GritsPluginTest, grits_plugin_test, G_TYPE_OBJECT,
161                 G_IMPLEMENT_INTERFACE(GRITS_TYPE_PLUGIN,
162                         grits_plugin_test_plugin_init));
163 static void grits_plugin_test_plugin_init(GritsPluginInterface *iface)
164 {
165         g_debug("GritsPluginTest: plugin_init");
166         /* Add methods to the interface */
167 }
168 /* Class/Object init */
169 static void grits_plugin_test_init(GritsPluginTest *test)
170 {
171         g_debug("GritsPluginTest: init");
172 }
173 static void grits_plugin_test_dispose(GObject *_test)
174 {
175         g_debug("GritsPluginTest: dispose");
176         GritsPluginTest *test = GRITS_PLUGIN_TEST(_test);
177         if (test->viewer) {
178                 GritsViewer *viewer = test->viewer;
179                 test->viewer = NULL;
180                 grits_viewer_remove(viewer, GRITS_OBJECT(test->marker));
181                 grits_viewer_remove(viewer, GRITS_OBJECT(test->poly));
182                 grits_viewer_remove(viewer, GRITS_OBJECT(test->line));
183                 g_object_unref(test->marker);
184                 g_object_unref(test->poly);
185                 g_object_unref(test->line);
186                 g_object_unref(viewer);
187         }
188         G_OBJECT_CLASS(grits_plugin_test_parent_class)->dispose(_test);
189 }
190 static void grits_plugin_test_class_init(GritsPluginTestClass *klass)
191 {
192         g_debug("GritsPluginTest: class_init");
193         GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
194         gobject_class->dispose = grits_plugin_test_dispose;
195 }