1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-23 22:37:55 +02:00

Fixes following review

Add missing mod to CMap in checkRequiredMods
This commit is contained in:
MichalZr6
2025-05-13 12:51:31 +02:00
parent ef95f34bdb
commit e1b79326de
6 changed files with 40 additions and 52 deletions

View File

@@ -22,8 +22,6 @@
PlayerSelectionDialog::PlayerSelectionDialog(MainWindow * mainWindow) PlayerSelectionDialog::PlayerSelectionDialog(MainWindow * mainWindow)
: QDialog(mainWindow), selectedPlayer(PlayerColor::NEUTRAL) : QDialog(mainWindow), selectedPlayer(PlayerColor::NEUTRAL)
{ {
assert(mainWindow);
setupDialogComponents(); setupDialogComponents();
int maxPlayers = 0; int maxPlayers = 0;
@@ -88,22 +86,9 @@ void PlayerSelectionDialog::addRadioButton(QAction * action, PlayerColor player)
selectedPlayer = player; selectedPlayer = player;
} }
radioButton->setToolTip(tr("Shortcut: %1").arg(action->shortcut().toString()));
buttonGroup->addButton(radioButton, player.getNum()); buttonGroup->addButton(radioButton, player.getNum());
radioButtonsLayout.addWidget(radioButton);
auto * shortcutLabel = new QLabel(action->shortcut().toString(), this);
QFont shortcutFont = font;
shortcutFont.setPointSize(9);
shortcutFont.setItalic(true);
shortcutLabel->setFont(shortcutFont);
shortcutLabel->setAlignment(Qt::AlignCenter | Qt::AlignVCenter);
shortcutLabel->setContentsMargins(0, 0, 6, 0); // Italic text was trimmed at the end
auto * rowWidget = new QWidget(this);
auto * rowLayout = new QGridLayout(rowWidget);
rowLayout->setContentsMargins(0, 0, 0, 0);
rowLayout->addWidget(radioButton, 0, 0, Qt::AlignCenter | Qt::AlignVCenter);
rowLayout->addWidget(shortcutLabel, 0, 1, Qt::AlignCenter | Qt::AlignVCenter);
radioButtonsLayout.addWidget(rowWidget);
connect(radioButton, &QRadioButton::clicked, this, [this, player]() connect(radioButton, &QRadioButton::clicked, this, [this, player]()
{ {

View File

@@ -26,13 +26,13 @@ class PlayerSelectionDialog : public QDialog
Q_OBJECT Q_OBJECT
public: public:
explicit PlayerSelectionDialog(MainWindow * mainWindow = nullptr); explicit PlayerSelectionDialog(MainWindow * mainWindow);
PlayerColor getSelectedPlayer() const; PlayerColor getSelectedPlayer() const;
private: private:
const int dialogWidth = 320; const int dialogWidth = 320;
QButtonGroup * buttonGroup = nullptr; QButtonGroup * buttonGroup;
PlayerColor selectedPlayer; PlayerColor selectedPlayer;
QFont font; QFont font;

View File

@@ -601,20 +601,15 @@ bool MapController::checkRequiredMods(const CGObjectInstance * obj, QString & er
{ {
if(!_map->mods.count(mod.first)) if(!_map->mods.count(mod.first))
{ {
QString submod;
if(!mod.second.parent.empty())
submod = tr(" (submod of %1)").arg(QString::fromStdString(mod.second.parent));
auto reply = QMessageBox::question(main, auto reply = QMessageBox::question(main,
tr("Missing Required Mod"), tr("Missing Required Mod"), modMissingMessage(mod.second) + tr("\n\nDo you want to do that now ?"),
tr("This object is from the mod '%1'%2.\n\n"
"The mod is currently not in the map's required modifications list.\n\n"
"Do you want to add this mod to the required modifications?\n")
.arg(QString::fromStdString(LIBRARY->modh->getModInfo(mod.first).getVerificationInfo().name), submod),
QMessageBox::Yes | QMessageBox::No); QMessageBox::Yes | QMessageBox::No);
if(reply == QMessageBox::Yes) if(reply == QMessageBox::Yes)
{
_map->mods[mod.first] = LIBRARY->modh->getModInfo(mod.first).getVerificationInfo();
Q_EMIT requestModsUpdate(modsInfo, true); // signal for MapSettings Q_EMIT requestModsUpdate(modsInfo, true); // signal for MapSettings
}
else else
{ {
error = tr("This object's mod is mandatory for map to remain valid."); error = tr("This object's mod is mandatory for map to remain valid.");
@@ -625,6 +620,19 @@ bool MapController::checkRequiredMods(const CGObjectInstance * obj, QString & er
return true; return true;
} }
QString MapController::modMissingMessage(const ModVerificationInfo & info)
{
QString modName = QString::fromStdString(info.name);
QString submod;
if(!info.parent.empty())
submod = QObject::tr(" (submod of %1)").arg(QString::fromStdString(info.parent));
return QObject::tr("The mod '%1'%2, is required by an object on the map.\n"
"Add it to the map's required mods in Map->General settings.",
"should be consistent with Map->General menu entry translation")
.arg(modName, submod);
}
void MapController::undo() void MapController::undo()
{ {
_map->getEditManager()->getUndoManager().undo(); _map->getEditManager()->getUndoManager().undo();

View File

@@ -79,6 +79,10 @@ public:
static ModCompatibilityInfo modAssessmentAll(); static ModCompatibilityInfo modAssessmentAll();
static ModCompatibilityInfo modAssessmentMap(const CMap & map); static ModCompatibilityInfo modAssessmentMap(const CMap & map);
/// Returns formatted message string describing a missing mod requirement for the map.
/// Used in both warnings and confirmations related to required mod dependencies.
static QString modMissingMessage(const ModVerificationInfo & info);
void undo(); void undo();
void redo(); void redo();

View File

@@ -171,16 +171,7 @@ std::set<Validator::Issue> Validator::validate(const CMap * map)
for(auto & mod : MapController::modAssessmentMap(*map)) for(auto & mod : MapController::modAssessmentMap(*map))
{ {
if(!map->mods.count(mod.first)) if(!map->mods.count(mod.first))
{ issues.insert({ MapController::modMissingMessage(mod.second), true });
QString submod;
if(!mod.second.parent.empty())
submod = tr(" (submod of %1").arg(QString::fromStdString(mod.second.parent));
issues.insert({
tr("Map contains object(s) from mod '%1'%2, but the mod is missing from the map's required mods list."
" Add it to the map's required mods in Map->General settings.", "should be consistent with Map->General menu entry translation")
.arg(QString::fromStdString(LIBRARY->modh->getModInfo(mod.first).getVerificationInfo().name), submod), true });
}
} }
} }
catch(const std::exception & e) catch(const std::exception & e)
@@ -211,7 +202,7 @@ void Validator::showValidationResults(const CMap * map)
if(ui->listWidget->count() == 0) if(ui->listWidget->count() == 0)
{ {
QPixmap greenTick = QPixmap(":/icons/mod-enabled.png"); QPixmap greenTick(":/icons/mod-enabled.png");
QString validMessage = tr("The map is valid and has no issues."); QString validMessage = tr("The map is valid and has no issues.");
auto * item = new QListWidgetItem(QIcon(greenTick), validMessage, ui->listWidget); auto * item = new QListWidgetItem(QIcon(greenTick), validMessage, ui->listWidget);
ui->listWidget->addItem(item); ui->listWidget->addItem(item);

View File

@@ -47,32 +47,32 @@ public:
private: private:
Ui::Validator *ui; Ui::Validator *ui;
QRect screenGeometry; QRect screenGeometry;
void showValidationResults(const CMap * map); void showValidationResults(const CMap * map);
void adjustWindowSize(); void adjustWindowSize();
}; };
class ValidatorItemDelegate : public QStyledItemDelegate class ValidatorItemDelegate : public QStyledItemDelegate
{ {
public: public:
explicit ValidatorItemDelegate(QObject * parent = nullptr) : QStyledItemDelegate(parent) explicit ValidatorItemDelegate(QObject * parent = nullptr) : QStyledItemDelegate(parent)
{ {
screenGeometry = QApplication::primaryScreen()->availableGeometry(); screenGeometry = QApplication::primaryScreen()->availableGeometry();
} }
int itemPaddingBottom = 14; int itemPaddingBottom = 14;
int iconPadding = 4; int iconPadding = 4;
int textOffsetForIcon = 30; int textOffsetForIcon = 30;
int textPaddingRight = 10; int textPaddingRight = 10;
int minItemWidth = 350; int minItemWidth = 350;
int screenMargin = 350; // some reserved space from screenWidth; used if text.width > screenWidth - screenMargin int screenMargin = 350; // some reserved space from screenWidth; used if text.width > screenWidth - screenMargin
const int offsetForIcon = iconPadding + textOffsetForIcon; const int offsetForIcon = iconPadding + textOffsetForIcon;
void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const override; void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const override;
QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const override; QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const override;
private: private:
QRect screenGeometry; QRect screenGeometry;
}; };