Commit 716510cb authored by Ell's avatar Ell

app: allow multiple variables as input to dashboard group-meter LED

When defining a dashboard group, allow specifying multiple
variables as input to the group meter's LED.  The LED is active
when any of the specified variables evaluates to TRUE, and its
color is the combination of the active variable colors.

Remove the swap-busy variable, and use swap-reading and
swap-writing as inputs to the swap group's LED instead, so that the
LED's color indicates whether the swap is currently being read-
from, written-to, or both.
parent b3de0bb7
......@@ -103,8 +103,6 @@ typedef enum
VARIABLE_SWAP_WRITTEN,
VARIABLE_SWAP_WRITING,
VARIABLE_SWAP_BUSY,
#ifdef HAVE_CPU_GROUP
/* cpu */
VARIABLE_CPU_USAGE,
......@@ -199,7 +197,7 @@ struct _GroupInfo
gboolean default_expanded;
gboolean has_meter;
Variable meter_limit;
Variable meter_led;
const Variable *meter_led;
const FieldInfo *fields;
};
......@@ -311,13 +309,6 @@ static void gimp_dashboard_sample_gegl_config (GimpDashboard
Variable variable);
static void gimp_dashboard_sample_gegl_stats (GimpDashboard *dashboard,
Variable variable);
static void gimp_dashboard_sample_variable_or (GimpDashboard *dashboard,
Variable variable);
#if 0
/* avoid "defined but not used" warning. un-#if 0 when needed */
static void gimp_dashboard_sample_variable_and (GimpDashboard *dashboard,
Variable variable);
#endif
static void gimp_dashboard_sample_variable_changed (GimpDashboard *dashboard,
Variable variable);
static void gimp_dashboard_sample_swap_limit (GimpDashboard *dashboard,
......@@ -485,6 +476,7 @@ static const VariableInfo variables[] =
.title = NC_("dashboard-variable", "Reading"),
.description = N_("Whether data is being read from the swap"),
.type = VARIABLE_TYPE_BOOLEAN,
.color = {0.2, 0.4, 1.0, 1.0},
.sample_func = gimp_dashboard_sample_variable_changed,
.data = GINT_TO_POINTER (VARIABLE_SWAP_READ)
},
......@@ -507,26 +499,11 @@ static const VariableInfo variables[] =
.title = NC_("dashboard-variable", "Writing"),
.description = N_("Whether data is being written to the swap"),
.type = VARIABLE_TYPE_BOOLEAN,
.color = {0.8, 0.3, 0.2, 1.0},
.sample_func = gimp_dashboard_sample_variable_changed,
.data = GINT_TO_POINTER (VARIABLE_SWAP_WRITTEN)
},
[VARIABLE_SWAP_BUSY] =
{ .name = "swap-busy",
.title = NC_("dashboard-variable", "Busy"),
.description = N_("Whether data is transferred to or from the swap"),
.type = VARIABLE_TYPE_BOOLEAN,
.color = {0.8, 0.4, 0.4, 1.0},
.sample_func = gimp_dashboard_sample_variable_or,
.data = (const Variable[])
{
VARIABLE_SWAP_READING,
VARIABLE_SWAP_WRITING,
VARIABLE_NONE
}
},
#ifdef HAVE_CPU_GROUP
/* cpu variables */
......@@ -651,7 +628,13 @@ static const GroupInfo groups[] =
.default_expanded = TRUE,
.has_meter = TRUE,
.meter_limit = VARIABLE_SWAP_LIMIT,
.meter_led = VARIABLE_SWAP_BUSY,
.meter_led = (const Variable[])
{
VARIABLE_SWAP_READING,
VARIABLE_SWAP_WRITING,
VARIABLE_NONE
},
.fields = (const FieldInfo[])
{
{ .variable = VARIABLE_SWAP_OCCUPIED,
......@@ -696,7 +679,12 @@ static const GroupInfo groups[] =
.default_active = TRUE,
.default_expanded = FALSE,
.has_meter = TRUE,
.meter_led = VARIABLE_CPU_ACTIVE,
.meter_led = (const Variable[])
{
VARIABLE_CPU_ACTIVE,
VARIABLE_NONE
},
.fields = (const FieldInfo[])
{
{ .variable = VARIABLE_CPU_USAGE,
......@@ -1023,12 +1011,6 @@ gimp_dashboard_init (GimpDashboard *dashboard)
gtk_box_pack_start (GTK_BOX (vbox2), meter, FALSE, FALSE, 0);
gtk_widget_show (meter);
if (group_info->meter_led)
{
gimp_meter_set_led_color (GIMP_METER (meter),
&variables[group_info->meter_led].color);
}
for (field = 0; field < group_data->n_fields; field++)
{
const FieldInfo *field_info = &group_info->fields[field];
......@@ -1677,22 +1659,7 @@ gimp_dashboard_update (GimpDashboard *dashboard)
g_mutex_lock (&priv->mutex);
for (group = FIRST_GROUP; group < N_GROUPS; group++)
{
const GroupInfo *group_info = &groups[group];
GroupData *group_data = &priv->groups[group];
if (group_info->has_meter && group_info->meter_led)
{
gboolean active;
active = gimp_dashboard_variable_to_boolean (dashboard,
group_info->meter_led);
gimp_meter_set_led_active (group_data->meter, active);
}
gimp_dashboard_update_group_values (dashboard, group);
}
gimp_dashboard_update_group_values (dashboard, group);
priv->update_idle_id = 0;
......@@ -1760,66 +1727,6 @@ gimp_dashboard_sample_gegl_stats (GimpDashboard *dashboard,
gimp_dashboard_sample_object (dashboard, G_OBJECT (gegl_stats ()), variable);
}
static void
gimp_dashboard_sample_variable_or (GimpDashboard *dashboard,
Variable variable)
{
GimpDashboardPrivate *priv = dashboard->priv;
const VariableInfo *variable_info = &variables[variable];
VariableData *variable_data = &priv->variables[variable];
const Variable *var;
variable_data->available = TRUE;
variable_data->value.boolean = FALSE;
for (var = variable_info->data; *var; var++)
{
const VariableData *var_data = &priv->variables[*var];
if (! var_data->available)
{
variable_data->available = FALSE;
break;
}
variable_data->value.boolean |= var_data->value.boolean;
}
}
#if 0
/* avoid "defined but not used" warning. un-#if 0 when needed */
static void
gimp_dashboard_sample_variable_and (GimpDashboard *dashboard,
Variable variable)
{
GimpDashboardPrivate *priv = dashboard->priv;
const VariableInfo *variable_info = &variables[variable];
VariableData *variable_data = &priv->variables[variable];
const Variable *var;
variable_data->available = TRUE;
variable_data->value.boolean = TRUE;
for (var = variable_info->data; *var; var++)
{
const VariableData *var_data = &priv->variables[*var];
if (! var_data->available)
{
variable_data->available = FALSE;
break;
}
variable_data->value.boolean &= var_data->value.boolean;
}
}
#endif /* 0 */
static void
gimp_dashboard_sample_variable_changed (GimpDashboard *dashboard,
Variable variable)
......@@ -2623,10 +2530,28 @@ gimp_dashboard_update_group_values (GimpDashboard *dashboard,
if (group_info->meter_led)
{
gimp_meter_set_led_active (
group_data->meter,
gimp_dashboard_variable_to_boolean (dashboard,
group_info->meter_led));
GimpRGB color = {0.0, 0.0, 0.0, 1.0};
gboolean active = FALSE;
const Variable *var;
for (var = group_info->meter_led; *var; var++)
{
if (gimp_dashboard_variable_to_boolean (dashboard, *var))
{
const VariableInfo *variable_info = &variables[*var];
color.r = MAX (color.r, variable_info->color.r);
color.g = MAX (color.g, variable_info->color.g);
color.b = MAX (color.b, variable_info->color.b);
active = TRUE;
}
}
if (active)
gimp_meter_set_led_color (group_data->meter, &color);
gimp_meter_set_led_active (group_data->meter, active);
}
}
......
......@@ -1308,7 +1308,8 @@ gimp_meter_set_led_color (GimpMeter *meter,
{
meter->priv->led_color = *color;
gtk_widget_queue_draw (GTK_WIDGET (meter));
if (meter->priv->led_active)
gtk_widget_queue_draw (GTK_WIDGET (meter));
g_object_notify (G_OBJECT (meter), "led-color");
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment