From 351e16d2f290a5b30981b7beae87d5d8a1a30662 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sun, 24 May 2015 15:45:13 +0300 Subject: Improve checkbox draw speed. Use local text image and improve a bit calculations in draw. --- src/gui/widgets/checkbox.cpp | 49 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 45 insertions(+), 4 deletions(-) (limited to 'src/gui/widgets/checkbox.cpp') diff --git a/src/gui/widgets/checkbox.cpp b/src/gui/widgets/checkbox.cpp index 8bcb583c7..e2141058c 100644 --- a/src/gui/widgets/checkbox.cpp +++ b/src/gui/widgets/checkbox.cpp @@ -91,14 +91,18 @@ CheckBox::CheckBox(const Widget2 *const widget, Widget(widget), ToolTipListener(), KeyListener(), + WidgetListener(), mSelected(selected), mCaption(), + mTextChunk(), mPadding(0), mImagePadding(0), mImageSize(9), mSpacing(2), + mTextX(0 + 9 + 2), mHasMouse(false), - mDrawBox(true) + mDrawBox(true), + mTextChanged(true) { setCaption(caption); mAllowLogic = false; @@ -133,12 +137,16 @@ CheckBox::CheckBox(const Widget2 *const widget, mImageSize = mSkin->getOption("imageSize"); mSpacing = mSkin->getOption("spacing"); mDrawBox = mSkin->getOption("drawBox", 1); + mTextX = mPadding + mImageSize + mSpacing; } adjustSize(); } CheckBox::~CheckBox() { + if (mWindow) + mWindow->removeWidgetListener(this); + if (gui) gui->removeDragged(this); @@ -157,9 +165,22 @@ void CheckBox::draw(Graphics *const graphics) drawBox(graphics); Font *const font = getFont(); - graphics->setColorAll(mForegroundColor, mForegroundColor2); - font->drawString(graphics, mCaption, mPadding + mImageSize + mSpacing, - mPadding); + + if (mTextChanged) + { + mTextChunk.textFont = font; + mTextChunk.deleteImage(); + mTextChunk.text = mCaption; + mTextChunk.color = mForegroundColor; + mTextChunk.color2 = mForegroundColor2; + font->generate(mTextChunk); + mTextChanged = false; + } + + const Image *const image = mTextChunk.img; + if (image) + graphics->drawImage(image, mTextX, mPadding); + BLOCK_END("CheckBox::draw") } @@ -276,3 +297,23 @@ void CheckBox::toggleSelected() mSelected = !mSelected; distributeActionEvent(); } + +void CheckBox::setCaption(const std::string& caption) +{ + if (caption != mCaption) + mTextChanged = true; + mCaption = caption; +} + +void CheckBox::setParent(Widget *widget) +{ + if (mWindow) + mWindow->addWidgetListener(this); + Widget::setParent(widget); +} + +void CheckBox::widgetHidden(const Event &event A_UNUSED) +{ + mTextChanged = true; + mTextChunk.deleteImage(); +} -- cgit v1.2.3-60-g2f50