/* Copyright (C) 2012 Sebastian Herbord. All rights reserved. This file is part of Mod Organizer. Mod Organizer is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Mod Organizer is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Mod Organizer. If not, see . */ #include "executableslist.h" #include "iplugingame.h" #include "utility.h" #include #include #include #include using namespace MOBase; ExecutablesList::ExecutablesList() {} ExecutablesList::~ExecutablesList() {} void ExecutablesList::init(IPluginGame const* game) { Q_ASSERT(game != nullptr); m_Executables.clear(); for (const ExecutableInfo& info : game->executables()) { if (info.isValid()) { addExecutableInternal(info.title(), info.binary().absoluteFilePath(), info.arguments().join(" "), info.workingDirectory().absolutePath(), info.steamAppID()); } } } void ExecutablesList::getExecutables(std::vector::iterator& begin, std::vector::iterator& end) { begin = m_Executables.begin(); end = m_Executables.end(); } void ExecutablesList::getExecutables(std::vector::const_iterator& begin, std::vector::const_iterator& end) const { begin = m_Executables.begin(); end = m_Executables.end(); } const Executable& ExecutablesList::find(const QString& title) const { for (Executable const& exe : m_Executables) { if (exe.m_Title == title) { return exe; } } throw std::runtime_error(QString("invalid name %1").arg(title).toLocal8Bit().constData()); } Executable& ExecutablesList::find(const QString& title) { for (Executable& exe : m_Executables) { if (exe.m_Title == title) { return exe; } } throw std::runtime_error(QString("invalid executable name %1").arg(title).toLocal8Bit().constData()); } Executable& ExecutablesList::findByBinary(const QFileInfo& info) { for (Executable& exe : m_Executables) { if (info == exe.m_BinaryInfo) { return exe; } } throw std::runtime_error("invalid info"); } std::vector::iterator ExecutablesList::findExe(const QString& title) { for (std::vector::iterator iter = m_Executables.begin(); iter != m_Executables.end(); ++iter) { if (iter->m_Title == title) { return iter; } } return m_Executables.end(); } bool ExecutablesList::titleExists(const QString& title) const { auto test = [&](const Executable& exe) { return exe.m_Title == title; }; return std::find_if(m_Executables.begin(), m_Executables.end(), test) != m_Executables.end(); } void ExecutablesList::addExecutable(const Executable& executable) { auto existingExe = findExe(executable.m_Title); if (existingExe != m_Executables.end()) { *existingExe = executable; } else { m_Executables.push_back(executable); } } void ExecutablesList::updateExecutable(const QString& title, const QString& executableName, const QString& arguments, const QString& workingDirectory, const QString& steamAppID, Executable::Flags mask, Executable::Flags flags) { QFileInfo file(executableName); auto existingExe = findExe(title); flags &= mask; if (existingExe != m_Executables.end()) { existingExe->m_Title = title; existingExe->m_Flags &= ~mask; existingExe->m_Flags |= flags; // for pre-configured executables don't overwrite settings we didn't store if (flags & Executable::CustomExecutable) { if (file.exists()) { // don't overwrite a valid binary with an invalid one existingExe->m_BinaryInfo = file; } existingExe->m_Arguments = arguments; existingExe->m_WorkingDirectory = workingDirectory; existingExe->m_SteamAppID = steamAppID; } } else { Executable newExe; newExe.m_Title = title; newExe.m_BinaryInfo = file; newExe.m_Arguments = arguments; newExe.m_WorkingDirectory = workingDirectory; newExe.m_SteamAppID = steamAppID; newExe.m_Flags = Executable::CustomExecutable | flags; m_Executables.push_back(newExe); } } void ExecutablesList::remove(const QString& title) { for (std::vector::iterator iter = m_Executables.begin(); iter != m_Executables.end(); ++iter) { if (iter->isCustom() && (iter->m_Title == title)) { m_Executables.erase(iter); break; } } } void ExecutablesList::addExecutableInternal(const QString& title, const QString& executableName, const QString& arguments, const QString& workingDirectory, const QString& steamAppID) { QFileInfo file(executableName); if (file.exists()) { Executable newExe; newExe.m_BinaryInfo = file; newExe.m_Title = title; newExe.m_Arguments = arguments; newExe.m_WorkingDirectory = workingDirectory; newExe.m_SteamAppID = steamAppID; newExe.m_Flags = Executable::UseApplicationIcon; m_Executables.push_back(newExe); } } void Executable::showOnToolbar(bool state) { if (state) { m_Flags |= ShowInToolbar; } else { m_Flags &= ~ShowInToolbar; } }