improve re-div of a dock place
This commit is contained in:
@@ -468,6 +468,7 @@ namespace nana
|
|||||||
|
|
||||||
//connect the field/dock with div object
|
//connect the field/dock with div object
|
||||||
void connect(division* start);
|
void connect(division* start);
|
||||||
|
void disconnect();
|
||||||
}; //end struct implement
|
}; //end struct implement
|
||||||
|
|
||||||
class place::implement::field_gather
|
class place::implement::field_gather
|
||||||
@@ -2490,15 +2491,7 @@ namespace nana
|
|||||||
if (!start)
|
if (!start)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//disconnect
|
this->disconnect();
|
||||||
for (auto & fd : fields)
|
|
||||||
{
|
|
||||||
if (fd.second->attached)
|
|
||||||
{
|
|
||||||
fd.second->attached->field = nullptr;
|
|
||||||
fd.second->attached = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::map<std::string, field_dock*> docks_to_be_closed;
|
std::map<std::string, field_dock*> docks_to_be_closed;
|
||||||
//disconnect
|
//disconnect
|
||||||
@@ -2508,12 +2501,12 @@ namespace nana
|
|||||||
docks_to_be_closed[dk.first] = dk.second;
|
docks_to_be_closed[dk.first] = dk.second;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::function<void(division* div)> check_fn;
|
std::function<void(division* div)> connect_fn;
|
||||||
check_fn = [&check_fn, this, &docks_to_be_closed](division* div)
|
connect_fn = [&connect_fn, this, &docks_to_be_closed](division* div)
|
||||||
{
|
{
|
||||||
if (div->name.size())
|
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);
|
auto i = docks.find(div->name);
|
||||||
if (i != docks.end())
|
if (i != docks.end())
|
||||||
@@ -2521,7 +2514,18 @@ namespace nana
|
|||||||
docks_to_be_closed.erase(div->name);
|
docks_to_be_closed.erase(div->name);
|
||||||
auto pane = dynamic_cast<div_dockpane*>(div);
|
auto pane = dynamic_cast<div_dockpane*>(div);
|
||||||
pane->dockable_field = i->second;
|
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;
|
pane->dockable_field->attached = pane;
|
||||||
|
|
||||||
|
if (pane->dockable_field->dockarea)
|
||||||
|
pane->dockable_field->dockarea->set_notifier(pane);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -2538,11 +2542,11 @@ namespace nana
|
|||||||
|
|
||||||
for (auto & child : div->children)
|
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)
|
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
|
//class place
|
||||||
place::place()
|
place::place()
|
||||||
: impl_(new implement)
|
: impl_(new implement)
|
||||||
@@ -2592,6 +2608,7 @@ namespace nana
|
|||||||
void place::div(const char* s)
|
void place::div(const char* s)
|
||||||
{
|
{
|
||||||
place_parts::tokenizer tknizer(s);
|
place_parts::tokenizer tknizer(s);
|
||||||
|
impl_->disconnect();
|
||||||
auto div = impl_->scan_div(tknizer);
|
auto div = impl_->scan_div(tknizer);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -2816,7 +2833,8 @@ namespace nana
|
|||||||
if (!dock_ptr->dockarea)
|
if (!dock_ptr->dockarea)
|
||||||
{
|
{
|
||||||
dock_ptr->dockarea.reset(new ::nana::place_parts::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->move(dock_ptr->attached->field_area);
|
||||||
}
|
}
|
||||||
dock_ptr->dockarea->add_pane(factory);
|
dock_ptr->dockarea->add_pane(factory);
|
||||||
@@ -2838,7 +2856,8 @@ namespace nana
|
|||||||
if (!dock_ptr->dockarea)
|
if (!dock_ptr->dockarea)
|
||||||
{
|
{
|
||||||
dock_ptr->dockarea.reset(new ::nana::place_parts::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->move(dock_ptr->attached->field_area);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -197,9 +197,12 @@ namespace nana
|
|||||||
std::unique_ptr<widget> widget_ptr;
|
std::unique_ptr<widget> widget_ptr;
|
||||||
};
|
};
|
||||||
public:
|
public:
|
||||||
void create(window parent, place_parts::dock_notifier_interface* notifier)
|
void set_notifier(place_parts::dock_notifier_interface* notifier)
|
||||||
{
|
{
|
||||||
notifier_ = notifier;
|
notifier_ = notifier;
|
||||||
|
}
|
||||||
|
void create(window parent)
|
||||||
|
{
|
||||||
host_window_ = parent;
|
host_window_ = parent;
|
||||||
base_type::create(parent, true);
|
base_type::create(parent, true);
|
||||||
this->caption("dockarea");
|
this->caption("dockarea");
|
||||||
|
|||||||
Reference in New Issue
Block a user