diff options
Diffstat (limited to 'src/ui/selected-color.cpp')
| -rw-r--r-- | src/ui/selected-color.cpp | 41 |
1 files changed, 32 insertions, 9 deletions
diff --git a/src/ui/selected-color.cpp b/src/ui/selected-color.cpp index dff43649c..0d3505c45 100644 --- a/src/ui/selected-color.cpp +++ b/src/ui/selected-color.cpp @@ -34,6 +34,7 @@ SelectedColor::SelectedColor() , _alpha(1.0) , _held(false) , _virgin(true) + , _updating(false) { } @@ -44,7 +45,7 @@ SelectedColor::~SelectedColor() { void SelectedColor::setColor(SPColor const &color) { - setColorAlpha( color, _alpha, true); + setColorAlpha( color, _alpha); } SPColor SelectedColor::color() const @@ -55,7 +56,7 @@ SPColor SelectedColor::color() const void SelectedColor::setAlpha(gfloat alpha) { g_return_if_fail( ( 0.0 <= alpha ) && ( alpha <= 1.0 ) ); - setColorAlpha( _color, alpha, true); + setColorAlpha( _color, alpha); } gfloat SelectedColor::alpha() const @@ -63,13 +64,29 @@ gfloat SelectedColor::alpha() const return _alpha; } -void SelectedColor::setColorAlpha(SPColor const &color, gfloat alpha, bool emit) +void SelectedColor::setValue(guint32 value) +{ + SPColor color(value); + gfloat alpha = SP_RGBA32_A_F(value); + setColorAlpha(color, alpha); +} + +guint32 SelectedColor::value() const +{ + return color().toRGBA32(_alpha); +} + +void SelectedColor::setColorAlpha(SPColor const &color, gfloat alpha) { #ifdef DUMP_CHANGE_INFO g_message("SelectedColor::setColorAlpha( this=%p, %f, %f, %f, %s, %f, %s) in %s", this, color.v.c[0], color.v.c[1], color.v.c[2], (color.icc?color.icc->colorProfile.c_str():"<null>"), alpha, (emit?"YES":"no"), FOO_NAME(_csel)); #endif g_return_if_fail( ( 0.0 <= alpha ) && ( alpha <= 1.0 ) ); + if (_updating) { + return; + } + #ifdef DUMP_CHANGE_INFO g_message("---- SelectedColor::setColorAlpha virgin:%s !close:%s alpha is:%s in %s", (_virgin?"YES":"no"), @@ -87,13 +104,14 @@ void SelectedColor::setColorAlpha(SPColor const &color, gfloat alpha, bool emit) _color = color; _alpha = alpha; - if (emit) { - if (_held) { - signal_dragged.emit(); - } else { - signal_changed.emit(); - } + _updating = true; + if (_held) { + signal_dragged.emit(); + } else { + signal_changed.emit(); } + _updating = false; + #ifdef DUMP_CHANGE_INFO } else { g_message("++++ SelectedColor::setColorAlpha color:%08x ==> _color:%08X isClose:%s in %s", color.toRGBA32(alpha), _color.toRGBA32(_alpha), @@ -108,11 +126,15 @@ void SelectedColor::colorAlpha(SPColor &color, gfloat &alpha) const { } void SelectedColor::setHeld(bool held) { + if (_updating) { + return; + } bool grabbed = held && !_held; bool released = !held && _held; _held = held; + _updating = true; if (grabbed) { signal_grabbed.emit(); } @@ -121,6 +143,7 @@ void SelectedColor::setHeld(bool held) { signal_released.emit(); signal_changed.emit(); } + _updating = false; } void SelectedColor::preserveICC() { |
