/* ui/ui.cc This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #include #include #include "auxiliary/functions.h" #include "core/core.h" #include "sys/sys.h" #include "ui/button.h" #include "ui/label.h" #include "ui/menu.h" #include "ui/ui.h" #include "ui/widget.h" #include "ui/window.h" namespace ui { UI *global_ui = 0; void func_list_ui(std::string const &args) { if (global_ui) { global_ui->list(); } } void help() { con_print << "^BUser interface functions" << std::endl; con_print << " ui help show this help" << std::endl; con_print << " ui list list widgets" << std::endl; con_print << " ui show show user interface" << std::endl; con_print << " ui hide hide user interface" << std::endl; } void func_ui(std::string const &args) { if (!global_ui) { con_warn << "User Interface not available!" << std::endl; return; } if (!args.size()) { help(); return; } std::stringstream argstr(args); std::string command; argstr >> command; aux::to_label(command); if (command.compare("help") == 0) { help(); } else if (command.compare("list") == 0) { global_ui->list(); } else if (command.compare("show") == 0) { global_ui->show(); } else if (command.compare("hide") == 0) { global_ui->hide(); } else { help(); } } void func_menu(std::string const &args) { if (!global_ui) { con_warn << "User Interface not available!" << std::endl; return; } if (!args.size()) { return; } std::stringstream argstr(args); std::string command; argstr >> command; aux::to_label(command); if (command.compare("hide") == 0) { root()->hide_window(); } else if (command.compare("close") == 0) { root()->hide_window(); } else if (command.compare("list") == 0) { } else { root()->show_window(command.c_str()); } } UI *root() { return global_ui; } void init() { con_print << "^BInitializing user interface..." << std::endl; if (!global_ui) global_ui = new UI(); core::Func *func = core::Func::add("list_ui", func_list_ui); func->set_info("list user interface widgets"); func = core::Func::add("ui", func_ui); func->set_info("[command] [options] user interface subcommands"); func = core::Func::add("menu", func_menu); func->set_info("[hide|close|menuname] show or hide a menu"); } void shutdown() { con_print << "^BShutting down user interface..." << std::endl; core::Func::remove("list_ui"); core::Func::remove("menu"); core::Func::remove("ui"); if (global_ui) { delete global_ui; global_ui = 0; } } void frame() { if (global_ui) global_ui->draw_event(); } UI::UI() : Window(0) { set_palette(new Palette()); set_label("user interface"); set_size(1024, 768); set_border(false); ui_active_window = 0; Menu *menu = 0; menu = new Menu(this, "main"); menu->add_label("Main menu"); menu->add_button("New Game", "connect"); menu->add_button("Connect to...", "menu connect"); menu->add_button("Options...", "menu options"); menu->add_button("Quit", "quit"); menu = new Menu(this, "options"); menu->add_label("Options menu"); menu = new Menu(this, "connect"); menu->add_label("Connect to..."); } UI::~UI() { if (palette()) delete palette(); } void UI::list() { size_t n = Widget::list(0); con_print << n << " user interface widgets" << std::endl; } void UI::add_window(Window *window) { Window::add_window(window); window->hide(); } void UI::remove_window(Window *window) { if (ui_active_window == window) ui_active_window = 0; Window::remove_window(window); } void UI::show_window(char const *label) { Windows::iterator it; for (it = window_children.begin(); it != window_children.end(); it++) { if ((*it)->label().compare(label) == 0) { if (ui_active_window) ui_active_window->hide(); ui_active_window = (*it); ui_active_window->resize_event(); ui_active_window->show(); return; } } con_warn << "Unknown window '" << label << "'" << std::endl; } void UI::hide_window() { if (ui_active_window) { ui_active_window->hide(); ui_active_window = 0; } } }