mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-10-02 03:57:36 +00:00
Add a GtkExtendedLayout implementation for GtkFrame
This commit is contained in:
parent
cd45dfaa1d
commit
538ec4efbb
156
gtk/gtkframe.c
156
gtk/gtkframe.c
@ -31,6 +31,7 @@
|
|||||||
#include "gtkprivate.h"
|
#include "gtkprivate.h"
|
||||||
#include "gtkintl.h"
|
#include "gtkintl.h"
|
||||||
#include "gtkbuildable.h"
|
#include "gtkbuildable.h"
|
||||||
|
#include "gtkextendedlayout.h"
|
||||||
#include "gtkalias.h"
|
#include "gtkalias.h"
|
||||||
|
|
||||||
#define LABEL_PAD 1
|
#define LABEL_PAD 1
|
||||||
@ -81,9 +82,19 @@ static void gtk_frame_buildable_add_child (GtkBuildable *buildable,
|
|||||||
GObject *child,
|
GObject *child,
|
||||||
const gchar *type);
|
const gchar *type);
|
||||||
|
|
||||||
|
static void gtk_frame_extended_layout_init (GtkExtendedLayoutIface *iface);
|
||||||
|
static void gtk_frame_get_desired_width (GtkExtendedLayout *layout,
|
||||||
|
gint *minimum_size,
|
||||||
|
gint *natural_size);
|
||||||
|
static void gtk_frame_get_desired_height (GtkExtendedLayout *layout,
|
||||||
|
gint *minimum_size,
|
||||||
|
gint *natural_size);
|
||||||
|
|
||||||
G_DEFINE_TYPE_WITH_CODE (GtkFrame, gtk_frame, GTK_TYPE_BIN,
|
G_DEFINE_TYPE_WITH_CODE (GtkFrame, gtk_frame, GTK_TYPE_BIN,
|
||||||
G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
|
G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
|
||||||
gtk_frame_buildable_init))
|
gtk_frame_buildable_init)
|
||||||
|
G_IMPLEMENT_INTERFACE (GTK_TYPE_EXTENDED_LAYOUT,
|
||||||
|
gtk_frame_extended_layout_init))
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtk_frame_class_init (GtkFrameClass *class)
|
gtk_frame_class_init (GtkFrameClass *class)
|
||||||
@ -150,7 +161,6 @@ gtk_frame_class_init (GtkFrameClass *class)
|
|||||||
GTK_PARAM_READWRITE));
|
GTK_PARAM_READWRITE));
|
||||||
|
|
||||||
widget_class->expose_event = gtk_frame_expose;
|
widget_class->expose_event = gtk_frame_expose;
|
||||||
widget_class->size_request = gtk_frame_size_request;
|
|
||||||
widget_class->size_allocate = gtk_frame_size_allocate;
|
widget_class->size_allocate = gtk_frame_size_allocate;
|
||||||
|
|
||||||
container_class->remove = gtk_frame_remove;
|
container_class->remove = gtk_frame_remove;
|
||||||
@ -601,42 +611,6 @@ gtk_frame_expose (GtkWidget *widget,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
gtk_frame_size_request (GtkWidget *widget,
|
|
||||||
GtkRequisition *requisition)
|
|
||||||
{
|
|
||||||
GtkFrame *frame = GTK_FRAME (widget);
|
|
||||||
GtkBin *bin = GTK_BIN (widget);
|
|
||||||
GtkRequisition child_requisition;
|
|
||||||
|
|
||||||
if (frame->label_widget && gtk_widget_get_visible (frame->label_widget))
|
|
||||||
{
|
|
||||||
gtk_widget_size_request (frame->label_widget, &child_requisition);
|
|
||||||
|
|
||||||
requisition->width = child_requisition.width + 2 * LABEL_PAD + 2 * LABEL_SIDE_PAD;
|
|
||||||
requisition->height =
|
|
||||||
MAX (0, child_requisition.height - widget->style->ythickness);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
requisition->width = 0;
|
|
||||||
requisition->height = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bin->child && gtk_widget_get_visible (bin->child))
|
|
||||||
{
|
|
||||||
gtk_widget_size_request (bin->child, &child_requisition);
|
|
||||||
|
|
||||||
requisition->width = MAX (requisition->width, child_requisition.width);
|
|
||||||
requisition->height += child_requisition.height;
|
|
||||||
}
|
|
||||||
|
|
||||||
requisition->width += (GTK_CONTAINER (widget)->border_width +
|
|
||||||
GTK_WIDGET (widget)->style->xthickness) * 2;
|
|
||||||
requisition->height += (GTK_CONTAINER (widget)->border_width +
|
|
||||||
GTK_WIDGET (widget)->style->ythickness) * 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtk_frame_size_allocate (GtkWidget *widget,
|
gtk_frame_size_allocate (GtkWidget *widget,
|
||||||
GtkAllocation *allocation)
|
GtkAllocation *allocation)
|
||||||
@ -652,11 +626,15 @@ gtk_frame_size_allocate (GtkWidget *widget,
|
|||||||
/* If the child allocation changed, that means that the frame is drawn
|
/* If the child allocation changed, that means that the frame is drawn
|
||||||
* in a new place, so we must redraw the entire widget.
|
* in a new place, so we must redraw the entire widget.
|
||||||
*/
|
*/
|
||||||
if (gtk_widget_get_mapped (widget) &&
|
if (gtk_widget_get_mapped (widget)
|
||||||
|
#if 0
|
||||||
|
&&
|
||||||
(new_allocation.x != frame->child_allocation.x ||
|
(new_allocation.x != frame->child_allocation.x ||
|
||||||
new_allocation.y != frame->child_allocation.y ||
|
new_allocation.y != frame->child_allocation.y ||
|
||||||
new_allocation.width != frame->child_allocation.width ||
|
new_allocation.width != frame->child_allocation.width ||
|
||||||
new_allocation.height != frame->child_allocation.height))
|
new_allocation.height != frame->child_allocation.height)
|
||||||
|
#endif
|
||||||
|
)
|
||||||
gdk_window_invalidate_rect (widget->window, &widget->allocation, FALSE);
|
gdk_window_invalidate_rect (widget->window, &widget->allocation, FALSE);
|
||||||
|
|
||||||
if (bin->child && gtk_widget_get_visible (bin->child))
|
if (bin->child && gtk_widget_get_visible (bin->child))
|
||||||
@ -728,5 +706,103 @@ gtk_frame_real_compute_child_allocation (GtkFrame *frame,
|
|||||||
child_allocation->y += allocation->y;
|
child_allocation->y += allocation->y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_frame_get_desired_size (GtkExtendedLayout *layout,
|
||||||
|
GtkOrientation orientation,
|
||||||
|
gint *minimum_size,
|
||||||
|
gint *natural_size)
|
||||||
|
{
|
||||||
|
GtkWidget *widget = GTK_WIDGET (layout);
|
||||||
|
GtkFrame *frame = GTK_FRAME (widget);
|
||||||
|
GtkBin *bin = GTK_BIN (widget);
|
||||||
|
gint child_min, child_nat;
|
||||||
|
gint minimum, natural;
|
||||||
|
|
||||||
|
if (frame->label_widget && gtk_widget_get_visible (frame->label_widget))
|
||||||
|
{
|
||||||
|
if (orientation == GTK_ORIENTATION_HORIZONTAL)
|
||||||
|
{
|
||||||
|
gtk_extended_layout_get_desired_width (GTK_EXTENDED_LAYOUT (frame->label_widget),
|
||||||
|
&child_min, &child_nat);
|
||||||
|
minimum = child_min + 2 * LABEL_PAD + 2 * LABEL_SIDE_PAD;
|
||||||
|
natural = child_nat + 2 * LABEL_PAD + 2 * LABEL_SIDE_PAD;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gtk_extended_layout_get_desired_height (GTK_EXTENDED_LAYOUT (frame->label_widget),
|
||||||
|
&child_min, &child_nat);
|
||||||
|
minimum = MAX (0, child_min - widget->style->ythickness);
|
||||||
|
natural = MAX (0, child_nat - widget->style->ythickness);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
minimum = 0;
|
||||||
|
natural = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bin->child && gtk_widget_get_visible (bin->child))
|
||||||
|
{
|
||||||
|
if (orientation == GTK_ORIENTATION_HORIZONTAL)
|
||||||
|
{
|
||||||
|
gtk_extended_layout_get_desired_width (GTK_EXTENDED_LAYOUT (bin->child),
|
||||||
|
&child_min, &child_nat);
|
||||||
|
minimum = MAX (minimum, child_min);
|
||||||
|
natural = MAX (natural, child_nat);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gtk_extended_layout_get_desired_height (GTK_EXTENDED_LAYOUT (bin->child),
|
||||||
|
&child_min, &child_nat);
|
||||||
|
minimum += child_min;
|
||||||
|
natural += child_nat;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (orientation == GTK_ORIENTATION_HORIZONTAL)
|
||||||
|
{
|
||||||
|
minimum += (GTK_CONTAINER (widget)->border_width +
|
||||||
|
GTK_WIDGET (widget)->style->xthickness) * 2;
|
||||||
|
natural += (GTK_CONTAINER (widget)->border_width +
|
||||||
|
GTK_WIDGET (widget)->style->xthickness) * 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
minimum += (GTK_CONTAINER (widget)->border_width +
|
||||||
|
GTK_WIDGET (widget)->style->ythickness) * 2;
|
||||||
|
natural += (GTK_CONTAINER (widget)->border_width +
|
||||||
|
GTK_WIDGET (widget)->style->ythickness) * 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (minimum_size)
|
||||||
|
*minimum_size = minimum;
|
||||||
|
|
||||||
|
if (natural_size)
|
||||||
|
*natural_size = natural;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_frame_get_desired_width (GtkExtendedLayout *layout,
|
||||||
|
gint *minimum_size,
|
||||||
|
gint *natural_size)
|
||||||
|
{
|
||||||
|
gtk_frame_get_desired_size (layout, GTK_ORIENTATION_HORIZONTAL, minimum_size, natural_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_frame_get_desired_height (GtkExtendedLayout *layout,
|
||||||
|
gint *minimum_size,
|
||||||
|
gint *natural_size)
|
||||||
|
{
|
||||||
|
gtk_frame_get_desired_size (layout, GTK_ORIENTATION_VERTICAL, minimum_size, natural_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_frame_extended_layout_init (GtkExtendedLayoutIface *iface)
|
||||||
|
{
|
||||||
|
iface->get_desired_width = gtk_frame_get_desired_width;
|
||||||
|
iface->get_desired_height = gtk_frame_get_desired_height;
|
||||||
|
}
|
||||||
|
|
||||||
#define __GTK_FRAME_C__
|
#define __GTK_FRAME_C__
|
||||||
#include "gtkaliasdef.c"
|
#include "gtkaliasdef.c"
|
||||||
|
Loading…
Reference in New Issue
Block a user