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>
pull/1593/head
wcjord 10 months ago committed by GitHub
parent 3424f90672
commit 5f1c1887fc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -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,
),

@ -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…
Cancel
Save