First implementation
This commit is contained in:
217
cpp/window/TraceWindow/TraceWindow.cpp
Normal file
217
cpp/window/TraceWindow/TraceWindow.cpp
Normal file
@@ -0,0 +1,217 @@
|
||||
/*
|
||||
|
||||
Copyright (c) 2015, 2016 Hubert Denkmair <hubert@denkmair.de>
|
||||
|
||||
This file is part of cangaroo.
|
||||
|
||||
cangaroo is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
cangaroo is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with cangaroo. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
#include "TraceWindow.h"
|
||||
#include "ui_TraceWindow.h"
|
||||
|
||||
#include <QDomDocument>
|
||||
#include <QSortFilterProxyModel>
|
||||
#include "LinearTraceViewModel.h"
|
||||
#include "AggregatedTraceViewModel.h"
|
||||
#include "TraceFilterModel.h"
|
||||
|
||||
TraceWindow::TraceWindow(QWidget *parent, Backend &backend) :
|
||||
ConfigurableWidget(parent),
|
||||
ui(new Ui::TraceWindow),
|
||||
_backend(&backend)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
_linearTraceViewModel = new LinearTraceViewModel(backend);
|
||||
_linearProxyModel = new QSortFilterProxyModel(this);
|
||||
_linearProxyModel->setSourceModel(_linearTraceViewModel);
|
||||
_linearProxyModel->setDynamicSortFilter(true);
|
||||
|
||||
_aggregatedTraceViewModel = new AggregatedTraceViewModel(backend);
|
||||
_aggregatedProxyModel = new QSortFilterProxyModel(this);
|
||||
_aggregatedProxyModel->setSourceModel(_aggregatedTraceViewModel);
|
||||
_aggregatedProxyModel->setDynamicSortFilter(true);
|
||||
|
||||
_aggFilteredModel = new TraceFilterModel(this);
|
||||
_aggFilteredModel->setSourceModel(_aggregatedProxyModel);
|
||||
_linFilteredModel = new TraceFilterModel(this);
|
||||
_linFilteredModel->setSourceModel(_linearProxyModel);
|
||||
|
||||
|
||||
|
||||
setMode(mode_aggregated);
|
||||
setAutoScroll(false);
|
||||
|
||||
QFont font("Monospace");
|
||||
font.setStyleHint(QFont::TypeWriter);
|
||||
ui->tree->setFont(font);
|
||||
ui->tree->setAlternatingRowColors(true);
|
||||
|
||||
ui->tree->setUniformRowHeights(true);
|
||||
ui->tree->setColumnWidth(0, 120);
|
||||
ui->tree->setColumnWidth(1, 70);
|
||||
ui->tree->setColumnWidth(2, 50);
|
||||
ui->tree->setColumnWidth(3, 90);
|
||||
ui->tree->setColumnWidth(4, 200);
|
||||
ui->tree->setColumnWidth(5, 200);
|
||||
ui->tree->setColumnWidth(6, 50);
|
||||
ui->tree->setColumnWidth(7, 200);
|
||||
ui->tree->sortByColumn(BaseTraceViewModel::column_canid, Qt::AscendingOrder);
|
||||
|
||||
ui->cbTimestampMode->addItem("absolute", 0);
|
||||
ui->cbTimestampMode->addItem("relative", 1);
|
||||
ui->cbTimestampMode->addItem("delta", 2);
|
||||
setTimestampMode(timestamp_mode_delta);
|
||||
|
||||
connect(_linearTraceViewModel, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(rowsInserted(QModelIndex,int,int)));
|
||||
|
||||
connect(ui->filterLineEdit, SIGNAL(textChanged(QString)), this, SLOT(on_cbFilterChanged()));
|
||||
}
|
||||
|
||||
TraceWindow::~TraceWindow()
|
||||
{
|
||||
delete ui;
|
||||
delete _aggregatedTraceViewModel;
|
||||
delete _linearTraceViewModel;
|
||||
}
|
||||
|
||||
void TraceWindow::setMode(TraceWindow::mode_t mode)
|
||||
{
|
||||
bool isChanged = (_mode != mode);
|
||||
_mode = mode;
|
||||
|
||||
if (_mode==mode_linear) {
|
||||
ui->tree->setSortingEnabled(false);
|
||||
ui->tree->setModel(_linFilteredModel); //_linearTraceViewModel);
|
||||
ui->cbAutoScroll->setEnabled(true);
|
||||
} else {
|
||||
ui->tree->setSortingEnabled(true);
|
||||
ui->tree->setModel(_aggFilteredModel); //_aggregatedProxyModel);
|
||||
ui->cbAutoScroll->setEnabled(false);
|
||||
}
|
||||
|
||||
if (isChanged) {
|
||||
ui->cbAggregated->setChecked(_mode==mode_aggregated);
|
||||
emit(settingsChanged(this));
|
||||
}
|
||||
}
|
||||
|
||||
void TraceWindow::setAutoScroll(bool doAutoScroll)
|
||||
{
|
||||
if (doAutoScroll != _doAutoScroll) {
|
||||
_doAutoScroll = doAutoScroll;
|
||||
ui->cbAutoScroll->setChecked(_doAutoScroll);
|
||||
emit(settingsChanged(this));
|
||||
}
|
||||
}
|
||||
|
||||
void TraceWindow::setTimestampMode(int mode)
|
||||
{
|
||||
timestamp_mode_t new_mode;
|
||||
if ( (mode>=0) && (mode<timestamp_modes_count) ) {
|
||||
new_mode = (timestamp_mode_t) mode;
|
||||
} else {
|
||||
new_mode = timestamp_mode_absolute;
|
||||
}
|
||||
|
||||
_aggregatedTraceViewModel->setTimestampMode(new_mode);
|
||||
_linearTraceViewModel->setTimestampMode(new_mode);
|
||||
|
||||
if (new_mode != _timestampMode) {
|
||||
_timestampMode = new_mode;
|
||||
for (int i=0; i<ui->cbTimestampMode->count(); i++) {
|
||||
if (ui->cbTimestampMode->itemData(i).toInt() == new_mode) {
|
||||
ui->cbTimestampMode->setCurrentIndex(i);
|
||||
}
|
||||
}
|
||||
emit(settingsChanged(this));
|
||||
}
|
||||
}
|
||||
|
||||
bool TraceWindow::saveXML(Backend &backend, QDomDocument &xml, QDomElement &root)
|
||||
{
|
||||
if (!ConfigurableWidget::saveXML(backend, xml, root)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
root.setAttribute("type", "TraceWindow");
|
||||
root.setAttribute("mode", (_mode==mode_linear) ? "linear" : "aggregated");
|
||||
root.setAttribute("TimestampMode", _timestampMode);
|
||||
|
||||
QDomElement elLinear = xml.createElement("LinearTraceView");
|
||||
elLinear.setAttribute("AutoScroll", (ui->cbAutoScroll->checkState() == Qt::Checked) ? 1 : 0);
|
||||
root.appendChild(elLinear);
|
||||
|
||||
QDomElement elAggregated = xml.createElement("AggregatedTraceView");
|
||||
elAggregated.setAttribute("SortColumn", _aggregatedProxyModel->sortColumn());
|
||||
root.appendChild(elAggregated);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TraceWindow::loadXML(Backend &backend, QDomElement &el)
|
||||
{
|
||||
if (!ConfigurableWidget::loadXML(backend, el)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
setMode((el.attribute("mode", "linear") == "linear") ? mode_linear : mode_aggregated);
|
||||
setTimestampMode(el.attribute("TimestampMode", "0").toInt());
|
||||
|
||||
QDomElement elLinear = el.firstChildElement("LinearTraceView");
|
||||
setAutoScroll(elLinear.attribute("AutoScroll", "0").toInt() != 0);
|
||||
|
||||
QDomElement elAggregated = el.firstChildElement("AggregatedTraceView");
|
||||
int sortColumn = elAggregated.attribute("SortColumn", "-1").toInt();
|
||||
ui->tree->sortByColumn(sortColumn);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void TraceWindow::rowsInserted(const QModelIndex &parent, int first, int last)
|
||||
{
|
||||
(void) parent;
|
||||
(void) first;
|
||||
(void) last;
|
||||
|
||||
if ((_mode==mode_linear) && (ui->cbAutoScroll->checkState() == Qt::Checked)) {
|
||||
ui->tree->scrollToBottom();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void TraceWindow::on_cbAggregated_stateChanged(int i)
|
||||
{
|
||||
setMode( (i==Qt::Checked) ? mode_aggregated : mode_linear );
|
||||
}
|
||||
|
||||
void TraceWindow::on_cbAutoScroll_stateChanged(int i)
|
||||
{
|
||||
setAutoScroll(i==Qt::Checked);
|
||||
}
|
||||
|
||||
void TraceWindow::on_cbTimestampMode_currentIndexChanged(int index)
|
||||
{
|
||||
setTimestampMode((timestamp_mode_t)ui->cbTimestampMode->itemData(index).toInt());
|
||||
}
|
||||
|
||||
void TraceWindow::on_cbFilterChanged()
|
||||
{
|
||||
_aggFilteredModel->setFilterText(ui->filterLineEdit->text());
|
||||
_linFilteredModel->setFilterText(ui->filterLineEdit->text());
|
||||
_aggFilteredModel->invalidate();
|
||||
_linFilteredModel->invalidate();
|
||||
}
|
||||
Reference in New Issue
Block a user