mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-30 06:00:20 +00:00
4f42e4fd50
Add a context-menu entry to TabDivePhotos which opens the folder(s) of all selected files. Fixes #1514. Suggested-by: Stefan Fuchs <sfuchs@gmx.de> Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
137 lines
4 KiB
C++
137 lines
4 KiB
C++
// SPDX-License-Identifier: GPL-2.0
|
|
#include "TabDivePhotos.h"
|
|
#include "ui_TabDivePhotos.h"
|
|
#include "core/imagedownloader.h"
|
|
|
|
#include <qt-models/divepicturemodel.h>
|
|
|
|
#include <QDesktopServices>
|
|
#include <QContextMenuEvent>
|
|
#include <QMenu>
|
|
#include <QUrl>
|
|
#include <QMessageBox>
|
|
#include <QFileInfo>
|
|
|
|
//TODO: Remove those in the future.
|
|
#include "../mainwindow.h"
|
|
#include "../divelistview.h"
|
|
|
|
TabDivePhotos::TabDivePhotos(QWidget *parent)
|
|
: TabBase(parent),
|
|
ui(new Ui::TabDivePhotos()),
|
|
divePictureModel(DivePictureModel::instance())
|
|
{
|
|
ui->setupUi(this);
|
|
ui->photosView->setModel(divePictureModel);
|
|
ui->photosView->setSelectionMode(QAbstractItemView::ExtendedSelection);
|
|
ui->photosView->setResizeMode(QListView::Adjust);
|
|
|
|
connect(ui->photosView, &DivePictureWidget::photoDoubleClicked,
|
|
[](const QString& path) {
|
|
QDesktopServices::openUrl(QUrl::fromLocalFile(path));
|
|
}
|
|
);
|
|
connect(ui->photosView, &DivePictureWidget::zoomLevelChanged,
|
|
this, &TabDivePhotos::changeZoomLevel);
|
|
connect(ui->zoomSlider, &QAbstractSlider::valueChanged,
|
|
DivePictureModel::instance(), &DivePictureModel::setZoomLevel);
|
|
}
|
|
|
|
TabDivePhotos::~TabDivePhotos()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
void TabDivePhotos::clear()
|
|
{
|
|
updateData();
|
|
}
|
|
|
|
void TabDivePhotos::contextMenuEvent(QContextMenuEvent *event)
|
|
{
|
|
QMenu popup(this);
|
|
popup.addAction(tr("Load media from file(s)"), this, SLOT(addPhotosFromFile()));
|
|
popup.addAction(tr("Load media file(s) from web"), this, SLOT(addPhotosFromURL()));
|
|
popup.addSeparator();
|
|
popup.addAction(tr("Delete selected media files"), this, SLOT(removeSelectedPhotos()));
|
|
popup.addAction(tr("Delete all media files"), this, SLOT(removeAllPhotos()));
|
|
popup.addAction(tr("Open folder of selected media files"), this, SLOT(openFolderOfSelectedFiles()));
|
|
popup.addAction(tr("Recalculate selected thumbnails"), this, SLOT(recalculateSelectedThumbnails()));
|
|
popup.exec(event->globalPos());
|
|
event->accept();
|
|
}
|
|
|
|
QVector<QString> TabDivePhotos::getSelectedFilenames() const
|
|
{
|
|
QVector<QString> selectedPhotos;
|
|
if (!ui->photosView->selectionModel()->hasSelection())
|
|
return selectedPhotos;
|
|
QModelIndexList indexes = ui->photosView->selectionModel()->selectedRows();
|
|
if (indexes.count() == 0)
|
|
indexes = ui->photosView->selectionModel()->selectedIndexes();
|
|
selectedPhotos.reserve(indexes.count());
|
|
for (const auto &photo: indexes) {
|
|
if (photo.isValid()) {
|
|
QString fileUrl = photo.data(Qt::DisplayPropertyRole).toString();
|
|
if (!fileUrl.isEmpty())
|
|
selectedPhotos.push_back(fileUrl);
|
|
}
|
|
}
|
|
return selectedPhotos;
|
|
}
|
|
|
|
void TabDivePhotos::removeSelectedPhotos()
|
|
{
|
|
DivePictureModel::instance()->removePictures(getSelectedFilenames());
|
|
}
|
|
|
|
void TabDivePhotos::openFolderOfSelectedFiles()
|
|
{
|
|
QVector<QString> directories;
|
|
for (const QString &filename: getSelectedFilenames()) {
|
|
QFileInfo info(filename);
|
|
if (!info.exists())
|
|
continue;
|
|
QString path = info.absolutePath();
|
|
if (path.isEmpty() || directories.contains(path))
|
|
continue;
|
|
directories.append(path);
|
|
}
|
|
for (const QString &dir: directories)
|
|
QDesktopServices::openUrl(QUrl::fromLocalFile(dir));
|
|
}
|
|
|
|
void TabDivePhotos::recalculateSelectedThumbnails()
|
|
{
|
|
Thumbnailer::instance()->calculateThumbnails(getSelectedFilenames());
|
|
}
|
|
|
|
//TODO: This looks overly wrong. We shouldn't call MainWindow to retrieve the DiveList to add Images.
|
|
void TabDivePhotos::addPhotosFromFile()
|
|
{
|
|
MainWindow::instance()->dive_list()->loadImages();
|
|
}
|
|
|
|
void TabDivePhotos::addPhotosFromURL()
|
|
{
|
|
MainWindow::instance()->dive_list()->loadWebImages();
|
|
}
|
|
|
|
void TabDivePhotos::removeAllPhotos()
|
|
{
|
|
if (QMessageBox::warning(this, tr("Deleting media files"), tr("Are you sure you want to delete all media files?"), QMessageBox::Cancel | QMessageBox::Ok, QMessageBox::Cancel) != QMessageBox::Cancel ) {
|
|
ui->photosView->selectAll();
|
|
removeSelectedPhotos();
|
|
}
|
|
}
|
|
|
|
void TabDivePhotos::updateData()
|
|
{
|
|
divePictureModel->updateDivePictures();
|
|
}
|
|
|
|
void TabDivePhotos::changeZoomLevel(int delta)
|
|
{
|
|
// We count on QSlider doing bound checks
|
|
ui->zoomSlider->setValue(ui->zoomSlider->value() + delta);
|
|
}
|