]> git.street.me.uk Git - andy/viking.git/blobdiff - src/viktrwlayer_tracklist.c
Remove definition of a non existant function
[andy/viking.git] / src / viktrwlayer_tracklist.c
index c2412c24c28c7d5da60e373021620705047ded35..2d937347a598e6f71042593191c93953616a3c8a 100644 (file)
@@ -207,6 +207,65 @@ static void trw_layer_track_view ( menu_array_values values )
        trw_layer_track_select (values);
 }
 
+typedef struct {
+  gboolean has_layer_names;
+  GString *str;
+} copy_data_t;
+
+static void copy_selection (GtkTreeModel *model,
+                            GtkTreePath *path,
+                            GtkTreeIter *iter,
+                            gpointer data)
+{
+       copy_data_t *cd = (copy_data_t*) data;
+
+       gchar* layername; gtk_tree_model_get ( model, iter, 0, &layername, -1 );
+       gchar* name; gtk_tree_model_get ( model, iter, 1, &name, -1 );
+       gchar* date; gtk_tree_model_get ( model, iter, 2, &date, -1 );
+       gdouble d1; gtk_tree_model_get ( model, iter, 4, &d1, -1 );
+       guint d2; gtk_tree_model_get ( model, iter, 5, &d2, -1 );
+       gdouble d3; gtk_tree_model_get ( model, iter, 6, &d3, -1 );
+       gdouble d4; gtk_tree_model_get ( model, iter, 7, &d4, -1 );
+       gint d5; gtk_tree_model_get ( model, iter, 8, &d5, -1 );
+       gchar sep = '\t'; // Could make this configurable - but simply always make it a tab character for now
+       // NB Even if the columns have been reordered - this copies it out only in the original default order
+       // if col 0 is displayed then also copy the layername
+       if ( cd->has_layer_names )
+               g_string_append_printf ( cd->str, "%s%c%s%c%s%c%.1f%c%d%c%.1f%c%.1f%c%d\n", layername, sep, name, sep, date, sep, d1, sep, d2, sep, d3, sep, d4, sep, d5 );
+       else
+               g_string_append_printf ( cd->str, "%s%c%s%c%.1f%c%d%c%.1f%c%.1f%c%d\n", name, sep, date, sep, d1, sep, d2, sep, d3, sep, d4, sep, d5 );
+       g_free ( layername );
+       g_free ( name );
+       g_free ( date );
+}
+
+static void trw_layer_copy_selected ( GtkWidget *tree_view )
+{
+       GtkTreeSelection *selection = gtk_tree_view_get_selection ( GTK_TREE_VIEW(tree_view) );
+       // NB GTK3 has gtk_tree_view_get_n_columns() but we're GTK2 ATM
+       GList *gl = gtk_tree_view_get_columns ( GTK_TREE_VIEW(tree_view) );
+       guint count = g_list_length ( gl );
+       g_list_free ( gl );
+       copy_data_t cd;
+       cd.has_layer_names = (count > TRK_LIST_COLS-3);
+       // Or use gtk_tree_view_column_get_visible()?
+       cd.str = g_string_new ( NULL );
+       gtk_tree_selection_selected_foreach ( selection, copy_selection, &cd );
+
+       a_clipboard_copy ( VIK_CLIPBOARD_DATA_TEXT, 0, 0, 0, cd.str->str, NULL );
+
+       g_string_free ( cd.str, TRUE );
+}
+
+static void add_copy_menu_item ( GtkMenu *menu, GtkWidget *tree_view )
+{
+       GtkWidget *item = gtk_image_menu_item_new_with_mnemonic ( _("_Copy Data") );
+       gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_COPY, GTK_ICON_SIZE_MENU) );
+       g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(trw_layer_copy_selected), tree_view );
+       gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+       gtk_widget_show ( item );
+}
+
 static gboolean add_menu_items ( GtkMenu *menu, VikTrwLayer *vtl, VikTrack *trk, gpointer trk_uuid, VikViewport *vvp, GtkWidget *tree_view, gpointer data )
 {
        static menu_array_values values;
@@ -239,6 +298,21 @@ static gboolean add_menu_items ( GtkMenu *menu, VikTrwLayer *vtl, VikTrack *trk,
        gtk_menu_shell_append ( GTK_MENU_SHELL(menu), item );
        gtk_widget_show ( item );
 
+       add_copy_menu_item ( menu, tree_view );
+
+       return TRUE;
+}
+
+static gboolean trw_layer_track_menu_popup_multi  ( GtkWidget *tree_view,
+                                                    GdkEventButton *event,
+                                                    gpointer data )
+{
+       GtkWidget *menu = gtk_menu_new();
+
+       add_copy_menu_item ( GTK_MENU(menu), tree_view );
+
+       gtk_menu_popup ( GTK_MENU(menu), NULL, NULL, NULL, NULL, event->button, gtk_get_current_event_time() );
+
        return TRUE;
 }
 
@@ -252,7 +326,7 @@ static gboolean trw_layer_track_menu_popup ( GtkWidget *tree_view,
        // This relies on an row being selected as part of the right click
        GtkTreeSelection *selection = gtk_tree_view_get_selection ( GTK_TREE_VIEW(tree_view) );
        if ( gtk_tree_selection_count_selected_rows (selection) != 1 )
-               return FALSE;
+               return trw_layer_track_menu_popup_multi ( tree_view, event, data );
 
        GtkTreePath *path;
        GtkTreeModel *model = gtk_tree_view_get_model ( GTK_TREE_VIEW(tree_view) );
@@ -280,7 +354,7 @@ static gboolean trw_layer_track_menu_popup ( GtkWidget *tree_view,
        udataU.trk  = trk;
        udataU.uuid = NULL;
 
-       gpointer *trkf;
+       gpointer trkf;
        if ( trk->is_route )
                trkf = g_hash_table_find ( vik_trw_layer_get_routes(vtl), (GHRFunc) trw_layer_track_find_uuid, &udataU );
        else
@@ -342,7 +416,8 @@ static void trw_layer_track_list_add ( vik_trw_track_list_t *vtdl,
                                        GtkTreeStore *store,
                                        vik_units_distance_t dist_units,
                                        vik_units_speed_t speed_units,
-                                       vik_units_height_t height_units )
+                                       vik_units_height_t height_units,
+                                       const gchar* date_format )
 {
        GtkTreeIter t_iter;
        VikTrack *trk = vtdl->trk;
@@ -354,6 +429,9 @@ static void trw_layer_track_list_add ( vik_trw_track_list_t *vtdl,
        case VIK_UNITS_DISTANCE_MILES:
                trk_dist = VIK_METERS_TO_MILES(trk_dist);
                break;
+       case VIK_UNITS_DISTANCE_NAUTICAL_MILES:
+               trk_dist = VIK_METERS_TO_NAUTICAL_MILES(trk_dist);
+               break;
        default:
                trk_dist = trk_dist/1000.0;
                break;
@@ -366,14 +444,14 @@ static void trw_layer_track_list_add ( vik_trw_track_list_t *vtdl,
 
 #if GLIB_CHECK_VERSION(2,26,0)
                GDateTime* gdt = g_date_time_new_from_unix_utc ( VIK_TRACKPOINT(trk->trackpoints->data)->timestamp );
-               gchar *time = g_date_time_format ( gdt, TRACK_LIST_DATE_FORMAT );
-               strncpy ( time_buf, time, sizeof(time_buf) );
+               gchar *time = g_date_time_format ( gdt, date_format );
+               g_strlcpy ( time_buf, time, sizeof(time_buf) );
                g_free ( time );
                g_date_time_unref ( gdt);
 #else
                GDate* gdate_start = g_date_new ();
                g_date_set_time_t ( gdate_start, VIK_TRACKPOINT(trk->trackpoints->data)->timestamp );
-               g_date_strftime ( time_buf, sizeof(time_buf), TRACK_LIST_DATE_FORMAT, gdate_start );
+               g_date_strftime ( time_buf, sizeof(time_buf), date_format, gdate_start );
                g_date_free ( gdate_start );
 #endif
        }
@@ -382,12 +460,12 @@ static void trw_layer_track_list_add ( vik_trw_track_list_t *vtdl,
        gboolean visible = VIK_LAYER(vtl)->visible && trk->visible;
        visible = visible && (trk->is_route ? vik_trw_layer_get_routes_visibility(vtl) : vik_trw_layer_get_tracks_visibility(vtl));
 
-       guint trk_len_time = 0;
+       guint trk_len_time = 0; // In minutes
        if ( trk->trackpoints ) {
                time_t t1, t2;
                t1 = VIK_TRACKPOINT(g_list_first(trk->trackpoints)->data)->timestamp;
                t2 = VIK_TRACKPOINT(g_list_last(trk->trackpoints)->data)->timestamp;
-               trk_len_time = (int)round (abs(t2-t1)/60);
+               trk_len_time = (int)round(labs(t2-t1)/60.0);
        }
 
        gdouble av_speed = 0.0;
@@ -499,11 +577,16 @@ static void vik_trw_layer_track_list_internal ( GtkWidget *dialog,
 
        //GList *gl = get_tracks_and_layers_cb ( vl, user_data );
        //g_list_foreach ( tracks_and_layers, (GFunc) trw_layer_track_list_add, store );
+       gchar *date_format = NULL;
+       if ( !a_settings_get_string ( VIK_SETTINGS_LIST_DATE_FORMAT, &date_format ) )
+               date_format = g_strdup ( TRACK_LIST_DATE_FORMAT );
+
        GList *gl = tracks_and_layers;
        while ( gl ) {
-               trw_layer_track_list_add ( (vik_trw_track_list_t*)gl->data, store, dist_units, speed_units, height_units );
+               trw_layer_track_list_add ( (vik_trw_track_list_t*)gl->data, store, dist_units, speed_units, height_units, date_format );
                gl = g_list_next ( gl );
        }
+       g_free ( date_format );
 
        GtkWidget *view = gtk_tree_view_new();
        GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
@@ -546,6 +629,9 @@ static void vik_trw_layer_track_list_internal ( GtkWidget *dialog,
        case VIK_UNITS_DISTANCE_MILES:
                column = my_new_column_text ( _("Distance\n(miles)"), renderer, view, column_runner++ );
                break;
+       case VIK_UNITS_DISTANCE_NAUTICAL_MILES:
+               column = my_new_column_text ( _("Distance\n(NM)"), renderer, view, column_runner++ );
+               break;
        default:
                column = my_new_column_text ( _("Distance\n(km)"), renderer, view, column_runner++ );
                break;
@@ -553,7 +639,7 @@ static void vik_trw_layer_track_list_internal ( GtkWidget *dialog,
        // Apply own formatting of the data
        gtk_tree_view_column_set_cell_data_func ( column, renderer, format_1f_cell_data_func, GINT_TO_POINTER(column_runner-1), NULL);
 
-       column = my_new_column_text ( _("Length\n(minutes)"), renderer, view, column_runner++ );
+       (void)my_new_column_text ( _("Length\n(minutes)"), renderer, view, column_runner++ );
 
        gchar *spd_units = NULL;
        switch (speed_units) {
@@ -577,12 +663,12 @@ static void vik_trw_layer_track_list_internal ( GtkWidget *dialog,
        g_free ( spd_units );
 
        if ( height_units == VIK_UNITS_HEIGHT_FEET )
-               column = my_new_column_text ( _("Max Height\n(Feet)"), renderer, view, column_runner++ );
+               (void)my_new_column_text ( _("Max Height\n(Feet)"), renderer, view, column_runner++ );
        else
-               column = my_new_column_text ( _("Max Height\n(Metres)"), renderer, view, column_runner++ );
+               (void)my_new_column_text ( _("Max Height\n(Metres)"), renderer, view, column_runner++ );
 
        gtk_tree_view_set_model ( GTK_TREE_VIEW(view), GTK_TREE_MODEL(store) );
-       gtk_tree_selection_set_mode ( gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), GTK_SELECTION_BROWSE ); // GTK_SELECTION_MULTIPLE
+       gtk_tree_selection_set_mode ( gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), GTK_SELECTION_MULTIPLE );
        gtk_tree_view_set_rules_hint ( GTK_TREE_VIEW(view), TRUE );
 
        g_object_unref(store);