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:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user