From dbe59842bb6226eaccfc27f189e35c7614c6d814 Mon Sep 17 00:00:00 2001 From: Victor Cebollada Date: Mon, 10 Aug 2015 10:18:34 +0100 Subject: [PATCH] Add a cursor's width property. Change-Id: I8bb4f335149f79fff615e056b28b95a8d91da3ce Signed-off-by: Victor Cebollada --- .../src/dali-toolkit/utc-Dali-TextField.cpp | 26 ++++++++++++++-------- .../controls/text-controls/text-field-impl.cpp | 21 +++++++++++++++++ .../internal/text/decorator/text-decorator.cpp | 18 +++++++++++++-- .../internal/text/decorator/text-decorator.h | 14 ++++++++++++ .../internal/text/layouts/layout-engine.cpp | 19 +++++++++++++--- dali-toolkit/internal/text/layouts/layout-engine.h | 14 ++++++++++++ .../public-api/controls/text-controls/text-field.h | 1 + .../styles/480x800/dali-toolkit-default-theme.json | 1 + .../720x1280/dali-toolkit-default-theme.json | 1 + 9 files changed, 101 insertions(+), 14 deletions(-) diff --git a/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp b/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp index 6e620eb..ea126d4 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp @@ -60,6 +60,7 @@ const char* const PROPERTY_NAME_SECONDARY_CURSOR_COLOR = "secondar const char* const PROPERTY_NAME_ENABLE_CURSOR_BLINK = "enable-cursor-blink"; const char* const PROPERTY_NAME_CURSOR_BLINK_INTERVAL = "cursor-blink-interval"; const char* const PROPERTY_NAME_CURSOR_BLINK_DURATION = "cursor-blink-duration"; +const char* const PROPERTY_NAME_CURSOR_WIDTH = "cursor-width"; const char* const PROPERTY_NAME_GRAB_HANDLE_IMAGE = "grab-handle-image"; const char* const PROPERTY_NAME_GRAB_HANDLE_PRESSED_IMAGE = "grab-handle-pressed-image"; const char* const PROPERTY_NAME_SCROLL_THRESHOLD = "scroll-threshold"; @@ -68,6 +69,8 @@ const char* const PROPERTY_NAME_SELECTION_HANDLE_IMAGE_LEFT = "selectio const char* const PROPERTY_NAME_SELECTION_HANDLE_IMAGE_RIGHT = "selection-handle-image-right"; const char* const PROPERTY_NAME_SELECTION_HANDLE_PRESSED_IMAGE_LEFT = "selection-handle-pressed-image-left"; const char* const PROPERTY_NAME_SELECTION_HANDLE_PRESSED_IMAGE_RIGHT = "selection-handle-pressed-image-right"; +const char* const PROPERTY_NAME_SELECTION_HANDLE_MARKER_IMAGE_LEFT = "selection-handle-marker-image-left"; +const char* const PROPERTY_NAME_SELECTION_HANDLE_MARKER_IMAGE_RIGHT = "selection-handle-marker-image-right"; const char* const PROPERTY_NAME_SELECTION_HIGHLIGHT_COLOR = "selection-highlight-color"; const char* const PROPERTY_NAME_DECORATION_BOUNDING_BOX = "decoration-bounding-box"; const char* const PROPERTY_NAME_INPUT_METHOD_SETTINGS = "input-method-settings"; @@ -245,6 +248,7 @@ int UtcDaliTextFieldGetPropertyP(void) DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_ENABLE_CURSOR_BLINK ) == TextField::Property::ENABLE_CURSOR_BLINK ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_CURSOR_BLINK_INTERVAL ) == TextField::Property::CURSOR_BLINK_INTERVAL ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_CURSOR_BLINK_DURATION ) == TextField::Property::CURSOR_BLINK_DURATION ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_CURSOR_WIDTH ) == TextField::Property::CURSOR_WIDTH ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_GRAB_HANDLE_IMAGE ) == TextField::Property::GRAB_HANDLE_IMAGE ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_GRAB_HANDLE_PRESSED_IMAGE ) == TextField::Property::GRAB_HANDLE_PRESSED_IMAGE ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SCROLL_THRESHOLD ) == TextField::Property::SCROLL_THRESHOLD ); @@ -253,13 +257,15 @@ int UtcDaliTextFieldGetPropertyP(void) DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HANDLE_IMAGE_RIGHT ) == TextField::Property::SELECTION_HANDLE_IMAGE_RIGHT ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HANDLE_PRESSED_IMAGE_LEFT ) == TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_LEFT ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HANDLE_PRESSED_IMAGE_RIGHT ) == TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_RIGHT ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HANDLE_MARKER_IMAGE_LEFT ) == TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_LEFT ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HANDLE_MARKER_IMAGE_RIGHT ) == TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_RIGHT ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HIGHLIGHT_COLOR ) == TextField::Property::SELECTION_HIGHLIGHT_COLOR ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_DECORATION_BOUNDING_BOX ) == TextField::Property::DECORATION_BOUNDING_BOX ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_INPUT_METHOD_SETTINGS ) == TextField::Property::INPUT_METHOD_SETTINGS ); END_TEST; } -bool SetPropertyMapRetreived( TextField& field, const Property::Index property, const std::string mapKey, const std::string mapValue ) +bool SetPropertyMapRetrieved( TextField& field, const Property::Index property, const std::string mapKey, const std::string mapValue ) { bool result = false; Property::Map imageMap; @@ -348,9 +354,11 @@ int UtcDaliTextFieldSetPropertyP(void) field.SetProperty( TextField::Property::ENABLE_CURSOR_BLINK, false ); DALI_TEST_EQUALS( field.GetProperty( TextField::Property::ENABLE_CURSOR_BLINK ), false, TEST_LOCATION ); field.SetProperty( TextField::Property::CURSOR_BLINK_INTERVAL, 1.f ); - DALI_TEST_EQUALS( field.GetProperty( TextField::Property::CURSOR_BLINK_INTERVAL ), 1.f, TEST_LOCATION ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::CURSOR_BLINK_INTERVAL ), 1.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION ); field.SetProperty( TextField::Property::CURSOR_BLINK_DURATION, 10.f ); - DALI_TEST_EQUALS( field.GetProperty( TextField::Property::CURSOR_BLINK_DURATION ), 10.f, TEST_LOCATION ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::CURSOR_BLINK_DURATION ), 10.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION ); + field.SetProperty( TextField::Property::CURSOR_WIDTH, 1 ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::CURSOR_WIDTH ), 1, TEST_LOCATION ); // Check scroll properties. field.SetProperty( TextField::Property::SCROLL_THRESHOLD, 1.f ); @@ -366,12 +374,12 @@ int UtcDaliTextFieldSetPropertyP(void) field.SetProperty( TextField::Property::SELECTION_HANDLE_IMAGE_LEFT, "image3" ); // Check handle images - DALI_TEST_CHECK( SetPropertyMapRetreived( field, TextField::Property::SELECTION_HANDLE_IMAGE_LEFT, "filename", "leftHandleImage" ) ); - DALI_TEST_CHECK( SetPropertyMapRetreived( field, TextField::Property::SELECTION_HANDLE_IMAGE_RIGHT, "filename", "rightHandleImage" ) ); - DALI_TEST_CHECK( SetPropertyMapRetreived( field, TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_LEFT, "filename", "leftHandleImagePressed" ) ); - DALI_TEST_CHECK( SetPropertyMapRetreived( field, TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_RIGHT, "filename", "rightHandleImagePressed" ) ); - DALI_TEST_CHECK( SetPropertyMapRetreived( field, TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_LEFT, "filename", "leftHandleMarkerImage" ) ); - DALI_TEST_CHECK( SetPropertyMapRetreived( field, TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_RIGHT, "filename", "rightHandleMarkerImage" ) ); + DALI_TEST_CHECK( SetPropertyMapRetrieved( field, TextField::Property::SELECTION_HANDLE_IMAGE_LEFT, "filename", "leftHandleImage" ) ); + DALI_TEST_CHECK( SetPropertyMapRetrieved( field, TextField::Property::SELECTION_HANDLE_IMAGE_RIGHT, "filename", "rightHandleImage" ) ); + DALI_TEST_CHECK( SetPropertyMapRetrieved( field, TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_LEFT, "filename", "leftHandleImagePressed" ) ); + DALI_TEST_CHECK( SetPropertyMapRetrieved( field, TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_RIGHT, "filename", "rightHandleImagePressed" ) ); + DALI_TEST_CHECK( SetPropertyMapRetrieved( field, TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_LEFT, "filename", "leftHandleMarkerImage" ) ); + DALI_TEST_CHECK( SetPropertyMapRetrieved( field, TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_RIGHT, "filename", "rightHandleMarkerImage" ) ); // Check the highlight color field.SetProperty( TextField::Property::SELECTION_HIGHLIGHT_COLOR, Color::GREEN ); diff --git a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp index 3ec2280..5b6d950 100644 --- a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp @@ -108,6 +108,7 @@ DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "secondary-cursor-color", DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "enable-cursor-blink", BOOLEAN, ENABLE_CURSOR_BLINK ) DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "cursor-blink-interval", FLOAT, CURSOR_BLINK_INTERVAL ) DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "cursor-blink-duration", FLOAT, CURSOR_BLINK_DURATION ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "cursor-width", INTEGER, CURSOR_WIDTH ) DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "grab-handle-image", STRING, GRAB_HANDLE_IMAGE ) DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "grab-handle-pressed-image", STRING, GRAB_HANDLE_PRESSED_IMAGE ) DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "scroll-threshold", FLOAT, SCROLL_THRESHOLD ) @@ -412,6 +413,18 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr } break; } + case Toolkit::TextField::Property::CURSOR_WIDTH: + { + if( impl.mDecorator ) + { + const int width = value.Get< int >(); + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextField %p CURSOR_WIDTH %d\n", impl.mController.Get(), width ); + + impl.mDecorator->SetCursorWidth( width ); + impl.mController->GetLayoutEngine().SetCursorWidth( width ); + } + break; + } case Toolkit::TextField::Property::GRAB_HANDLE_IMAGE: { const ResourceImage image = ResourceImage::New( value.Get< std::string >() ); @@ -738,6 +751,14 @@ Property::Value TextField::GetProperty( BaseObject* object, Property::Index inde } break; } + case Toolkit::TextField::Property::CURSOR_WIDTH: + { + if( impl.mDecorator ) + { + value = impl.mDecorator->GetCursorWidth(); + } + break; + } case Toolkit::TextField::Property::GRAB_HANDLE_IMAGE: { if( impl.mDecorator ) diff --git a/dali-toolkit/internal/text/decorator/text-decorator.cpp b/dali-toolkit/internal/text/decorator/text-decorator.cpp index 5c45bf3..c4d0a68 100644 --- a/dali-toolkit/internal/text/decorator/text-decorator.cpp +++ b/dali-toolkit/internal/text/decorator/text-decorator.cpp @@ -107,6 +107,8 @@ const float SCROLL_THRESHOLD = 10.f; const float SCROLL_SPEED = 300.f; const float SCROLL_DISTANCE = SCROLL_SPEED * SCROLL_TICK_INTERVAL * TO_SECONDS; +const float CURSOR_WIDTH = 1.f; + /** * structure to hold coordinates of each quad, which will make up the mesh. */ @@ -249,6 +251,7 @@ struct Decorator::Impl : public ConnectionTracker mActiveCursor( ACTIVE_CURSOR_NONE ), mCursorBlinkInterval( CURSOR_BLINK_INTERVAL ), mCursorBlinkDuration( 0.0f ), + mCursorWidth( CURSOR_WIDTH ), mHandleScrolling( HANDLE_TYPE_COUNT ), mScrollDirection( SCROLL_NONE ), mScrollThreshold( SCROLL_THRESHOLD ), @@ -289,7 +292,7 @@ struct Decorator::Impl : public ConnectionTracker mPrimaryCursor.SetPosition( position.x, position.y ); - mPrimaryCursor.SetSize( Size( 1.0f, cursor.cursorHeight ) ); + mPrimaryCursor.SetSize( Size( mCursorWidth, cursor.cursorHeight ) ); } mPrimaryCursor.SetVisible( mPrimaryCursorVisible ); } @@ -301,7 +304,7 @@ struct Decorator::Impl : public ConnectionTracker { mSecondaryCursor.SetPosition( cursor.position.x, cursor.position.y ); - mSecondaryCursor.SetSize( Size( 1.0f, cursor.cursorHeight ) ); + mSecondaryCursor.SetSize( Size( mCursorWidth, cursor.cursorHeight ) ); } mSecondaryCursor.SetVisible( mSecondaryCursorVisible ); } @@ -1297,6 +1300,7 @@ struct Decorator::Impl : public ConnectionTracker unsigned int mActiveCursor; unsigned int mCursorBlinkInterval; float mCursorBlinkDuration; + float mCursorWidth; ///< The width of the cursors in pixels. HandleType mHandleScrolling; ///< The handle which is scrolling. ScrollDirection mScrollDirection; ///< The direction of the scroll. float mScrollThreshold; ///< Defines a square area inside the control, close to the edge. A cursor entering this area will trigger scroll events. @@ -1424,6 +1428,16 @@ float Decorator::GetCursorBlinkDuration() const return mImpl->mCursorBlinkDuration; } +void Decorator::SetCursorWidth( int width ) +{ + mImpl->mCursorWidth = static_cast( width ); +} + +int Decorator::GetCursorWidth() const +{ + return static_cast( mImpl->mCursorWidth ); +} + /** Handles **/ void Decorator::SetHandleActive( HandleType handleType, bool active ) diff --git a/dali-toolkit/internal/text/decorator/text-decorator.h b/dali-toolkit/internal/text/decorator/text-decorator.h index c84c352..ae90e90 100644 --- a/dali-toolkit/internal/text/decorator/text-decorator.h +++ b/dali-toolkit/internal/text/decorator/text-decorator.h @@ -298,6 +298,20 @@ public: float GetCursorBlinkDuration() const; /** + * @brief Sets the width of the cursors. + * + * @param[in] width The width of the cursor in pixels. + */ + void SetCursorWidth( int width ); + + /** + * @brief Retrieves the width of the cursors. + * + * @return The width of the cursors in pixels. + */ + int GetCursorWidth() const; + + /** * @brief Sets whether a handle is active. * * @param[in] handleType One of the handles. diff --git a/dali-toolkit/internal/text/layouts/layout-engine.cpp b/dali-toolkit/internal/text/layouts/layout-engine.cpp index 5a28904..5ee4992 100644 --- a/dali-toolkit/internal/text/layouts/layout-engine.cpp +++ b/dali-toolkit/internal/text/layouts/layout-engine.cpp @@ -45,6 +45,7 @@ namespace const float MAX_FLOAT = std::numeric_limits::max(); const bool RTL = true; +const float CURSOR_WIDTH = 1.f; } //namespace @@ -101,6 +102,7 @@ struct LayoutEngine::Impl : mLayout( LayoutEngine::SINGLE_LINE_BOX ), mHorizontalAlignment( LayoutEngine::HORIZONTAL_ALIGN_BEGIN ), mVerticalAlignment( LayoutEngine::VERTICAL_ALIGN_TOP ), + mCursorWidth( CURSOR_WIDTH ), mEllipsisEnabled( false ) { mFontClient = TextAbstraction::FontClient::Get(); @@ -210,7 +212,7 @@ struct LayoutEngine::Impl float tmpExtraBearing = ( 0.f > glyphInfo.xBearing ) ? -glyphInfo.xBearing : 0.f; - tmpLineLayout.length += 1.f; // Added one unit to give some space to the cursor. + tmpLineLayout.length += mCursorWidth; // Added to give some space to the cursor. // Calculate the line height if there is no characters. FontId lastFontId = glyphInfo.fontId; @@ -450,7 +452,7 @@ struct LayoutEngine::Impl const GlyphInfo& glyph = *glyphsBuffer; float penX = ( 0.f > glyph.xBearing ) ? -glyph.xBearing : 0.f; - penX += 1.f; // Added one unit to give some space to the cursor. + penX += mCursorWidth; // Added to give some space to the cursor. for( GlyphIndex i = 0u; i < numberOfGlyphs; ++i ) { @@ -671,7 +673,7 @@ struct LayoutEngine::Impl const GlyphInfo& glyph = *( layoutParameters.glyphsBuffer + *( layoutParameters.charactersToGlyphsBuffer + characterVisualIndex ) ); float penX = ( 0.f > glyph.xBearing ) ? -glyph.xBearing : 0.f; - penX += 1.f; // Added one unit to give some space to the cursor. + penX += mCursorWidth; // Added to give some space to the cursor. Vector2* glyphPositionsBuffer = glyphPositions.Begin(); @@ -817,6 +819,7 @@ struct LayoutEngine::Impl LayoutEngine::Layout mLayout; LayoutEngine::HorizontalAlignment mHorizontalAlignment; LayoutEngine::VerticalAlignment mVerticalAlignment; + float mCursorWidth; TextAbstraction::FontClient mFontClient; @@ -874,6 +877,16 @@ LayoutEngine::VerticalAlignment LayoutEngine::GetVerticalAlignment() const return mImpl->mVerticalAlignment; } +void LayoutEngine::SetCursorWidth( int width ) +{ + mImpl->mCursorWidth = static_cast( width ); +} + +int LayoutEngine::GetCursorWidth() const +{ + return static_cast( mImpl->mCursorWidth ); +} + bool LayoutEngine::LayoutText( const LayoutParameters& layoutParameters, Vector& glyphPositions, Vector& lines, diff --git a/dali-toolkit/internal/text/layouts/layout-engine.h b/dali-toolkit/internal/text/layouts/layout-engine.h index 121b240..d0f1ab6 100644 --- a/dali-toolkit/internal/text/layouts/layout-engine.h +++ b/dali-toolkit/internal/text/layouts/layout-engine.h @@ -128,6 +128,20 @@ public: VerticalAlignment GetVerticalAlignment() const; /** + * @brief Sets the width of the cursor. + * + * @param[in] width The width of the cursor in pixels. + */ + void SetCursorWidth( int width ); + + /** + * @brief Retrieves the width of the cursor. + * + * @return The width of the cursor in pixels. + */ + int GetCursorWidth() const; + + /** * @brief Store the visual position of glyphs in the VisualModel. * * @param[in] layoutParameters The parameters needed to layout the text. diff --git a/dali-toolkit/public-api/controls/text-controls/text-field.h b/dali-toolkit/public-api/controls/text-controls/text-field.h index d295e0f..eacee82 100644 --- a/dali-toolkit/public-api/controls/text-controls/text-field.h +++ b/dali-toolkit/public-api/controls/text-controls/text-field.h @@ -82,6 +82,7 @@ public: ENABLE_CURSOR_BLINK, ///< name "enable-cursor-blink", Whether the cursor should blink or not, type BOOLEAN CURSOR_BLINK_INTERVAL, ///< name "cursor-blink-interval", The time interval in seconds between cursor on/off states, type FLOAT CURSOR_BLINK_DURATION, ///< name "cursor-blink-duration", The cursor will stop blinking after this number of seconds (if non-zero), type FLOAT + CURSOR_WIDTH, ///< name "cursor-width", The cursor width, type INTEGER GRAB_HANDLE_IMAGE, ///< name "grab-handle-image", The image to display for the grab handle, type STRING GRAB_HANDLE_PRESSED_IMAGE, ///< name "grab-handle-pressed-image", The image to display when the grab handle is pressed, type STRING SCROLL_THRESHOLD, ///< name "scroll-threshold" Scrolling will occur if the cursor is this close to the control border, type FLOAT diff --git a/dali-toolkit/styles/480x800/dali-toolkit-default-theme.json b/dali-toolkit/styles/480x800/dali-toolkit-default-theme.json index 96be16b..cf49972 100644 --- a/dali-toolkit/styles/480x800/dali-toolkit-default-theme.json +++ b/dali-toolkit/styles/480x800/dali-toolkit-default-theme.json @@ -63,6 +63,7 @@ distributing this software or its derivatives. "point-size":18, "primary-cursor-color":[0.0,0.72,0.9,1.0], "secondary-cursor-color":[0.0,0.72,0.9,1.0], + "cursor-width":1, "selection-highlight-color":[0.75,0.96,1.0,1.0], "grab-handle-image": { "filename":"{DALI_IMAGE_DIR}cursor_handler_center.png" }, "selection-handle-image-left" : {"filename":"{DALI_IMAGE_DIR}selection_handle_left.png" }, diff --git a/dali-toolkit/styles/720x1280/dali-toolkit-default-theme.json b/dali-toolkit/styles/720x1280/dali-toolkit-default-theme.json index 0329619..eb1ad15 100644 --- a/dali-toolkit/styles/720x1280/dali-toolkit-default-theme.json +++ b/dali-toolkit/styles/720x1280/dali-toolkit-default-theme.json @@ -63,6 +63,7 @@ distributing this software or its derivatives. "point-size":18, "primary-cursor-color":[0.0,0.72,0.9,1.0], "secondary-cursor-color":[0.0,0.72,0.9,1.0], + "cursor-width":3, "selection-highlight-color":[0.75,0.96,1.0,1.0], "grab-handle-image": { "filename":"{DALI_IMAGE_DIR}cursor_handler_center.png" }, "selection-handle-image-left" : {"filename":"{DALI_IMAGE_DIR}selection_handle_left.png" }, -- 2.7.4