CuteAlien's menu changes and fixes, CuteAlien/StarSonata's coloured listbox item extension.

Added a close event for windows (and in future other elements), absorbing this event will prevent the window from closing.
Used the new skin icon in the gui editor's resize button.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@879 dfc29bdd-3216-0410-991c-e03cc46cb475
master
bitplane 2007-08-29 23:37:24 +00:00
parent fc1f2f7cf3
commit 9e4d29dd2b
17 changed files with 493 additions and 121 deletions

View File

@ -95,6 +95,10 @@ Changes in version 1.4 (... 2007)
GUI:
- Fixes to menu and listbox (de)serialization, and custom listbox colors by CuteAlien.
- Added EGET_ELEMENT_CLOSED GUI event type. Absorb this event to cancel closing a window.
- Added _IRR_COMPILE_WITH_GUI_ to allow compiling without the GUI.
This is useful if you use another GUI system (ie CEGUI) or are using Irrlicht
inside another window. You will have to supply an external IGUIFont if you wish

View File

@ -29,7 +29,7 @@ namespace scene
EDS_MESH_WIRE_OVERLAY = 8,
//! Temporary use transparency Material Type
EDS_HALF_TRANSPARENCY= 16,
EDS_HALF_TRANSPARENCY = 16,
//! Show Bounding Boxes of all MeshBuffers
EDS_BBOX_BUFFERS = 32,

View File

@ -33,7 +33,7 @@ namespace scene
//! Collision respose scene node animator
ESNAT_COLLISION_RESPONSE,
//! Amount of build in scene node animators
//! Amount of built-in scene node animators
ESNAT_COUNT,
//! Unknown scene node animator

View File

@ -85,18 +85,25 @@ namespace irr
enum EGUI_EVENT_TYPE
{
//! A gui element has lost its focus.
//! GUIEvent.Caller is losing the focus to GUIEvent.Element
//! GUIEvent.Caller is losing the focus to GUIEvent.Element.
//! If the event is absorbed then the focus will not be changed.
EGET_ELEMENT_FOCUS_LOST = 0,
//! A gui element has got the focus.
//! If the event is absorbed then the focus will not be changed.
EGET_ELEMENT_FOCUSED,
//! A gui element was hovered.
//! The mouse cursor hovered over a gui element.
EGET_ELEMENT_HOVERED,
//! A hovered gui element was left
//! The mouse cursor left the hovered element.
EGET_ELEMENT_LEFT,
//! An element would like to close.
//! Windows and context menus use this event when they would like to close,
//! this can be cancelled by absorbing the event.
EGET_ELEMENT_CLOSED,
//! A button was clicked.
EGET_BUTTON_CLICKED,

View File

@ -2,10 +2,11 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#ifndef __I_GUI_LIST_BOX_BAR_H_INCLUDED__
#define __I_GUI_LIST_BOX_BAR_H_INCLUDED__
#ifndef __I_GUI_LIST_BOX_H_INCLUDED__
#define __I_GUI_LIST_BOX_H_INCLUDED__
#include "IGUIElement.h"
#include "SColor.h"
namespace irr
{
@ -14,11 +15,26 @@ namespace gui
class IGUIFont;
class IGUISpriteBank;
//! Enumeration for listbox colors
enum EGUI_LISTBOX_COLOR
{
//! Color of text
EGUI_LBC_TEXT=0,
//! Color of selected text
EGUI_LBC_TEXT_HIGHLIGHT,
//! Color of icon
EGUI_LBC_ICON,
//! Color of selected icon
EGUI_LBC_ICON_HIGHLIGHT,
//! Not used, just counts the number of available colors
EGUI_LBC_COUNT
};
//! Default list box GUI element.
class IGUIListBox : public IGUIElement
{
public:
//! constructor
IGUIListBox(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
: IGUIElement(EGUIET_LIST_BOX, environment, parent, id, rectangle) {}
@ -70,11 +86,40 @@ namespace gui
//! returns true if automatic scrolling is enabled, false if not.
virtual bool isAutoScrollEnabled() = 0;
};
//! set all item colors at given index to color
virtual void setItemOverrideColor(s32 index, const video::SColor &color) = 0;
//! set all item colors of specified type at given index to color
virtual void setItemOverrideColor(s32 index, EGUI_LISTBOX_COLOR colorType, const video::SColor &color) = 0;
//! clear all item colors at index
virtual void clearItemOverrideColor(s32 index) = 0;
//! clear item color at index for given colortype
virtual void clearItemOverrideColor(s32 index, EGUI_LISTBOX_COLOR colorType) = 0;
//! has the item at index it's color overwritten?
virtual bool hasItemOverrideColor(s32 index, EGUI_LISTBOX_COLOR colorType) = 0;
//! return the overwrite color at given item index.
virtual video::SColor getItemOverrideColor(s32 index, EGUI_LISTBOX_COLOR colorType) = 0;
//! return the default color which is used for the given colorType
virtual video::SColor getItemDefaultColor(EGUI_LISTBOX_COLOR colorType) = 0;
//! set the item at the given index
virtual void setItem(s32 index, const wchar_t* text, s32 icon) = 0;
//! Insert the item at the given index
//! Return the index on success or -1 on failure.
virtual s32 insertItem(s32 index, const wchar_t* text, s32 icon) = 0;
//! Swap the items at the given indices
virtual void swapItems(s32 index1, s32 index2) = 0;
};
} // end namespace gui
} // end namespace irr
#endif

