From 818c7459e79d9516ff0f7480fa05d1d008b17423 Mon Sep 17 00:00:00 2001 From: dankan1890 Date: Thu, 29 Sep 2016 14:00:45 +0200 Subject: [PATCH] place::modify() now correctly updates the text to place::div_text. Note: I reverted the previous commit because it had an incorrect formatting. --- include/nana/gui/place.hpp | 4 ++-- source/gui/place.cpp | 30 ++++++++++++++++++++---------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/include/nana/gui/place.hpp b/include/nana/gui/place.hpp index 176c7bd4..08ddad4d 100644 --- a/include/nana/gui/place.hpp +++ b/include/nana/gui/place.hpp @@ -118,10 +118,10 @@ namespace nana field_reference field(const char* name);///< Returns a field with the specified name. - void field_visible(const char* field_name, bool visible); ///<splitter.reset(); ::nana::rectangle child_r; - double split_range_begin = -1, split_range_end; + double split_range_begin = -1, split_range_end = 0; switch (child->dir) { default: @@ -2622,6 +2622,10 @@ namespace nana return impl_->div_text; } + enum div_type { erase = 0, insert, replace }; + + void update_div(std::string& div, const char* field, const char* attr, div_type insertion); + void place::modify(const char* name, const char* div_text) { if (nullptr == div_text) @@ -2676,6 +2680,7 @@ namespace nana impl_->check_unique(impl_->root_division.get()); impl_->connect(impl_->root_division.get()); impl_->tmp_replaced.reset(); + update_div(impl_->div_text, name, div_text, div_type::replace); modified_ptr->div_owner = div_owner; modified_ptr->div_next = div_next; @@ -2740,7 +2745,7 @@ namespace nana return pos; } - void update_div(std::string& div, const char* field, const char* attr, bool insertion) + void update_div(std::string& div, const char* field, const char* attr, div_type insertion) { const auto fieldname_pos = find_idstr(div, field); if (div.npos == fieldname_pos) @@ -2830,13 +2835,18 @@ namespace nana if (fieldstr.npos == pos) { //There is not an attribute - if (insertion) + if (insertion == div_type::insert) div.insert(fieldname_pos + std::strlen(field), " " + std::string(attr)); + else if (insertion == div_type::replace) + { + div.erase(begin + 1, fieldstr.length()); + div.insert(begin + 1, std::string(attr) + " " + std::string(field)); + } } else { //There is an attribute - if (!insertion) + if (insertion == div_type::erase) { div.erase(begin + pos + 1, std::strlen(attr)); @@ -2846,7 +2856,7 @@ namespace nana } } - void place::field_visible(const char* name, bool vsb) + void place::field_visible(const char* name, bool vsb) const { if (!name) name = ""; @@ -2857,7 +2867,7 @@ namespace nana if (div) { div->set_visible(vsb); - update_div(impl_->div_text, name, "invisible", !vsb); + update_div(impl_->div_text, name, "invisible", !vsb ? div_type::insert : div_type::erase); } } @@ -2872,7 +2882,7 @@ namespace nana return (div && div->visible); } - void place::field_display(const char* name, bool dsp) + void place::field_display(const char* name, bool dsp) const { if (!name) name = ""; @@ -2882,8 +2892,8 @@ namespace nana auto div = impl_->search_div_name(impl_->root_division.get(), name); if (div) { - update_div(impl_->div_text, name, "invisible", false); - update_div(impl_->div_text, name, "undisplayed", !dsp); + update_div(impl_->div_text, name, "invisible", div_type::erase); + update_div(impl_->div_text, name, "undisplayed", !dsp ? div_type::insert : div_type::erase); div->set_display(dsp); } }