diff options
| author | Tannin <devnull@localhost> | 2014-09-08 20:37:23 +0200 |
|---|---|---|
| committer | Tannin <devnull@localhost> | 2014-09-08 20:37:23 +0200 |
| commit | 482f13a50b921e61d34d09f72a7fb4216efe742b (patch) | |
| tree | 780120e8b7691645fe6d4a0394843032df279548 /src/mainwindow.cpp | |
| parent | cc42e76f54a37a0af9704f3966fdb48625686c24 (diff) | |
- re-enabled building of loot_cli and started developing against the new api
- extended set of default categories
- more tolerand bbcode parser
- added a few colors for the bbcode parser
- more fixes to qt5 compatibility
- started work on ability to unloading (and thus re-loading) of plugins
- names of plugins are no longer localizable (because those names are also used to store settings)
- added settings to disable individual diagnosis settings
- path of dependencies is now configured in a .pri file instead of environment variablees
- bugfix: if the modid-input is canceled, the id was saved as -1 and wasn't re-requested from the user
- bugfix: moving files with the SHFileOperation-Api didn't update the vfs correctly (still not perfect but better)
- bugfix: attempt to remove the deleter-file seems to have caused error messages for some users
- bugfix: fixed a couple of cases that might have caused the tutorial to hang
Diffstat (limited to 'src/mainwindow.cpp')
| -rw-r--r-- | src/mainwindow.cpp | 77 |
1 files changed, 57 insertions, 20 deletions
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 0d9fad5d..984d8cfd 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -97,9 +97,6 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. #include <QtPlugin>
#include <QIdentityProxyModel>
#include <QClipboard>
-#include <boost/bind.hpp>
-#include <boost/foreach.hpp>
-#include <boost/assign.hpp>
#include <Psapi.h>
#include <shlobj.h>
#include <ShellAPI.h>
@@ -114,8 +111,13 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. #include <QCoreApplication>
#include <QProgressDialog>
#include <scopeguard.h>
+#ifndef Q_MOC_RUN
#include <boost/thread.hpp>
#include <boost/algorithm/string.hpp>
+#include <boost/bind.hpp>
+#include <boost/foreach.hpp>
+#include <boost/assign.hpp>
+#endif
#include <regex>
#ifdef TEST_MODELS
@@ -313,8 +315,6 @@ MainWindow::MainWindow(const QString &exeName, QSettings &initSettings, QWidget connect(&m_Updater, SIGNAL(updateAvailable()), this, SLOT(updateAvailable()));
connect(&m_Updater, SIGNAL(motdAvailable(QString)), this, SLOT(motdReceived(QString)));
-// connect(ExitProxy::instance(), SIGNAL(exit()), this, SLOT(close()));
-
connect(NexusInterface::instance()->getAccessManager(), SIGNAL(loginSuccessful(bool)), this, SLOT(loginSuccessful(bool)));
connect(NexusInterface::instance()->getAccessManager(), SIGNAL(loginFailed(QString)), this, SLOT(loginFailed(QString)));
connect(NexusInterface::instance(), SIGNAL(requestNXMDownload(QString)), this, SLOT(downloadRequestedNXM(QString)));
@@ -367,6 +367,8 @@ MainWindow::MainWindow(const QString &exeName, QSettings &initSettings, QWidget MainWindow::~MainWindow()
{
+ m_AboutToRun.disconnect_all_slots();
+ m_ModInstalled.disconnect_all_slots();
m_RefresherThread.exit();
m_RefresherThread.wait();
m_IntegratedBrowser.close();
@@ -888,6 +890,8 @@ void MainWindow::closeEvent(QCloseEvent* event) storeSettings();
+// unloadPlugins();
+
// profile has to be cleaned up before the modinfo-buffer is cleared
delete m_CurrentProfile;
m_CurrentProfile = NULL;
@@ -895,6 +899,7 @@ void MainWindow::closeEvent(QCloseEvent* event) ModInfo::clear();
LogBuffer::cleanQuit();
m_ModList.setProfile(NULL);
+ NexusInterface::instance()->cleanup();
}
@@ -1175,7 +1180,9 @@ bool MainWindow::registerPlugin(QObject *plugin, const QString &fileName) IPluginDiagnose *diagnose = qobject_cast<IPluginDiagnose*>(plugin);
if (diagnose != NULL) {
m_DiagnosisPlugins.push_back(diagnose);
- diagnose->onInvalidated([&] () { this->scheduleUpdateButton(); });
+ m_DiagnosisConnections.push_back(
+ diagnose->onInvalidated([&] () { this->scheduleUpdateButton(); })
+ );
}
}
{ // mod page plugin
@@ -1204,6 +1211,7 @@ bool MainWindow::registerPlugin(QObject *plugin, const QString &fileName) IPluginPreview *preview = qobject_cast<IPluginPreview*>(plugin);
if (verifyPlugin(preview)) {
m_PreviewGenerator.registerPlugin(preview);
+ return true;
}
}
{ // proxy plugins
@@ -1242,13 +1250,41 @@ bool MainWindow::registerPlugin(QObject *plugin, const QString &fileName) return false;
}
-
-void MainWindow::loadPlugins()
+void MainWindow::unloadPlugins()
{
+ // disconnect all slots before unloading plugins so plugins don't have to take care of that
+ m_AboutToRun.disconnect_all_slots();
+ m_ModInstalled.disconnect_all_slots();
+ m_ModList.disconnectSlots();
+ m_PluginList.disconnectSlots();
+
m_DiagnosisPlugins.clear();
+ foreach (const boost::signals2::connection &connection, m_DiagnosisConnections) {
+ connection.disconnect();
+ }
+ m_DiagnosisConnections.clear();
+
m_Settings.clearPlugins();
+ if (ui->actionTool->menu() != NULL) {
+ ui->actionTool->menu()->clear();
+ }
+
+ foreach (QPluginLoader *loader, m_PluginLoaders) {
+ qDebug("unloading %s", qPrintable(loader->fileName()));
+ if (!loader->unload()) {
+ qDebug("failed to unload %s: %s", qPrintable(loader->fileName()), qPrintable(loader->errorString()));
+ }
+ delete loader;
+ }
+ m_PluginLoaders.clear();
+}
+
+void MainWindow::loadPlugins()
+{
+ unloadPlugins();
+
foreach (QObject *plugin, QPluginLoader::staticInstances()) {
registerPlugin(plugin, "");
}
@@ -1287,14 +1323,15 @@ void MainWindow::loadPlugins() loadCheck.flush();
QString pluginName = iter.filePath();
if (QLibrary::isLibrary(pluginName)) {
- QPluginLoader pluginLoader(pluginName);
- if (pluginLoader.instance() == NULL) {
+ QPluginLoader *pluginLoader = new QPluginLoader(pluginName, this);
+ if (pluginLoader->instance() == NULL) {
m_UnloadedPlugins.push_back(pluginName);
qCritical("failed to load plugin %s: %s",
- qPrintable(pluginName), qPrintable(pluginLoader.errorString()));
+ qPrintable(pluginName), qPrintable(pluginLoader->errorString()));
} else {
- if (registerPlugin(pluginLoader.instance(), pluginName)) {
+ if (registerPlugin(pluginLoader->instance(), pluginName)) {
qDebug("loaded plugin \"%s\"", qPrintable(pluginName));
+ m_PluginLoaders.push_back(pluginLoader);
} else {
m_UnloadedPlugins.push_back(pluginName);
qWarning("plugin \"%s\" failed to load", qPrintable(pluginName));
@@ -2214,6 +2251,8 @@ void MainWindow::storeSettings() void MainWindow::on_btnRefreshData_clicked()
{
if (!m_DirectoryUpdate) {
+ // save the mod list so changes don't get lost
+ m_CurrentProfile->writeModlistNow(true);
refreshDirectoryStructure();
} else {
qDebug("directory update");
@@ -4315,13 +4354,10 @@ void MainWindow::downloadRequested(QNetworkReply *reply, int modID, const QStrin void MainWindow::installTranslator(const QString &name)
{
-/* if (m_CurrentLanguage == "en_US") {
- return;
- }*/
QTranslator *translator = new QTranslator(this);
QString fileName = name + "_" + m_CurrentLanguage;
if (!translator->load(fileName, qApp->applicationDirPath() + "/translations")) {
- if (m_CurrentLanguage != "en-US") {
+ if ((m_CurrentLanguage != "en-US") && (m_CurrentLanguage != "en_US")) {
qWarning("localization file %s not found", qPrintable(fileName));
} // we don't actually expect localization files for english
}
@@ -4485,7 +4521,7 @@ int MainWindow::getBinaryExecuteInfo(const QFileInfo &targetInfo, if (::FindExecutableW(targetPathW.c_str(), NULL, buffer) > (HINSTANCE)32) {
DWORD binaryType = 0UL;
if (!::GetBinaryTypeW(targetPathW.c_str(), &binaryType)) {
- qDebug("failed to determine binary type: %lu", ::GetLastError());
+ qDebug("failed to determine binary type of \"%ls\": %lu", targetPathW.c_str(), ::GetLastError());
} else if (binaryType == SCS_32BIT_BINARY) {
binaryPath = ToQString(buffer);
}
@@ -5088,9 +5124,6 @@ void MainWindow::on_bsaList_itemChanged(QTreeWidgetItem*, int) void MainWindow::on_actionProblems_triggered()
{
-// QString problemDescription;
-// checkForProblems(problemDescription);
-// QMessageBox::information(this, tr("Problems"), problemDescription);
ProblemsDialog problems(m_DiagnosisPlugins, this);
if (problems.hasProblems()) {
problems.exec();
@@ -5594,7 +5627,11 @@ void MainWindow::on_bossButton_clicked() QStringList temp = report.split("?");
QUrl url = QUrl::fromLocalFile(temp.at(0));
if (temp.size() > 1) {
+#if QT_VERSION >= 0x050000
+ url.setQuery(temp.at(1).toUtf8());
+#else
url.setEncodedQuery(temp.at(1).toUtf8());
+#endif
}
m_IntegratedBrowser.openUrl(url);
}
|
