summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/svx/fontworkgallery.hxx7
-rw-r--r--include/vcl/weld.hxx9
-rw-r--r--svx/source/tbxctrls/fontworkgallery.cxx54
-rw-r--r--svx/uiconfig/ui/fontworkgallerydialog.ui37
-rw-r--r--vcl/source/app/salvtables.cxx41
-rw-r--r--vcl/unx/gtk3/gtk3gtkinst.cxx28
6 files changed, 122 insertions, 54 deletions
diff --git a/include/svx/fontworkgallery.hxx b/include/svx/fontworkgallery.hxx
index 12648ebd6a19..3fa657305ad6 100644
--- a/include/svx/fontworkgallery.hxx
+++ b/include/svx/fontworkgallery.hxx
@@ -52,17 +52,16 @@ class SAL_WARN_UNUSED SVXCORE_DLLPUBLIC FontWorkGalleryDialog final : public wel
SdrObject** mppSdrObject;
SdrModel* mpDestModel;
- std::vector<BitmapEx> maFavoritesHorizontal;
+ std::vector<VclPtr< VirtualDevice >> maFavoritesHorizontal;
- ValueSet maCtlFavorites;
- std::unique_ptr<weld::CustomWeld> mxCtlFavorites;
+ std::unique_ptr<weld::IconView> maCtlFavorites;
std::unique_ptr<weld::Button> mxOKButton;
void initFavorites(sal_uInt16 nThemeId);
void insertSelectedFontwork();
void fillFavorites(sal_uInt16 nThemeId);
- DECL_LINK(DoubleClickFavoriteHdl, ValueSet*, void);
+ DECL_LINK(DoubleClickFavoriteHdl, weld::IconView&, bool);
DECL_LINK(ClickOKHdl, weld::Button&, void );
public:
diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index e4524a4dc9b5..29167234a31c 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -1253,11 +1253,20 @@ public:
const OUString* pIconName, TreeIter* pRet)
= 0;
+ virtual void insert(int pos, const OUString* pStr, const OUString* pId,
+ const VirtualDevice* pIcon, TreeIter* pRet)
+ = 0;
+
void append(const OUString& rId, const OUString& rStr, const OUString& rImage)
{
insert(-1, &rStr, &rId, &rImage, nullptr);
}
+ void append(const OUString& rId, const OUString& rStr, const VirtualDevice* pImage)
+ {
+ insert(-1, &rStr, &rId, pImage, nullptr);
+ }
+
void connect_selection_changed(const Link<IconView&, void>& rLink)
{
m_aSelectionChangeHdl = rLink;
diff --git a/svx/source/tbxctrls/fontworkgallery.cxx b/svx/source/tbxctrls/fontworkgallery.cxx
index a1b28688f13a..efef6f786e0d 100644
--- a/svx/source/tbxctrls/fontworkgallery.cxx
+++ b/svx/source/tbxctrls/fontworkgallery.cxx
@@ -48,29 +48,21 @@ using namespace ::com::sun::star::beans;
namespace svx
{
-const int nColCount = 4;
-const int nLineCount = 4;
-
FontWorkGalleryDialog::FontWorkGalleryDialog(weld::Window* pParent, SdrView& rSdrView)
: GenericDialogController(pParent, "svx/ui/fontworkgallerydialog.ui", "FontworkGalleryDialog")
, mnThemeId(0xffff)
, mrSdrView(rSdrView)
, mppSdrObject(nullptr)
, mpDestModel(nullptr)
- , maCtlFavorites(m_xBuilder->weld_scrolled_window("ctlFavoriteswin", true))
- , mxCtlFavorites(new weld::CustomWeld(*m_xBuilder, "ctlFavorites", maCtlFavorites))
+ , maCtlFavorites(m_xBuilder->weld_icon_view("ctlFavoriteswin"))
, mxOKButton(m_xBuilder->weld_button("ok"))
{
- Size aSize(maCtlFavorites.GetDrawingArea()->get_ref_device().LogicToPixel(Size(200, 200), MapMode(MapUnit::MapAppFont)));
- mxCtlFavorites->set_size_request(aSize.Width(), aSize.Height());
+ Size aSize(530, 400);
+ maCtlFavorites->set_size_request(aSize.Width(), aSize.Height());
- maCtlFavorites.SetDoubleClickHdl( LINK( this, FontWorkGalleryDialog, DoubleClickFavoriteHdl ) );
+ maCtlFavorites->connect_item_activated( LINK( this, FontWorkGalleryDialog, DoubleClickFavoriteHdl ) );
mxOKButton->connect_clicked(LINK(this, FontWorkGalleryDialog, ClickOKHdl));
- maCtlFavorites.SetColCount( nColCount );
- maCtlFavorites.SetLineCount( nLineCount );
- maCtlFavorites.SetExtraSpacing( 3 );
-
initFavorites( GALLERY_THEME_FONTWORK );
fillFavorites( GALLERY_THEME_FONTWORK );
}
@@ -96,7 +88,7 @@ void FontWorkGalleryDialog::initFavorites(sal_uInt16 nThemeId)
if (GalleryExplorer::GetSdrObj(nThemeId, nModelPos, pModel, &aThumb) && !!aThumb)
{
- ScopedVclPtrInstance< VirtualDevice > pVDev;
+ VclPtr< VirtualDevice > pVDev = VclPtr<VirtualDevice>::Create();
const Point aNull(0, 0);
if (pVDev->GetDPIScaleFactor() > 1)
@@ -113,7 +105,7 @@ void FontWorkGalleryDialog::initFavorites(sal_uInt16 nThemeId)
pVDev->DrawCheckered(aNull, aSize, nLen, aW, aG);
pVDev->DrawBitmapEx(aNull, aThumb);
- maFavoritesHorizontal.emplace_back(pVDev->GetBitmapEx(aNull, aSize));
+ maFavoritesHorizontal.emplace_back(pVDev);
}
}
@@ -125,33 +117,18 @@ void FontWorkGalleryDialog::fillFavorites(sal_uInt16 nThemeId)
{
mnThemeId = nThemeId;
- Size aThumbSize(maCtlFavorites.GetOutputSizePixel());
- aThumbSize.setWidth( aThumbSize.Width() / nColCount );
- aThumbSize.setHeight( aThumbSize.Height() / nLineCount );
- aThumbSize.AdjustWidth( -12 );
- aThumbSize.AdjustHeight( -12 );
-
auto nFavCount = maFavoritesHorizontal.size();
- // ValueSet favorites
- if( nFavCount > (nColCount * nLineCount) )
- {
- WinBits nWinBits = maCtlFavorites.GetStyle();
- nWinBits |= WB_VSCROLL;
- maCtlFavorites.SetStyle( nWinBits );
- }
-
- maCtlFavorites.Clear();
+ maCtlFavorites->clear();
for( size_t nFavorite = 1; nFavorite <= nFavCount; nFavorite++ )
{
- OUString aStr = SvxResId(RID_SVXFLOAT3D_FAVORITE) + " " + OUString::number(nFavorite);
- Image aThumbImage( maFavoritesHorizontal[nFavorite-1] );
- maCtlFavorites.InsertItem( static_cast<sal_uInt16>(nFavorite), aThumbImage, aStr );
+ OUString sId = OUString::number(static_cast<sal_uInt16>(nFavorite));
+ maCtlFavorites->append(sId, "", maFavoritesHorizontal[nFavorite-1]);
}
- if (maCtlFavorites.GetItemCount())
- maCtlFavorites.SelectItem(1);
+ if (maCtlFavorites->n_children())
+ maCtlFavorites->select(0);
}
void FontWorkGalleryDialog::SetSdrObjectRef( SdrObject** ppSdrObject, SdrModel* pModel )
@@ -162,7 +139,11 @@ void FontWorkGalleryDialog::SetSdrObjectRef( SdrObject** ppSdrObject, SdrModel*
void FontWorkGalleryDialog::insertSelectedFontwork()
{
- sal_uInt16 nItemId = maCtlFavorites.GetSelectedItemId();
+ OUString sItemId = maCtlFavorites->get_selected_id();
+ if (sItemId.isEmpty())
+ return;
+
+ sal_Int32 nItemId = sItemId.toInt32();
if (nItemId == 0)
return;
@@ -244,10 +225,11 @@ IMPL_LINK_NOARG(FontWorkGalleryDialog, ClickOKHdl, weld::Button&, void)
m_xDialog->response(RET_OK);
}
-IMPL_LINK_NOARG(FontWorkGalleryDialog, DoubleClickFavoriteHdl, ValueSet*, void)
+IMPL_LINK_NOARG(FontWorkGalleryDialog, DoubleClickFavoriteHdl, weld::IconView&, bool)
{
insertSelectedFontwork();
m_xDialog->response(RET_OK);
+ return true;
}
namespace {
diff --git a/svx/uiconfig/ui/fontworkgallerydialog.ui b/svx/uiconfig/ui/fontworkgallerydialog.ui
index 683832e39d70..72cbdeff46cf 100644
--- a/svx/uiconfig/ui/fontworkgallerydialog.ui
+++ b/svx/uiconfig/ui/fontworkgallerydialog.ui
@@ -2,6 +2,16 @@
<!-- Generated with glade 3.22.1 -->
<interface domain="svx">
<requires lib="gtk+" version="3.20"/>
+ <object class="GtkTreeStore" id="liststore1">
+ <columns>
+ <!-- column-name expander -->
+ <column type="GdkPixbuf"/>
+ <!-- column-name text -->
+ <column type="gchararray"/>
+ <!-- column-name id -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
<object class="GtkDialog" id="FontworkGalleryDialog">
<property name="can_focus">False</property>
<property name="border_width">6</property>
@@ -98,25 +108,24 @@
</packing>
</child>
<child>
- <object class="GtkScrolledWindow" id="ctlFavoriteswin">
+ <object class="GtkScrolledWindow">
<property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can_focus">True</property>
<property name="hexpand">True</property>
- <property name="hscrollbar_policy">never</property>
- <property name="vscrollbar_policy">never</property>
+ <property name="vexpand">True</property>
<property name="shadow_type">in</property>
<child>
- <object class="GtkViewport">
+ <object class="GtkIconView" id="ctlFavoriteswin">
<property name="visible">True</property>
- <property name="can_focus">False</property>
- <child>
- <object class="GtkDrawingArea" id="ctlFavorites">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property>
- <property name="hexpand">True</property>
- </object>
- </child>
+ <property name="can_focus">True</property>
+ <property name="margin">6</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="model">liststore1</property>
+ <property name="columns">3</property>
+ <property name="item_width">100</property>
+ <property name="pixbuf-column">0</property>
+ <property name="text-column">1</property>
</object>
</child>
</object>
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index e8755eb5b1d5..0aa3db724e91 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -5115,6 +5115,47 @@ public:
enable_notify_events();
}
+ virtual void insert(int pos, const OUString* pStr, const OUString* pId,
+ const VirtualDevice* pIcon, weld::TreeIter* pRet) override
+ {
+ disable_notify_events();
+ auto nInsertPos = pos == -1 ? TREELIST_APPEND : pos;
+ void* pUserData;
+ if (pId)
+ {
+ m_aUserData.emplace_back(std::make_unique<OUString>(*pId));
+ pUserData = m_aUserData.back().get();
+ }
+ else
+ pUserData = nullptr;
+
+ SvTreeListEntry* pEntry = new SvTreeListEntry;
+ if (pIcon)
+ {
+ const Point aNull(0, 0);
+ const Size aSize = pIcon->GetOutputSizePixel();
+ Image aImage(pIcon->GetBitmapEx(aNull, aSize));
+ pEntry->AddItem(std::make_unique<SvLBoxContextBmp>(aImage, aImage, false));
+ }
+ else
+ {
+ Image aDummy;
+ pEntry->AddItem(std::make_unique<SvLBoxContextBmp>(aDummy, aDummy, false));
+ }
+ if (pStr)
+ pEntry->AddItem(std::make_unique<SvLBoxString>(*pStr));
+ pEntry->SetUserData(pUserData);
+ m_xIconView->Insert(pEntry, nullptr, nInsertPos);
+
+ if (pRet)
+ {
+ SalInstanceTreeIter* pVclRetIter = static_cast<SalInstanceTreeIter*>(pRet);
+ pVclRetIter->iter = pEntry;
+ }
+
+ enable_notify_events();
+ }
+
virtual OUString get_selected_id() const override
{
assert(m_xIconView->IsUpdateMode() && "don't request selection when frozen");
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index 39c826823d01..0ef2b33239cf 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -12467,6 +12467,21 @@ private:
}
}
+ void insert_item(GtkTreeIter& iter, int pos, const OUString* pId, const OUString* pText, const VirtualDevice* pIcon)
+ {
+ gtk_tree_store_insert_with_values(m_pTreeStore, &iter, nullptr, pos,
+ m_nTextCol, !pText ? nullptr : OUStringToOString(*pText, RTL_TEXTENCODING_UTF8).getStr(),
+ m_nIdCol, !pId ? nullptr : OUStringToOString(*pId, RTL_TEXTENCODING_UTF8).getStr(),
+ -1);
+ if (pIcon)
+ {
+ GdkPixbuf* pixbuf = getPixbuf(*pIcon);
+ gtk_tree_store_set(m_pTreeStore, &iter, m_nImageCol, pixbuf, -1);
+ if (pixbuf)
+ g_object_unref(pixbuf);
+ }
+ }
+
OUString get(const GtkTreeIter& iter, int col) const
{
GtkTreeModel *pModel = GTK_TREE_MODEL(m_pTreeStore);
@@ -12527,6 +12542,19 @@ public:
enable_notify_events();
}
+ virtual void insert(int pos, const OUString* pText, const OUString* pId, const VirtualDevice* pIcon, weld::TreeIter* pRet) override
+ {
+ disable_notify_events();
+ GtkTreeIter iter;
+ insert_item(iter, pos, pId, pText, pIcon);
+ if (pRet)
+ {
+ GtkInstanceTreeIter* pGtkRetIter = static_cast<GtkInstanceTreeIter*>(pRet);
+ pGtkRetIter->iter = iter;
+ }
+ enable_notify_events();
+ }
+
virtual OUString get_selected_id() const override
{
assert(gtk_icon_view_get_model(m_pIconView) && "don't request selection when frozen");