fix tabbar not working after tab is closed. Closes T3105

This commit is contained in:
Boris Faure 2016-01-31 15:24:15 +01:00
parent fbf61bf815
commit e8c4f080ed
1 changed files with 45 additions and 41 deletions

View File

@ -831,8 +831,6 @@ _win_swallow(Term_Container *tc, Term_Container *orig,
evas_object_show(o);
new_child->parent = tc;
wn->child = new_child;
if (tc->is_focused)
new_child->focus(new_child, tc);
}
static void
@ -1253,9 +1251,6 @@ _split_swallow(Term_Container *tc, Term_Container *orig,
o = orig->get_evas_object(orig);
evas_object_hide(o);
if (orig == split->last_focus)
split->last_focus = new_child;
o = new_child->get_evas_object(new_child);
if (split->tc1 == orig)
{
@ -1272,9 +1267,6 @@ _split_swallow(Term_Container *tc, Term_Container *orig,
new_child->parent = tc;
evas_object_show(o);
evas_object_show(split->panes);
if (tc->is_focused)
new_child->focus(new_child, tc);
}
static Term *
@ -1644,6 +1636,14 @@ _tabbar_clear(Term *tm)
evas_object_del(tm->tabbar.r.box);
tm->tabbar.r.box = NULL;
}
if (tm->tab_spacer)
{
edje_object_signal_emit(tm->bg, "tabbar,off", "terminology");
edje_object_message_signal_process(tm->bg);
edje_object_part_unswallow(tm->bg, tm->tab_spacer);
evas_object_del(tm->tab_spacer);
tm->tab_spacer = NULL;
}
}
static void
@ -1693,6 +1693,10 @@ _tabbar_fill(Tabs *tabs)
solo = (Solo*)tab_item->tc;
term = solo->term;
assert(term->tabbar.l.box == NULL);
assert(term->tabbar.r.box == NULL);
assert(term->tab_spacer != NULL);
if (i > 0)
{
term->tabbar.l.box = o = elm_box_add(tabs->tc.wn->win);
@ -1719,6 +1723,9 @@ _tabbar_fill(Tabs *tabs)
{
Evas_Coord w, h;
solo = (Solo*)tab_item->tc;
_tabbar_clear(solo->term);
o = edje_object_add(evas_object_evas_get(tabs->tc.wn->win));
theme_apply(o, term->config, "terminology/tabbar_back");
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@ -1727,6 +1734,7 @@ _tabbar_fill(Tabs *tabs)
tab_item->tc->title);
edje_object_size_min_calc(o, &w, &h);
evas_object_size_hint_min_set(o, w, h);
assert(i != j);
if (j < i)
{
term->tabbar.l.tabs = eina_list_append(term->tabbar.l.tabs, o);
@ -1840,10 +1848,6 @@ _tabs_restore(Tabs *tabs)
solo = (Solo*)tabs->current->tc;
term = solo->term;
_tabbar_clear(term);
if (!term->config->notabs)
{
_tabbar_fill(tabs);
}
_tabs_refresh(tabs);
tabs->current->tc->focus(tabs->current->tc, tabs->current->tc);
@ -2123,16 +2127,10 @@ _tabs_close(Term_Container *tc, Term_Container *child)
assert (child->type == TERM_CONTAINER_TYPE_SOLO);
solo = (Solo*)child;
term = solo->term;
child->unfocus(child, tc);
_tabbar_clear(term);
edje_object_signal_emit(term->bg, "tabcount,off", "terminology");
if (term->tab_spacer)
{
edje_object_signal_emit(term->bg, "tabbar,off", "terminology");
evas_object_del(term->tab_spacer);
term->tab_spacer = NULL;
edje_object_message_signal_process(term->bg);
}
count = eina_list_count(tabs->tabs);
@ -2144,19 +2142,12 @@ _tabs_close(Term_Container *tc, Term_Container *child)
_tabbar_clear(term);
edje_object_signal_emit(term->bg, "tabcount,off", "terminology");
if (term->tab_spacer)
{
edje_object_signal_emit(term->bg, "tabbar,off", "terminology");
evas_object_del(term->tab_spacer);
term->tab_spacer = NULL;
edje_object_message_signal_process(term->bg);
}
if (tabs->selector)
_tabs_restore(tabs);
eina_stringshare_del(tc->title);
tc_parent->swallow(tc_parent, tc, next_child);
if (tc->is_focused)
next_child->focus(next_child, tc_parent);
next_child->focus(next_child, tc);
free(next_item);
free(tc);
@ -2168,9 +2159,13 @@ _tabs_close(Term_Container *tc, Term_Container *child)
{
tabs->current = next_item;
/* XXX: refresh */
tc->swallow(tc, child, next_child);
tc_parent->swallow(tc_parent, tc, tc);
if (tc->is_focused)
next_child->focus(next_child, tc);
}
else
{
next_item = tabs->current;
next_child = next_item->tc;
}
if (item->tc->selector_img)
@ -2181,9 +2176,10 @@ _tabs_close(Term_Container *tc, Term_Container *child)
evas_object_del(o);
}
free(item);
count--;
if (tc->is_focused)
next_child->focus(next_child, tc);
_tabs_refresh(tabs);
}
}
@ -2466,10 +2462,24 @@ _tabs_unfocus(Term_Container *tc, Term_Container *relative)
tabs = (Tabs*) tc;
if (tc->parent == relative)
tabs->current->tc->unfocus(tabs->current->tc, tc);
{
tabs->current->tc->unfocus(tabs->current->tc, tc);
tc->is_focused = EINA_FALSE;
}
else
tc->parent->unfocus(tc->parent, tc);
tc->is_focused = EINA_FALSE;
{
Tab_Item *tab_item;
Eina_List *l;
EINA_LIST_FOREACH(tabs->tabs, l, tab_item)
{
if (relative == tab_item->tc) {
tc->parent->unfocus(tc->parent, tc);
tc->is_focused = EINA_FALSE;
return;
}
}
}
}
static void
@ -2577,6 +2587,8 @@ _tabs_refresh(Tabs *tabs)
solo = (Solo*)tab_item->tc;
term = solo->term;
_tabbar_clear(term);
if (!term->tabcount_spacer)
{
term->tabcount_spacer = evas_object_rectangle_add(evas_object_evas_get(term->bg));
@ -2617,19 +2629,11 @@ _tabs_refresh(Tabs *tabs)
edje_object_part_drag_value_set(term->bg, "terminology.tabr", v2, 0.0);
edje_object_message_signal_process(term->bg);
}
_tabbar_clear(term);
_tabbar_fill(tabs);
}
else
{
_tabbar_clear(term);
if (term->tab_spacer)
{
edje_object_signal_emit(term->bg, "tabbar,off", "terminology");
evas_object_del(term->tab_spacer);
term->tab_spacer = NULL;
edje_object_message_signal_process(term->bg);
}
}
if (missed > 0)
edje_object_signal_emit(term->bg, "tabmissed,on", "terminology");