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/guichan/guichanmanager.h"
40 #include "gui/guichan/base/gui_font.h"
41 #include "gui/guichan/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 = GUIChanManager::instance()->createFont();
86 font->setColor(255,255,255);
91 int32_t w, h, b, input_h, bbar_h, button_w;
92 w = RenderBackend::instance()->getScreenWidth() * 4/5;
93 h = RenderBackend::instance()->getScreenHeight() * 4/5;
95 input_h = getFont()->getHeight();
99 gcn::Color black(0x00,0,0,0xff);
100 gcn::Color white(0xff,0xff,0xff,0xff);
101 gcn::Color dark(50,60,50,0xff);
104 setPosition((RenderBackend::instance()->getScreenWidth() - w) / 2,-h);
107 setForegroundColor(white);
108 setBackgroundColor(black);
113 m_outputscrollarea->setSize(w - 2*b, h - input_h - 3*b - bbar_h);
114 m_outputscrollarea->setPosition(b,0);
116 m_input->setPosition(b, h - input_h - b - bbar_h);
117 m_input->setSize(w - 2*b, input_h);
119 m_status->setPosition(b, h - b - bbar_h);
120 m_status->setSize(w - 2*b, bbar_h);
122 m_toolsbutton->setPosition(w - button_w, h - b - bbar_h);
123 m_toolsbutton->setSize(button_w, bbar_h);
125 m_output->setBackgroundColor(black);
126 m_output->setFocusable(
false);
128 m_outputscrollarea->setBackgroundColor(black);
129 m_outputscrollarea->setBaseColor(dark);
131 m_input->setForegroundColor(white);
132 m_input->setBackgroundColor(black);
134 m_status->setForegroundColor(white);
135 m_status->setBackgroundColor(black);
137 m_toolsbutton->setForegroundColor(white);
138 m_toolsbutton->setBackgroundColor(black);
139 m_toolsbutton->setBaseColor(dark);
142 m_animationDelta = h/6;
149 remove(m_outputscrollarea);
154 delete m_outputscrollarea;
156 delete m_toolsbutton;
160 std::string caption =
"FIFE Console - FPS: ";
161 double fps = 1e3/TimeManager::instance()->getAverageFrameTime();
162 caption += boost::lexical_cast<std::string>(fps);
163 m_status->setCaption( caption );
168 setPosition(getX(), getY() - m_animationDelta);
169 if (getY() <= m_hiddenPos){
171 m_animationTimer.stop();
174 setPosition(getX(), getY() + m_animationDelta);
176 setPosition(getX(), 0);
177 m_animationTimer.stop();
183 m_output->setText(
"");
186 void Console::doShow() {
190 GUIChanManager::instance()->add(
this);
191 GUIChanManager::instance()->getTopContainer()->moveToTop(
this);
193 m_input->requestFocus();
198 void Console::doHide() {
201 m_isAttached =
false;
202 GUIChanManager::instance()->remove(
this);
210 m_animationTimer.start();
217 m_animationTimer.start();
222 m_hiding = !m_hiding;
225 m_animationTimer.start();
229 FL_DBG(_log,
LMsg(
"in execute with command ") << cmd);
242 FL_WARN(_log,
LMsg(
"ConsoleExecuter not bind, but command received: ") << cmd.c_str());
246 FL_WARN(_log,
LMsg(
"Console caught exception: ") << e.
what());
255 boost::char_separator<char> separator(
"\n");
256 typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
257 tokenizer tokens(s,separator);
258 for(tokenizer::iterator i = tokens.begin(); i != tokens.end(); ++i) {
259 m_output->addRow(*i);
263 if( m_output->getNumberOfRows() > m_maxOutputRows ) {
264 unsigned rows = m_output->getNumberOfRows();
265 int32_t delta_rows = rows - m_maxOutputRows;
266 std::vector<std::string> rows_text;
267 for(
size_t i=delta_rows; i != rows; ++i) {
268 rows_text.push_back(m_output->getTextRow(i));
270 m_output->setText(
"");
271 for(
size_t i=0; i != rows_text.size(); ++i) {
272 m_output->addRow(rows_text[i]);
277 gcn::Rectangle rect(0,m_output->getHeight(),0,0);
278 m_outputscrollarea->showWidgetPart(m_output,rect);
285 FL_WARN(_log,
"ConsoleExecuter not bind, but tools button clicked");
290 m_consoleexec = consoleexec;
294 m_consoleexec = NULL;
298 m_input->setFont(font);
299 m_output->setFont(font);