From acd5feafeaf337d31f2e037a7d52298f04436643 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint <Friedemann.Kleint@nokia.com> Date: Tue, 10 Feb 2009 10:56:22 +0100 Subject: [PATCH] Fixes: React to desktop file manager drop events. Task: 238143 --- src/plugins/coreplugin/mainwindow.cpp | 64 +++++++++++++++++++++++--- src/plugins/coreplugin/mainwindow.h | 6 ++- src/plugins/coreplugin/welcomemode.cpp | 1 + 3 files changed, 62 insertions(+), 9 deletions(-) diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp index 91c2756d315..1c335c0af5e 100644 --- a/src/plugins/coreplugin/mainwindow.cpp +++ b/src/plugins/coreplugin/mainwindow.cpp @@ -77,6 +77,7 @@ #include <QtCore/QSettings> #include <QtCore/QTimer> #include <QtCore/QtPlugin> +#include <QtCore/QUrl> #include <QtGui/QApplication> #include <QtGui/QCloseEvent> @@ -103,10 +104,9 @@ extern "C" void handleSigInt(int sig) using namespace Core; using namespace Core::Internal; -namespace { - enum { debugMainWindow = 0 }; -} +static const char *uriListMimeFormatC = "text/uri-list"; +enum { debugMainWindow = 0 }; MainWindow::MainWindow() : QMainWindow(), @@ -157,15 +157,15 @@ MainWindow::MainWindow() : QCoreApplication::setOrganizationName(QLatin1String("Nokia")); QSettings::setDefaultFormat(QSettings::IniFormat); QString baseName = qApp->style()->objectName(); -#ifdef Q_WS_X11 - if (baseName == "windows") { +#ifdef Q_WS_X11 + if (baseName == QLatin1String("windows")) { // Sometimes we get the standard windows 95 style as a fallback // e.g. if we are running on a KDE4 desktop QByteArray desktopEnvironment = qgetenv("DESKTOP_SESSION"); if (desktopEnvironment == "kde") - baseName = "plastique"; + baseName = QLatin1String("plastique"); else - baseName = "cleanlooks"; + baseName = QLatin1String("cleanlooks"); } #endif qApp->setStyle(new ManhattanStyle(baseName)); @@ -202,6 +202,7 @@ MainWindow::MainWindow() : #endif statusBar()->setProperty("p_styled", true); + setAcceptDrops(true); } void MainWindow::setSidebarVisible(bool visible) @@ -361,6 +362,55 @@ void MainWindow::closeEvent(QCloseEvent *event) event->accept(); } +// Check for desktop file manager file drop events + +static bool isDesktopFileManagerDrop(const QMimeData *d, QStringList *files = 0) +{ + if (files) + files->clear(); + // Extract dropped files from Mime data. + if (!d->hasFormat(QLatin1String(uriListMimeFormatC))) + return false; + const QList<QUrl> urls = d->urls(); + if (urls.empty()) + return false; + // Try to find local files + bool hasFiles = false; + const QList<QUrl>::const_iterator cend = urls.constEnd(); + for (QList<QUrl>::const_iterator it = urls.constBegin(); it != cend; ++it) { + const QString fileName = it->toLocalFile(); + if (!fileName.isEmpty()) { + hasFiles = true; + if (files) { + files->push_back(fileName); + } else { + break; // No result list, sufficient for checking + } + } + } + return hasFiles; +} + +void MainWindow::dragEnterEvent(QDragEnterEvent *event) +{ + if (isDesktopFileManagerDrop(event->mimeData())) { + event->accept(); + } else { + event->ignore(); + } +} + +void MainWindow::dropEvent(QDropEvent *event) +{ + QStringList files; + if (isDesktopFileManagerDrop(event->mimeData(), &files)) { + event->accept(); + openFiles(files); + } else { + event->ignore(); + } +} + IContext *MainWindow::currentContextObject() const { return m_activeContext; diff --git a/src/plugins/coreplugin/mainwindow.h b/src/plugins/coreplugin/mainwindow.h index c0203a2af37..912c84482fa 100644 --- a/src/plugins/coreplugin/mainwindow.h +++ b/src/plugins/coreplugin/mainwindow.h @@ -139,8 +139,10 @@ public slots: void showOptionsDialog(const QString &category = QString(), const QString &page = QString()); protected: - void changeEvent(QEvent *e); - void closeEvent(QCloseEvent *event); + virtual void changeEvent(QEvent *e); + virtual void closeEvent(QCloseEvent *event); + virtual void dragEnterEvent(QDragEnterEvent *event); + virtual void dropEvent(QDropEvent *event); private slots: void openFile(); diff --git a/src/plugins/coreplugin/welcomemode.cpp b/src/plugins/coreplugin/welcomemode.cpp index 7cd17e3ddcd..21a25471101 100644 --- a/src/plugins/coreplugin/welcomemode.cpp +++ b/src/plugins/coreplugin/welcomemode.cpp @@ -150,6 +150,7 @@ WelcomeMode::WelcomeMode() : updateWelcomePage(welcomePageData); l->addWidget(m_d->m_webview); + m_d->m_webview->setAcceptDrops(false); #else m_d->m_label->setWordWrap(true); -- GitLab