DocDiff application: colors

This commit is contained in:
Jakub Melka 2021-10-17 17:33:57 +02:00
parent 1f20a6efda
commit da1efc4ba4
6 changed files with 318 additions and 66 deletions

View File

@ -62,8 +62,9 @@ MainWindow::MainWindow(QWidget* parent) :
// Initialize task bar progress
m_progressTaskbarIndicator = m_taskbarButton->progress();
m_settingsDockWidget = new SettingsDockWidget(this);
m_settingsDockWidget = new SettingsDockWidget(&m_settings, this);
addDockWidget(Qt::LeftDockWidgetArea, m_settingsDockWidget);;
connect(m_settingsDockWidget, &SettingsDockWidget::colorsChanged, this, &MainWindow::onColorsChanged);
m_differencesDockWidget = new DifferencesDockWidget(this, &m_diffResult, &m_filteredDiffResult, &m_diffNavigator, &m_settings);
addDockWidget(Qt::LeftDockWidgetArea, m_differencesDockWidget);
@ -235,6 +236,12 @@ void MainWindow::onComparationFinished()
updateAll(true);
}
void MainWindow::onColorsChanged()
{
updateFilteredResult();
m_pdfWidget->update();
}
void MainWindow::updateActions()
{
QList<QAction*> actions = findChildren<QAction*>();
@ -321,8 +328,15 @@ void MainWindow::loadSettings()
m_settings.displayMarkers = settings.value("displayMarkers", m_settings.displayDifferences).toBool();
settings.endGroup();
settings.beginGroup("Compare");
m_settingsDockWidget->setCompareTextsAsVectorGraphics(settings.value("compareTextsAsVectorGraphics", false).toBool());
m_settingsDockWidget->setCompareTextCharactersInsteadOfWords(settings.value("compareTextCharactersInsteadOfWords", false).toBool());
settings.endGroup();
ui->actionDisplay_Differences->setChecked(m_settings.displayDifferences);
ui->actionDisplay_Markers->setChecked(m_settings.displayMarkers);
m_settingsDockWidget->loadColors();
}
void MainWindow::saveSettings()
@ -340,7 +354,12 @@ void MainWindow::saveSettings()
settings.setValue("colorRemoved", m_settings.colorRemoved);
settings.setValue("colorReplaced", m_settings.colorReplaced);
settings.setValue("displayDifferences", m_settings.displayDifferences);
settings.setValue("displayMarkers", m_settings.displayDifferences);
settings.setValue("displayMarkers", m_settings.displayMarkers);
settings.endGroup();
settings.beginGroup("Compare");
settings.setValue("compareTextsAsVectorGraphics", m_settingsDockWidget->isCompareTextAsVectorGraphics());
settings.setValue("compareTextCharactersInsteadOfWords", m_settingsDockWidget->isCompareTextCharactersInsteadOfWords());
settings.endGroup();
}
@ -418,15 +437,15 @@ void MainWindow::performOperation(Operation operation)
const size_t pageCount = m_leftDocument.getCatalog()->getPageCount();
if (pageCount > 1)
{
ui->leftPageSelectionEdit->setText(QString("1-%2").arg(pageCount));
m_settingsDockWidget->getLeftPageSelectionEdit()->setText(QString("1-%2").arg(pageCount));
}
else if (pageCount == 1)
{
ui->leftPageSelectionEdit->setText("1");
m_settingsDockWidget->getLeftPageSelectionEdit()->setText("1");
}
else
{
ui->leftPageSelectionEdit->clear();
m_settingsDockWidget->getLeftPageSelectionEdit()->clear();
}
updateViewDocument();
@ -449,15 +468,15 @@ void MainWindow::performOperation(Operation operation)
const size_t pageCount = m_rightDocument.getCatalog()->getPageCount();
if (pageCount > 1)
{
ui->rightPageSelectionEdit->setText(QString("1-%2").arg(pageCount));
m_settingsDockWidget->getRightPageSelectionEdit()->setText(QString("1-%2").arg(pageCount));
}
else if (pageCount == 1)
{
ui->rightPageSelectionEdit->setText("1");
m_settingsDockWidget->getRightPageSelectionEdit()->setText("1");
}
else
{
ui->rightPageSelectionEdit->clear();
m_settingsDockWidget->getRightPageSelectionEdit()->clear();
}
updateViewDocument();
@ -471,14 +490,17 @@ void MainWindow::performOperation(Operation operation)
pdf::PDFTemporaryValueChange guard(&m_dontDisplayErrorMessage, true);
m_diff.stop();
m_diff.setOption(pdf::PDFDiff::CompareTextsAsVector, m_settingsDockWidget->isCompareTextAsVectorGraphics());
m_diff.setOption(pdf::PDFDiff::CompareWords, !m_settingsDockWidget->isCompareTextCharactersInsteadOfWords());
QString errorMessage;
pdf::PDFClosedIntervalSet rightPageIndices;
pdf::PDFClosedIntervalSet leftPageIndices = pdf::PDFClosedIntervalSet::parse(1, qMax<pdf::PDFInteger>(1, m_leftDocument.getCatalog()->getPageCount()), ui->leftPageSelectionEdit->text(), &errorMessage);
pdf::PDFClosedIntervalSet leftPageIndices = pdf::PDFClosedIntervalSet::parse(1, qMax<pdf::PDFInteger>(1, m_leftDocument.getCatalog()->getPageCount()), m_settingsDockWidget->getLeftPageSelectionEdit()->text(), &errorMessage);
if (errorMessage.isEmpty())
{
rightPageIndices = pdf::PDFClosedIntervalSet::parse(1, qMax<pdf::PDFInteger>(1, m_rightDocument.getCatalog()->getPageCount()), ui->rightPageSelectionEdit->text(), &errorMessage);
rightPageIndices = pdf::PDFClosedIntervalSet::parse(1, qMax<pdf::PDFInteger>(1, m_rightDocument.getCatalog()->getPageCount()), m_settingsDockWidget->getRightPageSelectionEdit()->text(), &errorMessage);
}
// Check if pages are succesfully parsed
@ -658,13 +680,13 @@ void MainWindow::clear(bool clearLeftDocument, bool clearRightDocument)
if (clearLeftDocument)
{
m_leftDocument = pdf::PDFDocument();
ui->leftPageSelectionEdit->clear();
m_settingsDockWidget->getLeftPageSelectionEdit()->clear();
}
if (clearRightDocument)
{
m_rightDocument = pdf::PDFDocument();
ui->rightPageSelectionEdit->clear();
m_settingsDockWidget->getRightPageSelectionEdit()->clear();
}
m_diffResult = pdf::PDFDiffResult();

View File

@ -88,6 +88,7 @@ private slots:
private:
void onMappedActionTriggered(int actionId);
void onComparationFinished();
void onColorsChanged();
void onProgressStarted(pdf::ProgressStartupInfo info);
void onProgressStep(int percentage);

View File

@ -14,54 +14,9 @@
<string>Workspace</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout" rowstretch="0,1">
<item row="0" column="0">
<widget class="QGroupBox" name="leftDocumentSettingsGroupBox">
<property name="title">
<string>Left</string>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="leftPageSelectionLabel">
<property name="text">
<string>Page Selection:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="leftPageSelectionEdit"/>
</item>
</layout>
</widget>
</item>
<item row="0" column="1">
<widget class="QGroupBox" name="rightDocumentSettingsGroupBox">
<property name="title">
<string>Right</string>
</property>
<layout class="QFormLayout" name="formLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="rightPageSelectionLabel">
<property name="text">
<string>Page Selection:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="rightPageSelectionEdit"/>
</item>
</layout>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QFrame" name="documentFrame">
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
</widget>
<layout class="QGridLayout" name="gridLayout" rowstretch="0">
<item row="0" column="0" colspan="2">
<widget class="QFrame" name="documentFrame"/>
</item>
</layout>
</widget>

View File

@ -18,14 +18,31 @@
#include "settingsdockwidget.h"
#include "ui_settingsdockwidget.h"
#include "pdfutils.h"
#include "pdfwidgetutils.h"
namespace pdfdocdiff
{
SettingsDockWidget::SettingsDockWidget(QWidget *parent) :
SettingsDockWidget::SettingsDockWidget(Settings* settings, QWidget* parent) :
QDockWidget(parent),
ui(new Ui::SettingsDockWidget)
ui(new Ui::SettingsDockWidget),
m_settings(settings),
m_loadingColors(false)
{
ui->setupUi(this);
auto colorNames = QColor::colorNames();
for (QComboBox* comboBox : findChildren<QComboBox*>())
{
for (const QString& colorName : colorNames)
{
QColor color(colorName);
comboBox->addItem(getIconForColor(color), colorName, color);
}
connect(comboBox, &QComboBox::editTextChanged, this, &SettingsDockWidget::onEditColorChanged);
}
}
SettingsDockWidget::~SettingsDockWidget()
@ -33,4 +50,94 @@ SettingsDockWidget::~SettingsDockWidget()
delete ui;
}
void SettingsDockWidget::setCompareTextsAsVectorGraphics(bool enabled)
{
ui->compareTextsAsVectorGraphicsCheckBox->setChecked(enabled);
}
bool SettingsDockWidget::isCompareTextAsVectorGraphics() const
{
return ui->compareTextsAsVectorGraphicsCheckBox->isChecked();
}
void SettingsDockWidget::setCompareTextCharactersInsteadOfWords(bool enabled)
{
ui->compareCharactersInsteadOfWordsCheckBox->setChecked(enabled);
}
bool SettingsDockWidget::isCompareTextCharactersInsteadOfWords() const
{
return ui->compareCharactersInsteadOfWordsCheckBox->isChecked();
}
QLineEdit* SettingsDockWidget::getLeftPageSelectionEdit() const
{
return ui->leftPageSelectionEdit;
}
QLineEdit* SettingsDockWidget::getRightPageSelectionEdit() const
{
return ui->rightPageSelectionEdit;
}
void SettingsDockWidget::loadColors()
{
pdf::PDFTemporaryValueChange guard(&m_loadingColors, true);
auto loadColor = [](QComboBox* comboBox, QColor color)
{
auto index = comboBox->findData(color);
comboBox->setCurrentIndex(index);
if (index == -1)
{
comboBox->setCurrentText(color.name());
}
};
loadColor(ui->removeColorCombo, m_settings->colorRemoved);
loadColor(ui->addColorCombo, m_settings->colorAdded);
loadColor(ui->replaceColorCombo, m_settings->colorReplaced);
loadColor(ui->moveColorCombo, m_settings->colorPageMove);
}
QIcon SettingsDockWidget::getIconForColor(QColor color) const
{
QIcon icon;
QSize iconSize = pdf::PDFWidgetUtils::scaleDPI(this, QSize(16, 16));
QPixmap pixmap(iconSize.width(), iconSize.height());
pixmap.fill(color);
icon.addPixmap(pixmap);
return icon;
}
void SettingsDockWidget::onEditColorChanged()
{
if (m_loadingColors)
{
return;
}
bool isChanged = false;
auto saveColor = [&isChanged](QComboBox* comboBox, QColor& color)
{
QColor oldColor = color;
color.setNamedColor(comboBox->currentText());
isChanged = isChanged || oldColor != color;
};
saveColor(ui->removeColorCombo, m_settings->colorRemoved);
saveColor(ui->addColorCombo, m_settings->colorAdded);
saveColor(ui->replaceColorCombo, m_settings->colorReplaced);
saveColor(ui->moveColorCombo, m_settings->colorPageMove);
if (isChanged)
{
emit colorsChanged();
}
}
} // namespace pdfdocdiff

View File

@ -18,6 +18,8 @@
#ifndef SETTINGSDOCKWIDGET_H
#define SETTINGSDOCKWIDGET_H
#include "settings.h"
#include <QDockWidget>
namespace Ui
@ -25,6 +27,8 @@ namespace Ui
class SettingsDockWidget;
}
class QLineEdit;
namespace pdfdocdiff
{
@ -33,11 +37,32 @@ class SettingsDockWidget : public QDockWidget
Q_OBJECT
public:
explicit SettingsDockWidget(QWidget* parent);
explicit SettingsDockWidget(Settings* settings, QWidget* parent);
virtual ~SettingsDockWidget() override;
void setCompareTextsAsVectorGraphics(bool enabled);
bool isCompareTextAsVectorGraphics() const;
void setCompareTextCharactersInsteadOfWords(bool enabled);
bool isCompareTextCharactersInsteadOfWords() const;
QLineEdit* getLeftPageSelectionEdit() const;
QLineEdit* getRightPageSelectionEdit() const;
void loadColors();
void saveColors();
signals:
void colorsChanged();
private:
QIcon getIconForColor(QColor color) const;
void onEditColorChanged();
Ui::SettingsDockWidget* ui;
Settings* m_settings;
bool m_loadingColors;
};
} // namespace pdfdocdiff

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
<width>548</width>
<height>417</height>
</rect>
</property>
<property name="allowedAreas">
@ -16,7 +16,149 @@
<property name="windowTitle">
<string>Settings</string>
</property>
<widget class="QWidget" name="dockWidgetContents"/>
<widget class="QWidget" name="dockWidgetContents">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QGroupBox" name="leftDocumentSettingsGroupBox">
<property name="title">
<string>Left Document</string>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="leftPageSelectionLabel">
<property name="text">
<string>Page Selection:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="leftPageSelectionEdit"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="rightDocumentSettingsGroupBox">
<property name="title">
<string>Right Document</string>
</property>
<layout class="QFormLayout" name="formLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="rightPageSelectionLabel">
<property name="text">
<string>Page Selection:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="rightPageSelectionEdit"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="optionsGroupBox">
<property name="title">
<string>Options</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QCheckBox" name="compareTextsAsVectorGraphicsCheckBox">
<property name="text">
<string>Compare texts as vector graphics</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="compareCharactersInsteadOfWordsCheckBox">
<property name="text">
<string>Compare text characters instead of words</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="colorsGroupBox">
<property name="title">
<string>Colors</string>
</property>
<layout class="QFormLayout" name="formLayout_3">
<item row="0" column="0">
<widget class="QLabel" name="removeColorLabel">
<property name="text">
<string>Remove</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="removeColorCombo">
<property name="editable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="addColorLabel">
<property name="text">
<string>Add</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="replaceColorLabel">
<property name="text">
<string>Replace</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="moveColorLabel">
<property name="text">
<string>Move</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="replaceColorCombo">
<property name="editable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="addColorCombo">
<property name="editable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="moveColorCombo">
<property name="editable">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
<resources/>
<connections/>