X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/4dd1ed179df79fa71be4a11f63bb81abb44cbae8..c8d8556950005dfd96ebdb41d2f43ad90356367c:/src/search/dolphinsearchbox.cpp diff --git a/src/search/dolphinsearchbox.cpp b/src/search/dolphinsearchbox.cpp index f270c41ff..06644e1f3 100644 --- a/src/search/dolphinsearchbox.cpp +++ b/src/search/dolphinsearchbox.cpp @@ -20,11 +20,12 @@ #include "dolphinsearchbox.h" #include "dolphin_searchsettings.h" +#include "dolphinsearchinformation.h" -#include -#include -#include -#include +#include +#include +#include +#include #include #include @@ -33,36 +34,39 @@ #include #include #include -#include +#include #include #include #include #include #ifdef HAVE_NEPOMUK - #include - #include - #include - #include - #include - #include - #include - #include - #include + #include + #include + #include + #include + #include + #include + #include + #include + #include #endif DolphinSearchBox::DolphinSearchBox(QWidget* parent) : QWidget(parent), m_startedSearching(false), - m_nepomukActivated(false), + m_readOnly(false), m_topLayout(0), + m_searchLabel(0), m_searchInput(0), + m_optionsScrollArea(0), m_fileNameButton(0), m_contentButton(0), m_separator(0), m_fromHereButton(0), m_everywhereButton(0), m_searchPath(), + m_readOnlyQuery(), m_startSearchTimer(0) { } @@ -72,6 +76,11 @@ DolphinSearchBox::~DolphinSearchBox() saveSettings(); } +void DolphinSearchBox::setText(const QString& text) +{ + m_searchInput->setText(text); +} + QString DolphinSearchBox::text() const { return m_searchInput->text(); @@ -82,7 +91,7 @@ void DolphinSearchBox::setSearchPath(const KUrl& url) m_searchPath = url; QFontMetrics metrics(m_fromHereButton->font()); - const int maxWidth = metrics.averageCharWidth() * 15; + const int maxWidth = metrics.height() * 8; QString location = url.fileName(); if (location.isEmpty()) { @@ -96,7 +105,7 @@ void DolphinSearchBox::setSearchPath(const KUrl& url) const QString elidedLocation = metrics.elidedText(location, Qt::ElideMiddle, maxWidth); m_fromHereButton->setText(i18nc("action:button", "From Here (%1)", elidedLocation)); - const bool showSearchFromButtons = url.isLocalFile(); + const bool showSearchFromButtons = url.isLocalFile() && !m_readOnly; m_separator->setVisible(showSearchFromButtons); m_fromHereButton->setVisible(showSearchFromButtons); m_everywhereButton->setVisible(showSearchFromButtons); @@ -110,7 +119,8 @@ KUrl DolphinSearchBox::searchPath() const KUrl DolphinSearchBox::urlForSearching() const { KUrl url; - if (m_nepomukActivated && isSearchPathIndexed()) { + const DolphinSearchInformation& searchInfo = DolphinSearchInformation::instance(); + if (searchInfo.isIndexingEnabled() && searchInfo.isPathIndexed(m_searchPath)) { url = nepomukUrlForSearching(); } else { url.setProtocol("filenamesearch"); @@ -139,6 +149,20 @@ void DolphinSearchBox::selectAll() m_searchInput->selectAll(); } +void DolphinSearchBox::setReadOnly(bool readOnly, const KUrl& query) +{ + if (m_readOnly != readOnly) { + m_readOnly = readOnly; + m_readOnlyQuery = query; + applyReadOnlyState(); + } +} + +bool DolphinSearchBox::isReadOnly() const +{ + return m_readOnly; +} + bool DolphinSearchBox::event(QEvent* event) { if (event->type() == QEvent::Polish) { @@ -150,11 +174,6 @@ bool DolphinSearchBox::event(QEvent* event) void DolphinSearchBox::showEvent(QShowEvent* event) { if (!event->spontaneous()) { -#ifdef HAVE_NEPOMUK - m_nepomukActivated = (Nepomuk::ResourceManager::instance()->init() == 0); -#endif - - m_searchInput->clear(); m_searchInput->setFocus(); m_startedSearching = false; } @@ -163,7 +182,7 @@ void DolphinSearchBox::showEvent(QShowEvent* event) void DolphinSearchBox::keyReleaseEvent(QKeyEvent* event) { QWidget::keyReleaseEvent(event); - if ((event->key() == Qt::Key_Escape)) { + if (event->key() == Qt::Key_Escape) { if (m_searchInput->text().isEmpty()) { emit closeRequest(); } else { @@ -179,8 +198,19 @@ void DolphinSearchBox::emitSearchSignal() emit search(m_searchInput->text()); } +void DolphinSearchBox::slotSearchLocationChanged() +{ + emit searchLocationChanged(m_fromHereButton->isChecked() ? SearchFromHere : SearchEverywhere); +} + +void DolphinSearchBox::slotSearchContextChanged() +{ + emit searchContextChanged(m_fileNameButton->isChecked() ? SearchFileName : SearchContent); +} + void DolphinSearchBox::slotConfigurationChanged() { + saveSettings(); if (m_startedSearching) { emitSearchSignal(); } @@ -188,11 +218,7 @@ void DolphinSearchBox::slotConfigurationChanged() void DolphinSearchBox::slotSearchTextChanged(const QString& text) { - if (text.isEmpty()) { - m_startSearchTimer->stop(); - } else { - m_startSearchTimer->start(); - } + m_startSearchTimer->start(); emit searchTextChanged(text); } @@ -202,12 +228,12 @@ void DolphinSearchBox::slotReturnPressed(const QString& text) emit returnPressed(text); } -void DolphinSearchBox::initButton(QPushButton* button) +void DolphinSearchBox::initButton(QToolButton* button) { button->setAutoExclusive(true); - button->setFlat(true); + button->setAutoRaise(true); button->setCheckable(true); - connect(button, SIGNAL(toggled(bool)), this, SLOT(slotConfigurationChanged())); + connect(button, SIGNAL(clicked(bool)), this, SLOT(slotConfigurationChanged())); } void DolphinSearchBox::loadSettings() @@ -242,7 +268,7 @@ void DolphinSearchBox::init() connect(closeButton, SIGNAL(clicked()), SIGNAL(closeRequest())); // Create search label - QLabel* searchLabel = new QLabel(i18nc("@label:textbox", "Find:"), this); + m_searchLabel = new QLabel(this); // Create search box m_searchInput = new KLineEdit(this); @@ -258,36 +284,40 @@ void DolphinSearchBox::init() QHBoxLayout* searchInputLayout = new QHBoxLayout(); searchInputLayout->setMargin(0); searchInputLayout->addWidget(closeButton); - searchInputLayout->addWidget(searchLabel); + searchInputLayout->addWidget(m_searchLabel); searchInputLayout->addWidget(m_searchInput); // Create "Filename" and "Content" button - m_fileNameButton = new QPushButton(this); + m_fileNameButton = new QToolButton(this); m_fileNameButton->setText(i18nc("action:button", "Filename")); initButton(m_fileNameButton); - m_contentButton = new QPushButton(); + m_contentButton = new QToolButton(); m_contentButton->setText(i18nc("action:button", "Content")); initButton(m_contentButton);; QButtonGroup* searchWhatGroup = new QButtonGroup(this); searchWhatGroup->addButton(m_fileNameButton); searchWhatGroup->addButton(m_contentButton); + connect(m_fileNameButton, SIGNAL(clicked()), this, SLOT(slotSearchContextChanged())); + connect(m_contentButton, SIGNAL(clicked()), this, SLOT(slotSearchContextChanged())); m_separator = new KSeparator(Qt::Vertical, this); // Create "From Here" and "Everywhere"button - m_fromHereButton = new QPushButton(this); + m_fromHereButton = new QToolButton(this); m_fromHereButton->setText(i18nc("action:button", "From Here")); initButton(m_fromHereButton); - m_everywhereButton = new QPushButton(this); + m_everywhereButton = new QToolButton(this); m_everywhereButton->setText(i18nc("action:button", "Everywhere")); initButton(m_everywhereButton); QButtonGroup* searchLocationGroup = new QButtonGroup(this); searchLocationGroup->addButton(m_fromHereButton); searchLocationGroup->addButton(m_everywhereButton); + connect(m_fromHereButton, SIGNAL(clicked()), this, SLOT(slotSearchLocationChanged())); + connect(m_everywhereButton, SIGNAL(clicked()), this, SLOT(slotSearchLocationChanged())); // Apply layout for the options QHBoxLayout* optionsLayout = new QHBoxLayout(); @@ -299,11 +329,25 @@ void DolphinSearchBox::init() optionsLayout->addWidget(m_everywhereButton); optionsLayout->addStretch(1); + // Put the options into a QScrollArea. This prevents increasing the view width + // in case that not enough width for the options is available. + QWidget* optionsContainer = new QWidget(this); + optionsContainer->setLayout(optionsLayout); + + m_optionsScrollArea = new QScrollArea(this); + m_optionsScrollArea->setFrameShape(QFrame::NoFrame); + m_optionsScrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + m_optionsScrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + m_optionsScrollArea->setMaximumHeight(optionsContainer->sizeHint().height()); + m_optionsScrollArea->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); + m_optionsScrollArea->setWidget(optionsContainer); + m_optionsScrollArea->setWidgetResizable(true); + m_topLayout = new QVBoxLayout(this); + m_topLayout->setMargin(0); m_topLayout->addLayout(searchInputLayout); - m_topLayout->addLayout(optionsLayout); + m_topLayout->addWidget(m_optionsScrollArea); - searchLabel->setBuddy(m_searchInput); loadSettings(); // The searching should be started automatically after the user did not change @@ -312,71 +356,36 @@ void DolphinSearchBox::init() m_startSearchTimer->setSingleShot(true); m_startSearchTimer->setInterval(1000); connect(m_startSearchTimer, SIGNAL(timeout()), this, SLOT(emitSearchSignal())); -} -bool DolphinSearchBox::isSearchPathIndexed() const -{ -#ifdef HAVE_NEPOMUK - const QString path = m_searchPath.path(); - - const KConfig strigiConfig("nepomukstrigirc"); - const QStringList indexedFolders = strigiConfig.group("General").readPathEntry("folders", QStringList()); - - // Check whether the current search path is part of an indexed folder - bool isIndexed = false; - foreach (const QString& indexedFolder, indexedFolders) { - if (path.startsWith(indexedFolder)) { - isIndexed = true; - break; - } - } - - if (isIndexed) { - // The current search path is part of an indexed folder. Check whether no - // excluded folder is part of the search path. - const QStringList excludedFolders = strigiConfig.group("General").readPathEntry("exclude folders", QStringList()); - foreach (const QString& excludedFolder, excludedFolders) { - if (path.startsWith(excludedFolder)) { - isIndexed = false; - break; - } - } - } - - return isIndexed; -#else - return false; -#endif + applyReadOnlyState(); } KUrl DolphinSearchBox::nepomukUrlForSearching() const { #ifdef HAVE_NEPOMUK - Nepomuk::Query::AndTerm andTerm; + Nepomuk::Query::Term term; - // Add input from search filter const QString text = m_searchInput->text(); - if (!text.isEmpty()) { - if (m_fileNameButton->isChecked()) { - QString regex = QRegExp::escape(text); - regex.replace("\\*", QLatin1String(".*")); - regex.replace("\\?", QLatin1String(".")); - regex.replace("\\", "\\\\"); - andTerm.addSubTerm(Nepomuk::Query::ComparisonTerm( - Nepomuk::Vocabulary::NFO::fileName(), - Nepomuk::Query::LiteralTerm(regex), - Nepomuk::Query::ComparisonTerm::Regexp)); - } else { - const Nepomuk::Query::Query customQuery = Nepomuk::Query::QueryParser::parseQuery(text, Nepomuk::Query::QueryParser::DetectFilenamePattern); - if (customQuery.isValid()) { - andTerm.addSubTerm(customQuery.term()); - } - } + + if (m_contentButton->isChecked()) { + // Let Nepomuk parse the query + term = Nepomuk::Query::QueryParser::parseQuery(text, Nepomuk::Query::QueryParser::DetectFilenamePattern).term(); + } + else { + // Search the text in the filename only + QString regex = QRegExp::escape(text); + regex.replace("\\*", QLatin1String(".*")); + regex.replace("\\?", QLatin1String(".")); + regex.replace("\\", "\\\\"); + term = Nepomuk::Query::ComparisonTerm( + Nepomuk::Vocabulary::NFO::fileName(), + Nepomuk::Query::LiteralTerm(regex), + Nepomuk::Query::ComparisonTerm::Regexp); } Nepomuk::Query::FileQuery fileQuery; - fileQuery.setFileMode(Nepomuk::Query::FileQuery::QueryFiles); - fileQuery.setTerm(andTerm); + fileQuery.setFileMode(Nepomuk::Query::FileQuery::QueryFilesAndFolders); + fileQuery.setTerm(term); if (m_fromHereButton->isChecked()) { const bool recursive = true; fileQuery.addIncludeFolder(m_searchPath, recursive); @@ -390,4 +399,20 @@ KUrl DolphinSearchBox::nepomukUrlForSearching() const #endif } +void DolphinSearchBox::applyReadOnlyState() +{ +#ifdef HAVE_NEPOMUK + if (m_readOnly) { + m_searchLabel->setText(Nepomuk::Query::Query::titleFromQueryUrl(m_readOnlyQuery)); + } else { +#else + { +#endif + m_searchLabel->setText(i18nc("@label:textbox", "Find:")); + } + + m_searchInput->setVisible(!m_readOnly); + m_optionsScrollArea->setVisible(!m_readOnly); +} + #include "dolphinsearchbox.moc"