diff options
| author | Peter Penz <[email protected]> | 2009-11-21 22:08:59 +0000 |
|---|---|---|
| committer | Peter Penz <[email protected]> | 2009-11-21 22:08:59 +0000 |
| commit | 35ba6eb132a2b969a53ee31e3a26d72a371e02d6 (patch) | |
| tree | 42cefbf2bf14519c3c5c33c0129f98933cbd6f6c /src/search | |
| parent | 42372dc3b5f4ffd2cabef9a508d3a44bb95612de (diff) | |
* show only a minimized set of search options per default
* remember the search options when closing Dolphin, so that the user can adjust his "default search template"
svn path=/trunk/KDE/kdebase/apps/; revision=1052499
Diffstat (limited to 'src/search')
| -rw-r--r-- | src/search/dolphinsearchbox.cpp | 2 | ||||
| -rw-r--r-- | src/search/dolphinsearchbox.h | 6 | ||||
| -rw-r--r-- | src/search/dolphinsearchoptionsconfigurator.cpp | 218 | ||||
| -rw-r--r-- | src/search/dolphinsearchoptionsconfigurator.h | 37 | ||||
| -rw-r--r-- | src/search/searchcriterionselector.cpp | 5 | ||||
| -rw-r--r-- | src/search/searchcriterionselector.h | 2 |
6 files changed, 201 insertions, 69 deletions
diff --git a/src/search/dolphinsearchbox.cpp b/src/search/dolphinsearchbox.cpp index 4375974a4..507becabd 100644 --- a/src/search/dolphinsearchbox.cpp +++ b/src/search/dolphinsearchbox.cpp @@ -250,6 +250,8 @@ DolphinSearchBox::DolphinSearchBox(QWidget* parent) : hLayout->addWidget(m_searchInput); connect(m_searchInput, SIGNAL(returnPressed()), this, SLOT(emitSearchSignal())); + connect(m_searchInput, SIGNAL(textChanged(QString)), + this, SIGNAL(searchTextChanged(QString))); } DolphinSearchBox::~DolphinSearchBox() diff --git a/src/search/dolphinsearchbox.h b/src/search/dolphinsearchbox.h index 36bcb0e10..ac5253d49 100644 --- a/src/search/dolphinsearchbox.h +++ b/src/search/dolphinsearchbox.h @@ -88,6 +88,12 @@ signals: void search(const QString& text); /** + * Is emitted when the user has changed a character of + * the text that should be used as input for searching. + */ + void searchTextChanged(const QString& text); + + /** * Is emitted if the search box gets the focus and * requests the need for a UI that allows to adjust * search options. It is up to the application to ignore diff --git a/src/search/dolphinsearchoptionsconfigurator.cpp b/src/search/dolphinsearchoptionsconfigurator.cpp index 073aa1b49..1ac9b40b1 100644 --- a/src/search/dolphinsearchoptionsconfigurator.cpp +++ b/src/search/dolphinsearchoptionsconfigurator.cpp @@ -19,6 +19,7 @@ #include "dolphinsearchoptionsconfigurator.h" +#include "dolphin_searchsettings.h" #include "searchcriterionselector.h" #include <kcombobox.h> @@ -35,32 +36,72 @@ #include <QShowEvent> #include <QVBoxLayout> +struct SettingsItem +{ + const char* settingsName; + const char* text; +}; + +// Contains the settings names and translated texts +// for each item of the location-combo-box. +static const SettingsItem g_locationItems[] = { + {"Everywhere", I18N_NOOP2("@label", "Everywhere")}, + {"From Here", I18N_NOOP2("@label", "From Here")} +}; + +// Contains the settings names and translated texts +// for each item of the what-combobox. +static const SettingsItem g_whatItems[] = { + {"All", I18N_NOOP2("@label", "All")}, + {"Images", I18N_NOOP2("@label", "Images")}, + {"Text", I18N_NOOP2("@label", "Text")}, + {"Filenames", I18N_NOOP2("@label", "Filenames")} +}; + +struct CriterionItem +{ + const char* settingsName; + SearchCriterionSelector::Type type; +}; + +// Contains the settings names for type +// of availabe search criterion. +static const CriterionItem g_criterionItems[] = { + {"Date", SearchCriterionSelector::Date}, + {"Size", SearchCriterionSelector::Size}, + {"Tag", SearchCriterionSelector::Tag}, + {"Raging", SearchCriterionSelector::Rating} +}; + DolphinSearchOptionsConfigurator::DolphinSearchOptionsConfigurator(QWidget* parent) : QWidget(parent), m_initialized(false), - m_searchFromBox(0), - m_searchWhatBox(0), + m_locationBox(0), + m_whatBox(0), m_addSelectorButton(0), + m_searchButton(0), + m_saveButton(0), m_vBoxLayout(0), - m_criterions() + m_criterions(), + m_customSearchQuery() { m_vBoxLayout = new QVBoxLayout(this); // add "search" configuration QLabel* searchLabel = new QLabel(i18nc("@label", "Search:")); - m_searchFromBox = new KComboBox(this); - m_searchFromBox->addItem(i18nc("@label", "Everywhere")); - m_searchFromBox->addItem(i18nc("@label", "From Here")); + m_locationBox = new KComboBox(this); + for (unsigned int i = 0; i < sizeof(g_locationItems) / sizeof(SettingsItem); ++i) { + m_locationBox->addItem(g_locationItems[i].text); + } // add "what" configuration QLabel* whatLabel = new QLabel(i18nc("@label", "What:")); - m_searchWhatBox = new KComboBox(this); - m_searchWhatBox->addItem(i18nc("@label", "All")); - m_searchWhatBox->addItem(i18nc("@label", "Images")); - m_searchWhatBox->addItem(i18nc("@label", "Text")); - m_searchWhatBox->addItem(i18nc("@label", "Filenames")); + m_whatBox = new KComboBox(this); + for (unsigned int i = 0; i < sizeof(g_whatItems) / sizeof(SettingsItem); ++i) { + m_whatBox->addItem(g_whatItems[i].text); + } // add "Add selector" button m_addSelectorButton = new QPushButton(this); @@ -70,18 +111,20 @@ DolphinSearchOptionsConfigurator::DolphinSearchOptionsConfigurator(QWidget* pare connect(m_addSelectorButton, SIGNAL(clicked()), this, SLOT(slotAddSelectorButtonClicked())); // add button "Search" - QPushButton* searchButton = new QPushButton(this); - searchButton->setIcon(KIcon("edit-find")); - searchButton->setText(i18nc("@action:button", "Search")); - searchButton->setToolTip(i18nc("@info", "Start searching")); - connect(searchButton, SIGNAL(clicked()), this, SLOT(emitSearchOptionsChanged())); + m_searchButton = new QPushButton(this); + m_searchButton->setIcon(KIcon("edit-find")); + m_searchButton->setText(i18nc("@action:button", "Search")); + m_searchButton->setToolTip(i18nc("@info", "Start searching")); + m_searchButton->setEnabled(false); + connect(m_searchButton, SIGNAL(clicked()), this, SIGNAL(searchOptionsChanged())); // add button "Save" - QPushButton* saveButton = new QPushButton(this); - saveButton->setIcon(KIcon("document-save")); - saveButton->setText(i18nc("@action:button", "Save")); - saveButton->setToolTip(i18nc("@info", "Save search options")); - connect(saveButton, SIGNAL(clicked()), this, SLOT(saveQuery())); + m_saveButton = new QPushButton(this); + m_saveButton->setIcon(KIcon("document-save")); + m_saveButton->setText(i18nc("@action:button", "Save")); + m_saveButton->setToolTip(i18nc("@info", "Save search options")); + m_saveButton->setEnabled(false); + connect(m_saveButton, SIGNAL(clicked()), this, SLOT(saveQuery())); // add button "Close" QPushButton* closeButton = new QPushButton(this); @@ -90,31 +133,45 @@ DolphinSearchOptionsConfigurator::DolphinSearchOptionsConfigurator(QWidget* pare closeButton->setToolTip(i18nc("@info", "Close search options")); connect(closeButton, SIGNAL(clicked()), this, SLOT(hide())); - QHBoxLayout* firstLineLayout = new QHBoxLayout(); - firstLineLayout->addWidget(searchLabel); - firstLineLayout->addWidget(m_searchFromBox); - firstLineLayout->addWidget(whatLabel); - firstLineLayout->addWidget(m_searchWhatBox); - firstLineLayout->addWidget(new QWidget(this), 1); // filler - - QHBoxLayout* lastLineLayout = new QHBoxLayout(); - lastLineLayout->addWidget(m_addSelectorButton); - lastLineLayout->addWidget(new QWidget(this), 1); // filler - lastLineLayout->addWidget(searchButton); - lastLineLayout->addWidget(saveButton); - lastLineLayout->addWidget(closeButton); + QHBoxLayout* topLineLayout = new QHBoxLayout(); + topLineLayout->addWidget(m_addSelectorButton); + topLineLayout->addWidget(searchLabel); + topLineLayout->addWidget(m_locationBox); + topLineLayout->addWidget(whatLabel); + topLineLayout->addWidget(m_whatBox); + topLineLayout->addWidget(new QWidget(this), 1); // filler + topLineLayout->addWidget(m_searchButton); + topLineLayout->addWidget(m_saveButton); + topLineLayout->addWidget(closeButton); m_vBoxLayout->addWidget(new KSeparator(this)); - m_vBoxLayout->addLayout(firstLineLayout); - m_vBoxLayout->addLayout(lastLineLayout); + m_vBoxLayout->addLayout(topLineLayout); m_vBoxLayout->addWidget(new KSeparator(this)); } DolphinSearchOptionsConfigurator::~DolphinSearchOptionsConfigurator() { + // store the UI configuration + const int locationIndex = m_locationBox->currentIndex(); + SearchSettings::setLocation(g_locationItems[locationIndex].settingsName); + + const int whatIndex = m_whatBox->currentIndex(); + SearchSettings::setWhat(g_whatItems[whatIndex].settingsName); + + QString criterionsString; + foreach(const SearchCriterionSelector* criterion, m_criterions) { + if (!criterionsString.isEmpty()) { + criterionsString += ','; + } + const int index = static_cast<int>(criterion->type()); + criterionsString += g_criterionItems[index].settingsName; + } + SearchSettings::setCriterions(criterionsString); + + SearchSettings::self()->writeConfig(); } -QString DolphinSearchOptionsConfigurator::options() const +KUrl DolphinSearchOptionsConfigurator::nepomukUrl() const { QString searchOptions; foreach (const SearchCriterionSelector* criterion, m_criterions) { @@ -126,25 +183,58 @@ QString DolphinSearchOptionsConfigurator::options() const searchOptions += criterionString; } } - return searchOptions; + + QString searchString = m_customSearchQuery; + if (!searchString.isEmpty() && !searchOptions.isEmpty()) { + searchString += ' ' + searchOptions; + } else if (!searchOptions.isEmpty()) { + searchString += searchOptions; + } + + searchString.insert(0, QLatin1String("nepomuksearch:/")); + return KUrl(searchString); +} + +void DolphinSearchOptionsConfigurator::setCustomSearchQuery(const QString& searchQuery) +{ + m_customSearchQuery = searchQuery.simplified(); + + const bool enabled = hasSearchParameters(); + m_searchButton->setEnabled(enabled); + m_saveButton->setEnabled(enabled); } void DolphinSearchOptionsConfigurator::showEvent(QShowEvent* event) { if (!event->spontaneous() && !m_initialized) { - // add default search criterions - SearchCriterionSelector* dateCriterion = new SearchCriterionSelector(SearchCriterionSelector::Date, this); - SearchCriterionSelector* sizeCriterion = new SearchCriterionSelector(SearchCriterionSelector::Size, this); - SearchCriterionSelector* tagCriterion = new SearchCriterionSelector(SearchCriterionSelector::Tag, this); + // restore the UI layout of the last session + const QString location = SearchSettings::location(); + for (unsigned int i = 0; i < sizeof(g_locationItems) / sizeof(SettingsItem); ++i) { + if (g_locationItems[i].settingsName == location) { + m_locationBox->setCurrentIndex(i); + break; + } + } + + const QString what = SearchSettings::what(); + for (unsigned int i = 0; i < sizeof(g_whatItems) / sizeof(SettingsItem); ++i) { + if (g_whatItems[i].settingsName == what) { + m_whatBox->setCurrentIndex(i); + break; + } + } - // Add the items in the same order as available in the description combo (verified by Q_ASSERTs). This - // is not mandatory from an implementation point of view, but preferable from a usability point of view. - Q_ASSERT(static_cast<int>(SearchCriterionSelector::Date) == 0); - Q_ASSERT(static_cast<int>(SearchCriterionSelector::Size) == 1); - Q_ASSERT(static_cast<int>(SearchCriterionSelector::Tag) == 2); - addCriterion(dateCriterion); - addCriterion(sizeCriterion); - addCriterion(tagCriterion); + const QString criterions = SearchSettings::criterions(); + QStringList criterionsList = criterions.split(','); + foreach (const QString& criterionName, criterionsList) { + for (unsigned int i = 0; i < sizeof(g_criterionItems) / sizeof(CriterionItem); ++i) { + if (g_criterionItems[i].settingsName == criterionName) { + const SearchCriterionSelector::Type type = g_criterionItems[i].type; + addCriterion(new SearchCriterionSelector(type, this)); + break; + } + } + } m_initialized = true; } @@ -153,13 +243,15 @@ void DolphinSearchOptionsConfigurator::showEvent(QShowEvent* event) void DolphinSearchOptionsConfigurator::slotAddSelectorButtonClicked() { - SearchCriterionSelector* selector = new SearchCriterionSelector(SearchCriterionSelector::Tag, this); + SearchCriterionSelector* selector = new SearchCriterionSelector(SearchCriterionSelector::Date, this); addCriterion(selector); } -void DolphinSearchOptionsConfigurator::emitSearchOptionsChanged() +void DolphinSearchOptionsConfigurator::slotCriterionChanged() { - emit searchOptionsChanged(options()); + const bool enabled = hasSearchParameters(); + m_searchButton->setEnabled(enabled); + m_saveButton->setEnabled(enabled); } void DolphinSearchOptionsConfigurator::removeCriterion() @@ -211,18 +303,24 @@ void DolphinSearchOptionsConfigurator::saveQuery() void DolphinSearchOptionsConfigurator::addCriterion(SearchCriterionSelector* criterion) { connect(criterion, SIGNAL(removeCriterion()), this, SLOT(removeCriterion())); - // TODO: It is unclear yet whether changing a criterion should also result in triggering - // a searchOptionsChanged() signal. This mainly depends on the performance achievable with - // Nepomuk. Currently the searchOptionsChanged() signal is only emitted when the search-button - // has been triggered by the user. - // connect(criterion, SIGNAL(criterionChanged()), this, SLOT(emitSearchOptionsChanged())); + connect(criterion, SIGNAL(criterionChanged()), this, SLOT(slotCriterionChanged())); - // insert the new selector before the lastLineLayout and the KSeparator at the bottom - const int index = m_vBoxLayout->count() - 2; + // insert the new selector before the KSeparator at the bottom + const int index = m_vBoxLayout->count() - 1; m_vBoxLayout->insertWidget(index, criterion); updateSelectorButton(); m_criterions.append(criterion); } +bool DolphinSearchOptionsConfigurator::hasSearchParameters() const +{ + if (!m_customSearchQuery.isEmpty()) { + // performance optimization: if a custom search query is defined, + // there is no need to call the (quite expensive) method nepomukUrl() + return true; + } + return nepomukUrl().path() != QLatin1String("/"); +} + #include "dolphinsearchoptionsconfigurator.moc" diff --git a/src/search/dolphinsearchoptionsconfigurator.h b/src/search/dolphinsearchoptionsconfigurator.h index 5bceaceea..ee7867933 100644 --- a/src/search/dolphinsearchoptionsconfigurator.h +++ b/src/search/dolphinsearchoptionsconfigurator.h @@ -20,7 +20,9 @@ #ifndef DOLPHINSEARCHOPTIONSCONFIGURATOR_H #define DOLPHINSEARCHOPTIONSCONFIGURATOR_H +#include <kurl.h> #include <QList> +#include <QString> #include <QWidget> class KComboBox; @@ -40,22 +42,30 @@ public: virtual ~DolphinSearchOptionsConfigurator(); /** - * Returns the configured options as compliant - * string that may be used as input for a nepomuk:/-URI. + * Returns the sum of the configured options and the + * custom search query as Nepomuk URL. + * @see DolphinSearchOptionsConfigurator::setCustomSearchQuery() */ - QString options() const; + KUrl nepomukUrl() const; + +public slots: + /** + * Sets a custom search query that is added to the + * search query defined by the search options configurator. + * This is useful if a custom search user interface is + * offered outside the search options configurator. + */ + void setCustomSearchQuery(const QString& searchQuery); signals: - void searchOptionsChanged(const QString& options); + void searchOptionsChanged(); protected: virtual void showEvent(QShowEvent* event); private slots: void slotAddSelectorButtonClicked(); - - void emitSearchOptionsChanged(); - + void slotCriterionChanged(); void removeCriterion(); /** @@ -76,13 +86,22 @@ private: */ void addCriterion(SearchCriterionSelector* selector); + /** + * Returns true, DolphinSearchOptionsConfigurator::nepomukUrl() + * contains at least 1 search parameter. + */ + bool hasSearchParameters() const; + private: bool m_initialized; - KComboBox* m_searchFromBox; - KComboBox* m_searchWhatBox; + KComboBox* m_locationBox; + KComboBox* m_whatBox; QPushButton* m_addSelectorButton; + QPushButton* m_searchButton; + QPushButton* m_saveButton; QVBoxLayout* m_vBoxLayout; QList<SearchCriterionSelector*> m_criterions; + QString m_customSearchQuery; }; #endif diff --git a/src/search/searchcriterionselector.cpp b/src/search/searchcriterionselector.cpp index 5a6c41a1e..cf2cc2704 100644 --- a/src/search/searchcriterionselector.cpp +++ b/src/search/searchcriterionselector.cpp @@ -103,6 +103,11 @@ QString SearchCriterionSelector::toString() const return criterion; } +SearchCriterionSelector::Type SearchCriterionSelector::type() const +{ + return static_cast<Type>(m_descriptionsBox->currentIndex()); +} + void SearchCriterionSelector::slotDescriptionChanged(int index) { if (m_valueWidget != 0) { diff --git a/src/search/searchcriterionselector.h b/src/search/searchcriterionselector.h index b240d7648..f0eab1ac4 100644 --- a/src/search/searchcriterionselector.h +++ b/src/search/searchcriterionselector.h @@ -56,6 +56,8 @@ public: */ QString toString() const; + Type type() const; + signals: /** * Is emitted if the criterion selector should be removed |
