mirror of
https://github.com/feather-wallet/feather.git
synced 2025-03-21 06:28:55 +00:00
68 lines
No EOL
1.6 KiB
C++
68 lines
No EOL
1.6 KiB
C++
// SPDX-License-Identifier: BSD-3-Clause
|
|
// SPDX-FileCopyrightText: 2020-2023 The Monero Project
|
|
|
|
#include "QrCodeWidget.h"
|
|
|
|
#include <QColor>
|
|
#include <QPainter>
|
|
#include <QPen>
|
|
|
|
QrCodeWidget::QrCodeWidget(QWidget *parent) : QWidget(parent)
|
|
{
|
|
}
|
|
|
|
void QrCodeWidget::setQrCode(QrCode *qrCode) {
|
|
m_qrcode = qrCode;
|
|
|
|
int k = m_qrcode->width();
|
|
this->setMinimumSize(k*5, k*5);
|
|
|
|
this->update();
|
|
}
|
|
|
|
void QrCodeWidget::paintEvent(QPaintEvent *event) {
|
|
// Implementation adapted from Electrum: qrcodewidget.py
|
|
if (!m_qrcode) {
|
|
return;
|
|
}
|
|
|
|
QColor black{0, 0, 0, 255};
|
|
QColor white{255, 255, 255, 255};
|
|
QPen blackPen{black};
|
|
blackPen.setJoinStyle(Qt::MiterJoin);
|
|
|
|
QPainter painter(this);
|
|
|
|
auto r = painter.viewport();
|
|
int k = m_qrcode->width();
|
|
int margin = 10;
|
|
int framesize = std::min(r.width(), r.height());
|
|
int boxsize = int((framesize - (2*margin)) / k);
|
|
int size = k*boxsize;
|
|
int left = (framesize - size)/2;
|
|
int top = (framesize - size)/2;
|
|
|
|
painter.setBrush(white);
|
|
painter.setPen(white);
|
|
painter.drawRect(0, 0, framesize, framesize);
|
|
|
|
painter.setBrush(black);
|
|
painter.setPen(blackPen);
|
|
|
|
unsigned char* dot = m_qrcode->data();
|
|
for (int row = 0; row < k; row++) {
|
|
for (int column = 0; column < k; column++) {
|
|
if (quint8(0x01) == (static_cast<quint8>(*dot++) & quint8(0x01))) {
|
|
painter.drawRect(int(left+(column*boxsize)), int(top+(row*boxsize)), boxsize - 1, boxsize - 1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
bool QrCodeWidget::hasHeightForWidth() const {
|
|
return true;
|
|
}
|
|
|
|
int QrCodeWidget::heightForWidth(int w) const {
|
|
return w;
|
|
} |