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.
o3de/Code/Editor/Controls/SplineCtrl.h

157 lines
4.2 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_CONTROLS_SPLINECTRL_H
#define CRYINCLUDE_EDITOR_CONTROLS_SPLINECTRL_H
#pragma once
#if !defined(Q_MOC_RUN)
#include <QWidget>
#include <ISplines.h>
#endif
// Custom styles for this control.
#define SPLINE_STYLE_NOGRID 0x0001
#define SPLINE_STYLE_NO_TIME_MARKER 0x0002
// Notify event sent when spline is being modified.
#define SPLN_CHANGE (0x0001)
// Notify event sent just before when spline is modified.
#define SPLN_BEFORE_CHANGE (0x0002)
class TimelineWidget;
//////////////////////////////////////////////////////////////////////////
// Spline control.
//////////////////////////////////////////////////////////////////////////
class CSplineCtrl
: public QWidget
{
Q_OBJECT
public:
CSplineCtrl(QWidget* parent = nullptr);
virtual ~CSplineCtrl();
//Key functions
int GetActiveKey() { return m_nActiveKey; };
void SetActiveKey(int nIndex);
int InsertKey(const QPoint& point);
void ToggleKeySlope(int nIndex, int nDist);
void SetGrid(int numX, int numY) { m_gridX = numX; m_gridY = numY; };
void SetTimeRange(float tmin, float tmax) { m_fMinTime = tmin; m_fMaxTime = tmax; }
void SetValueRange(float tmin, float tmax)
{
m_fMinValue = tmin;
m_fMaxValue = tmax;
if (m_fMinValue == m_fMaxValue)
{
m_fMaxValue = m_fMinValue + 0.001f;
}
}
void SetTooltipValueScale(float x, float y) { m_fTooltipScaleX = x; m_fTooltipScaleY = y; };
// Lock value of first and last key to be the same.
void LockFirstAndLastKeys(bool bLock) { m_bLockFirstLastKey = bLock; }
void SetSpline(ISplineInterpolator* pSpline, bool bRedraw = false);
ISplineInterpolator* GetSpline();
void SetTimeMarker(float fTime);
void SetTimelineCtrl(TimelineWidget* pTimelineCtrl);
void UpdateToolTip();
typedef AZStd::function<void(CSplineCtrl*)> UpdateCallback;
void SetUpdateCallback(UpdateCallback cb) { m_updateCallback = cb; };
Q_SIGNALS:
void beforeChange();
void change();
protected:
enum EHitCode
{
HIT_NOTHING,
HIT_KEY,
HIT_SPLINE,
};
void mousePressEvent(QMouseEvent* event) override;
void mouseReleaseEvent(QMouseEvent* event) override;
void paintEvent(QPaintEvent* event) override;
void resizeEvent(QResizeEvent* event) override;
void OnLButtonDown(const QPoint& point, Qt::KeyboardModifiers modifiers);
void mouseMoveEvent(QMouseEvent* event) override;
void OnLButtonUp(const QPoint& point, Qt::KeyboardModifiers modifiers);
void OnRButtonDown(const QPoint& point, Qt::KeyboardModifiers modifiers);
void OnSetCursor();
void mouseDoubleClickEvent(QMouseEvent* event) override;
void keyPressEvent(QKeyEvent* event) override;
// Drawing functions
void DrawGrid(QPainter* pDC);
void DrawSpline(QPainter* pDC);
void DrawKeys(QPainter* pDC);
void DrawTimeMarker(QPainter* pDC);
EHitCode HitTest(const QPoint& point);
//Tracking support helper functions
void StartTracking();
void TrackKey(const QPoint& point);
void StopTracking();
void RemoveKey(int nKey);
QPoint KeyToPoint(int nKey);
QPoint TimeToPoint(float time);
void PointToTimeValue(const QPoint& point, float& time, float& value);
float XOfsToTime(int x);
QPoint XOfsToPoint(int x);
void ClearSelection();
void ValidateSpline();
private:
ISplineInterpolator* m_pSpline;
QRect m_rcClipRect;
QRect m_rcSpline;
QPoint m_hitPoint;
EHitCode m_hitCode;
int m_nHitKeyIndex;
int m_nHitKeyDist;
float m_fTimeMarker;
int m_nActiveKey;
int m_nKeyDrawRadius;
bool m_bTracking;
int m_gridX;
int m_gridY;
float m_fMinTime, m_fMaxTime;
float m_fMinValue, m_fMaxValue;
float m_fTooltipScaleX, m_fTooltipScaleY;
bool m_bLockFirstLastKey;
std::vector<int> m_bSelectedKeys;
TimelineWidget* m_pTimelineCtrl;
QRect m_TimeUpdateRect;
UpdateCallback m_updateCallback;
};
#endif // CRYINCLUDE_EDITOR_CONTROLS_SPLINECTRL_H