diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/whiteboard/WhiteboardFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/whiteboard/WhiteboardFragment.kt index 0ddc876c7c0c..4a8f662aa2cd 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/whiteboard/WhiteboardFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/whiteboard/WhiteboardFragment.kt @@ -41,6 +41,7 @@ import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope import com.google.android.material.button.MaterialButton import com.google.android.material.button.MaterialButtonToggleGroup +import com.google.android.material.card.MaterialCardView import com.google.android.material.slider.Slider import com.ichi2.anki.AnkiDroidApp import com.ichi2.anki.R @@ -81,12 +82,14 @@ class WhiteboardFragment : val whiteboardView = view.findViewById(R.id.whiteboard_view) brushToolbarContainerHorizontal = view.findViewById(R.id.brush_toolbar_container_horizontal) brushToolbarContainerVertical = view.findViewById(R.id.brush_toolbar_container_vertical) + val toolbarContainer = view.findViewById(R.id.controls_container) val isNightMode = Themes.systemIsInNightMode(requireContext()) viewModel.loadState(isNightMode) setupUI(view) observeViewModel(whiteboardView) + setupToolbarDisabling(whiteboardView, toolbarContainer) whiteboardView.onNewPath = viewModel::addPath whiteboardView.onEraseGestureStart = viewModel::startPathEraseGesture @@ -94,6 +97,38 @@ class WhiteboardFragment : whiteboardView.onEraseGestureEnd = viewModel::endPathEraseGesture } + /** + * Recursively enables or disables a view and all of its children. + */ + private fun setViewAndChildrenEnabled( + view: View, + enabled: Boolean, + ) { + view.isEnabled = enabled + if (view is ViewGroup) { + for (i in 0 until view.childCount) { + val child = view.getChildAt(i) + setViewAndChildrenEnabled(child, enabled) + } + } + } + + /** + * Observes the drawing state to enable or disable the toolbar, + * preventing any interaction while drawing. + */ + private fun setupToolbarDisabling( + whiteboardView: WhiteboardView, + toolbarContainer: View, + ) { + whiteboardView.isDrawing + .onEach { isCurrentlyDrawing -> + // Use the recursive function to disable the toolbar + // and EVERYTHING inside it. + setViewAndChildrenEnabled(toolbarContainer, !isCurrentlyDrawing) + }.launchIn(lifecycleScope) + } + private fun setupUI(view: View) { val undoButton = view.findViewById(R.id.undo_button) val redoButton = view.findViewById(R.id.redo_button) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/whiteboard/WhiteboardView.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/whiteboard/WhiteboardView.kt index 9956fe5ae5c3..0a7efb1f1a2a 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/whiteboard/WhiteboardView.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/whiteboard/WhiteboardView.kt @@ -28,6 +28,8 @@ import android.view.MotionEvent import android.view.View import androidx.core.graphics.createBitmap import com.ichi2.anki.R +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow /** * A custom view for the whiteboard that handles drawing and touch events. @@ -67,6 +69,8 @@ class WhiteboardView : View { private val canvasPaint = Paint(Paint.DITHER_FLAG) private var hasMoved = false + private val _isDrawing = MutableStateFlow(false) + val isDrawing = _isDrawing.asStateFlow() /** * Recreates the drawing buffer when the view size changes. @@ -118,6 +122,7 @@ class WhiteboardView : View { when (event.action) { MotionEvent.ACTION_DOWN -> { hasMoved = false + _isDrawing.value = true currentPath.moveTo(touchX, touchY) if (isPathEraser) { onEraseGestureStart?.invoke() @@ -134,6 +139,7 @@ class WhiteboardView : View { invalidate() } MotionEvent.ACTION_UP -> { + _isDrawing.value = false if (isPathEraser) { onEraseGestureEnd?.invoke() } else { diff --git a/AnkiDroid/src/main/res/layout/fragment_whiteboard.xml b/AnkiDroid/src/main/res/layout/fragment_whiteboard.xml index a375802f5c2a..127fb48f24c7 100644 --- a/AnkiDroid/src/main/res/layout/fragment_whiteboard.xml +++ b/AnkiDroid/src/main/res/layout/fragment_whiteboard.xml @@ -122,4 +122,4 @@ - + \ No newline at end of file