2fa7e87cf8e3fb0de4b6f98476e350ae3f92b281
[colorize.git] / gui / 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 "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 GtkObject *fade_level_adj;
18
19 static void level_destroy(GtkWidget *widget, gpointer priv)
20 {
21         gtk_widget_destroy(level_window);
22         level_window = NULL;
23 }
24
25 static gboolean level_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(level_window);
44         level_window = NULL;
45 }
46
47 static void reset_event(gpointer *priv)
48 {
49         int i;
50
51         anything_modified = 1;
52
53         black_level = 0.0;
54         white_level = 1.0;
55         fade_level = 0.2;
56         level_set_current();
57         for (i = 0; i < 255; i++)
58                 update_color(i);
59         if (preview)
60                 draw_image(0, 0, -1, -1);
61 }
62
63 static void apply_event(gpointer *priv)
64 {
65         int i;
66
67         anything_modified = 1;
68
69         black_level = GTK_ADJUSTMENT(black_level_adj)->value / 255.0;
70         white_level = GTK_ADJUSTMENT(white_level_adj)->value / 255.0;
71         fade_level = GTK_ADJUSTMENT(fade_level_adj)->value / 100.0;
72         update_color(mark_selected);
73         for (i = 0; i < 255; i++)
74                 update_color(i);
75         if (preview)
76                 draw_image(0, 0, -1, -1);
77 }
78
79 static GtkWidget *xpm_label_box( const gchar *stock_id,
80                                  gchar *label_text)
81 {
82         GtkWidget *box;
83         GtkWidget *label;
84         GtkWidget *image;
85
86         /* Create box for image and label */
87         box = gtk_hbox_new (FALSE, 0);
88         gtk_container_set_border_width (GTK_CONTAINER (box), 4);
89
90         /* Now on to the image stuff */
91         image = gtk_image_new_from_stock(stock_id, -1);
92
93         /* Create a label for the button */
94         label = gtk_label_new (label_text);
95
96         /* Pack the image and label into the box */
97         gtk_box_pack_start (GTK_BOX (box), image, FALSE, FALSE, 3);
98         gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 3);
99
100         gtk_widget_show (image);
101         gtk_widget_show (label);
102
103         return box;
104 }
105
106 void level_event(gpointer priv)
107 {
108         GtkWidget *vbox, *hbox;
109         GtkWidget *menu_bar;
110         GtkWidget *root_menu;
111         GtkWidget *menu;
112         GtkWidget *menu_item;
113         GtkWidget *black_level_label;
114         GtkWidget *white_level_label;
115         GtkWidget *fade_level_label;
116         GtkWidget *black_level_scroll;
117         GtkWidget *white_level_scroll;
118         GtkWidget *fade_level_scroll;
119         GtkWidget *button_apply;
120         GtkWidget *button_reset;
121         GtkWidget *box;
122
123         if (level_window) {
124                 gtk_widget_destroy(level_window);
125                 level_window = NULL;
126                 return;
127         }
128
129         /* create window */
130         level_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
131         gtk_window_set_default_size(GTK_WINDOW(level_window), 500, 0);
132         gtk_window_set_title(GTK_WINDOW(level_window), "Black Level");
133         g_signal_connect(level_window, "destroy", G_CALLBACK(level_destroy), level_window);
134         g_signal_connect(level_window, "key_press_event", G_CALLBACK(level_key_press), level_window);
135
136         /* create menu*/
137         menu_bar = gtk_menu_bar_new();
138         gtk_widget_show(menu_bar);
139         menu = gtk_menu_new();
140         root_menu = gtk_menu_item_new_with_mnemonic("_File");
141         gtk_widget_show(root_menu);
142
143         menu_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_CLOSE, NULL);
144         gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
145         g_signal_connect_swapped(menu_item, "activate", G_CALLBACK(close_event), level_window);
146         gtk_widget_show(menu_item);
147         gtk_menu_item_set_submenu(GTK_MENU_ITEM(root_menu), menu);
148         gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), root_menu);
149
150         /* create scale widgets */
151         black_level_label = gtk_label_new("Black Level:"); 
152         gtk_widget_show(GTK_WIDGET(black_level_label));
153         black_level_adj = gtk_adjustment_new(black_level * 255, 0, 256, 1, 1, 1);
154         black_level_scroll = gtk_hscale_new(GTK_ADJUSTMENT(black_level_adj));
155         gtk_widget_show(black_level_scroll);
156
157         white_level_label = gtk_label_new("White Level:"); 
158         gtk_widget_show(GTK_WIDGET(white_level_label));
159         white_level_adj = gtk_adjustment_new(white_level * 255, 0, 256, 1, 1, 1);
160         white_level_scroll = gtk_hscale_new(GTK_ADJUSTMENT(white_level_adj));
161         gtk_widget_show(white_level_scroll);
162
163         fade_level_label = gtk_label_new("Fade Level (%):"); 
164         gtk_widget_show(GTK_WIDGET(fade_level_label));
165         fade_level_adj = gtk_adjustment_new(fade_level * 100, 0, 101, 1, 1, 1);
166         fade_level_scroll = gtk_hscale_new(GTK_ADJUSTMENT(fade_level_adj));
167         gtk_widget_show(fade_level_scroll);
168
169         /* buttons */
170         button_reset = gtk_button_new();
171         g_signal_connect(button_reset, "clicked", G_CALLBACK(reset_event), NULL);
172         box = xpm_label_box (GTK_STOCK_REMOVE, "Reset");
173         gtk_widget_show (box);
174         gtk_container_add (GTK_CONTAINER (button_reset), box);
175         gtk_widget_show(button_reset);
176
177         button_apply = gtk_button_new();
178         g_signal_connect(button_apply, "clicked", G_CALLBACK(apply_event), NULL);
179         box = xpm_label_box (GTK_STOCK_APPLY, "Apply");
180         gtk_widget_show (box);
181         gtk_container_add (GTK_CONTAINER (button_apply), box);
182         gtk_widget_show(button_apply);
183
184         hbox = gtk_hbox_new(FALSE, 0);
185         gtk_box_pack_end(GTK_BOX(hbox), button_apply, FALSE, FALSE, 2);
186         gtk_box_pack_end(GTK_BOX(hbox), button_reset, FALSE, FALSE, 2);
187         gtk_widget_show(hbox);
188
189         /* create vbox (complete window) */
190         vbox = gtk_vbox_new(FALSE, 0);
191         gtk_box_pack_start(GTK_BOX(vbox), menu_bar, FALSE, FALSE, 2);
192         gtk_box_pack_start(GTK_BOX(vbox), black_level_label, FALSE, FALSE, 2);
193         gtk_box_pack_start(GTK_BOX(vbox), black_level_scroll, FALSE, FALSE, 2);
194         gtk_box_pack_start(GTK_BOX(vbox), white_level_label, FALSE, FALSE, 2);
195         gtk_box_pack_start(GTK_BOX(vbox), white_level_scroll, FALSE, FALSE, 2);
196         gtk_box_pack_start(GTK_BOX(vbox), fade_level_label, FALSE, FALSE, 2);
197         gtk_box_pack_start(GTK_BOX(vbox), fade_level_scroll, FALSE, FALSE, 2);
198         gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 20);
199         gtk_widget_show(vbox);
200
201         gtk_container_add(GTK_CONTAINER(level_window), vbox);
202         gtk_widget_show(level_window);
203 }
204
205 void level_set_current(void)
206 {
207         if (!level_window)
208                 return;
209
210         gtk_adjustment_set_value(GTK_ADJUSTMENT(black_level_adj), black_level * 255);
211         gtk_adjustment_set_value(GTK_ADJUSTMENT(white_level_adj), white_level * 255);
212         gtk_adjustment_set_value(GTK_ADJUSTMENT(fade_level_adj), fade_level * 100);
213 }
214
215