Files
EqualizerAPO/Editor/FilterTableRow.cpp
T
jthedering b8cdd47f71 Version 1.0
Added: Configuration Editor, which allows to edit configurations in a graphical user interface. Contains GUIs for most commands supported by E-APO, but as lines can also be edited directly, all commands can be used.
Added: Command "GraphicEQ", which can act as a regular, fixed-band graphic equalizer (via the GUI) but also supports variable bands so that any desired frequency response can be specified. Internally, it is implemented via convolution with a generated IR.
Added: Command "Convolution", which allows to convolve the signal with a user-provided impulse response to achieve e.g. equalization or reverberation effects.
Improved: Configurator performs checks for registry values that are needed for the operation of E-APO, which may be changed by driver installations, fixing the values if necessary.
Improved: Configurator shows which is the default device as a hint to the user.
2015-09-27 16:01:21 +00:00

208 lines
5.2 KiB
C++

/*
This file is part of EqualizerAPO, a system-wide equalizer.
Copyright (C) 2015 Jonas Thedering
This program 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.
This program 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 this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <QToolBar>
#include <QLineEdit>
#include <QPainter>
#include <QScrollBar>
#include "FilterTableRow.h"
#include "ui_FilterTableRow.h"
FilterTableRow::FilterTableRow(FilterTable* table, int number, FilterTable::Item* item, IFilterGUI* gui) :
QWidget(table),
ui(new Ui::FilterTableRow)
{
ui->setupUi(this);
this->table = table;
this->item = item;
this->gui = gui;
ui->labelNumber->setText(QString("%0").arg(number));
ui->toolBar->addAction(ui->actionAdd);
ui->toolBar->addAction(ui->actionRemove);
ui->toolBar->addAction(ui->actionEditText);
ui->toolBar->updateMaximumHeight();
ui->stackedWidget->setContentsMargins(0, 5, 0, 5);
if(gui != NULL)
{
connect(gui, SIGNAL(updateModel()), this, SLOT(updateModel()));
ui->stackedWidget->addWidget(gui);
}
else
{
ui->stackedWidget->addWidget(new QLabel(item->text));
}
ui->stackedWidget->setCurrentIndex(1);
}
FilterTableRow::~FilterTableRow()
{
delete ui;
}
QRect FilterTableRow::getHeaderRect()
{
QRect rect(0, 0, ui->labelNumber->geometry().right() + 1, height());
return rect;
}
void FilterTableRow::editText()
{
if(!ui->actionEditText->isChecked())
ui->actionEditText->trigger();
}
void FilterTableRow::mouseDoubleClickEvent(QMouseEvent*)
{
if(gui == NULL && ui->stackedWidget->currentIndex() == 1)
ui->actionEditText->trigger();
}
void FilterTableRow::paintEvent(QPaintEvent*)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
QRectF r = rect();
r = r.marginsAdded(QMarginsF(-1.5, -1.5, -1.5, -0.5));
QColor color;
if(table->getSelectedItems().contains(item))
{
if(table->getFocusedItem() == item)
color = QColor(44, 111, 222);
else
color = QColor(64, 136, 255);
}
else
{
if(table->getFocusedItem() == item)
color = QColor(160, 160, 160);
else
color = QColor(180, 180, 180);
}
painter.setPen(color);
QLinearGradient gradient(r.topLeft(), r.bottomLeft());
gradient.setColorAt(0, QColor(255, 255, 255));
gradient.setColorAt(1, QColor(230, 230, 230));
painter.setBrush(gradient);
painter.drawRoundedRect(r, 5, 5);
QRectF r2 = r;
r2.setRight(ui->labelNumber->geometry().right() - 0.5);
QLinearGradient gradient2(r2.topLeft(), r2.bottomLeft());
gradient2.setColorAt(0, color.darker(110));
gradient2.setColorAt(1, color.darker(150));
painter.setBrush(gradient2);
painter.drawRoundedRect(r2, 5, 5);
}
void FilterTableRow::updateModel()
{
IFilterGUI* sender = qobject_cast<IFilterGUI*>(QObject::sender());
QString command;
QString parameters;
sender->store(command, parameters);
item->text = command + ": " + parameters;
qDebug("Updated item text to %s", item->text.toStdString().c_str());
}
void FilterTableRow::on_actionAdd_triggered()
{
QMenu* menu = table->createAddPopupMenu();
QRect rect = ui->toolBar->actionGeometry(ui->actionAdd);
QPoint p = ui->toolBar->mapToGlobal(QPoint(rect.x(), rect.y() + rect.height()));
QAction* action = menu->exec(p);
ui->actionAdd->setChecked(false);
if(action != NULL)
{
FilterTemplate t = action->data().value<FilterTemplate>();
QString line = t.getLine();
table->addLine(line, item);
table->updateGuis();
}
}
void FilterTableRow::on_actionRemove_triggered()
{
table->removeItem(item);
table->updateGuis();
}
void FilterTableRow::on_actionEditText_triggered(bool checked)
{
if(checked)
{
if(!lastEditTime.isValid() || lastEditTime.elapsed() > 100)
{
ui->lineEdit->setText(item->text);
ui->stackedWidget->setCurrentIndex(0);
ui->lineEdit->setFocus();
}
else
{
ui->actionEditText->setChecked(false);
}
}
}
void FilterTableRow::on_lineEdit_editingFinished()
{
if(ui->stackedWidget->currentIndex() == 0 && !editingDone)
{
if(ui->lineEdit->text() != item->text)
{
editingDone = true;
item->text = ui->lineEdit->text();
// set focus to table so that enter key does not cause scrolling down
table->setFocus();
table->updateGuis();
}
else
{
ui->stackedWidget->setCurrentIndex(1);
lastEditTime.start();
ui->actionEditText->setChecked(false);
}
}
}
void FilterTableRow::on_lineEdit_editingCanceled()
{
if(ui->stackedWidget->currentIndex() == 0)
{
// will cause editingFinished to be called, so prevent committing
editingDone = true;
table->setFocus();
ui->stackedWidget->setCurrentIndex(1);
editingDone = false;
ui->actionEditText->setChecked(false);
}
}