AlarmView: implement adding alarms by clicking "+"
authorLukasz Stanislawski <l.stanislaws@samsung.com>
Mon, 5 Sep 2016 13:09:27 +0000 (15:09 +0200)
committerŁukasz Stanisławski <l.stanislaws@samsung.com>
Tue, 13 Sep 2016 06:21:47 +0000 (08:21 +0200)
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
clock/inc/Model/AlarmEvent.h [new file with mode: 0644]
clock/inc/Presenter/AlarmPresenter.h
clock/inc/View/AlarmView.h
clock/res/images/core_floating_icon_01.png [new file with mode: 0644]
clock/src/Controller/MainController.cpp
clock/src/Model/AlarmEvent.cpp [new file with mode: 0644]
clock/src/Presenter/AlarmPresenter.cpp
clock/src/View/AlarmView.cpp
clock/src/View/EditAlarmView.cpp
clock/src/View/MainView.cpp

index ca1e57c..06d4f92 100644 (file)
@@ -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 (file)
index 0000000..347ee35
--- /dev/null
@@ -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
index 88dfc7e..3528843 100644 (file)
@@ -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);
        };
index da10f46..4ae65a2 100644 (file)
@@ -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 (file)
index 0000000..7f487f9
Binary files /dev/null and b/clock/res/images/core_floating_icon_01.png differ
index 9cdc6f3..a2d2beb 100644 (file)
 #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 (file)
index 0000000..636704a
--- /dev/null
@@ -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_;
+}
index 02f2a95..e396774 100644 (file)
@@ -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
index cf84ea6..78e2409 100644 (file)
@@ -20,6 +20,7 @@
 #include <Elementary.h>
 #include <cstdlib>
 #include <sstream>
+#include <efl_extension.h>
 
 #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<ItemData*>(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<AlarmView*>(data);
+       if (view->onClicked) view->onClicked();
 }
index 5083435..eaa03a3 100644 (file)
@@ -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)
index 3d6640d..910292b 100644 (file)
@@ -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()