win: rollback splitted term on tab drag cancellation
This commit is contained in:
parent
c9f7dbd38f
commit
9a6ff3c16c
|
@ -20,7 +20,7 @@ struct _Sizeinfo
|
||||||
|
|
||||||
typedef enum _Term_Container_Type
|
typedef enum _Term_Container_Type
|
||||||
{
|
{
|
||||||
TERM_CONTAINER_TYPE_UNKNOWN,
|
TERM_CONTAINER_TYPE_UNKNOWN = 0,
|
||||||
TERM_CONTAINER_TYPE_SOLO,
|
TERM_CONTAINER_TYPE_SOLO,
|
||||||
TERM_CONTAINER_TYPE_SPLIT,
|
TERM_CONTAINER_TYPE_SPLIT,
|
||||||
TERM_CONTAINER_TYPE_TABS,
|
TERM_CONTAINER_TYPE_TABS,
|
||||||
|
|
171
src/bin/win.c
171
src/bin/win.c
|
@ -84,6 +84,19 @@ struct _Tab_Drag
|
||||||
Evas_Object *icon;
|
Evas_Object *icon;
|
||||||
Evas *e;
|
Evas *e;
|
||||||
Ecore_Timer *timer;
|
Ecore_Timer *timer;
|
||||||
|
/* To be able to restore */
|
||||||
|
Term_Container_Type parent_type;
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
unsigned int previous_position;
|
||||||
|
Term_Container *tabs_child;
|
||||||
|
};
|
||||||
|
struct {
|
||||||
|
Term_Container *other;
|
||||||
|
Eina_Bool is_horizontal;
|
||||||
|
Eina_Bool is_first_child;
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _Tabbar
|
struct _Tabbar
|
||||||
|
@ -1224,9 +1237,10 @@ _win_swallow(Term_Container *tc, Term_Container *orig,
|
||||||
o = new_child->get_evas_object(new_child);
|
o = new_child->get_evas_object(new_child);
|
||||||
elm_layout_content_set(wn->base, "terminology.content", o);
|
elm_layout_content_set(wn->base, "terminology.content", o);
|
||||||
|
|
||||||
if ((new_child->type == TERM_CONTAINER_TYPE_SOLO
|
if ((new_child->type == TERM_CONTAINER_TYPE_SOLO)
|
||||||
&& (wn->config->show_tabs)))
|
&& (wn->config->show_tabs))
|
||||||
{
|
{
|
||||||
|
/* TODO: boris show tab tab_drag */
|
||||||
_solo_title_hide(new_child);
|
_solo_title_hide(new_child);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1413,9 +1427,11 @@ _win_split(Term_Container *tc, Term_Container *child,
|
||||||
_solo_title_show(tc_solo_new);
|
_solo_title_show(tc_solo_new);
|
||||||
}
|
}
|
||||||
|
|
||||||
tc_split->focus(tc_split, tc_solo_new);
|
child->unfocus(child, tc_split);
|
||||||
tc_split->is_focused = tc->is_focused;
|
|
||||||
tc->swallow(tc, NULL, tc_split);
|
tc->swallow(tc, NULL, tc_split);
|
||||||
|
tc_split->is_focused = EINA_TRUE;
|
||||||
|
tc_solo_new->focus(tc_solo_new, tc_split);
|
||||||
|
tc_split->focus(tc_split, tc_solo_new);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2468,6 +2484,12 @@ _split_swallow(Term_Container *tc, Term_Container *orig,
|
||||||
|
|
||||||
assert (orig && (orig == split->tc1 || orig == split->tc2));
|
assert (orig && (orig == split->tc1 || orig == split->tc2));
|
||||||
|
|
||||||
|
if ((_tab_drag) && (_tab_drag->parent_type == TERM_CONTAINER_TYPE_SPLIT) &&
|
||||||
|
(_tab_drag->other == orig))
|
||||||
|
{
|
||||||
|
_tab_drag->other = new_child;
|
||||||
|
}
|
||||||
|
|
||||||
if (split->last_focus == orig)
|
if (split->last_focus == orig)
|
||||||
split->last_focus = new_child;
|
split->last_focus = new_child;
|
||||||
|
|
||||||
|
@ -2540,9 +2562,16 @@ _split_close(Term_Container *tc, Term_Container *child)
|
||||||
|
|
||||||
assert (tc->type == TERM_CONTAINER_TYPE_SPLIT);
|
assert (tc->type == TERM_CONTAINER_TYPE_SPLIT);
|
||||||
split = (Split*) tc;
|
split = (Split*) tc;
|
||||||
|
assert ((child == split->tc1) || (child == split->tc2));
|
||||||
|
|
||||||
DBG("close");
|
DBG("close");
|
||||||
|
|
||||||
|
if ((_tab_drag) && (_tab_drag->parent_type == TERM_CONTAINER_TYPE_SPLIT) &&
|
||||||
|
(_tab_drag->other == child))
|
||||||
|
{
|
||||||
|
_tab_drag->other = tc->parent;
|
||||||
|
}
|
||||||
|
|
||||||
top = elm_object_part_content_unset(split->panes, PANES_TOP);
|
top = elm_object_part_content_unset(split->panes, PANES_TOP);
|
||||||
bottom = elm_object_part_content_unset(split->panes, PANES_BOTTOM);
|
bottom = elm_object_part_content_unset(split->panes, PANES_BOTTOM);
|
||||||
evas_object_hide(top);
|
evas_object_hide(top);
|
||||||
|
@ -2786,6 +2815,7 @@ _split_detach(Term_Container *tc, Term_Container *solo_child)
|
||||||
assert (solo_child->type == TERM_CONTAINER_TYPE_SOLO);
|
assert (solo_child->type == TERM_CONTAINER_TYPE_SOLO);
|
||||||
|
|
||||||
_split_close(tc, solo_child);
|
_split_close(tc, solo_child);
|
||||||
|
solo_child->is_focused = EINA_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Term_Container *
|
static Term_Container *
|
||||||
|
@ -2852,6 +2882,7 @@ _split_new(Term_Container *tc1, Term_Container *tc2,
|
||||||
elm_object_part_content_set(o, PANES_BOTTOM,
|
elm_object_part_content_set(o, PANES_BOTTOM,
|
||||||
tc2->get_evas_object(tc2));
|
tc2->get_evas_object(tc2));
|
||||||
|
|
||||||
|
tc->is_focused = tc1->is_focused | tc2->is_focused;
|
||||||
return tc;
|
return tc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3116,6 +3147,114 @@ _tab_drag_disable_anim_over(void)
|
||||||
"hdrag,off", "terminology");
|
"hdrag,off", "terminology");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_tab_drag_rollback_split(void)
|
||||||
|
{
|
||||||
|
ERR("rollback split");
|
||||||
|
Eina_Bool is_horizontal = _tab_drag->is_horizontal;
|
||||||
|
Term_Container *tc_split = NULL;
|
||||||
|
Term_Container *child1 = NULL, *child2 = NULL;
|
||||||
|
Term_Container *other = _tab_drag->other;
|
||||||
|
Term_Container *parent = NULL;
|
||||||
|
Win *wn = _tab_drag->term->wn;
|
||||||
|
Term_Container *tc_win = (Term_Container*)wn;
|
||||||
|
Term_Container *tc = _tab_drag->term->container;
|
||||||
|
|
||||||
|
if (!_tab_drag->other)
|
||||||
|
{
|
||||||
|
other = wn->child;
|
||||||
|
}
|
||||||
|
parent = other->parent;
|
||||||
|
|
||||||
|
if (_tab_drag->is_first_child)
|
||||||
|
{
|
||||||
|
child1 = tc;
|
||||||
|
child2 = other;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
child1 = other;
|
||||||
|
child2 = tc;
|
||||||
|
}
|
||||||
|
|
||||||
|
tc_split = _split_new(child1, child2, is_horizontal);
|
||||||
|
parent->swallow(parent, other, tc_split);
|
||||||
|
tc_win->unfocus(tc_win, NULL);
|
||||||
|
tc->focus(tc, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_tab_drag_rollback(void)
|
||||||
|
{
|
||||||
|
ERR("rollback");
|
||||||
|
/* TODO: boris */
|
||||||
|
|
||||||
|
switch (_tab_drag->parent_type)
|
||||||
|
{
|
||||||
|
case TERM_CONTAINER_TYPE_TABS:
|
||||||
|
ERR("rollback tabs");
|
||||||
|
abort();
|
||||||
|
break;
|
||||||
|
case TERM_CONTAINER_TYPE_SPLIT:
|
||||||
|
_tab_drag_rollback_split();
|
||||||
|
break;
|
||||||
|
case TERM_CONTAINER_TYPE_WIN:
|
||||||
|
ERR("rollback win");
|
||||||
|
abort();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ERR("invalid parent type:%d", _tab_drag->parent_type);
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_tab_drag_save_state(Term_Container *tc)
|
||||||
|
{
|
||||||
|
assert(_tab_drag);
|
||||||
|
|
||||||
|
_tab_drag->parent_type = tc->parent->type;
|
||||||
|
switch (_tab_drag->parent_type)
|
||||||
|
{
|
||||||
|
case TERM_CONTAINER_TYPE_TABS:
|
||||||
|
{
|
||||||
|
unsigned int position = 0;
|
||||||
|
Tabs *tabs;
|
||||||
|
Eina_List *l;
|
||||||
|
Tab_Item *tab_item;
|
||||||
|
/* TODO boris
|
||||||
|
_tab_drag->parent_type = _tab_drag->parent_orig->type;
|
||||||
|
*/
|
||||||
|
|
||||||
|
tabs = (Tabs*) tc->parent;
|
||||||
|
EINA_LIST_FOREACH(tabs->tabs, l, tab_item)
|
||||||
|
{
|
||||||
|
if (tab_item->tc == tc)
|
||||||
|
break;
|
||||||
|
position++;
|
||||||
|
}
|
||||||
|
_tab_drag->previous_position = position;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TERM_CONTAINER_TYPE_SPLIT:
|
||||||
|
{
|
||||||
|
Split *split;
|
||||||
|
|
||||||
|
split = (Split*)tc->parent;
|
||||||
|
_tab_drag->is_horizontal = split->is_horizontal;
|
||||||
|
if ((_tab_drag->is_first_child = (split->tc1 == tc)))
|
||||||
|
_tab_drag->other = split->tc2;
|
||||||
|
else
|
||||||
|
_tab_drag->other = split->tc1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ERR("invalid parent type:%d", tc->parent->type);
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_tab_drag_free(void)
|
_tab_drag_free(void)
|
||||||
|
@ -3123,6 +3262,9 @@ _tab_drag_free(void)
|
||||||
if (!_tab_drag)
|
if (!_tab_drag)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (_tab_drag->parent_type != TERM_CONTAINER_TYPE_UNKNOWN)
|
||||||
|
_tab_drag_rollback();
|
||||||
|
|
||||||
_tab_drag_disable_anim_over();
|
_tab_drag_disable_anim_over();
|
||||||
for_each_term_do(_tab_drag->term->wn, &_term_hdrag_on, NULL);
|
for_each_term_do(_tab_drag->term->wn, &_term_hdrag_on, NULL);
|
||||||
|
|
||||||
|
@ -3229,6 +3371,13 @@ _term_on_horizontal_drag(void *data,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_tab_drag_reparented(void)
|
||||||
|
{
|
||||||
|
assert(_tab_drag);
|
||||||
|
_tab_drag->parent_type = TERM_CONTAINER_TYPE_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_tab_drag_reinsert(Term *term, double mid)
|
_tab_drag_reinsert(Term *term, double mid)
|
||||||
{
|
{
|
||||||
|
@ -3307,7 +3456,6 @@ static void
|
||||||
_tab_reorg(Term *term, Term *to_term, Evas_Coord mx, Evas_Coord my)
|
_tab_reorg(Term *term, Term *to_term, Evas_Coord mx, Evas_Coord my)
|
||||||
{
|
{
|
||||||
Term_Container *tc_orig = term->container;
|
Term_Container *tc_orig = term->container;
|
||||||
Term_Container *tc_orig_parent = tc_orig->parent;
|
|
||||||
Term_Container *to_tc = to_term->container;
|
Term_Container *to_tc = to_term->container;
|
||||||
|
|
||||||
assert(tc_orig->type == TERM_CONTAINER_TYPE_SOLO);
|
assert(tc_orig->type == TERM_CONTAINER_TYPE_SOLO);
|
||||||
|
@ -3329,16 +3477,16 @@ _tab_reorg(Term *term, Term *to_term, Evas_Coord mx, Evas_Coord my)
|
||||||
|
|
||||||
mid = (double)(mx - x) / (double)w;
|
mid = (double)(mx - x) / (double)w;
|
||||||
|
|
||||||
tc_orig_parent->detach(tc_orig_parent, tc_orig);
|
|
||||||
_solo_attach(to_tc, tc_orig);
|
_solo_attach(to_tc, tc_orig);
|
||||||
|
|
||||||
/* reinsert at correct place */
|
/* reinsert at correct place */
|
||||||
_tab_drag_reinsert(term, mid);
|
_tab_drag_reinsert(term, mid);
|
||||||
|
_tab_drag_reparented();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
tc_orig_parent->detach(tc_orig_parent, tc_orig);
|
|
||||||
to_tc->split_direction(to_tc, to_tc, tc_orig, _tab_drag->split_direction);
|
to_tc->split_direction(to_tc, to_tc, tc_orig, _tab_drag->split_direction);
|
||||||
|
_tab_drag_reparented();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -3377,6 +3525,7 @@ _tab_drag_stop(void)
|
||||||
|
|
||||||
mid = (double)(mx - x) / (double)w;
|
mid = (double)(mx - x) / (double)w;
|
||||||
_tab_drag_reinsert(term, mid);
|
_tab_drag_reinsert(term, mid);
|
||||||
|
_tab_drag_reparented();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -3521,6 +3670,7 @@ _tab_drag_start(void *data EINA_UNUSED)
|
||||||
Evas_Coord x, y, w, h, off_x, off_y;
|
Evas_Coord x, y, w, h, off_x, off_y;
|
||||||
Term *term = _tab_drag->term;
|
Term *term = _tab_drag->term;
|
||||||
Evas_Object *o = elm_layout_add(term->bg);
|
Evas_Object *o = elm_layout_add(term->bg);
|
||||||
|
Term_Container *tc = term->container;
|
||||||
|
|
||||||
if (!term->container)
|
if (!term->container)
|
||||||
{
|
{
|
||||||
|
@ -3528,6 +3678,7 @@ _tab_drag_start(void *data EINA_UNUSED)
|
||||||
return ECORE_CALLBACK_CANCEL;
|
return ECORE_CALLBACK_CANCEL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* TODO: Have it's own group and put content inside */
|
||||||
theme_apply_elm(o, term->config, "terminology/tabbar_back");
|
theme_apply_elm(o, term->config, "terminology/tabbar_back");
|
||||||
elm_layout_text_set(o, "terminology.title",
|
elm_layout_text_set(o, "terminology.title",
|
||||||
term->container->title);
|
term->container->title);
|
||||||
|
@ -3547,6 +3698,9 @@ _tab_drag_start(void *data EINA_UNUSED)
|
||||||
|
|
||||||
_tab_drag->icon = o;
|
_tab_drag->icon = o;
|
||||||
|
|
||||||
|
_tab_drag_save_state(tc);
|
||||||
|
tc->parent->detach(tc->parent, tc);
|
||||||
|
|
||||||
_tab_drag->timer = NULL;
|
_tab_drag->timer = NULL;
|
||||||
return ECORE_CALLBACK_CANCEL;
|
return ECORE_CALLBACK_CANCEL;
|
||||||
}
|
}
|
||||||
|
@ -4808,6 +4962,7 @@ _tabs_detach(Term_Container *tc, Term_Container *solo_child)
|
||||||
assert (solo_child->type == TERM_CONTAINER_TYPE_SOLO);
|
assert (solo_child->type == TERM_CONTAINER_TYPE_SOLO);
|
||||||
|
|
||||||
_tabs_close(tc, solo_child);
|
_tabs_close(tc, solo_child);
|
||||||
|
solo_child->is_focused = EINA_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Term_Container *
|
static Term_Container *
|
||||||
|
@ -6910,8 +7065,6 @@ term_new(Win *wn, Config *config, const char *cmd,
|
||||||
|
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static Eina_Bool
|
static Eina_Bool
|
||||||
_font_size_set(Term *term, void *data)
|
_font_size_set(Term *term, void *data)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue