diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-06-06 16:43:02 +0200 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-06-06 16:43:02 +0200 |
commit | 92eeaa0e66cf35f31e5c2ecf5e8503a38c9aa6c7 (patch) | |
tree | 1eaeb30fdb72563b363aee96c43b52738dde2e29 | |
parent | e5c7c410bebca09376f24de1d97cc14effe5f0e2 (diff) | |
download | experiment-player-92eeaa0e66cf35f31e5c2ecf5e8503a38c9aa6c7.tar.gz |
configurable transcript widget text alignment
* via pop up menu and config file (symbolic value)
* use image menu items in transcript popup
* renamed "Choose Foreground Color..." to "Choose Text Color..."
* simplify transcript related config setters/getters
-rw-r--r-- | lib/gtk-experiment-widgets/gtk-experiment-transcript-private.h | 3 | ||||
-rw-r--r-- | lib/gtk-experiment-widgets/gtk-experiment-transcript.c | 115 | ||||
-rw-r--r-- | lib/gtk-experiment-widgets/gtk-experiment-transcript.h | 4 | ||||
-rw-r--r-- | src/config.c | 71 | ||||
-rw-r--r-- | src/experiment-player.h | 4 | ||||
-rw-r--r-- | src/main.c | 20 |
6 files changed, 189 insertions, 28 deletions
diff --git a/lib/gtk-experiment-widgets/gtk-experiment-transcript-private.h b/lib/gtk-experiment-widgets/gtk-experiment-transcript-private.h index 8dc47c1..6fe8218 100644 --- a/lib/gtk-experiment-widgets/gtk-experiment-transcript-private.h +++ b/lib/gtk-experiment-widgets/gtk-experiment-transcript-private.h @@ -34,7 +34,8 @@ struct _GtkExperimentTranscriptPrivate { GSList *formats; GtkExperimentTranscriptFormat interactive_format; - GtkWidget *menu; /**< Drop-down menu, doesn't have to be unreferenced manually */ + GtkWidget *menu; /**< Drop-down menu, doesn't have to be unreferenced manually */ + GSList *alignment_group; /**< GtkRadioMenuItem group (owned by GTK) */ }; #define DEFAULT_WIDTH 100 diff --git a/lib/gtk-experiment-widgets/gtk-experiment-transcript.c b/lib/gtk-experiment-widgets/gtk-experiment-transcript.c index 9df5bb9..dcaf64c 100644 --- a/lib/gtk-experiment-widgets/gtk-experiment-transcript.c +++ b/lib/gtk-experiment-widgets/gtk-experiment-transcript.c @@ -43,8 +43,10 @@ static gboolean button_pressed(GtkWidget *widget, GdkEventButton *event); static gboolean scrolled(GtkWidget *widget, GdkEventScroll *event); static void choose_font_activated(GtkWidget *widget, gpointer data); -static void choose_fg_color_activated(GtkWidget *widget, gpointer data); +static void choose_text_color_activated(GtkWidget *widget, gpointer data); static void choose_bg_color_activated(GtkWidget *widget, gpointer data); +static void text_alignment_activated(GtkWidget *widget, gpointer data); + static void reverse_activated(GtkWidget *widget, gpointer data); /** @@ -83,7 +85,7 @@ gtk_experiment_transcript_class_init(GtkExperimentTranscriptClass *klass) static void gtk_experiment_transcript_init(GtkExperimentTranscript *klass) { - GtkWidget *item; + GtkWidget *item, *submenu, *image; klass->priv = GTK_EXPERIMENT_TRANSCRIPT_GET_PRIVATE(klass); @@ -118,24 +120,69 @@ gtk_experiment_transcript_init(GtkExperimentTranscript *klass) gtk_menu_attach_to_widget(GTK_MENU(klass->priv->menu), GTK_WIDGET(klass), NULL); - item = gtk_menu_item_new_with_mnemonic("_Choose Font..."); + item = gtk_image_menu_item_new_with_mnemonic("Choose _Font..."); + image = gtk_image_new_from_stock(GTK_STOCK_SELECT_FONT, + GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image); g_signal_connect(item, "activate", G_CALLBACK(choose_font_activated), klass); gtk_menu_shell_append(GTK_MENU_SHELL(klass->priv->menu), item); gtk_widget_show(item); - item = gtk_menu_item_new_with_mnemonic("Choose _Foreground Color..."); + item = gtk_image_menu_item_new_with_mnemonic("Choose _Text Color..."); + image = gtk_image_new_from_stock(GTK_STOCK_SELECT_COLOR, + GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image); g_signal_connect(item, "activate", - G_CALLBACK(choose_fg_color_activated), klass); + G_CALLBACK(choose_text_color_activated), klass); gtk_menu_shell_append(GTK_MENU_SHELL(klass->priv->menu), item); gtk_widget_show(item); - item = gtk_menu_item_new_with_mnemonic("Choose _Background Color..."); + item = gtk_image_menu_item_new_with_mnemonic("Choose _Background Color..."); + image = gtk_image_new_from_stock(GTK_STOCK_SELECT_COLOR, + GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image); g_signal_connect(item, "activate", G_CALLBACK(choose_bg_color_activated), klass); gtk_menu_shell_append(GTK_MENU_SHELL(klass->priv->menu), item); gtk_widget_show(item); + submenu = gtk_menu_new(); + item = gtk_menu_item_new_with_label("Text Alignment"); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu); + gtk_menu_shell_append(GTK_MENU_SHELL(klass->priv->menu), item); + gtk_widget_show(item); + + /* + * position in alignment_group list corresponds with PangoAlignment + * (PANGO_ALIGN_RIGHT, PANGO_ALIGN_CENTER, PANGO_ALIGN_LEFT) + */ + item = gtk_radio_menu_item_new_with_mnemonic(NULL, "_Left"); + klass->priv->alignment_group = + gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(item)); + g_signal_connect(item, "activate", + G_CALLBACK(text_alignment_activated), klass); + gtk_menu_shell_append(GTK_MENU_SHELL(submenu), item); + + item = gtk_radio_menu_item_new_with_mnemonic(klass->priv->alignment_group, + "_Center"); + klass->priv->alignment_group = + gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(item)); + g_signal_connect(item, "activate", + G_CALLBACK(text_alignment_activated), klass); + gtk_menu_shell_append(GTK_MENU_SHELL(submenu), item); + + item = gtk_radio_menu_item_new_with_mnemonic(klass->priv->alignment_group, + "_Right"); + klass->priv->alignment_group = + gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(item)); + g_signal_connect(item, "activate", + G_CALLBACK(text_alignment_activated), klass); + gtk_menu_shell_append(GTK_MENU_SHELL(submenu), item); + + gtk_widget_show_all(submenu); + gtk_experiment_transcript_set_alignment(klass, PANGO_ALIGN_LEFT); + item = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(klass->priv->menu), item); gtk_widget_show(item); @@ -495,14 +542,14 @@ choose_font_activated(GtkWidget *widget __attribute__((unused)), } static void -choose_fg_color_activated(GtkWidget *widget __attribute__((unused)), - gpointer data) +choose_text_color_activated(GtkWidget *widget __attribute__((unused)), + gpointer data) { GtkExperimentTranscript *trans = GTK_EXPERIMENT_TRANSCRIPT(data); GtkWidget *dialog, *colorsel; - dialog = gtk_color_selection_dialog_new("Choose Foreground Color..."); + dialog = gtk_color_selection_dialog_new("Choose Text Color..."); colorsel = gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(dialog)); gtk_color_selection_set_current_color(GTK_COLOR_SELECTION(colorsel), @@ -551,6 +598,34 @@ choose_bg_color_activated(GtkWidget *widget __attribute__((unused)), } static void +text_alignment_activated(GtkWidget *widget __attribute__((unused)), + gpointer data) +{ + GtkExperimentTranscript *trans = GTK_EXPERIMENT_TRANSCRIPT(data); + PangoAlignment alignment; + + if (trans->priv->layer_text_layout == NULL) + return; + + alignment = PANGO_ALIGN_RIGHT; + for (GSList *cur = trans->priv->alignment_group; + cur != NULL; + cur = cur->next, alignment--) { + if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(cur->data))) + continue; + + pango_layout_set_alignment(trans->priv->layer_text_layout, + alignment); + + if (gtk_widget_get_realized(GTK_WIDGET(trans)) && + trans->priv->layer_text != NULL) + gtk_experiment_transcript_text_layer_redraw(trans); + + break; + } +} + +static void reverse_activated(GtkWidget *widget, gpointer data) { GtkExperimentTranscript *trans = GTK_EXPERIMENT_TRANSCRIPT(data); @@ -612,6 +687,28 @@ gtk_experiment_transcript_load_filename(GtkExperimentTranscript *trans, return res; } +void +gtk_experiment_transcript_set_alignment(GtkExperimentTranscript *trans, + PangoAlignment alignment) +{ + PangoAlignment cur_alignment = PANGO_ALIGN_RIGHT; + + for (GSList *cur = trans->priv->alignment_group; + cur != NULL; + cur = cur->next, cur_alignment--) + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(cur->data), + cur_alignment == alignment); +} + +PangoAlignment +gtk_experiment_transcript_get_alignment(GtkExperimentTranscript *trans) +{ + if (trans->priv->layer_text_layout == NULL) + return PANGO_ALIGN_LEFT; + + return pango_layout_get_alignment(trans->priv->layer_text_layout); +} + GtkAdjustment * gtk_experiment_transcript_get_time_adjustment(GtkExperimentTranscript *trans) { diff --git a/lib/gtk-experiment-widgets/gtk-experiment-transcript.h b/lib/gtk-experiment-widgets/gtk-experiment-transcript.h index 9d65863..95052ec 100644 --- a/lib/gtk-experiment-widgets/gtk-experiment-transcript.h +++ b/lib/gtk-experiment-widgets/gtk-experiment-transcript.h @@ -76,6 +76,10 @@ gboolean gtk_experiment_transcript_load(GtkExperimentTranscript *trans, gboolean gtk_experiment_transcript_load_filename(GtkExperimentTranscript *trans, const gchar *filename); +void gtk_experiment_transcript_set_alignment(GtkExperimentTranscript *trans, + PangoAlignment alignment); +PangoAlignment gtk_experiment_transcript_get_alignment(GtkExperimentTranscript *trans); + gboolean gtk_experiment_transcript_load_formats(GtkExperimentTranscript *trans, const gchar *filename); gboolean gtk_experiment_transcript_set_interactive_format(GtkExperimentTranscript *trans, diff --git a/src/config.c b/src/config.c index 18965b3..951a9e2 100644 --- a/src/config.c +++ b/src/config.c @@ -14,6 +14,7 @@ static inline void set_default_string(const gchar *group_name, const gchar *key, const gchar *string); +static const gchar *get_group_by_actor(const gchar *actor); static GKeyFile *keyfile; static gchar *filename = NULL; @@ -87,19 +88,25 @@ config_get_formats_directory(void) return g_key_file_get_string(keyfile, "Directories", "Formats", NULL); } +static const gchar * +get_group_by_actor(const gchar *actor) +{ + static gchar group[255]; + + g_snprintf(group, sizeof(group), "%s Transcript", actor); + return group; +} + void config_generic_set_transcript_font(const gchar *actor, const gchar *key, const PangoFontDescription *font) { - gchar group[255]; - gchar *font_name; - - g_snprintf(group, sizeof(group), "%s Transcript", actor); + const gchar *group = get_group_by_actor(actor); if (font == NULL) { g_key_file_remove_key(keyfile, group, key, NULL); } else { - font_name = pango_font_description_to_string(font); + gchar *font_name = pango_font_description_to_string(font); g_key_file_set_string(keyfile, group, key, font_name); g_free(font_name); } @@ -108,12 +115,11 @@ config_generic_set_transcript_font(const gchar *actor, const gchar *key, PangoFontDescription * config_generic_get_transcript_font(const gchar *actor, const gchar *key) { - gchar group[255]; gchar *font_name; PangoFontDescription *font_desc = NULL; - g_snprintf(group, sizeof(group), "%s Transcript", actor); - font_name = g_key_file_get_string(keyfile, group, key, NULL); + font_name = g_key_file_get_string(keyfile, get_group_by_actor(actor), + key, NULL); if (font_name != NULL) { font_desc = pango_font_description_from_string(font_name); g_free(font_name); @@ -126,15 +132,12 @@ void config_generic_set_transcript_color(const gchar *actor, const gchar *key, const GdkColor *color) { - gchar group[255]; - gchar *color_name; - - g_snprintf(group, sizeof(group), "%s Transcript", actor); + const gchar *group = get_group_by_actor(actor); if (color == NULL) { g_key_file_remove_key(keyfile, group, key, NULL); } else { - color_name = gdk_color_to_string(color); + gchar *color_name = gdk_color_to_string(color); g_key_file_set_string(keyfile, group, key, color_name); g_free(color_name); } @@ -144,11 +147,10 @@ gboolean config_generic_get_transcript_color(const gchar *actor, const gchar *key, GdkColor *color) { - gchar group[255]; - gchar *color_name; + gchar *color_name; - g_snprintf(group, sizeof(group), "%s Transcript", actor); - color_name = g_key_file_get_string(keyfile, group, key, NULL); + color_name = g_key_file_get_string(keyfile, get_group_by_actor(actor), + key, NULL); if (color_name == NULL) return FALSE; @@ -159,6 +161,41 @@ config_generic_get_transcript_color(const gchar *actor, const gchar *key, } void +config_set_transcript_alignment(const gchar *actor, PangoAlignment alignment) +{ + static gchar **values = NULL; + + if (values == NULL) { + gchar *possible_values; + + pango_parse_enum(PANGO_TYPE_ALIGNMENT, "", NULL, + FALSE, &possible_values); + values = g_strsplit(possible_values, "/", 0); + g_free(possible_values); + } + + g_key_file_set_string(keyfile, get_group_by_actor(actor), + "Widget-Alignment", values[alignment]); +} + +PangoAlignment +config_get_transcript_alignment(const gchar *actor) +{ + gchar *value; + gint alignment = (gint)PANGO_ALIGN_LEFT; + + value = g_key_file_get_string(keyfile, get_group_by_actor(actor), + "Widget-Alignment", NULL); + if (value == NULL) + return PANGO_ALIGN_LEFT; + + pango_parse_enum(PANGO_TYPE_ALIGNMENT, value, &alignment, FALSE, NULL); + g_free(value); + + return (PangoAlignment)alignment; +} + +void config_save_key_file(void) { gchar *data; diff --git a/src/experiment-player.h b/src/experiment-player.h index 9d99879..e3a2a19 100644 --- a/src/experiment-player.h +++ b/src/experiment-player.h @@ -129,6 +129,10 @@ config_get_transcript_default_format_bg_color(const gchar *actor, color); } +void config_set_transcript_alignment(const gchar *actor, + PangoAlignment alignment); +PangoAlignment config_get_transcript_alignment(const gchar *actor); + void config_save_key_file(void); /* @@ -256,6 +256,7 @@ main(int argc, char *argv[]) GtkAdjustment *adj; PangoFontDescription *font_desc; + PangoAlignment alignment; GdkColor color; GtkRcStyle *modified_style; @@ -322,7 +323,9 @@ main(int argc, char *argv[]) adj = gtk_vlc_player_get_volume_adjustment(GTK_VLC_PLAYER(player_widget)); gtk_scale_button_set_adjustment(GTK_SCALE_BUTTON(volume_button), adj); - /* configure transcript widgets */ + /* + * configure transcript widgets + */ transcript_wizard->speaker = g_strdup(SPEAKER_WIZARD); font_desc = config_get_transcript_font(SPEAKER_WIZARD); if (font_desc != NULL) { @@ -336,6 +339,9 @@ main(int argc, char *argv[]) gtk_widget_modify_bg(transcript_wizard_widget, GTK_STATE_NORMAL, &color); + alignment = config_get_transcript_alignment(SPEAKER_WIZARD); + gtk_experiment_transcript_set_alignment(transcript_wizard, alignment); + transcript_wizard->interactive_format.default_font = config_get_transcript_default_format_font(SPEAKER_WIZARD); if (config_get_transcript_default_format_text_color(SPEAKER_WIZARD, &color)) @@ -356,6 +362,9 @@ main(int argc, char *argv[]) gtk_widget_modify_bg(transcript_proband_widget, GTK_STATE_NORMAL, &color); + alignment = config_get_transcript_alignment(SPEAKER_PROBAND); + gtk_experiment_transcript_set_alignment(transcript_proband, alignment); + transcript_proband->interactive_format.default_font = config_get_transcript_default_format_font(SPEAKER_PROBAND); if (config_get_transcript_default_format_text_color(SPEAKER_PROBAND, &color)) @@ -371,6 +380,9 @@ main(int argc, char *argv[]) gtk_main(); gdk_threads_leave(); + /* + * update config file + */ modified_style = gtk_widget_get_modifier_style(transcript_wizard_widget); config_set_transcript_font(SPEAKER_WIZARD, modified_style->font_desc); config_set_transcript_text_color(SPEAKER_WIZARD, @@ -383,6 +395,9 @@ main(int argc, char *argv[]) : NULL); g_object_unref(modified_style); + alignment = gtk_experiment_transcript_get_alignment(transcript_wizard); + config_set_transcript_alignment(SPEAKER_WIZARD, alignment); + config_set_transcript_default_format_font(SPEAKER_WIZARD, transcript_wizard->interactive_format.default_font); config_set_transcript_default_format_text_color(SPEAKER_WIZARD, @@ -402,6 +417,9 @@ main(int argc, char *argv[]) : NULL); g_object_unref(modified_style); + alignment = gtk_experiment_transcript_get_alignment(transcript_proband); + config_set_transcript_alignment(SPEAKER_PROBAND, alignment); + config_set_transcript_default_format_font(SPEAKER_PROBAND, transcript_proband->interactive_format.default_font); config_set_transcript_default_format_text_color(SPEAKER_PROBAND, |