File indexing completed on 2025-04-27 03:58:35

0001 /* ============================================================
0002  *
0003  * This file is a part of digiKam project
0004  * https://www.digikam.org
0005  *
0006  * Date        : 2006-02-22
0007  * Description : a generic widget to display metadata
0008  *
0009  * SPDX-FileCopyrightText: 2006-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
0010  *
0011  * SPDX-License-Identifier: GPL-2.0-or-later
0012  *
0013  * ============================================================ */
0014 
0015 #ifndef DIGIKAM_META_DATA_WIDGET_H
0016 #define DIGIKAM_META_DATA_WIDGET_H
0017 
0018 // Qt includes
0019 
0020 #include <QWidget>
0021 #include <QString>
0022 #include <QUrl>
0023 
0024 // Local includes
0025 
0026 #include "dmetadata.h"
0027 #include "digikam_export.h"
0028 
0029 namespace Digikam
0030 {
0031 
0032 class MetadataListView;
0033 
0034 class DIGIKAM_EXPORT MetadataWidget : public QWidget
0035 {
0036     Q_OBJECT
0037 
0038 public:
0039 
0040     enum TagFilters
0041     {
0042         NONE = 0,
0043         PHOTO,
0044         CUSTOM
0045     };
0046 
0047 public:
0048 
0049     explicit MetadataWidget(QWidget* const parent, const QString& name = QString());
0050     ~MetadataWidget() override;
0051 
0052     int     getMode()           const;
0053     void    setMode(int mode);
0054 
0055     QStringList getTagsFilter() const;
0056     void        setTagsFilter(const QStringList& list);
0057 
0058     QString getCurrentItemKey() const;
0059     void    setCurrentItemByKey(const QString& itemKey);
0060 
0061     void    setUserAreaWidget(QWidget* const w);
0062 
0063 public:
0064 
0065     virtual QString getTagTitle(const QString& key);
0066     virtual QString getTagDescription(const QString& key);
0067 
0068     virtual bool loadFromData(const QString& fileName,
0069                               const DMetadata& data = DMetadata());
0070 
0071     virtual bool loadFromURL(const QUrl& url) = 0;
0072 
0073 Q_SIGNALS:
0074 
0075     void signalSetupMetadataFilters();
0076 
0077 protected Q_SLOTS:
0078 
0079     virtual void slotSaveMetadataToFile() = 0;
0080 
0081 protected:
0082 
0083     void   enabledToolButtons(bool);
0084     void   setFileName(const QString& fileName);
0085     MetadataListView* view() const;
0086 
0087     bool   setMetadata(const DMetadata& data = DMetadata());
0088     DMetadata* getMetadata() const;
0089 
0090     void   setMetadataMap(const DMetadata::MetaDataMap& data = DMetadata::MetaDataMap());
0091     const  DMetadata::MetaDataMap& getMetadataMap();
0092 
0093     void   setIfdList(const DMetadata::MetaDataMap& ifds, const QStringList& tagsFilter = QStringList());
0094     void   setIfdList(const DMetadata::MetaDataMap& ifds, const QStringList& keysFilter,
0095                       const QStringList& tagsFilter);
0096 
0097     QUrl   saveMetadataToFile(const QString& caption, const QString& fileFilter);
0098     bool   storeMetadataToFile(const QUrl& url, const QByteArray& metaData);
0099 
0100     /**
0101      * Call this method in children class constructors to init signal/slots connections.
0102      */
0103     void setup();
0104 
0105     QString metadataToText() const;
0106 
0107 protected:
0108 
0109     virtual void buildView();
0110     virtual void setMetadataEmpty();
0111 
0112     virtual bool    decodeMetadata()         = 0;
0113     virtual QString getMetadataTitle() const = 0;
0114 
0115 private Q_SLOTS:
0116 
0117     void slotCopy2Clipboard();
0118     void slotPrintMetadata();
0119     void slotFilterChanged(QAction*);
0120 
0121 private:
0122 
0123     class Private;
0124     Private* const d;
0125 };
0126 
0127 } // namespace Digikam
0128 
0129 #endif // DIGIKAM_META_DATA_WIDGET_H