diff --git a/imagescrollarea.cpp b/imagescrollarea.cpp index 245f8aa..3487c16 100644 --- a/imagescrollarea.cpp +++ b/imagescrollarea.cpp @@ -2,8 +2,10 @@ #include #include #include +#include -ImageScrollArea::ImageScrollArea(QWidget *parent) : QScrollArea(parent) +ImageScrollArea::ImageScrollArea(QWidget *parent) : QScrollArea(parent), + m_scale(-1) { m_label = new QLabel(this); setWidget(m_label); @@ -12,9 +14,54 @@ ImageScrollArea::ImageScrollArea(QWidget *parent) : QScrollArea(parent) void ImageScrollArea::setImage(const QPixmap &img) { m_pixmap = img; - QPixmap pix = img.scaled(size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); + QPixmap pix; + if(m_scale < 0) + pix = img.scaled(size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); + else + pix = img.scaled(img.size() * m_scale, Qt::KeepAspectRatio, Qt::SmoothTransformation); + m_label->setPixmap(pix); m_label->resize(pix.size()); + + horizontalScrollBar()->setValue(horizontalScrollBar()->maximum() / 2); + verticalScrollBar()->setValue(verticalScrollBar()->maximum() / 2); +} + +void ImageScrollArea::setScale(float scale) +{ + if(scale > 4 || (scale < 0.2 && scale > 0)) + return; + + m_scale = scale; + QSize newSize = m_scale < 0 ? size() : m_pixmap.size()*scale; + m_label->setPixmap(m_pixmap.scaled(newSize, Qt::KeepAspectRatio, Qt::SmoothTransformation)); + m_label->resize(newSize); +} + +void ImageScrollArea::zoomIn() +{ + if(m_scale < 0) + m_scale = (float)size().width()/m_pixmap.size().width(); + + setScale(m_scale + 0.1); +} + +void ImageScrollArea::zoomOut() +{ + if(m_scale < 0) + m_scale = (float)size().width()/m_pixmap.size().width(); + + setScale(m_scale - 0.1); +} + +void ImageScrollArea::bestFit() +{ + setScale(-1); +} + +void ImageScrollArea::oneToOne() +{ + setScale(1); } void ImageScrollArea::keyPressEvent(QKeyEvent *event) @@ -42,7 +89,30 @@ void ImageScrollArea::mousePressEvent(QMouseEvent *event) void ImageScrollArea::resizeEvent(QResizeEvent *event) { - m_label->setPixmap(m_pixmap.scaled(event->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation)); - m_label->resize(event->size()); + if(m_scale < 0) + { + m_label->setPixmap(m_pixmap.scaled(event->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation)); + m_label->resize(event->size()); + } QScrollArea::resizeEvent(event); } + +void ImageScrollArea::wheelEvent(QWheelEvent *event) +{ + if(m_scale < 0) + m_scale = (float)size().width()/m_pixmap.size().width(); + + QPointF top(horizontalScrollBar()->value(), verticalScrollBar()->value()); + QPointF mousePos = (top + event->posF()) / m_scale; + + QPoint delta = event->angleDelta(); + if(delta.y() > 0) + setScale(m_scale + 0.1); + else + setScale(m_scale - 0.1); + + mousePos *= m_scale; + top = mousePos - event->posF(); + horizontalScrollBar()->setValue(top.x()); + verticalScrollBar()->setValue(top.y()); +} diff --git a/imagescrollarea.h b/imagescrollarea.h index 99235d1..d22240f 100644 --- a/imagescrollarea.h +++ b/imagescrollarea.h @@ -6,18 +6,27 @@ class ImageScrollArea : public QScrollArea { + Q_OBJECT QPoint m_lastPos; QLabel *m_label; QPixmap m_pixmap; + float m_scale; public: explicit ImageScrollArea(QWidget *parent = 0); void setImage(const QPixmap &img); + void setScale(float scale); +public slots: + void zoomIn(); + void zoomOut(); + void bestFit(); + void oneToOne(); protected: void keyPressEvent(QKeyEvent *event); void keyReleaseEvent(QKeyEvent *event); void mouseMoveEvent(QMouseEvent *event); void mousePressEvent(QMouseEvent *event); void resizeEvent(QResizeEvent *event); + void wheelEvent(QWheelEvent *event); }; #endif // IMAGESCROLLAREA_H diff --git a/mainwindow.cpp b/mainwindow.cpp index 48760cb..6409c96 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -25,7 +25,12 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), fileMenu->addAction(tr("Exit"), this, SLOT(close())); menuBar()->addMenu(fileMenu); - m_ringList->setDir("/home/nou/Obrázky/jap/dusan-jpg"); + QMenu *viewMenu = new QMenu(tr("View"), this); + viewMenu->addAction(tr("Zoom In"), m_image, SLOT(zoomIn()), QKeySequence::ZoomIn); + viewMenu->addAction(tr("Zoom Out"), m_image, SLOT(zoomOut()), QKeySequence::ZoomOut); + viewMenu->addAction(tr("Best Fit"), m_image, SLOT(bestFit()), QKeySequence("Ctrl+1")); + viewMenu->addAction(tr("1:1"), m_image, SLOT(oneToOne())); + menuBar()->addMenu(viewMenu); } MainWindow::~MainWindow()