drift/extras/drift_devtools_extension/lib/main.dart

131 lines
3.7 KiB
Dart

import 'package:devtools_app_shared/ui.dart';
import 'package:devtools_extensions/devtools_extensions.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:logging/logging.dart';
import 'package:url_launcher/url_launcher.dart';
import 'src/details.dart';
import 'src/list.dart';
void main() {
runApp(const ProviderScope(child: DriftDevToolsExtension()));
if (kDebugMode) {
Logger.root.level = Level.FINE;
Logger.root.onRecord.listen((record) {
debugPrint(
'[${record.level.name}] ${record.loggerName}: ${record.message}');
});
}
}
class DriftDevToolsExtension extends StatelessWidget {
const DriftDevToolsExtension({super.key});
@override
Widget build(BuildContext context) {
return const DevToolsExtension(child: DriftDevtoolsBody());
}
}
class DriftDevtoolsBody extends ConsumerWidget {
const DriftDevtoolsBody({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final selected = ref.watch(selectedDatabase);
return Split(
axis: Split.axisFor(context, 0.85),
initialFractions: const [1 / 3, 2 / 3],
children: [
const RoundedOutlinedBorder(
child: Column(
children: [
AreaPaneHeader(
roundedTopBorder: false,
includeTopBorder: false,
title: Text('Drift databases'),
actions: [
_InfoButton(),
],
),
Expanded(child: DatabaseList()),
],
),
),
RoundedOutlinedBorder(
clip: true,
child: Column(children: [
AreaPaneHeader(
roundedTopBorder: false,
includeTopBorder: false,
title: selected != null
? Text('Inspecting ${selected.typeName}')
: const Text('No database selected'),
),
if (selected != null) const Expanded(child: DatabaseDetails())
]),
),
],
);
}
}
class _InfoButton extends StatelessWidget {
const _InfoButton();
@override
Widget build(BuildContext context) {
return IconButton(
icon: const Icon(Icons.info_outline),
onPressed: () {
showAboutDialog(
context: context,
applicationName: 'Drift extensions for DevTools',
children: [
Text.rich(
TextSpan(
children: [
_text(
'This extension allows inspecting a drift database in '
'DevTools. If you have ideas for additional functionality '
'that could be provided here, please ',
),
_link('opening an issue',
'https://github.com/simolus3/drift/issues/new'),
_text(
'to make suggestions.\nAlso, thanks to Koen Van Looveren for writing '),
_link('drift_db_viewer',
'https://github.com/vanlooverenkoen/db_viewer/'),
const TextSpan(text: ' which is used to show the database.'),
],
),
),
],
);
},
);
}
static TextSpan _text(String content) {
return TextSpan(text: content);
}
static TextSpan _link(String content, String uri) {
return TextSpan(
text: content,
style: const TextStyle(
decoration: TextDecoration.underline,
),
recognizer: TapGestureRecognizer()
..onTap = () async {
await launchUrl(Uri.parse(uri));
},
);
}
}