Skip to content

Commit

Permalink
Added the ability to extract projects to their raw dimensions (the us…
Browse files Browse the repository at this point in the history
…er also has the options of extracting to scaled dimensions as well). This closes issue #184 (fix #184).

More changes are needed to be done in future commits to stabilize this feature and improve the user interface.

'Save as' has been transitioned into a single menu item titled 'Export'.

When the user clicks 'Export', a dialog is shown from which the user can input values such as the file's title, the file's type, and the file's resolution (raw or scaled).
  • Loading branch information
therealbluepandabear committed Aug 9, 2022
1 parent bedd7ed commit 9b8888a
Show file tree
Hide file tree
Showing 12 changed files with 350 additions and 78 deletions.
Original file line number Diff line number Diff line change
@@ -1,13 +1,21 @@
package com.therealbluepandabear.pixapencil.activities.canvas.oncreate.menu

import android.graphics.Color
import android.os.Build
import android.util.Log
import android.view.MenuItem
import android.view.ViewGroup
import android.widget.RadioButton
import android.widget.RadioGroup
import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.doOnLayout
import androidx.core.view.doOnPreDraw
import androidx.core.view.marginTop
import com.android.volley.Request
import com.android.volley.toolbox.StringRequest
import com.android.volley.toolbox.Volley
import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.textfield.TextInputLayout
import com.google.gson.Gson
import com.google.gson.JsonParser
import com.therealbluepandabear.pixapencil.R
Expand All @@ -18,10 +26,7 @@ import com.therealbluepandabear.pixapencil.activities.canvas.onoptionsitemselect
import com.therealbluepandabear.pixapencil.activities.canvas.selectedColorPaletteIndex
import com.therealbluepandabear.pixapencil.converters.JsonConverter
import com.therealbluepandabear.pixapencil.database.AppData
import com.therealbluepandabear.pixapencil.enums.BitmapCompressFormat
import com.therealbluepandabear.pixapencil.enums.FlipValue
import com.therealbluepandabear.pixapencil.enums.SnackbarDuration
import com.therealbluepandabear.pixapencil.enums.SymmetryMode
import com.therealbluepandabear.pixapencil.enums.*
import com.therealbluepandabear.pixapencil.extensions.activity
import com.therealbluepandabear.pixapencil.extensions.showDialog
import com.therealbluepandabear.pixapencil.extensions.showSnackbarWithAction
Expand Down Expand Up @@ -64,28 +69,74 @@ fun CanvasActivity.onMenuItemSelected(item: MenuItem): Boolean {
onPixelPerfectOptionsItemSelected()
}

R.id.activityCanvasTopAppMenu_export_to_png_item -> {
binding.activityCanvasPixelGridView.saveAsImage(BitmapCompressFormat.PNG, binding.activityCanvasCoordinatorLayout, projectTitle, viewModel.flipMatrix)
}
R.id.activityCanvasTopAppMenu_export_item -> {
val exportRootLayout: ConstraintLayout =
layoutInflater.inflate(R.layout.export_project_dialog_layout, findViewById(android.R.id.content),false)
as ConstraintLayout

R.id.activityCanvasTopAppMenu_export_to_jpg_item -> {
binding.activityCanvasPixelGridView.saveAsImage(BitmapCompressFormat.JPEG, binding.activityCanvasCoordinatorLayout, projectTitle, viewModel.flipMatrix)
}
exportRootLayout.post {
// We do this so that there is no default top margin, which I personally find it ugly
(exportRootLayout.layoutParams as ViewGroup.MarginLayoutParams).topMargin = 0

R.id.activityCanvasTopAppMenu_export_to_webp_item -> {
if (Build.VERSION.SDK_INT >= 30) {
binding.activityCanvasPixelGridView.saveAsImage(BitmapCompressFormat.WEBP_LOSSLESS, binding.activityCanvasCoordinatorLayout, projectTitle, viewModel.flipMatrix)
} else {
binding.activityCanvasPixelGridView.saveAsImage(BitmapCompressFormat.WEBP, binding.activityCanvasCoordinatorLayout, projectTitle, viewModel.flipMatrix)
exportRootLayout.findViewById<TextInputEditText>(R.id.exportProjectDialogLayout_fileName_textInputEditText).setText(projectTitle)
}
}

R.id.activityCanvasTopAppMenu_export_to_tiff_item -> {
binding.activityCanvasPixelGridView.saveAsImage(BitmapCompressFormat.TIFF, binding.activityCanvasCoordinatorLayout, projectTitle, viewModel.flipMatrix)
}
showDialog(
"Export",
null,
getString(R.string.generic_ok),
{ _, _ ->
val format: BitmapCompressFormat =
when (exportRootLayout.findViewById<RadioGroup>(R.id.exportProjectDialogLayout_radioGroup_fileType).checkedRadioButtonId) {
R.id.exportProjectDialogLayout_radioButton_PNG -> {
BitmapCompressFormat.PNG
}

R.id.exportProjectDialogLayout_radioButton_JPG -> {
BitmapCompressFormat.JPEG
}

R.id.exportProjectDialogLayout_radioButton_WEBP -> {
BitmapCompressFormat.WEBP
}

R.id.activityCanvasTopAppMenu_export_to_bmp_item -> {
binding.activityCanvasPixelGridView.saveAsImage(BitmapCompressFormat.BMP, binding.activityCanvasCoordinatorLayout, projectTitle, viewModel.flipMatrix)
R.id.exportProjectDialogLayout_radioButton_TIF -> {
BitmapCompressFormat.TIFF
}

R.id.exportProjectDialogLayout_radioButton_BMP -> {
BitmapCompressFormat.BMP
}

else -> {
BitmapCompressFormat.PNG
}
}

val resolution: BitmapResolution =
when (exportRootLayout.findViewById<RadioGroup>(R.id.exportProjectDialogLayout_radioGroup_resolutionType).checkedRadioButtonId) {
R.id.exportProjectDialogLayout_radioButton_Raw -> {
BitmapResolution.Raw
}

R.id.exportProjectDialogLayout_radioButton_Scaled -> {
BitmapResolution.Scaled
}

else -> {
BitmapResolution.Raw
}
}

binding.activityCanvasPixelGridView.saveAsImage(
format,
resolution,
binding.activityCanvasCoordinatorLayout,
"Hijk",
viewModel.flipMatrix)
},
getString(R.string.generic_cancel), { _, _ -> },
exportRootLayout)
}

R.id.appMenu_rotate_90_degrees_clockwise_subItem -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,7 @@ import android.view.View
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.view.drawToBitmap
import com.therealbluepandabear.pixapencil.R
import com.therealbluepandabear.pixapencil.enums.BitmapCompressFormat
import com.therealbluepandabear.pixapencil.enums.FlipValue
import com.therealbluepandabear.pixapencil.enums.OutputCode
import com.therealbluepandabear.pixapencil.enums.SnackbarDuration
import com.therealbluepandabear.pixapencil.enums.*
import com.therealbluepandabear.pixapencil.extensions.rotate
import com.therealbluepandabear.pixapencil.extensions.showSimpleInfoDialog
import com.therealbluepandabear.pixapencil.extensions.showSnackbar
Expand All @@ -20,10 +17,20 @@ import java.io.File

lateinit var file: File

fun PixelGridView.extendedSaveAsImage(format: BitmapCompressFormat, coordinatorLayout: CoordinatorLayout, projectTitle: String, flipMatrix: List<FlipValue>) {
fun PixelGridView.extendedSaveAsImage(
format: BitmapCompressFormat,
resolution: BitmapResolution,
coordinatorLayout: CoordinatorLayout,
projectTitle: String,
flipMatrix: List<FlipValue>) {
val formatName = BitmapCompressFormatUtilities.getFormattedName(format)

val bitmap = this.drawToBitmap().rotate((parent as View).rotation.toInt(), flipMatrix)
val bitmap = if (resolution == BitmapResolution.Scaled) {
this.drawToBitmap().rotate((parent as View).rotation.toInt(), flipMatrix)
} else {
pixelGridViewBitmap
}

val fileHelperUtilitiesInstance = FileHelperUtilities.createInstance(context)

fileHelperUtilitiesInstance.saveBitmapAsImage(bitmap, projectTitle,90, format) { outputCode, _file, exceptionMessage_1 ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import android.view.MotionEvent
import android.view.View
import androidx.coordinatorlayout.widget.CoordinatorLayout
import com.therealbluepandabear.pixapencil.enums.BitmapCompressFormat
import com.therealbluepandabear.pixapencil.enums.BitmapResolution
import com.therealbluepandabear.pixapencil.enums.FlipValue
import com.therealbluepandabear.pixapencil.extensions.calculateMatrix
import com.therealbluepandabear.pixapencil.listeners.CanvasFragmentListener
Expand Down Expand Up @@ -116,8 +117,13 @@ class PixelGridView(context: Context, attributeSet: AttributeSet): View(context,
return extendedOnTouchEvent(event)
}

fun saveAsImage(format: BitmapCompressFormat, coordinatorLayout: CoordinatorLayout, projectTitle: String, flipMatrix: List<FlipValue>) {
extendedSaveAsImage(format, coordinatorLayout, projectTitle, flipMatrix)
fun saveAsImage(
format: BitmapCompressFormat,
resolution: BitmapResolution,
coordinatorLayout: CoordinatorLayout,
projectTitle: String,
flipMatrix: List<FlipValue>) {
extendedSaveAsImage(format, resolution, coordinatorLayout, projectTitle, flipMatrix)
}

/** Use this code only in onMeasure **/
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.therealbluepandabear.pixapencil.enums

enum class BitmapResolution {
Raw,
Scaled
}
10 changes: 10 additions & 0 deletions app/src/main/res/drawable/radio_button_selected.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid
android:color="@android:color/holo_blue_dark" />
<stroke
android:width="1dp"
android:color="@android:color/holo_blue_dark" />
</shape>
11 changes: 11 additions & 0 deletions app/src/main/res/drawable/radio_button_unselected.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetRight="-3dp">
<shape android:shape="rectangle">
<solid
android:color="@android:color/transparent" />
<stroke
android:width="3dp"
android:color="@android:color/holo_blue_dark" />
</shape>
</inset>
10 changes: 10 additions & 0 deletions app/src/main/res/drawable/radio_button_unselected_last.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android">
<shape android:shape="rectangle">
<solid
android:color="@android:color/transparent" />
<stroke
android:width="3dp"
android:color="@android:color/holo_blue_dark" />
</shape>
</inset>
7 changes: 7 additions & 0 deletions app/src/main/res/drawable/radiobuttonselector.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/radio_button_selected"
android:state_checked="true" />
<item android:drawable="@drawable/radio_button_unselected" />
</selector>
7 changes: 7 additions & 0 deletions app/src/main/res/drawable/radiobuttonselectorlast.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/radio_button_selected"
android:state_checked="true" />
<item android:drawable="@drawable/radio_button_unselected_last" />
</selector>
5 changes: 5 additions & 0 deletions app/src/main/res/drawable/radiobuttontextselector.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@android:color/holo_blue_dark" android:state_checked="false" />
<item android:color="@color/white" android:state_checked="true" />
</selector>

0 comments on commit 9b8888a

Please sign in to comment.