Merge branch 'KDE/4.13'

This commit is contained in:
Vishesh Handa 2014-03-30 20:33:53 +02:00
commit 2849f71ba0
5 changed files with 223 additions and 116 deletions

View 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);
}
}

View file

@ -46,13 +46,16 @@ DolphinFacetsWidget::DolphinFacetsWidget(QWidget* parent) :
m_fourOrMore(0),
m_maxRating(0)
{
m_documents = createCheckBox(i18nc("@option:check", "Documents"));
m_images = createCheckBox(i18nc("@option:check", "Images"));
m_audio = createCheckBox(i18nc("@option:check", "Audio Files"));
m_videos = createCheckBox(i18nc("@option:check", "Videos"));
QButtonGroup* filetypeGroup = new QButtonGroup(this);
m_anyType = createRadioButton(i18nc("@option:check", "Any"), filetypeGroup);
m_documents = createRadioButton(i18nc("@option:check", "Documents"), filetypeGroup);
m_images = createRadioButton(i18nc("@option:check", "Images"), filetypeGroup);
m_audio = createRadioButton(i18nc("@option:check", "Audio Files"), filetypeGroup);
m_videos = createRadioButton(i18nc("@option:check", "Videos"), filetypeGroup);
QVBoxLayout* typeLayout = new QVBoxLayout();
typeLayout->setSpacing(0);
typeLayout->addWidget(m_anyType);
typeLayout->addWidget(m_documents);
typeLayout->addWidget(m_images);
typeLayout->addWidget(m_audio);
@ -100,6 +103,7 @@ DolphinFacetsWidget::DolphinFacetsWidget(QWidget* parent) :
topLayout->addLayout(ratingLayout);
topLayout->addStretch();
m_anyType->setChecked(true);
m_anytime->setChecked(true);
m_anyRating->setChecked(true);
}
@ -111,6 +115,9 @@ DolphinFacetsWidget::~DolphinFacetsWidget()
#ifdef HAVE_BALOO
Baloo::Term DolphinFacetsWidget::ratingTerm() const
{
Baloo::Term ratingTerm;
Baloo::Term modifiedTerm;
if (!m_anyRating->isChecked()) {
int stars = 1; // represents m_oneOrMore
if (m_twoOrMore->isChecked()) {
@ -124,15 +131,9 @@ Baloo::Term DolphinFacetsWidget::ratingTerm() const
}
const int rating = stars * 2;
Baloo::Term term("rating", rating, Baloo::Term::GreaterEqual);
return term;
ratingTerm = Baloo::Term("rating", rating, Baloo::Term::GreaterEqual);
}
return Baloo::Term();
/*
// FIXME: Handle date time filters
if (!m_anytime->isChecked()) {
QDate date = QDate::currentDate(); // represents m_today
if (m_yesterday->isChecked()) {
@ -145,44 +146,149 @@ Baloo::Term DolphinFacetsWidget::ratingTerm() const
date = date.addDays(1 - date.dayOfYear());
}
Nepomuk2::Query::ComparisonTerm term(Nepomuk2::Vocabulary::NIE::lastModified(),
Nepomuk2::Query::LiteralTerm(QDateTime(date)),
Nepomuk2::Query::ComparisonTerm::GreaterOrEqual);
andTerm.addSubTerm(term);
modifiedTerm = Baloo::Term("modified", date, Baloo::Term::GreaterEqual);
}
*/
if (ratingTerm.isValid() && modifiedTerm.isValid()) {
Baloo::Term term(Baloo::Term::And);
term.addSubTerm(ratingTerm);
term.addSubTerm(modifiedTerm);
return term;
} else if (modifiedTerm.isValid()) {
return modifiedTerm;
} else if (ratingTerm.isValid()) {
return ratingTerm;
}
return Baloo::Term();
}
QStringList DolphinFacetsWidget::facetTypes() const
QString DolphinFacetsWidget::facetType() const
{
QStringList types;
if (m_documents->isChecked()) {
types << "Document";
return QLatin1String("Document");
} else if (m_images->isChecked()) {
return QLatin1String("Image");
} else if (m_audio->isChecked()) {
return QLatin1String("Audio");
} else if (m_videos->isChecked()) {
return QLatin1String("Video");
}
if (m_images->isChecked()) {
types << "Image";
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"));
}
if (m_audio->isChecked()) {
types << "Audio";
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;
}
if (m_videos->isChecked()) {
types << "Video";
}
foreach (const Baloo::Term& subTerm, subTerms) {
const QString property = subTerm.property();
return types;
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
QCheckBox* DolphinFacetsWidget::createCheckBox(const QString& text)
void DolphinFacetsWidget::setFacetType(const QString& type)
{
QCheckBox* checkBox = new QCheckBox(text);
connect(checkBox, SIGNAL(clicked()), this, SIGNAL(facetChanged()));
return checkBox;
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,

View file

@ -57,19 +57,20 @@ public:
#ifdef HAVE_BALOO
Baloo::Term ratingTerm() const;
QStringList facetTypes() 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:
/**
* @return New checkbox which is connected to the
* slotFacedChanged() slot whenever it has
* been toggled.
*/
QCheckBox* createCheckBox(const QString& text);
void setRating(const int stars);
void setTimespan(const QDate& date);
/**
* @return New radiobutton which is connected to the
@ -80,10 +81,11 @@ private:
QButtonGroup* group);
private:
QCheckBox* m_documents;
QCheckBox* m_images;
QCheckBox* m_audio;
QCheckBox* m_videos;
QRadioButton* m_anyType;
QRadioButton* m_documents;
QRadioButton* m_images;
QRadioButton* m_audio;
QRadioButton* m_videos;
QRadioButton* m_anytime;
QRadioButton* m_today;

View 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()
void DolphinSearchBox::fromSearchUrl(const KUrl& url)
{
m_searchInput->selectAll();
}
void DolphinSearchBox::setReadOnly(bool readOnly, const KUrl& query)
{
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
@ -436,7 +434,7 @@ KUrl DolphinSearchBox::balooUrlForSearching() const
Baloo::Query query;
query.addType("File");
query.addTypes(m_facetsWidget->facetTypes());
query.addType(m_facetsWidget->facetType());
Baloo::Term term(Baloo::Term::And);
@ -447,14 +445,16 @@ KUrl DolphinSearchBox::balooUrlForSearching() const
if (m_contentButton->isChecked()) {
query.setSearchString(text);
} else {
term.addSubTerm(Baloo::Term("filename", text));
} else if (!text.isEmpty()) {
term.addSubTerm(Baloo::Term(QLatin1String("filename"), text));
}
if (m_fromHereButton->isChecked()) {
query.addCustomOption("includeFolder", m_searchPath.toLocalFile());
}
query.setTerm(term);
return query.toSearchUrl(i18nc("@title UDS_DISPLAY_NAME for a KIO directory listing. %1 is the query the user entered.",
"Query Results from '%1'", text));
#else
@ -462,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
{
setSearchPath(QDir::homePath());
}
if (!query.searchString().isEmpty()) {
setText(query.searchString());
}
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
m_searchLabel->setText(i18nc("@label:textbox", "Find:"));
}
m_searchInput->setVisible(!m_readOnly);
m_optionsScrollArea->setVisible(!m_readOnly);
if (m_readOnly) {
m_facetsWidget->hide();
} else {
m_facetsWidget->setVisible(SearchSettings::showFacetsWidget());
}
}
void DolphinSearchBox::updateFacetsToggleButton()

View file

@ -71,22 +71,17 @@ public:
/** @return URL that will start the searching of files. */
KUrl urlForSearching() const;
/**
* Extracts information from the given search \a url to
* initialize the search box properly.
*/
void fromSearchUrl(const KUrl& url);
/**
* Selects the whole text of the search box.
*/
void selectAll();
/**
* @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.
*/
void setReadOnly(bool readOnly, const KUrl& query = KUrl());
bool isReadOnly() const;
/**
* Set the search box to the active mode, if \a active
* is true. The active mode is default. The inactive mode only differs
@ -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;
};