File indexing completed on 2025-02-02 04:11:04

0001 /*
0002  * SPDX-FileCopyrightText: 2019-2023 Mattia Basaglia <dev@dragon.best>
0003  *
0004  * SPDX-License-Identifier: GPL-3.0-or-later
0005  */
0006 
0007 #pragma once
0008 
0009 #include <QPixmap>
0010 #include <QImage>
0011 #include <QFileInfo>
0012 #include <QUrl>
0013 
0014 #include "model/assets/asset.hpp"
0015 
0016 namespace glaxnimate::model {
0017 
0018 class Bitmap : public Asset
0019 {
0020     GLAXNIMATE_OBJECT(Bitmap)
0021     GLAXNIMATE_PROPERTY(QByteArray, data, {}, &Bitmap::on_refresh)
0022     GLAXNIMATE_PROPERTY(QString, filename, {}, &Bitmap::on_refresh)
0023     GLAXNIMATE_PROPERTY(QString, url, {}, &Bitmap::on_refresh)
0024     GLAXNIMATE_PROPERTY_RO(QString, format, {})
0025     GLAXNIMATE_PROPERTY_RO(int, width, -1)
0026     GLAXNIMATE_PROPERTY_RO(int, height, -1)
0027     Q_PROPERTY(bool embedded READ embedded WRITE embed)
0028     Q_PROPERTY(QImage image READ get_image)
0029 
0030 public:
0031     using Asset::Asset;
0032 
0033     void paint(QPainter* painter) const;
0034 
0035     bool embedded() const;
0036 
0037     QIcon instance_icon() const override;
0038 
0039     QString type_name_human() const override
0040     {
0041         return i18n("Bitmap");
0042     }
0043 
0044     bool from_url(const QUrl& url);
0045     bool from_file(const QString& file);
0046     bool from_base64(const QString& data);
0047     bool from_raw_data(const QByteArray& data);
0048 
0049     QUrl to_url() const;
0050 
0051     QString object_name() const override;
0052 
0053     QFileInfo file_info() const;
0054 
0055     const QPixmap& pixmap() const { return image; }
0056     void set_pixmap(const QImage& qimage, const QString& format);
0057 
0058     bool remove_if_unused(bool clean_lists) override;
0059 
0060     QImage get_image() const
0061     {
0062         return image.toImage();
0063     }
0064 
0065     /**
0066      * \brief If `embedded()` returns `data`, otherwise tries to load the data based on filename
0067      */
0068     QByteArray image_data() const;
0069 
0070     QSize size() const;
0071 
0072 public Q_SLOTS:
0073     void refresh(bool rebuild_embedded);
0074 
0075     void embed(bool embedded);
0076 
0077 private:
0078     QByteArray build_embedded(const QImage& img) const;
0079 
0080 private Q_SLOTS:
0081     void on_refresh();
0082 
0083 Q_SIGNALS:
0084     void loaded();
0085 
0086 private:
0087     QPixmap image;
0088 
0089 };
0090 
0091 } // namespace glaxnimate::model