/*************************************************************************** * Copyright(C) 2009-2021 by Ilya Kotov * * forkotov02@ya.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 #include #include #include #include #include #include #include #include #include "fileops.h" #include "hotkeydialog.h" #include "settingsdialog.h" SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent) { m_ui.setupUi(this); m_ui.tableWidget->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); m_ui.tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); QSettings settings(Qmmp::configFile(), QSettings::IniFormat); settings.beginGroup("FileOps"); int i = 0; while(!settings.value(QString("name_%1").arg(i)).isNull()) { m_ui.tableWidget->insertRow(i); QCheckBox *checkBox = new QCheckBox; checkBox->setFocusPolicy(Qt::NoFocus); checkBox->setChecked(settings.value(QString("enabled_%1").arg(i), true).toBool()); QComboBox *comboBox = createComboBox(); int ci = comboBox->findData(settings.value(QString("action_%1").arg(i), FileOps::COPY).toInt()); comboBox->setCurrentIndex(qMax(ci, 0)); connect(comboBox, SIGNAL(activated(int)), SLOT(updateLineEdits())); QTableWidgetItem *nameItem = new QTableWidgetItem(settings.value(QString("name_%1").arg(i)).toString()); nameItem->setData(PatternRole, settings.value(QString("pattern_%1").arg(i)).toString()); nameItem->setData(DestionationRole, settings.value(QString("destination_%1").arg(i)).toString()); nameItem->setData(CommandRole, settings.value(QString("command_%1").arg(i)).toString()); QTableWidgetItem *hotkeyItem = new QTableWidgetItem(); hotkeyItem->setText(settings.value(QString("hotkey_%1").arg(i)).toString()); hotkeyItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); m_ui.tableWidget->setCellWidget(i, 0, checkBox); m_ui.tableWidget->setCellWidget(i, 1, comboBox); m_ui.tableWidget->setItem(i, 2, nameItem); m_ui.tableWidget->setItem(i, 3, hotkeyItem); ++i; } settings.endGroup(); connect(m_ui.tableWidget, SIGNAL(currentCellChanged(int,int,int,int)), SLOT(updateLineEdits())); updateLineEdits(); createMenus(); } SettingsDialog::~SettingsDialog() {} void SettingsDialog::accept() { QSettings settings(Qmmp::configFile(), QSettings::IniFormat); settings.beginGroup("FileOps"); //remove all previous keys settings.remove(QString()); //save actions for(int i = 0; i < m_ui.tableWidget->rowCount(); ++i) { QTableWidgetItem *item = m_ui.tableWidget->item(i, 2); if(item->text().isEmpty()) continue; settings.setValue(QString("name_%1").arg(i), item->text()); settings.setValue(QString("destination_%1").arg(i), item->data(DestionationRole).toString()); QCheckBox *checkBox = qobject_cast(m_ui.tableWidget->cellWidget(i, 0)); settings.setValue(QString("enabled_%1").arg(i), checkBox->isChecked()); QComboBox *comboBox = qobject_cast(m_ui.tableWidget->cellWidget(i, 1)); settings.setValue(QString("action_%1").arg(i), comboBox->itemData(comboBox->currentIndex())); if(comboBox->itemData(comboBox->currentIndex()) == FileOps::EXECUTE) settings.setValue(QString("command_%1").arg(i), item->data(CommandRole).toString()); else settings.setValue(QString("pattern_%1").arg(i), item->data(PatternRole).toString()); settings.setValue(QString("hotkey_%1").arg(i), m_ui.tableWidget->item(i, 3)->text()); } settings.endGroup(); QDialog::accept(); } void SettingsDialog::on_newButton_clicked() { int row = m_ui.tableWidget->rowCount(); m_ui.tableWidget->insertRow(row); QCheckBox *checkBox = new QCheckBox; checkBox->setFocusPolicy(Qt::NoFocus); checkBox->setChecked(true); QComboBox *comboBox = createComboBox(); QTableWidgetItem *nameItem = new QTableWidgetItem(tr("New action")); nameItem->setData(DestionationRole, QStandardPaths::writableLocation(QStandardPaths::MusicLocation)); nameItem->setData(PatternRole, "%p - %t"); connect(comboBox, SIGNAL(activated(int)), SLOT(updateLineEdits())); m_ui.tableWidget->setCellWidget(row, 0, checkBox); m_ui.tableWidget->setCellWidget(row, 1, comboBox); m_ui.tableWidget->setItem(row, 2, nameItem); QTableWidgetItem *hotkeyItem = new QTableWidgetItem(); m_ui.tableWidget->setItem(row, 3, hotkeyItem); m_ui.tableWidget->item(row, 3)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); } void SettingsDialog::on_deleteButton_clicked() { if(m_ui.tableWidget->currentRow() >= 0) m_ui.tableWidget->removeRow(m_ui.tableWidget->currentRow()); } void SettingsDialog::updateLineEdits() { m_ui.destinationEdit->setVisible(false); m_ui.destinationLabel->setVisible(false); m_ui.destButton->setVisible(false); m_ui.patternEdit->setVisible(false); m_ui.patternLabel->setVisible(false); m_ui.patternButton->setVisible(false); m_ui.patternLabel->setText(tr("File name pattern:")); if(m_ui.tableWidget->currentRow() >= 0) { QTableWidgetItem *nameItem = m_ui.tableWidget->item(m_ui.tableWidget->currentRow(), 2); m_ui.destinationEdit->setText(nameItem->data(DestionationRole).toString()); QComboBox *comboBox = qobject_cast(m_ui.tableWidget->cellWidget(m_ui.tableWidget->currentRow(), 1)); int action = comboBox->itemData(comboBox->currentIndex()).toInt(); if(action == FileOps::EXECUTE) m_ui.patternEdit->setText(nameItem->data(CommandRole).toString()); else m_ui.patternEdit->setText(nameItem->data(PatternRole).toString()); if(action == FileOps::COPY || action == FileOps::MOVE) { m_ui.destinationEdit->setVisible(true); m_ui.destinationLabel->setVisible(true); m_ui.destButton->setVisible(true); m_ui.patternEdit->setVisible(true); m_ui.patternLabel->setVisible(true); m_ui.patternButton->setVisible(true); } else if(action == FileOps::RENAME || action == FileOps::EXECUTE) { m_ui.patternEdit->setVisible(true); m_ui.patternLabel->setVisible(true); m_ui.patternButton->setVisible(true); if(action == FileOps::EXECUTE) m_ui.patternLabel->setText(tr("Command:")); } } } void SettingsDialog::on_destinationEdit_textChanged(QString dest) { if(m_ui.tableWidget->currentRow() >= 0) { QTableWidgetItem *item = m_ui.tableWidget->item(m_ui.tableWidget->currentRow(), 2); item->setData(DestionationRole, dest); } } void SettingsDialog::on_patternEdit_textChanged(QString pattern) { if(m_ui.tableWidget->currentRow() >= 0) { QTableWidgetItem *item = m_ui.tableWidget->item(m_ui.tableWidget->currentRow(), 2); item->setData(PatternRole, pattern); item->setData(CommandRole, pattern); } } void SettingsDialog::createMenus() { MetaDataFormatterMenu *menu = new MetaDataFormatterMenu(MetaDataFormatterMenu::TITLE_MENU, this); m_ui.patternButton->setMenu(menu); m_ui.patternButton->setPopupMode(QToolButton::InstantPopup); connect(menu, SIGNAL(patternSelected(QString)), SLOT(addTitleString(QString))); } QComboBox *SettingsDialog::createComboBox() { QComboBox *comboBox = new QComboBox; comboBox->addItem(tr("Copy"), FileOps::COPY); comboBox->addItem(tr("Rename"), FileOps::RENAME); comboBox->addItem(tr("Move"), FileOps::MOVE); comboBox->addItem(tr("Remove"), FileOps::REMOVE); comboBox->addItem(tr("Execute"), FileOps::EXECUTE); comboBox->setFocusPolicy(Qt::NoFocus); return comboBox; } void SettingsDialog::addTitleString(const QString &str) { m_ui.patternEdit->insert(str); } void SettingsDialog::on_destButton_clicked() { QString dir = FileDialog::getExistingDirectory(this, tr("Choose a directory"), m_ui.destinationEdit->text()); if(!dir.isEmpty()) m_ui.destinationEdit->setText(dir); } void SettingsDialog::on_tableWidget_itemDoubleClicked(QTableWidgetItem *item) { HotkeyDialog *dialog = new HotkeyDialog(item->text(), this); if(m_ui.tableWidget->column(item) == 3 && dialog->exec() == QDialog::Accepted) item->setText(dialog->key()); dialog->deleteLater(); }