aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Ui/qsui/equalizer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/Ui/qsui/equalizer.cpp')
-rw-r--r--src/plugins/Ui/qsui/equalizer.cpp280
1 files changed, 280 insertions, 0 deletions
diff --git a/src/plugins/Ui/qsui/equalizer.cpp b/src/plugins/Ui/qsui/equalizer.cpp
new file mode 100644
index 000000000..df986828e
--- /dev/null
+++ b/src/plugins/Ui/qsui/equalizer.cpp
@@ -0,0 +1,280 @@
+/***************************************************************************
+ * Copyright (C) 2011-2013 by Ilya Kotov *
+ * forkotov02@hotmail.ru *
+ * *
+ * 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 <QGridLayout>
+#include <QVBoxLayout>
+#include <QHBoxLayout>
+#include <QSlider>
+#include <QCheckBox>
+#include <QPushButton>
+#include <QComboBox>
+#include <QLabel>
+#include <QPainter>
+#include <QDialogButtonBox>
+#include <QSettings>
+#include <QMessageBox>
+#include <QDir>
+#include <qmmp/qmmpsettings.h>
+#include "equalizer.h"
+
+Equalizer::Equalizer(QWidget *parent) : QDialog(parent)
+{
+ setWindowTitle(tr("Equalizer"));
+
+ m_layout = new QVBoxLayout(this);
+ setLayout(m_layout);
+ m_layout->setSpacing(5);
+ m_layout->setMargin(5);
+
+ QHBoxLayout *buttonsLayout = new QHBoxLayout;
+ buttonsLayout->setSpacing(5);
+ m_enabled = new QCheckBox(tr("Enable equalizer"), this);
+ buttonsLayout->addWidget(m_enabled);
+
+ buttonsLayout->addSpacerItem(new QSpacerItem(30, 0, QSizePolicy::Fixed, QSizePolicy::Fixed));
+
+ QLabel *label = new QLabel(this);
+ label->setText(tr("Preset:"));
+ buttonsLayout->addWidget(label);
+
+ m_presetComboBox = new QComboBox(this);
+ m_presetComboBox->setEditable(true);
+ connect(m_presetComboBox, SIGNAL(activated(int)), SLOT(loadPreset(int)));
+ buttonsLayout->addWidget(m_presetComboBox);
+
+ QPushButton *saveButton = new QPushButton(tr("Save"), this);
+ connect(saveButton, SIGNAL(pressed()), SLOT(savePreset()));
+ buttonsLayout->addWidget(saveButton);
+
+ QPushButton *deleteButton = new QPushButton(tr("Delete"), this);
+ connect(deleteButton, SIGNAL(pressed()), SLOT(deletePreset()));
+ buttonsLayout->addWidget(deleteButton);
+
+ QPushButton *reset = new QPushButton(tr("Reset"), this);
+ connect(reset, SIGNAL(clicked()), SLOT(resetSettings()));
+ buttonsLayout->addWidget(reset);
+
+ QDialogButtonBox *dialogButtons = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, this);
+ dialogButtons->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+ connect(dialogButtons, SIGNAL(rejected()), SLOT(reject()));
+ buttonsLayout->addWidget(dialogButtons);
+
+ QGridLayout *slidersLayout = new QGridLayout;
+ slidersLayout->setSpacing(5);
+
+ QStringList names;
+ names << tr("Preamp") << "25" << "40" << "63" << "100" << "160" << "250"
+ << "400" << "630" << "1k" << "1,6k" << "2,5k"
+ << "4k" << "6,3k" << "10k" << "16k";
+
+ for(int i = 0; i < 16; ++i)
+ {
+ QSlider *slider = new QSlider(this);
+ slider->setRange(-20, 20);
+ slider->setTickPosition(QSlider::TicksLeft);
+ slider->setTickInterval(10);
+ QLabel *label = new QLabel(this);
+ label->setFrameShape(QFrame::Box);
+ label->setText(names.at(i));
+ slidersLayout->addWidget(slider, 1, i, Qt::AlignHCenter);
+ slidersLayout->addWidget(label, 2, i, Qt::AlignHCenter);
+
+ QLabel *label2 = new QLabel(this);
+ label2->setText(tr("%1dB").arg(0));
+ label2->setFrameShape(QFrame::Box);
+ label2->setMinimumWidth(fontMetrics().width(tr("+%1dB").arg(20) + 5));
+ label2->setAlignment(Qt::AlignCenter);
+ slidersLayout->addWidget(label2, 0, i, Qt::AlignHCenter);
+ connect(slider, SIGNAL(valueChanged(int)), SLOT(updateLabel()));
+ m_sliders << slider;
+ m_labels << label2;
+ }
+ m_layout->addItem(slidersLayout);
+ m_layout->addItem(buttonsLayout);
+ setMinimumHeight(300);
+ foreach(QSlider *slider, m_sliders)
+ {
+ connect(slider, SIGNAL(sliderMoved(int)), SLOT(applySettings()));
+ }
+ connect(m_enabled, SIGNAL(clicked()), SLOT(applySettings()));
+ readSettigs();
+ loadPresets();
+}
+
+Equalizer::~Equalizer()
+{
+ savePresets();
+ qDeleteAll(m_presets);
+ m_presets.clear();
+}
+
+void Equalizer::readSettigs()
+{
+ EqSettings settings = QmmpSettings::instance()->eqSettings();
+ m_enabled->setChecked(settings.isEnabled());
+ m_sliders.at(0)->setValue(settings.preamp());
+ for(int i = 0; i < EqSettings::EQ_BANDS_15; ++i)
+ {
+ m_sliders.at(i+1)->setValue(settings.gain(i));
+ }
+}
+
+void Equalizer::loadPresets()
+{
+ m_presetComboBox->clear();
+ //equalizer presets
+ QString preset_path = QDir::homePath() +"/.qmmp/eq16.preset";
+ if(!QFile::exists(preset_path))
+ preset_path = ":/qsui/eq16.preset";
+ QSettings eq_preset (preset_path, QSettings::IniFormat);
+ int i = 0;
+ forever
+ {
+ i++;
+ if (eq_preset.contains("Presets/Preset"+QString("%1").arg(i)))
+ {
+ QString name = eq_preset.value(QString("Presets/Preset%1").arg(i), tr("preset")).toString();
+ EQPreset *preset = new EQPreset();
+ //preset->setText(name);
+ eq_preset.beginGroup(name);
+ for (int j = 0; j < EqSettings::EQ_BANDS_15; ++j)
+ {
+ preset->setGain(j,eq_preset.value(QString("Band%1").arg(j), 0).toDouble());
+ }
+ preset->setPreamp(eq_preset.value("Preamp",0).toDouble());
+ m_presets.append(preset);
+ m_presetComboBox->addItem(name);
+ eq_preset.endGroup();
+ }
+ else
+ break;
+ }
+ m_presetComboBox->clearEditText();
+}
+
+void Equalizer::applySettings()
+{
+ EqSettings settings(EqSettings::EQ_BANDS_15);
+ settings.setPreamp(m_sliders.at(0)->value());
+ settings.setEnabled(m_enabled->isChecked());
+ for(int i = 0; i < EqSettings::EQ_BANDS_15; ++i)
+ {
+ settings.setGain(i, m_sliders.at(i+1)->value());
+ }
+ QmmpSettings::instance()->setEqSettings(settings);
+}
+
+void Equalizer::resetSettings()
+{
+ foreach(QSlider *slider, m_sliders)
+ {
+ slider->setValue(0);
+ }
+ applySettings();
+ m_presetComboBox->setCurrentIndex(-1);
+}
+
+void Equalizer::updateLabel()
+{
+ QSlider *slider = qobject_cast<QSlider *>(sender());
+ int index = m_sliders.indexOf(slider);
+ if(index < 0)
+ return;
+ if(slider->value() > 0)
+ m_labels[index]->setText(tr("+%1dB").arg(slider->value()));
+ else
+ m_labels[index]->setText(tr("%1dB").arg(slider->value()));
+}
+
+void Equalizer::loadPreset(int index)
+{
+ EQPreset *preset = m_presets.at(index);
+ m_sliders.at(0)->setValue(preset->preamp());
+ for(int i = 0; i < EqSettings::EQ_BANDS_15; ++i)
+ {
+ m_sliders.at(i+1)->setValue(preset->gain(i));
+ }
+ applySettings();
+}
+
+void Equalizer::savePreset()
+{
+ QString name = m_presetComboBox->currentText();
+ if(name.isEmpty())
+ return;
+
+ int index = m_presetComboBox->findText(name);
+ if(index != -1)
+ {
+ if(QMessageBox::question(this, tr("Overwrite Request"),
+ tr("Preset '%1' already exists. Overwrite?").arg(name),
+ QMessageBox::Yes | QMessageBox::No) == QMessageBox::No)
+ return;
+ m_presets[index]->setPreamp(m_sliders.at(0)->value());
+ for(int i = 0; i < EqSettings::EQ_BANDS_15; ++i)
+ {
+ m_presets[index]->setGain(i, m_sliders.at(i+1)->value());
+ }
+ }
+ else
+ {
+ m_presetComboBox->addItem(name);
+ EQPreset *preset = new EQPreset();
+ preset->setPreamp(m_sliders.at(0)->value());
+ for(int i = 0; i < EqSettings::EQ_BANDS_15; ++i)
+ {
+ preset->setGain(i, m_sliders.at(i+1)->value());
+ }
+ m_presets.append(preset);
+ }
+ m_presetComboBox->clearEditText();
+}
+
+void Equalizer::savePresets()
+{
+ QSettings eq_preset (QDir::homePath() +"/.qmmp/eq16.preset", QSettings::IniFormat);
+ eq_preset.clear ();
+ for (int i = 0; i < m_presets.size(); ++i)
+ {
+ eq_preset.setValue(QString("Presets/Preset%1").arg(i+1), m_presetComboBox->itemText(i));
+ eq_preset.beginGroup(m_presetComboBox->itemText(i));
+ for (int j = 0; j < EqSettings::EQ_BANDS_15; ++j)
+ {
+ eq_preset.setValue(QString("Band%1").arg(j),m_presets.at(i)->gain(j));
+ }
+ eq_preset.setValue("Preamp",m_presets.at(i)->preamp());
+ eq_preset.endGroup();
+ }
+}
+
+void Equalizer::deletePreset()
+{
+ QString name = m_presetComboBox->currentText();
+ if(name.isEmpty())
+ return;
+
+ int index = m_presetComboBox->findText(name);
+ if(index != -1)
+ {
+ m_presetComboBox->removeItem(index);
+ delete m_presets.takeAt(index);
+ }
+ m_presetComboBox->clearEditText();
+}