forked from enlightenment/enventor
162 lines
3.9 KiB
C
162 lines
3.9 KiB
C
#include <Elementary.h>
|
|
#include "common.h"
|
|
|
|
typedef enum
|
|
{
|
|
PANES_FULL_VIEW_LEFT,
|
|
PANES_FULL_VIEW_RIGHT,
|
|
PANES_SPLIT_VIEW
|
|
} Panes_State;
|
|
|
|
const char *PANES_DATA = "_panes_data";
|
|
|
|
typedef struct _panes_data
|
|
{
|
|
Evas_Object *panes;
|
|
Panes_State state;
|
|
|
|
double origin;
|
|
double delta;
|
|
} panes_data;
|
|
|
|
static double panes_last_right_size1 = 0.5; //when down the panes bar
|
|
static double panes_last_right_size2 = 0.5; //when up the panes bar
|
|
static panes_data *g_pd = NULL;
|
|
|
|
static void
|
|
transit_op(void *data, Elm_Transit *transit EINA_UNUSED, double progress)
|
|
{
|
|
panes_data *pd = data;
|
|
elm_panes_content_right_size_set(pd->panes,
|
|
pd->origin + (pd->delta * progress));
|
|
}
|
|
|
|
static void
|
|
press_cb(void *data EINA_UNUSED, Evas_Object *obj,
|
|
void *event_info EINA_UNUSED)
|
|
{
|
|
panes_last_right_size1 = elm_panes_content_right_size_get(obj);
|
|
}
|
|
|
|
static void
|
|
unpress_cb(void *data EINA_UNUSED, Evas_Object *obj,
|
|
void *event_info EINA_UNUSED)
|
|
{
|
|
double right_size = elm_panes_content_right_size_get(obj);
|
|
if (panes_last_right_size1 != right_size)
|
|
panes_last_right_size2 = right_size;
|
|
}
|
|
|
|
static void
|
|
panes_full_view_cancel(panes_data *pd)
|
|
{
|
|
const double TRANSIT_TIME = 0.25;
|
|
|
|
pd->origin = elm_panes_content_right_size_get(pd->panes);
|
|
pd->delta = panes_last_right_size2 - pd->origin;
|
|
|
|
Elm_Transit *transit = elm_transit_add();
|
|
elm_transit_effect_add(transit, transit_op, pd, NULL);
|
|
elm_transit_tween_mode_set(transit, ELM_TRANSIT_TWEEN_MODE_DECELERATE);
|
|
elm_transit_duration_set(transit, TRANSIT_TIME);
|
|
elm_transit_go(transit);
|
|
|
|
pd->state = PANES_SPLIT_VIEW;
|
|
}
|
|
|
|
void
|
|
panes_full_view_right()
|
|
{
|
|
const double TRANSIT_TIME = 0.25;
|
|
|
|
panes_data *pd = g_pd;
|
|
|
|
//Revert state if the current state is full view left already.
|
|
if (pd->state == PANES_FULL_VIEW_RIGHT)
|
|
{
|
|
panes_full_view_cancel(pd);
|
|
return;
|
|
}
|
|
|
|
double origin = elm_panes_content_right_size_get(pd->panes);
|
|
if (origin == 0.0) return;
|
|
|
|
pd->origin = origin;
|
|
pd->delta = 0.0 - pd->origin;
|
|
|
|
Elm_Transit *transit = elm_transit_add();
|
|
elm_transit_effect_add(transit, transit_op, pd, NULL);
|
|
elm_transit_tween_mode_set(transit, ELM_TRANSIT_TWEEN_MODE_DECELERATE);
|
|
elm_transit_duration_set(transit, TRANSIT_TIME);
|
|
elm_transit_go(transit);
|
|
|
|
pd->state = PANES_FULL_VIEW_RIGHT;
|
|
}
|
|
|
|
void
|
|
panes_full_view_left()
|
|
{
|
|
const double TRANSIT_TIME = 0.25;
|
|
|
|
panes_data *pd = g_pd;
|
|
|
|
//Revert state if the current state is full view left already.
|
|
if (pd->state == PANES_FULL_VIEW_LEFT)
|
|
{
|
|
panes_full_view_cancel(pd);
|
|
return;
|
|
}
|
|
|
|
double origin = elm_panes_content_right_size_get(pd->panes);
|
|
if (origin == 1.0) return;
|
|
|
|
pd->origin = origin;
|
|
pd->delta = 1.0 - pd->origin;
|
|
|
|
Elm_Transit *transit = elm_transit_add();
|
|
elm_transit_effect_add(transit, transit_op, pd, NULL);
|
|
elm_transit_tween_mode_set(transit, ELM_TRANSIT_TWEEN_MODE_DECELERATE);
|
|
elm_transit_duration_set(transit, TRANSIT_TIME);
|
|
elm_transit_go(transit);
|
|
|
|
pd->state = PANES_FULL_VIEW_LEFT;
|
|
|
|
}
|
|
|
|
void
|
|
panes_content_set(const char *part, Evas_Object *content)
|
|
{
|
|
panes_data *pd = g_pd;
|
|
elm_object_part_content_set(pd->panes, part, content);
|
|
}
|
|
|
|
void
|
|
panes_term()
|
|
{
|
|
panes_data *pd = g_pd;
|
|
evas_object_del(pd->panes);
|
|
free(pd);
|
|
}
|
|
|
|
Evas_Object *
|
|
panes_init(Evas_Object *parent)
|
|
{
|
|
panes_data *pd = malloc(sizeof(panes_data));
|
|
g_pd = pd;
|
|
|
|
//Panes
|
|
Evas_Object *panes = elm_panes_add(parent);
|
|
elm_object_style_set(panes, elm_app_name_get());
|
|
evas_object_size_hint_weight_set(panes, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
|
evas_object_smart_callback_add(panes, "press",
|
|
press_cb, NULL);
|
|
evas_object_smart_callback_add(panes, "unpress",
|
|
unpress_cb, NULL);
|
|
pd->panes = panes;
|
|
pd->state = PANES_SPLIT_VIEW;
|
|
|
|
evas_object_data_set(panes, PANES_DATA, pd);
|
|
|
|
return panes;
|
|
}
|