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