X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=gtkconsole%2FScreen.pm;fp=gtkconsole%2FScreen.pm;h=ce53dc299b4b07fcaac301b6094e681f13fb4f30;hb=2eb5b95e4d424b48dfc6c332877414f5573474bd;hp=0000000000000000000000000000000000000000;hpb=312535080b432c251e16828956d4c2eba61dab27;p=spider.git diff --git a/gtkconsole/Screen.pm b/gtkconsole/Screen.pm new file mode 100644 index 00000000..ce53dc29 --- /dev/null +++ b/gtkconsole/Screen.pm @@ -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;