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 }