diff --git a/legacy/elementary/data/themes/bubble_1.png b/legacy/elementary/data/themes/bubble_1.png
new file mode 100644
index 0000000000..fd6d00c4b8
Binary files /dev/null and b/legacy/elementary/data/themes/bubble_1.png differ
diff --git a/legacy/elementary/data/themes/bubble_2.png b/legacy/elementary/data/themes/bubble_2.png
new file mode 100644
index 0000000000..6e1e847a06
Binary files /dev/null and b/legacy/elementary/data/themes/bubble_2.png differ
diff --git a/legacy/elementary/data/themes/bubble_shine.png b/legacy/elementary/data/themes/bubble_shine.png
new file mode 100644
index 0000000000..33fd1d80ff
Binary files /dev/null and b/legacy/elementary/data/themes/bubble_shine.png differ
diff --git a/legacy/elementary/data/themes/default.edc b/legacy/elementary/data/themes/default.edc
index 898c290864..1d5366a1ca 100644
--- a/legacy/elementary/data/themes/default.edc
+++ b/legacy/elementary/data/themes/default.edc
@@ -3080,46 +3080,26 @@ collections {
///////////////////////////////////////////////////////////////////////////////
group { name: "elm/bubble/base/default";
images {
- image: "frame_1.png" COMP;
- image: "frame_2.png" COMP;
- image: "dia_grad.png" COMP;
+ image: "bubble_1.png" COMP;
+ image: "bubble_shine.png" COMP;
}
parts {
- part { name: "base0";
- mouse_events: 0;
- description { state: "default" 0.0;
- image.normal: "dia_grad.png";
- rel1.to: "over";
- rel2.to: "over";
- fill {
- smooth: 0;
- size {
- relative: 0.0 1.0;
- offset: 64 0;
- }
- }
- }
- }
- part { name: "base";
- mouse_events: 0;
- description { state: "default" 0.0;
- image {
- normal: "frame_2.png";
- border: 5 5 32 26;
- middle: 0;
- }
- fill.smooth : 0;
- }
- }
- part { name: "elm.swallow.content";
+ part { name: "elm.swallow.icon";
type: SWALLOW;
description { state: "default" 0.0;
+ fixed: 1 1;
+ align: 0.0 1.0;
+ aspect: 1.0 1.0;
+ aspect_preference: VERTICAL;
rel1 {
to_y: "elm.text";
- relative: 0.0 1.0;
- offset: 8 2;
+ relative: 0.0 0.0;
+ offset: 4 0;
+ }
+ rel2 {
+ relative: 0.0 1.0;
+ offset: 4 -5;
}
- rel2.offset: -9 -9;
}
}
part { name: "elm.text";
@@ -3127,15 +3107,42 @@ collections {
mouse_events: 0;
scale: 1;
description { state: "default" 0.0;
- align: 0.0 0.0;
+ align: 0.0 1.0;
fixed: 0 1;
rel1 {
- relative: 0.0 0.0;
- offset: 6 6;
+ to_x: "elm.swallow.icon";
+ relative: 1.0 1.0;
+ offset: 4 -5;
}
rel2 {
- relative: 1.0 0.0;
- offset: -7 6;
+ to_x: "elm.info";
+ relative: 0.0 1.0;
+ offset: -5 -5;
+ }
+ color: 0 0 0 255;
+ text {
+ font: "Sans:style=Bold,Edje-Vera-Bold";
+ size: 10;
+ min: 0 1;
+ max: 0 1;
+ align: 0.0 1.0;
+ }
+ }
+ }
+ part { name: "elm.info";
+ type: TEXT;
+ mouse_events: 0;
+ scale: 1;
+ description { state: "default" 0.0;
+ align: 1.0 1.0;
+ fixed: 1 1;
+ rel1 {
+ relative: 1.0 1.0;
+ offset: -5 -5;
+ }
+ rel2 {
+ relative: 1.0 1.0;
+ offset: -5 -5;
}
color: 0 0 0 64;
text {
@@ -3143,21 +3150,55 @@ collections {
size: 10;
min: 1 1;
max: 1 1;
- align: 0.0 0.0;
+ align: 1.0 1.0;
}
}
}
- part { name: "over";
+ part { name: "base0";
+ mouse_events: 0;
+ description { state: "default" 0.0;
+ rel2 {
+ to_y: "elm.swallow.icon";
+ relative: 1.0 0.0;
+ offset: -1 -1;
+ }
+ image {
+ normal: "bubble_1.png";
+ border: 36 11 10 19;
+ }
+ fill.smooth: 0;
+ }
+ }
+ part { name: "elm.swallow.content";
+ type: SWALLOW;
+ description { state: "default" 0.0;
+ rel1 {
+ to: "base0";
+ offset: 9 8;
+ }
+ rel2 {
+ to: "base0";
+ offset: -10 -17;
+ }
+ }
+ }
+ part { name: "shine";
mouse_events: 0;
description { state: "default" 0.0;
- rel1.offset: 4 4;
- rel2.offset: -5 -5;
- image {
- normal: "frame_1.png";
- border: 2 2 28 22;
- middle: 0;
+ rel1 {
+ to: "base0";
+ offset: 5 4;
}
- fill.smooth : 0;
+ rel2 {
+ to: "base0";
+ relative: 1.0 0.5;
+ offset: -6 -16;
+ }
+ image {
+ normal: "bubble_shine.png";
+ border: 5 5 5 0;
+ }
+ fill.smooth: 0;
}
}
}
diff --git a/legacy/elementary/src/bin/test.c b/legacy/elementary/src/bin/test.c
index ebc10b49d6..3312d215ab 100644
--- a/legacy/elementary/src/bin/test.c
+++ b/legacy/elementary/src/bin/test.c
@@ -1130,7 +1130,7 @@ my_anchorblock_anchor(void *data, Evas_Object *obj, void *event_info)
static void
my_bt_17(void *data, Evas_Object *obj, void *event_info)
{
- Evas_Object *win, *bg, *av, *sc, *bx, *fr;
+ Evas_Object *win, *bg, *av, *sc, *bx, *bb, *ic;
char buf[PATH_MAX];
win = elm_win_add(NULL, "anchorblock", ELM_WIN_BASIC);
@@ -1152,10 +1152,19 @@ my_bt_17(void *data, Evas_Object *obj, void *event_info)
elm_scroller_content_set(sc, bx);
evas_object_show(bx);
- fr = elm_frame_add(win);
- elm_frame_label_set(fr, "Message 3");
- evas_object_size_hint_weight_set(fr, 1.0, 0.0);
- evas_object_size_hint_align_set(fr, -1.0,-1.0);
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR);
+ elm_icon_file_set(ic, buf, NULL);
+ elm_icon_scale_set(ic, 0, 0);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+
+ bb = elm_bubble_add(win);
+ elm_bubble_label_set(bb, "Message 3");
+ elm_bubble_info_set(bb, "10:32 4/11/2008");
+ elm_bubble_icon_set(bb, ic);
+ evas_object_show(ic);
+ evas_object_size_hint_weight_set(bb, 1.0, 0.0);
+ evas_object_size_hint_align_set(bb, -1.0,-1.0);
av = elm_anchorblock_add(win);
elm_anchorblock_hover_style_set(av, "popout");
elm_anchorblock_hover_parent_set(av, win);
@@ -1164,15 +1173,23 @@ my_bt_17(void *data, Evas_Object *obj, void *event_info)
"list of messages. It has one +61 432 1234 "
"(phone number) to click on.");
evas_object_smart_callback_add(av, "anchor,clicked", my_anchorblock_anchor, av);
- elm_frame_content_set(fr, av);
+ elm_bubble_content_set(bb, av);
evas_object_show(av);
- elm_box_pack_end(bx, fr);
- evas_object_show(fr);
+ elm_box_pack_end(bx, bb);
+ evas_object_show(bb);
- fr = elm_frame_add(win);
- elm_frame_label_set(fr, "Message 2");
- evas_object_size_hint_weight_set(fr, 1.0, 0.0);
- evas_object_size_hint_align_set(fr, -1.0,-1.0);
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR);
+ elm_icon_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+
+ bb = elm_bubble_add(win);
+ elm_bubble_label_set(bb, "Message 2");
+ elm_bubble_info_set(bb, "7:16 27/10/2008");
+ elm_bubble_icon_set(bb, ic);
+ evas_object_show(ic);
+ evas_object_size_hint_weight_set(bb, 1.0, 0.0);
+ evas_object_size_hint_align_set(bb, -1.0,-1.0);
av = elm_anchorblock_add(win);
elm_anchorblock_hover_style_set(av, "popout");
elm_anchorblock_hover_parent_set(av, win);
@@ -1191,25 +1208,34 @@ my_bt_17(void *data, Evas_Object *obj, void *event_info)
"web URL's too that launch the web browser and point it "
"to that URL.");
evas_object_smart_callback_add(av, "anchor,clicked", my_anchorblock_anchor, av);
- elm_frame_content_set(fr, av);
+ elm_bubble_content_set(bb, av);
evas_object_show(av);
- elm_box_pack_end(bx, fr);
- evas_object_show(fr);
+ elm_box_pack_end(bx, bb);
+ evas_object_show(bb);
- fr = elm_frame_add(win);
- elm_frame_label_set(fr, "Message 1");
- evas_object_size_hint_weight_set(fr, 1.0, 0.0);
- evas_object_size_hint_align_set(fr, -1.0,-1.0);
+ ic = elm_icon_add(win);
+ snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR);
+ elm_icon_file_set(ic, buf, NULL);
+ elm_icon_scale_set(ic, 0, 0);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+
+ bb = elm_bubble_add(win);
+ elm_bubble_label_set(bb, "Message 1");
+ elm_bubble_info_set(bb, "20:47 18/6/2008");
+ elm_bubble_icon_set(bb, ic);
+ evas_object_show(ic);
+ evas_object_size_hint_weight_set(bb, 1.0, 0.0);
+ evas_object_size_hint_align_set(bb, -1.0,-1.0);
av = elm_anchorblock_add(win);
elm_anchorblock_hover_style_set(av, "popout");
elm_anchorblock_hover_parent_set(av, win);
elm_anchorblock_text_set(av,
"This is a short message");
evas_object_smart_callback_add(av, "anchor,clicked", my_anchorblock_anchor, av);
- elm_frame_content_set(fr, av);
+ elm_bubble_content_set(bb, av);
evas_object_show(av);
- elm_box_pack_end(bx, fr);
- evas_object_show(fr);
+ elm_box_pack_end(bx, bb);
+ evas_object_show(bb);
evas_object_show(sc);
diff --git a/legacy/elementary/src/lib/Elementary.h b/legacy/elementary/src/lib/Elementary.h
index 783ddf7e43..a3cca68e23 100644
--- a/legacy/elementary/src/lib/Elementary.h
+++ b/legacy/elementary/src/lib/Elementary.h
@@ -270,6 +270,13 @@ extern "C" {
* "anchor,clicked" - achor called was clicked | event_info = Elm_Entry_Anchorblock_Info
*/
+ EAPI Evas_Object *elm_bubble_add(Evas_Object *parent);
+ EAPI void elm_bubble_label_set(Evas_Object *obj, const char *label);
+ EAPI void elm_bubble_info_set(Evas_Object *obj, const char *label);
+ EAPI void elm_bubble_content_set(Evas_Object *obj, Evas_Object *content);
+ EAPI void elm_bubble_icon_set(Evas_Object *obj, Evas_Object *icon);
+ /* smart callbacks called:
+ */
// FIXME: fixes to do
// * current sizing tree inefficient
diff --git a/legacy/elementary/src/lib/Makefile.am b/legacy/elementary/src/lib/Makefile.am
index 3a56e79603..768c139ea1 100644
--- a/legacy/elementary/src/lib/Makefile.am
+++ b/legacy/elementary/src/lib/Makefile.am
@@ -33,6 +33,7 @@ elm_clock.c \
elm_layout.c \
elm_hover.c \
elm_entry.c \
+elm_bubble.c \
elm_contact.c \
elm_contactlist.c \
\
diff --git a/legacy/elementary/src/lib/elm_bubble.c b/legacy/elementary/src/lib/elm_bubble.c
new file mode 100644
index 0000000000..976c48450e
--- /dev/null
+++ b/legacy/elementary/src/lib/elm_bubble.c
@@ -0,0 +1,138 @@
+#include
+#include "elm_priv.h"
+
+typedef struct _Widget_Data Widget_Data;
+
+struct _Widget_Data
+{
+ Evas_Object *bbl;
+ Evas_Object *content, *icon;
+};
+
+static void _del_hook(Evas_Object *obj);
+static void _sizing_eval(Evas_Object *obj);
+static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _sub_del(void *data, Evas_Object *obj, void *event_info);
+
+static void
+_del_hook(Evas_Object *obj)
+{
+ Widget_Data *wd = elm_widget_data_get(obj);
+ free(wd);
+}
+
+static void
+_sizing_eval(Evas_Object *obj)
+{
+ Widget_Data *wd = elm_widget_data_get(obj);
+ Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
+
+ edje_object_size_min_calc(wd->bbl, &minw, &minh);
+ evas_object_size_hint_min_set(obj, minw, minh);
+ evas_object_size_hint_max_set(obj, maxw, maxh);
+}
+
+static void
+_changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Widget_Data *wd = elm_widget_data_get(data);
+ if (wd->content)
+ edje_object_part_swallow(wd->bbl, "elm.swallow.content", wd->content);
+ if (wd->icon)
+ edje_object_part_swallow(wd->bbl, "elm.swallow.icon", wd->icon);
+ _sizing_eval(data);
+}
+
+static void
+_sub_del(void *data, Evas_Object *obj, void *event_info)
+{
+ Widget_Data *wd = elm_widget_data_get(obj);
+ Evas_Object *sub = event_info;
+ if (sub == wd->content)
+ {
+ evas_object_event_callback_del
+ (sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints);
+ wd->content = NULL;
+ _sizing_eval(obj);
+ }
+ if (sub == wd->icon)
+ {
+ evas_object_event_callback_del
+ (sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints);
+ wd->icon = NULL;
+ _sizing_eval(obj);
+ }
+}
+
+EAPI Evas_Object *
+elm_bubble_add(Evas_Object *parent)
+{
+ Evas_Object *obj;
+ Evas *e;
+ Widget_Data *wd;
+
+ wd = ELM_NEW(Widget_Data);
+ e = evas_object_evas_get(parent);
+ obj = elm_widget_add(e);
+ elm_widget_data_set(obj, wd);
+ elm_widget_del_hook_set(obj, _del_hook);
+
+ wd->bbl = edje_object_add(e);
+ _elm_theme_set(wd->bbl, "bubble", "base", "default");
+ elm_widget_resize_object_set(obj, wd->bbl);
+
+ evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);
+
+ _sizing_eval(obj);
+ return obj;
+}
+
+EAPI void
+elm_bubble_label_set(Evas_Object *obj, const char *label)
+{
+ Widget_Data *wd = elm_widget_data_get(obj);
+ edje_object_part_text_set(wd->bbl, "elm.text", label);
+ _sizing_eval(obj);
+}
+
+EAPI void
+elm_bubble_info_set(Evas_Object *obj, const char *label)
+{
+ Widget_Data *wd = elm_widget_data_get(obj);
+ edje_object_part_text_set(wd->bbl, "elm.info", label);
+ _sizing_eval(obj);
+}
+
+EAPI void
+elm_bubble_content_set(Evas_Object *obj, Evas_Object *content)
+{
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if ((wd->content != content) && (wd->content))
+ elm_widget_sub_object_del(obj, wd->content);
+ wd->content = content;
+ if (content)
+ {
+ elm_widget_sub_object_add(obj, content);
+ edje_object_part_swallow(wd->bbl, "elm.swallow.content", content);
+ evas_object_event_callback_add(content, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+ _changed_size_hints, obj);
+ _sizing_eval(obj);
+ }
+}
+
+EAPI void
+elm_bubble_icon_set(Evas_Object *obj, Evas_Object *icon)
+{
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if ((wd->icon != icon) && (wd->icon))
+ elm_widget_sub_object_del(obj, wd->icon);
+ wd->icon = icon;
+ if (icon)
+ {
+ elm_widget_sub_object_add(obj, icon);
+ edje_object_part_swallow(wd->bbl, "elm.swallow.icon", icon);
+ evas_object_event_callback_add(icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+ _changed_size_hints, obj);
+ _sizing_eval(obj);
+ }
+}