From 24840b2f6be540a030c37cf0f3aec6c0ce8f86a1 Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Tue, 11 May 2021 19:44:38 +0100 Subject: [PATCH] e - paledit - add palette editor tool --- src/bin/meson.build | 1 + src/bin/tools/meson.build | 1 + src/bin/tools/paledit/colsel.c | 366 ++++++++++++++++++++++++ src/bin/tools/paledit/e_paledit.desktop | 8 + src/bin/tools/paledit/e_paledit.png | Bin 0 -> 5620 bytes src/bin/tools/paledit/main.c | 122 ++++++++ src/bin/tools/paledit/main.h | 20 ++ src/bin/tools/paledit/meson.build | 20 ++ src/bin/tools/paledit/palcols.c | 309 ++++++++++++++++++++ src/bin/tools/paledit/palimg.c | 66 +++++ src/bin/tools/paledit/palsel.c | 331 +++++++++++++++++++++ 11 files changed, 1244 insertions(+) create mode 100644 src/bin/tools/meson.build create mode 100644 src/bin/tools/paledit/colsel.c create mode 100644 src/bin/tools/paledit/e_paledit.desktop create mode 100644 src/bin/tools/paledit/e_paledit.png create mode 100644 src/bin/tools/paledit/main.c create mode 100644 src/bin/tools/paledit/main.h create mode 100644 src/bin/tools/paledit/meson.build create mode 100644 src/bin/tools/paledit/palcols.c create mode 100644 src/bin/tools/paledit/palimg.c create mode 100644 src/bin/tools/paledit/palsel.c diff --git a/src/bin/meson.build b/src/bin/meson.build index 5d15382cb..6f086e116 100644 --- a/src/bin/meson.build +++ b/src/bin/meson.build @@ -564,3 +564,4 @@ suid_exes += join_paths(dir_e_utils, 'enlightenment_ckpasswd') subdir('e_fm') subdir('system') +subdir('tools') diff --git a/src/bin/tools/meson.build b/src/bin/tools/meson.build new file mode 100644 index 000000000..d694873f2 --- /dev/null +++ b/src/bin/tools/meson.build @@ -0,0 +1 @@ +subdir('paledit') diff --git a/src/bin/tools/paledit/colsel.c b/src/bin/tools/paledit/colsel.c new file mode 100644 index 000000000..b63f4e877 --- /dev/null +++ b/src/bin/tools/paledit/colsel.c @@ -0,0 +1,366 @@ +#include "main.h" + +static void +_spinner_to_rect(Evas_Object *win) +{ + Elm_Object_Item *it; + int r, g, b, a; + + elm_colorselector_color_get(evas_object_data_get(win, "pal_colorsel"), &r, &g, &b, &a); + it = elm_genlist_selected_item_get(evas_object_data_get(win, "pal_class_list")); + if (it) + { + Elm_Palette_Color *col = elm_object_item_data_get(it); + Elm_Palette *pal = evas_object_data_get(win, "pal"); + col->r = r; + col->g = g; + col->b = b; + col->a = a; + elm_genlist_item_update(it); + pal_save(win); + palimg_update(evas_object_data_get(win, "pal_image"), pal); + } + evas_color_argb_premul(a, &r, &g, &b); + evas_object_color_set(evas_object_data_get(win, "pal_color_rect"), r, g, b, a); +} + +static void +_spinner_to_colorsel_mirror(Evas_Object *win) +{ + int r, g, b, a; + + r = elm_spinner_value_get(evas_object_data_get(win, "pal_spin_int_r")); + g = elm_spinner_value_get(evas_object_data_get(win, "pal_spin_int_g")); + b = elm_spinner_value_get(evas_object_data_get(win, "pal_spin_int_b")); + a = elm_spinner_value_get(evas_object_data_get(win, "pal_spin_int_a")); + elm_colorselector_color_set(evas_object_data_get(win, "pal_colorsel"), r, g, b, a); +} + +static void +_spinner_to_entry_mirror(Evas_Object *win) +{ + int r, g, b, a; + char buf[256]; + + elm_colorselector_color_get(evas_object_data_get(win, "pal_colorsel"), &r, &g, &b, &a); + snprintf(buf, sizeof(buf), + "#<+ backing=on backing_color=#0004>" + "<+ color=#f54>%02x" + "<+ color=#5f4>%02x" + "<+ color=#45f>%02x" + "<+ color=#888>%02x" + "" + , r, g, b, a); + elm_object_text_set(evas_object_data_get(win, "pal_color_entry"), buf); +} + +static void +_spinner_to_spinner_mirror(Evas_Object *win) +{ + int r, g, b, a; + int pr, pg, pb, pa; + + elm_colorselector_color_get(evas_object_data_get(win, "pal_colorsel"), &r, &g, &b, &a); + pr = (r * 100) / 255; + pg = (g * 100) / 255; + pb = (b * 100) / 255; + pa = (a * 100) / 255; + elm_spinner_value_set(evas_object_data_get(win, "pal_spin_int_r"), r); + elm_spinner_value_set(evas_object_data_get(win, "pal_spin_int_g"), g); + elm_spinner_value_set(evas_object_data_get(win, "pal_spin_int_b"), b); + elm_spinner_value_set(evas_object_data_get(win, "pal_spin_int_a"), a); + elm_spinner_value_set(evas_object_data_get(win, "pal_spin_perc_r"), pr); + elm_spinner_value_set(evas_object_data_get(win, "pal_spin_perc_g"), pg); + elm_spinner_value_set(evas_object_data_get(win, "pal_spin_perc_b"), pb); + elm_spinner_value_set(evas_object_data_get(win, "pal_spin_perc_a"), pa); +} + +static void +_cb_spinner_perc_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + double val; + int intval; + + val = elm_spinner_value_get(obj); + intval = (val * 255.0) / 100.0; + if (obj == evas_object_data_get(win, "pal_spin_perc_r")) + elm_spinner_value_set(evas_object_data_get(win, "pal_spin_int_r"), intval); + else if (obj == evas_object_data_get(win, "pal_spin_perc_g")) + elm_spinner_value_set(evas_object_data_get(win, "pal_spin_int_g"), intval); + else if (obj == evas_object_data_get(win, "pal_spin_perc_b")) + elm_spinner_value_set(evas_object_data_get(win, "pal_spin_int_b"), intval); + else if (obj == evas_object_data_get(win, "pal_spin_perc_a")) + elm_spinner_value_set(evas_object_data_get(win, "pal_spin_int_a"), intval); + _spinner_to_colorsel_mirror(win); + _spinner_to_entry_mirror(win); + _spinner_to_rect(win); +} + +static void +_cb_spinner_int_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + double val; + int intval; + + val = elm_spinner_value_get(obj); + intval = (val * 100.0) / 255.0; + if (obj == evas_object_data_get(win, "pal_spin_int_r")) + elm_spinner_value_set(evas_object_data_get(win, "pal_spin_perc_r"), intval); + else if (obj == evas_object_data_get(win, "pal_spin_int_g")) + elm_spinner_value_set(evas_object_data_get(win, "pal_spin_perc_g"), intval); + else if (obj == evas_object_data_get(win, "pal_spin_int_b")) + elm_spinner_value_set(evas_object_data_get(win, "pal_spin_perc_b"), intval); + else if (obj == evas_object_data_get(win, "pal_spin_int_a")) + elm_spinner_value_set(evas_object_data_get(win, "pal_spin_perc_a"), intval); + _spinner_to_colorsel_mirror(win); + _spinner_to_entry_mirror(win); + _spinner_to_rect(win); +} + +static void +_cb_colorsel_changed(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + + _spinner_to_spinner_mirror(win); + _spinner_to_entry_mirror(win); + _spinner_to_rect(win); +} + +static void +_colsel_entry_handle(Evas_Object *win, Evas_Object *entry, Eina_Bool activated) +{ + const char *markup = elm_object_text_get(entry); + + if (markup) + { + char *plain = elm_entry_markup_to_utf8(markup); + if (plain) + { + char *p = plain; + int r, g, b, a; + + if (p[0] == '#') p++; + if (strlen(p) == 8) + { + if (sscanf(p, "%02x%02x%02x%02x", &r, &g, &b, &a) == 4) + { + elm_colorselector_color_set(evas_object_data_get(win, "pal_colorsel"), r, g, b, a); + goto ok; + } + } + else if (activated) + { + if (strlen(p) == 6) + { + if (sscanf(p, "%02x%02x%02x", &r, &g, &b) == 3) + { + a = 255; + elm_colorselector_color_set(evas_object_data_get(win, "pal_colorsel"), r, g, b, a); + goto ok; + } + } + else if (strlen(p) == 4) + { + if (sscanf(p, "%01x%01x%01x%01x", &r, &g, &b, &a) == 4) + { + r = (r << 4) | r; + g = (g << 4) | g; + b = (b << 4) | b; + a = (a << 4) | a; + elm_colorselector_color_set(evas_object_data_get(win, "pal_colorsel"), r, g, b, a); + goto ok; + } + } + else if (strlen(p) == 3) + { + if (sscanf(p, "%01x%01x%01x", &r, &g, &b) == 3) + { + r = (r << 4) | r; + g = (g << 4) | g; + b = (b << 4) | b; + a = 255; + elm_colorselector_color_set(evas_object_data_get(win, "pal_colorsel"), r, g, b, a); + goto ok; + } + } + } + free(plain); + } + } + return; +ok: + colsel_update(win); +} + +static void +_cb_color_entry_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + + _colsel_entry_handle(win, obj, EINA_FALSE); +} + +static void +_cb_color_entry_activated(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + + _colsel_entry_handle(win, obj, EINA_TRUE); +} + +static void +_colsel_row(Evas_Object *win, Evas_Object *tb, + int row, + int r, int g, int b, int a, + const char *label, const char *name_percent, const char *name_int) +{ + Evas_Object *o, *sp; + + o = elm_label_add(win); + elm_object_text_set(o, label); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_fill_set(o, 0.0, EVAS_HINT_FILL); + elm_table_pack(tb, o, 0, row, 1, 1); + evas_object_show(o); + + o = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_color_set(o, r, g, b, a); + evas_object_size_hint_min_set(o, ELM_SCALE_SIZE(15), ELM_SCALE_SIZE(15)); + elm_table_pack(tb, o, 1, row, 1, 1); + evas_object_show(o); + + // invisible spinner for just spacing the 2 cells with real spinners for + // holding max possible vbalue and then some to avoid resizing due to font + // changes mwith some digits causing sizing to go up + sp = o = elm_spinner_add(win); + elm_spinner_editable_set(o, EINA_TRUE); + elm_spinner_label_format_set(o, "%1.0f%%"); + elm_spinner_step_set(o, 1); + elm_spinner_min_max_set(o, 0, 99999); + elm_spinner_value_set(o, 99999); + elm_table_pack(tb, o, 2, row, 1, 1); + + sp = o = elm_spinner_add(win); + elm_spinner_editable_set(o, EINA_TRUE); + elm_spinner_label_format_set(o, "%1.0f"); + elm_spinner_step_set(o, 1); + elm_spinner_min_max_set(o, 0, 99999); + elm_spinner_value_set(o, 99999); + elm_table_pack(tb, o, 3, row, 1, 1); + + sp = o = elm_spinner_add(win); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_spinner_editable_set(o, EINA_TRUE); + elm_spinner_label_format_set(o, "%1.0f%%"); + elm_spinner_step_set(o, 1); + elm_spinner_min_max_set(sp, 0, 100); + evas_object_smart_callback_add(o, "changed", _cb_spinner_perc_changed, win); + elm_table_pack(tb, o, 2, row, 1, 1); + evas_object_show(o); + evas_object_data_set(win, name_percent, o); + + sp = o = elm_spinner_add(win); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_spinner_editable_set(o, EINA_TRUE); + elm_spinner_label_format_set(o, "%1.0f"); + elm_spinner_step_set(o, 1); + elm_spinner_min_max_set(sp, 0, 255); + evas_object_smart_callback_add(o, "changed", _cb_spinner_int_changed, win); + elm_table_pack(tb, o, 3, row, 1, 1); + evas_object_show(o); + evas_object_data_set(win, name_int, o); +} + +void +colsel_update(Evas_Object *win) +{ + _spinner_to_spinner_mirror(win); + _spinner_to_entry_mirror(win); + _spinner_to_rect(win); +} + +Evas_Object * +colsel_add(Evas_Object *win) +{ + Evas_Object *o, *bxr, *tb2, *fr2, *fr; + + bxr = o = elm_box_add(win); + elm_box_padding_set(o, 0, ELM_SCALE_SIZE(10)); + elm_box_align_set(o, 0.5, 0.0); + evas_object_size_hint_weight_set(o, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + + fr = o = elm_frame_add(win); + elm_object_style_set(o, "pad_small"); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bxr, o); + evas_object_show(o); + + fr2 = o = elm_frame_add(win); + elm_object_style_set(o, "outline"); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_content_set(fr, o); + evas_object_show(o); + + tb2 = o = elm_table_add(win); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_content_set(fr2, o); + evas_object_show(o); + + o = elm_bg_add(win); + elm_object_style_set(o, "checks_small"); + evas_object_size_hint_min_set(o, ELM_SCALE_SIZE(80), ELM_SCALE_SIZE(60)); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb2, o, 0, 0, 1, 1); + evas_object_show(o); + + o = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_min_set(o, ELM_SCALE_SIZE(60), ELM_SCALE_SIZE(40)); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_color_set(o, 128, 64, 0, 128); + elm_table_pack(tb2, o, 0, 0, 1, 1); + evas_object_data_set(win, "pal_color_rect", o); + evas_object_show(o); + + o = elm_colorselector_add(win); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(o, "changed", _cb_colorsel_changed, win); + elm_box_pack_end(bxr, o); + evas_object_show(o); + evas_object_data_set(win, "pal_colorsel", o); + + o = elm_entry_add(win); + elm_entry_single_line_set(o, EINA_TRUE); + elm_entry_scrollable_set(o, EINA_TRUE); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(o, "changed,user", _cb_color_entry_changed, win); + evas_object_smart_callback_add(o, "activated", _cb_color_entry_activated, win); + elm_box_pack_end(bxr, o); + evas_object_show(o); + evas_object_data_set(win, "pal_color_entry", o); + + tb2 = o = elm_table_add(win); + elm_table_padding_set(o, ELM_SCALE_SIZE(10), ELM_SCALE_SIZE(10)); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, 0.0); + elm_box_pack_end(bxr, o); + evas_object_show(o); + + _colsel_row(win, tb2, 0, 255, 0, 0, 255, "Red", "pal_spin_perc_r", "pal_spin_int_r"); + _colsel_row(win, tb2, 1, 0, 255, 0, 255, "Green", "pal_spin_perc_g", "pal_spin_int_g"); + _colsel_row(win, tb2, 2, 0, 0, 255, 255, "Blue", "pal_spin_perc_b", "pal_spin_int_b"); + _colsel_row(win, tb2, 3, 64, 64, 64, 128, "Alpha", "pal_spin_perc_a", "pal_spin_int_a"); + + return bxr; +} diff --git a/src/bin/tools/paledit/e_paledit.desktop b/src/bin/tools/paledit/e_paledit.desktop new file mode 100644 index 000000000..afa642508 --- /dev/null +++ b/src/bin/tools/paledit/e_paledit.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Type=Application +Name=Palette Editor +Icon=e_paledit +Exec=e_paledit +Comment=A tool for editing color schemes and paletted for Enlightenment +Categories=Settings;DesktopSettings; +StartupWMClass=e_paledit diff --git a/src/bin/tools/paledit/e_paledit.png b/src/bin/tools/paledit/e_paledit.png new file mode 100644 index 0000000000000000000000000000000000000000..65cfafa913e75d6829c26f9cac198b8c6c02d4fa GIT binary patch literal 5620 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 literal 0 HcmV?d00001 diff --git a/src/bin/tools/paledit/main.c b/src/bin/tools/paledit/main.c new file mode 100644 index 000000000..c455a261c --- /dev/null +++ b/src/bin/tools/paledit/main.c @@ -0,0 +1,122 @@ +#include "main.h" + +void +pal_save(Evas_Object *win) +{ + char *palname = evas_object_data_get(win, "pal_selected_palette"); + if (!palname) return; + Elm_Palette *pal = evas_object_data_get(win, "pal"); + elm_config_palette_save(pal, palname); + elm_config_palette_set(palname); + elm_config_all_flush(); + elm_config_reload(); +} + +void +pal_load(Evas_Object *win) +{ + char *palname = evas_object_data_get(win, "pal_selected_palette"); + if (!palname) return; + Elm_Palette *pal = elm_config_palette_load(palname); + if (!pal) return; + evas_object_data_set(win, "pal", pal); + palcols_fill(win); + palimg_update(evas_object_data_get(win, "pal_image"), pal); + elm_object_text_set(evas_object_data_get(win, "pal_name"), palname); + pal_save(win); +} + +static void +_cb_close_click(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + evas_object_del(data); +} + +EAPI_MAIN int +elm_main(int argc, char **argv) +{ + Evas_Object *o, *win, *bx, *bxh, *fr, *tb; + + elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); + + win = elm_win_util_standard_add("e_paledit", "Palette Editor"); + elm_win_autodel_set(win, EINA_TRUE); + + fr = o = elm_frame_add(win); + elm_object_style_set(o, "pad_medium"); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, o); + evas_object_show(o); + + bx = o = elm_box_add(win); + elm_box_padding_set(o, 0, ELM_SCALE_SIZE(10)); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_content_set(fr, o); + evas_object_show(o); + + bxh = o = elm_box_add(win); + elm_box_padding_set(o, ELM_SCALE_SIZE(10), 0); + elm_box_horizontal_set(o, EINA_TRUE); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, o); + evas_object_show(o); + + o = palcols_add(win); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bxh, o); + evas_object_show(o); + + o = elm_separator_add(win); + evas_object_size_hint_weight_set(o, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(o, 0.5, EVAS_HINT_FILL); + elm_box_pack_end(bxh, o); + evas_object_show(o); + + o = colsel_add(win); + evas_object_size_hint_weight_set(o, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bxh, o); + evas_object_show(o); + + tb = o = elm_table_add(win); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(o, 1.0, EVAS_HINT_FILL); + elm_box_pack_end(bx, o); + evas_object_show(o); + + o = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_min_set(o, ELM_SCALE_SIZE(120), 0); + elm_table_pack(tb, o, 0, 0, 1, 1); + + o = elm_button_add(win); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(o, "clicked", _cb_close_click, win); + elm_object_text_set(o, "Close"); + elm_table_pack(tb, o, 0, 0, 1, 1); + evas_object_show(o); + + colsel_update(win); + + if (argc > 1) + { + evas_object_data_set(win, "pal_selected_palette", strdup(argv[1])); + } + else + { + const char *palconf = elm_config_palette_get(); + if (!palconf) palconf = "default"; + evas_object_data_set(win, "pal_selected_palette", strdup(palconf)); + } + pal_load(win); + + evas_object_show(win); + + elm_run(); + + return 0; +} +ELM_MAIN() diff --git a/src/bin/tools/paledit/main.h b/src/bin/tools/paledit/main.h new file mode 100644 index 000000000..1578aa8ea --- /dev/null +++ b/src/bin/tools/paledit/main.h @@ -0,0 +1,20 @@ +#ifndef _MAIN_H +#define _MAIN_H + +#include + +void palimg_update(Evas_Object *img, Elm_Palette *pal); +Evas_Object *palimg_add(Evas_Object *win); + +Evas_Object *palsel_add(Evas_Object *win); + +void palcols_fill(Evas_Object *win); +Evas_Object *palcols_add(Evas_Object *win); + +void colsel_update(Evas_Object *win); +Evas_Object *colsel_add(Evas_Object *win); + +void pal_load(Evas_Object *win); +void pal_save(Evas_Object *win); + +#endif diff --git a/src/bin/tools/paledit/meson.build b/src/bin/tools/paledit/meson.build new file mode 100644 index 000000000..6e995015c --- /dev/null +++ b/src/bin/tools/paledit/meson.build @@ -0,0 +1,20 @@ +executable('e_paledit', + [ 'main.c', + 'main.h', + 'colsel.c', + 'palcols.c', + 'palimg.c', + 'palsel.c' + ], + include_directories: include_directories('.'), + dependencies : [ dep_elementary, deps ], + install_dir : dir_bin, + install : true + ) + +install_data('e_paledit.desktop', + install_dir: join_paths(dir_data, 'applications') + ) +install_data('e_paledit.png', + install_dir: join_paths(dir_data, 'icons/hicolor/128x128/apps') + ) diff --git a/src/bin/tools/paledit/palcols.c b/src/bin/tools/paledit/palcols.c new file mode 100644 index 000000000..08f3a1769 --- /dev/null +++ b/src/bin/tools/paledit/palcols.c @@ -0,0 +1,309 @@ +#include "main.h" + +static void _pal_color_add(Evas_Object *win); +static void _pal_color_del(Evas_Object *win); + +static char * +_cb_class_gl_label_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + Elm_Palette_Color *col = data; + + if (col->name) return strdup(col->name); + else return strdup(""); +} + +static Evas_Object * +_cb_class_gl_content_get(void *data, Evas_Object *obj, const char *part) +{ + Elm_Palette_Color *col = data; + Evas_Object *o, *tb; + int r, g, b, a; + + if (!!strcmp(part, "elm.swallow.icon")) return NULL; + + tb = o = elm_table_add(obj); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + + o = elm_bg_add(obj); + elm_object_style_set(o, "checks_small"); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, o, 0, 0, 1, 1); + evas_object_show(o); + + o = evas_object_rectangle_add(evas_object_evas_get(obj)); + r = col->r; + g = col->g; + b = col->b; + a = col->a; + evas_color_argb_premul(a, &r, &g, &b); + evas_object_color_set(o, r, g, b, a); + evas_object_size_hint_min_set(o, ELM_SCALE_SIZE(30), ELM_SCALE_SIZE(15)); + elm_table_pack(tb, o, 0, 0, 1, 1); + evas_object_show(o); + + return tb; +} + +static void +_cb_class_gl_sel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Evas_Object *win = data; + Elm_Object_Item *it = event_info; + Elm_Palette_Color *col = elm_object_item_data_get(it); + + elm_colorselector_color_set(evas_object_data_get(win, "pal_colorsel"), + col->r, col->g, col->b, col->a); + colsel_update(win); + elm_object_text_set(evas_object_data_get(win, "pal_class_entry"), col->name); +} + +static int +_cb_class_insert_cmp(const void *pa, const void *pb) +{ + Elm_Palette_Color *col1 = elm_object_item_data_get(pa); + Elm_Palette_Color *col2 = elm_object_item_data_get(pb); + const char *n1, *n2; + + if (!col1) return -1; + if (!col2) return 1; + n1 = col1->name; + if (!n1) n1 = ""; + n2 = col2->name; + if (!n2) n2 = ""; + return strcmp(n1, n2); +} + +static void +_cb_select_click(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + Evas_Object *o = palsel_add(win); + evas_object_show(o); +} + +static void +_cb_add_click(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + _pal_color_add(data); +} + +static void +_cb_del_click(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + _pal_color_del(data); +} + +static void +_pal_color_add(Evas_Object *win) +{ + const char *markup = elm_object_text_get(evas_object_data_get(win, "pal_class_entry")); + + if (markup) + { + char *plain = elm_entry_markup_to_utf8(markup); + if (plain) + { + Elm_Genlist_Item_Class *itc = evas_object_data_get(win, "pal_class_itc"); + + if (itc) + { + Elm_Palette *pal = evas_object_data_get(win, "pal"); + Evas_Object *list = evas_object_data_get(win, "pal_class_list"); + Eina_List *l; + Elm_Palette_Color *col; + int r, g, b, a; + + EINA_LIST_FOREACH(pal->colors, l, col) + { + if (!col->name) continue; + if (!strcmp(col->name, plain)) goto exists; + } + elm_colorselector_color_get(evas_object_data_get(win, "pal_colorsel"), &r, &g, &b, &a); + elm_config_palette_color_set(pal, plain, r, g, b, a); + EINA_LIST_FOREACH(pal->colors, l, col) + { + if (!col->name) continue; + if (!strcmp(col->name, plain)) + { + Elm_Object_Item *it; + + it = elm_genlist_item_sorted_insert(list, itc, col, + NULL, ELM_GENLIST_ITEM_NONE, + _cb_class_insert_cmp, + _cb_class_gl_sel, win); + elm_genlist_item_show(it, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE); + elm_genlist_item_selected_set(it, EINA_TRUE); + break; + } + } + palimg_update(evas_object_data_get(win, "pal_image"), pal); + } +exists: + free(plain); + } + } + pal_save(win); +} + +static void +_pal_color_del(Evas_Object *win) +{ + Elm_Object_Item *it, *it_sel; + + it = elm_genlist_selected_item_get(evas_object_data_get(win, "pal_class_list")); + if (it) + { + Elm_Palette *pal = evas_object_data_get(win, "pal"); + Elm_Palette_Color *col = elm_object_item_data_get(it); + if (col->name) elm_config_palette_color_unset(pal, col->name); + it_sel = elm_genlist_item_next_get(it); + if (!it_sel) it_sel = elm_genlist_item_prev_get(it); + elm_object_item_del(it); + if (it_sel) + { + elm_genlist_item_show(it_sel, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE); + elm_genlist_item_selected_set(it_sel, EINA_TRUE); + } + palimg_update(evas_object_data_get(win, "pal_image"), pal); + } + pal_save(win); +} + +void +palcols_fill(Evas_Object *win) +{ + Elm_Object_Item *sel_it = NULL; + Elm_Palette *pal = evas_object_data_get(win, "pal"); + Elm_Palette_Color *col; + Evas_Object *list = evas_object_data_get(win, "pal_class_list"); + Eina_List *l; + Elm_Genlist_Item_Class *itc = evas_object_data_get(win, "pal_class_itc"); + Elm_Object_Item *it; + + elm_genlist_clear(list); + + if (!itc) + { + itc = elm_genlist_item_class_new(); + evas_object_data_set(win, "pal_class_itc", itc); + + itc->item_style = "default"; + itc->func.text_get = _cb_class_gl_label_get; + itc->func.content_get = _cb_class_gl_content_get; + } + + EINA_LIST_FOREACH(pal->colors, l, col) + { + it = elm_genlist_item_sorted_insert(list, itc, col, + NULL, ELM_GENLIST_ITEM_NONE, + _cb_class_insert_cmp, + _cb_class_gl_sel, win); + if (!sel_it) sel_it = it; + } + if (sel_it) + { + elm_genlist_item_show(sel_it, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE); + elm_genlist_item_selected_set(sel_it, EINA_TRUE); + } +} + +Evas_Object * +palcols_add(Evas_Object *win) +{ + Evas_Object *o, *bxl, *btn, *bxh2; + + bxl = o = elm_box_add(win); + elm_box_padding_set(o, 0, ELM_SCALE_SIZE(10)); + elm_box_align_set(o, 0.5, 0.0); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(o); + + btn = o = elm_button_add(win); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(o, "clicked", _cb_select_click, win); + elm_object_text_set(o, "Select palette"); + elm_box_pack_end(bxl, o); + evas_object_show(o); + + o = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_min_set(o, ELM_SCALE_SIZE(240), 0); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bxl, o); + + bxh2 = o = elm_box_add(win); + elm_box_padding_set(o, ELM_SCALE_SIZE(10), 0); + elm_box_horizontal_set(o, EINA_TRUE); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bxl, o); + evas_object_show(o); + + o = elm_entry_add(win); + elm_entry_single_line_set(o, EINA_TRUE); + elm_entry_scrollable_set(o, EINA_TRUE); + elm_entry_editable_set(o, EINA_FALSE); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bxh2, o); + evas_object_show(o); + evas_object_data_set(win, "pal_name", o); + + o = palimg_add(win); + elm_box_pack_end(bxh2, o); + evas_object_show(o); + evas_object_data_set(win, "pal_image", o); + + o = elm_genlist_add(win); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bxl, o); + evas_object_show(o); + evas_object_data_set(win, "pal_class_list", o); + + bxh2 = o = elm_box_add(win); + elm_box_padding_set(o, ELM_SCALE_SIZE(10), 0); + elm_box_horizontal_set(o, EINA_TRUE); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bxl, o); + evas_object_show(o); + + o = elm_entry_add(win); + elm_entry_single_line_set(o, EINA_TRUE); + elm_entry_scrollable_set(o, EINA_TRUE); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bxh2, o); + evas_object_show(o); + evas_object_data_set(win, "pal_class_entry", o); + + btn = o = elm_button_add(win); + evas_object_size_hint_weight_set(o, 0.0, 0.0); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(o, "clicked", _cb_add_click, win); + elm_box_pack_end(bxh2, o); + evas_object_show(o); + + o = elm_icon_add(win); + elm_icon_standard_set(o, "add"); + elm_object_content_set(btn, o); + evas_object_show(o); + + btn = o = elm_button_add(win); + evas_object_size_hint_weight_set(o, 0.0, 0.0); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(o, "clicked", _cb_del_click, win); + elm_box_pack_end(bxh2, o); + evas_object_show(o); + + o = elm_icon_add(win); + elm_icon_standard_set(o, "sub"); + elm_object_content_set(btn, o); + evas_object_show(o); + + return bxl; +} diff --git a/src/bin/tools/paledit/palimg.c b/src/bin/tools/paledit/palimg.c new file mode 100644 index 000000000..728cf4c97 --- /dev/null +++ b/src/bin/tools/paledit/palimg.c @@ -0,0 +1,66 @@ +#include "main.h" + +void +palimg_update(Evas_Object *img, Elm_Palette *pal) +{ + unsigned char *pix, *p, *lin; + int w, h, stride; + Eina_List *l; + Elm_Palette_Color *col; + int x = 0, pixn = 0; + + if (!pal) return; + evas_object_image_size_get(img, &w, &h); + stride = evas_object_image_stride_get(img); + pix = evas_object_image_data_get(img, EINA_TRUE); + lin = p = pix; + while (pixn < 256) + { +#define PIX_WRITE(r, g, b, a) \ + *((int *)p) = (a << 24) | (r << 16) | (g << 8) | (b); \ + p += sizeof(int); \ + pixn++; \ + x++; \ + if (x == w) \ + { \ + lin += stride; \ + p = lin; \ + x = 0; \ + } \ + if (pixn >= 256) break + if (!pal->colors) + { + PIX_WRITE(0, 0, 0, 0); + } + else + { + EINA_LIST_FOREACH(pal->colors, l, col) + { + int r, g, b, a; + + r = col->r; + g = col->g; + b = col->b; + a = col->a; + evas_color_argb_premul(a, &r, &g, &b); + PIX_WRITE(r, g, b, a); + } + } + } + evas_object_image_data_set(img, pix); + evas_object_image_data_update_add(img, 0, 0, w, h); +} + +Evas_Object * +palimg_add(Evas_Object *win) +{ + const int zoom = 2; + Evas_Object *o = evas_object_image_filled_add(evas_object_evas_get(win)); + evas_object_image_smooth_scale_set(o, EINA_FALSE); + evas_object_image_alpha_set(o, EINA_TRUE); + evas_object_image_size_set(o, 16, 16); + evas_object_size_hint_min_set(o, + ELM_SCALE_SIZE(zoom * 16), + ELM_SCALE_SIZE(zoom * 16)); + return o; +} diff --git a/src/bin/tools/paledit/palsel.c b/src/bin/tools/paledit/palsel.c new file mode 100644 index 000000000..1bc066f1c --- /dev/null +++ b/src/bin/tools/paledit/palsel.c @@ -0,0 +1,331 @@ +#include "main.h" + +static void +_name_dismiss(Evas_Object *win) +{ + evas_object_del(evas_object_data_get(win, "name_entry")); + evas_object_del(evas_object_data_get(win, "name_ok")); + evas_object_del(evas_object_data_get(win, "name_cancel")); +} + +static void +_cb_name_ok_click(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + const char *markup = elm_object_text_get(evas_object_data_get(data, "name_entry")); + + if (markup) + { + char *plain = elm_entry_markup_to_utf8(markup); + if (plain) + { + const char *op = evas_object_data_get(data, "name_op"); + + if (op) + { + if (!strcmp(op, "new")) + { + Elm_Palette *pal = elm_config_palette_load(plain); + if (pal) + { + free(evas_object_data_get(data, "pal_selected_palette")); + evas_object_data_set(data, "pal_selected_palette", + strdup(plain)); + elm_config_palette_free(pal); + } + } + else if (!strcmp(op, "copy")) + { + char *palname = evas_object_data_get(data, "pal_selected_palette"); + if (palname) + { + Elm_Palette *pal = elm_config_palette_load(palname); + if (pal) + { + free(evas_object_data_get(data, "pal_selected_palette")); + evas_object_data_set(data, "pal_selected_palette", + strdup(plain)); + elm_config_palette_free(pal); + } + } + } + pal_load(data); + elm_popup_dismiss(evas_object_data_get(data, "pal_popup")); + } + free(plain); + } + } + _name_dismiss(data); +} + +static void +_cb_name_activate(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + _cb_name_ok_click(data, NULL, NULL); +} + +static void +_cb_name_cancel_click(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + _name_dismiss(data); +} + +static void +_palsel_name_request(Evas_Object *win, const char *name, const char *op) +{ + Evas_Object *o, *tb; + + tb = evas_object_data_get(win, "pal_popup_table"); + evas_object_data_set(win, "name_op", op); + + o = elm_entry_add(win); + elm_entry_single_line_set(o, EINA_TRUE); + elm_entry_scrollable_set(o, EINA_TRUE); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(o, name); + evas_object_smart_callback_add(o, "activated", _cb_name_activate, win); + elm_table_pack(tb, o, 0, 1, 2, 1); + evas_object_show(o); + evas_object_data_set(win, "name_entry", o); + elm_entry_select_all(o); + elm_object_focus_set(o, EINA_TRUE); + + o = elm_button_add(win); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(o, "OK"); + evas_object_smart_callback_add(o, "clicked", _cb_name_ok_click, win); + elm_table_pack(tb, o, 0, 2, 1, 1); + evas_object_show(o); + evas_object_data_set(win, "name_ok", o); + + o = elm_button_add(win); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(o, "Cancel"); + evas_object_smart_callback_add(o, "clicked", _cb_name_cancel_click, win); + elm_table_pack(tb, o, 1, 2, 1, 1); + evas_object_show(o); + evas_object_data_set(win, "name_cancel", o); +} + +static void +_cb_select_new_click(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + _palsel_name_request(data, "new", "new"); +} + +static void +_cb_select_del_click(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + char *palname = evas_object_data_get(data, "pal_selected_palette"); + if (palname) + { + Elm_Object_Item *it_sel, *it = NULL; + + it_sel = elm_genlist_selected_item_get(evas_object_data_get(data, "pal_popup_list")); + if (it_sel) + { + it = elm_genlist_item_next_get(it_sel); + if (!it) it = elm_genlist_item_prev_get(it_sel); + } + elm_object_item_del(it_sel); + elm_config_palette_delete(palname); + evas_object_data_del(data, "pal_selected_palette"); + free(palname); + if (it) + { + elm_genlist_item_show(it, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE); + elm_genlist_item_selected_set(it, EINA_TRUE); + } + } +} + +static void +_cb_select_copy_click(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + _palsel_name_request(data, "copy", "copy"); +} + +static void +_cb_select_select_click(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + pal_load(data); + elm_popup_dismiss(evas_object_data_get(data, "pal_popup")); +} + +static void +_cb_select_cancel_click(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_popup_dismiss(evas_object_data_get(data, "pal_popup")); +} + +static void +_cb_select_dismissed(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + evas_object_del(evas_object_data_get(data, "pal_popup")); + evas_object_data_del(data, "pal_popup"); +} + +static char * +_cb_palette_gl_label_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + return strdup(data); +} + +static Evas_Object * +_cb_palette_gl_content_get(void *data, Evas_Object *obj, const char *part) +{ + Elm_Palette *pal; + Evas_Object *o; + + if (!!strcmp(part, "elm.swallow.icon")) return NULL; + pal = elm_config_palette_load(data); + if (!pal) return NULL; + o = palimg_add(obj); + palimg_update(o, pal); + elm_config_palette_free(pal); + return o; +} + +static void +_cb_palette_gl_del(void *data, Evas_Object *obj EINA_UNUSED) +{ + free(data); +} + +static void +_cb_palette_gl_sel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Evas_Object *win = data; + Elm_Object_Item *it = event_info; + + free(evas_object_data_get(win, "pal_selected_palette")); + evas_object_data_set(win, "pal_selected_palette", + strdup(elm_object_item_data_get(it))); +} + +static void +_palette_list_fill(Evas_Object *win, Evas_Object *list) +{ + Elm_Genlist_Item_Class *itc = elm_genlist_item_class_new(); + Eina_List *palettes, *l; + const char *pal, *palconf; + Elm_Object_Item *sel_it = NULL; + + itc->item_style = "default"; + itc->func.text_get = _cb_palette_gl_label_get; + itc->func.content_get = _cb_palette_gl_content_get; + itc->func.del = _cb_palette_gl_del; + + palconf = elm_config_palette_get(); + palettes = elm_config_palette_list(); + EINA_LIST_FOREACH(palettes, l, pal) + { + char *dat = strdup(pal); + Elm_Object_Item *it; + + it = elm_genlist_item_append(list, itc, dat, + NULL, ELM_GENLIST_ITEM_NONE, + _cb_palette_gl_sel, win); + if ((palconf) && (!strcmp(pal, palconf))) + { + sel_it = it; + } + } + elm_config_palette_list_free(palettes); + elm_genlist_item_class_free(itc); + if (sel_it) + { + elm_genlist_item_show(sel_it, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE); + elm_genlist_item_selected_set(sel_it, EINA_TRUE); + } +} + +Evas_Object * +palsel_add(Evas_Object *win) +{ + Evas_Object *o, *pop, *tb, *li, *bx; + + pop = o = elm_popup_add(win); + elm_popup_scrollable_set(o, EINA_FALSE); + elm_object_part_text_set(o, "title,text", "Select a palette"); + evas_object_smart_callback_add(o, "dismissed", _cb_select_dismissed, win); + evas_object_data_set(win, "pal_popup", o); + + tb = o = elm_table_add(win); + elm_table_padding_set(o, ELM_SCALE_SIZE(10), ELM_SCALE_SIZE(10)); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_content_set(pop, o); + evas_object_show(o); + evas_object_data_set(win, "pal_popup_table", o); + + o = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_min_set(o, ELM_SCALE_SIZE(220), ELM_SCALE_SIZE(300)); + elm_table_pack(tb, o, 0, 0, 2, 1); + + li = o = elm_genlist_add(win); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(o, "activated", _cb_select_select_click, win); + elm_table_pack(tb, o, 0, 0, 2, 1); + evas_object_show(o); + evas_object_data_set(win, "pal_popup_list", o); + + _palette_list_fill(win, li); + + bx = o = elm_box_add(win); + elm_box_homogeneous_set(o, EINA_TRUE); + elm_box_padding_set(o, ELM_SCALE_SIZE(5), 0); + elm_box_horizontal_set(o, EINA_TRUE); + elm_object_part_content_set(pop, "button1", o); + evas_object_show(o); + + o = elm_button_add(win); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(o, "New"); + evas_object_smart_callback_add(o, "clicked", _cb_select_new_click, win); + elm_box_pack_end(bx, o); + evas_object_show(o); + + o = elm_button_add(win); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(o, "Del"); + evas_object_smart_callback_add(o, "clicked", _cb_select_del_click, win); + elm_box_pack_end(bx, o); + evas_object_show(o); + + o = elm_button_add(win); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(o, "Copy"); + evas_object_smart_callback_add(o, "clicked", _cb_select_copy_click, win); + elm_box_pack_end(bx, o); + evas_object_show(o); + + o = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, o); + + o = elm_button_add(win); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(o, "Select"); + evas_object_smart_callback_add(o, "clicked", _cb_select_select_click, win); + elm_box_pack_end(bx, o); + evas_object_show(o); + + o = elm_button_add(win); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(o, "Cancel"); + evas_object_smart_callback_add(o, "clicked", _cb_select_cancel_click, win); + elm_box_pack_end(bx, o); + evas_object_show(o); + + return pop; +}