20QString makeNumber(
double d) {
return QString::number(d,
'g', 16); }
21const int valueColumn = 0;
22const int roleColumn = 1;
39 const std::vector<std::string> &datasetNames,
40 const std::vector<std::string> &datasetDomainNames,
42 const QStringList &ties,
const QStringList &constraints)
43 : MantidDialog(parent), m_parName(parName), m_values(values), m_fixes(fixes), m_ties(
std::move(ties)),
44 m_constraints(
std::move(constraints)) {
45 assert(
static_cast<std::size_t
>(values.size()) == datasetDomainNames.size());
46 assert(
static_cast<std::size_t
>(fixes.size()) == datasetDomainNames.size());
47 assert(
static_cast<std::size_t
>(ties.size()) == datasetDomainNames.size());
48 assert(
static_cast<std::size_t
>(constraints.size()) == datasetDomainNames.size());
50 setAttribute(Qt::WA_DeleteOnClose);
51 doSetup(parName, datasetNames, datasetDomainNames);
63 const std::vector<std::string> &datasetDomainNames) {
66 auto *logCombo =
m_uiForm.logValueSelector->getLogComboBox();
67 for (
const auto &logName :
m_logFinder->getLogNames()) {
68 logCombo->addItem(QString::fromStdString(logName));
71 m_uiForm.logValueSelector->setCheckboxShown(
true);
73 QHeaderView *header =
m_uiForm.tableWidget->horizontalHeader();
74 header->setSectionResizeMode(QHeaderView::Stretch);
75 connect(
m_uiForm.tableWidget, SIGNAL(cellChanged(
int,
int)),
this, SLOT(
valueChanged(
int,
int)));
76 m_uiForm.lblParameterName->setText(
"Parameter: " + QString::fromStdString(parName));
78 for (
int i = 0; i < static_cast<int>(datasetDomainNames.size()); i++) {
80 auto cell =
new QTableWidgetItem(makeNumber(
m_values[i]));
81 m_uiForm.tableWidget->setItem(i, valueColumn, cell);
82 auto headerItem =
new QTableWidgetItem(QString::fromStdString(datasetDomainNames[i]));
83 m_uiForm.tableWidget->setVerticalHeaderItem(i, headerItem);
84 cell =
new QTableWidgetItem(
"");
85 auto flags = cell->flags();
86 flags ^= Qt::ItemIsEditable;
87 flags ^= Qt::ItemIsSelectable;
88 flags ^= Qt::ItemIsEnabled;
89 cell->setFlags(flags);
90 m_uiForm.tableWidget->setItem(i, roleColumn, cell);
94 m_uiForm.tableWidget->setItemDelegateForColumn(valueColumn, deleg);
98 connect(deleg, SIGNAL(
setTie(
int, QString)),
this, SLOT(
setTie(
int, QString)));
105 m_uiForm.tableWidget->installEventFilter(
this);
116 if (col == valueColumn) {
117 QString text =
m_uiForm.tableWidget->item(row, col)->text();
120 double value = text.toDouble(&ok);
126 }
catch (std::exception &) {
137 for (
int i = 0; i <
n; ++i) {
139 m_uiForm.tableWidget->item(i, valueColumn)->setText(makeNumber(
value));
177 for (
int i = 0; i <
m_ties.size(); ++i) {
203 for (
int i = 0; i <
m_fixes.size(); ++i) {
213 if (
obj ==
m_uiForm.tableWidget && ev->type() == QEvent::ContextMenu) {
216 return QDialog::eventFilter(
obj, ev);
221 auto selection =
m_uiForm.tableWidget->selectionModel()->selectedColumns();
223 bool hasSelection =
false;
225 for (
auto &
index : selection) {
226 if (
index.column() == valueColumn)
233 QMenu *menu =
new QMenu(
this);
235 QAction *action =
new QAction(
"Copy",
this);
236 action->setToolTip(
"Copy data to clipboard.");
237 connect(action, SIGNAL(triggered()),
this, SLOT(
copy()));
238 menu->addAction(action);
241 QAction *action =
new QAction(
"Paste",
this);
242 action->setToolTip(
"Paste data from clipboard.");
243 connect(action, SIGNAL(triggered()),
this, SLOT(
paste()));
244 auto text = QApplication::clipboard()->text();
245 action->setEnabled(!text.isEmpty());
246 menu->addAction(action);
249 menu->exec(QCursor::pos());
257 for (
int i = 0; i <
n; ++i) {
260 QApplication::clipboard()->setText(text.join(
"\n"));
265 auto text = QApplication::clipboard()->text();
266 auto vec = text.split(QRegExp(
"\\s|,"), Qt::SkipEmptyParts);
267 auto n = qMin(
vec.size(),
m_uiForm.tableWidget->rowCount());
272 for (
int i = 0; i <
n; ++i) {
278 m_uiForm.tableWidget->item(i, valueColumn)->setText(str);
284 for (
int i = 0; i <
m_values.size(); ++i) {
286 auto text = makeNumber(
m_values[i]);
287 m_uiForm.tableWidget->item(i, valueColumn)->setText(text +
" ");
288 m_uiForm.tableWidget->item(i, valueColumn)->setText(text);
298 cell->setForeground(QBrush(Qt::red));
301 cell->setForeground(QBrush(Qt::blue));
304 cell->setForeground(QBrush(Qt::darkGreen));
314 for (
int j = 0; j <
m_fixes.size(); ++j) {
323 for (
int j = 0; j <
m_fixes.size(); ++j) {
332 for (
int j = 0; j <
m_fixes.size(); ++j) {
333 if (j != i && !
m_ties[j].isEmpty())
344 const auto &logName =
m_uiForm.logValueSelector->getLog();
345 const auto &function =
m_uiForm.logValueSelector->getFunction();
347 double value = std::numeric_limits<double>::quiet_NaN();
350 }
catch (
const std::invalid_argument &err) {
351 const auto &message = QString(
"Failed to get log value:\n\n %1").arg(err.what());
352 QMessageBox::critical(
this,
"Mantid - Error", message);
355 m_uiForm.tableWidget->item(i, valueColumn)->setText(makeNumber(
value));
361 const int nValues =
m_values.size();
362 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