Small fixes regarding Screen Reader setting 80/206080/2
authorLukasz Wlazly <l.wlazly@partner.samsung.com>
Mon, 13 May 2019 13:12:50 +0000 (15:12 +0200)
committerLukasz Wlazly <l.wlazly@partner.samsung.com>
Tue, 14 May 2019 08:41:59 +0000 (10:41 +0200)
This patch:
1. Set step for slider inside genlist
2. Add indicator function to Slider
3. Removes obsolete files

Change-Id: Ia8a5cb1827cd5503f538af6a42b4117dd98e8733

16 files changed:
src/ScreenReaderSettingsPage.cpp [deleted file]
src/ScreenReaderSettingsPage.hpp [deleted file]
src/model/ScreenReaderSettingsModel.hpp
src/model/TextToSpeechModel.hpp
src/presenter/ListItem.hpp
src/presenter/ScreenReaderPresenter.cpp
src/presenter/ScreenReaderPresenter.hpp
src/presenter/ScreenReaderSettingsPresenter.cpp
src/presenter/ScreenReaderSettingsPresenter.hpp
src/presenter/TextToSpeechPresenter.cpp
src/ui/GenlistItem.cpp
src/ui/GenlistItem.hpp
src/ui/Slider.cpp
src/ui/Slider.hpp
src/utils/utils.hpp
src/view/ListView.cpp

