forked from teamnwah/openmw-tes3coop
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
|
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
|
refidadapter refiddata refidadapterimp ref collectionbase refcollection columns infocollection tablemimedata cellcoordinates cellselection resources resourcesmanager scope
|
||||||
pathgrid landtexture land nestedtablewrapper nestedcollection nestedcoladapterimp nestedinfocollection
|
pathgrid landtexture land nestedtablewrapper nestedcollection nestedcoladapterimp nestedinfocollection
|
||||||
idcompletionmanager metadata
|
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 <QColor>
|
||||||
|
|
||||||
|
#include <components/esm/loadbody.hpp>
|
||||||
|
#include <components/esm/loadskil.hpp>
|
||||||
|
#include <components/esm/loadrace.hpp>
|
||||||
|
|
||||||
#include "columnbase.hpp"
|
#include "columnbase.hpp"
|
||||||
#include "columns.hpp"
|
#include "columns.hpp"
|
||||||
#include "info.hpp"
|
#include "info.hpp"
|
||||||
|
@ -1911,8 +1915,8 @@ namespace CSMWorld
|
||||||
template<typename ESXRecordT>
|
template<typename ESXRecordT>
|
||||||
struct MeshTypeColumn : public Column<ESXRecordT>
|
struct MeshTypeColumn : public Column<ESXRecordT>
|
||||||
{
|
{
|
||||||
MeshTypeColumn()
|
MeshTypeColumn(int flags = ColumnBase::Flag_Table | ColumnBase::Flag_Dialogue)
|
||||||
: Column<ESXRecordT> (Columns::ColumnId_MeshType, ColumnBase::Display_MeshType)
|
: Column<ESXRecordT> (Columns::ColumnId_MeshType, ColumnBase::Display_MeshType, flags)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
virtual QVariant get (const Record<ESXRecordT>& record) const
|
virtual QVariant get (const Record<ESXRecordT>& record) const
|
||||||
|
@ -2379,7 +2383,18 @@ namespace CSMWorld
|
||||||
{
|
{
|
||||||
return true;
|
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
|
#endif
|
||||||
|
|
|
@ -536,11 +536,6 @@ namespace
|
||||||
"AI Wander", "AI Travel", "AI Follow", "AI Escort", "AI Activate", 0
|
"AI Wander", "AI Travel", "AI Follow", "AI Escort", "AI Activate", 0
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *sAiWanderRepeat[] =
|
|
||||||
{
|
|
||||||
"No", "Yes", 0
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char *sInfoCondFunc[] =
|
static const char *sInfoCondFunc[] =
|
||||||
{
|
{
|
||||||
" ", "Function", "Global", "Local", "Journal",
|
" ", "Function", "Global", "Local", "Journal",
|
||||||
|
@ -580,7 +575,6 @@ namespace
|
||||||
case CSMWorld::Columns::ColumnId_EffectId: return sEffectId;
|
case CSMWorld::Columns::ColumnId_EffectId: return sEffectId;
|
||||||
case CSMWorld::Columns::ColumnId_PartRefType: return sPartRefType;
|
case CSMWorld::Columns::ColumnId_PartRefType: return sPartRefType;
|
||||||
case CSMWorld::Columns::ColumnId_AiPackageType: return sAiPackageType;
|
case CSMWorld::Columns::ColumnId_AiPackageType: return sAiPackageType;
|
||||||
case CSMWorld::Columns::ColumnId_AiWanderRepeat: return sAiWanderRepeat;
|
|
||||||
case CSMWorld::Columns::ColumnId_InfoCondFunc: return sInfoCondFunc;
|
case CSMWorld::Columns::ColumnId_InfoCondFunc: return sInfoCondFunc;
|
||||||
// FIXME: don't have dynamic value enum delegate, use Display_String for now
|
// FIXME: don't have dynamic value enum delegate, use Display_String for now
|
||||||
//case CSMWorld::Columns::ColumnId_InfoCond: return sInfoCond;
|
//case CSMWorld::Columns::ColumnId_InfoCond: return sInfoCond;
|
||||||
|
|
|
@ -21,12 +21,17 @@ CSMWorld::ModifyCommand::ModifyCommand (QAbstractItemModel& model, const QModelI
|
||||||
// Replace proxy with actual model
|
// Replace proxy with actual model
|
||||||
mIndex = proxy->mapToSource (index);
|
mIndex = proxy->mapToSource (index);
|
||||||
mModel = proxy->sourceModel();
|
mModel = proxy->sourceModel();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mIndex.parent().isValid())
|
||||||
|
{
|
||||||
setText ("Modify " + dynamic_cast<CSMWorld::IdTree*>(mModel)->nestedHeaderData (
|
setText ("Modify " + dynamic_cast<CSMWorld::IdTree*>(mModel)->nestedHeaderData (
|
||||||
mIndex.parent().column(), mIndex.column(), Qt::Horizontal, Qt::DisplayRole).toString());
|
mIndex.parent().column(), mIndex.column(), Qt::Horizontal, Qt::DisplayRole).toString());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
setText ("Modify " + mModel->headerData (mIndex.column(), Qt::Horizontal, Qt::DisplayRole).toString());
|
setText ("Modify " + mModel->headerData (mIndex.column(), Qt::Horizontal, Qt::DisplayRole).toString());
|
||||||
|
}
|
||||||
|
|
||||||
// Remember record state before the modification
|
// Remember record state before the modification
|
||||||
if (CSMWorld::IdTable *table = dynamic_cast<IdTable *>(mModel))
|
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_Female, ESM::BodyPart::BPF_Female));
|
||||||
mBodyParts.addColumn (new FlagColumn<ESM::BodyPart> (Columns::ColumnId_Playable,
|
mBodyParts.addColumn (new FlagColumn<ESM::BodyPart> (Columns::ColumnId_Playable,
|
||||||
ESM::BodyPart::BPF_NotPlayable, ColumnBase::Flag_Table | ColumnBase::Flag_Dialogue, true));
|
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 ModelColumn<ESM::BodyPart>);
|
||||||
mBodyParts.addColumn (new RaceColumn<ESM::BodyPart>);
|
mBodyParts.addColumn (new BodyPartRaceColumn(meshTypeColumn));
|
||||||
|
|
||||||
mSoundGens.addColumn (new StringIdColumn<ESM::SoundGenerator>);
|
mSoundGens.addColumn (new StringIdColumn<ESM::SoundGenerator>);
|
||||||
mSoundGens.addColumn (new RecordStateColumn<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)
|
if (mIdCollection->getColumn (index.column()).isEditable() && role==Qt::EditRole)
|
||||||
{
|
{
|
||||||
mIdCollection->setData (index.row(), index.column(), value);
|
mIdCollection->setData (index.row(), index.column(), value);
|
||||||
|
emit dataChanged(index, index);
|
||||||
|
|
||||||
// Modifying a value can also change the Modified status of a record.
|
// Modifying a value can also change the Modified status of a record.
|
||||||
// To track this, we inform about the change of a whole row.
|
int stateColumn = searchColumnIndex(Columns::ColumnId_Modification);
|
||||||
QModelIndex rowStart = this->index(index.row(), 0);
|
if (stateColumn != -1)
|
||||||
QModelIndex rowEnd = this->index(index.row(), columnCount(index.parent()) - 1);
|
{
|
||||||
emit dataChanged(rowStart, rowEnd);
|
QModelIndex stateIndex = this->index(index.row(), stateColumn);
|
||||||
|
emit dataChanged(stateIndex, stateIndex);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
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()));
|
const std::pair<int, int>& parentAddress(unfoldIndexAddress(index.internalId()));
|
||||||
|
|
||||||
mNestedCollection->setNestedData(parentAddress.first, parentAddress.second, value, index.row(), index.column());
|
mNestedCollection->setNestedData(parentAddress.first, parentAddress.second, value, index.row(), index.column());
|
||||||
|
|
||||||
emit dataChanged(index, index);
|
emit dataChanged(index, index);
|
||||||
|
|
||||||
// Modifying a value can also change the Modified status of a record (located in the parent row).
|
// Modifying a value can also change the Modified status of a record.
|
||||||
// To track this, we inform about the change of a whole parent row.
|
int stateColumn = searchColumnIndex(Columns::ColumnId_Modification);
|
||||||
QModelIndex parentRowStart = this->index(index.parent().row(), 0);
|
if (stateColumn != -1)
|
||||||
QModelIndex parentRowEnd = this->index(index.parent().row(), columnCount(index.parent()) - 1);
|
{
|
||||||
emit dataChanged(parentRowStart, parentRowEnd);
|
QModelIndex stateIndex = this->index(index.parent().row(), stateColumn);
|
||||||
|
emit dataChanged(stateIndex, stateIndex);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1566,7 +1566,7 @@ namespace CSMWorld
|
||||||
return QVariant();
|
return QVariant();
|
||||||
case 5: // wander repeat
|
case 5: // wander repeat
|
||||||
if (content.mType == ESM::AI_Wander)
|
if (content.mType == ESM::AI_Wander)
|
||||||
return content.mWander.mShouldRepeat;
|
return content.mWander.mShouldRepeat != 0;
|
||||||
else
|
else
|
||||||
return QVariant();
|
return QVariant();
|
||||||
case 6: // activate name
|
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_EffectId, CSMWorld::Columns::ColumnId_EffectId, false },
|
||||||
{ CSMWorld::ColumnBase::Display_PartRefType, CSMWorld::Columns::ColumnId_PartRefType, false },
|
{ CSMWorld::ColumnBase::Display_PartRefType, CSMWorld::Columns::ColumnId_PartRefType, false },
|
||||||
{ CSMWorld::ColumnBase::Display_AiPackageType, CSMWorld::Columns::ColumnId_AiPackageType, 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_InfoCondFunc, CSMWorld::Columns::ColumnId_InfoCondFunc, false },
|
||||||
{ CSMWorld::ColumnBase::Display_InfoCondComp, CSMWorld::Columns::ColumnId_InfoCondComp, false },
|
{ CSMWorld::ColumnBase::Display_InfoCondComp, CSMWorld::Columns::ColumnId_InfoCondComp, false },
|
||||||
{ CSMWorld::ColumnBase::Display_RaceSkill, CSMWorld::Columns::ColumnId_RaceSkill, true },
|
{ CSMWorld::ColumnBase::Display_RaceSkill, CSMWorld::Columns::ColumnId_RaceSkill, true },
|
||||||
|
|
|
@ -273,12 +273,16 @@ CSVWorld::Table::Table (const CSMWorld::UniversalId& id,
|
||||||
horizontalHeader()->setResizeMode (QHeaderView::Interactive);
|
horizontalHeader()->setResizeMode (QHeaderView::Interactive);
|
||||||
#endif
|
#endif
|
||||||
verticalHeader()->hide();
|
verticalHeader()->hide();
|
||||||
setSortingEnabled (sorting);
|
|
||||||
setSelectionBehavior (QAbstractItemView::SelectRows);
|
setSelectionBehavior (QAbstractItemView::SelectRows);
|
||||||
setSelectionMode (QAbstractItemView::ExtendedSelection);
|
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)
|
for (int i=0; i<columns; ++i)
|
||||||
{
|
{
|
||||||
int flags = mModel->headerData (i, Qt::Horizontal, CSMWorld::ColumnBase::Role_Flags).toInt();
|
int flags = mModel->headerData (i, Qt::Horizontal, CSMWorld::ColumnBase::Role_Flags).toInt();
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include <QCheckBox>
|
#include <QCheckBox>
|
||||||
#include <QPlainTextEdit>
|
#include <QPlainTextEdit>
|
||||||
#include <QEvent>
|
#include <QEvent>
|
||||||
|
#include <QItemEditorFactory>
|
||||||
|
|
||||||
#include "../../model/world/commands.hpp"
|
#include "../../model/world/commands.hpp"
|
||||||
#include "../../model/world/tablemimedata.hpp"
|
#include "../../model/world/tablemimedata.hpp"
|
||||||
|
@ -172,7 +173,7 @@ QWidget *CSVWorld::CommandDelegate::createEditor (QWidget *parent, const QStyleO
|
||||||
// TODO: Find a better solution?
|
// TODO: Find a better solution?
|
||||||
if (display == CSMWorld::ColumnBase::Display_Boolean)
|
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
|
// For tables the pop-up of the color editor should appear immediately after the editor creation
|
||||||
// (the third parameter of ColorEditor's constructor)
|
// (the third parameter of ColorEditor's constructor)
|
||||||
|
|
Loading…
Reference in a new issue