1/* 2 * Copyright 2006, 2023, Haiku. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Stephan A��mus <superstippi@gmx.de> 7 * Zardshard 8 */ 9 10#ifndef TRANSFORM_BOX_STATES_H 11#define TRANSFORM_BOX_STATES_H 12 13#include <Point.h> 14 15#include <agg_trans_affine.h> 16 17 18class BView; 19class TransformBox; 20 21 22namespace TransformBoxStates { 23 24// base class 25class DragState { 26 public: 27 DragState(TransformBox* parent); 28 virtual ~DragState() {} 29 30 virtual void SetOrigin(BPoint origin) 31 { fOrigin = origin; } 32 virtual void DragTo(BPoint current, uint32 modifiers) = 0; 33 virtual void UpdateViewCursor(BView* view, BPoint current) const = 0; 34 35 virtual const char* ActionName() const; 36 37 protected: 38 void _SetViewCursor(BView* view, const uchar* cursorData) const; 39 40 BPoint fOrigin; 41 TransformBox* fParent; 42}; 43 44// scaling states 45class DragCornerState : public DragState { 46 public: 47 enum { 48 LEFT_TOP_CORNER, 49 RIGHT_TOP_CORNER, 50 LEFT_BOTTOM_CORNER, 51 RIGHT_BOTTOM_CORNER, 52 }; 53 DragCornerState(TransformBox* parent, uint32 corner); 54 virtual ~DragCornerState() {} 55 56 virtual void SetOrigin(BPoint origin); 57 virtual void DragTo(BPoint current, uint32 modifiers); 58 virtual void UpdateViewCursor(BView* view, BPoint current) const; 59 60 virtual const char* ActionName() const; 61 62 private: 63 uint32 fCorner; 64 65 float fXOffsetFromCorner; 66 float fYOffsetFromCorner; 67 double fOldXScale; 68 double fOldYScale; 69 double fOldWidth; 70 double fOldHeight; 71 agg::trans_affine fMatrix; 72 BPoint fOldOffset; 73}; 74 75class DragSideState : public DragState { 76 public: 77 enum { 78 LEFT_SIDE, 79 TOP_SIDE, 80 RIGHT_SIDE, 81 BOTTOM_SIDE, 82 }; 83 DragSideState(TransformBox* parent, uint32 side); 84 virtual ~DragSideState() {} 85 86 virtual void SetOrigin(BPoint origin); 87 virtual void DragTo(BPoint current, uint32 modifiers); 88 virtual void UpdateViewCursor(BView* view, BPoint current) const; 89 90 virtual const char* ActionName() const; 91 92 private: 93 uint32 fSide; 94 95 float fOffsetFromSide; 96 double fOldXScale; 97 double fOldYScale; 98 double fOldSideDist; 99 agg::trans_affine fMatrix; 100 BPoint fOldOffset; 101}; 102 103// translate state 104class DragBoxState : public DragState { 105 public: 106 DragBoxState(TransformBox* parent) 107 : DragState(parent) {} 108 virtual ~DragBoxState() {} 109 110 virtual void SetOrigin(BPoint origin); 111 virtual void DragTo(BPoint current, uint32 modifiers); 112 virtual void UpdateViewCursor(BView* view, BPoint current) const; 113 114 virtual const char* ActionName() const; 115 116 private: 117 BPoint fOldTranslation; 118}; 119 120// rotate state 121class RotateBoxState : public DragState { 122 public: 123 RotateBoxState(TransformBox* parent); 124 virtual ~RotateBoxState() {} 125 126 virtual void SetOrigin(BPoint origin); 127 virtual void DragTo(BPoint current, uint32 modifiers); 128 virtual void UpdateViewCursor(BView* view, BPoint current) const; 129 130 virtual const char* ActionName() const; 131 132 private: 133 double fOldAngle; 134}; 135 136// offset center state 137class OffsetCenterState : public DragState { 138 public: 139 OffsetCenterState(TransformBox* parent) 140 : DragState(parent) {} 141 virtual ~OffsetCenterState() {} 142 143 virtual void SetOrigin(BPoint origin); 144 virtual void DragTo(BPoint current, uint32 modifiers); 145 virtual void UpdateViewCursor(BView* view, BPoint current) const; 146 147 virtual const char* ActionName() const; 148}; 149 150} // TransformBoxStates namespace 151 152#endif // TRANSFORM_BOX_STATES_H 153