1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 18 21 22 23 24 25 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 45 46 47 48 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 88 89 90 91 92 93 94 95 96 103 106 107 108 109 110 111 112 113 114 116 117 119 120 121 123 124 126 127 128 130 131 133 135 136 137 138 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
| <?php $window = new GtkWindow(); $window->set_size_request(600, 400); $window->connect_simple('destroy', array('Gtk','main_quit')); $window->add($vbox = new GtkVBox());
// display title
$title = new GtkLabel("Display thumbnail images using GtkIconView"); $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); $vbox->pack_start($title, 0, 0); $vbox->pack_start(new GtkLabel(), 0, 0); // add a small gap
// Set up a scroll window
$hbox = new GtkHBox(); $vbox->pack_start($hbox);
$imagelist[0] = array('square_red.jpg', 'square_yellow.jpg', 'square_green.jpg', 'square_blue.jpg', 'square_blue2.jpg', 'square_blue3.jpg'); $imagelist[1] = array('ball_red.png', 'ball_yellow.png', 'ball_blue3.png', 'ball_blue3a.png', 'ball_green3.png', 'ball_green4.png',);
$left_vbox = setup_iconview(0, 'left'); $right_vbox = setup_iconview(1, 'right');
$view[0]->drag_source_set(Gdk::BUTTON1_MASK, array( array( 'text/plain', 0, 0)), Gdk::ACTION_COPY|Gdk::ACTION_MOVE); $view[0]->connect('drag-data-get', 'on_drag');
$view[1]->drag_dest_set(Gtk::DEST_DEFAULT_ALL, array( array( 'text/plain', 0, 0)), Gdk::ACTION_COPY|Gdk::ACTION_MOVE); $view[1]->connect('drag-data-received', 'on_drop');
$hbox->pack_start($left_vbox); $hbox->pack_start($right_vbox);
$window->show_all(); Gtk::main();
function setup_iconview($id, $label) { global $imagelist, $model, $modelfilter, $view; $model[$id] = new GtkListStore(GdkPixbuf::gtype, Gtk::TYPE_STRING, Gtk::TYPE_BOOLEAN);
$modelfilter[$id] = new GtkTreeModelFilter($model[$id]); $modelfilter[$id]->set_visible_column(2);
foreach($imagelist[$id] as $img) { $pixbuf = GdkPixbuf::new_from_file($img); $flag = (preg_match('/blue/', $img) || preg_match('/green/', $img)) ? 1 : 0; $model[$id]->append(array($pixbuf, $img, $flag)); }
$view[$id] = new GtkIconView($model[$id]); $view[$id]->set_pixbuf_column(0); // col 0 of the model
$view[$id]->set_text_column(1); // col 1 of the model
$view[$id]->set_selection_mode(Gtk::SELECTION_MULTIPLE); $view[$id]->set_columns(0); $view[$id]->set_item_width(120);
$vbox = new GtkVBox(); $radio1 = setup_radio(null, 'display all', $label.'_all', $id); $radio2 = setup_radio($radio1, 'display blue/green only', $label.'_filter1', $id); $vbox->pack_start($radio1, 0); $vbox->pack_start($radio2, 0); $vbox->pack_start($view[$id]); return $vbox; }
// process drag
function on_drag($widget, $context, $data, $info, $time) { $selection = $widget->get_selected_items(); if (count($selection)==0) return; // return if there's no selection
$data->set_text(serialize($selection)); }
// process drop
function on_drop($widget, $context, $x, $y, $data, $info, $time) { // append the dragged item to the destination view
$path_array = $widget->get_path_at_pos($x, $y); // note 3
global $imagelist; global $model, $modelfilter, $view; $data = unserialize($data->data); print_r($data); $dest_model = $widget->get_model(); $source_model = $view[0]->get_model(); foreach($data as $img) { $i = $img[0]; if (method_exists($source_model, 'append')) { $iter = $model[0]->get_iter($i); } else { $iter_filter = $modelfilter[0]->get_iter($i); $iter = $modelfilter[0]->convert_iter_to_child_iter($iter_filter); } $img_name = $model[0]->get_value($iter, 1); $model[0]->remove($iter); $pixbuf = GdkPixbuf::new_from_file($img_name); $flag = (preg_match('/blue/', $img_name) || preg_match('/green/', $img_name)) ? 1 : 0; if (method_exists($dest_model, 'append')) { $dest_model->append(array($pixbuf, $img_name, $flag)); } else { $model[1]->append(array($pixbuf, $img_name, $flag)); $view[1]->set_model($model[1]); $view[1]->set_model($modelfilter[1]); } } }
// function to simplify the display of grouped radio buttons
function setup_radio($radio_button_grp, $button_label, $button_value, $id) { $radio = new GtkRadioButton($radio_button_grp, $button_label); $radio->connect('toggled', "on_toggle", $button_value, $id); return $radio; }
// call-back function when user pressed a radio button
function on_toggle($radio, $value, $id) { global $view, $model, $modelfilter; $label = $radio->child->get_label(); $active = $radio->get_active(); if ($active) { echo "radio button pressed: $label (value = $value)\n"; if (preg_match('/filter1/', $value)) { $view[$id]->set_model($modelfilter[$id]); } else { $view[$id]->set_model($model[$id]); } } }
?>
|
January 08, 2009 3:23am
Is this article useful?
Found any bugs?
Improvements for the above article?
Please enter below...