From 54ef8e990c342fd6c58a22bd8b29d88faa5abc19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Poizl?= Date: Wed, 18 May 2022 17:33:20 +0200 Subject: [PATCH] Selecting thumbnails --- imagescrollareagl.cpp | 95 +++++++++++++++++++++++++++++++++++++++---- imagescrollareagl.h | 22 ++++++---- 2 files changed, 100 insertions(+), 17 deletions(-) diff --git a/imagescrollareagl.cpp b/imagescrollareagl.cpp index 9898cf9..b83837d 100644 --- a/imagescrollareagl.cpp +++ b/imagescrollareagl.cpp @@ -59,6 +59,7 @@ ImageWidget::ImageWidget(QWidget *parent) : QOpenGLWidget(parent) m_imgWidth = m_imgHeight = -1; m_superpixel = m_invert = false; m_showThumbnails = false; + m_selecting = false; m_thumbnailCount = 0; m_updateTimer = new QTimer(this); m_updateTimer->setInterval(500); @@ -116,10 +117,14 @@ void ImageWidget::blockRepaint(bool block) if(!block)update(); } -void ImageWidget::allocateThumbnails(const QStringList &&names) +void ImageWidget::allocateThumbnails(const QStringList &names) { int count = names.size(); - m_Names = std::move(names); + m_thumbnailCount = count; + m_thumnails.clear(); + for(auto &name : names) + m_thumnails.push_back({name, QSize(0, 0), false}); + m_thumbnailTexture->destroy(); m_thumbnailTexture->create(); m_thumbnailTexture->setFormat(QOpenGLTexture::RGB16_UNorm); @@ -131,7 +136,6 @@ void ImageWidget::allocateThumbnails(const QStringList &&names) memset(tmp, 0, count * sizeof(float)*3); m_bufferSizes->allocate(tmp, count * sizeof(float)*3); delete [] tmp; - m_thumbnailCount = count; } void ImageWidget::setMTFParams(float low, float mid, float high) @@ -191,6 +195,7 @@ void ImageWidget::thumbnailLoaded(const Image *image) int sizes[3] = { std::max(1, a > 1.0f ? THUMB_SIZE : (int)(THUMB_SIZE * a)), std::max(1, a < 1.0f ? THUMB_SIZE : (int)(THUMB_SIZE / a)), image->number() }; m_bufferSizes->bind(); m_bufferSizes->write(image->number() * sizeof(sizes), sizes, sizeof(sizes)); + m_thumnails[image->number()].size = QSize(sizes[0], sizes[1]); if(!m_updateTimer->isActive())m_updateTimer->start(); } @@ -210,6 +215,7 @@ void ImageWidget::paintGL() dx = -width()*0.5f + m_image->width()*m_scale*0.5f; if(height() > m_image->height()*m_scale) dy = -height()*0.5f + m_image->height()*m_scale*0.5f; + QBrush highlight = style()->standardPalette().highlight(); if(m_showThumbnails) { @@ -227,18 +233,28 @@ void ImageWidget::paintGL() if(f3)f3->glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, m_thumbnailCount); QPainter painter(this); - int w = width()/THUMB_SIZE_BORDER; + const int w = width()/THUMB_SIZE_BORDER; + const int off = (THUMB_SIZE_BORDER - THUMB_SIZE) / 2; for(int i=0; i < m_thumbnailCount; i++) { float x = (i % w) * THUMB_SIZE_BORDER; - float y = i / w * THUMB_SIZE_BORDER_Y + THUMB_SIZE - m_dy; + float y = i / w * THUMB_SIZE_BORDER_Y + THUMB_SIZE - m_dy + off; QRectF rect(x, y, THUMB_SIZE_BORDER, 32); - painter.drawText(rect, Qt::AlignCenter | Qt::TextWrapAnywhere, QString(m_Names.at(i))); + painter.drawText(rect, Qt::AlignCenter | Qt::TextWrapAnywhere, QString(m_thumnails[i].name)); + if(m_thumnails[i].selected) + { + painter.save(); + QRectF thumbRect; + painter.setPen(Qt::red); + thumbRect.setSize(m_thumnails[i].size); + thumbRect.moveCenter(QPointF(x + THUMB_SIZE_BORDER / 2, y - THUMB_SIZE / 2)); + painter.drawRect(thumbRect); + painter.restore(); + } if(m_currentImg == i) { - int off = (THUMB_SIZE_BORDER - THUMB_SIZE) / 2; painter.save(); - painter.setPen(QPen(Qt::red, 2.0)); + painter.setPen(QPen(highlight, 2.0)); painter.drawRect((i % w) * THUMB_SIZE_BORDER + off, i / w * THUMB_SIZE_BORDER_Y - m_dy + off, THUMB_SIZE, THUMB_SIZE); painter.restore(); } @@ -395,6 +411,69 @@ void ImageWidget::dropEvent(QDropEvent *event) event->ignore(); } +void ImageWidget::mousePressEvent(QMouseEvent *event) +{ + if(m_thumbnailCount && event->button() == Qt::LeftButton && event->modifiers() & (Qt::ShiftModifier | Qt::ControlModifier)) + m_selecting = true; + + if(m_selecting) + { + thumbSelect(event); + } + else + event->ignore(); +} + +void ImageWidget::mouseMoveEvent(QMouseEvent *event) +{ + if(m_selecting) + { + thumbSelect(event); + } + else + event->ignore(); +} + +void ImageWidget::mouseReleaseEvent(QMouseEvent *event) +{ + if(m_selecting) + { + m_selecting = false; + event->accept(); + } + else + event->ignore(); +} + +void ImageWidget::thumbSelect(QMouseEvent *event) +{ + QPoint p = event->pos(); + const int off = (THUMB_SIZE_BORDER - THUMB_SIZE) / 2; + p.ry() += m_dy; + const int w = width()/THUMB_SIZE_BORDER; + int x = p.x() / THUMB_SIZE_BORDER; + int y = p.y() / THUMB_SIZE_BORDER_Y; + int i = y * w + x; + event->accept(); + QRect rect(x * THUMB_SIZE_BORDER + off, y * THUMB_SIZE_BORDER_Y + off, THUMB_SIZE, THUMB_SIZE); + if(x < w && i < m_thumbnailCount && rect.contains(p, true)) + { + bool oldVal = m_thumnails[i].selected; + bool newVal = oldVal; + if(event->modifiers() == Qt::ShiftModifier) + newVal = true; + if(event->modifiers() == Qt::ControlModifier) + newVal = false; + + if(newVal != oldVal) + { + emit thumbSelected(i); + m_thumnails[i].selected = newVal; + update(); + } + } +} + ImageScrollAreaGL::ImageScrollAreaGL(QWidget *parent) : QWidget(parent) { QGridLayout *layout = new QGridLayout(this); diff --git a/imagescrollareagl.h b/imagescrollareagl.h index e9dad90..3a528aa 100644 --- a/imagescrollareagl.h +++ b/imagescrollareagl.h @@ -14,14 +14,12 @@ #include "rawimage.h" #include "imageringlist.h" -typedef enum +struct ImageThumb { - Linear, - Log, - Sqrt, - Power, - Asinh, -}StretchFunc; + QString name; + QSize size; + bool selected; +}; class ImageWidget : public QOpenGLWidget { @@ -52,8 +50,9 @@ class ImageWidget : public QOpenGLWidget bool m_invert; bool m_superpixel; bool m_showThumbnails; + bool m_selecting; int m_thumbnailCount; - QStringList m_Names; + QVector m_thumnails; public: explicit ImageWidget(QWidget *parent = nullptr); ~ImageWidget(); @@ -61,7 +60,7 @@ public: void setImage(const QPixmap &pixmap); void setScale(float scale); void blockRepaint(bool block); - void allocateThumbnails(const QStringList &&names); + void allocateThumbnails(const QStringList &names); public slots: void setMTFParams(float low, float mid, float high); void setOffset(int dx, int dy); @@ -76,8 +75,13 @@ protected: void initializeGL(); void dragEnterEvent(QDragEnterEvent *event); void dropEvent(QDropEvent *event); + void mousePressEvent(QMouseEvent *event); + void mouseMoveEvent(QMouseEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + void thumbSelect(QMouseEvent *event); signals: void fileDropped(const QString &path); + void thumbSelected(int index); }; class ImageScrollAreaGL : public QWidget