00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <assert.h>
00021 #include "construo.hxx"
00022 #include "zoom_graphic_context.hxx"
00023 #include "gui_file_manager.hxx"
00024 #include "screen_manager.hxx"
00025 #include "gui_buttons.hxx"
00026
00027 void DirectoryUp ()
00028 {
00029 GUIFileManager::instance()->directory_up();
00030 }
00031
00032 void ScrollUp ()
00033 {
00034 GUIFileManager::instance()->scroll_up();
00035 }
00036
00037 void ScrollDown ()
00038 {
00039 GUIFileManager::instance()->scroll_down();
00040 }
00041
00042 void ReReadCurrentDir ()
00043 {
00044 GUIFileManager::instance()->update_current_directory();
00045 }
00046
00047
00048 void CloseFileManager ()
00049 {
00050 ScreenManager::instance()->set_gui(ScreenManager::WORLD_GUI);
00051 }
00052
00053 GUIFileManager* GUIFileManager::instance_ = 0;
00054
00055 GUIFileManager::GUIFileManager (Mode m)
00056 : GUIChildManager (0, 0, 800, 600),
00057 mode (m)
00058 {
00059 if (mode == SAVE_MANAGER)
00060 current_directory = new GUIDirectory ("/", GUIDirectory::SAVE_DIRECTORY);
00061 else
00062 current_directory = new GUIDirectory ("/", GUIDirectory::LOAD_DIRECTORY);
00063
00064 directories["/"] = current_directory;
00065
00066 add (new GUIGenericButton("Up", 0,0, 100, 25, DirectoryUp));
00067 add (new GUIGenericButton("Close", 700, 0, 100, 25, CloseFileManager));
00068
00069 add (new GUIGenericButton("^", 770, 200, 25, 50, ScrollUp));
00070 add (new GUIGenericButton("V", 770, 300, 25, 50, ScrollDown));
00071
00072 add (new GUIGenericButton("Update Directory", 650, 575, 150, 25, ReReadCurrentDir));
00073
00074 add(current_directory);
00075
00076 instance_ = this;
00077 }
00078
00079 GUIFileManager::~GUIFileManager ()
00080 {
00081
00082 }
00083
00084 void
00085 GUIFileManager::open_directory (const std::string& pathname)
00086 {
00087 std::cout << "GUIFileManager::open_directory: " << pathname << std::endl;
00088 GUIDirectory* old_directory = current_directory;
00089
00090 if (directories[pathname] == 0)
00091 {
00092 if (mode == SAVE_MANAGER)
00093 {
00094 current_directory = directories[pathname] = new GUIDirectory(pathname,
00095 GUIDirectory::SAVE_DIRECTORY);
00096 }
00097 else
00098 {
00099 current_directory = directories[pathname] = new GUIDirectory(pathname,
00100 GUIDirectory::LOAD_DIRECTORY);
00101 }
00102 }
00103 else
00104 {
00105 current_directory = directories[pathname];
00106 }
00107
00108 std::cout << "Replace: " << old_directory << " " << current_directory << std::endl;
00109 replace (old_directory, current_directory);
00110 }
00111
00112 void
00113 GUIFileManager::directory_up()
00114 {
00115 std::string pathname = current_directory->get_path ();
00116
00117
00118 if (pathname == "/")
00119 {
00120
00121 return;
00122 }
00123 else
00124 {
00125 assert(*(pathname.end()-1) == '/');
00126
00127 for (std::string::size_type i = pathname.size() - 2; i >= 0; --i)
00128 {
00129 if (pathname[i] == '/')
00130 {
00131 pathname = pathname.substr(0, i+1);
00132 break;
00133 }
00134 }
00135
00136 std::cout << "Directory Up: " << current_directory->get_path () << " -> " << pathname << std::endl;
00137 open_directory (pathname);
00138 }
00139 }
00140
00141 void
00142 GUIFileManager::draw_overlay (GraphicContext* gc)
00143 {
00144 gc->draw_string(200, 16, current_directory->get_path());
00145 }
00146
00147 void
00148 GUIFileManager::scroll_up ()
00149 {
00150 current_directory->move_up();
00151 }
00152
00153 void
00154 GUIFileManager::scroll_down ()
00155 {
00156 current_directory->move_down();
00157 }
00158
00159 void
00160 GUIFileManager::update_current_directory()
00161 {
00162
00163 std::string pathname = current_directory->get_path();
00164
00165 GUIDirectory* old_directory = current_directory;
00166
00167 if (mode == SAVE_MANAGER)
00168 {
00169 current_directory = directories[pathname] = new GUIDirectory(pathname,
00170 GUIDirectory::SAVE_DIRECTORY);
00171 }
00172 else
00173 {
00174 current_directory = directories[pathname] = new GUIDirectory(pathname,
00175 GUIDirectory::LOAD_DIRECTORY);
00176 }
00177
00178 replace (old_directory, current_directory);
00179 delete old_directory;
00180 }
00181
00182