aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUnia <jthidskes@live.nl>2013-04-07 17:48:52 +0200
committerUnia <jthidskes@live.nl>2013-04-07 17:48:52 +0200
commitb9b1b56f58f7fb4dc4d61577cad2b69925c90d8d (patch)
tree122a2189a0f7506fe3c81c3fc3ede20a7fe0a81c
parent8e99ecfd81b0eb5b86337c2c2521c7093dfc66e2 (diff)
implemented laps
-rw-r--r--README.md5
-rw-r--r--gstopwatch.c101
2 files changed, 93 insertions, 13 deletions
diff --git a/README.md b/README.md
index 52fc379..256ef0f 100644
--- a/README.md
+++ b/README.md
@@ -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);