diff --git a/lib/pages/log.dart b/lib/pages/log.dart index 753f2e4..c583fe6 100644 --- a/lib/pages/log.dart +++ b/lib/pages/log.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:weechat/pages/log/event_logger.dart'; import 'package:weechat/extensions/enum_comparison.dart'; +import 'package:weechat/widgets/log/log_item.dart'; class LogPage extends StatefulWidget { const LogPage({super.key}); @@ -22,21 +23,6 @@ class _State extends State { DropdownMenuEntry(value: null, label: "None"), ]; - String _truncate(String message) { - var lines = message.split("\n"); - final l = lines.length; - if (truncate != null && l > truncate!) { - lines = [ - ...lines.take((truncate!/2).round()), - "", - "<< truncated ${l - truncate!} lines >>", - "", - ...lines.skip(l - (truncate!/2).round()), - ]; - } - return lines.join("\n"); - } - @override Widget build(BuildContext context) { return Scaffold( @@ -83,7 +69,12 @@ class _State extends State { .messages .reversed .where((element) => element.item2 >= logType) - .map((e) => Text('${e.item1} [${e.item2}]\n${_truncate(e.item3)}\n')) + .map((e) => LogItem( + dateTime: e.item1, + logType: e.item2, + message: e.item3, + truncate: truncate, + )) .toList(), ), ), diff --git a/lib/widgets/log/log_item.dart b/lib/widgets/log/log_item.dart new file mode 100644 index 0000000..a59ac21 --- /dev/null +++ b/lib/widgets/log/log_item.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; +import 'package:weechat/pages/log/event_logger.dart'; + +class LogItem extends StatelessWidget { + final DateTime dateTime; + final LogType logType; + final String message; + final int? truncate; + + const LogItem({ + required this.dateTime, + required this.logType, + required this.message, + this.truncate, + super.key, + }); + + Widget _truncate(String message) { + final lines = message.split("\n"); + final l = lines.length; + if (truncate != null && l > truncate!) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(lines.take((truncate! / 2).round()).join("\n")), + Text.rich( + TextSpan(text: "\n<< truncated ${l - truncate!} lines >>\n"), + style: const TextStyle(color: Colors.grey), + ), + Text(lines.skip(l - (truncate! / 2).round()).join("\n")), + ], + ); + } else { + return Text(message); + } + } + + @override + Widget build(BuildContext context) { + final messenger = ScaffoldMessenger.of(context); + + return GestureDetector( + onLongPress: () async { + await Clipboard.setData(ClipboardData(text: message)); + messenger.showSnackBar( + const SnackBar( + content: Text("Copied log message to clipboard."), + ), + ); + }, + child: Padding( + padding: const EdgeInsets.only(bottom: 10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text.rich(TextSpan(text: "$dateTime [$logType]", style: const TextStyle(color: Colors.grey))), + _truncate(message), + ], + ), + ), + ); + } +}