Engauge Digitizer  2
ChecklistGuideWizard.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 "ChecklistGuidePage.h"
8 #include "ChecklistGuidePageConclusion.h"
9 #include "ChecklistGuidePageCurves.h"
10 #include "ChecklistGuidePageIntro.h"
11 #include "ChecklistGuideWizard.h"
12 #include "ChecklistTemplate.h"
13 #include "ColorFilterSettings.h"
14 #include "EngaugeAssert.h"
15 #include "Logger.h"
16 #include "MainWindow.h"
17 #include <QGridLayout>
18 #include <QHeaderView>
19 #include <QPushButton>
20 #include <QRadioButton>
21 #include <QTextStream>
22 #include <QVBoxLayout>
23 
25  unsigned int numberCoordSystem) :
26  m_mainWindow (mainWindow),
27  m_dialogName ("ChecklistGuide")
28 {
29  setWindowTitle (tr ("Checklist Guide Wizard"));
30  setModal (true);
31  QPixmap splash (":/engauge/img/SpreadsheetsForDoc.png");
32  setPixmap (QWizard::WatermarkPixmap, splash); // For ClassicStyle and ModernStyle
33  setPixmap (QWizard::BackgroundPixmap, splash); // For MacStyle
34 
35  m_pageIntro = new ChecklistGuidePageIntro();
36  addPage(m_pageIntro);
37 
38  for (CoordSystemIndex coordSystemIndex = 0; coordSystemIndex < numberCoordSystem; coordSystemIndex++) {
39  m_pageCurves.push_back (new ChecklistGuidePageCurves(pageCurvesTitle (coordSystemIndex, numberCoordSystem)));
40  addPage(m_pageCurves.last());
41  }
42 
43  m_pageConclusion = new ChecklistGuidePageConclusion();
44  addPage(m_pageConclusion);
45 }
46 
47 QStringList ChecklistGuideWizard::curveNames(CoordSystemIndex coordSystemIndex) const
48 {
49  return m_pageCurves [coordSystemIndex]->curveNames();
50 }
51 
52 QString ChecklistGuideWizard::pageCurvesTitle (CoordSystemIndex coordSystemIndex,
53  unsigned int numberCoordSystem) const
54 {
55  LOG4CPP_INFO_S ((*mainCat)) << "ChecklistGuideWizard::pageCurvesTitle";
56 
57  ENGAUGE_ASSERT (coordSystemIndex < numberCoordSystem);
58 
59  if (numberCoordSystem == 1) {
60 
61  // Single curve needs no index information
62  return tr ("Curves");
63 
64  } else {
65 
66  // One of multiple curves needs index information
67  unsigned int indexOneBased = coordSystemIndex + 1;
68  return QString ("%1 %2")
69  .arg (QObject::tr ("Curves for coordinate system"))
70  .arg (indexOneBased);
71 
72  }
73 }
74 
75 void ChecklistGuideWizard::populateCurvesGraphs (CoordSystemIndex coordSystemIndex,
76  CurvesGraphs &curvesGraphs)
77 {
78  LOG4CPP_INFO_S ((*mainCat)) << "ChecklistGuideWizard::populateCurvesGraphs";
79 
80  QStringList curveNames = m_pageCurves [coordSystemIndex]->curveNames();
81  QStringList::const_iterator itr;
82  for (itr = curveNames.begin(); itr != curveNames.end(); itr++) {
83 
84  QString curveName = *itr;
85 
86  curvesGraphs.addGraphCurveAtEnd(Curve (curveName,
89  PointStyle::defaultGraphCurve (curvesGraphs.numCurves ()))));
90  }
91 }
92 
93 QString ChecklistGuideWizard::templateHtml (CoordSystemIndex coordSystemIndex) const
94 {
95  LOG4CPP_INFO_S ((*mainCat)) << "ChecklistGuideWizard::templateHtml";
96 
97  QStringList curveNames = m_pageCurves [coordSystemIndex]->curveNames();
98  bool withLines = m_pageCurves [coordSystemIndex]->withLines();
99 
100  QString html;
101  QTextStream str (&html);
102 
103  // Insert additional space between successive list items, using stylesheet
104  str << "<style type='text/css'>li { margin-top: 10px 0; }</style>";
105 
106  str << "<p>" << tr ("Follow this checklist of steps to digitize your image. Each step will show a check when it has been completed.");
107  str << "<p>" << tr ("The coordinates are defined by creating axis points:") << "</p>\n";
108  str << "<p>" << TAG_ANCHOR_AXIS_1 << "&nbsp;" << tr ("Add first of three axis points.") << " " << TAG_AHREF_AXIS_1 << "</p>\n";
109  str << TAG_DIV_AXIS_START_1;
110  str << "<ul>\n";
111  str << "<li>" << tr ("Click on") << " <img src="":/engauge/img/16-DigitAxis""> " << tr ("for <b>Axis Points</b> mode") << "</li>\n";
112  str << "<li>" << tr ("Click on an axis tick mark, or intersection of two grid lines, with labeled coordinates") << "</li>\n";
113  str << "<li>" << tr ("Enter the coordinates of the axis point") << "</li>\n";
114  str << "<li>" << tr ("Click on Ok") << "</li>\n";
115  str << "</ul>\n";
116  str << TAG_DIV_AXIS_END_1;
117  str << "<p>" << TAG_ANCHOR_AXIS_2 << "&nbsp;" << tr ("Add second of three axis points.") << " " << TAG_AHREF_AXIS_2 << "</p>\n";
118  str << TAG_DIV_AXIS_START_2;
119  str << "<ul>\n";
120  str << "<li>" << tr ("Click on") << " <img src="":/engauge/img/16-DigitAxis""> " << tr ("for <b>Axis Points</b> mode") << "</li>\n";
121  str << "<li>" << tr ("Click on an axis tick mark, or intersection of two grid lines, with labeled coordinates, away from the other axis point") << "</li>\n";
122  str << "<li>" << tr ("Enter the coordinates of the axis point") << "</li>\n";
123  str << "<li>" << tr ("Click on Ok") << "</li>\n";
124  str << "</ul>\n";
125  str << TAG_DIV_AXIS_END_2;
126  str << "<p>" << TAG_ANCHOR_AXIS_3 << "&nbsp;" << tr ("Add third of three axis points.") << " " << TAG_AHREF_AXIS_3 << "</p>\n";
127  str << TAG_DIV_AXIS_START_3;
128  str << "<ul>\n";
129  str << "<li>" << tr ("Click on") << " <img src="":/engauge/img/16-DigitAxis""> " << tr ("for <b>Axis Points</b> mode") << "</li>\n";
130  str << "<li>" << tr ("Click on an axis tick mark, or intersection of two grid lines, with labeled coordinates, away from the other axis points") << "</li>\n";
131  str << "<li>" << tr ("Enter the coordinates of the axis point") << "</li>\n";
132  str << "<li>" << tr ("Click on Ok") << "</li>\n";
133  str << "</ul>\n";
134  str << TAG_DIV_AXIS_END_3;
135 
136  str << "<p>&nbsp;</p>\n";
137  str << "<p>" << tr ("Points are digitized along each curve:") << "</p>\n";
138  QStringList::const_iterator itr;
139  for (itr = curveNames.begin(); itr != curveNames.end(); itr++) {
140 
141  QString curveName = *itr;
142 
143  QString tagACurve = QString ("%1%2%3")
144  .arg (TAG_AHREF_DELIMITER_START)
145  .arg (curveName)
146  .arg (TAG_AHREF_DELIMITER_END);
147 
148  str << "<p>" << TAG_ANCHOR_DELIMITER_START << curveName << TAG_ANCHOR_DELIMITER_END
149  << "&nbsp;" << tr ("Add points for curve") << " <b>" << curveName << "</b>. " << tagACurve << "</p>\n";
150  str << TAG_DIV_DELIMITER_START << curveName << TAG_DIV_DELIMITER_END;
151  str << "<ul>\n";
152 
153  if (withLines) {
154 
155  str << "<li>" << tr ("Click on") << " <img src="":/engauge/img/16-DigitSegment""> " << tr ("for <b>Segment Fill</b> mode") << "</li>\n";
156  str << "<li>" << tr ("Select curve") << " <b>" << curveName << "</b> " << tr ("in the drop-down list") << "</li>\n";
157  str << "<li>" << tr ("Move the cursor over the curve. If a line does not appear then adjust the <b>Color Filter</b> settings for this curve") << ":\n";
158  str << templateHtmlToAdjustColorFilterSettings () << "</li>\n";
159  str << "<li>" << tr ("Move the cursor over the curve again. When the <b>Segment Fill</b> line appears, click on it to generate points") << "</li>\n";
160  str << "</ul>\n";
161 
162  } else {
163 
164  str << "<li>" << tr ("Click on") << " <img src="":/engauge/img/16-DigitPointMatch""> " << tr ("for <b>Point Match</b> mode") << "</li>\n";
165  str << "<li>" << tr ("Select curve") << " <b>" << curveName << "</b> " << tr ("in the drop-down list") << "</li>\n";
166  str << "<li>" << tr ("Move the cursor over a typical point in the curve. If the cursor circle does not change color then adjust "
167  "the <b>Color Filter</b> settings for this curve") << ":\n";
168  str << templateHtmlToAdjustColorFilterSettings () << "</li>\n";
169  str << "<li>" << tr ("Move the cursor over a typical point in the curve again. Click on the point to start point matching") << "</li>\n";
170  str << "<li>" << tr ("Engauge will display a candidate point. To accept that candidate point, press the right arrow key") << "</li>\n";
171  str << "<li>" << tr ("The previous step repeats until you select a different mode") << "</li>\n";
172  str << "</ul>\n";
173  }
174 
175  str << TAG_DIV_DELIMITER_START_SLASH << curveName << TAG_DIV_DELIMITER_END;
176  }
177 
178  str << "<p>&nbsp;</p>\n";
179  str << "<p>" << tr ("The digitized points can be exported") << ":</p>\n";
180  str << "<p>" << TAG_ANCHOR_EXPORT << "&nbsp;" << tr ("Export the points to a file") << ". " << TAG_AHREF_EXPORT << "</p>\n";
181  str << TAG_DIV_EXPORT_START;
182  str << "<ul>\n";
183  str << "<li>" << tr ("Select menu option <b>File / Export</b>") << "</li>\n";
184  str << "<li>" << tr ("Enter the file name") << "</li>\n";
185  str << "<li>" << tr ("Click on Ok") << "</li>\n";
186  str << "<li>" << tr ("Congratulations!") << "</li>\n";
187  str << "</ul>\n";
188  str << TAG_DIV_EXPORT_END;
189 
190  str << "<p>&nbsp;</p>\n";
191  str << "<p>" << tr ("Hint - The background image can be switched between the original image and filtered image.") << " " << TAG_AHREF_BACKGROUND << "</p>\n";
192  str << TAG_DIV_BACKGROUND_START;
193  str << "<ul>\n";
194  str << "<li>" << tr ("Select menu option <b>View / Background / Show Original Image</b> to see the original image") << "</li>\n";
195  str << "<li>" << tr ("Select menu option <b>View / Background / Show Filtered Image</b> to see the image from <b>Color Filter</b>") << "</li>\n";
196  str << "</ul>\n";
197  str << TAG_DIV_BACKGROUND_END;
198 
199  return html;
200 }
201 
202 QString ChecklistGuideWizard::templateHtmlToAdjustColorFilterSettings () const
203 {
204  LOG4CPP_INFO_S ((*mainCat)) << "ChecklistGuideWizard::templateHtmlToAdjustColorFilterSettings";
205 
206  QString html;
207  QTextStream str (&html);
208 
209  str << " <ul>\n";
210  str << " <li>" << tr ("Select menu option <b>Settings / Color Filter</b>") << "<li>\n";
211  str << " <li>" << tr ("Select the method for filtering. Hue is best if the curves have different colors") << "</li>\n";
212  str << " <li>" << tr ("Slide the green buttons back and forth until the curve is easily visible in the preview window") << "</li>\n";
213  str << " <li>" << tr ("Click on Ok") << "</li>\n";
214  str << " </ul>\n";
215 
216  return html;
217 }
static LineStyle defaultGraphCurve(int index)
Initial default for index&#39;th graph curve.
Definition: LineStyle.cpp:84
void addGraphCurveAtEnd(Curve curve)
Append new graph Curve to end of Curve list.
ChecklistGuideWizard(MainWindow &mainWindow, unsigned int numberCoordSystem)
Single constructor.
static ColorFilterSettings defaultFilter()
Initial default for any Curve.
Container for all graph curves. The axes point curve is external to this class.
Definition: CurvesGraphs.h:24
int numCurves() const
Current number of graphs curves.
Container for LineStyle and PointStyle for one Curve.
Definition: CurveStyle.h:18
Container for one set of digitized Points.
Definition: Curve.h:33
This class sets up the introduction page.
QStringList curveNames(CoordSystemIndex coordSystemIndex) const
Curve names to be placed into Document.
This class adds validation to the Curves page.
This class uses the validation method of the Conclusion page to perform final processing for Checklis...
static PointStyle defaultGraphCurve(int index)
Initial default for index&#39;th graph curve.
Definition: PointStyle.cpp:83
QString templateHtml(CoordSystemIndex coordSystemIndex) const
Template html comprising the checklist for display.
void populateCurvesGraphs(CoordSystemIndex coordSystemIndex, CurvesGraphs &curvesGraphs)
Create entries in CurvesGraphs for each curve name that user provided.
Main window consisting of menu, graphics scene, status bar and optional toolbars as a Single Document...
Definition: MainWindow.h:89