cui/source/inc/cuitabarea.hxx            |   21 ++
 cui/source/tabpages/tpgradnt.cxx         |  224 ++++++++++++++++++++++---------
 cui/uiconfig/ui/gradientpage.ui          |   30 ++--
 sd/qa/uitest/impress_tests2/tdf125449.py |    7 
 4 files changed, 203 insertions(+), 79 deletions(-)

New commits:
commit f85871936ef820977ea957e01cf77798f1140e40
Author:     Parth Raiyani <parth.raiy...@collabora.com>
AuthorDate: Tue Aug 5 15:09:47 2025 +0530
Commit:     Szymon Kłos <szymon.k...@collabora.com>
CommitDate: Thu Aug 7 15:31:03 2025 +0200

    Switch to IconView for gradient tab page for improved UI handling
    
    - Replaced ValueSet with IconView widget in gradient tab page
    - Updated gradientpage UI to include GtkIconView and GtkTreeStore for 
gradient
    - Added support to select and preview default when no item is selected
    - Always keep selected item and selection preview in sync
    - Update relevant test case
    
    Change-Id: I133bff8f916db9884c1cbf45d5a8c4552bdb48d0
    Signed-off-by: Parth Raiyani <parth.raiy...@collabora.com>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/188238
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Szymon Kłos <szymon.k...@collabora.com>

diff --git a/cui/source/inc/cuitabarea.hxx b/cui/source/inc/cuitabarea.hxx
index 54bb75db0518..24f308cf5703 100644
--- a/cui/source/inc/cuitabarea.hxx
+++ b/cui/source/inc/cuitabarea.hxx
@@ -360,6 +360,8 @@ private:
 
     XFillAttrSetItem    m_aXFillAttr;
     SfxItemSet&         m_rXFSet;
+    OUString            sLastItemIdent;
+    Size                aIconSize;
 
     // MCGR: Preserve ColorStops until we have a UI to edit these
     basegfx::BColorStops m_aColorStops;
@@ -378,20 +380,21 @@ private:
     std::unique_ptr<weld::MetricSpinButton> m_xMtrColorFrom;
     std::unique_ptr<ColorListBox> m_xLbColorTo;
     std::unique_ptr<weld::MetricSpinButton> m_xMtrColorTo;
-    std::unique_ptr<SvxPresetListBox> m_xGradientLB;
+    std::unique_ptr<weld::IconView> m_xGradientLB;
     std::unique_ptr<weld::SpinButton> m_xMtrIncrement;
     std::unique_ptr<weld::CheckButton> m_xCbIncrement;
     std::unique_ptr<weld::Button> m_xBtnAdd;
     std::unique_ptr<weld::Button> m_xBtnModify;
     std::unique_ptr<weld::CustomWeld> m_xCtlPreview;
-    std::unique_ptr<weld::CustomWeld> m_xGradientLBWin;
 
     DECL_LINK( ClickAddHdl_Impl, weld::Button&, void );
     DECL_LINK( ClickModifyHdl_Impl, weld::Button&, void );
-    DECL_LINK( ChangeGradientHdl, ValueSet*, void );
+    DECL_LINK( ChangeGradientHdl, weld::IconView&, void );
     void ChangeGradientHdl_Impl();
-    DECL_LINK( ClickRenameHdl_Impl, SvxPresetListBox*, void );
-    DECL_LINK( ClickDeleteHdl_Impl, SvxPresetListBox*, void );
+    DECL_LINK(MousePressHdl, const MouseEvent&, bool);
+    DECL_LINK(MenuSelectAsyncHdl, void*, void);
+    DECL_LINK(OnPopupEnd, const OUString&, void);
+    DECL_LINK(QueryTooltipHdl, const weld::TreeIter&, OUString);
     DECL_LINK( ModifiedEditHdl_Impl, weld::SpinButton&, void );
     DECL_LINK( ModifiedMetricHdl_Impl, weld::MetricSpinButton&, void );
     DECL_LINK( ModifiedColorListBoxHdl_Impl, ColorListBox&, void );
