summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2012-10-21 19:33:46 +0300
committerAndrei Karas <akaras@inbox.ru>2012-10-21 19:33:46 +0300
commitdfb302bb66f032eb0c7eb4bc0934fdf0571a1d3a (patch)
tree4d312704c7d42bc0d3a0f2ab44e8071a7058d6bb
parentc29b91939d1c8e8f7772a660ad4d4bee83dec668 (diff)
downloadmv-dfb302bb66f032eb0c7eb4bc0934fdf0571a1d3a.tar.gz
mv-dfb302bb66f032eb0c7eb4bc0934fdf0571a1d3a.tar.bz2
mv-dfb302bb66f032eb0c7eb4bc0934fdf0571a1d3a.tar.xz
mv-dfb302bb66f032eb0c7eb4bc0934fdf0571a1d3a.zip
Extend textfield theming.
New theme options: padding frameSize
-rw-r--r--data/graphics/gui/textfield.xml3
-rw-r--r--src/gui/widgets/textfield.cpp86
-rw-r--r--src/gui/widgets/textfield.h12
-rw-r--r--src/guichan/widgets/textfield.cpp29
4 files changed, 89 insertions, 41 deletions
diff --git a/data/graphics/gui/textfield.xml b/data/graphics/gui/textfield.xml
index 4a63cf25c..3141cea2b 100644
--- a/data/graphics/gui/textfield.xml
+++ b/data/graphics/gui/textfield.xml
@@ -1,5 +1,8 @@
<skinset name="Default" image="window.png">
<widget type="Window" xpos="41" ypos="186">
+ <option name="padding" value="1" />
+ <option name="frameSize" value="2" />
+
<!-- Top Row -->
<part type="top-left-corner" xpos="0" ypos="0" width="4" height="4" />
<part type="top-edge" xpos="3" ypos="0" width="26" height="4" />
diff --git a/src/gui/widgets/textfield.cpp b/src/gui/widgets/textfield.cpp
index afe6555a4..4e5e7e027 100644
--- a/src/gui/widgets/textfield.cpp
+++ b/src/gui/widgets/textfield.cpp
@@ -42,6 +42,7 @@
int TextField::instances = 0;
float TextField::mAlpha = 1.0;
ImageRect TextField::skin;
+Skin *TextField::mSkin;
TextField::TextField(const Widget2 *const widget,
const std::string &text, const bool loseFocusOnTab,
@@ -55,6 +56,7 @@ TextField::TextField(const Widget2 *const widget,
mMaximum(0),
mLoseFocusOnTab(loseFocusOnTab),
mLastEventPaste(false),
+ mPadding(1),
mCaretColor(&getThemeColor(Theme::CARET))
{
setFrameSize(2);
@@ -64,13 +66,20 @@ TextField::TextField(const Widget2 *const widget,
{
if (Theme::instance())
{
- Theme::instance()->loadRect(skin, "textfield.xml",
+ mSkin = Theme::instance()->loadSkinRect(skin, "textfield.xml",
"textfield_background.xml");
}
}
instances++;
+ if (mSkin)
+ {
+ mPadding = mSkin->getPadding();
+ mFrameSize = mSkin->getOption("frameSize", 2);
+ }
+
+ adjustSize();
if (!eventId.empty())
setActionEventId(eventId);
@@ -81,8 +90,15 @@ TextField::TextField(const Widget2 *const widget,
TextField::~TextField()
{
instances--;
- if (instances == 0 && Theme::instance())
- Theme::instance()->unloadRect(skin);
+ if (instances == 0)
+ {
+ Theme *const theme = Theme::instance();
+ if (theme)
+ {
+ theme->unload(mSkin);
+ theme->unloadRect(skin);
+ }
+ }
}
void TextField::updateAlpha()
@@ -114,19 +130,14 @@ void TextField::draw(gcn::Graphics *graphics)
graphics->setColor(mForegroundColor);
graphics->setFont(getFont());
- graphics->drawText(mText, 1 - mXScroll, 1);
+ graphics->drawText(mText, mPadding - mXScroll, mPadding);
}
void TextField::drawFrame(gcn::Graphics *graphics)
{
- //updateAlpha(); -> Not useful...
-
- int w, h;
const int bs = 2 * getFrameSize();
- w = getWidth() + bs;
- h = getHeight() + bs;
-
- static_cast<Graphics*>(graphics)->drawImageRect(0, 0, w, h, skin);
+ static_cast<Graphics*>(graphics)->drawImageRect(0, 0,
+ getWidth() + bs, getHeight() + bs, skin);
}
void TextField::setNumeric(const bool numeric)
@@ -447,5 +458,56 @@ void TextField::drawCaret(gcn::Graphics* graphics, int x)
const gcn::Rectangle clipArea = graphics->getCurrentClipArea();
graphics->setColor(*mCaretColor);
- graphics->drawLine(x, clipArea.height - 2, x, 1);
+ graphics->drawLine(x + mPadding, clipArea.height - mPadding,
+ x + mPadding, mPadding);
+}
+
+void TextField::adjustSize()
+{
+ setWidth(getFont()->getWidth(mText) + 2 * mPadding + 1);
+ adjustHeight();
+
+ fixScroll();
+}
+
+void TextField::adjustHeight()
+{
+ setHeight(getFont()->getHeight() + 2 * mPadding);
+}
+
+void TextField::fixScroll()
+{
+ if (isFocused())
+ {
+ const int caretX = getFont()->getWidth(
+ mText.substr(0, mCaretPosition));
+
+ const int pad = 2 * mPadding;
+ if (caretX - mXScroll >= getWidth() - pad)
+ {
+ mXScroll = caretX - getWidth() + pad;
+ }
+ else if (caretX - mXScroll <= 0)
+ {
+ mXScroll = caretX - getWidth() / 2;
+
+ if (mXScroll < 0)
+ mXScroll = 0;
+ }
+ }
+}
+
+void TextField::setCaretPosition(unsigned int position)
+{
+ if (position > mText.size())
+ mCaretPosition = static_cast<int>(mText.size());
+ else
+ mCaretPosition = position;
+
+ fixScroll();
+}
+
+void TextField::fontChanged()
+{
+ fixScroll();
}
diff --git a/src/gui/widgets/textfield.h b/src/gui/widgets/textfield.h
index f5f6a3eb9..dc35cfe70 100644
--- a/src/gui/widgets/textfield.h
+++ b/src/gui/widgets/textfield.h
@@ -109,9 +109,19 @@ class TextField : public gcn::TextField,
void setSendAlwaysEvents(bool b)
{ mSendAlwaysEvents = b; }
+ void adjustSize();
+
+ void adjustHeight();
+
+ void setCaretPosition(unsigned int position);
+
protected:
void drawCaret(gcn::Graphics* graphics, int x) override;
+ void fixScroll();
+
+ void fontChanged();
+
bool mSendAlwaysEvents;
private:
@@ -122,11 +132,13 @@ class TextField : public gcn::TextField,
static int instances;
static float mAlpha;
static ImageRect skin;
+ static Skin *mSkin;
bool mNumeric;
int mMinimum;
unsigned mMaximum;
bool mLoseFocusOnTab;
int mLastEventPaste;
+ int mPadding;
const gcn::Color *mCaretColor;
};
diff --git a/src/guichan/widgets/textfield.cpp b/src/guichan/widgets/textfield.cpp
index 64d647631..c0575eace 100644
--- a/src/guichan/widgets/textfield.cpp
+++ b/src/guichan/widgets/textfield.cpp
@@ -115,46 +115,18 @@ namespace gcn
void TextField::adjustSize()
{
- setWidth(getFont()->getWidth(mText) + 7);
- adjustHeight();
-
- fixScroll();
}
void TextField::adjustHeight()
{
- setHeight(getFont()->getHeight() + 4);
}
void TextField::fixScroll()
{
- if (isFocused())
- {
- const int caretX = getFont()->getWidth(
- mText.substr(0, mCaretPosition));
-
- if (caretX - mXScroll >= getWidth() - 4)
- {
- mXScroll = caretX - getWidth() + 4;
- }
- else if (caretX - mXScroll <= 0)
- {
- mXScroll = caretX - getWidth() / 2;
-
- if (mXScroll < 0)
- mXScroll = 0;
- }
- }
}
void TextField::setCaretPosition(unsigned int position)
{
- if (position > mText.size())
- mCaretPosition = static_cast<int>(mText.size());
- else
- mCaretPosition = position;
-
- fixScroll();
}
unsigned int TextField::getCaretPosition() const
@@ -169,6 +141,5 @@ namespace gcn
void TextField::fontChanged()
{
- fixScroll();
}
}