From 29505aa4ef780b8474620ca676408cf227f7d539 Mon Sep 17 00:00:00 2001 From: HapeLee <63206378+HapeLee@users.noreply.github.com> Date: Tue, 28 Apr 2026 12:46:20 +0800 Subject: [PATCH] =?UTF-8?q?[=E4=BC=98=E5=8C=96]=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/ui/about/AboutScreen.kt | 2 +- .../app/ui/book/bookmark/AllBookmarkScreen.kt | 6 +- .../cache/manage/BookCacheManageScreen.kt | 4 +- .../app/ui/book/explore/ExploreShowScreen.kt | 4 +- .../ui/book/import/local/ImportBookScreen.kt | 2 +- .../ui/book/import/remote/RemoteBookScreen.kt | 5 +- .../legado/app/ui/book/info/BookInfoScreen.kt | 7 +- .../ui/book/info/edit/BookInfoEditScreen.kt | 6 +- .../ui/book/manage/BookshelfManageScreen.kt | 2 +- .../ui/book/readRecord/ReadRecordScreen.kt | 2 +- .../legado/app/ui/book/search/SearchScreen.kt | 10 +- .../book/searchContent/SearchContentScreen.kt | 4 +- .../legado/app/ui/config/ConfigNavScreen.kt | 2 +- .../config/backupConfig/BackupConfigScreen.kt | 2 +- .../config/coverConfig/CoverConfigScreen.kt | 2 +- .../config/otherConfig/OtherConfigScreen.kt | 2 +- .../ui/config/readConfig/ReadConfigScreen.kt | 2 +- .../config/themeConfig/ThemeConfigScreen.kt | 2 +- .../app/ui/main/bookshelf/BookshelfScreen.kt | 2 +- .../app/ui/main/explore/ExploreScreen.kt | 2 - .../io/legado/app/ui/main/rss/RssScreen.kt | 2 +- .../app/ui/replace/edit/ReplaceEditScreen.kt | 7 +- .../app/ui/rss/article/RssSortScreen.kt | 4 +- .../app/ui/rss/read/RssReadRouteScreen.kt | 4 +- .../widget/components/alert/AppAlertDialog.kt | 31 +- .../widget/components/button/AlertButton.kt | 30 -- .../button/AnimatedActionButtonCore.kt | 74 +++++ .../widget/components/button/AnimatedIcon.kt | 33 ++ .../ui/widget/components/button/AppButton.kt | 66 ++++ .../widget/components/button/AppIconButton.kt | 8 +- .../button/ConfirmDismissButtonsRow.kt | 68 ---- .../components/button/MediumIconButton.kt | 312 ++++++------------ .../components/button/MediumTextButton.kt | 66 ++++ .../widget/components/button/MiuixButton.kt | 98 ------ .../components/button/SmallIconButton.kt | 203 ++++++------ .../ui/widget/components/button/ToggleChip.kt | 24 +- .../widget/components/button/TopBarButton.kt | 304 ----------------- .../components/topbar/DynamicTopAppBar.kt | 4 +- .../widget/components/topbar/TopBarButton.kt | 250 ++++++++++++++ 39 files changed, 774 insertions(+), 884 deletions(-) delete mode 100644 app/src/main/java/io/legado/app/ui/widget/components/button/AlertButton.kt create mode 100644 app/src/main/java/io/legado/app/ui/widget/components/button/AnimatedActionButtonCore.kt create mode 100644 app/src/main/java/io/legado/app/ui/widget/components/button/AnimatedIcon.kt create mode 100644 app/src/main/java/io/legado/app/ui/widget/components/button/AppButton.kt create mode 100644 app/src/main/java/io/legado/app/ui/widget/components/button/MediumTextButton.kt delete mode 100644 app/src/main/java/io/legado/app/ui/widget/components/button/MiuixButton.kt delete mode 100644 app/src/main/java/io/legado/app/ui/widget/components/button/TopBarButton.kt create mode 100644 app/src/main/java/io/legado/app/ui/widget/components/topbar/TopBarButton.kt diff --git a/app/src/main/java/io/legado/app/ui/about/AboutScreen.kt b/app/src/main/java/io/legado/app/ui/about/AboutScreen.kt index a42371134..e45a6156a 100644 --- a/app/src/main/java/io/legado/app/ui/about/AboutScreen.kt +++ b/app/src/main/java/io/legado/app/ui/about/AboutScreen.kt @@ -31,7 +31,7 @@ import io.legado.app.constant.AppConst.appInfo import io.legado.app.ui.theme.LegadoTheme import io.legado.app.ui.widget.components.AppScaffold import io.legado.app.ui.widget.components.SplicedColumnGroup -import io.legado.app.ui.widget.components.button.TopBarNavigationButton +import io.legado.app.ui.widget.components.topbar.TopBarNavigationButton import io.legado.app.ui.widget.components.card.TextCard import io.legado.app.ui.widget.components.settingItem.SettingItem import io.legado.app.ui.widget.components.text.AppText diff --git a/app/src/main/java/io/legado/app/ui/book/bookmark/AllBookmarkScreen.kt b/app/src/main/java/io/legado/app/ui/book/bookmark/AllBookmarkScreen.kt index bef37a4c1..86bc93a80 100644 --- a/app/src/main/java/io/legado/app/ui/book/bookmark/AllBookmarkScreen.kt +++ b/app/src/main/java/io/legado/app/ui/book/bookmark/AllBookmarkScreen.kt @@ -56,8 +56,8 @@ import io.legado.app.ui.widget.components.EmptyMessage import io.legado.app.ui.widget.components.SearchBar import io.legado.app.ui.widget.components.bookmark.BookmarkEditSheet import io.legado.app.ui.widget.components.bookmark.BookmarkItem -import io.legado.app.ui.widget.components.button.TopBarActionButton -import io.legado.app.ui.widget.components.button.TopBarNavigationButton +import io.legado.app.ui.widget.components.topbar.TopBarActionButton +import io.legado.app.ui.widget.components.topbar.TopBarNavigationButton import io.legado.app.ui.widget.components.card.GlassCard import io.legado.app.ui.widget.components.card.TextCard import io.legado.app.ui.widget.components.lazylist.FastScrollLazyColumn @@ -308,8 +308,6 @@ fun AllBookmarkScreen( TextCard( text = group.bookName, textStyle = LegadoTheme.typography.labelLarge, - backgroundColor = LegadoTheme.colorScheme.cardContainer, - contentColor = LegadoTheme.colorScheme.onCardContainer, cornerRadius = 8.dp, horizontalPadding = 8.dp, verticalPadding = 6.dp, diff --git a/app/src/main/java/io/legado/app/ui/book/cache/manage/BookCacheManageScreen.kt b/app/src/main/java/io/legado/app/ui/book/cache/manage/BookCacheManageScreen.kt index c8412b84c..bbfde6f0e 100644 --- a/app/src/main/java/io/legado/app/ui/book/cache/manage/BookCacheManageScreen.kt +++ b/app/src/main/java/io/legado/app/ui/book/cache/manage/BookCacheManageScreen.kt @@ -50,8 +50,8 @@ import io.legado.app.ui.widget.components.AppLinearProgressIndicator import io.legado.app.ui.widget.components.AppScaffold import io.legado.app.ui.widget.components.alert.AppAlertDialog import io.legado.app.ui.widget.components.button.SmallTonalIconButton -import io.legado.app.ui.widget.components.button.TopBarActionButton -import io.legado.app.ui.widget.components.button.TopBarNavigationButton +import io.legado.app.ui.widget.components.topbar.TopBarActionButton +import io.legado.app.ui.widget.components.topbar.TopBarNavigationButton import io.legado.app.ui.widget.components.card.NormalCard import io.legado.app.ui.widget.components.card.TextCard import io.legado.app.ui.widget.components.icon.AppIcon diff --git a/app/src/main/java/io/legado/app/ui/book/explore/ExploreShowScreen.kt b/app/src/main/java/io/legado/app/ui/book/explore/ExploreShowScreen.kt index 6052e3c94..c93eb2e89 100644 --- a/app/src/main/java/io/legado/app/ui/book/explore/ExploreShowScreen.kt +++ b/app/src/main/java/io/legado/app/ui/book/explore/ExploreShowScreen.kt @@ -70,8 +70,8 @@ import io.legado.app.ui.theme.responsiveHazeSource import io.legado.app.ui.widget.components.AppScaffold import io.legado.app.ui.widget.components.SearchBar import io.legado.app.ui.widget.components.button.AnimatedTextButton -import io.legado.app.ui.widget.components.button.TopBarActionButton -import io.legado.app.ui.widget.components.button.TopBarNavigationButton +import io.legado.app.ui.widget.components.topbar.TopBarActionButton +import io.legado.app.ui.widget.components.topbar.TopBarNavigationButton import io.legado.app.ui.widget.components.card.TextCard import io.legado.app.ui.widget.components.explore.calculateExploreKindRows import io.legado.app.ui.widget.components.explore.ExploreKindMultiTypeItem diff --git a/app/src/main/java/io/legado/app/ui/book/import/local/ImportBookScreen.kt b/app/src/main/java/io/legado/app/ui/book/import/local/ImportBookScreen.kt index 7e11f31b1..b1b4a69f7 100644 --- a/app/src/main/java/io/legado/app/ui/book/import/local/ImportBookScreen.kt +++ b/app/src/main/java/io/legado/app/ui/book/import/local/ImportBookScreen.kt @@ -64,7 +64,7 @@ import io.legado.app.ui.widget.components.SelectionActions import io.legado.app.ui.widget.components.alert.AppAlertDialog import io.legado.app.ui.widget.components.button.SmallIconButton import io.legado.app.ui.widget.components.button.SmallTonalIconButton -import io.legado.app.ui.widget.components.button.TopBarActionButton +import io.legado.app.ui.widget.components.topbar.TopBarActionButton import io.legado.app.ui.widget.components.card.GlassCard import io.legado.app.ui.widget.components.card.TextCard import io.legado.app.ui.widget.components.filePicker.FilePickerSheet diff --git a/app/src/main/java/io/legado/app/ui/book/import/remote/RemoteBookScreen.kt b/app/src/main/java/io/legado/app/ui/book/import/remote/RemoteBookScreen.kt index 955f48572..466a421a2 100644 --- a/app/src/main/java/io/legado/app/ui/book/import/remote/RemoteBookScreen.kt +++ b/app/src/main/java/io/legado/app/ui/book/import/remote/RemoteBookScreen.kt @@ -80,7 +80,7 @@ import io.legado.app.ui.widget.components.button.ConfirmDismissButtonsRow import io.legado.app.ui.widget.components.button.MediumIconButton import io.legado.app.ui.widget.components.button.SmallIconButton import io.legado.app.ui.widget.components.button.SmallTonalIconButton -import io.legado.app.ui.widget.components.button.TopBarActionButton +import io.legado.app.ui.widget.components.topbar.TopBarActionButton import io.legado.app.ui.widget.components.card.GlassCard import io.legado.app.ui.widget.components.card.SelectionItemCard import io.legado.app.ui.widget.components.card.TextCard @@ -259,7 +259,8 @@ fun RemoteBookScreen( topBarActions = { TopBarActionButton( onClick = { showSheet = RemoteBookSheet.Servers }, - imageVector = Icons.Default.Storage + imageVector = Icons.Default.Storage, + contentDescription = "服务器" ) }, dropDownMenuContent = { dismiss -> diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoScreen.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoScreen.kt index 1fad1b81a..fce52fc32 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoScreen.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoScreen.kt @@ -83,8 +83,8 @@ import io.legado.app.ui.theme.responsiveHazeEffectFixedStyle import io.legado.app.ui.widget.components.AppScaffold import io.legado.app.ui.widget.components.AppTextField import io.legado.app.ui.widget.components.alert.AppAlertDialog -import io.legado.app.ui.widget.components.button.TopBarActionButton -import io.legado.app.ui.widget.components.button.TopBarNavigationButton +import io.legado.app.ui.widget.components.topbar.TopBarActionButton +import io.legado.app.ui.widget.components.topbar.TopBarNavigationButton import io.legado.app.ui.widget.components.card.GlassCard import io.legado.app.ui.widget.components.card.TextCard import io.legado.app.ui.widget.components.cover.CoilBookCover @@ -417,15 +417,18 @@ private fun BookInfoTopBarActions( TopBarActionButton( onClick = { onMenuAction(BookInfoMenuAction.Edit) }, imageVector = Icons.Default.Edit, + contentDescription = "编辑" ) } TopBarActionButton( onClick = { onMenuAction(BookInfoMenuAction.Share) }, imageVector = Icons.Default.Share, + contentDescription = "分享" ) TopBarActionButton( onClick = { onShowMenuChange(true) }, imageVector = Icons.Default.MoreVert, + contentDescription = "更多" ) BookInfoOverflowMenu( expanded = showMenu, diff --git a/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditScreen.kt b/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditScreen.kt index ace814ecd..8ad1157be 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditScreen.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditScreen.kt @@ -45,8 +45,7 @@ import io.legado.app.ui.book.changecover.ChangeCoverDialog import io.legado.app.ui.widget.components.AppScaffold import io.legado.app.ui.widget.components.AppTextField import io.legado.app.ui.widget.components.button.MediumOutlinedIconButton -import io.legado.app.ui.widget.components.button.TopBarButtonVariant -import io.legado.app.ui.widget.components.button.TopBarNavigationButton +import io.legado.app.ui.widget.components.topbar.TopBarNavigationButton import io.legado.app.ui.widget.components.cover.CoilBookCover import io.legado.app.ui.widget.components.menuItem.RoundDropdownMenu import io.legado.app.ui.widget.components.menuItem.RoundDropdownMenuItem @@ -74,8 +73,7 @@ fun BookInfoEditScreen( title = stringResource(id = R.string.book_info_edit), navigationIcon = { TopBarNavigationButton( - onClick = onBack, - style = TopBarButtonVariant.Outlined + onClick = onBack ) }, actions = { diff --git a/app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageScreen.kt b/app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageScreen.kt index bb352914d..cf2f92c94 100644 --- a/app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageScreen.kt +++ b/app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageScreen.kt @@ -91,7 +91,7 @@ import io.legado.app.ui.widget.components.AppTextField import io.legado.app.ui.widget.components.alert.AppAlertDialog import io.legado.app.ui.widget.components.button.SmallTonalIconButton import io.legado.app.ui.widget.components.button.SmallTonalTextButton -import io.legado.app.ui.widget.components.button.TopBarActionButton +import io.legado.app.ui.widget.components.topbar.TopBarActionButton import io.legado.app.ui.widget.components.card.NormalCard import io.legado.app.ui.widget.components.card.ReorderableSelectionItem import io.legado.app.ui.widget.components.card.SelectionItemCard diff --git a/app/src/main/java/io/legado/app/ui/book/readRecord/ReadRecordScreen.kt b/app/src/main/java/io/legado/app/ui/book/readRecord/ReadRecordScreen.kt index d9024346c..b77e91d68 100644 --- a/app/src/main/java/io/legado/app/ui/book/readRecord/ReadRecordScreen.kt +++ b/app/src/main/java/io/legado/app/ui/book/readRecord/ReadRecordScreen.kt @@ -77,7 +77,7 @@ import io.legado.app.ui.widget.components.EmptyMessage import io.legado.app.ui.widget.components.SearchBar import io.legado.app.ui.widget.components.alert.AppAlertDialog import io.legado.app.ui.widget.components.button.AppIconButton -import io.legado.app.ui.widget.components.button.TopBarNavigationButton +import io.legado.app.ui.widget.components.topbar.TopBarNavigationButton import io.legado.app.ui.widget.components.card.GlassCard import io.legado.app.ui.widget.components.card.TextCard import io.legado.app.ui.widget.components.checkBox.CheckboxItem diff --git a/app/src/main/java/io/legado/app/ui/book/search/SearchScreen.kt b/app/src/main/java/io/legado/app/ui/book/search/SearchScreen.kt index 5cba2283e..599b995a9 100644 --- a/app/src/main/java/io/legado/app/ui/book/search/SearchScreen.kt +++ b/app/src/main/java/io/legado/app/ui/book/search/SearchScreen.kt @@ -81,9 +81,9 @@ import io.legado.app.ui.widget.components.button.SmallTextButton import io.legado.app.ui.widget.components.card.NormalCard import io.legado.app.ui.widget.components.card.SelectionItemCard import io.legado.app.ui.widget.components.button.ToggleChip -import io.legado.app.ui.widget.components.button.TopBarActionButton -import io.legado.app.ui.widget.components.button.TopBarAnimatedActionButton -import io.legado.app.ui.widget.components.button.TopBarNavigationButton +import io.legado.app.ui.widget.components.topbar.TopBarActionButton +import io.legado.app.ui.widget.components.topbar.TopBarAnimatedActionButton +import io.legado.app.ui.widget.components.topbar.TopBarNavigationButton import io.legado.app.ui.widget.components.card.GlassCard import io.legado.app.ui.widget.components.icon.AppIcon import io.legado.app.ui.widget.components.icon.AppIcons @@ -219,13 +219,15 @@ fun SearchScreen( onClick = { viewModel.onIntent(SearchIntent.SetScopeSheetVisible(true)) }, - imageVector = AppIcons.Filter + imageVector = AppIcons.Filter, + contentDescription = "筛选" ) TopBarActionButton( onClick = { viewModel.onIntent(SearchIntent.OpenSourceManage) }, imageVector = AppIcons.Settings, + contentDescription = "书源管理" ) }, scrollBehavior = scrollBehavior diff --git a/app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentScreen.kt b/app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentScreen.kt index 3d0aff56e..32b97862a 100644 --- a/app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentScreen.kt +++ b/app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentScreen.kt @@ -63,8 +63,8 @@ import io.legado.app.ui.widget.components.SearchBar import io.legado.app.ui.widget.components.button.MediumOutlinedButton import io.legado.app.ui.widget.components.button.SmallAnimatedActionButton import io.legado.app.ui.widget.components.button.SmallIconButton -import io.legado.app.ui.widget.components.button.TopBarAnimatedActionButton -import io.legado.app.ui.widget.components.button.TopBarNavigationButton +import io.legado.app.ui.widget.components.topbar.TopBarAnimatedActionButton +import io.legado.app.ui.widget.components.topbar.TopBarNavigationButton import io.legado.app.ui.widget.components.card.TextCard import io.legado.app.ui.widget.components.icon.AppIcon import io.legado.app.ui.widget.components.lazylist.FastScrollLazyColumn diff --git a/app/src/main/java/io/legado/app/ui/config/ConfigNavScreen.kt b/app/src/main/java/io/legado/app/ui/config/ConfigNavScreen.kt index 784b5c93f..1e6ab5f48 100644 --- a/app/src/main/java/io/legado/app/ui/config/ConfigNavScreen.kt +++ b/app/src/main/java/io/legado/app/ui/config/ConfigNavScreen.kt @@ -12,7 +12,7 @@ import io.legado.app.R import io.legado.app.ui.theme.adaptiveContentPadding import io.legado.app.ui.widget.components.AppScaffold import io.legado.app.ui.widget.components.SplicedColumnGroup -import io.legado.app.ui.widget.components.button.TopBarNavigationButton +import io.legado.app.ui.widget.components.topbar.TopBarNavigationButton import io.legado.app.ui.widget.components.settingItem.ClickableSettingItem import io.legado.app.ui.widget.components.topbar.GlassMediumFlexibleTopAppBar import io.legado.app.ui.widget.components.topbar.GlassTopAppBarDefaults diff --git a/app/src/main/java/io/legado/app/ui/config/backupConfig/BackupConfigScreen.kt b/app/src/main/java/io/legado/app/ui/config/backupConfig/BackupConfigScreen.kt index 68a9cfe55..869aa374a 100644 --- a/app/src/main/java/io/legado/app/ui/config/backupConfig/BackupConfigScreen.kt +++ b/app/src/main/java/io/legado/app/ui/config/backupConfig/BackupConfigScreen.kt @@ -49,7 +49,7 @@ import io.legado.app.ui.widget.components.AppScaffold import io.legado.app.ui.widget.components.AppTextField import io.legado.app.ui.widget.components.SplicedColumnGroup import io.legado.app.ui.widget.components.alert.AppAlertDialog -import io.legado.app.ui.widget.components.button.TopBarNavigationButton +import io.legado.app.ui.widget.components.topbar.TopBarNavigationButton import io.legado.app.ui.widget.components.card.SelectionItemCard import io.legado.app.ui.widget.components.checkBox.CheckboxItem import io.legado.app.ui.widget.components.filePicker.FilePickerSheet diff --git a/app/src/main/java/io/legado/app/ui/config/coverConfig/CoverConfigScreen.kt b/app/src/main/java/io/legado/app/ui/config/coverConfig/CoverConfigScreen.kt index cd5e8acfa..6884595c3 100644 --- a/app/src/main/java/io/legado/app/ui/config/coverConfig/CoverConfigScreen.kt +++ b/app/src/main/java/io/legado/app/ui/config/coverConfig/CoverConfigScreen.kt @@ -25,7 +25,7 @@ import io.legado.app.constant.PreferKey import io.legado.app.ui.theme.adaptiveContentPadding import io.legado.app.ui.widget.components.AppScaffold import io.legado.app.ui.widget.components.SplicedColumnGroup -import io.legado.app.ui.widget.components.button.TopBarNavigationButton +import io.legado.app.ui.widget.components.topbar.TopBarNavigationButton import io.legado.app.ui.widget.components.dialog.ColorPickerSheet import io.legado.app.ui.widget.components.settingItem.ClickableSettingItem import io.legado.app.ui.widget.components.settingItem.DropdownListSettingItem diff --git a/app/src/main/java/io/legado/app/ui/config/otherConfig/OtherConfigScreen.kt b/app/src/main/java/io/legado/app/ui/config/otherConfig/OtherConfigScreen.kt index 1fe15817d..8aab199d9 100644 --- a/app/src/main/java/io/legado/app/ui/config/otherConfig/OtherConfigScreen.kt +++ b/app/src/main/java/io/legado/app/ui/config/otherConfig/OtherConfigScreen.kt @@ -28,7 +28,7 @@ import io.legado.app.ui.widget.components.AppScaffold import io.legado.app.ui.widget.components.AppTextField import io.legado.app.ui.widget.components.SplicedColumnGroup import io.legado.app.ui.widget.components.alert.AppAlertDialog -import io.legado.app.ui.widget.components.button.TopBarNavigationButton +import io.legado.app.ui.widget.components.topbar.TopBarNavigationButton import io.legado.app.ui.widget.components.filePicker.FilePickerSheet import io.legado.app.ui.widget.components.settingItem.ClickableSettingItem import io.legado.app.ui.widget.components.settingItem.DropdownListSettingItem diff --git a/app/src/main/java/io/legado/app/ui/config/readConfig/ReadConfigScreen.kt b/app/src/main/java/io/legado/app/ui/config/readConfig/ReadConfigScreen.kt index b523bc676..d17259102 100644 --- a/app/src/main/java/io/legado/app/ui/config/readConfig/ReadConfigScreen.kt +++ b/app/src/main/java/io/legado/app/ui/config/readConfig/ReadConfigScreen.kt @@ -18,7 +18,7 @@ import io.legado.app.R import io.legado.app.ui.theme.adaptiveContentPadding import io.legado.app.ui.widget.components.AppScaffold import io.legado.app.ui.widget.components.SplicedColumnGroup -import io.legado.app.ui.widget.components.button.TopBarNavigationButton +import io.legado.app.ui.widget.components.topbar.TopBarNavigationButton import io.legado.app.ui.widget.components.settingItem.ClickableSettingItem import io.legado.app.ui.widget.components.settingItem.DropdownListSettingItem import io.legado.app.ui.widget.components.settingItem.SliderSettingItem diff --git a/app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfigScreen.kt b/app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfigScreen.kt index 961d7810c..afa26ce1f 100644 --- a/app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfigScreen.kt +++ b/app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfigScreen.kt @@ -82,7 +82,7 @@ import io.legado.app.ui.widget.components.AppScaffold import io.legado.app.ui.widget.components.AppTextField import io.legado.app.ui.widget.components.SplicedColumnGroup import io.legado.app.ui.widget.components.alert.AppAlertDialog -import io.legado.app.ui.widget.components.button.TopBarNavigationButton +import io.legado.app.ui.widget.components.topbar.TopBarNavigationButton import io.legado.app.ui.widget.components.dialog.ColorPickerSheet import io.legado.app.ui.widget.components.settingItem.ClickableSettingItem import io.legado.app.ui.widget.components.settingItem.DropdownListSettingItem diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfScreen.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfScreen.kt index b193dbc4e..87025ada2 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfScreen.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfScreen.kt @@ -87,7 +87,7 @@ import io.legado.app.ui.theme.adaptiveHorizontalPadding import io.legado.app.ui.theme.adaptiveHorizontalPaddingTab import io.legado.app.ui.widget.components.EmptyMessage import io.legado.app.ui.widget.components.button.SmallOutlinedIconToggleButton -import io.legado.app.ui.widget.components.button.TopBarActionButton +import io.legado.app.ui.widget.components.topbar.TopBarActionButton import io.legado.app.ui.widget.components.alert.AppAlertDialog import io.legado.app.ui.widget.components.card.NormalCard import io.legado.app.ui.widget.components.card.TextCard diff --git a/app/src/main/java/io/legado/app/ui/main/explore/ExploreScreen.kt b/app/src/main/java/io/legado/app/ui/main/explore/ExploreScreen.kt index f4c6d092e..b637bbd68 100644 --- a/app/src/main/java/io/legado/app/ui/main/explore/ExploreScreen.kt +++ b/app/src/main/java/io/legado/app/ui/main/explore/ExploreScreen.kt @@ -272,8 +272,6 @@ fun ExploreScreen( TextCard( text = item.bookSourceName, textStyle = LegadoTheme.typography.labelMediumEmphasized, - backgroundColor = LegadoTheme.colorScheme.cardContainer, - contentColor = LegadoTheme.colorScheme.onCardContainer, cornerRadius = 12.dp, horizontalPadding = 12.dp, verticalPadding = 8.dp, diff --git a/app/src/main/java/io/legado/app/ui/main/rss/RssScreen.kt b/app/src/main/java/io/legado/app/ui/main/rss/RssScreen.kt index e53e338f5..184530390 100644 --- a/app/src/main/java/io/legado/app/ui/main/rss/RssScreen.kt +++ b/app/src/main/java/io/legado/app/ui/main/rss/RssScreen.kt @@ -56,7 +56,7 @@ import io.legado.app.ui.theme.LegadoTheme import io.legado.app.ui.theme.adaptiveContentPadding import io.legado.app.ui.widget.components.SourceIcon import io.legado.app.ui.widget.components.alert.AppAlertDialog -import io.legado.app.ui.widget.components.button.TopBarActionButton +import io.legado.app.ui.widget.components.topbar.TopBarActionButton import io.legado.app.ui.widget.components.divider.PillDivider import io.legado.app.ui.widget.components.divider.PillHeaderDivider import io.legado.app.ui.widget.components.list.ListScaffold diff --git a/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditScreen.kt b/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditScreen.kt index c9b5a4140..1f1e595c5 100644 --- a/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditScreen.kt +++ b/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditScreen.kt @@ -1,4 +1,4 @@ -package io.legado.app.ui.replace.edit +package io.legado.app.ui.replace.edit import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.fadeIn @@ -71,11 +71,10 @@ import androidx.compose.ui.zIndex import io.legado.app.ui.widget.components.AppScaffold import io.legado.app.ui.widget.components.AppTextField import io.legado.app.ui.widget.components.alert.AppAlertDialog -import io.legado.app.ui.widget.components.button.AlertButton import io.legado.app.ui.widget.components.button.MediumIconButton import io.legado.app.ui.widget.components.button.ToggleChip -import io.legado.app.ui.widget.components.button.TopBarActionButton -import io.legado.app.ui.widget.components.button.TopBarNavigationButton +import io.legado.app.ui.widget.components.topbar.TopBarActionButton +import io.legado.app.ui.widget.components.topbar.TopBarNavigationButton import io.legado.app.ui.widget.components.checkBox.CheckboxItem import io.legado.app.ui.widget.components.icon.AppIcon import io.legado.app.ui.widget.components.menuItem.RoundDropdownMenu diff --git a/app/src/main/java/io/legado/app/ui/rss/article/RssSortScreen.kt b/app/src/main/java/io/legado/app/ui/rss/article/RssSortScreen.kt index 2a27231c5..8042c7158 100644 --- a/app/src/main/java/io/legado/app/ui/rss/article/RssSortScreen.kt +++ b/app/src/main/java/io/legado/app/ui/rss/article/RssSortScreen.kt @@ -53,8 +53,8 @@ import io.legado.app.ui.widget.components.AppScaffold import io.legado.app.ui.widget.components.EmptyMessage import io.legado.app.ui.widget.components.button.SmallIconButton import io.legado.app.ui.widget.components.button.SmallOutlinedIconToggleButton -import io.legado.app.ui.widget.components.button.TopBarActionButton -import io.legado.app.ui.widget.components.button.TopBarNavigationButton +import io.legado.app.ui.widget.components.topbar.TopBarActionButton +import io.legado.app.ui.widget.components.topbar.TopBarNavigationButton import io.legado.app.ui.widget.components.card.GlassCard import io.legado.app.ui.widget.components.icon.AppIcons import io.legado.app.ui.widget.components.menuItem.MenuItemIcon diff --git a/app/src/main/java/io/legado/app/ui/rss/read/RssReadRouteScreen.kt b/app/src/main/java/io/legado/app/ui/rss/read/RssReadRouteScreen.kt index f5e43f7e8..18317437e 100644 --- a/app/src/main/java/io/legado/app/ui/rss/read/RssReadRouteScreen.kt +++ b/app/src/main/java/io/legado/app/ui/rss/read/RssReadRouteScreen.kt @@ -72,8 +72,8 @@ import io.legado.app.ui.widget.components.AppTextField import io.legado.app.ui.widget.components.button.MediumIconButton import io.legado.app.ui.widget.components.card.GlassCard import io.legado.app.ui.widget.components.button.SmallIconButton -import io.legado.app.ui.widget.components.button.TopBarActionButton -import io.legado.app.ui.widget.components.button.TopBarNavigationButton +import io.legado.app.ui.widget.components.topbar.TopBarActionButton +import io.legado.app.ui.widget.components.topbar.TopBarNavigationButton import io.legado.app.ui.widget.components.menuItem.MenuItemIcon import io.legado.app.ui.widget.components.menuItem.RoundDropdownMenu import io.legado.app.ui.widget.components.menuItem.RoundDropdownMenuItem diff --git a/app/src/main/java/io/legado/app/ui/widget/components/alert/AppAlertDialog.kt b/app/src/main/java/io/legado/app/ui/widget/components/alert/AppAlertDialog.kt index 7375204ac..c89858820 100644 --- a/app/src/main/java/io/legado/app/ui/widget/components/alert/AppAlertDialog.kt +++ b/app/src/main/java/io/legado/app/ui/widget/components/alert/AppAlertDialog.kt @@ -7,11 +7,8 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.AlertDialog import androidx.compose.material3.AlertDialogDefaults -import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi -import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Text -import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -23,8 +20,8 @@ import androidx.compose.ui.unit.dp import io.legado.app.ui.theme.LegadoTheme import io.legado.app.ui.theme.LegadoTheme.composeEngine import io.legado.app.ui.theme.ThemeResolver -import io.legado.app.ui.widget.components.button.MiuixPrimaryButton -import io.legado.app.ui.widget.components.button.MiuixSecondaryButton +import io.legado.app.ui.widget.components.button.PrimaryButton +import io.legado.app.ui.widget.components.button.SecondaryButton import top.yukonga.miuix.kmp.window.WindowDialog @OptIn(ExperimentalMaterial3ExpressiveApi::class) @@ -67,7 +64,7 @@ fun AppAlertDialog( verticalAlignment = Alignment.CenterVertically ) { if (onDismiss != null) { - MiuixSecondaryButton( + SecondaryButton( text = dismissText, modifier = Modifier.weight(1f), onClick = { @@ -78,7 +75,7 @@ fun AppAlertDialog( } if (onConfirm != null) { - MiuixPrimaryButton( + PrimaryButton( text = confirmText, modifier = Modifier.weight(1f), onClick = { @@ -115,29 +112,21 @@ fun AppAlertDialog( }, confirmButton = { if (onConfirm != null) { - OutlinedButton( + PrimaryButton( onClick = onConfirm, - colors = ButtonDefaults.outlinedButtonColors( - contentColor = LegadoTheme.colorScheme.primary - ) - ) { - Text(text = confirmText) - } + text = confirmText + ) } }, dismissButton = { if (onDismiss != null) { - TextButton( + SecondaryButton( onClick = { onDismiss() onDismissRequest() }, - colors = ButtonDefaults.textButtonColors( - contentColor = LegadoTheme.colorScheme.primary - ) - ) { - Text(text = dismissText) - } + text = dismissText + ) } } ) diff --git a/app/src/main/java/io/legado/app/ui/widget/components/button/AlertButton.kt b/app/src/main/java/io/legado/app/ui/widget/components/button/AlertButton.kt deleted file mode 100644 index 377dfe373..000000000 --- a/app/src/main/java/io/legado/app/ui/widget/components/button/AlertButton.kt +++ /dev/null @@ -1,30 +0,0 @@ -package io.legado.app.ui.widget.components.button - -import androidx.compose.material3.ButtonDefaults -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.OutlinedButton -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import io.legado.app.ui.widget.components.text.AppText - -@Composable -fun AlertButton( - onClick: () -> Unit, - modifier: Modifier = Modifier, - text: String = "删除", - enabled: Boolean = true -) { - OutlinedButton( - onClick = onClick, - modifier = modifier, - enabled = enabled, - colors = ButtonDefaults.outlinedButtonColors( - contentColor = MaterialTheme.colorScheme.error, - containerColor = Color.Transparent, - ) - ) { - AppText(text = text) - } -} - diff --git a/app/src/main/java/io/legado/app/ui/widget/components/button/AnimatedActionButtonCore.kt b/app/src/main/java/io/legado/app/ui/widget/components/button/AnimatedActionButtonCore.kt new file mode 100644 index 000000000..48b733ba5 --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/widget/components/button/AnimatedActionButtonCore.kt @@ -0,0 +1,74 @@ +package io.legado.app.ui.widget.components.button + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.unit.Dp +import kotlinx.coroutines.delay + +@Composable +internal fun AnimatedActionButtonCore( + checked: Boolean, + onCheckedChange: (Boolean) -> Unit, + iconChecked: ImageVector, + iconUnchecked: ImageVector, + activeText: String, + inactiveText: String, + modifier: Modifier = Modifier, + iconSize: Dp, + textStyle: TextStyle, + textStartPadding: Dp, + contentColor: Color? = null, + button: @Composable ( + modifier: Modifier, + onToggle: (Boolean) -> Unit, + content: @Composable RowScope.() -> Unit + ) -> Unit, + icon: @Composable (imageVector: ImageVector, modifier: Modifier, tint: Color?) -> Unit, + text: @Composable (text: String, modifier: Modifier, style: TextStyle, color: Color?) -> Unit +) { + var showText by remember { mutableStateOf(false) } + var lastCheckedState by remember { mutableStateOf(checked) } + + LaunchedEffect(showText) { + if (showText) { + delay(1000) + showText = false + } + } + + button( + modifier, + { nextChecked -> + lastCheckedState = nextChecked + onCheckedChange(nextChecked) + showText = true + } + ) { + icon( + if (checked) iconChecked else iconUnchecked, + Modifier.size(iconSize), + contentColor + ) + + AnimatedVisibility(visible = showText) { + text( + if (lastCheckedState) activeText else inactiveText, + Modifier.padding(start = textStartPadding), + textStyle, + contentColor + ) + } + } +} diff --git a/app/src/main/java/io/legado/app/ui/widget/components/button/AnimatedIcon.kt b/app/src/main/java/io/legado/app/ui/widget/components/button/AnimatedIcon.kt new file mode 100644 index 000000000..ffbfaaeb7 --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/widget/components/button/AnimatedIcon.kt @@ -0,0 +1,33 @@ +package io.legado.app.ui.widget.components.button + +import androidx.compose.animation.AnimatedContent +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.scaleIn +import androidx.compose.animation.togetherWith +import androidx.compose.material3.Icon +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector + +@Composable +fun AnimatedIcon( + imageVector: ImageVector, + contentDescription: String?, + modifier: Modifier = Modifier +) { + AnimatedContent( + targetState = imageVector, + transitionSpec = { + (fadeIn() + scaleIn(initialScale = 0.8f)) + .togetherWith(fadeOut()) + }, + label = "IconTransition" + ) { targetIcon -> + Icon( + imageVector = targetIcon, + contentDescription = contentDescription, + modifier = modifier + ) + } +} diff --git a/app/src/main/java/io/legado/app/ui/widget/components/button/AppButton.kt b/app/src/main/java/io/legado/app/ui/widget/components/button/AppButton.kt new file mode 100644 index 000000000..18382f16a --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/widget/components/button/AppButton.kt @@ -0,0 +1,66 @@ +package io.legado.app.ui.widget.components.button + +import androidx.compose.material3.Button +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import io.legado.app.ui.theme.LegadoTheme.composeEngine +import io.legado.app.ui.theme.ThemeResolver +import top.yukonga.miuix.kmp.basic.Button as MiuixButton +import top.yukonga.miuix.kmp.basic.ButtonDefaults as MiuixButtonDefaults +import top.yukonga.miuix.kmp.basic.Text as MiuixText + +@Composable +fun PrimaryButton( + onClick: () -> Unit, + modifier: Modifier = Modifier, + enabled: Boolean = true, + text: String +) { + if (ThemeResolver.isMiuixEngine(composeEngine)) { + MiuixButton( + onClick = onClick, + modifier = modifier, + enabled = enabled, + colors = MiuixButtonDefaults.buttonColorsPrimary() + ) { + MiuixText(text = text) + } + } else { + Button( + onClick = onClick, + modifier = modifier, + enabled = enabled, + ) { + Text(text = text) + } + } +} + +@Composable +fun SecondaryButton( + onClick: () -> Unit, + modifier: Modifier = Modifier, + enabled: Boolean = true, + text: String +) { + if (ThemeResolver.isMiuixEngine(composeEngine)) { + MiuixButton( + onClick = onClick, + modifier = modifier, + enabled = enabled, + colors = MiuixButtonDefaults.buttonColors() + ) { + MiuixText(text = text) + } + } else { + OutlinedButton( + onClick = onClick, + modifier = modifier, + enabled = enabled, + ) { + Text(text = text) + } + } +} diff --git a/app/src/main/java/io/legado/app/ui/widget/components/button/AppIconButton.kt b/app/src/main/java/io/legado/app/ui/widget/components/button/AppIconButton.kt index c14bceaa3..49ca97d49 100644 --- a/app/src/main/java/io/legado/app/ui/widget/components/button/AppIconButton.kt +++ b/app/src/main/java/io/legado/app/ui/widget/components/button/AppIconButton.kt @@ -42,9 +42,9 @@ fun AppIconButton( enabled = enabled, holdDownState = holdDownState, backgroundColor = miuixBackgroundColor, - cornerRadius = MiuixIconButtonDefaults.CornerRadius, - minHeight = MiuixIconButtonDefaults.MinHeight, - minWidth = MiuixIconButtonDefaults.MinWidth, + cornerRadius = miuixCornerRadius ?: MiuixIconButtonDefaults.CornerRadius, + minHeight = miuixMinHeight ?: MiuixIconButtonDefaults.MinHeight, + minWidth = miuixMinWidth ?: MiuixIconButtonDefaults.MinWidth, content = content ) } else { @@ -58,4 +58,4 @@ fun AppIconButton( content = content ) } -} \ No newline at end of file +} diff --git a/app/src/main/java/io/legado/app/ui/widget/components/button/ConfirmDismissButtonsRow.kt b/app/src/main/java/io/legado/app/ui/widget/components/button/ConfirmDismissButtonsRow.kt index 1fe2dfff3..18a3ec41b 100644 --- a/app/src/main/java/io/legado/app/ui/widget/components/button/ConfirmDismissButtonsRow.kt +++ b/app/src/main/java/io/legado/app/ui/widget/components/button/ConfirmDismissButtonsRow.kt @@ -4,80 +4,12 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.widthIn -import androidx.compose.material3.Button -import androidx.compose.material3.OutlinedButton -import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import io.legado.app.ui.theme.LegadoTheme.composeEngine import io.legado.app.ui.theme.ThemeResolver -import top.yukonga.miuix.kmp.basic.Button as MiuixButton -import top.yukonga.miuix.kmp.basic.ButtonDefaults as MiuixButtonDefaults -import top.yukonga.miuix.kmp.basic.Text as MiuixText - -@Composable -fun PrimaryButton( - onClick: () -> Unit, - modifier: Modifier = Modifier, - enabled: Boolean = true, - text: String -) { - if (ThemeResolver.isMiuixEngine(composeEngine)) { - MiuixButton( - onClick = onClick, - modifier = modifier, - enabled = enabled, - colors = MiuixButtonDefaults.buttonColorsPrimary() - ) { - MiuixText( - text = text - ) - } - } else { - Button( - onClick = onClick, - modifier = modifier, - enabled = enabled, - ) { - Text( - text = text, - ) - } - } -} - -@Composable -fun SecondaryButton( - onClick: () -> Unit, - modifier: Modifier = Modifier, - enabled: Boolean = true, - text: String -) { - if (ThemeResolver.isMiuixEngine(composeEngine)) { - MiuixButton( - onClick = onClick, - modifier = modifier, - enabled = enabled, - colors = MiuixButtonDefaults.buttonColors() - ) { - MiuixText( - text = text - ) - } - } else { - OutlinedButton( - onClick = onClick, - modifier = modifier, - enabled = enabled, - ) { - Text( - text = text - ) - } - } -} @Composable fun ConfirmDismissButtonsRow( diff --git a/app/src/main/java/io/legado/app/ui/widget/components/button/MediumIconButton.kt b/app/src/main/java/io/legado/app/ui/widget/components/button/MediumIconButton.kt index 46facd67f..85620c897 100644 --- a/app/src/main/java/io/legado/app/ui/widget/components/button/MediumIconButton.kt +++ b/app/src/main/java/io/legado/app/ui/widget/components/button/MediumIconButton.kt @@ -1,29 +1,20 @@ package io.legado.app.ui.widget.components.button -import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.animateColorAsState import androidx.compose.animation.core.tween import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi -import androidx.compose.material3.FilledTonalIconButton import androidx.compose.material3.Icon import androidx.compose.material3.IconButton -import androidx.compose.material3.IconButtonDefaults import androidx.compose.material3.OutlinedIconButton -import androidx.compose.material3.OutlinedIconToggleButton import androidx.compose.material3.Text import androidx.compose.material3.TonalToggleButton import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -32,25 +23,25 @@ import androidx.compose.ui.unit.dp import io.legado.app.ui.theme.LegadoTheme import io.legado.app.ui.theme.LegadoTheme.composeEngine import io.legado.app.ui.theme.ThemeResolver -import kotlinx.coroutines.delay import top.yukonga.miuix.kmp.theme.MiuixTheme import top.yukonga.miuix.kmp.basic.Icon as MiuixIcon import top.yukonga.miuix.kmp.basic.IconButton as MiuixIconButton import top.yukonga.miuix.kmp.basic.Text as MiuixText - @Composable fun MediumIconButton( onClick: () -> Unit, imageVector: ImageVector, tint: Color = LegadoTheme.colorScheme.onSurface, modifier: Modifier = Modifier, + enabled: Boolean = true, contentDescription: String? = null ) { if (ThemeResolver.isMiuixEngine(composeEngine)) { MiuixIconButton( onClick = onClick, - modifier = modifier + modifier = modifier, + enabled = enabled ) { MiuixIcon( imageVector = imageVector, @@ -61,7 +52,8 @@ fun MediumIconButton( } else { IconButton( onClick = onClick, - modifier = modifier + modifier = modifier, + enabled = enabled ) { Icon( imageVector = imageVector, @@ -77,13 +69,14 @@ fun MediumOutlinedIconButton( onClick: () -> Unit, imageVector: ImageVector, modifier: Modifier = Modifier, + enabled: Boolean = true, contentDescription: String? = null ) { - val isMiuix = ThemeResolver.isMiuixEngine(composeEngine) - if (isMiuix) { + if (ThemeResolver.isMiuixEngine(composeEngine)) { MiuixIconButton( onClick = onClick, modifier = modifier, + enabled = enabled, backgroundColor = LegadoTheme.colorScheme.surfaceContainerHigh ) { MiuixIcon( @@ -94,6 +87,8 @@ fun MediumOutlinedIconButton( } else { OutlinedIconButton( onClick = onClick, + modifier = modifier, + enabled = enabled, border = ButtonDefaults.outlinedButtonBorder() ) { Icon( @@ -104,133 +99,6 @@ fun MediumOutlinedIconButton( } } -@Composable -fun MediumOutlinedButton( - onClick: () -> Unit, - imageVector: ImageVector, - text: String, - modifier: Modifier = Modifier, - contentDescription: String? = null -) { - val isMiuix = ThemeResolver.isMiuixEngine(composeEngine) - if (isMiuix) { - MiuixIconButton( - onClick = onClick, - modifier = modifier, - backgroundColor = LegadoTheme.colorScheme.surfaceContainerHigh - ) { - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(8.dp) - ) { - MiuixIcon( - imageVector = imageVector, - contentDescription = contentDescription - ) - MiuixText(text = text) - } - } - } else { - OutlinedIconButton( - onClick = onClick, - border = ButtonDefaults.outlinedButtonBorder() - ) { - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(8.dp) - ) { - Icon( - imageVector = imageVector, - contentDescription = contentDescription - ) - Text(text = text) - } - } - } -} - -@Composable -fun MediumTonalIconButton( - onClick: () -> Unit, - imageVector: ImageVector, - modifier: Modifier = Modifier, - contentDescription: String? = null -) { - val isMiuix = ThemeResolver.isMiuixEngine(composeEngine) - - if (isMiuix) { - MiuixIconButton( - onClick = onClick, - modifier = modifier, - backgroundColor = LegadoTheme.colorScheme.surfaceContainer - ) { - MiuixIcon( - imageVector = imageVector, - contentDescription = contentDescription - ) - } - } else { - FilledTonalIconButton( - onClick = onClick, - modifier = modifier.size(40.dp), - colors = IconButtonDefaults.filledTonalIconButtonColors() - ) { - Icon( - imageVector = imageVector, - contentDescription = contentDescription - ) - } - } -} - -@Composable -fun MediumOutlinedIconToggleButton( - checked: Boolean, - onCheckedChange: (Boolean) -> Unit, - imageVector: ImageVector, - modifier: Modifier = Modifier, - contentDescription: String? = null -) { - val isMiuix = ThemeResolver.isMiuixEngine(composeEngine) - - if (isMiuix) { - val containerColor by animateColorAsState( - targetValue = if (checked) LegadoTheme.colorScheme.primaryContainer else LegadoTheme.colorScheme.surfaceContainer, - animationSpec = tween(150), - label = "MiuixToggleContainerColor" - ) - - val iconTint by animateColorAsState( - targetValue = if (checked) LegadoTheme.colorScheme.onPrimaryContainer else LegadoTheme.colorScheme.onSurfaceVariant, - animationSpec = tween(150), - label = "MiuixToggleIconTint" - ) - - MiuixIconButton( - onClick = { onCheckedChange(!checked) }, - modifier = modifier, - backgroundColor = containerColor - ) { - MiuixIcon( - imageVector = imageVector, - contentDescription = contentDescription, - tint = iconTint - ) - } - } else { - OutlinedIconToggleButton( - checked = checked, - onCheckedChange = onCheckedChange, - modifier = modifier - ) { - Icon( - imageVector = imageVector, - contentDescription = contentDescription - ) - } - } -} - @OptIn(ExperimentalMaterial3ExpressiveApi::class) @Composable fun MediumAnimatedActionButton( @@ -242,20 +110,7 @@ fun MediumAnimatedActionButton( inactiveText: String, modifier: Modifier = Modifier ) { - var showText by remember { mutableStateOf(false) } - var lastCheckedState by remember { mutableStateOf(checked) } - - LaunchedEffect(showText) { - if (showText) { - delay(1000) - showText = false - } - } - - val isMiuix = ThemeResolver.isMiuixEngine(composeEngine) - - if (isMiuix) { - + if (ThemeResolver.isMiuixEngine(composeEngine)) { val containerColor by animateColorAsState( targetValue = if (checked) MiuixTheme.colorScheme.primaryContainer else MiuixTheme.colorScheme.surfaceContainerHigh, animationSpec = tween(150), @@ -265,72 +120,97 @@ fun MediumAnimatedActionButton( val contentColor by animateColorAsState( targetValue = if (checked) MiuixTheme.colorScheme.onPrimaryContainer else MiuixTheme.colorScheme.onSurface, animationSpec = tween(150), - label = "MiuixActionButtonContainer" + label = "MiuixActionButtonContent" ) - MiuixIconButton( - onClick = { - lastCheckedState = !checked - onCheckedChange(!checked) - showText = true - }, - backgroundColor = containerColor - ) { - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Center, - modifier = Modifier.padding(horizontal = 8.dp) - ) { - MiuixIcon( - tint = contentColor, - imageVector = if (checked) iconChecked else iconUnchecked, - contentDescription = null - ) - - AnimatedVisibility( - visible = showText - ) { - MiuixText( - text = if (lastCheckedState) activeText else inactiveText, - color = contentColor, - style = LegadoTheme.typography.labelMedium, - modifier = Modifier.padding(start = 8.dp), - maxLines = 1, - softWrap = false - ) - } - } - } - } else { - TonalToggleButton( + AnimatedActionButtonCore( checked = checked, - onCheckedChange = { - lastCheckedState = it - onCheckedChange(it) - showText = true - }, - contentPadding = PaddingValues(horizontal = 8.dp) - ) { - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Center - ) { - AnimatedIcon( - imageVector = if (checked) iconChecked else iconUnchecked, - contentDescription = null - ) - - AnimatedVisibility( - visible = showText + onCheckedChange = onCheckedChange, + iconChecked = iconChecked, + iconUnchecked = iconUnchecked, + activeText = activeText, + inactiveText = inactiveText, + modifier = modifier, + iconSize = 24.dp, + textStyle = LegadoTheme.typography.labelMedium, + textStartPadding = 8.dp, + contentColor = contentColor, + button = { buttonModifier, onToggle, content -> + MiuixIconButton( + onClick = { onToggle(!checked) }, + modifier = buttonModifier, + backgroundColor = containerColor ) { - Text( - text = if (lastCheckedState) activeText else inactiveText, - modifier = Modifier.padding(start = 8.dp), - maxLines = 1, - softWrap = false + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center, + modifier = Modifier.padding(horizontal = 8.dp), + content = content ) } + }, + icon = { imageVector, iconModifier, tint -> + MiuixIcon( + imageVector = imageVector, + contentDescription = null, + modifier = iconModifier, + tint = tint ?: Color.Unspecified + ) + }, + text = { label, textModifier, style, color -> + MiuixText( + text = label, + color = color ?: Color.Unspecified, + style = style, + modifier = textModifier, + maxLines = 1, + softWrap = false + ) } - } + ) + } else { + AnimatedActionButtonCore( + checked = checked, + onCheckedChange = onCheckedChange, + iconChecked = iconChecked, + iconUnchecked = iconUnchecked, + activeText = activeText, + inactiveText = inactiveText, + modifier = modifier, + iconSize = 24.dp, + textStyle = LegadoTheme.typography.labelMedium, + textStartPadding = 8.dp, + button = { buttonModifier, onToggle, content -> + TonalToggleButton( + checked = checked, + onCheckedChange = onToggle, + modifier = buttonModifier, + contentPadding = PaddingValues(horizontal = 8.dp) + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center, + content = content + ) + } + }, + icon = { imageVector, iconModifier, _ -> + AnimatedIcon( + imageVector = imageVector, + contentDescription = null, + modifier = iconModifier + ) + }, + text = { label, textModifier, style, color -> + Text( + text = label, + modifier = textModifier, + style = style, + color = color ?: Color.Unspecified, + maxLines = 1, + softWrap = false + ) + } + ) } } diff --git a/app/src/main/java/io/legado/app/ui/widget/components/button/MediumTextButton.kt b/app/src/main/java/io/legado/app/ui/widget/components/button/MediumTextButton.kt new file mode 100644 index 000000000..88bede26b --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/widget/components/button/MediumTextButton.kt @@ -0,0 +1,66 @@ +package io.legado.app.ui.widget.components.button + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.unit.dp +import io.legado.app.ui.theme.LegadoTheme +import io.legado.app.ui.theme.LegadoTheme.composeEngine +import io.legado.app.ui.theme.ThemeResolver +import top.yukonga.miuix.kmp.basic.Icon as MiuixIcon +import top.yukonga.miuix.kmp.basic.IconButton as MiuixIconButton +import top.yukonga.miuix.kmp.basic.Text as MiuixText + +@Composable +fun MediumOutlinedButton( + onClick: () -> Unit, + imageVector: ImageVector, + text: String, + modifier: Modifier = Modifier, + enabled: Boolean = true, + contentDescription: String? = null +) { + if (ThemeResolver.isMiuixEngine(composeEngine)) { + MiuixIconButton( + onClick = onClick, + modifier = modifier, + enabled = enabled, + backgroundColor = LegadoTheme.colorScheme.surfaceContainerHigh + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { + MiuixIcon( + imageVector = imageVector, + contentDescription = contentDescription + ) + MiuixText(text = text) + } + } + } else { + OutlinedButton( + onClick = onClick, + modifier = modifier, + enabled = enabled, + border = ButtonDefaults.outlinedButtonBorder() + ) { + Icon( + imageVector = imageVector, + contentDescription = contentDescription + ) + Text( + text = text, + modifier = Modifier.padding(start = 8.dp) + ) + } + } +} diff --git a/app/src/main/java/io/legado/app/ui/widget/components/button/MiuixButton.kt b/app/src/main/java/io/legado/app/ui/widget/components/button/MiuixButton.kt deleted file mode 100644 index 11a6445d4..000000000 --- a/app/src/main/java/io/legado/app/ui/widget/components/button/MiuixButton.kt +++ /dev/null @@ -1,98 +0,0 @@ -package io.legado.app.ui.widget.components.button - -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.res.stringResource -import io.legado.app.R -import top.yukonga.miuix.kmp.basic.Icon -import top.yukonga.miuix.kmp.icon.MiuixIcons -import top.yukonga.miuix.kmp.icon.extended.Back -import top.yukonga.miuix.kmp.theme.LocalContentColor -import top.yukonga.miuix.kmp.theme.MiuixTheme -import top.yukonga.miuix.kmp.basic.Button as MiuixButton -import top.yukonga.miuix.kmp.basic.ButtonDefaults as MiuixButtonDefaults -import top.yukonga.miuix.kmp.basic.IconButton as MiuixIconButton -import top.yukonga.miuix.kmp.basic.Text as MiuixText - -@Composable -fun MiuixIconButton( - modifier: Modifier = Modifier, - imageVector: ImageVector = MiuixIcons.Regular.Back, - tint: Color = LocalContentColor.current, - contentDescription: String? = stringResource(id = R.string.back), - onClick: () -> Unit, -) { - MiuixIconButton( - onClick = onClick, - modifier = modifier - ) { - Icon( - imageVector = imageVector, - contentDescription = contentDescription, - tint = tint - ) - } -} - -@Composable -fun MiuixToggleButton( - modifier: Modifier = Modifier, - checked: Boolean, - onCheckedChange: (Boolean) -> Unit, - iconChecked: ImageVector, - iconUnchecked: ImageVector = iconChecked, - checkedTint: Color = MiuixTheme.colorScheme.primary, - uncheckedTint: Color = LocalContentColor.current, - contentDescription: String? = null, -) { - MiuixIconButton( - onClick = { onCheckedChange(!checked) }, - modifier = modifier - ) { - Icon( - imageVector = if (checked) iconChecked else iconUnchecked, - contentDescription = contentDescription, - tint = if (checked) checkedTint else uncheckedTint - ) - } -} - -@Composable -fun MiuixPrimaryButton( - onClick: () -> Unit, - modifier: Modifier = Modifier, - enabled: Boolean = true, - text: String -) { - MiuixButton( - onClick = onClick, - modifier = modifier, - enabled = enabled, - colors = MiuixButtonDefaults.buttonColorsPrimary() - ) { - MiuixText( - text = text - ) - } -} - -@Composable -fun MiuixSecondaryButton( - onClick: () -> Unit, - modifier: Modifier = Modifier, - enabled: Boolean = true, - text: String -) { - MiuixButton( - onClick = onClick, - modifier = modifier, - enabled = enabled, - colors = MiuixButtonDefaults.buttonColors() - ) { - MiuixText( - text = text - ) - } -} diff --git a/app/src/main/java/io/legado/app/ui/widget/components/button/SmallIconButton.kt b/app/src/main/java/io/legado/app/ui/widget/components/button/SmallIconButton.kt index 79cc7118c..d33333e46 100644 --- a/app/src/main/java/io/legado/app/ui/widget/components/button/SmallIconButton.kt +++ b/app/src/main/java/io/legado/app/ui/widget/components/button/SmallIconButton.kt @@ -1,6 +1,5 @@ package io.legado.app.ui.widget.components.button -import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.animateColorAsState import androidx.compose.animation.core.tween import androidx.compose.foundation.layout.Arrangement @@ -23,19 +22,16 @@ import androidx.compose.material3.Text import androidx.compose.material3.TonalToggleButton import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.unit.dp import io.legado.app.ui.theme.LegadoTheme import io.legado.app.ui.theme.LegadoTheme.composeEngine import io.legado.app.ui.theme.ThemeResolver -import kotlinx.coroutines.delay import top.yukonga.miuix.kmp.basic.Icon as MiuixIcon import top.yukonga.miuix.kmp.basic.IconButton as MiuixIconButton import top.yukonga.miuix.kmp.basic.Text as MiuixText @@ -65,11 +61,15 @@ private fun SmallNoMinTouchTarget(content: @Composable () -> Unit) { fun SmallIconButton( onClick: () -> Unit, imageVector: ImageVector, + modifier: Modifier = Modifier, + enabled: Boolean = true, contentDescription: String? = null ) { if (ThemeResolver.isMiuixEngine(composeEngine)) { MiuixIconButton( - onClick = onClick + onClick = onClick, + modifier = modifier, + enabled = enabled ) { MiuixIcon( imageVector = imageVector, @@ -81,7 +81,8 @@ fun SmallIconButton( SmallNoMinTouchTarget { IconButton( onClick = onClick, - modifier = Modifier.size(smallContainerSize()), + modifier = modifier.size(smallContainerSize()), + enabled = enabled, shape = IconButtonDefaults.extraSmallRoundShape, ) { Icon( @@ -100,13 +101,14 @@ fun SmallOutlinedIconButton( onClick: () -> Unit, imageVector: ImageVector, modifier: Modifier = Modifier, + enabled: Boolean = true, contentDescription: String? = null ) { - val isMiuix = ThemeResolver.isMiuixEngine(composeEngine) - if (isMiuix) { + if (ThemeResolver.isMiuixEngine(composeEngine)) { MiuixIconButton( onClick = onClick, modifier = modifier.size(SmallMiuixButtonSize), + enabled = enabled, backgroundColor = LegadoTheme.colorScheme.surfaceContainer ) { MiuixIcon( @@ -119,7 +121,8 @@ fun SmallOutlinedIconButton( SmallNoMinTouchTarget { OutlinedIconButton( onClick = onClick, - modifier = Modifier.size(smallContainerSize()), + modifier = modifier.size(smallContainerSize()), + enabled = enabled, shapes = IconButtonDefaults.shapes(), border = ButtonDefaults.outlinedButtonBorder() ) { @@ -139,14 +142,14 @@ fun SmallTonalIconButton( onClick: () -> Unit, imageVector: ImageVector, modifier: Modifier = Modifier, + enabled: Boolean = true, contentDescription: String? = null ) { - val isMiuix = ThemeResolver.isMiuixEngine(composeEngine) - - if (isMiuix) { + if (ThemeResolver.isMiuixEngine(composeEngine)) { MiuixIconButton( onClick = onClick, modifier = modifier.size(SmallMiuixButtonSize), + enabled = enabled, backgroundColor = LegadoTheme.colorScheme.surfaceContainer ) { MiuixIcon( @@ -160,6 +163,7 @@ fun SmallTonalIconButton( FilledTonalIconButton( onClick = onClick, modifier = modifier.size(smallContainerSize()), + enabled = enabled, shapes = IconButtonDefaults.shapes(), colors = IconButtonDefaults.filledTonalIconButtonColors() ) { @@ -180,12 +184,10 @@ fun SmallOutlinedIconToggleButton( onCheckedChange: (Boolean) -> Unit, imageVector: ImageVector, modifier: Modifier = Modifier, + enabled: Boolean = true, contentDescription: String? = null ) { - val isMiuix = ThemeResolver.isMiuixEngine(composeEngine) - - if (isMiuix) { - + if (ThemeResolver.isMiuixEngine(composeEngine)) { val containerColor by animateColorAsState( targetValue = if (checked) LegadoTheme.colorScheme.primaryContainer else LegadoTheme.colorScheme.surfaceContainer, animationSpec = tween(150), @@ -200,8 +202,8 @@ fun SmallOutlinedIconToggleButton( MiuixIconButton( onClick = { onCheckedChange(!checked) }, - modifier = modifier - .size(SmallMiuixButtonSize), + modifier = modifier.size(SmallMiuixButtonSize), + enabled = enabled, backgroundColor = containerColor ) { MiuixIcon( @@ -211,7 +213,6 @@ fun SmallOutlinedIconToggleButton( modifier = Modifier.size(SmallMiuixIconSize) ) } - } else { val defaultShape = IconButtonDefaults.extraSmallRoundShape val pressedShape = IconButtonDefaults.extraSmallPressedShape @@ -225,11 +226,12 @@ fun SmallOutlinedIconToggleButton( ) } - CompositionLocalProvider(LocalMinimumInteractiveComponentSize provides 0.dp) { + SmallNoMinTouchTarget { OutlinedIconToggleButton( checked = checked, onCheckedChange = onCheckedChange, modifier = modifier.size(smallContainerSize()), + enabled = enabled, shapes = toggleShapes ) { Icon( @@ -253,91 +255,102 @@ fun SmallAnimatedActionButton( inactiveText: String, modifier: Modifier = Modifier ) { - var showText by remember { mutableStateOf(false) } - var lastCheckedState by remember { mutableStateOf(checked) } - - LaunchedEffect(showText) { - if (showText) { - delay(1000) - showText = false - } - } - - val isMiuix = ThemeResolver.isMiuixEngine(composeEngine) - - if (isMiuix) { + if (ThemeResolver.isMiuixEngine(composeEngine)) { val containerColor by animateColorAsState( targetValue = if (checked) MiuixTheme.colorScheme.primaryContainer else MiuixTheme.colorScheme.surfaceContainer, animationSpec = tween(150), label = "MiuixActionButtonContainer" ) - MiuixIconButton( - onClick = { - lastCheckedState = !checked - onCheckedChange(!checked) - showText = true - }, - backgroundColor = containerColor - ) { - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Center, - modifier = Modifier.padding(horizontal = 8.dp, vertical = 6.dp) - ) { - MiuixIcon( - imageVector = if (checked) iconChecked else iconUnchecked, - contentDescription = null - ) - - AnimatedVisibility( - visible = showText + AnimatedActionButtonCore( + checked = checked, + onCheckedChange = onCheckedChange, + iconChecked = iconChecked, + iconUnchecked = iconUnchecked, + activeText = activeText, + inactiveText = inactiveText, + modifier = modifier, + iconSize = 18.dp, + textStyle = LegadoTheme.typography.labelSmall, + textStartPadding = 6.dp, + button = { buttonModifier, onToggle, content -> + MiuixIconButton( + onClick = { onToggle(!checked) }, + modifier = buttonModifier, + backgroundColor = containerColor ) { - MiuixText( - text = if (lastCheckedState) activeText else inactiveText, - style = LegadoTheme.typography.labelSmall, - modifier = Modifier.padding(start = 6.dp), + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center, + modifier = Modifier.padding(horizontal = 8.dp, vertical = 6.dp), + content = content + ) + } + }, + icon = { imageVector, iconModifier, tint -> + MiuixIcon( + imageVector = imageVector, + contentDescription = null, + modifier = iconModifier, + tint = tint ?: Color.Unspecified + ) + }, + text = { label, textModifier, style, color -> + MiuixText( + text = label, + style = style, + color = color ?: Color.Unspecified, + modifier = textModifier, + maxLines = 1, + softWrap = false + ) + } + ) + } else { + SmallNoMinTouchTarget { + AnimatedActionButtonCore( + checked = checked, + onCheckedChange = onCheckedChange, + iconChecked = iconChecked, + iconUnchecked = iconUnchecked, + activeText = activeText, + inactiveText = inactiveText, + modifier = modifier.height(36.dp), + iconSize = 16.dp, + textStyle = LegadoTheme.typography.labelSmall, + textStartPadding = 6.dp, + button = { buttonModifier, onToggle, content -> + TonalToggleButton( + checked = checked, + onCheckedChange = onToggle, + modifier = buttonModifier, + contentPadding = PaddingValues(horizontal = 8.dp) + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center, + content = content + ) + } + }, + icon = { imageVector, iconModifier, _ -> + AnimatedIcon( + imageVector = imageVector, + contentDescription = null, + modifier = iconModifier + ) + }, + text = { label, textModifier, style, color -> + Text( + text = label, + style = style, + color = color ?: Color.Unspecified, + modifier = textModifier, maxLines = 1, softWrap = false ) } - } - } - } else { - CompositionLocalProvider(LocalMinimumInteractiveComponentSize provides 0.dp) { - TonalToggleButton( - checked = checked, - onCheckedChange = { - lastCheckedState = it - onCheckedChange(it) - showText = true - }, - modifier = modifier.height(36.dp), - contentPadding = PaddingValues(horizontal = 8.dp) - ) { - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Center - ) { - AnimatedIcon( - modifier = Modifier.size(16.dp), - imageVector = if (checked) iconChecked else iconUnchecked, - contentDescription = null - ) - - AnimatedVisibility( - visible = showText - ) { - Text( - text = if (lastCheckedState) activeText else inactiveText, - style = LegadoTheme.typography.labelSmall, - modifier = Modifier.padding(start = 6.dp), - maxLines = 1, - softWrap = false - ) - } - } - } + ) } } } diff --git a/app/src/main/java/io/legado/app/ui/widget/components/button/ToggleChip.kt b/app/src/main/java/io/legado/app/ui/widget/components/button/ToggleChip.kt index 4cfc6443b..3569325c3 100644 --- a/app/src/main/java/io/legado/app/ui/widget/components/button/ToggleChip.kt +++ b/app/src/main/java/io/legado/app/ui/widget/components/button/ToggleChip.kt @@ -16,6 +16,12 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.semantics.Role +import androidx.compose.ui.semantics.role +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.semantics.stateDescription +import androidx.compose.ui.semantics.toggleableState +import androidx.compose.ui.state.ToggleableState import androidx.compose.ui.unit.dp import io.legado.app.ui.theme.LegadoTheme import io.legado.app.ui.theme.LegadoTheme.composeEngine @@ -31,12 +37,26 @@ fun ToggleChip( selected: Boolean, onToggle: () -> Unit, modifier: Modifier = Modifier, - checkedContentDescription: String = "已选择" + checkedContentDescription: String = "已选择", + uncheckedContentDescription: String = "未选择" ) { + val isSelected = selected if (ThemeResolver.isMiuixEngine(composeEngine)) { MiuixIconButton( onClick = onToggle, - modifier = modifier, + modifier = modifier.semantics { + role = Role.Checkbox + toggleableState = if (isSelected) { + ToggleableState.On + } else { + ToggleableState.Off + } + stateDescription = if (isSelected) { + checkedContentDescription + } else { + uncheckedContentDescription + } + }, backgroundColor = if (selected) { MiuixTheme.colorScheme.primaryContainer } else { diff --git a/app/src/main/java/io/legado/app/ui/widget/components/button/TopBarButton.kt b/app/src/main/java/io/legado/app/ui/widget/components/button/TopBarButton.kt deleted file mode 100644 index decd71847..000000000 --- a/app/src/main/java/io/legado/app/ui/widget/components/button/TopBarButton.kt +++ /dev/null @@ -1,304 +0,0 @@ -package io.legado.app.ui.widget.components.button - -import androidx.compose.animation.AnimatedContent -import androidx.compose.animation.AnimatedVisibility -import androidx.compose.animation.animateColorAsState -import androidx.compose.animation.core.tween -import androidx.compose.animation.fadeIn -import androidx.compose.animation.fadeOut -import androidx.compose.animation.scaleIn -import androidx.compose.animation.togetherWith -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.automirrored.filled.ArrowBack -import androidx.compose.material3.ButtonDefaults -import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi -import androidx.compose.material3.FilledTonalIconButton -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.IconButtonDefaults -import androidx.compose.material3.OutlinedIconButton -import androidx.compose.material3.Text -import androidx.compose.material3.ToggleButton -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.unit.dp -import io.legado.app.R -import io.legado.app.ui.config.themeConfig.ThemeConfig -import io.legado.app.ui.theme.LegadoTheme -import io.legado.app.ui.theme.ThemeResolver -import io.legado.app.ui.widget.components.icon.AppIcons -import io.legado.app.ui.widget.components.topbar.GlassTopAppBarDefaults -import kotlinx.coroutines.delay -import top.yukonga.miuix.kmp.theme.MiuixTheme -import top.yukonga.miuix.kmp.basic.Text as MiuixText -import top.yukonga.miuix.kmp.basic.Icon as MiuixIcon -import top.yukonga.miuix.kmp.basic.IconButton as MiuixIconButton - -enum class TopBarButtonVariant { - Filled, Outlined, Icon -} - -@Composable -fun TopBarButton( - onClick: () -> Unit, - modifier: Modifier = Modifier, - imageVector: ImageVector = Icons.AutoMirrored.Filled.ArrowBack, - contentDescription: String? = null, - style: TopBarButtonVariant = TopBarButtonVariant.Filled -) { - - val commonModifier = modifier - .size(36.dp) - - when (style) { - TopBarButtonVariant.Filled -> { - FilledTonalIconButton( - onClick = onClick, - modifier = commonModifier, - colors = IconButtonDefaults.filledTonalIconButtonColors( - containerColor = GlassTopAppBarDefaults.controlContainerColor(), - contentColor = LegadoTheme.colorScheme.onSurface - ) - ) { - AnimatedIcon( - modifier = Modifier.size(20.dp), - imageVector = imageVector, - contentDescription = contentDescription - ) - } - } - - TopBarButtonVariant.Outlined -> { - OutlinedIconButton( - onClick = onClick, - modifier = commonModifier, - border = ButtonDefaults.outlinedButtonBorder() - ) { - AnimatedIcon( - modifier = Modifier.size(20.dp), - imageVector = imageVector, - contentDescription = contentDescription - ) - } - } - - TopBarButtonVariant.Icon -> { - IconButton( - onClick = onClick, - modifier = commonModifier - ) { - AnimatedIcon( - modifier = Modifier.size(20.dp), - imageVector = imageVector, - contentDescription = contentDescription - ) - } - } - } -} - -@Composable -fun TopBarNavigationButton( - onClick: () -> Unit, - modifier: Modifier = Modifier, - imageVector: ImageVector = AppIcons.Back, - contentDescription: String? = stringResource(id = R.string.back), - style: TopBarButtonVariant = TopBarButtonVariant.Filled -) { - if (ThemeResolver.isMiuixEngine(LegadoTheme.composeEngine)) { - MiuixIconButton( - onClick = onClick, - imageVector = imageVector, - contentDescription = contentDescription - ) - } else { - TopBarButton( - onClick = onClick, - imageVector = imageVector, - contentDescription = contentDescription, - modifier = modifier.padding(horizontal = 12.dp), - style = style - ) - } -} - -@Composable -fun TopBarActionButton( - onClick: () -> Unit, - imageVector: ImageVector, - contentDescription: String? = "", - modifier: Modifier = Modifier -) { - val enableProgressive = ThemeConfig.enableProgressiveBlur - if (ThemeResolver.isMiuixEngine(LegadoTheme.composeEngine)) { - MiuixIconButton( - onClick = onClick, - imageVector = imageVector, - contentDescription = contentDescription, - modifier = modifier, - ) - } else { - if (enableProgressive) { - TopBarButton( - onClick = onClick, - imageVector = imageVector, - contentDescription = contentDescription, - modifier = modifier.padding(end = 12.dp), - style = TopBarButtonVariant.Filled - ) - } else { - IconButton(onClick = onClick) { - Icon( - imageVector = imageVector, - contentDescription = contentDescription - ) - } - } - } -} - -@OptIn(ExperimentalMaterial3ExpressiveApi::class) -@Composable -fun TopBarAnimatedActionButton( - checked: Boolean, - onCheckedChange: (Boolean) -> Unit, - iconChecked: ImageVector, - iconUnchecked: ImageVector, - activeText: String, - inactiveText: String, - modifier: Modifier = Modifier -) { - var showText by remember { mutableStateOf(false) } - var lastCheckedState by remember { mutableStateOf(checked) } - - LaunchedEffect(showText) { - if (showText) { - delay(1000) - showText = false - } - } - if (ThemeResolver.isMiuixEngine(LegadoTheme.composeEngine)) { - - val containerColor by animateColorAsState( - targetValue = if (checked) MiuixTheme.colorScheme.primaryContainer else MiuixTheme.colorScheme.surfaceContainerHigh, - animationSpec = tween(150), - label = "MiuixActionButtonContainer" - ) - - val contentColor by animateColorAsState( - targetValue = if (checked) MiuixTheme.colorScheme.onPrimaryContainer else MiuixTheme.colorScheme.onSurface, - animationSpec = tween(150), - label = "MiuixActionButtonContainer" - ) - - MiuixIconButton( - onClick = { - lastCheckedState = !checked - onCheckedChange(!checked) - showText = true - }, - backgroundColor = containerColor - ) { - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Center, - modifier = Modifier.padding(horizontal = 8.dp) - ) { - MiuixIcon( - tint = contentColor, - imageVector = if (checked) iconChecked else iconUnchecked, - contentDescription = null - ) - - AnimatedVisibility( - visible = showText - ) { - MiuixText( - text = if (lastCheckedState) activeText else inactiveText, - color = contentColor, - style = LegadoTheme.typography.labelMedium, - modifier = Modifier.padding(start = 8.dp), - maxLines = 1, - softWrap = false - ) - } - } - } - } else { - ToggleButton( - modifier = modifier.height(36.dp), - contentPadding = PaddingValues(horizontal = 8.dp), - checked = checked, - onCheckedChange = { - lastCheckedState = it - onCheckedChange(it) - showText = true - } - ) { - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Center - ) { - - AnimatedContent( - targetState = checked, - label = "IconAnimation" - ) { targetChecked -> - AnimatedIcon( - modifier = Modifier.size(20.dp), - imageVector = if (targetChecked) iconChecked else iconUnchecked, - contentDescription = null - ) - } - - AnimatedVisibility( - visible = showText - ) { - Text( - text = if (lastCheckedState) activeText else inactiveText, - style = LegadoTheme.typography.labelMedium, - modifier = Modifier.padding(start = 8.dp), - maxLines = 1, - softWrap = false - ) - } - } - } - } -} - -@Composable -fun AnimatedIcon( - imageVector: ImageVector, - contentDescription: String?, - modifier: Modifier = Modifier -) { - AnimatedContent( - targetState = imageVector, - transitionSpec = { - (fadeIn() + scaleIn(initialScale = 0.8f)) - .togetherWith(fadeOut()) - }, - label = "IconTransition" - ) { targetIcon -> - Icon( - imageVector = targetIcon, - contentDescription = contentDescription, - modifier = modifier - ) - } -} diff --git a/app/src/main/java/io/legado/app/ui/widget/components/topbar/DynamicTopAppBar.kt b/app/src/main/java/io/legado/app/ui/widget/components/topbar/DynamicTopAppBar.kt index 4fd61fe0f..81d010049 100644 --- a/app/src/main/java/io/legado/app/ui/widget/components/topbar/DynamicTopAppBar.kt +++ b/app/src/main/java/io/legado/app/ui/widget/components/topbar/DynamicTopAppBar.kt @@ -23,8 +23,8 @@ import androidx.compose.ui.graphics.vector.ImageVector import io.legado.app.ui.theme.adaptiveHorizontalPadding import io.legado.app.ui.widget.components.SearchBar import io.legado.app.ui.widget.components.icon.AppIcon -import io.legado.app.ui.widget.components.button.TopBarActionButton -import io.legado.app.ui.widget.components.button.TopBarNavigationButton +import io.legado.app.ui.widget.components.topbar.TopBarActionButton +import io.legado.app.ui.widget.components.topbar.TopBarNavigationButton import io.legado.app.ui.widget.components.icon.AppIcons import io.legado.app.ui.widget.components.list.ListUiState import io.legado.app.ui.widget.components.menuItem.RoundDropdownMenu diff --git a/app/src/main/java/io/legado/app/ui/widget/components/topbar/TopBarButton.kt b/app/src/main/java/io/legado/app/ui/widget/components/topbar/TopBarButton.kt new file mode 100644 index 000000000..e42304535 --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/widget/components/topbar/TopBarButton.kt @@ -0,0 +1,250 @@ +package io.legado.app.ui.widget.components.topbar + +import androidx.compose.animation.AnimatedContent +import androidx.compose.animation.animateColorAsState +import androidx.compose.animation.core.tween +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ArrowBack +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi +import androidx.compose.material3.FilledTonalIconButton +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.IconButtonDefaults +import androidx.compose.material3.Text +import androidx.compose.material3.ToggleButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import io.legado.app.R +import io.legado.app.ui.config.themeConfig.ThemeConfig +import io.legado.app.ui.theme.LegadoTheme +import io.legado.app.ui.theme.ThemeResolver +import io.legado.app.ui.widget.components.button.AnimatedActionButtonCore +import io.legado.app.ui.widget.components.button.AnimatedIcon +import io.legado.app.ui.widget.components.icon.AppIcons +import top.yukonga.miuix.kmp.theme.MiuixTheme +import top.yukonga.miuix.kmp.basic.Text as MiuixText +import top.yukonga.miuix.kmp.basic.Icon as MiuixIcon +import top.yukonga.miuix.kmp.basic.IconButton as MiuixIconButton + +@Composable +private fun TopBarButton( + onClick: () -> Unit, + modifier: Modifier = Modifier, + imageVector: ImageVector = Icons.AutoMirrored.Filled.ArrowBack, + contentDescription: String? = null +) { + FilledTonalIconButton( + onClick = onClick, + modifier = modifier.size(36.dp), + colors = IconButtonDefaults.filledTonalIconButtonColors( + containerColor = GlassTopAppBarDefaults.controlContainerColor(), + contentColor = LegadoTheme.colorScheme.onSurface + ) + ) { + AnimatedIcon( + modifier = Modifier.size(20.dp), + imageVector = imageVector, + contentDescription = contentDescription + ) + } +} + +@Composable +fun TopBarNavigationButton( + onClick: () -> Unit, + modifier: Modifier = Modifier, + imageVector: ImageVector = AppIcons.Back, + contentDescription: String? = stringResource(id = R.string.back) +) { + if (ThemeResolver.isMiuixEngine(LegadoTheme.composeEngine)) { + MiuixIconButton( + onClick = onClick, + modifier = modifier + ) { + MiuixIcon( + imageVector = imageVector, + contentDescription = contentDescription + ) + } + } else { + TopBarButton( + onClick = onClick, + imageVector = imageVector, + contentDescription = contentDescription, + modifier = modifier.padding(horizontal = 12.dp) + ) + } +} + +@Composable +fun TopBarActionButton( + onClick: () -> Unit, + imageVector: ImageVector, + contentDescription: String?, + modifier: Modifier = Modifier +) { + val enableProgressive = ThemeConfig.enableProgressiveBlur + if (ThemeResolver.isMiuixEngine(LegadoTheme.composeEngine)) { + MiuixIconButton( + onClick = onClick, + modifier = modifier, + ) { + MiuixIcon( + imageVector = imageVector, + contentDescription = contentDescription + ) + } + } else { + if (enableProgressive) { + TopBarButton( + onClick = onClick, + imageVector = imageVector, + contentDescription = contentDescription, + modifier = modifier.padding(end = 12.dp) + ) + } else { + IconButton( + onClick = onClick, + modifier = modifier + ) { + Icon( + imageVector = imageVector, + contentDescription = contentDescription + ) + } + } + } +} + +@OptIn(ExperimentalMaterial3ExpressiveApi::class) +@Composable +fun TopBarAnimatedActionButton( + checked: Boolean, + onCheckedChange: (Boolean) -> Unit, + iconChecked: ImageVector, + iconUnchecked: ImageVector, + activeText: String, + inactiveText: String, + modifier: Modifier = Modifier +) { + if (ThemeResolver.isMiuixEngine(LegadoTheme.composeEngine)) { + val containerColor by animateColorAsState( + targetValue = if (checked) MiuixTheme.colorScheme.primaryContainer else MiuixTheme.colorScheme.surfaceContainerHigh, + animationSpec = tween(150), + label = "MiuixActionButtonContainer" + ) + + val contentColor by animateColorAsState( + targetValue = if (checked) MiuixTheme.colorScheme.onPrimaryContainer else MiuixTheme.colorScheme.onSurface, + animationSpec = tween(150), + label = "MiuixActionButtonContainer" + ) + + AnimatedActionButtonCore( + checked = checked, + onCheckedChange = onCheckedChange, + iconChecked = iconChecked, + iconUnchecked = iconUnchecked, + activeText = activeText, + inactiveText = inactiveText, + modifier = modifier, + iconSize = 24.dp, + textStyle = LegadoTheme.typography.labelMedium, + textStartPadding = 8.dp, + contentColor = contentColor, + button = { buttonModifier, onToggle, content -> + MiuixIconButton( + onClick = { onToggle(!checked) }, + modifier = buttonModifier, + backgroundColor = containerColor + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center, + modifier = Modifier.padding(horizontal = 8.dp), + content = content + ) + } + }, + icon = { imageVector, iconModifier, tint -> + MiuixIcon( + tint = tint ?: Color.Unspecified, + imageVector = imageVector, + contentDescription = null, + modifier = iconModifier + ) + }, + text = { label, textModifier, style, color -> + MiuixText( + text = label, + color = color ?: Color.Unspecified, + style = style, + modifier = textModifier, + maxLines = 1, + softWrap = false + ) + } + ) + } else { + AnimatedActionButtonCore( + checked = checked, + onCheckedChange = onCheckedChange, + iconChecked = iconChecked, + iconUnchecked = iconUnchecked, + activeText = activeText, + inactiveText = inactiveText, + modifier = modifier.height(36.dp), + iconSize = 20.dp, + textStyle = LegadoTheme.typography.labelMedium, + textStartPadding = 8.dp, + button = { buttonModifier, onToggle, content -> + ToggleButton( + modifier = buttonModifier, + contentPadding = PaddingValues(horizontal = 8.dp), + checked = checked, + onCheckedChange = onToggle + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center, + content = content + ) + } + }, + icon = { imageVector, iconModifier, _ -> + AnimatedContent( + targetState = imageVector, + label = "IconAnimation" + ) { targetIcon -> + AnimatedIcon( + modifier = iconModifier, + imageVector = targetIcon, + contentDescription = null + ) + } + }, + text = { label, textModifier, style, color -> + Text( + text = label, + style = style, + color = color ?: Color.Unspecified, + modifier = textModifier, + maxLines = 1, + softWrap = false + ) + } + ) + } +}