298 lines · 10.0 KB · C++
RawDownload
////  ImportDialog.cpp//  hifi////  Created by Clement Brisset on 8/12/13.//  Copyright (c) 2013 High Fidelity, Inc. All rights reserved.// #include <QStandardPaths>#include <QGridLayout>#include <QSplitter>#include <QJsonDocument>#include <QJsonArray>#include <QJsonObject> #include "InterfaceConfig.h"#include "Application.h"#include "ImportDialog.h" const QString WINDOW_NAME = QObject::tr("Import Voxels");const QString IMPORT_BUTTON_NAME = QObject::tr("Import Voxels");const QString LOADING_BUTTON_NAME = QObject::tr("Loading ...");const QString PLACE_BUTTON_NAME = QObject::tr("Place voxels");const QString IMPORT_INFO = QObject::tr("<b>Import</b> %1 as voxels");const QString CANCEL_BUTTON_NAME = QObject::tr("Cancel"); const QString DOWNLOAD_LOCATION = QStandardPaths::writableLocation(QStandardPaths::DownloadLocation);const int SHORT_FILE_EXTENSION = 4;const int SECOND_INDEX_LETTER = 1; QIcon HiFiIconProvider::icon(QFileIconProvider::IconType type) const {     // types    // Computer, Desktop, Trashcan, Network, Drive, Folder, File    QString typeString;     switch (type) {        case QFileIconProvider::Computer:            typeString = "computer";            break;         case QFileIconProvider::Desktop:            typeString = "desktop";            break;         case QFileIconProvider::Trashcan:        case QFileIconProvider::Network:        case QFileIconProvider::Drive:        case QFileIconProvider::Folder:            typeString = "folder";            break;         default:            typeString = "file";            break;    }     return QIcon(Application::resourcesPath() + "icons/" + typeString + ".svg");} QIcon HiFiIconProvider::icon(const QFileInfo &info) const {    const QString ext = info.suffix().toLower();     if (info.isDir()) {        if (info.absoluteFilePath() == QDir::homePath()) {            return QIcon(Application::resourcesPath() + "icons/home.svg");        } else if (info.absoluteFilePath() == QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)) {            return QIcon(Application::resourcesPath() + "icons/desktop.svg");        } else if (info.absoluteFilePath() == QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)) {            return QIcon(Application::resourcesPath() + "icons/documents.svg");        }        return QIcon(Application::resourcesPath() + "icons/folder.svg");    }     QFileInfo iconFile(Application::resourcesPath() + "icons/" + iconsMap[ext]);    if (iconFile.exists() && iconFile.isFile()) {        return QIcon(iconFile.filePath());    }     return QIcon(Application::resourcesPath() + "icons/file.svg");} QString HiFiIconProvider::type(const QFileInfo &info) const {    if (info.isFile()) {        if (info.suffix().size() > SHORT_FILE_EXTENSION) {            // Capitalize extension            return info.suffix().left(SECOND_INDEX_LETTER).toUpper() + info.suffix().mid(SECOND_INDEX_LETTER);        }        return info.suffix().toUpper();    }     return QFileIconProvider::type(info);} ImportDialog::ImportDialog(QWidget* parent) :    QFileDialog(parent, WINDOW_NAME, DOWNLOAD_LOCATION, NULL),    _progressBar(this),    _importButton(IMPORT_BUTTON_NAME, this),    _cancelButton(CANCEL_BUTTON_NAME, this),    _mode(importMode) {     setOption(QFileDialog::DontUseNativeDialog, true);    setFileMode(QFileDialog::ExistingFile);    setViewMode(QFileDialog::Detail);     setImportTypes();    setLayout();     _progressBar.setRange(0, 100);        connect(&_importButton, SIGNAL(pressed()), SLOT(accept()));    connect(&_cancelButton, SIGNAL(pressed()), SIGNAL(canceled()));    connect(this, SIGNAL(currentChanged(QString)), SLOT(saveCurrentFile(QString)));} void ImportDialog::reset() {    setMode(importMode);    _progressBar.setValue(0);} void ImportDialog::setMode(dialogMode mode) {    _mode = mode;        switch (_mode) {        case loadingMode:            _importButton.setEnabled(false);            _importButton.setText(LOADING_BUTTON_NAME);            findChild<QWidget*>("sidebar")->setEnabled(false);            findChild<QWidget*>("treeView")->setEnabled(false);            findChild<QWidget*>("backButton")->setEnabled(false);            findChild<QWidget*>("forwardButton")->setEnabled(false);            findChild<QWidget*>("toParentButton")->setEnabled(false);            break;        case placeMode:            _progressBar.setValue(100);            _importButton.setEnabled(true);            _importButton.setText(PLACE_BUTTON_NAME);            findChild<QWidget*>("sidebar")->setEnabled(false);            findChild<QWidget*>("treeView")->setEnabled(false);            findChild<QWidget*>("backButton")->setEnabled(false);            findChild<QWidget*>("forwardButton")->setEnabled(false);            findChild<QWidget*>("toParentButton")->setEnabled(false);            break;        case importMode:        default:            _progressBar.setValue(0);            _importButton.setEnabled(true);            _importButton.setText(IMPORT_BUTTON_NAME);            findChild<QWidget*>("sidebar")->setEnabled(true);            findChild<QWidget*>("treeView")->setEnabled(true);            findChild<QWidget*>("backButton")->setEnabled(true);            findChild<QWidget*>("forwardButton")->setEnabled(true);            findChild<QWidget*>("toParentButton")->setEnabled(true);            break;    }} void ImportDialog::setProgressBarValue(int value) {    _progressBar.setValue(value);} void ImportDialog::accept() {    emit accepted();} void ImportDialog::saveCurrentFile(QString filename) {    _currentFile = QFileInfo(filename).isFile() ? filename : "";} void ImportDialog::setLayout() {    QGridLayout* gridLayout = (QGridLayout*) layout();    gridLayout->addWidget(&_progressBar, 2, 0, 2, 1);    gridLayout->addWidget(&_cancelButton, 2, 1, 2, 1);    gridLayout->addWidget(&_importButton, 2, 2, 2, 1);        // set ObjectName used in qss for styling    _progressBar.setObjectName("progressBar");    _importButton.setObjectName("importButton");    _cancelButton.setObjectName("cancelButton");     // set fixed size    _importButton.setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);    _cancelButton.setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);    _cancelButton.setFlat(true);    int progressBarHeight = 7;    _progressBar.setFixedHeight(progressBarHeight);    _progressBar.setTextVisible(false);        QGridLayout* subLayout = new QGridLayout();    subLayout->addWidget(findChild<QWidget*>("lookInLabel"), 0, 0, 1, 5);        QSize BUTTON_SIZE = QSize(43, 33);    QPushButton* button = (QPushButton*) findChild<QWidget*>("backButton");    button->setIcon(QIcon());    button->setFixedSize(BUTTON_SIZE);    subLayout->addWidget(button, 1, 0, 1, 1);        button = (QPushButton*) findChild<QWidget*>("forwardButton");    button->setIcon(QIcon());    button->setFixedSize(BUTTON_SIZE);    subLayout->addWidget(button, 1, 1, 1, 1);        button = (QPushButton*) findChild<QWidget*>("toParentButton");    button->setIcon(QIcon());    button->setFixedSize(BUTTON_SIZE);    subLayout->addWidget(button, 1, 2, 1, 1);        gridLayout->addLayout(subLayout, 0, 0, 1, 1);     // hide unused embedded widgets in QFileDialog    QWidget* widget = findChild<QWidget*>("lookInCombo");    widget->hide();        widget = findChild<QWidget*>("newFolderButton");    widget->hide();     widget = findChild<QWidget*>("listModeButton");    widget->hide();     widget = findChild<QWidget*>("detailModeButton");    widget->hide();     widget = findChild<QWidget*>("fileNameEdit");    widget->hide();     widget = findChild<QWidget*>("fileTypeCombo");    widget->hide();     widget = findChild<QWidget*>("fileTypeLabel");    widget->hide();     widget = findChild<QWidget*>("fileNameLabel");    widget->hide();     widget = findChild<QWidget*>("buttonBox");    widget->hide();     QSplitter* splitter = findChild<QSplitter*>("splitter");    splitter->setHandleWidth(0);     // remove blue outline on Mac    widget = findChild<QWidget*>("sidebar");    widget->setAttribute(Qt::WA_MacShowFocusRect, false);     widget = findChild<QWidget*>("treeView");    widget->setAttribute(Qt::WA_MacShowFocusRect, false);        QFile styleSheet(Application::resourcesPath() + "styles/import_dialog.qss");    if (styleSheet.open(QIODevice::ReadOnly)) {        QDir::setCurrent(Application::resourcesPath());        setStyleSheet(styleSheet.readAll());    } } void ImportDialog::setImportTypes() {    QFile config(Application::resourcesPath() + "config/config.json");    config.open(QFile::ReadOnly | QFile::Text);    QJsonDocument document = QJsonDocument::fromJson(config.readAll());    if (!document.isNull() && !document.isEmpty()) {         QString importFormatsInfo;        QString importFormatsFilterList;        QHash<QString, QString> iconsMap;         QJsonObject configObject = document.object();        if (!configObject.isEmpty()) {            QJsonArray fileFormats = configObject["importFormats"].toArray();            int formatsCounter = 0;            foreach (const QJsonValue& fileFormat, fileFormats) {                QJsonObject fileFormatObject = fileFormat.toObject();                 QString ext(fileFormatObject["extension"].toString());                QString icon(fileFormatObject.value("icon").toString());                 if (formatsCounter > 0) {                    importFormatsInfo.append(",");                }                 // set ' or' on last import type text                if (formatsCounter == fileFormats.count() - 1) {                    importFormatsInfo.append(" or");                }                 importFormatsFilterList.append(QString("*.%1 ").arg(ext));                importFormatsInfo.append(" .").append(ext);                iconsMap[ext] = icon;                formatsCounter++;            }        }         // set custom file icons        setIconProvider(new HiFiIconProvider(iconsMap));        setNameFilter(importFormatsFilterList);         setLabelText(QFileDialog::LookIn, QString(IMPORT_INFO).arg(importFormatsInfo));    }}