KItemListController::KItemListController(QObject* parent) :
QObject(parent),
- m_dragging(false),
m_selectionBehavior(NoSelection),
m_model(0),
m_view(0),
return false;
}
- m_dragging = false;
m_pressedMousePos = transform.map(event->pos());
m_pressedIndex = m_view->itemAt(m_pressedMousePos);
if (m_pressedIndex >= 0) {
// Check whether a dragging should be started
- if (!m_dragging && (event->buttons() & Qt::LeftButton)) {
+ if (event->buttons() & Qt::LeftButton) {
const QPointF pos = transform.map(event->pos());
const qreal minDragDiff = 4;
const bool hasMinDragDiff = qAbs(pos.x() - m_pressedMousePos.x()) >= minDragDiff ||
qAbs(pos.y() - m_pressedMousePos.y()) >= minDragDiff;
- if (hasMinDragDiff && startDragging()) {
- m_dragging = true;
+ if (hasMinDragDiff) {
+ startDragging();
}
}
} else {
const bool shiftOrControlPressed = event->modifiers() & Qt::ShiftModifier ||
event->modifiers() & Qt::ControlModifier;
- bool clearSelection = !shiftOrControlPressed && !m_dragging && event->button() != Qt::RightButton;
+ bool clearSelection = !shiftOrControlPressed && event->button() != Qt::RightButton;
KItemListRubberBand* rubberBand = m_view->rubberBand();
if (rubberBand->isActive()) {
m_selectionManager->clearSelection();
}
- m_dragging = false;
m_pressedMousePos = QPointF();
m_pressedIndex = -1;
return false;
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);
+ Q_UNUSED(transform)
+ if (!m_view) {
+ return false;
+ }
- m_dragging = false;
- 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)
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());
}
}
}
}
-bool KItemListController::startDragging()
+void KItemListController::startDragging()
{
if (!m_view || !m_model) {
- return false;
+ return;
}
const QSet<int> selectedItems = m_selectionManager->selectedItems();
QMimeData* data = m_model->createMimeData(selectedItems);
if (!data) {
- return false;
+ return;
}
// The created drag object will be owned and deleted
drag->setPixmap(pixmap);
drag->exec(Qt::MoveAction | Qt::CopyAction | Qt::LinkAction, Qt::IgnoreAction);
- return true;
+}
+
+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"