Revision: 6668
          http://playerstage.svn.sourceforge.net/playerstage/?rev=6668&view=rev
Author:   jeremy_asher
Date:     2008-06-23 15:18:02 -0700 (Mon, 23 Jun 2008)

Log Message:
-----------
Options dialog progress, fixed leaks in dialog callbacks, FileManager and 
OptionsDlg header reorg

Modified Paths:
--------------
    code/stage/trunk/libstage/CMakeLists.txt
    code/stage/trunk/libstage/canvas.cc
    code/stage/trunk/libstage/main.cc
    code/stage/trunk/libstage/options_dlg.cc
    code/stage/trunk/libstage/options_dlg.hh
    code/stage/trunk/libstage/stage.hh
    code/stage/trunk/libstage/world.cc
    code/stage/trunk/libstage/worldgui.cc

Modified: code/stage/trunk/libstage/CMakeLists.txt
===================================================================
--- code/stage/trunk/libstage/CMakeLists.txt    2008-06-23 21:17:23 UTC (rev 
6667)
+++ code/stage/trunk/libstage/CMakeLists.txt    2008-06-23 22:18:02 UTC (rev 
6668)
@@ -27,6 +27,7 @@
        model_ranger.cc 
        resource.cc
        texture_manager.cc
+       option.hh
        options_dlg.cc
        options_dlg.hh
 )
@@ -68,5 +69,5 @@
        LIBRARY DESTINATION lib
 )
 
-INSTALL(FILES stage.hh file_manager.hh options_dlg.hh
+INSTALL(FILES stage.hh option.hh
         DESTINATION include/${PROJECT_NAME}-${V_MAJOR}.${V_MINOR})

Modified: code/stage/trunk/libstage/canvas.cc
===================================================================
--- code/stage/trunk/libstage/canvas.cc 2008-06-23 21:17:23 UTC (rev 6667)
+++ code/stage/trunk/libstage/canvas.cc 2008-06-23 22:18:02 UTC (rev 6668)
@@ -11,6 +11,9 @@
 #include <string>
 #include <png.h>
 
+#include "file_manager.hh"
+#include "options_dlg.hh"
+
 using namespace Stg;
 
 static  const int checkImageWidth = 2;
@@ -159,7 +162,6 @@
                        // remove it from the selected list
                        selected_models = 
                                g_list_remove_link( selected_models, link );
-
                        mod->Disable();
                }                         
                else      