View File

@ -94,7 +94,14 @@ void CGUIContextMenu::setSubMenu(s32 index, CGUIContextMenu* menu)
menu->setVisible(false);
if (Items[index].SubMenu)
{
menu->grab();
menu->AllowFocus = false;
if ( Environment->getFocus() == menu )
{
Environment->setFocus( this );
}
}
recalculateSize();
}
@ -215,7 +222,7 @@ bool CGUIContextMenu::OnEvent(SEvent event)
switch(event.GUIEvent.EventType)
{
case EGET_ELEMENT_FOCUS_LOST:
if (event.GUIEvent.Caller == this && !isMyChild(event.GUIEvent.Element))
if (event.GUIEvent.Caller == this && !isMyChild(event.GUIEvent.Element) && AllowFocus)
{
// set event parent of submenus
setEventParent(Parent);
@ -247,7 +254,7 @@ bool CGUIContextMenu::OnEvent(SEvent event)
return true;
case EMIE_MOUSE_MOVED:
if (Environment->hasFocus(this))
highlight(core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y));
highlight(core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y), true);
return true;
}
break;
@ -324,7 +331,7 @@ s32 CGUIContextMenu::sendClick(core::position2d<s32> p)
//! returns true, if an element was highligted
bool CGUIContextMenu::highlight(core::position2d<s32> p)
bool CGUIContextMenu::highlight(core::position2d<s32> p, bool canOpenSubMenu)
{
// get number of open submenu
s32 openmenu = -1;
@ -339,7 +346,7 @@ bool CGUIContextMenu::highlight(core::position2d<s32> p)
// delegate highlight operation to submenu
if (openmenu != -1)
{
if (Items[openmenu].SubMenu->highlight(p))
if (Items[openmenu].SubMenu->highlight(p, canOpenSubMenu))
{
HighLighted = openmenu;
ChangeTime = os::Timer::getTime();
@ -355,9 +362,14 @@ bool CGUIContextMenu::highlight(core::position2d<s32> p)
ChangeTime = os::Timer::getTime();
// make submenus visible/invisible
for (s32 j=0; j<(s32)Items.size(); ++j)
if (Items[j].SubMenu)
Items[j].SubMenu->setVisible(j == i);
for (s32 j=0; j<(s32)Items.size(); ++j)
if (Items[j].SubMenu)
{
if ( j == i && canOpenSubMenu )
Items[j].SubMenu->setVisible(true);
else if ( j != i )
Items[j].SubMenu->setVisible(false);
}
return true;
}
@ -479,7 +491,6 @@ void CGUIContextMenu::draw()
core::rect<s32> r = rect;
r.LowerRightCorner.X = r.UpperLeftCorner.X - 15;
r.UpperLeftCorner.X = r.LowerRightCorner.X + 15;
sprites->draw2DSprite(skin->getIcon(EGDI_CHECK_BOX_CHECKED),
r.getCenter(), clip, skin->getColor(c),
(i == HighLighted) ? ChangeTime : 0,
@ -691,9 +702,28 @@ void CGUIContextMenu::setEventParent(IGUIElement *parent)
}
}
bool CGUIContextMenu::hasOpenSubMenu()
{
for (s32 i=0; i<(s32)Items.size(); ++i)
if (Items[i].SubMenu)
if ( Items[i].SubMenu->isVisible() )
return true;
return false;
}
void CGUIContextMenu::closeAllSubMenus()
{
for (s32 i=0; i<(s32)Items.size(); ++i)
if (Items[i].SubMenu)
Items[i].SubMenu->setVisible(false);
//HighLighted = -1;
}
} // end namespace
} // end namespace
#endif // _IRR_COMPILE_WITH_GUI_

