Plasma Engine  2.0
Loading...
Searching...
No Matches
CurveEditWidget.moc.h
1#pragma once
2
3#include <Foundation/Containers/DynamicArray.h>
4#include <Foundation/Math/Vec2.h>
5#include <Foundation/Tracks/Curve1D.h>
6#include <GuiFoundation/GuiFoundationDLL.h>
7#include <GuiFoundation/Widgets/CurveEditData.h>
8
9#include <QBrush>
10#include <QPen>
11#include <QWidget>
12
14class QRubberBand;
15
16class PL_GUIFOUNDATION_DLL plQtCurveEditWidget : public QWidget
17{
18 Q_OBJECT
19
20public:
21 plQtCurveEditWidget(QWidget* pParent);
22
23 double m_fLowerRange = -plMath::HighValue<double>();
24 double m_fUpperRange = plMath::HighValue<double>();
25 double m_fLowerExtent = 0.0;
26 double m_fUpperExtent = 1.0;
27 bool m_bLowerExtentFixed = false;
28 bool m_bUpperExtentFixed = false;
29
30 void SetCurves(plCurveGroupData* pCurveEditData);
31 void SetGridBarWidget(plQGridBarWidget* pGridBar) { m_pGridBar = pGridBar; }
32
33 void SetScrubberPosition(double fPosition);
34
35 double GetMinCurveExtent() const { return m_fMinExtentValue; }
36 double GetMaxCurveExtent() const { return m_fMaxExtentValue; }
37
38 void FrameCurve();
39 void FrameSelection();
40 void Frame(double fOffsetX, double fOffsetY, double fWidth, double fHeight);
41
42 QPoint MapFromScene(const QPointF& pos) const;
43 QPoint MapFromScene(const plVec2d& vPos) const { return MapFromScene(QPointF(vPos.x, vPos.y)); }
44 QPointF MapToScene(const QPoint& pos) const;
45 plVec2 MapDirFromScene(const plVec2& vPos) const;
46
47 void ClearSelection();
48 void SelectAll();
49 const plDynamicArray<plSelectedCurveCP>& GetSelection() const { return m_SelectedCPs; }
50 bool IsSelected(const plSelectedCurveCP& cp) const;
51 void SetSelection(const plSelectedCurveCP& cp);
52 void ToggleSelected(const plSelectedCurveCP& cp);
53 void SetSelected(const plSelectedCurveCP& cp, bool bSet);
54
55 bool GetSelectedTangent(plInt32& out_iCurve, plInt32& out_iPoint, bool& out_bLeftTangent) const;
56
57Q_SIGNALS:
58 void DoubleClickEvent(const QPointF& scenePos, const QPointF& epsilon);
59 void DeleteControlPointsEvent();
60 void MoveControlPointsEvent(double fMoveX, double fMoveY);
61 void MoveTangentsEvent(double fMoveX, double fMoveY);
62 void BeginOperationEvent(QString sName);
63 void EndOperationEvent(bool bCommit);
64 void ScaleControlPointsEvent(const QPointF& centerPos, double fScaleX, double fScaleY);
65 void ContextMenuEvent(QPoint pos, QPointF scenePos);
66 void SelectionChangedEvent();
67 void MoveCurveEvent(plInt32 iCurve, double fMoveY);
68
69protected:
70 virtual void paintEvent(QPaintEvent* e) override;
71 virtual void mousePressEvent(QMouseEvent* e) override;
72 virtual void mouseReleaseEvent(QMouseEvent* e) override;
73 virtual void mouseMoveEvent(QMouseEvent* e) override;
74 virtual void mouseDoubleClickEvent(QMouseEvent* e) override;
75 virtual void wheelEvent(QWheelEvent* e) override;
76 virtual void keyPressEvent(QKeyEvent* e) override;
77
78private:
79 enum class ClickTarget
80 {
81 Nothing,
82 SelectedPoint,
83 TangentHandle
84 };
85 enum class EditState
86 {
87 None,
88 DraggingPoints,
89 DraggingPointsHorz,
90 DraggingPointsVert,
91 DraggingTangents,
92 MultiSelect,
93 RightClick,
94 Panning,
95 ScaleLeftRight,
96 ScaleUpDown,
97 DraggingCurve
98 };
99 enum class SelectArea
100 {
101 None,
102 Center,
103 Top,
104 Bottom,
105 Left,
106 Right
107 };
108
109 void PaintCurveSegments(QPainter* painter, float fOffsetX, plUInt8 alpha) const;
110 void PaintOutsideAreaOverlay(QPainter* painter) const;
111 void PaintControlPoints(QPainter* painter) const;
112 void PaintSelectedControlPoints(QPainter* painter) const;
113 void PaintSelectedTangentLines(QPainter* painter) const;
114 void PaintSelectedTangentHandles(QPainter* painter) const;
115 void PaintMultiSelectionSquare(QPainter* painter) const;
116 void PaintScrubber(QPainter& p) const;
117 void RenderVerticalGrid(QPainter* painter, const QRectF& viewportSceneRect, double fRoughGridDensity);
118 void RenderSideLinesAndText(QPainter* painter, const QRectF& viewportSceneRect);
119 void RenderValueRanges(QPainter* painter);
120 QRectF ComputeViewportSceneRect() const;
121 bool PickCpAt(const QPoint& pos, float fMaxPixelDistance, plSelectedCurveCP& out_Result) const;
122 ClickTarget DetectClickTarget(const QPoint& pos);
123 void ExecMultiSelection(plDynamicArray<plSelectedCurveCP>& out_Selection);
124 bool CombineSelectionAdd(plDynamicArray<plSelectedCurveCP>& inout_Selection, const plDynamicArray<plSelectedCurveCP>& change);
125 bool CombineSelectionRemove(plDynamicArray<plSelectedCurveCP>& inout_Selection, const plDynamicArray<plSelectedCurveCP>& change);
126 bool CombineSelectionToggle(plDynamicArray<plSelectedCurveCP>& inout_Selection, const plDynamicArray<plSelectedCurveCP>& change);
127 void ComputeSelectionRect();
128 SelectArea WhereIsPoint(QPoint pos) const;
129 plInt32 PickCurveAt(QPoint pos) const;
130 void ClampZoomPan();
131
132 plQGridBarWidget* m_pGridBar = nullptr;
133
134 EditState m_State = EditState::None;
135 plInt32 m_iDraggedCurve;
136
137 plCurveGroupData* m_pCurveEditData;
139 plHybridArray<plCurve1D, 4> m_CurvesSorted;
140 plHybridArray<plVec2d, 4> m_CurveExtents;
141 double m_fMinExtentValue;
142 double m_fMaxExtentValue;
143 double m_fMinValue, m_fMaxValue;
144
145
146 QPointF m_SceneTranslation;
147 QPointF m_SceneToPixelScale;
148 QPoint m_LastMousePos;
149
150 QBrush m_ControlPointBrush;
151 QBrush m_SelectedControlPointBrush;
152 QPen m_TangentLinePen;
153 QBrush m_TangentHandleBrush;
154
156 plInt32 m_iSelectedTangentCurve = -1;
157 plInt32 m_iSelectedTangentPoint = -1;
158 bool m_bSelectedTangentLeft = false;
159 bool m_bBegunChanges = false;
160 bool m_bFrameBeforePaint = true;
161
162 QPoint m_MultiSelectionStart;
163 QRect m_MultiSelectRect;
164 QRectF m_SelectionBRect;
165 QPointF m_ScaleReferencePoint;
166 QPointF m_ScaleStartPoint;
167 QPointF m_TotalPointDrag;
168 QRubberBand* m_pRubberband = nullptr;
169
170 bool m_bShowScrubber = false;
171 double m_fScrubberPosition = 0;
172};
Definition CurveEditData.h:109
Definition DynamicArray.h:81
A hybrid array uses in-place storage to handle the first few elements without any allocation....
Definition HybridArray.h:12
Definition GridBarWidget.moc.h:10
Definition CurveEditWidget.moc.h:17
constexpr TYPE HighValue()
A very large value, that is slightly smaller than sqrt(MaxValue()).
Definition CurveEditData.h:135