diff --git a/src/doc/user/usermanual.xml b/src/doc/user/usermanual.xml index 50bc8f03..8f0a95e9 100644 --- a/src/doc/user/usermanual.xml +++ b/src/doc/user/usermanual.xml @@ -397,15 +397,12 @@ indexedmimetypes = application/pdf in effect until the end of the file or another section indicator). - In order to set excludedmimetypes - or indexedmimetypes, you need to edit the - main - configuration file - (recoll.conf). I used to have - a bogus reason for this, but the really true truth is that - I was too lazy to extend the GUI for these relatively - rarely used parameters. - + excludedmimetypes or + indexedmimetypes, can be set either by + editing the + main configuration file + (recoll.conf), or from the GUI + index configuration tool. diff --git a/src/qtgui/confgui/confgui.cpp b/src/qtgui/confgui/confgui.cpp index 3c5d108b..46a16597 100644 --- a/src/qtgui/confgui/confgui.cpp +++ b/src/qtgui/confgui/confgui.cpp @@ -251,8 +251,12 @@ ConfParamFNW::ConfParamFNW(QWidget *parent, ConfLink cflink, m_hl->addWidget(m_le); m_pb = new QPushButton(this); - m_pb->setText(tr("Choose")); - setSzPol(m_pb, QSizePolicy::Fixed, QSizePolicy::Fixed, 1, 0); + + QString text = tr("Choose"); + m_pb->setText(text); + int width = m_pb->fontMetrics().boundingRect(text).width() + 15; + m_pb->setMaximumWidth(width); + setSzPol(m_pb, QSizePolicy::Minimum, QSizePolicy::Fixed, 0, 0); m_hl->addWidget(m_pb); loadValue(); @@ -302,13 +306,19 @@ ConfParamSLW::ConfParamSLW(QWidget *parent, ConfLink cflink, vl1->addWidget(tl); QPushButton *pbA = new QPushButton(this); - pbA->setText(tr("+")); - setSzPol(pbA, QSizePolicy::Fixed, QSizePolicy::Fixed, 0, 0); + QString text = tr("+"); + pbA->setText(text); + int width = pbA->fontMetrics().boundingRect(text).width() + 15; + pbA->setMaximumWidth(width); + setSzPol(pbA, QSizePolicy::Minimum, QSizePolicy::Fixed, 0, 0); hl1->addWidget(pbA); QPushButton *pbD = new QPushButton(this); - setSzPol(pbD, QSizePolicy::Fixed, QSizePolicy::Fixed, 0, 0); - pbD->setText(tr("-")); + text = tr("-"); + pbD->setText(text); + width = pbD->fontMetrics().boundingRect(text).width() + 15; + pbD->setMaximumWidth(width); + setSzPol(pbD, QSizePolicy::Minimum, QSizePolicy::Fixed, 0, 0); hl1->addWidget(pbD); vl1->addLayout(hl1); diff --git a/src/qtgui/confgui/confguiindex.cpp b/src/qtgui/confgui/confguiindex.cpp index 529350cd..4cef94c3 100644 --- a/src/qtgui/confgui/confguiindex.cpp +++ b/src/qtgui/confgui/confguiindex.cpp @@ -107,7 +107,7 @@ void ConfIndexW::reloadPanels() m_widgets.push_back(w); tabWidget->addTab(w, QObject::tr("Global parameters")); - w = new ConfSubPanelW(this, m_conf); + w = new ConfSubPanelW(this, m_conf, m_rclconf); m_widgets.push_back(w); tabWidget->addTab(w, QObject::tr("Local parameters")); @@ -225,21 +225,26 @@ ConfSearchPanelW::ConfSearchPanelW(QWidget *parent, ConfNull *config) ConfTopPanelW::ConfTopPanelW(QWidget *parent, ConfNull *config) : QWidget(parent) { + QWidget *w = 0; + QGridLayout *gl1 = new QGridLayout(this); gl1->setSpacing(spacing); gl1->setMargin(margin); - ConfLink lnktopdirs(new ConfLinkRclRep(config, "topdirs")); - ConfParamDNLW *etopdirs = new - ConfParamDNLW(this, lnktopdirs, tr("Top directories"), - tr("The list of directories where recursive " - "indexing starts. Default: your home.")); - setSzPol(etopdirs, QSizePolicy::Preferred, QSizePolicy::Preferred, 1, 3); - gl1->addWidget(etopdirs, 0, 0, 1, 2); + int gridrow = 0; + + w = new ConfParamDNLW(this, + ConfLink(new ConfLinkRclRep(config, "topdirs")), + tr("Top directories"), + tr("The list of directories where recursive " + "indexing starts. Default: your home.")); + setSzPol(w, QSizePolicy::Preferred, QSizePolicy::Preferred, 1, 3); + gl1->addWidget(w, gridrow++, 0, 1, 2); - ConfLink lnkskp(new ConfLinkRclRep(config, "skippedPaths")); ConfParamSLW *eskp = new - ConfParamSLW(this, lnkskp, tr("Skipped paths"), + ConfParamSLW(this, + ConfLink(new ConfLinkRclRep(config, "skippedPaths")), + tr("Skipped paths"), tr("These are names of directories which indexing " "will not enter.
May contain wildcards. " "Must match " @@ -249,7 +254,7 @@ ConfTopPanelW::ConfTopPanelW(QWidget *parent, ConfNull *config) "would be '/home/me/tmp*', not '/usr/home/me/tmp*')")); eskp->setFsEncoding(true); setSzPol(eskp, QSizePolicy::Preferred, QSizePolicy::Preferred, 1, 3); - gl1->addWidget(eskp, 1, 0, 1, 2); + gl1->addWidget(eskp, gridrow++, 0, 1, 2); vector cstemlangs = Rcl::Db::getStemmerNames(); QStringList stemlangs; @@ -257,103 +262,112 @@ ConfTopPanelW::ConfTopPanelW(QWidget *parent, ConfNull *config) it != cstemlangs.end(); it++) { stemlangs.push_back(QString::fromUtf8(it->c_str())); } - ConfLink lnkidxsl(new ConfLinkRclRep(config, "indexstemminglanguages")); - ConfParamCSLW *eidxsl = new - ConfParamCSLW(this, lnkidxsl, tr("Stemming languages"), + w = new + ConfParamCSLW(this, + ConfLink(new ConfLinkRclRep(config, + "indexstemminglanguages")), + tr("Stemming languages"), tr("The languages for which stemming expansion
" "dictionaries will be built."), stemlangs); - setSzPol(eidxsl, QSizePolicy::Preferred, QSizePolicy::Preferred, 1, 1); - gl1->addWidget(eidxsl, 2, 0, 1, 2); + setSzPol(w, QSizePolicy::Preferred, QSizePolicy::Preferred, 1, 1); + gl1->addWidget(w, gridrow, 0); + - ConfLink lnk4(new ConfLinkRclRep(config, "logfilename")); - ConfParamFNW *e4 = new - ConfParamFNW(this, lnk4, tr("Log file name"), - tr("The file where the messages will be written.
" - "Use 'stderr' for terminal output"), false); - gl1->addWidget(e4, 3, 0, 1, 2); + w = new ConfParamFNW(this, + ConfLink(new ConfLinkRclRep(config, "logfilename")), + tr("Log file name"), + tr("The file where the messages will be written.
" + "Use 'stderr' for terminal output"), false); + gl1->addWidget(w, gridrow++, 1); - QWidget *w = 0; + + w = new ConfParamIntW(this, + ConfLink(new ConfLinkRclRep(config, "loglevel")), + tr("Log verbosity level"), + tr("This value adjusts the amount of " + "messages,
from only errors to a " + "lot of debugging data."), 0, 6); + gl1->addWidget(w, gridrow, 0); - ConfLink lnk1(new ConfLinkRclRep(config, "loglevel")); - w = new ConfParamIntW(this, lnk1, tr("Log verbosity level"), - tr("This value adjusts the amount of " - "messages,
from only errors to a " - "lot of debugging data."), 0, 6); - gl1->addWidget(w, 4, 0); - - ConfLink lnkidxflsh(new ConfLinkRclRep(config, "idxflushmb")); - w = new ConfParamIntW(this, lnkidxflsh, + w = new ConfParamIntW(this, + ConfLink(new ConfLinkRclRep(config, "idxflushmb")), tr("Index flush megabytes interval"), tr("This value adjust the amount of " "data which is indexed between flushes to disk.
" "This helps control the indexer memory usage. " "Default 10MB "), 0, 1000); - gl1->addWidget(w, 4, 1); + gl1->addWidget(w, gridrow++, 1); - ConfLink lnkfsocc(new ConfLinkRclRep(config, "maxfsoccuppc")); - w = new ConfParamIntW(this, lnkfsocc, tr("Max disk occupation (%)"), - tr("This is the percentage of disk occupation where " - "indexing will fail and stop (to avoid filling up " - "your disk).
" - "0 means no limit (this is the default)."), 0, 100); - gl1->addWidget(w, 5, 0); + w = new ConfParamIntW(this, + ConfLink(new ConfLinkRclRep(config, "maxfsoccuppc")), + tr("Max disk occupation (%)"), + tr("This is the percentage of disk occupation where " + "indexing will fail and stop (to avoid filling up " + "your disk).
0 means no limit " + "(this is the default)."), 0, 100); + gl1->addWidget(w, gridrow++, 0); - ConfLink lnknaspl(new ConfLinkRclRep(config, "noaspell")); ConfParamBoolW* cpasp = - new ConfParamBoolW(this, lnknaspl, tr("No aspell usage"), - tr("Disables use of aspell to generate spelling " - "approximation in the term explorer tool.
" - "Useful if aspell is absent or does not work. ")); - gl1->addWidget(cpasp, 6, 0); + new ConfParamBoolW(this, + ConfLink(new ConfLinkRclRep(config, "noaspell")), + tr("No aspell usage"), + tr("Disables use of aspell to generate spelling " + "approximation in the term explorer tool.
" + "Useful if aspell is absent or does not work. ")); + gl1->addWidget(cpasp, gridrow, 0); - ConfLink lnk2(new ConfLinkRclRep(config, "aspellLanguage")); - ConfParamStrW* cpaspl = - new ConfParamStrW(this, lnk2, tr("Aspell language"), - tr("The language for the aspell dictionary. " - "This should look like 'en' or 'fr' ...
" - "If this value is not set, the NLS environment " + ConfParamStrW* cpaspl = new + ConfParamStrW(this, + ConfLink(new ConfLinkRclRep(config, "aspellLanguage")), + tr("Aspell language"), + tr("The language for the aspell dictionary. " + "This should look like 'en' or 'fr' ...
" + "If this value is not set, the NLS environment " "will be used to compute it, which usually works. " "To get an idea of what is installed on your system, " "type 'aspell config' and look for .dat files inside " "the 'data-dir' directory. ")); cpaspl->setEnabled(!cpasp->m_cb->isChecked()); connect(cpasp->m_cb, SIGNAL(toggled(bool)), cpaspl,SLOT(setDisabled(bool))); - gl1->addWidget(cpaspl, 6, 1); + gl1->addWidget(cpaspl, gridrow++, 1); - ConfLink lnkdbd(new ConfLinkRclRep(config, "dbdir")); - ConfParamFNW *edbd = new - ConfParamFNW(this, lnkdbd, tr("Database directory name"), - tr("The name for a directory where to store the index
" + w = new + ConfParamFNW(this, + ConfLink(new ConfLinkRclRep(config, "dbdir")), + tr("Database directory name"), + tr("The name for a directory where to store the index
" "A non-absolute path is taken relative to the " "configuration directory. The default is 'xapiandb'." ), true); - gl1->addWidget(edbd, 7, 0, 1, 2); + gl1->addWidget(w, gridrow++, 0, 1, 2); - ConfLink lnkuexc(new ConfLinkRclRep(config, "unac_except_trans")); - ConfParamStrW *euexc = new - ConfParamStrW(this, lnkuexc, tr("Unac exceptions"), - tr("

These are exceptions to the unac mechanism " - "which, by default, removes all diacritics, " - "and performs canonic decomposition. You can override " - "unaccenting for some characters, depending on your " - "language, and specify additional decompositions, " - "e.g. for ligatures. In each space-separated entry, " - "the first character is the source one, and the rest " - "is the translation." - )); - gl1->addWidget(euexc, 8, 0, 1, 2); + w = new + ConfParamStrW(this, + ConfLink(new ConfLinkRclRep(config, "unac_except_trans")), + tr("Unac exceptions"), + tr("

These are exceptions to the unac mechanism " + "which, by default, removes all diacritics, " + "and performs canonic decomposition. You can override " + "unaccenting for some characters, depending on your " + "language, and specify additional decompositions, " + "e.g. for ligatures. In each space-separated entry, " + "the first character is the source one, and the rest " + "is the translation." + )); + gl1->addWidget(w, gridrow++, 0, 1, 2); } -ConfSubPanelW::ConfSubPanelW(QWidget *parent, ConfNull *config) +ConfSubPanelW::ConfSubPanelW(QWidget *parent, ConfNull *config, + RclConfig *rclconf) : QWidget(parent), m_config(config) { QVBoxLayout *vboxLayout = new QVBoxLayout(this); vboxLayout->setSpacing(spacing); vboxLayout->setMargin(margin); - ConfLink lnksubkeydirs(new ConfLinkNullRep()); m_subdirs = new - ConfParamDNLW(this, lnksubkeydirs, + ConfParamDNLW(this, + ConfLink(new ConfLinkNullRep()), QObject::tr("Customised subtrees"), QObject::tr("The list of subdirectories in the indexed " "hierarchy
where some parameters need " @@ -404,16 +418,41 @@ ConfSubPanelW::ConfSubPanelW(QWidget *parent, ConfNull *config) QGridLayout *gl1 = new QGridLayout(m_groupbox); gl1->setSpacing(spacing); gl1->setMargin(margin); + int gridy = 0; - ConfLink lnkskn(new ConfLinkRclRep(config, "skippedNames", &m_sk)); - ConfParamSLW *eskn = new - ConfParamSLW(m_groupbox, lnkskn, - QObject::tr("Skipped names"), - QObject::tr("These are patterns for file or directory " - " names which should not be indexed.")); + ConfParamSLW *eskn = new ConfParamSLW( + m_groupbox, + ConfLink(new ConfLinkRclRep(config, "skippedNames", &m_sk)), + QObject::tr("Skipped names"), + QObject::tr("These are patterns for file or directory " + " names which should not be indexed.")); eskn->setFsEncoding(true); m_widgets.push_back(eskn); - gl1->addWidget(eskn, 0, 0, 1, 2); + gl1->addWidget(eskn, gridy, 0); + + vector amimes = rclconf->getAllMimeTypes(); + QStringList amimesq; + for (vector::const_iterator it = amimes.begin(); + it != amimes.end(); it++) { + amimesq.push_back(QString::fromUtf8(it->c_str())); + } + + ConfParamCSLW *eincm = new ConfParamCSLW( + m_groupbox, + ConfLink(new ConfLinkRclRep(config, "indexedmimetypes", &m_sk)), + tr("Only mime types"), + tr("An exclusive list of indexed mime types.
Nothing " + "else will be indexed. Normally empty and inactive"), amimesq); + m_widgets.push_back(eincm); + gl1->addWidget(eincm, gridy++, 1); + + ConfParamCSLW *eexcm = new ConfParamCSLW( + m_groupbox, + ConfLink(new ConfLinkRclRep(config, "excludedmimetypes", &m_sk)), + tr("Exclude mime types"), + tr("Mime types not to be indexed"), amimesq); + m_widgets.push_back(eexcm); + gl1->addWidget(eexcm, gridy, 0); vector args; args.push_back("-l"); @@ -434,85 +473,81 @@ ConfSubPanelW::ConfSubPanelW(QWidget *parent, ConfNull *config) charsets.push_back(QString::fromUtf8(it->c_str())); } - ConfLink lnk21(new ConfLinkRclRep(config, "defaultcharset", &m_sk)); - ConfParamCStrW *e21 = new - ConfParamCStrW(m_groupbox, lnk21, - QObject::tr("Default character set"), - QObject::tr("This is the character set used for reading files " - "which do not identify the character set " - "internally, for example pure text files.
" - "The default value is empty, " - "and the value from the NLS environnement is used." - ), charsets); + ConfParamCStrW *e21 = new ConfParamCStrW( + m_groupbox, + ConfLink(new ConfLinkRclRep(config, "defaultcharset", &m_sk)), + QObject::tr("Default
character set"), + QObject::tr("Character set used for reading files " + "which do not identify the character set " + "internally, for example pure text files.
" + "The default value is empty, " + "and the value from the NLS environnement is used." + ), charsets); m_widgets.push_back(e21); - gl1->addWidget(e21, 1, 0, 1, 2); + gl1->addWidget(e21, gridy++, 1); - ConfLink lnk3(new ConfLinkRclRep(config, "followLinks", &m_sk)); - ConfParamBoolW *e3 = new - ConfParamBoolW(m_groupbox, lnk3, - QObject::tr("Follow symbolic links"), - QObject::tr("Follow symbolic links while " - "indexing. The default is no, " - "to avoid duplicate indexing")); + ConfParamBoolW *e3 = new ConfParamBoolW( + m_groupbox, + ConfLink(new ConfLinkRclRep(config, "followLinks", &m_sk)), + QObject::tr("Follow symbolic links"), + QObject::tr("Follow symbolic links while " + "indexing. The default is no, " + "to avoid duplicate indexing")); m_widgets.push_back(e3); - gl1->addWidget(e3, 2, 0); + gl1->addWidget(e3, gridy, 0); - ConfLink lnkafln(new ConfLinkRclRep(config, "indexallfilenames", &m_sk)); - ConfParamBoolW *eafln = new - ConfParamBoolW(m_groupbox, lnkafln, - QObject::tr("Index all file names"), - QObject::tr("Index the names of files for which the contents " - "cannot be identified or processed (no or " - "unsupported mime type). Default true")); + ConfParamBoolW *eafln = new ConfParamBoolW( + m_groupbox, + ConfLink(new ConfLinkRclRep(config, "indexallfilenames", &m_sk)), + QObject::tr("Index all file names"), + QObject::tr("Index the names of files for which the contents " + "cannot be identified or processed (no or " + "unsupported mime type). Default true")); m_widgets.push_back(eafln); - gl1->addWidget(eafln, 2, 1); + gl1->addWidget(eafln, gridy++, 1); - ConfLink lnkzfmaxkbs(new ConfLinkRclRep(config, "compressedfilemaxkbs")); - ConfParamIntW *ezfmaxkbs = new - ConfParamIntW(m_groupbox, lnkzfmaxkbs, - tr("Max. compressed file size (KB)"), - tr("This value sets a threshold beyond which compressed" - "files will not be processed. Set to -1 for no " - "limit, to 0 for no decompression ever."), - -1, 1000000, -1); + ConfParamIntW *ezfmaxkbs = new ConfParamIntW( + m_groupbox, + ConfLink(new ConfLinkRclRep(config, "compressedfilemaxkbs", &m_sk)), + tr("Max. compressed file size (KB)"), + tr("This value sets a threshold beyond which compressed" + "files will not be processed. Set to -1 for no " + "limit, to 0 for no decompression ever."), -1, 1000000, -1); m_widgets.push_back(ezfmaxkbs); - gl1->addWidget(ezfmaxkbs, 3, 0); + gl1->addWidget(ezfmaxkbs, gridy, 0); - ConfLink lnktxtmaxmbs(new ConfLinkRclRep(config, "textfilemaxmbs")); - ConfParamIntW *etxtmaxmbs = new - ConfParamIntW(m_groupbox, lnktxtmaxmbs, - tr("Max. text file size (MB)"), - tr("This value sets a threshold beyond which text " - "files will not be processed. Set to -1 for no " - "limit. \nThis is for excluding monster " - "log files from the index."), - -1, 1000000); + ConfParamIntW *etxtmaxmbs = new ConfParamIntW( + m_groupbox, + ConfLink(new ConfLinkRclRep(config, "textfilemaxmbs", &m_sk)), + tr("Max. text file size (MB)"), + tr("This value sets a threshold beyond which text " + "files will not be processed. Set to -1 for no " + "limit. \nThis is for excluding monster " + "log files from the index."), -1, 1000000); m_widgets.push_back(etxtmaxmbs); - gl1->addWidget(etxtmaxmbs, 3, 1); + gl1->addWidget(etxtmaxmbs, gridy++, 1); - ConfLink lnktxtpagekbs(new ConfLinkRclRep(config, "textfilepagekbs")); - ConfParamIntW *etxtpagekbs = new - ConfParamIntW(m_groupbox, lnktxtpagekbs, - tr("Text file page size (KB)"), - tr("If this value is set (not equal to -1), text " - "files will be split in chunks of this size for " - "indexing.\nThis will help searching very big text " - " files (ie: log files)."), - -1, 1000000); + ConfParamIntW *etxtpagekbs = new ConfParamIntW( + m_groupbox, + ConfLink(new ConfLinkRclRep(config, "textfilepagekbs", &m_sk)), + tr("Text file page size (KB)"), + tr("If this value is set (not equal to -1), text " + "files will be split in chunks of this size for " + "indexing.\nThis will help searching very big text " + " files (ie: log files)."), -1, 1000000); m_widgets.push_back(etxtpagekbs); - gl1->addWidget(etxtpagekbs, 4, 0); + gl1->addWidget(etxtpagekbs, gridy, 0); - ConfLink lnkfiltmaxsecs(new ConfLinkRclRep(config, "filtermaxseconds")); - ConfParamIntW *efiltmaxsecs = new - ConfParamIntW(m_groupbox, lnkfiltmaxsecs, - tr("Max. filter exec. time (S)"), - tr("External filters working longer than this will be " - "aborted. This is for the rare case (ie: postscript) " - "where a document could cause a filter to loop. " - "Set to -1 for no limit.\n"), - -1, 10000); + ConfParamIntW *efiltmaxsecs = new ConfParamIntW( + m_groupbox, + ConfLink(new ConfLinkRclRep(config, "filtermaxseconds", &m_sk)), + tr("Max. filter exec. time (S)"), + tr("External filters working longer than this will be " + "aborted. This is for the rare case (ie: postscript) " + "where a document could cause a filter to loop. " + "Set to -1 for no limit.\n"), -1, 10000); m_widgets.push_back(efiltmaxsecs); - gl1->addWidget(efiltmaxsecs, 4, 1); + gl1->addWidget(efiltmaxsecs, gridy++, 1); vboxLayout->addWidget(m_groupbox); subDirChanged(0, 0); diff --git a/src/qtgui/confgui/confguiindex.h b/src/qtgui/confgui/confguiindex.h index f6d25fc2..87af1d3d 100644 --- a/src/qtgui/confgui/confguiindex.h +++ b/src/qtgui/confgui/confguiindex.h @@ -75,7 +75,7 @@ public: class ConfSubPanelW : public QWidget { Q_OBJECT public: - ConfSubPanelW(QWidget *parent, ConfNull *config); + ConfSubPanelW(QWidget *parent, ConfNull *config, RclConfig *rclconf); private slots: void subDirChanged(QListWidgetItem *, QListWidgetItem *);