/*
* MappingManager.cpp
*
* (c) 2013 Sofian Audry -- info(@)sofianaudry(.)com
* (c) 2013 Alexandre Quessy -- alexandre(@)quessy(.)net
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include "MappingManager.h"
#include
namespace mmp {
MappingManager::MappingManager()
{
// TODO Auto-generated constructor stub
}
QMap MappingManager::getPaintMappings(const Paint::ptr paint) const
{
QMap paintMappings;
for (QVector::const_iterator it = mappingVector.begin(); it != mappingVector.end(); ++it)
{
if ((*it)->getPaint() == paint)
{
paintMappings[(*it)->getId()] = *it;
}
}
return paintMappings;
}
Paint::ptr MappingManager::getPaintByName(QString name)
{
return _getElementByName(paintVector, name);
}
QVector MappingManager::getPaintsByNameRegExp(QString namePattern)
{
return _getElementsByNameRegExp(paintVector, namePattern);
}
Mapping::ptr MappingManager::getMappingByName(QString name)
{
return _getElementByName(mappingVector, name);
}
QVector MappingManager::getMappingsByNameRegExp(QString namePattern)
{
return _getElementsByNameRegExp(mappingVector, namePattern);
}
QMap MappingManager::getPaintMappingsById(uid paintId) const
{
return getPaintMappings(paintMap[paintId]);
}
uid MappingManager::addPaint(Paint::ptr paint)
{
paintVector.push_back(paint);
paintMap[paint->getId()] = paint;
return paint->getId();
}
bool MappingManager::removePaint(uid paintId)
{
// Make sure the paint to which this paint refers to exists in the manager.
Paint::ptr paint = getPaintById(paintId);
if (paint)
{
// Remove all mappings associated with paint.
QMap paintMappings = getPaintMappings(paint);
for (QMap::const_iterator it = paintMappings.constBegin();
it != paintMappings.constEnd(); ++it)
{
removeMapping(it.key());
}
// Remove paint.
int idx = paintVector.lastIndexOf(paint);
Q_ASSERT(idx != -1);
paintVector.remove(idx);
paintMap.remove(paintId);
return true;
}
else
{
return false;
}
}
bool MappingManager::replacePaintMappings(Paint::ptr oldpaint,
Paint::ptr newpaint)
{
// Make sure the paint to which this paint refers to exists in the manager.
if (oldpaint && newpaint)
{
QMap paintMappings = getPaintMappings(oldpaint);
for (QMap::const_iterator it = paintMappings.constBegin();
it != paintMappings.constEnd(); ++it)
{
Mapping::ptr mapping = it.value();
mapping->setPaint(newpaint);
}
return true;
}
else
{
return false;
}
}
uid MappingManager::addMapping(Mapping::ptr mapping)
{
// Make sure the paint to which this mapping refers to exists in the manager.
Q_ASSERT ( paintVector.contains(mapping->getPaint()) );
mappingVector.push_back(mapping);
mappingMap[mapping->getId()] = mapping;
return mapping->getId();
}
bool MappingManager::removeMapping(uid mappingId)
{
// Make sure the paint to which this mapping refers to exists in the manager.
Mapping::ptr mapping = getMappingById(mappingId);
if (mapping)
{
int idx = mappingVector.lastIndexOf(mapping);
Q_ASSERT( idx != -1 ); // Q_ASSERT(mappingVector.contains(mapping));
mappingVector.remove(idx);
mappingMap.remove(mappingId);
return true;
}
else
{
return false;
}
}
QVector MappingManager::getVisibleMappings() const
{
QVector visible;
// First pass: check if one of the mappings is in solo mode.
bool hasSolo = false;
for (QVector::const_iterator it = mappingVector.begin();
it != mappingVector.end(); ++it)
{
if ((*it)->isSolo())
{
hasSolo = true;
break;
}
}
// Second pass: fill the visible vector.
for (QVector::const_iterator it = mappingVector.begin();
it != mappingVector.end(); ++it)
{
// Solo has priority over invisible (mute)
if ( (hasSolo && (*it)->isSolo()) ||
(! hasSolo && (*it)->isVisible()) )
{
visible.push_back(*it);
}
}
return visible;
}
/// Returns true iff the mapping is visible.
bool MappingManager::mappingIsVisible(Mapping::ptr mapping) const
{
// Solo mappings are always visible.
if (mapping->isSolo())
{
return true;
}
// Non-solo invisible mappings are always invisible.
else if (! mapping->isVisible())
{
return false;
}
// Mapping is non-solo yet visible: check if another mapping is solo
// (which would thus make it invisible).
else
{
for (QVector::const_iterator it = mappingVector.begin();
it != mappingVector.end(); ++it)
{
if ((*it)->isSolo())
{
return false;
}
}
// Mapping is non-solo yet visible and there are no solo mappings.
return true;
}
}
/// Returns the list of visible paints (ie. paints for which at least one mapping is visible).
QVector MappingManager::getVisiblePaints() const
{
QVector visiblePaints;
QVector visibleMappings = getVisibleMappings();
for (QVector::const_iterator it = visibleMappings.begin();
it != visibleMappings.end(); ++it)
{
Paint::ptr paint((*it)->getPaint());
if (!visiblePaints.contains(paint))
visiblePaints.push_back(paint);
}
return visiblePaints;
}
void MappingManager::reorderMappings(QVector mappingIds)
{
// Both vector needs to have the same size.
Q_ASSERT( mappingIds.size() == mappingVector.size() );
mappingVector.clear();
int depth = 0;
for (QVector::iterator it = mappingIds.begin();
it != mappingIds.end(); ++it)
{
// Uid should be a key of the mappingMap.
Q_ASSERT( mappingMap.contains(*it) );
// Makes sure the uids are not repeated.
Q_ASSERT( ! mappingVector.contains(mappingMap[*it]) );
// Adds the mapping at the right place in the vector.
Mapping::ptr mapping = mappingMap[*it];
mapping->setDepth(depth);
mappingVector.push_back( mapping );
depth++;
}
}
//bool MappingManager::removeMapping(Mapping::ptr mapping)
//{
//}
void MappingManager::clearAll()
{
paintVector.clear();
mappingVector.clear();
paintMap.clear();
mappingMap.clear();
}
}