summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2020-02-05 21:55:52 -0500
committerisanae <14251494+isanae@users.noreply.github.com>2020-02-05 21:55:52 -0500
commit593ed64f860dcd5a5d9329233bafc9530f60cc6b (patch)
treecfbed1569fc08e931425838282943a7c02367686 /src
parentb7e51b65e832cfbd94789bc0cf3ab015a394aa92 (diff)
filter on filename column only because loading the meta for every file takes forever
some small optimizations when enabling mods
Diffstat (limited to 'src')
-rw-r--r--src/datatab.cpp1
-rw-r--r--src/shared/directoryentry.cpp26
-rw-r--r--src/shared/directoryentry.h2
3 files changed, 20 insertions, 9 deletions
diff --git a/src/datatab.cpp b/src/datatab.cpp
index 4c42339f..212d6754 100644
--- a/src/datatab.cpp
+++ b/src/datatab.cpp
@@ -28,6 +28,7 @@ DataTab::DataTab(
m_filter.setEdit(mwui->dataTabFilter);
m_filter.setList(mwui->dataTree);
m_filter.setUseSourceSort(true);
+ m_filter.setFilterColumn(FileTreeModel::FileName);
if (auto* m=m_filter.proxyModel()) {
m->setDynamicSortFilter(false);
diff --git a/src/shared/directoryentry.cpp b/src/shared/directoryentry.cpp
index 92b6c2bf..6e44cc91 100644
--- a/src/shared/directoryentry.cpp
+++ b/src/shared/directoryentry.cpp
@@ -512,9 +512,11 @@ bool FileRegister::indexValid(FileEntry::Index index) const
FileEntry::Ptr FileRegister::createFile(const std::wstring &name, DirectoryEntry *parent)
{
FileEntry::Index index = generateIndex();
- m_Files[index] = FileEntry::Ptr(new FileEntry(index, name, parent));
- return m_Files[index];
+ auto r = m_Files.insert_or_assign(
+ index, FileEntry::Ptr(new FileEntry(index, name, parent)));
+
+ return r.first->second;
}
FileEntry::Ptr FileRegister::getFile(FileEntry::Index index) const
@@ -1026,14 +1028,18 @@ FileEntry::Ptr DirectoryEntry::insert(
const std::wstring &fileName, FilesOrigin &origin, FILETIME fileTime,
const std::wstring &archive, int order)
{
- auto iter = m_Files.find(ToLowerCopy(fileName));
+ std::wstring fileNameLower = ToLowerCopy(fileName);
+
+ auto iter = m_Files.find(fileNameLower);
FileEntry::Ptr file;
if (iter != m_Files.end()) {
file = m_FileRegister->getFile(iter->second);
} else {
file = m_FileRegister->createFile(fileName, this);
- addFileToList(*file);
+ addFileToList(std::move(fileNameLower), file->getIndex());
+
+ // fileNameLower has moved from this point
}
file->addOrigin(origin.getID(), fileTime, archive, order);
@@ -1067,8 +1073,10 @@ void DirectoryEntry::addFiles(FilesOrigin &origin, wchar_t *buffer, int bufferOf
if ((wcscmp(findData.cFileName, L".") != 0) &&
(wcscmp(findData.cFileName, L"..") != 0)) {
int offset = _snwprintf(buffer + bufferOffset, MAXPATH_UNICODE, L"\\%ls", findData.cFileName);
+
// recurse into subdirectories
- getSubDirectory(findData.cFileName, true, origin.getID())->addFiles(origin, buffer, bufferOffset + offset);
+ DirectoryEntry* sd = getSubDirectory(findData.cFileName, true, origin.getID());
+ sd->addFiles(origin, buffer, bufferOffset + offset);
}
} else {
insert(findData.cFileName, origin, findData.ftLastWriteTime, L"", -1);
@@ -1245,10 +1253,12 @@ void DirectoryEntry::removeFilesFromList(const std::set<FileEntry::Index>& indic
}
}
-void DirectoryEntry::addFileToList(const FileEntry& f)
+void DirectoryEntry::addFileToList(
+ std::wstring fileNameLower, FileEntry::Index index)
{
- m_Files.emplace(ToLowerCopy(f.getName()), f.getIndex());
- m_FilesLookup.emplace(ToLowerCopy(f.getName()), f.getIndex());
+ m_FilesLookup.emplace(fileNameLower, index);
+ m_Files.emplace(std::move(fileNameLower), index);
+ // fileNameLower has been moved from this point
}
} // namespace MOShared
diff --git a/src/shared/directoryentry.h b/src/shared/directoryentry.h
index 7e45493d..e26011d7 100644
--- a/src/shared/directoryentry.h
+++ b/src/shared/directoryentry.h
@@ -522,7 +522,7 @@ private:
void addDirectoryToList(DirectoryEntry* e);
void removeDirectoryFromList(SubDirectories::iterator itor);
- void addFileToList(const FileEntry& f);
+ void addFileToList(std::wstring fileNameLower, FileEntry::Index index);
void removeFileFromList(FileEntry::Index index);
void removeFilesFromList(const std::set<FileEntry::Index>& indices);
};