… | |
… | |
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 = 50; |
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 | |
… | |
… | |
1007 | |
1007 | |
1008 | $class->SUPER::new ( |
1008 | $class->SUPER::new ( |
1009 | fg => [1, 1, 1], |
1009 | fg => [1, 1, 1], |
1010 | active_fg => [0, 0, 0], |
1010 | active_fg => [0, 0, 0], |
1011 | range => [0, 0, 100, 10], |
1011 | range => [0, 0, 100, 10], |
1012 | vertical => 0, |
1012 | vertical => 1, |
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 | my ($x, $w) = $self->{vertical} ? ($y, $self->{h}) : ($x, $self->{w}); |
|
|
1031 | |
|
|
1032 | $x = $x * ($hi - $lo) / $w + $lo; |
|
|
1033 | $x = $lo if $x < $lo; |
|
|
1034 | $x = $hi - $page if $x > $hi - $page; |
|
|
1035 | $self->{range}[0] = $x; |
|
|
1036 | |
|
|
1037 | $self->{changed}($x) if $self->{changed}; |
|
|
1038 | $self->update; |
|
|
1039 | } |
|
|
1040 | } |
|
|
1041 | |
1017 | sub _draw { |
1042 | sub _draw { |
1018 | my ($self) = @_; |
1043 | my ($self) = @_; |
1019 | |
1044 | |
1020 | $self->SUPER::_draw (); |
1045 | $self->SUPER::_draw (); |
|
|
1046 | |
|
|
1047 | glPushMatrix; |
1021 | |
1048 | |
1022 | my ($w, $h) = @$self{qw(w h)}; |
1049 | my ($w, $h) = @$self{qw(w h)}; |
1023 | |
1050 | |
1024 | if ($self->{vertical}) { |
1051 | if ($self->{vertical}) { |
1025 | # draw a vertical slider like a rotated horizontal slider |
1052 | # draw a vertical slider like a rotated horizontal slider |
1026 | |
1053 | |
1027 | glTranslate 0, $self->{w}; |
|
|
1028 | glRotate 90, 0, 0, 1; |
1054 | glRotate 90, 0, 0, 1; |
|
|
1055 | glTranslate 0, -$self->{w}, 0; |
1029 | |
1056 | |
1030 | ($w, $h) = ($h, $w); |
1057 | ($w, $h) = ($h, $w); |
1031 | } |
1058 | } |
1032 | |
1059 | |
1033 | my $fg = $FOCUS == $self ? $self->{active_fg} : $self->{fg}; |
1060 | my $fg = $FOCUS == $self ? $self->{active_fg} : $self->{fg}; |
1034 | my $bg = $FOCUS == $self ? $self->{active_bg} : $self->{bg}; |
1061 | my $bg = $FOCUS == $self ? $self->{active_bg} : $self->{bg}; |
|
|
1062 | |
|
|
1063 | my ($value, $lo, $hi, $page) = @{$self->{range}}; |
|
|
1064 | |
|
|
1065 | $page = int $page * $w / ($hi - $lo); |
|
|
1066 | $value = int +($value - $lo) * $w / ($hi - $lo); |
|
|
1067 | |
|
|
1068 | $w -= $page; |
|
|
1069 | $page &= ~1; |
|
|
1070 | glTranslate $page * 0.5, 0, 0; |
1035 | |
1071 | |
1036 | glColor @$fg; |
1072 | glColor @$fg; |
1037 | glBegin GL_LINES; |
1073 | glBegin GL_LINES; |
1038 | glVertex 0, 0; glVertex 0, $h; |
1074 | glVertex 0, 0; glVertex 0, $h; |
1039 | glVertex $w - 1, 0; glVertex $w - 1, $h; |
1075 | glVertex $w - 1, 0; glVertex $w - 1, $h; |
1040 | glVertex 0, $h * 0.5; glVertex $w, $h * 0.5; |
1076 | glVertex 0, $h * 0.5; glVertex $w, $h * 0.5; |
1041 | glEnd; |
1077 | glEnd; |
|
|
1078 | |
|
|
1079 | my $knob_a = $value - $page * 0.5; |
|
|
1080 | my $knob_b = $value + $page * 0.5; |
|
|
1081 | |
|
|
1082 | glBegin GL_QUADS; |
|
|
1083 | glColor @$fg; |
|
|
1084 | glVertex $knob_a, 0; |
|
|
1085 | glVertex $knob_a, $h; |
|
|
1086 | glVertex $knob_b, $h; |
|
|
1087 | glVertex $knob_b, 0; |
|
|
1088 | |
|
|
1089 | if ($knob_a < $knob_b - 2) { |
|
|
1090 | glColor @$bg; |
|
|
1091 | glVertex $knob_a + 1, 1; |
|
|
1092 | glVertex $knob_a + 1, $h - 1; |
|
|
1093 | glVertex $knob_b - 1, $h - 1; |
|
|
1094 | glVertex $knob_b - 1, 1; |
|
|
1095 | } |
|
|
1096 | glEnd; |
|
|
1097 | |
|
|
1098 | glPopMatrix; |
1042 | } |
1099 | } |
1043 | |
1100 | |
1044 | ############################################################################# |
1101 | ############################################################################# |
1045 | |
1102 | |
1046 | package CFClient::Widget::MapWidget; |
1103 | package CFClient::Widget::MapWidget; |