chart2/source/controller/sidebar/ChartColorPaletteControl.cxx | 64 +++++++++- chart2/source/controller/sidebar/ChartColorPaletteControl.hxx | 18 ++ chart2/source/controller/sidebar/ChartColorsPanel.cxx | 22 +++ chart2/source/inc/ChartColorPalettes.hxx | 7 + chart2/source/tools/ChartColorPalettes.cxx | 12 + 5 files changed, 118 insertions(+), 5 deletions(-)
New commits: commit ef0cdb221343a77a268cd8aa5b8b1d4c82db96af Author: Marco Cecchetti <marco.cecche...@collabora.com> AuthorDate: Fri May 9 18:11:25 2025 +0200 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Thu Jun 12 08:43:51 2025 +0200 chart preview color palette for data series on mouse over Change-Id: I99b8adefe87cb54d886a7dcead72709568f72c57 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/186338 Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> diff --git a/chart2/source/controller/sidebar/ChartColorPaletteControl.cxx b/chart2/source/controller/sidebar/ChartColorPaletteControl.cxx index b5a4503ffbfe..3a3e8c1b5db2 100644 --- a/chart2/source/controller/sidebar/ChartColorPaletteControl.cxx +++ b/chart2/source/controller/sidebar/ChartColorPaletteControl.cxx @@ -28,6 +28,7 @@ #include <ChartColorPaletteHelper.hxx> #include "ChartColorPaletteControl.hxx" +#include <vcl/event.hxx> #include <vcl/gdimtf.hxx> #include <vcl/graph.hxx> @@ -127,6 +128,18 @@ void ChartColorPaletteControl::updateStatus(bool bForce) } } +void ChartColorPaletteControl::createDiagramSnapshot() const +{ + if (mpHandler) + mpHandler->createDiagramSnapshot(); +} + +void ChartColorPaletteControl::restoreOriginalDiagram() const +{ + if (mpHandler) + mpHandler->restoreOriginalDiagram(); +} + void ChartColorPaletteControl::renderSelectedColorPalette(const VclPtr<VirtualDevice>& pDev) const { if (!pDev) @@ -242,6 +255,9 @@ ChartColorPalettePopup::ChartColorPalettePopup(ChartColorPaletteControl* pContro , mxMonoValueSet(new ChartColorPalettes) , mxMonoValueSetWin( new weld::CustomWeld(*m_xBuilder, "monochromatic_palettes", *mxMonoValueSet)) + , meHighlightedItemType(mxControl->getColorPaletteType()) + , mnHighlightedItemId(mxControl->getColorPaletteIndex()) + , mbItemSelected(false) { mxColorfulValueSet->SetColCount(2); mxColorfulValueSet->SetLineCount(2); @@ -255,14 +271,22 @@ ChartColorPalettePopup::ChartColorPalettePopup(ChartColorPaletteControl* pContro mxColorfulValueSet->SetOptimalSize(); mxColorfulValueSet->SetSelectHdl(LINK(this, ChartColorPalettePopup, SelectColorfulValueSetHdl)); + mxColorfulValueSet->setMouseMoveHdl(LINK(this, ChartColorPalettePopup, ColorfulMouseMoveHdl)); mxMonoValueSet->SetOptimalSize(); mxMonoValueSet->SetSelectHdl(LINK(this, ChartColorPalettePopup, SelectMonoValueSetHdl)); + mxMonoValueSet->setMouseMoveHdl(LINK(this, ChartColorPalettePopup, MonoMouseMoveHdl)); selectItem(mxControl->getColorPaletteType(), mxControl->getColorPaletteIndex() + 1); + + mxControl->createDiagramSnapshot(); } -ChartColorPalettePopup::~ChartColorPalettePopup() {} +ChartColorPalettePopup::~ChartColorPalettePopup() +{ + if (!mbItemSelected) + mxControl->restoreOriginalDiagram(); +} void ChartColorPalettePopup::selectItem(const ChartColorPaletteType eType, const sal_uInt32 nIndex) const @@ -330,8 +354,8 @@ IMPL_LINK_NOARG(ChartColorPalettePopup, SelectMonoValueSetHdl, ValueSet*, void) mxControl->EndPopupMode(); } -sal_uInt32 ChartColorPalettePopup::SelectValueSetHdl( - const std::unique_ptr<ChartColorPalettes>& xValueSet) const +sal_uInt32 +ChartColorPalettePopup::SelectValueSetHdl(const std::unique_ptr<ChartColorPalettes>& xValueSet) { const sal_uInt32 nItemId = xValueSet->GetSelectedItemId(); @@ -343,11 +367,45 @@ sal_uInt32 ChartColorPalettePopup::SelectValueSetHdl( if (const ChartColorPalette* pPalette = xValueSet->getPalette(nIndex)) { mxControl->applyColorPalette(pPalette); + mbItemSelected = true; return nIndex; } return -1; } +IMPL_LINK_NOARG(ChartColorPalettePopup, ColorfulMouseMoveHdl, const MouseEvent&, void) +{ + MouseMoveHdl(mxColorfulValueSet, ChartColorPaletteType::Colorful); +} + +IMPL_LINK_NOARG(ChartColorPalettePopup, MonoMouseMoveHdl, const MouseEvent&, void) +{ + MouseMoveHdl(mxMonoValueSet, ChartColorPaletteType::Monochromatic); +} + +void ChartColorPalettePopup::MouseMoveHdl(const std::unique_ptr<ChartColorPalettes>& xValueSet, + const ChartColorPaletteType eHlItemType) +{ + const sal_uInt16 nHlId = xValueSet->GetHighlightedItemId(); + if (eHlItemType == meHighlightedItemType && nHlId == mnHighlightedItemId) + return; + + if (nHlId > 0) + { + if (const ChartColorPalette* pPalette = xValueSet->getPalette(nHlId - 1)) + { + mxControl->applyColorPalette(pPalette); + } + } + else + { + mxControl->restoreOriginalDiagram(); + } + + meHighlightedItemType = eHlItemType; + mnHighlightedItemId = nHlId; +} + } // end namespace chart::sidebar /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/chart2/source/controller/sidebar/ChartColorPaletteControl.hxx b/chart2/source/controller/sidebar/ChartColorPaletteControl.hxx index a2007bd79b6f..dfdeb6817d7c 100644 --- a/chart2/source/controller/sidebar/ChartColorPaletteControl.hxx +++ b/chart2/source/controller/sidebar/ChartColorPaletteControl.hxx @@ -23,6 +23,10 @@ namespace sidebar struct IColorPaletteHandler { virtual ~IColorPaletteHandler() = default; + + virtual void createDiagramSnapshot() = 0; + virtual void restoreOriginalDiagram() = 0; + virtual void select(ChartColorPaletteType eType, sal_uInt32 nIndex) = 0; virtual void apply(const ChartColorPalette* pColorPalette) = 0; [[nodiscard]] virtual std::shared_ptr<ChartColorPaletteHelper> getHelper() const = 0; @@ -60,6 +64,9 @@ public: void applyColorPalette(const ChartColorPalette* pColorPalette) const; void updateStatus(bool bForce = false); + void createDiagramSnapshot() const; + void restoreOriginalDiagram() const; + private: std::unique_ptr<WeldToolbarPopup> weldPopupWindow() override; VclPtr<vcl::Window> createVclPopupWindow(vcl::Window* pParent) override; @@ -75,9 +82,18 @@ class ChartColorPalettePopup final : public WeldToolbarPopup std::unique_ptr<ChartColorPalettes> mxMonoValueSet; std::unique_ptr<weld::CustomWeld> mxMonoValueSetWin; + ChartColorPaletteType meHighlightedItemType; + sal_uInt16 mnHighlightedItemId; + bool mbItemSelected; + DECL_LINK(SelectColorfulValueSetHdl, ValueSet*, void); DECL_LINK(SelectMonoValueSetHdl, ValueSet*, void); - sal_uInt32 SelectValueSetHdl(const std::unique_ptr<ChartColorPalettes>& xValueSet) const; + sal_uInt32 SelectValueSetHdl(const std::unique_ptr<ChartColorPalettes>& xValueSet); + + DECL_LINK(ColorfulMouseMoveHdl, const MouseEvent&, void); + DECL_LINK(MonoMouseMoveHdl, const MouseEvent&, void); + void MouseMoveHdl(const std::unique_ptr<ChartColorPalettes>& xValueSet, + ChartColorPaletteType eHlItemType); void GrabFocus() override; diff --git a/chart2/source/controller/sidebar/ChartColorsPanel.cxx b/chart2/source/controller/sidebar/ChartColorsPanel.cxx index 14a17cc9585b..c4e71aac483b 100644 --- a/chart2/source/controller/sidebar/ChartColorsPanel.cxx +++ b/chart2/source/controller/sidebar/ChartColorsPanel.cxx @@ -27,6 +27,7 @@ #include <ChartController.hxx> #include <ChartModel.hxx> #include <DataSeries.hxx> +#include <Diagram.hxx> #include <com/sun/star/drawing/FillStyle.hpp> @@ -89,6 +90,9 @@ public: void updateModel(const rtl::Reference<ChartModel>& xModel); void updateData() const; + void createDiagramSnapshot() override; + void restoreOriginalDiagram() override; + void select(ChartColorPaletteType eType, sal_uInt32 nIndex) override; void apply(const ChartColorPalette* pColorPalette) override; [[nodiscard]] std::shared_ptr<ChartColorPaletteHelper> getHelper() const override; @@ -98,6 +102,7 @@ public: private: rtl::Reference<ChartModel> mxModel; ChartColorPaletteControl* mpControl; + rtl::Reference<Diagram> mxDiagramSnapshot; }; ColorPaletteWrapper::ColorPaletteWrapper(rtl::Reference<ChartModel> xModel, @@ -125,6 +130,23 @@ void ColorPaletteWrapper::updateData() const mpControl->statusChanged(aEvent); } +void ColorPaletteWrapper::createDiagramSnapshot() +{ + const rtl::Reference<Diagram> xDiagram = mxModel->getFirstChartDiagram(); + mxDiagramSnapshot = new ::chart::Diagram(*xDiagram); +} + +void ColorPaletteWrapper::restoreOriginalDiagram() +{ + if (mxDiagramSnapshot) + { + const rtl::Reference<Diagram> xDiagram = new ::chart::Diagram(*mxDiagramSnapshot); + // setDiagram didn't make a copy internally, so we need to pass a copy or + // the diagram snapshot would be modified on preview + mxModel->setFirstDiagram(xDiagram); + } +} + void ColorPaletteWrapper::select(ChartColorPaletteType eType, const sal_uInt32 nIndex) { mxModel->setColorPalette(eType, nIndex); diff --git a/chart2/source/inc/ChartColorPalettes.hxx b/chart2/source/inc/ChartColorPalettes.hxx index 8bb5aa052c25..48e5e252bae4 100644 --- a/chart2/source/inc/ChartColorPalettes.hxx +++ b/chart2/source/inc/ChartColorPalettes.hxx @@ -18,7 +18,12 @@ namespace chart { class OOO_DLLPUBLIC_CHARTTOOLS ChartColorPalettes final : public ValueSet { +public: + typedef Link<const MouseEvent&, void> MouseEventHandler; + +private: std::vector<ChartColorPalette> maColorSets; + MouseEventHandler maMouseMoveHdl; public: ChartColorPalettes() @@ -29,9 +34,11 @@ public: void SetDrawingArea(weld::DrawingArea* pDrawingArea) override; void UserDraw(const UserDrawEvent& rUserDrawEvent) override; void StyleUpdated() override; + bool MouseMove(const MouseEvent& rMEvt) override; void insert(ChartColorPalette const& rColorSet); const ChartColorPalette* getPalette(sal_uInt32 nItem) const; + void setMouseMoveHdl(const MouseEventHandler& rLink); }; } // end namespace chart diff --git a/chart2/source/tools/ChartColorPalettes.cxx b/chart2/source/tools/ChartColorPalettes.cxx index dbe7697c7210..1ff465d1fea1 100644 --- a/chart2/source/tools/ChartColorPalettes.cxx +++ b/chart2/source/tools/ChartColorPalettes.cxx @@ -34,7 +34,7 @@ const ChartColorPalette* ChartColorPalettes::getPalette(const sal_uInt32 nItem) void ChartColorPalettes::SetDrawingArea(weld::DrawingArea* pDrawingArea) { ValueSet::SetDrawingArea(pDrawingArea); - SetStyle(WB_TABSTOP | WB_DOUBLEBORDER); + SetStyle(WB_TABSTOP | WB_DOUBLEBORDER | WB_FLATVALUESET); SetItemWidth(BORDER * 6 + SIZE * ChartColorPaletteSize / 2); SetItemHeight(BORDER * 5 + SIZE * 2); } @@ -54,6 +54,16 @@ void ChartColorPalettes::StyleUpdated() Invalidate(); ValueSet::StyleUpdated(); } + +bool ChartColorPalettes::MouseMove(const MouseEvent& rMEvt) +{ + bool bRes = ValueSet::MouseMove(rMEvt); + maMouseMoveHdl.Call(rMEvt); + return bRes; +} + +void ChartColorPalettes::setMouseMoveHdl(const MouseEventHandler& rLink) { maMouseMoveHdl = rLink; } + } // end namespace chart /* vim:set shiftwidth=4 softtabstop=4 expandtab: */