… | |
… | |
992 | our @ISA = CFClient::Widget::DrawBG::; |
992 | our @ISA = CFClient::Widget::DrawBG::; |
993 | |
993 | |
994 | sub size_request { |
994 | sub size_request { |
995 | my ($self) = @_; |
995 | my ($self) = @_; |
996 | |
996 | |
997 | my $w = |
997 | my $w = 20; |
998 | my $h = 10; |
998 | my $h = 10; |
999 | |
999 | |
1000 | $self->{vertical} ? ($h, $w) : ($w, $h) |
1000 | $self->{vertical} ? ($h, $w) : ($w, $h) |
1001 | } |
1001 | } |
1002 | |
1002 | |
… | |
… | |
1012 | vertical => 0, |
1012 | vertical => 0, |
1013 | @_ |
1013 | @_ |
1014 | ) |
1014 | ) |
1015 | } |
1015 | } |
1016 | |
1016 | |
|
|
1017 | sub button_down { |
|
|
1018 | my ($self, $ev, $x, $y) = @_; |
|
|
1019 | |
|
|
1020 | $self->SUPER::button_down ($ev, $x, $y); |
|
|
1021 | $self->mouse_motion ($ev, $x, $y); |
|
|
1022 | } |
|
|
1023 | |
|
|
1024 | sub mouse_motion { |
|
|
1025 | my ($self, $ev, $x, $y) = @_; |
|
|
1026 | |
|
|
1027 | if ($GRAB == $self) { |
|
|
1028 | my ($value, $lo, $hi, $page) = @{$self->{range}}; |
|
|
1029 | |
|
|
1030 | $x = $x * ($hi - $lo) / $self->{w} + $lo; |
|
|
1031 | $x = $lo if $x < $lo; |
|
|
1032 | $x = $hi - $page if $x > $hi - $page; |
|
|
1033 | $self->{range}[0] = $x; |
|
|
1034 | |
|
|
1035 | $self->{changed}($x) if $self->{changed}; |
|
|
1036 | $self->update; |
|
|
1037 | } |
|
|
1038 | } |
|
|
1039 | |
1017 | sub _draw { |
1040 | sub _draw { |
1018 | my ($self) = @_; |
1041 | my ($self) = @_; |
1019 | |
1042 | |
1020 | $self->SUPER::_draw (); |
1043 | $self->SUPER::_draw (); |
|
|
1044 | |
|
|
1045 | glPushMatrix; |
1021 | |
1046 | |
1022 | my ($w, $h) = @$self{qw(w h)}; |
1047 | my ($w, $h) = @$self{qw(w h)}; |
1023 | |
1048 | |
1024 | if ($self->{vertical}) { |
1049 | if ($self->{vertical}) { |
1025 | # draw a vertical slider like a rotated horizontal slider |
1050 | # draw a vertical slider like a rotated horizontal slider |
… | |
… | |
1030 | ($w, $h) = ($h, $w); |
1055 | ($w, $h) = ($h, $w); |
1031 | } |
1056 | } |
1032 | |
1057 | |
1033 | my $fg = $FOCUS == $self ? $self->{active_fg} : $self->{fg}; |
1058 | my $fg = $FOCUS == $self ? $self->{active_fg} : $self->{fg}; |
1034 | my $bg = $FOCUS == $self ? $self->{active_bg} : $self->{bg}; |
1059 | my $bg = $FOCUS == $self ? $self->{active_bg} : $self->{bg}; |
|
|
1060 | |
|
|
1061 | my ($value, $lo, $hi, $page) = @{$self->{range}}; |
|
|
1062 | |
|
|
1063 | $page = int $page * $w / ($hi - $lo); |
|
|
1064 | $value = int +($value - $lo) * $w / ($hi - $lo); |
|
|
1065 | |
|
|
1066 | $w -= $page; |
|
|
1067 | $page &= ~1; |
|
|
1068 | glTranslate $page * 0.5, 0, 0; |
1035 | |
1069 | |
1036 | glColor @$fg; |
1070 | glColor @$fg; |
1037 | glBegin GL_LINES; |
1071 | glBegin GL_LINES; |
1038 | glVertex 0, 0; glVertex 0, $h; |
1072 | glVertex 0, 0; glVertex 0, $h; |
1039 | glVertex $w - 1, 0; glVertex $w - 1, $h; |
1073 | glVertex $w - 1, 0; glVertex $w - 1, $h; |
1040 | glVertex 0, $h * 0.5; glVertex $w, $h * 0.5; |
1074 | glVertex 0, $h * 0.5; glVertex $w, $h * 0.5; |
1041 | glEnd; |
1075 | glEnd; |
|
|
1076 | |
|
|
1077 | my $knob_a = $value - $page * 0.5; |
|
|
1078 | my $knob_b = $value + $page * 0.5; |
|
|
1079 | |
|
|
1080 | glBegin GL_QUADS; |
|
|
1081 | glColor @$fg; |
|
|
1082 | glVertex $knob_a, 0; |
|
|
1083 | glVertex $knob_a, $h; |
|
|
1084 | glVertex $knob_b, $h; |
|
|
1085 | glVertex $knob_b, 0; |
|
|
1086 | |
|
|
1087 | if ($knob_a < $knob_b - 2) { |
|
|
1088 | glColor @$bg; |
|
|
1089 | glVertex $knob_a + 1, 1; |
|
|
1090 | glVertex $knob_a + 1, $h - 1; |
|
|
1091 | glVertex $knob_b - 1, $h - 1; |
|
|
1092 | glVertex $knob_b - 1, 1; |
|
|
1093 | } |
|
|
1094 | glEnd; |
|
|
1095 | |
|
|
1096 | glPopMatrix; |
1042 | } |
1097 | } |
1043 | |
1098 | |
1044 | ############################################################################# |
1099 | ############################################################################# |
1045 | |
1100 | |
1046 | package CFClient::Widget::MapWidget; |
1101 | package CFClient::Widget::MapWidget; |