aboutsummaryrefslogtreecommitdiff
path: root/src/guiFileSelectMenu.cpp
blob: e02407427f51907ae9e88ce3a001f572578cf9a0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*
 Minetest
 Copyright (C) 2013 sapier

 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published by
 the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.

 You should have received a copy of the GNU Lesser 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.
 */

#include "guiFileSelectMenu.h"
#include "util/string.h"
#include <locale.h>

GUIFileSelectMenu::GUIFileSelectMenu(gui::IGUIEnvironment* env,
				gui::IGUIElement* parent, s32 id, IMenuManager *menumgr,
				std::string title, std::string formname) :
GUIModalMenu(env, parent, id, menumgr)
{
	m_title = utf8_to_wide(title);
	m_parent = parent;
	m_formname = formname;
	m_text_dst = 0;
	m_accepted = false;
}

GUIFileSelectMenu::~GUIFileSelectMenu()
{
	removeChildren();
}

void GUIFileSelectMenu::removeChildren()
{
	const core::list<gui::IGUIElement*> &children = getChildren();
	core::list<gui::IGUIElement*> children_copy;
	for (core::list<gui::IGUIElement*>::ConstIterator i = children.begin(); i
		 != children.end(); i++)
	{
		children_copy.push_back(*i);
	}
	for (core::list<gui::IGUIElement*>::Iterator i = children_copy.begin(); i
		 != children_copy.end(); i++)
	{
		(*i)->remove();
	}
}

void GUIFileSelectMenu::regenerateGui(v2u32 screensize)
{
	removeChildren();
	m_fileOpenDialog = 0;

	core::dimension2du size(600,400);
	core::rect < s32 > rect(0,0,screensize.X,screensize.Y);

	DesiredRect = rect;
	recalculateAbsolutePosition(false);

	m_fileOpenDialog =
			Environment->addFileOpenDialog(m_title.c_str(),false,this,-1);

	core::position2di pos = core::position2di(screensize.X/2 - size.Width/2,screensize.Y/2 -size.Height/2);
	m_fileOpenDialog->setRelativePosition(pos);
	m_fileOpenDialog->setMinSize(size);
}

void GUIFileSelectMenu::drawMenu()
{
	gui::IGUISkin* skin = Environment->getSkin();
	if (!skin)
		return;

	gui::IGUIElement::draw();
}

void GUIFileSelectMenu::acceptInput() {
	if ((m_text_dst != 0) && (this->m_formname != "")){
		StringMap fields;

		if (m_accepted)
			fields[m_formname + "_accepted"] = wide_to_utf8(m_fileOpenDialog->getFileName());
		else
			fields[m_formname + "_canceled"] = m_formname;

		this->m_text_dst->gotText(fields);
	}
}

