aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUnia <jthidskes@live.nl>2013-04-08 14:03:38 +0200
committerUnia <jthidskes@live.nl>2013-04-08 14:03:38 +0200
commit4b83a13e715160f75198bc29bb54f8fa4d268e5f (patch)
tree20824edf7136de8366da8bb6b9175ad8f17752b6
parent64c058fe2c99b31e7e4b5d35ce9bc6dd80af75af (diff)
ui improvements, buttons instead of spacebar
-rw-r--r--README.md13
-rw-r--r--gstopwatch.c144
2 files changed, 75 insertions, 82 deletions
diff --git a/README.md b/README.md
index ab07e27..d092f86 100644
--- a/README.md
+++ b/README.md
@@ -7,11 +7,6 @@ Okay, so apparently there are absolutely zero good stopwatches around for X11!
I spent my time searching but couldn't find one simple enough for me. This
stopwatch will start counting, stop counting and reset.
-Usage
------
-
-The spacebar does it all! Press space to start timing, space to pause, space again to continue and r to reset the timer when it is paused.
-
Installation
------------
@@ -19,7 +14,7 @@ You'll need the GTK 3.x libraries and headers installed and ready to go. To
build, simply run these commands:
$ make
- $ make clean install
+ # make clean install
Bugs
----
@@ -32,12 +27,10 @@ For any bug or request [fill an issue][bug] on [GitHub][ghp].
ToDo
----
-* Display text like gnome-clocks?
-* Font size depend on available space?
+* Add hundreds/tenths of seconds?
* Add about dialog back in?
* Add a timer function too, in GtkNotebook?
-* Keyboard shortcut to add/delete laps?
-* Clever lap deleting
+* Add split in laps: difference between lap 1 and lap 2
License
-------
diff --git a/gstopwatch.c b/gstopwatch.c
index 0a910b1..3351cc4 100644
--- a/gstopwatch.c
+++ b/gstopwatch.c
@@ -3,14 +3,11 @@
#include <glib.h>
#include <glib/gi18n.h>
-gchar output[100];
-gint lap = 0, seconds;
-GTimer *timer;
-gboolean running;
-GtkWidget *timer_display, *tree, *button_delete;
-GtkListStore *liststore;
-GtkTreeSelection *selection;
-GtkTreeIter selection_iter, iter;
+enum {
+ STARTED,
+ PAUSED,
+ STOPPED
+};
enum {
N_LAP,
@@ -18,11 +15,19 @@ enum {
N_COLUMNS
};
+gchar output[100];
+GTimer *timer;
+gint state = STOPPED;
+GtkWidget *timer_display, *button_timer, *button_funcs, *tree;
+GtkListStore *liststore;
+GtkTreeSelection *selection;
+GtkTreeIter selection_iter, iter;
+
gboolean update_progress_bar (void) {
- gint hours, minutes;
+ gint hours, minutes, seconds;
gchar *markup;
gulong gulong;
- gdouble hseconds;
+ /*gdouble hseconds;*/
/*hseconds = g_timer_elapsed (timer, &gulong);
hseconds = */
@@ -41,28 +46,56 @@ gboolean update_progress_bar (void) {
return TRUE;
}
-gboolean start_timer (GtkWidget *widget, GdkEventKey *event) {
- guint(g) = event->keyval;
-
- if(running == FALSE) {
- if((g == GDK_KEY_space)) {
- g_timer_continue(timer);
- running = TRUE;
- return TRUE;
- } else if((g == GDK_KEY_r)) {
- seconds = 0;
- g_timer_reset(timer);
- running = FALSE;
- return TRUE;
- }
- } else if(running == TRUE) {
- if((g == GDK_KEY_space)) {
- g_timer_stop(timer);
- running = FALSE;
- return TRUE;
+void add_lap (void) {
+ gint lap = 0;
+ 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);
}
}
- return FALSE;
+}
+
+void on_timer_button_clicked (void) {
+ if(state == STOPPED) {
+ g_timer_start(timer);
+ gtk_button_set_label(GTK_BUTTON(button_timer), "Stop");
+ gtk_widget_set_sensitive(GTK_WIDGET(button_funcs), TRUE);
+ gtk_button_set_label(GTK_BUTTON(button_funcs), "Lap");
+ state = STARTED;
+ } else if(state == PAUSED) {
+ g_timer_continue(timer);
+ gtk_button_set_label(GTK_BUTTON(button_timer), "Stop");
+ gtk_button_set_label(GTK_BUTTON(button_funcs), "Lap");
+ state = STARTED;
+ } else if(state == STARTED) {
+ g_timer_stop(timer);
+ gtk_button_set_label(GTK_BUTTON(button_timer), "Continue");
+ gtk_widget_set_sensitive(GTK_WIDGET(button_funcs), TRUE);
+ gtk_button_set_label(GTK_BUTTON(button_funcs), "Reset");
+ state = PAUSED;
+ }
+}
+
+void on_funcs_button_clicked (void) {
+ if(state == STARTED)
+ add_lap();
+ else if(state == PAUSED) {
+ g_timer_start(timer);
+ g_timer_stop(timer);
+ gtk_widget_set_sensitive(GTK_WIDGET(button_funcs), FALSE);
+ gtk_button_set_label(GTK_BUTTON(button_funcs), "Reset");
+ gtk_button_set_label(GTK_BUTTON(button_timer), "Start");
+ gtk_list_store_clear(GTK_LIST_STORE(liststore));
+ state = STOPPED;
+ }
}
/*void about_dialog_close (GtkWidget *about_dialog) {
@@ -104,39 +137,8 @@ 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);
- if(lap != 0)
- 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, *vbox, *hbox, *button_about, *button_lap;
+ GtkWidget *window, *vbox, *hbox;
GtkTreeViewColumn *column;
GtkCellRenderer *renderer;
@@ -146,9 +148,9 @@ int main (int argc, char *argv[]) {
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
timer_display = gtk_label_new("");
- 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);
+ button_timer = gtk_button_new_with_label("Start");
+ button_funcs = gtk_button_new_with_label("Reset");
+ gtk_widget_set_sensitive(button_funcs, FALSE);
tree = gtk_tree_view_new();
liststore = gtk_list_store_new(N_COLUMNS, G_TYPE_INT, G_TYPE_STRING);
@@ -173,11 +175,11 @@ int main (int argc, char *argv[]) {
gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
gtk_box_pack_start(GTK_BOX(vbox), timer_display, FALSE, TRUE, 5);
+ gtk_box_pack_start(GTK_BOX(hbox), button_timer, TRUE, TRUE, 5);
+ gtk_box_pack_start(GTK_BOX(hbox), button_funcs, TRUE, TRUE, 5);
+ gtk_container_add(GTK_CONTAINER(vbox), hbox);
gtk_box_pack_start(GTK_BOX(vbox), tree, TRUE, TRUE, 5);
- gtk_box_pack_start(GTK_BOX(vbox), button_delete, FALSE, TRUE, 5);
- gtk_box_pack_start(GTK_BOX(vbox), button_lap, FALSE, TRUE, 5);
/*gtk_box_pack_start(GTK_BOX(hbox), button_about, TRUE, TRUE, 5);*/
- /*gtk_container_add(GTK_CONTAINER(vbox), hbox);*/
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW(window), "Gstopwatch");
@@ -190,11 +192,9 @@ 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(start_timer), window);
- 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);
+ g_signal_connect(button_timer, "clicked", G_CALLBACK(on_timer_button_clicked), NULL);
+ g_signal_connect(button_funcs, "clicked", G_CALLBACK(on_funcs_button_clicked), NULL);
gtk_main();
g_timer_destroy(timer);