1 /*
2 SPDX-FileCopyrightText: 2011 Till Theato <root@ttill.de>
3 SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
4 */
5
6 #include "simplekeyframewidget.h"
7 #include "simpletimelinewidget.h"
8 #include "timecodedisplay.h"
9
10 #include <QGridLayout>
11 #include <QToolButton>
12
13 #include <klocalizedstring.h>
14
SimpleKeyframeWidget(const Timecode & t,int duration,QWidget * parent)15 SimpleKeyframeWidget::SimpleKeyframeWidget(const Timecode &t, int duration, QWidget *parent)
16 : QWidget(parent)
17 {
18 setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
19
20 auto *l = new QGridLayout(this);
21
22 m_timeline = new SimpleTimelineWidget(this);
23 m_timeline->setDuration(duration);
24
25 m_buttonAddDelete = new QToolButton(this);
26 m_buttonAddDelete->setAutoRaise(true);
27 m_buttonAddDelete->setIcon(QIcon::fromTheme(QStringLiteral("list-add")));
28 m_buttonAddDelete->setToolTip(i18n("Add keyframe"));
29
30 m_buttonPrevious = new QToolButton(this);
31 m_buttonPrevious->setAutoRaise(true);
32 m_buttonPrevious->setIcon(QIcon::fromTheme(QStringLiteral("media-skip-backward")));
33 m_buttonPrevious->setToolTip(i18n("Go to previous keyframe"));
34
35 m_buttonNext = new QToolButton(this);
36 m_buttonNext->setAutoRaise(true);
37 m_buttonNext->setIcon(QIcon::fromTheme(QStringLiteral("media-skip-forward")));
38 m_buttonNext->setToolTip(i18n("Go to next keyframe"));
39
40 m_time = new TimecodeDisplay(t, this);
41 m_time->setRange(0, duration);
42
43 l->addWidget(m_timeline, 0, 0, 1, -1);
44 l->addWidget(m_buttonPrevious, 1, 0);
45 l->addWidget(m_buttonAddDelete, 1, 1);
46 l->addWidget(m_buttonNext, 1, 2);
47 l->addWidget(m_time, 1, 3, Qt::AlignRight);
48
49 connect(m_time, SIGNAL(timeCodeEditingFinished()), this, SLOT(slotSetPosition()));
50 connect(m_timeline, SIGNAL(positionChanged(int)), this, SLOT(slotSetPosition(int)));
51 connect(m_timeline, &SimpleTimelineWidget::atKeyframe, this, &SimpleKeyframeWidget::slotAtKeyframe);
52 connect(m_timeline, &SimpleTimelineWidget::keyframeAdded, this, &SimpleKeyframeWidget::keyframeAdded);
53 connect(m_timeline, &SimpleTimelineWidget::keyframeRemoved, this, &SimpleKeyframeWidget::keyframeRemoved);
54 connect(m_timeline, &SimpleTimelineWidget::keyframeMoved, this, &SimpleKeyframeWidget::keyframeMoved);
55
56 connect(m_buttonAddDelete, &QAbstractButton::pressed, m_timeline, &SimpleTimelineWidget::slotAddRemove);
57 connect(m_buttonPrevious, &QAbstractButton::pressed, m_timeline, &SimpleTimelineWidget::slotGoToPrev);
58 connect(m_buttonNext, &QAbstractButton::pressed, m_timeline, &SimpleTimelineWidget::slotGoToNext);
59
60 // no keyframes yet
61 setEnabled(false);
62 }
63
~SimpleKeyframeWidget()64 SimpleKeyframeWidget::~SimpleKeyframeWidget()
65 {
66 delete m_timeline;
67 delete m_buttonAddDelete;
68 delete m_buttonPrevious;
69 delete m_buttonNext;
70 delete m_time;
71 }
72
slotSetPosition(int pos,bool update)73 void SimpleKeyframeWidget::slotSetPosition(int pos, bool update)
74 {
75 if (pos < 0) {
76 pos = m_time->getValue();
77 m_timeline->slotSetPosition(pos);
78 } else {
79 m_time->setValue(pos);
80 m_timeline->slotSetPosition(pos);
81 }
82
83 if (update) {
84 emit positionChanged(pos);
85 }
86 }
87
getPosition() const88 int SimpleKeyframeWidget::getPosition() const
89 {
90 return m_time->getValue();
91 }
92
setKeyframes(const QList<int> & keyframes)93 void SimpleKeyframeWidget::setKeyframes(const QList<int> &keyframes)
94 {
95 m_timeline->setKeyframes(keyframes);
96 setEnabled(true);
97 }
98
addKeyframe(int pos)99 void SimpleKeyframeWidget::addKeyframe(int pos)
100 {
101 blockSignals(true);
102 m_timeline->slotAddKeyframe(pos);
103 blockSignals(false);
104 setEnabled(true);
105 }
106
updateTimecodeFormat()107 void SimpleKeyframeWidget::updateTimecodeFormat()
108 {
109 m_time->slotUpdateTimeCodeFormat();
110 }
111
slotAtKeyframe(bool atKeyframe)112 void SimpleKeyframeWidget::slotAtKeyframe(bool atKeyframe)
113 {
114 if (atKeyframe) {
115 m_buttonAddDelete->setIcon(QIcon::fromTheme(QStringLiteral("list-remove")));
116 m_buttonAddDelete->setToolTip(i18n("Delete keyframe"));
117 } else {
118 m_buttonAddDelete->setIcon(QIcon::fromTheme(QStringLiteral("list-add")));
119 m_buttonAddDelete->setToolTip(i18n("Add keyframe"));
120 }
121 }
122