diff --git a/src/ScreenReaderSettingsPage.cpp b/src/ScreenReaderSettingsPage.cpp
deleted file mode 100644 (file)
index b324e8c..0000000
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * Copyright 2018 Samsung Electronics Co., Ltd
- *
- * 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.
- */
-
-#include "ScreenReaderSettingsPage.hpp"
-
-#include "Box.hpp"
-#include "Button.hpp"
-#include "Genlist.hpp"
-#include "Layout.hpp"
-#include "Singleton.hpp"
-#include "Slider.hpp"
-#include "TextToSpeech.hpp"
-#include "VConf.hpp"
-#include "setting-accessibility.h"
-#include "utils.hpp"
-
-#include <app.h>
-#include <efl_extension.h>
-#include <vconf-internal-keys.h>
-#include <vconf.h>
-
-namespace
-{
-       struct VConfCheckData
-       {
-               std::string label;
-               std::string vconf_key;
-               bool state = false;
-       };
-
-       std::vector<VConfCheckData> vConfCheckData = {{"IDS_ST_HEADER_TIME", VCONFKEY_SETAPPL_ACCESSIBILITY_TTS_INDICATOR_INFORMATION_TIME},
-               {"IDS_ST_BODY_DATE", VCONFKEY_SETAPPL_ACCESSIBILITY_TTS_INDICATOR_INFORMATION_DATE},
-               {"IDS_ST_BODY_BATTERY", VCONFKEY_SETAPPL_ACCESSIBILITY_TTS_INDICATOR_INFORMATION_BATTERY},
-               {"IDS_ST_BODY_SIGNAL_STRENGTH", VCONFKEY_SETAPPL_ACCESSIBILITY_TTS_INDICATOR_INFORMATION_SIGNAL_STRENGHT},
-               {"IDS_ST_BODY_BLUETOOTH", VCONFKEY_SETAPPL_ACCESSIBILITY_TTS_INDICATOR_INFORMATION_BLUETOOTH},
-               {"IDS_ST_BODY_MISSED_EVENTS", VCONFKEY_SETAPPL_ACCESSIBILITY_TTS_INDICATOR_INFORMATION_MISSED_EVENTS}};
-
-       static const size_t POPUP_CONTENT_BASE_SIZE = 120;
-} // namespace
-
-ScreenReaderSettingsPage::ScreenReaderSettingsPage()
-       : context_(Singleton<AppContext>::instance())
-{
-       auto genlist = Widget::make<Genlist>(context_.navContext_.getNaviframe());
-       genlist->setMode(ELM_LIST_COMPRESS);
-       genlist->setStyle("dialogue");
-       genlist->clear(); // TODO check if necessary
-
-       DEBUG("Creating items");
-
-       auto percentage = calculateSpeedPercentage();
-       speechRateItem_ = genlist->appendItem({"type1", "IDS_ST_BODY_SPEECH_RATE", percentage, [this](auto item) { this->createSpeechRatePopup(); }});
-
-       Singleton<TextToSpeech>::instance().addSpeedChangedCb([item = speechRateItem_](auto val) {
-               DEBUG("Speed changed to (%d)", static_cast<int>(val));
-               item->setDescription(std::to_string(val));
-       });
-
-       auto item = genlist->appendItem({"multiline",
-               "IDS_ACCS_OPT_KEYBOARD_FEEDBACK_TTS",
-               "IDS_ACCS_OPT_ALWAYS_READ_OUT_KEYBOARD_INPUT_TTS",
-               [](auto item) {
-                       Singleton<VConfInterface>::instance().set(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_KEYBOARD_FEEDBACK, item->getState());
-               },
-               GenlistItem::WidgetType::toggle});
-       item->setState(Singleton<VConfInterface>::instance().get(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_KEYBOARD_FEEDBACK, false));
-
-       item = genlist->appendItem({"type1",
-               "IDS_ACCS_MBODY_READ_OUT_USAGE_HINTS_ABB",
-               {},
-               [](auto item) {
-                       Singleton<VConfInterface>::instance().set(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_DESCRIPTION, item->getState());
-               },
-               GenlistItem::WidgetType::toggle});
-       item->setState(Singleton<VConfInterface>::instance().get(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_DESCRIPTION, false));
-
-       item = genlist->appendItem({"type1",
-               "IDS_ACCS_MBODY_VIBRATION_FEEDBACK",
-               {},
-               [](auto item) {
-                       Singleton<VConfInterface>::instance().set(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_HAPTIC, item->getState());
-               },
-               GenlistItem::WidgetType::toggle});
-       item->setState(Singleton<VConfInterface>::instance().get(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_HAPTIC, false));
-
-       item = genlist->appendItem({"type1",
-               "IDS_ACCS_MBODY_SOUND_FEEDBACK",
-               {},
-               [](auto item) {
-                       Singleton<VConfInterface>::instance().set(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_SOUND_FEEDBACK, item->getState());
-               },
-               GenlistItem::WidgetType::toggle});
-       item->setState(Singleton<VConfInterface>::instance().get(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_SOUND_FEEDBACK, false));
-
-       genlist->appendItem({"type1", "IDS_ACCS_TMBODY_STATUS_BAR_INFORMATION", {}, [this](auto item) { this->mouseUpGendialListCb(); }});
-
-       genlist->appendItem({"multiline",
-               {},
-               "IDS_ACCS_SBODY_SELECT_WHICH_INFORMATION_FROM_INDICATORS_SHOWN_ON_THE_STATUS_BAR_WILL_BE_READ_OUT_WHEN_YOU_TRIPLE_"
-               "TAP_THE_SCREEN_WITH_TWO_FINGERS_MSG",
-               [this](auto item) {}});
-
-       context_.navContext_.getNaviframe()->pushBack("IDS_ST_OPT_SETTINGS", genlist, [this]() {
-               Singleton<TextToSpeech>::instance().clearSpeedChangedCallbacks();
-       });
-}
-
-void ScreenReaderSettingsPage::mouseUpGendialListCb()
-{
-       auto window = this->context_.navContext_.getWindow();
-
-       this->popup_ = Widget::make<Popup>(window, "IDS_ACCS_TMBODY_STATUS_BAR_INFORMATION");
-       this->popup_->setAlignment(ELM_NOTIFY_ALIGN_FILL, 1.0);
-
-       auto removeCb = [p = this->popup_, window]() { window->removeChild(p); };
-       this->popup_->setEextEventCallback(EEXT_CALLBACK_BACK, removeCb);
-
-       auto box = Widget::make<Box>(this->popup_);
-
-       auto genlist = Widget::make<Genlist>(box);
-       genlist->setWeightHint(EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-       genlist->setAlignHint(EVAS_HINT_FILL, EVAS_HINT_FILL);
-
-       for (auto i = 0u; i < vConfCheckData.size(); ++i) {
-               auto screenreaderCheckbox = genlist->appendItem({"type1",
-                       vConfCheckData[i].label,
-                       {},
-                       [i](auto item) {
-                               vConfCheckData[i].state = item->getState();
-                       },
-                       GenlistItem::WidgetType::toggle});
-               vConfCheckData[i].state = Singleton<VConfInterface>::instance().get(vConfCheckData[i].vconf_key, vConfCheckData[i].state);
-               screenreaderCheckbox->setState(vConfCheckData[i].state);
-       }
-
-       genlist->blockScrolling(Elm_Scroller_Movement_Block(ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL | ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL));
-       genlist->setScrollbarsVisibility(ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
-
-       box->packEnd(genlist);
-
-       box->setMinSizeHint(-1, ELM_SCALE_SIZE(POPUP_CONTENT_BASE_SIZE) * vConfCheckData.size());
-       box->setMaxSizeHint(-1, ELM_SCALE_SIZE(POPUP_CONTENT_BASE_SIZE) * vConfCheckData.size());
-       this->popup_->setContent(box);
-
-       auto btnCancel = Widget::make<Button>(this->popup_, removeCb, "IDS_MSG_ACBUTTON_CANCEL_ABB", "popup");
-       this->popup_->setPartContent("button1", btnCancel);
-
-       auto onDone = [removeCb]() {
-               removeCb();
-
-               for (auto vConfData : vConfCheckData)
-                       Singleton<VConfInterface>::instance().set(vConfData.vconf_key, vConfData.state);
-       };
-
-       auto btnDone = Widget::make<Button>(this->popup_, onDone, "IDS_MSG_ACBUTTON_DONE_ABB", "popup");
-       this->popup_->setPartContent("button2", btnDone);
-}
-
-void ScreenReaderSettingsPage::createSpeechRatePopup()
-{
-       auto window = context_.navContext_.getWindow();
-
-       popup_ = Widget::make<Popup>(window, "IDS_ST_BODY_SPEECH_RATE");
-       popup_->setAlignment(ELM_NOTIFY_ALIGN_FILL, 1.0);
-
-       auto removeCb = [p = popup_, window]() { window->removeChild(p); };
-       popup_->setEextEventCallback(EEXT_CALLBACK_BACK, removeCb);
-
-       auto layout = Widget::make<Layout>(popup_);
-       layout->setFile(EDJDIR "/screen-reader-settings-popup.edj", "popup_text_slider_view_layout");
-       layout->setPartText("elm.text.description", "IDS_SCR_POP_DRAG_THE_SLIDER_TO_SET_THE_SPEECH_RATE");
-       layout->setWeightHint(EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-       popup_->setContent(layout);
-
-       auto slider = Widget::make<Slider>(layout);
-       slider->showIndicator(true);
-       slider->setWeightHint(EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-       slider->setAlignHint(EVAS_HINT_FILL, EVAS_HINT_FILL);
-       slider->setIndicatorFormat("%1.0f");
-       slider->setRange(1, 15);
-
-       auto speed = Singleton<TextToSpeech>::instance().getSpeed();
-
-       slider->setStep(2);
-       slider->setValue(speed);
-       layout->setPartContent("slider", slider);
-
-       auto cancelBtn = Widget::make<Button>(popup_, removeCb, "IDS_ST_BUTTON_CANCEL_ABB", "bottom");
-       popup_->setPartContent("button1", cancelBtn);
-
-       auto doneBtn = Widget::make<Button>(popup_,
-               [p = popup_, window, slider, this]() {
-                       auto val = static_cast<size_t>(slider->getValue());
-                       Singleton<TextToSpeech>::instance().setSpeed(val);
-                       window->removeChild(p);
-               },
-               "IDS_ST_SK3_DONE",
-               "bottom");
-       popup_->setPartContent("button2", doneBtn);
-
-       // TODO: add wrapper to the below function
-       evas_object_event_callback_add(popup_->getObject(), EVAS_CALLBACK_DEL, onPopupDel, this);
-}
-
-std::string ScreenReaderSettingsPage::calculateSpeedPercentage()
-{
-       auto speed = Singleton<TextToSpeech>::instance().getSpeed();
-       auto speedRange = Singleton<TextToSpeech>::instance().getSpeedRange();
-
-       auto denominator = speedRange.max - speedRange.min;
-       auto speedPercent = 0.0;
-       if (denominator != 0)
-               speedPercent = (static_cast<double>(speed - speedRange.min) / denominator) * 100;
-
-       DEBUG("TTS rate is %.0f", speedPercent);
-       return std::to_string(std::lround(speedPercent));
-}
-
-void ScreenReaderSettingsPage::onPopupDel(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
-       auto self = static_cast<ScreenReaderSettingsPage *>(data);
-       auto percentage = self->calculateSpeedPercentage();
-       self->speechRateItem_->setDescription(percentage);
-}
diff --git a/src/ScreenReaderSettingsPage.hpp b/src/ScreenReaderSettingsPage.hpp
deleted file mode 100644 (file)
index 1f106cd..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright 2018 Samsung Electronics Co., Ltd
- *
- * 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 SCREEN_READER_SETTINGS_PAGE_HPP
-#define SCREEN_READER_SETTINGS_PAGE_HPP
-
-#include "AppContext.hpp"
-#include "GenlistItem.hpp"
-#include "Popup.hpp"
-
-#include <Elementary.h>
-#include <vector>
-
-/**
- * View allowing to configure main options of Screen Reader
- *
- * @param ad global context of application
- *
- * TODO:
- *  replace classical callbacks with lambda expressions
- */
-class ScreenReaderSettingsPage
-{
-       public:
-       ScreenReaderSettingsPage();
-
-       private:
-       void mouseUpGendialListCb();
-       void createSpeechRatePopup();
-       std::string calculateSpeedPercentage();
-       static void onPopupDel(void *data, Evas *e, Evas_Object *obj, void *event_info);
-
-       AppContext &context_;
-       Popup *popup_ = nullptr;
-       GenlistItem *speechRateItem_ = nullptr;
-};
-
-#endif
index fcfa909bbdcabb33d747041405b4bdef0b5674ea..f920d8ee9c42a8841789f43bf82fc07503b1547c 100644 (file)
@@ -12,7 +12,7 @@ class ScreenReaderSettingsModel
 
        size_t speechRateMin_;
        size_t speechRateMax_;
-       ObservableProperty<int> speechRate_;
+       ObservableProperty<size_t> speechRate_;
        ObservableProperty<bool> keyboardFeedback_;
        ObservableProperty<bool> readUsageHints_;
        ObservableProperty<bool> vibrationFeedback_;
index adeb985ab557617b34a284746c7298365632cb49..18cbc503932462321f738b1efc3f0c42aae335fb 100644 (file)
@@ -8,7 +8,7 @@ class TextToSpeechModel
        public:
        TextToSpeechModel();
        ~TextToSpeechModel();
-       ObservableProperty<int> speechRate_;
+       ObservableProperty<size_t> speechRate_;
        size_t speechRateMin_;
        size_t speechRateMax_;
 };
index 4725625d256ae35ac64075bb9be1b1260266a8ba..7344c9154a5539510ed20e9f4f11726ed514730b 100644 (file)
@@ -39,6 +39,7 @@ struct ListItem
        ObservableProperty<bool> enabled_ = true;
        double value_;
        std::pair<double, double> range_;
+       double step_ = 1;
 };
 
 #endif
\ No newline at end of file
index d17f4fa790b5b5cfa8d7257f8b776dc8809a7d48..16cc02ee614cca5ec9d9f0f2ae3e25a04f77bca1 100644 (file)
@@ -1,6 +1,7 @@
 #include "ScreenReaderPresenter.hpp"
-#include "ScreenReaderSettingsPresenter.hpp"
 
+#include "AppContext.hpp"
+#include "ScreenReaderSettingsPresenter.hpp"
 #include "TextToSpeech.hpp"
 
 ScreenReaderPresenter::ScreenReaderPresenter()
index 59ce8374a6694e34390594c9d5d6f2ca0645f934..24d5e90a343daaf692bdd2ffdcc5608286f4daf9 100644 (file)
@@ -3,7 +3,6 @@
 
 #include "ListPresenter.hpp"
 #include "ScreenReaderModel.hpp"
-#include "ScreenReaderSettingsPage.hpp"
 
 #include <vector>
 
@@ -14,7 +13,6 @@ class ScreenReaderPresenter : public ListPresenter
 
        private:
        ScreenReaderModel model_;
-       std::unique_ptr<ScreenReaderSettingsPage> screenReaderSettingsPage_;
 };
 
 #endif
\ No newline at end of file
index 1c958a6e3005e9e14ac244d43881b4119915ef9c..626ee5d1d63104712aa354cf8215739037a89a27 100644 (file)
@@ -13,7 +13,7 @@ ScreenReaderSettingsPresenter::ScreenReaderSettingsPresenter()
        auto &items = groups_.back().items_;
        items.push_back(std::make_unique<ListItem>(
                "IDS_ST_BODY_SPEECH_RATE",
-               std::to_string(utils::rescale(model_.speechRate_.value(), {model_.speechRateMin_, model_.speechRateMax_})),
+               speechRatePercent(),
                [this](auto item) { Singleton<AppContext>::instance().push(std::make_unique<TextToSpeechPresenter>()); } //TODO: add TextToSpeechPresenter
                ));
 
@@ -66,7 +66,7 @@ ScreenReaderSettingsPresenter::ScreenReaderSettingsPresenter()
 
        model_.speechRate_.attach([this](auto value) {
                auto item = groups_[0].items_[0].get();
-               item->description_ = std::to_string(utils::rescale(value, {this->model_.speechRateMin_, this->model_.speechRateMax_}));
+               item->description_ = this->speechRatePercent();
        });
 
        model_.keyboardFeedback_.attach([this](auto state) {
@@ -89,3 +89,9 @@ ScreenReaderSettingsPresenter::ScreenReaderSettingsPresenter()
                item->widgetState_ = state;
        });
 }
