… | |
… | |
219 | $_[0]{children}[0]->size_request if $_[0]{children}[0]; |
219 | $_[0]{children}[0]->size_request if $_[0]{children}[0]; |
220 | } |
220 | } |
221 | |
221 | |
222 | sub size_allocate { |
222 | sub size_allocate { |
223 | my ($self, $w, $h) = @_; |
223 | my ($self, $w, $h) = @_; |
|
|
224 | |
224 | $self->SUPER::size_allocate ($w, $h); |
225 | $self->SUPER::size_allocate ($w, $h); |
225 | $self->{children}[0]->size_allocate ($w, $h) |
226 | $self->{children}[0]->size_allocate ($w, $h) |
226 | if $self->{children}[0] |
227 | if $self->{children}[0] |
227 | } |
228 | } |
228 | |
229 | |
… | |
… | |
236 | my ($self) = @_; |
237 | my ($self) = @_; |
237 | |
238 | |
238 | ::refresh (); |
239 | ::refresh (); |
239 | } |
240 | } |
240 | |
241 | |
|
|
242 | sub add { |
|
|
243 | my ($self, $widget) = @_; |
|
|
244 | |
|
|
245 | $self->SUPER::add ($widget); |
|
|
246 | |
|
|
247 | $widget->size_allocate ($widget->size_request); |
|
|
248 | } |
|
|
249 | |
241 | ############################################################################# |
250 | ############################################################################# |
242 | |
251 | |
243 | package Crossfire::Client::Widget::Window; |
252 | package Crossfire::Client::Widget::Window; |
244 | |
253 | |
245 | our @ISA = Crossfire::Client::Widget::Bin::; |
254 | our @ISA = Crossfire::Client::Widget::Bin::; |
246 | |
255 | |
247 | use SDL::OpenGL; |
256 | use SDL::OpenGL; |
248 | |
257 | |
249 | sub add { |
258 | sub new { |
250 | my ($self, $chld) = @_; |
259 | my ($class, $x, $y, $z, $w, $h) = @_; |
251 | warn "ADD $chld\n"; |
|
|
252 | $self->SUPER::add ($chld); |
|
|
253 | $chld->set_parent ($self); |
|
|
254 | } |
|
|
255 | |
260 | |
256 | sub remove { |
261 | my $self = $class->SUPER::new; |
257 | my ($self) = @_; |
262 | |
258 | # TODO FIXME: removing a child from a window will crash, see render_chld |
263 | @$self{qw(x y z w h)} = ($x, $y, $z, $w, $h); |
259 | # $self->update; |
|
|
260 | } |
264 | } |
261 | |
265 | |
262 | sub update { |
266 | sub update { |
263 | my ($self) = @_; |
267 | my ($self) = @_; |
|
|
268 | |
264 | $self->render_chld; |
269 | $self->render_chld; |
|
|
270 | $self->SUPER::update; |
265 | } |
271 | } |
266 | |
272 | |
267 | sub render_chld { |
273 | sub render_chld { |
268 | my ($self) = @_; |
274 | my ($self) = @_; |
269 | my $chld = $self->get; |
|
|
270 | my ($w, $h) = $self->size_request; |
|
|
271 | |
275 | |
272 | require Carp; |
|
|
273 | Carp::cluck "RENDERCHI $w $h"; |
|
|
274 | warn "RENDERCHI $w $h\n"; |
|
|
275 | $self->{texture} = |
276 | $self->{texture} = |
276 | Crossfire::Client::Texture->new_from_opengl ( |
277 | Crossfire::Client::Texture->new_from_opengl ( |
277 | $w, $h, sub { $chld->draw } |
278 | $self->{w}, $self->{h}, sub { $self->child->draw } |
278 | ); |
279 | ); |
279 | $self->{texture}->upload; |
|
|
280 | } |
|
|
281 | |
|
|
282 | sub size_request { |
|
|
283 | my ($self) = @_; |
|
|
284 | ($self->w, $self->h) |
|
|
285 | } |
280 | } |
286 | |
281 | |
287 | sub size_allocate { |
282 | sub size_allocate { |
288 | my ($self, $w, $h) = @_; |
283 | my ($self, $w, $h) = @_; |
289 | |
284 | |
290 | $self->w ($w); |
285 | $self->{w} = $w; |
291 | $self->h ($h); |
286 | $self->{h} = $h; |
|
|
287 | |
292 | $self->get->size_allocate ($w, $h); |
288 | $self->child->size_allocate ($w, $h); |
293 | |
289 | |
294 | $self->update; #TODO: Move this to the size_request event propably? |
290 | $self->render_chld; |
295 | } |
291 | } |
296 | |
292 | |
297 | sub _draw { |
293 | sub _draw { |
298 | my ($self) = @_; |
294 | my ($self) = @_; |
299 | |
295 | |
… | |
… | |
336 | map { $_ + 4 } $chld->size_request; |
332 | map { $_ + 4 } $chld->size_request; |
337 | } |
333 | } |
338 | |
334 | |
339 | sub size_allocate { |
335 | sub size_allocate { |
340 | my ($self, $w, $h) = @_; |
336 | my ($self, $w, $h) = @_; |
341 | |
337 | |
342 | $self->SUPER::size_allocate ($w, $h); |
338 | $self->{w} = $w; |
|
|
339 | $self->{h} = $h; |
343 | |
340 | |
344 | $self->child->size_allocate ($w - 4, $h - 4); |
341 | $self->child->size_allocate ($w - 4, $h - 4); |
345 | $self->child->move (2, 2); |
342 | $self->child->move (2, 2); |
346 | } |
343 | } |
347 | |
344 | |