summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-05-25 17:46:38 +0300
committerAndrei Karas <akaras@inbox.ru>2015-05-25 17:46:38 +0300
commit828ee982227fc8b4a426a64d3d5f01a7cd4c99a5 (patch)
tree27cca4e9688b3a89700fbb6a926369c17c46c0a4
parent9a57dd887539cab680cbcc2c8e7a2f18d5aa3c04 (diff)
downloadmv-828ee982227fc8b4a426a64d3d5f01a7cd4c99a5.tar.gz
mv-828ee982227fc8b4a426a64d3d5f01a7cd4c99a5.tar.bz2
mv-828ee982227fc8b4a426a64d3d5f01a7cd4c99a5.tar.xz
mv-828ee982227fc8b4a426a64d3d5f01a7cd4c99a5.zip
Add safeDraw method into button.
-rw-r--r--src/gui/widgets/button.cpp183
-rw-r--r--src/gui/widgets/button.h2
2 files changed, 154 insertions, 31 deletions
diff --git a/src/gui/widgets/button.cpp b/src/gui/widgets/button.cpp
index 13c93ed1a..d40d8ab68 100644
--- a/src/gui/widgets/button.cpp
+++ b/src/gui/widgets/button.cpp
@@ -566,48 +566,169 @@ void Button::draw(Graphics *graphics)
}
}
- if (isBatchDrawRenders(openGLMode))
+ if (recalc)
{
- if (recalc)
- {
- mRedraw = false;
- mMode = mode;
- mVertexes2->clear();
- graphics->calcWindow(mVertexes2,
- 0, 0,
- width, height,
- skin->getBorder());
+ mRedraw = false;
+ mMode = mode;
+ mVertexes2->clear();
+ graphics->calcWindow(mVertexes2,
+ 0, 0,
+ width, height,
+ skin->getBorder());
- if (mImages)
+ if (mImages)
+ {
+ if (isPressed())
{
- if (isPressed())
- {
- graphics->calcTileCollection(mVertexes2,
- mImages[mode],
- imageX + 1, imageY + 1);
- }
- else
- {
- graphics->calcTileCollection(mVertexes2,
- mImages[mode],
- imageX, imageY);
- }
+ graphics->calcTileCollection(mVertexes2,
+ mImages[mode],
+ imageX + 1, imageY + 1);
}
- graphics->finalize(mVertexes2);
+ else
+ {
+ graphics->calcTileCollection(mVertexes2,
+ mImages[mode],
+ imageX, imageY);
+ }
+ }
+ graphics->finalize(mVertexes2);
+ }
+ graphics->drawTileCollection(mVertexes2);
+
+ if (isPressed())
+ {
+ textX ++;
+ textY ++;
+ }
+
+ if (mTextChanged)
+ {
+ mTextChunk.textFont = font;
+ mTextChunk.deleteImage();
+ mTextChunk.text = mCaption;
+ switch (mode)
+ {
+ case BUTTON_DISABLED:
+ mTextChunk.color = mDisabledColor;
+ mTextChunk.color2 = mDisabledColor2;
+ break;
+ case BUTTON_PRESSED:
+ mTextChunk.color = mPressedColor;
+ mTextChunk.color2 = mPressedColor2;
+ break;
+ case BUTTON_HIGHLIGHTED:
+ mTextChunk.color = mHighlightedColor;
+ mTextChunk.color2 = mHighlightedColor2;
+ break;
+ default:
+ mTextChunk.color = mEnabledColor;
+ mTextChunk.color2 = mEnabledColor2;
+ break;
}
- graphics->drawTileCollection(mVertexes2);
+ font->generate(mTextChunk);
+ mTextChanged = false;
}
+
+ const Image *const image = mTextChunk.img;
+ if (image)
+ graphics->drawImage(image, textX, textY);
+
+ BLOCK_END("Button::draw")
+}
+
+void Button::safeDraw(Graphics *graphics)
+{
+ BLOCK_START("Button::safeDraw")
+ int mode;
+
+ if (!isEnabled())
+ mode = BUTTON_DISABLED;
+ else if (isPressed2())
+ mode = BUTTON_PRESSED;
+ else if (mHasMouse || isFocused())
+ mode = BUTTON_HIGHLIGHTED;
else
+ mode = BUTTON_STANDARD;
+
+ const Skin *const skin = button[mode];
+ if (!skin)
{
- graphics->drawImageRect(0, 0, width, height, skin->getBorder());
+ BLOCK_END("Button::safeDraw")
+ return;
+ }
- if (mImages)
+ updateAlpha();
+
+ if (mMode != mode)
+ {
+ mTextChanged = true;
+ mMode = mode;
+ }
+
+ const int padding = skin->getPadding();
+ const int spacing = mSpacing[mode];
+
+ int imageX = 0;
+ int imageY = 0;
+ int textX = 0;
+ const Rect &rect = mDimension;
+ const int width = rect.width;
+ const int height = rect.height;
+ Font *const font = getFont();
+ int textY = height / 2 - font->getHeight() / 2;
+ if (mImages)
+ imageY = height / 2 - mImageHeight / 2;
+
+// need move calculation from draw!!!
+
+ switch (mAlignment)
+ {
+ default:
+ case Graphics::LEFT:
{
- if (isPressed())
- graphics->drawImage(mImages[mode], imageX + 1, imageY + 1);
+ if (mImages)
+ {
+ imageX = padding;
+ textX = padding + mImageWidth + spacing;
+ }
else
- graphics->drawImage(mImages[mode], imageX, imageY);
+ {
+ textX = padding;
+ }
+ break;
+ }
+ case Graphics::CENTER:
+ {
+ const int width1 = font->getWidth(mCaption);
+ if (mImages)
+ {
+ const int w = width1 + mImageWidth + spacing;
+ imageX = (width - w) / 2;
+ textX = imageX + mImageWidth + spacing - width1 / 2;
+ }
+ else
+ {
+ textX = (width - width1) / 2;
+ }
+ break;
}
+ case Graphics::RIGHT:
+ {
+ const int width1 = font->getWidth(mCaption);
+ textX = width - width1 - padding;
+ imageX = textX - width1 - spacing;
+ break;
+ }
+ }
+
+ graphics->drawImageRect(0, 0, width, height, skin->getBorder());
+
+ if (mImages)
+ {
+ if (isPressed())
+ graphics->drawImage(mImages[mode], imageX + 1, imageY + 1);
+ else
+ graphics->drawImage(mImages[mode], imageX, imageY);
}
if (isPressed())
@@ -648,7 +769,7 @@ void Button::draw(Graphics *graphics)
if (image)
graphics->drawImage(image, textX, textY);
- BLOCK_END("Button::draw")
+ BLOCK_END("Button::safeDraw")
}
void Button::mouseReleased(MouseEvent& event)
diff --git a/src/gui/widgets/button.h b/src/gui/widgets/button.h
index d8c5e66b8..5c63c86ce 100644
--- a/src/gui/widgets/button.h
+++ b/src/gui/widgets/button.h
@@ -153,6 +153,8 @@ class Button final : public Widget,
*/
void draw(Graphics *graphics) override final;
+ void safeDraw(Graphics *graphics) override final;
+
/**
* Update the alpha value to the button components.
*/