mirror of
https://github.com/BlueBubblesApp/bluebubbles-app.git
synced 2025-08-06 19:44:08 +08:00
Fix cursor on some back buttons
Signed-off-by: Joel Jothiprakasam <hijoelj@gmail.com>
This commit is contained in:
@ -24,32 +24,39 @@ class BackButton extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return XGestureDetector(
|
return Material(
|
||||||
supportTouch: true,
|
color: Colors.transparent,
|
||||||
onTap: !kIsDesktop ? null : (details) {
|
child: Container(
|
||||||
final result = onPressed?.call() ?? false;
|
width: 48,
|
||||||
if (!result) {
|
child: XGestureDetector(
|
||||||
if (Get.isSnackbarOpen) {
|
supportTouch: true,
|
||||||
Get.closeAllSnackbars();
|
onTap: !kIsDesktop ? null : (details) {
|
||||||
}
|
final result = onPressed?.call() ?? false;
|
||||||
Navigator.of(context).pop();
|
if (!result) {
|
||||||
}
|
if (Get.isSnackbarOpen) {
|
||||||
},
|
Get.closeAllSnackbars();
|
||||||
child: IconButton(
|
}
|
||||||
icon: Obx(() => Icon(
|
Navigator.of(context).pop();
|
||||||
ss.settings.skin.value != Skins.Material ? CupertinoIcons.back : Icons.arrow_back,
|
|
||||||
color: color ?? context.theme.colorScheme.primary,
|
|
||||||
)),
|
|
||||||
iconSize: ss.settings.skin.value != Skins.Material ? 30 : 24,
|
|
||||||
onPressed: kIsDesktop ? null : () {
|
|
||||||
final result = onPressed?.call() ?? false;
|
|
||||||
if (!result) {
|
|
||||||
if (Get.isSnackbarOpen) {
|
|
||||||
Get.closeAllSnackbars();
|
|
||||||
}
|
}
|
||||||
Navigator.of(context).pop();
|
},
|
||||||
}
|
child: IconButton(
|
||||||
},
|
icon: Obx(() => Icon(
|
||||||
|
ss.settings.skin.value != Skins.Material ? CupertinoIcons.back : Icons.arrow_back,
|
||||||
|
color: color ?? context.theme.colorScheme.primary,
|
||||||
|
)),
|
||||||
|
iconSize: ss.settings.skin.value != Skins.Material ? 30 : 24,
|
||||||
|
onPressed: () {
|
||||||
|
if (kIsDesktop) return;
|
||||||
|
final result = onPressed?.call() ?? false;
|
||||||
|
if (!result) {
|
||||||
|
if (Get.isSnackbarOpen) {
|
||||||
|
Get.closeAllSnackbars();
|
||||||
|
}
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -99,8 +106,7 @@ Widget buildProgressIndicator(BuildContext context, {double size = 20, double st
|
|||||||
return ss.settings.skin.value == Skins.iOS
|
return ss.settings.skin.value == Skins.iOS
|
||||||
? Theme(
|
? Theme(
|
||||||
data: ThemeData(
|
data: ThemeData(
|
||||||
cupertinoOverrideTheme:
|
cupertinoOverrideTheme: CupertinoThemeData(brightness: ThemeData.estimateBrightnessForColor(context.theme.colorScheme.background)),
|
||||||
CupertinoThemeData(brightness: ThemeData.estimateBrightnessForColor(context.theme.colorScheme.background)),
|
|
||||||
),
|
),
|
||||||
child: CupertinoActivityIndicator(
|
child: CupertinoActivityIndicator(
|
||||||
radius: size / 2,
|
radius: size / 2,
|
||||||
@ -110,17 +116,18 @@ Widget buildProgressIndicator(BuildContext context, {double size = 20, double st
|
|||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
constraints: BoxConstraints(maxHeight: size, maxWidth: size),
|
constraints: BoxConstraints(maxHeight: size, maxWidth: size),
|
||||||
child: SizedBox(
|
child: SizedBox(
|
||||||
width: size,
|
width: size,
|
||||||
height: size,
|
height: size,
|
||||||
child: CircularProgressIndicator(
|
child: CircularProgressIndicator(
|
||||||
strokeWidth: strokeWidth,
|
strokeWidth: strokeWidth,
|
||||||
valueColor: AlwaysStoppedAnimation<Color>(context.theme.colorScheme.primary),
|
valueColor: AlwaysStoppedAnimation<Color>(context.theme.colorScheme.primary),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> showConversationTileMenu(BuildContext context, ConversationTileController _this, Chat chat, Offset tapPosition, TextTheme textTheme) async {
|
Future<void> showConversationTileMenu(
|
||||||
|
BuildContext context, ConversationTileController _this, Chat chat, Offset tapPosition, TextTheme textTheme) async {
|
||||||
bool ios = ss.settings.skin.value == Skins.iOS;
|
bool ios = ss.settings.skin.value == Skins.iOS;
|
||||||
HapticFeedback.mediumImpact();
|
HapticFeedback.mediumImpact();
|
||||||
await showMenu(
|
await showMenu(
|
||||||
@ -150,9 +157,7 @@ Future<void> showConversationTileMenu(BuildContext context, ConversationTileCont
|
|||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.only(right: 10),
|
padding: const EdgeInsets.only(right: 10),
|
||||||
child: Icon(
|
child: Icon(
|
||||||
chat.isPinned!
|
chat.isPinned! ? (ios ? CupertinoIcons.pin_slash : Icons.star_outline) : (ios ? CupertinoIcons.pin : Icons.star),
|
||||||
? (ios ? CupertinoIcons.pin_slash : Icons.star_outline)
|
|
||||||
: (ios ? CupertinoIcons.pin : Icons.star),
|
|
||||||
color: context.theme.colorScheme.properOnSurface,
|
color: context.theme.colorScheme.properOnSurface,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -187,7 +192,8 @@ Future<void> showConversationTileMenu(BuildContext context, ConversationTileCont
|
|||||||
color: context.theme.colorScheme.properOnSurface,
|
color: context.theme.colorScheme.properOnSurface,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Text(chat.muteType == "mute" ? 'Show Alerts' : 'Hide Alerts', style: textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.properOnSurface)),
|
Text(chat.muteType == "mute" ? 'Show Alerts' : 'Hide Alerts',
|
||||||
|
style: textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.properOnSurface)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -214,7 +220,8 @@ Future<void> showConversationTileMenu(BuildContext context, ConversationTileCont
|
|||||||
color: context.theme.colorScheme.properOnSurface,
|
color: context.theme.colorScheme.properOnSurface,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Text(chat.hasUnreadMessage! ? 'Mark Read' : 'Mark Unread', style: textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.properOnSurface)),
|
Text(chat.hasUnreadMessage! ? 'Mark Read' : 'Mark Unread',
|
||||||
|
style: textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.properOnSurface)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -267,10 +274,7 @@ Future<void> showConversationTileMenu(BuildContext context, ConversationTileCont
|
|||||||
"Are you sure?",
|
"Are you sure?",
|
||||||
style: context.theme.textTheme.titleLarge,
|
style: context.theme.textTheme.titleLarge,
|
||||||
),
|
),
|
||||||
content: Text(
|
content: Text("This chat will be deleted from this device only", style: context.theme.textTheme.bodyLarge),
|
||||||
"This chat will be deleted from this device only",
|
|
||||||
style: context.theme.textTheme.bodyLarge
|
|
||||||
),
|
|
||||||
backgroundColor: context.theme.colorScheme.properSurface,
|
backgroundColor: context.theme.colorScheme.properSurface,
|
||||||
actions: <Widget>[
|
actions: <Widget>[
|
||||||
TextButton(
|
TextButton(
|
||||||
@ -318,9 +322,7 @@ Future<void> showConversationTileMenu(BuildContext context, ConversationTileCont
|
|||||||
|
|
||||||
IconData getAttachmentIcon(String mimeType) {
|
IconData getAttachmentIcon(String mimeType) {
|
||||||
if (mimeType.isEmpty) {
|
if (mimeType.isEmpty) {
|
||||||
return ss.settings.skin.value == Skins.iOS
|
return ss.settings.skin.value == Skins.iOS ? CupertinoIcons.arrow_up_right_square : Icons.open_in_new;
|
||||||
? CupertinoIcons.arrow_up_right_square
|
|
||||||
: Icons.open_in_new;
|
|
||||||
}
|
}
|
||||||
if (mimeType == "application/pdf") {
|
if (mimeType == "application/pdf") {
|
||||||
return ss.settings.skin.value == Skins.iOS ? CupertinoIcons.doc_on_doc : Icons.picture_as_pdf;
|
return ss.settings.skin.value == Skins.iOS ? CupertinoIcons.doc_on_doc : Icons.picture_as_pdf;
|
||||||
@ -335,9 +337,7 @@ IconData getAttachmentIcon(String mimeType) {
|
|||||||
} else if (mimeType.startsWith("text")) {
|
} else if (mimeType.startsWith("text")) {
|
||||||
return ss.settings.skin.value == Skins.iOS ? CupertinoIcons.doc_text : Icons.note;
|
return ss.settings.skin.value == Skins.iOS ? CupertinoIcons.doc_text : Icons.note;
|
||||||
}
|
}
|
||||||
return ss.settings.skin.value == Skins.iOS
|
return ss.settings.skin.value == Skins.iOS ? CupertinoIcons.arrow_up_right_square : Icons.open_in_new;
|
||||||
? CupertinoIcons.arrow_up_right_square
|
|
||||||
: Icons.open_in_new;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void showSnackbar(String title, String message, {int animationMs = 250, int durationMs = 1500, Function(GetSnackBar)? onTap, TextButton? button}) {
|
void showSnackbar(String title, String message, {int animationMs = 250, int durationMs = 1500, Function(GetSnackBar)? onTap, TextButton? button}) {
|
||||||
@ -353,9 +353,10 @@ void showSnackbar(String title, String message, {int animationMs = 250, int dura
|
|||||||
duration: Duration(milliseconds: durationMs),
|
duration: Duration(milliseconds: durationMs),
|
||||||
animationDuration: Duration(milliseconds: animationMs),
|
animationDuration: Duration(milliseconds: animationMs),
|
||||||
mainButton: button,
|
mainButton: button,
|
||||||
onTap: onTap ?? (GetSnackBar bar) {
|
onTap: onTap ??
|
||||||
if (Get.isSnackbarOpen) Get.back();
|
(GetSnackBar bar) {
|
||||||
},
|
if (Get.isSnackbarOpen) Get.back();
|
||||||
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -382,7 +383,8 @@ Future<Uint8List> avatarAsBytes({
|
|||||||
ui.PictureRecorder pictureRecorder = ui.PictureRecorder();
|
ui.PictureRecorder pictureRecorder = ui.PictureRecorder();
|
||||||
Canvas canvas = Canvas(pictureRecorder);
|
Canvas canvas = Canvas(pictureRecorder);
|
||||||
|
|
||||||
await paintGroupAvatar(chat: chat, participants: participants, canvas: canvas, size: quality, usingParticipantsOverride: participantsOverride != null);
|
await paintGroupAvatar(
|
||||||
|
chat: chat, participants: participants, canvas: canvas, size: quality, usingParticipantsOverride: participantsOverride != null);
|
||||||
|
|
||||||
ui.Picture picture = pictureRecorder.endRecording();
|
ui.Picture picture = pictureRecorder.endRecording();
|
||||||
ui.Image image = await picture.toImage(quality.toInt(), quality.toInt());
|
ui.Image image = await picture.toImage(quality.toInt(), quality.toInt());
|
||||||
@ -475,16 +477,11 @@ Future<void> paintGroupAvatar({
|
|||||||
..textAlign = TextAlign.center
|
..textAlign = TextAlign.center
|
||||||
..text = TextSpan(
|
..text = TextSpan(
|
||||||
text: String.fromCharCode(icon.codePoint),
|
text: String.fromCharCode(icon.codePoint),
|
||||||
style: TextStyle(
|
style: TextStyle(fontSize: adjustedWidth * 0.3, fontFamily: icon.fontFamily, color: theme.colorScheme.properOnSurface.withOpacity(0.8)))
|
||||||
fontSize: adjustedWidth * 0.3,
|
|
||||||
fontFamily: icon.fontFamily,
|
|
||||||
color: theme.colorScheme.properOnSurface.withOpacity(0.8)))
|
|
||||||
..layout()
|
..layout()
|
||||||
..paint(canvas, Offset(left + realSize * 0.25, top + realSize * 0.25));
|
..paint(canvas, Offset(left + realSize * 0.25, top + realSize * 0.25));
|
||||||
} else {
|
} else {
|
||||||
Paint paint = Paint()..color = ss.settings.skin.value == Skins.Samsung
|
Paint paint = Paint()..color = ss.settings.skin.value == Skins.Samsung ? theme.colorScheme.secondary : theme.colorScheme.background;
|
||||||
? theme.colorScheme.secondary
|
|
||||||
: theme.colorScheme.background;
|
|
||||||
canvas.drawCircle(Offset(left + realSize * 0.5, top + realSize * 0.5), realSize * 0.5, paint);
|
canvas.drawCircle(Offset(left + realSize * 0.5, top + realSize * 0.5), realSize * 0.5, paint);
|
||||||
await paintAvatar(
|
await paintAvatar(
|
||||||
handle: participants[index],
|
handle: participants[index],
|
||||||
@ -501,18 +498,17 @@ Future<void> paintGroupAvatar({
|
|||||||
|
|
||||||
Future<void> paintAvatar(
|
Future<void> paintAvatar(
|
||||||
{required Handle? handle,
|
{required Handle? handle,
|
||||||
required Canvas canvas,
|
required Canvas canvas,
|
||||||
required Offset offset,
|
required Offset offset,
|
||||||
required double size,
|
required double size,
|
||||||
double? fontSize,
|
double? fontSize,
|
||||||
double? borderWidth,
|
double? borderWidth,
|
||||||
bool inGroup=false}) async {
|
bool inGroup = false}) async {
|
||||||
fontSize ??= size * 0.5;
|
fontSize ??= size * 0.5;
|
||||||
borderWidth ??= size * 0.05;
|
borderWidth ??= size * 0.05;
|
||||||
Contact? contact = handle?.contact ?? (handle != null ? cs.getContact(handle.address) : null);
|
Contact? contact = handle?.contact ?? (handle != null ? cs.getContact(handle.address) : null);
|
||||||
if (contact?.avatar != null) {
|
if (contact?.avatar != null) {
|
||||||
Uint8List? contactAvatar =
|
Uint8List? contactAvatar = await clip(contact!.avatar ?? contact.avatar!, size: size.toInt(), circle: kIsDesktop || inGroup);
|
||||||
await clip(contact!.avatar ?? contact.avatar!, size: size.toInt(), circle: kIsDesktop || inGroup);
|
|
||||||
if (contactAvatar != null) {
|
if (contactAvatar != null) {
|
||||||
canvas.drawImage(await loadImage(contactAvatar), offset, Paint());
|
canvas.drawImage(await loadImage(contactAvatar), offset, Paint());
|
||||||
return;
|
return;
|
||||||
@ -534,19 +530,18 @@ Future<void> paintAvatar(
|
|||||||
|
|
||||||
Paint paint = Paint();
|
Paint paint = Paint();
|
||||||
paint.isAntiAlias = true;
|
paint.isAntiAlias = true;
|
||||||
paint.shader =
|
paint.shader = ui.Gradient.linear(Offset(dx + size * 0.5, dy + size * 0.5), Offset(size.toDouble(), size.toDouble()), [
|
||||||
ui.Gradient.linear(Offset(dx + size * 0.5, dy + size * 0.5), Offset(size.toDouble(), size.toDouble()), [
|
!ss.settings.colorfulAvatars.value
|
||||||
!ss.settings.colorfulAvatars.value
|
? HexColor("928E8E")
|
||||||
? HexColor("928E8E")
|
: colors.isNotEmpty
|
||||||
: colors.isNotEmpty
|
|
||||||
? colors[1]
|
? colors[1]
|
||||||
: HexColor("928E8E"),
|
: HexColor("928E8E"),
|
||||||
!ss.settings.colorfulAvatars.value
|
!ss.settings.colorfulAvatars.value
|
||||||
? HexColor("686868")
|
? HexColor("686868")
|
||||||
: colors.isNotEmpty
|
: colors.isNotEmpty
|
||||||
? colors[0]
|
? colors[0]
|
||||||
: HexColor("686868"),
|
: HexColor("686868"),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
Offset _offset = Offset(dx + size * 0.5, dy + size * 0.5);
|
Offset _offset = Offset(dx + size * 0.5, dy + size * 0.5);
|
||||||
double radius = size * 0.5;
|
double radius = size * 0.5;
|
||||||
@ -564,8 +559,7 @@ Future<void> paintAvatar(
|
|||||||
TextPainter()
|
TextPainter()
|
||||||
..textDirection = TextDirection.rtl
|
..textDirection = TextDirection.rtl
|
||||||
..textAlign = TextAlign.center
|
..textAlign = TextAlign.center
|
||||||
..text = TextSpan(
|
..text = TextSpan(text: String.fromCharCode(icon.codePoint), style: TextStyle(fontSize: fontSize, fontFamily: icon.fontFamily))
|
||||||
text: String.fromCharCode(icon.codePoint), style: TextStyle(fontSize: fontSize, fontFamily: icon.fontFamily))
|
|
||||||
..layout()
|
..layout()
|
||||||
..paint(canvas, Offset(dx + size * 0.25, dy + size * 0.25));
|
..paint(canvas, Offset(dx + size * 0.25, dy + size * 0.25));
|
||||||
} else {
|
} else {
|
||||||
@ -624,12 +618,7 @@ Future<ui.Image> loadImage(Uint8List data) async {
|
|||||||
return completer.future;
|
return completer.future;
|
||||||
}
|
}
|
||||||
|
|
||||||
AlertDialog areYouSure(BuildContext context, {
|
AlertDialog areYouSure(BuildContext context, {Widget? content, String? title = "Are you sure?", required Function onNo, required Function onYes}) {
|
||||||
Widget? content,
|
|
||||||
String? title = "Are you sure?",
|
|
||||||
required Function onNo,
|
|
||||||
required Function onYes
|
|
||||||
}) {
|
|
||||||
return AlertDialog(
|
return AlertDialog(
|
||||||
title: Text(
|
title: Text(
|
||||||
title ?? "Are you sure?",
|
title ?? "Are you sure?",
|
||||||
|
Reference in New Issue
Block a user