This commit is contained in:
tom5079
2021-12-26 15:10:02 +09:00
parent d80de6fde7
commit cd4be5898b
11 changed files with 108 additions and 184 deletions

View File

@@ -136,7 +136,7 @@ dependencies {
implementation("ru.noties.markwon:core:3.1.0") implementation("ru.noties.markwon:core:3.1.0")
implementation("xyz.quaver:documentfilex:0.7.1") implementation("xyz.quaver:documentfilex:0.7.1")
implementation("xyz.quaver:subsampledimage:0.0.1-alpha17-SNAPSHOT") implementation("xyz.quaver:subsampledimage:0.0.1-alpha18-SNAPSHOT")
implementation("com.google.guava:guava:31.0.1-jre") implementation("com.google.guava:guava:31.0.1-jre")

View File

@@ -280,10 +280,9 @@ val ReaderOptions.Orientation.isReverse: Boolean
this == ReaderOptions.Orientation.VERTICAL_UP || this == ReaderOptions.Orientation.VERTICAL_UP ||
this == ReaderOptions.Orientation.HORIZONTAL_LEFT this == ReaderOptions.Orientation.HORIZONTAL_LEFT
@ExperimentalMaterialApi
@Composable @Composable
fun ReaderOptionsSheet(readerOptions: ReaderOptions, onOptionsChange: (ReaderOptions.Builder.() -> Unit) -> Unit) { fun ReaderOptionsSheet(readerOptions: ReaderOptions, onOptionsChange: (ReaderOptions.Builder.() -> Unit) -> Unit) {
CompositionLocalProvider(LocalTextStyle provides MaterialTheme.typography.h6, LocalMinimumTouchTargetEnforcement provides false) { CompositionLocalProvider(LocalTextStyle provides MaterialTheme.typography.h6) {
Column(Modifier.padding(16.dp, 0.dp)) { Column(Modifier.padding(16.dp, 0.dp)) {
val layout = readerOptions.layout val layout = readerOptions.layout
val snap = readerOptions.snap val snap = readerOptions.snap
@@ -303,20 +302,18 @@ fun ReaderOptionsSheet(readerOptions: ReaderOptions, onOptionsChange: (ReaderOpt
ReaderOptions.Layout.DOUBLE_PAGE to DoubleImage, ReaderOptions.Layout.DOUBLE_PAGE to DoubleImage,
ReaderOptions.Layout.AUTO to Icons.Default.AutoFixHigh ReaderOptions.Layout.AUTO to Icons.Default.AutoFixHigh
).forEach { (option, icon) -> ).forEach { (option, icon) ->
CompositionLocalProvider(LocalMinimumTouchTargetEnforcement provides true) { IconButton(onClick = {
IconButton(onClick = { onOptionsChange {
onOptionsChange { setLayout(option)
setLayout(option)
}
}) {
Icon(
icon,
contentDescription = null,
tint =
if (layout == option) MaterialTheme.colors.secondary
else LocalContentColor.current
)
} }
}) {
Icon(
icon,
contentDescription = null,
tint =
if (layout == option) MaterialTheme.colors.secondary
else LocalContentColor.current
)
} }
} }
} }

View File

@@ -36,7 +36,6 @@ import org.kodein.di.compose.rememberInstance
import xyz.quaver.pupil.sources.Source import xyz.quaver.pupil.sources.Source
import xyz.quaver.pupil.sources.SourceEntries import xyz.quaver.pupil.sources.SourceEntries
@ExperimentalMaterialApi
@Composable @Composable
fun SourceSelectDialog(navController: NavController, currentSource: String? = null, onDismissRequest: () -> Unit = { }) { fun SourceSelectDialog(navController: NavController, currentSource: String? = null, onDismissRequest: () -> Unit = { }) {
SourceSelectDialog(currentSource = currentSource, onDismissRequest = onDismissRequest) { SourceSelectDialog(currentSource = currentSource, onDismissRequest = onDismissRequest) {
@@ -47,46 +46,42 @@ fun SourceSelectDialog(navController: NavController, currentSource: String? = nu
} }
} }
@ExperimentalMaterialApi
@Composable @Composable
fun SourceSelectDialogItem(source: Source, isSelected: Boolean, onSelected: (Source) -> Unit = { }) { fun SourceSelectDialogItem(source: Source, isSelected: Boolean, onSelected: (Source) -> Unit = { }) {
CompositionLocalProvider(LocalMinimumTouchTargetEnforcement provides false) { Row(
Row( modifier = Modifier.padding(16.dp),
modifier = Modifier.padding(16.dp), verticalAlignment = Alignment.CenterVertically,
verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(16.dp)
horizontalArrangement = Arrangement.spacedBy(16.dp) ) {
) { Image(
Image( painter = painterResource(source.iconResID),
painter = painterResource(source.iconResID), contentDescription = null,
contentDescription = null, modifier = Modifier.size(24.dp)
modifier = Modifier.size(24.dp) )
)
Text( Text(
source.name, source.name,
modifier = Modifier.weight(1f) modifier = Modifier.weight(1f)
) )
Icon( Icon(
Icons.Default.Settings, Icons.Default.Settings,
contentDescription = null, contentDescription = null,
tint = MaterialTheme.colors.onSurface.copy(alpha = 0.5f) tint = MaterialTheme.colors.onSurface.copy(alpha = 0.5f)
) )
Button( Button(
enabled = !isSelected, enabled = !isSelected,
onClick = { onClick = {
onSelected(source) onSelected(source)
}
) {
Text("GO")
} }
) {
Text("GO")
} }
} }
} }
@ExperimentalMaterialApi
@Composable @Composable
fun SourceSelectDialog(currentSource: String? = null, onDismissRequest: () -> Unit = { }, onSelected: (Source) -> Unit = { }) { fun SourceSelectDialog(currentSource: String? = null, onDismissRequest: () -> Unit = { }, onSelected: (Source) -> Unit = { }) {
val sourceEntries: SourceEntries by rememberInstance() val sourceEntries: SourceEntries by rememberInstance()

View File

@@ -217,33 +217,31 @@ fun TagGroup(
val bookmarkedTagsInList = bookmarks intersect tags.toSet() val bookmarkedTagsInList = bookmarks intersect tags.toSet()
CompositionLocalProvider(LocalMinimumTouchTargetEnforcement provides false) { FlowRow(Modifier.padding(0.dp, 16.dp)) {
FlowRow(Modifier.padding(0.dp, 16.dp)) { tags.sortedBy { if (bookmarkedTagsInList.contains(it)) 0 else 1 }
tags.sortedBy { if (bookmarkedTagsInList.contains(it)) 0 else 1 } .let { (if (isFolded) it.take(10) else it) }.forEach { tag ->
.let { (if (isFolded) it.take(10) else it) }.forEach { tag -> TagChip(
TagChip( tag = tag,
tag = tag, isFavorite = bookmarkedTagsInList.contains(tag),
isFavorite = bookmarkedTagsInList.contains(tag), onFavoriteClick = onBookmarkToggle
onFavoriteClick = onBookmarkToggle )
}
if (isFolded && tags.size > 10)
Surface(
modifier = Modifier.padding(2.dp),
color = MaterialTheme.colors.background,
shape = RoundedCornerShape(16.dp),
elevation = 2.dp,
onClick = { isFolded = false }
) {
Text(
"",
modifier = Modifier.padding(16.dp, 8.dp),
color = MaterialTheme.colors.onBackground,
style = MaterialTheme.typography.body2
) )
} }
if (isFolded && tags.size > 10)
Surface(
modifier = Modifier.padding(2.dp),
color = MaterialTheme.colors.background,
shape = RoundedCornerShape(16.dp),
elevation = 2.dp,
onClick = { isFolded = false }
) {
Text(
"",
modifier = Modifier.padding(16.dp, 8.dp),
color = MaterialTheme.colors.onBackground,
style = MaterialTheme.typography.body2
)
}
}
} }
} }

View File

@@ -18,80 +18,30 @@
package xyz.quaver.pupil.sources.manatoki package xyz.quaver.pupil.sources.manatoki
import android.app.Application import android.app.Application
import androidx.activity.compose.BackHandler
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.animation.core.animateDpAsState import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.animation.scaleIn import androidx.compose.foundation.layout.Column
import androidx.compose.animation.scaleOut import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.* import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.gestures.animateScrollBy import androidx.compose.material.Button
import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.material.Text
import androidx.compose.foundation.interaction.PressInteraction
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.*
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.onFocusChanged
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
import androidx.compose.ui.input.nestedscroll.NestedScrollSource
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavController import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.navigation import androidx.navigation.navigation
import com.google.accompanist.flowlayout.FlowRow
import com.google.accompanist.insets.LocalWindowInsets
import com.google.accompanist.insets.navigationBarsPadding
import com.google.accompanist.insets.navigationBarsWithImePadding
import com.google.accompanist.insets.rememberInsetsPaddingValues
import com.google.accompanist.insets.ui.Scaffold
import com.google.accompanist.insets.ui.TopAppBar
import io.ktor.client.*
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import org.kodein.di.DIAware import org.kodein.di.DIAware
import org.kodein.di.android.closestDI import org.kodein.di.android.closestDI
import org.kodein.di.compose.rememberInstance
import org.kodein.di.instance
import org.kodein.log.LoggerFactory import org.kodein.log.LoggerFactory
import org.kodein.log.newLogger import org.kodein.log.newLogger
import xyz.quaver.pupil.R import xyz.quaver.pupil.R
import xyz.quaver.pupil.db.AppDatabase
import xyz.quaver.pupil.proto.settingsDataStore
import xyz.quaver.pupil.sources.Source import xyz.quaver.pupil.sources.Source
import xyz.quaver.pupil.sources.composable.* import xyz.quaver.pupil.sources.manatoki.composable.Main
import xyz.quaver.pupil.sources.manatoki.composable.* import xyz.quaver.pupil.sources.manatoki.composable.Reader
import xyz.quaver.pupil.sources.manatoki.viewmodel.* import xyz.quaver.pupil.sources.manatoki.composable.Recent
import xyz.quaver.pupil.ui.theme.Orange500 import xyz.quaver.pupil.sources.manatoki.composable.Search
import kotlin.math.max
import kotlin.math.sign
@OptIn( @OptIn(
ExperimentalMaterialApi::class, ExperimentalMaterialApi::class,

View File

@@ -18,6 +18,7 @@
package xyz.quaver.pupil.sources.manatoki.composable package xyz.quaver.pupil.sources.manatoki.composable
import android.util.Log
import androidx.activity.compose.BackHandler import androidx.activity.compose.BackHandler
import androidx.compose.foundation.* import androidx.compose.foundation.*
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
@@ -47,6 +48,7 @@ import com.google.accompanist.insets.rememberInsetsPaddingValues
import com.google.accompanist.insets.ui.Scaffold import com.google.accompanist.insets.ui.Scaffold
import com.google.accompanist.insets.ui.TopAppBar import com.google.accompanist.insets.ui.TopAppBar
import io.ktor.client.* import io.ktor.client.*
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.kodein.di.compose.rememberInstance import org.kodein.di.compose.rememberInstance
import xyz.quaver.pupil.R import xyz.quaver.pupil.R

View File

@@ -18,6 +18,7 @@
package xyz.quaver.pupil.sources.manatoki.composable package xyz.quaver.pupil.sources.manatoki.composable
import android.util.Log
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
@@ -38,6 +39,7 @@ import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.SubcomposeLayout import androidx.compose.ui.layout.SubcomposeLayout
import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.layout.positionInWindow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.toSize import androidx.compose.ui.unit.toSize
import coil.compose.rememberImagePainter import coil.compose.rememberImagePainter
@@ -98,6 +100,7 @@ fun MangaListingBottomSheetLayout(
} }
} }
@ExperimentalMaterialApi
@Composable @Composable
fun MangaListingBottomSheet( fun MangaListingBottomSheet(
mangaListing: MangaListing? = null, mangaListing: MangaListing? = null,
@@ -138,16 +141,17 @@ fun MangaListingBottomSheet(
) { ) {
val painter = rememberImagePainter(mangaListing.thumbnail) val painter = rememberImagePainter(mangaListing.thumbnail)
Image( Box(Modifier.fillMaxHeight()) {
modifier = Modifier Image(
.width(150.dp) modifier = Modifier
.aspectRatio( .width(150.dp)
with(painter.intrinsicSize) { if (this == Size.Unspecified) 1f else width / height }, .aspectRatio(
true with(painter.intrinsicSize) { if (this == Size.Unspecified) 1f else width / height }
), ).align(Alignment.Center),
painter = painter, painter = painter,
contentDescription = null contentDescription = null
) )
}
Column( Column(
modifier = Modifier modifier = Modifier
@@ -205,7 +209,7 @@ fun MangaListingBottomSheet(
state = listState, state = listState,
contentPadding = rememberInsetsPaddingValues(LocalWindowInsets.current.navigationBars) contentPadding = rememberInsetsPaddingValues(LocalWindowInsets.current.navigationBars)
) { ) {
itemsIndexed(mangaListing.entries, key = { _, entry -> entry.itemID }) { index, entry -> itemsIndexed(mangaListing.entries) { index, entry ->
Row( Row(
modifier = Modifier modifier = Modifier
.clickable { .clickable {

View File

@@ -21,8 +21,7 @@ package xyz.quaver.pupil.sources.manatoki.composable
import androidx.activity.compose.BackHandler import androidx.activity.compose.BackHandler
import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.animation.scaleIn import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.animation.scaleOut
import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.gestures.animateScrollBy import androidx.compose.foundation.gestures.animateScrollBy
@@ -43,6 +42,7 @@ import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.scale
import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Size import androidx.compose.ui.geometry.Size
import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalDensity
@@ -203,13 +203,11 @@ fun Reader(navController: NavController) {
) )
}, },
floatingActionButton = { floatingActionButton = {
AnimatedVisibility( val scale by animateFloatAsState(if (model.fullscreen || scrollDirection < 0f) 0f else 1f)
!(model.fullscreen || scrollDirection < 0f),
enter = scaleIn(), if (scale > 0f)
exit = scaleOut()
) {
FloatingActionButton( FloatingActionButton(
modifier = Modifier.navigationBarsPadding(), modifier = Modifier.navigationBarsPadding().scale(scale),
onClick = { onClick = {
readerInfo?.let { readerInfo?.let {
coroutineScope.launch { coroutineScope.launch {
@@ -271,7 +269,6 @@ fun Reader(navController: NavController) {
contentDescription = null contentDescription = null
) )
} }
}
} }
) { contentPadding -> ) { contentPadding ->
ReaderBase( ReaderBase(

View File

@@ -212,25 +212,7 @@ fun Search(navController: NavController) {
}.take(20) }.take(20)
Text("작가") Text("작가")
ExposedDropdownMenuBox(expanded = expanded, onExpandedChange = { expanded = !expanded }) { TextField(model.artist, onValueChange = { model.artist = it })
TextField(
model.artist,
onValueChange = { model.artist = it },
trailingIcon = {
ExposedDropdownMenuDefaults.TrailingIcon(
expanded = expanded
)
}
)
ExposedDropdownMenu(expanded, onDismissRequest = { expanded = false }) {
suggestedArtists.forEach {
DropdownMenuItem(onClick = { model.artist = it; expanded = false }) {
Text(it)
}
}
}
}
Text("발행") Text("발행")
FlowRow(mainAxisSpacing = 4.dp, crossAxisSpacing = 4.dp) { FlowRow(mainAxisSpacing = 4.dp, crossAxisSpacing = 4.dp) {

View File

@@ -19,6 +19,7 @@
package xyz.quaver.pupil.sources.manatoki package xyz.quaver.pupil.sources.manatoki
import android.os.Parcelable import android.os.Parcelable
import android.util.Log
import androidx.collection.LruCache import androidx.collection.LruCache
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
@@ -90,15 +91,13 @@ data class ReaderInfo(
@ExperimentalMaterialApi @ExperimentalMaterialApi
@Composable @Composable
fun Chip(text: String, selected: Boolean = false, onClick: () -> Unit = { }) { fun Chip(text: String, selected: Boolean = false, onClick: () -> Unit = { }) {
CompositionLocalProvider(LocalMinimumTouchTargetEnforcement provides false) { Card(
Card( onClick = onClick,
onClick = onClick, backgroundColor = if (selected) MaterialTheme.colors.secondary else MaterialTheme.colors.surface,
backgroundColor = if (selected) MaterialTheme.colors.secondary else MaterialTheme.colors.surface, shape = RoundedCornerShape(8.dp),
shape = RoundedCornerShape(8.dp), elevation = 4.dp
elevation = 4.dp ) {
) { Text(text, modifier = Modifier.padding(4.dp))
Text(text, modifier = Modifier.padding(4.dp))
}
} }
} }

View File

@@ -20,10 +20,10 @@ const val GROUP_ID = "xyz.quaver"
const val VERSION = "6.0.0-alpha01" const val VERSION = "6.0.0-alpha01"
object Versions { object Versions {
const val KOTLIN_VERSION = "1.6.0" const val KOTLIN_VERSION = "1.5.31"
const val JETPACK_COMPOSE = "1.1.0-rc01" const val JETPACK_COMPOSE = "1.0.5"
const val ACCOMPANIST = "0.22.0-rc" const val ACCOMPANIST = "0.20.3"
} }
object JetpackCompose { object JetpackCompose {