]> cloud.milkyroute.net Git - dolphin.git/commitdiff
When you open a new tab while the search mode is enabled, the
authorEmmanuel Pescosta <emmanuelpescosta099@gmail.com>
Fri, 28 Mar 2014 17:48:48 +0000 (18:48 +0100)
committerEmmanuel Pescosta <emmanuelpescosta099@gmail.com>
Fri, 28 Mar 2014 17:48:48 +0000 (18:48 +0100)
newly opened tab also starts the same search (Because new tab is opened with
the current view url), but the search box is in read-only mode. So you cannot
close the search bar nor edit the search text.

This patch fixes this by parsing the search url. The value of the "search"
parameter is used as search text and the value of the "url" parameter is used
for the search path ("root" folder for the search when "Search from here" mode
is enabled).

In case of Baloo search urls, we use Baloo::Query::fromSearchUrl.

Removed everything related to read only mode in DolphinSearchBox, not needed
anymore.

REVIEW: 111968
BUG: 311950
FIXED-IN: 4.13.0

src/dolphinviewcontainer.cpp
src/search/dolphinfacetswidget.cpp
src/search/dolphinfacetswidget.h
src/search/dolphinsearchbox.cpp
src/search/dolphinsearchbox.h

index 768fd5ef90915cee7505bb4629d69524e198858f..57452b9e4f999c86fc2225d2b08d98681827f3a6 100644 (file)
@@ -314,36 +314,18 @@ void DolphinViewContainer::setSearchModeEnabled(bool enabled)
     m_urlNavigator->setVisible(!enabled);
 
     if (enabled) {
-        KUrl url = m_urlNavigator->locationUrl();
-        m_searchBox->setText(QString());
-        m_searchBox->setReadOnly(isSearchUrl(url), url);
-
-        // Remember the most recent non-search URL as search path
-        // of the search-box, so that it can be restored
-        // when switching back to the URL navigator.
-        int index = m_urlNavigator->historyIndex();
-        const int historySize = m_urlNavigator->historySize();
-        while (isSearchUrl(url) && (index < historySize)) {
-            ++index;
-            url = m_urlNavigator->locationUrl(index);
-        }
-
-        if (!isSearchUrl(url)) {
-            m_searchBox->setSearchPath(url);
-        }
+        const KUrl& locationUrl = m_urlNavigator->locationUrl();
+        m_searchBox->fromSearchUrl(locationUrl);
     } else {
         m_view->setViewPropertiesContext(QString());
 
         // Restore the URL for the URL navigator. If Dolphin has been
         // started with a search-URL, the home URL is used as fallback.
-        const KUrl url = m_searchBox->searchPath();
-        if (url.isValid() && !url.isEmpty()) {
-            if (isSearchUrl(url)) {
-                m_urlNavigator->goHome();
-            } else {
-                m_urlNavigator->setLocationUrl(url);
-            }
+        KUrl url = m_searchBox->searchPath();
+        if (url.isEmpty() || !url.isValid() || isSearchUrl(url)) {
+            url = GeneralSettings::self()->homeUrl();
         }
+        m_urlNavigator->setLocationUrl(url);
     }
 }
 
index efbefc1f6879aa872d565d75f97ae3668f25efb0..f20ae68d56ea60edda79ae3346d6ee7fc02618d2 100644 (file)
@@ -179,8 +179,117 @@ QString DolphinFacetsWidget::facetType() const
     return QString();
 }
 
+bool DolphinFacetsWidget::isRatingTerm(const Baloo::Term& term) const
+{
+    const QList<Baloo::Term> subTerms = term.subTerms();
+    if (subTerms.isEmpty()) {
+        // If term has no sub terms, then the term itself is either a "rating" term
+        // or a "modified" term.
+        return term.property() == QLatin1String("modified") ||
+               term.property() == QLatin1String("rating");
+
+    } else if (subTerms.size() == 2) {
+        // If term has sub terms, then the sub terms are always "rating" and "modified" terms.
+
+        QStringList properties;
+        foreach (const Baloo::Term& subTerm, subTerms) {
+            properties << subTerm.property();
+        }
+
+        return properties.contains(QLatin1String("modified")) &&
+               properties.contains(QLatin1String("rating"));
+    }
+
+    return false;
+}
+
+void DolphinFacetsWidget::setRatingTerm(const Baloo::Term& term)
+{
+    // If term has sub terms, then the sub terms are always "rating" and "modified" terms.
+    // If term has no sub terms, then the term itself is either a "rating" term or a "modified"
+    // term. To avoid code duplication we add term to subTerms list, if the list is empty.
+    QList<Baloo::Term> subTerms = term.subTerms();
+    if (subTerms.isEmpty()) {
+        subTerms << term;
+    }
+
+    foreach (const Baloo::Term& subTerm, subTerms) {
+        const QString property = subTerm.property();
+
+        if (property == QLatin1String("modified")) {
+            const QDate date = subTerm.value().toDate();
+            setTimespan(date);
+        } else if (property == QLatin1String("rating")) {
+            const int stars = subTerm.value().toInt() / 2;
+            setRating(stars);
+        }
+    }
+}
+
 #endif
 
