diff --git a/lib/pangea/analytics/enums/construct_use_type_enum.dart b/lib/pangea/analytics/enums/construct_use_type_enum.dart index 61d03f190..0a7ee7275 100644 --- a/lib/pangea/analytics/enums/construct_use_type_enum.dart +++ b/lib/pangea/analytics/enums/construct_use_type_enum.dart @@ -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; diff --git a/lib/pangea/events/models/pangea_token_model.dart b/lib/pangea/events/models/pangea_token_model.dart index 592384ad6..68a4f449b 100644 --- a/lib/pangea/events/models/pangea_token_model.dart +++ b/lib/pangea/events/models/pangea_token_model.dart @@ -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; } diff --git a/lib/pangea/toolbar/enums/message_mode_enum.dart b/lib/pangea/toolbar/enums/message_mode_enum.dart index 2021f9941..b929baa59 100644 --- a/lib/pangea/toolbar/enums/message_mode_enum.dart +++ b/lib/pangea/toolbar/enums/message_mode_enum.dart @@ -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: diff --git a/lib/pangea/toolbar/widgets/message_selection_positioner.dart b/lib/pangea/toolbar/widgets/message_selection_positioner.dart index fec92a74a..492ca5224 100644 --- a/lib/pangea/toolbar/widgets/message_selection_positioner.dart +++ b/lib/pangea/toolbar/widgets/message_selection_positioner.dart @@ -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, ), diff --git a/lib/pangea/toolbar/widgets/toolbar_button.dart b/lib/pangea/toolbar/widgets/toolbar_button.dart new file mode 100644 index 000000000..7fa310dcd --- /dev/null +++ b/lib/pangea/toolbar/widgets/toolbar_button.dart @@ -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(), + ], + ), + ); + } +} diff --git a/lib/pangea/toolbar/widgets/message_toolbar_buttons.dart b/lib/pangea/toolbar/widgets/toolbar_button_and_progress_row.dart similarity index 60% rename from lib/pangea/toolbar/widgets/message_toolbar_buttons.dart rename to lib/pangea/toolbar/widgets/toolbar_button_and_progress_row.dart index edba10ff4..cc513b36f 100644 --- a/lib/pangea/toolbar/widgets/message_toolbar_buttons.dart +++ b/lib/pangea/toolbar/widgets/toolbar_button_and_progress_row.dart @@ -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 ); } } - -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(), - ], - ), - ); - } -}