1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-02-21 15:39:41 +00:00

Merge remote branch 'lgro/config' into next

This commit is contained in:
Marc Zinnschlag 2011-09-06 09:57:17 +02:00
commit 79a95bea83
11 changed files with 97 additions and 83 deletions

View file

@ -127,7 +127,7 @@ DataFilesPage::DataFilesPage(QWidget *parent) : QWidget(parent)
void DataFilesPage::setupDataFiles(const QStringList &paths, bool strict) void DataFilesPage::setupDataFiles(const QStringList &paths, bool strict)
{ {
// Put the paths in a boost::filesystem vector to use with Files::Collections // Put the paths in a boost::filesystem vector to use with Files::Collections
std::vector<boost::filesystem::path> dataDirs; Files::PathContainer dataDirs;
foreach (const QString &currentPath, paths) { foreach (const QString &currentPath, paths) {
dataDirs.push_back(boost::filesystem::path(currentPath.toStdString())); dataDirs.push_back(boost::filesystem::path(currentPath.toStdString()));
@ -142,8 +142,8 @@ void DataFilesPage::setupDataFiles(const QStringList &paths, bool strict)
for (Files::MultiDirCollection::TIter iter(esm.begin()); iter!=esm.end(); ++iter) for (Files::MultiDirCollection::TIter iter(esm.begin()); iter!=esm.end(); ++iter)
{ {
std::string filename = boost::filesystem::path (iter->second.filename()).string(); QString currentMaster = QString::fromStdString(
QString currentMaster = QString::fromStdString(filename); boost::filesystem::path (iter->second.filename()).string());
const QList<QTableWidgetItem*> itemList = mMastersWidget->findItems(currentMaster, Qt::MatchExactly); const QList<QTableWidgetItem*> itemList = mMastersWidget->findItems(currentMaster, Qt::MatchExactly);
@ -164,7 +164,7 @@ void DataFilesPage::setupDataFiles(const QStringList &paths, bool strict)
ESMReader fileReader; ESMReader fileReader;
QStringList availableMasters; // Will contain all found masters QStringList availableMasters; // Will contain all found masters
fileReader.setEncoding("win1252"); fileReader.setEncoding("win1252"); // FIXME: This should be configurable!
fileReader.open(iter->second.string()); fileReader.open(iter->second.string());
// First we fill the availableMasters and the mMastersWidget // First we fill the availableMasters and the mMastersWidget
@ -190,8 +190,8 @@ void DataFilesPage::setupDataFiles(const QStringList &paths, bool strict)
// Now we put the current plugin in the mDataFilesModel under its masters // Now we put the current plugin in the mDataFilesModel under its masters
QStandardItem *parent = new QStandardItem(availableMasters.join(",")); QStandardItem *parent = new QStandardItem(availableMasters.join(","));
std::string filename = boost::filesystem::path (iter->second.filename()).string(); QStandardItem *child = new QStandardItem(QString::fromStdString(
QStandardItem *child = new QStandardItem(QString::fromStdString(std::string(filename))); boost::filesystem::path (iter->second.filename()).string()));
const QList<QStandardItem*> masterList = mDataFilesModel->findItems(availableMasters.join(",")); const QList<QStandardItem*> masterList = mDataFilesModel->findItems(availableMasters.join(","));

View file

@ -147,37 +147,19 @@ void GraphicsPage::createPages()
void GraphicsPage::setupConfig() void GraphicsPage::setupConfig()
{ {
QString ogreCfg = (mCfg.getRuntimeConfigPath() / "ogre.cfg").string().c_str(); QString ogreCfg = mCfg.getOgreConfigPath().string().c_str();
QFile file(ogreCfg); QFile file(ogreCfg);
if (!file.exists()) {
ogreCfg = QString::fromStdString((mCfg.getLocalConfigPath() / "ogre.cfg").string());
}
mOgreConfig = new QSettings(ogreCfg, QSettings::IniFormat); mOgreConfig = new QSettings(ogreCfg, QSettings::IniFormat);
} }
void GraphicsPage::setupOgre() void GraphicsPage::setupOgre()
{ {
QString pluginCfg = (mCfg.getRuntimeConfigPath() / "plugins.cfg").string().c_str(); QString pluginCfg = mCfg.getPluginsConfigPath().string().c_str();
QFile file(pluginCfg); QFile file(pluginCfg);
if (!file.exists()) {
pluginCfg = QString::fromStdString((mCfg.getLocalConfigPath() / "plugins.cfg").string());
}
// Reopen the file from user directory
file.setFileName(pluginCfg);
if (!file.exists()) {
// There's no plugins.cfg in the user directory, use global directory
pluginCfg = QString::fromStdString((mCfg.getGlobalConfigPath() / "plugins.cfg").string());
}
// Create a log manager so we can surpress debug text to stdout/stderr // Create a log manager so we can surpress debug text to stdout/stderr
Ogre::LogManager* logMgr = OGRE_NEW Ogre::LogManager; Ogre::LogManager* logMgr = OGRE_NEW Ogre::LogManager;
logMgr->createLog("launcherOgre.log", true, false, false); logMgr->createLog((mCfg.getLogPath().string() + "/launcherOgre.log"), true, false, false);
try try
{ {
@ -475,4 +457,4 @@ void GraphicsPage::rendererChanged(const QString &renderer)
} }
mSelectedRenderSystem = mOgre->getRenderSystemByName(renderer.toStdString()); mSelectedRenderSystem = mOgre->getRenderSystemByName(renderer.toStdString());
} }

View file

@ -252,9 +252,8 @@ void OMW::Engine::loadBSA()
Bsa::addBSA (iter->second.string()); Bsa::addBSA (iter->second.string());
} }
std::string m = mDataDir.string(); std::cout << "Data dir " << mDataDir.string() << std::endl;
std::cout << "Data dir" << m << "\n"; Bsa::addDir(mDataDir.string(), mFSStrict);
Bsa::addDir(m, mFSStrict);
} }
// add resources directory // add resources directory
@ -273,12 +272,11 @@ void OMW::Engine::enableFSStrict(bool fsStrict)
// Set data dir // Set data dir
void OMW::Engine::setDataDirs (const std::vector<boost::filesystem::path>& dataDirs) void OMW::Engine::setDataDirs (const Files::PathContainer& dataDirs)
{ {
/// \todo remove mDataDir, once resources system can handle multiple directories /// \todo remove mDataDir, once resources system can handle multiple directories
assert (!dataDirs.empty()); assert (!dataDirs.empty());
mDataDir = dataDirs[0]; mDataDir = dataDirs.back();
mFileCollections = Files::Collections (dataDirs, !mFSStrict); mFileCollections = Files::Collections (dataDirs, !mFSStrict);
} }
@ -327,25 +325,6 @@ void OMW::Engine::setNewGame(bool newGame)
mNewGame = newGame; mNewGame = newGame;
} }
std::string OMW::Engine::getOgreFilesDir(const std::string& ogreFile)
{
boost::filesystem::path cfgPath(mCfgMgr.getRuntimeConfigPath());
if (!boost::filesystem::exists(cfgPath / ogreFile))
{
cfgPath = mCfgMgr.getLocalConfigPath();
if (!boost::filesystem::exists(cfgPath / ogreFile ))
{
cfgPath = mCfgMgr.getGlobalConfigPath();
if (!boost::filesystem::exists(cfgPath / ogreFile))
{
cfgPath.clear();
}
}
}
return (!cfgPath.empty()) ? cfgPath.string() + std::string("/") : std::string();
}
// Initialise and enter main loop. // Initialise and enter main loop.
void OMW::Engine::go() void OMW::Engine::go()
@ -357,11 +336,10 @@ void OMW::Engine::go()
test.name = ""; test.name = "";
total = 0; total = 0;
mOgre.configure(!boost::filesystem::is_regular_file(mCfgMgr.getOgreConfigPath()),
std::string cfgDir(getOgreFilesDir("ogre.cfg")); mCfgMgr.getOgreConfigPath().string(),
std::string pluginsFile(getOgreFilesDir("plugins.cfg") + std::string("plugins.cfg")); mCfgMgr.getLogPath().string() + std::string("/"),
mCfgMgr.getPluginsConfigPath().string(), false);
mOgre.configure(cfgDir.empty(), cfgDir, pluginsFile, false);
// This has to be added BEFORE MyGUI is initialized, as it needs // This has to be added BEFORE MyGUI is initialized, as it needs
// to find core.xml here. // to find core.xml here.
@ -381,7 +359,9 @@ void OMW::Engine::go()
mResDir, mNewGame, mEnvironment, mEncoding); mResDir, mNewGame, mEnvironment, mEncoding);
// Set up the GUI system // Set up the GUI system
mGuiManager = new OEngine::GUI::MyGUIManager(mOgre.getWindow(), mOgre.getScene(), false, cfgDir); mGuiManager = new OEngine::GUI::MyGUIManager(mOgre.getWindow(), mOgre.getScene(), false,
mCfgMgr.getLogPath().string() + std::string("/"));
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::MWSkill>("Widget"); MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::MWSkill>("Widget");
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::MWAttribute>("Widget"); MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::MWAttribute>("Widget");
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::MWSpell>("Widget"); MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::MWSpell>("Widget");