View File

@ -98,6 +98,9 @@ namespace gui
protected:
void closeAllSubMenus();
bool hasOpenSubMenu();
struct SItem
{
core::stringw Text;
@ -112,8 +115,8 @@ namespace gui
virtual void recalculateSize();
//! returns true, if an element was highligted
virtual bool highlight(core::position2d<s32> p);
//! returns true, if an element was highlighted
virtual bool highlight(core::position2d<s32> p, bool canOpenSubMenu);
//! sends a click Returns:
//! 0 if click went outside of the element,

View File

@ -5,6 +5,7 @@
#include "CGUIListBox.h"
#ifdef _IRR_COMPILE_WITH_GUI_
#include "CGUIListBox.h"
#include "IGUISkin.h"
#include "IGUIEnvironment.h"
#include "IVideoDriver.h"
@ -102,14 +103,7 @@ s32 CGUIListBox::getIcon(s32 id) const
//! adds an list item, returns id of item
s32 CGUIListBox::addItem(const wchar_t* text)
{
ListItem i;
i.text = text;
Items.push_back(i);
recalculateItemHeight();
recalculateScrollPos();
return Items.size() - 1;
return addItem(text, -1);
}
//! adds an list item, returns id of item
@ -522,14 +516,36 @@ void CGUIListBox::draw()
core::position2di iconPos = textRect.UpperLeftCorner;
iconPos.Y += textRect.getHeight() / 2;
iconPos.X += ItemsIconWidth/2;
IconBank->draw2DSprite( (u32)Items[i].icon, iconPos, &clientClip,
skin->getColor((i==Selected && hl) ? EGDC_ICON_HIGH_LIGHT : EGDC_ICON),
(i==Selected && hl) ? selectTime : 0 , (i==Selected) ? os::Timer::getTime() : 0, false, true);
if ( i==Selected && hl )
{
IconBank->draw2DSprite( (u32)Items[i].icon, iconPos, &clientClip,
hasItemOverrideColor(i, EGUI_LBC_ICON_HIGHLIGHT) ? getItemOverrideColor(i, EGUI_LBC_ICON_HIGHLIGHT) : getItemDefaultColor(EGUI_LBC_ICON_HIGHLIGHT),
selectTime, os::Timer::getTime(), false, true);
}
else
{
IconBank->draw2DSprite( (u32)Items[i].icon, iconPos, &clientClip,
hasItemOverrideColor(i, EGUI_LBC_ICON) ? getItemOverrideColor(i, EGUI_LBC_ICON) : getItemDefaultColor(EGUI_LBC_ICON),
0 , (i==Selected) ? os::Timer::getTime() : 0, false, true);
}
}
textRect.UpperLeftCorner.X += ItemsIconWidth+3;
Font->draw(Items[i].text.c_str(), textRect, skin->getColor((i==Selected && hl) ? EGDC_HIGH_LIGHT_TEXT : EGDC_BUTTON_TEXT), false, true, &clientClip);
if ( i==Selected && hl )
{
Font->draw(Items[i].text.c_str(), textRect,
hasItemOverrideColor(i, EGUI_LBC_TEXT_HIGHLIGHT) ? getItemOverrideColor(i, EGUI_LBC_TEXT_HIGHLIGHT) : getItemDefaultColor(EGUI_LBC_TEXT_HIGHLIGHT),
false, true, &clientClip);
}
else
{
Font->draw(Items[i].text.c_str(), textRect,
hasItemOverrideColor(i, EGUI_LBC_TEXT) ? getItemOverrideColor(i, EGUI_LBC_TEXT) : getItemDefaultColor(EGUI_LBC_TEXT),
false, true, &clientClip);
}
textRect.UpperLeftCorner.X -= ItemsIconWidth+3;
}
@ -553,19 +569,7 @@ s32 CGUIListBox::addItem(const wchar_t* text, s32 icon)
Items.push_back(i);
recalculateItemHeight();
if (IconBank && icon > -1 &&
IconBank->getSprites().size() > (u32)icon &&
IconBank->getSprites()[(u32)icon].Frames.size())
{
u32 rno = IconBank->getSprites()[(u32)icon].Frames[0].rectNumber;
if (IconBank->getPositions().size() > rno)
{
const s32 w = IconBank->getPositions()[rno].getWidth();
if (w > ItemsIconWidth)
ItemsIconWidth = w;
}
}
recalculateItemWidth(icon);
return Items.size() - 1;
}
@ -609,6 +613,32 @@ bool CGUIListBox::isAutoScrollEnabled()
return AutoScroll;
}
bool CGUIListBox::getSerializationLabels(EGUI_LISTBOX_COLOR colorType, core::stringc & useColorLabel, core::stringc & colorLabel)
{
switch ( colorType )
{
case EGUI_LBC_TEXT:
useColorLabel = "UseColText";
colorLabel = "ColText";
break;
case EGUI_LBC_TEXT_HIGHLIGHT:
useColorLabel = "UseColTextHl";
colorLabel = "ColTextHl";
break;
case EGUI_LBC_ICON:
useColorLabel = "UseColIcon";
colorLabel = "ColIcon";
break;
case EGUI_LBC_ICON_HIGHLIGHT:
useColorLabel = "UseColIconHl";
colorLabel = "ColIconHl";
break;
default:
return false;
}
return true;
}
//! Writes attributes of the element.
void CGUIListBox::serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options=0)
{
@ -619,49 +649,215 @@ void CGUIListBox::serializeAttributes(io::IAttributes* out, io::SAttributeReadWr
out->addBool ("MoveOverSelect", MoveOverSelect);
out->addBool ("AutoScroll", AutoScroll);
// todo: save list of items and icons.
/*core::array<core::stringw> tmpText;
core::array<core::stringw> tmpIcons;
// MICHA, StarSonata
// I also don't know yet how to handle icons, but added some text+color serialization now
// I did it the same way it's done for the context menus
out->addInt("ItemCount", Items.size());
u32 i;
for (i=0;i<Items.size(); ++i)
{
tmpText.push_back(Items[i].text);
tmpIcons.push_back(Items[i].icon);
core::stringc label;
label = "text"; label += i;
out->addString(label.c_str(), Items[i].text.c_str() );
for ( s32 c=0; c < (s32)EGUI_LBC_COUNT; ++c )
{
core::stringc useColorLabel, colorLabel;
if ( !getSerializationLabels((EGUI_LISTBOX_COLOR)c, useColorLabel, colorLabel) )
return;
label = useColorLabel; label += i;
if ( Items[i].OverrideColors[c].Use )
{
out->addBool(label.c_str(), true );
label = colorLabel; label += i;
out->addColor(label.c_str(), Items[i].OverrideColors[c].Color);
}
else
{
out->addBool(label.c_str(), false );
}
}
}
out->addArray ("ItemText", tmpText);
out->addArray ("ItemIcons", tmpIcons);
out->addInt ("Selected", Selected);
*/
}
//! Reads attributes of the element
void CGUIListBox::deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options=0)
{
clear();
DrawBack = in->getAttributeAsBool("DrawBack");
MoveOverSelect = in->getAttributeAsBool("MoveOverSelect");
AutoScroll = in->getAttributeAsBool("AutoScroll");
IGUIListBox::deserializeAttributes(in,options);
// read arrays
/*
core::array<core::stringw> tmpText;
core::array<core::stringw> tmpIcons;
// MICHA, StarSonata
// I also don't know yet how to handle icons, but added some text+color serialization now
// I did it the same way it's done for the context menus
s32 count = in->getAttributeAsInt("ItemCount");
for (s32 i=0; i<(s32)count; ++i)
{
core::stringc label;
ListItem item;
tmpText = in->getAttributeAsArray("ItemText");
tmpIcons = in->getAttributeAsArray("ItemIcons");
u32 i;
for (i=0; i<Items.size(); ++i)
addItem(tmpText[i].c_str(), tmpIcons[i].c_str());
label = "text"; label += i;
item.text = in->getAttributeAsStringW(label.c_str());
this->setSelected(in->getAttributeAsInt("Selected"));
*/
addItem(item.text.c_str(), item.icon);
for ( s32 c=0; c < (s32)EGUI_LBC_COUNT; ++c )
{
core::stringc useColorLabel, colorLabel;
if ( !getSerializationLabels((EGUI_LISTBOX_COLOR)c, useColorLabel, colorLabel) )
return;
label = useColorLabel; label += i;
Items[i].OverrideColors[c].Use = in->getAttributeAsBool(label.c_str());
if ( Items[i].OverrideColors[c].Use )
{
label = colorLabel; label += i;
Items[i].OverrideColors[c].Color = in->getAttributeAsColor(label.c_str());
}
}
}
}
// MICHA, StarSonata
void CGUIListBox::recalculateItemWidth(s32 icon)
{
if (IconBank && icon > -1 &&
IconBank->getSprites().size() > (u32)icon &&
IconBank->getSprites()[(u32)icon].Frames.size())
{
u32 rno = IconBank->getSprites()[(u32)icon].Frames[0].rectNumber;
if (IconBank->getPositions().size() > rno)
{
const s32 w = IconBank->getPositions()[rno].getWidth();
if (w > ItemsIconWidth)
ItemsIconWidth = w;
}
}
}
// MICHA, StarSonata
void CGUIListBox::setItem(s32 index, const wchar_t* text, s32 icon)
{
if ( index < 0 || index >= (s32)Items.size() )
return;
Items[index].text = text;
Items[index].icon = icon;
recalculateItemHeight();
recalculateItemWidth(icon);
}
// MICHA, StarSonata
//! Insert the item at the given index
//! Return the index on success or -1 on failure.
s32 CGUIListBox::insertItem(s32 index, const wchar_t* text, s32 icon)
{
if ( index < 0 )
return -1;
ListItem i;
i.text = text;
i.icon = icon;
Items.insert(i, index);
recalculateItemHeight();
recalculateItemWidth(icon);
return index;
}
// MICHA, StarSonata
void CGUIListBox::swapItems(s32 index1, s32 index2)
{
if ( index1 < 0 || index2 < 0 || index1 >= (s32)Items.size() || index2 >= (s32)Items.size() )
return;
ListItem dummmy = Items[index1];
Items[index1] = Items[index2];
Items[index2] = dummmy;
}
// MICHA, StarSonata
void CGUIListBox::setItemOverrideColor(s32 index, const video::SColor &color)
{
for ( s32 c=0; c < (s32)EGUI_LBC_COUNT; ++c )
{
Items[index].OverrideColors[c].Use = true;
Items[index].OverrideColors[c].Color = color;
}
}
// MICHA, StarSonata
void CGUIListBox::setItemOverrideColor(s32 index, EGUI_LISTBOX_COLOR colorType, const video::SColor &color)
{
if ( index < 0 || index >= (s32)Items.size() || colorType < 0 || colorType >= EGUI_LBC_COUNT )
return;
Items[index].OverrideColors[colorType].Use = true;
Items[index].OverrideColors[colorType].Color = color;
}
// MICHA, StarSonata
void CGUIListBox::clearItemOverrideColor(s32 index)
{
for (s32 c=0; c < (s32)EGUI_LBC_COUNT; ++c )
{
Items[index].OverrideColors[c].Use = false;
}
}
// MICHA, StarSonata
void CGUIListBox::clearItemOverrideColor(s32 index, EGUI_LISTBOX_COLOR colorType)
{
if ( index < 0 || index >= (s32)Items.size() || colorType < 0 || colorType >= EGUI_LBC_COUNT )
return;
Items[index].OverrideColors[colorType].Use = false;
}
// MICHA, StarSonata
bool CGUIListBox::hasItemOverrideColor(s32 index, EGUI_LISTBOX_COLOR colorType)
{
if ( index < 0 || index >= (s32)Items.size() || colorType < 0 || colorType >= EGUI_LBC_COUNT )
return false;
return Items[index].OverrideColors[colorType].Use;
}
// MICHA, StarSonata
video::SColor CGUIListBox::getItemOverrideColor(s32 index, EGUI_LISTBOX_COLOR colorType)
{
if ( index < 0 || index >= (s32)Items.size() || colorType < 0 || colorType >= EGUI_LBC_COUNT )
return video::SColor();
return Items[index].OverrideColors[colorType].Color;
}
// MICHA, StarSonata
video::SColor CGUIListBox::getItemDefaultColor(EGUI_LISTBOX_COLOR colorType)
{
IGUISkin* skin = Environment->getSkin();
if ( !skin )
return video::SColor();
switch ( colorType )
{
case EGUI_LBC_TEXT:
return skin->getColor(EGDC_BUTTON_TEXT);
case EGUI_LBC_TEXT_HIGHLIGHT:
return skin->getColor(EGDC_HIGH_LIGHT_TEXT);
case EGUI_LBC_ICON:
return skin->getColor(EGDC_ICON);
case EGUI_LBC_ICON_HIGHLIGHT:
return skin->getColor(EGDC_ICON_HIGH_LIGHT);
default:
return video::SColor();
}
}
} // end namespace gui

