10 #include "rapidjson/document.h"
11 #include "rapidjson/reader.h"
12 #include "rapidjson/filereadstream.h"
13 #include <QApplication>
22 :
QAbstractItemModel(obj), mWaveDataList(wdlist), mWaveItemHash(wHash), mGraphicsCanvas(wgc),
23 mDragCommand(None), mDragIsGroup(false),
24 mCursorTime(0), mCursorXpos(0),
25 mReorderRequestWaiting(0), mNumberEntriesChangedEvents(0)
51 if (!grp)
return mRoot;
94 jitem[
"id"] = (int) wd->id();
95 jitem[
"name"] = wd->name().toStdString();
96 jitem[
"type"] = (int) wd->composedType();
107 jzoom[
"scale"] = (double) wzs.scale();
108 jzoom[
"tleft"] = (uint64_t) wzs.leftTime();
109 jzoom[
"width"] = (int) wzs.width();
125 rapidjson::FileReadStream frs(
ff, buffer,
sizeof(buffer));
126 rapidjson::Document document;
127 document.ParseStream<0, rapidjson::UTF8<>, rapidjson::FileReadStream>(frs);
130 if (document.HasParseError() || !document.HasMember(
"waveform_viewer"))
return;
131 auto jwfv = document[
"waveform_viewer"].GetObject();
135 for (
auto it = mWaveItemHash->
begin(); it != mWaveItemHash->
end(); ++it)
137 mWaveItemHash->
clear();
139 if (jwfv.HasMember(
"items"))
141 for (
auto& jitem : jwfv[
"items"].GetArray())
144 u32 id = jitem.HasMember(
"id") ? jitem[
"id"].GetUint() : 0;
146 std::string
name = jitem.HasMember(
"name") ? jitem[
"name"].GetString() : std::string();
147 int composedType = jitem.HasMember(
"type") ? jitem[
"type"].GetInt() : 0;
149 switch (composedType)
198 if (jwfv.HasMember(
"zoom_history"))
201 for (
auto& jzoom : jwfv[
"zoom_history"].GetArray())
203 float sc = jzoom.HasMember(
"scale") ? jzoom[
"scale"].GetDouble() : 1.;
204 float tl = jzoom.HasMember(
"tleft") ? jzoom[
"tleft"].GetUint64() : 0;
205 float wd = jzoom.HasMember(
"width") ? jzoom[
"width"].GetInt() : 640;
217 QModelIndexList retval;
244 QModelIndexList retval;
254 if (netIds.
contains(grpChild->id()))
255 for (
int icol=0; icol<3; icol++)
262 if (netIds.
contains(rootChild->id()))
263 for (
int icol=0; icol<3; icol++)
271 void WaveTreeModel::emitReorder()
280 if (mWaveItemHash->
contains(wii))
return;
291 if (mWaveItemHash->
contains(wii))
return;
302 if (mWaveItemHash->
contains(wii))
return;
311 int oldCount = mWaveItemHash->
size();
314 int count = mWaveItemHash->
size();
315 if (count != oldCount)
317 ++mNumberEntriesChangedEvents;
324 if (mNumberEntriesChangedEvents <= 0)
return 0;
325 return --mNumberEntriesChangedEvents;
331 if (mWaveItemHash->
contains(wii))
return;
381 for (
u32 netId : netIds)
392 int iRootInx = mRoot->
netIndex(netId);
400 mWaveItemHash->
insert(wii,wi);
404 wi = mWaveItemHash->
value(wii);
417 if (mDragCommand ==
Move)
421 if (inx.internalPointer() == grp)
continue;
422 if (inx.internalPointer() == mRoot)
continue;
434 return QSize(400,28);
438 case 0:
return "Name";
440 case 2:
return "Value";
451 QFont font = qApp->font();
460 return QSize(400,28);
471 int v = valueAtCursor(
index);
491 int v = valueAtCursor(
index);
517 if (!wdTrig)
return -1;
524 if (!wdBool)
return -1;
545 return mRoot->
size();
567 int n = mRoot->
size();
568 for (
int i=0; i<n; i++)
604 mDragIndexList.clear();
611 mDragIsGroup =
false;
618 mDragIndexList = indexList;
622 mDragIndexList.clear();
625 mDragIndexList.append(inx);
630 bool WaveTreeModel::dropGroup(
const QModelIndex &parentTo,
int row)
632 ReorderRequest req(
this);
633 if (row < 0) row = parentTo.
row();
634 bool couldDrop =
false;
638 if (inx.column())
continue;
639 if (inx.internalPointer() != mRoot)
continue;
647 void WaveTreeModel::dropRow(
const QModelIndex& parentTo,
int row)
649 ReorderRequest req(
this);
652 WaveDataGroup* targetGrp =
static_cast<WaveDataGroup*
>(
isLeaveItem(parentTo)
660 if (inxSource.column())
continue;
662 WaveDataGroup* sourceGrp =
static_cast<WaveDataGroup*
>(inxSource.internalPointer());
663 if (targetRow > 0 && sourceGrp == targetGrp && inxSource.row() < targetRow)
673 for (WaveItem* wi : wiTempList)
680 if (tCursor == mCursorTime && xpos == mCursorXpos)
return;
681 if (!mValueThreads.isEmpty())
686 mCursorTime = tCursor;
693 bool workDone =
false;
694 auto it = mValueThreads.find(
item);
695 if (it != mValueThreads.end())
697 workDone = !it.value()->wasAborted();
698 mValueThreads.erase(it);
724 if (!dropParent.
isValid())
return false;
726 if (mDragIsGroup)
return dropGroup(dropParent,row);
734 for (
int i=0; i<n; i++)
737 dropRow(dropParent.
parent(),i+1);
746 dropRow(dropParent,row >= 0 ? row : 0);
757 if (!
parent.isValid())
return false;
758 if (!
data->formats().contains(
"application/x-qabstractitemmodeldatalist"))
return false;
759 if (
parent.internalPointer() == mRoot)
return true;
767 if (!wd)
return false;
774 if (!
parent.isValid())
return;
777 if (row < 0) row = 0;
778 if (row > grp->
size()) row = grp->
size();
784 int grpId = grp->
id();
790 iwave = wdConst->
id();
796 iwave = wdConst->
id();
802 iwave = wdConst->
id();
809 wd = mWaveDataList->
at(iwave);
812 if (iwave < 0 || !wd)
return;
820 mWaveItemHash->
insert(wii,wi);
826 if (!
parent.isValid())
return false;
828 if (!grp)
return false;
829 if (row < 0) row = 0;
830 if (row > grp->
size()) row = grp->
size();
868 void WaveTreeModel::invalidateParent(
const QModelIndex &parentRow)
876 if (!mValueThreads.contains(
item) && !
item->isLoading() && !
item->isThreadBusy())
882 mValueThreads.insert(
item,wvt);
908 WaveItem* wi = mWaveItemHash->
value(wii);
910 int retval = wi->cursorValue(mCursorTime,mCursorXpos);
921 if (!
parent.isValid())
return nullptr;
923 if (!grp)
return nullptr;
948 auto it = mWaveItemHash->
find(wii);
950 if (it != mWaveItemHash->
end())
953 mWaveItemHash->
erase(it);
963 int irow = groupIndex.
row();
967 auto it = mWaveItemHash->
find(wii);
968 if (it != mWaveItemHash->
end())
971 mWaveItemHash->
erase(it);
972 if (wi) mWaveItemHash->
dispose(wi);
985 auto it = mWaveItemHash->
find(wii);
986 if (it != mWaveItemHash->
end())
990 mWaveItemHash->
erase(it);
991 if (wi) mWaveItemHash->
dispose(wi);
1007 int n = grp->
size() - 1;
1008 for (
int i=n; i>=0; i--)
1014 if (it != mWaveItemHash->
end())
1017 mWaveItemHash->
erase(it);
1018 if (wi) mWaveItemHash->
dispose(wi);
1048 if (!wdBool) wdBool =
new WaveDataBoolean(mWaveDataList,boolExpression);
1090 if (iwave >= 0) retval.
insert(iwave);
1096 if (iwave >= 0) retval.
insert(iwave);
1105 if (inx.internalPointer() != mRoot)
1114 if (targetRow==sourceRow)
return false;
1116 if (!grp)
return false;
1126 const char* ctype =
".GBT ";
1153 :
QThread(parent), mItem(item), mWorkDir(workdir), mTpos(tpos), mXpos(xpos), mAbort(false)
1169 void WaveValueThread::handleValueThreadFinished()
JsonWriteObject & add_object()
bool serialize(const std::string &filename)
JsonWriteObject & add_object(const std::string &tag)
JsonWriteArray & add_array(const std::string &tag)
static SimulationSettings * sSimulationSettings
static const int sReadError
Fake data value to indicate all kind of errors.
std::string get_directory() const
Get path to SALEAE directory without filename.
virtual bool isEmpty() const
virtual void recalcData()
virtual WaveData * childAt(int inx) const
virtual void addWaves(const QVector< WaveData * > &wds)
virtual QList< WaveData * > children() const
virtual void insert(int inx, WaveData *wd)
virtual int childIndex(WaveData *wd) const
virtual WaveData * removeAt(int inx)
QList< WaveData * > mGroupList
virtual int netIndex(u32 id) const
SaleaeDirectoryNetEntry::Type composedType() const
QString strValue(int val) const
QMap< u32, WaveDataGroup * > mDataGroups
QMap< u32, WaveDataBoolean * > mDataBooleans
int waveIndexByNetId(u32 id) const
SaleaeDirectory & saleaeDirectory()
void emitTimeframeChanged()
void removeGroup(u32 grpId)
QMap< u32, WaveDataTrigger * > mDataTrigger
bool moveGroupPosition(int sourceRow, int targetRow)
void set_filter_wave(WaveData *wd)
WaveRenderEngine * renderEngine()
void dispose(WaveItem *wi)
WaveItem * addOrReplace(WaveData *wd, WaveItemIndex::IndexType tp, int iwave, int parentId)
const WaveData * wavedata() const
void setWaveData(WaveData *wd)
void setRequest(Request rq)
void clearRequest(Request rq)
QList< WaveZoomShift > & zoomHistory()
void setZoomHistory(const QList< WaveZoomShift > &hist)
bool canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const override
void addWaves(const QVector< WaveData * > &wds)
Qt::DropActions supportedDragActions() const override
WaveItem * removeItemFromHash(int row, const QModelIndex &parent)
QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const override
void handleWaveAddedToGroup(const QVector< u32 > &netIds, int grpId)
void handleWaveRemovedFromGroup(int iwave, int grpId)
int triggerId(const QModelIndex &trigIndex) const
QModelIndexList indexes(const WaveData *wd) const
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
void handleWaveAdded(int iwave)
void numberEntriesChanged(int count)
void handleGroupRenamed(int grpId)
void handleEndValueThread(WaveItem *item)
void forwardEndResetModel()
void insertTrigger(const QModelIndex &trigIndex, const QList< WaveData * > &trigWaves, const QList< int > &toVal, WaveData *wdFilter=nullptr, WaveDataTrigger *wdTrig=nullptr)
QString netName(const QModelIndex &index) const
WaveData * item(const QModelIndex &index) const
void inserted(QModelIndex index)
int decreaseNumberEntriesChangedEvents()
void insertExisting(int row, const QModelIndex &parent, WaveItem *wi)
void handleTriggerAdded(int trigId)
Qt::ItemFlags flags(const QModelIndex &index) const override
void setDragIndexes(const QModelIndexList &indexList)
void handleGroupAboutToBeRemoved(WaveDataGroup *grp)
void handleCursorMoved(u64 tCursor, int xpos)
int waveIndex(const QModelIndex &index) const
void triggerStartValueThread(WaveItem *item) const
int rowCount(const QModelIndex &parent=QModelIndex()) const override
void removeGroup(const QModelIndex &groupIndex)
void handleWaveRenamed(int iwave)
void handleGroupAdded(int grpId)
WaveTreeModel(WaveDataList *wdlist, WaveItemHash *wHash, WaveGraphicsCanvas *wgc, QObject *obj=nullptr)
bool onlyRootItemsSelected(const QModelIndexList &selectList) const
int groupId(const QModelIndex &grpIndex) const
bool insertItem(int row, const QModelIndex &parent, WaveData *wd)
void handleStartValueThread(WaveItem *item)
int booleanId(const QModelIndex &boolIndex) const
bool isLeaveItem(const QModelIndex &index) const
QSet< int > waveDataIndexSet() const
void forwardBeginResetModel()
int columnCount(const QModelIndex &parent=QModelIndex()) const override
void handleGroupUpdated(int grpId)
void insertGroup(const QModelIndex &groupIndex, WaveDataGroup *grp=nullptr)
bool dropMimeData(const QMimeData *mimeData, Qt::DropAction action, int row, int column, const QModelIndex &dropParent) override
void handleUpdateValueColumn()
void insertBoolean(const QModelIndex &boolIndex, const QString &boolExpression, WaveDataBoolean *wdBool=nullptr)
WaveItemIndex hashIndex(const QModelIndex &index) const
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
void handleBooleanAdded(int boolId)
void valueThreadEnds(hal::WaveItem *item)
WaveValueThread(WaveItem *item, const QString &workdir, u64 tpos, int xpos, QObject *parent=nullptr)
void beginRemoveRows(const QModelIndex &parent, int first, int last)
QModelIndex createIndex(int row, int column, void *ptr) const const
void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector< int > &roles)
virtual QMimeData * mimeData(const QModelIndexList &indexes) const const
QString absoluteFilePath(const QString &fileName) const const
QString path() const const
void setBold(bool enable)
void setPixelSize(int pixelSize)
bool contains(const Key &key) const const
QHash::iterator erase(QHash::iterator pos)
QHash::iterator find(const Key &key)
QHash::iterator insert(const Key &key, const T &value)
const T value(const Key &key) const const
void append(const T &value)
const T & at(int i) const const
void insert(int i, const T &value)
void * internalPointer() const const
bool isValid() const const
QModelIndex parent() const const
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QObject * parent() const const
bool contains(const T &value) const const
QSet::iterator insert(const T &value)
QString fromStdString(const std::string &str)
QString number(int n, int base)
std::string toStdString() const const
QByteArray toUtf8() const const
bool contains(const QString &str, Qt::CaseSensitivity cs) const const
void setFieldWidth(int width)
void start(QThread::Priority priority)