+void DolphinFacetsWidget::setFacetType(const QString& type)
+{
+    if (type == QLatin1String("Document")) {
+        m_documents->setChecked(true);
+    } else if (type == QLatin1String("Image")) {
+        m_images->setChecked(true);
+    } else if (type == QLatin1String("Audio")) {
+        m_audio->setChecked(true);
+    } else if (type == QLatin1String("Video")) {
+        m_videos->setChecked(true);
+    } else {
+        m_anyType->setChecked(true);
+    }
+}
+
+void DolphinFacetsWidget::setRating(const int stars)
+{
+    switch (stars) {
+    case 5:
+        m_maxRating->setChecked(true);
+        break;
+
+    case 4:
+        m_fourOrMore->setChecked(true);
+        break;
+
+    case 3:
+        m_threeOrMore->setChecked(true);
+        break;
+
+    case 2:
+        m_twoOrMore->setChecked(true);
+        break;
+
+    case 1:
+        m_oneOrMore->setChecked(true);
+        break;
+
+    default:
+        m_anyRating->setChecked(true);
+    }
+}
+
+void DolphinFacetsWidget::setTimespan(const QDate& date)
+{
+    const QDate currentDate = QDate::currentDate();
+    const int days = date.daysTo(currentDate);
+
+    if (days <= 0) {
+        m_today->setChecked(true);
+    } else if (days <= 1) {
+        m_yesterday->setChecked(true);
+    } else if (days <= currentDate.dayOfWeek()) {
+        m_thisWeek->setChecked(true);
+    } else if (days <= currentDate.day()) {
+        m_thisMonth->setChecked(true);
+    } else if (days <= currentDate.dayOfYear()) {
+        m_thisYear->setChecked(true);
+    } else {
+        m_anytime->setChecked(true);
+    }
+}
 
 QRadioButton* DolphinFacetsWidget::createRadioButton(const QString& text,
                                                      QButtonGroup* group)
index 1fd1683dabd686a35570f20f8f47db1c7db6293c..8f6d8eb6f59c4437d523590ba348dfa82b21fff9 100644 (file)
@@ -58,12 +58,20 @@ public:
 #ifdef HAVE_BALOO
     Baloo::Term ratingTerm() const;
     QString facetType() const;
+
+    bool isRatingTerm(const Baloo::Term& term) const;
+    void setRatingTerm(const Baloo::Term& term);
 #endif
 
+    void setFacetType(const QString& type);
+
 signals:
     void facetChanged();
 
 private:
