ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/kgsueme/gtk.pl
Revision: 1.14
Committed: Sun Jun 1 11:10:01 2003 UTC (21 years ago) by pcg
Content type: text/plain
Branch: MAIN
Changes since 1.13: +2 -2 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 return 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 my %get = (
22 window_size => sub { [ ($_[0]->allocation->values)[2,3] ] },
23 #window_pos => sub { die KGS::Listener::Debug::dumpval [ $_[0]->get_root_origin ] },
24 column_size => sub { $_[0]->get("width") || $_[0]->get("fixed_width") },
25 modelsortorder => sub { [ $_[0]->get_sort_column_id ] },
26 );
27
28 my %set = (
29 window_size => sub { $_[0]->set_default_size (@{$_[1]}) },
30 #window_pos => sub { $_[0]->set_uposition (@{$_[1]}) if @{$_[1]} },
31 column_size => sub { $_[0]->set (fixed_width => $_[1]) },
32 modelsortorder => sub { $_[0]->set_sort_column_id (@{$_[1]}) },
33 );
34
35 my %widget;
36
37 sub state {
38 my ($widget, $class, $instance, %attr) = @_;
39
40 while (my ($k, $v) = each %attr) {
41 my ($set, $get) = $k =~ /=/ ? split /=/, $k : ($k, $k);
42
43 $v = $state->{$class}{"*"}{$get}
44 if exists $state->{$class}{"*"} && exists $state->{$class}{"*"}{$get};
45
46 $v = $state->{$class}{$instance}{$get}
47 if defined $instance
48 && exists $state->{$class}{$instance} && exists $state->{$class}{$instance}{$get};
49
50 $set{$get} ? $set{$get}->($widget, $v) : $widget->set($set => $v);
51
52 my $vx = KGS::Listener::Debug::dumpval $v; $vx =~ s/\s+/ /g; warn "set $class ($instance) $set => $vx\n";#d#
53 }
54
55 #$widget->signal_connect(destroy => sub { delete $widget{$widget}; 0 });
56
57 $widget{$widget} = [$widget, $class, $instance, \%attr];
58 Scalar::Util::weaken $widget{$widget}[0];
59 }
60
61 sub save_state {
62 for (grep $_, values %widget) {
63 my ($widget, $class, $instance, $attr) = @$_;
64
65 next unless $widget; # no destroy => widget may be undef
66
67 $widget->realize if $widget->can("realize");
68
69 while (my ($k, $v) = each %$attr) {
70 my ($set, $get) = $k =~ /=/ ? split /=/, $k : ($k, $k);
71 $v = $get{$get} ? $get{$get}->($widget) : $widget->get($get);
72
73 $state->{$class}{"*"}{$get} = $v;
74 $state->{$class}{$instance}{$get} = $v if defined $instance;
75
76 my $vx = KGS::Listener::Debug::dumpval $v; $vx =~ s/\s+/ /g; warn "get $class ($instance) $get => $vx\n";#d#
77 }
78 }
79 }
80
81 package gtk::widget;
82
83 # hacked gtk pseudo-widget
84
85 sub new {
86 my $class = shift;
87 bless { @_ }, $class;
88 }
89
90 sub widget { $_[0]{widget} }
91
92 sub AUTOLOAD {
93 $AUTOLOAD =~ /::([^:]+)$/ or Carp::confess "$AUTOLOAD: no such method (illegal name)";
94 ref $_[0]{widget} or Carp::confess "AUTOLOAD: non-method call $AUTOLOAD(@_)\n";
95 my $method = $_[0]{widget}->can($1)
96 or Carp::confess "$AUTOLOAD: no such method";
97 # do NOT cache.. we are fats enough this way
98 unshift @_, shift->{widget};
99 &$method;
100 }
101
102 sub destroy {
103 my ($self) = @_;
104 warn "destroy($self)";#d#
105
106 for (keys %$self) {
107 (delete $self->{$_})->destroy
108 if UNIVERSAL::can ($self->{$_}, "destroy");
109 # if (UNIVERSAL::isa ($self->{$_}, Glib::Object)
110 # && UNIVERSAL::isa ($self->{$_}, gtk::widget))
111 # && $self->{$_}->can("destroy");
112 }
113 }
114
115 sub DESTROY {
116 my ($self) = @_;
117 warn "DESTROY($self)";#d#
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_with_buffer Gtk2::TextView $self->{buffer};
131
132 $self->{widget}->set_wrap_mode ("word");
133
134 $self;
135 }
136
137 sub append_text {
138 my ($self, $text) = @_;
139
140 $self->{buffer}->insert ($self->{buffer}->get_end_iter, $text);
141 }
142
143 sub set_text {
144 my ($self, $text) = @_;
145
146 $self->{buffer}->set_text ("");
147 $self->append_text ($text);
148 }
149
150 1;
151