Problem
The GtkDialog constructor example in the offical PHP-GTK2 documentation shows only how to get a yes/no response using a dialog box with GtkButtons.
Suppose you would like to get inputs from user using checkboxes in a dialog box as shown below:
Solution
- Set up the checkboxes manually as outlined in the article How to setup a dialog box - Part 3 - set up buttons manually?
- We process the selection of checkboxes using the technique as described in How to setup and process checkboxes?.
- In the button click event handler, we destroy the dialog manually with GtkObject::destroy().
- We get the status of all the checkboxes one by one, and store the label of the selected checkboxes in the array
$selections
.
Sample Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 59 60 61 63 64 65 66 67 68 69 70 72 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | <?php $window = new GtkWindow(); $window->set_title($argv[0]); $window->set_size_request(400, 120); $window->connect_simple('destroy', array('Gtk','main_quit')); $window->add($vbox = new GtkVBox()); // display title $title = new GtkLabel("Set up Dialog Box of Checkboxes - Part 1\n"); $title->modify_font(new PangoFontDescription("Times New Roman Italic 10")); $title->modify_fg(Gtk::STATE_NORMAL, GdkColor::parse("#0000ff")); $title->set_size_request(-1, 40); $title->set_justify(Gtk::JUSTIFY_CENTER); $alignment = new GtkAlignment(0.5, 0, 0, 0); $alignment->add($title); $vbox->pack_start($alignment, 0, 0); $vbox->pack_start(new GtkLabel(), 0, 0); $vbox->pack_start($hbox = new GtkHBox(), 0); $hbox->pack_start(new GtkLabel('Response: '), 0); $hbox->pack_start($response = new GtkLabel(), 0); $hbox->pack_start($button = new GtkButton('Get Response'), 0); $button->connect('clicked', 'on_click'); $window->show_all(); Gtk::main(); function on_click() { setup_dialog(); } function setup_dialog() { $dialog = new GtkDialog(); $dialog->set_title(''); $dialog->vbox->pack_start(new GtkLabel("Which platforms are you using: \n". "(You can select more than one)")); global $checkbox1, $checkbox2, $checkbox3; $checkbox1 = setup_checkbox('Windows'); // note 1 $checkbox2 = setup_checkbox('Mac'); $checkbox3 = setup_checkbox('Linux'); // pack them inside vbox $dialog->vbox->pack_start($checkbox1, 0, 0); // note 2 $dialog->vbox->pack_start($checkbox2, 0, 0); $dialog->vbox->pack_start($checkbox3, 0, 0); $dialog->vbox->pack_start($hbox2 = new GtkHBox()); $button_ok = GtkButton::new_from_stock(Gtk::STOCK_OK); $button_ok->set_size_request(87, 33); $hbox2->pack_start(new GtkLabel()); $hbox2->pack_start($button_ok, 0); $button_ok->connect('clicked', 'on_ok_button', $dialog); $dialog->set_has_separator(false); $dialog->action_area->set_size_request(-1, 1); $dialog->show_all(); global $selected_radio, $selected_radio_value; $selected_radio = $selected_radio_value = ''; $dialog->run(); $dialog->destroy(); global $response, $selections; $response->set_text(implode(', ', $selections)); // note 7 } function on_ok_button($button, $dialog) { global $checkbox1, $checkbox2, $checkbox3; $status1 = $checkbox1->get_active()?$checkbox1->get_label(): ''; // note 3 $status2 = $checkbox2->get_active()?$checkbox2->get_label(): ''; $status3 = $checkbox3->get_active()?$checkbox3->get_label(): ''; global $selections; $selections = array(); if ($status1!='') $selections[] = $status1; // note 4 if ($status2!='') $selections[] = $status2; if ($status3!='') $selections[] = $status3; if (count($selections)==0) { alert("Please make a selection."); // note 5 } else { $dialog->destroy(); // note 6 } } function setup_checkbox($label) { $checkbox = new GtkCheckButton($label); $checkbox->connect('toggled', "on_toggle"); return $checkbox; } function on_toggle($checkbox) { $label = $checkbox->get_label(); $active = $checkbox->get_active(); if ($active) echo "You have selected: $label\n"; } // display popup alert box function alert($msg) { // note 1 $dialog = new GtkDialog('Alert', null, Gtk::DIALOG_MODAL); $dialog->set_position(Gtk::WIN_POS_CENTER_ALWAYS); $top_area = $dialog->vbox; $top_area->pack_start($hbox = new GtkHBox()); $stock = GtkImage::new_from_stock(Gtk::STOCK_DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG); $hbox->pack_start($stock, 0, 0); $hbox->pack_start(new GtkLabel($msg)); $dialog->add_button(Gtk::STOCK_OK, Gtk::RESPONSE_OK); $dialog->set_has_separator(false); $dialog->show_all(); $dialog->set_keep_above(1); $dialog->run(); $dialog->destroy(); } ?> |
Output
As shown above.Explanation
We make use of the code from How to setup a dialog box - Part 4 - non integer response id? to manually set up the Yes/No buttons.
We also make use of the code from How to setup and process checkboxes? to process the selection of checkboxes.
What's new here:
- Set up the checkboxes.
- Pack the checkboxes into the dialog vbox.
- Get the status of each checkbox.
- If the checkbox is selected, add this to the array
$selections
. - Popup an alert if the user didn't make any selections.
- Manually close the dialog.
- Echo the checkbox selection.
Related Links
- How to setup a dialog box of checkboxes - Part 2 - check all and clear all?
- How to setup a dialog box of radio buttons - Part 1?
- How to setup a dialog box of radio buttons - Part 2 - make sure user selects?
- How to setup a dialog box - Part 1 - hello dialog?
- How to setup a dialog box - Part 2 - simple yes no dialog?
- How to setup a dialog box - Part 3 - set up buttons manually?
- How to setup a dialog box - Part 4 - non integer response id?
- How to setup a dialog box - Part 5 - get text entry?
- How to make a dialog stay for invalid input - Part 1?
Read more...