diff options
| author | Tomasz Boczkowski <penginsbacon@gmail.com> | 2015-05-09 12:53:54 +0000 |
|---|---|---|
| committer | Tomasz Boczkowski <penginsbacon@gmail.com> | 2015-05-09 12:53:54 +0000 |
| commit | cd9885ddc7dfbf7769f902dd7ee043892a2c8ee9 (patch) | |
| tree | b85f04d5bca6bce7590685b2b7f019805afcc7ec /src | |
| parent | Using MODE_SOLID_COLOR in paint selector instead of duplicated MODE_COLOR_RGB... (diff) | |
| download | inkscape-cd9885ddc7dfbf7769f902dd7ee043892a2c8ee9.tar.gz inkscape-cd9885ddc7dfbf7769f902dd7ee043892a2c8ee9.zip | |
fixed crash in paint selector when changing from gradient to solid color
(bzr r14059.1.23)
Diffstat (limited to 'src')
| -rw-r--r-- | src/ui/selected-color.cpp | 17 | ||||
| -rw-r--r-- | src/ui/selected-color.h | 2 | ||||
| -rw-r--r-- | src/ui/widget/color-scales.cpp | 11 | ||||
| -rw-r--r-- | src/widgets/paint-selector.cpp | 18 |
4 files changed, 28 insertions, 20 deletions
diff --git a/src/ui/selected-color.cpp b/src/ui/selected-color.cpp index 7652e5acf..6573129d3 100644 --- a/src/ui/selected-color.cpp +++ b/src/ui/selected-color.cpp @@ -72,7 +72,7 @@ guint32 SelectedColor::value() const return color().toRGBA32(_alpha); } -void SelectedColor::setColorAlpha(SPColor const &color, gfloat alpha) +void SelectedColor::setColorAlpha(SPColor const &color, gfloat alpha, bool emit_signal) { #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)); @@ -100,13 +100,16 @@ void SelectedColor::setColorAlpha(SPColor const &color, gfloat alpha) _color = color; _alpha = alpha; - _updating = true; - if (_held) { - signal_dragged.emit(); - } else { - signal_changed.emit(); + if (emit_signal) + { + _updating = true; + if (_held) { + signal_dragged.emit(); + } else { + signal_changed.emit(); + } + _updating = false; } - _updating = false; #ifdef DUMP_CHANGE_INFO } else { diff --git a/src/ui/selected-color.h b/src/ui/selected-color.h index 168099c82..e9e702d43 100644 --- a/src/ui/selected-color.h +++ b/src/ui/selected-color.h @@ -38,7 +38,7 @@ public: void setValue(guint32 value); guint32 value() const; - void setColorAlpha(SPColor const &color, gfloat alpha); + void setColorAlpha(SPColor const &color, gfloat alpha, bool emit_signal = true); void colorAlpha(SPColor &color, gfloat &alpha) const; void setHeld(bool held); diff --git a/src/ui/widget/color-scales.cpp b/src/ui/widget/color-scales.cpp index 5fa5af902..ead636406 100644 --- a/src/ui/widget/color-scales.cpp +++ b/src/ui/widget/color-scales.cpp @@ -376,8 +376,8 @@ void ColorScales::setMode(SPColorScalesMode mode) setScaled(_a[1], rgba[1]); setScaled(_a[2], rgba[2]); setScaled(_a[3], rgba[3]); - _updating = FALSE; _updateSliders(CSC_CHANNELS_ALL); + _updating = FALSE; break; case SP_COLOR_SCALES_MODE_HSV: _setRangeLimit(255.0); @@ -404,8 +404,8 @@ void ColorScales::setMode(SPColorScalesMode mode) setScaled(_a[1], c[1]); setScaled(_a[2], c[2]); setScaled(_a[3], rgba[3]); - _updating = FALSE; _updateSliders(CSC_CHANNELS_ALL); + _updating = FALSE; break; case SP_COLOR_SCALES_MODE_CMYK: _setRangeLimit(100.0); @@ -437,8 +437,8 @@ void ColorScales::setMode(SPColorScalesMode mode) setScaled(_a[3], c[3]); setScaled(_a[4], rgba[3]); - _updating = FALSE; _updateSliders(CSC_CHANNELS_ALL); + _updating = FALSE; break; default: g_warning("file %s: line %d: Illegal color selector mode", __FILE__, __LINE__); @@ -607,11 +607,6 @@ void ColorScales::_updateSliders(guint channels) break; } - // Force the internal color to be updated - if (!_updating) { - _recalcColor(); - } - #ifdef SPCS_PREVIEW rgba = sp_color_scales_get_rgba32(cs); sp_color_preview_set_rgba32(SP_COLOR_PREVIEW(_p), rgba); diff --git a/src/widgets/paint-selector.cpp b/src/widgets/paint-selector.cpp index 8dd309260..f9a537f41 100644 --- a/src/widgets/paint-selector.cpp +++ b/src/widgets/paint-selector.cpp @@ -657,7 +657,12 @@ void SPPaintSelector::onSelectedColorChanged() { if (updating_color) { return; } - g_signal_emit(G_OBJECT(this), psel_signals[CHANGED], 0); + + if (mode == MODE_SOLID_COLOR) { + g_signal_emit(G_OBJECT(this), psel_signals[CHANGED], 0); + } else { + g_warning("SPPaintSelector::onSelectedColorChanged(): selected color changed while not in color selection mode"); + } } static void sp_paint_selector_set_mode_color(SPPaintSelector *psel, SPPaintSelector::Mode /*mode*/) @@ -670,9 +675,14 @@ static void sp_paint_selector_set_mode_color(SPPaintSelector *psel, SPPaintSelec SPGradientSelector *gsel = getGradientFromData(psel); if (gsel) { SPGradient *gradient = gsel->getVector(); - SPColor color = gradient->getFirstStop()->specified_color; - float alpha = gradient->getFirstStop()->opacity; - psel->selected_color->setColorAlpha(color, alpha); + + // Gradient can be null if object paint is changed externally (ie. with a color picker tool) + if (gradient) + { + SPColor color = gradient->getFirstStop()->specified_color; + float alpha = gradient->getFirstStop()->opacity; + psel->selected_color->setColorAlpha(color, alpha, false); + } } } |
