1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-02-10 21:40:15 +00:00

implemented use of predefined filters

This commit is contained in:
Marc Zinnschlag 2013-08-24 17:40:00 +02:00
parent d1516792ce
commit 25e6380884
4 changed files with 70 additions and 13 deletions

View File

@ -8,6 +8,8 @@
#include <components/misc/stringops.hpp> #include <components/misc/stringops.hpp>
#include "../world/columns.hpp" #include "../world/columns.hpp"
#include "../world/data.hpp"
#include "../world/idcollection.hpp"
#include "booleannode.hpp" #include "booleannode.hpp"
#include "ornode.hpp" #include "ornode.hpp"
@ -31,6 +33,7 @@ namespace CSMFilter
Type_OpenSquare, Type_OpenSquare,
Type_CloseSquare, Type_CloseSquare,
Type_Comma, Type_Comma,
Type_OneShot,
Type_Keyword_True, ///< \attention Keyword enums must be arranged continuously. Type_Keyword_True, ///< \attention Keyword enums must be arranged continuously.
Type_Keyword_False, Type_Keyword_False,
Type_Keyword_And, Type_Keyword_And,
@ -208,6 +211,7 @@ CSMFilter::Token CSMFilter::Parser::getNextToken()
case '[': ++mIndex; return Token (Token::Type_OpenSquare); case '[': ++mIndex; return Token (Token::Type_OpenSquare);
case ']': ++mIndex; return Token (Token::Type_CloseSquare); case ']': ++mIndex; return Token (Token::Type_CloseSquare);
case ',': ++mIndex; return Token (Token::Type_Comma); case ',': ++mIndex; return Token (Token::Type_Comma);
case '?': ++mIndex; return Token (Token::Type_OneShot);
} }
if (c=='"' || c=='_' || std::isalpha (c)) if (c=='"' || c=='_' || std::isalpha (c))
@ -509,7 +513,7 @@ void CSMFilter::Parser::error()
CSMFilter::Parser::Parser (const CSMWorld::Data& data) CSMFilter::Parser::Parser (const CSMWorld::Data& data)
: mIndex (0), mError (false), mData (data) {} : mIndex (0), mError (false), mData (data) {}
bool CSMFilter::Parser::parse (const std::string& filter) bool CSMFilter::Parser::parse (const std::string& filter, bool allowPredefined)
{ {
// reset // reset
mFilter.reset(); mFilter.reset();
@ -517,23 +521,62 @@ bool CSMFilter::Parser::parse (const std::string& filter)
mInput = filter; mInput = filter;
mIndex = 0; mIndex = 0;
boost::shared_ptr<Node> node = parseImp (true); Token token = getNextToken();
if (mError) if (token==Token (Token::Type_OneShot))
return false; {
boost::shared_ptr<Node> node = parseImp (true);
if (getNextToken()!=Token (Token::Type_EOS)) if (mError)
return false; return false;
if (node) if (getNextToken()!=Token (Token::Type_EOS))
mFilter = node; {
error();
return false;
}
if (node)
mFilter = node;
else
{
// Empty filter string equals to filter "true".
mFilter.reset (new BooleanNode (true));
}
return true;
}
else if (token.mType==Token::Type_String && allowPredefined)
{
if (getNextToken()!=Token (Token::Type_EOS))
{
error();
return false;
}
int index = mData.getFilters().searchId (token.mString);
if (index==-1)
{
error();
return false;
}
const CSMWorld::Record<CSMFilter::Filter>& record = mData.getFilters().getRecord (index);
if (record.isDeleted())
{
error();
return false;
}
return parse (record.get().mFilter, false);
}
else else
{ {
// Empty filter string equals to filter "true". error();
mFilter.reset (new BooleanNode (true)); return false;
} }
return true;
} }
boost::shared_ptr<CSMFilter::Node> CSMFilter::Parser::getFilter() const boost::shared_ptr<CSMFilter::Node> CSMFilter::Parser::getFilter() const

View File

@ -46,7 +46,7 @@ namespace CSMFilter
Parser (const CSMWorld::Data& data); Parser (const CSMWorld::Data& data);
bool parse (const std::string& filter); bool parse (const std::string& filter, bool allowPredefined = true);
///< Discards any previous calls to parse ///< Discards any previous calls to parse
/// ///
/// \return Success? /// \return Success?

View File

@ -316,6 +316,16 @@ CSMWorld::RefCollection& CSMWorld::Data::getReferences()
return mRefs; return mRefs;
} }
const CSMWorld::IdCollection<CSMFilter::Filter>& CSMWorld::Data::getFilters() const
{
return mFilters;
}
CSMWorld::IdCollection<CSMFilter::Filter>& CSMWorld::Data::getFilters()
{
return mFilters;
}
QAbstractItemModel *CSMWorld::Data::getTableModel (const UniversalId& id) QAbstractItemModel *CSMWorld::Data::getTableModel (const UniversalId& id)
{ {
std::map<UniversalId::Type, QAbstractItemModel *>::iterator iter = mModelIndex.find (id.getType()); std::map<UniversalId::Type, QAbstractItemModel *>::iterator iter = mModelIndex.find (id.getType());

View File

@ -119,6 +119,10 @@ namespace CSMWorld
RefCollection& getReferences(); RefCollection& getReferences();
const IdCollection<CSMFilter::Filter>& getFilters() const;
IdCollection<CSMFilter::Filter>& getFilters();
QAbstractItemModel *getTableModel (const UniversalId& id); QAbstractItemModel *getTableModel (const UniversalId& id);
///< If no table model is available for \a id, an exception is thrown. ///< If no table model is available for \a id, an exception is thrown.
/// ///