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