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 "QtToString.h"
00024 #include "Settings.h"
00025 #include "SettingsForGraph.h"
00026
00027 DlgSettingsCurveAddRemove::DlgSettingsCurveAddRemove(MainWindow &mainWindow) :
00028 DlgSettingsAbstractBase (tr ("Curve Add/Remove"),
00029 "DlgSettingsCurveAddRemove",
00030 mainWindow)
00031 {
00032 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::DlgSettingsCurveAddRemove";
00033
00034 QWidget *subPanel = createSubPanel ();
00035 finishPanel (subPanel);
00036 }
00037
00038 DlgSettingsCurveAddRemove::~DlgSettingsCurveAddRemove()
00039 {
00040 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::~DlgSettingsCurveAddRemove";
00041 }
00042
00043 void DlgSettingsCurveAddRemove::appendCurveName (const QString &curveNameNew,
00044 const QString &curveNameOriginal,
00045 int numPoints)
00046 {
00047 ENGAUGE_CHECK_PTR (m_curveNameList);
00048
00049 int row = m_curveNameList->rowCount ();
00050 insertCurveName (row,
00051 curveNameNew,
00052 curveNameOriginal,
00053 numPoints);
00054 }
00055
00056 void DlgSettingsCurveAddRemove::createButtons (QGridLayout *layout,
00057 int &row)
00058 {
00059 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::createButtons";
00060
00061 m_btnAdd = new QPushButton (tr ("Add..."));
00062 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"
00063 "Every curve name must be unique"));
00064 m_btnAdd->setSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed);
00065 connect (m_btnAdd, SIGNAL (released ()), this, SLOT (slotNew()));
00066 layout->addWidget (m_btnAdd, row, 1, 1, 1, Qt::AlignLeft);
00067
00068 m_btnRemove = new QPushButton (tr ("Remove"));
00069 m_btnRemove->setWhatsThis (tr ("Removes the currently selected curve from the curve list.\n\n"
00070 "There must always be at least one curve"));
00071 m_btnRemove->setSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed);
00072 connect (m_btnRemove, SIGNAL (released ()), this, SLOT (slotRemove()));
00073 layout->addWidget (m_btnRemove, row++, 2, 1, 1, Qt::AlignRight);
00074 }
00075
00076 void DlgSettingsCurveAddRemove::createListCurves (QGridLayout *layout,
00077 int &row)
00078 {
00079 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::createListCurves";
00080
00081 QLabel *label = new QLabel (tr ("Curve Names:"));
00082 layout->addWidget (label, row++, 1);
00083
00084 m_curveNameList = new CurveNameList;
00085
00086
00087 m_listCurves = new QListView;
00088 m_listCurves->setWhatsThis (tr ("List of the curves belonging to this document.\n\n"
00089 "Click on a curve name to edit it. Each curve name must be unique.\n\n"
00090 "Reorder curves by dragging them around."));
00091 m_listCurves->setMinimumHeight (200);
00092 m_listCurves->setSelectionMode (QAbstractItemView::ExtendedSelection);
00093 m_listCurves->setDefaultDropAction (Qt::MoveAction);
00094 m_listCurves->setDragDropOverwriteMode (true);
00095 m_listCurves->setDragEnabled (true);
00096 m_listCurves->setDropIndicatorShown (true);
00097 m_listCurves->setDragDropMode (QAbstractItemView::InternalMove);
00098 m_listCurves->setViewMode (QListView::ListMode);
00099 m_listCurves->setMovement (QListView::Snap);
00100 m_listCurves->setModel (m_curveNameList);
00101 layout->addWidget (m_listCurves, row++, 1, 1, 2);
00102 connect (m_curveNameList, SIGNAL (dataChanged (const QModelIndex &, const QModelIndex &, const QVector<int> &)),
00103 this, SLOT (slotDataChanged (const QModelIndex &, const QModelIndex &, const QVector<int> &)));
00104 connect (m_listCurves->selectionModel (), SIGNAL (selectionChanged (QItemSelection, QItemSelection)),
00105 this, SLOT (slotSelectionChanged (QItemSelection, QItemSelection)));
00106 }
00107
00108 void DlgSettingsCurveAddRemove::createOptionalSaveDefault (QHBoxLayout *layout)
00109 {
00110 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::createOptionalSaveDefault";
00111
00112 m_btnSaveDefault = new QPushButton (tr ("Save As Default"));
00113 m_btnSaveDefault->setWhatsThis (tr ("Save the curve names for use as defaults for future graph curves."));
00114 connect (m_btnSaveDefault, SIGNAL (released ()), this, SLOT (slotSaveDefault ()));
00115 layout->addWidget (m_btnSaveDefault, 0, Qt::AlignLeft);
00116
00117 QSpacerItem *spacer = new QSpacerItem (40, 2);
00118 layout->addItem (spacer);
00119 }
00120
00121 QWidget *DlgSettingsCurveAddRemove::createSubPanel ()
00122 {
00123 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::createSubPanel";
00124
00125 const int EMPTY_COLUMN_WIDTH = 30;
00126
00127 QWidget *subPanel = new QWidget ();
00128 QGridLayout *layout = new QGridLayout (subPanel);
00129 subPanel->setLayout (layout);
00130
00131 int row = 1;
00132 createListCurves (layout, row);
00133 createButtons (layout, row);
00134
00135 layout->setColumnStretch (0, 0);
00136 layout->setColumnMinimumWidth (0, EMPTY_COLUMN_WIDTH);
00137 layout->setColumnStretch (1, 1);
00138 layout->setColumnStretch (2, 1);
00139 layout->setColumnStretch (3, 0);
00140 layout->setColumnMinimumWidth (3, EMPTY_COLUMN_WIDTH);
00141
00142 return subPanel;
00143 }
00144
00145 bool DlgSettingsCurveAddRemove::endsWithNumber (const QString &str) const
00146 {
00147 bool success = false;
00148
00149 if (!str.isEmpty ()) {
00150
00151 success = (str.right (1).at (0).digitValue() >= 0);
00152 }
00153
00154 return success;
00155 }
00156
00157 void DlgSettingsCurveAddRemove::handleOk ()
00158 {
00159 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::handleOk";
00160
00161 CmdSettingsCurveAddRemove *cmd = new CmdSettingsCurveAddRemove (mainWindow (),
00162 cmdMediator ().document(),
00163 *m_curveNameList);
00164 cmdMediator ().push (cmd);
00165
00166 hide ();
00167 }
00168
00169 void DlgSettingsCurveAddRemove::insertCurveName (int row,
00170 const QString &curveNameNew,
00171 const QString &curveNameOriginal,
00172 int numPoints)
00173 {
00174 if (m_curveNameList->insertRow (row)) {
00175
00176 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::insertCurveName curveName=" << curveNameNew.toLatin1 ().data ();
00177
00178 CurveNameListEntry curvesEntry (curveNameNew,
00179 curveNameOriginal,
00180 numPoints);
00181
00182 m_curveNameList->setData (m_curveNameList->index (row, 0),
00183 curvesEntry.curveNameCurrent ());
00184 m_curveNameList->setData (m_curveNameList->index (row, 1),
00185 curvesEntry.curveNameOriginal ());
00186 m_curveNameList->setData (m_curveNameList->index (row, 2),
00187 numPoints);
00188
00189 } else {
00190
00191 LOG4CPP_ERROR_S ((*mainCat)) << "DlgSettingsCurveAddRemove::insertCurveName failed curveName="
00192 << curveNameNew.toLatin1 ().data ();
00193
00194 }
00195 }
00196
00197 void DlgSettingsCurveAddRemove::load (CmdMediator &cmdMediator)
00198 {
00199 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::load";
00200
00201 setCmdMediator (cmdMediator);
00202
00203
00204 while (m_curveNameList->rowCount () > 0) {
00205 m_curveNameList->removeRow (0);
00206 }
00207
00208 QStringList curveNames = cmdMediator.curvesGraphsNames ();
00209 QStringList::const_iterator itr;
00210 for (itr = curveNames.begin (); itr != curveNames.end (); itr++) {
00211 QString curveName = *itr;
00212 appendCurveName (curveName,
00213 curveName,
00214 cmdMediator.curvesGraphsNumPoints (curveName));
00215 }
00216
00217 enableOk (false);
00218 }
00219
00220 QString DlgSettingsCurveAddRemove::nextCurveName () const
00221 {
00222 const QString DASH_ONE ("-1");
00223
00224 ENGAUGE_CHECK_PTR (m_listCurves);
00225
00226 int numSelectedItems = m_listCurves->selectionModel ()->selectedIndexes ().count ();
00227 int numItems = m_listCurves->model ()->rowCount ();
00228
00229
00230 int currentIndex = -1;
00231 if ((numSelectedItems == 0) &&
00232 (numItems > 0)) {
00233
00234
00235 currentIndex = numItems;
00236
00237 } else if (numSelectedItems == 1) {
00238
00239
00240 currentIndex = m_listCurves->selectionModel ()->selectedIndexes ().at (0).row ();
00241
00242 }
00243
00244
00245 QString curveNameBefore, curveNameAfter;
00246 if (currentIndex > 0) {
00247
00248 QModelIndex index = m_curveNameList->index (currentIndex - 1, 0);
00249 curveNameBefore = m_curveNameList->data (index).toString ();
00250
00251 }
00252
00253 if ((0 <= currentIndex) && (currentIndex < numItems)) {
00254
00255 QModelIndex index = m_curveNameList->index (currentIndex, 0);
00256 curveNameAfter = m_curveNameList->data (index).toString ();
00257
00258 }
00259
00260
00261 QString curveNameNext;
00262 if (curveNameBefore.isEmpty () && !curveNameAfter.isEmpty () && endsWithNumber (curveNameAfter)) {
00263
00264
00265 int numberAfter = numberAtEnd (curveNameAfter);
00266 int numberNew = numberAfter - 1;
00267 int pos = curveNameAfter.lastIndexOf (QString::number (numberAfter));
00268 if (pos >= 0) {
00269
00270 curveNameNext = QString ("%1%2")
00271 .arg (curveNameAfter.left (pos))
00272 .arg (numberNew);
00273
00274 } else {
00275
00276 curveNameNext = curveNameAfter;
00277
00278 }
00279
00280 } else if (curveNameBefore.isEmpty ()) {
00281
00282 curveNameNext = DEFAULT_GRAPH_CURVE_NAME;
00283
00284 } else {
00285
00286 curveNameNext = curveNameBefore;
00287
00288 if (endsWithNumber (curveNameBefore)) {
00289
00290
00291 int numberBefore = numberAtEnd (curveNameBefore);
00292 int numberNew = numberBefore + 1;
00293 int pos = curveNameBefore.lastIndexOf (QString::number (numberBefore));
00294 if (pos >= 0) {
00295
00296 curveNameNext = QString ("%1%2")
00297 .arg (curveNameBefore.left (pos))
00298 .arg (numberNew);
00299 if (curveNameNext == curveNameAfter) {
00300
00301
00302 curveNameNext = QString ("%1%2")
00303 .arg (curveNameBefore)
00304 .arg (DASH_ONE);
00305 }
00306 }
00307 }
00308 }
00309
00310
00311 SettingsForGraph settingsForGraph;
00312 int indexOneBasedNext = numItems + 1;
00313 curveNameNext = settingsForGraph.defaultCurveName (indexOneBasedNext,
00314 curveNameNext);
00315
00316
00317
00318
00319 while (m_curveNameList->containsCurveNameCurrent (curveNameNext)) {
00320 curveNameNext += DASH_ONE;
00321 }
00322
00323 return curveNameNext;
00324 }
00325
00326 int DlgSettingsCurveAddRemove::numberAtEnd (const QString &str) const
00327 {
00328 ENGAUGE_ASSERT (endsWithNumber (str));
00329
00330
00331 int sign = +1;
00332 int ch = str.size () - 1;
00333 while (str.at (ch).digitValue() >= 0) {
00334 --ch;
00335
00336 if (ch < 0) {
00337 break;
00338 }
00339 }
00340 ++ch;
00341
00342 return sign * str.mid (ch).toInt ();
00343 }
00344
00345 void DlgSettingsCurveAddRemove::removeSelectedCurves ()
00346 {
00347 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::removeSelectedCurves";
00348
00349 for (int i = m_listCurves->selectionModel ()->selectedIndexes ().count () - 1; i >= 0; i--) {
00350
00351 int row = m_listCurves->selectionModel ()->selectedIndexes ().at (i).row ();
00352
00353 m_curveNameList->removeRow (row);
00354 }
00355 }
00356
00357 void DlgSettingsCurveAddRemove::slotDataChanged (const QModelIndex &topLeft,
00358 const QModelIndex &bottomRight,
00359 const QVector<int> &roles)
00360 {
00361 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::slotDataChanged"
00362 << " topLeft=(" << topLeft.row () << "," << topLeft.column () << ")"
00363 << " bottomRight=(" << bottomRight.row () << "," << bottomRight.column () << ")"
00364 << " roles=" << rolesAsString (roles).toLatin1 ().data ();
00365
00366 updateControls ();
00367 }
00368
00369 void DlgSettingsCurveAddRemove::slotNew ()
00370 {
00371 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::slotNew";
00372
00373 const QString NO_ORIGINAL_CURVE_NAME;
00374 const int NO_POINTS = 0;
00375
00376 QString curveNameSuggestion = nextCurveName ();
00377
00378 appendCurveName (curveNameSuggestion,
00379 NO_ORIGINAL_CURVE_NAME,
00380 NO_POINTS);
00381
00382 updateControls();
00383 }
00384
00385 void DlgSettingsCurveAddRemove::slotRemove ()
00386 {
00387 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::slotRemove";
00388
00389 int numPoints = 0;
00390 for (int i = 0; i < m_listCurves->selectionModel ()->selectedIndexes ().count (); i++) {
00391
00392 int row = m_listCurves->selectionModel ()->selectedIndexes ().at (i).row ();
00393 QModelIndex idx = m_curveNameList->index (row, CurveNameListEntry::COL_NUM_POINTS ());
00394 int curvePoints = m_curveNameList->data (idx, Qt::DisplayRole).toInt ();
00395
00396 numPoints += curvePoints;
00397 }
00398
00399 int rtn = QMessageBox::Ok;
00400 if (numPoints > 0) {
00401
00402 QString msg;
00403 if (m_listCurves->selectionModel ()->selectedIndexes ().count () == 1) {
00404 msg = QString ("%1 %2 %3")
00405 .arg (tr ("Removing this curve will also remove"))
00406 .arg (numPoints)
00407 .arg (tr ("points. Continue?"));
00408 } else {
00409 msg = QString ("%1 %2 %3")
00410 .arg (tr ("Removing these curves will also remove"))
00411 .arg (numPoints)
00412 .arg (tr ("points. Continue?"));
00413 }
00414
00415 rtn = QMessageBox::warning (0,
00416 tr ("Curves With Points"),
00417 msg,
00418 QMessageBox::Ok,
00419 QMessageBox::Cancel);
00420 }
00421
00422 if (rtn == QMessageBox::Ok) {
00423 removeSelectedCurves ();
00424 }
00425
00426 updateControls();
00427 }
00428
00429 void DlgSettingsCurveAddRemove::slotSaveDefault()
00430 {
00431 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::slotSaveDefault";
00432
00433 QSettings settings (SETTINGS_ENGAUGE, SETTINGS_DIGITIZER);
00434
00435 for (int row = 0; row < m_curveNameList->rowCount (); row++) {
00436
00437 QModelIndex idxCurrent = m_curveNameList->index (row, 0);
00438
00439 QString curveNameCurrent = m_curveNameList->data (idxCurrent).toString ();
00440
00441 int indexOneBased = row + 1;
00442
00443 SettingsForGraph settingsForGraph;
00444 QString groupName = settingsForGraph.groupNameForNthCurve (indexOneBased);
00445
00446 settings.beginGroup (groupName);
00447 settings.setValue (SETTINGS_CURVE_NAME,
00448 curveNameCurrent);
00449 settings.endGroup ();
00450 }
00451 }
00452
00453 void DlgSettingsCurveAddRemove::slotSelectionChanged (QItemSelection, QItemSelection)
00454 {
00455 updateControls ();
00456 }
00457
00458 void DlgSettingsCurveAddRemove::updateControls ()
00459 {
00460 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsCurveAddRemove::updateControls";
00461
00462 enableOk (true);
00463
00464 ENGAUGE_CHECK_PTR (m_listCurves);
00465
00466 int numSelectedItems = m_listCurves->selectionModel ()->selectedIndexes ().count ();
00467 int numItems = m_curveNameList->rowCount ();
00468
00469
00470 m_btnRemove->setEnabled ((numSelectedItems > 0) && (numSelectedItems < numItems));
00471 }