From a1f2bcc90611e8af991ac0d062910920e6c24f0c Mon Sep 17 00:00:00 2001 From: Oskar Chodowicz Date: Wed, 15 May 2019 10:14:07 +0200 Subject: [PATCH] Universal Switch Settings Page in MVP Change-Id: I5c680e9c0ea52fc9586d6f4b92b509a2d61e2631 --- po/en.po | 4 +- src/model/UniversalSwitchSettingsPageModel.cpp | 118 +++++++ src/model/UniversalSwitchSettingsPageModel.hpp | 78 +++++ src/presenter/ListPresenter.cpp | 2 +- src/presenter/UniversalSwitchPagePresenter.cpp | 5 +- .../UniversalSwitchSettingsPagePresenter.cpp | 344 +++++++++++++++++++++ .../UniversalSwitchSettingsPagePresenter.hpp | 26 ++ src/utils/Geometry.cpp | 19 +- src/utils/Geometry.hpp | 24 +- src/view/ListView.cpp | 1 + 10 files changed, 612 insertions(+), 9 deletions(-) create mode 100644 src/model/UniversalSwitchSettingsPageModel.cpp create mode 100644 src/model/UniversalSwitchSettingsPageModel.hpp create mode 100644 src/presenter/UniversalSwitchSettingsPagePresenter.cpp create mode 100644 src/presenter/UniversalSwitchSettingsPagePresenter.hpp diff --git a/po/en.po b/po/en.po index 06d56bd..fe74dfe 100644 --- 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 index 0000000..eefc0ae --- /dev/null +++ b/src/model/UniversalSwitchSettingsPageModel.cpp @@ -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::instance().registerAndGet( + 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::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>>()>("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(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 index 0000000..bd6abf8 --- /dev/null +++ b/src/model/UniversalSwitchSettingsPageModel.hpp @@ -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 configuredSwitchesCount_; + + ObservableProperty autoScanState_; + ObservableProperty autoScanInterval_; + ObservableProperty autoScanLoopsNumber_; + + ObservableProperty scanMethod_; + ObservableProperty scanDirection_; + ObservableProperty pointScanSpeed_; + + ObservableProperty pauseOnFirstState_; + ObservableProperty pauseOnFirstTime_; + + ObservableProperty tapDurationState_; + ObservableProperty tapDurationValue_; + + ObservableProperty singleInteractionIntervalState_; + ObservableProperty singleInteractionIntervalValue_; + + ObservableProperty autoTapState_; + ObservableProperty autoTapValue_; + + ObservableProperty autoMoveState_; + ObservableProperty autoMoveValue_; + + ObservableProperty autoTapKeyboardState_; + + ObservableProperty cursorColor_; + + ObservableProperty feedbackSoundState_; + ObservableProperty feedbackVoiceState_; + + private: + template + void synchronizePropertyWithVConf(ObservableProperty &property, const std::string &vconfKey, T defaultValue) + { + vconfHandles_.push_back(Singleton::instance().registerAndGet( + vconfKey, + defaultValue, + [&property](auto value) { + property = value; + })); + + property.attach([this, vconfKey](auto newValue) { + Singleton::instance().set(vconfKey, newValue); + }); + } + std::vector vconfHandles_; + DBus::DBusWrapper::ConnectionPtr connectionPtr_; + DBus::DBusClient dBusClient_; +}; + +#endif \ No newline at end of file diff --git a/src/presenter/ListPresenter.cpp b/src/presenter/ListPresenter.cpp index d0d166c..7d14d1e 100644 --- a/src/presenter/ListPresenter.cpp +++ b/src/presenter/ListPresenter.cpp @@ -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(); diff --git a/src/presenter/UniversalSwitchPagePresenter.cpp b/src/presenter/UniversalSwitchPagePresenter.cpp index a855fa3..f806c43 100644 --- a/src/presenter/UniversalSwitchPagePresenter.cpp +++ b/src/presenter/UniversalSwitchPagePresenter.cpp @@ -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("titleRightAction", "IDS_ACCS_SETTINGS_CAPS", [this](auto action) { - universalSwitchSettingsPage_ = std::make_unique(); + // universalSwitchSettingsPage_ = std::make_unique(); + Singleton::instance().push(std::make_unique()); }, model_.dbusConfigurationServiceState_.value())); diff --git a/src/presenter/UniversalSwitchSettingsPagePresenter.cpp b/src/presenter/UniversalSwitchSettingsPagePresenter.cpp new file mode 100644 index 0000000..e3ab566 --- /dev/null +++ b/src/presenter/UniversalSwitchSettingsPagePresenter.cpp @@ -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(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(); + 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( + std::string{"IDS_ACCS_UNIVERSAL_SWITCH_SETTINGS_GROUP_SCANNING_AUTO_SCAN"}, + std::string{}, + [this](auto item) { + DEBUG("Auto scan"); + }, + ListItem::WidgetType::toggle, + std::function{}, + std::function{}, + model_.autoScanState_.value())); + auto item = items.back().get(); + model_.autoScanState_.attach([item](auto value) { + item->widgetState_ = value; + }); + + items.push_back(std::make_unique( + 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( + 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( + 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( + 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( + 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( + 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{}, + 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( + 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{}, + 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( + 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{}, + 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( + 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{}, + 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( + 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{}, + 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( + 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{}, + std::function{}, + 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( + 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( + 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{}, + 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( + 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{}, + 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( + 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 index 0000000..3837208 --- /dev/null +++ b/src/presenter/UniversalSwitchSettingsPagePresenter.hpp @@ -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_; +}; + +#endif \ No newline at end of file diff --git a/src/utils/Geometry.cpp b/src/utils/Geometry.cpp index 82738cd..2614597 100644 --- a/src/utils/Geometry.cpp +++ b/src/utils/Geometry.cpp @@ -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 diff --git a/src/utils/Geometry.hpp b/src/utils/Geometry.hpp index 94405d0..3bb92c8 100644 --- a/src/utils/Geometry.hpp +++ b/src/utils/Geometry.hpp @@ -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 diff --git a/src/view/ListView.cpp b/src/view/ListView.cpp index 530b696..da267e1 100644 --- a/src/view/ListView.cpp +++ b/src/view/ListView.cpp @@ -59,6 +59,7 @@ ListView::ListView(const NavigationContext &context, Presenter *presenter) }, "" + TranslatedString{action->title_.value()}.str() + "", "naviframe/title_right"); + titleRightButton_->disable(!action->enabled_.value()); action->title_.attach([this](auto val) { auto formatedText = "" + TranslatedString{val}.str() + ""; titleRightButton_->setText(formatedText); -- 2.7.4