1 #include "lc_global.h"
2 #include "lc_partpalettedialog.h"
3 #include "ui_lc_partpalettedialog.h"
4 #include "lc_partselectionwidget.h"
5 #include "lc_setsdatabasedialog.h"
6 
lcPartPaletteDialog(QWidget * Parent,std::vector<lcPartPalette> & PartPalettes)7 lcPartPaletteDialog::lcPartPaletteDialog(QWidget* Parent, std::vector<lcPartPalette>& PartPalettes)
8 	: QDialog(Parent), ui(new Ui::lcPartPaletteDialog), mPartPalettes(PartPalettes)
9 {
10     ui->setupUi(this);
11 
12 	for (const lcPartPalette& Palette : PartPalettes)
13 	{
14 		QListWidgetItem* Item = new QListWidgetItem(Palette.Name);
15 		Item->setData(Qt::UserRole, QVariant::fromValue<uintptr_t>(reinterpret_cast<uintptr_t>(&Palette)));
16 		ui->PaletteList->addItem(Item);
17 	}
18 
19 	ui->PaletteList->setCurrentRow(0);
20 	UpdateButtons();
21 }
22 
~lcPartPaletteDialog()23 lcPartPaletteDialog::~lcPartPaletteDialog()
24 {
25 	for (lcPartPalette* Palette : mImportedPalettes)
26 		delete Palette;
27 
28 	delete ui;
29 }
30 
UpdateButtons()31 void lcPartPaletteDialog::UpdateButtons()
32 {
33 	int CurrentPalette = ui->PaletteList->currentRow();
34 	int PaletteCount = ui->PaletteList->count();
35 
36 	ui->DeleteButton->setEnabled(PaletteCount > 1);
37 	ui->MoveUpButton->setEnabled(PaletteCount > 1 && CurrentPalette > 0);
38 	ui->MoveDownButton->setEnabled(PaletteCount > 1 && CurrentPalette < PaletteCount - 1);
39 }
40 
accept()41 void lcPartPaletteDialog::accept()
42 {
43 	std::vector<lcPartPalette> PartPalettes;
44 	PartPalettes.reserve(ui->PaletteList->count());
45 
46 	for (int ItemIdx = 0; ItemIdx < ui->PaletteList->count(); ItemIdx++)
47 	{
48 		QListWidgetItem* Item = ui->PaletteList->item(ItemIdx);
49 		lcPartPalette* OldPalette = reinterpret_cast<lcPartPalette*>(Item->data(Qt::UserRole).value<uintptr_t>());
50 
51 		lcPartPalette Palette;
52 		Palette.Name = Item->text();
53 		if (OldPalette)
54 			Palette.Parts = std::move(OldPalette->Parts);
55 
56 		PartPalettes.emplace_back(std::move(Palette));
57 	}
58 
59 	mPartPalettes = std::move(PartPalettes);
60 
61 	QDialog::accept();
62 }
63 
on_NewButton_clicked()64 void lcPartPaletteDialog::on_NewButton_clicked()
65 {
66 	bool Ok = false;
67 
68 	QString Name = QInputDialog::getText(this, tr("New Part Palette"), tr("Palette Name:"), QLineEdit::Normal, QString(), &Ok);
69 
70 	if (!Ok || Name.isEmpty())
71 		return;
72 
73 	QListWidgetItem* Item = new QListWidgetItem(Name);
74 	Item->setData(Qt::UserRole, QVariant::fromValue<uintptr_t>(0));
75 	ui->PaletteList->addItem(Item);
76 	ui->PaletteList->setCurrentRow(ui->PaletteList->count() - 1);
77 	UpdateButtons();
78 }
79 
on_DeleteButton_clicked()80 void lcPartPaletteDialog::on_DeleteButton_clicked()
81 {
82 	QList<QListWidgetItem*>	SelectedItems = ui->PaletteList->selectedItems();
83 
84 	if (SelectedItems.isEmpty())
85 		return;
86 
87 	QString Prompt = tr("Are you sure you want to delete the palette '%1'?").arg(SelectedItems[0]->text());
88 	if (QMessageBox::question(this, tr("Delete Part Palette"), Prompt, QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes)
89 		return;
90 
91 	QListWidgetItem* SelectedItem = SelectedItems.first();
92 
93 	delete SelectedItem;
94 	UpdateButtons();
95 }
96 
on_RenameButton_clicked()97 void lcPartPaletteDialog::on_RenameButton_clicked()
98 {
99 	QList<QListWidgetItem*>	SelectedItems = ui->PaletteList->selectedItems();
100 
101 	if (SelectedItems.isEmpty())
102 		return;
103 
104 	bool Ok = false;
105 
106 	QString Name = SelectedItems[0]->text();
107 	Name = QInputDialog::getText(this, tr("Rename Part Palette"), tr("Palette Name:"), QLineEdit::Normal, Name, &Ok);
108 
109 	if (!Ok || Name.isEmpty())
110 		return;
111 
112 	if (!Name.isEmpty())
113 		SelectedItems[0]->setText(Name);
114 }
115 
on_ImportButton_clicked()116 void lcPartPaletteDialog::on_ImportButton_clicked()
117 {
118 	lcSetsDatabaseDialog Dialog(this);
119 
120 	if (Dialog.exec() != QDialog::Accepted)
121 		return;
122 
123 	lcPartPalette* Palette = new lcPartPalette;
124 	Palette->Name = Dialog.GetSetDescription();
125 	mImportedPalettes.push_back(Palette);
126 
127 	QByteArray Inventory = Dialog.GetSetInventory();
128 	QJsonDocument Document = QJsonDocument::fromJson(Inventory);
129 	QJsonObject Root = Document.object();
130 	QJsonArray Parts = Root["results"].toArray();
131 
132 	for (const QJsonValue& Part : Parts)
133 	{
134 		QJsonObject PartObject = Part.toObject();
135 		QByteArray PartID = PartObject["part"].toObject()["part_num"].toString().toLatin1();
136 		QJsonArray PartIDArray = PartObject["part"].toObject()["external_ids"].toObject()["LDraw"].toArray();
137 		if (!PartIDArray.isEmpty())
138 			PartID = PartIDArray.first().toString().toLatin1();
139 
140 		Palette->Parts.push_back(PartID.toUpper().toStdString() + ".DAT");
141 	}
142 
143 	QListWidgetItem* Item = new QListWidgetItem(Palette->Name);
144 	Item->setData(Qt::UserRole, QVariant::fromValue<uintptr_t>(reinterpret_cast<uintptr_t>(Palette)));
145 	ui->PaletteList->addItem(Item);
146 	ui->PaletteList->setCurrentRow(ui->PaletteList->count() - 1);
147 	UpdateButtons();
148 }
149 
on_MoveUpButton_clicked()150 void lcPartPaletteDialog::on_MoveUpButton_clicked()
151 {
152 	QList<QListWidgetItem*>	SelectedItems = ui->PaletteList->selectedItems();
153 
154 	if (SelectedItems.isEmpty())
155 		return;
156 
157 	QListWidgetItem* Item = SelectedItems[0];
158 	int Row = ui->PaletteList->row(Item);
159 
160 	if (Row == 0)
161 		return;
162 
163 	ui->PaletteList->takeItem(Row);
164 	ui->PaletteList->insertItem(Row - 1, Item);
165 	ui->PaletteList->setCurrentItem(Item);
166 	UpdateButtons();
167 }
168 
on_MoveDownButton_clicked()169 void lcPartPaletteDialog::on_MoveDownButton_clicked()
170 {
171 	QList<QListWidgetItem*>	SelectedItems = ui->PaletteList->selectedItems();
172 
173 	if (SelectedItems.isEmpty())
174 		return;
175 
176 	QListWidgetItem* Item = SelectedItems[0];
177 	int Row = ui->PaletteList->row(Item);
178 
179 	ui->PaletteList->takeItem(Row);
180 	ui->PaletteList->insertItem(Row + 1, Item);
181 	ui->PaletteList->setCurrentItem(Item);
182 	UpdateButtons();
183 }
184 
on_PaletteList_currentRowChanged(int CurrentRow)185 void lcPartPaletteDialog::on_PaletteList_currentRowChanged(int CurrentRow)
186 {
187 	Q_UNUSED(CurrentRow);
188 
189 	UpdateButtons();
190 }
191