+
+std::string ScreenReaderSettingsPresenter::speechRatePercent()
+{
+       auto val = static_cast<size_t>(utils::rescale(model_.speechRate_.value(), utils::Range<size_t>{model_.speechRateMin_, model_.speechRateMax_}) * 100);
+       return std::to_string(val) + "%";
+}
index fb1320324dca979cd2d5bab017ed9908456ef1a4..cc24ad5daf029f80a3b842357ce58423d9b83705 100644 (file)
@@ -10,6 +10,7 @@ class ScreenReaderSettingsPresenter : public ListPresenter
        ScreenReaderSettingsPresenter();
 
        private:
+       std::string speechRatePercent();
        ScreenReaderSettingsModel model_;
 };
 
index d13ff4ec4be3733de34107b3cf977ec2abd5c8c0..a64f6d183b8e19506bcd6a016dbdbca8b21efbc8 100644 (file)
@@ -15,15 +15,19 @@ TextToSpeechPresenter::TextToSpeechPresenter()
                ListItem::WidgetType::slider,
                std::function<void(ListItem * item)>{},
                [this](auto item) {
-                       this->model_.speechRate_ = utils::rescale(static_cast<size_t>(item->value_), {0, 100}, {this->model_.speechRateMin_, this->model_.speechRateMax_});
+                       this->model_.speechRate_ = utils::rescale(static_cast<double>(item->value_),
+                               utils::Range<double>{0.0, 1.0},
+                               utils::Range<size_t>{this->model_.speechRateMin_, this->model_.speechRateMax_});
                });
