Tooltips in Listboxes

For help with anything that CEGUI doesn't offer straight out-of-the-box, e.g.:
- Implementation of new features, such as new Core classes, widgets, WindowRenderers, etc. ...
- Modification of any existing features for specific purposes
- Integration of CEGUI in new engines or frameworks and writing of new plugins (Renderer, Parser, ...) or modules

Moderators: CEGUI MVP, CEGUI Team

User avatar
Blakharaz
Not too shy to talk
Not too shy to talk
Posts: 31
Joined: Wed Jan 12, 2005 12:06
Location: Potsdam, Germany
Contact:

Tooltips in Listboxes

Postby Blakharaz » Wed Aug 24, 2005 17:35

Hi,

I created a listbox item showing an image (see https://sourceforge.net/tracker/index.p ... tid=605424). But I like to show a tooltip with a short description when the user moves the mouse cursor over the image, how can I do this, ListboxItem can't handle events and has no method like setTooltipText().
Coder in the Pantheon Team - creators of "Rastullahs Lockenpracht" (http://www.rastullahs-lockenpracht.de/)

User avatar
CrazyEddie
CEGUI Project Lead
Posts: 6760
Joined: Wed Jan 12, 2005 12:06
Location: England
Contact:

Re: Tooltips in Listboxes

Postby CrazyEddie » Thu Aug 25, 2005 08:36

Hi,

Thanks for the patch ;)

"real" per-item tooltips in the current listbox style widgets are not available - mainly due to the fact that, as you mentioned, the items have no event handling (because they are not window based). At some stage, I would still like to see these widgets be transitioned over to Window based items like we have for the menu system, anyway, that does not help you at the moment :)

The best I can suggest is to modify (or even sub-class) the listbox and add some logic to set the main Listbox tooltip text to something related to whatever item is under the mouse. So you'd basically be writing a MouseMove handler using logic similar to what we use for the MouseButtonDown handler - except that rather than selecting the item, you just grab some text you define in it and set that text as the Listbox tooltip.

Not ideal, but at the moment, I think it's the best you can do. If you need further clarification of this approach, somebody should be able to assist :)

User avatar
Blakharaz
Not too shy to talk
Not too shy to talk
Posts: 31
Joined: Wed Jan 12, 2005 12:06
Location: Potsdam, Germany
Contact:

Re: Tooltips in Listboxes

Postby Blakharaz » Mon Aug 29, 2005 22:24

Okay, I tried to do this. But it seems that tooltips are not resized very often (and I found no auto-resize like in the menus).

My code is

Code: Select all

void Listbox::onMouseMove(MouseEventArgs& e)
{
   Point posi = relativeToAbsolute(screenToWindow(e.position));
   ListboxItem* item = getItemAtPoint(posi);
   if (item != NULL)
   {
      setTooltipText(item->getTooltipText());
   }
   else
   {
      setTooltipText("");
   }

   Window::onMouseMove(e);
}

Additionally ListboxItem has the new method getTooltipText().

The result is often like this:
Image

Seldom (I don't know when and why) I get:
Mouse over first item:
Image

Mouse over second item:
Image

Is there any possibility to force a resize of the tooltip popup? Or do I make an other mistake?
Maybe the tooltip should follow the mouse pointer?



BTW: I also have a listbox text component with word wrapping, maybe this could be integrated into CEGUI too?
Coder in the Pantheon Team - creators of "Rastullahs Lockenpracht" (http://www.rastullahs-lockenpracht.de/)

User avatar
CrazyEddie
CEGUI Project Lead
Posts: 6760
Joined: Wed Jan 12, 2005 12:06
Location: England
Contact:

Re: Tooltips in Listboxes

Postby CrazyEddie » Tue Aug 30, 2005 08:41

Hi,

I'll make two modifications for you:

1) When the tool-tip text is changed, I'll make the Tooltip reposition and recalculate its size.

2) Make the Tooltip::positionSelf method public. Then when you respond to mouse movements in Listbox you can do:

Code: Select all

getTooltip()->positionSelf();


and the tooltip should then follow the mouse.

I'll do this in a little while, commit to CVS and either post a patch here or on IRC if I see you there ;)

Edit:
Here is the patch. This is pretty much non-breaking so I'll add it in all branches from v0-3 and up.

Code: Select all

Index: include/elements/CEGUITooltip.h
===================================================================
RCS file: /cvsroot/crayzedsgui/cegui_mk2/include/elements/CEGUITooltip.h,v
retrieving revision 1.7
diff -u -r1.7 CEGUITooltip.h
--- include/elements/CEGUITooltip.h   21 Aug 2005 17:57:02 -0000   1.7
+++ include/elements/CEGUITooltip.h   30 Aug 2005 09:09:47 -0000
@@ -167,6 +167,16 @@
          */
         void setFadeTime(float seconds);
 
