#include "gtl_gui_spec_widget.h" #include "gui/ui_gtl_gui_spec_widget.h" #include "gui/gtl_gui_chart_widget.h" #include "gui/gtl_gui_spec_meas_model.h" #include "gui/gtl_gui_spec_meas_delegate.h" #include "gui/gtl_gui_chart_single_markers_view.h" #include "gui/spec/gtl_gui_spec_band_markers_view.h" #include "gui/spec/gtl_gui_spec_harm_markers_view.h" namespace gtl { namespace gui { spec_widget::spec_widget(QWidget *parent, gtl::math::spec::types type, gtl::data_model* model) : QWidget(parent), ui(new Ui::spec_widget) { ui->setupUi(this); _selection_data_model = new gtl::selection_data_model(this); _selection_data_model->setSourceModel(model); ui->signals_->setModel(_selection_data_model); ui->signals_->expandAll(); // ui->signals_->setContextMenuPolicy(Qt::CustomContextMenu); // connect(ui->signals_, &QWidget::customContextMenuRequested, this, &spec_widget::menu_request); // _spectrogramm_action = new QAction(tr("spectrogramm"), this); // connect(_spectrogramm_action, &QAction::triggered, this, &spec_widget::spectrogramm); _chart = new gtl::gui::spec_chart(type, this); gtl::gui::chart_widget *chart_widget = new gtl::gui::chart_widget(_chart, this); ui->splitter->insertWidget(0, chart_widget); connect(_selection_data_model, >l::selection_data_model::selected, _chart, >l::gui::chart::add_ad); connect(_selection_data_model, >l::selection_data_model::deselected, _chart, >l::gui::chart::remove_ad); ui->frequency->disconnect(); ui->frequency->setMaximum(100000); ui->frequency->setValue(_chart->frequency()); connect(ui->frequency, &QDoubleSpinBox::valueChanged, _chart, >l::gui::spec_chart::set_frequency); ui->resolution->disconnect(); ui->resolution->setMaximum(100000); ui->resolution->setValue(_chart->resolution()); connect(ui->resolution, &QDoubleSpinBox::valueChanged, _chart, >l::gui::spec_chart::set_resolution); ui->lines->disconnect(); ui->lines->setMaximum(100000); ui->lines->setValue(_chart->lines()); connect(ui->lines, &QDoubleSpinBox::valueChanged, _chart, >l::gui::spec_chart::set_lines); QMetaEnum meta_enum = QMetaEnum::fromType(); ui->window->disconnect(); ui->window->clear(); for(int i = 0; i < meta_enum.keyCount(); i++) { ui->window->addItem(meta_enum.valueToKey(i)); } // ui->window-> addItems(_chart->windows_list()); ui->window->setCurrentIndex(_chart->window()); connect(ui->window, &QComboBox::currentIndexChanged, _chart, >l::gui::spec_chart::set_window); meta_enum = QMetaEnum::fromType(); ui->type->disconnect(); ui->type->clear(); for(int i = 0; i < meta_enum.keyCount() - 1; i++) ui->type->addItem(meta_enum.valueToKey(i)); ui->type->setCurrentIndex(_chart->type()); connect(ui->type, &QComboBox::currentIndexChanged, _chart, >l::gui::spec_chart::set_type); ui->average->disconnect(); ui->average->setMaximum(100); ui->average->setValue(_chart->average()); connect(ui->average, &QDoubleSpinBox::valueChanged, _chart, >l::gui::spec_chart::set_average); ui->overlap->disconnect(); ui->overlap->setMaximum(99); ui->overlap->setValue(_chart->overlap()); connect(ui->overlap, &QDoubleSpinBox::valueChanged, _chart, >l::gui::spec_chart::set_overlap); ui->unit->disconnect(); ui->unit->clear(); ui->unit->addItem("unit"); ui->unit->addItem("db"); // ui->unit-> addItems(_chart->units_list()); ui->unit->setCurrentIndex(_chart->unit()); connect(ui->unit, &QComboBox::currentIndexChanged, _chart, >l::gui::spec_chart::set_unit); connect(_chart, >l::gui::spec_chart::frequency_changed, this, >l::gui::spec_widget::update_parameters); connect(_chart, >l::gui::spec_chart::resolution_changed, this, >l::gui::spec_widget::update_parameters); connect(_chart, >l::gui::spec_chart::lines_changed, this, >l::gui::spec_widget::update_parameters); connect(_chart, >l::gui::spec_chart::window_changed, this, >l::gui::spec_widget::update_parameters); ui->y_mode->setChecked(_chart->is_axis_y_multi()); connect(ui->y_mode, &QCheckBox::toggled, _chart, >l::gui::chart::set_axis_y_mode); connect(_chart, >l::gui::chart::axis_y_mode_changed, ui->y_mode, &QCheckBox::setChecked); ui->x_log->setVisible(false); connect(ui->x_log, &QCheckBox::toggled, _chart, >l::gui::spec_chart::set_x_log); gui::spec_meas_model *meas_model = new spec_meas_model(this, _selection_data_model->selection()); _chart->set_measures(meas_model); gui::spec_meas_delegate *meas_delegate = new spec_meas_delegate(this, meas_model->channels()); _meas_widget = new gtl::gui::meas_widget(this, meas_model, meas_delegate); ui->tab_parameters->setVisible(false); ui->tab_parameters->addTab(_meas_widget, tr("Meas Parameters")); connect(ui->meas_check, &QCheckBox::toggled, this, &spec_widget::toogle_meas); connect(meas_model, &spec_meas_model::measure_changed, [=]{ _chart->set_measures(meas_model); }); // connect(parent, &QObject::destroyed, [=]{ // delete _chart; // _chart = nullptr; // }); ui->tab_parameters->addTab(new chart_single_markers_view(_chart->single_markers(), this), "Single markers"); ui->tab_parameters->addTab(new spec::band_markers_view(_chart->band_markers(), this), "Band markers"); ui->tab_parameters->addTab(new spec::harm_markers_view(_chart->harm_markers(), this), "Harmonic markers"); } spec_widget::~spec_widget() { if(_chart) delete _chart; if(_meas_widget) delete _meas_widget; delete ui; } void spec_widget::save(QDomElement &root_element) { QDomElement selection_element = root_element.ownerDocument().createElement("selection"); root_element.appendChild(selection_element); _selection_data_model->save(selection_element); QDomElement options_element = root_element.ownerDocument().createElement("options"); root_element.appendChild(options_element); _chart->save(options_element); QDomElement splitter_element = root_element.ownerDocument().createElement("splitter"); root_element.appendChild(splitter_element); splitter_element.setAttribute("state", QString(ui->splitter->saveState().toBase64())); } void spec_widget::load(const QDomElement &root_element) { QDomElement options_element = root_element.firstChildElement("options"); _chart->load(options_element); update_parameters(); QDomElement selection_element = root_element.firstChildElement("selection"); _selection_data_model->load(selection_element); QDomElement splitter_element = root_element.firstChildElement("splitter"); ui->splitter->restoreState(QByteArray::fromBase64(splitter_element.attribute("state", "").toUtf8())); } data_model_node *spec_widget::active_node() { QModelIndex index = ui->signals_->currentIndex(); if(index.isValid() && (index.model()->data(index, Qt::CheckStateRole) == Qt::Checked)) return static_cast(index.internalPointer()); return nullptr; } spgr::widget *spec_widget::create_spgr(QWidget *parent) { return create_spgr(parent, active_node()); } spgr::widget *spec_widget::create_spgr(QWidget *parent, data_model_node *node) { return _chart->create_spgr(parent, node); } void spec_widget::set_type(math::spec::types type) { _chart->set_type(type); } void spec_widget::update_parameters() { ui->type->blockSignals(true); ui->frequency->blockSignals(true); ui->resolution->blockSignals(true); ui->lines->blockSignals(true); ui->window->blockSignals(true); ui->average->blockSignals(true); ui->overlap->blockSignals(true); ui->unit->blockSignals(true); if( ui->type->currentIndex() != _chart->type() ) ui->type->setCurrentIndex(_chart->type()); if( ui->frequency->value() != _chart->frequency() ) ui->frequency->setValue(_chart->frequency()); if( ui->resolution->value() != _chart->resolution() ) ui->resolution->setValue(_chart->resolution()); if( ui->lines->value() != (int) _chart->lines() ) ui->lines->setValue(_chart->lines()); if( ui->window->currentIndex() != _chart->window() ) ui->window->setCurrentIndex(_chart->window()); if( ui->average->value() != (int) _chart->average() ) ui->average->setValue(_chart->average()); if( ui->overlap->value() != (int) _chart->overlap() ) ui->overlap->setValue(_chart->overlap()); if( ui->unit->currentIndex() != _chart->unit() ) ui->unit->setCurrentIndex(_chart->unit()); ui->type->blockSignals(false); ui->frequency->blockSignals(false); ui->resolution->blockSignals(false); ui->lines->blockSignals(false); ui->window->blockSignals(false); ui->average->blockSignals(false); ui->overlap->blockSignals(false); ui->unit->blockSignals(false); } void spec_widget::toogle_meas(bool enabled) { ui->tab_parameters->setVisible(enabled); /* if(_meas_widget) { if(enabled) { ui->meas_layout->addWidget(_meas_widget); _meas_widget->show(); } else { ui->meas_layout->removeWidget(_meas_widget); _meas_widget->hide(); } } return; */ } // void spec_widget::menu_request(const QPoint &pos) // { // QModelIndex index = ui->signals_->indexAt(pos); // if(index.model()->data(index, Qt::CheckStateRole) == Qt::Checked) // { // _popup_node = static_cast(index.internalPointer()); // QMenu menu; // menu.addAction(_spectrogramm_action); // menu.exec(ui->signals_->viewport()->mapToGlobal(pos)); // } // } // void spec_widget::spectrogramm() // { // gtl::gui::spgr_widget* spgr = _chart->create_spgr(this, _popup_node); // spgr->show(); // } } }