mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-08-06 02:30:12 +08:00
opt gesture
Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
@@ -316,6 +316,7 @@ class ListTile extends StatelessWidget {
|
|||||||
/// Requires one of its ancestors to be a [Material] widget.
|
/// Requires one of its ancestors to be a [Material] widget.
|
||||||
const ListTile({
|
const ListTile({
|
||||||
super.key,
|
super.key,
|
||||||
|
this.safeArea = false,
|
||||||
this.leading,
|
this.leading,
|
||||||
this.title,
|
this.title,
|
||||||
this.subtitle,
|
this.subtitle,
|
||||||
@@ -335,6 +336,7 @@ class ListTile extends StatelessWidget {
|
|||||||
this.enabled = true,
|
this.enabled = true,
|
||||||
this.onTap,
|
this.onTap,
|
||||||
this.onLongPress,
|
this.onLongPress,
|
||||||
|
this.onSecondaryTap,
|
||||||
this.onFocusChange,
|
this.onFocusChange,
|
||||||
this.mouseCursor,
|
this.mouseCursor,
|
||||||
this.selected = false,
|
this.selected = false,
|
||||||
@@ -355,6 +357,8 @@ class ListTile extends StatelessWidget {
|
|||||||
this.statesController,
|
this.statesController,
|
||||||
}) : assert(isThreeLine != true || subtitle != null);
|
}) : assert(isThreeLine != true || subtitle != null);
|
||||||
|
|
||||||
|
final bool safeArea;
|
||||||
|
|
||||||
/// A widget to display before the title.
|
/// A widget to display before the title.
|
||||||
///
|
///
|
||||||
/// Typically an [Icon] or a [CircleAvatar] widget.
|
/// Typically an [Icon] or a [CircleAvatar] widget.
|
||||||
@@ -563,6 +567,8 @@ class ListTile extends StatelessWidget {
|
|||||||
/// Inoperative if [enabled] is false.
|
/// Inoperative if [enabled] is false.
|
||||||
final GestureLongPressCallback? onLongPress;
|
final GestureLongPressCallback? onLongPress;
|
||||||
|
|
||||||
|
final GestureTapCallback? onSecondaryTap;
|
||||||
|
|
||||||
/// {@macro flutter.material.inkwell.onFocusChange}
|
/// {@macro flutter.material.inkwell.onFocusChange}
|
||||||
final ValueChanged<bool>? onFocusChange;
|
final ValueChanged<bool>? onFocusChange;
|
||||||
|
|
||||||
@@ -922,10 +928,64 @@ class ListTile extends StatelessWidget {
|
|||||||
? ListTileTitleAlignment.threeLine
|
? ListTileTitleAlignment.threeLine
|
||||||
: ListTileTitleAlignment.titleHeight);
|
: ListTileTitleAlignment.titleHeight);
|
||||||
|
|
||||||
|
Widget child = IconTheme.merge(
|
||||||
|
data: iconThemeData,
|
||||||
|
child: IconButtonTheme(
|
||||||
|
data: iconButtonThemeData,
|
||||||
|
child: _ListTile(
|
||||||
|
leading: leadingIcon,
|
||||||
|
title: titleText,
|
||||||
|
subtitle: subtitleText,
|
||||||
|
trailing: trailingIcon,
|
||||||
|
isDense: _isDenseLayout(theme, tileTheme),
|
||||||
|
visualDensity:
|
||||||
|
visualDensity ?? tileTheme.visualDensity ?? theme.visualDensity,
|
||||||
|
isThreeLine:
|
||||||
|
isThreeLine ??
|
||||||
|
tileTheme.isThreeLine ??
|
||||||
|
theme.listTileTheme.isThreeLine ??
|
||||||
|
false,
|
||||||
|
textDirection: textDirection,
|
||||||
|
titleBaselineType:
|
||||||
|
titleStyle.textBaseline ?? defaults.titleTextStyle!.textBaseline!,
|
||||||
|
subtitleBaselineType:
|
||||||
|
subtitleStyle?.textBaseline ??
|
||||||
|
defaults.subtitleTextStyle!.textBaseline!,
|
||||||
|
horizontalTitleGap:
|
||||||
|
horizontalTitleGap ?? tileTheme.horizontalTitleGap ?? 16,
|
||||||
|
minVerticalPadding:
|
||||||
|
minVerticalPadding ??
|
||||||
|
tileTheme.minVerticalPadding ??
|
||||||
|
defaults.minVerticalPadding!,
|
||||||
|
minLeadingWidth:
|
||||||
|
minLeadingWidth ??
|
||||||
|
tileTheme.minLeadingWidth ??
|
||||||
|
defaults.minLeadingWidth!,
|
||||||
|
minTileHeight: minTileHeight ?? tileTheme.minTileHeight,
|
||||||
|
titleAlignment: effectiveTitleAlignment,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
if (safeArea) {
|
||||||
|
child = SafeArea(
|
||||||
|
top: false,
|
||||||
|
bottom: false,
|
||||||
|
minimum: resolvedContentPadding,
|
||||||
|
child: child,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
child = Padding(
|
||||||
|
padding: resolvedContentPadding,
|
||||||
|
child: child,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return InkWell(
|
return InkWell(
|
||||||
customBorder: shape ?? tileTheme.shape,
|
customBorder: shape ?? tileTheme.shape,
|
||||||
onTap: enabled ? onTap : null,
|
onTap: enabled ? onTap : null,
|
||||||
onLongPress: enabled ? onLongPress : null,
|
onLongPress: enabled ? onLongPress : null,
|
||||||
|
onSecondaryTap: enabled ? onSecondaryTap : null,
|
||||||
onFocusChange: onFocusChange,
|
onFocusChange: onFocusChange,
|
||||||
mouseCursor: effectiveMouseCursor,
|
mouseCursor: effectiveMouseCursor,
|
||||||
canRequestFocus: enabled,
|
canRequestFocus: enabled,
|
||||||
@@ -947,50 +1007,7 @@ class ListTile extends StatelessWidget {
|
|||||||
shape: shape ?? tileTheme.shape ?? const Border(),
|
shape: shape ?? tileTheme.shape ?? const Border(),
|
||||||
color: _tileBackgroundColor(theme, tileTheme, defaults),
|
color: _tileBackgroundColor(theme, tileTheme, defaults),
|
||||||
),
|
),
|
||||||
child: Padding(
|
child: child,
|
||||||
padding: resolvedContentPadding,
|
|
||||||
child: IconTheme.merge(
|
|
||||||
data: iconThemeData,
|
|
||||||
child: IconButtonTheme(
|
|
||||||
data: iconButtonThemeData,
|
|
||||||
child: _ListTile(
|
|
||||||
leading: leadingIcon,
|
|
||||||
title: titleText,
|
|
||||||
subtitle: subtitleText,
|
|
||||||
trailing: trailingIcon,
|
|
||||||
isDense: _isDenseLayout(theme, tileTheme),
|
|
||||||
visualDensity:
|
|
||||||
visualDensity ??
|
|
||||||
tileTheme.visualDensity ??
|
|
||||||
theme.visualDensity,
|
|
||||||
isThreeLine:
|
|
||||||
isThreeLine ??
|
|
||||||
tileTheme.isThreeLine ??
|
|
||||||
theme.listTileTheme.isThreeLine ??
|
|
||||||
false,
|
|
||||||
textDirection: textDirection,
|
|
||||||
titleBaselineType:
|
|
||||||
titleStyle.textBaseline ??
|
|
||||||
defaults.titleTextStyle!.textBaseline!,
|
|
||||||
subtitleBaselineType:
|
|
||||||
subtitleStyle?.textBaseline ??
|
|
||||||
defaults.subtitleTextStyle!.textBaseline!,
|
|
||||||
horizontalTitleGap:
|
|
||||||
horizontalTitleGap ?? tileTheme.horizontalTitleGap ?? 16,
|
|
||||||
minVerticalPadding:
|
|
||||||
minVerticalPadding ??
|
|
||||||
tileTheme.minVerticalPadding ??
|
|
||||||
defaults.minVerticalPadding!,
|
|
||||||
minLeadingWidth:
|
|
||||||
minLeadingWidth ??
|
|
||||||
tileTheme.minLeadingWidth ??
|
|
||||||
defaults.minLeadingWidth!,
|
|
||||||
minTileHeight: minTileHeight ?? tileTheme.minTileHeight,
|
|
||||||
titleAlignment: effectiveTitleAlignment,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -138,6 +138,9 @@ class _AboutPageState extends State<AboutPage> {
|
|||||||
ListTile(
|
ListTile(
|
||||||
onTap: () => Update.checkUpdate(false),
|
onTap: () => Update.checkUpdate(false),
|
||||||
onLongPress: () => Utils.copyText(currentVersion),
|
onLongPress: () => Utils.copyText(currentVersion),
|
||||||
|
onSecondaryTap: Utils.isMobile
|
||||||
|
? null
|
||||||
|
: () => Utils.copyText(currentVersion),
|
||||||
title: const Text('当前版本'),
|
title: const Text('当前版本'),
|
||||||
leading: const Icon(Icons.commit_outlined),
|
leading: const Icon(Icons.commit_outlined),
|
||||||
trailing: Text(
|
trailing: Text(
|
||||||
@@ -157,6 +160,9 @@ Commit Hash: ${BuildConfig.commitHash}''',
|
|||||||
'${Constants.sourceCodeUrl}/commit/${BuildConfig.commitHash}',
|
'${Constants.sourceCodeUrl}/commit/${BuildConfig.commitHash}',
|
||||||
),
|
),
|
||||||
onLongPress: () => Utils.copyText(BuildConfig.commitHash),
|
onLongPress: () => Utils.copyText(BuildConfig.commitHash),
|
||||||
|
onSecondaryTap: Utils.isMobile
|
||||||
|
? null
|
||||||
|
: () => Utils.copyText(BuildConfig.commitHash),
|
||||||
),
|
),
|
||||||
Divider(
|
Divider(
|
||||||
thickness: 1,
|
thickness: 1,
|
||||||
@@ -194,6 +200,7 @@ Commit Hash: ${BuildConfig.commitHash}''',
|
|||||||
ListTile(
|
ListTile(
|
||||||
onTap: () => Get.toNamed('/logs'),
|
onTap: () => Get.toNamed('/logs'),
|
||||||
onLongPress: LoggerUtils.clearLogs,
|
onLongPress: LoggerUtils.clearLogs,
|
||||||
|
onSecondaryTap: Utils.isMobile ? null : LoggerUtils.clearLogs,
|
||||||
leading: const Icon(Icons.bug_report_outlined),
|
leading: const Icon(Icons.bug_report_outlined),
|
||||||
title: const Text('错误日志'),
|
title: const Text('错误日志'),
|
||||||
subtitle: Text('长按清除日志', style: subTitleStyle),
|
subtitle: Text('长按清除日志', style: subTitleStyle),
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import 'package:PiliPlus/utils/duration_utils.dart';
|
|||||||
import 'package:PiliPlus/utils/extension.dart';
|
import 'package:PiliPlus/utils/extension.dart';
|
||||||
import 'package:PiliPlus/utils/id_utils.dart';
|
import 'package:PiliPlus/utils/id_utils.dart';
|
||||||
import 'package:PiliPlus/utils/storage_pref.dart';
|
import 'package:PiliPlus/utils/storage_pref.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart' hide TabBarView;
|
import 'package:flutter/material.dart' hide TabBarView;
|
||||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
@@ -414,6 +415,12 @@ class _EpisodePanelState extends State<EpisodePanel>
|
|||||||
}
|
}
|
||||||
late final Color primary = theme.colorScheme.primary;
|
late final Color primary = theme.colorScheme.primary;
|
||||||
|
|
||||||
|
void onLongPress() {
|
||||||
|
if (cover?.isNotEmpty == true) {
|
||||||
|
imageSaveDialog(title: title, cover: cover, bvid: bvid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: const EdgeInsets.only(bottom: 2),
|
padding: const EdgeInsets.only(bottom: 2),
|
||||||
child: SizedBox(
|
child: SizedBox(
|
||||||
@@ -450,11 +457,8 @@ class _EpisodePanelState extends State<EpisodePanel>
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
onLongPress: () {
|
onLongPress: onLongPress,
|
||||||
if (cover?.isNotEmpty == true) {
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
imageSaveDialog(title: title, cover: cover, bvid: bvid);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.symmetric(
|
padding: const EdgeInsets.symmetric(
|
||||||
horizontal: StyleString.safeSpace,
|
horizontal: StyleString.safeSpace,
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import 'package:PiliPlus/pages/fav_detail/controller.dart';
|
|||||||
import 'package:PiliPlus/utils/date_utils.dart';
|
import 'package:PiliPlus/utils/date_utils.dart';
|
||||||
import 'package:PiliPlus/utils/duration_utils.dart';
|
import 'package:PiliPlus/utils/duration_utils.dart';
|
||||||
import 'package:PiliPlus/utils/page_utils.dart';
|
import 'package:PiliPlus/utils/page_utils.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
@@ -35,6 +36,21 @@ class FavVideoCardH extends StatelessWidget {
|
|||||||
final isOwner = !isSort && ctr!.isOwner;
|
final isOwner = !isSort && ctr!.isOwner;
|
||||||
late final enableMultiSelect = ctr?.enableMultiSelect.value ?? false;
|
late final enableMultiSelect = ctr?.enableMultiSelect.value ?? false;
|
||||||
final theme = Theme.of(context);
|
final theme = Theme.of(context);
|
||||||
|
|
||||||
|
final onLongPress = isSort || enableMultiSelect
|
||||||
|
? null
|
||||||
|
: isOwner && !enableMultiSelect
|
||||||
|
? () {
|
||||||
|
ctr!
|
||||||
|
..enableMultiSelect.value = true
|
||||||
|
..onSelect(item);
|
||||||
|
}
|
||||||
|
: () => imageSaveDialog(
|
||||||
|
title: item.title,
|
||||||
|
cover: item.cover,
|
||||||
|
bvid: item.bvid,
|
||||||
|
);
|
||||||
|
|
||||||
return Material(
|
return Material(
|
||||||
type: MaterialType.transparency,
|
type: MaterialType.transparency,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
@@ -59,19 +75,8 @@ class FavVideoCardH extends StatelessWidget {
|
|||||||
|
|
||||||
ctr!.onViewFav(item, index);
|
ctr!.onViewFav(item, index);
|
||||||
},
|
},
|
||||||
onLongPress: isSort || enableMultiSelect
|
onLongPress: onLongPress,
|
||||||
? null
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
: isOwner && !enableMultiSelect
|
|
||||||
? () {
|
|
||||||
ctr!
|
|
||||||
..enableMultiSelect.value = true
|
|
||||||
..onSelect(item);
|
|
||||||
}
|
|
||||||
: () => imageSaveDialog(
|
|
||||||
title: item.title,
|
|
||||||
cover: item.cover,
|
|
||||||
bvid: item.bvid,
|
|
||||||
),
|
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.symmetric(
|
padding: const EdgeInsets.symmetric(
|
||||||
horizontal: StyleString.safeSpace,
|
horizontal: StyleString.safeSpace,
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import 'package:PiliPlus/utils/date_utils.dart';
|
|||||||
import 'package:PiliPlus/utils/duration_utils.dart';
|
import 'package:PiliPlus/utils/duration_utils.dart';
|
||||||
import 'package:PiliPlus/utils/id_utils.dart';
|
import 'package:PiliPlus/utils/id_utils.dart';
|
||||||
import 'package:PiliPlus/utils/page_utils.dart';
|
import 'package:PiliPlus/utils/page_utils.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
@@ -37,6 +38,13 @@ class HistoryItem extends StatelessWidget {
|
|||||||
String bvid = item.history.bvid ?? IdUtils.av2bv(aid);
|
String bvid = item.history.bvid ?? IdUtils.av2bv(aid);
|
||||||
final business = item.history.business;
|
final business = item.history.business;
|
||||||
final enableMultiSelect = ctr.enableMultiSelect.value;
|
final enableMultiSelect = ctr.enableMultiSelect.value;
|
||||||
|
|
||||||
|
final onLongPress = enableMultiSelect
|
||||||
|
? null
|
||||||
|
: () => ctr
|
||||||
|
..enableMultiSelect.value = true
|
||||||
|
..onSelect(item);
|
||||||
|
|
||||||
return Material(
|
return Material(
|
||||||
type: MaterialType.transparency,
|
type: MaterialType.transparency,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
@@ -88,11 +96,8 @@ class HistoryItem extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onLongPress: enableMultiSelect
|
onLongPress: onLongPress,
|
||||||
? null
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
: () => ctr
|
|
||||||
..enableMultiSelect.value = true
|
|
||||||
..onSelect(item),
|
|
||||||
child: Stack(
|
child: Stack(
|
||||||
clipBehavior: Clip.none,
|
clipBehavior: Clip.none,
|
||||||
children: [
|
children: [
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import 'package:PiliPlus/models_new/later/list.dart';
|
|||||||
import 'package:PiliPlus/pages/later/controller.dart';
|
import 'package:PiliPlus/pages/later/controller.dart';
|
||||||
import 'package:PiliPlus/utils/duration_utils.dart';
|
import 'package:PiliPlus/utils/duration_utils.dart';
|
||||||
import 'package:PiliPlus/utils/page_utils.dart';
|
import 'package:PiliPlus/utils/page_utils.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
|
|
||||||
@@ -41,14 +42,18 @@ class VideoCardHLater extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
final theme = Theme.of(context);
|
final theme = Theme.of(context);
|
||||||
final enableMultiSelect = ctr.enableMultiSelect.value;
|
final enableMultiSelect = ctr.enableMultiSelect.value;
|
||||||
|
|
||||||
|
final onLongPress = enableMultiSelect
|
||||||
|
? null
|
||||||
|
: () => ctr
|
||||||
|
..enableMultiSelect.value = true
|
||||||
|
..onSelect(videoItem);
|
||||||
|
|
||||||
return Material(
|
return Material(
|
||||||
type: MaterialType.transparency,
|
type: MaterialType.transparency,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
onLongPress: enableMultiSelect
|
onLongPress: onLongPress,
|
||||||
? null
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
: () => ctr
|
|
||||||
..enableMultiSelect.value = true
|
|
||||||
..onSelect(videoItem),
|
|
||||||
onTap: enableMultiSelect
|
onTap: enableMultiSelect
|
||||||
? () => ctr.onSelect(videoItem)
|
? () => ctr.onSelect(videoItem)
|
||||||
: () async {
|
: () async {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
|||||||
import 'package:PiliPlus/models_new/live/live_feed_index/card_data_list_item.dart';
|
import 'package:PiliPlus/models_new/live/live_feed_index/card_data_list_item.dart';
|
||||||
import 'package:PiliPlus/utils/num_utils.dart';
|
import 'package:PiliPlus/utils/num_utils.dart';
|
||||||
import 'package:PiliPlus/utils/page_utils.dart';
|
import 'package:PiliPlus/utils/page_utils.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
// 视频卡片 - 垂直布局
|
// 视频卡片 - 垂直布局
|
||||||
@@ -17,14 +18,16 @@ class LiveCardVApp extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
void onLongPress() => imageSaveDialog(
|
||||||
|
title: item.title,
|
||||||
|
cover: item.cover,
|
||||||
|
);
|
||||||
return Card(
|
return Card(
|
||||||
clipBehavior: Clip.hardEdge,
|
clipBehavior: Clip.hardEdge,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
onTap: () => PageUtils.toLiveRoom(item.roomid),
|
onTap: () => PageUtils.toLiveRoom(item.roomid),
|
||||||
onLongPress: () => imageSaveDialog(
|
onLongPress: onLongPress,
|
||||||
title: item.title,
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
cover: item.cover,
|
|
||||||
),
|
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
AspectRatio(
|
AspectRatio(
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import 'package:PiliPlus/common/widgets/image/image_save.dart';
|
|||||||
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
||||||
import 'package:PiliPlus/models_new/live/live_follow/item.dart';
|
import 'package:PiliPlus/models_new/live/live_follow/item.dart';
|
||||||
import 'package:PiliPlus/utils/page_utils.dart';
|
import 'package:PiliPlus/utils/page_utils.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
// 视频卡片 - 垂直布局
|
// 视频卡片 - 垂直布局
|
||||||
@@ -16,14 +17,16 @@ class LiveCardVFollow extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
void onLongPress() => imageSaveDialog(
|
||||||
|
title: liveItem.title,
|
||||||
|
cover: liveItem.roomCover,
|
||||||
|
);
|
||||||
return Card(
|
return Card(
|
||||||
clipBehavior: Clip.hardEdge,
|
clipBehavior: Clip.hardEdge,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
onTap: () => PageUtils.toLiveRoom(liveItem.roomid),
|
onTap: () => PageUtils.toLiveRoom(liveItem.roomid),
|
||||||
onLongPress: () => imageSaveDialog(
|
onLongPress: onLongPress,
|
||||||
title: liveItem.title,
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
cover: liveItem.roomCover,
|
|
||||||
),
|
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
AspectRatio(
|
AspectRatio(
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
|||||||
import 'package:PiliPlus/models_new/live/live_search/room_item.dart';
|
import 'package:PiliPlus/models_new/live/live_search/room_item.dart';
|
||||||
import 'package:PiliPlus/utils/num_utils.dart';
|
import 'package:PiliPlus/utils/num_utils.dart';
|
||||||
import 'package:PiliPlus/utils/page_utils.dart';
|
import 'package:PiliPlus/utils/page_utils.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
// 视频卡片 - 垂直布局
|
// 视频卡片 - 垂直布局
|
||||||
@@ -17,14 +18,16 @@ class LiveCardVSearch extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
void onLongPress() => imageSaveDialog(
|
||||||
|
title: item.title,
|
||||||
|
cover: item.cover,
|
||||||
|
);
|
||||||
return Card(
|
return Card(
|
||||||
clipBehavior: Clip.hardEdge,
|
clipBehavior: Clip.hardEdge,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
onTap: () => PageUtils.toLiveRoom(item.roomid),
|
onTap: () => PageUtils.toLiveRoom(item.roomid),
|
||||||
onLongPress: () => imageSaveDialog(
|
onLongPress: onLongPress,
|
||||||
title: item.title,
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
cover: item.cover,
|
|
||||||
),
|
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import 'package:PiliPlus/common/widgets/stat/stat.dart';
|
|||||||
import 'package:PiliPlus/models/common/stat_type.dart';
|
import 'package:PiliPlus/models/common/stat_type.dart';
|
||||||
import 'package:PiliPlus/models_new/space/space_article/item.dart';
|
import 'package:PiliPlus/models_new/space/space_article/item.dart';
|
||||||
import 'package:PiliPlus/utils/app_scheme.dart';
|
import 'package:PiliPlus/utils/app_scheme.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class MemberArticleItem extends StatelessWidget {
|
class MemberArticleItem extends StatelessWidget {
|
||||||
@@ -16,6 +17,10 @@ class MemberArticleItem extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final theme = Theme.of(context);
|
final theme = Theme.of(context);
|
||||||
final outline = theme.colorScheme.outline;
|
final outline = theme.colorScheme.outline;
|
||||||
|
void onLongPress() => imageSaveDialog(
|
||||||
|
title: item.title,
|
||||||
|
cover: item.originImageUrls?.firstOrNull,
|
||||||
|
);
|
||||||
return Material(
|
return Material(
|
||||||
type: MaterialType.transparency,
|
type: MaterialType.transparency,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
@@ -24,10 +29,8 @@ class MemberArticleItem extends StatelessWidget {
|
|||||||
PiliScheme.routePushFromUrl(item.uri!);
|
PiliScheme.routePushFromUrl(item.uri!);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onLongPress: () => imageSaveDialog(
|
onLongPress: onLongPress,
|
||||||
title: item.title,
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
cover: item.originImageUrls?.firstOrNull,
|
|
||||||
),
|
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.symmetric(
|
padding: const EdgeInsets.symmetric(
|
||||||
horizontal: StyleString.safeSpace,
|
horizontal: StyleString.safeSpace,
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import 'package:PiliPlus/models/common/stat_type.dart';
|
|||||||
import 'package:PiliPlus/models_new/space/space_audio/item.dart';
|
import 'package:PiliPlus/models_new/space/space_audio/item.dart';
|
||||||
import 'package:PiliPlus/utils/date_utils.dart';
|
import 'package:PiliPlus/utils/date_utils.dart';
|
||||||
import 'package:PiliPlus/utils/page_utils.dart';
|
import 'package:PiliPlus/utils/page_utils.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
|
|
||||||
@@ -19,6 +20,7 @@ class MemberAudioItem extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final theme = Theme.of(context);
|
final theme = Theme.of(context);
|
||||||
final hasStat = item.statistic != null;
|
final hasStat = item.statistic != null;
|
||||||
|
void onLongPress() => imageSaveDialog(title: item.title, cover: item.cover);
|
||||||
return Material(
|
return Material(
|
||||||
type: MaterialType.transparency,
|
type: MaterialType.transparency,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
@@ -35,8 +37,8 @@ class MemberAudioItem extends StatelessWidget {
|
|||||||
SmartDialog.showToast('没有MV');
|
SmartDialog.showToast('没有MV');
|
||||||
return;
|
return;
|
||||||
},
|
},
|
||||||
onLongPress: () =>
|
onLongPress: onLongPress,
|
||||||
imageSaveDialog(title: item.title, cover: item.cover),
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.symmetric(
|
padding: const EdgeInsets.symmetric(
|
||||||
horizontal: StyleString.safeSpace,
|
horizontal: StyleString.safeSpace,
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
|||||||
import 'package:PiliPlus/models_new/space/space_cheese/item.dart';
|
import 'package:PiliPlus/models_new/space/space_cheese/item.dart';
|
||||||
import 'package:PiliPlus/utils/date_utils.dart';
|
import 'package:PiliPlus/utils/date_utils.dart';
|
||||||
import 'package:PiliPlus/utils/page_utils.dart';
|
import 'package:PiliPlus/utils/page_utils.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class MemberCheeseItem extends StatelessWidget {
|
class MemberCheeseItem extends StatelessWidget {
|
||||||
@@ -72,12 +73,13 @@ class MemberCheeseItem extends StatelessWidget {
|
|||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
void onLongPress() => imageSaveDialog(title: item.title, cover: item.cover);
|
||||||
return Material(
|
return Material(
|
||||||
type: MaterialType.transparency,
|
type: MaterialType.transparency,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
onTap: () => PageUtils.viewPugv(seasonId: item.seasonId),
|
onTap: () => PageUtils.viewPugv(seasonId: item.seasonId),
|
||||||
onLongPress: () =>
|
onLongPress: onLongPress,
|
||||||
imageSaveDialog(title: item.title, cover: item.cover),
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.symmetric(
|
padding: const EdgeInsets.symmetric(
|
||||||
horizontal: StyleString.safeSpace,
|
horizontal: StyleString.safeSpace,
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import 'package:PiliPlus/models_new/member/coin_like_arc/item.dart';
|
|||||||
import 'package:PiliPlus/utils/date_utils.dart';
|
import 'package:PiliPlus/utils/date_utils.dart';
|
||||||
import 'package:PiliPlus/utils/duration_utils.dart';
|
import 'package:PiliPlus/utils/duration_utils.dart';
|
||||||
import 'package:PiliPlus/utils/page_utils.dart';
|
import 'package:PiliPlus/utils/page_utils.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class MemberCoinLikeItem extends StatelessWidget {
|
class MemberCoinLikeItem extends StatelessWidget {
|
||||||
@@ -23,6 +24,11 @@ class MemberCoinLikeItem extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
void onLongPress() => imageSaveDialog(
|
||||||
|
title: item.title,
|
||||||
|
cover: item.cover,
|
||||||
|
aid: item.param,
|
||||||
|
);
|
||||||
return Card(
|
return Card(
|
||||||
clipBehavior: Clip.hardEdge,
|
clipBehavior: Clip.hardEdge,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
@@ -46,11 +52,8 @@ class MemberCoinLikeItem extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onLongPress: () => imageSaveDialog(
|
onLongPress: onLongPress,
|
||||||
title: item.title,
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
cover: item.cover,
|
|
||||||
aid: item.param,
|
|
||||||
),
|
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import 'package:PiliPlus/common/constants.dart';
|
|||||||
import 'package:PiliPlus/common/widgets/image/image_save.dart';
|
import 'package:PiliPlus/common/widgets/image/image_save.dart';
|
||||||
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
||||||
import 'package:PiliPlus/models_new/space/space_archive/item.dart';
|
import 'package:PiliPlus/models_new/space/space_archive/item.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
@@ -17,6 +18,7 @@ class MemberComicItem extends StatelessWidget {
|
|||||||
fontSize: 13,
|
fontSize: 13,
|
||||||
color: theme.colorScheme.onSurfaceVariant,
|
color: theme.colorScheme.onSurfaceVariant,
|
||||||
);
|
);
|
||||||
|
void onLongPress() => imageSaveDialog(title: item.title, cover: item.cover);
|
||||||
return Material(
|
return Material(
|
||||||
type: MaterialType.transparency,
|
type: MaterialType.transparency,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
@@ -28,8 +30,8 @@ class MemberComicItem extends StatelessWidget {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
onLongPress: () =>
|
onLongPress: onLongPress,
|
||||||
imageSaveDialog(title: item.title, cover: item.cover),
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.symmetric(
|
padding: const EdgeInsets.symmetric(
|
||||||
horizontal: StyleString.safeSpace,
|
horizontal: StyleString.safeSpace,
|
||||||
|
|||||||
@@ -19,6 +19,10 @@ class MemberFavItem extends StatelessWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final theme = Theme.of(context);
|
final theme = Theme.of(context);
|
||||||
|
void onLongPress() => imageSaveDialog(
|
||||||
|
title: item.title,
|
||||||
|
cover: item.cover,
|
||||||
|
);
|
||||||
return Material(
|
return Material(
|
||||||
type: MaterialType.transparency,
|
type: MaterialType.transparency,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
@@ -44,10 +48,8 @@ class MemberFavItem extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onLongPress: () => imageSaveDialog(
|
onLongPress: onLongPress,
|
||||||
title: item.title,
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
cover: item.cover,
|
|
||||||
),
|
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.symmetric(
|
padding: const EdgeInsets.symmetric(
|
||||||
horizontal: StyleString.safeSpace,
|
horizontal: StyleString.safeSpace,
|
||||||
|
|||||||
@@ -13,6 +13,10 @@ class MemberFavItem extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
void onLongPress() => imageSaveDialog(
|
||||||
|
title: item.title,
|
||||||
|
cover: item.cover,
|
||||||
|
);
|
||||||
return Material(
|
return Material(
|
||||||
type: MaterialType.transparency,
|
type: MaterialType.transparency,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
@@ -25,10 +29,8 @@ class MemberFavItem extends StatelessWidget {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
onLongPress: () => imageSaveDialog(
|
onLongPress: onLongPress,
|
||||||
title: item.title,
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
cover: item.cover,
|
|
||||||
),
|
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.symmetric(
|
padding: const EdgeInsets.symmetric(
|
||||||
horizontal: StyleString.safeSpace,
|
horizontal: StyleString.safeSpace,
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import 'package:PiliPlus/utils/app_scheme.dart';
|
|||||||
import 'package:PiliPlus/utils/duration_utils.dart';
|
import 'package:PiliPlus/utils/duration_utils.dart';
|
||||||
import 'package:PiliPlus/utils/id_utils.dart';
|
import 'package:PiliPlus/utils/id_utils.dart';
|
||||||
import 'package:PiliPlus/utils/page_utils.dart';
|
import 'package:PiliPlus/utils/page_utils.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
// 视频卡片 - 垂直布局
|
// 视频卡片 - 垂直布局
|
||||||
@@ -62,16 +63,18 @@ class VideoCardVMemberHome extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
void onLongPress() => imageSaveDialog(
|
||||||
|
title: videoItem.title,
|
||||||
|
cover: videoItem.cover,
|
||||||
|
aid: videoItem.param,
|
||||||
|
bvid: videoItem.bvid,
|
||||||
|
);
|
||||||
return Card(
|
return Card(
|
||||||
clipBehavior: Clip.hardEdge,
|
clipBehavior: Clip.hardEdge,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
onTap: onPushDetail,
|
onTap: onPushDetail,
|
||||||
onLongPress: () => imageSaveDialog(
|
onLongPress: onLongPress,
|
||||||
title: videoItem.title,
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
cover: videoItem.cover,
|
|
||||||
aid: videoItem.param,
|
|
||||||
bvid: videoItem.bvid,
|
|
||||||
),
|
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import 'package:PiliPlus/common/widgets/image/image_save.dart';
|
|||||||
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
||||||
import 'package:PiliPlus/models_new/space/space_archive/item.dart';
|
import 'package:PiliPlus/models_new/space/space_archive/item.dart';
|
||||||
import 'package:PiliPlus/utils/page_utils.dart';
|
import 'package:PiliPlus/utils/page_utils.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
// 视频卡片 - 垂直布局
|
// 视频卡片 - 垂直布局
|
||||||
@@ -16,15 +17,17 @@ class PgcCardVMemberPgc extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
void onLongPress() => imageSaveDialog(
|
||||||
|
title: item.title,
|
||||||
|
cover: item.cover,
|
||||||
|
);
|
||||||
return Card(
|
return Card(
|
||||||
shape: const RoundedRectangleBorder(borderRadius: StyleString.mdRadius),
|
shape: const RoundedRectangleBorder(borderRadius: StyleString.mdRadius),
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
borderRadius: StyleString.mdRadius,
|
borderRadius: StyleString.mdRadius,
|
||||||
onTap: () => PageUtils.viewPgc(seasonId: item.param),
|
onTap: () => PageUtils.viewPgc(seasonId: item.param),
|
||||||
onLongPress: () => imageSaveDialog(
|
onLongPress: onLongPress,
|
||||||
title: item.title,
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
cover: item.cover,
|
|
||||||
),
|
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import 'package:PiliPlus/common/widgets/image/image_save.dart';
|
|||||||
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
||||||
import 'package:PiliPlus/models_new/space/space_season_series/season.dart';
|
import 'package:PiliPlus/models_new/space/space_season_series/season.dart';
|
||||||
import 'package:PiliPlus/utils/date_utils.dart';
|
import 'package:PiliPlus/utils/date_utils.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class SeasonSeriesCard extends StatelessWidget {
|
class SeasonSeriesCard extends StatelessWidget {
|
||||||
@@ -17,13 +18,15 @@ class SeasonSeriesCard extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
void onLongPress() => imageSaveDialog(
|
||||||
|
title: item.meta!.name,
|
||||||
|
cover: item.meta!.cover,
|
||||||
|
);
|
||||||
return Material(
|
return Material(
|
||||||
type: MaterialType.transparency,
|
type: MaterialType.transparency,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
onLongPress: () => imageSaveDialog(
|
onLongPress: onLongPress,
|
||||||
title: item.meta!.name,
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
cover: item.meta!.cover,
|
|
||||||
),
|
|
||||||
onTap: onTap,
|
onTap: onTap,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.symmetric(
|
padding: const EdgeInsets.symmetric(
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import 'package:PiliPlus/models_new/space/space_archive/item.dart';
|
|||||||
import 'package:PiliPlus/utils/date_utils.dart';
|
import 'package:PiliPlus/utils/date_utils.dart';
|
||||||
import 'package:PiliPlus/utils/duration_utils.dart';
|
import 'package:PiliPlus/utils/duration_utils.dart';
|
||||||
import 'package:PiliPlus/utils/page_utils.dart';
|
import 'package:PiliPlus/utils/page_utils.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
|
|
||||||
@@ -31,17 +32,19 @@ class VideoCardHMemberVideo extends StatelessWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final theme = Theme.of(context);
|
final theme = Theme.of(context);
|
||||||
|
void onLongPress() => imageSaveDialog(
|
||||||
|
title: videoItem.title,
|
||||||
|
cover: videoItem.cover,
|
||||||
|
bvid: videoItem.bvid,
|
||||||
|
);
|
||||||
return Material(
|
return Material(
|
||||||
type: MaterialType.transparency,
|
type: MaterialType.transparency,
|
||||||
child: Stack(
|
child: Stack(
|
||||||
clipBehavior: Clip.none,
|
clipBehavior: Clip.none,
|
||||||
children: [
|
children: [
|
||||||
InkWell(
|
InkWell(
|
||||||
onLongPress: () => imageSaveDialog(
|
onLongPress: onLongPress,
|
||||||
title: videoItem.title,
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
cover: videoItem.cover,
|
|
||||||
bvid: videoItem.bvid,
|
|
||||||
),
|
|
||||||
onTap:
|
onTap:
|
||||||
onTap ??
|
onTap ??
|
||||||
() async {
|
() async {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import 'package:PiliPlus/common/skeleton/msg_feed_top.dart';
|
import 'package:PiliPlus/common/skeleton/msg_feed_top.dart';
|
||||||
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
|
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
|
||||||
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
||||||
|
import 'package:PiliPlus/common/widgets/list_tile.dart';
|
||||||
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
|
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
|
||||||
import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
|
import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
|
||||||
import 'package:PiliPlus/grpc/bilibili/app/im/v1.pbenum.dart'
|
import 'package:PiliPlus/grpc/bilibili/app/im/v1.pbenum.dart'
|
||||||
@@ -12,7 +13,8 @@ import 'package:PiliPlus/pages/msg_feed_top/at_me/controller.dart';
|
|||||||
import 'package:PiliPlus/pages/whisper_settings/view.dart';
|
import 'package:PiliPlus/pages/whisper_settings/view.dart';
|
||||||
import 'package:PiliPlus/utils/app_scheme.dart';
|
import 'package:PiliPlus/utils/app_scheme.dart';
|
||||||
import 'package:PiliPlus/utils/date_utils.dart';
|
import 'package:PiliPlus/utils/date_utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
|
import 'package:flutter/material.dart' hide ListTile;
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
class AtMePage extends StatefulWidget {
|
class AtMePage extends StatefulWidget {
|
||||||
@@ -91,7 +93,13 @@ class _AtMePageState extends State<AtMePage> {
|
|||||||
_atMeController.onLoadMore();
|
_atMeController.onLoadMore();
|
||||||
}
|
}
|
||||||
final item = response[index];
|
final item = response[index];
|
||||||
|
void onLongPress() => showConfirmDialog(
|
||||||
|
context: context,
|
||||||
|
title: '确定删除该通知?',
|
||||||
|
onConfirm: () => _atMeController.onRemove(item.id, index),
|
||||||
|
);
|
||||||
return ListTile(
|
return ListTile(
|
||||||
|
safeArea: true,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
String? nativeUri = item.item?.nativeUri;
|
String? nativeUri = item.item?.nativeUri;
|
||||||
if (nativeUri == null ||
|
if (nativeUri == null ||
|
||||||
@@ -101,11 +109,8 @@ class _AtMePageState extends State<AtMePage> {
|
|||||||
}
|
}
|
||||||
PiliScheme.routePushFromUrl(nativeUri);
|
PiliScheme.routePushFromUrl(nativeUri);
|
||||||
},
|
},
|
||||||
onLongPress: () => showConfirmDialog(
|
onLongPress: onLongPress,
|
||||||
context: context,
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
title: '确定删除该通知?',
|
|
||||||
onConfirm: () => _atMeController.onRemove(item.id, index),
|
|
||||||
),
|
|
||||||
leading: GestureDetector(
|
leading: GestureDetector(
|
||||||
onTap: () => Get.toNamed('/member?mid=${item.user?.mid}'),
|
onTap: () => Get.toNamed('/member?mid=${item.user?.mid}'),
|
||||||
child: NetworkImgLayer(
|
child: NetworkImgLayer(
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import 'package:PiliPlus/common/skeleton/msg_feed_top.dart';
|
import 'package:PiliPlus/common/skeleton/msg_feed_top.dart';
|
||||||
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
|
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
|
||||||
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
||||||
|
import 'package:PiliPlus/common/widgets/list_tile.dart';
|
||||||
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
|
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
|
||||||
import 'package:PiliPlus/common/widgets/pair.dart';
|
import 'package:PiliPlus/common/widgets/pair.dart';
|
||||||
import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
|
import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
|
||||||
@@ -13,7 +14,8 @@ import 'package:PiliPlus/pages/msg_feed_top/like_me/controller.dart';
|
|||||||
import 'package:PiliPlus/pages/whisper_settings/view.dart';
|
import 'package:PiliPlus/pages/whisper_settings/view.dart';
|
||||||
import 'package:PiliPlus/utils/app_scheme.dart';
|
import 'package:PiliPlus/utils/app_scheme.dart';
|
||||||
import 'package:PiliPlus/utils/date_utils.dart';
|
import 'package:PiliPlus/utils/date_utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
|
import 'package:flutter/material.dart' hide ListTile;
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
class LikeMePage extends StatefulWidget {
|
class LikeMePage extends StatefulWidget {
|
||||||
@@ -162,7 +164,60 @@ class _LikeMePageState extends State<LikeMePage> {
|
|||||||
MsgLikeItem item,
|
MsgLikeItem item,
|
||||||
ValueChanged<int?> onRemove,
|
ValueChanged<int?> onRemove,
|
||||||
) {
|
) {
|
||||||
|
void onLongPress() => showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) {
|
||||||
|
final isNotice = item.noticeState == 0;
|
||||||
|
return AlertDialog(
|
||||||
|
clipBehavior: Clip.hardEdge,
|
||||||
|
contentPadding: const EdgeInsets.symmetric(vertical: 12),
|
||||||
|
content: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
ListTile(
|
||||||
|
onTap: () {
|
||||||
|
Get.back();
|
||||||
|
showConfirmDialog(
|
||||||
|
context: context,
|
||||||
|
title: '删除',
|
||||||
|
content: '该条通知删除后,当有新点赞时会重新出现在列表,是否继续?',
|
||||||
|
onConfirm: () => onRemove(item.id),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
dense: true,
|
||||||
|
title: const Text(
|
||||||
|
'删除',
|
||||||
|
style: TextStyle(fontSize: 14),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
ListTile(
|
||||||
|
onTap: () {
|
||||||
|
Get.back();
|
||||||
|
if (isNotice) {
|
||||||
|
showConfirmDialog(
|
||||||
|
context: context,
|
||||||
|
title: '不再通知',
|
||||||
|
content: '这条内容的点赞将不再通知,但仍可在列表内查看,是否继续?',
|
||||||
|
onConfirm: () =>
|
||||||
|
_likeMeController.onSetNotice(item, isNotice),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
_likeMeController.onSetNotice(item, isNotice);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
dense: true,
|
||||||
|
title: Text(
|
||||||
|
isNotice ? '不再通知' : '接收通知',
|
||||||
|
style: const TextStyle(fontSize: 14),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
return ListTile(
|
return ListTile(
|
||||||
|
safeArea: true,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
String? nativeUri = item.item?.nativeUri;
|
String? nativeUri = item.item?.nativeUri;
|
||||||
bool isInvalid =
|
bool isInvalid =
|
||||||
@@ -183,58 +238,8 @@ class _LikeMePageState extends State<LikeMePage> {
|
|||||||
}
|
}
|
||||||
PiliScheme.routePushFromUrl(nativeUri);
|
PiliScheme.routePushFromUrl(nativeUri);
|
||||||
},
|
},
|
||||||
onLongPress: () => showDialog(
|
onLongPress: onLongPress,
|
||||||
context: context,
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
builder: (context) {
|
|
||||||
final isNotice = item.noticeState == 0;
|
|
||||||
return AlertDialog(
|
|
||||||
clipBehavior: Clip.hardEdge,
|
|
||||||
contentPadding: const EdgeInsets.symmetric(vertical: 12),
|
|
||||||
content: Column(
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
children: [
|
|
||||||
ListTile(
|
|
||||||
onTap: () {
|
|
||||||
Get.back();
|
|
||||||
showConfirmDialog(
|
|
||||||
context: context,
|
|
||||||
title: '删除',
|
|
||||||
content: '该条通知删除后,当有新点赞时会重新出现在列表,是否继续?',
|
|
||||||
onConfirm: () => onRemove(item.id),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
dense: true,
|
|
||||||
title: const Text(
|
|
||||||
'删除',
|
|
||||||
style: TextStyle(fontSize: 14),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
ListTile(
|
|
||||||
onTap: () {
|
|
||||||
Get.back();
|
|
||||||
if (isNotice) {
|
|
||||||
showConfirmDialog(
|
|
||||||
context: context,
|
|
||||||
title: '不再通知',
|
|
||||||
content: '这条内容的点赞将不再通知,但仍可在列表内查看,是否继续?',
|
|
||||||
onConfirm: () =>
|
|
||||||
_likeMeController.onSetNotice(item, isNotice),
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
_likeMeController.onSetNotice(item, isNotice);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
dense: true,
|
|
||||||
title: Text(
|
|
||||||
isNotice ? '不再通知' : '接收通知',
|
|
||||||
style: const TextStyle(fontSize: 14),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
leading: Column(
|
leading: Column(
|
||||||
children: [
|
children: [
|
||||||
const Spacer(),
|
const Spacer(),
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import 'package:PiliPlus/common/skeleton/msg_feed_top.dart';
|
import 'package:PiliPlus/common/skeleton/msg_feed_top.dart';
|
||||||
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
|
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
|
||||||
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
||||||
|
import 'package:PiliPlus/common/widgets/list_tile.dart';
|
||||||
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
|
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
|
||||||
import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
|
import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
|
||||||
import 'package:PiliPlus/grpc/bilibili/app/im/v1.pbenum.dart'
|
import 'package:PiliPlus/grpc/bilibili/app/im/v1.pbenum.dart'
|
||||||
@@ -12,7 +13,8 @@ import 'package:PiliPlus/pages/msg_feed_top/reply_me/controller.dart';
|
|||||||
import 'package:PiliPlus/pages/whisper_settings/view.dart';
|
import 'package:PiliPlus/pages/whisper_settings/view.dart';
|
||||||
import 'package:PiliPlus/utils/app_scheme.dart';
|
import 'package:PiliPlus/utils/app_scheme.dart';
|
||||||
import 'package:PiliPlus/utils/date_utils.dart';
|
import 'package:PiliPlus/utils/date_utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
|
import 'package:flutter/material.dart' hide ListTile;
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
class ReplyMePage extends StatefulWidget {
|
class ReplyMePage extends StatefulWidget {
|
||||||
@@ -92,7 +94,16 @@ class _ReplyMePageState extends State<ReplyMePage> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
MsgReplyItem item = response[index];
|
MsgReplyItem item = response[index];
|
||||||
|
|
||||||
|
void onLongPress() => showConfirmDialog(
|
||||||
|
context: context,
|
||||||
|
title: '确定删除该通知?',
|
||||||
|
onConfirm: () =>
|
||||||
|
_replyMeController.onRemove(item.id, index),
|
||||||
|
);
|
||||||
|
|
||||||
return ListTile(
|
return ListTile(
|
||||||
|
safeArea: true,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
String? nativeUri = item.item?.nativeUri;
|
String? nativeUri = item.item?.nativeUri;
|
||||||
if (nativeUri == null ||
|
if (nativeUri == null ||
|
||||||
@@ -106,12 +117,8 @@ class _ReplyMePageState extends State<ReplyMePage> {
|
|||||||
oid: item.item?.subjectId,
|
oid: item.item?.subjectId,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
onLongPress: () => showConfirmDialog(
|
onLongPress: onLongPress,
|
||||||
context: context,
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
title: '确定删除该通知?',
|
|
||||||
onConfirm: () =>
|
|
||||||
_replyMeController.onRemove(item.id, index),
|
|
||||||
),
|
|
||||||
leading: GestureDetector(
|
leading: GestureDetector(
|
||||||
onTap: () => Get.toNamed('/member?mid=${item.user?.mid}'),
|
onTap: () => Get.toNamed('/member?mid=${item.user?.mid}'),
|
||||||
child: NetworkImgLayer(
|
child: NetworkImgLayer(
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import 'package:PiliPlus/common/skeleton/msg_feed_sys_msg_.dart';
|
import 'package:PiliPlus/common/skeleton/msg_feed_sys_msg_.dart';
|
||||||
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
|
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
|
||||||
|
import 'package:PiliPlus/common/widgets/list_tile.dart';
|
||||||
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
|
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
|
||||||
import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
|
import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
|
||||||
import 'package:PiliPlus/http/loading_state.dart';
|
import 'package:PiliPlus/http/loading_state.dart';
|
||||||
@@ -10,7 +11,7 @@ import 'package:PiliPlus/utils/id_utils.dart';
|
|||||||
import 'package:PiliPlus/utils/page_utils.dart';
|
import 'package:PiliPlus/utils/page_utils.dart';
|
||||||
import 'package:PiliPlus/utils/utils.dart';
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/gestures.dart';
|
import 'package:flutter/gestures.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart' hide ListTile;
|
||||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
@@ -78,13 +79,15 @@ class _SysMsgPageState extends State<SysMsgPage> {
|
|||||||
_sysMsgController.onLoadMore();
|
_sysMsgController.onLoadMore();
|
||||||
}
|
}
|
||||||
final item = response[index];
|
final item = response[index];
|
||||||
|
void onLongPress() => showConfirmDialog(
|
||||||
|
context: context,
|
||||||
|
title: '确定删除该通知?',
|
||||||
|
onConfirm: () => _sysMsgController.onRemove(item.id, index),
|
||||||
|
);
|
||||||
return ListTile(
|
return ListTile(
|
||||||
onLongPress: () => showConfirmDialog(
|
safeArea: true,
|
||||||
context: context,
|
onLongPress: onLongPress,
|
||||||
title: '确定删除该通知?',
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
onConfirm: () =>
|
|
||||||
_sysMsgController.onRemove(item.id, index),
|
|
||||||
),
|
|
||||||
title: Text(
|
title: Text(
|
||||||
"${item.title}",
|
"${item.title}",
|
||||||
style: theme.textTheme.titleMedium,
|
style: theme.textTheme.titleMedium,
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import 'package:PiliPlus/models/common/stat_type.dart';
|
|||||||
import 'package:PiliPlus/models_new/music/bgm_recommend_list.dart';
|
import 'package:PiliPlus/models_new/music/bgm_recommend_list.dart';
|
||||||
import 'package:PiliPlus/utils/duration_utils.dart';
|
import 'package:PiliPlus/utils/duration_utils.dart';
|
||||||
import 'package:PiliPlus/utils/page_utils.dart';
|
import 'package:PiliPlus/utils/page_utils.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class MusicVideoCardH extends StatelessWidget {
|
class MusicVideoCardH extends StatelessWidget {
|
||||||
@@ -22,6 +23,11 @@ class MusicVideoCardH extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
void onLongPress() => imageSaveDialog(
|
||||||
|
title: videoItem.title,
|
||||||
|
cover: videoItem.cover,
|
||||||
|
bvid: videoItem.bvid,
|
||||||
|
);
|
||||||
return Material(
|
return Material(
|
||||||
type: MaterialType.transparency,
|
type: MaterialType.transparency,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
@@ -37,11 +43,8 @@ class MusicVideoCardH extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onLongPress: () => imageSaveDialog(
|
onLongPress: onLongPress,
|
||||||
title: videoItem.title,
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
cover: videoItem.cover,
|
|
||||||
bvid: videoItem.bvid,
|
|
||||||
),
|
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.symmetric(
|
padding: const EdgeInsets.symmetric(
|
||||||
horizontal: StyleString.safeSpace,
|
horizontal: StyleString.safeSpace,
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
|||||||
import 'package:PiliPlus/models/common/badge_type.dart';
|
import 'package:PiliPlus/models/common/badge_type.dart';
|
||||||
import 'package:PiliPlus/models_new/fav/fav_pgc/list.dart';
|
import 'package:PiliPlus/models_new/fav/fav_pgc/list.dart';
|
||||||
import 'package:PiliPlus/utils/page_utils.dart';
|
import 'package:PiliPlus/utils/page_utils.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
// 视频卡片 - 垂直布局
|
// 视频卡片 - 垂直布局
|
||||||
@@ -18,14 +19,16 @@ class PgcCardV extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
void onLongPress() => imageSaveDialog(
|
||||||
|
title: item.title,
|
||||||
|
cover: item.cover,
|
||||||
|
);
|
||||||
return Card(
|
return Card(
|
||||||
shape: const RoundedRectangleBorder(borderRadius: StyleString.mdRadius),
|
shape: const RoundedRectangleBorder(borderRadius: StyleString.mdRadius),
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
borderRadius: StyleString.mdRadius,
|
borderRadius: StyleString.mdRadius,
|
||||||
onLongPress: () => imageSaveDialog(
|
onLongPress: onLongPress,
|
||||||
title: item.title,
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
cover: item.cover,
|
|
||||||
),
|
|
||||||
onTap: () => PageUtils.viewPgc(seasonId: item.seasonId),
|
onTap: () => PageUtils.viewPgc(seasonId: item.seasonId),
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
|||||||
import 'package:PiliPlus/models/common/badge_type.dart';
|
import 'package:PiliPlus/models/common/badge_type.dart';
|
||||||
import 'package:PiliPlus/models_new/pgc/pgc_timeline/episode.dart';
|
import 'package:PiliPlus/models_new/pgc/pgc_timeline/episode.dart';
|
||||||
import 'package:PiliPlus/utils/page_utils.dart';
|
import 'package:PiliPlus/utils/page_utils.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
// 视频卡片 - 垂直布局
|
// 视频卡片 - 垂直布局
|
||||||
@@ -18,14 +19,16 @@ class PgcCardVTimeline extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
void onLongPress() => imageSaveDialog(
|
||||||
|
title: item.title,
|
||||||
|
cover: item.cover,
|
||||||
|
);
|
||||||
return Card(
|
return Card(
|
||||||
shape: const RoundedRectangleBorder(borderRadius: StyleString.mdRadius),
|
shape: const RoundedRectangleBorder(borderRadius: StyleString.mdRadius),
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
borderRadius: StyleString.mdRadius,
|
borderRadius: StyleString.mdRadius,
|
||||||
onLongPress: () => imageSaveDialog(
|
onLongPress: onLongPress,
|
||||||
title: item.title,
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
cover: item.cover,
|
|
||||||
),
|
|
||||||
onTap: () =>
|
onTap: () =>
|
||||||
PageUtils.viewPgc(seasonId: item.seasonId, epId: item.episodeId),
|
PageUtils.viewPgc(seasonId: item.seasonId, epId: item.episodeId),
|
||||||
child: Column(
|
child: Column(
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
|||||||
import 'package:PiliPlus/models/common/badge_type.dart';
|
import 'package:PiliPlus/models/common/badge_type.dart';
|
||||||
import 'package:PiliPlus/models_new/pgc/pgc_index_result/list.dart';
|
import 'package:PiliPlus/models_new/pgc/pgc_index_result/list.dart';
|
||||||
import 'package:PiliPlus/utils/page_utils.dart';
|
import 'package:PiliPlus/utils/page_utils.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
// 视频卡片 - 垂直布局
|
// 视频卡片 - 垂直布局
|
||||||
@@ -18,15 +19,17 @@ class PgcCardVPgcIndex extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
void onLongPress() => imageSaveDialog(
|
||||||
|
title: item.title,
|
||||||
|
cover: item.cover,
|
||||||
|
);
|
||||||
return Card(
|
return Card(
|
||||||
shape: const RoundedRectangleBorder(borderRadius: StyleString.mdRadius),
|
shape: const RoundedRectangleBorder(borderRadius: StyleString.mdRadius),
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
borderRadius: StyleString.mdRadius,
|
borderRadius: StyleString.mdRadius,
|
||||||
onLongPress: () => imageSaveDialog(
|
|
||||||
title: item.title,
|
|
||||||
cover: item.cover,
|
|
||||||
),
|
|
||||||
onTap: () => PageUtils.viewPgc(seasonId: item.seasonId),
|
onTap: () => PageUtils.viewPgc(seasonId: item.seasonId),
|
||||||
|
onLongPress: onLongPress,
|
||||||
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import 'package:PiliPlus/common/widgets/stat/stat.dart';
|
|||||||
import 'package:PiliPlus/models/common/stat_type.dart';
|
import 'package:PiliPlus/models/common/stat_type.dart';
|
||||||
import 'package:PiliPlus/models_new/pgc/pgc_rank/pgc_rank_item_model.dart';
|
import 'package:PiliPlus/models_new/pgc/pgc_rank/pgc_rank_item_model.dart';
|
||||||
import 'package:PiliPlus/utils/app_scheme.dart';
|
import 'package:PiliPlus/utils/app_scheme.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class PgcRankItem extends StatelessWidget {
|
class PgcRankItem extends StatelessWidget {
|
||||||
@@ -14,6 +15,10 @@ class PgcRankItem extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
void onLongPress() => imageSaveDialog(
|
||||||
|
title: item.title,
|
||||||
|
cover: item.cover,
|
||||||
|
);
|
||||||
return Material(
|
return Material(
|
||||||
type: MaterialType.transparency,
|
type: MaterialType.transparency,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
@@ -22,10 +27,8 @@ class PgcRankItem extends StatelessWidget {
|
|||||||
PiliScheme.routePushFromUrl(item.url!);
|
PiliScheme.routePushFromUrl(item.url!);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onLongPress: () => imageSaveDialog(
|
onLongPress: onLongPress,
|
||||||
title: item.title,
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
cover: item.cover,
|
|
||||||
),
|
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.symmetric(
|
padding: const EdgeInsets.symmetric(
|
||||||
horizontal: StyleString.safeSpace,
|
horizontal: StyleString.safeSpace,
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import 'package:PiliPlus/common/widgets/image/image_save.dart';
|
|||||||
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
||||||
import 'package:PiliPlus/models/search/result.dart';
|
import 'package:PiliPlus/models/search/result.dart';
|
||||||
import 'package:PiliPlus/utils/page_utils.dart';
|
import 'package:PiliPlus/utils/page_utils.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
// 视频卡片 - 垂直布局
|
// 视频卡片 - 垂直布局
|
||||||
@@ -17,14 +18,16 @@ class PgcCardVSearch extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
void onLongPress() => imageSaveDialog(
|
||||||
|
title: item.title.map((e) => e.text).join(),
|
||||||
|
cover: item.cover,
|
||||||
|
);
|
||||||
return Card(
|
return Card(
|
||||||
shape: const RoundedRectangleBorder(borderRadius: StyleString.mdRadius),
|
shape: const RoundedRectangleBorder(borderRadius: StyleString.mdRadius),
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
borderRadius: StyleString.mdRadius,
|
borderRadius: StyleString.mdRadius,
|
||||||
onLongPress: () => imageSaveDialog(
|
onLongPress: onLongPress,
|
||||||
title: item.title.map((e) => e.text).join(),
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
cover: item.cover,
|
|
||||||
),
|
|
||||||
onTap: () => PageUtils.viewPgc(seasonId: item.seasonId),
|
onTap: () => PageUtils.viewPgc(seasonId: item.seasonId),
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import 'package:PiliPlus/common/widgets/image/image_save.dart';
|
|||||||
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
||||||
import 'package:PiliPlus/models/search/result.dart';
|
import 'package:PiliPlus/models/search/result.dart';
|
||||||
import 'package:PiliPlus/utils/date_utils.dart';
|
import 'package:PiliPlus/utils/date_utils.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
@@ -18,6 +19,10 @@ class SearchArticleItem extends StatelessWidget {
|
|||||||
fontSize: theme.textTheme.labelSmall!.fontSize,
|
fontSize: theme.textTheme.labelSmall!.fontSize,
|
||||||
color: theme.colorScheme.outline,
|
color: theme.colorScheme.outline,
|
||||||
);
|
);
|
||||||
|
void onLongPress() => imageSaveDialog(
|
||||||
|
title: item.title.map((item) => item.text).join(),
|
||||||
|
cover: item.imageUrls?.firstOrNull,
|
||||||
|
);
|
||||||
return Material(
|
return Material(
|
||||||
type: MaterialType.transparency,
|
type: MaterialType.transparency,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
@@ -28,10 +33,8 @@ class SearchArticleItem extends StatelessWidget {
|
|||||||
'type': 'read',
|
'type': 'read',
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
onLongPress: () => imageSaveDialog(
|
onLongPress: onLongPress,
|
||||||
title: item.title.map((item) => item.text).join(),
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
cover: item.imageUrls?.firstOrNull,
|
|
||||||
),
|
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.symmetric(
|
padding: const EdgeInsets.symmetric(
|
||||||
horizontal: StyleString.safeSpace,
|
horizontal: StyleString.safeSpace,
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import 'package:PiliPlus/common/widgets/image/image_save.dart';
|
|||||||
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
||||||
import 'package:PiliPlus/models/search/result.dart';
|
import 'package:PiliPlus/models/search/result.dart';
|
||||||
import 'package:PiliPlus/utils/page_utils.dart';
|
import 'package:PiliPlus/utils/page_utils.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class LiveItem extends StatelessWidget {
|
class LiveItem extends StatelessWidget {
|
||||||
@@ -13,14 +14,16 @@ class LiveItem extends StatelessWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final theme = Theme.of(context);
|
final theme = Theme.of(context);
|
||||||
|
void onLongPress() => imageSaveDialog(
|
||||||
|
title: liveItem.title.map((item) => item.text).join(),
|
||||||
|
cover: liveItem.cover,
|
||||||
|
);
|
||||||
return Card(
|
return Card(
|
||||||
clipBehavior: Clip.hardEdge,
|
clipBehavior: Clip.hardEdge,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
onTap: () => PageUtils.toLiveRoom(liveItem.roomid),
|
onTap: () => PageUtils.toLiveRoom(liveItem.roomid),
|
||||||
onLongPress: () => imageSaveDialog(
|
onLongPress: onLongPress,
|
||||||
title: liveItem.title.map((item) => item.text).join(),
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
cover: liveItem.cover,
|
|
||||||
),
|
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
|||||||
import 'package:PiliPlus/models/search/result.dart';
|
import 'package:PiliPlus/models/search/result.dart';
|
||||||
import 'package:PiliPlus/utils/date_utils.dart';
|
import 'package:PiliPlus/utils/date_utils.dart';
|
||||||
import 'package:PiliPlus/utils/page_utils.dart';
|
import 'package:PiliPlus/utils/page_utils.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class SearchPgcItem extends StatelessWidget {
|
class SearchPgcItem extends StatelessWidget {
|
||||||
@@ -19,14 +20,16 @@ class SearchPgcItem extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final ThemeData theme = Theme.of(context);
|
final ThemeData theme = Theme.of(context);
|
||||||
const TextStyle style = TextStyle(fontSize: 13);
|
const TextStyle style = TextStyle(fontSize: 13);
|
||||||
|
void onLongPress() => imageSaveDialog(
|
||||||
|
title: item.title.map((item) => item.text).join(),
|
||||||
|
cover: item.cover,
|
||||||
|
);
|
||||||
return Material(
|
return Material(
|
||||||
type: MaterialType.transparency,
|
type: MaterialType.transparency,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
onTap: () => PageUtils.viewPgc(seasonId: item.seasonId),
|
onTap: () => PageUtils.viewPgc(seasonId: item.seasonId),
|
||||||
onLongPress: () => imageSaveDialog(
|
onLongPress: onLongPress,
|
||||||
title: item.title.map((item) => item.text).join(),
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
cover: item.cover,
|
|
||||||
),
|
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.symmetric(
|
padding: const EdgeInsets.symmetric(
|
||||||
horizontal: StyleString.safeSpace,
|
horizontal: StyleString.safeSpace,
|
||||||
|
|||||||
@@ -26,6 +26,10 @@ class SubItem extends StatelessWidget {
|
|||||||
21 => '合集',
|
21 => '合集',
|
||||||
_ => '其它(${item.type})',
|
_ => '其它(${item.type})',
|
||||||
};
|
};
|
||||||
|
void onLongPress() => imageSaveDialog(
|
||||||
|
title: item.title,
|
||||||
|
cover: item.cover,
|
||||||
|
);
|
||||||
return Material(
|
return Material(
|
||||||
type: MaterialType.transparency,
|
type: MaterialType.transparency,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
@@ -50,10 +54,8 @@ class SubItem extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onLongPress: () => imageSaveDialog(
|
onLongPress: onLongPress,
|
||||||
title: item.title,
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
cover: item.cover,
|
|
||||||
),
|
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 5),
|
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 5),
|
||||||
child: Row(
|
child: Row(
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import 'package:PiliPlus/models_new/sub/sub_detail/media.dart';
|
|||||||
import 'package:PiliPlus/utils/date_utils.dart';
|
import 'package:PiliPlus/utils/date_utils.dart';
|
||||||
import 'package:PiliPlus/utils/duration_utils.dart';
|
import 'package:PiliPlus/utils/duration_utils.dart';
|
||||||
import 'package:PiliPlus/utils/page_utils.dart';
|
import 'package:PiliPlus/utils/page_utils.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
// 收藏视频卡片 - 水平布局
|
// 收藏视频卡片 - 水平布局
|
||||||
@@ -25,6 +26,11 @@ class SubVideoCardH extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
void onLongPress() => imageSaveDialog(
|
||||||
|
title: videoItem.title,
|
||||||
|
cover: videoItem.cover,
|
||||||
|
bvid: videoItem.bvid,
|
||||||
|
);
|
||||||
return Material(
|
return Material(
|
||||||
type: MaterialType.transparency,
|
type: MaterialType.transparency,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
@@ -39,11 +45,8 @@ class SubVideoCardH extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onLongPress: () => imageSaveDialog(
|
onLongPress: onLongPress,
|
||||||
title: videoItem.title,
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
cover: videoItem.cover,
|
|
||||||
bvid: videoItem.bvid,
|
|
||||||
),
|
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.symmetric(
|
padding: const EdgeInsets.symmetric(
|
||||||
horizontal: StyleString.safeSpace,
|
horizontal: StyleString.safeSpace,
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import 'package:PiliPlus/models_new/media_list/media_list.dart';
|
|||||||
import 'package:PiliPlus/models_new/video/video_detail/episode.dart';
|
import 'package:PiliPlus/models_new/video/video_detail/episode.dart';
|
||||||
import 'package:PiliPlus/pages/common/slide/common_slide_page.dart';
|
import 'package:PiliPlus/pages/common/slide/common_slide_page.dart';
|
||||||
import 'package:PiliPlus/utils/duration_utils.dart';
|
import 'package:PiliPlus/utils/duration_utils.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/material.dart' hide RefreshCallback;
|
import 'package:flutter/material.dart' hide RefreshCallback;
|
||||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
@@ -154,6 +155,12 @@ class _MediaListPanelState extends State<MediaListPanel>
|
|||||||
bool isCurr,
|
bool isCurr,
|
||||||
bool showDelBtn,
|
bool showDelBtn,
|
||||||
) {
|
) {
|
||||||
|
void onLongPress() => imageSaveDialog(
|
||||||
|
title: item.title,
|
||||||
|
cover: item.cover,
|
||||||
|
aid: item.aid,
|
||||||
|
bvid: item.bvid,
|
||||||
|
);
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: const EdgeInsets.only(bottom: 2),
|
padding: const EdgeInsets.only(bottom: 2),
|
||||||
child: SizedBox(
|
child: SizedBox(
|
||||||
@@ -169,12 +176,8 @@ class _MediaListPanelState extends State<MediaListPanel>
|
|||||||
Get.back();
|
Get.back();
|
||||||
widget.onChangeEpisode(item);
|
widget.onChangeEpisode(item);
|
||||||
},
|
},
|
||||||
onLongPress: () => imageSaveDialog(
|
onLongPress: onLongPress,
|
||||||
title: item.title,
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
cover: item.cover,
|
|
||||||
aid: item.aid,
|
|
||||||
bvid: item.bvid,
|
|
||||||
),
|
|
||||||
child: Stack(
|
child: Stack(
|
||||||
clipBehavior: Clip.none,
|
clipBehavior: Clip.none,
|
||||||
children: [
|
children: [
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'
|
|||||||
import 'package:PiliPlus/models/common/badge_type.dart';
|
import 'package:PiliPlus/models/common/badge_type.dart';
|
||||||
import 'package:PiliPlus/models/common/reply/reply_search_type.dart';
|
import 'package:PiliPlus/models/common/reply/reply_search_type.dart';
|
||||||
import 'package:PiliPlus/utils/duration_utils.dart';
|
import 'package:PiliPlus/utils/duration_utils.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
@@ -47,14 +48,16 @@ class ReplySearchItem extends StatelessWidget {
|
|||||||
cover = article.covers.firstOrNull ?? '';
|
cover = article.covers.firstOrNull ?? '';
|
||||||
upNickname = article.upNickname;
|
upNickname = article.upNickname;
|
||||||
}
|
}
|
||||||
|
void onLongPress() => imageSaveDialog(
|
||||||
|
title: title,
|
||||||
|
cover: cover,
|
||||||
|
);
|
||||||
return Material(
|
return Material(
|
||||||
type: MaterialType.transparency,
|
type: MaterialType.transparency,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
onTap: () => Get.back(result: (title: title, url: item.url)),
|
onTap: () => Get.back(result: (title: title, url: item.url)),
|
||||||
onLongPress: () => imageSaveDialog(
|
onLongPress: onLongPress,
|
||||||
title: title,
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
cover: cover,
|
|
||||||
),
|
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.symmetric(
|
padding: const EdgeInsets.symmetric(
|
||||||
horizontal: StyleString.safeSpace,
|
horizontal: StyleString.safeSpace,
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import 'dart:convert';
|
|||||||
|
|
||||||
import 'package:PiliPlus/common/widgets/badge.dart';
|
import 'package:PiliPlus/common/widgets/badge.dart';
|
||||||
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
|
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
|
||||||
|
import 'package:PiliPlus/common/widgets/list_tile.dart';
|
||||||
import 'package:PiliPlus/common/widgets/pendant_avatar.dart';
|
import 'package:PiliPlus/common/widgets/pendant_avatar.dart';
|
||||||
import 'package:PiliPlus/grpc/bilibili/app/im/v1.pb.dart'
|
import 'package:PiliPlus/grpc/bilibili/app/im/v1.pb.dart'
|
||||||
show Session, SessionId, SessionPageType, SessionType, UnreadStyle;
|
show Session, SessionId, SessionPageType, SessionType, UnreadStyle;
|
||||||
@@ -9,8 +10,9 @@ import 'package:PiliPlus/models/common/badge_type.dart';
|
|||||||
import 'package:PiliPlus/pages/whisper_secondary/view.dart';
|
import 'package:PiliPlus/pages/whisper_secondary/view.dart';
|
||||||
import 'package:PiliPlus/utils/date_utils.dart';
|
import 'package:PiliPlus/utils/date_utils.dart';
|
||||||
import 'package:PiliPlus/utils/extension.dart';
|
import 'package:PiliPlus/utils/extension.dart';
|
||||||
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:fixnum/fixnum.dart';
|
import 'package:fixnum/fixnum.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart' hide ListTile;
|
||||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
@@ -41,60 +43,65 @@ class WhisperSessionItem extends StatelessWidget {
|
|||||||
? jsonDecode(item.sessionInfo.vipInfo)
|
? jsonDecode(item.sessionInfo.vipInfo)
|
||||||
: null;
|
: null;
|
||||||
final ThemeData theme = Theme.of(context);
|
final ThemeData theme = Theme.of(context);
|
||||||
|
|
||||||
|
void onLongPress() => showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) {
|
||||||
|
return AlertDialog(
|
||||||
|
clipBehavior: Clip.hardEdge,
|
||||||
|
contentPadding: const EdgeInsets.symmetric(vertical: 12),
|
||||||
|
content: DefaultTextStyle(
|
||||||
|
style: const TextStyle(fontSize: 14),
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
ListTile(
|
||||||
|
dense: true,
|
||||||
|
onTap: () {
|
||||||
|
Get.back();
|
||||||
|
onSetTop(item.isPinned, item.id);
|
||||||
|
},
|
||||||
|
title: Text(item.isPinned ? '移除置顶' : '置顶'),
|
||||||
|
),
|
||||||
|
if (item.id.privateId.hasTalkerUid())
|
||||||
|
ListTile(
|
||||||
|
dense: true,
|
||||||
|
onTap: () {
|
||||||
|
Get.back();
|
||||||
|
onSetMute(item.isMuted, item.id.privateId.talkerUid);
|
||||||
|
},
|
||||||
|
title: Text('${item.isMuted ? '关闭' : '开启'}免打扰'),
|
||||||
|
),
|
||||||
|
if (item.id.privateId.hasTalkerUid())
|
||||||
|
ListTile(
|
||||||
|
dense: true,
|
||||||
|
onTap: () {
|
||||||
|
Get.back();
|
||||||
|
showConfirmDialog(
|
||||||
|
context: context,
|
||||||
|
title: '确定删除该对话?',
|
||||||
|
onConfirm: () =>
|
||||||
|
onRemove(item.id.privateId.talkerUid.toInt()),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
title: const Text('删除'),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
return ListTile(
|
return ListTile(
|
||||||
|
safeArea: true,
|
||||||
tileColor: item.isPinned
|
tileColor: item.isPinned
|
||||||
? theme.colorScheme.onInverseSurface.withValues(
|
? theme.colorScheme.onInverseSurface.withValues(
|
||||||
alpha: Get.isDarkMode ? 0.4 : 0.8,
|
alpha: Get.isDarkMode ? 0.4 : 0.8,
|
||||||
)
|
)
|
||||||
: null,
|
: null,
|
||||||
onLongPress: () => showDialog(
|
onLongPress: onLongPress,
|
||||||
context: context,
|
onSecondaryTap: Utils.isMobile ? null : onLongPress,
|
||||||
builder: (context) {
|
|
||||||
return AlertDialog(
|
|
||||||
clipBehavior: Clip.hardEdge,
|
|
||||||
contentPadding: const EdgeInsets.symmetric(vertical: 12),
|
|
||||||
content: DefaultTextStyle(
|
|
||||||
style: const TextStyle(fontSize: 14),
|
|
||||||
child: Column(
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
children: [
|
|
||||||
ListTile(
|
|
||||||
dense: true,
|
|
||||||
onTap: () {
|
|
||||||
Get.back();
|
|
||||||
onSetTop(item.isPinned, item.id);
|
|
||||||
},
|
|
||||||
title: Text(item.isPinned ? '移除置顶' : '置顶'),
|
|
||||||
),
|
|
||||||
if (item.id.privateId.hasTalkerUid())
|
|
||||||
ListTile(
|
|
||||||
dense: true,
|
|
||||||
onTap: () {
|
|
||||||
Get.back();
|
|
||||||
onSetMute(item.isMuted, item.id.privateId.talkerUid);
|
|
||||||
},
|
|
||||||
title: Text('${item.isMuted ? '关闭' : '开启'}免打扰'),
|
|
||||||
),
|
|
||||||
if (item.id.privateId.hasTalkerUid())
|
|
||||||
ListTile(
|
|
||||||
dense: true,
|
|
||||||
onTap: () {
|
|
||||||
Get.back();
|
|
||||||
showConfirmDialog(
|
|
||||||
context: context,
|
|
||||||
title: '确定删除该对话?',
|
|
||||||
onConfirm: () =>
|
|
||||||
onRemove(item.id.privateId.talkerUid.toInt()),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
title: const Text('删除'),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
onTap: () {
|
onTap: () {
|
||||||
if (item.hasUnread()) {
|
if (item.hasUnread()) {
|
||||||
item.clearUnread();
|
item.clearUnread();
|
||||||
|
|||||||
Reference in New Issue
Block a user