diff options
Diffstat (limited to 'src/ui/configdialog.cpp')
| -rw-r--r-- | src/ui/configdialog.cpp | 509 |
1 files changed, 509 insertions, 0 deletions
diff --git a/src/ui/configdialog.cpp b/src/ui/configdialog.cpp new file mode 100644 index 000000000..808c1ac94 --- /dev/null +++ b/src/ui/configdialog.cpp @@ -0,0 +1,509 @@ +/*************************************************************************** + * Copyright (C) 2007 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include <QDir> +#include <QSettings> +#include <QFontDialog> +#include <QTreeWidgetItem> +#include <QHeaderView> +#include <QCheckBox> +#include <QRadioButton> +#include <QMenu> + +#include <decoder.h> +#include <output.h> +#include <decoderfactory.h> +#include <outputfactory.h> +#include <visualfactory.h> +#include <effectfactory.h> +#include <effect.h> +#include <qmmpui/generalfactory.h> +#include <qmmpui/general.h> + + +#include "skin.h" +#include "filedialog.h" +#include "pluginitem.h" +#include "configdialog.h" +#include "skinreader.h" + +ConfigDialog::ConfigDialog ( QWidget *parent ) + : QDialog ( parent ) +{ + ui.setupUi ( this ); + setAttribute(Qt::WA_QuitOnClose, FALSE); + setAttribute(Qt::WA_DeleteOnClose, FALSE); + connect ( ui. contentsWidget, + SIGNAL ( currentItemChanged ( QListWidgetItem *, QListWidgetItem * ) ), + this, SLOT ( changePage ( QListWidgetItem *, QListWidgetItem* ) ) ); + connect ( ui.mainFontButton, SIGNAL ( clicked() ), SLOT ( setMainFont() ) ); + connect ( ui.plFontButton, SIGNAL ( clicked() ), SLOT ( setPlFont() ) ); + connect ( ui.preferencesButton, SIGNAL ( clicked() ), SLOT (showPluginSettings())); + connect ( ui.informationButton, SIGNAL ( clicked() ), SLOT (showPluginInfo())); + connect ( this, SIGNAL(accepted()),SLOT(saveSettings())); + ui.listWidget->setIconSize ( QSize ( 69,29 ) ); + m_skin = Skin::getPointer(); + ui.fileDialogComboBox->insertItems(0,FileDialog::registeredFactories()); + readSettings(); + SkinReader reader; + reader.updateCache(); + loadSkins(); + loadPluginsInfo(); + loadFonts(); + createMenus(); +} + +ConfigDialog::~ConfigDialog() +{ + while (!m_outputPluginItems.isEmpty()) + delete m_outputPluginItems.takeFirst(); + while (!m_inputPluginItems.isEmpty()) + delete m_outputPluginItems.takeFirst(); + while (!m_visualPluginItems.isEmpty()) + delete m_visualPluginItems.takeFirst(); + while (!m_effectPluginItems.isEmpty()) + delete m_effectPluginItems.takeFirst(); +} + +void ConfigDialog::readSettings() +{ + QSettings settings ( QDir::homePath() +"/.qmmp/qmmprc", QSettings::IniFormat ); + ui.formatLineEdit->setText( + settings.value ( "PlayList/title_format", "%p - %t").toString()); + ui.metadataCheckBox->setChecked( + settings.value ( "PlayList/load_metadata", TRUE).toBool()); + QString f_dialogName = + settings.value("FileDialog",QtFileDialogFactory::QtFileDialogFactoryName).toString(); + + int ind = FileDialog::registeredFactories().indexOf(f_dialogName); + if (ind != -1) + ui.fileDialogComboBox->setCurrentIndex(ind); + else + ui.fileDialogComboBox->setCurrentIndex(0); + + //proxy settings + ui.enableProxyCheckBox->setChecked( + settings.value ("Proxy/use_proxy", FALSE).toBool()); + ui.authProxyCheckBox->setChecked( + settings.value ("Proxy/authentication", FALSE).toBool()); + + ui.hostLineEdit->setText(settings.value("Proxy/host").toString()); + ui.portLineEdit->setText(settings.value("Proxy/port").toString()); + ui.proxyUserLineEdit->setText(settings.value("Proxy/user").toString()); + ui.proxyPasswLineEdit->setText(settings.value("Proxy/passw").toString()); + + ui.hostLineEdit->setEnabled(ui.enableProxyCheckBox->isChecked()); + ui.portLineEdit->setEnabled(ui.enableProxyCheckBox->isChecked()); + ui.proxyUserLineEdit->setEnabled(ui.authProxyCheckBox->isChecked()); + ui.proxyPasswLineEdit->setEnabled(ui.authProxyCheckBox->isChecked()); + + ui.softVolumeCheckBox->setChecked(settings.value("Volume/software_volume", FALSE).toBool()); +} + +void ConfigDialog::changePage ( QListWidgetItem *current, QListWidgetItem *previous ) +{ + if ( !current ) + current = previous; + ui.stackedWidget->setCurrentIndex ( ui.contentsWidget->row ( current ) ); +} + +void ConfigDialog::changeSkin() +{ + int row = ui.listWidget->currentRow(); + QString path = m_skinList.at ( row ).canonicalFilePath(); + m_skin->setSkin ( path ); +} + +void ConfigDialog::loadSkins() +{ + m_skinList.clear(); + //findSkins(":/"); + + QFileInfo fileInfo (":/default"); + QPixmap preview = Skin::getPixmap ("main", QDir (fileInfo.filePath())); + QListWidgetItem *item = new QListWidgetItem (fileInfo.fileName ()); + item->setIcon ( preview ); + ui.listWidget->addItem ( item ); + m_skinList << fileInfo; + + findSkins(QDir::homePath() +"/.qmmp/skins"); + findSkins(QDir::homePath() +"/.qmmp/cache/skins"); + findSkins(qApp->applicationDirPath()+"/../share/qmmp/skins"); + connect ( ui.listWidget, SIGNAL ( itemClicked ( QListWidgetItem* ) ), + this, SLOT ( changeSkin() ) ); +} + +void ConfigDialog::findSkins(const QString &path) +{ + QDir dir(path); + dir.setFilter ( QDir::Dirs | QDir::NoDotAndDotDot); + QList <QFileInfo> fileList = dir.entryInfoList(); + if ( fileList.count() == 0 ) + return; + foreach (QFileInfo fileInfo, fileList) + { + QPixmap preview = Skin::getPixmap ( "main", QDir ( fileInfo.filePath() ) ); + if ( !preview.isNull() ) + { + QListWidgetItem *item = new QListWidgetItem ( fileInfo.fileName () ); + item->setIcon ( preview ); + ui.listWidget->addItem ( item ); + m_skinList << fileInfo; + } + } +} + +void ConfigDialog::loadPluginsInfo() +{ + /* + load input plugins information + */ + QList <DecoderFactory *> *decoders = 0; + decoders = Decoder::decoderFactories(); + QStringList files = Decoder::decoderFiles(); + ui.inputPluginTable->setColumnCount ( 3 ); + ui.inputPluginTable->verticalHeader()->hide(); + ui.inputPluginTable->setHorizontalHeaderLabels ( QStringList() + << tr ( "Enabled" ) << tr ( "Description" ) << tr ( "Filename" ) ); + ui.inputPluginTable->setRowCount ( decoders->count () ); + for ( int i = 0; i < decoders->count (); ++i ) + { + InputPluginItem *item = new InputPluginItem(this,decoders->at(i),files.at(i)); + QCheckBox* checkBox = new QCheckBox ( ui.inputPluginTable ); + connect(checkBox, SIGNAL(toggled(bool)), item, SLOT(setSelected(bool))); + checkBox->setChecked(item->isSelected()); + ui.inputPluginTable->setCellWidget ( i, 0, checkBox ); + ui.inputPluginTable->setItem ( i,1, + new QTableWidgetItem (item->factory()->properties().name) ); + ui.inputPluginTable->setItem ( i,2, new QTableWidgetItem (files.at (i)) ); + ui.inputPluginTable->item(i,1)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + ui.inputPluginTable->item(i,2)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + } + ui.inputPluginTable->resizeColumnToContents ( 0 ); + ui.inputPluginTable->resizeColumnToContents ( 1 ); + ui.inputPluginTable->resizeRowsToContents (); + /* + load output plugins information + */ + QList <OutputFactory *> *outputs = 0; + outputs = Output::outputFactories(); + files = Output::outputFiles(); + ui.outputPluginTable->setColumnCount ( 3 ); + ui.outputPluginTable->verticalHeader()->hide(); + ui.outputPluginTable->setHorizontalHeaderLabels ( QStringList() + << tr ( "Enabled" ) << tr ( "Description" ) << tr ( "Filename" ) ); + ui.outputPluginTable->setRowCount ( outputs->count () ); + + for ( int i = 0; i < outputs->count (); ++i ) + { + OutputPluginItem *item = new OutputPluginItem(this,outputs->at(i),files.at(i)); + m_outputPluginItems.append(item); + QRadioButton* button = new QRadioButton ( ui.outputPluginTable ); + connect(button, SIGNAL(pressed ()), item, SLOT(select())); + button->setChecked ( item->isSelected() ); + ui.outputPluginTable->setCellWidget ( i, 0, button ); + ui.outputPluginTable->setItem (i,1, + new QTableWidgetItem (item->factory()->properties().name)); + ui.outputPluginTable->setItem (i,2, new QTableWidgetItem (files.at(i))); + ui.outputPluginTable->item(i,1)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + ui.outputPluginTable->item(i,2)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + } + + ui.outputPluginTable->resizeColumnToContents ( 0 ); + ui.outputPluginTable->resizeColumnToContents ( 1 ); + ui.outputPluginTable->resizeRowsToContents (); + /* + load visual plugin information + */ + QList <VisualFactory *> *visuals = 0; + visuals = Visual::visualFactories(); + files = Visual::visualFiles(); + ui.visualPluginTable->setColumnCount ( 3 ); + ui.visualPluginTable->verticalHeader()->hide(); + ui.visualPluginTable->setHorizontalHeaderLabels ( QStringList() + << tr ( "Enabled" ) << tr ( "Description" ) << tr ( "Filename" ) ); + ui.visualPluginTable->setRowCount ( visuals->count () ); + + for ( int i = 0; i < visuals->count (); ++i ) + { + VisualPluginItem *item = new VisualPluginItem(this,visuals->at(i),files.at(i)); + m_visualPluginItems.append(item); + QCheckBox* button = new QCheckBox (ui.visualPluginTable); + connect(button, SIGNAL(clicked (bool)), item, SLOT(select(bool))); + button->setChecked (item->isSelected()); + ui.visualPluginTable->setCellWidget ( i, 0, button ); + ui.visualPluginTable->setItem (i,1, + new QTableWidgetItem (item->factory()->properties().name)); + ui.visualPluginTable->setItem (i,2, new QTableWidgetItem (files.at(i))); + ui.visualPluginTable->item(i,1)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + ui.visualPluginTable->item(i,2)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + } + + ui.visualPluginTable->resizeColumnToContents ( 0 ); + ui.visualPluginTable->resizeColumnToContents ( 1 ); + ui.visualPluginTable->resizeRowsToContents (); + + /* + load effect plugin information + */ + QList <EffectFactory *> *effects = 0; + effects = Effect::effectFactories(); + files = Effect::effectFiles(); + ui.effectPluginTable->setColumnCount ( 3 ); + ui.effectPluginTable->verticalHeader()->hide(); + ui.effectPluginTable->setHorizontalHeaderLabels ( QStringList() + << tr ( "Enabled" ) << tr ( "Description" ) << tr ( "Filename" ) ); + ui.effectPluginTable->setRowCount ( visuals->count () ); + + for ( int i = 0; i < effects->count (); ++i ) + { + EffectPluginItem *item = new EffectPluginItem(this,effects->at(i),files.at(i)); + m_effectPluginItems.append(item); + QCheckBox* button = new QCheckBox (ui.effectPluginTable); + connect(button, SIGNAL(clicked (bool)), item, SLOT(select(bool))); + button->setChecked (item->isSelected()); + ui.effectPluginTable->setCellWidget ( i, 0, button ); + ui.effectPluginTable->setItem (i,1, + new QTableWidgetItem (item->factory()->properties().name)); + ui.effectPluginTable->setItem (i,2, new QTableWidgetItem (files.at(i))); + ui.effectPluginTable->item(i,1)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + ui.effectPluginTable->item(i,2)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + } + + ui.effectPluginTable->resizeColumnToContents ( 0 ); + ui.effectPluginTable->resizeColumnToContents ( 1 ); + ui.effectPluginTable->resizeRowsToContents (); + + /* + load general plugin information + */ + QList <GeneralFactory *> *generals = 0; + generals = General::generalFactories(); + files = General::generalFiles(); + ui.generalPluginTable->setColumnCount ( 3 ); + ui.generalPluginTable->verticalHeader()->hide(); + ui.generalPluginTable->setHorizontalHeaderLabels ( QStringList() + << tr ( "Enabled" ) << tr ( "Description" ) << tr ( "Filename" ) ); + ui.generalPluginTable->setRowCount ( generals->count () ); + + for ( int i = 0; i < generals->count (); ++i ) + { + GeneralPluginItem *item = new GeneralPluginItem(this,generals->at(i),files.at(i)); + m_generalPluginItems.append(item); + QCheckBox* button = new QCheckBox (ui.generalPluginTable); + connect(button, SIGNAL(clicked (bool)), item, SLOT(select(bool))); + button->setChecked (item->isSelected()); + ui.generalPluginTable->setCellWidget ( i, 0, button ); + ui.generalPluginTable->setItem (i,1, + new QTableWidgetItem (item->factory()->properties().name)); + ui.generalPluginTable->setItem (i,2, new QTableWidgetItem (files.at(i))); + ui.generalPluginTable->item(i,1)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + ui.generalPluginTable->item(i,2)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + } + + ui.generalPluginTable->resizeColumnToContents ( 0 ); + ui.generalPluginTable->resizeColumnToContents ( 1 ); + ui.generalPluginTable->resizeRowsToContents (); +} + + +void ConfigDialog::loadFonts() +{ + QSettings settings ( QDir::homePath() +"/.qmmp/qmmprc", QSettings::IniFormat ); + QString fontname = settings.value ( "PlayList/Font","" ).toString(); + if ( fontname.isEmpty () ) + fontname = QFont ( "Helvetica [Cronyx]", 10 ).toString(); + ui.plFontLabel -> setText ( fontname ); + + fontname = settings.value ( "MainWindow/Font","" ).toString(); + if ( fontname.isEmpty () ) + fontname = QFont ( "Helvetica [Cronyx]", 9 ).toString(); + ui.mainFontLabel -> setText ( fontname ); +} + +void ConfigDialog::setPlFont() +{ + bool ok; + QFont font; + font.fromString ( ui.plFontLabel->text() ); + font = QFontDialog::getFont ( &ok, font, this ); + if ( ok ) + { + ui.plFontLabel -> setText ( font.toString () ); + QSettings settings ( QDir::homePath() +"/.qmmp/qmmprc", QSettings::IniFormat ); + settings.setValue ( "PlayList/Font", font.toString() ); + } +} + +void ConfigDialog::setMainFont() +{ + bool ok; + QFont font; + font.fromString ( ui.plFontLabel->text() ); + font = QFontDialog::getFont ( &ok, font, this ); + if ( ok ) + { + ui.mainFontLabel -> setText ( font.toString () ); + QSettings settings ( QDir::homePath() +"/.qmmp/qmmprc", QSettings::IniFormat ); + settings.setValue ( "MainWindow/Font", font.toString() ); + } +} + +void ConfigDialog::showPluginSettings() +{ + switch ( ( int ) ui.pluginsTab -> currentIndex () ) + { + case 0: + { + QList <DecoderFactory *> *decoders = 0; + decoders = Decoder::decoderFactories(); + int row = ui.inputPluginTable->currentRow (); + if ( !decoders || row<0 ) + return; + + decoders->at ( row )->showSettings ( this ); + break; + } + case 1: + { + int row = ui.outputPluginTable->currentRow (); + if ( m_outputPluginItems.isEmpty() || row < 0 ) + return; + m_outputPluginItems.at(row)->factory()->showSettings ( this ); + break; + } + case 2: + { + int row = ui.visualPluginTable->currentRow (); + if ( m_visualPluginItems.isEmpty() || row < 0 ) + return; + m_visualPluginItems.at(row)->factory()->showSettings ( this ); + break; + } + case 3: + { + int row = ui.effectPluginTable->currentRow (); + if ( m_effectPluginItems.isEmpty() || row < 0 ) + return; + m_effectPluginItems.at(row)->factory()->showSettings ( this ); + break; + } + case 4: + { + int row = ui.generalPluginTable->currentRow (); + if ( m_generalPluginItems.isEmpty() || row < 0 ) + return; + m_generalPluginItems.at(row)->factory()->showSettings ( this ); + break; + } + } +} + +void ConfigDialog::showPluginInfo() +{ + switch ( ( int ) ui.pluginsTab -> currentIndex () ) + { + case 0: + { + QList <DecoderFactory *> *decoders = 0; + decoders = Decoder::decoderFactories(); + int row = ui.inputPluginTable->currentRow (); + if ( !decoders || row<0 ) + return; + + decoders->at ( row )->showAbout ( this ); + break; + } + case 1: + { + int row = ui.outputPluginTable->currentRow (); + if ( m_outputPluginItems.isEmpty() || row < 0 ) + return; + m_outputPluginItems.at(row)->factory()->showAbout ( this ); + break; + } + case 2: + { + int row = ui.visualPluginTable->currentRow (); + if ( m_visualPluginItems.isEmpty() || row < 0 ) + return; + m_visualPluginItems.at(row)->factory()->showAbout ( this ); + break; + } + case 3: + { + int row = ui.effectPluginTable->currentRow (); + if ( m_effectPluginItems.isEmpty() || row < 0 ) + return; + m_effectPluginItems.at(row)->factory()->showAbout ( this ); + break; + } + case 4: + { + int row = ui.generalPluginTable->currentRow (); + if ( m_generalPluginItems.isEmpty() || row < 0 ) + return; + m_generalPluginItems.at(row)->factory()->showAbout ( this ); + break; + } + } +} + +void ConfigDialog::createMenus() +{ + QMenu *menu = new QMenu(this); + + menu->addAction(tr("Artist"))->setData("%p"); + menu->addAction(tr("Album"))->setData("%a"); + menu->addAction(tr("Title"))->setData("%t"); + menu->addAction(tr("Tracknumber"))->setData("%n"); + menu->addAction(tr("Genre"))->setData("%g"); + menu->addAction(tr("Filename"))->setData("%f"); + menu->addAction(tr("Filepath"))->setData("%F"); + menu->addAction(tr("Date"))->setData("%d"); + menu->addAction(tr("Year"))->setData("%y"); + menu->addAction(tr("Comment"))->setData("%c"); + ui.titleButton->setMenu(menu); + ui.titleButton->setPopupMode(QToolButton::InstantPopup); + connect( menu, SIGNAL(triggered ( QAction * )), SLOT(addTitleString( QAction * ))); +} + +void ConfigDialog::addTitleString( QAction * a) +{ + if (ui.formatLineEdit->cursorPosition () < 1) + ui.formatLineEdit->insert(a->data().toString()); + else + ui.formatLineEdit->insert(" - "+a->data().toString()); +} + +void ConfigDialog::saveSettings() +{ + QSettings settings (QDir::homePath() +"/.qmmp/qmmprc", QSettings::IniFormat); + settings.setValue ("PlayList/title_format", ui.formatLineEdit->text()); + settings.setValue ("PlayList/load_metadata", ui.metadataCheckBox->isChecked()); + settings.setValue ("FileDialog", ui.fileDialogComboBox->currentText()); + settings.setValue ("Proxy/use_proxy", ui.enableProxyCheckBox->isChecked()); + settings.setValue ("Proxy/authentication", ui.authProxyCheckBox->isChecked()); + settings.setValue ("Proxy/host",ui.hostLineEdit->text()); + settings.setValue ("Proxy/port",ui.portLineEdit->text()); + settings.setValue ("Proxy/user",ui.proxyUserLineEdit->text()); + settings.setValue ("Proxy/passw",ui.proxyPasswLineEdit->text()); + settings.setValue ("Volume/software_volume", ui.softVolumeCheckBox->isChecked()); +} + |
