mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 10:54:24 -04:00
abort sooner if errors in meta interval construction
This commit is contained in:
parent
55c22b6788
commit
962ccf7496
@ -88,6 +88,13 @@ class MetaInterval(CMetaInterval):
|
||||
|
||||
self.pythonIvals = []
|
||||
|
||||
# If we are running in debug mode, we validate the intervals
|
||||
# in the list right away. There's no good reason to do this,
|
||||
# except that it makes it easier for the programmer to detect
|
||||
# when a MetaInterval is misdefined at creation time.
|
||||
assert(self.validateComponents(self.ivals))
|
||||
|
||||
|
||||
|
||||
# Functions to make the MetaInterval object act just like a Python
|
||||
# list of intervals:
|
||||
@ -98,6 +105,7 @@ class MetaInterval(CMetaInterval):
|
||||
self.ivals = list(self.ivals)
|
||||
self.ivals.append(ival)
|
||||
self.__ivalsDirty = 1
|
||||
assert(self.validateComponent(ival))
|
||||
|
||||
def extend(self, ivals):
|
||||
# Appends a list of intervals to the list so far.
|
||||
@ -117,6 +125,7 @@ class MetaInterval(CMetaInterval):
|
||||
self.ivals = list(self.ivals)
|
||||
self.ivals.insert(index, ival)
|
||||
self.__ivalsDirty = 1
|
||||
assert(self.validateComponent(ival))
|
||||
|
||||
def pop(self, index = None):
|
||||
# Returns element index (or the last element) and removes it
|
||||
@ -164,6 +173,7 @@ class MetaInterval(CMetaInterval):
|
||||
self.ivals = list(self.ivals)
|
||||
self.ivals[index] = value
|
||||
self.__ivalsDirty = 1
|
||||
assert(self.validateComponent(value))
|
||||
|
||||
def __delitem__(self, index):
|
||||
if isinstance(self.ivals, types.TupleType):
|
||||
@ -181,6 +191,7 @@ class MetaInterval(CMetaInterval):
|
||||
self.ivals = list(self.ivals)
|
||||
self.ivals[i : j] = s
|
||||
self.__ivalsDirty = 1
|
||||
assert(self.validateComponents(s))
|
||||
|
||||
def __delslice__(self, i, j):
|
||||
if isinstance(self.ivals, types.TupleType):
|
||||
@ -192,10 +203,13 @@ class MetaInterval(CMetaInterval):
|
||||
if isinstance(self.ivals, types.TupleType):
|
||||
self.ivals = list(self.ivals)
|
||||
if isinstance(other, MetaInterval):
|
||||
self.ivals += other.ivals
|
||||
assert(self.__class__ == other.__class__)
|
||||
ivals = other.ivals
|
||||
else:
|
||||
self.ivals += list(other)
|
||||
ivals = list(other)
|
||||
self.ivals += ivals
|
||||
self.__ivalsDirty = 1
|
||||
assert(self.validateComponents(ivals))
|
||||
return self
|
||||
|
||||
def __add__(self, other):
|
||||
@ -362,6 +376,24 @@ class MetaInterval(CMetaInterval):
|
||||
|
||||
# Internal functions:
|
||||
|
||||
def validateComponent(self, component):
|
||||
# This is called only in debug mode to verify that the
|
||||
# indicated component added to the MetaInterval is appropriate
|
||||
# to this type of MetaInterval. In most cases except Track,
|
||||
# this is the same as asking that the component is itself an
|
||||
# Interval.
|
||||
return isinstance(component, CInterval) or \
|
||||
isinstance(component, Interval.Interval)
|
||||
|
||||
def validateComponents(self, components):
|
||||
# This is called only in debug mode to verify that all the
|
||||
# components on the indicated list are appropriate to this
|
||||
# type of MetaInterval.
|
||||
for component in components:
|
||||
if not self.validateComponent(component):
|
||||
return 0
|
||||
return 1
|
||||
|
||||
def __updateIvals(self):
|
||||
# The MetaInterval object does not create the C++ list of
|
||||
# Intervals immediately; rather, it stores a Python list of
|
||||
@ -521,6 +553,30 @@ class Track(MetaInterval):
|
||||
meta.addTrack(self.ivals, self.getName(),
|
||||
relTime, relTo, self.phonyDuration)
|
||||
|
||||
def validateComponent(self, tuple):
|
||||
# This is called only in debug mode to verify that the
|
||||
# indicated component added to the MetaInterval is appropriate
|
||||
# to this type of MetaInterval. In most cases except Track,
|
||||
# this is the same as asking that the component is itself an
|
||||
# Interval.
|
||||
|
||||
if isinstance(tuple, CInterval) or \
|
||||
isinstance(tuple, Interval.Interval):
|
||||
# Actually, it's not a tuple, but just an interval.
|
||||
# In this case we fall back on the old default of
|
||||
# assuming a sequential list of intervals. This is a
|
||||
# temporary feature for backward compatibility.
|
||||
return 1
|
||||
|
||||
if isinstance(tuple, types.TupleType) or \
|
||||
isinstance(tuple, types.ListType):
|
||||
ival = tuple[1]
|
||||
return MetaInterval.validateComponent(self, ival)
|
||||
|
||||
# It's not a tuple or an interval.
|
||||
return 0
|
||||
|
||||
|
||||
# Temporary for backward compatibility.
|
||||
class MultiTrack(MetaInterval):
|
||||
def applyIvals(self, meta, relTime, relTo):
|
||||
|
Loading…
x
Reference in New Issue
Block a user