Add new type of list item - entry 44/209144/3
authorOskar Chodowicz <o.chodowicz@samsung.com>
Tue, 2 Jul 2019 13:01:18 +0000 (15:01 +0200)
committerOskar Chodowicz <o.chodowicz@samsung.com>
Thu, 11 Jul 2019 13:46:50 +0000 (15:46 +0200)
Change-Id: I71b2738581db65231690610e10e895e7d0f4354a

src/presenter/ListItem.hpp
src/ui/GenlistItem.cpp
src/ui/GenlistItem.hpp
src/view/ListView.cpp

index dc5d405..4fd68ba 100644 (file)
@@ -16,7 +16,8 @@ struct ListItem
                toggle,
                radio,
                icon,
-               slider
+               slider,
+               entry
        };
 
        ListItem(std::string title,
@@ -40,6 +41,7 @@ struct ListItem
        double value_ = 0.0;
        std::pair<double, double> range_;
        double step_ = 1;
+       ObservableProperty<std::string> entryText_;
 };
 
 #endif
index c945944..56ee340 100644 (file)
@@ -2,6 +2,7 @@
 
 #include "AccessibilitySettingLog.hpp"
 #include "Check.hpp"
+#include "Entry.hpp"
 #include "Genlist.hpp"
 #include "Icon.hpp"
 #include "Label.hpp"
@@ -145,6 +146,17 @@ void GenlistItem::setStep(double val)
        step_ = val;
 }
 
+std::string GenlistItem::getEntryText()
+{
+       return entryText_;
+}
+
+void GenlistItem::setEntryText(TranslatedString text)
+{
+       entryText_ = text.str();
+       update();
+}
+
 size_t GenlistItem::getId()
 {
        return id_;
@@ -222,6 +234,9 @@ Evas_Object *GenlistItem::contentRealizator(void *data, Evas_Object *obj, const
        case WidgetType::slider:
                return self->realizeSlider(part);
 
+       case WidgetType::entry:
+               return self->realizeEntry(part);
+
        default:
                break;
        }
@@ -336,6 +351,27 @@ Evas_Object *GenlistItem::realizeSlider(const std::string &part)
        return layout->getObject();
 }
 
+Evas_Object *GenlistItem::realizeEntry(const std::string &part)
+{
+       auto layout = Widget::make<Layout>(genlist_, "edje/genlist.edj", "gl_custom_item");
+       if (!text_.empty()) {
+               auto label = Widget::make<Label>(genlist_, text_);
+               layout->setPartContent("elm.text", label);
+       }
+
+       auto entry = Widget::make<Entry>(layout);
+       layout->setPartContent("elm.swallow.content", entry);
+       entry->setEntryText(entryText_);
+       entry->setEvasSmartCallback("changed,user", [=]() {
+               this->entryText_ = entry->getEntryText();
+               if (onContentValueChanged_) {
+                       onContentValueChanged_(this);
+               }
+       });
+
+       return layout->getObject();
+}
+
 void GenlistItem::onItemSelection(void *data, Evas_Object *obj, void *event_info)
 {
        auto self = static_cast<GenlistItem *>(data);
index 3f09426..b92a3c2 100644 (file)
@@ -27,7 +27,8 @@ class GenlistItem
                toggle,
                radio,
                icon,
-               slider
+               slider,
+               entry
        };
 
        GenlistItem(std::string style, TranslatedString text, TranslatedString desc = {}, Type type = Type::group);
@@ -68,6 +69,8 @@ class GenlistItem
        void setValue(double val);
        void setRange(std::pair<double, double> range);
        void setStep(double val);
+       void setEntryText(TranslatedString text);
+       std::string getEntryText();
 
        // TODO: current implementation does not take advantage from radio groups.
        //              When legacy solution for adding genlist items is completely removed
@@ -85,6 +88,7 @@ class GenlistItem
        Evas_Object *realizeIcon(const std::string &part);
        Evas_Object *realizeRadio(const std::string &part);
        Evas_Object *realizeSlider(const std::string &part);
+       Evas_Object *realizeEntry(const std::string &part);
 
        static char *textRealizator(void *data, Evas_Object *obj, const char *part);
        static Evas_Object *contentRealizator(void *data, Evas_Object *obj, const char *part);
@@ -107,6 +111,7 @@ class GenlistItem
        double value_ = 0.0;
        std::pair<double, double> range_;
        double step_ = 0.01;
+       std::string entryText_;
 };
 
 #endif
index 5413036..3eab1ab 100644 (file)
@@ -109,6 +109,7 @@ void ListView::addItemsToGenlist()
                ASSERT(search != itemsMapping_.end(), "Item not mapped");
                search->second->widgetState_ = item->getState();
                search->second->value_ = item->getValue();
+               search->second->entryText_ = item->getEntryText();
                if (search->second->onWidgetChanged_) {
                        search->second->onWidgetChanged_(search->second);
                }
@@ -122,7 +123,7 @@ void ListView::addItemsToGenlist()
                for (const auto &it : g.items_) {
                        auto type = translateType(it->widgetType_);
                        auto style = it->description_.value().empty() ? "type1" : "multiline";
-                       if (it->widgetType_ == ListItem::WidgetType::slider)
+                       if (it->widgetType_ == ListItem::WidgetType::slider || it->widgetType_ == ListItem::WidgetType::entry)
                                style = "full";
                        GenlistItem *genlistItem = nullptr;
                        if (it->widgetType_ == ListItem::WidgetType::icon)
@@ -149,6 +150,7 @@ void ListView::addItemsToGenlist()
                        genlistItem->setValue(it->value_);
                        genlistItem->setRange(std::move(it->range_));
                        genlistItem->setStep(it->step_);
+                       genlistItem->setEntryText(it->entryText_.value());
 
                        itemsMapping_.emplace(genlistItem, it.get());
                        it->title_.attach([this, gi = genlistItem](auto val) { gi->setText(val); });
@@ -185,6 +187,9 @@ GenlistItem::WidgetType ListView::translateType(ListItem::WidgetType t)
 
        case ListItem::WidgetType::slider:
                return GenlistItem::WidgetType::slider;
+
+       case ListItem::WidgetType::entry:
+               return GenlistItem::WidgetType::entry;
        }
        ERROR("Invalid type");
        return {};