From 4f62d68f6d95a66d7962e97851c29509a790260e Mon Sep 17 00:00:00 2001 From: morg Date: Tue, 7 Sep 2021 13:44:59 +0200 Subject: [PATCH] Add ability to drag and drop plugin files into the UI --- OpenRGB.pro | 8 ++-- qt/OpenRGBPluginsPage/OpenRGBPluginsList.cpp | 45 ++++++++++++++++++++ qt/OpenRGBPluginsPage/OpenRGBPluginsList.h | 24 +++++++++++ qt/OpenRGBPluginsPage/OpenRGBPluginsPage.cpp | 34 +++++++++++++-- qt/OpenRGBPluginsPage/OpenRGBPluginsPage.h | 3 ++ qt/OpenRGBPluginsPage/OpenRGBPluginsPage.ui | 9 +++- 6 files changed, 116 insertions(+), 7 deletions(-) create mode 100644 qt/OpenRGBPluginsPage/OpenRGBPluginsList.cpp create mode 100644 qt/OpenRGBPluginsPage/OpenRGBPluginsList.h diff --git a/OpenRGB.pro b/OpenRGB.pro index 7aa6cdd2..4ee9e60a 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -175,7 +175,8 @@ HEADERS += qt/DeviceView.h \ qt/OpenRGBDialog2.h \ qt/OpenRGBPluginContainer.h \ - qt/OpenRGBPluginsPage/OpenRGBPluginsEntry.h \ + qt/OpenRGBPluginsPage/OpenRGBPluginsEntry.h \ + qt/OpenRGBPluginsPage/OpenRGBPluginsList.h \ qt/OpenRGBPluginsPage/OpenRGBPluginsPage.h \ qt/OpenRGBProfileSaveDialog.h \ qt/OpenRGBServerInfoPage.h \ @@ -507,7 +508,8 @@ SOURCES += qt/DeviceView.cpp \ qt/OpenRGBDialog2.cpp \ qt/OpenRGBPluginContainer.cpp \ - qt/OpenRGBPluginsPage/OpenRGBPluginsEntry.cpp \ + qt/OpenRGBPluginsPage/OpenRGBPluginsEntry.cpp \ + qt/OpenRGBPluginsPage/OpenRGBPluginsList.cpp \ qt/OpenRGBPluginsPage/OpenRGBPluginsPage.cpp \ qt/OpenRGBProfileSaveDialog.cpp \ qt/OpenRGBServerInfoPage.cpp \ @@ -861,7 +863,7 @@ FORMS += qt/OpenRGBDialog.ui \ qt/OpenRGBDialog2.ui \ qt/OpenRGBPluginContainer.ui \ - qt/OpenRGBPluginsPage/OpenRGBPluginsEntry.ui \ + qt/OpenRGBPluginsPage/OpenRGBPluginsEntry.ui \ qt/OpenRGBPluginsPage/OpenRGBPluginsPage.ui \ qt/OpenRGBProfileSaveDialog.ui \ qt/OpenRGBServerInfoPage.ui \ diff --git a/qt/OpenRGBPluginsPage/OpenRGBPluginsList.cpp b/qt/OpenRGBPluginsPage/OpenRGBPluginsList.cpp new file mode 100644 index 00000000..52cd9459 --- /dev/null +++ b/qt/OpenRGBPluginsPage/OpenRGBPluginsList.cpp @@ -0,0 +1,45 @@ +#include "OpenRGBPluginsList.h" +#include +#include + +OpenRGBPluginsList::OpenRGBPluginsList(QWidget *parent) : QListWidget (parent) +{ + setAcceptDrops(true); +} + +void OpenRGBPluginsList::dropEvent(QDropEvent *event) +{ + const QMimeData* mimeData = event->mimeData(); + + if (mimeData->hasUrls()) + { + std::vector path_list; + + QList urls = mimeData->urls(); + + for(const QUrl& url: urls) + { + path_list.push_back(url.toLocalFile().toStdString()); + } + + emit PluginsDropped(path_list); + } + +} + +void OpenRGBPluginsList::dragEnterEvent(QDragEnterEvent *event) +{ + if (event->mimeData()->hasUrls()) + { + event->acceptProposedAction(); + } + else + { + event->ignore(); + } +} + +void OpenRGBPluginsList::dragMoveEvent(QDragMoveEvent *event) +{ + event->acceptProposedAction(); +} diff --git a/qt/OpenRGBPluginsPage/OpenRGBPluginsList.h b/qt/OpenRGBPluginsPage/OpenRGBPluginsList.h new file mode 100644 index 00000000..2e1b8cdd --- /dev/null +++ b/qt/OpenRGBPluginsPage/OpenRGBPluginsList.h @@ -0,0 +1,24 @@ +#ifndef OPENRGBPLUGINSLIST_H +#define OPENRGBPLUGINSLIST_H + +#include +#include +#include + +class OpenRGBPluginsList : public QListWidget +{ + Q_OBJECT + +public: + OpenRGBPluginsList(QWidget *parent = nullptr); + +signals: + void PluginsDropped(std::vector); + +protected: + void dropEvent(QDropEvent *event) override; + void dragEnterEvent(QDragEnterEvent *event) override; + void dragMoveEvent(QDragMoveEvent *event) override; +}; + +#endif // OPENRGBPLUGINSLIST_H diff --git a/qt/OpenRGBPluginsPage/OpenRGBPluginsPage.cpp b/qt/OpenRGBPluginsPage/OpenRGBPluginsPage.cpp index 46a280b3..df07e462 100644 --- a/qt/OpenRGBPluginsPage/OpenRGBPluginsPage.cpp +++ b/qt/OpenRGBPluginsPage/OpenRGBPluginsPage.cpp @@ -88,7 +88,17 @@ void Ui::OpenRGBPluginsPage::on_InstallPluginButton_clicked() \*-----------------------------------------------------*/ QString install_file = QFileDialog::getOpenFileName(this, "Install OpenRGB Plugin", "", "DLL Files (*.dll; *.dylib; *.so; *.so.*)"); - std::string from_path = install_file.toStdString(); + bool installed = InstallPlugin(install_file.toStdString()); + + if(installed) + { + RefreshList(); + } +} + +bool Ui::OpenRGBPluginsPage::InstallPlugin(std::string install_file) +{ + std::string from_path = install_file; std::string to_path = ResourceManager::get()->GetConfigurationDirectory() + "plugins/"; std::string to_file = to_path + filesystem::path(from_path).filename().string(); bool match = false; @@ -116,7 +126,7 @@ void Ui::OpenRGBPluginsPage::on_InstallPluginButton_clicked() if(reply != QMessageBox::Yes) { - return; + return false; } } @@ -132,12 +142,14 @@ void Ui::OpenRGBPluginsPage::on_InstallPluginButton_clicked() plugin_manager->AddPlugin(to_file); - RefreshList(); + return true; } catch(std::exception& e) { } + + return false; } void Ui::OpenRGBPluginsPage::on_RemovePluginButton_clicked() @@ -306,3 +318,19 @@ void Ui::OpenRGBPluginsPage::on_PluginsList_itemSelectionChanged() \*-----------------------------------------------------*/ ui->RemovePluginButton->setEnabled(!ui->PluginsList->selectedItems().empty()); } + +void Ui::OpenRGBPluginsPage::on_PluginsList_PluginsDropped(std::vector path_list) +{ + bool installed = false; + + for(const std::string& file_path: path_list) + { + installed |= InstallPlugin(file_path); + } + + if(installed) + { + RefreshList(); + } +} + diff --git a/qt/OpenRGBPluginsPage/OpenRGBPluginsPage.h b/qt/OpenRGBPluginsPage/OpenRGBPluginsPage.h index 405e747d..0a20f7ab 100644 --- a/qt/OpenRGBPluginsPage/OpenRGBPluginsPage.h +++ b/qt/OpenRGBPluginsPage/OpenRGBPluginsPage.h @@ -27,12 +27,15 @@ private slots: void on_RemovePluginButton_clicked(); void on_PluginsList_itemSelectionChanged(); + + void on_PluginsList_PluginsDropped(std::vector); private: Ui::OpenRGBPluginsPageUi* ui; PluginManager* plugin_manager; std::vector entries; + bool InstallPlugin(std::string path); void RefreshList(); }; diff --git a/qt/OpenRGBPluginsPage/OpenRGBPluginsPage.ui b/qt/OpenRGBPluginsPage/OpenRGBPluginsPage.ui index c8a69ae3..36fb575c 100644 --- a/qt/OpenRGBPluginsPage/OpenRGBPluginsPage.ui +++ b/qt/OpenRGBPluginsPage/OpenRGBPluginsPage.ui @@ -32,7 +32,7 @@ - + QAbstractItemView::ScrollPerPixel @@ -40,6 +40,13 @@ + + + OpenRGBPluginsList + QListWidget +
qt/OpenRGBPluginsPage/OpenRGBPluginsList.h
+
+