diff --git a/src/bin/mainview/edi_mainview_panel.c b/src/bin/mainview/edi_mainview_panel.c index 9e05f2f..964cd36 100644 --- a/src/bin/mainview/edi_mainview_panel.c +++ b/src/bin/mainview/edi_mainview_panel.c @@ -494,10 +494,156 @@ _font_width_get(Evas_Object *parent, const char *text) return w; } +// TODO: Allow tab moving between panels. + +typedef struct { + Evas_Object *toolbar; + Evas_Object *tab; + Evas_Object *btn; + char *path; +} Tab_Drag; + +static char *_tab_drag_path = NULL; + +static void +_swap(Edi_Mainview_Item *a, Edi_Mainview_Item *b) +{ + const void *tmp = a->path; + + a->path = b->path; + b->path = tmp; + + tmp = a->editortype; + a->editortype = b->editortype; + b->editortype = tmp; + + tmp = a->mimetype; + a->mimetype = b->mimetype; + b->mimetype = tmp; +} + +static void +_tab_swap(const char *old, const char *new) +{ + Edi_Mainview_Panel *panel, *panel_selected; + Edi_Mainview_Item *first, *second, *item; + Eina_List *l; + int count, i; + + first = second = NULL; + + if (!strcmp(old, new)) return; + + count = edi_mainview_panel_count(); + + for (i = 0; i < count; i++) + { + panel = edi_mainview_panel_by_index(i); + EINA_LIST_FOREACH(panel->items, l, item) + { + if (!strcmp(item->path, old)) + { + first = item; + } + else if (!strcmp(item->path, new)) + { + second = item; + panel_selected = panel; + } + + if (first && second) break; + } + } + + if (!first || !second) return; + + _swap(first, second); + + for (i = 0; i < count; i++) + { + panel = edi_mainview_panel_by_index(i); + edi_mainview_panel_refresh_all(panel); + } + + if (panel_selected) + edi_mainview_panel_item_select_path(panel_selected, new); +} + +static void +_tab_move_display_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + Evas_Event_Mouse_Move *ev; + Tab_Drag *drag = data; + + if (!drag) return; + + ev = event_info; + + evas_object_move(drag->btn, ev->cur.canvas.x, ev->cur.canvas.y); + evas_object_show(drag->btn); +} + +static void +_tab_move_done_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Tab_Drag *drag = data; + if (!drag) return; + + evas_object_event_callback_del(drag->tab, EVAS_CALLBACK_MOUSE_UP, _tab_move_done_cb); + evas_object_event_callback_del(drag->toolbar, EVAS_CALLBACK_MOUSE_MOVE, _tab_move_display_cb); + evas_object_del(drag->btn); + + if (_tab_drag_path) + { + free(_tab_drag_path); + _tab_drag_path = NULL; + } +} + +static void +_tab_move_begin_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + Evas_Event_Mouse_Down *ev; + Evas_Object *btn; + Tab_Drag *drag = data; + + if (!drag || _tab_drag_path) return; + + ev = event_info; + + drag->btn = btn = elm_button_add(edi_main_win_get()); + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(btn, ecore_file_file_get(drag->path)); + evas_object_show(btn); + evas_object_move(btn, ev->canvas.x, ev->canvas.y); + _tab_drag_path = strdup(drag->path); + + evas_object_event_callback_add(drag->toolbar, EVAS_CALLBACK_MOUSE_MOVE, _tab_move_display_cb, drag); + evas_object_event_callback_add(drag->tab, EVAS_CALLBACK_MOUSE_UP, _tab_move_done_cb, drag); +} + +static void +_tab_mouse_in_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Tab_Drag *drag = data; + + if (!drag || !drag->path || !_tab_drag_path) return; + + _tab_swap(drag->path, _tab_drag_path); + + free(drag->path); + free(drag); +} + static void _edi_mainview_panel_item_tab_add(Edi_Mainview_Panel *panel, Edi_Path_Options *options, const char *mime) { - Evas_Object *content, *tab;//, *icon; + Evas_Object *content, *tab; Edi_Mainview_Item *item; Edi_Editor *editor; Elm_Code *code; @@ -538,11 +684,18 @@ _edi_mainview_panel_item_tab_add(Edi_Mainview_Panel *panel, Edi_Path_Options *op elm_layout_theme_set(tab, "multibuttonentry", "btn", "default"); elm_object_part_text_set(tab, "elm.btn.text", eina_slstr_printf("