From 720a6d856e8d2d132e7482afe30fb81535727a2e Mon Sep 17 00:00:00 2001 From: Andreas Heinisch Date: Wed, 7 Oct 2026 13:36:47 +0200 Subject: [PATCH] tdf#171730 - Keep slider markers in sync in the Pick a Color dialog The markers of the vertical color slider were only updated when the hex field was changed. Switching the color component via the radio buttons left the markers at their current position. In addition, markers did not match the start color when the dialog was opened. The level will now be calculated on every color update and once the slider is shown. Change-Id: Ie31a6e93e2a6bbf10f0cdf3307b81b735662a3c0 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/211962 Tested-by: Jenkins Reviewed-by: Andreas Heinisch --- vcl/inc/colorpicker.hxx | 9 +++++++-- vcl/source/window/colorpicker.cxx | 20 +++++++++++++------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/vcl/inc/colorpicker.hxx b/vcl/inc/colorpicker.hxx index 8f9cdb40cfdb..a7a7b0b53d69 100644 --- a/vcl/inc/colorpicker.hxx +++ b/vcl/inc/colorpicker.hxx @@ -152,15 +152,19 @@ public: double GetValue() const { return mdValue; } void SetModifyHdl(const Link& rLink) { maModifyHdl = rLink; } + void SetResizeHdl(const Link& rLink) { maResizeHdl = rLink; } - sal_Int16 GetLevel() const { return mnLevel; } + sal_Int16 GetLevel() const + { + return static_cast((1.0 - mdValue) * GetOutputSizePixel().Height()); + } private: Link maModifyHdl; + Link maResizeHdl; Color maColor; ColorMode meMode; VclPtr mxBitmap; - sal_Int16 mnLevel; double mdValue; }; @@ -221,6 +225,7 @@ private: DECL_LINK(ColorFieldControlModifydl, ColorFieldControl&, void); DECL_LINK(ColorSliderControlModifyHdl, ColorSliderControl&, void); + DECL_LINK(ColorSliderResizeHdl, ColorSliderControl&, void); DECL_LINK(ColorModifyMetricHdl, weld::MetricSpinButton&, void); DECL_LINK(ColorModifySpinHdl, weld::SpinButton&, void); DECL_LINK(ColorModifyEditHdl, weld::Entry&, void); diff --git a/vcl/source/window/colorpicker.cxx b/vcl/source/window/colorpicker.cxx index 3cb023ad576e..f31ca8c578b4 100644 --- a/vcl/source/window/colorpicker.cxx +++ b/vcl/source/window/colorpicker.cxx @@ -417,7 +417,6 @@ void ColorFieldControl::UpdatePosition() ColorSliderControl::ColorSliderControl() : meMode( DefaultMode ) - , mnLevel( 0 ) , mdValue( -1.0 ) { } @@ -519,7 +518,6 @@ void ColorSliderControl::ChangePosition(tools::Long nY) else if (nY > nHeight) nY = nHeight; - mnLevel = nY; mdValue = double(nHeight - nY) / double(nHeight); } @@ -567,6 +565,7 @@ void ColorSliderControl::Resize() { CustomWidgetController::Resize(); UpdateBitmap(); + maResizeHdl.Call(*this); } void ColorSliderControl::Modify() @@ -581,7 +580,6 @@ void ColorSliderControl::SetValue(const Color& rColor, ColorMode eMode, double d { maColor = rColor; mdValue = dValue; - mnLevel = static_cast((1.0-dValue) * GetOutputSizePixel().Height()); meMode = eMode; if (bUpdateBitmap) UpdateBitmap(); @@ -618,6 +616,7 @@ ColorPickerDialog::ColorPickerDialog(weld::Window* pParent, const Color& rColor, { m_aColorField.SetModifyHdl( LINK( this, ColorPickerDialog, ColorFieldControlModifydl ) ); m_aColorSlider.SetModifyHdl( LINK( this, ColorPickerDialog, ColorSliderControlModifyHdl ) ); + m_aColorSlider.SetResizeHdl(LINK(this, ColorPickerDialog, ColorSliderResizeHdl)); int nMargin = (m_xFISliderLeft->get_preferred_size().Height() + 1) / 2; m_xColorSlider->set_margin_top(nMargin); @@ -769,12 +768,12 @@ void ColorPickerDialog::update_color( UpdateFlags n ) } } + // tdf#171730 - always sync slider markers with current slider level + m_xFISliderLeft->set_margin_top(m_aColorSlider.GetLevel()); + m_xFISliderRight->set_margin_top(m_aColorSlider.GetLevel()); + if (n & UpdateFlags::Hex) // update hex - { - m_xFISliderLeft->set_margin_top(m_aColorSlider.GetLevel()); - m_xFISliderRight->set_margin_top(m_aColorSlider.GetLevel()); m_xEDHex->SetColor(aColor); - } m_aColorPreview.SetColor(aColor); } @@ -842,6 +841,13 @@ IMPL_LINK_NOARG(ColorPickerDialog, ColorSliderControlModifyHdl, ColorSliderContr update_color(UpdateFlags::All & ~UpdateFlags::ColorSlider); } +IMPL_LINK_NOARG(ColorPickerDialog, ColorSliderResizeHdl, ColorSliderControl&, void) +{ + // tdf#171730 - sync slider markers with current slider level + m_xFISliderLeft->set_margin_top(m_aColorSlider.GetLevel()); + m_xFISliderRight->set_margin_top(m_aColorSlider.GetLevel()); +} + IMPL_LINK(ColorPickerDialog, ColorModifyMetricHdl, weld::MetricSpinButton&, rEdit, void) { UpdateFlags n = UpdateFlags::NONE;