16#include <QRegularExpression>
21QString makeNumber(
double d) {
return QString::number(d,
'g', 16); }
22const int valueColumn = 0;
23const int roleColumn = 1;
40 const std::vector<std::string> &datasetNames,
41 const std::vector<std::string> &datasetDomainNames,
43 const QStringList &ties,
const QStringList &constraints)
44 : MantidDialog(parent), m_parName(parName), m_values(values), m_fixes(fixes), m_ties(
std::move(ties)),
45 m_constraints(
std::move(constraints)) {
46 assert(
static_cast<std::size_t
>(values.size()) == datasetDomainNames.size());
47 assert(
static_cast<std::size_t
>(fixes.size()) == datasetDomainNames.size());
48 assert(
static_cast<std::size_t
>(ties.size()) == datasetDomainNames.size());
49 assert(
static_cast<std::size_t
>(constraints.size()) == datasetDomainNames.size());
51 setAttribute(Qt::WA_DeleteOnClose);
52 doSetup(parName, datasetNames, datasetDomainNames);
64 const std::vector<std::string> &datasetDomainNames) {
67 auto *logCombo =
m_uiForm.logValueSelector->getLogComboBox();
68 for (
const auto &logName :
m_logFinder->getLogNames()) {
69 logCombo->addItem(QString::fromStdString(logName));
72 m_uiForm.logValueSelector->setCheckboxShown(
true);
74 QHeaderView *header =
m_uiForm.tableWidget->horizontalHeader();
75 header->setSectionResizeMode(QHeaderView::Stretch);
76 connect(
m_uiForm.tableWidget, SIGNAL(cellChanged(
int,
int)),
this, SLOT(
valueChanged(
int,
int)));
77 m_uiForm.lblParameterName->setText(
"Parameter: " + QString::fromStdString(parName));
79 for (
int i = 0; i < static_cast<int>(datasetDomainNames.size()); i++) {
81 auto cell =
new QTableWidgetItem(makeNumber(
m_values[i]));
82 m_uiForm.tableWidget->setItem(i, valueColumn, cell);
83 auto headerItem =
new QTableWidgetItem(QString::fromStdString(datasetDomainNames[i]));
84 m_uiForm.tableWidget->setVerticalHeaderItem(i, headerItem);
85 cell =
new QTableWidgetItem(
"");
86 auto flags = cell->flags();
87 flags ^= Qt::ItemIsEditable;
88 flags ^= Qt::ItemIsSelectable;
89 flags ^= Qt::ItemIsEnabled;
90 cell->setFlags(flags);
91 m_uiForm.tableWidget->setItem(i, roleColumn, cell);
95 m_uiForm.tableWidget->setItemDelegateForColumn(valueColumn, deleg);
99 connect(deleg, SIGNAL(
setTie(
int, QString)),
this, SLOT(
setTie(
int, QString)));
106 m_uiForm.tableWidget->installEventFilter(
this);
117 if (col == valueColumn) {
118 QString text =
m_uiForm.tableWidget->item(row, col)->text();
121 double value = text.toDouble(&ok);
127 }
catch (std::exception &) {
138 for (
int i = 0; i <
n; ++i) {
140 m_uiForm.tableWidget->item(i, valueColumn)->setText(makeNumber(
value));
178 for (
int i = 0; i <
m_ties.size(); ++i) {
204 for (
int i = 0; i <
m_fixes.size(); ++i) {
214 if (
obj ==
m_uiForm.tableWidget && ev->type() == QEvent::ContextMenu) {
217 return QDialog::eventFilter(
obj, ev);
222 auto selection =
m_uiForm.tableWidget->selectionModel()->selectedColumns();
224 bool hasSelection =
false;
226 for (
auto &
index : selection) {
227 if (
index.column() == valueColumn)
234 QMenu *menu =
new QMenu(
this);
236 QAction *action =
new QAction(
"Copy",
this);
237 action->setToolTip(
"Copy data to clipboard.");
238 connect(action, SIGNAL(triggered()),
this, SLOT(
copy()));
239 menu->addAction(action);
242 QAction *action =
new QAction(
"Paste",
this);
243 action->setToolTip(
"Paste data from clipboard.");
244 connect(action, SIGNAL(triggered()),
this, SLOT(
paste()));
245 auto text = QApplication::clipboard()->text();
246 action->setEnabled(!text.isEmpty());
247 menu->addAction(action);
250 menu->exec(QCursor::pos());
258 for (
int i = 0; i <
n; ++i) {
261 QApplication::clipboard()->setText(text.join(
"\n"));
266 auto text = QApplication::clipboard()->text();
267 auto vec = text.split(QRegularExpression(
"\\s|,"), Qt::SkipEmptyParts);
268 auto n = qMin(
vec.size(),
m_uiForm.tableWidget->rowCount());
273 for (
int i = 0; i <
n; ++i) {
279 m_uiForm.tableWidget->item(i, valueColumn)->setText(str);
285 for (
int i = 0; i <
m_values.size(); ++i) {
287 auto text = makeNumber(
m_values[i]);
288 m_uiForm.tableWidget->item(i, valueColumn)->setText(text +
" ");
289 m_uiForm.tableWidget->item(i, valueColumn)->setText(text);
299 cell->setForeground(QBrush(Qt::red));
302 cell->setForeground(QBrush(Qt::blue));
305 cell->setForeground(QBrush(Qt::darkGreen));
315 for (
int j = 0; j <
m_fixes.size(); ++j) {
324 for (
int j = 0; j <
m_fixes.size(); ++j) {
333 for (
int j = 0; j <
m_fixes.size(); ++j) {
334 if (j != i && !
m_ties[j].isEmpty())
345 const auto &logName =
m_uiForm.logValueSelector->getLog();
346 const auto &function =
m_uiForm.logValueSelector->getFunction();
348 double value = std::numeric_limits<double>::quiet_NaN();
351 }
catch (
const std::invalid_argument &err) {
352 const auto &message = QString(
"Failed to get log value:\n\n %1").arg(err.what());
353 QMessageBox::critical(
this,
"Mantid - Error", message);
356 m_uiForm.tableWidget->item(i, valueColumn)->setText(makeNumber(
value));
362 const auto nValues =
m_values.size();
363 for (
int i = 0; i < nValues; ++i) {
double value
The value of the point.
std::map< DeltaEMode::Type, std::string > index
std::vector< T > const * vec
double obj
the value of the quadratic function