Apply grid columns settings to grid
This commit is contained in:
parent
b40f96d7b5
commit
d221a6b178
@ -0,0 +1,50 @@
|
||||
package de.mm20.launcher2.ui.base
|
||||
|
||||
import androidx.compose.runtime.*
|
||||
import de.mm20.launcher2.preferences.LauncherDataStore
|
||||
import de.mm20.launcher2.preferences.Settings
|
||||
import de.mm20.launcher2.ui.component.ProvideIconShape
|
||||
import de.mm20.launcher2.ui.locals.LocalCardStyle
|
||||
import de.mm20.launcher2.ui.locals.LocalFavoritesEnabled
|
||||
import de.mm20.launcher2.ui.locals.LocalGridColumns
|
||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||
import kotlinx.coroutines.flow.map
|
||||
import org.koin.androidx.compose.inject
|
||||
|
||||
@Composable
|
||||
fun ProvideSettings(
|
||||
content: @Composable () -> Unit
|
||||
) {
|
||||
val dataStore: LauncherDataStore by inject()
|
||||
|
||||
val cardStyle by remember {
|
||||
dataStore.data.map { it.cards }.distinctUntilChanged()
|
||||
}.collectAsState(
|
||||
Settings.CardSettings.getDefaultInstance()
|
||||
)
|
||||
val iconShape by remember {
|
||||
dataStore.data.map {
|
||||
if (it.easterEgg) Settings.IconSettings.IconShape.EasterEgg
|
||||
else it.icons.shape
|
||||
}.distinctUntilChanged()
|
||||
}.collectAsState(Settings.IconSettings.IconShape.Circle)
|
||||
|
||||
val favoritesEnabled by remember {
|
||||
dataStore.data.map { it.favorites.enabled }.distinctUntilChanged()
|
||||
}.collectAsState(true)
|
||||
|
||||
val gridColumns by remember {
|
||||
dataStore.data.map { it.grid.columnCount }.distinctUntilChanged()
|
||||
}.collectAsState(5)
|
||||
|
||||
CompositionLocalProvider(
|
||||
LocalCardStyle provides cardStyle,
|
||||
LocalFavoritesEnabled provides favoritesEnabled,
|
||||
LocalGridColumns provides gridColumns,
|
||||
) {
|
||||
ProvideIconShape(iconShape) {
|
||||
content()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -3,18 +3,15 @@ package de.mm20.launcher2.ui.launcher.search
|
||||
import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
import android.widget.FrameLayout
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.runtime.CompositionLocalProvider
|
||||
import androidx.compose.runtime.collectAsState
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.wrapContentHeight
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.platform.ComposeView
|
||||
import androidx.compose.ui.unit.dp
|
||||
import de.mm20.launcher2.preferences.LauncherDataStore
|
||||
import de.mm20.launcher2.preferences.Settings
|
||||
import de.mm20.launcher2.ui.MdcLauncherTheme
|
||||
import de.mm20.launcher2.ui.component.ProvideIconShape
|
||||
import de.mm20.launcher2.ui.base.ProvideSettings
|
||||
import de.mm20.launcher2.ui.launcher.search.apps.AppResults
|
||||
import de.mm20.launcher2.ui.launcher.search.calculator.CalculatorResults
|
||||
import de.mm20.launcher2.ui.launcher.search.calendar.CalendarResults
|
||||
@ -24,20 +21,12 @@ import de.mm20.launcher2.ui.launcher.search.files.FileResults
|
||||
import de.mm20.launcher2.ui.launcher.search.unitconverter.UnitConverterResults
|
||||
import de.mm20.launcher2.ui.launcher.search.website.WebsiteResults
|
||||
import de.mm20.launcher2.ui.launcher.search.wikipedia.WikipediaResults
|
||||
import de.mm20.launcher2.ui.locals.LocalCardStyle
|
||||
import de.mm20.launcher2.ui.locals.LocalFavoritesEnabled
|
||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||
import kotlinx.coroutines.flow.map
|
||||
import org.koin.android.ext.android.inject
|
||||
import org.koin.core.component.KoinComponent
|
||||
import org.koin.core.component.inject
|
||||
|
||||
class SearchView @JvmOverloads constructor(
|
||||
context: Context, attrs: AttributeSet? = null
|
||||
) : FrameLayout(context, attrs), KoinComponent {
|
||||
|
||||
private val dataStore: LauncherDataStore by inject()
|
||||
|
||||
init {
|
||||
val view = ComposeView(context)
|
||||
view.layoutParams = LayoutParams(
|
||||
@ -46,43 +35,22 @@ class SearchView @JvmOverloads constructor(
|
||||
)
|
||||
view.setContent {
|
||||
MdcLauncherTheme {
|
||||
val cardStyle by remember {
|
||||
dataStore.data.map { it.cards }.distinctUntilChanged()
|
||||
}.collectAsState(
|
||||
Settings.CardSettings.getDefaultInstance()
|
||||
)
|
||||
val iconShape by remember {
|
||||
dataStore.data.map {
|
||||
if (it.easterEgg) Settings.IconSettings.IconShape.EasterEgg
|
||||
else it.icons.shape
|
||||
}.distinctUntilChanged()
|
||||
}.collectAsState(Settings.IconSettings.IconShape.Circle)
|
||||
|
||||
val favoritesEnabled by remember {
|
||||
dataStore.data.map { it.favorites.enabled }.distinctUntilChanged()
|
||||
}.collectAsState(true)
|
||||
|
||||
CompositionLocalProvider(
|
||||
LocalCardStyle provides cardStyle,
|
||||
LocalFavoritesEnabled provides favoritesEnabled
|
||||
) {
|
||||
ProvideIconShape(iconShape) {
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.wrapContentHeight()
|
||||
.padding(8.dp)
|
||||
) {
|
||||
FavoritesResults()
|
||||
AppResults()
|
||||
UnitConverterResults()
|
||||
CalculatorResults()
|
||||
CalendarResults()
|
||||
ContactResults()
|
||||
WikipediaResults()
|
||||
WebsiteResults()
|
||||
FileResults()
|
||||
}
|
||||
ProvideSettings {
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.wrapContentHeight()
|
||||
.padding(8.dp)
|
||||
) {
|
||||
FavoritesResults()
|
||||
AppResults()
|
||||
UnitConverterResults()
|
||||
CalculatorResults()
|
||||
CalendarResults()
|
||||
ContactResults()
|
||||
WikipediaResults()
|
||||
WebsiteResults()
|
||||
FileResults()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -27,18 +27,21 @@ import de.mm20.launcher2.ui.component.LauncherCard
|
||||
import de.mm20.launcher2.ui.component.ShapedLauncherIcon
|
||||
import de.mm20.launcher2.ui.ktx.toDp
|
||||
import de.mm20.launcher2.ui.launcher.search.apps.AppItemGridPopup
|
||||
import de.mm20.launcher2.ui.locals.LocalGridColumns
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlin.math.ceil
|
||||
|
||||
@Composable
|
||||
fun SearchResultGrid(items: List<Searchable>) {
|
||||
|
||||
val columns = LocalGridColumns.current
|
||||
Column(
|
||||
modifier = Modifier.animateContentSize().fillMaxWidth().padding(4.dp)
|
||||
) {
|
||||
for (i in 0 until ceil(items.size / 5f).toInt()) {
|
||||
for (i in 0 until ceil(items.size / columns.toFloat()).toInt()) {
|
||||
Row {
|
||||
for (j in 0 until 5) {
|
||||
val item = items.getOrNull(i * 5 + j)
|
||||
for (j in 0 until columns) {
|
||||
val item = items.getOrNull(i * columns + j)
|
||||
if (item != null) {
|
||||
GridItem(
|
||||
modifier = Modifier
|
||||
|
||||
@ -7,33 +7,20 @@ import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import android.util.Log
|
||||
import androidx.activity.compose.setContent
|
||||
import androidx.activity.result.ActivityResultLauncher
|
||||
import androidx.activity.result.contract.ActivityResultContracts
|
||||
import androidx.activity.viewModels
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.material3.CircularProgressIndicator
|
||||
import androidx.compose.runtime.CompositionLocalProvider
|
||||
import androidx.compose.runtime.collectAsState
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.livedata.observeAsState
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import de.mm20.launcher2.preferences.LauncherDataStore
|
||||
import de.mm20.launcher2.preferences.Settings
|
||||
import de.mm20.launcher2.ui.MdcLauncherTheme
|
||||
import de.mm20.launcher2.ui.base.BaseActivity
|
||||
import de.mm20.launcher2.ui.component.ProvideIconShape
|
||||
import de.mm20.launcher2.ui.locals.LocalCardStyle
|
||||
import de.mm20.launcher2.ui.locals.LocalFavoritesEnabled
|
||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||
import kotlinx.coroutines.flow.map
|
||||
import org.koin.android.ext.android.inject
|
||||
import de.mm20.launcher2.ui.base.ProvideSettings
|
||||
|
||||
class PickAppWidgetActivity : BaseActivity() {
|
||||
|
||||
private val dataStore: LauncherDataStore by inject()
|
||||
private val viewModel by viewModels<PickAppWidgetVM>()
|
||||
|
||||
private lateinit var widgetHost: AppWidgetHost
|
||||
@ -49,43 +36,25 @@ class PickAppWidgetActivity : BaseActivity() {
|
||||
val selectedAppWidget = viewModel.selectedAppWidget
|
||||
setContent {
|
||||
MdcLauncherTheme {
|
||||
val cardStyle by remember {
|
||||
dataStore.data.map { it.cards }.distinctUntilChanged()
|
||||
}.collectAsState(
|
||||
Settings.CardSettings.getDefaultInstance()
|
||||
)
|
||||
val iconShape by remember {
|
||||
dataStore.data.map {
|
||||
if (it.easterEgg) Settings.IconSettings.IconShape.EasterEgg
|
||||
else it.icons.shape
|
||||
}.distinctUntilChanged()
|
||||
}.collectAsState(Settings.IconSettings.IconShape.Circle)
|
||||
|
||||
val favoritesEnabled by remember {
|
||||
dataStore.data.map { it.favorites.enabled }.distinctUntilChanged()
|
||||
}.collectAsState(true)
|
||||
|
||||
CompositionLocalProvider(
|
||||
LocalCardStyle provides cardStyle,
|
||||
LocalFavoritesEnabled provides favoritesEnabled
|
||||
) {
|
||||
ProvideIconShape(iconShape) {
|
||||
val available by availableWidgets.observeAsState()
|
||||
val selected by selectedAppWidget.observeAsState()
|
||||
val widgets = available
|
||||
if (selected == null) {
|
||||
if (widgets != null) {
|
||||
AppWidgetList(
|
||||
modifier = Modifier.fillMaxSize(),
|
||||
widgets = widgets,
|
||||
onWidgetSelected = {
|
||||
selectAppWidget(it)
|
||||
}
|
||||
)
|
||||
} else {
|
||||
Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
|
||||
CircularProgressIndicator()
|
||||
ProvideSettings {
|
||||
val available by availableWidgets.observeAsState()
|
||||
val selected by selectedAppWidget.observeAsState()
|
||||
val widgets = available
|
||||
if (selected == null) {
|
||||
if (widgets != null) {
|
||||
AppWidgetList(
|
||||
modifier = Modifier.fillMaxSize(),
|
||||
widgets = widgets,
|
||||
onWidgetSelected = {
|
||||
selectAppWidget(it)
|
||||
}
|
||||
)
|
||||
} else {
|
||||
Box(
|
||||
modifier = Modifier.fillMaxSize(),
|
||||
contentAlignment = Alignment.Center
|
||||
) {
|
||||
CircularProgressIndicator()
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -123,15 +92,16 @@ class PickAppWidgetActivity : BaseActivity() {
|
||||
} else {
|
||||
startActivityForResult(
|
||||
Intent(AppWidgetManager.ACTION_APPWIDGET_BIND).apply {
|
||||
putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId)
|
||||
putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, widget.provider)
|
||||
}, RequestCodeBind)
|
||||
putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId)
|
||||
putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, widget.provider)
|
||||
}, RequestCodeBind
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||
super.onActivityResult(requestCode, resultCode, data)
|
||||
when(requestCode) {
|
||||
when (requestCode) {
|
||||
RequestCodeBind -> {
|
||||
if (resultCode == RESULT_OK) {
|
||||
configureWidget()
|
||||
|
||||
@ -3,6 +3,7 @@ package de.mm20.launcher2.ui.locals
|
||||
import android.appwidget.AppWidgetHost
|
||||
import androidx.compose.runtime.compositionLocalOf
|
||||
import androidx.compose.ui.geometry.Size
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.navigation.NavController
|
||||
import de.mm20.launcher2.preferences.Settings
|
||||
|
||||
@ -16,6 +17,8 @@ val LocalCardStyle = compositionLocalOf<Settings.CardSettings> { Settings.CardSe
|
||||
|
||||
val LocalFavoritesEnabled = compositionLocalOf { true }
|
||||
|
||||
val LocalGridColumns = compositionLocalOf { 5 }
|
||||
|
||||
/**
|
||||
* Workaround a bug in Jetpack Compose which incorrectly places popups
|
||||
* that are nested inside other popups.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user