Moved color model settings and optical flow settings to a single *_settings file
[colorize.git] / gui / diag_level.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 "diag_level.h"
9 #include "../src/mark.h"
10 #include "../src/yuv.h"
11 #include "palette.h"
12 #include "image.h"
13
14 static GtkWidget *level_window = NULL;
15 static GtkObject *black_level_adj;
16 static GtkObject *white_level_adj;
17 static GtkWidget *scale_levels_button;
18 static GtkObject *fade_level_adj;
19 static GtkWidget *yuv_mod_button;
20
21 static void level_destroy(GtkWidget *widget, gpointer priv)
22 {
23         gtk_widget_destroy(level_window);
24         level_window = NULL;
25 }
26
27 static gboolean level_key_press(GtkWidget *widget, GdkEventKey *event, gpointer priv)
28 {
29         switch (event->keyval) {
30         case GDK_q:
31         case GDK_w:
32                 if (event->state & GDK_CONTROL_MASK) {
33                         gtk_widget_destroy(widget);
34                         return TRUE;
35                 }
36         default:
37                 ;//printf("%x\n", event->keyval);
38         }
39
40         return FALSE;
41 }
42
43 static void close_event(gpointer *priv)
44 {
45         gtk_widget_destroy(level_window);
46         level_window = NULL;
47 }
48
49 static void reset_event(gpointer *priv)
50 {
51         int i;
52
53         anything_modified = 1;
54
55         black_level = 0.0;
56         white_level = 1.0;
57         fade_level = 0.2;
58         level_set_current();
59         for (i = 0; i < 255; i++)
60                 update_color(i);
61         if (preview)
62                 draw_image(0, 0, -1, -1);
63 }
64
65 static void apply_event(gpointer *priv)
66 {
67         int i;
68
69         anything_modified = 1;
70
71         black_level = GTK_ADJUSTMENT(black_level_adj)->value / 255.0;
72         white_level = GTK_ADJUSTMENT(white_level_adj)->value / 255.0;
73         scale_levels = GTK_TOGGLE_BUTTON(scale_levels_button)->active;
74         fade_level = GTK_ADJUSTMENT(fade_level_adj)->value / 100.0;
75         yuv_mod = GTK_TOGGLE_BUTTON(yuv_mod_button)->active;
76         update_color(mark_selected);
77         for (i = 0; i < 255; i++)
78                 update_color(i);
79         if (preview)
80                 draw_image(0, 0, -1, -1);
81 }
82
83 static GtkWidget *xpm_label_box( const gchar *stock_id,
84                                  gchar *label_text)
85 {
86         GtkWidget *box;
87         GtkWidget *label;
88         GtkWidget *image;
89
90         /* Create box for image and label */
91         box = gtk_hbox_new (FALSE, 0);
92         gtk_container_set_border_width (GTK_CONTAINER (box), 4);
93
94         /* Now on to the image stuff */
95         image = gtk_image_new_from_stock(stock_id, -1);
96
97         /* Create a label for the button */
98         label = gtk_label_new (label_text);
99
100         /* Pack the image and label into the box */
101         gtk_box_pack_start (GTK_BOX (box), image, FALSE, FALSE, 3);
102         gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 3);
103
104         gtk_widget_show (image);
105         gtk_widget_show (label);
106
107         return box;
108 }
109
110 void level_event(gpointer priv)
111 {
112         GtkWidget *vbox, *hbox;
113         GtkWidget *menu_bar;
114         GtkWidget *root_menu;
115         GtkWidget *menu;
116         GtkWidget *menu_item;
117         GtkWidget *black_level_label;
118         GtkWidget *white_level_label;
119         GtkWidget *fade_level_label;
120         GtkWidget *black_level_scroll;
121         GtkWidget *white_level_scroll;
122         GtkWidget *scale_levels_label;
123         GtkWidget *fade_level_scroll;
124         GtkWidget *yuv_mod_label;
125         GtkWidget *button_apply;
126         GtkWidget *button_reset;
127         GtkWidget *box;
128
129         if (level_window) {
130                 gtk_widget_destroy(level_window);
131                 level_window = NULL;
132                 return;
133         }
134
135         /* create window */
136         level_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
137         gtk_window_set_default_size(GTK_WINDOW(level_window), 500, 0);
138         gtk_window_set_title(GTK_WINDOW(level_window), "Black Level");
139         g_signal_connect(level_window, "destroy", G_CALLBACK(level_destroy), level_window);
140         g_signal_connect(level_window, "key_press_event", G_CALLBACK(level_key_press), level_window);
141
142         /* create menu*/
143         menu_bar = gtk_menu_bar_new();
144         gtk_widget_show(menu_bar);
145         menu = gtk_menu_new();
146         root_menu = gtk_menu_item_new_with_mnemonic("_File");
147         gtk_widget_show(root_menu);
148
149         menu_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_CLOSE, NULL);
150         gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
151         g_signal_connect_swapped(menu_item, "activate", G_CALLBACK(close_event), level_window);
152         gtk_widget_show(menu_item);
153         gtk_menu_item_set_submenu(GTK_MENU_ITEM(root_menu), menu);
154         gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), root_menu);
155
156         /* create scale widgets */
157         black_level_label = gtk_label_new("Black Level:"); 
158         gtk_widget_show(GTK_WIDGET(black_level_label));
159         black_level_adj = gtk_adjustment_new(black_level * 255, 0, 256, 1, 1, 1);
160         black_level_scroll = gtk_hscale_new(GTK_ADJUSTMENT(black_level_adj));
161         gtk_widget_show(black_level_scroll);
162
163         white_level_label = gtk_label_new("White Level:"); 
164         gtk_widget_show(GTK_WIDGET(white_level_label));
165         white_level_adj = gtk_adjustment_new(white_level * 255, 0, 256, 1, 1, 1);
166         white_level_scroll = gtk_hscale_new(GTK_ADJUSTMENT(white_level_adj));
167         gtk_widget_show(white_level_scroll);
168
169         scale_levels_label = gtk_label_new("Scale levels:"); 
170         gtk_widget_show(GTK_WIDGET(scale_levels_label));
171         scale_levels_button = gtk_check_button_new();
172         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(scale_levels_button), scale_levels ? TRUE : FALSE);
173 //      g_signal_connect(scale_levels_button, "toggled", G_CALLBACK(scale_levels_event), NULL);
174         gtk_widget_show(scale_levels_button);
175
176         fade_level_label = gtk_label_new("Fade Level (%):"); 
177         gtk_widget_show(GTK_WIDGET(fade_level_label));
178         fade_level_adj = gtk_adjustment_new(fade_level * 100, 0, 101, 1, 1, 1);
179         fade_level_scroll = gtk_hscale_new(GTK_ADJUSTMENT(fade_level_adj));
180         gtk_widget_show(fade_level_scroll);
181
182         yuv_mod_label = gtk_label_new("Use modified YUV:"); 
183         gtk_widget_show(GTK_WIDGET(yuv_mod_label));
184         yuv_mod_button = gtk_check_button_new();
185         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(yuv_mod_button), yuv_mod ? TRUE : FALSE);
186 //      g_signal_connect(yuv_mod_button, "toggled", G_CALLBACK(yuv_mod_event), NULL);
187         gtk_widget_show(yuv_mod_button);
188
189         /* buttons */
190         button_reset = gtk_button_new();
191         g_signal_connect(button_reset, "clicked", G_CALLBACK(reset_event), NULL);
192         box = xpm_label_box (GTK_STOCK_REMOVE, "Reset");
193         gtk_widget_show (box);
194         gtk_container_add (GTK_CONTAINER (button_reset), box);
195         gtk_widget_show(button_reset);
196
197         button_apply = gtk_button_new();
198         g_signal_connect(button_apply, "clicked", G_CALLBACK(apply_event), NULL);
199         box = xpm_label_box (GTK_STOCK_APPLY, "Apply");
200         gtk_widget_show (box);
201         gtk_container_add (GTK_CONTAINER (button_apply), box);
202         gtk_widget_show(button_apply);
203
204         hbox = gtk_hbox_new(FALSE, 0);
205         gtk_box_pack_end(GTK_BOX(hbox), button_apply, FALSE, FALSE, 2);
206         gtk_box_pack_end(GTK_BOX(hbox), button_reset, FALSE, FALSE, 2);
207         gtk_widget_show(hbox);
208
209         /* create vbox (complete window) */
210         vbox = gtk_vbox_new(FALSE, 0);
211         gtk_box_pack_start(GTK_BOX(vbox), menu_bar, FALSE, FALSE, 2);
212         gtk_box_pack_start(GTK_BOX(vbox), black_level_label, FALSE, FALSE, 2);
213         gtk_box_pack_start(GTK_BOX(vbox), black_level_scroll, FALSE, FALSE, 2);
214         gtk_box_pack_start(GTK_BOX(vbox), white_level_label, FALSE, FALSE, 2);
215         gtk_box_pack_start(GTK_BOX(vbox), white_level_scroll, FALSE, FALSE, 2);
216         gtk_box_pack_start(GTK_BOX(vbox), scale_levels_label, FALSE, FALSE, 2);
217         gtk_box_pack_start(GTK_BOX(vbox), scale_levels_button, FALSE, FALSE, 2);
218         gtk_box_pack_start(GTK_BOX(vbox), fade_level_label, FALSE, FALSE, 2);
219         gtk_box_pack_start(GTK_BOX(vbox), fade_level_scroll, FALSE, FALSE, 2);
220         gtk_box_pack_start(GTK_BOX(vbox), yuv_mod_label, FALSE, FALSE, 2);
221         gtk_box_pack_start(GTK_BOX(vbox), yuv_mod_button, FALSE, FALSE, 2);
222         gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 20);
223         gtk_widget_show(vbox);
224
225         gtk_container_add(GTK_CONTAINER(level_window), vbox);
226         gtk_widget_show(level_window);
227 }
228
229 void level_set_current(void)
230 {
231         if (!level_window)
232                 return;
233
234         gtk_adjustment_set_value(GTK_ADJUSTMENT(black_level_adj), black_level * 255);
235         gtk_adjustment_set_value(GTK_ADJUSTMENT(white_level_adj), white_level * 255);
236         gtk_adjustment_set_value(GTK_ADJUSTMENT(fade_level_adj), fade_level * 100);
237 }
238
239