{
auto multiSelector = new Ux::CircleSelector();
multiSelector->create(m_ContentLayout);
+ multiSelector->setAccessibilityStrings({
+ "WDS_TTS_TBOPT_SELECT_MODE_POP_UP",
+ "WDS_TTS_TBBODY_DOUBLE_TAP_TO_CLOSE_THE_POP_UP",
+ "WDS_TTS_TBBODY_DOUBLE_TAP_TO_SELECT_ALL",
+ "WDS_TTS_TBBODY_DOUBLE_TAP_TO_DESELECT_ALL" });
elm_object_part_content_set(m_ContentLayout, "elm.swallow.icon", multiSelector->getEvasObject());
return multiSelector;
* @return Accessible object.
*/
EXPORT_API Evas_Object *createTextAccessObject(Evas_Object *layout, const char *part);
+
+ /**
+ * @brief ATSPI reading information callback @ref Elm_Atspi_Reading_Info_Cb.
+ * @remark Depend on user pass translatable string in elm_atspi_accessible_*_cb_set functions as user data.
+ * @param[in] text Translatable string
+ * @param[in] obj Evas object, which was set this callback
+ * @return Newly constructed string.
+ * @see elm_atspi_accessible_name_cb_set().
+ * @see elm_atspi_accessible_description_cb_set().
+ */
+ EXPORT_API char *getTranslatableAccessText(void *text, Evas_Object *obj);
}
#endif /* UI_ACCESSIBILITY_H */
class EXPORT_API CircleSelector : public Ux::MultiSelector
{
public:
+ /**
+ * @brief Structure with information, that should be pronounced by accessibility engine.
+ */
+ struct AccessibilityStrings
+ {
+ const char *name; /**< Selector name. */
+ const char *description; /**< Selector description. */
+ const char *selectAllDescription; /**< Description for "Select all" item. */
+ const char *deselectAllDescription; /**< Description for "Deselect all" item. */
+ };
+
+ CircleSelector();
+
/**
* @brief Set count of selected items.
*/
void setCount(size_t count);
+ /**
+ * @brief Set accessibility strings.
+ * @param[in] strings Accessibility strings.
+ * @see AccessibilityStrings.
+ */
+ void setAccessibilityStrings(const AccessibilityStrings &strings);
+
private:
virtual Evas_Object *onCreate(Evas_Object *parent) override;
void onButtonClicked(Evas_Object *button, void *eventInfo);
+ void makeAccessible(Evas_Object *menu);
+ void makeAccessible(Elm_Object_Item *item, const char *description);
+
+ AccessibilityStrings m_AccessibilityStrings;
};
}
*/
#include "Ux/CircleSelector.h"
+#include "Ui/Accessibility.h"
#include "Ui/CircleMenu.h"
#include "Utils/Callback.h"
#define BUF_SIZE 8
+using namespace Ui;
using namespace Ux;
+CircleSelector::CircleSelector()
+ : m_AccessibilityStrings{ nullptr }
+{
+}
+
void CircleSelector::setCount(size_t count)
{
char buf[BUF_SIZE];
elm_object_text_set(getEvasObject(), buf);
}
+void CircleSelector::setAccessibilityStrings(const AccessibilityStrings &strings)
+{
+ m_AccessibilityStrings = strings;
+}
+
Evas_Object *CircleSelector::onCreate(Evas_Object *parent)
{
auto button = elm_button_add(parent);
void CircleSelector::onButtonClicked(Evas_Object *button, void *eventInfo)
{
- auto menu = new Ui::CircleMenu();
+ auto menu = new CircleMenu();
menu->create(button);
if (getState() != SelectedAll) {
- menu->addItem(getStrings().selectAll, [this] {
+ auto item = menu->addItem(getStrings().selectAll, [this] {
notifyChanged(SelectedAll);
});
+ makeAccessible(item, m_AccessibilityStrings.selectAllDescription);
}
if (getState() != SelectedNone) {
- menu->addItem(getStrings().deselectAll, [this] {
+ auto item = menu->addItem(getStrings().deselectAll, [this] {
notifyChanged(SelectedNone);
});
+ makeAccessible(item, m_AccessibilityStrings.deselectAllDescription);
}
menu->show();
+
+ makeAccessible(menu->getEvasObject());
+}
+
+void CircleSelector::makeAccessible(Evas_Object *menu)
+{
+ elm_atspi_accessible_reading_info_type_set(menu, Elm_Accessible_Reading_Info_Type(
+ ELM_ACCESSIBLE_READING_INFO_TYPE_NAME |
+ ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION));
+ //FIXME Use default role when menu odd information pronunciation will be fixed
+ elm_atspi_accessible_role_set(menu, ELM_ATSPI_ROLE_PUSH_BUTTON);
+ elm_atspi_accessible_name_cb_set(menu, getTranslatableAccessText, m_AccessibilityStrings.name);
+ elm_atspi_accessible_description_cb_set(menu, getTranslatableAccessText, m_AccessibilityStrings.description);
+
+ elm_access_action_cb_set(menu, ELM_ACCESS_ACTION_ACTIVATE,
+ [](void *, Evas_Object *obj, Elm_Access_Action_Info *) {
+ elm_ctxpopup_dismiss(obj);
+ return EINA_TRUE;
+ }, nullptr);
+}
+
+void CircleSelector::makeAccessible(Elm_Object_Item *item, const char *description)
+{
+ elm_atspi_accessible_reading_info_type_set(item, ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
+ elm_atspi_accessible_description_cb_set(item, getTranslatableAccessText, description);
}