From daf8bab1367334bb7f2332d4256f31c9db5ecec8 Mon Sep 17 00:00:00 2001 From: Tannin Date: Thu, 23 May 2013 20:03:35 +0200 Subject: - bugfix: installation using custom installer always created mod directory - batch installer now displays progress during mod installation --- src/mainwindow.cpp | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) (limited to 'src/mainwindow.cpp') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 4ba3f2dc..cf7ed487 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1059,9 +1059,13 @@ IModInterface *MainWindow::getMod(const QString &name) } -IModInterface *MainWindow::createMod(const QString &name) +IModInterface *MainWindow::createMod(GuessedValue &name) { - QString fixedName = name; + if (!m_InstallationManager.testOverwrite(name)) { + return NULL; + } + +/* QString fixedName = name; fixDirectoryName(fixedName); unsigned int index = ModInfo::getIndex(fixedName); if (index != UINT_MAX) { @@ -1070,8 +1074,8 @@ IModInterface *MainWindow::createMod(const QString &name) throw MyException(tr("The mod \"%1\" already exists!").arg(fixedName)); } return result.data(); - } else { - QString targetDirectory = QDir::fromNativeSeparators(m_Settings.getModDirectory()).append("/").append(fixedName.trimmed()); + } else {*/ + QString targetDirectory = QDir::fromNativeSeparators(m_Settings.getModDirectory()).append("/").append(name); QSettings settingsFile(targetDirectory.mid(0).append("/meta.ini"), QSettings::IniFormat); @@ -1081,7 +1085,7 @@ IModInterface *MainWindow::createMod(const QString &name) settingsFile.setValue("category", 0); settingsFile.setValue("installationFile", 0); return ModInfo::createFrom(QDir(targetDirectory), &m_DirectoryStructure).data(); - } +// } } bool MainWindow::removeMod(IModInterface *mod) @@ -2795,14 +2799,21 @@ void MainWindow::syncOverwrite() void MainWindow::createModFromOverwrite() { - QString name = QInputDialog::getText(this, tr("Create Mod..."), - tr("This will move all files from overwrite into a new, regular mod." - "Please enter a name: ")); - QString fixedName = fixDirectoryName(name); - if (fixedName.isEmpty()) { - reportError(tr("Invalid name")); - return; - } else if (getMod(fixedName) != NULL) { + GuessedValue name; + name.setFilter(&fixDirectoryName); + + while (name->isEmpty()) { + bool ok; + name.update(QInputDialog::getText(this, tr("Create Mod..."), + tr("This will move all files from overwrite into a new, regular mod.\n" + "Please enter a name: "), QLineEdit::Normal, "", &ok), + GUESS_USER); + if (!ok) { + return; + } + } + + if (getMod(name) != NULL) { reportError(tr("A mod with this name already exists")); return; } @@ -2812,6 +2823,8 @@ void MainWindow::createModFromOverwrite() ModInfo::Ptr overwriteInfo = ModInfo::getByIndex(m_ContextRow); shellMove(QStringList(overwriteInfo->absolutePath() + "\\*"), QStringList(newMod->absolutePath()), this); + + refreshModList(); } -- cgit v1.3.1 From 16bda49e0667f77f4ebe1d8fa2682abf57aa6765 Mon Sep 17 00:00:00 2001 From: Tannin Date: Sat, 25 May 2013 12:24:48 +0200 Subject: - bugfix: mod priority ordering could become incorrect - bugfix: when grouping is enabled, newly installed mods broke grouping - bugfix: syncing overwrite didn't clean up emptied directory --- src/mainwindow.cpp | 39 +++++++++++++++++++++------------------ src/overwriteinfodialog.ui | 7 +++++++ src/qtgroupingproxy.cpp | 7 +++++++ src/qtgroupingproxy.h | 1 + src/shared/directoryentry.cpp | 6 ++++-- src/syncoverwritedialog.cpp | 24 ++++++++++++++++++++---- src/syncoverwritedialog.h | 2 +- 7 files changed, 61 insertions(+), 25 deletions(-) (limited to 'src/mainwindow.cpp') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index cf7ed487..9c0559c7 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2191,9 +2191,6 @@ void MainWindow::modStatusChanged(unsigned int index) ModInfo::Ptr modInfo = ModInfo::getByIndex(index); if (m_CurrentProfile->modEnabled(index)) { DirectoryRefresher::addModToStructure(m_DirectoryStructure, modInfo->name(), m_CurrentProfile->getModPriority(index), modInfo->absolutePath()); -/* m_DirectoryStructure->addFromOrigin(ToWString(modInfo->name()), - ToWString(QDir::toNativeSeparators(modInfo->absolutePath())), - m_CurrentProfile->getModPriority(index));*/ DirectoryRefresher::cleanStructure(m_DirectoryStructure); } else { if (m_DirectoryStructure->originExists(ToWString(modInfo->name()))) { @@ -2201,6 +2198,16 @@ void MainWindow::modStatusChanged(unsigned int index) origin.enable(false); } } + + for (unsigned int i = 0; i < m_CurrentProfile->numMods(); ++i) { + ModInfo::Ptr modInfo = ModInfo::getByIndex(i); + int priority = m_CurrentProfile->getModPriority(i); + if (m_DirectoryStructure->originExists(ToWString(modInfo->name()))) { + m_DirectoryStructure->getOriginByName(ToWString(modInfo->name())).setPriority(priority); + } + } + m_DirectoryStructure->getFileRegister()->sortOrigins(); + refreshLists(); } catch (const std::exception& e) { reportError(tr("failed to update mod list: %1").arg(e.what())); @@ -2485,11 +2492,15 @@ void MainWindow::modlistChanged(const QModelIndex &index, int role) m_PluginList.enableESP(esm); } + int enabled = 0; QStringList esps = dir.entryList(QStringList("*.esp"), QDir::Files); foreach (const QString &esp, esps) { - m_PluginList.enableESP(esp); + if (!m_PluginList.isEnabled(esp)) { + m_PluginList.enableESP(esp); + ++enabled; + } } - if (esps.count() > 1) { + if (enabled > 1) { MessageDialog::showMessage(tr("Multiple esps activated, please check that they don't conflict."), this); } } @@ -2628,9 +2639,6 @@ void MainWindow::displayModInformation(ModInfo::Ptr modInfo, unsigned int index, FilesOrigin& origin = m_DirectoryStructure->getOriginByName(ToWString(modInfo->name())); origin.enable(false); -/* m_DirectoryStructure->addFromOrigin(ToWString(modInfo->name()), - ToWString(QDir::toNativeSeparators(modInfo->absolutePath())), - m_CurrentProfile->getModPriority(index));*/ DirectoryRefresher::addModToStructure(m_DirectoryStructure, modInfo->name(), m_CurrentProfile->getModPriority(index), modInfo->absolutePath()); @@ -2694,6 +2702,7 @@ void MainWindow::displayModInformation(const QString &modName, int tab) void MainWindow::displayModInformation(int row, int tab) { ModInfo::Ptr modInfo = ModInfo::getByIndex(row); +qDebug("%d - %s", row, qPrintable(modInfo->name())); displayModInformation(modInfo, row, tab); } @@ -2840,7 +2849,6 @@ void MainWindow::on_modList_doubleClicked(const QModelIndex &index) if (!index.isValid()) { return; } -// QModelIndex sourceIdx = m_ModListGroupProxy->mapToSource(index); QModelIndex sourceIdx = mapToModel(&m_ModList, index); if (!sourceIdx.isValid()) { return; @@ -2870,8 +2878,7 @@ bool MainWindow::addCategories(QMenu *menu, int targetID) if (m_CategoryFactory.getParentID(i) == targetID) { QMenu *targetMenu = menu; if (m_CategoryFactory.hasChildren(i)) { - targetMenu = menu->addMenu( - m_CategoryFactory.getCategoryName(i).replace('&', "&&")); + targetMenu = menu->addMenu(m_CategoryFactory.getCategoryName(i).replace('&', "&&")); } int id = m_CategoryFactory.getCategoryID(i); @@ -2902,6 +2909,7 @@ bool MainWindow::addCategories(QMenu *menu, int targetID) void MainWindow::saveCategoriesFromMenu(QMenu *menu, int modRow) { ModInfo::Ptr modInfo = ModInfo::getByIndex(modRow); +qDebug("%d - %s", modRow, qPrintable(modInfo->name())); foreach (QAction* action, menu->actions()) { if (action->menu() != NULL) { saveCategoriesFromMenu(action->menu(), modRow); @@ -2909,8 +2917,8 @@ void MainWindow::saveCategoriesFromMenu(QMenu *menu, int modRow) QWidgetAction *widgetAction = qobject_cast(action); if (widgetAction != NULL) { QCheckBox *checkbox = qobject_cast(widgetAction->defaultWidget()); +qDebug("%s - %d", qPrintable(modInfo->name()), widgetAction->data().toInt()); modInfo->setCategory(widgetAction->data().toInt(), checkbox->isChecked()); -// m_ModList.setModCategory(modRow, widgetAction->data().toInt(), checkbox->isChecked()); } } } @@ -2924,7 +2932,6 @@ void MainWindow::saveCategories() qCritical("not a menu?"); return; } -// m_ModList.resetCategories(m_ContextRow); QModelIndexList selected = ui->modList->selectionModel()->selectedRows(); if (selected.size() > 0) { @@ -4256,18 +4263,14 @@ void MainWindow::on_groupCombo_currentIndexChanged(int index) newModel = NULL; } break; } + if (newModel != NULL) { -// newModel->setSourceModel(m_ModListSortProxy); m_ModListSortProxy->setSourceModel(newModel); connect(ui->modList, SIGNAL(expanded(QModelIndex)),newModel, SLOT(expanded(QModelIndex))); connect(ui->modList, SIGNAL(collapsed(QModelIndex)), newModel, SLOT(collapsed(QModelIndex))); connect(newModel, SIGNAL(expandItem(QModelIndex)), ui->modList, SLOT(expand(QModelIndex))); -// ui->modList->setModel(newModel); } else { m_ModListSortProxy->setSourceModel(&m_ModList); -// ui->modList->setModel(m_ModListSortProxy); } -// ui->modList->setModel(m_ModListSortProxy); - // ui->modList->setSelectionMode(QAbstractItemView::ExtendedSelection); } diff --git a/src/overwriteinfodialog.ui b/src/overwriteinfodialog.ui index c6119ca6..2c194ecf 100644 --- a/src/overwriteinfodialog.ui +++ b/src/overwriteinfodialog.ui @@ -33,6 +33,13 @@ + + + + You can use drag&drop to move files and directories to regular mods. + + + diff --git a/src/qtgroupingproxy.cpp b/src/qtgroupingproxy.cpp index 4e066f65..3ecb2a72 100644 --- a/src/qtgroupingproxy.cpp +++ b/src/qtgroupingproxy.cpp @@ -57,6 +57,7 @@ QtGroupingProxy::QtGroupingProxy(QAbstractItemModel *model, QModelIndex rootNode connect( sourceModel(), SIGNAL(layoutChanged()), SLOT(buildTree()) ); connect( sourceModel(), SIGNAL(dataChanged(QModelIndex,QModelIndex)), SLOT(modelDataChanged(QModelIndex,QModelIndex)) ); + connect( sourceModel(), SIGNAL(modelReset()), this, SLOT(resetModel()) ); if( groupedColumn != -1 ) setGroupedColumn( groupedColumn ); @@ -984,6 +985,12 @@ QtGroupingProxy::modelRowsRemoved( const QModelIndex &parent, int start, int end endRemoveRows(); } +void +QtGroupingProxy::resetModel() +{ + buildTree(); +} + void QtGroupingProxy::modelDataChanged( const QModelIndex &topLeft, const QModelIndex &bottomRight ) { diff --git a/src/qtgroupingproxy.h b/src/qtgroupingproxy.h index e09ae7b4..7df069f7 100644 --- a/src/qtgroupingproxy.h +++ b/src/qtgroupingproxy.h @@ -103,6 +103,7 @@ private slots: void modelRowsInserted( const QModelIndex &, int, int ); void modelRowsAboutToBeRemoved( const QModelIndex &, int ,int ); void modelRowsRemoved( const QModelIndex &, int, int ); + void resetModel(); protected: /** Maps an item to a group. diff --git a/src/shared/directoryentry.cpp b/src/shared/directoryentry.cpp index abf9affb..9958b934 100644 --- a/src/shared/directoryentry.cpp +++ b/src/shared/directoryentry.cpp @@ -192,7 +192,6 @@ void FileEntry::addOrigin(int origin, FILETIME fileTime, const std::wstring &arc m_Origin = origin; m_FileTime = fileTime; m_Archive = archive; -// } else if (FilesOrigin::getByID(origin).getPriority() > FilesOrigin::getByID(m_Origin).getPriority()) { } else if (m_Parent->getOriginByID(origin).getPriority() > m_Parent->getOriginByID(m_Origin).getPriority()) { if (std::find(m_Alternatives.begin(), m_Alternatives.end(), m_Origin) == m_Alternatives.end()) { m_Alternatives.push_back(m_Origin); @@ -269,7 +268,10 @@ bool FileEntry::removeOrigin(int origin) // sorted by priority descending static bool ByOriginPriority(DirectoryEntry *entry, int LHS, int RHS) { - return entry->getOriginByID(LHS).getPriority() < entry->getOriginByID(RHS).getPriority(); + int l = entry->getOriginByID(LHS).getPriority(); if (l < 0) l = INT_MAX; + int r = entry->getOriginByID(RHS).getPriority(); if (r < 0) r = INT_MAX; + + return l < r; } diff --git a/src/syncoverwritedialog.cpp b/src/syncoverwritedialog.cpp index aae0fd7c..be9d06c2 100644 --- a/src/syncoverwritedialog.cpp +++ b/src/syncoverwritedialog.cpp @@ -37,7 +37,7 @@ SyncOverwriteDialog::SyncOverwriteDialog(const QString &path, DirectoryEntry *di ui(new Ui::SyncOverwriteDialog), m_SourcePath(path), m_DirectoryStructure(directoryStructure) { ui->setupUi(this); - refresh(path, directoryStructure); + refresh(path); QHeaderView *headerView = ui->syncTree->header(); #if QT_VERSION >= 0x050000 @@ -56,6 +56,14 @@ SyncOverwriteDialog::~SyncOverwriteDialog() } +static void addToComboBox(QComboBox *box, const QString &name, const QVariant &userData) +{ + if (QString::compare(name, "overwrite", Qt::CaseInsensitive) != 0) { + box->addItem(name, userData); + } +} + + void SyncOverwriteDialog::readTree(const QString &path, DirectoryEntry *directoryStructure, QTreeWidgetItem *subTree) { QDir overwrite(path); @@ -86,9 +94,12 @@ void SyncOverwriteDialog::readTree(const QString &path, DirectoryEntry *director QComboBox* combo = new QComboBox(ui->syncTree); combo->addItem(tr(""), -1); if (entry != NULL) { + bool ignore; + int origin = entry->getOrigin(ignore); + addToComboBox(combo, ToQString(m_DirectoryStructure->getOriginByID(origin).getName()), origin); const std::vector &alternatives = entry->getAlternatives(); for (std::vector::const_iterator iter = alternatives.begin(); iter != alternatives.end(); ++iter) { - combo->addItem(ToQString(m_DirectoryStructure->getOriginByID(*iter).getName()), *iter); + addToComboBox(combo, ToQString(m_DirectoryStructure->getOriginByID(*iter).getName()), *iter); } combo->setCurrentIndex(combo->count() - 1); } else { @@ -103,10 +114,10 @@ void SyncOverwriteDialog::readTree(const QString &path, DirectoryEntry *director } -void SyncOverwriteDialog::refresh(const QString &path, DirectoryEntry *directoryStructure) +void SyncOverwriteDialog::refresh(const QString &path) { QTreeWidgetItem *rootItem = new QTreeWidgetItem(ui->syncTree, QStringList("")); - readTree(path, directoryStructure, rootItem); + readTree(path, m_DirectoryStructure, rootItem); ui->syncTree->addTopLevelItem(rootItem); ui->syncTree->expandAll(); } @@ -141,6 +152,11 @@ void SyncOverwriteDialog::applyTo(QTreeWidgetItem *item, const QString &path, co } } } + + QDir dir(m_SourcePath + "/" + path); + if ((path.length() > 0) && (dir.count() == 2)) { + dir.rmpath("."); + } } diff --git a/src/syncoverwritedialog.h b/src/syncoverwritedialog.h index da7c8cf5..74c9a58f 100644 --- a/src/syncoverwritedialog.h +++ b/src/syncoverwritedialog.h @@ -40,7 +40,7 @@ public: void apply(const QString &modDirectory); private: - void refresh(const QString &path, MOShared::DirectoryEntry *directoryStructure); + void refresh(const QString &path); void readTree(const QString &path, MOShared::DirectoryEntry *directoryStructure, QTreeWidgetItem *subTree); void applyTo(QTreeWidgetItem *item, const QString &path, const QString &modDirectory); -- cgit v1.3.1 From d8cb9a4e3710b1a09ac2795541c6b792a917e3a1 Mon Sep 17 00:00:00 2001 From: Tannin Date: Tue, 28 May 2013 22:43:19 +0200 Subject: - bugfixes in hookdll related to path-rerouting - bugfix: expanding modlist groups after changes to modlist works now - bugfix: sorting grouped modlist was broken --- src/main.cpp | 3 --- src/mainwindow.cpp | 30 +++++++++++++++++++++++++----- src/mainwindow.h | 2 ++ src/modlist.cpp | 14 ++++++++++---- src/modlist.h | 2 +- src/modlistsortproxy.cpp | 16 ++++++---------- src/qtgroupingproxy.cpp | 2 +- 7 files changed, 45 insertions(+), 24 deletions(-) (limited to 'src/mainwindow.cpp') diff --git a/src/main.cpp b/src/main.cpp index 7146f4d1..3f8ea46f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -94,8 +94,6 @@ void removeOldLogfiles() // set up required folders (for a first install or after an update or to fix a broken installation) bool bootstrap() { - qDebug("bootstapping"); - GameInfo &gameInfo = GameInfo::instance(); // remove the temporary backup directory in case we're restarting after an update @@ -150,7 +148,6 @@ bool bootstrap() } // verify the hook-dll exists - qDebug("checking dll"); QString dllName = qApp->applicationDirPath() + "/" + ToQString(AppConfig::hookDLLName()); HMODULE dllMod = ::LoadLibraryW(ToWString(dllName).c_str()); if (dllMod == NULL) { diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 4ac883e9..5cbfa72a 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -610,6 +610,19 @@ void MainWindow::downloadFilterChanged(const QString &filter) } } +void MainWindow::expandModList(const QModelIndex &index) +{ + QAbstractItemModel *model = ui->modList->model(); +#pragma message("why is this so complicated? mapping the index doesn't work, probably a bug in QtGroupingProxy?") + for (int i = 0; i < model->rowCount(); ++i) { + QModelIndex targetIdx = model->index(i, 0); + if (model->data(targetIdx).toString() == index.data().toString()) { + ui->modList->expand(targetIdx); + break; + } + } +} + bool MainWindow::saveCurrentLists() { if (m_DirectoryUpdate) { @@ -2702,7 +2715,6 @@ void MainWindow::displayModInformation(const QString &modName, int tab) void MainWindow::displayModInformation(int row, int tab) { ModInfo::Ptr modInfo = ModInfo::getByIndex(row); -qDebug("%d - %s", row, qPrintable(modInfo->name())); displayModInformation(modInfo, row, tab); } @@ -2909,7 +2921,6 @@ bool MainWindow::addCategories(QMenu *menu, int targetID) void MainWindow::saveCategoriesFromMenu(QMenu *menu, int modRow) { ModInfo::Ptr modInfo = ModInfo::getByIndex(modRow); -qDebug("%d - %s", modRow, qPrintable(modInfo->name())); foreach (QAction* action, menu->actions()) { if (action->menu() != NULL) { saveCategoriesFromMenu(action->menu(), modRow); @@ -2917,7 +2928,6 @@ qDebug("%d - %s", modRow, qPrintable(modInfo->name())); QWidgetAction *widgetAction = qobject_cast(action); if (widgetAction != NULL) { QCheckBox *checkbox = qobject_cast(widgetAction->defaultWidget()); -qDebug("%s - %d", qPrintable(modInfo->name()), widgetAction->data().toInt()); modInfo->setCategory(widgetAction->data().toInt(), checkbox->isChecked()); } } @@ -2934,12 +2944,22 @@ void MainWindow::saveCategories() } QModelIndexList selected = ui->modList->selectionModel()->selectedRows(); + if (selected.size() > 0) { + int min = INT_MAX; + int max = INT_MIN; + for (int i = 0; i < selected.size(); ++i) { - saveCategoriesFromMenu(menu, m_ModListSortProxy->mapToSource(selected.at(i)).row()); + QModelIndex temp = mapToModel(&m_ModList, selected.at(i)); + if (temp.row() < min) min = temp.row(); + if (temp.row() > max) max = temp.row(); + saveCategoriesFromMenu(menu, mapToModel(&m_ModList, selected.at(i)).row()); } + //m_ModList.notifyChange(min, max); + refreshModList(); } else { saveCategoriesFromMenu(menu, m_ContextRow); + m_ModList.notifyChange(m_ContextRow); } refreshFilters(); @@ -4268,7 +4288,7 @@ void MainWindow::on_groupCombo_currentIndexChanged(int index) m_ModListSortProxy->setSourceModel(newModel); connect(ui->modList, SIGNAL(expanded(QModelIndex)),newModel, SLOT(expanded(QModelIndex))); connect(ui->modList, SIGNAL(collapsed(QModelIndex)), newModel, SLOT(collapsed(QModelIndex))); - connect(newModel, SIGNAL(expandItem(QModelIndex)), ui->modList, SLOT(expand(QModelIndex))); + connect(newModel, SIGNAL(expandItem(QModelIndex)), this, SLOT(expandModList(QModelIndex))); } else { m_ModListSortProxy->setSourceModel(&m_ModList); diff --git a/src/mainwindow.h b/src/mainwindow.h index 9626c5ba..7a1e1bc2 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -420,6 +420,8 @@ private slots: void espFilterChanged(const QString &filter); void downloadFilterChanged(const QString &filter); + void expandModList(const QModelIndex &index); + private slots: // ui slots // actions void on_actionAdd_Profile_triggered(); diff --git a/src/modlist.cpp b/src/modlist.cpp index 3fc8ae23..f87687bb 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -203,7 +203,12 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const return QVariant(); } } else if (column == COL_PRIORITY) { - return m_Profile->getModPriority(modIndex); + int priority = modInfo->getFixedPriority(); + if (priority != INT_MIN) { + return priority; + } else { + return m_Profile->getModPriority(modIndex); + } } else { return modInfo->getNexusID(); } @@ -648,13 +653,14 @@ void ModList::removeRow(int row, const QModelIndex&) } -void ModList::notifyChange(int row) +void ModList::notifyChange(int rowStart, int rowEnd) { - if (row < 0) { + if (rowStart < 0) { beginResetModel(); endResetModel(); } else { - emit dataChanged(this->index(row, 0), this->index(row, this->columnCount() - 1)); + if (rowEnd == -1) rowEnd = rowStart; + emit dataChanged(this->index(rowStart, 0), this->index(rowEnd, this->columnCount() - 1)); } } diff --git a/src/modlist.h b/src/modlist.h index a0b6e841..99f43b5c 100644 --- a/src/modlist.h +++ b/src/modlist.h @@ -91,7 +91,7 @@ public: */ void removeRowForce(int row); - void notifyChange(int row); + void notifyChange(int rowStart, int rowEnd = -1); static QString getColumnName(int column); diff --git a/src/modlistsortproxy.cpp b/src/modlistsortproxy.cpp index 17dca5fc..ede83659 100644 --- a/src/modlistsortproxy.cpp +++ b/src/modlistsortproxy.cpp @@ -157,16 +157,12 @@ bool ModListSortProxy::lessThan(const QModelIndex &left, case ModList::COL_MODID: lt = leftMod->getNexusID() < rightMod->getNexusID(); break; case ModList::COL_VERSION: lt = leftMod->getVersion() < rightMod->getVersion(); break; case ModList::COL_PRIORITY: { - if (m_Profile != NULL) { - int leftPrio = leftMod->getFixedPriority(); - int rightPrio = rightMod->getFixedPriority(); - if (leftPrio == INT_MIN) leftPrio = m_Profile->getModPriority(leftIndex); - if (rightPrio == INT_MIN) rightPrio = m_Profile->getModPriority(rightIndex); - - lt = leftPrio < rightPrio; - } else { - lt = leftMod->name() < rightMod->name(); - } + QVariant leftPrio = left.data(); + if (!leftPrio.isValid()) leftPrio = left.data(Qt::UserRole); + QVariant rightPrio = right.data(); + if (!rightPrio.isValid()) rightPrio = right.data(Qt::UserRole); + + return leftPrio.toInt() < rightPrio.toInt(); } break; } return lt; diff --git a/src/qtgroupingproxy.cpp b/src/qtgroupingproxy.cpp index 3ecb2a72..3891cc12 100644 --- a/src/qtgroupingproxy.cpp +++ b/src/qtgroupingproxy.cpp @@ -488,7 +488,7 @@ QtGroupingProxy::data( const QModelIndex &index, int role ) const default: { QModelIndex parentIndex = this->index( row, 0, index.parent() ); if (m_groupHash.value( row ).count() > 0) { - return this->index(0, 0, parentIndex).data(role); + return this->index(0, column, parentIndex).data(role); } else { return QVariant(); } -- cgit v1.3.1 From 1606c1366f5d0ba304334b0e57680fb99feb88b9 Mon Sep 17 00:00:00 2001 From: Tannin Date: Wed, 5 Jun 2013 09:51:48 +0200 Subject: - install plugins now get a chance to update name, version and modid of mods - NCC now makes name, version and modid from the info.xml file available to the installer - integrated fomod installer also uses version and modid from the info.xml - mods can now be renamed during installation - configurator plugin now highlights changed keys and saves changes --- src/installationmanager.cpp | 7 +++---- src/mainwindow.cpp | 16 ++++++++++------ src/modinfo.cpp | 25 ++++++++++++++++--------- src/modinfo.h | 12 ------------ 4 files changed, 29 insertions(+), 31 deletions(-) (limited to 'src/mainwindow.cpp') diff --git a/src/installationmanager.cpp b/src/installationmanager.cpp index 98a8a760..75ab11a3 100644 --- a/src/installationmanager.cpp +++ b/src/installationmanager.cpp @@ -68,7 +68,7 @@ template T resolveFunction(QLibrary &lib, const char *name) InstallationManager::InstallationManager(QWidget *parent) : QObject(parent), m_ParentWidget(parent), - m_InstallationProgress(parent), m_SupportedExtensions() //boost::assign::list_of("zip")("rar")("7z")("fomod") + m_InstallationProgress(parent), m_SupportedExtensions(boost::assign::list_of("zip")("rar")("7z")("fomod")) { QLibrary archiveLib("dlls\\archive.dll"); if (!archiveLib.load()) { @@ -695,10 +695,9 @@ bool InstallationManager::install(const QString &fileName, GuessedValue try { { // simple case IPluginInstallerSimple *installerSimple = dynamic_cast(installer); - if ((installerSimple != NULL) && (filesTree != NULL) && (installer->isArchiveSupported(*filesTree))) { - installResult = installerSimple->install(modName, *filesTree); + installResult = installerSimple->install(modName, *filesTree, version, modID); if (installResult == IPluginInstaller::RESULT_SUCCESS) { mapToArchive(filesTree); // the simple installer only prepares the installation, the rest works the same for all installers @@ -716,7 +715,7 @@ bool InstallationManager::install(const QString &fileName, GuessedValue ((filesTree == NULL) && installerCustom->isArchiveSupported(fileName)))) { std::set installerExtensions = installerCustom->supportedExtensions(); if (installerExtensions.find(fileInfo.suffix()) != installerExtensions.end()) { - installResult = installerCustom->install(modName, fileName); + installResult = installerCustom->install(modName, fileName, version, modID); } } } diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 5cbfa72a..fb88bbad 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -967,13 +967,17 @@ bool MainWindow::registerPlugin(QObject *plugin) if (verifyPlugin(proxy)) { QStringList pluginNames = proxy->pluginList(QCoreApplication::applicationDirPath() + "/" + ToQString(AppConfig::pluginPath())); foreach (const QString &pluginName, pluginNames) { - QObject *proxiedPlugin = proxy->instantiate(pluginName); - if (proxiedPlugin != NULL) { - if (registerPlugin(proxiedPlugin)) { - qDebug("loaded plugin \"%s\"", pluginName.toUtf8().constData()); - } else { - qWarning("plugin \"%s\" failed to load", pluginName.toUtf8().constData()); + try { + QObject *proxiedPlugin = proxy->instantiate(pluginName); + if (proxiedPlugin != NULL) { + if (registerPlugin(proxiedPlugin)) { + qDebug("loaded plugin \"%s\"", pluginName.toUtf8().constData()); + } else { + qWarning("plugin \"%s\" failed to load", pluginName.toUtf8().constData()); + } } + } catch (const std::exception &e) { + reportError(tr("failed to init plugin %1: %2").arg(pluginName).arg(e.what())); } } return true; diff --git a/src/modinfo.cpp b/src/modinfo.cpp index a08a4ccd..e3e0487b 100644 --- a/src/modinfo.cpp +++ b/src/modinfo.cpp @@ -509,6 +509,7 @@ bool ModInfoRegular::setName(const QString &name) QString newPath = m_Path.mid(0).replace(m_Path.length() - m_Name.length(), m_Name.length(), name); QDir modDir(m_Path.mid(0, m_Path.length() - m_Name.length())); + if (m_Name.compare(name, Qt::CaseInsensitive) == 0) { QString tempName = name; tempName.append("_temp"); @@ -524,23 +525,29 @@ bool ModInfoRegular::setName(const QString &name) return false; } } else { - if (!modDir.rename(m_Name, name)) { + if (!shellRename(modDir.absoluteFilePath(m_Name), modDir.absoluteFilePath(name))) { + qCritical("failed to rename mod %s (errorcode %d)", + qPrintable(name), ::GetLastError()); return false; } } std::map::iterator nameIter = s_ModsByName.find(m_Name); - unsigned int index = nameIter->second; - s_ModsByName.erase(nameIter); - - m_Name = name; - m_Path = newPath; + if (nameIter != s_ModsByName.end()) { + unsigned int index = nameIter->second; + s_ModsByName.erase(nameIter); - s_ModsByName[m_Name] = index; + m_Name = name; + m_Path = newPath; - std::sort(s_Collection.begin(), s_Collection.end(), ByName); + s_ModsByName[m_Name] = index; - updateIndices(); + std::sort(s_Collection.begin(), s_Collection.end(), ByName); + updateIndices(); + } else { // otherwise mod isn't registered yet? + m_Name = name; + m_Path = newPath; + } return true; } diff --git a/src/modinfo.h b/src/modinfo.h index faf33f0d..a261296b 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -214,18 +214,6 @@ public: **/ virtual void setCategory(int categoryID, bool active) = 0; - /** - * @brief set the name of this mod - * - * set the name of this mod. This will also update the name of the - * directory that contains this mod - * - * @param name new name of the mod - * @return true on success, false if the new name can't be used (i.e. because the new - * directory name wouldn't be valid) - **/ - virtual bool setName(const QString &name) = 0; - /** * @brief change the notes (manually set information) for this mod * @param notes new notes -- cgit v1.3.1