7 #include "CmdMediator.h" 8 #include "CmdSettingsCurveAddRemove.h" 9 #include "CurveNameList.h" 10 #include "DlgSettingsCurveAddRemove.h" 11 #include "EngaugeAssert.h" 13 #include "MainWindow.h" 16 #include <QGridLayout> 19 #include <QMessageBox> 20 #include <QPushButton> 22 #include <QSpacerItem> 24 #include "QtToString.h" 26 #include "SettingsForGraph.h" 28 const int FIRST_COLUMN = 0;
32 "DlgSettingsCurveAddRemove",
35 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::DlgSettingsCurveAddRemove";
41 DlgSettingsCurveAddRemove::~DlgSettingsCurveAddRemove()
43 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::~DlgSettingsCurveAddRemove";
46 void DlgSettingsCurveAddRemove::appendCurveName (
const QString &curveNameNew,
47 const QString &curveNameOriginal,
50 ENGAUGE_CHECK_PTR (m_curveNameList);
52 int row = m_curveNameList->
rowCount ();
59 void DlgSettingsCurveAddRemove::createButtons (QGridLayout *layout,
62 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::createButtons";
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);
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);
79 void DlgSettingsCurveAddRemove::createListCurves (QGridLayout *layout,
82 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::createListCurves";
84 QLabel *label =
new QLabel (tr (
"Curve Names:"));
85 layout->addWidget (label, row++, 1);
90 #ifdef DLG_SETTINGS_DEBUG 91 m_listCurves =
new QTableView;
93 m_listCurves =
new QListView;
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);
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)));
120 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::createOptionalSaveDefault";
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);
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);
132 QSpacerItem *spacer =
new QSpacerItem (40, 2);
133 layout->addItem (spacer);
138 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::createSubPanel";
140 const int EMPTY_COLUMN_WIDTH = 30;
142 QWidget *subPanel =
new QWidget ();
143 QGridLayout *layout =
new QGridLayout (subPanel);
144 subPanel->setLayout (layout);
147 createListCurves (layout, row);
148 createButtons (layout, row);
150 layout->setColumnStretch (0, 0);
151 layout->setColumnMinimumWidth (0, EMPTY_COLUMN_WIDTH);
152 layout->setColumnStretch (1, 1);
153 layout->setColumnStretch (2, 1);
154 layout->setColumnStretch (3, 0);
155 layout->setColumnMinimumWidth (3, EMPTY_COLUMN_WIDTH);
160 bool DlgSettingsCurveAddRemove::endsWithNumber (
const QString &str)
const 162 bool success =
false;
164 if (!str.isEmpty ()) {
166 success = (str.right (1).at (0).digitValue() >= 0);
174 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::handleOk";
184 void DlgSettingsCurveAddRemove::insertCurveName (
int row,
185 const QString &curveNameNew,
186 const QString &curveNameOriginal,
189 if (m_curveNameList->insertRow (row)) {
191 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::insertCurveName curveName=" << curveNameNew.toLatin1 ().data ();
197 m_curveNameList->
setData (m_curveNameList->index (row, 0),
199 m_curveNameList->
setData (m_curveNameList->index (row, 1),
201 m_curveNameList->
setData (m_curveNameList->index (row, 2),
206 LOG4CPP_ERROR_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::insertCurveName failed curveName=" 207 << curveNameNew.toLatin1 ().data ();
214 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::load";
219 while (m_curveNameList->
rowCount () > 0) {
220 m_curveNameList->removeRow (0);
224 QStringList::const_iterator itr;
225 for (itr = curveNames.begin (); itr != curveNames.end (); itr++) {
226 QString curveName = *itr;
227 appendCurveName (curveName,
232 selectCurveName (curveNames.first());
237 int DlgSettingsCurveAddRemove::newIndexFromSelection ()
const 239 int numSelectedItems = m_listCurves->selectionModel ()->selectedIndexes ().count ();
240 int numItems = m_listCurves->model ()->rowCount ();
244 if ((numSelectedItems == 0) &&
250 }
else if (numSelectedItems == 1) {
253 newIndex = 1 + m_listCurves->selectionModel ()->selectedIndexes ().at (0).row ();
260 QString DlgSettingsCurveAddRemove::nextCurveName ()
const 262 const QString DASH_ONE (
"-1");
264 ENGAUGE_CHECK_PTR (m_listCurves);
266 int newIndex = newIndexFromSelection ();
267 int numItems = m_listCurves->model ()->rowCount ();
270 QString curveNameBefore, curveNameAfter;
273 QModelIndex index = m_curveNameList->index (newIndex - 1, 0);
274 curveNameBefore = m_curveNameList->
data (index).toString ();
278 if ((0 <= newIndex) && (newIndex < numItems)) {
280 QModelIndex index = m_curveNameList->index (newIndex, 0);
281 curveNameAfter = m_curveNameList->
data (index).toString ();
286 QString curveNameNext;
287 if (curveNameBefore.isEmpty () && !curveNameAfter.isEmpty () && endsWithNumber (curveNameAfter)) {
290 int numberAfter = numberAtEnd (curveNameAfter);
291 int numberNew = numberAfter - 1;
292 int pos = curveNameAfter.lastIndexOf (QString::number (numberAfter));
295 curveNameNext = QString (
"%1%2")
296 .arg (curveNameAfter.left (pos))
301 curveNameNext = curveNameAfter;
305 }
else if (curveNameBefore.isEmpty ()) {
307 curveNameNext = DEFAULT_GRAPH_CURVE_NAME;
311 curveNameNext = curveNameBefore;
313 if (endsWithNumber (curveNameBefore)) {
316 int numberBefore = numberAtEnd (curveNameBefore);
317 int numberNew = numberBefore + 1;
318 int pos = curveNameBefore.lastIndexOf (QString::number (numberBefore));
321 curveNameNext = QString (
"%1%2")
322 .arg (curveNameBefore.left (pos))
324 if (curveNameNext == curveNameAfter) {
327 curveNameNext = QString (
"%1%2")
328 .arg (curveNameBefore)
337 int indexOneBasedNext = numItems + 1;
345 curveNameNext += DASH_ONE;
348 return curveNameNext;
351 int DlgSettingsCurveAddRemove::numberAtEnd (
const QString &str)
const 353 ENGAUGE_ASSERT (endsWithNumber (str));
357 int ch = str.size () - 1;
358 while (str.at (ch).digitValue() >= 0) {
367 return sign * str.mid (ch).toInt ();
370 void DlgSettingsCurveAddRemove::removeSelectedCurves ()
372 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::removeSelectedCurves";
374 ENGAUGE_ASSERT (m_listCurves->selectionModel ()->selectedIndexes ().count () > 0);
377 QString firstCurveAfter;
378 for (
int row = m_listCurves->model()->rowCount() - 1; row >= 0; row--) {
380 QModelIndex indexCurrent = m_listCurves->model()->index(row, FIRST_COLUMN);
381 if (indexCurrent == m_listCurves->selectionModel()->selectedIndexes().last()) {
387 firstCurveAfter = indexCurrent.data().toString();
391 for (
int i = m_listCurves->selectionModel ()->selectedIndexes ().count () - 1; i >= 0; i--) {
393 int row = m_listCurves->selectionModel ()->selectedIndexes ().at (i).row ();
395 m_curveNameList->removeRow (row);
398 if (firstCurveAfter.isEmpty ()) {
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();
409 selectCurveName(firstCurveAfter);
412 void DlgSettingsCurveAddRemove::selectCurveName (
const QString &curveWanted)
414 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::selectCurveName" 415 <<
" curve=" << curveWanted.toLatin1().data();
417 for (
int row = 0; m_listCurves->model()->rowCount(); row++) {
419 QModelIndex index = m_listCurves->model()->index (row, FIRST_COLUMN);
420 QString curveGot = index.data ().toString ();
422 if (curveWanted == curveGot) {
425 m_listCurves->setCurrentIndex (index);
432 void DlgSettingsCurveAddRemove::slotDataChanged (
const QModelIndex &topLeft,
433 const QModelIndex &bottomRight,
434 const QVector<int> &roles)
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");
445 void DlgSettingsCurveAddRemove::slotNew ()
447 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::slotNew";
449 const QString NO_ORIGINAL_CURVE_NAME;
450 const int NO_POINTS = 0;
452 QString curveNameSuggestion = nextCurveName ();
454 int row = newIndexFromSelection();
456 insertCurveName (row,
458 NO_ORIGINAL_CURVE_NAME,
461 selectCurveName (curveNameSuggestion);
466 void DlgSettingsCurveAddRemove::slotRemove ()
468 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::slotRemove";
471 for (
int i = 0; i < m_listCurves->selectionModel ()->selectedIndexes ().count (); i++) {
473 int row = m_listCurves->selectionModel ()->selectedIndexes ().at (i).row ();
475 int curvePoints = m_curveNameList->
data (idx, Qt::DisplayRole).toInt ();
477 numPoints += curvePoints;
480 int rtn = QMessageBox::Ok;
484 if (m_listCurves->selectionModel ()->selectedIndexes ().count () == 1) {
485 msg = QString (
"%1 %2 %3")
486 .arg (tr (
"Removing this curve will also remove"))
488 .arg (tr (
"points. Continue?"));
490 msg = QString (
"%1 %2 %3")
491 .arg (tr (
"Removing these curves will also remove"))
493 .arg (tr (
"points. Continue?"));
496 rtn = QMessageBox::warning (0,
497 tr (
"Curves With Points"),
500 QMessageBox::Cancel);
503 if (rtn == QMessageBox::Ok) {
504 removeSelectedCurves ();
510 void DlgSettingsCurveAddRemove::slotResetDefault()
512 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::slotResetDefault";
514 const QString REMOVE_ALL_SETTINGS_IN_GROUP;
516 QSettings settings (SETTINGS_ENGAUGE, SETTINGS_DIGITIZER);
518 int indexOneBased = 1;
522 while (settings.childGroups().contains (groupName)) {
524 settings.beginGroup (groupName);
525 settings.remove (REMOVE_ALL_SETTINGS_IN_GROUP);
526 settings.endGroup ();
533 void DlgSettingsCurveAddRemove::slotSaveDefault()
535 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::slotSaveDefault";
537 QSettings settings (SETTINGS_ENGAUGE, SETTINGS_DIGITIZER);
539 for (
int row = 0; row < m_curveNameList->
rowCount (); row++) {
541 QModelIndex idxCurrent = m_curveNameList->index (row, 0);
543 QString curveNameCurrent = m_curveNameList->
data (idxCurrent).toString ();
545 int indexOneBased = row + 1;
550 settings.beginGroup (groupName);
551 settings.setValue (SETTINGS_CURVE_NAME,
553 settings.endGroup ();
557 void DlgSettingsCurveAddRemove::slotSelectionChanged (QItemSelection, QItemSelection)
562 void DlgSettingsCurveAddRemove::updateControls ()
564 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::updateControls";
568 ENGAUGE_CHECK_PTR (m_listCurves);
570 int numSelectedItems = m_listCurves->selectionModel ()->selectedIndexes ().count ();
571 int numItems = m_curveNameList->
rowCount ();
574 m_btnRemove->setEnabled ((numSelectedItems > 0) && (numSelectedItems < numItems));
Manage storage and retrieval of the settings for the curves.
bool containsCurveNameCurrent(const QString &curveName) const
Return true if specified curve name is already in the list.
QString curveNameOriginal() const
Original curve name in document. Empty if there was no original curve.
void setCmdMediator(CmdMediator &cmdMediator)
Store CmdMediator for easy access by the leaf class.
Utility class for converting the QVariant in CurveNameList to/from the curve names as QStrings...
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.
virtual bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole)
Store one curve name data.
virtual int rowCount(const QModelIndex &parent=QModelIndex()) const
One row per curve name.
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.
QString groupNameForNthCurve(int indexOneBased) const
Return the group name, that appears in the settings file/registry, for the specified curve index...
void finishPanel(QWidget *subPanel, int minimumWidth=MINIMUM_DIALOG_WIDTH)
Add Ok and Cancel buttons to subpanel to get the whole dialog.
QString curveNameCurrent() const
Curve name displayed in DlgSettingsCurveAddRemove.
Abstract base class for all Settings dialogs.
virtual QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const
Retrieve data from model.
Model for DlgSettingsCurveAddRemove and CmdSettingsCurveAddRemove.
MainWindow & mainWindow()
Get method for MainWindow.
QString defaultCurveName(int indexOneBased, const QString &defaultName) const
Default graph name for the specified curve index.
Main window consisting of menu, graphics scene, status bar and optional toolbars as a Single Document...
DlgSettingsCurveAddRemove(MainWindow &mainWindow)
Single constructor.
CmdMediator & cmdMediator()
Provide access to Document information wrapped inside CmdMediator.
virtual void handleOk()
Process slotOk.