Bugfixing: optional content changed

This commit is contained in:
Jakub Melka
2020-01-02 12:06:09 +01:00
parent e9481fc446
commit 78b56ab007
4 changed files with 23 additions and 12 deletions

View File

@ -254,12 +254,16 @@ bool PDFTextLayoutGenerator::isContentKindSuppressed(ContentKind kind) const
void PDFTextLayoutGenerator::performOutputCharacter(const PDFTextCharacterInfo& info) void PDFTextLayoutGenerator::performOutputCharacter(const PDFTextCharacterInfo& info)
{ {
if (!isContentSuppressed())
{
m_textLayout.addCharacter(info); m_textLayout.addCharacter(info);
}
} }
PDFAsynchronousTextLayoutCompiler::PDFAsynchronousTextLayoutCompiler(PDFDrawWidgetProxy* proxy) : PDFAsynchronousTextLayoutCompiler::PDFAsynchronousTextLayoutCompiler(PDFDrawWidgetProxy* proxy) :
BaseClass(proxy), BaseClass(proxy),
m_proxy(proxy) m_proxy(proxy),
m_isRunning(false)
{ {
connect(&m_textLayoutCompileFutureWatcher, &QFutureWatcher<PDFTextLayoutStorage>::finished, this, &PDFAsynchronousTextLayoutCompiler::onTextLayoutCreated); connect(&m_textLayoutCompileFutureWatcher, &QFutureWatcher<PDFTextLayoutStorage>::finished, this, &PDFAsynchronousTextLayoutCompiler::onTextLayoutCreated);
} }
@ -348,15 +352,19 @@ void PDFAsynchronousTextLayoutCompiler::makeTextLayout()
return; return;
} }
if (m_textLayoutCompileFuture.isRunning()) if (m_isRunning)
{ {
// Text layout is already being processed // Text layout is already being processed
return; return;
} }
// Jakub Melka: Mark, that we are running (test for future is not enough,
// because future can finish before this function exits, for example)
m_isRunning = true;
ProgressStartupInfo info; ProgressStartupInfo info;
info.showDialog = true; info.showDialog = true;
info.text = tr("Generating text layouts for pages..."); info.text = tr("Indexing document contents...");
m_proxy->getFontCache()->setCacheShrinkEnabled(this, false); m_proxy->getFontCache()->setCacheShrinkEnabled(this, false);
const PDFCatalog* catalog = m_proxy->getDocument()->getCatalog(); const PDFCatalog* catalog = m_proxy->getDocument()->getCatalog();
@ -402,6 +410,7 @@ void PDFAsynchronousTextLayoutCompiler::onTextLayoutCreated()
m_proxy->getProgress()->finish(); m_proxy->getProgress()->finish();
m_textLayouts = m_textLayoutCompileFuture.result(); m_textLayouts = m_textLayoutCompileFuture.result();
m_isRunning = false;
emit textLayoutChanged(); emit textLayoutChanged();
} }

View File

@ -138,6 +138,7 @@ private:
PDFDrawWidgetProxy* m_proxy; PDFDrawWidgetProxy* m_proxy;
State m_state = State::Inactive; State m_state = State::Inactive;
bool m_isRunning;
std::optional<PDFTextLayoutStorage> m_textLayouts; std::optional<PDFTextLayoutStorage> m_textLayouts;
QFuture<PDFTextLayoutStorage> m_textLayoutCompileFuture; QFuture<PDFTextLayoutStorage> m_textLayoutCompileFuture;
QFutureWatcher<PDFTextLayoutStorage> m_textLayoutCompileFutureWatcher; QFutureWatcher<PDFTextLayoutStorage> m_textLayoutCompileFutureWatcher;

View File

@ -54,16 +54,10 @@ void PDFDrawSpaceController::setDocument(const PDFDocument* document, const PDFO
m_document = document; m_document = document;
m_fontCache.setDocument(document); m_fontCache.setDocument(document);
m_optionalContentActivity = optionalContentActivity; m_optionalContentActivity = optionalContentActivity;
connect(m_optionalContentActivity, &PDFOptionalContentActivity::optionalContentGroupStateChanged, this, &PDFDrawSpaceController::onOptionalContentGroupStateChanged);
recalculate(); recalculate();
} }
} }
void PDFDrawSpaceController::onOptionalContentGroupStateChanged()
{
emit pageImageChanged(true, { });
}
void PDFDrawSpaceController::setPageLayout(PageLayout pageLayout) void PDFDrawSpaceController::setPageLayout(PageLayout pageLayout)
{ {
if (m_pageLayoutMode != pageLayout) if (m_pageLayoutMode != pageLayout)
@ -423,6 +417,7 @@ void PDFDrawWidgetProxy::setDocument(const PDFDocument* document, const PDFOptio
m_compiler->stop(); m_compiler->stop();
m_textLayoutCompiler->stop(); m_textLayoutCompiler->stop();
m_controller->setDocument(document, optionalContentActivity); m_controller->setDocument(document, optionalContentActivity);
connect(optionalContentActivity, &PDFOptionalContentActivity::optionalContentGroupStateChanged, this, &PDFDrawWidgetProxy::onOptionalContentGroupStateChanged);
m_compiler->start(); m_compiler->start();
m_textLayoutCompiler->start(); m_textLayoutCompiler->start();
} }
@ -1196,4 +1191,11 @@ void PDFDrawWidgetProxy::onColorManagementSystemChanged()
emit pageImageChanged(true, { }); emit pageImageChanged(true, { });
} }
void PDFDrawWidgetProxy::onOptionalContentGroupStateChanged()
{
m_compiler->reset();
m_textLayoutCompiler->reset();
emit pageImageChanged(true, { });
}
} // namespace pdf } // namespace pdf

View File

@ -123,8 +123,6 @@ signals:
void pageImageChanged(bool all, const std::vector<PDFInteger>& pages); void pageImageChanged(bool all, const std::vector<PDFInteger>& pages);
private: private:
void onOptionalContentGroupStateChanged();
/// Recalculates the draw space. Preserves setted page rotation. /// Recalculates the draw space. Preserves setted page rotation.
void recalculate(); void recalculate();
@ -331,6 +329,7 @@ private:
QRectF fromDeviceSpace(const QRectF& rect) const; QRectF fromDeviceSpace(const QRectF& rect) const;
void onTextLayoutChanged(); void onTextLayoutChanged();
void onOptionalContentGroupStateChanged();
void onColorManagementSystemChanged(); void onColorManagementSystemChanged();
void onHorizontalScrollbarValueChanged(int value); void onHorizontalScrollbarValueChanged(int value);
void onVerticalScrollbarValueChanged(int value); void onVerticalScrollbarValueChanged(int value);