-
Notifications
You must be signed in to change notification settings - Fork 7
/
BBBikePrefsWidget.pm
214 lines (174 loc) · 5.38 KB
/
BBBikePrefsWidget.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
# -*- perl -*-
#
# Author: Slaven Rezic
#
# Copyright (C) 2012 Slaven Rezic. All rights reserved.
# This package is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.
#
# Mail: [email protected]
# WWW: http://bbbike.de
#
package BBBikePrefsWidget;
use strict;
use base qw(Tk::Derived Tk::Toplevel);
Construct Tk::Widget 'BBBikePrefsWidget';
BEGIN {
if (!eval '
use Msg qw(frommain);
1;
') {
#warn $@ if $@;
eval 'sub M ($) { $_[0] }';
eval 'sub Mfmt { sprintf(shift, @_) }';
}
}
use Tk::Optionmenu;
sub Populate {
my($w, $args) = @_;
my $gf = $w->Frame->pack(-fill => "both", -expand => 1);
my $speed_e;
{
my $f = $gf->Frame;
my $NumEntry = 'Entry';
my @NumEntryArgs = ();
if (eval { require Tk::NumEntry }) {
$NumEntry = "NumEntry";
@NumEntryArgs = (-minvalue => 1, -maxvalue => 50);
}
$speed_e = $f->$NumEntry(-width => 3, @NumEntryArgs)->pack(-side => "left");
$gf->Advertise(Speed => $speed_e);
$f->Label(-text => 'km/h')->pack(-side => "left"); # XXX Meilen erlauben?
Tk::grid($gf->Label(-text => M"Bevorzugte Geschwindigkeit"),
$f,
-sticky => 'w');
}
{
# Die Verwendung von $name2inx ist nur ein Workaround...
# Eigentlich würde ich die [Name => Wert]-Notation von
# Optionmenu verwenden wollen, aber das geht nicht :-(
my $name2inx =
{M"Nur Hauptstraßen" => 0,
M"Hauptstraßen bevorzugen" => 1,
M"Alle Straßen berücksichtigen" => 2,
M"Nebenstraßen bevorzugen" => 3,
M"Nur Nebenstraßen" => 4,
};
my $default = M"Alle Straßen berücksichtigen";
my $o = $gf->Optionmenu
(-options => [sort { $name2inx->{$a} <=> $name2inx->{$b} } keys %$name2inx],
-variable => \$default,
);
Tk::grid($gf->Label(-text => M"Bevorzugter Straßentyp"),
$o,
-sticky => 'w');
}
{
my $name2inx =
{M"egal" => 0,
M"Kopfsteinpflaster und schlechte Fahrbahnen vermeiden" => 1,
M"nur sehr gute Beläge bevorzugen (rennradtauglich)" => 2,
};
my $default = M"egal";
my $o = $gf->Optionmenu
(-options => [sort { $name2inx->{$a} <=> $name2inx->{$b} } keys %$name2inx],
-variable => \$default,
);
Tk::grid($gf->Label(-text => M"Bevorzugter Straßenbelag"),
$o,
-sticky => 'w');
}
{
Tk::grid($gf->Label(-text => "Ampeln vermeiden"),
$gf->Checkbutton,
-sticky => 'w');
}
{
Tk::grid($gf->Label(-text => "Unbeleuchtete Wege vermeiden"),
$gf->Checkbutton,
-sticky => 'w');
}
{
my $name2inx =
{M"egal" => 0,
M"bevorzugen" => 1,
M"stark bevorzugen" => 2,
};
my $default = M"egal";
my $o = $gf->Optionmenu
(-options => [sort { $name2inx->{$a} <=> $name2inx->{$b} } keys %$name2inx],
-variable => \$default,
);
Tk::grid($gf->Label(-text => M"Grüne Wege"),
$o,
-sticky => 'w');
}
{
my $name2inx =
{M"nichts weiter" => 0,
M"Anhänger" => 1,
M"Kindersitz mit Kind" => 2,
};
my $default = M"nichts weiter";
my $o = $gf->Optionmenu
(-options => [sort { $name2inx->{$a} <=> $name2inx->{$b} } keys %$name2inx],
-variable => \$default,
);
Tk::grid($gf->Label(-text => M"Unterwegs mit"),
$o,
-sticky => 'w');
}
{
Tk::grid($gf->Label(-text => "Fähren benutzen"),
$gf->Checkbutton,
-sticky => 'w');
}
{
Tk::grid($gf->Label(-text => "Unbekannte Straßen mit einbeziehen"),
$gf->Checkbutton,
-sticky => 'w');
}
my $bf = $w->Frame->pack(-fill => "x");
$bf->Button(Name => 'cancel',
-command => sub { $w->destroy },
)->pack(-side => 'right');
$bf->Button(Name => 'apply',
-command => sub { die "NYI apply" },
)->pack(-side => 'right');
$bf->Button(Name => 'ok',
-command => sub { die "NYI apply"; $w->destroy },
)->pack(-side => 'right');
$w->ConfigSpecs(
-title => ['METHOD'],
-speed => [{-text => $speed_e}],
-strtype => ['PASSIVE'], # XXX ? how to set optionmenu?
-strqual => ['PASSIVE'], # XXX ? how to set optionmenu?
# XXX weitere Optionen?
);
}
# XXX Wie präsentiere ich dieses Widget am besten? Vielleicht kann
# auch die Perl/Tk-Version eine Art Wizard haben?
# Könnte ich hiermit einfach verschiedene "Profile" (e.g. Rennrad,
# Normal, Familienausflug...) handhaben?
# XXX Kann ich hier existierenden Code (Menü, bestehender
# Optionseditor) teilen?
# XXX wenn osm_data verwendet wird, dann sollten vielleicht einige
# Features nicht gesetzt werden können? Prüfen!
# XXX Wie auslesen? Evtl. eine Convenience-Funktion schreiben, die die
# Variablen etc. in bbbike-main setzt?
# Bevorzugte Geschwindigkeit: falls ActiveSpeed gesezt ist, dann
# diesen Wert ändern. Ansonsten (ActivePower ist gesetzt): aussuchen,
# welcher der beiden Werte näher dran ist, dann (ggfs.) den Wert
# ändern, und ActiveSpeed setzen. Oder besser:
# change_active_speed_power anpassen?
# Bevorzugter Straßentyp: %strcat_speed setzen, wie in
# enter_opt_preferences. Vorher Refactoring notwendig: das Setzen von
# strcat_speed soll, falls die nicht-freie Eingabe gewählt ist, erst
# kurz vor der Routensuche aktualisiert werden.
# Bevorzugter Straßenbelag: %qualitaet_s_speed setzen, wie in
# enter_opt_preferences. Auch hier gilt der Refactoring-Hinweis.
# Ampeln vermeiden: $ampel_optimierung auf 0..1 setzen
# Unbeleuchtete Wege vermeiden: $unlit_streets_optimization auf 0..1 setzen
# Grüne Wege: $green_optimization auf 0..2 setzen
# Unterwegs mit:
1;