From e4aa59b987de85bf42b2aacef1e9f207d51a31ce Mon Sep 17 00:00:00 2001 From: holani <3170074871@qq.com> Date: Thu, 23 Jan 2025 20:41:36 +0800 Subject: [PATCH] inhannce textpicker on multi situation Signed-off-by: holani <3170074871@qq.com> --- .../cj_ffi/cj_navdestination_ffi.cpp | 6 +- .../interfaces/cj_ffi/cj_richeditor_ffi.cpp | 17 +- .../interfaces/cj_ffi/cj_textpicker_ffi.cpp | 221 ++++++++++++++++-- .../interfaces/cj_ffi/cj_textpicker_ffi.h | 59 ++++- 4 files changed, 277 insertions(+), 26 deletions(-) diff --git a/frameworks/bridge/cj_frontend/interfaces/cj_ffi/cj_navdestination_ffi.cpp b/frameworks/bridge/cj_frontend/interfaces/cj_ffi/cj_navdestination_ffi.cpp index 38a36322a3c..408e60d0d96 100644 --- a/frameworks/bridge/cj_frontend/interfaces/cj_ffi/cj_navdestination_ffi.cpp +++ b/frameworks/bridge/cj_frontend/interfaces/cj_ffi/cj_navdestination_ffi.cpp @@ -74,7 +74,8 @@ void FfiOHOSAceFrameworkNavdestinationSetOnReady(void (*callback)(CJNavDestinati auto onReadyCallback = [ffiCallback = CJLambda::Create(callback)](RefPtr context) { auto pathInfo = context->GetNavPathInfo(); CJNavPathInfoFFi info = CJNavPathInfoFFi(); - info.name = strdup(pathInfo->GetName().c_str()); + char* temp = strdup(pathInfo->GetName().c_str()); + info.name = temp; int64_t pathStackId = 0; auto stack = context->GetNavigationStack().Upgrade(); if (stack) { @@ -88,6 +89,9 @@ void FfiOHOSAceFrameworkNavdestinationSetOnReady(void (*callback)(CJNavDestinati cjContext.pathStack = pathStackId; cjContext.pathInfo = info; ffiCallback(cjContext); + if (temp != nullptr) { + free(temp); + } }; NavDestinationModel::GetInstance()->SetOnReady(std::move(onReadyCallback)); } diff --git a/frameworks/bridge/cj_frontend/interfaces/cj_ffi/cj_richeditor_ffi.cpp b/frameworks/bridge/cj_frontend/interfaces/cj_ffi/cj_richeditor_ffi.cpp index de5575d310e..fd18f708f05 100644 --- a/frameworks/bridge/cj_frontend/interfaces/cj_ffi/cj_richeditor_ffi.cpp +++ b/frameworks/bridge/cj_frontend/interfaces/cj_ffi/cj_richeditor_ffi.cpp @@ -174,13 +174,23 @@ void FfiOHOSAceFrameworkRichEditorOnDeleteComplete(void(*callback)()) RichEditorModel::GetInstance()->SetOnDeleteComplete(CJLambda::Create(callback)); } +char* MallocCString(const std::string& origin) +{ + auto len = origin.length() + 1; + char* res = static_cast(malloc(sizeof(char) * len)); + if (res == nullptr) { + return nullptr; + } + return std::char_traits::copy(res, origin.c_str(), len); +} + void FfiOHOSAceFrameworkRichEditorAboutToIMEInput(bool(*callback)(NativeRichEditorInsertValue)) { auto aboutToIMEInputFunc = [cjCallback = CJLambda::Create(callback)]( const NG::RichEditorInsertValue& insertValue) -> bool { - auto utilstring = UtfUtils::Str16ToStr8(insertValue.GetInsertValue()).c_str(); NativeRichEditorInsertValue result { - insertValue.GetInsertOffset(), utilstring + insertValue.GetInsertOffset(), + MallocCString(UtfUtils::Str16ToStr8(insertValue.GetInsertValue())) }; return cjCallback(result); }; @@ -224,10 +234,9 @@ void FfiOHOSAceFrameworkRichEditorOnIMEInputComplete(void(*callback)(NativeRichE textSpanResult.GetFontFamily().c_str(), decoration }; - auto utilstring = UtfUtils::Str16ToStr8(textSpanResult.GetValue()).c_str(); NativeRichEditorTextSpanResult result { spanPosition, - utilstring, + MallocCString(UtfUtils::Str16ToStr8(textSpanResult.GetValue())), textStyle, textSpanResult.OffsetInSpan(), textSpanResult.OffsetInSpan() + textSpanResult.GetEraseLength() diff --git a/frameworks/bridge/cj_frontend/interfaces/cj_ffi/cj_textpicker_ffi.cpp b/frameworks/bridge/cj_frontend/interfaces/cj_ffi/cj_textpicker_ffi.cpp index 8d5e871450f..36c2bdbde9c 100644 --- a/frameworks/bridge/cj_frontend/interfaces/cj_ffi/cj_textpicker_ffi.cpp +++ b/frameworks/bridge/cj_frontend/interfaces/cj_ffi/cj_textpicker_ffi.cpp @@ -18,6 +18,7 @@ #include "cj_lambda.h" #include "bridge/cj_frontend/interfaces/cj_ffi/cj_view_abstract_ffi.h" +#include "bridge/common/utils/utils.h" #include "core/components_ng/pattern/text_picker/textpicker_model_ng.h" using namespace OHOS::Ace; @@ -79,16 +80,14 @@ std::map TextPickerDialogEvent( std::map TextPickerCancelEvent(std::function result) { std::map dialogCancelEvent; - auto cancelId = [result](const GestureEvent&) { - result(); - }; + auto cancelId = [result](const GestureEvent&) { result(); }; dialogCancelEvent["cancelId"] = cancelId; return dialogCancelEvent; } void TextPickerDialogShow(std::vector range, uint32_t selected, const Dimension& height, - const std::map& dialogEvent, - const std::map& cancelEvent) + const std::map& dialogEvent, + const std::map& cancelEvent) { auto currentObj = Container::Current(); if (!currentObj) { @@ -124,8 +123,7 @@ void TextPickerDialogShow(std::vector range, uint32_t selected, con auto context = AccessibilityManager::DynamicCast(pipelineContext); auto overlayManager = context ? context->GetOverlayManager() : nullptr; executor->PostTask( - [properties, settingData, dialogEvent, cancelEvent, - weak = WeakPtr(overlayManager)] { + [properties, settingData, dialogEvent, cancelEvent, weak = WeakPtr(overlayManager)] { auto overlayManager = weak.Upgrade(); overlayManager->ShowTextDialog(properties, settingData, dialogEvent, cancelEvent); }, @@ -134,6 +132,41 @@ void TextPickerDialogShow(std::vector range, uint32_t selected, con } // namespace OHOS::Ace extern "C" { +VectorRangeContentHandle FFICJCreateVectorRangeContent(int64_t size) +{ + return new std::vector(size); +} + +void FFICJVectorRangeContentDelete(VectorRangeContentHandle vec) +{ + auto actualVec = reinterpret_cast*>(vec); + delete actualVec; +} + +void FFICJVectorRangeContentSetElement(VectorRangeContentHandle vec, int64_t index, CJRangeContent rangeContentOptions) +{ + auto actualVec = reinterpret_cast*>(vec); + (*actualVec)[index] = rangeContentOptions; +} + +VectorTextCascadePickerOptionsHandle FFICJCreateVectorTextCascadePickerOptions(int64_t size) +{ + return new std::vector(size); +} + +void FFICJVectorTextCascadePickerOptionsDelete(VectorTextCascadePickerOptionsHandle vec) +{ + auto actualVec = reinterpret_cast*>(vec); + delete actualVec; +} + +void FFICJVectorTextCascadePickerOptionsSetElement( + VectorTextCascadePickerOptionsHandle vec, int64_t index, CJTextCascadePickerOptions textCascadeOptions) +{ + auto actualVec = reinterpret_cast*>(vec); + (*actualVec)[index] = textCascadeOptions; +} + void FfiOHOSAceFrameworkTextPickerCreate(VectorStringPtr vecContent, uint32_t selected, const char* value) { auto actualVec = reinterpret_cast*>(vecContent); @@ -161,6 +194,160 @@ void FfiOHOSAceFrameworkTextPickerCreate(VectorStringPtr vecContent, uint32_t se return; } +void FfiOHOSAceFrameworkTextPickerCreateSingle(CJTextArrayParamSingle params) +{ + const auto& actualVec = reinterpret_cast*>(params.result); + auto theme = GetTheme(); + CHECK_NULL_VOID(theme); + TextPickerModel::GetInstance()->SetDefaultAttributes(theme); + + std::vector result; + + for (const auto& text : *actualVec) { + NG::RangeContent content; + content.icon_ = ""; + content.text_ = text; + result.emplace_back(content); + } + + WeakPtr targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode()); + auto selectedchangeEvent = [lambda = CJLambda::Create(params.selectedChangeEvent), node = targetNode]( + const std::vector& value) -> void { + PipelineContext::SetCallBackNode(node); + lambda(static_cast(value[0])); + }; + auto valuechangeEvent = [lambda = CJLambda::Create(params.valueChangeEvent), node = targetNode]( + const std::vector& value) -> void { + PipelineContext::SetCallBackNode(node); + lambda(value[0].c_str()); + }; + + TextPickerModel::GetInstance()->SetSingleRange(true); + TextPickerModel::GetInstance()->Create(theme, params.kind); + TextPickerModel::GetInstance()->SetRange(result); + TextPickerModel::GetInstance()->SetSelected(params.selected); + TextPickerModel::GetInstance()->SetValue(params.value); + TextPickerModel::GetInstance()->HasUserDefinedOpacity(); + TextPickerModel::GetInstance()->SetOnValueChangeEvent(std::move(valuechangeEvent)); + TextPickerModel::GetInstance()->SetOnSelectedChangeEvent(std::move(selectedchangeEvent)); +} + +void FfiOHOSAceFrameworkTextPickerCreateMulti(CJTextArrayParamMulti params) +{ + auto theme = GetTheme(); + CHECK_NULL_VOID(theme); + TextPickerModel::GetInstance()->SetDefaultAttributes(theme); + TextPickerModel::GetInstance()->MultiInit(theme); + + const auto& valuesVec = reinterpret_cast*>(params.values); + const auto& selectedVec = reinterpret_cast*>(params.selecteds); + const auto& optionsVec = reinterpret_cast*>(params.options); + + std::vector options; + for (const auto& content : *optionsVec) { + NG::TextCascadePickerOptions option; + option.rangeResult = *reinterpret_cast*>(content.rangeResult); + options.emplace_back(option); + } + + WeakPtr targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode()); + auto selectedchangeEvent = [lambda = CJLambda::Create(params.selectedsChangeEvent), node = targetNode]( + const std::vector& value) -> void { + PipelineContext::SetCallBackNode(node); + std::vector transSelelceds; + for (const auto& val : value) { + transSelelceds.push_back(static_cast(val)); + } + lambda(&transSelelceds); + LOGI("bind selectedchangeEvent success"); + }; + auto valuechangeEvent = [lambda = CJLambda::Create(params.valuesChangeEvent), node = targetNode]( + const std::vector& value) -> void { + PipelineContext::SetCallBackNode(node); + auto transValues = new std::vector(); + for (const auto& val : value) { + transValues->push_back(val); + } + lambda(reinterpret_cast(transValues)); + LOGI("bind valuechangeEvent success"); + delete transValues; + }; + + TextPickerModel::GetInstance()->SetSelecteds(*selectedVec); + TextPickerModel::GetInstance()->SetValues(*valuesVec); + TextPickerModel::GetInstance()->SetIsCascade(params.isCascade); + TextPickerModel::GetInstance()->SetHasSelectAttr(params.isHasSelectAttr); + TextPickerModel::GetInstance()->SetColumns(options); + TextPickerModel::GetInstance()->HasUserDefinedOpacity(); + TextPickerModel::GetInstance()->SetOnValueChangeEvent(std::move(valuechangeEvent)); + TextPickerModel::GetInstance()->SetOnSelectedChangeEvent(std::move(selectedchangeEvent)); +} + +void generateCascadeOptions( + const std::vector& optionsvec, std::vector& options) +{ + if (optionsvec.empty()) { + return; + } + for (const CJTextCascadePickerOptions& content : optionsvec) { + NG::TextCascadePickerOptions option; + option.rangeResult = *reinterpret_cast*>(content.rangeResult); + auto temp = reinterpret_cast*>(content.children); + if (temp != nullptr) { + generateCascadeOptions(*temp, option.children); + } + options.emplace_back(option); + } +} + +void FfiOHOSAceFrameworkTextPickerCreateCascade(CJTextArrayParamMulti params) +{ + auto theme = GetTheme(); + CHECK_NULL_VOID(theme); + TextPickerModel::GetInstance()->SetDefaultAttributes(theme); + TextPickerModel::GetInstance()->MultiInit(theme); + + const auto& valuesVec = reinterpret_cast*>(params.values); + const auto& selectedVec = reinterpret_cast*>(params.selecteds); + const auto& optionsVec = reinterpret_cast*>(params.options); + + std::vector options; + + generateCascadeOptions(*optionsVec, options); + + WeakPtr targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode()); + auto selectedchangeEvent = [lambda = CJLambda::Create(params.selectedsChangeEvent), node = targetNode]( + const std::vector& value) -> void { + PipelineContext::SetCallBackNode(node); + std::vector transSelelceds; + for (const auto& val : value) { + transSelelceds.push_back(static_cast(val)); + } + lambda(&transSelelceds); + LOGI("bind selectedchangeEvent success"); + }; + auto valuechangeEvent = [lambda = CJLambda::Create(params.valuesChangeEvent), node = targetNode]( + const std::vector& value) -> void { + PipelineContext::SetCallBackNode(node); + auto transValues = new std::vector(); + for (const auto& val : value) { + transValues->push_back(val); + } + lambda(reinterpret_cast(transValues)); + LOGI("bind valuechangeEvent success"); + delete transValues; + }; + + TextPickerModel::GetInstance()->SetSelecteds(*selectedVec); + TextPickerModel::GetInstance()->SetValues(*valuesVec); + TextPickerModel::GetInstance()->SetIsCascade(params.isCascade); + TextPickerModel::GetInstance()->SetHasSelectAttr(params.isHasSelectAttr); + TextPickerModel::GetInstance()->SetColumns(options); + TextPickerModel::GetInstance()->HasUserDefinedOpacity(); + TextPickerModel::GetInstance()->SetOnValueChangeEvent(std::move(valuechangeEvent)); + TextPickerModel::GetInstance()->SetOnSelectedChangeEvent(std::move(selectedchangeEvent)); +} + void FfiOHOSAceFrameworkTextPickerSetDefaultPickerItemHeight(double height, int32_t unit) { Dimension heightDime(height, static_cast(unit)); @@ -173,8 +360,8 @@ void FfiOHOSAceFrameworkTextPickerSetCanLoop(bool value) TextPickerModel::GetInstance()->SetCanLoop(value); } -void FfiOHOSAceFrameworkTextPickerSetTextStyle(uint32_t color, double size, int32_t unit, - const char* weight, const char* family, uint32_t style) +void FfiOHOSAceFrameworkTextPickerSetTextStyle( + uint32_t color, double size, int32_t unit, const char* weight, const char* family, uint32_t style) { auto theme = GetTheme(); CHECK_NULL_VOID(theme); @@ -194,8 +381,8 @@ void FfiOHOSAceFrameworkTextPickerSetTextStyle(uint32_t color, double size, int3 TextPickerModel::GetInstance()->SetNormalTextStyle(theme, textStyle); } -void FfiOHOSAceFrameworkTextPickerSetDisappearTextStyle(uint32_t color, double size, int32_t unit, - const char* weight, const char* family, uint32_t style) +void FfiOHOSAceFrameworkTextPickerSetDisappearTextStyle( + uint32_t color, double size, int32_t unit, const char* weight, const char* family, uint32_t style) { auto theme = GetTheme(); CHECK_NULL_VOID(theme); @@ -215,8 +402,8 @@ void FfiOHOSAceFrameworkTextPickerSetDisappearTextStyle(uint32_t color, double s TextPickerModel::GetInstance()->SetDisappearTextStyle(theme, textStyle); } -void FfiOHOSAceFrameworkTextPickerSetSelectedTextStyle(uint32_t color, double size, int32_t unit, - const char* weight, const char* family, uint32_t style) +void FfiOHOSAceFrameworkTextPickerSetSelectedTextStyle( + uint32_t color, double size, int32_t unit, const char* weight, const char* family, uint32_t style) { auto theme = GetTheme(); CHECK_NULL_VOID(theme); @@ -264,7 +451,7 @@ void FfiOHOSAceFrameworkTextPickerSetSelectedIndexSingle(uint32_t value) void FfiOHOSAceFrameworkTextPickerSetSelectedIndexMulti(VectorUInt32Handle values) { - const auto& indexarray = * reinterpret_cast*>(values); + const auto& indexarray = *reinterpret_cast*>(values); TextPickerModel::GetInstance()->SetSelecteds(indexarray); } @@ -292,4 +479,10 @@ void FfiOHOSAceFrameworkTextPickerDialogShow(VectorStringPtr vecContent, CJDialo TextPickerDialogShow(*actualVec, value.selected, itemHeight, dialogEvent, cancelEvent); return; } + +void FfiOHOSAceFrameworkTextPickerSetOpacity(double opacity) +{ + ViewAbstractModel::GetInstance()->SetOpacity(opacity); + TextPickerModel::GetInstance()->HasUserDefinedOpacity(); +} } diff --git a/frameworks/bridge/cj_frontend/interfaces/cj_ffi/cj_textpicker_ffi.h b/frameworks/bridge/cj_frontend/interfaces/cj_ffi/cj_textpicker_ffi.h index eae79501c6a..c355f48d05b 100644 --- a/frameworks/bridge/cj_frontend/interfaces/cj_ffi/cj_textpicker_ffi.h +++ b/frameworks/bridge/cj_frontend/interfaces/cj_ffi/cj_textpicker_ffi.h @@ -21,8 +21,10 @@ #include "bridge/cj_frontend/interfaces/cj_ffi/cj_common_ffi.h" #include "bridge/cj_frontend/interfaces/cj_ffi/cj_macro.h" -using VectorStringPtr = void*; +using VectorRangeContentHandle = void*; +using VectorTextCascadePickerOptionsHandle = void*; using VectorUInt32Handle = void*; +using VectorStringPtr = void*; extern "C" { struct CJDialogShow { @@ -44,21 +46,64 @@ struct DividerParams { int32_t endMarginUnit; }; +struct CJRangeContent { + std::string icon_; + std::string text_; +}; + +struct CJTextCascadePickerOptions { + VectorStringPtr rangeResult; + VectorTextCascadePickerOptionsHandle children; +}; + +struct CJTextArrayParamSingle { + const VectorRangeContentHandle result; + uint32_t kind; + uint32_t selected; + const char* value; + void (*selectedChangeEvent)(uint32_t selectedchange); + void (*valueChangeEvent)(const char* valuechange); +}; + +struct CJTextArrayParamMulti { + const VectorTextCascadePickerOptionsHandle options; + VectorUInt32Handle selecteds; + VectorStringPtr values; + uint32_t maxcount; + bool isCascade = false; + bool isHasSelectAttr = false; + void (*selectedsChangeEvent)(VectorUInt32Handle selectedchange); + void (*valuesChangeEvent)(VectorStringPtr valuechange); +}; + +CJ_EXPORT VectorRangeContentHandle FFICJCreateVectorRangeContent(int64_t size); +CJ_EXPORT void FFICJVectorRangeContentDelete(VectorRangeContentHandle vec); +CJ_EXPORT void FFICJVectorRangeContentSetElement( + VectorRangeContentHandle vec, int64_t index, CJRangeContent rangeContentOptions); +CJ_EXPORT VectorTextCascadePickerOptionsHandle FFICJCreateVectorTextCascadePickerOptions(int64_t size); +CJ_EXPORT void FFICJVectorTextCascadePickerOptionsDelete(VectorTextCascadePickerOptionsHandle vec); +CJ_EXPORT void FFICJVectorTextCascadePickerOptionsSetElement( + VectorTextCascadePickerOptionsHandle vec, int64_t index, CJTextCascadePickerOptions textCascadeOptions); CJ_EXPORT void FfiOHOSAceFrameworkTextPickerDialogShow(VectorStringPtr vecContent, CJDialogShow value); CJ_EXPORT void FfiOHOSAceFrameworkTextPickerSetDefaultPickerItemHeight(double height, int32_t unit); CJ_EXPORT void FfiOHOSAceFrameworkTextPickerSetCanLoop(bool value); -CJ_EXPORT void FfiOHOSAceFrameworkTextPickerSetTextStyle(uint32_t color, double size, int32_t unit, - const char* weight, const char* family, uint32_t style); -CJ_EXPORT void FfiOHOSAceFrameworkTextPickerSetSelectedTextStyle(uint32_t color, double size, int32_t unit, - const char* weight, const char* family, uint32_t style); -CJ_EXPORT void FfiOHOSAceFrameworkTextPikerSetDisappearTextStyle(uint32_t color, double size, - int32_t unit, const char* weight, const char* family, uint32_t style); +CJ_EXPORT void FfiOHOSAceFrameworkTextPickerCreate(VectorStringPtr vecContent, uint32_t selected, const char* value); +CJ_EXPORT void FfiOHOSAceFrameworkTextPickerCreateSingle(CJTextArrayParamSingle param); +CJ_EXPORT void FfiOHOSAceFrameworkTextPickerCreateMulti(CJTextArrayParamMulti param); +CJ_EXPORT void FfiOHOSAceFrameworkTextPickerCreateMulti(CJTextArrayParamMulti param); +CJ_EXPORT void FfiOHOSAceFrameworkTextPickerSetTextStyle( + uint32_t color, double size, int32_t unit, const char* weight, const char* family, uint32_t style); +CJ_EXPORT void FfiOHOSAceFrameworkTextPickerSetSelectedTextStyle( + uint32_t color, double size, int32_t unit, const char* weight, const char* family, uint32_t style); +CJ_EXPORT void FfiOHOSAceFrameworkTextPickerSetDisappearTextStyle( + uint32_t color, double size, int32_t unit, const char* weight, const char* family, uint32_t style); CJ_EXPORT void FfiOHOSAceFrameworkTextPickerSetGradientHeight(double length, int32_t unit); CJ_EXPORT void FfiOHOSAceFrameworkTextPickerSetDivider(DividerParams params); CJ_EXPORT void FfiOHOSAceFrameworkTextPickerSetSelectedIndexSingle(uint32_t value); CJ_EXPORT void FfiOHOSAceFrameworkTextPickerSetSelectedIndexMulti(VectorUInt32Handle values); CJ_EXPORT void FfiOHOSAceFrameworkTextPickerOnChange(void (*callback)(CJTextPickerResult pickerResult)); CJ_EXPORT void FfiOHOSAceFrameworkTextPickerCreate(VectorStringPtr vecContent, uint32_t selected, const char* value); +CJ_EXPORT void FfiOHOSAceFrameworkTextPickerSetOpacity(double opacity); } #endif // OHOS_ACE_FRAMEWORK_CJ_TEXTPICKER_FFI_H -- Gitee