app: derive GimpStatusbar from GtkFrame not GtkStatusbar

we were not using a single GtkStatusBar features, it was only in the
way. Remove broken size allocation logic and simply set a minimum
height of 3em in CSS. Also ellipsize the label, long labels had funny
effects since changing the overall GimpDisplayShell packing to pure
GtkGrid.
This commit is contained in:
Michael Natterer 2018-05-13 20:36:22 +02:00
parent 7f6b58d6ce
commit e76c1305a5
3 changed files with 47 additions and 127 deletions

View File

@ -46,16 +46,16 @@
#include "gimp-intl.h"
/* maximal width of the string holding the cursor-coordinates */
/* maximal width of the string holding the cursor-coordinates */
#define CURSOR_LEN 256
/* the spacing of the hbox */
/* the spacing of the hbox */
#define HBOX_SPACING 1
/* spacing between the icon and the statusbar label */
/* spacing between the icon and the statusbar label */
#define ICON_SPACING 2
/* timeout (in milliseconds) for temporary statusbar messages */
/* timeout (in milliseconds) for temporary statusbar messages */
#define MESSAGE_TIMEOUT 8000
/* minimal interval (in microseconds) between progress updates */
@ -81,9 +81,6 @@ static void gimp_statusbar_screen_changed (GtkWidget *widget,
GdkScreen *previous);
static void gimp_statusbar_style_updated (GtkWidget *widget);
static void gimp_statusbar_hbox_style_updated (GtkWidget *widget,
GimpStatusbar *statusbar);
static GimpProgress *
gimp_statusbar_progress_start (GimpProgress *progress,
gboolean cancellable,
@ -152,7 +149,7 @@ static GdkPixbuf * gimp_statusbar_load_icon (GimpStatusbar *statusbar,
const gchar *icon_name);
G_DEFINE_TYPE_WITH_CODE (GimpStatusbar, gimp_statusbar, GTK_TYPE_STATUSBAR,
G_DEFINE_TYPE_WITH_CODE (GimpStatusbar, gimp_statusbar, GTK_TYPE_FRAME,
G_IMPLEMENT_INTERFACE (GIMP_TYPE_PROGRESS,
gimp_statusbar_progress_iface_init))
@ -170,6 +167,8 @@ gimp_statusbar_class_init (GimpStatusbarClass *klass)
widget_class->screen_changed = gimp_statusbar_screen_changed;
widget_class->style_updated = gimp_statusbar_style_updated;
gtk_widget_class_set_css_name (widget_class, "statusbar");
}
static void
@ -193,7 +192,12 @@ gimp_statusbar_init (GimpStatusbar *statusbar)
GtkWidget *image;
GtkWidget *widget;
GimpUnitStore *store;
GList *children;
gtk_frame_set_shadow_type (GTK_FRAME (statusbar), GTK_SHADOW_IN);
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, HBOX_SPACING);
gtk_container_add (GTK_CONTAINER (statusbar), hbox);
gtk_widget_show (hbox);
statusbar->shell = NULL;
statusbar->messages = NULL;
@ -211,22 +215,9 @@ gimp_statusbar_init (GimpStatusbar *statusbar)
statusbar->progress_active = FALSE;
statusbar->progress_shown = FALSE;
/* remove the message label from the message area */
hbox = gtk_statusbar_get_message_area (GTK_STATUSBAR (statusbar));
gtk_box_set_spacing (GTK_BOX (hbox), HBOX_SPACING);
children = gtk_container_get_children (GTK_CONTAINER (hbox));
statusbar->label = g_object_ref (children->data);
g_list_free (children);
gtk_container_remove (GTK_CONTAINER (hbox), statusbar->label);
g_signal_connect_after (hbox, "style-updated",
G_CALLBACK (gimp_statusbar_hbox_style_updated),
statusbar);
statusbar->cursor_label = gtk_label_new ("8888, 8888");
gtk_box_pack_start (GTK_BOX (hbox), statusbar->cursor_label, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (hbox), statusbar->cursor_label,
FALSE, FALSE, 0);
gtk_widget_show (statusbar->cursor_label);
store = gimp_unit_store_new (2);
@ -235,7 +226,8 @@ gimp_statusbar_init (GimpStatusbar *statusbar)
gtk_widget_set_can_focus (statusbar->unit_combo, FALSE);
g_object_set (statusbar->unit_combo, "focus-on-click", FALSE, NULL);
gtk_box_pack_start (GTK_BOX (hbox), statusbar->unit_combo, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (hbox), statusbar->unit_combo,
FALSE, FALSE, 0);
gtk_widget_show (statusbar->unit_combo);
g_signal_connect (statusbar->unit_combo, "changed",
@ -245,7 +237,8 @@ gimp_statusbar_init (GimpStatusbar *statusbar)
statusbar->scale_combo = gimp_scale_combo_box_new ();
gtk_widget_set_can_focus (statusbar->scale_combo, FALSE);
g_object_set (statusbar->scale_combo, "focus-on-click", FALSE, NULL);
gtk_box_pack_start (GTK_BOX (hbox), statusbar->scale_combo, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (hbox), statusbar->scale_combo,
FALSE, FALSE, 0);
gtk_widget_show (statusbar->scale_combo);
g_signal_connect (statusbar->scale_combo, "changed",
@ -269,31 +262,38 @@ gimp_statusbar_init (GimpStatusbar *statusbar)
gtk_widget_show (widget);
widget = gtk_event_box_new ();
statusbar->horizontal_flip_icon = gtk_image_new_from_icon_name ("gimp-flip-horizontal",
GTK_ICON_SIZE_MENU);
gtk_container_add (GTK_CONTAINER (widget), statusbar->horizontal_flip_icon);
gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 1);
gtk_widget_show (widget);
statusbar->horizontal_flip_icon =
gtk_image_new_from_icon_name ("gimp-flip-horizontal",
GTK_ICON_SIZE_MENU);
gtk_container_add (GTK_CONTAINER (widget), statusbar->horizontal_flip_icon);
gtk_widget_show (statusbar->horizontal_flip_icon);
g_signal_connect (widget, "button-press-event",
G_CALLBACK (gimp_statusbar_horiz_flip_pressed),
statusbar);
gtk_widget_show (statusbar->horizontal_flip_icon);
gtk_widget_show (widget);
widget = gtk_event_box_new ();
statusbar->vertical_flip_icon = gtk_image_new_from_icon_name ("gimp-flip-vertical",
GTK_ICON_SIZE_MENU);
gtk_container_add (GTK_CONTAINER (widget), statusbar->vertical_flip_icon);
gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 1);
gtk_widget_show (widget);
statusbar->vertical_flip_icon =
gtk_image_new_from_icon_name ("gimp-flip-vertical",
GTK_ICON_SIZE_MENU);
gtk_container_add (GTK_CONTAINER (widget), statusbar->vertical_flip_icon);
gtk_widget_show (statusbar->vertical_flip_icon);
g_signal_connect (widget, "button-press-event",
G_CALLBACK (gimp_statusbar_vert_flip_pressed),
statusbar);
gtk_widget_show (statusbar->vertical_flip_icon);
gtk_widget_show (widget);
/* put the label back into the message area */
statusbar->label = gtk_label_new ("");
gtk_label_set_ellipsize (GTK_LABEL (statusbar->label), PANGO_ELLIPSIZE_END);
gtk_widget_set_halign (GTK_WIDGET (statusbar->label), GTK_ALIGN_START);
gtk_box_pack_start (GTK_BOX (hbox), statusbar->label, TRUE, TRUE, 1);
g_object_unref (statusbar->label);
gtk_widget_show (statusbar->label);
g_signal_connect_after (statusbar->label, "draw",
G_CALLBACK (gimp_statusbar_label_draw),
@ -303,7 +303,8 @@ gimp_statusbar_init (GimpStatusbar *statusbar)
"show-text", TRUE,
"ellipsize", PANGO_ELLIPSIZE_END,
NULL);
gtk_box_pack_start (GTK_BOX (hbox), statusbar->progressbar, TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (hbox), statusbar->progressbar,
TRUE, TRUE, 0);
/* don't show the progress bar */
/* construct the cancel button's contents manually because we
@ -315,8 +316,8 @@ gimp_statusbar_init (GimpStatusbar *statusbar)
gtk_button_set_relief (GTK_BUTTON (statusbar->cancel_button),
GTK_RELIEF_NONE);
gtk_widget_set_sensitive (statusbar->cancel_button, FALSE);
gtk_box_pack_end (GTK_BOX (hbox),
statusbar->cancel_button, FALSE, FALSE, 0);
gtk_box_pack_end (GTK_BOX (hbox), statusbar->cancel_button,
FALSE, FALSE, 0);
/* don't show the cancel button */
hbox2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
@ -384,74 +385,9 @@ gimp_statusbar_style_updated (GtkWidget *widget)
{
GimpStatusbar *statusbar = GIMP_STATUSBAR (widget);
GTK_WIDGET_CLASS (parent_class)->style_updated (widget);
g_clear_pointer (&statusbar->icon_hash, g_hash_table_unref);
}
static void
gimp_statusbar_hbox_style_updated (GtkWidget *widget,
GimpStatusbar *statusbar)
{
GtkRequisition requisition;
GtkRequisition child_requisition;
gint width = 0;
gint height;
gtk_widget_get_preferred_size (widget, &requisition, NULL);
height = requisition.height;
/* also consider the children which can be invisible */
if (statusbar->cursor_label)
{
gtk_widget_get_preferred_size (statusbar->cursor_label,
&child_requisition, NULL);
width += child_requisition.width;
height = MAX (height, child_requisition.height);
}
if (statusbar->unit_combo)
{
gtk_widget_get_preferred_size (statusbar->unit_combo,
&child_requisition, NULL);
width += child_requisition.width;
height = MAX (height, child_requisition.height);
}
if (statusbar->scale_combo)
{
gtk_widget_get_preferred_size (statusbar->scale_combo,
&child_requisition, NULL);
width += child_requisition.width;
height = MAX (height, child_requisition.height);
}
if (statusbar->progressbar)
{
gtk_widget_get_preferred_size (statusbar->progressbar,
&child_requisition, NULL);
height = MAX (height, child_requisition.height);
}
if (statusbar->label)
{
gtk_widget_get_preferred_size (statusbar->label,
&child_requisition, NULL);
height = MAX (height, child_requisition.height);
}
if (statusbar->cancel_button)
{
gtk_widget_get_preferred_size (statusbar->cancel_button,
&child_requisition, NULL);
height = MAX (height, child_requisition.height);
}
width = MAX (requisition.width, width + 32);
gtk_widget_set_size_request (widget, width, height);
GTK_WIDGET_CLASS (parent_class)->style_updated (widget);
}
static GimpProgress *

View File

@ -36,7 +36,7 @@ typedef struct _GimpStatusbarClass GimpStatusbarClass;
struct _GimpStatusbar
{
GtkStatusbar parent_instance;
GtkFrame parent_instance;
GimpDisplayShell *shell;
@ -73,7 +73,7 @@ struct _GimpStatusbar
struct _GimpStatusbarClass
{
GtkStatusbarClass parent_class;
GtkFrameClass parent_class;
};

View File

@ -42,26 +42,10 @@ GimpDisplayShell button {
padding: 0 0 0 0;
}
/* i hate the statusar
GimpDisplayShell statusbar {
min-height: 0;
min-width: 0;
padding: 0 0 0 0;
min-height: 3em;
}
GimpDisplayShell statusbar {
min-height: 0;
min-width: 0;
padding: 0 0 0 0;
}
GimpDisplayShell statusbar {
min-height: 0;
min-width: 0;
padding: 0 0 0 0;
}
*/
GimpDock {
font-size: smaller;
}