/** * @RDE_HEADER@ * Shows a report of combat power in form of curves * $Id$ * $HeadURL$ * $Author$ */ #include "lts_report_display_widget.h" #include #include #include #include // 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