diff options
Diffstat (limited to 'lib/gtk-experiment-widgets')
-rw-r--r-- | lib/gtk-experiment-widgets/gtk-experiment-transcript.c | 158 | ||||
-rw-r--r-- | lib/gtk-experiment-widgets/gtk-experiment-transcript.h | 1 |
2 files changed, 155 insertions, 4 deletions
diff --git a/lib/gtk-experiment-widgets/gtk-experiment-transcript.c b/lib/gtk-experiment-widgets/gtk-experiment-transcript.c index 6217149..c52b80d 100644 --- a/lib/gtk-experiment-widgets/gtk-experiment-transcript.c +++ b/lib/gtk-experiment-widgets/gtk-experiment-transcript.c @@ -40,6 +40,12 @@ static void time_adj_on_value_changed(GtkAdjustment *adj, gpointer user_data); static void text_layer_redraw(GtkExperimentTranscript *trans); +static gboolean button_pressed(GtkWidget *widget, GdkEventButton *event); +static void choose_font_activated(GtkWidget *widget, gpointer data); +static void choose_fg_color_activated(GtkWidget *widget, gpointer data); +static void choose_bg_color_activated(GtkWidget *widget, gpointer data); +static void reverse_activated(GtkWidget *widget, gpointer data); + #define DEFAULT_WIDTH 100 #define DEFAULT_HEIGHT 200 @@ -84,6 +90,8 @@ struct _GtkExperimentTranscriptPrivate { PangoLayout *layer_text_layout; GList *contribs; + + GtkWidget *menu; /**< Drop-down menu, doesn't have to be unreferenced manually */ }; /** @@ -109,6 +117,8 @@ gtk_experiment_transcript_class_init(GtkExperimentTranscriptClass *klass) widget_class->size_request = gtk_experiment_transcript_size_request; widget_class->size_allocate = gtk_experiment_transcript_size_allocate; + widget_class->button_press_event = button_pressed; + g_type_class_add_private(klass, sizeof(GtkExperimentTranscriptPrivate)); } @@ -120,9 +130,12 @@ gtk_experiment_transcript_class_init(GtkExperimentTranscriptClass *klass) static void gtk_experiment_transcript_init(GtkExperimentTranscript *klass) { + GtkWidget *item; + klass->priv = GTK_EXPERIMENT_TRANSCRIPT_GET_PRIVATE(klass); klass->speaker = NULL; + klass->reverse = FALSE; klass->priv->time_adjustment = gtk_adjustment_new(0., 0., 0., 0., 0., 0.); @@ -139,6 +152,38 @@ gtk_experiment_transcript_init(GtkExperimentTranscript *klass) pango_layout_set_ellipsize(klass->priv->layer_text_layout, PANGO_ELLIPSIZE_END); klass->priv->contribs = NULL; + + klass->priv->menu = gtk_menu_new(); + gtk_menu_attach_to_widget(GTK_MENU(klass->priv->menu), + GTK_WIDGET(klass), NULL); + + item = gtk_menu_item_new_with_mnemonic("_Choose Font..."); + 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..."); + g_signal_connect(item, "activate", + G_CALLBACK(choose_fg_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..."); + 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); + + item = gtk_separator_menu_item_new(); + gtk_menu_shell_append(GTK_MENU_SHELL(klass->priv->menu), item); + gtk_widget_show(item); + + item = gtk_check_menu_item_new_with_mnemonic("_Reverse"); + g_signal_connect(item, "activate", + G_CALLBACK(reverse_activated), klass); + gtk_menu_shell_append(GTK_MENU_SHELL(klass->priv->menu), item); + gtk_widget_show(item); } /** @@ -222,7 +267,7 @@ gtk_experiment_transcript_realize(GtkWidget *widget) attributes.wclass = GDK_INPUT_OUTPUT; attributes.window_type = GDK_WINDOW_CHILD; attributes.event_mask = gtk_widget_get_events(widget) - | GDK_EXPOSURE_MASK; + | GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK; attributes.visual = gtk_widget_get_visual(widget); attributes.colormap = gtk_widget_get_colormap(widget); @@ -321,7 +366,7 @@ text_layer_redraw(GtkExperimentTranscript *trans) gint last_contrib_y; gdk_draw_rectangle(GDK_DRAWABLE(trans->priv->layer_text), - widget->style->white_gc, + widget->style->bg_gc[gtk_widget_get_state(widget)], TRUE, 0, 0, widget->allocation.width, @@ -334,6 +379,8 @@ text_layer_redraw(GtkExperimentTranscript *trans) if (trans->priv->contribs == NULL) return; + /** @todo reverse mode */ + if (trans->priv->time_adjustment != NULL) current_time = (gint64)gtk_adjustment_get_value(GTK_ADJUSTMENT(trans->priv->time_adjustment)); last_contrib_y = widget->allocation.height + LAYER_TEXT_INVISIBLE; @@ -352,7 +399,6 @@ text_layer_redraw(GtkExperimentTranscript *trans) continue; /** @todo add attributes according to regexp masks and search mask */ - /* does that reset default attributes for the widget? */ pango_layout_set_attributes(trans->priv->layer_text_layout, NULL); pango_layout_set_text(trans->priv->layer_text_layout, @@ -366,12 +412,116 @@ text_layer_redraw(GtkExperimentTranscript *trans) break; gdk_draw_layout(GDK_DRAWABLE(trans->priv->layer_text), - widget->style->black_gc, + widget->style->text_gc[gtk_widget_get_state(widget)], 0, y, trans->priv->layer_text_layout); last_contrib_y = y; } } +static gboolean +button_pressed(GtkWidget *widget, GdkEventButton *event) +{ + GtkExperimentTranscript *trans = GTK_EXPERIMENT_TRANSCRIPT(widget); + + /* Ignore double-clicks and triple-clicks */ + if (event->button != 3 || event->type != GDK_BUTTON_PRESS) + return FALSE; + + gtk_menu_popup(GTK_MENU(trans->priv->menu), NULL, NULL, NULL, NULL, + event->button, event->time); + return TRUE; +} + +static void +choose_font_activated(GtkWidget *widget __attribute__((unused)), + gpointer data) +{ + GtkWidget *dialog; + gchar *font_name; + + dialog = gtk_font_selection_dialog_new("Choose Font..."); + + font_name = pango_font_description_to_string(GTK_WIDGET(data)->style->font_desc); + gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(dialog), + font_name); + g_free(font_name); + + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) { + PangoFontDescription *font_desc; + + font_name = gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(dialog)); + font_desc = pango_font_description_from_string(font_name); + + gtk_widget_modify_font(GTK_WIDGET(data), font_desc); + + pango_font_description_free(font_desc); + g_free(font_name); + + text_layer_redraw(GTK_EXPERIMENT_TRANSCRIPT(data)); + } + + gtk_widget_destroy(dialog); +} + +static void +choose_fg_color_activated(GtkWidget *widget __attribute__((unused)), + gpointer data) +{ + GtkWidget *dialog, *colorsel; + + dialog = gtk_color_selection_dialog_new("Choose Foreground Color..."); + colorsel = gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(dialog)); + + gtk_color_selection_set_current_color(GTK_COLOR_SELECTION(colorsel), + >K_WIDGET(data)->style->text[GTK_STATE_NORMAL]); + + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) { + GdkColor color; + + gtk_color_selection_get_current_color(GTK_COLOR_SELECTION(colorsel), + &color); + gtk_widget_modify_text(GTK_WIDGET(data), GTK_STATE_NORMAL, &color); + + text_layer_redraw(GTK_EXPERIMENT_TRANSCRIPT(data)); + } + + gtk_widget_destroy(dialog); +} + +static void +choose_bg_color_activated(GtkWidget *widget __attribute__((unused)), + gpointer data) +{ + GtkWidget *dialog, *colorsel; + + dialog = gtk_color_selection_dialog_new("Choose Background Color..."); + colorsel = gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(dialog)); + + gtk_color_selection_set_current_color(GTK_COLOR_SELECTION(colorsel), + >K_WIDGET(data)->style->bg[GTK_STATE_NORMAL]); + + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) { + GdkColor color; + + gtk_color_selection_get_current_color(GTK_COLOR_SELECTION(colorsel), + &color); + gtk_widget_modify_bg(GTK_WIDGET(data), GTK_STATE_NORMAL, &color); + + text_layer_redraw(GTK_EXPERIMENT_TRANSCRIPT(data)); + } + + gtk_widget_destroy(dialog); +} + +static void +reverse_activated(GtkWidget *widget, gpointer data) +{ + GtkExperimentTranscript *trans = GTK_EXPERIMENT_TRANSCRIPT(data); + + trans->reverse = + gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); +} + /* * API */ diff --git a/lib/gtk-experiment-widgets/gtk-experiment-transcript.h b/lib/gtk-experiment-widgets/gtk-experiment-transcript.h index 471a5ef..3b34754 100644 --- a/lib/gtk-experiment-widgets/gtk-experiment-transcript.h +++ b/lib/gtk-experiment-widgets/gtk-experiment-transcript.h @@ -43,6 +43,7 @@ typedef struct _GtkExperimentTranscript { GtkWidget parent_instance; /**< Parent instance structure */ gchar *speaker; /**< Name of speaker whose contributions are displayed (\b read-only) */ + gboolean reverse; /**< Reverse mode (\b read-write) */ GtkExperimentTranscriptPrivate *priv; /**< @private Pointer to \b private instance attributes */ } GtkExperimentTranscript; |