From 71a2be8d4ccb278aca5a2a7fa4483be72e293e5f Mon Sep 17 00:00:00 2001 From: l10n daemon script Date: Fri, 27 Sep 2013 07:07:49 +0000 Subject: SVN_SILENT made messages (.desktop file) --- src/views/versioncontrol/fileviewversioncontrolplugin.desktop | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/views/versioncontrol/fileviewversioncontrolplugin.desktop b/src/views/versioncontrol/fileviewversioncontrolplugin.desktop index 22fb7cc02..802927202 100644 --- a/src/views/versioncontrol/fileviewversioncontrolplugin.desktop +++ b/src/views/versioncontrol/fileviewversioncontrolplugin.desktop @@ -31,7 +31,7 @@ Comment[id]=Plugin Kontrol Versi untuk Tampilan Berkas Comment[is]=Útgáfustýringar-íforrit fyrir skráasýnir Comment[it]=Estensione di controllo delle versioni per le viste dei file Comment[ja]=ファイルビューのためのバージョン管理プラグイン -Comment[kk]=Файл көрнісіне арналған Нұсқаларды басқару плагины +Comment[kk]=Файл көрнісіне арналған Нұсқаларды басқару плагині Comment[km]=កំណែ​កម្មវិធី​ជំនួយ​វត្ថុ​បញ្ជា​​សម្រាប់​មើល​ឯកសារ Comment[kn]=ಕಡತ ನೋಟಗಳಿಗಾಗಿ ಆವೃತ್ತಿ ನಿಯಂತ್ರಣಾ ವ್ಯವಸ್ಥೆ ಪ್ಲಗ್ಗಿನ್ (ಮಿಳಿತಾನ್ವಯ) Comment[ko]=파일 보기를 위한 버전 관리 플러그인 -- cgit v1.3 From 08710b05c7c4c5930523ad3e3b4550687c167d4a Mon Sep 17 00:00:00 2001 From: Frank Reininghaus Date: Sun, 29 Sep 2013 15:45:02 +0200 Subject: Make sure that removeExpandedItems() also removes filtered items This fixes the problem that filtered child items in Details View may reappear when switching the view mode and the clearing the filter. BUG: 325344 REVIEW: 112962 FIXED-IN: 4.11.3 --- src/kitemviews/kfileitemmodel.cpp | 13 +++++++++++ src/tests/kfileitemmodeltest.cpp | 46 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) (limited to 'src') diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index b6b6ee0e2..7b7c39ad7 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -1197,6 +1197,19 @@ void KFileItemModel::removeExpandedItems() removeItems(expandedItems, DeleteItemData); m_expandedDirs.clear(); + + // Also remove all filtered items which have a parent. + QHash::iterator it = m_filteredItems.begin(); + const QHash::iterator end = m_filteredItems.end(); + + while (it != end) { + if (it.value()->parent) { + delete it.value(); + it = m_filteredItems.erase(it); + } else { + ++it; + } + } } void KFileItemModel::emitItemsChangedAndTriggerResorting(const KItemRangeList& itemRanges, const QSet& changedRoles) diff --git a/src/tests/kfileitemmodeltest.cpp b/src/tests/kfileitemmodeltest.cpp index 391fe5be5..d2a3ebda8 100644 --- a/src/tests/kfileitemmodeltest.cpp +++ b/src/tests/kfileitemmodeltest.cpp @@ -76,6 +76,7 @@ private slots: void testExpandItems(); void testExpandParentItems(); void testMakeExpandedItemHidden(); + void testRemoveFilteredExpandedItems(); void testSorting(); void testIndexForKeyboardSearch(); void testNameFilter(); @@ -707,6 +708,51 @@ void KFileItemModelTest::testMakeExpandedItemHidden() } +void KFileItemModelTest::testRemoveFilteredExpandedItems() +{ + QSet originalModelRoles = m_model->roles(); + QSet modelRoles = originalModelRoles; + modelRoles << "isExpanded" << "isExpandable" << "expandedParentsCount"; + m_model->setRoles(modelRoles); + + QStringList files; + files << "folder/child" << "file"; // missing folders are created automatically + m_testDir->createFiles(files); + + m_model->loadDirectory(m_testDir->url()); + QVERIFY(QTest::kWaitForSignal(m_model, SIGNAL(itemsInserted(KItemRangeList)), DefaultTimeout)); + + // So far, the model contains only "folder/" and "file". + QCOMPARE(m_model->count(), 2); + QVERIFY(m_model->isExpandable(0)); + QVERIFY(!m_model->isExpandable(1)); + QVERIFY(!m_model->isExpanded(0)); + QVERIFY(!m_model->isExpanded(1)); + QCOMPARE(itemsInModel(), QStringList() << "folder" << "file"); + + // Expand "folder" -> "folder/child" becomes visible. + m_model->setExpanded(0, true); + QVERIFY(m_model->isExpanded(0)); + QVERIFY(QTest::kWaitForSignal(m_model, SIGNAL(itemsInserted(KItemRangeList)), DefaultTimeout)); + QCOMPARE(itemsInModel(), QStringList() << "folder" << "child" << "file"); + + // Add a name filter. + m_model->setNameFilter("f"); + QCOMPARE(itemsInModel(), QStringList() << "folder" << "file"); + + m_model->setNameFilter("fo"); + QCOMPARE(itemsInModel(), QStringList() << "folder"); + + // Remove all expanded items by changing the roles + m_model->setRoles(originalModelRoles); + QVERIFY(!m_model->isExpanded(0)); + QCOMPARE(itemsInModel(), QStringList() << "folder"); + + // Remove the name filter and verify that "folder/child" does not reappear. + m_model->setNameFilter(QString()); + QCOMPARE(itemsInModel(), QStringList() << "folder" << "file"); +} + void KFileItemModelTest::testSorting() { // Create some files with different sizes and modification times to check the different sorting options -- cgit v1.3 From c44b9e685e55c419be2d139744233d232da82898 Mon Sep 17 00:00:00 2001 From: Emmanuel Pescosta Date: Sun, 29 Sep 2013 18:08:06 +0200 Subject: Show the right version states for expanded items. BUG: 267171 FIXED-IN: 4.11.3 REVIEW: 112980 --- .../versioncontrol/updateitemstatesthread.cpp | 36 +++++++------ src/views/versioncontrol/updateitemstatesthread.h | 6 +-- .../versioncontrol/versioncontrolobserver.cpp | 63 ++++++++++++++++------ src/views/versioncontrol/versioncontrolobserver.h | 16 ++++++ 4 files changed, 85 insertions(+), 36 deletions(-) (limited to 'src') diff --git a/src/views/versioncontrol/updateitemstatesthread.cpp b/src/views/versioncontrol/updateitemstatesthread.cpp index fa005f8f1..6be07d361 100644 --- a/src/views/versioncontrol/updateitemstatesthread.cpp +++ b/src/views/versioncontrol/updateitemstatesthread.cpp @@ -24,7 +24,7 @@ #include UpdateItemStatesThread::UpdateItemStatesThread(KVersionControlPlugin* plugin, - const QList& itemStates) : + const QMap >& itemStates) : QThread(), m_globalPluginMutex(0), m_plugin(plugin), @@ -47,27 +47,29 @@ void UpdateItemStatesThread::run() Q_ASSERT(!m_itemStates.isEmpty()); Q_ASSERT(m_plugin); - const QString directory = m_itemStates.first().item.url().directory(KUrl::AppendTrailingSlash); m_retrievedItems = false; QMutexLocker pluginLocker(m_globalPluginMutex); - if (m_plugin->beginRetrieval(directory)) { - const int count = m_itemStates.count(); + foreach (const QString& directory, m_itemStates.keys()) { + if (m_plugin->beginRetrieval(directory)) { + QVector& items = m_itemStates[directory]; + const int count = items.count(); - KVersionControlPlugin2* pluginV2 = qobject_cast(m_plugin); - if (pluginV2) { - for (int i = 0; i < count; ++i) { - m_itemStates[i].version = pluginV2->itemVersion(m_itemStates[i].item); + KVersionControlPlugin2* pluginV2 = qobject_cast(m_plugin); + if (pluginV2) { + for (int i = 0; i < count; ++i) { + items[i].version = pluginV2->itemVersion(items[i].item); + } + } else { + for (int i = 0; i < count; ++i) { + const KVersionControlPlugin::VersionState state = m_plugin->versionState(items[i].item); + items[i].version = static_cast(state); + } } - } else { - for (int i = 0; i < count; ++i) { - const KVersionControlPlugin::VersionState state = m_plugin->versionState(m_itemStates[i].item); - m_itemStates[i].version = static_cast(state); - } - } - m_plugin->endRetrieval(); - m_retrievedItems = true; + m_plugin->endRetrieval(); + m_retrievedItems = true; + } } } @@ -81,7 +83,7 @@ void UpdateItemStatesThread::unlockPlugin() m_globalPluginMutex->unlock(); } -QList UpdateItemStatesThread::itemStates() const +QMap > UpdateItemStatesThread::itemStates() const { return m_itemStates; } diff --git a/src/views/versioncontrol/updateitemstatesthread.h b/src/views/versioncontrol/updateitemstatesthread.h index a28169755..2914bc2b7 100644 --- a/src/views/versioncontrol/updateitemstatesthread.h +++ b/src/views/versioncontrol/updateitemstatesthread.h @@ -47,7 +47,7 @@ public: * @param itemStates List of items, where the states get updated. */ UpdateItemStatesThread(KVersionControlPlugin* plugin, - const QList& itemStates); + const QMap >& itemStates); virtual ~UpdateItemStatesThread(); /** @@ -63,7 +63,7 @@ public: */ void unlockPlugin(); - QList itemStates() const; + QMap > itemStates() const; bool retrievedItems() const; @@ -75,7 +75,7 @@ private: KVersionControlPlugin* m_plugin; bool m_retrievedItems; - QList m_itemStates; + QMap > m_itemStates; }; #endif // UPDATEITEMSTATESTHREAD_H diff --git a/src/views/versioncontrol/versioncontrolobserver.cpp b/src/views/versioncontrol/versioncontrolobserver.cpp index 402a2de54..4d939ee0d 100644 --- a/src/views/versioncontrol/versioncontrolobserver.cpp +++ b/src/views/versioncontrol/versioncontrolobserver.cpp @@ -204,11 +204,15 @@ void VersionControlObserver::slotThreadFinished() return; } - const QList itemStates = thread->itemStates(); - foreach (const ItemState& itemState, itemStates) { - QHash values; - values.insert("version", QVariant(itemState.version)); - m_model->setData(itemState.index, values); + const QMap >& itemStates = thread->itemStates(); + foreach (const QString& directory, itemStates.keys()) { + const QVector& items = itemStates.value(directory); + + foreach (const ItemState& item, items) { + QHash values; + values.insert("version", QVariant(item.version)); + m_model->setData(item.index, values); + } } if (!m_silentUpdate) { @@ -233,18 +237,9 @@ void VersionControlObserver::updateItemStates() m_pendingItemStatesUpdate = true; return; } - QList itemStates; - const int itemCount = m_model->count(); - itemStates.reserve(itemCount); - for (int i = 0; i < itemCount; ++i) { - ItemState itemState; - itemState.index = i; - itemState.item = m_model->fileItem(i); - itemState.version = KVersionControlPlugin2::UnversionedVersion; - - itemStates.append(itemState); - } + QMap > itemStates; + createItemStatesList(itemStates); if (!itemStates.isEmpty()) { if (!m_silentUpdate) { @@ -260,6 +255,42 @@ void VersionControlObserver::updateItemStates() } } +int VersionControlObserver::createItemStatesList(QMap >& itemStates, + const int firstIndex) +{ + const int itemCount = m_model->count(); + const int currentExpansionLevel = m_model->expandedParentsCount(firstIndex); + + QVector items; + items.reserve(itemCount - firstIndex); + + int index; + for (index = firstIndex; index < itemCount; ++index) { + const int expansionLevel = m_model->expandedParentsCount(index); + + if (expansionLevel == currentExpansionLevel) { + ItemState itemState; + itemState.index = index; + itemState.item = m_model->fileItem(index); + itemState.version = KVersionControlPlugin2::UnversionedVersion; + + items.append(itemState); + } else if (expansionLevel > currentExpansionLevel) { + // Sub folder + index += createItemStatesList(itemStates, index) - 1; + } else { + break; + } + } + + if (items.count() > 0) { + const KUrl& url = items.first().item.url(); + itemStates.insert(url.directory(KUrl::AppendTrailingSlash), items); + } + + return index - firstIndex; // number of processed items +} + KVersionControlPlugin* VersionControlObserver::searchPlugin(const KUrl& directory) const { static bool pluginsAvailable = true; diff --git a/src/views/versioncontrol/versioncontrolobserver.h b/src/views/versioncontrol/versioncontrolobserver.h index 501af7d6f..980374af9 100644 --- a/src/views/versioncontrol/versioncontrolobserver.h +++ b/src/views/versioncontrol/versioncontrolobserver.h @@ -109,6 +109,22 @@ private: void updateItemStates(); + /** + * It creates a item state list for every expanded directory and stores + * this list together with the directory url in the \a itemStates map. + * + * @itemStates A map of item state lists for every expanded directory + * and its items, where the "key" is the directory url and + * the "value" is a list of ItemStates for every item + * within this directory. + * @firstIndex The index to start the processing from, this is needed + * because this function is recursively called. + * + * @return The number of (recursive) processed items. + */ + int createItemStatesList(QMap >& itemStates, + const int firstIndex = 0); + /** * Returns a matching plugin for the given directory. * 0 is returned, if no matching plugin has been found. -- cgit v1.3 From 4cb0a239e51749c6e6099fd056309f9a81b8a481 Mon Sep 17 00:00:00 2001 From: Frank Reininghaus Date: Tue, 1 Oct 2013 00:09:25 +0200 Subject: Add unit test for the calculation of "name" groups with expanded items This prevents a possible regression that would have happened with the first version of https://git.reviewboard.kde.org/r/112725/ The problem was that isChildItem(int index) would return "false" incorrectly when the QHash for that item was not initialized yet. The grouping code would then try to read the "text" from the empty QHash, which yielded an empty QString, and then accessing the first character of that string caused a crash. --- src/tests/kfileitemmodeltest.cpp | 42 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/tests/kfileitemmodeltest.cpp b/src/tests/kfileitemmodeltest.cpp index d2a3ebda8..5dd3417fc 100644 --- a/src/tests/kfileitemmodeltest.cpp +++ b/src/tests/kfileitemmodeltest.cpp @@ -87,6 +87,7 @@ private slots: void removeParentOfHiddenItems(); void testGeneralParentChildRelationships(); void testNameRoleGroups(); + void testNameRoleGroupsWithExpandedItems(); private: QStringList itemsInModel() const; @@ -1324,11 +1325,50 @@ void KFileItemModelTest::testNameRoleGroups() QCOMPARE(m_model->groups(), expectedGroups); } +void KFileItemModelTest::testNameRoleGroupsWithExpandedItems() +{ + QSet modelRoles = m_model->roles(); + modelRoles << "isExpanded" << "isExpandable" << "expandedParentsCount"; + m_model->setRoles(modelRoles); + + QStringList files; + files << "a/b.txt" << "a/c.txt" << "d/e.txt" << "d/f.txt"; + + m_testDir->createFiles(files); + + m_model->setGroupedSorting(true); + m_model->loadDirectory(m_testDir->url()); + QVERIFY(QTest::kWaitForSignal(m_model, SIGNAL(itemsInserted(KItemRangeList)), DefaultTimeout)); + QCOMPARE(itemsInModel(), QStringList() << "a" << "d"); + + QList > expectedGroups; + expectedGroups << QPair(0, QLatin1String("A")); + expectedGroups << QPair(1, QLatin1String("D")); + QCOMPARE(m_model->groups(), expectedGroups); + + // Verify that expanding "a" and "d" will not change the groups (except for the index of "D"). + expectedGroups.clear(); + expectedGroups << QPair(0, QLatin1String("A")); + expectedGroups << QPair(3, QLatin1String("D")); + + m_model->setExpanded(0, true); + QVERIFY(m_model->isExpanded(0)); + QVERIFY(QTest::kWaitForSignal(m_model, SIGNAL(itemsInserted(KItemRangeList)), DefaultTimeout)); + QCOMPARE(itemsInModel(), QStringList() << "a" << "b.txt" << "c.txt" << "d"); + QCOMPARE(m_model->groups(), expectedGroups); + + m_model->setExpanded(3, true); + QVERIFY(m_model->isExpanded(3)); + QVERIFY(QTest::kWaitForSignal(m_model, SIGNAL(itemsInserted(KItemRangeList)), DefaultTimeout)); + QCOMPARE(itemsInModel(), QStringList() << "a" << "b.txt" << "c.txt" << "d" << "e.txt" << "f.txt"); + QCOMPARE(m_model->groups(), expectedGroups); +} + QStringList KFileItemModelTest::itemsInModel() const { QStringList items; for (int i = 0; i < m_model->count(); i++) { - items << m_model->data(i).value("text").toString(); + items << m_model->fileItem(i).text(); } return items; } -- cgit v1.3