mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-26 18:35:20 +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
@ -103,7 +103,8 @@ bool CSMWorld::ColumnBase::isId (Display display)
|
||||
bool CSMWorld::ColumnBase::isText (Display display)
|
||||
{
|
||||
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)
|
||||
|
@ -129,6 +129,7 @@ namespace CSMWorld
|
||||
Display_InfoCondVar,
|
||||
Display_InfoCondComp,
|
||||
Display_String32,
|
||||
Display_String64,
|
||||
Display_LongString256,
|
||||
|
||||
Display_EffectSkill, // must display at least one, unlike Display_Skill
|
||||
|
@ -317,7 +317,8 @@ namespace CSMWorld
|
||||
template<typename 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
|
||||
{
|
||||
|
@ -107,7 +107,8 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding, const ResourcesManager& resourc
|
||||
mFactions.addColumn (new StringIdColumn<ESM::Faction>);
|
||||
mFactions.addColumn (new RecordStateColumn<ESM::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> (1));
|
||||
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));
|
||||
index = mFactions.getColumns()-1;
|
||||
mFactions.addAdapter (std::make_pair(&mFactions.getColumn(index), new FactionReactionsAdapter ()));
|
||||
// NAME32 enforced in IdCompletionDelegate::createEditor()
|
||||
mFactions.getNestableColumn(index)->addColumn(
|
||||
new NestedChildColumn (Columns::ColumnId_Faction, ColumnBase::Display_Faction));
|
||||
mFactions.getNestableColumn(index)->addColumn(
|
||||
@ -185,6 +187,7 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding, const ResourcesManager& resourc
|
||||
index = mRegions.getColumns()-1;
|
||||
mRegions.addAdapter (std::make_pair(&mRegions.getColumn(index), new RegionSoundListAdapter ()));
|
||||
mRegions.getNestableColumn(index)->addColumn(
|
||||
// NAME32 enforced in IdCompletionDelegate::createEditor()
|
||||
new NestedChildColumn (Columns::ColumnId_SoundName, ColumnBase::Display_Sound));
|
||||
mRegions.getNestableColumn(index)->addColumn(
|
||||
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 RecordStateColumn<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_InteriorWater, ESM::Cell::HasWater,
|
||||
ColumnBase::Flag_Table | ColumnBase::Flag_Dialogue | ColumnBase::Flag_Dialogue_Refresh));
|
||||
|
@ -58,8 +58,11 @@ CSMWorld::RefIdCollection::RefIdCollection(const CSMWorld::Data& data)
|
||||
|
||||
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();
|
||||
// NAME32 enforced in IdCompletionDelegate::createEditor()
|
||||
mColumns.push_back (RefIdColumn (Columns::ColumnId_Script, ColumnBase::Display_Script));
|
||||
nameColumns.mScript = &mColumns.back();
|
||||
|
||||
@ -239,9 +242,9 @@ CSMWorld::RefIdCollection::RefIdCollection(const CSMWorld::Data& data)
|
||||
mColumns.back().addColumn(
|
||||
new RefIdColumn (Columns::ColumnId_AiWanderRepeat, CSMWorld::ColumnBase::Display_Boolean));
|
||||
mColumns.back().addColumn(
|
||||
new RefIdColumn (Columns::ColumnId_AiActivateName, CSMWorld::ColumnBase::Display_String));
|
||||
new RefIdColumn (Columns::ColumnId_AiActivateName, CSMWorld::ColumnBase::Display_String32));
|
||||
mColumns.back().addColumn(
|
||||
new RefIdColumn (Columns::ColumnId_AiTargetId, CSMWorld::ColumnBase::Display_String));
|
||||
new RefIdColumn (Columns::ColumnId_AiTargetId, CSMWorld::ColumnBase::Display_String32));
|
||||
mColumns.back().addColumn(
|
||||
new RefIdColumn (Columns::ColumnId_AiTargetCell, CSMWorld::ColumnBase::Display_String));
|
||||
mColumns.back().addColumn(
|
||||
@ -486,6 +489,7 @@ CSMWorld::RefIdCollection::RefIdCollection(const CSMWorld::Data& data)
|
||||
mColumns.push_back (RefIdColumn (Columns::ColumnId_Class, ColumnBase::Display_Class));
|
||||
npcColumns.mClass = &mColumns.back();
|
||||
|
||||
// NAME32 enforced in IdCompletionDelegate::createEditor()
|
||||
mColumns.push_back (RefIdColumn (Columns::ColumnId_Faction, ColumnBase::Display_Faction));
|
||||
npcColumns.mFaction = &mColumns.back();
|
||||
|
||||
|
@ -84,6 +84,13 @@ void CSVWorld::CellCreator::setType (int index)
|
||||
mYLabel->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();
|
||||
}
|
||||
|
||||
@ -92,7 +99,7 @@ void CSVWorld::CellCreator::valueChanged (int index)
|
||||
update();
|
||||
}
|
||||
|
||||
void CSVWorld::CellCreator::cloneMode(const std::string& originId,
|
||||
void CSVWorld::CellCreator::cloneMode(const std::string& originId,
|
||||
const CSMWorld::UniversalId::Type 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()));
|
||||
}
|
||||
|
||||
void CSVWorld::GenericCreator::setEditorMaxLength (int length)
|
||||
{
|
||||
mId->setMaxLength (length);
|
||||
}
|
||||
|
||||
void CSVWorld::GenericCreator::setEditLock (bool locked)
|
||||
{
|
||||
mLocked = locked;
|
||||
|
@ -78,6 +78,8 @@ namespace CSVWorld
|
||||
|
||||
std::string getNamespace() const;
|
||||
|
||||
void setEditorMaxLength(int length);
|
||||
|
||||
private:
|
||||
|
||||
void updateNamespace();
|
||||
|
@ -30,11 +30,27 @@ QWidget *CSVWorld::IdCompletionDelegate::createEditor(QWidget *parent,
|
||||
CSMWorld::IdCompletionManager &completionManager = getDocument().getIdCompletionManager();
|
||||
CSVWidget::DropLineEdit *editor = new CSVWidget::DropLineEdit(display, parent);
|
||||
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;
|
||||
}
|
||||
|
||||
CSVWorld::CommandDelegate *CSVWorld::IdCompletionDelegateFactory::makeDelegate(CSMWorld::CommandDispatcher *dispatcher,
|
||||
CSMDoc::Document& document,
|
||||
CSMDoc::Document& document,
|
||||
QObject *parent) const
|
||||
{
|
||||
return new IdCompletionDelegate(dispatcher, document, parent);
|
||||
|
@ -33,6 +33,8 @@ CSVWorld::ReferenceableCreator::ReferenceableCreator (CSMWorld::Data& data, QUnd
|
||||
}
|
||||
|
||||
insertBeforeButtons (mType, false);
|
||||
|
||||
connect (mType, SIGNAL (currentIndexChanged (int)), this, SLOT (setType (int)));
|
||||
}
|
||||
|
||||
void CSVWorld::ReferenceableCreator::reset()
|
||||
@ -53,3 +55,27 @@ void CSVWorld::ReferenceableCreator::toggleWidgets(bool active)
|
||||
CSVWorld::GenericCreator::toggleWidgets(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);
|
||||
|
||||
private slots:
|
||||
|
||||
void setType (int index);
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -261,7 +261,15 @@ QWidget *CSVWorld::CommandDelegate::createEditor (QWidget *parent, const QStyleO
|
||||
widget->setMaxLength (32);
|
||||
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:
|
||||
|
||||
return QStyledItemDelegate::createEditor (parent, option, index);
|
||||
|
Loading…
x
Reference in New Issue
Block a user