mirror of
https://invent.kde.org/system/dolphin
synced 2024-09-12 12:54:29 +00:00
Merge branch 'KDE/4.13'
This commit is contained in:
commit
2849f71ba0
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue