]> git.tdb.fi Git - ext/subsurface.git/blob - divelist.c
Merge branch 'more-divelist-goodness' of https://github.com/nathansamson/diveclog
[ext/subsurface.git] / divelist.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <time.h>
5
6 #include "dive.h"
7 #include "display.h"
8
9 static void selection_cb(GtkTreeSelection *selection, GtkTreeModel *model)
10 {
11         GtkTreeIter iter;
12         GValue value = {0, };
13
14         if (!gtk_tree_selection_get_selected(selection, NULL, &iter))
15                 return;
16
17         gtk_tree_model_get_value(model, &iter, 6, &value);
18         selected_dive = g_value_get_int(&value);
19         repaint_dive();
20 }
21
22 static void fill_dive_list(GtkListStore *store)
23 {
24         int i;
25         GtkTreeIter iter;
26
27         for (i = 0; i < dive_table.nr; i++) {
28                 struct dive *dive = dive_table.dives[i];
29
30                 int len;
31                 char buffer[256], *datestr, *depth, *duration;
32                 struct tm *tm;
33                 
34                 tm = gmtime(&dive->when);
35                 len = snprintf(buffer, sizeof(buffer),
36                         "%02d.%02d.%02d %02d:%02d",
37                         tm->tm_mday, tm->tm_mon+1, tm->tm_year % 100,
38                         tm->tm_hour, tm->tm_min);
39                 datestr = malloc(len+1);
40                 memcpy(datestr, buffer, len+1);
41
42                 len = snprintf(buffer, sizeof(buffer),
43                                "%d", to_feet(dive->maxdepth));
44                 depth = malloc(len + 1);
45                 memcpy(depth, buffer, len+1);
46                 
47                 len = snprintf(buffer, sizeof(buffer),
48                                "%d", dive->duration.seconds / 60);
49                 duration = malloc(len + 1);
50                 memcpy(duration, buffer, len+1);
51
52                 gtk_list_store_append(store, &iter);
53                 gtk_list_store_set(store, &iter,
54                         0, datestr,
55                         1, dive->when,
56                         2, depth,
57                         3, dive->maxdepth,
58                         4, duration,
59                         5, dive->duration.seconds,
60                         6, i,
61                         -1);
62         }
63 }
64
65 GtkWidget *create_dive_list(void)
66 {
67         GtkListStore      *model;
68         GtkWidget         *tree_view;
69         GtkTreeSelection  *selection;
70         GtkCellRenderer   *renderer;
71         GtkTreeViewColumn *col;
72         GtkWidget         *scroll_window;
73
74         model = gtk_list_store_new(7,
75                                    G_TYPE_STRING, G_TYPE_INT,
76                                    G_TYPE_STRING, G_TYPE_INT, 
77                                    G_TYPE_STRING, G_TYPE_INT,
78                                    G_TYPE_INT);
79         tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model));
80         selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view));
81
82         gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_BROWSE);
83         gtk_widget_set_size_request(tree_view, 200, 100);
84
85         fill_dive_list(model);
86
87         renderer = gtk_cell_renderer_text_new();
88         col = gtk_tree_view_column_new();
89         gtk_tree_view_column_set_title(col, "Date");
90         gtk_tree_view_column_set_sort_column_id(col, 1);
91         gtk_tree_view_column_set_resizable (col, TRUE);
92         gtk_tree_view_column_pack_start(col, renderer, TRUE);
93         gtk_tree_view_column_add_attribute(col, renderer, "text", 0);
94         gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), col);
95         
96         renderer = gtk_cell_renderer_text_new();
97         col = gtk_tree_view_column_new();
98         gtk_tree_view_column_set_title(col, "ft");
99         gtk_tree_view_column_set_sort_column_id(col, 3);
100         gtk_tree_view_column_pack_start(col, renderer, FALSE);
101         gtk_tree_view_column_add_attribute(col, renderer, "text", 2);
102         gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), col);
103         gtk_object_set(GTK_OBJECT(renderer), "alignment", PANGO_ALIGN_RIGHT, NULL);
104         gtk_cell_renderer_set_alignment(GTK_CELL_RENDERER(renderer), 1.0, 0.5);
105         
106         renderer = gtk_cell_renderer_text_new();
107         col = gtk_tree_view_column_new();
108         gtk_tree_view_column_set_title(col, "min");
109         gtk_tree_view_column_set_sort_column_id(col, 5);
110         gtk_tree_view_column_pack_start(col, renderer, FALSE);
111         gtk_tree_view_column_add_attribute(col, renderer, "text", 4);
112         gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), col);
113         gtk_object_set(GTK_OBJECT(renderer), "alignment", PANGO_ALIGN_RIGHT, NULL);
114         gtk_cell_renderer_set_alignment(GTK_CELL_RENDERER(renderer), 1.0, 0.5);
115
116         g_object_set(G_OBJECT(tree_view), "headers-visible", TRUE,
117                                           "search-column", 0,
118                                           "rules-hint", FALSE,
119                                           NULL);
120
121         g_signal_connect(selection, "changed", G_CALLBACK(selection_cb), model);
122
123         scroll_window = gtk_scrolled_window_new(NULL, NULL);
124         gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_window),
125                                GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
126         gtk_container_add(GTK_CONTAINER(scroll_window), tree_view);
127
128         return scroll_window;
129 }