Commit 822a7228 authored by Michael Natterer's avatar Michael Natterer 😴

Bug 794221 - Recently used colors on text don't get added to the color history

Add signal GimpTextBuffer::color-applied which is emitted when text is
inserted or when color is applied to a span of text.

In GimpTextTool, connect to the signal and update the global color
history.

Unrelated: rename gimp_text_tag_get_color() to get_fg_color() and add
boolean return values to get_fg_color() and get_fg_color() which
indicates if a color is set on the tag at all. This ended up unneeded
in the fix but is an improvement regardless.
parent 3df16859
......@@ -34,6 +34,7 @@
#include "core/gimp.h"
#include "core/gimpcontext.h"
#include "core/gimpimage.h"
#include "core/gimp-palettes.h"
#include "core/gimpimage-pick-item.h"
#include "core/gimpimage-undo.h"
#include "core/gimpimage-undo-push.h"
......@@ -177,6 +178,11 @@ static void gimp_text_tool_buffer_begin_edit (GimpTextBuffer *buffer,
static void gimp_text_tool_buffer_end_edit (GimpTextBuffer *buffer,
GimpTextTool *text_tool);
static void gimp_text_tool_buffer_color_applied
(GimpTextBuffer *buffer,
const GimpRGB *color,
GimpTextTool *text_tool);
G_DEFINE_TYPE (GimpTextTool, gimp_text_tool, GIMP_TYPE_DRAW_TOOL)
......@@ -238,6 +244,9 @@ gimp_text_tool_init (GimpTextTool *text_tool)
g_signal_connect (text_tool->buffer, "end-user-action",
G_CALLBACK (gimp_text_tool_buffer_end_edit),
text_tool);
g_signal_connect (text_tool->buffer, "color-applied",
G_CALLBACK (gimp_text_tool_buffer_color_applied),
text_tool);
text_tool->handle_rectangle_change_complete = TRUE;
......@@ -1330,6 +1339,7 @@ gimp_text_tool_text_notify (GimpText *text,
g_signal_handlers_block_by_func (text_tool->buffer,
gimp_text_tool_buffer_end_edit,
text_tool);
if (text->markup)
gimp_text_buffer_set_markup (text_tool->buffer, text->markup);
else
......@@ -1790,6 +1800,15 @@ gimp_text_tool_buffer_end_edit (GimpTextBuffer *buffer,
}
}
static void
gimp_text_tool_buffer_color_applied (GimpTextBuffer *buffer,
const GimpRGB *color,
GimpTextTool *text_tool)
{
gimp_palettes_add_color_history (GIMP_TOOL (text_tool)->tool_info->gimp,
color);
}
/* public functions */
......
......@@ -38,6 +38,13 @@
#include "gimp-intl.h"
enum
{
COLOR_APPLIED,
LAST_SIGNAL
};
/* local function prototypes */
static void gimp_text_buffer_constructed (GObject *object);
......@@ -53,6 +60,8 @@ G_DEFINE_TYPE (GimpTextBuffer, gimp_text_buffer, GTK_TYPE_TEXT_BUFFER)
#define parent_class gimp_text_buffer_parent_class
static guint buffer_signals[LAST_SIGNAL] = { 0, };
static void
gimp_text_buffer_class_init (GimpTextBufferClass *klass)
......@@ -65,6 +74,16 @@ gimp_text_buffer_class_init (GimpTextBufferClass *klass)
object_class->finalize = gimp_text_buffer_finalize;
buffer_class->mark_set = gimp_text_buffer_mark_set;
buffer_signals[COLOR_APPLIED] =
g_signal_new ("color-applied",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (GimpTextBufferClass, color_applied),
NULL, NULL,
g_cclosure_marshal_VOID__BOXED,
G_TYPE_NONE, 1,
GIMP_TYPE_RGB);
}
static void
......@@ -928,7 +947,7 @@ gimp_text_buffer_get_iter_color (GimpTextBuffer *buffer,
if (gtk_text_iter_has_tag (iter, tag))
{
if (color)
gimp_text_tag_get_color (tag, color);
gimp_text_tag_get_fg_color (tag, color);
return tag;
}
......@@ -956,7 +975,7 @@ gimp_text_buffer_get_color_tag (GimpTextBuffer *buffer,
tag = list->data;
gimp_text_tag_get_color (tag, &tag_color);
gimp_text_tag_get_fg_color (tag, &tag_color);
gimp_rgb_get_uchar (&tag_color, &tag_r, &tag_g, &tag_b);
......@@ -1014,6 +1033,8 @@ gimp_text_buffer_set_color (GimpTextBuffer *buffer,
gtk_text_buffer_apply_tag (GTK_TEXT_BUFFER (buffer), tag,
start, end);
g_signal_emit (buffer, buffer_signals[COLOR_APPLIED], 0, color);
}
gtk_text_buffer_end_user_action (GTK_TEXT_BUFFER (buffer));
......@@ -1038,7 +1059,7 @@ gimp_text_buffer_get_preedit_color_tag (GimpTextBuffer *buffer,
tag = list->data;
gimp_text_tag_get_color (tag, &tag_color);
gimp_text_tag_get_fg_color (tag, &tag_color);
gimp_rgb_get_uchar (&tag_color, &tag_r, &tag_g, &tag_b);
......@@ -1276,7 +1297,7 @@ gimp_text_buffer_tag_to_name (GimpTextBuffer *buffer,
GimpRGB color;
guchar r, g, b;
gimp_text_tag_get_color (tag, &color);
gimp_text_tag_get_fg_color (tag, &color);
gimp_rgb_get_uchar (&color, &r, &g, &b);
*value = g_strdup_printf ("#%02x%02x%02x", r, g, b);
......@@ -1297,7 +1318,7 @@ gimp_text_buffer_tag_to_name (GimpTextBuffer *buffer,
GimpRGB color;
guchar r, g, b;
gimp_text_tag_get_color (tag, &color);
gimp_text_tag_get_fg_color (tag, &color);
gimp_rgb_get_uchar (&color, &r, &g, &b);
*value = g_strdup_printf ("#%02x%02x%02x", r, g, b);
......@@ -1436,6 +1457,7 @@ gimp_text_buffer_insert (GimpTextBuffer *buffer,
GList *insert_tags;
GList *remove_tags;
GSList *tags_off = NULL;
GimpRGB color;
g_return_if_fail (GIMP_IS_TEXT_BUFFER (buffer));
......@@ -1504,6 +1526,11 @@ gimp_text_buffer_insert (GimpTextBuffer *buffer,
g_list_free (remove_tags);
g_list_free (insert_tags);
if (gimp_text_buffer_get_iter_color (buffer, &start, &color))
{
g_signal_emit (buffer, buffer_signals[COLOR_APPLIED], 0, &color);
}
gtk_text_buffer_end_user_action (GTK_TEXT_BUFFER (buffer));
}
......
......@@ -60,6 +60,9 @@ struct _GimpTextBuffer
struct _GimpTextBufferClass
{
GtkTextBufferClass parent_class;
void (* color_applied) (GimpTextBuffer *buffer,
const GimpRGB *color);
};
......
......@@ -752,7 +752,7 @@ gimp_text_style_editor_set_color (GimpTextStyleEditor *editor,
gimp_rgba_set (&color, 0.0, 0.0, 0.0, 1.0);
if (color_tag)
gimp_text_tag_get_color (color_tag, &color);
gimp_text_tag_get_fg_color (color_tag, &color);
g_signal_handlers_block_by_func (editor->color_button,
gimp_text_style_editor_color_changed,
......
......@@ -81,32 +81,42 @@ gimp_text_tag_get_font (GtkTextTag *tag)
return font;
}
void
gimp_text_tag_get_color (GtkTextTag *tag,
GimpRGB *color)
gboolean
gimp_text_tag_get_fg_color (GtkTextTag *tag,
GimpRGB *color)
{
GdkColor *gdk_color;
gboolean set;
g_object_get (tag,
GIMP_TEXT_PROP_NAME_COLOR, &gdk_color,
"foreground-set", &set,
GIMP_TEXT_PROP_NAME_FG_COLOR, &gdk_color,
NULL);
gimp_rgb_set_gdk_color (color, gdk_color);
if (set)
gimp_rgb_set_gdk_color (color, gdk_color);
gdk_color_free (gdk_color);
return set;
}
void
gboolean
gimp_text_tag_get_bg_color (GtkTextTag *tag,
GimpRGB *color)
{
GdkColor *gdk_color;
gboolean set;
g_object_get (tag,
"background-set", &set,
GIMP_TEXT_PROP_NAME_BG_COLOR, &gdk_color,
NULL);
gimp_rgb_set_gdk_color (color, gdk_color);
if (set)
gimp_rgb_set_gdk_color (color, gdk_color);
gdk_color_free (gdk_color);
return set;
}
......@@ -28,18 +28,18 @@
#define GIMP_TEXT_PROP_NAME_BASELINE "rise"
#define GIMP_TEXT_PROP_NAME_KERNING "rise" /* FIXME */
#define GIMP_TEXT_PROP_NAME_FONT "font"
#define GIMP_TEXT_PROP_NAME_COLOR "foreground-gdk"
#define GIMP_TEXT_PROP_NAME_FG_COLOR "foreground-gdk"
#define GIMP_TEXT_PROP_NAME_BG_COLOR "background-gdk"
gint gimp_text_tag_get_size (GtkTextTag *tag);
gint gimp_text_tag_get_baseline (GtkTextTag *tag);
gint gimp_text_tag_get_kerning (GtkTextTag *tag);
gchar * gimp_text_tag_get_font (GtkTextTag *tag);
void gimp_text_tag_get_color (GtkTextTag *tag,
GimpRGB *color);
void gimp_text_tag_get_bg_color (GtkTextTag *tag,
GimpRGB *color);
gint gimp_text_tag_get_size (GtkTextTag *tag);
gint gimp_text_tag_get_baseline (GtkTextTag *tag);
gint gimp_text_tag_get_kerning (GtkTextTag *tag);
gchar * gimp_text_tag_get_font (GtkTextTag *tag);
gboolean gimp_text_tag_get_fg_color (GtkTextTag *tag,
GimpRGB *color);
gboolean gimp_text_tag_get_bg_color (GtkTextTag *tag,
GimpRGB *color);
#endif /* __GIMP_TEXT_TAG_H__ */
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment