create rotation job and EAPI e_border_rotation_set
[platform/core/uifw/e17.git] / src / bin / e_widget_aspect.c
1 /* TODO: support different preference modes ala edje */
2 #include "e.h"
3
4 typedef struct _E_Widget_Data E_Widget_Data;
5 struct _E_Widget_Data
6 {
7    Evas_Object *obj;
8
9    Evas_Object *child;
10    int aspect_w, aspect_h;
11    int aspect_preference;
12    double align_x, align_y;
13 };
14
15 static void
16 _e_wid_del_hook(Evas_Object *obj)
17 {
18    E_Widget_Data *wd;
19
20    wd = e_widget_data_get(obj);
21    if (!wd) return;
22
23    free(wd);
24 }
25
26 static void
27 _e_wid_reconfigure(E_Widget_Data *wd)
28 {
29    int px, py, pw, ph;
30    int cx, cy, cw, ch;
31    double ap, ad;
32
33    if (!wd->obj || !wd->child) return;
34
35    evas_object_geometry_get(wd->obj, &px, &py, &pw, &ph);
36
37    if (ph == 0)
38      {
39        evas_object_resize(wd->child, 0, 0);
40        return ;
41      }
42
43    ap = (double)pw / ph;
44    ad = (double)(wd->aspect_w) / wd->aspect_h;
45    if (ap >= ad)
46      {
47         ch = ph;
48         cw = (ch * wd->aspect_w) / wd->aspect_h;
49      }
50    else
51      {
52         cw = pw;
53         ch = (cw * wd->aspect_h) / wd->aspect_w;
54      }
55
56    cx = px + (wd->align_x * (pw - cw));
57    cy = py + (wd->align_y * (ph - ch));
58
59    evas_object_resize(wd->child, cw, ch);
60    evas_object_move(wd->child, cx, cy);
61 }
62
63 static void
64 _cb_reconfigure(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
65 {
66    E_Widget_Data *wd;
67
68    wd = data;
69    _e_wid_reconfigure(wd);
70 }
71
72 EAPI Evas_Object *
73 e_widget_aspect_add(Evas *evas, int w, int h)
74 {
75    Evas_Object *obj;
76    E_Widget_Data *wd;
77
78    obj = e_widget_add(evas);
79    wd = calloc(1, sizeof(E_Widget_Data));
80
81    wd->obj = obj;
82    e_widget_data_set(obj, wd);
83    e_widget_del_hook_set(obj, _e_wid_del_hook);
84
85    evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _cb_reconfigure, wd);
86    evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE, _cb_reconfigure, wd);
87    wd->align_x = 0.5;
88    wd->align_y = 0.5;
89    wd->aspect_w = w;
90    wd->aspect_h = h;
91    _e_wid_reconfigure(wd);
92
93    return obj;
94 }
95
96 EAPI void
97 e_widget_aspect_aspect_set(Evas_Object *obj, int w, int h)
98 {
99    E_Widget_Data *wd;
100
101    wd = e_widget_data_get(obj);
102    if (!wd) return;
103
104    wd->aspect_w = w;
105    wd->aspect_h = h;
106    _e_wid_reconfigure(wd);
107 }
108
109 EAPI void
110 e_widget_aspect_align_set(Evas_Object *obj, double align_x, double align_y)
111 {
112    E_Widget_Data *wd;
113
114    wd = e_widget_data_get(obj);
115    if (!wd) return;
116
117    wd->align_x = align_x;
118    wd->align_y = align_y;
119    _e_wid_reconfigure(wd);
120 }
121
122 EAPI void
123 e_widget_aspect_child_set(Evas_Object *obj, Evas_Object *child)
124 {
125    E_Widget_Data *wd;
126    int mw, mh;
127
128    wd = e_widget_data_get(obj);
129    if (!wd) return;
130
131    wd->child = child;
132    e_widget_size_min_get(child, &mw, &mh);
133    e_widget_size_min_set(obj, mw, mh);
134    e_widget_sub_object_add(obj, child);
135    _e_wid_reconfigure(wd);
136 }