mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-22 22:13:35 +02:00
145 lines
4.3 KiB
C++
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);
|
|
}
|
|
}
|