Start the properties sidebar

Currently works with x,y,z / x2,y2,z2 properties,
need to add nodebox name property.
master
rubenwardy 2014-02-11 20:03:02 +00:00
parent a359a33cb7
commit 66f008da28
6 changed files with 157 additions and 32 deletions

View File

@ -169,6 +169,9 @@ bool Editor::run(IrrlichtDevice* irr_device,Configuration* conf){
camera[3]=smgr->addCameraSceneNode(target,vector3df(-5,0,0),vector3df(0,0,0));
camera[3]->setProjectionMatrix(projMat,true);
}
if (GetState()->Mode())
GetState()->Mode()->update((1000.0/60.0));
}
return true;

View File

@ -57,7 +57,7 @@ public:
EditorMode(EditorState* st):_state(st){}
virtual void load() = 0;
virtual void unload() = 0;
virtual void update() = 0;
virtual void update(double dtime) = 0;
virtual void draw(irr::video::IVideoDriver* driver) = 0;
virtual void viewportTick(VIEWPORT window,irr::video::IVideoDriver* driver,rect<s32> offset) = 0;
virtual bool OnEvent(const irr::SEvent &event) = 0;

View File

@ -72,7 +72,7 @@ void MenuState::init(){
rect<s32>(
(GetState()->GetDevice()->getVideoDriver()->getScreenSize().Width - 246), top+10,
GetState()->GetDevice()->getVideoDriver()->getScreenSize().Width, GetState()->GetDevice()->getVideoDriver()->getScreenSize().Height
),false,true,0,GUI_SIDEBAR_TITLE
),false,true,0,GUI_SIDEBAR
);
_sidebar->setAlignment(EGUIA_LOWERRIGHT,EGUIA_LOWERRIGHT,EGUIA_UPPERLEFT,EGUIA_UPPERLEFT);
}

View File

@ -39,6 +39,7 @@
// --> Help Index
// --> About
#define SIDEBAR_MAX_IDS 20
enum GUI_ID
{
// File
@ -65,20 +66,18 @@ enum GUI_ID
// Tools
GUI_PROJ_NEW_BOX = 216,
GUI_PROJ_DELETE_BOX = 217,
GUI_PROJ_LIST_AREA = 240,
GUI_PROJ_LIST_AREA = 240 + SIDEBAR_MAX_IDS,
// Help
GUI_HELP_HELP =218,
GUI_HELP_HELP = 218,
GUI_HELP_ABOUT = 219,
// Sidebar
GUI_SIDEBAR_TITLE = 220,
GUI_SIDEBAR_LISTBOX = 221,
GUI_SIDEBAR_LABEL = 222,
GUI_SIDEBAR = 220,
// File Dialog
GUI_FILEDIALOG_PATH = 223,
GUI_FILEDIALOG_FORM = 224
GUI_FILEDIALOG_PATH = 220 + SIDEBAR_MAX_IDS,
GUI_FILEDIALOG_FORM = 221 + SIDEBAR_MAX_IDS
};
class EditorState;

View File

@ -1,7 +1,25 @@
#include "NBEditor.h"
// The gui id numbers for this mode
// NOTE: the maximum that can be here is 20
// see in MenuState.h to raise limit
enum ENB_GUI{
ENB_GUI_MAIN_LISTBOX = GUI_SIDEBAR + 1,
ENB_GUI_MAIN_MSG = GUI_SIDEBAR + 2,
ENB_GUI_PROP = GUI_SIDEBAR + 3,
ENB_GUI_PROP_X1 = GUI_SIDEBAR + 4,
ENB_GUI_PROP_Y1 = GUI_SIDEBAR + 5,
ENB_GUI_PROP_Z1 = GUI_SIDEBAR + 6,
ENB_GUI_PROP_X2 = GUI_SIDEBAR + 7,
ENB_GUI_PROP_Y2 = GUI_SIDEBAR + 8,
ENB_GUI_PROP_Z2 = GUI_SIDEBAR + 9,
ENB_GUI_PROP_NAME = GUI_SIDEBAR + 19,
ENB_GUI_PROP_UPDATE = GUI_SIDEBAR + 11,
ENB_GUI_PROP_REVERT = GUI_SIDEBAR + 12
};
NBEditor::NBEditor(EditorState* st)
:EditorMode(st),current(-1)
:EditorMode(st),current(-1),prop_needs_update(false)
{
// Top Window
cdrs[0] = CDR(EVIEW_XZ,CDR_X_P);
@ -37,38 +55,76 @@ NBEditor::NBEditor(EditorState* st)
}
}
void addBox(IGUIElement* parent,IGUIEnvironment* guienv, vector2di pos,int index,const wchar_t* label){
guienv->addStaticText(label,rect<s32>(pos.X,pos.Y,pos.X+20,pos.Y+20),false,true,parent)->setNotClipped(true);
guienv->addEditBox(L"",rect<s32>(pos.X+15,pos.Y,pos.X+200,pos.Y+20),true,parent,index)->setNotClipped(true);
}
void addXYZ(IGUIElement* parent,IGUIEnvironment* guienv, vector2di pos,int startIndex){
addBox(parent,guienv,vector2di(pos.X,pos.Y),startIndex,L"X"); // 0,0
addBox(parent,guienv,vector2di(pos.X,pos.Y+30),startIndex+1,L"Y"); // 80, 0
addBox(parent,guienv,vector2di(pos.X,pos.Y+60),startIndex+2,L"Z"); // 160, 0
}
void NBEditor::load(){
IGUIStaticText* sidebar = GetState()->Menu()->GetSideBar();
IGUIEnvironment* guienv = GetState()->GetDevice()->getGUIEnvironment();
sidebar->setText(L"Node boxes");
IGUIStaticText* t = guienv->addStaticText(L"No node selected",rect<s32>(20,30,140,100),false,true,sidebar,GUI_SIDEBAR_LABEL);
if (t)
if (sidebar){
sidebar->setText(L"Node Box Tool");
IGUIStaticText* t = guienv->addStaticText(L"No node selected",rect<s32>(20,30,140,100),false,true,sidebar,ENB_GUI_MAIN_MSG);
IGUIListBox* lb = guienv->addListBox(rect<s32>(20,30,230,128),sidebar,ENB_GUI_MAIN_LISTBOX,true);
if (lb){
lb->setVisible(false);
IGUIButton* b = guienv->addButton(rect<s32>(0,100,50,125),lb,GUI_PROJ_NEW_BOX,L"+",L"Add a node box");
IGUIButton* c = guienv->addButton(rect<s32>(60,100,110,125),lb,GUI_PROJ_DELETE_BOX,L"-",L"Delete node box");
b->setNotClipped(true);
c->setNotClipped(true);
}
t = guienv->addStaticText(L"Properties",rect<s32>(0,170,120,190),false,true,sidebar,ENB_GUI_PROP);
t->setVisible(false);
IGUIListBox* lb = guienv->addListBox(rect<s32>(20,30,230,128),sidebar,GUI_SIDEBAR_LISTBOX,true);
if (lb){
lb->setVisible(false);
IGUIButton* b = guienv->addButton(rect<s32>(20-20,130-30,70-20,155-30),lb,GUI_PROJ_NEW_BOX,L"+",L"Add a node box");
IGUIButton* c = guienv->addButton(rect<s32>(80-20,130-30,130-20,155-30),lb,GUI_PROJ_DELETE_BOX,L"-",L"Delete node box");
b->setNotClipped(true);
c->setNotClipped(true);
addXYZ(t,guienv,vector2di(10,30),ENB_GUI_PROP_X1);
addXYZ(t,guienv,vector2di(10,130),ENB_GUI_PROP_X2); // 60
guienv->addButton(rect<s32>(30,230,100,260),t,ENB_GUI_PROP_UPDATE,L"Update",L"")->setNotClipped(true);
guienv->addButton(rect<s32>(110,230,180,260),t,ENB_GUI_PROP_REVERT,L"Revert",L"")->setNotClipped(true);
}
load_ui();
}
void fillTB(IGUIElement* sidebar,int parentId,int id,float value){
IGUIElement* e = sidebar->getElementFromId(parentId)->getElementFromId(id);
if (e){
IGUIEditBox* b = static_cast<IGUIEditBox*>(e);
if (!b)
return;
b->setText(stringw(value).c_str());
}
}
void NBEditor::load_ui(){
IGUIStaticText* sidebar = GetState()->Menu()->GetSideBar();
if (!sidebar)
return;
IGUIEnvironment* guienv = GetState()->GetDevice()->getGUIEnvironment();
Node* node = GetState()->project->GetCurrentNode();
if (!node){
sidebar->getElementFromId(GUI_SIDEBAR_LABEL)->setVisible(true);
sidebar->getElementFromId(GUI_SIDEBAR_LISTBOX)->setVisible(false);
sidebar->getElementFromId(ENB_GUI_MAIN_MSG)->setVisible(true);
sidebar->getElementFromId(ENB_GUI_MAIN_LISTBOX)->setVisible(false);
sidebar->getElementFromId(ENB_GUI_PROP)->setVisible(false);
}else{
IGUIListBox* lb = (IGUIListBox*) sidebar->getElementFromId(GUI_SIDEBAR_LISTBOX);
sidebar->getElementFromId(GUI_SIDEBAR_LABEL)->setVisible(false);
IGUIListBox* lb = (IGUIListBox*) sidebar->getElementFromId(ENB_GUI_MAIN_LISTBOX);
sidebar->getElementFromId(ENB_GUI_MAIN_MSG)->setVisible(false);
sidebar->getElementFromId(ENB_GUI_PROP)->setVisible(false);
if (lb){
lb->clear();
@ -85,13 +141,39 @@ void NBEditor::load_ui(){
}
lb->setSelected(lb->getListItem(node->GetId()));
}
fillProperties();
}
}
void NBEditor::unload(){
void NBEditor::fillProperties(){
IGUIStaticText* sidebar = GetState()->Menu()->GetSideBar();
if (!sidebar)
return;
Node* node = GetState()->project->GetCurrentNode();
if (!node)
return;
NodeBox* nb = node->GetCurrentNodeBox();
if (!nb)
return;
sidebar->getElementFromId(ENB_GUI_PROP)->setVisible(true);
fillTB(sidebar,ENB_GUI_PROP,ENB_GUI_PROP_X1,nb->one.X);
fillTB(sidebar,ENB_GUI_PROP,ENB_GUI_PROP_Y1,nb->one.Y);
fillTB(sidebar,ENB_GUI_PROP,ENB_GUI_PROP_Z1,nb->one.Z);
fillTB(sidebar,ENB_GUI_PROP,ENB_GUI_PROP_X2,nb->two.X);
fillTB(sidebar,ENB_GUI_PROP,ENB_GUI_PROP_Y2,nb->two.Y);
fillTB(sidebar,ENB_GUI_PROP,ENB_GUI_PROP_Z2,nb->two.Z);
}
void NBEditor::update(){
void NBEditor::unload(){}
void NBEditor::update(double dtime){
}
void NBEditor::draw(irr::video::IVideoDriver* driver){
@ -236,6 +318,8 @@ void CDR::update(NBEditor* editor,bool drag,rect<s32> offset){
box->moveNodeBox(editor->GetState(),type,wpos);
}
node->remesh();
editor->triggerCDRmoved();
}
vector3df pos;
@ -309,7 +393,7 @@ bool NBEditor::OnEvent(const irr::SEvent &event){
case GUI_PROJ_DELETE_BOX:
{
Node* node = GetState()->project->GetCurrentNode();
IGUIListBox* lb = (IGUIListBox*) GetState()->Menu()->GetSideBar()->getElementFromId(GUI_SIDEBAR_LISTBOX);
IGUIListBox* lb = (IGUIListBox*) GetState()->Menu()->GetSideBar()->getElementFromId(ENB_GUI_MAIN_LISTBOX);
if (node && node->GetNodeBox(lb->getSelected())){
printf("Clicked delete nb!\n");
node->deleteNodebox(lb->getSelected());
@ -317,10 +401,46 @@ bool NBEditor::OnEvent(const irr::SEvent &event){
}
}
break;
case ENB_GUI_PROP_REVERT:
{
fillProperties();
}
break;
case ENB_GUI_PROP_UPDATE:
{
IGUIElement* prop = GetState()->Menu()->GetSideBar()->getElementFromId(ENB_GUI_PROP);
if (!prop)
return false;
Node* node = GetState()->project->GetCurrentNode();
if (!node)
return false;
NodeBox* nb = node->GetCurrentNodeBox();
if (!nb)
return false;
try{
nb->one.X = wcstod(prop->getElementFromId(ENB_GUI_PROP_X1)->getText(),NULL);
nb->one.Y = wcstod(prop->getElementFromId(ENB_GUI_PROP_Y1)->getText(),NULL);
nb->one.Z = wcstod(prop->getElementFromId(ENB_GUI_PROP_Z1)->getText(),NULL);
nb->two.X = wcstod(prop->getElementFromId(ENB_GUI_PROP_X2)->getText(),NULL);
nb->two.Y = wcstod(prop->getElementFromId(ENB_GUI_PROP_Y2)->getText(),NULL);
nb->two.Z = wcstod(prop->getElementFromId(ENB_GUI_PROP_Z2)->getText(),NULL);
node->remesh();
}catch(void* e){
GetState()->GetDevice()->getGUIEnvironment()->addMessageBox(L"Update failed",L"Please check that the properties contain only numbers.");
}
}
break;
}
}else if (event.GUIEvent.EventType == EGET_LISTBOX_CHANGED){
Node* node = GetState()->project->GetCurrentNode();
IGUIListBox* lb = (IGUIListBox*) GetState()->Menu()->GetSideBar()->getElementFromId(GUI_SIDEBAR_LISTBOX);
IGUIListBox* lb = (IGUIListBox*) GetState()->Menu()->GetSideBar()->getElementFromId(ENB_GUI_MAIN_LISTBOX);
if (node && lb && node->GetNodeBox(lb->getSelected())){
node->select(lb->getSelected());
load_ui();

View File

@ -25,10 +25,11 @@ public:
// Interface
virtual void load();
virtual void unload();
virtual void update();
virtual void update(double dtime);
virtual void draw(irr::video::IVideoDriver* driver);
virtual void viewportTick(VIEWPORT window,irr::video::IVideoDriver* driver,rect<s32> offset);
virtual bool OnEvent(const irr::SEvent &event);
void triggerCDRmoved(){prop_needs_update = true;}
// Snapping
f32 snappers[NODE_RES+1];
@ -37,6 +38,8 @@ private:
int current;
CDR cdrs[15];
void load_ui();
void fillProperties();
bool prop_needs_update;
};
#endif