redoing gui stuff

This commit is contained in:
Perttu Ahola 2010-12-23 15:31:50 +02:00
parent a55850e4dc
commit 2816d8f638
7 changed files with 252 additions and 329 deletions

@ -22,9 +22,9 @@ IRRLICHTPATH = ../irrlicht/irrlicht-1.7.1
JTHREADPATH = ../jthread/jthread-1.2.1 JTHREADPATH = ../jthread/jthread-1.2.1
#CXXFLAGS = -O2 -ffast-math -Wall -fomit-frame-pointer -pipe #CXXFLAGS = -O2 -ffast-math -Wall -fomit-frame-pointer -pipe
CXXFLAGS = -O2 -ffast-math -Wall -g -pipe #CXXFLAGS = -O2 -ffast-math -Wall -g -pipe
#CXXFLAGS = -O1 -ffast-math -Wall -g #CXXFLAGS = -O1 -ffast-math -Wall -g
#CXXFLAGS = -Wall -g -O0 CXXFLAGS = -Wall -g -O0
all: fast_linux all: fast_linux

@ -77,17 +77,14 @@ void drawInventoryItem(gui::IGUIEnvironment* env,
GUIInventoryMenu::GUIInventoryMenu(gui::IGUIEnvironment* env, GUIInventoryMenu::GUIInventoryMenu(gui::IGUIEnvironment* env,
gui::IGUIElement* parent, s32 id, gui::IGUIElement* parent, s32 id,
Inventory *inventory): Inventory *inventory,
IGUIElement(gui::EGUIET_ELEMENT, env, parent, id, Queue<InventoryAction*> *actions,
core::rect<s32>(0,0,100,100)) int *active_menu_count):
GUIModalMenu(env, parent, id, active_menu_count)
{ {
m_inventory = inventory; m_inventory = inventory;
m_screensize_old = v2u32(0,0);
m_selected_item = NULL; m_selected_item = NULL;
m_actions = actions;
resizeGui();
setVisible(false);
/*m_selected_item = new ItemSpec; /*m_selected_item = new ItemSpec;
m_selected_item->listname = "main"; m_selected_item->listname = "main";
@ -100,14 +97,8 @@ GUIInventoryMenu::~GUIInventoryMenu()
delete m_selected_item; delete m_selected_item;
} }
void GUIInventoryMenu::resizeGui() void GUIInventoryMenu::regenerateGui(v2u32 screensize)
{ {
video::IVideoDriver* driver = Environment->getVideoDriver();
v2u32 screensize = driver->getScreenSize();
if(screensize == m_screensize_old)
return;
m_screensize_old = screensize;
padding = v2s32(24,24); padding = v2s32(24,24);
spacing = v2s32(60,56); spacing = v2s32(60,56);
imgsize = v2s32(48,48); imgsize = v2s32(48,48);
@ -194,11 +185,8 @@ void GUIInventoryMenu::drawList(const ListDrawSpec &s)
} }
} }
void GUIInventoryMenu::draw() void GUIInventoryMenu::drawMenu()
{ {
if(!IsVisible)
return;
gui::IGUISkin* skin = Environment->getSkin(); gui::IGUISkin* skin = Environment->getSkin();
if (!skin) if (!skin)
return; return;
@ -229,12 +217,12 @@ bool GUIInventoryMenu::OnEvent(const SEvent& event)
{ {
if(event.KeyInput.Key==KEY_ESCAPE && event.KeyInput.PressedDown) if(event.KeyInput.Key==KEY_ESCAPE && event.KeyInput.PressedDown)
{ {
setVisible(false); quitMenu();
return true; return true;
} }
if(event.KeyInput.Key==KEY_KEY_I && event.KeyInput.PressedDown) if(event.KeyInput.Key==KEY_KEY_I && event.KeyInput.PressedDown)
{ {
setVisible(false); quitMenu();
return true; return true;
} }
} }
@ -265,7 +253,7 @@ bool GUIInventoryMenu::OnEvent(const SEvent& event)
a->from_i = m_selected_item->i; a->from_i = m_selected_item->i;
a->to_name = s.listname; a->to_name = s.listname;
a->to_i = s.i; a->to_i = s.i;
m_actions.push_back(a); m_actions->push_back(a);
} }
delete m_selected_item; delete m_selected_item;
m_selected_item = NULL; m_selected_item = NULL;
@ -322,11 +310,5 @@ bool GUIInventoryMenu::OnEvent(const SEvent& event)
return Parent ? Parent->OnEvent(event) : false; return Parent ? Parent->OnEvent(event) : false;
} }
InventoryAction* GUIInventoryMenu::getNextAction()
{
if(m_actions.size() == 0)
return NULL;
return m_actions.pop_front();
}

@ -24,12 +24,13 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "common_irrlicht.h" #include "common_irrlicht.h"
#include "inventory.h" #include "inventory.h"
#include "utility.h" #include "utility.h"
#include "modalMenu.h"
void drawInventoryItem(gui::IGUIEnvironment* env, void drawInventoryItem(gui::IGUIEnvironment* env,
InventoryItem *item, core::rect<s32> rect, InventoryItem *item, core::rect<s32> rect,
const core::rect<s32> *clip=0); const core::rect<s32> *clip=0);
class GUIInventoryMenu : public gui::IGUIElement class GUIInventoryMenu : public GUIModalMenu
{ {
struct ItemSpec struct ItemSpec
{ {
@ -71,35 +72,22 @@ class GUIInventoryMenu : public gui::IGUIElement
public: public:
GUIInventoryMenu(gui::IGUIEnvironment* env, GUIInventoryMenu(gui::IGUIEnvironment* env,
gui::IGUIElement* parent, s32 id, gui::IGUIElement* parent, s32 id,
Inventory *inventory); Inventory *inventory,
Queue<InventoryAction*> *actions,
int *active_menu_count);
~GUIInventoryMenu(); ~GUIInventoryMenu();
/* /*
Remove and re-add (or reposition) stuff Remove and re-add (or reposition) stuff
*/ */
void resizeGui(); void regenerateGui(v2u32 screensize);
ItemSpec getItemAtPos(v2s32 p) const; ItemSpec getItemAtPos(v2s32 p) const;
void drawList(const ListDrawSpec &s); void drawList(const ListDrawSpec &s);
void draw(); void drawMenu();
void launch()
{
setVisible(true);
Environment->setFocus(this);
}
bool canTakeFocus(gui::IGUIElement *e)
{
return (e && (e == this || isMyChild(e)));
}
bool OnEvent(const SEvent& event); bool OnEvent(const SEvent& event);
// Actions returned by this are sent to the server.
// Server replies by updating the inventory.
InventoryAction* getNextAction();
private: private:
v2s32 getBasePos() const v2s32 getBasePos() const
{ {
@ -113,11 +101,9 @@ private:
core::array<ListDrawSpec> m_draw_positions; core::array<ListDrawSpec> m_draw_positions;
Inventory *m_inventory; Inventory *m_inventory;
v2u32 m_screensize_old;
ItemSpec *m_selected_item; ItemSpec *m_selected_item;
Queue<InventoryAction*> *m_actions;
Queue<InventoryAction*> m_actions;
}; };
#endif #endif

@ -1,8 +1,6 @@
/* /*
Minetest-c55 Minetest-c55
Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com> Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com>
Original author Kabak Dmitry <userdima@gmail.com>, contributed under
the minetest contributor agreement.
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@ -26,33 +24,20 @@ with this program; if not, write to the Free Software Foundation, Inc.,
GUIPauseMenu::GUIPauseMenu(gui::IGUIEnvironment* env, GUIPauseMenu::GUIPauseMenu(gui::IGUIEnvironment* env,
gui::IGUIElement* parent, s32 id, gui::IGUIElement* parent, s32 id,
IrrlichtDevice *dev): IrrlichtDevice *dev,
IGUIElement(gui::EGUIET_ELEMENT, env, parent, id, int *active_menu_count):
core::rect<s32>(0,0,100,100)) GUIModalMenu(env, parent, id, active_menu_count)
{ {
m_dev = dev; m_dev = dev;
m_screensize_old = v2u32(0,0);
resizeGui();
setVisible(false);
} }
GUIPauseMenu::~GUIPauseMenu() GUIPauseMenu::~GUIPauseMenu()
{ {
removeChildren();
} }
void GUIPauseMenu::resizeGui() void GUIPauseMenu::removeChildren()
{ {
video::IVideoDriver* driver = Environment->getVideoDriver();
v2u32 screensize = driver->getScreenSize();
if(screensize == m_screensize_old)
return;
m_screensize_old = screensize;
/*
Remove stuff
*/
{ {
gui::IGUIElement *e = getElementFromId(256); gui::IGUIElement *e = getElementFromId(256);
if(e != NULL) if(e != NULL)
@ -73,7 +58,18 @@ void GUIPauseMenu::resizeGui()
if(e != NULL) if(e != NULL)
e->remove(); e->remove();
} }
}
void GUIPauseMenu::regenerateGui(v2u32 screensize)
{
/*
Remove stuff
*/
removeChildren();
/*
Calculate new sizes and positions
*/
core::rect<s32> rect( core::rect<s32> rect(
screensize.X/2 - 580/2, screensize.X/2 - 580/2,
screensize.Y/2 - 300/2, screensize.Y/2 - 300/2,
@ -129,11 +125,8 @@ void GUIPauseMenu::resizeGui()
} }
} }
void GUIPauseMenu::draw() void GUIPauseMenu::drawMenu()
{ {
if(!IsVisible)
return;
gui::IGUISkin* skin = Environment->getSkin(); gui::IGUISkin* skin = Environment->getSkin();
if (!skin) if (!skin)
return; return;
@ -151,7 +144,7 @@ bool GUIPauseMenu::OnEvent(const SEvent& event)
{ {
if(event.KeyInput.Key==KEY_ESCAPE && event.KeyInput.PressedDown) if(event.KeyInput.Key==KEY_ESCAPE && event.KeyInput.PressedDown)
{ {
setVisible(false); quitMenu();
return true; return true;
} }
} }
@ -173,7 +166,7 @@ bool GUIPauseMenu::OnEvent(const SEvent& event)
switch(event.GUIEvent.Caller->getID()) switch(event.GUIEvent.Caller->getID())
{ {
case 256: // continue case 256: // continue
setVisible(false); quitMenu();
break; break;
case 257: // exit case 257: // exit
m_dev->closeDevice(); m_dev->closeDevice();
@ -185,104 +178,3 @@ bool GUIPauseMenu::OnEvent(const SEvent& event)
return Parent ? Parent->OnEvent(event) : false; return Parent ? Parent->OnEvent(event) : false;
} }
#if 0
GUIPauseMenu::GUIPauseMenu(IrrlichtDevice *device, IEventReceiver *recv):
dev(device),
oldRecv(recv)
{
if(!dev)
return;
guienv=dev->getGUIEnvironment();
if (!loadMenu())
return;
device->setEventReceiver(this); // now WE are the input receiver! ahhaha!
}
GUIPauseMenu::~GUIPauseMenu(void)
{
}
void GUIPauseMenu::scaleGui() // this function scales gui from the size stored in file to screen size
{
core::dimension2du screen=dev->getVideoDriver()->getScreenSize();
core::vector2di real=root->getAbsolutePosition().LowerRightCorner; // determine gui size stored in file (which is size of my menu root node)
float factorX=(float)screen.Width/(float)real.X;
float factorY=(float)screen.Height/(float)real.Y;
scaleGui(guienv->getRootGUIElement(),factorX,factorY);
}
void GUIPauseMenu::scaleGui(gui::IGUIElement *node,float factorX,float factorY) // recursive set scale
{
if((node->getParent() && node->getParent()->getID()==255) || node->getID()==255) // modify only menu's elements
{
int lx,rx,ly,ry;
lx=(float)node->getRelativePosition().UpperLeftCorner.X*factorX;
ly=(float)node->getRelativePosition().UpperLeftCorner.Y*factorY;
rx=(float)node->getRelativePosition().LowerRightCorner.X*factorX;
ry=(float)node->getRelativePosition().LowerRightCorner.Y*factorY;
node->setRelativePosition(core::recti(lx,ly,rx,ry));
}
core::list<gui::IGUIElement*>::ConstIterator it = node->getChildren().begin();
for(; it != node->getChildren().end(); ++it)
scaleGui((*it),factorX,factorY);
}
bool GUIPauseMenu::loadMenu()
{
guienv->loadGUI("../data/pauseMenu.gui");
root=(gui::IGUIStaticText*)guienv->getRootGUIElement()->getElementFromId(255,true);
if(!root) // if there is no my root node then menu file not found or corrupted
return false;
scaleGui(); // scale gui to our screen size
root->setVisible(false); // hide our menu
// make it transparent
//root->setBackgroundColor(video::SColor(100,128,100,128));
root->setBackgroundColor(video::SColor(140,0,0,0));
return true;
}
bool GUIPauseMenu::OnEvent(const SEvent& event)
{
if(!dev->isWindowFocused())
setVisible(true);
bool ret=false;
if(oldRecv && !isVisible()) // call master if we have it and if we are inactive
ret=oldRecv->OnEvent(event);
if(ret==true)
return true; // if the master receiver does the work
if(event.EventType==EET_KEY_INPUT_EVENT)
{
if(event.KeyInput.Key==KEY_ESCAPE && event.KeyInput.PressedDown)
{
setVisible(!isVisible());
}
}
if(event.EventType==EET_GUI_EVENT)
{
if(event.GUIEvent.EventType==gui::EGET_BUTTON_CLICKED)
{
switch(event.GUIEvent.Caller->getID())
{
case 256: // continue
setVisible(false);
break;
case 257: // exit
dev->closeDevice();
break;
}
}
}
return false;
}
#endif

@ -1,8 +1,6 @@
/* /*
Minetest-c55 Minetest-c55
Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com> Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com>
Original author Kabak Dmitry <userdima@gmail.com>, contributed under
the minetest contributor agreement.
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@ -24,63 +22,30 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#define GUIPAUSEMENU_HEADER #define GUIPAUSEMENU_HEADER
#include "common_irrlicht.h" #include "common_irrlicht.h"
#include "modalMenu.h"
class GUIPauseMenu : public gui::IGUIElement class GUIPauseMenu : public GUIModalMenu
{ {
public: public:
GUIPauseMenu(gui::IGUIEnvironment* env, GUIPauseMenu(gui::IGUIEnvironment* env,
gui::IGUIElement* parent, s32 id, gui::IGUIElement* parent, s32 id,
IrrlichtDevice *dev); IrrlichtDevice *dev,
int *active_menu_count);
~GUIPauseMenu(); ~GUIPauseMenu();
void removeChildren();
/* /*
Remove and re-add (or reposition) stuff Remove and re-add (or reposition) stuff
*/ */
void resizeGui(); void regenerateGui(v2u32 screensize);
void draw(); void drawMenu();
void launch()
{
setVisible(true);
Environment->setFocus(this);
}
bool canTakeFocus(gui::IGUIElement *e)
{
return (e && (e == this || isMyChild(e)));
}
bool OnEvent(const SEvent& event); bool OnEvent(const SEvent& event);
private: private:
IrrlichtDevice *m_dev; IrrlichtDevice *m_dev;
v2u32 m_screensize_old;
}; };
/*class GUIPauseMenu : public IEventReceiver
{
public:
void scaleGui();
GUIPauseMenu(IrrlichtDevice *device,IEventReceiver *recv);
~GUIPauseMenu(void);
void setVisible(bool visible){root->setVisible(visible);};
bool isVisible(){return root->isVisible();};
bool OnEvent(const SEvent& event);
private:
bool loadMenu();
void scaleGui(gui::IGUIElement *node,float factorX,float factorY);
IrrlichtDevice *dev;
gui::IGUIEnvironment *guienv;
IEventReceiver *oldRecv;
gui::IGUIStaticText *root;
};*/
#endif #endif

@ -268,22 +268,25 @@ extern void set_default_settings();
//u16 g_selected_material = 0; //u16 g_selected_material = 0;
u16 g_selected_item = 0; u16 g_selected_item = 0;
IrrlichtDevice *g_device = NULL;
/* /*
GUI Stuff GUI Stuff
*/ */
gui::IGUIEnvironment* guienv = NULL; gui::IGUIEnvironment* guienv = NULL;
GUIPauseMenu *pauseMenu = NULL; gui::IGUIStaticText *guiroot = NULL;
GUIInventoryMenu *inventoryMenu = NULL; int g_active_menu_count = 0;
bool noMenuActive() bool noMenuActive()
{ {
if(pauseMenu && pauseMenu->isVisible()) return (g_active_menu_count == 0);
return false;
if(inventoryMenu && inventoryMenu->isVisible())
return false;
return true;
} }
// Inventory actions from the menu are buffered here before sending
Queue<InventoryAction*> inventory_action_queue;
// This is a copy of the inventory that the client's environment has
Inventory local_inventory;
std::wstring g_text_buffer; std::wstring g_text_buffer;
bool g_text_buffer_accepted = false; bool g_text_buffer_accepted = false;
@ -360,7 +363,8 @@ public:
} }
} }
if(pauseMenu != NULL) //if(pauseMenu != NULL)
if(guienv != NULL && guiroot != NULL && g_device != NULL)
{ {
if(event.KeyInput.Key == irr::KEY_ESCAPE) if(event.KeyInput.Key == irr::KEY_ESCAPE)
{ {
@ -368,13 +372,18 @@ public:
{ {
dstream<<DTIME<<"MyEventReceiver: " dstream<<DTIME<<"MyEventReceiver: "
<<"Launching pause menu"<<std::endl; <<"Launching pause menu"<<std::endl;
pauseMenu->launch(); // It will delete itself by itself
GUIPauseMenu *menu = new
GUIPauseMenu(guienv, guiroot, -1, g_device,
&g_active_menu_count);
menu->drop();
return true; return true;
} }
} }
} }
if(inventoryMenu != NULL) //if(inventoryMenu != NULL)
if(guienv != NULL && guiroot != NULL && g_device != NULL)
{ {
if(event.KeyInput.Key == irr::KEY_KEY_I) if(event.KeyInput.Key == irr::KEY_KEY_I)
{ {
@ -382,7 +391,11 @@ public:
{ {
dstream<<DTIME<<"MyEventReceiver: " dstream<<DTIME<<"MyEventReceiver: "
<<"Launching inventory"<<std::endl; <<"Launching inventory"<<std::endl;
inventoryMenu->launch(); GUIInventoryMenu *inventoryMenu = new
GUIInventoryMenu(guienv, guiroot, -1,
&local_inventory, &inventory_action_queue,
&g_active_menu_count);
inventoryMenu->drop();
return true; return true;
} }
} }
@ -523,6 +536,7 @@ private:
bool keyIsDown[KEY_KEY_CODES_COUNT]; bool keyIsDown[KEY_KEY_CODES_COUNT];
//s32 mouseX; //s32 mouseX;
//s32 mouseY; //s32 mouseY;
IrrlichtDevice *m_device;
}; };
class InputHandler class InputHandler
@ -997,6 +1011,68 @@ private:
s32 m_selection; s32 m_selection;
}; };
/*
Text input system
*/
struct TextDest
{
virtual void sendText(std::string text) = 0;
};
struct TextDestSign : public TextDest
{
TextDestSign(v3s16 blockpos, s16 id, Client *client)
{
m_blockpos = blockpos;
m_id = id;
m_client = client;
}
void sendText(std::string text)
{
dstream<<"Changing text of a sign object: "
<<text<<std::endl;
m_client->sendSignText(m_blockpos, m_id, text);
}
v3s16 m_blockpos;
s16 m_id;
Client *m_client;
};
struct TextInput
{
TextDest *dest;
gui::IGUIStaticText* guitext;
/*std::wstring buffer;
bool buffer_accepted;*/
TextInput()
{
dest = NULL;
guitext = NULL;
//buffer_accepted = false;
}
void start(TextDest *a_dest)
{
unFocusGame();
guitext = guienv->addStaticText(L"",
core::rect<s32>(150,100,550,120),
true, // border?
false, // wordwrap?
NULL);
guitext->setDrawBackground(true);
g_text_buffer = L"";
g_text_buffer_accepted = false;
dest = a_dest;
}
};
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
/* /*
@ -1306,6 +1382,7 @@ int main(int argc, char *argv[])
if (device == 0) if (device == 0)
return 1; // could not create selected driver. return 1; // could not create selected driver.
g_device = device;
g_irrlicht = new IrrlichtWrapper(device); g_irrlicht = new IrrlichtWrapper(device);
//g_device = device; //g_device = device;
@ -1362,34 +1439,10 @@ int main(int argc, char *argv[])
driver->endScene(); driver->endScene();
/* /*
Preload some random textures that are used in threads Preload some textures
*/ */
#if 0
g_texturecache.set("torch", driver->getTexture("../data/torch.png"));
g_texturecache.set("torch_on_floor", driver->getTexture("../data/torch_on_floor.png"));
g_texturecache.set("torch_on_ceiling", driver->getTexture("../data/torch_on_ceiling.png"));
g_texturecache.set("crack", driver->getTexture("../data/crack.png"));
/*
Load tile textures
*/
for(s32 i=0; i<TILES_COUNT; i++)
{
if(g_tile_texture_names[i] == NULL)
continue;
std::string name = g_tile_texture_names[i];
std::string filename;
filename += "../data/";
filename += name;
filename += ".png";
g_texturecache.set(name, driver->getTexture(filename.c_str()));
}
#endif
//tile_materials_preload(g_texturecache);
tile_materials_preload(g_irrlicht); tile_materials_preload(g_irrlicht);
//tile_materials_init();
/* /*
Make a scope here for the client so that it gets removed Make a scope here for the client so that it gets removed
@ -1492,8 +1545,8 @@ int main(int argc, char *argv[])
Add some gui stuff Add some gui stuff
*/ */
// This is a copy of the inventory that the client's environment has // Text input system
Inventory local_inventory; TextInput text_input;
GUIQuickInventory *quick_inventory = new GUIQuickInventory GUIQuickInventory *quick_inventory = new GUIQuickInventory
(guienv, NULL, v2s32(10, 70), 5, &local_inventory); (guienv, NULL, v2s32(10, 70), 5, &local_inventory);
@ -1503,16 +1556,17 @@ int main(int argc, char *argv[])
custom elements directly on the screen. custom elements directly on the screen.
Otherwise they won't be automatically drawn. Otherwise they won't be automatically drawn.
*/ */
gui::IGUIStaticText *root = guienv->addStaticText(L"", guiroot = guienv->addStaticText(L"",
core::rect<s32>(0, 0, 10000, 10000)); core::rect<s32>(0, 0, 10000, 10000));
// Pause menu // Pause menu
pauseMenu = new GUIPauseMenu(guienv, root, -1, device); //pauseMenu = new GUIPauseMenu(guienv, root, -1, device);
// Inventory menu // Inventory menu
inventoryMenu = new GUIInventoryMenu(guienv, root, -1, &local_inventory); /*inventoryMenu = new GUIInventoryMenu(guienv, guiroot, -1, &local_inventory,
&inventory_action_queue);*/
pauseMenu->launch(); //pauseMenu->launch();
//inventoryMenu->launch(); //inventoryMenu->launch();
// First line of debug text // First line of debug text
@ -1541,40 +1595,6 @@ int main(int argc, char *argv[])
u32 scenetime = 0; u32 scenetime = 0;
u32 endscenetime = 0; u32 endscenetime = 0;
/*
Text input system
*/
struct TextDest
{
virtual void sendText(std::string text) = 0;
};
struct TextDestSign : public TextDest
{
TextDestSign(v3s16 blockpos, s16 id, Client *client)
{
m_blockpos = blockpos;
m_id = id;
m_client = client;
}
void sendText(std::string text)
{
dstream<<"Changing text of a sign object: "
<<text<<std::endl;
m_client->sendSignText(m_blockpos, m_id, text);
}
v3s16 m_blockpos;
s16 m_id;
Client *m_client;
};
TextDest *textbuf_dest = NULL;
//gui::IGUIWindow* input_window = NULL;
gui::IGUIStaticText* input_guitext = NULL;
/* /*
Main loop Main loop
*/ */
@ -1599,8 +1619,8 @@ int main(int argc, char *argv[])
v2u32 screensize = driver->getScreenSize(); v2u32 screensize = driver->getScreenSize();
core::vector2d<s32> displaycenter(screensize.X/2,screensize.Y/2); core::vector2d<s32> displaycenter(screensize.X/2,screensize.Y/2);
pauseMenu->resizeGui(); /*pauseMenu->resizeGui();
inventoryMenu->resizeGui(); inventoryMenu->resizeGui();*/
// Hilight boxes collected during the loop and displayed // Hilight boxes collected during the loop and displayed
core::list< core::aabbox3d<f32> > hilightboxes; core::list< core::aabbox3d<f32> > hilightboxes;
@ -1921,31 +1941,16 @@ int main(int argc, char *argv[])
{ {
dstream<<"Sign object right-clicked"<<std::endl; dstream<<"Sign object right-clicked"<<std::endl;
unFocusGame(); text_input.start(new TextDestSign(
selected_object->getBlock()->getPos(),
input_guitext = guienv->addStaticText(L"", selected_object->getId(),
core::rect<s32>(150,100,350,120), &client));
true, // border?
false, // wordwrap?
NULL);
input_guitext->setDrawBackground(true);
if(random_input) if(random_input)
{ {
g_text_buffer = L"ASD LOL 8)"; g_text_buffer = L"ASD LOL 8)";
g_text_buffer_accepted = true; g_text_buffer_accepted = true;
} }
else
{
g_text_buffer = L"";
g_text_buffer_accepted = false;
}
textbuf_dest = new TextDestSign(
selected_object->getBlock()->getPos(),
selected_object->getId(),
&client);
} }
/* /*
Otherwise pass the event to the server as-is Otherwise pass the event to the server as-is
@ -2314,38 +2319,40 @@ int main(int argc, char *argv[])
/* /*
Send actions returned by the inventory menu Send actions returned by the inventory menu
*/ */
while(InventoryAction *a = inventoryMenu->getNextAction()) while(inventory_action_queue.size() != 0)
{ {
InventoryAction *a = inventory_action_queue.pop_front();
client.sendInventoryAction(a); client.sendInventoryAction(a);
// Eat it // Eat it
delete a; delete a;
} }
if(input_guitext != NULL) if(text_input.guitext != NULL)
{ {
/*wchar_t temptext[100]; /*wchar_t temptext[100];
swprintf(temptext, 100, swprintf(temptext, 100,
SWPRINTF_CHARSTRING, SWPRINTF_CHARSTRING,
g_text_buffer.substr(0,99).c_str() g_text_buffer.substr(0,99).c_str()
);*/ );*/
input_guitext->setText(g_text_buffer.c_str()); text_input.guitext->setText(g_text_buffer.c_str());
} }
/* /*
Text input stuff Text input stuff
*/ */
if(input_guitext != NULL && g_text_buffer_accepted) if(text_input.guitext != NULL && g_text_buffer_accepted)
{ {
input_guitext->remove(); text_input.guitext->remove();
input_guitext = NULL; text_input.guitext = NULL;
if(textbuf_dest != NULL) if(text_input.dest != NULL)
{ {
std::string text = wide_to_narrow(g_text_buffer); std::string text = wide_to_narrow(g_text_buffer);
dstream<<"Sending text: "<<text<<std::endl; dstream<<"Sending text: "<<text<<std::endl;
textbuf_dest->sendText(text); text_input.dest->sendText(text);
delete textbuf_dest; delete text_input.dest;
textbuf_dest = NULL; text_input.dest = NULL;
} }
focusGame(); focusGame();

91
src/modalMenu.h Normal file

@ -0,0 +1,91 @@
/*
Minetest-c55
Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef MODALMENU_HEADER
#define MODALMENU_HEADER
#include "common_irrlicht.h"
//TODO: Change GUIElement private
class GUIModalMenu : public gui::IGUIElement
{
public:
GUIModalMenu(gui::IGUIEnvironment* env,
gui::IGUIElement* parent, s32 id,
int *active_menu_count):
IGUIElement(gui::EGUIET_ELEMENT, env, parent, id,
core::rect<s32>(0,0,100,100))
{
m_active_menu_count = active_menu_count;
m_allow_focus_removal = false;
m_screensize_old = v2u32(0,0);
setVisible(true);
Environment->setFocus(this);
(*m_active_menu_count)++;
}
virtual ~GUIModalMenu()
{
(*m_active_menu_count)--;
}
bool canTakeFocus(gui::IGUIElement *e)
{
return (e && (e == this || isMyChild(e))) || m_allow_focus_removal;
}
void quitMenu()
{
m_allow_focus_removal = true;
// This removes Environment's grab on us
Environment->removeFocus(this);
this->remove();
}
virtual void regenerateGui(v2u32 screensize) = 0;
virtual void drawMenu() = 0;
void draw()
{
if(!IsVisible)
return;
video::IVideoDriver* driver = Environment->getVideoDriver();
v2u32 screensize = driver->getScreenSize();
if(screensize != m_screensize_old)
{
m_screensize_old = screensize;
regenerateGui(screensize);
}
drawMenu();
}
virtual bool OnEvent(const SEvent& event) { return false; };
private:
int *m_active_menu_count;
bool m_allow_focus_removal;
v2u32 m_screensize_old;
};
#endif