aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/gtk-experiment-widgets/gtk-experiment-transcript-private.h3
-rw-r--r--lib/gtk-experiment-widgets/gtk-experiment-transcript.c115
-rw-r--r--lib/gtk-experiment-widgets/gtk-experiment-transcript.h4
-rw-r--r--src/config.c71
-rw-r--r--src/experiment-player.h4
-rw-r--r--src/main.c20
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);
/*
diff --git a/src/main.c b/src/main.c
index 5980328..22e7266 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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,