18 #include "timecontrols.h"
25 #include "playbackmanager.h"
26 #include "layermanager.h"
27 #include "pencildef.h"
29 #include "preferencemanager.h"
31 #include "pencildef.h"
38 void TimeControls::initUI()
44 mFpsBox->
setValue(settings.value(
"Fps").toInt());
51 mFps = mFpsBox->
value();
53 mTimecodeSelect->
setIcon(
QIcon(
":app/icons/new/svg/more_options.svg"));
59 mTimecodeLabelEnum = mEditor->preference()->getInt(SETTING::TIMECODE_TEXT);
60 mTimecodeLabel =
new QLabel(
this);
64 switch (mTimecodeLabelEnum)
73 mTimecodeLabel->
setToolTip(
tr(
"Timecode format MM:SS:FF"));
82 mLoopStartSpinBox =
new QSpinBox(
this);
84 mLoopStartSpinBox->
setValue(settings.value(
"loopStart").toInt());
87 mLoopStartSpinBox->
setToolTip(
tr(
"Start of playback loop"));
90 mLoopEndSpinBox =
new QSpinBox(
this);
92 mLoopEndSpinBox->
setValue(settings.value(
"loopEnd").toInt());
98 mPlaybackRangeCheckBox =
new QCheckBox(
tr(
"Range"));
100 mPlaybackRangeCheckBox->
setToolTip(
tr(
"Playback range"));
109 mLoopIcon =
QIcon(
":icons/controls/loop.png");
110 mSoundIcon =
QIcon(
":icons/controls/sound.png");
111 if (mEditor->preference()->isOn(SETTING::SOUND_SCRUB_ACTIVE))
112 mSoundScrubIcon =
QIcon(
":icons/controls/soundscrub.png");
114 mSoundScrubIcon =
QIcon(
":icons/controls/soundscrub-disabled.png");
115 mJumpToEndIcon =
QIcon(
":icons/controls/endplay.png");
116 mJumpToStartIcon =
QIcon(
":icons/controls/startplay.png");
117 mStartIcon =
QIcon(
":icons/controls/play.png");
118 mStopIcon =
QIcon(
":icons/controls/stop.png");
119 mPlayButton->
setIcon(mStartIcon);
120 mLoopButton->
setIcon(mLoopIcon);
121 mSoundButton->
setIcon(mSoundIcon);
122 mSoundScrubButton->
setIcon(mSoundScrubIcon);
123 mJumpToEndButton->
setIcon(mJumpToEndIcon);
124 mJumpToStartButton->
setIcon(mJumpToStartIcon);
129 mSoundScrubButton->
setToolTip(
tr(
"Sound scrub on/off"));
130 mJumpToEndButton->
setToolTip(
tr(
"Jump to the End",
"Tooltip of the jump to end button"));
131 mJumpToStartButton->
setToolTip(
tr(
"Jump to the Start",
"Tooltip of the jump to start button"));
137 mSoundScrubButton->
setChecked(mEditor->preference()->isOn(SETTING::SOUND_SCRUB_ACTIVE));
151 mTimecodeLabelAction =
addWidget(mTimecodeLabel);
158 void TimeControls::updateUI()
162 mPlaybackRangeCheckBox->
setChecked(playback->isRangedPlaybackOn());
165 mLoopStartSpinBox->
setValue(playback->markInFrame());
168 mLoopEndSpinBox->
setValue(playback->markOutFrame());
174 mLoopButton->
setChecked(playback->isLooping());
177 void TimeControls::setEditor(
Editor* editor)
179 Q_ASSERT(editor !=
nullptr);
183 void TimeControls::setFps(
int value)
188 updateTimecodeLabel(mEditor->currentFrame());
191 void TimeControls::setLoop(
bool checked)
196 void TimeControls::setRangeState(
bool checked)
199 mTimeline->updateLength();
202 void TimeControls::makeConnections()
211 connect(mLoopStartSpinBox, spinBoxValueChanged,
this, &TimeControls::loopStartValueChanged);
212 clearFocusOnFinished(mLoopStartSpinBox);
213 connect(mLoopEndSpinBox, spinBoxValueChanged,
this, &TimeControls::loopEndValueChanged);
214 clearFocusOnFinished(mLoopEndSpinBox);
225 connect(mFpsBox, spinBoxValueChanged,
this, &TimeControls::fpsChanged);
228 connect(mFpsBox, spinBoxValueChanged,
this, &TimeControls::setFps);
229 connect(mEditor, &Editor::fpsChanged,
this, &TimeControls::setFps);
236 void TimeControls::playButtonClicked()
238 emit playButtonTriggered();
241 void TimeControls::updatePlayState()
243 if (mEditor->playback()->isPlaying())
245 mPlayButton->
setIcon(mStopIcon);
250 mPlayButton->
setIcon(mStartIcon);
255 void TimeControls::jumpToStartButtonClicked()
259 mEditor->scrubTo(mLoopStartSpinBox->
value());
260 mEditor->playback()->setCheckForSoundsHalfway(
true);
264 mEditor->scrubTo(mEditor->layers()->firstKeyFrameIndex());
266 mEditor->playback()->stopSounds();
269 void TimeControls::jumpToEndButtonClicked()
273 mEditor->scrubTo(mLoopEndSpinBox->
value());
277 mEditor->scrubTo(mEditor->layers()->lastKeyFrameIndex());
281 void TimeControls::loopButtonClicked(
bool bChecked)
283 mEditor->playback()->setLooping(bChecked);
286 void TimeControls::playbackRangeClicked(
bool bChecked)
288 mEditor->playback()->enableRangedPlayback(bChecked);
291 void TimeControls::loopStartValueChanged(
int i)
293 if (i >= mLoopEndSpinBox->
value())
299 mEditor->playback()->setRangedStartFrame(i);
300 mTimeline->updateLength();
303 void TimeControls::loopEndValueChanged(
int i)
305 mEditor->playback()->setRangedEndFrame(i);
306 mTimeline->updateLength();
309 void TimeControls::updateSoundIcon(
bool soundEnabled)
313 mSoundButton->
setIcon(
QIcon(
":icons/controls/sound.png"));
317 mSoundButton->
setIcon(
QIcon(
":icons/controls/sound-disabled.png"));
321 void TimeControls::updateSoundScrubIcon(
bool soundScrubEnabled)
323 if (soundScrubEnabled)
325 mSoundScrubButton->
setIcon(
QIcon(
":icons/controls/soundscrub.png"));
326 mEditor->playback()->setSoundScrubActive(
true);
327 mEditor->preference()->set(SETTING::SOUND_SCRUB_ACTIVE,
true);
331 mSoundScrubButton->
setIcon(
QIcon(
":icons/controls/soundscrub-disabled.png"));
332 mEditor->playback()->setSoundScrubActive(
false);
333 mEditor->preference()->set(SETTING::SOUND_SCRUB_ACTIVE,
false);
337 void TimeControls::noTimecodeText()
340 settings.setValue(SETTING_TIMECODE_TEXT, NOTEXT);
341 mTimecodeLabelEnum = NOTEXT;
343 updateTimecodeLabel(mEditor->currentFrame());
346 void TimeControls::onlyFramesText()
349 settings.setValue(SETTING_TIMECODE_TEXT, FRAMES);
350 mTimecodeLabelEnum = FRAMES;
352 updateTimecodeLabel(mEditor->currentFrame());
355 void TimeControls::sffText()
358 settings.setValue(SETTING_TIMECODE_TEXT, SFF);
359 mTimecodeLabelEnum = SFF;
361 updateTimecodeLabel(mEditor->currentFrame());
364 void TimeControls::smpteText()
367 settings.setValue(SETTING_TIMECODE_TEXT, SMPTE);
368 mTimecodeLabelEnum = SMPTE;
369 mTimecodeLabel->
setToolTip(
tr(
"Timecode format MM:SS:FF"));
370 updateTimecodeLabel(mEditor->currentFrame());
376 emit fpsChanged(mFpsBox->
value());
377 mFps = mFpsBox->
value();
380 void TimeControls::updateTimecodeLabel(
int frame)
384 switch (mTimecodeLabelEnum)
386 case TimecodeTextLevel::SMPTE:
392 case TimecodeTextLevel::SFF:
397 case TimecodeTextLevel::FRAMES:
400 case TimecodeTextLevel::NOTEXT:
408 void TimeControls::updateLength(
int frameLength)
410 mLoopStartSpinBox->
setMaximum(frameLength - 1);
void triggered(bool checked)
void setSuffix(const QString &suffix)
void onFpsEditingFinished()
Work-around in case the FPS spin-box "valueChanged" signal doesn't work.
QString tr(const char *sourceText, const char *disambiguation, int n)
QString number(int n, int base)
void setText(const QString &)
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QObject * parent() const const
void setContentsMargins(int left, int top, int right, int bottom)