You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
354 lines
12 KiB
C++
354 lines
12 KiB
C++
/*
|
|
* Copyright (c) Contributors to the Open 3D Engine Project.
|
|
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
|
*
|
|
*/
|
|
|
|
|
|
#ifndef CRYINCLUDE_EDITOR_TRACKVIEW_TRACKVIEWDOPESHEETBASE_H
|
|
#define CRYINCLUDE_EDITOR_TRACKVIEW_TRACKVIEWDOPESHEETBASE_H
|
|
#pragma once
|
|
|
|
|
|
#include <IMovieSystem.h>
|
|
#include "TrackViewNode.h"
|
|
#include "TrackViewSequence.h"
|
|
#include "AnimationContext.h"
|
|
#include <QWidget>
|
|
|
|
class CTVTrackPropsDialog;
|
|
class CTrackViewNodesCtrl;
|
|
class CTrackViewKeyPropertiesDlg;
|
|
class CTrackViewNode;
|
|
class CTrackViewTrack;
|
|
class CTrackViewAnimNode;
|
|
|
|
class QRubberBand;
|
|
class QScrollBar;
|
|
class ReflectedPropertyControl;
|
|
|
|
namespace AZ
|
|
{
|
|
class Color;
|
|
}
|
|
|
|
enum ETVActionMode
|
|
{
|
|
eTVActionMode_MoveKey = 1,
|
|
eTVActionMode_AddKeys,
|
|
eTVActionMode_SlideKey,
|
|
eTVActionMode_ScaleKey,
|
|
};
|
|
|
|
enum ESnappingMode
|
|
{
|
|
eSnappingMode_SnapNone = 0,
|
|
eSnappingMode_SnapTick,
|
|
eSnappingMode_SnapMagnet,
|
|
eSnappingMode_SnapFrame,
|
|
};
|
|
|
|
enum ETVTickMode
|
|
{
|
|
eTVTickMode_InSeconds = 0,
|
|
eTVTickMode_InFrames,
|
|
};
|
|
|
|
/** TrackView DopeSheet interface
|
|
*/
|
|
class CTrackViewDopeSheetBase
|
|
: public QWidget
|
|
, public IAnimationContextListener
|
|
, public ITrackViewSequenceListener
|
|
{
|
|
public:
|
|
CTrackViewDopeSheetBase(QWidget* parent = 0);
|
|
virtual ~CTrackViewDopeSheetBase();
|
|
|
|
void SetNodesCtrl(CTrackViewNodesCtrl* pNodesCtrl) { m_pNodesCtrl = pNodesCtrl; }
|
|
|
|
void SetTimeScale(float timeScale, float fAnchorTime);
|
|
float GetTimeScale() { return m_timeScale; }
|
|
|
|
void SetScrollOffset(int hpos);
|
|
|
|
int GetScrollPos() const;
|
|
|
|
void SetTimeRange(float start, float end);
|
|
void SetStartMarker(float fTime);
|
|
void SetEndMarker(float fTime);
|
|
|
|
void SetMouseActionMode(ETVActionMode mode);
|
|
|
|
void SetKeyPropertiesDlg(CTrackViewKeyPropertiesDlg* dlg) { m_keyPropertiesDlg = dlg; }
|
|
|
|
void SetSnappingMode(ESnappingMode mode) { m_snappingMode = mode; }
|
|
ESnappingMode GetSnappingMode() const { return m_snappingMode; }
|
|
void SetSnapFPS(UINT fps);
|
|
|
|
ETVTickMode GetTickDisplayMode() const { return m_tickDisplayMode; }
|
|
void SetTickDisplayMode(ETVTickMode mode);
|
|
|
|
void SetEditLock(bool bLock) { m_bEditLock = bLock; }
|
|
|
|
// IAnimationContextListener
|
|
virtual void OnTimeChanged(float newTime) override;
|
|
|
|
float TickSnap(float time) const;
|
|
|
|
protected:
|
|
void showEvent(QShowEvent* event) override;
|
|
void resizeEvent(QResizeEvent* event) override;
|
|
void wheelEvent(QWheelEvent* event) override;
|
|
|
|
void mousePressEvent(QMouseEvent* event) override;
|
|
void mouseReleaseEvent(QMouseEvent* event) override;
|
|
void mouseDoubleClickEvent(QMouseEvent* event) override;
|
|
|
|
private:
|
|
void OnHScroll();
|
|
void OnLButtonDown(Qt::KeyboardModifiers modifiers, const QPoint& point);
|
|
void OnLButtonDblClk(Qt::KeyboardModifiers modifiers, const QPoint& point);
|
|
void OnRButtonDown(Qt::KeyboardModifiers modifiers, const QPoint& point);
|
|
void OnLButtonUp(Qt::KeyboardModifiers modifiers, const QPoint& point);
|
|
void OnMButtonDown(Qt::KeyboardModifiers modifiers, const QPoint& point);
|
|
void OnMButtonUp(Qt::KeyboardModifiers modifiers, const QPoint& point);
|
|
void mouseMoveEvent(QMouseEvent* event) override;
|
|
void paintEvent(QPaintEvent* event) override;
|
|
void keyPressEvent(QKeyEvent* event) override;
|
|
bool event(QEvent* event) override;
|
|
void OnRButtonUp(Qt::KeyboardModifiers modifiers, const QPoint& point);
|
|
void OnCaptureChanged();
|
|
|
|
private slots:
|
|
void OnCurrentColorChange(const AZ::Color& color);
|
|
|
|
private:
|
|
void UpdateColorKey(const QColor& color, bool addToUndo);
|
|
void UpdateColorKeyHelper(const ColorF& color);
|
|
void AddKeys(const QPoint& point, const bool bTryAddKeysInGroup);
|
|
|
|
void ShowKeyPropertyCtrlOnSpot(int x, int y, bool bMultipleKeysSelected, bool bKeyChangeInSameTrack);
|
|
void HideKeyPropertyCtrlOnSpot();
|
|
|
|
// Utility functions to change the selected track(s) in the given track(s)
|
|
void ChangeSequenceTrackSelection(CTrackViewSequence* sequence, CTrackViewTrack* trackToSelect) const;
|
|
void ChangeSequenceTrackSelection(CTrackViewSequence* sequence, CTrackViewTrackBundle trackBundle, bool multiTrackSelection) const;
|
|
|
|
XmlNodeRef GetKeysInClickboard();
|
|
void StartPasteKeys();
|
|
|
|
CTrackViewKeyHandle FirstKeyFromPoint(const QPoint& point);
|
|
CTrackViewKeyHandle DurationKeyFromPoint(const QPoint& point);
|
|
CTrackViewKeyHandle CheckCursorOnStartEndTimeAdjustBar(const QPoint& point, bool& bStart);
|
|
|
|
void SelectKeys(const QRect& rc, const bool bMultiSelection);
|
|
|
|
int NumKeysFromPoint(const QPoint& point);
|
|
|
|
//! Select all keys within time frame defined by this client rectangle.
|
|
void SelectAllKeysWithinTimeFrame(const QRect& rc, const bool bMultiSelection);
|
|
|
|
//! Return time snapped to time step,
|
|
double GetTickTime() const;
|
|
float MagnetSnap(float time, const CTrackViewAnimNode* pNode) const;
|
|
float FrameSnap(float time) const;
|
|
|
|
//! Return move time offset snapped with current snap settings
|
|
float ComputeSnappedMoveOffset();
|
|
|
|
//! Returns visible time range.
|
|
Range GetVisibleRange() const;
|
|
Range GetTimeRange(const QRect& rc) const;
|
|
|
|
void SetHorizontalExtent(int min, int max);
|
|
|
|
void SetCurrTime(float time);
|
|
|
|
//! Return client position for given time.
|
|
int TimeToClient(float time) const;
|
|
|
|
float TimeFromPoint(const QPoint& point) const;
|
|
float TimeFromPointUnsnapped(const QPoint& point) const;
|
|
|
|
void SetLeftOffset(int ofs) { m_leftOffset = ofs; };
|
|
|
|
void SetMouseCursor(const QCursor& cursor);
|
|
|
|
void ShowKeyTooltip(CTrackViewKeyHandle& keyHandle, const QPoint& point);
|
|
|
|
bool IsOkToAddKeyHere(const CTrackViewTrack* pTrack, float time) const;
|
|
|
|
void MouseMoveSelect(const QPoint& point);
|
|
void MouseMoveMove(const QPoint& point, Qt::KeyboardModifiers modifiers);
|
|
|
|
void MouseMoveDragTime(const QPoint& point, Qt::KeyboardModifiers modifiers);
|
|
void MouseMoveOver(const QPoint& point);
|
|
void MouseMoveDragEndMarker(const QPoint& point, Qt::KeyboardModifiers modifiers);
|
|
|
|
void CancelDrag();
|
|
|
|
float SnapTime(Qt::KeyboardModifiers modifiers, const QPoint& p);
|
|
|
|
void MouseMoveDragStartMarker(const QPoint& point, Qt::KeyboardModifiers modifiers);
|
|
void MouseMoveStartEndTimeAdjust(const QPoint& point, bool bStart);
|
|
|
|
CTrackViewNode* GetNodeFromPointRec(CTrackViewNode* pCurrentNode, const QPoint& point);
|
|
CTrackViewNode* GetNodeFromPoint(const QPoint& point);
|
|
CTrackViewAnimNode* GetAnimNodeFromPoint(const QPoint& point);
|
|
CTrackViewTrack* GetTrackFromPoint(const QPoint& point);
|
|
|
|
void LButtonDownOnTimeAdjustBar(const QPoint& point, CTrackViewKeyHandle& keyHandle, bool bStart);
|
|
void LButtonDownOnKey(const QPoint& point, CTrackViewKeyHandle& keyHandle, Qt::KeyboardModifiers modifiers);
|
|
|
|
bool CreateColorKey(CTrackViewTrack* pTrack, float keyTime);
|
|
void EditSelectedColorKey(CTrackViewTrack* pTrack);
|
|
|
|
void AcceptUndo();
|
|
|
|
// Returns the snapping mode modified active keys
|
|
ESnappingMode GetKeyModifiedSnappingMode();
|
|
|
|
QRect GetNodeRect(const CTrackViewNode* pNode) const;
|
|
|
|
void StoreMementoForTracksWithSelectedKeys();
|
|
|
|
// Drawing methods.
|
|
void DrawControl(QPainter* pDC, const QRect& rcUpdate);
|
|
void DrawNodesRecursive(CTrackViewNode* pNode, QPainter* pDC, const QRect& rcUpdate);
|
|
void DrawTimeline(QPainter* pDC, const QRect& rcUpdate);
|
|
void DrawSummary(QPainter* pDC, const QRect& rcUpdate);
|
|
void DrawSelectedKeyIndicators(QPainter* pDC);
|
|
void DrawTicks(QPainter* pDC, const QRect& rc, Range& timeRange);
|
|
void DrawNodeTrack(CTrackViewAnimNode* pAnimNode, QPainter* pDC, const QRect& trackRect);
|
|
void DrawTrack(CTrackViewTrack* pTrack, QPainter* pDC, const QRect& trackRect);
|
|
void DrawKeys(CTrackViewTrack* pTrack, QPainter* pDC, QRect& rc, Range& timeRange);
|
|
void DrawSequenceTrack(const Range& timeRange, QPainter* pDC, CTrackViewTrack* pTrack, const QRect& rc);
|
|
void DrawBoolTrack(const Range& timeRange, QPainter* pDC, CTrackViewTrack* pTrack, const QRect& rc);
|
|
void DrawSelectTrack(const Range& timeRange, QPainter* pDC, CTrackViewTrack* pTrack, const QRect& rc);
|
|
void DrawKeyDuration(CTrackViewTrack* pTrack, QPainter* pDC, const QRect& rc, int keyIndex);
|
|
void DrawGoToTrackArrow(CTrackViewTrack* pTrack, QPainter* pDC, const QRect& rc);
|
|
void DrawColorGradient(QPainter* pDC, const QRect& rc, const CTrackViewTrack* pTrack);
|
|
void DrawClipboardKeys(QPainter* pDC, const QRect& rc);
|
|
void DrawTrackClipboardKeys(QPainter* pDC, CTrackViewTrack* pTrack, XmlNodeRef trackNode, const float timeOffset);
|
|
|
|
CTrackViewNodesCtrl* m_pNodesCtrl;
|
|
void ComputeFrameSteps(const Range& VisRange);
|
|
void DrawTimeLineInFrames(QPainter* dc, const QRect& rc, const QColor& lineCol, const QColor& textCol, double step);
|
|
void DrawTimeLineInSeconds(QPainter* dc, const QRect& rc, const QColor& lineCol, const QColor& textCol, double step);
|
|
|
|
static bool CompareKeyHandleByTime(const CTrackViewKeyHandle &a, const CTrackViewKeyHandle &b);
|
|
|
|
QBrush m_bkgrBrush;
|
|
QBrush m_bkgrBrushEmpty;
|
|
QBrush m_selectedBrush;
|
|
QBrush m_timeBkgBrush;
|
|
QBrush m_timeHighlightBrush;
|
|
QBrush m_visibilityBrush;
|
|
QBrush m_selectTrackBrush;
|
|
|
|
QCursor m_currCursor;
|
|
QCursor m_crsLeftRight;
|
|
QCursor m_crsAddKey;
|
|
QCursor m_crsCross;
|
|
QCursor m_crsAdjustLR;
|
|
|
|
QRect m_rcClient;
|
|
QPoint m_scrollOffset;
|
|
QRect m_rcSelect;
|
|
QRect m_rcTimeline;
|
|
QRect m_rcSummary;
|
|
|
|
QPoint m_lastTooltipPos;
|
|
QPoint m_mouseDownPos;
|
|
QPoint m_mouseOverPos;
|
|
|
|
QPixmap m_offscreenBitmap;
|
|
|
|
QRubberBand* m_rubberBand;
|
|
QScrollBar* m_scrollBar;
|
|
|
|
// Time
|
|
float m_timeScale;
|
|
float m_currentTime;
|
|
float m_storedTime;
|
|
Range m_timeRange;
|
|
Range m_timeMarked;
|
|
|
|
// This is how often to place ticks.
|
|
// value of 10 means place ticks every 10 second.
|
|
double m_ticksStep;
|
|
|
|
CTrackViewKeyPropertiesDlg* m_keyPropertiesDlg;
|
|
ReflectedPropertyControl* m_wndPropsOnSpot;
|
|
const CTrackViewTrack* m_pLastTrackSelectedOnSpot;
|
|
|
|
QFont m_descriptionFont;
|
|
|
|
// Mouse interaction state
|
|
int m_mouseMode;
|
|
int m_mouseActionMode;
|
|
bool m_bZoomDrag;
|
|
bool m_bMoveDrag;
|
|
bool m_bCursorWasInKey;
|
|
bool m_bJustSelected;
|
|
bool m_bMouseMovedAfterRButtonDown;
|
|
bool m_bKeysMoved;
|
|
bool m_stashedRecordModeWhileTimeDragging;
|
|
|
|
// Offset for keys while moving/pasting
|
|
float m_keyTimeOffset;
|
|
|
|
// If control is locked for editing
|
|
bool m_bEditLock;
|
|
|
|
// Fast redraw: Only redraw time slider. Everything else is buffered.
|
|
bool m_bFastRedraw;
|
|
|
|
// Scrolling
|
|
int m_leftOffset;
|
|
int m_scrollMin;
|
|
int m_scrollMax;
|
|
|
|
// Snapping
|
|
ESnappingMode m_snappingMode;
|
|
float m_snapFrameTime;
|
|
|
|
// Ticks in frames or seconds
|
|
ETVTickMode m_tickDisplayMode;
|
|
double m_fFrameTickStep;
|
|
double m_fFrameLabelStep;
|
|
|
|
// Key for time adjust
|
|
CTrackViewKeyHandle m_keyForTimeAdjust;
|
|
|
|
// Cached clipboard XML for eTVMouseMode_Paste
|
|
XmlNodeRef m_clipboardKeys;
|
|
|
|
// Store current track whose color is being updated
|
|
CTrackViewTrack* m_colorUpdateTrack;
|
|
|
|
// Store the key time of that track
|
|
float m_colorUpdateKeyTime;
|
|
|
|
// Mementos of unchanged tracks for Move/Scale/Slide etc.
|
|
struct TrackMemento
|
|
{
|
|
CTrackViewTrackMemento m_memento;
|
|
|
|
// Also need to store key selection states,
|
|
// because RestoreMemento will destroy them
|
|
std::vector<bool> m_keySelectionStates;
|
|
};
|
|
|
|
std::unordered_map<CTrackViewTrack*, TrackMemento> m_trackMementos;
|
|
|
|
#ifdef DEBUG
|
|
unsigned int m_redrawCount;
|
|
#endif
|
|
};
|
|
|
|
#endif // CRYINCLUDE_EDITOR_TRACKVIEW_TRACKVIEWDOPESHEETBASE_H
|