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

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.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

View File

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

View File

@ -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.