diff --git a/include/nana/gui/detail/effects_renderer.hpp b/include/nana/gui/detail/effects_renderer.hpp index df9eadf4..27ea4ab6 100644 --- a/include/nana/gui/detail/effects_renderer.hpp +++ b/include/nana/gui/detail/effects_renderer.hpp @@ -3,7 +3,6 @@ #include #include #include - #include namespace nana{ @@ -12,7 +11,7 @@ namespace nana{ template class edge_nimbus_renderer { - edge_nimbus_renderer(){} + edge_nimbus_renderer() = default; public: typedef CoreWindow core_window_t; typedef window_layout window_layer; @@ -44,7 +43,7 @@ namespace nana{ auto graph = root_wd->root_graph; std::vector erase; - std::vector r_set; + std::vector> rd_set; nana::rectangle r; for(auto & action : nimbus) { @@ -53,8 +52,12 @@ namespace nana{ if(action.window == wd) rendered = true; - r_set.push_back(r); - action.rendered = true; + //Avoiding duplicated rendering. If the window is declared to lazy refresh, it should be rendered. + if (!action.rendered || (action.window->other.upd_state == core_window_t::update_state::refresh)) + { + rd_set.emplace_back(r, action.window); + action.rendered = true; + } } else if(action.rendered) { @@ -77,13 +80,9 @@ namespace nana{ graph->paste(native, r, r.x, r.y); } - auto visual_iterator = r_set.begin(); //Render - for(auto & action : nimbus) - { - if(action.rendered) - _m_render_edge_nimbus(action.window, *(visual_iterator++)); - } + for (auto & rd : rd_set) + _m_render_edge_nimbus(rd.second, rd.first); } return rendered; } @@ -102,7 +101,7 @@ namespace nana{ nana::rectangle r(visual); r.pare_off(-static_cast(weight())); nana::rectangle good_r; - if(overlap(r, nana::rectangle(wd->root_graph->size()), good_r)) + if(overlap(r, wd->root_graph->size(), good_r)) { if( (good_r.x < wd->pos_root.x) || (good_r.y < wd->pos_root.y) || (good_r.x + good_r.width > visual.x + visual.width) || (good_r.y + good_r.height > visual.y + visual.height)) diff --git a/source/gui/detail/drawer.cpp b/source/gui/detail/drawer.cpp index 63514af0..6e5c4673 100644 --- a/source/gui/detail/drawer.cpp +++ b/source/gui/detail/drawer.cpp @@ -380,7 +380,7 @@ namespace nana bool drawer::_m_lazy_decleared() const { - return (basic_window::update_state::refresh != core_window_->other.upd_state); + return (basic_window::update_state::refresh == core_window_->other.upd_state); } }//end namespace detail }//end namespace nana diff --git a/source/gui/detail/window_manager.cpp b/source/gui/detail/window_manager.cpp index ea956b24..990f1090 100644 --- a/source/gui/detail/window_manager.cpp +++ b/source/gui/detail/window_manager.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -747,6 +748,12 @@ namespace detail wndlayout_type::paint(wd, false, false); this->map(wd); } + else if (effects::edge_nimbus::none != wd->effect.edge_nimbus) + { + //Update the nimbus effect + using nimbus_renderer = detail::edge_nimbus_renderer; + nimbus_renderer::instance().render(wd); + } } else wndlayout_type::paint(wd, true, false); //only refreshing if it has an invisible parent