+    void setRating(const int stars);
+    void setTimespan(const QDate& date);
+
     /**
      * @return New radiobutton which is connected to the
      *         slotFacedChanged() slot whenever it has
index 0a70566823fc376a001a2b1daf6823438d85772e..46ca01a4cef85d9a246917531b6851431ab6275d 100644 (file)
@@ -49,7 +49,6 @@
 DolphinSearchBox::DolphinSearchBox(QWidget* parent) :
     QWidget(parent),
     m_startedSearching(false),
-    m_readOnly(false),
     m_active(true),
     m_topLayout(0),
     m_searchLabel(0),
@@ -63,7 +62,6 @@ DolphinSearchBox::DolphinSearchBox(QWidget* parent) :
     m_facetsToggleButton(0),
     m_facetsWidget(0),
     m_searchPath(),
-    m_readOnlyQuery(),
     m_startSearchTimer(0)
 {
 }
@@ -102,7 +100,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() && !m_readOnly;
+    const bool showSearchFromButtons = url.isLocalFile();
     m_separator->setVisible(showSearchFromButtons);
     m_fromHereButton->setVisible(showSearchFromButtons);
     m_everywhereButton->setVisible(showSearchFromButtons);
@@ -152,23 +150,24 @@ KUrl DolphinSearchBox::urlForSearching() const
     return url;
 }
 
-void DolphinSearchBox::selectAll()
-{
-    m_searchInput->selectAll();
-}
-
-void DolphinSearchBox::setReadOnly(bool readOnly, const KUrl& query)
+void DolphinSearchBox::fromSearchUrl(const KUrl& url)
 {
-    if (m_readOnly != readOnly || m_readOnlyQuery != query) {
-        m_readOnly = readOnly;
-        m_readOnlyQuery = query;
-        applyReadOnlyState();
+    if (url.protocol() == "baloosearch") {
+        fromBalooSearchUrl(url);
+    } else if (url.protocol() == "filenamesearch") {
+        const QMap<QString, QString>& queryItems = url.queryItems();
+        setText(queryItems.value("search"));
+        setSearchPath(queryItems.value("url"));
+        m_contentButton->setChecked(queryItems.value("checkContent") == "yes");
+    } else {
+        setText(QString());
+        setSearchPath(url);
     }
 }
 
-bool DolphinSearchBox::isReadOnly() const
+void DolphinSearchBox::selectAll()
 {
-    return m_readOnly;
+    m_searchInput->selectAll();
 }
 
 void DolphinSearchBox::setActive(bool active)
@@ -426,7 +425,6 @@ void DolphinSearchBox::init()
     connect(m_startSearchTimer, SIGNAL(timeout()), this, SLOT(emitSearchRequest()));
 
     updateFacetsToggleButton();
-    applyReadOnlyState();
 }
 
 KUrl DolphinSearchBox::balooUrlForSearching() const
@@ -464,26 +462,46 @@ KUrl DolphinSearchBox::balooUrlForSearching() const
 #endif
 }
 
-void DolphinSearchBox::applyReadOnlyState()
+void DolphinSearchBox::fromBalooSearchUrl(const KUrl& url)
 {
 #ifdef HAVE_BALOO
-    if (m_readOnly) {
-        m_searchLabel->setText(Baloo::Query::titleFromQueryUrl(m_readOnlyQuery));
+    const Baloo::Query query = Baloo::Query::fromSearchUrl(url);
+    const Baloo::Term term = query.term();
+
+    // Block all signals to avoid unnecessary "searchRequest" signals
+    // while we adjust the search text and the facet widget.
+    blockSignals(true);
+
+    const QVariantHash customOptions = query.customOptions();
+    if (customOptions.contains("includeFolder")) {
+        setSearchPath(customOptions.value("includeFolder").toString());
     } else {
-#else
-    {
-#endif
-        m_searchLabel->setText(i18nc("@label:textbox", "Find:"));
+        setSearchPath(QDir::homePath());
     }
 
-    m_searchInput->setVisible(!m_readOnly);
-    m_optionsScrollArea->setVisible(!m_readOnly);
+    if (!query.searchString().isEmpty()) {
+        setText(query.searchString());
+    }
 
-    if (m_readOnly) {
-        m_facetsWidget->hide();
-    } else {
-        m_facetsWidget->setVisible(SearchSettings::showFacetsWidget());
+    QStringList types = query.types();
+    types.removeOne("File"); // We are only interested in facet widget types
+    if (!types.isEmpty()) {
+        m_facetsWidget->setFacetType(types.first());
+    }
+
+    foreach (const Baloo::Term& subTerm, term.subTerms()) {
+        const QString property = subTerm.property();
+
+        if (property == QLatin1String("filename")) {
+            setText(subTerm.value().toString());
+        } else if (m_facetsWidget->isRatingTerm(subTerm)) {
+            m_facetsWidget->setRatingTerm(subTerm);
+        }
     }
+
+    m_startSearchTimer->stop();
+    blockSignals(false);
+#endif
 }
 
 void DolphinSearchBox::updateFacetsToggleButton()
index 6dc09f19e799dc5a128a9d4b88cf4def753c749b..53b12ffabbb8ff15d6143e6f5014cd2a8906758b 100644 (file)
@@ -72,20 +72,15 @@ public:
     KUrl urlForSearching() const;
 
     /**
-     * Selects the whole text of the search box.
+     * Extracts information from the given search \a url to
+     * initialize the search box properly.
      */
-    void selectAll();
+    void fromSearchUrl(const KUrl& url);
 
     /**
-     * @param readOnly If set to true the searchbox cannot be modified
-     *                 by the user and acts as visual indicator for
-     *                 an externally triggered search query.
-     * @param query    If readOnly is true this URL will be used
-     *                 to show a human readable information about the
-     *                 query.
+     * Selects the whole text of the search box.
      */
-    void setReadOnly(bool readOnly, const KUrl& query = KUrl());
-    bool isReadOnly() const;
+    void selectAll();
 
     /**
      * Set the search box to the active mode, if \a active
@@ -155,12 +150,15 @@ private:
      */
     KUrl balooUrlForSearching() const;
 
-    void applyReadOnlyState();
+    /**
+     * Extracts information from the given Baloo search \a url to
+     * initialize the search box properly.
+     */
+    void fromBalooSearchUrl(const KUrl& url);
 
     void updateFacetsToggleButton();
 private:
     bool m_startedSearching;
-    bool m_readOnly;
     bool m_active;
 
     QVBoxLayout* m_topLayout;
@@ -177,7 +175,6 @@ private:
     DolphinFacetsWidget* m_facetsWidget;
 
     KUrl m_searchPath;
-    KUrl m_readOnlyQuery;
 
     QTimer* m_startSearchTimer;
 };