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

# Content
1 package gtk;
2
3 use Carp;
4
5 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 sub info {
13 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 }
99
100 package gtk::widget;
101
102 # hacked gtk pseudo-widget
103
104 sub new {
105 my $class = shift;
106 bless { @_ }, $class;
107 }
108
109 sub widget { $_[0]{widget} }
110
111 sub AUTOLOAD {
112 $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 }
138
139 1;
140