DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextField, "ellipsisPosition", INTEGER, ELLIPSIS_POSITION )
DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextField, "strikethrough", MAP, STRIKETHROUGH )
DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextField, "inputStrikethrough", MAP, INPUT_STRIKETHROUGH )
+DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextField, "characterSpacing", FLOAT, CHARACTER_SPACING )
DALI_SIGNAL_REGISTRATION(Toolkit, TextField, "textChanged", SIGNAL_TEXT_CHANGED )
DALI_SIGNAL_REGISTRATION(Toolkit, TextField, "maxLengthReached", SIGNAL_MAX_LENGTH_REACHED )
}
DevelControl::SetAccessibilityConstructor(self, [](Dali::Actor actor) {
- return std::unique_ptr<Dali::Accessibility::Accessible>(
- new AccessibleImpl(actor, Dali::Accessibility::Role::ENTRY));
+ return std::make_unique<TextFieldAccessible>(actor, Dali::Accessibility::Role::ENTRY);
});
Accessibility::Bridge::EnabledSignal().Connect(this, &TextField::OnAccessibilityStatusChanged);
mActiveLayer.SetProperty(Actor::Property::POSITION, Vector2(padding.start, padding.top));
ResizeActor(mActiveLayer, contentSize);
}
+ if(mCursorLayer)
+ {
+ mCursorLayer.SetProperty(Actor::Property::POSITION, Vector2(padding.start, padding.top));
+ ResizeActor(mCursorLayer, contentSize);
+ }
// If there is text changed, callback is called.
if(mTextChanged)
}
}
-void TextField::AddDecoration(Actor& actor, bool needsClipping)
+void TextField::AddDecoration(Actor& actor, DecorationType type, bool needsClipping)
{
if(actor)
{
{
mClippingDecorationActors.push_back(actor);
}
- else
+
+ // If the actor is a layer type, add it.
+ if(type == DecorationType::ACTIVE_LAYER)
+ {
+ AddLayer(mActiveLayer, actor);
+ }
+ else if(type == DecorationType::CURSOR_LAYER)
{
- actor.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
- actor.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
- Self().Add(actor);
- mActiveLayer = actor;
+ AddLayer(mCursorLayer, actor);
}
}
}
+void TextField::AddLayer(Actor& layer, Actor& actor)
+{
+ actor.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+ actor.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+ Self().Add(actor);
+ layer = actor;
+}
+
void TextField::GetControlBackgroundColor(Vector4& color) const
{
Property::Value propValue = Self().GetProperty(Toolkit::Control::Property::BACKGROUND);
return mController->GetTextPosition(startIndex, endIndex);
}
-std::string TextField::AccessibleImpl::GetName() const
+std::string TextField::TextFieldAccessible::GetName() const
{
auto self = Toolkit::TextField::DownCast(Self());
if(IsHiddenInput(self))
return self.GetProperty(Toolkit::TextField::Property::TEXT).Get<std::string>();
}
-std::string TextField::AccessibleImpl::GetText(size_t startOffset, size_t endOffset) const
+std::string TextField::TextFieldAccessible::GetText(size_t startOffset, size_t endOffset) const
{
if(endOffset <= startOffset)
{
return text.substr(startOffset, endOffset - startOffset);
}
-size_t TextField::AccessibleImpl::GetCharacterCount() const
+size_t TextField::TextFieldAccessible::GetCharacterCount() const
{
auto self = Toolkit::TextField::DownCast(Self());
auto text = self.GetProperty(Toolkit::TextField::Property::TEXT).Get<std::string>();
return text.size();
}
-size_t TextField::AccessibleImpl::GetCursorOffset() const
+size_t TextField::TextFieldAccessible::GetCursorOffset() const
{
auto self = Toolkit::TextField::DownCast(Self());
return Dali::Toolkit::GetImpl(self).GetTextController()->GetCursorPosition();
}
-bool TextField::AccessibleImpl::SetCursorOffset(size_t offset)
+bool TextField::TextFieldAccessible::SetCursorOffset(size_t offset)
{
auto self = Toolkit::TextField::DownCast(Self());
auto text = self.GetProperty(Toolkit::TextField::Property::TEXT).Get<std::string>();
return true;
}
-Dali::Accessibility::Range TextField::AccessibleImpl::GetTextAtOffset(
+Dali::Accessibility::Range TextField::TextFieldAccessible::GetTextAtOffset(
size_t offset, Dali::Accessibility::TextBoundary boundary) const
{
auto self = Toolkit::TextField::DownCast(Self());
return range;
}
-Dali::Accessibility::Range TextField::AccessibleImpl::GetRangeOfSelection(size_t selectionIndex) const
+Dali::Accessibility::Range TextField::TextFieldAccessible::GetRangeOfSelection(size_t selectionIndex) const
{
// Since DALi supports only one selection indexes higher than 0 are ignored
if(selectionIndex > 0)
return {startOffset, endOffset, value};
}
-bool TextField::AccessibleImpl::RemoveSelection(size_t selectionIndex)
+bool TextField::TextFieldAccessible::RemoveSelection(size_t selectionIndex)
{
// Since DALi supports only one selection indexes higher than 0 are ignored
if(selectionIndex > 0)
return true;
}
-bool TextField::AccessibleImpl::SetRangeOfSelection(size_t selectionIndex, size_t startOffset, size_t endOffset)
+bool TextField::TextFieldAccessible::SetRangeOfSelection(size_t selectionIndex, size_t startOffset, size_t endOffset)
{
// Since DALi supports only one selection indexes higher than 0 are ignored
if(selectionIndex > 0)
return true;
}
-bool TextField::AccessibleImpl::CopyText(size_t startPosition, size_t endPosition)
+Rect<> TextField::TextFieldAccessible::GetRangeExtents(size_t startOffset, size_t endOffset, Accessibility::CoordinateType type)
+{
+ if (endOffset <= startOffset || endOffset <= 0)
+ {
+ return {0, 0, 0, 0};
+ }
+
+ auto self = Toolkit::TextField::DownCast(Self());
+ auto rect = Dali::Toolkit::GetImpl(self).GetTextController()->GetTextBoundingRectangle(startOffset, endOffset - 1);
+
+ auto componentExtents = this->GetExtents(type);
+
+ rect.x += componentExtents.x;
+ rect.y += componentExtents.y;
+
+ return rect;
+}
+
+bool TextField::TextFieldAccessible::CopyText(size_t startPosition, size_t endPosition)
{
if(endPosition <= startPosition)
{
return true;
}
-bool TextField::AccessibleImpl::CutText(size_t startPosition, size_t endPosition)
+bool TextField::TextFieldAccessible::CutText(size_t startPosition, size_t endPosition)
{
if(endPosition <= startPosition)
{
return true;
}
-bool TextField::AccessibleImpl::DeleteText(size_t startPosition, size_t endPosition)
+bool TextField::TextFieldAccessible::DeleteText(size_t startPosition, size_t endPosition)
{
if(endPosition <= startPosition)
{
return true;
}
-Dali::Accessibility::States TextField::AccessibleImpl::CalculateStates()
+Dali::Accessibility::States TextField::TextFieldAccessible::CalculateStates()
{
using namespace Dali::Accessibility;
return states;
}
-bool TextField::AccessibleImpl::InsertText(size_t startPosition, std::string text)
+bool TextField::TextFieldAccessible::InsertText(size_t startPosition, std::string text)
{
auto self = Toolkit::TextField::DownCast(Self());
auto insertedText = self.GetProperty(Toolkit::TextField::Property::TEXT).Get<std::string>();
return true;
}
-bool TextField::AccessibleImpl::SetTextContents(std::string newContents)
+bool TextField::TextFieldAccessible::SetTextContents(std::string newContents)
{
auto self = Toolkit::TextField::DownCast(Self());
self.SetProperty(Toolkit::TextField::Property::TEXT, std::move(newContents));
return true;
}
-int32_t TextField::AccessibleImpl::GetLinkCount() const
+int32_t TextField::TextFieldAccessible::GetLinkCount() const
{
auto self = Toolkit::TextField::DownCast(Self());
return Dali::Toolkit::GetImpl(self).mAnchorActors.size();
}
-Accessibility::Hyperlink* TextField::AccessibleImpl::GetLink(int32_t linkIndex) const
+Accessibility::Hyperlink* TextField::TextFieldAccessible::GetLink(int32_t linkIndex) const
{
if(linkIndex < 0 || linkIndex >= GetLinkCount())
{
return dynamic_cast<Accessibility::Hyperlink*>(Dali::Accessibility::Accessible::Get(anchorActor));
}
-int32_t TextField::AccessibleImpl::GetLinkIndex(int32_t characterOffset) const
+int32_t TextField::TextFieldAccessible::GetLinkIndex(int32_t characterOffset) const
{
auto self = Toolkit::TextField::DownCast(Self());
auto controller = Dali::Toolkit::GetImpl(self).GetTextController();