terminology/src/bin/options_colors.c

366 lines
11 KiB
C

#include "private.h"
#include <Elementary.h>
#include <assert.h>
#include "config.h"
#include "termio.h"
#include "options.h"
#include "options_colors.h"
static const char *mapping_names[] =
{
gettext_noop("Default"),
gettext_noop("Black"),
gettext_noop("Red"),
gettext_noop("Green"),
gettext_noop("Yellow"),
gettext_noop("Blue"),
gettext_noop("Magenta"),
gettext_noop("Cyan"),
gettext_noop("White"),
gettext_noop("Invisible"),
gettext_noop("Inverse"),
gettext_noop("Inverse Background")
};
typedef struct _Colors_Ctx {
Elm_Object_Item *colitem[4][12];
Evas_Object *colorsel;
Elm_Object_Item *curitem;
Evas_Object *colpal[4];
Evas_Object *label;
Evas_Object *reset;
Config *config;
Evas_Object *term;
Evas_Object *bg;
} Colors_Ctx;
static void
_cb_op_color_item_sel(void *data,
Evas_Object *_obj EINA_UNUSED,
void *event)
{
Colors_Ctx *ctx = data;
Elm_Object_Item *it = event;
int r = 0, g = 0, b = 0, a = 0;
int i, j;
if (ctx->curitem == it)
return;
if (ctx->curitem)
elm_colorselector_palette_item_selected_set(ctx->curitem, EINA_FALSE);
ctx->curitem = it;
elm_colorselector_palette_item_color_get(it, &r, &g, &b, &a);
elm_colorselector_color_set(ctx->colorsel, r, g, b, a);
for (j = 0; j < 4; j++)
{
for (i = 0; i < 12; i++)
{
if (i == COL_INVIS)
continue;
if (ctx->colitem[j][i] == it)
elm_object_text_set(ctx->label,
#if ENABLE_NLS
gettext(mapping_names[i])
#else
mapping_names[i]
#endif
);
}
}
}
static void
_cb_op_color_chg(void *data,
Evas_Object *obj,
void *_event EINA_UNUSED)
{
Colors_Ctx *ctx = data;
Config *config = ctx->config;
int r = 0, g = 0, b = 0, a = 0, rr = 0, gg = 0, bb = 0, aa = 0;
int i, j;
elm_colorselector_palette_item_color_get(ctx->curitem, &rr, &gg, &bb, &aa);
elm_colorselector_color_get(obj, &r, &g, &b, &a);
if ((r != rr) || (g != gg) || (b != bb) || (a != aa))
{
if (ctx->curitem)
elm_colorselector_palette_item_color_set(ctx->curitem, r, g, b, a);
elm_object_disabled_set(ctx->reset, EINA_FALSE);
config->colors_use = EINA_TRUE;
for (j = 0; j < 4; j++)
{
for (i = 0; i < 12; i++)
{
if (i == COL_INVIS)
continue;
if (ctx->colitem[j][i] == ctx->curitem)
{
config->colors[(j * 12) + i].r = r * a / 256;
config->colors[(j * 12) + i].g = g * a / 256;
config->colors[(j * 12) + i].b = b * a / 256;
config->colors[(j * 12) + i].a = a;
termio_config_update(ctx->term);
config_save(config);
return;
}
}
}
}
}
static void
_reset_config_colors(Colors_Ctx *ctx)
{
int i, j;
for (j = 0; j < 4; j++)
{
for (i = 0; i < 12; i++)
{
int r, g, b, a;
unsigned char rr = 0, gg = 0, bb = 0, aa = 0;
char buf[32];
if (i == COL_INVIS)
continue;
snprintf(buf, sizeof(buf) - 1, "c%i", j * 12 + i);
if (!edje_object_color_class_get(ctx->bg, buf,
&r,
&g,
&b,
&a,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL))
{
colors_standard_get(j, i, &rr, &gg, &bb, &aa);
}
else
{
rr = r;
gg = g;
bb = b;
aa = a;
}
ctx->config->colors[(j * 12) + i].r = rr;
ctx->config->colors[(j * 12) + i].g = gg;
ctx->config->colors[(j * 12) + i].b = bb;
ctx->config->colors[(j * 12) + i].a = aa;
}
}
}
static void
_cb_op_reset(void *data,
Evas_Object *_obj EINA_UNUSED,
void *_event EINA_UNUSED)
{
Colors_Ctx *ctx = data;
Evas_Object *term = ctx->term;
Config *config = ctx->config;
int r = 0, g = 0, b = 0, a = 0;
int i, j;
_reset_config_colors(ctx);
for (j = 0; j < 4; j++)
{
for (i = 0; i < 12; i++)
{
if (i == COL_INVIS)
continue;
elm_colorselector_palette_item_color_set
(ctx->colitem[j][i],
config->colors[(j * 12) + i].r,
config->colors[(j * 12) + i].g,
config->colors[(j * 12) + i].b,
config->colors[(j * 12) + i].a);
}
}
elm_object_disabled_set(ctx->reset, EINA_TRUE);
config->colors_use = EINA_FALSE;
elm_colorselector_palette_item_color_get(ctx->curitem, &r, &g, &b, &a);
elm_colorselector_color_set(ctx->colorsel, r, g, b, a);
termio_config_update(term);
config_save(config);
}
/* make color palettes wrap back. :) works with elm git. */
static void
_cb_op_scroller_resize(void *data,
Evas *_e EINA_UNUSED,
Evas_Object *_obj EINA_UNUSED,
void *_event EINA_UNUSED)
{
Colors_Ctx *ctx = data;
int i;
for (i = 0; i < 4; i++)
evas_object_resize(ctx->colpal[i], 1, 1);
}
static void
_parent_del_cb(void *data,
Evas *_e EINA_UNUSED,
Evas_Object *_obj EINA_UNUSED,
void *_event_info EINA_UNUSED)
{
Colors_Ctx *ctx = data;
free(ctx);
}
void
options_colors(Evas_Object *opbox, Evas_Object *term, Evas_Object *bg)
{
Config *config = termio_config_get(term);
Evas_Object *o, *fr, *bx, *sc, *bx2, *bx3, *bx4;
int i, j;
int r = 0, g = 0, b = 0, a = 0;
Colors_Ctx *ctx;
ctx = calloc(1, sizeof(*ctx));
assert(ctx);
ctx->config = config;
ctx->term = term;
ctx->bg = bg;
fr = o = elm_frame_add(opbox);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_object_text_set(o, _("Colors"));
elm_box_pack_end(opbox, o);
evas_object_show(o);
evas_object_event_callback_add(fr, EVAS_CALLBACK_DEL,
_parent_del_cb, ctx);
bx = o = elm_box_add(opbox);
elm_box_horizontal_set(o, EINA_TRUE);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.0);
elm_object_content_set(fr, o);
evas_object_show(o);
sc = o = elm_scroller_add(opbox);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_end(bx, o);
evas_object_show(o);
evas_object_event_callback_add(o, EVAS_CALLBACK_RESIZE,
_cb_op_scroller_resize, ctx);
bx3 = o = elm_box_add(opbox);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.0);
elm_object_content_set(sc, o);
evas_object_show(o);
if (!config->colors_use)
{
_reset_config_colors(ctx);
}
for (j = 0; j < 4; j++)
{
o = elm_label_add(opbox);
if (j == 0)
elm_object_text_set(o, _("Normal"));
else if (j == 1)
elm_object_text_set(o, _("Bright/Bold"));
else if (j == 2)
elm_object_text_set(o, _("Intense"));
else if (j == 3)
elm_object_text_set(o, _("Intense Bright/Bold"));
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
elm_box_pack_end(bx3, o);
evas_object_show(o);
ctx->colpal[j] = o = elm_colorselector_add(opbox);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
elm_colorselector_mode_set(o, ELM_COLORSELECTOR_PALETTE);
for (i = 0; i < 12; i++)
{
Elm_Object_Item *it;
if (i == COL_INVIS)
continue;
it = elm_colorselector_palette_color_add
(o,
config->colors[(j * 12) + i].r,
config->colors[(j * 12) + i].g,
config->colors[(j * 12) + i].b,
config->colors[(j * 12) + i].a);
ctx->colitem[j][i] = it;
if (i == 0 && j == 0)
{
ctx->curitem = ctx->colitem[0][0];
elm_colorselector_palette_item_selected_set(ctx->curitem, EINA_TRUE);
}
}
elm_box_pack_end(bx3, o);
evas_object_show(o);
evas_object_smart_callback_add(o, "color,item,selected",
_cb_op_color_item_sel, ctx);
if (j == 1)
{
o = elm_separator_add(opbox);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
elm_separator_horizontal_set(o, EINA_TRUE);
elm_box_pack_end(bx3, o);
evas_object_show(o);
}
}
bx2 = o = elm_box_add(opbox);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.0);
elm_box_pack_end(bx, o);
evas_object_show(o);
ctx->label = o = elm_label_add(opbox);
elm_object_text_set(o,
#if ENABLE_NLS
gettext(mapping_names[0])
#else
mapping_names[0]
#endif
);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
elm_box_pack_end(bx2, o);
evas_object_show(o);
ctx->colorsel = o = elm_colorselector_add(opbox);
elm_colorselector_palette_item_color_get(ctx->curitem, &r, &g, &b, &a);
elm_colorselector_color_set(o, r, g, b, a);
elm_colorselector_mode_set(o, ELM_COLORSELECTOR_COMPONENTS);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
elm_box_pack_end(bx2, o);
evas_object_show(o);
evas_object_smart_callback_add(o, "changed", _cb_op_color_chg, ctx);
bx4 = o = elm_box_add(opbox);
elm_box_horizontal_set(o, EINA_TRUE);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.0);
elm_box_pack_end(bx2, o);
evas_object_show(o);
ctx->reset = o = elm_button_add(opbox);
elm_object_disabled_set(o, !config->colors_use);
evas_object_size_hint_weight_set(o, 1.0, 0.0);
evas_object_size_hint_align_set(o, 1.0, 0.5);
elm_object_text_set(o, _("Reset all the colors"));
elm_box_pack_end(bx4, o);
evas_object_show(o);
evas_object_smart_callback_add(o, "clicked", _cb_op_reset, ctx);
}