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: */

Reply via email to