mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-02-20 11:18:21 +00:00
The QSB will only be resent on the first screen of the workspace covering the full width of the first row. If will not be movable. The first screen of the workspace will not be movable. The searchDropTargetBar no longer contains the QSB (it can be renamed in aseparate cl). Refactoring all QSB related logic by moving it to a custom view inflated only using xml. Change-Id: Icb4fd6eb855df1af15f685961c38351bf4fd4f4a
102 lines
2.9 KiB
Java
102 lines
2.9 KiB
Java
package com.android.launcher3.util;
|
|
|
|
import android.graphics.Rect;
|
|
|
|
import com.android.launcher3.ItemInfo;
|
|
|
|
/**
|
|
* Utility object to manage the occupancy in a grid.
|
|
*/
|
|
public class GridOccupancy {
|
|
|
|
private final int mCountX;
|
|
private final int mCountY;
|
|
|
|
public final boolean[][] cells;
|
|
|
|
public GridOccupancy(int countX, int countY) {
|
|
mCountX = countX;
|
|
mCountY = countY;
|
|
cells = new boolean[countX][countY];
|
|
}
|
|
|
|
/**
|
|
* Find the first vacant cell, if there is one.
|
|
*
|
|
* @param vacantOut Holds the x and y coordinate of the vacant cell
|
|
* @param spanX Horizontal cell span.
|
|
* @param spanY Vertical cell span.
|
|
*
|
|
* @return true if a vacant cell was found
|
|
*/
|
|
public boolean findVacantCell(int[] vacantOut, int spanX, int spanY) {
|
|
for (int y = 0; (y + spanY) <= mCountY; y++) {
|
|
for (int x = 0; (x + spanX) <= mCountX; x++) {
|
|
boolean available = !cells[x][y];
|
|
out:
|
|
for (int i = x; i < x + spanX; i++) {
|
|
for (int j = y; j < y + spanY; j++) {
|
|
available = available && !cells[i][j];
|
|
if (!available) break out;
|
|
}
|
|
}
|
|
if (available) {
|
|
vacantOut[0] = x;
|
|
vacantOut[1] = y;
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public void copyTo(GridOccupancy dest) {
|
|
for (int i = 0; i < mCountX; i++) {
|
|
for (int j = 0; j < mCountY; j++) {
|
|
dest.cells[i][j] = cells[i][j];
|
|
}
|
|
}
|
|
}
|
|
|
|
public boolean isRegionVacant(int x, int y, int spanX, int spanY) {
|
|
int x2 = x + spanX - 1;
|
|
int y2 = y + spanY - 1;
|
|
if (x < 0 || y < 0 || x2 >= mCountX || y2 >= mCountY) {
|
|
return false;
|
|
}
|
|
for (int i = x; i <= x2; i++) {
|
|
for (int j = y; j <= y2; j++) {
|
|
if (cells[i][j]) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public void markCells(int cellX, int cellY, int spanX, int spanY, boolean value) {
|
|
if (cellX < 0 || cellY < 0) return;
|
|
for (int x = cellX; x < cellX + spanX && x < mCountX; x++) {
|
|
for (int y = cellY; y < cellY + spanY && y < mCountY; y++) {
|
|
cells[x][y] = value;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void markCells(Rect r, boolean value) {
|
|
markCells(r.left, r.top, r.width(), r.height(), value);
|
|
}
|
|
|
|
public void markCells(CellAndSpan cell, boolean value) {
|
|
markCells(cell.cellX, cell.cellY, cell.spanX, cell.spanY, value);
|
|
}
|
|
|
|
public void markCells(ItemInfo item, boolean value) {
|
|
markCells(item.cellX, item.cellY, item.spanX, item.spanY, value);
|
|
}
|
|
|
|
public void clear() {
|
|
markCells(0, 0, mCountX, mCountY, false);
|
|
}
|
|
}
|