[perl-Gtk3] Add more overrides



commit f6c1e09498fda28a2a06ba085eaf5c7d9604764a
Author: Torsten SchÃnfeld <kaffeetisch gmx de>
Date:   Sat Sep 10 23:51:37 2011 +0200

    Add more overrides

 lib/Gtk3.pm   |   53 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
 t/overrides.t |   54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 106 insertions(+), 1 deletions(-)
---
diff --git a/lib/Gtk3.pm b/lib/Gtk3.pm
index f7d35b1..9abb0fb 100644
--- a/lib/Gtk3.pm
+++ b/lib/Gtk3.pm
@@ -10,6 +10,13 @@ our @ISA = qw(Exporter);
 my $_GTK_BASENAME = 'Gtk';
 my $_GTK_VERSION = '3.0';
 my $_GTK_PACKAGE = 'Gtk3';
+my @_GTK_FLATTEN_ARRAY_REF_RETURN_FOR = qw/
+  Gtk3::Window::list_toplevels
+/;
+my @_GTK_HANDLE_SENTINEL_BOOLEAN_FOR = qw/
+  Gtk3::TreeModel::get_iter_first
+  Gtk3::TreeSelection::get_selected
+/;
 
 sub import {
   my $class = shift;
@@ -17,7 +24,9 @@ sub import {
   Glib::Object::Introspection->setup (
     basename => $_GTK_BASENAME,
     version => $_GTK_VERSION,
-    package => $_GTK_PACKAGE);
+    package => $_GTK_PACKAGE,
+    flatten_array_ref_return_for => \ _GTK_FLATTEN_ARRAY_REF_RETURN_FOR,
+    handle_sentinel_boolean_for => \ _GTK_HANDLE_SENTINEL_BOOLEAN_FOR);
 
   my $init = 0;
   my @unknown_args = ($class);
@@ -66,6 +75,16 @@ sub Gtk3::main_quit {
   Glib::Object::Introspection->invoke ($_GTK_BASENAME, undef, 'main_quit');
 }
 
+sub Gtk3::Button::new {
+  my ($class, $label) = @_;
+  if (defined $label) {
+    return $class->new_with_mnemonic ($label);
+  } else {
+    return Glib::Object::Introspection->invoke (
+      $_GTK_BASENAME, 'Button', 'new', @_);
+  }
+}
+
 sub Gtk3::ListStore::new {
   my ($class, @types) = @_;
   local $@;
@@ -77,6 +96,11 @@ sub Gtk3::ListStore::new {
     $class, $real_types);
 }
 
+# Reroute 'get' to Gtk3::ListStore instead of Glib::Object.
+sub Gtk3::ListStore::get {
+  return Gtk3::TreeModel::get (@_);
+}
+
 sub Gtk3::ListStore::set {
   my ($model, $iter, @columns_and_values) = @_;
   my (@columns, @values);
@@ -103,6 +127,33 @@ sub Gtk3::ListStore::set {
     $model, $iter, \ columns, \ wrapped_values);
 }
 
+sub Gtk3::MessageDialog::new {
+  my ($class, $parent, $flags, $type, $buttons, $format, @args) = @_;
+  my $dialog = Glib::Object::new ($class, message_type => $type,
+                                          buttons => $buttons);
+  if (defined $format) {
+    # sprintf can handle empty @args
+    my $msg = sprintf $format, @args;
+    $dialog->set (text => $msg);
+  }
+  if (defined $parent) {
+    $dialog->set_transient_for ($parent);
+  }
+  if ($flags & 'modal') {
+    $dialog->set_modal (Glib::TRUE);
+  }
+  if ($flags & 'destroy-with-parent') {
+    $dialog->set_destroy_with_parent (Glib::TRUE);
+  }
+  return $dialog;
+}
+
+sub Gtk3::TreeModel::get {
+  my ($model, $iter, @columns) = @_;
+  my @values = map { $model->get_value ($iter, $_) } @columns;
+  return @values[0..$#values];
+}
+
 sub Gtk3::TreePath::new {
   my ($class, @args) = @_;
   my $method = (@args == 1) ? 'new_from_string' : 'new';
diff --git a/t/overrides.t b/t/overrides.t
new file mode 100644
index 0000000..6c331a5
--- /dev/null
+++ b/t/overrides.t
@@ -0,0 +1,54 @@
+#!/usr/bin/env perl
+
+BEGIN { require './t/inc/setup.pl' };
+
+use strict;
+use warnings;
+
+plan tests => 11;
+
+# Gtk3::Window::list_toplevels
+{
+  my $window1 = Gtk3::Window->new ('toplevel');
+  my $window2 = Gtk3::Window->new ('toplevel');
+  is_deeply ([Gtk3::Window::list_toplevels ()], [$window1, $window2]);
+  is (scalar Gtk3::Window::list_toplevels (), $window2);
+}
+
+# Gtk3::ListStore->new, set and get
+{
+  my $model = Gtk3::ListStore->new ([qw/Glib::String Glib::Int/]);
+  my $iter = $model->append;
+  $model->set ($iter, [0, 1], ['Foo', 23]);
+  is_deeply ([$model->get ($iter, 0,1)], ['Foo', 23]);
+  is (scalar $model->get ($iter, 0,1), 23);
+
+  $iter = $model->append;
+  $model->set ($iter, 0 => 'Bar', 1 => 42);
+  is_deeply ([$model->get ($iter, 0,1)], ['Bar', 42]);
+  is (scalar $model->get ($iter, 0,1), 42);
+
+  local $@;
+  eval { $model->set ($iter, 0) };
+  like ($@, qr/Usage/);
+}
+
+# Gtk3::TreeModel->get_iter_first
+{
+  my $model = Gtk3::ListStore->new ('Glib::String');
+  is ($model->get_iter_first, undef);
+  my $iter = $model->append;
+  isa_ok ($model->get_iter_first, 'Gtk3::TreeIter');
+}
+
+# Gtk3::TreeSelection->get_selected
+{
+  my $model = Gtk3::ListStore->new ('Glib::String');
+  my $view = Gtk3::TreeView->new ($model);
+  my $selection = $view->get_selection;
+  my $iter = $model->append;
+  $selection->select_iter ($iter);
+  my ($sel_model, $sel_iter) = $selection->get_selected;
+  is ($sel_model, $model);
+  isa_ok ($sel_iter, 'Gtk3::TreeIter');
+}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]