From 5972e171463766dbb3203aeb03d355ff7d3bb177 Mon Sep 17 00:00:00 2001 From: Jakub Melka Date: Sat, 2 Oct 2021 19:30:18 +0200 Subject: [PATCH] DocDiff application: colored icons --- Pdf4QtDocDiff/differencesdockwidget.cpp | 66 +++++++++++++++++++------ Pdf4QtDocDiff/differencesdockwidget.h | 13 +++-- Pdf4QtDocDiff/mainwindow.cpp | 12 ++--- Pdf4QtLib/sources/pdfdiff.cpp | 30 +++++++++++ Pdf4QtLib/sources/pdfdiff.h | 12 +++++ 5 files changed, 106 insertions(+), 27 deletions(-) diff --git a/Pdf4QtDocDiff/differencesdockwidget.cpp b/Pdf4QtDocDiff/differencesdockwidget.cpp index 4476f94..09ede34 100644 --- a/Pdf4QtDocDiff/differencesdockwidget.cpp +++ b/Pdf4QtDocDiff/differencesdockwidget.cpp @@ -21,6 +21,7 @@ #include "pdfdiff.h" #include "pdfwidgetutils.h" +#include #include namespace pdfdocdiff @@ -42,6 +43,8 @@ void DifferenceItemDelegate::paint(QPainter* painter, QSize DifferenceItemDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const { + QStyleOptionViewItem adjustedOption = option; + if (!option.rect.isValid()) { // Jakub Melka: Why this? We need to use text wrapping. Unfortunately, @@ -49,7 +52,7 @@ QSize DifferenceItemDelegate::sizeHint(const QStyleOptionViewItem& option, // for word wrap calculation. So we must manually calculate rectangle width. // Of course, we cant use visualRect of the tree widget, because of cyclical // dependence. - QStyleOptionViewItem adjustedOption = option; + const QTreeWidget* treeWidget = qobject_cast(option.widget); int xOffset = treeWidget->columnViewportPosition(index.column()); int height = option.fontMetrics.lineSpacing(); @@ -66,21 +69,25 @@ QSize DifferenceItemDelegate::sizeHint(const QStyleOptionViewItem& option, xOffset += level * treeWidget->indentation(); adjustedOption.rect = QRect(xOffset, yOffset, width - xOffset, height); - return BaseClass::sizeHint(adjustedOption, index); } - return BaseClass::sizeHint(option, index); + return BaseClass::sizeHint(adjustedOption, index); } -DifferencesDockWidget::DifferencesDockWidget(QWidget *parent) : +DifferencesDockWidget::DifferencesDockWidget(QWidget* parent, + pdf::PDFDiffResult* diffResult, + pdf::PDFDiffResultNavigator* diffNavigator, + Settings* settings) : QDockWidget(parent), ui(new Ui::DifferencesDockWidget), - m_diffResult(nullptr), - m_diffNavigator(nullptr) + m_diffResult(diffResult), + m_diffNavigator(diffNavigator), + m_settings(settings) { ui->setupUi(this); ui->differencesTreeWidget->setItemDelegate(new DifferenceItemDelegate(this)); + ui->differencesTreeWidget->setIconSize(pdf::PDFWidgetUtils::scaleDPI(ui->differencesTreeWidget, QSize(16, 16))); setMinimumWidth(pdf::PDFWidgetUtils::scaleDPI_x(this, 120)); } @@ -90,6 +97,32 @@ DifferencesDockWidget::~DifferencesDockWidget() delete ui; } +QColor DifferencesDockWidget::getColorForIndex(size_t index) const +{ + QColor color; + + const size_t resultIndex = index; + + if (m_diffResult->isReplaceDifference(resultIndex)) + { + color = m_settings->colorReplaced; + } + else if (m_diffResult->isRemoveDifference(resultIndex)) + { + color = m_settings->colorRemoved; + } + else if (m_diffResult->isAddDifference(resultIndex)) + { + color = m_settings->colorAdded; + } + else if (m_diffResult->isPageMoveDifference(resultIndex)) + { + color = m_settings->colorPageMove; + } + + return color; +} + void DifferencesDockWidget::update() { ui->differencesTreeWidget->clear(); @@ -147,6 +180,17 @@ void DifferencesDockWidget::update() QTreeWidgetItem* item = new QTreeWidgetItem(parent, QStringList() << m_diffResult->getMessage(i)); item->setData(0, Qt::UserRole, i); + + QColor color = getColorForIndex(i); + + if (color.isValid()) + { + QPixmap pixmap(ui->differencesTreeWidget->iconSize()); + pixmap.fill(color); + QIcon icon(pixmap); + + item->setData(0, Qt::DecorationRole, icon); + } } } @@ -154,14 +198,4 @@ void DifferencesDockWidget::update() ui->differencesTreeWidget->expandAll(); } -void DifferencesDockWidget::setDiffResult(pdf::PDFDiffResult* diffResult) -{ - m_diffResult = diffResult; -} - -void DifferencesDockWidget::setDiffNavigator(pdf::PDFDiffResultNavigator* diffNavigator) -{ - m_diffNavigator = diffNavigator; -} - } // namespace pdfdocdiff diff --git a/Pdf4QtDocDiff/differencesdockwidget.h b/Pdf4QtDocDiff/differencesdockwidget.h index e9594ff..4b930e0 100644 --- a/Pdf4QtDocDiff/differencesdockwidget.h +++ b/Pdf4QtDocDiff/differencesdockwidget.h @@ -18,6 +18,8 @@ #ifndef DIFFERENCESDOCKWIDGET_H #define DIFFERENCESDOCKWIDGET_H +#include "settings.h" + #include #include @@ -54,19 +56,22 @@ class DifferencesDockWidget : public QDockWidget Q_OBJECT public: - explicit DifferencesDockWidget(QWidget* parent); + explicit DifferencesDockWidget(QWidget* parent, + pdf::PDFDiffResult* diffResult, + pdf::PDFDiffResultNavigator* diffNavigator, + Settings* settings); virtual ~DifferencesDockWidget() override; void update(); - void setDiffResult(pdf::PDFDiffResult* diffResult); - void setDiffNavigator(pdf::PDFDiffResultNavigator* diffNavigator); - private: Ui::DifferencesDockWidget* ui; + QColor getColorForIndex(size_t index) const; + pdf::PDFDiffResult* m_diffResult; pdf::PDFDiffResultNavigator* m_diffNavigator; + Settings* m_settings; }; } // namespace pdfdocdiff diff --git a/Pdf4QtDocDiff/mainwindow.cpp b/Pdf4QtDocDiff/mainwindow.cpp index 9ce99cf..5202930 100644 --- a/Pdf4QtDocDiff/mainwindow.cpp +++ b/Pdf4QtDocDiff/mainwindow.cpp @@ -58,9 +58,7 @@ MainWindow::MainWindow(QWidget* parent) : m_settingsDockWidget = new SettingsDockWidget(this); addDockWidget(Qt::LeftDockWidgetArea, m_settingsDockWidget);; - m_differencesDockWidget = new DifferencesDockWidget(this); - m_differencesDockWidget->setDiffResult(&m_filteredDiffResult); - m_differencesDockWidget->setDiffNavigator(&m_diffNavigator); + m_differencesDockWidget = new DifferencesDockWidget(this, &m_filteredDiffResult, &m_diffNavigator, &m_settings); addDockWidget(Qt::LeftDockWidgetArea, m_differencesDockWidget); ui->menuView->addSeparator(); @@ -233,10 +231,10 @@ void MainWindow::loadSettings() settings.beginGroup("Settings"); m_settings.directory = settings.value("directory").toString(); - m_settings.colorPageMove = settings.value("colorPageMove").value(); - m_settings.colorAdded = settings.value("colorAdded").value(); - m_settings.colorRemoved = settings.value("colorRemoved").value(); - m_settings.colorReplaced = settings.value("colorReplaced").value(); + m_settings.colorPageMove = settings.value("colorPageMove", m_settings.colorPageMove).value(); + m_settings.colorAdded = settings.value("colorAdded", m_settings.colorAdded).value(); + m_settings.colorRemoved = settings.value("colorRemoved", m_settings.colorRemoved).value(); + m_settings.colorReplaced = settings.value("colorReplaced", m_settings.colorReplaced).value(); settings.endGroup(); } diff --git a/Pdf4QtLib/sources/pdfdiff.cpp b/Pdf4QtLib/sources/pdfdiff.cpp index 6589f52..ffde315 100644 --- a/Pdf4QtLib/sources/pdfdiff.cpp +++ b/Pdf4QtLib/sources/pdfdiff.cpp @@ -1074,6 +1074,16 @@ void PDFDiffResult::finalize() } } +uint32_t PDFDiffResult::getTypeFlags(size_t index) const +{ + if (index >= m_differences.size()) + { + return 0; + } + + return uint32_t(m_differences[index].type); +} + QString PDFDiffResult::getMessage(size_t index) const { if (index >= m_differences.size()) @@ -1154,6 +1164,26 @@ PDFInteger PDFDiffResult::getRightPage(size_t index) const return m_differences[index].pageIndex2; } +bool PDFDiffResult::isPageMoveDifference(size_t index) const +{ + return getTypeFlags(index) & FLAGS_TYPE_PAGE_MOVE; +} + +bool PDFDiffResult::isAddDifference(size_t index) const +{ + return getTypeFlags(index) & FLAGS_TYPE_ADD; +} + +bool PDFDiffResult::isRemoveDifference(size_t index) const +{ + return getTypeFlags(index) & FLAGS_TYPE_REMOVE; +} + +bool PDFDiffResult::isReplaceDifference(size_t index) const +{ + return getTypeFlags(index) & FLAGS_TYPE_REPLACE; +} + PDFDiffResult PDFDiffResult::filter(bool filterPageMoveDifferences, bool filterTextDifferences, bool filterVectorGraphicsDifferences, diff --git a/Pdf4QtLib/sources/pdfdiff.h b/Pdf4QtLib/sources/pdfdiff.h index 36e9118..c328bfb 100644 --- a/Pdf4QtLib/sources/pdfdiff.h +++ b/Pdf4QtLib/sources/pdfdiff.h @@ -87,6 +87,11 @@ public: /// \param index Index PDFInteger getRightPage(size_t index) const; + bool isPageMoveDifference(size_t index) const; + bool isAddDifference(size_t index) const; + bool isRemoveDifference(size_t index) const; + bool isReplaceDifference(size_t index) const; + bool hasPageMoveDifferences() const { return m_typeFlags & FLAGS_PAGE_MOVE; } bool hasTextDifferences() const { return m_typeFlags & FLAGS_TEXT; } bool hasVectorGraphicsDifferences() const { return m_typeFlags & FLAGS_VECTOR_GRAPHICS; } @@ -114,6 +119,11 @@ private: static constexpr uint32_t FLAGS_IMAGE = uint32_t(Type::RemovedImageContent) | uint32_t(Type::AddedImageContent); static constexpr uint32_t FLAGS_SHADING = uint32_t(Type::RemovedShadingContent) | uint32_t(Type::AddedShadingContent); + static constexpr uint32_t FLAGS_TYPE_PAGE_MOVE = uint32_t(Type::PageMoved); + static constexpr uint32_t FLAGS_TYPE_ADD = uint32_t(Type::PageAdded) | uint32_t(Type::AddedTextCharContent) | uint32_t(Type::AddedVectorGraphicContent) | uint32_t(Type::AddedImageContent) | uint32_t(Type::AddedShadingContent) | uint32_t(Type::TextAdded); + static constexpr uint32_t FLAGS_TYPE_REMOVE = uint32_t(Type::PageRemoved) | uint32_t(Type::RemovedTextCharContent) | uint32_t(Type::RemovedVectorGraphicContent) | uint32_t(Type::RemovedImageContent) | uint32_t(Type::RemovedShadingContent) | uint32_t(Type::TextRemoved); + static constexpr uint32_t FLAGS_TYPE_REPLACE = uint32_t(Type::TextReplaced); + void addPageMoved(PDFInteger pageIndex1, PDFInteger pageIndex2); void addPageAdded(PDFInteger pageIndex); void addPageRemoved(PDFInteger pageIndex); @@ -139,6 +149,8 @@ private: void finalize(); + uint32_t getTypeFlags(size_t index) const; + /// Single content difference descriptor. It describes type /// of difference (such as graphics, image, text change) on a page /// or on a list of multiple pages.