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_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);
|
||||
|
||||
Reference in New Issue
Block a user