View file

@ -115,7 +115,7 @@ namespace OMW
void enableFSStrict(bool fsStrict); void enableFSStrict(bool fsStrict);
/// Set data dirs /// Set data dirs
void setDataDirs(const Files::Collections::PathContainer& dataDirs); void setDataDirs(const Files::PathContainer& dataDirs);
/// Set resource dir /// Set resource dir
void setResourceDir(const boost::filesystem::path& parResDir); void setResourceDir(const boost::filesystem::path& parResDir);
@ -157,8 +157,6 @@ namespace OMW
void setEncoding(const std::string& encoding); void setEncoding(const std::string& encoding);
private: private:
std::string getOgreFilesDir(const std::string& ogreFile);
Cfg::ConfigurationManager& mCfgMgr; Cfg::ConfigurationManager& mCfgMgr;
}; };
} }

View file

@ -57,7 +57,7 @@ bool parseOptions (int argc, char** argv, OMW::Engine& engine, Cfg::Configuratio
desc.add_options() desc.add_options()
("help", "print help message") ("help", "print help message")
("version", "print version information and quit") ("version", "print version information and quit")
("data", bpo::value<Files::Collections::PathContainer>()->default_value(Files::Collections::PathContainer(), "data") ("data", bpo::value<Files::PathContainer>()->default_value(Files::PathContainer(), "data")
->multitoken(), "set data directories (later directories have higher priority)") ->multitoken(), "set data directories (later directories have higher priority)")
("data-local", bpo::value<std::string>()->default_value(""), ("data-local", bpo::value<std::string>()->default_value(""),
@ -109,12 +109,12 @@ bool parseOptions (int argc, char** argv, OMW::Engine& engine, Cfg::Configuratio
bpo::variables_map variables; bpo::variables_map variables;
cfgMgr.readConfiguration(variables, desc);
// Runtime options override settings from all configs // Runtime options override settings from all configs
bpo::store(valid_opts, variables); bpo::store(valid_opts, variables);
bpo::notify(variables); bpo::notify(variables);
cfgMgr.readConfiguration(variables, desc);
bool run = true; bool run = true;
if (variables.count ("help")) if (variables.count ("help"))
@ -153,17 +153,17 @@ bool parseOptions (int argc, char** argv, OMW::Engine& engine, Cfg::Configuratio
// directory settings // directory settings
engine.enableFSStrict(variables["fs-strict"].as<bool>()); engine.enableFSStrict(variables["fs-strict"].as<bool>());
Files::Collections::PathContainer dataDirs = variables["data"].as<Files::Collections::PathContainer>(); Files::PathContainer dataDirs(variables["data"].as<Files::PathContainer>());
std::string local(variables["data-local"].as<std::string>()); std::string local(variables["data-local"].as<std::string>());
if (!local.empty()) if (!local.empty())
{ {
dataDirs.push_back(local); dataDirs.push_back(Files::PathContainer::value_type(local));
} }
if (dataDirs.empty()) if (dataDirs.empty())
{ {
dataDirs.push_back(cfgMgr.getLocalDataPath().string()); dataDirs.push_back(cfgMgr.getLocalDataPath());
} }
engine.setDataDirs(dataDirs); engine.setDataDirs(dataDirs);

View file

@ -15,19 +15,47 @@ static const char* const pluginsCfgFile = "plugins.cfg";
ConfigurationManager::ConfigurationManager() ConfigurationManager::ConfigurationManager()
: mPath("openmw") : mPath("openmw")
{ {
/**
* According to task #168 plugins.cfg file shall be located in global
* configuration path or in runtime configuration path.
*/
mPluginsCfgPath = mPath.getGlobalConfigPath() / pluginsCfgFile;
if (!boost::filesystem::is_regular_file(mPluginsCfgPath))
{
mPluginsCfgPath = mPath.getRuntimeConfigPath() / pluginsCfgFile;
if (!boost::filesystem::is_regular_file(mPluginsCfgPath))
{
std::cerr << "Failed to find " << pluginsCfgFile << " file!" << std::endl;
mPluginsCfgPath.clear();
}
}
/**
* According to task #168 ogre.cfg file shall be located only
* in user configuration path.
*/
mOgreCfgPath = mPath.getLocalConfigPath() / ogreCfgFile;
mLogPath = mPath.getLocalConfigPath();
} }
ConfigurationManager::~ConfigurationManager() ConfigurationManager::~ConfigurationManager()
{ {
} }
void setupPath(const char* const cfgFile, boost::filesystem::path& path)
{
}
void ConfigurationManager::readConfiguration(boost::program_options::variables_map& variables, void ConfigurationManager::readConfiguration(boost::program_options::variables_map& variables,
boost::program_options::options_description& description) boost::program_options::options_description& description)
{ {
loadConfig(mPath.getGlobalConfigPath(), variables, description);
loadConfig(mPath.getLocalConfigPath(), variables, description); loadConfig(mPath.getLocalConfigPath(), variables, description);
boost::program_options::notify(variables);
loadConfig(mPath.getRuntimeConfigPath(), variables, description); loadConfig(mPath.getRuntimeConfigPath(), variables, description);
boost::program_options::notify(variables); boost::program_options::notify(variables);
loadConfig(mPath.getGlobalConfigPath(), variables, description);
boost::program_options::notify(variables);
} }
void ConfigurationManager::loadConfig(const boost::filesystem::path& path, void ConfigurationManager::loadConfig(const boost::filesystem::path& path,
@ -115,4 +143,19 @@ void ConfigurationManager::setRuntimeDataPath(const boost::filesystem::path& new
mPath.setRuntimeDataPath(newPath); mPath.setRuntimeDataPath(newPath);
} }
const boost::filesystem::path& ConfigurationManager::getOgreConfigPath() const
{
return mOgreCfgPath;
}
const boost::filesystem::path& ConfigurationManager::getPluginsConfigPath() const
{
return mPluginsCfgPath;
}
const boost::filesystem::path& ConfigurationManager::getLogPath() const
{
return mLogPath;
}
} /* namespace Cfg */ } /* namespace Cfg */

View file

@ -41,12 +41,20 @@ struct ConfigurationManager
const boost::filesystem::path& getRuntimeDataPath() const; const boost::filesystem::path& getRuntimeDataPath() const;
void setRuntimeDataPath(const boost::filesystem::path& newPath); void setRuntimeDataPath(const boost::filesystem::path& newPath);
const boost::filesystem::path& getOgreConfigPath() const;
const boost::filesystem::path& getPluginsConfigPath() const;
const boost::filesystem::path& getLogPath() const;
private: private:
void loadConfig(const boost::filesystem::path& path, void loadConfig(const boost::filesystem::path& path,
boost::program_options::variables_map& variables, boost::program_options::variables_map& variables,
boost::program_options::options_description& description); boost::program_options::options_description& description);
Files::Path<> mPath; Files::Path<> mPath;
boost::filesystem::path mOgreCfgPath;
boost::filesystem::path mPluginsCfgPath;
boost::filesystem::path mLogPath;
}; };
} /* namespace Cfg */ } /* namespace Cfg */

