*/
typedef std::function<void()> ChangedCallback;
+ KeypadEntry();
+
/**
* @return Entered number
*/
void insert(char c);
/**
- * @brief Remove last character from the current entry.
+ * @brief Erase character before the cursor or current selection if exists.
*/
- void popBack();
+ void erase();
/**
* @brief Erase current entry.
private:
virtual Evas_Object *onCreate(Evas_Object *parent) override;
+ virtual void onCreated() override;
+
static void onFocused(void *data, Evas_Object *obj, void *event_info);
static void onUnfocused(void *data, Evas_Object *obj, void *event_info);
void onChanged(Evas_Object *obj, void *event_info);
+ int calcFontSize();
+ void updateFontSize();
+
+ int m_FontSize;
+ int m_Length;
ChangedCallback m_OnChanged;
};
}
#include <efl_extension.h>
+#define TEXT_MIN_SIZE 56
+#define TEXT_MAX_SIZE 76
+#define STYLE_BUFFER_SIZE 256
+
using namespace Phone::Dialer;
+KeypadEntry::KeypadEntry()
+ : m_FontSize(TEXT_MAX_SIZE), m_Length(0)
+{
+}
+
std::string KeypadEntry::getNumber() const
{
std::string number;
elm_entry_entry_insert(getEvasObject(), str);
}
-void KeypadEntry::popBack()
+void KeypadEntry::erase()
{
if (!elm_entry_selection_get(getEvasObject())) {
int pos = elm_entry_cursor_pos_get(getEvasObject());
static Elm_Entry_Filter_Accept_Set filter = { "+*#;,1234567890", NULL };
elm_entry_markup_filter_append(entry, elm_entry_filter_accept_set, &filter);
- elm_entry_text_style_user_push(entry, "DEFAULT='font=Tizen:style=Light font_size=76 color=#fff align=center'");
eext_entry_selection_back_event_allow_set(entry, EINA_TRUE);
evas_object_smart_callback_add(entry, "focused",
return entry;
}
+void KeypadEntry::onCreated()
+{
+ updateFontSize();
+}
+
void KeypadEntry::onFocused(void *data, Evas_Object *obj, void *event_info)
{
edje_color_class_set("entry/default/cursor", 250, 250, 250, 255, 0, 0, 0, 0, 0, 0, 0, 0);
void KeypadEntry::onChanged(Evas_Object *obj, void *event_info)
{
+ const char *text = elm_entry_entry_get(getEvasObject());
+ int prevLength = m_Length;
+ m_Length = text ? strlen(text) : 0;
+
+ if ((m_Length > prevLength && m_FontSize > TEXT_MIN_SIZE)
+ || (m_Length < prevLength && m_FontSize < TEXT_MAX_SIZE)) {
+ m_FontSize = calcFontSize();
+ updateFontSize();
+ }
+
if (m_OnChanged) {
m_OnChanged();
}
}
+
+int KeypadEntry::calcFontSize()
+{
+ int entryWidth = 0, textWidth = 0;
+ Evas_Object *textblock = elm_entry_textblock_get(getEvasObject());
+ evas_object_geometry_get(getEvasObject(), nullptr, nullptr, &entryWidth, nullptr);
+ evas_object_textblock_size_native_get(textblock, &textWidth, nullptr);
+
+ int fontSize = m_FontSize;
+ if (textWidth > 0) {
+ fontSize = (fontSize * entryWidth) / textWidth;
+ if (fontSize < TEXT_MIN_SIZE) {
+ fontSize = TEXT_MIN_SIZE;
+ } else if (fontSize > TEXT_MAX_SIZE) {
+ fontSize = TEXT_MAX_SIZE;
+ }
+ } else {
+ fontSize = TEXT_MAX_SIZE;
+ }
+
+ return fontSize;
+}
+
+void KeypadEntry::updateFontSize()
+{
+ char buffer[STYLE_BUFFER_SIZE];
+ snprintf(buffer, sizeof(buffer), "DEFAULT='font=Tizen:style=Light font_size=%d color=#fafafa align=%s'",
+ m_FontSize, m_FontSize == TEXT_MAX_SIZE ? "center" : "left");
+ elm_entry_text_style_user_pop(getEvasObject());
+ elm_entry_text_style_user_push(getEvasObject(), buffer);
+}