Added option to duplicate submodels. Closes #502.

This commit is contained in:
Leonardo Zide
2020-09-07 11:29:37 -07:00
parent e41e9f7b73
commit 546eaf47cd
4 changed files with 142 additions and 44 deletions
+33 -19
View File
@@ -263,39 +263,53 @@ lcModel* Project::CreateNewModel(bool ShowModel)
void Project::ShowModelListDialog()
{
QList<QPair<QString, lcModel*>> Models;
#if (QT_VERSION >= QT_VERSION_CHECK(4, 7, 0))
Models.reserve(mModels.GetSize());
#endif
lcQModelListDialog Dialog(gMainWindow, mModels);
for (int ModelIdx = 0; ModelIdx < mModels.GetSize(); ModelIdx++)
{
lcModel* Model = mModels[ModelIdx];
Models.append(QPair<QString, lcModel*>(Model->GetProperties().mFileName, Model));
}
lcQModelListDialog Dialog(gMainWindow, Models);
if (Dialog.exec() != QDialog::Accepted || Models.isEmpty())
if (Dialog.exec() != QDialog::Accepted)
return;
lcArray<lcModel*> NewModels;
std::vector<lcModelListDialogEntry> Results = Dialog.GetResults();
for (QList<QPair<QString, lcModel*>>::iterator it = Models.begin(); it != Models.end(); it++)
for (const lcModelListDialogEntry& Entry : Results)
{
lcModel* Model = it->second;
lcModel* Model = Entry.ExistingModel;
if (!Model)
{
Model = new lcModel(it->first);
const lcModel* Source = Entry.DuplicateSource;
if (!Source)
{
Model = new lcModel(Entry.Name);
}
else
{
Model = new lcModel(Source->GetProperties().mFileName);
QByteArray File;
QTextStream SaveStream(&File);
Source->SaveLDraw(SaveStream, false);
SaveStream.flush();
QBuffer Buffer(&File);
Buffer.open(QIODevice::ReadOnly);
Model->LoadLDraw(Buffer, this);
Model->SetFileName(Entry.Name);
Model->CreatePieceInfo(this);
}
Model->CreatePieceInfo(this);
Model->SetSaved();
mModified = true;
}
else if (Model->GetProperties().mFileName != it->first)
else if (Model->GetProperties().mFileName != Entry.Name)
{
Model->SetFileName(it->first);
lcGetPiecesLibrary()->RenamePiece(Model->GetPieceInfo(), it->first.toLatin1().constData());
Model->SetFileName(Entry.Name);
lcGetPiecesLibrary()->RenamePiece(Model->GetPieceInfo(), Entry.Name.toLatin1().constData());
for (lcModel* CheckModel : mModels)
CheckModel->RenamePiece(Model->GetPieceInfo());
+86 -19
View File
@@ -3,18 +3,25 @@
#include "ui_lc_qmodellistdialog.h"
#include "project.h"
#include "lc_profile.h"
#include "lc_model.h"
lcQModelListDialog::lcQModelListDialog(QWidget* Parent, QList<QPair<QString, lcModel*>>& Models)
: QDialog(Parent), mModels(Models), ui(new Ui::lcQModelListDialog)
enum class lcModelListRole
{
ExistingModel = Qt::UserRole,
DuplicateModel
};
lcQModelListDialog::lcQModelListDialog(QWidget* Parent, const lcArray<lcModel*> Models)
: QDialog(Parent), ui(new Ui::lcQModelListDialog)
{
mActiveModelItem = nullptr;
ui->setupUi(this);
for (QList<QPair<QString, lcModel*>>::iterator it = Models.begin(); it != Models.end(); it++)
for (const lcModel* Model : Models)
{
QListWidgetItem* Item = new QListWidgetItem(it->first);
Item->setData(Qt::UserRole, QVariant::fromValue<uintptr_t>((uintptr_t)it->second));
QListWidgetItem* Item = new QListWidgetItem(Model->GetProperties().mFileName);
Item->setData(static_cast<int>(lcModelListRole::ExistingModel), QVariant::fromValue<uintptr_t>((uintptr_t)Model));
ui->ModelList->addItem(Item);
}
@@ -36,6 +43,27 @@ int lcQModelListDialog::GetActiveModelIndex() const
return ui->ModelList->row(mActiveModelItem);
}
std::vector<lcModelListDialogEntry> lcQModelListDialog::GetResults() const
{
std::vector<lcModelListDialogEntry> Models;
Models.reserve(ui->ModelList->count());
for (int ItemIdx = 0; ItemIdx < ui->ModelList->count(); ItemIdx++)
{
QListWidgetItem* Item = ui->ModelList->item(ItemIdx);
lcModelListDialogEntry Entry;
Entry.Name = Item->text();
Entry.ExistingModel = reinterpret_cast<lcModel*>(Item->data(static_cast<int>(lcModelListRole::ExistingModel)).value<uintptr_t>());
Entry.DuplicateSource = reinterpret_cast<lcModel*>(Item->data(static_cast<int>(lcModelListRole::DuplicateModel)).value<uintptr_t>());
Models.emplace_back(Entry);
}
return Models;
}
void lcQModelListDialog::UpdateButtons()
{
int ModelCount = ui->ModelList->count();
@@ -66,14 +94,6 @@ void lcQModelListDialog::UpdateButtons()
void lcQModelListDialog::accept()
{
mModels.clear();
for (int ItemIdx = 0; ItemIdx < ui->ModelList->count(); ItemIdx++)
{
QListWidgetItem* Item = ui->ModelList->item(ItemIdx);
mModels.append(QPair<QString, lcModel*>(Item->text(), (lcModel*)Item->data(Qt::UserRole).value<uintptr_t>()));
}
if (ui->SetActiveModel->isChecked())
mActiveModelItem = ui->ModelList->currentItem();
@@ -96,7 +116,6 @@ void lcQModelListDialog::on_NewModel_clicked()
return;
QListWidgetItem* Item = new QListWidgetItem(Name);
Item->setData(Qt::UserRole, QVariant::fromValue<uintptr_t>(0));
ui->ModelList->addItem(Item);
UpdateButtons();
}
@@ -174,12 +193,17 @@ void lcQModelListDialog::on_ExportModel_clicked()
if (SelectedItems.size() == 1)
{
QListWidgetItem* CurrentItem = SelectedItems[0];
lcModel* Model = (lcModel*)CurrentItem->data(Qt::UserRole).value<uintptr_t>();
lcModel* Model = (lcModel*)CurrentItem->data(static_cast<int>(lcModelListRole::ExistingModel)).value<uintptr_t>();
if (!Model)
{
QMessageBox::information(this, tr("LeoCAD"), tr("Nothing to export."));
return;
Model = (lcModel*)CurrentItem->data(static_cast<int>(lcModelListRole::DuplicateModel)).value<uintptr_t>();
if (!Model)
{
QMessageBox::information(this, tr("LeoCAD"), tr("Nothing to export."));
return;
}
}
QString SaveFileName = QFileInfo(QDir(lcGetProfileString(LC_PROFILE_PROJECTS_PATH)), CurrentItem->text()).absoluteFilePath();
@@ -195,11 +219,14 @@ void lcQModelListDialog::on_ExportModel_clicked()
}
else
{
QString Folder = QFileDialog::getExistingDirectory(this, tr("Select Parts Library Folder"), lcGetProfileString(LC_PROFILE_PROJECTS_PATH));
QString Folder = QFileDialog::getExistingDirectory(this, tr("Select Export Folder"), lcGetProfileString(LC_PROFILE_PROJECTS_PATH));
for (QListWidgetItem* CurrentItem : SelectedItems)
{
lcModel* Model = (lcModel*)CurrentItem->data(Qt::UserRole).value<uintptr_t>();
lcModel* Model = (lcModel*)CurrentItem->data(static_cast<int>(lcModelListRole::ExistingModel)).value<uintptr_t>();
if (!Model)
Model = (lcModel*)CurrentItem->data(static_cast<int>(lcModelListRole::DuplicateModel)).value<uintptr_t>();
if (Model)
{
@@ -212,6 +239,46 @@ void lcQModelListDialog::on_ExportModel_clicked()
}
}
void lcQModelListDialog::on_DuplicateModel_clicked()
{
QList<QListWidgetItem*> SelectedItems = ui->ModelList->selectedItems();
if (SelectedItems.isEmpty())
{
QMessageBox::information(this, tr("Duplicate Submodel"), tr("No submodel selected."));
return;
}
for (QListWidgetItem* CurrentItem : SelectedItems)
{
QStringList ModelNames;
for (int ItemIdx = 0; ItemIdx < ui->ModelList->count(); ItemIdx++)
ModelNames.append(ui->ModelList->item(ItemIdx)->text());
QString Name = CurrentItem->text();
do
{
Name = tr("Copy of ") + Name;
} while (ModelNames.contains(Name, Qt::CaseInsensitive));
Name = lcGetActiveProject()->GetNewModelName(this, tr("Duplicate Submodel"), Name, ModelNames);
if (Name.isEmpty())
continue;
QListWidgetItem* Item = new QListWidgetItem(Name);
uintptr_t ExistingModel = CurrentItem->data(static_cast<int>(lcModelListRole::ExistingModel)).value<uintptr_t>();
if (!ExistingModel)
ExistingModel = CurrentItem->data(static_cast<int>(lcModelListRole::DuplicateModel)).value<uintptr_t>();
Item->setData(static_cast<int>(lcModelListRole::DuplicateModel), QVariant::fromValue<uintptr_t>(ExistingModel));
ui->ModelList->addItem(Item);
}
UpdateButtons();
}
void lcQModelListDialog::on_MoveUp_clicked()
{
bool Blocked = ui->ModelList->blockSignals(true);
+14 -6
View File
@@ -1,22 +1,29 @@
#pragma once
#include <QDialog>
#include "lc_array.h"
namespace Ui {
class lcQModelListDialog;
namespace Ui
{
class lcQModelListDialog;
}
struct lcModelListDialogEntry
{
QString Name;
lcModel* ExistingModel;
lcModel* DuplicateSource;
};
class lcQModelListDialog : public QDialog
{
Q_OBJECT
public:
lcQModelListDialog(QWidget* Parent, QList<QPair<QString, lcModel*>>& Models);
lcQModelListDialog(QWidget* Parent, const lcArray<lcModel*> Models);
~lcQModelListDialog();
int GetActiveModelIndex() const;
QList<QPair<QString, lcModel*>>& mModels;
std::vector<lcModelListDialogEntry> GetResults() const;
public slots:
void accept() override;
@@ -24,6 +31,7 @@ public slots:
void on_DeleteModel_clicked();
void on_RenameModel_clicked();
void on_ExportModel_clicked();
void on_DuplicateModel_clicked();
void on_MoveUp_clicked();
void on_MoveDown_clicked();
void on_ModelList_itemDoubleClicked(QListWidgetItem* Item);
+9
View File
@@ -53,6 +53,13 @@
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="DuplicateModel">
<property name="text">
<string>Duplicate...</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="MoveUp">
<property name="text">
@@ -109,8 +116,10 @@
<tabstop>DeleteModel</tabstop>
<tabstop>RenameModel</tabstop>
<tabstop>ExportModel</tabstop>
<tabstop>DuplicateModel</tabstop>
<tabstop>MoveUp</tabstop>
<tabstop>MoveDown</tabstop>
<tabstop>SetActiveModel</tabstop>
</tabstops>
<resources/>
<connections>