Selecting thumbnails
This commit is contained in:
+87
-8
@@ -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
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user