Version 0.4
[colorize.git] / gui / flow.c
1 #include <gtk/gtk.h>
2 #include <gdk/gdkkeysyms.h>
3 #include <string.h>
4 #include <stdlib.h>
5 #include <unistd.h>
6 #include <math.h>
7 #include "main.h"
8 #include "../src/opticalflow.h"
9 #include "flow.h"
10 #include "timeline.h"
11 #include "image.h"
12
13 static GtkWidget *flow_dialog = NULL;
14 static GtkWidget *enable_button;
15 static GtkObject *window_adj;
16 static GtkObject *vector_adj;
17 static GtkObject *uv_adj;
18
19 static void flow_destroy(GtkWidget *widget, gpointer priv)
20 {
21         gtk_widget_destroy(flow_dialog);
22         flow_dialog = NULL;
23 }
24
25 static gboolean flow_key_press(GtkWidget *widget, GdkEventKey *event, gpointer priv)
26 {
27         switch (event->keyval) {
28         case GDK_q:
29         case GDK_w:
30                 if (event->state & GDK_CONTROL_MASK) {
31                         gtk_widget_destroy(widget);
32                         return TRUE;
33                 }
34         default:
35                 ;//printf("%x\n", event->keyval);
36         }
37
38         return FALSE;
39 }
40
41 static void close_event(gpointer *priv)
42 {
43         gtk_widget_destroy(flow_dialog);
44         flow_dialog = NULL;
45 }
46
47 static void reset_event(gpointer *priv)
48 {
49         anything_modified = 1;
50
51         flow_default();
52         gtk_adjustment_set_value(GTK_ADJUSTMENT(window_adj), flow_window);
53         gtk_adjustment_set_value(GTK_ADJUSTMENT(vector_adj), flow_view_vector);
54         gtk_adjustment_set_value(GTK_ADJUSTMENT(uv_adj), flow_view_uv);
55         if (flowview)
56                 timeline_select_and_save(timeline_selected, timeline_selected);
57 //              draw_image(0, 0, -1, -1);
58 }
59
60 static void apply_event(gpointer *priv)
61 {
62         anything_modified = 1;
63
64         flow_enable = GTK_TOGGLE_BUTTON(enable_button)->active;
65         flow_window = GTK_ADJUSTMENT(window_adj)->value;
66         flow_view_vector = GTK_ADJUSTMENT(vector_adj)->value;
67         flow_view_uv = GTK_ADJUSTMENT(uv_adj)->value;
68         if (flowview)
69                 timeline_select_and_save(timeline_selected, timeline_selected);
70 //              draw_image(0, 0, -1, -1);
71 }
72
73 static GtkWidget *xpm_label_box( const gchar *stock_id,
74                                  gchar *label_text)
75 {
76         GtkWidget *box;
77         GtkWidget *label;
78         GtkWidget *image;
79
80         /* Create box for image and label */
81         box = gtk_hbox_new (FALSE, 0);
82         gtk_container_set_border_width (GTK_CONTAINER (box), 4);
83
84         /* Now on to the image stuff */
85         image = gtk_image_new_from_stock(stock_id, -1);
86
87         /* Create a label for the button */
88         label = gtk_label_new (label_text);
89
90         /* Pack the image and label into the box */
91         gtk_box_pack_start (GTK_BOX (box), image, FALSE, FALSE, 3);
92         gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 3);
93
94         gtk_widget_show (image);
95         gtk_widget_show (label);
96
97         return box;
98 }
99
100 void flow_event(gpointer priv)
101 {
102         GtkWidget *vbox, *hbox;
103         GtkWidget *menu_bar;
104         GtkWidget *root_menu;
105         GtkWidget *menu;
106         GtkWidget *menu_item;
107         GtkWidget *enable_label;
108         GtkWidget *window_label;
109         GtkWidget *window_scroll;
110         GtkWidget *vector_label;
111         GtkWidget *vector_scroll;
112         GtkWidget *uv_label;
113         GtkWidget *uv_scroll;
114         GtkWidget *button_apply;
115         GtkWidget *button_reset;
116         GtkWidget *box;
117
118         if (flow_dialog) {
119                 gtk_widget_destroy(flow_dialog);
120                 flow_dialog = NULL;
121                 return;
122         }
123
124         if (timeline_frames <= 1)
125                 return;
126
127         /* create window */
128         flow_dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
129         gtk_window_set_default_size(GTK_WINDOW(flow_dialog), 300, 0);
130         gtk_window_set_title(GTK_WINDOW(flow_dialog), "Optical Flow");
131         g_signal_connect(flow_dialog, "destroy", G_CALLBACK(flow_destroy), flow_dialog);
132         g_signal_connect(flow_dialog, "key_press_event", G_CALLBACK(flow_key_press), flow_dialog);
133
134         /* create menu*/
135         menu_bar = gtk_menu_bar_new();
136         gtk_widget_show(menu_bar);
137         menu = gtk_menu_new();
138         root_menu = gtk_menu_item_new_with_mnemonic("_File");
139         gtk_widget_show(root_menu);
140
141         menu_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_CLOSE, NULL);
142         gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
143         g_signal_connect_swapped(menu_item, "activate", G_CALLBACK(close_event), flow_dialog);
144         gtk_widget_show(menu_item);
145         gtk_menu_item_set_submenu(GTK_MENU_ITEM(root_menu), menu);
146         gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), root_menu);
147
148         /* create sflow widgets */
149         enable_label = gtk_label_new("Enable:"); 
150         gtk_widget_show(GTK_WIDGET(enable_label));
151         enable_button = gtk_check_button_new();
152         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(enable_button), flow_enable ? TRUE : FALSE);
153 //      g_signal_connect(enable_button, "toggled", G_CALLBACK(enable_event), NULL);
154         gtk_widget_show(enable_button);
155
156         window_label = gtk_label_new("Search Window:"); 
157         gtk_widget_show(GTK_WIDGET(window_label));
158         window_adj = gtk_adjustment_new(flow_window, 3, 61, 1, 1, 1);
159         window_scroll = gtk_hscale_new(GTK_ADJUSTMENT(window_adj));
160         gtk_widget_show(window_scroll);
161
162         vector_label = gtk_label_new("Display vectors (1=disable):"); 
163         gtk_widget_show(GTK_WIDGET(vector_label));
164         vector_adj = gtk_adjustment_new(flow_view_vector, 1, 51, 1, 1, 1);
165         vector_scroll = gtk_hscale_new(GTK_ADJUSTMENT(vector_adj));
166         gtk_widget_show(vector_scroll);
167
168         uv_label = gtk_label_new("Display next as UV (0=disable):"); 
169         gtk_widget_show(GTK_WIDGET(uv_label));
170         uv_adj = gtk_adjustment_new(flow_view_uv, 0, 101, 1, 1, 1);
171         uv_scroll = gtk_hscale_new(GTK_ADJUSTMENT(uv_adj));
172         gtk_widget_show(uv_scroll);
173
174         /* buttons */
175         button_reset = gtk_button_new();
176         g_signal_connect(button_reset, "clicked", G_CALLBACK(reset_event), NULL);
177         box = xpm_label_box (GTK_STOCK_REMOVE, "Reset");
178         gtk_widget_show (box);
179         gtk_container_add (GTK_CONTAINER (button_reset), box);
180         gtk_widget_show(button_reset);
181
182         button_apply = gtk_button_new();
183         g_signal_connect(button_apply, "clicked", G_CALLBACK(apply_event), NULL);
184         box = xpm_label_box (GTK_STOCK_APPLY, "Apply");
185         gtk_widget_show (box);
186         gtk_container_add (GTK_CONTAINER (button_apply), box);
187         gtk_widget_show(button_apply);
188
189         hbox = gtk_hbox_new(FALSE, 0);
190         gtk_box_pack_end(GTK_BOX(hbox), button_apply, FALSE, FALSE, 2);
191         gtk_box_pack_end(GTK_BOX(hbox), button_reset, FALSE, FALSE, 2);
192         gtk_widget_show(hbox);
193
194         /* create vbox (complete window) */
195         vbox = gtk_vbox_new(FALSE, 0);
196         gtk_box_pack_start(GTK_BOX(vbox), menu_bar, FALSE, FALSE, 2);
197         gtk_box_pack_start(GTK_BOX(vbox), enable_label, FALSE, FALSE, 2);
198         gtk_box_pack_start(GTK_BOX(vbox), enable_button, FALSE, FALSE, 2);
199         gtk_box_pack_start(GTK_BOX(vbox), window_label, FALSE, FALSE, 2);
200         gtk_box_pack_start(GTK_BOX(vbox), window_scroll, FALSE, FALSE, 2);
201         gtk_box_pack_start(GTK_BOX(vbox), vector_label, FALSE, FALSE, 2);
202         gtk_box_pack_start(GTK_BOX(vbox), vector_scroll, FALSE, FALSE, 2);
203         gtk_box_pack_start(GTK_BOX(vbox), uv_label, FALSE, FALSE, 2);
204         gtk_box_pack_start(GTK_BOX(vbox), uv_scroll, FALSE, FALSE, 2);
205         gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 20);
206         gtk_widget_show(vbox);
207
208         gtk_container_add(GTK_CONTAINER(flow_dialog), vbox);
209         gtk_widget_show(flow_dialog);
210 }
211
212