diff --git a/src/bin/edi_consolepanel.c b/src/bin/edi_consolepanel.c index df7cf62..bc3af32 100644 --- a/src/bin/edi_consolepanel.c +++ b/src/bin/edi_consolepanel.c @@ -16,6 +16,7 @@ #include "edi_consolepanel.h" #include "mainview/edi_mainview.h" +#include "edi_theme.h" #include "edi_config.h" #include "edi_private.h" @@ -349,11 +350,13 @@ _edi_consolepanel_config_changed(void *data EINA_UNUSED, int type EINA_UNUSED, v EINA_LIST_FOREACH(_edi_console_code->widgets, item, widget) { elm_code_widget_font_set(widget, _edi_project_config->font.name, _edi_project_config->font.size); + edi_theme_elm_code_set(widget, _edi_project_config->gui.theme); } EINA_LIST_FOREACH(_edi_test_code->widgets, item, widget) { elm_code_widget_font_set(widget, _edi_project_config->font.name, _edi_project_config->font.size); + edi_theme_elm_code_set(widget, _edi_project_config->gui.theme); } return ECORE_CALLBACK_RENEW; @@ -376,6 +379,7 @@ void edi_consolepanel_add(Evas_Object *parent) widget = elm_code_widget_add(parent, code); elm_obj_code_widget_font_set(widget, _edi_project_config->font.name, _edi_project_config->font.size); + edi_theme_elm_code_set(widget, _edi_project_config->gui.theme); elm_obj_code_widget_gravity_set(widget, 0.0, 1.0); efl_event_callback_add(widget, &ELM_CODE_EVENT_LINE_LOAD_DONE, _edi_consolepanel_line_cb, NULL); efl_event_callback_add(widget, ELM_OBJ_CODE_WIDGET_EVENT_LINE_CLICKED, _edi_consolepanel_clicked_cb, code); @@ -410,6 +414,7 @@ void edi_testpanel_add(Evas_Object *parent) widget = elm_code_widget_add(parent, code); elm_obj_code_widget_font_set(widget, _edi_project_config->font.name, _edi_project_config->font.size); + edi_theme_elm_code_set(widget, _edi_project_config->gui.theme); elm_obj_code_widget_gravity_set(widget, 0.0, 1.0); efl_event_callback_add(widget, &ELM_CODE_EVENT_LINE_LOAD_DONE, _edi_testpanel_line_cb, NULL); efl_event_callback_add(widget, ELM_OBJ_CODE_WIDGET_EVENT_LINE_CLICKED, _edi_consolepanel_clicked_cb, code); diff --git a/src/bin/edi_debugpanel.c b/src/bin/edi_debugpanel.c index 07d4fc1..0adcdfd 100644 --- a/src/bin/edi_debugpanel.c +++ b/src/bin/edi_debugpanel.c @@ -7,6 +7,7 @@ #include #include "edi_debug.h" +#include "edi_theme.h" #include "edi_debugpanel.h" #include "edi_config.h" @@ -36,6 +37,7 @@ static Eina_Bool _edi_debugpanel_config_changed(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED) { elm_code_widget_font_set(_info_widget, _edi_project_config->font.name, _edi_project_config->font.size); + edi_theme_elm_code_set(_info_widget, _edi_project_config->gui.theme); return ECORE_CALLBACK_RENEW; } @@ -332,6 +334,7 @@ void edi_debugpanel_add(Evas_Object *parent) code = elm_code_create(); widget = elm_code_widget_add(parent, code); elm_obj_code_widget_font_set(widget, _edi_project_config->font.name, _edi_project_config->font.size); + edi_theme_elm_code_set(_info_widget, _edi_project_config->gui.theme); elm_obj_code_widget_gravity_set(widget, 0.0, 1.0); efl_event_callback_add(widget, &ELM_CODE_EVENT_LINE_LOAD_DONE, _edi_debugpanel_line_cb, NULL); evas_object_size_hint_weight_set(widget, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); diff --git a/src/bin/edi_logpanel.c b/src/bin/edi_logpanel.c index b1bf92a..3150531 100644 --- a/src/bin/edi_logpanel.c +++ b/src/bin/edi_logpanel.c @@ -7,6 +7,7 @@ #include #include "edi_logpanel.h" +#include "edi_theme.h" #include "edi_config.h" #include "edi_private.h" @@ -72,6 +73,7 @@ static Eina_Bool _edi_logpanel_config_changed(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED) { elm_code_widget_font_set(_info_widget, _edi_project_config->font.name, _edi_project_config->font.size); + edi_theme_elm_code_set(_info_widget, _edi_project_config->gui.theme); return ECORE_CALLBACK_RENEW; } @@ -90,6 +92,7 @@ void edi_logpanel_add(Evas_Object *parent) code = elm_code_create(); widget = elm_code_widget_add(parent, code); + edi_theme_elm_code_set(widget, _edi_project_config->gui.theme); elm_obj_code_widget_font_set(widget, _edi_project_config->font.name, _edi_project_config->font.size); elm_obj_code_widget_gravity_set(widget, 0.0, 1.0); efl_event_callback_add(widget, &ELM_CODE_EVENT_LINE_LOAD_DONE, _edi_logpanel_line_cb, NULL); diff --git a/src/bin/edi_main.c b/src/bin/edi_main.c index 105b88d..970edaa 100644 --- a/src/bin/edi_main.c +++ b/src/bin/edi_main.c @@ -8,10 +8,12 @@ #include #include +#include #include #include "Edi.h" #include "edi_config.h" +#include "edi_theme.h" #include "edi_filepanel.h" #include "edi_file.h" #include "edi_logpanel.h" @@ -1370,6 +1372,7 @@ static Eina_Bool _edi_config_changed(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED) { _edi_toolbar_set_visible(!_edi_project_config->gui.toolbar_hidden); + edi_theme_window_alpha_set(); return ECORE_CALLBACK_RENEW; } @@ -1518,6 +1521,8 @@ edi_open(const char *inputpath) elm_win_resize_object_add(win, hbx); evas_object_show(hbx); + edi_theme_window_alpha_set(); + tb = edi_toolbar_setup(hbx); elm_box_pack_start(hbx, tb); _edi_toolbar = tb; diff --git a/src/bin/edi_searchpanel.c b/src/bin/edi_searchpanel.c index 347339d..c780962 100644 --- a/src/bin/edi_searchpanel.c +++ b/src/bin/edi_searchpanel.c @@ -9,6 +9,7 @@ #include #include "edi_file.h" #include "edi_searchpanel.h" +#include "edi_theme.h" #include "edi_config.h" #include "mainview/edi_mainview.h" @@ -25,6 +26,7 @@ static Eina_Bool _edi_searchpanel_config_changed_cb(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED) { elm_code_widget_font_set(_info_widget, _edi_project_config->font.name, _edi_project_config->font.size); + edi_theme_elm_code_set(_info_widget, _edi_project_config->gui.theme); return ECORE_CALLBACK_RENEW; } @@ -241,6 +243,7 @@ edi_searchpanel_add(Evas_Object *parent) code = elm_code_create(); widget = elm_code_widget_add(parent, code); + edi_theme_elm_code_set(widget, _edi_project_config->gui.theme); elm_obj_code_widget_font_set(widget, _edi_project_config->font.name, _edi_project_config->font.size); elm_obj_code_widget_gravity_set(widget, 0.0, 1.0); efl_event_callback_add(widget, ELM_OBJ_CODE_WIDGET_EVENT_LINE_CLICKED, _edi_searchpanel_line_clicked_cb, NULL); @@ -271,6 +274,7 @@ static Eina_Bool _edi_taskspanel_config_changed_cb(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED) { elm_code_widget_font_set(_tasks_widget, _edi_project_config->font.name, _edi_project_config->font.size); + edi_theme_elm_code_set(_tasks_widget, _edi_project_config->gui.theme); return ECORE_CALLBACK_RENEW; } @@ -318,6 +322,7 @@ edi_taskspanel_add(Evas_Object *parent) code = elm_code_create(); widget = elm_code_widget_add(parent, code); + edi_theme_elm_code_set(widget, _edi_project_config->gui.theme); elm_obj_code_widget_font_set(widget, _edi_project_config->font.name, _edi_project_config->font.size); elm_obj_code_widget_gravity_set(widget, 0.0, 1.0); efl_event_callback_add(widget, &ELM_CODE_EVENT_LINE_LOAD_DONE, _edi_taskspanel_line_cb, NULL); diff --git a/src/bin/edi_theme.h b/src/bin/edi_theme.h new file mode 100644 index 0000000..d6d3992 --- /dev/null +++ b/src/bin/edi_theme.h @@ -0,0 +1,73 @@ +#ifndef __EDI_THEME_H__ +#define __EDI_THEME_H__ + +#include +#include + +typedef struct _Edi_Theme { + char *name; + char *path; + char *title; +} Edi_Theme; + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file + * @brief These routines used for managing Edi theme actions. + */ + +/** + * @brief Theme management functions. + * @defgroup Theme + * + * @{ + * + * Management of theming actions. + * + */ + +/** + * Set the Edi theme by name on an Elm_Code_Widget. + * + * @param obj The Elm_Code_Widget object to apply the theme to. + * @param name The name of the theme to apply. + * + * @ingroup Theme + */ +void edi_theme_elm_code_set(Evas_Object *obj, const char *name); + +/** + * Get a list of all themes available. + * + * @return a list of all available themes as Edi_Theme instances. + * + * @ingroup Theme + */ +Eina_List *edi_theme_themes_get(void); + +/** + * Get theme obj by its name. + * + * @return the theme obj matching the name. + * + * @ingroup Theme + */ +Edi_Theme *edi_theme_theme_by_name(const char *name); + +void edi_theme_window_alpha_set(void); +void edi_theme_elm_code_alpha_set(Evas_Object *obj); +/** + * @} + */ + + +#ifdef __cplusplus +} +#endif + + + +#endif diff --git a/src/bin/editor/edi_editor.c b/src/bin/editor/edi_editor.c index 27001ef..84d540c 100644 --- a/src/bin/editor/edi_editor.c +++ b/src/bin/editor/edi_editor.c @@ -13,6 +13,7 @@ #include "edi_content.h" #include "edi_filepanel.h" #include "edi_config.h" +#include "edi_theme.h" #include "language/edi_language_provider.h" @@ -1202,6 +1203,8 @@ _edi_editor_config_changed(void *data, int type EINA_UNUSED, void *event EINA_UN code->config.trim_whitespace = _edi_config->trim_whitespace; elm_obj_code_widget_font_set(widget, _edi_project_config->font.name, _edi_project_config->font.size); + edi_theme_elm_code_alpha_set(widget); + edi_theme_elm_code_set(widget, _edi_project_config->gui.theme); elm_obj_code_widget_show_whitespace_set(widget, _edi_project_config->gui.show_whitespace); elm_obj_code_widget_tab_inserts_spaces_set(widget, _edi_project_config->gui.tab_inserts_spaces); elm_obj_code_widget_line_width_marker_set(widget, _edi_project_config->gui.width_marker); @@ -1357,6 +1360,8 @@ edi_editor_add(Evas_Object *parent, Edi_Mainview_Item *item) elm_code_widget_line_numbers_set(widget, EINA_TRUE); _edi_editor_config_changed(widget, 0, NULL); + edi_theme_elm_code_set(widget, _edi_project_config->gui.theme); + editor = calloc(1, sizeof(*editor)); editor->entry = widget; editor->mimetype = item->mimetype; diff --git a/src/bin/mainview/edi_mainview.c b/src/bin/mainview/edi_mainview.c index ad4e212..b39acb0 100644 --- a/src/bin/mainview/edi_mainview.c +++ b/src/bin/mainview/edi_mainview.c @@ -16,6 +16,7 @@ #include "edi_content_provider.h" #include "edi_searchpanel.h" #include "edi_file.h" +#include "edi_theme.h" #include "edi_private.h" #include "edi_config.h" @@ -290,6 +291,8 @@ _edi_mainview_split_config_changed_cb(void *data, int type EINA_UNUSED, void *ev Elm_Code_Widget *widget = data; elm_code_widget_font_set(widget, _edi_project_config->font.name, _edi_project_config->font.size); + edi_theme_elm_code_alpha_set(widget); + edi_theme_elm_code_set(widget, _edi_project_config->gui.theme); return ECORE_CALLBACK_RENEW; } diff --git a/src/bin/meson.build b/src/bin/meson.build index 50a3da3..493fb98 100644 --- a/src/bin/meson.build +++ b/src/bin/meson.build @@ -23,6 +23,8 @@ src = files([ 'edi_private.h', 'edi_searchpanel.c', 'edi_searchpanel.h', + 'edi_theme.c', + 'edi_theme.h', ]) bin_dir = include_directories('.') diff --git a/src/bin/screens/edi_settings.c b/src/bin/screens/edi_settings.c index f17a213..8cf2dd0 100644 --- a/src/bin/screens/edi_settings.c +++ b/src/bin/screens/edi_settings.c @@ -9,6 +9,7 @@ #include "edi_screens.h" #include "edi_config.h" #include "edi_debug.h" +#include "edi_theme.h" #include "edi_private.h" @@ -145,11 +146,74 @@ _edi_settings_font_preview_add(Evas_Object *parent, const char *font_name, int f return widget; } +static void +_edi_settings_display_theme_pressed_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info) +{ + Edi_Theme *theme; + const char *text = elm_object_item_text_get(event_info); + + theme = elm_object_item_data_get(event_info); + + if (_edi_project_config->gui.theme) + eina_stringshare_del(_edi_project_config->gui.theme); + + _edi_project_config->gui.theme = eina_stringshare_add(theme->name); + _edi_project_config_save(); + + elm_object_text_set(obj, text); + elm_combobox_hover_end(obj); +} + +static char * +_edi_settings_display_theme_text_get_cb(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + Edi_Theme *current; + + current = data; + + return strdup(current->title); +} + +static void +_edi_settings_display_translucent_state_cb(void *data EINA_UNUSED, Evas_Object *obj, + void *event EINA_UNUSED) +{ + Evas_Object *slider, *check; + int state; + + check = obj; + slider = data; + + state = elm_check_state_get(check); + + _edi_project_config->gui.translucent = state; + _edi_project_config_save(); + + elm_object_disabled_set(slider, !state); +} + +static void +_edi_settings_display_alpha_changed_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + + _edi_project_config->gui.alpha = elm_slider_value_get(obj); + _edi_project_config_save(); +} + +static char * +_edi_settings_display_alpha_format(double value) +{ + return (char*)eina_stringshare_printf("%1.0f%%", (value/255)*100); +} + static Evas_Object * _edi_settings_display_create(Evas_Object *parent) { Evas_Object *container, *box, *frame, *label, *spinner, *check, *button, *preview; - Evas_Object *table; + Evas_Object *table, *combobox, *slider; + Elm_Genlist_Item_Class *itc; + Edi_Theme *theme; + Eina_List *themes, *l; container = elm_box_add(parent); evas_object_size_hint_weight_set(container, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); @@ -185,6 +249,82 @@ _edi_settings_display_create(Evas_Object *parent) elm_object_focus_set(button, EINA_TRUE); + label = elm_label_add(table); + elm_object_text_set(label, _("Color theme")); + evas_object_size_hint_align_set(label, EVAS_HINT_EXPAND, 0.5); + elm_table_pack(table, label, 0, 1, 1, 1); + evas_object_show(label); + + // START OF THEME SELECTOR + + combobox = elm_combobox_add(table); + evas_object_size_hint_weight_set(combobox, 0.75, 0.0); + evas_object_size_hint_align_set(combobox, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(combobox); + evas_object_smart_callback_add(combobox, "item,pressed", + _edi_settings_display_theme_pressed_cb, NULL); + + if (!_edi_project_config->gui.theme) + elm_object_text_set(combobox, edi_theme_theme_by_name("default")->title); + else + elm_object_text_set(combobox, edi_theme_theme_by_name(_edi_project_config->gui.theme)->title); + + elm_table_pack(table, combobox, 1, 1, 1, 1); + itc = elm_genlist_item_class_new(); + itc->item_style = "default"; + itc->func.text_get = _edi_settings_display_theme_text_get_cb; + + themes = edi_theme_themes_get(); + + EINA_LIST_FOREACH(themes, l, theme) + { + elm_genlist_item_append(combobox, itc, theme, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + } + + elm_genlist_realized_items_update(combobox); + elm_genlist_item_class_free(itc); + + // END OF THEME SELECTOR + + // START OF ALPHA SELECTOR + label = elm_label_add(table); + elm_object_text_set(label, _("Translucent")); + evas_object_size_hint_align_set(label, EVAS_HINT_EXPAND, 0.5); + elm_table_pack(table, label, 0, 2, 1, 1); + evas_object_show(label); + + slider = elm_slider_add(table); + check = elm_check_add(box); + elm_check_state_set(check, _edi_project_config->gui.translucent); + evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(check, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(table, check, 1, 2, 1, 1); + evas_object_show(check); + evas_object_smart_callback_add(check, "changed", + _edi_settings_display_translucent_state_cb, slider); + + label = elm_label_add(table); + elm_object_text_set(label, _("Alpha")); + evas_object_size_hint_align_set(label, EVAS_HINT_EXPAND, 0.5); + elm_table_pack(table, label, 0, 3, 1, 1); + evas_object_show(label); + + elm_object_disabled_set(slider, !_edi_project_config->gui.translucent); + evas_object_size_hint_align_set(slider, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(slider, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_slider_min_max_set(slider, 0, 255); + elm_slider_value_set(slider, _edi_project_config->gui.alpha); + elm_slider_span_size_set(slider, 255); + elm_slider_step_set(slider, 0.01); + elm_slider_units_format_function_set(slider, _edi_settings_display_alpha_format, + (void(*)(char*))eina_stringshare_del); + elm_slider_indicator_format_function_set(slider, _edi_settings_display_alpha_format, + (void(*)(char*))eina_stringshare_del); + elm_table_pack(table, slider, 1, 3, 1, 1); + evas_object_show(slider); + evas_object_smart_callback_add(slider, "slider,drag,stop", _edi_settings_display_alpha_changed_cb, NULL); + evas_object_smart_callback_add(slider, "delay,changed", _edi_settings_display_alpha_changed_cb, NULL); + label = elm_label_add(table); elm_object_text_set(label, _("Hide Toolbar")); evas_object_size_hint_align_set(label, EVAS_HINT_EXPAND, 0.5);