The-NodeBox-Generator/src/MenuState.cpp

273 lines
7.8 KiB
C++
Raw Normal View History

2014-04-29 13:48:27 -07:00
#include "util/string.hpp"
2014-07-06 08:34:00 -07:00
#include "util/filesys.hpp"
2014-05-20 15:15:40 -07:00
#include "MenuState.hpp"
2014-04-29 13:48:27 -07:00
#include "FileFormat/FileFormat.hpp"
#include "FileFormat/NBE.hpp"
2014-11-05 11:14:06 -08:00
#include "dialogs/FileDialog.hpp"
#include "dialogs/ImageDialog.hpp"
2014-04-29 13:48:27 -07:00
MenuState::MenuState(EditorState* state) :
state(state),
2014-05-20 15:30:52 -07:00
projectMenubar(NULL),
2014-04-29 13:48:27 -07:00
menubar(NULL),
2014-07-09 04:56:34 -07:00
mode_icons_open(false),
dialog(NULL)
2014-02-14 10:46:12 -08:00
{}
2013-12-15 09:40:57 -08:00
2014-05-15 10:45:04 -07:00
void MenuState::init()
{
2014-04-29 13:48:27 -07:00
IGUIEnvironment *guienv = state->device->getGUIEnvironment();
2013-12-15 09:40:57 -08:00
guienv->clear();
guienv->getSkin()->setFont(guienv->getFont("media/fontlucida.png"));
// Main menu bar
2014-05-20 15:30:52 -07:00
menubar = guienv->addMenu();
menubar->addItem(L"File", -1, true, true);
menubar->addItem(L"Edit", -1, true, true);
menubar->addItem(L"View", -1, true, true);
menubar->addItem(L"Project", -1, true, true);
menubar->addItem(L"Help", -1, true, true);
2014-05-15 10:45:04 -07:00
gui::IGUIContextMenu *submenu;
2013-12-15 09:40:57 -08:00
// File
submenu = menubar->getSubMenu(0);
2015-02-01 11:31:25 -08:00
//submenu->addItem(L"New", GUI_FILE_NEW_PROJECT);
2015-02-02 10:24:40 -08:00
submenu->addItem(L"Open Project", GUI_FILE_OPEN_PROJECT);
submenu->addItem(L"Save Project As", GUI_FILE_SAVE_PROJECT);
2014-07-25 10:53:33 -07:00
submenu->addSeparator();
2015-02-02 10:24:40 -08:00
submenu->addItem(L"Export", -1, true, true);
2015-02-01 11:31:25 -08:00
submenu->addItem(L"Import Nodes", GUI_FILE_IMPORT);
2013-12-15 09:40:57 -08:00
submenu->addSeparator();
2014-05-15 10:45:04 -07:00
submenu->addItem(L"Exit", GUI_FILE_EXIT);
2013-12-15 09:40:57 -08:00
2015-02-02 10:24:40 -08:00
// File > Export
submenu = submenu->getSubMenu(3);
submenu->addItem(L"Standalone Lua File (.lua)", GUI_FILE_EXPORT_LUA);
submenu->addItem(L"Voxelands (.cpp)", GUI_FILE_EXPORT_CPP);
submenu->addItem(L"Minetest Mod", GUI_FILE_EXPORT_MOD, false);
submenu->addItem(L"Textures to Folder", GUI_FILE_EXPORT_TEX, false);
2013-12-15 09:40:57 -08:00
// Edit
submenu = menubar->getSubMenu(1);
submenu->addItem(
2014-05-15 10:45:04 -07:00
L"Snapping", GUI_EDIT_SNAP, true, false,
2014-04-29 13:48:27 -07:00
state->settings->getBool("snapping"),
2013-12-15 09:40:57 -08:00
true
);
submenu->addItem(
2014-05-15 10:45:04 -07:00
L"Limiting", GUI_EDIT_LIMIT, true, false,
2014-04-29 13:48:27 -07:00
state->settings->getBool("limiting"),
2013-12-15 09:40:57 -08:00
true
);
// View
submenu = menubar->getSubMenu(2);
2014-05-20 15:30:52 -07:00
submenu->addItem(L"Tiled View", GUI_VIEW_SP_ALL);
2014-07-10 11:38:07 -07:00
submenu->addSeparator();
submenu->addItem(L"Top Left", GUI_VIEW_SP_PER);
submenu->addItem(L"Top Right", GUI_VIEW_SP_TOP);
submenu->addItem(L"Bottom Left", GUI_VIEW_SP_FRT);
submenu->addItem(L"Bottom Right", GUI_VIEW_SP_RHT);
2013-12-15 09:40:57 -08:00
// Project
2014-05-20 15:30:52 -07:00
projectMenubar = menubar->getSubMenu(3);
2014-07-22 10:04:01 -07:00
projectMenubar->addItem(L"Import Image", GUI_PROJ_IMAGE_IM);
2013-12-15 09:40:57 -08:00
// Help
submenu = menubar->getSubMenu(4);
//submenu->addItem(L"Help",GUI_HELP_HELP,false);
2014-05-20 15:30:52 -07:00
submenu->addItem(L"About", GUI_HELP_ABOUT);
2013-12-15 09:40:57 -08:00
// Sidebar root
u32 top = menubar->getAbsoluteClippingRect().LowerRightCorner.Y;
2014-05-20 15:30:52 -07:00
sidebar = guienv->addStaticText(L"Loading...",
2013-12-15 09:40:57 -08:00
rect<s32>(
2014-04-29 13:48:27 -07:00
state->device->getVideoDriver()->getScreenSize().Width - 246,
2014-05-15 10:45:04 -07:00
top + 10,
2014-04-29 13:48:27 -07:00
state->device->getVideoDriver()->getScreenSize().Width,
state->device->getVideoDriver()->getScreenSize().Height
), false, true, 0, GUI_SIDEBAR
2013-12-15 09:40:57 -08:00
);
2014-05-20 15:30:52 -07:00
sidebar->setAlignment(EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_UPPERLEFT);
2014-11-05 09:31:17 -08:00
sidebar->setNotClipped(true);
2013-12-15 09:40:57 -08:00
}
2014-04-29 13:48:27 -07:00
bool MenuState::OnEvent(const SEvent& event){
2014-07-16 10:17:15 -07:00
if (dialog)
return dialog->OnEvent(event);
2014-11-05 09:31:17 -08:00
2014-04-29 13:48:27 -07:00
if (event.EventType == irr::EET_MOUSE_INPUT_EVENT &&
event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN) {
if (rect<s32>(10, 32, 42, 64).isPointInside(state->mouse_position)){
mode_icons_open = !mode_icons_open;
return true;
2014-02-14 10:46:12 -08:00
}
2014-04-29 13:48:27 -07:00
if (mode_icons_open) {
if (!(rect<s32>(10, 32, 210, 64).isPointInside(state->mouse_position))) {
2014-02-14 10:46:12 -08:00
mode_icons_open = false;
return true;
}
2014-04-29 13:48:27 -07:00
EditorMode *curs = state->Mode();
2014-02-14 10:46:12 -08:00
int x = 0;
2014-04-29 13:48:27 -07:00
for (int i = 0; i < 5; i++){
EditorMode *m = state->Mode(i);
2014-02-14 10:46:12 -08:00
2014-04-29 13:48:27 -07:00
if (m && m != curs){
if (rect<s32>(47 + 37 * x, 32, 79 + 37 * x, 64)
.isPointInside(state->mouse_position)) {
state->SelectMode(i);
2014-02-14 10:46:12 -08:00
mode_icons_open = false;
return true;
}
2014-05-15 10:45:04 -07:00
x++;
2014-02-14 10:46:12 -08:00
}
}
}
}
2014-04-29 13:48:27 -07:00
if (event.EventType == EET_GUI_EVENT){
if (event.GUIEvent.EventType == EGET_MENU_ITEM_SELECTED){
IGUIContextMenu *menu = (IGUIContextMenu *)event.GUIEvent.Caller;
switch (menu->getItemCommandId(menu->getSelectedItem())){
case GUI_FILE_OPEN_PROJECT:
2015-02-02 10:24:40 -08:00
FileDialog_open_project(state);
2014-04-29 13:48:27 -07:00
return true;
case GUI_FILE_SAVE_PROJECT:
if (!state->project) {
state->device->getGUIEnvironment()->addMessageBox(
L"Unable to save",
L"You have not yet opened a project.");
return true;
}
2015-02-02 10:24:40 -08:00
FileDialog_save_project(state);
return true;
case GUI_FILE_EXPORT_LUA:
FileDialog_export(state, FILE_FORMAT_LUA);
return true;
case GUI_FILE_EXPORT_CPP:
FileDialog_export(state, FILE_FORMAT_MTC);
2014-04-29 13:48:27 -07:00
return true;
2014-07-25 10:53:33 -07:00
case GUI_FILE_IMPORT:
2015-02-02 10:24:40 -08:00
//addFileDialog(EFPT_IMPORT, L"Import", L"Import");
2014-07-25 10:53:33 -07:00
return true;
2014-04-29 13:48:27 -07:00
case GUI_FILE_EXIT: {
IGUIEnvironment *guienv = state->device->getGUIEnvironment();
IGUIWindow *win = guienv->addWindow(rect<irr::s32>(100, 100, 356, 215),
true, L"Are you sure?");
guienv->addButton(rect<irr::s32>(128 - 40, 80, 128 + 40, 105),
win, GUI_FILE_EXIT, L"Close", L"Close the editor");
return true;
}
case GUI_EDIT_SNAP:
if (menu->isItemChecked(menu->getSelectedItem())) {
state->settings->set("snapping", "true");
} else {
state->settings->set("snapping", "false");
}
menu->setItemChecked(menu->getSelectedItem(),
state->settings->getBool("snapping"));
2014-07-09 04:56:34 -07:00
return true;
2014-04-29 13:48:27 -07:00
case GUI_EDIT_LIMIT:
if (menu->isItemChecked(menu->getSelectedItem())) {
state->settings->set("limiting", "true");
} else {
state->settings->set("limiting", "false");
}
menu->setItemChecked(menu->getSelectedItem(),
state->settings->getBool("limiting"));
2014-07-09 04:56:34 -07:00
return true;
2014-07-22 10:04:01 -07:00
case GUI_PROJ_IMAGE_IM:
ImageDialog::show(state, NULL, ECS_TOP);
return true;
2014-04-29 13:48:27 -07:00
case GUI_HELP_ABOUT: {
core::stringw msg = L"The Nodebox Editor\n"
L"Version: ";
msg += EDITOR_TEXT_VERSION;
msg += L"\n\n"
L"This free nodebox editor was made by rubenwardy in C++ and Irrlicht.\n"
L"You can download newer versions from the Minetest forum.";
state->device->getGUIEnvironment()->addMessageBox(L"About", msg.c_str());
return true;
}
}
} else if (event.GUIEvent.EventType == EGET_BUTTON_CLICKED) {
switch (event.GUIEvent.Caller->getID()) {
case GUI_FILE_EXIT:
if (state->project) {
NBEFileFormat writer(state);
2014-07-01 12:59:15 -07:00
2014-07-06 08:34:00 -07:00
// Get directory to save to
2014-07-06 10:09:54 -07:00
std::string dir = getSaveLoadDirectory(state->settings->get("save_directory"), state->settings->getBool("installed"));
2014-11-05 09:31:17 -08:00
2014-07-06 10:09:54 -07:00
std::cerr << "Saving to " << dir + "exit.nbe" << std::endl;
2014-07-01 12:59:15 -07:00
if (!writer.write(state->project, dir + "exit.nbe"))
std::cerr << "Failed to save file for unknown reason." << std::endl;
2014-04-29 13:48:27 -07:00
}
state->CloseEditor();
return true;
2013-12-15 09:40:57 -08:00
}
}
2014-04-29 13:48:27 -07:00
} else if (event.EventType == EET_KEY_INPUT_EVENT){
if (event.KeyInput.Control && event.KeyInput.Key == KEY_KEY_S &&
!event.KeyInput.PressedDown) {
if (!state->project) {
state->device->getGUIEnvironment()->addMessageBox(L"Unable to save",
L"You have not yet opened a project.");
2014-04-28 11:59:55 -07:00
return true;
}
2015-02-02 10:24:40 -08:00
FileDialog_save_project(state);
2014-04-28 11:59:55 -07:00
return true;
}
2013-12-15 09:40:57 -08:00
}
return false;
}
2014-07-16 10:17:15 -07:00
void MenuState::draw(IVideoDriver *driver){
EditorMode* curs = state->Mode();
2014-04-29 13:48:27 -07:00
if (state->settings->getBool("hide_sidebar")) {
2014-05-20 15:30:52 -07:00
sidebar->setVisible(false);
} else {
2014-05-20 15:30:52 -07:00
sidebar->setVisible(true);
2013-12-15 09:40:57 -08:00
u32 top = menubar->getAbsoluteClippingRect().LowerRightCorner.Y;
2014-04-29 13:48:27 -07:00
state->device->getGUIEnvironment()->getSkin()
->draw3DWindowBackground(NULL, false, 0,
rect<s32>((driver->getScreenSize().Width - 256),
top,
driver->getScreenSize().Width,
driver->getScreenSize().Height
)
);
}
if (dialog)
return;
if (curs) {
2014-04-25 11:30:18 -07:00
driver->draw2DImage(curs->icon(),
rect<s32>(10, 32, 42, 64),
rect<s32>( 0, 0, 32, 32),
0, 0, true);
2013-12-15 09:40:57 -08:00
}
2014-02-14 10:46:12 -08:00
if (mode_icons_open) {
2014-02-14 10:46:12 -08:00
int x = 0;
for (int i = 0; i < 5; i++) {
EditorMode* m = state->Mode(i);
2013-12-15 09:40:57 -08:00
if (m && m != curs) {
2014-04-25 11:30:18 -07:00
driver->draw2DImage(m->icon(),
rect<s32>(47 + 37 * x, 32, 79 + 37 * x, 64),
rect<s32>(0, 0, 32, 32),
0, 0, true);
x++;
2014-02-14 10:46:12 -08:00
}
}
}
2013-12-15 09:40:57 -08:00
}