92 lines
3.0 KiB
C++
92 lines
3.0 KiB
C++
#pragma once
|
|
|
|
#include <QWidget>
|
|
|
|
class QResizeEvent;
|
|
class TimelineEditorModel;
|
|
|
|
class TimelineWidget final : public QWidget {
|
|
Q_OBJECT
|
|
public:
|
|
explicit TimelineWidget(QWidget* parent = nullptr);
|
|
|
|
void setFrameRange(int start, int end);
|
|
void setCurrentFrame(int frame);
|
|
/// 由主窗口同步工程帧时调用:不发射 frameScrubbed,避免与拖动/刷新打架造成数字闪烁
|
|
void setCurrentFrameProgrammatic(int frame);
|
|
int currentFrame() const { return m_currentFrame; }
|
|
|
|
void setSelectionRange(int start, int end); // -1,-1 清除
|
|
int selectionStart() const { return m_selStart; }
|
|
int selectionEnd() const { return m_selEnd; }
|
|
|
|
void setModel(TimelineEditorModel* model);
|
|
TimelineEditorModel* model() const { return m_model; }
|
|
|
|
// 轨道数据直接由上层提供(通常来自当前条带引用的 clip)。
|
|
void setKeyframeTracks(const QVector<int>& locFrames,
|
|
const QVector<int>& scaleFrames,
|
|
const QVector<int>& imgFrames,
|
|
const QVector<int>& visFrames);
|
|
void setToolKeyframeTracks(const QVector<int>& locFrames,
|
|
const QVector<int>& visFrames);
|
|
|
|
enum class KeyKind { None, Location, UserScale, Image, Visibility };
|
|
KeyKind selectedKeyKind() const { return m_selKeyKind; }
|
|
int selectedKeyFrame() const { return m_selKeyFrame; }
|
|
bool hasSelectedKeyframe() const { return m_selKeyKind != KeyKind::None && m_selKeyFrame >= 0; }
|
|
|
|
signals:
|
|
void frameScrubbed(int frame);
|
|
void frameCommitted(int frame);
|
|
void contextMenuRequested(const QPoint& globalPos, int frame);
|
|
void keyframeSelectionChanged(KeyKind kind, int frame);
|
|
void intervalSelectionChanged(int start, int end);
|
|
|
|
protected:
|
|
void paintEvent(QPaintEvent*) override;
|
|
void mousePressEvent(QMouseEvent*) override;
|
|
void mouseMoveEvent(QMouseEvent*) override;
|
|
void mouseReleaseEvent(QMouseEvent*) override;
|
|
void wheelEvent(QWheelEvent*) override;
|
|
void resizeEvent(QResizeEvent* e) override;
|
|
|
|
private:
|
|
int contentLeft() const { return 6; }
|
|
int contentWidth() const { return std::max(1, width() - 12); }
|
|
QRect contentRect() const;
|
|
|
|
double frameToXf(double frame) const;
|
|
int frameToX(int frame) const;
|
|
double xToFramef(int x) const;
|
|
int xToFrame(int x) const;
|
|
|
|
QRect rulerRect() const;
|
|
QRect keyAreaRect() const;
|
|
|
|
void setFrameInternal(int frame, bool commit);
|
|
|
|
int m_start = 0;
|
|
int m_end = 600; // exclusive for mapping
|
|
int m_currentFrame = 0;
|
|
|
|
int m_selStart = -1;
|
|
int m_selEnd = -1;
|
|
|
|
bool m_dragging = false;
|
|
QPoint m_pressPos;
|
|
bool m_moved = false;
|
|
|
|
static constexpr int kRulerHeight = 14;
|
|
|
|
QVector<int> m_locFrames;
|
|
QVector<int> m_scaleFrames;
|
|
QVector<int> m_imgFrames;
|
|
QVector<int> m_visFrames;
|
|
|
|
KeyKind m_selKeyKind = KeyKind::None;
|
|
int m_selKeyFrame = -1;
|
|
|
|
TimelineEditorModel* m_model = nullptr; // non-owning
|
|
};
|