+        //
+        /*!
+        \brief
+            Causes the tooltip to position itself appropriately.
+
+        \return
+            Nothing.
+        */
+        void positionSelf(void);
+
     protected:
         /*************************************************************************
             Implementation Methods
@@ -189,9 +199,6 @@
         void switchToFadeInState(void);
         void switchToFadeOutState(void);
 
-        // method to get the tooltip to position itself appropriately.
-        void positionSelf(void);
-
 
       /*!
       \brief
@@ -288,6 +295,7 @@
         ************************************************************************/
         void updateSelf(float elapsed);
         void onMouseEnters(MouseEventArgs& e);
+        void onTextChanged(WindowEventArgs& e);
 
         /************************************************************************
             Enumerations
Index: src/elements/CEGUITooltip.cpp
===================================================================
RCS file: /cvsroot/crayzedsgui/cegui_mk2/src/elements/CEGUITooltip.cpp,v
retrieving revision 1.3
diff -u -r1.3 CEGUITooltip.cpp
--- src/elements/CEGUITooltip.cpp   10 Jul 2005 09:39:00 -0000   1.3
+++ src/elements/CEGUITooltip.cpp   30 Aug 2005 09:09:47 -0000
@@ -363,6 +363,19 @@
         Window::onMouseEnters(e);
     }
 
+    void Tooltip::onTextChanged(WindowEventArgs& e)
+    {
+        // base class processing
+        Window::onTextChanged(e);
+
+        // set size and potition of the tooltip window to consider new text
+        setSize(Absolute, getTextSize());
+        positionSelf();
+
+        // we do not signal we handled it, in case user wants to hear
+        // about text changes too.
+    }
+
     void Tooltip::onHoverTimeChanged(WindowEventArgs& e)
     {
         fireEvent(EventHoverTimeChanged, e, EventNamespace);

User avatar
Blakharaz
Not too shy to talk
Not too shy to talk
Posts: 31
Joined: Wed Jan 12, 2005 12:06
Location: Potsdam, Germany
Contact:

Re: Tooltips in Listboxes

Postby Blakharaz » Thu Sep 01, 2005 00:50

Okay, it's almost done.

Image


Image

But I noticed a little bug with the tooltip: If the mouse pointer is not over an item, I change the text to "" which hides the tooltip. But if I go over an item again, the tooltip won't show again, I have to leave the listbox and come back into it.
Coder in the Pantheon Team - creators of "Rastullahs Lockenpracht" (http://www.rastullahs-lockenpracht.de/)

User avatar
CrazyEddie
CEGUI Project Lead
Posts: 6760
Joined: Wed Jan 12, 2005 12:06
Location: England
Contact:

Re: Tooltips in Listboxes

Postby CrazyEddie » Thu Sep 01, 2005 09:07

I shall attempt to resolve this final issue this morning.

This has given the tooltips system a good testing so thanks for that, because I've been able to shake out a few issues :)

Edit:
As mentioned on IRC - This is a kind of half-bug, depending upon your point of view, and what behaviour is expected from tooltips when used 'normally'. Anyway, as always, there is a workaround, and this is it:

Basically, within the Listbox::onMouseMove handler, you need a couple of extra lines.

Currently, you probably have something similar to this in there, to make the tooltip follow the mouse:

Code: Select all

Tooltip* tooltip = getTooltip();

if (tooltip)
    tooltip->positionSelf();


All you need to do is modify that to something similar to this:

Code: Select all

Tooltip* tooltip = getTooltip();

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


This will re-activate the tooltip for the window (listbox).

HTH

User avatar
Blakharaz
Not too shy to talk
Not too shy to talk
Posts: 31
Joined: Wed Jan 12, 2005 12:06
Location: Potsdam, Germany
Contact:

Re: Tooltips in Listboxes

Postby Blakharaz » Thu Sep 01, 2005 21:06

Setting the tooltip's owner did the trick. Thanks for your help. I submitted a patch against the 0.4 CVS branch on SourceForge.
Coder in the Pantheon Team - creators of "Rastullahs Lockenpracht" (http://www.rastullahs-lockenpracht.de/)

User avatar
CrazyEddie
CEGUI Project Lead
Posts: 6760
Joined: Wed Jan 12, 2005 12:06
Location: England
Contact:

Re: Tooltips in Listboxes

Postby CrazyEddie » Fri Sep 02, 2005 09:23

Cool. Glad it's working properly now, and thanks for the patch. I'll have a look later today with any luck.


Return to “Modifications / Integrations / Customisations”

Who is online

Users browsing this forum: No registered users and 4 guests