#!/usr/bin/perl # # $Id$ # ######################### # GtkIconView Tests # - rm ######################### ######################### use strict; use warnings; use Gtk2::TestHelper tests => 60, at_least_version => [2, 6, 0, "GtkIconView is new in 2.6"], ; use constant TEXT => 0; use constant PIXBUF => 1; use constant BOOLEAN => 2; use constant ICON_COORD => 30; my $win = Gtk2::Window->new; #my $swin = Gtk2::ScrolledWindow->new; #$win->add ($swin); my $model = create_store (); isa_ok (my $iview = Gtk2::IconView->new, 'Gtk2::IconView', 'Gtk2::IconView->new'); ginterfaces_ok($iview); is ($iview->get_model, undef, '$iview->get_model, undef'); $iview->set_model ($model); is ($iview->get_model, $model, '$iview->set|get_model'); isa_ok ($iview = Gtk2::IconView->new_with_model ($model), 'Gtk2::IconView', 'Gtk2::IconView->new'); #$swin->add ($iview); is ($iview->get_model, $model, '$iview->get_model, new_with_model'); fill_store ($model, get_pixbufs ($win)); is ($iview->get_text_column, -1, '$iview->get_text_column, undef'); $iview->set_text_column (TEXT); is ($iview->get_text_column, TEXT, '$iview->set|get_text_column'); is ($iview->get_pixbuf_column, -1, '$iview->get_pixbuf_column, undef'); $iview->set_pixbuf_column (PIXBUF); is ($iview->get_pixbuf_column, PIXBUF, '$iview->set|get_pixbuf_column'); is ($iview->get_markup_column, -1, '$iview->get_markup_column, undef'); $iview->set_markup_column (TEXT); is ($iview->get_markup_column, TEXT, '$iview->set|get_markup_column'); foreach (qw/horizontal vertical/) { $iview->set_orientation ($_); is ($iview->get_orientation, $_, '$iview->set|get_orienation, '.$_); } # extended should be in this list, but it seems to fail foreach (qw/none single browse multiple/) { $iview->set_selection_mode ($_); is ($iview->get_selection_mode, $_, '$iview->set|get_selection_mode '.$_); } $iview->set_columns (23); is ($iview->get_columns, 23); $iview->set_item_width (23); is ($iview->get_item_width, 23); $iview->set_spacing (23), is ($iview->get_spacing, 23); $iview->set_row_spacing (23); is ($iview->get_row_spacing, 23); $iview->set_column_spacing (23); is ($iview->get_column_spacing, 23); $iview->set_margin (23); is ($iview->get_margin, 23); my $path = $iview->get_path_at_pos (ICON_COORD, ICON_COORD); $path = Gtk2::TreePath->new_first unless defined $path; isa_ok ($path, 'Gtk2::TreePath'); is ($iview->path_is_selected ($path), '', '$iview->path_is_selected, no'); $iview->select_path ($path); is ($iview->path_is_selected ($path), 1, '$iview->path_is_selected, yes'); $iview->unselect_path ($path); is ($iview->path_is_selected ($path), '', '$iview->path_is_selected, no'); $iview->item_activated ($path); my @sels = $iview->get_selected_items; is (scalar (@sels), 0, '$iview->get_selected_items, count 0'); $iview->select_all; @sels = $iview->get_selected_items; is (scalar (@sels), 14, '$iview->get_selected_items, count 14'); isa_ok ($sels[0], 'Gtk2::TreePath', '$iview->get_selected_items, type'); # make sure it's actually a valid path ok (defined $sels[0]->to_string); $iview->unselect_all; @sels = $iview->get_selected_items; is (scalar (@sels), 0, '$iview->get_selected_items, count 0'); $iview->select_path ($path); $iview->selected_foreach (sub { my ($view, $path, $data) = @_; isa_ok ($view, 'Gtk2::IconView'); isa_ok ($path, 'Gtk2::TreePath'); isa_ok ($data, 'HASH'); is ($data->{foo}, 'bar', 'callback data intact'); }, { foo => 'bar' }); $iview->select_all; my $ncalls = 0; $iview->selected_foreach (sub { $ncalls++ }); my @selected_items = $iview->get_selected_items; is ($ncalls, scalar(@selected_items), 'called once for each selected child'); SKIP: { skip 'new 2.8 stuff', 11 unless Gtk2->CHECK_VERSION (2, 8, 0); # For some reason, get_item_at_pos seems to occasionally run into # uninitialized memory when used non-interactively. So it's not tested # here. # run_main sub { warn $iview->get_item_at_pos (ICON_COORD, ICON_COORD); }; my $win = Gtk2::Window->new; my $model = create_store (); fill_store ($model, get_pixbufs ($win)); my $iview = Gtk2::IconView->new_with_model ($model); $iview->set_text_column (TEXT); $iview->set_pixbuf_column (PIXBUF); $win->add ($iview); $win->show_all; my $path = Gtk2::TreePath->new_first; # We have no cell renderer to test with, since get_cells() is not # available. $iview->set_cursor ($path, undef, FALSE); my @tmp = $iview->get_cursor; is (@tmp, 2); isa_ok ($tmp[0], "Gtk2::TreePath"); is ($tmp[1], undef); @tmp = $iview->get_visible_range; isa_ok ($tmp[0], "Gtk2::TreePath"); isa_ok ($tmp[1], "Gtk2::TreePath"); $iview->scroll_to_path ($path, TRUE, 0.5, 0.5); $iview->scroll_to_path ($path); $iview->enable_model_drag_source ([qw/shift-mask/], "copy", { target => "STRING", flags => ["same-app", "same-widget"], info => 42 }); $iview->enable_model_drag_dest ("copy", { target => "STRING", flags => ["same-app", "same-widget"], info => 42 }); $iview->unset_model_drag_source; $iview->unset_model_drag_dest; $iview->set_reorderable (TRUE); ok ($iview->get_reorderable); $iview->set_drag_dest_item ($path, "drop-into"); @tmp = $iview->get_drag_dest_item; isa_ok ($tmp[0], "Gtk2::TreePath"); is ($tmp[1], "drop-into"); my ($tmp_path, $pos) = $iview->get_dest_item_at_pos (ICON_COORD, ICON_COORD); isa_ok ($tmp_path, "Gtk2::TreePath"); like ($pos, qr/drop/); isa_ok ($iview->create_drag_icon ($path), "Gtk2::Gdk::Pixmap"); $win->destroy; } SKIP: { skip 'new 2.12 stuff', 2 unless Gtk2->CHECK_VERSION (2, 12, 0); my $win = Gtk2::Window->new; my $model = create_store (); fill_store ($model, get_pixbufs ($win)); my $iview = Gtk2::IconView->new_with_model ($model); $iview->set_tooltip_column (TEXT); is ($iview->get_tooltip_column, TEXT); my ($bx, $by) = $iview->convert_widget_to_bin_window_coords (0, 0); is_deeply ([$bx, $by], [0, 0]); } SKIP: { skip 'new 2.18 stuff', 1 unless Gtk2->CHECK_VERSION (2, 18, 0); my $win = Gtk2::Window->new; my $model = create_store (); fill_store ($model, get_pixbufs ($win)); my $iview = Gtk2::IconView->new_with_model ($model); $iview->set_item_padding(2); is ($iview->get_item_padding, 2, '[gs]et_icon_padding'); } SKIP: { skip 'query-tooltip is hard to test automatically', 5; my $win = Gtk2::Window->new; $win->set (tooltip_markup => "Bla!"); my $model = create_store (); fill_store ($model, get_pixbufs ($win)); my $iview = Gtk2::IconView->new_with_model ($model); my $path = Gtk2::TreePath->new_first; my $cell = ($iview->get_cells)[PIXBUF]; my $handler_called = 0; $win->signal_connect (query_tooltip => sub { my ($window, $x, $y, $keyboard_mode, $tip) = @_; return TRUE if $handler_called++; $iview->set_tooltip_item ($tip, $path); $iview->set_tooltip_cell ($tip, $path, $cell); my ($bx, $by, $model, $tpath, $iter) = $iview->get_tooltip_context ($x, $y, $keyboard_mode); is ($bx, 0); is ($by, 0); isa_ok ($model, 'Gtk2::TreeModel'); isa_ok ($tpath, 'Gtk2::TreePath'); isa_ok ($iter, 'Gtk2::TreeIter'); Glib::Idle->add (sub { Gtk2->main_quit; }); return TRUE; }); $win->add ($iview); $win->show_all; my $event = Gtk2::Gdk::Event->new ('motion-notify'); $event->window ($win->window); Gtk2->main_do_event ($event); Gtk2->main; $win->destroy; } SKIP: { skip 'new 2.22 stuff', 3 unless Gtk2->CHECK_VERSION (2, 22, 0); my $win = Gtk2::Window->new; my $model = create_store (); fill_store ($model, get_pixbufs ($win)); my $iview = Gtk2::IconView->new_with_model ($model); my $path = Gtk2::TreePath->new_first; ok (defined $iview->get_item_column ($path)); ok (defined $iview->get_item_row ($path)); $iview->set_item_orientation ('vertical'); is ($iview->get_item_orientation, 'vertical'); } sub create_store { my $store = Gtk2::ListStore->new (qw/Glib::String Gtk2::Gdk::Pixbuf Glib::Boolean/); return $store; } sub get_pixbufs { my $win = shift; my @pbs; foreach (qw/gtk-ok gtk-cancel gtk-about gtk-quit/) { push @pbs, $win->render_icon ($_, 'dialog'); } return \@pbs; } sub fill_store { my $store = shift; my $pbs = shift; foreach (qw/one two three four five six seven eight nine uno dos tres quatro cinco/) { my $iter = $store->append; $store->set ($iter, TEXT, "$_", PIXBUF, $pbs->[rand (@$pbs)], BOOLEAN, rand (2), ); } }