2020-08-31 04:03:41 +08:00
|
|
|
#include "tracewidget.h"
|
|
|
|
#include "ui_tracewidget.h"
|
|
|
|
#include "trace.h"
|
|
|
|
#include <QKeyEvent>
|
|
|
|
#include "traceeditdialog.h"
|
|
|
|
#include "traceimportdialog.h"
|
2020-12-12 03:28:40 +08:00
|
|
|
#include "tracetouchstoneexport.h"
|
2020-08-31 04:03:41 +08:00
|
|
|
#include <QFileDialog>
|
2020-11-22 07:41:42 +08:00
|
|
|
#include <QDrag>
|
|
|
|
#include <QMimeData>
|
|
|
|
#include <QDebug>
|
2020-08-31 04:03:41 +08:00
|
|
|
|
2020-11-25 01:08:00 +08:00
|
|
|
TraceWidget::TraceWidget(TraceModel &model, QWidget *parent) :
|
2020-08-31 04:03:41 +08:00
|
|
|
QWidget(parent),
|
|
|
|
ui(new Ui::TraceWidget),
|
2020-11-25 01:08:00 +08:00
|
|
|
model(model)
|
2020-08-31 04:03:41 +08:00
|
|
|
{
|
|
|
|
ui->setupUi(this);
|
|
|
|
ui->view->setModel(&model);
|
|
|
|
ui->view->setAutoScroll(false);
|
2020-11-22 07:41:42 +08:00
|
|
|
ui->view->viewport()->installEventFilter(this);
|
2020-11-25 01:08:00 +08:00
|
|
|
connect(ui->bImport, &QPushButton::clicked, this, &TraceWidget::importDialog);
|
|
|
|
connect(ui->bExport, &QPushButton::clicked, this, &TraceWidget::exportDialog);
|
2020-08-31 04:03:41 +08:00
|
|
|
installEventFilter(this);
|
|
|
|
createCount = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
TraceWidget::~TraceWidget()
|
|
|
|
{
|
|
|
|
delete ui;
|
|
|
|
}
|
|
|
|
|
|
|
|
void TraceWidget::on_add_clicked()
|
|
|
|
{
|
|
|
|
createCount++;
|
2020-11-25 01:08:00 +08:00
|
|
|
auto t = new Trace("Trace #"+QString::number(createCount), Qt::darkYellow, defaultParameter());
|
2020-08-31 04:03:41 +08:00
|
|
|
t->setColor(QColor::fromHsl((createCount * 50) % 360, 250, 128));
|
|
|
|
model.addTrace(t);
|
2021-02-22 20:39:47 +08:00
|
|
|
ui->view->selectRow(model.getTraces().size() - 1);
|
|
|
|
on_edit_clicked();
|
2020-08-31 04:03:41 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void TraceWidget::on_remove_clicked()
|
|
|
|
{
|
2020-11-23 10:32:18 +08:00
|
|
|
QModelIndex index = ui->view->currentIndex();
|
|
|
|
if (index.isValid()) { // if nothing clicked, index.row() = -1
|
|
|
|
model.removeTrace(index.row());
|
|
|
|
// otherwise, TraceModel casts index to unsigned int and compares with traces.size() which is int
|
|
|
|
};
|
2020-08-31 04:03:41 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
bool TraceWidget::eventFilter(QObject *, QEvent *event)
|
|
|
|
{
|
|
|
|
if (event->type() == QEvent::KeyPress) {
|
|
|
|
int key = static_cast<QKeyEvent *>(event)->key();
|
|
|
|
if(key == Qt::Key_Escape) {
|
|
|
|
ui->view->clearSelection();
|
|
|
|
return true;
|
|
|
|
} else if(key == Qt::Key_Delete) {
|
|
|
|
model.removeTrace(ui->view->currentIndex().row());
|
|
|
|
return true;
|
|
|
|
}
|
2020-11-22 07:41:42 +08:00
|
|
|
} else if(event->type() == QEvent::MouseButtonPress) {
|
|
|
|
auto mouseEvent = static_cast<QMouseEvent*>(event);
|
|
|
|
if (mouseEvent->button() == Qt::LeftButton) {
|
|
|
|
auto index = ui->view->indexAt(mouseEvent->pos());
|
|
|
|
if(index.isValid()) {
|
|
|
|
dragStartPosition = mouseEvent->pos();
|
|
|
|
dragTrace = model.trace(index.row());
|
|
|
|
} else {
|
|
|
|
dragTrace = nullptr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
} else if(event->type() == QEvent::MouseMove) {
|
|
|
|
auto mouseEvent = static_cast<QMouseEvent*>(event);
|
|
|
|
if (!(mouseEvent->buttons() & Qt::LeftButton)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (!dragTrace) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if ((mouseEvent->pos() - dragStartPosition).manhattanLength()
|
|
|
|
< QApplication::startDragDistance()) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
QDrag *drag = new QDrag(this);
|
|
|
|
QMimeData *mimeData = new QMimeData;
|
|
|
|
|
|
|
|
QByteArray encodedPointer;
|
|
|
|
QDataStream stream(&encodedPointer, QIODevice::WriteOnly);
|
|
|
|
stream << quintptr(dragTrace);
|
|
|
|
|
|
|
|
mimeData->setData("trace/pointer", encodedPointer);
|
|
|
|
drag->setMimeData(mimeData);
|
|
|
|
|
|
|
|
drag->exec(Qt::CopyAction);
|
|
|
|
return true;
|
2020-08-31 04:03:41 +08:00
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void TraceWidget::on_edit_clicked()
|
|
|
|
{
|
|
|
|
if(ui->view->currentIndex().isValid()) {
|
|
|
|
auto edit = new TraceEditDialog(*model.trace(ui->view->currentIndex().row()));
|
|
|
|
edit->show();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void TraceWidget::on_view_doubleClicked(const QModelIndex &index)
|
|
|
|
{
|
2020-11-25 23:47:29 +08:00
|
|
|
if(index.column() == TraceModel::ColIndexName) {
|
2020-08-31 04:03:41 +08:00
|
|
|
auto edit = new TraceEditDialog(*model.trace(index.row()));
|
|
|
|
edit->show();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void TraceWidget::on_view_clicked(const QModelIndex &index)
|
|
|
|
{
|
2020-11-25 23:47:29 +08:00
|
|
|
switch(index.column()) {
|
|
|
|
case TraceModel::ColIndexVisible:
|
2020-08-31 04:03:41 +08:00
|
|
|
model.toggleVisibility(index.row());
|
2020-11-25 23:47:29 +08:00
|
|
|
break;
|
|
|
|
case TraceModel::ColIndexPlayPause:
|
2020-08-31 04:03:41 +08:00
|
|
|
model.togglePause(index.row());
|
2020-11-25 23:47:29 +08:00
|
|
|
break;
|
|
|
|
case TraceModel::ColIndexMath:
|
|
|
|
model.toggleMath(index.row());
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
2020-08-31 04:03:41 +08:00
|
|
|
}
|
|
|
|
}
|