@@ -701,7 +703,7 @@
                //TODO find a better home for loading textures
                if( loaded_texture == false ) {
                        std::string fullpath;
-                       fullpath = world->fileMan.fullPath( "stall.png" );
+                       fullpath = world->fileMan->fullPath( "stall.png" );
                        if ( fullpath == "" ) {
                                PRINT_DEBUG( "Unable to load texture.\n" );
                        }
@@ -730,7 +732,7 @@
                //glEnableClientState( GL_COLOR_ARRAY );
 
                glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
-               
+
                if( ! canvas_init_done ) // do a bit of texture setup
                {
                        canvas_init_done = true;

Modified: code/stage/trunk/libstage/main.cc
===================================================================
--- code/stage/trunk/libstage/main.cc   2008-06-23 21:17:23 UTC (rev 6667)
+++ code/stage/trunk/libstage/main.cc   2008-06-23 22:18:02 UTC (rev 6668)
@@ -63,8 +63,8 @@
        }
 
        if( loaded_world_file == false ) {
-               // replace this with a loading dialog/window
-               StgWorldGui* world = new StgWorldGui( 400, 300 );
+               // TODO: special window/loading dialog for this case
+               new StgWorldGui( 400, 300 );
        }
 
        

Modified: code/stage/trunk/libstage/options_dlg.cc
===================================================================
--- code/stage/trunk/libstage/options_dlg.cc    2008-06-23 21:17:23 UTC (rev 
6667)
+++ code/stage/trunk/libstage/options_dlg.cc    2008-06-23 22:18:02 UTC (rev 
6668)
@@ -1,68 +1,69 @@
 #include "options_dlg.hh"
 #include <FL/Fl.H>
 
+namespace Stg {
 
-OptionsDlg::OptionsDlg( const std::vector<Option>& opts, int w, int h ) :
-Fl_Window( w, h, "Model Options" ),
-options( opts ) {
-       const int hm = w/6;
-       const int vm = 2;
-       const int btnH = 25;
-       
-       scroll = new Fl_Scroll( 0, 0, w, h-btnH-2*vm );
-       scroll->type( Fl_Scroll::VERTICAL );
-       
-       Fl_Check_Button* check;
-       for ( unsigned int i=0; i<options.size(); i++ ) {
-               check = new Fl_Check_Button( 0,30*i, w, 30, options[ i 
].name().c_str() );
-               if ( options[ i ].val() )
-                       check->set();
-               check->callback( checkChanged, this );
+       OptionsDlg::OptionsDlg( int x, int y, int w, int h ) :
+       Fl_Window( /*x,y,*/w, h, "Model Options" ),
+       hm( w/6 ) {
+               scroll = new Fl_Scroll( 0, 0, w, h-btnH-2*vm );
+               scroll->type( Fl_Scroll::VERTICAL );
+               scroll->end();
+               
+               button = new Fl_Button( hm, h-btnH-vm, w-2*hm, btnH, "Apply to 
all" );
+               button->callback( applyAllPress, this );
+               this->end();
        }
-       scroll->end();
-       
-       button = new Fl_Button( hm, h-btnH-vm, w-2*hm, btnH, "Apply to all" );
-       button->callback( applyAllPress, this );
-       this->end();
-}
 
-OptionsDlg::~OptionsDlg() {
-       delete button;
-       delete scroll; // deletes members
-}
+       OptionsDlg::~OptionsDlg() {
+               delete button;
+               delete scroll; // deletes members
+       }
 
-void OptionsDlg::display() {
-       Fl_Window::show();
-       while ( shown() )
-               Fl::wait();
-}
 
-void OptionsDlg::checkChanged( Fl_Widget* w, void* p ) {
-       Fl_Check_Button* check = static_cast<Fl_Check_Button*>( w );
-       OptionsDlg* oDlg = static_cast<OptionsDlg*>( p );
-       
-       int item = oDlg->scroll->find( check );
-       oDlg->options[ item ].set( check->value() );
-       oDlg->changedItem = oDlg->options[ item ];
-       oDlg->do_callback();
-}
+       void OptionsDlg::checkChanged( Fl_Widget* w, void* p ) {
+               Fl_Check_Button* check = static_cast<Fl_Check_Button*>( w );
+               OptionsDlg* oDlg = static_cast<OptionsDlg*>( p );
+               
+               int item = oDlg->scroll->find( check );
+               oDlg->options[ item ].set( check->value() );
+               oDlg->changedItem = oDlg->options[ item ];
+               oDlg->do_callback();
+       }
 
-void OptionsDlg::applyAllPress( Fl_Widget* w, void* p ) {
-       OptionsDlg* oDlg = static_cast<OptionsDlg*>( p );
-       
-       oDlg->changedItem = Option( -1, "", false );
-       oDlg->do_callback();
-}
+       void OptionsDlg::applyAllPress( Fl_Widget* w, void* p ) {
+               OptionsDlg* oDlg = static_cast<OptionsDlg*>( p );
+               
+               oDlg->changedItem = Option( -1, "", false );
+               oDlg->do_callback();
+       }
 
-int OptionsDlg::handle( int event ) {
-       switch ( event ) {
-               case FL_SHORTCUT:
-                       if ( Fl::event_key() == FL_Escape ) {
-                               hide();
-                               return 1;
-                       }
-                       break;
+       int OptionsDlg::handle( int event ) {
+       //      switch ( event ) {
+       //              
+       //      }
+               
+               return Fl_Window::handle( event );
        }
-       
-       return Fl_Window::handle( event );
-}
\ No newline at end of file
+
+
+       void OptionsDlg::updateChecks() {
+               scroll->clear();
+               scroll->begin();
+               Fl_Check_Button* check;
+               for ( unsigned int i=0; i<options.size(); i++ ) {
+                       check = new Fl_Check_Button( 0,boxH*i, scroll->w(), 
boxH, options[ i ].name().c_str() );
+                       if ( options[ i ].val() )
+                               check->set();
+                       check->callback( checkChanged, this );
+               }
+               scroll->end();
+       }
+
+       void OptionsDlg::setOptions( const std::vector<Option>& opts ) {
+               options.clear();
+               options.insert( options.begin(), opts.begin(), opts.end() );
+               updateChecks();
+       }
+
+} // namespace Stg 
\ No newline at end of file

Modified: code/stage/trunk/libstage/options_dlg.hh
===================================================================
--- code/stage/trunk/libstage/options_dlg.hh    2008-06-23 21:17:23 UTC (rev 
6667)
+++ code/stage/trunk/libstage/options_dlg.hh    2008-06-23 22:18:02 UTC (rev 
6668)
@@ -9,40 +9,42 @@
 #include <string>
 #include <vector>
 
+#include "option.hh"
 
-class Option {
-private:
-       int index;
-       std::string optName;
-       bool value;
-public:
-       Option() { }
-       Option( int i, std::string n, bool v ) : index( i ), optName( n ), 
value( v ) { }
-       Option( const Option& o ) : index( o.index ), optName( o.optName ), 
value( o.value ) { }
-       const std::string name() const { return optName; }
-       const int id() const { return index; }
-       const bool val() const { return value; }
-       void set( bool val ) { value = val; }
-};
+namespace Stg {
 
+       class OptionsDlg : protected Fl_Window {
+       private:
+               std::vector<Option> options;
+               Option changedItem;
+               Fl_Scroll* scroll;
+               Fl_Button* button;
+               void updateChecks();
+               
+               virtual int handle( int event );
+               static void checkChanged( Fl_Widget* w, void* p );
+               static void applyAllPress( Fl_Widget* w, void* p );
 
-class OptionsDlg : protected Fl_Window {
-private:
-       std::vector<Option> options;
-       Fl_Scroll* scroll;
-       Fl_Button* button;
-       virtual int handle( int event );
-       static void checkChanged( Fl_Widget* w, void* p );
-       static void applyAllPress( Fl_Widget* w, void* p );
-       Option changedItem;
-public:
-       OptionsDlg( const std::vector<Option>& opts, int w, int h );
-       virtual ~OptionsDlg();
-       void display(); 
-       void callback( Fl_Callback* cb, void* p ) { Fl_Window::callback( cb, p 
); }
-       //void setChangeCb( Fl_Callback* cb, void* p );
-       const Option changed() const { return changedItem; }
-       void hide() { Fl_Window::hide(); }
-};
+       public:
+               OptionsDlg( int x, int y, int w, int h );
+               virtual ~OptionsDlg();
+               void callback( Fl_Callback* cb, void* p ) { 
Fl_Window::callback( cb, p ); }
+               void show() { Fl_Window::show(); }
+               void hide() { Fl_Window::hide(); }
+               
+               void setOptions( const std::vector<Option>& opts );
+               void clearOptions() { options.clear(); }
+               const Option changed() const { return changedItem; }
+               
+       private:
+               // constants
+               static const int vm = 2;
+               const int hm;
+               static const int btnH = 25;
+               static const int boxH = 30;
+       };
 
+}
+       
 #endif
+

Modified: code/stage/trunk/libstage/stage.hh
===================================================================
--- code/stage/trunk/libstage/stage.hh  2008-06-23 21:17:23 UTC (rev 6667)
+++ code/stage/trunk/libstage/stage.hh  2008-06-23 22:18:02 UTC (rev 6668)
@@ -54,6 +54,7 @@
 #include <sys/types.h>
 #include <sys/time.h>
 #include <iostream>
+#include <vector>
 
 // we use GLib's data structures extensively. Perhaps we'll move to
 // C++ STL types to lose this dependency one day.
@@ -75,8 +76,7 @@
 #include <GL/glu.h>
 #endif 
 
-#include "file_manager.hh"
-#include "options_dlg.hh"
+#include "option.hh"
 
 /** The Stage library uses its own namespace */
 namespace Stg 
@@ -87,6 +87,8 @@
        class StgWorld;
        class StgWorldGui;
        class StgModel;
+       class FileManager;
+       class OptionsDlg;
   
        /** Initialize the Stage library */
        void Init( int* argc, char** argv[] );
@@ -1090,7 +1092,7 @@
 
        virtual ~StgWorld();
 
-  FileManager fileMan;
+  FileManager* fileMan;
 
        stg_usec_t SimTimeNow(void){ return sim_time;} ;
        stg_usec_t RealTimeNow(void);
@@ -1164,7 +1166,6 @@
   static uint32_t count;
   static GHashTable*  modelsbyid;
 
-
 public:
   
   /** Look up a model pointer by a unique model ID */
@@ -1234,7 +1235,8 @@
        int gui_grid;
        int gui_outline;
        int gui_mask;
-
+       
+       
        StgModel* parent; //< the model that owns this one, possibly NULL
 
        /** GData datalist can contain arbitrary named data items. Can be used
@@ -1399,7 +1401,7 @@
 
   stg_model_type_t type;
 
-       public:
+public:
 
   static const char* typestr;
 
@@ -1440,7 +1442,7 @@
        StgFlag* PopFlag();
 
        int GetFlagCount(){ return g_list_length( flag_list ); }
-
+       
        void DrawFlagList();
 
        void AddBlinkenlight( stg_blinkenlight_t* b )
@@ -1999,6 +2001,7 @@
   //int wf_section;
   StgCanvas* canvas;
   Fl_Menu_Bar* mbar;
+  OptionsDlg* oDlg;
   stg_usec_t interval_log[INTERVAL_LOG_LEN];
   
   stg_usec_t real_time_of_last_update;

Modified: code/stage/trunk/libstage/world.cc
===================================================================
--- code/stage/trunk/libstage/world.cc  2008-06-23 21:17:23 UTC (rev 6667)
+++ code/stage/trunk/libstage/world.cc  2008-06-23 22:18:02 UTC (rev 6668)
@@ -52,6 +52,7 @@
 
 #include "stage_internal.hh"
 #include "region.hh"
+#include "file_manager.hh"
 
 
 // static data members
@@ -147,6 +148,8 @@
        bzero( &this->extent, sizeof(this->extent));
 
        this->real_time_now = 0;
+       
+       fileMan = new FileManager();
 }
 
 StgWorld::~StgWorld( void )
@@ -162,6 +165,8 @@
        g_free( token );
 
        world_list = g_list_remove( world_list, this );
+       
+       delete fileMan;
 }
 
 

Modified: code/stage/trunk/libstage/worldgui.cc
===================================================================
--- code/stage/trunk/libstage/worldgui.cc       2008-06-23 21:17:23 UTC (rev 
6667)
+++ code/stage/trunk/libstage/worldgui.cc       2008-06-23 22:18:02 UTC (rev 
6668)
@@ -105,7 +105,10 @@
 #include <FL/Fl_Text_Display.H>
 #include <FL/Fl_File_Chooser.H>
 
+#include "file_manager.hh"
+#include "options_dlg.hh"
 
+
 static const char* MITEM_VIEW_DATA =      "&View/&Data";
 static const char* MITEM_VIEW_BLOCKS =    "&View/&Blocks";
 static const char* MITEM_VIEW_GRID =      "&View/&Grid";
@@ -147,6 +150,8 @@
        canvas = new StgCanvas( this,0,30,W,H-30 );
        resizable(canvas);
        end();
+       
+       oDlg = NULL;
 
        mbar->add( "&File", 0, 0, 0, FL_SUBMENU );
        mbar->add( "File/&Load World...", FL_CTRL + 'l', (Fl_Callback 
*)LoadCallback, this, FL_MENU_DIVIDER );
@@ -198,6 +203,8 @@
 StgWorldGui::~StgWorldGui()
 {
        delete mbar;
+       if ( oDlg )
+               delete oDlg;
        delete canvas;
 }
 
@@ -254,7 +261,7 @@
 {
        PRINT_DEBUG1( "%s.Load()", token );
        
-       fileMan.newWorld( filename );
+       fileMan->newWorld( filename );
 
        StgWorld::Load( filename );
        
@@ -351,7 +358,7 @@
        //bool success;
        const char* pattern = "World Files (*.world)";
        
-       worldsPath = world->fileMan.worldsRoot().c_str();
+       worldsPath = world->fileMan->worldsRoot().c_str();
        Fl_File_Chooser fc( worldsPath, pattern, Fl_File_Chooser::CREATE, "Load 
World File..." );
        fc.ok_label( "Load" );
        
@@ -362,7 +369,7 @@
        filename = fc.value();
        
        if (filename != NULL) { // chose something
-               if ( world->fileMan.readable( filename ) ) {
+               if ( world->fileMan->readable( filename ) ) {
                        // file is readable, clear and load
 
                        // if (initialized) {
@@ -513,19 +520,35 @@
                options.push_back( o );
        }
        
-       OptionsDlg oDlg( options, 180, 250 );
-       oDlg.callback( optionsDlgCb, worldGui );
-       oDlg.display();
-       
-       printf("Dialog callback ended\n");
+       if ( !worldGui->oDlg ) {
+               OptionsDlg* oDlg = new OptionsDlg( 0, 0, 180, 250 );
+               // TODO - move initial coords to right edge of window
+               //printf("width: %d\n", worldGui->w());
+               oDlg->callback( optionsDlgCb, worldGui );
+               oDlg->setOptions( options );
+               oDlg->show();
+
+               worldGui->oDlg = oDlg;
+       }
+       else {
+               worldGui->oDlg->show(); // bring it to front
+       }
 }
 
 void StgWorldGui::optionsDlgCb( Fl_Widget* w, void* p ) {
        OptionsDlg* oDlg = static_cast<OptionsDlg*>( w );
        StgWorldGui* worldGui = static_cast<StgWorldGui*>( p );
        switch ( Fl::event() ) {
+               case FL_SHORTCUT:
+                       if ( Fl::event_key() != FL_Escape ) 
+                               break;
+                       // otherwise, ESC pressed-> do as below
                case FL_CLOSE: // clicked close button
+                       // invalidate the oDlg pointer from the WorldGui
+                       //   instance before the dialog is destroyed
+                       worldGui->oDlg = NULL; 
                        oDlg->hide();
+                       Fl::delete_widget( oDlg );
                        return;
                default:
                        Option o = oDlg->changed();
@@ -534,6 +557,18 @@
        }
 }
 
+void AboutCloseCb( Fl_Widget* w, void* p ) {
+       Fl_Window* win;
+       win = static_cast<Fl_Window*>( w );
+       Fl_Text_Display* textDisplay;
+       textDisplay = static_cast<Fl_Text_Display*>( p );
+       
+       Fl_Text_Buffer* tbuf = textDisplay->buffer();
+       textDisplay->buffer( NULL );
+       delete tbuf;
+       Fl::delete_widget( win );
+}
+
 void StgWorldGui::About_cb( Fl_Widget*, StgWorldGui* world ) 
 {
        fl_register_images();
@@ -546,22 +581,23 @@
        const int pngH = 82;
        //const int pngW = 264;
        
-       Fl_Window win( Width, Height ); // make a window
+       Fl_Window* win = new Fl_Window( Width, Height ); // make a window
 
-       Fl_Box box( Spc, Spc, 
+       Fl_Box* box = new Fl_Box( Spc, Spc, 
                           Width-2*Spc, pngH ); // widget that will contain 
image
 
        
        std::string fullpath;
-       fullpath = world->fileMan.fullPath( "stagelogo.png" );
-       Fl_PNG_Image png( fullpath.c_str() ); // load image into ram
-       box.image(png); // attach image to box
+       fullpath = world->fileMan->fullPath( "stagelogo.png" );
+       Fl_PNG_Image* png = new Fl_PNG_Image( fullpath.c_str() ); // load image 
into ram
+       box->image( png ); // attach image to box
        
        Fl_Text_Display* textDisplay;
        textDisplay = new Fl_Text_Display( Spc, pngH+2*Spc,
                                                  Width-2*Spc, 
Height-pngH-ButtonH-4*Spc );
        textDisplay->box( FL_NO_BOX );
-       textDisplay->color(win.color());
+       textDisplay->color( win->color() );
+       win->callback( AboutCloseCb, textDisplay );
        
        const char* AboutText = 
                "\n" 
@@ -574,17 +610,13 @@
        tbuf->append( AboutText );
        textDisplay->buffer( tbuf );
        
-       Fl_Return_Button button( (Width - ButtonW)/2, Height-Spc-ButtonH,
+       Fl_Return_Button* button;
+       button = new Fl_Return_Button( (Width - ButtonW)/2, Height-Spc-ButtonH,
                                          ButtonW, ButtonH,
                                          "&OK" );
-       button.callback( (Fl_Callback*)HelpAboutCallback );
+       button->callback( (Fl_Callback*)HelpAboutCallback );
        
-       win.show();
-       while (win.shown())
-               Fl::wait();
-       
-       delete textDisplay;
-       delete tbuf;
+       win->show();
 }
 
 void StgWorldGui::HelpAboutCallback( Fl_Widget* wid ) {


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
Playerstage-commit mailing list
Playerstage-commit@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/playerstage-commit

Reply via email to