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.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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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.
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user