This repository has been archived on 2020-09-07. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
libs/qad/widgets/image_view.cpp
2020-08-18 17:03:13 +03:00

146 lines
3.3 KiB
C++

#include "image_view.h"
#include <QGraphicsScene>
#include <QBuffer>
#include <QEvent>
#include <QMouseEvent>
#include <QWheelEvent>
#include <QDebug>
#include <qmath.h>
ImageView::ImageView(QWidget * parent): QGraphicsView(parent) {
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setDragMode(QGraphicsView::NoDrag);
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
setScene(new QGraphicsScene());
setRenderHint(QPainter::Antialiasing, true);
setRenderHint(QPainter::SmoothPixmapTransform, true);
item.setTransformationMode(Qt::SmoothTransformation);
item.setFlags(QGraphicsItem::GraphicsItemFlags());
scene()->addItem(&item);
viewport()->setAutoFillBackground(false);
viewport()->installEventFilter(this);
autofit_ = true;
}
ImageView::~ImageView() {
}
QPixmap ImageView::pixmap() const {
return map;
}
void ImageView::setPixmap(QPixmap pixmap) {
map = pixmap;
adjustView();
}
void ImageView::setImage(const QImage & i) {
im_data.clear();
if (i.isNull()) {
item.setPixmap(QPixmap());
map = QPixmap();
return;
}
QBuffer b(&im_data); b.open(QIODevice::ReadWrite);
i.save(&b, "png");
b.close();
map = QPixmap::fromImage(i);
adjustView();
}
void ImageView::setImage(const QByteArray & i) {
im_data = i;
if (i.isEmpty()) {
item.setPixmap(QPixmap());
map = QPixmap();
return;
}
map = QPixmap::fromImage(QImage::fromData(i));
adjustView();
}
void ImageView::clear() {
im_data.clear();
item.setPixmap(QPixmap());
map = QPixmap();
}
void ImageView::mouseDoubleClickEvent(QMouseEvent * e) {
autofit();
}
void ImageView::mousePressEvent(QMouseEvent * e) {
QGraphicsView::mousePressEvent(e);
emit clicked(mapToScene(e->pos()), e->buttons());
}
void ImageView::mouseMoveEvent(QMouseEvent * e) {
//if (e->buttons().testFlag(Qt::RightButton) && !autofit_ && isInteractive()) return;;
QGraphicsView::mouseMoveEvent(e);
}
//void ImageView::wheelEvent(QWheelEvent * e) {
// if (!e->modifiers().testFlag(Qt::ControlModifier) || !isInteractive()) return;
// double scl = 1. + e->delta() / 500.;
// //autofit_ = false;
// //scale(scl, scl);
//}
bool ImageView::eventFilter(QObject * o, QEvent * e) {
QMouseEvent * me = (QMouseEvent *)e;
switch (e->type()) {
case QEvent::Resize:
adjustView();
break;
case QEvent::MouseButtonPress:
prev_pos = me->pos();
break;
case QEvent::MouseMove:
if (!me->buttons().testFlag(Qt::RightButton) || autofit_ || !isInteractive()) break;
{
//double scl = 1. / qSqrt(transform().determinant());
//QPointF dp = QPointF(me->pos() - prev_pos) * scl;
//qDebug() << dp;
//translate(0.00001, 0);
prev_pos = me->pos();
}
break;
default: break;
}
return QGraphicsView::eventFilter(o, e);
}
void ImageView::adjustView() {
qreal mp = map.width() / map.size().boundedTo(size()).width();
if (mp > 1) {
item.setPixmap(map.scaled(map.size()/mp, Qt::KeepAspectRatio, Qt::SmoothTransformation));
} else {
item.setPixmap(map);
}
if (!autofit_) return;
setSceneRect(item.boundingRect());
fitInView(&item, Qt::KeepAspectRatio);
centerOn(&item);
}
void ImageView::autofit() {
autofit_ = true;
adjustView();
}