┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/kitemviews
diff options
context:
space:
mode:
Diffstat (limited to 'src/kitemviews')
-rw-r--r--src/kitemviews/kfileitemmodel.cpp42
-rw-r--r--src/kitemviews/kfileitemmodel.h10
-rw-r--r--src/kitemviews/kitemlistcontroller.cpp108
-rw-r--r--src/kitemviews/kitemlistcontroller.h21
-rw-r--r--src/kitemviews/kitemmodelbase.cpp6
-rw-r--r--src/kitemviews/kitemmodelbase.h14
6 files changed, 142 insertions, 59 deletions
diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp
index 33dc9979b..401ba218d 100644
--- a/src/kitemviews/kfileitemmodel.cpp
+++ b/src/kitemviews/kfileitemmodel.cpp
@@ -123,24 +123,6 @@ 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;
@@ -189,6 +171,30 @@ QMimeData* KFileItemModel::createMimeData(const QSet<int>& indexes) const
return data;
}
+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::supportsDropping(int index) const
+{
+ const KFileItem item = fileItem(index);
+ return item.isNull() ? false : item.isDir();
+}
+
KFileItem KFileItemModel::fileItem(int index) const
{
if (index >= 0 && index < count()) {
diff --git a/src/kitemviews/kfileitemmodel.h b/src/kitemviews/kfileitemmodel.h
index 839d4e724..c70892dd3 100644
--- a/src/kitemviews/kfileitemmodel.h
+++ b/src/kitemviews/kfileitemmodel.h
@@ -55,10 +55,6 @@ 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
*/
@@ -73,6 +69,12 @@ public:
/** @reimp */
virtual QMimeData* createMimeData(const QSet<int>& indexes) const;
+ /** @reimp */
+ virtual int indexForKeyboardSearch(const QString& text, int startFromIndex = 0) const;
+
+ /** @reimp */
+ virtual bool supportsDropping(int index) const;
+
/**
* @return The file-item for the index \a index. If the index is in a valid
* range it is assured that the file-item is not null. The runtime
diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp
index 025249a34..ed23dd1f7 100644
--- a/src/kitemviews/kitemlistcontroller.cpp
+++ b/src/kitemviews/kitemlistcontroller.cpp
@@ -482,16 +482,43 @@ bool KItemListController::dragLeaveEvent(QGraphicsSceneDragDropEvent* event, con
bool KItemListController::dragMoveEvent(QGraphicsSceneDragDropEvent* event, const QTransform& transform)
{
- Q_UNUSED(event);
Q_UNUSED(transform);
+ if (!m_model || !m_view) {
+ return false;
+ }
+
+ KItemListWidget* oldHoveredWidget = hoveredWidget();
+ KItemListWidget* newHoveredWidget = widgetForPos(event->pos());
+ if (oldHoveredWidget != newHoveredWidget) {
+ if (oldHoveredWidget) {
+ oldHoveredWidget->setHovered(false);
+ emit itemUnhovered(oldHoveredWidget->index());
+ }
+
+ if (newHoveredWidget) {
+ const int index = newHoveredWidget->index();
+ if (m_model->supportsDropping(index)) {
+ newHoveredWidget->setHovered(true);
+ }
+ emit itemHovered(index);
+ }
+ }
+
return false;
}
bool KItemListController::dropEvent(QGraphicsSceneDragDropEvent* event, const QTransform& transform)
{
- Q_UNUSED(event);
- Q_UNUSED(transform);
- return false;
+ Q_UNUSED(transform)
+ if (!m_view) {
+ return false;
+ }
+
+ const QPointF pos = transform.map(event->pos());
+ const int index = m_view->itemAt(pos);
+ emit itemDropEvent(index, event);
+
+ return true;
}
bool KItemListController::hoverEnterEvent(QGraphicsSceneHoverEvent* event, const QTransform& transform)
@@ -503,46 +530,22 @@ bool KItemListController::hoverEnterEvent(QGraphicsSceneHoverEvent* event, const
bool KItemListController::hoverMoveEvent(QGraphicsSceneHoverEvent* event, const QTransform& transform)
{
- // The implementation assumes that only one item can get hovered no matter
- // whether they overlap or not.
-
Q_UNUSED(transform);
if (!m_model || !m_view) {
return false;
}
- // Search the previously hovered item that might get unhovered
- KItemListWidget* unhoveredWidget = 0;
- foreach (KItemListWidget* widget, m_view->visibleItemListWidgets()) {
- if (widget->isHovered()) {
- unhoveredWidget = widget;
- break;
+ KItemListWidget* oldHoveredWidget = hoveredWidget();
+ KItemListWidget* newHoveredWidget = widgetForPos(event->pos());
+ if (oldHoveredWidget != newHoveredWidget) {
+ if (oldHoveredWidget) {
+ oldHoveredWidget->setHovered(false);
+ emit itemUnhovered(oldHoveredWidget->index());
}
- }
- // Search the currently hovered item
- KItemListWidget* hoveredWidget = 0;
- foreach (KItemListWidget* widget, m_view->visibleItemListWidgets()) {
- const QPointF mappedPos = widget->mapFromItem(m_view, event->pos());
-
- const bool hovered = widget->contains(mappedPos) &&
- !widget->expansionToggleRect().contains(mappedPos) &&
- !widget->selectionToggleRect().contains(mappedPos);
- if (hovered) {
- hoveredWidget = widget;
- break;
- }
- }
-
- if (unhoveredWidget != hoveredWidget) {
- if (unhoveredWidget) {
- unhoveredWidget->setHovered(false);
- emit itemUnhovered(unhoveredWidget->index());
- }
-
- if (hoveredWidget) {
- hoveredWidget->setHovered(true);
- emit itemHovered(hoveredWidget->index());
+ if (newHoveredWidget) {
+ newHoveredWidget->setHovered(true);
+ emit itemHovered(newHoveredWidget->index());
}
}
@@ -755,4 +758,35 @@ void KItemListController::startDragging()
drag->exec(Qt::MoveAction | Qt::CopyAction | Qt::LinkAction, Qt::IgnoreAction);
}
+KItemListWidget* KItemListController::hoveredWidget() const
+{
+ Q_ASSERT(m_view);
+
+ foreach (KItemListWidget* widget, m_view->visibleItemListWidgets()) {
+ if (widget->isHovered()) {
+ return widget;
+ }
+ }
+
+ return 0;
+}
+
+KItemListWidget* KItemListController::widgetForPos(const QPointF& pos) const
+{
+ Q_ASSERT(m_view);
+
+ foreach (KItemListWidget* widget, m_view->visibleItemListWidgets()) {
+ const QPointF mappedPos = widget->mapFromItem(m_view, pos);
+
+ const bool hovered = widget->contains(mappedPos) &&
+ !widget->expansionToggleRect().contains(mappedPos) &&
+ !widget->selectionToggleRect().contains(mappedPos);
+ if (hovered) {
+ return widget;
+ }
+ }
+
+ return 0;
+}
+
#include "kitemlistcontroller.moc"
diff --git a/src/kitemviews/kitemlistcontroller.h b/src/kitemviews/kitemlistcontroller.h
index 8ac2b554b..80c750581 100644
--- a/src/kitemviews/kitemlistcontroller.h
+++ b/src/kitemviews/kitemlistcontroller.h
@@ -34,6 +34,7 @@ class KItemModelBase;
class KItemListKeyboardSearchManager;
class KItemListSelectionManager;
class KItemListView;
+class KItemListWidget;
class QGraphicsSceneHoverEvent;
class QGraphicsSceneDragDropEvent;
class QGraphicsSceneMouseEvent;
@@ -113,6 +114,7 @@ signals:
* Is emitted if the item with the index \p index gets hovered.
*/
void itemHovered(int index);
+
/**
* Is emitted if the item with the index \p index gets unhovered.
* It is assured that the signal itemHovered() for this index
@@ -122,6 +124,13 @@ signals:
void itemExpansionToggleClicked(int index);
+ /**
+ * Is emitted if a drop event is done above the item with the index
+ * \a index. If \a index is < 0 the drop event is done above an
+ * empty area of the view.
+ */
+ void itemDropEvent(int index, QGraphicsSceneDragDropEvent* event);
+
void modelChanged(KItemModelBase* current, KItemModelBase* previous);
void viewChanged(KItemListView* current, KItemListView* previous);
@@ -142,6 +151,18 @@ private:
*/
void startDragging();
+ /**
+ * @return Widget that is currently in the hovered state. 0 is returned
+ * if no widget is marked as hovered.
+ */
+ KItemListWidget* hoveredWidget() const;
+
+ /**
+ * @return Widget that is below the position \a pos. 0 is returned
+ * if no widget is below the position.
+ */
+ KItemListWidget* widgetForPos(const QPointF& pos) const;
+
private:
SelectionBehavior m_selectionBehavior;
KItemModelBase* m_model;
diff --git a/src/kitemviews/kitemmodelbase.cpp b/src/kitemviews/kitemmodelbase.cpp
index 79766fae1..541f802e3 100644
--- a/src/kitemviews/kitemmodelbase.cpp
+++ b/src/kitemviews/kitemmodelbase.cpp
@@ -116,6 +116,12 @@ int KItemModelBase::indexForKeyboardSearch(const QString& text, int startFromInd
return -1;
}
+bool KItemModelBase::supportsDropping(int index) const
+{
+ Q_UNUSED(index);
+ return false;
+}
+
void KItemModelBase::onGroupRoleChanged(const QByteArray& current, const QByteArray& previous)
{
Q_UNUSED(current);
diff --git a/src/kitemviews/kitemmodelbase.h b/src/kitemviews/kitemmodelbase.h
index c4e046402..de6e1bb1d 100644
--- a/src/kitemviews/kitemmodelbase.h
+++ b/src/kitemviews/kitemmodelbase.h
@@ -123,6 +123,20 @@ public:
* @param startFromIndex the index from which to start searching from
*/
virtual int indexForKeyboardSearch(const QString& text, int startFromIndex = 0) const;
+
+ /**
+ * @return True, if the item with the index \a index basically supports dropping.
+ * Per default false is returned.
+ *
+ * The information is used only to give a visual feedback during a drag operation
+ * and not to decide whether a drop event gets emitted. It is it is still up to
+ * the receiver of KItemListController::itemDropEvent() to decide how to handle
+ * the drop event.
+ */
+ // TODO: Should the MIME-data be passed too so that the model can do a more specific
+ // decision whether it accepts the drop?
+ virtual bool supportsDropping(int index) const;
+
signals:
/**
* Is emitted if one or more items have been inserted. Each item-range consists