Add drag and drop feature for media file and project

This commit is contained in:
baydam
2017-08-02 02:12:27 +00:00
parent 43bb28fd8f
commit f7f20ccb77
4 changed files with 152 additions and 0 deletions
+77
View File
@@ -89,6 +89,9 @@ MainWindow::MainWindow()
setWindowIcon(QIcon(":/mapmap-logo"));
setCurrentFile("");
// Allow drag n drop
setAcceptDrops(true);
// Create and start timer.
videoTimer = new QTimer(this);
connect(videoTimer, SIGNAL(timeout()), this, SLOT(processFrame()));
@@ -396,6 +399,70 @@ bool MainWindow::eventFilter(QObject *object, QEvent *event)
return QMainWindow::eventFilter(object, event);
}
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
const QMimeData *mimeData = event->mimeData();
bool allowDrag = true;
if (mimeData->hasUrls()) {
foreach (QUrl url, mimeData->urls()) {
QString fileName = url.toLocalFile();
// Don't allow drag if file is not supported
if (!fileSupported(fileName, MM::FILE_EXTENSION) &&
!fileSupported(fileName, MM::IMAGE_FILES_FILTER) &&
!fileSupported(fileName, MM::VIDEO_FILES_FILTER)) {
allowDrag = false;
}
}
}
if (allowDrag)
event->acceptProposedAction();
}
void MainWindow::dragMoveEvent(QDragMoveEvent *event)
{
event->acceptProposedAction();
}
void MainWindow::dragLeaveEvent(QDragLeaveEvent *event)
{
event->accept();
}
void MainWindow::dropEvent(QDropEvent *event)
{
const QMimeData *mimeData = event->mimeData();
if (mimeData->hasUrls()) {
// In case that dragged many files
foreach (QUrl url, mimeData->urls()) {
QString fileName = url.toLocalFile();
if (!fileName.isEmpty()) {
// Test if is mmp file and exit loop
if (fileSupported(fileName, MM::FILE_EXTENSION)) {
if (okToContinue()) {
loadFile(fileName);
}
// Exit for prevent drag to many project files
break;
}
// Allow to drag too many videos or images
else {
// Check if file is image or not
// according to file extension
if (fileSupported(fileName, MM::IMAGE_FILES_FILTER))
importMediaFile(fileName, true);
else
importMediaFile(fileName, false);
}
}
}
}
event->acceptProposedAction();
}
void MainWindow::setOutputWindowFullScreen(bool enable)
{
outputWindow->setFullScreen(enable);
@@ -2812,6 +2879,16 @@ bool MainWindow::fileSupported(const QString &file, bool isImage)
return false;
}
bool MainWindow::fileSupported(const QString &file, const QString &extension)
{
if (!QFileInfo(file).suffix().isEmpty() &&
extension.contains(QFileInfo(file).suffix(), Qt::CaseInsensitive)) {
return true;
} else {
return false;
}
}
QString MainWindow::locateMediaFile(const QString &uri, bool isImage)
{
// Get more info about url
+6
View File
@@ -83,6 +83,11 @@ protected:
void keyPressEvent(QKeyEvent *event);
bool eventFilter(QObject *object, QEvent *event);
void dragEnterEvent(QDragEnterEvent *event);
void dragMoveEvent(QDragMoveEvent *event);
void dragLeaveEvent(QDragLeaveEvent *event);
void dropEvent(QDropEvent *event);
// Slots ////////////////////////////////////////////////////////////////////////////////////////////////////
private slots:
@@ -301,6 +306,7 @@ public:
bool fileExists(const QString& file);
// Check if the file is supported
bool fileSupported(const QString& file, bool isImage);
bool fileSupported(const QString &file, const QString &extension);
// Locate the file not found
QString locateMediaFile(const QString& uri, bool isImage);
+65
View File
@@ -73,6 +73,9 @@ MapperGLCanvas::MapperGLCanvas(MainWindow* mainWindow,
// Black background.
this->scene()->setBackgroundBrush(Qt::black);
// Enable dragndrop
setAcceptDrops(true);
}
MShape::ptr MapperGLCanvas::getShapeFromMapping(Mapping::ptr mapping)
@@ -173,6 +176,68 @@ void MapperGLCanvas::applyZoomToView()
emit zoomFactorChanged(zoomFactor);
}
void MapperGLCanvas::dragEnterEvent(QDragEnterEvent *event)
{
const QMimeData *mimeData = event->mimeData();
bool allowDrag = true;
if (mimeData->hasUrls()) {
foreach (QUrl url, mimeData->urls()) {
QString fileName = url.toLocalFile();
// Don't allow drag if file is not supported
if (!MainWindow::window()->fileSupported(fileName, MM::FILE_EXTENSION) &&
!MainWindow::window()->fileSupported(fileName, MM::IMAGE_FILES_FILTER) &&
!MainWindow::window()->fileSupported(fileName, MM::VIDEO_FILES_FILTER)) {
allowDrag = false;
}
}
}
if (allowDrag)
event->acceptProposedAction();
}
void MapperGLCanvas::dragMoveEvent(QDragMoveEvent *event)
{
event->acceptProposedAction();
}
void MapperGLCanvas::dragLeaveEvent(QDragLeaveEvent *event)
{
event->accept();
}
void MapperGLCanvas::dropEvent(QDropEvent *event)
{
const QMimeData *mimeData = event->mimeData();
if (mimeData->hasUrls()) {
// In case that dragged many files
foreach (QUrl url, mimeData->urls()) {
QString fileName = url.toLocalFile();
if (!fileName.isEmpty()) {
// Test if is mmp file and exit loop
if (MainWindow::window()->fileSupported(fileName, MM::FILE_EXTENSION)) {
MainWindow::window()->loadFile(fileName);
// Exit for prevent drag to many project files
break;
}
// Allow to drag too many videos or images
else {
// Check if file is image or not
// according to file extension
if (MainWindow::window()->fileSupported(fileName, MM::IMAGE_FILES_FILTER))
MainWindow::window()->importMediaFile(fileName, true);
else
MainWindow::window()->importMediaFile(fileName, false);
}
}
}
}
event->acceptProposedAction();
}
//
void MapperGLCanvas::mousePressEvent(QMouseEvent* event)
+4
View File
@@ -110,6 +110,10 @@ protected:
// void mouseMoveEvent(QMouseEvent* event);
// void mouseReleaseEvent(QMouseEvent* event);
// void paintEvent(QPaintEvent* event);
void dragEnterEvent(QDragEnterEvent *event);
void dragMoveEvent(QDragMoveEvent *event);
void dragLeaveEvent(QDragLeaveEvent *event);
void dropEvent(QDropEvent *event);
protected:
// /**