… | |
… | |
134 | } |
134 | } |
135 | |
135 | |
136 | $img; |
136 | $img; |
137 | } |
137 | } |
138 | |
138 | |
|
|
139 | ############################################################################# |
|
|
140 | |
|
|
141 | sub optionmenu { |
|
|
142 | my ($ref, @entry) = @_; |
|
|
143 | |
|
|
144 | my @vals; |
|
|
145 | |
|
|
146 | my $widget = new Gtk2::OptionMenu; |
|
|
147 | $widget->set (menu => my $menu = new Gtk2::Menu); |
|
|
148 | |
|
|
149 | my $idx = 0; |
|
|
150 | |
|
|
151 | while (@entry >= 2) { |
|
|
152 | my $value = shift @entry; |
|
|
153 | my $label = shift @entry; |
|
|
154 | |
|
|
155 | $menu->append (new Gtk2::MenuItem $label); |
|
|
156 | push @vals, $value; |
|
|
157 | |
|
|
158 | if ($value eq $$ref && $idx >= 0) { |
|
|
159 | $widget->set_history ($idx); |
|
|
160 | $idx = -1e6; |
|
|
161 | } |
|
|
162 | $idx++; |
|
|
163 | } |
|
|
164 | |
|
|
165 | my $cb = shift @entry; |
|
|
166 | |
|
|
167 | $widget->signal_connect (changed => sub { |
|
|
168 | my $new = $vals[$_[0]->get_history]; |
|
|
169 | |
|
|
170 | if ($new ne $$ref) { |
|
|
171 | $$ref = $new; |
|
|
172 | $cb->($new) if $cb; |
|
|
173 | } |
|
|
174 | }); |
|
|
175 | |
|
|
176 | $widget; |
|
|
177 | } |
|
|
178 | |
|
|
179 | sub textentry { |
|
|
180 | my ($ref, $width, $cb) = @_; |
|
|
181 | |
|
|
182 | my $widget = new Gtk2::Entry; |
|
|
183 | $widget->set (text => $$ref, width_chars => $width); |
|
|
184 | $widget->signal_connect (changed => sub { |
|
|
185 | $$ref = $_[0]->get_text; |
|
|
186 | $cb->($$ref) if $cb; |
|
|
187 | }); |
|
|
188 | |
|
|
189 | $widget; |
|
|
190 | } |
|
|
191 | |
|
|
192 | sub numentry { |
|
|
193 | my ($ref, $width, $cb) = @_; |
|
|
194 | |
|
|
195 | my $widget = new Gtk2::Entry; |
|
|
196 | $widget->set (text => $$ref, width_chars => $width); |
|
|
197 | eval { $widget->set (xalign => 1) }; # workaround für 2.2 |
|
|
198 | $widget->signal_connect (changed => sub { |
|
|
199 | $$ref = $_[0]->get_text; |
|
|
200 | $cb->($$ref) if $cb; |
|
|
201 | }); |
|
|
202 | |
|
|
203 | $widget; |
|
|
204 | } |
|
|
205 | |
|
|
206 | sub timeentry { |
|
|
207 | my ($ref, $width, $cb) = @_; |
|
|
208 | |
|
|
209 | my $widget = new Gtk2::Entry; |
|
|
210 | $widget->set (text => util::format_time $$ref, width_chars => $width); |
|
|
211 | eval { $widget->set (xalign => 1) }; # workaround für 2.2 |
|
|
212 | $widget->signal_connect (changed => sub { |
|
|
213 | $$ref = util::parse_time $_[0]->get_text; |
|
|
214 | $cb->($$ref) if $cb; |
|
|
215 | }); |
|
|
216 | |
|
|
217 | $widget; |
|
|
218 | } |
|
|
219 | |
|
|
220 | sub button { |
|
|
221 | my ($label, $cb) = @_; |
|
|
222 | |
|
|
223 | my $widget = new_with_label Gtk2::Button $label; |
|
|
224 | $widget->signal_connect (clicked => sub { $cb->() if $cb }); |
|
|
225 | |
|
|
226 | $widget; |
|
|
227 | } |
|
|
228 | |
139 | package gtk::widget; |
229 | package gtk::widget; |
140 | |
230 | |
141 | # hacked gtk pseudo-widget |
231 | # hacked gtk pseudo-widget |
142 | |
232 | |
143 | sub new { |
233 | sub new { |