-       speechRateItem->value_ = utils::rescale(model_.speechRate_.value(), {this->model_.speechRateMin_, this->model_.speechRateMax_});
-       speechRateItem->range_ = {0, 100};
+       speechRateItem->value_ = utils::rescale<size_t, double>(model_.speechRate_.value(),
+               utils::Range<size_t>{this->model_.speechRateMin_, this->model_.speechRateMax_});
+       speechRateItem->range_ = {0.0, 1.0};
+       speechRateItem->step_ = 0.05;
 
        items.push_back(std::move(speechRateItem));
 
        model_.speechRate_.attach([this](auto value) {
                auto &item = groups_[0].items_[0];
-               item->value_ = utils::rescale(value, {this->model_.speechRateMin_, this->model_.speechRateMax_});
+               item->value_ = utils::rescale<size_t, double>(value, utils::Range<size_t>{this->model_.speechRateMin_, this->model_.speechRateMax_});
        });
 }
index 9f6a59a36d409b94b7929d847cc1860fca938401..c945944ba9211705290d536abf1005c5103be703 100644 (file)
 
 #include <app.h>
 
+namespace
+{
+       char *percentIndicatorFormat(double val)
+       {
+               auto percent = std::to_string(static_cast<unsigned int>(val * 100));
+               return strdup(percent.c_str());
+       }
+} // namespace
+
 GenlistItem::GenlistItem(std::string style, TranslatedString text, TranslatedString desc, Type type)
        : style_(std::move(style)), text_(std::move(text)), description_(std::move(desc)), type_(type)
 {}
