forked from AuroraMiddleware/gtk
Simplify the guide implementation
Store the values and constraints in arrays, to facilitate treating them uniformly.
This commit is contained in:
parent
651adbfb39
commit
4f4ba8c4f6
@ -90,21 +90,25 @@ struct _GtkConstraintLayoutChild
|
|||||||
ConstraintSolverChildData data;
|
ConstraintSolverChildData data;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
GUIDE_MIN_WIDTH,
|
||||||
|
GUIDE_MIN_HEIGHT,
|
||||||
|
GUIDE_NAT_WIDTH,
|
||||||
|
GUIDE_NAT_HEIGHT,
|
||||||
|
LAST_GUIDE_VALUE
|
||||||
|
} GuideValue;
|
||||||
|
|
||||||
struct _GtkConstraintGuide
|
struct _GtkConstraintGuide
|
||||||
{
|
{
|
||||||
GObject parent_instance;
|
GObject parent_instance;
|
||||||
|
|
||||||
int min_width;
|
int values[LAST_GUIDE_VALUE];
|
||||||
int min_height;
|
|
||||||
int nat_width;
|
|
||||||
int nat_height;
|
|
||||||
|
|
||||||
GtkConstraintLayout *layout;
|
GtkConstraintLayout *layout;
|
||||||
|
|
||||||
ConstraintSolverChildData data;
|
ConstraintSolverChildData data;
|
||||||
|
|
||||||
GtkConstraintRef *width_constraint[2];
|
GtkConstraintRef *constraints[LAST_GUIDE_VALUE];
|
||||||
GtkConstraintRef *height_constraint[2];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GtkConstraintLayout
|
struct _GtkConstraintLayout
|
||||||
@ -1059,10 +1063,8 @@ gtk_constraint_layout_allocate (GtkLayoutManager *manager,
|
|||||||
gtk_constraint_solver_remove_constraint (solver, stay_l);
|
gtk_constraint_solver_remove_constraint (solver, stay_l);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void update_min_width (GtkConstraintGuide *guide);
|
static void gtk_constraint_guide_update (GtkConstraintGuide *guide,
|
||||||
static void update_nat_width (GtkConstraintGuide *guide);
|
GuideValue index);
|
||||||
static void update_min_height (GtkConstraintGuide *guide);
|
|
||||||
static void update_nat_height (GtkConstraintGuide *guide);
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtk_constraint_layout_root (GtkLayoutManager *manager)
|
gtk_constraint_layout_root (GtkLayoutManager *manager)
|
||||||
@ -1090,10 +1092,10 @@ gtk_constraint_layout_root (GtkLayoutManager *manager)
|
|||||||
while (g_hash_table_iter_next (&iter, &key, NULL))
|
while (g_hash_table_iter_next (&iter, &key, NULL))
|
||||||
{
|
{
|
||||||
GtkConstraintGuide *guide = key;
|
GtkConstraintGuide *guide = key;
|
||||||
update_min_width (guide);
|
gtk_constraint_guide_update (guide, GUIDE_MIN_WIDTH);
|
||||||
update_nat_width (guide);
|
gtk_constraint_guide_update (guide, GUIDE_MIN_HEIGHT);
|
||||||
update_min_height (guide);
|
gtk_constraint_guide_update (guide, GUIDE_NAT_WIDTH);
|
||||||
update_nat_height (guide);
|
gtk_constraint_guide_update (guide, GUIDE_NAT_HEIGHT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1258,14 +1260,14 @@ struct _GtkConstraintGuideClass {
|
|||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
PROP_MIN_WIDTH = 1,
|
GUIDE_PROP_MIN_WIDTH = 1,
|
||||||
PROP_MIN_HEIGHT,
|
GUIDE_PROP_MIN_HEIGHT,
|
||||||
PROP_NAT_WIDTH,
|
GUIDE_PROP_NAT_WIDTH,
|
||||||
PROP_NAT_HEIGHT,
|
GUIDE_PROP_NAT_HEIGHT,
|
||||||
LAST_PROP
|
LAST_GUIDE_PROP
|
||||||
};
|
};
|
||||||
|
|
||||||
static GParamSpec *guide_props[LAST_PROP];
|
static GParamSpec *guide_props[LAST_GUIDE_PROP];
|
||||||
|
|
||||||
G_DEFINE_TYPE_WITH_CODE (GtkConstraintGuide, gtk_constraint_guide, G_TYPE_OBJECT,
|
G_DEFINE_TYPE_WITH_CODE (GtkConstraintGuide, gtk_constraint_guide, G_TYPE_OBJECT,
|
||||||
G_IMPLEMENT_INTERFACE (GTK_TYPE_CONSTRAINT_TARGET,
|
G_IMPLEMENT_INTERFACE (GTK_TYPE_CONSTRAINT_TARGET,
|
||||||
@ -1281,10 +1283,29 @@ gtk_constraint_guide_init (GtkConstraintGuide *guide)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
update_min_width (GtkConstraintGuide *guide)
|
gtk_constraint_guide_update (GtkConstraintGuide *guide,
|
||||||
|
GuideValue index)
|
||||||
{
|
{
|
||||||
GtkConstraintSolver *solver;
|
GtkConstraintSolver *solver;
|
||||||
GtkConstraintVariable *var;
|
GtkConstraintVariable *var;
|
||||||
|
int attr[LAST_GUIDE_VALUE] = {
|
||||||
|
GTK_CONSTRAINT_ATTRIBUTE_WIDTH,
|
||||||
|
GTK_CONSTRAINT_ATTRIBUTE_HEIGHT,
|
||||||
|
GTK_CONSTRAINT_ATTRIBUTE_WIDTH,
|
||||||
|
GTK_CONSTRAINT_ATTRIBUTE_HEIGHT,
|
||||||
|
};
|
||||||
|
int relation[LAST_GUIDE_VALUE] = {
|
||||||
|
GTK_CONSTRAINT_RELATION_GE,
|
||||||
|
GTK_CONSTRAINT_RELATION_GE,
|
||||||
|
GTK_CONSTRAINT_RELATION_EQ,
|
||||||
|
GTK_CONSTRAINT_RELATION_EQ,
|
||||||
|
};
|
||||||
|
double weight[LAST_GUIDE_VALUE] = {
|
||||||
|
GTK_CONSTRAINT_WEIGHT_REQUIRED,
|
||||||
|
GTK_CONSTRAINT_WEIGHT_REQUIRED,
|
||||||
|
GTK_CONSTRAINT_WEIGHT_MEDIUM,
|
||||||
|
GTK_CONSTRAINT_WEIGHT_MEDIUM,
|
||||||
|
};
|
||||||
|
|
||||||
if (!guide->layout)
|
if (!guide->layout)
|
||||||
return;
|
return;
|
||||||
@ -1294,149 +1315,16 @@ update_min_width (GtkConstraintGuide *guide)
|
|||||||
if (!solver)
|
if (!solver)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (guide->width_constraint[0] != NULL)
|
if (guide->constraints[index] != NULL)
|
||||||
gtk_constraint_solver_remove_constraint (solver, guide->width_constraint[0]);
|
gtk_constraint_solver_remove_constraint (solver, guide->constraints[index]);
|
||||||
|
|
||||||
var = get_guide_attribute (guide->layout, guide, solver, GTK_CONSTRAINT_ATTRIBUTE_WIDTH);
|
var = get_guide_attribute (guide->layout, guide, solver, attr[index]);
|
||||||
guide->width_constraint[0] =
|
guide->constraints[index] =
|
||||||
gtk_constraint_solver_add_constraint (solver,
|
gtk_constraint_solver_add_constraint (solver,
|
||||||
var,
|
var,
|
||||||
GTK_CONSTRAINT_RELATION_GE,
|
relation[index],
|
||||||
gtk_constraint_expression_new (guide->min_width),
|
gtk_constraint_expression_new (guide->values[index]),
|
||||||
GTK_CONSTRAINT_WEIGHT_REQUIRED);
|
weight[index]);
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
update_min_height (GtkConstraintGuide *guide)
|
|
||||||
{
|
|
||||||
GtkConstraintSolver *solver;
|
|
||||||
GtkConstraintVariable *var;
|
|
||||||
|
|
||||||
if (!guide->layout)
|
|
||||||
return;
|
|
||||||
|
|
||||||
solver = guide->layout->solver;
|
|
||||||
|
|
||||||
if (!solver)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (guide->height_constraint[0] != NULL)
|
|
||||||
gtk_constraint_solver_remove_constraint (solver, guide->height_constraint[0]);
|
|
||||||
|
|
||||||
var = get_guide_attribute (guide->layout, guide, solver, GTK_CONSTRAINT_ATTRIBUTE_HEIGHT);
|
|
||||||
guide->height_constraint[0] =
|
|
||||||
gtk_constraint_solver_add_constraint (solver,
|
|
||||||
var,
|
|
||||||
GTK_CONSTRAINT_RELATION_GE,
|
|
||||||
gtk_constraint_expression_new (guide->min_height),
|
|
||||||
GTK_CONSTRAINT_WEIGHT_REQUIRED);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
update_nat_width (GtkConstraintGuide *guide)
|
|
||||||
{
|
|
||||||
GtkConstraintSolver *solver;
|
|
||||||
GtkConstraintVariable *var;
|
|
||||||
|
|
||||||
if (!guide->layout)
|
|
||||||
return;
|
|
||||||
|
|
||||||
solver = guide->layout->solver;
|
|
||||||
|
|
||||||
if (!solver)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (guide->width_constraint[1] != NULL)
|
|
||||||
gtk_constraint_solver_remove_constraint (solver, guide->width_constraint[1]);
|
|
||||||
|
|
||||||
var = get_guide_attribute (guide->layout, guide, solver, GTK_CONSTRAINT_ATTRIBUTE_WIDTH);
|
|
||||||
guide->width_constraint[1] =
|
|
||||||
gtk_constraint_solver_add_constraint (solver,
|
|
||||||
var,
|
|
||||||
GTK_CONSTRAINT_RELATION_EQ,
|
|
||||||
gtk_constraint_expression_new (guide->nat_width),
|
|
||||||
GTK_CONSTRAINT_WEIGHT_MEDIUM);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
update_nat_height (GtkConstraintGuide *guide)
|
|
||||||
{
|
|
||||||
GtkConstraintSolver *solver;
|
|
||||||
GtkConstraintVariable *var;
|
|
||||||
|
|
||||||
if (!guide->layout)
|
|
||||||
return;
|
|
||||||
|
|
||||||
solver = guide->layout->solver;
|
|
||||||
|
|
||||||
if (!solver)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (guide->height_constraint[1] != NULL)
|
|
||||||
gtk_constraint_solver_remove_constraint (solver, guide->height_constraint[1]);
|
|
||||||
|
|
||||||
var = get_guide_attribute (guide->layout, guide, solver, GTK_CONSTRAINT_ATTRIBUTE_HEIGHT);
|
|
||||||
guide->height_constraint[1] =
|
|
||||||
gtk_constraint_solver_add_constraint (solver,
|
|
||||||
var,
|
|
||||||
GTK_CONSTRAINT_RELATION_EQ,
|
|
||||||
gtk_constraint_expression_new (guide->nat_height),
|
|
||||||
GTK_CONSTRAINT_WEIGHT_MEDIUM);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
set_min_width (GtkConstraintGuide *guide,
|
|
||||||
int min_width)
|
|
||||||
{
|
|
||||||
if (guide->min_width == min_width)
|
|
||||||
return;
|
|
||||||
|
|
||||||
guide->min_width = min_width;
|
|
||||||
g_object_notify_by_pspec (G_OBJECT (guide),
|
|
||||||
guide_props[PROP_MIN_WIDTH]);
|
|
||||||
|
|
||||||
update_min_width (guide);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
set_min_height (GtkConstraintGuide *guide,
|
|
||||||
int min_height)
|
|
||||||
{
|
|
||||||
if (guide->min_height == min_height)
|
|
||||||
return;
|
|
||||||
|
|
||||||
guide->min_height = min_height;
|
|
||||||
g_object_notify_by_pspec (G_OBJECT (guide),
|
|
||||||
guide_props[PROP_MIN_HEIGHT]);
|
|
||||||
|
|
||||||
update_min_height (guide);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
set_nat_width (GtkConstraintGuide *guide,
|
|
||||||
int nat_width)
|
|
||||||
{
|
|
||||||
if (guide->nat_width == nat_width)
|
|
||||||
return;
|
|
||||||
|
|
||||||
guide->nat_width = nat_width;
|
|
||||||
g_object_notify_by_pspec (G_OBJECT (guide),
|
|
||||||
guide_props[PROP_NAT_WIDTH]);
|
|
||||||
|
|
||||||
update_nat_width (guide);
|
|
||||||
}
|
|
||||||
static void
|
|
||||||
set_nat_height (GtkConstraintGuide *guide,
|
|
||||||
int nat_height)
|
|
||||||
{
|
|
||||||
if (guide->nat_height == nat_height)
|
|
||||||
return;
|
|
||||||
|
|
||||||
guide->nat_height = nat_height;
|
|
||||||
g_object_notify_by_pspec (G_OBJECT (guide),
|
|
||||||
guide_props[PROP_NAT_HEIGHT]);
|
|
||||||
|
|
||||||
update_nat_height (guide);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -1446,23 +1334,23 @@ gtk_constraint_guide_set_property (GObject *gobject,
|
|||||||
GParamSpec *pspec)
|
GParamSpec *pspec)
|
||||||
{
|
{
|
||||||
GtkConstraintGuide *self = GTK_CONSTRAINT_GUIDE (gobject);
|
GtkConstraintGuide *self = GTK_CONSTRAINT_GUIDE (gobject);
|
||||||
|
int val;
|
||||||
|
GuideValue index;
|
||||||
|
|
||||||
switch (prop_id)
|
switch (prop_id)
|
||||||
{
|
{
|
||||||
case PROP_MIN_WIDTH:
|
case GUIDE_PROP_MIN_WIDTH:
|
||||||
set_min_width (self, g_value_get_int (value));
|
case GUIDE_PROP_MIN_HEIGHT:
|
||||||
break;
|
case GUIDE_PROP_NAT_WIDTH:
|
||||||
|
case GUIDE_PROP_NAT_HEIGHT:
|
||||||
case PROP_MIN_HEIGHT:
|
val = g_value_get_int (value);
|
||||||
set_min_height (self, g_value_get_int (value));
|
index = prop_id - 1;
|
||||||
break;
|
if (self->values[index] != val)
|
||||||
|
{
|
||||||
case PROP_NAT_WIDTH:
|
self->values[index] = val;
|
||||||
set_nat_width (self, g_value_get_int (value));
|
g_object_notify_by_pspec (gobject, pspec);
|
||||||
break;
|
gtk_constraint_guide_update (self, index);
|
||||||
|
}
|
||||||
case PROP_NAT_HEIGHT:
|
|
||||||
set_nat_height (self, g_value_get_int (value));
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -1481,20 +1369,11 @@ gtk_constraint_guide_get_property (GObject *gobject,
|
|||||||
|
|
||||||
switch (prop_id)
|
switch (prop_id)
|
||||||
{
|
{
|
||||||
case PROP_MIN_WIDTH:
|
case GUIDE_PROP_MIN_WIDTH:
|
||||||
g_value_set_int (value, self->min_width);
|
case GUIDE_PROP_MIN_HEIGHT:
|
||||||
break;
|
case GUIDE_PROP_NAT_WIDTH:
|
||||||
|
case GUIDE_PROP_NAT_HEIGHT:
|
||||||
case PROP_MIN_HEIGHT:
|
g_value_set_int (value, self->values[prop_id - 1]);
|
||||||
g_value_set_int (value, self->min_height);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PROP_NAT_WIDTH:
|
|
||||||
g_value_set_int (value, self->nat_width);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PROP_NAT_HEIGHT:
|
|
||||||
g_value_set_int (value, self->nat_height);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -1527,28 +1406,28 @@ gtk_constraint_guide_class_init (GtkConstraintGuideClass *class)
|
|||||||
object_class->set_property = gtk_constraint_guide_set_property;
|
object_class->set_property = gtk_constraint_guide_set_property;
|
||||||
object_class->get_property = gtk_constraint_guide_get_property;
|
object_class->get_property = gtk_constraint_guide_get_property;
|
||||||
|
|
||||||
guide_props[PROP_MIN_WIDTH] =
|
guide_props[GUIDE_PROP_MIN_WIDTH] =
|
||||||
g_param_spec_int ("min-width",
|
g_param_spec_int ("min-width",
|
||||||
"Minimum width",
|
"Minimum width",
|
||||||
"Minimum width",
|
"Minimum width",
|
||||||
0, G_MAXINT, 0,
|
0, G_MAXINT, 0,
|
||||||
G_PARAM_READWRITE|
|
G_PARAM_READWRITE|
|
||||||
G_PARAM_EXPLICIT_NOTIFY);
|
G_PARAM_EXPLICIT_NOTIFY);
|
||||||
guide_props[PROP_MIN_HEIGHT] =
|
guide_props[GUIDE_PROP_MIN_HEIGHT] =
|
||||||
g_param_spec_int ("min-height",
|
g_param_spec_int ("min-height",
|
||||||
"Minimum height",
|
"Minimum height",
|
||||||
"Minimum height",
|
"Minimum height",
|
||||||
0, G_MAXINT, 0,
|
0, G_MAXINT, 0,
|
||||||
G_PARAM_READWRITE|
|
G_PARAM_READWRITE|
|
||||||
G_PARAM_EXPLICIT_NOTIFY);
|
G_PARAM_EXPLICIT_NOTIFY);
|
||||||
guide_props[PROP_NAT_WIDTH] =
|
guide_props[GUIDE_PROP_NAT_WIDTH] =
|
||||||
g_param_spec_int ("nat-width",
|
g_param_spec_int ("nat-width",
|
||||||
"Natural width",
|
"Natural width",
|
||||||
"Natural width",
|
"Natural width",
|
||||||
0, G_MAXINT, 0,
|
0, G_MAXINT, 0,
|
||||||
G_PARAM_READWRITE|
|
G_PARAM_READWRITE|
|
||||||
G_PARAM_EXPLICIT_NOTIFY);
|
G_PARAM_EXPLICIT_NOTIFY);
|
||||||
guide_props[PROP_NAT_HEIGHT] =
|
guide_props[GUIDE_PROP_NAT_HEIGHT] =
|
||||||
g_param_spec_int ("nat-height",
|
g_param_spec_int ("nat-height",
|
||||||
"Natural height",
|
"Natural height",
|
||||||
"Natural height",
|
"Natural height",
|
||||||
@ -1556,7 +1435,7 @@ gtk_constraint_guide_class_init (GtkConstraintGuideClass *class)
|
|||||||
G_PARAM_READWRITE|
|
G_PARAM_READWRITE|
|
||||||
G_PARAM_EXPLICIT_NOTIFY);
|
G_PARAM_EXPLICIT_NOTIFY);
|
||||||
|
|
||||||
g_object_class_install_properties (object_class, LAST_PROP, guide_props);
|
g_object_class_install_properties (object_class, LAST_GUIDE_PROP, guide_props);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user