File indexing completed on 2024-04-28 04:00:29

0001 /*
0002     SPDX-FileCopyrightText: 2010-2014 Sune Vuorela <sune@vuorela.dk>
0003 
0004     SPDX-License-Identifier: MIT
0005 */
0006 
0007 #include "barcodeexamplewidget.h"
0008 // Qt
0009 #include <QDrag>
0010 #include <QGuiApplication>
0011 #include <QMimeData>
0012 #include <QPainter>
0013 #include <QResizeEvent>
0014 #include <QScreen>
0015 
0016 using namespace Prison;
0017 
0018 BarcodeExampleWidget::BarcodeExampleWidget(std::optional<Barcode> barcode, QWidget *parent)
0019     : QWidget(parent)
0020     , m_barcode(std::move(barcode))
0021 {
0022     if (!barcode) {
0023         qDebug() << "unsupported barcode, showing a black square";
0024     }
0025 }
0026 
0027 BarcodeExampleWidget::BarcodeExampleWidget(BarcodeType barcode, QWidget *parent)
0028     : BarcodeExampleWidget(Barcode::create(barcode), parent)
0029 {
0030 }
0031 
0032 void BarcodeExampleWidget::setData(const QString &data)
0033 {
0034     if (m_barcode) {
0035         m_barcode->setData(data);
0036         updateGeometry();
0037         repaint();
0038     }
0039 }
0040 
0041 void BarcodeExampleWidget::paintEvent(QPaintEvent *event)
0042 {
0043     QPainter painter(this);
0044     if (m_barcode) {
0045         QRect targetrect = rect();
0046         QImage image = m_barcode->toImage(targetrect.size());
0047         if (!image.isNull()) {
0048             QRectF rect(targetrect.left() + targetrect.width() / 2 - image.size().width() / 2,
0049                         targetrect.top() + targetrect.height() / 2 - image.size().height() / 2,
0050                         targetrect.size().width(),
0051                         targetrect.height());
0052             painter.drawImage(rect.topLeft(), image, image.rect());
0053         } else {
0054             painter.fillRect(QRectF(QPointF(0, 0), size()), Qt::cyan);
0055         }
0056     } else {
0057         painter.fillRect(QRectF(QPointF(0, 0), size()), Qt::black);
0058     }
0059     QWidget::paintEvent(event);
0060 }
0061 
0062 void BarcodeExampleWidget::resizeEvent(QResizeEvent *event)
0063 {
0064     updateGeometry();
0065     repaint();
0066     QWidget::resizeEvent(event);
0067 }
0068 
0069 void BarcodeExampleWidget::mousePressEvent(QMouseEvent *event)
0070 {
0071     if (m_barcode && event->buttons() & Qt::LeftButton) {
0072         QMimeData *data = new QMimeData();
0073         data->setImageData(m_barcode->toImage(rect().size()));
0074         QDrag *drag = new QDrag(this);
0075         drag->setMimeData(data);
0076         drag->exec();
0077     } else {
0078         QWidget::mousePressEvent(event);
0079     }
0080 }
0081 
0082 QSize BarcodeExampleWidget::minimumSizeHint() const
0083 {
0084     if (m_barcode)
0085         return m_barcode->preferredSize(QGuiApplication::primaryScreen()->devicePixelRatio()).toSize();
0086     return QSize(10, 10);
0087 }
0088 
0089 BarcodeExampleWidget::~BarcodeExampleWidget() = default;