Close folder when dragging items outside of it
This commit is contained in:
parent
62a3faf8ea
commit
55ebb2eb15
1 changed files with 37 additions and 6 deletions
|
@ -78,6 +78,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
|
||||||
private var pageChangeIndicatorsAlpha = 0f
|
private var pageChangeIndicatorsAlpha = 0f
|
||||||
|
|
||||||
private var currentlyOpenFolder: HomeScreenGridItem? = null
|
private var currentlyOpenFolder: HomeScreenGridItem? = null
|
||||||
|
private var draggingLeftFolderAt: Long? = null
|
||||||
|
|
||||||
// apply fake margins at the home screen. Real ones would cause the icons be cut at dragging at screen sides
|
// apply fake margins at the home screen. Real ones would cause the icons be cut at dragging at screen sides
|
||||||
var sideMargins = Rect()
|
var sideMargins = Rect()
|
||||||
|
@ -246,6 +247,20 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
currentlyOpenFolder?.also { folder ->
|
||||||
|
if (folder.getFolderRect().contains(x.toFloat(), y.toFloat())) {
|
||||||
|
draggingLeftFolderAt = null
|
||||||
|
} else {
|
||||||
|
draggingLeftFolderAt.also {
|
||||||
|
if (it == null) {
|
||||||
|
draggingLeftFolderAt = System.currentTimeMillis()
|
||||||
|
} else if (System.currentTimeMillis() - it > PAGE_CHANGE_HOLD_THRESHOLD) {
|
||||||
|
closeFolder()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pageChangeIndicatorsAlpha = 1f
|
pageChangeIndicatorsAlpha = 1f
|
||||||
removeCallbacks(startFadingIndicators)
|
removeCallbacks(startFadingIndicators)
|
||||||
if (draggedItemCurrentCoords.first == -1 && draggedItemCurrentCoords.second == -1 && draggedItem != null) {
|
if (draggedItemCurrentCoords.first == -1 && draggedItemCurrentCoords.second == -1 && draggedItem != null) {
|
||||||
|
@ -504,13 +519,18 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
|
||||||
|
|
||||||
private fun addAppIconOrShortcut(draggedHomeGridItem: HomeScreenGridItem?, xIndex: Int, yIndex: Int, newParentId: Long? = null) {
|
private fun addAppIconOrShortcut(draggedHomeGridItem: HomeScreenGridItem?, xIndex: Int, yIndex: Int, newParentId: Long? = null) {
|
||||||
val finalXIndex = if (newParentId != null) {
|
val finalXIndex = if (newParentId != null) {
|
||||||
gridItems.find { it.id == newParentId }?.getFolderItems()?.maxOf { it.left + 1 } ?: 0
|
if (newParentId == draggedHomeGridItem?.parentId) {
|
||||||
|
draggedHomeGridItem.left
|
||||||
} else {
|
} else {
|
||||||
xIndex
|
gridItems.firstOrNull { it.id == newParentId }?.getFolderItems()?.maxOf { it.left + 1 } ?: 0
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
xIndex
|
||||||
|
}
|
||||||
// we are moving an existing home screen item from one place to another
|
// we are moving an existing home screen item from one place to another
|
||||||
if (draggedHomeGridItem != null) {
|
if (draggedHomeGridItem != null) {
|
||||||
draggedHomeGridItem.apply {
|
draggedHomeGridItem.apply {
|
||||||
|
val oldParentId = parentId
|
||||||
left = finalXIndex
|
left = finalXIndex
|
||||||
top = yIndex
|
top = yIndex
|
||||||
right = finalXIndex
|
right = finalXIndex
|
||||||
|
@ -519,8 +539,19 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
|
||||||
docked = yIndex == rowCount - 1
|
docked = yIndex == rowCount - 1
|
||||||
parentId = newParentId
|
parentId = newParentId
|
||||||
|
|
||||||
|
val oldParent = gridItems.firstOrNull { it.id == oldParentId }
|
||||||
|
val deleteOldParent = if (oldParent?.getFolderItems()?.isEmpty() == true) {
|
||||||
|
gridItems.remove(oldParent)
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
ensureBackgroundThread {
|
ensureBackgroundThread {
|
||||||
context.homeScreenGridItemsDB.updateItemPosition(left, top, right, bottom, page, docked, newParentId, id!!)
|
context.homeScreenGridItemsDB.updateItemPosition(left, top, right, bottom, page, docked, newParentId, id!!)
|
||||||
|
if (deleteOldParent && oldParentId != null) {
|
||||||
|
context.homeScreenGridItemsDB.deleteById(oldParentId)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (draggedItem != null) {
|
} else if (draggedItem != null) {
|
||||||
|
@ -1307,12 +1338,12 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel
|
||||||
ceil(count / 2.0f).roundToInt()
|
ceil(count / 2.0f).roundToInt()
|
||||||
}
|
}
|
||||||
val rowsCount = ceil(count.toFloat() / columnsCount).roundToInt()
|
val rowsCount = ceil(count.toFloat() / columnsCount).roundToInt()
|
||||||
val centerX = cellXCoords[left] + cellWidth / 2
|
val centerX = cellXCoords[left] + cellWidth / 2 + sideMargins.left
|
||||||
val centerY = cellYCoords[top] + cellHeight / 2
|
val centerY = cellYCoords[top] + cellHeight / 2 + sideMargins.top
|
||||||
val folderDialogWidth = (columnsCount * cellWidth).toFloat()
|
val folderDialogWidth = (columnsCount * cellWidth).toFloat()
|
||||||
val folderDialogHeight = (rowsCount * cellHeight).toFloat()
|
val folderDialogHeight = (rowsCount * cellHeight).toFloat()
|
||||||
val folderDialogTop = centerY - folderDialogHeight / 2 + sideMargins.top
|
val folderDialogTop = centerY - folderDialogHeight / 2
|
||||||
val folderDialogLeft = centerX - folderDialogWidth / 2 + sideMargins.left
|
val folderDialogLeft = centerX - folderDialogWidth / 2
|
||||||
return RectF(folderDialogLeft, folderDialogTop, folderDialogLeft + folderDialogWidth, folderDialogTop + folderDialogHeight)
|
return RectF(folderDialogLeft, folderDialogTop, folderDialogLeft + folderDialogWidth, folderDialogTop + folderDialogHeight)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue