diff options
author | David Robillard <d@drobilla.net> | 2013-02-03 22:29:15 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2013-02-03 22:29:15 +0000 |
commit | 6ddaa0260c4749aa6c0395000381d7df0bd3feb1 (patch) | |
tree | 00024d5d970317292355b663383b43d151c6757b /src/port.c | |
parent | 39b748a4836d6220922867eae0dd5339792033ab (diff) | |
download | ganv-6ddaa0260c4749aa6c0395000381d7df0bd3feb1.tar.gz ganv-6ddaa0260c4749aa6c0395000381d7df0bd3feb1.tar.bz2 ganv-6ddaa0260c4749aa6c0395000381d7df0bd3feb1.zip |
Port control performance improvements (further improvement for #879).
Only request a redraw, not a full update, where appropriate.
Use a raw double instead of GVariant for port control-changed signal.
git-svn-id: http://svn.drobilla.net/lad/trunk/ganv@5045 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/port.c')
-rw-r--r-- | src/port.c | 90 |
1 files changed, 48 insertions, 42 deletions
@@ -354,7 +354,7 @@ ganv_port_class_init(GanvPortClass* klass) NULL, NULL, NULL, G_TYPE_NONE, 1, - G_TYPE_VARIANT); + G_TYPE_DOUBLE); object_class->destroy = ganv_port_destroy; @@ -497,26 +497,6 @@ ganv_port_set_value_label(GanvPort* port, } } -void -ganv_port_set_control_is_toggle(GanvPort* port, - gboolean is_toggle) -{ - if (port->impl->control) { - port->impl->control->is_toggle = is_toggle; - ganv_port_set_control_value(port, port->impl->control->value); - } -} - -void -ganv_port_set_control_is_integer(GanvPort* port, - gboolean is_integer) -{ - if (port->impl->control) { - port->impl->control->is_integer = is_integer; - ganv_port_set_control_value(port, lrintf(port->impl->control->value)); - } -} - static void ganv_port_update_control_slider(GanvPort* port, float value) @@ -526,6 +506,7 @@ ganv_port_update_control_slider(GanvPort* port, return; } + // Clamp to toggle or integer value if applicable if (impl->control->is_toggle) { if (value != 0.0f) { value = impl->control->max; @@ -536,43 +517,51 @@ ganv_port_update_control_slider(GanvPort* port, value = lrintf(value); } + // Clamp to range if (value < impl->control->min) { - impl->control->min = value; + value = impl->control->min; } if (value > impl->control->max) { - impl->control->max = value; - } - - if (impl->control->max == impl->control->min) { - impl->control->max = impl->control->min + 1.0f; - } - - const int inf = isinf(value); - if (inf == -1) { - value = impl->control->min; - } else if (inf == 1) { value = impl->control->max; } + + if (value == impl->control->value) { + return; // No change, do nothing + } const double w = (value - impl->control->min) / (impl->control->max - impl->control->min) * ganv_box_get_width(&port->box); if (isnan(w)) { - return; + return; // Shouldn't happen, but ignore crazy values } + // Redraw port + impl->control->value = value; ganv_box_set_width(impl->control->rect, MAX(0.0, w - 1.0)); + ganv_box_request_redraw( + GANV_ITEM(port), &GANV_BOX(port)->impl->coords, FALSE); +} - if (impl->control->value != value) { - GVariant* gvar = g_variant_ref_sink(g_variant_new_double(value)); - g_signal_emit(port, port_signals[PORT_VALUE_CHANGED], 0, gvar, NULL); - g_variant_unref(gvar); +void +ganv_port_set_control_is_toggle(GanvPort* port, + gboolean is_toggle) +{ + if (port->impl->control) { + port->impl->control->is_toggle = is_toggle; + ganv_port_update_control_slider(port, port->impl->control->value); } +} - impl->control->value = value; - - ganv_item_request_update(GANV_ITEM(port)); +void +ganv_port_set_control_is_integer(GanvPort* port, + gboolean is_integer) +{ + if (port->impl->control) { + port->impl->control->is_integer = is_integer; + ganv_port_update_control_slider(port, lrintf(port->impl->control->value)); + } } void @@ -585,16 +574,30 @@ ganv_port_set_control_value(GanvPort* port, ganv_port_set_value_label( port, (const char*)((value == 0.0f) ? check_off : check_on)); } - ganv_port_update_control_slider(port, value); } void +ganv_port_set_control_value_internal(GanvPort* port, + float value) +{ + // Update slider + ganv_port_set_control_value(port, value); + + // Fire signal to notify user value has changed + const double dvalue = value; + g_signal_emit(port, port_signals[PORT_VALUE_CHANGED], 0, dvalue, NULL); +} + +void ganv_port_set_control_min(GanvPort* port, float min) { if (port->impl->control) { port->impl->control->min = min; + if (port->impl->control->max < min) { + port->impl->control->max = min; + } ganv_port_update_control_slider(port, port->impl->control->value); } } @@ -605,6 +608,9 @@ ganv_port_set_control_max(GanvPort* port, { if (port->impl->control) { port->impl->control->max = max; + if (port->impl->control->min > max) { + port->impl->control->min = max; + } ganv_port_update_control_slider(port, port->impl->control->value); } } |