From d0e1dbef4fdad5dd61f2e513c5802e384c5ba642 Mon Sep 17 00:00:00 2001
From: Bjørn Lindeijer <bjorn@lindeijer.nl>
Date: Fri, 17 Dec 2004 13:45:49 +0000
Subject: Added window class based on Guichan by none other than nym!

---
 src/Makefile.am    |   5 +-
 src/gui/login.cpp  |   3 +-
 src/gui/window.cpp | 185 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/gui/window.h   |  67 +++++++++++++++++++
 4 files changed, 257 insertions(+), 3 deletions(-)
 create mode 100644 src/gui/window.cpp
 create mode 100644 src/gui/window.h

(limited to 'src')

diff --git a/src/Makefile.am b/src/Makefile.am
index ad6b2242..14744376 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -2,7 +2,9 @@ bin_PROGRAMS = tmw
 tmw_SOURCES = sound/sound.cpp \
 	graphic/2xsai.cpp \
 	graphic/graphic.cpp \
+	gui/button.cpp \
 	gui/chat.cpp \
+	gui/checkbox.cpp \
 	gui/skill.cpp \
 	gui/shop.cpp \
 	gui/stats.cpp \
@@ -10,11 +12,10 @@ tmw_SOURCES = sound/sound.cpp \
 	gui/setup.cpp \
 	gui/gui.cpp \
 	gui/login.cpp \
-	gui/button.cpp \
-	gui/checkbox.cpp \
 	gui/char_server.cpp \
 	gui/char_select.cpp \
 	gui/inventory.cpp \
+	gui/window.cpp \
 	net/network.cpp \
 	net/protocol.cpp \
 	being.cpp \
diff --git a/src/gui/login.cpp b/src/gui/login.cpp
index f0697513..0a8c19a7 100644
--- a/src/gui/login.cpp
+++ b/src/gui/login.cpp
@@ -25,6 +25,7 @@
 #include "gui.h"
 #include "button.h"
 #include "checkbox.h"
+#include "window.h"
 #include "../graphic/graphic.h"
 
 // Dialog parts
