diff options
author | Jens Lammert <jens.lammert@st.ovgu.de> | 2012-06-19 14:59:25 +0200 |
---|---|---|
committer | Jens Lammert <jens.lammert@st.ovgu.de> | 2012-06-19 14:59:25 +0200 |
commit | 45bae4b6a8515e5c306fc01fc0e12509dd7d0a83 (patch) | |
tree | e35266b33d52b6248eeae51197920ec39055acb6 | |
parent | 3821329305f606cb9d6dce681c228434834f4f42 (diff) | |
download | experiment-player-45bae4b6a8515e5c306fc01fc0e12509dd7d0a83.tar.gz |
Funtionality of navigator widget implemented
- fill GtkTreeStore with data out of *.xml file
- respond to double click and coursor change
-rw-r--r-- | lib/gtk-experiment-widgets/gtk-experiment-navigator.c | 218 |
1 files changed, 182 insertions, 36 deletions
diff --git a/lib/gtk-experiment-widgets/gtk-experiment-navigator.c b/lib/gtk-experiment-widgets/gtk-experiment-navigator.c index 8f88414..41c3100 100644 --- a/lib/gtk-experiment-widgets/gtk-experiment-navigator.c +++ b/lib/gtk-experiment-widgets/gtk-experiment-navigator.c @@ -42,17 +42,27 @@ static void gtk_experiment_navigator_init(GtkExperimentNavigator *klass); static void gtk_experiment_navigator_dispose(GObject *gobject); static void gtk_experiment_navigator_finalize(GObject *gobject); +static void gtk_experiment_navigator_row_activated(GtkTreeView *tree_view, + GtkTreePath *path, + GtkTreeViewColumn *column); +static void gtk_experiment_navigator_cursor_changed(GtkTreeView *tree_view); + static void time_cell_data_cb(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data); - static inline void select_time(GtkExperimentNavigator *navi, gint64 selected_time); static inline void activate_section(GtkExperimentNavigator *navi, gint64 start, gint64 end); +static void topic_row_callback(ExperimentReader *reader, + const gchar *topic_id, + gint64 start_time, + gint64 end_time, + gpointer data); + /** * @private * Unreference object given by variable, but only once. @@ -89,6 +99,13 @@ struct _GtkExperimentNavigatorPrivate { */ }; +struct TopicCallbackData { + GtkTreeIter iter; + GtkTreeStore *store; + gint64 start_time; + gint64 end_time; +}; + /** @private */ enum { TIME_SELECTED_SIGNAL, @@ -127,20 +144,8 @@ gtk_experiment_navigator_class_init(GtkExperimentNavigatorClass *klass) gobject_class->dispose = gtk_experiment_navigator_dispose; gobject_class->finalize = gtk_experiment_navigator_finalize; - /** - * @todo - * Set signal handlers to respond to row selection (double-click) and - * row activations (single-click) in order to emit the "time-selected" - * and "section-activated" signals on the navigator widget. - * - * To set a signal handler simply set the \e GtkTreeView's - * class structure fields. For instance, - * @code - * treeview_class->row_activated = gtk_experiment_navigator_row_activated; - * treeview_class->cursor_changed = gtk_experiment_navigator_cursor_changed; - * @endcode - * Note that these signal handlers do not get any "user_data" argument. - */ + treeview_class->row_activated = gtk_experiment_navigator_row_activated; + treeview_class->cursor_changed = gtk_experiment_navigator_cursor_changed; gtk_experiment_navigator_signals[TIME_SELECTED_SIGNAL] = g_signal_new("time-selected", @@ -182,7 +187,6 @@ gtk_experiment_navigator_init(GtkExperimentNavigator *klass) GtkCellRenderer *renderer; GtkTreeStore *store; - GtkTreeIter toplevel, child; klass->priv = GTK_EXPERIMENT_NAVIGATOR_GET_PRIVATE(klass); /* @@ -194,22 +198,6 @@ gtk_experiment_navigator_init(GtkExperimentNavigator *klass) G_TYPE_INT64, G_TYPE_INT64); /* - * Create some sample(!) store rows and content - */ - /** @todo remove sample code */ - gtk_tree_store_append(store, &toplevel, NULL); - gtk_tree_store_set(store, &toplevel, - COL_NAME, "greeting", - -1); - - gtk_tree_store_append(store, &child, &toplevel); - gtk_tree_store_set(store, &child, - COL_NAME, "bz_1", - COL_START_TIME, (gint64)5*60*1000 /* 5 minutes */, - COL_END_TIME, (gint64)10*60*1000 /* 10 minutes */, - -1); - - /* * Create TreeView column corresponding to the * TreeStore column \e COL_NAME */ @@ -346,6 +334,44 @@ gtk_experiment_navigator_finalize(GObject *gobject) G_OBJECT_CLASS(gtk_experiment_navigator_parent_class)->finalize(gobject); } +static void +gtk_experiment_navigator_row_activated(GtkTreeView *tree_view, + GtkTreePath *path, + GtkTreeViewColumn *column __attribute__((unused))) +{ + GtkTreeModel *treemodel = gtk_tree_view_get_model(tree_view); + gint64 start_time; + GtkTreeIter treeiter; + + gtk_tree_model_get_iter(treemodel, &treeiter, path); + gtk_tree_model_get(treemodel, &treeiter, + COL_START_TIME, &start_time, + -1); + + select_time(GTK_EXPERIMENT_NAVIGATOR(tree_view), start_time); +} + +static void +gtk_experiment_navigator_cursor_changed(GtkTreeView *tree_view) +{ + GtkTreeModel *treemodel = gtk_tree_view_get_model(tree_view); + GtkTreePath *treepath; + GtkTreeIter treeiter; + gint64 start_time; + gint64 end_time; + + gtk_tree_view_get_cursor(tree_view, &treepath, NULL); + gtk_tree_model_get_iter(treemodel, &treeiter, treepath); + gtk_tree_path_free(treepath); + + gtk_tree_model_get(treemodel, &treeiter, + COL_START_TIME, &start_time, + COL_END_TIME, &end_time, + -1); + + activate_section(GTK_EXPERIMENT_NAVIGATOR(tree_view), start_time, end_time); +} + /** * @brief Cell data function to invoke when rendering the "Start" and * "End" columns. @@ -370,8 +396,8 @@ time_cell_data_cb(GtkTreeViewColumn *col __attribute__((unused)), gtk_tree_model_get(model, iter, column, &time_val, -1); - /** @todo Improve readability (e.g. mm:ss) */ - g_snprintf(buf, sizeof(buf), "%" G_GINT64_FORMAT "ms", time_val); + g_snprintf(buf, sizeof(buf), "%" G_GINT64_FORMAT ":%02" G_GINT64_FORMAT , + time_val /1000/60, time_val/1000 % 60); g_object_set(renderer, "text", buf, NULL); } @@ -411,6 +437,33 @@ activate_section(GtkExperimentNavigator *navi, gint64 start, gint64 end) start, end); } +/** + * Callback - legt neue Row an und fügt diese in sotre ein + * übergibt Spaltenname und Startzeit aus Userdata + * @todo: übersetzen + */ +static void +topic_row_callback(ExperimentReader *reader, + const gchar *topic_id, + gint64 start_time, + gint64 end_time, + gpointer data) +{ + struct TopicCallbackData *tcb = (struct TopicCallbackData *) data; + GtkTreeIter topic; + + if (tcb->start_time < 0) + tcb->start_time = start_time; + tcb->end_time = end_time; + + gtk_tree_store_append(tcb->store, &topic, &tcb->iter); + gtk_tree_store_set(tcb->store, &topic, + COL_NAME, topic_id, + COL_START_TIME, start_time, + COL_END_TIME, end_time, + -1); +} + /* * API */ @@ -439,8 +492,101 @@ gboolean gtk_experiment_navigator_load(GtkExperimentNavigator *navi, ExperimentReader *exp) { - /** @todo Clear contents */ - /** @todo Process XML file and fill \e TreeViewStore */ + struct TopicCallbackData tcd; + GtkTreeIter experiment_level; + GtkTreeIter last_minute_level; + + tcd.store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(navi))); + gtk_tree_store_clear(tcd.store); + + /* greeting */ + gtk_tree_store_append(tcd.store, &tcd.iter, NULL); + + tcd.start_time = -1; + experiment_reader_foreach_greeting_topic(exp, topic_row_callback, &tcd); + + gtk_tree_store_set(tcd.store, &tcd.iter, + COL_NAME, "greeting", + COL_START_TIME, tcd.start_time, + COL_END_TIME, tcd.end_time, + -1); + + /* experiment */ + gtk_tree_store_append(tcd.store, &experiment_level, NULL); + gtk_tree_store_set(tcd.store, &experiment_level, + COL_NAME, "experiment", + -1); + + gtk_tree_store_append(tcd.store, &tcd.iter, &experiment_level); + + tcd.start_time = -1; + experiment_reader_foreach_exp_initial_narrative_topic(exp, + topic_row_callback, + &tcd); + + gtk_tree_store_set(tcd.store, &tcd.iter, + COL_NAME, "initial-narrative", + COL_START_TIME, tcd.start_time < 0 ? tcd.end_time + : tcd.start_time, + COL_END_TIME, tcd.end_time, + -1); + + gtk_tree_store_set(tcd.store, &experiment_level, + COL_START_TIME, tcd.start_time < 0 ? tcd.end_time + : tcd.start_time, + -1); + + gtk_tree_store_append(tcd.store, &last_minute_level, &experiment_level); + gtk_tree_store_set(tcd.store, &last_minute_level, + COL_NAME, "last minute", + -1); + + for (gint i = 1; i <= 6; i++) { + gchar phasename[8]; + + g_snprintf(phasename, sizeof(phasename), "phase %d", i); + gtk_tree_store_append(tcd.store, + &tcd.iter, + &last_minute_level); + + tcd.start_time = -1; + experiment_reader_foreach_exp_last_minute_phase_topic(exp, i, topic_row_callback, &tcd); + + gtk_tree_store_set(tcd.store, &tcd.iter, + COL_NAME, phasename, + COL_START_TIME, tcd.start_time < 0 ? tcd.end_time + : tcd.start_time, + COL_END_TIME, tcd.end_time, + -1); + + if (i == 1) { + gtk_tree_store_set(tcd.store, &last_minute_level, + COL_START_TIME, + tcd.start_time < 0 ? tcd.end_time + : tcd.start_time, + -1); + } + } + + gtk_tree_store_set(tcd.store, &last_minute_level, + COL_END_TIME, tcd.end_time, + -1); + + gtk_tree_store_set(tcd.store, &experiment_level, + COL_END_TIME, tcd.end_time, + -1); + + /* farewell */ + gtk_tree_store_append(tcd.store, &tcd.iter, NULL); + + tcd.start_time = -1; + experiment_reader_foreach_farewell_topic(exp, topic_row_callback, &tcd); + + gtk_tree_store_set(tcd.store, &tcd.iter, + COL_NAME, "farewell", + COL_START_TIME, tcd.start_time, + COL_END_TIME, tcd.end_time, + -1); return TRUE; } |