audacia/src/effects/EffectCategory.cpp

113 lines
2.7 KiB
C++

/**********************************************************************
Audacity: A Digital Audio Editor
EffectCategory.cpp
Audacity(R) is copyright (c) 1999-2008 Audacity Team.
License: GPL v2. See License.txt.
**********************************************************************/
#include "Effect.h"
#include "EffectCategory.h"
EffectCategory::EffectCategory(const wxString& uri, const wxString& name)
: mUri(uri),
mName(name),
mParentsFrozen(false) {
}
const wxString& EffectCategory::GetUri() const {
return mUri;
}
const wxString& EffectCategory::GetName() const {
return mName;
}
const CategorySet& EffectCategory::GetParents() const {
return mParents;
}
const CategorySet& EffectCategory::GetSubCategories() const {
return mSubCategories;
}
EffectSet EffectCategory::GetEffects(int type) const {
EffectSet result;
EffectSet::const_iterator iter;
for (iter = mEffects.begin(); iter != mEffects.end(); ++iter) {
int g = (*iter)->GetEffectFlags();
if ((g & type) == g)
result.insert(*iter);
}
return result;
}
// Return all the effects that belong to this immediate category or any
// of its subcategories), filtered by effect type.
EffectSet EffectCategory::GetAllEffects(int type) const {
EffectSet result = GetEffects(type);
CategorySet::const_iterator iter;
for (iter = mSubCategories.begin(); iter != mSubCategories.end(); ++iter) {
EffectSet tmp = (*iter)->GetAllEffects(type);
EffectSet::const_iterator itr2;
for (itr2 = tmp.begin(); itr2 != tmp.end(); ++itr2)
result.insert(*itr2);
}
return result;
}
bool EffectCategory::AddParent(EffectCategory* parent) {
if (mParentsFrozen)
return false;
if (parent->IsDescendantOf(this))
return false;
mParents.insert(parent);
parent->mSubCategories.insert(this);
return true;
}
bool EffectCategory::AddEffect(Effect* effect) {
mEffects.insert(effect);
return true;
}
void EffectCategory::FreezeParents() {
mParentsFrozen = true;
}
void EffectCategory::UnfreezeParents() {
mParentsFrozen = false;
}
bool EffectCategory::IsDescendantOf(EffectCategory* category) {
if (category == this)
return true;
CategorySet::const_iterator iter;
for (iter = mParents.begin(); iter != mParents.end(); ++iter) {
if ((*iter)->IsDescendantOf(category))
return true;
}
return false;
}
// Indentation settings for Vim and Emacs and unique identifier for Arch, a
// version control system. Please do not modify past this point.
//
// Local Variables:
// c-basic-offset: 3
// indent-tabs-mode: nil
// End:
//
// vim: et sts=3 sw=3
// arch-tag: 2eabc50c-b33d-4699-a526-66a5b2284fc5