2 #include <gdk/gdkkeysyms.h>
6 #include "../src/mark.h"
8 #include "../src/opticalflow.h"
18 #include "diag_level.h"
21 #include "diag_flow.h"
28 static void open_event(gpointer priv)
31 char *filename = NULL;
33 if (anything_modified) {
35 GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW(main_window),
36 GTK_DIALOG_DESTROY_WITH_PARENT,
38 GTK_BUTTONS_OK_CANCEL,
39 "Image has been changed, really open new image?");
40 ret = gtk_dialog_run(GTK_DIALOG (dialog));
41 gtk_widget_destroy(dialog);
42 if (ret != GTK_RESPONSE_OK)
46 dialog = gtk_file_chooser_dialog_new("Select first grey image",
47 GTK_WINDOW(main_window),
48 GTK_FILE_CHOOSER_ACTION_OPEN,
49 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
50 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
54 gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), frame_list[timeline_selected].filename);
55 if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
56 filename = strdup(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)));
59 gtk_widget_destroy(dialog);
62 // do not save timeline_select_and_save(timeline_selected, timeline_selected);
64 create_timeline(filename);
66 create_image(frame_list[timeline_selected].filename, 1);
72 static void save_event(gpointer priv)
74 anything_modified = 1;
75 timeline_select_and_save(timeline_selected, timeline_selected);
78 static void exit_event(gpointer priv)
83 static void color_changed(GtkWidget *widget, GtkColorSelection *colorsel)
87 void undo_event(gpointer priv)
89 if (!mark && !highlight)
92 draw_image(0, 0, -1, -1);
95 void redo_event(gpointer priv)
97 if (!mark && !highlight)
100 draw_image(0, 0, -1, -1);
103 void copy_event(gpointer priv)
105 if (!mark && !highlight)
107 copy_color(mark_selected + 1);
110 static void copy_all_event(gpointer priv)
112 if (!mark && !highlight)
117 void paste_event(gpointer priv)
119 if (!mark && !highlight)
123 draw_image(0, 0, -1, -1);
126 static void color_destroy(GtkWidget *widget, gpointer data)
131 void palette_event(gpointer priv)
136 gtk_widget_destroy(colorseldlg);
141 color.red = mark_palette[mark_selected].r * 256 + 128;
142 color.green = mark_palette[mark_selected].g * 256 + 128;
143 color.blue = mark_palette[mark_selected].b * 256 + 128;
145 colorseldlg = gtk_color_selection_dialog_new("Select Color");
146 colorsel = GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (colorseldlg)->colorsel);
147 gtk_color_selection_set_previous_color (colorsel, &color);
148 gtk_color_selection_set_current_color (colorsel, &color);
149 g_signal_connect(G_OBJECT(colorsel), "color_changed", G_CALLBACK(color_changed), (gpointer)colorsel);
150 g_signal_connect(G_OBJECT(colorseldlg), "response", G_CALLBACK(color_response), NULL);
151 g_signal_connect(G_OBJECT(colorseldlg), "destroy", G_CALLBACK(color_destroy), NULL);
154 gtk_widget_show(colorseldlg);
157 static void keyframe_event(gpointer priv)
162 static void erase_event(gpointer priv)
164 printerror("Use RIGHT mouse button to erase!");
167 static void clear_event(gpointer priv)
171 draw_image(0, 0, -1, -1);
174 static void clear_color_event(gpointer priv)
177 erase_mark(mark_selected + 1);
178 draw_image(0, 0, -1, -1);
181 void zoom_in_event(gpointer priv)
183 if (img_scale_x < 64) {
184 int aspect = img_scale_y / img_scale_x;
186 img_scale_y = img_scale_x * aspect;
187 create_or_reset_pixbuf(0);
191 void zoom_out_event(gpointer priv)
193 if (img_scale_x > 4) {
194 int aspect = img_scale_y / img_scale_x;
196 img_scale_y = img_scale_x * aspect;
197 create_or_reset_pixbuf(0);
201 static void zoom_100_event(gpointer priv)
205 create_or_reset_pixbuf(0);
208 static void zoom_field_event(gpointer priv)
210 if (gtk_check_menu_item_get_active((GtkCheckMenuItem *)priv))
211 img_scale_y = img_scale_x*2;
213 img_scale_y = img_scale_x;
214 create_or_reset_pixbuf(1);
217 static void show_highlighted_event(gpointer priv)
219 highlight = gtk_check_menu_item_get_active((GtkCheckMenuItem *)priv);
220 set_button_toggel_by_label(TOGGLE_LABEL_HIGHLIGHT, highlight);
221 if (mark == 1 && highlight == 1) {
223 set_button_toggel_by_label(TOGGLE_LABEL_MARK, mark);
224 set_menu_toggel_by_label(TOGGLE_LABEL_MARK, mark);
228 static void show_marked_event(gpointer priv)
230 mark = gtk_check_menu_item_get_active((GtkCheckMenuItem *)priv);
231 set_button_toggel_by_label(TOGGLE_LABEL_MARK, mark);
232 if (mark == 1 && highlight == 1) {
234 set_button_toggel_by_label(TOGGLE_LABEL_HIGHLIGHT, highlight);
235 set_menu_toggel_by_label(TOGGLE_LABEL_HIGHLIGHT, highlight);
239 static void show_preview_event(gpointer priv)
241 preview = gtk_check_menu_item_get_active((GtkCheckMenuItem *)priv);
242 set_button_toggel_by_label(TOGGLE_LABEL_PREVIEW, preview);
245 void colorize_event(gpointer priv)
249 printerror("Disable flow view first.");
257 static void show_colorized_event(gpointer priv)
259 if (timeline_frames > 1)
260 rendered = gtk_check_menu_item_get_active((GtkCheckMenuItem *)priv);
263 gtk_check_menu_item_set_active((GtkCheckMenuItem *)priv, rendered);
264 set_button_toggel_by_label(TOGGLE_LABEL_RENDERED, rendered);
268 static void show_flow_event(gpointer priv)
270 if (flow_enable && timeline_frames > 1)
271 flowview = gtk_check_menu_item_get_active((GtkCheckMenuItem *)priv);
274 gtk_check_menu_item_set_active((GtkCheckMenuItem *)priv, flowview);
275 set_button_toggel_by_label(TOGGLE_LABEL_FLOWVIEW, flowview);
279 static void dummy_event(gpointer priv)
285 struct my_menu_item {
286 enum toggle_label label;
289 void (*handler)(gpointer priv);
295 struct my_menu_item *items;
298 struct my_menu_item file_menu_items[] = {
299 { TOGGLE_LABEL_NONE, NULL, "Open", open_event, GTK_STOCK_OPEN },
300 { TOGGLE_LABEL_NONE, NULL, "Save", save_event, GTK_STOCK_SAVE },
301 { TOGGLE_LABEL_NONE, NULL, "", dummy_event, NULL },
302 { TOGGLE_LABEL_NONE, NULL, "Exit", exit_event, GTK_STOCK_QUIT },
303 { TOGGLE_LABEL_NONE, NULL, NULL, NULL }
306 struct my_menu_item edit_menu_items[] = {
307 { TOGGLE_LABEL_NONE, NULL, "Undo", undo_event, GTK_STOCK_UNDO },
308 { TOGGLE_LABEL_NONE, NULL, "Redo", redo_event, GTK_STOCK_REDO },
309 { TOGGLE_LABEL_NONE, NULL, "", dummy_event, NULL },
310 { TOGGLE_LABEL_NONE, NULL, "Copy", copy_event, GTK_STOCK_COPY },
311 { TOGGLE_LABEL_NONE, NULL, "Copy All", copy_all_event, NULL },
312 { TOGGLE_LABEL_NONE, NULL, "Paste", paste_event, GTK_STOCK_PASTE },
313 { TOGGLE_LABEL_NONE, NULL, "", dummy_event, NULL },
314 { TOGGLE_LABEL_NONE, NULL, "Palette", palette_event, NULL },
315 { TOGGLE_LABEL_NONE, NULL, "Bright/Contrast", bc_event, NULL },
316 { TOGGLE_LABEL_NONE, NULL, "Adjust Levels", level_event, NULL },
318 { TOGGLE_LABEL_NONE, NULL, "Optical Flow", flow_event, NULL },
320 { TOGGLE_LABEL_NONE, NULL, "", dummy_event, NULL },
321 { TOGGLE_LABEL_NONE, NULL, "Keyframe", keyframe_event, NULL },
322 { TOGGLE_LABEL_NONE, NULL, "", dummy_event, NULL },
323 { TOGGLE_LABEL_NONE, NULL, "Erase Tool", erase_event, NULL },
324 { TOGGLE_LABEL_NONE, NULL, "Clear", clear_event, GTK_STOCK_CLEAR },
325 { TOGGLE_LABEL_NONE, NULL, "Clear Color", clear_color_event, NULL },
326 { TOGGLE_LABEL_NONE, NULL, NULL, NULL }
329 struct my_menu_item view_menu_items[] = {
330 { TOGGLE_LABEL_NONE, NULL, "Zoom In", zoom_in_event, GTK_STOCK_ZOOM_IN },
331 { TOGGLE_LABEL_NONE, NULL, "Zoom Out", zoom_out_event, GTK_STOCK_ZOOM_OUT },
332 { TOGGLE_LABEL_NONE, NULL, "Zoom 100", zoom_100_event, GTK_STOCK_ZOOM_100 },
333 { TOGGLE_LABEL_ZOOMFIELDS, NULL, "Zoom Field", zoom_field_event, NULL },
334 { TOGGLE_LABEL_NONE, NULL, "", dummy_event, NULL },
335 { TOGGLE_LABEL_MARK, NULL, "Mark color", show_marked_event, NULL },
336 { TOGGLE_LABEL_HIGHLIGHT, NULL, "Highlight color", show_highlighted_event, NULL },
337 { TOGGLE_LABEL_PREVIEW, NULL, "Preview color", show_preview_event, NULL },
338 { TOGGLE_LABEL_RENDERED, NULL, "Show colorized", show_colorized_event, NULL },
340 { TOGGLE_LABEL_FLOWVIEW, NULL, "Show flow", show_flow_event, NULL },
342 { TOGGLE_LABEL_NONE, NULL, NULL, NULL }
345 struct my_menu_item render_menu_items[] = {
346 { TOGGLE_LABEL_NONE, NULL, "Colorize Image", colorize_event, NULL },
347 { TOGGLE_LABEL_NONE, NULL, NULL, NULL }
350 struct my_menu menus[] = {
351 { "_File", file_menu_items },
352 { "_Edit", edit_menu_items },
353 { "_View", view_menu_items },
354 { "_Render", render_menu_items },
358 /* create menu bar */
359 void create_menus(GtkWidget *menu_bar)
361 GtkWidget *root_menu;
363 GtkWidget *menu_item;
364 struct my_menu_item *items;
367 /* create vbox and add menu_bar */
368 for (i = 0; menus[i].text; i++) {
369 /* create menu with items */
370 items = menus[i].items;
371 menu = gtk_menu_new();
372 for (j = 0; items[j].text; j++) {
373 if (!items[j].text[0])
374 menu_item = gtk_separator_menu_item_new();
375 else if (items[j].stock)
376 menu_item = gtk_image_menu_item_new_from_stock(items[j].stock, NULL);
377 else if (items[j].label != TOGGLE_LABEL_NONE)
378 menu_item = gtk_check_menu_item_new_with_label(items[j].text);
380 menu_item = gtk_menu_item_new_with_label(items[j].text);
381 items[j].widget = menu_item;
382 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
383 g_signal_connect_swapped(menu_item, "activate", G_CALLBACK(items[j].handler), menu_item);
384 gtk_widget_show(menu_item);
386 /* create root menu and add to menu_bar */
387 root_menu = gtk_menu_item_new_with_mnemonic(menus[i].text);
388 gtk_widget_show(root_menu);
389 gtk_menu_item_set_submenu(GTK_MENU_ITEM(root_menu), menu);
390 gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), root_menu);
395 void set_menu_toggel_by_label(enum toggle_label label, gboolean active)
397 struct my_menu_item *items;
400 for (i = 0; menus[i].text; i++) {
401 items = menus[i].items;
402 for (j = 0; items[j].text; j++) {
403 if (items[j].label == label)
404 gtk_check_menu_item_set_active((GtkCheckMenuItem *)items[j].widget, active);