diff options
-rw-r--r-- | lib/gtk-experiment-widgets/cclosure-marshallers.list | 3 | ||||
-rw-r--r-- | lib/gtk-experiment-widgets/gtk-experiment-navigator.c | 46 | ||||
-rw-r--r-- | lib/gtk-experiment-widgets/gtk-experiment-navigator.h | 16 | ||||
-rw-r--r-- | src/default.ui | 5 | ||||
-rw-r--r-- | src/main.c | 51 |
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> @@ -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)), |