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