Move GTK menu bar and functions into seperate file
authorAndreas Eversberg <jolly@eversberg.eu>
Sat, 16 Aug 2014 06:15:39 +0000 (08:15 +0200)
committerAndreas Eversberg <jolly@eversberg.eu>
Sun, 15 Mar 2015 14:33:54 +0000 (15:33 +0100)
gui/Makefile.am
gui/main.c
gui/main.h
gui/menu.c [new file with mode: 0644]
gui/menu.h [new file with mode: 0644]

index 28cb324..680e15d 100644 (file)
@@ -33,6 +33,7 @@ colorize_gtk_SOURCES = \
        buttons/b_zoomin.c buttons/b_zoomout.c \
        buttons/b_highlight.c buttons/b_eye.c buttons/b_pal.c buttons/b_col.c \
        buttons/b_bc.c buttons/b_preview.c buttons/b_flow.c buttons/b_fill.c \
+       menu.c \
        main.c
 if ENABLE_OPENCV
 colorize_gtk_SOURCES += \
index c89da3c..b828b14 100644 (file)
@@ -8,6 +8,7 @@
 #include "../src/opticalflow.h"
 #endif
 #include "main.h"
+#include "menu.h"
 #include "image.h"
 #include "palette.h"
 #include "timeline.h"
@@ -38,18 +39,6 @@ int mouse_over_palette_area = 0, mouse_over_drawing_area = 0, mouse_over_timelin
 #define min(x,y) ((x < y) ? x : y)
 #define abs(x,y) ((x < y) ? y - x : x - y)
 