View file

@ -10,7 +10,7 @@ namespace Files
{ {
} }
Collections::Collections(const std::vector<boost::filesystem::path>& directories, bool foldCase) Collections::Collections(const Files::PathContainer& directories, bool foldCase)
: mDirectories(directories) : mDirectories(directories)
, mFoldCase(foldCase) , mFoldCase(foldCase)
, mCollections() , mCollections()

View file

@ -1,7 +1,6 @@
#ifndef COMPONENTS_FILES_COLLECTION_HPP #ifndef COMPONENTS_FILES_COLLECTION_HPP
#define COMPONENTS_FILES_COLLECTION_HPP #define COMPONENTS_FILES_COLLECTION_HPP
#include <vector>
#include <string> #include <string>
#include <map> #include <map>
#include <boost/filesystem.hpp> #include <boost/filesystem.hpp>
@ -13,12 +12,10 @@ namespace Files
class Collections class Collections
{ {
public: public:
typedef std::vector<boost::filesystem::path> PathContainer;
Collections(); Collections();
///< Directories are listed with increasing priority. ///< Directories are listed with increasing priority.
Collections(const PathContainer& directories, bool foldCase); Collections(const Files::PathContainer& directories, bool foldCase);
///< Return a file collection for the given extension. Extension must contain the ///< Return a file collection for the given extension. Extension must contain the
/// leading dot and must be all lower-case. /// leading dot and must be all lower-case.
@ -26,7 +23,7 @@ namespace Files
private: private:
typedef std::map<std::string, MultiDirCollection> MultiDirCollectionContainer; typedef std::map<std::string, MultiDirCollection> MultiDirCollectionContainer;
PathContainer mDirectories; Files::PathContainer mDirectories;
bool mFoldCase; bool mFoldCase;
mutable MultiDirCollectionContainer mCollections; mutable MultiDirCollectionContainer mCollections;

View file

@ -39,21 +39,25 @@ namespace Files
} }
}; };
MultiDirCollection::MultiDirCollection (const std::vector<boost::filesystem::path>& directories, MultiDirCollection::MultiDirCollection(const Files::PathContainer& directories,
const std::string& extension, bool foldCase) const std::string& extension, bool foldCase)
: mFiles (NameLess (!foldCase)) : mFiles (NameLess (!foldCase))
{ {
NameEqual equal (!foldCase); NameEqual equal (!foldCase);
for (std::vector<boost::filesystem::path>::const_iterator iter = directories.begin(); for (PathContainer::const_iterator iter = directories.begin();
iter!=directories.end(); ++iter) iter!=directories.end(); ++iter)
{ {
boost::filesystem::path dataDirectory = *iter; if (!boost::filesystem::is_directory(*iter))
for (boost::filesystem::directory_iterator iter (dataDirectory);
iter!=boost::filesystem::directory_iterator(); ++iter)
{ {
boost::filesystem::path path = *iter; std::cout << "Skipping invalid directory: " << (*iter).string() << std::endl;
continue;
}
for (boost::filesystem::directory_iterator dirIter(*iter);
dirIter != boost::filesystem::directory_iterator(); ++dirIter)
{
boost::filesystem::path path = *dirIter;
if (!equal (extension, boost::filesystem::path (path.extension()).string())) if (!equal (extension, boost::filesystem::path (path.extension()).string()))
continue; continue;

View file

@ -11,6 +11,8 @@
namespace Files namespace Files
{ {
typedef std::vector<boost::filesystem::path> PathContainer;
struct NameLess struct NameLess
{ {
bool mStrict; bool mStrict;
@ -58,7 +60,7 @@ namespace Files
public: public:
MultiDirCollection (const std::vector<boost::filesystem::path>& directories, MultiDirCollection (const Files::PathContainer& directories,
const std::string& extension, bool foldCase); const std::string& extension, bool foldCase);
///< Directories are listed with increasing priority. ///< Directories are listed with increasing priority.
/// \param extension The extension that should be listed in this collection. Must /// \param extension The extension that should be listed in this collection. Must