X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/6e0583f9888fcf46bb89735423b02b5ca53f1459..6a3f8086a372ca1c21ab474c7934e8f8e4b238f5:/src/search/dolphinsearchbox.cpp diff --git a/src/search/dolphinsearchbox.cpp b/src/search/dolphinsearchbox.cpp index 8119e821f..8b660712a 100644 --- a/src/search/dolphinsearchbox.cpp +++ b/src/search/dolphinsearchbox.cpp @@ -20,6 +20,7 @@ #include "dolphinsearchbox.h" #include "dolphin_searchsettings.h" +#include "dolphinfacetswidget.h" #include "dolphinsearchinformation.h" #include @@ -34,7 +35,6 @@ #include #include #include -#include #include #include #include @@ -42,15 +42,16 @@ #include #ifdef HAVE_NEPOMUK - #include - #include - #include - #include - #include - #include - #include - #include - #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include #endif DolphinSearchBox::DolphinSearchBox(QWidget* parent) : @@ -58,14 +59,18 @@ DolphinSearchBox::DolphinSearchBox(QWidget* parent) : m_startedSearching(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_infoLabel(0), + m_facetsToggleButton(0), + m_facetsWidget(0), m_searchPath(), + m_readOnlyQuery(), m_startSearchTimer(0) { } @@ -90,7 +95,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()) { @@ -104,10 +109,14 @@ 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); + + const DolphinSearchInformation& searchInfo = DolphinSearchInformation::instance(); + const bool hasFacetsSupport = searchInfo.isIndexingEnabled() && searchInfo.isPathIndexed(m_searchPath); + m_facetsWidget->setEnabled(hasFacetsSupport); } KUrl DolphinSearchBox::searchPath() const @@ -148,10 +157,11 @@ void DolphinSearchBox::selectAll() m_searchInput->selectAll(); } -void DolphinSearchBox::setReadOnly(bool readOnly) +void DolphinSearchBox::setReadOnly(bool readOnly, const KUrl& query) { if (m_readOnly != readOnly) { m_readOnly = readOnly; + m_readOnlyQuery = query; applyReadOnlyState(); } } @@ -189,38 +199,64 @@ void DolphinSearchBox::keyReleaseEvent(QKeyEvent* event) } } -void DolphinSearchBox::emitSearchSignal() +void DolphinSearchBox::emitSearchRequest() { m_startSearchTimer->stop(); m_startedSearching = true; - emit search(m_searchInput->text()); + emit searchRequest(); +} + +void DolphinSearchBox::emitCloseRequest() +{ + m_startSearchTimer->stop(); + m_startedSearching = false; + emit closeRequest(); } void DolphinSearchBox::slotConfigurationChanged() { + saveSettings(); if (m_startedSearching) { - emitSearchSignal(); + emitSearchRequest(); } } void DolphinSearchBox::slotSearchTextChanged(const QString& text) { - m_startSearchTimer->start(); + if (text.isEmpty()) { + m_startSearchTimer->stop(); + } else { + m_startSearchTimer->start(); + } emit searchTextChanged(text); } void DolphinSearchBox::slotReturnPressed(const QString& text) { - emitSearchSignal(); + emitSearchRequest(); emit returnPressed(text); } -void DolphinSearchBox::initButton(QPushButton* button) +void DolphinSearchBox::slotFacetsButtonToggled() +{ + const bool facetsIsVisible = !m_facetsWidget->isVisible(); + m_facetsWidget->setVisible(facetsIsVisible); + updateFacetsToggleButton(); +} + +void DolphinSearchBox::slotFacetChanged() +{ + m_startedSearching = true; + m_startSearchTimer->stop(); + emit searchRequest(); +} + +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() @@ -236,12 +272,15 @@ void DolphinSearchBox::loadSettings() } else { m_fileNameButton->setChecked(true); } + + m_facetsWidget->setVisible(SearchSettings::showFacetsWidget()); } void DolphinSearchBox::saveSettings() { SearchSettings::setLocation(m_fromHereButton->isChecked() ? "FromHere" : "Everywhere"); SearchSettings::setWhat(m_fileNameButton->isChecked() ? "FileName" : "Content"); + SearchSettings::setShowFacetsWidget(m_facetsToggleButton->isChecked()); SearchSettings::self()->writeConfig(); } @@ -252,10 +291,10 @@ void DolphinSearchBox::init() closeButton->setAutoRaise(true); closeButton->setIcon(KIcon("dialog-close")); closeButton->setToolTip(i18nc("@info:tooltip", "Quit searching")); - connect(closeButton, SIGNAL(clicked()), SIGNAL(closeRequest())); + connect(closeButton, SIGNAL(clicked()), this, SLOT(emitCloseRequest())); // 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); @@ -267,25 +306,21 @@ void DolphinSearchBox::init() connect(m_searchInput, SIGNAL(textChanged(QString)), this, SLOT(slotSearchTextChanged(QString))); - // Create information label - m_infoLabel = new QLabel("TODO: Provide information about the current query", this); - // Apply layout for the search input QHBoxLayout* searchInputLayout = new QHBoxLayout(); searchInputLayout->setMargin(0); searchInputLayout->addWidget(closeButton); - searchInputLayout->addWidget(searchLabel); + searchInputLayout->addWidget(m_searchLabel); searchInputLayout->addWidget(m_searchInput); - searchInputLayout->addWidget(m_infoLabel); // 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);; + initButton(m_contentButton); QButtonGroup* searchWhatGroup = new QButtonGroup(this); searchWhatGroup->addButton(m_fileNameButton); @@ -294,11 +329,11 @@ void DolphinSearchBox::init() 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); @@ -306,6 +341,16 @@ void DolphinSearchBox::init() searchLocationGroup->addButton(m_fromHereButton); searchLocationGroup->addButton(m_everywhereButton); + // Create "Facets" widgets + m_facetsToggleButton = new QToolButton(this); + m_facetsToggleButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + initButton(m_facetsToggleButton); + connect(m_facetsToggleButton, SIGNAL(clicked()), this, SLOT(slotFacetsButtonToggled())); + + m_facetsWidget = new DolphinFacetsWidget(this); + m_facetsWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); + connect(m_facetsWidget, SIGNAL(facetChanged()), this, SLOT(slotFacetChanged())); + // Apply layout for the options QHBoxLayout* optionsLayout = new QHBoxLayout(); optionsLayout->setMargin(0); @@ -315,25 +360,28 @@ void DolphinSearchBox::init() optionsLayout->addWidget(m_fromHereButton); optionsLayout->addWidget(m_everywhereButton); optionsLayout->addStretch(1); + optionsLayout->addWidget(m_facetsToggleButton); // 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); - QScrollArea* optionsScrollArea = new QScrollArea(this); - optionsScrollArea->setFrameShape(QFrame::NoFrame); - optionsScrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - optionsScrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - optionsScrollArea->setMaximumHeight(optionsContainer->sizeHint().height()); - optionsScrollArea->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); - optionsScrollArea->setWidget(optionsContainer); - optionsScrollArea->setWidgetResizable(true); + + 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->addWidget(optionsScrollArea); + m_topLayout->addWidget(m_optionsScrollArea); + m_topLayout->addWidget(m_facetsWidget); - searchLabel->setBuddy(m_searchInput); loadSettings(); // The searching should be started automatically after the user did not change @@ -341,36 +389,50 @@ void DolphinSearchBox::init() m_startSearchTimer = new QTimer(this); m_startSearchTimer->setSingleShot(true); m_startSearchTimer->setInterval(1000); - connect(m_startSearchTimer, SIGNAL(timeout()), this, SLOT(emitSearchSignal())); + connect(m_startSearchTimer, SIGNAL(timeout()), this, SLOT(emitSearchRequest())); + updateFacetsToggleButton(); applyReadOnlyState(); } KUrl DolphinSearchBox::nepomukUrlForSearching() const { #ifdef HAVE_NEPOMUK - Nepomuk::Query::AndTerm andTerm; - + // Create the term for the text from the input-field + // dependent on whether a searching for content or + // filename is done const QString text = m_searchInput->text(); - if (m_fileNameButton->isChecked()) { + Nepomuk2::Query::Term searchLabelTerm; + if (m_contentButton->isChecked()) { + // Let Nepomuk parse the query + searchLabelTerm = Nepomuk2::Query::QueryParser::parseQuery(text, Nepomuk2::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("\\", "\\\\"); - andTerm.addSubTerm(Nepomuk::Query::ComparisonTerm( - Nepomuk::Vocabulary::NFO::fileName(), - Nepomuk::Query::LiteralTerm(regex), - Nepomuk::Query::ComparisonTerm::Regexp)); + searchLabelTerm = Nepomuk2::Query::ComparisonTerm( + Nepomuk2::Vocabulary::NFO::fileName(), + Nepomuk2::Query::LiteralTerm(regex), + Nepomuk2::Query::ComparisonTerm::Regexp); + } + + // Get the term from the facets and merge it with the + // created term from the input-field. + Nepomuk2::Query::Term facetsTerm = m_facetsWidget->facetsTerm(); + + Nepomuk2::Query::FileQuery fileQuery; + fileQuery.setFileMode(Nepomuk2::Query::FileQuery::QueryFilesAndFolders); + if (facetsTerm.isValid()) { + Nepomuk2::Query::AndTerm andTerm; + andTerm.addSubTerm(searchLabelTerm); + andTerm.addSubTerm(facetsTerm); + fileQuery.setTerm(andTerm); } else { - const Nepomuk::Query::Query customQuery = Nepomuk::Query::QueryParser::parseQuery(text, Nepomuk::Query::QueryParser::DetectFilenamePattern); - if (customQuery.isValid()) { - andTerm.addSubTerm(customQuery.term()); - } + fileQuery.setTerm(searchLabelTerm); } - Nepomuk::Query::FileQuery fileQuery; - fileQuery.setFileMode(Nepomuk::Query::FileQuery::QueryFilesAndFolders); - fileQuery.setTerm(andTerm); if (m_fromHereButton->isChecked()) { const bool recursive = true; fileQuery.addIncludeFolder(m_searchPath, recursive); @@ -386,14 +448,32 @@ KUrl DolphinSearchBox::nepomukUrlForSearching() const void DolphinSearchBox::applyReadOnlyState() { - // TODO: This is just an early draft to indicate that a state change - // has been done +#ifdef HAVE_NEPOMUK + if (m_readOnly) { + m_searchLabel->setText(Nepomuk2::Query::Query::titleFromQueryUrl(m_readOnlyQuery)); + } else { +#else + { +#endif + m_searchLabel->setText(i18nc("@label:textbox", "Find:")); + } + m_searchInput->setVisible(!m_readOnly); - m_infoLabel->setVisible(m_readOnly); - m_fileNameButton->setEnabled(!m_readOnly); - m_contentButton->setEnabled(!m_readOnly); - m_fromHereButton->setEnabled(!m_readOnly); - m_everywhereButton->setEnabled(!m_readOnly); + m_optionsScrollArea->setVisible(!m_readOnly); + + if (m_readOnly) { + m_facetsWidget->hide(); + } else { + m_facetsWidget->setVisible(SearchSettings::showFacetsWidget()); + } +} + +void DolphinSearchBox::updateFacetsToggleButton() +{ + const bool facetsIsVisible = SearchSettings::showFacetsWidget(); + m_facetsToggleButton->setChecked(facetsIsVisible ? true : false); + m_facetsToggleButton->setIcon(KIcon(facetsIsVisible ? "arrow-up-double" : "arrow-down-double")); + m_facetsToggleButton->setText(facetsIsVisible ? i18nc("action:button", "Less Options") : i18nc("action:button", "More Options")); } #include "dolphinsearchbox.moc"