ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/kgsueme/gtk.pl
Revision: 1.31
Committed: Tue Jun 1 10:11:14 2004 UTC (20 years ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.30: +27 -0 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 package gtk;
2
3 use Carp;
4 use File::Temp;
5 use Gtk2;
6
7 # I have not yet found a way to simply default style properties
8 Gtk2::Rc->parse_string(<<EOF);
9
10 style "base" {
11 GtkTreeView::vertical_separator = 0
12 }
13 widget_class "*" style "base"
14
15 EOF
16
17 sub flush {
18 do {
19 flush Gtk2::Gdk;
20 Glib::MainContext->default->iteration (0);
21 } while Gtk2::Gdk->events_pending;
22 }
23
24 sub for_all($) {
25 (
26 $_[0],
27 $_[0]->isa (Gtk2::Container)
28 ? map for_all ($_), $_[0]->get_children
29 : ()
30 )
31 }
32
33 sub double_buffered {
34 return;#d#
35 my ($widget, $state) = @_;
36
37 for (for_all $widget) {
38 $_->set_double_buffered ($state);
39 print "$_\n";#d#
40 }
41 print "<<<\n";#d#
42 }
43
44 our $text_renderer = new Gtk2::CellRendererText;
45 our $int_renderer = new Gtk2::CellRendererText;
46 $int_renderer->set (xalign => 1);
47
48 our $state = $util::state->{gtk} ||= {};
49
50 # shows the properties of a glib object
51 sub info {
52 my ($idx, $obj) = @_;
53 return if $seen{$idx}++;
54 print "\n$idx\n";
55 for ($obj->list_properties) {
56 printf "%-16s %-24s %-24s %s\n", $_->{name}, $_->{type}, (join ":", @{$_->{flags}}), $_->{descr};
57 }
58 }
59
60 my %get = (
61 window_size => sub { [ ($_[0]->allocation->values)[2,3] ] },
62 #window_pos => sub { die KGS::Listener::Debug::dumpval [ $_[0]->get_root_origin ] },
63 column_size => sub { $_[0]->get("width") || $_[0]->get("fixed_width") },
64 modelsortorder => sub { [ $_[0]->get_sort_column_id ] },
65 );
66
67 my %set = (
68 window_size => sub { $_[0]->set_default_size (@{$_[1]}) },
69 #window_pos => sub { $_[0]->set_uposition (@{$_[1]}) if @{$_[1]} },
70 column_size => sub { $_[0]->set (fixed_width => $_[1]) },
71 modelsortorder => sub { $_[0]->set_sort_column_id (@{$_[1]}) },
72 );
73
74 my %widget;
75
76 sub state {
77 my ($widget, $class, $instance, %attr) = @_;
78
79 while (my ($k, $v) = each %attr) {
80 my ($set, $get) = $k =~ /=/ ? split /=/, $k : ($k, $k);
81
82 $v = $state->{$class}{"*"}{$get}
83 if exists $state->{$class}{"*"} && exists $state->{$class}{"*"}{$get};
84
85 $v = $state->{$class}{$instance}{$get}
86 if defined $instance
87 && exists $state->{$class}{$instance} && exists $state->{$class}{$instance}{$get};
88
89 $set{$get} ? $set{$get}->($widget, $v) : $widget->set($set => $v);
90
91 #my $vx = KGS::Listener::Debug::dumpval $v; $vx =~ s/\s+/ /g; warn "set $class ($instance) $set => $vx\n";#d#
92 }
93
94 #$widget->signal_connect(destroy => sub { delete $widget{$widget}; 0 });
95
96 $widget{$widget} = [$widget, $class, $instance, \%attr];
97 Scalar::Util::weaken $widget{$widget}[0];
98 }
99
100 sub save_state {
101 for (grep $_, values %widget) {
102 my ($widget, $class, $instance, $attr) = @$_;
103
104 next unless $widget; # no destroy => widget may be undef
105
106 $widget->realize if $widget->can("realize");
107
108 while (my ($k, $v) = each %$attr) {
109 my ($set, $get) = $k =~ /=/ ? split /=/, $k : ($k, $k);
110 $v = $get{$get} ? $get{$get}->($widget) : $widget->get($get);
111
112 $state->{$class}{"*"}{$get} = $v;
113 $state->{$class}{$instance}{$get} = $v if defined $instance;
114
115 #my $vx = KGS::Listener::Debug::dumpval $v; $vx =~ s/\s+/ /g; warn "get $class ($instance) $get => $vx\n";#d#
116 }
117 }
118 }
119
120 # string => Gtk2::Image
121 sub image_from_data {
122 my ($data) = @_;
123 my $img;
124
125 if (defined $data) {
126 # need to write to file first :/
127 my ($fh, $filename) = File::Temp::tempfile ();
128 syswrite $fh, $data;
129 close $fh;
130 $img = new_from_file Gtk2::Image $filename;
131 unlink $filename;
132 } else {
133 $img = new_from_file Gtk2::Image KGS::Constants::findfile "KGS/kgsueme/images/default_userpic.png";
134 }
135
136 $img;
137 }
138
139 package gtk::widget;
140
141 # hacked gtk pseudo-widget
142
143 sub new {
144 my $class = shift;
145 bless { @_ }, $class;
146 }
147
148 sub widget { $_[0]{widget} }
149
150 sub AUTOLOAD {
151 $AUTOLOAD =~ /::([^:]+)$/ or Carp::confess "$AUTOLOAD: no such method (illegal name)";
152 ref $_[0]{widget} or Carp::confess "AUTOLOAD: non-method call $AUTOLOAD(@_)\n";
153 my $method = $_[0]{widget}->can ($1)
154 or Carp::confess "$AUTOLOAD: no such method";
155 # do NOT cache.. we are fats enough this way
156 unshift @_, shift->{widget};
157 &$method;
158 }
159
160 sub destroy {
161 my ($self) = @_;
162 warn "destroy($self)";#d#
163
164 delete $self->{app};
165
166 for (keys %$self) {
167 warn "$self->{$_} destroy" if UNIVERSAL::can ($self->{$_}, "destroy");
168 (delete $self->{$_})->destroy
169 if UNIVERSAL::can ($self->{$_}, "destroy");
170 # if (UNIVERSAL::isa ($self->{$_}, Glib::Object)
171 # && UNIVERSAL::isa ($self->{$_}, gtk::widget))
172 # && $self->{$_}->can("destroy");
173 }
174 }
175
176 sub DESTROY {
177 my ($self) = @_;
178 warn "DESTROY($self)";#d#
179 }
180
181 1;
182