/*
Copyright (C) 2014 Sebastian Herbord. All rights reserved.
This file is part of Base Preview plugin for MO
Base Preview plugin is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Base Preview plugin is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Base Preview plugin. If not, see .
*/
#include "previewbase.h"
#include
#include
#include
#include
#include
#include
#include
#include
using namespace MOBase;
PreviewBase::PreviewBase() : m_MOInfo(nullptr) {}
bool PreviewBase::init(IOrganizer* moInfo)
{
m_MOInfo = moInfo;
const QStringList& blacklist =
m_MOInfo->pluginSetting(name(), "blacklisted_extensions")
.toString()
.toLower()
.split(',');
// set up image reader to be used for all image types qt (the current installation)
// supports
auto imageReader =
std::bind(&PreviewBase::genImagePreview, this, std::placeholders::_1,
std::placeholders::_2, std::placeholders::_3);
foreach (const QByteArray& fileType, QImageReader::supportedImageFormats()) {
auto strFileType = QString(fileType).toLower();
// skip dds as that one is handled by the dds preview plugin.
if (strFileType == "dds" || blacklist.contains(strFileType))
continue;
m_PreviewGenerators[strFileType] = imageReader;
}
const QStringList supportedTextFormats = {"txt", "ini", "json", "log", "cfg", "psc"};
auto textReader = std::bind(&PreviewBase::genTxtPreview, this, std::placeholders::_1,
std::placeholders::_2, std::placeholders::_3);
foreach (const QString fileType, supportedTextFormats) {
// skip blacklisted ones
if (blacklist.contains(fileType))
continue;
m_PreviewGenerators[fileType] = textReader;
}
return true;
}
QString PreviewBase::name() const
{
return "Preview Base";
}
QString PreviewBase::localizedName() const
{
return tr("Preview Base");
}
QString PreviewBase::author() const
{
return "Tannin";
}
QString PreviewBase::description() const
{
return tr("Supports previewing various types of data files");
}
MOBase::VersionInfo PreviewBase::version() const
{
return VersionInfo(1, 1, 0, VersionInfo::RELEASE_FINAL);
}
QList PreviewBase::settings() const
{
QList result;
result.push_back(PluginSetting(
"enabled",
tr("Enable previewing of basic file types, such as images and text files."),
QVariant(true)));
result.push_back(
PluginSetting("blacklisted_extensions",
tr("Specify a list of comma separated extensions (without \".\") "
"that should not be previewed by this plugin."),
QVariant("")));
return result;
}
std::set PreviewBase::supportedExtensions() const
{
std::set extensions;
for (const auto& generator : m_PreviewGenerators) {
extensions.insert(generator.first);
}
return extensions;
}
QWidget* PreviewBase::genFilePreview(const QString& fileName,
const QSize& maxSize) const
{
return genDataPreview(nullptr, fileName, maxSize);
}
QWidget* PreviewBase::genDataPreview(const QByteArray& fileData,
const QString& fileName,
const QSize& maxSize) const
{
auto iter = m_PreviewGenerators.find(QFileInfo(fileName).suffix().toLower());
if (iter != m_PreviewGenerators.end()) {
return iter->second(fileName, maxSize, fileData);
} else {
return nullptr;
}
}
QWidget* PreviewBase::genImagePreview(const QString& fileName, const QSize&,
const QByteArray& fileData) const
{
QLabel* label = new QLabel();
QPixmap pic;
if (fileData == nullptr) {
pic = QPixmap(fileName);
} else {
pic.loadFromData(fileData);
}
QSize screenSize = QApplication::primaryScreen()->geometry().size();
// ensure the output image is no more than 80% of the screen height.
// If the aspect ratio is higher than that of the screen this would still allow the
// image to extend beyond the screen but it ensures you can drag the window and close
// it
int maxHeight = static_cast(screenSize.height() * 0.8f);
if (pic.size().height() > maxHeight) {
pic = pic.scaledToHeight(maxHeight, Qt::SmoothTransformation);
}
label->setPixmap(pic);
return label;
}
QWidget* PreviewBase::genTxtPreview(const QString& fileName, const QSize&,
const QByteArray& fileData) const
{
QTextEdit* edit = new QTextEdit();
if (fileData == nullptr) {
edit->setText(MOBase::readFileText(fileName));
} else {
edit->setText(MOBase::decodeTextData(fileData));
}
edit->setReadOnly(true);
return edit;
}
#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
Q_EXPORT_PLUGIN2(previewBase, PreviewBase)
#endif