From da9beb729c58ca2d91f67ab85a6728b628c27cf2 Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Sun, 5 Oct 2008 19:03:25 +0000 Subject: user interface library --- src/ui/ui.cc | 214 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 214 insertions(+) create mode 100644 src/ui/ui.cc (limited to 'src/ui/ui.cc') diff --git a/src/ui/ui.cc b/src/ui/ui.cc new file mode 100644 index 0000000..be75f11 --- /dev/null +++ b/src/ui/ui.cc @@ -0,0 +1,214 @@ +/* + 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; + } +} + +} -- cgit v1.2.3