diff --git a/src/mumble/OverlayConfig.cpp b/src/mumble/OverlayConfig.cpp index be2e8e4828c..63464a396a7 100644 --- a/src/mumble/OverlayConfig.cpp +++ b/src/mumble/OverlayConfig.cpp @@ -149,6 +149,8 @@ OverlayConfig::OverlayConfig(Settings &st) : fViewScale(1.0f) { setupUi(this); + qlwPaths->setPathType(PathListWidget::FOLDER); + qcbOverlayExclusionMode->insertItem(static_cast(OverlaySettings::LauncherFilterExclusionMode), tr("Launcher Filter")); qcbOverlayExclusionMode->insertItem(static_cast(OverlaySettings::WhitelistExclusionMode), tr("Whitelist")); qcbOverlayExclusionMode->insertItem(static_cast(OverlaySettings::BlacklistExclusionMode), tr("Blacklist")); diff --git a/src/mumble/PathListWidget.cpp b/src/mumble/PathListWidget.cpp index 34371b45575..2c98ca48e90 100644 --- a/src/mumble/PathListWidget.cpp +++ b/src/mumble/PathListWidget.cpp @@ -3,17 +3,27 @@ // that can be found in the LICENSE file at the root of the // Mumble source tree or at . +#include "mumble_pch.hpp" + #include "PathListWidget.h" -#include +#include +#include #include +#include +#include #include "Overlay.h" PathListWidget::PathListWidget(QWidget* parent) - : QListWidget(parent) { + : QListWidget(parent) + , pathType(FILE) { setAcceptDrops(true); } +void PathListWidget::setPathType(PathType type) { + pathType = type; +} + void PathListWidget::addFilePath(const QString & path) { QString qsAppIdentifier = OverlayAppInfo::applicationIdentifierForPath(path); QStringList qslIdentifiers; @@ -27,35 +37,52 @@ void PathListWidget::addFilePath(const QString & path) { } } -void PathListWidget::checkAcceptDragEvent(QDropEvent *event) { +void PathListWidget::addFolderPath(const QString &path) { + QString dir = QDir::toNativeSeparators(path); + QStringList qslIdentifiers; + for (int i = 0; i < count(); i++) + qslIdentifiers << item(i)->data(Qt::UserRole).toString(); + if (! dir.isEmpty() && ! qslIdentifiers.contains(dir)) { + QListWidgetItem *qlwiPath = new QListWidgetItem(QIcon(), QDir(dir).path(), this); + qlwiPath->setData(Qt::UserRole, QVariant(dir)); + setCurrentItem(qlwiPath); + } +} + +void PathListWidget::checkAcceptDragEvent(QDropEvent *event, bool addItem) { if (event->mimeData()->hasUrls()) { foreach (auto url, event->mimeData()->urls()) { if (url.isLocalFile()) { - event->setDropAction(Qt::CopyAction); -// event->acceptProposedAction(); - event->accept(); - break; + auto info = QFileInfo(url.toLocalFile()); + switch (pathType) { + case FILE: + if (info.isFile() && info.isExecutable()) { + addFilePath(info.filePath()); + event->setDropAction(Qt::LinkAction); + event->accept(); + } + break; + case FOLDER: + if (info.isDir()) { + addFolderPath(url.toLocalFile()); + event->setDropAction(Qt::LinkAction); + event->accept(); + } + break; + } } } } } void PathListWidget::dragEnterEvent(QDragEnterEvent *event) { - checkAcceptDragEvent(event); + checkAcceptDragEvent(event, false); } void PathListWidget::dragMoveEvent(QDragMoveEvent *event) { - checkAcceptDragEvent(event); + checkAcceptDragEvent(event, false); } void PathListWidget::dropEvent(QDropEvent *event) { - if (event->mimeData()->hasUrls()) { - foreach (auto url, event->mimeData()->urls()) { - if (url.isLocalFile()) { - addFilePath(url.toLocalFile()); -// event->acceptProposedAction(); - event->accept(); - } - } - } + checkAcceptDragEvent(event, true); } diff --git a/src/mumble/PathListWidget.h b/src/mumble/PathListWidget.h index 0f1867af4c7..e19b4519de6 100644 --- a/src/mumble/PathListWidget.h +++ b/src/mumble/PathListWidget.h @@ -12,17 +12,23 @@ class QGraphicsSceneDragDropEvent; class QDropEvent; class PathListWidget : public QListWidget { -private: - Q_OBJECT - Q_DISABLE_COPY(PathListWidget) - - void addFilePath(const QString & path); - void checkAcceptDragEvent(QDropEvent *event); public: + enum PathType { FILE, FOLDER }; + PathListWidget(QWidget* parent=nullptr); + void setPathType(PathType type); virtual void dragEnterEvent(QDragEnterEvent *event) Q_DECL_OVERRIDE; virtual void dragMoveEvent(QDragMoveEvent *event) Q_DECL_OVERRIDE; virtual void dropEvent(QDropEvent *event) Q_DECL_OVERRIDE; +private: + Q_OBJECT + Q_DISABLE_COPY(PathListWidget) + + PathType pathType; + + void addFilePath(const QString &path); + void addFolderPath(const QString &path); + void checkAcceptDragEvent(QDropEvent *event, bool addItem); }; #endif