improve re-div of a dock place

This commit is contained in:
Jinhao 2015-09-22 23:41:55 +08:00
parent ccb334a907
commit 8d4ffa068d
2 changed files with 39 additions and 17 deletions

View File

@ -468,6 +468,7 @@ namespace nana
//connect the field/dock with div object
void connect(division* start);
void disconnect();
}; //end struct implement
class place::implement::field_gather
@ -2490,15 +2491,7 @@ namespace nana
if (!start)
return;
//disconnect
for (auto & fd : fields)
{
if (fd.second->attached)
{
fd.second->attached->field = nullptr;
fd.second->attached = nullptr;
}
}
this->disconnect();
std::map<std::string, field_dock*> docks_to_be_closed;
//disconnect
@ -2508,12 +2501,12 @@ namespace nana
docks_to_be_closed[dk.first] = dk.second;
}
std::function<void(division* div)> check_fn;
check_fn = [&check_fn, this, &docks_to_be_closed](division* div)
std::function<void(division* div)> connect_fn;
connect_fn = [&connect_fn, this, &docks_to_be_closed](division* div)
{
if (div->name.size())
{
if (division::kind::dock == div->kind_of_division)
if (division::kind::dock == div->kind_of_division || division::kind::dockpane == div->kind_of_division)
{
auto i = docks.find(div->name);
if (i != docks.end())
@ -2521,7 +2514,18 @@ namespace nana
docks_to_be_closed.erase(div->name);
auto pane = dynamic_cast<div_dockpane*>(div);
pane->dockable_field = i->second;
auto old_pane = pane->dockable_field->attached;
if (old_pane)
{
//old div_dockpane will be deleted
old_pane->dockable_field = nullptr;
div->display = old_pane->display;
}
pane->dockable_field->attached = pane;
if (pane->dockable_field->dockarea)
pane->dockable_field->dockarea->set_notifier(pane);
}
}
else
@ -2538,11 +2542,11 @@ namespace nana
for (auto & child : div->children)
{
check_fn(child.get());
connect_fn(child.get());
}
};
check_fn(start);
connect_fn(start);
for (auto& e : docks_to_be_closed)
{
@ -2552,6 +2556,18 @@ namespace nana
}
}
void place::implement::disconnect()
{
for (auto & fd : fields)
{
if (fd.second->attached)
{
fd.second->attached->field = nullptr;
fd.second->attached = nullptr;
}
}
}
//class place
place::place()
: impl_(new implement)
@ -2592,6 +2608,7 @@ namespace nana
void place::div(const char* s)
{
place_parts::tokenizer tknizer(s);
impl_->disconnect();
auto div = impl_->scan_div(tknizer);
try
{
@ -2816,7 +2833,8 @@ namespace nana
if (!dock_ptr->dockarea)
{
dock_ptr->dockarea.reset(new ::nana::place_parts::dockarea);
dock_ptr->dockarea->create(impl_->window_handle, dock_ptr->attached);
dock_ptr->dockarea->create(impl_->window_handle);
dock_ptr->dockarea->set_notifier(dock_ptr->attached);
dock_ptr->dockarea->move(dock_ptr->attached->field_area);
}
dock_ptr->dockarea->add_pane(factory);
@ -2838,7 +2856,8 @@ namespace nana
if (!dock_ptr->dockarea)
{
dock_ptr->dockarea.reset(new ::nana::place_parts::dockarea);
dock_ptr->dockarea->create(impl_->window_handle, dock_ptr->attached);
dock_ptr->dockarea->create(impl_->window_handle);
dock_ptr->dockarea->set_notifier(dock_ptr->attached);
dock_ptr->dockarea->move(dock_ptr->attached->field_area);
}

View File

@ -197,9 +197,12 @@ namespace nana
std::unique_ptr<widget> widget_ptr;
};
public:
void create(window parent, place_parts::dock_notifier_interface* notifier)
void set_notifier(place_parts::dock_notifier_interface* notifier)
{
notifier_ = notifier;
}
void create(window parent)
{
host_window_ = parent;
base_type::create(parent, true);
this->caption("dockarea");