… | |
… | |
40 | if (!$GRAB) { |
40 | if (!$GRAB) { |
41 | for (my $widget = $HOVER; $widget; $widget = $widget->{parent}) { |
41 | for (my $widget = $HOVER; $widget; $widget = $widget->{parent}) { |
42 | if (length $widget->{tooltip}) { |
42 | if (length $widget->{tooltip}) { |
43 | |
43 | |
44 | if ($TOOLTIP->{owner} != $widget) { |
44 | if ($TOOLTIP->{owner} != $widget) { |
|
|
45 | $TOOLTIP->hide; |
|
|
46 | |
45 | $TOOLTIP->{owner} = $widget; |
47 | $TOOLTIP->{owner} = $widget; |
46 | |
48 | |
47 | my $tip = $widget->{tooltip}; |
49 | my $tip = $widget->{tooltip}; |
48 | |
50 | |
49 | $tip = $tip->($widget) if CODE:: eq ref $tip; |
51 | $tip = $tip->($widget) if CODE:: eq ref $tip; |
50 | |
52 | |
51 | $TOOLTIP->set_tooltip_from ($widget); |
53 | $TOOLTIP->set_tooltip_from ($widget); |
52 | |
|
|
53 | my ($x, $y) = $widget->coord2global ($widget->{w}, 0); |
|
|
54 | |
|
|
55 | ($x, $y) = $widget->coord2global (-$TOOLTIP->{w}, 0) |
|
|
56 | if $x + $TOOLTIP->{w} > $::WIDTH; |
|
|
57 | |
|
|
58 | $TOOLTIP->move ($x, $y); |
|
|
59 | $TOOLTIP->show; |
54 | $TOOLTIP->show; |
60 | } |
55 | } |
61 | |
56 | |
62 | return; |
57 | return; |
63 | } |
58 | } |
… | |
… | |
1005 | |
1000 | |
1006 | our @ISA = CFClient::UI::Bin::; |
1001 | our @ISA = CFClient::UI::Bin::; |
1007 | |
1002 | |
1008 | use CFClient::OpenGL; |
1003 | use CFClient::OpenGL; |
1009 | |
1004 | |
1010 | my @tex = |
1005 | my $bg = |
|
|
1006 | new_from_file CFClient::Texture CFClient::find_rcfile "d1_bg.png", |
|
|
1007 | mipmap => 1, wrap => 1; |
|
|
1008 | |
|
|
1009 | my @border = |
1011 | map { new_from_file CFClient::Texture CFClient::find_rcfile $_, mipmap => 1 } |
1010 | map { new_from_file CFClient::Texture CFClient::find_rcfile $_, mipmap => 1 } |
1012 | qw(d1_bg.png d1_border_top.png d1_border_right.png d1_border_left.png d1_border_bottom.png); |
1011 | qw(d1_border_top.png d1_border_right.png d1_border_left.png d1_border_bottom.png); |
1013 | |
1012 | |
1014 | sub new { |
1013 | sub new { |
1015 | my $class = shift; |
1014 | my $class = shift; |
1016 | |
1015 | |
1017 | my $self = $class->SUPER::new ( |
1016 | my $self = $class->SUPER::new ( |
… | |
… | |
1132 | glTexEnv GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE; |
1131 | glTexEnv GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE; |
1133 | |
1132 | |
1134 | my $border = $self->border; |
1133 | my $border = $self->border; |
1135 | |
1134 | |
1136 | glColor @{ $self->{border_bg} }; |
1135 | glColor @{ $self->{border_bg} }; |
1137 | $tex[1]->draw_quad_alpha (0, 0, $w, $border); |
1136 | $border[0]->draw_quad_alpha (0, 0, $w, $border); |
1138 | $tex[3]->draw_quad_alpha (0, $border, $border, $ch); |
1137 | $border[1]->draw_quad_alpha (0, $border, $border, $ch); |
1139 | $tex[2]->draw_quad_alpha ($w - $border, $border, $border, $ch); |
1138 | $border[2]->draw_quad_alpha ($w - $border, $border, $border, $ch); |
1140 | $tex[4]->draw_quad_alpha (0, $h - $border, $w, $border); |
1139 | $border[3]->draw_quad_alpha (0, $h - $border, $w, $border); |
1141 | |
1140 | |
1142 | if (@{$self->{bg}} < 4 || $self->{bg}[3]) { |
1141 | if (@{$self->{bg}} < 4 || $self->{bg}[3]) { |
1143 | my $bg = $tex[0]; |
1142 | glColor @{ $self->{bg} }; |
1144 | |
1143 | |
1145 | # TODO: repeat texture not scale |
1144 | # TODO: repeat texture not scale |
|
|
1145 | # solve this better(?) |
1146 | my $rep_x = $cw / $bg->{w}; |
1146 | $bg->{s} = $cw / $bg->{w}; |
1147 | my $rep_y = $ch / $bg->{h}; |
1147 | $bg->{t} = $ch / $bg->{h}; |
1148 | |
|
|
1149 | glColor @{ $self->{bg} }; |
|
|
1150 | |
|
|
1151 | $bg->{s} = $rep_x; |
|
|
1152 | $bg->{t} = $rep_y; |
|
|
1153 | $bg->{wrap_mode} = 1; |
|
|
1154 | $bg->draw_quad_alpha ($border, $border, $cw, $ch); |
1148 | $bg->draw_quad_alpha ($border, $border, $cw, $ch); |
1155 | } |
1149 | } |
1156 | |
1150 | |
1157 | glDisable GL_TEXTURE_2D; |
1151 | glDisable GL_TEXTURE_2D; |
1158 | |
1152 | |
… | |
… | |
2639 | my ($self, $w, $h, $changed) = @_; |
2633 | my ($self, $w, $h, $changed) = @_; |
2640 | |
2634 | |
2641 | return unless $changed; |
2635 | return unless $changed; |
2642 | |
2636 | |
2643 | $self->SUPER::size_allocate ($w - 4, $h - 4, $changed); |
2637 | $self->SUPER::size_allocate ($w - 4, $h - 4, $changed); |
|
|
2638 | } |
|
|
2639 | |
|
|
2640 | sub visibility_change { |
|
|
2641 | my ($self, $visible) = @_; |
|
|
2642 | |
|
|
2643 | return unless $visible; |
|
|
2644 | |
|
|
2645 | $self->{root}->on_post_alloc ("move_$self" => sub { |
|
|
2646 | my $widget = $self->{owner} |
|
|
2647 | or return; |
|
|
2648 | |
|
|
2649 | my ($x, $y) = $widget->coord2global ($widget->{w}, 0); |
|
|
2650 | |
|
|
2651 | ($x, $y) = $widget->coord2global (-$self->{w}, 0) |
|
|
2652 | if $x + $self->{w} > $::WIDTH; |
|
|
2653 | |
|
|
2654 | $self->move ($x, $y); |
|
|
2655 | }); |
2644 | } |
2656 | } |
2645 | |
2657 | |
2646 | sub _draw { |
2658 | sub _draw { |
2647 | my ($self) = @_; |
2659 | my ($self) = @_; |
2648 | |
2660 | |