diff --git a/src/lib_gui/CMakeLists.txt b/src/lib_gui/CMakeLists.txt index 7d126674..9d94fe1e 100644 --- a/src/lib_gui/CMakeLists.txt +++ b/src/lib_gui/CMakeLists.txt @@ -91,6 +91,8 @@ add_files( qt/utility/QtContextMenu.h qt/utility/QtDeviceScaledPixmap.cpp qt/utility/QtDeviceScaledPixmap.h + qt/utility/QtFileDialog.cpp + qt/utility/QtFileDialog.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 7bf72728..56858eaf 100644 --- a/src/lib_gui/qt/element/QtDirectoryListBox.cpp +++ b/src/lib_gui/qt/element/QtDirectoryListBox.cpp @@ -1,17 +1,15 @@ #include "qt/element/QtDirectoryListBox.h" #include -#include #include #include #include -#include #include "qt/element/QtIconButton.h" #include "qt/utility/utilityQt.h" +#include "qt/utility/QtFileDialog.h" #include "qt/window/QtTextEditDialog.h" #include "utility/ResourcePaths.h" -#include "utility/utilityApp.h" #include "utility/utilityString.h" QtListItemWidget::QtListItemWidget(QtDirectoryListBox* list, QListWidgetItem* item, QWidget *parent) @@ -77,37 +75,12 @@ void QtListItemWidget::setFocus() void QtListItemWidget::handleButtonPress() { - QFileDialog dialog(this); - - if (utility::getOsType() != OS_MAC) + QStringList list = QtFileDialog::getFileNamesAndDirectories(this, m_data->text()); + for (int i = 0; i < list.size(); i++) { - dialog.setFileMode(QFileDialog::Directory); + setText(list.at(i)); } - if (m_data->text().size()) - { - dialog.setDirectory(m_data->text()); - } - - QListView *l = dialog.findChild("listView"); - if (l) - { - l->setSelectionMode(QAbstractItemView::SingleSelection); - } - QTreeView *t = dialog.findChild(); - if (t) - { - t->setSelectionMode(QAbstractItemView::SingleSelection); - } - - if (dialog.exec()) - { - QStringList list = dialog.selectedFiles(); - for (int i = 0; i < list.size(); i++) - { - setText(list.at(i)); - } - } handleFocus(); } diff --git a/src/lib_gui/qt/element/QtLocationPicker.cpp b/src/lib_gui/qt/element/QtLocationPicker.cpp index f3873783..8d85af41 100644 --- a/src/lib_gui/qt/element/QtLocationPicker.cpp +++ b/src/lib_gui/qt/element/QtLocationPicker.cpp @@ -1,7 +1,6 @@ #include "qt/element/QtLocationPicker.h" #include -#include #include #include #include @@ -10,6 +9,7 @@ #include "utility/ResourcePaths.h" #include "qt/element/QtIconButton.h" +#include "qt/utility/QtFileDialog.h" QtLocationPicker::QtLocationPicker(QWidget *parent) : QWidget(parent) @@ -101,11 +101,11 @@ void QtLocationPicker::handleButtonPress() QString fileName; if (m_pickDirectory) { - fileName = QFileDialog::getExistingDirectory(this, tr("Select Directory"), m_data->text()); + fileName = QtFileDialog::getExistingDirectory(this, tr("Select Directory"), m_data->text()); } else { - fileName = QFileDialog::getOpenFileName(this, tr("Open File"), m_data->text(), m_fileFilter); + fileName = QtFileDialog::getOpenFileName(this, tr("Open File"), m_data->text(), m_fileFilter); } if (!fileName.isEmpty()) diff --git a/src/lib_gui/qt/graphics/QtGraphicsView.cpp b/src/lib_gui/qt/graphics/QtGraphicsView.cpp index a1cc8415..1bec4726 100644 --- a/src/lib_gui/qt/graphics/QtGraphicsView.cpp +++ b/src/lib_gui/qt/graphics/QtGraphicsView.cpp @@ -1,6 +1,6 @@ #include "qt/graphics/QtGraphicsView.h" -#include +#include #include #include #include @@ -14,6 +14,7 @@ #include "qt/view/graphElements/QtGraphNodeData.h" #include "qt/view/graphElements/QtGraphNodeBundle.h" #include "qt/utility/QtContextMenu.h" +#include "qt/utility/QtFileDialog.h" #include "qt/utility/utilityQt.h" #include "settings/ApplicationSettings.h" #include "utility/messaging/type/MessageDisplayBookmarkCreator.h" @@ -405,58 +406,9 @@ void QtGraphicsView::stopTimer() m_timer->stop(); } -QString ShowSaveFileDialog(QWidget *parent, - const QString &title, - const QString &directory, - const QString &filter) -{ -#if defined(Q_WS_WIN) || defined(Q_WS_MAC) - - return QFileDialog::getSaveFileName(parent, title, directory, filter); - -#else - QFileDialog dialog(parent, title, directory, filter); - - if (parent) - { - dialog.setWindowModality(Qt::WindowModal); - } - - QRegExp filter_regex(QLatin1String("(?:^\\*\\.(?!.*\\()|\\(\\*\\.)(\\w+)")); - QStringList filters = filter.split(QLatin1String(";;")); - - if (!filters.isEmpty()) - { - dialog.setNameFilters(filters); - } - - dialog.setAcceptMode(QFileDialog::AcceptSave); - - if (dialog.exec() == QDialog::Accepted) - { - QString file_name = dialog.selectedFiles().constFirst(); - QFileInfo info(file_name); - - if (info.suffix().isEmpty() && !dialog.selectedNameFilter().isEmpty()) - { - if (filter_regex.indexIn(dialog.selectedNameFilter()) != -1) - { - QString extension = filter_regex.cap(1); - file_name += QLatin1String(".") + extension; - } - } - return file_name; - } - else - { - return QString(); - } -#endif // Q_WS_MAC || Q_WS_WIN -} - void QtGraphicsView::exportGraph() { - QString fileName = ShowSaveFileDialog( + QString fileName = QtFileDialog::showSaveFileDialog( this, "Save image", QDir::homePath(), "PNG (*.png);;JPEG (*.JPEG);;BMP Files (*.bmp)"); if (!fileName.isNull()) diff --git a/src/lib_gui/qt/utility/QtFileDialog.cpp b/src/lib_gui/qt/utility/QtFileDialog.cpp new file mode 100644 index 00000000..9ead6736 --- /dev/null +++ b/src/lib_gui/qt/utility/QtFileDialog.cpp @@ -0,0 +1,110 @@ +#include "qt/utility/QtFileDialog.h" + +#include +#include +#include + +#include "utility/utilityApp.h" + +QStringList QtFileDialog::getFileNamesAndDirectories(QWidget* parent, const QString& dir) +{ + QFileDialog dialog(parent); + + if (utility::getOsType() != OS_MAC) + { + dialog.setFileMode(QFileDialog::Directory); + } + + dialog.setDirectory(getDir(dir)); + + QListView *l = dialog.findChild("listView"); + if (l) + { + l->setSelectionMode(QAbstractItemView::SingleSelection); + } + QTreeView *t = dialog.findChild(); + if (t) + { + t->setSelectionMode(QAbstractItemView::SingleSelection); + } + + QStringList list; + + if (dialog.exec()) + { + list = dialog.selectedFiles(); + } + + return list; +} + +QString QtFileDialog::getExistingDirectory(QWidget* parent, const QString& caption, const QString& dir) +{ + return QFileDialog::getExistingDirectory(parent, caption, getDir(dir)); +} + +QString QtFileDialog::getOpenFileName(QWidget* parent, const QString& caption, const QString& dir, const QString& filter) +{ + return QFileDialog::getOpenFileName(parent, caption, getDir(dir), filter); +} + +QString QtFileDialog::showSaveFileDialog( + QWidget *parent, const QString& title, const QString& directory, const QString& filter) +{ +#if defined(Q_WS_WIN) || defined(Q_WS_MAC) + + return QFileDialog::getSaveFileName(parent, title, directory, filter); + +#else + QFileDialog dialog(parent, title, directory, filter); + + if (parent) + { + dialog.setWindowModality(Qt::WindowModal); + } + + QRegExp filter_regex(QLatin1String("(?:^\\*\\.(?!.*\\()|\\(\\*\\.)(\\w+)")); + QStringList filters = filter.split(QLatin1String(";;")); + + if (!filters.isEmpty()) + { + dialog.setNameFilters(filters); + } + + dialog.setAcceptMode(QFileDialog::AcceptSave); + + if (dialog.exec() == QDialog::Accepted) + { + QString file_name = dialog.selectedFiles().constFirst(); + QFileInfo info(file_name); + + if (info.suffix().isEmpty() && !dialog.selectedNameFilter().isEmpty()) + { + if (filter_regex.indexIn(dialog.selectedNameFilter()) != -1) + { + QString extension = filter_regex.cap(1); + file_name += QLatin1String(".") + extension; + } + } + return file_name; + } + else + { + return QString(); + } +#endif // Q_WS_MAC || Q_WS_WIN +} + +QString QtFileDialog::getDir(QString dir) +{ + static bool used = false; + + if (!used && !dir.size()) + { + dir = QDir::homePath(); + } + + used = true; + + return dir; +} diff --git a/src/lib_gui/qt/utility/QtFileDialog.h b/src/lib_gui/qt/utility/QtFileDialog.h new file mode 100644 index 00000000..fad93b0b --- /dev/null +++ b/src/lib_gui/qt/utility/QtFileDialog.h @@ -0,0 +1,23 @@ +#ifndef QT_FILE_DIALOG +#define QT_FILE_DIALOG + +class QString; +class QStringList; +class QWidget; + +class QtFileDialog +{ +public: + static QStringList getFileNamesAndDirectories(QWidget* parent, const QString& dir); + + static QString getExistingDirectory(QWidget* parent, const QString& caption, const QString& dir); + static QString getOpenFileName(QWidget* parent, const QString& caption, const QString& dir, const QString& filter); + + static QString showSaveFileDialog( + QWidget *parent, const QString& title, const QString& directory, const QString& filter); + +private: + static QString getDir(QString dir); +}; + +#endif // QT_FILE_DIALOG diff --git a/src/lib_gui/qt/window/QtMainWindow.cpp b/src/lib_gui/qt/window/QtMainWindow.cpp index 67e75a62..75b75f14 100644 --- a/src/lib_gui/qt/window/QtMainWindow.cpp +++ b/src/lib_gui/qt/window/QtMainWindow.cpp @@ -1,9 +1,9 @@ #include "qt/window/QtMainWindow.h" #include -#include #include #include +#include #include #include #include @@ -17,6 +17,7 @@ #include "data/bookmark/Bookmark.h" #include "LicenseChecker.h" #include "qt/utility/QtContextMenu.h" +#include "qt/utility/QtFileDialog.h" #include "qt/utility/utilityQt.h" #include "qt/view/QtViewWidgetWrapper.h" #include "qt/window/project_wizzard/QtProjectWizzard.h" @@ -534,7 +535,7 @@ void QtMainWindow::newProjectFromCDB(const std::string& filePath, const std::vec void QtMainWindow::openProject() { - QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "", "Sourcetrail Project Files (*.srctrlprj *.coatiproject)"); + QString fileName = QtFileDialog::getOpenFileName(this, tr("Open File"), QDir::homePath(), "Sourcetrail Project Files (*.srctrlprj *.coatiproject)"); if (!fileName.isEmpty()) {