#ifndef TIMELINEITEM_H
#define TIMELINEITEM_H

/*******************************************************************************
** TimeLine-TimeLineItem
** author dsc
**
** TimeLine的核心组件，用于展现时间刻度线、时间点文字等信息，通过重绘来模拟
** 鼠标的拖拽、缩放等操作。
** 时刻分级必须保证可以被所属时刻区间整除，例如分钟内分级，必须可以被60整除，如3分、20分等，不能是7分、8分等
** 如此才能保证时间刻度会压在“正点时刻”，例如20mRange，时刻点为20:00、20:20、20:40、21:00，3mRange，
** 时刻点为20:00，20:03、20:06...20:57、21:00。
** 这样可以保证拖动时跨越时间区间时，左右时刻可以无缝的转换，从而完成平滑的拖动效果
**
******************************************************************************/
#include "global.h"
#include <QGraphicsObject>
#include <QDateTime>

namespace TimeLine
{

class TimeLineItemPrivate;
class TimeLineItem : public QGraphicsObject
{
    Q_OBJECT

public:
    explicit TimeLineItem();
    virtual ~TimeLineItem();

    virtual QRectF boundingRect() const;
    void updateBoundingRect(const QRect&);
    void setLineColor(QColor);
    void setScaleSize(int);
    void setState(DateTimeWidgetState);

    void setTime(const QDateTime&);
    QDateTime time();

    qint64 getOffsetTimeValue(int); //获取时间的偏移值(相对当前时间，在鼠标移动拖拽时调用，通过拖拽时同步更改当前时间继而重绘时间轴从而模拟出拖拽效果)

    void zoomIn();
    void zoomOut();
    void setTimeUnit(TimeUnit);
    TimeUnit timeUnit();

protected:
    virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*);

private:
    void drawScaleLine(QPainter*);
    void drawTimeText(QPainter*, int);
    QDateTime calculateRightTime(); //计算当前时间右侧第一个需要输出展示的时间点
    int calculateRightTimePos(); //计算右侧时间点的坐标位置
    QDateTime calculateTime(double); //计算给定参数值所对应的时间，参数为scalesize的倍数
    QDateTime getTime(int); //获取坐标点（X）所对应的时间

private:
    TimeLineItemPrivate* d_ptr;
    friend class TimeLineWidget;
};

} // namespace TimeLine

#endif
