(Solved) Mouse moving/clicking when over CEGUI window
Moderators: CEGUI MVP, CEGUI Team
(Solved) Mouse moving/clicking when over CEGUI window
I have started a discussion on how to check whether the mouse is over an UI element in the Ogre forums but i think, a cegui pro can shed more light on this
Please check out the thread:
http://www.ogre3d.org/forums/viewtopic.php?f=2&t=60341
How is this properly done? I need to be able to differentiate between UI click/drags (e.g. dragging a window around) and manipulating the Ogre scene.
Cheers,
Michael
Please check out the thread:
http://www.ogre3d.org/forums/viewtopic.php?f=2&t=60341
How is this properly done? I need to be able to differentiate between UI click/drags (e.g. dragging a window around) and manipulating the Ogre scene.
Cheers,
Michael
Last edited by mboeni on Thu Sep 23, 2010 10:38, edited 1 time in total.
-
- Quite a regular
- Posts: 79
- Joined: Wed Jan 09, 2008 11:06
Re: Mouse moving/clicking when over CEGUI window
I think setting setMousePassThroughEnabled(true) on all parent windows should eliminate the 'always over a gui element' situation. Set this on all 'Root' windows and mouse events should be ignored except for widgets contained within those parent windows, buttons, images etc..
-
- Not too shy to talk
- Posts: 45
- Joined: Wed Aug 25, 2010 00:32
- Location: Buenos Aires - Argentina
Re: Mouse moving/clicking when over CEGUI window
Have you tried using Window::isHit()? http://www.cegui.org.uk/docs/current/classCEGUI_1_1Window.html#a0aa869aa8c3063281a66f364779c0333
Re: Mouse moving/clicking when over CEGUI window
No, I have not tried that yet - but will do so this evening - thanks for the tip
Re: Mouse moving/clicking when over CEGUI window
Okay, it seems that the problem is that my 'generat0r_MainMenu' DefaultGUISheet covers a large portion of the screen:
Especially the following lines suggest that it covers the full screen:
When I set the Y scaling to something less than 1, say 0.5, the menu gets cut half and the element covers 50% of the screen. When I set it to exactly 1, all of the screen is covered by this UI element.
Additional observation: When I click on an MenuItem, then, from that time on, the MenuItem 'covers' all of the screen. Very strange.
Perhaps im testig this wrong. I am doing this for testing:
Does anyone have an idea whats wrong?
Thanks & cheers,
Michael
Code: Select all
<?xml version="1.0" ?>
<GUILayout>
<Window Type="DefaultGUISheet" Name="generat0r_MainMenu">
<Property Name="UnifiedSize" Value="{{1,0},{1,0}}" />
<Property Name="UnifiedPosition" Value="{{0,0},{0,0}}" />
<Window Type="Vanilla/Menubar" Name="generat0r/Menubar">
<Property Name="UnifiedSize" Value="{{1,0},{0.025,0}}" />
<Property Name="UnifiedPosition" Value="{{0,0},{0,0}}" />
<Window Type="Vanilla/MenuItem" Name="generat0r/Menubar/MenuItem1">
<Property Name="UnifiedSize" Value="{{1,0},{0.025,0}}" />
<Property Name="UnifiedPosition" Value="{{0,0},{0,0}}" />
<Property Name="Text" Value="File" />
<Window Type="Vanilla/PopupMenu" Name="generat0r/Menubar/MenuItem1/PopupMenu1">
<Property Name="UnifiedSize" Value="{{1,0},{0.1,0}}" />
<Property Name="UnifiedPosition" Value="{{0,0},{0,0}}" />
<Window Type="Vanilla/MenuItem" Name="generat0r/Menubar/MenuItem1/PopupMenu1/MenuItem1">
<Property Name="UnifiedSize" Value="{{1,0},{0.025,0}}" />
<Property Name="UnifiedPosition" Value="{{0,0},{0,0}}" />
<Property Name="Text" Value="Exit" />
</Window>
</Window>
</Window>
<Window Type="Vanilla/MenuItem" Name="generat0r/Menubar/MenuItem2">
<Property Name="UnifiedSize" Value="{{1,0},{0.1,0}}" />
<Property Name="UnifiedPosition" Value="{{0,0},{0,0}}" />
<Property Name="Text" Value="Help" />
<Window Type="Vanilla/PopupMenu" Name="generat0r/Menubar/MenuItem2/PopupMenu1">
<Property Name="UnifiedSize" Value="{{1,0},{0.1,0}}" />
<Property Name="UnifiedPosition" Value="{{0,0},{0,0}}" />
<Window Type="Vanilla/MenuItem" Name="generat0r/Menubar/MenuItem2/PopupMenu1/MenuItem1">
<Property Name="UnifiedSize" Value="{{1,0},{0.025,0}}" />
<Property Name="UnifiedPosition" Value="{{0,0},{0,0}}" />
<Property Name="Text" Value="About generat0r" />
</Window>
</Window>
</Window>
</Window>
</Window>
</GUILayout>
Especially the following lines suggest that it covers the full screen:
Code: Select all
<Property Name="UnifiedSize" Value="{{1,0},{1,0}}" />
<Property Name="UnifiedPosition" Value="{{0,0},{0,0}}" />
When I set the Y scaling to something less than 1, say 0.5, the menu gets cut half and the element covers 50% of the screen. When I set it to exactly 1, all of the screen is covered by this UI element.
Additional observation: When I click on an MenuItem, then, from that time on, the MenuItem 'covers' all of the screen. Very strange.
Perhaps im testig this wrong. I am doing this for testing:
Code: Select all
CEGUI::WindowManager& wmgr = CEGUI::WindowManager::getSingleton();
CEGUI::System &sys = CEGUI::System::getSingleton();
CEGUI::Window* guiW = wmgr.getWindow("uiRoot");
std::string s1 = "UI Element under mouse: " ;
CEGUI::Window* mWin = sys.getWindowContainingMouse();
std::string s2 = mWin->getName().c_str();
std::string s3 = s1 + s2;
mTrayMgr->showOkDialog("UI Element Message", s3);
Does anyone have an idea whats wrong?
Thanks & cheers,
Michael
Re: Mouse moving/clicking when over CEGUI window
I have also tried ianstangoe's suggestion:
This DOES help, but for the mainmenu only. It does not help with the "MenuItem" phenomenon described above.
I dont assume that i have to activate this on each element so I must be doing something in the layouts fundamentally wrong...
Anyone?
Code: Select all
CEGUI::Window *mainMenu = wmgr.loadWindowLayout("g0_mainmenu.layout");
mainMenu->setMousePassThroughEnabled(true);
uiRoot->addChildWindow(mainMenu);
This DOES help, but for the mainmenu only. It does not help with the "MenuItem" phenomenon described above.
I dont assume that i have to activate this on each element so I must be doing something in the layouts fundamentally wrong...
Anyone?
- CrazyEddie
- CEGUI Project Lead
- Posts: 6760
- Joined: Wed Jan 12, 2005 12:06
- Location: England
- Contact:
Re: Mouse moving/clicking when over CEGUI window
Ok. If I understand the issue correctly, it is the classic case that you need to differentiate between when a mouse event occurred over some GUI element and when it occurs over the play field?
In this case, the correct way to deal with the situation is as follows:
1) Your root window(s) need to have the MousePassThroughEnabled property set to "True" (this also holds for other transparent 'DefaultWindow' instances you may be using for grouping or what have you)
2) You need to check the returned bool from the CEGUI::System::inject* calls. If these return true, it means CEGUI handled the input so you should do no further processing for that input event (unless you want something odd / unusual). If the inject function returns false, it means that CEGUI did not handle the input and you should proceed to do whatever processing you want as required by the rest of your app.
HTH
CE.
In this case, the correct way to deal with the situation is as follows:
1) Your root window(s) need to have the MousePassThroughEnabled property set to "True" (this also holds for other transparent 'DefaultWindow' instances you may be using for grouping or what have you)
2) You need to check the returned bool from the CEGUI::System::inject* calls. If these return true, it means CEGUI handled the input so you should do no further processing for that input event (unless you want something odd / unusual). If the inject function returns false, it means that CEGUI did not handle the input and you should proceed to do whatever processing you want as required by the rest of your app.
HTH
CE.
Useful Links: Forum Guidelines | Documentation | Tutorials | HOWTO | Videos | Donate to CEGUI | CEGUI Twitter
Re: Mouse moving/clicking when over CEGUI window
I set the uiRoot to passthrough and added the following to my mouse handling:
and this is how i create the elements:
Now, every click i do anywhere triggers the 'help-about' menuitem (which is the last window in my mainmenu layout).
Just to make sure it's not the layouts:
Mainmenu layout:
and the aboutDialog
Anyone?
Cheers,
Michael
Code: Select all
bool BaseApplication::mouseMoved( const OIS::MouseEvent &arg )
{
CEGUI::System &sys = CEGUI::System::getSingleton();
if(sys.injectMousePosition(arg.state.X.abs, arg.state.Y.abs)) //If true the CEGUI needs to handle it !
{
// Scroll wheel.
if (arg.state.Z.rel)
sys.injectMouseWheelChange(arg.state.Z.rel / 120.0f);
}
else
{
if (mTrayMgr->injectMouseMove(arg)) return true;
mCameraMan->injectMouseMove(arg);
}
return true;
}
bool BaseApplication::mousePressed( const OIS::MouseEvent &arg, OIS::MouseButtonID id )
{
if( ! CEGUI::System::getSingleton().injectMouseButtonDown(convertButton(id))) // if this is true, CEGUI handled the mouse so ogre does not need to!
{
if (mTrayMgr->injectMouseDown(arg, id)) return true;
mCameraMan->injectMouseDown(arg, id);
}
return true;
}
bool BaseApplication::mouseReleased( const OIS::MouseEvent &arg, OIS::MouseButtonID id )
{
if( ! CEGUI::System::getSingleton().injectMouseButtonDown(convertButton(id))) // if this is true, CEGUI handled the mouse so ogre does not need to!
{
if (mTrayMgr->injectMouseUp(arg, id)) return true;
mCameraMan->injectMouseUp(arg, id);
}
return true;
}
and this is how i create the elements:
Code: Select all
CEGUI::WindowManager& wmgr = CEGUI::WindowManager::getSingleton();
uiRoot = wmgr.createWindow( "DefaultWindow", "uiRoot" );
uiRoot->setMousePassThroughEnabled(true);
CEGUI::System::getSingleton().setGUISheet(uiRoot);
CEGUI::Window *mainMenu = wmgr.loadWindowLayout("g0_mainmenu.layout");
uiRoot->addChildWindow(mainMenu);
Now, every click i do anywhere triggers the 'help-about' menuitem (which is the last window in my mainmenu layout).
Just to make sure it's not the layouts:
Mainmenu layout:
Code: Select all
<?xml version="1.0" ?>
<GUILayout>
<Window Type="Vanilla/Menubar" Name="generat0r/Menubar">
<Property Name="UnifiedSize" Value="{{1,0},{0.025,0}}" />
<Property Name="UnifiedPosition" Value="{{0,0},{0,0}}" />
<Window Type="Vanilla/MenuItem" Name="generat0r/Menubar/MenuItem1">
<Property Name="UnifiedSize" Value="{{1,0},{0.025,0}}" />
<Property Name="UnifiedPosition" Value="{{0,0},{0,0}}" />
<Property Name="Text" Value="File" />
<Window Type="Vanilla/PopupMenu" Name="generat0r/Menubar/MenuItem1/PopupMenu1">
<Property Name="UnifiedSize" Value="{{1,0},{0.1,0}}" />
<Property Name="UnifiedPosition" Value="{{0,0},{0,0}}" />
<Window Type="Vanilla/MenuItem" Name="generat0r/Menubar/MenuItem1/PopupMenu1/MenuItem1">
<Property Name="UnifiedSize" Value="{{1,0},{0.025,0}}" />
<Property Name="UnifiedPosition" Value="{{0,0},{0,0}}" />
<Property Name="Text" Value="Exit" />
</Window>
</Window>
</Window>
<Window Type="Vanilla/MenuItem" Name="generat0r/Menubar/MenuItem2">
<Property Name="UnifiedSize" Value="{{1,0},{0.1,0}}" />
<Property Name="UnifiedPosition" Value="{{0,0},{0,0}}" />
<Property Name="Text" Value="Help" />
<Window Type="Vanilla/PopupMenu" Name="generat0r/Menubar/MenuItem2/PopupMenu1">
<Property Name="UnifiedSize" Value="{{1,0},{0.1,0}}" />
<Property Name="UnifiedPosition" Value="{{0,0},{0,0}}" />
<Window Type="Vanilla/MenuItem" Name="generat0r/Menubar/MenuItem2/PopupMenu1/MenuItem1">
<Property Name="UnifiedSize" Value="{{1,0},{0.025,0}}" />
<Property Name="UnifiedPosition" Value="{{0,0},{0,0}}" />
<Property Name="Text" Value="About generat0r" />
</Window>
</Window>
</Window>
</Window>
</GUILayout>
and the aboutDialog
Code: Select all
<?xml version="1.0" encoding="UTF-8"?>
<GUILayout >
<Window Type="Vanilla/FrameWindow" Name="generat0r/AboutDialog" >
<Property Name="Text" Value="About generat0r" />
<Property Name="TitlebarFont" Value="Arial-14" />
<Property Name="TitlebarEnabled" Value="True" />
<Property Name="CloseButtonEnabled" Value="False" />
<Property Name="SizingEnabled" Value="False" />
<Property Name="UnifiedAreaRect" Value="{{0.015,0},{0.015,0},{0.45,0},{0.40,0}}" />
<Property Name="UnifiedPosition" Value="{ {0.25, 0}, {0.25, 0} }" />
<Window Type="Vanilla/StaticText" Name="generat0r/AboutDialog/StaticText" >
<Property Name="Text" Value="Demonstrates static (non editable) text. Use the controls on your right for formatting options." />
<Property Name="HorzExtent" Value="361" />
<Property Name="VertExtent" Value="59.5854" />
<Property Name="HorzFormatting" Value="WordWrapLeftAligned" />
<Property Name="VertFormatting" Value="TopAligned" />
<Property Name="UnifiedAreaRect" Value="{{0.03,0},{0.03,0},{0.97,0},{0.85,0}}" />
</Window>
<Window Type="Vanilla/Button" Name="generat0r/AboutDialog/CloseButton" >
<Property Name="Text" Value="Close" />
<Property Name="UnifiedAreaRect" Value="{{0.42,0},{0.88,0},{0.60,0},{0.955,0}}" />
</Window>
</Window>
</GUILayout>
Anyone?
Cheers,
Michael
-
- Not too shy to talk
- Posts: 45
- Joined: Wed Aug 25, 2010 00:32
- Location: Buenos Aires - Argentina
Re: Mouse moving/clicking when over CEGUI window
mboeni wrote:Code: Select all
bool BaseApplication::mouseMoved( const OIS::MouseEvent &arg )
{
CEGUI::System &sys = CEGUI::System::getSingleton();
if(sys.injectMousePosition(arg.state.X.abs, arg.state.Y.abs)) //If true the CEGUI needs to handle it !
{
// Scroll wheel.
if (arg.state.Z.rel)
sys.injectMouseWheelChange(arg.state.Z.rel / 120.0f);
}
else
{
if (mTrayMgr->injectMouseMove(arg)) return true;
mCameraMan->injectMouseMove(arg);
}
return true;
}
All the code looks ok to me, the only "weird" thing i notice is in this snippet. I don't know what kind of application are you working on, but for my experience an FPS is not the same as an RTS game.
In an RTS one would normally use a cursor all the time, so you can click in the level ground, and also interact with the gui stuff around, but in an FPS this behavior is not needed/wanted, and the usual approach is to take deltas from the center of the screen, and restore the cursor position there once you are done with them (This is not always the case but i think it is the most used method).
So, in the first case (RTS-like), you should inject the position always, but in the other (FPS-like) you don't need it, and you can make a test like if(hascursor) move_gui_cursor(); else move_camera();
Maybe a use case can give me some light =).
Btw, why are you using 2 gui systems? Isn't SdkTrays designed to create simple GUIs for samples?
Re: Mouse moving/clicking when over CEGUI window
Its not a game at all generat0r is a VJing system used in clubs, company presentations, video shows, etc. It can react to music, take midi input and such. Having this in 3D space allows for a great deal of neat effects that i can use along with simple generative art, videos and such (compositing of 3d objects, particle systems, etc)
SDKTrays is just used for some debugging as it is very fast/convenient for that, it will not make it into the release version.
Clearer now?
Cheerio,
Michael
SDKTrays is just used for some debugging as it is very fast/convenient for that, it will not make it into the release version.
Clearer now?
Cheerio,
Michael
-
- Not too shy to talk
- Posts: 45
- Joined: Wed Aug 25, 2010 00:32
- Location: Buenos Aires - Argentina
Re: Mouse moving/clicking when over CEGUI window
Not really, for what i know so far you can enter different rooms to change a song and fade between them according to the distance (FPS-like), or maybe drag over the 3d scene to make some scratching (RPG-like) =D
btw, sounds like a cool app.
btw, sounds like a cool app.
Re: Mouse moving/clicking when over CEGUI window
Think of it more like an editor in 3d space with gui elements in it (i call this the construct). This is where the VJ sets up his/her scene, adds effects and such. The output (withouth the grid / UI elements, etc) is shown in another viewport (usually another monitor, beamer, etc).
So what i want is this: When the mouse is over an Ui element, the CEGUI should handle the mouse and not ogre. When the mouse is over the scene, i want ogre to get the mouse stuff.
Just imagine an 'about' dialog which I click/drag at its title and move it around. Currently, this also moves (rotates) the scene behind the about dialog - I dont want that. I just want the dialog to move (i.e. inject the mouse dragging only to CEGUI and not ogre)
Yes, i'ts really cool to work on it, but tons of challenges to solve
So what i want is this: When the mouse is over an Ui element, the CEGUI should handle the mouse and not ogre. When the mouse is over the scene, i want ogre to get the mouse stuff.
Just imagine an 'about' dialog which I click/drag at its title and move it around. Currently, this also moves (rotates) the scene behind the about dialog - I dont want that. I just want the dialog to move (i.e. inject the mouse dragging only to CEGUI and not ogre)
Yes, i'ts really cool to work on it, but tons of challenges to solve
-
- Not too shy to talk
- Posts: 45
- Joined: Wed Aug 25, 2010 00:32
- Location: Buenos Aires - Argentina
Re: Mouse moving/clicking when over CEGUI window
I'll make a few tests and come back to you (tomorrow morning if time is by my side today =/).
Edit:
Hi Michael, i had time today and i was able to make those tests, but i'm not able to reproduce the behavior of your application. If you've followed all the recommendations given in this post you should be able to get the app work as expected (as i did), so, take a closer look at your code (a debugger might help ) because the problem seems to be somewhere else (or i'm blind hehe). If you can't find the problem PM me and i'll give you my email so you can send me your code (or upload it somewhere and give me the link). Sry i can't do much more.
Cya =D
Edit:
Hi Michael, i had time today and i was able to make those tests, but i'm not able to reproduce the behavior of your application. If you've followed all the recommendations given in this post you should be able to get the app work as expected (as i did), so, take a closer look at your code (a debugger might help ) because the problem seems to be somewhere else (or i'm blind hehe). If you can't find the problem PM me and i'll give you my email so you can send me your code (or upload it somewhere and give me the link). Sry i can't do much more.
Cya =D
Re: Mouse moving/clicking when over CEGUI window
Hiho
Actually i wrote my own debugging code for this issue. That helped a bit, but did not lead to the solution (try and error did )
I have achieved success, though, last night (hooray!). The actual solution was to get the 'mix' of the posted ideas just right (like in a puzzle). None of the concepts worked as such but the right mix did
Here's a summary of what I did (feel free to post/PM me for details):
1. Remove the 'defaultWindows' in MainMenu and Aboutdialog
2. Set the uiRoot to passthrough (uiRoot->setMousePassThroughEnabled(true);)
3. Write a function that checks whether the mouse is over an UI element:
4. Add this check to 'mousePressed' like so:
mouse released:
mouse moved:
This works as expected (for now )
Cheerio,
michael
Actually i wrote my own debugging code for this issue. That helped a bit, but did not lead to the solution (try and error did )
I have achieved success, though, last night (hooray!). The actual solution was to get the 'mix' of the posted ideas just right (like in a puzzle). None of the concepts worked as such but the right mix did
Here's a summary of what I did (feel free to post/PM me for details):
1. Remove the 'defaultWindows' in MainMenu and Aboutdialog
2. Set the uiRoot to passthrough (uiRoot->setMousePassThroughEnabled(true);)
3. Write a function that checks whether the mouse is over an UI element:
Code: Select all
bool Utility::isMouseOverUI()
{
bool condition = false;
CEGUI::WindowManager& wmgr = CEGUI::WindowManager::getSingleton();
CEGUI::System &sys = CEGUI::System::getSingleton();
CEGUI::Window* guiW = wmgr.getWindow("uiRoot");
if(sys.getWindowContainingMouse()!=guiW) //this means the mouse is over any UI element
condition = true;
return condition;
}
4. Add this check to 'mousePressed' like so:
Code: Select all
bool BaseApplication::mousePressed( const OIS::MouseEvent &arg, OIS::MouseButtonID id )
{
if(Utility::isMouseOverUI())
{
CEGUI::System::getSingleton().injectMouseButtonDown(convertButton(id));
}
else
{
if (mTrayMgr->injectMouseDown(arg, id)) return true;
mCameraMan->injectMouseDown(arg, id);
}
return true;
}
mouse released:
Code: Select all
if (mTrayMgr->injectMouseUp(arg, id)) return true;
mCameraMan->injectMouseUp(arg, id);
CEGUI::System::getSingleton().injectMouseButtonUp(convertButton(id));
return true;
mouse moved:
Code: Select all
if (mTrayMgr->injectMouseMove(arg)) return true;
mCameraMan->injectMouseMove(arg);
CEGUI::System &sys = CEGUI::System::getSingleton();
sys.injectMousePosition(arg.state.X.abs, arg.state.Y.abs);
// Scroll wheel.
if (arg.state.Z.rel)
sys.injectMouseWheelChange(arg.state.Z.rel / 120.0f);
return true;
This works as expected (for now )
Cheerio,
michael
-
- Not too shy to talk
- Posts: 45
- Joined: Wed Aug 25, 2010 00:32
- Location: Buenos Aires - Argentina
Re: (Solved) Mouse moving/clicking when over CEGUI window
I'm glad you fixed it =D
Who is online
Users browsing this forum: No registered users and 12 guests