View File

@ -2,8 +2,8 @@
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#ifndef __C_GUI_LIST_BOX_BAR_H_INCLUDED__
#define __C_GUI_LIST_BOX_BAR_H_INCLUDED__
#ifndef __C_GUI_LIST_BOX_H_INCLUDED__
#define __C_GUI_LIST_BOX_H_INCLUDED__
#include "IrrCompileConfig.h"
#ifdef _IRR_COMPILE_WITH_GUI_
@ -22,7 +22,6 @@ namespace gui
class CGUIListBox : public IGUIListBox
{
public:
//! constructor
CGUIListBox(IGUIEnvironment* environment, IGUIElement* parent,
s32 id, core::rect<s32> rectangle, bool clip=true,
@ -89,20 +88,74 @@ namespace gui
//! Reads attributes of the element
virtual void deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options);
// MICHA, StarSonata, multicolor support
//! set all item colors at given index to color
virtual void setItemOverrideColor(s32 index, const video::SColor &color);
//! set all item colors of specified type at given index to color
virtual void setItemOverrideColor(s32 index, EGUI_LISTBOX_COLOR colorType, const video::SColor &color);
//! clear all item colors at index
virtual void clearItemOverrideColor(s32 index);
//! clear item color at index for given colortype
virtual void clearItemOverrideColor(s32 index, EGUI_LISTBOX_COLOR colorType);
//! has the item at index it's color overwritten?
virtual bool hasItemOverrideColor(s32 index, EGUI_LISTBOX_COLOR colorType);
//! return the overwrite color at given item index.
virtual video::SColor getItemOverrideColor(s32 index, EGUI_LISTBOX_COLOR colorType);
//! return the default color which is used for the given colorType
virtual video::SColor getItemDefaultColor(EGUI_LISTBOX_COLOR colorType);
// MICHA, StarSonata
//! set the item at the given index
virtual void setItem(s32 index, const wchar_t* text, s32 icon);
// MICHA, StarSonata
//! Insert the item at the given index
//! Return the index on success or -1 on failure.
virtual s32 insertItem(s32 index, const wchar_t* text, s32 icon);
// MICHA, StarSonata
//! Swap the items at the given indices
virtual void swapItems(s32 index1, s32 index2);
private:
struct ListItem
{
ListItem() : icon(-1) {}
ListItem() : icon(-1)
{}
core::stringw text;
s32 icon;
// MICHA, StarSonata
// A multicolor extension
struct ListItemOverrideColor
{
ListItemOverrideColor() : Use(false) {}
bool Use;
video::SColor Color;
};
ListItemOverrideColor OverrideColors[EGUI_LBC_COUNT];
};
void recalculateItemHeight();
void selectNew(s32 ypos, bool onlyHover=false);
void recalculateScrollPos();
// MICHA, StarSonata
// extracted that function to avoid copy&paste code
void recalculateItemWidth(s32 icon);
// MICHA, StarSonata
// get labels used for serialization
bool getSerializationLabels(EGUI_LISTBOX_COLOR colorType, core::stringc & useColorLabel, core::stringc & colorLabel);
core::array< ListItem > Items;
s32 Selected;
s32 ItemHeight;

View File

@ -102,46 +102,49 @@ bool CGUIMenu::OnEvent(SEvent event)
{
case gui::EGET_ELEMENT_FOCUS_LOST:
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;
}
break;
case EET_MOUSE_INPUT_EVENT:
switch(event.MouseInput.Event)
{
case EMIE_LMOUSE_LEFT_UP:
{
core::position2d<s32> p(event.MouseInput.X, event.MouseInput.Y);
if (AbsoluteClippingRect.isPointInside(p))
{
if (HighLighted != -1)
Environment->removeFocus(this);
else
highlight(core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y));
}
else
{
s32 t = sendClick(p);
if ((t==0 || t==1) && Environment->hasFocus(this))
Environment->removeFocus(this);
}
}
return true;
case EMIE_LMOUSE_PRESSED_DOWN:
{
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 (Environment->hasFocus(this))
highlight(core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y));
highlight(core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y), hasOpenSubMenu());
return true;
}
break;
@ -229,17 +232,6 @@ core::rect<s32> CGUIMenu::getRect(const SItem& i, const core::rect<s32>& absolut
return getHRect(i, absolute);
}
void CGUIMenu::closeAllSubMenus()
{
for (s32 i=0; i<(s32)Items.size(); ++i)
if (Items[i].SubMenu)
Items[i].SubMenu->setVisible(false);
HighLighted = -1;
}
void CGUIMenu::updateAbsolutePosition()
{
if (Parent)
@ -252,4 +244,5 @@ void CGUIMenu::updateAbsolutePosition()
} // end namespace
} // end namespace
#endif // _IRR_COMPILE_WITH_GUI_

