fix an infinit loop issue when pressing tab key if all tabstop widgets are

invisible
This commit is contained in:
Jinhao 2015-06-22 23:00:48 +08:00
parent e2cf5452d5
commit bdf928a9e8

View File

@ -1019,12 +1019,13 @@ namespace detail
} }
} }
// preconditions of get_tabstop: tabstop is not empty and at least one window is visible
window_manager::core_window_t* get_tabstop(window_manager::core_window_t* wd, bool forward) window_manager::core_window_t* get_tabstop(window_manager::core_window_t* wd, bool forward)
{ {
auto & tabs = wd->root_widget->other.attribute.root->tabstop; auto & tabs = wd->root_widget->other.attribute.root->tabstop;
if (tabs.size())
{ if (forward)
if (forward) //
{ {
if (detail::tab_type::none == wd->flags.tab) if (detail::tab_type::none == wd->flags.tab)
return (tabs.front()); return (tabs.front());
@ -1042,13 +1043,12 @@ namespace detail
return tabs.front(); return tabs.front();
} }
} }
else if (tabs.size() > 1) //at least 2 elments in tabs is required when moving perviously. else if (tabs.size() > 1) //at least 2 elments in tabs are required when moving backward.
{ {
auto i = std::find(tabs.cbegin(), tabs.cend(), wd); auto i = std::find(tabs.cbegin(), tabs.cend(), wd);
if (i != tabs.cend()) if (i != tabs.cend())
return (tabs.cbegin() == i ? tabs.back() : *(i - 1)); return (tabs.cbegin() == i ? tabs.back() : *(i - 1));
} }
}
return nullptr; return nullptr;
} }
@ -1059,18 +1059,32 @@ namespace detail
if (!impl_->wd_register.available(wd)) if (!impl_->wd_register.available(wd))
return nullptr; return nullptr;
auto & tabs = wd->root_widget->other.attribute.root->tabstop;
if (tabs.empty())
return nullptr;
bool precondition = false;
for (auto & tab_wd : tabs)
{
if (tab_wd->visible)
{
precondition = true;
break;
}
}
if (precondition)
{
auto new_stop = get_tabstop(wd, forward); auto new_stop = get_tabstop(wd, forward);
while (new_stop) while (new_stop && (wd != new_stop))
{ {
if (wd == new_stop)
break;
if (new_stop->flags.enabled && new_stop->visible) if (new_stop->flags.enabled && new_stop->visible)
return new_stop; return new_stop;
new_stop = get_tabstop(new_stop, forward); new_stop = get_tabstop(new_stop, forward);
} }
}
return nullptr; return nullptr;
} }