progressbar: Use box layout

Instead of the custom layouting we did before.
This commit is contained in:
Timm Bäder 2019-07-15 06:38:51 +02:00
parent 4bb4a98493
commit 831309eed2

View File

@ -38,6 +38,7 @@
#include "gtkprivate.h"
#include "gtkstylecontextprivate.h"
#include "gtkwidgetprivate.h"
#include "gtkboxlayout.h"
#include "a11y/gtkprogressbaraccessible.h"
@ -155,11 +156,6 @@ static void gtk_progress_bar_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec);
static void gtk_progress_bar_size_allocate (GtkWidget *widget,
int width,
int height,
int baseline);
static void gtk_progress_bar_act_mode_enter (GtkProgressBar *progress);
static void gtk_progress_bar_act_mode_leave (GtkProgressBar *progress);
static void gtk_progress_bar_finalize (GObject *object);
@ -168,14 +164,6 @@ static void gtk_progress_bar_set_orientation (GtkProgressBar *progress,
static void gtk_progress_bar_direction_changed (GtkWidget *widget,
GtkTextDirection previous_dir);
static void gtk_progress_bar_measure (GtkWidget *widget,
GtkOrientation orientation,
gint for_size,
gint *minimum,
gint *natural,
gint *minimum_baseline,
gint *natural_baseline);
G_DEFINE_TYPE_WITH_CODE (GtkProgressBar, gtk_progress_bar, GTK_TYPE_WIDGET,
G_ADD_PRIVATE (GtkProgressBar)
G_IMPLEMENT_INTERFACE (GTK_TYPE_ORIENTABLE, NULL))
@ -193,8 +181,6 @@ gtk_progress_bar_class_init (GtkProgressBarClass *class)
gobject_class->get_property = gtk_progress_bar_get_property;
gobject_class->finalize = gtk_progress_bar_finalize;
widget_class->measure = gtk_progress_bar_measure;
widget_class->size_allocate = gtk_progress_bar_size_allocate;
widget_class->direction_changed = gtk_progress_bar_direction_changed;
g_object_class_override_property (gobject_class, PROP_ORIENTATION, "orientation");
@ -274,6 +260,7 @@ gtk_progress_bar_class_init (GtkProgressBarClass *class)
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_PROGRESS_BAR_ACCESSIBLE);
gtk_widget_class_set_css_name (widget_class, I_("progressbar"));
gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BOX_LAYOUT);
}
static void
@ -475,7 +462,6 @@ gtk_progress_bar_init (GtkProgressBar *pbar)
{
GtkProgressBarPrivate *priv = gtk_progress_bar_get_instance_private (pbar);
priv->orientation = GTK_ORIENTATION_HORIZONTAL;
priv->inverted = FALSE;
priv->pulse_fraction = 0.1;
priv->activity_pos = 0;
@ -487,8 +473,6 @@ gtk_progress_bar_init (GtkProgressBar *pbar)
priv->text = NULL;
priv->fraction = 0.0;
_gtk_orientable_set_style_classes (GTK_ORIENTABLE (pbar));
priv->trough_widget = gtk_gizmo_new ("trough",
NULL,
allocate_trough,
@ -499,7 +483,10 @@ gtk_progress_bar_init (GtkProgressBar *pbar)
priv->progress_widget = gtk_gizmo_new ("progress", NULL, NULL, NULL, NULL);
gtk_widget_set_parent (priv->progress_widget, priv->trough_widget);
update_node_classes (pbar);
/* horizontal is default */
priv->orientation = GTK_ORIENTATION_VERTICAL; /* Just to force an update... */
gtk_progress_bar_set_orientation (pbar, GTK_ORIENTATION_HORIZONTAL);
_gtk_orientable_set_style_classes (GTK_ORIENTABLE (pbar));
}
static void
@ -626,122 +613,6 @@ get_current_text (GtkProgressBar *pbar)
return g_strdup_printf (C_("progress bar label", "%.0f%%"), priv->fraction * 100.0);
}
static void
gtk_progress_bar_size_allocate (GtkWidget *widget,
int width,
int height,
int baseline)
{
GtkProgressBarPrivate *priv = gtk_progress_bar_get_instance_private (GTK_PROGRESS_BAR (widget));
gint bar_width, bar_height;
gint text_width, text_height, text_min, text_nat;
GtkAllocation alloc;
if (priv->orientation == GTK_ORIENTATION_HORIZONTAL)
{
gtk_widget_measure (priv->trough_widget, GTK_ORIENTATION_VERTICAL, -1,
&bar_height, NULL,
NULL, NULL);
bar_width = width;
}
else
{
gtk_widget_measure (priv->trough_widget, GTK_ORIENTATION_HORIZONTAL, -1,
&bar_width, NULL,
NULL, NULL);
bar_height = height;
}
alloc.x = width - bar_width;
alloc.y = height - bar_height;
alloc.width = bar_width;
alloc.height = bar_height;
gtk_widget_size_allocate (priv->trough_widget, &alloc, -1);
if (!priv->show_text)
return;
gtk_widget_measure (priv->label, GTK_ORIENTATION_HORIZONTAL, -1,
&text_min, &text_nat,
NULL, NULL);
gtk_widget_measure (priv->label, GTK_ORIENTATION_VERTICAL, -1,
&text_height, NULL,
NULL, NULL);
text_width = CLAMP (text_nat, text_min, width);
if (priv->orientation == GTK_ORIENTATION_HORIZONTAL)
{
alloc.x = (width - text_width) / 2;
alloc.y = 0;
alloc.width = text_width;
alloc.height = text_height;
}
else
{
alloc.x = width - text_width;
alloc.y = (height - text_height) / 2;
alloc.width = text_width;
alloc.height = text_height;
}
gtk_widget_size_allocate (priv->label, &alloc, -1);
}
static void
gtk_progress_bar_measure (GtkWidget *widget,
GtkOrientation orientation,
int for_size,
int *minimum,
int *natural,
int *minimum_baseline,
int *natural_baseline)
{
GtkProgressBar *pbar = GTK_PROGRESS_BAR (widget);
GtkProgressBarPrivate *priv = gtk_progress_bar_get_instance_private (pbar);
gint text_minimum, text_natural;
gint trough_minimum, trough_natural;
if (priv->show_text)
gtk_widget_measure (priv->label, orientation, -1,
&text_minimum, &text_natural,
NULL, NULL);
else
text_minimum = text_natural = 0;
gtk_widget_measure (priv->trough_widget, orientation, -1,
&trough_minimum, &trough_natural,
NULL, NULL);
if (orientation == GTK_ORIENTATION_HORIZONTAL)
{
if (priv->orientation == GTK_ORIENTATION_HORIZONTAL)
{
*minimum = MAX (text_minimum, trough_minimum);
*natural = MAX (text_natural, trough_natural);
}
else
{
*minimum = text_minimum + trough_minimum;
*natural = text_natural + trough_natural;
}
}
else
{
if (priv->orientation == GTK_ORIENTATION_HORIZONTAL)
{
*minimum = text_minimum + trough_minimum;
*natural = text_natural + trough_natural;
}
else
{
*minimum = MAX (text_minimum, trough_minimum);
*natural = MAX (text_natural, trough_natural);
}
}
}
static gboolean
tick_cb (GtkWidget *widget,
GdkFrameClock *frame_clock,
@ -1087,16 +958,35 @@ gtk_progress_bar_set_orientation (GtkProgressBar *pbar,
GtkOrientation orientation)
{
GtkProgressBarPrivate *priv = gtk_progress_bar_get_instance_private (pbar);
GtkBoxLayout *layout;
if (priv->orientation == orientation)
return;
priv->orientation = orientation;
if (orientation == GTK_ORIENTATION_HORIZONTAL)
{
gtk_widget_set_vexpand (priv->trough_widget, FALSE);
gtk_widget_set_hexpand (priv->trough_widget, TRUE);
gtk_widget_set_halign (priv->trough_widget, GTK_ALIGN_FILL);
gtk_widget_set_valign (priv->trough_widget, GTK_ALIGN_CENTER);
}
else
{
gtk_widget_set_vexpand (priv->trough_widget, TRUE);
gtk_widget_set_hexpand (priv->trough_widget, FALSE);
gtk_widget_set_halign (priv->trough_widget, GTK_ALIGN_CENTER);
gtk_widget_set_valign (priv->trough_widget, GTK_ALIGN_FILL);
}
_gtk_orientable_set_style_classes (GTK_ORIENTABLE (pbar));
update_node_classes (pbar);
gtk_widget_queue_resize (GTK_WIDGET (pbar));
layout = GTK_BOX_LAYOUT (gtk_widget_get_layout_manager (GTK_WIDGET (pbar)));
gtk_orientable_set_orientation (GTK_ORIENTABLE (layout), GTK_ORIENTATION_VERTICAL);
g_object_notify (G_OBJECT (pbar), "orientation");
}