XPlor/app/zonefileviewer.cpp

159 lines
6.0 KiB
C++
Raw Permalink Normal View History

2025-02-08 19:58:54 -05:00
#include "zonefileviewer.h"
#include "ui_zonefileviewer.h"
#include "statusbarmanager.h"
2025-02-08 19:58:54 -05:00
ZoneFileViewer::ZoneFileViewer(QWidget *parent)
: QWidget(parent)
2025-04-04 20:36:32 -04:00
, ui(new Ui::ZoneFileViewer) {
2025-02-08 19:58:54 -05:00
ui->setupUi(this);
2025-05-03 09:57:47 -04:00
mZoneFile = nullptr;
2025-02-08 19:58:54 -05:00
ui->tableWidget_RecordCounts->setColumnCount(3);
ui->tableWidget_RecordCounts->setHorizontalHeaderLabels({ "Identifier", "Asset", "Count" });
2025-02-08 19:58:54 -05:00
ui->tableWidget_RecordCounts->horizontalHeader()->setStretchLastSection(true);
ui->tableWidget_RecordOrder->setColumnCount(3);
ui->tableWidget_RecordOrder->setHorizontalHeaderLabels({ "Identifier", "Asset", "Count" });
2025-02-08 19:58:54 -05:00
ui->tableWidget_RecordOrder->horizontalHeader()->setStretchLastSection(true);
2025-05-03 09:57:47 -04:00
connect(ui->lineEdit_TagSearch, &QLineEdit::textChanged, this, &ZoneFileViewer::SortTags);
connect(ui->tableWidget_RecordCounts, &QTableWidget::itemSelectionChanged, this, &ZoneFileViewer::HighlightRecordInOrder);
connect(ui->listWidget_Tags, &QListWidget::currentTextChanged, this, [this](const QString &aCurrentText) {
StatusBarManager::instance().updateStatus(QString("Selected tag '%1' with index %2").arg(aCurrentText).arg(mZoneFile->GetTags().indexOf(aCurrentText)));
});
2025-02-08 19:58:54 -05:00
}
2025-04-04 20:36:32 -04:00
ZoneFileViewer::~ZoneFileViewer() {
2025-02-08 19:58:54 -05:00
delete ui;
}
2025-05-03 09:57:47 -04:00
void ZoneFileViewer::HighlightRecordInOrder() {
ui->tableWidget_RecordOrder->clearSelection();
foreach (auto selectedItem, ui->tableWidget_RecordCounts->selectedItems()) {
int selectedRow = selectedItem->row();
const QString assetId = ui->tableWidget_RecordCounts->item(selectedRow, 0)->text();
for (int i = 0; i < ui->tableWidget_RecordOrder->rowCount(); i++) {
const QString testAssetId = ui->tableWidget_RecordOrder->item(i, 0)->text();
if (testAssetId != assetId) { continue; }
ui->tableWidget_RecordOrder->selectRow(i);
ui->tableWidget_RecordOrder->item(i, 0)->setSelected(true);
ui->tableWidget_RecordOrder->item(i, 1)->setSelected(true);
ui->tableWidget_RecordOrder->item(i, 2)->setSelected(true);
ui->tableWidget_RecordOrder->item(i, 3)->setSelected(true);
}
}
}
void ZoneFileViewer::SortTags(const QString &aSearchText) {
ui->listWidget_Tags->clear();
const QStringList tags = mZoneFile->GetTags();
if (aSearchText.isEmpty()) {
ui->listWidget_Tags->addItems(tags);
return;
}
QStringList sortedTags;
foreach (const QString tag, tags) {
if (tag.contains(aSearchText)) {
sortedTags << tag;
}
}
StatusBarManager::instance().updateStatus(QString("Found %1 tags.").arg(sortedTags.size()));
2025-05-03 09:57:47 -04:00
ui->listWidget_Tags->addItems(sortedTags);
}
2025-02-08 19:58:54 -05:00
void ZoneFileViewer::SetZoneFile(std::shared_ptr<ZoneFile> aZoneFile) {
2025-05-03 09:57:47 -04:00
mZoneFile = aZoneFile;
2025-04-04 20:36:32 -04:00
ui->tableWidget_RecordCounts->clearContents();
ui->tableWidget_RecordOrder->clearContents();
2025-02-08 19:58:54 -05:00
ui->listWidget_Tags->clear();
2025-05-03 09:57:47 -04:00
const QStringList tags = mZoneFile->GetTags();
2025-02-08 19:58:54 -05:00
ui->listWidget_Tags->addItems(tags);
ui->label_Title->setText(mZoneFile->GetBaseStem() + ".zone");
ui->groupBox_Tags->setTitle(QString("Tags (%1)").arg(tags.size()));
2025-02-08 19:58:54 -05:00
if (tags.isEmpty()) {
ui->groupBox_Tags->hide();
} else {
ui->groupBox_Tags->show();
}
QMap<QString, int> recordCounts = QMap<QString, int>();
2025-05-03 09:57:47 -04:00
QVector<QPair<QString, int>> assetOccurances = QVector<QPair<QString, int>>();
for (const QString &record : mZoneFile->GetRecords()) {
2025-02-08 19:58:54 -05:00
if (!recordCounts.contains(record)) {
recordCounts[record] = 0;
}
recordCounts[record]++;
2025-05-03 09:57:47 -04:00
if (!assetOccurances.isEmpty() && assetOccurances.last().first == record) {
assetOccurances.last().second++;
continue;
}
QPair<QString, int> assetOccurance(record, 1);
assetOccurances << assetOccurance;
}
ui->tableWidget_RecordOrder->setRowCount(assetOccurances.size());
int assetIndex = 0;
foreach (auto assetOccurance, assetOccurances) {
const QString record = assetOccurance.first;
2025-07-10 00:04:52 -04:00
Utils::AssetType assetType = mZoneFile->AssetStrToEnum(record);
2025-05-03 09:57:47 -04:00
int assetCount = assetOccurance.second;
2025-07-10 00:04:52 -04:00
QIcon assetIcon = Utils::CreateAssetIcon(assetType);
2025-04-04 20:36:32 -04:00
if (assetIcon.isNull()) {
qDebug() << "Icon is null for record: " << record;
}
2025-05-03 09:57:47 -04:00
QTableWidgetItem *recordItem = new QTableWidgetItem(record.toUpper());
2025-07-10 00:04:52 -04:00
QTableWidgetItem *recordStrItem = new QTableWidgetItem(Utils::AssetTypeToStr(assetType));
2025-05-03 09:57:47 -04:00
QTableWidgetItem *recordCountItem = new QTableWidgetItem(QString::number(assetCount));
recordItem->setIcon(assetIcon);
2025-02-08 19:58:54 -05:00
2025-05-03 09:57:47 -04:00
ui->tableWidget_RecordOrder->setItem(assetIndex, 0, recordItem);
ui->tableWidget_RecordOrder->setItem(assetIndex, 1, recordStrItem);
ui->tableWidget_RecordOrder->setItem(assetIndex, 2, recordCountItem);
2025-02-08 19:58:54 -05:00
2025-05-03 09:57:47 -04:00
assetIndex++;
}
2025-02-08 19:58:54 -05:00
int recordIndex = 0;
for (const QString &record : recordCounts.keys()) {
int recordCount = recordCounts[record];
2025-02-19 19:17:31 -05:00
2025-07-10 00:04:52 -04:00
Utils::AssetType assetType = mZoneFile->AssetStrToEnum(record);
QIcon assetIcon = Utils::CreateAssetIcon(assetType);
2025-04-04 20:36:32 -04:00
if (assetIcon.isNull()) {
qDebug() << "Icon is null for record: " << record;
}
2025-02-08 19:58:54 -05:00
ui->tableWidget_RecordCounts->setRowCount(recordIndex + 1);
2025-04-04 20:36:32 -04:00
QTableWidgetItem *recordItem = new QTableWidgetItem(record.toUpper());
2025-07-10 00:04:52 -04:00
QTableWidgetItem *recordCountStrItem = new QTableWidgetItem(Utils::AssetTypeToStr(assetType));
2025-02-08 19:58:54 -05:00
QTableWidgetItem *recordCountItem = new QTableWidgetItem(QString::number(recordCount));
recordItem->setIcon(assetIcon);
2025-02-08 19:58:54 -05:00
2025-04-04 20:36:32 -04:00
ui->tableWidget_RecordCounts->setItem(recordIndex, 0, recordItem);
ui->tableWidget_RecordCounts->setItem(recordIndex, 1, recordCountStrItem);
ui->tableWidget_RecordCounts->setItem(recordIndex, 2, recordCountItem);
2025-02-08 19:58:54 -05:00
recordIndex++;
}
2025-04-04 20:36:32 -04:00
ui->tableWidget_RecordOrder->resizeColumnsToContents();
ui->tableWidget_RecordCounts->resizeColumnsToContents();
2025-02-08 19:58:54 -05:00
}