this is a better mouse trap than before. it actually works like it
should, and it probably doesn't require [much] cleaning before
committing.
Index: src/lib/etk_entry.c
===================================================================
RCS file: /root/e17/proto/etk/src/lib/etk_entry.c,v
retrieving revision 1.1.1.7
diff -u -r1.1.1.7 etk_entry.c
--- src/lib/etk_entry.c 15 Jan 2006 11:36:25 -0000 1.1.1.7
+++ src/lib/etk_entry.c 27 Jan 2006 14:52:15 -0000
@@ -18,6 +18,11 @@
ETK_ENTRY_NUM_SIGNALS
};
+enum _Etk_Entry_Property_Id
+{
+ ETK_ENTRY_EDITABLE_PROPERTY
+};
+
static void _etk_entry_constructor(Etk_Entry *entry);
static void _etk_entry_realize_cb(Etk_Object *object, void *data);
static void _etk_entry_unrealize_cb(Etk_Object *object, void *data);
@@ -26,6 +31,9 @@
static void _etk_entry_mouse_out_cb(Etk_Object *object, Etk_Event_Mouse_In_Out *event, void *data);
static void _etk_entry_focus_cb(Etk_Object *object, void *data);
static void _etk_entry_unfocus_cb(Etk_Object *object, void *data);
+static void _etk_entry_property_set(Etk_Object *object, int property_id, Etk_Property_Value *value);
+static void _etk_entry_property_get(Etk_Object *object, int property_id, Etk_Property_Value *value);
+
static Etk_Signal *_etk_entry_signals[ETK_ENTRY_NUM_SIGNALS];
@@ -48,6 +56,11 @@
entry_type = etk_type_new("Etk_Entry", ETK_WIDGET_TYPE, sizeof(Etk_Entry), ETK_CONSTRUCTOR(_etk_entry_constructor), NULL);
_etk_entry_signals[ETK_ENTRY_TEXT_CHANGED_SIGNAL] = etk_signal_new("text_changed", entry_type, -1, etk_marshaller_VOID__VOID, NULL, NULL);
+
+ etk_type_property_add(entry_type, "editable", ETK_ENTRY_EDITABLE_PROPERTY, ETK_PROPERTY_BOOL, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_bool(ETK_TRUE));
+
+ entry_type->property_set = _etk_entry_property_set;
+ entry_type->property_get = _etk_entry_property_get;
}
return entry_type;
@@ -87,6 +100,31 @@
return etk_editable_text_object_text_get(entry->editable_object);
}
+/**
+ * @brief Sets whether the user can edit the text in the entry
+ * @param entry an entry
+ * @param is_editable ETK_TRUE if it's editable, ETK_FALSE if it's not.
+ */
+void etk_entry_set_editable(Etk_Entry *entry, Etk_Bool is_editable)
+{
+ if (!entry)
+ return;
+ entry->editable = is_editable;
+ etk_object_notify(ETK_OBJECT(entry), "editable");
+}
+
+/**
+ * @brief Retrieves whether the entry is editable
+ * @param entry an entry
+ * @return ETK_TRUE if it's editable, ETK_FALSE if it's not.
+ */
+Etk_Bool etk_entry_get_editable(Etk_Entry *entry)
+{
+ if (!entry)
+ return ETK_FALSE;
+ return entry->editable;
+}
+
/**************************
*
* Etk specific functions
@@ -99,6 +137,7 @@
if (!entry)
return;
+ entry->editable = ETK_TRUE;
entry->editable_object = NULL;
etk_signal_connect("realize", ETK_OBJECT(entry), ETK_CALLBACK(_etk_entry_realize_cb), NULL);
@@ -110,6 +149,42 @@
etk_signal_connect("unfocus", ETK_OBJECT(entry), ETK_CALLBACK(_etk_entry_unfocus_cb), NULL);
}
+/* Sets the property whose id is "property_id" to the value "value" */
+static void _etk_entry_property_set(Etk_Object *object, int property_id, Etk_Property_Value *value)
+{
+ Etk_Entry *entry;
+
+ if (!(entry = ETK_ENTRY(object)) || !value)
+ return;
+
+ switch (property_id)
+ {
+ case ETK_ENTRY_EDITABLE_PROPERTY:
+ etk_entry_set_editable(entry, etk_property_value_bool_get(value));
+ break;
+ default:
+ break;
+ }
+}
+
+/* Gets the value of the property whose id is "property_id" */
+static void _etk_entry_property_get(Etk_Object *object, int property_id, Etk_Property_Value *value)
+{
+ Etk_Entry *entry;
+
+ if (!(entry = ETK_ENTRY(object)) || !value)
+ return;
+
+ switch (property_id)
+ {
+ case ETK_ENTRY_EDITABLE_PROPERTY:
+ etk_property_value_bool_set(value, entry->editable);
+ break;
+ default:
+ break;
+ }
+}
+
/**************************
*
* Callbacks and handlers
@@ -153,11 +228,7 @@
if (!(entry = ETK_ENTRY(object)) || !entry->editable_object)
return;
- if (strcmp(key_event->key, "BackSpace") == 0)
- text_changed = etk_editable_text_object_delete_char_before(entry->editable_object);
- else if (strcmp(key_event->key, "Delete") == 0)
- text_changed = etk_editable_text_object_delete_char_after(entry->editable_object);
- else if (strcmp(key_event->key, "Left") == 0)
+ if (strcmp(key_event->key, "Left") == 0)
etk_editable_text_object_cursor_move_left(entry->editable_object);
else if (strcmp(key_event->key, "Right") == 0)
etk_editable_text_object_cursor_move_right(entry->editable_object);
@@ -165,8 +236,12 @@
etk_editable_text_object_cursor_move_at_start(entry->editable_object);
else if (strcmp(key_event->key, "End") == 0)
etk_editable_text_object_cursor_move_at_end(entry->editable_object);
- else
- text_changed = etk_editable_text_object_insert(entry->editable_object, key_event->string);
+ else if (strcmp(key_event->key, "BackSpace") == 0 && entry->editable)
+ text_changed = etk_editable_text_object_delete_char_before(entry->editable_object);
+ else if (strcmp(key_event->key, "Delete") == 0 && entry->editable)
+ text_changed = etk_editable_text_object_delete_char_after(entry->editable_object);
+ else if (entry->editable)
+ text_changed = etk_editable_text_object_insert(entry->editable_object, key_event->string);
if (text_changed)
etk_signal_emit(_etk_entry_signals[ETK_ENTRY_TEXT_CHANGED_SIGNAL], object, NULL);
@@ -199,6 +274,7 @@
if (!(entry = ETK_ENTRY(object)) || !entry->editable_object)
return;
+ etk_editable_text_object_cursor_move_at_end(entry->editable_object);
etk_editable_text_object_cursor_show(entry->editable_object);
}
Index: src/lib/etk_entry.h
===================================================================
RCS file: /root/e17/proto/etk/src/lib/etk_entry.h,v
retrieving revision 1.1.1.2
diff -u -r1.1.1.2 etk_entry.h
--- src/lib/etk_entry.h 1 Nov 2005 12:24:51 -0000 1.1.1.2
+++ src/lib/etk_entry.h 27 Jan 2006 14:52:15 -0000
@@ -29,6 +29,8 @@
Etk_Widget widget;
Evas_Object *editable_object;
+
+ Etk_Bool editable : 1;
};
Etk_Type *etk_entry_type_get();
@@ -37,6 +39,9 @@
void etk_entry_text_set(Etk_Entry *entry, const char *text);
const char *etk_entry_text_get(Etk_Entry *entry);
+void etk_entry_set_editable(Etk_Entry *entry, Etk_Bool is_editable);
+Etk_Bool etk_entry_get_editable(Etk_Entry *entry);
+
/** @} */
#endif