View File

@ -44,13 +44,11 @@ namespace gui
//! Gets drawing rect of Item
virtual core::rect<s32> getRect(const SItem& i, const core::rect<s32>& absolute);
void closeAllSubMenus();
};
} // end namespace gui
} // end namespace irr
#endif // __C_GUI_MENU_H_INCLUDED__
#endif // _IRR_COMPILE_WITH_GUI_

View File

@ -45,19 +45,26 @@ bool CGUIModalScreen::OnEvent(SEvent event)
switch(event.GUIEvent.EventType)
{
case EGET_ELEMENT_FOCUSED:
// only children are allowed the focus
if (event.GUIEvent.Caller != this && !isMyChild(event.GUIEvent.Caller))
Environment->setFocus(this);
return false;
case EGET_ELEMENT_FOCUS_LOST:
// only children are allowed the focus
if (!(isMyChild(event.GUIEvent.Element) || event.GUIEvent.Element == this))
{
MouseDownTime = os::Timer::getTime();
return true;
}
else
{
return IGUIElement::OnEvent(event);
}
break;
case EGET_ELEMENT_CLOSED:
// do not interfere with children being removed
return IGUIElement::OnEvent(event);
}
case EET_MOUSE_INPUT_EVENT:
switch(event.MouseInput.Event)
@ -69,7 +76,7 @@ bool CGUIModalScreen::OnEvent(SEvent event)
IGUIElement::OnEvent(event);
return true; // absorb everything
return true; // absorb everything else
}

