File indexing completed on 2025-02-23 04:34:17

0001 /**
0002  * \file filterdialog.cpp
0003  * Filter dialog.
0004  *
0005  * \b Project: Kid3
0006  * \author Urs Fleisch
0007  * \date 16 Jan 2008
0008  *
0009  * Copyright (C) 2008-2024  Urs Fleisch
0010  *
0011  * This file is part of Kid3.
0012  *
0013  * Kid3 is free software; you can redistribute it and/or modify
0014  * it under the terms of the GNU General Public License as published by
0015  * the Free Software Foundation; either version 2 of the License, or
0016  * (at your option) any later version.
0017  *
0018  * Kid3 is distributed in the hope that it will be useful,
0019  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0020  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0021  * GNU General Public License for more details.
0022  *
0023  * You should have received a copy of the GNU General Public License
0024  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
0025  */
0026 
0027 #include "filterdialog.h"
0028 #include <QLayout>
0029 #include <QGroupBox>
0030 #include <QPushButton>
0031 #include <QLabel>
0032 #include <QSpinBox>
0033 #include <QString>
0034 #include <QHBoxLayout>
0035 #include <QVBoxLayout>
0036 #include "filterconfig.h"
0037 #include "contexthelp.h"
0038 #include "formatlistedit.h"
0039 
0040 /**
0041  * Constructor.
0042  *
0043  * @param parent parent widget
0044  */
0045 FilterDialog::FilterDialog(QWidget* parent) : QDialog(parent),
0046   m_isAbortButton(false)
0047 {
0048   setObjectName(QLatin1String("FilterDialog"));
0049   setWindowTitle(tr("Filter"));
0050   setSizeGripEnabled(true);
0051 
0052   auto vlayout = new QVBoxLayout(this);
0053   m_previewBox = new QGroupBox(tr("&Preview"));
0054   m_previewBox->setCheckable(true);
0055   m_previewBox->setChecked(false);
0056   auto previewLayout = new QVBoxLayout(m_previewBox);
0057   m_edit = new QTextEdit;
0058   m_edit->setReadOnly(true);
0059 #if QT_VERSION >= 0x050a00
0060   m_edit->setTabStopDistance(20);
0061 #else
0062   m_edit->setTabStopWidth(20);
0063 #endif
0064   m_edit->setAcceptRichText(false);
0065   previewLayout->addWidget(m_edit);
0066   vlayout->addWidget(m_previewBox);
0067 
0068   m_formatListEdit = new FormatListEdit(
0069         {tr("&Filter:"), tr("&Expression:")},
0070         {QString(), FileFilter::getFormatToolTip()},
0071         this);
0072   vlayout->addWidget(m_formatListEdit);
0073 
0074   auto hlayout = new QHBoxLayout;
0075   auto helpButton = new QPushButton(tr("&Help"), this);
0076   helpButton->setAutoDefault(false);
0077   hlayout->addWidget(helpButton);
0078   connect(helpButton, &QAbstractButton::clicked, this, &FilterDialog::showHelp);
0079 
0080   auto saveButton = new QPushButton(tr("&Save Settings"), this);
0081   saveButton->setAutoDefault(false);
0082   hlayout->addWidget(saveButton);
0083   connect(saveButton, &QAbstractButton::clicked, this, &FilterDialog::saveConfig);
0084 
0085   auto hspacer = new QSpacerItem(16, 0, QSizePolicy::Expanding,
0086                                          QSizePolicy::Minimum);
0087   hlayout->addItem(hspacer);
0088 
0089   m_applyButton = new QPushButton(this);
0090   setAbortButton(false);
0091   auto closeButton = new QPushButton(tr("&Close"), this);
0092   m_applyButton->setAutoDefault(false);
0093   m_applyButton->setDefault(true);
0094   closeButton->setAutoDefault(false);
0095   hlayout->addWidget(m_applyButton);
0096   hlayout->addWidget(closeButton);
0097   connect(m_applyButton, &QAbstractButton::clicked, this, &FilterDialog::applyOrAbortFilter);
0098   connect(closeButton, &QAbstractButton::clicked, this, &QDialog::reject);
0099   connect(this, &FilterDialog::rejected, &m_fileFilter, &FileFilter::abort);
0100 
0101   vlayout->addLayout(hlayout);
0102 }
0103 
0104 /**
0105  * Apply or abort filter.
0106  */
0107 void FilterDialog::applyOrAbortFilter()
0108 {
0109   if (m_isAbortButton) {
0110     m_fileFilter.abort();
0111   } else {
0112     m_edit->clear();
0113     m_fileFilter.setFilterExpression(m_formatListEdit->getCurrentFormat(1));
0114     m_fileFilter.initParser();
0115     emit apply(m_fileFilter);
0116     if (!m_previewBox->isChecked()) {
0117       accept();
0118     }
0119   }
0120 }
0121 
0122 /**
0123  * Set the filter combo box and line edit from the configuration.
0124  */
0125 void FilterDialog::setFiltersFromConfig()
0126 {
0127   const FilterConfig& filterCfg = FilterConfig::instance();
0128   m_formatListEdit->setFormats(
0129         {filterCfg.filterNames(), filterCfg.filterExpressions()},
0130         filterCfg.filterIndex());
0131 }
0132 
0133 /**
0134  * Read the local settings from the configuration.
0135  */
0136 void FilterDialog::readConfig()
0137 {
0138   m_fileFilter.clearAborted();
0139   m_edit->clear();
0140   setAbortButton(false);
0141 
0142   setFiltersFromConfig();
0143 
0144   if (!FilterConfig::instance().windowGeometry().isEmpty()) {
0145     restoreGeometry(FilterConfig::instance().windowGeometry());
0146   }
0147 }
0148 
0149 /**
0150  * Save the local settings to the configuration.
0151  */
0152 void FilterDialog::saveConfig()
0153 {
0154   int idx;
0155   FilterConfig& filterCfg = FilterConfig::instance();
0156   QList<QStringList> formats = m_formatListEdit->getFormats(&idx);
0157   filterCfg.setFilterIndex(idx);
0158   filterCfg.setFilterNames(formats.at(0));
0159   filterCfg.setFilterExpressions(formats.at(1));
0160   filterCfg.setWindowGeometry(saveGeometry());
0161 
0162   setFiltersFromConfig();
0163 }
0164 
0165 /**
0166  * Show help.
0167  */
0168 void FilterDialog::showHelp()
0169 {
0170   ContextHelp::displayHelp(QLatin1String("filter"));
0171 }
0172 
0173 /**
0174  * Show information about filter event.
0175  */
0176 void FilterDialog::showFilterEvent(int type, const QString& fileName) {
0177   if (!m_previewBox->isChecked())
0178     return;
0179 
0180   switch (type) {
0181   case FileFilter::Started:
0182     m_edit->append(tr("Started"));
0183     setAbortButton(true);
0184     break;
0185   case FileFilter::Directory:
0186     m_edit->append(QLatin1Char('\t') + fileName);
0187     break;
0188   case FileFilter::ParseError:
0189     m_edit->append(QLatin1String("parse error"));
0190     break;
0191   case FileFilter::FilePassed:
0192     m_edit->append(QLatin1String("+\t") + fileName);
0193     break;
0194   case FileFilter::FileFilteredOut:
0195     m_edit->append(QLatin1String("-\t") + fileName);
0196     break;
0197   case FileFilter::Finished:
0198     m_edit->append(tr("Finished"));
0199     setAbortButton(false);
0200     break;
0201   case FileFilter::Aborted:
0202     m_edit->append(tr("Aborted"));
0203     setAbortButton(false);
0204     break;
0205   }
0206 }
0207 
0208 /**
0209  * Set button to Start or Abort.
0210  * @param enableAbort true to set Abort button
0211  */
0212 void FilterDialog::setAbortButton(bool enableAbort)
0213 {
0214   m_isAbortButton = enableAbort;
0215   m_applyButton->setText(m_isAbortButton ? tr("A&bort") : tr("&Apply"));
0216 }