forked from AuroraMiddleware/gtk
Added margins to the cell area
Added margin properties to the cell area, margins will be removed from the area given to ->render() when creating the inner cell area.
This commit is contained in:
parent
25b00759c5
commit
163c3c8852
@ -27,9 +27,11 @@
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "gtkintl.h"
|
||||
#include "gtkcelllayout.h"
|
||||
#include "gtkcellarea.h"
|
||||
#include "gtkcellareaiter.h"
|
||||
#include "gtkprivate.h"
|
||||
|
||||
#include <gobject/gvaluecollector.h>
|
||||
|
||||
@ -37,6 +39,14 @@
|
||||
/* GObjectClass */
|
||||
static void gtk_cell_area_dispose (GObject *object);
|
||||
static void gtk_cell_area_finalize (GObject *object);
|
||||
static void gtk_cell_area_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec);
|
||||
static void gtk_cell_area_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec);
|
||||
|
||||
/* GtkCellAreaClass */
|
||||
static void gtk_cell_area_real_get_preferred_height_for_width (GtkCellArea *area,
|
||||
@ -111,6 +121,8 @@ typedef struct {
|
||||
struct _GtkCellAreaPrivate
|
||||
{
|
||||
GHashTable *cell_info;
|
||||
|
||||
GtkBorder border;
|
||||
};
|
||||
|
||||
/* Keep the paramspec pool internal, no need to deliver notifications
|
||||
@ -120,6 +132,13 @@ static GParamSpecPool *cell_property_pool = NULL;
|
||||
#define PARAM_SPEC_PARAM_ID(pspec) ((pspec)->param_id)
|
||||
#define PARAM_SPEC_SET_PARAM_ID(pspec, id) ((pspec)->param_id = (id))
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_MARGIN_LEFT,
|
||||
PROP_MARGIN_RIGHT,
|
||||
PROP_MARGIN_TOP,
|
||||
PROP_MARGIN_BOTTOM
|
||||
};
|
||||
|
||||
G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GtkCellArea, gtk_cell_area, G_TYPE_INITIALLY_UNOWNED,
|
||||
G_IMPLEMENT_INTERFACE (GTK_TYPE_CELL_LAYOUT,
|
||||
@ -139,6 +158,11 @@ gtk_cell_area_init (GtkCellArea *area)
|
||||
g_direct_equal,
|
||||
NULL,
|
||||
(GDestroyNotify)cell_info_free);
|
||||
|
||||
priv->border.left = 0;
|
||||
priv->border.right = 0;
|
||||
priv->border.top = 0;
|
||||
priv->border.bottom = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -147,8 +171,10 @@ gtk_cell_area_class_init (GtkCellAreaClass *class)
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (class);
|
||||
|
||||
/* GObjectClass */
|
||||
object_class->dispose = gtk_cell_area_dispose;
|
||||
object_class->finalize = gtk_cell_area_finalize;
|
||||
object_class->dispose = gtk_cell_area_dispose;
|
||||
object_class->finalize = gtk_cell_area_finalize;
|
||||
object_class->get_property = gtk_cell_area_get_property;
|
||||
object_class->set_property = gtk_cell_area_set_property;
|
||||
|
||||
/* general */
|
||||
class->add = NULL;
|
||||
@ -165,7 +191,48 @@ gtk_cell_area_class_init (GtkCellAreaClass *class)
|
||||
class->get_preferred_height_for_width = gtk_cell_area_real_get_preferred_height_for_width;
|
||||
class->get_preferred_width_for_height = gtk_cell_area_real_get_preferred_width_for_height;
|
||||
|
||||
/* Cell properties */
|
||||
/* Properties */
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_MARGIN_LEFT,
|
||||
g_param_spec_int ("margin-left",
|
||||
P_("Margin on Left"),
|
||||
P_("Pixels of extra space on the left side"),
|
||||
0,
|
||||
G_MAXINT16,
|
||||
0,
|
||||
GTK_PARAM_READWRITE));
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_MARGIN_RIGHT,
|
||||
g_param_spec_int ("margin-right",
|
||||
P_("Margin on Right"),
|
||||
P_("Pixels of extra space on the right side"),
|
||||
0,
|
||||
G_MAXINT16,
|
||||
0,
|
||||
GTK_PARAM_READWRITE));
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_MARGIN_TOP,
|
||||
g_param_spec_int ("margin-top",
|
||||
P_("Margin on Top"),
|
||||
P_("Pixels of extra space on the top side"),
|
||||
0,
|
||||
G_MAXINT16,
|
||||
0,
|
||||
GTK_PARAM_READWRITE));
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_MARGIN_BOTTOM,
|
||||
g_param_spec_int ("margin-bottom",
|
||||
P_("Margin on Bottom"),
|
||||
P_("Pixels of extra space on the bottom side"),
|
||||
0,
|
||||
G_MAXINT16,
|
||||
0,
|
||||
GTK_PARAM_READWRITE));
|
||||
|
||||
/* Pool for Cell Properties */
|
||||
if (!cell_property_pool)
|
||||
cell_property_pool = g_param_spec_pool_new (FALSE);
|
||||
|
||||
@ -272,6 +339,62 @@ gtk_cell_area_dispose (GObject *object)
|
||||
G_OBJECT_CLASS (gtk_cell_area_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_cell_area_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
GtkCellArea *area = GTK_CELL_AREA (object);
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_MARGIN_LEFT:
|
||||
gtk_cell_area_set_margin_left (area, g_value_get_int (value));
|
||||
break;
|
||||
case PROP_MARGIN_RIGHT:
|
||||
gtk_cell_area_set_margin_right (area, g_value_get_int (value));
|
||||
break;
|
||||
case PROP_MARGIN_TOP:
|
||||
gtk_cell_area_set_margin_top (area, g_value_get_int (value));
|
||||
break;
|
||||
case PROP_MARGIN_BOTTOM:
|
||||
gtk_cell_area_set_margin_bottom (area, g_value_get_int (value));
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_cell_area_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
GtkCellArea *area = GTK_CELL_AREA (object);
|
||||
GtkCellAreaPrivate *priv = area->priv;
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_MARGIN_LEFT:
|
||||
g_value_set_int (value, priv->border.left);
|
||||
break;
|
||||
case PROP_MARGIN_RIGHT:
|
||||
g_value_set_int (value, priv->border.right);
|
||||
break;
|
||||
case PROP_MARGIN_TOP:
|
||||
g_value_set_int (value, priv->border.top);
|
||||
break;
|
||||
case PROP_MARGIN_BOTTOM:
|
||||
g_value_set_int (value, priv->border.bottom);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*************************************************************
|
||||
* GtkCellAreaClass *
|
||||
@ -1143,3 +1266,129 @@ gtk_cell_area_cell_get_property (GtkCellArea *area,
|
||||
}
|
||||
}
|
||||
|
||||
/* Margins */
|
||||
gint
|
||||
gtk_cell_area_get_margin_left (GtkCellArea *area)
|
||||
{
|
||||
g_return_val_if_fail (GTK_IS_CELL_AREA (area), 0);
|
||||
|
||||
return area->priv->border.left;
|
||||
}
|
||||
|
||||
void
|
||||
gtk_cell_area_set_margin_left (GtkCellArea *area,
|
||||
gint margin)
|
||||
{
|
||||
GtkCellAreaPrivate *priv;
|
||||
|
||||
g_return_if_fail (GTK_IS_CELL_AREA (area));
|
||||
|
||||
priv = area->priv;
|
||||
|
||||
if (priv->border.left != margin)
|
||||
{
|
||||
priv->border.left = margin;
|
||||
|
||||
g_object_notify (G_OBJECT (area), "margin-left");
|
||||
}
|
||||
}
|
||||
|
||||
gint
|
||||
gtk_cell_area_get_margin_right (GtkCellArea *area)
|
||||
{
|
||||
g_return_val_if_fail (GTK_IS_CELL_AREA (area), 0);
|
||||
|
||||
return area->priv->border.right;
|
||||
}
|
||||
|
||||
void
|
||||
gtk_cell_area_set_margin_right (GtkCellArea *area,
|
||||
gint margin)
|
||||
{
|
||||
GtkCellAreaPrivate *priv;
|
||||
|
||||
g_return_if_fail (GTK_IS_CELL_AREA (area));
|
||||
|
||||
priv = area->priv;
|
||||
|
||||
if (priv->border.right != margin)
|
||||
{
|
||||
priv->border.right = margin;
|
||||
|
||||
g_object_notify (G_OBJECT (area), "margin-right");
|
||||
}
|
||||
}
|
||||
|
||||
gint
|
||||
gtk_cell_area_get_margin_top (GtkCellArea *area)
|
||||
{
|
||||
g_return_val_if_fail (GTK_IS_CELL_AREA (area), 0);
|
||||
|
||||
return area->priv->border.top;
|
||||
}
|
||||
|
||||
void
|
||||
gtk_cell_area_set_margin_top (GtkCellArea *area,
|
||||
gint margin)
|
||||
{
|
||||
GtkCellAreaPrivate *priv;
|
||||
|
||||
g_return_if_fail (GTK_IS_CELL_AREA (area));
|
||||
|
||||
priv = area->priv;
|
||||
|
||||
if (priv->border.top != margin)
|
||||
{
|
||||
priv->border.top = margin;
|
||||
|
||||
g_object_notify (G_OBJECT (area), "margin-top");
|
||||
}
|
||||
}
|
||||
|
||||
gint
|
||||
gtk_cell_area_get_margin_bottom (GtkCellArea *area)
|
||||
{
|
||||
g_return_val_if_fail (GTK_IS_CELL_AREA (area), 0);
|
||||
|
||||
return area->priv->border.bottom;
|
||||
}
|
||||
|
||||
void
|
||||
gtk_cell_area_set_margin_bottom (GtkCellArea *area,
|
||||
gint margin)
|
||||
{
|
||||
GtkCellAreaPrivate *priv;
|
||||
|
||||
g_return_if_fail (GTK_IS_CELL_AREA (area));
|
||||
|
||||
priv = area->priv;
|
||||
|
||||
if (priv->border.bottom != margin)
|
||||
{
|
||||
priv->border.bottom = margin;
|
||||
|
||||
g_object_notify (G_OBJECT (area), "margin-bottom");
|
||||
}
|
||||
}
|
||||
|
||||
/* For convenience in area implementations */
|
||||
void
|
||||
gtk_cell_area_inner_area (GtkCellArea *area,
|
||||
GdkRectangle *background_area,
|
||||
GdkRectangle *cell_area)
|
||||
{
|
||||
GtkCellAreaPrivate *priv;
|
||||
|
||||
g_return_if_fail (GTK_IS_CELL_AREA (area));
|
||||
g_return_if_fail (background_area != NULL);
|
||||
g_return_if_fail (cell_area != NULL);
|
||||
|
||||
priv = area->priv;
|
||||
|
||||
*cell_area = *background_area;
|
||||
|
||||
cell_area->x += priv->border.left;
|
||||
cell_area->width -= (priv->border.left + priv->border.right);
|
||||
cell_area->y += priv->border.top;
|
||||
cell_area->height -= (priv->border.top + priv->border.bottom);
|
||||
}
|
||||
|
@ -238,6 +238,24 @@ void gtk_cell_area_cell_get_property (GtkCellArea
|
||||
#define GTK_CELL_AREA_WARN_INVALID_CHILD_PROPERTY_ID(object, property_id, pspec) \
|
||||
G_OBJECT_WARN_INVALID_PSPEC ((object), "cell property id", (property_id), (pspec))
|
||||
|
||||
/* Margins */
|
||||
gint gtk_cell_area_get_margin_left (GtkCellArea *area);
|
||||
void gtk_cell_area_set_margin_left (GtkCellArea *area,
|
||||
gint margin);
|
||||
gint gtk_cell_area_get_margin_right (GtkCellArea *area);
|
||||
void gtk_cell_area_set_margin_right (GtkCellArea *area,
|
||||
gint margin);
|
||||
gint gtk_cell_area_get_margin_top (GtkCellArea *area);
|
||||
void gtk_cell_area_set_margin_top (GtkCellArea *area,
|
||||
gint margin);
|
||||
gint gtk_cell_area_get_margin_bottom (GtkCellArea *area);
|
||||
void gtk_cell_area_set_margin_bottom (GtkCellArea *area,
|
||||
gint margin);
|
||||
|
||||
/* For convenience in area implementations */
|
||||
void gtk_cell_area_inner_area (GtkCellArea *area,
|
||||
GdkRectangle *background_area,
|
||||
GdkRectangle *cell_area);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user