Update menus on element change from lua, addresses issue #42

This commit is contained in:
Simon Robertshaw 2012-08-03 00:47:39 +01:00
parent 94bb1ad2df
commit b165619266
4 changed files with 86 additions and 62 deletions

View File

@ -543,6 +543,8 @@ int luacon_element_getproperty(char * key, int * format, unsigned int * modified
if (strcmp(key, "name")==0){ if (strcmp(key, "name")==0){
offset = offsetof(Element, Name); offset = offsetof(Element, Name);
*format = 2; *format = 2;
if(modified_stuff)
*modified_stuff |= LUACON_EL_MODIFIED_MENUS;
} }
else if (strcmp(key, "color")==0){ else if (strcmp(key, "color")==0){
offset = offsetof(Element, Colour); offset = offsetof(Element, Colour);
@ -651,6 +653,8 @@ int luacon_element_getproperty(char * key, int * format, unsigned int * modified
else if (strcmp(key, "description")==0){ else if (strcmp(key, "description")==0){
offset = offsetof(Element, Description); offset = offsetof(Element, Description);
*format = 2; *format = 2;
if(modified_stuff)
*modified_stuff |= LUACON_EL_MODIFIED_MENUS;
} }
else { else {
return -1; return -1;
@ -761,8 +765,8 @@ int luacon_elementwrite(lua_State* l){
} }
if (modified_stuff) if (modified_stuff)
{ {
//if (modified_stuff & LUACON_EL_MODIFIED_MENUS) if (modified_stuff & LUACON_EL_MODIFIED_MENUS)
//luacon_model->notifyMenuListChanged(); luacon_model->BuildMenus();
if (modified_stuff & LUACON_EL_MODIFIED_CANMOVE) if (modified_stuff & LUACON_EL_MODIFIED_CANMOVE)
luacon_sim->init_can_move(); luacon_sim->init_can_move();
if (modified_stuff & LUACON_EL_MODIFIED_GRAPHICS) if (modified_stuff & LUACON_EL_MODIFIED_GRAPHICS)

View File

@ -16,7 +16,7 @@ extern "C"
} }
#include "CommandInterface.h" #include "CommandInterface.h"
#include "simulation/Simulation.h"; #include "simulation/Simulation.h"
//Because lua only has bindings for C, we're going to have to go outside "outside" the LuaScriptInterface, this means we can only have one instance :( //Because lua only has bindings for C, we're going to have to go outside "outside" the LuaScriptInterface, this means we can only have one instance :(

View File

@ -52,11 +52,84 @@ GameModel::GameModel():
} }
//Load last user
if(Client::Ref().GetAuthUser().ID)
{
currentUser = Client::Ref().GetAuthUser();
}
//Set stamp to first stamp in list
vector<string> stamps = Client::Ref().GetStamps(0, 1);
if(stamps.size()>0)
{
SaveFile * stampFile = Client::Ref().GetStamp(stamps[0]);
if(stampFile && stampFile->GetGameSave())
stamp = stampFile->GetGameSave();
}
BuildMenus();
//Set default decoration colour
unsigned char colourR = min(Client::Ref().GetPrefInteger("Decoration.Red", 200), 255);
unsigned char colourG = min(Client::Ref().GetPrefInteger("Decoration.Green", 100), 255);
unsigned char colourB = min(Client::Ref().GetPrefInteger("Decoration.Blue", 50), 255);
unsigned char colourA = min(Client::Ref().GetPrefInteger("Decoration.Alpha", 255), 255);
SetColourSelectorColour(ui::Colour(colourR, colourG, colourB, colourA));
}
GameModel::~GameModel()
{
//Save to config:
Client::Ref().SetPref("Renderer.ColourMode", (double)ren->GetColourMode());
std::vector<unsigned int> displayModes = ren->GetDisplayMode();
Client::Ref().SetPref("Renderer.DisplayModes", std::vector<double>(displayModes.begin(), displayModes.end()));
std::vector<unsigned int> renderModes = ren->GetRenderMode();
Client::Ref().SetPref("Renderer.RenderModes", std::vector<double>(renderModes.begin(), renderModes.end()));
Client::Ref().SetPref("Decoration.Red", (int)colour.Red);
Client::Ref().SetPref("Decoration.Green", (int)colour.Green);
Client::Ref().SetPref("Decoration.Blue", (int)colour.Blue);
Client::Ref().SetPref("Decoration.Alpha", (int)colour.Alpha);
for(int i = 0; i < menuList.size(); i++)
{
delete menuList[i];
}
for(int i = 0; i < brushList.size(); i++)
{
delete brushList[i];
}
delete sim;
delete ren;
if(clipboard)
delete clipboard;
if(stamp)
delete stamp;
if(currentSave)
delete currentSave;
//if(activeTools)
// delete[] activeTools;
}
void GameModel::BuildMenus()
{
//Empty current menus
for(std::vector<Menu*>::iterator iter = menuList.begin(), end = menuList.end(); iter != end; ++iter)
{
delete *iter;
}
menuList.clear(); menuList.clear();
toolList.clear();
//Create menus
for(int i = 0; i < SC_TOTAL; i++) for(int i = 0; i < SC_TOTAL; i++)
{ {
menuList.push_back(new Menu((const char)sim->msections[i].icon[0], sim->msections[i].name)); menuList.push_back(new Menu((const char)sim->msections[i].icon[0], sim->msections[i].name));
} }
//Build menus from Simulation elements //Build menus from Simulation elements
for(int i = 0; i < PT_NUM; i++) for(int i = 0; i < PT_NUM; i++)
{ {
@ -119,70 +192,15 @@ GameModel::GameModel():
//Set default tools //Set default tools
activeTools[0] = menuList[SC_POWDERS]->GetToolList()[0]; activeTools[0] = menuList[SC_POWDERS]->GetToolList()[0];
activeTools[1] = menuList[SC_SPECIAL]->GetToolList()[0]; activeTools[1] = menuList[SC_SPECIAL]->GetToolList()[0];
activeTools[2] = NULL;
//Set default menu //Set default menu
activeMenu = menuList[SC_POWDERS]; activeMenu = menuList[SC_POWDERS];
toolList = menuList[SC_POWDERS]->GetToolList(); toolList = menuList[SC_POWDERS]->GetToolList();
//Load last user notifyMenuListChanged();
if(Client::Ref().GetAuthUser().ID) notifyToolListChanged();
{ notifyActiveToolsChanged();
currentUser = Client::Ref().GetAuthUser();
}
//Set stamp to first stamp in list
vector<string> stamps = Client::Ref().GetStamps(0, 1);
if(stamps.size()>0)
{
SaveFile * stampFile = Client::Ref().GetStamp(stamps[0]);
if(stampFile && stampFile->GetGameSave())
stamp = stampFile->GetGameSave();
}
//Set default decoration colour
unsigned char colourR = min(Client::Ref().GetPrefInteger("Decoration.Red", 200), 255);
unsigned char colourG = min(Client::Ref().GetPrefInteger("Decoration.Green", 100), 255);
unsigned char colourB = min(Client::Ref().GetPrefInteger("Decoration.Blue", 50), 255);
unsigned char colourA = min(Client::Ref().GetPrefInteger("Decoration.Alpha", 255), 255);
SetColourSelectorColour(ui::Colour(colourR, colourG, colourB, colourA));
}
GameModel::~GameModel()
{
//Save to config:
Client::Ref().SetPref("Renderer.ColourMode", (double)ren->GetColourMode());
std::vector<unsigned int> displayModes = ren->GetDisplayMode();
Client::Ref().SetPref("Renderer.DisplayModes", std::vector<double>(displayModes.begin(), displayModes.end()));
std::vector<unsigned int> renderModes = ren->GetRenderMode();
Client::Ref().SetPref("Renderer.RenderModes", std::vector<double>(renderModes.begin(), renderModes.end()));
Client::Ref().SetPref("Decoration.Red", (int)colour.Red);
Client::Ref().SetPref("Decoration.Green", (int)colour.Green);
Client::Ref().SetPref("Decoration.Blue", (int)colour.Blue);
Client::Ref().SetPref("Decoration.Alpha", (int)colour.Alpha);
for(int i = 0; i < menuList.size(); i++)
{
delete menuList[i];
}
for(int i = 0; i < brushList.size(); i++)
{
delete brushList[i];
}
delete sim;
delete ren;
if(clipboard)
delete clipboard;
if(stamp)
delete stamp;
if(currentSave)
delete currentSave;
//if(activeTools)
// delete[] activeTools;
} }
void GameModel::SetVote(int direction) void GameModel::SetVote(int direction)

View File

@ -91,6 +91,8 @@ public:
std::string GetToolTip(); std::string GetToolTip();
std::string GetInfoTip(); std::string GetInfoTip();
void BuildMenus();
void SetVote(int direction); void SetVote(int direction);
SaveInfo * GetSave(); SaveInfo * GetSave();
Brush * GetBrush(); Brush * GetBrush();