aboutsummaryrefslogtreecommitdiff
path: root/libs/preview_nif/src/PreviewNif.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/preview_nif/src/PreviewNif.cpp')
-rw-r--r--libs/preview_nif/src/PreviewNif.cpp114
1 files changed, 114 insertions, 0 deletions
diff --git a/libs/preview_nif/src/PreviewNif.cpp b/libs/preview_nif/src/PreviewNif.cpp
new file mode 100644
index 0000000..8e7e03a
--- /dev/null
+++ b/libs/preview_nif/src/PreviewNif.cpp
@@ -0,0 +1,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;
+}