Blender addon - changes to match conventions

This commit is contained in:
Trevor SANDY 2023-07-07 00:51:51 +02:00
parent c18da546d4
commit c42f4fe778
2 changed files with 127 additions and 185 deletions

View file

@ -328,7 +328,7 @@ bool lcBlenderPreferencesDialog::GetBlenderPreferences(int& Width, int& Height,
void lcBlenderPreferencesDialog::ShowPathsGroup() void lcBlenderPreferencesDialog::ShowPathsGroup()
{ {
QString const Display = mPathsButton->text().startsWith("Hide") ? tr("Show") : tr("Hide"); const QString Display = mPathsButton->text().startsWith("Hide") ? tr("Show") : tr("Hide");
mPathsButton->setText(tr("%1 Paths").arg(Display)); mPathsButton->setText(tr("%1 Paths").arg(Display));
mPathsButton->setToolTip(tr("%1 addon path preferences dialog").arg(Display)); mPathsButton->setToolTip(tr("%1 addon path preferences dialog").arg(Display));
mPreferences->ShowPathsGroup(); mPreferences->ShowPathsGroup();
@ -517,9 +517,7 @@ lcBlenderPreferences::lcBlenderPreferences(int Width, int Height, double Scale,
} }
else else
{ {
QString const TextColour = Preferences.mColorTheme == lcColorTheme::Dark const QString TextColour = Preferences.mColorTheme == lcColorTheme::Dark ? QLatin1String(LC_THEME_DARK_DECORATE_QUOTED_TEXT) : QLatin1String("blue");
? QLatin1String(LC_THEME_DARK_DECORATE_QUOTED_TEXT)
: QLatin1String("blue");
bool BlenderConfigured = !lcGetProfileString(LC_PROFILE_BLENDER_PATH).isEmpty(); bool BlenderConfigured = !lcGetProfileString(LC_PROFILE_BLENDER_PATH).isEmpty();
if (!BlenderConfigured) if (!BlenderConfigured)
@ -718,7 +716,7 @@ void lcBlenderPreferences::InitPathsAndSettings()
{ // QComboBoxes { // QComboBoxes
QComboBox* ComboBox = new QComboBox(mSettingsBox); QComboBox* ComboBox = new QComboBox(mSettingsBox);
ComboBox->setProperty("ControlID",QVariant(LblIdx)); ComboBox->setProperty("ControlID",QVariant(LblIdx));
QString const Value = mBlenderSettings[LblIdx].value; const QString Value = mBlenderSettings[LblIdx].value;
QStringList const DataList = mComboItems[ComboBoxItemsIndex].dataList.split("|"); QStringList const DataList = mComboItems[ComboBoxItemsIndex].dataList.split("|");
QStringList const ItemList = mComboItems[ComboBoxItemsIndex].itemList.split("|"); QStringList const ItemList = mComboItems[ComboBoxItemsIndex].itemList.split("|");
ComboBox->addItems(ItemList); ComboBox->addItems(ItemList);
@ -862,7 +860,7 @@ void lcBlenderPreferences::InitPathsAndSettingsMM()
{ // QComboBoxes { // QComboBoxes
QComboBox* ComboBox = new QComboBox(mSettingsBox); QComboBox* ComboBox = new QComboBox(mSettingsBox);
ComboBox->setProperty("ControlID",QVariant(LblIdx)); ComboBox->setProperty("ControlID",QVariant(LblIdx));
QString const Value = mBlenderSettingsMM[LblIdx].value; const QString Value = mBlenderSettingsMM[LblIdx].value;
QStringList const DataList = mComboItemsMM[ComboBoxItemsIndex].dataList.split("|"); QStringList const DataList = mComboItemsMM[ComboBoxItemsIndex].dataList.split("|");
QStringList const ItemList = mComboItemsMM[ComboBoxItemsIndex].itemList.split("|"); QStringList const ItemList = mComboItemsMM[ComboBoxItemsIndex].itemList.split("|");
ComboBox->addItems(ItemList); ComboBox->addItems(ItemList);
@ -905,7 +903,7 @@ void lcBlenderPreferences::ConfigureBlenderAddon(bool TestBlender, bool AddonUpd
{ {
mProgressBar = nullptr; mProgressBar = nullptr;
QString const BlenderExe = QDir::toNativeSeparators(mPathLineEditList[PATH_BLENDER]->text()); const QString BlenderExe = QDir::toNativeSeparators(mPathLineEditList[PATH_BLENDER]->text());
if (BlenderExe.isEmpty()) if (BlenderExe.isEmpty())
{ {
@ -921,13 +919,15 @@ void lcBlenderPreferences::ConfigureBlenderAddon(bool TestBlender, bool AddonUpd
if (QFileInfo(BlenderExe).isReadable()) if (QFileInfo(BlenderExe).isReadable())
{ {
enum ProcEnc enum ProcEnc
{ PR_OK, PR_FAIL, PR_WAIT, PR_INSTALL, PR_TEST }; {
QString const BlenderDir = QDir::toNativeSeparators(QString("%1/Blender").arg(mDataDir)); PR_OK, PR_FAIL, PR_WAIT, PR_INSTALL, PR_TEST
QString const BlenderConfigDir = QString("%1/setup/addon_setup/config").arg(BlenderDir); };
QString const BlenderAddonDir = QDir::toNativeSeparators(QString("%1/addons").arg(BlenderDir)); const QString BlenderDir = QDir::toNativeSeparators(QString("%1/Blender").arg(mDataDir));
QString const BlenderExeCompare = QDir::toNativeSeparators(lcGetProfileString(LC_PROFILE_BLENDER_PATH)).toLower(); const QString BlenderConfigDir = QString("%1/setup/addon_setup/config").arg(BlenderDir);
QString const BlenderInstallFile = QDir::toNativeSeparators(QString("%1/%2").arg(BlenderDir).arg(LC_BLENDER_ADDON_INSTALL_FILE)); const QString BlenderAddonDir = QDir::toNativeSeparators(QString("%1/addons").arg(BlenderDir));
QString const BlenderTestString = QLatin1String("###TEST_BLENDER###"); const QString BlenderExeCompare = QDir::toNativeSeparators(lcGetProfileString(LC_PROFILE_BLENDER_PATH)).toLower();
const QString BlenderInstallFile = QDir::toNativeSeparators(QString("%1/%2").arg(BlenderDir).arg(LC_BLENDER_ADDON_INSTALL_FILE));
const QString BlenderTestString = QLatin1String("###TEST_BLENDER###");
QByteArray AddonPathsAndModuleNames; QByteArray AddonPathsAndModuleNames;
QString Message, ShellProgram; QString Message, ShellProgram;
QStringList Arguments; QStringList Arguments;
@ -947,7 +947,7 @@ void lcBlenderPreferences::ConfigureBlenderAddon(bool TestBlender, bool AddonUpd
if (Action == PR_INSTALL) if (Action == PR_INSTALL)
{ {
connect(mProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(ReadStdOut())); connect(mProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(ReadStdOut()));
QString const& LdrawLibPath = QFileInfo(lcGetProfileString(LC_PROFILE_PARTS_LIBRARY)).absolutePath(); const QString& LdrawLibPath = QFileInfo(lcGetProfileString(LC_PROFILE_PARTS_LIBRARY)).absolutePath();
QStringList SystemEnvironment = QProcess::systemEnvironment(); QStringList SystemEnvironment = QProcess::systemEnvironment();
SystemEnvironment.prepend("LDRAW_DIRECTORY=" + LdrawLibPath); SystemEnvironment.prepend("LDRAW_DIRECTORY=" + LdrawLibPath);
SystemEnvironment.prepend("ADDONS_TO_LOAD=" + AddonPathsAndModuleNames); SystemEnvironment.prepend("ADDONS_TO_LOAD=" + AddonPathsAndModuleNames);
@ -978,9 +978,7 @@ void lcBlenderPreferences::ConfigureBlenderAddon(bool TestBlender, bool AddonUpd
if (!mProcess->waitForStarted()) if (!mProcess->waitForStarted())
{ {
Message = tr("Cannot start Blender %1 mProcess.\n%2") Message = tr("Cannot start Blender %1 mProcess.\n%2").arg(ProcessAction).arg(QString(mProcess->readAllStandardError()));
.arg(ProcessAction)
.arg(QString(mProcess->readAllStandardError()));
delete mProcess; delete mProcess;
mProcess = nullptr; mProcess = nullptr;
return PR_WAIT; return PR_WAIT;
@ -989,9 +987,7 @@ void lcBlenderPreferences::ConfigureBlenderAddon(bool TestBlender, bool AddonUpd
{ {
if (mProcess->exitStatus() != QProcess::NormalExit || mProcess->exitCode() != 0) if (mProcess->exitStatus() != QProcess::NormalExit || mProcess->exitCode() != 0)
{ {
Message = tr("Failed to execute Blender %1.\n%2") Message = tr("Failed to execute Blender %1.\n%2").arg(ProcessAction).arg(QString(mProcess->readAllStandardError()));
.arg(ProcessAction)
.arg(QString(mProcess->readAllStandardError()));
return PR_FAIL; return PR_FAIL;
} }
} }
@ -1005,7 +1001,7 @@ void lcBlenderPreferences::ConfigureBlenderAddon(bool TestBlender, bool AddonUpd
QCoreApplication::processEvents(QEventLoop::AllEvents, 100); QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
} }
connect(&mUpdateTimer, SIGNAL(timeout()), this, SLOT(Update())); connect(&mUpdateTimer, SIGNAL(timeout()), this, SLOT(Update()));
QString const StdOut = QString(mProcess->readAllStandardOutput()); const QString StdOut = QString(mProcess->readAllStandardOutput());
if (!StdOut.contains(BlenderTestString)) if (!StdOut.contains(BlenderTestString))
{ {
Message = tr("A simple check to test if the selected file is Blender failed." Message = tr("A simple check to test if the selected file is Blender failed."
@ -1085,9 +1081,7 @@ void lcBlenderPreferences::ConfigureBlenderAddon(bool TestBlender, bool AddonUpd
} }
else else
{ {
Message = tr("Cannot write Blender render script file [%1] %2.") Message = tr("Cannot write Blender render script file [%1] %2.").arg(Script.fileName()).arg(Script.errorString());
.arg(Script.fileName())
.arg(Script.errorString());
Error = true; Error = true;
} }
@ -1106,7 +1100,7 @@ void lcBlenderPreferences::ConfigureBlenderAddon(bool TestBlender, bool AddonUpd
#endif #endif
Result = ProcessCommand(PR_TEST); Result = ProcessCommand(PR_TEST);
bool TestOk = Result != PR_FAIL; bool TestOk = Result != PR_FAIL;
QString const statusLabel = TestOk ? "" : tr("Blender test failed."); const QString statusLabel = TestOk ? "" : tr("Blender test failed.");
StatusUpdate(false, TestOk, statusLabel); StatusUpdate(false, TestOk, statusLabel);
if (TestOk) if (TestOk)
{ {
@ -1115,8 +1109,8 @@ void lcBlenderPreferences::ConfigureBlenderAddon(bool TestBlender, bool AddonUpd
} }
else else
{ {
QString const& Title = tr ("%1 Blender LDraw Addon").arg(LC_PRODUCTNAME_STR); const QString& Title = tr ("%1 Blender LDraw Addon").arg(LC_PRODUCTNAME_STR);
QString const& Header = tr ("Blender test failed."); const QString& Header = tr ("Blender test failed.");
ShowMessage(Header, Title, Message); ShowMessage(Header, Title, Message);
return; return;
} }
@ -1124,11 +1118,9 @@ void lcBlenderPreferences::ConfigureBlenderAddon(bool TestBlender, bool AddonUpd
if (!mBlenderVersion.isEmpty() && !mImportMMActBox->isChecked() && !mImportActBox->isChecked()) if (!mBlenderVersion.isEmpty() && !mImportMMActBox->isChecked() && !mImportActBox->isChecked())
{ {
QString const& Title = tr ("%1 Blender LDraw Addon Modules").arg(LC_PRODUCTNAME_STR); const QString& Title = tr ("%1 Blender LDraw Addon Modules").arg(LC_PRODUCTNAME_STR);
QString const& Header = tr ("No import module enabled." const QString& Header = tr ("No import module enabled. If you continue, the default import module (Import TN) will be used.<br>If you select No, all addon modules will be disabled.");
"If you continue, the default import module (Import TN) will be used.<br>" const QString& Body = tr ("Continue with the default import module ?");
"If you select No, all addon modules will be disabled.");
QString const& Body = tr ("Continue with the default import module ?");
int Exec = ShowMessage(Header, Title, Body, QString(), MBB_YES_NO, QMessageBox::NoIcon); int Exec = ShowMessage(Header, Title, Body, QString(), MBB_YES_NO, QMessageBox::NoIcon);
if (Exec != QMessageBox::Yes) if (Exec != QMessageBox::Yes)
{ {
@ -1142,12 +1134,7 @@ void lcBlenderPreferences::ConfigureBlenderAddon(bool TestBlender, bool AddonUpd
if (TestBlender) if (TestBlender)
{ {
QString const preferredImportModule = const QString preferredImportModule = mImportActBox->isChecked() ? QString("TN") : mImportMMActBox->isChecked() ? QString("MM") : QString(); // disable all import modules
mImportActBox->isChecked()
? QString("TN")
: mImportMMActBox->isChecked()
? QString("MM")
: QString(); // disable all import modules
lcSetProfileString(LC_PROFILE_BLENDER_IMPORT_MODULE, preferredImportModule); lcSetProfileString(LC_PROFILE_BLENDER_IMPORT_MODULE, preferredImportModule);
} }
else else
@ -1227,7 +1214,7 @@ void lcBlenderPreferences::ConfigureBlenderAddon(bool TestBlender, bool AddonUpd
{ {
QJsonArray JsonArray; QJsonArray JsonArray;
QStringList AddonDirs = QDir(BlenderAddonDir).entryList(QDir::NoDotAndDotDot | QDir::Dirs, QDir::SortByMask); QStringList AddonDirs = QDir(BlenderAddonDir).entryList(QDir::NoDotAndDotDot | QDir::Dirs, QDir::SortByMask);
for (QString const& Addon : AddonDirs) for (const QString& Addon : AddonDirs)
{ {
QDir Dir(QString("%1/%2").arg(BlenderAddonDir).arg(Addon)); QDir Dir(QString("%1/%2").arg(BlenderAddonDir).arg(Addon));
Dir.setFilter(QDir::Files | QDir::NoDotAndDotDot | QDir::NoSymLinks); Dir.setFilter(QDir::Files | QDir::NoDotAndDotDot | QDir::NoSymLinks);
@ -1291,15 +1278,14 @@ bool lcBlenderPreferences::ExtractBlenderAddon(const QString& BlenderDir)
if (GetBlenderAddon(BlenderDir)) if (GetBlenderAddon(BlenderDir))
{ {
gAddonPreferences->StatusUpdate(true, false, tr("Extract addon...")); gAddonPreferences->StatusUpdate(true, false, tr("Extract addon..."));
QString const BlenderAddonFile = QDir::toNativeSeparators(QString("%1/%2").arg(BlenderDir).arg(LC_BLENDER_ADDON_FILE)); const QString BlenderAddonFile = QDir::toNativeSeparators(QString("%1/%2").arg(BlenderDir).arg(LC_BLENDER_ADDON_FILE));
QString Result; QString Result;
bool Success = gAddonPreferences->ExtractAddon(BlenderAddonFile, Result); bool Success = gAddonPreferences->ExtractAddon(BlenderAddonFile, Result);
if (!Success) if (!Success)
{ {
QString Message = tr("Failed to extract %1 to %2") QString Message = tr("Failed to extract %1 to %2").arg(LC_BLENDER_ADDON_FILE).arg(BlenderDir);
.arg(LC_BLENDER_ADDON_FILE).arg(BlenderDir);
if (Result.size()) if (Result.size())
Message.append(" "+Result); Message.append(" "+Result);
@ -1328,9 +1314,9 @@ bool lcBlenderPreferences::GetBlenderAddon(const QString& BlenderDir)
ADDON_CANCEL ADDON_CANCEL
}; };
QString const BlenderAddonDir = QDir::toNativeSeparators(QString("%1/addons").arg(BlenderDir)); const QString BlenderAddonDir = QDir::toNativeSeparators(QString("%1/addons").arg(BlenderDir));
QString const BlenderAddonFile = QDir::toNativeSeparators(QString("%1/%2").arg(BlenderDir).arg(LC_BLENDER_ADDON_FILE)); const QString BlenderAddonFile = QDir::toNativeSeparators(QString("%1/%2").arg(BlenderDir).arg(LC_BLENDER_ADDON_FILE));
QString const AddonVersionFile = QDir::toNativeSeparators(QString("%1/%2/__version__.py").arg(BlenderAddonDir).arg(LC_BLENDER_ADDON_FOLDER_STR)); const QString AddonVersionFile = QDir::toNativeSeparators(QString("%1/%2/__version__.py").arg(BlenderAddonDir).arg(LC_BLENDER_ADDON_FOLDER_STR));
bool ExtractedAddon = QFileInfo(AddonVersionFile).isReadable(); bool ExtractedAddon = QFileInfo(AddonVersionFile).isReadable();
bool BlenderAddonExists = ExtractedAddon || QFileInfo(BlenderAddonFile).isReadable(); bool BlenderAddonExists = ExtractedAddon || QFileInfo(BlenderAddonFile).isReadable();
QString AddonStatus = tr("Installing Blender addon..."); QString AddonStatus = tr("Installing Blender addon...");
@ -1417,8 +1403,7 @@ bool lcBlenderPreferences::GetBlenderAddon(const QString& BlenderDir)
QFile File(AddonVersionFile); QFile File(AddonVersionFile);
if (!File.open(QIODevice::ReadOnly)) if (!File.open(QIODevice::ReadOnly))
{ {
ShowMessage(tr("Cannot read addon version file: [%1]<br>%2.") ShowMessage(tr("Cannot read addon version file: [%1]<br>%2.").arg(AddonVersionFile).arg(File.errorString()));
.arg(AddonVersionFile).arg(File.errorString()));
return false; // Download new archive return false; // Download new archive
} }
Ba = File.readAll(); Ba = File.readAll();
@ -1457,11 +1442,9 @@ bool lcBlenderPreferences::GetBlenderAddon(const QString& BlenderDir)
{ {
if (LocalVersion.isEmpty()) if (LocalVersion.isEmpty())
LocalVersion = gAddonPreferences->mAddonVersion; LocalVersion = gAddonPreferences->mAddonVersion;
QString const& Title = tr ("%1 Blender LDraw Addon").arg(LC_PRODUCTNAME_STR); const QString& Title = tr ("%1 Blender LDraw Addon").arg(LC_PRODUCTNAME_STR);
QString const& Header = tr ("Detected %1 Blender LDraw addon %2. A newer version %3 exists.") const QString& Header = tr ("Detected %1 Blender LDraw addon %2. A newer version %3 exists.").arg(LC_PRODUCTNAME_STR).arg(LocalVersion).arg(OnlineVersion);
.arg(LC_PRODUCTNAME_STR) const QString& Body = tr ("Do you want to download version %1 ?").arg(OnlineVersion);
.arg(LocalVersion).arg(OnlineVersion);
QString const& Body = tr ("Do you want to download version %1 ?").arg(OnlineVersion);
int Exec = ShowMessage(Header, Title, Body, QString(), MBB_YES, QMessageBox::NoIcon); int Exec = ShowMessage(Header, Title, Body, QString(), MBB_YES, QMessageBox::NoIcon);
if (Exec == QMessageBox::Cancel) if (Exec == QMessageBox::Cancel)
{ {
@ -1500,8 +1483,7 @@ bool lcBlenderPreferences::GetBlenderAddon(const QString& BlenderDir)
Result &= Dir.rmdir(BlenderAddonDir); Result &= Dir.rmdir(BlenderAddonDir);
if (!Result) if (!Result)
ShowMessage(tr("Failed to remove Blender addon: %1").arg(BlenderAddonDir), ShowMessage(tr("Failed to remove Blender addon: %1").arg(BlenderAddonDir), tr("Remove Existing Addon"), QString(), QString(), MBB_OK, QMessageBox::Warning);
tr("Remove Existing Addon"), QString(), QString(), MBB_OK, QMessageBox::Warning);
} }
if (AddonAction == ADDON_DOWNLOAD) if (AddonAction == ADDON_DOWNLOAD)
@ -1529,8 +1511,7 @@ bool lcBlenderPreferences::GetBlenderAddon(const QString& BlenderDir)
gAddonPreferences->mData.clear(); gAddonPreferences->mData.clear();
} }
else else
ShowMessage(tr("Failed to open Blender addon file:<br>%1:<br>%2") ShowMessage(tr("Failed to open Blender addon file:<br>%1:<br>%2").arg(BlenderAddonFile).arg(File.errorString()));
.arg(BlenderAddonFile).arg(File.errorString()));
} }
else else
ShowMessage(tr("Failed to download Blender addon archive:<br>%1").arg(BlenderAddonFile)); ShowMessage(tr("Failed to download Blender addon archive:<br>%1").arg(BlenderAddonFile));
@ -1550,7 +1531,7 @@ bool lcBlenderPreferences::GetBlenderAddon(const QString& BlenderDir)
void lcBlenderPreferences::StatusUpdate(bool Addon, bool Error, const QString& Message) void lcBlenderPreferences::StatusUpdate(bool Addon, bool Error, const QString& Message)
{ {
QString Label, Colour; QString Label, Colour;
QString const Which = Addon ? tr("Blender addon") : tr("Blender"); const QString Which = Addon ? tr("Blender addon") : tr("Blender");
if (mProgressBar) if (mProgressBar)
{ {
if (Addon) if (Addon)
@ -1612,19 +1593,19 @@ void lcBlenderPreferences::ShowResult()
if (mProcess->exitStatus() != QProcess::NormalExit || mProcess->exitCode() != 0 || Error) if (mProcess->exitStatus() != QProcess::NormalExit || mProcess->exitCode() != 0 || Error)
{ {
QString const BlenderDir = QString("%1/Blender").arg(mDataDir); const QString BlenderDir = QString("%1/Blender").arg(mDataDir);
Message = tr("Addon install failed. See %1/stderr-blender-addon-install for details.").arg(BlenderDir); Message = tr("Addon install failed. See %1/stderr-blender-addon-install for details.").arg(BlenderDir);
StatusUpdate(true, true,tr("%1: Addon install failed.").arg("Error")); StatusUpdate(true, true,tr("%1: Addon install failed.").arg("Error"));
mConfigured = false; mConfigured = false;
QString const& Title = tr ("%1 Blender Addon Install").arg(LC_PRODUCTNAME_STR); const QString& Title = tr ("%1 Blender Addon Install").arg(LC_PRODUCTNAME_STR);
QString const& Header = "<b>" + tr ("Addon install failed.") + "</b>"; const QString& Header = "<b>" + tr ("Addon install failed.") + "</b>";
QString const& Body = tr ("LDraw addon install encountered one or more errors. See Show Details..."); const QString& Body = tr ("LDraw addon install encountered one or more errors. See Show Details...");
ShowMessage(Header, Title, Body, StdErrLog, MBB_OK, QMessageBox::Warning); ShowMessage(Header, Title, Body, StdErrLog, MBB_OK, QMessageBox::Warning);
} }
else else
{ {
QString const TextColour = QString("QLabel { color : %1; }").arg(QApplication::palette().text().color().name()); const QString TextColour = QString("QLabel { color : %1; }").arg(QApplication::palette().text().color().name());
mAddonGridLayout->replaceWidget(mProgressBar, mAddonVersionEdit); mAddonGridLayout->replaceWidget(mProgressBar, mAddonVersionEdit);
mConfigured = true; mConfigured = true;
mBlenderVersionLabel->setText(tr("Blender")); mBlenderVersionLabel->setText(tr("Blender"));
@ -1743,7 +1724,7 @@ void lcBlenderPreferences::PathChanged()
void lcBlenderPreferences::GetStandardOutput() void lcBlenderPreferences::GetStandardOutput()
{ {
QString const LogFile = QString("%1/Blender/stdout-blender-addon-install").arg(mDataDir); const QString LogFile = QString("%1/Blender/stdout-blender-addon-install").arg(mDataDir);
QFileInfo FileInfo(LogFile); QFileInfo FileInfo(LogFile);
if (!FileInfo.exists()) if (!FileInfo.exists())
{ {
@ -1769,11 +1750,11 @@ void lcBlenderPreferences::ReadStdOut(const QString& StdOutput, QString& Errors)
QStringList Items, ErrorList; QStringList Items, ErrorList;
QStringList StdOutLines = StdOutput.split(QRegExp("\n|\r\n|\r")); QStringList StdOutLines = StdOutput.split(QRegExp("\n|\r\n|\r"));
QString const SaveAddonVersion = mAddonVersion; const QString SaveAddonVersion = mAddonVersion;
QString const SaveVersion = mBlenderVersion; const QString SaveVersion = mBlenderVersion;
int EditListItems = mPathLineEditList.size(); int EditListItems = mPathLineEditList.size();
for (QString const& StdOutLine : StdOutLines) for (const QString& StdOutLine : StdOutLines)
{ {
if (StdOutLine.isEmpty()) if (StdOutLine.isEmpty())
continue; continue;
@ -1860,7 +1841,7 @@ void lcBlenderPreferences::ReadStdOut(const QString& StdOutput, QString& Errors)
void lcBlenderPreferences::ReadStdOut() void lcBlenderPreferences::ReadStdOut()
{ {
QString const& StdOut = QString(mProcess->readAllStandardOutput()); const QString& StdOut = QString(mProcess->readAllStandardOutput());
mStdOutList.append(StdOut); mStdOutList.append(StdOut);
@ -1880,15 +1861,15 @@ void lcBlenderPreferences::ReadStdOut()
if (!ErrorsAndWarnings.isEmpty()) if (!ErrorsAndWarnings.isEmpty())
{ {
QString const StdOutLog = QDir::toNativeSeparators(QString("<br>- See %1/Blender/stdout-blender-addon-install") const QString StdOutLog = QDir::toNativeSeparators(QString("<br>- See %1/Blender/stdout-blender-addon-install")
.arg(mDataDir)); .arg(mDataDir));
QMessageBox::Icon Icon = QMessageBox::Warning; QMessageBox::Icon Icon = QMessageBox::Warning;
QString const& Items = Error ? tr("errors%1").arg(Warning ? tr(" and warnings") : "") : Warning ? tr("warnings") : ""; const QString& Items = Error ? tr("errors%1").arg(Warning ? tr(" and warnings") : "") : Warning ? tr("warnings") : "";
QString const& Title = tr ("%1 Blender Addon Install").arg(LC_PRODUCTNAME_STR); const QString& Title = tr ("%1 Blender Addon Install").arg(LC_PRODUCTNAME_STR);
QString const& Header = "<b>" + tr ("Addon install standard output.") + "</b>"; const QString& Header = "<b>" + tr ("Addon install standard output.") + "</b>";
QString const& Body = tr ("LDraw addon install encountered %1. See Show Details...").arg(Items); const QString& Body = tr ("LDraw addon install encountered %1. See Show Details...").arg(Items);
ShowMessage(Header, Title, Body, ErrorsAndWarnings.append(StdOutLog), MBB_OK, Icon); ShowMessage(Header, Title, Body, ErrorsAndWarnings.append(StdOutLog), MBB_OK, Icon);
} }
} }
@ -1903,19 +1884,17 @@ QString lcBlenderPreferences::ReadStdErr(bool& Error) const
Error = false; Error = false;
QStringList ReturnLines; QStringList ReturnLines;
QString const BlenderDir = QString("%1/Blender").arg(mDataDir); const QString BlenderDir = QString("%1/Blender").arg(mDataDir);
QFile File(QString("%1/stderr-blender-addon-install").arg(BlenderDir)); QFile File(QString("%1/stderr-blender-addon-install").arg(BlenderDir));
if ( ! File.open(QFile::ReadOnly | QFile::Text)) if ( ! File.open(QFile::ReadOnly | QFile::Text))
{ {
QString Message = tr("Failed to open log file: %1:\n%2") const QString Message = tr("Failed to open log file: %1:\n%2").arg(File.fileName()).arg(File.errorString());
.arg(File.fileName())
.arg(File.errorString());
return Message; return Message;
} }
QTextStream In(&File); QTextStream In(&File);
while ( ! In.atEnd()) while ( ! In.atEnd())
{ {
QString const& Line = In.readLine(0); const QString& Line = In.readLine(0);
ReturnLines << CleanLine(Line); ReturnLines << CleanLine(Line);
if (!Error) if (!Error)
Error = !Line.isEmpty(); Error = !Line.isEmpty();
@ -1925,7 +1904,7 @@ QString lcBlenderPreferences::ReadStdErr(bool& Error) const
void lcBlenderPreferences::WriteStdOut() void lcBlenderPreferences::WriteStdOut()
{ {
QString const BlenderDir = QString("%1/Blender").arg(mDataDir); const QString BlenderDir = QString("%1/Blender").arg(mDataDir);
QFile File(QString("%1/stdout-blender-addon-install").arg(BlenderDir)); QFile File(QString("%1/stdout-blender-addon-install").arg(BlenderDir));
if (File.open(QFile::WriteOnly | QIODevice::Truncate | QFile::Text)) if (File.open(QFile::WriteOnly | QIODevice::Truncate | QFile::Text))
{ {
@ -1944,8 +1923,8 @@ bool lcBlenderPreferences::PromptCancel()
#ifndef QT_NO_PROCESS #ifndef QT_NO_PROCESS
if (mProcess) if (mProcess)
{ {
QString const& Title = tr ("Cancel %1 Addon Install").arg(LC_PRODUCTNAME_STR); const QString& Title = tr ("Cancel %1 Addon Install").arg(LC_PRODUCTNAME_STR);
QString const& Header = "<b>" + tr("Are you sure you want to cancel the add on install ?") + "</b>"; const QString& Header = "<b>" + tr("Are you sure you want to cancel the add on install ?") + "</b>";
int Exec = ShowMessage(Header, Title, QString(), QString(), MBB_YES_NO, QMessageBox::Question); int Exec = ShowMessage(Header, Title, QString(), QString(), MBB_YES_NO, QMessageBox::Question);
if (Exec == QMessageBox::Yes) if (Exec == QMessageBox::Yes)
{ {
@ -2096,7 +2075,7 @@ bool lcBlenderPreferences::SettingsModified(bool Update, const QString& Module)
for (int CtlIdx = 0; CtlIdx < gAddonPreferences->mComboBoxList.size(); CtlIdx++) for (int CtlIdx = 0; CtlIdx < gAddonPreferences->mComboBoxList.size(); CtlIdx++)
{ {
OldValue = mBlenderSettingsMM[LblIdx].value; OldValue = mBlenderSettingsMM[LblIdx].value;
QString const Value = gAddonPreferences->mComboBoxList[CtlIdx]->itemData(gAddonPreferences->mComboBoxList[CtlIdx]->currentIndex()).toString(); const QString Value = gAddonPreferences->mComboBoxList[CtlIdx]->itemData(gAddonPreferences->mComboBoxList[CtlIdx]->currentIndex()).toString();
if (Update) if (Update)
mBlenderSettingsMM[LblIdx].value = Value; mBlenderSettingsMM[LblIdx].value = Value;
Modified |= Value != OldValue; Modified |= Value != OldValue;
@ -2208,7 +2187,7 @@ bool lcBlenderPreferences::SettingsModified(bool Update, const QString& Module)
for (int CtlIdx = 0; CtlIdx < gAddonPreferences->mComboBoxList.size(); CtlIdx++) for (int CtlIdx = 0; CtlIdx < gAddonPreferences->mComboBoxList.size(); CtlIdx++)
{ {
OldValue = mBlenderSettings[LblIdx].value; OldValue = mBlenderSettings[LblIdx].value;
QString const Value = gAddonPreferences->mComboBoxList[CtlIdx]->itemData(gAddonPreferences->mComboBoxList[CtlIdx]->currentIndex()).toString(); const QString Value = gAddonPreferences->mComboBoxList[CtlIdx]->itemData(gAddonPreferences->mComboBoxList[CtlIdx]->currentIndex()).toString();
if (Update) if (Update)
mBlenderSettings[LblIdx].value = Value; mBlenderSettings[LblIdx].value = Value;
Modified |= Value != OldValue; Modified |= Value != OldValue;
@ -2222,7 +2201,7 @@ bool lcBlenderPreferences::SettingsModified(bool Update, const QString& Module)
for (int LblIdx = 0; LblIdx < NumPaths(); LblIdx++) for (int LblIdx = 0; LblIdx < NumPaths(); LblIdx++)
{ {
OldValue = mBlenderPaths[LblIdx].value; OldValue = mBlenderPaths[LblIdx].value;
QString const Value = gAddonPreferences->mPathLineEditList[LblIdx]->text(); const QString Value = gAddonPreferences->mPathLineEditList[LblIdx]->text();
if (Update) if (Update)
mBlenderPaths[LblIdx].value = Value; mBlenderPaths[LblIdx].value = Value;
Modified |= Value != OldValue; Modified |= Value != OldValue;
@ -2405,9 +2384,7 @@ void lcBlenderPreferences::LoadSettings()
if (!NumPaths()) if (!NumPaths())
{ {
QString const DefaultBlendFile = QString("%1/Blender/config/%2") const QString DefaultBlendFile = QString("%1/Blender/config/%2").arg(gAddonPreferences->mDataDir).arg(LC_BLENDER_ADDON_BLEND_FILE);
.arg(gAddonPreferences->mDataDir)
.arg(LC_BLENDER_ADDON_BLEND_FILE);
QStringList const AddonPaths = QStringList() QStringList const AddonPaths = QStringList()
/* PATH_BLENDER */ << lcGetProfileString(LC_PROFILE_BLENDER_PATH) /* PATH_BLENDER */ << lcGetProfileString(LC_PROFILE_BLENDER_PATH)
@ -2471,8 +2448,8 @@ void lcBlenderPreferences::LoadSettings()
{ {
if (LblIdx == PATH_STUDIO_LDRAW) if (LblIdx == PATH_STUDIO_LDRAW)
continue; continue;
QString const& Key = QString("%1/%2").arg(LC_BLENDER_ADDON, mBlenderPaths[LblIdx].key); const QString& Key = QString("%1/%2").arg(LC_BLENDER_ADDON, mBlenderPaths[LblIdx].key);
QString const& Value = Settings.value(Key, QString()).toString(); const QString& Value = Settings.value(Key, QString()).toString();
if (QFileInfo(Value).exists()) if (QFileInfo(Value).exists())
{ {
mBlenderPaths[LblIdx].value = QDir::toNativeSeparators(Value); mBlenderPaths[LblIdx].value = QDir::toNativeSeparators(Value);
@ -2483,8 +2460,8 @@ void lcBlenderPreferences::LoadSettings()
{ {
if (LblIdx == PATH_LSYNTH || LblIdx == PATH_STUD_LOGO) if (LblIdx == PATH_LSYNTH || LblIdx == PATH_STUD_LOGO)
continue; continue;
QString const& Key = QString("%1/%2").arg(LC_BLENDER_ADDON_MM, mBlenderPaths[LblIdx].key_mm); const QString& Key = QString("%1/%2").arg(LC_BLENDER_ADDON_MM, mBlenderPaths[LblIdx].key_mm);
QString const& Value = Settings.value(Key, QString()).toString(); const QString& Value = Settings.value(Key, QString()).toString();
if (QFileInfo(Value).exists()) if (QFileInfo(Value).exists())
{ {
mBlenderPaths[LblIdx].value = QDir::toNativeSeparators(Value); mBlenderPaths[LblIdx].value = QDir::toNativeSeparators(Value);
@ -2493,37 +2470,37 @@ void lcBlenderPreferences::LoadSettings()
for (int LblIdx = 0; LblIdx < NumSettings(); LblIdx++) for (int LblIdx = 0; LblIdx < NumSettings(); LblIdx++)
{ {
QString const& Key = QString("%1/%2").arg(LC_BLENDER_ADDON, mBlenderSettings[LblIdx].key); const QString& Key = QString("%1/%2").arg(LC_BLENDER_ADDON, mBlenderSettings[LblIdx].key);
QString const& Value = Settings.value(Key, QString()).toString(); const QString& Value = Settings.value(Key, QString()).toString();
if (!Value.isEmpty()) if (!Value.isEmpty())
{ {
mBlenderSettings[LblIdx].value = Value == "True" ? "1" : Value == "False" ? "0" : Value; mBlenderSettings[LblIdx].value = Value == "True" ? "1" : Value == "False" ? "0" : Value;
} }
if (LblIdx == LBL_IMAGE_WIDTH || LblIdx == LBL_IMAGE_HEIGHT || LblIdx == LBL_RENDER_PERCENTAGE) if (LblIdx == LBL_IMAGE_WIDTH || LblIdx == LBL_IMAGE_HEIGHT || LblIdx == LBL_RENDER_PERCENTAGE)
{ {
QString const& Label = mDefaultSettings[LblIdx].label; const QString& Label = mDefaultSettings[LblIdx].label;
mBlenderSettings[LblIdx].label = QString("%1 - Setting (%2)").arg(Label).arg(Value); mBlenderSettings[LblIdx].label = QString("%1 - Setting (%2)").arg(Label).arg(Value);
} }
} }
for (int LblIdx = 0; LblIdx < NumSettingsMM(); LblIdx++) for (int LblIdx = 0; LblIdx < NumSettingsMM(); LblIdx++)
{ {
QString const& Key = QString("%1/%2").arg(LC_BLENDER_ADDON_MM, mBlenderSettingsMM[LblIdx].key); const QString& Key = QString("%1/%2").arg(LC_BLENDER_ADDON_MM, mBlenderSettingsMM[LblIdx].key);
QString const& Value = Settings.value(Key, QString()).toString(); const QString& Value = Settings.value(Key, QString()).toString();
if (!Value.isEmpty()) if (!Value.isEmpty())
{ {
mBlenderSettingsMM[LblIdx].value = Value == "True" ? "1" : Value == "False" ? "0" : Value; mBlenderSettingsMM[LblIdx].value = Value == "True" ? "1" : Value == "False" ? "0" : Value;
} }
if (LblIdx == LBL_RENDER_PERCENTAGE_MM || LblIdx == LBL_RESOLUTION_WIDTH || LblIdx == LBL_RESOLUTION_HEIGHT) if (LblIdx == LBL_RENDER_PERCENTAGE_MM || LblIdx == LBL_RESOLUTION_WIDTH || LblIdx == LBL_RESOLUTION_HEIGHT)
{ {
QString const& Label = mDefaultSettingsMM[LblIdx].label; const QString& Label = mDefaultSettingsMM[LblIdx].label;
mBlenderSettingsMM[LblIdx].label = QString("%1 - Setting (%2)").arg(Label).arg(Value); mBlenderSettingsMM[LblIdx].label = QString("%1 - Setting (%2)").arg(Label).arg(Value);
} }
} }
} }
else else
{ {
QString const LogFile = QString("%1/Blender/stdout-blender-addon-install").arg(gAddonPreferences->mDataDir); const QString LogFile = QString("%1/Blender/stdout-blender-addon-install").arg(gAddonPreferences->mDataDir);
if (QFileInfo(LogFile).isReadable()) if (QFileInfo(LogFile).isReadable())
{ {
QFile File(LogFile); QFile File(LogFile);
@ -2563,7 +2540,7 @@ void lcBlenderPreferences::SaveSettings()
if (!NumSettings() || !NumSettingsMM()) if (!NumSettings() || !NumSettingsMM())
LoadSettings(); LoadSettings();
QString const BlenderConfigDir = QString("%1/Blender/setup/addon_setup/config").arg(gAddonPreferences->mDataDir); const QString BlenderConfigDir = QString("%1/Blender/setup/addon_setup/config").arg(gAddonPreferences->mDataDir);
QString Key, Value = mBlenderPaths[PATH_BLENDER].value; QString Key, Value = mBlenderPaths[PATH_BLENDER].value;
if (Value.isEmpty()) if (Value.isEmpty())
@ -2583,9 +2560,7 @@ void lcBlenderPreferences::SaveSettings()
lcSetProfileString(LC_PROFILE_BLENDER_VERSION, Value); lcSetProfileString(LC_PROFILE_BLENDER_VERSION, Value);
Value = lcGetProfileString(LC_PROFILE_BLENDER_LDRAW_CONFIG_PATH).isEmpty() Value = lcGetProfileString(LC_PROFILE_BLENDER_LDRAW_CONFIG_PATH).isEmpty() ? QString("%1/%2").arg(BlenderConfigDir).arg(LC_BLENDER_ADDON_CONFIG_FILE) : lcGetProfileString(LC_PROFILE_BLENDER_LDRAW_CONFIG_PATH);
? QString("%1/%2").arg(BlenderConfigDir).arg(LC_BLENDER_ADDON_CONFIG_FILE)
: lcGetProfileString(LC_PROFILE_BLENDER_LDRAW_CONFIG_PATH);
lcSetProfileString(LC_PROFILE_BLENDER_LDRAW_CONFIG_PATH, QDir::toNativeSeparators(Value)); lcSetProfileString(LC_PROFILE_BLENDER_LDRAW_CONFIG_PATH, QDir::toNativeSeparators(Value));
QString searchDirectoriesKey; QString searchDirectoriesKey;
@ -2676,11 +2651,7 @@ void lcBlenderPreferences::SaveSettings()
concludeSettingsGroup(); concludeSettingsGroup();
QString const preferredImportModule = const QString preferredImportModule = gAddonPreferences->mImportActBox->isChecked() ? QString("TN") : gAddonPreferences->mImportMMActBox->isChecked() ? QString("MM") : QString();
gAddonPreferences->mImportActBox->isChecked()
? QString("TN")
: gAddonPreferences->mImportMMActBox->isChecked()
? QString("MM") : QString();
if (preferredImportModule != lcGetProfileString(LC_PROFILE_BLENDER_IMPORT_MODULE)) if (preferredImportModule != lcGetProfileString(LC_PROFILE_BLENDER_IMPORT_MODULE))
lcSetProfileString(LC_PROFILE_BLENDER_IMPORT_MODULE, preferredImportModule); lcSetProfileString(LC_PROFILE_BLENDER_IMPORT_MODULE, preferredImportModule);
@ -2814,7 +2785,7 @@ void lcBlenderPreferences::BrowseBlender(bool)
{ {
if (sender() == mPathBrowseButtonList.at(LblIdx)) if (sender() == mPathBrowseButtonList.at(LblIdx))
{ {
QString const BlenderPath = QDir::toNativeSeparators(mBlenderPaths[LblIdx].value).toLower(); const QString BlenderPath = QDir::toNativeSeparators(mBlenderPaths[LblIdx].value).toLower();
QFileDialog FileDialog(nullptr); QFileDialog FileDialog(nullptr);
FileDialog.setWindowTitle(tr("Locate %1").arg(mBlenderPaths[LblIdx].label)); FileDialog.setWindowTitle(tr("Locate %1").arg(mBlenderPaths[LblIdx].label));
if (LblIdx < PATH_LDRAW) if (LblIdx < PATH_LDRAW)
@ -2831,7 +2802,7 @@ void lcBlenderPreferences::BrowseBlender(bool)
QFileInfo PathInfo(SelectedPathList.at(0)); QFileInfo PathInfo(SelectedPathList.at(0));
if (PathInfo.exists()) if (PathInfo.exists())
{ {
QString const SelectedPath = QDir::toNativeSeparators(PathInfo.absoluteFilePath()).toLower(); const QString SelectedPath = QDir::toNativeSeparators(PathInfo.absoluteFilePath()).toLower();
mPathLineEditList[LblIdx]->setText(SelectedPathList.at(0)); mPathLineEditList[LblIdx]->setText(SelectedPathList.at(0));
if (LblIdx != PATH_BLENDER) if (LblIdx != PATH_BLENDER)
{ {
@ -2872,7 +2843,7 @@ void lcBlenderPreferences::SizeChanged(const QString& Value)
{ {
disconnect(mLineEditList[Height_Edit],SIGNAL(textChanged(const QString&)), this, SLOT (SizeChanged(const QString&))); disconnect(mLineEditList[Height_Edit],SIGNAL(textChanged(const QString&)), this, SLOT (SizeChanged(const QString&)));
QString const Height = QString::number(qRound(double(mImageHeight * NewValue / mImageWidth))); const QString Height = QString::number(qRound(double(mImageHeight * NewValue / mImageWidth)));
mLineEditList[Height_Edit]->setText(Height); mLineEditList[Height_Edit]->setText(Height);
Change = Settings[Height_Edit].value != Height; Change = Settings[Height_Edit].value != Height;
@ -2883,7 +2854,7 @@ void lcBlenderPreferences::SizeChanged(const QString& Value)
{ {
disconnect(mLineEditList[Width_Edit],SIGNAL(textChanged(const QString&)), this, SLOT (SizeChanged(const QString&))); disconnect(mLineEditList[Width_Edit],SIGNAL(textChanged(const QString&)), this, SLOT (SizeChanged(const QString&)));
QString const Width = QString::number(qRound(double(NewValue * mImageWidth / mImageHeight))); const QString Width = QString::number(qRound(double(NewValue * mImageWidth / mImageHeight)));
mLineEditList[Width_Edit]->setText(Width); mLineEditList[Width_Edit]->setText(Width);
Change = Settings[Height_Edit].value != Width; Change = Settings[Height_Edit].value != Width;
@ -2909,7 +2880,7 @@ void lcBlenderPreferences::SetModelSize(bool Update)
const int Height_Edit = ImportMM ? int(CTL_RESOLUTION_HEIGHT_EDIT) : int(CTL_IMAGE_HEIGHT_EDIT); const int Height_Edit = ImportMM ? int(CTL_RESOLUTION_HEIGHT_EDIT) : int(CTL_IMAGE_HEIGHT_EDIT);
const int Crop_Image_Label = ImportMM ? int(LBL_CROP_IMAGE_MM) : int(LBL_CROP_IMAGE); const int Crop_Image_Label = ImportMM ? int(LBL_CROP_IMAGE_MM) : int(LBL_CROP_IMAGE);
QString const CropImageLabel = mSettingLabelList[Crop_Image_Label]->text(); const QString CropImageLabel = mSettingLabelList[Crop_Image_Label]->text();
int ImageWidth = mImageWidth; int ImageWidth = mImageWidth;
int ImageHeight = mImageHeight; int ImageHeight = mImageHeight;
@ -2979,12 +2950,9 @@ void lcBlenderPreferences::SetModelSize(bool Update)
if (Conflict[0] || Conflict[1] || Conflict[2]) if (Conflict[0] || Conflict[1] || Conflict[2])
{ {
QString const& Title = tr ("LDraw Render Settings Conflict"); const QString& Title = tr ("LDraw Render Settings Conflict");
QString const& Header = "<b>" + tr ("Crop image configuration settings conflict were resolved.") + "</b>"; const QString& Header = "<b>" + tr ("Crop image configuration settings conflict were resolved.") + "</b>";
QString const& Body = QString("%1%2%3") const QString& Body = QString("%1%2%3").arg(Conflict[0] ? tr("Keep aspect ratio set to false.<br>") : "").arg(Conflict[1] ? tr("Add environment (backdrop and base plane) set to false.<br>") : "").arg(Conflict[2] ? tr("Transparent background set to true.<br>") : "");
.arg(Conflict[0] ? tr("Keep aspect ratio set to false.<br>") : "")
.arg(Conflict[1] ? tr("Add environment (backdrop and base plane) set to false.<br>") : "")
.arg(Conflict[2] ? tr("Transparent background set to true.<br>") : "");
ShowMessage(Header, Title, Body, QString(), MBB_OK, QMessageBox::Information); ShowMessage(Header, Title, Body, QString(), MBB_OK, QMessageBox::Information);
} }
} }
@ -2992,8 +2960,8 @@ void lcBlenderPreferences::SetModelSize(bool Update)
disconnect(mLineEditList[Width_Edit],SIGNAL(textChanged(const QString&)), this, SLOT (SizeChanged(const QString&))); disconnect(mLineEditList[Width_Edit],SIGNAL(textChanged(const QString&)), this, SLOT (SizeChanged(const QString&)));
disconnect(mLineEditList[Height_Edit],SIGNAL(textChanged(const QString&)), this, SLOT (SizeChanged(const QString&))); disconnect(mLineEditList[Height_Edit],SIGNAL(textChanged(const QString&)), this, SLOT (SizeChanged(const QString&)));
QString const Width = QString::number(CropImage ? ImageWidth : mImageWidth); const QString Width = QString::number(CropImage ? ImageWidth : mImageWidth);
QString const Height = QString::number(CropImage ? ImageHeight : mImageHeight); const QString Height = QString::number(CropImage ? ImageHeight : mImageHeight);
mLineEditList[Width_Edit]->setText(Width); mLineEditList[Width_Edit]->setText(Width);
mLineEditList[Height_Edit]->setText(Height); mLineEditList[Height_Edit]->setText(Height);
@ -3020,11 +2988,9 @@ void lcBlenderPreferences::ValidateColourScheme(int Index)
BlenderSettings const* defaultSettings = ImportMM ? mDefaultSettingsMM : mDefaultSettings; BlenderSettings const* defaultSettings = ImportMM ? mDefaultSettingsMM : mDefaultSettings;
Settings[Color_Scheme].value = defaultSettings[Color_Scheme].value; Settings[Color_Scheme].value = defaultSettings[Color_Scheme].value;
QString const& Title = tr ("Custom LDraw Colours"); const QString& Title = tr ("Custom LDraw Colours");
QString const& Header = "<b>" + tr ("Colour scheme 'custom' cannot be enabled. Custom LDConfig file not found.") + "</b>"; const QString& Header = "<b>" + tr ("Colour scheme 'custom' cannot be enabled. Custom LDConfig file not found.") + "</b>";
QString const& Body = tr ("Colour scheme 'custom' selected but no LDConfig file was specified.<br>" const QString& Body = tr ("Colour scheme 'custom' selected but no LDConfig file was specified.<br>The default colour scheme '%1' will be used.<br>").arg(Settings[Color_Scheme].value);
"The default colour scheme '%1' will be used.<br>")
.arg(Settings[Color_Scheme].value);
ShowMessage(Header, Title, Body, QString(), MBB_OK, QMessageBox::Warning); ShowMessage(Header, Title, Body, QString(), MBB_OK, QMessageBox::Warning);
} }
else else
@ -3037,8 +3003,8 @@ void lcBlenderPreferences::ValidateColourScheme(int Index)
bool lcBlenderPreferences::PromptAccept() bool lcBlenderPreferences::PromptAccept()
{ {
QString const& Title = tr ("Render Settings Modified"); const QString& Title = tr ("Render Settings Modified");
QString const& Header = "<b>" + tr("Do you want to accept the modified settings before quitting ?") + "</b>"; const QString& Header = "<b>" + tr("Do you want to accept the modified settings before quitting ?") + "</b>";
int Exec = ShowMessage(Header, Title, QString(), QString(), MBB_YES_NO, QMessageBox::Question); int Exec = ShowMessage(Header, Title, QString(), QString(), MBB_YES_NO, QMessageBox::Question);
if (Exec == QMessageBox::Yes) if (Exec == QMessageBox::Yes)
return true; return true;
@ -3316,8 +3282,8 @@ void lcBlenderPreferences::LoadDefaultParameters(QByteArray& Buffer, int Which)
bool lcBlenderPreferences::ExportParameterFile() bool lcBlenderPreferences::ExportParameterFile()
{ {
QString const BlenderConfigDir = QString("%1/Blender/setup/addon_setup/config").arg(gAddonPreferences->mDataDir); const QString BlenderConfigDir = QString("%1/Blender/setup/addon_setup/config").arg(gAddonPreferences->mDataDir);
QString const ParameterFile = QString("%1/%2").arg(BlenderConfigDir).arg(LC_BLENDER_ADDON_PARAMS_FILE); const QString ParameterFile = QString("%1/%2").arg(BlenderConfigDir).arg(LC_BLENDER_ADDON_PARAMS_FILE);
QFile File(ParameterFile); QFile File(ParameterFile);
if (!OverwriteFile(File.fileName())) if (!OverwriteFile(File.fileName()))
@ -3421,15 +3387,15 @@ bool lcBlenderPreferences::OverwriteFile(const QString& File)
if (!fileInfo.exists()) if (!fileInfo.exists())
return true; return true;
QString const& Title = tr ("Replace Existing File"); const QString& Title = tr ("Replace Existing File");
QString const Header = "<b>" + QMessageBox::tr ("Existing file %1 detected.").arg(fileInfo.fileName()) + "</b>"; const QString Header = "<b>" + QMessageBox::tr ("Existing file %1 detected.").arg(fileInfo.fileName()) + "</b>";
QString const Body = QMessageBox::tr ("\"%1\"<br>This file already exists.<br>Replace existing file?").arg(fileInfo.fileName()); const QString Body = QMessageBox::tr ("\"%1\"<br>This file already exists.<br>Replace existing file?").arg(fileInfo.fileName());
int Exec = ShowMessage(Header, Title, Body, QString(), MBB_YES, QMessageBox::NoIcon); int Exec = ShowMessage(Header, Title, Body, QString(), MBB_YES, QMessageBox::NoIcon);
return (Exec == QMessageBox::Yes); return (Exec == QMessageBox::Yes);
} }
int lcBlenderPreferences::ShowMessage(QString const& Header, QString const& Title, QString const& Body, const QString& Detail, int const Buttons, int const Icon) int lcBlenderPreferences::ShowMessage(const QString& Header, const QString& Title, const QString& Body, const QString& Detail, int const Buttons, int const Icon)
{ {
if (!gMainWindow) if (!gMainWindow)
return QMessageBox::Ok; return QMessageBox::Ok;
@ -3600,7 +3566,7 @@ bool lcBlenderPreferences::ExtractAddon(const QString FileName, QString& Result)
if (!ZipFile.OpenRead(FileName)) if (!ZipFile.OpenRead(FileName))
return false; return false;
QString const DestinationDir = QFileInfo(FileName).absolutePath(); const QString DestinationDir = QFileInfo(FileName).absolutePath();
bool Ok = true; bool Ok = true;
@ -3652,8 +3618,7 @@ bool lcBlenderPreferences::ExtractAddon(const QString FileName, QString& Result)
FileInfo.permissions |= QFile::ExeOwner | QFile::ExeUser | QFile::ExeGroup | QFile::ExeOther; FileInfo.permissions |= QFile::ExeOwner | QFile::ExeUser | QFile::ExeGroup | QFile::ExeOther;
break; break;
default: default:
ShowMessage(tr("ZipFile entry format (HostOS %1) at index %2 is not supported. Extract terminated.") ShowMessage(tr("ZipFile entry format (HostOS %1) at index %2 is not supported. Extract terminated.").arg(HostOS).arg(FileIdx), tr("Extract Addon"), QString(), QString(), MBB_OK, QMessageBox::Warning);
.arg(HostOS).arg(FileIdx), tr("Extract Addon"), QString(), QString(), MBB_OK, QMessageBox::Warning);
Ok = false; Ok = false;
} }
@ -3669,7 +3634,7 @@ bool lcBlenderPreferences::ExtractAddon(const QString FileName, QString& Result)
FilePathRef.chop(1); FilePathRef.chop(1);
FileInfo.filePath = FilePathRef.toString(); FileInfo.filePath = FilePathRef.toString();
QString const AbsPath = QDir::fromNativeSeparators(DestinationDir + QDir::separator() + FileInfo.filePath); const QString AbsPath = QDir::fromNativeSeparators(DestinationDir + QDir::separator() + FileInfo.filePath);
// directories // directories
if (FileInfo.isDir) if (FileInfo.isDir)

View file

@ -117,13 +117,9 @@ lcRenderDialog::lcRenderDialog(QWidget* Parent, int Command)
} }
if (BlenderConfigured) if (BlenderConfigured)
mImportModule = lcGetProfileString(LC_PROFILE_BLENDER_IMPORT_MODULE) == QLatin1String("TN") mImportModule = lcGetProfileString(LC_PROFILE_BLENDER_IMPORT_MODULE) == QLatin1String("TN") ? tr("LDraw Import TN") : tr("LDraw Import MM");
? tr("LDraw Import TN")
: tr("LDraw Import MM");
ui->RenderButton->setToolTip(BlenderConfigured ui->RenderButton->setToolTip(BlenderConfigured ? tr("Render LDraw Model") : tr("Blender not configured. Use Settings... to configure."));
? tr("Render LDraw Model")
: tr("Blender not configured. Use Settings... to configure."));
ui->RenderButton->setEnabled(BlenderConfigured); ui->RenderButton->setEnabled(BlenderConfigured);
@ -134,13 +130,13 @@ lcRenderDialog::lcRenderDialog(QWidget* Parent, int Command)
if (mCommand == OPEN_IN_BLENDER) if (mCommand == OPEN_IN_BLENDER)
{ {
mLabelMessage = tr("Open%1 in Blender using %2:") mLabelMessage = tr("Open%1 in Blender using %2:") .arg(Model ? tr(" <b>STEP %1</b>").arg(Model->GetCurrentStep()) : "");
.arg(Model ? tr(" <b>STEP %1</b>").arg(Model->GetCurrentStep()) : "");
ui->RenderSettingsButton->setToolTip(tr("Blender import settings")); ui->RenderSettingsButton->setToolTip(tr("Blender import settings"));
ui->RenderButton->setText(tr("Open in Blender")); ui->RenderButton->setText(tr("Open in Blender"));
ui->RenderButton->setFixedWidth(ui->RenderButton->sizeHint().width() + 20); ui->RenderButton->setFixedWidth(ui->RenderButton->sizeHint().width() + 20);
if (BlenderConfigured) if (BlenderConfigured)
ui->RenderButton->setToolTip(tr("Import and open LDraw model in Blender")); ui->RenderButton->setToolTip(tr("Import and open LDraw model in Blender"));
@ -202,14 +198,8 @@ void lcRenderDialog::UpdateElapsedTime() const
{ {
if (mProcess && mCommand == BLENDER_RENDER) if (mProcess && mCommand == BLENDER_RENDER)
{ {
QString const RenderType = lcGetProfileString(LC_PROFILE_BLENDER_VERSION).startsWith("v3") const QString RenderType = lcGetProfileString(LC_PROFILE_BLENDER_VERSION).startsWith("v3") ? QLatin1String("Samples") : QLatin1String("Tiles");
? QLatin1String("Samples") ui->renderLabel->setText(tr("%1: %2/%3, %4") .arg(RenderType) .arg(mBlendProgValue) .arg(mBlendProgMax) .arg(ElapsedTime(mRenderTime.elapsed())));
: QLatin1String("Tiles");
ui->renderLabel->setText(tr("%1: %2/%3, %4")
.arg(RenderType)
.arg(mBlendProgValue)
.arg(mBlendProgMax)
.arg(ElapsedTime(mRenderTime.elapsed())));
} }
} }
@ -260,9 +250,7 @@ bool lcRenderDialog::PromptCancel()
ui->RenderOutputButton->setEnabled(true); ui->RenderOutputButton->setEnabled(true);
} }
if (mCommand == BLENDER_RENDER) if (mCommand == BLENDER_RENDER)
ui->renderLabel->setText(tr("Tiles: %1/%2, Render Cancelled.") ui->renderLabel->setText(tr("Tiles: %1/%2, Render Cancelled.") .arg(mBlendProgValue) .arg(mBlendProgMax));
.arg(mBlendProgValue)
.arg(mBlendProgMax));
} }
else else
return false; return false;
@ -291,9 +279,7 @@ void lcRenderDialog::on_RenderSettingsButton_clicked()
{ {
if (mCommand == OPEN_IN_BLENDER) if (mCommand == OPEN_IN_BLENDER)
{ {
mImportModule = lcGetProfileString(LC_PROFILE_BLENDER_IMPORT_MODULE) == QLatin1String("TN") mImportModule = lcGetProfileString(LC_PROFILE_BLENDER_IMPORT_MODULE) == QLatin1String("TN") ? tr("LDraw Import TN") : tr("LDraw Import MM");
? tr("LDraw Import TN")
: tr("LDraw Import MM");
ui->renderLabel->setText(mLabelMessage.arg(mImportModule)); ui->renderLabel->setText(mLabelMessage.arg(mImportModule));
ui->renderLabel->setAlignment(Qt::AlignTrailing | Qt::AlignVCenter); ui->renderLabel->setAlignment(Qt::AlignTrailing | Qt::AlignVCenter);
} }
@ -415,12 +401,12 @@ void lcRenderDialog::on_RenderButton_clicked()
} }
else else
{ {
QString const BlenderLDrawConfigFile = lcGetProfileString(LC_PROFILE_BLENDER_LDRAW_CONFIG_PATH); const QString BlenderLDrawConfigFile = lcGetProfileString(LC_PROFILE_BLENDER_LDRAW_CONFIG_PATH);
QString const BlenderImportModule = lcGetProfileString(LC_PROFILE_BLENDER_IMPORT_MODULE); const QString BlenderImportModule = lcGetProfileString(LC_PROFILE_BLENDER_IMPORT_MODULE);
if (!QFileInfo(BlenderLDrawConfigFile).isReadable() && !BlenderImportModule.isEmpty()) if (!QFileInfo(BlenderLDrawConfigFile).isReadable() && !BlenderImportModule.isEmpty())
lcBlenderPreferences::SaveSettings(); lcBlenderPreferences::SaveSettings();
QString const Option = mCommand == OPEN_IN_BLENDER ? tr("import") : tr("render"); const QString Option = mCommand == OPEN_IN_BLENDER ? tr("import") : tr("render");
ui->renderLabel->setText(tr("Saving Blender %1 model...").arg(Option)); ui->renderLabel->setText(tr("Saving Blender %1 model...").arg(Option));
@ -431,10 +417,10 @@ void lcRenderDialog::on_RenderButton_clicked()
const QStringList DataPathList = QStandardPaths::standardLocations(QStandardPaths::DataLocation); const QStringList DataPathList = QStandardPaths::standardLocations(QStandardPaths::DataLocation);
mDataPath = DataPathList.first(); mDataPath = DataPathList.first();
QString const DefaultBlendFile = QString("%1/blender/config/%2").arg(mDataPath).arg(LC_BLENDER_ADDON_BLEND_FILE); const QString DefaultBlendFile = QString("%1/blender/config/%2").arg(mDataPath).arg(LC_BLENDER_ADDON_BLEND_FILE);
lcModel* Model = lcGetActiveProject()->GetActiveModel(); lcModel* Model = lcGetActiveProject()->GetActiveModel();
QString const ModelFileName = QFileInfo(QDir(lcGetProfileString(LC_PROFILE_PROJECTS_PATH)), QString("%1_Step_%2.ldr").arg(QFileInfo(Model->GetProperties().mFileName).baseName()).arg(Model->GetCurrentStep())).absoluteFilePath(); const QString ModelFileName = QFileInfo(QDir(lcGetProfileString(LC_PROFILE_PROJECTS_PATH)), QString("%1_Step_%2.ldr").arg(QFileInfo(Model->GetProperties().mFileName).baseName()).arg(Model->GetCurrentStep())).absoluteFilePath();
lcGetActiveProject()->ExportCurrentStep(ModelFileName); lcGetActiveProject()->ExportCurrentStep(ModelFileName);
@ -507,9 +493,7 @@ void lcRenderDialog::on_RenderButton_clicked()
} }
else else
{ {
QMessageBox::warning(this, tr("Error"), tr("Cannot write Blender render script file [%1] %2.") QMessageBox::warning(this, tr("Error"), tr("Cannot write Blender render script file [%1] %2.").arg(Script.fileName()).arg(Script.errorString()));
.arg(Script.fileName())
.arg(Script.errorString()));
gMainWindow->mActions[LC_FILE_RENDER_BLENDER]->setEnabled(true); gMainWindow->mActions[LC_FILE_RENDER_BLENDER]->setEnabled(true);
return; return;
@ -527,7 +511,7 @@ void lcRenderDialog::on_RenderButton_clicked()
connect(mProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(ReadStdOut())); connect(mProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(ReadStdOut()));
QString const LDrawLibPath = QFileInfo(lcGetProfileString(LC_PROFILE_PARTS_LIBRARY)).absolutePath(); const QString LDrawLibPath = QFileInfo(lcGetProfileString(LC_PROFILE_PARTS_LIBRARY)).absolutePath();
QStringList SystemEnvironment = QProcess::systemEnvironment(); QStringList SystemEnvironment = QProcess::systemEnvironment();
SystemEnvironment.prepend("LDRAW_DIRECTORY=" + LDrawLibPath); SystemEnvironment.prepend("LDRAW_DIRECTORY=" + LDrawLibPath);
@ -563,8 +547,8 @@ void lcRenderDialog::on_RenderButton_clicked()
if (Log.open(QFile::ReadOnly | QFile::Text)) if (Log.open(QFile::ReadOnly | QFile::Text))
{ {
QByteArray Ba = Log.readAll(); QByteArray Ba = Log.readAll();
bool const Error = QString(Ba).contains(QRegExp("(?:\\w)*ERROR: ", Qt::CaseInsensitive)); const bool Error = QString(Ba).contains(QRegExp("(?:\\w)*ERROR: ", Qt::CaseInsensitive));
bool const Warning = QString(Ba).contains(QRegExp("(?:\\w)*WARNING: ", Qt::CaseInsensitive)); const bool Warning = QString(Ba).contains(QRegExp("(?:\\w)*WARNING: ", Qt::CaseInsensitive));
if (Error || Warning) if (Error || Warning)
{ {
QMessageBox::Icon Icon = QMessageBox::Warning; QMessageBox::Icon Icon = QMessageBox::Warning;
@ -593,8 +577,7 @@ void lcRenderDialog::on_RenderButton_clicked()
{ {
ui->RenderButton->setText(tr("Cancel")); ui->RenderButton->setText(tr("Cancel"));
ui->RenderProgress->setValue(ui->RenderProgress->minimum()); ui->RenderProgress->setValue(ui->RenderProgress->minimum());
ui->renderLabel->setText(tr("Loading LDraw model... %1") ui->renderLabel->setText(tr("Loading LDraw model... %1").arg(ElapsedTime(mRenderTime.elapsed())));
.arg(ElapsedTime(mRenderTime.elapsed())));
QApplication::processEvents(); QApplication::processEvents();
} }
else else
@ -689,9 +672,7 @@ QString lcRenderDialog::ReadStdErr(bool& HasError) const
if (! File.open(QFile::ReadOnly | QFile::Text)) if (! File.open(QFile::ReadOnly | QFile::Text))
{ {
QString message = tr("Failed to open log file: %1:\n%2") const QString message = tr("Failed to open log file: %1:\n%2").arg(File.fileName()).arg(File.errorString());
.arg(File.fileName())
.arg(File.errorString());
return message; return message;
} }
@ -810,8 +791,6 @@ void lcRenderDialog::Update()
ui->RenderProgress->setValue(ui->RenderProgress->maximum()); ui->RenderProgress->setValue(ui->RenderProgress->maximum());
ui->preview->SetImage(mImage.scaled(mPreviewWidth, mPreviewHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation)); ui->preview->SetImage(mImage.scaled(mPreviewWidth, mPreviewHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation));
/*ui->preview->SetImage(mImage);*/
#endif #endif
} }
} }
@ -831,8 +810,8 @@ void lcRenderDialog::ShowResult()
ui->RenderProgress->setRange(0,1); ui->RenderProgress->setRange(0,1);
ui->RenderProgress->setValue(0); ui->RenderProgress->setValue(0);
QString const Title = mCommand == BLENDER_RENDER ? tr("Blender Render") : tr("POV-Ray Render"); const QString Title = mCommand == BLENDER_RENDER ? tr("Blender Render") : tr("POV-Ray Render");
QString const Body = tr ("An error occurred while rendering. See Show Details..."); const QString Body = tr ("An error occurred while rendering. See Show Details...");
lcBlenderPreferences::ShowMessage(Body, Title, QString(), StdErrLog, 0, QMessageBox::Warning); lcBlenderPreferences::ShowMessage(Body, Title, QString(), StdErrLog, 0, QMessageBox::Warning);
return; return;
} }
@ -886,8 +865,7 @@ void lcRenderDialog::ShowResult()
{ {
ui->renderLabel->setStyleSheet("QLabel { color : red; }"); ui->renderLabel->setStyleSheet("QLabel { color : red; }");
ui->renderLabel->setText(tr("Image render failed.")); ui->renderLabel->setText(tr("Image render failed."));
QString const Message = QString("%1 %2. %3").arg(RenderLabel).arg(tr("failed (unknown reason)")) const QString Message = QString("%1 %2. %3").arg(RenderLabel).arg(tr("failed (unknown reason)")).arg(ElapsedTime(mRenderTime.elapsed()));
.arg(ElapsedTime(mRenderTime.elapsed()));
QMessageBox::warning(this, tr("Error"), Message); QMessageBox::warning(this, tr("Error"), Message);
} }
@ -896,7 +874,7 @@ void lcRenderDialog::ShowResult()
void lcRenderDialog::on_OutputBrowseButton_clicked() void lcRenderDialog::on_OutputBrowseButton_clicked()
{ {
QString Result = QFileDialog::getSaveFileName(this, tr("Select Output File"), ui->OutputEdit->text(), tr("Supported Image Files (*.bmp *.png *.jpg);;BMP Files (*.bmp);;PNG Files (*.png);;JPEG Files (*.jpg);;All Files (*.*)")); const QString Result = QFileDialog::getSaveFileName(this, tr("Select Output File"), ui->OutputEdit->text(), tr("Supported Image Files (*.bmp *.png *.jpg);;BMP Files (*.bmp);;PNG Files (*.png);;JPEG Files (*.jpg);;All Files (*.*)"));
if (!Result.isEmpty()) if (!Result.isEmpty())
ui->OutputEdit->setText(QDir::toNativeSeparators(Result)); ui->OutputEdit->setText(QDir::toNativeSeparators(Result));
@ -904,12 +882,11 @@ void lcRenderDialog::on_OutputBrowseButton_clicked()
void lcRenderDialog::on_RenderOutputButton_clicked() void lcRenderDialog::on_RenderOutputButton_clicked()
{ {
QString RenderType = mCommand == POVRAY_RENDER ? QLatin1String("POV-Ray") : QLatin1String("Blender"); const QString RenderType = mCommand == POVRAY_RENDER ? QLatin1String("POV-Ray") : QLatin1String("Blender");
QFileInfo FileInfo(GetStdOutFileName()); QFileInfo FileInfo(GetStdOutFileName());
if (!FileInfo.exists()) if (!FileInfo.exists())
{ {
QMessageBox::warning(this, tr("Error"), tr("%1 Standard output file not found: %2.") QMessageBox::warning(this, tr("Error"), tr("%1 Standard output file not found: %2.").arg(RenderType).arg(FileInfo.absoluteFilePath()));
.arg(RenderType).arg(FileInfo.absoluteFilePath()));
return; return;
} }