From 4ee973c4257ed39b6792b89421e03851639c7fff Mon Sep 17 00:00:00 2001 From: Aleksandr Zhukov Date: Wed, 8 Nov 2023 17:26:47 +0400 Subject: [PATCH] Implement deselection --- .../FillBlanksStepQuizFormDelegate.kt | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/androidHyperskillApp/src/main/java/org/hyperskill/app/android/step_quiz_fill_blanks/delegate/FillBlanksStepQuizFormDelegate.kt b/androidHyperskillApp/src/main/java/org/hyperskill/app/android/step_quiz_fill_blanks/delegate/FillBlanksStepQuizFormDelegate.kt index 719d499c2e..643551129a 100644 --- a/androidHyperskillApp/src/main/java/org/hyperskill/app/android/step_quiz_fill_blanks/delegate/FillBlanksStepQuizFormDelegate.kt +++ b/androidHyperskillApp/src/main/java/org/hyperskill/app/android/step_quiz_fill_blanks/delegate/FillBlanksStepQuizFormDelegate.kt @@ -104,7 +104,9 @@ class FillBlanksStepQuizFormDelegate( fillBlanksData?.options?.let { options -> // addDelegate adds delegate only once under the hood - fillBlanksAdapter.addDelegate(selectAdapterDelegate(options)) + fillBlanksAdapter.addDelegate( + selectAdapterDelegate(options, ::onSelectItemClick) + ) } fillBlanksAdapter.items = fillBlanksData?.fillBlanks ?: emptyList() @@ -225,13 +227,25 @@ class FillBlanksStepQuizFormDelegate( .showIfNotExists(fragmentManager, FillBlanksInputDialogFragment.TAG) } - private fun selectAdapterDelegate(options: List) = + private fun selectAdapterDelegate( + options: List, + onClick: (blankIndex: Int, selectedOptionIndex: Int) -> Unit + ) = adapterDelegate(R.layout.item_step_quiz_fill_blanks_select) { val textView = itemView as TextView val layerListDrawableDelegate = LayerListDrawableDelegate( selectOptionLayers, textView.background.mutate() as LayerDrawable ) + + textView.setOnClickListener { + val position = bindingAdapterPosition + val selectedOptionIndex = item?.selectedOptionIndex + if (position != RecyclerView.NO_POSITION && selectedOptionIndex != null) { + onClick(position, selectedOptionIndex) + } + } + onBind { selectItem -> val selectedOptionIndex = selectItem.selectedOptionIndex val text = if (selectedOptionIndex != null) { @@ -240,6 +254,7 @@ class FillBlanksStepQuizFormDelegate( null } textView.setTextIfChanged(text ?: "") + textView.isClickable = selectedOptionIndex != null layerListDrawableDelegate.showLayer( when { text.isNullOrEmpty() -> R.id.step_quiz_fill_blanks_select_empty_layer @@ -287,6 +302,18 @@ class FillBlanksStepQuizFormDelegate( } } + private fun onSelectItemClick(blankIndex: Int, selectedOptionIndex: Int) { + fillBlanksAdapter.items = fillBlanksAdapter.items.mutate { + val item = get(blankIndex) + if (item is FillBlanksItem.Select) { + set(blankIndex, item.copy(selectedOptionIndex = null)) + } + } + fillBlanksOptionsAdapter?.items = fillBlanksOptionsAdapter?.items?.mutate { + set(selectedOptionIndex, get(blankIndex).copy(isUsed = false)) + } ?: emptyList() + } + private fun onOptionClick(selectedOptionIndex: Int, selectedOption: FillBlanksOption) { fillBlanksAdapter.items = fillNextBlank( selectedOptionIndex = selectedOptionIndex,