/* Copyright (c) 2015, 2016 Hubert Denkmair 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 . */ #include "TraceWindow.h" #include "ui_TraceWindow.h" #include #include #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) && (modesetTimestampMode(new_mode); _linearTraceViewModel->setTimestampMode(new_mode); if (new_mode != _timestampMode) { _timestampMode = new_mode; for (int i=0; icbTimestampMode->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(); }