rewritten the code that draws the icon in the statusbar label. The new
2008-04-14 Sven Neumann <sven@gimp.org> * app/display/gimpstatusbar.[ch]: rewritten the code that draws the icon in the statusbar label. The new code gives nicer spacing. svn path=/trunk/; revision=25481
This commit is contained in:

committed by
Sven Neumann

parent
fe5a7bc729
commit
a95de7a59c
@ -1,3 +1,8 @@
|
|||||||
|
2008-04-14 Sven Neumann <sven@gimp.org>
|
||||||
|
|
||||||
|
* app/display/gimpstatusbar.[ch]: rewritten the code that draws
|
||||||
|
the icon in the statusbar label. The new code gives nicer spacing.
|
||||||
|
|
||||||
2008-04-14 Sven Neumann <sven@gimp.org>
|
2008-04-14 Sven Neumann <sven@gimp.org>
|
||||||
|
|
||||||
* plug-ins/jpeg/jpeg.h
|
* plug-ins/jpeg/jpeg.h
|
||||||
|
@ -94,9 +94,6 @@ static gboolean gimp_statusbar_progress_message (GimpProgress *progress,
|
|||||||
static void gimp_statusbar_progress_canceled (GtkWidget *button,
|
static void gimp_statusbar_progress_canceled (GtkWidget *button,
|
||||||
GimpStatusbar *statusbar);
|
GimpStatusbar *statusbar);
|
||||||
|
|
||||||
static void gimp_statusbar_label_style_set (GtkWidget *widget,
|
|
||||||
GtkStyle *prev_style,
|
|
||||||
GimpStatusbar *statusbar);
|
|
||||||
static gboolean gimp_statusbar_label_expose (GtkWidget *widget,
|
static gboolean gimp_statusbar_label_expose (GtkWidget *widget,
|
||||||
GdkEventExpose *event,
|
GdkEventExpose *event,
|
||||||
GimpStatusbar *statusbar);
|
GimpStatusbar *statusbar);
|
||||||
@ -209,12 +206,9 @@ gimp_statusbar_init (GimpStatusbar *statusbar)
|
|||||||
|
|
||||||
/* put the label back into our hbox */
|
/* put the label back into our hbox */
|
||||||
gtk_box_pack_start (GTK_BOX (hbox),
|
gtk_box_pack_start (GTK_BOX (hbox),
|
||||||
GTK_STATUSBAR (statusbar)->label, TRUE, TRUE, 0);
|
GTK_STATUSBAR (statusbar)->label, TRUE, TRUE, 1);
|
||||||
g_object_unref (GTK_STATUSBAR (statusbar)->label);
|
g_object_unref (GTK_STATUSBAR (statusbar)->label);
|
||||||
|
|
||||||
g_signal_connect_after (GTK_STATUSBAR (statusbar)->label, "style-set",
|
|
||||||
G_CALLBACK (gimp_statusbar_label_style_set),
|
|
||||||
statusbar);
|
|
||||||
g_signal_connect_after (GTK_STATUSBAR (statusbar)->label, "expose-event",
|
g_signal_connect_after (GTK_STATUSBAR (statusbar)->label, "expose-event",
|
||||||
G_CALLBACK (gimp_statusbar_label_expose),
|
G_CALLBACK (gimp_statusbar_label_expose),
|
||||||
statusbar);
|
statusbar);
|
||||||
@ -254,15 +248,21 @@ gimp_statusbar_finalize (GObject *object)
|
|||||||
{
|
{
|
||||||
GimpStatusbar *statusbar = GIMP_STATUSBAR (object);
|
GimpStatusbar *statusbar = GIMP_STATUSBAR (object);
|
||||||
|
|
||||||
|
if (statusbar->icon)
|
||||||
|
{
|
||||||
|
g_object_unref (statusbar->icon);
|
||||||
|
statusbar->icon = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
g_slist_foreach (statusbar->messages, (GFunc) gimp_statusbar_msg_free, NULL);
|
g_slist_foreach (statusbar->messages, (GFunc) gimp_statusbar_msg_free, NULL);
|
||||||
g_slist_free (statusbar->messages);
|
g_slist_free (statusbar->messages);
|
||||||
statusbar->messages = NULL;
|
statusbar->messages = NULL;
|
||||||
|
|
||||||
g_hash_table_destroy (statusbar->context_ids);
|
if (statusbar->context_ids)
|
||||||
statusbar->context_ids = NULL;
|
{
|
||||||
|
g_hash_table_destroy (statusbar->context_ids);
|
||||||
g_free (statusbar->icon_spaces);
|
statusbar->context_ids = NULL;
|
||||||
statusbar->icon_spaces = NULL;
|
}
|
||||||
|
|
||||||
G_OBJECT_CLASS (parent_class)->finalize (object);
|
G_OBJECT_CLASS (parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
@ -414,7 +414,7 @@ gimp_statusbar_progress_set_text (GimpProgress *progress,
|
|||||||
{
|
{
|
||||||
GtkWidget *bar = statusbar->progressbar;
|
GtkWidget *bar = statusbar->progressbar;
|
||||||
|
|
||||||
gimp_statusbar_replace (statusbar, "progress", "%s", message);
|
gimp_statusbar_replace (statusbar, "progress", NULL, "%s", message);
|
||||||
|
|
||||||
if (GTK_WIDGET_DRAWABLE (bar))
|
if (GTK_WIDGET_DRAWABLE (bar))
|
||||||
gdk_window_process_updates (bar->window, TRUE);
|
gdk_window_process_updates (bar->window, TRUE);
|
||||||
@ -483,13 +483,14 @@ gimp_statusbar_progress_message (GimpProgress *progress,
|
|||||||
const gchar *message)
|
const gchar *message)
|
||||||
{
|
{
|
||||||
GimpStatusbar *statusbar = GIMP_STATUSBAR (progress);
|
GimpStatusbar *statusbar = GIMP_STATUSBAR (progress);
|
||||||
|
GtkWidget *label = GTK_STATUSBAR (statusbar)->label;
|
||||||
PangoLayout *layout;
|
PangoLayout *layout;
|
||||||
|
const gchar *stock_id = gimp_get_message_stock_id (severity);
|
||||||
gboolean handle_msg = FALSE;
|
gboolean handle_msg = FALSE;
|
||||||
|
|
||||||
/* we can only handle short one-liners */
|
/* we can only handle short one-liners */
|
||||||
|
|
||||||
layout = gtk_widget_create_pango_layout (GTK_STATUSBAR (statusbar)->label,
|
layout = gtk_widget_create_pango_layout (label, message);
|
||||||
message);
|
|
||||||
|
|
||||||
if (pango_layout_get_line_count (layout) == 1)
|
if (pango_layout_get_line_count (layout) == 1)
|
||||||
{
|
{
|
||||||
@ -497,20 +498,31 @@ gimp_statusbar_progress_message (GimpProgress *progress,
|
|||||||
|
|
||||||
pango_layout_get_pixel_size (layout, &width, NULL);
|
pango_layout_get_pixel_size (layout, &width, NULL);
|
||||||
|
|
||||||
width += statusbar->icon_width;
|
if (width < label->allocation.width)
|
||||||
|
|
||||||
if (width < GTK_STATUSBAR (statusbar)->label->allocation.width)
|
|
||||||
{
|
{
|
||||||
handle_msg = TRUE;
|
if (stock_id)
|
||||||
|
{
|
||||||
|
GdkPixbuf *pixbuf;
|
||||||
|
|
||||||
|
pixbuf = gtk_widget_render_icon (label, stock_id,
|
||||||
|
GTK_ICON_SIZE_MENU, NULL);
|
||||||
|
|
||||||
|
handle_msg = (width + gdk_pixbuf_get_width (pixbuf) <
|
||||||
|
label->allocation.width);
|
||||||
|
|
||||||
|
g_object_unref (pixbuf);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
handle_msg = TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
g_object_unref (layout);
|
g_object_unref (layout);
|
||||||
|
|
||||||
if (handle_msg)
|
if (handle_msg)
|
||||||
gimp_statusbar_push_temp (statusbar,
|
gimp_statusbar_push_temp (statusbar, stock_id, "%s", message);
|
||||||
gimp_get_message_stock_id (severity),
|
|
||||||
"%s", message);
|
|
||||||
|
|
||||||
return handle_msg;
|
return handle_msg;
|
||||||
}
|
}
|
||||||
@ -525,12 +537,61 @@ gimp_statusbar_progress_canceled (GtkWidget *button,
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
gimp_statusbar_set_text (GimpStatusbar *statusbar,
|
gimp_statusbar_set_text (GimpStatusbar *statusbar,
|
||||||
|
const gchar *stock_id,
|
||||||
const gchar *text)
|
const gchar *text)
|
||||||
{
|
{
|
||||||
if (statusbar->progress_active)
|
if (statusbar->progress_active)
|
||||||
gtk_progress_bar_set_text (GTK_PROGRESS_BAR (statusbar->progressbar), text);
|
{
|
||||||
|
gtk_progress_bar_set_text (GTK_PROGRESS_BAR (statusbar->progressbar),
|
||||||
|
text);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
gtk_label_set_text (GTK_LABEL (GTK_STATUSBAR (statusbar)->label), text);
|
{
|
||||||
|
GtkLabel *label = GTK_LABEL (GTK_STATUSBAR (statusbar)->label);
|
||||||
|
|
||||||
|
if (statusbar->icon)
|
||||||
|
g_object_unref (statusbar->icon);
|
||||||
|
|
||||||
|
if (stock_id)
|
||||||
|
statusbar->icon = gtk_widget_render_icon (GTK_WIDGET (label),
|
||||||
|
stock_id,
|
||||||
|
GTK_ICON_SIZE_MENU, NULL);
|
||||||
|
else
|
||||||
|
statusbar->icon = NULL;
|
||||||
|
|
||||||
|
if (statusbar->icon)
|
||||||
|
{
|
||||||
|
PangoAttrList *attrs;
|
||||||
|
PangoAttribute *attr;
|
||||||
|
PangoRectangle rect;
|
||||||
|
gchar *tmp;
|
||||||
|
|
||||||
|
tmp = g_strconcat (" ", text, NULL);
|
||||||
|
gtk_label_set_text (label, tmp);
|
||||||
|
g_free (tmp);
|
||||||
|
|
||||||
|
rect.x = 0;
|
||||||
|
rect.y = 0;
|
||||||
|
rect.width = PANGO_SCALE * (gdk_pixbuf_get_width (statusbar->icon) +
|
||||||
|
2);
|
||||||
|
rect.height = PANGO_SCALE * gdk_pixbuf_get_height (statusbar->icon);
|
||||||
|
|
||||||
|
attrs = pango_attr_list_new ();
|
||||||
|
|
||||||
|
attr = pango_attr_shape_new (&rect, &rect);
|
||||||
|
attr->start_index = 0;
|
||||||
|
attr->end_index = 1;
|
||||||
|
pango_attr_list_insert (attrs, attr);
|
||||||
|
|
||||||
|
gtk_label_set_attributes (label, attrs);
|
||||||
|
pango_attr_list_unref (attrs);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gtk_label_set_text (label, text);
|
||||||
|
gtk_label_set_attributes (label, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -553,16 +614,13 @@ gimp_statusbar_update (GimpStatusbar *statusbar)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (msg && msg->stock_id && msg->text)
|
if (msg && msg->text)
|
||||||
{
|
{
|
||||||
gchar *temp = g_strconcat (statusbar->icon_spaces, msg->text, NULL);
|
gimp_statusbar_set_text (statusbar, msg->stock_id, msg->text);
|
||||||
|
|
||||||
gimp_statusbar_set_text (statusbar, temp);
|
|
||||||
g_free (temp);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
gimp_statusbar_set_text (statusbar, msg && msg->text ? msg->text : "");
|
gimp_statusbar_set_text (statusbar, NULL, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1109,87 +1167,31 @@ gimp_statusbar_clear_cursor (GimpStatusbar *statusbar)
|
|||||||
|
|
||||||
/* private functions */
|
/* private functions */
|
||||||
|
|
||||||
static void
|
|
||||||
gimp_statusbar_label_style_set (GtkWidget *widget,
|
|
||||||
GtkStyle *prev_style,
|
|
||||||
GimpStatusbar *statusbar)
|
|
||||||
{
|
|
||||||
PangoLayout *layout;
|
|
||||||
GdkPixbuf *pixbuf;
|
|
||||||
gint n_spaces = 1;
|
|
||||||
gint layout_width;
|
|
||||||
|
|
||||||
layout = gtk_widget_create_pango_layout (widget, " ");
|
|
||||||
pixbuf = gtk_widget_render_icon (widget, GIMP_STOCK_WARNING,
|
|
||||||
GTK_ICON_SIZE_MENU, NULL);
|
|
||||||
|
|
||||||
pango_layout_get_pixel_size (layout, &layout_width, NULL);
|
|
||||||
|
|
||||||
while (layout_width < gdk_pixbuf_get_width (pixbuf) + 2)
|
|
||||||
{
|
|
||||||
n_spaces++;
|
|
||||||
|
|
||||||
statusbar->icon_spaces = g_realloc (statusbar->icon_spaces, n_spaces + 1);
|
|
||||||
|
|
||||||
memset (statusbar->icon_spaces, ' ', n_spaces);
|
|
||||||
statusbar->icon_spaces[n_spaces] = '\0';
|
|
||||||
|
|
||||||
pango_layout_set_text (layout, statusbar->icon_spaces, -1);
|
|
||||||
pango_layout_get_pixel_size (layout, &layout_width, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
statusbar->icon_width = layout_width;
|
|
||||||
|
|
||||||
g_object_unref (layout);
|
|
||||||
g_object_unref (pixbuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gimp_statusbar_label_expose (GtkWidget *widget,
|
gimp_statusbar_label_expose (GtkWidget *widget,
|
||||||
GdkEventExpose *event,
|
GdkEventExpose *event,
|
||||||
GimpStatusbar *statusbar)
|
GimpStatusbar *statusbar)
|
||||||
{
|
{
|
||||||
GdkPixbuf *pixbuf;
|
if (statusbar->icon)
|
||||||
const gchar *stock_id = NULL;
|
|
||||||
gint x, y;
|
|
||||||
|
|
||||||
if (statusbar->messages)
|
|
||||||
{
|
{
|
||||||
GimpStatusbarMsg *msg = statusbar->messages->data;
|
PangoRectangle rect;
|
||||||
|
gint x, y;
|
||||||
|
|
||||||
stock_id = msg->stock_id;
|
gtk_label_get_layout_offsets (GTK_LABEL (widget), &x, &y);
|
||||||
|
|
||||||
|
pango_layout_index_to_pos (gtk_label_get_layout (GTK_LABEL (widget)), 0,
|
||||||
|
&rect);
|
||||||
|
|
||||||
|
gdk_draw_pixbuf (widget->window, widget->style->black_gc,
|
||||||
|
statusbar->icon,
|
||||||
|
0, 0,
|
||||||
|
x + PANGO_PIXELS (rect.x),
|
||||||
|
y + PANGO_PIXELS (rect.y),
|
||||||
|
gdk_pixbuf_get_width (statusbar->icon),
|
||||||
|
gdk_pixbuf_get_height (statusbar->icon),
|
||||||
|
GDK_RGB_DITHER_NORMAL, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! stock_id)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
pixbuf = gtk_widget_render_icon (widget, stock_id, GTK_ICON_SIZE_MENU, NULL);
|
|
||||||
|
|
||||||
g_return_val_if_fail (pixbuf != NULL, FALSE);
|
|
||||||
|
|
||||||
if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL)
|
|
||||||
{
|
|
||||||
x = (widget->allocation.width - 2 * widget->style->xthickness -
|
|
||||||
gdk_pixbuf_get_width (pixbuf));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
x = widget->style->xthickness;
|
|
||||||
}
|
|
||||||
|
|
||||||
y = ((widget->allocation.height - gdk_pixbuf_get_height (pixbuf)) / 2);
|
|
||||||
|
|
||||||
gdk_draw_pixbuf (widget->window, widget->style->black_gc,
|
|
||||||
pixbuf,
|
|
||||||
0, 0,
|
|
||||||
widget->allocation.x + x,
|
|
||||||
widget->allocation.y + y,
|
|
||||||
gdk_pixbuf_get_width (pixbuf),
|
|
||||||
gdk_pixbuf_get_height (pixbuf),
|
|
||||||
GDK_RGB_DITHER_NORMAL, 0, 0);
|
|
||||||
|
|
||||||
g_object_unref (pixbuf);
|
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,10 +46,10 @@ struct _GimpStatusbar
|
|||||||
GHashTable *context_ids;
|
GHashTable *context_ids;
|
||||||
guint seq_context_id;
|
guint seq_context_id;
|
||||||
|
|
||||||
|
GdkPixbuf *icon;
|
||||||
|
|
||||||
guint temp_context_id;
|
guint temp_context_id;
|
||||||
guint temp_timeout_id;
|
guint temp_timeout_id;
|
||||||
gint icon_width;
|
|
||||||
gchar *icon_spaces;
|
|
||||||
|
|
||||||
gchar cursor_format_str[CURSOR_FORMAT_LENGTH];
|
gchar cursor_format_str[CURSOR_FORMAT_LENGTH];
|
||||||
gchar length_format_str[CURSOR_FORMAT_LENGTH];
|
gchar length_format_str[CURSOR_FORMAT_LENGTH];
|
||||||
|
Reference in New Issue
Block a user