Universal Switch Settings Page in MVP 25/206225/7
authorOskar Chodowicz <o.chodowicz@samsung.com>
Wed, 15 May 2019 08:14:07 +0000 (10:14 +0200)
committerOskar Chodowicz <o.chodowicz@samsung.com>
Thu, 30 May 2019 07:01:51 +0000 (09:01 +0200)
Change-Id: I5c680e9c0ea52fc9586d6f4b92b509a2d61e2631

po/en.po
src/model/UniversalSwitchSettingsPageModel.cpp [new file with mode: 0644]
src/model/UniversalSwitchSettingsPageModel.hpp [new file with mode: 0644]
src/presenter/ListPresenter.cpp
src/presenter/UniversalSwitchPagePresenter.cpp
src/presenter/UniversalSwitchSettingsPagePresenter.cpp [new file with mode: 0644]
src/presenter/UniversalSwitchSettingsPagePresenter.hpp [new file with mode: 0644]
src/utils/Geometry.cpp
src/utils/Geometry.hpp
src/view/ListView.cpp

index 06d56bd..fe74dfe 100644 (file)
--- a/po/en.po
+++ b/po/en.po
@@ -473,7 +473,7 @@ msgid  "IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_MANAGE_CONTEXTUAL_MENU_DESC"
 msgstr "Place contextual menu on the first row depending on the activity"
 
 msgid  "IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_SECONDS"
-msgstr "seconds"
+msgstr "%.1f seconds"
 
 msgid  "IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_ON"
 msgstr "On"
@@ -485,7 +485,7 @@ msgid  "IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_UNDEFINED"
 msgstr "Undefined"
 
 msgid  "IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_SWITCHES"
-msgstr "Switches"
+msgstr "%d Switches"
 
 msgid  "IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_SET_VALUE_DESC_AUTO_SCAN_INT"
 msgstr "Select the length of the time to wait before the next item is highlighted."
diff --git a/src/model/UniversalSwitchSettingsPageModel.cpp b/src/model/UniversalSwitchSettingsPageModel.cpp
new file mode 100644 (file)
index 0000000..eefc0ae
--- /dev/null
@@ -0,0 +1,118 @@
+#include "UniversalSwitchSettingsPageModel.hpp"
+
+#define VCONF_MEMORY_TYPE "db/"
+#define VCONF_PROJECT_NAME "setting/accessibility/universal-switch/"
+#define VCONF_PROJECT_PREFIX VCONF_MEMORY_TYPE VCONF_PROJECT_NAME
+
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_AUTO_SCAN_ENABLED VCONF_PROJECT_PREFIX "AUTO_SCAN_ENABLED"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_AUTO_SCAN_INT VCONF_PROJECT_PREFIX "AUTO_SCAN_INTERVAL"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_NUM_OF_SCANS VCONF_PROJECT_PREFIX "LOOP_LIMIT_TO_INACTION"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_SCAN_METHOD VCONF_PROJECT_PREFIX "SCAN_METHOD"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_SCAN_DIR_VERTICAL VCONF_PROJECT_PREFIX "SCAN_DIRECTION_VERTICAL"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_SCAN_DIR_HORIZONTA VCONF_PROJECT_PREFIX "SCAN_DIRECTION_HORIZONTAL"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_SCAN_PT_SPEED VCONF_PROJECT_PREFIX "SCAN_PT_SPEED"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_PAUSE_ON_FIRST_STATE VCONF_PROJECT_PREFIX "PAUSE_ON_FIRST_ELEMENT_ENABLED"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_PAUSE_ON_FIRST_VALUE VCONF_PROJECT_PREFIX "PAUSE_ON_FIRST_ELEMENT_TIME"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_TAP_DURATION_STATE VCONF_PROJECT_PREFIX "TAP_DURATION_ENABLED"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_TAP_DURATION_VALUE VCONF_PROJECT_PREFIX "TAP_DURATION_VALUE"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_SGL_IACTION_INT_STATE VCONF_PROJECT_PREFIX "SGL_INACTION_INT_ENABLED"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_SGL_IACTION_INT_VALUE VCONF_PROJECT_PREFIX "SGL_INACTION_INT_VALUE"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_AUTO_TAP_STATE VCONF_PROJECT_PREFIX "AUTO_TAP_ENABLED"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_AUTO_TAP_VALUE VCONF_PROJECT_PREFIX "AUTO_TAP_WAITING_TIME"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_AUTO_MOVE_INT_STATE VCONF_PROJECT_PREFIX "AUTO_MOVE_INT_ENABLED"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_AUTO_MOVE_INT_VALUE VCONF_PROJECT_PREFIX "AUTO_MOVE_INT_VALUE"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_AUTO_TAP_KBD_STATE VCONF_PROJECT_PREFIX "AUTO_TAP_KBD_ENABLED"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_FEEDBACK_CURSOR_COLOR VCONF_PROJECT_PREFIX "FEEDBACK_CURSOR_COLOR"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_FEEDBACK_SOUND_STATE VCONF_PROJECT_PREFIX "FEEDBACK_SOUND_ENABLED"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_FEEDBACK_SOUND_VOLUME VCONF_PROJECT_PREFIX "FEEDBACK_SOUND_VOLUME"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_FEEDBACK_VOICE_STATE VCONF_PROJECT_PREFIX "FEEDBACK_VOICE_ENABLED"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_FEEDBACK_VOICE_SPEECH_RATE VCONF_PROJECT_PREFIX "FEEDBACK_VOICE_SPEECH_RATE"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_FEEDBACK_VOICE_SPEECH_VOLUME VCONF_PROJECT_PREFIX "FEEDBACK_VOICE_SPEECH_VOLUME"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_AUTO_SCROLL_ENABLED VCONF_PROJECT_PREFIX "AUTO_SCROLL_ENABLED"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_GRANULARITY_UNIT VCONF_PROJECT_PREFIX "GRANULARITY_UNIT"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_MANAGE_ACTIONS VCONF_PROJECT_PREFIX "SHOW_ACTIONS_MENU_ITEM"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_MANAGE_SETTINGS VCONF_PROJECT_PREFIX "SHOW_SETTINGS_MENU_ITEM"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_MANAGE_HOMESCREEN VCONF_PROJECT_PREFIX "SHOW_HOME_SCREEN_MENU_ITEM"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_MANAGE_KEYS VCONF_PROJECT_PREFIX "SHOW_BUTTONS_AND_KEYS_MENU_ITEM"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_MANAGE_CONTEXTUAL_MENU VCONF_PROJECT_PREFIX "SHOW_CONTEXTUAL_MENU"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_MANAGE_GESTURES VCONF_PROJECT_PREFIX "SHOW_GESTURES_MENU_ITEM"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_MANAGE_RECENT_APPS VCONF_PROJECT_PREFIX "SHOW_RECENT_APPS_MENU_ITEM"
+#define VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_MANAGE_BACK VCONF_PROJECT_PREFIX "SHOW_BACK_MENU_ITEM"
+
+#define DEFAULT_AUTO_SCAN_STATE true
+#define DEFAULT_AUTO_SCAN_INTERVAL 2.0
+#define DEFAULT_AUTO_SCAN_NUMBER 5
+#define DEFAULT_SCAN_METHOD ScanMethod::POINT
+#define DEFAULT_SCAN_DIR ScanDirection::TO_BOTTOM
+#define DEFAULT_SCAN_PT_SPEED 10
+#define DEFAULT_PAUSE_ON_FIRST_STATE false
+#define DEFAULT_PAUSE_ON_FIRST_VALUE 1.0
+#define DEFAULT_TAP_DURATION_STATE false
+#define DEFAULT_TAP_DURATION_VALUE 0.5
+#define DEFAULT_SGL_IACTION_INT_STATE false
+#define DEFAULT_SGL_IACTION_INT_VALUE 0.5
+#define DEFAULT_AUTO_TAP_STATE false
+#define DEFAULT_AUTO_TAP_VALUE 1.0
+#define DEFAULT_AUTO_MOVE_INT_STATE false
+#define DEFAULT_AUTO_MOVE_INT_VALUE 1.0
+#define DEFAULT_AUTO_TAP_KEYBOARD_STATE false
+#define DEFAULT_FEEDBACK_CURSOR_COLOR 0xffff0000
+#define DEFAULT_FEEDBACK_SOUND_STATE true
+#define DEFAULT_FEEDBACK_SOUND_VOLUME 0.5
+#define DEFAULT_FEEDBACK_VOICE_STATE false
+#define DEFAULT_FEEDBACK_VOICE_SPEECH_RATE 0.5
+#define DEFAULT_FEEDBACK_VOICE_SPEECH_VOLUME 0.5
+
+#define BUS "org.tizen.UniversalSwitch"
+#define PATH "/org/tizen/UniversalSwitch"
+#define IFACE "org.tizen.UniversalSwitch"
+
+UniversalSwitchSettingsPageModel::UniversalSwitchSettingsPageModel()
+{
+       synchronizePropertyWithVConf(autoScanState_, VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_AUTO_SCAN_ENABLED, DEFAULT_AUTO_SCAN_STATE);
+       synchronizePropertyWithVConf(autoScanInterval_, VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_AUTO_SCAN_INT, DEFAULT_AUTO_SCAN_INTERVAL);
+       synchronizePropertyWithVConf(autoScanInterval_, VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_AUTO_SCAN_INT, DEFAULT_AUTO_SCAN_INTERVAL);
+       synchronizePropertyWithVConf(autoScanLoopsNumber_, VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_NUM_OF_SCANS, DEFAULT_AUTO_SCAN_NUMBER);
+       synchronizePropertyWithVConf(scanMethod_, VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_SCAN_METHOD, DEFAULT_SCAN_METHOD);
+       synchronizePropertyWithVConf(scanDirection_, VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_SCAN_DIR_VERTICAL, DEFAULT_SCAN_DIR);
+       synchronizePropertyWithVConf(pointScanSpeed_, VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_SCAN_PT_SPEED, DEFAULT_SCAN_PT_SPEED);
+       synchronizePropertyWithVConf(pauseOnFirstState_, VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_PAUSE_ON_FIRST_STATE, DEFAULT_PAUSE_ON_FIRST_STATE);
+       synchronizePropertyWithVConf(pauseOnFirstTime_, VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_PAUSE_ON_FIRST_VALUE, DEFAULT_PAUSE_ON_FIRST_VALUE);
+       synchronizePropertyWithVConf(tapDurationState_, VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_TAP_DURATION_STATE, DEFAULT_TAP_DURATION_STATE);
+       synchronizePropertyWithVConf(tapDurationValue_, VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_TAP_DURATION_VALUE, DEFAULT_TAP_DURATION_VALUE);
+       synchronizePropertyWithVConf(singleInteractionIntervalState_, VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_SGL_IACTION_INT_STATE, DEFAULT_SGL_IACTION_INT_STATE);
+       synchronizePropertyWithVConf(singleInteractionIntervalValue_, VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_SGL_IACTION_INT_VALUE, DEFAULT_SGL_IACTION_INT_VALUE);
+       synchronizePropertyWithVConf(autoTapState_, VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_AUTO_TAP_STATE, DEFAULT_AUTO_TAP_STATE);
+       synchronizePropertyWithVConf(autoTapValue_, VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_AUTO_TAP_VALUE, DEFAULT_AUTO_TAP_VALUE);
+       synchronizePropertyWithVConf(autoMoveState_, VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_AUTO_MOVE_INT_STATE, DEFAULT_AUTO_MOVE_INT_STATE);
+       synchronizePropertyWithVConf(autoMoveValue_, VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_AUTO_MOVE_INT_VALUE, DEFAULT_AUTO_MOVE_INT_VALUE);
+       synchronizePropertyWithVConf(autoTapKeyboardState_, VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_AUTO_TAP_KBD_STATE, DEFAULT_AUTO_TAP_KEYBOARD_STATE);
+
+       vconfHandles_.push_back(Singleton<VConfInterface>::instance().registerAndGet<int>(
+               VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_FEEDBACK_CURSOR_COLOR,
+               DEFAULT_FEEDBACK_CURSOR_COLOR,
+               [this](auto value) {
+                       cursorColor_ = Color::fromABGR(value);
+               }));
+
+       cursorColor_.attach([this](auto newValue) {
+               Singleton<VConfInterface>::instance().set(VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_FEEDBACK_CURSOR_COLOR, newValue.toABGRInt());
+       });
+
+       synchronizePropertyWithVConf(feedbackSoundState_, VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_FEEDBACK_SOUND_STATE, DEFAULT_FEEDBACK_SOUND_STATE);
+       synchronizePropertyWithVConf(feedbackVoiceState_, VCONFKEY_SETAPPL_ACCESSIBILITY_UNIVERSAL_SWITCH_SETTINGS_FEEDBACK_VOICE_STATE, DEFAULT_FEEDBACK_VOICE_STATE);
+
+       connectionPtr_ = DBus::getDBusConnectionByType(DBus::ConnectionType::SESSION);
+       dBusClient_ = DBus::DBusClient{BUS, PATH, IFACE, connectionPtr_};
+       auto reply = dBusClient_.method<DBus::ValueOrError<std::vector<std::tuple<std::string, std::string, std::string, int32_t>>>()>("getAllSwitchConfigurationItems").call();
+       if (reply) {
+               configuredSwitchesCount_ = std::get<0>(reply).size();
+       } else {
+               ERROR("Error on function getAllSwitchConfigurationItems call");
+               ERROR("%s", reply.getError().message.c_str());
+               configuredSwitchesCount_ = 0;
+       }
+       dBusClient_.addSignal<void(int)>(std::string{"switchesCountChanged"}, [this](auto count) {
+               configuredSwitchesCount_ = count;
+       });
+}
\ No newline at end of file
diff --git a/src/model/UniversalSwitchSettingsPageModel.hpp b/src/model/UniversalSwitchSettingsPageModel.hpp
new file mode 100644 (file)
index 0000000..bd6abf8
--- /dev/null
@@ -0,0 +1,78 @@
+#ifndef UNIVERSAL_SWITCH_SETTINGS_PAGE_MODEL_HPP
+#define UNIVERSAL_SWITCH_SETTINGS_PAGE_MODEL_HPP
+
+#include "DBus.hpp"
+#include "Geometry.hpp"
+#include "ObservableProperty.hpp"
+#include "ScanningProperties.hpp"
+#include "VConf.hpp"
+// enum class ScanMethod
+// {
+//     POINT = 1,
+//     ROW
+// };
+
+// enum class ScanDirection
+// {
+//     TO_BOTTOM = 1,
+//     TO_TOP
+// };
+
+class UniversalSwitchSettingsPageModel
+{
+       public:
+       UniversalSwitchSettingsPageModel();
+
+       ObservableProperty<int> configuredSwitchesCount_;
+
+       ObservableProperty<bool> autoScanState_;
+       ObservableProperty<double> autoScanInterval_;
+       ObservableProperty<int> autoScanLoopsNumber_;
+
+       ObservableProperty<ScanMethod> scanMethod_;
+       ObservableProperty<ScanDirection> scanDirection_;
+       ObservableProperty<int> pointScanSpeed_;
+
+       ObservableProperty<bool> pauseOnFirstState_;
+       ObservableProperty<double> pauseOnFirstTime_;
+
+       ObservableProperty<bool> tapDurationState_;
+       ObservableProperty<double> tapDurationValue_;
+
+       ObservableProperty<bool> singleInteractionIntervalState_;
+       ObservableProperty<double> singleInteractionIntervalValue_;
+
+       ObservableProperty<bool> autoTapState_;
+       ObservableProperty<double> autoTapValue_;
+
+       ObservableProperty<bool> autoMoveState_;
+       ObservableProperty<double> autoMoveValue_;
+
+       ObservableProperty<bool> autoTapKeyboardState_;
+
+       ObservableProperty<Color> cursorColor_;
+
+       ObservableProperty<bool> feedbackSoundState_;
+       ObservableProperty<bool> feedbackVoiceState_;
+
+       private:
+       template <typename T>
+       void synchronizePropertyWithVConf(ObservableProperty<T> &property, const std::string &vconfKey, T defaultValue)
+       {
+               vconfHandles_.push_back(Singleton<VConfInterface>::instance().registerAndGet<T>(
+                       vconfKey,
+                       defaultValue,
+                       [&property](auto value) {
+                               property = value;
+                       }));
+
+               property.attach([this, vconfKey](auto newValue) {
+                       Singleton<VConfInterface>::instance().set(vconfKey, newValue);
+               });
+       }
+       std::vector<VConfInterface::CallbackHandle> vconfHandles_;
+       DBus::DBusWrapper::ConnectionPtr connectionPtr_;
+       DBus::DBusClient dBusClient_;
+};
+
+#endif
\ No newline at end of file
index d0d166c..7d14d1e 100644 (file)
@@ -9,7 +9,7 @@ Action *ListPresenter::getAction(const std::string &actionId) const
 {
        auto it = actions_.find(actionId);
        if (it == actions_.end()) {
-               ERROR("Action with id: %s doesn't exist", actionId.c_str());
+               // DEBUG("Action with id: %s doesn't exist", actionId.c_str());
                return nullptr;
        }
        return it->second.get();
index a855fa3..f806c43 100644 (file)
@@ -1,5 +1,7 @@
 #include "UniversalSwitchPagePresenter.hpp"
 
+#include "UniversalSwitchSettingsPagePresenter.hpp"
+
 UniversalSwitchPagePresenter::UniversalSwitchPagePresenter()
 {
        setTitle("IDS_ACCS_UNIVERSAL_SWITCH");
@@ -31,7 +33,8 @@ UniversalSwitchPagePresenter::UniversalSwitchPagePresenter()
        items.back()->enabled_ = false;
 
        addAction(std::make_unique<Action>("titleRightAction", "IDS_ACCS_SETTINGS_CAPS", [this](auto action) {
-               universalSwitchSettingsPage_ = std::make_unique<UniversalSwitchSettingsPage>();
+               // universalSwitchSettingsPage_ = std::make_unique<UniversalSwitchSettingsPage>();
+               Singleton<AppContext>::instance().push(std::make_unique<UniversalSwitchSettingsPagePresenter>());
        },
                model_.dbusConfigurationServiceState_.value()));
 
diff --git a/src/presenter/UniversalSwitchSettingsPagePresenter.cpp b/src/presenter/UniversalSwitchSettingsPagePresenter.cpp
new file mode 100644 (file)
index 0000000..e3ab566
--- /dev/null
@@ -0,0 +1,344 @@
+#include "UniversalSwitchSettingsPagePresenter.hpp"
+
+UniversalSwitchSettingsPagePresenter::UniversalSwitchSettingsPagePresenter()
+{
+       setTitle("IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS");
+       createSwitchesGroup();
+       createScanningGropu();
+       createAdditionalSettingsGroup();
+       createFeedbackGroup();
+}
+
+void UniversalSwitchSettingsPagePresenter::createSwitchesGroup()
+{
+       groups_.emplace_back("");
+       groups_.back().items_.push_back(std::make_unique<ListItem>(std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_SWITCHES"},
+               TranslatedString::create("IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_SWITCHES", model_.configuredSwitchesCount_.value()).str(),
+               [this](auto item) {
+                       switchesPage_ = std::make_unique<SwitchesPage>();
+                       DEBUG("Switches page");
+               }));
+       auto item = groups_.back().items_.back().get();
+       model_.configuredSwitchesCount_.attach([item](auto value) {
+               item->description_ = TranslatedString::create("IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_SWITCHES", value).str();
+       });
+}
+
+void UniversalSwitchSettingsPagePresenter::createScanningGropu()
+{
+       groups_.emplace_back("IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_SCANNING");
+
+       auto &items = groups_.back().items_;
+       items.push_back(std::make_unique<ListItem>(
+               std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_SCANNING_AUTO_SCAN"},
+               std::string{},
+               [this](auto item) {
+                       DEBUG("Auto scan");
+               },
+               ListItem::WidgetType::toggle,
+               std::function<void(ListItem * item)>{},
+               std::function<void(ListItem * item)>{},
+               model_.autoScanState_.value()));
+       auto item = items.back().get();
+       model_.autoScanState_.attach([item](auto value) {
+               item->widgetState_ = value;
+       });
+
+       items.push_back(std::make_unique<ListItem>(
+               std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_SCANNING_AUTO_SCAN_INT"},
+               TranslatedString::create("IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_SECONDS", model_.autoScanInterval_.value()).str(),
+               [this](auto item) {
+                       DEBUG("Auto scan");
+               }));
+       item = items.back().get();
+       model_.autoScanInterval_.attach([item](auto value) {
+               item->description_ = TranslatedString::create("IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_SECONDS", value).str();
+       });
+
+       items.push_back(std::make_unique<ListItem>(
+               std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_SCANNING_NUM_OF_SCANS"},
+               std::to_string(model_.autoScanLoopsNumber_.value()),
+               [this](auto item) {
+                       DEBUG("Scan num");
+               }));
+       item = items.back().get();
+       model_.autoScanLoopsNumber_.attach([item](auto value) {
+               item->description_ = std::to_string(value);
+       });
+
+       items.push_back(std::make_unique<ListItem>(
+               std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_SCANNING_SCAN_METHOD"},
+               getScanMethodText(model_.scanMethod_.value()),
+               [this](auto item) {
+                       DEBUG("Scan method");
+               }));
+       item = items.back().get();
+       model_.scanMethod_.attach([item, this](auto value) {
+               item->description_ = getScanMethodText(value);
+       });
+
+       items.push_back(std::make_unique<ListItem>(
+               std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_SCANNING_SCAN_DIR"},
+               getScanDirectionText(model_.scanDirection_.value()),
+               [this](auto item) {
+                       DEBUG("Scan dir");
+               }));
+       item = items.back().get();
+       model_.scanDirection_.attach([item, this](auto value) {
+               item->description_ = getScanDirectionText(value);
+       });
+
+       items.push_back(std::make_unique<ListItem>(
+               std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_SCANNING_PT_SPEED"},
+               std::to_string(model_.pointScanSpeed_.value()),
+               [this](auto item) {
+                       DEBUG("Scan point speed");
+               }));
+       item = items.back().get();
+       model_.pointScanSpeed_.attach([item](auto value) {
+               item->description_ = std::to_string(value);
+       });
+}
+
+void UniversalSwitchSettingsPagePresenter::createAdditionalSettingsGroup()
+{
+       groups_.emplace_back("IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_ADD_SETTINGS");
+       auto &items = groups_.back().items_;
+
+       items.push_back(std::make_unique<ListItem>(
+               std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_ADD_SETTINGS_PAUSE_ON_FIRST"},
+               model_.pauseOnFirstState_.value() ? TranslatedString::create("IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_SECONDS", model_.pauseOnFirstTime_.value()).str()
+                                                                                 : std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_OFF"},
+               [this](auto item) {
+
+               },
+               ListItem::WidgetType::toggle,
+               [this](auto item) {
+                       model_.pauseOnFirstState_ = item->widgetState_.value();
+               },
+               std::function<void(ListItem * item)>{},
+               model_.pauseOnFirstState_.value()));
+       auto item = items.back().get();
+       auto pauseOnFirstCb = [this, item](auto value) {
+               if (model_.pauseOnFirstState_.value())
+                       item->description_ = TranslatedString::create("IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_SECONDS", model_.pauseOnFirstTime_.value()).str();
+               else
+                       item->description_ = "IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_OFF";
+       };
+       model_.pauseOnFirstState_.attach(pauseOnFirstCb);
+       model_.pauseOnFirstTime_.attach(pauseOnFirstCb);
+
+       items.push_back(std::make_unique<ListItem>(
+               std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_ADD_SETTINGS_TAP_DURATION"},
+               model_.tapDurationState_.value() ? TranslatedString::create("IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_SECONDS", model_.tapDurationValue_.value()).str()
+                                                                                : std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_OFF"},
+               [this](auto item) {
+                       DEBUG("tap duration widget");
+               },
+               ListItem::WidgetType::toggle,
+               [this](auto item) {
+                       DEBUG("tap duration");
+                       model_.tapDurationState_ = item->widgetState_.value();
+               },
+               std::function<void(ListItem * item)>{},
+               model_.tapDurationState_.value()));
+       item = items.back().get();
+       auto tapDurationCb = [this, item](auto value) {
+               if (model_.tapDurationState_.value())
+                       item->description_ = TranslatedString::create("IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_SECONDS", model_.tapDurationValue_.value()).str();
+               else
+                       item->description_ = "IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_OFF";
+       };
+       model_.tapDurationState_.attach(tapDurationCb);
+       model_.tapDurationValue_.attach(tapDurationCb);
+
+       items.push_back(std::make_unique<ListItem>(
+               std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_ADD_SETTINGS_SGL_IACTION_INT"},
+               model_.singleInteractionIntervalState_.value() ? TranslatedString::create("IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_SECONDS", model_.singleInteractionIntervalValue_.value()).str()
+                                                                                                          : std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_OFF"},
+               [this](auto item) {
+                       DEBUG("single interaction interval widget");
+               },
+               ListItem::WidgetType::toggle,
+               [this](auto item) {
+                       model_.singleInteractionIntervalState_ = item->widgetState_.value();
+               },
+               std::function<void(ListItem * item)>{},
+               model_.singleInteractionIntervalState_.value()));
+       item = items.back().get();
+       auto snglIntCb = [this, item](auto value) {
+               if (model_.singleInteractionIntervalState_.value())
+                       item->description_ = TranslatedString::create("IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_SECONDS", model_.singleInteractionIntervalValue_.value()).str();
+               else
+                       item->description_ = "IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_OFF";
+       };
+       model_.singleInteractionIntervalState_.attach(snglIntCb);
+       model_.singleInteractionIntervalValue_.attach(snglIntCb);
+
+       items.push_back(std::make_unique<ListItem>(
+               std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_ADD_SETTINGS_AUTO_TAP"},
+               model_.autoTapState_.value() ? TranslatedString::create("IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_SECONDS", model_.autoTapValue_.value()).str()
+                                                                        : std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_OFF"},
+               [this](auto item) {
+                       DEBUG("auto tap widget");
+               },
+               ListItem::WidgetType::toggle,
+               [this](auto item) {
+                       model_.autoTapState_ = item->widgetState_.value();
+                       DEBUG("auto tap");
+               },
+               std::function<void(ListItem * item)>{},
+               model_.autoTapState_.value()));
+       item = items.back().get();
+       auto autoTapCb = [this, item](auto value) {
+               if (model_.autoTapState_.value())
+                       item->description_ = TranslatedString::create("IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_SECONDS", model_.autoTapValue_.value()).str();
+               else
+                       item->description_ = "IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_OFF";
+       };
+       model_.autoTapState_.attach(autoTapCb);
+       model_.autoTapValue_.attach(autoTapCb);
+
+       items.push_back(std::make_unique<ListItem>(
+               std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_ADD_SETTINGS_AUTO_MOVE_INT"},
+               model_.autoMoveState_.value() ? TranslatedString::create("IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_SECONDS", model_.autoMoveValue_.value()).str()
+                                                                         : std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_OFF"},
+               [this](auto item) {
+                       DEBUG("auto move widget");
+               },
+               ListItem::WidgetType::toggle,
+               [this](auto item) {
+                       model_.autoMoveState_ = item->widgetState_.value();
+                       DEBUG("auto move");
+               },
+               std::function<void(ListItem * item)>{},
+               model_.autoMoveState_.value()));
+       item = items.back().get();
+       auto autoMoveCb = [this, item](auto value) {
+               if (model_.autoMoveState_.value())
+                       item->description_ = TranslatedString::create("IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_SECONDS", model_.autoMoveValue_.value()).str();
+               else
+                       item->description_ = "IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_OFF";
+       };
+       model_.autoMoveState_.attach(autoMoveCb);
+       model_.autoMoveValue_.attach(autoMoveCb);
+
+       items.push_back(std::make_unique<ListItem>(
+               std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_ADD_SETTINGS_AUTO_TAP_KBD"},
+               std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_ADD_SETTINGS_AUTO_TAP_KBD_SUB"},
+               [this](auto item) {
+                       model_.autoTapKeyboardState_ = item->widgetState_.value();
+               },
+               ListItem::WidgetType::toggle,
+               std::function<void(ListItem * item)>{},
+               std::function<void(ListItem * item)>{},
+               model_.autoTapKeyboardState_.value()));
+       item = items.back().get();
+       model_.autoTapKeyboardState_.attach([item, this](auto value) {
+               item->widgetState_ = value;
+       });
+}
+
+void UniversalSwitchSettingsPagePresenter::createFeedbackGroup()
+{
+       groups_.emplace_back("IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_FEEDBACK");
+       auto &items = groups_.back().items_;
+
+       items.push_back(std::make_unique<ListItem>(
+               std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_FEEDBACK_CURSOR_CL"},
+               getColorText(model_.cursorColor_.value()),
+               [this](auto item) {
+                       DEBUG("cursor color widget");
+               }));
+       auto item = items.back().get();
+       model_.cursorColor_.attach([item, this](auto value) {
+               item->description_ = getColorText(value);
+       });
+
+       items.push_back(std::make_unique<ListItem>(
+               std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_FEEDBACK_SOUND"},
+               model_.feedbackSoundState_.value() ? std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_ON"} : std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_OFF"},
+               [this](auto item) {
+                       DEBUG("feedback sound widget");
+               },
+               ListItem::WidgetType::toggle,
+               [this](auto item) {
+                       DEBUG("feedback sound");
+                       model_.feedbackSoundState_ = item->widgetState_.value();
+               },
+               std::function<void(ListItem * item)>{},
+               model_.feedbackSoundState_.value()));
+       item = items.back().get();
+       model_.feedbackSoundState_.attach([item, this](auto value) {
+               item->widgetState_ = value;
+               item->description_ = value ? "IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_ON" : "IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_OFF";
+       });
+
+       items.push_back(std::make_unique<ListItem>(
+               std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_FEEDBACK_VOICE"},
+               model_.feedbackVoiceState_.value() ? std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_ON"} : std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_OFF"},
+               [this](auto item) {
+                       DEBUG("feedback sound widget");
+               },
+               ListItem::WidgetType::toggle,
+               [this](auto item) {
+                       DEBUG("auto move");
+                       model_.feedbackVoiceState_ = item->widgetState_.value();
+               },
+               std::function<void(ListItem * item)>{},
+               model_.feedbackVoiceState_.value()));
+       item = items.back().get();
+       model_.feedbackVoiceState_.attach([item, this](auto value) {
+               item->widgetState_ = value;
+               item->description_ = value ? "IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_ON" : "IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_OFF";
+       });
+
+       items.push_back(std::make_unique<ListItem>(
+               std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_MANAGE"},
+               std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_MANAGE_SUB"},
+               [this](auto item) {
+                       DEBUG("manage groups");
+               }));
+}
+
+std::string UniversalSwitchSettingsPagePresenter::getScanDirectionText(ScanDirection scanDirection)
+{
+       switch (scanDirection) {
+       case ScanDirection::TO_BOTTOM:
+               return "IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_SCANNING_SCAN_DIR_TB";
+       case ScanDirection::TO_TOP:
+               return "IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_SCANNING_SCAN_DIR_BT";
+       default:
+               return "IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_UNDEFINED";
+       }
+}
+
+std::string UniversalSwitchSettingsPagePresenter::getScanMethodText(ScanMethod scanMethod)
+{
+       switch (scanMethod) {
+       case ScanMethod::POINT:
+               return "IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_SCANNING_SCAN_METHOD_POINT";
+       case ScanMethod::ROW:
+               return "IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_SCANNING_SCAN_METHOD_ROW";
+       default:
+               return "IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_UNDEFINED";
+       }
+}
+
+std::string UniversalSwitchSettingsPagePresenter::getColorText(Color color)
+{
+       if (color == Color::RED)
+               return "IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_FEEDBACK_CURSOR_CL_RED";
+       if (color == Color::ORANGE)
+               return "IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_FEEDBACK_CURSOR_CL_ORANGE";
+       if (color == Color::YELLOW)
+               return "IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_FEEDBACK_CURSOR_CL_YELLOW";
+       if (color == Color::GREEN)
+               return "IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_FEEDBACK_CURSOR_CL_GREEN";
+       if (color == Color::BLUE)
+               return "IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_FEEDBACK_CURSOR_CL_BLUE";
+       if (color == Color::GRAY)
+               return "IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_FEEDBACK_CURSOR_CL_GRAY";
+
+       return "IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_UNDEFINED";
+}
\ No newline at end of file
diff --git a/src/presenter/UniversalSwitchSettingsPagePresenter.hpp b/src/presenter/UniversalSwitchSettingsPagePresenter.hpp
new file mode 100644 (file)
index 0000000..3837208
--- /dev/null
@@ -0,0 +1,26 @@
+#ifndef UNIVERSAL_SWITCH_SETTINGS_PAGE_PRESENTER_HPP
+#define UNIVERSAL_SWITCH_SETTINGS_PAGE_PRESENTER_HPP
+
+#include "ListPresenter.hpp"
+#include "SwitchesPage.hpp"
+#include "UniversalSwitchSettingsPageModel.hpp"
+
+class UniversalSwitchSettingsPagePresenter : public ListPresenter
+{
+       public:
+       UniversalSwitchSettingsPagePresenter();
+
+       private:
+       void createSwitchesGroup();
+       void createScanningGropu();
+       void createAdditionalSettingsGroup();
+       void createFeedbackGroup();
+       static std::string getScanDirectionText(ScanDirection scanDirection);
+       static std::string getScanMethodText(ScanMethod scanMethod);
+       static std::string getColorText(Color color);
+
+       UniversalSwitchSettingsPageModel model_;
+       std::unique_ptr<SwitchesPage> switchesPage_;
+};
+
+#endif
\ No newline at end of file
index 82738cd..2614597 100644 (file)
@@ -64,6 +64,16 @@ Color::Color(int r, int g, int b, int a)
 {
 }
 
