X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Ftext-controls%2Ftext-field-impl.cpp;h=f0d6c689b27b323838556c8c3c5c5fd7008e2504;hb=7f4489a70328526f207bf6006bd6baa2702a9cef;hp=2f4ef60957a53b7e82fcf2281dbc4beca915a78a;hpb=70468ae7ba6b75df1db1063e9b3fcf0313ffd787;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git 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 2f4ef60..f0d6c68 100644 --- a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -137,10 +137,14 @@ DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextField, "selectedTextStar DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextField, "selectedTextEnd", INTEGER, SELECTED_TEXT_END ) DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextField, "enableEditing", BOOLEAN, ENABLE_EDITING ) DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextField, "fontSizeScale", FLOAT, FONT_SIZE_SCALE ) +DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextField, "enableFontSizeScale", BOOLEAN, ENABLE_FONT_SIZE_SCALE ) DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextField, "primaryCursorPosition", INTEGER, PRIMARY_CURSOR_POSITION ) DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextField, "grabHandleColor", VECTOR4, GRAB_HANDLE_COLOR ) DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextField, "inputFilter", MAP, INPUT_FILTER ) 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 ) @@ -150,6 +154,7 @@ DALI_SIGNAL_REGISTRATION(Toolkit, TextField, "inputFiltered", SIGNAL_INP DALI_SIGNAL_REGISTRATION(Toolkit, TextField, "cursorPositionChanged", SIGNAL_CURSOR_POSITION_CHANGED) DALI_SIGNAL_REGISTRATION(Toolkit, TextField, "selectionChanged", SIGNAL_SELECTION_CHANGED ) DALI_SIGNAL_REGISTRATION(Toolkit, TextField, "selectionCleared", SIGNAL_SELECTION_CLEARED ) +DALI_SIGNAL_REGISTRATION(Toolkit, TextField, "selectionStarted", SIGNAL_SELECTION_STARTED ) DALI_TYPE_REGISTRATION_END() // clang-format on @@ -204,8 +209,8 @@ Toolkit::TextField::InputStyle::Mask ConvertInputStyle(Text::InputStyle::Mask in bool IsHiddenInput(Toolkit::TextField textField) { Property::Map hiddenInputSettings = textField.GetProperty(Toolkit::TextField::Property::HIDDEN_INPUT_SETTINGS); - auto mode = hiddenInputSettings.Find(Toolkit::HiddenInput::Property::MODE); - if (mode && (mode->Get() != Toolkit::HiddenInput::Mode::HIDE_NONE)) + auto mode = hiddenInputSettings.Find(Toolkit::HiddenInput::Property::MODE); + if(mode && (mode->Get() != Toolkit::HiddenInput::Mode::HIDE_NONE)) { return true; } @@ -215,8 +220,8 @@ bool IsHiddenInput(Toolkit::TextField textField) char GetSubstituteCharacter(Toolkit::TextField textField) { Property::Map hiddenInputSettings = textField.GetProperty(Toolkit::TextField::Property::HIDDEN_INPUT_SETTINGS); - auto substChar = hiddenInputSettings.Find(Toolkit::HiddenInput::Property::SUBSTITUTE_CHARACTER); - if (substChar) + auto substChar = hiddenInputSettings.Find(Toolkit::HiddenInput::Property::SUBSTITUTE_CHARACTER); + if(substChar) { return static_cast(substChar->Get()); } @@ -414,6 +419,14 @@ bool TextField::DoConnectSignal(BaseObject* object, ConnectionTrackerInterface* fieldImpl.SelectionClearedSignal().Connect(tracker, functor); } } + else if(0 == strcmp(signalName.c_str(), SIGNAL_SELECTION_STARTED)) + { + if(field) + { + Internal::TextField& fieldImpl(GetImpl(field)); + fieldImpl.SelectionStartedSignal().Connect(tracker, functor); + } + } else { // signalName does not match any signal @@ -463,6 +476,11 @@ DevelTextField::SelectionClearedSignalType& TextField::SelectionClearedSignal() return mSelectionClearedSignal; } +DevelTextField::SelectionStartedSignalType& TextField::SelectionStartedSignal() +{ + return mSelectionStartedSignal; +} + void TextField::OnAccessibilityStatusChanged() { CommonTextUtils::SynchronizeTextAnchorsInParent(Self(), mController, mAnchorActors); @@ -640,6 +658,11 @@ void TextField::OnRelayout(const Vector2& size, RelayoutContainer& container) 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) @@ -673,6 +696,11 @@ void TextField::OnRelayout(const Vector2& size, RelayoutContainer& container) EmitCursorPositionChangedSignal(); } + if(mSelectionStarted) + { + EmitSelectionStartedSignal(); + } + if(mSelectionChanged) { EmitSelectionChangedSignal(); @@ -948,6 +976,13 @@ void TextField::EmitSelectionClearedSignal() mSelectionCleared = false; } +void TextField::EmitSelectionStartedSignal() +{ + Dali::Toolkit::TextField handle(GetOwner()); + mSelectionStartedSignal.Emit(handle); + mSelectionStarted = false; +} + void TextField::SelectionChanged(uint32_t oldStart, uint32_t oldEnd, uint32_t newStart, uint32_t newEnd) { if(((oldStart != newStart) || (oldEnd != newEnd)) && !mSelectionChanged) @@ -956,6 +991,13 @@ void TextField::SelectionChanged(uint32_t oldStart, uint32_t oldEnd, uint32_t ne { mSelectionCleared = true; } + else + { + if(oldStart == oldEnd) + { + mSelectionStarted = true; + } + } mSelectionChanged = true; mOldSelectionStart = oldStart; @@ -971,7 +1013,7 @@ void TextField::SelectionChanged(uint32_t oldStart, uint32_t oldEnd, uint32_t ne } } -void TextField::AddDecoration(Actor& actor, bool needsClipping) +void TextField::AddDecoration(Actor& actor, DecorationType type, bool needsClipping) { if(actor) { @@ -979,16 +1021,27 @@ void TextField::AddDecoration(Actor& actor, bool needsClipping) { mClippingDecorationActors.push_back(actor); } - else + + // If the actor is a layer type, add it. + if(type == DecorationType::ACTIVE_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(mActiveLayer, actor); + } + else if(type == DecorationType::CURSOR_LAYER) + { + 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); @@ -1114,7 +1167,8 @@ TextField::TextField() mSelectionCleared(false), mOldPosition(0u), mOldSelectionStart(0u), - mOldSelectionEnd(0u) + mOldSelectionEnd(0u), + mSelectionStarted(false) { } @@ -1128,10 +1182,20 @@ TextField::~TextField() } } -std::string TextField::AccessibleImpl::GetName() +Vector TextField::GetTextSize(const uint32_t startIndex, const uint32_t endIndex) const +{ + return mController->GetTextSize(startIndex, endIndex); +} + +Vector TextField::GetTextPosition(const uint32_t startIndex, const uint32_t endIndex) const +{ + return mController->GetTextPosition(startIndex, endIndex); +} + +std::string TextField::AccessibleImpl::GetName() const { auto self = Toolkit::TextField::DownCast(Self()); - if (IsHiddenInput(self)) + if(IsHiddenInput(self)) { return {}; } @@ -1139,7 +1203,7 @@ std::string TextField::AccessibleImpl::GetName() return self.GetProperty(Toolkit::TextField::Property::TEXT).Get(); } -std::string TextField::AccessibleImpl::GetText(size_t startOffset, size_t endOffset) +std::string TextField::AccessibleImpl::GetText(size_t startOffset, size_t endOffset) const { if(endOffset <= startOffset) { @@ -1160,7 +1224,7 @@ std::string TextField::AccessibleImpl::GetText(size_t startOffset, size_t endOff return text.substr(startOffset, endOffset - startOffset); } -size_t TextField::AccessibleImpl::GetCharacterCount() +size_t TextField::AccessibleImpl::GetCharacterCount() const { auto self = Toolkit::TextField::DownCast(Self()); auto text = self.GetProperty(Toolkit::TextField::Property::TEXT).Get(); @@ -1168,7 +1232,7 @@ size_t TextField::AccessibleImpl::GetCharacterCount() return text.size(); } -size_t TextField::AccessibleImpl::GetCursorOffset() +size_t TextField::AccessibleImpl::GetCursorOffset() const { auto self = Toolkit::TextField::DownCast(Self()); return Dali::Toolkit::GetImpl(self).GetTextController()->GetCursorPosition(); @@ -1191,10 +1255,10 @@ bool TextField::AccessibleImpl::SetCursorOffset(size_t offset) } Dali::Accessibility::Range TextField::AccessibleImpl::GetTextAtOffset( - size_t offset, Dali::Accessibility::TextBoundary boundary) + size_t offset, Dali::Accessibility::TextBoundary boundary) const { - auto self = Toolkit::TextField::DownCast(Self()); - auto range = Dali::Accessibility::Range{}; + auto self = Toolkit::TextField::DownCast(Self()); + auto range = Dali::Accessibility::Range{}; if(IsHiddenInput(self)) { @@ -1289,7 +1353,7 @@ Dali::Accessibility::Range TextField::AccessibleImpl::GetTextAtOffset( return range; } -Dali::Accessibility::Range TextField::AccessibleImpl::GetRangeOfSelection(size_t selectionIndex) +Dali::Accessibility::Range TextField::AccessibleImpl::GetRangeOfSelection(size_t selectionIndex) const { // Since DALi supports only one selection indexes higher than 0 are ignored if(selectionIndex > 0) @@ -1297,14 +1361,14 @@ Dali::Accessibility::Range TextField::AccessibleImpl::GetRangeOfSelection(size_t return {}; } - auto self = Toolkit::TextField::DownCast(Self()); + auto self = Toolkit::TextField::DownCast(Self()); auto controller = Dali::Toolkit::GetImpl(self).GetTextController(); - auto indices = controller->GetSelectionIndexes(); + auto indices = controller->GetSelectionIndexes(); auto startOffset = static_cast(indices.first); - auto endOffset = static_cast(indices.second); + auto endOffset = static_cast(indices.second); - if (IsHiddenInput(self)) + if(IsHiddenInput(self)) { return {startOffset, endOffset, std::string(endOffset - startOffset, GetSubstituteCharacter(self))}; } @@ -1389,13 +1453,13 @@ Dali::Accessibility::States TextField::AccessibleImpl::CalculateStates() { using namespace Dali::Accessibility; - auto states = DevelControl::AccessibleImpl::CalculateStates(); + auto states = DevelControl::ControlAccessible::CalculateStates(); states[State::EDITABLE] = true; states[State::FOCUSABLE] = true; Toolkit::Control focusControl = Toolkit::KeyInputFocusManager::Get().GetCurrentFocusControl(); - if(mSelf == focusControl) + if(Self() == focusControl) { states[State::FOCUSED] = true; }