Engauge Digitizer  2
 All Classes Files Functions Variables Enumerations Enumerator Friends Pages
DlgSettingsMainWindow.cpp
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 "DlgSettingsMainWindow.h"
8 #include "EngaugeAssert.h"
9 #include "ImportCropping.h"
10 #include "ImportCroppingUtilBase.h"
11 #include "Logger.h"
12 #include "MainWindow.h"
13 #include "MainWindowModel.h"
14 #include <QCheckBox>
15 #include <QComboBox>
16 #include <QDoubleSpinBox>
17 #include <QGraphicsScene>
18 #include <QGridLayout>
19 #include <QGroupBox>
20 #include <QLabel>
21 #include <qmath.h>
22 #include <QPushButton>
23 #include <QSettings>
24 #include <QSpinBox>
25 #include "QtToString.h"
26 #include "Settings.h"
27 #include "ZoomControl.h"
28 #include "ZoomFactorInitial.h"
29 #include "ZoomLabels.h"
30 
32  DlgSettingsAbstractBase (tr ("Main Window"),
33  "DlgSettingsMainWindow",
34  mainWindow),
35  m_modelMainWindowBefore (0),
36  m_modelMainWindowAfter (0)
37 {
38  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsMainWindow::DlgSettingsMainWindow";
39 
40  QWidget *subPanel = createSubPanel ();
41  finishPanel (subPanel);
42 }
43 
44 DlgSettingsMainWindow::~DlgSettingsMainWindow()
45 {
46  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsMainWindow::~DlgSettingsMainWindow";
47 }
48 
49 void DlgSettingsMainWindow::createControls (QGridLayout *layout,
50  int &row)
51 {
52  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsMainWindow::createControls";
53 
54  const int COLUMN0 = 0;
55 
56  QLabel *labelZoomFactor = new QLabel (tr ("Initial zoom:"));
57  layout->addWidget (labelZoomFactor, row, 1);
58 
59  m_cmbZoomFactor = new QComboBox;
60  m_cmbZoomFactor->addItem (LABEL_ZOOM_16_TO_1 , QVariant (ZOOM_INITIAL_16_TO_1));
61  m_cmbZoomFactor->addItem (LABEL_ZOOM_8_TO_1 , QVariant (ZOOM_INITIAL_8_TO_1));
62  m_cmbZoomFactor->addItem (LABEL_ZOOM_4_TO_1 , QVariant (ZOOM_INITIAL_4_TO_1));
63  m_cmbZoomFactor->addItem (LABEL_ZOOM_2_TO_1 , QVariant (ZOOM_INITIAL_2_TO_1));
64  m_cmbZoomFactor->addItem (LABEL_ZOOM_1_TO_1 , QVariant (ZOOM_INITIAL_1_TO_1));
65  m_cmbZoomFactor->addItem (LABEL_ZOOM_1_TO_2 , QVariant (ZOOM_INITIAL_1_TO_2));
66  m_cmbZoomFactor->addItem (LABEL_ZOOM_1_TO_4 , QVariant (ZOOM_INITIAL_1_TO_4));
67  m_cmbZoomFactor->addItem (LABEL_ZOOM_1_TO_8 , QVariant (ZOOM_INITIAL_1_TO_8));
68  m_cmbZoomFactor->addItem (LABEL_ZOOM_1_TO_16 , QVariant (ZOOM_INITIAL_1_TO_16));
69  m_cmbZoomFactor->addItem (LABEL_ZOOM_FILL , QVariant (ZOOM_INITIAL_FILL));
70  m_cmbZoomFactor->addItem (LABEL_ZOOM_PREVIOUS , QVariant (ZOOM_INITIAL_PREVIOUS));
71  m_cmbZoomFactor->setWhatsThis(tr ("Initial Zoom\n\n"
72  "Select the initial zoom factor when a new document is loaded. Either the previous "
73  "zoom can be kept, or the specified zoom can be applied."));
74  connect (m_cmbZoomFactor, SIGNAL (currentTextChanged (const QString)), this, SLOT (slotZoomFactor(const QString)));
75  layout->addWidget (m_cmbZoomFactor, row++, 2);
76 
77  QLabel *labelZoomControl = new QLabel (tr ("Zoom control:"));
78  layout->addWidget (labelZoomControl, row, 1);
79 
80  m_cmbZoomControl = new QComboBox;
81  m_cmbZoomControl->addItem (tr ("Menu only" ), QVariant (ZOOM_CONTROL_MENU_ONLY));
82  m_cmbZoomControl->addItem (tr ("Menu and mouse wheel" ), QVariant (ZOOM_CONTROL_MENU_WHEEL));
83  m_cmbZoomControl->addItem (tr ("Menu and +/- keys" ), QVariant (ZOOM_CONTROL_MENU_PLUSMINUS));
84  m_cmbZoomControl->addItem (tr ("Menu, mouse wheel and +/- keys"), QVariant (ZOOM_CONTROL_MENU_WHEEL_PLUSMINUS));
85  m_cmbZoomControl->setWhatsThis (tr ("Zoom Control\n\n"
86  "Select which inputs are used to zoom in and out."));
87  connect (m_cmbZoomControl, SIGNAL (currentTextChanged (const QString)), this, SLOT (slotZoomControl(const QString)));
88  layout->addWidget (m_cmbZoomControl, row++, 2);
89 
90  QLabel *labelLocale = new QLabel (tr ("Locale:"));
91  layout->addWidget (labelLocale, row, 1);
92 
93  // Initialization of combobox is liberated from Qt Calendar example
94  m_cmbLocale = new QComboBox;
95  m_cmbLocale->setWhatsThis(tr ("Locale\n\n"
96  "Select the locale that will be used in numbers (immediately), and the language in the user "
97  "interface (after restart).\n\n"
98  "The locale determines how numbers are formatted. Specifically, either commas or "
99  "periods will be used as group delimiters in each number entered "
100  "by the user, displayed in the user interface, or exported to a file."));
101  for (int indexLang = QLocale::C; indexLang <= QLocale::LastLanguage; indexLang++) {
102  QLocale::Language lang = static_cast<QLocale::Language> (indexLang);
103  QList<QLocale::Country> countries = QLocale::countriesForLanguage(lang);
104  for (int indexCountry = 0; indexCountry < countries.count(); indexCountry++) {
105  QLocale::Country country = countries.at(indexCountry);
106  QLocale locale (lang, country);
107  QString label = QLocaleToString (locale);
108  m_cmbLocale->addItem (label, locale);
109  }
110  }
111  m_cmbLocale->model()->sort(COLUMN0); // Sort the new entries
112  connect (m_cmbLocale, SIGNAL (currentIndexChanged (int)), this, SLOT (slotLocale (int)));
113  layout->addWidget (m_cmbLocale, row++, 2);
114 
115  QLabel *labelImportCropping = new QLabel (tr ("Import cropping:"));
116  layout->addWidget (labelImportCropping, row, 1);
117 
118  m_cmbImportCropping = new QComboBox;
119  m_cmbImportCropping->setWhatsThis (tr ("Import Cropping\n\n"
120  "Enables or disables cropping of the imported image when importing. Cropping the image is useful "
121  "for removing unimportant information around a graph, but less useful when the graph already fills "
122  "the entire image."));
123  ImportCroppingUtilBase importCroppingUtil;
124  m_cmbImportCropping->addItem (importCroppingUtil.importCroppingToString (IMPORT_CROPPING_NEVER), IMPORT_CROPPING_NEVER);
125  m_cmbImportCropping->addItem (importCroppingUtil.importCroppingToString (IMPORT_CROPPING_MULTIPAGE_PDFS), IMPORT_CROPPING_MULTIPAGE_PDFS);
126  m_cmbImportCropping->addItem (importCroppingUtil.importCroppingToString (IMPORT_CROPPING_ALWAYS), IMPORT_CROPPING_ALWAYS);
127  connect (m_cmbImportCropping, SIGNAL (currentIndexChanged (int)), this, SLOT (slotImportCropping (int)));
128  layout->addWidget (m_cmbImportCropping, row++, 2);
129 
130 #ifdef ENGAUGE_PDF
131  QLabel *labelPdfResolution = new QLabel (tr ("Import PDF resolution (dots per inch):"));
132  layout->addWidget (labelPdfResolution, row, 1);
133 
134  m_cmbPdfResolution = new QComboBox;
135  m_cmbPdfResolution->setWhatsThis (tr ("Import PDF Resolution\n\n"
136  "Imported Portable Document Format (PDF) files will be converted to this pixel resolution "
137  "in dots per inch (DPI), where each pixel is one dot. A higher value increases the picture resolution "
138  "and may also improve numeric digitizing accuracy. However, a very high value can make the image so "
139  "large that Engauge will slow down."));
140  m_cmbPdfResolution->addItem ("75", 75);
141  m_cmbPdfResolution->addItem ("100", 100);
142  m_cmbPdfResolution->addItem ("150", 150);
143  m_cmbPdfResolution->addItem ("200", 200);
144  m_cmbPdfResolution->addItem ("250", 250);
145  m_cmbPdfResolution->addItem ("300", 300);
146  connect (m_cmbPdfResolution, SIGNAL (currentTextChanged (QString)), this, SLOT (slotPdfResolution (QString)));
147  layout->addWidget (m_cmbPdfResolution, row++, 2);
148 #endif
149 
150  QLabel *labelMaximumGridLines = new QLabel (tr ("Maximum grid lines:"));
151  layout->addWidget (labelMaximumGridLines, row, 1);
152 
153  m_spinMaximumGridLines = new QSpinBox;
154  m_spinMaximumGridLines->setMinimum (2);
155  m_spinMaximumGridLines->setWhatsThis (tr ("Maximum Grid Lines\n\n"
156  "Maximum number of grid lines to be processed. This limit is applied when the step value is too "
157  "small for the start and stop values, which would result in too many grid lines visually and "
158  "possibly extremely long processing time (since each grid line would have to be processed)"));
159  connect (m_spinMaximumGridLines, SIGNAL (valueChanged (int)), this, (SLOT (slotMaximumGridLines (int))));
160  layout->addWidget (m_spinMaximumGridLines, row++, 2);
161 
162  QLabel *labelHighlightOpacity = new QLabel (tr ("Highlight opacity:"));
163  layout->addWidget (labelHighlightOpacity, row, 1);
164 
165  m_spinHighlightOpacity = new QDoubleSpinBox;
166  m_spinHighlightOpacity->setRange (0, 1);
167  m_spinHighlightOpacity->setSingleStep (0.1);
168  m_spinHighlightOpacity->setWhatsThis (tr ("Highligh Opacity\n\n"
169  "Opacity to be applied when the cursor is over a curve or axis point in Select mode. The change in "
170  "appearance shows when the point can be selected."));
171  connect (m_spinHighlightOpacity, SIGNAL (valueChanged (double)), this, SLOT (slotHighlightOpacity(double)));
172  layout->addWidget (m_spinHighlightOpacity, row++, 2);
173 
174  QLabel *labelRecent = new QLabel (tr ("Recent file list:"));
175  layout->addWidget (labelRecent, row, 1);
176 
177  m_btnRecentClear = new QPushButton (tr ("Clear"));
178  m_btnRecentClear->setSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed);
179  m_btnRecentClear->setWhatsThis (tr ("Recent File List Clear\n\n"
180  "Clear the recent file list in the File menu."));
181  connect (m_btnRecentClear, SIGNAL (pressed ()), &mainWindow(), SLOT (slotRecentFileClear ()));
182  connect (m_btnRecentClear, SIGNAL (pressed ()), this, SLOT (slotRecentFileClear()));
183  layout->addWidget (m_btnRecentClear, row++, 2);
184 
185  QLabel *labelTitleBarFormat = new QLabel (tr ("Include title bar path:"));
186  layout->addWidget (labelTitleBarFormat, row, 1);
187 
188  m_chkTitleBarFormat = new QCheckBox;
189  m_chkTitleBarFormat->setSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed);
190  m_chkTitleBarFormat->setWhatsThis (tr ("Title Bar Filename\n\n"
191  "Includes or excludes the path and file extension from the filename in the title bar."));
192  connect (m_chkTitleBarFormat, SIGNAL (toggled (bool)), this, SLOT (slotTitleBarFormat(bool)));
193  layout->addWidget (m_chkTitleBarFormat, row++, 2);
194 }
195 
196 void DlgSettingsMainWindow::createOptionalSaveDefault (QHBoxLayout * /* layout */)
197 {
198  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsMainWindow::createOptionalSaveDefault";
199 }
200 
202 {
203  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsMainWindow::createSubPanel";
204 
205  QWidget *subPanel = new QWidget ();
206  QGridLayout *layout = new QGridLayout (subPanel);
207  subPanel->setLayout (layout);
208 
209  layout->setColumnStretch(0, 1); // Empty first column
210  layout->setColumnStretch(1, 0); // Labels
211  layout->setColumnStretch(2, 0); // Values
212  layout->setColumnStretch(3, 1); // Empty first column
213 
214  int row = 0;
215  createControls (layout, row);
216 
217  return subPanel;
218 }
219 
221 {
222  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsMainWindow::handleOk";
223 
224  mainWindow().updateSettingsMainWindow (*m_modelMainWindowAfter);
225 
226  hide ();
227 }
228 void DlgSettingsMainWindow::load (CmdMediator & /* cmdMediator */)
229 {
230  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsMainWindow::load";
231 
232  ENGAUGE_ASSERT (false);
233 }
234 
236  const MainWindowModel &modelMainWindow)
237 {
238  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsMainWindow::loadMainWindowModel";
239 
240  setCmdMediator (cmdMediator);
241 
242  // Flush old data
243  if (m_modelMainWindowBefore != 0) {
244  delete m_modelMainWindowBefore;
245  }
246  if (m_modelMainWindowAfter != 0) {
247  delete m_modelMainWindowAfter;
248  }
249 
250  // Save new data
251  m_modelMainWindowBefore = new MainWindowModel (modelMainWindow);
252  m_modelMainWindowAfter = new MainWindowModel (modelMainWindow);
253 
254  // Populate controls
255  int index = m_cmbZoomFactor->findData (m_modelMainWindowAfter->zoomFactorInitial());
256  m_cmbZoomFactor->setCurrentIndex (index);
257  index = m_cmbZoomControl->findData (m_modelMainWindowAfter->zoomControl());
258  m_cmbZoomControl->setCurrentIndex (index);
259  QString locLabel = QLocaleToString (m_modelMainWindowAfter->locale());
260  index = m_cmbLocale->findText (locLabel);
261  m_cmbLocale->setCurrentIndex(index);
262  index = m_cmbImportCropping->findData (m_modelMainWindowAfter->importCropping());
263  m_cmbImportCropping->setCurrentIndex (index);
264  m_chkTitleBarFormat->setChecked (m_modelMainWindowAfter->mainTitleBarFormat() == MAIN_TITLE_BAR_FORMAT_PATH);
265  index = m_cmbPdfResolution->findData (m_modelMainWindowAfter->pdfResolution());
266  m_cmbPdfResolution->setCurrentIndex(index);
267  m_spinMaximumGridLines->setValue (m_modelMainWindowAfter->maximumGridLines());
268  m_spinHighlightOpacity->setValue (m_modelMainWindowAfter->highlightOpacity());
269 
270  updateControls ();
271  enableOk (false); // Disable Ok button since there not yet any changes
272 }
273 
274 void DlgSettingsMainWindow::slotHighlightOpacity(double)
275 {
276  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsMainWindow::slotHighlightOpacity";
277 
278  m_modelMainWindowAfter->setHighlightOpacity (m_spinHighlightOpacity->value());
279  updateControls();
280 }
281 
282 void DlgSettingsMainWindow::slotImportCropping (int index)
283 {
284  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsMainWindow::slotImportCropping";
285 
286  m_modelMainWindowAfter->setImportCropping ((ImportCropping) m_cmbImportCropping->itemData (index).toInt ());
287  updateControls();
288 }
289 
290 void DlgSettingsMainWindow::slotLocale (int index)
291 {
292  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsMainWindow::slotLocale";
293 
294  m_modelMainWindowAfter->setLocale (m_cmbLocale->itemData (index).toLocale());
295  updateControls();
296 }
297 
298 void DlgSettingsMainWindow::slotMaximumGridLines (int limit)
299 {
300  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsMainWIndow::slotMaximumGridLines";
301 
302  m_modelMainWindowAfter->setMaximumGridLines (limit);
303  updateControls ();
304 }
305 
306 void DlgSettingsMainWindow::slotPdfResolution(const QString)
307 {
308  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsMainWIndow::slotPdfResolution";
309 
310  m_modelMainWindowAfter->setPdfResolution(m_cmbPdfResolution->currentData().toInt());
311  updateControls();
312 }
313 
314 void DlgSettingsMainWindow::slotRecentFileClear()
315 {
316  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsMainWindow::slotRecentFileClear";
317 
318  // The signal that triggered the call to this method was also sent to MainWindow to clear the list there
319  updateControls();
320 }
321 
322 void DlgSettingsMainWindow::slotTitleBarFormat(bool)
323 {
324  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsMainWindow::slotTitleBarFormat";
325 
326  m_modelMainWindowAfter->setMainTitleBarFormat(m_chkTitleBarFormat->isChecked() ?
327  MAIN_TITLE_BAR_FORMAT_PATH :
328  MAIN_TITLE_BAR_FORMAT_NO_PATH);
329  updateControls();
330 }
331 
332 void DlgSettingsMainWindow::slotZoomControl(const QString)
333 {
334  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsMainWindow::slotZoomControl";
335 
336  m_modelMainWindowAfter->setZoomControl ((ZoomControl) m_cmbZoomControl->currentData().toInt());
337  updateControls();
338 }
339 
340 void DlgSettingsMainWindow::slotZoomFactor(const QString)
341 {
342  LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsMainWIndow::slotZoomFactor";
343 
344  m_modelMainWindowAfter->setZoomFactorInitial((ZoomFactorInitial) m_cmbZoomFactor->currentData().toInt());
345  updateControls();
346 }
347 
348 void DlgSettingsMainWindow::updateControls ()
349 {
350  enableOk (true);
351 }
static QString importCroppingToString(ImportCropping importCropping)
Option as string for display to user.
virtual void createOptionalSaveDefault(QHBoxLayout *layout)
Let subclass define an optional Save As Default button.
void updateSettingsMainWindow(const MainWindowModel &modelMainWindow)
Update with new main window properties.
virtual void handleOk()
Process slotOk.
MainTitleBarFormat mainTitleBarFormat() const
Get method for MainWindow titlebar filename format.
void setCmdMediator(CmdMediator &cmdMediator)
Store CmdMediator for easy access by the leaf class.
void setHighlightOpacity(double highlightOpacity)
Set method for highlight opacity.
void setLocale(QLocale::Language language, QLocale::Country country)
Set method for locale given attributes.
int maximumGridLines() const
Maximum number of grid lines.
void loadMainWindowModel(CmdMediator &cmdMediator, const MainWindowModel &modelMainWindow)
Replaced load method since the main window settings are independent of document, unlike other DlgSett...
virtual void load(CmdMediator &cmdMediator)
Load settings from Document.
DlgSettingsMainWindow(MainWindow &mainWindow)
Single constructor.
ZoomControl zoomControl() const
Get method for zoom control.
Model for DlgSettingsMainWindow.
void setMaximumGridLines(int maximumGridLines)
Set method for maximum number of grid lines.
double highlightOpacity() const
Get method for highlight opacity.
virtual QWidget * createSubPanel()
Create dialog-specific panel to which base class will add Ok and Cancel buttons.
void finishPanel(QWidget *subPanel)
Add Ok and Cancel buttons to subpanel to get the whole dialog.
int pdfResolution() const
Get method for resolution of imported PDF files, in dots per inch.
Utility class for import cropping options.
void enableOk(bool enable)
Let leaf subclass control the Ok button.
void setZoomControl(ZoomControl zoomControl)
Set method for zoom control.
void setMainTitleBarFormat(MainTitleBarFormat mainTitleBarFormat)
Set method for MainWindow titlebar filename format.
Command queue stack.
Definition: CmdMediator.h:23
void setZoomFactorInitial(ZoomFactorInitial zoomFactorInitial)
Set method for initial zoom factor.
Abstract base class for all Settings dialogs.
ZoomFactorInitial zoomFactorInitial() const
Get method for initial zoom factor.
ImportCropping importCropping() const
Get method for import cropping.
QLocale locale() const
Get method for locale.
MainWindow & mainWindow()
Get method for MainWindow.
void setPdfResolution(int resolution)
Set method for resolution of imported PDF files, in dots per inch.
void setImportCropping(ImportCropping importCropping)
Set method for import cropping.
Main window consisting of menu, graphics scene, status bar and optional toolbars as a Single Document...
Definition: MainWindow.h:83