@@ -131,6 +140,11 @@ void GenlistItem::setId(size_t id)
        id_ = id;
 }
 
+void GenlistItem::setStep(double val)
+{
+       step_ = val;
+}
+
 size_t GenlistItem::getId()
 {
        return id_;
@@ -297,16 +311,19 @@ Evas_Object *GenlistItem::realizeRadio(const std::string &part)
 Evas_Object *GenlistItem::realizeSlider(const std::string &part)
 {
        auto layout = Widget::make<Layout>(genlist_, "edje/genlist.edj", "gl_custom_item");
-       auto label = Widget::make<Label>(genlist_, text_);
-       layout->setPartContent("elm.text", label);
+       if (!text_.empty()) {
+               auto label = Widget::make<Label>(genlist_, text_);
+               layout->setPartContent("elm.text", label);
+       }
 
        auto slider = Widget::make<Slider>(layout);
        slider->showIndicator(true);
        slider->setWeightHint(EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
        slider->setAlignHint(EVAS_HINT_FILL, EVAS_HINT_FILL);
-       slider->setIndicatorFormat("%1.0f");
        slider->setRange(range_.first, range_.second);
        slider->setValue(value_);
+       slider->setStep(step_);
+       slider->setIndicatorFormatFunction(percentIndicatorFormat);
        layout->setPartContent("elm.swallow.content", slider);
 
        slider->setEvasSmartCallback("delay,changed", [=]() {
index 129c330f67acc673243f7734707e719f219c3e74..3f094266008ca2f93161e5ba425ca660f6c1db18 100644 (file)
@@ -67,6 +67,7 @@ class GenlistItem
        double getValue();
        void setValue(double val);
        void setRange(std::pair<double, double> range);
+       void setStep(double val);
 
        // TODO: current implementation does not take advantage from radio groups.
        //              When legacy solution for adding genlist items is completely removed
@@ -105,6 +106,7 @@ class GenlistItem
        size_t id_ = 0;
        double value_ = 0.0;
        std::pair<double, double> range_;
+       double step_ = 0.01;
 };
 
 #endif
index 5174ddcf47ce4ceb427fb6946ae5426d0afc00c7..5cccdeeb18fe2cfd73343db86d302b5d06c40f47 100644 (file)
@@ -15,6 +15,11 @@ void Slider::setIndicatorFormat(const std::string &format)
        elm_slider_indicator_format_set(uniqueObj_.get(), format.c_str());
 }
 
+void Slider::setIndicatorFormatFunction(IndicatorFormatFunction fun)
+{
+       elm_slider_indicator_format_function_set(uniqueObj_.get(), fun, indicatorFree);
+}
+
 void Slider::setRange(double min, double max)
 {
        elm_slider_min_max_set(uniqueObj_.get(), min, max);
@@ -34,3 +39,8 @@ double Slider::getValue()
 {
        return elm_slider_value_get(uniqueObj_.get());
 }
+
+void Slider::indicatorFree(char *str)
+{
+       free(str);
+}
index b86d2e0db91bd08617021da2dfc31e3f98a5c365..b5d1586cdd41937919662a5abdd43f557dd92ac1 100644 (file)
@@ -9,8 +9,11 @@ class Slider : public Widget
        friend T *Widget::make(Widget *parent, Args &&... args);
 
        public:
+       using IndicatorFormatFunction = char *(*)(double);
+
        void showIndicator(bool show);
        void setIndicatorFormat(const std::string &format);
+       void setIndicatorFormatFunction(IndicatorFormatFunction fun);
        void setRange(double min, double max);
        void setStep(double step);
        void setValue(double value);
@@ -21,6 +24,7 @@ class Slider : public Widget
 
        private:
        void createEflObject();
+       static void indicatorFree(char *str);
 };
 
 #endif
index 6de3a2bb81d34829d70ab703f3ef3beef161b90f..4b82f1cd6ec068e4124429629052f168419d75bb 100644 (file)
@@ -42,13 +42,15 @@ namespace utils
                }
        };
 
+       template <typename T>
        struct Range
        {
-               size_t begin;
-               size_t end;
+               T begin{};
+               T end{};
        };
 
-       inline size_t rescale(size_t value, Range source, Range target = {0, 100})
+       template <typename In, typename Out = double>
+       Out rescale(In value, Range<In> source, Range<Out> target = {0.0, 1.0})
        {
                auto denominator = source.end - source.begin;
                auto rescaledValue = target.begin;
index 8742c44ec143164f5704d0e6b5491f4125f873e6..a4630366ca781f42ab621383dd0dd917c4833b8a 100644 (file)
@@ -71,6 +71,7 @@ void ListView::addItemsToGenlist()
 
                        genlistItem->setValue(it->value_);
                        genlistItem->setRange(std::move(it->range_));
+                       genlistItem->setStep(it->step_);
 
                        itemsMapping_.emplace(genlistItem, it.get());
                        it->title_.attach([this, gi = genlistItem](auto val) { gi->setText(val); });