Compare commits

...
15 Commits
31 changed files with 6292 additions and 130 deletions
+82
View File
@@ -0,0 +1,82 @@
[main]
host = https://www.transifex.com
[mod-organizer.organizer]
file_filter = organizer/organizer_<lang>.ts
source_file = organizer/organizer_en.ts
source_lang = en
[mod-organizer.diagnosebasic]
file_filter = plugins/diagnoseBasic/diagnoseBasic_<lang>.ts
source_file = plugins/diagnoseBasic/diagnoseBasic_en.ts
source_lang = en
[mod-organizer.bsaextractor]
file_filter = plugins/bsaExtractor/bsaExtractor_<lang>.ts
source_file = plugins/bsaExtractor/bsaExtractor_en.ts
source_lang = en
[mod-organizer.checkfnis]
file_filter = plugins/checkFNIS/checkFNIS_<lang>.ts
source_file = plugins/checkFNIS/checkFNIS_en.ts
source_lang = en
[mod-organizer.inieditor]
file_filter = plugins/iniEditor/iniEditor_<lang>.ts
source_file = plugins/iniEditor/iniEditor_en.ts
source_lang = en
[mod-organizer.installerbain]
file_filter = plugins/installerBAIN/installerBAIN_<lang>.ts
source_file = plugins/installerBAIN/installerBAIN_en.ts
source_lang = en
[mod-organizer.installerbundle]
file_filter = plugins/installerBundle/installerBundle_<lang>.ts
source_file = plugins/installerBundle/installerBundle_en.ts
source_lang = en
[mod-organizer.installerfomod]
file_filter = plugins/installerFomod/installerFomod_<lang>.ts
source_file = plugins/installerFomod/installerFomod_en.ts
source_lang = en
[mod-organizer.installermanual]
file_filter = plugins/installerManual/installerManual_<lang>.ts
source_file = plugins/installerManual/installerManual_en.ts
source_lang = en
[mod-organizer.installerncc]
file_filter = plugins/installerNCC/installerNCC_<lang>.ts
source_file = plugins/installerNCC/installerNCC_en.ts
source_lang = en
[mod-organizer.installerquick]
file_filter = plugins/installerQuick/installerQuick_<lang>.ts
source_file = plugins/installerQuick/installerQuick_en.ts
source_lang = en
[mod-organizer.nmmimport]
file_filter = plugins/NMMImport/NMMImport_<lang>.ts
source_file = plugins/NMMImport/NMMImport_en.ts
source_lang = en
[mod-organizer.previewbase]
file_filter = plugins/previewBase/previewBase_<lang>.ts
source_file = plugins/previewBase/previewBase_en.ts
source_lang = en
[mod-organizer.previewdds]
file_filter = plugins/previewDDS/previewDDS_<lang>.ts
source_file = plugins/previewDDS/previewDDS_en.ts
source_lang = en
[mod-organizer.proxypython]
file_filter = plugins/proxyPython/proxyPython_<lang>.ts
source_file = plugins/proxyPython/proxyPython_en.ts
source_lang = en
[mod-organizer.configurator]
file_filter = plugins/pyniEdit/pyniEdit_<lang>.ts
source_file = plugins/pyniEdit/pyniEdit_en.ts
source_lang = en
+3 -1
View File
@@ -237,8 +237,10 @@ FIND_PACKAGE(Qt5Declarative REQUIRED)
FIND_PACKAGE(Qt5Network REQUIRED)
FIND_PACKAGE(Qt5WinExtras REQUIRED)
FIND_PACKAGE(Qt5WebKitWidgets REQUIRED)
FIND_PACKAGE(Qt5LinguistTools)
QT5_WRAP_UI(organizer_UIHDRS ${organizer_UIS})
QT5_ADD_RESOURCES(organizer_RCCPPS ${organizer_QRCS})
QT5_CREATE_TRANSLATION(organizer_translations_qm ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/src/organizer_en.ts)
INCLUDE_DIRECTORIES(${Qt5Declarative_INCLUDES})
@@ -295,7 +297,7 @@ ELSE()
SET(usvfs_name usvfs_x86)
ENDIF()
ADD_EXECUTABLE(ModOrganizer WIN32 ${organizer_HDRS} ${organizer_SRCS} ${organizer_UIHDRS} ${organizer_RCS} ${organizer_RCCPPS})
ADD_EXECUTABLE(ModOrganizer WIN32 ${organizer_HDRS} ${organizer_SRCS} ${organizer_UIHDRS} ${organizer_RCS} ${organizer_RCCPPS} ${organizer_translations_qm})
TARGET_LINK_LIBRARIES(ModOrganizer
Qt5::Widgets Qt5::WinExtras Qt5::WebKitWidgets
${Boost_LIBRARIES}
+3 -3
View File
@@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>746</width>
<width>604</width>
<height>369</height>
</rect>
</property>
@@ -151,7 +151,7 @@
</widget>
<widget class="QWidget" name="credits">
<attribute name="title">
<string>Credits</string>
<string>Thanks</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
@@ -239,7 +239,7 @@
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Others</string>
<string>Other Supporter</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_7">
<item>
+6 -10
View File
@@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>282</width>
<width>294</width>
<height>156</height>
</rect>
</property>
@@ -25,29 +25,25 @@
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Username</string>
</property>
</widget>
</item>
<item>
<item row="0" column="1">
<widget class="QLineEdit" name="usernameEdit"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Password</string>
</property>
</widget>
</item>
<item>
<item row="1" column="1">
<widget class="QLineEdit" name="passwordEdit">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
+12 -9
View File
@@ -757,12 +757,15 @@ QString DownloadManager::getDisplayName(int index) const
DownloadInfo *info = m_ActiveDownloads.at(index);
QTextDocument doc;
if (!info->m_FileInfo->name.isEmpty()) {
return QString("%1 (%2, v%3)").arg(info->m_FileInfo->name)
doc.setHtml(info->m_FileInfo->name);
return QString("%1 (%2, v%3)").arg(doc.toPlainText())
.arg(getFileTypeString(info->m_FileInfo->fileCategory))
.arg(info->m_FileInfo->version.displayString());
} else {
return info->m_FileName;
doc.setHtml(info->m_FileName);
return doc.toPlainText();
}
}
@@ -1058,7 +1061,9 @@ void DownloadManager::nxmDescriptionAvailable(int, QVariant userData, QVariant r
DownloadInfo *info = downloadInfoByID(userData.toInt());
if (info == nullptr) return;
info->m_FileInfo->categoryID = result["category_id"].toInt();
info->m_FileInfo->modName = result["name"].toString().trimmed();
QTextDocument doc;
doc.setHtml(result["name"].toString().trimmed());
info->m_FileInfo->modName = doc.toPlainText();
info->m_FileInfo->newestVersion.parse(result["version"].toString());
if (info->m_FileInfo->fileID != 0) {
setState(info, STATE_READY);
@@ -1116,7 +1121,7 @@ void DownloadManager::nxmFilesAvailable(int, QVariant userData, QVariant resultD
bool found = false;
foreach(QVariant file, result) {
for (QVariant file : result) {
QVariantMap fileInfo = file.toMap();
QString fileName = fileInfo["uri"].toString();
QString fileNameVariant = fileName.mid(0).replace(' ', '_');
@@ -1127,12 +1132,10 @@ void DownloadManager::nxmFilesAvailable(int, QVariant userData, QVariant resultD
if (!info->m_FileInfo->version.isValid()) {
info->m_FileInfo->version = info->m_FileInfo->newestVersion;
}
//Nexus has HTMLd these so unhtml them if necessary
// we receive some names html-encoded. This is used to decode it
QTextDocument doc;
doc.setHtml(info->m_FileInfo->modName);
doc.setHtml(fileInfo["modName"].toString());
info->m_FileInfo->modName = doc.toPlainText();
doc.setHtml(info->m_FileInfo->name);
info->m_FileInfo->name = doc.toPlainText();
info->m_FileInfo->fileCategory = convertFileCategory(fileInfo["category_id"].toInt());
info->m_FileInfo->fileTime = matchDate(fileInfo["date"].toString());
info->m_FileInfo->fileID = fileInfo["id"].toInt();
@@ -1148,7 +1151,7 @@ void DownloadManager::nxmFilesAvailable(int, QVariant userData, QVariant resultD
emit showMessage(tr("No matching file found on Nexus! Maybe this file is no longer available or it was renamed?"));
} else {
SelectionDialog selection(tr("No file on Nexus matches the selected file by name. Please manually choose the correct one."));
foreach(QVariant file, result) {
for (QVariant file : result) {
QVariantMap fileInfo = file.toMap();
selection.addChoice(fileInfo["uri"].toString(), "", file);
}
+1 -1
View File
@@ -24,7 +24,7 @@ QList<QString> GenericIconDelegate::getIcons(const QModelIndex &index) const
{
QList<QString> result;
if (index.isValid()) {
foreach (const QVariant &var, index.data(m_Role).toList()) {
for (const QVariant &var : index.data(m_Role).toList()) {
if (!m_Compact || !var.toString().isEmpty()) {
result.append(var.toString());
}
+6 -2
View File
@@ -48,6 +48,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <QDateTime>
#include <QDirIterator>
#include <QDebug>
#include <QTextDocument>
#include <Shellapi.h>
@@ -669,7 +670,9 @@ bool InstallationManager::install(const QString &fileName,
if (QFile(metaName).exists()) {
QSettings metaFile(metaName, QSettings::IniFormat);
modID = metaFile.value("modID", 0).toInt();
modName.update(metaFile.value("name", "").toString(), GUESS_FALLBACK);
QTextDocument doc;
doc.setHtml(metaFile.value("name", "").toString());
modName.update(doc.toPlainText(), GUESS_FALLBACK);
modName.update(metaFile.value("modName", "").toString(), GUESS_META);
version = metaFile.value("version", "").toString();
@@ -688,12 +691,13 @@ bool InstallationManager::install(const QString &fileName,
{ // guess the mod name and mod if from the file name if there was no meta information
QString guessedModName;
int guessedModID = modID;
NexusInterface::interpretNexusFileName(QFileInfo(fileName).baseName(), guessedModName, guessedModID, false);
NexusInterface::interpretNexusFileName(QFileInfo(fileName).fileName(), guessedModName, guessedModID, false);
if ((modID == 0) && (guessedModID != -1)) {
modID = guessedModID;
} else if (modID != guessedModID) {
qDebug("passed mod id: %d, guessed id: %d", modID, guessedModID);
}
modName.update(guessedModName, GUESS_GOOD);
}
+1 -1
View File
@@ -196,7 +196,7 @@ QString InstanceManager::determineDataPath()
}
}
if (instanceId.isEmpty() || !QFileInfo::exists(dataPath)) {
if (instanceId.isEmpty()) {
return qApp->applicationDirPath();
} else {
setCurrentInstance(instanceId);
+1 -1
View File
@@ -533,13 +533,13 @@ int runApplication(MOApplication &application, SingleInstance &instance,
// pass the remaining parameters to the binary
try {
organizer.startApplication(exeName, arguments, QString(), QString());
return 0;
} catch (const std::exception &e) {
reportError(
QObject::tr("failed to start application: %1").arg(e.what()));
return 1;
}
}
return 0;
}
NexusInterface::instance()->getAccessManager()->startLoginCheck();
+47 -17
View File
@@ -242,12 +242,14 @@ MainWindow::MainWindow(QSettings &initSettings
ui->modList->setItemDelegateForColumn(ModList::COL_FLAGS, new ModFlagIconDelegate(ui->modList));
ui->modList->setItemDelegateForColumn(ModList::COL_CONTENT, contentDelegate);
ui->modList->header()->installEventFilter(m_OrganizerCore.modList());
if (initSettings.contains("mod_list_state")) {
ui->modList->header()->restoreState(initSettings.value("mod_list_state").toByteArray());
bool modListAdjusted = registerWidgetState(ui->modList->objectName(), ui->modList->header(), "mod_list_state");
if (modListAdjusted) {
// hack: force the resize-signal to be triggered because restoreState doesn't seem to do that
ui->modList->header()->resizeSection(ModList::COL_CONTENT, ui->modList->header()->sectionSize(ModList::COL_CONTENT) + 1);
ui->modList->header()->resizeSection(ModList::COL_CONTENT, ui->modList->header()->sectionSize(ModList::COL_CONTENT) - 1);
int sectionSize = ui->modList->header()->sectionSize(ModList::COL_CONTENT);
ui->modList->header()->resizeSection(ModList::COL_CONTENT, sectionSize + 1);
ui->modList->header()->resizeSection(ModList::COL_CONTENT, sectionSize);
} else {
// hide these columns by default
ui->modList->header()->setSectionHidden(ModList::COL_CONTENT, true);
@@ -264,15 +266,17 @@ MainWindow::MainWindow(QSettings &initSettings
ui->espList->setModel(m_PluginListSortProxy);
ui->espList->sortByColumn(PluginList::COL_PRIORITY, Qt::AscendingOrder);
ui->espList->setItemDelegateForColumn(PluginList::COL_FLAGS, new GenericIconDelegate(ui->espList));
if (initSettings.contains("plugin_list_state")) {
ui->espList->header()->restoreState(initSettings.value("plugin_list_state").toByteArray());
}
ui->espList->installEventFilter(m_OrganizerCore.pluginList());
bool pluginListAdjusted = registerWidgetState(ui->espList->objectName(), ui->espList->header(), "plugin_list_state");
registerWidgetState(ui->dataTree->objectName(), ui->dataTree->header());
registerWidgetState(ui->downloadView->objectName(),
ui->downloadView->header());
ui->splitter->setStretchFactor(0, 3);
ui->splitter->setStretchFactor(1, 2);
resizeLists(initSettings.contains("mod_list_state"), initSettings.contains("plugin_list_state"));
resizeLists(modListAdjusted, pluginListAdjusted);
QMenu *linkMenu = new QMenu(this);
linkMenu->addAction(QIcon(":/MO/gui/link"), tr("Toolbar"), this, SLOT(linkToolbar()));
@@ -289,7 +293,6 @@ MainWindow::MainWindow(QSettings &initSettings
// don't allow mouse wheel to switch grouping, too many people accidentally
// turn on grouping and then don't understand what happened
EventFilter *noWheel
= new EventFilter(this, [](QObject *, QEvent *event) -> bool {
return event->type() == QEvent::Wheel;
@@ -1261,7 +1264,6 @@ void MainWindow::refreshDataTree()
updateTo(subTree, L"", *m_OrganizerCore.directoryStructure(), conflictsBox->isChecked());
tree->insertTopLevelItem(0, subTree);
subTree->setExpanded(true);
tree->header()->resizeSection(0, 200);
}
@@ -1423,12 +1425,7 @@ void MainWindow::readSettings()
}
}
void MainWindow::storeSettings(QSettings &settings)
{
settings.setValue("mod_list_state", ui->modList->header()->saveState());
settings.setValue("plugin_list_state", ui->espList->header()->saveState());
void MainWindow::storeSettings(QSettings &settings) {
settings.setValue("group_state", ui->groupCombo->currentIndex());
settings.setValue("window_geometry", saveGeometry());
@@ -1439,7 +1436,13 @@ void MainWindow::storeSettings(QSettings &settings)
settings.setValue("filters_visible", ui->displayCategoriesBtn->isChecked());
settings.setValue("selected_executable", ui->executablesListBox->currentIndex());
settings.setValue("selected_executable",
ui->executablesListBox->currentIndex());
for (const std::pair<QString, QHeaderView*> kv : m_PersistedGeometry) {
QString key = QString("geometry/") + kv.first;
settings.setValue(key, kv.second->saveState());
}
}
void MainWindow::lock()
@@ -3219,6 +3222,8 @@ void MainWindow::on_actionSettings_triggered()
NexusInterface::instance()->setNMMVersion(m_OrganizerCore.settings().getNMMVersion());
updateDownloadListDelegate();
m_OrganizerCore.setLogLevel(m_OrganizerCore.settings().logLevel());
}
@@ -4547,6 +4552,31 @@ void MainWindow::dropLocalFile(const QUrl &url, const QString &outputDir, bool m
}
}
bool MainWindow::registerWidgetState(const QString &name, QHeaderView *view, const char *oldSettingName) {
// register the view so it's geometry gets saved at exit
m_PersistedGeometry.push_back(std::make_pair(name, view));
// also, restore the geometry if it was saved before
QSettings &settings = m_OrganizerCore.settings().directInterface();
QString key = QString("geometry/%1").arg(name);
QByteArray data;
if ((oldSettingName != nullptr) && settings.contains(oldSettingName)) {
data = settings.value(oldSettingName).toByteArray();
settings.remove(oldSettingName);
} else if (settings.contains(key)) {
data = settings.value(key).toByteArray();
}
if (!data.isEmpty()) {
view->restoreState(data);
return true;
} else {
return false;
}
}
void MainWindow::dropEvent(QDropEvent *event)
{
Qt::DropAction action = event->proposedAction();
+5
View File
@@ -60,6 +60,7 @@ namespace MOShared { class DirectoryEntry; }
#include <QStringList>
#include <QTime>
#include <QTimer>
#include <QHeaderView>
#include <QVariant>
#include <Qt>
@@ -284,6 +285,8 @@ private:
void dropLocalFile(const QUrl &url, const QString &outputDir, bool move);
bool registerWidgetState(const QString &name, QHeaderView *view, const char *oldSettingName = nullptr);
private:
static const char *PATTERN_BACKUP_GLOB;
@@ -348,6 +351,8 @@ private:
LockedDialog *m_LockDialog { nullptr };
std::vector<std::pair<QString, QHeaderView*>> m_PersistedGeometry;
enum class ShortcutType {
Toolbar,
Desktop,
-9
View File
@@ -129,18 +129,9 @@ bool MOApplication::notify(QObject *receiver, QEvent *event)
void MOApplication::updateStyle(const QString &fileName)
{
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
if (fileName == "Fusion") {
setStyle(QStyleFactory::create("fusion"));
setStyleSheet("");
#else
if (fileName == "Plastique") {
setStyle(new ProxyStyle(new QPlastiqueStyle));
setStyleSheet("");
} else if (fileName == "Cleanlooks") {
setStyle(new ProxyStyle(new QCleanlooksStyle));
setStyleSheet("");
#endif
} else {
setStyle(new ProxyStyle(QStyleFactory::create(m_DefaultStyle)));
if (QFile::exists(fileName)) {
+3 -3
View File
@@ -12,8 +12,7 @@ ModFlagIconDelegate::ModFlagIconDelegate(QObject *parent)
{
}
QList<QString> ModFlagIconDelegate::getIcons(const QModelIndex &index) const
{
QList<QString> ModFlagIconDelegate::getIcons(const QModelIndex &index) const {
QList<QString> result;
QVariant modid = index.data(Qt::UserRole + 1);
if (modid.isValid()) {
@@ -21,7 +20,8 @@ QList<QString> ModFlagIconDelegate::getIcons(const QModelIndex &index) const
std::vector<ModInfo::EFlag> flags = info->getFlags();
{ // insert conflict icon first to provide nicer alignment
auto iter = std::find_first_of(flags.begin(), flags.end(), m_ConflictFlags, m_ConflictFlags + 4);
auto iter = std::find_first_of(flags.begin(), flags.end(),
m_ConflictFlags, m_ConflictFlags + 4);
if (iter != flags.end()) {
result.append(getFlagIcon(*iter));
flags.erase(iter);
+14 -27
View File
@@ -35,6 +35,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <versioninfo.h>
#include <appconfig.h>
#include <scriptextender.h>
#include <unmanagedmods.h>
#include <QApplication>
#include <QDirIterator>
@@ -75,11 +76,13 @@ ModInfo::Ptr ModInfo::createFrom(const QDir &dir, DirectoryEntry **directoryStru
return result;
}
ModInfo::Ptr ModInfo::createFromPlugin(const QString &espName, const QStringList &bsaNames
, DirectoryEntry ** directoryStructure)
{
ModInfo::Ptr ModInfo::createFromPlugin(const QString &modName,
const QString &espName,
const QStringList &bsaNames,
DirectoryEntry **directoryStructure) {
QMutexLocker locker(&s_Mutex);
ModInfo::Ptr result = ModInfo::Ptr(new ModInfoForeign(espName, bsaNames, directoryStructure));
ModInfo::Ptr result = ModInfo::Ptr(
new ModInfoForeign(modName, espName, bsaNames, directoryStructure));
s_Collection.push_back(result);
return result;
}
@@ -92,12 +95,10 @@ QString ModInfo::getContentTypeName(int contentType)
case CONTENT_MESH: return tr("Meshes");
case CONTENT_BSA: return tr("BSA");
case CONTENT_INTERFACE: return tr("UI Changes");
case CONTENT_MUSIC: return tr("Music");
case CONTENT_SOUND: return tr("Sound Effects");
case CONTENT_SCRIPT: return tr("Scripts");
case CONTENT_SKSE: return tr("SKSE Plugins");
case CONTENT_SKYPROC: return tr("SkyProc Tools");
case CONTENT_STRING: return tr("Strings");
default: throw MyException(tr("invalid content type %1").arg(contentType));
}
}
@@ -219,27 +220,13 @@ void ModInfo::updateFromDisc(const QString &modDirectory,
}
}
{ // list plugins in the data directory and make a foreign-managed mod out of each
QStringList dlcPlugins = game->DLCPlugins();
QStringList mainPlugins = game->primaryPlugins();
QDir dataDir(game->dataDirectory());
for (const QString &file : dataDir.entryList({ "*.esp", "*.esm" })) {
if (std::find_if(mainPlugins.begin(), mainPlugins.end(),
[&file](QString const &p) {
return p.compare(file, Qt::CaseInsensitive) == 0; }) == mainPlugins.end()
&& (displayForeign // show non-dlc bundles only if the user wants them
|| std::find_if(dlcPlugins.begin(), dlcPlugins.end(),
[&file](QString const &p) {
return p.compare(file, Qt::CaseInsensitive) == 0; }) != dlcPlugins.end())) {
QFileInfo f(file); //Just so I can get a basename...
QStringList archives;
for (const QString &archiveName : dataDir.entryList({ f.baseName() + "*.bsa" })) {
archives.append(dataDir.absoluteFilePath(archiveName));
}
createFromPlugin(file, archives, directoryStructure);
}
UnmanagedMods *unmanaged = game->feature<UnmanagedMods>();
if (unmanaged != nullptr) {
for (const QString &modName : unmanaged->mods(!displayForeign)) {
createFromPlugin(unmanaged->displayName(modName),
unmanaged->referenceFile(modName).absoluteFilePath(),
unmanaged->secondaryFiles(modName),
directoryStructure);
}
}
+3 -5
View File
@@ -76,15 +76,13 @@ public:
CONTENT_MESH,
CONTENT_BSA,
CONTENT_INTERFACE,
CONTENT_MUSIC,
CONTENT_SOUND,
CONTENT_SCRIPT,
CONTENT_SKSE,
CONTENT_SKYPROC,
CONTENT_STRING
CONTENT_SKYPROC
};
static const int NUM_CONTENT_TYPES = CONTENT_STRING + 1;
static const int NUM_CONTENT_TYPES = CONTENT_SKYPROC + 1;
enum EHighlight {
HIGHLIGHT_NONE = 0,
@@ -188,7 +186,7 @@ public:
* @param bsaNames names of archives
* @return a new mod
*/
static ModInfo::Ptr createFromPlugin(const QString &espName, const QStringList &bsaNames, MOShared::DirectoryEntry **directoryStructure);
static ModInfo::Ptr createFromPlugin(const QString &modName, const QString &espName, const QStringList &bsaNames, MOShared::DirectoryEntry **directoryStructure);
/**
* @brief retieve a name for one of the CONTENT_ enums
+6 -6
View File
@@ -43,12 +43,12 @@ QString ModInfoForeign::getDescription() const
return tr("This pseudo mod represents content managed outside MO. It isn't modified by MO.");
}
ModInfoForeign::ModInfoForeign(const QString &referenceFile, const QStringList &archives,
ModInfoForeign::ModInfoForeign(const QString &modName,
const QString &referenceFile,
const QStringList &archives,
DirectoryEntry **directoryStructure)
: ModInfoWithConflictInfo(directoryStructure)
, m_ReferenceFile(referenceFile)
, m_Archives(archives)
{
: ModInfoWithConflictInfo(directoryStructure),
m_ReferenceFile(referenceFile), m_Archives(archives) {
m_CreationTime = QFileInfo(referenceFile).created();
m_Name = "Unmanaged: " + QFileInfo(m_ReferenceFile).baseName();
m_Name = "Unmanaged: " + modName;
}
+3 -3
View File
@@ -51,9 +51,9 @@ public:
virtual void addInstalledFile(int, int) {}
protected:
ModInfoForeign(const QString &referenceFile, const QStringList &archives, MOShared::DirectoryEntry **directoryStructure);
ModInfoForeign(const QString &modName, const QString &referenceFile,
const QStringList &archives,
MOShared::DirectoryEntry **directoryStructure);
private:
QString m_Name;
+18 -12
View File
@@ -433,25 +433,31 @@ std::vector<ModInfo::EContent> ModInfoRegular::getContents() const
if (dir.entryList(QStringList() << "*.esp" << "*.esm").size() > 0) {
m_CachedContent.push_back(CONTENT_PLUGIN);
}
if (dir.entryList(QStringList() << "*.bsa").size() > 0) {
if (dir.entryList(QStringList() << "*.bsa" << "*.ba2").size() > 0) {
m_CachedContent.push_back(CONTENT_BSA);
}
ScriptExtender *extender = qApp->property("managed_game").value<IPluginGame*>()->feature<ScriptExtender>();
ScriptExtender *extender = qApp->property("managed_game")
.value<IPluginGame *>()
->feature<ScriptExtender>();
if (extender != nullptr) {
QString sePluginPath = extender->name() + "/plugins";
if (dir.exists(sePluginPath)) m_CachedContent.push_back(CONTENT_SKSE);
if (dir.exists(sePluginPath))
m_CachedContent.push_back(CONTENT_SKSE);
}
if (dir.exists("textures")) m_CachedContent.push_back(CONTENT_TEXTURE);
if (dir.exists("meshes")) m_CachedContent.push_back(CONTENT_MESH);
if (dir.exists("interface")
|| dir.exists("menus")) m_CachedContent.push_back(CONTENT_INTERFACE);
if (dir.exists("music")) m_CachedContent.push_back(CONTENT_MUSIC);
if (dir.exists("sound")) m_CachedContent.push_back(CONTENT_SOUND);
if (dir.exists("scripts")) m_CachedContent.push_back(CONTENT_SCRIPT);
if (dir.exists("strings")) m_CachedContent.push_back(CONTENT_STRING);
if (dir.exists("SkyProc Patchers")) m_CachedContent.push_back(CONTENT_SKYPROC);
if (dir.exists("textures"))
m_CachedContent.push_back(CONTENT_TEXTURE);
if (dir.exists("meshes"))
m_CachedContent.push_back(CONTENT_MESH);
if (dir.exists("interface") || dir.exists("menus"))
m_CachedContent.push_back(CONTENT_INTERFACE);
if (dir.exists("music") || dir.exists("sound"))
m_CachedContent.push_back(CONTENT_SOUND);
if (dir.exists("scripts"))
m_CachedContent.push_back(CONTENT_SCRIPT);
if (dir.exists("SkyProc Patchers"))
m_CachedContent.push_back(CONTENT_SKYPROC);
m_LastContentCheck = QTime::currentTime();
}
+1 -3
View File
@@ -64,12 +64,10 @@ ModList::ModList(QObject *parent)
m_ContentIcons[ModInfo::CONTENT_INTERFACE] = std::make_tuple(":/MO/gui/content/interface", tr("Interface"));
m_ContentIcons[ModInfo::CONTENT_MESH] = std::make_tuple(":/MO/gui/content/mesh", tr("Meshes"));
m_ContentIcons[ModInfo::CONTENT_BSA] = std::make_tuple(":/MO/gui/content/bsa", tr("BSA"));
m_ContentIcons[ModInfo::CONTENT_MUSIC] = std::make_tuple(":/MO/gui/content/music", tr("Music"));
m_ContentIcons[ModInfo::CONTENT_SCRIPT] = std::make_tuple(":/MO/gui/content/script", tr("Scripts (Papyrus)"));
m_ContentIcons[ModInfo::CONTENT_SKSE] = std::make_tuple(":/MO/gui/content/skse", tr("Script Extender Plugin"));
m_ContentIcons[ModInfo::CONTENT_SKYPROC] = std::make_tuple(":/MO/gui/content/skyproc", tr("SkyProc Patcher"));
m_ContentIcons[ModInfo::CONTENT_SOUND] = std::make_tuple(":/MO/gui/content/sound", tr("Sound"));
m_ContentIcons[ModInfo::CONTENT_STRING] = std::make_tuple(":/MO/gui/content/string", tr("Strings"));
m_ContentIcons[ModInfo::CONTENT_SOUND] = std::make_tuple(":/MO/gui/content/sound", tr("Sound or Music"));
m_ContentIcons[ModInfo::CONTENT_TEXTURE] = std::make_tuple(":/MO/gui/content/texture", tr("Textures"));
m_LastCheck.start();
+1 -1
View File
@@ -194,7 +194,7 @@ void NexusInterface::loginCompleted()
void NexusInterface::interpretNexusFileName(const QString &fileName, QString &modName, int &modID, bool query)
{
//Look for something along the lines of modulename-Vn-m + any old rubbish.
static std::regex exp("^([a-zA-Z0-9_'\"\\-.() ]*?)([-_ ][VvRr]?[0-9_]+)?-([1-9][0-9]+).*\\.(zip|rar|7z)");
static std::regex exp(R"exp(^([a-zA-Z0-9_'"\-.() ]*?)([-_ ][VvRr]?[0-9_]+)?-([1-9][0-9]*).*\.(zip|rar|7z))exp");
static std::regex simpleexp("^([a-zA-Z0-9_]+)");
QByteArray fileNameUTF8 = fileName.toUtf8();

Some files were not shown because too many files have changed in this diff Show More