From 193442e77362edfdb55636f907a14098be59fd2a Mon Sep 17 00:00:00 2001 From: Jeremy Rimpo Date: Thu, 11 Jul 2024 09:46:29 -0500 Subject: Archive preview support (#2056) * Support for archive file previews - Should account for alternates - Extracts files and requests preview from plugins that claim support --- src/organizercore.cpp | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) (limited to 'src/organizercore.cpp') diff --git a/src/organizercore.cpp b/src/organizercore.cpp index f471ead1..0f6a1455 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -71,6 +71,8 @@ #include #include +#include "bs_archive.h" + #include "organizerproxy.h" using namespace MOShared; @@ -1053,7 +1055,7 @@ bool OrganizerCore::previewFileWithAlternatives(QWidget* parent, QString fileNam // set up preview dialog PreviewDialog preview(fileName, parent); - auto addFunc = [&](int originId) { + auto addFunc = [&](int originId, std::wstring archiveName = L"") { FilesOrigin& origin = directoryStructure()->getOriginByID(originId); QString filePath = QDir::fromNativeSeparators(ToQString(origin.getPath())) + "/" + fileName; @@ -1066,14 +1068,33 @@ bool OrganizerCore::previewFileWithAlternatives(QWidget* parent, QString fileNam } else { preview.addVariant(ToQString(origin.getName()), wid); } + } else if (archiveName != L"") { + auto archiveFile = directoryStructure()->searchFile(archiveName); + if (archiveFile.get() != nullptr) { + try { + libbsarch::bs_archive archiveLoader; + archiveLoader.load_from_disk(archiveFile->getFullPath()); + libbsarch::memory_blob fileData = + archiveLoader.extract_to_memory(fileName.toStdWString()); + QByteArray convertedFileData((char*)(fileData.data), fileData.size); + QWidget* wid = m_PluginContainer->previewGenerator().genArchivePreview( + convertedFileData, filePath); + if (wid == nullptr) { + reportError(tr("failed to generate preview for %1").arg(filePath)); + } else { + preview.addVariant(ToQString(origin.getName()), wid); + } + } catch (std::exception& e) { + } + } } }; if (selectedOrigin == -1) { // don't bother with the vector of origins, just add them as they come - addFunc(file->getOrigin()); + addFunc(file->getOrigin(), file->isFromArchive() ? file->getArchive().name() : L""); for (const auto& alt : file->getAlternatives()) { - addFunc(alt.originID()); + addFunc(alt.originID(), alt.isFromArchive() ? alt.archive().name() : L""); } } else { std::vector origins; -- cgit v1.3.1