forked from teamnwah/openmw-tes3coop
added severity attribute for operation messages (Fixes #2717)
This commit is contained in:
parent
8791832c86
commit
197b8ec731
13 changed files with 117 additions and 40 deletions
|
@ -52,7 +52,7 @@ void CSMDoc::Loader::load()
|
|||
{
|
||||
if (iter->second.mRecordsLeft)
|
||||
{
|
||||
CSMDoc::Messages messages;
|
||||
Messages messages (Message::Severity_Error);
|
||||
for (int i=0; i<batchingSize; ++i) // do not flood the system with update signals
|
||||
if (document->getData().continueLoading (messages))
|
||||
{
|
||||
|
@ -68,8 +68,7 @@ void CSMDoc::Loader::load()
|
|||
for (CSMDoc::Messages::Iterator iter (messages.begin());
|
||||
iter!=messages.end(); ++iter)
|
||||
{
|
||||
document->getReport (log)->add (
|
||||
CSMDoc::Message (iter->mId, iter->mMessage, ""));
|
||||
document->getReport (log)->add (*iter);
|
||||
emit loadMessage (document, iter->mMessage);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,15 +4,22 @@
|
|||
CSMDoc::Message::Message() {}
|
||||
|
||||
CSMDoc::Message::Message (const CSMWorld::UniversalId& id, const std::string& message,
|
||||
const std::string& hint)
|
||||
: mId (id), mMessage (message), mHint (hint)
|
||||
const std::string& hint, Severity severity)
|
||||
: mId (id), mMessage (message), mHint (hint), mSeverity (severity)
|
||||
{}
|
||||
|
||||
|
||||
CSMDoc::Messages::Messages (Message::Severity default_ = Message::Severity_Error)
|
||||
: mDefault (default_)
|
||||
{}
|
||||
|
||||
void CSMDoc::Messages::add (const CSMWorld::UniversalId& id, const std::string& message,
|
||||
const std::string& hint)
|
||||
const std::string& hint, Message::Severity severity)
|
||||
{
|
||||
mMessages.push_back (Message (id, message, hint));
|
||||
if (severity==Message::Severity_Default)
|
||||
severity = mDefault;
|
||||
|
||||
mMessages.push_back (Message (id, message, hint, severity));
|
||||
}
|
||||
|
||||
void CSMDoc::Messages::push_back (const std::pair<CSMWorld::UniversalId, std::string>& data)
|
||||
|
|
|
@ -12,14 +12,25 @@ namespace CSMDoc
|
|||
{
|
||||
struct Message
|
||||
{
|
||||
enum Severity
|
||||
{
|
||||
Severity_Info = 0, // no problem
|
||||
Severity_Warning = 1, // a potential problem, but we are probably fine
|
||||
Severity_Error = 2, // an error; we are not fine
|
||||
Severity_SeriousError = 3, // an error so bad we can't even be sure if we are
|
||||
// reporting it correctly
|
||||
Severity_Default = 4
|
||||
};
|
||||
|
||||
CSMWorld::UniversalId mId;
|
||||
std::string mMessage;
|
||||
std::string mHint;
|
||||
Severity mSeverity;
|
||||
|
||||
Message();
|
||||
|
||||
Message (const CSMWorld::UniversalId& id, const std::string& message,
|
||||
const std::string& hint);
|
||||
const std::string& hint, Severity severity);
|
||||
};
|
||||
|
||||
class Messages
|
||||
|
@ -36,11 +47,15 @@ namespace CSMDoc
|
|||
private:
|
||||
|
||||
Collection mMessages;
|
||||
Message::Severity mDefault;
|
||||
|
||||
public:
|
||||
|
||||
Messages (Message::Severity default_);
|
||||
|
||||
void add (const CSMWorld::UniversalId& id, const std::string& message,
|
||||
const std::string& hint = "");
|
||||
const std::string& hint = "",
|
||||
Message::Severity severity = Message::Severity_Default);
|
||||
|
||||
/// \deprecated Use add instead.
|
||||
void push_back (const std::pair<CSMWorld::UniversalId, std::string>& data);
|
||||
|
|
|
@ -33,7 +33,8 @@ void CSMDoc::Operation::prepareStages()
|
|||
CSMDoc::Operation::Operation (int type, bool ordered, bool finalAlways)
|
||||
: mType (type), mStages(std::vector<std::pair<Stage *, int> >()), mCurrentStage(mStages.begin()),
|
||||
mCurrentStep(0), mCurrentStepTotal(0), mTotalSteps(0), mOrdered (ordered),
|
||||
mFinalAlways (finalAlways), mError(false), mConnected (false), mPrepared (false)
|
||||
mFinalAlways (finalAlways), mError(false), mConnected (false), mPrepared (false),
|
||||
mDefaultSeverity (Message::Severity_Error)
|
||||
{
|
||||
mTimer = new QTimer (this);
|
||||
}
|
||||
|
@ -72,6 +73,11 @@ void CSMDoc::Operation::configureSettings (const std::vector<QString>& settings)
|
|||
}
|
||||
}
|
||||
|
||||
void CSMDoc::Operation::setDefaultSeverity (Message::Severity severity)
|
||||
{
|
||||
mDefaultSeverity = severity;
|
||||
}
|
||||
|
||||
bool CSMDoc::Operation::hasError() const
|
||||
{
|
||||
return mError;
|
||||
|
@ -112,7 +118,7 @@ void CSMDoc::Operation::executeStage()
|
|||
mPrepared = true;
|
||||
}
|
||||
|
||||
Messages messages;
|
||||
Messages messages (mDefaultSeverity);
|
||||
|
||||
while (mCurrentStage!=mStages.end())
|
||||
{
|
||||
|
@ -129,7 +135,7 @@ void CSMDoc::Operation::executeStage()
|
|||
}
|
||||
catch (const std::exception& e)
|
||||
{
|
||||
emit reportMessage (Message (CSMWorld::UniversalId(), e.what(), ""), mType);
|
||||
emit reportMessage (Message (CSMWorld::UniversalId(), e.what(), "", Message::Severity_SeriousError), mType);
|
||||
abort();
|
||||
}
|
||||
|
||||
|
|
|
@ -36,6 +36,7 @@ namespace CSMDoc
|
|||
QTimer *mTimer;
|
||||
std::map<QString, QStringList> mSettings;
|
||||
bool mPrepared;
|
||||
Message::Severity mDefaultSeverity;
|
||||
|
||||
void prepareStages();
|
||||
|
||||
|
@ -57,6 +58,9 @@ namespace CSMDoc
|
|||
/// \attention Do no call this function while this Operation is running.
|
||||
void configureSettings (const std::vector<QString>& settings);
|
||||
|
||||
/// \attention Do no call this function while this Operation is running.
|
||||
void setDefaultSeverity (Message::Severity severity);
|
||||
|
||||
bool hasError() const;
|
||||
|
||||
signals:
|
||||
|
|
|
@ -6,19 +6,18 @@
|
|||
|
||||
#include "../world/columns.hpp"
|
||||
|
||||
CSMTools::ReportModel::ReportModel (bool fieldColumn)
|
||||
CSMTools::ReportModel::ReportModel (bool fieldColumn, bool severityColumn)
|
||||
: mColumnField (-1), mColumnSeverity (-1)
|
||||
{
|
||||
if (fieldColumn)
|
||||
{
|
||||
mColumnField = 3;
|
||||
mColumnDescription = 4;
|
||||
}
|
||||
else
|
||||
{
|
||||
mColumnDescription = 3;
|
||||
int index = 3;
|
||||
|
||||
mColumnField = -1;
|
||||
}
|
||||
if (severityColumn)
|
||||
mColumnSeverity = index++;
|
||||
|
||||
if (fieldColumn)
|
||||
mColumnField = index++;
|
||||
|
||||
mColumnDescription = index;
|
||||
}
|
||||
|
||||
int CSMTools::ReportModel::rowCount (const QModelIndex & parent) const
|
||||
|
@ -84,6 +83,18 @@ QVariant CSMTools::ReportModel::data (const QModelIndex & index, int role) const
|
|||
return QString::fromUtf8 (field.c_str());
|
||||
}
|
||||
|
||||
if (index.column()==mColumnSeverity)
|
||||
{
|
||||
switch (mRows.at (index.row()).mSeverity)
|
||||
{
|
||||
case CSMDoc::Message::Severity_Info: return "Information";
|
||||
case CSMDoc::Message::Severity_Warning: return "Warning";
|
||||
case CSMDoc::Message::Severity_Error: return "Error";
|
||||
case CSMDoc::Message::Severity_SeriousError: return "Serious Error";
|
||||
case CSMDoc::Message::Severity_Default: break;
|
||||
}
|
||||
}
|
||||
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
|
@ -107,6 +118,9 @@ QVariant CSMTools::ReportModel::headerData (int section, Qt::Orientation orienta
|
|||
if (section==mColumnField)
|
||||
return "Field";
|
||||
|
||||
if (section==mColumnSeverity)
|
||||
return "Severity";
|
||||
|
||||
return "-";
|
||||
}
|
||||
|
||||
|
@ -170,3 +184,16 @@ void CSMTools::ReportModel::clear()
|
|||
endRemoveRows();
|
||||
}
|
||||
}
|
||||
|
||||
int CSMTools::ReportModel::countErrors() const
|
||||
{
|
||||
int count = 0;
|
||||
|
||||
for (std::vector<CSMDoc::Messages::Message>::const_iterator iter (mRows.begin());
|
||||
iter!=mRows.end(); ++iter)
|
||||
if (iter->mSeverity==CSMDoc::Message::Severity_Error ||
|
||||
iter->mSeverity==CSMDoc::Message::Severity_SeriousError)
|
||||
++count;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
|
|
@ -27,10 +27,11 @@ namespace CSMTools
|
|||
// Configurable columns
|
||||
int mColumnDescription;
|
||||
int mColumnField;
|
||||
int mColumnSeverity;
|
||||
|
||||
public:
|
||||
|
||||
ReportModel (bool fieldColumn = false);
|
||||
ReportModel (bool fieldColumn = false, bool severityColumn = true);
|
||||
|
||||
virtual int rowCount (const QModelIndex & parent = QModelIndex()) const;
|
||||
|
||||
|
@ -51,6 +52,9 @@ namespace CSMTools
|
|||
std::string getHint (int row) const;
|
||||
|
||||
void clear();
|
||||
|
||||
// Return number of messages with Error or SeriousError severity.
|
||||
int countErrors() const;
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -11,6 +11,17 @@
|
|||
|
||||
#include "../world/data.hpp"
|
||||
|
||||
CSMDoc::Message::Severity CSMTools::ScriptCheckStage::getSeverity (Type type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case WarningMessage: return CSMDoc::Message::Severity_Warning;
|
||||
case ErrorMessage: return CSMDoc::Message::Severity_Error;
|
||||
}
|
||||
|
||||
return CSMDoc::Message::Severity_SeriousError;
|
||||
}
|
||||
|
||||
void CSMTools::ScriptCheckStage::report (const std::string& message, const Compiler::TokenLoc& loc,
|
||||
Type type)
|
||||
{
|
||||
|
@ -18,11 +29,6 @@ void CSMTools::ScriptCheckStage::report (const std::string& message, const Compi
|
|||
|
||||
CSMWorld::UniversalId id (CSMWorld::UniversalId::Type_Script, mId);
|
||||
|
||||
if (type==ErrorMessage)
|
||||
stream << "error ";
|
||||
else
|
||||
stream << "warning ";
|
||||
|
||||
stream
|
||||
<< "script " << mFile
|
||||
<< ", line " << loc.mLine << ", column " << loc.mColumn
|
||||
|
@ -32,15 +38,17 @@ void CSMTools::ScriptCheckStage::report (const std::string& message, const Compi
|
|||
|
||||
hintStream << "l:" << loc.mLine << " " << loc.mColumn;
|
||||
|
||||
mMessages->add (id, stream.str(), hintStream.str());
|
||||
mMessages->add (id, stream.str(), hintStream.str(), getSeverity (type));
|
||||
}
|
||||
|
||||
void CSMTools::ScriptCheckStage::report (const std::string& message, Type type)
|
||||
{
|
||||
CSMWorld::UniversalId id (CSMWorld::UniversalId::Type_Script, mId);
|
||||
|
||||
mMessages->push_back (std::make_pair (id,
|
||||
(type==ErrorMessage ? "error: " : "warning: ") + message));
|
||||
std::ostringstream stream;
|
||||
stream << "script " << mFile << ": " << message;
|
||||
|
||||
mMessages->add (id, stream.str(), "", getSeverity (type));
|
||||
}
|
||||
|
||||
CSMTools::ScriptCheckStage::ScriptCheckStage (const CSMDoc::Document& document)
|
||||
|
@ -100,8 +108,10 @@ void CSMTools::ScriptCheckStage::perform (int stage, CSMDoc::Messages& messages)
|
|||
{
|
||||
CSMWorld::UniversalId id (CSMWorld::UniversalId::Type_Script, mId);
|
||||
|
||||
messages.push_back (std::make_pair (id,
|
||||
std::string ("Critical compile error: ") + error.what()));
|
||||
std::ostringstream stream;
|
||||
stream << "script " << mFile << ": " << error.what();
|
||||
|
||||
messages.add (id, stream.str(), "", CSMDoc::Message::Severity_SeriousError);
|
||||
}
|
||||
|
||||
mMessages = 0;
|
||||
|
|
|
@ -32,6 +32,7 @@ namespace CSMTools
|
|||
CSMDoc::Messages *mMessages;
|
||||
WarningMode mWarningMode;
|
||||
|
||||
CSMDoc::Message::Severity getSeverity (Type type);
|
||||
|
||||
virtual void report (const std::string& message, const Compiler::TokenLoc& loc, Type type);
|
||||
///< Report error to the user.
|
||||
|
|
|
@ -280,7 +280,7 @@ void CSMTools::Search::replace (CSMDoc::Document& document, CSMWorld::IdTableBas
|
|||
bool CSMTools::Search::verify (CSMDoc::Document& document, CSMWorld::IdTableBase *model,
|
||||
const CSMWorld::UniversalId& id, const std::string& messageHint) const
|
||||
{
|
||||
CSMDoc::Messages messages;
|
||||
CSMDoc::Messages messages (CSMDoc::Message::Severity_Info);
|
||||
|
||||
int row = model->getModelIndex (id.getId(),
|
||||
model->findColumnIndex (CSMWorld::Columns::ColumnId_Id)).row();
|
||||
|
|
|
@ -21,6 +21,8 @@ CSMTools::SearchOperation::SearchOperation (CSMDoc::Document& document)
|
|||
iter!=types.end(); ++iter)
|
||||
appendStage (new SearchStage (&dynamic_cast<CSMWorld::IdTableBase&> (
|
||||
*document.getData().getTableModel (*iter))));
|
||||
|
||||
setDefaultSeverity (CSMDoc::Message::Severity_Info);
|
||||
}
|
||||
|
||||
void CSMTools::SearchOperation::configure (const Search& search)
|
||||
|
|
|
@ -158,7 +158,7 @@ CSMWorld::UniversalId CSMTools::Tools::runVerifier()
|
|||
|
||||
CSMWorld::UniversalId CSMTools::Tools::newSearch()
|
||||
{
|
||||
mReports.insert (std::make_pair (mNextReportNumber++, new ReportModel (true)));
|
||||
mReports.insert (std::make_pair (mNextReportNumber++, new ReportModel (true, false)));
|
||||
|
||||
return CSMWorld::UniversalId (CSMWorld::UniversalId::Type_Search, mNextReportNumber-1);
|
||||
}
|
||||
|
|
|
@ -923,7 +923,7 @@ bool CSMWorld::Data::continueLoading (CSMDoc::Messages& messages)
|
|||
{
|
||||
// log an error and continue loading the refs to the last loaded cell
|
||||
CSMWorld::UniversalId id (CSMWorld::UniversalId::Type_None);
|
||||
messages.add (id, "Logic error: cell index out of bounds");
|
||||
messages.add (id, "Logic error: cell index out of bounds", "", CSMDoc::Message::Severity_Error);
|
||||
index = mCells.getSize()-1;
|
||||
}
|
||||
std::string cellId = Misc::StringUtils::lowerCase (mCells.getId (index));
|
||||
|
@ -984,7 +984,8 @@ bool CSMWorld::Data::continueLoading (CSMDoc::Messages& messages)
|
|||
else
|
||||
{
|
||||
messages.add (UniversalId::Type_None,
|
||||
"Trying to delete dialogue record " + id + " which does not exist");
|
||||
"Trying to delete dialogue record " + id + " which does not exist",
|
||||
"", CSMDoc::Message::Severity_Warning);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -1001,7 +1002,7 @@ bool CSMWorld::Data::continueLoading (CSMDoc::Messages& messages)
|
|||
if (!mDialogue)
|
||||
{
|
||||
messages.add (UniversalId::Type_None,
|
||||
"Found info record not following a dialogue record");
|
||||
"Found info record not following a dialogue record", "", CSMDoc::Message::Severity_Error);
|
||||
|
||||
mReader->skipRecord();
|
||||
break;
|
||||
|
@ -1044,7 +1045,8 @@ bool CSMWorld::Data::continueLoading (CSMDoc::Messages& messages)
|
|||
|
||||
if (unhandledRecord)
|
||||
{
|
||||
messages.add (UniversalId::Type_None, "Unsupported record type: " + n.toString());
|
||||
messages.add (UniversalId::Type_None, "Unsupported record type: " + n.toString(), "",
|
||||
CSMDoc::Message::Severity_Error);
|
||||
|
||||
mReader->skipRecord();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue