aboutsummaryrefslogtreecommitdiff
path: root/libs/preview_nif/src/PreviewNif.cpp
blob: dfb14a16dff919d1704d77d941a288270f998c86 (plain)
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("%s", 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("%s", 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;
}