Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  

GuiMgr.cxx

Go to the documentation of this file.
00001 //     $Id: GuiMgr.cxx,v 1.3 2001/05/17 21:59:42 kyoung Exp $
00002 //  Author: Toby Burnett
00003 //
00004 //  Implement GuiMgr
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; // keep title for refenece 
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     // Define submenu on menu bar (which is available for more buttons) 
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     // now set up some useful key-stroke shortcuts
00051     menu().register_key(' ', pause);    // space bar -- single event (or pause run)
00052     menu().register_key('\r',resume);   // cr -- start or resume
00053     
00054     menu().add(new MenuClient<GuiMgr>(this)); // schedule callback if exit button pressed
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() // called back when File/Exit button pushed
00075 {
00076     stop_loop();
00077     m_state = DONE;   
00078 }
00079 
00080 
00081 void GuiMgr::begin_event() // should be called at the beginning of an 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()  // must be called at the end of an event to update, allow pause
00095 {        
00096     display().update();
00097     printer().printAll();
00098     gui().processMessages();
00099     
00100     if( ! done() ) {
00101         // start a new message loop: process messages until GUI::running set false
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() // called by GUI message (space bar or button)
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() // called by GUI message (CR key or button )
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() // stop the loop in the end_event method
00129 {
00130     GUI::running = false;
00131 }
00132 
00133 
00134 
00135 } // namespace gui
00136 
00137 
00138 
00139 
00140 
00141 
00142 
00143 

Generated at Mon Nov 26 18:18:11 2001 by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000