diff --git a/containments/desktop/package/contents/ui/FolderView.qml b/containments/desktop/package/contents/ui/FolderView.qml --- a/containments/desktop/package/contents/ui/FolderView.qml +++ b/containments/desktop/package/contents/ui/FolderView.qml @@ -40,6 +40,7 @@ property alias isRootView: gridView.isRootView property alias currentIndex: gridView.currentIndex property alias url: dir.url + property alias status: dir.status property alias positions: positioner.positions property alias errorString: dir.errorString property alias dragging: dir.dragging diff --git a/containments/desktop/package/contents/ui/main.qml b/containments/desktop/package/contents/ui/main.qml --- a/containments/desktop/package/contents/ui/main.qml +++ b/containments/desktop/package/contents/ui/main.qml @@ -29,6 +29,7 @@ import org.kde.kquickcontrolsaddons 2.0 as KQuickControlsAddons import org.kde.private.desktopcontainment.desktop 0.1 as Desktop +import org.kde.private.desktopcontainment.folder 0.1 as Folder import "LayoutManager.js" as LayoutManager import "FolderTools.js" as FolderTools @@ -250,6 +251,11 @@ event.ignore(); } + // Don't allow any drops while listing. + if (isFolder && folderViewLayer.view.status === Folder.FolderModel.Listing) { + event.ignore(); + } + // Firefox tabs are regular drags. Since all of our drop handling is asynchronous // we would accept this drop and have Firefox not spawn a new window. (Bug 337711) if (event.mimeData.formats.indexOf("application/x-moz-tabbrowser-tab") > -1) { diff --git a/containments/desktop/plugins/folder/positioner.h b/containments/desktop/plugins/folder/positioner.h --- a/containments/desktop/plugins/folder/positioner.h +++ b/containments/desktop/plugins/folder/positioner.h @@ -93,6 +93,7 @@ private Q_SLOTS: void updatePositions(); + void sourceStatusChanged(); void sourceDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles); void sourceModelAboutToBeReset(); @@ -132,7 +133,7 @@ bool m_ignoreNextTransaction; QStringList m_positions; - bool m_pendingPositions; + bool m_deferApplyPositions; QTimer *m_updatePositionsTimer; QHash m_proxyToSource; diff --git a/containments/desktop/plugins/folder/positioner.cpp b/containments/desktop/plugins/folder/positioner.cpp --- a/containments/desktop/plugins/folder/positioner.cpp +++ b/containments/desktop/plugins/folder/positioner.cpp @@ -29,9 +29,8 @@ , m_enabled(false) , m_folderModel(nullptr) , m_perStripe(0) -, m_lastRow(-1) , m_ignoreNextTransaction(false) -, m_pendingPositions(false) +, m_deferApplyPositions(false) , m_updatePositionsTimer(new QTimer(this)) { m_updatePositionsTimer->setSingleShot(true); @@ -84,7 +83,6 @@ } m_folderModel = qobject_cast(folderModel); - connect(m_folderModel, SIGNAL(urlChanged()), this, SLOT(reset()), Qt::UniqueConnection); if (m_folderModel) { connectSignals(m_folderModel); @@ -130,10 +128,11 @@ emit positionsChanged(); - if (!m_proxyToSource.isEmpty()) { + // Defer applying positions until listing completes. + if (m_folderModel->status() == FolderModel::Listing) { + m_deferApplyPositions = true; + } else { applyPositions(); - } else if (m_positions.size() >= 5) { - m_pendingPositions = true; } } } @@ -359,6 +358,11 @@ } void Positioner::move(const QVariantList &moves) { + // Don't allow moves while listing. + if (m_folderModel->status() == FolderModel::Listing) { + return; + } + QVector fromIndices; QVector toIndices; QVector sourceRows; @@ -476,6 +480,13 @@ } } +void Positioner::sourceStatusChanged() +{ + if (m_deferApplyPositions && m_folderModel->status() != FolderModel::Listing) { + applyPositions(); + } +} + void Positioner::sourceDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector& roles) { @@ -512,13 +523,15 @@ void Positioner::sourceRowsAboutToBeInserted(const QModelIndex &parent, int start, int end) { if (m_enabled) { - if (m_proxyToSource.isEmpty()) { - if (!m_pendingPositions) { - beginInsertRows(parent, start, end); - m_beginInsertRowsCalled = true; + // Don't insert yet if we're waiting for listing to complete to apply + // initial positions; + if (m_deferApplyPositions) { + return; + } else if (m_proxyToSource.isEmpty()) { + beginInsertRows(parent, start, end); + m_beginInsertRowsCalled = true; - initMaps(end + 1); - } + initMaps(end + 1); return; } @@ -608,7 +621,6 @@ m_proxyToSource = newProxyToSource; m_sourceToProxy = newSourceToProxy; - m_lastRow = -1; int newLast = lastRow(); if (oldLast > newLast) { @@ -637,21 +649,21 @@ Q_UNUSED(last) if (!m_ignoreNextTransaction) { - if (!m_pendingPositions) { - if (m_beginInsertRowsCalled) { - endInsertRows(); - m_beginInsertRowsCalled = false; - } - } else { - applyPositions(); + if (m_beginInsertRowsCalled) { + endInsertRows(); + m_beginInsertRowsCalled = false; } } else { m_ignoreNextTransaction = false; } flushPendingChanges(); - m_updatePositionsTimer->start(); + // Don't generate new positions data if we're waiting for listing to + // complete to apply initial positions. + if (!m_deferApplyPositions) { + m_updatePositionsTimer->start(); + } } void Positioner::sourceRowsMoved(const QModelIndex &sourceParent, int sourceStart, @@ -717,7 +729,6 @@ { m_proxyToSource.insert(proxyIndex, sourceIndex); m_sourceToProxy.insert(sourceIndex, proxyIndex); - m_lastRow = -1; } int Positioner::firstRow() const @@ -735,13 +746,9 @@ int Positioner::lastRow() const { if (!m_proxyToSource.isEmpty()) { - if (m_lastRow != -1) { - return m_lastRow; - } else { - QList keys(m_proxyToSource.keys()); - qSort(keys); - return keys.last(); - } + QList keys(m_proxyToSource.keys()); + qSort(keys); + return keys.last(); } return 0; @@ -764,7 +771,23 @@ void Positioner::applyPositions() { + // We were called while the source model is listing. Defer applying positions + // until listing completes. + if (m_folderModel->status() == FolderModel::Listing) { + m_deferApplyPositions = true; + + return; + } + + if (m_positions.size() < 5) { + // We were waiting for listing to complete before proxying source rows, + // but we don't have positions to apply. Reset to populate. + if (m_deferApplyPositions) { + m_deferApplyPositions = false; + reset(); + } + return; } @@ -864,7 +887,7 @@ endResetModel(); - m_pendingPositions = false; + m_deferApplyPositions = false; m_updatePositionsTimer->start(); } @@ -915,6 +938,12 @@ connect(model, &QAbstractItemModel::layoutChanged, this, &Positioner::sourceLayoutChanged, Qt::UniqueConnection); + connect(m_folderModel, &FolderModel::urlChanged, + this, &Positioner::reset, + Qt::UniqueConnection); + connect(m_folderModel, &FolderModel::statusChanged, + this, &Positioner::sourceStatusChanged, + Qt::UniqueConnection); } void Positioner::disconnectSignals(FolderModel* model) @@ -937,4 +966,8 @@ this, &Positioner::sourceRowsRemoved); disconnect(model, &QAbstractItemModel::layoutChanged, this, &Positioner::sourceLayoutChanged); + disconnect(m_folderModel, &FolderModel::urlChanged, + this, &Positioner::reset); + disconnect(m_folderModel, &FolderModel::statusChanged, + this, &Positioner::sourceStatusChanged); }