1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
#include <NifFile.hpp>
#include "PreviewNif.h"
#include "NifExtensions.h"
#include "NifWidget.h"
#include <QGridLayout>
#include <filesystem>
#include <sstream>
#include <string>
bool PreviewNif::init(MOBase::IOrganizer* moInfo)
{
m_MOInfo = moInfo;
return true;
}
QString PreviewNif::name() const
{
return "Preview NIF";
}
QString PreviewNif::author() const
{
return "Parapets";
}
QString PreviewNif::description() const
{
return "Supports previewing NIF files";
}
MOBase::VersionInfo PreviewNif::version() const
{
return MOBase::VersionInfo(0, 2, 0, 0, MOBase::VersionInfo::RELEASE_BETA);
}
QList<MOBase::PluginSetting> PreviewNif::settings() const
{
return QList<MOBase::PluginSetting>();
}
bool PreviewNif::enabledByDefault() const
{
return true;
}
std::set<QString> PreviewNif::supportedExtensions() const
{
return { "bto", "btr", "nif" };
}
QWidget* PreviewNif::genFilePreview(const QString& fileName, const QSize&) const
{
auto path = std::filesystem::path(fileName.toStdString());
auto nifFile = std::make_shared<nifly::NifFile>(path);
if (!nifFile->IsValid()) {
qWarning(qUtf8Printable(tr("Failed to load file: %1").arg(fileName)));
return nullptr;
}
return makeWidget(nifFile);
}
QWidget* PreviewNif::genDataPreview(const QByteArray& fileData,
const QString& fileName, const QSize&) const
{
std::string data(fileData.constData(), fileData.size());
std::istringstream stream(std::move(data), std::ios::binary);
auto nifFile = std::make_shared<nifly::NifFile>();
if (nifFile->Load(stream) != 0 || !nifFile->IsValid()) {
qWarning(qUtf8Printable(tr("Failed to load file: %1").arg(fileName)));
return nullptr;
}
return makeWidget(nifFile);
}
QWidget* PreviewNif::makeWidget(std::shared_ptr<nifly::NifFile> nifFile) const
{
auto layout = new QGridLayout();
layout->setRowStretch(0, 1);
layout->setColumnStretch(0, 1);
layout->addWidget(makeLabel(nifFile.get()), 1, 0, 1, 1);
auto nifWidget = new NifWidget(nifFile, m_MOInfo);
layout->addWidget(nifWidget, 0, 0, 1, 1);
auto widget = new QWidget();
widget->setLayout(layout);
return widget;
}
QLabel* PreviewNif::makeLabel(nifly::NifFile* nifFile) const
{
int shapes = 0;
int faces = 0;
int verts = 0;
for (auto& shape : nifFile->GetShapes()) {
shapes++;
faces += shape->GetNumTriangles();
verts += shape->GetNumVertices();
}
auto text = tr("Verts: %1 | Faces: %2 | Shapes: %3").arg(verts).arg(faces).arg(shapes);
auto label = new QLabel(text);
label->setWordWrap(true);
label->setTextInteractionFlags(Qt::TextSelectableByMouse);
return label;
}
|