Mouse events blocked by button event
Mouse events blocked by button event
Hey,
I've copied out CGUISpinBox etc to make a button list, as it suggests, an array of buttons.
When buttons are drawn then the mouse down / move / up events don't appear. If no buttons are drawn then mouse events are received.
Is this because of how they are set up as subelements, or just because of their button event return, etc...
Any which way, what's the correct / best way to deal with this?
(Before, I used IGUIStaticText instead and handled rect testing myself)
Cheers
I've copied out CGUISpinBox etc to make a button list, as it suggests, an array of buttons.
When buttons are drawn then the mouse down / move / up events don't appear. If no buttons are drawn then mouse events are received.
Is this because of how they are set up as subelements, or just because of their button event return, etc...
Any which way, what's the correct / best way to deal with this?
(Before, I used IGUIStaticText instead and handled rect testing myself)
Cheers
Re: Mouse events blocked by button event
Who does not get events? The button, an element below the button, your application?
Events are still send out - the questions is who gets and handles them. The element below the mouse receives it first - and then decides to pass it on to it's parent (or not in case it eats the event).
Events are still send out - the questions is who gets and handles them. The element below the mouse receives it first - and then decides to pass it on to it's parent (or not in case it eats the event).
IRC: #irrlicht on irc.libera.chat
Code snippet repository: https://github.com/mzeilfelder/irr-playground-micha
Free racer made with Irrlicht: http://www.irrgheist.com/hcraftsource.htm
Code snippet repository: https://github.com/mzeilfelder/irr-playground-micha
Free racer made with Irrlicht: http://www.irrgheist.com/hcraftsource.htm
Re: Mouse events blocked by button event
Yes, I believe the mouse event is being eaten by the sub element button event. That is technically how it should be.
I'm sort of looking how to also get the mouse event after the button event. e.g. both track button click and list drag (but in separate elements)
Since the event is consumed, I half wondered if the button sends a new mouse event (maybe straight to parent after your mention), or, return false if parent is a buttonlist (too custom!)
A working example would be using a list of IGUIStaticText's, because they don't consume the mouse event. Then I instruct the background change from the parent element.
No matter, I'll go with the StaticText method so as to not change things too drastically...
I'm sort of looking how to also get the mouse event after the button event. e.g. both track button click and list drag (but in separate elements)
Since the event is consumed, I half wondered if the button sends a new mouse event (maybe straight to parent after your mention), or, return false if parent is a buttonlist (too custom!)
A working example would be using a list of IGUIStaticText's, because they don't consume the mouse event. Then I instruct the background change from the parent element.
No matter, I'll go with the StaticText method so as to not change things too drastically...
Re: Mouse events blocked by button event
Here's how it looks at close tonight, I've swapped in IGUIStaticPanel (IGUIStaticText) instead of IGUIItem (IGUIButton) to show a working example.
IGUIButtonList.h
CGUIButtonList.h
CGUIButtonList.cpp
IGUIButtonList.h
Code: Select all
// Copyright (C) 2006-2012 Michael Zeilfelder
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#ifndef __I_GUI_BUTTON_LIST_H_INCLUDED__
#define __I_GUI_BUTTON_LIST_H_INCLUDED__
#include "IGUIElement.h"
namespace irr
{
namespace gui
{
class IGUIEditBox;
//! Single line edit box + spin buttons
/** \par This element can create the following events of type EGUI_EVENT_TYPE:
\li EGET_SPINBOX_CHANGED
*/
class IGUIButtonList : public IGUIElement
{
public:
//! constructor
IGUIButtonList(IGUIEnvironment* environment, IGUIElement* parent,
s32 id, core::rect<s32> rectangle)
: IGUIElement(EGUIET_BUTTON_LIST, environment, parent, id, rectangle) {}
virtual void set_styles(io::IAttributes *attr, bool do_refresh=true) = 0;
virtual void set_style(core::stringc key, core::stringc value, bool do_refresh=true) = 0;
virtual core::stringc get_style(core::stringc key) const = 0;
virtual void clear_items(bool do_refresh=true) = 0;
virtual void set_items(core::array<io::IAttributes*> new_items) = 0;
virtual void add_item(io::IAttributes *item, bool do_refresh=true) = 0;
virtual io::IAttributes *get_last_event() = 0;
};
} // end namespace gui
} // end namespace irr
#endif // __I_GUI_SPIN_BOX_H_INCLUDED__
Code: Select all
// Copyright (C) 2006-2012 Michael Zeilfelder
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#ifndef __C_GUI_BUTTON_LIST_H_INCLUDED__
#define __C_GUI_BUTTON_LIST_H_INCLUDED__
#include "IrrCompileConfig.h"
#ifdef _IRR_COMPILE_WITH_GUI_
#include "IGUIButtonList.h"
#include "IGUIStaticPanel.h"
//#include "IGUIEditBoxd.h"
#include "IGUIItem.h"
//#include "IWriteFile.h"
//#include "IReadFile.h"
//#include "IFileList.h"
#include "IFileSystem.h"
namespace irr
{
namespace gui
{
class IGUIEditBox;
class IGUIButton;
//class IGUIEditBoxd;
class IGUIStaticPanel;
class IGUIItem;
class CGUIButtonList : public IGUIButtonList
{
public:
//! constructor
CGUIButtonList(const wchar_t* text, bool border, IGUIEnvironment* environment,
IGUIElement* parent, s32 id, const core::rect<s32>& rectangle);
//! destructor
virtual ~CGUIButtonList();
//! called if an event happened.
virtual bool OnEvent(const SEvent& event);
//! Draws the element and its children.
virtual void draw();
//! Writes attributes of the element.
virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options) const;
//! Reads attributes of the element
virtual void deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options);
virtual void set_styles(io::IAttributes *attr, bool do_refresh=true);
virtual void set_style(core::stringc key, core::stringc value, bool do_refresh=true);
virtual core::stringc get_style(core::stringc key) const;
virtual void clear_items(bool do_refresh=true);
virtual void set_items(core::array<io::IAttributes*> new_items);
virtual void add_item(io::IAttributes *item, bool do_refresh=true);
virtual io::IAttributes *get_last_event();
protected:
IGUIStaticPanel *e_root;
IGUIStaticPanel *e_wrap;
IGUIItem *e_scroll_top;
IGUIItem *e_scroll_bottom;
u32 last_event;
io::IAttributes *attr_styles;
core::array<io::IAttributes*> items;
//core::array<IGUIItem*> buttons; // replace with IGUIButton
core::array<IGUIStaticPanel*> buttons; // replace with IGUIStaticText
s32 btn_h;
s32 dragging;
s32 dragging_pos;
s32 scroll_pos;
s32 i_scrollspeed;
void refresh();
void handle_scroll(s32 n=0);
};
} // end namespace gui
} // end namespace irr
#endif // _IRR_COMPILE_WITH_GUI_
#endif // __C_GUI_SPIN_BOX_H_INCLUDED__
Code: Select all
// Copyright (C) 2006-2012 Michael Zeilfelder
// This file uses the licence of the Irrlicht Engine.
#include "CGUIButtonList.h"
#ifdef _IRR_COMPILE_WITH_GUI_
#include "CGUIEditBox.h"
#include "CGUIButton.h"
#include "IGUIEnvironment.h"
#include "IEventReceiver.h"
#include "fast_atof.h"
#include <wchar.h>
namespace irr
{
namespace gui
{
//! constructor
CGUIButtonList::CGUIButtonList(const wchar_t* text, bool border,IGUIEnvironment* environment,
IGUIElement* parent, s32 id, const core::rect<s32>& rectangle)
: IGUIButtonList(environment, parent, id, rectangle),
e_root(0),e_wrap(0),e_scroll_top(0),e_scroll_bottom(0),
attr_styles(0)
{
#ifdef _DEBUG
setDebugName("CGUIButtonList");
#endif
// INITS
last_event = -1;
dragging = 0;
dragging_pos = 0;
scroll_pos = 0;
i_scrollspeed = 5;
/*
// GEN INITIAL FAKE DATA
irr::io::IFileSystem *fs = Environment->getFileSystem();
io::IAttributes *attr; // = fs->createEmptyAttributes(NULL); // driver); // disallows internal loading of textures
attr = fs->createEmptyAttributes(NULL);
attr->addString("label", "Hello");
//attr->addString("src", ""); // change to texture...
items.push_back(attr);
attr = fs->createEmptyAttributes(NULL);
attr->addString("label", "Goodbye");
//attr->addString("src", ""); // change to texture...
items.push_back(attr);
*/
// CREATE ELEMENTS
refresh();
}
//! Refresh
void CGUIButtonList::refresh()
{
// DELETE OLD ROOT PANEL
//IGUIStaticPanel *e_root;
if(e_root)
{
e_root->drop();
e_root = NULL;
}
// DELETE OLD BUTTONS
for(u32 i = 0; i < buttons.size(); i++)
{
//std::cout << "" << points[i].c_str() << std::endl;
//delete items[i];
//items[i] = NULL;
buttons[i]->setVisible(false);
buttons[i]->drop();
}
buttons.clear();
if(e_scroll_top)
{
e_scroll_top->drop();
e_scroll_top = NULL;
}
if(e_scroll_bottom)
{
e_scroll_bottom->drop();
e_scroll_bottom = NULL;
}
if(e_wrap)
{
e_wrap->drop();
e_wrap = NULL;
}
// DEFAULTS
bool show_buttons = false; //false;
s32 btn_h = 20;
s32 btn_scroll = 0;
s32 btn_scroll_h = 0;
// PARSE CORE STYLES
if(attr_styles)
{
s32 id = attr_styles->findAttribute("h");
if(id >= 0){ btn_h = attr_styles->getAttributeAsInt(id); }
id = attr_styles->findAttribute("show_buttons");
if(id >= 0){ show_buttons = attr_styles->getAttributeAsBool(id); }
id = attr_styles->findAttribute("button_h");
if(id >= 0){ btn_scroll_h = attr_styles->getAttributeAsInt(id); }
}
//s32 btn_scroll = 0;
if(show_buttons)
{
btn_scroll = btn_h;
if(btn_scroll_h > 0)
{
btn_scroll = btn_scroll_h; // USE OVERRIDE
}
//e_scroll_top = Environment->addButton(core::rect<s32>(0, btn_h*i, AbsoluteRect.getWidth(), btn_h*(i+1)), e_root);
e_scroll_top = Environment->addItem(core::rect<s32>(0, 0, AbsoluteRect.getWidth(), btn_scroll), this);
e_scroll_top->grab();
e_scroll_top->setSubElement(true);
e_scroll_top->setTabStop(false);
//e_scroll_top->setAlignment(EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_CENTER);
//e_scroll_top->setText(items[i]->getAttributeAsStringW("label").c_str());
//e_scroll_bottom = Environment->addButton(core::rect<s32>(0, btn_h*i, AbsoluteRect.getWidth(), btn_h*(i+1)), e_root);
e_scroll_bottom = Environment->addItem(core::rect<s32>(0, AbsoluteRect.getHeight()-btn_scroll, AbsoluteRect.getWidth(), AbsoluteRect.getHeight()), this);
e_scroll_bottom->grab();
e_scroll_bottom->setSubElement(true);
e_scroll_bottom->setTabStop(false);
//e_scroll_bottom->setAlignment(EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_CENTER);
//e_scroll_bottom->setText(items[i]->getAttributeAsStringW("label").c_str());
}
// ADD WRAP PANEL
e_wrap = Environment->addStaticPanel(L"", core::rect<s32>(0,btn_scroll,AbsoluteRect.getWidth(),AbsoluteRect.getHeight()-btn_scroll), false, false, this, -1, true);
e_wrap->grab();
e_wrap->setSubElement(true);
//e_wrap->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT); // left, right, top, bottom
e_wrap->setBackgroundColor(video::SColor(255,255,255,0));
e_wrap->setDrawBackground(true);
// ADD ROOT PANEL
e_root = Environment->addStaticPanel(L"", core::rect<s32>(0,0,e_wrap->getRelativePosition().getWidth(),e_wrap->getRelativePosition().getHeight()), false, false, e_wrap, -1, true);
e_root->grab();
e_root->setSubElement(true);
//e_root->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT); // left, right, top, bottom
e_root->setBackgroundColor(video::SColor(255,255,0,255));
e_root->setDrawBackground(true);
s32 tot_h = 0;
// ADD BUTTONS
//IGUIButton *btn;
//IGUIItem *btn;
IGUIStaticPanel *btn;
for(u32 i = 0; i < items.size(); i++)
{
//btn = Environment->addButton(core::rect<s32>(0, btn_h*i, AbsoluteRect.getWidth(), btn_h*(i+1)), e_root);
//btn = Environment->addItem(core::rect<s32>(0, btn_h*i, e_wrap->getRelativePosition().getWidth(), btn_h*(i+1)), e_root);
btn = Environment->addStaticPanel(items[i]->getAttributeAsStringW("label").c_str(), core::rect<s32>(0, btn_h*i, e_wrap->getRelativePosition().getWidth(), btn_h*(i+1)), false, false, e_root, true);
btn->grab();
btn->setSubElement(true);
btn->setTabStop(false);
//btn->setAlignment(EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_CENTER);
//btn->setText(items[i]->getAttributeAsStringW("label").c_str());
buttons.push_back(btn);
tot_h += btn_h;
}
// RESIZE ROOT PANEL
if(tot_h > e_wrap->getRelativePosition().getHeight())
{
//this->setRelativePosition(core::rect<s32>(0,0,AbsoluteRect.getWidth(),tot_h));
e_root->setRelativePosition(core::rect<s32>(0,0,e_wrap->getRelativePosition().getWidth(),tot_h));
//void setRelativePosition (const core::rect< s32 > &r)
//void setRelativePosition (const core::position2di &position);
}
// RESET GLOBALS
scroll_pos = 0;
dragging_pos = 0;
}
void CGUIButtonList::handle_scroll(s32 n)
{
s32 h = e_root->getRelativePosition().getHeight();
s32 eh = e_wrap->getRelativePosition().getHeight();
//if(h > AbsoluteRect.getHeight())
if(h > eh)
{
// SCROLLABLE
scroll_pos += (n*i_scrollspeed);
if(scroll_pos > 0)
{
scroll_pos = 0;
}
else
if(scroll_pos < -(h-eh))
{
scroll_pos = -(h-eh);
}
e_root->setRelativePosition(core::position2di(0, scroll_pos));
}
else
{
// IGNORE
}
}
//! destructor
CGUIButtonList::~CGUIButtonList()
{
for(u32 i = 0; i < items.size(); i++)
{
items[i]->drop();
items[i] = NULL;
}
items.clear();
for(u32 i = 0; i < buttons.size(); i++)
{
buttons[i]->drop();
buttons[i] = NULL;
}
buttons.clear();
if(e_scroll_top)
{
e_scroll_top->drop();
e_scroll_top = NULL;
}
if(e_scroll_bottom)
{
e_scroll_bottom->drop();
e_scroll_bottom = NULL;
}
if(e_root)
{
e_root->drop();
e_root = NULL;
}
if(e_wrap)
{
e_wrap->drop();
e_wrap = NULL;
}
}
bool CGUIButtonList::OnEvent(const SEvent& event)
{
if (IsEnabled)
{
switch(event.EventType)
{
case EET_MOUSE_INPUT_EVENT:
switch(event.MouseInput.Event)
{
case EMIE_MOUSE_WHEEL:
{
handle_scroll((event.MouseInput.Wheel < 0 ? -1.f : 1.f));
}
break;
case EMIE_LMOUSE_PRESSED_DOWN:
{
if(e_wrap->isPointInside(core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y)))
{
printf("MOUSE DOWN: INSIDE\n");
dragging = 1;
dragging_pos = event.MouseInput.Y; // STORE
}
}
break;
case EMIE_MOUSE_MOVED:
{
core::position2di mpos = core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y);
if(dragging >= 1) // && e_wrap->isPointInside(mpos))
{
dragging = 2;
s32 diff = dragging_pos - mpos.Y;
scroll_pos -= diff; // UPDATE HERE
handle_scroll(0); // PASS ZERO!!
dragging_pos = mpos.Y; // STORE
}
}
break;
case EMIE_LMOUSE_LEFT_UP:
{
if(dragging == 1) // NO DRAG
{
if(e_wrap->isPointInside(core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y)))
{
IGUIElement *e = Environment->getRootGUIElement()->getElementFromPoint(core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y));
if(e && e != Environment->getRootGUIElement())
{
for(u32 i = 0; i < buttons.size(); i++)
{
if(buttons[i] == e)
{
printf("Found our button....! %d \n", i);
// STORE
last_event = i;
// SEND EVENT
SEvent e;
e.EventType = EET_GUI_EVENT;
e.GUIEvent.Caller = this;
e.GUIEvent.Element = 0;
e.GUIEvent.EventType = EGET_BUTTONLIST_CLICKED;
if ( Parent )
Parent->OnEvent(e);
// CLEAR
dragging = 0;
dragging_pos = 0;
// CLAIM THIS EVENT
return true;
//break;
}
}
}
}
}
else
if(dragging == 2) // DRAG HAPPENED
{
//printf("Dragging happened!\n");
}
// CLEAR
dragging = 0;
dragging_pos = 0;
}
break;
default:
break;
}
break;
case EET_GUI_EVENT:
if (event.GUIEvent.EventType == EGET_BUTTON_CLICKED)
{
/*
for(u32 i = 0; i < buttons.size(); i++)
{
if(event.GUIEvent.Caller == buttons[i])
{
printf("Found\n");
//virtual io::IAttributes *get_last_event();
last_event = i;
SEvent e;
e.EventType = EET_GUI_EVENT;
e.GUIEvent.Caller = this;
e.GUIEvent.Element = 0;
e.GUIEvent.EventType = EGET_BUTTONLIST_CLICKED;
if ( Parent )
Parent->OnEvent(e);
return true;
}
}
*/
// SCROLL BUTTON TESTING
if(e_scroll_top && event.GUIEvent.Caller == e_scroll_top)
{
handle_scroll(1);
return true;
}
else
if(e_scroll_bottom && event.GUIEvent.Caller == e_scroll_bottom)
{
handle_scroll(-1);
return true;
}
}
break;
default:
break;
}
}
return IGUIElement::OnEvent(event);
}
void CGUIButtonList::draw()
{
if ( !isVisible() )
return;
IGUIButtonList::draw();
}
//! Writes attributes of the element.
void CGUIButtonList::serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options) const
{
IGUIElement::serializeAttributes(out, options);
/*
out->addFloat("Min", getMin());
out->addFloat("Max", getMax());
out->addFloat("Step", getStepSize());
out->addInt("DecimalPlaces", DecimalPlaces);
*/
}
//! Reads attributes of the element
void CGUIButtonList::deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options)
{
IGUIElement::deserializeAttributes(in, options);
/*
setRange(in->getAttributeAsFloat("Min"), in->getAttributeAsFloat("Max"));
setStepSize(in->getAttributeAsFloat("Step"));
setDecimalPlaces(in->getAttributeAsInt("DecimalPlaces"));
*/
}
void CGUIButtonList::set_styles(io::IAttributes *attr, bool do_refresh)
{
attr_styles = attr;
if(attr_styles)
{
s32 id = attr_styles->findAttribute("scrollspeed");
if(id >= 0){ i_scrollspeed = attr_styles->getAttributeAsInt(id); }
}
if(do_refresh)
{
// REFRESH
refresh();
}
}
void CGUIButtonList::set_style(core::stringc key, core::stringc value, bool do_refresh)
{
//attr_styles
}
core::stringc CGUIButtonList::get_style(core::stringc key) const
{
return "";
}
void CGUIButtonList::clear_items(bool do_refresh)
{
// DELETE
for(u32 i = 0; i < items.size(); i++)
{
items[i]->drop();
items[i] = NULL;
}
items.clear();
last_event = -1;
if(do_refresh)
{
// REFRESH
refresh();
}
}
void CGUIButtonList::set_items(core::array<io::IAttributes*> new_items)
{
// DELETE OLD
clear_items(false);
// SET ITEM
items = new_items;
// REFRESH
refresh();
}
void CGUIButtonList::add_item(io::IAttributes *item, bool do_refresh)
{
if(item)
{
// ADD
items.push_back(item);
if(do_refresh)
{
// REFRESH
refresh();
}
}
}
//! Returns the item and not the button
io::IAttributes *CGUIButtonList::get_last_event()
{
if(last_event >= 0 && last_event < items.size())
{
return items[last_event];
}
return NULL;
}
} // end namespace gui
} // end namespace irr
#endif // _IRR_COMPILE_WITH_GUI_
Re: Mouse events blocked by button event
Oh, some usage:
Code: Select all
// BUTTON LIST
// =========================================================
//IGUIButtonList
btnlist = env->addButtonList(L"0", core::rect<s32>(30,100,400,100+100), true, 0, 514);
IAttributes *attr;
attr = nub->new_attr();
attr->addInt("h", 30);
//attr->addString("bg", "media/tex/stones.jpg"); // change to texture...
attr->addInt("scrollspeed", 10);
attr->addInt("show_buttons", true);
attr->addInt("button_h", 10);
btnlist->set_styles(attr);
attr = nub->new_attr();
attr->addString("label", "Yoyo");
//attr->addString("src", ""); // change to texture...
btnlist->add_item(attr);
btnlist->clear_items();
core::array<io::IAttributes*> new_items;
attr = nub->new_attr();
attr->addString("label", "One");
new_items.push_back(attr);
attr = nub->new_attr();
attr->addString("label", "Two");
new_items.push_back(attr);
attr = nub->new_attr();
attr->addString("label", "Three");
new_items.push_back(attr);
attr = nub->new_attr();
attr->addString("label", "Four");
new_items.push_back(attr);
attr = nub->new_attr();
attr->addString("label", "Five");
new_items.push_back(attr);
attr = nub->new_attr();
attr->addString("label", "Six");
new_items.push_back(attr);
attr = nub->new_attr();
attr->addString("label", "Seven");
new_items.push_back(attr);
attr = nub->new_attr();
attr->addString("label", "Eight");
new_items.push_back(attr);
btnlist->set_items(new_items);
Re: Mouse events blocked by button event
Buttons don't pass on mouse-events when they use them. But they do send a EGET_BUTTON_CLICKED in that case. Maybe you can use that?
IRC: #irrlicht on irc.libera.chat
Code snippet repository: https://github.com/mzeilfelder/irr-playground-micha
Free racer made with Irrlicht: http://www.irrgheist.com/hcraftsource.htm
Code snippet repository: https://github.com/mzeilfelder/irr-playground-micha
Free racer made with Irrlicht: http://www.irrgheist.com/hcraftsource.htm
Re: Mouse events blocked by button event
Think it'd need an EGET_BUTTON_DOWN event too!?
Re: Mouse events blocked by button event
Not tried yet but maybe EGET_ELEMENT_FOCUSED would be triggered?
Re: Mouse events blocked by button event
Focused is also triggered on tab-switches probably. Notice that button-clicks also can be triggered by <enter> and <space> keys.
Handling events like that additional to button is really tricky. Maybe Irrlicht elements need some "do not eat mouse-click events"-flag? (edit: this sounds useful and not much work, so if you want I can add that to svn-trunk) You could also cheat by adding invisible elements with same size as childs to the button - which passes events on to the button but also catches it first (yeah... ugly). Invisible element same size as buttonlist would also work - if you move the invisible element then always to the end of the child-list (but risky stuff as invisible elements can really confuse users).
On an unrelated side-note... why is your code copyright by me? :-)
Handling events like that additional to button is really tricky. Maybe Irrlicht elements need some "do not eat mouse-click events"-flag? (edit: this sounds useful and not much work, so if you want I can add that to svn-trunk) You could also cheat by adding invisible elements with same size as childs to the button - which passes events on to the button but also catches it first (yeah... ugly). Invisible element same size as buttonlist would also work - if you move the invisible element then always to the end of the child-list (but risky stuff as invisible elements can really confuse users).
On an unrelated side-note... why is your code copyright by me? :-)
IRC: #irrlicht on irc.libera.chat
Code snippet repository: https://github.com/mzeilfelder/irr-playground-micha
Free racer made with Irrlicht: http://www.irrgheist.com/hcraftsource.htm
Code snippet repository: https://github.com/mzeilfelder/irr-playground-micha
Free racer made with Irrlicht: http://www.irrgheist.com/hcraftsource.htm
Re: Mouse events blocked by button event
Mmmm, invisible panels do sound fussy and extra processing for limited usage, and that's the beauty of Irrlicht, it handles the essentials, fast... and on that note, did I mention I'm dyslexic++ and generally too mashed to know my own name
I have recently taught myself svn, but not really got into using it yet since I've been going to so many "do not eat the mouse-clique events".
Back to reality, I'll do some more tests, see if EGET_ELEMENT_FOCUSED does the trick (there's always a way in Irrlicht lol), and for that, many many thanks
I have recently taught myself svn, but not really got into using it yet since I've been going to so many "do not eat the mouse-clique events".
Back to reality, I'll do some more tests, see if EGET_ELEMENT_FOCUSED does the trick (there's always a way in Irrlicht lol), and for that, many many thanks