43 for (
int i=0; i<other->
size(); i++ ) {
44 ( *this ) << (
new Pattern( ( *other )[i] ) );
50 for (
int i = 0; i <
__patterns.size(); ++i ) {
57 XMLNode patternsNode = pNode->firstChildElement(
"patternList" );
58 if ( patternsNode.isNull() ) {
59 ERRORLOG(
"'patternList' node not found. Unable to load pattern list." );
64 int nPatternCount = 0;
66 XMLNode patternNode = patternsNode.firstChildElement(
"pattern" );
67 while ( !patternNode.isNull() ) {
70 if ( pPattern !=
nullptr ) {
71 pPatternList->
add( pPattern );
78 patternNode = patternNode.nextSiblingElement(
"pattern" );
80 if ( nPatternCount == 0 && ! bSilent ) {
91 if ( pPattern !=
nullptr ) {
92 pPattern->save_to( &patternListNode, pInstrumentOnly );
100 if ( pPattern ==
nullptr ) {
101 ERRORLOG(
"Provided pattern is invalid" );
106 if (
index( pPattern ) != -1 ) {
107 INFOLOG(
"Provided pattern is already contained" );
110 else if ( ! bAddVirtuals ) {
114 auto pVirtualPatterns = ppPattern->get_virtual_patterns();
115 if ( pVirtualPatterns->find( pPattern ) != pVirtualPatterns->end() ) {
129 if ( pVirtualPatterns->find( ppPattern ) != pVirtualPatterns->end() ) {
136 if ( bAddVirtuals ) {
145 if (
index( pPattern ) != -1 ) {
158 ERRORLOG( QString(
"idx %1 out of [0;%2]" ).arg( idx ).arg(
size() ) );
161 assert( idx >= 0 && idx <
__patterns.size() );
169 ERRORLOG( QString(
"idx %1 out of [0;%2]" ).arg( idx ).arg(
size() ) );
172 assert( idx >= 0 && idx <
__patterns.size() );
216 assert( idx >= 0 && idx <=
__patterns.size() +1 );
218 ERRORLOG( QString(
"index out of bounds %1 (size:%2)" ).arg( idx ).arg(
__patterns.size() ) );
248 assert( idx_a >= 0 && idx_a <
__patterns.size() );
249 assert( idx_b >= 0 && idx_b <
__patterns.size() );
250 if( idx_a == idx_b )
return;
260 assert( idx_a >= 0 && idx_a <
__patterns.size() );
261 assert( idx_b >= 0 && idx_b <
__patterns.size() );
262 if( idx_a == idx_b )
return;
272 __patterns[i]->flattened_virtual_patterns_clear();
275 __patterns[i]->flattened_virtual_patterns_compute();
286 if (patternName ==
"") {
290 for (uint i = 0; i <
__patterns.size(); i++) {
300 QString unusedPatternNameCandidate;
302 if( sourceName.isEmpty() ) {
303 sourceName =
"Pattern 11";
308 unusedPatternNameCandidate = sourceName;
312 QRegularExpression numberSuffixRe(
"(.+) #(\\d+)$");
313 QRegularExpressionMatch match = numberSuffixRe.match(sourceName);
314 if (match.hasMatch()) {
315 QString numberSuffix = match.captured(2);
317 i = numberSuffix.toInt();
318 suffix =
" #" + QString::number(i);
319 unusedPatternNameCandidate = match.captured(1);
322 while( !
check_name( unusedPatternNameCandidate + suffix, ignore ) ) {
323 suffix =
" #" + QString::number(i);
327 unusedPatternNameCandidate += suffix;
329 return unusedPatternNameCandidate;
335 if ( ppPattern->get_length() > nMax ) {
336 nMax = ppPattern->get_length();
339 if ( bIncludeVirtuals ) {
340 for (
const auto ppVirtualPattern : *ppPattern->get_flattened_virtual_patterns() ) {
341 if ( ppVirtualPattern->get_length() > nMax ) {
342 nMax = ppVirtualPattern->get_length();
355 for (
int ii = 0; ii < pLhs.
size(); ii++ ) {
356 if ( pLhs.
get( ii ) != pRhs.
get( ii ) ) {
369 for (
int ii = 0; ii < pLhs.
size(); ii++ ) {
370 if ( pLhs.
get( ii ) != pRhs.
get( ii ) ) {
382 sOutput = QString(
"%1[PatternList]\n" ).arg( sPrefix );
384 if ( pp !=
nullptr ) {
385 sOutput.append( QString(
"%1" ).arg( pp->toQString( sPrefix + s, bShort ) ) );
389 sOutput = QString(
"[PatternList] " );
391 if ( pp !=
nullptr ) {
392 sOutput.append( QString(
"[%1] " ).arg( pp->get_name() ) );
#define ASSERT_AUDIO_ENGINE_LOCKED(x)
static QString sPrintIndention
String used to format the debugging string output of some core classes.
void save_to(XMLNode *pNode, const std::shared_ptr< Instrument > pInstrumentOnly=nullptr) const
bool check_name(QString patternName, Pattern *ignore=NULL)
check if a pattern with name patternName already exists in this list
void add(Pattern *pattern, bool bAddVirtuals=false)
add a pattern to the list
std::vector< Pattern * >::iterator end()
static PatternList * load_from(XMLNode *pNode, std::shared_ptr< InstrumentList > pInstrumentList, bool bSilent=false)
load a PatternList from an XMLNode
int index(const Pattern *pattern) const
get the index of the pattern within the patterns
void set_to_old()
mark all patterns as old
Pattern * replace(int idx, Pattern *pattern)
replace the pattern at a given index with a new one
void move(int idx_a, int idx_b)
move a pattern from a position to another
std::vector< Pattern * >::const_iterator cend() const
QString find_unused_pattern_name(QString sourceName, Pattern *ignore=NULL)
find unused patternName
std::vector< Pattern * >::const_iterator cbegin() const
Pattern * del(int idx)
remove the pattern at a given index, does not delete it
void flattened_virtual_patterns_compute()
call compute_flattened_virtual_patterns on each pattern
std::vector< Pattern * >::iterator begin()
Iteration.
int longest_pattern_length(bool bIncludeVirtuals=true) const
Get the length of the longest pattern in the list.
std::vector< Pattern * > __patterns
the list of patterns
void swap(int idx_a, int idx_b)
swap the patterns of two different indexes
Pattern * find(const QString &name)
find a pattern within the patterns
QString toQString(const QString &sPrefix="", bool bShort=true) const override
Formatted string version for debugging purposes.
void virtual_pattern_del(Pattern *pattern)
call del_virtual_pattern on each pattern
int size() const
returns the numbers of patterns
void insert(int idx, Pattern *pattern)
insert a pattern into the list
Pattern * get(int idx)
get a pattern from the list
Pattern class is a Note container.
const virtual_patterns_t * get_virtual_patterns() const
get the flattened virtual pattern set
static Pattern * load_from(XMLNode *node, std::shared_ptr< InstrumentList > instruments, bool bSilent=false)
load a pattern from an XMLNode
void addFlattenedVirtualPatterns(PatternList *pPatternList)
Add content of __flattened_virtual_patterns into pPatternList.
XMLNode is a subclass of QDomNode with read and write values methods.
XMLNode createNode(const QString &name)
create a new XMLNode that has to be appended into de XMLDoc
bool operator!=(std::shared_ptr< TransportPosition > pLhs, std::shared_ptr< TransportPosition > pRhs)
bool operator==(std::shared_ptr< TransportPosition > pLhs, std::shared_ptr< TransportPosition > pRhs)