0.8.0
[geeqie.git] / src / utildlg.c
1 /*
2  * GQview image viewer
3  * (C)2000 John Ellis
4  *
5  * Author: John Ellis
6  *
7  */
8
9 #include "gqview.h"
10 #include "image.h"
11
12 static void warning_dialog_close(GtkWidget *w, gpointer data);
13 static void warning_dialog_destroy(GtkWidget *w, GdkEvent *event, gpointer data);
14
15 static void confirm_dialog_click_cb(GtkWidget *w, gpointer data);
16 static void confirm_dialog_delete_cb(GtkWidget *w, GdkEvent *event, gpointer data);
17
18 static void generic_dialog_delete_cb(GtkWidget *widget, GdkEvent *event, gpointer data);
19
20
21 /*
22  *-----------------------------------------------------------------------------
23  * warning dialog routines
24  *-----------------------------------------------------------------------------
25  */ 
26
27 static void warning_dialog_close(GtkWidget *w, gpointer data)
28 {
29         GtkWidget *warning_window = data;
30         gtk_widget_destroy(warning_window);
31 }
32
33 static void warning_dialog_destroy(GtkWidget *w, GdkEvent *event, gpointer data)
34 {
35         warning_dialog_close(NULL, data);
36 }
37
38 void warning_dialog(gchar *title, gchar *message)
39 {
40         GtkWidget *warning_window;
41         GtkWidget *hbox;
42         GtkWidget *vbox;
43         GtkWidget *label;
44         GtkWidget *button;
45
46         warning_window = gtk_window_new(GTK_WINDOW_DIALOG);
47         gtk_signal_connect (GTK_OBJECT (warning_window), "delete_event",(GtkSignalFunc) warning_dialog_destroy, warning_window);
48         gtk_window_set_policy (GTK_WINDOW(warning_window), FALSE, FALSE, TRUE);
49         gtk_window_set_title (GTK_WINDOW (warning_window), title);
50         gtk_container_border_width (GTK_CONTAINER (warning_window), 10);
51
52         vbox = gtk_vbox_new(FALSE, 5);
53         gtk_container_add(GTK_CONTAINER(warning_window),vbox);
54         gtk_widget_show(vbox);
55
56         label = gtk_label_new(message);
57         gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0);
58         gtk_widget_show(label);
59
60         label = gtk_hseparator_new();
61         gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0);
62         gtk_widget_show(label);
63
64         hbox = gtk_hbox_new(TRUE, 5);
65         gtk_container_add(GTK_CONTAINER(vbox),hbox);
66         gtk_widget_show(hbox);
67
68         button = gtk_button_new_with_label(_("     Ok     "));
69         gtk_signal_connect (GTK_OBJECT (button), "clicked",(GtkSignalFunc) warning_dialog_close, warning_window);
70         gtk_box_pack_start(GTK_BOX(hbox),button,FALSE,FALSE,0);
71         gtk_widget_show(button);
72         
73         gtk_widget_show(warning_window);
74 }
75
76 /*
77  *-----------------------------------------------------------------------------
78  * confirmation dialog
79  *-----------------------------------------------------------------------------
80  */ 
81
82 static void confirm_dialog_click_cb(GtkWidget *w, gpointer data)
83 {
84         ConfirmDialog *cd = data;
85         gtk_widget_destroy(cd->dialog);
86         g_free(cd);
87 }
88
89 static void confirm_dialog_delete_cb(GtkWidget *w, GdkEvent *event, gpointer data)
90 {
91         ConfirmDialog *cd = data;
92         cd->cancel_cb(NULL, cd->data);
93         confirm_dialog_click_cb(w, data);
94 }
95
96 void confirm_dialog_add(ConfirmDialog *cd, gchar *text, void (*func_cb)(GtkWidget *, gpointer))
97 {
98         GtkWidget *button;
99         button = gtk_button_new_with_label(text);
100         gtk_signal_connect(GTK_OBJECT(button), "clicked", func_cb, cd->data);
101         gtk_signal_connect(GTK_OBJECT(button), "clicked", confirm_dialog_click_cb, cd);
102         gtk_box_pack_end(GTK_BOX(cd->hbox), button, TRUE, TRUE, 0);
103         gtk_widget_grab_focus(button);
104         gtk_widget_show(button);
105 }
106
107 ConfirmDialog *confirm_dialog_new(gchar *title, gchar *message, void (*cancel_cb)(GtkWidget *, gpointer), gpointer data)
108 {
109         ConfirmDialog *cd;
110         GtkWidget *vbox;
111         GtkWidget *label;
112
113         cd = g_new0(ConfirmDialog, 1);
114         cd->data = data;
115         cd->cancel_cb = cancel_cb;
116
117         cd->dialog = gtk_window_new(GTK_WINDOW_DIALOG);
118         gtk_signal_connect (GTK_OBJECT (cd->dialog), "delete_event", confirm_dialog_delete_cb, cd);
119         gtk_window_set_policy (GTK_WINDOW(cd->dialog), FALSE, FALSE, TRUE);
120         gtk_window_set_title (GTK_WINDOW (cd->dialog), title);
121         gtk_container_border_width (GTK_CONTAINER (cd->dialog), 10);
122
123         vbox = gtk_vbox_new(FALSE, 15);
124         gtk_container_add(GTK_CONTAINER(cd->dialog),vbox);
125         gtk_widget_show(vbox);
126
127         label = gtk_label_new(message);
128         gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0);
129         gtk_widget_show(label);
130
131         cd->util_hbox = gtk_hbox_new(FALSE, 0);
132         gtk_box_pack_start(GTK_BOX(vbox), cd->util_hbox, TRUE, TRUE, 0);
133         gtk_widget_show(cd->util_hbox);
134
135         label = gtk_hseparator_new();
136         gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
137         gtk_widget_show(label);
138
139         cd->hbox = gtk_hbox_new(TRUE, 15);
140         gtk_box_pack_start(GTK_BOX(vbox), cd->hbox, FALSE, FALSE, 0);
141         gtk_widget_show(cd->hbox);
142
143         gtk_widget_show(cd->dialog);
144
145         confirm_dialog_add(cd, _("Cancel"), cd->cancel_cb);
146         
147         return cd;
148 }
149
150 ConfirmDialog *confirm_dialog_new_with_image(gchar *title, gchar *message,
151                                              gchar *img_path1, gchar *img_path2,
152                                              void (*cancel_cb)(GtkWidget *, gpointer), gpointer data)
153 {
154         ConfirmDialog *cd;
155         GtkWidget *vbox;
156         GtkWidget *label;
157         ImageWindow *image1;
158         ImageWindow *image2;
159
160         cd = confirm_dialog_new(title, message, cancel_cb, data);
161
162         gtk_widget_set_usize (cd->dialog, 600, 450);
163         gtk_window_set_policy (GTK_WINDOW(cd->dialog), FALSE, TRUE, FALSE);
164
165         gtk_box_set_homogeneous(GTK_BOX(cd->util_hbox), TRUE);
166
167         if (img_path1)
168                 {
169                 vbox = gtk_vbox_new(FALSE, 5);
170                 gtk_box_pack_start(GTK_BOX(cd->util_hbox), vbox, TRUE, TRUE, 0);
171                 gtk_widget_show(vbox);
172
173                 image1 = image_area_new(NULL);
174                 gtk_box_pack_start(GTK_BOX(vbox), image1->eventbox, TRUE, TRUE, 0);
175                 image_area_set_image (image1, img_path1, ZOOM_RESET_ORIGINAL);
176                 gtk_widget_show_all(image1->eventbox);
177                 gtk_object_set_data_full(GTK_OBJECT(image1->eventbox), "image1", image1,
178                                          (GtkDestroyNotify)image_area_free);
179
180                 label = gtk_label_new(img_path1);
181                 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
182                 gtk_widget_show(label);
183                 }
184
185         if (img_path2)
186                 {
187                 vbox = gtk_vbox_new(FALSE, 5);
188                 gtk_box_pack_start(GTK_BOX(cd->util_hbox), vbox, TRUE, TRUE, 0);
189                 gtk_widget_show(vbox);
190
191                 image2 = image_area_new(NULL);
192                 gtk_box_pack_start(GTK_BOX(vbox), image2->eventbox, TRUE, TRUE, 0);
193                 image_area_set_image (image2, img_path2, ZOOM_RESET_ORIGINAL);
194                 gtk_widget_show_all(image2->eventbox);
195                 gtk_object_set_data_full(GTK_OBJECT(image2->eventbox), "image2", image2,
196                                          (GtkDestroyNotify)image_area_free);
197
198                 label = gtk_label_new(img_path2);
199                 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
200                 gtk_widget_show(label);
201                 }
202
203         return cd;
204 }
205
206 /*
207  *-----------------------------------------------------------------------------
208  * generic file ops dialog routines
209  *-----------------------------------------------------------------------------
210  */ 
211
212 void generic_dialog_close(GtkWidget *widget, gpointer data)
213 {
214         FileDialog *fd = data;
215         if(fd->dialog) gtk_widget_destroy(fd->dialog);
216         g_free(fd->source_path);
217         g_free(fd->dest_path);
218         if (fd->source_list) free_selected_list(fd->source_list);
219         g_free(fd);
220 }
221
222 static void generic_dialog_delete_cb(GtkWidget *widget, GdkEvent *event, gpointer data)
223 {
224         generic_dialog_close(NULL, data);
225 }
226
227 FileDialog *generic_dialog_new(gchar *title, gchar *text, gchar *btn1, gchar *btn2,
228                 void (*btn1_cb)(GtkWidget *, gpointer),
229                 void (*btn2_cb)(GtkWidget *, gpointer))
230 {
231         FileDialog *fd = NULL;
232         GtkWidget *button;
233         GtkWidget *hbox;
234         GtkWidget *label;
235
236         fd = g_new0(FileDialog, 1);
237
238         fd->dialog = gtk_window_new(GTK_WINDOW_DIALOG);
239         gtk_signal_connect (GTK_OBJECT (fd->dialog), "delete_event", (GtkSignalFunc)generic_dialog_delete_cb, fd);
240         gtk_window_set_policy (GTK_WINDOW(fd->dialog), FALSE, TRUE, FALSE);
241         gtk_window_set_title (GTK_WINDOW (fd->dialog), title);
242         gtk_container_border_width (GTK_CONTAINER (fd->dialog), 10);
243
244         fd->vbox = gtk_vbox_new(FALSE,5);
245         gtk_container_add (GTK_CONTAINER(fd->dialog), fd->vbox);
246         gtk_widget_show(fd->vbox);
247
248         if (text)
249                 {
250                 label = gtk_label_new(text);
251                 gtk_box_pack_start(GTK_BOX(fd->vbox), label, FALSE, FALSE, 0);
252                 gtk_widget_show(label);
253                 }
254         
255         if (btn1_cb || btn2_cb)
256                 {
257                 GtkWidget *sep;
258                 hbox = gtk_hbox_new(TRUE, 15);
259                 gtk_box_pack_end(GTK_BOX(fd->vbox), hbox, FALSE, FALSE, 5);
260                 gtk_widget_show(hbox);
261
262                 sep = gtk_hseparator_new();
263                 gtk_box_pack_end(GTK_BOX(fd->vbox), sep, FALSE, FALSE, 0);
264                 gtk_widget_show(sep);
265                 }
266
267         if (btn1_cb)
268                 {
269                 button = gtk_button_new_with_label(btn1);
270                 gtk_signal_connect (GTK_OBJECT (button), "clicked",(GtkSignalFunc) btn1_cb, fd);
271                 gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
272                 gtk_widget_grab_focus(button);
273                 gtk_widget_show(button);
274                 }
275
276         if (btn2_cb)
277                 {
278                 button = gtk_button_new_with_label(btn2);
279                 gtk_signal_connect (GTK_OBJECT (button), "clicked",(GtkSignalFunc) btn2_cb, fd);
280                 gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
281                 gtk_widget_show(button);
282                 }
283
284         gtk_widget_show(fd->dialog);
285         return fd;
286 }
287