… | |
… | |
2407 | sub draw { |
2407 | sub draw { |
2408 | my ($self) = @_; |
2408 | my ($self) = @_; |
2409 | |
2409 | |
2410 | my $tex = $::CONN->{texture}[$::CONN->{faceid}[$self->{face}]]; |
2410 | my $tex = $::CONN->{texture}[$::CONN->{faceid}[$self->{face}]]; |
2411 | |
2411 | |
|
|
2412 | # TODO animation |
2412 | if ($tex) { |
2413 | if ($tex) { |
2413 | glEnable GL_BLEND; |
2414 | glEnable GL_BLEND; |
2414 | glBlendFunc GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA; |
2415 | glBlendFunc GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA; |
2415 | glEnable GL_TEXTURE_2D; |
2416 | glEnable GL_TEXTURE_2D; |
2416 | glTexEnv GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE; |
2417 | glTexEnv GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE; |
… | |
… | |
2421 | } |
2422 | } |
2422 | } |
2423 | } |
2423 | |
2424 | |
2424 | ############################################################################# |
2425 | ############################################################################# |
2425 | |
2426 | |
|
|
2427 | package CFClient::UI::Menu; |
|
|
2428 | |
|
|
2429 | our @ISA = CFClient::UI::FancyFrame::; |
|
|
2430 | |
|
|
2431 | use CFClient::OpenGL; |
|
|
2432 | |
|
|
2433 | sub new { |
|
|
2434 | my $class = shift; |
|
|
2435 | |
|
|
2436 | my $self = $class->SUPER::new ( |
|
|
2437 | items => [], |
|
|
2438 | z => 100, |
|
|
2439 | @_, |
|
|
2440 | ); |
|
|
2441 | |
|
|
2442 | $self->add ($self->{vbox} = new CFClient::UI::VBox); |
|
|
2443 | |
|
|
2444 | for my $item (@{ $self->{items} }) { |
|
|
2445 | my ($widget, $cb) = @$item; |
|
|
2446 | |
|
|
2447 | # handle various types of items, only text for now |
|
|
2448 | if (!ref $widget) { |
|
|
2449 | $widget = new CFClient::UI::Label |
|
|
2450 | can_hover => 1, |
|
|
2451 | can_events => 1, |
|
|
2452 | text => $widget; |
|
|
2453 | } |
|
|
2454 | |
|
|
2455 | $self->{item}{$widget} = $item; |
|
|
2456 | |
|
|
2457 | $self->{vbox}->add ($widget); |
|
|
2458 | } |
|
|
2459 | |
|
|
2460 | $self |
|
|
2461 | } |
|
|
2462 | |
|
|
2463 | # popup given the event (must be a mouse button down event currently) |
|
|
2464 | sub popup { |
|
|
2465 | my ($self, $ev) = @_; |
|
|
2466 | |
|
|
2467 | $self->emit ("popdown"); |
|
|
2468 | |
|
|
2469 | # maybe save $GRAB? must be careful about events... |
|
|
2470 | $GRAB = $self; |
|
|
2471 | $self->{button} = $ev->{button}; |
|
|
2472 | |
|
|
2473 | $self->show; |
|
|
2474 | $self->move ($ev->{x} - $self->{w} * 0.5, $ev->{y} - $self->{h} * 0.5); |
|
|
2475 | } |
|
|
2476 | |
|
|
2477 | sub mouse_motion { |
|
|
2478 | my ($self, $ev, $x, $y) = @_; |
|
|
2479 | |
|
|
2480 | # TODO: should use vbox->fdind_widget or so |
|
|
2481 | $HOVER = $ROOT->find_widget ($ev->{x}, $ev->{y}); |
|
|
2482 | $self->{hover} = $self->{item}{$HOVER}; |
|
|
2483 | } |
|
|
2484 | |
|
|
2485 | sub button_up { |
|
|
2486 | my ($self, $ev, $x, $y) = @_; |
|
|
2487 | |
|
|
2488 | if ($ev->{button} == $self->{button}) { |
|
|
2489 | undef $GRAB; |
|
|
2490 | $self->hide; |
|
|
2491 | |
|
|
2492 | $self->emit ("popdown"); |
|
|
2493 | $self->{hover}[1]->() if $self->{hover}; |
|
|
2494 | } |
|
|
2495 | } |
|
|
2496 | |
|
|
2497 | ############################################################################# |
|
|
2498 | |
2426 | package CFClient::UI::Root; |
2499 | package CFClient::UI::Root; |
2427 | |
2500 | |
2428 | our @ISA = CFClient::UI::Container::; |
2501 | our @ISA = CFClient::UI::Container::; |
2429 | |
2502 | |
2430 | use CFClient::OpenGL; |
2503 | use CFClient::OpenGL; |