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 <andreas.heinisch@yahoo.de>
This commit is contained in:
Andreas Heinisch
2026-10-07 21:14:59 +02:00
parent 1886cb2ee3
commit 720a6d856e
2 changed files with 20 additions and 9 deletions
+7 -2
View File
@@ -152,15 +152,19 @@ public:
double GetValue() const { return mdValue; }
void SetModifyHdl(const Link<ColorSliderControl&, void>& rLink) { maModifyHdl = rLink; }
void SetResizeHdl(const Link<ColorSliderControl&, void>& rLink) { maResizeHdl = rLink; }
sal_Int16 GetLevel() const { return mnLevel; }
sal_Int16 GetLevel() const
{
return static_cast<sal_Int16>((1.0 - mdValue) * GetOutputSizePixel().Height());
}
private:
Link<ColorSliderControl&, void> maModifyHdl;
Link<ColorSliderControl&, void> maResizeHdl;
Color maColor;
ColorMode meMode;
VclPtr<VirtualDevice> 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);
+13 -7
View File
@@ -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<sal_Int16>((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;