#ifndef EXPORTMANAGER_H #define EXPORTMANAGER_H #include #include #include #include class QWidget; class QTreeWidgetItem; struct BatchExportItem; /** * @brief The ExportManager class handles all export operations for tree items. * * This singleton provides centralized export functionality with format-specific * options for images, audio, text, and raw binary data. */ class ExportManager : public QObject { Q_OBJECT public: enum ContentType { Unknown, Image, Audio, Video, Text, Binary }; static ExportManager& instance(); // Content type detection ContentType detectContentType(const QVariantMap& vars) const; ContentType detectContentType(const QByteArray& data, const QString& filename) const; // Dialog-based export (shows full options dialog) bool exportWithDialog(const QByteArray& data, const QString& name, ContentType type, QWidget* parent); bool exportImageWithDialog(const QImage& image, const QString& name, QWidget* parent); // Quick export (uses saved defaults, minimal UI - just file picker) bool quickExport(const QByteArray& data, const QString& name, ContentType type, QWidget* parent); bool quickExportImage(const QImage& image, const QString& name, QWidget* parent); // Batch export (shows batch dialog for multiple items) bool batchExport(const QList& items, QWidget* parent); // Legacy export methods (direct export with file dialog) bool exportRawData(const QByteArray& data, const QString& suggestedName, QWidget* parent); bool exportImage(const QImage& image, const QString& format, const QString& suggestedName, QWidget* parent); bool exportAudio(const QByteArray& wavData, const QString& format, const QString& suggestedName, QWidget* parent); bool exportText(const QByteArray& data, const QString& suggestedName, QWidget* parent); // Format support QStringList supportedImageFormats() const; QStringList supportedAudioFormats() const; bool hasFFmpeg() const; // Clipboard operations void copyImageToClipboard(const QImage& image); void copyTextToClipboard(const QString& text); void copyBinaryAsHex(const QByteArray& data); // Last directory tracking QString lastExportDir(const QString& category) const; void setLastExportDir(const QString& category, const QString& dir); signals: void exportCompleted(const QString& path, bool success); void exportError(const QString& error); // Batch export signals void batchExportProgress(int current, int total, const QString& currentItem); void batchExportCompleted(int succeeded, int failed, int skipped); private: explicit ExportManager(QObject* parent = nullptr); ~ExportManager() = default; // Disable copy ExportManager(const ExportManager&) = delete; ExportManager& operator=(const ExportManager&) = delete; // Image format helpers bool saveTGA(const QImage& image, const QString& path); QString getFilterForFormat(const QString& format) const; // Audio conversion bool convertWithFFmpeg(const QString& inputPath, const QString& outputPath, const QString& format); QString findFFmpegPath() const; // State QMap m_lastDirs; mutable QString m_cachedFFmpegPath; mutable bool m_ffmpegChecked = false; }; #endif // EXPORTMANAGER_H