00001
00002
00003
00004
00005
00006
00007 #include "CmdMediator.h"
00008 #include "CmdSettingsCurveAddRemove.h"
00009 #include "CurveNameList.h"
00010 #include "DlgSettingsCurveAddRemove.h"
00011 #include "EngaugeAssert.h"
00012 #include "Logger.h"
00013 #include "MainWindow.h"
00014 #include <QCheckBox>
00015 #include <QDebug>
00016 #include <QGridLayout>
00017 #include <QLabel>
00018 #include <QListView>
00019 #include <QMessageBox>
00020 #include <QPushButton>
00021 #include <QSettings>
00022 #include <QSpacerItem>
00023 #include <QTableView>
00024 #include <QTextStream>
00025 #include "QtToString.h"
00026 #include "Settings.h"
00027 #include "SettingsForGraph.h"
00028
00029 const int MINIMUM_HEIGHT = 500;
00030
00031 DlgSettingsCurveAddRemove::DlgSettingsCurveAddRemove(MainWindow &mainWindow) :
00032 DlgSettingsAbstractBase (tr ("Curve Add/Remove"),
00033 "DlgSettingsCurveAddRemove",
00034 mainWindow),
00035 m_curveNameList (0)
00036 {
00037 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::DlgSettingsCurveAddRemove";
00038
00039 QWidget *subPanel = createSubPanel ();
00040 finishPanel (subPanel);
00041 }
00042
00043 DlgSettingsCurveAddRemove::~DlgSettingsCurveAddRemove()
00044 {
00045 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::~DlgSettingsCurveAddRemove";
00046 }
00047
00048 void DlgSettingsCurveAddRemove::appendCurveName (const QString &curveNameNew,
00049 const QString &curveNameOriginal,
00050 int numPoints)
00051 {
00052 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::appendCurveName"
00053 << " curve=" << curveNameNew.toLatin1().data();
00054
00055 ENGAUGE_CHECK_PTR (m_curveNameList);
00056
00057 int row = m_curveNameList->rowCount ();
00058 insertCurveName (row,
00059 curveNameNew,
00060 curveNameOriginal,
00061 numPoints);
00062 }
00063
00064 void DlgSettingsCurveAddRemove::createButtons (QGridLayout *layout,
00065 int &row)
00066 {
00067 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::createButtons";
00068
00069 m_btnAdd = new QPushButton (tr ("Add..."));
00070 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"
00071 "Every curve name must be unique"));
00072 m_btnAdd->setSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed);
00073 connect (m_btnAdd, SIGNAL (released ()), this, SLOT (slotNew()));
00074 layout->addWidget (m_btnAdd, row, 1, 1, 1, Qt::AlignLeft);
00075
00076 m_btnRemove = new QPushButton (tr ("Remove"));
00077 m_btnRemove->setWhatsThis (tr ("Removes the currently selected curve from the curve list.\n\n"
00078 "There must always be at least one curve"));
00079 m_btnRemove->setSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed);
00080 connect (m_btnRemove, SIGNAL (released ()), this, SLOT (slotRemove()));
00081 layout->addWidget (m_btnRemove, row++, 2, 1, 1, Qt::AlignRight);
00082 }
00083
00084 void DlgSettingsCurveAddRemove::createListCurves (QGridLayout *layout,
00085 int &row)
00086 {
00087 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::createListCurves";
00088
00089 QLabel *label = new QLabel (tr ("Curve Names:"));
00090 layout->addWidget (label, row++, 1);
00091
00092
00093 m_listCurves = new QListView;
00094 m_listCurves->setWhatsThis (tr ("List of the curves belonging to this document.\n\n"
00095 "Click on a curve name to edit it. Each curve name must be unique.\n\n"
00096 "Reorder curves by dragging them around."));
00097 m_listCurves->setMinimumHeight (200);
00098 m_listCurves->setSelectionBehavior (QAbstractItemView::SelectItems);
00099 m_listCurves->setDragDropOverwriteMode (false);
00100 m_listCurves->setSelectionMode (QAbstractItemView::SingleSelection);
00101 m_listCurves->setDefaultDropAction (Qt::MoveAction);
00102 m_listCurves->setDragDropOverwriteMode (false);
00103 m_listCurves->setDragEnabled (true);
00104 m_listCurves->setDropIndicatorShown (true);
00105 m_listCurves->setDragDropMode (QAbstractItemView::InternalMove);
00106 layout->addWidget (m_listCurves, row++, 1, 1, 2);
00107
00108 m_curveNameList = new CurveNameList;
00109 connect (m_curveNameList, SIGNAL (rowsAboutToBeRemoved (const QModelIndex &, int, int)),
00110 this, SLOT (slotRowsAboutToBeRemoved (const QModelIndex &, int, int)));
00111 connect (m_curveNameList, SIGNAL (dataChanged (const QModelIndex &, const QModelIndex &, const QVector<int> &)),
00112 this, SLOT (slotDataChanged (const QModelIndex &, const QModelIndex &, const QVector<int> &)));
00113
00114 m_listCurves->setModel (m_curveNameList);
00115 }
00116
00117 void DlgSettingsCurveAddRemove::createOptionalSaveDefault (QHBoxLayout *layout)
00118 {
00119 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::createOptionalSaveDefault";
00120
00121 m_btnSaveDefault = new QPushButton (tr ("Save As Default"));
00122 m_btnSaveDefault->setWhatsThis (tr ("Save the curve names for use as defaults for future graph curves."));
00123 connect (m_btnSaveDefault, SIGNAL (released ()), this, SLOT (slotSaveDefault ()));
00124 layout->addWidget (m_btnSaveDefault, 0, Qt::AlignLeft);
00125
00126 m_btnResetDefault = new QPushButton (tr ("Reset Default"));
00127 m_btnResetDefault->setWhatsThis (tr ("Reset the defaults for future graph curves to the original settings."));
00128 connect (m_btnResetDefault, SIGNAL (released ()), this, SLOT (slotResetDefault()));
00129 layout->addWidget (m_btnResetDefault, 0, Qt::AlignRight);
00130
00131 QSpacerItem *spacer = new QSpacerItem (40, 2);
00132 layout->addItem (spacer);
00133 }
00134
00135 QWidget *DlgSettingsCurveAddRemove::createSubPanel ()
00136 {
00137 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::createSubPanel";
00138
00139 const int EMPTY_COLUMN_WIDTH = 30;
00140
00141 QWidget *subPanel = new QWidget ();
00142 QGridLayout *layout = new QGridLayout (subPanel);
00143 subPanel->setLayout (layout);
00144
00145 int row = 1;
00146 createListCurves (layout, row);
00147 createButtons (layout, row);
00148
00149 layout->setColumnStretch (0, 0);
00150 layout->setColumnMinimumWidth (0, EMPTY_COLUMN_WIDTH);
00151 layout->setColumnStretch (1, 1);
00152 layout->setColumnStretch (2, 1);
00153 layout->setColumnStretch (3, 0);
00154 layout->setColumnMinimumWidth (3, EMPTY_COLUMN_WIDTH);
00155
00156 return subPanel;
00157 }
00158
00159 bool DlgSettingsCurveAddRemove::endsWithNumber (const QString &str) const
00160 {
00161 bool success = false;
00162
00163 if (!str.isEmpty ()) {
00164
00165 success = (str.right (1).at (0).digitValue() >= 0);
00166 }
00167
00168 return success;
00169 }
00170
00171 void DlgSettingsCurveAddRemove::handleOk ()
00172 {
00173 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::handleOk";
00174
00175 CmdSettingsCurveAddRemove *cmd = new CmdSettingsCurveAddRemove (mainWindow (),
00176 cmdMediator ().document(),
00177 *m_curveNameList);
00178 cmdMediator ().push (cmd);
00179
00180 hide ();
00181 }
00182
00183 void DlgSettingsCurveAddRemove::insertCurveName (int row,
00184 const QString &curveNameNew,
00185 const QString &curveNameOriginal,
00186 int numPoints)
00187 {
00188
00189 m_curveNameList->insertRow (row,
00190 curveNameNew,
00191 curveNameOriginal,
00192 numPoints);
00193 }
00194
00195 void DlgSettingsCurveAddRemove::load (CmdMediator &cmdMediator)
00196 {
00197 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::load";
00198
00199 setCmdMediator (cmdMediator);
00200
00201
00202 m_listCurves->reset ();
00203 m_curveNameList->reset ();
00204
00205 QStringList curveNames = cmdMediator.curvesGraphsNames ();
00206 QStringList::const_iterator itr;
00207 for (itr = curveNames.begin (); itr != curveNames.end (); itr++) {
00208 QString curveName = *itr;
00209 appendCurveName (curveName,
00210 curveName,
00211 cmdMediator.curvesGraphsNumPoints (curveName));
00212 }
00213
00214 selectCurveName (curveNames.first());
00215
00216 enableOk (false);
00217 }
00218
00219 int DlgSettingsCurveAddRemove::newRowFromSelection () const
00220 {
00221 int numSelectedItems = m_listCurves->selectionModel ()->selectedIndexes ().count ();
00222 int numItems = m_listCurves->model ()->rowCount ();
00223
00224
00225 int newRow = -1;
00226 if ((numSelectedItems == 0) &&
00227 (numItems > 0)) {
00228
00229
00230 newRow = numItems;
00231
00232 } else if (numSelectedItems == 1) {
00233
00234
00235 newRow = 1 + m_listCurves->selectionModel ()->selectedIndexes ().at (0).row ();
00236
00237 }
00238
00239 return newRow;
00240 }
00241
00242 QString DlgSettingsCurveAddRemove::nextCurveName () const
00243 {
00244 const QString DASH_ONE ("-1");
00245
00246 ENGAUGE_CHECK_PTR (m_listCurves);
00247
00248 int newRow = newRowFromSelection ();
00249 int numItems = m_listCurves->model ()->rowCount ();
00250
00251
00252 QString curveNameBefore, curveNameAfter;
00253 if (newRow > 0) {
00254
00255 QModelIndex index = m_curveNameList->index (newRow - 1, 0);
00256 curveNameBefore = m_curveNameList->data (index).toString ();
00257
00258 }
00259
00260 if ((0 <= newRow) && (newRow < numItems)) {
00261
00262 QModelIndex index = m_curveNameList->index (newRow, 0);
00263 curveNameAfter = m_curveNameList->data (index).toString ();
00264
00265 }
00266
00267
00268 QString curveNameNext;
00269 if (curveNameBefore.isEmpty () && !curveNameAfter.isEmpty () && endsWithNumber (curveNameAfter)) {
00270
00271
00272 int numberAfter = numberAtEnd (curveNameAfter);
00273 int numberNew = numberAfter - 1;
00274 int pos = curveNameAfter.lastIndexOf (QString::number (numberAfter));
00275 if (pos >= 0) {
00276
00277 curveNameNext = QString ("%1%2")
00278 .arg (curveNameAfter.left (pos))
00279 .arg (numberNew);
00280
00281 } else {
00282
00283 curveNameNext = curveNameAfter;
00284
00285 }
00286
00287 } else if (curveNameBefore.isEmpty ()) {
00288
00289 curveNameNext = DEFAULT_GRAPH_CURVE_NAME;
00290
00291 } else {
00292
00293 curveNameNext = curveNameBefore;
00294
00295 if (endsWithNumber (curveNameBefore)) {
00296
00297
00298 int numberBefore = numberAtEnd (curveNameBefore);
00299 int numberNew = numberBefore + 1;
00300 int pos = curveNameBefore.lastIndexOf (QString::number (numberBefore));
00301 if (pos >= 0) {
00302
00303 curveNameNext = QString ("%1%2")
00304 .arg (curveNameBefore.left (pos))
00305 .arg (numberNew);
00306 if (curveNameNext == curveNameAfter) {
00307
00308
00309 curveNameNext = QString ("%1%2")
00310 .arg (curveNameBefore)
00311 .arg (DASH_ONE);
00312 }
00313 }
00314 }
00315 }
00316
00317
00318 SettingsForGraph settingsForGraph;
00319 int indexOneBasedNext = numItems + 1;
00320 curveNameNext = settingsForGraph.defaultCurveName (indexOneBasedNext,
00321 curveNameNext);
00322
00323
00324
00325
00326 while (m_curveNameList->containsCurveNameCurrent (curveNameNext)) {
00327 curveNameNext += DASH_ONE;
00328 }
00329
00330 return curveNameNext;
00331 }
00332
00333 int DlgSettingsCurveAddRemove::numberAtEnd (const QString &str) const
00334 {
00335 ENGAUGE_ASSERT (endsWithNumber (str));
00336
00337
00338 int sign = +1;
00339 int ch = str.size () - 1;
00340 while (str.at (ch).digitValue() >= 0) {
00341 --ch;
00342
00343 if (ch < 0) {
00344 break;
00345 }
00346 }
00347 ++ch;
00348
00349 return sign * str.mid (ch).toInt ();
00350 }
00351
00352 unsigned int DlgSettingsCurveAddRemove::numPointsForSelectedCurves () const
00353 {
00354 QList<unsigned int > rowsSelected;
00355
00356
00357 for (int i = 0; i < m_listCurves->selectionModel()->selectedIndexes ().count (); i++) {
00358
00359 int row = m_listCurves->selectionModel()->selectedIndexes ().at (i).row ();
00360 rowsSelected << row;
00361 }
00362
00363 return m_curveNameList->numPointsForSelectedCurves (rowsSelected);
00364 }
00365
00366 void DlgSettingsCurveAddRemove::printStream(QTextStream &str) const
00367 {
00368 str << m_curveNameList->currentCurvesAsString();
00369 }
00370
00371 void DlgSettingsCurveAddRemove::removeSelectedCurves ()
00372 {
00373 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::removeSelectedCurves";
00374
00375 ENGAUGE_ASSERT (m_listCurves->selectionModel ()->selectedIndexes ().count () > 0);
00376
00377
00378 QString firstCurveAfter;
00379 for (int row = m_listCurves->model()->rowCount() - 1; row >= 0; row--) {
00380
00381 QModelIndex indexCurrent = m_listCurves->model()->index(row, CURVE_NAME_LIST_COLUMN_CURRENT);
00382 if (indexCurrent == m_listCurves->selectionModel()->selectedIndexes().last()) {
00383
00384
00385 break;
00386 }
00387
00388 firstCurveAfter = indexCurrent.data().toString();
00389 }
00390
00391
00392 for (int i = m_listCurves->selectionModel ()->selectedIndexes ().count () - 1; i >= 0; i--) {
00393
00394 int row = m_listCurves->selectionModel ()->selectedIndexes ().at (i).row ();
00395
00396 m_curveNameList->removeRow (row);
00397 }
00398
00399 if (firstCurveAfter.isEmpty ()) {
00400
00401
00402 int numItems = m_listCurves->model()->rowCount();
00403 QModelIndex indexLast = m_listCurves->model()->index (numItems - 1, CURVE_NAME_LIST_COLUMN_CURRENT);
00404 firstCurveAfter = m_listCurves->model()->data (indexLast).toString();
00405
00406 }
00407
00408
00409 selectCurveName(firstCurveAfter);
00410 }
00411
00412 void DlgSettingsCurveAddRemove::selectCurveName (const QString &curveWanted)
00413 {
00414 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::selectCurveName"
00415 << " curve=" << curveWanted.toLatin1().data();
00416
00417 for (int row = 0; row < m_listCurves->model()->rowCount(); row++) {
00418
00419 QModelIndex index = m_listCurves->model()->index (row, CURVE_NAME_LIST_COLUMN_CURRENT);
00420 QString curveGot = index.data ().toString ();
00421
00422 if (curveWanted == curveGot) {
00423
00424
00425 m_listCurves->setCurrentIndex (index);
00426 break;
00427
00428 }
00429 }
00430 }
00431
00432 void DlgSettingsCurveAddRemove::setSmallDialogs(bool smallDialogs)
00433 {
00434 if (!smallDialogs) {
00435 setMinimumHeight (MINIMUM_HEIGHT);
00436 }
00437 }
00438
00439 void DlgSettingsCurveAddRemove::slotDataChanged (const QModelIndex &topLeft,
00440 const QModelIndex &bottomRight,
00441 const QVector<int> &roles)
00442 {
00443
00444
00445
00446 QString curveEntries;
00447 QTextStream str (&curveEntries);
00448 printStream (str);
00449
00450 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::slotDataChanged"
00451 << " topLeft=(" << topLeft.row () << "," << topLeft.column () << ")"
00452 << " bottomRight=(" << bottomRight.row () << "," << bottomRight.column () << ")"
00453 << " roles=" << rolesAsString (roles).toLatin1 ().data ()
00454 << " defaultDragOption=" << (m_listCurves->defaultDropAction() == Qt::MoveAction ? "MoveAction" : "CopyAction")
00455 << " curveEntries=(" << curveEntries.toLatin1().data() << ")";
00456
00457 updateControls ();
00458 }
00459
00460 void DlgSettingsCurveAddRemove::slotRowsAboutToBeRemoved (const QModelIndex &parent,
00461 int rowFirst,
00462 int rowLast)
00463 {
00464 LOG4CPP_DEBUG_S ((*mainCat)) << "DlgSettingsCurveAddRemove::slotRowsAboutToBeRemoved"
00465 << " parentValid=" << (parent.isValid() ? "yes" : "no")
00466 << " rowFirst=" << rowFirst
00467 << " rowLast=" << rowLast;
00468
00469 updateControls ();
00470 }
00471
00472 void DlgSettingsCurveAddRemove::slotNew ()
00473 {
00474 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::slotNew";
00475
00476 const QString NO_ORIGINAL_CURVE_NAME;
00477 const int NO_POINTS = 0;
00478
00479 QString curveNameSuggestion = nextCurveName ();
00480
00481 int row = newRowFromSelection();
00482
00483 insertCurveName (row,
00484 curveNameSuggestion,
00485 NO_ORIGINAL_CURVE_NAME,
00486 NO_POINTS);
00487
00488 selectCurveName (curveNameSuggestion);
00489
00490 updateControls();
00491 }
00492
00493 void DlgSettingsCurveAddRemove::slotRemove ()
00494 {
00495 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::slotRemove";
00496
00497
00498 int numPoints = numPointsForSelectedCurves ();
00499
00500 int rtn = QMessageBox::Ok;
00501 if (numPoints > 0) {
00502
00503 QString msg;
00504 if (m_listCurves->selectionModel ()->selectedIndexes ().count () == 1) {
00505 msg = QString ("%1 %2 %3")
00506 .arg (tr ("Removing this curve will also remove"))
00507 .arg (numPoints)
00508 .arg (tr ("points. Continue?"));
00509 } else {
00510 msg = QString ("%1 %2 %3")
00511 .arg (tr ("Removing these curves will also remove"))
00512 .arg (numPoints)
00513 .arg (tr ("points. Continue?"));
00514 }
00515
00516 rtn = QMessageBox::warning (0,
00517 tr ("Curves With Points"),
00518 msg,
00519 QMessageBox::Ok,
00520 QMessageBox::Cancel);
00521 }
00522
00523 if (rtn == QMessageBox::Ok) {
00524 removeSelectedCurves ();
00525 }
00526
00527 updateControls();
00528 }
00529
00530 void DlgSettingsCurveAddRemove::slotResetDefault()
00531 {
00532 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::slotResetDefault";
00533
00534 const QString REMOVE_ALL_SETTINGS_IN_GROUP;
00535
00536 QSettings settings (SETTINGS_ENGAUGE, SETTINGS_DIGITIZER);
00537
00538 int indexOneBased = 1;
00539
00540 SettingsForGraph settingsForGraph;
00541 QString groupName = settingsForGraph.groupNameForNthCurve (indexOneBased);
00542 while (settings.childGroups().contains (groupName)) {
00543
00544 settings.beginGroup (groupName);
00545 settings.remove (REMOVE_ALL_SETTINGS_IN_GROUP);
00546 settings.endGroup ();
00547
00548 ++indexOneBased;
00549 groupName = settingsForGraph.groupNameForNthCurve (indexOneBased);
00550 }
00551 }
00552
00553 void DlgSettingsCurveAddRemove::slotSaveDefault()
00554 {
00555 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::slotSaveDefault";
00556
00557 QSettings settings (SETTINGS_ENGAUGE, SETTINGS_DIGITIZER);
00558
00559 for (int row = 0; row < m_curveNameList->rowCount (); row++) {
00560
00561 QModelIndex idxCurrent = m_curveNameList->index (row, 0);
00562
00563 QString curveNameCurrent = m_curveNameList->data (idxCurrent).toString ();
00564
00565 int indexOneBased = row + 1;
00566
00567 SettingsForGraph settingsForGraph;
00568 QString groupName = settingsForGraph.groupNameForNthCurve (indexOneBased);
00569
00570 settings.beginGroup (groupName);
00571 settings.setValue (SETTINGS_CURVE_NAME,
00572 curveNameCurrent);
00573 settings.endGroup ();
00574 }
00575 }
00576
00577 void DlgSettingsCurveAddRemove::updateControls ()
00578 {
00579 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::updateControls";
00580
00581 enableOk (true);
00582
00583 ENGAUGE_CHECK_PTR (m_listCurves);
00584
00585 int numSelectedItems = m_listCurves->selectionModel ()->selectedIndexes ().count ();
00586 int numItems = m_curveNameList->rowCount ();
00587
00588
00589 m_btnRemove->setEnabled ((numSelectedItems > 0) && (numSelectedItems < numItems));
00590 }