diff --git a/uppsrc/Core/Map.h b/uppsrc/Core/Map.h index 5e5438109..ffce6bb2c 100644 --- a/uppsrc/Core/Map.h +++ b/uppsrc/Core/Map.h @@ -160,6 +160,7 @@ public: void Set(int i, T *ptr) { B::value.Set(i, ptr); } T *PopDetach() { B::key.Drop(); return B::value.PopDetach(); } + T *Detach(int i) { B::key.Remove(i); return B::value.Detach(i); } ArrayMap(const ArrayMap& s, int) : AMap, HashFn>(s, 1) {} ArrayMap(pick_ Index& ndx, pick_ Array& val) : AMap, HashFn>(ndx, val) {} diff --git a/uppsrc/Core/src.tpp/ArrayMap$en-us.tpp b/uppsrc/Core/src.tpp/ArrayMap$en-us.tpp index 68d106882..e606716bc 100644 --- a/uppsrc/Core/src.tpp/ArrayMap$en-us.tpp +++ b/uppsrc/Core/src.tpp/ArrayMap$en-us.tpp @@ -134,4 +134,10 @@ Client is responsible for deletion of the element.&] [s6; Invalidates iterators to ArrayMap.&] [s7; [* Return value]-|Value.&] [s3; &] +[s4;%- &] +[s5;:ArrayMap`:`:Detach`(int`):%- [*@4 T]_`*[* Detach]([@(0.0.255) int]_[*@3 i])&] +[s2; Removes element [%-*@3 i]. but does not destroy it `- the heap +pointer to the element is returned. Client is responsible for +deletion of the element.&] +[s3; &] [s0; ] \ No newline at end of file diff --git a/uppsrc/CtrlLib/ArrayCtrl.cpp b/uppsrc/CtrlLib/ArrayCtrl.cpp index 7a3275ef4..47f00c724 100644 --- a/uppsrc/CtrlLib/ArrayCtrl.cpp +++ b/uppsrc/CtrlLib/ArrayCtrl.cpp @@ -1410,15 +1410,19 @@ void ArrayCtrl::DoPoint(Point p, bool dosel) { SetWantFocus(); } +int ArrayCtrl::GetClickColumn(int ii, Point p) +{ + for(int i = 0; i < column.GetCount(); i++) + if(GetCellRect(ii, i).Contains(p)) + return i; + return Null; +} + void ArrayCtrl::ClickColumn(Point p) { clickpos.x = Null; if(clickpos.y >= 0) - for(int i = 0; i < column.GetCount(); i++) - if(GetCellRect(clickpos.y, i).Contains(p)) { - clickpos.x = i; - break; - } + clickpos.x = GetClickColumn(clickpos.y, p); } void ArrayCtrl::ClickSel(dword flags) @@ -1529,13 +1533,28 @@ void ArrayCtrl::SyncInfo() void ArrayCtrl::MouseMove(Point p, dword) { + int ii = Null; + if(WhenMouseMove) { + ii = GetLineAt(p.y + sb); + DDUMP(ii); + if(IsNull(ii)) + WhenMouseMove(Null); + else + WhenMouseMove(Point(GetClickColumn(ii, p), ii)); + } if(mousemove && !IsReadOnly()) { - int i = GetLineAt(p.y + sb); - if(!IsNull(i)) SetCursor(i); + if(IsNull(ii)) + ii = GetLineAt(p.y + sb); + if(!IsNull(ii)) SetCursor(ii); } SyncInfo(); } +void ArrayCtrl::MouseLeave() +{ + WhenMouseMove(Null); +} + Image ArrayCtrl::CursorImage(Point p, dword) { return header.GetSplit(p.x) < 0 || header.GetMode() == HeaderCtrl::FIXED ? Image::Arrow() diff --git a/uppsrc/CtrlLib/ArrayCtrl.h b/uppsrc/CtrlLib/ArrayCtrl.h index f7f924992..95a3b93f6 100644 --- a/uppsrc/CtrlLib/ArrayCtrl.h +++ b/uppsrc/CtrlLib/ArrayCtrl.h @@ -25,6 +25,7 @@ public: virtual void LeftUp(Point p, dword flags); virtual void RightDown(Point p, dword); virtual void MouseMove(Point p, dword); + virtual void MouseLeave(); virtual void MouseWheel(Point p, int zdelta, dword keyflags); virtual Image CursorImage(Point p, dword); virtual void DragAndDrop(Point p, PasteClip& d); @@ -244,6 +245,7 @@ private: void DoPoint(Point p, bool dosel = true); void DoClick(Point p, dword flags); + int GetClickColumn(int ii, Point p); void ClickColumn(Point p); void ClickSel(dword flags); Rect GetCellRect(int i, int col) const; @@ -307,6 +309,7 @@ protected: public: Callback WhenLeftDouble; + Callback1 WhenMouseMove; Callback WhenEnterKey; Callback WhenLeftClick; Callback1 WhenBar; @@ -318,6 +321,7 @@ public: Callback WhenCtrlsAction; Callback WhenSel; + Callback WhenDrag; Callback3 WhenDropCell; Callback2 WhenDropInsert; diff --git a/uppsrc/CtrlLib/ToolTip.cpp b/uppsrc/CtrlLib/ToolTip.cpp index 279246b36..ea827a7e1 100644 --- a/uppsrc/CtrlLib/ToolTip.cpp +++ b/uppsrc/CtrlLib/ToolTip.cpp @@ -2,7 +2,7 @@ NAMESPACE_UPP -#define LLOG(x) // DLOG(x) +#define LLOG(x) DLOG(x) ToolTip::ToolTip() { @@ -87,23 +87,27 @@ void ShowToolTip() SetTimeCallback(200, callback(EndShowMode), (void *)EndShowMode); } +void SyncToolTip(Ctrl *ctrl) +{ + if(ctrl != tipctrl || ctrl && ctrl->GetTip() != AppToolTip().Get()) { + LLOG("ToolTipHook / ctrl change " << UPP::Name(ctrl) << " -> " << UPP::Name(ctrl)); + tipctrl = ctrl; + KillTimeCallback((void *)SyncToolTip); + if(showmode) + ShowToolTip(); + else { + LLOG("ToolTipHook -> SetTimeCallback"); + SetTimeCallback(1000, callback(ShowToolTip), (void *)SyncToolTip); + } + } +} + bool ToolTipHook(Ctrl *ctrl, bool inframe, int event, Point p, int zdelta, dword keyflags) { if(event == Ctrl::MOUSEMOVE && ctrl != &AppToolTip()) { - ctrl = Ctrl::GetVisibleChild(ctrl, p, inframe); + SyncToolTip(Ctrl::GetVisibleChild(ctrl, p, inframe)); LLOG("ToolTipHook MOUSEMOVE " << UPP::Name(ctrl) << " inframe: " << inframe); - if(ctrl != tipctrl || ctrl->GetTip() != AppToolTip().Get() && showmode) { - LLOG("ToolTipHook / ctrl change " << UPP::Name(ctrl) << " -> " << UPP::Name(ctrl)); - tipctrl = ctrl; - KillTimeCallback((void *)ToolTipHook); - if(showmode) - ShowToolTip(); - else { - LLOG("ToolTipHook -> SetTimeCallback"); - SetTimeCallback(1000, callback(ShowToolTip), (void *)ToolTipHook); - } - } } if(event == Ctrl::MOUSELEAVE) { LLOG("ToolTipHook MOUSELEAVE " << UPP::Name(ctrl));