38 #include "widgets_helper.h"
40 static guint _wh_add_row_to_table();
41 static GtkWidget *_wh_put_in_new_hbox_with_margin(GtkWidget *widget, gint margin);
42 static void _wh_attach_to_table(GtkWidget *table, GtkWidget *widget,
43 guint start_column, guint end_column, guint row,
int expand);
44 static void _wh_add_in_table_with_label(GtkWidget *table,
const gchar *label_text,
45 GtkWidget *widget,
int expand);
46 static void hide_window_from_button(GtkWidget *window, gpointer data);
59 GtkWidget *vbox = wh_vbox_new();
61 GtkWidget *label = gtk_label_new(NULL);
62 gtk_label_set_markup(GTK_LABEL(label), title);
64 GtkWidget *label_hbox = wh_hbox_new();
65 gtk_box_pack_start(GTK_BOX(label_hbox), label, FALSE, FALSE, 0);
66 gtk_box_pack_start(GTK_BOX(vbox), label_hbox, FALSE, FALSE, 5);
68 GtkWidget *hbox = wh_hbox_new();
69 gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 16);
71 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
76 GtkWidget *wh_new_table()
78 GtkWidget *table = gtk_table_new(1, 2, FALSE);
79 gtk_table_set_col_spacing(GTK_TABLE(table), 0, 0);
80 gtk_table_set_col_spacing(GTK_TABLE(table), 1, 5);
84 void wh_add_in_table(GtkWidget *table, GtkWidget *widget)
86 guint last_row = _wh_add_row_to_table(table);
88 _wh_attach_to_table(table, widget, 1, 3, last_row, TRUE);
91 void wh_add_in_table_with_label_expand(GtkWidget *table,
const gchar *label_text, GtkWidget *widget)
93 _wh_add_in_table_with_label(table, label_text, widget, TRUE);
96 void wh_add_in_table_with_label(GtkWidget *table,
const gchar *label_text, GtkWidget *widget)
98 _wh_add_in_table_with_label(table, label_text, widget, FALSE);
101 GtkWidget *wh_put_in_new_hbox_with_margin_level(GtkWidget *widget, gint margin_level)
103 return _wh_put_in_new_hbox_with_margin(widget, 6 * margin_level);
106 void wh_put_in_hbox_and_attach_to_vbox(GtkWidget *widget, GtkWidget *vbox, gint vertical_margin)
108 wh_put_in_hbox_and_attach_to_vbox_with_bottom_margin(widget, vbox, vertical_margin, -1);
111 void wh_put_in_hbox_and_attach_to_vbox_with_bottom_margin(GtkWidget *widget, GtkWidget *vbox,
112 gint vertical_margin, gint bottom_margin)
114 GtkWidget *hbox = wh_hbox_new();
115 gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0);
116 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, vertical_margin);
118 if (bottom_margin > 0)
120 GtkWidget *fake_hbox = wh_hbox_new();
121 gtk_box_pack_start(GTK_BOX(vbox), fake_hbox, FALSE, FALSE, bottom_margin);
125 GtkWidget *wh_new_entry(gpointer callback,
ui_state *ui)
127 GtkWidget *entry = gtk_entry_new();
128 gtk_editable_set_editable(GTK_EDITABLE(entry), TRUE);
132 g_signal_connect(G_OBJECT(entry),
"changed", G_CALLBACK(callback), ui);
138 GtkWidget *wh_new_button(
const gchar *button_label)
140 return gtk_button_new_with_mnemonic(button_label);
143 void wh_get_widget_size(GtkWidget *widget, gint *width, gint *height)
145 #if GTK_MAJOR_VERSION <= 2
146 GtkAllocation allocation;
147 gtk_widget_get_allocation(widget, &allocation);
151 *width = allocation.width;
156 *height= allocation.height;
161 *width = gtk_widget_get_allocated_width(widget);
166 *height = gtk_widget_get_allocated_height(widget);
171 GtkWidget *wh_create_int_spinner_in_box_with_top_width(gchar *before_label, gchar *after_label,
172 gdouble initial_value,
173 gdouble minimum_value, gdouble maximum_value,
174 gdouble step_increment, gdouble page_increment,
175 gchar *after_newline_label,
176 void (*spinner_callback)(GtkWidget *spinner,
ui_state *ui),
177 ui_state *ui, GtkWidget *box, gint top_width)
179 GtkWidget *horiz_fake = wh_hbox_new();
180 GtkWidget *label = gtk_label_new(before_label);
181 gtk_box_pack_start(GTK_BOX(horiz_fake), label, FALSE, FALSE, 0);
183 GtkAdjustment *adj = (GtkAdjustment *)
184 gtk_adjustment_new(initial_value, minimum_value, maximum_value, step_increment, page_increment, 0.0);
186 GtkWidget *spinner = gtk_spin_button_new(adj, 0, 0);
188 gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(spinner), TRUE);
189 g_signal_connect(G_OBJECT(spinner),
"value_changed", G_CALLBACK(spinner_callback), ui);
190 gtk_box_pack_start(GTK_BOX(horiz_fake), spinner, FALSE, FALSE, 5);
192 if (after_label != NULL)
194 gtk_box_pack_start(GTK_BOX(horiz_fake), gtk_label_new(after_label), FALSE, FALSE, 3);
197 GtkWidget *fake = wh_hbox_new();
198 gtk_box_pack_start(GTK_BOX(box), fake, FALSE, FALSE, top_width);
200 gtk_box_pack_start(GTK_BOX(box), horiz_fake, FALSE, FALSE, 1);
202 if (after_newline_label != NULL)
204 horiz_fake = wh_hbox_new();
205 gtk_box_pack_start(GTK_BOX(horiz_fake), gtk_label_new(after_newline_label), FALSE, FALSE, 0);
206 gtk_box_pack_start(GTK_BOX(box), horiz_fake, FALSE, FALSE, 2);
209 fake = wh_hbox_new();
210 gtk_box_pack_start(GTK_BOX(box), fake, FALSE, FALSE, 2);
215 GtkWidget *wh_create_int_spinner_in_box(gchar *before_label, gchar *after_label,
216 gdouble initial_value,
217 gdouble minimum_value, gdouble maximum_value,
218 gdouble step_increment, gdouble page_increment,
219 gchar *after_newline_label,
220 void (*spinner_callback)(GtkWidget *spinner,
ui_state *ui),
224 return wh_create_int_spinner_in_box_with_top_width(before_label, after_label,
225 initial_value, minimum_value, maximum_value, step_increment, page_increment,
226 after_newline_label, spinner_callback, ui, box, 2);
229 GtkWidget *wh_hbox_new()
231 #if GTK_MAJOR_VERSION <= 2
232 return gtk_hbox_new(FALSE, 0);
234 GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
235 gtk_box_set_homogeneous(GTK_BOX(hbox), FALSE);
240 GtkWidget *wh_vbox_new()
242 #if GTK_MAJOR_VERSION <= 2
243 return gtk_vbox_new(FALSE, 0);
245 GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
246 gtk_box_set_homogeneous(GTK_BOX(vbox), FALSE);
251 GtkWidget *wh_hscale_new(GtkAdjustment *adjustment)
253 #if GTK_MAJOR_VERSION <= 2
254 return gtk_hscale_new(adjustment);
256 return gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, adjustment);
260 GtkWidget *wh_hscale_new_with_range(gdouble min, gdouble max, gdouble step)
262 #if GTK_MAJOR_VERSION <= 2
263 return gtk_hscale_new_with_range(min, max, step);
265 return gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, min, max, step);
269 void wh_get_pointer(GdkEventMotion *event, gint *x, gint *y, GdkModifierType *state)
271 #if GTK_MAJOR_VERSION <= 2
272 gdk_window_get_pointer(event->window, x, y, state);
274 gdk_window_get_device_position(event->window, event->device, x, y, state);
281 GtkWidget *scrolled_window = gtk_scrolled_window_new (NULL, NULL);
282 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_NONE);
283 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
284 GTK_POLICY_AUTOMATIC,
285 GTK_POLICY_AUTOMATIC);
286 return scrolled_window;
297 GList *children = gtk_container_get_children(GTK_CONTAINER(container));
299 GtkWidget *child = NULL;
300 while ((child = g_list_nth_data(children, i)) != NULL)
302 if (child == my_child)
312 void wh_set_image_on_button(GtkButton *button, GtkWidget *image)
314 gtk_button_set_image(button, image);
317 static void _wh_folder_changed_event(GtkFileChooser *chooser,
ui_state *ui)
319 ui_set_browser_directory(ui, gtk_file_chooser_get_current_folder(chooser));
322 void wh_set_browser_directory_handler(
ui_state *ui, GtkWidget* dialog)
324 const gchar *browser_dir = ui_get_browser_directory(ui);
327 gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), browser_dir);
330 g_signal_connect(GTK_FILE_CHOOSER(dialog),
"current-folder-changed",
331 G_CALLBACK(_wh_folder_changed_event), ui);
344 GtkWidget *box = wh_hbox_new();
345 gtk_container_set_border_width(GTK_CONTAINER(box), 0);
347 GtkWidget *image = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_MENU);
348 gtk_box_pack_start(GTK_BOX(box), image, FALSE, FALSE, 0);
350 if (label_text != NULL)
352 GtkWidget *label = gtk_label_new(label_text);
353 gtk_label_set_text_with_mnemonic(GTK_LABEL(label),label_text);
354 gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 3);
360 button = gtk_toggle_button_new();
364 button = gtk_button_new();
367 gtk_container_add(GTK_CONTAINER(button), box);
372 GtkWidget *wh_create_cool_label(gchar *stock_id, gchar *label_text)
374 GtkWidget *box = wh_hbox_new();
375 gtk_container_set_border_width(GTK_CONTAINER(box), 0);
377 GtkWidget *image = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_MENU);
378 gtk_box_pack_start(GTK_BOX(box), image, FALSE, FALSE, 0);
380 if (label_text != NULL)
382 GtkWidget *label = gtk_label_new(label_text);
383 gtk_label_set_text_with_mnemonic(GTK_LABEL(label),label_text);
384 gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 3);
387 gtk_widget_show_all(box);
392 GtkWidget *wh_create_window_with_close_button(gchar *title, gint width, gint height,
393 GtkWindowPosition position, GtkWindow *parent_window,
394 GtkWidget *main_area_widget, GtkWidget *bottom_widget, ...)
396 GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
397 g_signal_connect(G_OBJECT(window),
"delete_event",
398 G_CALLBACK(gtk_widget_hide_on_delete), window);
399 gtk_window_set_title(GTK_WINDOW(window), title);
400 gtk_window_set_destroy_with_parent(GTK_WINDOW(window), TRUE);
401 gtk_window_set_default_size(GTK_WINDOW(window), width, height);
402 gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
404 GtkWidget *vbox = wh_vbox_new();
405 gtk_container_set_border_width(GTK_CONTAINER(vbox), 4);
406 gtk_container_add(GTK_CONTAINER(window), vbox);
407 gtk_box_pack_start(GTK_BOX(vbox), main_area_widget, TRUE, TRUE, 2);
409 GtkWidget *bottom_hbox = wh_hbox_new();
410 gtk_box_pack_start(GTK_BOX(vbox), bottom_hbox, FALSE, FALSE, 3);
413 va_start(ap, bottom_widget);
414 while (bottom_widget)
416 gtk_box_pack_start(GTK_BOX(bottom_hbox), bottom_widget, FALSE, FALSE, 3);
417 bottom_widget = va_arg(ap, GtkWidget *);
422 gtk_box_pack_end(GTK_BOX(bottom_hbox), close_button, FALSE, FALSE, 3);
423 g_signal_connect(G_OBJECT(close_button),
"clicked",
424 G_CALLBACK(hide_window_from_button), window);
429 void wh_show_window(GtkWidget *window)
431 if (!gtk_widget_get_visible(window))
433 gtk_widget_show_all(window);
437 gtk_window_present(GTK_WINDOW(window));
440 static void hide_window_from_button(GtkWidget *widget, gpointer data)
442 GtkWidget *window = (GtkWidget *)data;
443 gtk_widget_hide(window);
446 static guint _wh_add_row_to_table(GtkWidget *table)
451 g_object_get(G_OBJECT(table),
453 "n-columns", &columns,
456 guint new_rows = rows + 1;
458 gtk_table_resize(GTK_TABLE(table), new_rows, columns);
459 gtk_table_set_row_spacing(GTK_TABLE(table), new_rows - 1, 4);
464 static GtkWidget *_wh_put_in_new_hbox_with_margin(GtkWidget *widget, gint margin)
466 GtkWidget *hbox = wh_hbox_new();
467 gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, margin);
471 static void _wh_add_in_table_with_label(GtkWidget *table,
const gchar *label_text,
472 GtkWidget *widget,
int expand)
474 guint last_row = _wh_add_row_to_table(table);
476 GtkWidget *label = gtk_label_new(label_text);
477 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
479 _wh_attach_to_table(table, label, 1, 2, last_row, FALSE);
480 _wh_attach_to_table(table, widget, 2, 3, last_row, expand);
483 static void _wh_attach_to_table(GtkWidget *table, GtkWidget *widget,
484 guint start_column, guint end_column, guint row,
int expand)
486 GtkWidget *my_widget = widget;
489 GtkAttachOptions xoptions = GTK_FILL;
492 xoptions |= GTK_EXPAND;
496 hbox = wh_hbox_new();
497 gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0);
501 gtk_table_attach(GTK_TABLE(table), my_widget,
502 start_column, end_column, row-1, row,
503 xoptions, GTK_FILL | GTK_EXPAND,