From 2cbf7c25e32d4df7f092f0f9d5c8c5d9d68f2ace Mon Sep 17 00:00:00 2001 From: Leonardo Zide Date: Sat, 26 Jul 2025 12:49:37 -0700 Subject: [PATCH] Added default minifig as a template. Fixes #539. --- common/lc_minifigdialog.cpp | 50 ++++++++++++++++--------- common/lc_minifigdialog.h | 1 + common/minifig.cpp | 73 +++++++++++++++++++++++++------------ common/minifig.h | 5 ++- 4 files changed, 85 insertions(+), 44 deletions(-) diff --git a/common/lc_minifigdialog.cpp b/common/lc_minifigdialog.cpp index b09ab2b5..d7b04d6f 100644 --- a/common/lc_minifigdialog.cpp +++ b/common/lc_minifigdialog.cpp @@ -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(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); diff --git a/common/lc_minifigdialog.h b/common/lc_minifigdialog.h index bfe3ef5a..50d484a0 100644 --- a/common/lc_minifigdialog.h +++ b/common/lc_minifigdialog.h @@ -32,6 +32,7 @@ protected slots: protected: void UpdateTemplateCombo(); + void SetCurrentTemplateModified(); Ui::lcMinifigDialog* ui; diff --git a/common/minifig.cpp b/common/minifig.cpp index 7c9c4c0d..1dc80d5f 100644 --- a/common/minifig.cpp +++ b/common/minifig.cpp @@ -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::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; diff --git a/common/minifig.h b/common/minifig.h index ce92bf58..0650364b 100644 --- a/common/minifig.h +++ b/common/minifig.h @@ -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);