Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PAINTROID-445 Give feedback of changed canvas when changing tools #1130

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -736,7 +736,7 @@ public void alphaValueIsSetInSliderWhenChangedInSeekBar() {
.onPositiveButton()
.perform(click());
onToolProperties()
.checkMatchesColor(Color.parseColor("#80000000"));
.checkMatchesColor(Color.parseColor("#7F000000"));
IdlingRegistry.getInstance().unregister(idlingResource);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ class ClippingToolIntegrationTest {
.performOpen()
.performClose()

val bitmapColor = workspace.bitmapOfCurrentLayer?.getPixel(middle.x.toInt(), middle.y.toInt())
val bitmapColor = workspace.bitmapOfCurrentLayer?.getPixel(middleTop.x.toInt(), middleTop.y.toInt())
assertEquals(bitmapColor, Color.BLACK)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ import org.catrobat.paintroid.tools.ToolPaint
import org.catrobat.paintroid.tools.ToolReference
import org.catrobat.paintroid.tools.ToolType
import org.catrobat.paintroid.tools.Workspace
import org.catrobat.paintroid.tools.implementation.BaseToolWithShape
import org.catrobat.paintroid.tools.implementation.ClippingTool
import org.catrobat.paintroid.tools.implementation.ImportTool
import org.catrobat.paintroid.tools.implementation.LineTool
Expand All @@ -50,14 +49,6 @@ class DefaultToolController(
private val contextCallback: ContextCallback
) : ToolController {
private lateinit var onColorPickedListener: OnColorPickedListener
private val toolList =
hashSetOf(
ToolType.TEXT,
ToolType.TRANSFORM,
ToolType.IMPORTPNG,
ToolType.SHAPE,
ToolType.LINE
)

override val isDefaultTool: Boolean
get() = toolReference.tool?.toolType == ToolType.BRUSH
Expand Down Expand Up @@ -103,8 +94,8 @@ class DefaultToolController(
this.onColorPickedListener = onColorPickedListener
}

override fun switchTool(toolType: ToolType, backPressed: Boolean) {
switchTool(createAndSetupTool(toolType), backPressed)
override fun switchTool(toolType: ToolType) {
switchTool(createAndSetupTool(toolType))
}

override fun hideToolOptionsView() {
Expand All @@ -125,20 +116,12 @@ class DefaultToolController(
toolReference.tool?.resetInternalState(StateChange.NEW_IMAGE_LOADED)
}

private fun switchTool(tool: Tool, backPressed: Boolean) {
private fun switchTool(tool: Tool) {
val currentTool = toolReference.tool
val currentToolType = currentTool?.toolType
if (toolList.contains(currentToolType)) {
if (!backPressed) {
val toolToApply = currentTool as BaseToolWithShape
toolToApply.onClickOnButton()
}
} else if (currentToolType == ToolType.CLIP) {
adjustClippingTool(backPressed)
}
currentToolType?.let { hidePlusIfShown(it) }

if (currentTool?.toolType == tool.toolType) {
if (currentToolType == tool.toolType) {
val toolBundle = Bundle()
currentTool.onSaveInstanceState(toolBundle)
tool.onRestoreInstanceState(toolBundle)
Expand All @@ -147,7 +130,7 @@ class DefaultToolController(
workspace.invalidate()
}

private fun adjustClippingTool(backPressed: Boolean) {
override fun adjustClippingToolOnBackPressed(backPressed: Boolean) {
val clippingTool = currentTool as ClippingTool
if (backPressed) {
if (clippingTool.areaClosed) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,25 @@ import android.graphics.Bitmap
import org.catrobat.paintroid.colorpicker.OnColorPickedListener
import org.catrobat.paintroid.tools.Tool
import org.catrobat.paintroid.tools.ToolType
import java.util.HashSet

interface ToolController {
val isDefaultTool: Boolean
val toolType: ToolType?
val toolColor: Int?
val currentTool: Tool?
val toolList: HashSet<ToolType>
get() = hashSetOf(
ToolType.TEXT,
ToolType.TRANSFORM,
ToolType.IMPORTPNG,
ToolType.SHAPE,
ToolType.LINE
)

fun setOnColorPickedListener(onColorPickedListener: OnColorPickedListener)

fun switchTool(toolType: ToolType, backPressed: Boolean)
fun switchTool(toolType: ToolType)

fun hideToolOptionsView()

Expand All @@ -54,4 +63,6 @@ interface ToolController {
fun hasToolOptionsView(): Boolean

fun setBitmapFromSource(bitmap: Bitmap?)

fun adjustClippingToolOnBackPressed(backPressed: Boolean)
}
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ class LayerPresenter(
drawingSurface?.refreshDrawingSurface()
getDestinationLayer(position, false)?.let { layer ->
if (model.currentLayer == layer) {
defaultToolController?.switchTool(ToolType.HAND, false)
defaultToolController?.switchTool(ToolType.HAND)
bottomNavigationViewHolder?.showCurrentTool(ToolType.HAND)
}
}
Expand All @@ -205,7 +205,7 @@ class LayerPresenter(
getDestinationLayer(position, true)?.let { layer ->
viewHolder.updateImageView(layer.bitmap)
if (model.currentLayer == layer) {
defaultToolController?.switchTool(ToolType.BRUSH, false)
defaultToolController?.switchTool(ToolType.BRUSH)
bottomNavigationViewHolder?.showCurrentTool(ToolType.BRUSH)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import android.graphics.Color
import android.graphics.Paint
import android.graphics.PointF
import android.net.Uri
import android.os.CountDownTimer
import android.os.Environment
import android.provider.DocumentsContract
import android.provider.MediaStore
Expand Down Expand Up @@ -85,6 +86,9 @@ import org.catrobat.paintroid.model.CommandManagerModel
import org.catrobat.paintroid.tools.Tool
import org.catrobat.paintroid.tools.ToolType
import org.catrobat.paintroid.tools.Workspace
import org.catrobat.paintroid.tools.implementation.BaseToolWithShape
import org.catrobat.paintroid.tools.implementation.CLICK_TIMEOUT_MILLIS
import org.catrobat.paintroid.tools.implementation.CONSTANT_3
import org.catrobat.paintroid.tools.implementation.ClippingTool
import org.catrobat.paintroid.tools.implementation.LineTool
import org.catrobat.paintroid.ui.LayerAdapter
Expand Down Expand Up @@ -112,6 +116,7 @@ open class MainActivityPresenter(
override val context: Context,
private val internalMemoryPath: File
) : MainActivityContracts.Presenter, SaveImageCallback, LoadImageCallback, CreateFileCallback {
private var downTimer: CountDownTimer? = null
private var layerAdapter: LayerAdapter? = null
private var resetPerspectiveAfterNextCommand = false
private var isExport = false
Expand Down Expand Up @@ -420,7 +425,7 @@ open class MainActivityPresenter(
return
}
setTool(ToolType.IMPORTPNG)
toolController.switchTool(ToolType.IMPORTPNG, false)
toolController.switchTool(ToolType.IMPORTPNG)
interactor.loadFile(
this,
LOAD_IMAGE_IMPORT_PNG,
Expand Down Expand Up @@ -532,7 +537,8 @@ open class MainActivityPresenter(
} else if (model.isFullscreen) {
exitFullscreenClicked()
} else if (!toolController.isDefaultTool) {
switchTool(ToolType.BRUSH, true)
if (toolController.currentTool?.toolType == ToolType.CLIP) toolController.adjustClippingToolOnBackPressed(true)
switchTool(ToolType.BRUSH)
} else {
showSecurityQuestionBeforeExit()
}
Expand Down Expand Up @@ -757,21 +763,44 @@ open class MainActivityPresenter(
if (toolController.toolType === toolType && toolController.hasToolOptionsView()) {
toolController.toggleToolOptionsView()
} else {
checkForImplicitToolApplication()
switchTool(toolType)
CodeChamp-SS marked this conversation as resolved.
Show resolved Hide resolved
}
idlingResource.decrement()
}

private fun switchTool(type: ToolType, backPressed: Boolean = false) {
private fun checkForImplicitToolApplication() {
val currentTool = toolController.currentTool
val currentToolType = currentTool?.toolType
if (toolController.toolList.contains(currentToolType)) {
val toolToApply = currentTool as BaseToolWithShape
toolToApply.onClickOnButton()
} else if (currentToolType == ToolType.CLIP) (currentTool as ClippingTool).onClickOnButton()
}

private fun switchTool(type: ToolType) {
navigator.setMaskFilterToNull()
view.hideKeyboard()
setTool(type)
toolController.switchTool(type, backPressed)
if (type === ToolType.IMPORTPNG) {
showImportDialog()
} else if (type == ToolType.CLIP) {
(toolController.currentTool as ClippingTool).copyBitmapOfCurrentLayer()
}
downTimer = object :
CountDownTimer(
if (toolController.toolList.contains(toolController.currentTool?.toolType)) CLICK_TIMEOUT_MILLIS else 0L,
CLICK_TIMEOUT_MILLIS / CONSTANT_3
) {
override fun onTick(millisUntilFinished: Long) {
workspace.invalidate()
}
override fun onFinish() {
downTimer?.cancel()
workspace.invalidate()
setTool(type)
toolController.switchTool(type)
if (type === ToolType.IMPORTPNG) {
showImportDialog()
} else if (type == ToolType.CLIP) {
(toolController.currentTool as ClippingTool).copyBitmapOfCurrentLayer()
}
}
}.start()
}

private fun setTool(toolType: ToolType) {
Expand Down Expand Up @@ -799,7 +828,7 @@ open class MainActivityPresenter(
when (requestCode) {
LOAD_IMAGE_IMPORT_PNG -> {
setTool(ToolType.IMPORTPNG)
toolController.switchTool(ToolType.IMPORTPNG, false)
toolController.switchTool(ToolType.IMPORTPNG)
interactor.loadFile(
this,
LOAD_IMAGE_IMPORT_PNG,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,14 +74,14 @@ private const val DEFAULT_ROTATION_ENABLED = false
private const val DEFAULT_RESIZE_POINTS_VISIBLE = true
private const val DEFAULT_RESPECT_MAXIMUM_BORDER_RATIO = true
private const val DEFAULT_RESPECT_MAXIMUM_BOX_RESOLUTION = false
private const val CLICK_TIMEOUT_MILLIS = 250
internal const val CLICK_TIMEOUT_MILLIS = 250L
private const val RIGHT_ANGLE = 90f
private const val STRAIGHT_ANGLE = 180f
private const val COMPLETE_ANGLE = 360f
private const val SIDES = 4
private const val CONSTANT_1 = 10
private const val CONSTANT_2 = 8
private const val CONSTANT_3 = 3
internal const val CONSTANT_3 = 3
private const val BUNDLE_BOX_WIDTH = "BOX_WIDTH"
private const val BUNDLE_BOX_HEIGHT = "BOX_HEIGHT"
private const val BUNDLE_BOX_ROTATION = "BOX_ROTATION"
Expand Down Expand Up @@ -674,8 +674,8 @@ abstract class BaseToolWithRectangleShape(
fun highlightBox() {
downTimer = object :
CountDownTimer(
CLICK_TIMEOUT_MILLIS.toLong(),
(CLICK_TIMEOUT_MILLIS / CONSTANT_3).toLong()
CLICK_TIMEOUT_MILLIS,
CLICK_TIMEOUT_MILLIS / CONSTANT_3
) {
override fun onTick(millisUntilFinished: Long) {
highlightBoxWhenClickInBox(true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ class LayerAdapter(val presenter: LayerContracts.Presenter) : BaseAdapter(), Lay

override fun setSelected(position: Int, bottomNavigationViewHolder: BottomNavigationViewHolder?, defaultToolController: DefaultToolController?) {
if (!layerPresenter.getLayerItem(position).isVisible) {
defaultToolController?.switchTool(ToolType.HAND, false)
defaultToolController?.switchTool(ToolType.HAND)
bottomNavigationViewHolder?.showCurrentTool(ToolType.HAND)
}
layerBackground.setBackgroundColor(Color.BLUE)
Expand Down
2 changes: 1 addition & 1 deletion colorpicker/src/main/res/values/colors.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
<color name="pocketpaint_color_picker_rgb_red">#FFEB4618</color>
<color name="pocketpaint_color_picker_rgb_green">#FF078707</color>
<color name="pocketpaint_color_picker_rgb_blue">#FF0284e7</color>
<color name="pocketpaint_color_picker_rgb_alpha">#FFCCCCCC</color>
<color name="pocketpaint_color_picker_rgb_alpha">#FF000000</color>

<color name="pocketpaint_color_picker_blue1">#FF0074CD</color>
<color name="pocketpaint_color_picker_blue2">#FF00B4F1</color>
Expand Down