mirror of
				https://github.com/JakubMelka/PDF4QT.git
				synced 2025-06-05 21:59:17 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			187 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			187 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //    Copyright (C) 2021-2022 Jakub Melka
 | |
| //
 | |
| //    This file is part of PDF4QT.
 | |
| //
 | |
| //    PDF4QT is free software: you can redistribute it and/or modify
 | |
| //    it under the terms of the GNU Lesser General Public License as published by
 | |
| //    the Free Software Foundation, either version 3 of the License, or
 | |
| //    with the written consent of the copyright owner, any later version.
 | |
| //
 | |
| //    PDF4QT is distributed in the hope that it will be useful,
 | |
| //    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| //    GNU Lesser General Public License for more details.
 | |
| //
 | |
| //    You should have received a copy of the GNU Lesser General Public License
 | |
| //    along with PDF4QT.  If not, see <https://www.gnu.org/licenses/>.
 | |
| 
 | |
| #include "pdfencryptionstrengthhintwidget.h"
 | |
| #include "pdfwidgetutils.h"
 | |
| #include "pdfutils.h"
 | |
| #include "pdfdbgheap.h"
 | |
| 
 | |
| #include <QPainter>
 | |
| #include <QFontMetrics>
 | |
| 
 | |
| namespace pdfviewer
 | |