+bool Color::operator==(const Color &other)
+{
+       return toRGBAInt() == other.toRGBAInt();
+}
+
+bool Color::operator!=(const Color &other)
+{
+       return toRGBAInt() != other.toRGBAInt();
+}
+
 int Color::getR() const
 {
        return r;
@@ -107,4 +117,11 @@ Color Color::fromRGBA(int rgba)
 Color Color::fromABGR(int abgr)
 {
        return {abgr, abgr >> 8, abgr >> 16, abgr >> 24};
-}
\ No newline at end of file
+}
+
+const Color Color::RED = Color::fromRGBA(0xff0000ff);
+const Color Color::ORANGE = Color::fromRGBA(0xff8000ff);
+const Color Color::YELLOW = Color::fromRGBA(0xffff00ff);
+const Color Color::GREEN = Color::fromRGBA(0x00ff00ff);
+const Color Color::BLUE = Color::fromRGBA(0x0000ffff);
+const Color Color::GRAY = Color::fromRGBA(0x808080ff);
\ No newline at end of file
index 94405d0..3bb92c8 100644 (file)
@@ -72,7 +72,23 @@ struct Rectangle
 class Color
 {
        public:
+       Color() = default;
        Color(int r, int g, int b, int a = {});
+       bool operator==(const Color &other);
+       bool operator!=(const Color &other);
+       // static const int RED_RGBAInt = 0xff0000ff;
+       // static const int ORANGE_RGBAInt = 0xff8000ff;
+       // static const int YELLOW_RGBAInt = 0xffff00ff;
+       // static const int GREEN_RGBAInt = 0x00ff00ff;
+       // static const int BLUE_RGBAInt = 0x0000ffff;
+       // static const int GRAY_RGBAInt = 0x808080ff;
+
+       static const Color RED;
+       static const Color ORANGE;
+       static const Color YELLOW;
+       static const Color GREEN;
+       static const Color BLUE;
+       static const Color GRAY;
 
        int getR() const;
        int getG() const;
@@ -86,10 +102,10 @@ class Color
        static Color fromABGR(int abgr);
 
        private:
-       int r;
-       int g;
-       int b;
-       int a;
+       int r = 0;
+       int g = 0;
+       int b = 0;
+       int a = 0;
 };
 
 #endif
\ No newline at end of file
index 530b696..da267e1 100644 (file)
@@ -59,6 +59,7 @@ ListView::ListView(const NavigationContext &context, Presenter *presenter)
                },
                        "<font_size=30>" + TranslatedString{action->title_.value()}.str() + "</font_size>",
                        "naviframe/title_right");
+               titleRightButton_->disable(!action->enabled_.value());
                action->title_.attach([this](auto val) {
                        auto formatedText = "<font_size=30>" + TranslatedString{val}.str() + "</font_size>";
                        titleRightButton_->setText(formatedText);