zoukankan      html  css  js  c++  java
  • 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也有这个问题

  • 相关阅读:
    Ubuntu 16 安装redis客户端
    crontab 参数详解
    PHP模拟登录发送闪存
    Nginx配置端口访问的网站
    Linux 增加对外开放的端口
    Linux 实用指令之查看端口开启情况
    无敌的极路由
    不同的域名可以指向同一个项目
    MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error
    Redis 创建多个端口
  • 原文地址:https://www.cnblogs.com/minggoddess/p/2288683.html
Copyright © 2011-2022 走看看