BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
GUIHelpers.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file GUI/coregui/utils/GUIHelpers.cpp
6 //! @brief Implements GUIHelpers functions
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2018
11 //! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************************************
14 
16 #include "BAVersion.h"
20 #include <QApplication>
21 #include <QDateTime>
22 #include <QDir>
23 #include <QMessageBox>
24 #include <QPushButton>
25 #include <QTextStream>
26 #include <QUuid>
27 
28 namespace {
29 QMap<QString, QString> initializeCharacterMap()
30 {
31  QMap<QString, QString> result;
32  result["\\"] = "_backslash_";
33  result["/"] = "_slash_";
34  result["\""] = "_quote_";
35  result["<"] = "_lessthan_";
36  result[">"] = "_greaterthan_";
37  result["|"] = "_pipe_";
38  result["?"] = "_questionmark_";
39  return result;
40 }
41 
42 const QMap<QString, QString> invalidCharacterMap = initializeCharacterMap();
43 } // Anonymous namespace
44 
45 namespace GUIHelpers {
46 
47 Error::~Error() noexcept = default;
48 
49 const char* Error::what() const noexcept
50 {
51  return m_messageAsLatin1.data();
52 }
53 
54 void information(QWidget* parent, const QString& title, const QString& text,
55  const QString& detailedText)
56 {
57  QScopedPointer<QMessageBox> messageBox(new QMessageBox(parent));
58  if (parent)
59  messageBox->setWindowModality(Qt::WindowModal);
60  messageBox->setWindowTitle(QString("%1 - %2").arg(QApplication::applicationName()).arg(title));
61  messageBox->setText(text);
62  if (!detailedText.isEmpty())
63  messageBox->setInformativeText(detailedText);
64  messageBox->setIcon(QMessageBox::Information);
65  messageBox->addButton(QMessageBox::Ok);
66  messageBox->exec();
67 }
68 
69 void information(const QString& title, const QString& text, const QString& detailedText)
70 {
71  information(MainWindow::instance(), title, text, detailedText);
72 }
73 
74 void warning(QWidget* parent, const QString& title, const QString& text,
75  const QString& detailedText)
76 {
77  QScopedPointer<QMessageBox> messageBox(new QMessageBox(parent));
78  if (parent)
79  messageBox->setWindowModality(Qt::WindowModal);
80  messageBox->setWindowTitle(QString("%1 - %2").arg(QApplication::applicationName()).arg(title));
81  messageBox->setText(text);
82  if (!detailedText.isEmpty())
83  messageBox->setInformativeText(detailedText);
84  messageBox->setIcon(QMessageBox::Warning);
85  messageBox->addButton(QMessageBox::Ok);
86  messageBox->exec();
87 }
88 
89 void warning(const QString& title, const QString& text, const QString& detailedText)
90 {
91  warning(MainWindow::instance(), title, text, detailedText);
92 }
93 
94 bool question(QWidget* parent, const QString& title, const QString& text,
95  const QString& detailedText, const QString& yesText, const QString& noText)
96 {
97  QScopedPointer<QMessageBox> messageBox(new QMessageBox(parent));
98  if (parent)
99  messageBox->setWindowModality(Qt::WindowModal);
100  messageBox->setWindowTitle(QString("%1 - %2").arg(QApplication::applicationName()).arg(title));
101  messageBox->setText(text);
102  if (!detailedText.isEmpty())
103  messageBox->setInformativeText(detailedText);
104  messageBox->setIcon(QMessageBox::Question);
105  QAbstractButton* yesButton = messageBox->addButton(yesText, QMessageBox::AcceptRole);
106  messageBox->addButton(noText, QMessageBox::RejectRole);
107  messageBox->setDefaultButton(qobject_cast<QPushButton*>(yesButton));
108  messageBox->exec();
109  return messageBox->clickedButton() == yesButton;
110 }
111 
112 bool okToDelete(QWidget* parent, const QString& title, const QString& text,
113  const QString& detailedText)
114 {
115  QScopedPointer<QMessageBox> messageBox(new QMessageBox(parent));
116  if (parent)
117  messageBox->setWindowModality(Qt::WindowModal);
118  messageBox->setIcon(QMessageBox::Question);
119  messageBox->setWindowTitle(QString("%1 - %2").arg(QApplication::applicationName()).arg(title));
120  messageBox->setText(text);
121  if (!detailedText.isEmpty())
122  messageBox->setInformativeText(detailedText);
123  QAbstractButton* deleteButton = messageBox->addButton("&Delete", QMessageBox::AcceptRole);
124  messageBox->addButton("Do &Not Delete", QMessageBox::RejectRole);
125  messageBox->setDefaultButton(qobject_cast<QPushButton*>(deleteButton));
126  messageBox->exec();
127  return messageBox->clickedButton() == deleteButton;
128 }
129 
131 {
132  return QString::fromStdString(BornAgain::GetVersionNumber());
133 }
134 
135 //! Returns valid file name to be saved on disk. This name is constructed from proposed_name
136 //! by replacing all special characters with text representation
137 //! \ backslash
138 //! / slash
139 //! " quote
140 //! < lessthan
141 //! > greaterthan
142 //! | pipe
143 //! ? questionmark
144 QString getValidFileName(const QString& proposed_name)
145 {
146  QString result = proposed_name;
147  for (auto it = invalidCharacterMap.begin(); it != invalidCharacterMap.end(); ++it) {
148  result.replace(it.key(), it.value());
149  }
150  return result;
151 }
152 
153 //! parses version string into 3 numbers, returns true in the case of success
154 bool parseVersion(const QString& version, int& major_num, int& minor_num, int& patch_num)
155 {
156  major_num = minor_num = patch_num = 0;
157  bool success(true);
158  QStringList nums = version.split(".");
159  if (nums.size() != 3)
160  return false;
161 
162  bool ok(false);
163  major_num = nums.at(0).toInt(&ok);
164  success &= ok;
165  minor_num = nums.at(1).toInt(&ok);
166  success &= ok;
167  patch_num = nums.at(2).toInt(&ok);
168  success &= ok;
169 
170  return success;
171 }
172 
173 int versionCode(const QString& version)
174 {
175  int result(-1);
176 
177  int ba_major(0), ba_minor(0), ba_patch(0);
178  if (!parseVersion(version, ba_major, ba_minor, ba_patch))
179  return result;
180 
181  result = ba_major * 10000 + ba_minor * 100 + ba_patch;
182 
183  return result;
184 }
185 
186 //! returns true if current BornAgain version match minimal required version
187 bool isVersionMatchMinimal(const QString& version, const QString& minimal_version)
188 {
189  return versionCode(version) >= versionCode(minimal_version);
190 }
191 
192 //! Returns file directory from the full file path
193 QString fileDir(const QString& fileName)
194 {
195  QFileInfo info(fileName);
196  if (info.exists()) {
197  return info.dir().path();
198  }
199  return "";
200 }
201 
202 //! Returns base name of file.
203 
204 QString baseName(const QString& fileName)
205 {
206  QFileInfo info(fileName);
207  return info.baseName();
208 }
209 
211 {
212  return QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss");
213  ;
214 }
215 
216 // QStringList fromStdList(const std::list<std::string> &string_list)
217 //{
218 // QStringList result;
219 // for(std::string str : string_list) {
220 // result.append(QString::fromStdString(str));
221 // }
222 // return result;
223 //}
224 
225 QVector<double> fromStdVector(const std::vector<double>& data)
226 {
227  QVector<double> result;
228  result.reserve(int(data.size()));
229  std::copy(data.begin(), data.end(), std::back_inserter(result));
230  return result;
231 }
232 
233 QStringList fromStdStrings(const std::vector<std::string>& container)
234 {
235  QStringList result;
236  for (std::string str : container) {
237  result.append(QString::fromStdString(str));
238  }
239  return result;
240 }
241 
242 QString createUuid()
243 {
244  return QUuid::createUuid().toString();
245 }
246 
247 QString readTextFile(const QString& fileName)
248 {
249  QFile file(fileName);
250  if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
251  throw GUIHelpers::Error("PyImportAssistant::readFile() -> Error. Can't read file '"
252  + fileName + "'");
253  QTextStream in(&file);
254  return in.readAll();
255 }
256 
257 } // namespace GUIHelpers
Defines class GUIHelpers functions.
Defines class MainWindow.
Defines class JobItem.
Defines class RealDataItem.
QByteArray m_messageAsLatin1
Definition: GUIHelpers.h:40
virtual ~Error() noexcept
const char * what() const noexcept override
Definition: GUIHelpers.cpp:49
static MainWindow * instance()
Returns the one and only instance of this class.
Definition: mainwindow.cpp:129
QString getBornAgainVersionString()
Definition: GUIHelpers.cpp:130
QString currentDateTime()
Definition: GUIHelpers.cpp:210
void warning(QWidget *parent, const QString &title, const QString &text, const QString &detailedText)
Definition: GUIHelpers.cpp:74
QString baseName(const QString &fileName)
Returns base name of file.
Definition: GUIHelpers.cpp:204
bool parseVersion(const QString &version, int &major_num, int &minor_num, int &patch_num)
parses version string into 3 numbers, returns true in the case of success
Definition: GUIHelpers.cpp:154
void information(QWidget *parent, const QString &title, const QString &text, const QString &detailedText)
Definition: GUIHelpers.cpp:54
int versionCode(const QString &version)
Definition: GUIHelpers.cpp:173
QString getValidFileName(const QString &proposed_name)
Returns valid file name to be saved on disk.
Definition: GUIHelpers.cpp:144
QString createUuid()
Definition: GUIHelpers.cpp:242
bool okToDelete(QWidget *parent, const QString &title, const QString &text, const QString &detailedText)
Definition: GUIHelpers.cpp:112
QString fileDir(const QString &fileName)
Returns file directory from the full file path.
Definition: GUIHelpers.cpp:193
QVector< double > fromStdVector(const std::vector< double > &data)
Definition: GUIHelpers.cpp:225
QString readTextFile(const QString &fileName)
Definition: GUIHelpers.cpp:247
bool isVersionMatchMinimal(const QString &version, const QString &minimal_version)
returns true if current BornAgain version match minimal required version
Definition: GUIHelpers.cpp:187
bool question(QWidget *parent, const QString &title, const QString &text, const QString &detailedText, const QString &yesText, const QString &noText)
Definition: GUIHelpers.cpp:94
QStringList fromStdStrings(const std::vector< std::string > &container)
Definition: GUIHelpers.cpp:233