From 652d6a2f280094706182013913c3dc2abb1dbd6c Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Tue, 4 Jul 2023 13:46:26 +0800 Subject: [PATCH] Support displaying favorite notes --- .../com/hippo/ehviewer/client/EhEngine.kt | 4 ++-- .../client/data/AbstractGalleryInfo.kt | 1 + .../ehviewer/client/data/BaseGalleryInfo.kt | 2 ++ .../com/hippo/ehviewer/ui/main/GalleryInfo.kt | 18 ++++++++++---- app/src/main/rust/src/parser/list.rs | 24 +++++++++++-------- 5 files changed, 32 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhEngine.kt b/app/src/main/java/com/hippo/ehviewer/client/EhEngine.kt index 82d119c43..d05982543 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhEngine.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/EhEngine.kt @@ -251,8 +251,8 @@ object EhEngine { formBody { add("favcat", catStr) add("favnote", note ?: "") - // submit=Add+to+Favorites is not necessary, just use submit=Apply+Changes all the time - add("submit", "Apply Changes") + // apply=Add+to+Favorites is not necessary, just use apply=Apply+Changes all the time + add("apply", "Apply Changes") add("update", "1") } }.executeAndParsingWith { } diff --git a/app/src/main/java/com/hippo/ehviewer/client/data/AbstractGalleryInfo.kt b/app/src/main/java/com/hippo/ehviewer/client/data/AbstractGalleryInfo.kt index 1db663c99..7337b3125 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/data/AbstractGalleryInfo.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/data/AbstractGalleryInfo.kt @@ -19,4 +19,5 @@ interface AbstractGalleryInfo { var simpleLanguage: String? var favoriteSlot: Int var favoriteName: String? + var favoriteNote: String? } diff --git a/app/src/main/java/com/hippo/ehviewer/client/data/BaseGalleryInfo.kt b/app/src/main/java/com/hippo/ehviewer/client/data/BaseGalleryInfo.kt index ee4d2b199..4106c8460 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/data/BaseGalleryInfo.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/data/BaseGalleryInfo.kt @@ -77,4 +77,6 @@ open class BaseGalleryInfo( @Ignore override var favoriteName: String? = null, + @Ignore + override var favoriteNote: String? = null, ) : GalleryInfo diff --git a/app/src/main/java/com/hippo/ehviewer/ui/main/GalleryInfo.kt b/app/src/main/java/com/hippo/ehviewer/ui/main/GalleryInfo.kt index 69b109459..c689de1e9 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/main/GalleryInfo.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/main/GalleryInfo.kt @@ -26,8 +26,10 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.produceState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp @@ -80,13 +82,13 @@ fun GalleryInfoListItem( style = MaterialTheme.typography.titleSmall, ) ProvideTextStyle(MaterialTheme.typography.labelLarge) { - if (!isInFavScene) { + info.uploader?.let { Text( - text = info.uploader ?: if (info.disowned) "(DISOWNED)" else "", + text = it, modifier = Modifier.constrainAs(uploaderRef) { start.linkTo(parent.start) bottom.linkTo(ratingRef.top) - }, + }.alpha(if (info.disowned) 0.5f else 1f), maxLines = 1, overflow = TextOverflow.Ellipsis, ) @@ -114,7 +116,7 @@ fun GalleryInfoListItem( verticalAlignment = Alignment.CenterVertically, modifier = Modifier.constrainAs(iconsRef) { end.linkTo(parent.end) - bottom.linkTo(if (showFav) favRef.top else postedRef.top) + bottom.linkTo(postedRef.top) }, ) { val download by produceState(false, info.gid) { @@ -141,9 +143,15 @@ fun GalleryInfoListItem( verticalAlignment = Alignment.CenterVertically, modifier = Modifier.constrainAs(favRef) { end.linkTo(parent.end) - bottom.linkTo(postedRef.top) + bottom.linkTo(iconsRef.top) }, ) { + if (isInFavScene) { + Text( + text = info.favoriteNote.orEmpty(), + fontStyle = FontStyle.Italic, + ) + } if (showFav) { Icon( Icons.Default.Favorite, diff --git a/app/src/main/rust/src/parser/list.rs b/app/src/main/rust/src/parser/list.rs index 7dce40438..75b171376 100644 --- a/app/src/main/rust/src/parser/list.rs +++ b/app/src/main/rust/src/parser/list.rs @@ -36,6 +36,7 @@ pub struct BaseGalleryInfo { simpleLanguage: Option, favoriteSlot: i32, favoriteName: Option, + favoriteNote: Option, } fn to_category_i32(category: &str) -> i32 { @@ -104,8 +105,7 @@ fn parse_uploader_and_pages(str: &str) -> (Option, bool, i32) { fn parse_thumb_resolution(str: &str) -> (i32, i32) { let reg = regex!(r"height:(\d+)px;width:(\d+)px"); match reg.captures(str) { - None => panic!("regex err{}", str), - //None => (0, 0), + None => (0, 0), Some(grp) => (grp[1].parse().unwrap(), grp[2].parse().unwrap()), } } @@ -153,15 +153,15 @@ pub fn parseGalleryInfo(env: JNIEnv, _class: JClass, input: JString) -> jobject }, Some(cn) => cn.inner_text(parser), }; - let (posted, favoriteName) = match dom - .get_element_by_id(format!("posted_{gid}").as_str())? - .get(parser) - { + let (posted, favoriteName) = match dom.get_element_by_id(format!("posted_{gid}").as_str()) { None => ("".to_string(), None), - Some(node) => ( - node.inner_text(parser).trim().to_string(), - get_node_attr(node, "title").map(str::to_string), - ), + Some(e) => { + let node = e.get(parser)?; + ( + node.inner_text(parser).trim().to_string(), + get_node_attr(node, "title").map(str::to_string), + ) + } }; let ir = dom .get_first_element_by_class_name("ir")? @@ -174,6 +174,9 @@ pub fn parseGalleryInfo(env: JNIEnv, _class: JClass, input: JString) -> jobject None => (None, false, 0), Some(node) => parse_uploader_and_pages(&node.get(parser)?.inner_html(parser)), }; + let favoriteNote = dom + .get_element_by_id(format!("favnote_{gid}").as_str()) + .map(|e| e.get(parser).unwrap().inner_text(parser).to_string()); Some(BaseGalleryInfo { gid, token, @@ -193,6 +196,7 @@ pub fn parseGalleryInfo(env: JNIEnv, _class: JClass, input: JString) -> jobject simpleLanguage: None, favoriteSlot: if favoriteName.is_some() { 0 } else { -2 }, favoriteName, + favoriteNote, }) }) .unwrap()