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 "DocumentModelSegments.h"
9 #include "DocumentSerialize.h"
10 #include "Logger.h"
11 #include <QObject>
12 #include <QTextStream>
13 #include <QXmlStreamWriter>
14 #include "Xml.h"
15 
16 const double DEFAULT_POINT_SEPARATION = 25;
17 const double DEFAULT_MIN_LENGTH = 2;
18 const double DEFAULT_LINE_WIDTH = 4;
19 const ColorPalette DEFAULT_LINE_COLOR (COLOR_PALETTE_GREEN);
20 
DocumentModelSegments()21 DocumentModelSegments::DocumentModelSegments() :
22   m_pointSeparation (DEFAULT_POINT_SEPARATION),
23   m_minLength (DEFAULT_MIN_LENGTH),
24   m_fillCorners (false),
25   m_lineWidth (DEFAULT_LINE_WIDTH),
26   m_lineColor (DEFAULT_LINE_COLOR)
27 {
28 }
29 
DocumentModelSegments(const Document & document)30 DocumentModelSegments::DocumentModelSegments(const Document &document) :
31   m_pointSeparation (document.modelSegments().pointSeparation()),
32   m_minLength (document.modelSegments().minLength()),
33   m_fillCorners (document.modelSegments().fillCorners()),
34   m_lineWidth (document.modelSegments().lineWidth()),
35   m_lineColor (document.modelSegments().lineColor())
36 {
37 }
38 
DocumentModelSegments(const DocumentModelSegments & other)39 DocumentModelSegments::DocumentModelSegments(const DocumentModelSegments &other) :
40   m_pointSeparation (other.pointSeparation()),
41   m_minLength (other.minLength()),
42   m_fillCorners (other.fillCorners ()),
43   m_lineWidth (other.lineWidth()),
44   m_lineColor (other.lineColor())
45 {
46 }
47 
operator =(const DocumentModelSegments & other)48 DocumentModelSegments &DocumentModelSegments::operator=(const DocumentModelSegments &other)
49 {
50   m_pointSeparation = other.pointSeparation();
51   m_minLength = other.minLength();
52   m_fillCorners = other.fillCorners ();
53   m_lineWidth = other.lineWidth();
54   m_lineColor = other.lineColor();
55 
56   return *this;
57 }
58 
fillCorners() const59 bool DocumentModelSegments::fillCorners () const
60 {
61   return m_fillCorners;
62 }
63 
lineColor() const64 ColorPalette DocumentModelSegments::lineColor() const
65 {
66   return m_lineColor;
67 }
68 
lineWidth() const69 double DocumentModelSegments::lineWidth() const
70 {
71   return m_lineWidth;
72 }
73 
loadXml(QXmlStreamReader & reader)74 void DocumentModelSegments::loadXml(QXmlStreamReader &reader)
75 {
76   LOG4CPP_INFO_S ((*mainCat)) << "DocumentModelSegments::loadXml";
77 
78   bool success = true;
79 
80   // Read until end of this subtree
81   while ((reader.tokenType() != QXmlStreamReader::EndElement) ||
82   (reader.name() != DOCUMENT_SERIALIZE_SEGMENTS)){
83     loadNextFromReader(reader);
84     if (reader.atEnd()) {
85       success = false;
86       break;
87     }
88   }
89 
90   if (!success) {
91     reader.raiseError(QObject::tr ("Cannot read segment data"));
92   }
93 }
94 
minLength() const95 double DocumentModelSegments::minLength() const
96 {
97   return m_minLength;
98 }
99 
pointSeparation() const100 double DocumentModelSegments::pointSeparation() const
101 {
102   return m_pointSeparation;
103 }
104 
printStream(QString indentation,QTextStream & str) const105 void DocumentModelSegments::printStream(QString indentation,
106                                         QTextStream &str) const
107 {
108   str << indentation << "DocumentModelSegments\n";
109 
110   indentation += INDENTATION_DELTA;
111 
112   str << indentation << "pointSeparation=" << m_pointSeparation << "\n";
113   str << indentation << "minLength=" << m_minLength << "\n";
114   str << indentation << "fillCorners=" << (m_fillCorners ? "true" : "false") << "\n";
115   str << indentation << "lineWidth=" << m_lineWidth << "\n";
116   str << indentation << "lineColor=" << colorPaletteToString (m_lineColor) << "\n";
117 }
118 
saveXml(QXmlStreamWriter & writer) const119 void DocumentModelSegments::saveXml(QXmlStreamWriter &writer) const
120 {
121   LOG4CPP_INFO_S ((*mainCat)) << "DocumentModelSegments::saveXml";
122 
123   writer.writeStartElement(DOCUMENT_SERIALIZE_SEGMENTS);
124   writer.writeAttribute(DOCUMENT_SERIALIZE_SEGMENTS_POINT_SEPARATION, QString::number (m_pointSeparation));
125   writer.writeAttribute(DOCUMENT_SERIALIZE_SEGMENTS_MIN_LENGTH, QString::number (m_minLength));
126   writer.writeAttribute(DOCUMENT_SERIALIZE_SEGMENTS_FILL_CORNERS, m_fillCorners ?
127                           DOCUMENT_SERIALIZE_BOOL_TRUE :
128                           DOCUMENT_SERIALIZE_BOOL_FALSE);
129   writer.writeAttribute(DOCUMENT_SERIALIZE_SEGMENTS_LINE_WIDTH, QString::number (m_lineWidth));
130   writer.writeAttribute(DOCUMENT_SERIALIZE_SEGMENTS_LINE_COLOR, QString::number (m_lineColor));
131   writer.writeAttribute(DOCUMENT_SERIALIZE_SEGMENTS_LINE_COLOR_STRING, colorPaletteToString (m_lineColor));
132   writer.writeEndElement();
133 }
134 
setFillCorners(bool fillCorners)135 void DocumentModelSegments::setFillCorners (bool fillCorners)
136 {
137   m_fillCorners = fillCorners;
138 }
139 
setLineColor(ColorPalette lineColor)140 void DocumentModelSegments::setLineColor(ColorPalette lineColor)
141 {
142   m_lineColor = lineColor;
143 }
144 
setLineWidth(double lineWidth)145 void DocumentModelSegments::setLineWidth(double lineWidth)
146 {
147   m_lineWidth = lineWidth;
148 }
149 
setMinLength(double minLength)150 void DocumentModelSegments::setMinLength(double minLength)
151 {
152   m_minLength = minLength;
153 }
154 
setPointSeparation(double pointSeparation)155 void DocumentModelSegments::setPointSeparation(double pointSeparation)
156 {
157   m_pointSeparation = pointSeparation;
158 }
159