tab drag: have a thumbnail of the tab

This commit is contained in:
Boris Faure 2020-03-22 10:53:30 +01:00
parent 1ca9c13ace
commit 5a2e394c36
Signed by: borisfaure
GPG Key ID: 35C0410516166BE8
4 changed files with 334 additions and 11 deletions

View File

@ -31,4 +31,5 @@ collections {
#include "default/icon.edc"
#include "default/about.edc"
#include "default/fontpreview.edc"
#include "default/tab_drag_thumb.edc"
}

View File

@ -0,0 +1,287 @@
group { name: "terminology/tab_drag_thumb";
images {
image: "bg_bevel.png" COMP;
image: "bg_glint.png" COMP;
image: "pm_shadow.png" COMP;
image: "cr_glow.png" COMP;
image: "bg_led_glow.png" COMP;
image: "bg_led_base.png" COMP;
image: "bg_led.png" COMP;
image: "bg_led_strobe.png" COMP;
}
set { name: "bg_shine";
image { image: "bg_shine5.png" COMP; size: 0 0 256 120; }
image { image: "bg_shine4.png" COMP; size: 256 120 512 240; }
image { image: "bg_shine3.png" COMP; size: 512 240 1024 480; }
image { image: "bg_shine2.png" COMP; size: 1024 480 2048 960; }
image { image: "bg_shine.png" COMP; size: 2048 960 99999 99999; }
}
parts {
////////////////////////////////////////////////////////////////////
// base background and selection image
part { name: "clip"; type: RECT;
description { state: "default" 0.0;
rel1.to: "terminology.content";
rel2.to: "terminology.content";
color: 255 255 255 255;
}
}
part { name: "shadow";
mouse_events: 0;
description { state: "default" 0.0;
fixed: 1 1;
rel1.to: "terminology.content";
rel2.to: "terminology.content";
rel1.offset: -40 -40;
rel2.offset: 39 39;
image.normal: "pm_shadow.png";
image.border: 64 64 64 64;
image.border_scale_by: 1.0;
color: 255 255 255 255;
fill.smooth: 0;
}
}
part { name: "glow";
mouse_events: 0;
description { state: "default" 0.0;
rel1.to: "terminology.content";
rel2.to: "terminology.content";
rel1.offset: -4 -4;
rel2.offset: 3 3;
image {
normal: "cr_glow.png";
border: 9 9 9 9;
}
color: 51 153 255 255;
}
}
////////////////////////////////////////////////////////////////////
// swallowed terminal content + bg inside it
part { name: "base"; type: RECT;
clip_to: "clip";
description { state: "default" 0.0;
color_class: "BG";
rel1.to: "terminology.content";
rel2.to: "terminology.content";
}
}
part { name: "terminology.content"; type: SWALLOW;
clip_to: "clip";
description { state: "default" 0.0;
rel1.relative: 0.0 0.0;
rel2.relative: 1.0 1.0;
}
}
////////////////////////////////////////////////////////////////////
// fancy stuff over the top of the terminal for shading and title
part { name: "overlay";
mouse_events: 0;
description { state: "default" 0.0;
fixed: 1 1;
rel1.to: "terminology.content";
rel2.to: "terminology.content";
image.normal: "pm_overlay.png";
fill.smooth: 0;
}
}
part { name: "bevel";
mouse_events: 0;
description { state: "default" 0.0;
fixed: 1 1;
rel1.to: "terminology.content";
rel2.to: "terminology.content";
image.normal: "bg_bevel.png";
image.border: 3 3 3 3;
image.middle: 0;
fill.smooth: 0;
}
}
part { name: "terminology.title"; type: TEXT; mouse_events: 0;
effect: GLOW;
scale: 1;
description { state: "default" 0.0;
rel1.to: "terminology.content";
rel2.to: "terminology.content";
color: 255 255 255 255;
color2: 51 153 255 128;
color3: 51 153 255 20;
align: 0.5 1.0;
text { font: "Sans"; size: 10;
align: 0.5 1.0;
min: 0 1;
}
}
}
////////////////////////////////////////////////////////////////////
// fancy stuff on top
part { name: "glint";
mouse_events: 0;
clip_to: "clip";
description { state: "default" 0.0;
fixed: 1 1;
min: 79 5;
max: 79 5;
rel1 {
to: "terminology.content";
relative: 0.0 0.0;
offset: 0 0;
}
rel2 {
to: "terminology.content";
relative: 1.0 0.0;
offset: -1 0;
}
image.normal: "bg_glint.png";
}
}
part { name: "shine";
mouse_events: 0;
clip_to: "clip";
description { state: "default" 0.0;
fixed: 1 1;
rel1.to: "terminology.content";
rel2.to: "terminology.content";
image.normal: "bg_shine";
fill.smooth: 0;
align: 0.5 0.0;
aspect: (256/120) (256/120);
aspect_preference: HORIZONTAL;
}
}
////////////////////////////////////////////////////////////////////
// visual bell - spinning red siren light
part { name: "bell_glow";
mouse_events: 0;
clip_to: "clip";
description { state: "default" 0.0;
fixed: 1 1;
visible: 0;
color: 255 255 255 0;
rel1.to: "bell_base";
rel2.to: "bell_base";
min: 200 200;
fill.smooth: 0;
image.normal: "bg_led_glow.png";
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
visible: 1;
color: 255 255 255 255;
}
}
part { name: "bell_base";
mouse_events: 0;
description { state: "default" 0.0;
fixed: 1 1;
visible: 0;
color: 255 255 255 0;
min: 32 32;
max: 32 32;
rel1.to: "terminology.content";
rel2.to: "terminology.content";
align: 1.0 1.0;
image.normal: "bg_led_base.png";
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
visible: 1;
color: 255 255 255 255;
}
}
part { name: "bell";
mouse_events: 0;
description { state: "default" 0.0;
fixed: 1 1;
visible: 0;
color: 255 255 255 0;
rel1.to: "bell_base";
rel2.to: "bell_base";
image.normal: "bg_led.png";
}
description { state: "visible" 0.0;
inherit: "default" 0.0;
visible: 1;
color: 255 255 255 255;
}
}
part { name: "bell_strobe";
mouse_events: 0;
description { state: "default" 0.0;
fixed: 1 1;
visible: 0;
color: 255 255 255 0;
rel1.to: "bell";
rel2.to: "bell";
image.normal: "bg_led_strobe.png";
map {
on: 1;
smooth: 1;
rotation.center: "bell";
}
}
description { state: "spin" 0.0;
inherit: "default" 0.0;
visible: 1;
color: 255 255 255 255;
map.rotation.z: 36.0;
}
description { state: "spin_done" 0.0;
inherit: "spin" 0.0;
map.rotation.z: 720.0;
}
description { state: "spin_done2" 0.0;
inherit: "spin" 0.0;
map.rotation.z: 1440.0;
}
}
program {
signal: "bell"; source: "terminology";
action: STATE_SET "default" 0.0;
target: "bell_base";
target: "bell";
target: "bell_strobe";
target: "bell_glow";
after: "bell";
}
program { name: "bell";
action: STATE_SET "visible" 0.0;
target: "bell_base";
target: "bell_glow";
after: "bell2";
}
program { name: "bell2";
action: STATE_SET "visible" 0.0;
transition: DECELERATE 0.1;
target: "bell";
target: "bell_glow";
after: "bell3";
}
program { name: "bell3";
action: STATE_SET "spin" 0.0;
transition: LINEAR 0.1;
target: "bell_strobe";
after: "bell4.2";
}
program { name: "bell4.2";
action: STATE_SET "spin_done" 0.0;
transition: LINEAR 0.9;
target: "bell_strobe";
after: "bell4.3";
}
program { name: "bell4.3";
action: STATE_SET "spin_done2" 0.0;
transition: LINEAR 1.0;
target: "bell_strobe";
after: "bell4.4";
}
program { name: "bell4.4";
action: STATE_SET "spin_done" 0.0;
target: "bell_strobe";
after: "bell4.3";
}
}
}

