Skip to content
This repository has been archived by the owner on Oct 4, 2023. It is now read-only.

Commit

Permalink
Merge pull request #262 from sandsmark/master
Browse files Browse the repository at this point in the history
bring back duplicate searching and square thumbnails, performance improvements, crop improvements from shawn, and other minor stuff
  • Loading branch information
oferkv committed May 21, 2020
2 parents 3a1c53c + 24f3690 commit 9995384
Show file tree
Hide file tree
Showing 27 changed files with 1,256 additions and 224 deletions.
2 changes: 1 addition & 1 deletion CopyMoveDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ void CopyMoveDialog::exec(ThumbsViewer *thumbView, QString &destDir, bool pasteI
}

if (!Settings::isCopyOperation) {
qSort(rowList);
std::sort(rowList.begin(), rowList.end());
for (int t = rowList.size() - 1; t >= 0; --t)
thumbView->thumbsViewerModel->removeRow(rowList.at(t));
}
Expand Down
76 changes: 76 additions & 0 deletions CropRubberband.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,12 +48,88 @@ CropRubberBand::CropRubberBand(QWidget *parent) : QWidget(parent) {
mainLayout->addLayout(topLayout);
mainLayout->addLayout(bottomLayout);

setFocusPolicy(Qt::ClickFocus);

rubberband = new QRubberBand(QRubberBand::Rectangle, this);
rubberband->setStyleSheet("background-color: rgb(255, 255, 255)");
rubberband->show();
}

void CropRubberBand::showEvent(QShowEvent *) {
setFocus();
}

void CropRubberBand::keyPressEvent(QKeyEvent *event) {
QPoint cursorPosGlobal = QCursor::pos();
QPoint cursorPos = mapFromGlobal(cursorPosGlobal);
QRect geom = geometry();
qDebug() << "cursor" << cursorPos << "geom" << geom;
switch (event->key()) {
case Qt::LeftArrow:
case Qt::Key_H:
if (cursorPos.x() > -10 && cursorPos.x() < 10) {
geom.setLeft(geom.left() - 1);
QCursor::setPos(cursorPosGlobal.x() - 1, cursorPosGlobal.y());
} else if (cursorPos.x() > width() - 10 && cursorPos.x() < width() + 10) {
geom.setRight(geom.right() - 1);
QCursor::setPos(cursorPosGlobal.x() - 1, cursorPosGlobal.y());
} else if (QRect(geom).translated(-geom.x(), -geom.y()).contains(cursorPos)) {
geom.moveLeft(geom.x() - 1);
}
setGeometry(geom);
emit selectionChanged(geom);
event->accept();
break;
case Qt::DownArrow:
case Qt::Key_J:
if (cursorPos.y() > -10 && cursorPos.y() < 10) {
geom.setTop(geom.top() + 1);
QCursor::setPos(cursorPosGlobal.x(), cursorPosGlobal.y() + 1);
} else if (cursorPos.y() > height() - 10 && cursorPos.y() < height() + 10) {
geom.setBottom(geom.bottom() + 1);
QCursor::setPos(cursorPosGlobal.x(), cursorPosGlobal.y() + 1);
} else if (QRect(geom).translated(-geom.x(), -geom.y()).contains(cursorPos)) {
geom.moveTop(geom.top() + 1);
}
setGeometry(geom);
emit selectionChanged(geom);
event->accept();
break;
case Qt::UpArrow:
case Qt::Key_K:
if (cursorPos.y() > -10 && cursorPos.y() < 10) {
geom.setTop(geom.top() - 1);
QCursor::setPos(cursorPosGlobal.x(), cursorPosGlobal.y() - 1);
} else if (cursorPos.y() > height() - 10 && cursorPos.y() < height() + 10) {
geom.setBottom(geom.bottom() - 1);
QCursor::setPos(cursorPosGlobal.x(), cursorPosGlobal.y() - 1);
} else if (QRect(geom).translated(-geom.x(), -geom.y()).contains(cursorPos)) {
geom.moveTop(geom.top() - 1);
}
setGeometry(geom);
emit selectionChanged(geom);
event->accept();
break;
case Qt::RightArrow:
case Qt::Key_L:
if (cursorPos.x() > -10 && cursorPos.x() < 10) {
geom.setLeft(geom.left() + 1);
QCursor::setPos(cursorPosGlobal.x() + 1, cursorPosGlobal.y());
} else if (cursorPos.x() > width() - 10 && cursorPos.x() < width() + 10) {
geom.setRight(geom.right() + 1);
QCursor::setPos(cursorPosGlobal.x() + 1, cursorPosGlobal.y());
} else if (QRect(geom).translated(-geom.x(), -geom.y()).contains(cursorPos)) {
geom.moveLeft(geom.x() + 1);
}
setGeometry(geom);
emit selectionChanged(geom);
event->accept();
break;
}
}

