mirror of
https://github.com/ModOrganizer2/modorganizer.git
synced 2026-07-27 13:58:24 -07:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
352975e757 | ||
|
|
cd83f4e732 | ||
|
|
4f25a0689f | ||
|
|
3d642563cb | ||
|
|
0100c86887 | ||
|
|
8d04c77c29 | ||
|
|
b935ce3862 | ||
|
|
fcebf21c44 | ||
|
|
3d1dfadb40 | ||
|
|
c2c48bd39a | ||
|
|
9163a6dc34 | ||
|
|
8bf3037d4b | ||
|
|
4f1bb36933 | ||
|
|
cbdea13a9c | ||
|
|
b36c666899 |
+82
@@ -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
@@ -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
@@ -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,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
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -196,7 +196,7 @@ QString InstanceManager::determineDataPath()
|
||||
}
|
||||
}
|
||||
|
||||
if (instanceId.isEmpty() || !QFileInfo::exists(dataPath)) {
|
||||
if (instanceId.isEmpty()) {
|
||||
return qApp->applicationDirPath();
|
||||
} else {
|
||||
setCurrentInstance(instanceId);
|
||||
|
||||
+1
-1
@@ -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
@@ -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();
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
@@ -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();
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user