Delete out of bounds widgets even when placing other widgets or resizing them
This commit is contained in:
parent
200109e527
commit
9e9d305158
|
@ -245,6 +245,17 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun removeWidget(item: HomeScreenGridItem) {
|
||||||
|
ensureBackgroundThread {
|
||||||
|
removeItemFromHomeScreen(item)
|
||||||
|
post {
|
||||||
|
removeView(widgetViews.firstOrNull { it.tag == item.widgetId })
|
||||||
|
widgetViews.removeIf { it.tag == item.widgetId }
|
||||||
|
}
|
||||||
|
gridItems.removeIf { it.id == item.id }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun removeItemFromHomeScreen(item: HomeScreenGridItem) {
|
private fun removeItemFromHomeScreen(item: HomeScreenGridItem) {
|
||||||
ensureBackgroundThread {
|
ensureBackgroundThread {
|
||||||
if (item.id != null) {
|
if (item.id != null) {
|
||||||
|
@ -381,7 +392,9 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
|
||||||
val viewX = widgetView.x.toInt()
|
val viewX = widgetView.x.toInt()
|
||||||
val viewY = widgetView.y.toInt()
|
val viewY = widgetView.y.toInt()
|
||||||
val frameRect = Rect(viewX, viewY, viewX + widgetView.width, viewY + widgetView.height)
|
val frameRect = Rect(viewX, viewY, viewX + widgetView.width, viewY + widgetView.height)
|
||||||
val otherGridItems = gridItems.filterVisibleOnCurrentPageOnly().filter { it.widgetId != item.widgetId }.toMutableList() as ArrayList<HomeScreenGridItem>
|
val otherGridItems = gridItems.filterVisibleOnCurrentPageOnly()
|
||||||
|
.filter { !it.outOfBounds() }
|
||||||
|
.filter { it.widgetId != item.widgetId }.toMutableList() as ArrayList<HomeScreenGridItem>
|
||||||
binding.resizeFrame.updateFrameCoords(frameRect, cellWidth, cellHeight, sideMargins, item, otherGridItems)
|
binding.resizeFrame.updateFrameCoords(frameRect, cellWidth, cellHeight, sideMargins, item, otherGridItems)
|
||||||
binding.resizeFrame.beVisible()
|
binding.resizeFrame.beVisible()
|
||||||
binding.resizeFrame.z = 1f // make sure the frame isnt behind the widget itself
|
binding.resizeFrame.z = 1f // make sure the frame isnt behind the widget itself
|
||||||
|
@ -399,6 +412,28 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
|
||||||
cellsRect.bottom
|
cellsRect.bottom
|
||||||
}
|
}
|
||||||
updateWidgetPositionAndSize(widgetView, item)
|
updateWidgetPositionAndSize(widgetView, item)
|
||||||
|
|
||||||
|
val widgetTargetCells = ArrayList<Pair<Int, Int>>()
|
||||||
|
for (xCell in item.left..item.right) {
|
||||||
|
for (yCell in item.top..item.bottom) {
|
||||||
|
widgetTargetCells.add(Pair(xCell, yCell))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gridItems.filterVisibleOnCurrentPageOnly().filter { it.id != item.id }.forEach { gridItem ->
|
||||||
|
for (xCell in gridItem.left..gridItem.right) {
|
||||||
|
for (yCell in gridItem.getDockAdjustedTop(rowCount)..gridItem.getDockAdjustedBottom(rowCount)) {
|
||||||
|
val cell = Pair(xCell, yCell)
|
||||||
|
val isAnyCellOccupied = widgetTargetCells.contains(cell)
|
||||||
|
if (isAnyCellOccupied) {
|
||||||
|
if (gridItem.type == ITEM_TYPE_WIDGET && gridItem.outOfBounds()) {
|
||||||
|
removeWidget(gridItem)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ensureBackgroundThread {
|
ensureBackgroundThread {
|
||||||
context.homeScreenGridItemsDB.updateItemPosition(item.left, item.top, item.right, item.bottom, item.page, false, null, item.id!!)
|
context.homeScreenGridItemsDB.updateItemPosition(item.left, item.top, item.right, item.bottom, item.page, false, null, item.id!!)
|
||||||
}
|
}
|
||||||
|
@ -450,7 +485,11 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
|
||||||
val cell = Pair(xCell, yCell)
|
val cell = Pair(xCell, yCell)
|
||||||
val isAnyCellOccupied = wantedCell == cell
|
val isAnyCellOccupied = wantedCell == cell
|
||||||
if (isAnyCellOccupied) {
|
if (isAnyCellOccupied) {
|
||||||
|
if (item.type == ITEM_TYPE_WIDGET && item.outOfBounds()) {
|
||||||
|
removeWidget(item)
|
||||||
|
} else {
|
||||||
isDroppingPositionValid = false
|
isDroppingPositionValid = false
|
||||||
|
}
|
||||||
return@forEach
|
return@forEach
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -533,14 +572,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
|
||||||
potentialParent = item
|
potentialParent = item
|
||||||
} else {
|
} else {
|
||||||
if (item.type == ITEM_TYPE_WIDGET && item.outOfBounds()) {
|
if (item.type == ITEM_TYPE_WIDGET && item.outOfBounds()) {
|
||||||
ensureBackgroundThread {
|
removeWidget(item)
|
||||||
removeItemFromHomeScreen(item)
|
|
||||||
post {
|
|
||||||
removeView(widgetViews.firstOrNull { it.tag == item.widgetId })
|
|
||||||
widgetViews.removeIf { it.tag == item.widgetId }
|
|
||||||
}
|
|
||||||
gridItems.removeIf { it.id == item.id }
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
isDroppingPositionValid = false
|
isDroppingPositionValid = false
|
||||||
}
|
}
|
||||||
|
@ -771,12 +803,16 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
|
||||||
val cell = Pair(xCell, yCell)
|
val cell = Pair(xCell, yCell)
|
||||||
val isAnyCellOccupied = widgetTargetCells.contains(cell)
|
val isAnyCellOccupied = widgetTargetCells.contains(cell)
|
||||||
if (isAnyCellOccupied) {
|
if (isAnyCellOccupied) {
|
||||||
|
if (item.type == ITEM_TYPE_WIDGET && item.outOfBounds()) {
|
||||||
|
removeWidget(item)
|
||||||
|
} else {
|
||||||
areAllCellsEmpty = false
|
areAllCellsEmpty = false
|
||||||
return@forEach
|
return@forEach
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (areAllCellsEmpty) {
|
if (areAllCellsEmpty) {
|
||||||
val widgetItem = draggedItem!!.copy()
|
val widgetItem = draggedItem!!.copy()
|
||||||
|
|
Loading…
Reference in New Issue