Files
qt5-legatus-legacy/Lts/Viewer/LtsReportDisplay/lts_report_display_widget.cpp
T
2026-08-13 18:33:10 +02:00

97 lines
2.8 KiB
C++
Executable File

/**
* @RDE_HEADER@
* Shows a report of combat power in form of curves
* $Id$
* $HeadURL$
* $Author$
*/
#include "lts_report_display_widget.h"
#include <QResizeEvent>
#include <QPainter>
#include <QPaintEvent>
#include <QTimer>
// Taken from KDReportsLayoutHelper.cpp START
// (WebCMS-TES-UAE-RP 2953 Falsche Positionierung im AAR)
QT_BEGIN_NAMESPACE
Q_GUI_EXPORT extern int qt_defaultDpi(); // This is what QTextDocument uses...
QT_END_NAMESPACE
// Taken from KDReportsLayoutHelper.cpp END
namespace LtsWidgets
{
LtsReportDisplayWidget::LtsReportDisplayWidget(QWidget *parent)
: QWidget(parent)
{
// setAttribute(Qt::WA_OpaquePaintEvent);
// minimale Breite, danach sollte die ScrollArea einen horizontalen Scrollbar darstellen
setMinimumWidth(400);
setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
}
void LtsReportDisplayWidget::setReport(KDReports::Report *report)
{
m_report = report;
update();
}
void LtsReportDisplayWidget::paintEvent(QPaintEvent *event)
{
if (!m_report)
{
QWidget::paintEvent(event);
return;
}
if (m_pixmap.size() != size())
{
QImage img(size(), QImage::Format_ARGB32);
QPainter p(&img);
p.fillRect(rect(), Qt::white);
m_report->paintPage(0, p);
p.end();
m_pixmap = QPixmap::fromImage(img);
}
QPainter p(this);
p.drawPixmap(0, 0, m_pixmap);
p.end();
}
void LtsReportDisplayWidget::resizeEvent(QResizeEvent *event)
{
QWidget::resizeEvent(event);
if (!m_report)
return;
qreal withPixel = size().width();
// qreal withMM = withPixel / physicalDpiX() * 25.4;
qreal withMM = withPixel / qt_defaultDpi() * 25.4;
m_report->setWidthForEndlessPrinter(withMM);
if (!m_bNewMinSizeSlotCalled)
{
m_bNewMinSizeSlotCalled = true;
QTimer::singleShot(10, this, &LtsReportDisplayWidget::setNewMinimumSize);
}
}
void LtsReportDisplayWidget::setNewMinimumSize()
{
m_bNewMinSizeSlotCalled = false;
if (!m_report)
return;
// die neue minimale Höhe festlegen um ggf. einen vertikalen Scrollbar anzuzeigen
QSize newSize = m_report->paperSize().toSize();
// DEBUG_LOG(m_logger) << "old min height: " << minimumHeight() << " - new min height: " << newSize.height() << END_LOG;
// Zur Erklärung: es kann passieren, dass die ScrollArea entscheidet, dass der vertikale Scrollbar jetzt nicht mehr nötig ist
// dies triggert ein resize Event und demnach eine neue Breite. Dadurch verändert sich dann natürlich auch die
// neue minimale Höhe was widerrum dazu führt, dass der Scrollbar wieder nötig ist usw.
// deshalb eine kleine hysterese, hoffentlich reicht es so
if (minimumHeight() >= newSize.height() && minimumHeight() - 20 <= newSize.height())
return;
setMinimumHeight(newSize.height());
}
} // namespace LtsWidgets