From 352409f22230698bc32661b916f708663a4179b5 Mon Sep 17 00:00:00 2001
From: Andrei Karas <akaras@inbox.ru>
Date: Tue, 7 Jun 2011 23:12:08 +0300
Subject: Add "did you know?" dialog and some messages for it. Fix browserbox
 images position and size.

---
 src/CMakeLists.txt             |   2 +
 src/Makefile.am                |   2 +
 src/defaults.cpp               |   2 +
 src/game.cpp                   |   9 +++
 src/gui/didyouknowwindow.cpp   | 160 +++++++++++++++++++++++++++++++++++++++++
 src/gui/didyouknowwindow.h     |  81 +++++++++++++++++++++
 src/gui/helpwindow.cpp         |   2 +
 src/gui/widgets/browserbox.cpp |  14 +++-
 src/gui/windowmenu.cpp         |   6 ++
 src/keyboardconfig.cpp         |   2 +
 src/keyboardconfig.h           |   1 +
 11 files changed, 279 insertions(+), 2 deletions(-)
 create mode 100644 src/gui/didyouknowwindow.cpp
 create mode 100644 src/gui/didyouknowwindow.h

(limited to 'src')

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index df0a9ea0f..37baf838f 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -237,6 +237,8 @@ SET(SRCS
     gui/connectiondialog.h
     gui/debugwindow.cpp
     gui/debugwindow.h
+    gui/didyouknowwindow.cpp
+    gui/didyouknowwindow.h
     gui/emotepopup.cpp
     gui/emotepopup.h
     gui/equipmentwindow.cpp
diff --git a/src/Makefile.am b/src/Makefile.am
index 9863a0f69..e158627c8 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -240,6 +240,8 @@ manaplus_SOURCES += gui/widgets/avatarlistbox.cpp \
 	      gui/connectiondialog.h \
 	      gui/debugwindow.cpp \
 	      gui/debugwindow.h \
+	      gui/didyouknowwindow.cpp \
+	      gui/didyouknowwindow.h \
 	      gui/emotepopup.cpp \
 	      gui/emotepopup.h \
 	      gui/equipmentwindow.cpp \
diff --git a/src/defaults.cpp b/src/defaults.cpp
index cb5c0011c..bcb123a92 100644
--- a/src/defaults.cpp
+++ b/src/defaults.cpp
@@ -202,6 +202,8 @@ DefaultsData* getConfigDefaults()
     AddDEF(configData, "enableAttackFilter", true);
     AddDEF(configData, "securetrades", true);
     AddDEF(configData, "unsecureChars", "IO0@#$");
+    AddDEF(configData, "currentTip", 0);
+    AddDEF(configData, "showDidYouKnow", true);
     return configData;
 }
 
diff --git a/src/game.cpp b/src/game.cpp
index 850d335e4..bb477b2e0 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -53,6 +53,7 @@
 #include "gui/chatwindow.h"
 #include "gui/confirmdialog.h"
 #include "gui/debugwindow.h"
+#include "gui/didyouknowwindow.h"
 #include "gui/equipmentwindow.h"
 #include "gui/gui.h"
 #include "gui/helpwindow.h"
@@ -141,6 +142,7 @@ SpecialsWindow *specialsWindow = NULL;
 ShortcutWindow *dropShortcutWindow = NULL;
 ShortcutWindow *spellShortcutWindow = NULL;
 WhoIsOnline *whoIsOnline = NULL;
+DidYouKnowWindow *didYouKnowWindow = NULL;
 KillStats *killStats = NULL;
 BotCheckerWindow *botCheckerWindow = NULL;
 SocialWindow *socialWindow = NULL;
@@ -212,6 +214,12 @@ static void createGuiWindows()
         itemShortcutWindow->addTab(toString(f + 1),
             new ItemShortcutContainer(f));
     }
+    didYouKnowWindow = new DidYouKnowWindow;
+    if (config.getBoolValue("showDidYouKnow"))
+    {
+        didYouKnowWindow->setVisible(true);
+        didYouKnowWindow->loadData();
+    }
 
     emoteShortcutWindow = new ShortcutWindow("EmoteShortcut",
                                              new EmoteShortcutContainer);
@@ -314,6 +322,7 @@ static void destroyGuiWindows()
     del_0(botCheckerWindow);
     del_0(whoIsOnline);
     del_0(killStats);
+    del_0(didYouKnowWindow);
 
     Mana::Event::trigger(CHANNEL_GAME, Mana::Event(EVENT_GUIWINDOWSUNLOADED));
 }
diff --git a/src/gui/didyouknowwindow.cpp b/src/gui/didyouknowwindow.cpp
new file mode 100644
index 000000000..24731d58a
--- /dev/null
+++ b/src/gui/didyouknowwindow.cpp
@@ -0,0 +1,160 @@
+/*
+ *  The ManaPlus Client
+ *  Copyright (C) 2004-2009  The Mana World Development Team
+ *  Copyright (C) 2009-2010  The Mana Developers
+ *  Copyright (C) 2011  The ManaPlus Developers
+ *
+ *  This file is part of The ManaPlus Client.
+ *
+ *  This program 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.
+ *
+ *  This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "gui/didyouknowwindow.h"
+
+#include "log.h"
+
+#include "gui/gui.h"
+#include "gui/setup.h"
+
+#include "gui/widgets/button.h"
+#include "gui/widgets/browserbox.h"
+#include "gui/widgets/checkbox.h"
+#include "gui/widgets/layout.h"
+#include "gui/widgets/scrollarea.h"
+
+#include "resources/resourcemanager.h"
+#include "configuration.h"
+
+#include "utils/gettext.h"
+
+#include "debug.h"
+
+static const int minTip = 1;
+static const int maxTip = 6;
+
+DidYouKnowWindow::DidYouKnowWindow():
+    Window(_("Did You Know?"))
+{
+    setMinWidth(300);
+    setMinHeight(250);
+    setContentSize(455, 350);
+    setWindowName("DidYouKnow");
+    setResizable(true);
+    setupWindow->registerWindowForReset(this);
+
+    setDefaultSize(500, 400, ImageRect::CENTER);
+
+    mBrowserBox = new BrowserBox;
+    mBrowserBox->setOpaque(false);
+    mScrollArea = new ScrollArea(mBrowserBox);
+    Button *okButton = new Button(_("Close"), "close", this);
+    mButtonPrev = new Button(_("< Previous"), "prev", this);
+    mButtonNext = new Button(_("Next >"), "next", this);
+    mOpenAgainCheckBox = new CheckBox(_("Auto open this window"),
+        config.getBoolValue("showDidYouKnow"), this, "openagain");
+
+    mScrollArea->setDimension(gcn::Rectangle(5, 5, 445,
+                              335 - okButton->getHeight()));
+    okButton->setPosition(450 - okButton->getWidth(),
+                          345 - okButton->getHeight());
+
+    mBrowserBox->setLinkHandler(this);
+    mBrowserBox->setFont(gui->getHelpFont());
+    mBrowserBox->setProcessVersion(true);
+    mBrowserBox->setEnableImages(true);
+
+    place(0, 0, mScrollArea, 5, 3).setPadding(3);
+    place(0, 3, mOpenAgainCheckBox);
+    place(1, 4, mButtonPrev, 1);
+    place(2, 4, mButtonNext, 1);
+    place(4, 4, okButton);
+
+    Layout &layout = getLayout();
+    layout.setRowHeight(0, Layout::AUTO_SET);
+
+    loadWindowState();
+}
+
+void DidYouKnowWindow::action(const gcn::ActionEvent &event)
+{
+    if (event.getId() == "close")
+        setVisible(false);
+
+    unsigned num = config.getIntValue("currentTip");
+
+    if (event.getId() == "prev")
+        loadData(num - 1);
+    else if (event.getId() == "next")
+        loadData(num + 1);
+    else if (event.getId() == "openagain")
+        config.setValue("showDidYouKnow", mOpenAgainCheckBox->isSelected());
+}
+
+void DidYouKnowWindow::handleLink(const std::string &link _UNUSED_,
+                                  gcn::MouseEvent *event _UNUSED_)
+{
+}
+
+void DidYouKnowWindow::loadData(int num)
+{
+    mBrowserBox->clearRows();
+    if (!num)
+        num = config.getIntValue("currentTip") + 1;
+
+    if (num < minTip || num > maxTip)
+        num = minTip;
+
+    config.setValue("currentTip", num);
+
+    loadFile(num);
+
+    mScrollArea->setVerticalScrollAmount(0);
+}
+
+void DidYouKnowWindow::loadFile(int num)
+{
+    const std::string file = strprintf("tips/%d", num);
+    const std::vector<std::string> langs = getLang();
+    ResourceManager *resman = ResourceManager::getInstance();
+    std::string helpPath = branding.getStringValue("helpPath");
+    if (helpPath.empty())
+        helpPath = paths.getStringValue("help");
+
+    std::vector<std::string> lines;
+    if (!langs.empty())
+    {
+        std::string name = helpPath + langs[0] + "/" + file + ".txt";
+        if (resman->exists(name))
+            lines = resman->loadTextFile(name);
+        if (lines.empty() && langs.size() > 1)
+        {
+            name = helpPath + langs[1] + "/" + file + ".txt";
+            lines = resman->loadTextFile(name);
+        }
+    }
+
+    if (lines.empty())
+        lines = resman->loadTextFile(helpPath + file + ".txt");
+
+    for (unsigned int i = 0; i < lines.size(); ++i)
+        mBrowserBox->addRow(lines[i]);
+}
+
+void DidYouKnowWindow::setVisible(bool visible)
+{
+    Window::setVisible(visible);
+
+    if (visible || isVisible())
+        loadData();
+}
diff --git a/src/gui/didyouknowwindow.h b/src/gui/didyouknowwindow.h
new file mode 100644
index 000000000..28a992d73
--- /dev/null
+++ b/src/gui/didyouknowwindow.h
@@ -0,0 +1,81 @@
+/*
+ *  The ManaPlus Client
+ *  Copyright (C) 2004-2009  The Mana World Development Team
+ *  Copyright (C) 2009-2010  The Mana Developers
+ *  Copyright (C) 2011  The ManaPlus Developers
+ *
+ *  This file is part of The ManaPlus Client.
+ *
+ *  This program 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.
+ *
+ *  This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef DIDYOUKNOWWINDOW_H
+#define DIDYOUKNOWWINDOW_H
+
+#include "gui/widgets/linkhandler.h"
+#include "gui/widgets/window.h"
+
+#include <guichan/actionlistener.hpp>
+
+#ifdef __GNUC__
+#define _UNUSED_  __attribute__ ((unused))
+#else
+#define _UNUSED_
+#endif
+
+class Button;
+class BrowserBox;
+class CheckBox;
+class LinkHandler;
+
+/**
+ * The help dialog.
+ */
+class DidYouKnowWindow : public Window, public LinkHandler,
+                   public gcn::ActionListener
+{
+    public:
+        /**
+         * Constructor.
+         */
+        DidYouKnowWindow();
+
+        /**
+         * Called when receiving actions from the widgets.
+         */
+        void action(const gcn::ActionEvent &event);
+
+        /**
+         * Handles link action.
+         */
+        void handleLink(const std::string &link,
+                        gcn::MouseEvent *event _UNUSED_);
+
+        void loadData(int num = 0);
+
+        void setVisible(bool visible);
+
+    private:
+        void loadFile(int num);
+
+        BrowserBox *mBrowserBox;
+        gcn::ScrollArea *mScrollArea;
+        Button *mButtonPrev;
+        Button *mButtonNext;
+        CheckBox *mOpenAgainCheckBox;
+};
+
+extern DidYouKnowWindow *didYouKnowWindow;
+
+#endif
diff --git a/src/gui/helpwindow.cpp b/src/gui/helpwindow.cpp
index e0e42c0bb..4c4770a43 100644
--- a/src/gui/helpwindow.cpp
+++ b/src/gui/helpwindow.cpp
@@ -123,6 +123,8 @@ void HelpWindow::loadFile(const std::string &file)
     if (lines.empty())
         lines = resman->loadTextFile(helpPath + file + ".txt");
 
