Merge branch 'dev' into update-pacox-multibyte

This commit is contained in:
HDDen
2026-06-16 11:53:59 +03:00
42 changed files with 2711 additions and 279 deletions
+3
View File
@@ -50,6 +50,7 @@ class MeshCard extends StatelessWidget {
final Widget child;
final VoidCallback? onTap;
final VoidCallback? onLongPress;
final VoidCallback? onSecondaryTap;
final EdgeInsetsGeometry padding;
final EdgeInsetsGeometry margin;
final Color? color;
@@ -61,6 +62,7 @@ class MeshCard extends StatelessWidget {
required this.child,
this.onTap,
this.onLongPress,
this.onSecondaryTap,
this.padding = const EdgeInsets.all(14),
this.margin = const EdgeInsets.symmetric(horizontal: 16, vertical: 4),
this.color,
@@ -89,6 +91,7 @@ class MeshCard extends StatelessWidget {
HapticFeedback.selectionClick();
onLongPress!();
},
onSecondaryTap: onSecondaryTap,
child: Padding(padding: padding, child: child),
),
),
+58 -46
View File
@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../connector/meshcore_connector.dart';
import '../utils/platform_info.dart';
import '../helpers/path_helper.dart';
import '../l10n/l10n.dart';
import '../models/contact.dart';
@@ -565,56 +566,67 @@ class _RoutingSheetBodyState extends State<_RoutingSheetBody> {
l10n.routing_deliveryCounts(record.successCount, record.failureCount),
];
return Card(
margin: const EdgeInsets.symmetric(vertical: 4),
child: ListTile(
enabled: hasBytes,
leading: CircleAvatar(
radius: 18,
backgroundColor: bg,
child: Icon(
_qualityIcon(quality),
size: 18,
color: fg,
semanticLabel: _qualityLabel(context, quality),
return GestureDetector(
behavior: HitTestBehavior.opaque,
onSecondaryTapUp: PlatformInfo.isDesktop && hasBytes
? (_) =>
_showPathDetail(context, connector, contact, record.pathBytes)
: null,
child: Card(
margin: const EdgeInsets.symmetric(vertical: 4),
child: ListTile(
enabled: hasBytes,
leading: CircleAvatar(
radius: 18,
backgroundColor: bg,
child: Icon(
_qualityIcon(quality),
size: 18,
color: fg,
semanticLabel: _qualityLabel(context, quality),
),
),
),
title: Text(title, maxLines: 1, overflow: TextOverflow.ellipsis),
subtitle: Text(
'$line1\n${line2Parts.join('')}',
style: const TextStyle(fontSize: 11),
),
isThreeLine: true,
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: [
if (inUse)
Tooltip(
message: l10n.routing_inUse,
child: Icon(
Icons.check_circle,
color: scheme.primary,
semanticLabel: l10n.routing_inUse,
title: Text(title, maxLines: 1, overflow: TextOverflow.ellipsis),
subtitle: Text(
'$line1\n${line2Parts.join('')}',
style: const TextStyle(fontSize: 11),
),
isThreeLine: true,
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: [
if (inUse)
Tooltip(
message: l10n.routing_inUse,
child: Icon(
Icons.check_circle,
color: scheme.primary,
semanticLabel: l10n.routing_inUse,
),
),
IconButton(
icon: const Icon(Icons.delete_outline, size: 20),
tooltip: l10n.chat_removePath,
constraints: const BoxConstraints(minWidth: 44, minHeight: 44),
onPressed: () => pathService.removePathRecord(
contact.publicKeyHex,
record.pathBytes,
),
),
IconButton(
icon: const Icon(Icons.delete_outline, size: 20),
tooltip: l10n.chat_removePath,
constraints: const BoxConstraints(minWidth: 44, minHeight: 44),
onPressed: () => pathService.removePathRecord(
contact.publicKeyHex,
record.pathBytes,
),
),
],
],
),
onTap: hasBytes && !inUse
? () => _applyHistoryPath(connector, contact, record)
: null,
onLongPress: hasBytes
? () => _showPathDetail(
context,
connector,
contact,
record.pathBytes,
)
: null,
),
onTap: hasBytes && !inUse
? () => _applyHistoryPath(connector, contact, record)
: null,
onLongPress: hasBytes
? () =>
_showPathDetail(context, connector, contact, record.pathBytes)
: null,
),
);
}
@@ -8,6 +8,7 @@ class TranslatedMessageContent extends StatelessWidget {
final TextStyle style;
final TextStyle? originalStyle;
final bool showOriginalFirst;
final VoidCallback? onSecondaryTap;
const TranslatedMessageContent({
super.key,
@@ -16,6 +17,7 @@ class TranslatedMessageContent extends StatelessWidget {
this.originalText,
this.originalStyle,
this.showOriginalFirst = true,
this.onSecondaryTap,
});
@override
@@ -36,12 +38,14 @@ class TranslatedMessageContent extends StatelessWidget {
fontStyle: FontStyle.italic,
fontSize: style.fontSize,
),
onSecondaryTap: onSecondaryTap,
)
: null;
final translatedWidget = LinkHandler.buildLinkifyText(
context: context,
text: trimmedDisplay,
style: style,
onSecondaryTap: onSecondaryTap,
);
if (!shouldShowOriginal) {