From 6b0ec41464c8b30cc237bf4977baacf26da30dad Mon Sep 17 00:00:00 2001 From: Lukasz Stanislawski Date: Mon, 5 Sep 2016 15:09:27 +0200 Subject: [PATCH] AlarmView: implement adding alarms by clicking "+" Add floating button on main view. Handle request to add alarm via EventBus events. MainController is now responsible for handling EditAlarmView and EditAlarmPresenter lifecycle. Change-Id: I69fbc407dfe3fde2108a32d44ed9b6c4c149e56d --- clock/inc/Controller/MainController.h | 5 ++++ clock/inc/Model/AlarmEvent.h | 32 ++++++++++++++++++++++ clock/inc/Presenter/AlarmPresenter.h | 1 + clock/inc/View/AlarmView.h | 3 +++ clock/res/images/core_floating_icon_01.png | Bin 0 -> 2963 bytes clock/src/Controller/MainController.cpp | 23 ++++++++++++++-- clock/src/Model/AlarmEvent.cpp | 19 +++++++++++++ clock/src/Presenter/AlarmPresenter.cpp | 10 ++++--- clock/src/View/AlarmView.cpp | 42 ++++++++++++++++++++++++++--- clock/src/View/EditAlarmView.cpp | 3 +++ clock/src/View/MainView.cpp | 3 --- 11 files changed, 130 insertions(+), 11 deletions(-) create mode 100644 clock/inc/Model/AlarmEvent.h create mode 100644 clock/res/images/core_floating_icon_01.png create mode 100644 clock/src/Model/AlarmEvent.cpp diff --git a/clock/inc/Controller/MainController.h b/clock/inc/Controller/MainController.h index ca1e57c..06d4f92 100644 --- a/clock/inc/Controller/MainController.h +++ b/clock/inc/Controller/MainController.h @@ -85,6 +85,11 @@ namespace controller { * @brief Constructs MainController class object. */ MainController() {}; + + /** + * @brief Creates new "Edit/Create" alarm page. + */ + void CreateNewAlarmPage(); }; } diff --git a/clock/inc/Model/AlarmEvent.h b/clock/inc/Model/AlarmEvent.h new file mode 100644 index 0000000..347ee35 --- /dev/null +++ b/clock/inc/Model/AlarmEvent.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _CLOCK_ALARM_EVENT_H_ +#define _CLOCK_ALARM_EVENT_H_ + +#include "Utils/EventBus.h" + +namespace model { + class AlarmCreateRequestEvent : public utils::Event { + public: + AlarmCreateRequestEvent(); + static int EventType(); + private: + static int custom_type_; + }; +} /* model */ + +#endif diff --git a/clock/inc/Presenter/AlarmPresenter.h b/clock/inc/Presenter/AlarmPresenter.h index 88dfc7e..3528843 100644 --- a/clock/inc/Presenter/AlarmPresenter.h +++ b/clock/inc/Presenter/AlarmPresenter.h @@ -31,6 +31,7 @@ namespace presenter { model::AlarmProvider *model; void ShowAll(); void OnItemSelected(int idx); + void OnAddButtonClicked(); void OnItemActiveStatusChanged(int idx); void OnAlarmAddedEvent(utils::Event *e); }; diff --git a/clock/inc/View/AlarmView.h b/clock/inc/View/AlarmView.h index da10f46..4ae65a2 100644 --- a/clock/inc/View/AlarmView.h +++ b/clock/inc/View/AlarmView.h @@ -48,9 +48,12 @@ namespace view { static Elm_Genlist_Item_Class alarm_itc; static Evas_Object *ContentGet(void *data, Evas_Object *obj, const char *part); static char *TextGet(void *data, Evas_Object *obj, const char *part); + static void Del(void *data, Evas_Object *obj); static void ItemClicked(void *data, Evas_Object *obj, void *info); static void ItemRealized(void *data, Evas_Object *obj, void *info); + static void ButtonClicked(void *data, Evas_Object *obj, void *info); Evas_Object *genlist; + Evas_Object *content; SelectCallback onSelected; ToggleCallback onToggled; ButtonClickedCallback onClicked;; diff --git a/clock/res/images/core_floating_icon_01.png b/clock/res/images/core_floating_icon_01.png new file mode 100644 index 0000000000000000000000000000000000000000..7f487f9b586afaa35c8a415167f0e3c696d7afb2 GIT binary patch literal 2963 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 JPDHLkV1nMwfkyxU literal 0 HcmV?d00001 diff --git a/clock/src/Controller/MainController.cpp b/clock/src/Controller/MainController.cpp index 9cdc6f3..a2d2beb 100644 --- a/clock/src/Controller/MainController.cpp +++ b/clock/src/Controller/MainController.cpp @@ -17,9 +17,16 @@ #include "log.h" #include "View/MainView.h" #include "Controller/MainController.h" +#include "Utils/EventBus.h" +#include "View/EditAlarmView.h" +#include "Presenter/EditAlarmPresenter.h" +#include "Model/AlarmEvent.h" using namespace controller; using namespace view; +using namespace utils; +using namespace presenter; +using namespace model; MainController &MainController::GetInstance() { @@ -44,15 +51,27 @@ void MainController::Resume() int MainController::Init() { - DBG("Init()"); - MainView::GetInstance(); MainView::GetInstance().CreateContent(); + EventBus::RegisterHandler(AlarmCreateRequestEvent::EventType(), std::bind(&MainController::CreateNewAlarmPage, this)); + return 0; } void MainController::Deinit() { + EventBus::DeregisterHandler(AlarmCreateRequestEvent::EventType(), std::bind(&MainController::CreateNewAlarmPage, this)); +} + +void MainController::CreateNewAlarmPage() +{ + static EditAlarmView *view; + static EditAlarmPresenter *presenter; + + if (view) delete view; + if (presenter) delete presenter; + view = new EditAlarmView(); + presenter = new EditAlarmPresenter(nullptr, *view); } diff --git a/clock/src/Model/AlarmEvent.cpp b/clock/src/Model/AlarmEvent.cpp new file mode 100644 index 0000000..636704a --- /dev/null +++ b/clock/src/Model/AlarmEvent.cpp @@ -0,0 +1,19 @@ +#include "Model/AlarmEvent.h" + +using namespace model; +using namespace utils; + +int AlarmCreateRequestEvent::custom_type_; + +AlarmCreateRequestEvent::AlarmCreateRequestEvent() : + Event(AlarmCreateRequestEvent::EventType()) +{ +} + +int AlarmCreateRequestEvent::EventType() +{ + if (custom_type_ == 0) { + custom_type_ = EventBus::RegisterNewEventType(); + } + return custom_type_; +} diff --git a/clock/src/Presenter/AlarmPresenter.cpp b/clock/src/Presenter/AlarmPresenter.cpp index 02f2a95..e396774 100644 --- a/clock/src/Presenter/AlarmPresenter.cpp +++ b/clock/src/Presenter/AlarmPresenter.cpp @@ -1,5 +1,6 @@ #include "Presenter/AlarmPresenter.h" #include "Model/AlarmProviderEvent.h" +#include "Model/AlarmEvent.h" #include "Utils/EventBus.h" #include "log.h" @@ -11,9 +12,7 @@ using std::placeholders::_1; AlarmPresenter::AlarmPresenter(AlarmView *v, AlarmProvider *m) : view(v), model(m) { - //view.RegisterOnItemStatusChange(std::function<>()); - //view.RegisterOnItemSelected(std::function<>()); - //view.RegisterOnAlarmAddClicked(std::function<>()); + view->SetButtonClickedCallback(std::bind(&AlarmPresenter::OnAddButtonClicked, this)); EventBus::RegisterHandler(AlarmAddedEvent::EventType(), std::bind(&AlarmPresenter::OnAlarmAddedEvent, this, _1)); @@ -48,6 +47,11 @@ void AlarmPresenter::OnItemSelected(int idx) // emit new event AlarmEditRequest event } +void AlarmPresenter::OnAddButtonClicked() +{ + EventBus::FireEvent(new AlarmCreateRequestEvent()); +} + void AlarmPresenter::OnItemActiveStatusChanged(int idx) { // get Alarm reference diff --git a/clock/src/View/AlarmView.cpp b/clock/src/View/AlarmView.cpp index cf84ea6..78e2409 100644 --- a/clock/src/View/AlarmView.cpp +++ b/clock/src/View/AlarmView.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include "log.h" @@ -40,6 +41,7 @@ Elm_Genlist_Item_Class AlarmView::alarm_itc = { .item_style = "alarm", .func.content_get = AlarmView::ContentGet, .func.text_get = AlarmView::TextGet, + .func.del = AlarmView::Del, }; void AlarmView::ItemClicked(void *data, Evas_Object *obj, void *info) @@ -120,16 +122,44 @@ char *AlarmView::TextGet(void *data, Evas_Object *obj, const char *part) return NULL; } -AlarmView::AlarmView() +void AlarmView::Del(void *data, Evas_Object *obj) { - genlist = elm_genlist_add(MainView::GetInstance().GetEvasObject()); + ItemData *id = static_cast(data); + delete id->name; + delete id; +} +AlarmView::AlarmView() +{ + /* Base Layout */ + content = elm_layout_add(MainView::GetInstance().GetEvasObject()); + evas_object_size_hint_weight_set(content, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_layout_theme_set(content, "layout", "application", "default"); + evas_object_show(content); + + /* Genlist */ + genlist = elm_genlist_add(content); elm_genlist_homogeneous_set(genlist, EINA_TRUE); evas_object_size_hint_expand_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_smart_callback_add(genlist, "realized", AlarmView::ItemRealized, this); evas_object_show(genlist); + elm_object_content_set(content, genlist); + + /* Floating Button */ + Evas_Object *fb = eext_floatingbutton_add(content); + elm_object_part_content_set(content, "elm.swallow.floatingbutton", fb); + + /* Floating Button 1 */ + Evas_Object *btn = elm_button_add(fb); + evas_object_smart_callback_add(btn, "clicked", AlarmView::ButtonClicked, this); + Evas_Object *image = elm_image_add(fb); + elm_image_file_set(image, Utils::GetAppResourcePath(Utils::APP_DIR_RESOURCE, "images/core_floating_icon_01.png"), NULL); + elm_object_part_content_set(btn, "icon", image); + + elm_object_part_content_set(fb, "button1", btn); + elm_theme_extension_add(NULL, Utils::GetAppResourcePath(Utils::APP_DIR_RESOURCE, "edje/alarm.edj")); } @@ -198,5 +228,11 @@ void AlarmView::SetButtonClickedCallback(ButtonClickedCallback func) Evas_Object *AlarmView::GetEvasObject() { - return genlist; + return content; +} + +void AlarmView::ButtonClicked(void *data, Evas_Object *obj, void *event_info) +{ + AlarmView *view = static_cast(data); + if (view->onClicked) view->onClicked(); } diff --git a/clock/src/View/EditAlarmView.cpp b/clock/src/View/EditAlarmView.cpp index 5083435..eaa03a3 100644 --- a/clock/src/View/EditAlarmView.cpp +++ b/clock/src/View/EditAlarmView.cpp @@ -376,6 +376,9 @@ void EditAlarmView::CreateGenlistItems() void EditAlarmView::DestroyContent() { + evas_object_del(content_); + evas_object_del(left_btn_); + evas_object_del(right_btn_); } void EditAlarmView::PopupListItemSelectedCallback(void *data, Evas_Object *obj, void *event) diff --git a/clock/src/View/MainView.cpp b/clock/src/View/MainView.cpp index 3d6640d..910292b 100644 --- a/clock/src/View/MainView.cpp +++ b/clock/src/View/MainView.cpp @@ -202,9 +202,6 @@ void MainView::CreateContent() elm_object_item_part_content_set(item, "tabbar", toolbar_); evas_object_show(alarm_->GetEvasObject()); elm_object_item_content_set(item, alarm_->GetEvasObject()); - - EditAlarmView *ev = new EditAlarmView(); - new EditAlarmPresenter(nullptr, *ev); } Evas_Object *MainView::GetEvasObject() -- 2.7.4