forked from mirror/openmw-tes3mp
Fix occasional crash with DialogueSubView, e.g. when deleting a row of a subtable.
This commit is contained in:
parent
0ecfd9119f
commit
aeec1be8b3
2 changed files with 31 additions and 28 deletions
|
@ -348,16 +348,19 @@ CSVWorld::DialogueDelegateDispatcher::~DialogueDelegateDispatcher()
|
||||||
CSVWorld::EditWidget::~EditWidget()
|
CSVWorld::EditWidget::~EditWidget()
|
||||||
{
|
{
|
||||||
for (unsigned i = 0; i < mNestedModels.size(); ++i)
|
for (unsigned i = 0; i < mNestedModels.size(); ++i)
|
||||||
{
|
|
||||||
delete mNestedModels[i];
|
delete mNestedModels[i];
|
||||||
}
|
|
||||||
delete mNestedTableDispatcher;
|
if (mDispatcher)
|
||||||
|
delete mDispatcher;
|
||||||
|
|
||||||
|
if (mNestedTableDispatcher)
|
||||||
|
delete mNestedTableDispatcher;
|
||||||
}
|
}
|
||||||
|
|
||||||
CSVWorld::EditWidget::EditWidget(QWidget *parent,
|
CSVWorld::EditWidget::EditWidget(QWidget *parent,
|
||||||
int row, CSMWorld::IdTable* table, CSMWorld::CommandDispatcher& commandDispatcher,
|
int row, CSMWorld::IdTable* table, CSMWorld::CommandDispatcher& commandDispatcher,
|
||||||
CSMDoc::Document& document, bool createAndDelete) :
|
CSMDoc::Document& document, bool createAndDelete) :
|
||||||
mDispatcher(this, table, commandDispatcher, document),
|
mDispatcher(0),
|
||||||
mNestedTableDispatcher(NULL),
|
mNestedTableDispatcher(NULL),
|
||||||
QScrollArea(parent),
|
QScrollArea(parent),
|
||||||
mWidgetMapper(NULL),
|
mWidgetMapper(NULL),
|
||||||
|
@ -369,41 +372,41 @@ mTable(table)
|
||||||
{
|
{
|
||||||
remake (row);
|
remake (row);
|
||||||
|
|
||||||
connect(&mDispatcher, SIGNAL(tableMimeDataDropped(QWidget*, const QModelIndex&, const CSMWorld::UniversalId&, const CSMDoc::Document*)),
|
connect(mDispatcher, SIGNAL(tableMimeDataDropped(QWidget*, const QModelIndex&, const CSMWorld::UniversalId&, const CSMDoc::Document*)),
|
||||||
this, SIGNAL(tableMimeDataDropped(QWidget*, const QModelIndex&, const CSMWorld::UniversalId&, const CSMDoc::Document*)));
|
this, SIGNAL(tableMimeDataDropped(QWidget*, const QModelIndex&, const CSMWorld::UniversalId&, const CSMDoc::Document*)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSVWorld::EditWidget::remake(int row)
|
void CSVWorld::EditWidget::remake(int row)
|
||||||
{
|
{
|
||||||
for (unsigned i = 0; i < mNestedModels.size(); ++i)
|
for (unsigned i = 0; i < mNestedModels.size(); ++i)
|
||||||
{
|
|
||||||
delete mNestedModels[i];
|
delete mNestedModels[i];
|
||||||
}
|
|
||||||
mNestedModels.clear();
|
|
||||||
delete mNestedTableDispatcher;
|
|
||||||
|
|
||||||
if (mMainWidget)
|
mNestedModels.clear();
|
||||||
{
|
|
||||||
delete mMainWidget;
|
if (mDispatcher)
|
||||||
mMainWidget = 0;
|
delete mDispatcher;
|
||||||
}
|
mDispatcher = new DialogueDelegateDispatcher(0/*this*/, mTable, mCommandDispatcher, mDocument);
|
||||||
mMainWidget = new QWidget (this);
|
|
||||||
|
if (mNestedTableDispatcher)
|
||||||
|
delete mNestedTableDispatcher;
|
||||||
|
|
||||||
//not sure if widget mapper can handle deleting the widgets that were mapped
|
//not sure if widget mapper can handle deleting the widgets that were mapped
|
||||||
if (mWidgetMapper)
|
if (mWidgetMapper)
|
||||||
{
|
|
||||||
delete mWidgetMapper;
|
delete mWidgetMapper;
|
||||||
mWidgetMapper = 0;
|
|
||||||
}
|
|
||||||
if (mNestedTableMapper)
|
|
||||||
{
|
|
||||||
delete mNestedTableMapper;
|
|
||||||
mNestedTableMapper = 0;
|
|
||||||
}
|
|
||||||
mWidgetMapper = new QDataWidgetMapper (this);
|
|
||||||
|
|
||||||
|
mWidgetMapper = new QDataWidgetMapper (this);
|
||||||
mWidgetMapper->setModel(mTable);
|
mWidgetMapper->setModel(mTable);
|
||||||
mWidgetMapper->setItemDelegate(&mDispatcher);
|
mWidgetMapper->setItemDelegate(mDispatcher);
|
||||||
|
|
||||||
|
if (mNestedTableMapper)
|
||||||
|
delete mNestedTableMapper;
|
||||||
|
|
||||||
|
if (mMainWidget)
|
||||||
|
{
|
||||||
|
QWidget *del = this->takeWidget();
|
||||||
|
del->deleteLater();
|
||||||
|
}
|
||||||
|
mMainWidget = new QWidget (this);
|
||||||
|
|
||||||
QFrame* line = new QFrame(mMainWidget);
|
QFrame* line = new QFrame(mMainWidget);
|
||||||
line->setObjectName(QString::fromUtf8("line"));
|
line->setObjectName(QString::fromUtf8("line"));
|
||||||
|
@ -476,8 +479,8 @@ void CSVWorld::EditWidget::remake(int row)
|
||||||
}
|
}
|
||||||
else if (!(flags & CSMWorld::ColumnBase::Flag_Dialogue_List))
|
else if (!(flags & CSMWorld::ColumnBase::Flag_Dialogue_List))
|
||||||
{
|
{
|
||||||
mDispatcher.makeDelegate (display);
|
mDispatcher->makeDelegate (display);
|
||||||
QWidget* editor = mDispatcher.makeEditor (display, (mTable->index (row, i)));
|
QWidget* editor = mDispatcher->makeEditor (display, (mTable->index (row, i)));
|
||||||
|
|
||||||
if (editor)
|
if (editor)
|
||||||
{
|
{
|
||||||
|
|
|
@ -165,7 +165,7 @@ namespace CSVWorld
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
QDataWidgetMapper *mWidgetMapper;
|
QDataWidgetMapper *mWidgetMapper;
|
||||||
QDataWidgetMapper *mNestedTableMapper;
|
QDataWidgetMapper *mNestedTableMapper;
|
||||||
DialogueDelegateDispatcher mDispatcher;
|
DialogueDelegateDispatcher *mDispatcher;
|
||||||
DialogueDelegateDispatcher *mNestedTableDispatcher;
|
DialogueDelegateDispatcher *mNestedTableDispatcher;
|
||||||
QWidget* mMainWidget;
|
QWidget* mMainWidget;
|
||||||
CSMWorld::IdTable* mTable;
|
CSMWorld::IdTable* mTable;
|
||||||
|
|
Loading…
Reference in a new issue