@@ -70,7 +71,7 @@ void LoginActionListener::action(const std::string& eventId)
  */
 void login() {
     // Create dialog
-    dialog = new gcn::Container();
+    dialog = new WindowContainer();
     userLabel = new gcn::Label("Name:");
     passLabel = new gcn::Label("Password:");
     userField = new gcn::TextField("player");
diff --git a/src/gui/window.cpp b/src/gui/window.cpp
new file mode 100644
index 00000000..84fe6133
--- /dev/null
+++ b/src/gui/window.cpp
@@ -0,0 +1,185 @@
+/*
+ *  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
+ */
+
+#include "window.h"
+#include "gui.h"
+#include <guichan/allegro.hpp>
+
+WindowContainer::WindowContainer(std::string text) :
+    caption(text),
+    mousePX(0),
+    mousePY(0),
+    snapSize(8),
+    mouseDown(false),
+    titlebarHeight(48)
+{
+    titlebarColor.r = 32;
+    titlebarColor.g = 32;
+    titlebarColor.b = 128;
+
+    gcn::Widget::setBaseColor(gcn::Color(255, 255, 255));
+
+    /* Crappy window caption
+       captionLabel = new Label(caption.c_str());
+       captionLabel->setPosition(3, 3);
+       add(captionLabel);
+       */
+
+    //load dialog title bar image
+    dLeft = load_bitmap("skin/dialogLeft.bmp", NULL);
+    dMid = load_bitmap("skin/dialogMiddle.bmp", NULL);
+    dRight = load_bitmap("skin/dialogRight.bmp", NULL);
+
+    //register mouse listener
+    addMouseListener(this);
+}
+
+WindowContainer::~WindowContainer()
+{
+    //delete captionLabel;
+
+    //free dialog bitmaps
+    release_bitmap(dLeft);
+    release_bitmap(dMid);
+    release_bitmap(dRight);
+}
+
+void WindowContainer::draw(gcn::Graphics* graphics)
+{
+    //draw container background
+    //Container::draw(graphics);
+    if (mOpaque)
+    {
+        graphics->setColor(getBaseColor());
+        graphics->fillRectangle(gcn::Rectangle(0, 24,
+                    getDimension().width, getDimension().height));
+    }
+
+
+    //skinned dialog render
+    if (typeid(*graphics) == typeid(gcn::AllegroGraphics))
+    {
+        //its allegro !!
+        gcn::AllegroGraphics *gfx = (gcn::AllegroGraphics*)graphics;	//woo
+        BITMAP *screen = gfx->getTarget();			//get screen surface
+
+        //left
+        masked_blit(dLeft, screen, 0, 0, x, y, 24, 24);
+        //center
+        for (int i = 1; i <= (getDimension().width - 24) / 24; i++)
+        {
+            blit(dMid, screen, 0, 0, x + i * 24, y, 24, 24);
+        }
+        //right
+        masked_blit(dRight, screen, 0, 0, x + getDimension().width - 24, y, 24, 24);
+
+        //draw caption
+        int rtm = alfont_text_mode(-1);
+        gui_text(gui_bitmap, caption.c_str(), x + 4, y + 4, gui_skin.button.textcolor[0], FALSE);
+        alfont_text_mode(rtm);
+    } else
+    {
+        //plain title bar
+        graphics->setColor(titlebarColor);
+        graphics->fillRectangle(gcn::Rectangle(0, 0,
+                    getDimension().width, titlebarHeight));
+    }
+
+
+    drawChildren(graphics);
+}
+
+//set dimension
+void WindowContainer::setDimension(const gcn::Rectangle &dimension)
+{
+    gcn::Widget::setDimension(gcn::Rectangle(dimension.x, dimension.y,
+                dimension.width, dimension.height + titlebarHeight));
+}
+
+//adding new widget
+void WindowContainer::add(gcn::Widget *w)
+{
+    w->setPosition(w->getDimension().x, w->getDimension().y + titlebarHeight);
+    gcn::Container::add(w);
+}
+void WindowContainer::add(Widget *w, int x, int y)
+{
+    w->setPosition(x, y + titlebarHeight);
+    gcn::Container::add(w);
+}
+
+void WindowContainer::mousePress(int mx, int my, int button)
+{
+    x = this->getDimension().x;
+    y = this->getDimension().y;
+
+    mouseDown = true;
+
+    mousePX = mx;
+    mousePY = my;
+}
+
+void WindowContainer::mouseRelease(int mx, int my, int button)
+{
+    mouseDown = false;
+}
+
+//window move
+void WindowContainer::mouseMotion(int mx, int my)
+{
+    if (mouseDown)
+    {
+        int winWidth = this->getDimension().width;
+        int winHeight = this->getDimension().height;
+        x = this->getDimension().x;
+        y = this->getDimension().y;
+
+        x = x - (mousePX - mx);
+        y = y - (mousePY - my);
+
+        //keep guichan window inside window
+        if (x < 0)
+            x = 0;
+        if (y < 0)
+            y = 0;
+        if (x + winWidth > 799)
+            x = 799 - winWidth;
+        if (y + winWidth > 599)
+            y = 599 - winHeight;
+
+        //snap window to edges
+        if (x < snapSize)
+            x = 0;
+        if (y < snapSize)
+            y = 0;
+        if (x + winWidth + snapSize > 799)
+            x = 799 - winWidth;
+        if (y + winHeight + snapSize > 599)
+            y = 599 - winHeight;
+
+        this->setPosition(x, y);
+    }
+}
+
+void WindowContainer::mouseOut()
+{
+    mouseDown = false;
+}
diff --git a/src/gui/window.h b/src/gui/window.h
new file mode 100644
index 00000000..99ebfdec
--- /dev/null
+++ b/src/gui/window.h
@@ -0,0 +1,67 @@
+/*
+ *  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
+ */
+
+#ifndef __WINDOW_H__
+#define __WINDOW_H__
+
+#include <iostream>
+#include <allegro.h>
+#include <guichan.hpp>
+
+class WindowContainer : public gcn::Container, public gcn::MouseListener
+{
+    private:
+        std::string caption;	//title bar caption
+        gcn::Label* captionLabel;	//TItle bar caption
+        int x, y;		//x and y positions of the window
+        int z;			//z position of window
+        int mousePX, mousePY;	//Mouse down location relative to 0,0 of window
+        int snapSize;		//Snap to window edge
+        bool mouseDown;		//mouse button state
+        gcn::Color titlebarColor;	//title bar color
+
+        BITMAP *dLeft, *dMid, *dRight;
+
+    public:
+        int titlebarHeight;	//height of title bar
+
+        //constructor
+        WindowContainer(std::string text = "Window");
+        ~WindowContainer();
+
+        //draw window
+        void draw(gcn::Graphics* graphics);
+
+        //add to stop compiler complaining
+        void add(Widget *w);
+        //new add
+        void add(Widget *w, int x, int y);
+
+        void setDimension(const gcn::Rectangle& dimension);
+
+        //Mouse handling
+        void mousePress(int mx, int my, int button);
+        void mouseRelease(int mx, int my, int button);
+        void mouseMotion(int mx, int my);
+        void mouseOut();
+};
+
+#endif
-- 
cgit v1.2.3-70-g09d2