File indexing completed on 2025-02-02 04:11:05
0001 /* 0002 * SPDX-FileCopyrightText: 2019-2023 Mattia Basaglia <dev@dragon.best> 0003 * 0004 * SPDX-License-Identifier: GPL-3.0-or-later 0005 */ 0006 0007 #include "image.hpp" 0008 #include "model/document.hpp" 0009 #include "model/assets/assets.hpp" 0010 0011 GLAXNIMATE_OBJECT_IMPL(glaxnimate::model::Image) 0012 0013 0014 glaxnimate::model::Image::Image(glaxnimate::model::Document* doc) 0015 : ShapeElement(doc) 0016 { 0017 connect(transform.get(), &Object::property_changed, this, &Image::on_transform_matrix_changed); 0018 } 0019 0020 0021 bool glaxnimate::model::Image::is_valid_image(glaxnimate::model::DocumentNode* node) const 0022 { 0023 return document()->assets()->images->values.is_valid_reference_value(node, false); 0024 } 0025 0026 std::vector<glaxnimate::model::DocumentNode *> glaxnimate::model::Image::valid_images() const 0027 { 0028 return document()->assets()->images->values.valid_reference_values(false); 0029 } 0030 0031 QRectF glaxnimate::model::Image::local_bounding_rect(glaxnimate::model::FrameTime) const 0032 { 0033 if ( !image.get() ) 0034 return {}; 0035 return QRectF(0, 0, image->width.get(), image->height.get()); 0036 } 0037 0038 void glaxnimate::model::Image::on_paint(QPainter* p, glaxnimate::model::FrameTime, glaxnimate::model::VisualNode::PaintMode, glaxnimate::model::Modifier*) const 0039 { 0040 if ( image.get() ) 0041 image->paint(p); 0042 } 0043 0044 void glaxnimate::model::Image::on_image_changed(glaxnimate::model::Bitmap* new_use, glaxnimate::model::Bitmap* old_use) 0045 { 0046 if ( old_use ) 0047 { 0048 disconnect(old_use, &Bitmap::loaded, this, &Image::on_update_image); 0049 } 0050 0051 if ( new_use ) 0052 { 0053 connect(new_use, &Bitmap::loaded, this, &Image::on_update_image); 0054 } 0055 } 0056 0057 void glaxnimate::model::Image::on_update_image() 0058 { 0059 Q_EMIT property_changed(&image, {}); 0060 } 0061 0062 QTransform glaxnimate::model::Image::local_transform_matrix(glaxnimate::model::FrameTime t) const 0063 { 0064 return transform->transform_matrix(t); 0065 } 0066 0067 void glaxnimate::model::Image::on_transform_matrix_changed() 0068 { 0069 propagate_bounding_rect_changed(); 0070 Q_EMIT local_transform_matrix_changed(transform->transform_matrix(time())); 0071 Q_EMIT transform_matrix_changed(transform_matrix(time())); 0072 } 0073 0074 void glaxnimate::model::Image::add_shapes(FrameTime, math::bezier::MultiBezier&, const QTransform&) const 0075 { 0076 } 0077 0078 QIcon glaxnimate::model::Image::tree_icon() const 0079 { 0080 return QIcon::fromTheme("x-shape-image"); 0081 } 0082 0083 QString glaxnimate::model::Image::type_name_human() const 0084 { 0085 return i18n("Image"); 0086 } 0087 0088 QPainterPath glaxnimate::model::Image::to_painter_path_impl(FrameTime time) const 0089 { 0090 auto trans = transform.get()->transform_matrix(time); 0091 QPainterPath p; 0092 p.addPolygon(trans.map(QRectF(QPointF(0, 0), image.get() ? image->pixmap().size() : QSize(0, 0)))); 0093 return p; 0094 }