diff --git a/src/plotcontrolpanel.cpp b/src/plotcontrolpanel.cpp --- a/src/plotcontrolpanel.cpp +++ b/src/plotcontrolpanel.cpp @@ -1,5 +1,5 @@ /* - Copyright © 2016 Hasan Yavuz Özderya + Copyright © 2017 Hasan Yavuz Özderya This file is part of serialplot. @@ -23,6 +23,7 @@ #include +#include "color_selector.hpp" #include "plotcontrolpanel.h" #include "ui_plotcontrolpanel.h" #include "setting_defines.h" @@ -41,7 +42,12 @@ Q_DECLARE_METATYPE(Range); PlotControlPanel::PlotControlPanel(QWidget *parent) : QWidget(parent), - ui(new Ui::PlotControlPanel) + ui(new Ui::PlotControlPanel), + resetAct(tr("Reset"), this), + resetNamesAct(tr("Reset Names"), this), + resetColorsAct(tr("Reset Colors"), this), + showAllAct(tr("Show All"), this), + resetMenu(tr("Reset Menu"), this) { ui->setupUi(this); @@ -92,6 +98,18 @@ PlotControlPanel::PlotControlPanel(QWidg QObject::connect(ui->cbRangePresets, SIGNAL(activated(int)), this, SLOT(onRangeSelected())); + + // color selector starts disabled until a channel is selected + ui->colorSelector->setColor(QColor(0,0,0,0)); + ui->colorSelector->setDisplayMode(color_widgets::ColorPreview::AllAlpha); + ui->colorSelector->setDisabled(true); + + // reset button + resetMenu.addAction(&resetNamesAct); + resetMenu.addAction(&resetColorsAct); + resetMenu.addAction(&showAllAct); + resetAct.setMenu(&resetMenu); + ui->tbReset->setDefaultAction(&resetAct); } PlotControlPanel::~PlotControlPanel() @@ -204,9 +222,77 @@ void PlotControlPanel::onRangeSelected() ui->cbAutoScale->setChecked(false); } -void PlotControlPanel::setChannelNamesModel(QAbstractItemModel * model) +void PlotControlPanel::setChannelInfoModel(ChannelInfoModel* model) { - ui->lvChannelNames->setModel(model); + ui->tvChannelInfo->setModel(model); + + // channel color selector + connect(ui->tvChannelInfo->selectionModel(), &QItemSelectionModel::currentRowChanged, + [this](const QModelIndex ¤t, const QModelIndex &previous) + { + // TODO: duplicate with below lambda + QColor color(0,0,0,0); // transparent + + if (current.isValid()) + { + ui->colorSelector->setEnabled(true); + auto model = ui->tvChannelInfo->model(); + color = model->data(current, Qt::ForegroundRole).value(); + } + else + { + ui->colorSelector->setDisabled(true); + } + + // temporarily block signals because `setColor` emits `colorChanged` + bool wasBlocked = ui->colorSelector->blockSignals(true); + ui->colorSelector->setColor(color); + ui->colorSelector->blockSignals(wasBlocked); + }); + + connect(ui->tvChannelInfo->selectionModel(), &QItemSelectionModel::selectionChanged, + [this](const QItemSelection & selected, const QItemSelection & deselected) + { + if (!selected.length()) + { + ui->colorSelector->setDisabled(true); + + // temporarily block signals because `setColor` emits `colorChanged` + bool wasBlocked = ui->colorSelector->blockSignals(true); + ui->colorSelector->setColor(QColor(0,0,0,0)); + ui->colorSelector->blockSignals(wasBlocked); + } + }); + + connect(ui->colorSelector, &color_widgets::ColorSelector::colorChanged, + [this](QColor color) + { + auto index = ui->tvChannelInfo->selectionModel()->currentIndex(); + ui->tvChannelInfo->model()->setData(index, color, Qt::ForegroundRole); + }); + + connect(model, &QAbstractItemModel::dataChanged, + [this](const QModelIndex & topLeft, const QModelIndex & bottomRight, const QVector & roles = QVector ()) + { + auto current = ui->tvChannelInfo->selectionModel()->currentIndex(); + + // no current selection + if (!current.isValid()) return; + + auto mod = ui->tvChannelInfo->model(); + QColor color = mod->data(current, Qt::ForegroundRole).value(); + + // temporarily block signals because `setColor` emits `colorChanged` + bool wasBlocked = ui->colorSelector->blockSignals(true); + ui->colorSelector->setColor(color); + ui->colorSelector->blockSignals(wasBlocked); + }); + + // reset actions + connect(&resetAct, &QAction::triggered, model, &ChannelInfoModel::resetInfos); + connect(&resetNamesAct, &QAction::triggered, model, &ChannelInfoModel::resetNames); + connect(&resetColorsAct, &QAction::triggered, model, &ChannelInfoModel::resetColors); + connect(&showAllAct, &QAction::triggered, model, &ChannelInfoModel::resetVisibility); } void PlotControlPanel::saveSettings(QSettings* settings)