@@ -406,6 +409,14 @@ private:
     // MCGR: Preserve ColorStops until we have a UI to edit these
     basegfx::BColorStops createColorStops();
 
+    static VclPtr<VirtualDevice> GetVirtualDevice(BitmapEx aBitmap);
+    void FillPresetListBox();
+    void ShowContextMenu(const Point& pPos);
+    void MenuSelect(const OUString& rIdent);
+    void HandleMenuSelect(std::u16string_view rIdent);
+    void ClickRenameHdl();
+    void ClickDeleteHdl();
+
 public:
     SvxGradientTabPage(weld::Container* pPage, weld::DialogController* 
pController, const SfxItemSet& rInAttrs);
     virtual ~SvxGradientTabPage() override;
diff --git a/cui/source/tabpages/tpgradnt.cxx b/cui/source/tabpages/tpgradnt.cxx
index 6e24a438fbf1..048c9c638d5d 100644
--- a/cui/source/tabpages/tpgradnt.cxx
+++ b/cui/source/tabpages/tpgradnt.cxx
@@ -39,6 +39,7 @@
 #include <svx/svxids.hrc>
 #include <basegfx/utils/gradienttools.hxx>
 #include <sal/log.hxx>
+#include <comphelper/lok.hxx>
 
 using namespace com::sun::star;
 
