Skip to content
Snippets Groups Projects
GUIHelpers.cpp 7.48 KiB
Newer Older
  • Learn to ignore specific revisions
  • //  ************************************************************************************************
    
    //
    //  BornAgain: simulate and fit scattering at grazing incidence
    //
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
    //! @brief     Implements GUIHelpers functions
    
    //! @homepage  http://www.bornagainproject.org
    
    //! @license   GNU General Public License v3 or higher (see COPYING)
    
    //! @copyright Forschungszentrum Jülich GmbH 2018
    //! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
    
    //  ************************************************************************************************
    
    #include "GUI/coregui/utils/GUIHelpers.h"
    
    #include "GUI/coregui/Models/JobItem.h"
    #include "GUI/coregui/Models/RealDataItem.h"
    
    #include <QApplication>
    
    #include <QDateTime>
    
    #include <QMessageBox>
    #include <QPushButton>
    
    #include <QTextStream>
    
    namespace {
    QMap<QString, QString> initializeCharacterMap() {
    
        result["\\"] = "_backslash_";
        result["/"] = "_slash_";
        result["\""] = "_quote_";
        result["<"] = "_lessthan_";
        result[">"] = "_greaterthan_";
        result["|"] = "_pipe_";
        result["?"] = "_questionmark_";
    
        return result;
    }
    
    const QMap<QString, QString> invalidCharacterMap = initializeCharacterMap();
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
    } // Anonymous namespace
    
    namespace GUIHelpers {
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
    Error::~Error() noexcept = default;
    
    const char* Error::what() const noexcept {
    
        return m_messageAsLatin1.data();
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
    }
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
    void information(QWidget* parent, const QString& title, const QString& text,
    
                     const QString& detailedText) {
    
        QScopedPointer<QMessageBox> messageBox(new QMessageBox(parent));
        if (parent)
            messageBox->setWindowModality(Qt::WindowModal);
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
        messageBox->setWindowTitle(QString("%1 - %2").arg(QApplication::applicationName()).arg(title));
    
        messageBox->setText(text);
        if (!detailedText.isEmpty())
            messageBox->setInformativeText(detailedText);
        messageBox->setIcon(QMessageBox::Information);
        messageBox->addButton(QMessageBox::Ok);
        messageBox->exec();
    }
    
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
    void warning(QWidget* parent, const QString& title, const QString& text,
    
                 const QString& detailedText) {
    
        QScopedPointer<QMessageBox> messageBox(new QMessageBox(parent));
        if (parent)
            messageBox->setWindowModality(Qt::WindowModal);
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
        messageBox->setWindowTitle(QString("%1 - %2").arg(QApplication::applicationName()).arg(title));
    
        messageBox->setText(text);
        if (!detailedText.isEmpty())
            messageBox->setInformativeText(detailedText);
        messageBox->setIcon(QMessageBox::Warning);
        messageBox->addButton(QMessageBox::Ok);
        messageBox->exec();
    }
    
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
    bool question(QWidget* parent, const QString& title, const QString& text,
    
                  const QString& detailedText, const QString& yesText, const QString& noText) {
    
        QScopedPointer<QMessageBox> messageBox(new QMessageBox(parent));
        if (parent)
            messageBox->setWindowModality(Qt::WindowModal);
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
        messageBox->setWindowTitle(QString("%1 - %2").arg(QApplication::applicationName()).arg(title));
    
        messageBox->setText(text);
        if (!detailedText.isEmpty())
            messageBox->setInformativeText(detailedText);
        messageBox->setIcon(QMessageBox::Question);
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
        QAbstractButton* yesButton = messageBox->addButton(yesText, QMessageBox::AcceptRole);
    
        messageBox->addButton(noText, QMessageBox::RejectRole);
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
        messageBox->setDefaultButton(qobject_cast<QPushButton*>(yesButton));
    
        messageBox->exec();
        return messageBox->clickedButton() == yesButton;
    }
    
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
    bool okToDelete(QWidget* parent, const QString& title, const QString& text,
    
                    const QString& detailedText) {
    
        QScopedPointer<QMessageBox> messageBox(new QMessageBox(parent));
        if (parent)
            messageBox->setWindowModality(Qt::WindowModal);
        messageBox->setIcon(QMessageBox::Question);
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
        messageBox->setWindowTitle(QString("%1 - %2").arg(QApplication::applicationName()).arg(title));
    
        messageBox->setText(text);
        if (!detailedText.isEmpty())
            messageBox->setInformativeText(detailedText);
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
        QAbstractButton* deleteButton = messageBox->addButton("&Delete", QMessageBox::AcceptRole);
    
        messageBox->addButton("Do &Not Delete", QMessageBox::RejectRole);
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
        messageBox->setDefaultButton(qobject_cast<QPushButton*>(deleteButton));
    
        messageBox->exec();
        return messageBox->clickedButton() == deleteButton;
    }
    
    
    QString getBornAgainVersionString() {
    
        return QString::fromStdString(BornAgain::GetVersionNumber());
    }
    
    //! Returns valid file name to be saved on disk. This name is constructed from proposed_name
    //! by replacing all special characters with text representation
    //! \ backslash
    //! / slash
    //! " quote
    //! < lessthan
    //! > greaterthan
    //! | pipe
    //! ? questionmark
    
    QString getValidFileName(const QString& proposed_name) {
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
        for (auto it = invalidCharacterMap.begin(); it != invalidCharacterMap.end(); ++it) {
    
    //! parses version string into 3 numbers, returns true in the case of success
    
    bool parseVersion(const QString& version, int& major_num, int& minor_num, int& patch_num) {
    
        major_num = minor_num = patch_num = 0;
        bool success(true);
    
        QStringList nums = version.split(".");
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
        if (nums.size() != 3)
            return false;
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
        major_num = nums.at(0).toInt(&ok);
        success &= ok;
        minor_num = nums.at(1).toInt(&ok);
        success &= ok;
        patch_num = nums.at(2).toInt(&ok);
        success &= ok;
    
    int versionCode(const QString& version) {
    
        int ba_major(0), ba_minor(0), ba_patch(0);
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
        if (!parseVersion(version, ba_major, ba_minor, ba_patch))
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
        result = ba_major * 10000 + ba_minor * 100 + ba_patch;
    
    //! returns true if current BornAgain version match minimal required version
    
    bool isVersionMatchMinimal(const QString& version, const QString& minimal_version) {
    
        return versionCode(version) >= versionCode(minimal_version);
    
    QString fileDir(const QString& fileName) {
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
        if (info.exists()) {
    
    //! Returns base name of file.
    
    
    QString baseName(const QString& fileName) {
    
        QFileInfo info(fileName);
        return info.baseName();
    }
    
    
    QString currentDateTime() {
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
        return QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss");
        ;
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
    // QStringList fromStdList(const std::list<std::string> &string_list)
    
    //{
    //    QStringList result;
    //    for(std::string str : string_list) {
    //        result.append(QString::fromStdString(str));
    //    }
    //    return result;
    //}
    
    QVector<double> fromStdVector(const std::vector<double>& data) {
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
        result.reserve(int(data.size()));
        std::copy(data.begin(), data.end(), std::back_inserter(result));
    
    QStringList fromStdStrings(const std::vector<std::string>& container) {
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
        for (std::string str : container) {
    
            result.append(QString::fromStdString(str));
        }
        return result;
    }
    
    
    QString createUuid() {
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
        return QUuid::createUuid().toString();
    
    QString readTextFile(const QString& fileName) {
    
        QFile file(fileName);
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    
    Pospelov, Gennady's avatar
    Pospelov, Gennady committed
            throw GUIHelpers::Error("PyImportAssistant::readFile() -> Error. Can't read file '"
                                    + fileName + "'");
    
        QTextStream in(&file);
        return in.readAll();
    }
    
    
    } // namespace GUIHelpers