refactor + feat: updated UI and added cards search logic

This commit is contained in:
2026-06-23 15:11:33 +03:00
parent d3c194ce9c
commit 8fe59df6f9
10 changed files with 255 additions and 96 deletions
@@ -107,6 +107,32 @@ fun SelectIconPage(innerPadding: PaddingValues) {
}
}
var queryCleaned = searchQuery.lowercase()
for ((from, to) in SEARCH_REPLACE_SYMBOLS) {
queryCleaned = queryCleaned.replace(from, to)
}
val searchResults = iconsData!!.filter { iconData ->
if (queryCleaned.isEmpty()) {
return@filter true
}
for (name in iconData.names.values) {
var nameCleaned = name.lowercase()
for ((from, to) in SEARCH_REPLACE_SYMBOLS) {
nameCleaned = nameCleaned.replace(from, to)
}
if (nameCleaned.contains(queryCleaned)) {
return@filter true
}
}
return@filter false
}
Page(context.getString(R.string.choosing_icon), innerPadding) {
OutlinedTextField(
value = searchQuery,
@@ -138,67 +164,69 @@ fun SelectIconPage(innerPadding: PaddingValues) {
}
}
} else {
val searchResults = iconsData!!.filter { iconData ->
var queryCleaned = searchQuery.lowercase()
if (queryCleaned.isEmpty()) {
return@filter true
}
for (name in iconData.names.values) {
var nameCleaned = name.lowercase()
for ((from, to) in SEARCH_REPLACE_SYMBOLS) {
nameCleaned = nameCleaned.replace(from, to)
queryCleaned = queryCleaned.replace(from, to)
}
if (nameCleaned.contains(queryCleaned)) {
return@filter true
}
}
return@filter false
}
if (searchResults.isEmpty()) {
item {
Text(stringResource(R.string.icons_not_found))
}
} else {
for (iconData in searchResults) {
for (chunk in searchResults.chunked(2)) {
item {
val loadedIcon = loadedIcons[iconData.iconId]
AdaptiveButton(
modifier = Modifier.fillMaxWidth().height(64.dp),
contentPadding = PaddingValues(0.dp),
onClick = {
if (loadedIcon == null && iconData.iconId != null) {
Toast.makeText(context, context.getString(R.string.wait_for_icon_load), Toast.LENGTH_SHORT).show()
} else {
val intent = Intent()
if (loadedIcon != null) {
intent.putExtra("icon", imageBitmapToBase64(loadedIcon))
}
activityContext!!.setResult(Activity.RESULT_OK, intent)
activityContext.finish()
}
}
Row(
horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
Row(
modifier = Modifier
.fillMaxSize()
.background(Color.Transparent)
.padding(horizontal = 8.dp),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
CardIcon(loadedIcon, MaterialTheme.colorScheme.primary, loadedIcon == null && iconData.iconId != null)
for (iconData in chunk) {
val loadedIcon = loadedIcons[iconData.iconId]
Text(selectItemNameViaLanguage(iconData.names, language))
AdaptiveButton(
modifier = Modifier.weight(1f).height(64.dp),
contentPadding = PaddingValues(0.dp),
onClick = {
if (loadedIcon == null && iconData.iconId != null) {
Toast.makeText(
context,
context.getString(R.string.wait_for_icon_load),
Toast.LENGTH_SHORT
).show()
} else {
val intent = Intent()
if (loadedIcon != null) {
intent.putExtra(
"icon",
imageBitmapToBase64(loadedIcon)
)
}
activityContext!!.setResult(
Activity.RESULT_OK,
intent
)
activityContext.finish()
}
}
) {
Row(
modifier = Modifier
.fillMaxSize()
.background(Color.Transparent)
.padding(horizontal = 8.dp),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
CardIcon(
loadedIcon,
MaterialTheme.colorScheme.primary,
loadedIcon == null && iconData.iconId != null
)
Text(
selectItemNameViaLanguage(
iconData.names,
language
)
)
}
}
}
}
}