a pretty nearly working gtkconsole...
[spider.git] / gtkconsole / Screen.pm
diff --git a/gtkconsole/Screen.pm b/gtkconsole/Screen.pm
new file mode 100644 (file)
index 0000000..ce53dc2
--- /dev/null
@@ -0,0 +1,136 @@
+#
+# Generic screen generator
+# 
+# This produces the Gtk for all the little sub-screens
+#
+# $Id$
+#
+# Copyright (c) 2006 Dirk Koopman G1TLH
+#
+
+use strict;
+
+package Screen;
+
+use Gtk2;
+use Gtk2::SimpleList;
+use Text::Wrap;
+
+INIT {
+       Gtk2::SimpleList->add_column_type( 'qrg',
+                                                                          type     => 'Glib::Scalar',
+                                                                          renderer => 'Gtk2::CellRendererText',
+                                                                          attr     => sub {
+                                                                                  my ($treecol, $cell, $model, $iter, $col_num) = @_;
+                                                                                  my $info = $model->get ($iter, $col_num);
+                                                                                  $cell->set(text => sprintf("%.1f", $info), xalign => 1.0);
+                                                                          }
+                                                                        );
+       
+       
+       Gtk2::SimpleList->add_column_type( 'tt',
+                                                                          type     => 'Glib::Scalar',
+                                                                          renderer => 'Gtk2::CellRendererText',
+                                                                          attr     => sub {
+                                                                                  my ($treecol, $cell, $model, $iter, $col_num) = @_;
+                                                                                  my $info = $model->get ($iter, $col_num);
+                                                                                  $cell->set(text => $info);
+                                                                          }
+                                                                        );
+
+       Gtk2::SimpleList->add_column_type( 'ttlong',
+                                                                          type     => 'Glib::Scalar',
+                                                                          renderer => 'Gtk2::CellRendererText',
+                                                                          attr     => sub {
+                                                                                  my ($treecol, $cell, $model, $iter, $col_num) = @_;
+                                                                                  my $info = $model->get ($iter, $col_num);
+                                                                                  $Text::Wrap::columns = 80;
+                                                                                  $cell->set(text => join("\n",wrap("","",$info)));
+                                                                          }
+                                                                        );
+
+       Gtk2::SimpleList->add_column_type( 'ttlesslong',
+                                                                          type     => 'Glib::Scalar',
+                                                                          renderer => 'Gtk2::CellRendererText',
+                                                                          attr     => sub {
+                                                                                  my ($treecol, $cell, $model, $iter, $col_num) = @_;
+                                                                                  my $info = $model->get ($iter, $col_num);
+                                                                                  $Text::Wrap::columns = 65;
+                                                                                  $cell->set(text => join("\n",wrap("","",$info)));
+                                                                          }
+                                                                        );
+
+       Gtk2::SimpleList->add_column_type( 'ttshort',
+                                                                          type     => 'Glib::Scalar',
+                                                                          renderer => 'Gtk2::CellRendererText',
+                                                                          attr     => sub {
+                                                                                  my ($treecol, $cell, $model, $iter, $col_num) = @_;
+                                                                                  my $info = $model->get ($iter, $col_num);
+                                                                                  $Text::Wrap::columns = 30;
+                                                                                  $cell->set(text => join("\n",wrap("","",$info)));
+                                                                          }
+                                                                        );
+
+}
+
+sub new
+{
+       my $pkg = shift;
+       my $class = ref $pkg || $pkg;
+       return bless {@_}, $class;
+}
+
+sub widget
+{
+       return $_[0]->{widget};
+}
+
+1;
+
+package Screen::List;
+
+our @ISA = qw(Screen);
+
+sub _row_inserted
+{
+       my ($liststore, $path, $iter, $self) = @_;
+       $self->{list}->scroll_to_cell($path);
+}
+
+sub new
+{
+       my $pkg = shift;
+       my %args = @_;
+       
+       my $list = Gtk2::SimpleList->new(@{$args{fields}});
+       $list->set_rules_hint(1) if $args{hint};
+       $list->set_name($args{pkgname} || __PACKAGE__);
+       
+       my $scroll = Gtk2::ScrolledWindow->new (undef, undef);
+       $scroll->set_shadow_type ($args{shadow_type} || 'etched-out');
+       $scroll->set_policy (exists $args{policy} ? @{$args{policy}} : qw(automatic automatic));
+       $scroll->set_size_request (@{$args{size}}) if exists $args{size};
+       $scroll->add($list);
+       $scroll->set_border_width(exists $args{border_width} ? $args{border_width} : 2);
+       
+       my $self = $pkg->SUPER::new(scroller => $scroll, list => $list, widget => $scroll, maxsize => ($args{maxsize} || 100));
+
+       $list->get_model->signal_connect('row-inserted', \&_row_inserted, $self);
+
+       if ($args{frame}) {
+               my $frame = Gtk2::Frame->new($args{frame});
+               $frame->add($scroll);
+               $self->{widget} = $self->{frame} = $frame;
+       }
+       return $self;
+}
+
+sub add_data
+{
+       my $self = shift;
+       my $list = $self->{list};
+       
+       push @{$list->{data}}, ref $_[0] ? $_[0] : [ @_ ];
+       shift @{$list->{data}} if @{$list->{data}} > $self->{maxsize};
+}
+1;