mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-16 19:19:56 +00:00
Merge remote-tracking branch 'smbas/fix-opencs-bugs'
This commit is contained in:
commit
e76401d5ea
12 changed files with 80 additions and 27 deletions
|
@ -23,7 +23,7 @@ opencs_units (model/world
|
|||
|
||||
|
||||
opencs_units_noqt (model/world
|
||||
universalid record commands columnbase scriptcontext cell refidcollection
|
||||
universalid record commands columnbase columnimp scriptcontext cell refidcollection
|
||||
refidadapter refiddata refidadapterimp ref collectionbase refcollection columns infocollection tablemimedata cellcoordinates cellselection resources resourcesmanager scope
|
||||
pathgrid landtexture land nestedtablewrapper nestedcollection nestedcoladapterimp nestedinfocollection
|
||||
idcompletionmanager metadata
|
||||
|
|
28
apps/opencs/model/world/columnimp.cpp
Normal file
28
apps/opencs/model/world/columnimp.cpp
Normal file
|
@ -0,0 +1,28 @@
|
|||
#include "columnimp.hpp"
|
||||
|
||||
CSMWorld::BodyPartRaceColumn::BodyPartRaceColumn(const MeshTypeColumn<ESM::BodyPart> *meshType)
|
||||
: mMeshType(meshType)
|
||||
{}
|
||||
|
||||
QVariant CSMWorld::BodyPartRaceColumn::get(const Record<ESM::BodyPart> &record) const
|
||||
{
|
||||
if (mMeshType != NULL && mMeshType->get(record) == ESM::BodyPart::MT_Skin)
|
||||
{
|
||||
return QString::fromUtf8(record.get().mRace.c_str());
|
||||
}
|
||||
return QVariant(QVariant::UserType);
|
||||
}
|
||||
|
||||
void CSMWorld::BodyPartRaceColumn::set(Record<ESM::BodyPart> &record, const QVariant &data)
|
||||
{
|
||||
ESM::BodyPart record2 = record.get();
|
||||
|
||||
record2.mRace = data.toString().toUtf8().constData();
|
||||
|
||||
record.setModified(record2);
|
||||
}
|
||||
|
||||
bool CSMWorld::BodyPartRaceColumn::isEditable() const
|
||||
{
|
||||
return true;
|
||||
}
|
|
@ -9,6 +9,10 @@
|
|||
|
||||
#include <QColor>
|
||||
|
||||
#include <components/esm/loadbody.hpp>
|
||||
#include <components/esm/loadskil.hpp>
|
||||
#include <components/esm/loadrace.hpp>
|
||||
|
||||
#include "columnbase.hpp"
|
||||
#include "columns.hpp"
|
||||
#include "info.hpp"
|
||||
|
@ -1911,8 +1915,8 @@ namespace CSMWorld
|
|||
template<typename ESXRecordT>
|
||||
struct MeshTypeColumn : public Column<ESXRecordT>
|
||||
{
|
||||
MeshTypeColumn()
|
||||
: Column<ESXRecordT> (Columns::ColumnId_MeshType, ColumnBase::Display_MeshType)
|
||||
MeshTypeColumn(int flags = ColumnBase::Flag_Table | ColumnBase::Flag_Dialogue)
|
||||
: Column<ESXRecordT> (Columns::ColumnId_MeshType, ColumnBase::Display_MeshType, flags)
|
||||
{}
|
||||
|
||||
virtual QVariant get (const Record<ESXRecordT>& record) const
|
||||
|
@ -2379,7 +2383,18 @@ namespace CSMWorld
|
|||
{
|
||||
return true;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
struct BodyPartRaceColumn : public RaceColumn<ESM::BodyPart>
|
||||
{
|
||||
const MeshTypeColumn<ESM::BodyPart> *mMeshType;
|
||||
|
||||
BodyPartRaceColumn(const MeshTypeColumn<ESM::BodyPart> *meshType);
|
||||
|
||||
virtual QVariant get(const Record<ESM::BodyPart> &record) const;
|
||||
virtual void set(Record<ESM::BodyPart> &record, const QVariant &data);
|
||||
virtual bool isEditable() const;
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -536,11 +536,6 @@ namespace
|
|||
"AI Wander", "AI Travel", "AI Follow", "AI Escort", "AI Activate", 0
|
||||
};
|
||||
|
||||
static const char *sAiWanderRepeat[] =
|
||||
{
|
||||
"No", "Yes", 0
|
||||
};
|
||||
|
||||
static const char *sInfoCondFunc[] =
|
||||
{
|
||||
" ", "Function", "Global", "Local", "Journal",
|
||||
|
@ -580,7 +575,6 @@ namespace
|
|||
case CSMWorld::Columns::ColumnId_EffectId: return sEffectId;
|
||||
case CSMWorld::Columns::ColumnId_PartRefType: return sPartRefType;
|
||||
case CSMWorld::Columns::ColumnId_AiPackageType: return sAiPackageType;
|
||||
case CSMWorld::Columns::ColumnId_AiWanderRepeat: return sAiWanderRepeat;
|
||||
case CSMWorld::Columns::ColumnId_InfoCondFunc: return sInfoCondFunc;
|
||||
// FIXME: don't have dynamic value enum delegate, use Display_String for now
|
||||
//case CSMWorld::Columns::ColumnId_InfoCond: return sInfoCond;
|
||||
|
|
|
@ -21,12 +21,17 @@ CSMWorld::ModifyCommand::ModifyCommand (QAbstractItemModel& model, const QModelI
|
|||
// Replace proxy with actual model
|
||||
mIndex = proxy->mapToSource (index);
|
||||
mModel = proxy->sourceModel();
|
||||
}
|
||||
|
||||
if (mIndex.parent().isValid())
|
||||
{
|
||||
setText ("Modify " + dynamic_cast<CSMWorld::IdTree*>(mModel)->nestedHeaderData (
|
||||
mIndex.parent().column(), mIndex.column(), Qt::Horizontal, Qt::DisplayRole).toString());
|
||||
}
|
||||
else
|
||||
{
|
||||
setText ("Modify " + mModel->headerData (mIndex.column(), Qt::Horizontal, Qt::DisplayRole).toString());
|
||||
}
|
||||
|
||||
// Remember record state before the modification
|
||||
if (CSMWorld::IdTable *table = dynamic_cast<IdTable *>(mModel))
|
||||
|
|
|
@ -351,9 +351,12 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding, const ResourcesManager& resourc
|
|||
mBodyParts.addColumn (new FlagColumn<ESM::BodyPart> (Columns::ColumnId_Female, ESM::BodyPart::BPF_Female));
|
||||
mBodyParts.addColumn (new FlagColumn<ESM::BodyPart> (Columns::ColumnId_Playable,
|
||||
ESM::BodyPart::BPF_NotPlayable, ColumnBase::Flag_Table | ColumnBase::Flag_Dialogue, true));
|
||||
mBodyParts.addColumn (new MeshTypeColumn<ESM::BodyPart>);
|
||||
|
||||
int meshTypeFlags = ColumnBase::Flag_Table | ColumnBase::Flag_Dialogue | ColumnBase::Flag_Dialogue_Refresh;
|
||||
MeshTypeColumn<ESM::BodyPart> *meshTypeColumn = new MeshTypeColumn<ESM::BodyPart>(meshTypeFlags);
|
||||
mBodyParts.addColumn (meshTypeColumn);
|
||||
mBodyParts.addColumn (new ModelColumn<ESM::BodyPart>);
|
||||
mBodyParts.addColumn (new RaceColumn<ESM::BodyPart>);
|
||||
mBodyParts.addColumn (new BodyPartRaceColumn(meshTypeColumn));
|
||||
|
||||
mSoundGens.addColumn (new StringIdColumn<ESM::SoundGenerator>);
|
||||
mSoundGens.addColumn (new RecordStateColumn<ESM::SoundGenerator>);
|
||||
|
|
|
@ -76,12 +76,15 @@ bool CSMWorld::IdTable::setData (const QModelIndex &index, const QVariant &value
|
|||
if (mIdCollection->getColumn (index.column()).isEditable() && role==Qt::EditRole)
|
||||
{
|
||||
mIdCollection->setData (index.row(), index.column(), value);
|
||||
emit dataChanged(index, index);
|
||||
|
||||
// Modifying a value can also change the Modified status of a record.
|
||||
// To track this, we inform about the change of a whole row.
|
||||
QModelIndex rowStart = this->index(index.row(), 0);
|
||||
QModelIndex rowEnd = this->index(index.row(), columnCount(index.parent()) - 1);
|
||||
emit dataChanged(rowStart, rowEnd);
|
||||
int stateColumn = searchColumnIndex(Columns::ColumnId_Modification);
|
||||
if (stateColumn != -1)
|
||||
{
|
||||
QModelIndex stateIndex = this->index(index.row(), stateColumn);
|
||||
emit dataChanged(stateIndex, stateIndex);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -95,14 +95,15 @@ bool CSMWorld::IdTree::setData (const QModelIndex &index, const QVariant &value,
|
|||
const std::pair<int, int>& parentAddress(unfoldIndexAddress(index.internalId()));
|
||||
|
||||
mNestedCollection->setNestedData(parentAddress.first, parentAddress.second, value, index.row(), index.column());
|
||||
|
||||
emit dataChanged(index, index);
|
||||
|
||||
// Modifying a value can also change the Modified status of a record (located in the parent row).
|
||||
// To track this, we inform about the change of a whole parent row.
|
||||
QModelIndex parentRowStart = this->index(index.parent().row(), 0);
|
||||
QModelIndex parentRowEnd = this->index(index.parent().row(), columnCount(index.parent()) - 1);
|
||||
emit dataChanged(parentRowStart, parentRowEnd);
|
||||
// Modifying a value can also change the Modified status of a record.
|
||||
int stateColumn = searchColumnIndex(Columns::ColumnId_Modification);
|
||||
if (stateColumn != -1)
|
||||
{
|
||||
QModelIndex stateIndex = this->index(index.parent().row(), stateColumn);
|
||||
emit dataChanged(stateIndex, stateIndex);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -1566,7 +1566,7 @@ namespace CSMWorld
|
|||
return QVariant();
|
||||
case 5: // wander repeat
|
||||
if (content.mType == ESM::AI_Wander)
|
||||
return content.mWander.mShouldRepeat;
|
||||
return content.mWander.mShouldRepeat != 0;
|
||||
else
|
||||
return QVariant();
|
||||
case 6: // activate name
|
||||
|
|
|
@ -102,7 +102,6 @@ CSVDoc::ViewManager::ViewManager (CSMDoc::DocumentManager& documentManager)
|
|||
{ CSMWorld::ColumnBase::Display_EffectId, CSMWorld::Columns::ColumnId_EffectId, false },
|
||||
{ CSMWorld::ColumnBase::Display_PartRefType, CSMWorld::Columns::ColumnId_PartRefType, false },
|
||||
{ CSMWorld::ColumnBase::Display_AiPackageType, CSMWorld::Columns::ColumnId_AiPackageType, false },
|
||||
{ CSMWorld::ColumnBase::Display_Boolean, CSMWorld::Columns::ColumnId_AiWanderRepeat, false },
|
||||
{ CSMWorld::ColumnBase::Display_InfoCondFunc, CSMWorld::Columns::ColumnId_InfoCondFunc, false },
|
||||
{ CSMWorld::ColumnBase::Display_InfoCondComp, CSMWorld::Columns::ColumnId_InfoCondComp, false },
|
||||
{ CSMWorld::ColumnBase::Display_RaceSkill, CSMWorld::Columns::ColumnId_RaceSkill, true },
|
||||
|
|
|
@ -273,12 +273,16 @@ CSVWorld::Table::Table (const CSMWorld::UniversalId& id,
|
|||
horizontalHeader()->setResizeMode (QHeaderView::Interactive);
|
||||
#endif
|
||||
verticalHeader()->hide();
|
||||
setSortingEnabled (sorting);
|
||||
setSelectionBehavior (QAbstractItemView::SelectRows);
|
||||
setSelectionMode (QAbstractItemView::ExtendedSelection);
|
||||
|
||||
int columns = mModel->columnCount();
|
||||
setSortingEnabled (sorting);
|
||||
if (sorting)
|
||||
{
|
||||
sortByColumn (mModel->findColumnIndex(CSMWorld::Columns::ColumnId_Id), Qt::AscendingOrder);
|
||||
}
|
||||
|
||||
int columns = mModel->columnCount();
|
||||
for (int i=0; i<columns; ++i)
|
||||
{
|
||||
int flags = mModel->headerData (i, Qt::Horizontal, CSMWorld::ColumnBase::Role_Flags).toInt();
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <QCheckBox>
|
||||
#include <QPlainTextEdit>
|
||||
#include <QEvent>
|
||||
#include <QItemEditorFactory>
|
||||
|
||||
#include "../../model/world/commands.hpp"
|
||||
#include "../../model/world/tablemimedata.hpp"
|
||||
|
@ -172,7 +173,7 @@ QWidget *CSVWorld::CommandDelegate::createEditor (QWidget *parent, const QStyleO
|
|||
// TODO: Find a better solution?
|
||||
if (display == CSMWorld::ColumnBase::Display_Boolean)
|
||||
{
|
||||
return QStyledItemDelegate::createEditor(parent, option, index);
|
||||
return QItemEditorFactory::defaultFactory()->createEditor(QVariant::Bool, parent);
|
||||
}
|
||||
// For tables the pop-up of the color editor should appear immediately after the editor creation
|
||||
// (the third parameter of ColorEditor's constructor)
|
||||
|
|
Loading…
Reference in a new issue