┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/kitemviews/kitemlistview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/kitemviews/kitemlistview.cpp')
-rw-r--r--src/kitemviews/kitemlistview.cpp38
1 files changed, 30 insertions, 8 deletions
diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp
index b780e3ff4..452567f05 100644
--- a/src/kitemviews/kitemlistview.cpp
+++ b/src/kitemviews/kitemlistview.cpp
@@ -117,6 +117,7 @@ KItemListView::KItemListView(QGraphicsWidget *parent)
m_animation = new KItemListViewAnimation(this);
connect(m_animation, &KItemListViewAnimation::finished, this, &KItemListView::slotAnimationFinished);
+ connect(m_animation, &KItemListViewAnimation::started, this, &KItemListView::slotAnimationStarted);
m_rubberBand = new KItemListRubberBand(this);
connect(m_rubberBand, &KItemListRubberBand::activationChanged, this, &KItemListView::slotRubberBandActivationChanged);
@@ -132,7 +133,7 @@ KItemListView::KItemListView(QGraphicsWidget *parent)
}
update();
});
- connect(m_tapAndHoldIndicator, &KItemListRubberBand::endPositionChanged, this, [this]() {
+ connect(m_tapAndHoldIndicator, &KItemListRubberBand::endPositionChanged, this, [this](const QPointF &, const QPointF &) {
if (m_tapAndHoldIndicator->isActive()) {
update();
}
@@ -758,8 +759,7 @@ void KItemListView::editRole(int index, const QByteArray &role)
if (!widget) {
return;
}
- if (m_editingRole || m_animation->isStarted(widget)) {
- Q_EMIT widget->roleEditingCanceled(index, role, QVariant());
+ if (widget->editedRole() == role) {
return;
}
@@ -771,7 +771,7 @@ void KItemListView::editRole(int index, const QByteArray &role)
connect(widget, &KItemListWidget::roleEditingCanceled, this, &KItemListView::slotRoleEditingCanceled);
connect(widget, &KItemListWidget::roleEditingFinished, this, &KItemListView::slotRoleEditingFinished);
- connect(this, &KItemListView::scrollOffsetChanged, widget, &KStandardItemListWidget::finishRoleEditing);
+ connect(this, &KItemListView::scrollOffsetChanged, widget, &KStandardItemListWidget::updateRoleEditorGeometry);
}
void KItemListView::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
@@ -1092,6 +1092,20 @@ bool KItemListView::event(QEvent *event)
return true;
break;
+ case QEvent::GraphicsSceneMousePress:
+ case QEvent::GraphicsSceneMouseDoubleClick:
+ case QEvent::GraphicsSceneContextMenu:
+ if (m_editingRole) {
+ for (KItemListWidget *widget : std::as_const(m_visibleItems)) {
+ auto *standardWidget = qobject_cast<KStandardItemListWidget *>(widget);
+ if (standardWidget && !standardWidget->isVisible() && !standardWidget->editedRole().isEmpty()) {
+ standardWidget->finishRoleEditing();
+ break;
+ }
+ }
+ }
+ [[fallthrough]];
+
default:
// Forward all other events to the controller and handle them there
if (!m_editingRole && m_controller && m_controller->processEvent(event, transform())) {
@@ -1577,6 +1591,13 @@ void KItemListView::slotSelectionChanged(const KItemSet &current, const KItemSet
#endif
}
+void KItemListView::slotAnimationStarted(QGraphicsWidget *widget, KItemListViewAnimation::AnimationType /* type */, const QVariant & /* endValue */)
+{
+ KStandardItemListWidget *listWidget = qobject_cast<KStandardItemListWidget *>(widget);
+ Q_ASSERT(widget);
+ listWidget->cancelRoleEditing();
+}
+
void KItemListView::slotAnimationFinished(QGraphicsWidget *widget, KItemListViewAnimation::AnimationType type)
{
KItemListWidget *itemListWidget = qobject_cast<KItemListWidget *>(widget);
@@ -1926,9 +1947,6 @@ void KItemListView::doLayout(LayoutAnimationHint hint, int changedIndex, int cha
if (animate) {
if (m_animation->isStarted(widget, KItemListViewAnimation::MovingAnimation)) {
- if (m_editingRole) {
- Q_EMIT widget->roleEditingCanceled(widget->index(), QByteArray(), QVariant());
- }
m_animation->start(widget, KItemListViewAnimation::MovingAnimation, newPos);
applyNewPos = false;
}
@@ -2022,6 +2040,10 @@ QList<int> KItemListView::recycleInvisibleItems(int firstVisibleIndex, int lastV
const bool invisible = (index < firstVisibleIndex) || (index > lastVisibleIndex);
if (invisible) {
+ if (!widget->editedRole().isEmpty()) {
+ widget->setVisible(false);
+ continue;
+ }
if (m_animation->isStarted(widget)) {
if (hint == NoAnimation) {
// Stopping the animation will call KItemListView::slotAnimationFinished()
@@ -2804,7 +2826,7 @@ bool KItemListView::hasSiblingSuccessor(int index) const
void KItemListView::disconnectRoleEditingSignals(int index)
{
- KStandardItemListWidget *widget = qobject_cast<KStandardItemListWidget *>(m_visibleItems.value(index));
+ KItemListWidget *widget = m_visibleItems.value(index);
if (!widget) {
return;
}