@@ -1095,6 +1095,155 @@ def get_points(self):
1095
1095
return points
1096
1096
1097
1097
1098
+ class LockableBbox (BboxBase ):
1099
+ """
1100
+ A :class:`Bbox` where some elements may be locked at certain values.
1101
+
1102
+ When the child bounding box changes, the bounds of this bbox will update
1103
+ accordingly with the exception of the locked elements.
1104
+ """
1105
+ def __init__ (self , bbox , x0 = None , y0 = None , x1 = None , y1 = None , ** kwargs ):
1106
+ """
1107
+ Parameters
1108
+ ----------
1109
+ bbox : Bbox
1110
+ The child bounding box to wrap.
1111
+
1112
+ x0 : float or None
1113
+ The locked value for x0, or None to leave unlocked.
1114
+
1115
+ y0 : float or None
1116
+ The locked value for y0, or None to leave unlocked.
1117
+
1118
+ x1 : float or None
1119
+ The locked value for x1, or None to leave unlocked.
1120
+
1121
+ y1 : float or None
1122
+ The locked value for y1, or None to leave unlocked.
1123
+
1124
+ """
1125
+ if not bbox .is_bbox :
1126
+ raise ValueError ("'bbox' is not a bbox" )
1127
+
1128
+ BboxBase .__init__ (self , ** kwargs )
1129
+ self ._bbox = bbox
1130
+ self .set_children (bbox )
1131
+ self ._points = None
1132
+ fp = [x0 , y0 , x1 , y1 ]
1133
+ mask = [val is None for val in fp ]
1134
+ self ._locked_points = np .ma .array (fp , np .float_ ,
1135
+ mask = mask ).reshape ((2 , 2 ))
1136
+
1137
+ def __repr__ (self ):
1138
+ return "LockableBbox(%r, %r)" % (self ._bbox , self ._locked_points )
1139
+
1140
+ def get_points (self ):
1141
+ if self ._invalid :
1142
+ points = self ._bbox .get_points ()
1143
+ self ._points = np .where (self ._locked_points .mask ,
1144
+ points ,
1145
+ self ._locked_points )
1146
+ self ._invalid = 0
1147
+ return self ._points
1148
+ get_points .__doc__ = Bbox .get_points .__doc__
1149
+
1150
+ if DEBUG :
1151
+ _get_points = get_points
1152
+
1153
+ def get_points (self ):
1154
+ points = self ._get_points ()
1155
+ self ._check (points )
1156
+ return points
1157
+
1158
+ def set_locked_x0 (self , x0 ):
1159
+ """
1160
+ Set the value to be used for the locked x0.
1161
+
1162
+ Parameters
1163
+ ----------
1164
+ x0 : float or None
1165
+ The locked value for x0, or None to unlock.
1166
+ """
1167
+ self ._locked_points .mask [0 , 0 ] = x0 is None
1168
+ self ._locked_points .data [0 , 0 ] = x0
1169
+ self .invalidate ()
1170
+
1171
+ def get_locked_x0 (self ):
1172
+ """
1173
+ Get the value used for the locked x0.
1174
+ """
1175
+ if self ._locked_points .mask [0 , 0 ]:
1176
+ return None
1177
+ else :
1178
+ return self ._locked_points [0 , 0 ]
1179
+
1180
+ def set_locked_y0 (self , y0 ):
1181
+ """
1182
+ Set the value to be used for the locked y0.
1183
+
1184
+ Parameters
1185
+ ----------
1186
+ y0 : float or None
1187
+ The locked value for y0, or None to unlock.
1188
+ """
1189
+ self ._locked_points .mask [0 , 1 ] = y0 is None
1190
+ self ._locked_points .data [0 , 1 ] = y0
1191
+ self .invalidate ()
1192
+
1193
+ def get_locked_y0 (self ):
1194
+ """
1195
+ Get the value used for the locked y0.
1196
+ """
1197
+ if self ._locked_points .mask [0 , 1 ]:
1198
+ return None
1199
+ else :
1200
+ return self ._locked_points [0 , 1 ]
1201
+
1202
+ def set_locked_x1 (self , x1 ):
1203
+ """
1204
+ Set the value to be used for the locked x1.
1205
+
1206
+ Parameters
1207
+ ----------
1208
+ x1 : float or None
1209
+ The locked value for x1, or None to unlock.
1210
+ """
1211
+ self ._locked_points .mask [1 , 0 ] = x1 is None
1212
+ self ._locked_points .data [1 , 0 ] = x1
1213
+ self .invalidate ()
1214
+
1215
+ def get_locked_x1 (self ):
1216
+ """
1217
+ Get the value used for the locked x1.
1218
+ """
1219
+ if self ._locked_points .mask [1 , 0 ]:
1220
+ return None
1221
+ else :
1222
+ return self ._locked_points [1 , 0 ]
1223
+
1224
+ def set_locked_y1 (self , y1 ):
1225
+ """
1226
+ Set the value to be used for the locked y1.
1227
+
1228
+ Parameters
1229
+ ----------
1230
+ y1 : float or None
1231
+ The locked value for y1, or None to unlock.
1232
+ """
1233
+ self ._locked_points .mask [1 , 1 ] = y1 is None
1234
+ self ._locked_points .data [1 , 1 ] = y1
1235
+ self .invalidate ()
1236
+
1237
+ def get_locked_y1 (self ):
1238
+ """
1239
+ Get the value used for the locked y1.
1240
+ """
1241
+ if self ._locked_points .mask [1 , 1 ]:
1242
+ return None
1243
+ else :
1244
+ return self ._locked_points [1 , 1 ]
1245
+
1246
+
1098
1247
class Transform (TransformNode ):
1099
1248
"""
1100
1249
The base class of all :class:`TransformNode` instances that
0 commit comments