diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2021-01-25 20:49:44 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2021-01-25 20:49:44 +0000 |
| commit | 8618c1e26a2cfe7a1c5dddf0fec3bab9311a9b7a (patch) | |
| tree | 158964d3eba52cd196dd814ce8cd278f9f44f271 /src/plugins/General/fileops | |
| parent | 69fac3438f57abc6da77611f2c42522b5a9abc6d (diff) | |
| download | qmmp-8618c1e26a2cfe7a1c5dddf0fec3bab9311a9b7a.tar.gz qmmp-8618c1e26a2cfe7a1c5dddf0fec3bab9311a9b7a.tar.bz2 qmmp-8618c1e26a2cfe7a1c5dddf0fec3bab9311a9b7a.zip | |
fileops: added feature to execute external command (#1045)
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@9661 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/General/fileops')
| -rw-r--r-- | src/plugins/General/fileops/fileops.cpp | 125 | ||||
| -rw-r--r-- | src/plugins/General/fileops/fileops.h | 14 | ||||
| -rw-r--r-- | src/plugins/General/fileops/settingsdialog.cpp | 219 | ||||
| -rw-r--r-- | src/plugins/General/fileops/settingsdialog.h | 37 | ||||
| -rw-r--r-- | src/plugins/General/fileops/settingsdialog.ui | 15 |
5 files changed, 216 insertions, 194 deletions
diff --git a/src/plugins/General/fileops/fileops.cpp b/src/plugins/General/fileops/fileops.cpp index 748ae3193..aa26582c5 100644 --- a/src/plugins/General/fileops/fileops.cpp +++ b/src/plugins/General/fileops/fileops.cpp @@ -25,6 +25,7 @@ #include <QMessageBox> #include <QFile> #include <QDir> +#include <QProcess> #include <qmmp/soundcore.h> #include <qmmpui/uihelper.h> #include <qmmpui/playlistmodel.h> @@ -40,31 +41,39 @@ FileOps::FileOps(QObject *parent) : QObject(parent) { //separators QAction *separator1 = new QAction(this); - separator1->setSeparator (true); + separator1->setSeparator(true); QAction *separator2 = new QAction(this); - separator2->setSeparator (true); + separator2->setSeparator(true); //load settings QSettings settings(Qmmp::configFile(), QSettings::IniFormat); settings.beginGroup("FileOps"); - int count = settings.value("count", 0).toInt(); - if (count > 0) + if(!settings.value("name_0").isNull()) UiHelper::instance()->addAction(separator1, UiHelper::PLAYLIST_MENU); else return; - for (int i = 0; i < count; ++i) + int i = 0; + while(!settings.value(QString("name_%1").arg(i)).isNull()) { - m_types << settings.value(QString("action_%1").arg(i), FileOps::COPY).toInt(); - QString name = settings.value(QString("name_%1").arg(i), "Action").toString(); - m_patterns << settings.value(QString("pattern_%1").arg(i)).toString(); - m_destinations << settings.value(QString("destination_%1").arg(i)).toString(); - if (settings.value(QString("enabled_%1").arg(i), true).toBool()) + QString name = settings.value(QString("name_%1").arg(i)).toString(); + QVariantMap data = { + { "action", settings.value(QString("action_%1").arg(i), FileOps::COPY).toInt() }, + { "pattern", settings.value(QString("pattern_%1").arg(i)).toString() }, + { "destination", settings.value(QString("destination_%1").arg(i)).toString() }, + { "command", settings.value(QString("command_%1").arg(i)).toString() }, + + }; + + if(settings.value(QString("enabled_%1").arg(i), true).toBool()) { QAction *action = new QAction(name, this); + action->setData(data); action->setShortcut(settings.value(QString("hotkey_%1").arg(i)).toString()); - connect(action, &QAction::triggered, [i,this]{ execAction(i); }); + connect(action, &QAction::triggered, this, &FileOps::execAction); UiHelper::instance()->addAction(action, UiHelper::PLAYLIST_MENU); } + + ++i; } settings.endGroup(); UiHelper::instance()->addAction(separator2, UiHelper::PLAYLIST_MENU); @@ -73,12 +82,17 @@ FileOps::FileOps(QObject *parent) : QObject(parent) FileOps::~FileOps() {} -void FileOps::execAction(int n) +void FileOps::execAction() { - int type = m_types.at(n); - QString pattern = m_patterns.at(n); - MetaDataFormatter formatter(pattern); - QString destination = m_destinations.at(n); + QAction *action = qobject_cast<QAction *>(sender()); + QVariantMap data = action->data().toMap(); + + int type = data["action"].toInt(); + QString pattern = data["pattern"].toString(); + QString destination = data["destination"].toString(); + QString command = data["command"].toString(); + + MetaDataFormatter formatter(type == EXECUTE ? command : pattern); PlayListModel *model = MediaPlayer::instance()->playListManager()->selectedPlayList(); const QList<PlayListTrack*> tracks = model->selectedTracks(); @@ -88,7 +102,7 @@ void FileOps::execAction(int n) case COPY: { qDebug("FileOps: copy"); - if (!QDir(destination).exists ()) + if(!QDir(destination).exists ()) { QMessageBox::critical (qApp->activeWindow (), tr("Error"), tr("Destination directory doesn't exist")); @@ -106,21 +120,21 @@ void FileOps::execAction(int n) case REMOVE: { qDebug("FileOps: remove"); - if (QMessageBox::question (qApp->activeWindow (), tr("Remove Files"), + if(QMessageBox::question (qApp->activeWindow (), tr("Remove Files"), tr("Are you sure you want to remove %n file(s) from disk?", "",tracks.size()), QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes) break; - if (PlayListManager::instance()->selectedPlayList() != model) + if(PlayListManager::instance()->selectedPlayList() != model) break; for(PlayListTrack *track : qAsConst(tracks)) { - if (PlayListManager::instance()->selectedPlayList() != model) + if(PlayListManager::instance()->selectedPlayList() != model) break; - if (isValid(track) && QFile::exists(track->path()) && QFile::remove(track->path())) + if(isValid(track) && QFile::exists(track->path()) && QFile::remove(track->path())) model->removeTrack(track); } break; @@ -128,13 +142,13 @@ void FileOps::execAction(int n) case MOVE: { qDebug("FileOps: move"); - if (!QDir(destination).exists ()) + if(!QDir(destination).exists ()) { QMessageBox::critical (qApp->activeWindow (), tr("Error"), tr("Destination directory doesn't exist")); break; } - if (QMessageBox::question (qApp->activeWindow (), tr("Move Files"), + if(QMessageBox::question (qApp->activeWindow (), tr("Move Files"), tr("Are you sure you want to move %n file(s)?", "",tracks.size()), QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes) @@ -144,6 +158,12 @@ void FileOps::execAction(int n) move(tracks, destination, &formatter, model); break; } + case EXECUTE: + { + qDebug("FileOps: execute"); + execute(tracks, &formatter, model); + break; + } } } @@ -154,17 +174,17 @@ void FileOps::copy(const QList<PlayListTrack *> &tracks, const QString &dest, co progress.setWindowTitle(tr("Copying")); progress.setCancelButtonText(tr("Stop")); progress.show(); - progress.setAutoClose (false); + progress.setAutoClose(false); int i = 0; for(PlayListTrack *track : qAsConst(tracks)) { - if (!isValid(track) || !QFile::exists(track->path())) + if(!isValid(track) || !QFile::exists(track->path())) continue; QString fileName = formatter->format(track); //generate file name QString ext = QString(".") + track->path().section(".", -1).toLower(); - if (!ext.isEmpty() && !fileName.endsWith(ext, Qt::CaseInsensitive)) + if(!ext.isEmpty() && !fileName.endsWith(ext, Qt::CaseInsensitive)) fileName += ext; //append extension //create destination path @@ -184,18 +204,18 @@ void FileOps::copy(const QList<PlayListTrack *> &tracks, const QString &dest, co //copy file QFile in(track->path()); QFile out(path); - if (!in.open(QIODevice::ReadOnly)) + if(!in.open(QIODevice::ReadOnly)) { qWarning("FileOps: %s", qPrintable(in.errorString ())); continue; } - if (!out.open(QIODevice::WriteOnly)) + if(!out.open(QIODevice::WriteOnly)) { qWarning("FileOps: %s", qPrintable(out.errorString ())); continue; } - progress.setMaximum(int(in.size()/COPY_BLOCK_SIZE)); + progress.setMaximum(int(in.size() / COPY_BLOCK_SIZE)); progress.setValue(0); progress.setLabelText (QString(tr("Copying file %1/%2")).arg(++i).arg(tracks.size())); progress.update(); @@ -203,7 +223,7 @@ void FileOps::copy(const QList<PlayListTrack *> &tracks, const QString &dest, co while (!in.atEnd ()) { out.write(in.read(COPY_BLOCK_SIZE)); - progress.setValue(int(out.size()/COPY_BLOCK_SIZE)); + progress.setValue(int(out.size() / COPY_BLOCK_SIZE)); qApp->processEvents(); } if(progress.wasCanceled ()) @@ -216,21 +236,21 @@ void FileOps::rename(const QList<PlayListTrack *> &tracks, const MetaDataFormatt { for(PlayListTrack *track : qAsConst(tracks)) { - if (!isValid(track) || !QFile::exists(track->path())) //is it file? + if(!isValid(track) || !QFile::exists(track->path())) //is it file? continue; - if (PlayListManager::instance()->selectedPlayList() != model) + if(PlayListManager::instance()->selectedPlayList() != model) break; QString fileName = formatter->format(track); //generate file name QString ext = QString(".") + track->path().section(".", -1).toLower(); - if (!ext.isEmpty() && !fileName.endsWith(ext, Qt::CaseInsensitive)) + if(!ext.isEmpty() && !fileName.endsWith(ext, Qt::CaseInsensitive)) fileName += ext; //append extension //rename file QFile file(track->path()); QString dest = QFileInfo(track->path()).absolutePath (); - if (isValid(track) && file.rename(dest + "/" + fileName) && isValid(track)) + if(isValid(track) && file.rename(dest + "/" + fileName) && isValid(track)) { track->setPath(dest + "/" + fileName); track->updateMetaData(); @@ -252,16 +272,16 @@ void FileOps::move(const QList<PlayListTrack *> &tracks, const QString &dest, co int i = 0; for(PlayListTrack *track : qAsConst(tracks)) { - if (!isValid(track) || !QFile::exists(track->path())) + if(!isValid(track) || !QFile::exists(track->path())) continue; - if (PlayListManager::instance()->selectedPlayList() != model) + if(PlayListManager::instance()->selectedPlayList() != model) break; QString fileName = formatter->format(track); //generate file name QString ext = QString(".") + track->path().section(".", -1).toLower(); - if (!ext.isEmpty() && !fileName.endsWith(ext, Qt::CaseInsensitive)) + if(!ext.isEmpty() && !fileName.endsWith(ext, Qt::CaseInsensitive)) fileName += ext; //append extension //create destination path QString path = dest + "/" + fileName; @@ -300,18 +320,18 @@ void FileOps::move(const QList<PlayListTrack *> &tracks, const QString &dest, co //copy file QFile in(track->path()); QFile out(path); - if (!in.open(QIODevice::ReadOnly)) + if(!in.open(QIODevice::ReadOnly)) { qWarning("FileOps: %s", qPrintable(in.errorString ())); continue; } - if (!out.open(QIODevice::WriteOnly)) + if(!out.open(QIODevice::WriteOnly)) { qWarning("FileOps: %s", qPrintable(out.errorString ())); continue; } - progress.setMaximum(int(in.size()/COPY_BLOCK_SIZE)); + progress.setMaximum(int(in.size() / COPY_BLOCK_SIZE)); progress.setValue(0); progress.update(); @@ -319,7 +339,7 @@ void FileOps::move(const QList<PlayListTrack *> &tracks, const QString &dest, co { progress.wasCanceled (); out.write(in.read(COPY_BLOCK_SIZE)); - progress.setValue(int(out.size()/COPY_BLOCK_SIZE)); + progress.setValue(int(out.size() / COPY_BLOCK_SIZE)); qApp->processEvents(); } @@ -340,8 +360,29 @@ void FileOps::move(const QList<PlayListTrack *> &tracks, const QString &dest, co progress.close(); } +void FileOps::execute(const QList<PlayListTrack *> &tracks, const MetaDataFormatter *formatter, PlayListModel *model) +{ + for(PlayListTrack *track : qAsConst(tracks)) + { + if(!isValid(track) || !QFile::exists(track->path())) //is it file? + continue; + + if(PlayListManager::instance()->selectedPlayList() != model) + break; + + QString command = formatter->format(track); //generate file name + +#ifdef Q_OS_WIN + QProcess::startDetached(QString("cmd.exe /C %1").arg(command)); +#else + QStringList args = { "-c", command }; + QProcess::startDetached("sh", args); +#endif + } +} + bool FileOps::isValid(PlayListTrack *track) const { - QList<PlayListTrack*> tracks = PlayListManager::instance()->selectedPlayList()->selectedTracks(); + const QList<PlayListTrack*> tracks = PlayListManager::instance()->selectedPlayList()->selectedTracks(); return tracks.contains(track); } diff --git a/src/plugins/General/fileops/fileops.h b/src/plugins/General/fileops/fileops.h index 8940c3f17..1bd112913 100644 --- a/src/plugins/General/fileops/fileops.h +++ b/src/plugins/General/fileops/fileops.h @@ -47,22 +47,18 @@ public: RENAME, REMOVE, MOVE, + EXECUTE }; private slots: - void execAction(int n); + void execAction(); private: void copy(const QList<PlayListTrack*> &tracks, const QString &dest, const MetaDataFormatter *formatter); - void rename(const QList<PlayListTrack *> &tracks, const MetaDataFormatter *formatter, - PlayListModel *model); - void move(const QList<PlayListTrack*> &tracks, const QString &dest, const MetaDataFormatter *formatter, - PlayListModel *model); + void rename(const QList<PlayListTrack *> &tracks, const MetaDataFormatter *formatter, PlayListModel *model); + void move(const QList<PlayListTrack*> &tracks, const QString &dest, const MetaDataFormatter *formatter, PlayListModel *model); + void execute(const QList<PlayListTrack*> &tracks, const MetaDataFormatter *formatter, PlayListModel *model); bool isValid(PlayListTrack *track) const; - - QList <int> m_types; - QStringList m_patterns; - QStringList m_destinations; }; #endif diff --git a/src/plugins/General/fileops/settingsdialog.cpp b/src/plugins/General/fileops/settingsdialog.cpp index bb811aeea..6142ec93e 100644 --- a/src/plugins/General/fileops/settingsdialog.cpp +++ b/src/plugins/General/fileops/settingsdialog.cpp @@ -1,11 +1,11 @@ /*************************************************************************** - * Copyright (C) 2009-2021 by Ilya Kotov * + * 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. * + * (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 * @@ -35,48 +35,41 @@ SettingsDialog::SettingsDialog(QWidget *parent) { m_ui.setupUi(this); m_ui.tableWidget->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); - m_ui.tableWidget->verticalHeader()->hide(); m_ui.tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); QSettings settings(Qmmp::configFile(), QSettings::IniFormat); settings.beginGroup("FileOps"); - int count = settings.value("count", 0).toInt(); - for (int i = 0; i < count; ++i) + int i = 0; + while(!settings.value(QString("name_%1").arg(i)).isNull()) { - m_ui.tableWidget->insertRow (i); + m_ui.tableWidget->insertRow(i); QCheckBox *checkBox = new QCheckBox; - checkBox->setFocusPolicy (Qt::NoFocus); + checkBox->setFocusPolicy(Qt::NoFocus); + checkBox->setChecked(settings.value(QString("enabled_%1").arg(i), true).toBool()); - 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->setFocusPolicy (Qt::NoFocus); + 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()); - checkBox->setChecked(settings.value(QString("enabled_%1").arg(i), true).toBool()); - int ci = comboBox->findData (settings.value(QString("action_%1").arg(i), FileOps::COPY).toInt()); - if (ci >= 0) - comboBox->setCurrentIndex(ci); + QTableWidgetItem *hotkeyItem = new QTableWidgetItem(); + hotkeyItem->setText(settings.value(QString("hotkey_%1").arg(i)).toString()); + hotkeyItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); - connect(comboBox, SIGNAL(activated(int)), SLOT(updateLineEdits())); + 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); - ActionItem *item = new ActionItem(settings.value(QString("name_%1").arg(i), "Action").toString()); - item->setPattern(settings.value(QString("pattern_%1").arg(i)).toString()); - item->setDestination(settings.value(QString("destination_%1").arg(i)).toString()); - - m_ui.tableWidget->setCellWidget (i, 0, checkBox); - m_ui.tableWidget->setCellWidget (i, 1, comboBox); - m_ui.tableWidget->setItem (i, 2, item); - QTableWidgetItem *item2 = new QTableWidgetItem(); - item2->setText(settings.value(QString("hotkey_%1").arg(i)).toString()); - m_ui.tableWidget->setItem (i, 3, item2); - m_ui.tableWidget->item (i, 3)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + ++i; } settings.endGroup(); - connect (m_ui.tableWidget, SIGNAL(currentCellChanged(int,int,int,int)), - SLOT(updateLineEdits())); + connect(m_ui.tableWidget, SIGNAL(currentCellChanged(int,int,int,int)), SLOT(updateLineEdits())); updateLineEdits(); createMenus(); } @@ -89,31 +82,30 @@ void SettingsDialog::accept() { QSettings settings(Qmmp::configFile(), QSettings::IniFormat); settings.beginGroup("FileOps"); - //remove unused keys - int count = settings.value("count", 0).toInt(); - for (int i = m_ui.tableWidget->rowCount() - 1; i < count; ++i) - { - settings.remove (QString("enabled_%1").arg(i)); - settings.remove (QString("action_%1").arg(i)); - settings.remove (QString("name_%1").arg(i)); - settings.remove (QString("pattern_%1").arg(i)); - settings.remove (QString("destination_%1").arg(i)); - } + //remove all previous keys + settings.remove(QString()); //save actions - settings.setValue("count", m_ui.tableWidget->rowCount()); - for (int i = 0; i < m_ui.tableWidget->rowCount(); ++i) + for(int i = 0; i < m_ui.tableWidget->rowCount(); ++i) { - QCheckBox *checkBox = qobject_cast<QCheckBox *>(m_ui.tableWidget->cellWidget (i, 0)); - settings.setValue (QString("enabled_%1").arg(i), checkBox->isChecked()); + 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<QCheckBox *>(m_ui.tableWidget->cellWidget(i, 0)); + settings.setValue(QString("enabled_%1").arg(i), checkBox->isChecked()); + + QComboBox *comboBox = qobject_cast<QComboBox *>(m_ui.tableWidget->cellWidget(i, 1)); + settings.setValue(QString("action_%1").arg(i), comboBox->itemData(comboBox->currentIndex())); - QComboBox *comboBox = qobject_cast<QComboBox *>(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()); - ActionItem *item = dynamic_cast<ActionItem *>(m_ui.tableWidget->item(i,2)); - settings.setValue (QString("name_%1").arg(i), item->text()); - settings.setValue (QString("pattern_%1").arg(i), item->pattern()); - settings.setValue (QString("destination_%1").arg(i), item->destination()); - settings.setValue (QString("hotkey_%1").arg(i), m_ui.tableWidget->item(i,3)->text()); + settings.setValue(QString("hotkey_%1").arg(i), m_ui.tableWidget->item(i, 3)->text()); } settings.endGroup(); QDialog::accept(); @@ -121,96 +113,88 @@ void SettingsDialog::accept() void SettingsDialog::on_newButton_clicked() { - int row = m_ui.tableWidget->rowCount (); - m_ui.tableWidget->insertRow (row); + int row = m_ui.tableWidget->rowCount(); + m_ui.tableWidget->insertRow(row); QCheckBox *checkBox = new QCheckBox; - checkBox->setFocusPolicy (Qt::NoFocus); + checkBox->setFocusPolicy(Qt::NoFocus); checkBox->setChecked(true); - 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->setFocusPolicy (Qt::NoFocus); + QComboBox *comboBox = createComboBox(); - ActionItem *item = new ActionItem(tr("New action")); - item->setDestination(QStandardPaths::writableLocation(QStandardPaths::MusicLocation)); - item->setPattern("%p - %t"); + 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, item); - QTableWidgetItem *item2 = new QTableWidgetItem(); - m_ui.tableWidget->setItem (row, 3, item2); - m_ui.tableWidget->item (row, 3)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + 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 ()); + if(m_ui.tableWidget->currentRow() >= 0) + m_ui.tableWidget->removeRow(m_ui.tableWidget->currentRow()); } void SettingsDialog::updateLineEdits() { - if (m_ui.tableWidget->currentRow () >= 0) + 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) { - ActionItem *item = dynamic_cast<ActionItem *>(m_ui.tableWidget->item(m_ui.tableWidget->currentRow (), 2)); - m_ui.destinationEdit->setText(item->destination()); - m_ui.patternEdit->setText(item->pattern()); + QTableWidgetItem *nameItem = m_ui.tableWidget->item(m_ui.tableWidget->currentRow(), 2); + m_ui.destinationEdit->setText(nameItem->data(DestionationRole).toString()); + m_ui.patternEdit->setText(nameItem->data(PatternRole).toString()); - QComboBox *comboBox = qobject_cast<QComboBox *> - (m_ui.tableWidget->cellWidget (m_ui.tableWidget->currentRow (), 1)); - int action = comboBox->itemData (comboBox->currentIndex()).toInt(); + QComboBox *comboBox = qobject_cast<QComboBox *>(m_ui.tableWidget->cellWidget(m_ui.tableWidget->currentRow(), 1)); + int action = comboBox->itemData(comboBox->currentIndex()).toInt(); if(action == FileOps::COPY || action == FileOps::MOVE) { - m_ui.destinationEdit->setEnabled(true); - m_ui.patternEdit->setEnabled(true); - m_ui.destButton->setEnabled(true); - m_ui.patternButton->setEnabled(true); - } - else if(action == FileOps::RENAME) - { - m_ui.destinationEdit->setEnabled(false); - m_ui.patternEdit->setEnabled(true); - m_ui.destButton->setEnabled(false); - m_ui.patternButton->setEnabled(true); + 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::REMOVE) + else if(action == FileOps::RENAME || action == FileOps::EXECUTE) { - m_ui.destinationEdit->setEnabled(false); - m_ui.patternEdit->setEnabled(false); - m_ui.destButton->setEnabled(false); - m_ui.patternButton->setEnabled(false); + 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:")); } } - else - { - m_ui.destinationEdit->setEnabled(false); - m_ui.patternEdit->setEnabled(false); - m_ui.destButton->setEnabled(false); - m_ui.patternButton->setEnabled(false); - } } void SettingsDialog::on_destinationEdit_textChanged(QString dest) { - if (m_ui.tableWidget->currentRow () >= 0) + if(m_ui.tableWidget->currentRow() >= 0) { - ActionItem *item = dynamic_cast<ActionItem *>(m_ui.tableWidget->item(m_ui.tableWidget->currentRow (), 2)); - item->setDestination(dest); + 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) + if(m_ui.tableWidget->currentRow() >= 0) { - ActionItem *item = dynamic_cast<ActionItem *>(m_ui.tableWidget->item(m_ui.tableWidget->currentRow (), 2)); - item->setPattern(pattern); + QTableWidgetItem *item = m_ui.tableWidget->item(m_ui.tableWidget->currentRow(), 2); + item->setData(PatternRole, pattern); + item->setData(CommandRole, pattern); } } @@ -222,6 +206,18 @@ void SettingsDialog::createMenus() 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); @@ -229,16 +225,15 @@ void SettingsDialog::addTitleString(const QString &str) void SettingsDialog::on_destButton_clicked() { - QString dir = FileDialog::getExistingDirectory(this, tr("Choose a directory"), - m_ui.destinationEdit->text()); + 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) +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) + if(m_ui.tableWidget->column(item) == 3 && dialog->exec() == QDialog::Accepted) item->setText(dialog->key()); dialog->deleteLater(); } diff --git a/src/plugins/General/fileops/settingsdialog.h b/src/plugins/General/fileops/settingsdialog.h index fe53f891d..33c97b9ae 100644 --- a/src/plugins/General/fileops/settingsdialog.h +++ b/src/plugins/General/fileops/settingsdialog.h @@ -26,7 +26,7 @@ /** @author Ilya Kotov <forkotov02@ya.ru> */ -class ActionItem; +class QComboBox; class SettingsDialog : public QDialog { @@ -52,37 +52,16 @@ private slots: private: void createMenus(); - Ui::SettingsDialog m_ui; -}; - -class ActionItem: public QTableWidgetItem -{ -public: - explicit ActionItem (const QString &text): QTableWidgetItem(text){} - - inline const QString &pattern() const - { - return m_pattern; - } + QComboBox *createComboBox(); - inline const QString &destination() const - { - return m_destination; - } - - inline void setPattern(const QString &pattern) - { - m_pattern = pattern; - } + Ui::SettingsDialog m_ui; - inline void setDestination(const QString &dest) + enum DataTypeRole { - m_destination = dest; - } - -private: - QString m_pattern, m_destination; + PatternRole = Qt::UserRole + 1, + DestionationRole, + CommandRole + }; }; - #endif diff --git a/src/plugins/General/fileops/settingsdialog.ui b/src/plugins/General/fileops/settingsdialog.ui index 86e6245f0..d1bc5c0ff 100644 --- a/src/plugins/General/fileops/settingsdialog.ui +++ b/src/plugins/General/fileops/settingsdialog.ui @@ -43,6 +43,9 @@ <property name="cornerButtonEnabled"> <bool>true</bool> </property> + <attribute name="verticalHeaderVisible"> + <bool>false</bool> + </attribute> <column> <property name="text"> <string>Enabled</string> @@ -78,6 +81,10 @@ <property name="text"> <string>Add</string> </property> + <property name="icon"> + <iconset theme="list-add"> + <normaloff>.</normaloff>.</iconset> + </property> </widget> </item> <item> @@ -91,6 +98,10 @@ <property name="text"> <string>Remove</string> </property> + <property name="icon"> + <iconset theme="list-remove"> + <normaloff>.</normaloff>.</iconset> + </property> </widget> </item> <item> @@ -111,7 +122,7 @@ <item row="2" column="0" colspan="2"> <layout class="QGridLayout" name="gridLayout"> <item row="0" column="0"> - <widget class="QLabel" name="label"> + <widget class="QLabel" name="destinationLabel"> <property name="text"> <string>Destination:</string> </property> @@ -128,7 +139,7 @@ </widget> </item> <item row="1" column="0"> - <widget class="QLabel" name="label_2"> + <widget class="QLabel" name="patternLabel"> <property name="text"> <string>File name pattern:</string> </property> |
