some keyboard navigation fixes
This still isnt perfect, it sometimes skips over nodes, needs investigation.
This commit is contained in:
parent
bc307cbcda
commit
ddc8db8326
2 changed files with 44 additions and 9 deletions
|
|
@ -1,6 +1,7 @@
|
|||
import "package:fast_immutable_collections/fast_immutable_collections.dart";
|
||||
import "package:flutter/material.dart";
|
||||
import "package:flutter_riverpod/flutter_riverpod.dart";
|
||||
import "package:flutter_hooks/flutter_hooks.dart";
|
||||
import "package:hooks_riverpod/hooks_riverpod.dart";
|
||||
import "package:nexus/helpers/extensions/show_context_menu.dart";
|
||||
import "package:nexus/models/content/avatar.dart";
|
||||
import "package:nexus/models/content/canonical_alias.dart";
|
||||
|
|
@ -24,7 +25,7 @@ import "package:nexus/widgets/reaction_row.dart";
|
|||
import "package:nexus/widgets/renderers/membership.dart";
|
||||
import "package:nexus/widgets/renderers/generic_event.dart";
|
||||
|
||||
class EventRenderer extends ConsumerWidget {
|
||||
class EventRenderer extends HookConsumerWidget {
|
||||
final Event event;
|
||||
final bool textOnly;
|
||||
final bool isGrouped;
|
||||
|
|
@ -46,6 +47,8 @@ class EventRenderer extends ConsumerWidget {
|
|||
final theme = Theme.of(context);
|
||||
final colorScheme = theme.colorScheme;
|
||||
final errorStyle = TextStyle(color: colorScheme.error);
|
||||
final focusNode = useFocusNode();
|
||||
useListenable(focusNode);
|
||||
|
||||
final child = event.redactedBy != null || event.relationType == "m.replace"
|
||||
? null
|
||||
|
|
@ -168,14 +171,46 @@ class EventRenderer extends ConsumerWidget {
|
|||
if (textOnly)
|
||||
child
|
||||
else ...[
|
||||
GestureDetector(
|
||||
Builder(
|
||||
builder: (context) => FocusableActionDetector(
|
||||
focusNode: focusNode,
|
||||
actions: contextMenuCallback == null
|
||||
? null
|
||||
: {
|
||||
ActivateIntent: CallbackAction(
|
||||
onInvoke: (_) {
|
||||
final renderBox =
|
||||
context.findRenderObject() as RenderBox;
|
||||
final topLeft = renderBox.localToGlobal(
|
||||
Offset.zero,
|
||||
);
|
||||
context.showContextMenu(
|
||||
globalPosition: topLeft,
|
||||
children: getEventOptions!(event).toList(),
|
||||
);
|
||||
return null;
|
||||
},
|
||||
),
|
||||
},
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
color: focusNode.hasPrimaryFocus
|
||||
? theme.colorScheme.surfaceContainerHighest
|
||||
: null,
|
||||
),
|
||||
child: GestureDetector(
|
||||
onSecondaryTapUp: contextMenuCallback,
|
||||
onLongPressStart: contextMenuCallback,
|
||||
child: Padding(
|
||||
padding: isGrouped ? .zero : .only(top: 8),
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: 8,
|
||||
).copyWith(top: isGrouped ? 0 : 8),
|
||||
child: child,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
...[
|
||||
if (event.content is! MessageContent) ReactionRow(event),
|
||||
|
|
|
|||
|
|
@ -400,7 +400,7 @@ class RoomChat extends HookConsumerWidget {
|
|||
children: [
|
||||
Positioned.fill(
|
||||
child: Padding(
|
||||
padding: .symmetric(horizontal: 12),
|
||||
padding: .symmetric(horizontal: 4),
|
||||
child: switch (controllerData) {
|
||||
AsyncData(:final value?) ||
|
||||
AsyncLoading(:final value?) => CustomScrollView(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue