Support more mouse related actions

This commit is contained in:
LittleSheep 2024-10-16 00:02:18 +08:00
parent 1c26944a05
commit e5381dd5e0
3 changed files with 68 additions and 47 deletions

View File

@ -47,16 +47,19 @@ class ChatListShell extends StatelessWidget {
direction: Axis.horizontal, direction: Axis.horizontal,
divider: ResizableDivider( divider: ResizableDivider(
thickness: 0.3, thickness: 0.3,
color: Theme.of(context).dividerColor, color: Theme.of(context).dividerColor.withOpacity(0.3),
), ),
children: [ children: [
const ResizableChild( const ResizableChild(
minSize: 280, minSize: 280,
maxSize: 520, maxSize: 520,
size: ResizableSize.pixels(320), size: ResizableSize.pixels(360),
child: ChatList(), child: ChatList(),
), ),
ResizableChild(child: child ?? const EmptyPagePlaceholder()), ResizableChild(
minSize: 280,
child: child ?? const EmptyPagePlaceholder(),
),
], ],
), ),
); );

View File

@ -1,3 +1,4 @@
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_animate/flutter_animate.dart'; import 'package:flutter_animate/flutter_animate.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@ -34,6 +35,24 @@ class ChatEventList extends StatelessWidget {
return a.createdAt.difference(b.createdAt).inMinutes <= 3; return a.createdAt.difference(b.createdAt).inMinutes <= 3;
} }
void _openActions(BuildContext context, Event item) {
showModalBottomSheet(
useRootNavigator: true,
context: context,
builder: (context) => ChatEventAction(
channel: channel,
realm: channel.realm,
item: item,
onEdit: () {
onEdit(item);
},
onReply: () {
onReply(item);
},
),
);
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return CustomScrollView( return CustomScrollView(
@ -65,50 +84,45 @@ class ChatEventList extends StatelessWidget {
final item = chatController.currentEvents[index].data; final item = chatController.currentEvents[index].data;
return GestureDetector( return TapRegion(
behavior: HitTestBehavior.opaque, child: GestureDetector(
child: Builder(builder: (context) { behavior: HitTestBehavior.opaque,
final widget = ChatEvent( child: Builder(builder: (context) {
key: Key('m${item!.uuid}'), final widget = ChatEvent(
item: item, key: Key('m${item!.uuid}'),
isMerged: isMerged, item: item,
chatController: chatController, isMerged: isMerged,
).paddingOnly( chatController: chatController,
top: !isMerged ? 8 : 0, ).paddingOnly(
bottom: !hasMerged ? 8 : 0, top: !isMerged ? 8 : 0,
); bottom: !hasMerged ? 8 : 0,
);
if (noAnimated) { if (noAnimated) {
return widget; return widget;
} else { } else {
return widget return widget
.animate( .animate(
key: Key('animated-m${item.uuid}'), key: Key('animated-m${item.uuid}'),
) )
.slideY( .slideY(
curve: Curves.fastLinearToSlowEaseIn, curve: Curves.fastLinearToSlowEaseIn,
duration: 250.ms, duration: 250.ms,
begin: 0.5, begin: 0.5,
end: 0, end: 0,
); );
}
}),
onLongPress: () {
_openActions(context, item!);
},
),
onTapInside: (event) {
if (event.buttons == kSecondaryMouseButton) {
_openActions(context, item!);
} else if (event.buttons == kMiddleMouseButton) {
onReply(item!);
} }
}),
onLongPress: () {
showModalBottomSheet(
useRootNavigator: true,
context: context,
builder: (context) => ChatEventAction(
channel: channel,
realm: channel.realm,
item: item!,
onEdit: () {
onEdit(item);
},
onReply: () {
onReply(item);
},
),
);
}, },
); );
}, },

View File

@ -91,17 +91,21 @@ class _PostActionState extends State<PostAction> {
setState(() => _isBusy = true); setState(() => _isBusy = true);
final double width = hasMultipleAttachment ? 640 : 480;
final screenshot = ScreenshotController(); final screenshot = ScreenshotController();
final image = await screenshot.captureFromLongWidget( final image = await screenshot.captureFromLongWidget(
MediaQuery( MediaQuery(
data: MediaQuery.of(context), data: MediaQuery.of(context).copyWith(
size: Size(width, double.infinity),
),
child: PostShareImage(item: widget.item), child: PostShareImage(item: widget.item),
), ),
context: context, context: context,
pixelRatio: 2, pixelRatio: 2,
constraints: BoxConstraints( constraints: BoxConstraints(
minWidth: 480, minWidth: 480,
maxWidth: hasMultipleAttachment ? 640 : 480, maxWidth: width,
minHeight: 640, minHeight: 640,
maxHeight: double.infinity, maxHeight: double.infinity,
), ),