Commit 3d51b275 authored by bitplane's avatar bitplane

Checking for IsEnabled is now consistent across all GUI elements (bug 2003234 by CuteAlien)

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1412 dfc29bdd-3216-0410-991c-e03cc46cb475
parent f7173847
...@@ -46,6 +46,7 @@ Changes in version 1.5 (... 2008) ...@@ -46,6 +46,7 @@ Changes in version 1.5 (... 2008)
Nodes are now solid or transparent. ( but still more states are needed ) Nodes are now solid or transparent. ( but still more states are needed )
- GUI: - GUI:
- Checking IsEnabled is now consistent across all GUI elements
- Disabling the BMP loader now compiles without the built-in font - Disabling the BMP loader now compiles without the built-in font
- Added setTextAlignment to IGUIComboBox - Added setTextAlignment to IGUIComboBox
- Fixed a bug in CGUISpriteBank which caused a crash when a non-looping animated sprite reached the end of its animation. - Fixed a bug in CGUISpriteBank which caused a crash when a non-looping animated sprite reached the end of its animation.
......
...@@ -93,7 +93,7 @@ void CGUIButton::setSprite(EGUI_BUTTON_STATE state, s32 index, video::SColor col ...@@ -93,7 +93,7 @@ void CGUIButton::setSprite(EGUI_BUTTON_STATE state, s32 index, video::SColor col
bool CGUIButton::OnEvent(const SEvent& event) bool CGUIButton::OnEvent(const SEvent& event)
{ {
if (!IsEnabled) if (!IsEnabled)
return Parent ? Parent->OnEvent(event) : false; return IGUIElement::OnEvent(event);
switch(event.EventType) switch(event.EventType)
{ {
......
...@@ -119,7 +119,7 @@ bool CGUICheckBox::OnEvent(const SEvent& event) ...@@ -119,7 +119,7 @@ bool CGUICheckBox::OnEvent(const SEvent& event)
} }
} }
return Parent ? Parent->OnEvent(event) : false; return IGUIElement::OnEvent(event);
} }
......
...@@ -339,92 +339,94 @@ void CGUIColorSelectDialog::buildColorRing( const core::dimension2d<s32> & dim, ...@@ -339,92 +339,94 @@ void CGUIColorSelectDialog::buildColorRing( const core::dimension2d<s32> & dim,
//! called if an event happened. //! called if an event happened.
bool CGUIColorSelectDialog::OnEvent(const SEvent& event) bool CGUIColorSelectDialog::OnEvent(const SEvent& event)
{ {
if (IsEnabled)
switch(event.EventType)
{ {
case EET_GUI_EVENT: switch(event.EventType)
switch(event.GUIEvent.EventType)
{ {
case EGET_SCROLL_BAR_CHANGED: case EET_GUI_EVENT:
switch(event.GUIEvent.EventType)
{ {
for ( u32 i = 0; i!= Battery.size (); ++i ) case EGET_SCROLL_BAR_CHANGED:
{ {
if ( event.GUIEvent.Caller == Battery[i].Scrollbar ) for ( u32 i = 0; i!= Battery.size (); ++i )
{ {
s32 pos = Battery[i].Scrollbar->getPos (); if ( event.GUIEvent.Caller == Battery[i].Scrollbar )
s32 value = Template[i].range_down + ( pos ); {
core::stringw s ( value ); s32 pos = Battery[i].Scrollbar->getPos ();
Battery[i].Edit->setText ( s.c_str() ); s32 value = Template[i].range_down + ( pos );
core::stringw s ( value );
Battery[i].Edit->setText ( s.c_str() );
}
} }
return true;
} }
return true;
}
case EGET_ELEMENT_FOCUS_LOST: case EGET_ELEMENT_FOCUS_LOST:
Dragging = false; Dragging = false;
break; break;
case EGET_BUTTON_CLICKED: case EGET_BUTTON_CLICKED:
if (event.GUIEvent.Caller == CloseButton || if (event.GUIEvent.Caller == CloseButton ||
event.GUIEvent.Caller == CancelButton) event.GUIEvent.Caller == CancelButton)
{ {
sendCancelEvent(); sendCancelEvent();
remove(); remove();
return true; return true;
} }
else else
if (event.GUIEvent.Caller == OKButton) if (event.GUIEvent.Caller == OKButton)
{ {
sendSelectedEvent(); sendSelectedEvent();
remove(); remove();
return true; return true;
} }
break; break;
case EGET_LISTBOX_CHANGED: case EGET_LISTBOX_CHANGED:
case EGET_LISTBOX_SELECTED_AGAIN: case EGET_LISTBOX_SELECTED_AGAIN:
default: default:
break;
}
break; break;
case EET_MOUSE_INPUT_EVENT:
} switch(event.MouseInput.Event)
break;
case EET_MOUSE_INPUT_EVENT:
switch(event.MouseInput.Event)
{
case EMIE_LMOUSE_PRESSED_DOWN:
DragStart.X = event.MouseInput.X;
DragStart.Y = event.MouseInput.Y;
Dragging = true;
Environment->setFocus(this);
return true;
case EMIE_LMOUSE_LEFT_UP:
Dragging = false;
Environment->removeFocus(this);
return true;
case EMIE_MOUSE_MOVED:
if (Dragging)
{ {
// gui window should not be dragged outside its parent case EMIE_LMOUSE_PRESSED_DOWN:
if (Parent)
if (event.MouseInput.X < Parent->getAbsolutePosition().UpperLeftCorner.X +1 ||
event.MouseInput.Y < Parent->getAbsolutePosition().UpperLeftCorner.Y +1 ||
event.MouseInput.X > Parent->getAbsolutePosition().LowerRightCorner.X -1 ||
event.MouseInput.Y > Parent->getAbsolutePosition().LowerRightCorner.Y -1)
return true;
move(core::position2d<s32>(event.MouseInput.X - DragStart.X, event.MouseInput.Y - DragStart.Y));
DragStart.X = event.MouseInput.X; DragStart.X = event.MouseInput.X;
DragStart.Y = event.MouseInput.Y; DragStart.Y = event.MouseInput.Y;
Dragging = true;
Environment->setFocus(this);
return true; return true;
case EMIE_LMOUSE_LEFT_UP:
Dragging = false;
Environment->removeFocus(this);
return true;
case EMIE_MOUSE_MOVED:
if (Dragging)
{
// gui window should not be dragged outside its parent
if (Parent)
if (event.MouseInput.X < Parent->getAbsolutePosition().UpperLeftCorner.X +1 ||
event.MouseInput.Y < Parent->getAbsolutePosition().UpperLeftCorner.Y +1 ||
event.MouseInput.X > Parent->getAbsolutePosition().LowerRightCorner.X -1 ||
event.MouseInput.Y > Parent->getAbsolutePosition().LowerRightCorner.Y -1)
return true;
move(core::position2d<s32>(event.MouseInput.X - DragStart.X, event.MouseInput.Y - DragStart.Y));
DragStart.X = event.MouseInput.X;
DragStart.Y = event.MouseInput.Y;
return true;
}
default:
break;
} }
default: default:
break; break;
} }
default:
break;
} }
return Parent ? Parent->OnEvent(event) : false; return IGUIElement::OnEvent(event);
} }
......
...@@ -161,132 +161,52 @@ void CGUIComboBox::setSelected(s32 idx) ...@@ -161,132 +161,52 @@ void CGUIComboBox::setSelected(s32 idx)
//! called if an event happened. //! called if an event happened.
bool CGUIComboBox::OnEvent(const SEvent& event) bool CGUIComboBox::OnEvent(const SEvent& event)
{ {
switch(event.EventType) if (IsEnabled)
{ {
switch(event.EventType)
case EET_KEY_INPUT_EVENT:
if (ListBox && event.KeyInput.PressedDown && event.KeyInput.Key == KEY_ESCAPE)
{
// hide list box
openCloseMenu();
return true;
}
else
if (event.KeyInput.Key == KEY_RETURN || event.KeyInput.Key == KEY_SPACE)
{ {
if (!event.KeyInput.PressedDown)
openCloseMenu();
ListButton->setPressed(ListBox == 0); case EET_KEY_INPUT_EVENT:
if (ListBox && event.KeyInput.PressedDown && event.KeyInput.Key == KEY_ESCAPE)
return true;
}
else
if (event.KeyInput.PressedDown)
{
s32 oldSelected = Selected;
bool absorb = true;
switch (event.KeyInput.Key)
{
case KEY_DOWN:
setSelected(Selected+1);
break;
case KEY_UP:
setSelected(Selected-1);
break;
case KEY_HOME:
case KEY_PRIOR:
setSelected(0);
break;
case KEY_END:
case KEY_NEXT:
setSelected((s32)Items.size()-1);
break;
default:
absorb = false;
}
if (Selected <0)
setSelected(0);
if (Selected >= (s32)Items.size())
setSelected((s32)Items.size() -1);
if (Selected != oldSelected)
sendSelectionChangedEvent();
if (absorb)
return true;
}
break;
case EET_GUI_EVENT:
switch(event.GUIEvent.EventType)
{
case EGET_ELEMENT_FOCUS_LOST:
if (ListBox &&
(Environment->hasFocus(ListBox) || ListBox->isMyChild(event.GUIEvent.Caller) ) &&
event.GUIEvent.Element != this &&
event.GUIEvent.Element != ListButton &&
event.GUIEvent.Element != ListBox &&
!ListBox->isMyChild(event.GUIEvent.Element))
{
openCloseMenu();
}
break;
case EGET_BUTTON_CLICKED:
if (event.GUIEvent.Caller == ListButton)
{ {
// hide list box
openCloseMenu(); openCloseMenu();
return true; return true;
} }
break; else
case EGET_LISTBOX_SELECTED_AGAIN: if (event.KeyInput.Key == KEY_RETURN || event.KeyInput.Key == KEY_SPACE)
case EGET_LISTBOX_CHANGED:
if (event.GUIEvent.Caller == ListBox)
{ {
setSelected(ListBox->getSelected()); if (!event.KeyInput.PressedDown)
if (Selected <0 || Selected >= (s32)Items.size()) openCloseMenu();
setSelected(-1);
openCloseMenu();
sendSelectionChangedEvent();
}
return true;
default:
break;
}
break;
case EET_MOUSE_INPUT_EVENT:
switch(event.MouseInput.Event)
{
case EMIE_LMOUSE_PRESSED_DOWN:
{
core::position2d<s32> p(event.MouseInput.X, event.MouseInput.Y);
// send to list box
if (ListBox && ListBox->isPointInside(p) && ListBox->OnEvent(event))
return true;
return true; ListButton->setPressed(ListBox == 0);
}
case EMIE_LMOUSE_LEFT_UP:
{
core::position2d<s32> p(event.MouseInput.X, event.MouseInput.Y);
// send to list box
if (!(ListBox &&
ListBox->getAbsolutePosition().isPointInside(p) &&
ListBox->OnEvent(event)))
openCloseMenu();
return true; return true;
} }
case EMIE_MOUSE_WHEEL: else
if (event.KeyInput.PressedDown)
{ {
s32 oldSelected = Selected; s32 oldSelected = Selected;
setSelected( Selected +(event.MouseInput.Wheel < 0) ? 1 : -1); bool absorb = true;
switch (event.KeyInput.Key)
{
case KEY_DOWN:
setSelected(Selected+1);
break;
case KEY_UP:
setSelected(Selected-1);
break;
case KEY_HOME:
case KEY_PRIOR:
setSelected(0);
break;
case KEY_END:
case KEY_NEXT:
setSelected((s32)Items.size()-1);
break;
default:
absorb = false;
}
if (Selected <0) if (Selected <0)
setSelected(0); setSelected(0);
...@@ -296,16 +216,99 @@ bool CGUIComboBox::OnEvent(const SEvent& event) ...@@ -296,16 +216,99 @@ bool CGUIComboBox::OnEvent(const SEvent& event)
if (Selected != oldSelected) if (Selected != oldSelected)
sendSelectionChangedEvent(); sendSelectionChangedEvent();
if (absorb)
return true;
}
break;
case EET_GUI_EVENT:
switch(event.GUIEvent.EventType)
{
case EGET_ELEMENT_FOCUS_LOST:
if (ListBox &&
(Environment->hasFocus(ListBox) || ListBox->isMyChild(event.GUIEvent.Caller) ) &&
event.GUIEvent.Element != this &&
event.GUIEvent.Element != ListButton &&
event.GUIEvent.Element != ListBox &&
!ListBox->isMyChild(event.GUIEvent.Element))
{
openCloseMenu();
}
break;
case EGET_BUTTON_CLICKED:
if (event.GUIEvent.Caller == ListButton)
{
openCloseMenu();
return true;
}
break;
case EGET_LISTBOX_SELECTED_AGAIN:
case EGET_LISTBOX_CHANGED:
if (event.GUIEvent.Caller == ListBox)
{
setSelected(ListBox->getSelected());
if (Selected <0 || Selected >= (s32)Items.size())
setSelected(-1);
openCloseMenu();
sendSelectionChangedEvent();
}
return true;
default:
break;
} }
break;
case EET_MOUSE_INPUT_EVENT:
switch(event.MouseInput.Event)
{
case EMIE_LMOUSE_PRESSED_DOWN:
{
core::position2d<s32> p(event.MouseInput.X, event.MouseInput.Y);
// send to list box
if (ListBox && ListBox->isPointInside(p) && ListBox->OnEvent(event))
return true;
return true;
}
case EMIE_LMOUSE_LEFT_UP:
{
core::position2d<s32> p(event.MouseInput.X, event.MouseInput.Y);
// send to list box
if (!(ListBox &&
ListBox->getAbsolutePosition().isPointInside(p) &&
ListBox->OnEvent(event)))
openCloseMenu();
return true;
}
case EMIE_MOUSE_WHEEL:
{
s32 oldSelected = Selected;
setSelected( Selected +(event.MouseInput.Wheel < 0) ? 1 : -1);
if (Selected <0)
setSelected(0);
if (Selected >= (s32)Items.size())
setSelected((s32)Items.size() -1);
if (Selected != oldSelected)
sendSelectionChangedEvent();
}
default:
break;
}
break;
default: default:
break; break;
} }
break;
default:
break;
} }
return Parent ? Parent->OnEvent(event) : false; return IGUIElement::OnEvent(event);
} }
......
...@@ -218,61 +218,62 @@ void CGUIContextMenu::removeAllItems() ...@@ -218,61 +218,62 @@ void CGUIContextMenu::removeAllItems()
//! called if an event happened. //! called if an event happened.
bool CGUIContextMenu::OnEvent(const SEvent& event) bool CGUIContextMenu::OnEvent(const SEvent& event)
{ {
if (!IsEnabled) if (IsEnabled)
return Parent ? Parent->OnEvent(event) : false;
switch(event.EventType)
{ {
case EET_GUI_EVENT:
switch(event.GUIEvent.EventType) switch(event.EventType)
{ {
case EGET_ELEMENT_FOCUS_LOST: case EET_GUI_EVENT:
if (event.GUIEvent.Caller == this && !isMyChild(event.GUIEvent.Element) && AllowFocus) switch(event.GUIEvent.EventType)
{ {
// set event parent of submenus case EGET_ELEMENT_FOCUS_LOST:
setEventParent(Parent); if (event.GUIEvent.Caller == this && !isMyChild(event.GUIEvent.Element) && AllowFocus)
remove(); {
return false; // set event parent of submenus
setEventParent(Parent);
remove();
return false;
}
break;
case EGET_ELEMENT_FOCUSED:
if (event.GUIEvent.Caller == this && !AllowFocus)
{
return true;
}
break;
default:
break;
} }
break; break;
case EGET_ELEMENT_FOCUSED: case EET_MOUSE_INPUT_EVENT:
if (event.GUIEvent.Caller == this && !AllowFocus) switch(event.MouseInput.Event)
{ {
case EMIE_LMOUSE_LEFT_UP:
{
// menu might be removed if it loses focus in sendClick, so grab a reference
grab();
const u32 t = sendClick(core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y));
if ((t==0 || t==1) && Environment->hasFocus(this))
Environment->removeFocus(this);
drop();
}
return true;
case EMIE_LMOUSE_PRESSED_DOWN:
return true;
case EMIE_MOUSE_MOVED:
if (Environment->hasFocus(this))
highlight(core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y), true);
return true; return true;
default:
break;
} }
break; break;
default: default:
break; break;
}
break;
case EET_MOUSE_INPUT_EVENT:
switch(event.MouseInput.Event)
{
case EMIE_LMOUSE_LEFT_UP:
{
// menu might be removed if it loses focus in sendClick, so grab a reference
grab();
const u32 t = sendClick(core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y));
if ((t==0 || t==1) && Environment->hasFocus(this))
Environment->removeFocus(this);
drop();
}
return true;
case EMIE_LMOUSE_PRESSED_DOWN:
return true;
case EMIE_MOUSE_MOVED:
if (Environment->hasFocus(this))
highlight(core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y), true);
return true;
default:
break;
} }
break;
default:
break;
} }
return Parent ? Parent->OnEvent(event) : false; return IGUIElement::OnEvent(event);
} }
......
...@@ -187,32 +187,36 @@ void CGUIEditBox::setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT ver ...@@ -187,32 +187,36 @@ void CGUIEditBox::setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT ver
//! called if an event happened. //! called if an event happened.
bool CGUIEditBox::OnEvent(const SEvent& event) bool CGUIEditBox::OnEvent(const SEvent& event)
{ {
switch(event.EventType) if (IsEnabled)
{ {
case EET_GUI_EVENT:
if (event.GUIEvent.EventType == EGET_ELEMENT_FOCUS_LOST) switch(event.EventType)
{ {
if (event.GUIEvent.Caller == this) case EET_GUI_EVENT:
if (event.GUIEvent.EventType == EGET_ELEMENT_FOCUS_LOST)
{ {
MouseMarking = false; if (event.GUIEvent.Caller == this)
MarkBegin = 0; {
MarkEnd = 0; MouseMarking = false;
MarkBegin = 0;
MarkEnd = 0;
}
} }
break;
case EET_KEY_INPUT_EVENT:
if (processKey(event))
return true;
break;
case EET_MOUSE_INPUT_EVENT:
if (processMouse(event))
return true;
break;
default:
break;
} }
break;
case EET_KEY_INPUT_EVENT:
if (processKey(event))
return true;
break;
case EET_MOUSE_INPUT_EVENT:
if (processMouse(event))
return true;
break;
default:
break;
} }
return Parent ? Parent->OnEvent(event) : false; return IGUIElement::OnEvent(event);
} }
......
...@@ -136,107 +136,110 @@ const wchar_t* CGUIFileOpenDialog::getFileName() const ...@@ -136,107 +136,110 @@ const wchar_t* CGUIFileOpenDialog::getFileName() const
//! called if an event happened. //! called if an event happened.
bool CGUIFileOpenDialog::OnEvent(const SEvent& event) bool CGUIFileOpenDialog::OnEvent(const SEvent& event)
{ {
switch(event.EventType) if (IsEnabled)
{ {
case EET_GUI_EVENT: switch(event.EventType)
switch(event.GUIEvent.EventType)
{ {
case EGET_ELEMENT_FOCUS_LOST: case EET_GUI_EVENT:
Dragging = false; switch(event.GUIEvent.EventType)
break;
case EGET_BUTTON_CLICKED:
if (event.GUIEvent.Caller == CloseButton ||
event.GUIEvent.Caller == CancelButton)
{
sendCancelEvent();
remove();
return true;
}
else
if (event.GUIEvent.Caller == OKButton && FileName != L"")
{
sendSelectedEvent();
remove();
return true;
}
break;
case EGET_LISTBOX_CHANGED:
{ {
s32 selected = FileBox->getSelected(); case EGET_ELEMENT_FOCUS_LOST:
if (FileList && FileSystem) Dragging = false;
break;
case EGET_BUTTON_CLICKED:
if (event.GUIEvent.Caller == CloseButton ||
event.GUIEvent.Caller == CancelButton)
{ {
if (FileList->isDirectory(selected)) sendCancelEvent();
FileName = L""; remove();
else return true;
FileName = FileList->getFullFileName(selected);
} }
} else
break; if (event.GUIEvent.Caller == OKButton && FileName != L"")
{
sendSelectedEvent();
remove();
return true;
}
break;
case EGET_LISTBOX_SELECTED_AGAIN: case EGET_LISTBOX_CHANGED:
{
const s32 selected = FileBox->getSelected();
if (FileList && FileSystem)
{ {
if (FileList->isDirectory(selected)) s32 selected = FileBox->getSelected();
if (FileList && FileSystem)
{ {
FileSystem->changeWorkingDirectoryTo(FileList->getFileName(selected)); if (FileList->isDirectory(selected))
fillListBox(); FileName = L"";
FileName = L""; else
FileName = FileList->getFullFileName(selected);
} }
else }
break;
case EGET_LISTBOX_SELECTED_AGAIN:
{
const s32 selected = FileBox->getSelected();
if (FileList && FileSystem)
{ {
FileName = FileList->getFullFileName(selected); if (FileList->isDirectory(selected))
return true; {
FileSystem->changeWorkingDirectoryTo(FileList->getFileName(selected));
fillListBox();
FileName = L"";
}
else
{
FileName = FileList->getFullFileName(selected);
return true;
}
} }
} }
break;
default:
break;
} }
break; break;
default: case EET_MOUSE_INPUT_EVENT:
break; switch(event.MouseInput.Event)
}
break;
case EET_MOUSE_INPUT_EVENT:
switch(event.MouseInput.Event)
{
case EMIE_MOUSE_WHEEL:
return FileBox->OnEvent(event);
case EMIE_LMOUSE_PRESSED_DOWN:
DragStart.X = event.MouseInput.X;
DragStart.Y = event.MouseInput.Y;
Dragging = true;
Environment->setFocus(this);
return true;
case EMIE_LMOUSE_LEFT_UP:
Dragging = false;
return true;
case EMIE_MOUSE_MOVED:
if (Dragging)
{ {
// gui window should not be dragged outside its parent case EMIE_MOUSE_WHEEL:
if (Parent) return FileBox->OnEvent(event);
if (event.MouseInput.X < Parent->getAbsolutePosition().UpperLeftCorner.X +1 || case EMIE_LMOUSE_PRESSED_DOWN:
event.MouseInput.Y < Parent->getAbsolutePosition().UpperLeftCorner.Y +1 ||
event.MouseInput.X > Parent->getAbsolutePosition().LowerRightCorner.X -1 ||
event.MouseInput.Y > Parent->getAbsolutePosition().LowerRightCorner.Y -1)
return true;
move(core::position2d<s32>(event.MouseInput.X - DragStart.X, event.MouseInput.Y - DragStart.Y));
DragStart.X = event.MouseInput.X; DragStart.X = event.MouseInput.X;
DragStart.Y = event.MouseInput.Y; DragStart.Y = event.MouseInput.Y;
Dragging = true;
Environment->setFocus(this);
return true;
case EMIE_LMOUSE_LEFT_UP:
Dragging = false;
return true; return true;
case EMIE_MOUSE_MOVED:
if (Dragging)
{
// gui window should not be dragged outside its parent
if (Parent)
if (event.MouseInput.X < Parent->getAbsolutePosition().UpperLeftCorner.X +1 ||
event.MouseInput.Y < Parent->getAbsolutePosition().UpperLeftCorner.Y +1 ||
event.MouseInput.X > Parent->getAbsolutePosition().LowerRightCorner.X -1 ||
event.MouseInput.Y > Parent->getAbsolutePosition().LowerRightCorner.Y -1)
return true;
move(core::position2d<s32>(event.MouseInput.X - DragStart.X, event.MouseInput.Y - DragStart.Y));
DragStart.X = event.MouseInput.X;
DragStart.Y = event.MouseInput.Y;
return true;
}
break;
default:
break;
} }
break;
default: default:
break; break;
} }
default:
break;
} }
return Parent ? Parent->OnEvent(event) : false; return IGUIElement::OnEvent(event);
} }
......
This diff is collapsed.
...@@ -99,72 +99,73 @@ void CGUIMenu::draw() ...@@ -99,72 +99,73 @@ void CGUIMenu::draw()
//! called if an event happened. //! called if an event happened.
bool CGUIMenu::OnEvent(const SEvent& event) bool CGUIMenu::OnEvent(const SEvent& event)
{ {
if (!IsEnabled) if (IsEnabled)
return Parent ? Parent->OnEvent(event) : false;
switch(event.EventType)
{ {
case EET_GUI_EVENT:
switch(event.GUIEvent.EventType) switch(event.EventType)
{ {
case gui::EGET_ELEMENT_FOCUS_LOST: case EET_GUI_EVENT:
if (event.GUIEvent.Caller == this && !isMyChild(event.GUIEvent.Element)) switch(event.GUIEvent.EventType)
{ {
closeAllSubMenus(); case gui::EGET_ELEMENT_FOCUS_LOST:
HighLighted = -1; if (event.GUIEvent.Caller == this && !isMyChild(event.GUIEvent.Element))
{
closeAllSubMenus();
HighLighted = -1;
}
break;
case gui::EGET_ELEMENT_FOCUSED:
if (event.GUIEvent.Caller == this && Parent)
{
Parent->bringToFront(this);
}
break;
default:
break;
} }
break; break;
case gui::EGET_ELEMENT_FOCUSED: case EET_MOUSE_INPUT_EVENT:
if (event.GUIEvent.Caller == this && Parent) switch(event.MouseInput.Event)
{ {
Parent->bringToFront(this); case EMIE_LMOUSE_PRESSED_DOWN:
}
break;
default:
break;
}
break;
case EET_MOUSE_INPUT_EVENT:
switch(event.MouseInput.Event)
{
case EMIE_LMOUSE_PRESSED_DOWN:
{
if (!Environment->hasFocus(this))
{ {
Environment->setFocus(this); if (!Environment->hasFocus(this))
{
Environment->setFocus(this);
}
if (Parent)
Parent->bringToFront(this);
core::position2d<s32> p(event.MouseInput.X, event.MouseInput.Y);
bool shouldCloseSubMenu = hasOpenSubMenu();
if (!AbsoluteClippingRect.isPointInside(p))
{
shouldCloseSubMenu = false;
s32 t = sendClick(p);
if ((t==0 || t==1) && Environment->hasFocus(this))
Environment->removeFocus(this);
}
highlight(core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y), true);
if ( shouldCloseSubMenu )
closeAllSubMenus();
return true;
} }
case EMIE_MOUSE_MOVED:
if (Parent) if (Environment->hasFocus(this))
Parent->bringToFront(this); highlight(core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y), hasOpenSubMenu());
return true;
core::position2d<s32> p(event.MouseInput.X, event.MouseInput.Y); default:
bool shouldCloseSubMenu = hasOpenSubMenu(); break;
if (!AbsoluteClippingRect.isPointInside(p))
{
shouldCloseSubMenu = false;
s32 t = sendClick(p);
if ((t==0 || t==1) && Environment->hasFocus(this))
Environment->removeFocus(this);
} }
highlight(core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y), true); break;
if ( shouldCloseSubMenu )
closeAllSubMenus();
return true;
}
case EMIE_MOUSE_MOVED:
if (Environment->hasFocus(this))
highlight(core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y), hasOpenSubMenu());
return true;
default: default:
break; break;
} }
break;
default:
break;
} }
return Parent ? Parent->OnEvent(event) : false; return IGUIElement::OnEvent(event);
} }
......
...@@ -83,7 +83,7 @@ const video::SMaterial& CGUIMeshViewer::getMaterial() const ...@@ -83,7 +83,7 @@ const video::SMaterial& CGUIMeshViewer::getMaterial() const
//! called if an event happened. //! called if an event happened.
bool CGUIMeshViewer::OnEvent(const SEvent& event) bool CGUIMeshViewer::OnEvent(const SEvent& event)
{ {
return Parent ? Parent->OnEvent(event) : false; return IGUIElement::OnEvent(event);
} }
......
...@@ -254,141 +254,144 @@ void CGUIMessageBox::refreshControls() ...@@ -254,141 +254,144 @@ void CGUIMessageBox::refreshControls()
//! called if an event happened. //! called if an event happened.
bool CGUIMessageBox::OnEvent(const SEvent& event) bool CGUIMessageBox::OnEvent(const SEvent& event)
{ {
SEvent outevent; if (IsEnabled)
outevent.EventType = EET_GUI_EVENT;
outevent.GUIEvent.Caller = this;
outevent.GUIEvent.Element = 0;
switch(event.EventType)
{ {
case EET_KEY_INPUT_EVENT: SEvent outevent;
outevent.EventType = EET_GUI_EVENT;
outevent.GUIEvent.Caller = this;
outevent.GUIEvent.Element = 0;
if (event.KeyInput.PressedDown) switch(event.EventType)
{ {
switch (event.KeyInput.Key) case EET_KEY_INPUT_EVENT:
if (event.KeyInput.PressedDown)
{ {
case KEY_RETURN: switch (event.KeyInput.Key)
if (OkButton)
{
OkButton->setPressed(true);
Pressed = true;
}
break;
case KEY_KEY_Y:
if (YesButton)
{ {
YesButton->setPressed(true); case KEY_RETURN:
Pressed = true; if (OkButton)
{
OkButton->setPressed(true);
Pressed = true;
}
break;
case KEY_KEY_Y:
if (YesButton)
{
YesButton->setPressed(true);
Pressed = true;
}
break;
case KEY_KEY_N:
if (NoButton)
{
NoButton->setPressed(true);
Pressed = true;
}
break;
case KEY_ESCAPE:
if (Pressed)
{
// cancel press
if (OkButton) OkButton->setPressed(false);
if (YesButton) OkButton->setPressed(false);
if (NoButton) OkButton->setPressed(false);
Pressed = false;
}
else
if (CancelButton)
{
CancelButton->setPressed(true);
Pressed = true;
}
else
if (CloseButton && CloseButton->isVisible())
{
CloseButton->setPressed(true);
Pressed = true;
}
break;
default: // no other key is handled here
break;
} }
break; }
case KEY_KEY_N: else
if (NoButton) if (Pressed)
{
if (OkButton && event.KeyInput.Key == KEY_RETURN)
{ {
NoButton->setPressed(true); outevent.GUIEvent.EventType = EGET_MESSAGEBOX_OK;
Pressed = true; Parent->OnEvent(outevent);
remove();
return true;
} }
break; else
case KEY_ESCAPE: if ((CancelButton || CloseButton) && event.KeyInput.Key == KEY_ESCAPE)
if (Pressed)
{ {
// cancel press outevent.GUIEvent.EventType = EGET_MESSAGEBOX_CANCEL;
if (OkButton) OkButton->setPressed(false); Parent->OnEvent(outevent);
if (YesButton) OkButton->setPressed(false); remove();
if (NoButton) OkButton->setPressed(false); return true;
Pressed = false;
} }
else else
if (CancelButton) if (YesButton && event.KeyInput.Key == KEY_KEY_Y)
{ {
CancelButton->setPressed(true); outevent.GUIEvent.EventType = EGET_MESSAGEBOX_YES;
Pressed = true; Parent->OnEvent(outevent);
remove();
return true;
} }
else else
if (CloseButton && CloseButton->isVisible()) if (NoButton && event.KeyInput.Key == KEY_KEY_N)
{ {
CloseButton->setPressed(true); outevent.GUIEvent.EventType = EGET_MESSAGEBOX_NO;
Pressed = true; Parent->OnEvent(outevent);
remove();
return true;
} }
break;
default: // no other key is handled here
break;
}
}
else
if (Pressed)
{
if (OkButton && event.KeyInput.Key == KEY_RETURN)
{
outevent.GUIEvent.EventType = EGET_MESSAGEBOX_OK;
Parent->OnEvent(outevent);
remove();
return true;
}
else
if ((CancelButton || CloseButton) && event.KeyInput.Key == KEY_ESCAPE)
{
outevent.GUIEvent.EventType = EGET_MESSAGEBOX_CANCEL;
Parent->OnEvent(outevent);
remove();
return true;
}
else
if (YesButton && event.KeyInput.Key == KEY_KEY_Y)
{
outevent.GUIEvent.EventType = EGET_MESSAGEBOX_YES;
Parent->OnEvent(outevent);
remove();
return true;
}
else
if (NoButton && event.KeyInput.Key == KEY_KEY_N)
{
outevent.GUIEvent.EventType = EGET_MESSAGEBOX_NO;
Parent->OnEvent(outevent);
remove();
return true;
} }
} break;
break; case EET_GUI_EVENT:
case EET_GUI_EVENT: if (event.GUIEvent.EventType == EGET_BUTTON_CLICKED)
if (event.GUIEvent.EventType == EGET_BUTTON_CLICKED)
{
if (event.GUIEvent.Caller == OkButton)
{
outevent.GUIEvent.EventType = EGET_MESSAGEBOX_OK;
Parent->OnEvent(outevent);
remove();
return true;
}
else
if (event.GUIEvent.Caller == CancelButton ||
event.GUIEvent.Caller == CloseButton)
{
outevent.GUIEvent.EventType = EGET_MESSAGEBOX_CANCEL;
Parent->OnEvent(outevent);
remove();
return true;
}
else
if (event.GUIEvent.Caller == YesButton)
{
outevent.GUIEvent.EventType = EGET_MESSAGEBOX_YES;
Parent->OnEvent(outevent);
remove();
return true;
}
else
if (event.GUIEvent.Caller == NoButton)
{ {
outevent.GUIEvent.EventType = EGET_MESSAGEBOX_NO; if (event.GUIEvent.Caller == OkButton)
Parent->OnEvent(outevent); {
remove(); outevent.GUIEvent.EventType = EGET_MESSAGEBOX_OK;
return true; Parent->OnEvent(outevent);
remove();
return true;
}
else
if (event.GUIEvent.Caller == CancelButton ||
event.GUIEvent.Caller == CloseButton)
{
outevent.GUIEvent.EventType = EGET_MESSAGEBOX_CANCEL;
Parent->OnEvent(outevent);
remove();
return true;
}
else
if (event.GUIEvent.Caller == YesButton)
{
outevent.GUIEvent.EventType = EGET_MESSAGEBOX_YES;
Parent->OnEvent(outevent);
remove();
return true;
}
else
if (event.GUIEvent.Caller == NoButton)
{
outevent.GUIEvent.EventType = EGET_MESSAGEBOX_NO;
Parent->OnEvent(outevent);
remove();
return true;
}
} }
break;
default:
break;
} }
break;
default:
break;
} }
return CGUIWindow::OnEvent(event); return CGUIWindow::OnEvent(event);
......
...@@ -59,157 +59,161 @@ CGUIScrollBar::~CGUIScrollBar() ...@@ -59,157 +59,161 @@ CGUIScrollBar::~CGUIScrollBar()
//! called if an event happened. //! called if an event happened.
bool CGUIScrollBar::OnEvent(const SEvent& event) bool CGUIScrollBar::OnEvent(const SEvent& event)
{ {
switch(event.EventType) if (IsEnabled)
{ {
case EET_KEY_INPUT_EVENT:
if (event.KeyInput.PressedDown) switch(event.EventType)
{ {
const s32 oldPos = Pos; case EET_KEY_INPUT_EVENT:
bool absorb = true; if (event.KeyInput.PressedDown)
switch (event.KeyInput.Key)
{ {
case KEY_LEFT: const s32 oldPos = Pos;
case KEY_UP: bool absorb = true;
setPos(Pos-SmallStep); switch (event.KeyInput.Key)
break; {
case KEY_RIGHT: case KEY_LEFT:
case KEY_DOWN: case KEY_UP:
setPos(Pos+SmallStep); setPos(Pos-SmallStep);
break; break;
case KEY_HOME: case KEY_RIGHT:
setPos(0); case KEY_DOWN:
break; setPos(Pos+SmallStep);
case KEY_PRIOR: break;
setPos(Pos-LargeStep); case KEY_HOME:
break; setPos(0);
case KEY_END: break;
setPos(Max); case KEY_PRIOR:
break; setPos(Pos-LargeStep);
case KEY_NEXT: break;
setPos(Pos+LargeStep); case KEY_END:
break; setPos(Max);
default: break;
absorb = false; case KEY_NEXT:
} setPos(Pos+LargeStep);
break;
default:
absorb = false;
}
if (Pos != oldPos) if (Pos != oldPos)
{ {
SEvent newEvent; SEvent newEvent;
newEvent.EventType = EET_GUI_EVENT; newEvent.EventType = EET_GUI_EVENT;
newEvent.GUIEvent.Caller = this; newEvent.GUIEvent.Caller = this;
newEvent.GUIEvent.Element = 0; newEvent.GUIEvent.Element = 0;
newEvent.GUIEvent.EventType = EGET_SCROLL_BAR_CHANGED; newEvent.GUIEvent.EventType = EGET_SCROLL_BAR_CHANGED;
Parent->OnEvent(newEvent); Parent->OnEvent(newEvent);
}
if (absorb)
return true;
} }
if (absorb) break;
return true; case EET_GUI_EVENT:
} if (event.GUIEvent.EventType == EGET_BUTTON_CLICKED)
break; {
case EET_GUI_EVENT: if (event.GUIEvent.Caller == UpButton)
if (event.GUIEvent.EventType == EGET_BUTTON_CLICKED) setPos(Pos-SmallStep);
{ else
if (event.GUIEvent.Caller == UpButton) if (event.GUIEvent.Caller == DownButton)
setPos(Pos-SmallStep); setPos(Pos+SmallStep);
else
if (event.GUIEvent.Caller == DownButton)
setPos(Pos+SmallStep);
SEvent newEvent;
newEvent.EventType = EET_GUI_EVENT;
newEvent.GUIEvent.Caller = this;
newEvent.GUIEvent.Element = 0;
newEvent.GUIEvent.EventType = EGET_SCROLL_BAR_CHANGED;
Parent->OnEvent(newEvent);
return true;
}
else
if (event.GUIEvent.EventType == EGET_ELEMENT_FOCUS_LOST)
{
if (event.GUIEvent.Caller == this)
Dragging = false;
}
break;
case EET_MOUSE_INPUT_EVENT:
switch(event.MouseInput.Event)
{
case EMIE_MOUSE_WHEEL:
if (Environment->hasFocus(this))
{ // thanks to a bug report by REAPER
setPos(getPos() + (s32)event.MouseInput.Wheel* -SmallStep);
SEvent newEvent; SEvent newEvent;
newEvent.EventType = EET_GUI_EVENT; newEvent.EventType = EET_GUI_EVENT;
newEvent.GUIEvent.Caller = this; newEvent.GUIEvent.Caller = this;
newEvent.GUIEvent.Element = 0; newEvent.GUIEvent.Element = 0;
newEvent.GUIEvent.EventType = EGET_SCROLL_BAR_CHANGED; newEvent.GUIEvent.EventType = EGET_SCROLL_BAR_CHANGED;
Parent->OnEvent(newEvent); Parent->OnEvent(newEvent);
return true; return true;
} }
break; else
case EMIE_LMOUSE_PRESSED_DOWN: if (event.GUIEvent.EventType == EGET_ELEMENT_FOCUS_LOST)
{
if (AbsoluteClippingRect.isPointInside(core::position2di(event.MouseInput.X, event.MouseInput.Y)))
{ {
Dragging = true; if (event.GUIEvent.Caller == this)
DraggedBySlider = SliderRect.isPointInside(core::position2di(event.MouseInput.X, event.MouseInput.Y)); Dragging = false;
TrayClick = !DraggedBySlider;
DesiredPos = getPosFromMousePos(event.MouseInput.X, event.MouseInput.Y);
return true;
} }
break; break;
} case EET_MOUSE_INPUT_EVENT:
case EMIE_LMOUSE_LEFT_UP: switch(event.MouseInput.Event)
case EMIE_MOUSE_MOVED:
if (Dragging)
{ {
if (event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP) case EMIE_MOUSE_WHEEL:
Dragging = false; if (Environment->hasFocus(this))
{ // thanks to a bug report by REAPER
setPos(getPos() + (s32)event.MouseInput.Wheel* -SmallStep);
SEvent newEvent;
newEvent.EventType = EET_GUI_EVENT;
newEvent.GUIEvent.Caller = this;
newEvent.GUIEvent.Element = 0;
newEvent.GUIEvent.EventType = EGET_SCROLL_BAR_CHANGED;
Parent->OnEvent(newEvent);
return true;
}
break;
case EMIE_LMOUSE_PRESSED_DOWN:
{
if (AbsoluteClippingRect.isPointInside(core::position2di(event.MouseInput.X, event.MouseInput.Y)))
{
Dragging = true;
DraggedBySlider = SliderRect.isPointInside(core::position2di(event.MouseInput.X, event.MouseInput.Y));
TrayClick = !DraggedBySlider;
DesiredPos = getPosFromMousePos(event.MouseInput.X, event.MouseInput.Y);
return true;
}
break;
}
case EMIE_LMOUSE_LEFT_UP:
case EMIE_MOUSE_MOVED:
if (Dragging)
{
if (event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP)
Dragging = false;
const s32 newPos = getPosFromMousePos(event.MouseInput.X, event.MouseInput.Y); const s32 newPos = getPosFromMousePos(event.MouseInput.X, event.MouseInput.Y);
const s32 oldPos = Pos; const s32 oldPos = Pos;
if (!DraggedBySlider) if (!DraggedBySlider)
{ {
if (AbsoluteClippingRect.isPointInside(core::position2di(event.MouseInput.X, event.MouseInput.Y))) if (AbsoluteClippingRect.isPointInside(core::position2di(event.MouseInput.X, event.MouseInput.Y)))
{
DraggedBySlider = SliderRect.isPointInside(core::position2di(event.MouseInput.X, event.MouseInput.Y));
TrayClick = !DraggedBySlider;
}
else
{
TrayClick = false;
if (event.MouseInput.Event == EMIE_MOUSE_MOVED)
return true;
}
}
if (DraggedBySlider)
{ {
DraggedBySlider = SliderRect.isPointInside(core::position2di(event.MouseInput.X, event.MouseInput.Y)); setPos(newPos);
TrayClick = !DraggedBySlider;
} }
else else
{ {
TrayClick = false; DesiredPos = newPos;
if (event.MouseInput.Event == EMIE_MOUSE_MOVED)
return true;
} }
}
if (DraggedBySlider)
{
setPos(newPos);
}
else
{
DesiredPos = newPos;
}
if (Pos != oldPos && Parent) if (Pos != oldPos && Parent)
{ {
SEvent newEvent; SEvent newEvent;
newEvent.EventType = EET_GUI_EVENT; newEvent.EventType = EET_GUI_EVENT;
newEvent.GUIEvent.Caller = this; newEvent.GUIEvent.Caller = this;
newEvent.GUIEvent.Element = 0; newEvent.GUIEvent.Element = 0;
newEvent.GUIEvent.EventType = EGET_SCROLL_BAR_CHANGED; newEvent.GUIEvent.EventType = EGET_SCROLL_BAR_CHANGED;
Parent->OnEvent(newEvent); Parent->OnEvent(newEvent);
}
return true;
} }
return true; break;
default:
break;
} }
break; break;
default: default:
break; break;
} }
break;
default:
break;
} }
return IGUIElement::OnEvent(event); return IGUIElement::OnEvent(event);
......
...@@ -161,51 +161,54 @@ void CGUISpinBox::setDecimalPlaces(s32 places) ...@@ -161,51 +161,54 @@ void CGUISpinBox::setDecimalPlaces(s32 places)
bool CGUISpinBox::OnEvent(const SEvent& event) bool CGUISpinBox::OnEvent(const SEvent& event)
{ {
bool changeEvent = false; if (IsEnabled)
switch(event.EventType)
{ {
case EET_GUI_EVENT: bool changeEvent = false;
if (event.GUIEvent.EventType == EGET_BUTTON_CLICKED) switch(event.EventType)
{ {
if (event.GUIEvent.Caller == ButtonSpinUp) case EET_GUI_EVENT:
if (event.GUIEvent.EventType == EGET_BUTTON_CLICKED)
{ {
f32 val = getValue(); if (event.GUIEvent.Caller == ButtonSpinUp)
val += StepSize; {
setValue(val); f32 val = getValue();
changeEvent = true; val += StepSize;
setValue(val);
changeEvent = true;
}
else if ( event.GUIEvent.Caller == ButtonSpinDown)
{
f32 val = getValue();
val -= StepSize;
setValue(val);
changeEvent = true;
}
} }
else if ( event.GUIEvent.Caller == ButtonSpinDown) if ( event.GUIEvent.EventType == EGET_EDITBOX_ENTER )
{ {
f32 val = getValue(); if (event.GUIEvent.Caller == EditBox)
val -= StepSize; {
setValue(val); verifyValueRange();
changeEvent = true; changeEvent = true;
}
} }
break;
default:
break;
} }
if ( event.GUIEvent.EventType == EGET_EDITBOX_ENTER )
if ( changeEvent )
{ {
if (event.GUIEvent.Caller == EditBox) SEvent e;
{ e.EventType = EET_GUI_EVENT;
verifyValueRange(); e.GUIEvent.Caller = this;
changeEvent = true; e.GUIEvent.Element = 0;
}
e.GUIEvent.EventType = EGET_SPINBOX_CHANGED;
if ( Parent )
Parent->OnEvent(e);
return true;
} }
break;
default:
break;
}
if ( changeEvent )
{
SEvent e;
e.EventType = EET_GUI_EVENT;
e.GUIEvent.Caller = this;
e.GUIEvent.Element = 0;
e.GUIEvent.EventType = EGET_SPINBOX_CHANGED;
if ( Parent )
Parent->OnEvent(e);
return true;
} }
return IGUIElement::OnEvent(event); return IGUIElement::OnEvent(event);
......
...@@ -323,50 +323,51 @@ IGUITab* CGUITabControl::getTab(s32 idx) const ...@@ -323,50 +323,51 @@ IGUITab* CGUITabControl::getTab(s32 idx) const
//! called if an event happened. //! called if an event happened.
bool CGUITabControl::OnEvent(const SEvent& event) bool CGUITabControl::OnEvent(const SEvent& event)
{ {
if (!IsEnabled) if (IsEnabled)
return Parent ? Parent->OnEvent(event) : false;
switch(event.EventType)
{ {
case EET_GUI_EVENT:
switch(event.GUIEvent.EventType) switch(event.EventType)
{ {
case EGET_BUTTON_CLICKED: case EET_GUI_EVENT:
if (event.GUIEvent.Caller == UpButton) switch(event.GUIEvent.EventType)
{ {
scrollLeft(); case EGET_BUTTON_CLICKED:
return true; if (event.GUIEvent.Caller == UpButton)
{
scrollLeft();
return true;
}
else if (event.GUIEvent.Caller == DownButton)
{
scrollRight();
return true;
}
break;
default:
break;
} }
else if (event.GUIEvent.Caller == DownButton) break;
case EET_MOUSE_INPUT_EVENT:
switch(event.MouseInput.Event)
{ {
scrollRight(); case EMIE_LMOUSE_PRESSED_DOWN:
// todo: dragging tabs around
return true; return true;
case EMIE_LMOUSE_LEFT_UP:
if (selectTab(core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y)))
return true;
break;
default:
break;
} }
break;
default:
break;
}
break;
case EET_MOUSE_INPUT_EVENT:
switch(event.MouseInput.Event)
{
case EMIE_LMOUSE_PRESSED_DOWN:
// todo: dragging tabs around
return true;
case EMIE_LMOUSE_LEFT_UP:
if (selectTab(core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y)))
return true;
break; break;
default: default:
break; break;
} }
break;
default:
break;
} }
return Parent ? Parent->OnEvent(event) : false; return IGUIElement::OnEvent(event);
} }
void CGUITabControl::scrollLeft() void CGUITabControl::scrollLeft()
......
...@@ -502,129 +502,132 @@ void CGUITable::refreshControls() ...@@ -502,129 +502,132 @@ void CGUITable::refreshControls()
//! called if an event happened. //! called if an event happened.
bool CGUITable::OnEvent(const SEvent &event) bool CGUITable::OnEvent(const SEvent &event)
{ {
if (IsEnabled)
switch(event.EventType)
{ {
case EET_GUI_EVENT:
switch(event.GUIEvent.EventType) switch(event.EventType)
{ {
case gui::EGET_SCROLL_BAR_CHANGED: case EET_GUI_EVENT:
if (event.GUIEvent.Caller == VerticalScrollBar) switch(event.GUIEvent.EventType)
{ {
// current position will get read out in draw case gui::EGET_SCROLL_BAR_CHANGED:
return true; if (event.GUIEvent.Caller == VerticalScrollBar)
} {
if (event.GUIEvent.Caller == HorizontalScrollBar) // current position will get read out in draw
{ return true;
// current position will get read out in draw }
return true; if (event.GUIEvent.Caller == HorizontalScrollBar)
} {
break; // current position will get read out in draw
case gui::EGET_ELEMENT_FOCUS_LOST: return true;
{ }
CurrentResizedColumn = -1; break;
Selecting = false; case gui::EGET_ELEMENT_FOCUS_LOST:
{
CurrentResizedColumn = -1;
Selecting = false;
}
break;
default:
break;
} }
break; break;
default: case EET_MOUSE_INPUT_EVENT:
break;
}
break;
case EET_MOUSE_INPUT_EVENT:
{
if ( !IsEnabled )
return false;
core::position2d<s32> p(event.MouseInput.X, event.MouseInput.Y);
switch(event.MouseInput.Event)
{ {
case EMIE_MOUSE_WHEEL: if ( !IsEnabled )
VerticalScrollBar->setPos(VerticalScrollBar->getPos() + (s32)event.MouseInput.Wheel*-10); return false;
return true;
case EMIE_LMOUSE_PRESSED_DOWN: core::position2d<s32> p(event.MouseInput.X, event.MouseInput.Y);
if (Environment->hasFocus(this) && switch(event.MouseInput.Event)
VerticalScrollBar->isVisible() &&
VerticalScrollBar->getAbsolutePosition().isPointInside(p) &&
VerticalScrollBar->OnEvent(event))
return true;
if (Environment->hasFocus(this) &&
HorizontalScrollBar->isVisible() &&
HorizontalScrollBar->getAbsolutePosition().isPointInside(p) &&
HorizontalScrollBar->OnEvent(event))
return true;
if ( dragColumnStart( event.MouseInput.X, event.MouseInput.Y ) )
{ {
Environment->setFocus(this); case EMIE_MOUSE_WHEEL:
VerticalScrollBar->setPos(VerticalScrollBar->getPos() + (s32)event.MouseInput.Wheel*-10);
return true; return true;
}
if ( selectColumnHeader( event.MouseInput.X, event.MouseInput.Y ) ) case EMIE_LMOUSE_PRESSED_DOWN:
return true;
if (Environment->hasFocus(this) &&
VerticalScrollBar->isVisible() &&
VerticalScrollBar->getAbsolutePosition().isPointInside(p) &&
VerticalScrollBar->OnEvent(event))
return true;
Selecting = true; if (Environment->hasFocus(this) &&
Environment->setFocus(this); HorizontalScrollBar->isVisible() &&
return true; HorizontalScrollBar->getAbsolutePosition().isPointInside(p) &&
HorizontalScrollBar->OnEvent(event))
return true;
case EMIE_LMOUSE_LEFT_UP: if ( dragColumnStart( event.MouseInput.X, event.MouseInput.Y ) )
{
Environment->setFocus(this);
return true;
}
CurrentResizedColumn = -1; if ( selectColumnHeader( event.MouseInput.X, event.MouseInput.Y ) )
Selecting = false; return true;
if (!getAbsolutePosition().isPointInside(p))
{
Environment->removeFocus(this);
}
if (Environment->hasFocus(this) && Selecting = true;
VerticalScrollBar->isVisible() && Environment->setFocus(this);
VerticalScrollBar->getAbsolutePosition().isPointInside(p) &&
VerticalScrollBar->OnEvent(event))
{
return true; return true;
}
if (Environment->hasFocus(this) && case EMIE_LMOUSE_LEFT_UP:
HorizontalScrollBar->isVisible() &&
HorizontalScrollBar->getAbsolutePosition().isPointInside(p) &&
HorizontalScrollBar->OnEvent(event))
{
return true;
}
selectNew(event.MouseInput.Y); CurrentResizedColumn = -1;
return true; Selecting = false;
if (!getAbsolutePosition().isPointInside(p))
{
Environment->removeFocus(this);
}
case EMIE_MOUSE_MOVED: if (Environment->hasFocus(this) &&
if ( CurrentResizedColumn >= 0 ) VerticalScrollBar->isVisible() &&
{ VerticalScrollBar->getAbsolutePosition().isPointInside(p) &&
if ( dragColumnUpdate(event.MouseInput.X) ) VerticalScrollBar->OnEvent(event))
{ {
return true; return true;
} }
}
if (Selecting || MoveOverSelect) if (Environment->hasFocus(this) &&
{ HorizontalScrollBar->isVisible() &&
if (getAbsolutePosition().isPointInside(p)) HorizontalScrollBar->getAbsolutePosition().isPointInside(p) &&
HorizontalScrollBar->OnEvent(event))
{ {
selectNew(event.MouseInput.Y);
return true; return true;
} }
selectNew(event.MouseInput.Y);
return true;
case EMIE_MOUSE_MOVED:
if ( CurrentResizedColumn >= 0 )
{
if ( dragColumnUpdate(event.MouseInput.X) )
{
return true;
}
}
if (Selecting || MoveOverSelect)
{
if (getAbsolutePosition().isPointInside(p))
{
selectNew(event.MouseInput.Y);
return true;
}
}
break;
default:
break;
} }
break;
default:
break;
} }
break;
default:
break;
} }
break;
default:
break;
} }
return Parent ? Parent->OnEvent(event) : false; return IGUIElement::OnEvent(event);
} }
......
...@@ -67,14 +67,17 @@ CGUIToolBar::CGUIToolBar(IGUIEnvironment* environment, IGUIElement* parent, s32 ...@@ -67,14 +67,17 @@ CGUIToolBar::CGUIToolBar(IGUIEnvironment* environment, IGUIElement* parent, s32
//! called if an event happened. //! called if an event happened.
bool CGUIToolBar::OnEvent(const SEvent& event) bool CGUIToolBar::OnEvent(const SEvent& event)
{ {
if (event.EventType == EET_MOUSE_INPUT_EVENT && if (IsEnabled)
event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN)
{ {
if (AbsoluteClippingRect.isPointInside(core::position2di(event.MouseInput.X, event.MouseInput.Y))) if (event.EventType == EET_MOUSE_INPUT_EVENT &&
return true; event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN)
{
if (AbsoluteClippingRect.isPointInside(core::position2di(event.MouseInput.X, event.MouseInput.Y)))
return true;
}
} }
return Parent ? Parent->OnEvent(event) : false; return IGUIElement::OnEvent(event);
} }
......
...@@ -109,85 +109,89 @@ CGUIWindow::~CGUIWindow() ...@@ -109,85 +109,89 @@ CGUIWindow::~CGUIWindow()
//! called if an event happened. //! called if an event happened.
bool CGUIWindow::OnEvent(const SEvent& event) bool CGUIWindow::OnEvent(const SEvent& event)
{ {
switch(event.EventType) if (IsEnabled)
{ {
case EET_GUI_EVENT:
if (event.GUIEvent.EventType == EGET_ELEMENT_FOCUS_LOST) switch(event.EventType)
{
Dragging = false;
}
else
if (event.GUIEvent.EventType == EGET_ELEMENT_FOCUSED)
{
if (Parent && ((event.GUIEvent.Caller == this) || isMyChild(event.GUIEvent.Caller)))
Parent->bringToFront(this);
}
else
if (event.GUIEvent.EventType == EGET_BUTTON_CLICKED)
{ {
if (event.GUIEvent.Caller == CloseButton) case EET_GUI_EVENT:
if (event.GUIEvent.EventType == EGET_ELEMENT_FOCUS_LOST)
{ {
if (Parent) Dragging = false;
}
else
if (event.GUIEvent.EventType == EGET_ELEMENT_FOCUSED)
{
if (Parent && ((event.GUIEvent.Caller == this) || isMyChild(event.GUIEvent.Caller)))
Parent->bringToFront(this);
}
else
if (event.GUIEvent.EventType == EGET_BUTTON_CLICKED)
{
if (event.GUIEvent.Caller == CloseButton)
{ {
// send close event to parent if (Parent)
SEvent e; {
e.EventType = EET_GUI_EVENT; // send close event to parent
e.GUIEvent.Caller = this; SEvent e;
e.GUIEvent.Element = 0; e.EventType = EET_GUI_EVENT;
e.GUIEvent.EventType = EGET_ELEMENT_CLOSED; e.GUIEvent.Caller = this;
e.GUIEvent.Element = 0;
// if the event was not absorbed e.GUIEvent.EventType = EGET_ELEMENT_CLOSED;
if (!Parent->OnEvent(e))
remove(); // if the event was not absorbed
if (!Parent->OnEvent(e))
remove();
return true; return true;
} }
else else
{ {
remove(); remove();
return true; return true;
}
} }
} }
} break;
break; case EET_MOUSE_INPUT_EVENT:
case EET_MOUSE_INPUT_EVENT: switch(event.MouseInput.Event)
switch(event.MouseInput.Event)
{
case EMIE_LMOUSE_PRESSED_DOWN:
DragStart.X = event.MouseInput.X;
DragStart.Y = event.MouseInput.Y;
Dragging = true;
if (Parent)
Parent->bringToFront(this);
return true;
case EMIE_LMOUSE_LEFT_UP:
Dragging = false;
return true;
case EMIE_MOUSE_MOVED:
if (Dragging)
{ {
// gui window should not be dragged outside its parent case EMIE_LMOUSE_PRESSED_DOWN:
if (Parent)
if (event.MouseInput.X < Parent->getAbsolutePosition().UpperLeftCorner.X +1 ||
event.MouseInput.Y < Parent->getAbsolutePosition().UpperLeftCorner.Y +1 ||
event.MouseInput.X > Parent->getAbsolutePosition().LowerRightCorner.X -1 ||
event.MouseInput.Y > Parent->getAbsolutePosition().LowerRightCorner.Y -1)
return true;
move(core::position2d<s32>(event.MouseInput.X - DragStart.X, event.MouseInput.Y - DragStart.Y));
DragStart.X = event.MouseInput.X; DragStart.X = event.MouseInput.X;
DragStart.Y = event.MouseInput.Y; DragStart.Y = event.MouseInput.Y;
Dragging = true;
if (Parent)
Parent->bringToFront(this);
return true; return true;
case EMIE_LMOUSE_LEFT_UP:
Dragging = false;
return true;
case EMIE_MOUSE_MOVED:
if (Dragging)
{
// gui window should not be dragged outside its parent
if (Parent)
if (event.MouseInput.X < Parent->getAbsolutePosition().UpperLeftCorner.X +1 ||
event.MouseInput.Y < Parent->getAbsolutePosition().UpperLeftCorner.Y +1 ||
event.MouseInput.X > Parent->getAbsolutePosition().LowerRightCorner.X -1 ||
event.MouseInput.Y > Parent->getAbsolutePosition().LowerRightCorner.Y -1)
return true;
move(core::position2d<s32>(event.MouseInput.X - DragStart.X, event.MouseInput.Y - DragStart.Y));
DragStart.X = event.MouseInput.X;
DragStart.Y = event.MouseInput.Y;
return true;
}
break;
default:
break;
} }
break;
default: default:
break; break;
} }
default:
break;
} }
return IGUIElement::OnEvent(event); return IGUIElement::OnEvent(event);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment