mirror of
https://invent.kde.org/system/dolphin
synced 2024-09-12 12:54:29 +00:00
Merge branch 'KDE/4.13'
This commit is contained in:
commit
eddb62ac0c
|
@ -481,6 +481,8 @@ void DolphinMainWindow::openNewTab(const KUrl& url)
|
|||
m_viewTab.append(viewTab);
|
||||
|
||||
actionCollection()->action("close_tab")->setEnabled(true);
|
||||
actionCollection()->action("activate_prev_tab")->setEnabled(true);
|
||||
actionCollection()->action("activate_next_tab")->setEnabled(true);
|
||||
|
||||
// Provide a split view, if the startup settings are set this way
|
||||
if (GeneralSettings::splitView()) {
|
||||
|
@ -1155,6 +1157,8 @@ void DolphinMainWindow::closeTab(int index)
|
|||
if (m_viewTab.count() == 1) {
|
||||
m_tabBar->removeTab(0);
|
||||
actionCollection()->action("close_tab")->setEnabled(false);
|
||||
actionCollection()->action("activate_prev_tab")->setEnabled(false);
|
||||
actionCollection()->action("activate_next_tab")->setEnabled(false);
|
||||
} else {
|
||||
m_tabBar->blockSignals(false);
|
||||
}
|
||||
|
@ -1634,11 +1638,13 @@ void DolphinMainWindow::setupActions()
|
|||
|
||||
KAction* activateNextTab = actionCollection()->addAction("activate_next_tab");
|
||||
activateNextTab->setText(i18nc("@action:inmenu", "Activate Next Tab"));
|
||||
activateNextTab->setEnabled(false);
|
||||
connect(activateNextTab, SIGNAL(triggered()), SLOT(activateNextTab()));
|
||||
activateNextTab->setShortcuts(QApplication::isRightToLeft() ? prevTabKeys : nextTabKeys);
|
||||
|
||||
KAction* activatePrevTab = actionCollection()->addAction("activate_prev_tab");
|
||||
activatePrevTab->setText(i18nc("@action:inmenu", "Activate Previous Tab"));
|
||||
activatePrevTab->setEnabled(false);
|
||||
connect(activatePrevTab, SIGNAL(triggered()), SLOT(activatePrevTab()));
|
||||
activatePrevTab->setShortcuts(QApplication::isRightToLeft() ? nextTabKeys : prevTabKeys);
|
||||
|
||||
|
|
|
@ -216,7 +216,7 @@ void KFileItemModel::setShowHiddenFiles(bool show)
|
|||
m_dirLister->setShowingDotFiles(show);
|
||||
m_dirLister->emitChanges();
|
||||
if (show) {
|
||||
slotCompleted();
|
||||
dispatchPendingItemsToInsert();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -331,6 +331,11 @@ void KItemListSelectionManager::itemsMoved(const KItemRange& itemRange, const QL
|
|||
// Store the current selection (needed in the selectionChanged() signal)
|
||||
const KItemSet previousSelection = selectedItems();
|
||||
|
||||
// endAnchoredSelection() adds all items between m_currentItem and
|
||||
// m_anchorItem to m_selectedItems. They can then be moved
|
||||
// individually later in this function.
|
||||
endAnchoredSelection();
|
||||
|
||||
// Update the current item
|
||||
if (m_currentItem >= itemRange.index && m_currentItem < itemRange.index + itemRange.count) {
|
||||
const int previousCurrentItem = m_currentItem;
|
||||
|
@ -342,10 +347,8 @@ void KItemListSelectionManager::itemsMoved(const KItemRange& itemRange, const QL
|
|||
emit currentChanged(newCurrentItem, previousCurrentItem);
|
||||
}
|
||||
|
||||
// Update the anchor item
|
||||
if (m_anchorItem >= itemRange.index && m_anchorItem < itemRange.index + itemRange.count) {
|
||||
m_anchorItem = movedToIndexes.at(m_anchorItem - itemRange.index);
|
||||
}
|
||||
// Start a new anchored selection.
|
||||
beginAnchoredSelection(m_currentItem);
|
||||
|
||||
// Update the selections
|
||||
if (!m_selectedItems.isEmpty()) {
|
||||
|
|
|
@ -658,6 +658,12 @@ void KStandardItemListWidget::dataChanged(const QHash<QByteArray, QVariant>& cur
|
|||
dirtyRoles = roles;
|
||||
}
|
||||
|
||||
// The URL might have changed (i.e., if the sort order of the items has
|
||||
// been changed). Therefore, the "is cut" state must be updated.
|
||||
KFileItemClipboard* clipboard = KFileItemClipboard::instance();
|
||||
const KUrl itemUrl = data().value("url").value<KUrl>();
|
||||
m_isCut = clipboard->isCut(itemUrl);
|
||||
|
||||
// The icon-state might depend from other roles and hence is
|
||||
// marked as dirty whenever a role has been changed
|
||||
dirtyRoles.insert("iconPixmap");
|
||||
|
|
|
@ -60,14 +60,23 @@ KDirectoryContentsCounter::~KDirectoryContentsCounter()
|
|||
{
|
||||
--m_workersCount;
|
||||
|
||||
if (m_workersCount == 0) {
|
||||
if (m_workersCount > 0) {
|
||||
// The worker thread will continue running. It could even be running
|
||||
// a method of m_worker at the moment, so we delete it using
|
||||
// deleteLater() to prevent a crash.
|
||||
m_worker->deleteLater();
|
||||
} else {
|
||||
// There are no remaining workers -> stop the worker thread.
|
||||
m_workerThread->quit();
|
||||
m_workerThread->wait();
|
||||
delete m_workerThread;
|
||||
m_workerThread = 0;
|
||||
}
|
||||
|
||||
delete m_worker;
|
||||
// The worker thread has finished running now, so it's safe to delete
|
||||
// m_worker. deleteLater() would not work at all because the event loop
|
||||
// which would deliver the event to m_worker is not running any more.
|
||||
delete m_worker;
|
||||
}
|
||||
}
|
||||
|
||||
void KDirectoryContentsCounter::addDirectory(const QString& path)
|
||||
|
|
|
@ -283,8 +283,9 @@ void PlacesPanel::slotItemContextMenuRequested(int index, const QPointF& pos)
|
|||
} else if (action == hideAction) {
|
||||
item->setHidden(hideAction->isChecked());
|
||||
} else if (action == openInNewTabAction) {
|
||||
const KUrl url = m_model->item(index)->dataValue("url").value<KUrl>();
|
||||
emit placeMiddleClicked(url);
|
||||
// TriggerItem does set up the storage first and then it will
|
||||
// emit the slotItemMiddleClicked signal, because of Qt::MiddleButton.
|
||||
triggerItem(index, Qt::MiddleButton);
|
||||
} else if (action == teardownAction) {
|
||||
m_model->requestTeardown(index);
|
||||
} else if (action == ejectAction) {
|
||||
|
|
|
@ -78,6 +78,7 @@ private slots:
|
|||
void testChangeSelection();
|
||||
void testDeleteCurrentItem_data();
|
||||
void testDeleteCurrentItem();
|
||||
void testAnchoredSelectionAfterMovingItems();
|
||||
|
||||
private:
|
||||
void verifySelectionChange(QSignalSpy& spy, const KItemSet& currentSelection, const KItemSet& previousSelection) const;
|
||||
|
@ -413,6 +414,15 @@ void KItemListSelectionManagerTest::testChangeSelection_data()
|
|||
<< QVariant::fromValue(QList<int>() << 4 << 5 << 2 << 3))
|
||||
<< (KItemSet() << 0 << 1 << 4 << 5);
|
||||
|
||||
QTest::newRow("Move items with active anchored selection")
|
||||
<< KItemSet()
|
||||
<< 0 << 3
|
||||
<< (KItemSet() << 0 << 1 << 2 << 3)
|
||||
<< MoveItems
|
||||
<< (QList<QVariant>() << QVariant::fromValue(KItemRange(2, 4))
|
||||
<< QVariant::fromValue(QList<int>() << 4 << 5 << 2 << 3))
|
||||
<< (KItemSet() << 0 << 1 << 4 << 5);
|
||||
|
||||
// Revert sort order
|
||||
QTest::newRow("Revert sort order")
|
||||
<< (KItemSet() << 0 << 1)
|
||||
|
@ -519,6 +529,22 @@ void KItemListSelectionManagerTest::testDeleteCurrentItem()
|
|||
QCOMPARE(m_selectionManager->currentItem(), newCurrentItemIndex);
|
||||
}
|
||||
|
||||
void KItemListSelectionManagerTest::testAnchoredSelectionAfterMovingItems()
|
||||
{
|
||||
m_selectionManager->setCurrentItem(4);
|
||||
m_selectionManager->beginAnchoredSelection(4);
|
||||
|
||||
// Reverse the items between 0 and 5.
|
||||
m_selectionManager->itemsMoved(KItemRange(0, 6), QList<int>() << 5 << 4 << 3 << 2 << 1 << 0);
|
||||
|
||||
QCOMPARE(m_selectionManager->currentItem(), 1);
|
||||
QCOMPARE(m_selectionManager->m_anchorItem, 1);
|
||||
|
||||
// Make 2 the current item -> 1 and 2 should be selected.
|
||||
m_selectionManager->setCurrentItem(2);
|
||||
QCOMPARE(m_selectionManager->selectedItems(), KItemSet() << 1 << 2);
|
||||
}
|
||||
|
||||
void KItemListSelectionManagerTest::verifySelectionChange(QSignalSpy& spy,
|
||||
const KItemSet& currentSelection,
|
||||
const KItemSet& previousSelection) const
|
||||
|
|
|
@ -64,9 +64,9 @@ void UpdateItemStatesThread::run()
|
|||
items[i].version = static_cast<KVersionControlPlugin2::ItemVersion>(state);
|
||||
}
|
||||
}
|
||||
|
||||
m_plugin->endRetrieval();
|
||||
}
|
||||
|
||||
m_plugin->endRetrieval();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue