Added default minifig as a template. Fixes #539.

This commit is contained in:
Leonardo Zide
2025-07-26 12:49:37 -07:00
parent 19464de8fd
commit 2cbf7c25e3
4 changed files with 85 additions and 44 deletions
+32 -18
View File
@@ -112,7 +112,9 @@ lcMinifigDialog::lcMinifigDialog(QWidget* Parent)
PreviewLayout->addWidget(ViewWidget);
mView->MakeCurrent();
mMinifigWizard->LoadDefault();
mCurrentTemplateName = MinifigWizard::GetDefaultTemplateName();
mMinifigWizard->LoadTemplate(mCurrentTemplateName);
for (int ItemIndex = 0; ItemIndex < LC_MFW_NUMITEMS; ItemIndex++)
{
@@ -154,6 +156,9 @@ void lcMinifigDialog::UpdateTemplateCombo()
for (const auto& [Name, Template] : mMinifigWizard->GetTemplates())
{
if (Name == MinifigWizard::GetDefaultTemplateName())
continue;
if (mCurrentTemplateModified && Name == mCurrentTemplateName)
{
CurrentName += " *";
@@ -163,6 +168,10 @@ void lcMinifigDialog::UpdateTemplateCombo()
ui->TemplateComboBox->addItem(Name);
}
if (ui->TemplateComboBox->count())
ui->TemplateComboBox->insertSeparator(ui->TemplateComboBox->count());
ui->TemplateComboBox->addItem(MinifigWizard::GetDefaultTemplateName());
ui->TemplateComboBox->setCurrentText(CurrentName);
}
@@ -183,13 +192,13 @@ void lcMinifigDialog::on_TemplateComboBox_currentIndexChanged(const QString& Tem
mView->MakeCurrent();
mMinifigWizard->LoadTemplate(TemplateName);
for (int PartIdx = 0; PartIdx < LC_MFW_NUMITEMS; PartIdx++)
{
if (!Template.Parts[PartIdx].isEmpty())
{
PieceInfo* Info = lcGetPiecesLibrary()->FindPiece(Template.Parts[PartIdx].toLatin1(), nullptr, false, false);
mMinifigWizard->SetPieceInfo(PartIdx, Info);
PieceInfo* Info = mMinifigWizard->mMinifig.Parts[PartIdx];
if (Info)
{
@@ -205,14 +214,11 @@ void lcMinifigDialog::on_TemplateComboBox_currentIndexChanged(const QString& Tem
}
else
{
mMinifigWizard->SetPieceInfo(PartIdx, nullptr);
mPieceButtons[PartIdx]->setText(tr("None"));
}
QSignalBlocker ColorBlocker(mColorPickers[PartIdx]);
mMinifigWizard->SetColorIndex(PartIdx, lcGetColorIndex(Template.ColorCodes[PartIdx]));
mColorPickers[PartIdx]->SetCurrentColorCode(Template.ColorCodes[PartIdx]);
lcDoubleSpinBox* AngleSpinBox = mSpinBoxes[PartIdx];
@@ -221,13 +227,10 @@ void lcMinifigDialog::on_TemplateComboBox_currentIndexChanged(const QString& Tem
{
QSignalBlocker AngleBlocker(AngleSpinBox);
mMinifigWizard->SetAngle(PartIdx, Template.Angles[PartIdx]);
AngleSpinBox->SetValue(Template.Angles[PartIdx]);
}
}
mMinifigWizard->Calculate();
mView->Redraw();
}
@@ -246,7 +249,13 @@ void lcMinifigDialog::on_TemplateSaveButton_clicked()
return;
}
if (TemplateName == CurrentName)
if (TemplateName == MinifigWizard::GetDefaultTemplateName())
{
QMessageBox::information(this, tr("Save Template"), tr("Cannot overwrite the default template."));
return;
}
if (mMinifigWizard->GetTemplates().count(TemplateName))
{
QString Question = tr("Are you sure you want to overwrite the template '%1'?").arg(TemplateName);
if (QMessageBox::question(this, tr("Overwrite Template"), Question, QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes)
@@ -273,7 +282,7 @@ void lcMinifigDialog::on_TemplateSaveButton_clicked()
void lcMinifigDialog::on_TemplateDeleteButton_clicked()
{
if (mCurrentTemplateName.isEmpty())
if (mCurrentTemplateName.isEmpty() || mCurrentTemplateName == MinifigWizard::GetDefaultTemplateName())
return;
QString Template = mCurrentTemplateName;
@@ -330,6 +339,14 @@ void lcMinifigDialog::on_TemplateExportButton_clicked()
File.write(Templates);
}
void lcMinifigDialog::SetCurrentTemplateModified()
{
if (mCurrentTemplateName == MinifigWizard::GetDefaultTemplateName())
mCurrentTemplateName.clear();
else
mCurrentTemplateModified = true;
}
void lcMinifigDialog::PieceButtonClicked()
{
QToolButton* PieceButton = qobject_cast<QToolButton*>(sender());
@@ -364,8 +381,7 @@ void lcMinifigDialog::PieceButtonClicked()
PieceInfo* NewPiece = Result.value();
mCurrentTemplateModified = true;
SetCurrentTemplateModified();
UpdateTemplateCombo();
mView->MakeCurrent();
@@ -392,8 +408,7 @@ void lcMinifigDialog::ColorChanged(int Index)
if (Search == mColorPickers.end())
return;
mCurrentTemplateModified = true;
SetCurrentTemplateModified();
UpdateTemplateCombo();
mMinifigWizard->SetColorIndex(std::distance(mColorPickers.begin(), Search), Index);
@@ -407,8 +422,7 @@ void lcMinifigDialog::AngleChanged(double Value)
if (Search == mSpinBoxes.end())
return;
mCurrentTemplateModified = true;
SetCurrentTemplateModified();
UpdateTemplateCombo();
mMinifigWizard->SetAngle(std::distance(mSpinBoxes.begin(), Search), Value);
+1
View File
@@ -32,6 +32,7 @@ protected slots:
protected:
void UpdateTemplateCombo();
void SetCurrentTemplateModified();
Ui::lcMinifigDialog* ui;
+49 -24
View File
@@ -34,6 +34,19 @@ MinifigWizard::MinifigWizard()
{
LoadSettings();
LoadTemplates();
lcMinifigTemplate& Template = mTemplates[GetDefaultTemplateName()];
const int ColorCodes[LC_MFW_NUMITEMS] = { 4, 7, 14, 7, 1, 0, 7, 4, 4, 14, 14, 7, 7, 0, 0, 7, 7 };
const char* const Pieces[LC_MFW_NUMITEMS] = { "3624.dat", "", "3626bp01.dat", "", "973.dat", "3815.dat", "", "3819.dat", "3818.dat", "3820.dat", "3820.dat", "", "", "3817.dat", "3816.dat", "", "" };
for (int PartIndex = 0; PartIndex < LC_MFW_NUMITEMS; PartIndex++)
{
Template.Parts[PartIndex] = Pieces[PartIndex];
Template.ColorCodes[PartIndex] = ColorCodes[PartIndex];
Template.Angles[PartIndex] = 0.0f;
}
memset(&mMinifig, 0, sizeof(mMinifig));
}
MinifigWizard::~MinifigWizard()
@@ -47,6 +60,11 @@ MinifigWizard::~MinifigWizard()
SaveTemplates();
}
QString MinifigWizard::GetDefaultTemplateName()
{
return QCoreApplication::translate("MinifigWizard", "Default");
}
void MinifigWizard::LoadSettings()
{
QString CustomSettingsPath = lcGetProfileString(LC_PROFILE_MINIFIG_SETTINGS);
@@ -68,30 +86,6 @@ void MinifigWizard::LoadSettings()
ParseSettings(MinifigFile);
}
void MinifigWizard::LoadDefault()
{
LC_ARRAY_SIZE_CHECK(MinifigWizard::mSectionNames, LC_MFW_NUMITEMS);
const int ColorCodes[LC_MFW_NUMITEMS] = { 4, 7, 14, 7, 1, 0, 7, 4, 4, 14, 14, 7, 7, 0, 0, 7, 7 };
const char* const Pieces[LC_MFW_NUMITEMS] = { "3624.dat", "", "3626bp01.dat", "", "973.dat", "3815.dat", "", "3819.dat", "3818.dat", "3820.dat", "3820.dat", "", "", "3817.dat", "3816.dat", "", "" };
lcPiecesLibrary* Library = lcGetPiecesLibrary();
for (int i = 0; i < LC_MFW_NUMITEMS; i++)
{
mMinifig.ColorIndices[i] = lcGetColorIndex(ColorCodes[i]);
mMinifig.Angles[i] = 0.0f;
mMinifig.Matrices[i] = lcMatrix44Identity();
PieceInfo* Info = Library->FindPiece(Pieces[i], nullptr, false, false);
mMinifig.Parts[i] = Info;
if (Info)
Library->LoadPieceInfo(Info, false, true);
}
Library->WaitForLoadQueue();
Calculate();
}
void MinifigWizard::ParseSettings(lcFile& Settings)
{
for (int SectionIndex = 0; SectionIndex < LC_MFW_NUMITEMS; SectionIndex++)
@@ -191,6 +185,37 @@ void MinifigWizard::ParseSettings(lcFile& Settings)
}
}
void MinifigWizard::LoadTemplate(const QString& TemplateName)
{
const std::map<QString, lcMinifigTemplate>::iterator& TemplateIt = mTemplates.find(TemplateName);
if (TemplateIt == mTemplates.end())
return;
const lcMinifigTemplate& Template = TemplateIt->second;
lcPiecesLibrary* Library = lcGetPiecesLibrary();
for (int PartIndex = 0; PartIndex < LC_MFW_NUMITEMS; PartIndex++)
{
mMinifig.ColorIndices[PartIndex] = lcGetColorIndex(Template.ColorCodes[PartIndex]);
mMinifig.Angles[PartIndex] = Template.Angles[PartIndex];
mMinifig.Matrices[PartIndex] = lcMatrix44Identity();
if (mMinifig.Parts[PartIndex])
Library->ReleasePieceInfo(mMinifig.Parts[PartIndex]);
PieceInfo* Info = Library->FindPiece(Template.Parts[PartIndex].toLatin1(), nullptr, false, false);
mMinifig.Parts[PartIndex] = Info;
if (Info)
Library->LoadPieceInfo(Info, false, true);
}
Library->WaitForLoadQueue();
Calculate();
}
void MinifigWizard::SaveTemplate(const QString& TemplateName, const lcMinifigTemplate& Template)
{
mTemplates[TemplateName] = Template;
+3 -2
View File
@@ -67,13 +67,14 @@ public:
return mTemplates;
}
static QString GetDefaultTemplateName();
void LoadTemplate(const QString& TemplateName);
void SaveTemplate(const QString& TemplateName, const lcMinifigTemplate& Template);
void DeleteTemplate(const QString& TemplateName);
void AddTemplatesJson(const QByteArray& TemplateData);
QByteArray GetTemplatesJson() const;
void LoadDefault();
void Calculate();
int GetSelectionIndex(int Type) const;
void SetPieceInfo(int Type, PieceInfo* Info);