mirror of
https://github.com/OpenMW/openmw.git
synced 2025-01-31 09:45:40 +00:00
Merge branch 'master' into autocalc
Conflicts: apps/opencs/view/world/dialoguesubview.cpp
This commit is contained in:
commit
ccf840da2b
13 changed files with 222 additions and 91 deletions
|
@ -18,7 +18,7 @@ opencs_hdrs_noqt (model/doc
|
||||||
|
|
||||||
|
|
||||||
opencs_units (model/world
|
opencs_units (model/world
|
||||||
idtable idtableproxymodel regionmap data commanddispatcher idtablebase resourcetable nestedtableproxymodel idtree
|
idtable idtableproxymodel regionmap data commanddispatcher idtablebase resourcetable nestedtableproxymodel idtree infotableproxymodel
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
58
apps/opencs/model/world/infotableproxymodel.cpp
Normal file
58
apps/opencs/model/world/infotableproxymodel.cpp
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
#include "infotableproxymodel.hpp"
|
||||||
|
|
||||||
|
#include "idtablebase.hpp"
|
||||||
|
#include "columns.hpp"
|
||||||
|
|
||||||
|
CSMWorld::InfoTableProxyModel::InfoTableProxyModel(CSMWorld::UniversalId::Type type, QObject *parent)
|
||||||
|
: IdTableProxyModel(parent),
|
||||||
|
mType(type),
|
||||||
|
mSourceModel(NULL)
|
||||||
|
{
|
||||||
|
Q_ASSERT(type == UniversalId::Type_TopicInfos || type == UniversalId::Type_JournalInfos);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMWorld::InfoTableProxyModel::setSourceModel(QAbstractItemModel *sourceModel)
|
||||||
|
{
|
||||||
|
IdTableProxyModel::setSourceModel(sourceModel);
|
||||||
|
mSourceModel = dynamic_cast<IdTableBase *>(sourceModel);
|
||||||
|
connect(mSourceModel,
|
||||||
|
SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)),
|
||||||
|
this,
|
||||||
|
SLOT(modelDataChanged(const QModelIndex &, const QModelIndex &)));
|
||||||
|
mFirstRowCache.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CSMWorld::InfoTableProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
|
||||||
|
{
|
||||||
|
QModelIndex first = mSourceModel->index(getFirstInfoRow(left.row()), left.column());
|
||||||
|
QModelIndex second = mSourceModel->index(getFirstInfoRow(right.row()), right.column());
|
||||||
|
return IdTableProxyModel::lessThan(first, second);
|
||||||
|
}
|
||||||
|
|
||||||
|
int CSMWorld::InfoTableProxyModel::getFirstInfoRow(int currentRow) const
|
||||||
|
{
|
||||||
|
Columns::ColumnId columnId = Columns::ColumnId_Topic;
|
||||||
|
if (mType == UniversalId::Type_JournalInfos)
|
||||||
|
{
|
||||||
|
columnId = Columns::ColumnId_Journal;
|
||||||
|
}
|
||||||
|
|
||||||
|
int column = mSourceModel->findColumnIndex(columnId);
|
||||||
|
QString info = mSourceModel->data(mSourceModel->index(currentRow, column)).toString();
|
||||||
|
|
||||||
|
if (mFirstRowCache.contains(info))
|
||||||
|
{
|
||||||
|
return mFirstRowCache[info];
|
||||||
|
}
|
||||||
|
|
||||||
|
while (--currentRow >= 0 &&
|
||||||
|
mSourceModel->data(mSourceModel->index(currentRow, column)) == info);
|
||||||
|
|
||||||
|
mFirstRowCache[info] = currentRow + 1;
|
||||||
|
return currentRow + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMWorld::InfoTableProxyModel::modelDataChanged(const QModelIndex &/*topLeft*/, const QModelIndex &/*bottomRight*/)
|
||||||
|
{
|
||||||
|
mFirstRowCache.clear();
|
||||||
|
}
|
38
apps/opencs/model/world/infotableproxymodel.hpp
Normal file
38
apps/opencs/model/world/infotableproxymodel.hpp
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
#ifndef CSM_WORLD_INFOTABLEPROXYMODEL_HPP
|
||||||
|
#define CSM_WORLD_INFOTABLEPROXYMODEL_HPP
|
||||||
|
|
||||||
|
#include <QHash>
|
||||||
|
|
||||||
|
#include "idtableproxymodel.hpp"
|
||||||
|
#include "universalid.hpp"
|
||||||
|
|
||||||
|
namespace CSMWorld
|
||||||
|
{
|
||||||
|
class IdTableBase;
|
||||||
|
|
||||||
|
class InfoTableProxyModel : public IdTableProxyModel
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
UniversalId::Type mType;
|
||||||
|
IdTableBase *mSourceModel;
|
||||||
|
|
||||||
|
mutable QHash<QString, int> mFirstRowCache;
|
||||||
|
|
||||||
|
int getFirstInfoRow(int currentRow) const;
|
||||||
|
///< Finds the first row with the same topic (journal entry) as in \a currentRow
|
||||||
|
|
||||||
|
public:
|
||||||
|
InfoTableProxyModel(UniversalId::Type type, QObject *parent = 0);
|
||||||
|
|
||||||
|
void setSourceModel(QAbstractItemModel *sourceModel);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual bool lessThan(const QModelIndex &left, const QModelIndex &right) const;
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void modelDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -12,11 +12,10 @@ CSVWorld::DataDisplayDelegate::DataDisplayDelegate(const ValueList &values,
|
||||||
const QString &settingName,
|
const QString &settingName,
|
||||||
QObject *parent)
|
QObject *parent)
|
||||||
: EnumDelegate (values, dispatcher, document, parent), mDisplayMode (Mode_TextOnly),
|
: EnumDelegate (values, dispatcher, document, parent), mDisplayMode (Mode_TextOnly),
|
||||||
mIcons (icons), mIconSize (QSize(16, 16)), mIconLeftOffset(3),
|
mIcons (icons), mIconSize (QSize(16, 16)),
|
||||||
|
mHorizontalMargin(QApplication::style()->pixelMetric(QStyle::PM_FocusFrameHMargin) + 1),
|
||||||
mTextLeftOffset(8), mSettingKey (pageName + '/' + settingName)
|
mTextLeftOffset(8), mSettingKey (pageName + '/' + settingName)
|
||||||
{
|
{
|
||||||
mTextAlignment.setAlignment (Qt::AlignLeft | Qt::AlignVCenter );
|
|
||||||
|
|
||||||
buildPixmaps();
|
buildPixmaps();
|
||||||
|
|
||||||
QString value =
|
QString value =
|
||||||
|
@ -45,16 +44,35 @@ void CSVWorld::DataDisplayDelegate::setIconSize(const QSize& size)
|
||||||
buildPixmaps();
|
buildPixmaps();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSVWorld::DataDisplayDelegate::setIconLeftOffset(int offset)
|
|
||||||
{
|
|
||||||
mIconLeftOffset = offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CSVWorld::DataDisplayDelegate::setTextLeftOffset(int offset)
|
void CSVWorld::DataDisplayDelegate::setTextLeftOffset(int offset)
|
||||||
{
|
{
|
||||||
mTextLeftOffset = offset;
|
mTextLeftOffset = offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QSize CSVWorld::DataDisplayDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
|
||||||
|
{
|
||||||
|
QSize size = EnumDelegate::sizeHint(option, index);
|
||||||
|
|
||||||
|
int valueIndex = getValueIndex(index);
|
||||||
|
if (valueIndex != -1)
|
||||||
|
{
|
||||||
|
if (mDisplayMode == Mode_IconOnly)
|
||||||
|
{
|
||||||
|
size.setWidth(mIconSize.width() + 2 * mHorizontalMargin);
|
||||||
|
}
|
||||||
|
else if (mDisplayMode == Mode_IconAndText)
|
||||||
|
{
|
||||||
|
size.setWidth(size.width() + mIconSize.width() + mTextLeftOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mDisplayMode != Mode_TextOnly)
|
||||||
|
{
|
||||||
|
size.setHeight(qMax(size.height(), mIconSize.height()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
void CSVWorld::DataDisplayDelegate::paint (QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
|
void CSVWorld::DataDisplayDelegate::paint (QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
|
||||||
{
|
{
|
||||||
painter->save();
|
painter->save();
|
||||||
|
@ -64,16 +82,11 @@ void CSVWorld::DataDisplayDelegate::paint (QPainter *painter, const QStyleOption
|
||||||
EnumDelegate::paint(painter, option, index);
|
EnumDelegate::paint(painter, option, index);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
unsigned int i = 0;
|
int valueIndex = getValueIndex(index);
|
||||||
|
if (valueIndex != -1)
|
||||||
for (; i < mValues.size(); ++i)
|
|
||||||
{
|
{
|
||||||
if (mValues.at(i).first == index.data().toInt())
|
paintIcon(painter, option, valueIndex);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i < mValues.size() )
|
|
||||||
paintIcon (painter, option, i);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
painter->restore();
|
painter->restore();
|
||||||
|
@ -81,24 +94,28 @@ void CSVWorld::DataDisplayDelegate::paint (QPainter *painter, const QStyleOption
|
||||||
|
|
||||||
void CSVWorld::DataDisplayDelegate::paintIcon (QPainter *painter, const QStyleOptionViewItem &option, int index) const
|
void CSVWorld::DataDisplayDelegate::paintIcon (QPainter *painter, const QStyleOptionViewItem &option, int index) const
|
||||||
{
|
{
|
||||||
//function-level statics
|
|
||||||
QRect iconRect = option.rect;
|
QRect iconRect = option.rect;
|
||||||
QRect textRect = iconRect;
|
QRect textRect = iconRect;
|
||||||
|
|
||||||
const QString &text = mValues.at(index).second;
|
iconRect.setLeft(iconRect.left() + mHorizontalMargin);
|
||||||
|
iconRect.setRight(option.rect.right() - mHorizontalMargin);
|
||||||
iconRect.setSize (mIconSize);
|
if (mDisplayMode == Mode_IconAndText)
|
||||||
iconRect.translate(mIconLeftOffset, (option.rect.height() - iconRect.height())/2);
|
|
||||||
|
|
||||||
if (mDisplayMode == Mode_IconAndText )
|
|
||||||
{
|
{
|
||||||
textRect.translate (iconRect.width() + mTextLeftOffset, 0 );
|
iconRect.setWidth(mIconSize.width());
|
||||||
painter->drawText (textRect, text, mTextAlignment);
|
textRect.setLeft(iconRect.right() + mTextLeftOffset);
|
||||||
}
|
textRect.setRight(option.rect.right() - mHorizontalMargin);
|
||||||
else
|
|
||||||
iconRect.translate( (option.rect.width() - iconRect.width()) / 2, 0);
|
|
||||||
|
|
||||||
painter->drawPixmap (iconRect, mPixmaps.at(index).second);
|
QString text = option.fontMetrics.elidedText(mValues.at(index).second,
|
||||||
|
option.textElideMode,
|
||||||
|
textRect.width());
|
||||||
|
QApplication::style()->drawItemText(painter,
|
||||||
|
textRect,
|
||||||
|
Qt::AlignLeft | Qt::AlignVCenter,
|
||||||
|
option.palette,
|
||||||
|
true,
|
||||||
|
text);
|
||||||
|
}
|
||||||
|
QApplication::style()->drawItemPixmap(painter, iconRect, Qt::AlignCenter, mPixmaps.at(index).second);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSVWorld::DataDisplayDelegate::updateUserSetting (const QString &name,
|
void CSVWorld::DataDisplayDelegate::updateUserSetting (const QString &name,
|
||||||
|
|
|
@ -30,9 +30,8 @@ namespace CSVWorld
|
||||||
private:
|
private:
|
||||||
|
|
||||||
std::vector <std::pair <int, QPixmap> > mPixmaps;
|
std::vector <std::pair <int, QPixmap> > mPixmaps;
|
||||||
QTextOption mTextAlignment;
|
|
||||||
QSize mIconSize;
|
QSize mIconSize;
|
||||||
int mIconLeftOffset;
|
int mHorizontalMargin;
|
||||||
int mTextLeftOffset;
|
int mTextLeftOffset;
|
||||||
|
|
||||||
QString mSettingKey;
|
QString mSettingKey;
|
||||||
|
@ -46,12 +45,11 @@ namespace CSVWorld
|
||||||
|
|
||||||
virtual void paint (QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
|
virtual void paint (QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
|
||||||
|
|
||||||
|
virtual QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
|
||||||
|
|
||||||
/// pass a QSize defining height / width of icon. Default is QSize (16,16).
|
/// pass a QSize defining height / width of icon. Default is QSize (16,16).
|
||||||
void setIconSize (const QSize& icon);
|
void setIconSize (const QSize& icon);
|
||||||
|
|
||||||
/// offset the horizontal position of the icon from the left edge of the cell. Default is 3 pixels.
|
|
||||||
void setIconLeftOffset (int offset);
|
|
||||||
|
|
||||||
/// offset the horizontal position of the text from the right edge of the icon. Default is 8 pixels.
|
/// offset the horizontal position of the text from the right edge of the icon. Default is 8 pixels.
|
||||||
void setTextLeftOffset (int offset);
|
void setTextLeftOffset (int offset);
|
||||||
|
|
||||||
|
|
|
@ -479,8 +479,7 @@ void CSVWorld::EditWidget::remake(int row)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
table->setEditTriggers(QAbstractItemView::SelectedClicked | QAbstractItemView::CurrentChanged);
|
table->setEditTriggers(QAbstractItemView::SelectedClicked | QAbstractItemView::CurrentChanged);
|
||||||
// FIXME: does not work well when enum delegates are used
|
table->resizeColumnsToContents();
|
||||||
//table->resizeColumnsToContents();
|
|
||||||
|
|
||||||
int rows = mTable->rowCount(mTable->index(row, i));
|
int rows = mTable->rowCount(mTable->index(row, i));
|
||||||
int rowHeight = (rows == 0) ? table->horizontalHeader()->height() : table->rowHeight(0);
|
int rowHeight = (rows == 0) ? table->horizontalHeader()->height() : table->rowHeight(0);
|
||||||
|
|
|
@ -10,6 +10,24 @@
|
||||||
|
|
||||||
#include "../../model/world/commands.hpp"
|
#include "../../model/world/commands.hpp"
|
||||||
|
|
||||||
|
int CSVWorld::EnumDelegate::getValueIndex(const QModelIndex &index, int role) const
|
||||||
|
{
|
||||||
|
if (index.isValid() && index.data(role).isValid())
|
||||||
|
{
|
||||||
|
int value = index.data(role).toInt();
|
||||||
|
|
||||||
|
int size = static_cast<int>(mValues.size());
|
||||||
|
for (int i = 0; i < size; ++i)
|
||||||
|
{
|
||||||
|
if (value == mValues.at(i).first)
|
||||||
|
{
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
void CSVWorld::EnumDelegate::setModelDataImp (QWidget *editor, QAbstractItemModel *model,
|
void CSVWorld::EnumDelegate::setModelDataImp (QWidget *editor, QAbstractItemModel *model,
|
||||||
const QModelIndex& index) const
|
const QModelIndex& index) const
|
||||||
{
|
{
|
||||||
|
@ -67,54 +85,59 @@ QWidget *CSVWorld::EnumDelegate::createEditor(QWidget *parent, const QStyleOptio
|
||||||
|
|
||||||
void CSVWorld::EnumDelegate::setEditorData (QWidget *editor, const QModelIndex& index, bool tryDisplay) const
|
void CSVWorld::EnumDelegate::setEditorData (QWidget *editor, const QModelIndex& index, bool tryDisplay) const
|
||||||
{
|
{
|
||||||
if (QComboBox *comboBox = dynamic_cast<QComboBox *> (editor))
|
if (QComboBox *comboBox = dynamic_cast<QComboBox *>(editor))
|
||||||
{
|
{
|
||||||
QVariant data = index.data (Qt::EditRole);
|
int role = Qt::EditRole;
|
||||||
|
if (tryDisplay && !index.data(role).isValid())
|
||||||
if (tryDisplay && !data.isValid())
|
|
||||||
{
|
{
|
||||||
data = index.data (Qt::DisplayRole);
|
role = Qt::DisplayRole;
|
||||||
if (!data.isValid())
|
if (!index.data(role).isValid())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int value = data.toInt();
|
int valueIndex = getValueIndex(index, role);
|
||||||
|
if (valueIndex != -1)
|
||||||
std::size_t size = mValues.size();
|
{
|
||||||
|
comboBox->setCurrentIndex(valueIndex);
|
||||||
for (std::size_t i=0; i<size; ++i)
|
}
|
||||||
if (mValues[i].first==value)
|
|
||||||
{
|
|
||||||
comboBox->setCurrentIndex (i);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSVWorld::EnumDelegate::paint (QPainter *painter, const QStyleOptionViewItem& option,
|
void CSVWorld::EnumDelegate::paint (QPainter *painter, const QStyleOptionViewItem& option,
|
||||||
const QModelIndex& index) const
|
const QModelIndex& index) const
|
||||||
{
|
{
|
||||||
if (index.data().isValid())
|
int valueIndex = getValueIndex(index);
|
||||||
|
if (valueIndex != -1)
|
||||||
{
|
{
|
||||||
QStyleOptionViewItemV4 option2 (option);
|
QStyleOptionViewItemV4 itemOption(option);
|
||||||
|
itemOption.text = mValues.at(valueIndex).second;
|
||||||
int value = index.data().toInt();
|
QApplication::style()->drawControl(QStyle::CE_ItemViewItem, &itemOption, painter);
|
||||||
|
|
||||||
for (std::vector<std::pair<int, QString> >::const_iterator iter (mValues.begin());
|
|
||||||
iter!=mValues.end(); ++iter)
|
|
||||||
if (iter->first==value)
|
|
||||||
{
|
|
||||||
option2.text = iter->second;
|
|
||||||
|
|
||||||
QApplication::style()->drawControl (QStyle::CE_ItemViewItem, &option2, painter);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QSize CSVWorld::EnumDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
|
||||||
|
{
|
||||||
|
int valueIndex = getValueIndex(index);
|
||||||
|
if (valueIndex != -1)
|
||||||
|
{
|
||||||
|
// Calculate the size hint as for a combobox.
|
||||||
|
// So, the whole text is visible (isn't elided) when the editor is created
|
||||||
|
QStyleOptionComboBox itemOption;
|
||||||
|
itemOption.fontMetrics = option.fontMetrics;
|
||||||
|
itemOption.palette = option.palette;
|
||||||
|
itemOption.rect = option.rect;
|
||||||
|
itemOption.state = option.state;
|
||||||
|
|
||||||
|
const QString &valueText = mValues.at(valueIndex).second;
|
||||||
|
QSize valueSize = QSize(itemOption.fontMetrics.width(valueText), itemOption.fontMetrics.height());
|
||||||
|
|
||||||
|
itemOption.currentText = valueText;
|
||||||
|
return QApplication::style()->sizeFromContents(QStyle::CT_ComboBox, &itemOption, valueSize);
|
||||||
|
}
|
||||||
|
return option.rect.size();
|
||||||
|
}
|
||||||
|
|
||||||
CSVWorld::EnumDelegateFactory::EnumDelegateFactory() {}
|
CSVWorld::EnumDelegateFactory::EnumDelegateFactory() {}
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,8 @@ namespace CSVWorld
|
||||||
|
|
||||||
std::vector<std::pair<int, QString> > mValues;
|
std::vector<std::pair<int, QString> > mValues;
|
||||||
|
|
||||||
|
int getValueIndex(const QModelIndex &index, int role = Qt::DisplayRole) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
virtual void setModelDataImp (QWidget *editor, QAbstractItemModel *model,
|
virtual void setModelDataImp (QWidget *editor, QAbstractItemModel *model,
|
||||||
|
@ -46,6 +48,8 @@ namespace CSVWorld
|
||||||
virtual void paint (QPainter *painter, const QStyleOptionViewItem& option,
|
virtual void paint (QPainter *painter, const QStyleOptionViewItem& option,
|
||||||
const QModelIndex& index) const;
|
const QModelIndex& index) const;
|
||||||
|
|
||||||
|
virtual QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class EnumDelegateFactory : public CommandDelegateFactory
|
class EnumDelegateFactory : public CommandDelegateFactory
|
||||||
|
|
|
@ -68,10 +68,10 @@ void CSVWorld::addSubViewFactories (CSVDoc::SubViewFactoryManager& manager)
|
||||||
new CSVDoc::SubViewFactoryWithCreator<TableSubView, JournalCreatorFactory>);
|
new CSVDoc::SubViewFactoryWithCreator<TableSubView, JournalCreatorFactory>);
|
||||||
|
|
||||||
manager.add (CSMWorld::UniversalId::Type_TopicInfos,
|
manager.add (CSMWorld::UniversalId::Type_TopicInfos,
|
||||||
new CSVDoc::SubViewFactoryWithCreator<TableSubView, CreatorFactory<InfoCreator> > (false));
|
new CSVDoc::SubViewFactoryWithCreator<TableSubView, CreatorFactory<InfoCreator> >);
|
||||||
|
|
||||||
manager.add (CSMWorld::UniversalId::Type_JournalInfos,
|
manager.add (CSMWorld::UniversalId::Type_JournalInfos,
|
||||||
new CSVDoc::SubViewFactoryWithCreator<TableSubView, CreatorFactory<InfoCreator> > (false));
|
new CSVDoc::SubViewFactoryWithCreator<TableSubView, CreatorFactory<InfoCreator> >);
|
||||||
|
|
||||||
// Subviews for resources tables
|
// Subviews for resources tables
|
||||||
manager.add (CSMWorld::UniversalId::Type_Meshes,
|
manager.add (CSMWorld::UniversalId::Type_Meshes,
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
|
|
||||||
#include "../../model/world/data.hpp"
|
#include "../../model/world/data.hpp"
|
||||||
#include "../../model/world/commands.hpp"
|
#include "../../model/world/commands.hpp"
|
||||||
|
#include "../../model/world/infotableproxymodel.hpp"
|
||||||
#include "../../model/world/idtableproxymodel.hpp"
|
#include "../../model/world/idtableproxymodel.hpp"
|
||||||
#include "../../model/world/idtablebase.hpp"
|
#include "../../model/world/idtablebase.hpp"
|
||||||
#include "../../model/world/idtable.hpp"
|
#include "../../model/world/idtable.hpp"
|
||||||
|
@ -276,7 +277,16 @@ CSVWorld::Table::Table (const CSMWorld::UniversalId& id,
|
||||||
|
|
||||||
mModel = &dynamic_cast<CSMWorld::IdTableBase&> (*mDocument.getData().getTableModel (id));
|
mModel = &dynamic_cast<CSMWorld::IdTableBase&> (*mDocument.getData().getTableModel (id));
|
||||||
|
|
||||||
mProxyModel = new CSMWorld::IdTableProxyModel (this);
|
bool isInfoTable = id.getType() == CSMWorld::UniversalId::Type_TopicInfos ||
|
||||||
|
id.getType() == CSMWorld::UniversalId::Type_JournalInfos;
|
||||||
|
if (isInfoTable)
|
||||||
|
{
|
||||||
|
mProxyModel = new CSMWorld::InfoTableProxyModel(id.getType(), this);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mProxyModel = new CSMWorld::IdTableProxyModel (this);
|
||||||
|
}
|
||||||
mProxyModel->setSourceModel (mModel);
|
mProxyModel->setSourceModel (mModel);
|
||||||
|
|
||||||
mDispatcher = new CSMWorld::CommandDispatcher (document, id, this);
|
mDispatcher = new CSMWorld::CommandDispatcher (document, id, this);
|
||||||
|
|
|
@ -4,8 +4,6 @@
|
||||||
#include "pathfinding.hpp"
|
#include "pathfinding.hpp"
|
||||||
#include <components/esm/defs.hpp>
|
#include <components/esm/defs.hpp>
|
||||||
|
|
||||||
#include "../mwworld/cellstore.hpp"
|
|
||||||
|
|
||||||
#include "obstacle.hpp"
|
#include "obstacle.hpp"
|
||||||
#include "aistate.hpp"
|
#include "aistate.hpp"
|
||||||
|
|
||||||
|
@ -16,6 +14,7 @@ namespace MWWorld
|
||||||
|
|
||||||
namespace ESM
|
namespace ESM
|
||||||
{
|
{
|
||||||
|
struct Cell;
|
||||||
namespace AiSequence
|
namespace AiSequence
|
||||||
{
|
{
|
||||||
struct AiSequence;
|
struct AiSequence;
|
||||||
|
|
|
@ -114,8 +114,7 @@ namespace MWMechanics
|
||||||
}
|
}
|
||||||
|
|
||||||
PathFinder::PathFinder()
|
PathFinder::PathFinder()
|
||||||
: mIsPathConstructed(false),
|
: mPathgrid(NULL),
|
||||||
mPathgrid(NULL),
|
|
||||||
mCell(NULL)
|
mCell(NULL)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -124,7 +123,6 @@ namespace MWMechanics
|
||||||
{
|
{
|
||||||
if(!mPath.empty())
|
if(!mPath.empty())
|
||||||
mPath.clear();
|
mPath.clear();
|
||||||
mIsPathConstructed = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -180,7 +178,6 @@ namespace MWMechanics
|
||||||
static_cast<float>(endPoint.mX), static_cast<float>(endPoint.mY), static_cast<float>(endPoint.mZ)))
|
static_cast<float>(endPoint.mX), static_cast<float>(endPoint.mY), static_cast<float>(endPoint.mZ)))
|
||||||
{
|
{
|
||||||
mPath.push_back(endPoint);
|
mPath.push_back(endPoint);
|
||||||
mIsPathConstructed = true;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -197,7 +194,6 @@ namespace MWMechanics
|
||||||
if(!mPathgrid || mPathgrid->mPoints.empty())
|
if(!mPathgrid || mPathgrid->mPoints.empty())
|
||||||
{
|
{
|
||||||
mPath.push_back(endPoint);
|
mPath.push_back(endPoint);
|
||||||
mIsPathConstructed = true;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -235,7 +231,6 @@ namespace MWMechanics
|
||||||
if(startNode == endNode.first)
|
if(startNode == endNode.first)
|
||||||
{
|
{
|
||||||
mPath.push_back(endPoint);
|
mPath.push_back(endPoint);
|
||||||
mIsPathConstructed = true;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -243,7 +238,6 @@ namespace MWMechanics
|
||||||
|
|
||||||
if(!mPath.empty())
|
if(!mPath.empty())
|
||||||
{
|
{
|
||||||
mIsPathConstructed = true;
|
|
||||||
// Add the destination (which may be different to the closest
|
// Add the destination (which may be different to the closest
|
||||||
// pathgrid point). However only add if endNode was the closest
|
// pathgrid point). However only add if endNode was the closest
|
||||||
// point to endPoint.
|
// point to endPoint.
|
||||||
|
@ -256,14 +250,8 @@ namespace MWMechanics
|
||||||
if(endNode.second)
|
if(endNode.second)
|
||||||
mPath.push_back(endPoint);
|
mPath.push_back(endPoint);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
mIsPathConstructed = false;
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
mIsPathConstructed = false;
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
mIsPathConstructed = false;
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -271,7 +259,7 @@ namespace MWMechanics
|
||||||
float PathFinder::getZAngleToNext(float x, float y) const
|
float PathFinder::getZAngleToNext(float x, float y) const
|
||||||
{
|
{
|
||||||
// This should never happen (programmers should have an if statement checking
|
// This should never happen (programmers should have an if statement checking
|
||||||
// mIsPathConstructed that prevents this call if otherwise).
|
// isPathConstructed that prevents this call if otherwise).
|
||||||
if(mPath.empty())
|
if(mPath.empty())
|
||||||
return 0.;
|
return 0.;
|
||||||
|
|
||||||
|
@ -293,7 +281,6 @@ namespace MWMechanics
|
||||||
mPath.pop_front();
|
mPath.pop_front();
|
||||||
if(mPath.empty())
|
if(mPath.empty())
|
||||||
{
|
{
|
||||||
mIsPathConstructed = false;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,7 @@ namespace MWMechanics
|
||||||
|
|
||||||
bool isPathConstructed() const
|
bool isPathConstructed() const
|
||||||
{
|
{
|
||||||
return mIsPathConstructed;
|
return !mPath.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
int getPathSize() const
|
int getPathSize() const
|
||||||
|
@ -96,8 +96,6 @@ namespace MWMechanics
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
bool mIsPathConstructed;
|
|
||||||
|
|
||||||
std::list<ESM::Pathgrid::Point> mPath;
|
std::list<ESM::Pathgrid::Point> mPath;
|
||||||
|
|
||||||
const ESM::Pathgrid *mPathgrid;
|
const ESM::Pathgrid *mPathgrid;
|
||||||
|
|
Loading…
Reference in a new issue