21 #include <QInputDialog>
24 #include "keyframefactory.h"
28 #include "timelinecells.h"
32 bool sortAsc(
int left,
int right)
37 Layer::Layer(
Object* pObject, LAYER_TYPE eType ) : QObject( pObject )
41 mName = QString( tr(
"Undefined Layer" ) );
43 mId = pObject->getUniqueLayerID();
47 Q_ASSERT( eType != UNDEFINED );
52 for (
auto pair : mKeyFrames )
60 void Layer::foreachKeyFrame( std::function<
void(
KeyFrame* )> action )
62 for (
auto pair : mKeyFrames )
64 action( pair.second );
68 bool Layer::keyExists(
int position )
70 return ( mKeyFrames.find( position ) != mKeyFrames.end() );
73 KeyFrame* Layer::getKeyFrameAt(
int position )
75 auto it = mKeyFrames.find( position );
76 if ( it == mKeyFrames.end() )
83 KeyFrame* Layer::getLastKeyFrameAtPosition(
int position )
89 auto it = mKeyFrames.lower_bound( position );
90 if ( it == mKeyFrames.end() )
97 int Layer::getPreviousKeyFramePosition(
int position )
99 auto it = mKeyFrames.upper_bound( position );
100 if ( it == mKeyFrames.end() )
102 return firstKeyFramePosition();
107 int Layer::getNextKeyFramePosition(
int position )
109 auto it = mKeyFrames.lower_bound( position );
110 if ( it == mKeyFrames.end() )
112 return getMaxKeyFramePosition();
115 if ( it != mKeyFrames.begin() )
122 int Layer::getPreviousFrameNumber(
int position,
bool isAbsolute )
127 prevNumber = getPreviousKeyFramePosition(position);
130 prevNumber = position - 1;
134 if (prevNumber == position)
144 int Layer::getNextFrameNumber(
int position,
bool isAbsolute )
149 nextNumber = getNextKeyFramePosition(position);
152 nextNumber = position + 1;
156 if (nextNumber == position) {
164 int Layer::firstKeyFramePosition()
166 if ( !mKeyFrames.empty() )
168 return mKeyFrames.rbegin()->first;
173 int Layer::getMaxKeyFramePosition()
175 if ( !mKeyFrames.empty() )
177 return mKeyFrames.begin()->first;
182 bool Layer::addNewEmptyKeyAt(
int position )
188 KeyFrame* key = KeyFrameFactory::create( meType, mObject );
189 if ( key ==
nullptr )
193 return addKeyFrame( position, key );
196 bool Layer::addKeyFrame(
int position,
KeyFrame* pKeyFrame )
198 auto it = mKeyFrames.find( position );
199 if ( it != mKeyFrames.end() )
204 pKeyFrame->setPos( position );
205 mKeyFrames.insert( std::make_pair( position, pKeyFrame ) );
210 bool Layer::removeKeyFrame(
int position )
212 auto frame = getKeyFrameWhichCovers(position);
215 mKeyFrames.erase(frame->pos());
222 bool Layer::moveKeyFrameForward(
int position )
224 return swapKeyFrames( position, position + 1 );
227 bool Layer::moveKeyFrameBackward(
int position )
231 return swapKeyFrames( position, position - 1 );
239 bool Layer::swapKeyFrames(
int position1,
int position2 )
241 bool keyPosition1 =
false, keyPosition2 =
false;
245 if ( keyExists( position1 ) )
247 auto firstFrame = mKeyFrames.find( position1 );
248 pFirstFrame = firstFrame->second;
250 mKeyFrames.erase( position1 );
258 if ( keyExists( position2 ) )
260 auto secondFrame = mKeyFrames.find( position2 );
261 pSecondFrame = secondFrame->second;
263 mKeyFrames.erase( position2 );
274 pSecondFrame->setPos( position1 );
275 mKeyFrames.insert( std::make_pair( position1, pSecondFrame ) );
277 else if ( position1 == 1 )
279 addNewEmptyKeyAt( position1 );
285 pFirstFrame->setPos( position2 );
286 mKeyFrames.insert( std::make_pair( position2, pFirstFrame ) );
288 else if ( position2 == 1 )
290 addNewEmptyKeyAt( position2 );
296 bool Layer::loadKey(
KeyFrame* pKey )
298 auto it = mKeyFrames.find( pKey->pos() );
299 if ( it != mKeyFrames.end() )
302 mKeyFrames.erase( it );
304 mKeyFrames.insert( std::make_pair( pKey->pos(), pKey ) );
308 Status Layer::save( QString strDataFolder )
310 QStringList debugInfo = QStringList() <<
"Layer::save" << QString(
"strDataFolder = " ).append( strDataFolder );
312 for (
auto pair : mKeyFrames )
315 Status st = saveKeyFrame( pKeyFrame, strDataFolder );
319 QStringList keyFrameDetails = st.detailsList();
320 for ( QString detail : keyFrameDetails )
322 detail.prepend(
" " );
324 debugInfo << QString(
"- Keyframe[%1] failed to save" ).arg( pKeyFrame->pos() ) << keyFrameDetails;
329 return Status( Status::FAIL, debugInfo );
334 void Layer::paintTrack( QPainter& painter,
TimeLineCells* cells,
int x,
int y,
int width,
int height,
bool selected,
int frameSize )
336 painter.setFont( QFont(
"helvetica", height / 2 ) );
340 if ( type() == BITMAP ) col = QColor( 151, 176, 244 );
341 if ( type() == VECTOR ) col = QColor( 150, 242, 150 );
342 if ( type() == SOUND ) col = QColor( 237, 147, 147 );
343 if ( type() == CAMERA ) col = QColor( 239, 232, 148 );
345 painter.setBrush( col );
346 painter.setPen( QPen( QBrush( QColor( 100, 100, 100 ) ), 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin ) );
347 painter.drawRect( x, y - 1, width, height );
349 paintFrames( painter, cells, y, height, selected, frameSize );
354 paintSelection( painter, x, y, width, height );
359 painter.setBrush( Qt::gray );
360 painter.setPen( QPen( QBrush( QColor( 100, 100, 100 ) ), 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin ) );
361 painter.drawRect( x, y - 1, width, height );
365 void Layer::paintFrames( QPainter& painter,
TimeLineCells* cells,
int y,
int height,
bool selected,
int frameSize )
367 painter.setPen( QPen( QBrush( QColor( 40, 40, 40 ) ), 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin ) );
371 for (
auto pair : mKeyFrames )
373 int framePos = pair.first;
375 int recLeft = cells->getFrameX( framePos ) - frameSize + 2;
377 int recWidth = frameSize - 2;
378 int recHeight = height - 4;
381 if ( key->length() > 1 )
385 recWidth = frameSize * key->length() - 2;
388 if ( pair.second->isSelected() )
390 painter.setBrush( QColor( 60, 60, 60 ) );
394 painter.setBrush( QColor( 60, 60, 60, 120 ) );
397 painter.drawRect( recLeft, recTop, recWidth, recHeight );
401 void Layer::paintLabel( QPainter& painter,
TimeLineCells* cells,
int x,
int y,
int width,
int height,
bool selected,
int allLayers )
404 painter.setBrush( Qt::lightGray );
405 painter.setPen( QPen( QBrush( QColor( 100, 100, 100 ) ), 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin ) );
406 painter.drawRect( x, y - 1, width, height );
410 if ( allLayers == 0 ) painter.setBrush( Qt::NoBrush );
411 if ( allLayers == 1 ) painter.setBrush( Qt::darkGray );
412 if ( ( allLayers == 2 ) || selected ) painter.setBrush( Qt::black );
416 painter.setBrush( Qt::NoBrush );
418 painter.setPen( Qt::black );
419 painter.setRenderHint( QPainter::Antialiasing,
true );
420 painter.drawEllipse( x + 6, y + 4, 9, 9 );
421 painter.setRenderHint( QPainter::Antialiasing,
false );
425 paintSelection( painter, x, y, width, height );
428 if ( type() == BITMAP ) painter.drawPixmap( QPoint( 20, y + 2 ), QPixmap(
":/icons/layer-bitmap.png" ) );
429 if ( type() == VECTOR ) painter.drawPixmap( QPoint( 20, y + 2 ), QPixmap(
":/icons/layer-vector.png" ) );
430 if ( type() == SOUND ) painter.drawPixmap( QPoint( 21, y + 2 ), QPixmap(
":/icons/layer-sound.png" ) );
431 if ( type() == CAMERA ) painter.drawPixmap( QPoint( 21, y + 2 ), QPixmap(
":/icons/layer-camera.png" ) );
433 painter.setFont( QFont(
"helvetica", height / 2 ) );
434 painter.setPen( Qt::black );
435 painter.drawText( QPoint( 45, y + ( 2 * height ) / 3 ), mName );
438 void Layer::paintSelection( QPainter& painter,
int x,
int y,
int width,
int height )
440 QLinearGradient linearGrad( QPointF( 0, y ), QPointF( 0, y + height ) );
441 QSettings settings( PENCIL2D, PENCIL2D );
442 QString style = settings.value(
"style" ).toString();
443 linearGrad.setColorAt( 0, QColor( 255, 255, 255, 128 ) );
444 linearGrad.setColorAt( 0.50, QColor( 255, 255, 255, 64 ) );
445 linearGrad.setColorAt( 1, QColor( 255, 255, 255, 0 ) );
446 painter.setBrush( linearGrad );
447 painter.setPen( Qt::NoPen );
448 painter.drawRect( x, y, width, height - 1 );
451 void Layer::mousePress( QMouseEvent* event,
int frameNumber )
454 Q_UNUSED( frameNumber );
457 void Layer::mouseDoubleClick( QMouseEvent* event,
int frameNumber )
460 Q_UNUSED( frameNumber );
463 void Layer::mouseMove( QMouseEvent* event,
int frameNumber )
466 Q_UNUSED( frameNumber );
469 void Layer::mouseRelease( QMouseEvent* event,
int frameNumber )
472 Q_UNUSED( frameNumber );
475 void Layer::editProperties()
477 QRegExp regex(
"([\\xFFEF-\\xFFFF])+");
480 QString text = QInputDialog::getText( NULL, tr(
"Layer Properties" ),
481 tr(
"Layer name:" ), QLineEdit::Normal,
483 if ( ok && !text.isEmpty() )
485 text.replace(regex,
"");
491 void Layer::setUpdated()
493 mObject->setLayerUpdated(mId);
496 void Layer::setModified(
int position,
bool )
498 auto it = mKeyFrames.find( position );
499 if ( it != mKeyFrames.end() )
506 bool Layer::isFrameSelected(
int position)
508 KeyFrame *keyFrame = getKeyFrameWhichCovers(position);
511 return mSelectedFrames_byLast.contains(keyFrame->pos());
519 void Layer::setFrameSelected(
int position,
bool isSelected)
521 KeyFrame *keyFrame = getKeyFrameWhichCovers(position);
522 if (keyFrame !=
nullptr) {
523 int startPosition = keyFrame->pos();
525 if (isSelected && !mSelectedFrames_byLast.contains(startPosition)) {
529 mSelectedFrames_byLast.insert(0, startPosition);
530 mSelectedFrames_byPosition.append(startPosition);
535 qSort(mSelectedFrames_byPosition.begin(), mSelectedFrames_byPosition.end(), sortAsc);
538 else if (!isSelected){
542 int iLast = mSelectedFrames_byLast.indexOf(startPosition);
543 mSelectedFrames_byLast.removeAt(iLast);
545 int iPos = mSelectedFrames_byPosition.indexOf(startPosition);
546 mSelectedFrames_byPosition.removeAt(iPos);
548 keyFrame->setSelected(isSelected);
552 void Layer::toggleFrameSelected(
int position,
bool allowMultiple)
554 bool wasSelected = isFrameSelected(position);
556 if (!allowMultiple) {
560 setFrameSelected(position, !wasSelected);
563 void Layer::extendSelectionTo(
int position)
565 if (mSelectedFrames_byLast.count() > 0 ) {
566 int lastSelected = mSelectedFrames_byLast[0];
570 if (lastSelected < position) {
571 startPos = lastSelected;
576 endPos = lastSelected;
580 while (i <= endPos) {
581 setFrameSelected(i,
true);
587 void Layer::selectAllFramesAfter(
int position )
589 int startPosition = position;
590 int endPosition = getMaxKeyFramePosition();
592 if (!keyExists(startPosition)) {
593 startPosition = getNextKeyFramePosition(startPosition);
596 if (startPosition > 0 && startPosition <= endPosition ) {
598 setFrameSelected(startPosition,
true);
599 extendSelectionTo(endPosition);
603 void Layer::deselectAll()
605 mSelectedFrames_byLast.clear();
606 mSelectedFrames_byPosition.clear();
608 for (
auto pair : mKeyFrames )
610 pair.second->setSelected(
false);
614 bool Layer::moveSelectedFrames(
int offset)
617 if (offset != 0 && mSelectedFrames_byPosition.count() > 0) {
620 int indexInSelection = mSelectedFrames_byPosition.count() - 1;
626 indexInSelection = 0;
630 if (mSelectedFrames_byPosition[0] + offset < 1) {
636 while ( indexInSelection > -1 && indexInSelection < mSelectedFrames_byPosition.count() ) {
638 int fromPos = mSelectedFrames_byPosition[indexInSelection];
639 int toPos = fromPos + offset;
642 KeyFrame *selectedFrame = getKeyFrameAt(fromPos);
644 if (selectedFrame !=
nullptr) {
646 mKeyFrames.erase(fromPos);
651 bool isBetween =
true;
652 int targetPosition = fromPos;
656 int framePosition = targetPosition - step;
658 KeyFrame *frame = getKeyFrameAt(framePosition);
660 if (frame !=
nullptr) {
661 mKeyFrames.erase(framePosition);
663 frame->setPos(targetPosition);
664 mKeyFrames.insert( std::make_pair( targetPosition, frame ) );
667 targetPosition = targetPosition - step;
668 if (fromPos < toPos && (targetPosition < fromPos || targetPosition >= toPos)) {
671 if (fromPos > toPos && (targetPosition > fromPos || targetPosition <= toPos)) {
682 selectedFrame->setPos(toPos);
683 mKeyFrames.insert( std::make_pair( toPos, selectedFrame ) );
686 indexInSelection = indexInSelection + step;
692 for (
int i=0; i<mSelectedFrames_byPosition.count(); i++) {
693 mSelectedFrames_byPosition[i] = mSelectedFrames_byPosition[i] + offset;
695 for (
int i=0; i<mSelectedFrames_byLast.count(); i++) {
696 mSelectedFrames_byLast[i] = mSelectedFrames_byLast[i] + offset;
707 bool isLayerPaintable(
Layer* layer )
709 Q_ASSERT( layer !=
nullptr );
711 switch ( layer->type() )
722 bool Layer::keyExistsWhichCovers(
int frameNumber)
724 return getKeyFrameWhichCovers(frameNumber) !=
nullptr;
727 KeyFrame *Layer::getKeyFrameWhichCovers(
int frameNumber)
729 auto keyFrame = getLastKeyFrameAtPosition(frameNumber);
731 if( keyFrame !=
nullptr )
733 if(keyFrame->pos() + keyFrame->length() > frameNumber)