app: add gimp_meter_{set,get}_value_active()

... which can be used to individually enable/disable meter values,
while maintaining the rest of their properties, and their samples.

Also, cleanup.
This commit is contained in:
Ell
2017-12-30 13:38:03 -05:00
parent 9569ac951e
commit 354891d22c
2 changed files with 105 additions and 45 deletions

View File

@ -57,11 +57,17 @@ enum
PROP_HISTORY_VISIBLE, PROP_HISTORY_VISIBLE,
PROP_HISTORY_DURATION, PROP_HISTORY_DURATION,
PROP_HISTORY_RESOLUTION, PROP_HISTORY_RESOLUTION,
PROP_LED_VISIBLE, PROP_LED_ACTIVE,
PROP_LED_COLOR PROP_LED_COLOR
}; };
typedef struct
{
gboolean active;
GimpRGB color;
} Value;
struct _GimpMeterPrivate struct _GimpMeterPrivate
{ {
GMutex mutex; GMutex mutex;
@ -71,11 +77,11 @@ struct _GimpMeterPrivate
gdouble range_min; gdouble range_min;
gdouble range_max; gdouble range_max;
gint n_values; gint n_values;
GimpRGB *colors; Value *values;
gboolean history_visible; gboolean history_visible;
gdouble history_duration; gdouble history_duration;
gdouble history_resolution; gdouble history_resolution;
gboolean led_visible; gboolean led_active;
GimpRGB led_color; GimpRGB led_color;
gdouble *samples; gdouble *samples;
@ -88,6 +94,8 @@ struct _GimpMeterPrivate
}; };
/* local function prototypes */
static void gimp_meter_dispose (GObject *object); static void gimp_meter_dispose (GObject *object);
static void gimp_meter_finalize (GObject *object); static void gimp_meter_finalize (GObject *object);
static void gimp_meter_set_property (GObject *object, static void gimp_meter_set_property (GObject *object,
@ -194,8 +202,8 @@ gimp_meter_class_init (GimpMeterClass *klass)
G_PARAM_CONSTRUCT)); G_PARAM_CONSTRUCT));
g_object_class_install_property (object_class, PROP_LED_VISIBLE, g_object_class_install_property (object_class, PROP_LED_ACTIVE,
g_param_spec_boolean ("led-visible", g_param_spec_boolean ("led-active",
NULL, NULL, NULL, NULL,
FALSE, FALSE,
GIMP_PARAM_READWRITE | GIMP_PARAM_READWRITE |
@ -236,7 +244,7 @@ gimp_meter_dispose (GObject *object)
{ {
GimpMeter *meter = GIMP_METER (object); GimpMeter *meter = GIMP_METER (object);
g_clear_pointer (&meter->priv->colors, g_free); g_clear_pointer (&meter->priv->values, g_free);
g_clear_pointer (&meter->priv->samples, g_free); g_clear_pointer (&meter->priv->samples, g_free);
g_clear_pointer (&meter->priv->uniform_sample, g_free); g_clear_pointer (&meter->priv->uniform_sample, g_free);
@ -305,8 +313,8 @@ gimp_meter_set_property (GObject *object,
gimp_meter_set_history_resolution (meter, g_value_get_double (value)); gimp_meter_set_history_resolution (meter, g_value_get_double (value));
break; break;
case PROP_LED_VISIBLE: case PROP_LED_ACTIVE:
gimp_meter_set_led_visible (meter, g_value_get_boolean (value)); gimp_meter_set_led_active (meter, g_value_get_boolean (value));
break; break;
case PROP_LED_COLOR: case PROP_LED_COLOR:
@ -361,8 +369,8 @@ gimp_meter_get_property (GObject *object,
g_value_set_int (value, gimp_meter_get_history_resolution (meter)); g_value_set_int (value, gimp_meter_get_history_resolution (meter));
break; break;
case PROP_LED_VISIBLE: case PROP_LED_ACTIVE:
g_value_set_boolean (value, gimp_meter_get_led_visible (meter)); g_value_set_boolean (value, gimp_meter_get_led_active (meter));
break; break;
case PROP_LED_COLOR: case PROP_LED_COLOR:
@ -463,7 +471,7 @@ gimp_meter_expose_event (GtkWidget *widget,
cairo_save (cr); cairo_save (cr);
/* paint led */ /* paint led */
if (meter->priv->led_visible) if (meter->priv->led_active)
{ {
cairo_arc (cr, cairo_arc (cr,
0.0, 0.0, 0.0, 0.0,
@ -497,7 +505,10 @@ gimp_meter_expose_event (GtkWidget *widget,
{ {
gdouble v = VALUE (0, i); gdouble v = VALUE (0, i);
gimp_cairo_set_source_rgba (cr, &meter->priv->colors[i]); if (! meter->priv->values[i].active)
continue;
gimp_cairo_set_source_rgba (cr, &meter->priv->values[i].color);
cairo_move_to (cr, 0.0, 0.0); cairo_move_to (cr, 0.0, 0.0);
cairo_arc (cr, cairo_arc (cr,
0.0, 0.0, 0.0, 0.0,
@ -539,7 +550,10 @@ gimp_meter_expose_event (GtkWidget *widget,
a2 = -asin (0.50 / 0.6); a2 = -asin (0.50 / 0.6);
/* clip to history interior */ /* clip to history interior */
cairo_arc_negative (cr, 0.0, 0.0, 0.6 * size, a1, a2); cairo_arc_negative (cr,
0.0, 0.0,
0.6 * size,
a1, a2);
cairo_line_to (cr, cairo_line_to (cr,
allocation.width - BORDER_WIDTH - 0.5 * size, allocation.width - BORDER_WIDTH - 0.5 * size,
-0.50 * size); -0.50 * size);
@ -593,7 +607,10 @@ gimp_meter_expose_event (GtkWidget *widget,
gdouble c[4]; gdouble c[4];
gdouble x; gdouble x;
gimp_cairo_set_source_rgba (cr, &meter->priv->colors[i]); if (! meter->priv->values[i].active)
continue;
gimp_cairo_set_source_rgba (cr, &meter->priv->values[i].color);
cairo_move_to (cr, 0.0, 0.0); cairo_move_to (cr, 0.0, 0.0);
for (j = 1; j < meter->priv->n_samples - 2; j++) for (j = 1; j < meter->priv->n_samples - 2; j++)
@ -661,7 +678,10 @@ gimp_meter_expose_event (GtkWidget *widget,
cairo_restore (cr); cairo_restore (cr);
/* paint history border */ /* paint history border */
cairo_arc_negative (cr, 0.0, 0.0, 0.6 * size, a1, a2); cairo_arc_negative (cr,
0.0, 0.0,
0.6 * size,
a1, a2);
cairo_line_to (cr, cairo_line_to (cr,
allocation.width - BORDER_WIDTH - 0.5 * size, allocation.width - BORDER_WIDTH - 0.5 * size,
-0.50 * size); -0.50 * size);
@ -909,12 +929,13 @@ gimp_meter_set_n_values (GimpMeter *meter,
{ {
g_mutex_lock (&meter->priv->mutex); g_mutex_lock (&meter->priv->mutex);
meter->priv->colors = g_renew (GimpRGB, meter->priv->colors, n_values); meter->priv->values = g_renew (Value, meter->priv->values, n_values);
if (n_values > meter->priv->n_values) if (n_values > meter->priv->n_values)
{ {
memset (meter->priv->colors, gegl_memset_pattern (meter->priv->values,
0, (n_values - meter->priv->n_values) * sizeof (GimpRGB)); &(Value) { .active = TRUE }, sizeof (Value),
n_values - meter->priv->n_values);
} }
meter->priv->n_values = n_values; meter->priv->n_values = n_values;
@ -938,27 +959,57 @@ gimp_meter_get_n_values (GimpMeter *meter)
} }
void void
gimp_meter_set_color (GimpMeter *meter, gimp_meter_set_value_active (GimpMeter *meter,
gint i, gint value,
gboolean active)
{
g_return_if_fail (GIMP_IS_METER (meter));
g_return_if_fail (value >= 0 && value < meter->priv->n_values);
if (active != meter->priv->values[value].active)
{
meter->priv->values[value].active = active;
gtk_widget_queue_draw (GTK_WIDGET (meter));
}
}
gboolean
gimp_meter_get_value_active (GimpMeter *meter,
gint value)
{
g_return_val_if_fail (GIMP_IS_METER (meter), FALSE);
g_return_val_if_fail (value >= 0 && value < meter->priv->n_values, FALSE);
return meter->priv->values[value].active;
}
void
gimp_meter_set_value_color (GimpMeter *meter,
gint value,
const GimpRGB *color) const GimpRGB *color)
{ {
g_return_if_fail (GIMP_IS_METER (meter)); g_return_if_fail (GIMP_IS_METER (meter));
g_return_if_fail (i >= 0 && i < meter->priv->n_values); g_return_if_fail (value >= 0 && value < meter->priv->n_values);
g_return_if_fail (color != NULL); g_return_if_fail (color != NULL);
meter->priv->colors[i] = *color; if (memcmp (color, &meter->priv->values[value].color, sizeof (GimpRGB)))
{
meter->priv->values[value].color = *color;
gtk_widget_queue_draw (GTK_WIDGET (meter)); gtk_widget_queue_draw (GTK_WIDGET (meter));
}
} }
const GimpRGB * const GimpRGB *
gimp_meter_get_color (GimpMeter *meter, gimp_meter_get_value_color (GimpMeter *meter,
gint i) gint value)
{ {
g_return_val_if_fail (GIMP_IS_METER (meter), NULL); g_return_val_if_fail (GIMP_IS_METER (meter), NULL);
g_return_val_if_fail (i >= 0 && i < meter->priv->n_values, NULL); g_return_val_if_fail (value >= 0 && value < meter->priv->n_values, NULL);
return &meter->priv->colors[i]; return &meter->priv->values[value].color;
} }
void void
@ -1074,27 +1125,27 @@ gimp_meter_add_sample (GimpMeter *meter,
} }
void void
gimp_meter_set_led_visible (GimpMeter *meter, gimp_meter_set_led_active (GimpMeter *meter,
gboolean visible) gboolean active)
{ {
g_return_if_fail (GIMP_IS_METER (meter)); g_return_if_fail (GIMP_IS_METER (meter));
if (visible != meter->priv->led_visible) if (active != meter->priv->led_active)
{ {
meter->priv->led_visible = visible; meter->priv->led_active = active;
gtk_widget_queue_draw (GTK_WIDGET (meter)); gtk_widget_queue_draw (GTK_WIDGET (meter));
g_object_notify (G_OBJECT (meter), "led-visible"); g_object_notify (G_OBJECT (meter), "led-active");
} }
} }
gboolean gboolean
gimp_meter_get_led_visible (GimpMeter *meter) gimp_meter_get_led_active (GimpMeter *meter)
{ {
g_return_val_if_fail (GIMP_IS_METER (meter), FALSE); g_return_val_if_fail (GIMP_IS_METER (meter), FALSE);
return meter->priv->led_visible; return meter->priv->led_active;
} }
void void
@ -1104,11 +1155,14 @@ gimp_meter_set_led_color (GimpMeter *meter,
g_return_if_fail (GIMP_IS_METER (meter)); g_return_if_fail (GIMP_IS_METER (meter));
g_return_if_fail (color != NULL); g_return_if_fail (color != NULL);
if (memcmp (color, &meter->priv->led_color, sizeof (GimpRGB)))
{
meter->priv->led_color = *color; meter->priv->led_color = *color;
gtk_widget_queue_draw (GTK_WIDGET (meter)); gtk_widget_queue_draw (GTK_WIDGET (meter));
g_object_notify (G_OBJECT (meter), "led-color"); g_object_notify (G_OBJECT (meter), "led-color");
}
} }
const GimpRGB * const GimpRGB *

View File

@ -68,11 +68,17 @@ void gimp_meter_set_n_values (GimpMeter *meter,
gint n_values); gint n_values);
gint gimp_meter_get_n_values (GimpMeter *meter); gint gimp_meter_get_n_values (GimpMeter *meter);
void gimp_meter_set_color (GimpMeter *meter, void gimp_meter_set_value_active (GimpMeter *meter,
gint i, gint value,
gboolean active);
gboolean gimp_meter_get_value_active (GimpMeter *meter,
gint value);
void gimp_meter_set_value_color (GimpMeter *meter,
gint value,
const GimpRGB *color); const GimpRGB *color);
const GimpRGB * gimp_meter_get_color (GimpMeter *meter, const GimpRGB * gimp_meter_get_value_color (GimpMeter *meter,
gint i); gint value);
void gimp_meter_set_history_visible (GimpMeter *meter, void gimp_meter_set_history_visible (GimpMeter *meter,
gboolean visible); gboolean visible);
@ -91,9 +97,9 @@ void gimp_meter_clear_history (GimpMeter *meter);
void gimp_meter_add_sample (GimpMeter *meter, void gimp_meter_add_sample (GimpMeter *meter,
const gdouble *sample); const gdouble *sample);
void gimp_meter_set_led_visible (GimpMeter *meter, void gimp_meter_set_led_active (GimpMeter *meter,
gboolean visible); gboolean active);
gboolean gimp_meter_get_led_visible (GimpMeter *meter); gboolean gimp_meter_get_led_active (GimpMeter *meter);
void gimp_meter_set_led_color (GimpMeter *meter, void gimp_meter_set_led_color (GimpMeter *meter,
const GimpRGB *color); const GimpRGB *color);