diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/game.cpp | 9 | ||||
-rw-r--r-- | src/gui/help.cpp | 131 | ||||
-rw-r--r-- | src/gui/help.h | 76 |
4 files changed, 217 insertions, 1 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index aa345414..5b80a7d2 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -27,6 +27,8 @@ tmw_SOURCES = graphic/spriteset.cpp \ gui/equipment.h \ gui/gui.cpp \ gui/gui.h \ + gui/help.cpp \ + gui/help.h \ gui/inventory.cpp \ gui/inventory.h \ gui/itemcontainer.cpp \ diff --git a/src/game.cpp b/src/game.cpp index 96a2ea85..3b4a4420 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -37,8 +37,10 @@ #include "gui/ok_dialog.h" #include "gui/confirm_dialog.h" #include "gui/requesttrade.h" +#include "gui/help.h" #include "net/protocol.h" #include "resources/mapreader.h" + #include <SDL.h> #include <sstream> @@ -226,7 +228,12 @@ void do_input() if (event.type == SDL_KEYDOWN) { SDL_keysym keysym = event.key.keysym; - + + if (keysym.sym == SDLK_F1) + { + new HelpWindow(); + } + if (keysym.sym == SDLK_RETURN) { if (!chatWindow->isFocused()) diff --git a/src/gui/help.cpp b/src/gui/help.cpp new file mode 100644 index 00000000..5b652f99 --- /dev/null +++ b/src/gui/help.cpp @@ -0,0 +1,131 @@ +/* + * The Mana World + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#include "help.h" +#include "../main.h" +#include <fstream> + +HelpWindow::HelpWindow(): + Window("Help") +{ + setContentSize(455, 350); + setResizeable(true); + + textBox = new TextBox(); + textBox->setEditable(false); + scrollArea = new ScrollArea(textBox); + okButton = new Button("Close"); + + scrollArea->setDimension(gcn::Rectangle( + 5, 5, 445, 335 - okButton->getHeight())); + okButton->setPosition( + 450 - okButton->getWidth(), + 345 - okButton->getHeight()); + + okButton->setEventId("close"); + okButton->addActionListener(this); + + add(scrollArea); + add(okButton); + + //setLocationRelativeTo(getParent()); + textBox->requestFocus(); + + std::string defHelp = "index"; + loadHelp(defHelp); +} + +HelpWindow::~HelpWindow() +{ + delete okButton; + delete textBox; + delete scrollArea; + links.clear(); + +} + +void HelpWindow::action(const std::string& eventId) +{ + scheduleDelete(); +} + +void HelpWindow::mousePress(int mx, int my, int button) +{ + int x1 = scrollArea->getX() + 10; + int y1 = scrollArea->getY() + 15; + int x2 = x1 + scrollArea->getWidth() - 25; + int y2 = y1 + scrollArea->getHeight(); + if (button == gcn::MouseInput::LEFT) { + if ((mx >= x1) && (my >= y1) && (mx <= x2) && (my <= y2)) + { + for (unsigned int i = 0; i < links.size(); i++) + { + int y1 = links[i].yPos * textBox->getFont()->getHeight() + 5 - + scrollArea->getVerticalScrollAmount(); + int y2 = y1 + textBox->getFont()->getHeight(); + if ((my > y1) && (my < y2)) { + std::string tmp = links[i].file; + loadHelp(tmp); + } + } + } + } +} + +void HelpWindow::loadHelp(std::string& helpFile) { + helpFile = TMW_DATADIR "data/help/" + helpFile + ".txt"; + + std::ifstream fin; + fin.open(helpFile.c_str()); + if (fin.fail()) + { + logger->log("Couldn't load help file: %s", helpFile.c_str()); + return; + } + + links.clear(); + textBox->setText(""); + + while (!fin.eof()) + { + std::string line = ""; + getline(fin, line); + + // Check for links + if (line.substr(0, 1) == "@") + { + int idx = line.find("->"); + HELP_LINK hlink; + hlink.yPos = textBox->getNumberOfRows() + 1; + hlink.file = line.substr(1, idx - 1); + links.push_back(hlink); + + line = " " + line.erase(0, idx); + } + + textBox->addRow(line); + } + scrollArea->setVerticalScrollAmount(0); + + fin.close(); +} diff --git a/src/gui/help.h b/src/gui/help.h new file mode 100644 index 00000000..17821765 --- /dev/null +++ b/src/gui/help.h @@ -0,0 +1,76 @@ +/* + * The Mana World + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifndef _TMW_HELP_H +#define _TMW_HELP_H + +#include <guichan.hpp> +#include "window.h" +#include "scrollarea.h" +#include "button.h" +#include "textbox.h" + +struct HELP_LINK { + int yPos; + std::string file; +}; + +/** + * The help dialog. + */ +class HelpWindow : public Window, public gcn::ActionListener +{ + public: + /** + * Constructor. + */ + HelpWindow(); + + /** + * Destructor. + */ + ~HelpWindow(); + + /** + * Called when receiving actions from the widgets. + */ + void action(const std::string& eventId); + + /** + * Handles mouse click. + */ + void mousePress(int mx, int my, int button); + + /** + * Load help in the dialog. + */ + void loadHelp(std::string& helpFile); + + private: + std::vector<HELP_LINK> links; + gcn::Button *okButton; + gcn::TextBox *textBox; + gcn::ScrollArea *scrollArea; +}; + +#endif |