forked from Nexus/nexus
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:fast_immutable_collections/fast_immutable_collections.dart";
|
||||||
import "package:flutter/material.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/helpers/extensions/show_context_menu.dart";
|
||||||
import "package:nexus/models/content/avatar.dart";
|
import "package:nexus/models/content/avatar.dart";
|
||||||
import "package:nexus/models/content/canonical_alias.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/membership.dart";
|
||||||
import "package:nexus/widgets/renderers/generic_event.dart";
|
import "package:nexus/widgets/renderers/generic_event.dart";
|
||||||
|
|
||||||
class EventRenderer extends ConsumerWidget {
|
class EventRenderer extends HookConsumerWidget {
|
||||||
final Event event;
|
final Event event;
|
||||||
final bool textOnly;
|
final bool textOnly;
|
||||||
final bool isGrouped;
|
final bool isGrouped;
|
||||||
|
|
@ -46,6 +47,8 @@ class EventRenderer extends ConsumerWidget {
|
||||||
final theme = Theme.of(context);
|
final theme = Theme.of(context);
|
||||||
final colorScheme = theme.colorScheme;
|
final colorScheme = theme.colorScheme;
|
||||||
final errorStyle = TextStyle(color: colorScheme.error);
|
final errorStyle = TextStyle(color: colorScheme.error);
|
||||||
|
final focusNode = useFocusNode();
|
||||||
|
useListenable(focusNode);
|
||||||
|
|
||||||
final child = event.redactedBy != null || event.relationType == "m.replace"
|
final child = event.redactedBy != null || event.relationType == "m.replace"
|
||||||
? null
|
? null
|
||||||
|
|
@ -168,12 +171,44 @@ class EventRenderer extends ConsumerWidget {
|
||||||
if (textOnly)
|
if (textOnly)
|
||||||
child
|
child
|
||||||
else ...[
|
else ...[
|
||||||
GestureDetector(
|
Builder(
|
||||||
onSecondaryTapUp: contextMenuCallback,
|
builder: (context) => FocusableActionDetector(
|
||||||
onLongPressStart: contextMenuCallback,
|
focusNode: focusNode,
|
||||||
child: Padding(
|
actions: contextMenuCallback == null
|
||||||
padding: isGrouped ? .zero : .only(top: 8),
|
? null
|
||||||
child: child,
|
: {
|
||||||
|
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: EdgeInsets.symmetric(
|
||||||
|
horizontal: 8,
|
||||||
|
).copyWith(top: isGrouped ? 0 : 8),
|
||||||
|
child: child,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -400,7 +400,7 @@ class RoomChat extends HookConsumerWidget {
|
||||||
children: [
|
children: [
|
||||||
Positioned.fill(
|
Positioned.fill(
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: .symmetric(horizontal: 12),
|
padding: .symmetric(horizontal: 4),
|
||||||
child: switch (controllerData) {
|
child: switch (controllerData) {
|
||||||
AsyncData(:final value?) ||
|
AsyncData(:final value?) ||
|
||||||
AsyncLoading(:final value?) => CustomScrollView(
|
AsyncLoading(:final value?) => CustomScrollView(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue