From 336766125f25b94dd9fc19aeea35c8b43acbeea0 Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Fri, 29 Jul 2011 21:10:05 +0000 Subject: Renamed various user interface classes, somewhat improved inventory window. --- src/client/gamewindow.cc | 450 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 450 insertions(+) create mode 100644 src/client/gamewindow.cc (limited to 'src/client/gamewindow.cc') diff --git a/src/client/gamewindow.cc b/src/client/gamewindow.cc new file mode 100644 index 0000000..d539f53 --- /dev/null +++ b/src/client/gamewindow.cc @@ -0,0 +1,450 @@ +/* + client/gamewindow.cc + This file is part of the Osirion project and is distributed under + the terms and conditions of the GNU General Public License version 2 +*/ + +#include +#include + +#include "core/info.h" +#include "core/application.h" +#include "ui/ui.h" +#include "client/targeticonbutton.h" +#include "client/gamewindow.h" + +namespace client +{ + +GameWindow::GameWindow(ui::Widget *parent) : ui::Window(parent) +{ + set_label("gamewindow"); + set_border(false); + set_background(false); + + gamewindow_hud = new HUD(this); + + label_viewname = new ui::Label(this); + label_viewname->set_label("viewnamelabel"); + label_viewname->set_alignment(ui::AlignCenter); + label_viewname->set_background(true); + label_viewname->set_font(ui::root()->font_large()); + + // sub menus + gamewindow_map = new Map(this); + gamewindow_entitymenu = new EntityMenu(this); + gamewindow_buymenu = new BuyMenu(this); + gamewindow_trademenu = new TradeMenu(this); + gamewindow_inventory = new InventoryWindow(this); + gamewindow_chat = new Chat(this); + + // icon buttons + gamewindow_menubutton = new ui::IconButton(this, "bitmaps/icons/button_menu", "ui_menu"); + + gamewindow_launchbutton = new ui::IconButton(this, "bitmaps/icons/button_launch", "launch"); + gamewindow_dockbutton = new TargetIconButton(this, "bitmaps/icons/button_dock", "dock", core::Entity::Dockable); + + gamewindow_homebutton = new ui::IconButton(this, "bitmaps/icons/button_home", "view main"); + gamewindow_chatbutton = new ui::IconButton(this, "bitmaps/icons/button_chat", "ui_chat"); + gamewindow_mapbutton = new ui::IconButton(this, "bitmaps/icons/button_map", "ui_map"); + gamewindow_inventorybutton = new ui::IconButton(this, "bitmaps/icons/button_ship", "ui_inventory"); +} + +GameWindow::~GameWindow() +{ +} + +void GameWindow::clear() +{ + gamewindow_chat->clear(); + + gamewindow_chat->hide(); + gamewindow_map->hide(); + gamewindow_inventory->hide(); + gamewindow_entitymenu->hide(); + gamewindow_buymenu->hide(); + gamewindow_trademenu->hide(); +} + +void GameWindow::event_text(const std::string & text) +{ + gamewindow_chat->event_text(text); +} + +void GameWindow::toggle_map() +{ + + if (!map()->visible()) { + if (chat()->visible() && !chat()->small_view()) { + chat()->hide(); + } + + if (inventory()->visible()) { + inventory()->hide(); + } + + if (gamewindow_entitymenu->visible()) { + gamewindow_entitymenu->hide(); + } + + if (gamewindow_buymenu->visible()) { + gamewindow_buymenu->hide(); + } + + if (gamewindow_trademenu->visible()) { + gamewindow_trademenu->hide(); + } + } + + map()->toggle(); + +/* if (map()->visible() && chat()->visible() && chat()->small_view()) { + chat()->raise(); + } +*/ +} + +void GameWindow::toggle_inventory() +{ + + if (!inventory()->visible()) { + if (chat()->visible() && !chat()->small_view()) { + chat()->hide(); + } + + if (map()->visible()) { + map()->hide(); + } + + if (gamewindow_entitymenu->visible()) { + gamewindow_entitymenu->hide(); + } + + if (gamewindow_buymenu->visible()) { + gamewindow_buymenu->hide(); + } + + if (gamewindow_trademenu->visible()) { + gamewindow_trademenu->hide(); + } + } + + inventory()->toggle(); + +/* if (inventory()->visible() && chat()->visible() && chat()->small_view()) { + chat()->raise(); + } +*/ +} + +void GameWindow::toggle_chat() +{ + if (chat()->small_view()) { + chat()->hide(); + } + + if (!chat()->visible()) { + if (map()->visible()) + map()->hide(); + + if (inventory()->visible()) { + inventory()->hide(); + } + + if (gamewindow_entitymenu->visible()) { + gamewindow_entitymenu->hide(); + } + + if (gamewindow_buymenu->visible()) { + gamewindow_buymenu->hide(); + } + + if (gamewindow_trademenu->visible()) { + gamewindow_trademenu->hide(); + } + } + + chat()->set_small_view(false); + chat()->toggle(); +} + +void GameWindow::toggle_chatbar() +{ + if (!chat()->small_view()) { + chat()->hide(); + } + + chat()->set_small_view(true); + chat()->toggle(); +} + +void GameWindow::show_menu(const std::string & args) +{ + if (!args.size()) + return; + + if (!core::localplayer()->view()) + return; + + if (!core::localplayer()->view()->menus().size()) + return; + + std::stringstream argstr(args); + std::string label; + if (!(argstr >> label)) + return; + + if (label.compare("buy") == 0) { + // buy menu, single item + unsigned long id; + + if (argstr >> id) { + // hide other menus + gamewindow_entitymenu->hide(); + gamewindow_trademenu->hide(); + // hide other windows + gamewindow_chat->hide(); + gamewindow_map->hide(); + gamewindow_inventory->hide(); + // requesting the info through game makes sure it is retreived from the server + gamewindow_buymenu->set_item( core::game()->request_info(id)); + // show buy menu + gamewindow_buymenu->show(); + } else { + con_print << "usage: view buy [info id] show the buy menu for this kind of item" << std::endl; + } + + } else if (label.compare("trade") == 0) { + // invetory based trade + std::string typestr; + + if(argstr >> typestr) { + aux::to_label(typestr); + + // hide other menus + gamewindow_buymenu->hide(); + gamewindow_entitymenu->hide(); + // hide other windows + gamewindow_chat->hide(); + gamewindow_map->hide(); + gamewindow_inventory->hide(); + // show trade menu + gamewindow_trademenu->set_itemtype(core::InfoType::find(typestr)); + gamewindow_trademenu->show(); + } else { + con_print << "usage: view trade [string] show the trade menu for this type of items" << std::endl; + } + + + } else if (label.compare("hide") == 0) { + // hide all menus + gamewindow_buymenu->hide(); + gamewindow_entitymenu->hide(); + gamewindow_trademenu->hide(); + } else { + // hide other menus + gamewindow_buymenu->hide(); + gamewindow_trademenu->hide(); + // hide other windows + gamewindow_chat->hide(); + gamewindow_map->hide(); + gamewindow_inventory->hide(); + // show other menus + gamewindow_entitymenu->generate(core::localplayer()->view(), label.c_str()); + gamewindow_entitymenu->show(); + } + +/* if (chat()->visible() && chat()->small_view()) + chat()->raise(); +*/ +} + +void GameWindow::resize() +{ + const float smallmargin = ui::UI::elementsize.height(); + + set_size(parent()->size()); + + // icons + const float icon_margin = 4.0f; + const float icon_size = 48.0f; + const float icon_count = 7; + const float l = (width() - ((icon_count + 1) * icon_margin) - (icon_count * icon_size)) * 0.5f; + + gamewindow_menubutton->set_geometry(l, icon_margin, icon_size, icon_size); + // spacer + gamewindow_dockbutton->set_geometry(l + 2.0f *(icon_margin + icon_size), icon_margin, icon_size, icon_size); + gamewindow_launchbutton->set_geometry(l + 2.0f *(icon_margin + icon_size), icon_margin, icon_size, icon_size); + gamewindow_homebutton->set_geometry(l + 3.0f *(icon_margin + icon_size), icon_margin, icon_size, icon_size); + gamewindow_inventorybutton->set_geometry(l + 4.0f *(icon_margin + icon_size), icon_margin, icon_size, icon_size); + gamewindow_chatbutton->set_geometry(l + 5.0f *(icon_margin + icon_size), icon_margin, icon_size, icon_size); + gamewindow_mapbutton->set_geometry(l + 6.0f *(icon_margin + icon_size), icon_margin, icon_size, icon_size); + + // reposition buy menu + gamewindow_buymenu->event_resize(); + // reposition trade menu + gamewindow_trademenu->event_resize(); + + // set hud geometry + gamewindow_hud->set_geometry(0, 0, width(), height()); + gamewindow_hud->event_resize(); + + // reposition map + gamewindow_map->set_size(width() - smallmargin * 2, height() - smallmargin * 4); + gamewindow_map->set_location(smallmargin, smallmargin * 2); + + // reposition inventory + gamewindow_inventory->set_size(width() - smallmargin * 2, height() - smallmargin * 4); + gamewindow_inventory->set_location(smallmargin, smallmargin * 2); + + // reposition labels + label_viewname->set_size(ui::UI::elementsize.width() * 1.5f, ui::UI::elementsize.height()); + label_viewname->set_location(width() - label_viewname->width() - smallmargin, height() - label_viewname->height() - smallmargin * 0.5f); +} + +void GameWindow::draw() +{ + const float smallmargin = ui::UI::elementsize.height(); + + if (core::localcontrol()->state() == core::Entity::Docked) { + gamewindow_launchbutton->show(); + gamewindow_dockbutton->hide(); + } else { + gamewindow_launchbutton->hide(); + gamewindow_dockbutton->show(); + } + + if (core::localplayer()->view()) { + + // hide hide when a view is set + gamewindow_hud->hide(); + + // docking view + if (core::localplayer()->view()->menus().size()) { + + // entity with menus + + if (map()->visible()) { + label_viewname->set_text(core::localplayer()->zone()->name()); + } else { + label_viewname->set_text(core::localplayer()->view()->name()); + } + + label_viewname->show(); + + if (gamewindow_entitymenu->generated_entity() != core::localplayer()->view()) { + // initially show the menu + show_menu("main"); + map()->hide(); + chat()->hide(); + + // hide other windows + gamewindow_chat->hide(); + gamewindow_map->hide(); + gamewindow_inventory->hide(); + + } else if (!gamewindow_entitymenu->visible() && !gamewindow_buymenu->visible() && !gamewindow_trademenu->visible() && + !inventory()->visible() && !map()->visible() && (!chat()->visible() || chat()->small_view())) { + + // show the menu if there's no other window open + gamewindow_entitymenu->show(); + } + + //gamewindow_notify->set_size(width() - smallmargin * 3.0f - ui::UI::elementsize.width() * 1.5f, height() - smallmargin * 4.0f); + //gamewindow_notify->set_location(smallmargin * 2.0f + ui::UI::elementsize.width() * 1.5f, smallmargin * 2.0f); + + gamewindow_homebutton->enable(); + + } else { + // entity without menus, plain view + this->hide(); + return; + } + + } else { + gamewindow_homebutton->disable(); + + //gamewindow_notify->set_geometry(gamewindow_map->location(), gamewindow_map->size()); + + if (gamewindow_entitymenu->visible()) { + gamewindow_entitymenu->hide(); + } + + if (gamewindow_entitymenu->generated_entity()) { + gamewindow_entitymenu->generate(0, 0); + } + + if (gamewindow_buymenu->visible()) { + gamewindow_buymenu->hide(); + } + + if (gamewindow_trademenu->visible()) { + gamewindow_trademenu->hide(); + } + + if (map()->visible()) { + label_viewname->set_text(core::localplayer()->zone()->name()); + label_viewname->show(); + } else { + label_viewname->hide(); + } + + if (!map()->visible() && !chat()->visible() && !inventory()->visible()) { + gamewindow_hud->set_focus(); + } + + gamewindow_hud->show(); + } + + // reposition chat widget + if (chat()->visible()) { + if (gamewindow_chat->small_view()) { + gamewindow_chat->set_size(width() - smallmargin * 2, font()->height() * 2); + gamewindow_chat->set_location(smallmargin, height() - smallmargin *2 - gamewindow_chat->height()); + } else { + gamewindow_chat->set_geometry(gamewindow_map->location(), gamewindow_map->size()); + } + gamewindow_chat->event_resize(); + } +} + +bool GameWindow::on_keypress(const int key, const unsigned int modifier) +{ + switch (key) { + + case SDLK_ESCAPE: + if (gamewindow_entitymenu->visible()) { + gamewindow_entitymenu->hide(); + return true; + } + + if (gamewindow_buymenu->visible()) { + gamewindow_buymenu->hide(); + return true; + } + + if (gamewindow_trademenu->visible()) { + gamewindow_trademenu->hide(); + return true; + } + + if (map()->visible()) { + map()->hide(); + return true; + } + + if (inventory()->visible()) { + inventory()->hide(); + return true; + } + + break; + + default: + break; + } + + return Window::on_keypress(key, modifier); +} + +} -- cgit v1.2.3