From 37597422a0d458a224fed0258d093f7a7e400041 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Mon, 17 Mar 2014 15:54:50 +0300 Subject: Exclude useless logic methods calls. --- src/gui/widgets/basiccontainer.cpp | 51 +++++++++++++++++++++++++++-------- src/gui/widgets/basiccontainer.h | 4 ++- src/gui/widgets/browserbox.cpp | 2 ++ src/gui/widgets/button.cpp | 1 + src/gui/widgets/checkbox.cpp | 1 + src/gui/widgets/dropdown.cpp | 1 + src/gui/widgets/emotepage.cpp | 1 + src/gui/widgets/guitable.cpp | 1 + src/gui/widgets/icon.cpp | 2 ++ src/gui/widgets/itemcontainer.cpp | 1 + src/gui/widgets/label.cpp | 1 + src/gui/widgets/playerbox.cpp | 1 + src/gui/widgets/popuplist.cpp | 2 +- src/gui/widgets/radiobutton.cpp | 1 + src/gui/widgets/shortcutcontainer.cpp | 1 + src/gui/widgets/slider.cpp | 1 + src/gui/widgets/sliderlist.cpp | 1 + src/gui/widgets/tabstrip.cpp | 2 ++ src/gui/widgets/textbox.cpp | 1 + src/gui/widgets/textfield.cpp | 1 + src/gui/widgets/textpreview.cpp | 1 + src/gui/widgets/widget.cpp | 3 ++- src/gui/widgets/widget.h | 7 ++++- src/gui/widgets/windowcontainer.cpp | 34 ++++++++++++++++------- 24 files changed, 98 insertions(+), 24 deletions(-) (limited to 'src') diff --git a/src/gui/widgets/basiccontainer.cpp b/src/gui/widgets/basiccontainer.cpp index 7032cd981..60c6ac336 100644 --- a/src/gui/widgets/basiccontainer.cpp +++ b/src/gui/widgets/basiccontainer.cpp @@ -80,6 +80,15 @@ void BasicContainer::moveToTop(Widget* widget) { mWidgets.erase(iter); mWidgets.push_back(widget); + break; + } + } + FOR_EACH (WidgetListIterator, iter, mLogicWidgets) + { + if (*iter == widget) + { + mLogicWidgets.erase(iter); + mLogicWidgets.push_back(widget); return; } } @@ -89,23 +98,32 @@ void BasicContainer::moveToBottom(Widget* widget) { WidgetListIterator iter = std::find(mWidgets.begin(), mWidgets.end(), widget); + if (iter != mWidgets.end()) + { + mWidgets.erase(iter); + mWidgets.insert(mWidgets.begin(), widget); + } - if (iter == mWidgets.end()) - return; - - mWidgets.erase(iter); - mWidgets.insert(mWidgets.begin(), widget); + WidgetListIterator iter2 = std::find(mLogicWidgets.begin(), + mLogicWidgets.end(), widget); + if (iter2 != mLogicWidgets.end()) + { + mLogicWidgets.erase(iter2); + mLogicWidgets.insert(mLogicWidgets.begin(), widget); + } } void BasicContainer::death(const Event &event) { WidgetListIterator iter = std::find(mWidgets.begin(), mWidgets.end(), event.getSource()); + if (iter != mWidgets.end()) + mWidgets.erase(iter); - if (iter == mWidgets.end()) - return; - - mWidgets.erase(iter); + WidgetListIterator iter2 = std::find(mLogicWidgets.begin(), + mLogicWidgets.end(), event.getSource()); + if (iter2 != mLogicWidgets.end()) + mLogicWidgets.erase(iter2); } Rect BasicContainer::getChildrenArea() @@ -215,9 +233,11 @@ void BasicContainer::_setFocusHandler(FocusHandler *const focusHandler) (*iter)->_setFocusHandler(focusHandler); } -void BasicContainer::add(Widget* widget) +void BasicContainer::add(Widget *const widget) { mWidgets.push_back(widget); + if (widget->isAllowLogic()) + mLogicWidgets.push_back(widget); if (!mInternalFocusHandler) widget->_setFocusHandler(_getFocusHandler()); @@ -241,6 +261,14 @@ void BasicContainer::remove(Widget* widget) return; } } + FOR_EACH (WidgetListIterator, iter, mLogicWidgets) + { + if (*iter == widget) + { + mLogicWidgets.erase(iter); + return; + } + } } void BasicContainer::clear() @@ -254,6 +282,7 @@ void BasicContainer::clear() } mWidgets.clear(); + mLogicWidgets.clear(); } void BasicContainer::drawChildren(Graphics* graphics) @@ -299,7 +328,7 @@ void BasicContainer::drawChildren(Graphics* graphics) void BasicContainer::logicChildren() { BLOCK_START("BasicContainer::logicChildren") - FOR_EACH (WidgetListConstIterator, iter, mWidgets) + FOR_EACH (WidgetListConstIterator, iter, mLogicWidgets) (*iter)->logic(); BLOCK_END("BasicContainer::logicChildren") } diff --git a/src/gui/widgets/basiccontainer.h b/src/gui/widgets/basiccontainer.h index 3e3976a70..2d8a9beee 100644 --- a/src/gui/widgets/basiccontainer.h +++ b/src/gui/widgets/basiccontainer.h @@ -140,7 +140,7 @@ class BasicContainer : public Widget, * @param widget The widget to add. * @see remove, clear */ - void add(Widget* widget); + void add(Widget *const widget); /** * Removes a widget from the basic container. @@ -199,6 +199,8 @@ class BasicContainer : public Widget, * Holds all widgets of the basic container. */ WidgetList mWidgets; + + WidgetList mLogicWidgets; }; #endif // GUI_WIDGETS_BASICCONTAINER_H diff --git a/src/gui/widgets/browserbox.cpp b/src/gui/widgets/browserbox.cpp index 010d3d9f3..c344d8d41 100644 --- a/src/gui/widgets/browserbox.cpp +++ b/src/gui/widgets/browserbox.cpp @@ -83,6 +83,8 @@ BrowserBox::BrowserBox(const Widget2 *const widget, mEnableKeys(false), mEnableTabs(false) { + mAllowLogic = false; + setFocusable(true); addMouseListener(this); diff --git a/src/gui/widgets/button.cpp b/src/gui/widgets/button.cpp index 8ac4251cf..a718fe70c 100644 --- a/src/gui/widgets/button.cpp +++ b/src/gui/widgets/button.cpp @@ -327,6 +327,7 @@ Button::Button(const Widget2 *const widget, void Button::init() { + mAllowLogic = false; addMouseListener(this); addKeyListener(this); addFocusListener(this); diff --git a/src/gui/widgets/checkbox.cpp b/src/gui/widgets/checkbox.cpp index c44c88980..3816fe436 100644 --- a/src/gui/widgets/checkbox.cpp +++ b/src/gui/widgets/checkbox.cpp @@ -98,6 +98,7 @@ CheckBox::CheckBox(const Widget2 *const widget, mDrawBox(true) { setCaption(caption); + mAllowLogic = false; setFocusable(true); addMouseListener(this); diff --git a/src/gui/widgets/dropdown.cpp b/src/gui/widgets/dropdown.cpp index 53f4a623b..7173e04b4 100644 --- a/src/gui/widgets/dropdown.cpp +++ b/src/gui/widgets/dropdown.cpp @@ -78,6 +78,7 @@ DropDown::DropDown(const Widget2 *const widget, mPushed(false), mIsDragged(false) { + mAllowLogic = false; mPopup->postInit(); mFrameSize = 2; mForegroundColor2 = getThemeColor(Theme::DROPDOWN_OUTLINE); diff --git a/src/gui/widgets/emotepage.cpp b/src/gui/widgets/emotepage.cpp index 139082815..9000c147b 100644 --- a/src/gui/widgets/emotepage.cpp +++ b/src/gui/widgets/emotepage.cpp @@ -45,6 +45,7 @@ EmotePage::EmotePage(const Widget2 *const widget) : { addMouseListener(this); addWidgetListener(this); + mAllowLogic = false; } EmotePage::~EmotePage() diff --git a/src/gui/widgets/guitable.cpp b/src/gui/widgets/guitable.cpp index dc097c031..c7964d3c6 100644 --- a/src/gui/widgets/guitable.cpp +++ b/src/gui/widgets/guitable.cpp @@ -110,6 +110,7 @@ GuiTable::GuiTable(const Widget2 *const widget, mOpaque(opacity), mSelectable(true) { + mAllowLogic = false; mBackgroundColor = getThemeColor(Theme::BACKGROUND); setModel(initial_model); diff --git a/src/gui/widgets/icon.cpp b/src/gui/widgets/icon.cpp index 9a86fc9bf..3ffac4a7d 100644 --- a/src/gui/widgets/icon.cpp +++ b/src/gui/widgets/icon.cpp @@ -39,6 +39,7 @@ Icon::Icon(const Widget2 *const widget, const SDL_Rect &bounds = mImage->mBounds; setSize(bounds.w, bounds.h); } + mAllowLogic = false; } Icon::Icon(const Widget2 *const widget, @@ -51,6 +52,7 @@ Icon::Icon(const Widget2 *const widget, const SDL_Rect &bounds = mImage->mBounds; setSize(bounds.w, bounds.h); } + mAllowLogic = false; } Icon::~Icon() diff --git a/src/gui/widgets/itemcontainer.cpp b/src/gui/widgets/itemcontainer.cpp index ecabc226f..3fba41750 100644 --- a/src/gui/widgets/itemcontainer.cpp +++ b/src/gui/widgets/itemcontainer.cpp @@ -196,6 +196,7 @@ ItemContainer::ItemContainer(const Widget2 *const widget, addKeyListener(this); addMouseListener(this); addWidgetListener(this); + mAllowLogic = false; } ItemContainer::~ItemContainer() diff --git a/src/gui/widgets/label.cpp b/src/gui/widgets/label.cpp index 7318fc3d1..c37308a1e 100644 --- a/src/gui/widgets/label.cpp +++ b/src/gui/widgets/label.cpp @@ -112,6 +112,7 @@ Label::~Label() void Label::init() { + mAllowLogic = false; mForegroundColor = getThemeColor(Theme::LABEL); mForegroundColor2 = getThemeColor(Theme::LABEL_OUTLINE); if (mInstances == 0) diff --git a/src/gui/widgets/playerbox.cpp b/src/gui/widgets/playerbox.cpp index 6f68f8689..6a0fbd607 100644 --- a/src/gui/widgets/playerbox.cpp +++ b/src/gui/widgets/playerbox.cpp @@ -83,6 +83,7 @@ PlayerBox::~PlayerBox() void PlayerBox::init(std::string name, std::string selectedName) { + mAllowLogic = false; setFrameSize(2); addMouseListener(this); diff --git a/src/gui/widgets/popuplist.cpp b/src/gui/widgets/popuplist.cpp index cfb973384..2636dac38 100644 --- a/src/gui/widgets/popuplist.cpp +++ b/src/gui/widgets/popuplist.cpp @@ -43,7 +43,7 @@ PopupList::PopupList(DropDown *const widget, mModal(modal) { mListBox->postInit(); - + mAllowLogic = false; setFocusable(true); mListBox->setDistributeMousePressed(true); diff --git a/src/gui/widgets/radiobutton.cpp b/src/gui/widgets/radiobutton.cpp index 4841ececb..8abac91cf 100644 --- a/src/gui/widgets/radiobutton.cpp +++ b/src/gui/widgets/radiobutton.cpp @@ -98,6 +98,7 @@ RadioButton::RadioButton(const Widget2 *const widget, mSpacing(2), mHasMouse(false) { + mAllowLogic = false; setCaption(caption); setGroup(group); setSelected(marked); diff --git a/src/gui/widgets/shortcutcontainer.cpp b/src/gui/widgets/shortcutcontainer.cpp index 0d9aa64a6..b1bb1e867 100644 --- a/src/gui/widgets/shortcutcontainer.cpp +++ b/src/gui/widgets/shortcutcontainer.cpp @@ -43,6 +43,7 @@ ShortcutContainer::ShortcutContainer(Widget2 *const widget) : mVertexes(new ImageCollection), mRedraw(true) { + mAllowLogic = false; } ShortcutContainer::~ShortcutContainer() diff --git a/src/gui/widgets/slider.cpp b/src/gui/widgets/slider.cpp index c9ea9e6c2..6de889249 100644 --- a/src/gui/widgets/slider.cpp +++ b/src/gui/widgets/slider.cpp @@ -142,6 +142,7 @@ Slider::~Slider() void Slider::init() { + mAllowLogic = false; setFocusable(true); setFrameSize(1); diff --git a/src/gui/widgets/sliderlist.cpp b/src/gui/widgets/sliderlist.cpp index 03f0c4ed2..6782e789c 100644 --- a/src/gui/widgets/sliderlist.cpp +++ b/src/gui/widgets/sliderlist.cpp @@ -46,6 +46,7 @@ SliderList::SliderList(const Widget2 *const widget, mOldWidth(0), mSelectedIndex(0) { + mAllowLogic = false; setHeight(sliderHeight); } diff --git a/src/gui/widgets/tabstrip.cpp b/src/gui/widgets/tabstrip.cpp index 57520afce..06e2fd3b8 100644 --- a/src/gui/widgets/tabstrip.cpp +++ b/src/gui/widgets/tabstrip.cpp @@ -30,6 +30,7 @@ TabStrip::TabStrip(const Widget2 *const widget, const int spacing) : WidgetGroup(widget, group, height, spacing) { + mAllowLogic = false; } TabStrip::TabStrip(const Widget2 *const widget, @@ -37,6 +38,7 @@ TabStrip::TabStrip(const Widget2 *const widget, const int spacing) : WidgetGroup(widget, "", height, spacing) { + mAllowLogic = false; } Widget *TabStrip::createWidget(const std::string &text) const diff --git a/src/gui/widgets/textbox.cpp b/src/gui/widgets/textbox.cpp index 5f565259b..5008da6ea 100644 --- a/src/gui/widgets/textbox.cpp +++ b/src/gui/widgets/textbox.cpp @@ -85,6 +85,7 @@ TextBox::TextBox(const Widget2 *const widget) : mEditable(true), mOpaque(true) { + mAllowLogic = false; setText(""); setFocusable(true); diff --git a/src/gui/widgets/textfield.cpp b/src/gui/widgets/textfield.cpp index 0a1caa0e5..98a308e37 100644 --- a/src/gui/widgets/textfield.cpp +++ b/src/gui/widgets/textfield.cpp @@ -113,6 +113,7 @@ TextField::TextField(const Widget2 *restrict const widget, mAllowSpecialActions(true), mSendAlwaysEvents(sendAlwaysEvents) { + mAllowLogic = false; setFocusable(true); addMouseListener(this); addKeyListener(this); diff --git a/src/gui/widgets/textpreview.cpp b/src/gui/widgets/textpreview.cpp index ff0a647b8..6f358e956 100644 --- a/src/gui/widgets/textpreview.cpp +++ b/src/gui/widgets/textpreview.cpp @@ -48,6 +48,7 @@ TextPreview::TextPreview(const Widget2 *const widget, mShadow(false), mOutline(false) { + mAllowLogic = false; if (instances == 0) { if (theme) diff --git a/src/gui/widgets/widget.cpp b/src/gui/widgets/widget.cpp index d1ca474c4..cd1ac750c 100644 --- a/src/gui/widgets/widget.cpp +++ b/src/gui/widgets/widget.cpp @@ -108,7 +108,8 @@ Widget::Widget(const Widget2 *const widget) : mVisible(true), mTabIn(true), mTabOut(true), - mEnabled(true) + mEnabled(true), + mAllowLogic(true) { mWidgets.push_back(this); mWidgetsSet.insert(this); diff --git a/src/gui/widgets/widget.h b/src/gui/widgets/widget.h index beff5113b..c2b1040db 100644 --- a/src/gui/widgets/widget.h +++ b/src/gui/widgets/widget.h @@ -148,7 +148,7 @@ class Widget : public Widget2 * @see setFrameSize, getFrameSize * @since 0.8.0 */ - virtual void drawFrame(Graphics* graphics) + virtual void drawFrame(Graphics* graphics A_UNUSED) { } /** @@ -1007,6 +1007,9 @@ class Widget : public Widget2 */ virtual void showPart(const Rect &rectangle); + bool isAllowLogic() const + { return mAllowLogic; } + protected: /** * Distributes an action event to all action listeners @@ -1215,6 +1218,8 @@ class Widget : public Widget2 */ bool mEnabled; + bool mAllowLogic; + /** * Holds the global font used by the widget. */ diff --git a/src/gui/widgets/windowcontainer.cpp b/src/gui/widgets/windowcontainer.cpp index a9b556410..20c3328a7 100644 --- a/src/gui/widgets/windowcontainer.cpp +++ b/src/gui/widgets/windowcontainer.cpp @@ -64,18 +64,34 @@ void WindowContainer::moveWidgetAfter(Widget *const after, const WidgetListIterator widgetIter = std::find( mWidgets.begin(), mWidgets.end(), widget); - if (widgetIter == mWidgets.end()) - return; + if (widgetIter != mWidgets.end()) + { + WidgetListIterator afterIter = std::find( + mWidgets.begin(), mWidgets.end(), after); - WidgetListIterator afterIter = std::find( - mWidgets.begin(), mWidgets.end(), after); + if (afterIter != mWidgets.end()) + { + ++ afterIter; + mWidgets.erase(widgetIter); + mWidgets.insert(afterIter, widget); + } + } - if (afterIter == mWidgets.end()) - return; + const WidgetListIterator widgetIter2 = std::find( + mLogicWidgets.begin(), mLogicWidgets.end(), widget); - ++ afterIter; - mWidgets.erase(widgetIter); - mWidgets.insert(afterIter, widget); + if (widgetIter2 != mLogicWidgets.end()) + { + WidgetListIterator afterIter = std::find( + mLogicWidgets.begin(), mLogicWidgets.end(), after); + + if (afterIter != mLogicWidgets.end()) + { + ++ afterIter; + mLogicWidgets.erase(widgetIter2); + mLogicWidgets.insert(afterIter, widget); + } + } } #ifdef USE_PROFILER -- cgit v1.2.3-60-g2f50