mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Merge branch 'ui-improvements' of https://github.com/nathansamson/diveclog
* 'ui-improvements' of https://github.com/nathansamson/diveclog: Split the dive list in columns. Columns are sortable now (name = date, depth, duration) Remove the redundant frames in the notebook. Closes #9 Use a pane so the dive list can be made wider or smaller to the users wishes
This commit is contained in:
commit
230a13476d
6 changed files with 69 additions and 39 deletions
|
@ -8,9 +8,9 @@
|
||||||
extern int selected_dive;
|
extern int selected_dive;
|
||||||
#define current_dive (get_dive(selected_dive))
|
#define current_dive (get_dive(selected_dive))
|
||||||
|
|
||||||
extern GtkWidget *dive_profile_frame(void);
|
extern GtkWidget *dive_profile_widget(void);
|
||||||
extern GtkWidget *dive_info_frame(void);
|
extern GtkWidget *dive_info_frame(void);
|
||||||
extern GtkWidget *extended_dive_info_frame(void);
|
extern GtkWidget *extended_dive_info_widget(void);
|
||||||
extern GtkWidget *create_dive_list(void);
|
extern GtkWidget *create_dive_list(void);
|
||||||
extern void update_dive_info(struct dive *dive);
|
extern void update_dive_info(struct dive *dive);
|
||||||
extern void repaint_dive(void);
|
extern void repaint_dive(void);
|
||||||
|
|
48
divelist.c
48
divelist.c
|
@ -1,5 +1,6 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#include "dive.h"
|
#include "dive.h"
|
||||||
|
@ -13,7 +14,7 @@ static void selection_cb(GtkTreeSelection *selection, GtkTreeModel *model)
|
||||||
if (!gtk_tree_selection_get_selected(selection, NULL, &iter))
|
if (!gtk_tree_selection_get_selected(selection, NULL, &iter))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
gtk_tree_model_get_value(model, &iter, 1, &value);
|
gtk_tree_model_get_value(model, &iter, 5, &value);
|
||||||
selected_dive = g_value_get_int(&value);
|
selected_dive = g_value_get_int(&value);
|
||||||
repaint_dive();
|
repaint_dive();
|
||||||
}
|
}
|
||||||
|
@ -26,10 +27,27 @@ static void fill_dive_list(GtkListStore *store)
|
||||||
for (i = 0; i < dive_table.nr; i++) {
|
for (i = 0; i < dive_table.nr; i++) {
|
||||||
struct dive *dive = dive_table.dives[i];
|
struct dive *dive = dive_table.dives[i];
|
||||||
|
|
||||||
|
int len;
|
||||||
|
char buffer[256], *depth, *duration;
|
||||||
|
|
||||||
|
len = snprintf(buffer, sizeof(buffer),
|
||||||
|
"%d ft", to_feet(dive->maxdepth));
|
||||||
|
depth = malloc(len + 1);
|
||||||
|
memcpy(depth, buffer, len+1);
|
||||||
|
|
||||||
|
len = snprintf(buffer, sizeof(buffer),
|
||||||
|
"%d min", dive->duration.seconds / 60);
|
||||||
|
duration = malloc(len + 1);
|
||||||
|
memcpy(duration, buffer, len+1);
|
||||||
|
|
||||||
gtk_list_store_append(store, &iter);
|
gtk_list_store_append(store, &iter);
|
||||||
gtk_list_store_set(store, &iter,
|
gtk_list_store_set(store, &iter,
|
||||||
0, dive->name,
|
0, dive->name,
|
||||||
1, i,
|
1, depth,
|
||||||
|
2, dive->maxdepth,
|
||||||
|
3, duration,
|
||||||
|
4, dive->duration.seconds,
|
||||||
|
5, i,
|
||||||
-1);
|
-1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -43,7 +61,10 @@ GtkWidget *create_dive_list(void)
|
||||||
GtkTreeViewColumn *col;
|
GtkTreeViewColumn *col;
|
||||||
GtkWidget *scroll_window;
|
GtkWidget *scroll_window;
|
||||||
|
|
||||||
model = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT);
|
model = gtk_list_store_new(6, G_TYPE_STRING,
|
||||||
|
G_TYPE_STRING, G_TYPE_INT,
|
||||||
|
G_TYPE_STRING, G_TYPE_INT,
|
||||||
|
G_TYPE_INT);
|
||||||
tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model));
|
tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model));
|
||||||
selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view));
|
selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view));
|
||||||
|
|
||||||
|
@ -54,11 +75,30 @@ GtkWidget *create_dive_list(void)
|
||||||
|
|
||||||
renderer = gtk_cell_renderer_text_new();
|
renderer = gtk_cell_renderer_text_new();
|
||||||
col = gtk_tree_view_column_new();
|
col = gtk_tree_view_column_new();
|
||||||
|
gtk_tree_view_column_set_title(col, "Name");
|
||||||
|
gtk_tree_view_column_set_sort_column_id(col, 0);
|
||||||
|
gtk_tree_view_column_set_resizable (col, TRUE);
|
||||||
gtk_tree_view_column_pack_start(col, renderer, TRUE);
|
gtk_tree_view_column_pack_start(col, renderer, TRUE);
|
||||||
gtk_tree_view_column_add_attribute(col, renderer, "text", 0);
|
gtk_tree_view_column_add_attribute(col, renderer, "text", 0);
|
||||||
gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), col);
|
gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), col);
|
||||||
|
|
||||||
g_object_set(G_OBJECT(tree_view), "headers-visible", FALSE,
|
renderer = gtk_cell_renderer_text_new();
|
||||||
|
col = gtk_tree_view_column_new();
|
||||||
|
gtk_tree_view_column_set_title(col, "Depth");
|
||||||
|
gtk_tree_view_column_set_sort_column_id(col, 2);
|
||||||
|
gtk_tree_view_column_pack_start(col, renderer, TRUE);
|
||||||
|
gtk_tree_view_column_add_attribute(col, renderer, "text", 1);
|
||||||
|
gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), col);
|
||||||
|
|
||||||
|
renderer = gtk_cell_renderer_text_new();
|
||||||
|
col = gtk_tree_view_column_new();
|
||||||
|
gtk_tree_view_column_set_title(col, "Duration");
|
||||||
|
gtk_tree_view_column_set_sort_column_id(col, 4);
|
||||||
|
gtk_tree_view_column_pack_start(col, renderer, TRUE);
|
||||||
|
gtk_tree_view_column_add_attribute(col, renderer, "text", 3);
|
||||||
|
gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), col);
|
||||||
|
|
||||||
|
g_object_set(G_OBJECT(tree_view), "headers-visible", TRUE,
|
||||||
"search-column", 0,
|
"search-column", 0,
|
||||||
"rules-hint", FALSE,
|
"rules-hint", FALSE,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
9
info.c
9
info.c
|
@ -181,21 +181,16 @@ static GtkTextBuffer *text_view(GtkWidget *box, const char *label, gboolean expa
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
GtkWidget *extended_dive_info_frame(void)
|
GtkWidget *extended_dive_info_widget(void)
|
||||||
{
|
{
|
||||||
GtkWidget *frame;
|
|
||||||
GtkWidget *vbox;
|
GtkWidget *vbox;
|
||||||
|
|
||||||
frame = gtk_frame_new("Extended dive info");
|
|
||||||
gtk_widget_show(frame);
|
|
||||||
|
|
||||||
vbox = gtk_vbox_new(FALSE, 5);
|
vbox = gtk_vbox_new(FALSE, 5);
|
||||||
gtk_container_add(GTK_CONTAINER(frame), vbox);
|
|
||||||
|
|
||||||
location = text_entry(vbox, "Location");
|
location = text_entry(vbox, "Location");
|
||||||
notes = text_view(vbox, "Notes", TRUE);
|
notes = text_view(vbox, "Notes", TRUE);
|
||||||
|
|
||||||
/* Add extended info here: name, description, yadda yadda */
|
/* Add extended info here: name, description, yadda yadda */
|
||||||
update_dive_info(current_dive);
|
update_dive_info(current_dive);
|
||||||
return frame;
|
return vbox;
|
||||||
}
|
}
|
||||||
|
|
33
main.c
33
main.c
|
@ -174,9 +174,11 @@ int main(int argc, char **argv)
|
||||||
int i;
|
int i;
|
||||||
GtkWidget *win;
|
GtkWidget *win;
|
||||||
GtkWidget *divelist;
|
GtkWidget *divelist;
|
||||||
GtkWidget *table;
|
GtkWidget *paned;
|
||||||
|
GtkWidget *info_box;
|
||||||
GtkWidget *notebook;
|
GtkWidget *notebook;
|
||||||
GtkWidget *frame;
|
GtkWidget *frame;
|
||||||
|
GtkWidget *dive_info;
|
||||||
GtkWidget *menubar;
|
GtkWidget *menubar;
|
||||||
GtkWidget *vbox;
|
GtkWidget *vbox;
|
||||||
|
|
||||||
|
@ -206,34 +208,33 @@ int main(int argc, char **argv)
|
||||||
menubar = get_menubar_menu(win);
|
menubar = get_menubar_menu(win);
|
||||||
gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
|
gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
|
||||||
|
|
||||||
/* Table for the list of dives, cairo window, and dive info */
|
/* HPane for left the dive list, and right the dive info */
|
||||||
table = gtk_table_new(2, 2, FALSE);
|
paned = gtk_hpaned_new();
|
||||||
gtk_container_set_border_width(GTK_CONTAINER(table), 5);
|
gtk_box_pack_end(GTK_BOX(vbox), paned, TRUE, TRUE, 0);
|
||||||
gtk_box_pack_end(GTK_BOX(vbox), table, TRUE, TRUE, 0);
|
|
||||||
gtk_widget_show(table);
|
|
||||||
|
|
||||||
/* Create the atual divelist */
|
/* Create the atual divelist */
|
||||||
divelist = create_dive_list();
|
divelist = create_dive_list();
|
||||||
gtk_table_attach(GTK_TABLE(table), divelist, 0, 1, 0, 2,
|
gtk_paned_add1(GTK_PANED(paned), divelist);
|
||||||
0, GTK_FILL | GTK_SHRINK | GTK_EXPAND, 0, 0);
|
|
||||||
|
/* VBox for dive info, and tabs */
|
||||||
|
info_box = gtk_vbox_new(FALSE, 5);
|
||||||
|
gtk_paned_add2(GTK_PANED(paned), info_box);
|
||||||
|
|
||||||
/* Frame for minimal dive info */
|
/* Frame for minimal dive info */
|
||||||
frame = dive_info_frame();
|
frame = dive_info_frame();
|
||||||
gtk_table_attach(GTK_TABLE(table), frame, 1, 2, 0, 1,
|
gtk_box_pack_start(GTK_BOX(info_box), frame, FALSE, TRUE, 5);
|
||||||
GTK_FILL | GTK_SHRINK | GTK_EXPAND, 0, 0, 0);
|
|
||||||
|
|
||||||
/* Notebook for dive info vs profile vs .. */
|
/* Notebook for dive info vs profile vs .. */
|
||||||
notebook = gtk_notebook_new();
|
notebook = gtk_notebook_new();
|
||||||
gtk_table_attach_defaults(GTK_TABLE(table), notebook, 1, 2, 1, 2);
|
gtk_box_pack_start(GTK_BOX(info_box), notebook, TRUE, TRUE, 5);
|
||||||
|
|
||||||
/* Frame for dive profile */
|
/* Frame for dive profile */
|
||||||
frame = dive_profile_frame();
|
dive_profile = dive_profile_widget();
|
||||||
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), frame, gtk_label_new("Dive Profile"));
|
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), dive_profile, gtk_label_new("Dive Profile"));
|
||||||
dive_profile = frame;
|
|
||||||
|
|
||||||
/* Frame for extended dive info */
|
/* Frame for extended dive info */
|
||||||
frame = extended_dive_info_frame();
|
dive_info = extended_dive_info_widget();
|
||||||
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), frame, gtk_label_new("Extended dive Info"));
|
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), dive_info, gtk_label_new("Extended dive Info"));
|
||||||
|
|
||||||
gtk_widget_set_app_paintable(win, TRUE);
|
gtk_widget_set_app_paintable(win, TRUE);
|
||||||
gtk_widget_show_all(win);
|
gtk_widget_show_all(win);
|
||||||
|
|
|
@ -693,11 +693,9 @@ static char *generate_name(struct dive *dive)
|
||||||
|
|
||||||
len = snprintf(buffer, sizeof(buffer),
|
len = snprintf(buffer, sizeof(buffer),
|
||||||
"%04d-%02d-%02d "
|
"%04d-%02d-%02d "
|
||||||
"%02d:%02d:%02d "
|
"%02d:%02d:%02d",
|
||||||
"(%d ft, %d min)",
|
|
||||||
tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
|
tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
|
||||||
tm->tm_hour, tm->tm_min, tm->tm_sec,
|
tm->tm_hour, tm->tm_min, tm->tm_sec);
|
||||||
to_feet(dive->maxdepth), dive->duration.seconds / 60);
|
|
||||||
p = malloc(len+1);
|
p = malloc(len+1);
|
||||||
if (!p)
|
if (!p)
|
||||||
exit(1);
|
exit(1);
|
||||||
|
|
|
@ -195,17 +195,13 @@ static gboolean expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
GtkWidget *dive_profile_frame(void)
|
GtkWidget *dive_profile_widget(void)
|
||||||
{
|
{
|
||||||
GtkWidget *frame;
|
|
||||||
GtkWidget *da;
|
GtkWidget *da;
|
||||||
|
|
||||||
frame = gtk_frame_new("Dive profile");
|
|
||||||
gtk_widget_show(frame);
|
|
||||||
da = gtk_drawing_area_new();
|
da = gtk_drawing_area_new();
|
||||||
gtk_widget_set_size_request(da, 450, 350);
|
gtk_widget_set_size_request(da, 450, 350);
|
||||||
g_signal_connect(da, "expose_event", G_CALLBACK(expose_event), NULL);
|
g_signal_connect(da, "expose_event", G_CALLBACK(expose_event), NULL);
|
||||||
gtk_container_add(GTK_CONTAINER(frame), da);
|
|
||||||
|
|
||||||
return frame;
|
return da;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue