summaryrefslogtreecommitdiffstats
path: root/juk/searchwidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'juk/searchwidget.cpp')
-rw-r--r--juk/searchwidget.cpp292
1 files changed, 292 insertions, 0 deletions
diff --git a/juk/searchwidget.cpp b/juk/searchwidget.cpp
new file mode 100644
index 00000000..83b7808e
--- /dev/null
+++ b/juk/searchwidget.cpp
@@ -0,0 +1,292 @@
+/***************************************************************************
+ begin : Sun Mar 6 2003
+ copyright : (C) 2003 by Richard Lärkäng
+ email : nouseforaname@home.se
+
+ copyright : (C) 2003 - 2004 by Scott Wheeler
+ email : wheeler@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include <klocale.h>
+#include <klineedit.h>
+#include <kiconloader.h>
+#include <kcombobox.h>
+#include <kdebug.h>
+#include <kaction.h>
+
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qcheckbox.h>
+#include <qpushbutton.h>
+#include <qtoolbutton.h>
+
+#include "searchwidget.h"
+#include "collectionlist.h"
+#include "actioncollection.h"
+
+using namespace ActionCollection;
+
+////////////////////////////////////////////////////////////////////////////////
+// SearchLine public methods
+////////////////////////////////////////////////////////////////////////////////
+
+SearchLine::SearchLine(QWidget *parent, bool simple, const char *name) :
+ QHBox(parent, name),
+ m_simple(simple),
+ m_searchFieldsBox(0)
+{
+ setSpacing(5);
+
+ if(!m_simple) {
+ m_searchFieldsBox = new KComboBox(this, "searchFields");
+ connect(m_searchFieldsBox, SIGNAL(activated(int)),
+ this, SIGNAL(signalQueryChanged()));
+ }
+
+ m_lineEdit = new KLineEdit(this, "searchLineEdit");
+ m_lineEdit->installEventFilter(this);
+ connect(m_lineEdit, SIGNAL(textChanged(const QString &)),
+ this, SIGNAL(signalQueryChanged()));
+ connect(m_lineEdit, SIGNAL(returnPressed()),
+ this, SLOT(slotActivate()));
+
+ if(!m_simple) {
+ m_caseSensitive = new KComboBox(this);
+ m_caseSensitive->insertItem(i18n("Normal Matching"), 0);
+ m_caseSensitive->insertItem(i18n("Case Sensitive"), 1);
+ m_caseSensitive->insertItem(i18n("Pattern Matching"), 2);
+ connect(m_caseSensitive, SIGNAL(activated(int)),
+ this, SIGNAL(signalQueryChanged()));
+ }
+ else
+ m_caseSensitive = 0;
+
+ updateColumns();
+}
+
+PlaylistSearch::Component SearchLine::searchComponent() const
+{
+ QString query = m_lineEdit->text();
+ bool caseSensitive = m_caseSensitive && m_caseSensitive->currentItem() == CaseSensitive;
+
+ Playlist *playlist = CollectionList::instance();
+
+ QValueList<int> searchedColumns;
+
+ if(!m_searchFieldsBox || m_searchFieldsBox->currentItem() == 0) {
+ QValueListConstIterator<int> it = m_columnList.begin();
+ for(; it != m_columnList.end(); ++it) {
+ if(playlist->isColumnVisible(*it))
+ searchedColumns.append(*it);
+ }
+ }
+ else
+ searchedColumns.append(m_columnList[m_searchFieldsBox->currentItem() - 1]);
+
+ if(m_caseSensitive && m_caseSensitive->currentItem() == Pattern)
+ return PlaylistSearch::Component(QRegExp(query), searchedColumns);
+ else
+ return PlaylistSearch::Component(query, caseSensitive, searchedColumns);
+}
+
+void SearchLine::setSearchComponent(const PlaylistSearch::Component &component)
+{
+ if(component == searchComponent())
+ return;
+
+ if(m_simple || !component.isPatternSearch()) {
+ m_lineEdit->setText(component.query());
+ if(m_caseSensitive)
+ m_caseSensitive->setCurrentItem(component.isCaseSensitive() ? CaseSensitive : Default);
+ }
+ else {
+ m_lineEdit->setText(component.pattern().pattern());
+ if(m_caseSensitive)
+ m_caseSensitive->setCurrentItem(Pattern);
+ }
+
+ if(!m_simple) {
+ if(component.columns().isEmpty() || component.columns().size() > 1)
+ m_searchFieldsBox->setCurrentItem(0);
+ else
+ m_searchFieldsBox->setCurrentItem(component.columns().front() + 1);
+ }
+}
+
+void SearchLine::clear()
+{
+ // We don't want to emit the signal if it's already empty.
+ if(!m_lineEdit->text().isEmpty())
+ m_lineEdit->clear();
+}
+
+void SearchLine::setFocus()
+{
+ m_lineEdit->setFocus();
+}
+
+bool SearchLine::eventFilter(QObject *watched, QEvent *e)
+{
+ if(watched != m_lineEdit || e->type() != QEvent::KeyPress)
+ return QHBox::eventFilter(watched, e);
+
+ QKeyEvent *key = static_cast<QKeyEvent *>(e);
+ if(key->key() == Qt::Key_Down)
+ emit signalDownPressed();
+
+ return QHBox::eventFilter(watched, e);
+}
+
+void SearchLine::slotActivate()
+{
+ action("stop")->activate();
+ action("playFirst")->activate();
+}
+
+void SearchLine::updateColumns()
+{
+ QString currentText;
+
+ if(m_searchFieldsBox) {
+ currentText = m_searchFieldsBox->currentText();
+ m_searchFieldsBox->clear();
+ }
+
+ QStringList columnHeaders;
+
+ columnHeaders.append(QString("<%1>").arg(i18n("All Visible")));
+
+ Playlist *playlist = CollectionList::instance();
+
+ int selection = -1;
+ m_columnList.clear();
+
+ for(int i = 0; i < playlist->columns(); i++) {
+ m_columnList.append(i);
+ QString text = playlist->columnText(i);
+ columnHeaders.append(text);
+ if(currentText == text)
+ selection = m_columnList.size() - 1;
+ }
+
+ if(m_searchFieldsBox) {
+ m_searchFieldsBox->insertStringList(columnHeaders);
+ m_searchFieldsBox->setCurrentItem(selection + 1);
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// SearchWidget public methods
+////////////////////////////////////////////////////////////////////////////////
+
+SearchWidget::SearchWidget(QWidget *parent, const char *name) : KToolBar(parent, name)
+{
+ setupLayout();
+ updateColumns();
+}
+
+SearchWidget::~SearchWidget()
+{
+
+}
+
+void SearchWidget::setSearch(const PlaylistSearch &search)
+{
+ PlaylistSearch::ComponentList components = search.components();
+
+ if(components.isEmpty()) {
+ clear();
+ return;
+ }
+
+ m_searchLine->setSearchComponent(*components.begin());
+}
+
+QString SearchWidget::searchText() const
+{
+ return m_searchLine->searchComponent().query();
+}
+
+void SearchWidget::setSearchText(const QString &text)
+{
+ m_searchLine->setSearchComponent(PlaylistSearch::Component(text));
+}
+
+PlaylistSearch SearchWidget::search(const PlaylistList &playlists) const
+{
+ PlaylistSearch::ComponentList components;
+ components.append(m_searchLine->searchComponent());
+ return PlaylistSearch(playlists, components);
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+// SearchWidget public slots
+////////////////////////////////////////////////////////////////////////////////
+
+void SearchWidget::clear()
+{
+ m_searchLine->clear();
+}
+
+void SearchWidget::setEnabled(bool enable)
+{
+ emit signalShown(enable);
+ setShown(enable);
+}
+
+void SearchWidget::setFocus()
+{
+ m_searchLine->setFocus();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// SearchWidget private methods
+////////////////////////////////////////////////////////////////////////////////
+
+void SearchWidget::updateColumns()
+{
+ m_searchLine->updateColumns();
+}
+
+void SearchWidget::setupLayout()
+{
+ boxLayout()->setSpacing(5);
+
+ QToolButton *clearSearchButton = new QToolButton(this);
+ clearSearchButton->setTextLabel(i18n("Clear Search"), true);
+ clearSearchButton->setIconSet(SmallIconSet("locationbar_erase"));
+
+ QLabel *label = new QLabel(i18n("Search:"), this, "kde toolbar widget");
+
+ m_searchLine = new SearchLine(this, true, "kde toolbar widget");
+
+ label->setBuddy(m_searchLine);
+
+ connect(m_searchLine, SIGNAL(signalQueryChanged()), this, SIGNAL(signalQueryChanged()));
+ connect(m_searchLine, SIGNAL(signalDownPressed()), this, SIGNAL(signalDownPressed()));
+ connect(clearSearchButton, SIGNAL(pressed()), m_searchLine, SLOT(clear()));
+ setStretchableWidget(m_searchLine);
+
+ // I've decided that I think this is ugly, for now.
+
+ /*
+ QToolButton *b = new QToolButton(this);
+ b->setTextLabel(i18n("Advanced Search"), true);
+ b->setIconSet(SmallIconSet("wizard"));
+
+ connect(b, SIGNAL(clicked()), this, SIGNAL(signalAdvancedSearchClicked()));
+ */
+}
+
+#include "searchwidget.moc"