fluffychat/lib/pangea/enum/message_mode_enum.dart
ggurdin 1317989db0
1179 toolbar changes (#1209)
* updated toolbar buttons

* initial work for toolbar updates

* Add WordZoomWidget to display word and lemma information (#1214)

---

For more details, open the [Copilot Workspace session](https://copilot-workspace.githubnext.com/pangeachat/client/tree/1179-toolbar-changes?shareId=XXXX-XXXX-XXXX-XXXX).

* word zoom card prototyped, activity generation in progress

* adding copy for new construct uses

* laying down TODOs

* initial work for word zoom card

* Always add part of speech to token's morph list

* Prevent duplicate choices in lemma activity

* Don't play token audio at start of morph activity

* Only grant +1 points for emoji activity

* Uncomment tryToSpeak function

* Always update activity once complete

* Added queuing / UI logic for morph activity buttons

* code cleanup

* added required data argument to logError calls

* fix overflowing practice activity card and audio player on mobile

---------

Co-authored-by: wcjord <32568597+wcjord@users.noreply.github.com>
2024-12-27 12:42:49 -05:00

115 lines
3.2 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:material_symbols_icons/symbols.dart';
import 'package:matrix/matrix.dart';
enum MessageMode {
practiceActivity,
textToSpeech,
translation,
speechToText,
wordZoom,
noneSelected,
}
extension MessageModeExtension on MessageMode {
IconData get icon {
switch (this) {
case MessageMode.translation:
return Icons.g_translate;
case MessageMode.textToSpeech:
return Symbols.text_to_speech;
case MessageMode.speechToText:
return Symbols.speech_to_text;
case MessageMode.practiceActivity:
return Symbols.fitness_center;
case MessageMode.wordZoom:
return Symbols.dictionary;
case MessageMode.noneSelected:
return Icons.error;
}
}
String title(BuildContext context) {
switch (this) {
case MessageMode.translation:
return L10n.of(context).translations;
case MessageMode.textToSpeech:
return L10n.of(context).messageAudio;
case MessageMode.speechToText:
return L10n.of(context).speechToTextTooltip;
case MessageMode.practiceActivity:
return L10n.of(context).practice;
case MessageMode.wordZoom:
return L10n.of(context).vocab;
case MessageMode.noneSelected:
return '';
}
}
String tooltip(BuildContext context) {
switch (this) {
case MessageMode.translation:
return L10n.of(context).translationTooltip;
case MessageMode.textToSpeech:
return L10n.of(context).audioTooltip;
case MessageMode.speechToText:
return L10n.of(context).speechToTextTooltip;
case MessageMode.practiceActivity:
return L10n.of(context).practice;
case MessageMode.wordZoom:
return L10n.of(context).vocab;
case MessageMode.noneSelected:
return '';
}
}
bool shouldShowAsToolbarButton(Event event) {
switch (this) {
case MessageMode.translation:
case MessageMode.textToSpeech:
return event.messageType == MessageTypes.Text;
case MessageMode.speechToText:
return event.messageType == MessageTypes.Audio;
case MessageMode.practiceActivity:
return true;
case MessageMode.wordZoom:
case MessageMode.noneSelected:
return false;
}
}
bool isUnlocked(
int index,
int numActivitiesCompleted,
bool totallyDone,
) =>
numActivitiesCompleted >= index || totallyDone;
bool get showButton => this != MessageMode.practiceActivity;
Color iconButtonColor(
BuildContext context,
int index,
MessageMode currentMode,
int numActivitiesCompleted,
bool totallyDone,
) {
//locked
if (!isUnlocked(index, numActivitiesCompleted, totallyDone)) {
return barAndLockedButtonColor(context);
}
//unlocked and active
if (this == currentMode) return Theme.of(context).colorScheme.primary;
//unlocked and inactive
return Theme.of(context).colorScheme.primaryContainer;
}
static Color barAndLockedButtonColor(BuildContext context) {
return Theme.of(context).brightness == Brightness.dark
? Colors.grey[800]!
: Colors.grey[200]!;
}
}