Added comment of to-be theme name variable to IrrecoStyleBrowserDlg struct.
[irreco.git] / irreco / trunk / src / core / irreco_cmd_dlg.c
blob17fcbe77f7f308a64d0c41cda4ddcc15e0aa30d2
1 /*
2 * irreco - Ir Remote Control
3 * Copyright (C) 2007 Arto Karppinen (arto.karppinen@iki.fi)
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 #include "irreco_cmd_dlg.h"
21 #include "irreco_backend_dlg.h"
22 #include "irreco_backend_instance.h"
25 * irreco_cmd_dlg_run()
27 * Show a dialog where the user can select one command from a list of all
28 * possible commands
33 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
34 /* Types and definitions. */
35 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
38 #define IRRECO_SELECT_CMD_DLG_BUTTON_ROW_WIDTH 600
39 #define IRRECO_SELECT_CMD_DLG_BUTTON_PAD 5
40 #define IRRECO_SELECT_CMD_DLG_EXPAND_BUTTONS FALSE
42 enum
44 IRRECO_RESPONCE_EDIT = 1,
45 IRRECO_RESPONCE_REFRESH,
46 IRRECO_RESPONCE_COMMAND_SET
49 typedef struct _IrrecoButtonAppend IrrecoButtonAppend;
50 struct _IrrecoButtonAppend {
51 GtkWidget *vbox;
52 GtkWidget *hbox;
53 uint width;
54 uint count;
57 typedef struct _IrrecoSelectCmdDlg IrrecoSelectCmdDlg;
58 struct _IrrecoSelectCmdDlg {
59 IrrecoData *irreco_data;
60 IrrecoCmd *command;
61 GtkWidget *dialog;
62 GtkWidget *scrolled;
63 GtkWidget *vbox;
68 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
69 /* Prototypes. */
70 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
71 void irreco_cmd_dlg_create_command_list(IrrecoSelectCmdDlg * cmd_dlg);
72 void irreco_cmd_dlg_setup_scrollbars(GtkWidget * widget);
73 void irreco_cmd_dlg_append_device(IrrecoSelectCmdDlg * cmd_dlg,
74 IrrecoBackendDevice * device);
75 void irreco_cmd_dlg_append_special(IrrecoSelectCmdDlg * cmd_dlg);
76 void irreco_cmd_dlg_append_wait_button(IrrecoSelectCmdDlg * cmd_dlg,
77 IrrecoButtonAppend * button_append,
78 uint delay);
79 GtkWidget *irreco_cmd_dlg_append_hbox(GtkWidget *vbox,
80 guint padding_between,
81 guint padding_top,
82 guint padding_bottom,
83 guint padding_left,
84 guint padding_right,
85 gfloat x_expand_scale,
86 gfloat y_expand_scale);
87 GtkWidget *irreco_cmd_dlg_append_title_hbox(GtkWidget *vbox);
88 GtkWidget *irreco_cmd_dlg_append_command_hbox(GtkWidget *vbox);
89 void irreco_cmd_dlg_append_button_init(IrrecoButtonAppend * data,
90 GtkWidget *vbox);
91 GtkWidget *irreco_cmd_dlg_append_button(IrrecoButtonAppend * data,
92 const gchar *tite);
96 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
97 /* Run. */
98 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
100 gboolean irreco_cmd_dlg_run(IrrecoData *irreco_data, IrrecoCmd * command,
101 GtkWindow *parent)
103 IrrecoSelectCmdDlg cmd_dlg;
104 gint rvalue = -1;
105 IRRECO_ENTER
107 memset(&cmd_dlg, '\0', sizeof(cmd_dlg));
108 cmd_dlg.irreco_data = irreco_data;
109 cmd_dlg.command = command;
111 /* Create objects. */
112 cmd_dlg.dialog = gtk_dialog_new_with_buttons(
113 _("Select command"), parent,
114 /*irreco_window_manager_get_gtk_window(
115 irreco_data->window_manager),*/
116 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT /* |
117 GTK_DIALOG_NO_SEPARATOR*/,
118 _("Refresh"), IRRECO_RESPONCE_REFRESH,
119 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
120 /*_("Device controllers"), IRRECO_RESPONCE_EDIT,*/
121 NULL);
122 cmd_dlg.scrolled = gtk_scrolled_window_new(0, 0);
124 /* Construct dialog. */
125 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(cmd_dlg.scrolled),
126 GTK_POLICY_NEVER,
127 GTK_POLICY_AUTOMATIC);
128 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(cmd_dlg.dialog)->vbox),
129 cmd_dlg.scrolled);
130 irreco_cmd_dlg_create_command_list(&cmd_dlg);
132 /* Scrollbar setup signal. */
133 g_signal_connect(G_OBJECT(cmd_dlg.scrolled), "size-allocate",
134 G_CALLBACK(irreco_cmd_dlg_setup_scrollbars),
135 NULL);
137 /* Min width, max height. */
138 gtk_window_resize(GTK_WINDOW(cmd_dlg.dialog), 1, 999);
139 gtk_widget_show_all(cmd_dlg.dialog);
141 while (rvalue == -1) {
142 switch (gtk_dialog_run(GTK_DIALOG(cmd_dlg.dialog))) {
143 case GTK_RESPONSE_REJECT:
144 rvalue = FALSE;
145 break;
147 case IRRECO_RESPONCE_COMMAND_SET:
148 rvalue = TRUE;
149 break;
151 case IRRECO_RESPONCE_EDIT:
152 irreco_show_backend_dlg(irreco_data,
153 GTK_WINDOW(cmd_dlg.dialog));
154 irreco_cmd_dlg_create_command_list(&cmd_dlg);
155 break;
157 case IRRECO_RESPONCE_REFRESH:
158 irreco_backend_manager_get_devcmd_lists(
159 irreco_data->irreco_backend_manager);
160 irreco_cmd_dlg_create_command_list(&cmd_dlg);
161 break;
165 gtk_widget_destroy(cmd_dlg.dialog);
166 IRRECO_RETURN_INT(rvalue);
169 void irreco_cmd_dlg_create_command_list(IrrecoSelectCmdDlg * cmd_dlg)
171 IRRECO_ENTER
172 if (cmd_dlg->vbox != NULL) {
173 gtk_widget_destroy(cmd_dlg->vbox);
175 cmd_dlg->vbox = gtk_vbox_new(FALSE, 0);
176 gtk_scrolled_window_add_with_viewport(
177 GTK_SCROLLED_WINDOW(cmd_dlg->scrolled), cmd_dlg->vbox);
179 /* Iterate trough instance, device and command arrays. */
180 IRRECO_DEBUG("Generating command list\n");
181 IRRECO_BACKEND_MANAGER_FOREACH_INSTANCE(
182 cmd_dlg->irreco_data->irreco_backend_manager, instance)
183 IRRECO_DEBUG("Instance: \"%s\"\n", instance->name);
184 IRRECO_BACKEND_INSTANCE_FOREACH(instance, device)
185 IRRECO_DEBUG("Device: \"%s\"\n", device->name);
186 irreco_cmd_dlg_append_device(cmd_dlg, device);
187 IRRECO_BACKEND_INSTANCE_FOREACH_END
188 IRRECO_STRING_TABLE_FOREACH_END
190 IRRECO_DEBUG("Special commands.\n");
191 irreco_cmd_dlg_append_special(cmd_dlg);
192 gtk_widget_show_all(cmd_dlg->dialog);
194 IRRECO_RETURN
199 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
200 /* Signal handlers. */
201 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
202 void irreco_cmd_dlg_set_built_in(GtkButton * button,
203 IrrecoSelectCmdDlg * cmd_dlg)
205 gpointer type;
206 IRRECO_ENTER
208 type = g_object_get_data(G_OBJECT(button), "IrrecoCmdType");
209 irreco_cmd_set_builtin(cmd_dlg->command, (IrrecoCmdType) type);
210 gtk_dialog_response(GTK_DIALOG(cmd_dlg->dialog),
211 IRRECO_RESPONCE_COMMAND_SET);
213 IRRECO_RETURN
216 void irreco_cmd_dlg_set_layout(GtkButton * button,
217 IrrecoSelectCmdDlg * cmd_dlg)
219 gpointer name;
220 IRRECO_ENTER
222 name = g_object_get_data(G_OBJECT(button), "IrrecoCmdLayout");
223 irreco_cmd_set_layout(cmd_dlg->command, (const gchar *) name);
224 gtk_dialog_response(GTK_DIALOG(cmd_dlg->dialog),
225 IRRECO_RESPONCE_COMMAND_SET);
227 IRRECO_RETURN
230 void irreco_cmd_dlg_set_backend(GtkButton * button,
231 IrrecoSelectCmdDlg * cmd_dlg)
233 IrrecoBackendDevice *device;
234 const gchar *command;
235 IRRECO_ENTER
237 device = (IrrecoBackendDevice *) g_object_get_data(
238 G_OBJECT(button), "IrrecoCmdBackendDevice");
239 command = (const gchar *) g_object_get_data(
240 G_OBJECT(button), "IrrecoCmdBackendCommand");
241 irreco_cmd_set_backend(cmd_dlg->command,
242 device->backend_instance,
243 device->name,
244 command);
245 gtk_dialog_response(GTK_DIALOG(cmd_dlg->dialog),
246 IRRECO_RESPONCE_COMMAND_SET);
248 IRRECO_RETURN
251 void irreco_cmd_dlg_set_wait(GtkButton * button, IrrecoSelectCmdDlg * cmd_dlg)
253 gpointer delay;
254 IRRECO_ENTER
256 delay = g_object_get_data(G_OBJECT(button), "IrrecoCmdWaitDelay");
257 irreco_cmd_set_wait(cmd_dlg->command, (gulong) delay);
258 gtk_dialog_response(GTK_DIALOG(cmd_dlg->dialog),
259 IRRECO_RESPONCE_COMMAND_SET);
261 IRRECO_RETURN
265 * Set up scrollbars so that a tap on the scrollbar will scroll almost one
266 * screen worth of space.
268 void irreco_cmd_dlg_setup_scrollbars(GtkWidget * widget)
270 GtkAdjustment *adjustment;
271 IRRECO_ENTER
273 adjustment = gtk_scrolled_window_get_vadjustment(
274 GTK_SCROLLED_WINDOW(widget));
275 adjustment->step_increment = adjustment->page_size * 0.65;
276 adjustment->page_increment = adjustment->page_size * 0.65;
278 IRRECO_DEBUG("value %f\n", adjustment->value);
279 IRRECO_DEBUG("lower %f\n", adjustment->lower);
280 IRRECO_DEBUG("upper %f\n", adjustment->upper);
281 IRRECO_DEBUG("step_increment %f\n", adjustment->step_increment);
282 IRRECO_DEBUG("page_increment %f\n", adjustment->page_increment);
283 IRRECO_DEBUG("page_size %f\n", adjustment->page_size);
285 IRRECO_RETURN
290 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
291 /* Dialog construction. */
292 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
294 void irreco_cmd_dlg_append_commands(IrrecoSelectCmdDlg * cmd_dlg,
295 IrrecoBackendDevice * device)
297 IrrecoButtonAppend button_append;
298 GtkWidget *button;
299 IRRECO_ENTER
301 irreco_cmd_dlg_append_button_init(&button_append, cmd_dlg->vbox);
302 IRRECO_BACKEND_DEVICE_FOREACH(device, command)
303 button = irreco_cmd_dlg_append_button(&button_append,
304 command);
305 g_object_set_data(G_OBJECT(button),
306 "IrrecoCmdBackendDevice",
307 (gpointer) device);
308 g_object_set_data(G_OBJECT(button),
309 "IrrecoCmdBackendCommand",
310 (gpointer) command);
311 g_signal_connect(G_OBJECT(button), "clicked",
312 G_CALLBACK(irreco_cmd_dlg_set_backend),
313 cmd_dlg);
314 IRRECO_BACKEND_DEVICE_FOREACH_END
315 IRRECO_RETURN
318 void irreco_cmd_dlg_append_device(IrrecoSelectCmdDlg * cmd_dlg,
319 IrrecoBackendDevice * device)
321 GtkWidget *hbox;
322 GtkWidget *arrow;
323 GtkWidget *arrow_align;
324 GtkWidget *device_label;
325 GtkWidget *instance_label;
326 IRRECO_ENTER
328 hbox = irreco_cmd_dlg_append_title_hbox(cmd_dlg->vbox);
329 arrow = gtk_arrow_new(GTK_ARROW_RIGHT, GTK_SHADOW_NONE);
330 arrow_align = gtk_alignment_new(0.5, 0.5, 1, 1);
331 device_label = gtk_label_new(device->name);
332 instance_label = gtk_label_new(device->backend_instance->name);
335 instance_label = gtk_label_new(
336 irreco_backend_instance_get_name_and_description(
337 device->backend_instance));
340 /* Arrow: 25px width, auto height, 5px padding left and right.*/
341 gtk_widget_set_size_request(arrow, 25, 0);
342 gtk_misc_set_alignment(GTK_MISC(arrow), 0.5, 0.5);
343 gtk_alignment_set_padding(GTK_ALIGNMENT(arrow_align), 0, 0, 8, 8);
345 gtk_misc_set_alignment(GTK_MISC(device_label), 0, 0.5);
346 gtk_misc_set_alignment(GTK_MISC(instance_label), 0, 0.5);
348 gtk_container_add(GTK_CONTAINER(arrow_align), arrow);
349 gtk_box_pack_start(GTK_BOX(hbox), instance_label, 0, 0, 0);
350 gtk_box_pack_start(GTK_BOX(hbox), arrow_align, 0, 0, 0);
351 gtk_box_pack_start(GTK_BOX(hbox), device_label, 0, 0, 0);
353 if (irreco_backend_device_is_empty(device)) {
354 GtkWidget *label = gtk_label_new(_("This device does not "
355 "have any commands."));
356 hbox = irreco_cmd_dlg_append_command_hbox(cmd_dlg->vbox);
357 gtk_box_pack_start_defaults(GTK_BOX(hbox), label);
358 } else {
359 /*GtkWidget *command_vbox = gtk_vbox_new(FALSE, 10);*/
360 irreco_cmd_dlg_append_commands(cmd_dlg, device);
363 IRRECO_RETURN
368 void irreco_cmd_dlg_append_special(IrrecoSelectCmdDlg * cmd_dlg)
370 GtkWidget *hbox;
371 GtkWidget *label;
372 GtkWidget *button;
373 IrrecoButtonAppend button_append;
374 GString *string;
375 IRRECO_ENTER
377 hbox = irreco_cmd_dlg_append_title_hbox(cmd_dlg->vbox);
378 label = gtk_label_new(_("Special commands"));
379 gtk_box_pack_start(GTK_BOX(hbox), label, 0, 0, 0);
381 /* Create next remote button. */
382 irreco_cmd_dlg_append_button_init(&button_append, cmd_dlg->vbox);
383 button = irreco_cmd_dlg_append_button(
384 &button_append, _(IRRECO_COMMAND_NEXT_REMOTE_TITLE));
385 g_object_set_data(G_OBJECT(button), "IrrecoCmdType",
386 (gpointer) IRRECO_COMMAND_NEXT_REMOTE);
387 g_signal_connect(G_OBJECT(button), "clicked",
388 G_CALLBACK(irreco_cmd_dlg_set_built_in),
389 cmd_dlg);
391 /* Create previous remote button. */
392 button = irreco_cmd_dlg_append_button(
393 &button_append, _(IRRECO_COMMAND_PREVIOUS_REMOTE_TITLE));
394 g_object_set_data(G_OBJECT(button), "IrrecoCmdType",
395 (gpointer) IRRECO_COMMAND_PREVIOUS_REMOTE);
396 g_signal_connect(G_OBJECT(button), "clicked",
397 G_CALLBACK(irreco_cmd_dlg_set_built_in),
398 cmd_dlg);
400 /* Fullscreen toggle button. */
401 button = irreco_cmd_dlg_append_button(
402 &button_append, _(IRRECO_COMMAND_FULLSCREEN_TOGGLE_TITLE));
403 g_object_set_data(G_OBJECT(button), "IrrecoCmdType",
404 (gpointer) IRRECO_COMMAND_FULLSCREEN_TOGGLE);
405 g_signal_connect(G_OBJECT(button), "clicked",
406 G_CALLBACK(irreco_cmd_dlg_set_built_in),
407 cmd_dlg);
409 /* Create show remote buttons. */
410 string = g_string_new("");
411 IRRECO_STRING_TABLE_FOREACH_KEY(
412 cmd_dlg->irreco_data->irreco_layout_array, layout_name)
413 g_string_append(g_string_set_size(string, 0),
414 _(IRRECO_COMMAND_SHOW_LAYOUT_TITLE_PREFIX));
415 g_string_append(string, layout_name);
416 button = irreco_cmd_dlg_append_button(&button_append,
417 string->str);
418 g_object_set_data(G_OBJECT(button), "IrrecoCmdLayout",
419 (gpointer) layout_name);
420 g_signal_connect(G_OBJECT(button), "clicked",
421 G_CALLBACK(irreco_cmd_dlg_set_layout),
422 cmd_dlg);
423 IRRECO_STRING_TABLE_FOREACH_END
424 g_string_free(string, TRUE);
426 /* Append wait buttons. */
427 irreco_cmd_dlg_append_wait_button(cmd_dlg, &button_append,
428 IRRECO_SECONDS_TO_USEC(0.3));
429 irreco_cmd_dlg_append_wait_button(cmd_dlg, &button_append,
430 IRRECO_SECONDS_TO_USEC(0.6));
431 irreco_cmd_dlg_append_wait_button(cmd_dlg, &button_append,
432 IRRECO_SECONDS_TO_USEC(1));
433 irreco_cmd_dlg_append_wait_button(cmd_dlg, &button_append,
434 IRRECO_SECONDS_TO_USEC(1.5));
435 irreco_cmd_dlg_append_wait_button(cmd_dlg, &button_append,
436 IRRECO_SECONDS_TO_USEC(2));
437 irreco_cmd_dlg_append_wait_button(cmd_dlg, &button_append,
438 IRRECO_SECONDS_TO_USEC(3));
439 irreco_cmd_dlg_append_wait_button(cmd_dlg, &button_append,
440 IRRECO_SECONDS_TO_USEC(5));
441 irreco_cmd_dlg_append_wait_button(cmd_dlg, &button_append,
442 IRRECO_SECONDS_TO_USEC(7));
443 irreco_cmd_dlg_append_wait_button(cmd_dlg, &button_append,
444 IRRECO_SECONDS_TO_USEC(10));
445 IRRECO_RETURN
448 void irreco_cmd_dlg_append_wait_button(IrrecoSelectCmdDlg * cmd_dlg,
449 IrrecoButtonAppend * button_append,
450 uint delay)
452 GtkWidget *button;
453 IrrecoCmd *command;
454 IRRECO_ENTER
456 /* Set title. */
457 command = irreco_cmd_create();
458 irreco_cmd_set_wait(command, delay);
459 button = irreco_cmd_dlg_append_button(
460 button_append, irreco_cmd_get_short_name(command));
461 irreco_cmd_destroy(command);
463 /* Set title.
464 string = g_string_new(NULL);
465 g_string_printf(string, _(IRRECO_COMMAND_WAIT_TITLE_FORMAT),
466 (float)(delay) / 1000);
468 g_string_free(string, TRUE);
471 /* Set callback. */
472 g_object_set_data(G_OBJECT(button), "IrrecoCmdWaitDelay",
473 (gpointer) delay);
474 g_signal_connect(G_OBJECT(button), "clicked",
475 G_CALLBACK(irreco_cmd_dlg_set_wait),
476 cmd_dlg);
477 IRRECO_RETURN
482 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
483 /* GtkHBox utility functions. */
484 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
485 GtkWidget *irreco_cmd_dlg_append_hbox(GtkWidget * vbox,
486 guint padding_between,
487 guint padding_top,
488 guint padding_bottom,
489 guint padding_left,
490 guint padding_right,
491 gfloat x_expand_scale,
492 gfloat y_expand_scale)
494 GtkWidget *hbox;
495 GtkWidget *align;
496 IRRECO_ENTER
498 hbox = gtk_hbox_new(FALSE, padding_between);
499 align = irreco_gtk_align(hbox, 0, 0, x_expand_scale, y_expand_scale,
500 padding_top, padding_bottom, padding_left,
501 padding_right);
502 gtk_box_pack_start(GTK_BOX(vbox), align, 0, 0, 0);
503 IRRECO_RETURN_PTR(hbox);
506 void irreco_cmd_dlg_append_separator(GtkWidget * vbox,
507 guint padding_top,
508 guint padding_bottom)
510 GtkWidget *align;
511 IRRECO_ENTER
513 align = irreco_gtk_align(gtk_hseparator_new(), 0, 0, 1, 1,
514 padding_top, padding_bottom, 20, 0);
515 gtk_box_pack_start(GTK_BOX(vbox), align, 0, 0, 0);
516 IRRECO_RETURN
519 GtkWidget *irreco_cmd_dlg_append_title_hbox(GtkWidget * vbox)
521 GtkWidget* hbox;
522 IRRECO_ENTER
524 hbox = irreco_cmd_dlg_append_hbox(vbox,
525 0, /*padding_between */
526 15, /*padding_top */
527 0, /*padding_bottom */
528 25, /*padding_left */
529 20, /*padding_right */
530 0, /* x_expand_scale */
531 0 /* y_expand_scale */
533 irreco_cmd_dlg_append_separator(vbox, 2, 6);
534 IRRECO_RETURN_PTR(hbox);
537 GtkWidget *irreco_cmd_dlg_append_command_hbox(GtkWidget * vbox)
539 return irreco_cmd_dlg_append_hbox(vbox,
540 IRRECO_SELECT_CMD_DLG_BUTTON_PAD, /* padding_between */
541 0, /* padding_top */
542 IRRECO_SELECT_CMD_DLG_BUTTON_PAD, /* padding_bottom */
543 25, /* padding_left */
544 20, /* padding_right */
545 IRRECO_SELECT_CMD_DLG_EXPAND_BUTTONS, /* x_expand_scale */
546 0 /* y_expand_scale */
555 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
556 /* Button adding to button rows. */
557 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
560 * Initialize IrrecoButtonAppend structure.
562 * There is no need to clean IrrecoButtonAppend structure because all
563 * created widgets will be attached to the vbox.
565 void irreco_cmd_dlg_append_button_init(IrrecoButtonAppend * data,
566 GtkWidget *vbox)
568 IRRECO_ENTER
569 data->vbox = vbox;
570 data->hbox = irreco_cmd_dlg_append_command_hbox(vbox);
571 data->width = 0;
572 data->count = 0;
573 IRRECO_RETURN
577 * Add a button to button row. Creates a new button row if current is full.
579 * Returns: a new GtkButton.
581 GtkWidget *irreco_cmd_dlg_append_button(IrrecoButtonAppend * data,
582 const gchar * title)
584 GtkWidget *button;
585 GtkRequisition requisition;
586 IRRECO_ENTER
588 /* Because you cant get widget data->width without adding it to a
589 container, this code does thing a bit backwards. */
590 button = gtk_button_new_with_label(title);
591 gtk_box_pack_start_defaults(GTK_BOX(data->hbox), button);
592 gtk_widget_size_request(GTK_WIDGET(button), &requisition);
593 data->width += requisition.width + IRRECO_SELECT_CMD_DLG_BUTTON_PAD;
595 /* If we have too much buttons on one row, destroy button,
596 and create another button on a new row. */
597 if (data->width > IRRECO_SELECT_CMD_DLG_BUTTON_ROW_WIDTH
598 && data->count > 0) {
599 gtk_widget_destroy(button);
600 data->count = 0;
601 data->width = requisition.width +
602 IRRECO_SELECT_CMD_DLG_BUTTON_PAD;
603 data->hbox = irreco_cmd_dlg_append_command_hbox(data->vbox);
604 button = gtk_button_new_with_label(title);
605 gtk_box_pack_start_defaults(GTK_BOX(data->hbox), button);
608 data->count += 1;
609 IRRECO_RETURN_PTR(button);