Skip to content

Commit 6ef3c08

Browse files
committed
Merge branch 'flagsgamefiles' into 'master'
Make the horrifying content model flags() game search less horrifying (#8478) See merge request OpenMW/openmw!4688
2 parents b7a48e1 + 2c6d11f commit 6ef3c08

File tree

3 files changed

+20
-30
lines changed

3 files changed

+20
-30
lines changed

components/contentselector/model/contentmodel.cpp

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -116,37 +116,26 @@ Qt::ItemFlags ContentSelectorModel::ContentModel::flags(const QModelIndex& index
116116
if (file == mGameFile)
117117
return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable;
118118

119-
Qt::ItemFlags returnFlags;
120-
121-
// addon can be checked if its gamefile is
122-
// ... special case, addon with no dependency can be used with any gamefile.
123-
bool gamefileChecked = false;
124-
bool noGameFiles = true;
125-
for (const QString& fileName : file->gameFiles())
119+
// files with no dependencies can always be checked
120+
if (file->gameFiles().empty())
121+
return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsDragEnabled;
122+
123+
// Show the file if the game it is for is enabled.
124+
// NB: The file may theoretically depend on multiple games.
125+
// Early exit means that a file is visible only if its earliest found game dependency is enabled.
126+
// This can be counterintuitive, but it is okay for non-bizarre content setups. And also faster.
127+
for (const EsmFile* depFile : mFiles)
126128
{
127-
for (QListIterator<EsmFile*> dependencyIter(mFiles); dependencyIter.hasNext(); dependencyIter.next())
129+
if (depFile->isGameFile() && file->gameFiles().contains(depFile->fileName(), Qt::CaseInsensitive))
128130
{
129-
// compare filenames only. Multiple instances
130-
// of the filename (with different paths) is not relevant here.
131-
EsmFile* depFile = dependencyIter.peekNext();
132-
if (!depFile->isGameFile() || depFile->fileName().compare(fileName, Qt::CaseInsensitive) != 0)
133-
continue;
134-
135-
noGameFiles = false;
136-
if (depFile->builtIn() || depFile->fromAnotherConfigFile() || mCheckedFiles.contains(depFile))
137-
{
138-
gamefileChecked = true;
131+
if (!depFile->builtIn() && !depFile->fromAnotherConfigFile() && !mCheckedFiles.contains(depFile))
139132
break;
140-
}
141-
}
142-
}
143133

144-
if (gamefileChecked || noGameFiles)
145-
{
146-
returnFlags = Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsDragEnabled;
134+
return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsDragEnabled;
135+
}
147136
}
148137

149-
return returnFlags;
138+
return Qt::NoItemFlags;
150139
}
151140

152141
QVariant ContentSelectorModel::ContentModel::data(const QModelIndex& index, int role) const

components/contentselector/model/esmfile.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22

33
ContentSelectorModel::EsmFile::EsmFile(const QString& fileName, ModelItem* parent)
44
: ModelItem(parent)
5-
, mFileName(fileName)
65
{
6+
setFileName(fileName);
77
}
88

99
void ContentSelectorModel::EsmFile::setFileName(const QString& fileName)
1010
{
1111
mFileName = fileName;
12+
mHasGameExtension = (mFileName.endsWith(QLatin1String(".esm"), Qt::CaseInsensitive)
13+
|| mFileName.endsWith(QLatin1String(".omwgame"), Qt::CaseInsensitive));
1214
}
1315

1416
void ContentSelectorModel::EsmFile::setAuthor(const QString& author)
@@ -53,9 +55,7 @@ void ContentSelectorModel::EsmFile::setFromAnotherConfigFile(bool fromAnotherCon
5355

5456
bool ContentSelectorModel::EsmFile::isGameFile() const
5557
{
56-
return (mGameFiles.size() == 0)
57-
&& (mFileName.endsWith(QLatin1String(".esm"), Qt::CaseInsensitive)
58-
|| mFileName.endsWith(QLatin1String(".omwgame"), Qt::CaseInsensitive));
58+
return mHasGameExtension && mGameFiles.empty();
5959
}
6060

6161
QVariant ContentSelectorModel::EsmFile::fileProperty(const FileProperty prop) const
@@ -108,7 +108,7 @@ void ContentSelectorModel::EsmFile::setFileProperty(const FileProperty prop, con
108108
switch (prop)
109109
{
110110
case FileProperty_FileName:
111-
mFileName = value;
111+
setFileName(value);
112112
break;
113113

114114
case FileProperty_Author:

components/contentselector/model/esmfile.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ namespace ContentSelectorModel
102102
QString mToolTip;
103103
bool mBuiltIn = false;
104104
bool mFromAnotherConfigFile = false;
105+
bool mHasGameExtension = false;
105106
};
106107
}
107108

0 commit comments

Comments
 (0)