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 #if GTK_MAJOR_VERSION >= 3
79 GtkWidget *table = gtk_grid_new();
80 g_object_set_data(G_OBJECT(table),
"rows", GINT_TO_POINTER(0));
81 gtk_grid_set_column_spacing(GTK_GRID(table), 5);
82 gtk_grid_set_row_spacing(GTK_GRID(table), 4);
84 GtkWidget *table = gtk_table_new(1, 2, FALSE);
85 gtk_table_set_col_spacing(GTK_TABLE(table), 0, 0);
86 gtk_table_set_col_spacing(GTK_TABLE(table), 1, 5);
91 void wh_add_in_table(GtkWidget *table, GtkWidget *widget)
93 guint last_row = _wh_add_row_to_table(table);
95 _wh_attach_to_table(table, widget, 1, 3, last_row, TRUE);
98 void wh_add_in_table_with_label_expand(GtkWidget *table,
const gchar *label_text, GtkWidget *widget)
100 _wh_add_in_table_with_label(table, label_text, widget, TRUE);
103 void wh_add_in_table_with_label(GtkWidget *table,
const gchar *label_text, GtkWidget *widget)
105 _wh_add_in_table_with_label(table, label_text, widget, FALSE);
108 GtkWidget *wh_put_in_new_hbox_with_margin_level(GtkWidget *widget, gint margin_level)
110 return _wh_put_in_new_hbox_with_margin(widget, 6 * margin_level);
113 void wh_put_in_hbox_and_attach_to_vbox(GtkWidget *widget, GtkWidget *vbox, gint vertical_margin)
115 wh_put_in_hbox_and_attach_to_vbox_with_bottom_margin(widget, vbox, vertical_margin, -1);
118 void wh_put_in_hbox_and_attach_to_vbox_with_bottom_margin(GtkWidget *widget, GtkWidget *vbox,
119 gint vertical_margin, gint bottom_margin)
121 GtkWidget *hbox = wh_hbox_new();
122 gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0);
123 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, vertical_margin);
125 if (bottom_margin > 0)
127 GtkWidget *fake_hbox = wh_hbox_new();
128 gtk_box_pack_start(GTK_BOX(vbox), fake_hbox, FALSE, FALSE, bottom_margin);
132 GtkWidget *wh_new_entry(gpointer callback,
ui_state *ui)
134 GtkWidget *entry = gtk_entry_new();
135 gtk_editable_set_editable(GTK_EDITABLE(entry), TRUE);
139 g_signal_connect(G_OBJECT(entry),
"changed", G_CALLBACK(callback), ui);
145 GtkWidget *wh_new_button(
const gchar *button_label)
147 return gtk_button_new_with_mnemonic(button_label);
150 void wh_get_widget_size(GtkWidget *widget, gint *width, gint *height)
152 #if GTK_MAJOR_VERSION <= 2
153 GtkAllocation allocation;
154 gtk_widget_get_allocation(widget, &allocation);
158 *width = allocation.width;
163 *height= allocation.height;
168 *width = gtk_widget_get_allocated_width(widget);
173 *height = gtk_widget_get_allocated_height(widget);
178 GtkWidget *wh_create_int_spinner_in_box_with_top_width(gchar *before_label, gchar *after_label,
179 gdouble initial_value,
180 gdouble minimum_value, gdouble maximum_value,
181 gdouble step_increment, gdouble page_increment,
182 gchar *after_newline_label,
183 void (*spinner_callback)(GtkWidget *spinner,
ui_state *ui),
184 ui_state *ui, GtkWidget *box, gint top_width)
186 GtkWidget *horiz_fake = wh_hbox_new();
187 GtkWidget *label = gtk_label_new(before_label);
188 gtk_box_pack_start(GTK_BOX(horiz_fake), label, FALSE, FALSE, 0);
190 GtkAdjustment *adj = (GtkAdjustment *)
191 gtk_adjustment_new(initial_value, minimum_value, maximum_value, step_increment, page_increment, 0.0);
193 GtkWidget *spinner = gtk_spin_button_new(adj, 0, 0);
195 gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(spinner), TRUE);
196 g_signal_connect(G_OBJECT(spinner),
"value_changed", G_CALLBACK(spinner_callback), ui);
197 gtk_box_pack_start(GTK_BOX(horiz_fake), spinner, FALSE, FALSE, 5);
199 if (after_label != NULL)
201 gtk_box_pack_start(GTK_BOX(horiz_fake), gtk_label_new(after_label), FALSE, FALSE, 3);
204 GtkWidget *fake = wh_hbox_new();
205 gtk_box_pack_start(GTK_BOX(box), fake, FALSE, FALSE, top_width);
207 gtk_box_pack_start(GTK_BOX(box), horiz_fake, FALSE, FALSE, 1);
209 if (after_newline_label != NULL)
211 horiz_fake = wh_hbox_new();
212 gtk_box_pack_start(GTK_BOX(horiz_fake), gtk_label_new(after_newline_label), FALSE, FALSE, 0);
213 gtk_box_pack_start(GTK_BOX(box), horiz_fake, FALSE, FALSE, 2);
216 fake = wh_hbox_new();
217 gtk_box_pack_start(GTK_BOX(box), fake, FALSE, FALSE, 2);
222 GtkWidget *wh_create_int_spinner_in_box(gchar *before_label, gchar *after_label,
223 gdouble initial_value,
224 gdouble minimum_value, gdouble maximum_value,
225 gdouble step_increment, gdouble page_increment,
226 gchar *after_newline_label,
227 void (*spinner_callback)(GtkWidget *spinner,
ui_state *ui),
231 return wh_create_int_spinner_in_box_with_top_width(before_label, after_label,
232 initial_value, minimum_value, maximum_value, step_increment, page_increment,
233 after_newline_label, spinner_callback, ui, box, 2);
236 GtkWidget *wh_hbox_new()
238 #if GTK_MAJOR_VERSION <= 2
239 return gtk_hbox_new(FALSE, 0);
241 GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
242 gtk_box_set_homogeneous(GTK_BOX(hbox), FALSE);
247 GtkWidget *wh_vbox_new()
249 #if GTK_MAJOR_VERSION <= 2
250 return gtk_vbox_new(FALSE, 0);
252 GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
253 gtk_box_set_homogeneous(GTK_BOX(vbox), FALSE);
258 GtkWidget *wh_hscale_new(GtkAdjustment *adjustment)
260 #if GTK_MAJOR_VERSION <= 2
261 return gtk_hscale_new(adjustment);
263 return gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, adjustment);
267 GtkWidget *wh_hscale_new_with_range(gdouble min, gdouble max, gdouble step)
269 #if GTK_MAJOR_VERSION <= 2
270 return gtk_hscale_new_with_range(min, max, step);
272 return gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, min, max, step);
276 void wh_get_pointer(GdkEventMotion *event, gint *x, gint *y, GdkModifierType *state)
278 #if GTK_MAJOR_VERSION <= 2
279 gdk_window_get_pointer(event->window, x, y, state);
281 gdk_window_get_device_position(event->window, event->device, x, y, state);
288 GtkWidget *scrolled_window = gtk_scrolled_window_new (NULL, NULL);
289 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_NONE);
290 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
291 GTK_POLICY_AUTOMATIC,
292 GTK_POLICY_AUTOMATIC);
293 return scrolled_window;
304 GList *children = gtk_container_get_children(GTK_CONTAINER(container));
306 GtkWidget *child = NULL;
307 while ((child = g_list_nth_data(children, i)) != NULL)
309 if (child == my_child)
319 void wh_set_image_on_button(GtkButton *button, GtkWidget *image)
321 gtk_button_set_image(button, image);
324 static void _wh_folder_changed_event(GtkFileChooser *chooser,
ui_state *ui)
326 ui_set_browser_directory(ui, gtk_file_chooser_get_current_folder(chooser));
329 void wh_set_browser_directory_handler(
ui_state *ui, GtkWidget* dialog)
331 const gchar *browser_dir = ui_get_browser_directory(ui);
334 gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), browser_dir);
337 g_signal_connect(GTK_FILE_CHOOSER(dialog),
"current-folder-changed",
338 G_CALLBACK(_wh_folder_changed_event), ui);
351 GtkWidget *box = wh_hbox_new();
352 gtk_container_set_border_width(GTK_CONTAINER(box), 0);
354 GtkWidget *image = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_MENU);
355 gtk_box_pack_start(GTK_BOX(box), image, FALSE, FALSE, 0);
357 if (label_text != NULL)
359 GtkWidget *label = gtk_label_new(label_text);
360 gtk_label_set_text_with_mnemonic(GTK_LABEL(label),label_text);
361 gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 3);
367 button = gtk_toggle_button_new();
371 button = gtk_button_new();
374 gtk_container_add(GTK_CONTAINER(button), box);
379 GtkWidget *wh_create_cool_label(gchar *stock_id, gchar *label_text)
381 GtkWidget *box = wh_hbox_new();
382 gtk_container_set_border_width(GTK_CONTAINER(box), 0);
384 GtkWidget *image = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_MENU);
385 gtk_box_pack_start(GTK_BOX(box), image, FALSE, FALSE, 0);
387 if (label_text != NULL)
389 GtkWidget *label = gtk_label_new(label_text);
390 gtk_label_set_text_with_mnemonic(GTK_LABEL(label),label_text);
391 gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 3);
394 gtk_widget_show_all(box);
399 GtkWidget *wh_create_window_with_close_button(gchar *title, gint width, gint height,
400 GtkWindowPosition position, GtkWindow *parent_window,
401 GtkWidget *main_area_widget, GtkWidget *bottom_widget, ...)
403 GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
404 g_signal_connect(G_OBJECT(window),
"delete_event",
405 G_CALLBACK(gtk_widget_hide_on_delete), window);
406 gtk_window_set_title(GTK_WINDOW(window), title);
407 gtk_window_set_destroy_with_parent(GTK_WINDOW(window), TRUE);
408 gtk_window_set_default_size(GTK_WINDOW(window), width, height);
409 gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
411 GtkWidget *vbox = wh_vbox_new();
412 gtk_container_set_border_width(GTK_CONTAINER(vbox), 4);
413 gtk_container_add(GTK_CONTAINER(window), vbox);
414 gtk_box_pack_start(GTK_BOX(vbox), main_area_widget, TRUE, TRUE, 2);
416 GtkWidget *bottom_hbox = wh_hbox_new();
417 gtk_box_pack_start(GTK_BOX(vbox), bottom_hbox, FALSE, FALSE, 3);
420 va_start(ap, bottom_widget);
421 while (bottom_widget)
423 gtk_box_pack_start(GTK_BOX(bottom_hbox), bottom_widget, FALSE, FALSE, 3);
424 bottom_widget = va_arg(ap, GtkWidget *);
429 gtk_box_pack_end(GTK_BOX(bottom_hbox), close_button, FALSE, FALSE, 3);
430 g_signal_connect(G_OBJECT(close_button),
"clicked",
431 G_CALLBACK(hide_window_from_button), window);
436 void wh_show_window(GtkWidget *window)
438 if (!gtk_widget_get_visible(window))
440 gtk_widget_show_all(window);
444 gtk_window_present(GTK_WINDOW(window));
447 static void hide_window_from_button(GtkWidget *widget, gpointer data)
449 GtkWidget *window = (GtkWidget *)data;
450 gtk_widget_hide(window);
453 static guint _wh_add_row_to_table(GtkWidget *table)
455 #if GTK_MAJOR_VERSION >= 3
456 int number_of_rows = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(table),
"rows"));
458 g_object_set_data(G_OBJECT(table),
"rows", GINT_TO_POINTER(number_of_rows));
459 gtk_grid_insert_row(GTK_GRID(table), number_of_rows);
460 return number_of_rows;
465 g_object_get(G_OBJECT(table),
467 "n-columns", &columns,
470 guint new_rows = rows + 1;
472 gtk_table_resize(GTK_TABLE(table), new_rows, columns);
473 gtk_table_set_row_spacing(GTK_TABLE(table), new_rows - 1, 4);
479 static GtkWidget *_wh_put_in_new_hbox_with_margin(GtkWidget *widget, gint margin)
481 GtkWidget *hbox = wh_hbox_new();
482 gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, margin);
486 static void _wh_add_in_table_with_label(GtkWidget *table,
const gchar *label_text,
487 GtkWidget *widget,
int expand)
489 guint last_row = _wh_add_row_to_table(table);
491 GtkWidget *label = gtk_label_new(label_text);
492 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
494 _wh_attach_to_table(table, label, 1, 2, last_row, FALSE);
495 _wh_attach_to_table(table, widget, 2, 3, last_row, expand);
498 static void _wh_attach_to_table(GtkWidget *table, GtkWidget *widget,
499 guint start_column, guint end_column, guint row,
int expand)
501 GtkWidget *my_widget = widget;
504 #if GTK_MAJOR_VERSION >= 3
505 gtk_widget_set_halign(my_widget, GTK_ALIGN_FILL);
507 GtkAttachOptions xoptions = GTK_FILL;
511 #if GTK_MAJOR_VERSION >= 3
512 gtk_widget_set_hexpand(my_widget, TRUE);
514 xoptions |= GTK_EXPAND;
519 hbox = wh_hbox_new();
520 gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0);
524 #if GTK_MAJOR_VERSION >= 3
525 gtk_grid_attach(GTK_GRID(table), my_widget, start_column, row - 1, end_column - start_column, 1);
527 gtk_table_attach(GTK_TABLE(table), my_widget,
528 start_column, end_column, row-1, row,
529 xoptions, GTK_FILL | GTK_EXPAND,