| {
 | |
| 
 | |
| PDFEncryptionStrengthHintWidget::PDFEncryptionStrengthHintWidget(QWidget* parent) :
 | |
|     BaseClass(parent),
 | |
|     m_minValue(0),
 | |
|     m_maxValue(100),
 | |
|     m_currentValue(50)
 | |
| {
 | |
|     m_levels = {
 | |
|         Level{ Qt::red, tr("Very weak") },
 | |
|         Level{ QColor::fromRgbF(1.0, 0.5, 0.0, 1.0), tr("Weak") },
 | |
|         Level{ Qt::yellow, tr("Moderate") },
 | |
|         Level{ QColor::fromRgbF(0.0, 1.0, 0.5, 1.0), tr("Strong") },
 | |
|         Level{ Qt::green, tr("Very strong") }
 | |
|     };
 | |
| }
 | |
| 
 | |
| QSize PDFEncryptionStrengthHintWidget::sizeHint() const
 | |
| {
 | |
|     const QSize markSize = getMarkSize();
 | |
|     const QSize textSize = getTextSizeHint();
 | |
|     const int markSpacing = getMarkSpacing();
 | |
|     const int levels = int(m_levels.size());
 | |
| 
 | |
|     const int width = levels * (markSize.width() + markSpacing) + textSize.width() + markSpacing;
 | |
|     const int height = qMax(markSize.height(), textSize.height());
 | |
| 
 | |
|     return QSize(width, height);
 | |
| }
 | |
| 
 | |
| QSize PDFEncryptionStrengthHintWidget::minimumSizeHint() const
 | |
| {
 | |
|     return sizeHint();
 | |
| }
 | |
| 
 | |
| void PDFEncryptionStrengthHintWidget::paintEvent(QPaintEvent* event)
 | |
| {
 | |
|     QPainter painter(this);
 | |
| 
 | |
|     Q_UNUSED(event);
 | |
| 
 | |
|     const QSize markSize = getMarkSize();
 | |
|     const int markSpacing = getMarkSpacing();
 | |
|     const int xAdvance = markSize.width() + markSpacing;
 | |
|     const bool isEnabled = this->isEnabled();
 | |
| 
 | |
|     QRect rect = this->rect();
 | |
|     painter.fillRect(rect, Qt::lightGray);
 | |
| 
 | |
|     painter.translate(markSpacing, 0);
 | |
| 
 | |
|     int currentLevel = qFloor(pdf::interpolate(m_currentValue, m_minValue, m_maxValue, 0, m_levels.size()));
 | |
|     if (currentLevel == m_levels.size())
 | |
|     {
 | |
|         --currentLevel;
 | |
|     }
 | |
|     if (!isEnabled)
 | |
|     {
 | |
|         currentLevel = -1;
 | |
|     }
 | |
| 
 | |
|     Q_ASSERT(currentLevel >= -1);
 | |
|     Q_ASSERT(currentLevel == -1 || currentLevel < m_levels.size());
 | |
| 
 | |
|     QColor fillColor = Qt::darkGray;
 | |
|     if (currentLevel >= 0)
 | |
|     {
 | |
|         fillColor = m_levels[currentLevel].color;
 | |
|     }
 | |
| 
 | |
|     QColor invalidColor = Qt::darkGray;
 | |
| 
 | |
|     QRect markRect(QPoint(0, (rect.height() - markSize.height()) / 2), markSize);
 | |
| 
 | |
|     painter.save();
 | |
|     for (size_t i = 0; i < m_levels.size(); ++i)
 | |
|     {
 | |
|         QColor color = (i <= currentLevel) ? fillColor : invalidColor;
 | |
|         painter.fillRect(markRect, color);
 | |
|         painter.translate(xAdvance, 0);
 | |
|         rect.setLeft(rect.left() + xAdvance);
 | |
|     }
 | |
|     painter.restore();
 | |
| 
 | |
|     if (isEnabled)
 | |
|     {
 | |
|         painter.drawText(rect, Qt::TextSingleLine | Qt::TextDontClip | Qt::AlignLeft | Qt::AlignVCenter, m_levels[currentLevel].text);
 | |
|     }
 | |
| }
 | |
| 
 | |
| void PDFEncryptionStrengthHintWidget::correctValue()
 | |
| {
 | |
|     setCurrentValue(qBound(m_minValue, m_currentValue, m_maxValue));
 | |
| }
 | |
| 
 | |
| QSize PDFEncryptionStrengthHintWidget::getMarkSize() const
 | |
| {
 | |
|     return pdf::PDFWidgetUtils::scaleDPI(this, QSize(15, 5));
 | |
| }
 | |
| 
 | |
| int PDFEncryptionStrengthHintWidget::getMarkSpacing() const
 | |
| {
 | |
|     return pdf::PDFWidgetUtils::scaleDPI_x(this, 5);
 | |
| }
 | |
| 
 | |
| QSize PDFEncryptionStrengthHintWidget::getTextSizeHint() const
 | |
| {
 | |
|     QFontMetrics fontMetrics(font(), this);
 | |
| 
 | |
|     const int height = fontMetrics.lineSpacing() + pdf::PDFWidgetUtils::scaleDPI_y(this, 4);
 | |
|     int width = 0;
 | |
| 
 | |
|     for (const auto& levelItem : m_levels)
 | |
|     {
 | |
|         width = qMax(width, fontMetrics.width(levelItem.text));
 | |
|     }
 | |
| 
 | |
|     return QSize(width, height);
 | |
| }
 | |
| 
 | |
| int PDFEncryptionStrengthHintWidget::getMaxValue() const
 | |
| {
 | |
|     return m_maxValue;
 | |
| }
 | |
| 
 | |
| void PDFEncryptionStrengthHintWidget::setMaxValue(int maxValue)
 | |
| {
 | |
|     m_maxValue = maxValue;
 | |
|     correctValue();
 | |
| }
 | |
| 
 | |
| int PDFEncryptionStrengthHintWidget::getMinValue() const
 | |
| {
 | |
|     return m_minValue;
 | |
| }
 | |
| 
 | |
| void PDFEncryptionStrengthHintWidget::setMinValue(int minValue)
 | |
| {
 | |
|     m_minValue = minValue;
 | |
|     correctValue();
 | |
| }
 | |
| 
 | |
| int PDFEncryptionStrengthHintWidget::getCurrentValue() const
 | |
| {
 | |
|     return m_currentValue;
 | |
| }
 | |
| 
 | |
| void PDFEncryptionStrengthHintWidget::setCurrentValue(int currentValue)
 | |
| {
 | |
|     const int adjustedValue = qBound(m_minValue, currentValue, m_maxValue);
 | |
| 
 | |
|     if (m_currentValue != adjustedValue)
 | |
|     {
 | |
|         m_currentValue = adjustedValue;
 | |
|         update();
 | |
|     }
 | |
| }
 | |
| 
 | |
| }   // namespace pdfviewer
 | |
| 
 |