cegui 的tree支持 stringparse的link 处理

总体流程 就是照着 falstatictext 来把treeitem和tree 结合起来加上 link处理的功能 因为之前 只有statictext支持link的

其实link是所有tag处理的一部分

 

void Tree::onMouseMove(MouseEventArgs& e)
{
static TreeItem* lastItem = 0;

Point posi(CoordConverter::screenToWindow(*this, e.position));
// Point posi = relativeToAbsolute(CoordConverter::screenToWindow(*this, e.position));
TreeItem* item = getItemAtPoint(posi);

bool bPointIn = e.window->isHit(e.position);
RenderedStringComponent* pRSComponent = NULL;


if (item != lastItem)
{
if (item != 0)
{
setTooltipText(item->getTooltipText());
RenderedString itemRenderStr=item->getRenderedString();
if (bPointIn)
{
pRSComponent=(RenderedStringComponent*)itemRenderStr.getRenderedStringComponentAtPoint(0,item->getItemPos(),posi);
}
if (pRSComponent == d_rSCWithMouse)
{
return ;
}

RenderedStringComponent* pOldRSComponent = d_rSCWithMouse;
if (pOldRSComponent)
{
// mouse leaves
size_t iLinkID = pOldRSComponent->getLinkID();
if (iLinkID)
{
itemRenderStr.setRSCLinkState(0,iLinkID, RenderedStringComponent::LS_MOUSE_LEAVE);
this->onLinkEvent(iLinkID, LinkTextEventArgs::LNKETP_MOUSE_LEAVE);
this->invalidate();
}
}

if (pRSComponent)
{
// mouse enter
size_t iLinkID = pRSComponent->getLinkID();
if (iLinkID)
{
itemRenderStr.setRSCLinkState(0,iLinkID, RenderedStringComponent::LS_MOUSE_HOVER);
this->onLinkEvent(iLinkID, LinkTextEventArgs::LNKETP_MOUSE_ENTER);
this->invalidate();
}
}

d_rSCWithMouse = pRSComponent;
}
else
{
setTooltipText("");
}
lastItem = item;
}

// must check the result from getTooltip(), as the tooltip object could
// be 0 at any time for various reasons.
Tooltip* tooltip = getTooltip();

if (tooltip)
{
if (tooltip->getTargetWindow() != this)
tooltip->setTargetWindow(this);
else
tooltip->positionSelf();
}

Window::onMouseMove(e);
}


最关键是上面这段 mousemove的代码

有了 d_rSCWithMouse这个 在别的地方就可以用了

总体流程是 用treeitem的 renderstring 获取鼠标点击位置的renderstringcomponet 这个东西里面 有linkId

上述过程是在tree里处理的

 

treeitem里添加一个获取每个item的pos的函数 也在tree是set

 

我现在遇到的问题是

tree 没有onclick事件 当然我可以在tree的onmouseDown里添加处理

但是我不明白 为什么 onclick不好使 

 

别的控件加了什么 onclick是要加d_window->subscribeEvent(Window::EventMouseClick,
            Event::Subscriber(&FalagardStaticText::onMouseClick, this))

 

subscribeEvent这个 有了这个 相应的 onclick就好使了

我不明白的是 tree并没有subscribeEvent 但是 onMouseDown为什么就好使了

我要想让onclick好使应该怎么做呢

 

之前那段代码错误太多 有逻辑上得 有指针值传不过去的 下面这段就都改好了

 
void Tree::onMouseMove(MouseEventArgs& e)
{
static TreeItem* lastItem = 0;

Point posi(CoordConverter::screenToWindow(*this, e.position));
// Point posi = relativeToAbsolute(CoordConverter::screenToWindow(*this, e.position));
TreeItem* item = getItemAtPoint(posi);
bool bPointIn = e.window->isHit(e.position);
RenderedStringComponent* pRSComponent = NULL;
size_t iNewLinkID = 0;
if (item != 0)
{
d_itemRenderStr=item->getRenderedString();
if (bPointIn)
{
pRSComponent=(RenderedStringComponent*)d_itemRenderStr->getRenderedStringComponentAtPoint(0,item->
getItemArea().getPosition(),posi);    
}
if (pRSComponent)
{
iNewLinkID = pRSComponent->getLinkID();
}
}
if (iNewLinkID == d_linkID)
{
return ;
}

size_t iOldLinkID = d_linkID;
if (iOldLinkID)
{
// mouse leaves
d_itemRenderStr->setRSCLinkState(0,iOldLinkID, RenderedStringComponent::LS_MOUSE_LEAVE);
this->onLinkEvent(iOldLinkID, LinkTextEventArgs::LNKETP_MOUSE_LEAVE);
this->invalidate();
}

if (pRSComponent)
{
// mouse enter
size_t iLinkID = pRSComponent->getLinkID();
if (iLinkID)
{
d_itemRenderStr->setRSCLinkState(0,iLinkID, RenderedStringComponent::LS_MOUSE_HOVER);
this->onLinkEvent(iLinkID, LinkTextEventArgs::LNKETP_MOUSE_ENTER);
this->invalidate();
}
}
d_linkID=iNewLinkID;
if (item != lastItem)
{
if (item != 0)
{
setTooltipText(item->getTooltipText());
}
else
{
setTooltipText("");
}
lastItem = item;
}

// must check the result from getTooltip(), as the tooltip object could
// be 0 at any time for various reasons.
Tooltip* tooltip = getTooltip();

if (tooltip)
{
if (tooltip->getTargetWindow() != this)
tooltip->setTargetWindow(this);
else
tooltip->positionSelf();
}

Window::onMouseMove(e);
}

 

我还发现cegui一个更严重的问题:

  就是鼠标hover了 某window之后 如果以飞快之速度离开了 到了别的程序窗口啊 或者走了很远  原window的onMouseMove就不被调用了

这样里面处理 mouseleave的时间也不被执行了 ,不光是我写的这个link是这样的 在普通button上hover也有这个问题

posted on 2011-12-15 12:30  minggoddess  阅读(673)  评论(0编辑  收藏  举报