Coverage for lib/lottie/objects/composition.py: 68%
45 statements
« prev ^ index » next coverage.py v7.2.2, created at 2023-03-20 16:17 +0100
« prev ^ index » next coverage.py v7.2.2, created at 2023-03-20 16:17 +0100
1from .base import LottieObject, Index, LottieProp
2from .layers import Layer
5## @ingroup Lottie
6class Composition(LottieObject):
7 """!
8 Base class for layer holders
9 """
10 _props = [
11 LottieProp("layers", "layers", Layer, True),
12 ]
14 def __init__(self):
15 super().__init__()
16 ## List of Composition Layers
17 self.layers = [] # ShapeLayer, SolidLayer, CompLayer, ImageLayer, NullLayer, TextLayer
19 self._index_gen = Index()
21 def layer(self, index):
22 for layer in self.layers:
23 if layer.index == index:
24 return layer
25 raise IndexError("No layer %s" % index)
27 def add_layer(self, layer: Layer):
28 """!
29 @brief Appends a layer to the composition
30 @see insert_layer
31 """
32 return self.insert_layer(len(self.layers), layer)
34 @classmethod
35 def load(cls, lottiedict):
36 obj = super().load(lottiedict)
37 obj._fixup()
38 return obj
40 def _fixup(self):
41 for layer in self.layers:
42 layer.composition = self
44 def insert_layer(self, index, layer: Layer):
45 """!
46 @brief Inserts a layer to the composition
47 @note Layers added first will be rendered on top of later layers
48 """
49 self.layers.insert(index, layer)
50 self.prepare_layer(layer)
51 return layer
53 def prepare_layer(self, layer: Layer):
54 layer.composition = self
55 if layer.index is None:
56 layer.index = next(self._index_gen)
57 self._on_prepare_layer(layer)
59 def _on_prepare_layer(self, layer):
60 raise NotImplementedError
62 def clone(self):
63 c = super().clone()
64 c._index_gen._i = self._index_gen._i
65 return c
67 def remove_layer(self, layer: Layer):
68 """!
69 @brief Removes a layer (and all of its children) from this composition
70 @param layer Layer to be removed
71 """
72 if layer.composition is not self: 72 ↛ 73line 72 didn't jump to line 73, because the condition on line 72 was never true
73 return
75 children = list(layer.children)
77 layer.composition = None
78 self.layers.remove(layer)
80 for c in children:
81 self.remove_layer(c)