From: Youngsun Suh Date: Fri, 12 Apr 2024 07:19:18 +0000 (+0900) Subject: Add imgSrc to GetAttribute return map if available X-Git-Tag: dali_2.3.20~6^2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=b181a7cd62b83030744f0a36c5b483e9418d2023 Add imgSrc to GetAttribute return map if available Change-Id: I9f9df3905ab13442e5ff12a04414484a25f3d41b --- diff --git a/automated-tests/src/dali-toolkit-internal/utc-Dali-Accessibility-Accessible.cpp b/automated-tests/src/dali-toolkit-internal/utc-Dali-Accessibility-Accessible.cpp index f76c4a0..eee08a7 100644 --- a/automated-tests/src/dali-toolkit-internal/utc-Dali-Accessibility-Accessible.cpp +++ b/automated-tests/src/dali-toolkit-internal/utc-Dali-Accessibility-Accessible.cpp @@ -19,12 +19,13 @@ // test harness headers before dali headers. #include -#include #include #include +#include +#include -#include #include +#include #include #include @@ -45,10 +46,10 @@ int utcDaliAccessibilityCheckBoxButtonGetStates(void) ToolkitTestApplication application; auto check_box_button = Toolkit::CheckBoxButton::New(); - auto q = Dali::Accessibility::Accessible::Get( check_box_button ); - DALI_TEST_CHECK( q ); + auto q = Dali::Accessibility::Accessible::Get(check_box_button); + DALI_TEST_CHECK(q); auto states = q->GetStates(); - DALI_TEST_EQUALS( (int) states[ Dali::Accessibility::State::SELECTABLE ], (int) true, TEST_LOCATION ); + DALI_TEST_EQUALS((int)states[Dali::Accessibility::State::SELECTABLE], (int)true, TEST_LOCATION); END_TEST; } @@ -60,9 +61,9 @@ int utcDaliAccessibilityCheckLabelText(void) auto check_box_button = Toolkit::CheckBoxButton::New(); //check_box_button.SetLabelText( "button" ); check_box_button.SetProperty(Toolkit::Button::Property::LABEL, "button"); - auto q = Dali::Accessibility::Accessible::Get( check_box_button ); - DALI_TEST_CHECK( q ); - DALI_TEST_EQUALS( q->GetName(), "button", TEST_LOCATION ); + auto q = Dali::Accessibility::Accessible::Get(check_box_button); + DALI_TEST_CHECK(q); + DALI_TEST_EQUALS(q->GetName(), "button", TEST_LOCATION); END_TEST; } @@ -77,7 +78,7 @@ int UtcDaliAccessibilityCheckShowingState(void) parentButton.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT); parentButton.SetProperty(Actor::Property::POSITION, Dali::Vector2(0.0f, 0.0f)); parentButton.SetProperty(Actor::Property::SIZE, Dali::Vector2(200.0f, 200.0f)); - application.GetScene().Add( parentButton ); + application.GetScene().Add(parentButton); // Toatally inside of parent auto buttonA = Toolkit::PushButton::New(); @@ -99,7 +100,7 @@ int UtcDaliAccessibilityCheckShowingState(void) auto buttonC = Toolkit::PushButton::New(); buttonC.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT); buttonC.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT); - buttonC.SetProperty(Actor::Property::POSITION, Dali::Vector2(100.0f,100.0f)); + buttonC.SetProperty(Actor::Property::POSITION, Dali::Vector2(100.0f, 100.0f)); buttonC.SetProperty(Actor::Property::SIZE, Dali::Vector2(200.0f, 200.0f)); parentButton.Add(buttonC); @@ -109,17 +110,17 @@ int UtcDaliAccessibilityCheckShowingState(void) auto q = Dali::Accessibility::Accessible::Get(buttonA); DALI_TEST_CHECK(q); auto states = q->GetStates(); - DALI_TEST_EQUALS((int) states[Dali::Accessibility::State::SHOWING], (int) true, TEST_LOCATION); + DALI_TEST_EQUALS((int)states[Dali::Accessibility::State::SHOWING], (int)true, TEST_LOCATION); q = Dali::Accessibility::Accessible::Get(buttonB); DALI_TEST_CHECK(q); states = q->GetStates(); - DALI_TEST_EQUALS((int) states[Dali::Accessibility::State::SHOWING], (int) true, TEST_LOCATION); + DALI_TEST_EQUALS((int)states[Dali::Accessibility::State::SHOWING], (int)true, TEST_LOCATION); q = Dali::Accessibility::Accessible::Get(buttonC); DALI_TEST_CHECK(q); states = q->GetStates(); - DALI_TEST_EQUALS((int) states[Dali::Accessibility::State::SHOWING], (int) true, TEST_LOCATION); + DALI_TEST_EQUALS((int)states[Dali::Accessibility::State::SHOWING], (int)true, TEST_LOCATION); // Make SHOWING object invisible buttonC.SetProperty(Actor::Property::VISIBLE, false); @@ -128,7 +129,7 @@ int UtcDaliAccessibilityCheckShowingState(void) application.Render(16); states = q->GetStates(); - DALI_TEST_EQUALS((int) states[Dali::Accessibility::State::SHOWING], (int) false, TEST_LOCATION); + DALI_TEST_EQUALS((int)states[Dali::Accessibility::State::SHOWING], (int)false, TEST_LOCATION); // Make SHOWING parent invisible parentButton.SetProperty(Actor::Property::VISIBLE, false); @@ -139,7 +140,7 @@ int UtcDaliAccessibilityCheckShowingState(void) q = Dali::Accessibility::Accessible::Get(buttonA); DALI_TEST_CHECK(q); states = q->GetStates(); - DALI_TEST_EQUALS((int) states[Dali::Accessibility::State::SHOWING], (int) false, TEST_LOCATION); + DALI_TEST_EQUALS((int)states[Dali::Accessibility::State::SHOWING], (int)false, TEST_LOCATION); END_TEST; } @@ -206,3 +207,70 @@ int utcDaliAutomationId(void) END_TEST; } + +int utcDaliImgSrc(void) +{ + ToolkitTestApplication application; + const std::string imageSrcKey = "imgSrc"; + // Check that imgSrc is NOT added for non-image view w/ no additional property + { + const auto checkBoxButton = Toolkit::CheckBoxButton::New(); + const auto controlAccessible = Dali::Accessibility::Accessible::Get(checkBoxButton); + auto attributes = controlAccessible->GetAttributes(); + DALI_TEST_CHECK(attributes.find(imageSrcKey) == attributes.end()); + } + + // Check that imgSrc is NOT added for non-image view w/ additional properties + { + const auto textLabel = Toolkit::TextLabel::New("Hello"); + const auto controlAccessible = Dali::Accessibility::Accessible::Get(textLabel); + auto attributes = controlAccessible->GetAttributes(); + DALI_TEST_CHECK(attributes.find(imageSrcKey) == attributes.end()); + } + + // Check that imgSrc is added for image view w/ Url + { + const std::string imagePath = "gallery-small-1.jpg"; + const auto imageView = Toolkit::ImageView::New(imagePath); + const auto controlAccessible = Dali::Accessibility::Accessible::Get(imageView); + auto attributes = controlAccessible->GetAttributes(); + DALI_TEST_CHECK(attributes.find(imageSrcKey) != attributes.end()); + DALI_TEST_EQUALS(attributes[imageSrcKey], imagePath, TEST_LOCATION); + } + + // Check that imgSrc is added for image view w/ imageMap; single url case + { + const std::string imagePathForImageMap = "icon-edit.png"; + Property::Map imageMap; + imageMap[Toolkit::ImageVisual::Property::URL] = imagePathForImageMap; + imageMap[Toolkit::ImageVisual::Property::RELEASE_POLICY] = Toolkit::ImageVisual::ReleasePolicy::DETACHED; + + auto imageView = Toolkit::ImageView::New(); + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, imageMap); + + const auto controlAccessible = Dali::Accessibility::Accessible::Get(imageView); + auto attributes = controlAccessible->GetAttributes(); + DALI_TEST_CHECK(attributes.find(imageSrcKey) != attributes.end()); + DALI_TEST_EQUALS(attributes[imageSrcKey], imagePathForImageMap, TEST_LOCATION); + } + + // Check that imgSrc is added for image view w/ imageMap; url array returns first element + { + const std::string image1 = "application-icon-20.png"; + const std::string image2 = "application-icon-21.png"; + Property::Map imageMap; + Property::Array urls{image1, image2}; + imageMap[Toolkit::ImageVisual::Property::URL] = urls; + imageMap[Toolkit::ImageVisual::Property::RELEASE_POLICY] = Toolkit::ImageVisual::ReleasePolicy::DETACHED; + + auto imageView = Toolkit::ImageView::New(); + imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, imageMap); + + const auto controlAccessible = Dali::Accessibility::Accessible::Get(imageView); + auto attributes = controlAccessible->GetAttributes(); + DALI_TEST_CHECK(attributes.find(imageSrcKey) != attributes.end()); + DALI_TEST_EQUALS(attributes[imageSrcKey], image1, TEST_LOCATION); + } + + END_TEST; +} diff --git a/dali-toolkit/devel-api/controls/control-accessible.cpp b/dali-toolkit/devel-api/controls/control-accessible.cpp index 8788ade..4aef1f0 100644 --- a/dali-toolkit/devel-api/controls/control-accessible.cpp +++ b/dali-toolkit/devel-api/controls/control-accessible.cpp @@ -25,11 +25,13 @@ #include #include +#include #include // INTERNAL INCLUDES #include #include +#include #include #include #include @@ -39,7 +41,9 @@ namespace Dali::Toolkit::DevelControl { namespace { -static std::string GetLocaleText(std::string string, const char* domain = "dali-toolkit") +constexpr const char* ATTR_IMG_SRC_KEY = "imgSrc"; + +std::string GetLocaleText(std::string string, const char* domain = "dali-toolkit") { #ifdef DGETTEXT_ENABLED /*TODO: currently non-localized string is used as a key for translation lookup. In case the lookup key formatting is forced @@ -50,7 +54,7 @@ static std::string GetLocaleText(std::string string, const char* domain = "dali- #endif } -static Dali::Actor CreateHighlightIndicatorActor() +Dali::Actor CreateHighlightIndicatorActor() { std::string focusBorderImagePath(AssetManager::GetDaliImagePath()); focusBorderImagePath += "/keyboard_focus.9.png"; @@ -65,6 +69,45 @@ static Dali::Actor CreateHighlightIndicatorActor() return actor; } + +std::string FetchImageSrcFromMap(const Dali::Property::Map& imageMap) +{ + auto urlVal = imageMap.Find(Toolkit::ImageVisual::Property::URL); + if(urlVal) + { + if(urlVal->GetType() == Dali::Property::STRING) + { + return urlVal->Get(); + } + else if(urlVal->GetType() == Dali::Property::ARRAY) + { + auto urlArray = urlVal->GetArray(); + if(urlArray && !urlArray->Empty()) + { + // Returns first element if url is an array + return (*urlArray)[0].Get(); + } + } + } + return {}; +} + +std::string FetchImageSrc(const Toolkit::ImageView& imageView) +{ + const auto imageUrl = imageView.GetProperty(Toolkit::ImageView::Property::IMAGE); + if(!imageUrl.empty()) + { + return imageUrl; + } + + const auto imageMap = imageView.GetProperty(Toolkit::ImageView::Property::IMAGE); + if(!imageMap.Empty()) + { + return FetchImageSrcFromMap(imageMap); + } + return {}; +} + } // unnamed namespace ControlAccessible::ControlAccessible(Dali::Actor self) @@ -235,6 +278,15 @@ Dali::Accessibility::Attributes ControlAccessible::GetAttributes() const result.emplace(automationIdKey, std::move(automationId)); } + if(auto imageView = Toolkit::ImageView::DownCast(Self())) + { + auto imageSrc = FetchImageSrc(imageView); + if(!imageSrc.empty()) + { + result.emplace(ATTR_IMG_SRC_KEY, std::move(imageSrc)); + } + } + // Add "class" if not present already if(result.find(classKey) == result.end()) {