+    logger->log("help file: " + helpPath + file + ".txt");
+
     for (unsigned int i = 0; i < lines.size(); ++i)
         mBrowserBox->addRow(lines[i]);
 }
diff --git a/src/gui/widgets/browserbox.cpp b/src/gui/widgets/browserbox.cpp
index f3ee7270b..140a72770 100644
--- a/src/gui/widgets/browserbox.cpp
+++ b/src/gui/widgets/browserbox.cpp
@@ -368,6 +368,8 @@ int BrowserBox::calcHeight()
 {
     unsigned x = 0, y = 0;
     int wrappedLines = 0;
+    int moreHeight = 0;
+    int maxWidth = getWidth();
     int link = 0;
     if (getWidth() < 0)
         return 1;
@@ -412,8 +414,12 @@ int BrowserBox::calcHeight()
             Image *img = resman->getImage(str);
             if (img)
             {
+                img->incRef();
                 mLineParts.push_back(LinePart(x, y, selColor, img));
-                y += img->getHeight();
+                y += img->getHeight() + 2;
+                moreHeight += img->getHeight();
+                if (img->getWidth() > maxWidth)
+                    maxWidth = img->getWidth() + 2;
             }
             continue;
         }
@@ -570,7 +576,11 @@ int BrowserBox::calcHeight()
         }
         y += fontHeight;
     }
