115 lines
4.0 KiB
C++
115 lines
4.0 KiB
C++
#ifndef TimeAxis_p_H
|
|
#define TimeAxis_p_H
|
|
#include "TimeAxis.h"
|
|
#include "AbsAxis_p.h"
|
|
#include <QTime>
|
|
|
|
namespace YSG {
|
|
struct TimeTick {
|
|
int mIndex;
|
|
QTime time;
|
|
};
|
|
struct TimeAxisTempData : AbsAxisTempData {
|
|
std::list<QTime> mDataList;
|
|
};
|
|
|
|
struct TimeAxisRenderState : AbsAxisRenderState {
|
|
int mTimePointSize{}, mTickSpace{};
|
|
bool mStartCoordToEndCoord = true; // 默认刻度是从startCoord到endCoord运动 此变量反向
|
|
bool mFixedTimePointSize = false;
|
|
};
|
|
|
|
|
|
struct TimeAxisPrivate : AbsAxisPrivate {
|
|
D_Ptr(TimeAxis)
|
|
int mTimePointSize{}, mTickSpace{};
|
|
SpinLock mResizeLock;
|
|
|
|
void resizeEvent(QResizeEvent* event) override {
|
|
SpinLockGuard guard(&mBufferLock);
|
|
SpinLockGuard guard2(&mResizeLock);
|
|
TimeAxisRenderState* sc = renderStateCache();
|
|
if(!sc->mFixedTimePointSize) {
|
|
sc->mTimePointSize = event->size().height() + 1;
|
|
}
|
|
}
|
|
|
|
QVector<QString> createLabelVector(const QVector<double>& ticks, const QLocale& locale, QChar formatChar, int precision) override {
|
|
QVector<QString> ret;
|
|
for(auto tick : mTicks) {
|
|
ret.append(tick.time.toString("mm:ss.zzz"));
|
|
}
|
|
return ret;
|
|
}
|
|
QVector<double> createTickVector(double tickStep, const Range& range) override {
|
|
QVector<double> ret;
|
|
for(TimeTick& tick : mTicks) {
|
|
ret.append(tick.mIndex);
|
|
}
|
|
return ret;
|
|
}
|
|
QVector<double> createSubTickVector(int subTickCount, const QVector<double>& ticks) override{return {};}
|
|
std::list<TimeTick> mTicks;
|
|
// 最小值的范围 lower在这里面循环变化
|
|
int mLower = 0, mLowerMin = 0, mLowerMax{}; //闭区间
|
|
int mTickStart = 0;
|
|
|
|
void pushTime(QTime time) {
|
|
TimeAxisRenderState* s = renderState();
|
|
{ // 获取 坐标轴的起点
|
|
if(s->mStartCoordToEndCoord) {
|
|
if(mLower != mLowerMin) mLower--;
|
|
else {
|
|
mLower = mLowerMax;
|
|
}
|
|
} else {
|
|
if(mLower != mLowerMax) mLower++;
|
|
else {
|
|
mLower = mLowerMin;
|
|
}
|
|
}
|
|
s->mCoordStart = mLower - s->mCoordLength;
|
|
}
|
|
mTickStart = ++mTickStart % s->mTickSpace;
|
|
int endIndex = (int)(s->mCoordStart + s->mCoordLength);
|
|
auto startIndex = (int)s->mCoordStart;
|
|
if(mTickStart == 1) {
|
|
mTicks.emplace_back(TimeTick{s->mStartCoordToEndCoord ? startIndex : endIndex, time});
|
|
}
|
|
while(!mTicks.empty() && (mTicks.front().mIndex > endIndex || mTicks.front().mIndex < startIndex)) mTicks.pop_front();
|
|
}
|
|
|
|
void prepareData() override {
|
|
SpinLockGuard guard(&mBufferLock);
|
|
loadCache();
|
|
TimeAxisTempData *data = tempData();
|
|
TimeAxisRenderState* s = renderState();
|
|
if(mTickSpace != s->mTickSpace) {
|
|
mTickSpace = s->mTickSpace;
|
|
mTickStart = 0;
|
|
}
|
|
if(mTimePointSize != s->mTimePointSize) {
|
|
mTimePointSize = s->mTimePointSize;
|
|
mTicks.clear();
|
|
s->mCoordLength = mTimePointSize - 1;
|
|
renderStateCache()->mCoordLength = mTimePointSize - 1;
|
|
mLower = 0;
|
|
mLowerMax = std::numeric_limits<int>::max() - qAbs((int)s->mCoordLength);
|
|
mTickStart = 0;
|
|
}
|
|
for(QTime& time : data->mDataList) {
|
|
pushTime(time);
|
|
}
|
|
data->mDataList.resize(0);
|
|
renderStateCache()->mCoordStart = renderState()->mCoordStart;
|
|
}
|
|
|
|
void draw(QPainter* painter) override {
|
|
SpinLockGuard guard2(&mResizeLock);
|
|
AbsAxisPrivate::draw(painter);
|
|
}
|
|
|
|
};
|
|
}
|
|
|
|
#endif |