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;
29 const int MINIMUM_HEIGHT = 500;
33 "DlgSettingsCurveAddRemove",
36 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::DlgSettingsCurveAddRemove";
42 DlgSettingsCurveAddRemove::~DlgSettingsCurveAddRemove()
44 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::~DlgSettingsCurveAddRemove";
47 void DlgSettingsCurveAddRemove::appendCurveName (
const QString &curveNameNew,
48 const QString &curveNameOriginal,
51 ENGAUGE_CHECK_PTR (m_curveNameList);
53 int row = m_curveNameList->
rowCount ();
60 void DlgSettingsCurveAddRemove::createButtons (QGridLayout *layout,
63 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::createButtons";
65 m_btnAdd =
new QPushButton (tr (
"Add..."));
66 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"
67 "Every curve name must be unique"));
68 m_btnAdd->setSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed);
69 connect (m_btnAdd, SIGNAL (released ()),
this, SLOT (slotNew()));
70 layout->addWidget (m_btnAdd, row, 1, 1, 1, Qt::AlignLeft);
72 m_btnRemove =
new QPushButton (tr (
"Remove"));
73 m_btnRemove->setWhatsThis (tr (
"Removes the currently selected curve from the curve list.\n\n"
74 "There must always be at least one curve"));
75 m_btnRemove->setSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed);
76 connect (m_btnRemove, SIGNAL (released ()),
this, SLOT (slotRemove()));
77 layout->addWidget (m_btnRemove, row++, 2, 1, 1, Qt::AlignRight);
80 void DlgSettingsCurveAddRemove::createListCurves (QGridLayout *layout,
83 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::createListCurves";
85 QLabel *label =
new QLabel (tr (
"Curve Names:"));
86 layout->addWidget (label, row++, 1);
91 #ifdef DLG_SETTINGS_DEBUG
92 m_listCurves =
new QTableView;
94 m_listCurves =
new QListView;
97 m_listCurves->setWhatsThis (tr (
"List of the curves belonging to this document.\n\n"
98 "Click on a curve name to edit it. Each curve name must be unique.\n\n"
99 "Reorder curves by dragging them around."));
100 m_listCurves->setMinimumHeight (200);
101 m_listCurves->setSelectionMode (QAbstractItemView::SingleSelection);
102 m_listCurves->setDefaultDropAction (Qt::MoveAction);
103 m_listCurves->setDragDropOverwriteMode (
false);
104 m_listCurves->setDragEnabled (
true);
105 m_listCurves->setDropIndicatorShown (
true);
106 m_listCurves->setDragDropMode (QAbstractItemView::InternalMove);
107 #ifndef DLG_SETTINGS_DEBUG
108 m_listCurves->setViewMode (QListView::ListMode);
109 m_listCurves->setMovement (QListView::Snap);
111 m_listCurves->setModel (m_curveNameList);
112 layout->addWidget (m_listCurves, row++, 1, 1, 2);
113 connect (m_curveNameList, SIGNAL (dataChanged (
const QModelIndex &,
const QModelIndex &,
const QVector<int> &)),
114 this, SLOT (slotDataChanged (
const QModelIndex &,
const QModelIndex &,
const QVector<int> &)));
115 connect (m_listCurves->selectionModel (), SIGNAL (selectionChanged (QItemSelection, QItemSelection)),
116 this, SLOT (slotSelectionChanged (QItemSelection, QItemSelection)));
121 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::createOptionalSaveDefault";
123 m_btnSaveDefault =
new QPushButton (tr (
"Save As Default"));
124 m_btnSaveDefault->setWhatsThis (tr (
"Save the curve names for use as defaults for future graph curves."));
125 connect (m_btnSaveDefault, SIGNAL (released ()),
this, SLOT (slotSaveDefault ()));
126 layout->addWidget (m_btnSaveDefault, 0, Qt::AlignLeft);
128 m_btnResetDefault =
new QPushButton (tr (
"Reset Default"));
129 m_btnResetDefault->setWhatsThis (tr (
"Reset the defaults for future graph curves to the original settings."));
130 connect (m_btnResetDefault, SIGNAL (released ()),
this, SLOT (slotResetDefault()));
131 layout->addWidget (m_btnResetDefault, 0, Qt::AlignRight);
133 QSpacerItem *spacer =
new QSpacerItem (40, 2);
134 layout->addItem (spacer);
139 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::createSubPanel";
141 const int EMPTY_COLUMN_WIDTH = 30;
143 QWidget *subPanel =
new QWidget ();
144 QGridLayout *layout =
new QGridLayout (subPanel);
145 subPanel->setLayout (layout);
148 createListCurves (layout, row);
149 createButtons (layout, row);
151 layout->setColumnStretch (0, 0);
152 layout->setColumnMinimumWidth (0, EMPTY_COLUMN_WIDTH);
153 layout->setColumnStretch (1, 1);
154 layout->setColumnStretch (2, 1);
155 layout->setColumnStretch (3, 0);
156 layout->setColumnMinimumWidth (3, EMPTY_COLUMN_WIDTH);
161 bool DlgSettingsCurveAddRemove::endsWithNumber (
const QString &str)
const
163 bool success =
false;
165 if (!str.isEmpty ()) {
167 success = (str.right (1).at (0).digitValue() >= 0);
175 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::handleOk";
185 void DlgSettingsCurveAddRemove::insertCurveName (
int row,
186 const QString &curveNameNew,
187 const QString &curveNameOriginal,
190 if (m_curveNameList->insertRow (row)) {
192 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::insertCurveName curveName=" << curveNameNew.toLatin1 ().data ();
198 m_curveNameList->
setData (m_curveNameList->index (row, 0),
199 curvesEntry.curveNameCurrent ());
200 m_curveNameList->
setData (m_curveNameList->index (row, 1),
201 curvesEntry.curveNameOriginal ());
202 m_curveNameList->
setData (m_curveNameList->index (row, 2),
207 LOG4CPP_ERROR_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::insertCurveName failed curveName="
208 << curveNameNew.toLatin1 ().data ();
215 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::load";
220 while (m_curveNameList->
rowCount () > 0) {
221 m_curveNameList->removeRow (0);
225 QStringList::const_iterator itr;
226 for (itr = curveNames.begin (); itr != curveNames.end (); itr++) {
227 QString curveName = *itr;
228 appendCurveName (curveName,
233 selectCurveName (curveNames.first());
238 int DlgSettingsCurveAddRemove::newIndexFromSelection ()
const
240 int numSelectedItems = m_listCurves->selectionModel ()->selectedIndexes ().count ();
241 int numItems = m_listCurves->model ()->rowCount ();
245 if ((numSelectedItems == 0) &&
251 }
else if (numSelectedItems == 1) {
254 newIndex = 1 + m_listCurves->selectionModel ()->selectedIndexes ().at (0).row ();
261 QString DlgSettingsCurveAddRemove::nextCurveName ()
const
263 const QString DASH_ONE (
"-1");
265 ENGAUGE_CHECK_PTR (m_listCurves);
267 int newIndex = newIndexFromSelection ();
268 int numItems = m_listCurves->model ()->rowCount ();
271 QString curveNameBefore, curveNameAfter;
274 QModelIndex index = m_curveNameList->index (newIndex - 1, 0);
275 curveNameBefore = m_curveNameList->
data (index).toString ();
279 if ((0 <= newIndex) && (newIndex < numItems)) {
281 QModelIndex index = m_curveNameList->index (newIndex, 0);
282 curveNameAfter = m_curveNameList->
data (index).toString ();
287 QString curveNameNext;
288 if (curveNameBefore.isEmpty () && !curveNameAfter.isEmpty () && endsWithNumber (curveNameAfter)) {
291 int numberAfter = numberAtEnd (curveNameAfter);
292 int numberNew = numberAfter - 1;
293 int pos = curveNameAfter.lastIndexOf (QString::number (numberAfter));
296 curveNameNext = QString (
"%1%2")
297 .arg (curveNameAfter.left (pos))
302 curveNameNext = curveNameAfter;
306 }
else if (curveNameBefore.isEmpty ()) {
308 curveNameNext = DEFAULT_GRAPH_CURVE_NAME;
312 curveNameNext = curveNameBefore;
314 if (endsWithNumber (curveNameBefore)) {
317 int numberBefore = numberAtEnd (curveNameBefore);
318 int numberNew = numberBefore + 1;
319 int pos = curveNameBefore.lastIndexOf (QString::number (numberBefore));
322 curveNameNext = QString (
"%1%2")
323 .arg (curveNameBefore.left (pos))
325 if (curveNameNext == curveNameAfter) {
328 curveNameNext = QString (
"%1%2")
329 .arg (curveNameBefore)
338 int indexOneBasedNext = numItems + 1;
346 curveNameNext += DASH_ONE;
349 return curveNameNext;
352 int DlgSettingsCurveAddRemove::numberAtEnd (
const QString &str)
const
354 ENGAUGE_ASSERT (endsWithNumber (str));
358 int ch = str.size () - 1;
359 while (str.at (ch).digitValue() >= 0) {
368 return sign * str.mid (ch).toInt ();
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, FIRST_COLUMN);
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, FIRST_COLUMN);
404 firstCurveAfter = m_listCurves->model()->data (indexLast).toString();
410 selectCurveName(firstCurveAfter);
413 void DlgSettingsCurveAddRemove::selectCurveName (
const QString &curveWanted)
415 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::selectCurveName"
416 <<
" curve=" << curveWanted.toLatin1().data();
418 for (
int row = 0; m_listCurves->model()->rowCount(); row++) {
420 QModelIndex index = m_listCurves->model()->index (row, FIRST_COLUMN);
421 QString curveGot = index.data ().toString ();
423 if (curveWanted == curveGot) {
426 m_listCurves->setCurrentIndex (index);
436 setMinimumHeight (MINIMUM_HEIGHT);
440 void DlgSettingsCurveAddRemove::slotDataChanged (
const QModelIndex &topLeft,
441 const QModelIndex &bottomRight,
442 const QVector<int> &roles)
444 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::slotDataChanged"
445 <<
" topLeft=(" << topLeft.row () <<
"," << topLeft.column () <<
")"
446 <<
" bottomRight=(" << bottomRight.row () <<
"," << bottomRight.column () <<
")"
447 <<
" roles=" << rolesAsString (roles).toLatin1 ().data ()
448 <<
" defaultDragOption=" << (m_listCurves->defaultDropAction() == Qt::MoveAction ?
"MoveAction" :
"CopyAction");
453 void DlgSettingsCurveAddRemove::slotNew ()
455 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::slotNew";
457 const QString NO_ORIGINAL_CURVE_NAME;
458 const int NO_POINTS = 0;
460 QString curveNameSuggestion = nextCurveName ();
462 int row = newIndexFromSelection();
464 insertCurveName (row,
466 NO_ORIGINAL_CURVE_NAME,
469 selectCurveName (curveNameSuggestion);
474 void DlgSettingsCurveAddRemove::slotRemove ()
476 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::slotRemove";
479 for (
int i = 0; i < m_listCurves->selectionModel ()->selectedIndexes ().count (); i++) {
481 int row = m_listCurves->selectionModel ()->selectedIndexes ().at (i).row ();
483 int curvePoints = m_curveNameList->
data (idx, Qt::DisplayRole).toInt ();
485 numPoints += curvePoints;
488 int rtn = QMessageBox::Ok;
492 if (m_listCurves->selectionModel ()->selectedIndexes ().count () == 1) {
493 msg = QString (
"%1 %2 %3")
494 .arg (tr (
"Removing this curve will also remove"))
496 .arg (tr (
"points. Continue?"));
498 msg = QString (
"%1 %2 %3")
499 .arg (tr (
"Removing these curves will also remove"))
501 .arg (tr (
"points. Continue?"));
504 rtn = QMessageBox::warning (0,
505 tr (
"Curves With Points"),
508 QMessageBox::Cancel);
511 if (rtn == QMessageBox::Ok) {
512 removeSelectedCurves ();
518 void DlgSettingsCurveAddRemove::slotResetDefault()
520 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::slotResetDefault";
522 const QString REMOVE_ALL_SETTINGS_IN_GROUP;
524 QSettings settings (SETTINGS_ENGAUGE, SETTINGS_DIGITIZER);
526 int indexOneBased = 1;
530 while (settings.childGroups().contains (groupName)) {
532 settings.beginGroup (groupName);
533 settings.remove (REMOVE_ALL_SETTINGS_IN_GROUP);
534 settings.endGroup ();
541 void DlgSettingsCurveAddRemove::slotSaveDefault()
543 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::slotSaveDefault";
545 QSettings settings (SETTINGS_ENGAUGE, SETTINGS_DIGITIZER);
547 for (
int row = 0; row < m_curveNameList->
rowCount (); row++) {
549 QModelIndex idxCurrent = m_curveNameList->index (row, 0);
551 QString curveNameCurrent = m_curveNameList->
data (idxCurrent).toString ();
553 int indexOneBased = row + 1;
558 settings.beginGroup (groupName);
559 settings.setValue (SETTINGS_CURVE_NAME,
561 settings.endGroup ();
565 void DlgSettingsCurveAddRemove::slotSelectionChanged (QItemSelection, QItemSelection)
570 void DlgSettingsCurveAddRemove::updateControls ()
572 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsCurveAddRemove::updateControls";
576 ENGAUGE_CHECK_PTR (m_listCurves);
578 int numSelectedItems = m_listCurves->selectionModel ()->selectedIndexes ().count ();
579 int numItems = m_curveNameList->
rowCount ();
582 m_btnRemove->setEnabled ((numSelectedItems > 0) && (numSelectedItems < numItems));
Manage storage and retrieval of the settings for the curves.
virtual void setSmallDialogs(bool smallDialogs)
If false then dialogs have a minimum size so all controls are visible.
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.
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.
QString groupNameForNthCurve(int indexOneBased) const
Return the group name, that appears in the settings file/registry, for the specified curve index...
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.
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.
Abstract base class for all Settings dialogs.
virtual int rowCount(const QModelIndex &parent=QModelIndex()) const
One row per curve name.
Model for DlgSettingsCurveAddRemove and CmdSettingsCurveAddRemove.
MainWindow & mainWindow()
Get method for MainWindow.
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.