23#include <QDoubleValidator>
31#include <QRadioButton>
61 "DlgSettingsExportFormat",
63 m_validatorFunctionsPointsEvenlySpacing (nullptr),
64 m_validatorRelationsPointsEvenlySpacing (nullptr),
65 m_modelExportBefore (nullptr),
66 m_modelExportAfter (nullptr),
67 m_haveFunction (false),
68 m_haveRelation (false)
81 delete m_validatorFunctionsPointsEvenlySpacing;
82 delete m_validatorRelationsPointsEvenlySpacing;
85void DlgSettingsExportFormat::createCurveSelection (QGridLayout *layout,
int &row)
89 QLabel *labelIncluded =
new QLabel (tr (
"Included"));
90 layout->addWidget (labelIncluded, row, 0);
92 QLabel *labelExcluded =
new QLabel (tr (
"Not included"));
93 layout->addWidget (labelExcluded, row++, 2);
95 m_listIncluded =
new QListWidget;
96 m_listIncluded->setSortingEnabled (
false);
97 m_listIncluded->setWhatsThis (tr (
"List of curves to be included in the exported file.\n\n"
98 "The order of the curves here does not affect the order in the exported file. That "
99 "order is determined by the Curves settings."));
100 m_listIncluded->setSelectionMode (QAbstractItemView::MultiSelection);
101 layout->addWidget (m_listIncluded, row, 0, 4, 1);
102 connect (m_listIncluded, SIGNAL (itemSelectionChanged ()),
this, SLOT (slotListIncluded()));
104 m_listExcluded =
new QListWidget;
105 m_listExcluded->setSortingEnabled (
false);
106 m_listExcluded->setWhatsThis (tr (
"List of curves to be excluded from the exported file"));
107 m_listExcluded->setSelectionMode (QAbstractItemView::MultiSelection);
108 layout->addWidget (m_listExcluded, row++, 2, 4, 1);
109 connect (m_listExcluded, SIGNAL (itemSelectionChanged ()),
this, SLOT (slotListExcluded()));
111 m_btnInclude =
new QPushButton (QString (
"<<%1").arg (tr (
"Include")));
112 m_btnInclude->setEnabled (
false);
113 m_btnInclude->setWhatsThis (tr (
"Move the currently selected curve(s) from the excluded list"));
114 layout->addWidget (m_btnInclude, row++, 1);
115 connect (m_btnInclude, SIGNAL (released ()),
this, SLOT (slotInclude()));
117 m_btnExclude =
new QPushButton (QString (
"%1>>").arg (tr (
"Exclude")));
118 m_btnExclude->setEnabled (
false);
119 m_btnExclude->setWhatsThis (tr (
"Move the currently selected curve(s) from the included list"));
120 layout->addWidget (m_btnExclude, row++, 1);
121 connect (m_btnExclude, SIGNAL (released ()),
this, SLOT (slotExclude()));
126void DlgSettingsExportFormat::createDelimiters (QHBoxLayout *layoutMisc)
130 QGroupBox *groupDelimiters =
new QGroupBox (tr (
"Delimiters"));
131 layoutMisc->addWidget (groupDelimiters, 1);
133 QVBoxLayout *layoutDelimiters =
new QVBoxLayout;
134 groupDelimiters->setLayout (layoutDelimiters);
137 m_btnDelimitersCommas->setWhatsThis (tr (
"Exported file will have commas between adjacent values, unless overridden by tabs in TSV files."));
138 layoutDelimiters->addWidget (m_btnDelimitersCommas);
139 connect (m_btnDelimitersCommas, SIGNAL (released ()),
this, SLOT (slotDelimitersCommas()));
142 m_btnDelimitersSpaces->setWhatsThis (tr (
"Exported file will have spaces between adjacent values, unless overridden by commas in CSV files, "
143 "or tabs in TSV files."));
144 layoutDelimiters->addWidget (m_btnDelimitersSpaces);
145 connect (m_btnDelimitersSpaces, SIGNAL (released ()),
this, SLOT (slotDelimitersSpaces()));
148 m_btnDelimitersTabs->setWhatsThis (tr (
"Exported file will have tabs between adjacent values, unless overridden by commas in CSV files."));
149 layoutDelimiters->addWidget (m_btnDelimitersTabs);
150 connect (m_btnDelimitersTabs, SIGNAL (released ()),
this, SLOT (slotDelimitersTabs()));
153 m_btnDelimitersSemicolons->setWhatsThis (tr (
"Exported file will have semicolons between adjacent values, unless overridden by commas in CSV files."));
154 layoutDelimiters->addWidget (m_btnDelimitersSemicolons);
155 connect (m_btnDelimitersSemicolons, SIGNAL (released ()),
this, SLOT (slotDelimitersSemicolons()));
157 m_chkOverrideCsvTsv =
new QCheckBox (tr (
"Override in CSV/TSV files"));
158 m_chkOverrideCsvTsv->setWhatsThis (tr (
"Comma-separated value (CSV) files and tab-separated value (TSV) files will use commas and tabs "
159 "respectively, unless this setting is selected. Selecting this setting will apply the delimiter setting "
161 connect (m_chkOverrideCsvTsv, SIGNAL (stateChanged (
int)),
this, SLOT (slotOverrideCsvTsv(
int)));
162 layoutDelimiters->addWidget (m_chkOverrideCsvTsv);
165void DlgSettingsExportFormat::createFileLayout (QHBoxLayout *layoutMisc)
169 QGroupBox *groupLayout =
new QGroupBox (tr (
"Layout"));
170 layoutMisc->addWidget (groupLayout, 1);
172 QVBoxLayout *layoutLayout =
new QVBoxLayout;
173 groupLayout->setLayout (layoutLayout);
175 m_btnCurvesLayoutAllCurves =
new QRadioButton (tr (
"All curves on each line"));
176 m_btnCurvesLayoutAllCurves->setWhatsThis (tr (
"Exported file will have, on each line, "
177 "an X value, the Y value for the first curve, the Y value for the second curve,..."));
178 layoutLayout->addWidget (m_btnCurvesLayoutAllCurves);
179 connect (m_btnCurvesLayoutAllCurves, SIGNAL (released()),
this, SLOT (slotFunctionsLayoutAllCurves ()));
181 m_btnCurvesLayoutOneCurve =
new QRadioButton (tr (
"One curve on each line"));
182 m_btnCurvesLayoutOneCurve->setWhatsThis (tr (
"Exported file will have all the points for "
183 "the first curve, with one X-Y pair on each line, then the points for the second curve,..."));
184 layoutLayout->addWidget (m_btnCurvesLayoutOneCurve);
185 connect (m_btnCurvesLayoutOneCurve, SIGNAL (released()),
this, SLOT (slotFunctionsLayoutOneCurve ()));
188void DlgSettingsExportFormat::createFunctionsPointsSelection (QHBoxLayout *layoutFunctions)
192 QGroupBox *groupPointsSelection =
new QGroupBox (tr (
"Function Points Selection"));
193 layoutFunctions->addWidget (groupPointsSelection, 1);
195 QGridLayout *layoutPointsSelections =
new QGridLayout;
196 groupPointsSelection->setLayout (layoutPointsSelections);
199 layoutPointsSelections->setColumnStretch (0, 0);
200 layoutPointsSelections->setColumnStretch (1, 0);
201 layoutPointsSelections->setColumnStretch (2, 0);
202 layoutPointsSelections->setColumnStretch (3, 0);
203 layoutPointsSelections->setColumnStretch (4, 1);
207 m_btnFunctionsPointsAllCurves =
new QRadioButton (tr (
"Interpolate Ys at Xs from all curves"));
208 m_btnFunctionsPointsAllCurves->setWhatsThis (tr (
"Exported file will have values at every unique X "
209 "value from every curve. Y values will be linearly interpolated if necessary"));
210 layoutPointsSelections->addWidget (m_btnFunctionsPointsAllCurves, row, 0, 1, 2);
211 connect (m_btnFunctionsPointsAllCurves, SIGNAL (released()),
this, SLOT (slotFunctionsPointsAllCurves()));
214 m_chkExtrapolateOutsideEndpoints =
new QCheckBox (tr (
"Extrapolate outside endpoints"));
215 m_chkExtrapolateOutsideEndpoints->setWhatsThis (tr (
"Enable or disable extrapolation outside of endpoints of each curve. If disabled, "
216 "only points between the endpoints of each curve are exported"));
217 layoutPointsSelections->addWidget (m_chkExtrapolateOutsideEndpoints, row++, 4, 1, 1, Qt::AlignRight);
218 connect (m_chkExtrapolateOutsideEndpoints, SIGNAL (stateChanged (
int)),
this, SLOT (slotFunctionsExtrapolateOutsideEndpoints(
int)));
220 m_btnFunctionsPointsFirstCurve =
new QRadioButton (tr (
"Interpolate Ys at Xs from first curve"));
221 m_btnFunctionsPointsFirstCurve->setWhatsThis (tr (
"Exported file will have values at every unique X "
222 "value from the first curve. Y values will be linearly interpolated if necessary"));
223 layoutPointsSelections->addWidget (m_btnFunctionsPointsFirstCurve, row++, 0, 1, 4);
224 connect (m_btnFunctionsPointsFirstCurve, SIGNAL (released()),
this, SLOT (slotFunctionsPointsFirstCurve()));
226 m_btnFunctionsPointsEvenlySpaced =
new QRadioButton (tr (
"Interpolate Ys at evenly spaced X values that are automatically selected"));
227 m_btnFunctionsPointsEvenlySpaced->setWhatsThis (tr (
"Exported file will have values at evenly spaced X values, separated by the interval selected below."));
228 layoutPointsSelections->addWidget (m_btnFunctionsPointsEvenlySpaced, row++, 0, 1, 4);
229 connect (m_btnFunctionsPointsEvenlySpaced, SIGNAL (released()),
this, SLOT (slotFunctionsPointsEvenlySpaced()));
231 QLabel *labelInterval =
new QLabel (QString (
"%1:").arg (tr (
"Interval")));
232 layoutPointsSelections->addWidget (labelInterval, row, 1, 1, 1, Qt::AlignRight);
234 m_editFunctionsPointsEvenlySpacing =
new QLineEdit;
235 m_validatorFunctionsPointsEvenlySpacing =
new QDoubleValidator;
236 m_editFunctionsPointsEvenlySpacing->setValidator (m_validatorFunctionsPointsEvenlySpacing);
237 m_editFunctionsPointsEvenlySpacing->setMinimumWidth (
MIN_EDIT_WIDTH);
238 m_editFunctionsPointsEvenlySpacing->setMaximumWidth (
MAX_EDIT_WIDTH);
239 m_editFunctionsPointsEvenlySpacing->setWhatsThis (tr (
"Interval, in the units of X, between successive points in the X direction.\n\n"
240 "If the scale is linear, then this interval is added to successive X values. If the scale is "
241 "logarithmic, then this interval is multiplied to successive X values.\n\n"
242 "The X values will be automatically aligned along simple numbers. If the first and/or last "
243 "points are not along the aligned X values, then one or two additional points are added "
245 layoutPointsSelections->addWidget (m_editFunctionsPointsEvenlySpacing, row, 2, 1, 1, Qt::AlignLeft);
246 connect (m_editFunctionsPointsEvenlySpacing, SIGNAL (textChanged(
const QString &)),
this, SLOT (slotFunctionsPointsEvenlySpacedInterval(
const QString &)));
248 m_cmbFunctionsPointsEvenlySpacingUnits =
new QComboBox;
249 m_cmbFunctionsPointsEvenlySpacingUnits->setWhatsThis (tr (
"Units for spacing interval.\n\n"
250 "Pixel units are preferred when the spacing is to be independent of the X scale. The spacing will be "
251 "consistent across the graph, even if the X scale is logarithmic.\n\n"
252 "Graph units are preferred when the spacing is to depend on the X scale."));
257 connect (m_cmbFunctionsPointsEvenlySpacingUnits, SIGNAL (activated (
const QString &)),
258 this, SLOT (slotFunctionsPointsEvenlySpacedIntervalUnits (
const QString &)));
259 layoutPointsSelections->addWidget (m_cmbFunctionsPointsEvenlySpacingUnits, row, 3, 1, 1, Qt::AlignLeft);
261 m_lblOverflowFunctions =
new QLabel (tr (
"Too many points"));
262 m_lblOverflowFunctions->setStyleSheet (
"QLabel { color : red; }");
263 m_lblOverflowFunctions->setWhatsThis (tr (
"Warning that interval is too small. Adjust interval or increase point limit in Main Window settings"));
264 layoutPointsSelections->addWidget (m_lblOverflowFunctions, row++, 4, 1, 1, Qt::AlignLeft);
266 m_btnFunctionsPointsGridLines =
new QRadioButton (tr (
"Interpolate Ys at evenly spaced X values on grid lines"));
267 m_btnFunctionsPointsGridLines->setWhatsThis (tr (
"Exported file will have values at evenly spaced X values at the vertical grid lines."));
268 layoutPointsSelections->addWidget (m_btnFunctionsPointsGridLines, row++, 0, 1, 4);
269 connect (m_btnFunctionsPointsGridLines, SIGNAL (released()),
this, SLOT (slotFunctionsPointsGridLines()));
271 m_btnFunctionsPointsRaw =
new QRadioButton (tr (
"Raw Xs and Ys"));
272 m_btnFunctionsPointsRaw->setWhatsThis (tr (
"Exported file will have only original X and Y values"));
273 layoutPointsSelections->addWidget (m_btnFunctionsPointsRaw, row++, 0, 1, 4);
274 connect (m_btnFunctionsPointsRaw, SIGNAL (released()),
this, SLOT (slotFunctionsPointsRaw()));
277void DlgSettingsExportFormat::createHeader (QHBoxLayout *layoutMisc)
281 const int COLUMN_RADIO_BUTTONS = 0, COLUMN_EMPTY = 1, COLUMN_LABEL = 2;
283 QGroupBox *groupHeader =
new QGroupBox (tr (
"Header"));
284 layoutMisc->addWidget (groupHeader, 1);
286 QGridLayout *layoutHeader =
new QGridLayout;
287 layoutHeader->setColumnMinimumWidth(COLUMN_EMPTY,
289 groupHeader->setLayout (layoutHeader);
293 m_btnHeaderNone->setWhatsThis (tr (
"Exported file will have no header line"));
294 layoutHeader->addWidget (m_btnHeaderNone, row++, COLUMN_RADIO_BUTTONS, 1, 1);
295 connect (m_btnHeaderNone, SIGNAL (released ()),
this, SLOT (slotHeaderNone()));
298 m_btnHeaderSimple->setWhatsThis (tr (
"Exported file will have simple header line"));
299 layoutHeader->addWidget (m_btnHeaderSimple, row++, COLUMN_RADIO_BUTTONS, 1, 1);
300 connect (m_btnHeaderSimple, SIGNAL (released ()),
this, SLOT (slotHeaderSimple()));
303 m_btnHeaderGnuplot->setWhatsThis (tr (
"Exported file will have gnuplot header line"));
304 layoutHeader->addWidget (m_btnHeaderGnuplot, row++, COLUMN_RADIO_BUTTONS, 1, 1);
305 connect (m_btnHeaderGnuplot, SIGNAL (released()),
this, SLOT (slotHeaderGnuplot()));
307 createXLabel (layoutHeader,
315 m_btnSaveDefault =
new QPushButton (tr (
"Save As Default"));
316 m_btnSaveDefault->setWhatsThis (tr (
"Save the settings for use as future defaults."));
317 connect (m_btnSaveDefault, SIGNAL (released ()),
this, SLOT (slotSaveDefault ()));
318 layout->addWidget (m_btnSaveDefault, 0, Qt::AlignLeft);
320 m_btnLoadDefault =
new QPushButton (tr (
"Load Default"));
321 m_btnLoadDefault->setWhatsThis (tr (
"Load the default settings."));
322 connect (m_btnLoadDefault, SIGNAL (released ()),
this, SLOT (slotLoadDefault ()));
323 layout->addWidget (m_btnLoadDefault, 0, Qt::AlignLeft);
326void DlgSettingsExportFormat::createPreview(QGridLayout *layout,
int &row)
332 m_cmbFileExtension =
new QComboBox;
333 m_cmbFileExtension->setWhatsThis (tr (
"File extension used for preview. The CSV and TSV file extensions "
334 "normally use commas and tabs respectively, but that can be changed "
342 connect (m_cmbFileExtension, SIGNAL (activated (
const QString &)),
343 this, SLOT (slotFileExtension (
const QString &)));
344 layout->addWidget (m_cmbFileExtension, row, 0, 1, 1, Qt::AlignLeft);
347 QLabel *labelLegend =
new QLabel;
348 labelLegend->setTextFormat (Qt::RichText);
349 QString legendHtml = QString (
"<span style=\"background-color: %1\"> Functions </span>"
351 "<span style=\"background-color: %2\"> Relations </span>")
354 labelLegend->setText (legendHtml);
355 layout->addWidget (labelLegend, row++, 2, 1, 1, Qt::AlignRight);
357 m_editPreview =
new QTextEdit;
358 m_editPreview->setReadOnly (
true);
359 m_editPreview->setWhatsThis (tr (
"Preview window shows how current settings affect the exported file.\n\n"
360 "Functions (shown here in blue) are output first, followed by relations "
361 "(shown here in green) if any exist."));
363 m_editPreview->document()->setDefaultStyleSheet(
"div { padding-left: 20px; }");
364 QPalette p = m_editPreview->palette();
365 p.setColor (QPalette::Base, QColor (240, 240, 240));
366 m_editPreview->setPalette (p);
368 layout->addWidget (m_editPreview, row++, 0, 1, 3);
371void DlgSettingsExportFormat::createRelationsPointsSelection (QHBoxLayout *layoutRelations)
375 QGroupBox *groupPointsSelection =
new QGroupBox (tr (
"Relation Points Selection"));
376 layoutRelations->addWidget (groupPointsSelection);
378 QGridLayout *layoutPointsSelections =
new QGridLayout;
379 groupPointsSelection->setLayout (layoutPointsSelections);
382 layoutPointsSelections->setColumnStretch (0, 0);
383 layoutPointsSelections->setColumnStretch (1, 0);
384 layoutPointsSelections->setColumnStretch (2, 0);
385 layoutPointsSelections->setColumnStretch (3, 0);
386 layoutPointsSelections->setColumnStretch (4, 1);
390 m_btnRelationsPointsEvenlySpaced =
new QRadioButton (tr (
"Interpolate Xs and Ys at evenly spaced intervals."));
391 m_btnRelationsPointsEvenlySpaced->setWhatsThis (tr (
"Exported file will have points evenly spaced along each relation, separated by the interval "
392 "selected below. If the last interval does not end at the last point, then a shorter last interval "
393 "is added that ends on the last point."));
394 layoutPointsSelections->addWidget (m_btnRelationsPointsEvenlySpaced, row++, 0, 1, 4);
395 connect (m_btnRelationsPointsEvenlySpaced, SIGNAL (released()),
this, SLOT (slotRelationsPointsEvenlySpaced()));
397 QLabel *labelInterval =
new QLabel (QString (
"%1:").arg (tr (
"Interval")));
398 layoutPointsSelections->addWidget (labelInterval, row, 1, 1, 1, Qt::AlignRight);
400 m_editRelationsPointsEvenlySpacing =
new QLineEdit;
401 m_validatorRelationsPointsEvenlySpacing =
new QDoubleValidator;
402 m_editRelationsPointsEvenlySpacing->setValidator (m_validatorRelationsPointsEvenlySpacing);
403 m_editRelationsPointsEvenlySpacing->setMinimumWidth (
MIN_EDIT_WIDTH);
404 m_editRelationsPointsEvenlySpacing->setMaximumWidth (
MAX_EDIT_WIDTH);
405 m_editRelationsPointsEvenlySpacing->setWhatsThis (tr (
"Interval between successive points when "
406 "exporting at evenly spaced (X,Y) coordinates."));
407 layoutPointsSelections->addWidget (m_editRelationsPointsEvenlySpacing, row, 2, 1, 1, Qt::AlignLeft);
408 connect (m_editRelationsPointsEvenlySpacing, SIGNAL (textChanged(
const QString &)),
this, SLOT (slotRelationsPointsEvenlySpacedInterval(
const QString &)));
410 m_cmbRelationsPointsEvenlySpacingUnits =
new QComboBox;
411 m_cmbRelationsPointsEvenlySpacingUnits->setWhatsThis (tr (
"Units for spacing interval.\n\n"
412 "Pixel units are preferred when the spacing is to be independent of the X and Y scales. The spacing will be "
413 "consistent across the graph, even if a scale is logarithmic or the X and Y scales are different.\n\n"
414 "Graph units are usually preferred when the X and Y scales are identical."));
419 connect (m_cmbRelationsPointsEvenlySpacingUnits, SIGNAL (activated (
const QString &)),
420 this, SLOT (slotRelationsPointsEvenlySpacedIntervalUnits (
const QString &)));
421 layoutPointsSelections->addWidget (m_cmbRelationsPointsEvenlySpacingUnits, row, 3, 1, 1, Qt::AlignLeft);
423 m_lblOverflowRelations =
new QLabel (tr (
"Too many points"));
424 m_lblOverflowRelations->setStyleSheet (
"QLabel { color : red; }");
425 m_lblOverflowRelations->setWhatsThis (tr (
"Warning that interval is too small. Adjust interval or increase point limit in Main Window settings"));
426 layoutPointsSelections->addWidget (m_lblOverflowRelations, row++, 4, 1, 1, Qt::AlignLeft);
428 m_btnRelationsPointsRaw =
new QRadioButton (tr (
"Raw Xs and Ys"));
429 m_btnRelationsPointsRaw->setWhatsThis (tr (
"Exported file will have only original X and Y values"));
430 layoutPointsSelections->addWidget (m_btnRelationsPointsRaw, row++, 0, 1, 4);
431 connect (m_btnRelationsPointsRaw, SIGNAL (released()),
this, SLOT (slotRelationsPointsRaw()));
438 QWidget *subPanel =
new QWidget ();
439 QGridLayout *layout =
new QGridLayout (subPanel);
440 subPanel->setLayout (layout);
449 createCurveSelection (layout, row);
451 createTabWidget (layout,
454 QWidget *widgetMisc =
new QWidget;
455 layout->addWidget (widgetMisc, row++, 0, 1, 3);
456 QHBoxLayout *layoutMisc =
new QHBoxLayout;
457 widgetMisc->setLayout (layoutMisc);
459 createDelimiters (layoutMisc);
460 createHeader (layoutMisc);
461 createFileLayout (layoutMisc);
463 createPreview (layout, row);
468void DlgSettingsExportFormat::createTabWidget (QGridLayout *layout,
473 m_tabWidget =
new QTabWidget;
475 layout->addWidget (m_tabWidget, row++, 0, 1, 3);
477 QWidget *widgetFunctions =
new QWidget;
478 int indexFunctions = m_tabWidget->addTab (widgetFunctions, tr (
"Functions"));
479 QWidget *tabFunctions = m_tabWidget->widget (indexFunctions);
480 tabFunctions->setWhatsThis (tr (
"Functions Tab\n\n"
481 "Controls for specifying the format of functions during export"));
482 QHBoxLayout *layoutFunctions =
new QHBoxLayout;
483 widgetFunctions->setLayout (layoutFunctions);
485 QWidget *widgetRelations =
new QWidget;
486 int indexRelations = m_tabWidget->addTab (widgetRelations, tr (
"Relations"));
487 QWidget *tabRelations = m_tabWidget->widget (indexRelations);
488 tabRelations->setWhatsThis (tr (
"Relations Tab\n\n"
489 "Controls for specifying the format of relations during export"));
490 QHBoxLayout *layoutRelations =
new QHBoxLayout;
491 widgetRelations->setLayout (layoutRelations);
494 connect (m_tabWidget, SIGNAL (currentChanged (
int)),
this, SLOT (slotTabChanged (
int)));
496 createFunctionsPointsSelection (layoutFunctions);
497 createRelationsPointsSelection (layoutRelations);
500void DlgSettingsExportFormat::createXLabel (QGridLayout *layoutHeader,
507 QLabel *title =
new QLabel (QString (
"%1:").arg (tr (
"X Label")));
508 layoutHeader->addWidget (title, row++, colLabel, 1, 1);
510 m_editXLabel =
new QLineEdit;
511 m_editXLabel->setWhatsThis (tr (
"Label in the header for x values"));
512 layoutHeader->addWidget (m_editXLabel, row++, colLabel, 1, 1);
513 connect (m_editXLabel, SIGNAL (textChanged (
const QString &)),
this, SLOT (slotXLabel(
const QString &)));
516QString DlgSettingsExportFormat::exportedTextToExportedHtml (
const QString &text,
517 const QString &color)
const
519 QRegularExpression re (
"<br>$");
521 QString textCopy (text);
522 QString replaced = textCopy
523 .replace (
"\n",
"<br>")
524 .replace (
" ",
" ")
526 .replace (
"\t",
" ");
528 QString html = QString (
"<div style=\"display: inline; background-color: %1\">%2</div>")
535bool DlgSettingsExportFormat::goodIntervalFunctions()
const
539 QString textFunctions = m_editFunctionsPointsEvenlySpacing->text();
542 bool isGood = (m_validatorFunctionsPointsEvenlySpacing->validate (textFunctions, posFunctions) == QValidator::Acceptable);
545 <<
" text=" << textFunctions.toLatin1().data()
546 <<
" good=" << (isGood ?
"true" :
"false")
547 <<
" bottom=" << m_validatorFunctionsPointsEvenlySpacing->bottom()
548 <<
" top=" << m_validatorFunctionsPointsEvenlySpacing->top();
553bool DlgSettingsExportFormat::goodIntervalRelations()
const
557 QString textRelations = m_editRelationsPointsEvenlySpacing->text();
560 bool isGood = (m_validatorRelationsPointsEvenlySpacing->validate (textRelations, posRelations) == QValidator::Acceptable);
563 <<
" text=" << textRelations.toLatin1().data()
564 <<
" good=" << (isGood ?
"true" :
"false")
565 <<
" bottom=" << m_validatorRelationsPointsEvenlySpacing->bottom()
566 <<
" top=" << m_validatorRelationsPointsEvenlySpacing->top();
577 *m_modelExportBefore,
578 *m_modelExportAfter);
584void DlgSettingsExportFormat::initializeIntervalConstraints ()
594 Functor2wRet<const QString &, const Point &, CallbackSearchReturn> ftorWithCallback = functor_ret (ftor,
600 QPointF boundingRectGraphMin = ftor.boundingRectGraphMin (isEmpty);
601 QPointF boundingRectGraphMax = ftor.boundingRectGraphMax (isEmpty);
602 double maxSizeGraph = boundingRectGraphMax.x() - boundingRectGraphMin.x();
603 double maxSizeScreen = ftor.boundingRectScreen(isEmpty).width();
604 m_minIntervalGraph = maxSizeGraph / maxPointsAcrossRange;
605 m_minIntervalScreen = maxSizeScreen / maxPointsAcrossRange;
615 delete m_modelExportBefore;
616 delete m_modelExportAfter;
623 m_listExcluded->clear();
624 QStringList curveNamesExcluded = m_modelExportAfter->curveNamesNotExported();
625 QStringList::const_iterator itr;
626 for (itr = curveNamesExcluded.begin (); itr != curveNamesExcluded.end(); ++itr) {
627 QString curveNameNotExported = *itr;
628 m_listExcluded->addItem (curveNameNotExported);
632 m_listIncluded->clear();
633 QStringList curveNamesAll =
cmdMediator.document().curvesGraphsNames();
634 for (itr = curveNamesAll.begin (); itr != curveNamesAll.end(); itr++) {
635 QString curveName = *itr;
636 if (!curveNamesExcluded.contains (curveName)) {
637 m_listIncluded->addItem (curveName);
662 m_chkExtrapolateOutsideEndpoints->setChecked (m_modelExportAfter->extrapolateOutsideEndpoints ());
664 m_chkOverrideCsvTsv->setChecked (m_modelExportAfter->overrideCsvTsv());
671 m_editXLabel->setText (m_modelExportAfter->xLabel());
673 m_editFunctionsPointsEvenlySpacing->setText (QString::number (m_modelExportAfter->pointsIntervalFunctions()));
674 m_editRelationsPointsEvenlySpacing->setText (QString::number (m_modelExportAfter->pointsIntervalRelations()));
678 int indexFunctions = m_cmbFunctionsPointsEvenlySpacingUnits->findData (QVariant (pointsIntervalUnitsFunctions));
679 int indexRelations = m_cmbRelationsPointsEvenlySpacingUnits->findData (QVariant (pointsIntervalUnitsRelations));
680 m_cmbFunctionsPointsEvenlySpacingUnits->setCurrentIndex (indexFunctions);
681 m_cmbRelationsPointsEvenlySpacingUnits->setCurrentIndex (indexRelations);
685 initializeIntervalConstraints ();
687 updateControlsUponLoad ();
689 updateIntervalConstraints();
701void DlgSettingsExportFormat::slotDelimitersCommas()
710void DlgSettingsExportFormat::slotDelimitersSemicolons()
719void DlgSettingsExportFormat::slotDelimitersSpaces()
728void DlgSettingsExportFormat::slotDelimitersTabs()
737void DlgSettingsExportFormat::slotExclude ()
743 QStringList excluded;
744 for (i = 0; i < m_listIncluded->count(); i++) {
745 if (m_listIncluded->item(i)->isSelected()) {
746 excluded += m_listIncluded->item(i)->text();
751 for (i = 0; i < excluded.count(); i++) {
752 QString curveName = excluded.at (i);
753 m_listExcluded->addItem (curveName);
757 for (i = m_listIncluded->count() - 1; i>= 0; i--) {
758 QString curveName = m_listIncluded->item(i)->text();
759 if (excluded.contains (curveName)) {
760 QListWidgetItem *item = m_listIncluded->item (i);
761 m_listIncluded->removeItemWidget (item);
766 m_modelExportAfter->setCurveNamesNotExported(excluded);
771void DlgSettingsExportFormat::slotFileExtension (
const QString &)
776void DlgSettingsExportFormat::slotFunctionsExtrapolateOutsideEndpoints(
int)
780 m_modelExportAfter->setExtrapolateOutsideEndpoints (m_chkExtrapolateOutsideEndpoints->isChecked());
785void DlgSettingsExportFormat::slotFunctionsLayoutAllCurves()
794void DlgSettingsExportFormat::slotFunctionsLayoutOneCurve()
803void DlgSettingsExportFormat::slotFunctionsPointsAllCurves()
812void DlgSettingsExportFormat::slotFunctionsPointsEvenlySpaced()
821void DlgSettingsExportFormat::slotFunctionsPointsEvenlySpacedInterval(
const QString &)
825 if (m_editFunctionsPointsEvenlySpacing->text().trimmed() ==
"") {
827 m_lblOverflowFunctions->hide ();
830 m_lblOverflowFunctions->hide ();
831 m_modelExportAfter->setPointsIntervalFunctions(m_editFunctionsPointsEvenlySpacing->text().toDouble());
837void DlgSettingsExportFormat::slotFunctionsPointsEvenlySpacedIntervalUnits(
const QString &)
839 LOG4CPP_INFO_S ((*
mainCat)) <<
"DlgSettingsExportFormat::slotFunctionsPointsEvenlySpacedIntervalUnits";
841 int index = m_cmbFunctionsPointsEvenlySpacingUnits->currentIndex();
844 m_lblOverflowFunctions->hide ();
845 m_modelExportAfter->setPointsIntervalUnitsFunctions(units);
846 updateIntervalConstraints();
851void DlgSettingsExportFormat::slotFunctionsPointsFirstCurve()
860void DlgSettingsExportFormat::slotFunctionsPointsGridLines()
869void DlgSettingsExportFormat::slotFunctionsPointsRaw()
878void DlgSettingsExportFormat::slotHeaderGnuplot()
887void DlgSettingsExportFormat::slotHeaderNone()
896void DlgSettingsExportFormat::slotHeaderSimple()
905void DlgSettingsExportFormat::slotInclude ()
911 QStringList included;
912 for (i = 0; i < m_listExcluded->count(); i++) {
913 if (m_listExcluded->item(i)->isSelected()) {
914 included += m_listExcluded->item(i)->text();
919 for (i = 0; i < included.count(); i++) {
920 QString curveName = included.at (i);
921 m_listIncluded->addItem (curveName);
925 QStringList excluded;
926 for (i = m_listExcluded->count() - 1; i>= 0; i--) {
927 QString curveName = m_listExcluded->item(i)->text();
928 QListWidgetItem *item = m_listExcluded->item (i);
929 if (included.contains (curveName)) {
930 m_listExcluded->removeItemWidget (item);
933 excluded += item->text();
937 m_modelExportAfter->setCurveNamesNotExported(excluded);
942void DlgSettingsExportFormat::slotListExcluded()
950void DlgSettingsExportFormat::slotListIncluded()
958void DlgSettingsExportFormat::slotLoadDefault()
963 DocumentModelExportFormat modelExportDefaults;
971 m_editXLabel->setText (modelExportDefaults.
xLabel());
978 m_chkOverrideCsvTsv->setChecked (modelExportDefaults.
overrideCsvTsv());
983 m_editFunctionsPointsEvenlySpacing->setText (QString::number (modelExportDefaults.
pointsIntervalFunctions ()));
984 m_editRelationsPointsEvenlySpacing->setText (QString::number (modelExportDefaults.
pointsIntervalRelations ()));
999 m_cmbFunctionsPointsEvenlySpacingUnits->setCurrentIndex (indexFunctions);
1000 m_cmbRelationsPointsEvenlySpacingUnits->setCurrentIndex (indexRelations);
1003 *m_modelExportAfter = modelExportDefaults;
1009void DlgSettingsExportFormat::slotOverrideCsvTsv(
int)
1013 m_modelExportAfter->setOverrideCsvTsv(m_chkOverrideCsvTsv->isChecked());
1018void DlgSettingsExportFormat::slotRelationsPointsEvenlySpaced()
1027void DlgSettingsExportFormat::slotRelationsPointsEvenlySpacedInterval(
const QString &)
1031 if (m_editRelationsPointsEvenlySpacing->text().trimmed() ==
"") {
1033 m_lblOverflowRelations->hide ();
1036 if (goodIntervalRelations()) {
1037 m_lblOverflowRelations->hide ();
1038 m_modelExportAfter->setPointsIntervalRelations(m_editRelationsPointsEvenlySpacing->text().toDouble());
1042 m_lblOverflowRelations->show ();
1048void DlgSettingsExportFormat::slotRelationsPointsEvenlySpacedIntervalUnits(
const QString &)
1050 LOG4CPP_INFO_S ((*
mainCat)) <<
"DlgSettingsExportFormat::slotRelationsPointsEvenlySpacedIntervalUnits";
1052 int index = m_cmbRelationsPointsEvenlySpacingUnits->currentIndex();
1055 m_modelExportAfter->setPointsIntervalUnitsRelations(units);
1056 updateIntervalConstraints();
1061void DlgSettingsExportFormat::slotRelationsPointsRaw()
1070void DlgSettingsExportFormat::slotSaveDefault()
1080 QVariant (m_modelExportAfter->delimiter()));
1082 QVariant (m_modelExportAfter->overrideCsvTsv()));
1084 QVariant (m_modelExportAfter->extrapolateOutsideEndpoints()));
1086 QVariant (m_modelExportAfter->header()));
1088 QVariant (m_modelExportAfter->layoutFunctions()));
1090 QVariant (m_modelExportAfter->pointsIntervalFunctions()));
1092 QVariant (m_modelExportAfter->pointsIntervalRelations()));
1094 QVariant (m_modelExportAfter->pointsIntervalUnitsFunctions()));
1096 QVariant (m_modelExportAfter->pointsIntervalUnitsRelations()));
1098 QVariant (m_modelExportAfter->pointsSelectionFunctions()));
1100 QVariant (m_modelExportAfter->pointsSelectionRelations()));
1102 QVariant (m_modelExportAfter->xLabel()));
1104 settings.endGroup ();
1107void DlgSettingsExportFormat::slotTabChanged (
int)
1114void DlgSettingsExportFormat::slotWhatsThis ()
1116 QWhatsThis::enterWhatsThisMode();
1119void DlgSettingsExportFormat::slotXLabel(
const QString &)
1123 m_modelExportAfter->setXLabel (m_editXLabel->text());
1128void DlgSettingsExportFormat::updateControls ()
1130 bool isGoodState = goodIntervalFunctions() &&
1131 goodIntervalRelations();
1135 m_chkExtrapolateOutsideEndpoints->setEnabled (!m_btnFunctionsPointsRaw->isChecked ());
1137 int selectedForInclude = m_listExcluded->selectedItems().count();
1138 int selectedForExclude = m_listIncluded->selectedItems().count();
1139 int inInclude = m_listIncluded->count();
1141 m_btnInclude->setEnabled (selectedForInclude > 0);
1142 m_btnExclude->setEnabled ((selectedForExclude > 0) && (inInclude - selectedForExclude > 0));
1144 m_editFunctionsPointsEvenlySpacing->setEnabled (m_haveFunction && m_btnFunctionsPointsEvenlySpaced->isChecked ());
1145 m_editRelationsPointsEvenlySpacing->setEnabled (m_haveRelation && m_btnRelationsPointsEvenlySpaced->isChecked ());
1147 m_editXLabel->setEnabled (!m_btnHeaderNone->isChecked());
1150void DlgSettingsExportFormat::updateControlsUponLoad ()
1154 m_haveFunction =
false;
1155 m_haveRelation =
false;
1157 QStringList curveNames = curveStyles.
curveNames();
1159 QStringList::const_iterator itr;
1160 for (itr = curveNames.begin(); itr != curveNames.end (); itr++) {
1161 QString curveName = *itr;
1162 CurveStyle curveStyle = curveStyles.
curveStyle (curveName);
1165 m_haveFunction =
true;
1167 m_haveRelation =
true;
1172 m_btnFunctionsPointsAllCurves->setEnabled (m_haveFunction);
1173 m_btnFunctionsPointsFirstCurve->setEnabled (m_haveFunction);
1174 m_btnFunctionsPointsEvenlySpaced->setEnabled (m_haveFunction);
1175 m_editFunctionsPointsEvenlySpacing->setEnabled (m_haveFunction);
1176 m_cmbFunctionsPointsEvenlySpacingUnits->setEnabled (m_haveFunction);
1177 m_btnFunctionsPointsRaw->setEnabled (m_haveFunction);
1180 m_btnRelationsPointsEvenlySpaced->setEnabled (m_haveRelation);
1181 m_editRelationsPointsEvenlySpacing->setEnabled (m_haveRelation);
1182 m_cmbRelationsPointsEvenlySpacingUnits->setEnabled (m_haveRelation);
1183 m_btnRelationsPointsRaw->setEnabled (m_haveRelation);
1186 if (!m_haveRelation) {
1188 }
else if (!m_haveFunction) {
1193void DlgSettingsExportFormat::updateIntervalConstraints ()
1196 m_minIntervalGraph :
1197 m_minIntervalScreen);
1199 m_minIntervalGraph :
1200 m_minIntervalScreen);
1205 functionsMin = qMax (1.00000001, functionsMin);
1210 m_validatorFunctionsPointsEvenlySpacing->setBottom (functionsMin);
1214 m_validatorRelationsPointsEvenlySpacing->setBottom (relationsMin);
1218void DlgSettingsExportFormat::updatePreview()
1221 int scrollPosition = m_editPreview->verticalScrollBar()->value();
1223 QString exportedTextFunctions, exportedTextRelations, exportedHtml;
1226 m_lblOverflowFunctions->hide ();
1227 m_lblOverflowRelations->hide ();
1229 if (
mainWindow().transformation().transformIsDefined()) {
1231 QTextStream strFunctions (&exportedTextFunctions);
1232 QTextStream strRelations (&exportedTextRelations);
1234 unsigned int numWritesSoFar = 0;
1235 bool isOverrunFunctions =
false, isOverrunRelations =
false;
1241 ExportFileExtensionOverride extensionOverride;
1242 ExportToFile exportToFile;
1243 DocumentModelExportFormat modelAfterWithFileExtension = extensionOverride.
modelExportOverride(*m_modelExportAfter,
1247 ExportFileFunctions exportStrategyFunctions;
1248 exportStrategyFunctions.
exportToFile (modelAfterWithFileExtension,
1254 isOverrunFunctions);
1256 ExportFileRelations exportStrategyRelations;
1257 exportStrategyRelations.
exportToFile (modelAfterWithFileExtension,
1263 isOverrunRelations);
1265 m_lblOverflowFunctions->setVisible(isOverrunFunctions);
1266 m_lblOverflowRelations->setVisible(isOverrunRelations);
1272 QString exportedHtmlFunctions, exportedHtmlRelations;
1273 if (! exportedTextFunctions.isEmpty ()) {
1275 exportedHtmlFunctions = exportedTextToExportedHtml (exportedTextFunctions,
COLOR_FUNCTIONS);
1277 if (! exportedTextRelations.isEmpty ()) {
1279 exportedHtmlRelations = exportedTextToExportedHtml (exportedTextRelations,
COLOR_RELATIONS);
1282 exportedHtml = exportedHtmlFunctions + exportedHtmlRelations;
1286 exportedHtml = tr (
"Preview is unavailable until axis points are defined.");
1289 m_editPreview->setHtml (exportedHtml);
1292 m_editPreview->verticalScrollBar()->setValue (scrollPosition);
@ CONNECT_AS_FUNCTION_STRAIGHT
@ CONNECT_AS_RELATION_STRAIGHT
@ CONNECT_AS_RELATION_SMOOTH
@ CONNECT_AS_FUNCTION_SMOOTH
QString exportDelimiterToString(ExportDelimiter exportDelimiter)
ExportDelimiter
Delimiter values that may or may not be overridden by DOCUMENT_SERIALIZE_EXPORT_DELIMITER_OVERRIDE_CS...
@ EXPORT_DELIMITER_SEMICOLON
QString exportFileExtensionToFilename(ExportFileExtension exportFileExtension)
Internally-used sample file name for each ExportFileExtension value.
QString exportFileExtensionToPreviewString(ExportFileExtension exportFileExtension)
Displayed text for each ExportFileExtension value.
@ EXPORT_FILE_EXTENSION_NOT_CSV_TSV
@ EXPORT_FILE_EXTENSION_CSV
@ EXPORT_FILE_EXTENSION_TSV
@ EXPORT_LAYOUT_ALL_PER_LINE
@ EXPORT_LAYOUT_ONE_PER_LINE
QString exportPointsIntervalUnitsToString(ExportPointsIntervalUnits exportPointsIntervalUnits)
ExportPointsIntervalUnits
@ EXPORT_POINTS_INTERVAL_UNITS_GRAPH
@ EXPORT_POINTS_INTERVAL_UNITS_SCREEN
ExportPointsSelectionFunctions
@ EXPORT_POINTS_SELECTION_FUNCTIONS_RAW
@ EXPORT_POINTS_SELECTION_FUNCTIONS_INTERPOLATE_FIRST_CURVE
@ EXPORT_POINTS_SELECTION_FUNCTIONS_INTERPOLATE_PERIODIC
@ EXPORT_POINTS_SELECTION_FUNCTIONS_INTERPOLATE_ALL_CURVES
@ EXPORT_POINTS_SELECTION_FUNCTIONS_INTERPOLATE_GRID_LINES
ExportPointsSelectionRelations
@ EXPORT_POINTS_SELECTION_RELATIONS_INTERPOLATE
@ EXPORT_POINTS_SELECTION_RELATIONS_RAW
log4cpp::Category * mainCat
const QString SETTINGS_EXPORT_POINTS_INTERVAL_UNITS_RELATIONS
const QString SETTINGS_EXPORT_POINTS_SELECTION_FUNCTIONS
const QString SETTINGS_ENGAUGE
const QString SETTINGS_EXPORT_POINTS_INTERVAL_FUNCTIONS
const QString SETTINGS_EXPORT_X_LABEL
const QString SETTINGS_EXPORT_DELIMITER
const QString SETTINGS_GROUP_EXPORT
const QString SETTINGS_EXPORT_POINTS_INTERVAL_RELATIONS
const QString SETTINGS_EXPORT_LAYOUT_FUNCTIONS
const QString SETTINGS_EXPORT_POINTS_SELECTION_RELATIONS
const QString SETTINGS_EXPORT_EXTRAPOLATE_OUTSIDE_ENDPOINTS
const QString SETTINGS_EXPORT_HEADER
const QString SETTINGS_EXPORT_POINTS_INTERVAL_UNITS_FUNCTIONS
const QString SETTINGS_EXPORT_DELIMITER_OVERRIDE_CSV_TSV
const QString SETTINGS_DIGITIZER
Callback for computing the bounding rectangles of the screen and graph coordinates of the points in t...
CallbackSearchReturn callback(const QString &curveName, const Point &point)
Callback method.
LineStyle lineStyle() const
Get method for LineStyle.
CurveStyle curveStyle(const QString &curveName) const
CurveStyle in specified curve.
QStringList curveNames() const
List of all curve names.
DlgSettingsAbstractBase(const QString &title, const QString &dialogName, MainWindow &mainWindow)
Single constructor.
void setCmdMediator(CmdMediator &cmdMediator)
Store CmdMediator for easy access by the leaf class.
void finishPanel(QWidget *subPanel, int minimumWidth=MINIMUM_DIALOG_WIDTH, int minimumHeightOrZero=0)
Add Ok and Cancel buttons to subpanel to get the whole dialog.
CmdMediator & cmdMediator()
Provide access to Document information wrapped inside CmdMediator.
void createWhatsThis(QGridLayout *layout, ButtonWhatsThis *button, int row, int column)
Create a WhatsThis button in a grid layout.
void enableOk(bool enable)
Let leaf subclass control the Ok button.
static int MINIMUM_PREVIEW_HEIGHT
Dialog layout constant that guarantees preview has sufficent room.
MainWindow & mainWindow()
Get method for MainWindow.
CurveStyles modelCurveStyles() const
Get method for CurveStyles.
DocumentModelExportFormat modelExportOverride(const DocumentModelExportFormat &modelExportFormatBefore, const ExportToFile &exportStrategy, const QString &selectedNameFilter) const
Adjust export settings given filename extension.
void exportToFile(const DocumentModelExportFormat &modelExportOverride, const Document &document, const MainWindowModel &modelMainWindow, const Transformation &transformation, QTextStream &str, unsigned int &numWritesSoFar, bool &isOverrun) const
Export Document points according to the settings.
void exportToFile(const DocumentModelExportFormat &modelExportOverride, const Document &document, const MainWindowModel &modelMainWindow, const Transformation &transformation, QTextStream &str, unsigned int &numWritesSoFar, bool &isOverrun) const
Export Document points according to the settings.
CurveConnectAs curveConnectAs() const
Get method for connect type.
int maximumExportedPointsPerCurve() const
Get method for maximum number of exported points per curve.
Main window consisting of menu, graphics scene, status bar and optional toolbars as a Single Document...
MainWindowModel modelMainWindow() const
Get method for main window model.
#define LOG4CPP_INFO_S(logger)