diff --git a/reader/document/XpsDocumentAdapter.cpp b/reader/document/XpsDocumentAdapter.cpp index b1f6cc85..dcbc7920 100644 --- a/reader/document/XpsDocumentAdapter.cpp +++ b/reader/document/XpsDocumentAdapter.cpp @@ -633,10 +633,14 @@ QImage XpsDocumentAdapter::renderPage(int pageIndex, int width, int height, cons ensurePageCache(); - QMutexLocker lock(&m_mutex); - if (pageIndex < 0 || pageIndex >= m_pageSizes.size()) { - qCWarning(appLog) << "Render request out of bounds" << pageIndex; - return QImage(); + QSizeF logicalSize; + { + QMutexLocker lock(&m_mutex); + if (pageIndex < 0 || pageIndex >= m_pageSizes.size()) { + qCWarning(appLog) << "Render request out of bounds" << pageIndex; + return QImage(); + } + logicalSize = m_pageSizes.at(pageIndex); } qCDebug(appLog) << "Rendering XPS page" << pageIndex << "@" << width << "x" << height << "slice" << slice; @@ -647,8 +651,6 @@ QImage XpsDocumentAdapter::renderPage(int pageIndex, int width, int height, cons logGError(QStringLiteral("gxps_document_get_page failed"), pageError.get()); return QImage(); } - - const QSizeF logicalSize = m_pageSizes.at(pageIndex); if (logicalSize.isEmpty() || logicalSize.width() <= 0.0 || logicalSize.height() <= 0.0) { qCWarning(appLog) << "Invalid logical size for XPS page" << logicalSize; return QImage(); diff --git a/reader/sidebar/SideBarImageViewModel.cpp b/reader/sidebar/SideBarImageViewModel.cpp index d1546e37..ad8ddb5d 100644 --- a/reader/sidebar/SideBarImageViewModel.cpp +++ b/reader/sidebar/SideBarImageViewModel.cpp @@ -11,6 +11,8 @@ #include #include +#include +#include ImagePageInfo_t::ImagePageInfo_t(int index): pageIndex(index) { @@ -41,6 +43,11 @@ SideBarImageViewModel::SideBarImageViewModel(DocSheet *sheet, QObject *parent) { qCDebug(appLog) << "SideBarImageViewModel created for document:" << (sheet ? sheet->filePath() : "null"); connect(m_sheet, &DocSheet::sigPageModified, this, &SideBarImageViewModel::onUpdateImage); + + m_batchUpdateTimer = new QTimer(this); + m_batchUpdateTimer->setSingleShot(true); + m_batchUpdateTimer->setInterval(100); + connect(m_batchUpdateTimer, &QTimer::timeout, this, &SideBarImageViewModel::onBatchUpdateTimer); } void SideBarImageViewModel::resetData() @@ -297,8 +304,36 @@ void SideBarImageViewModel::handleRenderThumbnail(int index, QPixmap pixmap) pixmap.setDevicePixelRatio(dApp->devicePixelRatio()); m_sheet->setThumbnail(index, pixmap); - const QList &modelIndexlst = getModelIndexForPageIndex(index); - qCDebug(appLog) << "Notifying" << modelIndexlst.size() << "views of data change"; - for (const QModelIndex &modelIndex : modelIndexlst) - emit dataChanged(modelIndex, modelIndex); + m_pendingUpdatePages.insert(index); + if (!m_batchUpdateTimer->isActive()) { + m_batchUpdateTimer->start(); + } +} + +void SideBarImageViewModel::onBatchUpdateTimer() +{ + if (m_pendingUpdatePages.isEmpty()) { + return; + } + + qCDebug(appLog) << "Batch updating" << m_pendingUpdatePages.size() << "thumbnails"; + + QList allModelIndexes; + for (int pageIndex : m_pendingUpdatePages) { + const QList &modelIndexlst = getModelIndexForPageIndex(pageIndex); + allModelIndexes.append(modelIndexlst); + } + + if (!allModelIndexes.isEmpty()) { + std::sort(allModelIndexes.begin(), allModelIndexes.end(), + [](const QModelIndex &a, const QModelIndex &b) { + return a.row() < b.row(); + }); + + for (const QModelIndex &modelIndex : allModelIndexes) { + emit dataChanged(modelIndex, modelIndex); + } + } + + m_pendingUpdatePages.clear(); } diff --git a/reader/sidebar/SideBarImageViewModel.h b/reader/sidebar/SideBarImageViewModel.h index 23b54f70..8e8b877e 100644 --- a/reader/sidebar/SideBarImageViewModel.h +++ b/reader/sidebar/SideBarImageViewModel.h @@ -8,6 +8,8 @@ #include #include +#include +#include namespace deepin_reader { class Annotation; @@ -201,12 +203,22 @@ public slots: */ bool setData(const QModelIndex &index, const QVariant &data, int role) override; +private slots: + /** + * @brief onBatchUpdateTimer + * 批量更新定时器触发 + */ + void onBatchUpdateTimer(); + private: QObject *m_parent = nullptr; DocSheet *m_sheet = nullptr; QList m_pagelst; QMap m_cacheBookMarkMap; static QMap> g_sheetPixmapMap; + + QTimer *m_batchUpdateTimer = nullptr; + QSet m_pendingUpdatePages; }; #endif // SIDEBARIMAGEVIEWMODEL_H