summaryrefslogtreecommitdiff
path: root/lib-apps-common/src
diff options
context:
space:
mode:
authorSergei Kobec <s.kobec@samsung.com>2017-03-07 12:57:05 +0200
committerSergei Kobec <s.kobec@samsung.com>2017-03-10 10:06:00 +0200
commitf4948e9d67e8bb101a1e2d2d98e6d7a3de90c829 (patch)
treea14f9e72c54b5e9325752afa2cae3940af9ee4bc /lib-apps-common/src
parentb0c0f64cb4f9aa6afb31436478f92b078bad02b5 (diff)
downloadalarm-f4948e9d67e8bb101a1e2d2d98e6d7a3de90c829.tar.gz
alarm-f4948e9d67e8bb101a1e2d2d98e6d7a3de90c829.tar.bz2
alarm-f4948e9d67e8bb101a1e2d2d98e6d7a3de90c829.zip
TizenRefApp-8111 Refactor SelectView to make it suitable for Mobile and Wearable applications
Change-Id: I3525f7a772fc62ed993e986980d8f103e0a8b818 Signed-off-by: Sergei Kobec <s.kobec@samsung.com>
Diffstat (limited to 'lib-apps-common/src')
-rw-r--r--lib-apps-common/src/Ui/Control.cpp9
-rw-r--r--lib-apps-common/src/Ux/CircleSelector.cpp59
-rw-r--r--lib-apps-common/src/Ux/MultiSelector.cpp57
-rw-r--r--lib-apps-common/src/Ux/SelectView.cpp142
4 files changed, 160 insertions, 107 deletions
diff --git a/lib-apps-common/src/Ui/Control.cpp b/lib-apps-common/src/Ui/Control.cpp
index 42bd4b9..9445173 100644
--- a/lib-apps-common/src/Ui/Control.cpp
+++ b/lib-apps-common/src/Ui/Control.cpp
@@ -90,6 +90,15 @@ Evas_Object *Control::getEvasObject() const
return m_Object;
}
+ControlPtr Control::getWeakPtr()
+{
+ if (!m_SelfPtr) {
+ m_SelfPtr.reset(this, [](Control *){ });
+ }
+
+ return m_SelfPtr;
+}
+
Control *Control::getControl(Evas_Object *object, const std::type_info &type)
{
TypeCheckInfo checkInfo = { type, nullptr };
diff --git a/lib-apps-common/src/Ux/CircleSelector.cpp b/lib-apps-common/src/Ux/CircleSelector.cpp
new file mode 100644
index 0000000..d3f9d29
--- /dev/null
+++ b/lib-apps-common/src/Ux/CircleSelector.cpp
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2017 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * 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.
+ */
+
+#include "Ux/CircleSelector.h"
+#include "Ui/CircleMenu.h"
+#include "Utils/Callback.h"
+
+#define BUF_SIZE 8
+
+using namespace Ux;
+
+void CircleSelector::setCount(size_t count)
+{
+ char buf[BUF_SIZE];
+ snprintf(buf, sizeof(buf), "%zu", count);
+ elm_object_text_set(getEvasObject(), buf);
+}
+
+Evas_Object *CircleSelector::onCreate(Evas_Object *parent)
+{
+ auto button = elm_button_add(parent);
+ elm_object_style_set(button, "select_mode");
+ elm_object_text_set(button, "0");
+ evas_object_smart_callback_add(button, "clicked",
+ makeCallback(&CircleSelector::onButtonClicked), this);
+
+ return button;
+}
+
+void CircleSelector::onButtonClicked(Evas_Object *button, void *eventInfo)
+{
+ auto menu = new Ui::CircleMenu();
+ menu->create(button);
+
+ if (getState() != SelectedAll) {
+ menu->addItem(getStrings().selectAll, [this] {
+ notifyChanged(SelectedAll);
+ });
+ }
+ if (getState() != SelectedNone) {
+ menu->addItem(getStrings().deselectAll, [this] {
+ notifyChanged(SelectedNone);
+ });
+ }
+ menu->show();
+}
diff --git a/lib-apps-common/src/Ux/MultiSelector.cpp b/lib-apps-common/src/Ux/MultiSelector.cpp
index 91fba0e..ea64ce4 100644
--- a/lib-apps-common/src/Ux/MultiSelector.cpp
+++ b/lib-apps-common/src/Ux/MultiSelector.cpp
@@ -15,25 +15,24 @@
*/
#include "Ux/MultiSelector.h"
-#include "Ui/CircleMenu.h"
-#include "Utils/Callback.h"
-#include "Ux/SelectView.h"
-
-#define BUF_SIZE 8
using namespace Ux;
-MultiSelector::MultiSelector(SelectView *selectView)
- : m_Strings { },
- m_SelectView(selectView)
+MultiSelector::MultiSelector()
+ : m_State(SelectedNone),
+ m_Strings{ nullptr }
+{
+}
+
+void MultiSelector::setChangeCallback(ChangeCallback callback)
{
+ m_OnChanged = std::move(callback);
}
-void MultiSelector::setCount(size_t count)
+void MultiSelector::setState(State state)
{
- char buf[BUF_SIZE];
- snprintf(buf, sizeof(buf), "%zu", count);
- elm_object_text_set(getEvasObject(), buf);
+ m_State = state;
+ onStateChanged(m_State);
}
void MultiSelector::setStrings(const Strings &strings)
@@ -41,35 +40,17 @@ void MultiSelector::setStrings(const Strings &strings)
m_Strings = strings;
}
-Evas_Object *MultiSelector::onCreate(Evas_Object *parent)
+MultiSelector::State MultiSelector::getState() const
{
- auto button = elm_button_add(parent);
- elm_object_style_set(button, "select_mode");
- elm_object_text_set(button, "0");
- evas_object_smart_callback_add(button, "clicked",
- makeCallback(&MultiSelector::onButtonClicked), this);
-
- return button;
+ return m_State;
}
-void MultiSelector::onButtonClicked(Evas_Object *button, void *eventInfo)
+const MultiSelector::Strings &MultiSelector::getStrings() const
{
- if (!m_SelectView) {
- return;
- }
-
- auto menu = new Ui::CircleMenu();
- menu->create(button);
+ return m_Strings;
+}
- if (!m_SelectView->isMaxSelected()) {
- menu->addItem(m_Strings.selectAll, [this] {
- m_SelectView->setAllSelected(true);
- });
- }
- if (m_SelectView->getSelectCount() > 0) {
- menu->addItem(m_Strings.deselectAll, [this] {
- m_SelectView->setAllSelected(false);
- });
- }
- menu->show();
+bool MultiSelector::notifyChanged(State state)
+{
+ return !m_OnChanged || m_OnChanged(state);
}
diff --git a/lib-apps-common/src/Ux/SelectView.cpp b/lib-apps-common/src/Ux/SelectView.cpp
index b619e5c..2b52467 100644
--- a/lib-apps-common/src/Ux/SelectView.cpp
+++ b/lib-apps-common/src/Ux/SelectView.cpp
@@ -41,8 +41,8 @@ SelectView::SelectView()
SelectView::~SelectView()
{
- if (auto item = m_SelectAllItem.lock()) {
- delete item.get();
+ if (auto multiSelector = m_MultiSelector.lock()) {
+ delete multiSelector.get();
}
}
@@ -83,7 +83,7 @@ void SelectView::setSelectMode(SelectMode selectMode)
updatePageTitle();
updatePageButtons();
- updateSelectAllItem();
+ updateMultiSelector();
for (auto &&item : m_Items) {
item->setSelectMode(m_SelectMode);
@@ -109,7 +109,7 @@ void SelectView::setSelectLimit(size_t selectLimit)
m_IsMultiChecking = false;
}
- updateSelectAllState();
+ updateMultiSelectorState();
updateDoneButtonState();
updatePageTitle();
@@ -145,46 +145,6 @@ void SelectView::setLimitCallback(LimitCallback callback)
m_OnLimitReached = std::move(callback);
}
-void SelectView::setAllSelected(bool isSelected)
-{
- m_IsMultiChecking = true;
- for (auto &&item : m_Items) {
- if (!item->isExcluded() && item->isVisible()) {
- if (!item->setChecked(isSelected)) {
- break;
- }
- }
- }
-
- m_IsMultiChecking = false;
- updatePageTitle();
-}
-
-void SelectView::addSelectItem(SelectItem *item)
-{
- item->m_SelectView = this;
- item->setSelectMode(m_SelectMode);
- m_Items.push_back(item);
-
- if (!item->isExcluded()) {
- updateTotalCount(CountIncrement, item);
- }
-}
-
-void SelectView::removeSelectItem(SelectItem *item)
-{
- auto it = std::find(m_Items.begin(), m_Items.end(), item);
- if (it == m_Items.end()) {
- return;
- }
-
- m_Items.erase(it);
- if (!item->isExcluded()) {
- updateTotalCount(CountDecrement, item);
- }
- item->m_SelectView = nullptr;
-}
-
void SelectView::onPageAttached(Ui::NavigatorPage *page)
{
updatePageTitle();
@@ -232,6 +192,36 @@ Evas_Object *SelectView::createCancelButton()
return nullptr;
}
+void SelectView::addSelectItem(SelectItem *item)
+{
+ item->m_SelectView = this;
+ item->setSelectMode(m_SelectMode);
+ m_Items.push_back(item);
+
+ if (!item->isExcluded()) {
+ updateTotalCount(CountIncrement, item);
+ }
+}
+
+void SelectView::removeSelectItem(SelectItem *item)
+{
+ auto it = std::find(m_Items.begin(), m_Items.end(), item);
+ if (it == m_Items.end()) {
+ return;
+ }
+
+ m_Items.erase(it);
+ if (!item->isExcluded()) {
+ updateTotalCount(CountDecrement, item);
+ }
+ item->m_SelectView = nullptr;
+}
+
+Ui::ControlPtr SelectView::getMultiSelector()
+{
+ return m_MultiSelector;
+}
+
size_t SelectView::getSelectMax() const
{
if (m_SelectLimit && m_SelectLimit < m_VisibleCount) {
@@ -293,36 +283,42 @@ void SelectView::updatePageButtons()
}
}
-void SelectView::updateSelectAllItem()
+void SelectView::updateDoneButtonState()
+{
+ elm_object_disabled_set(m_DoneButton,
+ m_IsEmptyResultAllowed ? m_TotalCount == 0 : m_TotalSelectCount == 0);
+}
+
+void SelectView::updateMultiSelector()
{
if (m_SelectMode == SelectMulti && m_VisibleCount) {
- if (m_SelectAllItem.expired()) {
- SelectAllItem *item = new SelectAllItem(m_Strings.selectAll);
- item->setCheckCallback(std::bind(&SelectView::onSelectAllChecked, this, _1));
+ if (m_MultiSelector.expired()) {
+ auto multiSelector = createMultiSelector();
+ multiSelector->setStrings({ m_Strings.selectAll, m_Strings.deselectAll });
+ multiSelector->setChangeCallback(std::bind(&SelectView::onMultiSelectorChanged, this, _1));
- m_SelectAllItem = item->getWeakPtr();
- onSelectAllInsert(item);
+ m_MultiSelector = multiSelector->getWeakPtr();
}
- updateSelectAllState();
+ updateMultiSelectorState();
} else {
- if (auto item = m_SelectAllItem.lock()) {
- delete item.get();
+ if (auto multiSelector = m_MultiSelector.lock()) {
+ delete multiSelector.get();
}
}
}
-void SelectView::updateDoneButtonState()
+void SelectView::updateMultiSelectorState()
{
- elm_object_disabled_set(m_DoneButton,
- m_IsEmptyResultAllowed ? m_TotalCount == 0 : m_TotalSelectCount == 0);
-}
+ if (auto multiSelector = getPtr<MultiSelector>(m_MultiSelector)) {
+ auto state = MultiSelector::SelectedNone;
+ if (isMaxSelected()) {
+ state = MultiSelector::SelectedAll;
+ } else if (getSelectCount()) {
+ state = MultiSelector::SelectedPartially;
+ }
-void SelectView::updateSelectAllState()
-{
- if (auto item = m_SelectAllItem.lock()) {
- auto selectAllItem = static_cast<SelectAllItem *>(item.get());
- selectAllItem->setChecked(isMaxSelected());
+ multiSelector->setState(state);
}
}
@@ -364,13 +360,13 @@ void SelectView::updateVisibleCount(CountChange change, SelectItem *item)
updateVisibleSelectCount(change, item);
}
- updateSelectAllItem();
+ updateMultiSelector();
}
void SelectView::updateVisibleSelectCount(CountChange change, SelectItem *item)
{
(change == CountIncrement) ? ++m_VisibleSelectCount : --m_VisibleSelectCount;
- updateSelectAllState();
+ updateMultiSelectorState();
}
void SelectView::createPageButtons()
@@ -430,14 +426,22 @@ bool SelectView::onItemChecked(SelectItem *item, bool isChecked)
return true;
}
-bool SelectView::onSelectAllChecked(bool isChecked)
+bool SelectView::onMultiSelectorChanged(MultiSelector::State state)
{
- if (isChecked == isMaxSelected()) {
- return true;
+ bool isAllSelected = state == MultiSelector::SelectedAll;
+ m_IsMultiChecking = true;
+
+ for (auto &&item : m_Items) {
+ if (!item->isExcluded() && item->isVisible()) {
+ if (!item->setChecked(isAllSelected)) {
+ break;
+ }
+ }
}
- setAllSelected(isChecked);
- return isChecked == isMaxSelected();
+ m_IsMultiChecking = false;
+ updatePageTitle();
+ return isAllSelected == isMaxSelected();
}
void SelectView::onDonePressed(Evas_Object *button, void *eventInfo)