* Rewrite the entry widget

It is now splitted in 3 files:
 - e_editable.c that implements a generic single-line editable object
that could be used later by other widgets such as the slider or a
spinner.
 - e_entry.c that implements an entry smart object using an editable
object.
 - e_widget_entry.c that embeds an entry smart object in a widget.

So far, text insertion and deletion have been implemented. It also
supports cursor movement and mouse selection. The text also no longer
gets out of the bounds of the entry.

Things to come:
- Password mode
- Copy/Paste
- Make it actually themable, for now, the colors/font/style are
hardcoded


SVN revision: 24575
This commit is contained in:
moom 2006-08-11 21:48:18 +00:00 committed by moom
parent c848e1cf5a
commit 4eddbf00ca
13 changed files with 1834 additions and 1017 deletions

View File

@ -1,6 +1,5 @@
images {
image: "entry.png" COMP;
image: "entry_focus.png" COMP;
}
group {
@ -16,13 +15,6 @@ group {
border: 8 8 8 8;
}
}
description {
state: "focus" 0.0;
inherit: "default" 0.0;
image {
normal: "entry_focus.png";
}
}
}
part {
name: "entry_focus";
@ -30,10 +22,14 @@ group {
state: "default" 0.0;
visible: 0;
color: 255 255 255 0;
image {
normal: "entry_focus.png";
border: 8 8 8 8;
}
image {
normal: "focus.png";
border: 7 7 7 7;
middle: 0;
}
fill {
smooth: 0;
}
}
description {
state: "focus" 0.0;
@ -49,12 +45,12 @@ group {
state: "default" 0.0;
rel1 {
relative: 0.0 0.0;
offset: 4 3;
offset: 4 4;
to: "entry";
}
rel2 {
relative: 1.0 1.0;
offset: -5 -4;
offset: -5 -5;
to: "entry";
}
}
@ -66,7 +62,7 @@ group {
signal: "focus_in";
source: "";
action: STATE_SET "focus" 0.0;
transition: LINEAR 0.2;
transition: DECELERATE 0.2;
target: "entry_focus";
}
program {
@ -74,7 +70,7 @@ group {
signal: "focus_out";
source: "";
action: STATE_SET "default" 0.0;
transition: LINEAR 0.2;
transition: ACCELERATE 0.5;
target: "entry_focus";
}
}

View File

@ -326,7 +326,6 @@ e17_about_sky5.png \
e17_about_sky_overlay.png \
focus.png \
entry.png \
entry_focus.png \
e17_scrollbar_hdrag_thumb.png \
e17_scrollbar_vdrag_thumb.png \
e17_fileman_bg.png \

Binary file not shown.

View File

@ -85,6 +85,7 @@ e_dialog.h \
e_about.h \
e_theme_about.h \
e_apps_cache.h \
e_editable.h \
e_entry.h \
e_fileman.h \
e_fileman_smart.h \
@ -228,6 +229,7 @@ e_dialog.c \
e_about.c \
e_theme_about.c \
e_apps_cache.c \
e_editable.c \
e_entry.c \
e_fileman.c \
e_fileman_smart.c \

1296
src/bin/e_editable.c Normal file

File diff suppressed because it is too large Load Diff

42
src/bin/e_editable.h Normal file
View File

@ -0,0 +1,42 @@
/*
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#ifdef E_TYPEDEFS
#else
#ifndef E_EDITABLE_H
#define E_EDITABLE_H
EAPI Evas_Object *e_editable_add (Evas *evas);
EAPI void e_editable_text_set (Evas_Object *editable, const char *text);
EAPI const char *e_editable_text_get (Evas_Object *editable);
EAPI char *e_editable_text_range_get (Evas_Object *editable, int start, int end);
EAPI int e_editable_text_length_get (Evas_Object *editable);
EAPI int e_editable_insert (Evas_Object *editable, int pos, const char *text);
EAPI int e_editable_delete (Evas_Object *editable, int start, int end);
EAPI void e_editable_cursor_pos_set (Evas_Object *editable, int pos);
EAPI int e_editable_cursor_pos_get (Evas_Object *editable);
EAPI void e_editable_cursor_move_to_start (Evas_Object *editable);
EAPI void e_editable_cursor_move_to_end (Evas_Object *editable);
EAPI void e_editable_cursor_move_left (Evas_Object *editable);
EAPI void e_editable_cursor_move_right (Evas_Object *editable);
EAPI void e_editable_cursor_show (Evas_Object *editable);
EAPI void e_editable_cursor_hide (Evas_Object *editable);
EAPI void e_editable_selection_pos_set (Evas_Object *editable, int pos);
EAPI int e_editable_selection_pos_get (Evas_Object *editable);
EAPI void e_editable_selection_move_to_start (Evas_Object *editable);
EAPI void e_editable_selection_move_to_end (Evas_Object *editable);
EAPI void e_editable_selection_move_left (Evas_Object *editable);
EAPI void e_editable_selection_move_right (Evas_Object *editable);
EAPI void e_editable_select_all (Evas_Object *editable);
EAPI void e_editable_unselect_all (Evas_Object *editable);
EAPI void e_editable_selection_show (Evas_Object *editable);
EAPI void e_editable_selection_hide (Evas_Object *editable);
EAPI void e_editable_selectable_set (Evas_Object *editable, int selectable);
EAPI int e_editable_selectable_get (Evas_Object *editable);
EAPI void e_editable_char_size_get (Evas_Object *editable, int *w, int *h);
#endif
#endif

File diff suppressed because it is too large Load Diff

View File

@ -2,52 +2,20 @@
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#ifdef E_TYPEDEFS
typedef struct _E_Event_Entry_Change E_Event_Entry_Change;
#else
#ifndef E_ENTRY_H
#define E_ENTRY_H
struct _E_Event_Entry_Change
{
Evas_Object *object;
char *keyname;
char *key;
char *string;
};
EAPI Evas_Object *e_entry_add (Evas *evas);
EAPI void e_entry_text_set (Evas_Object *entry, const char *text);
EAPI const char *e_entry_text_get (Evas_Object *entry);
EAPI void e_entry_clear (Evas_Object *entry);
EAPI Evas_Object *e_editable_text_add(Evas *evas);
EAPI void e_editable_text_text_set(Evas_Object *object, const char *text);
EAPI const char *e_entry_text_get(Evas_Object *object);
EAPI void e_editable_text_insert(Evas_Object *object, const char *text);
EAPI void e_editable_text_delete_char_before(Evas_Object *object);
EAPI void e_editable_text_delete_char_after(Evas_Object *object);
EAPI void e_editable_text_cursor_move_at_start(Evas_Object *object);
EAPI void e_editable_text_cursor_move_at_end(Evas_Object *object);
EAPI void e_editable_text_cursor_move_left(Evas_Object *object);
EAPI void e_editable_text_cursor_move_right(Evas_Object *object);
EAPI void e_editable_text_cursor_show(Evas_Object *object);
EAPI void e_editable_text_cursor_hide(Evas_Object *object);
EAPI int e_entry_init(void);
EAPI int e_entry_shutdown(void);
EAPI Evas_Object *e_entry_add(Evas *evas);
EAPI void e_entry_text_set (Evas_Object *entry, const char *text);
EAPI const char *e_editable_text_text_get(Evas_Object *object);
EAPI void e_entry_text_insert (Evas_Object *entry, const char *text);
EAPI void e_entry_delete_char_before(Evas_Object *object);
EAPI void e_entry_delete_char_after(Evas_Object *object);
EAPI void e_entry_cursor_move_at_start(Evas_Object *object);
EAPI void e_entry_cursor_move_at_end(Evas_Object *object);
EAPI void e_entry_cursor_move_left(Evas_Object *object);
EAPI void e_entry_cursor_move_right(Evas_Object *object);
EAPI void e_entry_cursor_show(Evas_Object *object);
EAPI void e_entry_cursor_hide(Evas_Object *object);
EAPI void e_entry_change_handler_set(Evas_Object *object, void (*func)(void *data, Evas_Object *entry, char *key), void *data);
EAPI void e_entry_focus(Evas_Object *object);
EAPI void e_entry_unfocus(Evas_Object *object);
EAPI void e_entry_min_size_get(Evas_Object *object, Evas_Coord *mw, Evas_Coord *mh);
EAPI void e_entry_min_size_get (Evas_Object *entry, Evas_Coord *minw, Evas_Coord *minh);
EAPI void e_entry_focus (Evas_Object *entry);
EAPI void e_entry_unfocus (Evas_Object *entry);
EAPI void e_entry_enable (Evas_Object *entry);
EAPI void e_entry_disable (Evas_Object *entry);
#endif
#endif

View File

@ -970,9 +970,7 @@ _e_fm_file_rename_start(E_Fm_Icon *icon)
{
icon->sd->state = E_FILEMAN_STATE_RENAME;
icon->sd->entry_obj = e_entry_add(icon->sd->evas);
evas_object_focus_set(icon->sd->entry_obj, 1);
evas_object_show(icon->sd->entry_obj);
e_entry_cursor_show(icon->sd->entry_obj);
e_entry_focus(icon->sd->entry_obj);
e_fm_icon_edit_entry_set(icon->icon_obj, icon->sd->entry_obj);
e_fm_icon_title_set(icon->icon_obj, "");
@ -980,7 +978,6 @@ _e_fm_file_rename_start(E_Fm_Icon *icon)
// e_fm_mouse_up_handler = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_UP,
// _e_fm_win_mouse_up_cb, icon);
//e_grabinput_get(icon->sd->win->evas_win, 1, icon->sd->win->evas_win);
e_entry_cursor_move_at_start(icon->sd->entry_obj);
e_entry_text_set(icon->sd->entry_obj, icon->file->name);
// e_fm_grab_time = ecore_time_get();

View File

@ -17,6 +17,7 @@
#include "e_menu.h"
#include "e_icon.h"
#include "e_box.h"
#include "e_editable.h"
#include "e_entry.h"
#include "e_init.h"
#include "e_int_menus.h"

View File

@ -237,7 +237,7 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf
if (cfdata->auth_method == 0) e_widget_disabled_set(ob, 1);
#endif
_e_desklock_passwd_cb_change(cfdata, ob);
e_widget_entry_on_change_callback_set(ob, _e_desklock_passwd_cb_change, cfdata);
e_widget_on_change_hook_set(ob, _e_desklock_passwd_cb_change, cfdata);
e_widget_min_size_set(ob, 200, 25);
e_widget_framelist_object_append(of, ob);
@ -424,7 +424,7 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data
#endif
_e_desklock_passwd_cb_change(cfdata, ob);
e_widget_entry_on_change_callback_set(ob, _e_desklock_passwd_cb_change, cfdata);
e_widget_on_change_hook_set(ob, _e_desklock_passwd_cb_change, cfdata);
e_widget_min_size_set(ob, 200, 25);
e_widget_framelist_object_append(of, ob);

View File

@ -2,34 +2,112 @@
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#include "e.h"
typedef struct _E_Widget_Data E_Widget_Data;
struct _E_Widget_Data
{
Evas_Object *o_entry;
Evas_Object *obj;
char **valptr;
void (*on_change_func) (void *data, Evas_Object *obj);
void *on_change_data;
char **text_location;
};
/* local subsystem functions */
static void _e_wid_del_hook(Evas_Object *obj);
static void _e_wid_focus_hook(Evas_Object *obj);
static void _e_wid_disable_hook(Evas_Object *obj);
static void _e_wid_on_change_hook(void *data, Evas_Object *obj);
//static void _e_wid_signal_cb1(void *data, Evas_Object *obj, const char *emission, const char *source);
static void _e_wid_focus_steal(void *data, Evas *e, Evas_Object *obj, void *event_info);
static void _e_wid_text_change(void *data, Evas_Object *entry, char *key);
/* local subsystem functions */
static void _e_wid_changed_cb(void *data, Evas_Object *obj, void *event_info);
/* externally accessible functions */
/**
* Creates a new entry widget
*
* @param evas the evas where to add the new entry widget
* @param text_location the location where to store the text of the entry.
* The current value will be used to initialize the entry
* @return Returns the new entry widget
*/
EAPI Evas_Object *
e_widget_entry_add(Evas *evas, char **text_location)
{
Evas_Object *obj, *o;
E_Widget_Data *wd;
Evas_Coord minw, minh;
obj = e_widget_add(evas);
e_widget_del_hook_set(obj, _e_wid_del_hook);
e_widget_focus_hook_set(obj, _e_wid_focus_hook);
e_widget_disable_hook_set(obj, _e_wid_disable_hook);
wd = calloc(1, sizeof(E_Widget_Data));
e_widget_data_set(obj, wd);
wd->text_location = text_location;
o = e_entry_add(evas);
wd->o_entry = o;
evas_object_show(o);
e_widget_sub_object_add(obj, o);
e_widget_resize_object_set(obj, o);
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _e_wid_focus_steal, obj);
if ((text_location) && (*text_location))
e_entry_text_set(o, *text_location);
e_entry_min_size_get(o, &minw, &minh);
e_widget_min_size_set(obj, minw, minh);
evas_object_smart_callback_add(o, "changed", _e_wid_changed_cb, obj);
return obj;
}
/**
* Sets the text of the entry widget
*
* @param entry an entry widget
* @param text the text to set
*/
EAPI void
e_widget_entry_text_set(Evas_Object *entry, const char *text)
{
E_Widget_Data *wd;
if (!(entry) || (!(wd = e_widget_data_get(entry))))
return;
e_entry_text_set(wd->o_entry, text);
}
/**
* Gets the text of the entry widget
*
* @param entry an entry widget
* @return Returns the text of the entry widget
*/
EAPI const char *
e_widget_entry_text_get(Evas_Object *entry)
{
E_Widget_Data *wd;
if (!(entry) || (!(wd = e_widget_data_get(entry))))
return NULL;
return e_entry_text_get(wd->o_entry);
}
/* TODO, TODOC */
EAPI void
e_widget_entry_password_set(Evas_Object *obj, int password)
{
}
/* Private functions */
static void
_e_wid_del_hook(Evas_Object *obj)
{
E_Widget_Data *wd;
wd = e_widget_data_get(obj);
if (!(obj) || (!(wd = e_widget_data_get(obj))))
return;
free(wd);
}
@ -37,33 +115,28 @@ static void
_e_wid_focus_hook(Evas_Object *obj)
{
E_Widget_Data *wd;
if (!(obj) || (!(wd = e_widget_data_get(obj))))
return;
wd = e_widget_data_get(obj);
if (e_widget_focus_get(obj))
{
e_entry_focus(wd->o_entry);
evas_object_focus_set(wd->o_entry, 1);
e_entry_cursor_move_at_end(wd->o_entry);
e_entry_cursor_show(wd->o_entry);
}
e_entry_focus(wd->o_entry);
else
{
e_entry_unfocus(wd->o_entry);
evas_object_focus_set(wd->o_entry, 0);
e_entry_cursor_hide(wd->o_entry);
}
e_entry_unfocus(wd->o_entry);
}
static void
_e_wid_disable_hook(Evas_Object *obj)
{
E_Widget_Data *wd;
if (!(obj) || (!(wd = e_widget_data_get(obj))))
return;
wd = e_widget_data_get(obj);
if (e_widget_disabled_get(obj))
edje_object_signal_emit(wd->o_entry, "disabled", "");
e_entry_disable(wd->o_entry);
else
edje_object_signal_emit(wd->o_entry, "enabled", "");
e_entry_enable(wd->o_entry);
}
static void
@ -73,97 +146,21 @@ _e_wid_focus_steal(void *data, Evas *e, Evas_Object *obj, void *event_info)
}
static void
_e_wid_on_change_hook(void *data, Evas_Object *obj)
{
E_Widget_Data *wd;
wd = e_widget_data_get(obj);
if(wd->on_change_func)
wd->on_change_func(wd->on_change_data, obj);
}
static void
_e_wid_text_change(void *data, Evas_Object *entry, char *key)
_e_wid_changed_cb(void *data, Evas_Object *obj, void *event_info)
{
Evas_Object *entry;
E_Widget_Data *wd;
const char *text;
if (!(entry = data) || (!(wd = e_widget_data_get(entry))))
return;
wd = data;
E_FREE(*(wd->valptr));
text = e_entry_text_get(wd->o_entry);
if (!text)
*(wd->valptr) = strdup("");
else
*(wd->valptr) = strdup(text);
e_widget_change(wd->obj);
}
/* externally accessible functions */
EAPI Evas_Object *
e_widget_entry_add(Evas *evas, char **val)
{
Evas_Object *obj, *o;
E_Widget_Data *wd;
Evas_Coord mw, mh;
obj = e_widget_add(evas);
e_widget_on_change_hook_set(obj, _e_wid_on_change_hook, NULL);
e_widget_del_hook_set(obj, _e_wid_del_hook);
e_widget_focus_hook_set(obj, _e_wid_focus_hook);
e_widget_disable_hook_set(obj, _e_wid_disable_hook);
wd = calloc(1, sizeof(E_Widget_Data));
wd->valptr = val;
wd->obj = obj;
wd->on_change_func = NULL;
wd->on_change_data = NULL;
e_widget_data_set(obj, wd);
o = e_entry_add(evas);
wd->o_entry = o;
evas_object_show(o);
e_entry_min_size_get(o, &mw, &mh);
e_widget_min_size_set(obj, mw, mh);
if (*(wd->valptr))
e_entry_text_set(wd->o_entry, *(wd->valptr));
e_widget_sub_object_add(obj, o);
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _e_wid_focus_steal, obj);
e_widget_resize_object_set(obj, o);
e_entry_change_handler_set(wd->o_entry, _e_wid_text_change, wd);
return obj;
}
void
e_widget_entry_text_set(Evas_Object *entry, const char *text)
{
E_Widget_Data *wd;
wd = e_widget_data_get(entry);
e_entry_text_set(wd->o_entry, text);
E_FREE(*(wd->valptr));
*(wd->valptr) = strdup(text);
}
EAPI void
e_widget_entry_on_change_callback_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data)
{
E_Widget_Data *wd;
wd = e_widget_data_get(obj);
wd->on_change_func = func;
wd->on_change_data = data;
}
EAPI void
e_widget_entry_password_set(Evas_Object *obj, int pw)
{
E_Widget_Data *wd;
wd = e_widget_data_get(obj);
// FIXME: need password mode for entry.
// e_entry_password_set(wd->o_entry, pw);
if (wd->text_location)
{
text = e_widget_entry_text_get(entry);
free(*wd->text_location);
*wd->text_location = text ? strdup(text) : NULL;
}
e_widget_change(data);
}

View File

@ -6,10 +6,11 @@
#ifndef E_WIDGET_ENTRY_H
#define E_WIDGET_ENTRY_H
EAPI Evas_Object *e_widget_entry_add(Evas *evas, char **val);
EAPI void e_widget_entry_text_set(Evas_Object *entry, const char *text);
EAPI void e_widget_entry_text_insert (Evas_Object *entry, const char *text);
EAPI void e_widget_entry_on_change_callback_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data);
EAPI void e_widget_entry_password_set(Evas_Object *obj, int pw);
EAPI Evas_Object *e_widget_entry_add (Evas *evas, char **text_location);
EAPI void e_widget_entry_text_set (Evas_Object *entry, const char *text);
EAPI const char *e_widget_entry_text_get (Evas_Object *entry);
EAPI void e_widget_entry_clear (Evas_Object *entry);
EAPI void e_widget_entry_password_set (Evas_Object *entry, int password);
#endif
#endif