diff --git a/src/lib_gui/CMakeLists.txt b/src/lib_gui/CMakeLists.txt index 81331a63..bd7930d2 100644 --- a/src/lib_gui/CMakeLists.txt +++ b/src/lib_gui/CMakeLists.txt @@ -99,6 +99,8 @@ add_files( qt/utility/QtDeviceScaledPixmap.h qt/utility/QtFileDialog.cpp qt/utility/QtFileDialog.h + qt/utility/QtFilesAndDirectoriesDialog.cpp + qt/utility/QtFilesAndDirectoriesDialog.h qt/utility/QtHighlighter.cpp qt/utility/QtHighlighter.h qt/utility/QtScrollSpeedChangeListener.cpp diff --git a/src/lib_gui/qt/element/QtDirectoryListBox.cpp b/src/lib_gui/qt/element/QtDirectoryListBox.cpp index d4ec9d26..76d5b11c 100644 --- a/src/lib_gui/qt/element/QtDirectoryListBox.cpp +++ b/src/lib_gui/qt/element/QtDirectoryListBox.cpp @@ -84,9 +84,14 @@ void QtListItemWidget::handleButtonPress() } QStringList list = QtFileDialog::getFileNamesAndDirectories(this, QString::fromStdString(path.str())); - for (int i = 0; i < list.size(); i++) + if (!list.isEmpty()) { - setText(list.at(i)); + setText(list.at(0)); + } + + for (int i = 1; i < list.size(); i++) + { + m_list->addListBoxItemWithText(list.at(i)); } handleFocus(); @@ -260,8 +265,7 @@ void QtDirectoryListBox::setStringList(const std::vector& list) for (const std::string& str : list) { - QtListItemWidget* widget = addListBoxItem(); - widget->setText(QString::fromStdString(str)); + addListBoxItemWithText(QString::fromStdString(str)); } m_relativeRootDirectory = root; @@ -269,6 +273,12 @@ void QtDirectoryListBox::setStringList(const std::vector& list) QTimer::singleShot(1, this, &QtDirectoryListBox::resize); } +void QtDirectoryListBox::addListBoxItemWithText(const QString& text) +{ + QtListItemWidget* widget = addListBoxItem(); + widget->setText(text); +} + void QtDirectoryListBox::selectItem(QListWidgetItem* item) { for (int i = 0; i < m_list->count(); i++) diff --git a/src/lib_gui/qt/element/QtDirectoryListBox.h b/src/lib_gui/qt/element/QtDirectoryListBox.h index c9d4f330..47f95a40 100644 --- a/src/lib_gui/qt/element/QtDirectoryListBox.h +++ b/src/lib_gui/qt/element/QtDirectoryListBox.h @@ -59,6 +59,8 @@ public: std::vector getStringList(); void setStringList(const std::vector& list); + void addListBoxItemWithText(const QString& text); + void selectItem(QListWidgetItem* item); bool isForStrings() const; diff --git a/src/lib_gui/qt/utility/QtFileDialog.cpp b/src/lib_gui/qt/utility/QtFileDialog.cpp index 422d4450..2ddc7042 100644 --- a/src/lib_gui/qt/utility/QtFileDialog.cpp +++ b/src/lib_gui/qt/utility/QtFileDialog.cpp @@ -4,36 +4,33 @@ #include #include +#include "qt/utility/QtFilesAndDirectoriesDialog.h" #include "utility/utilityApp.h" QStringList QtFileDialog::getFileNamesAndDirectories(QWidget* parent, const QString& dir) { - QFileDialog dialog(parent); + QFileDialog* dialog = (utility::getOsType() == OS_MAC ? new QFileDialog(parent) : new QtFilesAndDirectoriesDialog(parent)); - if (utility::getOsType() != OS_MAC) - { - dialog.setFileMode(QFileDialog::Directory); - } + dialog->setDirectory(getDir(dir)); - dialog.setDirectory(getDir(dir)); - - QListView *l = dialog.findChild("listView"); + QListView *l = dialog->findChild("listView"); if (l) { - l->setSelectionMode(QAbstractItemView::SingleSelection); + l->setSelectionMode(QAbstractItemView::ExtendedSelection); } - QTreeView *t = dialog.findChild(); + QTreeView *t = dialog->findChild(); if (t) { - t->setSelectionMode(QAbstractItemView::SingleSelection); + t->setSelectionMode(QAbstractItemView::ExtendedSelection); } QStringList list; - - if (dialog.exec()) + if (dialog->exec()) { - list = dialog.selectedFiles(); + list = dialog->selectedFiles(); } + + delete dialog; return list; } diff --git a/src/lib_gui/qt/utility/QtFilesAndDirectoriesDialog.cpp b/src/lib_gui/qt/utility/QtFilesAndDirectoriesDialog.cpp new file mode 100644 index 00000000..644fbf23 --- /dev/null +++ b/src/lib_gui/qt/utility/QtFilesAndDirectoriesDialog.cpp @@ -0,0 +1,45 @@ +#include "qt/utility/QtFilesAndDirectoriesDialog.h" + +#include +#include +#include + +#include "utility/file/FilePath.h" +#include "utility/utilityApp.h" + +QtFilesAndDirectoriesDialog::QtFilesAndDirectoriesDialog(QWidget* parent) + : QFileDialog(parent) +{ + setFileMode(QFileDialog::Directory); + setOption(QFileDialog::DontUseNativeDialog, true); + for (QPushButton* button: findChildren()) + { + if (button->text().toLower().contains("open") || button->text().toLower().contains("choose")) + { + button->installEventFilter(this); + button->disconnect(SIGNAL(clicked())); + connect(button, &QPushButton::clicked, this, &QtFilesAndDirectoriesDialog::chooseClicked); + break; + } + } +} + +QtFilesAndDirectoriesDialog::~QtFilesAndDirectoriesDialog() +{ +} + +void QtFilesAndDirectoriesDialog::chooseClicked() +{ + QDialog::accept(); +} + +bool QtFilesAndDirectoriesDialog::eventFilter(QObject* obj, QEvent* event) +{ + QPushButton* button = qobject_cast(obj); + if (event->type() == QEvent::EnabledChange && button && !button->isEnabled()) + { + // we need to check if the button is already enabled, otherwise this would cause an infinite loop + button->setEnabled(true); + } + return QObject::eventFilter(obj, event); +} diff --git a/src/lib_gui/qt/utility/QtFilesAndDirectoriesDialog.h b/src/lib_gui/qt/utility/QtFilesAndDirectoriesDialog.h new file mode 100644 index 00000000..6aef4c6b --- /dev/null +++ b/src/lib_gui/qt/utility/QtFilesAndDirectoriesDialog.h @@ -0,0 +1,22 @@ +#ifndef QT_FILES_AND_DIRECTORIES_DIALOG +#define QT_FILES_AND_DIRECTORIES_DIALOG + +#include + +class QListView; + +class QtFilesAndDirectoriesDialog: public QFileDialog +{ + Q_OBJECT +public: + QtFilesAndDirectoriesDialog(QWidget* parent); + virtual ~QtFilesAndDirectoriesDialog(); + +public slots: + void chooseClicked(); + +private: + bool eventFilter(QObject* obj, QEvent* event); +}; + +#endif // QT_FILES_AND_DIRECTORIES_DIALOG