00001
00002
00003
00004
00005
00006 #include "gui/GuiMgr.h"
00007 #include "gui/SimpleCommand.h"
00008
00009 #ifdef WIN32
00010 #include <sstream>
00011 #else // gcc < 2.9.5.3 dosen't know <sstream>,stringstream
00012 #include <strstream>
00013 #endif
00014
00015 #include <iostream>
00016
00017
00018 namespace gui {
00019
00020
00021 GuiMgr* GuiMgr::s_instance = 0;
00022 GuiMgr* GuiMgr::instance(){ if (s_instance) return s_instance; else return new GuiMgr;}
00023
00024 static std::string title;
00025
00026 void GuiMgr::setup(float size, int inital_view, int pause_interval )
00027 {
00028 s_instance = this;
00029
00030 m_state = PAUSED;
00031
00032 m_menu = new Menu(*m_gui);
00033 m_display =new DisplayControl(menu(), m_gui->graphicsWindow(0.5*size, inital_view) ) ;
00034 m_print =new PrintControl(menu(), m_gui->textWindow("output") );
00035
00036 m_size = size ;
00037
00038
00039 m_sub_menu =&menu().subMenu("EventLoop");
00040
00041 Command* resume=new SimpleCommand<GuiMgr>(this,&GuiMgr::resume);
00042 m_sub_menu->addButton("Start/Resume (cr)", resume);
00043
00044 Command* pause = new SimpleCommand<GuiMgr>(this,&GuiMgr::pause);
00045 m_sub_menu->addButton("pause/step (space)",pause);
00046
00047 m_pause_interval=pause_interval;
00048 m_sub_menu->addButton("set pause interval...", new SimpleCommand<GuiMgr>(this,&GuiMgr::queryPause));
00049
00050
00051 menu().register_key(' ', pause);
00052 menu().register_key('\r',resume);
00053
00054 menu().add(new MenuClient<GuiMgr>(this));
00055 }
00056
00057 void GuiMgr::queryPause()
00058 {
00059 menu().query("Enter new pause interval in ms (0: no pause, -1 infinite)", &m_pause_interval);
00060 }
00061
00062
00063
00064 GuiMgr::~GuiMgr()
00065 {
00066 delete m_gui;
00067 delete m_display;
00068 delete m_print;
00069 delete m_menu;
00070 }
00071
00072
00073
00074 void GuiMgr::quit()
00075 {
00076 stop_loop();
00077 m_state = DONE;
00078 }
00079
00080
00081 void GuiMgr::begin_event()
00082 {
00083 static int n=0;
00084 display().clear();
00085 #ifdef WIN32
00086 std::stringstream label; label << " Event " << (++n) << '\0';
00087 #else // gcc < 2.9.5.3 dosen't know <sstream>,stringstream
00088 std::strstream label; label << " Event " << (++n) << '\0';
00089 #endif
00090 title = std::string(label.str());
00091 display().setTitle(title);
00092 }
00093
00094 void GuiMgr::end_event()
00095 {
00096 display().update();
00097 printer().printAll();
00098 gui().processMessages();
00099
00100 if( ! done() ) {
00101
00102 gui().run(m_state == RUNNING ? m_pause_interval : -1);
00103 }
00104 }
00105
00106 void GuiMgr::break_point(const std::string& title_bar_text)
00107 {
00108 if( !title_bar_text.empty() ) display().setTitle(title+title_bar_text);
00109 end_event();
00110 if( !title_bar_text.empty() ){ display().setTitle(title); gui().processMessages();}
00111 }
00112
00113 void GuiMgr::pause()
00114 {
00115 switch (m_state) {
00116 case RUNNING: m_state=PAUSED; stop_loop(); break;
00117 case PAUSED: stop_loop(); break;
00118 }
00119 }
00120
00121 void GuiMgr::resume()
00122 {
00123 switch (m_state) {
00124 case RUNNING: m_state=PAUSED; stop_loop(); break;
00125 case PAUSED: m_state=RUNNING; stop_loop(); break;
00126 }
00127 }
00128 void GuiMgr::stop_loop()
00129 {
00130 GUI::running = false;
00131 }
00132
00133
00134
00135 }
00136
00137
00138
00139
00140
00141
00142
00143