2021-06-19 21:33:43 +08:00
|
|
|
#include "markermodel.h"
|
2021-10-21 19:00:34 +08:00
|
|
|
|
|
|
|
#include "markergroup.h"
|
|
|
|
#include "CustomWidgets/siunitedit.h"
|
2020-08-31 04:03:41 +08:00
|
|
|
#include "unit.h"
|
2021-10-21 19:00:34 +08:00
|
|
|
|
2020-08-31 04:03:41 +08:00
|
|
|
#include <QComboBox>
|
|
|
|
#include <QApplication>
|
2020-10-20 23:03:49 +08:00
|
|
|
#include <QDebug>
|
2021-10-21 19:00:34 +08:00
|
|
|
|
2020-08-31 04:03:41 +08:00
|
|
|
|
2020-12-05 19:59:23 +08:00
|
|
|
using namespace std;
|
|
|
|
|
2020-11-03 07:37:06 +08:00
|
|
|
static constexpr int rowHeight = 21;
|
|
|
|
|
2021-06-19 21:33:43 +08:00
|
|
|
MarkerModel::MarkerModel(TraceModel &model, QObject *parent)
|
2020-11-03 07:37:06 +08:00
|
|
|
: QAbstractItemModel(parent),
|
2020-08-31 04:03:41 +08:00
|
|
|
model(model)
|
|
|
|
{
|
2021-05-15 02:34:23 +08:00
|
|
|
model.setMarkerModel(this);
|
2020-08-31 04:03:41 +08:00
|
|
|
markers.clear();
|
2021-06-19 21:33:43 +08:00
|
|
|
root = new Marker(this);
|
2020-11-03 07:37:06 +08:00
|
|
|
}
|
|
|
|
|
2021-06-19 21:33:43 +08:00
|
|
|
MarkerModel::~MarkerModel()
|
2020-11-19 05:47:38 +08:00
|
|
|
{
|
|
|
|
delete root;
|
|
|
|
}
|
|
|
|
|
2021-06-19 21:33:43 +08:00
|
|
|
QModelIndex MarkerModel::index(int row, int column, const QModelIndex &parent) const
|
2020-11-03 07:37:06 +08:00
|
|
|
{
|
|
|
|
if (!hasIndex(row, column, parent)) {
|
|
|
|
return QModelIndex();
|
|
|
|
}
|
|
|
|
if(parent.isValid()) {
|
|
|
|
auto parentItem = markerFromIndex(parent);
|
|
|
|
auto child = parentItem->helperMarker(row);
|
|
|
|
if(child) {
|
|
|
|
return createIndex(row, column, parentItem);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return createIndex(row, column, root);
|
|
|
|
}
|
|
|
|
|
2021-06-19 21:33:43 +08:00
|
|
|
QModelIndex MarkerModel::parent(const QModelIndex &index) const
|
2020-11-03 07:37:06 +08:00
|
|
|
{
|
|
|
|
if (!index.isValid()) {
|
|
|
|
return QModelIndex();
|
|
|
|
}
|
|
|
|
|
|
|
|
auto childItem = markerFromIndex(index);
|
|
|
|
auto *parentItem = childItem->getParent();
|
|
|
|
if(parentItem) {
|
|
|
|
// find out the number of the child
|
|
|
|
auto it = find(markers.begin(), markers.end(), parentItem);
|
|
|
|
auto row = it - markers.begin();
|
|
|
|
return createIndex(row, 0, root);
|
|
|
|
} else {
|
|
|
|
// no parent
|
|
|
|
return QModelIndex();
|
|
|
|
}
|
2020-08-31 04:03:41 +08:00
|
|
|
}
|
|
|
|
|
2021-06-19 21:33:43 +08:00
|
|
|
Marker *MarkerModel::createDefaultMarker()
|
2020-08-31 04:03:41 +08:00
|
|
|
{
|
|
|
|
// find lowest free number
|
|
|
|
int number = 0;
|
|
|
|
bool used;
|
|
|
|
do {
|
|
|
|
number++;
|
|
|
|
used = false;
|
|
|
|
for(auto m : markers) {
|
2020-10-20 03:21:04 +08:00
|
|
|
if(m->getNumber() == number) {
|
2020-08-31 04:03:41 +08:00
|
|
|
used = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} while (used);
|
2021-06-19 21:33:43 +08:00
|
|
|
auto marker = new Marker(this, number);
|
2020-11-23 04:25:41 +08:00
|
|
|
marker->setPosition(2150000000);
|
2020-08-31 04:03:41 +08:00
|
|
|
marker->assignTrace(model.trace(0));
|
|
|
|
return marker;
|
|
|
|
}
|
|
|
|
|
2021-06-19 21:33:43 +08:00
|
|
|
void MarkerModel::addMarker(Marker *t)
|
2020-08-31 04:03:41 +08:00
|
|
|
{
|
|
|
|
beginInsertRows(QModelIndex(), markers.size(), markers.size());
|
|
|
|
markers.push_back(t);
|
|
|
|
endInsertRows();
|
2021-06-19 21:33:43 +08:00
|
|
|
connect(t, &Marker::dataChanged, this, &MarkerModel::markerDataChanged);
|
|
|
|
connect(t, &Marker::typeChanged, this, &MarkerModel::markerDataChanged);
|
|
|
|
connect(t, &Marker::traceChanged, this, &MarkerModel::markerDataChanged);
|
|
|
|
connect(t, &Marker::beginRemoveHelperMarkers, [=](Marker *m) {
|
2020-11-03 07:37:06 +08:00
|
|
|
auto row = find(markers.begin(), markers.end(), m) - markers.begin();
|
|
|
|
auto modelIndex = createIndex(row, 0, root);
|
2020-12-15 23:51:27 +08:00
|
|
|
beginRemoveRows(modelIndex, 0, m->getHelperMarkers().size() - 1);
|
2020-11-03 07:37:06 +08:00
|
|
|
});
|
2021-06-19 21:33:43 +08:00
|
|
|
connect(t, &Marker::endRemoveHelperMarkers, [=](Marker *m) {
|
2020-12-15 23:51:27 +08:00
|
|
|
endRemoveRows();
|
2020-11-03 07:37:06 +08:00
|
|
|
markerDataChanged(m);
|
|
|
|
});
|
2021-06-19 21:33:43 +08:00
|
|
|
connect(t, &Marker::deleted, this, qOverload<Marker*>(&MarkerModel::removeMarker));
|
2020-08-31 04:03:41 +08:00
|
|
|
emit markerAdded(t);
|
|
|
|
}
|
|
|
|
|
2021-06-19 21:33:43 +08:00
|
|
|
void MarkerModel::removeMarker(unsigned int index)
|
2020-08-31 04:03:41 +08:00
|
|
|
{
|
|
|
|
if (index < markers.size()) {
|
|
|
|
beginRemoveRows(QModelIndex(), index, index);
|
|
|
|
markers.erase(markers.begin() + index);
|
|
|
|
endRemoveRows();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-06-19 21:33:43 +08:00
|
|
|
void MarkerModel::removeMarker(Marker *m)
|
2020-08-31 04:03:41 +08:00
|
|
|
{
|
|
|
|
auto it = std::find(markers.begin(), markers.end(), m);
|
|
|
|
if(it != markers.end()) {
|
2020-11-03 07:37:06 +08:00
|
|
|
removeMarker(it - markers.begin());
|
2020-08-31 04:03:41 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-06-19 21:33:43 +08:00
|
|
|
void MarkerModel::markerDataChanged(Marker *m)
|
2020-08-31 04:03:41 +08:00
|
|
|
{
|
2020-10-20 23:03:49 +08:00
|
|
|
auto row = find(markers.begin(), markers.end(), m) - markers.begin();
|
2020-12-10 11:07:52 +08:00
|
|
|
if(m->editingFrequency) {
|
2020-09-21 20:06:20 +08:00
|
|
|
// only update the other columns, do not override editor data
|
2020-10-20 23:03:49 +08:00
|
|
|
emit dataChanged(index(row, ColIndexData), index(row, ColIndexData));
|
2020-09-21 20:06:20 +08:00
|
|
|
} else {
|
2020-11-03 07:37:06 +08:00
|
|
|
emit dataChanged(index(row, ColIndexNumber), index(row, ColIndexData));
|
|
|
|
// also update any potential helper markers
|
|
|
|
for(unsigned int i=0;i<m->getHelperMarkers().size();i++) {
|
|
|
|
auto modelIndex = createIndex(i, 0, m);
|
|
|
|
emit dataChanged(index(i, ColIndexNumber, modelIndex), index(i, ColIndexData, modelIndex));
|
|
|
|
}
|
2020-09-21 20:06:20 +08:00
|
|
|
}
|
2020-08-31 04:03:41 +08:00
|
|
|
}
|
|
|
|
|
2021-06-19 21:33:43 +08:00
|
|
|
void MarkerModel::groupEmptied(MarkerGroup *g)
|
|
|
|
{
|
|
|
|
groups.erase(g);
|
|
|
|
delete g;
|
|
|
|
// notify markers of deleted group
|
|
|
|
for(auto m : markers) {
|
|
|
|
m->updateContextmenu();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
std::set<MarkerGroup *> MarkerModel::getGroups() const
|
|
|
|
{
|
|
|
|
return groups;
|
|
|
|
}
|
|
|
|
|
|
|
|
MarkerGroup *MarkerModel::createMarkerGroup()
|
|
|
|
{
|
|
|
|
// find lowest available number
|
|
|
|
unsigned int number = 0;
|
|
|
|
bool used;
|
|
|
|
do {
|
|
|
|
number++;
|
|
|
|
used = false;
|
|
|
|
for(auto g : groups) {
|
|
|
|
if(g->getNumber() == number) {
|
|
|
|
used = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} while (used);
|
|
|
|
auto group = createMarkerGroup(number);
|
|
|
|
return group;
|
|
|
|
}
|
|
|
|
|
|
|
|
MarkerGroup *MarkerModel::createMarkerGroup(unsigned int number)
|
|
|
|
{
|
|
|
|
auto group = new MarkerGroup(number);
|
|
|
|
groups.insert(group);
|
|
|
|
connect(group, &MarkerGroup::emptied, this, &MarkerModel::groupEmptied);
|
|
|
|
|
|
|
|
// notify markers of additional group
|
|
|
|
for(auto m : markers) {
|
|
|
|
m->updateContextmenu();
|
|
|
|
}
|
|
|
|
return group;
|
|
|
|
}
|
|
|
|
|
|
|
|
void MarkerModel::addToGroupCreateIfNotExisting(Marker *m, unsigned int number)
|
|
|
|
{
|
|
|
|
MarkerGroup *group = nullptr;
|
|
|
|
// find group
|
|
|
|
for(auto g : groups) {
|
|
|
|
if(g->getNumber() == number) {
|
|
|
|
group = g;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(!group) {
|
|
|
|
// group does not exist yet
|
|
|
|
group = createMarkerGroup(number);
|
|
|
|
}
|
|
|
|
group->add(m);
|
|
|
|
}
|
|
|
|
|
|
|
|
Marker *MarkerModel::marker(int index)
|
2020-08-31 04:03:41 +08:00
|
|
|
{
|
|
|
|
return markers.at(index);
|
|
|
|
}
|
|
|
|
|
2021-06-19 21:33:43 +08:00
|
|
|
int MarkerModel::rowCount(const QModelIndex &index) const
|
2020-08-31 04:03:41 +08:00
|
|
|
{
|
2020-11-03 07:37:06 +08:00
|
|
|
if(!index.isValid()) {
|
|
|
|
return markers.size();
|
|
|
|
}
|
|
|
|
auto marker = markerFromIndex(index);
|
|
|
|
return marker->getHelperMarkers().size();
|
2020-08-31 04:03:41 +08:00
|
|
|
}
|
|
|
|
|
2021-06-19 21:33:43 +08:00
|
|
|
int MarkerModel::columnCount(const QModelIndex &) const
|
2020-08-31 04:03:41 +08:00
|
|
|
{
|
2020-10-20 23:03:49 +08:00
|
|
|
return ColIndexLast;
|
2020-08-31 04:03:41 +08:00
|
|
|
}
|
|
|
|
|
2021-06-19 21:33:43 +08:00
|
|
|
QVariant MarkerModel::data(const QModelIndex &index, int role) const
|
2020-08-31 04:03:41 +08:00
|
|
|
{
|
2020-11-03 07:37:06 +08:00
|
|
|
auto marker = markerFromIndex(index);
|
|
|
|
if(role == Qt::DisplayRole) {
|
|
|
|
switch(index.column()) {
|
|
|
|
case ColIndexNumber:
|
|
|
|
return QString::number(marker->getNumber()) + marker->getSuffix();
|
2021-06-19 21:33:43 +08:00
|
|
|
case ColIndexGroup:
|
|
|
|
if(marker->getGroup()) {
|
|
|
|
return QString::number(marker->getGroup()->getNumber());
|
|
|
|
}
|
|
|
|
break;
|
2020-11-03 07:37:06 +08:00
|
|
|
case ColIndexTrace:
|
2020-10-20 03:21:04 +08:00
|
|
|
if(marker->getTrace()) {
|
|
|
|
return marker->getTrace()->name();
|
2020-08-31 04:03:41 +08:00
|
|
|
}
|
|
|
|
break;
|
2020-11-03 07:37:06 +08:00
|
|
|
case ColIndexType:
|
|
|
|
return marker->readableType();
|
|
|
|
case ColIndexSettings:
|
|
|
|
return marker->readableSettings();
|
|
|
|
case ColIndexData:
|
|
|
|
return marker->readableData();
|
2020-08-31 04:03:41 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return QVariant();
|
|
|
|
}
|
|
|
|
|
2021-06-19 21:33:43 +08:00
|
|
|
QVariant MarkerModel::headerData(int section, Qt::Orientation orientation, int role) const
|
2020-08-31 04:03:41 +08:00
|
|
|
{
|
2021-06-19 21:33:43 +08:00
|
|
|
if(orientation == Qt::Horizontal) {
|
|
|
|
switch(role) {
|
|
|
|
case Qt::DecorationRole:
|
|
|
|
switch(section) {
|
|
|
|
case ColIndexGroup: return QIcon(":/icons/chainlink.png");
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case Qt::DisplayRole:
|
|
|
|
switch(section) {
|
|
|
|
case ColIndexNumber: return "#";
|
|
|
|
case ColIndexTrace: return "Trace";
|
|
|
|
case ColIndexType: return "Type";
|
|
|
|
case ColIndexSettings: return "Settings";
|
|
|
|
case ColIndexData: return "Data";
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case Qt::ToolTipRole:
|
|
|
|
case Qt::WhatsThisRole:
|
|
|
|
switch(section) {
|
|
|
|
case ColIndexNumber: return "Marker number, used to identify markers on the graphs";
|
|
|
|
case ColIndexGroup: return "Number of group this marker is linked to. Linked markers move together.";
|
|
|
|
case ColIndexTrace: return "The trace from which the marker gets its data";
|
|
|
|
case ColIndexType: return "Markertype, depending on the type, the marker can be positioned by the user or will be set automatically";
|
|
|
|
case ColIndexSettings: return "Configurable marker parameter, depends on the marker type";
|
|
|
|
case ColIndexData: return "Tracedata at the marker position";
|
|
|
|
}
|
|
|
|
break;
|
2020-08-31 04:03:41 +08:00
|
|
|
}
|
|
|
|
}
|
2021-06-19 21:33:43 +08:00
|
|
|
return QVariant();
|
2020-08-31 04:03:41 +08:00
|
|
|
}
|
|
|
|
|
2021-06-19 21:33:43 +08:00
|
|
|
bool MarkerModel::setData(const QModelIndex &index, const QVariant &value, int)
|
2020-08-31 04:03:41 +08:00
|
|
|
{
|
|
|
|
if((unsigned int) index.row() >= markers.size()) {
|
|
|
|
return false;
|
|
|
|
}
|
2020-11-03 07:37:06 +08:00
|
|
|
auto m = markerFromIndex(index);
|
2020-08-31 04:03:41 +08:00
|
|
|
switch(index.column()) {
|
2020-10-20 23:03:49 +08:00
|
|
|
case ColIndexNumber: {
|
|
|
|
m->setNumber(value.toInt());
|
|
|
|
}
|
|
|
|
break;
|
2020-08-31 04:03:41 +08:00
|
|
|
case ColIndexTrace: {
|
2020-11-23 04:25:41 +08:00
|
|
|
auto info = qvariant_cast<MarkerWidgetTraceInfo>(value);
|
|
|
|
m->assignTrace(info.trace);
|
2020-08-31 04:03:41 +08:00
|
|
|
}
|
|
|
|
break;
|
2020-10-21 01:15:06 +08:00
|
|
|
case ColIndexSettings: {
|
|
|
|
m->adjustSettings(value.toDouble());
|
2020-08-31 04:03:41 +08:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2021-06-19 21:33:43 +08:00
|
|
|
Qt::ItemFlags MarkerModel::flags(const QModelIndex &index) const
|
2020-08-31 04:03:41 +08:00
|
|
|
{
|
2020-12-12 03:28:40 +08:00
|
|
|
int flags = Qt::ItemIsSelectable;
|
2020-08-31 04:03:41 +08:00
|
|
|
switch(index.column()) {
|
2020-10-20 23:03:49 +08:00
|
|
|
case ColIndexNumber: flags |= Qt::ItemIsEnabled | Qt::ItemIsEditable; break;
|
2021-06-19 21:33:43 +08:00
|
|
|
case ColIndexGroup: flags |= Qt::ItemIsEnabled; break;
|
2020-08-31 04:03:41 +08:00
|
|
|
case ColIndexTrace: flags |= Qt::ItemIsEnabled | Qt::ItemIsEditable; break;
|
2020-10-20 23:03:49 +08:00
|
|
|
case ColIndexType: flags |= Qt::ItemIsEnabled | Qt::ItemIsEditable; break;
|
2020-10-21 01:15:06 +08:00
|
|
|
case ColIndexSettings: flags |= Qt::ItemIsEnabled | Qt::ItemIsEditable; break;
|
2020-08-31 04:03:41 +08:00
|
|
|
case ColIndexData: flags |= Qt::ItemIsEnabled; break;
|
|
|
|
}
|
2020-11-03 07:37:06 +08:00
|
|
|
auto marker = markerFromIndex(index);
|
|
|
|
if(marker->getParent()) {
|
|
|
|
// this is a helper marker -> nothing is editable
|
|
|
|
flags &= ~Qt::ItemIsEditable;
|
|
|
|
}
|
2020-08-31 04:03:41 +08:00
|
|
|
return (Qt::ItemFlags) flags;
|
|
|
|
}
|
|
|
|
|
2021-06-19 21:33:43 +08:00
|
|
|
std::vector<Marker *> MarkerModel::getMarkers()
|
2020-08-31 04:03:41 +08:00
|
|
|
{
|
|
|
|
return markers;
|
|
|
|
}
|
|
|
|
|
2021-06-19 21:33:43 +08:00
|
|
|
std::vector<Marker *> MarkerModel::getMarkers(Trace *t)
|
2020-08-31 04:03:41 +08:00
|
|
|
{
|
2021-06-19 21:33:43 +08:00
|
|
|
std::vector<Marker*> attachedMarkers;
|
2020-08-31 04:03:41 +08:00
|
|
|
for(auto m : markers) {
|
2020-10-20 03:21:04 +08:00
|
|
|
if(m->getTrace() == t) {
|
2020-08-31 04:03:41 +08:00
|
|
|
attachedMarkers.push_back(m);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return attachedMarkers;
|
|
|
|
}
|
|
|
|
|
2021-06-19 21:33:43 +08:00
|
|
|
TraceModel &MarkerModel::getModel()
|
2020-08-31 04:03:41 +08:00
|
|
|
{
|
|
|
|
return model;
|
|
|
|
}
|
|
|
|
|
2021-06-19 21:33:43 +08:00
|
|
|
void MarkerModel::updateMarkers()
|
2020-10-20 23:03:49 +08:00
|
|
|
{
|
|
|
|
for(auto m : markers) {
|
|
|
|
m->update();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-06-19 21:33:43 +08:00
|
|
|
Marker *MarkerModel::markerFromIndex(const QModelIndex &index) const
|
2020-11-03 07:37:06 +08:00
|
|
|
{
|
2021-06-19 21:33:43 +08:00
|
|
|
auto m = static_cast<Marker*>(index.internalPointer());
|
2020-11-03 07:37:06 +08:00
|
|
|
if(m == root) {
|
|
|
|
return markers[index.row()];
|
|
|
|
} else {
|
|
|
|
return m->helperMarker(index.row());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-06-19 21:33:43 +08:00
|
|
|
nlohmann::json MarkerModel::toJSON()
|
2020-12-05 19:59:23 +08:00
|
|
|
{
|
|
|
|
nlohmann::json j;
|
|
|
|
for(auto m : markers) {
|
|
|
|
j.push_back(m->toJSON());
|
|
|
|
}
|
|
|
|
return j;
|
|
|
|
}
|
|
|
|
|
2021-06-19 21:33:43 +08:00
|
|
|
void MarkerModel::fromJSON(nlohmann::json j)
|
2020-12-05 19:59:23 +08:00
|
|
|
{
|
|
|
|
// remove old markers
|
|
|
|
while(markers.size() > 0) {
|
|
|
|
removeMarker((unsigned int) 0);
|
|
|
|
}
|
|
|
|
for(auto jm : j) {
|
2021-06-19 21:33:43 +08:00
|
|
|
auto m = new Marker(this);
|
2020-12-05 19:59:23 +08:00
|
|
|
try {
|
|
|
|
m->fromJSON(jm);
|
|
|
|
addMarker(m);
|
|
|
|
} catch (const exception &e) {
|
|
|
|
qWarning() << "Failed to creat marker from JSON:" << e.what();
|
|
|
|
delete m;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// second pass to assign delta markers
|
|
|
|
for(unsigned int i=0;i<markers.size();i++) {
|
2021-06-19 21:33:43 +08:00
|
|
|
if(markers[i]->getType() == Marker::Type::Delta) {
|
2020-12-05 19:59:23 +08:00
|
|
|
if(!j[i].contains("delta_marker")) {
|
|
|
|
qWarning() << "JSON data does not contain assigned delta marker";
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
unsigned int hash = j[i]["delta_marker"];
|
|
|
|
// attempt to find correct marker
|
|
|
|
unsigned int m_delta = 0;
|
|
|
|
for(;m_delta < markers.size();m_delta++) {
|
|
|
|
auto m = markers[m_delta];
|
|
|
|
if(m->toHash() == hash) {
|
|
|
|
markers[i]->assignDeltaMarker(m);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(m_delta >= markers.size()) {
|
|
|
|
qWarning() << "Unable to find assigned delta marker:" << hash;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// All done loading the markers, trigger update of persistent editors
|
|
|
|
emit setupLoadComplete();
|
|
|
|
}
|
|
|
|
|
2020-11-20 00:10:47 +08:00
|
|
|
QSize MarkerTraceDelegate::sizeHint(const QStyleOptionViewItem &, const QModelIndex &) const
|
2020-11-03 07:37:06 +08:00
|
|
|
{
|
|
|
|
return QSize(0, rowHeight);
|
|
|
|
}
|
|
|
|
|
2020-10-20 23:03:49 +08:00
|
|
|
QWidget *MarkerTraceDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &index) const
|
2020-08-31 04:03:41 +08:00
|
|
|
{
|
2021-06-19 21:33:43 +08:00
|
|
|
auto model = (MarkerModel*) index.model();
|
2020-08-31 04:03:41 +08:00
|
|
|
auto c = new QComboBox(parent);
|
2020-11-03 07:37:06 +08:00
|
|
|
c->setMaximumHeight(rowHeight);
|
2020-08-31 04:03:41 +08:00
|
|
|
connect(c, qOverload<int>(&QComboBox::currentIndexChanged), [c](int) {
|
|
|
|
c->clearFocus();
|
|
|
|
});
|
|
|
|
auto traces = model->getModel().getTraces();
|
|
|
|
for(auto t : traces) {
|
2020-11-23 04:25:41 +08:00
|
|
|
MarkerWidgetTraceInfo info;
|
|
|
|
info.trace = t;
|
|
|
|
c->addItem(t->name(), QVariant::fromValue(info));
|
2020-08-31 04:03:41 +08:00
|
|
|
}
|
|
|
|
return c;
|
|
|
|
}
|
|
|
|
|
2020-10-20 23:03:49 +08:00
|
|
|
void MarkerTraceDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
|
2020-08-31 04:03:41 +08:00
|
|
|
{
|
2021-06-19 21:33:43 +08:00
|
|
|
auto marker = static_cast<const MarkerModel*>(index.model())->markerFromIndex(index);
|
2020-08-31 04:03:41 +08:00
|
|
|
auto c = (QComboBox*) editor;
|
2020-11-23 04:25:41 +08:00
|
|
|
MarkerWidgetTraceInfo markerInfo;
|
|
|
|
markerInfo.trace = marker->trace();
|
2020-08-31 04:03:41 +08:00
|
|
|
for(int i=0;i<c->count();i++) {
|
2020-11-23 04:25:41 +08:00
|
|
|
auto info = qvariant_cast<MarkerWidgetTraceInfo>(c->itemData(i));
|
|
|
|
if(info == markerInfo) {
|
2020-08-31 04:03:41 +08:00
|
|
|
c->setCurrentIndex(i);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-10-20 23:03:49 +08:00
|
|
|
void MarkerTraceDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
|
2020-08-31 04:03:41 +08:00
|
|
|
{
|
2021-06-19 21:33:43 +08:00
|
|
|
auto markerModel = (MarkerModel*) model;
|
2020-08-31 04:03:41 +08:00
|
|
|
auto c = (QComboBox*) editor;
|
|
|
|
markerModel->setData(index, c->itemData(c->currentIndex()));
|
|
|
|
}
|
2020-09-21 20:06:20 +08:00
|
|
|
|
2020-11-20 00:10:47 +08:00
|
|
|
QSize MarkerSettingsDelegate::sizeHint(const QStyleOptionViewItem &, const QModelIndex &) const
|
2020-11-03 07:37:06 +08:00
|
|
|
{
|
|
|
|
return QSize(0, rowHeight);
|
|
|
|
}
|
|
|
|
|
2020-11-20 00:10:47 +08:00
|
|
|
QWidget *MarkerSettingsDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &index) const
|
2020-09-21 20:06:20 +08:00
|
|
|
{
|
2021-06-19 21:33:43 +08:00
|
|
|
auto marker = static_cast<const MarkerModel*>(index.model())->markerFromIndex(index);
|
2020-12-10 11:07:52 +08:00
|
|
|
marker->editingFrequency = true;
|
2020-10-20 23:03:49 +08:00
|
|
|
auto e = marker->getSettingsEditor();
|
2020-10-23 20:12:45 +08:00
|
|
|
if(e) {
|
2020-11-03 07:37:06 +08:00
|
|
|
e->setMaximumHeight(rowHeight);
|
2020-10-23 20:12:45 +08:00
|
|
|
e->setParent(parent);
|
|
|
|
connect(e, &SIUnitEdit::valueUpdated, this, &MarkerSettingsDelegate::commitData);
|
2020-11-15 07:21:09 +08:00
|
|
|
connect(e, &SIUnitEdit::focusLost, [=](){
|
2020-12-10 11:07:52 +08:00
|
|
|
marker->editingFrequency = false;
|
2020-11-06 20:05:09 +08:00
|
|
|
});
|
2020-10-23 20:12:45 +08:00
|
|
|
}
|
2020-10-20 23:03:49 +08:00
|
|
|
return e;
|
2020-09-21 20:06:20 +08:00
|
|
|
}
|
|
|
|
|
2020-10-21 01:15:06 +08:00
|
|
|
void MarkerSettingsDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
|
2020-09-21 20:06:20 +08:00
|
|
|
{
|
2021-06-19 21:33:43 +08:00
|
|
|
auto markerModel = (MarkerModel*) model;
|
2020-10-20 23:03:49 +08:00
|
|
|
auto si = (SIUnitEdit*) editor;
|
|
|
|
markerModel->setData(index, si->value());
|
|
|
|
}
|
|
|
|
|
2020-11-20 00:10:47 +08:00
|
|
|
QSize MarkerTypeDelegate::sizeHint(const QStyleOptionViewItem &, const QModelIndex &) const
|
2020-11-03 07:37:06 +08:00
|
|
|
{
|
|
|
|
return QSize(0, rowHeight);
|
|
|
|
}
|
|
|
|
|
2020-11-20 00:10:47 +08:00
|
|
|
QWidget *MarkerTypeDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &index) const
|
2020-10-20 23:03:49 +08:00
|
|
|
{
|
2021-06-19 21:33:43 +08:00
|
|
|
auto marker = static_cast<const MarkerModel*>(index.model())->markerFromIndex(index);
|
2020-10-20 23:03:49 +08:00
|
|
|
auto editor = marker->getTypeEditor(const_cast<MarkerTypeDelegate*>(this));
|
2020-11-03 07:37:06 +08:00
|
|
|
editor->setMaximumHeight(rowHeight);
|
2020-10-20 23:03:49 +08:00
|
|
|
editor->setParent(parent);
|
|
|
|
return editor;
|
|
|
|
}
|
|
|
|
|
2020-11-20 00:10:47 +08:00
|
|
|
void MarkerTypeDelegate::setModelData(QWidget *editor, QAbstractItemModel *, const QModelIndex &index) const
|
2020-10-20 23:03:49 +08:00
|
|
|
{
|
2021-06-19 21:33:43 +08:00
|
|
|
auto marker = static_cast<const MarkerModel*>(index.model())->markerFromIndex(index);
|
2020-10-20 23:03:49 +08:00
|
|
|
marker->updateTypeFromEditor(editor);
|
2020-09-21 20:06:20 +08:00
|
|
|
}
|