mirror of
https://github.com/OpenMW/openmw.git
synced 2025-06-19 02:41:35 +00:00
Set editor limits on hard-coded string lengths (Bug #3066)
- See https://forum.openmw.org/viewtopic.php?f=2&t=3233 and https://bugs.openmw.org/issues/3066
This commit is contained in:
parent
258d98cddc
commit
c2ea682f0e
12 changed files with 88 additions and 10 deletions
|
@ -103,7 +103,8 @@ bool CSMWorld::ColumnBase::isId (Display display)
|
||||||
bool CSMWorld::ColumnBase::isText (Display display)
|
bool CSMWorld::ColumnBase::isText (Display display)
|
||||||
{
|
{
|
||||||
return display==Display_String || display==Display_LongString ||
|
return display==Display_String || display==Display_LongString ||
|
||||||
display==Display_String32 || display==Display_LongString256;
|
display==Display_String32 || display==Display_String64 ||
|
||||||
|
display==Display_LongString256;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CSMWorld::ColumnBase::isScript (Display display)
|
bool CSMWorld::ColumnBase::isScript (Display display)
|
||||||
|
|
|
@ -129,6 +129,7 @@ namespace CSMWorld
|
||||||
Display_InfoCondVar,
|
Display_InfoCondVar,
|
||||||
Display_InfoCondComp,
|
Display_InfoCondComp,
|
||||||
Display_String32,
|
Display_String32,
|
||||||
|
Display_String64,
|
||||||
Display_LongString256,
|
Display_LongString256,
|
||||||
|
|
||||||
Display_EffectSkill, // must display at least one, unlike Display_Skill
|
Display_EffectSkill, // must display at least one, unlike Display_Skill
|
||||||
|
|
|
@ -317,7 +317,8 @@ namespace CSMWorld
|
||||||
template<typename ESXRecordT>
|
template<typename ESXRecordT>
|
||||||
struct NameColumn : public Column<ESXRecordT>
|
struct NameColumn : public Column<ESXRecordT>
|
||||||
{
|
{
|
||||||
NameColumn() : Column<ESXRecordT> (Columns::ColumnId_Name, ColumnBase::Display_String) {}
|
NameColumn(ColumnBase::Display display = ColumnBase::Display_String)
|
||||||
|
: Column<ESXRecordT> (Columns::ColumnId_Name, display) {}
|
||||||
|
|
||||||
virtual QVariant get (const Record<ESXRecordT>& record) const
|
virtual QVariant get (const Record<ESXRecordT>& record) const
|
||||||
{
|
{
|
||||||
|
|
|
@ -107,7 +107,8 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding, const ResourcesManager& resourc
|
||||||
mFactions.addColumn (new StringIdColumn<ESM::Faction>);
|
mFactions.addColumn (new StringIdColumn<ESM::Faction>);
|
||||||
mFactions.addColumn (new RecordStateColumn<ESM::Faction>);
|
mFactions.addColumn (new RecordStateColumn<ESM::Faction>);
|
||||||
mFactions.addColumn (new FixedRecordTypeColumn<ESM::Faction> (UniversalId::Type_Faction));
|
mFactions.addColumn (new FixedRecordTypeColumn<ESM::Faction> (UniversalId::Type_Faction));
|
||||||
mFactions.addColumn (new NameColumn<ESM::Faction>);
|
// The savegame format limits the player faction string to 32 characters.
|
||||||
|
mFactions.addColumn (new NameColumn<ESM::Faction>(ColumnBase::Display_String32));
|
||||||
mFactions.addColumn (new AttributesColumn<ESM::Faction> (0));
|
mFactions.addColumn (new AttributesColumn<ESM::Faction> (0));
|
||||||
mFactions.addColumn (new AttributesColumn<ESM::Faction> (1));
|
mFactions.addColumn (new AttributesColumn<ESM::Faction> (1));
|
||||||
mFactions.addColumn (new HiddenColumn<ESM::Faction>);
|
mFactions.addColumn (new HiddenColumn<ESM::Faction>);
|
||||||
|
@ -117,6 +118,7 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding, const ResourcesManager& resourc
|
||||||
mFactions.addColumn (new NestedParentColumn<ESM::Faction> (Columns::ColumnId_FactionReactions));
|
mFactions.addColumn (new NestedParentColumn<ESM::Faction> (Columns::ColumnId_FactionReactions));
|
||||||
index = mFactions.getColumns()-1;
|
index = mFactions.getColumns()-1;
|
||||||
mFactions.addAdapter (std::make_pair(&mFactions.getColumn(index), new FactionReactionsAdapter ()));
|
mFactions.addAdapter (std::make_pair(&mFactions.getColumn(index), new FactionReactionsAdapter ()));
|
||||||
|
// NAME32 enforced in IdCompletionDelegate::createEditor()
|
||||||
mFactions.getNestableColumn(index)->addColumn(
|
mFactions.getNestableColumn(index)->addColumn(
|
||||||
new NestedChildColumn (Columns::ColumnId_Faction, ColumnBase::Display_Faction));
|
new NestedChildColumn (Columns::ColumnId_Faction, ColumnBase::Display_Faction));
|
||||||
mFactions.getNestableColumn(index)->addColumn(
|
mFactions.getNestableColumn(index)->addColumn(
|
||||||
|
@ -185,6 +187,7 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding, const ResourcesManager& resourc
|
||||||
index = mRegions.getColumns()-1;
|
index = mRegions.getColumns()-1;
|
||||||
mRegions.addAdapter (std::make_pair(&mRegions.getColumn(index), new RegionSoundListAdapter ()));
|
mRegions.addAdapter (std::make_pair(&mRegions.getColumn(index), new RegionSoundListAdapter ()));
|
||||||
mRegions.getNestableColumn(index)->addColumn(
|
mRegions.getNestableColumn(index)->addColumn(
|
||||||
|
// NAME32 enforced in IdCompletionDelegate::createEditor()
|
||||||
new NestedChildColumn (Columns::ColumnId_SoundName, ColumnBase::Display_Sound));
|
new NestedChildColumn (Columns::ColumnId_SoundName, ColumnBase::Display_Sound));
|
||||||
mRegions.getNestableColumn(index)->addColumn(
|
mRegions.getNestableColumn(index)->addColumn(
|
||||||
new NestedChildColumn (Columns::ColumnId_SoundChance, ColumnBase::Display_Integer));
|
new NestedChildColumn (Columns::ColumnId_SoundChance, ColumnBase::Display_Integer));
|
||||||
|
@ -291,7 +294,8 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding, const ResourcesManager& resourc
|
||||||
mCells.addColumn (new StringIdColumn<Cell>);
|
mCells.addColumn (new StringIdColumn<Cell>);
|
||||||
mCells.addColumn (new RecordStateColumn<Cell>);
|
mCells.addColumn (new RecordStateColumn<Cell>);
|
||||||
mCells.addColumn (new FixedRecordTypeColumn<Cell> (UniversalId::Type_Cell));
|
mCells.addColumn (new FixedRecordTypeColumn<Cell> (UniversalId::Type_Cell));
|
||||||
mCells.addColumn (new NameColumn<Cell>);
|
// NAME64 enforced in IdCompletionDelegate::createEditor()
|
||||||
|
mCells.addColumn (new NameColumn<Cell>(ColumnBase::Display_String64));
|
||||||
mCells.addColumn (new FlagColumn<Cell> (Columns::ColumnId_SleepForbidden, ESM::Cell::NoSleep));
|
mCells.addColumn (new FlagColumn<Cell> (Columns::ColumnId_SleepForbidden, ESM::Cell::NoSleep));
|
||||||
mCells.addColumn (new FlagColumn<Cell> (Columns::ColumnId_InteriorWater, ESM::Cell::HasWater,
|
mCells.addColumn (new FlagColumn<Cell> (Columns::ColumnId_InteriorWater, ESM::Cell::HasWater,
|
||||||
ColumnBase::Flag_Table | ColumnBase::Flag_Dialogue | ColumnBase::Flag_Dialogue_Refresh));
|
ColumnBase::Flag_Table | ColumnBase::Flag_Dialogue | ColumnBase::Flag_Dialogue_Refresh));
|
||||||
|
|
|
@ -58,8 +58,11 @@ CSMWorld::RefIdCollection::RefIdCollection(const CSMWorld::Data& data)
|
||||||
|
|
||||||
NameColumns nameColumns (modelColumns);
|
NameColumns nameColumns (modelColumns);
|
||||||
|
|
||||||
mColumns.push_back (RefIdColumn (Columns::ColumnId_Name, ColumnBase::Display_String));
|
// Only items that can be placed in a container have the 32 character limit, but enforce
|
||||||
|
// that for all referenceable types for now.
|
||||||
|
mColumns.push_back (RefIdColumn (Columns::ColumnId_Name, ColumnBase::Display_String32));
|
||||||
nameColumns.mName = &mColumns.back();
|
nameColumns.mName = &mColumns.back();
|
||||||
|
// NAME32 enforced in IdCompletionDelegate::createEditor()
|
||||||
mColumns.push_back (RefIdColumn (Columns::ColumnId_Script, ColumnBase::Display_Script));
|
mColumns.push_back (RefIdColumn (Columns::ColumnId_Script, ColumnBase::Display_Script));
|
||||||
nameColumns.mScript = &mColumns.back();
|
nameColumns.mScript = &mColumns.back();
|
||||||
|
|
||||||
|
@ -239,9 +242,9 @@ CSMWorld::RefIdCollection::RefIdCollection(const CSMWorld::Data& data)
|
||||||
mColumns.back().addColumn(
|
mColumns.back().addColumn(
|
||||||
new RefIdColumn (Columns::ColumnId_AiWanderRepeat, CSMWorld::ColumnBase::Display_Boolean));
|
new RefIdColumn (Columns::ColumnId_AiWanderRepeat, CSMWorld::ColumnBase::Display_Boolean));
|
||||||
mColumns.back().addColumn(
|
mColumns.back().addColumn(
|
||||||
new RefIdColumn (Columns::ColumnId_AiActivateName, CSMWorld::ColumnBase::Display_String));
|
new RefIdColumn (Columns::ColumnId_AiActivateName, CSMWorld::ColumnBase::Display_String32));
|
||||||
mColumns.back().addColumn(
|
mColumns.back().addColumn(
|
||||||
new RefIdColumn (Columns::ColumnId_AiTargetId, CSMWorld::ColumnBase::Display_String));
|
new RefIdColumn (Columns::ColumnId_AiTargetId, CSMWorld::ColumnBase::Display_String32));
|
||||||
mColumns.back().addColumn(
|
mColumns.back().addColumn(
|
||||||
new RefIdColumn (Columns::ColumnId_AiTargetCell, CSMWorld::ColumnBase::Display_String));
|
new RefIdColumn (Columns::ColumnId_AiTargetCell, CSMWorld::ColumnBase::Display_String));
|
||||||
mColumns.back().addColumn(
|
mColumns.back().addColumn(
|
||||||
|
@ -486,6 +489,7 @@ CSMWorld::RefIdCollection::RefIdCollection(const CSMWorld::Data& data)
|
||||||
mColumns.push_back (RefIdColumn (Columns::ColumnId_Class, ColumnBase::Display_Class));
|
mColumns.push_back (RefIdColumn (Columns::ColumnId_Class, ColumnBase::Display_Class));
|
||||||
npcColumns.mClass = &mColumns.back();
|
npcColumns.mClass = &mColumns.back();
|
||||||
|
|
||||||
|
// NAME32 enforced in IdCompletionDelegate::createEditor()
|
||||||
mColumns.push_back (RefIdColumn (Columns::ColumnId_Faction, ColumnBase::Display_Faction));
|
mColumns.push_back (RefIdColumn (Columns::ColumnId_Faction, ColumnBase::Display_Faction));
|
||||||
npcColumns.mFaction = &mColumns.back();
|
npcColumns.mFaction = &mColumns.back();
|
||||||
|
|
||||||
|
|
|
@ -84,6 +84,13 @@ void CSVWorld::CellCreator::setType (int index)
|
||||||
mYLabel->setVisible (index==1);
|
mYLabel->setVisible (index==1);
|
||||||
mY->setVisible (index==1);
|
mY->setVisible (index==1);
|
||||||
|
|
||||||
|
// The cell name is limited to 64 characters. (ESM::Header::GMDT::mCurrentCell)
|
||||||
|
std::string text = mType->currentText().toStdString();
|
||||||
|
if (text == "Interior Cell")
|
||||||
|
GenericCreator::setEditorMaxLength (64);
|
||||||
|
else
|
||||||
|
GenericCreator::setEditorMaxLength (32767);
|
||||||
|
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,7 +99,7 @@ void CSVWorld::CellCreator::valueChanged (int index)
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSVWorld::CellCreator::cloneMode(const std::string& originId,
|
void CSVWorld::CellCreator::cloneMode(const std::string& originId,
|
||||||
const CSMWorld::UniversalId::Type type)
|
const CSMWorld::UniversalId::Type type)
|
||||||
{
|
{
|
||||||
CSVWorld::GenericCreator::cloneMode(originId, type);
|
CSVWorld::GenericCreator::cloneMode(originId, type);
|
||||||
|
|
|
@ -174,6 +174,11 @@ CSVWorld::GenericCreator::GenericCreator (CSMWorld::Data& data, QUndoStack& undo
|
||||||
connect (&mData, SIGNAL (idListChanged()), this, SLOT (dataIdListChanged()));
|
connect (&mData, SIGNAL (idListChanged()), this, SLOT (dataIdListChanged()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CSVWorld::GenericCreator::setEditorMaxLength (int length)
|
||||||
|
{
|
||||||
|
mId->setMaxLength (length);
|
||||||
|
}
|
||||||
|
|
||||||
void CSVWorld::GenericCreator::setEditLock (bool locked)
|
void CSVWorld::GenericCreator::setEditLock (bool locked)
|
||||||
{
|
{
|
||||||
mLocked = locked;
|
mLocked = locked;
|
||||||
|
|
|
@ -78,6 +78,8 @@ namespace CSVWorld
|
||||||
|
|
||||||
std::string getNamespace() const;
|
std::string getNamespace() const;
|
||||||
|
|
||||||
|
void setEditorMaxLength(int length);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void updateNamespace();
|
void updateNamespace();
|
||||||
|
|
|
@ -30,11 +30,27 @@ QWidget *CSVWorld::IdCompletionDelegate::createEditor(QWidget *parent,
|
||||||
CSMWorld::IdCompletionManager &completionManager = getDocument().getIdCompletionManager();
|
CSMWorld::IdCompletionManager &completionManager = getDocument().getIdCompletionManager();
|
||||||
CSVWidget::DropLineEdit *editor = new CSVWidget::DropLineEdit(display, parent);
|
CSVWidget::DropLineEdit *editor = new CSVWidget::DropLineEdit(display, parent);
|
||||||
editor->setCompleter(completionManager.getCompleter(display).get());
|
editor->setCompleter(completionManager.getCompleter(display).get());
|
||||||
|
// The savegame format limits the player faction string to 32 characters.
|
||||||
|
// The region sound name is limited to 32 characters. (ESM::Region::SoundRef::mSound)
|
||||||
|
// The script name is limited to 32 characters. (ESM::Script::SCHD::mName)
|
||||||
|
// The cell name is limited to 64 characters. (ESM::Header::GMDT::mCurrentCell)
|
||||||
|
if (display == CSMWorld::ColumnBase::Display_Faction ||
|
||||||
|
display == CSMWorld::ColumnBase::Display_Sound ||
|
||||||
|
display == CSMWorld::ColumnBase::Display_Script ||
|
||||||
|
display == CSMWorld::ColumnBase::Display_Referenceable)
|
||||||
|
{
|
||||||
|
editor->setMaxLength (32);
|
||||||
|
}
|
||||||
|
else if (display == CSMWorld::ColumnBase::Display_Cell)
|
||||||
|
{
|
||||||
|
editor->setMaxLength (64);
|
||||||
|
}
|
||||||
|
|
||||||
return editor;
|
return editor;
|
||||||
}
|
}
|
||||||
|
|
||||||
CSVWorld::CommandDelegate *CSVWorld::IdCompletionDelegateFactory::makeDelegate(CSMWorld::CommandDispatcher *dispatcher,
|
CSVWorld::CommandDelegate *CSVWorld::IdCompletionDelegateFactory::makeDelegate(CSMWorld::CommandDispatcher *dispatcher,
|
||||||
CSMDoc::Document& document,
|
CSMDoc::Document& document,
|
||||||
QObject *parent) const
|
QObject *parent) const
|
||||||
{
|
{
|
||||||
return new IdCompletionDelegate(dispatcher, document, parent);
|
return new IdCompletionDelegate(dispatcher, document, parent);
|
||||||
|
|
|
@ -33,6 +33,8 @@ CSVWorld::ReferenceableCreator::ReferenceableCreator (CSMWorld::Data& data, QUnd
|
||||||
}
|
}
|
||||||
|
|
||||||
insertBeforeButtons (mType, false);
|
insertBeforeButtons (mType, false);
|
||||||
|
|
||||||
|
connect (mType, SIGNAL (currentIndexChanged (int)), this, SLOT (setType (int)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSVWorld::ReferenceableCreator::reset()
|
void CSVWorld::ReferenceableCreator::reset()
|
||||||
|
@ -53,3 +55,27 @@ void CSVWorld::ReferenceableCreator::toggleWidgets(bool active)
|
||||||
CSVWorld::GenericCreator::toggleWidgets(active);
|
CSVWorld::GenericCreator::toggleWidgets(active);
|
||||||
mType->setEnabled(active);
|
mType->setEnabled(active);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CSVWorld::ReferenceableCreator::setType (int index)
|
||||||
|
{
|
||||||
|
// container items have name limit of 32 characters
|
||||||
|
std::string text = mType->currentText().toStdString();
|
||||||
|
if (text == "Potion" ||
|
||||||
|
text == "Apparatus" ||
|
||||||
|
text == "Armor" ||
|
||||||
|
text == "Book" ||
|
||||||
|
text == "Clothing" ||
|
||||||
|
text == "Ingredient" ||
|
||||||
|
text == "ItemLevelledList" ||
|
||||||
|
text == "Light" ||
|
||||||
|
text == "Lockpick" ||
|
||||||
|
text == "Miscellaneous" ||
|
||||||
|
text == "Probe" ||
|
||||||
|
text == "Repair" ||
|
||||||
|
text == "Weapon")
|
||||||
|
{
|
||||||
|
GenericCreator::setEditorMaxLength (32);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
GenericCreator::setEditorMaxLength (32767);
|
||||||
|
}
|
||||||
|
|
|
@ -29,6 +29,9 @@ namespace CSVWorld
|
||||||
|
|
||||||
virtual void toggleWidgets(bool active = true);
|
virtual void toggleWidgets(bool active = true);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
|
||||||
|
void setType (int index);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -261,7 +261,15 @@ QWidget *CSVWorld::CommandDelegate::createEditor (QWidget *parent, const QStyleO
|
||||||
widget->setMaxLength (32);
|
widget->setMaxLength (32);
|
||||||
return widget;
|
return widget;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case CSMWorld::ColumnBase::Display_String64:
|
||||||
|
{
|
||||||
|
// For other Display types (that represent record IDs) with drop support IdCompletionDelegate is used
|
||||||
|
CSVWidget::DropLineEdit *widget = new CSVWidget::DropLineEdit(display, parent);
|
||||||
|
widget->setMaxLength (64);
|
||||||
|
return widget;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
||||||
return QStyledItemDelegate::createEditor (parent, option, index);
|
return QStyledItemDelegate::createEditor (parent, option, index);
|
||||||
|
|
Loading…
Reference in a new issue