View File

@ -131,8 +131,28 @@ bool CGUIWindow::OnEvent(SEvent event)
{
if (event.GUIEvent.Caller == CloseButton)
{
remove();
return true;
if (Parent)
{
// send close event to parent
SEvent e;
e.EventType = EET_GUI_EVENT;
e.GUIEvent.Caller = this;
e.GUIEvent.Element = 0;
e.GUIEvent.EventType = EGET_ELEMENT_CLOSED;
// if the event was not absorbed
if (!Parent->OnEvent(e))
{
remove();
}
return true;
}
else
{
remove();
return true;
}
}
}
break;

View File

@ -78,7 +78,7 @@
Name="VCLinkerTool"
UseLibraryDependencyInputs="true"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib glu32.lib opengl32.lib"
AdditionalDependencies="kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib glu32.lib opengl32.lib"
OutputFile="..\..\bin\Win32-visualstudio\Irrlicht.dll"
LinkIncremental="2"
SuppressStartupBanner="true"
@ -587,6 +587,14 @@
RelativePath=".\CParticleSphereEmitter.cpp"
>
</File>
<File
RelativePath="..\..\include\ECullingTypes.h"
>
</File>
<File
RelativePath="..\..\include\EDebugSceneTypes.h"
>
</File>
<File
RelativePath=".\..\..\include\ESceneNodeAnimatorTypes.h"
>