bool GUIFileSelectMenu::OnEvent(const SEvent& event)
{

	if (event.EventType == irr::EET_GUI_EVENT) {
		switch (event.GUIEvent.EventType) {
			case gui::EGET_ELEMENT_CLOSED:
			case gui::EGET_FILE_CHOOSE_DIALOG_CANCELLED:
				m_accepted=false;
				acceptInput();
				quitMenu();
				return true;
				break;

			case gui::EGET_DIRECTORY_SELECTED:
			case gui::EGET_FILE_SELECTED:
				m_accepted=true;
				acceptInput();
				quitMenu();
				return true;
				break;

			default:
				//ignore this event
				break;
		}
	}
	return Parent ? Parent->OnEvent(event) : false;
}
paramtype2="facedir", walkable = false, selection_box = { type = "fixed", fixed = {-1/4, -1/2, -1/4, 1/4, 2, 1/4}, }, mesh = "advtrains_retrosignal_"..r..rotation..".b3d", tiles = {"advtrains_retrosignal.png"}, inventory_image="advtrains_retrosignal_inv.png", drop="advtrains:retrosignal_off", description=attrans("Lampless Signal"), sunlight_propagates=true, groups = { cracky=3, not_blocking_trains=1, not_in_creative_inventory=crea, save_in_at_nodedb=1, advtrains_signal = 2, }, mesecons = {effector = { rules=advtrains.meseconrules, ["action_"..f.as] = function (pos, node) advtrains.ndb.swap_node(pos, {name = "advtrains:retrosignal_"..f.as..rotation, param2 = node.param2}, true) if advtrains.interlocking then -- forcefully clears any set aspect, so that aspect system doesnt override it again advtrains.interlocking.signal.unregister_aspect(pos) -- notify trains advtrains.interlocking.signal.notify_trains(pos) end end }}, on_rightclick=function(pos, node, player) local pname = player:get_player_name() local sigd = advtrains.interlocking and advtrains.interlocking.db.get_sigd_for_signal(pos) if sigd then advtrains.interlocking.show_signalling_form(sigd, pname) elseif advtrains.interlocking and player:get_player_control().aux1 then advtrains.interlocking.show_ip_form(pos, pname) elseif advtrains.check_turnout_signal_protection(pos, player:get_player_name()) then advtrains.ndb.swap_node(pos, {name = "advtrains:retrosignal_"..f.as..rotation, param2 = node.param2}, true) if advtrains.interlocking then -- forcefully clears any set aspect, so that aspect system doesnt override it again advtrains.interlocking.signal.unregister_aspect(pos) -- notify trains advtrains.interlocking.signal.notify_trains(pos) end end end, -- very new signal API advtrains = { main_aspects = main_aspects, apply_aspect = simple_apply_aspect("advtrains:retrosignal_off"..rotation, "advtrains:retrosignal_on"..rotation), get_aspect_info = function() return aspect(r=="on") end, route_role = "main", }, can_dig = can_dig_func, after_dig_node = after_dig_func, --TODO add rotation using trackworker }) minetest.register_node("advtrains:signal_"..r..rotation, { drawtype = "mesh", paramtype="light", paramtype2="facedir", walkable = false, selection_box = { type = "fixed", fixed = {-1/4, -1/2, -1/4, 1/4, 2, 1/4}, }, mesh = "advtrains_signal"..rotation..".b3d", tiles = {"advtrains_signal_"..r..".png"}, inventory_image="advtrains_signal_inv.png", drop="advtrains:signal_off", description=attrans("Signal"), groups = { cracky=3, not_blocking_trains=1, not_in_creative_inventory=crea, save_in_at_nodedb=1, advtrains_signal = 2, }, light_source = 1, sunlight_propagates=true, mesecons = {effector = { rules=advtrains.meseconrules, ["action_"..f.as] = function (pos, node) advtrains.setstate(pos, f.als, node) end }}, on_rightclick=function(pos, node, player) local pname = player:get_player_name() local sigd = advtrains.interlocking and advtrains.interlocking.db.get_sigd_for_signal(pos) if sigd then advtrains.interlocking.show_signalling_form(sigd, pname) elseif advtrains.interlocking and player:get_player_control().aux1 then advtrains.interlocking.show_ip_form(pos, pname) elseif advtrains.check_turnout_signal_protection(pos, player:get_player_name()) then advtrains.setstate(pos, f.als, node) end end, -- very new signal API advtrains = { main_aspects = main_aspects, apply_aspect = simple_apply_aspect("advtrains:signal_off"..rotation, "advtrains:signal_on"..rotation), get_aspect_info = function() return aspect(r=="on") end, route_role = "main", node_state = f.ls, node_state_map = { red = "advtrains:signal_off"..rotation, green = "advtrains:signal_on"..rotation}, node_on_switch_state = function(pos, new_node, old_state, new_state) if advtrains.interlocking then -- forcefully clears any set aspect, so that aspect system doesnt override it again advtrains.interlocking.signal.unregister_aspect(pos) -- notify trains advtrains.interlocking.signal.notify_trains(pos) end end, }, can_dig = can_dig_func, after_dig_node = after_dig_func, --TODO add rotation using trackworker }) end local crea=1 if r=="off" then crea=0 end --tunnel signals. no rotations. local swdesc = { -- needed for xgettext l = attrans("Wallmounted Signal (left)"), r = attrans("Wallmounted Signal (right)"), t = attrans("Wallmounted Signal (top)"), } for loc, sbox in pairs({l={-1/2, -1/2, -1/4, 0, 1/2, 1/4}, r={0, -1/2, -1/4, 1/2, 1/2, 1/4}, t={-1/2, 0, -1/4, 1/2, 1/2, 1/4}}) do minetest.register_node("advtrains:signal_wall_"..loc.."_"..r, { drawtype = "mesh", paramtype="light", paramtype2="facedir", walkable = false, selection_box = { type = "fixed", fixed = sbox, }, mesh = "advtrains_signal_wall_"..loc..".b3d", tiles = {"advtrains_signal_wall_"..r..".png"}, drop="advtrains:signal_wall_"..loc.."_off", description=swdesc[loc], groups = { cracky=3, not_blocking_trains=1, not_in_creative_inventory=crea, save_in_at_nodedb=1, advtrains_signal = 2, }, light_source = 1, sunlight_propagates=true, mesecons = {effector = { rules = mrules_wallsignal, ["action_"..f.as] = function (pos, node) advtrains.setstate(pos, f.als, node) end }}, on_rightclick=function(pos, node, player) local pname = player:get_player_name() local sigd = advtrains.interlocking and advtrains.interlocking.db.get_sigd_for_signal(pos) if sigd then advtrains.interlocking.show_signalling_form(sigd, pname) elseif advtrains.interlocking and player:get_player_control().aux1 then advtrains.interlocking.show_ip_form(pos, pname) elseif advtrains.check_turnout_signal_protection(pos, player:get_player_name()) then advtrains.setstate(pos, f.als, node) end end, -- very new signal API advtrains = { main_aspects = main_aspects, apply_aspect = simple_apply_aspect("advtrains:signal_wall_"..loc.."_off", "advtrains:signal_wall_"..loc.."_on"), get_aspect_info = function() return aspect(r=="on") end, route_role = "main", node_state = f.ls, node_state_map = { red = "advtrains:signal_wall_"..loc.."_off", green = "advtrains:signal_wall_"..loc.."_on" }, node_on_switch_state = function(pos, new_node, old_state, new_state) if advtrains.interlocking then -- forcefully clears any set aspect, so that aspect system doesnt override it again advtrains.interlocking.signal.unregister_aspect(pos) -- notify trains advtrains.interlocking.signal.notify_trains(pos) end end, }, can_dig = can_dig_func, after_dig_node = after_dig_func, }) end end -- level crossing -- german version (Andrew's Cross) minetest.register_node("advtrains:across_off", { drawtype = "mesh", paramtype="light", paramtype2="facedir", walkable = false, selection_box = { type = "fixed", fixed = {-1/4, -1/2, -1/2, 1/4, 1.5, 0}, }, mesh = "advtrains_across.obj", tiles = {"advtrains_across.png"}, drop="advtrains:across_off", description=attrans("Andrew's Cross"), groups = { cracky=3, not_blocking_trains=1, save_in_at_nodedb=1, not_in_creative_inventory=nil, }, light_source = 1, sunlight_propagates=true, mesecons = {effector = { rules = advtrains.meseconrules, action_on = function (pos, node) advtrains.ndb.swap_node(pos, {name = "advtrains:across_on", param2 = node.param2}, true) end }}, advtrains = { node_state = "off", node_state_map = { on = "advtrains:across_on", off = "advtrains:across_off" }, }, on_rightclick=function(pos, node, player) if advtrains.check_turnout_signal_protection(pos, player:get_player_name()) then advtrains.ndb.swap_node(pos, {name = "advtrains:across_on", param2 = node.param2}, true) end end, }) minetest.register_node("advtrains:across_on", { drawtype = "mesh", paramtype="light", paramtype2="facedir", walkable = false, selection_box = { type = "fixed", fixed = {-1/4, -1/2, -1/2, 1/4, 1.5, 0}, }, mesh = "advtrains_across.obj", tiles = {{name="advtrains_across_anim.png", animation={type="vertical_frames", aspect_w=64, aspect_h=64, length=1.0}}}, drop="advtrains:across_off", description=attrans("Andrew's Cross"),