Pager scaffold: add API for non-reversed drawer and top search bar
This commit is contained in:
parent
1d08c7a468
commit
9b7263f01e
@ -86,6 +86,8 @@ fun PagerScaffold(
|
|||||||
darkStatusBarIcons: Boolean = false,
|
darkStatusBarIcons: Boolean = false,
|
||||||
darkNavBarIcons: Boolean = false,
|
darkNavBarIcons: Boolean = false,
|
||||||
reverse: Boolean = false,
|
reverse: Boolean = false,
|
||||||
|
bottomSearchBar: Boolean = true,
|
||||||
|
reverseSearchResults: Boolean = true,
|
||||||
) {
|
) {
|
||||||
val viewModel: LauncherScaffoldVM = viewModel()
|
val viewModel: LauncherScaffoldVM = viewModel()
|
||||||
val searchVM: SearchVM = viewModel()
|
val searchVM: SearchVM = viewModel()
|
||||||
@ -99,24 +101,37 @@ fun PagerScaffold(
|
|||||||
val searchState = rememberLazyListState()
|
val searchState = rememberLazyListState()
|
||||||
val swipeableState = rememberSwipeableState(if (isSearchOpen) Page.Search else Page.Widgets)
|
val swipeableState = rememberSwipeableState(if (isSearchOpen) Page.Search else Page.Widgets)
|
||||||
|
|
||||||
val isSearchAtStart by remember {
|
val isSearchAtBottom by remember {
|
||||||
derivedStateOf {
|
derivedStateOf {
|
||||||
searchState.firstVisibleItemIndex == 0 && searchState.firstVisibleItemScrollOffset == 0
|
if (reverseSearchResults) {
|
||||||
|
searchState.firstVisibleItemIndex == 0 && searchState.firstVisibleItemScrollOffset == 0
|
||||||
|
} else {
|
||||||
|
val lastItem =
|
||||||
|
searchState.layoutInfo.visibleItemsInfo.lastOrNull() ?: return@derivedStateOf true
|
||||||
|
lastItem.offset + lastItem.size <= searchState.layoutInfo.viewportEndOffset - searchState.layoutInfo.afterContentPadding
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val isSearchAtEnd by remember {
|
val isSearchAtTop by remember {
|
||||||
derivedStateOf {
|
if (reverseSearchResults) {
|
||||||
val lastItem =
|
derivedStateOf {
|
||||||
searchState.layoutInfo.visibleItemsInfo.lastOrNull() ?: return@derivedStateOf true
|
val lastItem =
|
||||||
lastItem.offset + lastItem.size <= searchState.layoutInfo.viewportEndOffset - searchState.layoutInfo.afterContentPadding
|
searchState.layoutInfo.visibleItemsInfo.lastOrNull()
|
||||||
|
?: return@derivedStateOf true
|
||||||
|
lastItem.offset + lastItem.size <= searchState.layoutInfo.viewportEndOffset - searchState.layoutInfo.afterContentPadding
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
derivedStateOf {
|
||||||
|
searchState.firstVisibleItemIndex == 0 && searchState.firstVisibleItemScrollOffset == 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val showStatusBarScrim by remember {
|
val showStatusBarScrim by remember {
|
||||||
derivedStateOf {
|
derivedStateOf {
|
||||||
if (isSearchOpen) {
|
if (isSearchOpen) {
|
||||||
!isSearchAtEnd
|
!isSearchAtTop
|
||||||
} else {
|
} else {
|
||||||
widgetsScrollState.value > 0
|
widgetsScrollState.value > 0
|
||||||
}
|
}
|
||||||
@ -128,7 +143,7 @@ fun PagerScaffold(
|
|||||||
val showNavBarScrim by remember {
|
val showNavBarScrim by remember {
|
||||||
derivedStateOf {
|
derivedStateOf {
|
||||||
if (isSearchOpen) {
|
if (isSearchOpen) {
|
||||||
!isSearchAtStart
|
!isSearchAtBottom
|
||||||
} else {
|
} else {
|
||||||
(widgetsScrollState.value > 0 || !fillClockHeight) && widgetsScrollState.value < widgetsScrollState.maxValue
|
(widgetsScrollState.value > 0 || !fillClockHeight) && widgetsScrollState.value < widgetsScrollState.maxValue
|
||||||
}
|
}
|
||||||
@ -324,10 +339,12 @@ fun PagerScaffold(
|
|||||||
) {
|
) {
|
||||||
|
|
||||||
|
|
||||||
val editModePadding by animateDpAsState(if (isWidgetEditMode) 56.dp else 0.dp)
|
val editModePadding by animateDpAsState(if (isWidgetEditMode && bottomSearchBar) 56.dp else 0.dp)
|
||||||
|
|
||||||
val clockPadding by animateDpAsState(
|
val clockPadding by animateDpAsState(
|
||||||
if (isWidgetsScrollZero && fillClockHeight) 64.dp + insets.calculateBottomPadding() else 0.dp
|
if (isWidgetsScrollZero && fillClockHeight)
|
||||||
|
insets.calculateBottomPadding() + if (bottomSearchBar) 64.dp else 0.dp
|
||||||
|
else 0.dp
|
||||||
)
|
)
|
||||||
|
|
||||||
val clockHeight by remember {
|
val clockHeight by remember {
|
||||||
@ -347,8 +364,11 @@ fun PagerScaffold(
|
|||||||
.nestedScroll(nestedScrollConnection)
|
.nestedScroll(nestedScrollConnection)
|
||||||
.verticalScroll(widgetsScrollState)
|
.verticalScroll(widgetsScrollState)
|
||||||
.windowInsetsPadding(WindowInsets.safeDrawing)
|
.windowInsetsPadding(WindowInsets.safeDrawing)
|
||||||
.padding(horizontal = 8.dp)
|
.padding(8.dp)
|
||||||
.padding(top = 8.dp, bottom = 64.dp)
|
.padding(
|
||||||
|
top = if (bottomSearchBar) 0.dp else 56.dp,
|
||||||
|
bottom = if (bottomSearchBar) 56.dp else 0.dp,
|
||||||
|
)
|
||||||
.padding(top = editModePadding)
|
.padding(top = editModePadding)
|
||||||
) {
|
) {
|
||||||
|
|
||||||
@ -378,6 +398,17 @@ fun PagerScaffold(
|
|||||||
if (actions.isEmpty()) 0.dp else 48.dp
|
if (actions.isEmpty()) 0.dp else 48.dp
|
||||||
)
|
)
|
||||||
val windowInsets = WindowInsets.safeDrawing.asPaddingValues()
|
val windowInsets = WindowInsets.safeDrawing.asPaddingValues()
|
||||||
|
val paddingValues = if (bottomSearchBar) {
|
||||||
|
PaddingValues(
|
||||||
|
top = 4.dp + windowInsets.calculateTopPadding(),
|
||||||
|
bottom = 60.dp + webSearchPadding + windowInsets.calculateBottomPadding()
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
PaddingValues(
|
||||||
|
bottom = 4.dp + windowInsets.calculateBottomPadding(),
|
||||||
|
top = 60.dp + webSearchPadding + windowInsets.calculateTopPadding()
|
||||||
|
)
|
||||||
|
}
|
||||||
SearchColumn(
|
SearchColumn(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.requiredWidth(width)
|
.requiredWidth(width)
|
||||||
@ -387,12 +418,9 @@ fun PagerScaffold(
|
|||||||
start = windowInsets.calculateStartPadding(LocalLayoutDirection.current),
|
start = windowInsets.calculateStartPadding(LocalLayoutDirection.current),
|
||||||
end = windowInsets.calculateStartPadding(LocalLayoutDirection.current),
|
end = windowInsets.calculateStartPadding(LocalLayoutDirection.current),
|
||||||
),
|
),
|
||||||
reverse = true,
|
reverse = reverseSearchResults,
|
||||||
state = searchState,
|
state = searchState,
|
||||||
paddingValues = PaddingValues(
|
paddingValues = paddingValues,
|
||||||
top = 4.dp + windowInsets.calculateTopPadding(),
|
|
||||||
bottom = 60.dp + webSearchPadding + windowInsets.calculateBottomPadding()
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -420,7 +448,8 @@ fun PagerScaffold(
|
|||||||
when {
|
when {
|
||||||
swipeableState.direction != 0f -> SearchBarLevel.Raised
|
swipeableState.direction != 0f -> SearchBarLevel.Raised
|
||||||
!isSearchOpen && isWidgetsScrollZero && fillClockHeight -> SearchBarLevel.Resting
|
!isSearchOpen && isWidgetsScrollZero && fillClockHeight -> SearchBarLevel.Resting
|
||||||
isSearchOpen && isSearchAtStart -> SearchBarLevel.Active
|
isSearchOpen && isSearchAtTop && !bottomSearchBar -> SearchBarLevel.Active
|
||||||
|
isSearchOpen && isSearchAtBottom && bottomSearchBar -> SearchBarLevel.Active
|
||||||
else -> SearchBarLevel.Raised
|
else -> SearchBarLevel.Raised
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -429,7 +458,7 @@ fun PagerScaffold(
|
|||||||
val focusSearchBar by viewModel.searchBarFocused.observeAsState(false)
|
val focusSearchBar by viewModel.searchBarFocused.observeAsState(false)
|
||||||
|
|
||||||
val widgetEditModeOffset by animateDpAsState(
|
val widgetEditModeOffset by animateDpAsState(
|
||||||
if (isWidgetEditMode) 128.dp else 0.dp
|
(if (isWidgetEditMode) 128.dp else 0.dp) * (if (bottomSearchBar) 1 else -1)
|
||||||
)
|
)
|
||||||
|
|
||||||
val value by searchVM.searchQuery.observeAsState("")
|
val value by searchVM.searchQuery.observeAsState("")
|
||||||
@ -439,8 +468,8 @@ fun PagerScaffold(
|
|||||||
|
|
||||||
LauncherSearchBar(
|
LauncherSearchBar(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.align(Alignment.BottomCenter)
|
.align(if (bottomSearchBar) Alignment.BottomCenter else Alignment.TopCenter)
|
||||||
.padding(start = 8.dp, end = 8.dp, bottom = 8.dp)
|
.padding(8.dp)
|
||||||
.windowInsetsPadding(WindowInsets.safeDrawing)
|
.windowInsetsPadding(WindowInsets.safeDrawing)
|
||||||
.imePadding()
|
.imePadding()
|
||||||
.offset(y = widgetEditModeOffset),
|
.offset(y = widgetEditModeOffset),
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user