X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/bd7416d0af9d498d0f2b6611fabd16e8e508f094..ceba0f6f6a07babac230d1f136d16d34629b4cf3:/src/search/dolphinsearchbox.cpp diff --git a/src/search/dolphinsearchbox.cpp b/src/search/dolphinsearchbox.cpp index 2e4b58d9f..dce47c469 100644 --- a/src/search/dolphinsearchbox.cpp +++ b/src/search/dolphinsearchbox.cpp @@ -20,11 +20,12 @@ #include "dolphinsearchbox.h" #include "dolphin_searchsettings.h" +#include "dolphinsearchinformation.h" -#include -#include -#include -#include +#include +#include +#include +#include #include #include @@ -34,34 +35,36 @@ #include #include #include +#include #include #include #include #include #ifdef HAVE_NEPOMUK - #include - #include - #include - #include - #include - #include - #include - #include - #include + #include + #include + #include + #include + #include + #include + #include + #include + #include #endif DolphinSearchBox::DolphinSearchBox(QWidget* parent) : QWidget(parent), m_startedSearching(false), - m_nepomukActivated(false), + m_readOnly(false), m_topLayout(0), m_searchInput(0), - m_fromHereButton(0), - m_everywhereButton(0), m_fileNameButton(0), m_contentButton(0), - m_filterButton(0), + m_separator(0), + m_fromHereButton(0), + m_everywhereButton(0), + m_infoLabel(0), m_searchPath(), m_startSearchTimer(0) { @@ -72,6 +75,11 @@ DolphinSearchBox::~DolphinSearchBox() saveSettings(); } +void DolphinSearchBox::setText(const QString& text) +{ + m_searchInput->setText(text); +} + QString DolphinSearchBox::text() const { return m_searchInput->text(); @@ -80,7 +88,26 @@ QString DolphinSearchBox::text() const void DolphinSearchBox::setSearchPath(const KUrl& url) { m_searchPath = url; - m_filterButton->setVisible(isSearchPathIndexed()); + + QFontMetrics metrics(m_fromHereButton->font()); + const int maxWidth = metrics.averageCharWidth() * 15; + + QString location = url.fileName(); + if (location.isEmpty()) { + if (url.isLocalFile()) { + location = QLatin1String("/"); + } else { + location = url.protocol() + QLatin1String(" - ") + url.host(); + } + } + + 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_separator->setVisible(showSearchFromButtons); + m_fromHereButton->setVisible(showSearchFromButtons); + m_everywhereButton->setVisible(showSearchFromButtons); } KUrl DolphinSearchBox::searchPath() const @@ -91,34 +118,53 @@ KUrl DolphinSearchBox::searchPath() const KUrl DolphinSearchBox::urlForSearching() const { KUrl url; - if (isSearchPathIndexed()) { + const DolphinSearchInformation& searchInfo = DolphinSearchInformation::instance(); + if (searchInfo.isIndexingEnabled() && searchInfo.isPathIndexed(m_searchPath)) { url = nepomukUrlForSearching(); } else { - url = m_searchPath; url.setProtocol("filenamesearch"); url.addQueryItem("search", m_searchInput->text()); if (m_contentButton->isChecked()) { url.addQueryItem("checkContent", "yes"); } + + QString encodedUrl; if (m_everywhereButton->isChecked()) { // It is very unlikely, that the majority of Dolphins target users // mean "the whole harddisk" instead of "my home folder" when // selecting the "Everywhere" button. - url.setPath(QDir::homePath()); + encodedUrl = QDir::homePath(); + } else { + encodedUrl = m_searchPath.url(); } + url.addQueryItem("url", encodedUrl); } return url; } +void DolphinSearchBox::selectAll() +{ + m_searchInput->selectAll(); +} + +void DolphinSearchBox::setReadOnly(bool readOnly) +{ + if (m_readOnly != readOnly) { + m_readOnly = readOnly; + applyReadOnlyState(); + } +} + +bool DolphinSearchBox::isReadOnly() const +{ + return m_readOnly; +} + bool DolphinSearchBox::event(QEvent* event) { if (event->type() == QEvent::Polish) { init(); - } else if (event->type() == QEvent::KeyPress) { - if (static_cast(event)->key() == Qt::Key_Escape) { - m_searchInput->clear(); - } } return QWidget::event(event); } @@ -126,11 +172,6 @@ bool DolphinSearchBox::event(QEvent* event) void DolphinSearchBox::showEvent(QShowEvent* event) { if (!event->spontaneous()) { -#ifdef HAVE_NEPOMUK - m_nepomukActivated = (Nepomuk::ResourceManager::instance()->init() == 0); -#endif - - m_searchInput->clear(); m_searchInput->setFocus(); m_startedSearching = false; } @@ -139,7 +180,7 @@ void DolphinSearchBox::showEvent(QShowEvent* event) void DolphinSearchBox::keyReleaseEvent(QKeyEvent* event) { QWidget::keyReleaseEvent(event); - if ((event->key() == Qt::Key_Escape)) { + if (event->key() == Qt::Key_Escape) { if (m_searchInput->text().isEmpty()) { emit closeRequest(); } else { @@ -224,30 +265,22 @@ void DolphinSearchBox::init() m_searchInput = new KLineEdit(this); m_searchInput->setClearButtonShown(true); m_searchInput->setFont(KGlobalSettings::generalFont()); + setFocusProxy(m_searchInput); connect(m_searchInput, SIGNAL(returnPressed(QString)), this, SLOT(slotReturnPressed(QString))); 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_searchInput); - - // Create "From Here" and "Everywhere"button - m_fromHereButton = new QPushButton(); - m_fromHereButton->setText(i18nc("action:button", "From Here")); - initButton(m_fromHereButton); - - m_everywhereButton = new QPushButton(this); - m_everywhereButton->setText(i18nc("action:button", "Everywhere")); - initButton(m_everywhereButton); - - QButtonGroup* searchLocationGroup = new QButtonGroup(this); - searchLocationGroup->addButton(m_fromHereButton); - searchLocationGroup->addButton(m_everywhereButton); + searchInputLayout->addWidget(m_infoLabel); // Create "Filename" and "Content" button m_fileNameButton = new QPushButton(this); @@ -262,28 +295,47 @@ void DolphinSearchBox::init() searchWhatGroup->addButton(m_fileNameButton); searchWhatGroup->addButton(m_contentButton); - // Create "Filter" button - m_filterButton = new QToolButton(this); - m_filterButton->setIcon(KIcon("view-filter")); - m_filterButton->setAutoRaise(true); - m_filterButton->setCheckable(true); - m_filterButton->hide(); - //connect(m_filterButton, SIGNAL(toggled(bool)), this, SLOT(setFilterWidgetsVisible(bool))); + m_separator = new KSeparator(Qt::Vertical, this); + + // Create "From Here" and "Everywhere"button + m_fromHereButton = new QPushButton(this); + m_fromHereButton->setText(i18nc("action:button", "From Here")); + initButton(m_fromHereButton); + + m_everywhereButton = new QPushButton(this); + m_everywhereButton->setText(i18nc("action:button", "Everywhere")); + initButton(m_everywhereButton); + + QButtonGroup* searchLocationGroup = new QButtonGroup(this); + searchLocationGroup->addButton(m_fromHereButton); + searchLocationGroup->addButton(m_everywhereButton); // Apply layout for the options QHBoxLayout* optionsLayout = new QHBoxLayout(); optionsLayout->setMargin(0); - optionsLayout->addWidget(m_fromHereButton); - optionsLayout->addWidget(m_everywhereButton); - optionsLayout->addWidget(new KSeparator(Qt::Vertical)); optionsLayout->addWidget(m_fileNameButton); optionsLayout->addWidget(m_contentButton); + optionsLayout->addWidget(m_separator); + optionsLayout->addWidget(m_fromHereButton); + optionsLayout->addWidget(m_everywhereButton); optionsLayout->addStretch(1); - optionsLayout->addWidget(m_filterButton); + + // 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_topLayout = new QVBoxLayout(this); m_topLayout->addLayout(searchInputLayout); - m_topLayout->addLayout(optionsLayout); + m_topLayout->addWidget(optionsScrollArea); searchLabel->setBuddy(m_searchInput); loadSettings(); @@ -294,41 +346,8 @@ void DolphinSearchBox::init() m_startSearchTimer->setSingleShot(true); m_startSearchTimer->setInterval(1000); connect(m_startSearchTimer, SIGNAL(timeout()), this, SLOT(emitSearchSignal())); -} - -bool DolphinSearchBox::isSearchPathIndexed() const -{ -#ifdef HAVE_NEPOMUK - const QString path = m_searchPath.path(); - const KConfig strigiConfig("nepomukstrigirc"); - const QStringList indexedFolders = strigiConfig.group("General").readPathEntry("folders", QStringList()); - - // Check whether the current search path is part of an indexed folder - bool isIndexed = false; - foreach (const QString& indexedFolder, indexedFolders) { - if (path.startsWith(indexedFolder)) { - isIndexed = true; - break; - } - } - - if (isIndexed) { - // The current search path is part of an indexed folder. Check whether no - // excluded folder is part of the search path. - const QStringList excludedFolders = strigiConfig.group("General").readPathEntry("exclude folders", QStringList()); - foreach (const QString& excludedFolder, excludedFolders) { - if (path.startsWith(excludedFolder)) { - isIndexed = false; - break; - } - } - } - - return isIndexed; -#else - return false; -#endif + applyReadOnlyState(); } KUrl DolphinSearchBox::nepomukUrlForSearching() const @@ -357,8 +376,12 @@ KUrl DolphinSearchBox::nepomukUrlForSearching() const } Nepomuk::Query::FileQuery fileQuery; - fileQuery.setFileMode(Nepomuk::Query::FileQuery::QueryFiles); + fileQuery.setFileMode(Nepomuk::Query::FileQuery::QueryFilesAndFolders); fileQuery.setTerm(andTerm); + if (m_fromHereButton->isChecked()) { + const bool recursive = true; + fileQuery.addIncludeFolder(m_searchPath, recursive); + } return fileQuery.toSearchUrl(i18nc("@title UDS_DISPLAY_NAME for a KIO directory listing. %1 is the query the user entered.", "Query Results from '%1'", @@ -368,4 +391,16 @@ KUrl DolphinSearchBox::nepomukUrlForSearching() const #endif } +void DolphinSearchBox::applyReadOnlyState() +{ + // TODO: This is just an early draft to indicate that a state change + // has been done + 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); +} + #include "dolphinsearchbox.moc"