mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-17 14:16:10 -06:00
126 lines
2.6 KiB
C++
126 lines
2.6 KiB
C++
#include "CtrlFinder.h"
|
|
|
|
//this one filters
|
|
void CtrlFinder::StdCtrlFilter(Ctrl*& q, Point& pt, int& f)
|
|
{
|
|
if((f & VIEW) && q->InView())
|
|
{
|
|
if( ((f & VISIBLE) && q->IsShown())
|
|
|| ((f & INVISIBLE) && !q->IsShown())
|
|
|| ((f & ENABLED) && q->IsEnabled())
|
|
|| ((f & DISABLED) && !q->IsEnabled())
|
|
) return;
|
|
}
|
|
|
|
if((f & FRAME) && q->InFrame())
|
|
if( ((f & VISIBLE) && q->IsShown())
|
|
|| ((f & INVISIBLE) && !q->IsShown())
|
|
|| ((f & ENABLED) && q->IsEnabled())
|
|
|| ((f & DISABLED) && !q->IsEnabled())
|
|
) return;
|
|
q = NULL;
|
|
}
|
|
|
|
Ctrl* CtrlFinder::ChildAtPoint(Ctrl& par, Point& pt, int& f, const CtrlFilterType& filt)
|
|
{
|
|
GuiLock __;
|
|
Ctrl *q;
|
|
Point p = pt;
|
|
Rect view = par.GetView();
|
|
|
|
if(f & VIEW)
|
|
if(view.Contains(p)) {
|
|
Point vp = p - view.TopLeft();
|
|
for(q = par.GetLastChild(); q; q = q->GetPrev()) {
|
|
if((f & VIEW) && q->InView())
|
|
{
|
|
Rect r = q->GetRect();
|
|
if(r.Contains(vp)) {
|
|
pt = vp - r.TopLeft();
|
|
Ctrl* w(q);
|
|
filt(w, pt, f);
|
|
if(w) return w;
|
|
}
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
if(f & FRAME)
|
|
for(q = par.GetLastChild(); q; q = q->GetPrev()) {
|
|
if((f & FRAME) && q->InFrame())
|
|
{
|
|
Rect r = q->GetRect();
|
|
if(r.Contains(p)) {
|
|
pt = p - r.TopLeft();
|
|
Ctrl* w(q);
|
|
filt(w, pt, f);
|
|
if(w) return w;
|
|
}
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
Ctrl* CtrlFinder::GetCtrl(Ctrl& c, Point& p, int& f, const CtrlFilterType& filt)
|
|
{
|
|
Ctrl* q = ChildAtPoint(c, p, f, filt);
|
|
if(q && (f & DEEP))
|
|
{
|
|
Point pt(p);
|
|
Ctrl* qc = GetCtrl(*q, pt, f, filt);
|
|
if(qc) { p = pt; return qc; }
|
|
}
|
|
return q;
|
|
}
|
|
|
|
bool CtrlFinder::IsParentR(const Ctrl* p, const Ctrl* c)
|
|
{
|
|
while(c && p) {
|
|
if(c == p) return true;
|
|
c = c->GetParent();
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void CtrlFinder::Updated()
|
|
{
|
|
if(!pctrl) return;
|
|
SetPos(pctrl->GetPos());
|
|
}
|
|
|
|
void CtrlFinder::UpdatedSource()
|
|
{
|
|
Remove();
|
|
ClearCtrl();
|
|
if(!pctrl) return;
|
|
ASSERT(pctrl->GetParent());
|
|
//finder adds itself on top of any child in the search ctrl's parent
|
|
pctrl->GetParent()->AddChild(this, pctrl);
|
|
}
|
|
|
|
void CtrlFinder::LeftDown(Point p, dword keyflags)
|
|
{
|
|
if(!pctrl) return;
|
|
Point pt(p);
|
|
int f(flags);
|
|
ctrl = GetCtrl(*pctrl, pt, f, filter);
|
|
if(!ctrl) ctrl = pctrl;
|
|
if(!ctrl) return;
|
|
WhenLeftDown(*ctrl, p, keyflags);
|
|
Action();
|
|
}
|
|
void CtrlFinder::RightDown(Point p, dword keyflags)
|
|
{
|
|
if(!pctrl) return;
|
|
Point pt(p);
|
|
int f(flags);
|
|
ctrl = GetCtrl(*pctrl, pt, f, filter);
|
|
if(!ctrl) ctrl = pctrl;
|
|
if(!ctrl) return;
|
|
WhenRightDown(*ctrl, p, keyflags);
|
|
Action();
|
|
if(WhenBar)
|
|
MenuBar::Execute(WhenBar);
|
|
}
|
|
|