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 <QTextStream> 25 #include "QtToString.h" 27 #include "SettingsForGraph.h" 29 const int MINIMUM_HEIGHT = 500;
33 "DlgSettingsCurveAddRemove",
37 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::DlgSettingsCurveAddRemove";
43 DlgSettingsCurveAddRemove::~DlgSettingsCurveAddRemove()
45 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::~DlgSettingsCurveAddRemove";
48 void DlgSettingsCurveAddRemove::appendCurveName (
const QString &curveNameNew,
49 const QString &curveNameOriginal,
52 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::appendCurveName" 53 <<
" curve=" << curveNameNew.toLatin1().data();
55 ENGAUGE_CHECK_PTR (m_curveNameList);
57 int row = m_curveNameList->
rowCount ();
64 void DlgSettingsCurveAddRemove::createButtons (QGridLayout *layout,
67 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::createButtons";
69 m_btnAdd =
new QPushButton (tr (
"Add..."));
70 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" 71 "Every curve name must be unique"));
72 m_btnAdd->setSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed);
73 connect (m_btnAdd, SIGNAL (released ()),
this, SLOT (slotNew()));
74 layout->addWidget (m_btnAdd, row, 1, 1, 1, Qt::AlignLeft);
76 m_btnRemove =
new QPushButton (tr (
"Remove"));
77 m_btnRemove->setWhatsThis (tr (
"Removes the currently selected curve from the curve list.\n\n" 78 "There must always be at least one curve"));
79 m_btnRemove->setSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed);
80 connect (m_btnRemove, SIGNAL (released ()),
this, SLOT (slotRemove()));
81 layout->addWidget (m_btnRemove, row++, 2, 1, 1, Qt::AlignRight);
84 void DlgSettingsCurveAddRemove::createListCurves (QGridLayout *layout,
87 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::createListCurves";
89 QLabel *label =
new QLabel (tr (
"Curve Names:"));
90 layout->addWidget (label, row++, 1);
93 m_listCurves =
new QListView;
94 m_listCurves->setWhatsThis (tr (
"List of the curves belonging to this document.\n\n" 95 "Click on a curve name to edit it. Each curve name must be unique.\n\n" 96 "Reorder curves by dragging them around."));
97 m_listCurves->setMinimumHeight (200);
98 m_listCurves->setSelectionBehavior (QAbstractItemView::SelectItems);
99 m_listCurves->setDragDropOverwriteMode (
false);
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 layout->addWidget (m_listCurves, row++, 1, 1, 2);
109 connect (m_curveNameList, SIGNAL (rowsAboutToBeRemoved (
const QModelIndex &,
int,
int)),
111 connect (m_curveNameList, SIGNAL (dataChanged (
const QModelIndex &,
const QModelIndex &,
const QVector<int> &)),
112 this, SLOT (slotDataChanged (
const QModelIndex &,
const QModelIndex &,
const QVector<int> &)));
114 m_listCurves->setModel (m_curveNameList);
119 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::createOptionalSaveDefault";
121 m_btnSaveDefault =
new QPushButton (tr (
"Save As Default"));
122 m_btnSaveDefault->setWhatsThis (tr (
"Save the curve names for use as defaults for future graph curves."));
123 connect (m_btnSaveDefault, SIGNAL (released ()),
this, SLOT (slotSaveDefault ()));
124 layout->addWidget (m_btnSaveDefault, 0, Qt::AlignLeft);
126 m_btnResetDefault =
new QPushButton (tr (
"Reset Default"));
127 m_btnResetDefault->setWhatsThis (tr (
"Reset the defaults for future graph curves to the original settings."));
128 connect (m_btnResetDefault, SIGNAL (released ()),
this, SLOT (slotResetDefault()));
129 layout->addWidget (m_btnResetDefault, 0, Qt::AlignRight);
131 QSpacerItem *spacer =
new QSpacerItem (40, 2);
132 layout->addItem (spacer);
137 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::createSubPanel";
139 const int EMPTY_COLUMN_WIDTH = 30;
141 QWidget *subPanel =
new QWidget ();
142 QGridLayout *layout =
new QGridLayout (subPanel);
143 subPanel->setLayout (layout);
146 createListCurves (layout, row);
147 createButtons (layout, row);
149 layout->setColumnStretch (0, 0);
150 layout->setColumnMinimumWidth (0, EMPTY_COLUMN_WIDTH);
151 layout->setColumnStretch (1, 1);
152 layout->setColumnStretch (2, 1);
153 layout->setColumnStretch (3, 0);
154 layout->setColumnMinimumWidth (3, EMPTY_COLUMN_WIDTH);
159 bool DlgSettingsCurveAddRemove::endsWithNumber (
const QString &str)
const 161 bool success =
false;
163 if (!str.isEmpty ()) {
165 success = (str.right (1).at (0).digitValue() >= 0);
173 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::handleOk";
183 void DlgSettingsCurveAddRemove::insertCurveName (
int row,
184 const QString &curveNameNew,
185 const QString &curveNameOriginal,
197 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::load";
202 m_listCurves->reset ();
203 m_curveNameList->
reset ();
206 QStringList::const_iterator itr;
207 for (itr = curveNames.begin (); itr != curveNames.end (); itr++) {
208 QString curveName = *itr;
209 appendCurveName (curveName,
214 selectCurveName (curveNames.first());
219 int DlgSettingsCurveAddRemove::newRowFromSelection ()
const 221 int numSelectedItems = m_listCurves->selectionModel ()->selectedIndexes ().count ();
222 int numItems = m_listCurves->model ()->rowCount ();
226 if ((numSelectedItems == 0) &&
232 }
else if (numSelectedItems == 1) {
235 newRow = 1 + m_listCurves->selectionModel ()->selectedIndexes ().at (0).row ();
242 QString DlgSettingsCurveAddRemove::nextCurveName ()
const 244 const QString DASH_ONE (
"-1");
246 ENGAUGE_CHECK_PTR (m_listCurves);
248 int newRow = newRowFromSelection ();
249 int numItems = m_listCurves->model ()->rowCount ();
252 QString curveNameBefore, curveNameAfter;
255 QModelIndex index = m_curveNameList->index (newRow - 1, 0);
256 curveNameBefore = m_curveNameList->data (index).toString ();
260 if ((0 <= newRow) && (newRow < numItems)) {
262 QModelIndex index = m_curveNameList->index (newRow, 0);
263 curveNameAfter = m_curveNameList->data (index).toString ();
268 QString curveNameNext;
269 if (curveNameBefore.isEmpty () && !curveNameAfter.isEmpty () && endsWithNumber (curveNameAfter)) {
272 int numberAfter = numberAtEnd (curveNameAfter);
273 int numberNew = numberAfter - 1;
274 int pos = curveNameAfter.lastIndexOf (QString::number (numberAfter));
277 curveNameNext = QString (
"%1%2")
278 .arg (curveNameAfter.left (pos))
283 curveNameNext = curveNameAfter;
287 }
else if (curveNameBefore.isEmpty ()) {
289 curveNameNext = DEFAULT_GRAPH_CURVE_NAME;
293 curveNameNext = curveNameBefore;
295 if (endsWithNumber (curveNameBefore)) {
298 int numberBefore = numberAtEnd (curveNameBefore);
299 int numberNew = numberBefore + 1;
300 int pos = curveNameBefore.lastIndexOf (QString::number (numberBefore));
303 curveNameNext = QString (
"%1%2")
304 .arg (curveNameBefore.left (pos))
306 if (curveNameNext == curveNameAfter) {
309 curveNameNext = QString (
"%1%2")
310 .arg (curveNameBefore)
319 int indexOneBasedNext = numItems + 1;
327 curveNameNext += DASH_ONE;
330 return curveNameNext;
333 int DlgSettingsCurveAddRemove::numberAtEnd (
const QString &str)
const 335 ENGAUGE_ASSERT (endsWithNumber (str));
339 int ch = str.size () - 1;
340 while (str.at (ch).digitValue() >= 0) {
349 return sign * str.mid (ch).toInt ();
352 unsigned int DlgSettingsCurveAddRemove::numPointsForSelectedCurves ()
const 354 QList<unsigned int > rowsSelected;
357 for (
int i = 0; i < m_listCurves->selectionModel()->selectedIndexes ().count (); i++) {
359 int row = m_listCurves->selectionModel()->selectedIndexes ().at (i).row ();
366 void DlgSettingsCurveAddRemove::printStream(QTextStream &str)
const 371 void DlgSettingsCurveAddRemove::removeSelectedCurves ()
373 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::removeSelectedCurves";
375 ENGAUGE_ASSERT (m_listCurves->selectionModel ()->selectedIndexes ().count () > 0);
378 QString firstCurveAfter;
379 for (
int row = m_listCurves->model()->rowCount() - 1; row >= 0; row--) {
381 QModelIndex indexCurrent = m_listCurves->model()->index(row, CURVE_NAME_LIST_COLUMN_CURRENT);
382 if (indexCurrent == m_listCurves->selectionModel()->selectedIndexes().last()) {
388 firstCurveAfter = indexCurrent.data().toString();
392 for (
int i = m_listCurves->selectionModel ()->selectedIndexes ().count () - 1; i >= 0; i--) {
394 int row = m_listCurves->selectionModel ()->selectedIndexes ().at (i).row ();
396 m_curveNameList->removeRow (row);
399 if (firstCurveAfter.isEmpty ()) {
402 int numItems = m_listCurves->model()->rowCount();
403 QModelIndex indexLast = m_listCurves->model()->index (numItems - 1, CURVE_NAME_LIST_COLUMN_CURRENT);
404 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; row < m_listCurves->model()->rowCount(); row++) {
419 QModelIndex index = m_listCurves->model()->index (row, CURVE_NAME_LIST_COLUMN_CURRENT);
420 QString curveGot = index.data ().toString ();
422 if (curveWanted == curveGot) {
425 m_listCurves->setCurrentIndex (index);
435 setMinimumHeight (MINIMUM_HEIGHT);
439 void DlgSettingsCurveAddRemove::slotDataChanged (
const QModelIndex &topLeft,
440 const QModelIndex &bottomRight,
441 const QVector<int> &roles)
446 QString curveEntries;
447 QTextStream str (&curveEntries);
450 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::slotDataChanged" 451 <<
" topLeft=(" << topLeft.row () <<
"," << topLeft.column () <<
")" 452 <<
" bottomRight=(" << bottomRight.row () <<
"," << bottomRight.column () <<
")" 453 <<
" roles=" << rolesAsString (roles).toLatin1 ().data ()
454 <<
" defaultDragOption=" << (m_listCurves->defaultDropAction() == Qt::MoveAction ?
"MoveAction" :
"CopyAction")
455 <<
" curveEntries=(" << curveEntries.toLatin1().data() <<
")";
464 LOG4CPP_DEBUG_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::slotRowsAboutToBeRemoved" 465 <<
" parentValid=" << (parent.isValid() ?
"yes" :
"no")
466 <<
" rowFirst=" << rowFirst
467 <<
" rowLast=" << rowLast;
472 void DlgSettingsCurveAddRemove::slotNew ()
474 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::slotNew";
476 const QString NO_ORIGINAL_CURVE_NAME;
477 const int NO_POINTS = 0;
479 QString curveNameSuggestion = nextCurveName ();
481 int row = newRowFromSelection();
483 insertCurveName (row,
485 NO_ORIGINAL_CURVE_NAME,
488 selectCurveName (curveNameSuggestion);
493 void DlgSettingsCurveAddRemove::slotRemove ()
495 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::slotRemove";
498 int numPoints = numPointsForSelectedCurves ();
500 int rtn = QMessageBox::Ok;
504 if (m_listCurves->selectionModel ()->selectedIndexes ().count () == 1) {
505 msg = QString (
"%1 %2 %3")
506 .arg (tr (
"Removing this curve will also remove"))
508 .arg (tr (
"points. Continue?"));
510 msg = QString (
"%1 %2 %3")
511 .arg (tr (
"Removing these curves will also remove"))
513 .arg (tr (
"points. Continue?"));
516 rtn = QMessageBox::warning (0,
517 tr (
"Curves With Points"),
520 QMessageBox::Cancel);
523 if (rtn == QMessageBox::Ok) {
524 removeSelectedCurves ();
530 void DlgSettingsCurveAddRemove::slotResetDefault()
532 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::slotResetDefault";
534 const QString REMOVE_ALL_SETTINGS_IN_GROUP;
536 QSettings settings (SETTINGS_ENGAUGE, SETTINGS_DIGITIZER);
538 int indexOneBased = 1;
542 while (settings.childGroups().contains (groupName)) {
544 settings.beginGroup (groupName);
545 settings.remove (REMOVE_ALL_SETTINGS_IN_GROUP);
546 settings.endGroup ();
553 void DlgSettingsCurveAddRemove::slotSaveDefault()
555 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::slotSaveDefault";
557 QSettings settings (SETTINGS_ENGAUGE, SETTINGS_DIGITIZER);
559 for (
int row = 0; row < m_curveNameList->
rowCount (); row++) {
561 QModelIndex idxCurrent = m_curveNameList->index (row, 0);
563 QString curveNameCurrent = m_curveNameList->data (idxCurrent).toString ();
565 int indexOneBased = row + 1;
570 settings.beginGroup (groupName);
571 settings.setValue (SETTINGS_CURVE_NAME,
573 settings.endGroup ();
577 void DlgSettingsCurveAddRemove::updateControls ()
579 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::updateControls";
583 ENGAUGE_CHECK_PTR (m_listCurves);
585 int numSelectedItems = m_listCurves->selectionModel ()->selectedIndexes ().count ();
586 int numItems = m_curveNameList->
rowCount ();
589 m_btnRemove->setEnabled ((numSelectedItems > 0) && (numSelectedItems < numItems));
Manage storage and retrieval of the settings for the curves.
void slotRowsAboutToBeRemoved(const QModelIndex &parent, int rowFirst, int rowLast)
Cleanup after rows have been removed in the model. We remove the corresponding rows in the QListView...
virtual void setSmallDialogs(bool smallDialogs)
If false then dialogs have a minimum size so all controls are visible.
bool containsCurveNameCurrent(const QString &curveName) const
Return true if specified curve name is already in the list.
void setCmdMediator(CmdMediator &cmdMediator)
Store CmdMediator for easy access by the leaf class.
QString currentCurvesAsString() const
For debugging we dump the curve names.
void finishPanel(QWidget *subPanel, int minimumWidth=MINIMUM_DIALOG_WIDTH, int minimumHeightOrZero=0)
Add Ok and Cancel buttons to subpanel to get the whole dialog.
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.
unsigned int numPointsForSelectedCurves(const QList< unsigned int > &rowsSelected) const
Return the number of points associated with the selected curves, as specified by their row numbers...
virtual int rowCount(const QModelIndex &parent=QModelIndex()) const
One row per curve name.
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...
Abstract base class for all Settings dialogs.
void insertRow(int row, const QString &curveCurrent, const QString &curveOriginal, unsigned int pointCount)
Create a new entry at the specified row.
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.
void reset()
Clear all information.
virtual void handleOk()
Process slotOk.