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