3 Copyright (C) 2013 sapier
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23 /******************************************************************************/
25 /******************************************************************************/
26 #include "irrlichttypes.h"
27 #include "modalMenu.h"
28 #include "guiFormSpecMenu.h"
30 #include "client/tile.h"
31 #include "util/enriched_string.h"
33 /******************************************************************************/
34 /* Typedefs and macros */
35 /******************************************************************************/
36 /** texture layer ids */
38 TEX_LAYER_BACKGROUND = 0,
46 video::ITexture* texture;
51 /******************************************************************************/
52 /* forward declarations */
53 /******************************************************************************/
55 class MainMenuScripting;
59 /******************************************************************************/
61 /******************************************************************************/
63 /** GUIEngine specific implementation of TextDest used within guiFormSpecMenu */
64 class TextDestGuiEngine : public TextDest
69 * @param engine the engine data is transmitted for further processing
71 TextDestGuiEngine(GUIEngine* engine);
74 * receive fields transmitted by guiFormSpecMenu
75 * @param fields map containing formspec field elements currently active
77 void gotText(const StringMap &fields);
80 * receive text/events transmitted by guiFormSpecMenu
81 * @param text textual representation of event
83 void gotText(std::wstring text);
86 /** target to transmit data to */
90 /** GUIEngine specific implementation of ISimpleTextureSource */
91 class MenuTextureSource : public ISimpleTextureSource
96 * @param driver the video driver to load textures from
98 MenuTextureSource(video::IVideoDriver *driver);
101 * destructor, removes all loaded textures
103 virtual ~MenuTextureSource();
106 * get a texture, loading it if required
107 * @param name path to the texture
108 * @param id receives the texture ID, always 0 in this implementation
110 video::ITexture* getTexture(const std::string &name, u32 *id = NULL);
113 /** driver to get textures from */
114 video::IVideoDriver *m_driver;
115 /** set of texture names to delete */
116 std::set<std::string> m_to_delete;
119 /** GUIEngine specific implementation of OnDemandSoundFetcher */
120 class MenuMusicFetcher: public OnDemandSoundFetcher
124 * get sound file paths according to sound name
125 * @param name sound name
126 * @param dst_paths receives possible paths to sound files
127 * @param dst_datas receives binary sound data (not used here)
129 void fetchSounds(const std::string &name,
130 std::set<std::string> &dst_paths,
131 std::set<std::string> &dst_datas);
134 /** set of fetched sound names */
135 std::set<std::string> m_fetched;
138 /** implementation of main menu based uppon formspecs */
140 /** grant ModApiMainMenu access to private members */
141 friend class ModApiMainMenu;
142 friend class ModApiSound;
146 * default constructor
147 * @param dev device to draw at
148 * @param parent parent gui element
149 * @param menumgr manager to add menus to
150 * @param smgr scene manager to add scene elements to
151 * @param data struct to transfer data to main game handling
153 GUIEngine(irr::IrrlichtDevice* dev,
154 JoystickController *joystick,
155 gui::IGUIElement* parent,
156 IMenuManager *menumgr,
157 scene::ISceneManager* smgr,
161 /** default destructor */
162 virtual ~GUIEngine();
165 * return MainMenuScripting interface
167 MainMenuScripting* getScriptIface()
173 * return dir of current menuscript
175 std::string getScriptDir()
180 /** pass async callback to scriptengine **/
181 unsigned int queueAsync(std::string serialized_fct,std::string serialized_params);
185 /** find and run the main menu script */
186 bool loadMainMenuScript();
188 /** run main menu loop */
191 /** handler to limit frame rate within main menu */
192 void limitFrameRate();
194 /** update size of topleftext element */
195 void updateTopLeftTextSize();
197 /** device to draw at */
198 irr::IrrlichtDevice* m_device;
199 /** parent gui element */
200 gui::IGUIElement* m_parent;
201 /** manager to add menus to */
202 IMenuManager* m_menumanager;
203 /** scene manager to add scene elements to */
204 scene::ISceneManager* m_smgr;
205 /** pointer to data beeing transfered back to main game handling */
206 MainMenuData* m_data;
207 /** pointer to texture source */
208 ISimpleTextureSource* m_texture_source;
209 /** pointer to soundmanager*/
210 ISoundManager* m_sound_manager;
212 /** representation of form source to be used in mainmenu formspec */
213 FormspecFormSource* m_formspecgui;
214 /** formspec input receiver */
215 TextDestGuiEngine* m_buttonhandler;
216 /** the formspec menu */
217 GUIFormSpecMenu* m_menu;
219 /** reference to kill variable managed by SIGINT handler */
222 /** variable used to abort menu and return back to main game handling */
225 /** scripting interface */
226 MainMenuScripting* m_script;
228 /** script basefolder */
229 std::string m_scriptdir;
232 * draw background layer
233 * @param driver to use for drawing
235 void drawBackground(video::IVideoDriver* driver);
238 * @param driver to use for drawing
240 void drawOverlay(video::IVideoDriver* driver);
243 * @param driver to use for drawing
245 void drawHeader(video::IVideoDriver* driver);
248 * @param driver to use for drawing
250 void drawFooter(video::IVideoDriver* driver);
253 * load a texture for a specified layer
254 * @param layer draw layer to specify texture
255 * @param texturepath full path of texture to load
257 bool setTexture(texture_layer layer, std::string texturepath,
258 bool tile_image, unsigned int minsize);
261 * download a file using curl
262 * @param url url to download
263 * @param target file to store to
265 static bool downloadFile(std::string url,std::string target);
267 /** array containing pointers to current specified texture layers */
268 image_definition m_textures[TEX_LAYER_MAX];
270 /** draw version string in topleft corner */
274 * specify text to appear as top left string
277 void setTopleftText(const std::string &text);
279 /** pointer to gui element shown at topleft corner */
280 irr::gui::IGUIStaticText* m_irr_toplefttext;
281 /** and text that is in it */
282 EnrichedString m_toplefttext;
284 /** initialize cloud subsystem */
286 /** do preprocessing for cloud subsystem */
287 void cloudPreProcess();
288 /** do postprocessing for cloud subsystem */
289 void cloudPostProcess();
291 /** internam data required for drawing clouds */
293 /** delta time since last cloud processing */
295 /** absolute time of last cloud processing */
297 /** pointer to cloud class */
299 /** camera required for drawing clouds */
300 scene::ICameraSceneNode* camera;
303 /** is drawing of clouds enabled atm */
304 bool m_clouds_enabled;
305 /** data used to draw clouds */
308 /** start playing a sound and return handle */
309 s32 playSound(SimpleSoundSpec spec, bool looped);
310 /** stop playing a sound started with playSound() */
311 void stopSound(s32 handle);
318 #endif /* GUI_ENGINE_H_ */