diff options
author | Sergei Kobec <s.kobec@samsung.com> | 2017-03-07 12:57:05 +0200 |
---|---|---|
committer | Sergei Kobec <s.kobec@samsung.com> | 2017-03-10 10:06:00 +0200 |
commit | f4948e9d67e8bb101a1e2d2d98e6d7a3de90c829 (patch) | |
tree | a14f9e72c54b5e9325752afa2cae3940af9ee4bc /lib-apps-common/src | |
parent | b0c0f64cb4f9aa6afb31436478f92b078bad02b5 (diff) | |
download | alarm-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.cpp | 9 | ||||
-rw-r--r-- | lib-apps-common/src/Ux/CircleSelector.cpp | 59 | ||||
-rw-r--r-- | lib-apps-common/src/Ux/MultiSelector.cpp | 57 | ||||
-rw-r--r-- | lib-apps-common/src/Ux/SelectView.cpp | 142 |
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) |