1 /***************************************************************************
2  *   Copyright (C) 2005-2019 by the FIFE team                              *
3  *   http://www.fifengine.net                                              *
4  *   This file is part of FIFE.                                            *
5  *                                                                         *
6  *   FIFE is free software; you can redistribute it and/or                 *
7  *   modify it under the terms of the GNU Lesser General Public            *
8  *   License as published by the Free Software Foundation; either          *
9  *   version 2.1 of the License, or (at your option) any later version.    *
10  *                                                                         *
11  *   This library is distributed in the hope that it will be useful,       *
12  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
13  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     *
14  *   Lesser General Public License for more details.                       *
15  *                                                                         *
16  *   You should have received a copy of the GNU Lesser General Public      *
17  *   License along with this library; if not, write to the                 *
18  *   Free Software Foundation, Inc.,                                       *
19  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA          *
20  ***************************************************************************/
21 
22 #ifndef FIFE_FIFECHAN_ADDON_CONSOLE_H
23 #define FIFE_FIFECHAN_ADDON_CONSOLE_H
24 
25 // Standard C++ library includes
26 #include <string>
27 
28 // 3rd party library includes
29 #include <fifechan.hpp>
30 
31 // FIFE includes
32 // These includes are split up in two parts, separated by one empty line
33 // First block: files included from the FIFE root src directory
34 // Second block: files included from the same folder
35 #include "util/time/timer.h"
36 
37 namespace FIFE {
38 
39 	class CommandLine;
40 	class GuiFont;
41 
42 	/**
43 	* Console executer is listener interface for console activity
44 	*/
45 	class ConsoleExecuter {
46 		public:
47 			/** Destructor
48 			 */
~ConsoleExecuter()49 			virtual ~ConsoleExecuter() {}
50 
51 			/** Called when console tools button is clicked
52 			 */
53 			virtual void onToolsClick() = 0;
54 
55 			/** Called when user has typed command to console and pressed enter
56 			 * @return response from executer
57 			 */
58 			virtual std::string onConsoleCommand(const std::string& command) = 0;
59 	};
60 
61 
62 	/** Ingame Console
63 	 */
64 	class Console : public fcn::Container, public fcn::ActionListener, public fcn::FocusListener {
65 		public:
66 			/** Constructor
67 			 */
68 			Console();
69 
70 			/** Destructor
71 			 */
72 			virtual ~Console();
73 
74 			/** Print one or more lines to the console output
75 			 */
76 			void println(const std::string & s);
77 
78 			/** Show the console
79 			 * Adds the Console to the fifechan toplevel container
80 			 * and pushes an input Context so that keys are not send to the
81 			 * rest of the game.
82 			 */
83 			void show();
84 
85 			/** Hide the console
86 			 * Removes itself from the toplevel container
87 			 * and pops it's input context
88 			 */
89 			void hide();
90 
91 			/** Clear the console output
92 			 */
93 			void clear();
94 
95 			/** Toggle the console
96 			 * Toggles whether the Console is shown or not.
97 			 * Calls show() or hide() respectively.
98 			 */
99 			void toggleShowHide();
100 
101 			/** Execute a command
102 			 * Normally just sends the command to runString()
103 			 * Checks whether the cmd is just one token
104 			 * and print it's value rather than throw an
105 			 * useless error.
106 			 *
107 			 * @todo generalize the generated command and the regexp used.
108 			 */
109 			void execute(std::string cmd);
110 
111 			/** Update the FPS caption
112 			 *  @note Is a timer callback.
113 			 */
114 			void updateCaption();
115 
116 			/** Update the scroll in/out animation.
117 			 *  @note Is a timer callback.
118 			 */
119 			void updateAnimation();
120 
121 			/** Callback from fifechan to respond to button press
122 			 */
123 			void action(const fcn::ActionEvent & event);
124 
125 			/** Sets executer for the console
126 			 */
127 			void setConsoleExecuter(ConsoleExecuter* const consoleexec);
128 
129 			/** Removes executer for the console
130 			 */
131 			void removeConsoleExecuter();
132 
133 			/** Layouts the console to match e.g. font changes
134 			 */
135 			void reLayout();
136 
137 			/** Sets the font used for the input and output areas
138 			 */
139 			void setIOFont(GuiFont* font);
140 
141 			/** Hide if we loose focus
142 			*/
143 			void focusLost(const fcn::Event& event);
144 		private:
145 
146 			bool m_isAttached;
147 			ConsoleExecuter* m_consoleexec;
148 
149 			CommandLine*      m_input;
150 			fcn::TextBox*     m_output;
151 			fcn::ScrollArea*  m_outputscrollarea;
152 			fcn::Label*       m_status;
153 			fcn::Button*      m_toolsbutton;
154 			static const unsigned m_maxOutputRows;
155 
156 			std::string m_prompt;
157 
158 			int32_t m_hiddenPos;
159 			int32_t m_animationDelta;
160 
161 			bool m_hiding;
162 
163 			Timer m_fpsTimer;
164 			Timer m_animationTimer;
165 
166 			void doShow();
167 			void doHide();
168 	};
169 }
170 #endif
171