1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-12 10:03:53 +02:00
vcmi/mapeditor/inspector/heroartifactswidget.cpp

145 lines
4.3 KiB
C++

/*
* herosspellwidget.cpp, part of VCMI engine
*
* Authors: listed in file AUTHORS in main folder
*
* License: GNU General Public License v2.0 or later
* Full text of license available in license.txt file, in main folder
*
*/
#include "StdInc.h"
#include "artifactwidget.h"
#include "heroartifactswidget.h"
#include "ui_heroartifactswidget.h"
#include "inspector.h"
#include "mapeditorroles.h"
#include "../../lib/ArtifactUtils.h"
#include "../../lib/constants/StringConstants.h"
HeroArtifactsWidget::HeroArtifactsWidget(CGHeroInstance & h, QWidget * parent) :
QDialog(parent),
ui(new Ui::HeroArtifactsWidget),
hero(h),
fittingSet(CArtifactFittingSet(h))
{
ui->setupUi(this);
}
HeroArtifactsWidget::~HeroArtifactsWidget()
{
delete ui;
}
void HeroArtifactsWidget::on_addButton_clicked()
{
ArtifactWidget artifactWidget{ fittingSet, this };
connect(&artifactWidget, &ArtifactWidget::saveArtifact, this, &HeroArtifactsWidget::onSaveArtifact);
artifactWidget.exec();
}
void HeroArtifactsWidget::on_removeButton_clicked()
{
auto row = ui->artifacts->currentRow();
if (row == -1)
{
return;
}
auto slot = ui->artifacts->item(row, Column::SLOT)->data(MapEditorRoles::ArtifactSlotRole).toInt();
fittingSet.removeArtifact(ArtifactPosition(slot));
ui->artifacts->removeRow(row);
}
void HeroArtifactsWidget::onSaveArtifact(int32_t artifactIndex, ArtifactPosition slot)
{
auto artifact = ArtifactUtils::createArtifact(VLC->arth->getByIndex(artifactIndex)->getId());
fittingSet.putArtifact(slot, artifact);
addArtifactToTable(artifactIndex, slot);
}
void HeroArtifactsWidget::addArtifactToTable(int32_t artifactIndex, ArtifactPosition slot)
{
auto artifact = VLC->arth->getByIndex(artifactIndex);
auto * itemArtifact = new QTableWidgetItem;
itemArtifact->setText(QString::fromStdString(artifact->getNameTranslated()));
itemArtifact->setData(MapEditorRoles::ArtifactIDRole, QVariant::fromValue(artifact->getIndex()));
auto * itemSlot = new QTableWidgetItem;
auto slotText = ArtifactUtils::isSlotBackpack(slot) ? NArtifactPosition::backpack : NArtifactPosition::namesHero[slot.num];
itemSlot->setData(MapEditorRoles::ArtifactSlotRole, QVariant::fromValue(slot.num));
itemSlot->setText(QString::fromStdString(slotText));
ui->artifacts->insertRow(ui->artifacts->rowCount());
ui->artifacts->setItem(ui->artifacts->rowCount() - 1, Column::ARTIFACT, itemArtifact);
ui->artifacts->setItem(ui->artifacts->rowCount() - 1, Column::SLOT, itemSlot);
}
void HeroArtifactsWidget::obtainData()
{
std::vector<const CArtifact *> combinedArtifactsParts;
for (const auto & [artPosition, artSlotInfo] : fittingSet.artifactsWorn)
{
addArtifactToTable(VLC->arth->getById(artSlotInfo.artifact->getTypeId())->getIndex(), artPosition);
}
for (const auto & art : hero.artifactsInBackpack)
{
addArtifactToTable(VLC->arth->getById(art.artifact->getTypeId())->getIndex(), ArtifactPosition::BACKPACK_START);
}
}
void HeroArtifactsWidget::commitChanges()
{
while(!hero.artifactsWorn.empty())
{
hero.removeArtifact(hero.artifactsWorn.begin()->first);
}
while(!hero.artifactsInBackpack.empty())
{
hero.removeArtifact(ArtifactPosition::BACKPACK_START + static_cast<int>(hero.artifactsInBackpack.size()) - 1);
}
for(const auto & [artPosition, artSlotInfo] : fittingSet.artifactsWorn)
{
hero.putArtifact(artPosition, artSlotInfo.artifact);
}
for(const auto & art : fittingSet.artifactsInBackpack)
{
hero.putArtifact(ArtifactPosition::BACKPACK_START + static_cast<int>(hero.artifactsInBackpack.size()), art.artifact);
}
}
HeroArtifactsDelegate::HeroArtifactsDelegate(CGHeroInstance & h) : QStyledItemDelegate(), hero(h)
{
}
QWidget * HeroArtifactsDelegate::createEditor(QWidget * parent, const QStyleOptionViewItem & option, const QModelIndex & index) const
{
return new HeroArtifactsWidget(hero, parent);
}
void HeroArtifactsDelegate::setEditorData(QWidget * editor, const QModelIndex & index) const
{
if (auto * ed = qobject_cast<HeroArtifactsWidget *>(editor))
{
ed->obtainData();
}
else
{
QStyledItemDelegate::setEditorData(editor, index);
}
}
void HeroArtifactsDelegate::setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex & index) const
{
if (auto * ed = qobject_cast<HeroArtifactsWidget *>(editor))
{
ed->commitChanges();
}
else
{
QStyledItemDelegate::setModelData(editor, model, index);
}
}