View File

@ -23,6 +23,7 @@ default_deps = [
'default/icon.edc',
'default/about.edc',
'default/fontpreview.edc',
'default/tab_drag_thumb.edc',
]
mild_deps = ['mild.edc', 'default/colors.edc']
edje_to_compile = [

View File

@ -82,6 +82,7 @@ struct _Tab_Drag
Term *term_over;
Term *term;
Evas_Object *icon;
Evas_Object *img;
Evas *e;
Ecore_Timer *timer;
/* To be able to restore */
@ -650,6 +651,10 @@ _solo_bell(Term_Container *tc,
elm_layout_signal_emit(term->bg, "bell,ring", "terminology");
elm_layout_signal_emit(term->core, "bell,ring", "terminology");
}
if ((_tab_drag != NULL) && (_tab_drag->term == term))
{
elm_layout_signal_emit(_tab_drag->icon, "bell", "terminology");
}
}
if ((term->missed_bell) && (term->config->show_tabs)
&& (tc->parent->type == TERM_CONTAINER_TYPE_SPLIT))
@ -2916,6 +2921,7 @@ _split_detach(Term_Container *tc, Term_Container *solo_child)
o = solo_child->get_evas_object(solo_child);
evas_object_hide(o);
solo_child->parent = (Term_Container*) solo_child->wn;
}
static Term_Container *
@ -3678,7 +3684,6 @@ _tab_drag_rollback_tabs(void)
static void
_tab_drag_rollback(void)
{
switch (_tab_drag->parent_type)
{
case TERM_CONTAINER_TYPE_TABS:
@ -3756,6 +3761,9 @@ _tab_drag_free(void)
_tab_drag->timer = NULL;
evas_object_del(_tab_drag->icon);
_tab_drag->icon = NULL;
evas_object_del(_tab_drag->img);
_tab_drag->img = NULL;
term_unref(_tab_drag->term);
free(_tab_drag);
@ -3842,6 +3850,12 @@ _tab_drag_stop(void)
if (!term_at_coords)
goto end;
evas_object_image_source_visible_set(_tab_drag->img, EINA_TRUE);
elm_layout_content_unset(_tab_drag->icon, "terminology.content");
elm_layout_content_set(term->bg, "terminology.content", term->core);
term->unswallowed = EINA_FALSE;
evas_object_show(term->core);
if (term_at_coords == term)
{
Evas_Coord x = 0, y = 0, w = 0, h = 0, off_x = 0, off_y = 0;
@ -4000,10 +4014,12 @@ static Eina_Bool
_tab_drag_start(void *data EINA_UNUSED)
{
/* Start icons animation before actually drag-starts */
Evas_Coord x, y, w, h, off_x, off_y;
Evas_Coord x, y, w, h, off_x, off_y, ch_w, ch_h, core_w, core_h;
Term *term = _tab_drag->term;
Evas_Object *o = elm_layout_add(term->bg);
Evas_Object *img;
Term_Container *tc = term->container;
float ratio;
if (!term->container)
{
@ -4011,27 +4027,44 @@ _tab_drag_start(void *data EINA_UNUSED)
return ECORE_CALLBACK_CANCEL;
}
/* TODO: Have it's own group and put content inside */
theme_apply_elm(o, term->config, "terminology/tabbar_back");
elm_layout_text_set(o, "terminology.title",
term->container->title);
elm_layout_signal_emit(o, "style,active", "terminology");
for_each_term_do(_tab_drag->term->wn, &_term_hdrag_off, NULL);
_tab_drag->icon = o;
theme_apply_elm(o, term->config, "terminology/tab_drag_thumb");
elm_layout_text_set(o, "terminology.title",
term->container->title);
elm_layout_content_unset(term->bg, "terminology.content");
term->unswallowed = EINA_TRUE;
img = evas_object_image_filled_add(evas_object_evas_get(term->core));
evas_object_lower(term->core);
evas_object_move(term->core, -9999, -9999);
evas_object_show(term->core);
evas_object_clip_unset(term->core);
evas_object_image_source_set(img, term->core);
evas_object_geometry_get(term->core, NULL, NULL, &core_w, &core_h);
evas_object_resize(img, core_w, core_h);
_tab_drag->img = img;
elm_layout_content_set(o, "terminology.content", img);
evas_object_size_hint_min_get(term->core, &ch_w, &ch_h);
edje_object_part_geometry_get(term->bg_edj, "tabmiddle",
&x, &y, &w, &h);
&x, &y, NULL, NULL);
evas_object_geometry_get(term->bg_edj, &off_x, &off_y, NULL, NULL);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
w = ch_w * 10;
h = ch_h * 5;
ratio = (float) core_w / (float) core_h;
if (h * ratio > w)
h = w / ratio;
else
w = h * ratio;
evas_object_resize(o, w, h);
evas_object_move(o, x + off_x, y + off_y);
evas_object_raise(o);
evas_object_show(o);
_tab_drag->icon = o;
_tab_drag_save_state(tc);
tc->parent->detach(tc->parent, tc);
assert(term->tab_item == NULL);
@ -5206,6 +5239,7 @@ _tabs_detach(Term_Container *tc, Term_Container *solo_child)
o = solo_child->get_evas_object(solo_child);
evas_object_hide(o);
solo_child->parent = (Term_Container*) solo_child->wn;
}
static Term_Container *