Engauge Digitizer  2
DlgSettingsCurveAddRemove.cpp
1 /******************************************************************************************************
2  * (C) 2014 markummitchell@github.com. This file is part of Engauge Digitizer, which is released *
3  * under GNU General Public License version 2 (GPLv2) or (at your option) any later version. See file *
4  * LICENSE or go to gnu.org/licenses for details. Distribution requires prior written permission. *
5  ******************************************************************************************************/
6 
7 #include "CmdMediator.h"
8 #include "CmdSettingsCurveAddRemove.h"
9 #include "CurveNameList.h"
10 #include "DlgSettingsCurveAddRemove.h"
11 #include "EngaugeAssert.h"
12 #include "Logger.h"
13 #include "MainWindow.h"
14 #include <QCheckBox>
15 #include <QDebug>
16 #include <QGridLayout>
17 #include <QLabel>
18 #include <QListView>
19 #include <QMessageBox>
20 #include <QPushButton>
21 #include <QSettings>
22 #include <QSpacerItem>
23 #include <QTableView>
24 #include "QtToString.h"
25 #include "Settings.h"
26 #include "SettingsForGraph.h"
27 
28 const int FIRST_COLUMN = 0;
29 
31  DlgSettingsAbstractBase (tr ("Curve Add/Remove"),
32  "DlgSettingsCurveAddRemove",
33  mainWindow)
34 {
35  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::DlgSettingsCurveAddRemove";
36 
37  QWidget *subPanel = createSubPanel ();
38  finishPanel (subPanel);
39 }
40 
41 DlgSettingsCurveAddRemove::~DlgSettingsCurveAddRemove()
42 {
43  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::~DlgSettingsCurveAddRemove";
44 }
45 
46 void DlgSettingsCurveAddRemove::appendCurveName (const QString &curveNameNew,
47  const QString &curveNameOriginal,
48  int numPoints)
49 {
50  ENGAUGE_CHECK_PTR (m_curveNameList);
51 
52  int row = m_curveNameList->rowCount ();
53  insertCurveName (row,
54  curveNameNew,
55  curveNameOriginal,
56  numPoints);
57 }
58 
59 void DlgSettingsCurveAddRemove::createButtons (QGridLayout *layout,
60  int &row)
61 {
62  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::createButtons";
63 
64  m_btnAdd = new QPushButton (tr ("Add..."));
65  m_btnAdd->setWhatsThis (tr ("Adds a new curve to the curve list. The curve name can be edited in the curve name list.\n\n"
66  "Every curve name must be unique"));
67  m_btnAdd->setSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed);
68  connect (m_btnAdd, SIGNAL (released ()), this, SLOT (slotNew()));
69  layout->addWidget (m_btnAdd, row, 1, 1, 1, Qt::AlignLeft);
70 
71  m_btnRemove = new QPushButton (tr ("Remove"));
72  m_btnRemove->setWhatsThis (tr ("Removes the currently selected curve from the curve list.\n\n"
73  "There must always be at least one curve"));
74  m_btnRemove->setSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed);
75  connect (m_btnRemove, SIGNAL (released ()), this, SLOT (slotRemove()));
76  layout->addWidget (m_btnRemove, row++, 2, 1, 1, Qt::AlignRight);
77 }
78 
79 void DlgSettingsCurveAddRemove::createListCurves (QGridLayout *layout,
80  int &row)
81 {
82  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::createListCurves";
83 
84  QLabel *label = new QLabel (tr ("Curve Names:"));
85  layout->addWidget (label, row++, 1);
86 
87  m_curveNameList = new CurveNameList;
88 
89  // There is no Qt::ItemIsEditable flag for QListView, so instead we set that flag for the QListViewItems
90 #ifdef DLG_SETTINGS_DEBUG
91  m_listCurves = new QTableView;
92 #else
93  m_listCurves = new QListView;
94 #endif
95 
96  m_listCurves->setWhatsThis (tr ("List of the curves belonging to this document.\n\n"
97  "Click on a curve name to edit it. Each curve name must be unique.\n\n"
98  "Reorder curves by dragging them around."));
99  m_listCurves->setMinimumHeight (200);
100  m_listCurves->setSelectionMode (QAbstractItemView::SingleSelection);
101  m_listCurves->setDefaultDropAction (Qt::MoveAction);
102  m_listCurves->setDragDropOverwriteMode (false);
103  m_listCurves->setDragEnabled (true);
104  m_listCurves->setDropIndicatorShown (true);
105  m_listCurves->setDragDropMode (QAbstractItemView::InternalMove);
106 #ifndef DLG_SETTINGS_DEBUG
107  m_listCurves->setViewMode (QListView::ListMode);
108  m_listCurves->setMovement (QListView::Snap);
109 #endif
110  m_listCurves->setModel (m_curveNameList);
111  layout->addWidget (m_listCurves, row++, 1, 1, 2);
112  connect (m_curveNameList, SIGNAL (dataChanged (const QModelIndex &, const QModelIndex &, const QVector<int> &)),
113  this, SLOT (slotDataChanged (const QModelIndex &, const QModelIndex &, const QVector<int> &)));
114  connect (m_listCurves->selectionModel (), SIGNAL (selectionChanged (QItemSelection, QItemSelection)),
115  this, SLOT (slotSelectionChanged (QItemSelection, QItemSelection)));
116 }
117 
119 {
120  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::createOptionalSaveDefault";
121 
122  m_btnSaveDefault = new QPushButton (tr ("Save As Default"));
123  m_btnSaveDefault->setWhatsThis (tr ("Save the curve names for use as defaults for future graph curves."));
124  connect (m_btnSaveDefault, SIGNAL (released ()), this, SLOT (slotSaveDefault ()));
125  layout->addWidget (m_btnSaveDefault, 0, Qt::AlignLeft);
126 
127  m_btnResetDefault = new QPushButton (tr ("Reset Default"));
128  m_btnResetDefault->setWhatsThis (tr ("Reset the defaults for future graph curves to the original settings."));
129  connect (m_btnResetDefault, SIGNAL (released ()), this, SLOT (slotResetDefault()));
130  layout->addWidget (m_btnResetDefault, 0, Qt::AlignRight);
131 
132  QSpacerItem *spacer = new QSpacerItem (40, 2);
133  layout->addItem (spacer);
134 }
135 
137 {
138  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::createSubPanel";
139 
140  const int EMPTY_COLUMN_WIDTH = 30;
141 
142  QWidget *subPanel = new QWidget ();
143  QGridLayout *layout = new QGridLayout (subPanel);
144  subPanel->setLayout (layout);
145 
146  int row = 1;
147  createListCurves (layout, row);
148  createButtons (layout, row);
149 
150  layout->setColumnStretch (0, 0); // Empty first column
151  layout->setColumnMinimumWidth (0, EMPTY_COLUMN_WIDTH);
152  layout->setColumnStretch (1, 1); // New
153  layout->setColumnStretch (2, 1); // Remove
154  layout->setColumnStretch (3, 0); // Empty last column
155  layout->setColumnMinimumWidth (3, EMPTY_COLUMN_WIDTH);
156 
157  return subPanel;
158 }
159 
160 bool DlgSettingsCurveAddRemove::endsWithNumber (const QString &str) const
161 {
162  bool success = false;
163 
164  if (!str.isEmpty ()) {
165 
166  success = (str.right (1).at (0).digitValue() >= 0);
167  }
168 
169  return success;
170 }
171 
173 {
174  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::handleOk";
175 
177  cmdMediator ().document(),
178  *m_curveNameList);
179  cmdMediator ().push (cmd);
180 
181  hide ();
182 }
183 
184 void DlgSettingsCurveAddRemove::insertCurveName (int row,
185  const QString &curveNameNew,
186  const QString &curveNameOriginal,
187  int numPoints)
188 {
189  if (m_curveNameList->insertRow (row)) {
190 
191  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::insertCurveName curveName=" << curveNameNew.toLatin1 ().data ();
192 
193  CurveNameListEntry curvesEntry (curveNameNew,
194  curveNameOriginal,
195  numPoints);
196 
197  m_curveNameList->setData (m_curveNameList->index (row, 0),
198  curvesEntry.curveNameCurrent ());
199  m_curveNameList->setData (m_curveNameList->index (row, 1),
200  curvesEntry.curveNameOriginal ());
201  m_curveNameList->setData (m_curveNameList->index (row, 2),
202  numPoints);
203 
204  } else {
205 
206  LOG4CPP_ERROR_S ((*mainCat)) << "DlgSettingsCurveAddRemove::insertCurveName failed curveName="
207  << curveNameNew.toLatin1 ().data ();
208 
209  }
210 }
211 
213 {
214  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::load";
215 
216  setCmdMediator (cmdMediator);
217 
218  // Remove any data from previous showing of dialog
219  while (m_curveNameList->rowCount () > 0) {
220  m_curveNameList->removeRow (0);
221  }
222 
223  QStringList curveNames = cmdMediator.curvesGraphsNames ();
224  QStringList::const_iterator itr;
225  for (itr = curveNames.begin (); itr != curveNames.end (); itr++) {
226  QString curveName = *itr;
227  appendCurveName (curveName,
228  curveName,
229  cmdMediator.curvesGraphsNumPoints (curveName));
230  }
231 
232  selectCurveName (curveNames.first());
233 
234  enableOk (false); // Disable Ok button since there not yet any changes
235 }
236 
237 int DlgSettingsCurveAddRemove::newIndexFromSelection () const
238 {
239  int numSelectedItems = m_listCurves->selectionModel ()->selectedIndexes ().count ();
240  int numItems = m_listCurves->model ()->rowCount ();
241 
242  // Determine index where new entry will be inserted
243  int newIndex = -1;
244  if ((numSelectedItems == 0) &&
245  (numItems > 0)) {
246 
247  // Append after list which has at least one entry
248  newIndex = numItems;
249 
250  } else if (numSelectedItems == 1) {
251 
252  // Insert after the selected index
253  newIndex = 1 + m_listCurves->selectionModel ()->selectedIndexes ().at (0).row ();
254 
255  }
256 
257  return newIndex;
258 }
259 
260 QString DlgSettingsCurveAddRemove::nextCurveName () const
261 {
262  const QString DASH_ONE ("-1"); // Nice value to start a new range at a lower level than the current level
263 
264  ENGAUGE_CHECK_PTR (m_listCurves);
265 
266  int newIndex = newIndexFromSelection ();
267  int numItems = m_listCurves->model ()->rowCount ();
268 
269  // Curves names of existing before/after curves
270  QString curveNameBefore, curveNameAfter;
271  if (newIndex > 0) {
272 
273  QModelIndex index = m_curveNameList->index (newIndex - 1, 0);
274  curveNameBefore = m_curveNameList->data (index).toString ();
275 
276  }
277 
278  if ((0 <= newIndex) && (newIndex < numItems)) {
279 
280  QModelIndex index = m_curveNameList->index (newIndex, 0);
281  curveNameAfter = m_curveNameList->data (index).toString ();
282 
283  }
284 
285  // New curve name computed from previous curve name
286  QString curveNameNext;
287  if (curveNameBefore.isEmpty () && !curveNameAfter.isEmpty () && endsWithNumber (curveNameAfter)) {
288 
289  // Pick a name before curveNameAfter
290  int numberAfter = numberAtEnd (curveNameAfter);
291  int numberNew = numberAfter - 1;
292  int pos = curveNameAfter.lastIndexOf (QString::number (numberAfter));
293  if (pos >= 0) {
294 
295  curveNameNext = QString ("%1%2")
296  .arg (curveNameAfter.left (pos))
297  .arg (numberNew);
298 
299  } else {
300 
301  curveNameNext = curveNameAfter; // Better than nothing
302 
303  }
304 
305  } else if (curveNameBefore.isEmpty ()) {
306 
307  curveNameNext = DEFAULT_GRAPH_CURVE_NAME; // If necessary, this will be deconflicted below
308 
309  } else {
310 
311  curveNameNext = curveNameBefore; // This will be deconflicted below
312 
313  if (endsWithNumber (curveNameBefore)) {
314 
315  // Curve name ends with a number. Pick a name after curveNameBefore, being sure to not match curveNameAfter
316  int numberBefore = numberAtEnd (curveNameBefore);
317  int numberNew = numberBefore + 1;
318  int pos = curveNameBefore.lastIndexOf (QString::number (numberBefore));
319  if (pos >= 0) {
320 
321  curveNameNext = QString ("%1%2")
322  .arg (curveNameBefore.left (pos))
323  .arg (numberNew);
324  if (curveNameNext == curveNameAfter) {
325 
326  // The difference between before and after is exactly one so we go to a lower level
327  curveNameNext = QString ("%1%2")
328  .arg (curveNameBefore)
329  .arg (DASH_ONE);
330  }
331  }
332  }
333  }
334 
335  // Curve name from settings takes precedence
336  SettingsForGraph settingsForGraph;
337  int indexOneBasedNext = numItems + 1;
338  curveNameNext = settingsForGraph.defaultCurveName (indexOneBasedNext,
339  curveNameNext);
340 
341  // At this point we have curveNameNext which does not conflict with curveNameBefore or
342  // curveNameAfter, but it may in rare cases conflict with some other curve name. We keep
343  // adding to the name until there is no conflict
344  while (m_curveNameList->containsCurveNameCurrent (curveNameNext)) {
345  curveNameNext += DASH_ONE;
346  }
347 
348  return curveNameNext;
349 }
350 
351 int DlgSettingsCurveAddRemove::numberAtEnd (const QString &str) const
352 {
353  ENGAUGE_ASSERT (endsWithNumber (str));
354 
355  // Go backward until the first nondigit
356  int sign = +1;
357  int ch = str.size () - 1;
358  while (str.at (ch).digitValue() >= 0) {
359  --ch;
360 
361  if (ch < 0) {
362  break;
363  }
364  }
365  ++ch;
366 
367  return sign * str.mid (ch).toInt ();
368 }
369 
370 void DlgSettingsCurveAddRemove::removeSelectedCurves ()
371 {
372  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::removeSelectedCurves";
373 
374  ENGAUGE_ASSERT (m_listCurves->selectionModel ()->selectedIndexes ().count () > 0); // Also guarantees number of indexes > 0
375 
376  // Identify the first index after the last selected index
377  QString firstCurveAfter; // Empty case means there was no index afer the last selected index
378  for (int row = m_listCurves->model()->rowCount() - 1; row >= 0; row--) {
379 
380  QModelIndex indexCurrent = m_listCurves->model()->index(row, FIRST_COLUMN);
381  if (indexCurrent == m_listCurves->selectionModel()->selectedIndexes().last()) {
382 
383  // This is the last selected index, which will be removed below. Exit immediately with firstCurveAfter set
384  break;
385  }
386 
387  firstCurveAfter = indexCurrent.data().toString();
388  }
389 
390  // Delete the selected indexes from last to first
391  for (int i = m_listCurves->selectionModel ()->selectedIndexes ().count () - 1; i >= 0; i--) {
392 
393  int row = m_listCurves->selectionModel ()->selectedIndexes ().at (i).row ();
394 
395  m_curveNameList->removeRow (row);
396  }
397 
398  if (firstCurveAfter.isEmpty ()) {
399 
400  // Select the last remaining curve. These steps seem more complicated than necessary
401  int numItems = m_listCurves->model()->rowCount();
402  QModelIndex indexLast = m_listCurves->model()->index (numItems - 1, FIRST_COLUMN);
403  firstCurveAfter = m_listCurves->model()->data (indexLast).toString();
404 
405  }
406 
407 
408  // Select an item
409  selectCurveName(firstCurveAfter);
410 }
411 
412 void DlgSettingsCurveAddRemove::selectCurveName (const QString &curveWanted)
413 {
414  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::selectCurveName"
415  << " curve=" << curveWanted.toLatin1().data();
416 
417  for (int row = 0; m_listCurves->model()->rowCount(); row++) {
418 
419  QModelIndex index = m_listCurves->model()->index (row, FIRST_COLUMN);
420  QString curveGot = index.data ().toString ();
421 
422  if (curveWanted == curveGot) {
423 
424  // Found the curve we want to select
425  m_listCurves->setCurrentIndex (index);
426  break;
427 
428  }
429  }
430 }
431 
432 void DlgSettingsCurveAddRemove::slotDataChanged (const QModelIndex &topLeft,
433  const QModelIndex &bottomRight,
434  const QVector<int> &roles)
435 {
436  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::slotDataChanged"
437  << " topLeft=(" << topLeft.row () << "," << topLeft.column () << ")"
438  << " bottomRight=(" << bottomRight.row () << "," << bottomRight.column () << ")"
439  << " roles=" << rolesAsString (roles).toLatin1 ().data ()
440  << " defaultDragOption=" << (m_listCurves->defaultDropAction() == Qt::MoveAction ? "MoveAction" : "CopyAction");
441 
442  updateControls ();
443 }
444 
445 void DlgSettingsCurveAddRemove::slotNew ()
446 {
447  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::slotNew";
448 
449  const QString NO_ORIGINAL_CURVE_NAME;
450  const int NO_POINTS = 0;
451 
452  QString curveNameSuggestion = nextCurveName ();
453 
454  int row = newIndexFromSelection();
455 
456  insertCurveName (row,
457  curveNameSuggestion,
458  NO_ORIGINAL_CURVE_NAME,
459  NO_POINTS);
460 
461  selectCurveName (curveNameSuggestion);
462 
463  updateControls();
464 }
465 
466 void DlgSettingsCurveAddRemove::slotRemove ()
467 {
468  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::slotRemove";
469 
470  int numPoints = 0;
471  for (int i = 0; i < m_listCurves->selectionModel ()->selectedIndexes ().count (); i++) {
472 
473  int row = m_listCurves->selectionModel ()->selectedIndexes ().at (i).row ();
474  QModelIndex idx = m_curveNameList->index (row, CurveNameListEntry::COL_NUM_POINTS ());
475  int curvePoints = m_curveNameList->data (idx, Qt::DisplayRole).toInt ();
476 
477  numPoints += curvePoints;
478  }
479 
480  int rtn = QMessageBox::Ok;
481  if (numPoints > 0) {
482 
483  QString msg;
484  if (m_listCurves->selectionModel ()->selectedIndexes ().count () == 1) {
485  msg = QString ("%1 %2 %3")
486  .arg (tr ("Removing this curve will also remove"))
487  .arg (numPoints)
488  .arg (tr ("points. Continue?"));
489  } else {
490  msg = QString ("%1 %2 %3")
491  .arg (tr ("Removing these curves will also remove"))
492  .arg (numPoints)
493  .arg (tr ("points. Continue?"));
494  }
495 
496  rtn = QMessageBox::warning (0,
497  tr ("Curves With Points"),
498  msg,
499  QMessageBox::Ok,
500  QMessageBox::Cancel);
501  }
502 
503  if (rtn == QMessageBox::Ok) {
504  removeSelectedCurves ();
505  }
506 
507  updateControls();
508 }
509 
510 void DlgSettingsCurveAddRemove::slotResetDefault()
511 {
512  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::slotResetDefault";
513 
514  const QString REMOVE_ALL_SETTINGS_IN_GROUP; // Empty string
515 
516  QSettings settings (SETTINGS_ENGAUGE, SETTINGS_DIGITIZER);
517 
518  int indexOneBased = 1;
519 
520  SettingsForGraph settingsForGraph;
521  QString groupName = settingsForGraph.groupNameForNthCurve (indexOneBased);
522  while (settings.childGroups().contains (groupName)) {
523 
524  settings.beginGroup (groupName);
525  settings.remove (REMOVE_ALL_SETTINGS_IN_GROUP); // Remove this group by removing its settings
526  settings.endGroup ();
527 
528  ++indexOneBased;
529  groupName = settingsForGraph.groupNameForNthCurve (indexOneBased);
530  }
531 }
532 
533 void DlgSettingsCurveAddRemove::slotSaveDefault()
534 {
535  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::slotSaveDefault";
536 
537  QSettings settings (SETTINGS_ENGAUGE, SETTINGS_DIGITIZER);
538 
539  for (int row = 0; row < m_curveNameList->rowCount (); row++) {
540 
541  QModelIndex idxCurrent = m_curveNameList->index (row, 0);
542 
543  QString curveNameCurrent = m_curveNameList->data (idxCurrent).toString ();
544 
545  int indexOneBased = row + 1;
546 
547  SettingsForGraph settingsForGraph;
548  QString groupName = settingsForGraph.groupNameForNthCurve (indexOneBased);
549 
550  settings.beginGroup (groupName);
551  settings.setValue (SETTINGS_CURVE_NAME,
552  curveNameCurrent);
553  settings.endGroup ();
554  }
555 }
556 
557 void DlgSettingsCurveAddRemove::slotSelectionChanged (QItemSelection, QItemSelection)
558 {
559  updateControls ();
560 }
561 
562 void DlgSettingsCurveAddRemove::updateControls ()
563 {
564  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::updateControls";
565 
566  enableOk (true);
567 
568  ENGAUGE_CHECK_PTR (m_listCurves);
569 
570  int numSelectedItems = m_listCurves->selectionModel ()->selectedIndexes ().count ();
571  int numItems = m_curveNameList->rowCount ();
572 
573  // Leave at least one curve
574  m_btnRemove->setEnabled ((numSelectedItems > 0) && (numSelectedItems < numItems));
575 }
Manage storage and retrieval of the settings for the curves.
void setCmdMediator(CmdMediator &cmdMediator)
Store CmdMediator for easy access by the leaf class.
bool containsCurveNameCurrent(const QString &curveName) const
Return true if specified curve name is already in the list.
Utility class for converting the QVariant in CurveNameList to/from the curve names as QStrings...
QString defaultCurveName(int indexOneBased, const QString &defaultName) const
Default graph name for the specified curve index.
Command for DlgSettingsCurveAddRemove.
virtual void createOptionalSaveDefault(QHBoxLayout *layout)
Let subclass define an optional Save As Default button.
virtual QWidget * createSubPanel()
Create dialog-specific panel to which base class will add Ok and Cancel buttons.
QString groupNameForNthCurve(int indexOneBased) const
Return the group name, that appears in the settings file/registry, for the specified curve index...
QString curveNameOriginal() const
Original curve name in document. Empty if there was no original curve.
virtual bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole)
Store one curve name data.
virtual QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const
Retrieve data from model.
void finishPanel(QWidget *subPanel)
Add Ok and Cancel buttons to subpanel to get the whole dialog.
static int COL_NUM_POINTS()
Get method for number of points constant.
void load(CmdMediator &cmdMediator)
Load settings from Document.
void enableOk(bool enable)
Let leaf subclass control the Ok button.
Command queue stack.
Definition: CmdMediator.h:23
Abstract base class for all Settings dialogs.
virtual int rowCount(const QModelIndex &parent=QModelIndex()) const
One row per curve name.
QString curveNameCurrent() const
Curve name displayed in DlgSettingsCurveAddRemove.
Model for DlgSettingsCurveAddRemove and CmdSettingsCurveAddRemove.
Definition: CurveNameList.h:16
int curvesGraphsNumPoints(const QString &curveName) const
See CurvesGraphs::curvesGraphsNumPoints.
Definition: CmdMediator.cpp:67
MainWindow & mainWindow()
Get method for MainWindow.
Main window consisting of menu, graphics scene, status bar and optional toolbars as a Single Document...
Definition: MainWindow.h:83
DlgSettingsCurveAddRemove(MainWindow &mainWindow)
Single constructor.
QStringList curvesGraphsNames() const
See CurvesGraphs::curvesGraphsNames.
Definition: CmdMediator.cpp:62
CmdMediator & cmdMediator()
Provide access to Document information wrapped inside CmdMediator.
virtual void handleOk()
Process slotOk.