diff options
Diffstat (limited to 'examples/chart/element.cpp')
-rw-r--r-- | examples/chart/element.cpp | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/examples/chart/element.cpp b/examples/chart/element.cpp new file mode 100644 index 0000000..c29b238 --- /dev/null +++ b/examples/chart/element.cpp @@ -0,0 +1,127 @@ +#include "element.h" + +#include <qstringlist.h> +#include <qtextstream.h> + +const char FIELD_SEP = ':'; +const char PROPOINT_SEP = ';'; +const char XY_SEP = ','; + + +void Element::init( double value, QColor valueColor, int valuePattern, + const QString& label, QColor labelColor ) +{ + m_value = value; + m_valueColor = valueColor; + if ( valuePattern < Qt::SolidPattern || valuePattern > Qt::DiagCrossPattern ) + valuePattern = Qt::SolidPattern; + m_valuePattern = valuePattern; + m_label = label; + m_labelColor = labelColor; +} + + +void Element::setValuePattern( int valuePattern ) +{ + if ( valuePattern < Qt::SolidPattern || valuePattern > Qt::DiagCrossPattern ) + valuePattern = Qt::SolidPattern; + m_valuePattern = valuePattern; +} + + +double Element::proX( int index ) const +{ + Q_ASSERT(index >= 0 && index < MAX_PROPOINTS); + return m_propoints[2 * index]; +} + + +double Element::proY( int index ) const +{ + Q_ASSERT(index >= 0 && index < MAX_PROPOINTS); + return m_propoints[(2 * index) + 1]; +} + + +void Element::setProX( int index, double value ) +{ + Q_ASSERT(index >= 0 && index < MAX_PROPOINTS); + m_propoints[2 * index] = value; +} + + +void Element::setProY( int index, double value ) +{ + Q_ASSERT(index >= 0 && index < MAX_PROPOINTS); + m_propoints[(2 * index) + 1] = value; +} + + +QTextStream &operator<<( QTextStream &s, const Element &element ) +{ + s << element.value() << FIELD_SEP + << element.valueColor().name() << FIELD_SEP + << element.valuePattern() << FIELD_SEP + << element.labelColor().name() << FIELD_SEP; + + for ( int i = 0; i < Element::MAX_PROPOINTS; ++i ) { + s << element.proX( i ) << XY_SEP << element.proY( i ); + s << ( i == Element::MAX_PROPOINTS - 1 ? FIELD_SEP : PROPOINT_SEP ); + } + + s << element.label() << '\n'; + + return s; +} + + +QTextStream &operator>>( QTextStream &s, Element &element ) +{ + QString data = s.readLine(); + element.setValue( Element::INVALID ); + + int errors = 0; + bool ok; + + QStringList fields = QStringList::split( FIELD_SEP, data ); + if ( fields.count() >= 4 ) { + double value = fields[0].toDouble( &ok ); + if ( !ok ) + errors++; + QColor valueColor = QColor( fields[1] ); + if ( !valueColor.isValid() ) + errors++; + int valuePattern = fields[2].toInt( &ok ); + if ( !ok ) + errors++; + QColor labelColor = QColor( fields[3] ); + if ( !labelColor.isValid() ) + errors++; + QStringList propoints = QStringList::split( PROPOINT_SEP, fields[4] ); + QString label = data.section( FIELD_SEP, 5 ); + + if ( !errors ) { + element.set( value, valueColor, valuePattern, label, labelColor ); + int i = 0; + for ( QStringList::iterator point = propoints.begin(); + i < Element::MAX_PROPOINTS && point != propoints.end(); + ++i, ++point ) { + errors = 0; + QStringList xy = QStringList::split( XY_SEP, *point ); + double x = xy[0].toDouble( &ok ); + if ( !ok || x <= 0.0 || x >= 1.0 ) + errors++; + double y = xy[1].toDouble( &ok ); + if ( !ok || y <= 0.0 || y >= 1.0 ) + errors++; + if ( errors ) + x = y = Element::NO_PROPORTION; + element.setProX( i, x ); + element.setProY( i, y ); + } + } + } + + return s; +} + |