summaryrefslogtreecommitdiff
path: root/src/gui/textfield.cpp
diff options
context:
space:
mode:
authorBjørn Lindeijer <bjorn@lindeijer.nl>2009-04-07 23:47:57 +0200
committerBjørn Lindeijer <bjorn@lindeijer.nl>2009-04-07 23:52:46 +0200
commitd69d85f06fa6dc22ac4c7789e4140e32d119a7f1 (patch)
tree1d2311bfdba616136d0ac26f8cbe9ab73c88f0e4 /src/gui/textfield.cpp
parent303c1f69761e90b83d4809e911f7785ec66b46aa (diff)
downloadmana-d69d85f06fa6dc22ac4c7789e4140e32d119a7f1.tar.gz
mana-d69d85f06fa6dc22ac4c7789e4140e32d119a7f1.tar.bz2
mana-d69d85f06fa6dc22ac4c7789e4140e32d119a7f1.tar.xz
mana-d69d85f06fa6dc22ac4c7789e4140e32d119a7f1.zip
Moved basic widgets into the gui/widgets directory
In an attempt to make the GUI code a little more structured, basic widgets are now put in gui/widgets. Many includes were also cleaned up.
Diffstat (limited to 'src/gui/textfield.cpp')
-rw-r--r--src/gui/textfield.cpp242
1 files changed, 0 insertions, 242 deletions
diff --git a/src/gui/textfield.cpp b/src/gui/textfield.cpp
deleted file mode 100644
index 48a00dcc..00000000
--- a/src/gui/textfield.cpp
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * The Mana World
- * Copyright (C) 2004 The Mana World Development Team
- *
- * This file is part of The Mana World.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include <guichan/font.hpp>
-
-#include "palette.h"
-#include "sdlinput.h"
-#include "textfield.h"
-
-#include "../configuration.h"
-#include "../graphics.h"
-
-#include "../resources/image.h"
-#include "../resources/resourcemanager.h"
-
-#include "../utils/dtor.h"
-
-#undef DELETE //Win32 compatibility hack
-
-int TextField::instances = 0;
-float TextField::mAlpha = 1.0;
-ImageRect TextField::skin;
-
-TextField::TextField(const std::string &text):
- gcn::TextField(text),
- mNumeric(false),
- mListener(0)
-{
- setFrameSize(2);
-
- if (instances == 0)
- {
- // Load the skin
- ResourceManager *resman = ResourceManager::getInstance();
- Image *textbox = resman->getImage("graphics/gui/deepbox.png");
- int gridx[4] = {0, 3, 28, 31};
- int gridy[4] = {0, 3, 28, 31};
- int a = 0, x, y;
-
- for (y = 0; y < 3; y++)
- {
- for (x = 0; x < 3; x++)
- {
- skin.grid[a] = textbox->getSubImage(
- gridx[x], gridy[y],
- gridx[x + 1] - gridx[x] + 1,
- gridy[y + 1] - gridy[y] + 1);
- skin.grid[a]->setAlpha(config.getValue("guialpha", 0.8));
- a++;
- }
- }
-
- textbox->decRef();
- }
-
- instances++;
-}
-
-TextField::~TextField()
-{
- instances--;
-
- if (instances == 0)
- for_each(skin.grid, skin.grid + 9, dtor<Image*>());
-}
-
-void TextField::draw(gcn::Graphics *graphics)
-{
- if (isFocused())
- {
- drawCaret(graphics,
- getFont()->getWidth(mText.substr(0, mCaretPosition)) -
- mXScroll);
- }
-
- graphics->setColor(guiPalette->getColor(Palette::TEXT));
- graphics->setFont(getFont());
- graphics->drawText(mText, 1 - mXScroll, 1);
-
- if (config.getValue("guialpha", 0.8) != mAlpha)
- {
- mAlpha = config.getValue("guialpha", 0.8);
- for (int a = 0; a < 9; a++)
- skin.grid[a]->setAlpha(mAlpha);
- }
-}
-
-void TextField::drawFrame(gcn::Graphics *graphics)
-{
- int w, h, bs;
- bs = getFrameSize();
- w = getWidth() + bs * 2;
- h = getHeight() + bs * 2;
-
- static_cast<Graphics*>(graphics)->drawImageRect(0, 0, w, h, skin);
-}
-
-void TextField::setNumeric(bool numeric)
-{
- mNumeric = numeric;
- if (!numeric)
- return;
-
- const char *text = mText.c_str();
- for (const char *textPtr = text; *textPtr; ++textPtr)
- {
- if (*textPtr < '0' || *textPtr > '9')
- {
- setText(mText.substr(0, textPtr - text));
- return;
- }
- }
-}
-
-int TextField::getValue() const
-{
- if (!mNumeric)
- return 0;
-
- int value = atoi(mText.c_str());
- if (value < mMinimum)
- return mMinimum;
-
- if (value > mMaximum)
- return mMaximum;
-
- return value;
-}
-
-void TextField::keyPressed(gcn::KeyEvent &keyEvent)
-{
- int val = keyEvent.getKey().getValue();
-
- if (val >= 32)
- {
- int l;
- if (val < 128) l = 1; // 0xxxxxxx
- else if (val < 0x800) l = 2; // 110xxxxx 10xxxxxx
- else if (val < 0x10000) l = 3; // 1110xxxx 10xxxxxx 10xxxxxx
- else l = 4; // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
-
- char buf[4];
- for (int i = 0; i < l; ++i)
- {
- buf[i] = val >> (6 * (l - i - 1));
- if (i > 0) buf[i] = (buf[i] & 63) | 128;
- }
-
- if (l > 1) buf[0] |= 255 << (8 - l);
-
- mText.insert(mCaretPosition, std::string(buf, buf + l));
- mCaretPosition += l;
- }
-
- /* In UTF-8, 10xxxxxx is only used for inner parts of characters. So skip
- them when processing key presses. */
-
- switch (val)
- {
- case Key::LEFT:
- {
- while (mCaretPosition > 0)
- {
- --mCaretPosition;
- if ((mText[mCaretPosition] & 192) != 128)
- break;
- }
- } break;
-
- case Key::RIGHT:
- {
- unsigned sz = mText.size();
- while (mCaretPosition < sz)
- {
- ++mCaretPosition;
- if (mCaretPosition == sz ||
- (mText[mCaretPosition] & 192) != 128)
- break;
- }
- } break;
-
- case Key::DELETE:
- {
- unsigned sz = mText.size();
- while (mCaretPosition < sz)
- {
- --sz;
- mText.erase(mCaretPosition, 1);
- if (mCaretPosition == sz ||
- (mText[mCaretPosition] & 192) != 128)
- break;
- }
- } break;
-
- case Key::BACKSPACE:
- {
- while (mCaretPosition > 0)
- {
- --mCaretPosition;
- int v = mText[mCaretPosition];
- mText.erase(mCaretPosition, 1);
- if ((v & 192) != 128) break;
- }
- } break;
-
- case Key::ENTER:
- distributeActionEvent();
- break;
-
- case Key::HOME:
- mCaretPosition = 0;
- break;
-
- case Key::END:
- mCaretPosition = mText.size();
- break;
-
- case Key::TAB:
- return;
- }
-
- keyEvent.consume();
- fixScroll();
-}