Selecting thumbnails

This commit is contained in:
2022-05-18 17:33:20 +02:00
parent 94466a6b9b
commit 54ef8e990c
2 changed files with 100 additions and 17 deletions
+87 -8
View File
@@ -59,6 +59,7 @@ ImageWidget::ImageWidget(QWidget *parent) : QOpenGLWidget(parent)
m_imgWidth = m_imgHeight = -1; m_imgWidth = m_imgHeight = -1;
m_superpixel = m_invert = false; m_superpixel = m_invert = false;
m_showThumbnails = false; m_showThumbnails = false;
m_selecting = false;
m_thumbnailCount = 0; m_thumbnailCount = 0;
m_updateTimer = new QTimer(this); m_updateTimer = new QTimer(this);
m_updateTimer->setInterval(500); m_updateTimer->setInterval(500);
@@ -116,10 +117,14 @@ void ImageWidget::blockRepaint(bool block)
if(!block)update(); if(!block)update();
} }
void ImageWidget::allocateThumbnails(const QStringList &&names) void ImageWidget::allocateThumbnails(const QStringList &names)
{ {
int count = names.size(); 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->destroy();
m_thumbnailTexture->create(); m_thumbnailTexture->create();
m_thumbnailTexture->setFormat(QOpenGLTexture::RGB16_UNorm); m_thumbnailTexture->setFormat(QOpenGLTexture::RGB16_UNorm);
@@ -131,7 +136,6 @@ void ImageWidget::allocateThumbnails(const QStringList &&names)
memset(tmp, 0, count * sizeof(float)*3); memset(tmp, 0, count * sizeof(float)*3);
m_bufferSizes->allocate(tmp, count * sizeof(float)*3); m_bufferSizes->allocate(tmp, count * sizeof(float)*3);
delete [] tmp; delete [] tmp;
m_thumbnailCount = count;
} }
void ImageWidget::setMTFParams(float low, float mid, float high) 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() }; 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->bind();
m_bufferSizes->write(image->number() * sizeof(sizes), sizes, sizeof(sizes)); 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(); 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; dx = -width()*0.5f + m_image->width()*m_scale*0.5f;
if(height() > m_image->height()*m_scale) if(height() > m_image->height()*m_scale)
dy = -height()*0.5f + m_image->height()*m_scale*0.5f; dy = -height()*0.5f + m_image->height()*m_scale*0.5f;
QBrush highlight = style()->standardPalette().highlight();
if(m_showThumbnails) if(m_showThumbnails)
{ {
@@ -227,18 +233,28 @@ void ImageWidget::paintGL()
if(f3)f3->glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, m_thumbnailCount); if(f3)f3->glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, m_thumbnailCount);
QPainter painter(this); 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++) for(int i=0; i < m_thumbnailCount; i++)
{ {
float x = (i % w) * THUMB_SIZE_BORDER; 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); 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) if(m_currentImg == i)
{ {
int off = (THUMB_SIZE_BORDER - THUMB_SIZE) / 2;
painter.save(); 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.drawRect((i % w) * THUMB_SIZE_BORDER + off, i / w * THUMB_SIZE_BORDER_Y - m_dy + off, THUMB_SIZE, THUMB_SIZE);
painter.restore(); painter.restore();
} }
@@ -395,6 +411,69 @@ void ImageWidget::dropEvent(QDropEvent *event)
event->ignore(); 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) ImageScrollAreaGL::ImageScrollAreaGL(QWidget *parent) : QWidget(parent)
{ {
QGridLayout *layout = new QGridLayout(this); QGridLayout *layout = new QGridLayout(this);
+13 -9
View File
@@ -14,14 +14,12 @@
#include "rawimage.h" #include "rawimage.h"
#include "imageringlist.h" #include "imageringlist.h"
typedef enum struct ImageThumb
{ {
Linear, QString name;
Log, QSize size;
Sqrt, bool selected;
Power, };
Asinh,
}StretchFunc;
class ImageWidget : public QOpenGLWidget class ImageWidget : public QOpenGLWidget
{ {
@@ -52,8 +50,9 @@ class ImageWidget : public QOpenGLWidget
bool m_invert; bool m_invert;
bool m_superpixel; bool m_superpixel;
bool m_showThumbnails; bool m_showThumbnails;
bool m_selecting;
int m_thumbnailCount; int m_thumbnailCount;
QStringList m_Names; QVector<ImageThumb> m_thumnails;
public: public:
explicit ImageWidget(QWidget *parent = nullptr); explicit ImageWidget(QWidget *parent = nullptr);
~ImageWidget(); ~ImageWidget();
@@ -61,7 +60,7 @@ public:
void setImage(const QPixmap &pixmap); void setImage(const QPixmap &pixmap);
void setScale(float scale); void setScale(float scale);
void blockRepaint(bool block); void blockRepaint(bool block);
void allocateThumbnails(const QStringList &&names); void allocateThumbnails(const QStringList &names);
public slots: public slots:
void setMTFParams(float low, float mid, float high); void setMTFParams(float low, float mid, float high);
void setOffset(int dx, int dy); void setOffset(int dx, int dy);
@@ -76,8 +75,13 @@ protected:
void initializeGL(); void initializeGL();
void dragEnterEvent(QDragEnterEvent *event); void dragEnterEvent(QDragEnterEvent *event);
void dropEvent(QDropEvent *event); void dropEvent(QDropEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void thumbSelect(QMouseEvent *event);
signals: signals:
void fileDropped(const QString &path); void fileDropped(const QString &path);
void thumbSelected(int index);
}; };
class ImageScrollAreaGL : public QWidget class ImageScrollAreaGL : public QWidget