#include <dali-toolkit/internal/controls/text-controls/text-label-impl.h>
// EXTERNAL INCLUDES
+#include <dali/public-api/common/dali-common.h>
#include <dali/public-api/object/type-registry-helper.h>
-#include <dali/public-api/common/stage.h>
+#include <dali/devel-api/common/stage.h>
#include <dali/devel-api/object/property-helper-devel.h>
#include <dali/devel-api/adaptor-framework/image-loading.h>
+#include <dali/devel-api/adaptor-framework/window-devel.h>
#include <dali/integration-api/debug.h>
// INTERNAL INCLUDES
namespace
{
- const unsigned int DEFAULT_RENDERING_BACKEND = Dali::Toolkit::DevelText::DEFAULT_RENDERING_BACKEND;
-
- /**
- * @brief How the text visual should be aligned vertically inside the control.
- *
- * 0.0f aligns the text to the top, 0.5f aligns the text to the center, 1.0f aligns the text to the bottom.
- * The alignment depends on the alignment value of the text label (Use Text::VerticalAlignment enumerations).
- */
- const float VERTICAL_ALIGNMENT_TABLE[ Text::VerticalAlignment::BOTTOM + 1 ] =
- {
- 0.0f, // VerticalAlignment::TOP
- 0.5f, // VerticalAlignment::CENTER
- 1.0f // VerticalAlignment::BOTTOM
- };
-
- const std::string TEXT_FIT_ENABLE_KEY( "enable" );
- const std::string TEXT_FIT_MIN_SIZE_KEY( "minSize" );
- const std::string TEXT_FIT_MAX_SIZE_KEY( "maxSize" );
- const std::string TEXT_FIT_STEP_SIZE_KEY( "stepSize" );
- const std::string TEXT_FIT_FONT_SIZE_TYPE_KEY( "fontSizeType" );
-}
+const unsigned int DEFAULT_RENDERING_BACKEND = Dali::Toolkit::DevelText::DEFAULT_RENDERING_BACKEND;
-namespace
+/**
+ * @brief How the text visual should be aligned vertically inside the control.
+ *
+ * 0.0f aligns the text to the top, 0.5f aligns the text to the center, 1.0f aligns the text to the bottom.
+ * The alignment depends on the alignment value of the text label (Use Text::VerticalAlignment enumerations).
+ */
+const float VERTICAL_ALIGNMENT_TABLE[ Text::VerticalAlignment::BOTTOM + 1 ] =
{
+ 0.0f, // VerticalAlignment::TOP
+ 0.5f, // VerticalAlignment::CENTER
+ 1.0f // VerticalAlignment::BOTTOM
+};
+
+const std::string TEXT_FIT_ENABLE_KEY( "enable" );
+const std::string TEXT_FIT_MIN_SIZE_KEY( "minSize" );
+const std::string TEXT_FIT_MAX_SIZE_KEY( "maxSize" );
+const std::string TEXT_FIT_STEP_SIZE_KEY( "stepSize" );
+const std::string TEXT_FIT_FONT_SIZE_TYPE_KEY( "fontSizeType" );
#if defined ( DEBUG_ENABLED )
- Debug::Filter* gLogFilter = Debug::Filter::New(Debug::NoLogging, true, "LOG_TEXT_CONTROLS");
+Debug::Filter* gLogFilter = Debug::Filter::New(Debug::NoLogging, true, "LOG_TEXT_CONTROLS");
#endif
const Scripting::StringEnum AUTO_SCROLL_STOP_MODE_TABLE[] =
DALI_ANIMATABLE_PROPERTY_COMPONENT_REGISTRATION( Toolkit, TextLabel, "textColorAlpha", TEXT_COLOR_ALPHA, TEXT_COLOR, 3 )
DALI_TYPE_REGISTRATION_END()
+/// Parses the property map for the TEXT_FIT property
+void ParseTextFitProperty(Text::ControllerPtr& controller, const Property::Map* propertiesMap)
+{
+ if ( propertiesMap && !propertiesMap->Empty() )
+ {
+ bool enabled = false;
+ float minSize = 0.f;
+ float maxSize = 0.f;
+ float stepSize = 0.f;
+ bool isMinSizeSet = false, isMaxSizeSet = false, isStepSizeSet = false;
+ Controller::FontSizeType type = Controller::FontSizeType::POINT_SIZE;
+
+ const unsigned int numberOfItems = propertiesMap->Count();
+
+ // Parses and applies
+ for( unsigned int index = 0u; index < numberOfItems; ++index )
+ {
+ const KeyValuePair& valueGet = propertiesMap->GetKeyValue( index );
+
+ if( ( Controller::TextFitInfo::Property::TEXT_FIT_ENABLE == valueGet.first.indexKey ) || ( TEXT_FIT_ENABLE_KEY == valueGet.first.stringKey ) )
+ {
+ /// Enable key.
+ enabled = valueGet.second.Get< bool >();
+ }
+ else if( ( Controller::TextFitInfo::Property::TEXT_FIT_MIN_SIZE == valueGet.first.indexKey ) || ( TEXT_FIT_MIN_SIZE_KEY == valueGet.first.stringKey ) )
+ {
+ /// min size.
+ minSize = valueGet.second.Get< float >();
+ isMinSizeSet = true;
+ }
+ else if( ( Controller::TextFitInfo::Property::TEXT_FIT_MAX_SIZE == valueGet.first.indexKey ) || ( TEXT_FIT_MAX_SIZE_KEY == valueGet.first.stringKey ) )
+ {
+ /// max size.
+ maxSize = valueGet.second.Get< float >();
+ isMaxSizeSet = true;
+ }
+ else if( ( Controller::TextFitInfo::Property::TEXT_FIT_STEP_SIZE == valueGet.first.indexKey ) || ( TEXT_FIT_STEP_SIZE_KEY == valueGet.first.stringKey ) )
+ {
+ /// step size.
+ stepSize = valueGet.second.Get< float >();
+ isStepSizeSet = true;
+ }
+ else if( ( Controller::TextFitInfo::Property::TEXT_FIT_FONT_SIZE_TYPE == valueGet.first.indexKey ) || ( TEXT_FIT_FONT_SIZE_TYPE_KEY == valueGet.first.stringKey ) )
+ {
+ if( "pixelSize" == valueGet.second.Get< std::string >() )
+ {
+ type = Controller::FontSizeType::PIXEL_SIZE;
+ }
+ }
+ }
+
+ controller->SetTextFitEnabled( enabled );
+ if( isMinSizeSet )
+ {
+ controller->SetTextFitMinSize( minSize, type );
+ }
+ if( isMaxSizeSet )
+ {
+ controller->SetTextFitMaxSize( maxSize, type );
+ }
+ if( isStepSizeSet )
+ {
+ controller->SetTextFitStepSize( stepSize, type );
+ }
+ }
+}
+
} // namespace
Toolkit::TextLabel TextLabel::New()
if( label )
{
TextLabel& impl( GetImpl( label ) );
+ DALI_ASSERT_ALWAYS( impl.mController && "No text contoller" );
+
switch( index )
{
case Toolkit::DevelTextLabel::Property::RENDERING_BACKEND:
impl.mRenderingBackend = backend;
impl.mTextUpdateNeeded = true;
- if( impl.mController )
- {
- // When using the vector-based rendering, the size of the GLyphs are different
- TextAbstraction::GlyphType glyphType = (DevelText::RENDERING_VECTOR_BASED == impl.mRenderingBackend) ? TextAbstraction::VECTOR_GLYPH : TextAbstraction::BITMAP_GLYPH;
- impl.mController->SetGlyphType( glyphType );
- }
+ // When using the vector-based rendering, the size of the GLyphs are different
+ TextAbstraction::GlyphType glyphType = (DevelText::RENDERING_VECTOR_BASED == impl.mRenderingBackend) ? TextAbstraction::VECTOR_GLYPH : TextAbstraction::BITMAP_GLYPH;
+ impl.mController->SetGlyphType( glyphType );
}
break;
}
case Toolkit::TextLabel::Property::TEXT:
{
- if( impl.mController )
- {
- impl.mController->SetText( value.Get< std::string >() );
- }
+ impl.mController->SetText( value.Get< std::string >() );
break;
}
case Toolkit::TextLabel::Property::FONT_FAMILY:
{
- if( impl.mController )
- {
- const std::string& fontFamily = value.Get< std::string >();
+ const std::string& fontFamily = value.Get< std::string >();
- DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextLabel::SetProperty Property::FONT_FAMILY newFont(%s)\n", fontFamily.c_str() );
- impl.mController->SetDefaultFontFamily( fontFamily );
- }
+ DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextLabel::SetProperty Property::FONT_FAMILY newFont(%s)\n", fontFamily.c_str() );
+ impl.mController->SetDefaultFontFamily( fontFamily );
break;
}
case Toolkit::TextLabel::Property::FONT_STYLE:
}
case Toolkit::TextLabel::Property::POINT_SIZE:
{
- if( impl.mController )
- {
- const float pointSize = value.Get< float >();
+ const float pointSize = value.Get< float >();
- if( !Equals( impl.mController->GetDefaultFontSize( Text::Controller::POINT_SIZE ), pointSize ) )
- {
- impl.mController->SetDefaultFontSize( pointSize, Text::Controller::POINT_SIZE );
- }
+ if( !Equals( impl.mController->GetDefaultFontSize( Text::Controller::POINT_SIZE ), pointSize ) )
+ {
+ impl.mController->SetDefaultFontSize( pointSize, Text::Controller::POINT_SIZE );
}
break;
}
case Toolkit::TextLabel::Property::MULTI_LINE:
{
- if( impl.mController )
- {
- impl.mController->SetMultiLineEnabled( value.Get< bool >() );
- }
+ impl.mController->SetMultiLineEnabled( value.Get< bool >() );
break;
}
case Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT:
{
- if( impl.mController )
+ Text::HorizontalAlignment::Type alignment( static_cast< Text::HorizontalAlignment::Type >( -1 ) ); // Set to invalid value to ensure a valid mode does get set
+ if( Text::GetHorizontalAlignmentEnumeration( value, alignment ) )
{
- Text::HorizontalAlignment::Type alignment( static_cast< Text::HorizontalAlignment::Type >( -1 ) ); // Set to invalid value to ensure a valid mode does get set
- if( Text::GetHorizontalAlignmentEnumeration( value, alignment ) )
- {
- impl.mController->SetHorizontalAlignment( alignment );
- }
+ impl.mController->SetHorizontalAlignment( alignment );
}
break;
}
case Toolkit::TextLabel::Property::VERTICAL_ALIGNMENT:
{
- if( impl.mController )
+ Toolkit::Text::VerticalAlignment::Type alignment( static_cast< Text::VerticalAlignment::Type >( -1 ) ); // Set to invalid value to ensure a valid mode does get set
+ if( Text::GetVerticalAlignmentEnumeration( value, alignment ) )
{
- Toolkit::Text::VerticalAlignment::Type alignment( static_cast< Text::VerticalAlignment::Type >( -1 ) ); // Set to invalid value to ensure a valid mode does get set
- if( Text::GetVerticalAlignmentEnumeration( value, alignment ) )
- {
- impl.mController->SetVerticalAlignment( alignment );
- }
+ impl.mController->SetVerticalAlignment( alignment );
}
break;
}
case Toolkit::TextLabel::Property::ENABLE_MARKUP:
{
- if( impl.mController )
- {
- const bool enableMarkup = value.Get<bool>();
- impl.mController->SetMarkupProcessorEnabled( enableMarkup );
- }
+ const bool enableMarkup = value.Get<bool>();
+ impl.mController->SetMarkupProcessorEnabled( enableMarkup );
break;
}
case Toolkit::TextLabel::Property::ENABLE_AUTO_SCROLL:
{
- if( impl.mController )
+ const bool enableAutoScroll = value.Get<bool>();
+ // If request to auto scroll is the same as current state then do nothing.
+ if ( enableAutoScroll != impl.mController->IsAutoScrollEnabled() )
{
- const bool enableAutoScroll = value.Get<bool>();
- // If request to auto scroll is the same as current state then do nothing.
- if ( enableAutoScroll != impl.mController->IsAutoScrollEnabled() )
- {
- // If request is disable (false) and auto scrolling is enabled then need to stop it
- if ( enableAutoScroll == false )
- {
- if( impl.mTextScroller )
- {
- impl.mTextScroller->StopScrolling();
- }
- }
- // If request is enable (true) then start autoscroll as not already running
- else
+ // If request is disable (false) and auto scrolling is enabled then need to stop it
+ if ( enableAutoScroll == false )
+ {
+ if( impl.mTextScroller )
{
- impl.mController->SetAutoScrollEnabled( enableAutoScroll );
+ impl.mTextScroller->StopScrolling();
}
- }
+ }
+ // If request is enable (true) then start autoscroll as not already running
+ else
+ {
+ impl.mController->SetAutoScrollEnabled( enableAutoScroll );
+ }
}
break;
}
case Toolkit::TextLabel::Property::AUTO_SCROLL_STOP_MODE:
{
- if( !impl.mTextScroller )
- {
- impl.mTextScroller = Text::TextScroller::New( impl );
- }
- Toolkit::TextLabel::AutoScrollStopMode::Type stopMode = impl.mTextScroller->GetStopMode();
+ Text::TextScrollerPtr textScroller = impl.GetTextScroller();
+ Toolkit::TextLabel::AutoScrollStopMode::Type stopMode = textScroller->GetStopMode();
if( Scripting::GetEnumerationProperty< Toolkit::TextLabel::AutoScrollStopMode::Type >( value,
- AUTO_SCROLL_STOP_MODE_TABLE,
- AUTO_SCROLL_STOP_MODE_TABLE_COUNT,
- stopMode ) )
+ AUTO_SCROLL_STOP_MODE_TABLE,
+ AUTO_SCROLL_STOP_MODE_TABLE_COUNT,
+ stopMode ) )
{
- impl.mTextScroller->SetStopMode( stopMode );
+ textScroller->SetStopMode( stopMode );
}
break;
}
case Toolkit::TextLabel::Property::AUTO_SCROLL_SPEED:
{
- if( !impl.mTextScroller )
- {
- impl.mTextScroller = Text::TextScroller::New( impl );
- }
- impl.mTextScroller->SetSpeed( value.Get<int>() );
+ impl.GetTextScroller()->SetSpeed( value.Get<int>() );
break;
}
case Toolkit::TextLabel::Property::AUTO_SCROLL_LOOP_COUNT:
{
- if( !impl.mTextScroller )
- {
- impl.mTextScroller = Text::TextScroller::New( impl );
- }
- impl.mTextScroller->SetLoopCount( value.Get<int>() );
+ impl.GetTextScroller()->SetLoopCount( value.Get<int>() );
break;
}
case Toolkit::TextLabel::Property::AUTO_SCROLL_LOOP_DELAY:
{
- if( !impl.mTextScroller )
- {
- impl.mTextScroller = Text::TextScroller::New( impl );
- }
- impl.mTextScroller->SetLoopDelay( value.Get<float>() );
+ impl.GetTextScroller()->SetLoopDelay( value.Get<float>() );
break;
}
case Toolkit::TextLabel::Property::AUTO_SCROLL_GAP:
{
- if( !impl.mTextScroller )
- {
- impl.mTextScroller = Text::TextScroller::New( impl );
- }
- impl.mTextScroller->SetGap( value.Get<float>() );
+ impl.GetTextScroller()->SetGap( value.Get<float>() );
break;
}
case Toolkit::TextLabel::Property::LINE_SPACING:
{
- if( impl.mController )
- {
- const float lineSpacing = value.Get<float>();
-
- // Don't trigger anything if the line spacing didn't change
- if( impl.mController->SetDefaultLineSpacing( lineSpacing ) )
- {
- impl.mTextUpdateNeeded = true;
- }
- }
+ const float lineSpacing = value.Get<float>();
+ impl.mTextUpdateNeeded = impl.mController->SetDefaultLineSpacing( lineSpacing ) || impl.mTextUpdateNeeded;
break;
}
case Toolkit::TextLabel::Property::UNDERLINE:
{
- const bool update = SetUnderlineProperties( impl.mController, value, Text::EffectStyle::DEFAULT );
- if( update )
- {
- impl.mTextUpdateNeeded = true;
- }
+ impl.mTextUpdateNeeded = SetUnderlineProperties( impl.mController, value, Text::EffectStyle::DEFAULT ) || impl.mTextUpdateNeeded;
break;
}
case Toolkit::TextLabel::Property::SHADOW:
{
- const bool update = SetShadowProperties( impl.mController, value, Text::EffectStyle::DEFAULT );
- if( update )
- {
- impl.mTextUpdateNeeded = true;
- }
+ impl.mTextUpdateNeeded = SetShadowProperties( impl.mController, value, Text::EffectStyle::DEFAULT ) || impl.mTextUpdateNeeded;
break;
}
case Toolkit::TextLabel::Property::EMBOSS:
{
- const bool update = SetEmbossProperties( impl.mController, value, Text::EffectStyle::DEFAULT );
- if( update )
- {
- impl.mTextUpdateNeeded = true;
- }
+ impl.mTextUpdateNeeded = SetEmbossProperties( impl.mController, value, Text::EffectStyle::DEFAULT ) || impl.mTextUpdateNeeded;
break;
}
case Toolkit::TextLabel::Property::OUTLINE:
{
- const bool update = SetOutlineProperties( impl.mController, value, Text::EffectStyle::DEFAULT );
- if( update )
- {
- impl.mTextUpdateNeeded = true;
- }
+ impl.mTextUpdateNeeded = SetOutlineProperties( impl.mController, value, Text::EffectStyle::DEFAULT ) || impl.mTextUpdateNeeded;
break;
}
case Toolkit::TextLabel::Property::PIXEL_SIZE:
{
- if( impl.mController )
- {
- const float pixelSize = value.Get< float >();
- DALI_LOG_INFO( gLogFilter, Debug::General, "TextLabel %p PIXEL_SIZE %f\n", impl.mController.Get(), pixelSize );
+ const float pixelSize = value.Get< float >();
+ DALI_LOG_INFO( gLogFilter, Debug::General, "TextLabel %p PIXEL_SIZE %f\n", impl.mController.Get(), pixelSize );
- if( !Equals( impl.mController->GetDefaultFontSize( Text::Controller::PIXEL_SIZE ), pixelSize ) )
- {
- impl.mController->SetDefaultFontSize( pixelSize, Text::Controller::PIXEL_SIZE );
- }
+ if( !Equals( impl.mController->GetDefaultFontSize( Text::Controller::PIXEL_SIZE ), pixelSize ) )
+ {
+ impl.mController->SetDefaultFontSize( pixelSize, Text::Controller::PIXEL_SIZE );
}
break;
}
case Toolkit::TextLabel::Property::ELLIPSIS:
{
- if( impl.mController )
- {
- const bool ellipsis = value.Get<bool>();
- DALI_LOG_INFO( gLogFilter, Debug::General, "TextLabel %p ELLIPSIS %d\n", impl.mController.Get(), ellipsis );
+ const bool ellipsis = value.Get<bool>();
+ DALI_LOG_INFO( gLogFilter, Debug::General, "TextLabel %p ELLIPSIS %d\n", impl.mController.Get(), ellipsis );
- impl.mController->SetTextElideEnabled( ellipsis );
- }
+ impl.mController->SetTextElideEnabled( ellipsis );
break;
}
case Toolkit::TextLabel::Property::LINE_WRAP_MODE:
{
- if( impl.mController )
+ Text::LineWrap::Mode lineWrapMode( static_cast< Text::LineWrap::Mode >( -1 ) ); // Set to invalid value to ensure a valid mode does get set
+ if( GetLineWrapModeEnumeration( value, lineWrapMode ) )
{
- Text::LineWrap::Mode lineWrapMode( static_cast< Text::LineWrap::Mode >( -1 ) ); // Set to invalid value to ensure a valid mode does get set
- if( GetLineWrapModeEnumeration( value, lineWrapMode ) )
- {
- DALI_LOG_INFO( gLogFilter, Debug::General, "TextLabel %p LineWrap::MODE %d\n", impl.mController.Get(), lineWrapMode );
- impl.mController->SetLineWrapMode( lineWrapMode );
- }
+ DALI_LOG_INFO( gLogFilter, Debug::General, "TextLabel %p LineWrap::MODE %d\n", impl.mController.Get(), lineWrapMode );
+ impl.mController->SetLineWrapMode( lineWrapMode );
}
break;
}
case Toolkit::DevelTextLabel::Property::VERTICAL_LINE_ALIGNMENT:
{
- if( impl.mController && impl.mController->GetTextModel() )
+ if( impl.mController->GetTextModel() )
{
DevelText::VerticalLineAlignment::Type alignment = static_cast<DevelText::VerticalLineAlignment::Type>( value.Get<int>() );
}
case Toolkit::DevelTextLabel::Property::BACKGROUND:
{
- const bool update = SetBackgroundProperties( impl.mController, value, Text::EffectStyle::DEFAULT );
- if( update )
- {
- impl.mTextUpdateNeeded = true;
- }
+ impl.mTextUpdateNeeded = SetBackgroundProperties( impl.mController, value, Text::EffectStyle::DEFAULT ) || impl.mTextUpdateNeeded;
break;
}
case Toolkit::DevelTextLabel::Property::IGNORE_SPACES_AFTER_TEXT:
}
case Toolkit::DevelTextLabel::Property::TEXT_FIT:
{
- const Property::Map& propertiesMap = value.Get<Property::Map>();
-
- bool enabled = false;
- float minSize = 0.f;
- float maxSize = 0.f;
- float stepSize = 0.f;
- bool isMinSizeSet = false, isMaxSizeSet = false, isStepSizeSet = false;
- Controller::FontSizeType type = Controller::FontSizeType::POINT_SIZE;
-
- if ( !propertiesMap.Empty() )
- {
- const unsigned int numberOfItems = propertiesMap.Count();
-
- // Parses and applies
- for( unsigned int index = 0u; index < numberOfItems; ++index )
- {
- const KeyValuePair& valueGet = propertiesMap.GetKeyValue( index );
-
- if( ( Controller::TextFitInfo::Property::TEXT_FIT_ENABLE == valueGet.first.indexKey ) || ( TEXT_FIT_ENABLE_KEY == valueGet.first.stringKey ) )
- {
- /// Enable key.
- enabled = valueGet.second.Get< bool >();
- }
- else if( ( Controller::TextFitInfo::Property::TEXT_FIT_MIN_SIZE == valueGet.first.indexKey ) || ( TEXT_FIT_MIN_SIZE_KEY == valueGet.first.stringKey ) )
- {
- /// min size.
- minSize = valueGet.second.Get< float >();
- isMinSizeSet = true;
- }
- else if( ( Controller::TextFitInfo::Property::TEXT_FIT_MAX_SIZE == valueGet.first.indexKey ) || ( TEXT_FIT_MAX_SIZE_KEY == valueGet.first.stringKey ) )
- {
- /// max size.
- maxSize = valueGet.second.Get< float >();
- isMaxSizeSet = true;
- }
- else if( ( Controller::TextFitInfo::Property::TEXT_FIT_STEP_SIZE == valueGet.first.indexKey ) || ( TEXT_FIT_STEP_SIZE_KEY == valueGet.first.stringKey ) )
- {
- /// step size.
- stepSize = valueGet.second.Get< float >();
- isStepSizeSet = true;
- }
- else if( ( Controller::TextFitInfo::Property::TEXT_FIT_FONT_SIZE_TYPE == valueGet.first.indexKey ) || ( TEXT_FIT_FONT_SIZE_TYPE_KEY == valueGet.first.stringKey ) )
- {
- if( "pixelSize" == valueGet.second.Get< std::string >() )
- {
- type = Controller::FontSizeType::PIXEL_SIZE;
- }
- }
- }
-
- impl.mController->SetTextFitEnabled( enabled );
- if( isMinSizeSet )
- {
- impl.mController->SetTextFitMinSize( minSize, type );
- }
- if( isMaxSizeSet )
- {
- impl.mController->SetTextFitMaxSize( maxSize, type );
- }
- if( isStepSizeSet )
- {
- impl.mController->SetTextFitStepSize( stepSize, type );
- }
- }
+ ParseTextFitProperty(impl.mController, value.GetMap());
break;
}
case Toolkit::DevelTextLabel::Property::MIN_LINE_SIZE:
{
- if( impl.mController )
- {
- const float lineSize = value.Get<float>();
-
- if( impl.mController->SetDefaultLineSize( lineSize ) )
- {
- impl.mTextUpdateNeeded = true;
- }
- }
+ const float lineSize = value.Get<float>();
+ impl.mTextUpdateNeeded = impl.mController->SetDefaultLineSize( lineSize ) || impl.mTextUpdateNeeded;
break;
}
}
}
}
+Text::ControllerPtr TextLabel::getController() { return mController; }
+
Property::Value TextLabel::GetProperty( BaseObject* object, Property::Index index )
{
Property::Value value;
if( label )
{
TextLabel& impl( GetImpl( label ) );
+ DALI_ASSERT_DEBUG( impl.mController && "No text contoller" );
+
switch( index )
{
case Toolkit::DevelTextLabel::Property::RENDERING_BACKEND:
}
case Toolkit::TextLabel::Property::TEXT:
{
- if( impl.mController )
- {
- std::string text;
- impl.mController->GetText( text );
- value = text;
- }
+ std::string text;
+ impl.mController->GetText( text );
+ value = text;
break;
}
case Toolkit::TextLabel::Property::FONT_FAMILY:
{
- if( impl.mController )
- {
- value = impl.mController->GetDefaultFontFamily();
- }
+ value = impl.mController->GetDefaultFontFamily();
break;
}
case Toolkit::TextLabel::Property::FONT_STYLE:
}
case Toolkit::TextLabel::Property::POINT_SIZE:
{
- if( impl.mController )
- {
- value = impl.mController->GetDefaultFontSize( Text::Controller::POINT_SIZE );
- }
+ value = impl.mController->GetDefaultFontSize( Text::Controller::POINT_SIZE );
break;
}
case Toolkit::TextLabel::Property::MULTI_LINE:
{
- if( impl.mController )
- {
- value = impl.mController->IsMultiLineEnabled();
- }
+ value = impl.mController->IsMultiLineEnabled();
break;
}
case Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT:
{
- if( impl.mController )
- {
- const char* name = Text::GetHorizontalAlignmentString( impl.mController->GetHorizontalAlignment() );
+ const char* name = Text::GetHorizontalAlignmentString( impl.mController->GetHorizontalAlignment() );
- if ( name )
- {
- value = std::string( name );
- }
+ if ( name )
+ {
+ value = std::string( name );
}
break;
}
case Toolkit::TextLabel::Property::VERTICAL_ALIGNMENT:
{
- if( impl.mController )
+ const char* name = Text::GetVerticalAlignmentString( impl.mController->GetVerticalAlignment() );
+ if( name )
{
- const char* name = Text::GetVerticalAlignmentString( impl.mController->GetVerticalAlignment() );
- if( name )
- {
- value = std::string( name );
- }
+ value = std::string( name );
}
break;
}
case Toolkit::TextLabel::Property::ENABLE_MARKUP:
{
- if( impl.mController )
- {
- value = impl.mController->IsMarkupProcessorEnabled();
- }
+ value = impl.mController->IsMarkupProcessorEnabled();
break;
}
case Toolkit::TextLabel::Property::ENABLE_AUTO_SCROLL:
{
- if( impl.mController )
- {
- value = impl.mController->IsAutoScrollEnabled();
- }
+ value = impl.mController->IsAutoScrollEnabled();
break;
}
case Toolkit::TextLabel::Property::AUTO_SCROLL_STOP_MODE:
}
case Toolkit::TextLabel::Property::AUTO_SCROLL_SPEED:
{
- TextLabel& impl( GetImpl( label ) );
if ( impl.mTextScroller )
{
value = impl.mTextScroller->GetSpeed();
}
case Toolkit::TextLabel::Property::AUTO_SCROLL_LOOP_COUNT:
{
- if( impl.mController )
+ if ( impl.mTextScroller )
{
- TextLabel& impl( GetImpl( label ) );
- if ( impl.mTextScroller )
- {
- value = impl.mTextScroller->GetLoopCount();
- }
+ value = impl.mTextScroller->GetLoopCount();
}
break;
}
case Toolkit::TextLabel::Property::AUTO_SCROLL_LOOP_DELAY:
{
- if( impl.mController )
+ if ( impl.mTextScroller )
{
- TextLabel& impl( GetImpl( label ) );
- if ( impl.mTextScroller )
- {
- value = impl.mTextScroller->GetLoopDelay();
- }
+ value = impl.mTextScroller->GetLoopDelay();
}
break;
}
case Toolkit::TextLabel::Property::AUTO_SCROLL_GAP:
{
- TextLabel& impl( GetImpl( label ) );
if ( impl.mTextScroller )
{
value = impl.mTextScroller->GetGap();
}
case Toolkit::TextLabel::Property::LINE_SPACING:
{
- if( impl.mController )
- {
- value = impl.mController->GetDefaultLineSpacing();
- }
+ value = impl.mController->GetDefaultLineSpacing();
break;
}
case Toolkit::TextLabel::Property::UNDERLINE:
}
case Toolkit::TextLabel::Property::PIXEL_SIZE:
{
- if( impl.mController )
- {
- value = impl.mController->GetDefaultFontSize( Text::Controller::PIXEL_SIZE );
- }
+ value = impl.mController->GetDefaultFontSize( Text::Controller::PIXEL_SIZE );
break;
}
case Toolkit::TextLabel::Property::ELLIPSIS:
{
- if( impl.mController )
- {
- value = impl.mController->IsTextElideEnabled();
- }
+ value = impl.mController->IsTextElideEnabled();
break;
}
case Toolkit::TextLabel::Property::LINE_WRAP_MODE:
{
- if( impl.mController )
- {
- value = impl.mController->GetLineWrapMode();
- }
+ value = impl.mController->GetLineWrapMode();
break;
}
case Toolkit::TextLabel::Property::LINE_COUNT:
{
- if( impl.mController )
- {
- float width = label.GetProperty( Actor::Property::SIZE_WIDTH ).Get<float>();
- value = impl.mController->GetLineCount( width );
- }
+ float width = label.GetProperty( Actor::Property::SIZE_WIDTH ).Get<float>();
+ value = impl.mController->GetLineCount( width );
break;
}
case Toolkit::DevelTextLabel::Property::TEXT_DIRECTION:
{
- if( impl.mController )
- {
- value = impl.mController->GetTextDirection();
- }
+ value = impl.mController->GetTextDirection();
break;
}
case Toolkit::DevelTextLabel::Property::VERTICAL_LINE_ALIGNMENT:
{
- if( impl.mController )
- {
- value = impl.mController->GetVerticalLineAlignment();
- }
+ value = impl.mController->GetVerticalLineAlignment();
break;
}
case Toolkit::DevelTextLabel::Property::BACKGROUND:
}
case Toolkit::DevelTextLabel::Property::MIN_LINE_SIZE:
{
- if( impl.mController )
- {
- value = impl.mController->GetDefaultLineSize();
- }
+ value = impl.mController->GetDefaultLineSize();
break;
}
}
TextVisual::SetAnimatableTextColorProperty( mVisual, Toolkit::TextLabel::Property::TEXT_COLOR );
mController = TextVisual::GetController(mVisual);
- if( mController )
- {
- mController->SetControlInterface(this);
- }
+ DALI_ASSERT_DEBUG( mController && "Invalid Text Controller")
+
+ mController->SetControlInterface(this);
// Use height-for-width negotiation by default
self.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH );
self.SetResizePolicy( ResizePolicy::DIMENSION_DEPENDENCY, Dimension::HEIGHT );
+ // Enable highlightability
+ self.SetProperty( Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, true );
+
// Enable the text ellipsis.
mController->SetTextElideEnabled( true ); // If false then text larger than control will overflow
Layout::Engine& engine = mController->GetLayoutEngine();
engine.SetCursorWidth( 0u ); // Do not layout space for the cursor.
+
+ DevelControl::SetAccessibilityConstructor( self, []( Dali::Actor actor ) {
+ return std::unique_ptr< Dali::Accessibility::Accessible >(
+ new AccessibleImpl( actor, Dali::Accessibility::Role::LABEL ) );
+ } );
}
void TextLabel::OnStyleChange( Toolkit::StyleManager styleManager, StyleChange::Type change )
return mController->GetHeightForWidth( width ) + padding.top + padding.bottom;
}
-void TextLabel::OnPropertySet( Property::Index index, Property::Value propertyValue )
+void TextLabel::OnPropertySet( Property::Index index, const Property::Value& propertyValue )
{
DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextLabel::OnPropertySet index[%d]\n", index );
}
// Support Right-To-Left
- Dali::LayoutDirection::Type layoutDirection = static_cast<Dali::LayoutDirection::Type>( Self().GetProperty( Dali::Actor::Property::LAYOUT_DIRECTION ).Get<int>() );
-
+ Dali::LayoutDirection::Type layoutDirection;
+ if( mController->IsMatchSystemLanguageDirection() )
+ {
+ layoutDirection = static_cast<Dali::LayoutDirection::Type>( DevelWindow::Get( Self() ).GetRootLayer().GetProperty( Dali::Actor::Property::LAYOUT_DIRECTION ).Get<int>() );
+ }
+ else
+ {
+ layoutDirection = static_cast<Dali::LayoutDirection::Type>( Self().GetProperty( Dali::Actor::Property::LAYOUT_DIRECTION ).Get<int>() );
+ }
const Text::Controller::UpdateTextType updateTextType = mController->Relayout( contentSize, layoutDirection );
if( ( Text::Controller::NONE_UPDATED != ( Text::Controller::MODEL_UPDATED & updateTextType ) )
{
}
+std::string TextLabel::AccessibleImpl::GetNameRaw()
+{
+ auto slf = Toolkit::TextLabel::DownCast( self );
+ return slf.GetProperty( Toolkit::TextLabel::Property::TEXT ).Get< std::string >();
+}
+
+Property::Index TextLabel::AccessibleImpl::GetNamePropertyIndex()
+{
+ return Toolkit::TextLabel::Property::TEXT;
+}
+
+std::string TextLabel::AccessibleImpl::GetText( size_t startOffset,
+ size_t endOffset )
+{
+ if( endOffset <= startOffset )
+ return {};
+
+ auto slf = Toolkit::TextLabel::DownCast( self );
+ auto txt =
+ slf.GetProperty( Toolkit::TextLabel::Property::TEXT ).Get< std::string >();
+
+ if( startOffset > txt.size() || endOffset > txt.size() )
+ return {};
+
+ return txt.substr( startOffset, endOffset - startOffset );
+}
+
+size_t TextLabel::AccessibleImpl::GetCharacterCount()
+{
+ auto slf = Toolkit::TextLabel::DownCast( self );
+ auto txt =
+ slf.GetProperty( Toolkit::TextLabel::Property::TEXT ).Get< std::string >();
+
+ return txt.size();
+}
+
+size_t TextLabel::AccessibleImpl::GetCaretOffset()
+{
+ return {};
+}
+
+bool TextLabel::AccessibleImpl::SetCaretOffset(size_t offset)
+{
+ return {};
+}
+
+Dali::Accessibility::Range TextLabel::AccessibleImpl::GetTextAtOffset(
+ size_t offset, Dali::Accessibility::TextBoundary boundary )
+{
+ auto slf = Toolkit::TextLabel::DownCast( self );
+ auto txt = slf.GetProperty( Toolkit::TextLabel::Property::TEXT ).Get< std::string >();
+ auto txt_size = txt.size();
+
+ auto range = Dali::Accessibility::Range{};
+
+ switch(boundary)
+ {
+ case Dali::Accessibility::TextBoundary::CHARACTER:
+ {
+ if (offset < txt_size)
+ {
+ range.content = txt[offset];
+ range.startOffset = offset;
+ range.endOffset = offset + 1;
+ }
+ }
+ break;
+ case Dali::Accessibility::TextBoundary::WORD:
+ case Dali::Accessibility::TextBoundary::LINE:
+ {
+ auto txt_c_string = txt.c_str();
+ auto breaks = std::vector< char >( txt_size, 0 );
+ if(boundary == Dali::Accessibility::TextBoundary::WORD)
+ Accessibility::Accessible::FindWordSeparationsUtf8((const utf8_t *) txt_c_string, txt_size, "", breaks.data());
+ else
+ Accessibility::Accessible::FindLineSeparationsUtf8((const utf8_t *) txt_c_string, txt_size, "", breaks.data());
+ auto index = 0u;
+ auto counter = 0u;
+ while( index < txt_size && counter <= offset )
+ {
+ auto start = index;
+ if(breaks[index])
+ {
+ while(breaks[index])
+ index++;
+ counter++;
+ }
+ else
+ {
+ if (boundary == Dali::Accessibility::TextBoundary::WORD)
+ index++;
+ if (boundary == Dali::Accessibility::TextBoundary::LINE)
+ counter++;
+ }
+ if ((counter - 1) == offset)
+ {
+ range.content = txt.substr(start, index - start + 1);
+ range.startOffset = start;
+ range.endOffset = index + 1;
+ }
+ if (boundary == Dali::Accessibility::TextBoundary::LINE)
+ index++;
+ }
+ }
+ break;
+ case Dali::Accessibility::TextBoundary::SENTENCE:
+ {
+ /* not supported by efl */
+ }
+ break;
+ case Dali::Accessibility::TextBoundary::PARAGRAPH:
+ {
+ /* Paragraph is not supported by libunibreak library */
+ }
+ break;
+ default:
+ break;
+ }
+
+ return range;
+}
+
+Dali::Accessibility::Range
+TextLabel::AccessibleImpl::GetSelection( size_t selectionNum )
+{
+ // Since DALi supports only one selection indexes higher than 0 are ignored
+ if( selectionNum > 0 )
+ return {};
+
+ auto slf = Toolkit::TextLabel::DownCast( self );
+ auto ctrl = Dali::Toolkit::GetImpl( slf ).getController();
+ std::string ret;
+ ctrl->RetrieveSelection( ret );
+ auto r = ctrl->GetSelectionIndexes();
+
+ return { static_cast<size_t>(r.first), static_cast<size_t>(r.second), ret };
+}
+
+bool TextLabel::AccessibleImpl::RemoveSelection( size_t selectionNum )
+{
+ // Since DALi supports only one selection indexes higher than 0 are ignored
+ if( selectionNum > 0 )
+ return false;
+
+ auto slf = Toolkit::TextLabel::DownCast( self );
+ Dali::Toolkit::GetImpl( slf ).getController()->SetSelection( 0, 0 );
+ return true;
+}
+
+bool TextLabel::AccessibleImpl::SetSelection( size_t selectionNum,
+ size_t startOffset,
+ size_t endOffset )
+{
+ // Since DALi supports only one selection indexes higher than 0 are ignored
+ if( selectionNum > 0 )
+ return false;
+
+ auto slf = Toolkit::TextLabel::DownCast( self );
+ Dali::Toolkit::GetImpl( slf ).getController()->SetSelection( startOffset,
+ endOffset );
+ return true;
+}
+
} // namespace Internal
} // namespace Toolkit