diff --git a/uppsrc/CtrlLib/EditCtrl.h b/uppsrc/CtrlLib/EditCtrl.h index 3ec3461af..064d2e983 100644 --- a/uppsrc/CtrlLib/EditCtrl.h +++ b/uppsrc/CtrlLib/EditCtrl.h @@ -325,6 +325,8 @@ protected: void Inc(); void Dec(); void Init(); + + typedef EditIntSpin CLASSNAME; public: EditIntSpin& SetInc(int _inc) { inc = _inc; return *this; } @@ -333,15 +335,23 @@ public: bool IsOnSides() const { return sb.IsOnSides(); } EditIntSpin& ShowSpin(bool s = true) { sb.Show(s); return *this; } + bool IsSpinVisible() const { return sb.IsVisible(); } SpinButtons& SpinButtonsObject() { return sb; } const SpinButtons& SpinButtonsObject() const { return sb; } - EditIntSpin(); - EditIntSpin(int min, int max); + EditIntSpin(int inc = 1); + EditIntSpin(int min, int max, int inc = 1); virtual ~EditIntSpin(); }; +class EditIntNotNullSpin : public EditIntSpin +{ +public: + EditIntNotNullSpin(int inc = 1) : EditIntSpin(inc) { NotNull(); } + EditIntNotNullSpin(int min, int max, int inc = 1) : EditIntSpin(min, max, inc) { NotNull(); } +}; + class EditDoubleSpin : public EditDouble { public: @@ -367,6 +377,7 @@ public: bool IsOnSides() const { return sb.IsOnSides(); } EditDoubleSpin& ShowSpin(bool s = true) { sb.Show(s); return *this; } + bool IsSpinVisible() const { return sb.IsVisible(); } SpinButtons& SpinButtonsObject() { return sb; } const SpinButtons& SpinButtonsObject() const { return sb; } @@ -382,3 +393,42 @@ public: EditDoubleNotNullSpin(double inc = 0.1) : EditDoubleSpin(inc) { NotNull(); } EditDoubleNotNullSpin(double min, double max, double inc = 0.1) : EditDoubleSpin(min, max, inc) { NotNull(); } }; + +class EditInt64Spin : public EditInt64 { +public: + virtual void MouseWheel(Point p, int zdelta, dword keyflags); + virtual bool Key(dword key, int repcnt); + +protected: + SpinButtons sb; + int64 inc; + + void Inc(); + void Dec(); + void Init(); + + typedef EditInt64Spin CLASSNAME; + +public: + EditInt64Spin& SetInc(int64 _inc) { inc = _inc; return *this; } + int64 GetInc() const { return inc; } + EditInt64Spin& OnSides(bool b = true) { sb.OnSides(b); return *this; } + bool IsOnSides() const { return sb.IsOnSides(); } + + EditInt64Spin& ShowSpin(bool s = true) { sb.Show(s); return *this; } + bool IsSpinVisible() const { return sb.IsVisible(); } + + SpinButtons& SpinButtonsObject() { return sb; } + const SpinButtons& SpinButtonsObject() const { return sb; } + + EditInt64Spin(int64 inc = 1); + EditInt64Spin(int64 min, int64 max, int64 inc = 1); + virtual ~EditInt64Spin(); +}; + +class EditInt64NotNullSpin : public EditInt64Spin +{ +public: + EditInt64NotNullSpin(int inc = 1) : EditInt64Spin(inc) { NotNull(); } + EditInt64NotNullSpin(int min, int max, int inc = 1) : EditInt64Spin(min, max, inc) { NotNull(); } +}; diff --git a/uppsrc/CtrlLib/EditField.cpp b/uppsrc/CtrlLib/EditField.cpp index 8d0307808..fea57b359 100644 --- a/uppsrc/CtrlLib/EditField.cpp +++ b/uppsrc/CtrlLib/EditField.cpp @@ -1062,22 +1062,13 @@ void EditIntSpin::Dec() void EditIntSpin::Init() { - sb.inc.WhenAction = sb.inc.WhenRepeat = callback(this, &EditIntSpin::Inc); - sb.dec.WhenAction = sb.dec.WhenRepeat = callback(this, &EditIntSpin::Dec); + sb.inc.WhenAction = sb.inc.WhenRepeat = THISBACK(Inc); + sb.dec.WhenAction = sb.dec.WhenRepeat = THISBACK(Dec); AddFrame(sb); - inc = 1; } -EditIntSpin::EditIntSpin() -{ - Init(); -} - -EditIntSpin::EditIntSpin(int min, int max) -{ - MinMax(min, max); - Init(); -} +EditIntSpin::EditIntSpin(int inc) : inc(inc) { Init(); } +EditIntSpin::EditIntSpin(int min, int max, int inc) : EditInt(min, max), inc(inc) { Init(); } EditIntSpin::~EditIntSpin() {} @@ -1096,6 +1087,69 @@ void EditIntSpin::MouseWheel(Point, int zdelta, dword) Inc(); } +void EditInt64Spin::Inc() +{ + if(IsReadOnly()) return; + int i = GetData(); + if(IsNull(i)) { + if(IsNull(GetMin()) || GetMin() == INT64_MIN) return; + SetData(GetMin()); + } + else + if(!IsNull(GetMax()) && i < GetMax()) + SetData(min(i + inc, GetMax())); + else + return; + SetFocus(); + SetSelection(); + UpdateAction(); +} + +void EditInt64Spin::Dec() +{ + if(IsReadOnly()) return; + int i = GetData(); + if(IsNull(i)) { + if(IsNull(GetMax()) || GetMax() == INT_MAX) return; + SetData(GetMax()); + } + else + if(!IsNull(GetMin()) && i > GetMin()) + SetData(max(i - inc, GetMin())); + else + return; + SetFocus(); + SetSelection(); + UpdateAction(); +} + +void EditInt64Spin::Init() +{ + sb.inc.WhenAction = sb.inc.WhenRepeat = THISBACK(Inc); + sb.dec.WhenAction = sb.dec.WhenRepeat = THISBACK(Dec); + AddFrame(sb); +} + +EditInt64Spin::EditInt64Spin(int64 inc) : inc(inc) { Init(); } +EditInt64Spin::EditInt64Spin(int64 min, int64 max, int64 inc) : EditInt64(min, max), inc(inc) { Init(); } + +EditInt64Spin::~EditInt64Spin() {} + +bool EditInt64Spin::Key(dword key, int repcnt) +{ + if(key == K_UP) { Inc(); return true; } + if(key == K_DOWN) { Dec(); return true; } + return EditInt64::Key(key, repcnt); +} + +void EditInt64Spin::MouseWheel(Point, int zdelta, dword) +{ + if(zdelta < 0) + Dec(); + else + Inc(); +} + EditDoubleSpin::EditDoubleSpin(double inc) : inc(inc) { Init(); } EditDoubleSpin::EditDoubleSpin(double min, double max, double inc) : EditDouble(min, max), inc(inc) { Init(); } diff --git a/uppsrc/CtrlLib/StatusBar.h b/uppsrc/CtrlLib/StatusBar.h index dbdc4847d..2beb32721 100644 --- a/uppsrc/CtrlLib/StatusBar.h +++ b/uppsrc/CtrlLib/StatusBar.h @@ -112,6 +112,7 @@ public: void Set(int _pos) { Set(_pos, total); } int Get() const { return pos; } + int GetTotal() const { return total; } void operator=(int p) { Set(p); } void operator++() { pos++; Refresh(); }