ui: fixed files and directories dialog to offer selection of files (issue #521)
* added and used QtFilesAndDirectoriesDialog in file list boxes for windows and linux * implemented allowing to select multiple entries which adds more rows to the path listbox
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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<std::string>& 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<std::string>& 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++)
|
||||
|
||||
@@ -59,6 +59,8 @@ public:
|
||||
std::vector<std::string> getStringList();
|
||||
void setStringList(const std::vector<std::string>& list);
|
||||
|
||||
void addListBoxItemWithText(const QString& text);
|
||||
|
||||
void selectItem(QListWidgetItem* item);
|
||||
|
||||
bool isForStrings() const;
|
||||
|
||||
@@ -4,36 +4,33 @@
|
||||
#include <QListView>
|
||||
#include <QTreeView>
|
||||
|
||||
#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<QListView*>("listView");
|
||||
QListView *l = dialog->findChild<QListView*>("listView");
|
||||
if (l)
|
||||
{
|
||||
l->setSelectionMode(QAbstractItemView::SingleSelection);
|
||||
l->setSelectionMode(QAbstractItemView::ExtendedSelection);
|
||||
}
|
||||
QTreeView *t = dialog.findChild<QTreeView*>();
|
||||
QTreeView *t = dialog->findChild<QTreeView*>();
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
#include "qt/utility/QtFilesAndDirectoriesDialog.h"
|
||||
|
||||
#include <QListView>
|
||||
#include <QPushButton>
|
||||
#include <QEvent>
|
||||
|
||||
#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<QPushButton*>())
|
||||
{
|
||||
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<QPushButton*>(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);
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
#ifndef QT_FILES_AND_DIRECTORIES_DIALOG
|
||||
#define QT_FILES_AND_DIRECTORIES_DIALOG
|
||||
|
||||
#include <QFileDialog>
|
||||
|
||||
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
|
||||
Reference in New Issue
Block a user