123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- /*
- * 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
|