summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjørn Lindeijer <bjorn@lindeijer.nl>2004-12-17 13:45:49 +0000
committerBjørn Lindeijer <bjorn@lindeijer.nl>2004-12-17 13:45:49 +0000
commitd0e1dbef4fdad5dd61f2e513c5802e384c5ba642 (patch)
treec21d0e559d50f7a065987a1e7b14f1579a6a6d5f
parentecd898ab4bf88737d4de51cb71fed585c76fabe6 (diff)
downloadmana-d0e1dbef4fdad5dd61f2e513c5802e384c5ba642.tar.gz
mana-d0e1dbef4fdad5dd61f2e513c5802e384c5ba642.tar.bz2
mana-d0e1dbef4fdad5dd61f2e513c5802e384c5ba642.tar.xz
mana-d0e1dbef4fdad5dd61f2e513c5802e384c5ba642.zip
Added window class based on Guichan by none other than nym!
-rw-r--r--file.list5
-rw-r--r--src/Makefile.am5
-rw-r--r--src/gui/login.cpp3
-rw-r--r--src/gui/window.cpp185
-rw-r--r--src/gui/window.h67
5 files changed, 260 insertions, 5 deletions
diff --git a/file.list b/file.list
index 46aee9ad..25695034 100644
--- a/file.list
+++ b/file.list
@@ -1,7 +1,9 @@
MODULES = src/sound/sound.cpp \
src/graphic/2xsai.cpp \
src/graphic/graphic.cpp \
+ src/gui/button.cpp \
src/gui/chat.cpp \
+ src/gui/checkbox.cpp \
src/gui/skill.cpp \
src/gui/shop.cpp \
src/gui/stats.cpp \
@@ -9,11 +11,10 @@ MODULES = src/sound/sound.cpp \
src/gui/setup.cpp \
src/gui/gui.cpp \
src/gui/login.cpp \
- src/gui/button.cpp \
- src/gui/checkbox.cpp \
src/gui/char_server.cpp \
src/gui/char_select.cpp \
src/gui/inventory.cpp \
+ src/gui/window.cpp \
src/net/network.cpp \
src/net/protocol.cpp \
src/being.cpp src/game.cpp \
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