1 #ifndef _PointCtrl_PointCtrl_h
2 #define _PointCtrl_PointCtrl_h
3 
4 #include <CtrlLib/CtrlLib.h>
5 
6 using namespace Upp;
7 
8 #include <Gen/Gen.h>
9 
10 typedef Pointf XY;
11 
12 class PointCtrl : public Ctrl {
13 public:
14 	typedef PointCtrl CLASSNAME;
15 	PointCtrl();
16 
17 	struct Style : public ChStyle<Style> {
18 		Color backcol;
19 		Color linecol;
20 		Color pointcol;
21 		int linesize;
22 		int pointsize;
23 	};
24 
25 	virtual void Paint(Draw& w);
26 	virtual void LeftDown(Point p, dword keyflags);
27 	virtual void LeftRepeat(Point p, dword keyflags);
28 	virtual void MouseMove(Point p, dword keyflags);
29 	virtual void LeftUp(Point p, dword keyflags);
MouseEnter(Point p,dword keyflags)30 	virtual void MouseEnter(Point p, dword keyflags) { xp = p; }
MouseLeave()31 	virtual void MouseLeave() { xp.SetNull(); Refresh(); }
32 
33 	virtual void Updated(); //from draw domain to value domain
34 	virtual void UpdatedBack(); //from value domain to draw domain
35 	virtual void Layout();
36 
37 	static const Style& StyleDefault();
SetStyle(const Style & s)38 	void SetStyle(const Style& s) { style = &s; Refresh(); }
39 
SetData(const Value & v)40 	virtual void SetData(const Value& v) { if(!v.Is<XY>()) return; vxp = v; UpdatedBack(); Refresh(); }
GetData()41 	virtual Value GetData() const { return vxp; }
42 
SetDataX(double v)43 	void SetDataX(double v) { vxp.x = minmax(v, vsx.Min(), vsx.Max()); UpdatedBack(); Refresh(); }
SetDataY(double v)44 	void SetDataY(double v) { vxp.y = minmax(v, vsy.Min(), vsy.Max()); UpdatedBack(); Refresh(); }
SetDataXY(double vx,double vy)45 	void SetDataXY(double vx, double vy) { vxp.x = minmax(vx, vsx.Min(), vsx.Max()); vxp.y = minmax(vy, vsy.Min(), vsy.Max()); UpdatedBack(); Refresh(); }
GetDataX()46 	double GetDataX() const { return vxp.x; }
GetDataY()47 	double GetDataY() const { return vxp.y; }
48 
SetMinMaxX(double mn,double mx)49 	void SetMinMaxX(double mn, double mx) { vsx.MinMax(mn, mx); vxp.x = minmax(vxp.x, vsx.Min(), vsx.Max()); UpdatedBack(); }
SetMinMaxY(double mn,double mx)50 	void SetMinMaxY(double mn, double mx) { vsy.MinMax(mn, mx);  vxp.y = minmax(vxp.y, vsy.Min(), vsy.Max()); UpdatedBack(); }
SetMinMaxXY(double mnx,double mxx,double mny,double mxy)51 	void SetMinMaxXY(double mnx, double mxx, double mny, double mxy) { vsx.MinMax(mnx, mxx); vsy.MinMax(mny, mxy); vxp.x = minmax(vxp.x, vsx.Min(), vsx.Max()); vxp.y = minmax(vxp.y, vsy.Min(), vsy.Max()); UpdatedBack(); }
GetMinX()52 	double GetMinX() const { return vsx.Min(); }
GetMaxX()53 	double GetMaxX() const { return vsx.Max(); }
GetMinY()54 	double GetMinY() const { return vsy.Min(); }
GetMaxY()55 	double GetMaxY() const { return vsy.Max(); }
56 
57 	struct PData : Moveable<PData>
58 	{
59 		String name;
60 		Color col;
61 		int size;
62 		int shape;
PDataPData63 		PData() : col(LtGreen()), size(4), shape(0) {}
64 	};
65 
66 	Vector<XY> vp;
67 	Vector<PData> vpd;
68 
69 	Callback WhenAddPoint;
70 	Callback1<int> WhenRemovePoint;
71 	Callback1<int> WhenMovePoint;
72 
73 private:
74 	//cache helper
75 	Size sz;
76 	Point xp; //when moving
77 	Point sxp; //drawing representation of valx
78 	bool pressed;
79 	bool moving;
80 	int di; //dragging point index
81 
82 	//vital
83 	XY vxp;
84 	Scaler<double> vsx, psx, vsy, psy;
85 	const Style* style;
86 };
87 
88 #endif
89 
90