Okey, I got everything work now except a problem that I'd like to solve before continue scripting my classes. So, I create 1 gridlist (listbox) and then I use my code to detect which element in listbox is selected, everything works fine. Now the problem appears when I create 2 listbox, the click event will execute only with the last listbox, if I try to click on the first listbox the program crashes... Here's my code:
Listbox Create Function:
Code: Select all
Gridlist Gridlist::CGridlist(float x, float y, float sx, float sy, CEGUI::Window* parent)
{
CEGUI::Window* gridList = CEGUI::WindowManager::getSingleton().createWindow("TaharezLook/ItemListbox", "Gridlist_" + ToString(ID) + "");
if (parent != NULL)
{
parent->addChild(gridList);
gridList->setPosition(CEGUI::UVector2(CEGUI::UDim(x / (parent->getSize().d_width.d_scale * 1300), 0.0f), CEGUI::UDim(y / (parent->getSize().d_height.d_scale * 900), 0.0f)));
gridList->setSize(CEGUI::USize(CEGUI::UDim(sx / (parent->getSize().d_width.d_scale * 1300), 0.0f), CEGUI::UDim(sy / (parent->getSize().d_height.d_scale * 900), 0.0f)));
}
else
{
GUI.Root->addChild(gridList);
gridList->setPosition(CEGUI::UVector2(CEGUI::UDim(x / 1300, 0.0f), CEGUI::UDim(y / 900, 0.0f)));
gridList->setSize(CEGUI::USize(CEGUI::UDim(sx / 1300, 0.0f), CEGUI::UDim(sy / 900, 0.0f)));
}
CWindow = gridList;
CListbox = static_cast<CEGUI::ItemListbox*>(CWindow);
cout << CListbox << endl;
CListbox->subscribeEvent(CEGUI::ItemListbox::EventMouseDoubleClick, CEGUI::Event::Subscriber(&Gridlist::OnClick, this));
ID++;
return *this;
}
and this is the classes I use to create grid etc..
Code: Select all
class Gridlist
{
private:
bool OnClick(const CEGUI::EventArgs& args)
{
CEGUI::String ItemName = CListbox->getFirstSelectedItem()->getText();
cout << "Gridlist: " << CListbox << " - Clicked Item: " << ItemName << endl;
return false;
}
public:
int ID;
CEGUI::Window* CWindow;
CEGUI::ItemListbox* CListbox; ///CWindow Converted to ListBox (CEGUI)
vector<CEGUI::String> Items;
Gridlist CGridlist(float x, float y, float sx, float sy, CEGUI::Window* parent);
void AddItem(CEGUI::String itemText)
{
CEGUI::Window* item = CEGUI::WindowManager::getSingleton().createWindow("TaharezLook/ListboxItem", "Item_" + ToString(Items.size()));
item->setPosition(CEGUI::UVector2(CEGUI::UDim(0.0f, 0.0f), CEGUI::UDim(Items.size() * 30.0f, 0.0f)));
item->setSize(CEGUI::USize(CEGUI::UDim(CWindow->getSize().d_width.d_scale * 1300, 0.0f), CEGUI::UDim(CEGUI::UDim(30.0f, 0.0f))));
item->setText(itemText);
CWindow->addChild(item);
CListbox->addItem(static_cast<CEGUI::ItemEntry*>(item));
Items.push_back(itemText); ///ADDING NEW ITEM TO GRIDLIST
}
};
class GUI_t : public Gridlist
{
public:
bool Initialized = false;
void OnClientRender();
CEGUI::Window* Root;
///MAIN FUNCTIONS
CEGUI::Window* CWindow(CEGUI::String text, float x, float y, float sx, float sy, Color color, CEGUI::String font, CEGUI::Window* parent);
CEGUI::Window* CButton(CEGUI::String text, float x, float y, float sx, float sy, Color color, CEGUI::String font, CEGUI::Window* parent);
CEGUI::Window* CLabel(CEGUI::String text, float x, float y, float sx, float sy, Color color, CEGUI::String font, CEGUI::String horzAlign, CEGUI::String vertAlign, CEGUI::Window* parent);
CEGUI::Window* CCheckBox(CEGUI::String text, float x, float y, float sx, float sy, Color color, CEGUI::String font, CEGUI::Window* parent);
CEGUI::Window* CProgressBar(float x, float y, float sx, float sy, Color color, float progress, CEGUI::Window* parent);
private:
bool Event_Clicked (const CEGUI::EventArgs& args)
{
cout << "Button Clicked: " << args.handled << endl;
return false;
}
bool Event_CheckBox(const CEGUI::EventArgs& args)
{
cout << "Checkbox Clicked: " << args.handled << endl;
return false;
}
};
I use this to create the grids:
Code: Select all
Gridlist grid = GUI.CGridlist(170, 160, 100, 130, Windows[0]);
grid.AddItem("Item 1");
grid.AddItem("Item 2");
grid.AddItem("Item 3");
grid.AddItem("Item 4");
grid.AddItem("Item 5");
grid.AddItem("Item 6");
Gridlist grid2 = GUI.CGridlist(50, 200, 100, 130, Windows[0]);
grid2.AddItem("Other 1");
grid2.AddItem("Other 2");
grid2.AddItem("Other 3");
It is supposed to add 2 events to each listbox but no, it only works with the last listbox created. Obviously I want to create many classes as GUI elements there are, buttons, checkboxes... So I need this to work. I don't know why this happens... Any idea how to do this correctly?