1 /******************************************************************************************************
2  * (C) 2014 markummitchell@github.com. This file is part of Engauge Digitizer, which is released      *
3  * under GNU General Public License version 2 (GPLv2) or (at your option) any later version. See file *
4  * LICENSE or go to gnu.org/licenses for details. Distribution requires prior written permission.     *
5  ******************************************************************************************************/
6 
7 #include "CmdMediator.h"
8 #include "CmdSettingsGridRemoval.h"
9 #include "DlgSettingsGridRemoval.h"
10 #include "EngaugeAssert.h"
11 #include "GridInitializer.h"
12 #include "GridRemoval.h"
13 #include "Logger.h"
14 #include "MainWindow.h"
15 #include <QCheckBox>
16 #include <QComboBox>
17 #include <QDoubleValidator>
18 #include <QGraphicsScene>
19 #include <QGridLayout>
20 #include <QGroupBox>
21 #include <QHBoxLayout>
22 #include <QLabel>
23 #include <QLineEdit>
24 #include <QPixmap>
25 #include "ViewPreview.h"
26 
27 const double CLOSE_DISTANCE_MAX = 64;
28 const double CLOSE_DISTANCE_MIN = 0;
29 const int CLOSE_DECIMALS = 1;
30 const int COUNT_MIN = 1;
31 const int COUNT_MAX = 100;
32 const int COUNT_DECIMALS = 0;
33 const int MINIMUM_HEIGHT = 520;
34 
DlgSettingsGridRemoval(MainWindow & mainWindow)35 DlgSettingsGridRemoval::DlgSettingsGridRemoval(MainWindow &mainWindow) :
36   DlgSettingsAbstractBase (tr ("Grid Removal"),
37                            "DlgSettingsGridRemoval",
38                            mainWindow),
39   m_validatorCloseDistance (nullptr),
40   m_validatorCountX (nullptr),
41   m_validatorStartX (nullptr),
42   m_validatorStepX (nullptr),
43   m_validatorStopX (nullptr),
44   m_validatorCountY (nullptr),
45   m_validatorStartY (nullptr),
46   m_validatorStepY (nullptr),
47   m_validatorStopY (nullptr),
48   m_scenePreview (nullptr),
49   m_viewPreview (nullptr),
50   m_modelGridRemovalBefore (nullptr),
51   m_modelGridRemovalAfter (nullptr)
52 {
53   LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsGridRemoval::DlgSettingsGridRemoval";
54 
55   QWidget *subPanel = createSubPanel ();
56   finishPanel (subPanel);
57 }
58 
~DlgSettingsGridRemoval()59 DlgSettingsGridRemoval::~DlgSettingsGridRemoval()
60 {
61   LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsGridRemoval::~DlgSettingsGridRemoval";
62 
63   delete m_validatorCloseDistance;
64   delete m_validatorCountX;
65   delete m_validatorStartX;
66   delete m_validatorStepX;
67   delete m_validatorStopX;
68   delete m_validatorCountY;
69   delete m_validatorStartY;
70   delete m_validatorStepY;
71   delete m_validatorStopY;
72 }
73 
createOptionalSaveDefault(QHBoxLayout *)74 void DlgSettingsGridRemoval::createOptionalSaveDefault (QHBoxLayout * /* layout */)
75 {
76 }
77 
createPreview(QGridLayout * layout,int & row)78 void DlgSettingsGridRemoval::createPreview (QGridLayout *layout, int &row)
79 {
80   LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsGridRemoval::createPreview";
81 
82   QLabel *labelPreview = new QLabel (tr ("Preview"));
83   layout->addWidget (labelPreview, row++, 0, 1, 5);
84 
85   m_scenePreview = new QGraphicsScene (this);
86   m_viewPreview = new ViewPreview (m_scenePreview,
87                                    ViewPreview::VIEW_ASPECT_RATIO_VARIABLE,
88                                    this);
89   m_viewPreview->setWhatsThis (tr ("Preview window that shows how current settings affect grid removal"));
90   m_viewPreview->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
91   m_viewPreview->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
92   m_viewPreview->setMinimumHeight (MINIMUM_PREVIEW_HEIGHT);
93   layout->addWidget (m_viewPreview, row++, 0, 1, 5);
94 }
95 
createRemoveGridLines(QGridLayout * layout,int & row)96 void DlgSettingsGridRemoval::createRemoveGridLines (QGridLayout *layout, int &row)
97 {
98   LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsGridRemoval::createRemoveGridLines";
99 
100   m_chkRemoveGridLines = new QCheckBox (tr ("Remove pixels close to defined grid lines"));
101   m_chkRemoveGridLines->setWhatsThis (tr ("Check this box to have pixels close to regularly spaced gridlines removed.\n\n"
102                                           "This option is only available when the axis points have all been defined."));
103   connect (m_chkRemoveGridLines, SIGNAL (stateChanged (int)), this, SLOT (slotRemoveGridLines (int)));
104   layout->addWidget (m_chkRemoveGridLines, row++, 1, 1, 3);
105 
106   QLabel *labelCloseDistance = new QLabel (QString ("%1:").arg (tr ("Close distance (pixels)")));
107   layout->addWidget (labelCloseDistance, row, 2);
108 
109   m_editCloseDistance = new QLineEdit;
110   m_editCloseDistance->setWhatsThis (tr ("Set closeness distance in pixels.\n\n"
111                                          "Pixels that are closer to the regularly spaced gridlines, than this distance, "
112                                          "will be removed.\n\n"
113                                          "This value cannot be negative. A zero value disables this feature. Decimal values are allowed"));
114   m_validatorCloseDistance = new QDoubleValidator (CLOSE_DISTANCE_MIN, CLOSE_DISTANCE_MAX, CLOSE_DECIMALS);
115   m_editCloseDistance->setValidator (m_validatorCloseDistance);
116   connect (m_editCloseDistance, SIGNAL (textChanged (const QString &)), this, SLOT (slotCloseDistance (const QString &)));
117   layout->addWidget (m_editCloseDistance, row++, 3);
118 
119   createRemoveGridLinesX (layout, row);
120   createRemoveGridLinesY (layout, row);
121 }
122 
createRemoveGridLinesX(QGridLayout * layout,int & row)123 void DlgSettingsGridRemoval::createRemoveGridLinesX (QGridLayout *layout, int &row)
124 {
125   LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsGridRemoval::createRemoveGridLinesX";
126 
127   QString titleX = tr ("X Grid Lines");
128   if (false) {
129     titleX = QString (QChar (0x98, 0x03)) + QString (" %1").arg (tr ("Grid Lines"));
130   }
131   QGroupBox *groupX = new QGroupBox (titleX);
132   layout->addWidget (groupX, row, 2);
133 
134   QGridLayout *layoutGroup = new QGridLayout;
135   groupX->setLayout (layoutGroup);
136 
137   QLabel *labelDisable = new QLabel (QString ("%1:").arg (tr ("Disable")));
138   layoutGroup->addWidget (labelDisable, 0, 0);
139 
140   m_cmbDisableX = new QComboBox;
141   m_cmbDisableX->setWhatsThis (tr ("Disabled value.\n\n"
142                                    "The X grid lines are specified using only three values at a time. For flexibility, four values "
143                                    "are offered so you must chose which value is disabled. Once disabled, that value is simply "
144                                    "updated as the other values change"));
145   m_cmbDisableX->addItem(gridCoordDisableToString (GRID_COORD_DISABLE_COUNT),
146                          QVariant (GRID_COORD_DISABLE_COUNT));
147   m_cmbDisableX->addItem(gridCoordDisableToString (GRID_COORD_DISABLE_START),
148                          QVariant (GRID_COORD_DISABLE_START));
149   m_cmbDisableX->addItem(gridCoordDisableToString (GRID_COORD_DISABLE_STEP),
150                          QVariant (GRID_COORD_DISABLE_STEP));
151   m_cmbDisableX->addItem(gridCoordDisableToString (GRID_COORD_DISABLE_STOP),
152                          QVariant (GRID_COORD_DISABLE_STOP));
153   connect (m_cmbDisableX, SIGNAL (activated (const QString &)), this, SLOT (slotDisableX (const QString &))); // activated() ignores code changes
154   layoutGroup->addWidget (m_cmbDisableX, 0, 1);
155 
156   QLabel *labelCount = new QLabel (QString ("%1:").arg (tr ("Count")));
157   layoutGroup->addWidget (labelCount, 1, 0);
158 
159   m_editCountX = new QLineEdit;
160   m_editCountX->setWhatsThis (tr ("Number of X grid lines.\n\n"
161                                   "The number of X grid lines must be entered as an integer greater than zero"));
162   m_validatorCountX = new QDoubleValidator (COUNT_MIN, COUNT_MAX, COUNT_DECIMALS);
163   m_editCountX->setValidator (m_validatorCountX);
164   connect (m_editCountX, SIGNAL (textChanged (const QString &)), this, SLOT  (slotCountX (const QString &)));
165   layoutGroup->addWidget (m_editCountX, 1, 1);
166 
167   QLabel *labelStart = new QLabel (QString ("%1:").arg (tr ("Start")));
168   layoutGroup->addWidget (labelStart, 2, 0);
169 
170   m_editStartX = new QLineEdit;
171   m_editStartX->setWhatsThis (tr ("Value of the first X grid line.\n\n"
172                                   "The start value cannot be greater than the stop value"));
173   m_validatorStartX = new QDoubleValidator;
174   m_editStartX->setValidator (m_validatorStartX);
175   connect (m_editStartX, SIGNAL (textChanged (const QString &)), this, SLOT  (slotStartX (const QString &)));
176   layoutGroup->addWidget (m_editStartX, 2, 1);
177 
178   QLabel *labelStep = new QLabel (QString ("%1:").arg (tr ("Step")));
179   layoutGroup->addWidget (labelStep, 3, 0);
180 
181   m_editStepX = new QLineEdit;
182   m_editStepX->setWhatsThis (tr ("Difference in value between two successive X grid lines.\n\n"
183                                  "The step value must be greater than zero (linear) or one (log)"));
184   m_validatorStepX = new QDoubleValidator;
185   m_editStepX->setValidator (m_validatorStepX);
186   connect (m_editStepX, SIGNAL (textChanged (const QString &)), this, SLOT  (slotStepX (const QString &)));
187   layoutGroup->addWidget (m_editStepX, 3, 1);
188 
189   QLabel *labelStop = new QLabel (QString ("%1:").arg (tr ("Stop")));
190   layoutGroup->addWidget (labelStop, 4, 0);
191 
192   m_editStopX = new QLineEdit;
193   m_editStopX->setWhatsThis (tr ("Value of the last X grid line.\n\n"
194                                  "The stop value cannot be less than the start value"));
195   m_validatorStopX = new QDoubleValidator;
196   m_editStopX->setValidator (m_validatorStopX);
197   connect (m_editStopX, SIGNAL (textChanged (const QString &)), this, SLOT  (slotStopX (const QString &)));
198   layoutGroup->addWidget (m_editStopX, 4, 1);
199 }
200 
createRemoveGridLinesY(QGridLayout * layout,int & row)201 void DlgSettingsGridRemoval::createRemoveGridLinesY (QGridLayout *layout, int &row)
202 {
203   LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsGridRemoval::createRemoveGridLinesY";
204 
205   QString titleY = tr ("Y Grid Lines");
206   if (false) {
207     titleY = QString (tr ("R Grid Lines"));
208   }
209   QGroupBox *groupY = new QGroupBox (titleY);
210   layout->addWidget (groupY, row++, 3);
211 
212   QGridLayout *layoutGroup = new QGridLayout;
213   groupY->setLayout (layoutGroup);
214 
215   QLabel *labelDisable = new QLabel (QString ("%1:").arg (tr ("Disable")));
216   layoutGroup->addWidget (labelDisable, 0, 0);
217 
218   m_cmbDisableY = new QComboBox;
219   m_cmbDisableY->setWhatsThis (tr ("Disabled value.\n\n"
220                                    "The Y grid lines are specified using only three values at a time. For flexibility, four values "
221                                    "are offered so you must chose which value is disabled. Once disabled, that value is simply "
222                                    "updated as the other values change"));
223   m_cmbDisableY->addItem(gridCoordDisableToString (GRID_COORD_DISABLE_COUNT),
224                          QVariant (GRID_COORD_DISABLE_COUNT));
225   m_cmbDisableY->addItem(gridCoordDisableToString (GRID_COORD_DISABLE_START),
226                          QVariant (GRID_COORD_DISABLE_START));
227   m_cmbDisableY->addItem(gridCoordDisableToString (GRID_COORD_DISABLE_STEP),
228                          QVariant (GRID_COORD_DISABLE_STEP));
229   m_cmbDisableY->addItem(gridCoordDisableToString (GRID_COORD_DISABLE_STOP),
230                          QVariant (GRID_COORD_DISABLE_STOP));
231   connect (m_cmbDisableY, SIGNAL (activated (const QString &)), this, SLOT (slotDisableY (const QString &))); // activated() ignores code changes
232   layoutGroup->addWidget (m_cmbDisableY, 0, 1);
233 
234   QLabel *labelCount = new QLabel (QString ("%1:").arg (tr ("Count")));
235   layoutGroup->addWidget (labelCount, 1, 0);
236 
237   m_editCountY = new QLineEdit;
238   m_editCountY->setWhatsThis (tr ("Number of Y grid lines.\n\n"
239                                   "The number of Y grid lines must be entered as an integer greater than zero"));
240   m_validatorCountY = new QDoubleValidator (COUNT_MIN, COUNT_MAX, COUNT_DECIMALS);
241   m_editCountY->setValidator (m_validatorCountY);
242   connect (m_editCountY, SIGNAL (textChanged (const QString &)), this, SLOT  (slotCountY (const QString &)));
243   layoutGroup->addWidget (m_editCountY, 1, 1);
244 
245   QLabel *labelStart = new QLabel (QString ("%1:").arg (tr ("Start")));
246   layoutGroup->addWidget (labelStart, 2, 0);
247 
248   m_editStartY = new QLineEdit;
249   m_editStartY->setWhatsThis (tr ("Value of the first Y grid line.\n\n"
250                                   "The start value cannot be greater than the stop value"));
251   m_validatorStartY = new QDoubleValidator;
252   m_editStartY->setValidator (m_validatorStartY);
253   connect (m_editStartY, SIGNAL (textChanged (const QString &)), this, SLOT  (slotStartY (const QString &)));
254   layoutGroup->addWidget (m_editStartY, 2, 1);
255 
256   QLabel *labelStep = new QLabel (QString ("%1:").arg (tr ("Step")));
257   layoutGroup->addWidget (labelStep, 3, 0);
258 
259   m_editStepY = new QLineEdit;
260   m_editStepY->setWhatsThis (tr ("Difference in value between two successive Y grid lines.\n\n"
261                                  "The step value must be greater than zero (linear) or one (log)"));
262   m_validatorStepY = new QDoubleValidator;
263   m_editStepY->setValidator (m_validatorStepY);
264   connect (m_editStepY, SIGNAL (textChanged (const QString &)), this, SLOT  (slotStepY (const QString &)));
265   layoutGroup->addWidget (m_editStepY, 3, 1);
266 
267   QLabel *labelStop = new QLabel (QString ("%1:").arg (tr ("Stop")));
268   layoutGroup->addWidget (labelStop, 4, 0);
269 
270   m_editStopY = new QLineEdit;
271   m_editStopY->setWhatsThis (tr ("Value of the last Y grid line.\n\n"
272                                  "The stop value cannot be less than the start value"));
273   m_validatorStopY = new QDoubleValidator;
274   m_editStopY->setValidator (m_validatorStopY);
275   connect (m_editStopY, SIGNAL (textChanged (const QString &)), this, SLOT  (slotStopY (const QString &)));
276   layoutGroup->addWidget (m_editStopY, 4, 1);
277 }
278 
createSubPanel()279 QWidget *DlgSettingsGridRemoval::createSubPanel ()
280 {
281   LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsGridRemoval::createSubPanel";
282 
283   QWidget *subPanel = new QWidget ();
284   QGridLayout *layout = new QGridLayout (subPanel);
285   subPanel->setLayout (layout);
286 
287   layout->setColumnStretch(0, 1); // Empty first column
288   layout->setColumnStretch(1, 0); // Checkbox part of "section" checkboxes. In other rows this has empty space as indentation
289   layout->setColumnStretch(2, 0); // X
290   layout->setColumnStretch(3, 0); // Y
291   layout->setColumnStretch(4, 1); // Empty last column
292 
293   int row = 0;
294   createRemoveGridLines (layout, row);
295   createPreview (layout, row);
296 
297   return subPanel;
298 }
299 
handleOk()300 void DlgSettingsGridRemoval::handleOk ()
301 {
302   LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsGridRemoval::handleOk";
303 
304   // Set the stable flag
305   m_modelGridRemovalAfter->setStable ();
306 
307   CmdSettingsGridRemoval *cmd = new CmdSettingsGridRemoval (mainWindow (),
308                                                             cmdMediator ().document(),
309                                                             *m_modelGridRemovalBefore,
310                                                             *m_modelGridRemovalAfter);
311   cmdMediator ().push (cmd);
312 
313   hide ();
314 }
315 
load(CmdMediator & cmdMediator)316 void DlgSettingsGridRemoval::load (CmdMediator &cmdMediator)
317 {
318   LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsGridRemoval::load";
319 
320   setCmdMediator (cmdMediator);
321 
322   // Flush old data
323   delete m_modelGridRemovalBefore;
324   delete m_modelGridRemovalAfter;
325 
326   // Save new data
327   m_modelGridRemovalBefore = new DocumentModelGridRemoval (cmdMediator.document());
328   m_modelGridRemovalAfter = new DocumentModelGridRemoval (cmdMediator.document());
329 
330   // Sanity checks. Incoming defaults must be acceptable to the local limits
331   ENGAUGE_ASSERT (CLOSE_DISTANCE_MIN <= m_modelGridRemovalAfter->closeDistance());
332   ENGAUGE_ASSERT (CLOSE_DISTANCE_MAX >= m_modelGridRemovalAfter->closeDistance());
333 
334   // Populate controls
335   m_chkRemoveGridLines->setChecked (m_modelGridRemovalAfter->removeDefinedGridLines());
336 
337   m_editCloseDistance->setText (QString::number (m_modelGridRemovalAfter->closeDistance()));
338 
339   int indexDisableX = m_cmbDisableX->findData (QVariant (m_modelGridRemovalAfter->gridCoordDisableX()));
340   m_cmbDisableX->setCurrentIndex (indexDisableX);
341 
342   m_editCountX->setText(QString::number(m_modelGridRemovalAfter->countX()));
343   m_editStartX->setText(QString::number(m_modelGridRemovalAfter->startX()));
344   m_editStepX->setText(QString::number(m_modelGridRemovalAfter->stepX()));
345   m_editStopX->setText(QString::number(m_modelGridRemovalAfter->stopX()));
346 
347   int indexDisableY = m_cmbDisableY->findData (QVariant (m_modelGridRemovalAfter->gridCoordDisableY()));
348   m_cmbDisableY->setCurrentIndex (indexDisableY);
349 
350   m_editCountY->setText(QString::number(m_modelGridRemovalAfter->countY()));
351   m_editStartY->setText(QString::number(m_modelGridRemovalAfter->startY()));
352   m_editStepY->setText(QString::number(m_modelGridRemovalAfter->stepY()));
353   m_editStopY->setText(QString::number(m_modelGridRemovalAfter->stopY()));
354 
355   updateControls ();
356   enableOk (false); // Disable Ok button since there not yet any changes
357   updatePreview();
358 }
359 
setSmallDialogs(bool smallDialogs)360 void DlgSettingsGridRemoval::setSmallDialogs(bool smallDialogs)
361 {
362   if (!smallDialogs) {
363     setMinimumHeight (MINIMUM_HEIGHT);
364   }
365 }
366 
slotCloseDistance(const QString &)367 void DlgSettingsGridRemoval::slotCloseDistance(const QString &)
368 {
369   LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsGridRemoval::slotCloseDistance";
370 
371   m_modelGridRemovalAfter->setCloseDistance(m_editCloseDistance->text().toDouble());
372   updateControls ();
373   updatePreview();
374 }
375 
slotCountX(const QString & count)376 void DlgSettingsGridRemoval::slotCountX(const QString &count)
377 {
378   LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsGridRemoval::slotCountX";
379 
380   m_modelGridRemovalAfter->setCountX(count.toInt());
381   updateDisplayedVariableX ();
382   updateControls ();
383   updatePreview();
384 }
385 
slotCountY(const QString & count)386 void DlgSettingsGridRemoval::slotCountY(const QString &count)
387 {
388   LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsGridRemoval::slotCountY";
389 
390   m_modelGridRemovalAfter->setCountY(count.toInt());
391   updateDisplayedVariableY ();
392   updateControls ();
393   updatePreview();
394 }
395 
slotDisableX(const QString &)396 void DlgSettingsGridRemoval::slotDisableX(const QString &)
397 {
398   LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsGridRemoval::slotDisableX";
399 
400   GridCoordDisable gridCoordDisable = static_cast<GridCoordDisable> (m_cmbDisableX->currentData().toInt());
401   m_modelGridRemovalAfter->setGridCoordDisableX(gridCoordDisable);
402   updateDisplayedVariableX ();
403   updateControls();
404   updatePreview();
405 }
406 
slotDisableY(const QString &)407 void DlgSettingsGridRemoval::slotDisableY(const QString &)
408 {
409   LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsGridRemoval::slotDisableY";
410 
411   GridCoordDisable gridCoordDisable = static_cast<GridCoordDisable> (m_cmbDisableY->currentData().toInt());
412   m_modelGridRemovalAfter->setGridCoordDisableY(gridCoordDisable);
413   updateDisplayedVariableY ();
414   updateControls();
415   updatePreview();
416 }
417 
slotRemoveGridLines(int state)418 void DlgSettingsGridRemoval::slotRemoveGridLines (int state)
419 {
420   LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsGridRemoval::slotRemoveGridLines";
421 
422   m_modelGridRemovalAfter->setRemoveDefinedGridLines(state == Qt::Checked);
423   updateControls();
424   updatePreview();
425 }
426 
slotStartX(const QString & startX)427 void DlgSettingsGridRemoval::slotStartX(const QString &startX)
428 {
429   LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsGridRemoval::slotStartX";
430 
431   m_modelGridRemovalAfter->setStartX(startX.toDouble());
432   updateDisplayedVariableX ();
433   updateControls();
434   updatePreview();
435 }
436 
slotStartY(const QString & startY)437 void DlgSettingsGridRemoval::slotStartY(const QString &startY)
438 {
439   LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsGridRemoval::slotStartY";
440 
441   m_modelGridRemovalAfter->setStartY(startY.toDouble());
442   updateDisplayedVariableY ();
443   updateControls();
444   updatePreview();
445 }
446 
slotStepX(const QString & stepX)447 void DlgSettingsGridRemoval::slotStepX(const QString &stepX)
448 {
449   LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsGridRemoval::slotStepX";
450 
451   m_modelGridRemovalAfter->setStepX(stepX.toDouble());
452   updateDisplayedVariableX ();
453   updateControls();
454   updatePreview();
455 }
456 
slotStepY(const QString & stepY)457 void DlgSettingsGridRemoval::slotStepY(const QString &stepY)
458 {
459   LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsGridRemoval::slotStepY";
460 
461   m_modelGridRemovalAfter->setStepY(stepY.toDouble());
462   updateDisplayedVariableY ();
463   updateControls();
464   updatePreview();
465 }
466 
slotStopX(const QString & stopX)467 void DlgSettingsGridRemoval::slotStopX(const QString &stopX)
468 {
469   LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsGridRemoval::slotStopX";
470 
471   m_modelGridRemovalAfter->setStopX(stopX.toDouble());
472   updateDisplayedVariableX ();
473   updateControls();
474   updatePreview();
475 }
476 
slotStopY(const QString & stopY)477 void DlgSettingsGridRemoval::slotStopY(const QString &stopY)
478 {
479   LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsGridRemoval::slotStopY";
480 
481   m_modelGridRemovalAfter->setStopY(stopY.toDouble());
482   updateDisplayedVariableY ();
483   updateControls();
484   updatePreview();
485 }
486 
updateControls()487 void DlgSettingsGridRemoval::updateControls ()
488 {
489   m_editCloseDistance->setEnabled (m_chkRemoveGridLines->isChecked ());
490 
491   m_cmbDisableX->setEnabled (m_chkRemoveGridLines->isChecked ());
492 
493   GridCoordDisable disableX = static_cast<GridCoordDisable> (m_cmbDisableX->currentData().toInt());
494   m_editCountX->setEnabled (m_chkRemoveGridLines->isChecked () && (disableX != GRID_COORD_DISABLE_COUNT));
495   m_editStartX->setEnabled (m_chkRemoveGridLines->isChecked () && (disableX != GRID_COORD_DISABLE_START));
496   m_editStepX->setEnabled (m_chkRemoveGridLines->isChecked () && (disableX != GRID_COORD_DISABLE_STEP));
497   m_editStopX->setEnabled (m_chkRemoveGridLines->isChecked () && (disableX != GRID_COORD_DISABLE_STOP));
498 
499   m_cmbDisableY->setEnabled (m_chkRemoveGridLines->isChecked ());
500 
501   GridCoordDisable disableY = static_cast<GridCoordDisable> (m_cmbDisableY->currentData().toInt());
502   m_editCountY->setEnabled (m_chkRemoveGridLines->isChecked () && (disableY != GRID_COORD_DISABLE_COUNT));
503   m_editStartY->setEnabled (m_chkRemoveGridLines->isChecked () && (disableY != GRID_COORD_DISABLE_START));
504   m_editStepY->setEnabled (m_chkRemoveGridLines->isChecked () && (disableY != GRID_COORD_DISABLE_STEP));
505   m_editStopY->setEnabled (m_chkRemoveGridLines->isChecked () && (disableY != GRID_COORD_DISABLE_STOP));
506 
507   QString textCloseDistance = m_editCloseDistance->text();
508   QString textCountX = m_editCountX->text();
509   QString textStartX = m_editStartX->text();
510   QString textStepX = m_editStepX->text();
511   QString textStopX = m_editStopX->text();
512   QString textCountY = m_editCountY->text();
513   QString textStartY = m_editStartY->text();
514   QString textStepY = m_editStepY->text();
515   QString textStopY = m_editStopY->text();
516 
517   int pos;
518   bool isOk = (m_validatorCloseDistance->validate (textCloseDistance, pos) == QValidator::Acceptable) &&
519               (m_validatorCountX->validate (textCountX, pos) == QValidator::Acceptable) &&
520               (m_validatorStartX->validate (textStartX, pos) == QValidator::Acceptable) &&
521               (m_validatorStepX->validate (textStepX, pos) == QValidator::Acceptable) &&
522               (m_validatorStopX->validate (textStopX, pos) == QValidator::Acceptable) &&
523               (m_validatorCountY->validate (textCountY, pos) == QValidator::Acceptable) &&
524               (m_validatorStartY->validate (textStartY, pos) == QValidator::Acceptable) &&
525               (m_validatorStepY->validate (textStepY, pos) == QValidator::Acceptable) &&
526               (m_validatorStopY->validate (textStopY, pos) == QValidator::Acceptable);
527   enableOk (isOk);
528 }
529 
updateDisplayedVariableX()530 void DlgSettingsGridRemoval::updateDisplayedVariableX ()
531 {
532   GridInitializer initializer;
533 
534   bool linearAxis = (cmdMediator ().document ().modelCoords ().coordScaleXTheta() == COORD_SCALE_LINEAR);
535 
536   switch (m_modelGridRemovalAfter->gridCoordDisableX()) {
537     case GRID_COORD_DISABLE_COUNT:
538       m_editCountX->setText (QString::number (initializer.computeCount (linearAxis,
539                                                                         m_modelGridRemovalAfter->startX (),
540                                                                         m_modelGridRemovalAfter->stopX (),
541                                                                         m_modelGridRemovalAfter->stepX ())));
542       break;
543 
544     case GRID_COORD_DISABLE_START:
545       m_editStartX->setText (QString::number (initializer.computeStart (linearAxis,
546                                                                         m_modelGridRemovalAfter->stopX (),
547                                                                         m_modelGridRemovalAfter->stepX (),
548                                                                         m_modelGridRemovalAfter->countX ())));
549       break;
550 
551     case GRID_COORD_DISABLE_STEP:
552       m_editStepX->setText (QString::number (initializer.computeStep (linearAxis,
553                                                                       m_modelGridRemovalAfter->startX (),
554                                                                       m_modelGridRemovalAfter->stopX (),
555                                                                       m_modelGridRemovalAfter->countX ())));
556       break;
557 
558     case GRID_COORD_DISABLE_STOP:
559       m_editStopX->setText (QString::number (initializer.computeStop (linearAxis,
560                                                                       m_modelGridRemovalAfter->startX (),
561                                                                       m_modelGridRemovalAfter->stepX (),
562                                                                       m_modelGridRemovalAfter->countX ())));
563       break;
564   }
565 }
566 
updateDisplayedVariableY()567 void DlgSettingsGridRemoval::updateDisplayedVariableY ()
568 {
569   GridInitializer initializer;
570 
571   bool linearAxis = (cmdMediator ().document ().modelCoords ().coordScaleYRadius () == COORD_SCALE_LINEAR);
572 
573   switch (m_modelGridRemovalAfter->gridCoordDisableY()) {
574     case GRID_COORD_DISABLE_COUNT:
575       m_editCountY->setText (QString::number (initializer.computeCount (linearAxis,
576                                                                         m_modelGridRemovalAfter->startY (),
577                                                                         m_modelGridRemovalAfter->stopY (),
578                                                                         m_modelGridRemovalAfter->stepY ())));
579       break;
580 
581     case GRID_COORD_DISABLE_START:
582       m_editStartY->setText (QString::number (initializer.computeStart (linearAxis,
583                                                                         m_modelGridRemovalAfter->stopY (),
584                                                                         m_modelGridRemovalAfter->stepY (),
585                                                                         m_modelGridRemovalAfter->countY ())));
586       break;
587 
588     case GRID_COORD_DISABLE_STEP:
589       m_editStepY->setText (QString::number (initializer.computeStep (linearAxis,
590                                                                       m_modelGridRemovalAfter->startY (),
591                                                                       m_modelGridRemovalAfter->stopY (),
592                                                                       m_modelGridRemovalAfter->countY ())));
593       break;
594 
595     case GRID_COORD_DISABLE_STOP:
596       m_editStopY->setText (QString::number (initializer.computeStop (linearAxis,
597                                                                       m_modelGridRemovalAfter->startY (),
598                                                                       m_modelGridRemovalAfter->stepY (),
599                                                                       m_modelGridRemovalAfter->countY ())));
600       break;
601   }
602 }
603 
updatePreview()604 void DlgSettingsGridRemoval::updatePreview ()
605 {
606   GridRemoval gridRemoval (mainWindow().isGnuplot());
607 
608   QPixmap pixmap = gridRemoval.remove (mainWindow ().transformation(),
609                                        *m_modelGridRemovalAfter,
610                                        cmdMediator ().document().pixmap().toImage());
611 
612   m_scenePreview->clear();
613   m_scenePreview->addPixmap (pixmap);
614 }
615