1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-02-03 13:01:33 +02:00

map editor: auto update checkboxes of base/upgrade buildings in TownBulidingsWidget

This commit is contained in:
godric3 2024-06-08 16:33:55 +02:00
parent 6ac3752325
commit 4d1c8bb1b7
2 changed files with 43 additions and 5 deletions

View File

@ -77,7 +77,7 @@ TownBuildingsWidget::TownBuildingsWidget(CGTownInstance & t, QWidget *parent) :
ui->treeView->setModel(&model);
//ui->treeView->setColumnCount(3);
model.setHorizontalHeaderLabels(QStringList() << QStringLiteral("Type") << QStringLiteral("Enabled") << QStringLiteral("Built"));
connect(&model, &QStandardItemModel::itemChanged, this, &TownBuildingsWidget::onItemChanged);
//setAttribute(Qt::WA_DeleteOnClose);
}
@ -196,12 +196,12 @@ std::set<BuildingID> TownBuildingsWidget::getBuildingsFromModel(int modelColumn,
std::set<BuildingID> TownBuildingsWidget::getForbiddenBuildings()
{
return getBuildingsFromModel(1, Qt::Unchecked);
return getBuildingsFromModel(Column::ENABLED, Qt::Unchecked);
}
std::set<BuildingID> TownBuildingsWidget::getBuiltBuildings()
{
return getBuildingsFromModel(2, Qt::Checked);
return getBuildingsFromModel(Column::BUILT, Qt::Checked);
}
void TownBuildingsWidget::on_treeView_expanded(const QModelIndex &index)
@ -215,6 +215,37 @@ void TownBuildingsWidget::on_treeView_collapsed(const QModelIndex &index)
}
void TownBuildingsWidget::setRowColumnCheckState(QStandardItem * item, Column column, Qt::CheckState checkState) {
auto sibling = item->model()->sibling(item->row(), column, item->index());
model.itemFromIndex(sibling)->setCheckState(checkState);
}
void TownBuildingsWidget::onItemChanged(QStandardItem * item) {
disconnect(&model, &QStandardItemModel::itemChanged, this, &TownBuildingsWidget::onItemChanged);
auto rowFirstColumnIndex = item->model()->sibling(item->row(), Column::TYPE, item->index());
QStandardItem * nextRow = model.itemFromIndex(rowFirstColumnIndex);
if (item->checkState() == Qt::Checked) {
while (nextRow) {
setRowColumnCheckState(nextRow, Column(item->column()), Qt::Checked);
if (item->column() == Column::BUILT) {
setRowColumnCheckState(nextRow, Column::ENABLED, Qt::Checked);
}
nextRow = nextRow->parent();
}
}
else if (item->checkState() == Qt::Unchecked) {
while (nextRow) {
setRowColumnCheckState(nextRow, Column(item->column()), Qt::Unchecked);
if (item->column() == Column::ENABLED) {
setRowColumnCheckState(nextRow, Column::BUILT, Qt::Unchecked);
}
nextRow = nextRow->child(0, Column::TYPE);
}
}
connect(&model, &QStandardItemModel::itemChanged, this, &TownBuildingsWidget::onItemChanged);
}
TownBuildingsDelegate::TownBuildingsDelegate(CGTownInstance & t): town(t), QStyledItemDelegate()
{
}

View File

@ -26,9 +26,13 @@ class TownBuildingsWidget : public QDialog
QStandardItem * addBuilding(const CTown & ctown, int bId, std::set<si32> & remaining);
public:
enum Column
{
TYPE, ENABLED, BUILT
};
explicit TownBuildingsWidget(CGTownInstance &, QWidget *parent = nullptr);
~TownBuildingsWidget();
void addBuildings(const CTown & ctown);
std::set<BuildingID> getForbiddenBuildings();
std::set<BuildingID> getBuiltBuildings();
@ -38,9 +42,12 @@ private slots:
void on_treeView_collapsed(const QModelIndex &index);
void onItemChanged(QStandardItem * item);
private:
std::set<BuildingID> getBuildingsFromModel(int modelColumn, Qt::CheckState checkState);
void setRowColumnCheckState(QStandardItem * item, Column column, Qt::CheckState checkState);
Ui::TownBuildingsWidget *ui;
CGTownInstance & town;
mutable QStandardItemModel model;