[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [kde-baseapps] dolphin/src: Added support for highlighting items by
From: Tirtha Chatterjee <tirtha.p.chatterjee () gmail ! com>
Date: 2011-08-28 22:44:31
Message-ID: 20110828224431.92EEDA6078 () git ! kde ! org
[Download RAW message or body]
Git commit e2b1c609e5af2aabc6215182cbf7679f0b0c6d59 by Tirtha Chatterjee.
Committed on 29/08/2011 at 00:42.
Pushed by chatterjee into branch 'master'.
Added support for highlighting items by typing their name on the keyboard.
M +1 -0 dolphin/src/CMakeLists.txt
M +4 -0 dolphin/src/kitemviews/kitemlistcontroller.h
M +27 -1 dolphin/src/kitemviews/kitemlistcontroller.cpp
M +5 -0 dolphin/src/kitemviews/kitemmodelbase.cpp
M +4 -0 dolphin/src/kitemviews/kfileitemmodel.h
M +7 -0 dolphin/src/kitemviews/kitemmodelbase.h
A +54 -0 dolphin/src/kitemviews/kitemlistkeyboardsearchmanager.cpp \
[License: GPL (v2+)] A +73 -0 \
dolphin/src/kitemviews/kitemlistkeyboardsearchmanager_p.h [License: GPL (v2+)] M \
+18 -0 dolphin/src/kitemviews/kfileitemmodel.cpp
http://commits.kde.org/kde-baseapps/e2b1c609e5af2aabc6215182cbf7679f0b0c6d59
diff --git a/dolphin/src/CMakeLists.txt b/dolphin/src/CMakeLists.txt
index 31d3f89..b443aa7 100644
--- a/dolphin/src/CMakeLists.txt
+++ b/dolphin/src/CMakeLists.txt
@@ -25,6 +25,7 @@ set(dolphinprivate_LIB_SRCS
kitemviews/kitemlistcontainer.cpp
kitemviews/kitemlistcontroller.cpp
kitemviews/kitemlistgroupheader.cpp
+ kitemviews/kitemlistkeyboardsearchmanager.cpp
kitemviews/kitemlistrubberband.cpp
kitemviews/kitemlistselectionmanager.cpp
kitemviews/kitemlistsizehintresolver.cpp
diff --git a/dolphin/src/kitemviews/kfileitemmodel.cpp \
b/dolphin/src/kitemviews/kfileitemmodel.cpp index f36ab83..c2f49f7 100644
--- a/dolphin/src/kitemviews/kfileitemmodel.cpp
+++ b/dolphin/src/kitemviews/kfileitemmodel.cpp
@@ -124,6 +124,24 @@ bool KFileItemModel::setData(int index, const QHash<QByteArray, \
QVariant>& value return false;
}
+int KFileItemModel::indexForKeyboardSearch(const QString& text, int startFromIndex) \
const +{
+ startFromIndex = qMax(0, startFromIndex);
+ for (int i = startFromIndex; i < count(); i++) {
+ if (data(i)["name"].toString().startsWith(text, Qt::CaseInsensitive)) {
+ kDebug() << data(i)["name"].toString();
+ return i;
+ }
+ }
+ for (int i = 0; i < startFromIndex; i++) {
+ if (data(i)["name"].toString().startsWith(text, Qt::CaseInsensitive)) {
+ kDebug() << data(i)["name"].toString();
+ return i;
+ }
+ }
+ return -1;
+}
+
bool KFileItemModel::supportsGrouping() const
{
return true;
diff --git a/dolphin/src/kitemviews/kfileitemmodel.h \
b/dolphin/src/kitemviews/kfileitemmodel.h index 654c7db..0fecbcf 100644
--- a/dolphin/src/kitemviews/kfileitemmodel.h
+++ b/dolphin/src/kitemviews/kfileitemmodel.h
@@ -55,6 +55,10 @@ public:
virtual bool setData(int index, const QHash<QByteArray, QVariant> &values);
/**
+ * @reimp
+ */
+ virtual int indexForKeyboardSearch(const QString& text, int startFromIndex = 0) \
const; + /**
* @return True
* @reimp
*/
diff --git a/dolphin/src/kitemviews/kitemlistcontroller.cpp \
b/dolphin/src/kitemviews/kitemlistcontroller.cpp index c0875ce..207535c 100644
--- a/dolphin/src/kitemviews/kitemlistcontroller.cpp
+++ b/dolphin/src/kitemviews/kitemlistcontroller.cpp
@@ -25,6 +25,7 @@
#include "kitemlistview.h"
#include "kitemlistrubberband_p.h"
#include "kitemlistselectionmanager.h"
+#include "kitemlistkeyboardsearchmanager_p.h"
#include <QApplication>
#include <QDrag>
@@ -42,10 +43,12 @@ KItemListController::KItemListController(QObject* parent) :
m_model(0),
m_view(0),
m_selectionManager(new KItemListSelectionManager(this)),
+ m_keyboardManager(new KItemListKeyboardSearchManager(this)),
m_pressedIndex(-1),
m_pressedMousePos(),
m_oldSelection()
{
+ connect(m_keyboardManager, SIGNAL(requestItemActivation(QString,bool)), this, \
SLOT(slotKeyboardActivationRequested(QString,bool))); }
KItemListController::~KItemListController()
@@ -202,10 +205,12 @@ bool KItemListController::keyPressEvent(QKeyEvent* event)
m_selectionManager->endAnchoredSelection();
m_selectionManager->setSelected(index, 1, \
KItemListSelectionManager::Toggle); \
m_selectionManager->beginAnchoredSelection(index); + break;
}
default:
- break;
+ m_keyboardManager->addKeys(event->text());
+ return false;
}
if (m_selectionManager->currentItem() != index) {
@@ -227,6 +232,27 @@ bool KItemListController::keyPressEvent(QKeyEvent* event)
return true;
}
+void KItemListController::slotKeyboardActivationRequested(const QString& text, bool \
searchFromNextItem) +{
+ if (!m_model) {
+ return;
+ }
+ const int currentIndex = m_selectionManager->currentItem();
+ int index;
+ if (searchFromNextItem) {
+ index = m_model->indexForKeyboardSearch(text, (currentIndex + 1) % \
m_model->count()); + }
+ else {
+ index = m_model->indexForKeyboardSearch(text, currentIndex);
+ }
+ if (index >= 0) {
+ m_selectionManager->setCurrentItem(index);
+ m_selectionManager->clearSelection();
+ m_selectionManager->setSelected(index, 1);
+ m_selectionManager->beginAnchoredSelection(index);
+ }
+}
+
bool KItemListController::inputMethodEvent(QInputMethodEvent* event)
{
Q_UNUSED(event);
diff --git a/dolphin/src/kitemviews/kitemlistcontroller.h \
b/dolphin/src/kitemviews/kitemlistcontroller.h index 134e116..04d4985 100644
--- a/dolphin/src/kitemviews/kitemlistcontroller.h
+++ b/dolphin/src/kitemviews/kitemlistcontroller.h
@@ -31,6 +31,7 @@
#include <QSet>
class KItemModelBase;
+class KItemListKeyboardSearchManager;
class KItemListSelectionManager;
class KItemListView;
class QGraphicsSceneHoverEvent;
@@ -132,6 +133,8 @@ private slots:
*/
void slotRubberBandChanged();
+ void slotKeyboardActivationRequested(const QString& text, bool \
searchFromNextItem); +
private:
/**
* Creates a QDrag object to start a drag-operation.
@@ -146,6 +149,7 @@ private:
KItemModelBase* m_model;
KItemListView* m_view;
KItemListSelectionManager* m_selectionManager;
+ KItemListKeyboardSearchManager* m_keyboardManager;
int m_pressedIndex;
QPointF m_pressedMousePos;
diff --git a/dolphin/src/kitemviews/kitemlistkeyboardsearchmanager.cpp \
b/dolphin/src/kitemviews/kitemlistkeyboardsearchmanager.cpp new file mode 100644
index 0000000..34633d6
--- /dev/null
+++ b/dolphin/src/kitemviews/kitemlistkeyboardsearchmanager.cpp
@@ -0,0 +1,54 @@
+/***************************************************************************
+ * Copyright (C) 2011 by Tirtha Chatterjee <tirtha.p.chatterjee@gmail.com> *
+ * *
+ * Based on the Itemviews NG project from Trolltech Labs: *
+ * http://qt.gitorious.org/qt-labs/itemviews-ng *
+ * *
+ * 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. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
+ ***************************************************************************/
+
+#include "kitemlistkeyboardsearchmanager_p.h"
+
+#include <QApplication>
+#include <QElapsedTimer>
+
+#include <KDebug>
+
+KItemListKeyboardSearchManager::KItemListKeyboardSearchManager(QObject* parent) :
+ QObject(parent)
+{
+ m_keyboardInputTime.invalidate();
+}
+
+KItemListKeyboardSearchManager::~KItemListKeyboardSearchManager()
+{
+}
+
+void KItemListKeyboardSearchManager::addKeys(const QString& keys)
+{
+ const bool keyboardTimeWasValid = m_keyboardInputTime.isValid();
+ const qint64 keyboardInputTimeElapsed = m_keyboardInputTime.restart();
+ if (keyboardInputTimeElapsed > QApplication::keyboardInputInterval()
+ || !keyboardTimeWasValid || keys.isEmpty()) {
+ m_searchedString.clear();
+ }
+ const bool searchFromNextItem = m_searchedString.isEmpty();
+ if (!keys.isEmpty()) {
+ m_searchedString.append(keys);
+ emit requestItemActivation(m_searchedString, searchFromNextItem);
+ }
+ m_keyboardInputTime.start();
+}
diff --git a/dolphin/src/kitemviews/kitemlistkeyboardsearchmanager_p.h \
b/dolphin/src/kitemviews/kitemlistkeyboardsearchmanager_p.h new file mode 100644
index 0000000..cf41f3b
--- /dev/null
+++ b/dolphin/src/kitemviews/kitemlistkeyboardsearchmanager_p.h
@@ -0,0 +1,73 @@
+/***************************************************************************
+ * Copyright (C) 2011 by Tirtha Chatterjee <tirtha.p.chatterjee@gmail.com> *
+ * *
+ * Based on the Itemviews NG project from Trolltech Labs: *
+ * http://qt.gitorious.org/qt-labs/itemviews-ng *
+ * *
+ * 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. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
+ ***************************************************************************/
+
+#ifndef KITEMLISTKEYBOARDMANAGER_H
+#define KITEMLISTKEYBOARDMANAGER_H
+
+#include <libdolphin_export.h>
+
+#include <QObject>
+#include <QString>
+#include <QElapsedTimer>
+
+class KItemListController;
+class QInputMethodEvent;
+class QKeyEvent;
+
+/**
+ * @brief Controls the keyboard searching ability for a KItemListController.
+ *
+ * @see KItemListController
+ * @see KItemModelBase
+ */
+class LIBDOLPHINPRIVATE_EXPORT KItemListKeyboardSearchManager : public QObject
+{
+ Q_OBJECT
+
+public:
+
+ KItemListKeyboardSearchManager(QObject* parent = 0);
+ virtual ~KItemListKeyboardSearchManager();
+
+ /**
+ * Add \a keys to the text buffer used for searching.
+ */
+ void addKeys(const QString& keys);
+
+signals:
+
+ /**
+ * Is emitted when a text is to be searched.
+ * @param searchFromNextItem if true, start searching
+ * from item next to current item. Otherwise, search from
+ * current item.
+ */
+ void requestItemActivation(const QString& string, bool searchFromNextItem);
+
+private:
+ QString m_searchedString;
+ QElapsedTimer m_keyboardInputTime;
+};
+
+#endif
+
+
diff --git a/dolphin/src/kitemviews/kitemmodelbase.cpp \
b/dolphin/src/kitemviews/kitemmodelbase.cpp index fc604e7..69f62bc 100644
--- a/dolphin/src/kitemviews/kitemmodelbase.cpp
+++ b/dolphin/src/kitemviews/kitemmodelbase.cpp
@@ -109,6 +109,11 @@ QMimeData* KItemModelBase::createMimeData(const QSet<int>& \
indexes) const return 0;
}
+int KItemModelBase::indexForKeyboardSearch(const QString& text, int startFromIndex) \
const +{
+ return -1;
+}
+
void KItemModelBase::onGroupRoleChanged(const QByteArray& current, const QByteArray& \
previous) {
Q_UNUSED(current);
diff --git a/dolphin/src/kitemviews/kitemmodelbase.h \
b/dolphin/src/kitemviews/kitemmodelbase.h index 4670469..c4e0464 100644
--- a/dolphin/src/kitemviews/kitemmodelbase.h
+++ b/dolphin/src/kitemviews/kitemmodelbase.h
@@ -116,6 +116,13 @@ public:
*/
virtual QMimeData* createMimeData(const QSet<int>& indexes) const;
+ /**
+ * @return Reimplement this to return the index for the first item
+ * beginning with string typed in through the keyboard, -1 if not found.
+ * @param text the text which has been typed in through the \
keyboard + * @param startFromIndex the index from which to start searching \
from + */
+ virtual int indexForKeyboardSearch(const QString& text, int startFromIndex = 0) \
const; signals:
/**
* Is emitted if one or more items have been inserted. Each item-range consists
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic