Styles preview cache cleanup on exit
Change-Id: I28929d4137008ebcca1733837d0b2112b6859a89 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152563 Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com> Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com> Reviewed-by: Szymon Kłos <szymon.klos@collabora.com> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152576 Tested-by: Jenkins
This commit is contained in:
committed by
Caolán McNamara
parent
5ad502af9c
commit
d8b834a750
@@ -199,9 +199,8 @@ public:
|
|||||||
|| name == "g_aWindowList"
|
|| name == "g_aWindowList"
|
||||||
//vcl/unx/gtk3/a11y/atkutil.cxx, asserted empty at exit
|
//vcl/unx/gtk3/a11y/atkutil.cxx, asserted empty at exit
|
||||||
|| name == "gFontPreviewVirDevs"
|
|| name == "gFontPreviewVirDevs"
|
||||||
|| (loplugin::DeclCheck(pVarDecl).Var("aPreviewCache")
|
|
||||||
.Class("StylesPreviewWindow_Base").GlobalNamespace()) // TODO: temp disable
|
|
||||||
//svtools/source/control/ctrlbox.cxx, empty at exit
|
//svtools/source/control/ctrlbox.cxx, empty at exit
|
||||||
|
|| name == "gStylePreviewCache" // svx/source/tbxctrls/StylesPreviewWindow.cxx
|
||||||
|| name == "aLogger" // FormulaLogger& FormulaLogger::get() in sc/source/core/tool/formulalogger.cxx
|
|| name == "aLogger" // FormulaLogger& FormulaLogger::get() in sc/source/core/tool/formulalogger.cxx
|
||||||
|| name == "s_aUncommittedRegistrations" // sw/source/uibase/dbui/dbmgr.cxx
|
|| name == "s_aUncommittedRegistrations" // sw/source/uibase/dbui/dbmgr.cxx
|
||||||
|| (loplugin::DeclCheck(pVarDecl).Var("aAllListeners")
|
|| (loplugin::DeclCheck(pVarDecl).Var("aAllListeners")
|
||||||
|
@@ -127,8 +127,6 @@ private:
|
|||||||
void UpdateStylesList();
|
void UpdateStylesList();
|
||||||
void UpdateSelection();
|
void UpdateSelection();
|
||||||
bool Command(const CommandEvent& rEvent);
|
bool Command(const CommandEvent& rEvent);
|
||||||
|
|
||||||
static std::map<OUString, VclPtr<VirtualDevice>> aPreviewCache;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class StylesPreviewWindow_Impl final : public InterimItemWindow, public StylesPreviewWindow_Base
|
class StylesPreviewWindow_Impl final : public InterimItemWindow, public StylesPreviewWindow_Base
|
||||||
|
@@ -60,7 +60,36 @@
|
|||||||
|
|
||||||
#include <vcl/commandevent.hxx>
|
#include <vcl/commandevent.hxx>
|
||||||
|
|
||||||
std::map<OUString, VclPtr<VirtualDevice>> StylesPreviewWindow_Base::aPreviewCache;
|
namespace
|
||||||
|
{
|
||||||
|
class StylePreviewCache
|
||||||
|
{
|
||||||
|
static std::map<OUString, VclPtr<VirtualDevice>> gStylePreviewCache;
|
||||||
|
static int gStylePreviewCacheClients;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static std::map<OUString, VclPtr<VirtualDevice>>& Get() { return gStylePreviewCache; }
|
||||||
|
|
||||||
|
static void ClearCache()
|
||||||
|
{
|
||||||
|
for (auto& aPreview : gStylePreviewCache)
|
||||||
|
aPreview.second.disposeAndClear();
|
||||||
|
|
||||||
|
gStylePreviewCache.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void RegisterClient() { gStylePreviewCacheClients++; }
|
||||||
|
static void UnregisterClient()
|
||||||
|
{
|
||||||
|
gStylePreviewCacheClients--;
|
||||||
|
if (!gStylePreviewCacheClients)
|
||||||
|
ClearCache();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
std::map<OUString, VclPtr<VirtualDevice>> StylePreviewCache::gStylePreviewCache;
|
||||||
|
int StylePreviewCache::gStylePreviewCacheClients;
|
||||||
|
}
|
||||||
|
|
||||||
StyleStatusListener::StyleStatusListener(
|
StyleStatusListener::StyleStatusListener(
|
||||||
StylesPreviewWindow_Base* pPreviewControl,
|
StylesPreviewWindow_Base* pPreviewControl,
|
||||||
@@ -103,8 +132,10 @@ StylePoolChangeListener::~StylePoolChangeListener()
|
|||||||
EndListening(*m_pStyleSheetPool);
|
EndListening(*m_pStyleSheetPool);
|
||||||
}
|
}
|
||||||
|
|
||||||
void StylePoolChangeListener::Notify(SfxBroadcaster& /*rBC*/, const SfxHint& /*rHint*/)
|
void StylePoolChangeListener::Notify(SfxBroadcaster& /*rBC*/, const SfxHint& rHint)
|
||||||
{
|
{
|
||||||
|
if (rHint.GetId() == SfxHintId::StyleSheetModified)
|
||||||
|
StylePreviewCache::ClearCache();
|
||||||
m_pPreviewControl->RequestStylesListUpdate();
|
m_pPreviewControl->RequestStylesListUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -378,6 +409,8 @@ StylesPreviewWindow_Base::StylesPreviewWindow_Base(
|
|||||||
, m_aUpdateTask(*this)
|
, m_aUpdateTask(*this)
|
||||||
, m_aDefaultStyles(std::move(aDefaultStyles))
|
, m_aDefaultStyles(std::move(aDefaultStyles))
|
||||||
{
|
{
|
||||||
|
StylePreviewCache::RegisterClient();
|
||||||
|
|
||||||
m_xStylesView->connect_selection_changed(LINK(this, StylesPreviewWindow_Base, Selected));
|
m_xStylesView->connect_selection_changed(LINK(this, StylesPreviewWindow_Base, Selected));
|
||||||
m_xStylesView->connect_item_activated(LINK(this, StylesPreviewWindow_Base, DoubleClick));
|
m_xStylesView->connect_item_activated(LINK(this, StylesPreviewWindow_Base, DoubleClick));
|
||||||
m_xStylesView->connect_command(LINK(this, StylesPreviewWindow_Base, DoCommand));
|
m_xStylesView->connect_command(LINK(this, StylesPreviewWindow_Base, DoCommand));
|
||||||
@@ -424,6 +457,8 @@ StylesPreviewWindow_Base::~StylesPreviewWindow_Base()
|
|||||||
|
|
||||||
m_aUpdateTask.Stop();
|
m_aUpdateTask.Stop();
|
||||||
|
|
||||||
|
StylePreviewCache::UnregisterClient();
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
m_xStatusListener->dispose();
|
m_xStatusListener->dispose();
|
||||||
@@ -465,8 +500,9 @@ void StylesListUpdateTask::Invoke()
|
|||||||
VclPtr<VirtualDevice>
|
VclPtr<VirtualDevice>
|
||||||
StylesPreviewWindow_Base::GetCachedPreview(const std::pair<OUString, OUString>& rStyle)
|
StylesPreviewWindow_Base::GetCachedPreview(const std::pair<OUString, OUString>& rStyle)
|
||||||
{
|
{
|
||||||
if (aPreviewCache.find(rStyle.second) != aPreviewCache.end())
|
auto aFound = StylePreviewCache::Get().find(rStyle.second);
|
||||||
return aPreviewCache[rStyle.second];
|
if (aFound != StylePreviewCache::Get().end())
|
||||||
|
return StylePreviewCache::Get()[rStyle.second];
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
VclPtr<VirtualDevice> pImg = VclPtr<VirtualDevice>::Create();
|
VclPtr<VirtualDevice> pImg = VclPtr<VirtualDevice>::Create();
|
||||||
@@ -475,7 +511,7 @@ StylesPreviewWindow_Base::GetCachedPreview(const std::pair<OUString, OUString>&
|
|||||||
|
|
||||||
StyleItemController aStyleController(rStyle);
|
StyleItemController aStyleController(rStyle);
|
||||||
aStyleController.Paint(*pImg);
|
aStyleController.Paint(*pImg);
|
||||||
aPreviewCache[rStyle.second] = pImg;
|
StylePreviewCache::Get()[rStyle.second] = pImg;
|
||||||
|
|
||||||
return pImg;
|
return pImg;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user