1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-01-20 05:53:50 +00:00

integrated namespace widget into input field (GenericCreator)

This commit is contained in:
Marc Zinnschlag 2014-08-14 14:21:34 +02:00
parent fa9c6b19c2
commit c66dfe67b1
4 changed files with 111 additions and 24 deletions

View file

@ -10,6 +10,8 @@
#include <QLabel> #include <QLabel>
#include <QComboBox> #include <QComboBox>
#include <components/misc/stringops.hpp>
#include "../../model/world/commands.hpp" #include "../../model/world/commands.hpp"
#include "../../model/world/data.hpp" #include "../../model/world/data.hpp"
#include "../../model/world/idtable.hpp" #include "../../model/world/idtable.hpp"
@ -24,9 +26,6 @@ void CSVWorld::GenericCreator::update()
mId->setToolTip (QString::fromUtf8 (mErrors.c_str())); mId->setToolTip (QString::fromUtf8 (mErrors.c_str()));
mCreate->setEnabled (mErrors.empty() && !mLocked); mCreate->setEnabled (mErrors.empty() && !mLocked);
if (mNamespace)
mNamespace->setText (QString::fromUtf8 (getNamespace().c_str()));
} }
void CSVWorld::GenericCreator::setManualEditing (bool enabled) void CSVWorld::GenericCreator::setManualEditing (bool enabled)
@ -87,17 +86,40 @@ std::string CSVWorld::GenericCreator::getNamespace() const
return ""; return "";
} }
void CSVWorld::GenericCreator::updateNamespace()
{
std::string namespace_ = getNamespace();
mValidator->setNamespace (namespace_);
int index = mId->text().indexOf ("::");
if (index==-1)
{
// no namespace in old text
mId->setText (QString::fromUtf8 (namespace_.c_str()) + mId->text());
}
else
{
std::string oldNamespace =
Misc::StringUtils::lowerCase (mId->text().left (index).toUtf8().constData());
if (oldNamespace=="project" || oldNamespace=="session")
mId->setText (QString::fromUtf8 (namespace_.c_str()) + mId->text().mid (index+2));
}
}
CSVWorld::GenericCreator::GenericCreator (CSMWorld::Data& data, QUndoStack& undoStack, CSVWorld::GenericCreator::GenericCreator (CSMWorld::Data& data, QUndoStack& undoStack,
const CSMWorld::UniversalId& id, bool relaxedIdRules) const CSMWorld::UniversalId& id, bool relaxedIdRules)
: mData (data), mUndoStack (undoStack), mListId (id), mLocked (false), mCloneMode (false), : mData (data), mUndoStack (undoStack), mListId (id), mLocked (false), mCloneMode (false),
mClonedType (CSMWorld::UniversalId::Type_None), mScopes (CSMWorld::Scope_Content), mScope (0), mClonedType (CSMWorld::UniversalId::Type_None), mScopes (CSMWorld::Scope_Content), mScope (0),
mScopeLabel (0), mNamespace (0) mScopeLabel (0)
{ {
mLayout = new QHBoxLayout; mLayout = new QHBoxLayout;
mLayout->setContentsMargins (0, 0, 0, 0); mLayout->setContentsMargins (0, 0, 0, 0);
mId = new QLineEdit; mId = new QLineEdit;
mId->setValidator (new IdValidator (relaxedIdRules, this)); mId->setValidator (mValidator = new IdValidator (relaxedIdRules, this));
mLayout->addWidget (mId, 1); mLayout->addWidget (mId, 1);
mCreate = new QPushButton ("Create"); mCreate = new QPushButton ("Create");
@ -125,6 +147,7 @@ void CSVWorld::GenericCreator::reset()
mCloneMode = false; mCloneMode = false;
mId->setText (""); mId->setText ("");
update(); update();
updateNamespace();
} }
std::string CSVWorld::GenericCreator::getErrors() const std::string CSVWorld::GenericCreator::getErrors() const
@ -197,21 +220,6 @@ void CSVWorld::GenericCreator::setScope (unsigned int scope)
int count = (mScopes & CSMWorld::Scope_Content) + (mScopes & CSMWorld::Scope_Project) + int count = (mScopes & CSMWorld::Scope_Content) + (mScopes & CSMWorld::Scope_Project) +
(mScopes & CSMWorld::Scope_Session); (mScopes & CSMWorld::Scope_Session);
// namespace widget
if (count>1 || (count>0 && !(mScopes & CSMWorld::Scope_Content)))
{
if (!mNamespace)
{
mNamespace = new QLabel ("::", this);
insertAtBeginning (mNamespace, false);
}
}
else
{
delete mNamespace;
mNamespace = 0;
}
// scope selector widget // scope selector widget
if (count>1) if (count>1)
{ {
@ -242,9 +250,12 @@ void CSVWorld::GenericCreator::setScope (unsigned int scope)
delete mScopeLabel; delete mScopeLabel;
mScopeLabel = 0; mScopeLabel = 0;
} }
updateNamespace();
} }
void CSVWorld::GenericCreator::scopeChanged (int index) void CSVWorld::GenericCreator::scopeChanged (int index)
{ {
update(); update();
updateNamespace();
} }

View file

@ -19,6 +19,8 @@ namespace CSMWorld
namespace CSVWorld namespace CSVWorld
{ {
class IdValidator;
class GenericCreator : public Creator class GenericCreator : public Creator
{ {
Q_OBJECT Q_OBJECT
@ -36,7 +38,7 @@ namespace CSVWorld
unsigned int mScopes; unsigned int mScopes;
QComboBox *mScope; QComboBox *mScope;
QLabel *mScopeLabel; QLabel *mScopeLabel;
QLabel *mNamespace; IdValidator *mValidator;
protected: protected:
bool mCloneMode; bool mCloneMode;
@ -62,6 +64,10 @@ namespace CSVWorld
std::string getNamespace() const; std::string getNamespace() const;
private:
void updateNamespace();
public: public:
GenericCreator (CSMWorld::Data& data, QUndoStack& undoStack, GenericCreator (CSMWorld::Data& data, QUndoStack& undoStack,

View file

@ -1,6 +1,8 @@
#include "idvalidator.hpp" #include "idvalidator.hpp"
#include <components/misc/stringops.hpp>
bool CSVWorld::IdValidator::isValid (const QChar& c, bool first) const bool CSVWorld::IdValidator::isValid (const QChar& c, bool first) const
{ {
if (c.isLetter() || c=='_') if (c.isLetter() || c=='_')
@ -26,11 +28,74 @@ QValidator::State CSVWorld::IdValidator::validate (QString& input, int& pos) con
else else
{ {
bool first = true; bool first = true;
bool scope = false;
bool prevScope = false;
for (QString::const_iterator iter (input.begin()); iter!=input.end(); ++iter, first = false) QString::const_iterator iter = input.begin();
if (!isValid (*iter, first))
return QValidator::Invalid; if (!mNamespace.empty())
{
std::string namespace_ = input.left (mNamespace.size()).toUtf8().constData();
if (Misc::StringUtils::lowerCase (namespace_)!=mNamespace)
return QValidator::Invalid; // incorrect namespace
iter += namespace_.size();
first = false;
prevScope = true;
}
else
{
int index = input.indexOf (":");
if (index!=-1)
{
QString namespace_ = input.left (index);
if (namespace_=="project" || namespace_=="session")
return QValidator::Invalid; // reserved namespace
}
}
for (; iter!=input.end(); ++iter, first = false)
{
if (*iter==':')
{
if (first)
return QValidator::Invalid; // scope operator at the beginning
if (scope)
{
scope = false;
prevScope = true;
}
else
{
if (prevScope)
return QValidator::Invalid; // sequence of two scope operators
scope = true;
}
}
else if (scope)
return QValidator::Invalid; // incomplete scope operator
else
{
prevScope = false;
if (!isValid (*iter, first))
return QValidator::Invalid;
}
}
if (prevScope)
return QValidator::Intermediate; // ending with scope operator
} }
return QValidator::Acceptable; return QValidator::Acceptable;
}
void CSVWorld::IdValidator::setNamespace (const std::string& namespace_)
{
mNamespace = Misc::StringUtils::lowerCase (namespace_);
} }

View file

@ -1,6 +1,8 @@
#ifndef CSV_WORLD_IDVALIDATOR_H #ifndef CSV_WORLD_IDVALIDATOR_H
#define CSV_WORLD_IDVALIDATOR_H #define CSV_WORLD_IDVALIDATOR_H
#include <string>
#include <QValidator> #include <QValidator>
namespace CSVWorld namespace CSVWorld
@ -8,6 +10,7 @@ namespace CSVWorld
class IdValidator : public QValidator class IdValidator : public QValidator
{ {
bool mRelaxed; bool mRelaxed;
std::string mNamespace;
private: private:
@ -20,6 +23,8 @@ namespace CSVWorld
virtual State validate (QString& input, int& pos) const; virtual State validate (QString& input, int& pos) const;
void setNamespace (const std::string& namespace_);
}; };
} }