ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/kgsueme/gtk.pl
Revision: 1.35
Committed: Tue Jun 8 17:35:00 2004 UTC (19 years, 11 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 1.34: +2 -4 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 style "whitestyle" {
16 fg[NORMAL] = "#000000"
17 bg[NORMAL] = "#ffffff"
18 }
19 style "blackstyle" {
20 fg[NORMAL] = "#ffffff"
21 bg[NORMAL] = "#000000"
22 }
23
24 widget "*.userpanel-0.*" style "blackstyle"
25 widget "*.userpanel-1.*" style "whitestyle"
26
27 EOF
28
29 sub flush {
30 do {
31 flush Gtk2::Gdk;
32 Glib::MainContext->default->iteration (0);
33 } while Gtk2::Gdk->events_pending;
34 }
35
36 sub for_all($) {
37 (
38 $_[0],
39 $_[0]->isa (Gtk2::Container)
40 ? map for_all ($_), $_[0]->get_children
41 : ()
42 )
43 }
44
45 sub double_buffered {
46 return;#d#
47 my ($widget, $state) = @_;
48
49 for (for_all $widget) {
50 $_->set_double_buffered ($state);
51 print "$_\n";#d#
52 }
53 print "<<<\n";#d#
54 }
55
56 our $text_renderer = new Gtk2::CellRendererText;
57 our $int_renderer = new Gtk2::CellRendererText;
58 $int_renderer->set (xalign => 1);
59
60 our $state = $util::state->{gtk} ||= {};
61
62 # shows the properties of a glib object
63 sub info {
64 my ($idx, $obj) = @_;
65 return if $seen{$idx}++;
66 print "\n$idx\n";
67 for ($obj->list_properties) {
68 printf "%-16s %-24s %-24s %s\n", $_->{name}, $_->{type}, (join ":", @{$_->{flags}}), $_->{descr};
69 }
70 }
71
72 my %get = (
73 window_size => sub { [ ($_[0]->allocation->values)[2,3] ] },
74 #window_pos => sub { die KGS::Listener::Debug::dumpval [ $_[0]->get_root_origin ] },
75 column_size => sub { $_[0]->get("width") || $_[0]->get("fixed_width") },
76 modelsortorder => sub { [ $_[0]->get_sort_column_id ] },
77 );
78
79 my %set = (
80 window_size => sub { $_[0]->set_default_size (@{$_[1]}) },
81 #window_pos => sub { $_[0]->set_uposition (@{$_[1]}) if @{$_[1]} },
82 column_size => sub { $_[0]->set (fixed_width => $_[1]) },
83 modelsortorder => sub { $_[0]->set_sort_column_id (@{$_[1]}) },
84 );
85
86 my %widget;
87
88 sub state {
89 my ($widget, $class, $instance, %attr) = @_;
90
91 while (my ($k, $v) = each %attr) {
92 my ($set, $get) = $k =~ /=/ ? split /=/, $k : ($k, $k);
93
94 $v = $state->{$class}{"*"}{$get}
95 if exists $state->{$class}{"*"} && exists $state->{$class}{"*"}{$get};
96
97 $v = $state->{$class}{$instance}{$get}
98 if defined $instance
99 && exists $state->{$class}{$instance} && exists $state->{$class}{$instance}{$get};
100
101 $set{$get} ? $set{$get}->($widget, $v) : $widget->set($set => $v);
102
103 #my $vx = KGS::Listener::Debug::dumpval $v; $vx =~ s/\s+/ /g; warn "set $class ($instance) $set => $vx\n";#d#
104 }
105
106 #$widget->signal_connect(destroy => sub { delete $widget{$widget}; 0 });
107
108 $widget{$widget} = [$widget, $class, $instance, \%attr];
109 Scalar::Util::weaken $widget{$widget}[0];
110 }
111
112 sub save_state {
113 for (grep $_, values %widget) {
114 my ($widget, $class, $instance, $attr) = @$_;
115
116 next unless $widget; # no destroy => widget may be undef
117
118 $widget->realize if $widget->can("realize");
119
120 while (my ($k, $v) = each %$attr) {
121 my ($set, $get) = $k =~ /=/ ? split /=/, $k : ($k, $k);
122 $v = $get{$get} ? $get{$get}->($widget) : $widget->get($get);
123
124 $state->{$class}{"*"}{$get} = $v;
125 $state->{$class}{$instance}{$get} = $v if defined $instance;
126
127 #my $vx = KGS::Listener::Debug::dumpval $v; $vx =~ s/\s+/ /g; warn "get $class ($instance) $get => $vx\n";#d#
128 }
129 }
130 }
131
132 # string => Gtk2::Image
133 sub image_from_data {
134 my ($data) = @_;
135 my $img;
136
137 if (defined $data) {
138 # need to write to file first :/
139 my ($fh, $filename) = File::Temp::tempfile ();
140 syswrite $fh, $data;
141 close $fh;
142 $img = new_from_file Gtk2::Image $filename;
143 unlink $filename;
144 } else {
145 $img = new_from_file Gtk2::Image KGS::Constants::findfile "KGS/kgsueme/images/default_userpic.png";
146 }
147
148 $img;
149 }
150
151 #############################################################################
152
153 sub optionmenu {
154 my ($ref, @entry) = @_;
155
156 my @vals;
157
158 my $widget = new Gtk2::OptionMenu;
159 $widget->set (menu => my $menu = new Gtk2::Menu);
160
161 my $idx = 0;
162
163 while (@entry >= 2) {
164 my $value = shift @entry;
165 my $label = shift @entry;
166
167 $menu->append (new Gtk2::MenuItem $label);
168 push @vals, $value;
169
170 if ($value eq $$ref && $idx >= 0) {
171 $widget->set_history ($idx);
172 $idx = -1e6;
173 }
174 $idx++;
175 }
176
177 my $cb = shift @entry;
178
179 $widget->signal_connect (changed => sub {
180 my $new = $vals[$_[0]->get_history];
181
182 if ($new ne $$ref) {
183 $$ref = $new;
184 $cb->($new) if $cb;
185 }
186 });
187
188 $widget;
189 }
190
191 sub textentry {
192 my ($ref, $width, $cb) = @_;
193
194 my $widget = new Gtk2::Entry;
195 $widget->set (text => $$ref, width_chars => $width);
196 $widget->signal_connect (changed => sub {
197 $$ref = $_[0]->get_text;
198 $cb->($$ref) if $cb;
199 });
200
201 $widget;
202 }
203
204 sub numentry {
205 my ($ref, $width, $cb) = @_;
206
207 my $widget = new Gtk2::Entry;
208 $widget->set (text => $$ref, width_chars => $width, xalign => 1);
209 $widget->signal_connect (changed => sub {
210 $$ref = $_[0]->get_text;
211 $cb->($$ref) if $cb;
212 });
213
214 $widget;
215 }
216
217 sub timeentry {
218 my ($ref, $width, $cb) = @_;
219
220 my $widget = new Gtk2::Entry;
221 $widget->set (text => util::format_time $$ref, width_chars => $width, xalign => 1);
222 $widget->signal_connect (changed => sub {
223 $$ref = util::parse_time $_[0]->get_text;
224 $cb->($$ref) if $cb;
225 });
226
227 $widget;
228 }
229
230 sub button {
231 my ($label, $cb) = @_;
232
233 my $widget = new_with_label Gtk2::Button $label;
234 $widget->signal_connect (clicked => sub { $cb->() if $cb });
235
236 $widget;
237 }
238
239 1;
240