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