Evas_Object *conformant = NULL;
view::CounterView *counter_ = NULL;
+ Ecore_Timer *timer_ = NULL;
+ bool isLongpressed_ = false;
+
+ enum class ButtonArrowDirection {
+ ARROW_UP,
+ ARROW_DOWN,
+ };
+
struct Time {
Time() : Hour(0), Min(0), Sec(0) {}
unsigned int Hour, Min, Sec;
const char *part, Evas_Smart_Cb cb);
void CreateSelector();
+ void CreateSelectorsButton(const char* type, ButtonArrowDirection direction);
void CreateMenuButtons();
void CreateEntry(Evas_Object *parent, const char *part);
void CreateEntries(Evas_Object *parent);
void UpdateView();
void UpdateTime();
+ void UpdateSetTime(const char *part);
void UnfocusEntries();
static const char *GROUP;
static const char *GetEdjeFilePath(void);
+ static Eina_Bool TimerCb(void *data);
static void StartButtonClicked(void *data, Evas_Object *obj, void *event_info);
static void PauseButtonClicked(void *data, Evas_Object *obj, void *event_info);
static void CancelButtonClicked(void *data, Evas_Object *obj, void *event_info);
static void ResumeButtonClicked(void *data, Evas_Object *obj, void *event_info);
static void ResetButtonClicked(void *data, Evas_Object *obj, void *event_info);
- static void ButtonClickedCb(void *data, Evas_Object *obj, const char *emission, const char *source);
+ static void ButtonPressedCb(void *data, Evas_Object *obj, void *event_info);
+ static void ButtonUnpressedCb(void *data, Evas_Object *obj, void *event_info);
static void EntryFocusedCb(void *data, Evas_Object *obj, void *event_info);
static void EntryUnfocusedCb(void *data, Evas_Object *obj, void *event_info);
static void EntryChangedCb(void *data, Evas_Object *obj, void *event_info);
}
swallow { "sw.btn.start"; scale;
desc { "default";
- align: 0.5 0.5;
max: 500 -1;
rel1.to: "btn.bg";
rel2.to: "btn.bg";
rel2 { to_x: "sw.content"; }
}
}
- group { "btn.hour.inc"; scale;
- source: "timer_button_inc";
+ swallow { "sw.hour.inc"; scale;
desc { "default";
fixed: 1 1;
min: 146 76;
rel1 { relative: 1.0 0.0; to_x: "pd.selector.left"; }
rel2 { relative: 1.0 0.0; to_y: "pd.content.top"; }
}
+ desc { "hidden";
+ inherit: "default";
+ hid;
+ }
}
- group { "btn.minute.inc"; scale;
- source: "timer_button_inc";
+ swallow { "sw.minute.inc"; scale;
desc { "default";
fixed: 1 1;
min: 146 76;
max: 146 76;
align: 0.5 1.0;
- rel1 { relative: 1.0 0.0; to_x: "btn.hour.inc"; }
+ rel1 { relative: 1.0 0.0; to_x: "sw.hour.inc"; }
rel2 {
relative: 0.0 0.0;
- to_x: "btn.second.inc";
+ to_x: "sw.second.inc";
to_y: "pd.content.top";
}
}
+ desc { "hidden";
+ inherit: "default";
+ hid;
+ }
}
- group { "btn.second.inc"; scale;
- source: "timer_button_inc";
+ swallow { "sw.second.inc"; scale;
desc { "default";
fixed: 1 1;
min: 146 76;
to_y: "pd.content.top";
}
}
+ desc { "hidden";
+ inherit: "default";
+ hid;
+ }
}
- group { "btn.hour.dec"; scale;
- source: "timer_button_dec";
+ swallow { "sw.hour.dec"; scale;
desc { "default";
fixed: 1 1;
min: 146 76;
to_y: "pd.content.bottom";
}
}
+ desc { "hidden";
+ inherit: "default";
+ hid;
+ }
}
- group { "btn.minute.dec"; scale;
- source: "timer_button_dec";
+ swallow { "sw.minute.dec"; scale;
desc { "default";
fixed: 1 1;
min: 146 76;
align: 0.5 0.0;
rel1 {
relative: 1.0 1.0;
- to_x: "btn.hour.dec";
+ to_x: "sw.hour.dec";
to_y: "pd.content.bottom";
}
- rel2 { relative: 0.0 1.0; to_x: "btn.second.dec"; }
+ rel2 { relative: 0.0 1.0; to_x: "sw.second.dec"; }
+ }
+ desc { "hidden";
+ inherit: "default";
+ hid;
}
}
- group { "btn.second.dec"; scale;
- source: "timer_button_dec";
+ swallow { "sw.second.dec"; scale;
desc { "default";
fixed: 1 1;
min: 146 76;
rel1 { relative: 0.0 1.0; to_y: "pd.content.bottom"; }
rel2 { relative: 0.0 1.0; to_x: "pd.selector.right"; }
}
+ desc { "hidden";
+ inherit: "default";
+ hid;
+ }
}
spacer { "pd.time.desc"; scale;
desc { "default";
min: 146 42;
max: 146 42;
align: 0.5 1.0;
- rel1.to_x: "btn.hour.inc";
+ rel1.to_x: "sw.hour.inc";
rel2 {
relative: 1.0 0.0;
- to_x: "btn.hour.inc";
+ to_x: "sw.hour.inc";
to_y: "pd.time.desc";
}
text {
inherit: "default";
rel2 {
relative: 1.0 0.0;
- to_x: "btn.hour.inc";
+ to_x: "sw.hour.inc";
to_y: "pd.content.top";
}
}
min: 146 42;
max: 146 42;
align: 0.5 1.0;
- rel1.to_x: "btn.minute.inc";
+ rel1.to_x: "sw.minute.inc";
rel2 {
relative: 1.0 0.0;
- to_x: "btn.minute.inc";
+ to_x: "sw.minute.inc";
to_y: "pd.time.desc";
}
text {
inherit: "default";
rel2 {
relative: 1.0 0.0;
- to_x: "btn.minute.inc";
+ to_x: "sw.minute.inc";
to_y: "pd.content.top";
}
}
min: 146 42;
max: 146 42;
align: 0.5 1.0;
- rel1.to_x: "btn.second.inc";
+ rel1.to_x: "sw.second.inc";
rel2 {
relative: 1.0 0.0;
- to_x: "btn.second.inc";
+ to_x: "sw.second.inc";
to_y: "pd.time.desc";
}
text {
inherit: "default";
rel2 {
relative: 1.0 0.0;
- to_x: "btn.second.inc";
+ to_x: "sw.second.inc";
to_y: "pd.content.top";
}
}
}
program {
+ signal: "arrow.buttons.show";
+ source: "timer";
+ action: STATE_SET "default";
+ target: "sw.hour.inc";
+ target: "sw.minute.inc";
+ target: "sw.second.inc";
+ target: "sw.hour.dec";
+ target: "sw.minute.dec";
+ target: "sw.second.dec";
+ }
+ program {
+ signal: "arrow.buttons.hide";
+ source: "timer";
+ action: STATE_SET "hidden";
+ target: "sw.hour.inc";
+ target: "sw.minute.inc";
+ target: "sw.second.inc";
+ target: "sw.hour.dec";
+ target: "sw.minute.dec";
+ target: "sw.second.dec";
+ }
+ program {
signal: "menu.startup.show";
source: "timer";
action: STATE_SET "default";
group { "Time_selector";
parts {
- swallow { "sw.entry.hour"; scale;
+ textblock { scale;
desc {
- max: -1 204;
- align: 0.5 0.5;
- rel1.relative: 0.0 0.0;
- rel2.relative: 0.3 1.0;
+ text.style: "ATO010";
+ text.text: ":";
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: (2/3) 1.0; }
}
}
textblock { scale;
desc {
text.style: "ATO010";
text.text: ":";
- rel1 { relative: 1.0 0.0; to: "sw.entry.hour"; }
- rel2 { relative: 0.0 1.0; to: "sw.entry.minute"; }
+ rel1 { relative: (1/3) 0.0; }
+ rel2 { relative: 1.0 1.0; }
}
}
- swallow { "sw.entry.minute"; scale;
+ swallow { "sw.entry.hour"; scale;
desc {
- max: -1 204;
- align: 0.5 0.5;
- rel1.relative: 0.35 0.0;
- rel2.relative: 0.65 1.0;
+ min: 190 204;
+ max: 190 204;
+ fixed: 1 1;
+ rel2.relative: (1/3) 1.0;
}
}
- textblock { scale;
+ swallow { "sw.entry.minute"; scale;
desc {
- text.style: "ATO010";
- text.text: ":";
- rel1 { relative: 1.0 0.0; to: "sw.entry.minute"; }
- rel2 { relative: 0.0 1.0; to: "sw.entry.second"; }
+ min: 190 204;
+ max: 190 204;
+ fixed: 1 1;
}
}
swallow { "sw.entry.second"; scale;
desc {
- max: -1 204;
- align: 1.0 0.5;
- rel1.relative: 0.70 0.0;
- rel2.relative: 1.0 1.0;
+ min: 190 204;
+ max: 190 204;
+ fixed: 1 1;
+ rel1.relative: (2/3) 0.0;
}
}
}
}
- group { "timer_button_inc";
-
+ group { "elm/button/base/arrow";
parts {
- image { "btn.arrow.up";
+ image { "btn.arrow";
desc { "default";
image.normal: "alarm_picker_arrow_up.png";
color: 250 250 250 60;
}
- desc { "hidden";
+ desc { "down";
inherit: "default";
- hid;
+ image.normal: "alarm_picker_arrow_down.png";
}
}
image { "btn.bg"; scale;
desc { "default";
color: 0 0 0 20;
- rel1.to: "btn.arrow.up";
- rel2.to: "btn.arrow.up";
+ rel1.to: "btn.arrow";
+ rel2.to: "btn.arrow";
image.normal: "arrow_bg_horizontal.png";
hid;
}
desc { "contracted";
inherit: "pressed";
}
- desc { "hidden";
- inherit: "default";
- hid;
- }
}
program {
- signal: "mouse,clicked,*";
- source: "btn.arrow.up";
- action: SIGNAL_EMIT "btn,clicked" "";
+ signal: "arrow.down";
+ source: "timer";
+ action: STATE_SET "down";
+ target: "btn.arrow";
}
program {
- signal: "mouse,down,*";
- source: "btn.arrow.up";
- action: STATE_SET "pressed";
- target: "btn.bg";
- after: "btn.bg.expand";
+ signal: "mouse,clicked,*";
+ source: "btn.arrow";
+ action: SIGNAL_EMIT "elm,action,click" "";
}
program {
- name: "btn.bg.expand";
- action: STATE_SET "expanded";
- target: "btn.bg";
- transition: DECEL 0.03;
+ signal: "mouse,down,*";
+ source: "btn.arrow";
+ script {
+ set_state(PART:"btn.bg", "pressed", 0.0);
+ run_program(PROGRAM:"btn.bg.expand");
+ emit("elm,action,press", "");
+ }
}
program {
signal: "mouse,up,*";
- source: "btn.arrow.up";
- action: STATE_SET "contracted";
- target: "btn.bg";
+ source: "btn.arrow";
transition: DECEL 0.03;
- after: "btn.bg.hide";
- }
- program {
- name: "btn.bg.hide";
- action: STATE_SET "default";
- target: "btn.bg";
- }
- program {
- name: "arrow.btn.hide";
- signal: "arrow.btn.hide";
- source: "timer";
- action: STATE_SET "hidden";
- target: "btn.bg";
- target: "btn.arrow.up";
- }
- program {
- name: "arrow.btn.show";
- signal: "arrow.btn.show";
- source: "timer";
- action: STATE_SET "default";
- target: "btn.bg";
- target: "btn.arrow.up";
- }
- }
- }
-
- group { "timer_button_dec";
-
- parts {
- image { "btn.arrow.down";
- desc { "default";
- image.normal: "alarm_picker_arrow_down.png";
- color: 250 250 250 60;
- }
- desc { "hidden";
- inherit: "default";
- hid;
- }
- }
- image { "btn.bg"; scale;
- desc { "default";
- color: 0 0 0 20;
- rel1.to: "btn.arrow.down";
- rel2.to: "btn.arrow.down";
- image.normal: "arrow_bg_horizontal.png";
- hid;
- }
- desc { "pressed";
- inherit: "default";
- fixed: 1 1;
- min: 102 53;
- max: 102 53;
- vis;
- }
- desc { "expanded";
- inherit: "default";
- vis;
- }
- desc { "contracted";
- inherit: "pressed";
- }
- desc { "hidden";
- inherit: "default";
- hid;
+ script {
+ set_state(PART:"btn.bg", "contracted", 0.0);
+ run_program(PROGRAM:"btn.bg.hide");
+ emit("elm,action,unpress", "");
}
}
program {
- signal: "mouse,clicked,*";
- source: "btn.arrow.down";
- action: SIGNAL_EMIT "btn,clicked" "";
- }
- program {
- signal: "mouse,down,*";
- source: "btn.arrow.down";
- action: STATE_SET "pressed";
- target: "btn.bg";
- after: "btn.bg.expand";
- }
- program {
name: "btn.bg.expand";
action: STATE_SET "expanded";
target: "btn.bg";
transition: DECEL 0.03;
}
program {
- signal: "mouse,up,*";
- source: "btn.arrow.down";
- action: STATE_SET "contracted";
- target: "btn.bg";
- transition: DECEL 0.03;
- after: "btn.bg.hide";
- }
- program {
name: "btn.bg.hide";
action: STATE_SET "default";
+ transition: DECEL 0.03;
target: "btn.bg";
}
program {
- name: "arrow.btn.hide";
- signal: "arrow.btn.hide";
- source: "timer";
- action: STATE_SET "hidden";
- target: "btn.bg";
- target: "btn.arrow.down";
- }
- program {
name: "arrow.btn.show";
signal: "arrow.btn.show";
source: "timer";
action: STATE_SET "default";
target: "btn.bg";
- target: "btn.arrow.down";
+ target: "btn.arrow";
}
}
}
elm_object_signal_emit(object->layout_, "menu.startup.show", "timer");
}
-void TimerView::ButtonClickedCb(void *data, Evas_Object *obj, const char *emission, const char *source)
+void TimerView::UpdateSetTime(const char *part)
+{
+ if (!strcmp(part, "sw.hour.inc")) {
+ set_time_.Hour++;
+ if (set_time_.Hour > 99)
+ set_time_.Hour = 0;
+ } else if (!strcmp(part, "sw.minute.inc")) {
+ set_time_.Min++;
+ if (set_time_.Min > 59)
+ set_time_.Min = 0;
+ } else if (!strcmp(part, "sw.second.inc")) {
+ set_time_.Sec++;
+ if (set_time_.Sec > 59)
+ set_time_.Sec = 0;
+ } else if (!strcmp(part, "sw.hour.dec")) {
+ set_time_.Hour--;
+ if (set_time_.Hour > 99)
+ set_time_.Hour = 99;
+ } else if (!strcmp(part, "sw.minute.dec")) {
+ set_time_.Min--;
+ if (set_time_.Min > 59)
+ set_time_.Min = 59;
+ } else if (!strcmp(part, "sw.second.dec")) {
+ set_time_.Sec--;
+ if (set_time_.Sec > 59)
+ set_time_.Sec = 59;
+ }
+
+ UpdateView();
+}
+
+Eina_Bool TimerView::TimerCb(void *data)
{
- DBG("Button clicked: %s", source);
+ Evas_Object *button = (Evas_Object *)data;
- TimerView *object = static_cast<TimerView *>(data);
+ TimerView *object = static_cast<TimerView *>(evas_object_data_get(button, "object"));
+
+ double current_interval = ecore_timer_interval_get(object->timer_);
+ if (current_interval > 0.1)
+ ecore_timer_interval_set(object->timer_, 0.1);
object->UnfocusEntries();
- if (!strcmp(source, "btn.hour.inc:")) {
- object->set_time_.Hour++;
- if (object->set_time_.Hour > 99)
- object->set_time_.Hour = 0;
- } else if (!strcmp(source, "btn.minute.inc:")) {
- object->set_time_.Min++;
- if (object->set_time_.Min > 59)
- object->set_time_.Min = 0;
- } else if (!strcmp(source, "btn.second.inc:")) {
- object->set_time_.Sec++;
- if (object->set_time_.Sec > 59)
- object->set_time_.Sec = 0;
- } else if (!strcmp(source, "btn.hour.dec:")) {
- object->set_time_.Hour--;
- if (object->set_time_.Hour > 99)
- object->set_time_.Hour = 99;
- } else if (!strcmp(source, "btn.minute.dec:")) {
- object->set_time_.Min--;
- if (object->set_time_.Min > 59)
- object->set_time_.Min = 59;
- } else if (!strcmp(source, "btn.second.dec:")) {
- object->set_time_.Sec--;
- if (object->set_time_.Sec > 59)
- object->set_time_.Sec = 59;
- }
+ char *part = (char *)evas_object_data_get(button, "btn.type");
+ object->UpdateSetTime(part);
- object->UpdateView();
+ object->isLongpressed_ = true;
+
+ return EINA_TRUE;
+}
+
+void TimerView::ButtonPressedCb(void *data, Evas_Object *obj, void *event_info)
+{
+ TimerView *object = static_cast<TimerView *>(data);
+
+ if (object->timer_)
+ ecore_timer_del(object->timer_);
+
+ object->isLongpressed_ = false;
+
+ object->timer_ = ecore_timer_add(0.75, TimerCb, obj);
+}
+
+void TimerView::ButtonUnpressedCb(void *data, Evas_Object *obj, void *event_info)
+{
+ TimerView *object = static_cast<TimerView *>(data);
+
+ ecore_timer_del(object->timer_);
+ object->timer_ = nullptr;
+
+ char *part = (char *)evas_object_data_get(obj, "btn.type");
+
+ if (!object->isLongpressed_)
+ object->UpdateSetTime(part);
}
void TimerView::DisplayTime(int hour, int min, int sec)
*second = set_time_.Sec;
}
+void TimerView::CreateSelectorsButton(const char *part, ButtonArrowDirection direction)
+{
+ Evas_Object *button = elm_button_add(layout_);
+
+ evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ elm_object_part_content_set(layout_, part, button);
+
+ evas_object_data_set(button, "object", this);
+ evas_object_data_set(button, "btn.type", part);
+
+ evas_object_smart_callback_add(button, "pressed", ButtonPressedCb, this);
+ evas_object_smart_callback_add(button, "unpressed", ButtonUnpressedCb, this);
+
+ if (!elm_object_style_set(button, "arrow"))
+ ERR("Button style setting failed");
+
+ if (direction == ButtonArrowDirection::ARROW_DOWN)
+ elm_object_signal_emit(button, "arrow.down", "timer");
+
+ evas_object_show(button);
+}
+
void TimerView::CreateSelector()
{
selector_ = elm_layout_add(layout_);
CreateEntries(selector_);
- elm_object_signal_callback_add(layout_, "btn,clicked", "btn.hour.inc:", ButtonClickedCb, this);
- elm_object_signal_callback_add(layout_, "btn,clicked", "btn.minute.inc:", ButtonClickedCb, this);
- elm_object_signal_callback_add(layout_, "btn,clicked", "btn.second.inc:", ButtonClickedCb, this);
+ elm_theme_overlay_add(NULL, GetEdjeFilePath());
+
+ CreateSelectorsButton("sw.hour.inc", ButtonArrowDirection::ARROW_UP);
+ CreateSelectorsButton("sw.minute.inc", ButtonArrowDirection::ARROW_UP);
+ CreateSelectorsButton("sw.second.inc", ButtonArrowDirection::ARROW_UP);
+ CreateSelectorsButton("sw.hour.dec", ButtonArrowDirection::ARROW_DOWN);
+ CreateSelectorsButton("sw.minute.dec", ButtonArrowDirection::ARROW_DOWN);
+ CreateSelectorsButton("sw.second.dec", ButtonArrowDirection::ARROW_DOWN);
- elm_object_signal_callback_add(layout_, "btn,clicked", "btn.hour.dec:", ButtonClickedCb, this);
- elm_object_signal_callback_add(layout_, "btn,clicked", "btn.minute.dec:", ButtonClickedCb, this);
- elm_object_signal_callback_add(layout_, "btn,clicked", "btn.second.dec:", ButtonClickedCb, this);
}
void TimerView::CreateEntries(Evas_Object *parent)
ShowSelector();
elm_object_signal_emit(layout_, "menu.startup.show", "timer");
- elm_object_signal_emit(layout_, "arrow.btn.show", "timer");
+ elm_object_signal_emit(layout_, "arrow.buttons.show", "timer");
}
void TimerView::ShowRunningMenu(void)
ShowCounter();
- elm_object_signal_emit(layout_, "arrow.btn.hide", "timer");
elm_object_signal_emit(layout_, "menu.running.show", "timer");
+ elm_object_signal_emit(layout_, "arrow.buttons.hide", "timer");
}
void TimerView::ShowEditingMenu(void)
ShowSelector();
- elm_object_signal_emit(layout_, "arrow.btn.show", "timer");
elm_object_signal_emit(layout_, "menu.editing.show", "timer");
+ elm_object_signal_emit(layout_, "arrow.buttons.show", "timer");
}
void TimerView::ShowPausedMenu(void)