/* This file is part of Beifahrer. * * Copyright (C) 2010 Philipp Zabel * * Beifahrer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Beifahrer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Beifahrer. If not, see . */ using Gtk; using Hildon; public class LiftListWindow : StackableWindow { public const string GCONF_KEY_PRELOAD = "/apps/beifahrer/preload"; AdacMitfahrclub adac; ListStore store; Alignment alignment; TreeView tree; TreeViewColumn route_column; Label no_lifts; GConf.Client gconf; bool preload = false; public LiftListWindow (AdacMitfahrclub _adac) { adac = _adac; } construct { set_title ("Beifahrer"); gconf = GConf.Client.get_default (); store = new ListStore (6, typeof (string), typeof (string), typeof (string), typeof (string), typeof (string), typeof (Lift)); alignment = new Alignment (0.0f, 0.0f, 1.0f, 1.0f); alignment.top_padding = MARGIN_HALF; alignment.left_padding = MARGIN_DOUBLE; alignment.right_padding = MARGIN_DOUBLE; tree = (TreeView) Hildon.gtk_tree_view_new_with_model (UIMode.NORMAL, store); Hildon.gtk_widget_set_theme_size (tree, SizeType.FINGER_HEIGHT); tree.set_headers_visible (false); tree.set_rules_hint (true); // Tree selection object var selection = tree.get_selection (); selection.set_mode (SelectionMode.SINGLE); // Source and destination column route_column = new TreeViewColumn.with_attributes ("Route", new CellRendererText (), "text", 0); route_column.set_reorderable (false); route_column.set_sizing (TreeViewColumnSizing.AUTOSIZE); route_column.set_expand (true); tree.append_column (route_column); // Date and time column var datetime_column = new TreeViewColumn.with_attributes ("DateTime", new CellRendererText (), "text", 1); datetime_column.set_reorderable (false); datetime_column.set_sizing (TreeViewColumnSizing.AUTOSIZE); datetime_column.set_expand (true); tree.append_column (datetime_column); // Free places column var places_column = new TreeViewColumn.with_attributes ("Places", new CellRendererText (), "text", 2); places_column.set_reorderable (false); places_column.set_sizing (TreeViewColumnSizing.AUTOSIZE); places_column.set_expand (true); tree.append_column (places_column); // Price column var price_column = new TreeViewColumn.with_attributes ("Price", new CellRendererText (), "text", 3); price_column.set_reorderable (false); price_column.set_sizing (TreeViewColumnSizing.AUTOSIZE); price_column.set_expand (true); tree.append_column (price_column); // Smoker/Non-smoker column var smoke_column = new TreeViewColumn.with_attributes ("Smoker", new CellRendererPixbuf (), "icon-name", 4); smoke_column.set_reorderable (false); smoke_column.set_sizing (TreeViewColumnSizing.AUTOSIZE); smoke_column.set_expand (false); tree.append_column (smoke_column); var pannable = new PannableArea (); pannable.add (tree); no_lifts = new Label (_("No lifts")); Hildon.helper_set_logical_font (no_lifts, "LargeSystemFont"); Hildon.helper_set_logical_color (no_lifts, RcFlags.FG, StateType.NORMAL, "SecondaryTextColor"); no_lifts.set_size_request (-1, 6 * 70); no_lifts.set_alignment ((float) 0.5, (float) 0.42); var vbox = new VBox (false, 0); vbox.pack_start (pannable, true, true, 0); vbox.pack_start (no_lifts, false, false, 0); alignment.add (vbox); add (alignment); alignment.show_all (); no_lifts.hide (); route_column.set_visible (!BeifahrerProgram.orientation.portrait); tree.row_activated.connect (this.on_row_activated); BeifahrerProgram.orientation.changed.connect (this.on_orientation_changed); } public async void find_lifts (string city_from, int radius_from, string city_to, int radius_to, Date date, int tolerance = 0) { TreeIter iter; set_title ("%s - %s".printf (city_from, city_to)); Hildon.gtk_window_set_progress_indicator (this, 1); var lift_list = yield adac.get_lift_list (city_from, radius_from, city_to, radius_to, date, tolerance); foreach (Lift lift in lift_list) { string icon_name = null; if (LiftFlags.SMOKER in lift.flags) icon_name = "beifahrer_smoker"; else if (LiftFlags.NON_SMOKER in lift.flags) icon_name = "beifahrer_non_smoker"; string datetime = "%02d.%02d.%04d".printf (lift.time.day, lift.time.month, lift.time.year); if (lift.time.hour >= 0) datetime += ", %d:%02d".printf (lift.time.hour, lift.time.minute); store.insert_with_values (out iter, -1, 0, lift.city_from + " - " + lift.city_to, 1, datetime, 2, _("%d pl.").printf (lift.places), 3, lift.price, 4, icon_name, 5, lift); // (LiftFlags.WOMEN_ONLY,ADAC_MEMBER in lift.flags) } if (lift_list.length () > 6) alignment.right_padding = MARGIN_DEFAULT; if (lift_list.length () == 0) no_lifts.show (); bool preload = false; try { preload = gconf.get_bool (GCONF_KEY_PRELOAD); } catch (Error e) { } if (preload) { if (store.get_iter_first (out iter)) do { Lift lift2; store.@get (iter, 5, out lift2); if (lift2 == null) continue; if (lift2.description == null) yield adac.update_lift_details (lift2); } while (store.iter_next (ref iter)); } Hildon.gtk_window_set_progress_indicator (this, 0); } private void on_row_activated (TreeView tree, TreePath /*_*/path, TreeViewColumn column) { TreeModel model = tree.model; TreeIter iter; Lift lift; if (model.get_iter (out iter, path)) { model.get (iter, 5, out lift); var window = new LiftDetailWindow (adac, lift); window.show_all (); } } private void on_orientation_changed () { route_column.set_visible (!BeifahrerProgram.orientation.portrait); } }