26 #include <boost/bind.hpp>
27 #include <boost/lexical_cast.hpp>
28 #include <boost/regex.hpp>
29 #include <boost/tokenizer.hpp>
35 #include "video/renderbackend.h"
36 #include "util/time/timemanager.h"
37 #include "util/log/logger.h"
38 #include "util/base/exception.h"
39 #include "gui/guimanager.h"
40 #include "gui/base/gui_font.h"
41 #include "gui/widgets/utf8textbox.h"
43 #include "commandline.h"
47 const unsigned Console::m_maxOutputRows = 50;
48 static Logger _log(LM_CONSOLE);
55 m_outputscrollarea(new gcn::ScrollArea(m_output)),
56 m_status(new gcn::Label()),
57 m_toolsbutton(new gcn::Button(
"Tools"))
61 add(m_outputscrollarea);
73 m_fpsTimer.setInterval(500);
78 m_animationTimer.setInterval(20);
81 m_toolsbutton->addActionListener(
this);
82 m_toolsbutton->setFocusable(
false);
83 m_input->addFocusListener(
this);
85 GuiFont* font = GUIManager::instance()->createFont();
86 font->setColor(255,255,255);
91 Image* screen = RenderBackend::instance()->getScreenImage();
94 int w, h, b, input_h, bbar_h, button_w;
95 w = screen->getWidth() * 4/5;
96 h = screen->getHeight() * 4/5;
98 input_h = getFont()->getHeight();
102 gcn::Color black(0x00,0,0,0xff);
103 gcn::Color white(0xff,0xff,0xff,0xff);
104 gcn::Color dark(50,60,50,0xff);
107 setPosition((screen->getWidth() - w) / 2,-h);
110 setForegroundColor(white);
111 setBackgroundColor(black);
116 m_outputscrollarea->setSize(w - 2*b, h - input_h - 3*b - bbar_h);
117 m_outputscrollarea->setPosition(b,0);
119 m_input->setPosition(b, h - input_h - b - bbar_h);
120 m_input->setSize(w - 2*b, input_h);
122 m_status->setPosition(b, h - b - bbar_h);
123 m_status->setSize(w - 2*b, bbar_h);
125 m_toolsbutton->setPosition(w - button_w, h - b - bbar_h);
126 m_toolsbutton->setSize(button_w, bbar_h);
128 m_output->setBackgroundColor(black);
129 m_output->setFocusable(
false);
131 m_outputscrollarea->setBackgroundColor(black);
132 m_outputscrollarea->setBaseColor(dark);
134 m_input->setForegroundColor(white);
135 m_input->setBackgroundColor(black);
137 m_status->setForegroundColor(white);
138 m_status->setBackgroundColor(black);
140 m_toolsbutton->setForegroundColor(white);
141 m_toolsbutton->setBackgroundColor(black);
142 m_toolsbutton->setBaseColor(dark);
145 m_animationDelta = h/6;
152 remove(m_outputscrollarea);
157 delete m_outputscrollarea;
159 delete m_toolsbutton;
163 std::string caption =
"FIFE Console - FPS: ";
164 float fps = 1e3/double(TimeManager::instance()->getAverageFrameTime());
165 caption += boost::lexical_cast<std::string>(fps);
166 m_status->setCaption( caption );
171 setPosition(getX(), getY() - m_animationDelta);
172 if (getY() <= m_hiddenPos){
174 m_animationTimer.stop();
177 setPosition(getX(), getY() + m_animationDelta);
179 setPosition(getX(), 0);
180 m_animationTimer.stop();
186 m_output->setText(
"");
189 void Console::doShow() {
193 GUIManager::instance()->add(
this);
194 GUIManager::instance()->getTopContainer()->moveToTop(
this);
196 m_input->requestFocus();
201 void Console::doHide() {
204 m_isAttached =
false;
205 GUIManager::instance()->remove(
this);
213 m_animationTimer.start();
220 m_animationTimer.start();
225 m_hiding = !m_hiding;
228 m_animationTimer.start();
232 FL_DBG(_log,
LMsg(
"in execute with command ") << cmd);
245 FL_WARN(_log,
LMsg(
"ConsoleExecuter not bind, but command received: ") << cmd.c_str());
249 FL_WARN(_log,
LMsg(
"Console caught exception: ") << e.
what());
258 boost::char_separator<char> separator(
"\n");
259 typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
260 tokenizer tokens(s,separator);
261 for(tokenizer::iterator i = tokens.begin(); i != tokens.end(); ++i) {
262 m_output->addRow(*i);
266 if( m_output->getNumberOfRows() > m_maxOutputRows ) {
267 unsigned rows = m_output->getNumberOfRows();
268 int delta_rows = rows - m_maxOutputRows;
269 std::vector<std::string> rows_text;
270 for(
size_t i=delta_rows; i != rows; ++i) {
271 rows_text.push_back(m_output->getTextRow(i));
273 m_output->setText(
"");
274 for(
size_t i=0; i != rows_text.size(); ++i) {
275 m_output->addRow(rows_text[i]);
280 gcn::Rectangle rect(0,m_output->getHeight(),0,0);
281 m_outputscrollarea->showWidgetPart(m_output,rect);
288 FL_WARN(_log,
"ConsoleExecuter not bind, but tools button clicked");
293 m_consoleexec = consoleexec;
297 m_consoleexec = NULL;
301 m_input->setFont(font);
302 m_output->setFont(font);