ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/kgsueme/gtk.pl
Revision: 1.3
Committed: Sat May 31 10:58:30 2003 UTC (21 years ago) by pcg
Content type: text/plain
Branch: MAIN
Changes since 1.2: +33 -3 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 pcg 1.1 package gtk;
2    
3 pcg 1.3 use Carp;
4    
5 pcg 1.1 our $text_renderer = new Gtk2::CellRendererText;
6     our $int_renderer = new Gtk2::CellRendererText;
7     $int_renderer->set (xalign => 1);
8    
9     our $state = $util::state->{gtk} || {};
10    
11     # shows the properties of a glib object
12 pcg 1.3 sub info {
13 pcg 1.1 my ($idx, $obj) = @_;
14     last if $seen{$idx}++;
15     print "\n$idx\n";
16     for ($obj->list_properties) {
17     printf "%-16s %-24s %-24s %s\n", $_->{name}, $_->{type}, (join ":", @{$_->{flags}}), $_->{descr};
18     }
19     }
20    
21     # grr... more gtk+ brokenness
22     my %get = (
23     hpane_position => sub { ($_[0]->children)[0]->allocation->[2] },
24     vpane_position => sub { ($_[0]->children)[0]->allocation->[3] },
25     window_size => sub { [ ($_[0]->allocation->values)[2,3] ] },
26     #window_pos => sub { die KGS::Listener::Debug::dumpval [ $_[0]->get_root_origin ] },
27     clist_column_widths => sub {
28     $_[0]{column_widths};
29     },
30     );
31    
32     my %set = (
33     hpane_position => sub { $_[0]->set_position($_[1]) },
34     vpane_position => sub { $_[0]->set_position($_[1]) },
35     window_size => sub { $_[0]->set_default_size(@{$_[1]}) },
36     #window_pos => sub { $_[0]->set_uposition(@{$_[1]}) if @{$_[1]} },
37     clist_column_widths => sub {
38     my ($w, $v) = @_;
39     $v->[$_] && $w->set_column_width($_, $v->[$_]) for 0..$#$v;
40     $w->{column_widths} = $v;
41     $w->signal_connect(resize_column => sub { $v->[$_[1]] = $_[2]; });
42     },
43     );
44    
45     sub state {
46     my ($widget, $class, $instance, %attr) = @_;
47    
48     while (my ($k, $v) = each %attr) {
49     my ($set, $get) = $k =~ /=/ ? split /=/, $k : ($k, $k);
50     $v = $state->{$class}{"*"}{$get} if exists $state->{$class}{"*"}{$get};
51     $v = $state->{$class}{$instance}{$get} if exists $state->{$class}{$instance}{$get};
52     $set{$get} ? $set{$get}->($widget, $v) : $widget->set($set => $v);
53     }
54    
55     $widget = [$widget, $class, $instance, \%attr];
56     Scalar::Util::weaken $widget->[0];
57    
58     @widgets = (grep $_->[0], @widgets, $widget);
59     }
60    
61     sub save_state {
62     for (@widgets) {
63     if ($_->[0]) {
64     my ($widget, $class, $instance, $attr) = @$_;
65    
66     $widget->realize if $widget->isa(Gtk2::Widget::);
67    
68     while (my ($k, $v) = each %$attr) {
69     my ($set, $get) = $k =~ /=/ ? split /=/, $k : ($k, $k);
70     $v = $get{$get} ? $get{$get}->($widget) : $widget->get($get);
71    
72     warn "$class : $get = $v\n";#d#
73     $state->{$class}{"*"}{$get} = $v;
74     $state->{$class}{$instance}{$get} = $v;
75     }
76     }
77     ::status("save_state", "layout saved");
78     }
79     }
80    
81     # make a clist unselectable
82     sub clist_autosort {
83     my $w = shift;
84     my ($c, $o) = (-1);
85     for (0..$w->columns-1) {
86     $w->signal_connect(click_column => sub {
87     if ($_[1] != $c) {
88     $c = $_[1];
89     $o = 0;
90     } else {
91     $o = !$o;
92     }
93     $w->set_sort_column($c);
94     $w->set_sort_type($o ? "descending" : "ascending");
95     $w->sort;
96     });
97     }
98 pcg 1.2 }
99    
100     package gtk::widget;
101    
102     # hacked gtk pseudo-widget
103    
104 pcg 1.3 sub new {
105     my $class = shift;
106     bless { @_ }, $class;
107     }
108    
109 pcg 1.2 sub widget { $_[0]{widget} }
110    
111     sub AUTOLOAD {
112 pcg 1.3 $AUTOLOAD =~ /::([^:]+)$/ or Carp::confess "$AUTOLOAD: no such method (illegal name)";
113     my $method = $_[0]{widget}->can($1)
114     or Carp::confess "$AUTOLOAD: no such method";
115     # do NOT cache.. we are fats enough this way
116     unshift @_, shift->{widget};
117     &$method;
118     }
119    
120     package gtk::text;
121    
122     use base gtk::widget;
123    
124     sub new {
125     my $class = shift;
126     my $self = $class->SUPER::new(@_);
127    
128     $self->{buffer} = new Gtk2::TextBuffer undef;
129    
130     $self->{widget} = new Gtk2::TextView;
131    
132     $self;
133     }
134    
135     sub set_text {
136     my ($self, $text) = @_;
137 pcg 1.1 }
138    
139     1;
140