Apply grid columns settings to grid

This commit is contained in:
MM20 2022-02-17 20:13:42 +01:00
parent b40f96d7b5
commit d221a6b178
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
5 changed files with 104 additions and 110 deletions

View File

@ -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()
}
}
}

View File

@ -3,18 +3,15 @@ package de.mm20.launcher2.ui.launcher.search
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.FrameLayout import android.widget.FrameLayout
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.Column
import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.runtime.collectAsState import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.getValue import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.unit.dp 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.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.apps.AppResults
import de.mm20.launcher2.ui.launcher.search.calculator.CalculatorResults import de.mm20.launcher2.ui.launcher.search.calculator.CalculatorResults
import de.mm20.launcher2.ui.launcher.search.calendar.CalendarResults 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.unitconverter.UnitConverterResults
import de.mm20.launcher2.ui.launcher.search.website.WebsiteResults import de.mm20.launcher2.ui.launcher.search.website.WebsiteResults
import de.mm20.launcher2.ui.launcher.search.wikipedia.WikipediaResults 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.KoinComponent
import org.koin.core.component.inject
class SearchView @JvmOverloads constructor( class SearchView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null context: Context, attrs: AttributeSet? = null
) : FrameLayout(context, attrs), KoinComponent { ) : FrameLayout(context, attrs), KoinComponent {
private val dataStore: LauncherDataStore by inject()
init { init {
val view = ComposeView(context) val view = ComposeView(context)
view.layoutParams = LayoutParams( view.layoutParams = LayoutParams(
@ -46,27 +35,7 @@ class SearchView @JvmOverloads constructor(
) )
view.setContent { view.setContent {
MdcLauncherTheme { MdcLauncherTheme {
val cardStyle by remember { ProvideSettings {
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( Column(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
@ -86,7 +55,6 @@ class SearchView @JvmOverloads constructor(
} }
} }
} }
}
addView(view) addView(view)
} }
} }

View File

@ -27,18 +27,21 @@ import de.mm20.launcher2.ui.component.LauncherCard
import de.mm20.launcher2.ui.component.ShapedLauncherIcon import de.mm20.launcher2.ui.component.ShapedLauncherIcon
import de.mm20.launcher2.ui.ktx.toDp import de.mm20.launcher2.ui.ktx.toDp
import de.mm20.launcher2.ui.launcher.search.apps.AppItemGridPopup import de.mm20.launcher2.ui.launcher.search.apps.AppItemGridPopup
import de.mm20.launcher2.ui.locals.LocalGridColumns
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlin.math.ceil import kotlin.math.ceil
@Composable @Composable
fun SearchResultGrid(items: List<Searchable>) { fun SearchResultGrid(items: List<Searchable>) {
val columns = LocalGridColumns.current
Column( Column(
modifier = Modifier.animateContentSize().fillMaxWidth().padding(4.dp) 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 { Row {
for (j in 0 until 5) { for (j in 0 until columns) {
val item = items.getOrNull(i * 5 + j) val item = items.getOrNull(i * columns + j)
if (item != null) { if (item != null) {
GridItem( GridItem(
modifier = Modifier modifier = Modifier

View File

@ -7,33 +7,20 @@ import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier 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.MdcLauncherTheme
import de.mm20.launcher2.ui.base.BaseActivity import de.mm20.launcher2.ui.base.BaseActivity
import de.mm20.launcher2.ui.component.ProvideIconShape import de.mm20.launcher2.ui.base.ProvideSettings
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
class PickAppWidgetActivity : BaseActivity() { class PickAppWidgetActivity : BaseActivity() {
private val dataStore: LauncherDataStore by inject()
private val viewModel by viewModels<PickAppWidgetVM>() private val viewModel by viewModels<PickAppWidgetVM>()
private lateinit var widgetHost: AppWidgetHost private lateinit var widgetHost: AppWidgetHost
@ -49,27 +36,7 @@ class PickAppWidgetActivity : BaseActivity() {
val selectedAppWidget = viewModel.selectedAppWidget val selectedAppWidget = viewModel.selectedAppWidget
setContent { setContent {
MdcLauncherTheme { MdcLauncherTheme {
val cardStyle by remember { ProvideSettings {
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 available by availableWidgets.observeAsState()
val selected by selectedAppWidget.observeAsState() val selected by selectedAppWidget.observeAsState()
val widgets = available val widgets = available
@ -83,7 +50,10 @@ class PickAppWidgetActivity : BaseActivity() {
} }
) )
} else { } else {
Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
CircularProgressIndicator() CircularProgressIndicator()
} }
} }
@ -92,7 +62,6 @@ class PickAppWidgetActivity : BaseActivity() {
} }
} }
} }
}
private fun selectAppWidget(widget: AppWidgetProviderInfo) { private fun selectAppWidget(widget: AppWidgetProviderInfo) {
val appWidgetId = widgetHost.allocateAppWidgetId() val appWidgetId = widgetHost.allocateAppWidgetId()
@ -125,7 +94,8 @@ class PickAppWidgetActivity : BaseActivity() {
Intent(AppWidgetManager.ACTION_APPWIDGET_BIND).apply { Intent(AppWidgetManager.ACTION_APPWIDGET_BIND).apply {
putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId)
putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, widget.provider) putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, widget.provider)
}, RequestCodeBind) }, RequestCodeBind
)
} }
} }

View File

@ -3,6 +3,7 @@ package de.mm20.launcher2.ui.locals
import android.appwidget.AppWidgetHost import android.appwidget.AppWidgetHost
import androidx.compose.runtime.compositionLocalOf import androidx.compose.runtime.compositionLocalOf
import androidx.compose.ui.geometry.Size import androidx.compose.ui.geometry.Size
import androidx.compose.ui.platform.LocalContext
import androidx.navigation.NavController import androidx.navigation.NavController
import de.mm20.launcher2.preferences.Settings import de.mm20.launcher2.preferences.Settings
@ -16,6 +17,8 @@ val LocalCardStyle = compositionLocalOf<Settings.CardSettings> { Settings.CardSe
val LocalFavoritesEnabled = compositionLocalOf { true } val LocalFavoritesEnabled = compositionLocalOf { true }
val LocalGridColumns = compositionLocalOf { 5 }
/** /**
* Workaround a bug in Jetpack Compose which incorrectly places popups * Workaround a bug in Jetpack Compose which incorrectly places popups
* that are nested inside other popups. * that are nested inside other popups.