View File

@ -84,7 +84,12 @@ CGUIEditWindow::CGUIEditWindow(IGUIEnvironment* environment, core::rect<s32> rec
AttribEditor->setRelativePosition( core::rect<f32>(0.0f, 0.0f, 1.0f, 1.0f));
AttribEditor->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT);
ResizeButton = environment->addStaticText(L"/",core::rect<s32>(199-th,449-th,199,449), true, false, this, true);
ResizeButton = environment->addButton(core::rect<s32>(199-th,449-th,199,449), this);
ResizeButton->setDrawBorder(false);
ResizeButton->setEnabled(false);
ResizeButton->setSpriteBank(skin->getSpriteBank());
ResizeButton->setSprite(EGBS_BUTTON_UP, skin->getIcon(EGDI_WINDOW_RESIZE), skin->getColor(EGDC_WINDOW_SYMBOL));
ResizeButton->setSprite(EGBS_BUTTON_DOWN, skin->getIcon(EGDI_WINDOW_RESIZE), skin->getColor(EGDC_WINDOW_SYMBOL));
ResizeButton->grab();
ResizeButton->setSubElement(true);
ResizeButton->setAlignment(EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT);

View File

@ -4,7 +4,8 @@
#include "IGUIWindow.h"
#include "CGUIAttributeEditor.h"
#include "IGUIStaticText.h"
//#include "IGUIStaticText.h"
#include "IGUIButton.h"
#include "irrArray.h"
#include "IAttributes.h"
@ -46,16 +47,16 @@ namespace gui
// for dragging the window
bool Dragging;
bool Resizing;
core::position2d<s32> DragStart;
bool Dragging;
bool Resizing;
core::position2d<s32> DragStart;
IGUIElement* SelectedElement; // current selected element
IGUIElement* SelectedElement; // current selected element
CGUIAttributeEditor* AttribEditor; // edits the current attribute
CGUIAttributeEditor* OptionEditor; // edits the options for the window
CGUIAttributeEditor* EnvEditor; // edits attributes for the environment
IGUIStaticText* ResizeButton;
CGUIAttributeEditor* AttribEditor; // edits the current attribute
CGUIAttributeEditor* OptionEditor; // edits the options for the window
CGUIAttributeEditor* EnvEditor; // edits attributes for the environment
IGUIButton* ResizeButton;
};

View File

@ -70,6 +70,8 @@ int main()
now we add the GUI Editor Workspace
*/
env->loadGUI("c:\\out.xml");
env->addGUIElement("GUIEditor");
while(device->run())