diff --git a/libview/ev-view-private.h b/libview/ev-view-private.h index 02562ddd5815159f869171c0272f070fe459841d..0a907dfba1fb07e371091fc8a1f6b4548f2ee5fb 100644 --- a/libview/ev-view-private.h +++ b/libview/ev-view-private.h @@ -118,6 +118,7 @@ typedef struct _EvHeightToPageCache { typedef struct { GdkPoint start; GdkPoint stop; + GdkRGBA rgba; gboolean adding_annot; EvAnnotationType type; EvAnnotation *annot; diff --git a/libview/ev-view.c b/libview/ev-view.c index 046cd6c557970ff4fe6d24ead25eefd2411b5376..d02adee94cc72f8f5087fd20f9dcf51e9cb6b185 100644 --- a/libview/ev-view.c +++ b/libview/ev-view.c @@ -3528,7 +3528,6 @@ ev_view_create_annotation_real (EvView *view, EvAnnotation *annot; EvRectangle doc_rect, popup_rect; EvPage *page; - GdkColor color = { 0, 65535, 65535, 0 }; GdkRectangle view_rect; cairo_region_t *region; @@ -3560,7 +3559,7 @@ ev_view_create_annotation_real (EvView *view, g_object_unref (page); ev_annotation_set_area (annot, &doc_rect); - ev_annotation_set_color (annot, &color); + ev_annotation_set_rgba (annot, &view->adding_annot_info.rgba); if (EV_IS_ANNOTATION_MARKUP (annot)) { popup_rect.x1 = doc_rect.x2; @@ -3756,6 +3755,18 @@ ev_view_remove_annotation (EvView *view, g_object_unref (annot); } +void +ev_view_set_annotation_rgba (EvView *view, + const GdkRGBA *rgba) +{ + if (rgba) { + view->adding_annot_info.rgba.red = rgba->red; + view->adding_annot_info.rgba.green = rgba->green; + view->adding_annot_info.rgba.blue = rgba->blue; + view->adding_annot_info.rgba.alpha = rgba->alpha; + } +} + static gboolean ev_view_synctex_backward_search (EvView *view, gdouble x, @@ -8213,6 +8224,11 @@ ev_view_init (EvView *view) view->zoom_center_x = -1; view->zoom_center_y = -1; + view->adding_annot_info.rgba.red = 1.0; + view->adding_annot_info.rgba.green = 1.0; + view->adding_annot_info.rgba.blue = 0.0; + view->adding_annot_info.rgba.alpha = 1.0; + g_signal_connect (view, "notify::scale-factor", G_CALLBACK (on_notify_scale_factor), NULL); diff --git a/libview/ev-view.h b/libview/ev-view.h index 5c40414e7abe7fd5301bfb7710f34560944346fb..f8046c38655d7229b9e82c4e3dba59fc842a1c63 100644 --- a/libview/ev-view.h +++ b/libview/ev-view.h @@ -130,6 +130,8 @@ void ev_view_begin_add_annotation (EvView *view, void ev_view_cancel_add_annotation (EvView *view); void ev_view_remove_annotation (EvView *view, EvAnnotation *annot); +void ev_view_set_annotation_rgba (EvView *view, + const GdkRGBA *rgba); gboolean ev_view_add_text_markup_annotation_for_selected_text (EvView *view); void ev_view_set_enable_spellchecking (EvView *view, gboolean spellcheck); diff --git a/shell/ev-annotations-toolbar.c b/shell/ev-annotations-toolbar.c index 0efc6a35cfbffa4278478375fc9c3e3f91a71b13..e90bb7ca3aa52f383d6b0e0007b5b2a6242c5ac1 100644 --- a/shell/ev-annotations-toolbar.c +++ b/shell/ev-annotations-toolbar.c @@ -27,6 +27,7 @@ enum { BEGIN_ADD_ANNOT, CANCEL_ADD_ANNOT, + ANNOT_RGBA_SET, N_SIGNALS }; @@ -35,6 +36,9 @@ struct _EvAnnotationsToolbar { GtkWidget *text_button; GtkWidget *highlight_button; + GtkWidget *annot_rgba_button; + GdkRGBA annot_rgba; + }; struct _EvAnnotationsToolbarClass { @@ -70,6 +74,44 @@ ev_annotations_toolbar_annot_button_toggled (GtkWidget *button, g_signal_emit (toolbar, signals[BEGIN_ADD_ANNOT], 0, annot_type); } +static void +annot_rgba_button_clicked (GtkWidget *button) +{ + GtkColorButton *color_button = GTK_COLOR_BUTTON (gtk_tool_button_get_icon_widget (GTK_TOOL_BUTTON(button))); + GtkColorButtonClass *color_button_class = GTK_COLOR_BUTTON_GET_CLASS (color_button); + /* Forward signal to the underlying GtkColorbutton */ + GTK_BUTTON_CLASS (color_button_class)->clicked (GTK_BUTTON(color_button)); +} + + +static void +annot_rgba_set (GtkColorButton *button, + EvAnnotationsToolbar *toolbar) +{ + gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER(button), &(toolbar->annot_rgba)); + g_signal_emit (toolbar, signals[ANNOT_RGBA_SET], 0, &(toolbar->annot_rgba)); +} + + + +static GtkColorButton * +ev_annotations_toolbar_get_annot_rgba_button (EvAnnotationsToolbar *toolbar) +{ + return GTK_COLOR_BUTTON(gtk_tool_button_get_icon_widget(GTK_TOOL_BUTTON(toolbar->annot_rgba_button))); +} + +void +ev_annotations_toolbar_set_annot_rgba (EvAnnotationsToolbar *toolbar, + const GdkRGBA *rgba) +{ + GtkColorButton *button = ev_annotations_toolbar_get_annot_rgba_button (toolbar); + toolbar->annot_rgba.red = rgba->red; + toolbar->annot_rgba.green = rgba->green; + toolbar->annot_rgba.blue = rgba->blue; + toolbar->annot_rgba.alpha = rgba->alpha; + gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER(button), &(toolbar->annot_rgba)); +} + static gboolean ev_annotations_toolbar_toggle_button_if_active (EvAnnotationsToolbar *toolbar, GtkToggleToolButton *button) @@ -118,6 +160,11 @@ ev_annotations_toolbar_create_toggle_button (EvAnnotationsToolbar *toolbar, static void ev_annotations_toolbar_init (EvAnnotationsToolbar *toolbar) { + toolbar->annot_rgba.red = 1.0; + toolbar->annot_rgba.green = 1.0; + toolbar->annot_rgba.blue = 0.0; + toolbar->annot_rgba.alpha = 1.0; + GtkColorButton *color_button = GTK_COLOR_BUTTON (gtk_color_button_new_with_rgba (&(toolbar->annot_rgba))); gtk_orientable_set_orientation (GTK_ORIENTABLE (toolbar), GTK_ORIENTATION_HORIZONTAL); gtk_toolbar_set_icon_size (GTK_TOOLBAR (toolbar), GTK_ICON_SIZE_MENU); @@ -142,6 +189,18 @@ ev_annotations_toolbar_init (EvAnnotationsToolbar *toolbar) _("Add highlight annotation")); gtk_container_add (GTK_CONTAINER (toolbar), toolbar->highlight_button); gtk_widget_show (toolbar->highlight_button); + + toolbar->annot_rgba_button = GTK_WIDGET (gtk_tool_button_new (GTK_WIDGET (color_button), NULL)); + gtk_widget_set_tooltip_text (toolbar->annot_rgba_button, _("Annotation color")); + + g_signal_connect (toolbar->annot_rgba_button, "clicked", G_CALLBACK (annot_rgba_button_clicked), NULL); + g_signal_connect (gtk_tool_button_get_icon_widget(GTK_TOOL_BUTTON(toolbar->annot_rgba_button)), + "color-set", + G_CALLBACK (annot_rgba_set), + toolbar); + gtk_container_add (GTK_CONTAINER(toolbar), toolbar->annot_rgba_button); + gtk_widget_show (toolbar->annot_rgba_button); + gtk_widget_show (gtk_tool_button_get_icon_widget(GTK_TOOL_BUTTON(toolbar->annot_rgba_button))); } static void @@ -168,6 +227,15 @@ ev_annotations_toolbar_class_init (EvAnnotationsToolbarClass *klass) g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE); + signals[ANNOT_RGBA_SET] = + g_signal_new ("annot-rgba-set", + G_TYPE_FROM_CLASS (g_object_class), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 1, + G_TYPE_POINTER); } GtkWidget * diff --git a/shell/ev-annotations-toolbar.h b/shell/ev-annotations-toolbar.h index 7690ac332f92eaade321b766ca530810d9c6f9b5..40937a8754fb08a82618025360a1b874e9d6db7e 100644 --- a/shell/ev-annotations-toolbar.h +++ b/shell/ev-annotations-toolbar.h @@ -38,6 +38,9 @@ typedef struct _EvAnnotationsToolbarClass EvAnnotationsToolbarClass; GType ev_annotations_toolbar_get_type (void) G_GNUC_CONST; GtkWidget *ev_annotations_toolbar_new (void); void ev_annotations_toolbar_add_annot_finished (EvAnnotationsToolbar *toolbar); +void ev_annotations_toolbar_set_annot_rgba (EvAnnotationsToolbar *toolbar, + const GdkRGBA *rgba); + G_END_DECLS diff --git a/shell/ev-window.c b/shell/ev-window.c index 3a7d05b8954f8bb11f7dfd1a85a424df436deddf..9e35964b398646cd7a4026901183ad01b4af795b 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -1160,6 +1160,25 @@ ev_window_init_metadata_with_default_values (EvWindow *window) ev_metadata_set_boolean (metadata, "fullscreen", g_settings_get_boolean (settings, "fullscreen")); } + + /* Annotations */ + if (!ev_metadata_has_key (metadata, "annotations_rgba_r")) { + ev_metadata_set_double (metadata, "annotations_rgba_r", + 1.0); + } + if (!ev_metadata_has_key (metadata, "annotations_rgba_g")) { + ev_metadata_set_double (metadata, "annotations_rgba_g", + 1.0); + } + if (!ev_metadata_has_key (metadata, "annotations_rgba_b")) { + ev_metadata_set_double (metadata, "annotations_rgba_b", + 0.0); + } + if (!ev_metadata_has_key (metadata, "annotations_rgba_a")) { + ev_metadata_set_double (metadata, "annotations_rgba_a", + 1.0); + } + } static void @@ -1415,6 +1434,7 @@ setup_view_from_metadata (EvWindow *window) { gboolean presentation; EvWindowPrivate *priv = GET_PRIVATE (window); + GdkRGBA rgba; if (!priv->metadata) return; @@ -1448,6 +1468,18 @@ setup_view_from_metadata (EvWindow *window) if (ev_metadata_get_boolean (priv->metadata, "caret-navigation", &caret_navigation)) ev_view_set_caret_navigation_enabled (EV_VIEW (priv->view), caret_navigation); } + + /* Color of new annotations */ + if (ev_metadata_get_double (priv->metadata, "annotations_rgba_r", &(rgba.red)) + && ev_metadata_get_double (priv->metadata, "annotations_rgba_g", &(rgba.green)) + && ev_metadata_get_double (priv->metadata, "annotations_rgba_b", &(rgba.blue)) + && ev_metadata_get_double (priv->metadata, "annotations_rgba_a", &(rgba.alpha))) { + + ev_annotations_toolbar_set_annot_rgba (EV_ANNOTATIONS_TOOLBAR (priv->annots_toolbar), + &rgba); + ev_view_set_annotation_rgba (EV_VIEW (priv->view), &rgba); + } + } static void @@ -7381,6 +7413,21 @@ ev_window_init_css (void) } } +static void +annotation_color_set_cb (GtkColorButton *button, + GdkRGBA *rgba, + EvWindow *window) +{ + EvWindowPrivate *priv = GET_PRIVATE(window); + EvView *view = EV_VIEW(priv->view); + EvMetadata *metadata = priv->metadata; + ev_view_set_annotation_rgba (view, rgba); + ev_metadata_set_double (metadata, "annotations_rgba_r", rgba->red); + ev_metadata_set_double (metadata, "annotations_rgba_g", rgba->green); + ev_metadata_set_double (metadata, "annotations_rgba_b", rgba->blue); + ev_metadata_set_double (metadata, "annotations_rgba_a", rgba->alpha); +} + static void ev_window_init (EvWindow *ev_window) { @@ -7698,6 +7745,10 @@ ev_window_init (EvWindow *ev_window) G_CALLBACK (ev_window_sync_source), ev_window); #endif + g_signal_connect (priv->annots_toolbar, + "annot-rgba-set", + G_CALLBACK (annotation_color_set_cb), + ev_window); gtk_widget_show (priv->view); gtk_widget_show (priv->password_view);