From 209c74e99baa1e7b6bf72023d6d13433d490e64a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ensar=20Saraj=C4=8Di=C4=87?= Date: Mon, 17 Jul 2023 13:03:20 +0200 Subject: [PATCH] Clean up widget placement --- .../launcher/views/HomeScreenGrid.kt | 54 ++++++++----------- 1 file changed, 23 insertions(+), 31 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/launcher/views/HomeScreenGrid.kt b/app/src/main/kotlin/com/simplemobiletools/launcher/views/HomeScreenGrid.kt index 0b9fb4c..39c69e7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/launcher/views/HomeScreenGrid.kt +++ b/app/src/main/kotlin/com/simplemobiletools/launcher/views/HomeScreenGrid.kt @@ -29,6 +29,7 @@ import com.simplemobiletools.launcher.helpers.* import com.simplemobiletools.launcher.models.HomeScreenGridItem import kotlinx.android.synthetic.main.activity_main.view.* import kotlin.math.abs +import kotlin.math.floor import kotlin.math.min class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : RelativeLayout(context, attrs, defStyle) { @@ -40,6 +41,8 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel private var cellYCoords = ArrayList(rowCount) var cellWidth = 0 var cellHeight = 0 + private var extraXMargin = 0 + private var extraYMargin = 0 private var iconMargin = (context.resources.getDimension(R.dimen.icon_side_margin) * 5 / columnCount).toInt() private var labelSideMargin = context.resources.getDimension(R.dimen.small_margin).toInt() @@ -112,7 +115,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel } fun resizeGrid(newRowCount: Int, newColumnCount: Int) { - if (columnCount != newColumnCount || rowCount != newRowCount){ + if (columnCount != newColumnCount || rowCount != newRowCount) { rowCount = newRowCount columnCount = newColumnCount cellXCoords = ArrayList(columnCount) @@ -393,7 +396,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel } else { context.homeScreenGridItemsDB.updateItemPosition(widgetItem.left, widgetItem.top, widgetItem.right, widgetItem.bottom, widgetItem.id!!) val widgetView = widgetViews.firstOrNull { it.tag == widgetItem.widgetId } - if (widgetView != null) { + if (widgetView != null && !widgetItem.outOfBounds()) { post { widgetView.x = calculateWidgetX(widgetItem.left) widgetView.y = calculateWidgetY(widgetItem.top) @@ -498,9 +501,9 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel return Size(widgetWidth, widgetHeight) } - private fun calculateWidgetX(leftCell: Int) = leftCell * cellWidth + sideMargins.left.toFloat() + private fun calculateWidgetX(leftCell: Int) = cellXCoords[leftCell] + sideMargins.left.toFloat() + extraXMargin - private fun calculateWidgetY(topCell: Int) = topCell * cellHeight + sideMargins.top.toFloat() + private fun calculateWidgetY(topCell: Int) = cellYCoords[topCell] + sideMargins.top.toFloat() + extraYMargin // convert stuff like 102x192 to grid cells like 0x1 private fun getClosestGridCells(center: Pair): Pair? { @@ -537,16 +540,6 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel fillCellSizes() } - val extraXMargin = if (cellWidth > cellHeight) { - (cellWidth - cellHeight) / 2 - } else { - 0 - } - val extraYMargin = if (cellHeight > cellWidth) { - (cellHeight - cellWidth) / 2 - } else { - 0 - } gridItems.filter { it.drawable != null && it.type == ITEM_TYPE_ICON || it.type == ITEM_TYPE_SHORTCUT }.forEach { item -> if (item.outOfBounds()) { return@forEach @@ -585,7 +578,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel } if (isFirstDraw || redrawWidgets) { - gridItems.filter { it.type == ITEM_TYPE_WIDGET }.forEach { item -> + gridItems.filter { it.type == ITEM_TYPE_WIDGET && !it.outOfBounds() }.forEach { item -> bindWidget(item, isFirstDraw) } redrawWidgets = false @@ -625,10 +618,10 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel val gridCells = getClosestGridCells(center) if (gridCells != null) { val widgetRect = getWidgetOccupiedRect(gridCells) - val leftSide = widgetRect.left * cellWidth + sideMargins.left + iconMargin.toFloat() - val topSide = widgetRect.top * cellHeight + sideMargins.top + iconMargin.toFloat() - val rightSide = leftSide + draggedItem!!.getWidthInCells() * cellWidth - sideMargins.right - iconMargin.toFloat() - val bottomSide = topSide + draggedItem!!.getHeightInCells() * cellHeight - sideMargins.top + val leftSide = calculateWidgetX(widgetRect.left) + val topSide = calculateWidgetY(widgetRect.top) + val rightSide = leftSide + draggedItem!!.getWidthInCells() * cellWidth + val bottomSide = topSide + draggedItem!!.getHeightInCells() * cellHeight canvas.drawRoundRect(leftSide, topSide, rightSide, bottomSide, roundedCornerRadius, roundedCornerRadius, dragShadowCirclePaint) } @@ -655,6 +648,16 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel private fun fillCellSizes() { cellWidth = getFakeWidth() / context.config.homeColumnCount cellHeight = getFakeHeight() / context.config.homeRowCount + extraXMargin = if (cellWidth > cellHeight) { + (cellWidth - cellHeight) / 2 + } else { + 0 + } + extraYMargin = if (cellHeight > cellWidth) { + (cellHeight - cellWidth) / 2 + } else { + 0 + } iconSize = min(cellWidth, cellHeight) - 2 * iconMargin for (i in 0 until context.config.homeColumnCount) { cellXCoords.add(i, i * cellWidth) @@ -689,17 +692,6 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel fillCellSizes() } - val extraXMargin = if (cellWidth > cellHeight) { - (cellWidth - cellHeight) / 2 - } else { - 0 - } - val extraYMargin = if (cellHeight > cellWidth) { - (cellHeight - cellWidth) / 2 - } else { - 0 - } - val clickableLeft = cellXCoords[item.left] + sideMargins.left + extraXMargin val clickableTop = if (item.top == rowCount - 1) { cellYCoords[item.top] + cellHeight - iconSize - iconMargin @@ -711,7 +703,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel // drag the center of the widget, not the top left corner private fun getWidgetOccupiedRect(item: Pair): Rect { - val left = item.first - Math.floor((draggedItem!!.getWidthInCells() - 1) / 2.0).toInt() + val left = item.first - floor((draggedItem!!.getWidthInCells() - 1) / 2.0).toInt() val rect = Rect(left, item.second, left + draggedItem!!.getWidthInCells() - 1, item.second + draggedItem!!.getHeightInCells() - 1) if (rect.left < 0) { rect.right -= rect.left