@@ -49,6 +50,7 @@ SvxGradientTabPage::SvxGradientTabPage(weld::Container* 
pPage, weld::DialogContr
     , m_pnColorListState(nullptr)
     , m_aXFillAttr(rInAttrs.GetPool())
     , m_rXFSet(m_aXFillAttr.GetItemSet())
+    , aIconSize(60, 64)
     , m_xLbGradientType(m_xBuilder->weld_combo_box(u"gradienttypelb"_ustr))
     , m_xFtCenter(m_xBuilder->weld_label(u"centerft"_ustr))
     , m_xMtrCenterX(m_xBuilder->weld_metric_spin_button(u"centerxmtr"_ustr, 
FieldUnit::PERCENT))
@@ -64,16 +66,14 @@ SvxGradientTabPage::SvxGradientTabPage(weld::Container* 
pPage, weld::DialogContr
     , m_xLbColorTo(new 
ColorListBox(m_xBuilder->weld_menu_button(u"colortolb"_ustr),
                 [this]{ return GetDialogController()->getDialog(); }))
     , m_xMtrColorTo(m_xBuilder->weld_metric_spin_button(u"colortomtr"_ustr, 
FieldUnit::PERCENT))
-    , m_xGradientLB(new 
SvxPresetListBox(m_xBuilder->weld_scrolled_window(u"gradientpresetlistwin"_ustr,
 true)))
+    , m_xGradientLB(m_xBuilder->weld_icon_view(u"gradientpresetlist"_ustr))
     , m_xMtrIncrement(m_xBuilder->weld_spin_button(u"incrementmtr"_ustr))
     , m_xCbIncrement(m_xBuilder->weld_check_button(u"autoincrement"_ustr))
     , m_xBtnAdd(m_xBuilder->weld_button(u"add"_ustr))
     , m_xBtnModify(m_xBuilder->weld_button(u"modify"_ustr))
     , m_xCtlPreview(new weld::CustomWeld(*m_xBuilder, u"previewctl"_ustr, 
m_aCtlPreview))
-    , m_xGradientLBWin(new weld::CustomWeld(*m_xBuilder, 
u"gradientpresetlist"_ustr, *m_xGradientLB))
 {
     Size aSize = 
getDrawPreviewOptimalSize(m_aCtlPreview.GetDrawingArea()->get_ref_device());
-    m_xGradientLB->set_size_request(aSize.Width(), aSize.Height());
     m_xCtlPreview->set_size_request(aSize.Width(), aSize.Height());
     // this page needs ExchangeSupport
     SetExchangeSupport();
@@ -89,9 +89,9 @@ SvxGradientTabPage::SvxGradientTabPage(weld::Container* 
pPage, weld::DialogContr
     m_aCtlPreview.SetAttributes(m_aXFillAttr.GetItemSet());
 
     // set handler
-    m_xGradientLB->SetSelectHdl( LINK( this, SvxGradientTabPage, 
ChangeGradientHdl ) );
-    m_xGradientLB->SetRenameHdl( LINK( this, SvxGradientTabPage, 
ClickRenameHdl_Impl ) );
-    m_xGradientLB->SetDeleteHdl( LINK( this, SvxGradientTabPage, 
ClickDeleteHdl_Impl ) );
+    m_xGradientLB->connect_selection_changed(LINK(this, SvxGradientTabPage, 
ChangeGradientHdl));
+    m_xGradientLB->connect_mouse_press(LINK(this, SvxGradientTabPage, 
MousePressHdl));
+    m_xGradientLB->connect_query_tooltip(LINK(this, SvxGradientTabPage, 
QueryTooltipHdl));
     m_xBtnAdd->connect_clicked(LINK(this, SvxGradientTabPage, 
ClickAddHdl_Impl));
     m_xBtnModify->connect_clicked(LINK(this, SvxGradientTabPage, 
ClickModifyHdl_Impl));
 
@@ -112,8 +112,6 @@ SvxGradientTabPage::SvxGradientTabPage(weld::Container* 
pPage, weld::DialogContr
     m_xMtrColorTo->connect_value_changed( aLink );
     m_xLbColorTo->SetSelectHdl( aLink3 );
 
-    m_xGradientLB->SetStyle(WB_FLATVALUESET | WB_NO_DIRECTSELECT | WB_TABSTOP);
-
     // #i76307# always paint the preview in LTR, because this is what the 
document does
     m_aCtlPreview.EnableRTL(false);
 }
@@ -121,7 +119,6 @@ SvxGradientTabPage::SvxGradientTabPage(weld::Container* 
pPage, weld::DialogContr
 SvxGradientTabPage::~SvxGradientTabPage()
 {
     m_xCtlPreview.reset();
-    m_xGradientLBWin.reset();
     m_xGradientLB.reset();
     m_xLbColorTo.reset();
     m_xLbColorFrom.reset();
@@ -140,7 +137,36 @@ SvxGradientTabPage::~SvxGradientTabPage()
 
 void SvxGradientTabPage::Construct()
 {
-    m_xGradientLB->FillPresetListBox( *m_pGradientList );
+    FillPresetListBox();
+}
+
+
+void SvxGradientTabPage::FillPresetListBox()
+{
+    m_xGradientLB->clear();
+
+    m_xGradientLB->freeze();
+    for (tools::Long nId = 0; nId < m_pGradientList->Count(); nId++)
+    {
+        const OUString aString(m_pGradientList->GetGradient(nId)->GetName());
+
+        OUString sId = OUString::number(nId);
+        BitmapEx aBitmap = m_pGradientList->GetBitmapForPreview(nId, 
aIconSize);
+        VclPtr<VirtualDevice> aVDev = GetVirtualDevice(aBitmap);
+
+        if (!m_xGradientLB->get_id(nId).isEmpty())
+        {
+            m_xGradientLB->set_image(nId, aVDev);
+            m_xGradientLB->set_id(nId, sId);
+            m_xGradientLB->set_text(nId, aString);
+        }
+        else
+        {
+            m_xGradientLB->insert(-1, &aString, &sId, aVDev, nullptr);
+        }
+    }
+
+    m_xGradientLB->thaw();
 }
 
 void SvxGradientTabPage::ActivatePage( const SfxItemSet& rSet )
@@ -178,8 +204,7 @@ void SvxGradientTabPage::ActivatePage( const SfxItemSet& 
rSet )
     sal_Int32 nPos = SearchGradientList( 
rSet.Get(XATTR_FILLGRADIENT).GetName() );
     if ( nPos != -1)
     {
-        sal_uInt16 nId = m_xGradientLB->GetItemId( static_cast<size_t>( nPos ) 
);
-        m_xGradientLB->SelectItem( nId );
+        m_xGradientLB->select( nPos );
     }
     // colors could have been deleted
     ChangeGradientHdl_Impl();
@@ -197,16 +222,17 @@ DeactivateRC SvxGradientTabPage::DeactivatePage( 
SfxItemSet* _pSet )
 bool SvxGradientTabPage::FillItemSet( SfxItemSet* rSet )
 {
     std::unique_ptr<basegfx::BGradient> pBGradient;
-    size_t nPos = m_xGradientLB->IsNoSelection() ? VALUESET_ITEM_NOTFOUND : 
m_xGradientLB->GetSelectItemPos();
+    OUString sId = m_xGradientLB->get_selected_id();
+    sal_Int32 nPos = !sId.isEmpty() ? sId.toInt32() : -1;
 
     sal_uInt16 nValue = 0; // automatic step count
     if (!m_xCbIncrement->get_active())
         nValue = m_xMtrIncrement->get_value();
 
-    if( nPos != VALUESET_ITEM_NOTFOUND )
+    if( nPos != -1 )
     {
         pBGradient.reset(new basegfx::BGradient( m_pGradientList->GetGradient( 
static_cast<sal_uInt16>(nPos) )->GetGradient() ));
-        OUString aString = m_xGradientLB->GetItemText( 
m_xGradientLB->GetSelectedItemId() );
+        const OUString aString(m_pGradientList->GetGradient(nPos)->GetName());
         // update StepCount to current value to be in sync with 
FillGradientStepCount
         pBGradient->SetSteps(nValue);
         rSet->Put( XFillGradientItem( aString, *pBGradient ) );
@@ -253,32 +279,26 @@ std::unique_ptr<SfxTabPage> SvxGradientTabPage::Create( 
weld::Container* pPage,
 IMPL_LINK( SvxGradientTabPage, ModifiedListBoxHdl_Impl, weld::ComboBox&, 
rListBox, void )
 {
     ModifiedHdl_Impl(&rListBox);
-    // gradient params changed, it is no longer one of the presets
-    m_xGradientLB->SetNoSelection();
 }
 
 IMPL_LINK( SvxGradientTabPage, ModifiedColorListBoxHdl_Impl, ColorListBox&, 
rListBox, void )
 {
     ModifiedHdl_Impl(&rListBox);
-    m_xGradientLB->SetNoSelection();
 }
 
 IMPL_LINK( SvxGradientTabPage, ModifiedEditHdl_Impl, weld::SpinButton&, rBox, 
void )
 {
     ModifiedHdl_Impl(&rBox);
-    m_xGradientLB->SetNoSelection();
 }
 
 IMPL_LINK( SvxGradientTabPage, ModifiedMetricHdl_Impl, 
weld::MetricSpinButton&, rBox, void )
 {
     ModifiedHdl_Impl(&rBox);
-    m_xGradientLB->SetNoSelection();
 }
 
 IMPL_LINK( SvxGradientTabPage, ModifiedSliderHdl_Impl, weld::Scale&, rSlider, 
void )
 {
     ModifiedHdl_Impl(&rSlider);
-    m_xGradientLB->SetNoSelection();
 }
 
 IMPL_LINK_NOARG( SvxGradientTabPage, ChangeAutoStepHdl_Impl, 
weld::Toggleable&, void )
@@ -391,11 +411,14 @@ IMPL_LINK_NOARG(SvxGradientTabPage, ClickAddHdl_Impl, 
weld::Button&, void)
 
         m_pGradientList->Insert(std::make_unique<XGradientEntry>(aBGradient, 
aName), nCount);
 
-        sal_Int32 nId = m_xGradientLB->GetItemId(nCount - 1); //calculate the 
last ID
-        BitmapEx aBitmap = m_pGradientList->GetBitmapForPreview( nCount, 
m_xGradientLB->GetIconSize() );
-        m_xGradientLB->InsertItem( nId + 1, Image(aBitmap), aName );
-        m_xGradientLB->SelectItem( nId + 1 );
-        m_xGradientLB->Resize();
+        OUString sId = nCount > 0 ? m_xGradientLB->get_id( nCount - 1 ) : 
OUString();
+        sal_Int32 nId = !sId.isEmpty() ? sId.toInt32() : -1;
+        BitmapEx aBitmap = m_pGradientList->GetBitmapForPreview( nCount, 
aIconSize );
+        VclPtr<VirtualDevice> pVDev = GetVirtualDevice(aBitmap);
+
+        m_xGradientLB->insert( nId + 1, &aName, &sId, pVDev, nullptr);
+        FillPresetListBox();
+        m_xGradientLB->select( nId + 1 );
 
         m_nGradientListState |= ChangeType::MODIFIED;
 
@@ -407,13 +430,25 @@ IMPL_LINK_NOARG(SvxGradientTabPage, ClickAddHdl_Impl, 
weld::Button&, void)
         m_xBtnModify->set_sensitive(true);
 }
 
+VclPtr<VirtualDevice> SvxGradientTabPage::GetVirtualDevice(BitmapEx aBitmap)
+{
+    VclPtr<VirtualDevice> pVDev = VclPtr<VirtualDevice>::Create();
+    const Point aNull(0, 0);
+    if (pVDev->GetDPIScaleFactor() > 1)
+        aBitmap.Scale(pVDev->GetDPIScaleFactor(), pVDev->GetDPIScaleFactor());
+    const Size aSize(aBitmap.GetSizePixel());
+    pVDev->SetOutputSizePixel(aSize);
+    pVDev->DrawBitmapEx(aNull, aBitmap);
+
+    return pVDev;
+}
 
 IMPL_LINK_NOARG(SvxGradientTabPage, ClickModifyHdl_Impl, weld::Button&, void)
 {
-    sal_uInt16 nId = m_xGradientLB->GetSelectedItemId();
-    size_t nPos = m_xGradientLB->GetSelectItemPos();
+    OUString sId = m_xGradientLB->get_selected_id();
+    sal_Int32 nPos = !sId.isEmpty() ? sId.toInt32() : -1;
 
-    if ( nPos == VALUESET_ITEM_NOTFOUND )
+    if ( nPos == -1 )
         return;
 
     OUString aName( m_pGradientList->GetGradient( 
static_cast<sal_uInt16>(nPos) )->GetName() );
@@ -435,34 +470,106 @@ IMPL_LINK_NOARG(SvxGradientTabPage, ClickModifyHdl_Impl, 
weld::Button&, void)
 
     m_pGradientList->Replace(std::make_unique<XGradientEntry>(aBGradient, 
aName), nPos);
 
-    BitmapEx aBitmap = m_pGradientList->GetBitmapForPreview( 
static_cast<sal_uInt16>(nPos), m_xGradientLB->GetIconSize() );
-    m_xGradientLB->RemoveItem( nId );
-    m_xGradientLB->InsertItem( nId, Image(aBitmap), aName, 
static_cast<sal_uInt16>(nPos) );
-    m_xGradientLB->SelectItem( nId );
+    BitmapEx aBitmap = m_pGradientList->GetBitmapForPreview( 
static_cast<sal_uInt16>(nPos), aIconSize );
+    VclPtr<VirtualDevice> pVDev = GetVirtualDevice(aBitmap);
+
+    m_xGradientLB->remove( nPos );
+    m_xGradientLB->insert( nPos, &aName, &sId, pVDev, nullptr);
+    FillPresetListBox();
+    m_xGradientLB->select( nPos );
 
     m_nGradientListState |= ChangeType::MODIFIED;
 }
 
-IMPL_LINK_NOARG(SvxGradientTabPage, ClickDeleteHdl_Impl, SvxPresetListBox*, 
void)
+IMPL_LINK(SvxGradientTabPage, QueryTooltipHdl, const weld::TreeIter&, rIter, 
OUString)
+{
+    OUString sId = m_xGradientLB->get_id(rIter);
+    sal_Int32 nId = !sId.isEmpty() ? sId.toInt32() : -1;
+
+    if (nId >= 0)
+    {
+        return m_pGradientList->GetGradient(nId)->GetName();
+    }
+    return OUString();
+}
+
+IMPL_LINK(SvxGradientTabPage, MousePressHdl, const MouseEvent&, rMEvt, bool)
 {
-    const sal_uInt16 nId = m_xGradientLB->GetContextMenuItemId();
-    const size_t nPos = m_xGradientLB->GetItemPos(nId);
+    if (!rMEvt.IsRight())
+        return false;
 
-    if( nPos != VALUESET_ITEM_NOTFOUND )
+    // Disable context menu for LibreOfficeKit mode
+    if (comphelper::LibreOfficeKit::isActive())
+        return false;
+
+    const Point& pPos = rMEvt.GetPosPixel();
+    for (int i = 0; i < m_xGradientLB->n_children(); i++)
+    {
+        const ::tools::Rectangle aRect = m_xGradientLB->get_rect(i);
+        if (aRect.Contains(pPos))
+        {
+            ShowContextMenu(pPos);
+            break;
+        }
+    }
+    return false;
+}
+
+void SvxGradientTabPage::ShowContextMenu(const Point& pPos)
+{
+    ::tools::Rectangle aRect(pPos, Size(1, 1));
+    std::unique_ptr<weld::Builder> xBuilder(
+        Application::CreateBuilder(m_xGradientLB.get(), 
u"svx/ui/presetmenu.ui"_ustr));
+    std::unique_ptr<weld::Menu> xMenu(xBuilder->weld_menu(u"menu"_ustr));
+
+    xMenu->connect_activate(LINK(this, SvxGradientTabPage, OnPopupEnd));
+    xMenu->popup_at_rect(m_xGradientLB.get(), aRect);
+}
+
+IMPL_LINK(SvxGradientTabPage, OnPopupEnd, const OUString&, sCommand, void)
+{
+    sLastItemIdent = sCommand;
+    if (sLastItemIdent.isEmpty())
+        return;
+
+    Application::PostUserEvent(LINK(this, SvxGradientTabPage, 
MenuSelectAsyncHdl));
+}
+
+IMPL_LINK_NOARG(SvxGradientTabPage, MenuSelectAsyncHdl, void*, void)
+{
+    if (sLastItemIdent == u"rename")
+    {
+        ClickRenameHdl();
+    }
+    else if (sLastItemIdent == u"delete")
+    {
+        ClickDeleteHdl();
+    }
+}
+
+void SvxGradientTabPage::ClickDeleteHdl()
+{
+    const OUString sId = m_xGradientLB->get_selected_id();
+    const sal_Int32 nPos = !sId.isEmpty() ? sId.toInt32() : -1;
+
+    if( nPos != -1 )
     {
         std::unique_ptr<weld::Builder> 
xBuilder(Application::CreateBuilder(GetFrameWeld(), 
u"cui/ui/querydeletegradientdialog.ui"_ustr));
         std::unique_ptr<weld::MessageDialog> 
xQueryBox(xBuilder->weld_message_dialog(u"AskDelGradientDialog"_ustr));
         if (xQueryBox->run() == RET_YES)
         {
-            const bool bDeletingSelectedItem(nId == 
m_xGradientLB->GetSelectedItemId());
             m_pGradientList->Remove(nPos);
-            m_xGradientLB->RemoveItem( nId );
-            if (bDeletingSelectedItem)
-            {
-                
m_xGradientLB->SelectItem(m_xGradientLB->GetItemId(/*Position=*/0));
-                m_aCtlPreview.Invalidate();
-            }
-            m_xGradientLB->Resize();
+            m_xGradientLB->remove( nPos );
+
+            FillPresetListBox();
+
+            sal_Int32 nNextId = nPos;
+            if (nPos >= m_xGradientLB->n_children())
+                nNextId = m_xGradientLB->n_children() - 1;
+
+            if(m_xGradientLB->n_children() > 0)
+                m_xGradientLB->select(nNextId);
+            m_aCtlPreview.Invalidate();
 
             ChangeGradientHdl_Impl();
 
@@ -474,12 +581,12 @@ IMPL_LINK_NOARG(SvxGradientTabPage, ClickDeleteHdl_Impl, 
SvxPresetListBox*, void
         m_xBtnModify->set_sensitive(false);
 }
 
-IMPL_LINK_NOARG(SvxGradientTabPage, ClickRenameHdl_Impl, SvxPresetListBox*, 
void)
+void SvxGradientTabPage::ClickRenameHdl()
 {
-    const sal_uInt16 nId = m_xGradientLB->GetContextMenuItemId();
-    const size_t nPos = m_xGradientLB->GetItemPos(nId);
+    const OUString sId = m_xGradientLB->get_selected_id();
+    const sal_Int32 nPos = !sId.isEmpty() ? sId.toInt32() : -1;
 
-    if ( nPos == VALUESET_ITEM_NOTFOUND )
+    if ( nPos == -1 )
         return;
 
     OUString aDesc( CuiResId( RID_CUISTR_DESC_GRADIENT ) );
@@ -493,14 +600,14 @@ IMPL_LINK_NOARG(SvxGradientTabPage, ClickRenameHdl_Impl, 
SvxPresetListBox*, void
     {
         aName = pDlg->GetName();
         sal_Int32 nGradientPos = SearchGradientList(aName);
-        bool bValidGradientName = (nGradientPos == 
static_cast<sal_Int32>(nPos) ) || (nGradientPos == -1);
+        bool bValidGradientName = (nGradientPos == nPos ) || (nGradientPos == 
-1);
 
         if( bValidGradientName )
         {
             bLoop = false;
             m_pGradientList->GetGradient(nPos)->SetName(aName);
 
-            m_xGradientLB->SetItemText( nId, aName );
+            m_xGradientLB->set_text( nPos, aName );
 
             m_nGradientListState |= ChangeType::MODIFIED;
         }
@@ -513,7 +620,7 @@ IMPL_LINK_NOARG(SvxGradientTabPage, ClickRenameHdl_Impl, 
SvxPresetListBox*, void
     }
 }
 
-IMPL_LINK_NOARG(SvxGradientTabPage, ChangeGradientHdl, ValueSet*, void)
+IMPL_LINK_NOARG(SvxGradientTabPage, ChangeGradientHdl, weld::IconView&, void)
 {
     ChangeGradientHdl_Impl();
 }
@@ -521,9 +628,10 @@ IMPL_LINK_NOARG(SvxGradientTabPage, ChangeGradientHdl, 
ValueSet*, void)
 void SvxGradientTabPage::ChangeGradientHdl_Impl()
 {
     std::unique_ptr<basegfx::BGradient> pGradient;
-    size_t nPos = m_xGradientLB->GetSelectItemPos();
+    OUString sId = m_xGradientLB->get_selected_id();
+    sal_Int32 nPos = !sId.isEmpty() ? sId.toInt32() : -1;
 
-    if( nPos != VALUESET_ITEM_NOTFOUND )
+    if( nPos != -1 )
         pGradient.reset(new basegfx::BGradient( m_pGradientList->GetGradient( 
static_cast<sal_uInt16>( nPos ) )->GetGradient() ));
     else
     {
@@ -536,12 +644,10 @@ void SvxGradientTabPage::ChangeGradientHdl_Impl()
                 pGradient.reset(new basegfx::BGradient( 
pGradientItem->GetGradientValue() ));
             }
         }
-        if( !pGradient )
+        if(!pGradient && m_xGradientLB->n_children() > 0)
         {
-            sal_uInt16 nPosition = m_xGradientLB->GetItemId(0);
-            m_xGradientLB->SelectItem( nPosition );
-            if( nPosition != 0 )
-                pGradient.reset(new basegfx::BGradient( 
m_pGradientList->GetGradient( 0 )->GetGradient() ));
+            m_xGradientLB->select(0);
+            pGradient.reset(new basegfx::BGradient( 
m_pGradientList->GetGradient( 0 )->GetGradient() ));
         }
     }
 
diff --git a/cui/uiconfig/ui/gradientpage.ui b/cui/uiconfig/ui/gradientpage.ui
index 4de623fe9ff3..9c1512384641 100644
--- a/cui/uiconfig/ui/gradientpage.ui
+++ b/cui/uiconfig/ui/gradientpage.ui
@@ -49,6 +49,14 @@
     <property name="upper">100</property>
     <property name="step-increment">5</property>
   </object>
+  <object class="GtkTreeStore" id="liststore1">
+    <columns>
+      <!-- column-name pixbuf -->
+      <column type="GdkPixbuf"/>
+      <!-- column-name id -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
   <object class="GtkBox" id="GradientPage">
     <property name="visible">True</property>
     <property name="can-focus">False</property>
@@ -76,20 +84,20 @@
                 <property name="can-focus">True</property>
                 <property name="vexpand">True</property>
                 <property name="hscrollbar-policy">never</property>
-                <property name="vscrollbar-policy">never</property>
+                <property name="vscrollbar-policy">always</property>
                 <property name="shadow-type">in</property>
                 <child>
-                  <object class="GtkViewport">
+                  <object class="GtkIconView" id="gradientpresetlist">
                     <property name="visible">True</property>
-                    <property name="can-focus">False</property>
-                    <child>
-                      <object class="GtkDrawingArea" id="gradientpresetlist">
-                        <property name="visible">True</property>
-                        <property name="can-focus">True</property>
-                        <property name="events">GDK_BUTTON_MOTION_MASK | 
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_STRUCTURE_MASK</property>
-                        <property name="vexpand">True</property>
-                      </object>
-                    </child>
+                    <property name="item-padding">2</property>
+                    <property name="can-focus">True</property>
+                    <property name="hexpand">False</property>
+                    <property name="vexpand">True</property>
+                    <property name="model">liststore1</property>
+                    <property name="pixbuf-column">0</property>
+                    <property name="margin">6</property>
+                    <property name="columns">3</property>
+                    <property name="activate-on-single-click">True</property>
                   </object>
                 </child>
               </object>
diff --git a/sd/qa/uitest/impress_tests2/tdf125449.py 
b/sd/qa/uitest/impress_tests2/tdf125449.py
index 65e245b7a8dc..59acced973f9 100644
--- a/sd/qa/uitest/impress_tests2/tdf125449.py
+++ b/sd/qa/uitest/impress_tests2/tdf125449.py
@@ -38,7 +38,7 @@ class tdf125449(UITestCase):
             self.assertEqual(
               hex(document.DrawPages[0].Background.FillGradient.StartColor), 
'0xdde8cb')
             self.assertEqual(
-              document.DrawPages[0].Background.FillGradient.Angle, 450)
+              document.DrawPages[0].Background.FillGradient.Angle, 300)
             self.assertEqual(
               document.DrawPages[0].Background.FillGradient.Border, 0)
             self.assertEqual(
@@ -50,10 +50,9 @@ class tdf125449(UITestCase):
             self.assertEqual(
               document.DrawPages[0].Background.FillGradient.EndIntensity, 100)
 
-            # Without the patch in place, this test would have failed with
-            # AssertionError: '' != 'gradient'
+            # FillGradientName to match the first(default) preset's name
             self.assertEqual(
-              document.DrawPages[0].Background.FillGradientName, 'gradient')
+              document.DrawPages[0].Background.FillGradientName, 'Pastel 
Bouquet')
 
 
 # vim: set shiftwidth=4 softtabstop=4 expandtab:

Reply via email to