aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2012-06-14 14:30:27 +0200
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2012-06-14 14:30:27 +0200
commit78ab2d265d8fbd2bb4bbfb1533645154e12db2c2 (patch)
treed8973f1be8b332a3fd0cfcc9ff442b5ab918d4d9
parent266d6602381aba46a1f5de1b72206f20223f3868 (diff)
downloadexperiment-player-78ab2d265d8fbd2bb4bbfb1533645154e12db2c2.tar.gz
new navigator signal (for Jens to use): section-selected should be emitted when an entry is single-clicked
* connected with transcript widgets: the selected section becomes the transcripts backdrop area * updated documentation for callbacks in class structure
-rw-r--r--lib/gtk-experiment-widgets/cclosure-marshallers.list3
-rw-r--r--lib/gtk-experiment-widgets/gtk-experiment-navigator.c46
-rw-r--r--lib/gtk-experiment-widgets/gtk-experiment-navigator.h16
-rw-r--r--src/default.ui5
-rw-r--r--src/main.c51
5 files changed, 115 insertions, 6 deletions
diff --git a/lib/gtk-experiment-widgets/cclosure-marshallers.list b/lib/gtk-experiment-widgets/cclosure-marshallers.list
index c3ecc04..539e1a4 100644
--- a/lib/gtk-experiment-widgets/cclosure-marshallers.list
+++ b/lib/gtk-experiment-widgets/cclosure-marshallers.list
@@ -1,2 +1,5 @@
# Standard marshallers for "time-selected" signal callbacks
VOID:INT64
+
+# Standard marshallers for "section-activated" signal callbacks
+VOID:INT64,INT64
diff --git a/lib/gtk-experiment-widgets/gtk-experiment-navigator.c b/lib/gtk-experiment-widgets/gtk-experiment-navigator.c
index 2d1c48a..52143ad 100644
--- a/lib/gtk-experiment-widgets/gtk-experiment-navigator.c
+++ b/lib/gtk-experiment-widgets/gtk-experiment-navigator.c
@@ -48,7 +48,10 @@ static void time_cell_data_cb(GtkTreeViewColumn *col,
gpointer user_data);
-static inline void select_time(GtkExperimentNavigator *navi, gint64 selected_time);
+static inline void select_time(GtkExperimentNavigator *navi,
+ gint64 selected_time);
+static inline void activate_section(GtkExperimentNavigator *navi,
+ gint64 start, gint64 end);
/**
* @private
@@ -89,6 +92,7 @@ struct _GtkExperimentNavigatorPrivate {
/** @private */
enum {
TIME_SELECTED_SIGNAL,
+ SECTION_ACTIVATED_SIGNAL,
LAST_SIGNAL
};
static guint gtk_experiment_navigator_signals[LAST_SIGNAL] = {0};
@@ -117,10 +121,20 @@ static void
gtk_experiment_navigator_class_init(GtkExperimentNavigatorClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
+ GtkTreeViewClass *treeview_class = GTK_TREE_VIEW_CLASS(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.
+ */
+
gtk_experiment_navigator_signals[TIME_SELECTED_SIGNAL] =
g_signal_new("time-selected",
G_TYPE_FROM_CLASS(klass),
@@ -130,6 +144,15 @@ gtk_experiment_navigator_class_init(GtkExperimentNavigatorClass *klass)
gtk_experiment_widgets_marshal_VOID__INT64,
G_TYPE_NONE, 1, G_TYPE_INT64);
+ gtk_experiment_navigator_signals[SECTION_ACTIVATED_SIGNAL] =
+ g_signal_new("section-activated",
+ G_TYPE_FROM_CLASS(klass),
+ G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+ G_STRUCT_OFFSET(GtkExperimentNavigatorClass, section_activated),
+ NULL, NULL,
+ gtk_experiment_widgets_marshal_VOID__INT64_INT64,
+ G_TYPE_NONE, 2, G_TYPE_INT64, G_TYPE_INT64);
+
g_type_class_add_private(klass, sizeof(GtkExperimentNavigatorPrivate));
}
@@ -216,7 +239,6 @@ gtk_experiment_navigator_init(GtkExperimentNavigator *klass)
g_object_unref(store);
/** @todo better \e TreeViewColumn formatting */
- /** @todo connect signals to respond to row activations */
/**
* @todo
* Initialize necessary \b public and \b private attributes.
@@ -328,7 +350,7 @@ time_cell_data_cb(GtkTreeViewColumn *col __attribute__((unused)),
/**
* @brief Emit "time-selected" signal on a \e GtkExperimentNavigator instance.
*
- * It should be emitted when a row entry was selected.
+ * It should be emitted when a row entry was selected (double-clicked).
*
* @sa GtkExperimentNavigatorClass::time_selected
*
@@ -342,6 +364,24 @@ select_time(GtkExperimentNavigator *navi, gint64 selected_time)
selected_time);
}
+/**
+ * @brief Emit "section-activated" signal on a \e GtkExperimentNavigator instance.
+ *
+ * It should be emitted when a row entry was activated (e.g. single-clicked)
+ *
+ * @sa GtkExperimentNavigatorClass::section_activated
+ *
+ * @param navi Widget to emit the signal on
+ * @param start Start time of section in milliseconds
+ * @param end End time of section in milliseconds
+ */
+static inline void
+activate_section(GtkExperimentNavigator *navi, gint64 start, gint64 end)
+{
+ g_signal_emit(navi, gtk_experiment_navigator_signals[SECTION_ACTIVATED_SIGNAL], 0,
+ start, end);
+}
+
/*
* API
*/
diff --git a/lib/gtk-experiment-widgets/gtk-experiment-navigator.h b/lib/gtk-experiment-widgets/gtk-experiment-navigator.h
index 0a0e73e..af0ae50 100644
--- a/lib/gtk-experiment-widgets/gtk-experiment-navigator.h
+++ b/lib/gtk-experiment-widgets/gtk-experiment-navigator.h
@@ -76,14 +76,24 @@ typedef struct _GtkExperimentNavigatorClass {
/**
* Callback function to invoke when emitting the "time-selected"
- * signal. Do not set manually.
+ * signal.
*
* @param self \e GtkExperimentNavigator the event was emitted on.
* @param selected_time Time selected by the navigator in milliseconds
- * @param user_data Callback user data
*/
void (*time_selected)(GtkExperimentNavigator *self,
- gint64 selected_time, gpointer user_data);
+ gint64 selected_time);
+
+ /**
+ * Callback function to invoke when emitting the "section-activated"
+ * signal.
+ *
+ * @param self \e GtkExperimentNavigator the event was emitted on.
+ * @param start Start time of section in milliseconds
+ * @param end End time of section in milliseconds
+ */
+ void (*section_activated)(GtkExperimentNavigator *self,
+ gint64 start, gint64 end);
} GtkExperimentNavigatorClass;
/** @private */
diff --git a/src/default.ui b/src/default.ui
index e8496d6..923a0c5 100644
--- a/src/default.ui
+++ b/src/default.ui
@@ -319,11 +319,13 @@ audio-volume-medium</property>
<child>
<object class="GtkExperimentTranscript" id="transcript_wizard_widget">
<property name="visible">True</property>
+ <property name="can_focus">True</property>
</object>
</child>
<child>
<object class="GtkExperimentTranscript" id="transcript_proband_widget">
<property name="visible">True</property>
+ <property name="can_focus">True</property>
</object>
<packing>
<property name="left_attach">1</property>
@@ -485,6 +487,9 @@ audio-volume-medium</property>
<property name="headers_clickable">False</property>
<property name="search_column">0</property>
<signal name="time_selected" handler="navigator_widget_time_selected_cb" object="player_widget"/>
+ <signal name="section_activated" handler="navigator_widget_section_activated_cb"/>
+ <signal name="focus_in_event" handler="navigator_widget_generic_focus_event_cb"/>
+ <signal name="focus_out_event" handler="navigator_widget_generic_focus_event_cb"/>
</object>
</child>
</object>
diff --git a/src/main.c b/src/main.c
index ee81e44..16e3f71 100644
--- a/src/main.c
+++ b/src/main.c
@@ -207,6 +207,57 @@ navigator_widget_time_selected_cb(GtkWidget *widget, gint64 selected_time,
gtk_vlc_player_seek(GTK_VLC_PLAYER(widget), selected_time);
}
+static struct {
+ gint64 start;
+ gint64 end;
+} last_activated_section = {-1, -1};
+
+/** @private */
+void
+navigator_widget_section_activated_cb(GtkWidget *widget __attribute__((unused)),
+ gint64 start, gint64 end,
+ gpointer user_data __attribute__((unused)))
+{
+ GtkExperimentTranscript *transcript_wizard =
+ GTK_EXPERIMENT_TRANSCRIPT(transcript_wizard_widget);
+ GtkExperimentTranscript *transcript_proband =
+ GTK_EXPERIMENT_TRANSCRIPT(transcript_proband_widget);
+
+ gtk_experiment_transcript_set_backdrop_area(transcript_wizard,
+ start, end);
+ gtk_experiment_transcript_set_backdrop_area(transcript_proband,
+ start, end);
+
+ last_activated_section.start = start;
+ last_activated_section.end = end;
+}
+
+/** @private */
+gboolean
+navigator_widget_generic_focus_event_cb(GtkWidget *widget __attribute__((unused)),
+ GdkEventFocus *event,
+ gpointer user_data __attribute__((unused)))
+{
+ GtkExperimentTranscript *transcript_wizard =
+ GTK_EXPERIMENT_TRANSCRIPT(transcript_wizard_widget);
+ GtkExperimentTranscript *transcript_proband =
+ GTK_EXPERIMENT_TRANSCRIPT(transcript_proband_widget);
+
+ gint64 start = -1, end = -1;
+
+ if (event->in) {
+ start = last_activated_section.start;
+ end = last_activated_section.end;
+ }
+
+ gtk_experiment_transcript_set_backdrop_area(transcript_wizard,
+ start, end);
+ gtk_experiment_transcript_set_backdrop_area(transcript_proband,
+ start, end);
+
+ return TRUE;
+}
+
/** @private */
void
generic_quit_cb(GtkWidget *widget __attribute__((unused)),