/* client/savegamemenu.cc This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #include "client/savegamemenu.h" #include "filesystem/filesystem.h" #include "ui/ui.h" namespace client { SaveGameMenu::SaveGameMenu(ui::Widget *parent, const char *label, const Mode mode) : ui::Window(parent) { set_label(label); set_border(true); set_background(true); set_font(ui::root()->font_small()); savegamemenu_mode = mode; // window title savegamemenu_titlelabel = new ui::Label(this); savegamemenu_titlelabel->set_label("title"); savegamemenu_titlelabel->set_background(false); savegamemenu_titlelabel->set_border(false); savegamemenu_titlelabel->set_font(ui::root()->font_large()); savegamemenu_titlelabel->set_alignment(ui::AlignCenter); if (savegamemenu_mode == Save) { savegamemenu_titlelabel->set_text("SAVE GAME"); } else { savegamemenu_titlelabel->set_text("LOAD GAME"); } // close button savegamemenu_closebutton = new ui::IconButton(savegamemenu_titlelabel, "bitmaps/icons/window_close"); savegamemenu_closebutton->set_label("close"); // file listview savegamemenu_filelistview = new ui::ListView(this); savegamemenu_filelistview->set_label("files"); savegamemenu_descrlabel = new ui::Label(this); savegamemenu_descrlabel->set_label("description"); //savegamemenu_descrinput = new ui::InputBox(this); // delete button savegamemenu_deletebutton = new ui::IconButton(this, "bitmaps/icons/button_delete"); savegamemenu_deletebutton->set_label("delete"); } SaveGameMenu::~SaveGameMenu() { } void SaveGameMenu::resize() { const float padding = ui::root()->font_large()->height(); const float icon_size = 24.0f; // small icons // resize title label savegamemenu_titlelabel->set_size(width() - padding * 2.0f, savegamemenu_titlelabel->font()->height()); savegamemenu_titlelabel->set_location(padding, padding); // resize close button savegamemenu_closebutton->set_size(savegamemenu_titlelabel->font()->height(), savegamemenu_titlelabel->font()->height()); savegamemenu_closebutton->set_location(savegamemenu_titlelabel->width() - savegamemenu_closebutton->width(), 0); // resize files listview savegamemenu_filelistview->set_size( ui::UI::elementsize.width(), height() - icon_size - padding * 3.0f - savegamemenu_titlelabel->bottom() ); savegamemenu_filelistview->set_location( padding, savegamemenu_titlelabel->bottom() + padding ); // resize description label savegamemenu_descrlabel->set_size( width() - savegamemenu_filelistview->right() - 2.0f * padding, savegamemenu_filelistview->height() ); savegamemenu_descrlabel->set_location(savegamemenu_filelistview->right() + padding, savegamemenu_filelistview->top()); // resize eject button savegamemenu_deletebutton->set_size(icon_size, icon_size); savegamemenu_deletebutton->set_location( savegamemenu_filelistview->right() - icon_size, savegamemenu_filelistview->bottom() + padding ); } void SaveGameMenu::refresh() { ui::ListItem *listitem = 0; std::string savegamepath(filesystem::writedir()); savegamepath.append("savegames"); filesystem::Directory directory(savegamepath); savegamemenu_filelistview->clear(); if (savegamemenu_mode == Save) { listitem = new ui::ListItem(savegamemenu_filelistview, "NEW SAVEGAME"); listitem->set_label("new"); listitem->set_font(ui::root()->font_tiny()); listitem->set_height(listitem->font()->height() * 2.0f); } for (filesystem::Directory::FileNames::const_iterator it = directory.filenames().begin(); it != directory.filenames().end(); ++it) { const std::string filename((*it).c_str()); if (filename.size() < 5) { continue; } std::string ext = filename.substr(filename.size() - 4); aux::lowercase(ext); if (ext.compare(".sav")) { continue; } std::string label = filename.substr(0, filename.size() - 4); listitem = new ui::ListItem(savegamemenu_filelistview, label.c_str()); listitem->set_value(filename); listitem->set_font(ui::root()->font_tiny()); listitem->set_height(listitem->font()->height() * 2.0f); // TODO savegame info, sortkey timestamp } savegamemenu_filelistview->event_resize(); } void SaveGameMenu::show() { Window::show(); event_resize(); refresh(); } void SaveGameMenu::show_file_info() { savegamemenu_descrlabel->clear(); if (savegamemenu_filelistview->selected()) { std::string filename(savegamemenu_filelistview->selected()->value().c_str()); savegamemenu_descrlabel->set_text(filename); } } bool SaveGameMenu::on_keypress(const int key, const unsigned int modifier) { if (key == SDLK_ESCAPE) { if (visible()) { // hide the parent mainwindow parent()->hide(); return true; } } return false; } bool SaveGameMenu::on_emit(ui::Widget *sender, const ui::Widget::Event event, void *data) { if (sender == savegamemenu_closebutton) { if (event == ui::Widget::EventButtonClicked) { // hide the parent mainwindow parent()->hide(); return true; } } else if (sender == savegamemenu_filelistview) { if (event == ui::Widget::EventListViewChanged) { show_file_info(); return true; } } return Window::on_emit(sender, event, data); } } // namespace client