mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-19 23:53:52 +00:00
integrated namespace widget into input field (GenericCreator)
This commit is contained in:
parent
fa9c6b19c2
commit
c66dfe67b1
4 changed files with 111 additions and 24 deletions
|
@ -10,6 +10,8 @@
|
|||
#include <QLabel>
|
||||
#include <QComboBox>
|
||||
|
||||
#include <components/misc/stringops.hpp>
|
||||
|
||||
#include "../../model/world/commands.hpp"
|
||||
#include "../../model/world/data.hpp"
|
||||
#include "../../model/world/idtable.hpp"
|
||||
|
@ -24,9 +26,6 @@ void CSVWorld::GenericCreator::update()
|
|||
mId->setToolTip (QString::fromUtf8 (mErrors.c_str()));
|
||||
|
||||
mCreate->setEnabled (mErrors.empty() && !mLocked);
|
||||
|
||||
if (mNamespace)
|
||||
mNamespace->setText (QString::fromUtf8 (getNamespace().c_str()));
|
||||
}
|
||||
|
||||
void CSVWorld::GenericCreator::setManualEditing (bool enabled)
|
||||
|
@ -87,17 +86,40 @@ std::string CSVWorld::GenericCreator::getNamespace() const
|
|||
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,
|
||||
const CSMWorld::UniversalId& id, bool relaxedIdRules)
|
||||
: mData (data), mUndoStack (undoStack), mListId (id), mLocked (false), mCloneMode (false),
|
||||
mClonedType (CSMWorld::UniversalId::Type_None), mScopes (CSMWorld::Scope_Content), mScope (0),
|
||||
mScopeLabel (0), mNamespace (0)
|
||||
mScopeLabel (0)
|
||||
{
|
||||
mLayout = new QHBoxLayout;
|
||||
mLayout->setContentsMargins (0, 0, 0, 0);
|
||||
|
||||
mId = new QLineEdit;
|
||||
mId->setValidator (new IdValidator (relaxedIdRules, this));
|
||||
mId->setValidator (mValidator = new IdValidator (relaxedIdRules, this));
|
||||
mLayout->addWidget (mId, 1);
|
||||
|
||||
mCreate = new QPushButton ("Create");
|
||||
|
@ -125,6 +147,7 @@ void CSVWorld::GenericCreator::reset()
|
|||
mCloneMode = false;
|
||||
mId->setText ("");
|
||||
update();
|
||||
updateNamespace();
|
||||
}
|
||||
|
||||
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) +
|
||||
(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
|
||||
if (count>1)
|
||||
{
|
||||
|
@ -242,9 +250,12 @@ void CSVWorld::GenericCreator::setScope (unsigned int scope)
|
|||
delete mScopeLabel;
|
||||
mScopeLabel = 0;
|
||||
}
|
||||
|
||||
updateNamespace();
|
||||
}
|
||||
|
||||
void CSVWorld::GenericCreator::scopeChanged (int index)
|
||||
{
|
||||
update();
|
||||
updateNamespace();
|
||||
}
|
|
@ -19,6 +19,8 @@ namespace CSMWorld
|
|||
|
||||
namespace CSVWorld
|
||||
{
|
||||
class IdValidator;
|
||||
|
||||
class GenericCreator : public Creator
|
||||
{
|
||||
Q_OBJECT
|
||||
|
@ -36,7 +38,7 @@ namespace CSVWorld
|
|||
unsigned int mScopes;
|
||||
QComboBox *mScope;
|
||||
QLabel *mScopeLabel;
|
||||
QLabel *mNamespace;
|
||||
IdValidator *mValidator;
|
||||
|
||||
protected:
|
||||
bool mCloneMode;
|
||||
|
@ -62,6 +64,10 @@ namespace CSVWorld
|
|||
|
||||
std::string getNamespace() const;
|
||||
|
||||
private:
|
||||
|
||||
void updateNamespace();
|
||||
|
||||
public:
|
||||
|
||||
GenericCreator (CSMWorld::Data& data, QUndoStack& undoStack,
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
|
||||
#include "idvalidator.hpp"
|
||||
|
||||
#include <components/misc/stringops.hpp>
|
||||
|
||||
bool CSVWorld::IdValidator::isValid (const QChar& c, bool first) const
|
||||
{
|
||||
if (c.isLetter() || c=='_')
|
||||
|
@ -26,11 +28,74 @@ QValidator::State CSVWorld::IdValidator::validate (QString& input, int& pos) con
|
|||
else
|
||||
{
|
||||
bool first = true;
|
||||
bool scope = false;
|
||||
bool prevScope = false;
|
||||
|
||||
for (QString::const_iterator iter (input.begin()); iter!=input.end(); ++iter, first = false)
|
||||
if (!isValid (*iter, first))
|
||||
return QValidator::Invalid;
|
||||
QString::const_iterator iter = input.begin();
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
void CSVWorld::IdValidator::setNamespace (const std::string& namespace_)
|
||||
{
|
||||
mNamespace = Misc::StringUtils::lowerCase (namespace_);
|
||||
}
|
|
@ -1,6 +1,8 @@
|
|||
#ifndef CSV_WORLD_IDVALIDATOR_H
|
||||
#define CSV_WORLD_IDVALIDATOR_H
|
||||
|
||||
#include <string>
|
||||
|
||||
#include <QValidator>
|
||||
|
||||
namespace CSVWorld
|
||||
|
@ -8,6 +10,7 @@ namespace CSVWorld
|
|||
class IdValidator : public QValidator
|
||||
{
|
||||
bool mRelaxed;
|
||||
std::string mNamespace;
|
||||
|
||||
private:
|
||||
|
||||
|
@ -20,6 +23,8 @@ namespace CSVWorld
|
|||
|
||||
virtual State validate (QString& input, int& pos) const;
|
||||
|
||||
void setNamespace (const std::string& namespace_);
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue