Pencil2D  ff90c0872e88be3bf81c548cd60f01983012ec49
Pencil2D is an animation software for both bitmap and vector graphics. It is free, multi-platform, and open source.
 All Classes Functions
timecontrols.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 <QtGui>
19 #include <QLabel>
20 #include "timecontrols.h"
21 #include "editor.h"
22 #include "playbackmanager.h"
23 #include "layermanager.h"
24 #include "pencildef.h"
25 #include "util.h"
26 #include "preferencemanager.h"
27 #include "timeline.h"
28 
29 
30 TimeControls::TimeControls(TimeLine *parent ) : QToolBar( parent )
31 {
32  QSettings settings( PENCIL2D, PENCIL2D );
33 
34  mFpsBox = new QSpinBox();
35  mFpsBox->setFont( QFont("Helvetica", 10) );
36  mFpsBox->setFixedHeight(24);
37  mFpsBox->setValue(settings.value("fps").toInt());
38  mFpsBox->setMinimum(1);
39  mFpsBox->setMaximum(90);
40  mFpsBox->setSuffix(" fps");
41  mFpsBox->setToolTip( tr("Frames per second") );
42  mFpsBox->setFocusPolicy(Qt::WheelFocus);
43 
44  mLoopStartSpinBox = new QSpinBox();
45  mLoopStartSpinBox->setFont( QFont("Helvetica", 10) );
46  mLoopStartSpinBox->setFixedHeight(24);
47  mLoopStartSpinBox->setValue(settings.value("loopStart").toInt());
48  mLoopStartSpinBox->setMinimum(1);
49  mLoopStartSpinBox->setMaximum(parent->getFrameLength() - 1);
50  mLoopStartSpinBox->setToolTip(tr("Start of playback loop"));
51  mLoopStartSpinBox->setFocusPolicy(Qt::WheelFocus);
52 
53  mLoopEndSpinBox= new QSpinBox();
54  mLoopEndSpinBox->setFont( QFont("Helvetica", 10) );
55  mLoopEndSpinBox->setFixedHeight(24);
56  mLoopEndSpinBox->setValue( settings.value( "loopEnd" ).toInt() );
57  mLoopEndSpinBox->setMinimum(mLoopStartSpinBox->value() + 1);
58  mLoopEndSpinBox->setMaximum(parent->getFrameLength());
59  mLoopEndSpinBox->setToolTip(tr("End of playback loop"));
60  mLoopEndSpinBox->setFocusPolicy(Qt::WheelFocus);
61 
62  mPlaybackRangeCheckBox = new QCheckBox( tr("Range") );
63  mPlaybackRangeCheckBox->setFont( QFont("Helvetica", 10) );
64  mPlaybackRangeCheckBox->setFixedHeight(24);
65  mPlaybackRangeCheckBox->setToolTip(tr("Playback range"));
66 
67  mPlayButton = new QPushButton( this );
68  mLoopButton = new QPushButton();
69  mSoundButton = new QPushButton();
70  mJumpToEndButton= new QPushButton();
71  mJumpToStartButton= new QPushButton();
72 
73  mLoopIcon = QIcon(":icons/controls/loop.png");
74  mSoundIcon = QIcon(":icons/controls/sound.png");
75  mJumpToEndIcon = QIcon(":icons/controls/endplay.png");
76  mJumpToStartIcon = QIcon(":icons/controls/startplay.png");
77  mStartIcon = QIcon(":icons/controls/play.png");
78  mStopIcon = QIcon(":icons/controls/stop.png");
79  mPlayButton->setIcon(mStartIcon);
80  mLoopButton->setIcon(mLoopIcon);
81  mSoundButton->setIcon(mSoundIcon);
82  mJumpToEndButton->setIcon(mJumpToEndIcon);
83  mJumpToStartButton->setIcon(mJumpToStartIcon);
84 
85  mPlayButton->setToolTip(tr("Play"));
86  mLoopButton->setToolTip(tr("Loop"));
87  mSoundButton->setToolTip(tr("Sound on/off"));
88  mJumpToEndButton->setToolTip(tr("End"));
89  mJumpToStartButton->setToolTip(tr("Start"));
90 
91  mLoopButton->setCheckable(true);
92  mSoundButton->setCheckable(true);
93  mSoundButton->setChecked(true);
94 
95  addWidget(mJumpToStartButton);
96  addWidget(mPlayButton);
97  addWidget(mJumpToEndButton);
98  addWidget(mLoopButton);
99  addWidget(mPlaybackRangeCheckBox);
100  addWidget(mLoopStartSpinBox);
101  addWidget(mLoopEndSpinBox);
102  addWidget(mSoundButton);
103  addWidget(mFpsBox);
104 
105  makeConnections();
106 
107  auto spinBoxValueChanged = static_cast< void ( QSpinBox::* )( int ) >( &QSpinBox::valueChanged );
108  connect( mLoopStartSpinBox, spinBoxValueChanged, this, &TimeControls::preLoopStartClick );
109  connect( mLoopEndSpinBox, spinBoxValueChanged, this, &TimeControls::loopEndClick );
110 
111  connect( mPlaybackRangeCheckBox, &QCheckBox::toggled, mLoopStartSpinBox, &QSpinBox::setEnabled );
112  connect( mPlaybackRangeCheckBox, &QCheckBox::toggled, mLoopEndSpinBox, &QSpinBox::setEnabled );
113 
114  connect( mSoundButton, &QPushButton::clicked, this, &TimeControls::soundClick );
115  connect( mSoundButton, &QPushButton::clicked, this, &TimeControls::updateSoundIcon );
116  connect( mFpsBox, spinBoxValueChanged, this, &TimeControls::fpsClick );
117 }
118 
119 void TimeControls::initUI()
120 {
121  updateUI();
122 }
123 
124 void TimeControls::updateUI()
125 {
126  PlaybackManager* playback = mEditor->playback();
127 
128  mPlaybackRangeCheckBox->setChecked( playback->isRangedPlaybackOn() ); // don't block this signal
129 
130  SignalBlocker b1( mLoopStartSpinBox );
131  mLoopStartSpinBox->setValue( playback->markInFrame() );
132 
133  SignalBlocker b2( mLoopEndSpinBox );
134  mLoopEndSpinBox->setValue( playback->markOutFrame() );
135 
136  SignalBlocker b3( mFpsBox );
137  mFpsBox->setValue( playback->fps() );
138 
139  SignalBlocker b4( mLoopButton );
140  mLoopButton->setChecked( playback->isLooping() );
141 }
142 
143 void TimeControls::setFps( int value )
144 {
145  SignalBlocker blocker( mFpsBox );
146  mFpsBox->setValue(value);
147 }
148 
149 void TimeControls::toggleLoop(bool checked)
150 {
151  mLoopButton->setChecked(checked);
152 }
153 
154 void TimeControls::toggleLoopControl(bool checked)
155 {
156  mPlaybackRangeCheckBox->setChecked(checked);
157 }
158 
159 void TimeControls::setCore( Editor* editor )
160 {
161  Q_ASSERT( editor != nullptr );
162  mEditor = editor;
163 }
164 
165 void TimeControls::makeConnections()
166 {
167  connect( mPlayButton, &QPushButton::clicked, this, &TimeControls::playButtonClicked );
168  connect( mJumpToEndButton, &QPushButton::clicked, this, &TimeControls::jumpToEndButtonClicked );
169  connect( mJumpToStartButton, &QPushButton::clicked, this, &TimeControls::jumpToStartButtonClicked );
170  connect( mLoopButton, &QPushButton::clicked, this, &TimeControls::loopButtonClicked );
171  connect( mPlaybackRangeCheckBox, &QCheckBox::clicked, this, &TimeControls::playbackRangeClicked );
172 }
173 
174 void TimeControls::playButtonClicked()
175 {
176  if ( mEditor->playback()->isPlaying() )
177  {
178  mEditor->playback()->stop();
179  }
180  else
181  {
182  mEditor->playback()->play();
183  }
184  updatePlayState();
185 }
186 
187 void TimeControls::updatePlayState()
188 {
189  if( mEditor->playback()->isPlaying() )
190  {
191  mPlayButton->setIcon(mStopIcon);
192  mPlayButton->setToolTip(tr("Stop"));
193  }
194  else
195  {
196  mPlayButton->setIcon(mStartIcon);
197  mPlayButton->setToolTip(tr("Start"));
198  }
199 }
200 
201 void TimeControls::jumpToStartButtonClicked()
202 {
203  if ( mPlaybackRangeCheckBox->isChecked() )
204  {
205  mEditor->scrubTo( mLoopStartSpinBox->value() );
206  }
207  else
208  {
209  mEditor->scrubTo( mEditor->layers()->firstKeyFrameIndex() );
210  }
211 }
212 
213 void TimeControls::jumpToEndButtonClicked()
214 {
215  if ( mPlaybackRangeCheckBox->isChecked() )
216  {
217  mEditor->scrubTo( mLoopEndSpinBox->value() );
218  }
219  else
220  {
221  mEditor->scrubTo( mEditor->layers()->lastKeyFrameIndex() );
222  }
223 }
224 
225 void TimeControls::loopButtonClicked( bool bChecked )
226 {
227  mEditor->playback()->setLooping( bChecked );
228 }
229 
230 void TimeControls::playbackRangeClicked( bool bChecked )
231 {
232  mEditor->playback()->enableRangedPlayback( bChecked );
233  emit rangeStateChange();
234 }
235 
236 void TimeControls::preLoopStartClick(int i) {
237  if( i >= mLoopEndSpinBox->value() )
238  {
239  mLoopEndSpinBox->setValue( i + 1 );
240  }
241  mLoopEndSpinBox->setMinimum( i + 1 );
242 
243  emit loopStartClick(i);
244 }
245 
246 void TimeControls::updateSoundIcon(bool soundEnabled)
247 {
248  if(soundEnabled)
249  {
250  mSoundButton->setIcon( QIcon(":icons/controls/sound.png") );
251  }
252  else
253  {
254  mSoundButton->setIcon( QIcon(":icons/controls/sound-disabled.png") );
255  }
256 }
257 
258 void TimeControls::updateLength(int frameLength) {
259  mLoopStartSpinBox->setMaximum(frameLength - 1);
260  mLoopEndSpinBox->setMaximum(frameLength);
261 }
Definition: editor.h:45