Revision: 6548
http://playerstage.svn.sourceforge.net/playerstage/?rev=6548&view=rev
Author: jeremy_asher
Date: 2008-06-12 15:27:04 -0700 (Thu, 12 Jun 2008)
Log Message:
-----------
Implemented FileManager class to help with resource locating
Modified Paths:
--------------
code/stage/trunk/libstage/CMakeLists.txt
code/stage/trunk/libstage/canvas.cc
code/stage/trunk/libstage/stage.hh
code/stage/trunk/libstage/texture_manager.cc
code/stage/trunk/libstage/worldgui.cc
Added Paths:
-----------
code/stage/trunk/libstage/file_manager.cc
code/stage/trunk/libstage/file_manager.hh
Modified: code/stage/trunk/libstage/CMakeLists.txt
===================================================================
--- code/stage/trunk/libstage/CMakeLists.txt 2008-06-12 16:55:06 UTC (rev
6547)
+++ code/stage/trunk/libstage/CMakeLists.txt 2008-06-12 22:27:04 UTC (rev
6548)
@@ -1,6 +1,8 @@
add_library( stage SHARED
stage.hh # get headers into IDE projects
+ file_manager.hh
+ file_manager.cc
ancestor.cc
block.cc
canvas.cc
Modified: code/stage/trunk/libstage/canvas.cc
===================================================================
--- code/stage/trunk/libstage/canvas.cc 2008-06-12 16:55:06 UTC (rev 6547)
+++ code/stage/trunk/libstage/canvas.cc 2008-06-12 22:27:04 UTC (rev 6548)
@@ -7,6 +7,7 @@
#include "stage_internal.hh"
#include "texture_manager.hh"
#include "replace.h"
+#include <string>
using namespace Stg;
@@ -557,7 +558,14 @@
//TODO find a better home for loading textures
if( loaded_texture == false ) {
- GLuint stall_id =
TextureManager::getInstance().loadTexture( "assets/stall.png" );
+ std::string fullpath;
+ fullpath = world->fileMan.fullPath( "stall.png" );
+ if ( fullpath == "" ) {
+ PRINT_DEBUG( "Unable to load texture.\n" );
+ }
+
+ GLuint stall_id =
TextureManager::getInstance().loadTexture( fullpath.c_str() );
+
TextureManager::getInstance()._stall_texture_id =
stall_id;
loaded_texture = true;
Added: code/stage/trunk/libstage/file_manager.cc
===================================================================
--- code/stage/trunk/libstage/file_manager.cc (rev 0)
+++ code/stage/trunk/libstage/file_manager.cc 2008-06-12 22:27:04 UTC (rev
6548)
@@ -0,0 +1,65 @@
+#include "file_manager.hh"
+#include "stage.hh" // to get PRINT_DEBUG
+
+namespace Stg
+{
+ FileManager::FileManager() {
+ SharePath = INSTALL_PREFIX "/share/stage";
+ AssetPath = SharePath + '/' + "assets";
+ CtrlPath = getenv("STAGEPATH");
+ WorldsRoot = ".";
+
+ paths.push_back( "." );
+ paths.push_back( SharePath );
+ paths.push_back( AssetPath );
+ paths.push_back( CtrlPath );
+ }
+
+ std::string FileManager::fullPath( std::string filename ) {
+ PRINT_DEBUG1("FileManager: trying %s\n", filename.c_str());
+ if ( readable( filename ) )
+ return filename;
+
+ for ( unsigned int i=0; i<paths.size(); i++ ) {
+ std::string path = paths[i] + '/' + filename;
+ PRINT_DEBUG1("FileManager: trying %s\n", path.c_str());
+ if ( readable( path ) ) {
+ return path;
+ }
+ }
+
+ PRINT_DEBUG("FileManager: Not found.\n");
+ return "";
+ }
+
+ /*std::string FileManager::fullPathImage( std::string filename ) {
+ std::string path = ImgPath + '/' + filename;
+ if ( readable ( path ) )
+ return path;
+ else
+ return "";
+ }*/
+
+ bool FileManager::readable( std::string path ) {
+ std::ifstream iFile;
+ iFile.open( path.c_str() );
+ if ( iFile.is_open() ) {
+ iFile.close();
+ return true;
+ }
+ else {
+ return false;
+ }
+ }
+
+ std::string FileManager::stripFilename( std::string path ) {
+ std::string pathChars( "\\/" );
+ size_t loc = path.find_last_of( pathChars );
+ if ( loc < 0 )
+ return path;
+ else
+ return path.substr( 0, loc );
+ }
+
+}; // namespace Stg
+
Added: code/stage/trunk/libstage/file_manager.hh
===================================================================
--- code/stage/trunk/libstage/file_manager.hh (rev 0)
+++ code/stage/trunk/libstage/file_manager.hh 2008-06-12 22:27:04 UTC (rev
6548)
@@ -0,0 +1,38 @@
+#ifndef _FILE_MANAGER_HH_
+#define _FILE_MANAGER_HH_
+
+// Normally passed by build scripts
+#ifndef INSTALL_PREFIX
+#define INSTALL_PREFIX "."
+#endif
+
+#include <fstream>
+#include <string>
+#include <vector>
+
+namespace Stg {
+
+ class FileManager {
+ private:
+ std::vector<std::string> paths;
+ std::string SharePath;
+ std::string AssetPath;
+ std::string CtrlPath;
+ std::string WorldsRoot;
+
+ std::string stripFilename( std::string path );
+ public:
+ FileManager();
+
+ std::string fullPath( std::string filename );
+ //std::string fullPathImage( std::string filename );
+
+ inline const std::string worldsRoot() const { return
WorldsRoot; }
+ inline void newWorld( std::string worldfile ) {
+ WorldsRoot = stripFilename( worldfile ); }
+
+ bool readable( std::string path );
+ };
+
+};
+#endif
Modified: code/stage/trunk/libstage/stage.hh
===================================================================
--- code/stage/trunk/libstage/stage.hh 2008-06-12 16:55:06 UTC (rev 6547)
+++ code/stage/trunk/libstage/stage.hh 2008-06-12 22:27:04 UTC (rev 6548)
@@ -79,6 +79,7 @@
#include <GL/glu.h>
#endif
+#include "file_manager.hh"
/** The Stage library uses its own namespace */
namespace Stg
@@ -928,8 +929,8 @@
friend class StgBlock;
friend class StgTime;
- private:
-
+private:
+
static bool quit_all; // quit all worlds ASAP
static unsigned int next_id; //< initialized to zero, used tob
//allocate unique sequential world ids
@@ -1041,6 +1042,8 @@
double ppm );
virtual ~StgWorld();
+
+ FileManager fileMan;
stg_usec_t SimTimeNow(void){ return sim_time;} ;
stg_usec_t RealTimeNow(void);
@@ -1892,9 +1895,9 @@
static void SaveCallback( Fl_Widget* wid, StgWorldGui* world );
static void SaveAsCallback( Fl_Widget* wid, StgWorldGui* world );
static void QuitCallback( Fl_Widget* wid, StgWorldGui* world );
- static void About_cb( Fl_Widget* wid );
+ static void About_cb( Fl_Widget* wid, StgWorldGui* world );
static void HelpAboutCallback( Fl_Widget* wid );
- static void view_toggle_cb(Fl_Menu_Bar* menubar, StgCanvas* canvas );
+ static void view_toggle_cb( Fl_Menu_Bar* menubar, StgCanvas* canvas );
static void WindowCallback( Fl_Widget* wid, StgWorldGui* world );
bool SaveAsDialog();
Modified: code/stage/trunk/libstage/texture_manager.cc
===================================================================
--- code/stage/trunk/libstage/texture_manager.cc 2008-06-12 16:55:06 UTC
(rev 6547)
+++ code/stage/trunk/libstage/texture_manager.cc 2008-06-12 22:27:04 UTC
(rev 6548)
@@ -7,29 +7,15 @@
*/
#include "texture_manager.hh"
+#include "file_manager.hh"
#include <sstream>
-//TODO Windows Port
Fl_Shared_Image* TextureManager::loadImage( const char* filename )
-{
- if( filename[ 0 ] == '/' || filename[ 0 ] == '~' )
- return Fl_Shared_Image::get( filename );
-
- //TODO move this somewhere else, and include STAGEPATH, and path
relative to user supplied world file
- const char* prefixes[] = {
- ".",
- INSTALL_PREFIX "/share/stage",
- NULL
- };
-
+{
Fl_Shared_Image *img = NULL;
- int i = 0;
- while( img == NULL && prefixes[ i ] != NULL ) {
- std::ostringstream oss;
- oss << prefixes[ i ] << "/" << filename;
- img = Fl_Shared_Image::get( oss.str().c_str() );
- i++;
- }
+
+ img = Fl_Shared_Image::get( filename );
+
return img;
}
Modified: code/stage/trunk/libstage/worldgui.cc
===================================================================
--- code/stage/trunk/libstage/worldgui.cc 2008-06-12 16:55:06 UTC (rev
6547)
+++ code/stage/trunk/libstage/worldgui.cc 2008-06-12 22:27:04 UTC (rev
6548)
@@ -105,6 +105,8 @@
#include <FL/Fl_Text_Display.H>
#include <FL/Fl_File_Chooser.H>
+#include "file_manager.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";
@@ -174,7 +176,7 @@
FL_MENU_TOGGLE| (canvas->showflags & STG_SHOW_TRAILRISE
? FL_MENU_VALUE : 0 ));
mbar->add( "&Help", 0, 0, 0, FL_SUBMENU );
- mbar->add( "Help/&About Stage...", NULL, (Fl_Callback *)About_cb );
+ mbar->add( "Help/&About Stage...", NULL, (Fl_Callback *)About_cb, this
);
//mbar->add( "Help/HTML Documentation", FL_CTRL + 'g', (Fl_Callback
*)dummy_cb );
callback( (Fl_Callback*)WindowCallback, this );
@@ -271,8 +273,7 @@
//bool success;
const char* pattern = "World Files (*.world)";
- // todo: replace this with real path
- worldsPath = "/Users/jeremya/stage_trunk/worlds";
+ worldsPath = world->fileMan.worldsRoot().c_str();
Fl_File_Chooser fc( worldsPath, pattern, Fl_File_Chooser::CREATE, "Load
World File..." );
fc.ok_label( "Load" );
@@ -282,15 +283,25 @@
filename = fc.value();
- if (filename != NULL) {
- // if (initialized) {
- world->Stop();
- world->UnLoad();
- // }
+ if (filename != NULL) { // chose something
+ if ( world->fileMan.readable( filename ) ) {
+ // file is readable, clear and load
+
+ // if (initialized) {
+ world->Stop();
+ world->UnLoad();
+ // }
+
+ // todo: make sure loading is successful
+ world->fileMan.newWorld( filename );
+ world->Load( filename );
+ world->Start(); // if (stopped)
+ }
+ else {
+ fl_alert( "Unable to read selected world file." );
+ }
- // todo: make sure loading is successful
- world->Load( filename );
- world->Start();
+
}
}
@@ -407,7 +418,7 @@
//printf( "value: %d\n", item->value() );
}
-void StgWorldGui::About_cb( Fl_Widget* )
+void StgWorldGui::About_cb( Fl_Widget*, StgWorldGui* world )
{
fl_register_images();
@@ -416,30 +427,22 @@
const int Spc = 10;
const int ButtonH = 25;
const int ButtonW = 60;
+ const int pngH = 82;
+ //const int pngW = 264;
Fl_Window win( Width, Height ); // make a window
- // <temporary hack>
- const char* stagepath = getenv("STAGEPATH");
- const char* logopath = "../../../assets/logo.png";
- char* fullpath = (char*)malloc( strlen(stagepath) + strlen(logopath) +
2 );
- strcpy( fullpath, stagepath );
- strcat( fullpath, "/" );
- strcat( fullpath, logopath );
- printf("fullpath: %s\n", fullpath);
- Fl_PNG_Image png(fullpath); // load image into ram
- free( fullpath );
-
Fl_Box box( Spc, Spc,
- Width-2*Spc, png.h() ); // widget that will contain
image
-
+ Width-2*Spc, pngH ); // widget that will contain
image
- // </temporary hack>
+ 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
-
- Fl_Text_Display text( Spc, png.h()+2*Spc,
- Width-2*Spc,
Height-png.h()-ButtonH-4*Spc );
+
+ Fl_Text_Display text( Spc, pngH+2*Spc,
+ Width-2*Spc,
Height-pngH-ButtonH-4*Spc );
text.box( FL_NO_BOX );
text.color(win.color());
@@ -462,6 +465,8 @@
win.show();
while (win.shown())
Fl::wait();
+
+
}
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit