cxx: Added examples and tutorial for C++ binding
[platform/upstream/elementary.git] / src / examples / box_cxx_example_02.cc
1 //Compile with:
2 //gcc -g box_example_02.c -o box_example_02 `pkg-config --cflags --libs elementary`
3
4 #include <Elementary.hh>
5 #include <Eina.hh>
6
7 #include <deque>
8 #include <iostream>
9
10 struct Transitions_Data
11 {
12    efl::eo::wref<elm::box> box;
13    std::deque<Evas_Object_Box_Layout> transitions;
14    Evas_Object_Box_Layout last_layout;
15 };
16
17 static void
18 _test_box_transition_change(void *data)
19 {
20    Transitions_Data *tdata = static_cast<Transitions_Data*>(data);
21    Elm_Box_Transition *layout_data;
22    Evas_Object_Box_Layout next_layout;
23
24    assert (!!data);
25    assert (!tdata->transitions.empty());
26
27    if(efl::eina::optional<elm::box> box = tdata->box.lock())
28      {
29         next_layout = tdata->transitions.front();
30         layout_data = elm_box_transition_new(2.0, tdata->transitions.back(),
31                                              nullptr, nullptr, next_layout, nullptr, nullptr,
32                                              _test_box_transition_change, tdata);
33         box->layout_set(elm_box_layout_transition, layout_data,
34                         elm_box_transition_free);
35         tdata->last_layout = next_layout;
36
37         tdata->transitions.push_back(tdata->transitions[0]);
38         tdata->transitions.pop_front();
39      }
40 }
41
42 EAPI_MAIN int
43 elm_main(int argc, char *argv[])
44 {
45    elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_HIDDEN);
46
47    Transitions_Data tdata;
48
49    ::elm::win_standard win;
50    win.title_set("Box Transition");
51    win.autohide_set(true);
52
53    elm::box bigbox ( efl::eo::parent = win );
54    bigbox.size_hint_weight_set(EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
55    win.resize_object_add(bigbox);
56    bigbox.visible_set(true);
57
58    elm::box buttons ( efl::eo::parent = win );
59    buttons.horizontal_set(EINA_TRUE);
60    bigbox.pack_end(buttons);
61    buttons.visible_set(true);
62
63    elm::button add ( efl::eo::parent = win );
64    add.text_set("elm.text", "Add");
65    buttons.pack_end(add);
66    add.visible_set(true);
67    add.callback_clicked_add
68      (std::bind([&tdata]
69       {
70          if(efl::eina::optional<elm::box> box = tdata.box.lock())
71          {
72             elm::button btn ( efl::eo::parent = *box );
73             btn.text_set(nullptr, "I do nothing");
74             box->pack_end(btn);
75             btn.visible_set(true);
76          }
77       }));
78
79    elm::button clear ( efl::eo::parent = win );
80    clear.text_set("elm.text", "Clear");
81    buttons.pack_end(clear);
82    clear.visible_set(true);
83    clear.callback_clicked_add(std::bind([&tdata] { tdata.box.lock()->clear(); }));
84
85    elm::box dynamic ( efl::eo::parent = win );
86    dynamic.size_hint_weight_set(EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
87    dynamic.size_hint_align_set(EVAS_HINT_FILL, EVAS_HINT_FILL);
88    bigbox.pack_end(dynamic);
89    dynamic.visible_set(true);
90
91    auto unpack = std::bind([&tdata] (evas::clickable_interface obj)
92      {
93         elm::button btn = efl::eo::downcast<elm::button>(obj);
94         tdata.box.lock()->unpack(btn);
95         btn.position_set(0, 50);
96         btn.object_smart::color_set(128, 64, 0, 128);
97      }, std::placeholders::_1)
98    ;
99
100    elm::button bt1 ( efl::eo::parent = win );
101    bt1.text_set("elm.text", "Button 1");
102    bt1.callback_clicked_add(unpack);
103    bt1.size_hint_weight_set(EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
104    bt1.size_hint_align_set(EVAS_HINT_FILL, EVAS_HINT_FILL);
105    dynamic.pack_end(bt1);
106    bt1.visible_set(true);
107
108    elm::button bt2 ( efl::eo::parent = win );
109    bt2.text_set("elm.text", "Button 2");
110    bt2.size_hint_weight_set(EVAS_HINT_EXPAND, 0.0);
111    bt2.size_hint_align_set(1.0, 0.5);
112    bt2.callback_clicked_add(unpack);
113    dynamic.pack_end(bt2);
114    bt2.visible_set(true);
115
116    elm::button bt3 ( efl::eo::parent = win );
117    bt3.text_set("elm.text", "Button 3");
118    bt3.callback_clicked_add(unpack);
119    dynamic.pack_end(bt3);
120    bt3.visible_set(true);
121
122    tdata.box = dynamic;
123    tdata.last_layout = evas_object_box_layout_horizontal;
124    tdata.transitions.push_back(evas_object_box_layout_vertical);
125    tdata.transitions.push_back(evas_object_box_layout_horizontal);
126    tdata.transitions.push_back(evas_object_box_layout_stack);
127    tdata.transitions.push_back(evas_object_box_layout_homogeneous_vertical);
128    tdata.transitions.push_back(evas_object_box_layout_homogeneous_horizontal);
129    tdata.transitions.push_back(evas_object_box_layout_flow_vertical);
130    tdata.transitions.push_back(evas_object_box_layout_flow_horizontal);
131    tdata.transitions.push_back(evas_object_box_layout_stack);
132
133    dynamic.layout_set(evas_object_box_layout_horizontal, nullptr, nullptr);
134    _test_box_transition_change(&tdata);
135
136    win.size_set(300, 320);
137    win.visible_set(true);
138
139    elm_run();
140    return 0;
141 }
142 ELM_MAIN()