1524 i still have to do too many exercises to unlock an audio message (#1562)
* feat(toolbar): moved audio to the left * feat(toolbar): move tts to the left * dev: dart formatting --------- Co-authored-by: ggurdin <ggurdin@gmail.com>
This commit is contained in:
parent
3424f90672
commit
5f1c1887fc
6 changed files with 138 additions and 106 deletions
|
|
@ -1,6 +1,3 @@
|
|||
import 'dart:developer';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||
|
|
@ -123,42 +120,41 @@ extension ConstructUseTypeExtension on ConstructUseTypeEnum {
|
|||
}
|
||||
}
|
||||
|
||||
ActivityTypeEnum get activityType => ActivityTypeEnum.values.firstWhere(
|
||||
(e) => e.associatedUseTypes.contains(this),
|
||||
orElse: () {
|
||||
debugger(when: kDebugMode);
|
||||
return ActivityTypeEnum.wordMeaning;
|
||||
},
|
||||
);
|
||||
|
||||
IconData get icon {
|
||||
switch (this) {
|
||||
case ConstructUseTypeEnum.wa:
|
||||
return Icons.thumb_up_sharp;
|
||||
case ConstructUseTypeEnum.corIt:
|
||||
case ConstructUseTypeEnum.incIt:
|
||||
case ConstructUseTypeEnum.ignIt:
|
||||
return Icons.translate;
|
||||
case ConstructUseTypeEnum.ignIGC:
|
||||
case ConstructUseTypeEnum.incIGC:
|
||||
case ConstructUseTypeEnum.corIGC:
|
||||
case ConstructUseTypeEnum.ga:
|
||||
return Icons.spellcheck;
|
||||
case ConstructUseTypeEnum.corPA:
|
||||
case ConstructUseTypeEnum.incPA:
|
||||
case ConstructUseTypeEnum.ignPA:
|
||||
return ActivityTypeEnum.wordMeaning.icon;
|
||||
case ConstructUseTypeEnum.ignWL:
|
||||
case ConstructUseTypeEnum.incWL:
|
||||
case ConstructUseTypeEnum.corWL:
|
||||
return ActivityTypeEnum.wordFocusListening.icon;
|
||||
case ConstructUseTypeEnum.incHWL:
|
||||
case ConstructUseTypeEnum.ignHWL:
|
||||
case ConstructUseTypeEnum.ga:
|
||||
case ConstructUseTypeEnum.corIGC:
|
||||
case ConstructUseTypeEnum.corPA:
|
||||
case ConstructUseTypeEnum.corWL:
|
||||
case ConstructUseTypeEnum.corHWL:
|
||||
return ActivityTypeEnum.hiddenWordListening.icon;
|
||||
case ConstructUseTypeEnum.corL:
|
||||
case ConstructUseTypeEnum.incL:
|
||||
case ConstructUseTypeEnum.ignL:
|
||||
return ActivityTypeEnum.lemmaId.icon;
|
||||
case ConstructUseTypeEnum.corM:
|
||||
case ConstructUseTypeEnum.incM:
|
||||
case ConstructUseTypeEnum.ignM:
|
||||
return ActivityTypeEnum.morphId.icon;
|
||||
case ConstructUseTypeEnum.em:
|
||||
return activityType.icon;
|
||||
|
||||
return ActivityTypeEnum.emoji.icon;
|
||||
case ConstructUseTypeEnum.unk:
|
||||
case ConstructUseTypeEnum.nan:
|
||||
return Icons.help;
|
||||
|
|
|
|||
|
|
@ -323,7 +323,7 @@ class PangeaToken {
|
|||
if (isContentWord) {
|
||||
return vocabConstruct.points < 3;
|
||||
} else if (canBeDefined) {
|
||||
return vocabConstruct.points < 1;
|
||||
return vocabConstruct.points < 2;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -80,6 +80,21 @@ extension MessageModeExtension on MessageMode {
|
|||
}
|
||||
}
|
||||
|
||||
double get pointOnBar {
|
||||
switch (this) {
|
||||
case MessageMode.practiceActivity:
|
||||
return 0;
|
||||
case MessageMode.textToSpeech:
|
||||
return 0.33;
|
||||
case MessageMode.translation:
|
||||
return 1;
|
||||
case MessageMode.speechToText:
|
||||
case MessageMode.wordZoom:
|
||||
case MessageMode.noneSelected:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
bool isUnlocked(
|
||||
double proportionOfActivitiesCompleted,
|
||||
bool totallyDone,
|
||||
|
|
@ -88,9 +103,8 @@ extension MessageModeExtension on MessageMode {
|
|||
|
||||
switch (this) {
|
||||
case MessageMode.translation:
|
||||
return proportionOfActivitiesCompleted >= 1;
|
||||
case MessageMode.textToSpeech:
|
||||
return proportionOfActivitiesCompleted >= 0.5;
|
||||
return proportionOfActivitiesCompleted >= pointOnBar;
|
||||
case MessageMode.speechToText:
|
||||
case MessageMode.practiceActivity:
|
||||
case MessageMode.wordZoom:
|
||||
|
|
|
|||
|
|
@ -14,10 +14,10 @@ import 'package:fluffychat/pangea/events/event_wrappers/pangea_message_event.dar
|
|||
import 'package:fluffychat/pangea/events/models/pangea_token_model.dart';
|
||||
import 'package:fluffychat/pangea/toolbar/widgets/message_selection_overlay.dart';
|
||||
import 'package:fluffychat/pangea/toolbar/widgets/message_toolbar.dart';
|
||||
import 'package:fluffychat/pangea/toolbar/widgets/message_toolbar_buttons.dart';
|
||||
import 'package:fluffychat/pangea/toolbar/widgets/overlay_footer.dart';
|
||||
import 'package:fluffychat/pangea/toolbar/widgets/overlay_header.dart';
|
||||
import 'package:fluffychat/pangea/toolbar/widgets/overlay_message.dart';
|
||||
import 'package:fluffychat/pangea/toolbar/widgets/toolbar_button_and_progress_row.dart';
|
||||
import 'package:fluffychat/widgets/avatar.dart';
|
||||
import 'package:fluffychat/widgets/matrix.dart';
|
||||
|
||||
|
|
@ -505,7 +505,7 @@ class ToolbarOverlay extends StatelessWidget {
|
|||
),
|
||||
),
|
||||
if (shouldShowToolbarButtons)
|
||||
ToolbarButtons(
|
||||
ToolbarButtonAndProgressRow(
|
||||
event: event,
|
||||
overlayController: overlayController,
|
||||
),
|
||||
|
|
|
|||
69
lib/pangea/toolbar/widgets/toolbar_button.dart
Normal file
69
lib/pangea/toolbar/widgets/toolbar_button.dart
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:fluffychat/config/themes.dart';
|
||||
import 'package:fluffychat/pangea/common/widgets/pressable_button.dart';
|
||||
import 'package:fluffychat/pangea/toolbar/enums/message_mode_enum.dart';
|
||||
import 'package:fluffychat/pangea/toolbar/widgets/message_selection_overlay.dart';
|
||||
import 'package:fluffychat/pangea/toolbar/widgets/toolbar_button_and_progress_row.dart';
|
||||
|
||||
class ToolbarButton extends StatelessWidget {
|
||||
final MessageMode mode;
|
||||
final MessageOverlayController overlayController;
|
||||
final double buttonSize;
|
||||
|
||||
const ToolbarButton({
|
||||
required this.mode,
|
||||
required this.overlayController,
|
||||
required this.buttonSize,
|
||||
super.key,
|
||||
});
|
||||
|
||||
Color color(BuildContext context) => mode.iconButtonColor(
|
||||
context,
|
||||
overlayController.toolbarMode,
|
||||
overlayController.pangeaMessageEvent!.proportionOfActivitiesCompleted,
|
||||
overlayController.isPracticeComplete,
|
||||
);
|
||||
|
||||
bool get enabled => mode.isUnlocked(
|
||||
overlayController.pangeaMessageEvent!.proportionOfActivitiesCompleted,
|
||||
overlayController.isPracticeComplete,
|
||||
);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Tooltip(
|
||||
message: mode.tooltip(context),
|
||||
child: Stack(
|
||||
alignment: Alignment.center,
|
||||
children: [
|
||||
PressableButton(
|
||||
borderRadius: BorderRadius.circular(20),
|
||||
depressed: !enabled || mode == overlayController.toolbarMode,
|
||||
color: color(context),
|
||||
onPressed: enabled
|
||||
? () => overlayController.updateToolbarMode(mode)
|
||||
: null,
|
||||
playSound: true,
|
||||
child: AnimatedContainer(
|
||||
duration: FluffyThemes.animationDuration,
|
||||
height: buttonSize,
|
||||
width: buttonSize,
|
||||
decoration: BoxDecoration(
|
||||
color: color(context),
|
||||
shape: BoxShape.circle,
|
||||
),
|
||||
child: Icon(
|
||||
mode.icon,
|
||||
size: 20,
|
||||
color:
|
||||
mode == overlayController.toolbarMode ? Colors.white : null,
|
||||
),
|
||||
),
|
||||
),
|
||||
if (!enabled) const DisabledAnimation(),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -4,20 +4,19 @@ import 'package:flutter/foundation.dart';
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:matrix/matrix.dart';
|
||||
|
||||
import 'package:fluffychat/config/app_config.dart';
|
||||
import 'package:fluffychat/config/themes.dart';
|
||||
import 'package:fluffychat/pangea/common/widgets/pressable_button.dart';
|
||||
import 'package:fluffychat/pangea/toolbar/enums/message_mode_enum.dart';
|
||||
import 'package:fluffychat/pangea/toolbar/widgets/message_selection_overlay.dart';
|
||||
import 'package:fluffychat/pangea/toolbar/widgets/toolbar_button.dart';
|
||||
|
||||
class ToolbarButtons extends StatelessWidget {
|
||||
class ToolbarButtonAndProgressRow extends StatelessWidget {
|
||||
final Event event;
|
||||
final MessageOverlayController overlayController;
|
||||
|
||||
const ToolbarButtons({
|
||||
const ToolbarButtonAndProgressRow({
|
||||
required this.event,
|
||||
required this.overlayController,
|
||||
super.key,
|
||||
|
|
@ -32,16 +31,20 @@ class ToolbarButtons extends StatelessWidget {
|
|||
|
||||
static const double iconWidth = 36.0;
|
||||
static const double buttonSize = 40.0;
|
||||
static const double width = 250.0;
|
||||
static const double totalRowWidth = 250.0;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (event.messageType == MessageTypes.Audio) {
|
||||
return const SizedBox();
|
||||
}
|
||||
|
||||
if (!overlayController.showToolbarButtons) {
|
||||
return const SizedBox();
|
||||
}
|
||||
|
||||
return SizedBox(
|
||||
width: width,
|
||||
width: totalRowWidth,
|
||||
height: AppConfig.toolbarButtonsHeight,
|
||||
child: Stack(
|
||||
alignment: Alignment.center,
|
||||
|
|
@ -49,7 +52,7 @@ class ToolbarButtons extends StatelessWidget {
|
|||
Stack(
|
||||
children: [
|
||||
Container(
|
||||
width: width,
|
||||
width: totalRowWidth,
|
||||
height: 12,
|
||||
decoration: BoxDecoration(
|
||||
color: MessageModeExtension.barAndLockedButtonColor(context),
|
||||
|
|
@ -61,8 +64,11 @@ class ToolbarButtons extends StatelessWidget {
|
|||
duration: FluffyThemes.animationDuration,
|
||||
height: 12,
|
||||
width: overlayController.isPracticeComplete
|
||||
? width
|
||||
: min(width, width * proportionOfActivitiesCompleted!),
|
||||
? totalRowWidth
|
||||
: min(
|
||||
totalRowWidth,
|
||||
totalRowWidth * proportionOfActivitiesCompleted!,
|
||||
),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(AppConfig.borderRadius),
|
||||
color: AppConfig.success,
|
||||
|
|
@ -74,27 +80,28 @@ class ToolbarButtons extends StatelessWidget {
|
|||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: modes.mapIndexed((index, mode) {
|
||||
final enabled = mode.isUnlocked(
|
||||
proportionOfActivitiesCompleted!,
|
||||
overlayController.isPracticeComplete,
|
||||
);
|
||||
final color = mode.iconButtonColor(
|
||||
context,
|
||||
overlayController.toolbarMode,
|
||||
proportionOfActivitiesCompleted!,
|
||||
overlayController.isPracticeComplete,
|
||||
);
|
||||
return mode.showButton
|
||||
? ToolbarButton(
|
||||
mode: mode,
|
||||
overlayController: overlayController,
|
||||
enabled: enabled,
|
||||
buttonSize: buttonSize,
|
||||
color: color,
|
||||
)
|
||||
: const SizedBox(width: buttonSize);
|
||||
}).toList(),
|
||||
children: [
|
||||
SizedBox(
|
||||
width: MessageMode.textToSpeech.pointOnBar * totalRowWidth -
|
||||
buttonSize / 2,
|
||||
),
|
||||
ToolbarButton(
|
||||
mode: MessageMode.textToSpeech,
|
||||
overlayController: overlayController,
|
||||
buttonSize: buttonSize,
|
||||
),
|
||||
SizedBox(
|
||||
width: MessageMode.translation.pointOnBar * totalRowWidth -
|
||||
MessageMode.textToSpeech.pointOnBar * totalRowWidth -
|
||||
buttonSize / 2 -
|
||||
buttonSize,
|
||||
),
|
||||
ToolbarButton(
|
||||
mode: MessageMode.translation,
|
||||
overlayController: overlayController,
|
||||
buttonSize: buttonSize,
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
|
|
@ -178,57 +185,3 @@ class DisabledAnimationState extends State<DisabledAnimation>
|
|||
);
|
||||
}
|
||||
}
|
||||
|
||||
class ToolbarButton extends StatelessWidget {
|
||||
final MessageMode mode;
|
||||
final MessageOverlayController overlayController;
|
||||
final bool enabled;
|
||||
final double buttonSize;
|
||||
final Color color;
|
||||
|
||||
const ToolbarButton({
|
||||
required this.mode,
|
||||
required this.overlayController,
|
||||
required this.enabled,
|
||||
required this.buttonSize,
|
||||
required this.color,
|
||||
super.key,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Tooltip(
|
||||
message: mode.tooltip(context),
|
||||
child: Stack(
|
||||
alignment: Alignment.center,
|
||||
children: [
|
||||
PressableButton(
|
||||
borderRadius: BorderRadius.circular(20),
|
||||
depressed: !enabled || mode == overlayController.toolbarMode,
|
||||
color: color,
|
||||
onPressed: enabled
|
||||
? () => overlayController.updateToolbarMode(mode)
|
||||
: null,
|
||||
playSound: true,
|
||||
child: AnimatedContainer(
|
||||
duration: FluffyThemes.animationDuration,
|
||||
height: buttonSize,
|
||||
width: buttonSize,
|
||||
decoration: BoxDecoration(
|
||||
color: color,
|
||||
shape: BoxShape.circle,
|
||||
),
|
||||
child: Icon(
|
||||
mode.icon,
|
||||
size: 20,
|
||||
color:
|
||||
mode == overlayController.toolbarMode ? Colors.white : null,
|
||||
),
|
||||
),
|
||||
),
|
||||
if (!enabled) const DisabledAnimation(),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue