Pencil2D  ff90c0872e88be3bf81c548cd60f01983012ec49
Pencil2D is an animation software for both bitmap and vector graphics. It is free, multi-platform, and open source.
 All Classes Functions
timelinecells.cpp
1 /*
2 
3 Pencil - Traditional Animation Software
4 Copyright (C) 2005-2007 Patrick Corrieri & Pascal Naidon
5 Copyright (C) 2012-2017 Matthew Chiawen Chang
6 
7 This program is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License
9 as published by the Free Software Foundation; version 2 of the License.
10 
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15 
16 */
17 
18 #include "timelinecells.h"
19 
20 #include <QSettings>
21 #include <QResizeEvent>
22 #include <QMouseEvent>
23 #include "object.h"
24 #include "editor.h"
25 #include "timeline.h"
26 #include "layermanager.h"
27 #include "playbackmanager.h"
28 #include "preferencemanager.h"
29 #include "toolmanager.h"
30 
31 
32 TimeLineCells::TimeLineCells( TimeLine* parent, Editor* editor, TIMELINE_CELL_TYPE type ) : QWidget( parent )
33 {
34  timeLine = parent;
35  mEditor = editor;
36  mPrefs = editor->preference();
37  m_eType = type;
38 
39  m_pCache = NULL;
40 
41  frameLength = mPrefs->getInt(SETTING::TIMELINE_SIZE);
42  fontSize = mPrefs->getInt(SETTING::LABEL_FONT_SIZE);
43  frameSize = mPrefs->getInt(SETTING::FRAME_SIZE);
44  shortScrub = mPrefs->isOn(SETTING::SHORT_SCRUB);
45  drawFrameNumber = mPrefs->isOn(SETTING::DRAW_LABEL);
46 
47  startY = 0;
48  endY = 0;
49  mouseMoveY = 0;
50  startLayerNumber = -1;
51  frameOffset = 0;
52  layerOffset = 0;
53  layerHeight = 20;
54 
55 
56  setMinimumSize( 500, 4 * layerHeight );
57  setSizePolicy( QSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding ) );
58  setAttribute( Qt::WA_OpaquePaintEvent, false );
59 
60  connect( mPrefs, &PreferenceManager::optionChanged, this, &TimeLineCells::loadSetting );
61 }
62 
63 TimeLineCells::~TimeLineCells()
64 {
65  if ( m_pCache ) delete m_pCache;
66 }
67 
68 void TimeLineCells::loadSetting(SETTING setting)
69 {
70  switch (setting)
71  {
72  case SETTING::TIMELINE_SIZE:
73  frameLength = mPrefs->getInt(SETTING::TIMELINE_SIZE);
74  timeLine->updateLength();
75  break;
76  case SETTING::LABEL_FONT_SIZE:
77  fontSize = mPrefs->getInt(SETTING::LABEL_FONT_SIZE);
78  break;
79  case SETTING::FRAME_SIZE:
80  frameSize = mPrefs->getInt(SETTING::FRAME_SIZE);
81  timeLine->updateLength();
82  break;
83  case SETTING::SHORT_SCRUB:
84  shortScrub = mPrefs->isOn(SETTING::SHORT_SCRUB);
85  break;
86  case SETTING::DRAW_LABEL:
87  drawFrameNumber = mPrefs->isOn(SETTING::DRAW_LABEL);
88  break;
89  default:
90  break;
91  }
92  updateContent();
93 }
94 
95 int TimeLineCells::getFrameNumber( int x )
96 {
97  int frameNumber = frameOffset + 1 + ( x - m_offsetX ) / frameSize;
98  return frameNumber;
99 }
100 
101 int TimeLineCells::getFrameX( int frameNumber )
102 {
103  int x = m_offsetX + ( frameNumber - frameOffset ) * frameSize;
104  return x;
105 }
106 
107 int TimeLineCells::getLayerNumber( int y )
108 {
109  int layerNumber = layerOffset + ( y - m_offsetY ) / layerHeight;
110 
111  // Layers numbers are displayed in descending order
112  // The last row is layer 0
113  if (layerNumber <= mEditor->object()->getLayerCount())
114  layerNumber = mEditor->object()->getLayerCount() - 1 - layerNumber;
115  else
116  layerNumber = 0;
117 
118  if ( y < m_offsetY )
119  {
120  layerNumber = -1;
121  }
122 
123  if ( layerNumber >= mEditor->object()->getLayerCount() )
124  {
125  layerNumber = mEditor->object()->getLayerCount();
126  }
127 
128  //If the mouse release event if fired with mouse off the frame of the application
129  // mEditor->object()->getLayerCount() doesn't return the correct value.
130  if (layerNumber <-1)
131  {
132  layerNumber=-1;
133  }
134 
135 
136  return layerNumber;
137 }
138 
139 int TimeLineCells::getLayerY( int layerNumber )
140 {
141  //return offsetY + (layerNumber-layerOffset)*layerHeight;
142  return m_offsetY + ( mEditor->object()->getLayerCount() - 1 - layerNumber - layerOffset )*layerHeight;
143 }
144 
145 void TimeLineCells::updateFrame( int frameNumber )
146 {
147  int x = getFrameX( frameNumber );
148  update( x - frameSize, 0, frameSize + 1, height() );
149 }
150 
151 void TimeLineCells::updateContent()
152 {
153  drawContent();
154  update();
155 }
156 
157 void TimeLineCells::drawContent()
158 {
159  if ( m_pCache == NULL )
160  {
161  m_pCache = new QPixmap( size() );
162  if ( m_pCache->isNull() )
163  {
164  // fail to create cache
165  return;
166  }
167  }
168 
169  QPainter painter( m_pCache );
170 
171  Object* object = mEditor->object();
172 
173  Q_ASSERT_X( object != nullptr, "", "" );
174 
175  Layer* layer = object->getLayer( mEditor->layers()->currentLayerIndex() );
176  if ( layer == NULL ) return;
177 
178  // grey background of the view
179  painter.setPen( Qt::NoPen );
180  painter.setBrush( Qt::lightGray );
181  painter.drawRect( QRect( 0, 0, width(), height() ) );
182 
183  // --- draw layers of the current object
184  for ( int i = 0; i < object->getLayerCount(); i++ )
185  {
186  if ( i != mEditor->layers()->currentLayerIndex() )
187  {
188  Layer* layeri = object->getLayer( i );
189  if ( layeri != NULL )
190  {
191  switch ( m_eType )
192  {
193  case TIMELINE_CELL_TYPE::Tracks:
194  layeri->paintTrack( painter, this, m_offsetX,
195  getLayerY( i ), width() - m_offsetX,
196  getLayerHeight(), false, frameSize );
197  break;
198 
199  case TIMELINE_CELL_TYPE::Layers:
200  layeri->paintLabel( painter, this, 0,
201  getLayerY( i ), width() - 1,
202  getLayerHeight(), false, mEditor->allLayers() );
203  break;
204  }
205  }
206  }
207  }
208  if ( abs( getMouseMoveY() ) > 5 )
209  {
210  if ( m_eType == TIMELINE_CELL_TYPE::Tracks )
211  {
212  layer->paintTrack( painter, this, m_offsetX, getLayerY( mEditor->layers()->currentLayerIndex() ) + getMouseMoveY(), width() - m_offsetX, getLayerHeight(), true, frameSize );
213  }
214  if ( m_eType == TIMELINE_CELL_TYPE::Layers )
215  {
216  layer->paintLabel( painter, this, 0, getLayerY( mEditor->layers()->currentLayerIndex() ) + getMouseMoveY(), width() - 1, getLayerHeight(), true, mEditor->allLayers() );
217  }
218  painter.setPen( Qt::black );
219  painter.drawRect( 0, getLayerY( getLayerNumber( endY ) ) - 1, width(), 2 );
220  }
221  else
222  {
223  if ( m_eType == TIMELINE_CELL_TYPE::Tracks )
224  {
225  layer->paintTrack( painter,
226  this,
227  m_offsetX,
228  getLayerY( mEditor->layers()->currentLayerIndex() ),
229  width() - m_offsetX,
230  getLayerHeight(),
231  true,
232  frameSize );
233  }
234  if ( m_eType == TIMELINE_CELL_TYPE::Layers )
235  {
236  layer->paintLabel( painter,
237  this,
238  0,
239  getLayerY( mEditor->layers()->currentLayerIndex() ),
240  width() - 1,
241  getLayerHeight(),
242  true,
243  mEditor->allLayers() );
244  }
245  }
246 
247  // --- draw top
248  painter.setPen( Qt::NoPen );
249  painter.setBrush( QColor( 220, 220, 220 ) );
250  painter.drawRect( QRect( 0, 0, width() - 1, m_offsetY - 1 ) );
251  painter.setPen( Qt::gray );
252  painter.drawLine( 0, 0, width() - 1, 0 );
253  painter.drawLine( 0, m_offsetY - 2, width() - 1, m_offsetY - 2 );
254  painter.setPen( Qt::lightGray );
255  painter.drawLine( 0, m_offsetY - 3, width() - 1, m_offsetY - 3 );
256  painter.drawLine( 0, 0, 0, m_offsetY - 3 );
257 
258  if ( m_eType == TIMELINE_CELL_TYPE::Layers )
259  {
260  // --- draw circle
261  painter.setPen( Qt::black );
262  if ( mEditor->allLayers() == 0 ) { painter.setBrush( Qt::NoBrush ); }
263  if ( mEditor->allLayers() == 1 ) { painter.setBrush( Qt::darkGray ); }
264  if ( mEditor->allLayers() == 2 ) { painter.setBrush( Qt::black ); }
265  painter.setRenderHint( QPainter::Antialiasing, true );
266  painter.drawEllipse( 6, 4, 9, 9 );
267  painter.setRenderHint( QPainter::Antialiasing, false );
268  }
269  else if ( m_eType == TIMELINE_CELL_TYPE::Tracks )
270  {
271  // --- draw ticks
272  painter.setPen( QColor( 70, 70, 70, 255 ) );
273  painter.setBrush( Qt::darkGray );
274  painter.setFont( QFont( "helvetica", 10 ) );
275  int incr = 0;
276  int fps = mEditor->playback()->fps();
277  for ( int i = frameOffset; i < frameOffset + ( width() - m_offsetX ) / frameSize; i++ )
278  {
279  incr = ( i < 9 ) ? 4 : 0;
280 
281  if(i + 1 >= timeLine->getRangeLower() && i < timeLine->getRangeUpper())
282  {
283  painter.setPen( Qt::NoPen );
284  painter.setBrush( Qt::yellow );
285 
286  painter.drawRect( getFrameX( i ), 1, frameSize + 1, 2 );
287 
288  painter.setPen( QColor( 70, 70, 70, 255 ) );
289  painter.setBrush( Qt::darkGray );
290  }
291 
292  if ( i%fps == 0 )
293  {
294  painter.drawLine( getFrameX( i ), 1, getFrameX( i ), 5 );
295  }
296  else if ( i%fps == fps / 2 )
297  {
298  painter.drawLine( getFrameX( i ), 1, getFrameX( i ), 5 );
299  }
300  else
301  {
302  painter.drawLine( getFrameX( i ), 1, getFrameX( i ), 3 );
303  }
304  if ( i == 0 || i%fps == fps - 1 )
305  {
306  painter.drawText( QPoint( getFrameX( i ) + incr, 15 ), QString::number( i + 1 ) );
307  }
308  }
309 
310  // --- draw left border line
311  painter.setPen( Qt::darkGray );
312  painter.drawLine( 0, 0, 0, height() );
313  }
314 }
315 
316 void TimeLineCells::paintOnionSkin( QPainter& painter )
317 {
318  Layer* layer = mEditor->layers()->currentLayer();
319  if (layer == nullptr) {
320  return;
321  }
322 
323  int frameNumber = mEditor->currentFrame();
324 
325  int prevOnionSkinCount = mEditor->preference()->getInt(SETTING::ONION_PREV_FRAMES_NUM);
326  int nextOnionSkinCount = mEditor->preference()->getInt(SETTING::ONION_NEXT_FRAMES_NUM);
327 
328  bool isAbsolute = (mEditor->preference()->getString(SETTING::ONION_TYPE) == "absolute");
329 
330  if (mEditor->preference()->isOn(SETTING::PREV_ONION) && prevOnionSkinCount > 0) {
331 
332 
333  int onionFrameNumber = layer->getPreviousFrameNumber(frameNumber, isAbsolute);
334  int onionPosition = 0;
335 
336  while (onionPosition < prevOnionSkinCount && onionFrameNumber > 0)
337  {
338  painter.setBrush( QColor( 128, 128, 128, 128 ) );
339  painter.setPen( Qt::NoPen );
340  QRect onionRect;
341  onionRect.setTopLeft( QPoint( getFrameX( onionFrameNumber - 1 ), 0 ) );
342  onionRect.setBottomRight( QPoint( getFrameX( onionFrameNumber ), height() ) );
343  onionRect.setBottomRight( QPoint( getFrameX( onionFrameNumber ), 19 ) );
344  painter.drawRect( onionRect );
345 
346  onionFrameNumber = layer->getPreviousFrameNumber(onionFrameNumber, isAbsolute);
347  onionPosition++;
348  }
349  }
350 
351  if (mEditor->preference()->isOn(SETTING::NEXT_ONION) && nextOnionSkinCount > 0) {
352 
353  int onionFrameNumber = layer->getNextFrameNumber(frameNumber, isAbsolute);
354  int onionPosition = 0;
355 
356  while (onionPosition < nextOnionSkinCount && onionFrameNumber > 0)
357  {
358  painter.setBrush( QColor( 128, 128, 128, 128 ) );
359  painter.setPen( Qt::NoPen );
360  QRect onionRect;
361  onionRect.setTopLeft( QPoint( getFrameX( onionFrameNumber - 1 ), 0 ) );
362  onionRect.setBottomRight( QPoint( getFrameX( onionFrameNumber ), height() ) );
363  onionRect.setBottomRight( QPoint( getFrameX( onionFrameNumber ), 19 ) );
364  painter.drawRect( onionRect );
365 
366  onionFrameNumber = layer->getNextFrameNumber(onionFrameNumber, isAbsolute);
367  onionPosition++;
368  }
369  }
370 }
371 
372 void TimeLineCells::paintEvent( QPaintEvent* event )
373 {
374  Q_UNUSED( event );
375 
376  Object* object = mEditor->object();
377  Layer* layer = mEditor->layers()->currentLayer();
378 
379  Q_ASSUME( object != nullptr && layer != nullptr );
380 
381  QPainter painter( this );
382 
383  bool isPlaying = mEditor->playback()->isPlaying();
384  if ( ( !isPlaying && !timeLine->scrubbing ) || m_pCache == NULL )
385  {
386  drawContent();
387  }
388  if ( m_pCache )
389  {
390  painter.drawPixmap( QPoint( 0, 0 ), *m_pCache );
391  }
392 
393  if ( m_eType == TIMELINE_CELL_TYPE::Tracks )
394  {
395  if (!isPlaying) {
396  paintOnionSkin(painter);
397  }
398 
399  // --- draw the position of the current frame
400  if ( mEditor->currentFrame() > frameOffset )
401  {
402  painter.setBrush( QColor( 255, 0, 0, 128 ) );
403  painter.setPen( Qt::NoPen );
404  painter.setFont( QFont( "helvetica", 10 ) );
405  //painter.setCompositionMode(QPainter::CompositionMode_Source); // this causes the message: QPainter::setCompositionMode: PorterDuff modes not supported on device
406  QRect scrubRect;
407  scrubRect.setTopLeft( QPoint( getFrameX( mEditor->currentFrame() - 1 ), 0 ) );
408  scrubRect.setBottomRight( QPoint( getFrameX( mEditor->currentFrame() ), height() ) );
409  if ( shortScrub )
410  {
411  scrubRect.setBottomRight( QPoint( getFrameX( mEditor->currentFrame() ), 19 ) );
412  }
413  painter.drawRect( scrubRect );
414  painter.setPen( QColor( 70, 70, 70, 255 ) );
415  int incr = 0;
416  if ( mEditor->currentFrame() < 10 )
417  {
418  incr = 4;
419  }
420  else { incr = 0; }
421  painter.drawText( QPoint( getFrameX( mEditor->currentFrame() - 1 ) + incr, 15 ),
422  QString::number( mEditor->currentFrame() ) );
423  }
424  }
425 }
426 
427 void TimeLineCells::resizeEvent( QResizeEvent* event )
428 {
429  clearCache();
430  updateContent();
431  event->accept();
432  emit lengthChanged( getFrameLength() );
433 }
434 
435 void TimeLineCells::mousePressEvent( QMouseEvent* event )
436 {
437  if ( primaryButton != Qt::NoButton ) return;
438  int frameNumber = getFrameNumber( event->pos().x() );
439  int layerNumber = getLayerNumber( event->pos().y() );
440 
441  startY = event->pos().y();
442  startLayerNumber = layerNumber;
443  endY = event->pos().y();
444 
445  startFrameNumber = frameNumber;
446  lastFrameNumber = startFrameNumber;
447 
448  canMoveFrame = false;
449  movingFrames = false;
450 
451  canBoxSelect = false;
452  boxSelecting = false;
453 
454  clickSelecting = false;
455 
456  primaryButton = event->button();
457 
458  mEditor->tools()->currentTool()->switchingLayers();
459  switch ( m_eType )
460  {
461  case TIMELINE_CELL_TYPE::Layers:
462  if ( layerNumber != -1 && layerNumber < mEditor->object()->getLayerCount() )
463  {
464  if ( event->pos().x() < 15 )
465  {
466  mEditor->switchVisibilityOfLayer( layerNumber );
467  }
468  else
469  {
470  mEditor->layers()->setCurrentLayer( layerNumber );
471  }
472  }
473  if ( layerNumber == -1 )
474  {
475  if ( event->pos().x() < 15 )
476  {
477  mEditor->toggleShowAllLayers();
478  }
479  }
480  break;
481  case TIMELINE_CELL_TYPE::Tracks:
482  if ( event->button() == Qt::MidButton )
483  {
484  lastFrameNumber = getFrameNumber( event->pos().x() );
485  }
486  else
487  {
488  if ( frameNumber == mEditor->currentFrame() && ( !shortScrub || ( shortScrub && startY < 20 ) ) )
489  {
490  if (mEditor->playback()->isPlaying())
491  {
492  mEditor->playback()->stop();
493  }
494  timeLine->scrubbing = true;
495  }
496  else
497  {
498  if ( ( layerNumber != -1 ) && layerNumber < mEditor->object()->getLayerCount() )
499  {
500  int previousLayerNumber = mEditor->layers()->currentLayerIndex();
501 
502  if (previousLayerNumber != layerNumber) {
503  Layer *previousLayer = mEditor->object()->getLayer(previousLayerNumber);
504  previousLayer->deselectAll();
505 
506  mEditor->setCurrentLayer( layerNumber );
507  }
508 
509  Layer *currentLayer = mEditor->object()->getLayer(layerNumber);
510 
511 
512  // Check if we are using the alt key
513  //
514  if (event->modifiers() == Qt::AltModifier) {
515 
516  // If it is the case, we select everything that is after the selected frame
517  //
518  clickSelecting = true;
519  canMoveFrame = true;
520 
521  currentLayer->selectAllFramesAfter(frameNumber);
522 
523  }
524  // Check if we are clicking on a non selected frame
525  //
526  else if (!currentLayer->isFrameSelected(frameNumber)) {
527 
528  // If it is the case, we select it
529  //
530  canBoxSelect = true;
531  clickSelecting = true;
532 
533  if ( event->modifiers() == Qt::ControlModifier ) {
534  // Add/remove from already selected
535  currentLayer->toggleFrameSelected(frameNumber, true);
536  }
537  else if ( event->modifiers() == Qt::ShiftModifier ) {
538  // Select a range from the last selected
539  currentLayer->extendSelectionTo(frameNumber);
540  }
541  else {
542  currentLayer->toggleFrameSelected(frameNumber, false);
543  }
544  }
545  else {
546 
547  // We clicked on a selected frame, we can move it
548  //
549  canMoveFrame = true;
550  }
551 
552  currentLayer->mousePress( event, frameNumber );
553  timeLine->updateContent();
554  }
555  else
556  {
557  if ( frameNumber > 0 )
558  {
559  if (mEditor->playback()->isPlaying())
560  {
561  mEditor->playback()->stop();
562  }
563 
564  mEditor->scrubTo( frameNumber );
565 
566  timeLine->scrubbing = true;
567  qDebug( "Scrub to %d frame", frameNumber );
568  }
569  }
570  }
571  }
572  break;
573  }
574 }
575 
576 void TimeLineCells::mouseMoveEvent( QMouseEvent* event )
577 {
578  if ( m_eType == TIMELINE_CELL_TYPE::Layers )
579  {
580  endY = event->pos().y();
581  emit mouseMovedY( endY - startY );
582  }
583  int frameNumber = getFrameNumber( event->pos().x() );
584  //int layerNumber = getLayerNumber( event->pos().y() );
585 
586  if ( m_eType == TIMELINE_CELL_TYPE::Tracks )
587  {
588  if ( primaryButton == Qt::MidButton )
589  {
590  // qMin( max_frame_offset, qMax ( min_frame_offset, draw_frame_offset ) )
591  frameOffset = qMin( qMax( 0, frameLength - width() / getFrameSize() ), qMax( 0, frameOffset + lastFrameNumber - frameNumber ) );
592  update();
593  emit offsetChanged( frameOffset );
594  }
595  else
596  {
597  if ( timeLine->scrubbing )
598  {
599  mEditor->scrubTo( frameNumber );
600  }
601  else
602  {
603  if ( startLayerNumber != -1 && startLayerNumber < mEditor->object()->getLayerCount() )
604  {
605  Layer *currentLayer = mEditor->object()->getLayer(startLayerNumber);
606 
607  // Did we move to another frame ?
608  //
609  if ( frameNumber != lastFrameNumber ) {
610 
611  // Check if the frame we clicked was selected
612  //
613  if ( canMoveFrame ) {
614 
615  // If it is the case, we move the selected frames in the layer
616  //
617  movingFrames = true;
618 
619  int offset = frameNumber - lastFrameNumber;
620  currentLayer->moveSelectedFrames(offset);
621 
622  mEditor->updateCurrentFrame();
623 
624  }
625  else if ( canBoxSelect ){
626 
627  // Otherwise, we do a box select
628  //
629  boxSelecting = true;
630 
631  currentLayer->deselectAll();
632  currentLayer->setFrameSelected(startFrameNumber, true);
633  currentLayer->extendSelectionTo(frameNumber);
634  }
635 
636  lastFrameNumber = frameNumber;
637  }
638 
639  currentLayer->mouseMove( event, frameNumber );
640  }
641  }
642  }
643  }
644  timeLine->update();
645 }
646 
647 void TimeLineCells::mouseReleaseEvent( QMouseEvent* event )
648 {
649  qDebug( "TimeLineCell: mouse release event." );
650  if ( event->button() != primaryButton ) return;
651 
652  primaryButton = Qt::NoButton;
653  endY = startY;
654  emit mouseMovedY( 0 );
655  timeLine->scrubbing = false;
656  int frameNumber = getFrameNumber( event->pos().x() );
657  if ( frameNumber < 1 ) frameNumber = -1;
658  int layerNumber = getLayerNumber( event->pos().y() );
659  if ( m_eType == TIMELINE_CELL_TYPE::Tracks && primaryButton != Qt::MidButton && layerNumber != -1 && layerNumber < mEditor->object()->getLayerCount() )
660  {
661  Layer *currentLayer = mEditor->object()->getLayer(layerNumber);
662 
663  if (!timeLine->scrubbing && !movingFrames && !clickSelecting && !boxSelecting ) {
664 
665  // Deselecting if we didn't move, scrub nor select anything
666  //
667  if ( event->modifiers() == Qt::ControlModifier ) {
668  // Add/remove from already selected
669  currentLayer->toggleFrameSelected(frameNumber, true);
670  }
671  else {
672  currentLayer->toggleFrameSelected(frameNumber, false);
673  }
674  }
675 
676  currentLayer->mouseRelease( event, frameNumber );
677  }
678  if ( m_eType == TIMELINE_CELL_TYPE::Layers && layerNumber != startLayerNumber && startLayerNumber != -1 && layerNumber != -1 )
679  {
680  mEditor->moveLayer( startLayerNumber, layerNumber );
681  }
682  timeLine->updateContent();
683 }
684 
685 void TimeLineCells::mouseDoubleClickEvent( QMouseEvent* event )
686 {
687  int frameNumber = getFrameNumber( event->pos().x() );
688  int layerNumber = getLayerNumber( event->pos().y() );
689 
690  // -- short scrub --
691  if ( event->pos().y() < 20 )
692  {
693  mPrefs->set(SETTING::SHORT_SCRUB, !shortScrub);
694  }
695 
696  // -- layer --
697  Layer* layer = mEditor->object()->getLayer( layerNumber );
698  if ( layer )
699  {
700  if ( m_eType == TIMELINE_CELL_TYPE::Tracks && ( layerNumber != -1 ) && ( frameNumber > 0 ) && layerNumber < mEditor->object()->getLayerCount() )
701  {
702  mEditor->object()->getLayer( layerNumber )->mouseDoubleClick( event, frameNumber );
703  }
704  else if ( m_eType == TIMELINE_CELL_TYPE::Layers )
705  {
706  layer->editProperties();
707  update();
708  }
709  }
710 }
711 
712 void TimeLineCells::hScrollChange( int x )
713 {
714  frameOffset = x;
715  update();
716 }
717 
718 void TimeLineCells::vScrollChange( int x )
719 {
720  layerOffset = x;
721  update();
722 }
723 
724 void TimeLineCells::setMouseMoveY( int x )
725 {
726  mouseMoveY = x;
727  if ( x == 0 )
728  {
729  update();
730  }
731 }
Definition: layer.h:32
Definition: object.h:71
Definition: editor.h:45