diff options
| author | Tannin <devnull@localhost> | 2013-10-11 23:04:44 +0200 |
|---|---|---|
| committer | Tannin <devnull@localhost> | 2013-10-11 23:04:44 +0200 |
| commit | f22bb9d6a6249e6789353903d9e51318ce8340af (patch) | |
| tree | ddc759a5427d2c11020fb5f2a256a461fa30c2c2 /src | |
| parent | 54c7131a5e2fa282369e25344ac190d51676c383 (diff) | |
| parent | 382226bb46541f07e62ce689cfeaf395aa673a44 (diff) | |
Merge
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.cpp | 2 | ||||
| -rw-r--r-- | src/mainwindow.cpp | 87 | ||||
| -rw-r--r-- | src/mainwindow.h | 10 | ||||
| -rw-r--r-- | src/organizer.pro | 4 | ||||
| -rw-r--r-- | src/pluginlist.cpp | 2 | ||||
| -rw-r--r-- | src/settings.cpp | 1 | ||||
| -rw-r--r-- | src/shared/directoryentry.cpp | 6 | ||||
| -rw-r--r-- | src/shared/directoryentry.h | 1 |
8 files changed, 103 insertions, 10 deletions
diff --git a/src/main.cpp b/src/main.cpp index 7c2a9b0e..59a4e837 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -469,7 +469,7 @@ int main(int argc, char *argv[]) arguments.removeFirst(); // remove application name (ModOrganizer.exe) arguments.removeFirst(); // remove binary name // pass the remaining parameters to the binary - mainWindow.spawnProgram(exeName, arguments.join(" "), selectedProfileName, QDir()); + mainWindow.startApplication(exeName, arguments, QString(), selectedProfileName); return 0; } diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 33dc75ed..7ef2dab6 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1276,10 +1276,15 @@ HANDLE MainWindow::spawnBinaryDirect(const QFileInfo &binary, const QString &arg QCoreApplication::processEvents(); } - return startBinary(binary, arguments, profileName, m_Settings.logLevel(), currentDirectory, true); + if (m_AboutToRun(binary.absoluteFilePath())) { + return startBinary(binary, arguments, profileName, m_Settings.logLevel(), currentDirectory, true); + } else { + qDebug("start of \"%s\" canceled by plugin", qPrintable(binary.absoluteFilePath())); + return INVALID_HANDLE_VALUE; + } } - +/* void MainWindow::spawnProgram(const QString &fileName, const QString &argumentsArg, const QString &profileName, const QDir ¤tDirectory) { @@ -1299,7 +1304,7 @@ void MainWindow::spawnProgram(const QString &fileName, const QString &argumentsA } spawnBinaryDirect(binary, arguments, profileName, currentDirectory, steamAppID); } - +*/ void MainWindow::spawnBinary(const QFileInfo &binary, const QString &arguments, const QDir ¤tDirectory, bool closeAfterStart, const QString &steamAppID) { @@ -1895,7 +1900,6 @@ void MainWindow::activateProxy(bool activate) busyDialog.hide(); } - void MainWindow::readSettings() { QSettings settings(ToQString(GameInfo::instance().getIniFilename()), QSettings::IniFormat); @@ -2053,11 +2057,86 @@ QString MainWindow::resolvePath(const QString &fileName) const } } +QStringList MainWindow::listDirectories(const QString &directoryName) const +{ + QStringList result; + DirectoryEntry *dir = m_DirectoryStructure->findSubDirectoryRecursive(ToWString(directoryName)); + if (dir != NULL) { + std::vector<DirectoryEntry*>::iterator current, end; + dir->getSubDirectories(current, end); + for (; current != end; ++current) { + result.append(ToQString((*current)->getName())); + } + } + return result; +} + +QStringList MainWindow::findFiles(const QString &path, const std::function<bool(const QString&)> &filter) const +{ + QStringList result; + DirectoryEntry *dir = m_DirectoryStructure->findSubDirectoryRecursive(ToWString(path)); + if (dir != NULL) { + std::vector<FileEntry::Ptr> files = dir->getFiles(); + foreach (FileEntry::Ptr file, files) { + if (filter(ToQString(file->getName()))) { + result.append(ToQString(file->getFullPath())); + } + } + } else { + qWarning("directory %s not found", qPrintable(path)); + } + return result; +} + IDownloadManager *MainWindow::downloadManager() { return &m_DownloadManager; } +HANDLE MainWindow::startApplication(const QString &executable, const QStringList &args, const QString &cwd, const QString &profile) +{ + QFileInfo binary; + QString arguments = args.join(" "); + QString currentDirectory = cwd; + QString profileName = (profile.length() > 0) ? profile : m_CurrentProfile->getName(); + QString steamAppID; + if (executable.contains('\\') || executable.contains('/')) { + // file path + binary = QFileInfo(executable); + if (binary.isRelative()) { + // relative path, should be relative to game directory + binary = QFileInfo(QDir::fromNativeSeparators(ToQString(GameInfo::instance().getGameDirectory())) + "/" + executable); + } + if (cwd.length() == 0) { + currentDirectory = binary.absolutePath(); + } + } else { + // only a file name, search executables list + try { + const Executable &exe = m_ExecutablesList.find(executable); + steamAppID = exe.m_SteamAppID; + if (arguments == "") { + arguments = exe.m_Arguments; + } + binary = exe.m_BinaryInfo; + if (cwd.length() == 0) { + currentDirectory = exe.m_WorkingDirectory; + } + } catch (const std::runtime_error&) { + qWarning("\"%s\" not set up as executable", executable.toUtf8().constData()); + return INVALID_HANDLE_VALUE; + } + } + + return spawnBinaryDirect(binary, arguments, profileName, currentDirectory, steamAppID); +} + +bool MainWindow::onAboutToRun(const boost::function<bool (const QString &)> &func) +{ + auto conn = m_AboutToRun.connect(func); + return conn.connected(); +} + std::vector<unsigned int> MainWindow::activeProblems() const { std::vector<unsigned int> problems; diff --git a/src/mainwindow.h b/src/mainwindow.h index ad4ed82e..fab850cf 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -89,8 +89,8 @@ public: void createFirstProfile(); - void spawnProgram(const QString &fileName, const QString &argumentsArg, - const QString &profileName, const QDir ¤tDirectory); +/* void spawnProgram(const QString &fileName, const QString &argumentsArg, + const QString &profileName, const QDir ¤tDirectory);*/ void loadPlugins(); @@ -111,7 +111,11 @@ public: virtual QString pluginDataPath() const; virtual void installMod(const QString &fileName); virtual QString resolvePath(const QString &fileName) const; + virtual QStringList listDirectories(const QString &directoryName) const; + virtual QStringList findFiles(const QString &path, const std::function<bool(const QString &)> &filter) const; virtual MOBase::IDownloadManager *downloadManager(); + virtual HANDLE startApplication(const QString &executable, const QStringList &args = QStringList(), const QString &cwd = "", const QString &profile = ""); + virtual bool onAboutToRun(const boost::function<bool(const QString&)> &func); virtual std::vector<unsigned int> activeProblems() const; virtual QString shortDescription(unsigned int key) const; @@ -320,6 +324,8 @@ private: QFile m_PluginsCheck; + SignalAboutToRunApplication m_AboutToRun; + private slots: void showMessage(const QString &message); diff --git a/src/organizer.pro b/src/organizer.pro index a9353361..c817f2da 100644 --- a/src/organizer.pro +++ b/src/organizer.pro @@ -199,8 +199,8 @@ CONFIG(debug, debug|release) { QMAKE_LFLAGS += /DEBUG
}
-QMAKE_CXXFLAGS_WARN_ON -= -W3
-QMAKE_CXXFLAGS_WARN_ON += -W4
+#QMAKE_CXXFLAGS_WARN_ON -= -W3
+#QMAKE_CXXFLAGS_WARN_ON += -W4
QMAKE_CXXFLAGS += -wd4127 -wd4512 -wd4189
CONFIG += embed_manifest_exe
diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index e730d3f4..55f8a39e 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -953,7 +953,7 @@ PluginList::ESPInfo::ESPInfo(const QString &name, bool enabled, FILETIME time, c m_Masters.insert(QString(iter->c_str())); } } catch (const std::exception &e) { - reportError(tr("failed to parse esp file %1: %2").arg(fullPath).arg(e.what())); + qCritical("failed to parse esp file %s: %s", qPrintable(fullPath), e.what()); m_IsMaster = false; } } diff --git a/src/settings.cpp b/src/settings.cpp index 42a8d693..4f301b0c 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -105,6 +105,7 @@ bool Settings::pluginBlacklisted(const QString &fileName) const void Settings::registerPlugin(IPlugin *plugin) { m_Plugins.push_back(plugin); + m_PluginSettings.insert(plugin->name(), QMap<QString, QVariant>()); foreach (const PluginSetting &setting, plugin->settings()) { QVariant temp = m_Settings.value("Plugins/" + plugin->name() + "/" + setting.key, setting.defaultValue); if (!temp.convert(setting.defaultValue.type())) { diff --git a/src/shared/directoryentry.cpp b/src/shared/directoryentry.cpp index 8380181f..b3a12498 100644 --- a/src/shared/directoryentry.cpp +++ b/src/shared/directoryentry.cpp @@ -746,6 +746,12 @@ DirectoryEntry *DirectoryEntry::findSubDirectory(const std::wstring &name) const }
+DirectoryEntry *DirectoryEntry::findSubDirectoryRecursive(const std::wstring &path)
+{
+ return getSubDirectoryRecursive(path, false, -1);
+}
+
+
const FileEntry::Ptr DirectoryEntry::findFile(const std::wstring &name)
{
auto iter = m_Files.find(name);
diff --git a/src/shared/directoryentry.h b/src/shared/directoryentry.h index 498ebfe1..1ad9816c 100644 --- a/src/shared/directoryentry.h +++ b/src/shared/directoryentry.h @@ -227,6 +227,7 @@ public: }
DirectoryEntry *findSubDirectory(const std::wstring &name) const;
+ DirectoryEntry *findSubDirectoryRecursive(const std::wstring &path);
/** retrieve a file in this directory by name.
* @param name name of the file
|
