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.
kev/Drawer/Module/GeoSigmaDraw/SplineDragPipeline.h

82 lines
2.3 KiB
C

1 month ago
#pragma once
#include "SplineCurveModel.h"
#include "ItemCurve.h"
#include <vector>
class CSigmaDoc; // forward declaration for GetDoc()
/**
* @brief
*
* / CurveEditorSpline
*/
struct SplineDragState
{
CPoint screenDownPoint;
CPoint2D worldDownPoint;
CPoint2D worldLastPoint;
bool isLeftButtonDownDuringMove;
CPointList previewPoints;
void Reset()
{
worldDownPoint = CPoint2D(0, 0);
worldLastPoint = CPoint2D(0, 0);
isLeftButtonDownDuringMove = false;
previewPoints.RemoveAll();
}
void StartDrag(CPoint screen, CPoint2D world)
{
screenDownPoint = screen;
worldDownPoint = world;
worldLastPoint = world;
previewPoints.RemoveAll();
}
void UpdateLast(CPoint2D world) { worldLastPoint = world; }
bool HasMoved() const { return !(worldLastPoint == worldDownPoint); }
};
/**
* @brief 线
*
* CurveEditorSpline SplineDragPipeline 访
*/
struct ISplineDragPipelineContext
{
virtual ~ISplineDragPipelineContext() = default;
virtual CSigmaDoc* GetDoc() = 0;
virtual POSITION GetPos() = 0;
virtual int GetHandleIndex() = 0;
virtual void WriteModelToDocCurve() = 0;
virtual void Invalidate() = 0;
virtual void AttachProcess(CPointList& oldPoints, CPointList& newPoints) = 0;
};
/**
* @brief 线
*
* /线
*/
class SplineDragPipeline
{
public:
SplineDragPipeline(SplineCurveModel& model, SplineDragState& dragState, ISplineDragPipelineContext* pContext);
/**
* @brief isPreview true pListForPreview
*/
bool ProcessDragStep(bool isPreview, CPointList* pListForPreview);
private:
bool GetCurveForDragEdit(bool isPreview, CCurveEx*& pValue, int& handleIndex, CPointList* pListForPreview);
bool GetDraggedSegmentAndAttachContext(std::vector<dfPoint>& segmentVec);
bool WriteDraggedSegmentToCurve(CCurveEx* pValue, const std::vector<dfPoint>& segmentVec);
void SyncControlPointsAndNotify(int handleIndex);
void EndDragEdit(CCurveEx* pValue, bool isPreview, CPointList* pList);
SplineCurveModel* m_pModel;
SplineDragState* m_pDragState;
ISplineDragPipelineContext* m_pContext;
};