1 /* This file is part of Beifahrer.
3 * Copyright (C) 2010 Philipp Zabel
5 * Beifahrer is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * Beifahrer is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with Beifahrer. If not, see <http://www.gnu.org/licenses/>.
22 public class QueryWindow : StackableWindow {
23 public const string GCONF_KEY_ARRIVAL = "/apps/beifahrer/arrival";
24 public const string GCONF_KEY_DEPARTURE = "/apps/beifahrer/departure";
25 public const string GCONF_KEY_USE_LOCATION = "/apps/beifahrer/use_location";
28 TouchSelector city_from_selector;
29 TouchSelector city_to_selector;
30 TouchSelector umkreis_from_selector;
31 TouchSelector umkreis_to_selector;
33 TouchSelector tolerance_selector;
34 Location.GPSDControl control;
35 Location.GPSDevice device;
37 bool use_location = true;
41 set_title ("Beifahrer");
43 var menu = new AppMenu ();
44 var settings = new Gtk.Button.with_label (_("Settings"));
46 menu.append (settings);
49 adac = new AdacMitfahrclub ();
50 gconf = GConf.Client.get_default ();
52 city_from_selector = new TouchSelectorEntry.text ();
53 city_to_selector = new TouchSelectorEntry.text ();
54 foreach (unowned City city in adac.get_city_list ()) {
55 city_from_selector.append_text (city.name);
56 city_to_selector.append_text (city.name);
59 umkreis_from_selector = new TouchSelector.text ();
60 umkreis_to_selector = new TouchSelector.text ();
61 for (int km = 0; km <= 50; km += 10) {
62 umkreis_from_selector.append_text ("%d km".printf (km));
63 umkreis_to_selector.append_text ("%d km".printf (km));
66 tolerance_selector = new TouchSelector.text ();
67 for (int days = 0; days <= 4; days += 1)
68 tolerance_selector.append_text (_("+/- %d days").printf (days));
70 var table = new Table (4, 2, false);
72 var button = new PickerButton (SizeType.FINGER_HEIGHT,
73 ButtonArrangement.VERTICAL);
74 button.set_selector (city_from_selector);
75 button.set_title (_("Departure"));
76 button.set_value (_("Please select"));
77 button.set_alignment (0.0f, 0.0f, 0.5f, 0.5f);
78 table.attach (button, 0, 1, 0, 1, AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.FILL, 0, 0);
81 button.set_active (gconf.get_int ("/apps/beifahrer/departure"));
85 button = new PickerButton (SizeType.FINGER_HEIGHT,
86 ButtonArrangement.VERTICAL);
87 button.set_selector (umkreis_from_selector);
88 button.set_title (_("Vicinity"));
89 button.set_value ("0 km");
90 button.set_alignment (0.0f, 0.0f, 0.5f, 0.5f);
91 table.attach (button, 1, 2, 0, 1, AttachOptions.FILL, AttachOptions.FILL, 0, 0);
93 button = new PickerButton (SizeType.FINGER_HEIGHT,
94 ButtonArrangement.VERTICAL);
95 button.set_selector (city_to_selector);
96 button.set_title (_("Arrival"));
97 button.set_value (_("Please select"));
98 button.set_alignment (0.0f, 0.0f, 0.5f, 0.5f);
99 table.attach (button, 0, 1, 1, 2, AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.FILL, 0, 0);
102 button.set_active (gconf.get_int ("/apps/beifahrer/arrival"));
106 button = new PickerButton (SizeType.FINGER_HEIGHT,
107 ButtonArrangement.VERTICAL);
108 button.set_selector (umkreis_to_selector);
109 button.set_title (_("Vicinity"));
110 button.set_value ("0 km");
111 button.set_alignment (0.0f, 0.0f, 0.5f, 0.5f);
112 table.attach (button, 1, 2, 1, 2, AttachOptions.FILL, AttachOptions.FILL, 0, 0);
114 date = new DateButton (SizeType.FINGER_HEIGHT,
115 ButtonArrangement.VERTICAL);
116 date.set_alignment (0.0f, 0.0f, 0.5f, 0.5f);
117 table.attach (date, 0, 1, 2, 3, AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.FILL, 0, 0);
119 button = new PickerButton (SizeType.FINGER_HEIGHT,
120 ButtonArrangement.VERTICAL);
121 button.set_selector (tolerance_selector);
122 button.set_title (_("Tolerance"));
123 button.set_value (_("+/- 0 days"));
124 button.set_alignment (0.0f, 0.0f, 0.5f, 0.5f);
125 table.attach (button, 1, 2, 2, 3, AttachOptions.FILL, AttachOptions.FILL, 0, 0);
127 var search_button = new Gtk.Button.with_label (_("Search"));
128 Hildon.gtk_widget_set_theme_size (search_button, SizeType.FINGER_HEIGHT);
129 table.attach (search_button, 0, 2, 3, 4, AttachOptions.FILL, AttachOptions.FILL, 0, 0);
133 search_button.clicked.connect (on_search_button_clicked);
134 settings.clicked.connect (on_settings_clicked);
138 control = Location.GPSDControl.get_default ();
139 control.preferred_method = Location.METHOD_ACWP;
140 control.preferred_interval = Location.GPSDControlInterval.@1S;
141 control.error.connect (() => { print ("control error\n"); });
142 control.error_verbose.connect ((e) => {
144 case Location.GPSDControlError.USER_REJECTED_DIALOG:
145 print ("\tuser rejected dialog\n");
147 case Location.GPSDControlError.USER_REJECTED_SETTINGS:
148 print ("\tuser rejected settings\n");
150 case Location.GPSDControlError.BT_GPS_NOT_AVAILABLE:
151 print ("\tbt gps not available\n");
153 case Location.GPSDControlError.METHOD_NOT_ALLOWED_IN_OFFLINE_MODE:
154 print ("\tmethod not allowed in offline mode\n");
156 case Location.GPSDControlError.SYSTEM:
157 Banner.show_information (this, null, _("No GPS available!"));
161 control.gpsd_running.connect (() => { print ("control running\n"); });
162 control.gpsd_stopped.connect (() => { print ("control stopped\n"); });
165 use_location = gconf.get_bool (GCONF_KEY_USE_LOCATION);
168 want_location = use_location;
172 device = (Location.GPSDevice) GLib.Object.@new (typeof (Location.GPSDevice), null);
173 device.changed.connect (on_location_changed);
174 device.connected.connect (() => { print ("device connected\n"); });
175 device.disconnected.connect (() => { print ("device disconnected\n"); });
177 // In case the device already has a fix:
178 on_location_changed ();
181 void on_location_changed () requires (device.fix != null) {
185 if (Location.GPS_DEVICE_LATLONG_SET in (int) device.fix.fields) {
186 print ("fix: lat=%f, lon=%f\n", device.fix.latitude, device.fix.longitude);
188 unowned City city = adac.find_nearest_city (device.fix.latitude, device.fix.longitude);
190 int n = adac.get_city_list ().index (city);
191 int n_from = city_from_selector.get_active (0);
192 int n_to = city_to_selector.get_active (0);
194 print ("city(%d): %s (%d)\n", n, city.name, city.number);
197 city_from_selector.set_active (0, n);
199 // If we are at the previous point of arrival, prepare for return trip
201 city_to_selector.set_active (0, n_from);
206 want_location = false;
210 void on_search_button_clicked (Gtk.Button button) {
213 n = city_from_selector.get_active (0);
216 string city_from = adac.get_city_list ().nth_data (n).name;
218 if (gconf.get_int (GCONF_KEY_DEPARTURE) != n)
219 gconf.set_int (GCONF_KEY_DEPARTURE, n);
223 n = city_to_selector.get_active (0);
226 string city_to = adac.get_city_list ().nth_data (n).name;
228 if (gconf.get_int (GCONF_KEY_ARRIVAL) != n)
229 gconf.set_int (GCONF_KEY_ARRIVAL, n);
233 uint year, month, day;
234 date.get_date (out year, out month, out day);
236 date.set_day ((DateDay) day);
237 date.set_month ((DateMonth) (month + DateMonth.JANUARY));
238 date.set_year ((DateYear) year);
240 int tolerance = tolerance_selector.get_active (0);
242 Hildon.gtk_window_set_progress_indicator (this, 1);
243 var window = new LiftListWindow (adac);
245 window.find_lifts (city_from, city_to, date, tolerance);
246 Hildon.gtk_window_set_progress_indicator (this, 0);
249 void on_settings_clicked () {
250 var dialog = new SettingsDialog (this);
251 dialog.response.connect (on_settings_response);
255 void on_settings_response (int response_id) {
256 bool old_use_location = use_location;
257 use_location = gconf.get_bool (GCONF_KEY_USE_LOCATION);
258 if (!old_use_location && use_location) {
259 want_location = true;