From db09b806b9e765b5cb49a9a80f74a4440fff3027 Mon Sep 17 00:00:00 2001 From: Tannin Date: Sun, 5 Jan 2014 18:50:56 +0100 Subject: - Mod Organizer can now display most image types (including dds) and txt files from the data tree, presenting a comparison of variants in case of overwritten files --- src/previewgenerator.cpp | 111 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 src/previewgenerator.cpp (limited to 'src/previewgenerator.cpp') diff --git a/src/previewgenerator.cpp b/src/previewgenerator.cpp new file mode 100644 index 00000000..5b0a44d8 --- /dev/null +++ b/src/previewgenerator.cpp @@ -0,0 +1,111 @@ +/* +Copyright (C) 2014 Sebastian Herbord. All rights reserved. + +This file is part of Mod Organizer. + +Mod Organizer 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. + +Mod Organizer 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 Mod Organizer. If not, see . +*/ + +#include "previewgenerator.h" +#include +#include +#include +#include +#include +#include +#include + +PreviewGenerator::PreviewGenerator() +{ + // set up image reader to be used for all image types qt (the current installation) supports + auto imageReader = std::bind(&PreviewGenerator::genImagePreview, this, std::placeholders::_1); + + foreach (const QByteArray &fileType, QImageReader::supportedImageFormats()) { + m_PreviewGenerators[QString(fileType).toLower()] = imageReader; + } + + m_PreviewGenerators["txt"] + = std::bind(&PreviewGenerator::genTxtPreview, this, std::placeholders::_1); + + m_PreviewGenerators["dds"] + = std::bind(&PreviewGenerator::genDDSPreview, this, std::placeholders::_1); + + QDesktopWidget desk; + m_MaxSize = desk.screenGeometry().size() * 0.8; +} + +bool PreviewGenerator::previewSupported(const QString &fileExtension) const +{ + return m_PreviewGenerators.find(fileExtension.toLower()) != m_PreviewGenerators.end(); +} + +QWidget *PreviewGenerator::genPreview(const QString &fileName) const +{ + auto iter = m_PreviewGenerators.find(QFileInfo(fileName).completeSuffix().toLower()); + if (iter != m_PreviewGenerators.end()) { + return iter->second(fileName); + } else { + return nullptr; + } +} + +QWidget *PreviewGenerator::genImagePreview(const QString &fileName) const +{ + QLabel *label = new QLabel(); + label->setPixmap(QPixmap(fileName)); + return label; +} + +QWidget *PreviewGenerator::genTxtPreview(const QString &fileName) const +{ + QTextEdit *edit = new QTextEdit(); + edit->setText(MOBase::readFileText(fileName)); + edit->setReadOnly(true); + return edit; +} + +QWidget *PreviewGenerator::genDDSPreview(const QString &fileName) const +{ + QGLWidget glWidget; + glWidget.makeCurrent(); + + GLuint texture = glWidget.bindTexture(fileName); + if (!texture) + return nullptr; + + // Determine the size of the DDS image + GLint width, height; + glBindTexture(GL_TEXTURE_2D, texture); + glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width); + glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height); + + if (width == 0 || height == 0) + return nullptr; + + QGLPixelBuffer pbuffer(QSize(width, height), glWidget.format(), &glWidget); + if (!pbuffer.makeCurrent()) + return nullptr; + + pbuffer.drawTexture(QRectF(-1, -1, 2, 2), texture); + + QLabel *label = new QLabel(); + QImage image = pbuffer.toImage(); + if ((image.size().width() > m_MaxSize.width()) || + (image.size().height() > m_MaxSize.height())) { + image = image.scaled(m_MaxSize, Qt::KeepAspectRatio); + } + + label->setPixmap(QPixmap::fromImage(image)); + return label; +} -- cgit v1.3.1 From 6ed82866b07414e91dfe0c47ee5f580bfd4fe479 Mon Sep 17 00:00:00 2001 From: Tannin Date: Tue, 14 Jan 2014 21:16:36 +0100 Subject: - moved code for file previews to plugins --- .hgignore | 7 +++++ src/mainwindow.cpp | 6 ++++ src/organizer.pro | 9 +----- src/pluginlist.cpp | 5 +++- src/previewgenerator.cpp | 76 +++++++----------------------------------------- src/previewgenerator.h | 6 ++-- src/version.rc | 4 +-- 7 files changed, 34 insertions(+), 79 deletions(-) (limited to 'src/previewgenerator.cpp') diff --git a/.hgignore b/.hgignore index a74e95aa..0e3fc185 100644 --- a/.hgignore +++ b/.hgignore @@ -13,3 +13,10 @@ source - Copy/* ModOrganizer-build-* pdbs/* source/NCC/BossDummy.x/* +*.ts +staging_prepare/* +staging_trans/* +tools/python_zip/* +Makefile +syntax: regexp +Makefile\.(Debug|Release) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 139db3f0..76bff3a0 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1017,6 +1017,12 @@ bool MainWindow::registerPlugin(QObject *plugin, const QString &fileName) return true; } } + { // preview plugins + IPluginPreview *preview = qobject_cast(plugin); + if (verifyPlugin(preview)) { + m_PreviewGenerator.registerPlugin(preview); + } + } { // proxy plugins IPluginProxy *proxy = qobject_cast(plugin); if (verifyPlugin(proxy)) { diff --git a/src/organizer.pro b/src/organizer.pro index 25384e69..dd745edb 100644 --- a/src/organizer.pro +++ b/src/organizer.pro @@ -80,14 +80,7 @@ SOURCES += \ ../esptk/subrecord.cpp \ noeditdelegate.cpp \ previewgenerator.cpp \ - previewdialog.cpp \ - gl/gltexloaders.cpp \ - gl/dds/dds_api.cpp \ - gl/dds/Image.cpp \ - gl/dds/DirectDrawSurface.cpp \ - gl/dds/Stream.cpp \ - gl/dds/BlockDXT.cpp \ - gl/dds/ColorBlock.cpp + previewdialog.cpp HEADERS += \ diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index 20d4d357..a0045ab3 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -312,6 +312,7 @@ bool PluginList::readLoadOrder(const QString &fileName) void PluginList::readEnabledFrom(const QString &fileName) { +qDebug("read enabled from %s", qPrintable(fileName)); for (std::vector::iterator iter = m_ESPs.begin(); iter != m_ESPs.end(); ++iter) { if (!iter->m_ForceEnabled) { iter->m_Enabled = false; @@ -389,7 +390,7 @@ void PluginList::writePlugins(const QString &fileName, bool writeUnchecked) cons file.write(textCodec->fromUnicode("# This file was automatically generated by Mod Organizer.\r\n")); bool invalidFileNames = false; - + int writtenCount = 0; for (size_t i = 0; i < m_ESPs.size(); ++i) { int priority = m_ESPsByPriority[i]; if ((m_ESPs[priority].m_Enabled || writeUnchecked) && !m_ESPs[priority].m_Removed) { @@ -401,6 +402,7 @@ void PluginList::writePlugins(const QString &fileName, bool writeUnchecked) cons file.write(textCodec->fromUnicode(m_ESPs[priority].m_Name)); } file.write("\r\n"); + ++writtenCount; } } file.close(); @@ -783,6 +785,7 @@ QVariant PluginList::data(const QModelIndex &modelIndex, int role) const bool PluginList::setData(const QModelIndex &modIndex, const QVariant &value, int role) { if (role == Qt::CheckStateRole) { +qDebug("uncheck plugin"); m_ESPs[modIndex.row()].m_Enabled = value.toInt() == Qt::Checked; emit dataChanged(modIndex, modIndex); diff --git a/src/previewgenerator.cpp b/src/previewgenerator.cpp index 5b0a44d8..764d016d 100644 --- a/src/previewgenerator.cpp +++ b/src/previewgenerator.cpp @@ -22,90 +22,34 @@ along with Mod Organizer. If not, see . #include #include #include -#include #include #include PreviewGenerator::PreviewGenerator() { - // set up image reader to be used for all image types qt (the current installation) supports - auto imageReader = std::bind(&PreviewGenerator::genImagePreview, this, std::placeholders::_1); - - foreach (const QByteArray &fileType, QImageReader::supportedImageFormats()) { - m_PreviewGenerators[QString(fileType).toLower()] = imageReader; - } - - m_PreviewGenerators["txt"] - = std::bind(&PreviewGenerator::genTxtPreview, this, std::placeholders::_1); - - m_PreviewGenerators["dds"] - = std::bind(&PreviewGenerator::genDDSPreview, this, std::placeholders::_1); QDesktopWidget desk; m_MaxSize = desk.screenGeometry().size() * 0.8; } -bool PreviewGenerator::previewSupported(const QString &fileExtension) const +void PreviewGenerator::registerPlugin(MOBase::IPluginPreview *plugin) { - return m_PreviewGenerators.find(fileExtension.toLower()) != m_PreviewGenerators.end(); -} - -QWidget *PreviewGenerator::genPreview(const QString &fileName) const -{ - auto iter = m_PreviewGenerators.find(QFileInfo(fileName).completeSuffix().toLower()); - if (iter != m_PreviewGenerators.end()) { - return iter->second(fileName); - } else { - return nullptr; + foreach (const QString &extension, plugin->supportedExtensions()) { + m_PreviewPlugins.insert(std::make_pair(extension, plugin)); } } -QWidget *PreviewGenerator::genImagePreview(const QString &fileName) const -{ - QLabel *label = new QLabel(); - label->setPixmap(QPixmap(fileName)); - return label; -} - -QWidget *PreviewGenerator::genTxtPreview(const QString &fileName) const +bool PreviewGenerator::previewSupported(const QString &fileExtension) const { - QTextEdit *edit = new QTextEdit(); - edit->setText(MOBase::readFileText(fileName)); - edit->setReadOnly(true); - return edit; + return m_PreviewPlugins.find(fileExtension.toLower()) != m_PreviewPlugins.end(); } -QWidget *PreviewGenerator::genDDSPreview(const QString &fileName) const +QWidget *PreviewGenerator::genPreview(const QString &fileName) const { - QGLWidget glWidget; - glWidget.makeCurrent(); - - GLuint texture = glWidget.bindTexture(fileName); - if (!texture) - return nullptr; - - // Determine the size of the DDS image - GLint width, height; - glBindTexture(GL_TEXTURE_2D, texture); - glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width); - glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height); - - if (width == 0 || height == 0) - return nullptr; - - QGLPixelBuffer pbuffer(QSize(width, height), glWidget.format(), &glWidget); - if (!pbuffer.makeCurrent()) + auto iter = m_PreviewPlugins.find(QFileInfo(fileName).completeSuffix().toLower()); + if (iter != m_PreviewPlugins.end()) { + return iter->second->genFilePreview(fileName, m_MaxSize); + } else { return nullptr; - - pbuffer.drawTexture(QRectF(-1, -1, 2, 2), texture); - - QLabel *label = new QLabel(); - QImage image = pbuffer.toImage(); - if ((image.size().width() > m_MaxSize.width()) || - (image.size().height() > m_MaxSize.height())) { - image = image.scaled(m_MaxSize, Qt::KeepAspectRatio); } - - label->setPixmap(QPixmap::fromImage(image)); - return label; } diff --git a/src/previewgenerator.h b/src/previewgenerator.h index 4648e27e..e872b06b 100644 --- a/src/previewgenerator.h +++ b/src/previewgenerator.h @@ -24,12 +24,15 @@ along with Mod Organizer. If not, see . #include #include #include +#include class PreviewGenerator { public: PreviewGenerator(); + void registerPlugin(MOBase::IPluginPreview *plugin); + bool previewSupported(const QString &fileExtension) const; QWidget *genPreview(const QString &fileName) const; @@ -38,11 +41,10 @@ private: QWidget *genImagePreview(const QString &fileName) const; QWidget *genTxtPreview(const QString &fileName) const; - QWidget *genDDSPreview(const QString &fileName) const; private: - std::map > m_PreviewGenerators; + std::map m_PreviewPlugins; QSize m_MaxSize; diff --git a/src/version.rc b/src/version.rc index 83c59d21..1beee814 100644 --- a/src/version.rc +++ b/src/version.rc @@ -1,7 +1,7 @@ #include "Winver.h" -#define VER_FILEVERSION 1,0,13,0 -#define VER_FILEVERSION_STR "1,0,13,0\0" +#define VER_FILEVERSION 1,1,0,0 +#define VER_FILEVERSION_STR "1,1,0,0\0" VS_VERSION_INFO VERSIONINFO FILEVERSION VER_FILEVERSION -- cgit v1.3.1