diff options
author | Unia <jthidskes@live.nl> | 2013-04-07 17:48:52 +0200 |
---|---|---|
committer | Unia <jthidskes@live.nl> | 2013-04-07 17:48:52 +0200 |
commit | b9b1b56f58f7fb4dc4d61577cad2b69925c90d8d (patch) | |
tree | 122a2189a0f7506fe3c81c3fc3ede20a7fe0a81c | |
parent | 8e99ecfd81b0eb5b86337c2c2521c7093dfc66e2 (diff) |
implemented laps
-rw-r--r-- | README.md | 5 | ||||
-rw-r--r-- | gstopwatch.c | 101 |
2 files changed, 93 insertions, 13 deletions
@@ -33,8 +33,9 @@ ToDo ---- * Display text like gnome-clocks? -* Laps -* Font size depend on window size +* Font size depend on available space? +* Centralize expander Laps +* Perhaps move button_lap to ebox? License ------- diff --git a/gstopwatch.c b/gstopwatch.c index 6a15036..cffa67e 100644 --- a/gstopwatch.c +++ b/gstopwatch.c @@ -3,12 +3,22 @@ #include <glib.h> #include <glib/gi18n.h> -gboolean running; +gchar output[100]; +gint lap = 0; GTimer *timer; -GtkWidget *timer_display; +gboolean running; +GtkWidget *timer_display, *tree, *button_delete; +GtkListStore *liststore; +GtkTreeSelection *selection; +GtkTreeIter selection_iter, iter; + +enum { + N_LAP, + TIME, + N_COLUMNS +}; gboolean update_progress_bar (void) { - gchar output[100]; gint hours, minutes, seconds = -1; gulong gulong; @@ -79,23 +89,89 @@ void about_dialog_open (void) { gtk_widget_show (about_dialog); } +void on_list_selection_changed (void) { + GtkTreeModel *model; + + if (gtk_tree_selection_get_selected(selection, &model, &selection_iter)) + gtk_widget_set_sensitive(button_delete, TRUE); + else + gtk_widget_set_sensitive(button_delete, FALSE); +} + +void on_delete_button_clicked (void) { + gtk_list_store_remove (GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (tree))), &selection_iter); + lap--; +} + +void on_lap_button_clicked (void) { + GtkTreePath *path; + + lap++; + gtk_list_store_append(liststore, &iter); + gtk_list_store_set(liststore, &iter, N_LAP, lap, TIME, output, -1); + gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(tree)), &iter); + if(selection) { + if(gtk_tree_selection_get_selected(selection, NULL, &iter) ) { + path = gtk_tree_model_get_path(gtk_tree_view_get_model(GTK_TREE_VIEW(tree)), &iter); + gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(tree), path, NULL, FALSE, 0, 0); + gtk_tree_path_free(path); + } + } +} + int main (int argc, char *argv[]) { - GtkWidget *window, *box, *box_buttons, *button_about; + GtkWidget *window, *vbox, *hbox, *expander, *ebox, *button_about, *button_lap; + GtkTreeViewColumn *column; + GtkCellRenderer *renderer; gtk_init(&argc, &argv); timer_display = gtk_label_new(""); + expander = gtk_expander_new("Laps"); button_about = gtk_button_new_from_stock("gtk-about"); - box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); - box_buttons = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); - gtk_box_pack_start(GTK_BOX(box), timer_display, TRUE, TRUE, 5); - gtk_container_add(GTK_CONTAINER(box), box_buttons); - gtk_box_pack_end(GTK_BOX(box_buttons), button_about, FALSE, FALSE, 5); + button_lap = gtk_button_new_from_stock("gtk-save"); + button_delete = gtk_button_new_from_stock("gtk-delete"); + gtk_widget_set_sensitive(button_delete, FALSE); + + /* setup the tree view widget */ + tree = gtk_tree_view_new(); + liststore = gtk_list_store_new(N_COLUMNS, G_TYPE_INT, G_TYPE_STRING); + gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(tree), TRUE); + gtk_tree_view_set_model(GTK_TREE_VIEW(tree), GTK_TREE_MODEL(liststore)); + + column = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title(column, "Lap"); + + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, renderer, TRUE); + gtk_tree_view_column_set_attributes(column, renderer, "text", N_LAP, NULL); + gtk_tree_view_column_set_sort_column_id(column, N_LAP); + gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); + + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Time", renderer, "text", TIME, NULL); + gtk_tree_view_column_set_sort_column_id(column, TIME); + gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); + + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree)); + gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE); + + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); + ebox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); + gtk_box_pack_start(GTK_BOX(vbox), timer_display, TRUE, TRUE, 5); + gtk_box_pack_start(GTK_BOX(ebox), tree, TRUE, TRUE, 5); + gtk_box_pack_start(GTK_BOX(ebox), button_delete, FALSE, FALSE, 5); + gtk_container_add(GTK_CONTAINER(expander), ebox); + gtk_box_pack_start(GTK_BOX(vbox), expander, TRUE, TRUE, 5); + gtk_container_add(GTK_CONTAINER(vbox), hbox); + gtk_box_pack_start(GTK_BOX(hbox), button_about, FALSE, FALSE, 5); + gtk_box_pack_end(GTK_BOX(hbox), button_lap, FALSE, FALSE, 5); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW(window), "Gstopwatch"); gtk_window_set_default_icon_name("clocks"); - gtk_container_add(GTK_CONTAINER(window), box); + gtk_container_add(GTK_CONTAINER(window), vbox); gtk_widget_show_all(window); timer = g_timer_new(); @@ -104,7 +180,10 @@ int main (int argc, char *argv[]) { g_timeout_add_full(G_PRIORITY_HIGH, 50, (GSourceFunc) update_progress_bar, NULL, NULL); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(G_OBJECT(window), "key-press-event", G_CALLBACK(keypress), window); - g_signal_connect (button_about, "clicked", G_CALLBACK (about_dialog_open), NULL); + g_signal_connect (G_OBJECT (selection), "changed", G_CALLBACK (on_list_selection_changed), NULL); + g_signal_connect(button_about, "clicked", G_CALLBACK(about_dialog_open), NULL); + g_signal_connect(button_delete, "clicked", G_CALLBACK(on_delete_button_clicked), NULL); + g_signal_connect(button_lap, "clicked", G_CALLBACK(on_lap_button_clicked), NULL); gtk_main(); g_timer_destroy(timer); |