-/* the labels are used to identify menu and button items */
-enum toggle_label {
-       TOGGLE_LABEL_NONE = 0,
-       TOGGLE_LABEL_HIGHLIGHT,
-       TOGGLE_LABEL_PREVIEW,
-       TOGGLE_LABEL_RENDERED,
-       TOGGLE_LABEL_FLOWVIEW,
-       TOGGLE_LABEL_ZOOMFIELDS,
-};
-
-static void set_button_toggel_by_label(enum toggle_label label, gboolean active);
-
 /* error requester */
 void printerror(const char *fmt, ...)
 {
@@ -102,11 +91,6 @@ static void destroy(GtkWidget *widget, gpointer data)
  * keypress
  */
 
-static void undo_event(gpointer priv);
-static void redo_event(gpointer priv);
-static void copy_event(gpointer priv);
-static void paste_event(gpointer priv);
-
 /* event handler for main window keys */
 static gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
 {
@@ -407,10 +391,10 @@ static gint timeline_expose_event (GtkWidget *widget, GdkEventExpose *event)
  * colorselection
  */
 
-/* color selection's buttons have been pressed */
 GtkWidget *colorseldlg = NULL;
 GtkColorSelection *colorsel;
-static void color_response(GtkDialog *dialog, gint response_id, gpointer user_data)
+/* color selection's buttons have been pressed */
+void color_response(GtkDialog *dialog, gint response_id, gpointer user_data)
 {
        GdkColor ncolor;
 
@@ -433,359 +417,6 @@ new_color:
 }
 
 /*
- * menus
- */
-
-static void open_event(gpointer priv)
-{
-       GtkWidget *dialog;
-       char *filename = NULL;
-       
-       if (anything_modified) {
-               int ret;
-               GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW(main_window),
-                       GTK_DIALOG_DESTROY_WITH_PARENT,
-                       GTK_MESSAGE_ERROR,
-                       GTK_BUTTONS_OK_CANCEL,
-                       "Image has been changed, really open new image?");
-               ret = gtk_dialog_run(GTK_DIALOG (dialog));
-               gtk_widget_destroy(dialog);
-               if (ret != GTK_RESPONSE_OK)
-                       return;
-       }
-
-       dialog = gtk_file_chooser_dialog_new("Select first grey image",
-               GTK_WINDOW(main_window),
-               GTK_FILE_CHOOSER_ACTION_OPEN,
-               GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-               GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
-               NULL);
-
-       if (frame_list)
-               gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), frame_list[timeline_selected].filename);
-       if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
-               filename = strdup(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)));
-       }
-
-       gtk_widget_destroy(dialog);
-
-       if (filename) {
-// do not save         timeline_select_and_save(timeline_selected, timeline_selected);
-               
-               create_timeline(filename);
-               if (frame_list)
-                       create_image(frame_list[timeline_selected].filename, 1);
-               free(filename);
-       }
-
-}
-
-static void save_event(gpointer priv)
-{
-       timeline_select_and_save(timeline_selected, timeline_selected);
-}
-
-static void exit_event(gpointer priv)
-{
-       main_destroy();
-}
-
-static void color_changed(GtkWidget *widget, GtkColorSelection *colorsel)
-{
-}
-
-static void undo_event(gpointer priv)
-{
-       copy_undo_to_mark(0);
-       draw_image(0, 0, -1, -1);
-}
-
-static void redo_event(gpointer priv)
-{
-       copy_undo_to_mark(1);
-       draw_image(0, 0, -1, -1);
-}
-
-static void copy_event(gpointer priv)
-{
-       copy_color(mark_selected + 1);
-}
-
-static void copy_all_event(gpointer priv)
-{
-       copy_color(0);
-}
-
-static void paste_event(gpointer priv)
-{
-       copy_mark_to_undo();
-       paste_color();
-       draw_image(0, 0, -1, -1);
-}
-
-static void color_destroy(GtkWidget *widget, gpointer data)
-{
-       colorseldlg = NULL;
-}
-
-static void palette_event(gpointer priv)
-{
-       GdkColor color;
-
-       if (colorseldlg) {
-               gtk_widget_destroy(colorseldlg);
-               colorseldlg = NULL;
-               return;
-       }
-
-       color.red = mark_palette[mark_selected].r * 256 + 128;
-       color.green = mark_palette[mark_selected].g * 256 + 128;
-       color.blue = mark_palette[mark_selected].b * 256 + 128;
-
-       colorseldlg = gtk_color_selection_dialog_new("Select Color");
-       colorsel = GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (colorseldlg)->colorsel);
-       gtk_color_selection_set_previous_color (colorsel, &color);
-       gtk_color_selection_set_current_color (colorsel, &color);
-       g_signal_connect(G_OBJECT(colorsel), "color_changed", G_CALLBACK(color_changed), (gpointer)colorsel);
-       g_signal_connect(G_OBJECT(colorseldlg), "response", G_CALLBACK(color_response), NULL);
-       g_signal_connect(G_OBJECT(colorseldlg), "destroy", G_CALLBACK(color_destroy), NULL);
-
-
-       gtk_widget_show(colorseldlg);
-}
-
-static void keyframe_event(gpointer priv)
-{
-       toggle_keyframe();
-}
-
-static void erase_event(gpointer priv)
-{
-       copy_mark_to_undo();
-       erase_mark(0);
-       draw_image(0, 0, -1, -1);
-}
-
-static void erase_color_event(gpointer priv)
-{
-       copy_mark_to_undo();
-       erase_mark(mark_selected + 1);
-       draw_image(0, 0, -1, -1);
-}
-
-static void zoom_in_event(gpointer priv)
-{
-       if (img_scale_x < 64) {
-               int aspect = img_scale_y / img_scale_x;
-               img_scale_x += 4;
-               img_scale_y = img_scale_x * aspect;
-               create_or_reset_pixbuf(0);
-       }
-}
-
-static void zoom_out_event(gpointer priv)
-{
-       if (img_scale_x > 4) {
-               int aspect = img_scale_y / img_scale_x;
-               img_scale_x -= 4;
-               img_scale_y = img_scale_x * aspect;
-               create_or_reset_pixbuf(0);
-       }
-}
-
-static void zoom_100_event(gpointer priv)
-{
-       img_scale_x = 16;
-       img_scale_y = 16;
-       create_or_reset_pixbuf(0);
-}
-
-static void zoom_field_event(gpointer priv)
-{
-       if (gtk_check_menu_item_get_active((GtkCheckMenuItem *)priv))
-               img_scale_y = img_scale_x*2;
-       else
-               img_scale_y = img_scale_x;
-       create_or_reset_pixbuf(1);
-}
-
-static void show_highlighted_event(gpointer priv)
-{
-       highlight = gtk_check_menu_item_get_active((GtkCheckMenuItem *)priv);
-       set_button_toggel_by_label(TOGGLE_LABEL_HIGHLIGHT, highlight);
-}
-
-static void show_preview_event(gpointer priv)
-{
-       preview = gtk_check_menu_item_get_active((GtkCheckMenuItem *)priv);
-       set_button_toggel_by_label(TOGGLE_LABEL_PREVIEW, preview);
-}
-
-static void colorize_event(gpointer priv)
-{
-       if (rendered) {
-               printerror("Disable colorized view first.");
-               return;
-       }
-#ifdef WITH_OPENCV
-       if (flowview) {
-               printerror("Disable flow view first.");
-               return;
-       }
-#endif
-       if (img_mark_buffer)
-               colorize_image();
-}
-
-static void show_colorized_event(gpointer priv)
-{
-       if (timeline_frames > 1)
-               rendered = gtk_check_menu_item_get_active((GtkCheckMenuItem *)priv);
-       else
-               rendered = 0;
-       gtk_check_menu_item_set_active((GtkCheckMenuItem *)priv, rendered);
-       set_button_toggel_by_label(TOGGLE_LABEL_RENDERED, rendered);
-}
-
-#ifdef WITH_OPENCV
-static void show_flow_event(gpointer priv)
-{
-       if (flow_enable && timeline_frames > 1)
-               flowview = gtk_check_menu_item_get_active((GtkCheckMenuItem *)priv);
-       else
-               flowview = 0;
-       gtk_check_menu_item_set_active((GtkCheckMenuItem *)priv, flowview);
-       set_button_toggel_by_label(TOGGLE_LABEL_FLOWVIEW, flowview);
-}
-#endif
-
-static void dummy_event(gpointer priv)
-{
-}
-
-struct my_menu_item {
-       enum toggle_label label;
-       GtkWidget *widget;
-       const char *text;
-       void (*handler)(gpointer priv);
-       gchar *stock;
-};
-
-struct my_menu {
-       const char *text;
-       struct my_menu_item *items;
-};
-
-struct my_menu_item file_menu_items[] = {
-       { TOGGLE_LABEL_NONE, NULL, "Open", open_event, GTK_STOCK_OPEN },
-       { TOGGLE_LABEL_NONE, NULL, "Save", save_event, GTK_STOCK_SAVE },
-       { TOGGLE_LABEL_NONE, NULL, "", dummy_event, NULL },
-       { TOGGLE_LABEL_NONE, NULL, "Exit", exit_event, GTK_STOCK_QUIT },
-       { TOGGLE_LABEL_NONE, NULL, NULL, NULL }
-};
-
-struct my_menu_item edit_menu_items[] = {
-       { TOGGLE_LABEL_NONE, NULL, "Undo", undo_event, GTK_STOCK_UNDO },
-       { TOGGLE_LABEL_NONE, NULL, "Redo", redo_event, GTK_STOCK_REDO },
-       { TOGGLE_LABEL_NONE, NULL, "", dummy_event, NULL },
-       { TOGGLE_LABEL_NONE, NULL, "Copy", copy_event, GTK_STOCK_COPY },
-       { TOGGLE_LABEL_NONE, NULL, "Copy All", copy_all_event, NULL },
-       { TOGGLE_LABEL_NONE, NULL, "Paste", paste_event, GTK_STOCK_PASTE },
-       { TOGGLE_LABEL_NONE, NULL, "", dummy_event, NULL },
-       { TOGGLE_LABEL_NONE, NULL, "Palette", palette_event, NULL },
-       { TOGGLE_LABEL_NONE, NULL, "Bright/Contrast", bc_event, NULL },
-       { TOGGLE_LABEL_NONE, NULL, "Adjust Levels", level_event, NULL },
-#ifdef WITH_OPENCV
-       { TOGGLE_LABEL_NONE, NULL, "Optical Flow", flow_event, NULL },
-#endif
-       { TOGGLE_LABEL_NONE, NULL, "", dummy_event, NULL },
-       { TOGGLE_LABEL_NONE, NULL, "Keyframe", keyframe_event, NULL },
-       { TOGGLE_LABEL_NONE, NULL, "", dummy_event, NULL },
-       { TOGGLE_LABEL_NONE, NULL, "Clear", erase_event, GTK_STOCK_CLEAR },
-       { TOGGLE_LABEL_NONE, NULL, "Clear Color", erase_color_event, NULL },
-       { TOGGLE_LABEL_NONE, NULL, NULL, NULL }
-};
-
-struct my_menu_item view_menu_items[] = {
-       { TOGGLE_LABEL_NONE, NULL, "Zoom In", zoom_in_event, GTK_STOCK_ZOOM_IN },
-       { TOGGLE_LABEL_NONE, NULL, "Zoom Out", zoom_out_event, GTK_STOCK_ZOOM_OUT },
-       { TOGGLE_LABEL_NONE, NULL, "Zoom 100", zoom_100_event, GTK_STOCK_ZOOM_100 },
-       { TOGGLE_LABEL_ZOOMFIELDS, NULL, "Zoom Field", zoom_field_event, NULL },
-       { TOGGLE_LABEL_NONE, NULL, "", dummy_event, NULL },
-       { TOGGLE_LABEL_HIGHLIGHT, NULL, "Highlight color", show_highlighted_event, NULL },
-       { TOGGLE_LABEL_PREVIEW, NULL, "Preview color", show_preview_event, NULL },
-       { TOGGLE_LABEL_RENDERED, NULL, "Show colorized", show_colorized_event, NULL },
-#ifdef WITH_OPENCV
-       { TOGGLE_LABEL_FLOWVIEW, NULL, "Show flow", show_flow_event, NULL },
-#endif
-       { TOGGLE_LABEL_NONE, NULL, NULL, NULL }
-};
-
-struct my_menu_item render_menu_items[] = {
-       { TOGGLE_LABEL_NONE, NULL, "Colorize Image", colorize_event, NULL },
-       { TOGGLE_LABEL_NONE, NULL, NULL, NULL }
-};
-
-struct my_menu menus[] = {
-       { "_File", file_menu_items },
-       { "_Edit", edit_menu_items },
-       { "_View", view_menu_items },
-       { "_Render", render_menu_items },
-       { NULL, NULL }
-};
-
-/* create menu bar */
-static void create_menus(GtkWidget *menu_bar)
-{
-       GtkWidget *root_menu;
-       GtkWidget *menu;
-       GtkWidget *menu_item;
-       struct my_menu_item *items;
-       int i, j;
-
-       /* create vbox and add menu_bar */
-       for (i = 0; menus[i].text; i++) {
-               /* create menu with items */
-               items = menus[i].items;
-               menu = gtk_menu_new();
-               for (j = 0; items[j].text; j++) {
-                       if (!items[j].text[0])
-                               menu_item = gtk_separator_menu_item_new();
-                       else if (items[j].stock)
-                               menu_item = gtk_image_menu_item_new_from_stock(items[j].stock, NULL);
-                       else if (items[j].label != TOGGLE_LABEL_NONE)
-                               menu_item = gtk_check_menu_item_new_with_label(items[j].text);
-                       else
-                               menu_item = gtk_menu_item_new_with_label(items[j].text);
-                       items[j].widget = menu_item;
-                       gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
-                       g_signal_connect_swapped(menu_item, "activate", G_CALLBACK(items[j].handler), menu_item);
-                       gtk_widget_show(menu_item);
-               }
-               /* create root menu and add to menu_bar */
-               root_menu = gtk_menu_item_new_with_mnemonic(menus[i].text);
-               gtk_widget_show(root_menu);
-               gtk_menu_item_set_submenu(GTK_MENU_ITEM(root_menu), menu);
-               gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), root_menu);
-       }
-
-}
-
-static void set_menu_toggel_by_label(enum toggle_label label, gboolean active)
-{
-       struct my_menu_item *items;
-       int i, j;
-
-       for (i = 0; menus[i].text; i++) {
-               items = menus[i].items;
-               for (j = 0; items[j].text; j++) {
-                       if (items[j].label == label)
-                               gtk_check_menu_item_set_active((GtkCheckMenuItem *)items[j].widget, active);
-               }
-       }
-}
-
-/*
  * palette
  */
 
@@ -1000,7 +631,7 @@ struct tool_buttons {
        { TOGGLE_LABEL_NONE, NULL, NULL, 0, NULL, NULL, NULL },
 };
 
-static void set_button_toggel_by_label(enum toggle_label label, gboolean active)
+void set_button_toggel_by_label(enum toggle_label label, gboolean active)
 {
        int i;
 
index 58ff8c0..cefff58 100644 (file)
@@ -8,3 +8,21 @@ extern GtkWidget *timeline_drawing_area;
 extern GtkWidget *palette_treeview;
 extern GtkWidget *timeline_scroll;
 extern GtkLabel *img_label;
+
+extern GtkWidget *colorseldlg;
+extern GtkColorSelection *colorsel;
+void color_response(GtkDialog *dialog, gint response_id, gpointer user_data);
+
+/* the labels are used to identify menu and button items */
+enum toggle_label {
+       TOGGLE_LABEL_NONE = 0,
+       TOGGLE_LABEL_HIGHLIGHT,
+       TOGGLE_LABEL_PREVIEW,
+       TOGGLE_LABEL_RENDERED,
+       TOGGLE_LABEL_FLOWVIEW,
+       TOGGLE_LABEL_ZOOMFIELDS,
+};
+
+void set_button_toggel_by_label(enum toggle_label label, gboolean active);
+
+
diff --git a/gui/menu.c b/gui/menu.c
new file mode 100644 (file)
index 0000000..4a9af9e
--- /dev/null
@@ -0,0 +1,382 @@
+#include <gtk/gtk.h>
+#include <gdk/gdkkeysyms.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include "../src/mark.h"
+#ifdef WITH_OPENCV
+#include "../src/opticalflow.h"
+#endif
+#include "main.h"
+#include "menu.h"
+#include "image.h"
+#include "palette.h"
+#include "timeline.h"
+#include "colorize.h"
+#include "brightcontrast.h"
+#include "level.h"
+#include "fill.h"
+#ifdef WITH_OPENCV
+#include "flow.h"
+#endif
+
+/*
+ * menus
+ */
+
+static void open_event(gpointer priv)
+{
+       GtkWidget *dialog;
+       char *filename = NULL;
+       
+       if (anything_modified) {
+               int ret;
+               GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW(main_window),
+                       GTK_DIALOG_DESTROY_WITH_PARENT,
+                       GTK_MESSAGE_ERROR,
+                       GTK_BUTTONS_OK_CANCEL,
+                       "Image has been changed, really open new image?");
+               ret = gtk_dialog_run(GTK_DIALOG (dialog));
+               gtk_widget_destroy(dialog);
+               if (ret != GTK_RESPONSE_OK)
+                       return;
+       }
+
+       dialog = gtk_file_chooser_dialog_new("Select first grey image",
+               GTK_WINDOW(main_window),
+               GTK_FILE_CHOOSER_ACTION_OPEN,
+               GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+               GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+               NULL);
+
+       if (frame_list)
+               gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), frame_list[timeline_selected].filename);
+       if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
+               filename = strdup(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)));
+       }
+
+       gtk_widget_destroy(dialog);
+
+       if (filename) {
+// do not save         timeline_select_and_save(timeline_selected, timeline_selected);
+               
+               create_timeline(filename);
+               if (frame_list)
+                       create_image(frame_list[timeline_selected].filename, 1);
+               free(filename);
+       }
+
+}
+
+static void save_event(gpointer priv)
+{
+       timeline_select_and_save(timeline_selected, timeline_selected);
+}
+
+static void exit_event(gpointer priv)
+{
+       main_destroy();
+}
+
+static void color_changed(GtkWidget *widget, GtkColorSelection *colorsel)
+{
+}
+
+void undo_event(gpointer priv)
+{
+       copy_undo_to_mark(0);
+       draw_image(0, 0, -1, -1);
+}
+
+void redo_event(gpointer priv)
+{
+       copy_undo_to_mark(1);
+       draw_image(0, 0, -1, -1);
+}
+
+void copy_event(gpointer priv)
+{
+       copy_color(mark_selected + 1);
+}
+
+static void copy_all_event(gpointer priv)
+{
+       copy_color(0);
+}
+
+void paste_event(gpointer priv)
+{
+       copy_mark_to_undo();
+       paste_color();
+       draw_image(0, 0, -1, -1);
+}
+
+static void color_destroy(GtkWidget *widget, gpointer data)
+{
+       colorseldlg = NULL;
+}
+
+void palette_event(gpointer priv)
+{
+       GdkColor color;
+
+       if (colorseldlg) {
+               gtk_widget_destroy(colorseldlg);
+               colorseldlg = NULL;
+               return;
+       }
+
+       color.red = mark_palette[mark_selected].r * 256 + 128;
+       color.green = mark_palette[mark_selected].g * 256 + 128;
+       color.blue = mark_palette[mark_selected].b * 256 + 128;
+
+       colorseldlg = gtk_color_selection_dialog_new("Select Color");
+       colorsel = GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (colorseldlg)->colorsel);
+       gtk_color_selection_set_previous_color (colorsel, &color);
+       gtk_color_selection_set_current_color (colorsel, &color);
+       g_signal_connect(G_OBJECT(colorsel), "color_changed", G_CALLBACK(color_changed), (gpointer)colorsel);
+       g_signal_connect(G_OBJECT(colorseldlg), "response", G_CALLBACK(color_response), NULL);
+       g_signal_connect(G_OBJECT(colorseldlg), "destroy", G_CALLBACK(color_destroy), NULL);
+
+
+       gtk_widget_show(colorseldlg);
+}
+
+static void keyframe_event(gpointer priv)
+{
+       toggle_keyframe();
+}
+
+static void erase_event(gpointer priv)
+{
+       printerror("Use RIGHT mouse button to erase!");
+}
+
+static void clear_event(gpointer priv)
+{
+       copy_mark_to_undo();
+       erase_mark(0);
+       draw_image(0, 0, -1, -1);
+}
+
+static void clear_color_event(gpointer priv)
+{
+       copy_mark_to_undo();
+       erase_mark(mark_selected + 1);
+       draw_image(0, 0, -1, -1);
+}
+
+void zoom_in_event(gpointer priv)
+{
+       if (img_scale_x < 64) {
+               int aspect = img_scale_y / img_scale_x;
+               img_scale_x += 4;
+               img_scale_y = img_scale_x * aspect;
+               create_or_reset_pixbuf(0);
+       }
+}
+
+void zoom_out_event(gpointer priv)
+{
+       if (img_scale_x > 4) {
+               int aspect = img_scale_y / img_scale_x;
+               img_scale_x -= 4;
+               img_scale_y = img_scale_x * aspect;
+               create_or_reset_pixbuf(0);
+       }
+}
+
+static void zoom_100_event(gpointer priv)
+{
+       img_scale_x = 16;
+       img_scale_y = 16;
+       create_or_reset_pixbuf(0);
+}
+
+static void zoom_field_event(gpointer priv)
+{
+       if (gtk_check_menu_item_get_active((GtkCheckMenuItem *)priv))
+               img_scale_y = img_scale_x*2;
+       else
+               img_scale_y = img_scale_x;
+       create_or_reset_pixbuf(1);
+}
+
+static void show_highlighted_event(gpointer priv)
+{
+       highlight = gtk_check_menu_item_get_active((GtkCheckMenuItem *)priv);
+       set_button_toggel_by_label(TOGGLE_LABEL_HIGHLIGHT, highlight);
+}
+
+static void show_preview_event(gpointer priv)
+{
+       preview = gtk_check_menu_item_get_active((GtkCheckMenuItem *)priv);
+       set_button_toggel_by_label(TOGGLE_LABEL_PREVIEW, preview);
+}
+
+void colorize_event(gpointer priv)
+{
+       if (rendered) {
+               printerror("Disable colorized view first.");
+               return;
+       }
+#ifdef WITH_OPENCV
+       if (flowview) {
+               printerror("Disable flow view first.");
+               return;
+       }
+#endif
+       if (img_mark_buffer)
+               colorize_image();
+}
+
+static void show_colorized_event(gpointer priv)
+{
+       if (timeline_frames > 1)
+               rendered = gtk_check_menu_item_get_active((GtkCheckMenuItem *)priv);
+       else
+               rendered = 0;
+       gtk_check_menu_item_set_active((GtkCheckMenuItem *)priv, rendered);
+       set_button_toggel_by_label(TOGGLE_LABEL_RENDERED, rendered);
+}
+
+#ifdef WITH_OPENCV
+static void show_flow_event(gpointer priv)
+{
+       if (flow_enable && timeline_frames > 1)
+               flowview = gtk_check_menu_item_get_active((GtkCheckMenuItem *)priv);
+       else
+               flowview = 0;
+       gtk_check_menu_item_set_active((GtkCheckMenuItem *)priv, flowview);
+       set_button_toggel_by_label(TOGGLE_LABEL_FLOWVIEW, flowview);
+}
+#endif
+
+static void dummy_event(gpointer priv)
+{
+}
+
+
+
+struct my_menu_item {
+       enum toggle_label label;
+       GtkWidget *widget;
+       const char *text;
+       void (*handler)(gpointer priv);
+       gchar *stock;
+};
+
+struct my_menu {
+       const char *text;
+       struct my_menu_item *items;
+};
+
+struct my_menu_item file_menu_items[] = {
+       { TOGGLE_LABEL_NONE, NULL, "Open", open_event, GTK_STOCK_OPEN },
+       { TOGGLE_LABEL_NONE, NULL, "Save", save_event, GTK_STOCK_SAVE },
+       { TOGGLE_LABEL_NONE, NULL, "", dummy_event, NULL },
+       { TOGGLE_LABEL_NONE, NULL, "Exit", exit_event, GTK_STOCK_QUIT },
+       { TOGGLE_LABEL_NONE, NULL, NULL, NULL }
+};
+
+struct my_menu_item edit_menu_items[] = {
+       { TOGGLE_LABEL_NONE, NULL, "Undo", undo_event, GTK_STOCK_UNDO },
+       { TOGGLE_LABEL_NONE, NULL, "Redo", redo_event, GTK_STOCK_REDO },
+       { TOGGLE_LABEL_NONE, NULL, "", dummy_event, NULL },
+       { TOGGLE_LABEL_NONE, NULL, "Copy", copy_event, GTK_STOCK_COPY },
+       { TOGGLE_LABEL_NONE, NULL, "Copy All", copy_all_event, NULL },
+       { TOGGLE_LABEL_NONE, NULL, "Paste", paste_event, GTK_STOCK_PASTE },
+       { TOGGLE_LABEL_NONE, NULL, "", dummy_event, NULL },
+       { TOGGLE_LABEL_NONE, NULL, "Palette", palette_event, NULL },
+       { TOGGLE_LABEL_NONE, NULL, "Bright/Contrast", bc_event, NULL },
+       { TOGGLE_LABEL_NONE, NULL, "Adjust Levels", level_event, NULL },
+#ifdef WITH_OPENCV
+       { TOGGLE_LABEL_NONE, NULL, "Optical Flow", flow_event, NULL },
+#endif
+       { TOGGLE_LABEL_NONE, NULL, "", dummy_event, NULL },
+       { TOGGLE_LABEL_NONE, NULL, "Keyframe", keyframe_event, NULL },
+       { TOGGLE_LABEL_NONE, NULL, "", dummy_event, NULL },
+       { TOGGLE_LABEL_NONE, NULL, "Erase Tool", erase_event, NULL },
+       { TOGGLE_LABEL_NONE, NULL, "Clear", clear_event, GTK_STOCK_CLEAR },
+       { TOGGLE_LABEL_NONE, NULL, "Clear Color", clear_color_event, NULL },
+       { TOGGLE_LABEL_NONE, NULL, NULL, NULL }
+};
+
+struct my_menu_item view_menu_items[] = {
+       { TOGGLE_LABEL_NONE, NULL, "Zoom In", zoom_in_event, GTK_STOCK_ZOOM_IN },
+       { TOGGLE_LABEL_NONE, NULL, "Zoom Out", zoom_out_event, GTK_STOCK_ZOOM_OUT },
+       { TOGGLE_LABEL_NONE, NULL, "Zoom 100", zoom_100_event, GTK_STOCK_ZOOM_100 },
+       { TOGGLE_LABEL_ZOOMFIELDS, NULL, "Zoom Field", zoom_field_event, NULL },
+       { TOGGLE_LABEL_NONE, NULL, "", dummy_event, NULL },
+       { TOGGLE_LABEL_HIGHLIGHT, NULL, "Highlight color", show_highlighted_event, NULL },
+       { TOGGLE_LABEL_PREVIEW, NULL, "Preview color", show_preview_event, NULL },
+       { TOGGLE_LABEL_RENDERED, NULL, "Show colorized", show_colorized_event, NULL },
+#ifdef WITH_OPENCV
+       { TOGGLE_LABEL_FLOWVIEW, NULL, "Show flow", show_flow_event, NULL },
+#endif
+       { TOGGLE_LABEL_NONE, NULL, NULL, NULL }
+};
+
+struct my_menu_item render_menu_items[] = {
+       { TOGGLE_LABEL_NONE, NULL, "Colorize Image", colorize_event, NULL },
+       { TOGGLE_LABEL_NONE, NULL, NULL, NULL }
+};
+
+struct my_menu menus[] = {
+       { "_File", file_menu_items },
+       { "_Edit", edit_menu_items },
+       { "_View", view_menu_items },
+       { "_Render", render_menu_items },
+       { NULL, NULL }
+};
+
+/* create menu bar */
+void create_menus(GtkWidget *menu_bar)
+{
+       GtkWidget *root_menu;
+       GtkWidget *menu;
+       GtkWidget *menu_item;
+       struct my_menu_item *items;
+       int i, j;
+
+       /* create vbox and add menu_bar */
+       for (i = 0; menus[i].text; i++) {
+               /* create menu with items */
+               items = menus[i].items;
+               menu = gtk_menu_new();
+               for (j = 0; items[j].text; j++) {
+                       if (!items[j].text[0])
+                               menu_item = gtk_separator_menu_item_new();
+                       else if (items[j].stock)
+                               menu_item = gtk_image_menu_item_new_from_stock(items[j].stock, NULL);
+                       else if (items[j].label != TOGGLE_LABEL_NONE)
+                               menu_item = gtk_check_menu_item_new_with_label(items[j].text);
+                       else
+                               menu_item = gtk_menu_item_new_with_label(items[j].text);
+                       items[j].widget = menu_item;
+                       gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
+                       g_signal_connect_swapped(menu_item, "activate", G_CALLBACK(items[j].handler), menu_item);
+                       gtk_widget_show(menu_item);
+               }
+               /* create root menu and add to menu_bar */
+               root_menu = gtk_menu_item_new_with_mnemonic(menus[i].text);
+               gtk_widget_show(root_menu);
+               gtk_menu_item_set_submenu(GTK_MENU_ITEM(root_menu), menu);
+               gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), root_menu);
+       }
+
+}
+
+void set_menu_toggel_by_label(enum toggle_label label, gboolean active)
+{
+       struct my_menu_item *items;
+       int i, j;
+
+       for (i = 0; menus[i].text; i++) {
+               items = menus[i].items;
+               for (j = 0; items[j].text; j++) {
+                       if (items[j].label == label)
+                               gtk_check_menu_item_set_active((GtkCheckMenuItem *)items[j].widget, active);
+               }
+       }
+}
diff --git a/gui/menu.h b/gui/menu.h
new file mode 100644 (file)
index 0000000..8a04cc3
--- /dev/null
@@ -0,0 +1,13 @@
+
+void zoom_in_event(gpointer priv);
+void zoom_out_event(gpointer priv);
+void palette_event(gpointer priv);
+void colorize_event(gpointer priv);
+void undo_event(gpointer priv);
+void redo_event(gpointer priv);
+void copy_event(gpointer priv);
+void paste_event(gpointer priv);
+void create_menus(GtkWidget *menu_bar);
+void set_menu_toggel_by_label(enum toggle_label label, gboolean active);
+
+