xref: /haiku/src/apps/icon-o-matic/transformable/TransformBoxStates.h (revision c6c2c0428420c1a7a9b16a843b41ab26903bc5fb)
10e684ccfSStephan Aßmus /*
2a75a222bSZardshard  * Copyright 2006, 2023, Haiku.
30e684ccfSStephan Aßmus  * Distributed under the terms of the MIT License.
40e684ccfSStephan Aßmus  *
50e684ccfSStephan Aßmus  * Authors:
60e684ccfSStephan Aßmus  *		Stephan Aßmus <superstippi@gmx.de>
7a75a222bSZardshard  *		Zardshard
80e684ccfSStephan Aßmus  */
90e684ccfSStephan Aßmus 
100e684ccfSStephan Aßmus #ifndef TRANSFORM_BOX_STATES_H
110e684ccfSStephan Aßmus #define TRANSFORM_BOX_STATES_H
120e684ccfSStephan Aßmus 
130e684ccfSStephan Aßmus #include <Point.h>
140e684ccfSStephan Aßmus 
150e684ccfSStephan Aßmus #include <agg_trans_affine.h>
160e684ccfSStephan Aßmus 
17*c6c2c042SZardshard 
180e684ccfSStephan Aßmus class BView;
190e684ccfSStephan Aßmus class TransformBox;
200e684ccfSStephan Aßmus 
21*c6c2c042SZardshard 
22*c6c2c042SZardshard namespace TransformBoxStates {
23*c6c2c042SZardshard 
240e684ccfSStephan Aßmus // base class
250e684ccfSStephan Aßmus class DragState {
260e684ccfSStephan Aßmus  public:
270e684ccfSStephan Aßmus 								DragState(TransformBox* parent);
~DragState()280e684ccfSStephan Aßmus 	virtual						~DragState() {}
290e684ccfSStephan Aßmus 
SetOrigin(BPoint origin)30*c6c2c042SZardshard 	virtual	void				SetOrigin(BPoint origin)
31*c6c2c042SZardshard 									{ fOrigin = origin; }
320e684ccfSStephan Aßmus 	virtual	void				DragTo(BPoint current, uint32 modifiers) = 0;
330e684ccfSStephan Aßmus 	virtual	void				UpdateViewCursor(BView* view, BPoint current) const = 0;
340e684ccfSStephan Aßmus 
350e684ccfSStephan Aßmus 	virtual	const char*			ActionName() const;
360e684ccfSStephan Aßmus 
370e684ccfSStephan Aßmus  protected:
38a75a222bSZardshard 			void				_SetViewCursor(BView* view, const uchar* cursorData) const;
390e684ccfSStephan Aßmus 
400e684ccfSStephan Aßmus 			BPoint				fOrigin;
410e684ccfSStephan Aßmus 			TransformBox*		fParent;
420e684ccfSStephan Aßmus };
430e684ccfSStephan Aßmus 
440e684ccfSStephan Aßmus // scaling states
450e684ccfSStephan Aßmus class DragCornerState : public DragState {
460e684ccfSStephan Aßmus  public:
470e684ccfSStephan Aßmus 	enum {
480e684ccfSStephan Aßmus 		LEFT_TOP_CORNER,
490e684ccfSStephan Aßmus 		RIGHT_TOP_CORNER,
500e684ccfSStephan Aßmus 		LEFT_BOTTOM_CORNER,
510e684ccfSStephan Aßmus 		RIGHT_BOTTOM_CORNER,
520e684ccfSStephan Aßmus 	};
53a75a222bSZardshard 								DragCornerState(TransformBox* parent, uint32 corner);
~DragCornerState()540e684ccfSStephan Aßmus 	virtual						~DragCornerState() {}
550e684ccfSStephan Aßmus 
560e684ccfSStephan Aßmus 	virtual	void				SetOrigin(BPoint origin);
570e684ccfSStephan Aßmus 	virtual	void				DragTo(BPoint current, uint32 modifiers);
580e684ccfSStephan Aßmus 	virtual	void				UpdateViewCursor(BView* view, BPoint current) const;
590e684ccfSStephan Aßmus 
600e684ccfSStephan Aßmus 	virtual	const char*			ActionName() const;
610e684ccfSStephan Aßmus 
620e684ccfSStephan Aßmus  private:
630e684ccfSStephan Aßmus 			uint32				fCorner;
640e684ccfSStephan Aßmus 
650e684ccfSStephan Aßmus 			float				fXOffsetFromCorner;
660e684ccfSStephan Aßmus 			float				fYOffsetFromCorner;
670e684ccfSStephan Aßmus 			double				fOldXScale;
680e684ccfSStephan Aßmus 			double				fOldYScale;
690e684ccfSStephan Aßmus 			double				fOldWidth;
700e684ccfSStephan Aßmus 			double				fOldHeight;
710e684ccfSStephan Aßmus 			agg::trans_affine	fMatrix;
720e684ccfSStephan Aßmus 			BPoint				fOldOffset;
730e684ccfSStephan Aßmus };
740e684ccfSStephan Aßmus 
750e684ccfSStephan Aßmus class DragSideState : public DragState {
760e684ccfSStephan Aßmus  public:
770e684ccfSStephan Aßmus 	enum {
780e684ccfSStephan Aßmus 		LEFT_SIDE,
790e684ccfSStephan Aßmus 		TOP_SIDE,
800e684ccfSStephan Aßmus 		RIGHT_SIDE,
810e684ccfSStephan Aßmus 		BOTTOM_SIDE,
820e684ccfSStephan Aßmus 	};
83a75a222bSZardshard 								DragSideState(TransformBox* parent, uint32 side);
~DragSideState()840e684ccfSStephan Aßmus 	virtual						~DragSideState() {}
850e684ccfSStephan Aßmus 
860e684ccfSStephan Aßmus 	virtual	void				SetOrigin(BPoint origin);
870e684ccfSStephan Aßmus 	virtual	void				DragTo(BPoint current, uint32 modifiers);
880e684ccfSStephan Aßmus 	virtual	void				UpdateViewCursor(BView* view, BPoint current) const;
890e684ccfSStephan Aßmus 
900e684ccfSStephan Aßmus 	virtual	const char*			ActionName() const;
910e684ccfSStephan Aßmus 
920e684ccfSStephan Aßmus  private:
930e684ccfSStephan Aßmus 			uint32				fSide;
940e684ccfSStephan Aßmus 
950e684ccfSStephan Aßmus 			float				fOffsetFromSide;
960e684ccfSStephan Aßmus 			double				fOldXScale;
970e684ccfSStephan Aßmus 			double				fOldYScale;
980e684ccfSStephan Aßmus 			double				fOldSideDist;
990e684ccfSStephan Aßmus 			agg::trans_affine	fMatrix;
1000e684ccfSStephan Aßmus 			BPoint				fOldOffset;
1010e684ccfSStephan Aßmus };
1020e684ccfSStephan Aßmus 
1030e684ccfSStephan Aßmus // translate state
1040e684ccfSStephan Aßmus class DragBoxState : public DragState {
1050e684ccfSStephan Aßmus  public:
DragBoxState(TransformBox * parent)1060e684ccfSStephan Aßmus 								DragBoxState(TransformBox* parent)
1070e684ccfSStephan Aßmus 									: DragState(parent) {}
~DragBoxState()1080e684ccfSStephan Aßmus 	virtual						~DragBoxState() {}
1090e684ccfSStephan Aßmus 
1100e684ccfSStephan Aßmus 	virtual	void				SetOrigin(BPoint origin);
1110e684ccfSStephan Aßmus 	virtual	void				DragTo(BPoint current, uint32 modifiers);
1120e684ccfSStephan Aßmus 	virtual	void				UpdateViewCursor(BView* view, BPoint current) const;
1130e684ccfSStephan Aßmus 
1140e684ccfSStephan Aßmus 	virtual	const char*			ActionName() const;
1150e684ccfSStephan Aßmus 
1160e684ccfSStephan Aßmus  private:
1170e684ccfSStephan Aßmus 			BPoint				fOldTranslation;
1180e684ccfSStephan Aßmus };
1190e684ccfSStephan Aßmus 
1200e684ccfSStephan Aßmus // rotate state
1210e684ccfSStephan Aßmus class RotateBoxState : public DragState {
1220e684ccfSStephan Aßmus  public:
1230e684ccfSStephan Aßmus 								RotateBoxState(TransformBox* parent);
~RotateBoxState()1240e684ccfSStephan Aßmus 	virtual						~RotateBoxState() {}
1250e684ccfSStephan Aßmus 
1260e684ccfSStephan Aßmus 	virtual	void				SetOrigin(BPoint origin);
1270e684ccfSStephan Aßmus 	virtual	void				DragTo(BPoint current, uint32 modifiers);
1280e684ccfSStephan Aßmus 	virtual	void				UpdateViewCursor(BView* view, BPoint current) const;
1290e684ccfSStephan Aßmus 
1300e684ccfSStephan Aßmus 	virtual	const char*			ActionName() const;
1310e684ccfSStephan Aßmus 
1320e684ccfSStephan Aßmus  private:
1330e684ccfSStephan Aßmus 			double				fOldAngle;
1340e684ccfSStephan Aßmus };
1350e684ccfSStephan Aßmus 
1360e684ccfSStephan Aßmus // offset center state
1370e684ccfSStephan Aßmus class OffsetCenterState : public DragState {
1380e684ccfSStephan Aßmus  public:
OffsetCenterState(TransformBox * parent)1390e684ccfSStephan Aßmus 								OffsetCenterState(TransformBox* parent)
1400e684ccfSStephan Aßmus 									: DragState(parent) {}
~OffsetCenterState()1410e684ccfSStephan Aßmus 	virtual						~OffsetCenterState() {}
1420e684ccfSStephan Aßmus 
1430e684ccfSStephan Aßmus 	virtual	void				SetOrigin(BPoint origin);
1440e684ccfSStephan Aßmus 	virtual	void				DragTo(BPoint current, uint32 modifiers);
1450e684ccfSStephan Aßmus 	virtual	void				UpdateViewCursor(BView* view, BPoint current) const;
1460e684ccfSStephan Aßmus 
1470e684ccfSStephan Aßmus 	virtual	const char*			ActionName() const;
1480e684ccfSStephan Aßmus };
1490e684ccfSStephan Aßmus 
150*c6c2c042SZardshard } // TransformBoxStates namespace
151*c6c2c042SZardshard 
1520e684ccfSStephan Aßmus #endif // TRANSFORM_BOX_STATES_H
153