void CropRubberBand::resizeEvent(QResizeEvent *) {
rubberband->resize(size());
emit selectionChanged(rubberband->geometry());
}

8 changes: 8 additions & 0 deletions CropRubberband.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,17 @@
#include <QtWidgets>

class CropRubberBand : public QWidget {
Q_OBJECT
public:
CropRubberBand(QWidget *parent = 0);

signals:
void selectionChanged(QRect sel);

protected:
void showEvent(QShowEvent *event);
void keyPressEvent(QKeyEvent *event);

private:
QRubberBand *rubberband;

Expand Down
70 changes: 70 additions & 0 deletions GuideWidget.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
/*
* Copyright (C) 2018 Shawn Rutledge <s@ecloud.org>
* This file is part of Phototonic Image Viewer.
*
* Phototonic is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Phototonic is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Phototonic. If not, see <http://www.gnu.org/licenses/>.
*/

#include "GuideWidget.h"
#include <QAction>
#include <QMouseEvent>
#include <QPainter>

static const int RuleWidgetWidth = 5; // determines the active area for dragging

QAction *GuideWidget::m_deleteAction(new QAction(GuideWidget::tr("Remove guide")));

GuideWidget::GuideWidget(QWidget *parent, bool vertical) : QWidget(parent), m_vertical(vertical)
{
resizeToParent();
setCursor(vertical ? Qt::SplitHCursor : Qt::SplitVCursor);
addAction(m_deleteAction);
setContextMenuPolicy(Qt::ActionsContextMenu);
connect(m_deleteAction, &QAction::triggered, this, &QObject::deleteLater);
}

void GuideWidget::resizeToParent()
{
if (m_vertical)
resize(5, parentWidget()->height());
else
resize(parentWidget()->width(), 6);
}

int GuideWidget::halfThickness()
{
return RuleWidgetWidth / 2;
}

void GuideWidget::mouseMoveEvent(QMouseEvent *event)
{
if (event->modifiers() != Qt::NoModifier) {
QWidget::mouseMoveEvent(event);
return; // don't interfere with crop selection etc.
}
if (m_vertical)
move(x() + event->pos().x() - halfThickness(), 0);
else
move(0, y() + event->pos().y() - halfThickness());
}

void GuideWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setPen(Qt::cyan);
if (m_vertical)
painter.drawLine(halfThickness(), 0, halfThickness(), height());
else
painter.drawLine(0, halfThickness(), width(), halfThickness());
}
44 changes: 44 additions & 0 deletions GuideWidget.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* Copyright (C) 2018 Shawn Rutledge <s@ecloud.org>
* This file is part of Phototonic Image Viewer.
*
* Phototonic is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Phototonic is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Phototonic. If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef GUIDEWIDGET_H
#define GUIDEWIDGET_H

#include <QWidget>

class QAction;

class GuideWidget : public QWidget
{
Q_OBJECT
public:
explicit GuideWidget(QWidget *parent = nullptr, bool vertical = false);

void resizeToParent();
static int halfThickness();

protected:
void mouseMoveEvent(QMouseEvent *event) override;
void paintEvent(QPaintEvent *event) override;

private:
bool m_vertical;
static QAction *m_deleteAction;
};

#endif // GUIDEWIDGET_H
Loading

0 comments on commit 9995384

Please sign in to comment.