From 163d275db2bdd689df96a2e4244fc14826a0940b Mon Sep 17 00:00:00 2001 From: Tim Celec Date: Sun, 27 Aug 2023 19:51:13 +0200 Subject: [PATCH 1/6] Paintroid-624 --- .../test/espresso/ToolPixelIntegrationTest.kt | 8 + .../paintroid/controller/ToolController.kt | 3 +- .../org/catrobat/paintroid/tools/ToolType.kt | 10 ++ .../implementation/DefaultToolFactory.kt | 19 +- .../tools/implementation/PixelTool.kt | 58 +++++++ .../options/PixelationToolOptionsView.kt | 22 +++ .../ui/tools/DefaultPixelToolOptionsView.kt | 139 +++++++++++++++ .../zoomwindow/DefaultZoomWindowController.kt | 3 +- .../drawable/ic_pocketpaint_tool_pixel.xml | 9 + .../res/layout/dialog_pocketpaint_pixel.xml | 163 ++++++++++++++++++ .../res/layout/dialog_pocketpaint_stroke.xml | 2 +- .../dialog_pocketpaint_transform_tool.xml | 65 +++---- .../layout/pocketpaint_layout_bottom_bar.xml | 25 +++ Paintroid/src/main/res/values/string.xml | 9 +- 14 files changed, 492 insertions(+), 43 deletions(-) create mode 100644 Paintroid/src/androidTest/java/org/catrobat/paintroid/test/espresso/ToolPixelIntegrationTest.kt create mode 100644 Paintroid/src/main/java/org/catrobat/paintroid/tools/implementation/PixelTool.kt create mode 100644 Paintroid/src/main/java/org/catrobat/paintroid/tools/options/PixelationToolOptionsView.kt create mode 100644 Paintroid/src/main/java/org/catrobat/paintroid/ui/tools/DefaultPixelToolOptionsView.kt create mode 100644 Paintroid/src/main/res/drawable/ic_pocketpaint_tool_pixel.xml create mode 100644 Paintroid/src/main/res/layout/dialog_pocketpaint_pixel.xml diff --git a/Paintroid/src/androidTest/java/org/catrobat/paintroid/test/espresso/ToolPixelIntegrationTest.kt b/Paintroid/src/androidTest/java/org/catrobat/paintroid/test/espresso/ToolPixelIntegrationTest.kt new file mode 100644 index 0000000000..437ddd320b --- /dev/null +++ b/Paintroid/src/androidTest/java/org/catrobat/paintroid/test/espresso/ToolPixelIntegrationTest.kt @@ -0,0 +1,8 @@ +package org.catrobat.paintroid.test.espresso + +import org.junit.Test + +class ToolPixelIntegrationTest { + @Test + fun check +} \ No newline at end of file diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/controller/ToolController.kt b/Paintroid/src/main/java/org/catrobat/paintroid/controller/ToolController.kt index 57c3ed6d26..1aded7adfd 100644 --- a/Paintroid/src/main/java/org/catrobat/paintroid/controller/ToolController.kt +++ b/Paintroid/src/main/java/org/catrobat/paintroid/controller/ToolController.kt @@ -35,7 +35,8 @@ interface ToolController { ToolType.TRANSFORM, ToolType.IMPORTPNG, ToolType.SHAPE, - ToolType.LINE + ToolType.LINE, + ToolType.PIXEL ) fun setOnColorPickedListener(onColorPickedListener: OnColorPickedListener) diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/tools/ToolType.kt b/Paintroid/src/main/java/org/catrobat/paintroid/tools/ToolType.kt index 0a32cf8088..d25dcb7f9c 100644 --- a/Paintroid/src/main/java/org/catrobat/paintroid/tools/ToolType.kt +++ b/Paintroid/src/main/java/org/catrobat/paintroid/tools/ToolType.kt @@ -214,6 +214,16 @@ enum class ToolType( R.id.pocketpaint_tools_clipping, INVALID_RESOURCE_ID, true + ) + , + PIXEL( + R.string.button_pixel, + R.string.help_content_text, + R.drawable.ic_pocketpaint_tool_pixel, + EnumSet.of(StateChange.ALL), + R.id.pocketpaint_tools_pixel, + INVALID_RESOURCE_ID, + true ); fun shouldReactToStateChange(stateChange: StateChange): Boolean = diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/tools/implementation/DefaultToolFactory.kt b/Paintroid/src/main/java/org/catrobat/paintroid/tools/implementation/DefaultToolFactory.kt index ec89b04ace..4743f691e7 100644 --- a/Paintroid/src/main/java/org/catrobat/paintroid/tools/implementation/DefaultToolFactory.kt +++ b/Paintroid/src/main/java/org/catrobat/paintroid/tools/implementation/DefaultToolFactory.kt @@ -29,14 +29,7 @@ import org.catrobat.paintroid.tools.ToolPaint import org.catrobat.paintroid.tools.ToolType import org.catrobat.paintroid.tools.Workspace import org.catrobat.paintroid.tools.options.ToolOptionsViewController -import org.catrobat.paintroid.ui.tools.DefaultBrushToolOptionsView -import org.catrobat.paintroid.ui.tools.DefaultFillToolOptionsView -import org.catrobat.paintroid.ui.tools.DefaultShapeToolOptionsView -import org.catrobat.paintroid.ui.tools.DefaultSprayToolOptionsView -import org.catrobat.paintroid.ui.tools.DefaultClipboardToolOptionsView -import org.catrobat.paintroid.ui.tools.DefaultTextToolOptionsView -import org.catrobat.paintroid.ui.tools.DefaultTransformToolOptionsView -import org.catrobat.paintroid.ui.tools.DefaultSmudgeToolOptionsView +import org.catrobat.paintroid.ui.tools.* private const val DRAW_TIME_INIT: Long = 30_000_000 @@ -203,6 +196,16 @@ class DefaultToolFactory(mainActivity: MainActivity) : ToolFactory { DRAW_TIME_INIT, mainActivity ) + ToolType.PIXEL ->PixelTool( + DefaultPixelToolOptionsView(toolLayout), + contextCallback, + toolOptionsViewController, + toolPaint, + workspace, + idlingResource, + commandManager, + DRAW_TIME_INIT + ) else -> BrushTool( DefaultBrushToolOptionsView(toolLayout), contextCallback, diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/tools/implementation/PixelTool.kt b/Paintroid/src/main/java/org/catrobat/paintroid/tools/implementation/PixelTool.kt new file mode 100644 index 0000000000..dc0c28dc82 --- /dev/null +++ b/Paintroid/src/main/java/org/catrobat/paintroid/tools/implementation/PixelTool.kt @@ -0,0 +1,58 @@ +package org.catrobat.paintroid.tools.implementation + +import android.content.Context +import android.graphics.Bitmap +import android.graphics.PointF +import android.widget.Toast +import androidx.test.espresso.idling.CountingIdlingResource +import org.catrobat.paintroid.command.CommandManager +import org.catrobat.paintroid.tools.ContextCallback +import org.catrobat.paintroid.tools.ToolPaint +import org.catrobat.paintroid.tools.ToolType +import org.catrobat.paintroid.tools.Workspace +import org.catrobat.paintroid.tools.options.PixelationToolOptionsView +import org.catrobat.paintroid.tools.options.ToolOptionsViewController + +class PixelTool( + pixelToolOptionsView : PixelationToolOptionsView, + contextCallback : ContextCallback, + toolOptionsViewController: ToolOptionsViewController, + toolPaint: ToolPaint, + workspace: Workspace, + idlingResource: CountingIdlingResource, + commandManager: CommandManager, + override var drawTime: Long +) : BaseToolWithRectangleShape(contextCallback, toolOptionsViewController,toolPaint, workspace, idlingResource, commandManager) +{ + private val pixelToolOptionsView: PixelationToolOptionsView + + + init { + rotationEnabled = true + this.pixelToolOptionsView = pixelToolOptionsView + setBitmap(Bitmap.createBitmap(boxWidth.toInt(), boxHeight.toInt(), Bitmap.Config.ARGB_8888)) + toolOptionsViewController.showDelayed() + } + + + override val toolType: ToolType + get() = ToolType.PIXEL + + override fun handleUpAnimations(coordinate: PointF?) { + super.handleUp(coordinate) + } + + override fun handleDownAnimations(coordinate: PointF?) { + super.handleDown(coordinate) + } + + override fun toolPositionCoordinates(coordinate: PointF): PointF = coordinate + + + // is the checkmark to run the programm + override fun onClickOnButton() { + } + + override fun resetInternalState() = Unit + +} \ No newline at end of file diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/tools/options/PixelationToolOptionsView.kt b/Paintroid/src/main/java/org/catrobat/paintroid/tools/options/PixelationToolOptionsView.kt new file mode 100644 index 0000000000..72932d00b6 --- /dev/null +++ b/Paintroid/src/main/java/org/catrobat/paintroid/tools/options/PixelationToolOptionsView.kt @@ -0,0 +1,22 @@ +package org.catrobat.paintroid.tools.options + +import android.view.View + +interface PixelationToolOptionsView { + fun invalidate () + + fun getTopToolOptions(): View + + fun getBottomToolOptions(): View + + fun setPixelPreviewListener(onPixelationPreviewListener: OnPixelationPreviewListener) + + interface OnPixelationPreviewListener{ + val pixelNumWidth : Int + val pixelNumHeight : Int + val pixelNumColours : Int + } +} + + + diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/ui/tools/DefaultPixelToolOptionsView.kt b/Paintroid/src/main/java/org/catrobat/paintroid/ui/tools/DefaultPixelToolOptionsView.kt new file mode 100644 index 0000000000..70d6df43f5 --- /dev/null +++ b/Paintroid/src/main/java/org/catrobat/paintroid/ui/tools/DefaultPixelToolOptionsView.kt @@ -0,0 +1,139 @@ +package org.catrobat.paintroid.ui.tools + +import android.annotation.SuppressLint +import android.text.Editable +import android.text.InputFilter +import android.text.TextWatcher +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.EditText +import android.widget.SeekBar +import android.widget.SeekBar.OnSeekBarChangeListener +import androidx.annotation.VisibleForTesting +import org.catrobat.paintroid.R +import org.catrobat.paintroid.tools.helper.DefaultNumberRangeFilter +import org.catrobat.paintroid.tools.options.PixelationToolOptionsView.OnPixelationPreviewListener +import org.catrobat.paintroid.tools.options.PixelationToolOptionsView +import java.util.* + +@VisibleForTesting +private const val MIN_WIDTH = 1 +private const val MAX_WIDTH = 100 +private const val MIN_HEIGHT = 1 +private const val MAX_HEIGHT = 200 +private const val MIN_COLOR = 1 +private const val MAX_COLOR = 30 + +// ask PO maybe needed the minumum but the bar is not scalable so far (API 21 is current?) + +class DefaultPixelToolOptionsView (rootView : ViewGroup): PixelationToolOptionsView{ + /*private val widthLayout : View + private val heightLayout : View + private val topLayout : View + private val colorLayout : View + private val bottomLayout : View + private var widthText : EditText + private var heightText : EditText + private var colorText : EditText + private var colorSeekBar : SeekBar + private var widthSeekBar : SeekBar + private var heightSeekBar : SeekBar*/ + + //private val thisLayer : Chip + private val currentView = rootView + private val pixelChangedListener : OnPixelationPreviewListener? = null + companion object { + private val TAG = DefaultBrushToolOptionsView::class.java.simpleName + } + + init { + val inflater = LayoutInflater.from(rootView.context) + val pixelView = inflater.inflate(R.layout.dialog_pocketpaint_pixel, rootView, true) + pixelView.apply { + + } + /*initColorText() + initWidthText() + initHeightText()*/ + } + // handle up probs error + + override fun invalidate() { + TODO("Not yet implemented") + } + + override fun getTopToolOptions(): View { + TODO("Not yet implemented") + } //topLayout + + override fun getBottomToolOptions(): View { + TODO("Not yet implemented") + } + + override fun setPixelPreviewListener(onPixelationPreviewListener: PixelationToolOptionsView.OnPixelationPreviewListener) { + TODO("Not yet implemented") + } + /* inner class OnPixelChangedColorSeekBarListener : OnSeekBarChangeListener + { + override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { + if (progress < MIN_COLOR) + { + seekBar.progress = MIN_COLOR + } + if(fromUser) + { + colorText.setText(String.format(Locale.getDefault(), "%d", seekBar.progress)) + } + } + + override fun onStartTrackingTouch(seekBar: SeekBar) = Unit + + override fun onStopTrackingTouch(seekBar: SeekBar) { + colorText.setText(String.format(Locale.getDefault(), "%d", seekBar.progress)) + } + + } + + inner class OnPixelChangedWidthSeekBarListener : OnSeekBarChangeListener + { + override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { + if (progress < MIN_WIDTH) + { + seekBar.progress = MIN_WIDTH + } + if(fromUser) + { + widthText.setText(String.format(Locale.getDefault(), "%d", seekBar.progress)) + } + } + + override fun onStartTrackingTouch(seekBar: SeekBar) = Unit + + override fun onStopTrackingTouch(seekBar: SeekBar) { + widthText.setText(String.format(Locale.getDefault(), "%d", seekBar.progress)) + } + + } + inner class OnPixelChangedHeightSeekBarListener : OnSeekBarChangeListener + { + override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { + if (progress < MIN_HEIGHT) + { + seekBar.progress = MIN_HEIGHT + } + if(fromUser) + { + heightText.setText(String.format(Locale.getDefault(), "%d", seekBar.progress)) + } + } + + override fun onStartTrackingTouch(seekBar: SeekBar) = Unit + + override fun onStopTrackingTouch(seekBar: SeekBar) { + heightText.setText(String.format(Locale.getDefault(), "%d", seekBar.progress)) + } + + }*/ +} \ No newline at end of file diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/ui/zoomwindow/DefaultZoomWindowController.kt b/Paintroid/src/main/java/org/catrobat/paintroid/ui/zoomwindow/DefaultZoomWindowController.kt index ca2cc76f44..8d2e4754a4 100644 --- a/Paintroid/src/main/java/org/catrobat/paintroid/ui/zoomwindow/DefaultZoomWindowController.kt +++ b/Paintroid/src/main/java/org/catrobat/paintroid/ui/zoomwindow/DefaultZoomWindowController.kt @@ -225,7 +225,8 @@ class DefaultZoomWindowController tool?.toolType?.name.equals(ToolType.HAND.name) || tool?.toolType?.name.equals(ToolType.FILL.name) || tool?.toolType?.name.equals(ToolType.CLIPBOARD.name) || - tool?.toolType?.name.equals(ToolType.TRANSFORM.name) + tool?.toolType?.name.equals(ToolType.TRANSFORM.name) || + tool?.toolType?.name.equals(ToolType.PIXEL.name) ) { return Constants.NOT_COMPATIBLE } else if ( diff --git a/Paintroid/src/main/res/drawable/ic_pocketpaint_tool_pixel.xml b/Paintroid/src/main/res/drawable/ic_pocketpaint_tool_pixel.xml new file mode 100644 index 0000000000..886c3171da --- /dev/null +++ b/Paintroid/src/main/res/drawable/ic_pocketpaint_tool_pixel.xml @@ -0,0 +1,9 @@ + + + diff --git a/Paintroid/src/main/res/layout/dialog_pocketpaint_pixel.xml b/Paintroid/src/main/res/layout/dialog_pocketpaint_pixel.xml new file mode 100644 index 0000000000..7a5c5a1c02 --- /dev/null +++ b/Paintroid/src/main/res/layout/dialog_pocketpaint_pixel.xml @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +