diff options
-rw-r--r-- | backends/platform/dc/dc.h | 8 | ||||
-rw-r--r-- | backends/platform/dc/plugins.cpp | 23 | ||||
-rw-r--r-- | backends/platform/dc/selector.cpp | 53 |
3 files changed, 84 insertions, 0 deletions
diff --git a/backends/platform/dc/dc.h b/backends/platform/dc/dc.h index 34e8014ed9..a3f7423eed 100644 --- a/backends/platform/dc/dc.h +++ b/backends/platform/dc/dc.h @@ -250,6 +250,11 @@ public: protected: Plugin* createPlugin(const Common::FSNode &node) const; bool isPluginFilename(const Common::FSNode &node) const; + void addCustomDirectories(Common::FSList &dirs) const; + public: + PluginList getPlugins(); + private: + const char *pluginCustomDirectory; #endif }; @@ -258,3 +263,6 @@ extern int handleInput(struct mapledev *pad, int &mouse_x, int &mouse_y, byte &shiftFlags, Interactive *inter = NULL); extern bool selectGame(char *&, char *&, Common::Language &, Common::Platform &, class Icon &); +#ifdef DYNAMIC_MODULES +extern bool selectPluginDir(Common::String &selection, const Common::FSNode &base); +#endif diff --git a/backends/platform/dc/plugins.cpp b/backends/platform/dc/plugins.cpp index 93689157f3..cf1558eaa8 100644 --- a/backends/platform/dc/plugins.cpp +++ b/backends/platform/dc/plugins.cpp @@ -130,4 +130,27 @@ bool OSystem_Dreamcast::isPluginFilename(const Common::FSNode &node) const { return true; } +void OSystem_Dreamcast::addCustomDirectories(Common::FSList &dirs) const +{ + FilePluginProvider::addCustomDirectories(dirs); + if (pluginCustomDirectory != NULL) + dirs.push_back(Common::FSNode(pluginCustomDirectory)); +} + +PluginList OSystem_Dreamcast::getPlugins() +{ + pluginCustomDirectory = NULL; + PluginList list = FilePluginProvider::getPlugins(); + if (list.empty()) { + Common::String selection; + if (selectPluginDir(selection, Common::FSNode("plugins"))) { + pluginCustomDirectory = selection.c_str(); + list = FilePluginProvider::getPlugins(); + pluginCustomDirectory = NULL; + } + } + return list; +} + + #endif // defined(DYNAMIC_MODULES) diff --git a/backends/platform/dc/selector.cpp b/backends/platform/dc/selector.cpp index 914d683334..18528f86e1 100644 --- a/backends/platform/dc/selector.cpp +++ b/backends/platform/dc/selector.cpp @@ -39,6 +39,7 @@ #define MAX_GAMES 100 #define MAX_DIR 100 +#define MAX_PLUGIN_DIRS 100 void draw_solid_quad(float x1, float y1, float x2, float y2, @@ -517,3 +518,55 @@ bool selectGame(char *&ret, char *&dir_ret, Common::Language &lang_ret, Common:: } else return false; } + +#ifdef DYNAMIC_MODULES +static int findPluginDirs(Game *plugin_dirs, int max, const Common::FSNode &base) +{ + Common::FSList fslist; + int curr_dir = 0; + base.getChildren(fslist, Common::FSNode::kListDirectoriesOnly); + for (Common::FSList::const_iterator entry = fslist.begin(); entry != fslist.end(); + ++entry) { + if (entry->isDirectory()) { + if (curr_dir >= max) + break; + strncpy(plugin_dirs[curr_dir].dir, (*entry).getPath().c_str(), 256); + strncpy(plugin_dirs[curr_dir].text, (*entry).getDisplayName().c_str(), 256); + plugin_dirs[curr_dir].icon.load(NULL, 0, 0); + curr_dir++; + } + } + return curr_dir; +} + +bool selectPluginDir(Common::String &selection, const Common::FSNode &base) +{ + Game *plugin_dirs = new Game[MAX_PLUGIN_DIRS]; + int selected, num_plugin_dirs; + + ta_sync(); + void *mark = ta_txmark(); + + num_plugin_dirs = findPluginDirs(plugin_dirs, MAX_PLUGIN_DIRS, base); + + for (int i=0; i<num_plugin_dirs; i++) { + plugin_dirs[i].icon.create_texture(); + plugin_dirs[i].label.create_texture(plugin_dirs[i].text); + } + + selected = gameMenu(plugin_dirs, num_plugin_dirs); + + ta_sync(); + ta_txrelease(mark); + + if (selected >= num_plugin_dirs) + selected = -1; + + if (selected >= 0) + selection = plugin_dirs[selected].dir; + + delete[] plugin_dirs; + + return selected >= 0; +} +#endif |