|
|
|
|
@ -58,10 +58,9 @@ class ToolbarDisplayController {
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void showToolbar(
|
|
|
|
|
BuildContext context, {
|
|
|
|
|
MessageMode? mode,
|
|
|
|
|
}) {
|
|
|
|
|
void showToolbar(BuildContext context, {MessageMode? mode}) {
|
|
|
|
|
// Close keyboard, if open
|
|
|
|
|
FocusManager.instance.primaryFocus?.unfocus();
|
|
|
|
|
bool toolbarUp = true;
|
|
|
|
|
if (highlighted) return;
|
|
|
|
|
if (controller.selectMode) {
|
|
|
|
|
@ -87,12 +86,13 @@ class ToolbarDisplayController {
|
|
|
|
|
if (targetOffset.dy < 320) {
|
|
|
|
|
final spaceBeneath = MediaQuery.of(context).size.height -
|
|
|
|
|
(targetOffset.dy + transformTargetSize.height);
|
|
|
|
|
if (spaceBeneath >= 320) {
|
|
|
|
|
toolbarUp = false;
|
|
|
|
|
}
|
|
|
|
|
// If toolbar is open, opening toolbar beneath without scrolling can cause issues
|
|
|
|
|
// if (spaceBeneath >= 320) {
|
|
|
|
|
// toolbarUp = false;
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// See if it's possible to scroll up to make space
|
|
|
|
|
else if (controller.scrollController.offset - targetOffset.dy + 320 >=
|
|
|
|
|
if (controller.scrollController.offset - targetOffset.dy + 320 >=
|
|
|
|
|
controller.scrollController.position.minScrollExtent &&
|
|
|
|
|
controller.scrollController.offset - targetOffset.dy + 320 <=
|
|
|
|
|
controller.scrollController.position.maxScrollExtent) {
|
|
|
|
|
@ -152,13 +152,7 @@ class ToolbarDisplayController {
|
|
|
|
|
? CrossAxisAlignment.end
|
|
|
|
|
: CrossAxisAlignment.start,
|
|
|
|
|
children: [
|
|
|
|
|
toolbarUp
|
|
|
|
|
// Column is limited to screen height
|
|
|
|
|
// If message portion is too tall, decrease toolbar height
|
|
|
|
|
// as necessary to prevent toolbar from acting strange
|
|
|
|
|
// Problems may still occur if toolbar height is decreased too much
|
|
|
|
|
? toolbar!
|
|
|
|
|
: overlayMessage,
|
|
|
|
|
toolbarUp ? toolbar! : overlayMessage,
|
|
|
|
|
const SizedBox(height: 6),
|
|
|
|
|
toolbarUp ? overlayMessage : toolbar!,
|
|
|
|
|
],
|
|
|
|
|
@ -419,85 +413,83 @@ class MessageToolbarState extends State<MessageToolbar> {
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
|
return Flexible(
|
|
|
|
|
child: Material(
|
|
|
|
|
type: MaterialType.transparency,
|
|
|
|
|
child: Container(
|
|
|
|
|
padding: const EdgeInsets.all(10),
|
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
|
color: Theme.of(context).cardColor,
|
|
|
|
|
border: Border.all(
|
|
|
|
|
width: 2,
|
|
|
|
|
color: Theme.of(context).colorScheme.primary,
|
|
|
|
|
),
|
|
|
|
|
borderRadius: const BorderRadius.all(
|
|
|
|
|
Radius.circular(25),
|
|
|
|
|
),
|
|
|
|
|
return Material(
|
|
|
|
|
type: MaterialType.transparency,
|
|
|
|
|
child: Container(
|
|
|
|
|
padding: const EdgeInsets.all(10),
|
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
|
color: Theme.of(context).cardColor,
|
|
|
|
|
border: Border.all(
|
|
|
|
|
width: 2,
|
|
|
|
|
color: Theme.of(context).colorScheme.primary,
|
|
|
|
|
),
|
|
|
|
|
constraints: const BoxConstraints(
|
|
|
|
|
maxWidth: 300,
|
|
|
|
|
minWidth: 300,
|
|
|
|
|
maxHeight: 300,
|
|
|
|
|
borderRadius: const BorderRadius.all(
|
|
|
|
|
Radius.circular(25),
|
|
|
|
|
),
|
|
|
|
|
child: Column(
|
|
|
|
|
mainAxisSize: MainAxisSize.min,
|
|
|
|
|
children: [
|
|
|
|
|
Flexible(
|
|
|
|
|
child: SingleChildScrollView(
|
|
|
|
|
child: AnimatedSize(
|
|
|
|
|
duration: FluffyThemes.animationDuration,
|
|
|
|
|
child: Column(
|
|
|
|
|
children: [
|
|
|
|
|
Padding(
|
|
|
|
|
padding: const EdgeInsets.all(8.0),
|
|
|
|
|
child: toolbarContent ?? const SizedBox(),
|
|
|
|
|
),
|
|
|
|
|
SizedBox(height: toolbarContent == null ? 0 : 20),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
constraints: const BoxConstraints(
|
|
|
|
|
maxWidth: 300,
|
|
|
|
|
minWidth: 300,
|
|
|
|
|
maxHeight: 300,
|
|
|
|
|
),
|
|
|
|
|
child: Column(
|
|
|
|
|
mainAxisSize: MainAxisSize.min,
|
|
|
|
|
children: [
|
|
|
|
|
Flexible(
|
|
|
|
|
child: SingleChildScrollView(
|
|
|
|
|
child: AnimatedSize(
|
|
|
|
|
duration: FluffyThemes.animationDuration,
|
|
|
|
|
child: Column(
|
|
|
|
|
children: [
|
|
|
|
|
Padding(
|
|
|
|
|
padding: const EdgeInsets.all(8.0),
|
|
|
|
|
child: toolbarContent ?? const SizedBox(),
|
|
|
|
|
),
|
|
|
|
|
SizedBox(height: toolbarContent == null ? 0 : 20),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
Row(
|
|
|
|
|
mainAxisSize: MainAxisSize.min,
|
|
|
|
|
children: MessageMode.values.map((mode) {
|
|
|
|
|
if ([
|
|
|
|
|
MessageMode.definition,
|
|
|
|
|
MessageMode.textToSpeech,
|
|
|
|
|
MessageMode.translation,
|
|
|
|
|
].contains(mode) &&
|
|
|
|
|
widget.pangeaMessageEvent.isAudioMessage) {
|
|
|
|
|
return const SizedBox.shrink();
|
|
|
|
|
}
|
|
|
|
|
if (mode == MessageMode.speechToText &&
|
|
|
|
|
!widget.pangeaMessageEvent.isAudioMessage) {
|
|
|
|
|
return const SizedBox.shrink();
|
|
|
|
|
}
|
|
|
|
|
return Tooltip(
|
|
|
|
|
message: mode.tooltip(context),
|
|
|
|
|
child: IconButton(
|
|
|
|
|
icon: Icon(mode.icon),
|
|
|
|
|
color: mode.iconColor(
|
|
|
|
|
widget.pangeaMessageEvent,
|
|
|
|
|
currentMode,
|
|
|
|
|
context,
|
|
|
|
|
),
|
|
|
|
|
onPressed: () => updateMode(mode),
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
}).toList() +
|
|
|
|
|
[
|
|
|
|
|
Tooltip(
|
|
|
|
|
message: L10n.of(context)!.more,
|
|
|
|
|
child: IconButton(
|
|
|
|
|
icon: const Icon(Icons.add_reaction_outlined),
|
|
|
|
|
onPressed: showMore,
|
|
|
|
|
),
|
|
|
|
|
Row(
|
|
|
|
|
mainAxisSize: MainAxisSize.min,
|
|
|
|
|
children: MessageMode.values.map((mode) {
|
|
|
|
|
if ([
|
|
|
|
|
MessageMode.definition,
|
|
|
|
|
MessageMode.textToSpeech,
|
|
|
|
|
MessageMode.translation,
|
|
|
|
|
].contains(mode) &&
|
|
|
|
|
widget.pangeaMessageEvent.isAudioMessage) {
|
|
|
|
|
return const SizedBox.shrink();
|
|
|
|
|
}
|
|
|
|
|
if (mode == MessageMode.speechToText &&
|
|
|
|
|
!widget.pangeaMessageEvent.isAudioMessage) {
|
|
|
|
|
return const SizedBox.shrink();
|
|
|
|
|
}
|
|
|
|
|
return Tooltip(
|
|
|
|
|
message: mode.tooltip(context),
|
|
|
|
|
child: IconButton(
|
|
|
|
|
icon: Icon(mode.icon),
|
|
|
|
|
color: mode.iconColor(
|
|
|
|
|
widget.pangeaMessageEvent,
|
|
|
|
|
currentMode,
|
|
|
|
|
context,
|
|
|
|
|
),
|
|
|
|
|
onPressed: () => updateMode(mode),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
}).toList() +
|
|
|
|
|
[
|
|
|
|
|
Tooltip(
|
|
|
|
|
message: L10n.of(context)!.more,
|
|
|
|
|
child: IconButton(
|
|
|
|
|
icon: const Icon(Icons.add_reaction_outlined),
|
|
|
|
|
onPressed: showMore,
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
|