diff --git a/include/nana/gui/detail/drawer.hpp b/include/nana/gui/detail/drawer.hpp index e313c172..472f822e 100644 --- a/include/nana/gui/detail/drawer.hpp +++ b/include/nana/gui/detail/drawer.hpp @@ -126,36 +126,36 @@ namespace nana void* draw(std::function &&, bool diehard); void erase(void* diehard); private: - void _m_bground_pre(); - void _m_bground_end(); - void _m_draw_dynamic_drawing_object(); + void _m_effect_bground(bool before); bool _m_lazy_decleared() const; + method_state& _m_mth_state(int pos); template void _m_emit(event_code evt_code, const Arg& arg, Mfptr mfptr) { const int pos = static_cast(evt_code); - if (data_impl_->realizer && (method_state::not_overrided != data_impl_->mth_state[pos])) - { - _m_bground_pre(); - if (method_state::pending == data_impl_->mth_state[pos]) + auto realizer = this->realizer(); + auto & mth_state = _m_mth_state(pos); + + if (realizer && (method_state::not_overrided != mth_state)) + { + _m_effect_bground(true); + + if (method_state::pending == mth_state) { - (data_impl_->realizer->*mfptr)(graphics, arg); + (realizer->*mfptr)(graphics, arg); //Check realizer, when the window is closed in that event handler, the drawer will be //detached and realizer will be a nullptr - if (data_impl_->realizer) - data_impl_->mth_state[pos] = (data_impl_->realizer->_m_overrided(evt_code) ? method_state::overrided : method_state::not_overrided); + if (realizer) + mth_state = (realizer->_m_overrided(evt_code) ? method_state::overrided : method_state::not_overrided); } else - (data_impl_->realizer->*mfptr)(graphics, arg); + (realizer->*mfptr)(graphics, arg); if (_m_lazy_decleared()) - { - _m_draw_dynamic_drawing_object(); - _m_bground_end(); - } + _m_effect_bground(false); } } public: diff --git a/source/gui/detail/drawer.cpp b/source/gui/detail/drawer.cpp index e741692b..fdf569aa 100644 --- a/source/gui/detail/drawer.cpp +++ b/source/gui/detail/drawer.cpp @@ -1,7 +1,7 @@ /* * A Drawer Implementation * Nana C++ Library(http://www.nanapro.org) - * Copyright(C) 2003-2014 Jinhao(cnjinhao@hotmail.com) + * Copyright(C) 2003-2016 Jinhao(cnjinhao@hotmail.com) * * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at @@ -297,10 +297,9 @@ namespace nana if (data_impl_->realizer && !data_impl_->refreshing) { data_impl_->refreshing = true; - _m_bground_pre(); + _m_effect_bground(true); data_impl_->realizer->refresh(graphics); - _m_draw_dynamic_drawing_object(); - _m_bground_end(); + _m_effect_bground(false); graphics.flush(); data_impl_->refreshing = false; } @@ -372,27 +371,32 @@ namespace nana } } - void drawer::_m_bground_pre() - { - if (data_impl_->window_handle->effect.bground && data_impl_->window_handle->effect.bground_fade_rate < 0.01) - data_impl_->window_handle->other.glass_buffer.paste(graphics, 0, 0); - } - - void drawer::_m_bground_end() - { - if (data_impl_->window_handle->effect.bground && data_impl_->window_handle->effect.bground_fade_rate >= 0.01) - data_impl_->window_handle->other.glass_buffer.blend(::nana::rectangle{ data_impl_->window_handle->other.glass_buffer.size() }, graphics, nana::point(), data_impl_->window_handle->effect.bground_fade_rate); - } - - void drawer::_m_draw_dynamic_drawing_object() + void drawer::_m_effect_bground(bool before) { for (auto * dw : data_impl_->draws) dw->draw(graphics); + + auto & effect = data_impl_->window_handle->effect; + if (effect.bground) + { + if (before) + { + if (effect.bground_fade_rate < 0.01) + data_impl_->window_handle->other.glass_buffer.paste(graphics, 0, 0); + } + else if (effect.bground_fade_rate >= 0.01) + data_impl_->window_handle->other.glass_buffer.blend(::nana::rectangle{ data_impl_->window_handle->other.glass_buffer.size() }, graphics, nana::point(), effect.bground_fade_rate); + } } bool drawer::_m_lazy_decleared() const { return (basic_window::update_state::refresh == data_impl_->window_handle->other.upd_state); } + + drawer::method_state& drawer::_m_mth_state(int pos) + { + return data_impl_->mth_state[pos]; + } }//end namespace detail }//end namespace nana