forked from mirror/openmw-tes3mp
Merge branch 'master' into openmw-30
This commit is contained in:
commit
af14bca5aa
67 changed files with 629 additions and 1139 deletions
|
@ -345,8 +345,8 @@ configure_file(${OpenMW_SOURCE_DIR}/files/openmw.cfg.local
|
|||
configure_file(${OpenMW_SOURCE_DIR}/files/openmw.cfg
|
||||
"${OpenMW_BINARY_DIR}/openmw.cfg.install")
|
||||
|
||||
configure_file(${OpenMW_SOURCE_DIR}/files/opencs.cfg
|
||||
"${OpenMW_BINARY_DIR}/opencs.cfg")
|
||||
configure_file(${OpenMW_SOURCE_DIR}/files/opencs.ini
|
||||
"${OpenMW_BINARY_DIR}/opencs.ini")
|
||||
|
||||
configure_file(${OpenMW_SOURCE_DIR}/files/opencs/defaultfilters
|
||||
"${OpenMW_BINARY_DIR}/resources/defaultfilters" COPYONLY)
|
||||
|
|
|
@ -106,7 +106,6 @@ opencs_units_noqt (view/settings
|
|||
|
||||
opencs_units (model/settings
|
||||
usersettings
|
||||
settingmanager
|
||||
setting
|
||||
connector
|
||||
)
|
||||
|
|
|
@ -27,7 +27,7 @@ CS::Editor::Editor (OgreInit::OgreInit& ogreInit)
|
|||
|
||||
setupDataFiles (config.first);
|
||||
|
||||
CSMSettings::UserSettings::instance().loadSettings ("opencs.cfg");
|
||||
CSMSettings::UserSettings::instance().loadSettings ("opencs.ini");
|
||||
mSettings.setModel (CSMSettings::UserSettings::instance());
|
||||
|
||||
ogreInit.init ((mCfgMgr.getUserConfigPath() / "opencsOgre.log").string());
|
||||
|
@ -124,11 +124,6 @@ std::pair<Files::PathContainer, std::vector<std::string> > CS::Editor::readConfi
|
|||
QString path = QString::fromUtf8 (iter->string().c_str());
|
||||
mFileDialog.addFiles(path);
|
||||
}
|
||||
/*
|
||||
//load the settings into the userSettings instance.
|
||||
const QString settingFileName = "opencs.cfg";
|
||||
CSMSettings::UserSettings::instance().loadSettings(settingFileName);
|
||||
*/
|
||||
|
||||
return std::make_pair (dataDirs, variables["fallback-archive"].as<std::vector<std::string> >());
|
||||
}
|
||||
|
|
|
@ -6,11 +6,14 @@
|
|||
|
||||
#include <QApplication>
|
||||
#include <QIcon>
|
||||
#include <QMetaType>
|
||||
|
||||
#include <extern/shiny/Main/Factory.hpp>
|
||||
|
||||
#include <components/ogreinit/ogreinit.hpp>
|
||||
|
||||
#include "model/world/universalid.hpp"
|
||||
|
||||
#ifdef Q_OS_MAC
|
||||
#include <QDir>
|
||||
#endif
|
||||
|
@ -42,6 +45,8 @@ int main(int argc, char *argv[])
|
|||
{
|
||||
Q_INIT_RESOURCE (resources);
|
||||
|
||||
qRegisterMetaType<CSMWorld::UniversalId> ("CSMWorld::UniversalId");
|
||||
|
||||
OgreInit::OgreInit ogreInit;
|
||||
|
||||
std::auto_ptr<sh::Factory> shinyFactory;
|
||||
|
|
|
@ -2288,8 +2288,9 @@ CSMDoc::Document::Document (const Files::ConfigurationManager& configuration, co
|
|||
|
||||
connect (&mSaving, SIGNAL (progress (int, int, int)), this, SLOT (progress (int, int, int)));
|
||||
connect (&mSaving, SIGNAL (done (int)), this, SLOT (operationDone (int)));
|
||||
connect (&mSaving, SIGNAL (reportMessage (const QString&, int)),
|
||||
this, SLOT (reportMessage (const QString&, int)));
|
||||
connect (
|
||||
&mSaving, SIGNAL (reportMessage (const CSMWorld::UniversalId&, const std::string&, int)),
|
||||
this, SLOT (reportMessage (const CSMWorld::UniversalId&, const std::string&, int)));
|
||||
}
|
||||
|
||||
CSMDoc::Document::~Document()
|
||||
|
@ -2358,10 +2359,11 @@ void CSMDoc::Document::modificationStateChanged (bool clean)
|
|||
emit stateChanged (getState(), this);
|
||||
}
|
||||
|
||||
void CSMDoc::Document::reportMessage (const QString& message, int type)
|
||||
void CSMDoc::Document::reportMessage (const CSMWorld::UniversalId& id, const std::string& message,
|
||||
int type)
|
||||
{
|
||||
/// \todo find a better way to get these messages to the user.
|
||||
std::cout << message.toUtf8().constData() << std::endl;
|
||||
std::cout << message << std::endl;
|
||||
}
|
||||
|
||||
void CSMDoc::Document::operationDone (int type)
|
||||
|
|
|
@ -111,7 +111,8 @@ namespace CSMDoc
|
|||
|
||||
void modificationStateChanged (bool clean);
|
||||
|
||||
void reportMessage (const QString& message, int type);
|
||||
void reportMessage (const CSMWorld::UniversalId& id, const std::string& message,
|
||||
int type);
|
||||
|
||||
void operationDone (int type);
|
||||
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
|
||||
#include <QTimer>
|
||||
|
||||
#include "../world/universalid.hpp"
|
||||
|
||||
#include "state.hpp"
|
||||
#include "stage.hpp"
|
||||
|
||||
|
@ -80,7 +82,7 @@ void CSMDoc::Operation::abort()
|
|||
|
||||
void CSMDoc::Operation::executeStage()
|
||||
{
|
||||
std::vector<std::string> messages;
|
||||
Stage::Messages messages;
|
||||
|
||||
while (mCurrentStage!=mStages.end())
|
||||
{
|
||||
|
@ -97,7 +99,7 @@ void CSMDoc::Operation::executeStage()
|
|||
}
|
||||
catch (const std::exception& e)
|
||||
{
|
||||
emit reportMessage (e.what(), mType);
|
||||
emit reportMessage (CSMWorld::UniversalId(), e.what(), mType);
|
||||
abort();
|
||||
}
|
||||
|
||||
|
@ -108,8 +110,8 @@ void CSMDoc::Operation::executeStage()
|
|||
|
||||
emit progress (mCurrentStepTotal, mTotalSteps ? mTotalSteps : 1, mType);
|
||||
|
||||
for (std::vector<std::string>::const_iterator iter (messages.begin()); iter!=messages.end(); ++iter)
|
||||
emit reportMessage (iter->c_str(), mType);
|
||||
for (Stage::Messages::const_iterator iter (messages.begin()); iter!=messages.end(); ++iter)
|
||||
emit reportMessage (iter->first, iter->second, mType);
|
||||
|
||||
if (mCurrentStage==mStages.end())
|
||||
exit();
|
||||
|
|
|
@ -5,6 +5,11 @@
|
|||
|
||||
#include <QThread>
|
||||
|
||||
namespace CSMWorld
|
||||
{
|
||||
class UniversalId;
|
||||
}
|
||||
|
||||
namespace CSMDoc
|
||||
{
|
||||
class Stage;
|
||||
|
@ -46,7 +51,8 @@ namespace CSMDoc
|
|||
|
||||
void progress (int current, int max, int type);
|
||||
|
||||
void reportMessage (const QString& message, int type);
|
||||
void reportMessage (const CSMWorld::UniversalId& id, const std::string& message,
|
||||
int type);
|
||||
|
||||
void done (int type);
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ int CSMDoc::OpenSaveStage::setup()
|
|||
return 1;
|
||||
}
|
||||
|
||||
void CSMDoc::OpenSaveStage::perform (int stage, std::vector<std::string>& messages)
|
||||
void CSMDoc::OpenSaveStage::perform (int stage, Messages& messages)
|
||||
{
|
||||
mState.start (mDocument, mProjectFile);
|
||||
|
||||
|
@ -43,7 +43,7 @@ int CSMDoc::WriteHeaderStage::setup()
|
|||
return 1;
|
||||
}
|
||||
|
||||
void CSMDoc::WriteHeaderStage::perform (int stage, std::vector<std::string>& messages)
|
||||
void CSMDoc::WriteHeaderStage::perform (int stage, Messages& messages)
|
||||
{
|
||||
mState.getWriter().setVersion();
|
||||
|
||||
|
@ -96,7 +96,7 @@ int CSMDoc::WriteDialogueCollectionStage::setup()
|
|||
return mTopics.getSize();
|
||||
}
|
||||
|
||||
void CSMDoc::WriteDialogueCollectionStage::perform (int stage, std::vector<std::string>& messages)
|
||||
void CSMDoc::WriteDialogueCollectionStage::perform (int stage, Messages& messages)
|
||||
{
|
||||
const CSMWorld::Record<ESM::Dialogue>& topic = mTopics.getRecord (stage);
|
||||
|
||||
|
@ -191,7 +191,7 @@ int CSMDoc::WriteRefIdCollectionStage::setup()
|
|||
return mDocument.getData().getReferenceables().getSize();
|
||||
}
|
||||
|
||||
void CSMDoc::WriteRefIdCollectionStage::perform (int stage, std::vector<std::string>& messages)
|
||||
void CSMDoc::WriteRefIdCollectionStage::perform (int stage, Messages& messages)
|
||||
{
|
||||
mDocument.getData().getReferenceables().save (stage, mState.getWriter());
|
||||
}
|
||||
|
@ -204,7 +204,7 @@ CSMDoc::WriteFilterStage::WriteFilterStage (Document& document, SavingState& sta
|
|||
mDocument (document), mScope (scope)
|
||||
{}
|
||||
|
||||
void CSMDoc::WriteFilterStage::perform (int stage, std::vector<std::string>& messages)
|
||||
void CSMDoc::WriteFilterStage::perform (int stage, Messages& messages)
|
||||
{
|
||||
const CSMWorld::Record<CSMFilter::Filter>& record =
|
||||
mDocument.getData().getFilters().getRecord (stage);
|
||||
|
@ -223,7 +223,7 @@ int CSMDoc::CloseSaveStage::setup()
|
|||
return 1;
|
||||
}
|
||||
|
||||
void CSMDoc::CloseSaveStage::perform (int stage, std::vector<std::string>& messages)
|
||||
void CSMDoc::CloseSaveStage::perform (int stage, Messages& messages)
|
||||
{
|
||||
mState.getStream().close();
|
||||
|
||||
|
@ -241,7 +241,7 @@ int CSMDoc::FinalSavingStage::setup()
|
|||
return 1;
|
||||
}
|
||||
|
||||
void CSMDoc::FinalSavingStage::perform (int stage, std::vector<std::string>& messages)
|
||||
void CSMDoc::FinalSavingStage::perform (int stage, Messages& messages)
|
||||
{
|
||||
if (mState.hasError())
|
||||
{
|
||||
|
|
|
@ -39,7 +39,7 @@ namespace CSMDoc
|
|||
virtual int setup();
|
||||
///< \return number of steps
|
||||
|
||||
virtual void perform (int stage, std::vector<std::string>& messages);
|
||||
virtual void perform (int stage, Messages& messages);
|
||||
///< Messages resulting from this stage will be appended to \a messages.
|
||||
};
|
||||
|
||||
|
@ -57,7 +57,7 @@ namespace CSMDoc
|
|||
virtual int setup();
|
||||
///< \return number of steps
|
||||
|
||||
virtual void perform (int stage, std::vector<std::string>& messages);
|
||||
virtual void perform (int stage, Messages& messages);
|
||||
///< Messages resulting from this stage will be appended to \a messages.
|
||||
};
|
||||
|
||||
|
@ -75,7 +75,7 @@ namespace CSMDoc
|
|||
virtual int setup();
|
||||
///< \return number of steps
|
||||
|
||||
virtual void perform (int stage, std::vector<std::string>& messages);
|
||||
virtual void perform (int stage, Messages& messages);
|
||||
///< Messages resulting from this stage will be appended to \a messages.
|
||||
};
|
||||
|
||||
|
@ -92,7 +92,7 @@ namespace CSMDoc
|
|||
}
|
||||
|
||||
template<class CollectionT>
|
||||
void WriteCollectionStage<CollectionT>::perform (int stage, std::vector<std::string>& messages)
|
||||
void WriteCollectionStage<CollectionT>::perform (int stage, Messages& messages)
|
||||
{
|
||||
CSMWorld::RecordBase::State state = mCollection.getRecord (stage).mState;
|
||||
|
||||
|
@ -130,7 +130,7 @@ namespace CSMDoc
|
|||
virtual int setup();
|
||||
///< \return number of steps
|
||||
|
||||
virtual void perform (int stage, std::vector<std::string>& messages);
|
||||
virtual void perform (int stage, Messages& messages);
|
||||
///< Messages resulting from this stage will be appended to \a messages.
|
||||
};
|
||||
|
||||
|
@ -147,7 +147,7 @@ namespace CSMDoc
|
|||
virtual int setup();
|
||||
///< \return number of steps
|
||||
|
||||
virtual void perform (int stage, std::vector<std::string>& messages);
|
||||
virtual void perform (int stage, Messages& messages);
|
||||
///< Messages resulting from this stage will be appended to \a messages.
|
||||
};
|
||||
|
||||
|
@ -161,7 +161,7 @@ namespace CSMDoc
|
|||
|
||||
WriteFilterStage (Document& document, SavingState& state, CSMFilter::Filter::Scope scope);
|
||||
|
||||
virtual void perform (int stage, std::vector<std::string>& messages);
|
||||
virtual void perform (int stage, Messages& messages);
|
||||
///< Messages resulting from this stage will be appended to \a messages.
|
||||
};
|
||||
|
||||
|
@ -177,7 +177,7 @@ namespace CSMDoc
|
|||
virtual int setup();
|
||||
///< \return number of steps
|
||||
|
||||
virtual void perform (int stage, std::vector<std::string>& messages);
|
||||
virtual void perform (int stage, Messages& messages);
|
||||
///< Messages resulting from this stage will be appended to \a messages.
|
||||
};
|
||||
|
||||
|
@ -193,7 +193,7 @@ namespace CSMDoc
|
|||
virtual int setup();
|
||||
///< \return number of steps
|
||||
|
||||
virtual void perform (int stage, std::vector<std::string>& messages);
|
||||
virtual void perform (int stage, Messages& messages);
|
||||
///< Messages resulting from this stage will be appended to \a messages.
|
||||
};
|
||||
}
|
||||
|
|
|
@ -4,18 +4,22 @@
|
|||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
#include "../world/universalid.hpp"
|
||||
|
||||
namespace CSMDoc
|
||||
{
|
||||
class Stage
|
||||
{
|
||||
public:
|
||||
|
||||
typedef std::vector<std::pair<CSMWorld::UniversalId, std::string> > Messages;
|
||||
|
||||
virtual ~Stage();
|
||||
|
||||
virtual int setup() = 0;
|
||||
///< \return number of steps
|
||||
|
||||
virtual void perform (int stage, std::vector<std::string>& messages) = 0;
|
||||
virtual void perform (int stage, Messages& messages) = 0;
|
||||
///< Messages resulting from this stage will be appended to \a messages.
|
||||
};
|
||||
}
|
||||
|
|
|
@ -81,6 +81,7 @@ void CSMSettings::Connector::slotUpdateMaster() const
|
|||
}
|
||||
|
||||
QString masterValue = mMasterView->value (masterColumn);
|
||||
|
||||
mMasterView->setSelectedValue (masterValue);
|
||||
}
|
||||
|
||||
|
|
|
@ -20,34 +20,46 @@ namespace CSMSettings {
|
|||
|
||||
CSVSettings::View *mMasterView;
|
||||
|
||||
//map using the view pointer as a key to it's index value
|
||||
///map using the view pointer as a key to it's index value
|
||||
QList <CSVSettings::View *> mSlaveViews;
|
||||
|
||||
//list of proxy values for each master value.
|
||||
//value list order is indexed to the master value index.
|
||||
///list of proxy values for each master value.
|
||||
///value list order is indexed to the master value index.
|
||||
QMap < QString, QList <QStringList> > mProxyListMap;
|
||||
|
||||
public:
|
||||
explicit Connector(CSVSettings::View *master,
|
||||
QObject *parent = 0);
|
||||
|
||||
///Set the view which acts as a proxy for other setting views
|
||||
void setMasterView (CSVSettings::View *view);
|
||||
|
||||
///Add a view to be updated / update to the master
|
||||
void addSlaveView (CSVSettings::View *view,
|
||||
QList <QStringList> &masterProxyValues);
|
||||
|
||||
private:
|
||||
|
||||
///loosely matches lists of proxy values across registered slaves
|
||||
///against a proxy value list for a given master value
|
||||
bool proxyListsMatch (const QList <QStringList> &list1,
|
||||
const QList <QStringList> &list2) const;
|
||||
|
||||
///loosely matches two string lists
|
||||
bool stringListsMatch (const QStringList &list1,
|
||||
const QStringList &list2) const;
|
||||
|
||||
///retrieves current values of registered slave views
|
||||
QList <QStringList> getSlaveViewValues() const;
|
||||
|
||||
public slots:
|
||||
|
||||
///updates slave views with proxy values associated with current
|
||||
///master value
|
||||
void slotUpdateSlaves() const;
|
||||
|
||||
///updates master value associated with the currently selected
|
||||
///slave values, if applicable.
|
||||
void slotUpdateMaster() const;
|
||||
};
|
||||
}
|
||||
|
|
|
@ -45,7 +45,7 @@ void CSMSettings::Setting::addProxy (const Setting *setting,
|
|||
foreach (const QString &val, vals)
|
||||
list << (QStringList() << val);
|
||||
|
||||
mProxies [setting->page() + '.' + setting->name()] = list;
|
||||
mProxies [setting->page() + '/' + setting->name()] = list;
|
||||
}
|
||||
|
||||
void CSMSettings::Setting::addProxy (const Setting *setting,
|
||||
|
@ -54,7 +54,7 @@ void CSMSettings::Setting::addProxy (const Setting *setting,
|
|||
if (serializable())
|
||||
setProperty (Property_Serializable, false);
|
||||
|
||||
mProxies [setting->page() + '.' + setting->name()] = list;
|
||||
mProxies [setting->page() + '/' + setting->name()] = list;
|
||||
}
|
||||
|
||||
void CSMSettings::Setting::setColumnSpan (int value)
|
||||
|
@ -77,16 +77,6 @@ QStringList CSMSettings::Setting::declaredValues() const
|
|||
return property (Property_DeclaredValues);
|
||||
}
|
||||
|
||||
void CSMSettings::Setting::setDefinedValues (QStringList list)
|
||||
{
|
||||
setProperty (Property_DefinedValues, list);
|
||||
}
|
||||
|
||||
QStringList CSMSettings::Setting::definedValues() const
|
||||
{
|
||||
return property (Property_DefinedValues);
|
||||
}
|
||||
|
||||
QStringList CSMSettings::Setting::property (SettingProperty prop) const
|
||||
{
|
||||
if (prop >= mProperties.size())
|
||||
|
|
|
@ -7,11 +7,17 @@
|
|||
|
||||
namespace CSMSettings
|
||||
{
|
||||
//Maps setting id ("page.name") to a list of corresponding proxy values.
|
||||
//Order of proxy value stringlists corresponds to order of master proxy's
|
||||
//values in it's declared value list
|
||||
//QString is the setting id in the form of "page/name"
|
||||
//QList is a list of stringlists of proxy values.
|
||||
//Order is important! Proxy stringlists are matched against
|
||||
//master values by their position in the QList.
|
||||
typedef QMap <QString, QList <QStringList> > ProxyValueMap;
|
||||
|
||||
///Setting class is the interface for the User Settings. It contains
|
||||
///a great deal of boiler plate to provide the core API functions, as
|
||||
///well as the property() functions which use enumeration to be iterable.
|
||||
///This makes the Setting class capable of being manipulated by script.
|
||||
///See CSMSettings::support.hpp for enumerations / string values.
|
||||
class Setting
|
||||
{
|
||||
QList <QStringList> mProperties;
|
||||
|
@ -19,10 +25,6 @@ namespace CSMSettings
|
|||
|
||||
bool mIsEditorSetting;
|
||||
|
||||
//QString is the setting id in the form of "page.name"
|
||||
//QList is a list of stringlists of proxy values.
|
||||
//Order is important! Proxy stringlists are matched against
|
||||
//master values by their position in the QList.
|
||||
ProxyValueMap mProxies;
|
||||
|
||||
public:
|
||||
|
@ -42,9 +44,6 @@ namespace CSMSettings
|
|||
void setDeclaredValues (QStringList list);
|
||||
QStringList declaredValues() const;
|
||||
|
||||
void setDefinedValues (QStringList list);
|
||||
QStringList definedValues() const;
|
||||
|
||||
void setDefaultValue (int value);
|
||||
void setDefaultValue (double value);
|
||||
void setDefaultValue (const QString &value);
|
||||
|
|
|
@ -1,342 +0,0 @@
|
|||
#include <QFile>
|
||||
#include <QTextCodec>
|
||||
#include <QMessageBox>
|
||||
#include <QDebug>
|
||||
#include <QList>
|
||||
|
||||
#include "setting.hpp"
|
||||
#include "settingmanager.hpp"
|
||||
|
||||
CSMSettings::SettingManager::SettingManager(QObject *parent) :
|
||||
QObject(parent)
|
||||
{
|
||||
mReadWriteMessage = QObject::tr("<br><b>Could not open or create file for \
|
||||
writing</b><br><br> Please make sure you have the right\
|
||||
permissions and try again.<br>");
|
||||
|
||||
mReadOnlyMessage = QObject::tr("<br><b>Could not open file for \
|
||||
reading</b><br><br> Please make sure you have the \
|
||||
right permissions and try again.<br>");
|
||||
|
||||
}
|
||||
|
||||
void CSMSettings::SettingManager::dumpModel()
|
||||
{
|
||||
foreach (Setting *setting, mSettings)
|
||||
{
|
||||
if (setting->proxyLists().isEmpty())
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
CSMSettings::Setting *CSMSettings::SettingManager::createSetting
|
||||
(CSMSettings::SettingType typ, const QString &page, const QString &name)
|
||||
{
|
||||
//get list of all settings for the current setting name
|
||||
if (findSetting (page, name))
|
||||
{
|
||||
qWarning() << "Duplicate declaration encountered: "
|
||||
<< (name + '.' + page);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Setting *setting = new Setting (typ, name, page);
|
||||
|
||||
|
||||
//add declaration to the model
|
||||
mSettings.append (setting);
|
||||
|
||||
return setting;
|
||||
}
|
||||
|
||||
CSMSettings::DefinitionPageMap
|
||||
CSMSettings::SettingManager::readFilestream (QTextStream *stream)
|
||||
{
|
||||
//regEx's for page names and keys / values
|
||||
QRegExp pageRegEx ("^\\[([^]]+)\\]");
|
||||
QRegExp keyRegEx ("^([^=]+)\\s*=\\s*(.+)$");
|
||||
|
||||
QString currPage = "Unassigned";
|
||||
|
||||
DefinitionPageMap pageMap;
|
||||
|
||||
if (!stream)
|
||||
{
|
||||
displayFileErrorMessage(mReadWriteMessage, false);
|
||||
return pageMap;
|
||||
}
|
||||
|
||||
if (stream->atEnd())
|
||||
return pageMap;
|
||||
|
||||
DefinitionMap *settingMap = new DefinitionMap();
|
||||
pageMap[currPage] = settingMap;
|
||||
|
||||
while (!stream->atEnd())
|
||||
{
|
||||
QString line = stream->readLine().simplified();
|
||||
|
||||
if (line.isEmpty() || line.startsWith("#"))
|
||||
continue;
|
||||
|
||||
//page name found
|
||||
if (pageRegEx.exactMatch(line))
|
||||
{
|
||||
currPage = pageRegEx.cap(1).simplified().trimmed();
|
||||
settingMap = new DefinitionMap();
|
||||
pageMap[currPage] = settingMap;
|
||||
continue;
|
||||
}
|
||||
|
||||
//setting definition found
|
||||
if ( (keyRegEx.indexIn(line) != -1))
|
||||
{
|
||||
QString settingName = keyRegEx.cap(1).simplified();
|
||||
QString settingValue = keyRegEx.cap(2).simplified();
|
||||
|
||||
if (!settingMap->contains (settingName))
|
||||
settingMap->insert (settingName, new QStringList());
|
||||
|
||||
settingMap->value(settingName)->append(settingValue);
|
||||
}
|
||||
}
|
||||
|
||||
//return empty map if no settings were ever added to
|
||||
if (pageMap.size() == 1)
|
||||
{
|
||||
QString pageKey = pageMap.keys().at(0);
|
||||
if (pageMap[pageKey]->size() == 0)
|
||||
pageMap.clear();
|
||||
}
|
||||
|
||||
return pageMap;
|
||||
}
|
||||
|
||||
bool CSMSettings::SettingManager::writeFilestream(QTextStream *stream,
|
||||
const QMap <QString, QStringList > &settingListMap)
|
||||
{
|
||||
if (!stream)
|
||||
{
|
||||
displayFileErrorMessage(mReadWriteMessage, false);
|
||||
return false;
|
||||
}
|
||||
//disabled after rolling selector class into view. Need to
|
||||
//iterate views to get setting definitions before writing to file
|
||||
|
||||
QStringList sectionKeys;
|
||||
|
||||
foreach (const QString &key, settingListMap.keys())
|
||||
{
|
||||
QStringList names = key.split('.');
|
||||
QString section = names.at(0);
|
||||
|
||||
if (!sectionKeys.contains(section))
|
||||
if (!settingListMap.value(key).isEmpty())
|
||||
sectionKeys.append (section);
|
||||
}
|
||||
|
||||
foreach (const QString §ion, sectionKeys)
|
||||
{
|
||||
*stream << '[' << section << "]\n";
|
||||
foreach (const QString &key, settingListMap.keys())
|
||||
{
|
||||
QStringList names = key.split('.');
|
||||
|
||||
if (names.at(0) != section)
|
||||
continue;
|
||||
|
||||
QStringList list = settingListMap.value(key);
|
||||
|
||||
if (list.isEmpty())
|
||||
continue;
|
||||
|
||||
QString name = names.at(1);
|
||||
|
||||
foreach (const QString value, list)
|
||||
{
|
||||
if (value.isEmpty())
|
||||
continue;
|
||||
|
||||
*stream << name << " = " << value << '\n';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
destroyStream (stream);
|
||||
return true;
|
||||
}
|
||||
|
||||
void CSMSettings::SettingManager::mergeSettings(DefinitionPageMap &destMap, DefinitionPageMap &srcMap)
|
||||
{
|
||||
if (srcMap.isEmpty())
|
||||
return;
|
||||
|
||||
foreach (const QString &pageKey, srcMap.keys())
|
||||
{
|
||||
DefinitionMap *srcSetting = srcMap.value(pageKey);
|
||||
//Unique Page:
|
||||
//insertfrom the source map
|
||||
if (!destMap.keys().contains (pageKey))
|
||||
{
|
||||
destMap.insert (pageKey, srcSetting);
|
||||
continue;
|
||||
}
|
||||
|
||||
DefinitionMap *destSetting = destMap.value(pageKey);
|
||||
|
||||
//Duplicate Page:
|
||||
//iterate the settings in the source and check for duplicates in the
|
||||
//destination
|
||||
foreach (const QString &srcKey, srcSetting->keys())
|
||||
{
|
||||
//insert into destination if unique
|
||||
if (!destSetting->keys().contains (srcKey))
|
||||
destSetting->insert(srcKey, srcSetting->value (srcKey));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QTextStream *CSMSettings::SettingManager::openFilestream (const QString &filePath,
|
||||
bool isReadOnly) const
|
||||
{
|
||||
QIODevice::OpenMode openFlags = QIODevice::Text;
|
||||
|
||||
if (isReadOnly)
|
||||
openFlags = QIODevice::ReadOnly | openFlags;
|
||||
else
|
||||
openFlags = QIODevice::ReadWrite | QIODevice::Truncate | openFlags;
|
||||
|
||||
QFile *file = new QFile(filePath);
|
||||
QTextStream *stream = 0;
|
||||
|
||||
if (file->open(openFlags))
|
||||
stream = new QTextStream(file);
|
||||
|
||||
if (stream)
|
||||
stream->setCodec(QTextCodec::codecForName("UTF-8"));
|
||||
|
||||
return stream;
|
||||
}
|
||||
|
||||
void CSMSettings::SettingManager::destroyStream(QTextStream *stream) const
|
||||
{
|
||||
stream->device()->close();
|
||||
|
||||
delete stream;
|
||||
}
|
||||
|
||||
void CSMSettings::SettingManager::displayFileErrorMessage(const QString &message,
|
||||
bool isReadOnly) const
|
||||
{
|
||||
// File cannot be opened or created
|
||||
QMessageBox msgBox;
|
||||
msgBox.setWindowTitle(QObject::tr("OpenCS configuration file I/O error"));
|
||||
msgBox.setIcon(QMessageBox::Critical);
|
||||
msgBox.setStandardButtons(QMessageBox::Ok);
|
||||
|
||||
if (!isReadOnly)
|
||||
msgBox.setText (mReadWriteMessage + message);
|
||||
else
|
||||
msgBox.setText (message);
|
||||
|
||||
msgBox.exec();
|
||||
}
|
||||
|
||||
void CSMSettings::SettingManager::addDefinitions (DefinitionPageMap &pageMap)
|
||||
{
|
||||
foreach (QString pageName, pageMap.keys())
|
||||
{
|
||||
DefinitionMap *settingMap = pageMap.value (pageName);
|
||||
|
||||
foreach (QString settingName, (*settingMap).keys())
|
||||
{
|
||||
QStringList *values = settingMap->value (settingName);
|
||||
Setting *setting = findSetting (pageName, settingName);
|
||||
|
||||
if (!setting)
|
||||
{
|
||||
qWarning() << "Found definitions for undeclared setting "
|
||||
<< pageName << "." << settingName;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (values->size() == 0)
|
||||
values->append (setting->defaultValues());
|
||||
|
||||
setting->setDefinedValues (*values);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QList <CSMSettings::Setting *> CSMSettings::SettingManager::findSettings
|
||||
(const QStringList &list)
|
||||
{
|
||||
QList <CSMSettings::Setting *> settings;
|
||||
|
||||
foreach (const QString &value, list)
|
||||
{
|
||||
QStringList names = value.split(".", QString::SkipEmptyParts);
|
||||
|
||||
if (names.size() != 2)
|
||||
continue;
|
||||
|
||||
Setting *setting = findSetting (names.at(0), names.at(1));
|
||||
|
||||
if (!setting)
|
||||
continue;
|
||||
|
||||
settings.append (setting);
|
||||
}
|
||||
|
||||
return settings;
|
||||
}
|
||||
|
||||
|
||||
CSMSettings::Setting *CSMSettings::SettingManager::findSetting
|
||||
(const QString &pageName, const QString &settingName)
|
||||
{
|
||||
foreach (Setting *setting, mSettings)
|
||||
{
|
||||
if (setting->name() == settingName)
|
||||
{
|
||||
if (setting->page() == pageName)
|
||||
return setting;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
QList <CSMSettings::Setting *> CSMSettings::SettingManager::findSettings
|
||||
(const QString &pageName)
|
||||
{
|
||||
QList <CSMSettings::Setting *> settings;
|
||||
|
||||
foreach (Setting *setting, mSettings)
|
||||
{
|
||||
if (setting->page() == pageName)
|
||||
settings.append (setting);
|
||||
}
|
||||
return settings;
|
||||
}
|
||||
|
||||
CSMSettings::SettingPageMap CSMSettings::SettingManager::settingPageMap() const
|
||||
{
|
||||
SettingPageMap pageMap;
|
||||
|
||||
foreach (Setting *setting, mSettings)
|
||||
pageMap[setting->page()].append (setting);
|
||||
|
||||
return pageMap;
|
||||
}
|
||||
|
||||
void CSMSettings::SettingManager::updateUserSetting(const QString &settingKey,
|
||||
const QStringList &list)
|
||||
{
|
||||
QStringList names = settingKey.split('.');
|
||||
|
||||
Setting *setting = findSetting (names.at(0), names.at(1));
|
||||
|
||||
setting->setDefinedValues (list);
|
||||
|
||||
emit userSettingUpdated (settingKey, list);
|
||||
}
|
|
@ -1,84 +0,0 @@
|
|||
#ifndef CSMSETTINGS_SETTINGMANAGER_HPP
|
||||
#define CSMSETTINGS_SETTINGMANAGER_HPP
|
||||
|
||||
#include <QObject>
|
||||
#include <QMap>
|
||||
#include <QStringList>
|
||||
#include <QTextStream>
|
||||
|
||||
#include "support.hpp"
|
||||
#include "setting.hpp"
|
||||
|
||||
namespace CSMSettings
|
||||
{
|
||||
|
||||
typedef QMap <QString, QStringList *> DefinitionMap;
|
||||
typedef QMap <QString, DefinitionMap *> DefinitionPageMap;
|
||||
|
||||
typedef QMap <QString, QList <Setting *> > SettingPageMap;
|
||||
|
||||
class SettingManager : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
QString mReadOnlyMessage;
|
||||
QString mReadWriteMessage;
|
||||
QList <Setting *> mSettings;
|
||||
|
||||
public:
|
||||
explicit SettingManager(QObject *parent = 0);
|
||||
|
||||
///retrieve a setting object from a given page and setting name
|
||||
Setting *findSetting
|
||||
(const QString &pageName, const QString &settingName);
|
||||
|
||||
///retrieve all settings for a specified page
|
||||
QList <Setting *> findSettings (const QString &pageName);
|
||||
|
||||
///retrieve all settings named in the attached list.
|
||||
///Setting names are specified in "PageName.SettingName" format.
|
||||
QList <Setting *> findSettings (const QStringList &list);
|
||||
|
||||
///Retreive a map of the settings, keyed by page name
|
||||
SettingPageMap settingPageMap() const;
|
||||
|
||||
protected:
|
||||
|
||||
///add a new setting to the model and return it
|
||||
Setting *createSetting (CSMSettings::SettingType typ,
|
||||
const QString &page, const QString &name);
|
||||
|
||||
///add definitions to the settings specified in the page map
|
||||
void addDefinitions (DefinitionPageMap &pageMap);
|
||||
|
||||
///read setting definitions from file
|
||||
DefinitionPageMap readFilestream(QTextStream *stream);
|
||||
|
||||
///write setting definitions to file
|
||||
bool writeFilestream (QTextStream *stream,
|
||||
const QMap <QString, QStringList > &settingMap);
|
||||
|
||||
///merge PageMaps of settings when loading from multiple files
|
||||
void mergeSettings (DefinitionPageMap &destMap, DefinitionPageMap &srcMap);
|
||||
|
||||
QTextStream *openFilestream (const QString &filePath,
|
||||
bool isReadOnly) const;
|
||||
|
||||
void destroyStream(QTextStream *stream) const;
|
||||
|
||||
void displayFileErrorMessage(const QString &message,
|
||||
bool isReadOnly) const;
|
||||
|
||||
QList <Setting *> settings() const { return mSettings; }
|
||||
void dumpModel();
|
||||
|
||||
signals:
|
||||
|
||||
void userSettingUpdated (const QString &, const QStringList &);
|
||||
|
||||
public slots:
|
||||
|
||||
void updateUserSetting (const QString &, const QStringList &);
|
||||
};
|
||||
}
|
||||
#endif // CSMSETTINGS_SETTINGMANAGER_HPP
|
|
@ -7,22 +7,10 @@
|
|||
#include <QVariant>
|
||||
#include <QStringList>
|
||||
|
||||
//Typedefs
|
||||
namespace CSMSettings
|
||||
{
|
||||
// Definition / Declaration model typedefs
|
||||
// "Pair" = Setting name and specific data
|
||||
// "ListItem" = Page name and associated setting pair
|
||||
|
||||
typedef QPair <QString, QString> StringPair;
|
||||
typedef QPair <QString, QStringList> StringListPair;
|
||||
typedef QList <StringListPair> StringListPairs;
|
||||
|
||||
}
|
||||
|
||||
//Enums
|
||||
namespace CSMSettings
|
||||
{
|
||||
///Enumerated properties for scripting
|
||||
enum SettingProperty
|
||||
{
|
||||
Property_Name = 0,
|
||||
|
@ -55,6 +43,7 @@ namespace CSMSettings
|
|||
Property_Proxies = 25
|
||||
};
|
||||
|
||||
///Basic setting widget types.
|
||||
enum SettingType
|
||||
{
|
||||
/*
|
||||
|
@ -82,16 +71,11 @@ namespace CSMSettings
|
|||
Type_Undefined = 40
|
||||
};
|
||||
|
||||
enum MergeMethod
|
||||
{
|
||||
Merge_Accept,
|
||||
Merge_Ignore,
|
||||
Merge_Overwrite
|
||||
};
|
||||
}
|
||||
|
||||
namespace CSVSettings
|
||||
{
|
||||
///Categorical view types which encompass the setting widget types
|
||||
enum ViewType
|
||||
{
|
||||
ViewType_Boolean = 0,
|
||||
|
@ -100,18 +84,12 @@ namespace CSVSettings
|
|||
ViewType_Text = 3,
|
||||
ViewType_Undefined = 4
|
||||
};
|
||||
|
||||
enum Alignment
|
||||
{
|
||||
Align_Left = Qt::AlignLeft,
|
||||
Align_Center = Qt::AlignHCenter,
|
||||
Align_Right = Qt::AlignRight
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
namespace CSMSettings
|
||||
{
|
||||
///used to construct default settings in the Setting class
|
||||
struct PropertyDefaultValues
|
||||
{
|
||||
int id;
|
||||
|
@ -119,6 +97,9 @@ namespace CSMSettings
|
|||
QVariant value;
|
||||
};
|
||||
|
||||
///strings which correspond to setting values. These strings represent
|
||||
///the script language keywords which would be used to declare setting
|
||||
///views for 3rd party addons
|
||||
const QString sPropertyNames[] =
|
||||
{
|
||||
"name", "page", "setting_type", "is_multi_value",
|
||||
|
@ -129,6 +110,7 @@ namespace CSMSettings
|
|||
"defaults", "declarations", "definitions", "proxies"
|
||||
};
|
||||
|
||||
///Default values for a setting. Used in setting creation.
|
||||
const QString sPropertyDefaults[] =
|
||||
{
|
||||
"", //name
|
||||
|
|
|
@ -1,21 +1,14 @@
|
|||
#include "usersettings.hpp"
|
||||
|
||||
#include <QTextStream>
|
||||
#include <QDir>
|
||||
#include <QString>
|
||||
#include <QRegExp>
|
||||
#include <QMap>
|
||||
#include <QMessageBox>
|
||||
#include <QTextCodec>
|
||||
|
||||
#include <QSettings>
|
||||
#include <QFile>
|
||||
#include <QSortFilterProxyModel>
|
||||
|
||||
#include <components/files/configurationmanager.hpp>
|
||||
#include <boost/version.hpp>
|
||||
|
||||
#include "setting.hpp"
|
||||
#include "support.hpp"
|
||||
#include <QDebug>
|
||||
|
||||
/**
|
||||
* Workaround for problems with whitespaces in paths in older versions of Boost library
|
||||
|
@ -40,6 +33,8 @@ CSMSettings::UserSettings::UserSettings()
|
|||
assert(!mUserSettingsInstance);
|
||||
mUserSettingsInstance = this;
|
||||
|
||||
mSettingDefinitions = 0;
|
||||
|
||||
buildSettingModelDefaults();
|
||||
}
|
||||
|
||||
|
@ -119,18 +114,19 @@ void CSMSettings::UserSettings::buildSettingModelDefaults()
|
|||
* Defined values
|
||||
*
|
||||
* Values which represent the actual, current value of
|
||||
* a setting. For settings with declared values, this must be one or
|
||||
* several declared values, as appropriate.
|
||||
* a setting. For settings with declared values, this must be one
|
||||
* or several declared values, as appropriate.
|
||||
*
|
||||
* Proxy values - values the proxy master updates the proxy slave when
|
||||
* it's own definition is set / changed. These are definitions for
|
||||
* proxy slave settings, but must match any declared values the proxy
|
||||
* slave has, if any.
|
||||
* Proxy values
|
||||
* Values the proxy master updates the proxy slave when
|
||||
* it's own definition is set / changed. These are definitions for
|
||||
* proxy slave settings, but must match any declared values the
|
||||
* proxy slave has, if any.
|
||||
*******************************************************************/
|
||||
|
||||
/*
|
||||
//create setting objects, specifying the basic widget type,
|
||||
//the page name, and the view name
|
||||
/*
|
||||
|
||||
Setting *masterBoolean = createSetting (Type_RadioButton, section,
|
||||
"Master Proxy");
|
||||
|
||||
|
@ -230,6 +226,7 @@ void CSMSettings::UserSettings::buildSettingModelDefaults()
|
|||
slaveIntegerSpinbox->setSerializable (false);
|
||||
slaveDoubleSpinbox->setSerializable (false);
|
||||
slaveSlider->setSerializable (false);
|
||||
slaveDial->setSerializable (false);
|
||||
|
||||
slaveBoolean->setDefaultValues (QStringList()
|
||||
<< "One" << "Three" << "Five");
|
||||
|
@ -283,82 +280,60 @@ CSMSettings::UserSettings::~UserSettings()
|
|||
|
||||
void CSMSettings::UserSettings::loadSettings (const QString &fileName)
|
||||
{
|
||||
mUserFilePath = QString::fromUtf8
|
||||
(mCfgMgr.getUserConfigPath().string().c_str()) + fileName.toUtf8();
|
||||
QString userFilePath = QString::fromUtf8
|
||||
(mCfgMgr.getUserConfigPath().string().c_str());
|
||||
|
||||
QString global = QString::fromUtf8
|
||||
(mCfgMgr.getGlobalPath().string().c_str()) + fileName.toUtf8();
|
||||
QString globalFilePath = QString::fromUtf8
|
||||
(mCfgMgr.getGlobalPath().string().c_str());
|
||||
|
||||
QString local = QString::fromUtf8
|
||||
(mCfgMgr.getLocalPath().string().c_str()) + fileName.toUtf8();
|
||||
QString otherFilePath = globalFilePath;
|
||||
|
||||
//open user and global streams
|
||||
QTextStream *userStream = openFilestream (mUserFilePath, true);
|
||||
QTextStream *otherStream = openFilestream (global, true);
|
||||
|
||||
//failed stream, try for local
|
||||
if (!otherStream)
|
||||
otherStream = openFilestream (local, true);
|
||||
|
||||
//error condition - notify and return
|
||||
if (!otherStream || !userStream)
|
||||
//test for local only if global fails (uninstalled copy)
|
||||
if (!QFile (globalFilePath + fileName).exists())
|
||||
{
|
||||
QString message = QObject::tr("<br><b>An error was encountered loading \
|
||||
user settings files.</b><br><br> One or several files could not \
|
||||
be read. This may be caused by a missing configuration file, \
|
||||
incorrect file permissions or a corrupted installation of \
|
||||
OpenCS.<br>");
|
||||
|
||||
message += QObject::tr("<br>Global filepath: ") + global;
|
||||
message += QObject::tr("<br>Local filepath: ") + local;
|
||||
message += QObject::tr("<br>User filepath: ") + mUserFilePath;
|
||||
|
||||
displayFileErrorMessage ( message, true);
|
||||
return;
|
||||
//if global is invalid, use the local path
|
||||
otherFilePath = QString::fromUtf8
|
||||
(mCfgMgr.getLocalPath().string().c_str());
|
||||
}
|
||||
|
||||
//success condition - merge the two streams into a single map and save
|
||||
DefinitionPageMap totalMap = readFilestream (userStream);
|
||||
DefinitionPageMap otherMap = readFilestream(otherStream);
|
||||
QSettings::setPath
|
||||
(QSettings::IniFormat, QSettings::UserScope, userFilePath);
|
||||
|
||||
//merging other settings file in and ignore duplicate settings to
|
||||
//avoid overwriting user-level settings
|
||||
mergeSettings (totalMap, otherMap);
|
||||
QSettings::setPath
|
||||
(QSettings::IniFormat, QSettings::SystemScope, otherFilePath);
|
||||
|
||||
if (!totalMap.isEmpty())
|
||||
addDefinitions (totalMap);
|
||||
mSettingDefinitions = new QSettings
|
||||
(QSettings::IniFormat, QSettings::UserScope, "opencs", QString(), this);
|
||||
}
|
||||
|
||||
void CSMSettings::UserSettings::saveSettings
|
||||
(const QMap <QString, QStringList> &settingMap)
|
||||
bool CSMSettings::UserSettings::hasSettingDefinitions
|
||||
(const QString &viewKey) const
|
||||
{
|
||||
for (int i = 0; i < settings().size(); i++)
|
||||
{
|
||||
Setting* setting = settings().at(i);
|
||||
return (mSettingDefinitions->contains (viewKey));
|
||||
}
|
||||
|
||||
QString key = setting->page() + '.' + setting->name();
|
||||
void CSMSettings::UserSettings::setDefinitions
|
||||
(const QString &key, const QStringList &list)
|
||||
{
|
||||
mSettingDefinitions->setValue (key, list);
|
||||
}
|
||||
|
||||
if (!settingMap.keys().contains(key))
|
||||
continue;
|
||||
|
||||
setting->setDefinedValues (settingMap.value(key));
|
||||
}
|
||||
|
||||
writeFilestream (openFilestream (mUserFilePath, false), settingMap);
|
||||
void CSMSettings::UserSettings::saveDefinitions() const
|
||||
{
|
||||
mSettingDefinitions->sync();
|
||||
}
|
||||
|
||||
QString CSMSettings::UserSettings::settingValue (const QString &settingKey)
|
||||
{
|
||||
QStringList names = settingKey.split('.');
|
||||
if (!mSettingDefinitions->contains (settingKey))
|
||||
return QString();
|
||||
|
||||
Setting *setting = findSetting(names.at(0), names.at(1));
|
||||
QStringList defs = mSettingDefinitions->value (settingKey).toStringList();
|
||||
|
||||
if (setting)
|
||||
{
|
||||
if (!setting->definedValues().isEmpty())
|
||||
return setting->definedValues().at(0);
|
||||
}
|
||||
return "";
|
||||
if (defs.isEmpty())
|
||||
return QString();
|
||||
|
||||
return defs.at(0);
|
||||
}
|
||||
|
||||
CSMSettings::UserSettings& CSMSettings::UserSettings::instance()
|
||||
|
@ -366,3 +341,86 @@ CSMSettings::UserSettings& CSMSettings::UserSettings::instance()
|
|||
assert(mUserSettingsInstance);
|
||||
return *mUserSettingsInstance;
|
||||
}
|
||||
|
||||
void CSMSettings::UserSettings::updateUserSetting(const QString &settingKey,
|
||||
const QStringList &list)
|
||||
{
|
||||
mSettingDefinitions->setValue (settingKey ,list);
|
||||
|
||||
emit userSettingUpdated (settingKey, list);
|
||||
}
|
||||
|
||||
CSMSettings::Setting *CSMSettings::UserSettings::findSetting
|
||||
(const QString &pageName, const QString &settingName)
|
||||
{
|
||||
foreach (Setting *setting, mSettings)
|
||||
{
|
||||
if (setting->name() == settingName)
|
||||
{
|
||||
if (setting->page() == pageName)
|
||||
return setting;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void CSMSettings::UserSettings::removeSetting
|
||||
(const QString &pageName, const QString &settingName)
|
||||
{
|
||||
if (mSettings.isEmpty())
|
||||
return;
|
||||
|
||||
QList <Setting *>::iterator removeIterator = mSettings.begin();
|
||||
|
||||
while (removeIterator != mSettings.end())
|
||||
{
|
||||
if ((*removeIterator)->name() == settingName)
|
||||
{
|
||||
if ((*removeIterator)->page() == pageName)
|
||||
{
|
||||
mSettings.erase (removeIterator);
|
||||
break;
|
||||
}
|
||||
}
|
||||
removeIterator++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
CSMSettings::SettingPageMap CSMSettings::UserSettings::settingPageMap() const
|
||||
{
|
||||
SettingPageMap pageMap;
|
||||
|
||||
foreach (Setting *setting, mSettings)
|
||||
pageMap[setting->page()].append (setting);
|
||||
|
||||
return pageMap;
|
||||
}
|
||||
|
||||
CSMSettings::Setting *CSMSettings::UserSettings::createSetting
|
||||
(CSMSettings::SettingType typ, const QString &page, const QString &name)
|
||||
{
|
||||
//get list of all settings for the current setting name
|
||||
if (findSetting (page, name))
|
||||
{
|
||||
qWarning() << "Duplicate declaration encountered: "
|
||||
<< (name + '/' + page);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Setting *setting = new Setting (typ, name, page);
|
||||
|
||||
|
||||
//add declaration to the model
|
||||
mSettings.append (setting);
|
||||
|
||||
return setting;
|
||||
}
|
||||
|
||||
QStringList CSMSettings::UserSettings::definitions (const QString &viewKey) const
|
||||
{
|
||||
if (mSettingDefinitions->contains (viewKey))
|
||||
return mSettingDefinitions->value (viewKey).toStringList();
|
||||
|
||||
return QStringList();
|
||||
}
|
||||
|
|
|
@ -1,14 +1,13 @@
|
|||
#ifndef USERSETTINGS_HPP
|
||||
#define USERSETTINGS_HPP
|
||||
|
||||
#include <QTextStream>
|
||||
#include <QList>
|
||||
#include <QStringList>
|
||||
#include <QString>
|
||||
#include <QMap>
|
||||
|
||||
#include <boost/filesystem/path.hpp>
|
||||
|
||||
#include "settingmanager.hpp"
|
||||
#include "support.hpp"
|
||||
|
||||
#ifndef Q_MOC_RUN
|
||||
#include <components/files/configurationmanager.hpp>
|
||||
|
@ -18,20 +17,23 @@ namespace Files { typedef std::vector<boost::filesystem::path> PathContainer;
|
|||
struct ConfigurationManager;}
|
||||
|
||||
class QFile;
|
||||
class QSettings;
|
||||
|
||||
namespace CSMSettings {
|
||||
|
||||
class UserSettings: public SettingManager
|
||||
class Setting;
|
||||
typedef QMap <QString, QList <Setting *> > SettingPageMap;
|
||||
|
||||
class UserSettings: public QObject
|
||||
{
|
||||
|
||||
Q_OBJECT
|
||||
|
||||
static UserSettings *mUserSettingsInstance;
|
||||
QString mUserFilePath;
|
||||
Files::ConfigurationManager mCfgMgr;
|
||||
|
||||
QString mReadOnlyMessage;
|
||||
QString mReadWriteMessage;
|
||||
QSettings *mSettingDefinitions;
|
||||
QList <Setting *> mSettings;
|
||||
|
||||
public:
|
||||
|
||||
|
@ -44,20 +46,50 @@ namespace CSMSettings {
|
|||
UserSettings (UserSettings const &); //not implemented
|
||||
void operator= (UserSettings const &); //not implemented
|
||||
|
||||
/// Writes settings to the last loaded settings file
|
||||
bool writeSettings();
|
||||
|
||||
/// Retrieves the settings file at all three levels (global, local and user).
|
||||
void loadSettings (const QString &fileName);
|
||||
|
||||
/// Writes settings to the user's config file path
|
||||
void saveSettings (const QMap <QString, QStringList > &settingMap);
|
||||
/// Updates QSettings and syncs with the ini file
|
||||
void setDefinitions (const QString &key, const QStringList &defs);
|
||||
|
||||
QString settingValue (const QString &settingKey);
|
||||
|
||||
///retrieve a setting object from a given page and setting name
|
||||
Setting *findSetting
|
||||
(const QString &pageName, const QString &settingName = QString());
|
||||
|
||||
///remove a setting from the list
|
||||
void removeSetting
|
||||
(const QString &pageName, const QString &settingName);
|
||||
|
||||
///Retreive a map of the settings, keyed by page name
|
||||
SettingPageMap settingPageMap() const;
|
||||
|
||||
///Returns a string list of defined vlaues for the specified setting
|
||||
///in "page/name" format.
|
||||
QStringList definitions (const QString &viewKey) const;
|
||||
|
||||
///Test to indicate whether or not a setting has any definitions
|
||||
bool hasSettingDefinitions (const QString &viewKey) const;
|
||||
|
||||
///Save any unsaved changes in the QSettings object
|
||||
void saveDefinitions() const;
|
||||
|
||||
private:
|
||||
|
||||
void buildSettingModelDefaults();
|
||||
|
||||
///add a new setting to the model and return it
|
||||
Setting *createSetting (CSMSettings::SettingType typ,
|
||||
const QString &page, const QString &name);
|
||||
|
||||
signals:
|
||||
|
||||
void userSettingUpdated (const QString &, const QStringList &);
|
||||
|
||||
public slots:
|
||||
|
||||
void updateUserSetting (const QString &, const QStringList &);
|
||||
};
|
||||
}
|
||||
#endif // USERSETTINGS_HPP
|
||||
|
|
|
@ -17,7 +17,7 @@ int CSMTools::BirthsignCheckStage::setup()
|
|||
return mBirthsigns.getSize();
|
||||
}
|
||||
|
||||
void CSMTools::BirthsignCheckStage::perform (int stage, std::vector<std::string>& messages)
|
||||
void CSMTools::BirthsignCheckStage::perform (int stage, Messages& messages)
|
||||
{
|
||||
const CSMWorld::Record<ESM::BirthSign>& record = mBirthsigns.getRecord (stage);
|
||||
|
||||
|
@ -30,13 +30,13 @@ void CSMTools::BirthsignCheckStage::perform (int stage, std::vector<std::string>
|
|||
|
||||
// test for empty name, description and texture
|
||||
if (birthsign.mName.empty())
|
||||
messages.push_back (id.toString() + "|" + birthsign.mId + " has an empty name");
|
||||
messages.push_back (std::make_pair (id, birthsign.mId + " has an empty name"));
|
||||
|
||||
if (birthsign.mDescription.empty())
|
||||
messages.push_back (id.toString() + "|" + birthsign.mId + " has an empty description");
|
||||
messages.push_back (std::make_pair (id, birthsign.mId + " has an empty description"));
|
||||
|
||||
if (birthsign.mTexture.empty())
|
||||
messages.push_back (id.toString() + "|" + birthsign.mId + " is missing a texture");
|
||||
messages.push_back (std::make_pair (id, birthsign.mId + " is missing a texture"));
|
||||
|
||||
/// \todo test if the texture exists
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@ namespace CSMTools
|
|||
virtual int setup();
|
||||
///< \return number of steps
|
||||
|
||||
virtual void perform (int stage, std::vector<std::string>& messages);
|
||||
virtual void perform (int stage, Messages& messages);
|
||||
///< Messages resulting from this tage will be appended to \a messages.
|
||||
};
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@ int CSMTools::ClassCheckStage::setup()
|
|||
return mClasses.getSize();
|
||||
}
|
||||
|
||||
void CSMTools::ClassCheckStage::perform (int stage, std::vector<std::string>& messages)
|
||||
void CSMTools::ClassCheckStage::perform (int stage, Messages& messages)
|
||||
{
|
||||
const CSMWorld::Record<ESM::Class>& record = mClasses.getRecord (stage);
|
||||
|
||||
|
@ -31,10 +31,10 @@ void CSMTools::ClassCheckStage::perform (int stage, std::vector<std::string>& me
|
|||
|
||||
// test for empty name and description
|
||||
if (class_.mName.empty())
|
||||
messages.push_back (id.toString() + "|" + class_.mId + " has an empty name");
|
||||
messages.push_back (std::make_pair (id, class_.mId + " has an empty name"));
|
||||
|
||||
if (class_.mDescription.empty())
|
||||
messages.push_back (id.toString() + "|" + class_.mId + " has an empty description");
|
||||
messages.push_back (std::make_pair (id, class_.mId + " has an empty description"));
|
||||
|
||||
// test for invalid attributes
|
||||
for (int i=0; i<2; ++i)
|
||||
|
@ -42,18 +42,14 @@ void CSMTools::ClassCheckStage::perform (int stage, std::vector<std::string>& me
|
|||
{
|
||||
std::ostringstream stream;
|
||||
|
||||
stream << id.toString() << "|Attribute #" << i << " of " << class_.mId << " is not set";
|
||||
stream << "Attribute #" << i << " of " << class_.mId << " is not set";
|
||||
|
||||
messages.push_back (stream.str());
|
||||
messages.push_back (std::make_pair (id, stream.str()));
|
||||
}
|
||||
|
||||
if (class_.mData.mAttribute[0]==class_.mData.mAttribute[1] && class_.mData.mAttribute[0]!=-1)
|
||||
{
|
||||
std::ostringstream stream;
|
||||
|
||||
stream << id.toString() << "|Class lists same attribute twice";
|
||||
|
||||
messages.push_back (stream.str());
|
||||
messages.push_back (std::make_pair (id, "Class lists same attribute twice"));
|
||||
}
|
||||
|
||||
// test for non-unique skill
|
||||
|
@ -66,12 +62,7 @@ void CSMTools::ClassCheckStage::perform (int stage, std::vector<std::string>& me
|
|||
for (std::map<int, int>::const_iterator iter (skills.begin()); iter!=skills.end(); ++iter)
|
||||
if (iter->second>1)
|
||||
{
|
||||
std::ostringstream stream;
|
||||
|
||||
stream
|
||||
<< id.toString() << "|"
|
||||
<< ESM::Skill::indexToId (iter->first) << " is listed more than once";
|
||||
|
||||
messages.push_back (stream.str());
|
||||
messages.push_back (std::make_pair (id,
|
||||
ESM::Skill::indexToId (iter->first) + " is listed more than once"));
|
||||
}
|
||||
}
|
|
@ -21,7 +21,7 @@ namespace CSMTools
|
|||
virtual int setup();
|
||||
///< \return number of steps
|
||||
|
||||
virtual void perform (int stage, std::vector<std::string>& messages);
|
||||
virtual void perform (int stage, Messages& messages);
|
||||
///< Messages resulting from this tage will be appended to \a messages.
|
||||
};
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@ int CSMTools::FactionCheckStage::setup()
|
|||
return mFactions.getSize();
|
||||
}
|
||||
|
||||
void CSMTools::FactionCheckStage::perform (int stage, std::vector<std::string>& messages)
|
||||
void CSMTools::FactionCheckStage::perform (int stage, Messages& messages)
|
||||
{
|
||||
const CSMWorld::Record<ESM::Faction>& record = mFactions.getRecord (stage);
|
||||
|
||||
|
@ -31,16 +31,12 @@ void CSMTools::FactionCheckStage::perform (int stage, std::vector<std::string>&
|
|||
|
||||
// test for empty name
|
||||
if (faction.mName.empty())
|
||||
messages.push_back (id.toString() + "|" + faction.mId + " has an empty name");
|
||||
messages.push_back (std::make_pair (id, faction.mId + " has an empty name"));
|
||||
|
||||
// test for invalid attributes
|
||||
if (faction.mData.mAttribute[0]==faction.mData.mAttribute[1] && faction.mData.mAttribute[0]!=-1)
|
||||
{
|
||||
std::ostringstream stream;
|
||||
|
||||
stream << id.toString() << "|Faction lists same attribute twice";
|
||||
|
||||
messages.push_back (stream.str());
|
||||
messages.push_back (std::make_pair (id , "Faction lists same attribute twice"));
|
||||
}
|
||||
|
||||
// test for non-unique skill
|
||||
|
@ -53,13 +49,8 @@ void CSMTools::FactionCheckStage::perform (int stage, std::vector<std::string>&
|
|||
for (std::map<int, int>::const_iterator iter (skills.begin()); iter!=skills.end(); ++iter)
|
||||
if (iter->second>1)
|
||||
{
|
||||
std::ostringstream stream;
|
||||
|
||||
stream
|
||||
<< id.toString() << "|"
|
||||
<< ESM::Skill::indexToId (iter->first) << " is listed more than once";
|
||||
|
||||
messages.push_back (stream.str());
|
||||
messages.push_back (std::make_pair (id,
|
||||
ESM::Skill::indexToId (iter->first) + " is listed more than once"));
|
||||
}
|
||||
|
||||
/// \todo check data members that can't be edited in the table view
|
||||
|
|
|
@ -21,7 +21,7 @@ namespace CSMTools
|
|||
virtual int setup();
|
||||
///< \return number of steps
|
||||
|
||||
virtual void perform (int stage, std::vector<std::string>& messages);
|
||||
virtual void perform (int stage, Messages& messages);
|
||||
///< Messages resulting from this tage will be appended to \a messages.
|
||||
};
|
||||
}
|
||||
|
|
|
@ -15,9 +15,10 @@ int CSMTools::MandatoryIdStage::setup()
|
|||
return mIds.size();
|
||||
}
|
||||
|
||||
void CSMTools::MandatoryIdStage::perform (int stage, std::vector<std::string>& messages)
|
||||
void CSMTools::MandatoryIdStage::perform (int stage, Messages& messages)
|
||||
{
|
||||
if (mIdCollection.searchId (mIds.at (stage))==-1 ||
|
||||
mIdCollection.getRecord (mIds.at (stage)).isDeleted())
|
||||
messages.push_back (mCollectionId.toString() + "|Missing mandatory record: " + mIds.at (stage));
|
||||
messages.push_back (std::make_pair (mCollectionId,
|
||||
"Missing mandatory record: " + mIds.at (stage)));
|
||||
}
|
|
@ -30,7 +30,7 @@ namespace CSMTools
|
|||
virtual int setup();
|
||||
///< \return number of steps
|
||||
|
||||
virtual void perform (int stage, std::vector<std::string>& messages);
|
||||
virtual void perform (int stage, Messages& messages);
|
||||
///< Messages resulting from this tage will be appended to \a messages.
|
||||
};
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
#include "../world/universalid.hpp"
|
||||
|
||||
void CSMTools::RaceCheckStage::performPerRecord (int stage, std::vector<std::string>& messages)
|
||||
void CSMTools::RaceCheckStage::performPerRecord (int stage, Messages& messages)
|
||||
{
|
||||
const CSMWorld::Record<ESM::Race>& record = mRaces.getRecord (stage);
|
||||
|
||||
|
@ -20,24 +20,24 @@ void CSMTools::RaceCheckStage::performPerRecord (int stage, std::vector<std::str
|
|||
|
||||
// test for empty name and description
|
||||
if (race.mName.empty())
|
||||
messages.push_back (id.toString() + "|" + race.mId + " has an empty name");
|
||||
messages.push_back (std::make_pair (id, race.mId + " has an empty name"));
|
||||
|
||||
if (race.mDescription.empty())
|
||||
messages.push_back (id.toString() + "|" + race.mId + " has an empty description");
|
||||
messages.push_back (std::make_pair (id, race.mId + " has an empty description"));
|
||||
|
||||
// test for positive height
|
||||
if (race.mData.mHeight.mMale<=0)
|
||||
messages.push_back (id.toString() + "|male " + race.mId + " has non-positive height");
|
||||
messages.push_back (std::make_pair (id, "male " + race.mId + " has non-positive height"));
|
||||
|
||||
if (race.mData.mHeight.mFemale<=0)
|
||||
messages.push_back (id.toString() + "|female " + race.mId + " has non-positive height");
|
||||
messages.push_back (std::make_pair (id, "female " + race.mId + " has non-positive height"));
|
||||
|
||||
// test for non-negative weight
|
||||
if (race.mData.mWeight.mMale<0)
|
||||
messages.push_back (id.toString() + "|male " + race.mId + " has negative weight");
|
||||
messages.push_back (std::make_pair (id, "male " + race.mId + " has negative weight"));
|
||||
|
||||
if (race.mData.mWeight.mFemale<0)
|
||||
messages.push_back (id.toString() + "|female " + race.mId + " has negative weight");
|
||||
messages.push_back (std::make_pair (id, "female " + race.mId + " has negative weight"));
|
||||
|
||||
// remember playable flag
|
||||
if (race.mData.mFlags & 0x1)
|
||||
|
@ -46,12 +46,12 @@ void CSMTools::RaceCheckStage::performPerRecord (int stage, std::vector<std::str
|
|||
/// \todo check data members that can't be edited in the table view
|
||||
}
|
||||
|
||||
void CSMTools::RaceCheckStage::performFinal (std::vector<std::string>& messages)
|
||||
void CSMTools::RaceCheckStage::performFinal (Messages& messages)
|
||||
{
|
||||
CSMWorld::UniversalId id (CSMWorld::UniversalId::Type_Races);
|
||||
|
||||
if (!mPlayable)
|
||||
messages.push_back (id.toString() + "|No playable race");
|
||||
messages.push_back (std::make_pair (id, "No playable race"));
|
||||
}
|
||||
|
||||
CSMTools::RaceCheckStage::RaceCheckStage (const CSMWorld::IdCollection<ESM::Race>& races)
|
||||
|
@ -64,7 +64,7 @@ int CSMTools::RaceCheckStage::setup()
|
|||
return mRaces.getSize()+1;
|
||||
}
|
||||
|
||||
void CSMTools::RaceCheckStage::perform (int stage, std::vector<std::string>& messages)
|
||||
void CSMTools::RaceCheckStage::perform (int stage, Messages& messages)
|
||||
{
|
||||
if (stage==mRaces.getSize())
|
||||
performFinal (messages);
|
||||
|
|
|
@ -15,9 +15,9 @@ namespace CSMTools
|
|||
const CSMWorld::IdCollection<ESM::Race>& mRaces;
|
||||
bool mPlayable;
|
||||
|
||||
void performPerRecord (int stage, std::vector<std::string>& messages);
|
||||
void performPerRecord (int stage, Messages& messages);
|
||||
|
||||
void performFinal (std::vector<std::string>& messages);
|
||||
void performFinal (Messages& messages);
|
||||
|
||||
public:
|
||||
|
||||
|
@ -26,7 +26,7 @@ namespace CSMTools
|
|||
virtual int setup();
|
||||
///< \return number of steps
|
||||
|
||||
virtual void perform (int stage, std::vector<std::string>& messages);
|
||||
virtual void perform (int stage, Messages& messages);
|
||||
///< Messages resulting from this tage will be appended to \a messages.
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
#include "referenceablecheck.hpp"
|
||||
|
||||
#include <components/misc/stringops.hpp>
|
||||
|
||||
#include "../world/record.hpp"
|
||||
#include "../world/universalid.hpp"
|
||||
#include <components/misc/stringops.hpp>
|
||||
|
||||
CSMTools::ReferenceableCheckStage::ReferenceableCheckStage(
|
||||
const CSMWorld::RefIdData& referenceable, const CSMWorld::IdCollection<ESM::Race >& races,
|
||||
|
@ -16,7 +18,7 @@ CSMTools::ReferenceableCheckStage::ReferenceableCheckStage(
|
|||
{
|
||||
}
|
||||
|
||||
void CSMTools::ReferenceableCheckStage::perform(int stage, std::vector< std::string >& messages)
|
||||
void CSMTools::ReferenceableCheckStage::perform (int stage, Messages& messages)
|
||||
{
|
||||
//Checks for books, than, when stage is above mBooksSize goes to other checks, with (stage - PrevSum) as stage.
|
||||
const int bookSize(mReferencables.getBooks().getSize());
|
||||
|
@ -206,11 +208,11 @@ void CSMTools::ReferenceableCheckStage::perform(int stage, std::vector< std::str
|
|||
staticCheck(stage, mReferencables.getStatics(), messages);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
stage -= staticSize;
|
||||
|
||||
const int creatureSize(mReferencables.getCreatures().getSize());
|
||||
|
||||
|
||||
if (stage < creatureSize)
|
||||
{
|
||||
creatureCheck(stage, mReferencables.getCreatures(), messages);
|
||||
|
@ -230,7 +232,7 @@ int CSMTools::ReferenceableCheckStage::setup()
|
|||
void CSMTools::ReferenceableCheckStage::bookCheck(
|
||||
int stage,
|
||||
const CSMWorld::RefIdDataContainer< ESM::Book >& records,
|
||||
std::vector< std::string >& messages)
|
||||
Messages& messages)
|
||||
{
|
||||
const CSMWorld::RecordBase& baseRecord = records.getRecord(stage);
|
||||
|
||||
|
@ -248,7 +250,7 @@ void CSMTools::ReferenceableCheckStage::bookCheck(
|
|||
void CSMTools::ReferenceableCheckStage::activatorCheck(
|
||||
int stage,
|
||||
const CSMWorld::RefIdDataContainer< ESM::Activator >& records,
|
||||
std::vector< std::string >& messages)
|
||||
Messages& messages)
|
||||
{
|
||||
const CSMWorld::RecordBase& baseRecord = records.getRecord(stage);
|
||||
|
||||
|
@ -262,15 +264,13 @@ void CSMTools::ReferenceableCheckStage::activatorCheck(
|
|||
|
||||
//Checking for model, IIRC all activators should have a model
|
||||
if (activator.mModel.empty())
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + activator.mId + " has no model");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, activator.mId + " has no model"));
|
||||
}
|
||||
|
||||
void CSMTools::ReferenceableCheckStage::potionCheck(
|
||||
int stage,
|
||||
const CSMWorld::RefIdDataContainer< ESM::Potion >& records,
|
||||
std::vector< std::string >& messages)
|
||||
Messages& messages)
|
||||
{
|
||||
const CSMWorld::RecordBase& baseRecord = records.getRecord(stage);
|
||||
|
||||
|
@ -290,7 +290,7 @@ void CSMTools::ReferenceableCheckStage::potionCheck(
|
|||
void CSMTools::ReferenceableCheckStage::apparatusCheck(
|
||||
int stage,
|
||||
const CSMWorld::RefIdDataContainer< ESM::Apparatus >& records,
|
||||
std::vector< std::string >& messages)
|
||||
Messages& messages)
|
||||
{
|
||||
const CSMWorld::RecordBase& baseRecord = records.getRecord(stage);
|
||||
|
||||
|
@ -310,7 +310,7 @@ void CSMTools::ReferenceableCheckStage::apparatusCheck(
|
|||
void CSMTools::ReferenceableCheckStage::armorCheck(
|
||||
int stage,
|
||||
const CSMWorld::RefIdDataContainer< ESM::Armor >& records,
|
||||
std::vector< std::string >& messages)
|
||||
Messages& messages)
|
||||
{
|
||||
const CSMWorld::RecordBase& baseRecord = records.getRecord(stage);
|
||||
|
||||
|
@ -326,21 +326,17 @@ void CSMTools::ReferenceableCheckStage::armorCheck(
|
|||
|
||||
//checking for armor class, armor should have poistive armor class, but 0 is considered legal
|
||||
if (armor.mData.mArmor < 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + armor.mId + " has negative armor class");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, armor.mId + " has negative armor class"));
|
||||
|
||||
//checking for health. Only positive numbers are allowed, or 0 is illegal
|
||||
if (armor.mData.mHealth <= 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + armor.mId + " has non positive health");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, armor.mId + " has non positive health"));
|
||||
}
|
||||
|
||||
void CSMTools::ReferenceableCheckStage::clothingCheck(
|
||||
int stage,
|
||||
const CSMWorld::RefIdDataContainer< ESM::Clothing >& records,
|
||||
std::vector< std::string >& messages)
|
||||
Messages& messages)
|
||||
{
|
||||
const CSMWorld::RecordBase& baseRecord = records.getRecord(stage);
|
||||
|
||||
|
@ -357,7 +353,7 @@ void CSMTools::ReferenceableCheckStage::clothingCheck(
|
|||
void CSMTools::ReferenceableCheckStage::containerCheck(
|
||||
int stage,
|
||||
const CSMWorld::RefIdDataContainer< ESM::Container >& records,
|
||||
std::vector< std::string >& messages)
|
||||
Messages& messages)
|
||||
{
|
||||
const CSMWorld::RecordBase& baseRecord = records.getRecord(stage);
|
||||
|
||||
|
@ -371,153 +367,109 @@ void CSMTools::ReferenceableCheckStage::containerCheck(
|
|||
|
||||
//Checking for model, IIRC all containers should have a model
|
||||
if (container.mModel.empty())
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + container.mId + " has no model");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, container.mId + " has no model"));
|
||||
|
||||
//Checking for capacity (weight)
|
||||
if (container.mWeight < 0) //0 is allowed
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + container.mId + " has negative weight (capacity)");
|
||||
}
|
||||
messages.push_back (std::make_pair (id,
|
||||
container.mId + " has negative weight (capacity)"));
|
||||
|
||||
//checking for name
|
||||
if (container.mName.empty())
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + container.mId + " has an empty name");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, container.mId + " has an empty name"));
|
||||
}
|
||||
|
||||
void CSMTools::ReferenceableCheckStage::creatureCheck(
|
||||
int stage,
|
||||
const CSMWorld::RefIdDataContainer< ESM::Creature >& records,
|
||||
std::vector< std::string >& messages)
|
||||
void CSMTools::ReferenceableCheckStage::creatureCheck (
|
||||
int stage, const CSMWorld::RefIdDataContainer< ESM::Creature >& records,
|
||||
Messages& messages)
|
||||
{
|
||||
const CSMWorld::RecordBase& baseRecord = records.getRecord(stage);
|
||||
|
||||
if (baseRecord.isDeleted())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
const ESM::Creature& creature = (dynamic_cast<const CSMWorld::Record<ESM::Creature>&>(baseRecord)).get();
|
||||
CSMWorld::UniversalId id(CSMWorld::UniversalId::Type_Creature, creature.mId);
|
||||
|
||||
if (creature.mModel.empty())
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + creature.mId + " has no model");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, creature.mId + " has no model"));
|
||||
|
||||
if (creature.mName.empty())
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + creature.mId + " has an empty name");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, creature.mId + " has an empty name"));
|
||||
|
||||
//stats checks
|
||||
if (creature.mData.mLevel < 1)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + creature.mId + " has non-postive level");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, creature.mId + " has non-postive level"));
|
||||
|
||||
if (creature.mData.mStrength < 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + creature.mId + " has negative strength");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, creature.mId + " has negative strength"));
|
||||
|
||||
if (creature.mData.mIntelligence < 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + creature.mId + " has negative intelligence");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, creature.mId + " has negative intelligence"));
|
||||
|
||||
if (creature.mData.mWillpower < 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + creature.mId + " has negative willpower");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, creature.mId + " has negative willpower"));
|
||||
|
||||
if (creature.mData.mAgility < 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + creature.mId + " has negative agility");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, creature.mId + " has negative agility"));
|
||||
|
||||
if (creature.mData.mSpeed < 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + creature.mId + " has negative speed");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, creature.mId + " has negative speed"));
|
||||
|
||||
if (creature.mData.mEndurance < 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + creature.mId + " has negative endurance");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, creature.mId + " has negative endurance"));
|
||||
|
||||
if (creature.mData.mPersonality < 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + creature.mId + " has negative personality");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, creature.mId + " has negative personality"));
|
||||
|
||||
if (creature.mData.mLuck < 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + creature.mId + " has negative luck");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, creature.mId + " has negative luck"));
|
||||
|
||||
if (creature.mData.mHealth < 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + creature.mId + " has negative health");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, creature.mId + " has negative health"));
|
||||
|
||||
if (creature.mData.mSoul < 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + creature.mId + " has negative soul value");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, creature.mId + " has negative soul value"));
|
||||
|
||||
for (int i = 0; i < 6; ++i)
|
||||
{
|
||||
if (creature.mData.mAttack[i] < 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + creature.mId + " has negative attack strength");
|
||||
messages.push_back (std::make_pair (id,
|
||||
creature.mId + " has negative attack strength"));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//TODO, find meaning of other values
|
||||
if (creature.mData.mGold < 0) //It seems that this is for gold in merchant creatures
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + creature.mId + " has negative gold ");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, creature.mId + " has negative gold "));
|
||||
}
|
||||
|
||||
void CSMTools::ReferenceableCheckStage::doorCheck(
|
||||
int stage,
|
||||
const CSMWorld::RefIdDataContainer< ESM::Door >& records,
|
||||
std::vector< std::string >& messages)
|
||||
int stage, const CSMWorld::RefIdDataContainer< ESM::Door >& records,
|
||||
Messages& messages)
|
||||
{
|
||||
const CSMWorld::RecordBase& baseRecord = records.getRecord(stage);
|
||||
|
||||
if (baseRecord.isDeleted())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
const ESM::Door& Door = (dynamic_cast<const CSMWorld::Record<ESM::Door>&>(baseRecord)).get();
|
||||
CSMWorld::UniversalId id(CSMWorld::UniversalId::Type_Door, Door.mId);
|
||||
|
||||
//usual, name or model
|
||||
if (Door.mName.empty())
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + Door.mId + " has an empty name");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, Door.mId + " has an empty name"));
|
||||
|
||||
if (Door.mModel.empty())
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + Door.mId + " has no model");
|
||||
}
|
||||
|
||||
//TODO, check what static unsigned int sRecordId; is for
|
||||
messages.push_back (std::make_pair (id, Door.mId + " has no model"));
|
||||
}
|
||||
|
||||
void CSMTools::ReferenceableCheckStage::ingredientCheck(
|
||||
int stage,
|
||||
const CSMWorld::RefIdDataContainer< ESM::Ingredient >& records,
|
||||
std::vector< std::string >& messages)
|
||||
Messages& messages)
|
||||
{
|
||||
const CSMWorld::RecordBase& baseRecord = records.getRecord(stage);
|
||||
|
||||
|
@ -535,7 +487,7 @@ void CSMTools::ReferenceableCheckStage::ingredientCheck(
|
|||
void CSMTools::ReferenceableCheckStage::creaturesLevListCheck(
|
||||
int stage,
|
||||
const CSMWorld::RefIdDataContainer< ESM::CreatureLevList >& records,
|
||||
std::vector< std::string >& messages)
|
||||
Messages& messages)
|
||||
{
|
||||
const CSMWorld::RecordBase& baseRecord = records.getRecord(stage);
|
||||
|
||||
|
@ -553,7 +505,7 @@ void CSMTools::ReferenceableCheckStage::creaturesLevListCheck(
|
|||
void CSMTools::ReferenceableCheckStage::itemLevelledListCheck(
|
||||
int stage,
|
||||
const CSMWorld::RefIdDataContainer< ESM::ItemLevList >& records,
|
||||
std::vector< std::string >& messages)
|
||||
Messages& messages)
|
||||
{
|
||||
const CSMWorld::RecordBase& baseRecord = records.getRecord(stage);
|
||||
|
||||
|
@ -569,40 +521,33 @@ void CSMTools::ReferenceableCheckStage::itemLevelledListCheck(
|
|||
}
|
||||
|
||||
void CSMTools::ReferenceableCheckStage::lightCheck(
|
||||
int stage,
|
||||
const CSMWorld::RefIdDataContainer< ESM::Light >& records,
|
||||
std::vector< std::string >& messages)
|
||||
int stage, const CSMWorld::RefIdDataContainer< ESM::Light >& records,
|
||||
Messages& messages)
|
||||
{
|
||||
const CSMWorld::RecordBase& baseRecord = records.getRecord(stage);
|
||||
|
||||
if (baseRecord.isDeleted())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
const ESM::Light& light = (dynamic_cast<const CSMWorld::Record<ESM::Light>& >(baseRecord)).get();
|
||||
CSMWorld::UniversalId id(CSMWorld::UniversalId::Type_Light, light.mId);
|
||||
|
||||
if (light.mData.mRadius < 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + light.mId + " has negative light radius");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, light.mId + " has negative light radius"));
|
||||
|
||||
if (light.mData.mFlags & ESM::Light::Carry)
|
||||
{
|
||||
inventoryItemCheck<ESM::Light>(light, messages, id.toString());
|
||||
|
||||
if (light.mData.mTime == 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + light.mId + " has zero duration");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, light.mId + " has zero duration"));
|
||||
}
|
||||
}
|
||||
|
||||
void CSMTools::ReferenceableCheckStage::lockpickCheck(
|
||||
int stage,
|
||||
const CSMWorld::RefIdDataContainer< ESM::Lockpick >& records,
|
||||
std::vector< std::string >& messages)
|
||||
Messages& messages)
|
||||
{
|
||||
const CSMWorld::RecordBase& baseRecord = records.getRecord(stage);
|
||||
|
||||
|
@ -622,7 +567,7 @@ void CSMTools::ReferenceableCheckStage::lockpickCheck(
|
|||
void CSMTools::ReferenceableCheckStage::miscCheck(
|
||||
int stage,
|
||||
const CSMWorld::RefIdDataContainer< ESM::Miscellaneous >& records,
|
||||
std::vector< std::string >& messages)
|
||||
Messages& messages)
|
||||
{
|
||||
const CSMWorld::RecordBase& baseRecord = records.getRecord(stage);
|
||||
|
||||
|
@ -637,20 +582,17 @@ void CSMTools::ReferenceableCheckStage::miscCheck(
|
|||
inventoryItemCheck<ESM::Miscellaneous>(miscellaneous, messages, id.toString());
|
||||
}
|
||||
|
||||
void CSMTools::ReferenceableCheckStage::npcCheck(
|
||||
int stage,
|
||||
const CSMWorld::RefIdDataContainer< ESM::NPC >& records,
|
||||
std::vector< std::string >& messages)
|
||||
void CSMTools::ReferenceableCheckStage::npcCheck (
|
||||
int stage, const CSMWorld::RefIdDataContainer< ESM::NPC >& records,
|
||||
Messages& messages)
|
||||
{
|
||||
const CSMWorld::RecordBase& baseRecord = records.getRecord(stage);
|
||||
|
||||
if (baseRecord.isDeleted())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
const ESM::NPC& npc = (dynamic_cast<const CSMWorld::Record<ESM::NPC>& >(baseRecord)).get();
|
||||
CSMWorld::UniversalId id(CSMWorld::UniversalId::Type_Npc, npc.mId);
|
||||
CSMWorld::UniversalId id (CSMWorld::UniversalId::Type_Npc, npc.mId);
|
||||
|
||||
short level(npc.mNpdt52.mLevel);
|
||||
char disposition(npc.mNpdt52.mDisposition);
|
||||
|
@ -661,15 +603,13 @@ void CSMTools::ReferenceableCheckStage::npcCheck(
|
|||
|
||||
//Detect if player is present
|
||||
if (Misc::StringUtils::ciEqual(npc.mId, "player")) //Happy now, scrawl?
|
||||
{
|
||||
mPlayerPresent = true;
|
||||
}
|
||||
|
||||
if (npc.mNpdtType == ESM::NPC::NPC_WITH_AUTOCALCULATED_STATS) //12 = autocalculated
|
||||
{
|
||||
if ((npc.mFlags & ESM::NPC::Autocalc) == 0) //0x0008 = autocalculated flag
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + npc.mId + " mNpdtType or flags mismatch!"); //should not happend?
|
||||
messages.push_back (std::make_pair (id, npc.mId + " mNpdtType or flags mismatch!")); //should not happend?
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -682,145 +622,100 @@ void CSMTools::ReferenceableCheckStage::npcCheck(
|
|||
else
|
||||
{
|
||||
if (npc.mNpdt52.mMana < 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + npc.mId + " mana has negative value");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, npc.mId + " mana has negative value"));
|
||||
|
||||
if (npc.mNpdt52.mFatigue < 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + npc.mId + " fatigue has negative value");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, npc.mId + " fatigue has negative value"));
|
||||
|
||||
if (npc.mNpdt52.mAgility == 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + npc.mId + " agility has zero value");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, npc.mId + " agility has zero value"));
|
||||
|
||||
if (npc.mNpdt52.mEndurance == 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + npc.mId + " endurance has zero value");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, npc.mId + " endurance has zero value"));
|
||||
|
||||
if (npc.mNpdt52.mIntelligence == 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + npc.mId + " intelligence has zero value");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, npc.mId + " intelligence has zero value"));
|
||||
|
||||
if (npc.mNpdt52.mLuck == 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + npc.mId + " luck has zero value");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, npc.mId + " luck has zero value"));
|
||||
|
||||
if (npc.mNpdt52.mPersonality == 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + npc.mId + " personality has zero value");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, npc.mId + " personality has zero value"));
|
||||
|
||||
if (npc.mNpdt52.mStrength == 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + npc.mId + " strength has zero value");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, npc.mId + " strength has zero value"));
|
||||
|
||||
if (npc.mNpdt52.mSpeed == 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + npc.mId + " speed has zero value");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, npc.mId + " speed has zero value"));
|
||||
|
||||
if (npc.mNpdt52.mWillpower == 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + npc.mId + " willpower has zero value");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, npc.mId + " willpower has zero value"));
|
||||
}
|
||||
|
||||
if (level < 1)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + npc.mId + " level is non positive");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, npc.mId + " level is non positive"));
|
||||
|
||||
if (gold < 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + npc.mId + " gold has negative value");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, npc.mId + " gold has negative value"));
|
||||
|
||||
if (npc.mName.empty())
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + npc.mId + " has any empty name");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, npc.mId + " has any empty name"));
|
||||
|
||||
if (npc.mClass.empty())
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + npc.mId + " has any empty class");
|
||||
messages.push_back (std::make_pair (id, npc.mId + " has any empty class"));
|
||||
}
|
||||
else //checking if there is such class
|
||||
else if (mClasses.searchId (npc.mClass) == -1)
|
||||
{
|
||||
if (mClasses.searchId(npc.mClass) == -1)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + npc.mId + " has invalid class");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, npc.mId + " has invalid class"));
|
||||
}
|
||||
|
||||
if (npc.mRace.empty())
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + npc.mId + " has any empty race");
|
||||
messages.push_back (std::make_pair (id, npc.mId + " has any empty race"));
|
||||
}
|
||||
else //checking if there is a such race
|
||||
else if (mRaces.searchId (npc.mRace) == -1)
|
||||
{
|
||||
if (mRaces.searchId(npc.mRace) == -1)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + npc.mId + " has invalid race");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, npc.mId + " has invalid race"));
|
||||
}
|
||||
|
||||
if (disposition < 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + npc.mId + " has negative disposition");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, npc.mId + " has negative disposition"));
|
||||
|
||||
if (reputation < 0) //It seems that no character in Morrowind.esm have negative reputation. I'm assuming that negative reputation is invalid
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + npc.mId + " has negative reputation");
|
||||
messages.push_back (std::make_pair (id, npc.mId + " has negative reputation"));
|
||||
}
|
||||
|
||||
if (npc.mFaction.empty() == false)
|
||||
if (!npc.mFaction.empty())
|
||||
{
|
||||
if (rank < 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + npc.mId + " has negative rank");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, npc.mId + " has negative rank"));
|
||||
|
||||
if (mFactions.searchId(npc.mFaction) == -1)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + npc.mId + " has invalid faction");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, npc.mId + " has invalid faction"));
|
||||
}
|
||||
|
||||
if (npc.mHead.empty())
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + npc.mId + " has no head");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, npc.mId + " has no head"));
|
||||
|
||||
if (npc.mHair.empty())
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + npc.mId + " has no hair");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, npc.mId + " has no hair"));
|
||||
|
||||
//TODO: reputation, Disposition, rank, everything else
|
||||
}
|
||||
|
||||
void CSMTools::ReferenceableCheckStage::weaponCheck(
|
||||
int stage,
|
||||
const CSMWorld::RefIdDataContainer< ESM::Weapon >& records,
|
||||
std::vector< std::string >& messages)
|
||||
int stage, const CSMWorld::RefIdDataContainer< ESM::Weapon >& records,
|
||||
Messages& messages)
|
||||
{
|
||||
const CSMWorld::RecordBase& baseRecord = records.getRecord(stage);
|
||||
const CSMWorld::RecordBase& baseRecord = records.getRecord (stage);
|
||||
|
||||
if (baseRecord.isDeleted())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
const ESM::Weapon& weapon = (dynamic_cast<const CSMWorld::Record<ESM::Weapon>& >(baseRecord)).get();
|
||||
CSMWorld::UniversalId id(CSMWorld::UniversalId::Type_Weapon, weapon.mId);
|
||||
CSMWorld::UniversalId id (CSMWorld::UniversalId::Type_Weapon, weapon.mId);
|
||||
|
||||
//TODO, It seems that this stuff for spellcasting is obligatory and In fact We should check if records are present
|
||||
if
|
||||
|
@ -860,20 +755,17 @@ void CSMTools::ReferenceableCheckStage::weaponCheck(
|
|||
weapon.mData.mType == ESM::Weapon::Bolt))
|
||||
{
|
||||
if (weapon.mData.mSlash[0] > weapon.mData.mSlash[1])
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + weapon.mId + " has minimum slash damage higher than maximum");
|
||||
}
|
||||
messages.push_back (std::make_pair (id,
|
||||
weapon.mId + " has minimum slash damage higher than maximum"));
|
||||
|
||||
if (weapon.mData.mThrust[0] > weapon.mData.mThrust[1])
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + weapon.mId + " has minimum thrust damage higher than maximum");
|
||||
}
|
||||
messages.push_back (std::make_pair (id,
|
||||
weapon.mId + " has minimum thrust damage higher than maximum"));
|
||||
}
|
||||
|
||||
if (weapon.mData.mChop[0] > weapon.mData.mChop[1])
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + weapon.mId + " has minimum chop damage higher than maximum");
|
||||
}
|
||||
messages.push_back (std::make_pair (id,
|
||||
weapon.mId + " has minimum chop damage higher than maximum"));
|
||||
|
||||
if (!(weapon.mData.mType == ESM::Weapon::Arrow ||
|
||||
weapon.mData.mType == ESM::Weapon::Bolt ||
|
||||
|
@ -881,14 +773,10 @@ void CSMTools::ReferenceableCheckStage::weaponCheck(
|
|||
{
|
||||
//checking of health
|
||||
if (weapon.mData.mHealth <= 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + weapon.mId + " has non-positivie health");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, weapon.mId + " has non-positivie health"));
|
||||
|
||||
if (weapon.mData.mReach < 0)
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + weapon.mId + " has negative reach");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, weapon.mId + " has negative reach"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -896,7 +784,7 @@ void CSMTools::ReferenceableCheckStage::weaponCheck(
|
|||
void CSMTools::ReferenceableCheckStage::probeCheck(
|
||||
int stage,
|
||||
const CSMWorld::RefIdDataContainer< ESM::Probe >& records,
|
||||
std::vector< std::string >& messages)
|
||||
Messages& messages)
|
||||
{
|
||||
const CSMWorld::RecordBase& baseRecord = records.getRecord(stage);
|
||||
|
||||
|
@ -912,184 +800,128 @@ void CSMTools::ReferenceableCheckStage::probeCheck(
|
|||
toolCheck<ESM::Probe>(probe, messages, id.toString(), true);
|
||||
}
|
||||
|
||||
void CSMTools::ReferenceableCheckStage::repairCheck(
|
||||
int stage,
|
||||
const CSMWorld::RefIdDataContainer< ESM::Repair >& records,
|
||||
std::vector< std::string >& messages)
|
||||
void CSMTools::ReferenceableCheckStage::repairCheck (
|
||||
int stage, const CSMWorld::RefIdDataContainer< ESM::Repair >& records,
|
||||
Messages& messages)
|
||||
{
|
||||
const CSMWorld::RecordBase& baseRecord = records.getRecord(stage);
|
||||
const CSMWorld::RecordBase& baseRecord = records.getRecord (stage);
|
||||
|
||||
if (baseRecord.isDeleted())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
const ESM::Repair& repair = (dynamic_cast<const CSMWorld::Record<ESM::Repair>& >(baseRecord)).get();
|
||||
CSMWorld::UniversalId id(CSMWorld::UniversalId::Type_Repair, repair.mId);
|
||||
CSMWorld::UniversalId id (CSMWorld::UniversalId::Type_Repair, repair.mId);
|
||||
|
||||
inventoryItemCheck<ESM::Repair>(repair, messages, id.toString());
|
||||
toolCheck<ESM::Repair>(repair, messages, id.toString(), true);
|
||||
inventoryItemCheck<ESM::Repair> (repair, messages, id.toString());
|
||||
toolCheck<ESM::Repair> (repair, messages, id.toString(), true);
|
||||
}
|
||||
|
||||
void CSMTools::ReferenceableCheckStage::staticCheck(
|
||||
int stage,
|
||||
const CSMWorld::RefIdDataContainer< ESM::Static >& records,
|
||||
std::vector< std::string >& messages)
|
||||
void CSMTools::ReferenceableCheckStage::staticCheck (
|
||||
int stage, const CSMWorld::RefIdDataContainer< ESM::Static >& records,
|
||||
Messages& messages)
|
||||
{
|
||||
const CSMWorld::RecordBase& baseRecord = records.getRecord(stage);
|
||||
const CSMWorld::RecordBase& baseRecord = records.getRecord (stage);
|
||||
|
||||
if (baseRecord.isDeleted())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
const ESM::Static& staticElement = (dynamic_cast<const CSMWorld::Record<ESM::Static>& >(baseRecord)).get();
|
||||
CSMWorld::UniversalId id(CSMWorld::UniversalId::Type_Static, staticElement.mId);
|
||||
CSMWorld::UniversalId id (CSMWorld::UniversalId::Type_Static, staticElement.mId);
|
||||
|
||||
if (staticElement.mModel.empty())
|
||||
{
|
||||
messages.push_back(id.toString() + "|" + staticElement.mId + " has no model");
|
||||
}
|
||||
messages.push_back (std::make_pair (id, staticElement.mId + " has no model"));
|
||||
}
|
||||
|
||||
//final check
|
||||
|
||||
void CSMTools::ReferenceableCheckStage::finalCheck(std::vector< std::string >& messages)
|
||||
void CSMTools::ReferenceableCheckStage::finalCheck (Messages& messages)
|
||||
{
|
||||
if (!mPlayerPresent)
|
||||
{
|
||||
CSMWorld::UniversalId id(CSMWorld::UniversalId::Type_Npc);
|
||||
messages.push_back(id.toString() + "| There is no player record");
|
||||
}
|
||||
messages.push_back (std::make_pair (CSMWorld::UniversalId::Type_Referenceables,
|
||||
"There is no player record"));
|
||||
}
|
||||
|
||||
|
||||
//Templates begins here
|
||||
|
||||
template<typename ITEM> void CSMTools::ReferenceableCheckStage::inventoryItemCheck(
|
||||
const ITEM& someItem,
|
||||
std::vector< std::string >& messages,
|
||||
const std::string& someID, bool enchantable)
|
||||
template<typename Item> void CSMTools::ReferenceableCheckStage::inventoryItemCheck (
|
||||
const Item& someItem, Messages& messages, const std::string& someID, bool enchantable)
|
||||
{
|
||||
if (someItem.mName.empty())
|
||||
{
|
||||
messages.push_back(someID + "|" + someItem.mId + " has an empty name");
|
||||
}
|
||||
messages.push_back (std::make_pair (someID, someItem.mId + " has an empty name"));
|
||||
|
||||
//Checking for weight
|
||||
if (someItem.mData.mWeight < 0)
|
||||
{
|
||||
messages.push_back(someID + "|" + someItem.mId + " has negative weight");
|
||||
}
|
||||
messages.push_back (std::make_pair (someID, someItem.mId + " has negative weight"));
|
||||
|
||||
//Checking for value
|
||||
if (someItem.mData.mValue < 0)
|
||||
{
|
||||
messages.push_back(someID + "|" + someItem.mId + " has negative value");
|
||||
}
|
||||
|
||||
//checking for model
|
||||
if (someItem.mModel.empty())
|
||||
{
|
||||
messages.push_back(someID + "|" + someItem.mId + " has no model");
|
||||
}
|
||||
|
||||
//checking for icon
|
||||
if (someItem.mIcon.empty())
|
||||
{
|
||||
messages.push_back(someID + "|" + someItem.mId + " has no icon");
|
||||
}
|
||||
|
||||
if (enchantable)
|
||||
{
|
||||
if (someItem.mData.mEnchant < 0)
|
||||
{
|
||||
messages.push_back(someID + "|" + someItem.mId + " has negative enchantment");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template<typename ITEM> void CSMTools::ReferenceableCheckStage::inventoryItemCheck(
|
||||
const ITEM& someItem,
|
||||
std::vector< std::string >& messages,
|
||||
const std::string& someID)
|
||||
{
|
||||
if (someItem.mName.empty())
|
||||
{
|
||||
messages.push_back(someID + "|" + someItem.mId + " has an empty name");
|
||||
}
|
||||
|
||||
//Checking for weight
|
||||
if (someItem.mData.mWeight < 0)
|
||||
{
|
||||
messages.push_back(someID + "|" + someItem.mId + " has negative weight");
|
||||
}
|
||||
|
||||
//Checking for value
|
||||
if (someItem.mData.mValue < 0)
|
||||
{
|
||||
messages.push_back(someID + "|" + someItem.mId + " has negative value");
|
||||
}
|
||||
messages.push_back (std::make_pair (someID, someItem.mId + " has negative value"));
|
||||
|
||||
//checking for model
|
||||
if (someItem.mModel.empty())
|
||||
{
|
||||
messages.push_back(someID + "|" + someItem.mId + " has no model");
|
||||
}
|
||||
messages.push_back (std::make_pair (someID, someItem.mId + " has no model"));
|
||||
|
||||
//checking for icon
|
||||
if (someItem.mIcon.empty())
|
||||
{
|
||||
messages.push_back(someID + "|" + someItem.mId + " has no icon");
|
||||
}
|
||||
messages.push_back (std::make_pair (someID, someItem.mId + " has no icon"));
|
||||
|
||||
if (enchantable && someItem.mData.mEnchant < 0)
|
||||
messages.push_back (std::make_pair (someID, someItem.mId + " has negative enchantment"));
|
||||
}
|
||||
|
||||
template<typename TOOL> void CSMTools::ReferenceableCheckStage::toolCheck(
|
||||
const TOOL& someTool,
|
||||
std::vector< std::string >& messages,
|
||||
const std::string& someID, bool canBeBroken)
|
||||
template<typename Item> void CSMTools::ReferenceableCheckStage::inventoryItemCheck (
|
||||
const Item& someItem, Messages& messages, const std::string& someID)
|
||||
{
|
||||
if (someItem.mName.empty())
|
||||
messages.push_back (std::make_pair (someID, someItem.mId + " has an empty name"));
|
||||
|
||||
//Checking for weight
|
||||
if (someItem.mData.mWeight < 0)
|
||||
messages.push_back (std::make_pair (someID, someItem.mId + " has negative weight"));
|
||||
|
||||
//Checking for value
|
||||
if (someItem.mData.mValue < 0)
|
||||
messages.push_back (std::make_pair (someID, someItem.mId + " has negative value"));
|
||||
|
||||
//checking for model
|
||||
if (someItem.mModel.empty())
|
||||
messages.push_back (std::make_pair (someID, someItem.mId + " has no model"));
|
||||
|
||||
//checking for icon
|
||||
if (someItem.mIcon.empty())
|
||||
messages.push_back (std::make_pair (someID, someItem.mId + " has no icon"));
|
||||
}
|
||||
|
||||
template<typename Tool> void CSMTools::ReferenceableCheckStage::toolCheck (
|
||||
const Tool& someTool, Messages& messages, const std::string& someID, bool canBeBroken)
|
||||
{
|
||||
if (someTool.mData.mQuality <= 0)
|
||||
{
|
||||
messages.push_back(someID + "|" + someTool.mId + " has non-positive quality");
|
||||
}
|
||||
messages.push_back (std::make_pair (someID, someTool.mId + " has non-positive quality"));
|
||||
|
||||
if (canBeBroken)
|
||||
{
|
||||
if (someTool.mData.mUses <= 0)
|
||||
{
|
||||
messages.push_back(someID + "|" + someTool.mId + " has non-positive uses count");
|
||||
}
|
||||
}
|
||||
if (canBeBroken && someTool.mData.mUses<=0)
|
||||
messages.push_back (std::make_pair (someID,
|
||||
someTool.mId + " has non-positive uses count"));
|
||||
}
|
||||
|
||||
template<typename TOOL> void CSMTools::ReferenceableCheckStage::toolCheck(
|
||||
const TOOL& someTool,
|
||||
std::vector< std::string >& messages,
|
||||
const std::string& someID)
|
||||
template<typename Tool> void CSMTools::ReferenceableCheckStage::toolCheck (
|
||||
const Tool& someTool, Messages& messages, const std::string& someID)
|
||||
{
|
||||
if (someTool.mData.mQuality <= 0)
|
||||
{
|
||||
messages.push_back(someID + "|" + someTool.mId + " has non-positive quality");
|
||||
}
|
||||
messages.push_back (std::make_pair (someID, someTool.mId + " has non-positive quality"));
|
||||
}
|
||||
|
||||
template<typename LIST> void CSMTools::ReferenceableCheckStage::listCheck(
|
||||
const LIST& someList,
|
||||
std::vector< std::string >& messages,
|
||||
const std::string& someID)
|
||||
template<typename List> void CSMTools::ReferenceableCheckStage::listCheck (
|
||||
const List& someList, Messages& messages, const std::string& someID)
|
||||
{
|
||||
for (unsigned i = 0; i < someList.mList.size(); ++i)
|
||||
{
|
||||
if (mReferencables.searchId(someList.mList[i].mId).first == -1)
|
||||
{
|
||||
messages.push_back(someID + "|" + someList.mId + " contains item without referencable");
|
||||
}
|
||||
messages.push_back (std::make_pair (someID,
|
||||
someList.mId + " contains item without referencable"));
|
||||
|
||||
if (someList.mList[i].mLevel < 1)
|
||||
{
|
||||
messages.push_back(someID + "|" + someList.mId + " contains item with non-positive level");
|
||||
}
|
||||
messages.push_back (std::make_pair (someID,
|
||||
someList.mId + " contains item with non-positive level"));
|
||||
}
|
||||
}
|
||||
// kate: indent-mode cstyle; indent-width 4; replace-tabs on;
|
||||
|
|
|
@ -11,63 +11,64 @@ namespace CSMTools
|
|||
class ReferenceableCheckStage : public CSMDoc::Stage
|
||||
{
|
||||
public:
|
||||
ReferenceableCheckStage(const CSMWorld::RefIdData& referenceable,
|
||||
const CSMWorld::IdCollection<ESM::Race>& races,
|
||||
const CSMWorld::IdCollection<ESM::Class>& classes,
|
||||
const CSMWorld::IdCollection<ESM::Faction>& factions);
|
||||
|
||||
virtual void perform(int stage, std::vector< std::string >& messages);
|
||||
ReferenceableCheckStage (const CSMWorld::RefIdData& referenceable,
|
||||
const CSMWorld::IdCollection<ESM::Race>& races,
|
||||
const CSMWorld::IdCollection<ESM::Class>& classes,
|
||||
const CSMWorld::IdCollection<ESM::Faction>& factions);
|
||||
|
||||
virtual void perform(int stage, Messages& messages);
|
||||
virtual int setup();
|
||||
|
||||
private:
|
||||
//CONCRETE CHECKS
|
||||
void bookCheck(int stage, const CSMWorld::RefIdDataContainer< ESM::Book >& records, std::vector< std::string >& messages);
|
||||
void activatorCheck(int stage, const CSMWorld::RefIdDataContainer< ESM::Activator >& records, std::vector< std::string >& messages);
|
||||
void potionCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Potion>& records, std::vector<std::string>& messages);
|
||||
void apparatusCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Apparatus>& records, std::vector<std::string>& messages);
|
||||
void armorCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Armor>& records, std::vector<std::string>& messages);
|
||||
void clothingCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Clothing>& records, std::vector<std::string>& messages);
|
||||
void containerCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Container>& records, std::vector<std::string>& messages);
|
||||
void creatureCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Creature>& records, std::vector<std::string>& messages);
|
||||
void doorCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Door>& records, std::vector<std::string>& messages);
|
||||
void ingredientCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Ingredient>& records, std::vector<std::string>& messages);
|
||||
void creaturesLevListCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::CreatureLevList>& records, std::vector<std::string>& messages);
|
||||
void itemLevelledListCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::ItemLevList>& records, std::vector<std::string>& messages);
|
||||
void lightCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Light>& records, std::vector<std::string>& messages);
|
||||
void lockpickCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Lockpick>& records, std::vector<std::string>& messages);
|
||||
void miscCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Miscellaneous>& records, std::vector<std::string>& messages);
|
||||
void npcCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::NPC>& records, std::vector<std::string>& messages);
|
||||
void weaponCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Weapon>& records, std::vector<std::string>& messages);
|
||||
void probeCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Probe>& records, std::vector<std::string>& messages);
|
||||
void repairCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Repair>& records, std::vector<std::string>& messages);
|
||||
void staticCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Static>& records, std::vector<std::string>& messages);
|
||||
|
||||
void bookCheck(int stage, const CSMWorld::RefIdDataContainer< ESM::Book >& records, Messages& messages);
|
||||
void activatorCheck(int stage, const CSMWorld::RefIdDataContainer< ESM::Activator >& records, Messages& messages);
|
||||
void potionCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Potion>& records, Messages& messages);
|
||||
void apparatusCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Apparatus>& records, Messages& messages);
|
||||
void armorCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Armor>& records, Messages& messages);
|
||||
void clothingCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Clothing>& records, Messages& messages);
|
||||
void containerCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Container>& records, Messages& messages);
|
||||
void creatureCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Creature>& records, Messages& messages);
|
||||
void doorCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Door>& records, Messages& messages);
|
||||
void ingredientCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Ingredient>& records, Messages& messages);
|
||||
void creaturesLevListCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::CreatureLevList>& records, Messages& messages);
|
||||
void itemLevelledListCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::ItemLevList>& records, Messages& messages);
|
||||
void lightCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Light>& records, Messages& messages);
|
||||
void lockpickCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Lockpick>& records, Messages& messages);
|
||||
void miscCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Miscellaneous>& records, Messages& messages);
|
||||
void npcCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::NPC>& records, Messages& messages);
|
||||
void weaponCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Weapon>& records, Messages& messages);
|
||||
void probeCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Probe>& records, Messages& messages);
|
||||
void repairCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Repair>& records, Messages& messages);
|
||||
void staticCheck(int stage, const CSMWorld::RefIdDataContainer<ESM::Static>& records, Messages& messages);
|
||||
|
||||
//FINAL CHECK
|
||||
void finalCheck(std::vector<std::string>& messages);
|
||||
|
||||
void finalCheck (Messages& messages);
|
||||
|
||||
//TEMPLATE CHECKS
|
||||
template<typename ITEM> void inventoryItemCheck(const ITEM& someItem,
|
||||
std::vector<std::string>& messages,
|
||||
Messages& messages,
|
||||
const std::string& someID,
|
||||
bool enchantable); //for all enchantable items.
|
||||
|
||||
|
||||
template<typename ITEM> void inventoryItemCheck(const ITEM& someItem,
|
||||
std::vector<std::string>& messages,
|
||||
Messages& messages,
|
||||
const std::string& someID); //for non-enchantable items.
|
||||
|
||||
|
||||
template<typename TOOL> void toolCheck(const TOOL& someTool,
|
||||
std::vector<std::string>& messages,
|
||||
Messages& messages,
|
||||
const std::string& someID,
|
||||
bool canbebroken); //for tools with uses.
|
||||
|
||||
|
||||
template<typename TOOL> void toolCheck(const TOOL& someTool,
|
||||
std::vector<std::string>& messages,
|
||||
Messages& messages,
|
||||
const std::string& someID); //for tools without uses.
|
||||
|
||||
template<typename LIST> void listCheck(const LIST& someList,
|
||||
std::vector< std::string >& messages,
|
||||
Messages& messages,
|
||||
const std::string& someID);
|
||||
|
||||
|
||||
const CSMWorld::RefIdData& mReferencables;
|
||||
const CSMWorld::IdCollection<ESM::Race>& mRaces;
|
||||
const CSMWorld::IdCollection<ESM::Class>& mClasses;
|
||||
|
|
|
@ -17,7 +17,7 @@ int CSMTools::RegionCheckStage::setup()
|
|||
return mRegions.getSize();
|
||||
}
|
||||
|
||||
void CSMTools::RegionCheckStage::perform (int stage, std::vector<std::string>& messages)
|
||||
void CSMTools::RegionCheckStage::perform (int stage, Messages& messages)
|
||||
{
|
||||
const CSMWorld::Record<ESM::Region>& record = mRegions.getRecord (stage);
|
||||
|
||||
|
@ -30,7 +30,7 @@ void CSMTools::RegionCheckStage::perform (int stage, std::vector<std::string>& m
|
|||
|
||||
// test for empty name
|
||||
if (region.mName.empty())
|
||||
messages.push_back (id.toString() + "|" + region.mId + " has an empty name");
|
||||
messages.push_back (std::make_pair (id, region.mId + " has an empty name"));
|
||||
|
||||
/// \todo test that the ID in mSleeplist exists
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@ namespace CSMTools
|
|||
virtual int setup();
|
||||
///< \return number of steps
|
||||
|
||||
virtual void perform (int stage, std::vector<std::string>& messages);
|
||||
virtual void perform (int stage, Messages& messages);
|
||||
///< Messages resulting from this tage will be appended to \a messages.
|
||||
};
|
||||
}
|
||||
|
|
|
@ -51,16 +51,11 @@ bool CSMTools::ReportModel::removeRows (int row, int count, const QModelIndex& p
|
|||
return true;
|
||||
}
|
||||
|
||||
void CSMTools::ReportModel::add (const std::string& row)
|
||||
void CSMTools::ReportModel::add (const CSMWorld::UniversalId& id, const std::string& message)
|
||||
{
|
||||
std::string::size_type index = row.find ('|');
|
||||
|
||||
if (index==std::string::npos)
|
||||
throw std::logic_error ("invalid report message");
|
||||
|
||||
beginInsertRows (QModelIndex(), mRows.size(), mRows.size());
|
||||
|
||||
mRows.push_back (std::make_pair (row.substr (0, index), row.substr (index+1)));
|
||||
mRows.push_back (std::make_pair (id, message));
|
||||
|
||||
endInsertRows();
|
||||
}
|
||||
|
|
|
@ -28,7 +28,7 @@ namespace CSMTools
|
|||
|
||||
virtual bool removeRows (int row, int count, const QModelIndex& parent = QModelIndex());
|
||||
|
||||
void add (const std::string& row);
|
||||
void add (const CSMWorld::UniversalId& id, const std::string& message);
|
||||
|
||||
const CSMWorld::UniversalId& getUniversalId (int row) const;
|
||||
};
|
||||
|
|
|
@ -16,8 +16,6 @@ void CSMTools::ScriptCheckStage::report (const std::string& message, const Compi
|
|||
|
||||
CSMWorld::UniversalId id (CSMWorld::UniversalId::Type_Script, mId);
|
||||
|
||||
stream << id.toString() << "|";
|
||||
|
||||
if (type==ErrorMessage)
|
||||
stream << "error ";
|
||||
else
|
||||
|
@ -28,25 +26,15 @@ void CSMTools::ScriptCheckStage::report (const std::string& message, const Compi
|
|||
<< ", line " << loc.mLine << ", column " << loc.mColumn
|
||||
<< " (" << loc.mLiteral << "): " << message;
|
||||
|
||||
mMessages->push_back (stream.str());
|
||||
mMessages->push_back (std::make_pair (id, stream.str()));
|
||||
}
|
||||
|
||||
void CSMTools::ScriptCheckStage::report (const std::string& message, Type type)
|
||||
{
|
||||
std::ostringstream stream;
|
||||
|
||||
CSMWorld::UniversalId id (CSMWorld::UniversalId::Type_Script, mId);
|
||||
|
||||
stream << id.toString() << "|";
|
||||
|
||||
if (type==ErrorMessage)
|
||||
stream << "error: ";
|
||||
else
|
||||
stream << "warning: ";
|
||||
|
||||
stream << message;
|
||||
|
||||
mMessages->push_back (stream.str());
|
||||
mMessages->push_back (std::make_pair (id,
|
||||
(type==ErrorMessage ? "error: " : "warning: ") + message));
|
||||
}
|
||||
|
||||
CSMTools::ScriptCheckStage::ScriptCheckStage (const CSMWorld::Data& data)
|
||||
|
@ -68,7 +56,7 @@ int CSMTools::ScriptCheckStage::setup()
|
|||
return mData.getScripts().getSize();
|
||||
}
|
||||
|
||||
void CSMTools::ScriptCheckStage::perform (int stage, std::vector<std::string>& messages)
|
||||
void CSMTools::ScriptCheckStage::perform (int stage, Messages& messages)
|
||||
{
|
||||
mMessages = &messages;
|
||||
mId = mData.getScripts().getId (stage);
|
||||
|
@ -90,13 +78,10 @@ void CSMTools::ScriptCheckStage::perform (int stage, std::vector<std::string>& m
|
|||
}
|
||||
catch (const std::exception& error)
|
||||
{
|
||||
std::ostringstream stream;
|
||||
|
||||
CSMWorld::UniversalId id (CSMWorld::UniversalId::Type_Script, mId);
|
||||
|
||||
stream << id.toString() << "|Critical compile error: " << error.what();
|
||||
|
||||
messages.push_back (stream.str());
|
||||
messages.push_back (std::make_pair (id,
|
||||
std::string ("Critical compile error: ") + error.what()));
|
||||
}
|
||||
|
||||
mMessages = 0;
|
||||
|
|
|
@ -18,7 +18,7 @@ namespace CSMTools
|
|||
CSMWorld::ScriptContext mContext;
|
||||
std::string mId;
|
||||
std::string mFile;
|
||||
std::vector<std::string> *mMessages;
|
||||
Messages *mMessages;
|
||||
|
||||
virtual void report (const std::string& message, const Compiler::TokenLoc& loc, Type type);
|
||||
///< Report error to the user.
|
||||
|
@ -33,7 +33,7 @@ namespace CSMTools
|
|||
virtual int setup();
|
||||
///< \return number of steps
|
||||
|
||||
virtual void perform (int stage, std::vector<std::string>& messages);
|
||||
virtual void perform (int stage, Messages& messages);
|
||||
///< Messages resulting from this tage will be appended to \a messages.
|
||||
};
|
||||
}
|
||||
|
|
|
@ -16,7 +16,7 @@ int CSMTools::SkillCheckStage::setup()
|
|||
return mSkills.getSize();
|
||||
}
|
||||
|
||||
void CSMTools::SkillCheckStage::perform (int stage, std::vector<std::string>& messages)
|
||||
void CSMTools::SkillCheckStage::perform (int stage, Messages& messages)
|
||||
{
|
||||
const CSMWorld::Record<ESM::Skill>& record = mSkills.getRecord (stage);
|
||||
|
||||
|
@ -32,11 +32,11 @@ void CSMTools::SkillCheckStage::perform (int stage, std::vector<std::string>& me
|
|||
{
|
||||
std::ostringstream stream;
|
||||
|
||||
stream << id.toString() << "|Use value #" << i << " of " << skill.mId << " is negative";
|
||||
stream << "Use value #" << i << " of " << skill.mId << " is negative";
|
||||
|
||||
messages.push_back (stream.str());
|
||||
messages.push_back (std::make_pair (id, stream.str()));
|
||||
}
|
||||
|
||||
if (skill.mDescription.empty())
|
||||
messages.push_back (id.toString() + "|" + skill.mId + " has an empty description");
|
||||
messages.push_back (std::make_pair (id, skill.mId + " has an empty description"));
|
||||
}
|
|
@ -21,7 +21,7 @@ namespace CSMTools
|
|||
virtual int setup();
|
||||
///< \return number of steps
|
||||
|
||||
virtual void perform (int stage, std::vector<std::string>& messages);
|
||||
virtual void perform (int stage, Messages& messages);
|
||||
///< Messages resulting from this tage will be appended to \a messages.
|
||||
};
|
||||
}
|
||||
|
|
|
@ -16,7 +16,7 @@ int CSMTools::SoundCheckStage::setup()
|
|||
return mSounds.getSize();
|
||||
}
|
||||
|
||||
void CSMTools::SoundCheckStage::perform (int stage, std::vector<std::string>& messages)
|
||||
void CSMTools::SoundCheckStage::perform (int stage, Messages& messages)
|
||||
{
|
||||
const CSMWorld::Record<ESM::Sound>& record = mSounds.getRecord (stage);
|
||||
|
||||
|
@ -28,7 +28,7 @@ void CSMTools::SoundCheckStage::perform (int stage, std::vector<std::string>& me
|
|||
CSMWorld::UniversalId id (CSMWorld::UniversalId::Type_Sound, sound.mId);
|
||||
|
||||
if (sound.mData.mMinRange>sound.mData.mMaxRange)
|
||||
messages.push_back (id.toString() + "|Maximum range larger than minimum range");
|
||||
messages.push_back (std::make_pair (id, "Maximum range larger than minimum range"));
|
||||
|
||||
/// \todo check, if the sound file exists
|
||||
}
|
|
@ -21,7 +21,7 @@ namespace CSMTools
|
|||
virtual int setup();
|
||||
///< \return number of steps
|
||||
|
||||
virtual void perform (int stage, std::vector<std::string>& messages);
|
||||
virtual void perform (int stage, Messages& messages);
|
||||
///< Messages resulting from this tage will be appended to \a messages.
|
||||
};
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@ int CSMTools::SpellCheckStage::setup()
|
|||
return mSpells.getSize();
|
||||
}
|
||||
|
||||
void CSMTools::SpellCheckStage::perform (int stage, std::vector<std::string>& messages)
|
||||
void CSMTools::SpellCheckStage::perform (int stage, Messages& messages)
|
||||
{
|
||||
const CSMWorld::Record<ESM::Spell>& record = mSpells.getRecord (stage);
|
||||
|
||||
|
@ -30,11 +30,11 @@ void CSMTools::SpellCheckStage::perform (int stage, std::vector<std::string>& me
|
|||
|
||||
// test for empty name and description
|
||||
if (spell.mName.empty())
|
||||
messages.push_back (id.toString() + "|" + spell.mId + " has an empty name");
|
||||
messages.push_back (std::make_pair (id, spell.mId + " has an empty name"));
|
||||
|
||||
// test for invalid cost values
|
||||
if (spell.mData.mCost<0)
|
||||
messages.push_back (id.toString() + "|" + spell.mId + " has a negative spell costs");
|
||||
messages.push_back (std::make_pair (id, spell.mId + " has a negative spell costs"));
|
||||
|
||||
/// \todo check data members that can't be edited in the table view
|
||||
}
|
|
@ -21,7 +21,7 @@ namespace CSMTools
|
|||
virtual int setup();
|
||||
///< \return number of steps
|
||||
|
||||
virtual void perform (int stage, std::vector<std::string>& messages);
|
||||
virtual void perform (int stage, Messages& messages);
|
||||
///< Messages resulting from this tage will be appended to \a messages.
|
||||
};
|
||||
}
|
||||
|
|
|
@ -45,8 +45,9 @@ CSMDoc::Operation *CSMTools::Tools::getVerifier()
|
|||
|
||||
connect (mVerifier, SIGNAL (progress (int, int, int)), this, SIGNAL (progress (int, int, int)));
|
||||
connect (mVerifier, SIGNAL (done (int)), this, SIGNAL (done (int)));
|
||||
connect (mVerifier, SIGNAL (reportMessage (const QString&, int)),
|
||||
this, SLOT (verifierMessage (const QString&, int)));
|
||||
connect (mVerifier,
|
||||
SIGNAL (reportMessage (const CSMWorld::UniversalId&, const std::string&, int)),
|
||||
this, SLOT (verifierMessage (const CSMWorld::UniversalId&, const std::string&, int)));
|
||||
|
||||
std::vector<std::string> mandatoryIds; // I want C++11, damn it!
|
||||
mandatoryIds.push_back ("Day");
|
||||
|
@ -138,11 +139,12 @@ CSMTools::ReportModel *CSMTools::Tools::getReport (const CSMWorld::UniversalId&
|
|||
return mReports.at (id.getIndex());
|
||||
}
|
||||
|
||||
void CSMTools::Tools::verifierMessage (const QString& message, int type)
|
||||
void CSMTools::Tools::verifierMessage (const CSMWorld::UniversalId& id, const std::string& message,
|
||||
int type)
|
||||
{
|
||||
std::map<int, int>::iterator iter = mActiveReports.find (type);
|
||||
|
||||
if (iter!=mActiveReports.end())
|
||||
mReports[iter->second]->add (message.toUtf8().constData());
|
||||
mReports[iter->second]->add (id, message);
|
||||
}
|
||||
|
||||
|
|
|
@ -61,7 +61,8 @@ namespace CSMTools
|
|||
|
||||
private slots:
|
||||
|
||||
void verifierMessage (const QString& message, int type);
|
||||
void verifierMessage (const CSMWorld::UniversalId& id, const std::string& message,
|
||||
int type);
|
||||
|
||||
signals:
|
||||
|
||||
|
|
|
@ -236,10 +236,10 @@ CSVDoc::View::View (ViewManager& viewManager, CSMDoc::Document *document, int to
|
|||
mViewTotal (totalViews)
|
||||
{
|
||||
QString width = CSMSettings::UserSettings::instance().settingValue
|
||||
("Window Size.Width");
|
||||
("Window Size/Width");
|
||||
|
||||
QString height = CSMSettings::UserSettings::instance().settingValue
|
||||
("Window Size.Height");
|
||||
("Window Size/Height");
|
||||
|
||||
resize (width.toInt(), height.toInt());
|
||||
|
||||
|
|
|
@ -76,22 +76,9 @@ void CSVSettings::Dialog::buildPages()
|
|||
mStackedWidget->addWidget (&dynamic_cast<QWidget &>(*(page)));
|
||||
}
|
||||
|
||||
addDebugPage();
|
||||
|
||||
resize (mStackedWidget->sizeHint());
|
||||
}
|
||||
|
||||
void CSVSettings::Dialog::addDebugPage()
|
||||
{
|
||||
/*
|
||||
QTreeView *tree = new QTreeView();
|
||||
|
||||
//tree->setModel( &CSMSettings::UserSettings::instance().model() );
|
||||
|
||||
mStackedWidget->addWidget(tree);
|
||||
new QListWidgetItem ("Standard Item Model", mPageListWidget);*/
|
||||
}
|
||||
|
||||
void CSVSettings::Dialog::buildPageListWidget (QWidget *centralWidget)
|
||||
{
|
||||
mPageListWidget = new QListWidget (centralWidget);
|
||||
|
@ -122,7 +109,11 @@ void CSVSettings::Dialog::closeEvent (QCloseEvent *event)
|
|||
void CSVSettings::Dialog::show()
|
||||
{
|
||||
if (pages().isEmpty())
|
||||
{
|
||||
buildPages();
|
||||
setViewValues();
|
||||
}
|
||||
|
||||
QPoint screenCenter = QApplication::desktop()->screenGeometry().center();
|
||||
|
||||
move (screenCenter - geometry().center());
|
||||
|
|
|
@ -41,7 +41,6 @@ namespace CSVSettings {
|
|||
void buildPages();
|
||||
void buildPageListWidget (QWidget *centralWidget);
|
||||
void buildStackedWidget (QWidget *centralWidget);
|
||||
void addDebugPage();
|
||||
|
||||
public slots:
|
||||
|
||||
|
|
|
@ -44,11 +44,13 @@ namespace CSVSettings
|
|||
void setHLayout() { mIsHorizontal = true; }
|
||||
void setVLayout() { mIsHorizontal = false; }
|
||||
|
||||
///show / hide widgets (when stacked widget page changes)
|
||||
void showWidgets();
|
||||
void hideWidgets();
|
||||
|
||||
private:
|
||||
|
||||
///functions which return the index for the next layout row / column
|
||||
int getNextColumn() const;
|
||||
int getNextRow() const;
|
||||
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
#ifndef CSVSETTINGS_PAGE_HPP
|
||||
#define CSVSETTINGS_PAGE_HPP
|
||||
|
||||
#include <QSizePolicy>
|
||||
#include <QWidget>
|
||||
#include <QMap>
|
||||
#include <QList>
|
||||
|
@ -40,6 +39,7 @@ namespace CSVSettings
|
|||
///and returns it.
|
||||
View *findView (const QString &page, const QString &setting) const;
|
||||
|
||||
///returns the list of views associated with the page
|
||||
const QList <View *> &views () const { return mViews; }
|
||||
|
||||
private:
|
||||
|
|
|
@ -1,6 +1,3 @@
|
|||
#include <QHBoxLayout>
|
||||
#include <QVBoxLayout>
|
||||
#include <QGroupBox>
|
||||
#include <QSpinBox>
|
||||
#include <QDoubleSpinBox>
|
||||
#include <QAbstractSpinBox>
|
||||
|
|
|
@ -21,13 +21,19 @@ namespace CSVSettings
|
|||
Page *parent);
|
||||
|
||||
protected:
|
||||
|
||||
///virtual function called through View
|
||||
void updateView (bool signalUpdate = true) const;
|
||||
|
||||
///construct a slider-based view
|
||||
void buildSlider (CSMSettings::Setting *setting);
|
||||
|
||||
///construct a spinbox-based view
|
||||
void buildSpinBox (CSMSettings::Setting *setting);
|
||||
|
||||
private slots:
|
||||
|
||||
///responds to valueChanged signals
|
||||
void slotUpdateView (int value);
|
||||
void slotUpdateView (double value);
|
||||
|
||||
|
|
|
@ -14,8 +14,10 @@ namespace CSVSettings
|
|||
public:
|
||||
explicit ResizeableStackedWidget(QWidget *parent = 0);
|
||||
|
||||
///add a widget to the stacked widget
|
||||
void addWidget(QWidget* pWidget);
|
||||
|
||||
///called whenever the stacked widget page is changed
|
||||
void changePage (int, int);
|
||||
};
|
||||
}
|
||||
|
|
|
@ -57,7 +57,7 @@ void CSVSettings::SettingWindow::createConnections
|
|||
|
||||
foreach (const QString &key, proxyMap.keys())
|
||||
{
|
||||
QStringList keyPair = key.split('.');
|
||||
QStringList keyPair = key.split('/');
|
||||
|
||||
if (keyPair.size() != 2)
|
||||
continue;
|
||||
|
@ -82,6 +82,25 @@ void CSVSettings::SettingWindow::createConnections
|
|||
}
|
||||
}
|
||||
|
||||
void CSVSettings::SettingWindow::setViewValues()
|
||||
{
|
||||
//iterate each page and view, setting their definintions
|
||||
//if they exist in the model
|
||||
foreach (const Page *page, mPages)
|
||||
{
|
||||
foreach (const View *view, page->views())
|
||||
{
|
||||
//testing beforehand prevents overwriting a proxy setting
|
||||
if (!mModel->hasSettingDefinitions (view->viewKey()))
|
||||
continue;
|
||||
|
||||
QStringList defs = mModel->definitions (view->viewKey());
|
||||
|
||||
view->setSelectedValues(defs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CSVSettings::View *CSVSettings::SettingWindow::findView
|
||||
(const QString &pageName, const QString &setting)
|
||||
{
|
||||
|
@ -95,17 +114,19 @@ CSVSettings::View *CSVSettings::SettingWindow::findView
|
|||
|
||||
void CSVSettings::SettingWindow::saveSettings()
|
||||
{
|
||||
QMap <QString, QStringList> settingMap;
|
||||
|
||||
//setting the definition in the model automatically syncs with the file
|
||||
foreach (const Page *page, mPages)
|
||||
{
|
||||
foreach (const View *view, page->views())
|
||||
{
|
||||
if (view->serializable())
|
||||
settingMap[view->viewKey()] = view->selectedValues();
|
||||
if (!view->serializable())
|
||||
continue;
|
||||
|
||||
mModel->setDefinitions (view->viewKey(), view->selectedValues());
|
||||
}
|
||||
}
|
||||
CSMSettings::UserSettings::instance().saveSettings (settingMap);
|
||||
|
||||
mModel->saveDefinitions();
|
||||
}
|
||||
|
||||
void CSVSettings::SettingWindow::closeEvent (QCloseEvent *event)
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
namespace CSMSettings {
|
||||
class Setting;
|
||||
class SettingManager;
|
||||
class UserSettings;
|
||||
}
|
||||
|
||||
namespace CSVSettings {
|
||||
|
@ -23,25 +23,36 @@ namespace CSVSettings {
|
|||
Q_OBJECT
|
||||
|
||||
PageList mPages;
|
||||
CSMSettings::SettingManager *mModel;
|
||||
CSMSettings::UserSettings *mModel;
|
||||
|
||||
public:
|
||||
explicit SettingWindow(QWidget *parent = 0);
|
||||
|
||||
///retrieve a reference to a view based on it's page and setting name
|
||||
View *findView (const QString &pageName, const QString &setting);
|
||||
void setModel (CSMSettings::SettingManager &model) { mModel = &model; }
|
||||
|
||||
///set the model the view uses (instance of UserSettings)
|
||||
void setModel (CSMSettings::UserSettings &model) { mModel = &model; }
|
||||
|
||||
protected:
|
||||
|
||||
virtual void closeEvent (QCloseEvent *event);
|
||||
|
||||
///construct the pages to be displayed in the dialog
|
||||
void createPages();
|
||||
|
||||
///return the list of constructed pages
|
||||
const PageList &pages() const { return mPages; }
|
||||
|
||||
///save settings from the GUI to file
|
||||
void saveSettings();
|
||||
|
||||
///sets the defined values for the views that have been created
|
||||
void setViewValues();
|
||||
|
||||
private:
|
||||
|
||||
///create connections between settings (used for proxy settings)
|
||||
void createConnections (const QList <CSMSettings::Setting *> &list);
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
#include "spinbox.hpp"
|
||||
|
||||
#include <QSpinBox>
|
||||
#include <QLineEdit>
|
||||
|
||||
CSVSettings::SpinBox::SpinBox(QWidget *parent)
|
||||
|
@ -14,7 +13,7 @@ QString CSVSettings::SpinBox::textFromValue(int val) const
|
|||
if (mValueList.isEmpty())
|
||||
return QVariant (val).toString();
|
||||
|
||||
QString value = "";
|
||||
QString value;
|
||||
|
||||
if (val < mValueList.size())
|
||||
value = mValueList.at (val);
|
||||
|
|
|
@ -16,15 +16,22 @@ namespace CSVSettings
|
|||
public:
|
||||
explicit SpinBox(QWidget *parent = 0);
|
||||
|
||||
void setObjectName (const QString &name);
|
||||
|
||||
///set the value displayed in the spin box
|
||||
void setValue (const QString &value);
|
||||
|
||||
///set the stringlist that's used as a list of pre-defined values
|
||||
///to be displayed as the user scrolls
|
||||
void setValueList (const QStringList &list);
|
||||
|
||||
///returns the pre-defined value list.
|
||||
const QStringList &valueList() const { return mValueList; }
|
||||
|
||||
protected:
|
||||
|
||||
///converts an index value to corresponding text to be displayed
|
||||
QString textFromValue (int val) const;
|
||||
|
||||
///converts a text value to a corresponding index
|
||||
int valueFromText (const QString &text) const;
|
||||
};
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@ namespace CSVSettings
|
|||
|
||||
protected:
|
||||
|
||||
/// virtual function called through View
|
||||
void updateView (bool signalUpdate = true) const;
|
||||
|
||||
protected slots:
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
#include <QStringListModel>
|
||||
#include <QSortFilterProxyModel>
|
||||
#include <QStandardItemModel>
|
||||
#include <QStandardItem>
|
||||
#include <QApplication>
|
||||
#include <QItemSelectionModel>
|
||||
#include <QStringListModel>
|
||||
|
||||
#include "view.hpp"
|
||||
#include "../../model/settings/support.hpp"
|
||||
|
@ -14,7 +15,7 @@ CSVSettings::View::View(CSMSettings::Setting *setting,
|
|||
: mDataModel(0), mParentPage (parent),
|
||||
mHasFixedValues (!setting->declaredValues().isEmpty()),
|
||||
mIsMultiValue (setting->isMultiValue()),
|
||||
mViewKey (setting->page() + '.' + setting->name()),
|
||||
mViewKey (setting->page() + '/' + setting->name()),
|
||||
mSerializable (setting->serializable()),
|
||||
Frame(true, setting->name(), parent)
|
||||
{
|
||||
|
@ -25,10 +26,7 @@ CSVSettings::View::View(CSMSettings::Setting *setting,
|
|||
|
||||
void CSVSettings::View::buildModel (const CSMSettings::Setting *setting)
|
||||
{
|
||||
QStringList values = setting->definedValues();
|
||||
|
||||
if (values.isEmpty())
|
||||
values.append (setting->defaultValues());
|
||||
QStringList values = setting->defaultValues();
|
||||
|
||||
if (mHasFixedValues)
|
||||
buildFixedValueModel (setting->declaredValues());
|
||||
|
@ -42,24 +40,22 @@ void CSVSettings::View::buildModel (const CSMSettings::Setting *setting)
|
|||
|
||||
void CSVSettings::View::buildFixedValueModel (const QStringList &values)
|
||||
{
|
||||
//fixed value models are simple string list models, since they are read-only
|
||||
mDataModel = new QStringListModel (values, this);
|
||||
}
|
||||
|
||||
void CSVSettings::View::buildUpdatableValueModel (const QStringList &values)
|
||||
{
|
||||
//updateable models are standard item models because they support
|
||||
//replacing entire columns
|
||||
QList <QStandardItem *> itemList;
|
||||
|
||||
foreach (const QString &value, values)
|
||||
itemList.append (new QStandardItem(value));
|
||||
|
||||
// QSortFilterProxyModel *filter = new QSortFilterProxyModel (this);
|
||||
QStandardItemModel *model = new QStandardItemModel (this);
|
||||
model->appendColumn (itemList);
|
||||
|
||||
// filter->setSourceModel (model);
|
||||
/* filter->setFilterRegExp ("*");
|
||||
filter->setFilterKeyColumn (0);
|
||||
filter->setFilterRole (Qt::DisplayRole);*/
|
||||
mDataModel = model;
|
||||
}
|
||||
|
||||
|
@ -117,7 +113,7 @@ void CSVSettings::View::setSelectedValue (const QString &value,
|
|||
}
|
||||
|
||||
void CSVSettings::View::setSelectedValues (const QStringList &list,
|
||||
bool doViewUpdate, bool signalUpdate)
|
||||
bool doViewUpdate, bool signalUpdate) const
|
||||
{
|
||||
QItemSelection selection;
|
||||
|
||||
|
@ -151,9 +147,6 @@ void CSVSettings::View::setSelectedValues (const QStringList &list,
|
|||
}
|
||||
select (selection);
|
||||
|
||||
//push changes to model side
|
||||
|
||||
|
||||
//update the view if the selection was set from the model side, not by the
|
||||
//user
|
||||
if (doViewUpdate)
|
||||
|
@ -192,7 +185,6 @@ bool CSVSettings::View::stringListsMatch (
|
|||
QList <QStandardItem *> CSVSettings::View::toStandardItemList
|
||||
(const QStringList &list) const
|
||||
{
|
||||
|
||||
QList <QStandardItem *> itemList;
|
||||
|
||||
foreach (const QString &value, list)
|
||||
|
@ -212,12 +204,12 @@ QString CSVSettings::View::value (int row) const
|
|||
if (row > -1 && row < mDataModel->rowCount())
|
||||
return mDataModel->data (mDataModel->index(row, 0)).toString();
|
||||
|
||||
return "";
|
||||
return QString();
|
||||
}
|
||||
|
||||
int CSVSettings::View::widgetWidth(int characterCount) const
|
||||
{
|
||||
QString widthToken = QString().fill ('P', characterCount);
|
||||
QString widthToken = QString().fill ('m', characterCount);
|
||||
QFontMetrics fm (QApplication::font());
|
||||
|
||||
return (fm.width (widthToken));
|
||||
|
|
|
@ -11,8 +11,6 @@ class QGroupBox;
|
|||
class QStringList;
|
||||
class QStandardItem;
|
||||
class QItemSelection;
|
||||
class QStringListModel;
|
||||
class QStandardItemModel;
|
||||
class QAbstractItemModel;
|
||||
class QItemSelectionModel;
|
||||
|
||||
|
@ -42,17 +40,16 @@ namespace CSVSettings
|
|||
///State indicating whether the view will allow multiple values
|
||||
bool mIsMultiValue;
|
||||
|
||||
///'pagename.settingname' form of the view's id
|
||||
QString mViewKey;
|
||||
|
||||
///indicates whether or not the setting is written to file
|
||||
bool mSerializable;
|
||||
|
||||
public:
|
||||
|
||||
explicit View (CSMSettings::Setting *setting, Page *parent);
|
||||
|
||||
///Physical frame in which the view UI is contained
|
||||
void addViewWidget (QWidget *widget, int row = -1, int col = -1) const;
|
||||
|
||||
///Returns the index / row of the passed value, -1 if not found.
|
||||
int currentIndex () const;
|
||||
|
||||
|
@ -74,7 +71,7 @@ namespace CSVSettings
|
|||
///or signaling the view was updatedto avoid viscious cylcing.
|
||||
void setSelectedValues (const QStringList &values,
|
||||
bool updateView = true,
|
||||
bool signalUpdate = true);
|
||||
bool signalUpdate = true) const;
|
||||
|
||||
void setSelectedValue (const QString &value,
|
||||
bool updateView = true,
|
||||
|
|
|
@ -7,18 +7,19 @@
|
|||
CSVWorld::DataDisplayDelegate::DataDisplayDelegate(const ValueList &values,
|
||||
const IconList &icons,
|
||||
QUndoStack &undoStack,
|
||||
const QString &settingKey,
|
||||
const QString &pageName,
|
||||
const QString &settingName,
|
||||
QObject *parent)
|
||||
: EnumDelegate (values, undoStack, parent), mDisplayMode (Mode_TextOnly),
|
||||
mIcons (icons), mIconSize (QSize(16, 16)), mIconLeftOffset(3),
|
||||
mTextLeftOffset(8), mSettingKey (settingKey)
|
||||
mTextLeftOffset(8), mSettingKey (pageName + '/' + settingName)
|
||||
{
|
||||
mTextAlignment.setAlignment (Qt::AlignLeft | Qt::AlignVCenter );
|
||||
|
||||
buildPixmaps();
|
||||
|
||||
QString value =
|
||||
CSMSettings::UserSettings::instance().settingValue (settingKey);
|
||||
CSMSettings::UserSettings::instance().settingValue (mSettingKey);
|
||||
|
||||
updateDisplayMode(value);
|
||||
}
|
||||
|
@ -140,7 +141,7 @@ CSVWorld::CommandDelegate *CSVWorld::DataDisplayDelegateFactory::makeDelegate (Q
|
|||
QObject *parent) const
|
||||
{
|
||||
|
||||
return new DataDisplayDelegate (mValues, mIcons, undoStack, "", parent);
|
||||
return new DataDisplayDelegate (mValues, mIcons, undoStack, "", "", parent);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -41,7 +41,8 @@ namespace CSVWorld
|
|||
explicit DataDisplayDelegate (const ValueList & values,
|
||||
const IconList & icons,
|
||||
QUndoStack& undoStack,
|
||||
const QString &settingKey,
|
||||
const QString &pageName,
|
||||
const QString &settingName,
|
||||
QObject *parent);
|
||||
|
||||
~DataDisplayDelegate();
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
CSVWorld::IdTypeDelegate::IdTypeDelegate
|
||||
(const ValueList &values, const IconList &icons, QUndoStack& undoStack, QObject *parent)
|
||||
: DataDisplayDelegate (values, icons, undoStack,
|
||||
"Display Format.Referenceable ID Type Display",
|
||||
"Display Format", "Referenceable ID Type Display",
|
||||
parent)
|
||||
{}
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ CSVWorld::RecordStatusDelegate::RecordStatusDelegate(const ValueList& values,
|
|||
const IconList & icons,
|
||||
QUndoStack &undoStack, QObject *parent)
|
||||
: DataDisplayDelegate (values, icons, undoStack,
|
||||
"Display Format.Record Status Display",
|
||||
"Display Format", "Record Status Display",
|
||||
parent)
|
||||
{}
|
||||
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
[Editor]
|
||||
Record Status Display = Icon and Text
|
||||
[Window Size]
|
||||
Width = 640
|
||||
Height = 480
|
7
files/opencs.ini
Normal file
7
files/opencs.ini
Normal file
|
@ -0,0 +1,7 @@
|
|||
[Display%20Format]
|
||||
Record%20Status%20Display=Icon Only
|
||||
Referenceable%20ID%20Type%20Display=Text Only
|
||||
|
||||
[Window%20Size]
|
||||
Height=900
|
||||
Width=1440
|
Loading…
Reference in a new issue