-    return (static_cast<int>(mTextRows.size()) + wrappedLines) * fontHeight;
+    if (getWidth() != maxWidth)
+        setWidth(maxWidth);
+
+    return (static_cast<int>(mTextRows.size()) + wrappedLines)
+        * fontHeight + moreHeight;
 }
 
 void BrowserBox::updateHeight()
diff --git a/src/gui/windowmenu.cpp b/src/gui/windowmenu.cpp
index 719b67829..b73e5fad0 100644
--- a/src/gui/windowmenu.cpp
+++ b/src/gui/windowmenu.cpp
@@ -26,6 +26,7 @@
 #include "graphics.h"
 #include "keyboardconfig.h"
 
+#include "gui/didyouknowwindow.h"
 #include "gui/emotepopup.h"
 #include "gui/skilldialog.h"
 #include "gui/specialswindow.h"
@@ -94,6 +95,7 @@ WindowMenu::WindowMenu():
               KeyboardConfig::KEY_WINDOW_SHORTCUT);
     addButton(N_("SP"), _("Spells"), x, h, KeyboardConfig::KEY_WINDOW_SPELLS);
     addButton(N_("DR"), _("Drop"), x, h, KeyboardConfig::KEY_WINDOW_DROP);
+    addButton(N_("YK"), _("Did you know"), x, h, KeyboardConfig::KEY_WINDOW_DIDYOUKNOW);
     addButton(N_("SET"), _("Setup"), x, h, KeyboardConfig::KEY_WINDOW_SETUP);
 
     if (graphics)
@@ -212,6 +214,10 @@ void WindowMenu::action(const gcn::ActionEvent &event)
     {
         window = spellShortcutWindow;
     }
+    else if (event.getId() == "YK")
+    {
+        window = didYouKnowWindow;
+    }
 
     if (window)
     {
diff --git a/src/keyboardconfig.cpp b/src/keyboardconfig.cpp
index 6ca3f65c5..ff504ca2d 100644
--- a/src/keyboardconfig.cpp
+++ b/src/keyboardconfig.cpp
@@ -158,6 +158,8 @@ static KeyData const keyData[KeyboardConfig::KEY_TOTAL] = {
     {"keyWindowOnline", KeyboardConfig::KEY_NO_VALUE,
         _("Who Is Online Window"), KeyboardConfig::GRP_DEFAULT
         | KeyboardConfig::GRP_GUI},
+    {"keyWindowDidYouKnow", -1, N_("Did you know Window"),
+        KeyboardConfig::GRP_DEFAULT | KeyboardConfig::GRP_GUI},
     {"keySocialPrevTab", KeyboardConfig::KEY_NO_VALUE,
         _("Previous Social Tab"), KeyboardConfig::GRP_DEFAULT
         | KeyboardConfig::GRP_GUI},
diff --git a/src/keyboardconfig.h b/src/keyboardconfig.h
index d6a7f47b2..1d264b039 100644
--- a/src/keyboardconfig.h
+++ b/src/keyboardconfig.h
@@ -221,6 +221,7 @@ class KeyboardConfig
             KEY_WINDOW_SPELLS,
             KEY_WINDOW_BOT_CHECKER,
             KEY_WINDOW_ONLINE,
+            KEY_WINDOW_DIDYOUKNOW,
             KEY_PREV_SOCIAL_TAB,
             KEY_NEXT_SOCIAL_TAB,
             KEY_EMOTE_1,
-- 
cgit v1.2.3-70-g09d2