fluffychat/lib/widgets/log_view.dart

97 lines
2.5 KiB
Dart
Raw Permalink Normal View History

2020-12-22 13:23:23 +00:00
import 'package:flutter/material.dart';
2023-08-07 16:40:02 +00:00
import 'package:go_router/go_router.dart';
2021-10-26 16:50:34 +00:00
import 'package:matrix/matrix.dart';
2020-12-22 13:23:23 +00:00
class LogViewer extends StatefulWidget {
const LogViewer({super.key});
2021-10-14 16:09:30 +00:00
2020-12-22 13:23:23 +00:00
@override
2022-08-14 14:59:21 +00:00
LogViewerState createState() => LogViewerState();
2020-12-22 13:23:23 +00:00
}
2022-08-14 14:59:21 +00:00
class LogViewerState extends State<LogViewer> {
2020-12-22 13:23:23 +00:00
Level logLevel = Level.debug;
double fontSize = 14;
@override
Widget build(BuildContext context) {
final outputEvents = Logs()
.outputEvents
2021-05-23 11:11:55 +00:00
.where((e) => e.level.index <= logLevel.index)
2020-12-22 13:23:23 +00:00
.toList();
return Scaffold(
backgroundColor: Colors.black,
appBar: AppBar(
title: Text(logLevel.toString()),
2023-08-07 16:40:02 +00:00
leading: BackButton(
onPressed: () => context.go('/'),
),
2020-12-22 13:23:23 +00:00
actions: [
IconButton(
2021-10-14 16:09:30 +00:00
icon: const Icon(Icons.zoom_in_outlined),
2020-12-22 13:23:23 +00:00
onPressed: () => setState(() => fontSize++),
),
IconButton(
2021-10-14 16:09:30 +00:00
icon: const Icon(Icons.zoom_out_outlined),
2020-12-22 13:23:23 +00:00
onPressed: () => setState(() => fontSize--),
),
PopupMenuButton<Level>(
2020-12-22 13:23:23 +00:00
itemBuilder: (context) => Level.values
.map(
(level) => PopupMenuItem(
value: level,
child: Text(level.toString()),
),
)
2020-12-22 13:23:23 +00:00
.toList(),
onSelected: (Level level) => setState(() => logLevel = level),
),
],
),
body: ListView.builder(
itemCount: outputEvents.length,
itemBuilder: (context, i) => SingleChildScrollView(
scrollDirection: Axis.horizontal,
2021-05-23 11:11:55 +00:00
child: SelectableText(
outputEvents[i].toDisplayString(),
style: TextStyle(
color: outputEvents[i].color,
),
),
2020-12-22 13:23:23 +00:00
),
),
);
}
}
2021-05-20 11:59:55 +00:00
extension on LogEvent {
2021-05-23 11:11:55 +00:00
Color get color {
switch (level) {
case Level.wtf:
return Colors.purple;
case Level.error:
return Colors.red;
case Level.warning:
return Colors.orange;
case Level.info:
return Colors.green;
case Level.debug:
return Colors.white;
case Level.verbose:
default:
return Colors.grey;
}
}
2021-05-20 11:59:55 +00:00
String toDisplayString() {
2021-05-23 11:11:55 +00:00
var str = '# [${level.toString().split('.').last.toUpperCase()}] $title';
2021-05-20 11:59:55 +00:00
if (exception != null) {
str += ' - ${exception.toString()}';
2020-12-22 13:23:23 +00:00
}
2021-05-20 11:59:55 +00:00
if (stackTrace != null) {
str += '\n${stackTrace.toString()}';
2020-12-22 13:23:23 +00:00
}
2021-05-20 11:59:55 +00:00
return str;
2020-12-22 13:23:23 +00:00
}
}