Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/gamewindow.cc')
-rw-r--r--src/client/gamewindow.cc450
1 files changed, 450 insertions, 0 deletions
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 <string>
+#include <sstream>
+
+#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);
+}
+
+}