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 class CityButton : Hildon.Button {
23 private enum Response {
28 TouchSelector city_selector;
29 PickerButton radius_button;
34 public CityButton (SizeType size, ButtonArrangement arrangement, List<City> city_list, bool with_radius = true) {
35 GLib.Object (arrangement: arrangement, size: size);
36 set_style (ButtonStyle.PICKER);
38 use_radius = with_radius;
39 city_selector = new TouchSelectorEntry.text ();
40 foreach (unowned City city in city_list)
41 city_selector.append_text (city.name);
43 clicked.connect (on_clicked);
46 public void set_city (string city) {
47 var model = city_selector.get_model (0);
52 if (model.get_iter_first (out iter)) {
54 model.get (iter, 0, out _city);
60 } while (model.iter_next (ref iter));
64 public void set_active (int _active) {
66 city_selector.set_active (0, active);
70 public int get_active () {
74 public void set_radius (int _radius) {
79 public int get_radius () {
83 private void on_clicked () {
84 dialog = new Gtk.Dialog ();
85 dialog.set_transient_for (find_parent_window ());
87 var content_area = (Box) dialog.get_content_area ();
88 content_area.pack_start (city_selector, true, true, 0);
89 city_selector.set_size_request (-1, 5*70);
91 var radius_selector = new TouchSelector.text ();
92 for (int km = 0; km <= 50; km += 10)
93 radius_selector.append_text ("%d km".printf (km));
96 radius_button = new PickerButton (SizeType.FINGER_HEIGHT,
97 ButtonArrangement.VERTICAL);
98 radius_button.set_selector (radius_selector);
99 radius_button.set_title (_("Radius"));
100 radius_button.set_alignment (0.0f, 0.0f, 0.5f, 0.5f);
101 radius_button.set_active (radius / 10);
102 dialog.add_action_widget (radius_button, Response.RADIUS);
104 var action_area = (ButtonBox) dialog.get_action_area ();
105 action_area.set_child_secondary (radius_button, true);
108 dialog.add_button (_("Done"), Gtk.ResponseType.OK);
110 dialog.response.connect (on_response);
115 private void on_response (int response_id) {
116 if (response_id == Gtk.ResponseType.OK) {
117 active = city_selector.get_active (0);
118 radius = radius_button.get_active () * 10;
121 if (response_id != Response.RADIUS) {
122 // Unlink the city_selector so it doesn't get destroyed with the dialog
123 var content_area = (Box) dialog.get_content_area ();
124 content_area.remove (city_selector);
130 private void update_value () {
131 if (get_radius () == 0)
132 set_value (city_selector.get_current_text ());
134 set_value ("%s, radius %d km".printf (city_selector.get_current_text (), radius));
137 private Gtk.Window? find_parent_window () {
138 for (Gtk.Widget p = parent; p != null; p = p.parent)
140 return (Gtk.Window) p;