ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/kgsueme/gtk.pl
Revision: 1.18
Committed: Mon Jun 2 14:05:10 2003 UTC (21 years ago) by pcg
Content type: text/plain
Branch: MAIN
Changes since 1.17: +11 -8 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 pcg 1.15 use File::Temp;
5     use Gtk2;
6 pcg 1.3
7 pcg 1.1 our $text_renderer = new Gtk2::CellRendererText;
8     our $int_renderer = new Gtk2::CellRendererText;
9     $int_renderer->set (xalign => 1);
10    
11 pcg 1.5 our $state = $util::state->{gtk} ||= {};
12 pcg 1.1
13     # shows the properties of a glib object
14 pcg 1.3 sub info {
15 pcg 1.1 my ($idx, $obj) = @_;
16 pcg 1.5 return if $seen{$idx}++;
17 pcg 1.1 print "\n$idx\n";
18     for ($obj->list_properties) {
19     printf "%-16s %-24s %-24s %s\n", $_->{name}, $_->{type}, (join ":", @{$_->{flags}}), $_->{descr};
20     }
21     }
22    
23     my %get = (
24     window_size => sub { [ ($_[0]->allocation->values)[2,3] ] },
25     #window_pos => sub { die KGS::Listener::Debug::dumpval [ $_[0]->get_root_origin ] },
26 pcg 1.5 column_size => sub { $_[0]->get("width") || $_[0]->get("fixed_width") },
27 pcg 1.10 modelsortorder => sub { [ $_[0]->get_sort_column_id ] },
28 pcg 1.1 );
29    
30     my %set = (
31 pcg 1.8 window_size => sub { $_[0]->set_default_size (@{$_[1]}) },
32     #window_pos => sub { $_[0]->set_uposition (@{$_[1]}) if @{$_[1]} },
33     column_size => sub { $_[0]->set (fixed_width => $_[1]) },
34 pcg 1.10 modelsortorder => sub { $_[0]->set_sort_column_id (@{$_[1]}) },
35 pcg 1.1 );
36    
37 pcg 1.5 my %widget;
38    
39 pcg 1.1 sub state {
40     my ($widget, $class, $instance, %attr) = @_;
41    
42     while (my ($k, $v) = each %attr) {
43     my ($set, $get) = $k =~ /=/ ? split /=/, $k : ($k, $k);
44 pcg 1.9
45     $v = $state->{$class}{"*"}{$get}
46     if exists $state->{$class}{"*"} && exists $state->{$class}{"*"}{$get};
47    
48     $v = $state->{$class}{$instance}{$get}
49     if defined $instance
50     && exists $state->{$class}{$instance} && exists $state->{$class}{$instance}{$get};
51    
52 pcg 1.1 $set{$get} ? $set{$get}->($widget, $v) : $widget->set($set => $v);
53 pcg 1.9
54     my $vx = KGS::Listener::Debug::dumpval $v; $vx =~ s/\s+/ /g; warn "set $class ($instance) $set => $vx\n";#d#
55 pcg 1.1 }
56    
57 pcg 1.8 #$widget->signal_connect(destroy => sub { delete $widget{$widget}; 0 });
58 pcg 1.1
59 pcg 1.5 $widget{$widget} = [$widget, $class, $instance, \%attr];
60     Scalar::Util::weaken $widget{$widget}[0];
61 pcg 1.1 }
62    
63     sub save_state {
64 pcg 1.5 for (grep $_, values %widget) {
65     my ($widget, $class, $instance, $attr) = @$_;
66    
67 pcg 1.8 next unless $widget; # no destroy => widget may be undef
68    
69 pcg 1.5 $widget->realize if $widget->can("realize");
70    
71     while (my ($k, $v) = each %$attr) {
72     my ($set, $get) = $k =~ /=/ ? split /=/, $k : ($k, $k);
73     $v = $get{$get} ? $get{$get}->($widget) : $widget->get($get);
74    
75     $state->{$class}{"*"}{$get} = $v;
76     $state->{$class}{$instance}{$get} = $v if defined $instance;
77 pcg 1.9
78     my $vx = KGS::Listener::Debug::dumpval $v; $vx =~ s/\s+/ /g; warn "get $class ($instance) $get => $vx\n";#d#
79 pcg 1.1 }
80     }
81 pcg 1.15 }
82    
83     # string => Gtk2::Image
84     sub image_from_data {
85     my ($data) = @_;
86 pcg 1.18 my $img;
87 pcg 1.15
88 pcg 1.18 if (defined $data) {
89     # need to write to file first :/
90     my ($fh, $filename) = File::Temp::tempfile ();
91     syswrite $fh, $data;
92     close $fh;
93     $img = new_from_file Gtk2::Image $filename;
94     unlink $filename;
95     } else {
96     $img = new_from_file Gtk2::Image "$::IMGDIR/default_userpic.png";
97     }
98 pcg 1.15
99     $img;
100 pcg 1.1 }
101    
102 pcg 1.2 package gtk::widget;
103    
104     # hacked gtk pseudo-widget
105    
106 pcg 1.3 sub new {
107     my $class = shift;
108     bless { @_ }, $class;
109     }
110    
111 pcg 1.2 sub widget { $_[0]{widget} }
112    
113     sub AUTOLOAD {
114 pcg 1.3 $AUTOLOAD =~ /::([^:]+)$/ or Carp::confess "$AUTOLOAD: no such method (illegal name)";
115 pcg 1.5 ref $_[0]{widget} or Carp::confess "AUTOLOAD: non-method call $AUTOLOAD(@_)\n";
116 pcg 1.3 my $method = $_[0]{widget}->can($1)
117     or Carp::confess "$AUTOLOAD: no such method";
118     # do NOT cache.. we are fats enough this way
119     unshift @_, shift->{widget};
120     &$method;
121     }
122    
123 pcg 1.5 sub destroy {
124     my ($self) = @_;
125 pcg 1.14 warn "destroy($self)";#d#
126 pcg 1.12
127 pcg 1.5 for (keys %$self) {
128     (delete $self->{$_})->destroy
129 pcg 1.13 if UNIVERSAL::can ($self->{$_}, "destroy");
130     # if (UNIVERSAL::isa ($self->{$_}, Glib::Object)
131     # && UNIVERSAL::isa ($self->{$_}, gtk::widget))
132     # && $self->{$_}->can("destroy");
133 pcg 1.5 }
134     }
135    
136     sub DESTROY {
137     my ($self) = @_;
138 pcg 1.14 warn "DESTROY($self)";#d#
139 pcg 1.5 }
140    
141 pcg 1.3 package gtk::text;
142    
143     use base gtk::widget;
144    
145     sub new {
146     my $class = shift;
147     my $self = $class->SUPER::new(@_);
148    
149     $self->{buffer} = new Gtk2::TextBuffer undef;
150    
151 pcg 1.16 $self->{widget} = new Gtk2::ScrolledWindow;
152     $self->{widget}->set_policy("never", "always");
153 pcg 1.3
154 pcg 1.16 $self->{widget}->add ($self->{view} = new_with_buffer Gtk2::TextView $self->{buffer});
155     $self->{view}->set_wrap_mode ("word");
156    
157     $self->set_end;
158 pcg 1.6
159 pcg 1.3 $self;
160     }
161    
162 pcg 1.16 sub set_end {
163     my ($self) = @_;
164    
165     # this is probably also a hack...
166     $self->{idle} ||= add Glib::Idle sub {
167     $self->{view}->scroll_to_iter ($self->{buffer}->get_end_iter, 0, 0, 0, 0)
168     if $self->{view};
169     delete $self->{idle};
170     };
171     }
172    
173     sub at_end {
174     my ($self) = @_;
175    
176 pcg 1.17 # this is, maybe, a bad hack :/
177 pcg 1.16 my $adj = $self->{widget}->get_vadjustment;
178     $adj->value + $adj->page_size >= $adj->upper - 0.5;
179     }
180    
181 pcg 1.4 sub append_text {
182 pcg 1.5 my ($self, $text) = @_;
183    
184 pcg 1.16 my $at_end = $self->at_end;
185    
186 pcg 1.5 $self->{buffer}->insert ($self->{buffer}->get_end_iter, $text);
187 pcg 1.16
188     $self->set_end if $at_end;
189 pcg 1.4 }
190    
191 pcg 1.3 sub set_text {
192     my ($self, $text) = @_;
193 pcg 1.4
194 pcg 1.16 my $at_end = $self->at_end;
195    
196 pcg 1.5 $self->{buffer}->set_text ("");
197     $self->append_text ($text);
198 pcg 1.16
199     $self->set_end if $at_end;
200 pcg 1.1 }
201    
202     1;
203