/********************************************************************************
 * Copyright (C) 2011-2015 by Stephen Allewell                                  *
 * steve.allewell@gmail.com                                                     *
 *                                                                              *
 * This program is free software; you can redistribute it and/or modify         *
 * it under the terms of the GNU General Public License as published by         *
 * the Free Software Foundation; either version 2 of the License, or            *
 * (at your option) any later version.                                          *
 ********************************************************************************/


/**
 * @file
 * Header file for the Symbol class.
 */


#ifndef Symbol_H
#define Symbol_H

#include <QBrush>
#include <QPainterPath>
#include <QPen>


/**
 * @brief Defines the Symbol class encapsulating the QPainterPath with how it is drawn.
 *
 * The Symbol incorporates the QPainterPath object with additional information as to how
 * it should be drawn. Originally the path was drawn filled, the implementation of this
 * Symbol class allows a fill attribute and a pen width attribute for outline paths. In
 * addition the line end style and line join style can be changed.
 */
class Symbol
{
public:
    Symbol();

    QPainterPath path() const;
    bool filled() const;
    qreal lineWidth() const;
    Qt::PenCapStyle capStyle() const;
    Qt::PenJoinStyle joinStyle() const;

    void setPath(const QPainterPath &path);
    void setFilled(bool filled);
    void setLineWidth(qreal width);
    void setCapStyle(Qt::PenCapStyle penCapStyle);
    void setJoinStyle(Qt::PenJoinStyle penJoinStyle);

    QPen pen() const;
    QBrush brush() const;

    friend QDataStream &operator<<(QDataStream &stream, const Symbol &symbol);
    friend QDataStream &operator>>(QDataStream &stream, Symbol &symbol);

private:
    static const qint32 version = 100;              /**< version of the stream object */

    QPainterPath        m_path;                     /**< the symbols path, incorporates fill method if m_filled is true */
    bool                m_filled;                   /**< true if the path is filled, false if an outline path */
    qreal               m_lineWidth;                /**< width of the pen, this is scaled with the painter */
    Qt::PenCapStyle     m_capStyle;                 /**< pen cap style, see the QPen documentation for details */
    Qt::PenJoinStyle    m_joinStyle;                /**< pen join style, see the QPen documentation for details */
};


QDataStream &operator<<(QDataStream &stream, const Symbol &symbol);
QDataStream &operator>>(QDataStream &stream, Symbol &symbol);


#endif

