resolve merge conflict
This commit is contained in:
commit
ca71286e40
26 changed files with 1163 additions and 841 deletions
|
|
@ -27,9 +27,10 @@ abstract class AppConfig {
|
|||
static const bool allowOtherHomeservers = true;
|
||||
static const bool enableRegistration = true;
|
||||
// #Pangea
|
||||
static const double toolbarMaxHeight = 250.0;
|
||||
static const double toolbarMaxHeight = 225.0;
|
||||
static const double toolbarMinHeight = 150.0;
|
||||
static const double toolbarMinWidth = 350.0;
|
||||
static const double toolbarMenuHeight = 215.0;
|
||||
static const double defaultHeaderHeight = 56.0;
|
||||
static const double toolbarButtonsHeight = 50.0;
|
||||
static const double toolbarSpacing = 8.0;
|
||||
|
|
@ -89,6 +90,8 @@ abstract class AppConfig {
|
|||
static String _privacyUrl = "https://www.pangeachat.com/privacy";
|
||||
//Pangea#
|
||||
|
||||
static const Set<String> defaultReactions = {'👍', '❤️', '😂', '😮', '😢'};
|
||||
|
||||
static String get privacyUrl => _privacyUrl;
|
||||
// #Pangea
|
||||
// static const String website = 'https://fluffychat.im';
|
||||
|
|
|
|||
|
|
@ -32,7 +32,9 @@ import 'package:fluffychat/pages/settings_style/settings_style.dart';
|
|||
import 'package:fluffychat/pangea/activity_generator/activity_generator.dart';
|
||||
import 'package:fluffychat/pangea/activity_planner/activity_planner_page.dart';
|
||||
import 'package:fluffychat/pangea/analytics_page/analytics_page.dart';
|
||||
import 'package:fluffychat/pangea/analytics_summary/progress_indicators_enum.dart';
|
||||
import 'package:fluffychat/pangea/common/widgets/pangea_side_view.dart';
|
||||
import 'package:fluffychat/pangea/constructs/construct_identifier.dart';
|
||||
import 'package:fluffychat/pangea/find_your_people/find_your_people.dart';
|
||||
import 'package:fluffychat/pangea/guard/p_vguard.dart';
|
||||
import 'package:fluffychat/pangea/learning_settings/pages/settings_learning.dart';
|
||||
|
|
@ -332,7 +334,14 @@ abstract class AppRoutes {
|
|||
pageBuilder: (context, state) => defaultPageBuilder(
|
||||
context,
|
||||
state,
|
||||
const AnalyticsPage(),
|
||||
AnalyticsPage(
|
||||
selectedIndicator: ProgressIndicatorEnum.fromString(
|
||||
state.uri.queryParameters['mode'] ?? 'vocab',
|
||||
),
|
||||
constructZoom: state.extra is ConstructIdentifier
|
||||
? state.extra as ConstructIdentifier
|
||||
: null,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
|
|
|
|||
|
|
@ -5033,5 +5033,6 @@
|
|||
},
|
||||
"failedToFetchTranscription": "Failed to fetch transcription",
|
||||
"deleteEmptySpaceDesc": "The space will be deleted for all participants. This action cannot be undone.",
|
||||
"customReaction": "Custom reaction",
|
||||
"regenerate": "Regenerate"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2099,10 +2099,10 @@ class ChatController extends State<ChatPageWithRoom>
|
|||
OverlayUtil.showOverlay(
|
||||
context: context,
|
||||
child: overlayEntry!,
|
||||
transformTargetId: "",
|
||||
position: OverlayPositionEnum.centered,
|
||||
onDismiss: clearSelectedEvents,
|
||||
blurBackground: true,
|
||||
backgroundColor: Colors.black,
|
||||
);
|
||||
|
||||
// select the message
|
||||
|
|
|
|||
|
|
@ -1,4 +1,14 @@
|
|||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:flutter_highlighter/flutter_highlighter.dart';
|
||||
import 'package:flutter_highlighter/themes/shades-of-purple.dart';
|
||||
import 'package:flutter_linkify/flutter_linkify.dart';
|
||||
import 'package:html/dom.dart' as dom;
|
||||
import 'package:html/parser.dart' as parser;
|
||||
import 'package:matrix/matrix.dart';
|
||||
|
||||
import 'package:fluffychat/config/app_config.dart';
|
||||
import 'package:fluffychat/pages/chat/chat.dart';
|
||||
import 'package:fluffychat/pangea/common/utils/any_state_holder.dart';
|
||||
|
|
@ -13,15 +23,6 @@ import 'package:fluffychat/widgets/avatar.dart';
|
|||
import 'package:fluffychat/widgets/future_loading_dialog.dart';
|
||||
import 'package:fluffychat/widgets/matrix.dart';
|
||||
import 'package:fluffychat/widgets/mxc_image.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_highlighter/flutter_highlighter.dart';
|
||||
import 'package:flutter_highlighter/themes/shades-of-purple.dart';
|
||||
import 'package:flutter_linkify/flutter_linkify.dart';
|
||||
import 'package:html/dom.dart' as dom;
|
||||
import 'package:html/parser.dart' as parser;
|
||||
import 'package:matrix/matrix.dart';
|
||||
|
||||
import '../../../utils/url_launcher.dart';
|
||||
|
||||
class HtmlMessage extends StatelessWidget {
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ import 'package:matrix/matrix.dart';
|
|||
|
||||
import 'package:fluffychat/l10n/l10n.dart';
|
||||
import 'package:fluffychat/utils/date_time_extension.dart';
|
||||
import 'package:fluffychat/utils/matrix_sdk_extensions/filtered_timeline_extension.dart';
|
||||
import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart';
|
||||
import 'package:fluffychat/utils/url_launcher.dart';
|
||||
import 'package:fluffychat/widgets/avatar.dart';
|
||||
|
|
@ -51,6 +52,9 @@ class ChatSearchMessageTab extends StatelessWidget {
|
|||
);
|
||||
}
|
||||
final events = snapshot.data?.$1 ?? [];
|
||||
// #Pangea
|
||||
events.removeWhere((event) => !event.isVisibleInGui);
|
||||
// Pangea#
|
||||
|
||||
return SelectionArea(
|
||||
child: ListView.separated(
|
||||
|
|
|
|||
|
|
@ -12,7 +12,6 @@ import 'package:fluffychat/pangea/analytics_downloads/analytics_download_button.
|
|||
import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.dart';
|
||||
import 'package:fluffychat/pangea/analytics_summary/progress_indicators_enum.dart';
|
||||
import 'package:fluffychat/pangea/common/utils/error_handler.dart';
|
||||
import 'package:fluffychat/pangea/common/widgets/full_width_dialog.dart';
|
||||
import 'package:fluffychat/pangea/constructs/construct_identifier.dart';
|
||||
import 'package:fluffychat/pangea/constructs/construct_level_enum.dart';
|
||||
import 'package:fluffychat/pangea/morphs/default_morph_mapping.dart';
|
||||
|
|
@ -34,26 +33,6 @@ class AnalyticsPopupWrapper extends StatefulWidget {
|
|||
final Widget? backButtonOverride;
|
||||
final bool showAppBar;
|
||||
|
||||
static void show(
|
||||
BuildContext context, {
|
||||
ConstructIdentifier? constructZoom,
|
||||
ConstructTypeEnum view = ConstructTypeEnum.vocab,
|
||||
Widget? backButtonOverride,
|
||||
}) {
|
||||
showDialog<AnalyticsPopupWrapper>(
|
||||
context: context,
|
||||
builder: (context) => FullWidthDialog(
|
||||
maxWidth: 600,
|
||||
maxHeight: 800,
|
||||
dialogContent: AnalyticsPopupWrapper(
|
||||
constructZoom: constructZoom,
|
||||
view: view,
|
||||
backButtonOverride: backButtonOverride,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
AnalyticsPopupWrapperState createState() => AnalyticsPopupWrapperState();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,9 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:fluffychat/l10n/l10n.dart';
|
||||
import 'package:fluffychat/pangea/analytics_downloads/space_analytics_summary_enum.dart';
|
||||
import 'package:fluffychat/pangea/analytics_misc/learning_skills_enum.dart';
|
||||
import 'package:fluffychat/pangea/practice_activities/activity_type_enum.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
enum ConstructUseTypeEnum {
|
||||
/// produced in chat by user, igc was run, and we've judged it to be a correct use
|
||||
|
|
|
|||
|
|
@ -2,9 +2,16 @@ import 'package:flutter/material.dart';
|
|||
|
||||
import 'package:fluffychat/pangea/analytics_page/analytics_page_view.dart';
|
||||
import 'package:fluffychat/pangea/analytics_summary/progress_indicators_enum.dart';
|
||||
import 'package:fluffychat/pangea/constructs/construct_identifier.dart';
|
||||
|
||||
class AnalyticsPage extends StatefulWidget {
|
||||
const AnalyticsPage({super.key});
|
||||
final ProgressIndicatorEnum? selectedIndicator;
|
||||
final ConstructIdentifier? constructZoom;
|
||||
const AnalyticsPage({
|
||||
super.key,
|
||||
this.selectedIndicator,
|
||||
this.constructZoom,
|
||||
});
|
||||
|
||||
@override
|
||||
AnalyticsPageState createState() => AnalyticsPageState();
|
||||
|
|
@ -13,9 +20,23 @@ class AnalyticsPage extends StatefulWidget {
|
|||
class AnalyticsPageState extends State<AnalyticsPage> {
|
||||
ProgressIndicatorEnum? selectedIndicator = ProgressIndicatorEnum.wordsUsed;
|
||||
|
||||
void onIndicatorSelected(ProgressIndicatorEnum indicator) => setState(() {
|
||||
selectedIndicator = indicator;
|
||||
});
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
selectedIndicator = widget.selectedIndicator ??
|
||||
ProgressIndicatorEnum.wordsUsed; // Default to wordsUsed if not set
|
||||
}
|
||||
|
||||
@override
|
||||
void didUpdateWidget(covariant AnalyticsPage oldWidget) {
|
||||
super.didUpdateWidget(oldWidget);
|
||||
if (oldWidget.selectedIndicator != widget.selectedIndicator &&
|
||||
widget.selectedIndicator != null) {
|
||||
setState(
|
||||
() => selectedIndicator = widget.selectedIndicator!,
|
||||
); // Update to new value
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) => AnalyticsPageView(controller: this);
|
||||
|
|
|
|||
|
|
@ -46,7 +46,6 @@ class AnalyticsPageView extends StatelessWidget {
|
|||
children: [
|
||||
LearningProgressIndicators(
|
||||
selected: controller.selectedIndicator,
|
||||
onIndicatorSelected: controller.onIndicatorSelected,
|
||||
),
|
||||
Expanded(
|
||||
child: Builder(
|
||||
|
|
@ -56,13 +55,15 @@ class AnalyticsPageView extends StatelessWidget {
|
|||
return const LevelDialogContent();
|
||||
} else if (controller.selectedIndicator ==
|
||||
ProgressIndicatorEnum.morphsUsed) {
|
||||
return const AnalyticsPopupWrapper(
|
||||
return AnalyticsPopupWrapper(
|
||||
constructZoom: controller.widget.constructZoom,
|
||||
view: ConstructTypeEnum.morph,
|
||||
showAppBar: false,
|
||||
);
|
||||
} else if (controller.selectedIndicator ==
|
||||
ProgressIndicatorEnum.wordsUsed) {
|
||||
return const AnalyticsPopupWrapper(
|
||||
return AnalyticsPopupWrapper(
|
||||
constructZoom: controller.widget.constructZoom,
|
||||
view: ConstructTypeEnum.vocab,
|
||||
showAppBar: false,
|
||||
);
|
||||
|
|
|
|||
|
|
@ -2,13 +2,13 @@ import 'dart:async';
|
|||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:fluffychat/pangea/analytics_details_popup/analytics_details_popup.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
|
||||
import 'package:fluffychat/pangea/analytics_misc/construct_list_model.dart';
|
||||
import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.dart';
|
||||
import 'package:fluffychat/pangea/analytics_misc/get_analytics_controller.dart';
|
||||
import 'package:fluffychat/pangea/analytics_summary/learning_progress_bar.dart';
|
||||
import 'package:fluffychat/pangea/analytics_summary/learning_progress_indicator_button.dart';
|
||||
import 'package:fluffychat/pangea/analytics_summary/level_bar_popup.dart';
|
||||
import 'package:fluffychat/pangea/analytics_summary/progress_indicator.dart';
|
||||
import 'package:fluffychat/pangea/analytics_summary/progress_indicators_enum.dart';
|
||||
import 'package:fluffychat/pangea/learning_settings/pages/settings_learning.dart';
|
||||
|
|
@ -20,11 +20,9 @@ import 'package:fluffychat/widgets/matrix.dart';
|
|||
/// be clicked to access more fine-grained analytics data.
|
||||
class LearningProgressIndicators extends StatefulWidget {
|
||||
final ProgressIndicatorEnum? selected;
|
||||
final Function(ProgressIndicatorEnum)? onIndicatorSelected;
|
||||
const LearningProgressIndicators({
|
||||
super.key,
|
||||
this.selected,
|
||||
this.onIndicatorSelected,
|
||||
});
|
||||
|
||||
@override
|
||||
|
|
@ -114,16 +112,8 @@ class LearningProgressIndicatorsState
|
|||
(c) => HoverButton(
|
||||
selected: widget.selected == c.indicator,
|
||||
onPressed: () {
|
||||
if (widget.onIndicatorSelected != null) {
|
||||
widget.onIndicatorSelected?.call(
|
||||
c.indicator,
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
AnalyticsPopupWrapper.show(
|
||||
context,
|
||||
view: c,
|
||||
context.go(
|
||||
"/rooms/analytics?mode=${c.indicator.toShortString()}",
|
||||
);
|
||||
},
|
||||
child: ProgressIndicatorBadge(
|
||||
|
|
@ -180,16 +170,7 @@ class LearningProgressIndicatorsState
|
|||
cursor: SystemMouseCursors.click,
|
||||
child: GestureDetector(
|
||||
onTap: () {
|
||||
if (widget.onIndicatorSelected != null) {
|
||||
widget.onIndicatorSelected
|
||||
?.call(ProgressIndicatorEnum.level);
|
||||
return;
|
||||
}
|
||||
|
||||
showDialog<LevelBarPopup>(
|
||||
context: context,
|
||||
builder: (c) => const LevelBarPopup(),
|
||||
);
|
||||
context.go("/rooms/analytics?mode=level");
|
||||
},
|
||||
child: Row(
|
||||
spacing: 8.0,
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import 'package:fluffychat/pangea/analytics_summary/progress_indicators_enum.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:fluffychat/pangea/analytics_summary/progress_indicators_enum.dart';
|
||||
|
||||
/// A badge that represents one learning progress indicator (i.e., construct uses)
|
||||
class ProgressIndicatorBadge extends StatelessWidget {
|
||||
final bool loading;
|
||||
|
|
|
|||
|
|
@ -8,7 +8,31 @@ import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.dart';
|
|||
enum ProgressIndicatorEnum {
|
||||
level,
|
||||
wordsUsed,
|
||||
morphsUsed,
|
||||
morphsUsed;
|
||||
|
||||
static ProgressIndicatorEnum? fromString(String value) {
|
||||
switch (value) {
|
||||
case 'vocab':
|
||||
return ProgressIndicatorEnum.wordsUsed;
|
||||
case 'morphs':
|
||||
return ProgressIndicatorEnum.morphsUsed;
|
||||
case 'level':
|
||||
return ProgressIndicatorEnum.level;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
String toShortString() {
|
||||
switch (this) {
|
||||
case ProgressIndicatorEnum.wordsUsed:
|
||||
return 'vocab';
|
||||
case ProgressIndicatorEnum.morphsUsed:
|
||||
return 'morphs';
|
||||
case ProgressIndicatorEnum.level:
|
||||
return 'level';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension ProgressIndicatorsExtension on ProgressIndicatorEnum {
|
||||
|
|
|
|||
|
|
@ -4,11 +4,11 @@ import 'dart:async';
|
|||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:go_router/go_router.dart';
|
||||
|
||||
import 'package:fluffychat/config/app_config.dart';
|
||||
import 'package:fluffychat/config/themes.dart';
|
||||
import 'package:fluffychat/l10n/l10n.dart';
|
||||
import 'package:fluffychat/pangea/analytics_details_popup/analytics_details_popup.dart';
|
||||
import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.dart';
|
||||
import 'package:fluffychat/pangea/analytics_misc/gain_points_animation.dart';
|
||||
import 'package:fluffychat/pangea/common/utils/overlay.dart';
|
||||
import 'package:fluffychat/pangea/constructs/construct_identifier.dart';
|
||||
|
|
@ -153,14 +153,9 @@ class ConstructNotificationOverlayState
|
|||
}
|
||||
|
||||
void _showDetails() {
|
||||
AnalyticsPopupWrapper.show(
|
||||
context,
|
||||
constructZoom: widget.construct,
|
||||
view: ConstructTypeEnum.morph,
|
||||
backButtonOverride: IconButton(
|
||||
icon: const Icon(Icons.close),
|
||||
onPressed: () => Navigator.of(context).pop(),
|
||||
),
|
||||
context.go(
|
||||
"/rooms/analytics?mode=morph",
|
||||
extra: widget.construct,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,9 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:go_router/go_router.dart';
|
||||
|
||||
import 'package:fluffychat/config/themes.dart';
|
||||
import 'package:fluffychat/l10n/l10n.dart';
|
||||
import 'package:fluffychat/pangea/analytics_details_popup/analytics_details_popup.dart';
|
||||
import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.dart';
|
||||
import 'package:fluffychat/pangea/analytics_summary/progress_indicators_enum.dart';
|
||||
import 'package:fluffychat/widgets/matrix.dart';
|
||||
|
|
@ -99,10 +100,15 @@ class MessageAnalyticsFeedbackState extends State<MessageAnalyticsFeedback>
|
|||
}
|
||||
|
||||
void _showAnalyticsDialog(ConstructTypeEnum? type) {
|
||||
AnalyticsPopupWrapper.show(
|
||||
context,
|
||||
view: type ?? ConstructTypeEnum.vocab,
|
||||
);
|
||||
switch (type) {
|
||||
case ConstructTypeEnum.morph:
|
||||
context.go("/rooms/analytics?mode=morph");
|
||||
break;
|
||||
case ConstructTypeEnum.vocab:
|
||||
default:
|
||||
context.go("/rooms/analytics?mode=vocab");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ class OverlayUtil {
|
|||
static showOverlay({
|
||||
required BuildContext context,
|
||||
required Widget child,
|
||||
required String transformTargetId,
|
||||
String? transformTargetId,
|
||||
backDropToDismiss = true,
|
||||
blurBackground = false,
|
||||
Color? borderColor,
|
||||
|
|
@ -37,6 +37,13 @@ class OverlayUtil {
|
|||
bool canPop = true,
|
||||
}) {
|
||||
try {
|
||||
if (position == OverlayPositionEnum.transform) {
|
||||
assert(
|
||||
transformTargetId != null,
|
||||
"transformTargetId must be provided when position is OverlayPositionEnum.transform",
|
||||
);
|
||||
}
|
||||
|
||||
if (closePrevOverlay) {
|
||||
MatrixState.pAnyState.closeOverlay();
|
||||
}
|
||||
|
|
@ -77,7 +84,7 @@ class OverlayUtil {
|
|||
followerAnchor:
|
||||
followerAnchor ?? Alignment.bottomCenter,
|
||||
link: MatrixState.pAnyState
|
||||
.layerLinkAndKey(transformTargetId)
|
||||
.layerLinkAndKey(transformTargetId!)
|
||||
.link,
|
||||
showWhenUnlinked: false,
|
||||
offset: offset ?? Offset.zero,
|
||||
|
|
|
|||
|
|
@ -1,8 +1,9 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:fluffychat/config/app_config.dart';
|
||||
import 'package:fluffychat/pangea/events/event_wrappers/pangea_message_event.dart';
|
||||
import 'package:fluffychat/pangea/toolbar/enums/reading_assistance_mode_enum.dart';
|
||||
import 'package:fluffychat/pangea/toolbar/widgets/message_selection_overlay.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class TokenRenderingUtil {
|
||||
final PangeaMessageEvent? pangeaMessageEvent;
|
||||
|
|
|
|||
|
|
@ -2,7 +2,13 @@ import 'dart:async';
|
|||
import 'dart:developer';
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/scheduler.dart';
|
||||
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:matrix/matrix.dart';
|
||||
|
||||
import 'package:fluffychat/config/app_config.dart';
|
||||
import 'package:fluffychat/pages/chat/chat.dart';
|
||||
import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.dart';
|
||||
|
|
@ -32,10 +38,6 @@ import 'package:fluffychat/pangea/toolbar/reading_assistance_input_row/morph_sel
|
|||
import 'package:fluffychat/pangea/toolbar/widgets/message_selection_positioner.dart';
|
||||
import 'package:fluffychat/pangea/toolbar/widgets/reading_assistance_content.dart';
|
||||
import 'package:fluffychat/widgets/matrix.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/scheduler.dart';
|
||||
import 'package:matrix/matrix.dart';
|
||||
|
||||
/// Controls data at the top level of the toolbar (mainly token / toolbar mode selection)
|
||||
class MessageSelectionOverlay extends StatefulWidget {
|
||||
|
|
@ -228,16 +230,16 @@ class MessageOverlayController extends State<MessageSelectionOverlay>
|
|||
|
||||
updateSelectedSpan(widget._initialSelectedToken!.text);
|
||||
|
||||
int retries = 0;
|
||||
while (retries < 5 &&
|
||||
selectedToken != null &&
|
||||
!MatrixState.pAnyState.isOverlayOpen(
|
||||
selectedToken!.text.uniqueKey,
|
||||
)) {
|
||||
await Future.delayed(const Duration(milliseconds: 100));
|
||||
_showReadingAssistanceContent();
|
||||
retries++;
|
||||
}
|
||||
// int retries = 0;
|
||||
// while (retries < 5 &&
|
||||
// selectedToken != null &&
|
||||
// !MatrixState.pAnyState.isOverlayOpen(
|
||||
// selectedToken!.text.uniqueKey,
|
||||
// )) {
|
||||
// await Future.delayed(const Duration(milliseconds: 100));
|
||||
// _showReadingAssistanceContent();
|
||||
// retries++;
|
||||
// }
|
||||
}
|
||||
|
||||
/////////////////////////////////////
|
||||
|
|
@ -307,9 +309,9 @@ class MessageOverlayController extends State<MessageSelectionOverlay>
|
|||
}
|
||||
|
||||
if (mounted) setState(() {});
|
||||
Future.delayed(const Duration(milliseconds: 10), () {
|
||||
_showReadingAssistanceContent();
|
||||
});
|
||||
// Future.delayed(const Duration(milliseconds: 10), () {
|
||||
// _showReadingAssistanceContent();
|
||||
// });
|
||||
}
|
||||
|
||||
void _showReadingAssistanceContent() {
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -4,7 +4,6 @@ import 'package:matrix/matrix.dart';
|
|||
|
||||
import 'package:fluffychat/pages/chat/chat.dart';
|
||||
import 'package:fluffychat/pages/chat/events/message_reactions.dart';
|
||||
import 'package:fluffychat/pangea/events/event_wrappers/pangea_message_event.dart';
|
||||
import 'package:fluffychat/pangea/toolbar/enums/reading_assistance_mode_enum.dart';
|
||||
import 'package:fluffychat/pangea/toolbar/widgets/measure_render_box.dart';
|
||||
import 'package:fluffychat/pangea/toolbar/widgets/message_selection_overlay.dart';
|
||||
|
|
@ -15,7 +14,6 @@ class OverlayCenterContent extends StatelessWidget {
|
|||
final Event event;
|
||||
final Event? nextEvent;
|
||||
final Event? prevEvent;
|
||||
final PangeaMessageEvent? pangeaMessageEvent;
|
||||
|
||||
final MessageOverlayController overlayController;
|
||||
final ChatController chatController;
|
||||
|
|
@ -25,8 +23,6 @@ class OverlayCenterContent extends StatelessWidget {
|
|||
|
||||
final double? messageHeight;
|
||||
final double? messageWidth;
|
||||
final double maxWidth;
|
||||
final double maxHeight;
|
||||
|
||||
final bool hasReactions;
|
||||
|
||||
|
|
@ -37,11 +33,8 @@ class OverlayCenterContent extends StatelessWidget {
|
|||
required this.event,
|
||||
required this.messageHeight,
|
||||
required this.messageWidth,
|
||||
required this.maxWidth,
|
||||
required this.maxHeight,
|
||||
required this.overlayController,
|
||||
required this.chatController,
|
||||
required this.pangeaMessageEvent,
|
||||
required this.nextEvent,
|
||||
required this.prevEvent,
|
||||
required this.hasReactions,
|
||||
|
|
@ -58,7 +51,7 @@ class OverlayCenterContent extends StatelessWidget {
|
|||
ignoring: !isTransitionAnimation &&
|
||||
readingAssistanceMode != ReadingAssistanceMode.practiceMode,
|
||||
child: Container(
|
||||
constraints: BoxConstraints(maxWidth: maxWidth),
|
||||
constraints: BoxConstraints(maxWidth: overlayController.maxWidth),
|
||||
child: Material(
|
||||
type: MaterialType.transparency,
|
||||
child: Column(
|
||||
|
|
@ -76,7 +69,6 @@ class OverlayCenterContent extends StatelessWidget {
|
|||
.key
|
||||
: null,
|
||||
event,
|
||||
pangeaMessageEvent: pangeaMessageEvent,
|
||||
immersionMode: chatController.choreographer.immersionMode,
|
||||
controller: chatController,
|
||||
overlayController: overlayController,
|
||||
|
|
@ -93,7 +85,6 @@ class OverlayCenterContent extends StatelessWidget {
|
|||
(sizeAnimation == null && isTransitionAnimation)
|
||||
? messageHeight
|
||||
: null,
|
||||
maxHeight: maxHeight,
|
||||
isTransitionAnimation: isTransitionAnimation,
|
||||
readingAssistanceMode: readingAssistanceMode,
|
||||
),
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
import 'dart:math';
|
||||
|
||||
import 'package:flutter/gestures.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:matrix/matrix.dart';
|
||||
|
|
@ -12,7 +11,6 @@ import 'package:fluffychat/pages/chat/chat.dart';
|
|||
import 'package:fluffychat/pages/chat/events/message_content.dart';
|
||||
import 'package:fluffychat/pages/chat/events/reply_content.dart';
|
||||
import 'package:fluffychat/pangea/bot/utils/bot_name.dart';
|
||||
import 'package:fluffychat/pangea/events/event_wrappers/pangea_message_event.dart';
|
||||
import 'package:fluffychat/pangea/events/extensions/pangea_event_extension.dart';
|
||||
import 'package:fluffychat/pangea/learning_settings/models/language_model.dart';
|
||||
import 'package:fluffychat/pangea/learning_settings/utils/p_language_store.dart';
|
||||
|
|
@ -28,7 +26,6 @@ import 'package:fluffychat/widgets/matrix.dart';
|
|||
// @ggurdin be great to explain the need/function of a widget like this
|
||||
class OverlayMessage extends StatelessWidget {
|
||||
final Event event;
|
||||
final PangeaMessageEvent? pangeaMessageEvent;
|
||||
final MessageOverlayController overlayController;
|
||||
final ChatController controller;
|
||||
final Event? nextEvent;
|
||||
|
|
@ -39,7 +36,6 @@ class OverlayMessage extends StatelessWidget {
|
|||
final Animation<Size>? sizeAnimation;
|
||||
final double? messageWidth;
|
||||
final double? messageHeight;
|
||||
final double maxHeight;
|
||||
|
||||
final bool isTransitionAnimation;
|
||||
final ReadingAssistanceMode? readingAssistanceMode;
|
||||
|
|
@ -52,8 +48,6 @@ class OverlayMessage extends StatelessWidget {
|
|||
required this.timeline,
|
||||
required this.messageWidth,
|
||||
required this.messageHeight,
|
||||
required this.maxHeight,
|
||||
this.pangeaMessageEvent,
|
||||
this.nextEvent,
|
||||
this.previousEvent,
|
||||
this.sizeAnimation,
|
||||
|
|
@ -146,7 +140,8 @@ class OverlayMessage extends StatelessWidget {
|
|||
final showTranslation = overlayController.showTranslation &&
|
||||
overlayController.translation != null;
|
||||
|
||||
final showTranscription = pangeaMessageEvent?.isAudioMessage == true;
|
||||
final showTranscription =
|
||||
overlayController.pangeaMessageEvent?.isAudioMessage == true;
|
||||
|
||||
final showSpeechTranslation = overlayController.showSpeechTranslation &&
|
||||
overlayController.speechTranslation != null;
|
||||
|
|
@ -284,115 +279,109 @@ class OverlayMessage extends StatelessWidget {
|
|||
),
|
||||
width: messageWidth,
|
||||
height: messageHeight,
|
||||
constraints: BoxConstraints(
|
||||
maxHeight: maxHeight,
|
||||
),
|
||||
child: SingleChildScrollView(
|
||||
dragStartBehavior: DragStartBehavior.down,
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
if (event.relationshipType == RelationshipTypes.reply)
|
||||
FutureBuilder<Event?>(
|
||||
future: event.getReplyEvent(
|
||||
timeline,
|
||||
),
|
||||
builder: (
|
||||
BuildContext context,
|
||||
snapshot,
|
||||
) {
|
||||
final replyEvent = snapshot.hasData
|
||||
? snapshot.data!
|
||||
: Event(
|
||||
eventId: event.relationshipEventId!,
|
||||
content: {
|
||||
'msgtype': 'm.text',
|
||||
'body': '...',
|
||||
},
|
||||
senderId: "",
|
||||
type: 'm.room.message',
|
||||
room: event.room,
|
||||
status: EventStatus.sent,
|
||||
originServerTs: DateTime.now(),
|
||||
);
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
left: 16,
|
||||
right: 16,
|
||||
top: 8,
|
||||
),
|
||||
child: Material(
|
||||
color: Colors.transparent,
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
if (event.relationshipType == RelationshipTypes.reply)
|
||||
FutureBuilder<Event?>(
|
||||
future: event.getReplyEvent(
|
||||
timeline,
|
||||
),
|
||||
builder: (
|
||||
BuildContext context,
|
||||
snapshot,
|
||||
) {
|
||||
final replyEvent = snapshot.hasData
|
||||
? snapshot.data!
|
||||
: Event(
|
||||
eventId: event.relationshipEventId!,
|
||||
content: {
|
||||
'msgtype': 'm.text',
|
||||
'body': '...',
|
||||
},
|
||||
senderId: "",
|
||||
type: 'm.room.message',
|
||||
room: event.room,
|
||||
status: EventStatus.sent,
|
||||
originServerTs: DateTime.now(),
|
||||
);
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
left: 16,
|
||||
right: 16,
|
||||
top: 8,
|
||||
),
|
||||
child: Material(
|
||||
color: Colors.transparent,
|
||||
borderRadius: ReplyContent.borderRadius,
|
||||
child: InkWell(
|
||||
borderRadius: ReplyContent.borderRadius,
|
||||
child: InkWell(
|
||||
borderRadius: ReplyContent.borderRadius,
|
||||
onTap: () => controller.scrollToEventId(
|
||||
replyEvent.eventId,
|
||||
),
|
||||
child: AbsorbPointer(
|
||||
child: ReplyContent(
|
||||
replyEvent,
|
||||
ownMessage: ownMessage,
|
||||
timeline: timeline,
|
||||
),
|
||||
onTap: () => controller.scrollToEventId(
|
||||
replyEvent.eventId,
|
||||
),
|
||||
child: AbsorbPointer(
|
||||
child: ReplyContent(
|
||||
replyEvent,
|
||||
ownMessage: ownMessage,
|
||||
timeline: timeline,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
MessageContent(
|
||||
displayEvent,
|
||||
textColor: textColor,
|
||||
linkColor: linkColor,
|
||||
borderRadius: borderRadius,
|
||||
timeline: timeline,
|
||||
pangeaMessageEvent: pangeaMessageEvent,
|
||||
immersionMode: immersionMode,
|
||||
overlayController: overlayController,
|
||||
controller: controller,
|
||||
nextEvent: nextEvent,
|
||||
prevEvent: previousEvent,
|
||||
isTransitionAnimation: isTransitionAnimation,
|
||||
readingAssistanceMode: readingAssistanceMode,
|
||||
selected: true,
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
if (event.hasAggregatedEvents(
|
||||
timeline,
|
||||
RelationshipTypes.edit,
|
||||
))
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
bottom: 8.0,
|
||||
left: 16.0,
|
||||
right: 16.0,
|
||||
),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
spacing: 4.0,
|
||||
children: [
|
||||
Icon(
|
||||
Icons.edit_outlined,
|
||||
color: textColor.withAlpha(164),
|
||||
size: 14,
|
||||
),
|
||||
Text(
|
||||
displayEvent.originServerTs.localizedTimeShort(
|
||||
context,
|
||||
),
|
||||
style: TextStyle(
|
||||
color: textColor.withAlpha(
|
||||
164,
|
||||
),
|
||||
fontSize: 11,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
MessageContent(
|
||||
displayEvent,
|
||||
textColor: textColor,
|
||||
linkColor: linkColor,
|
||||
borderRadius: borderRadius,
|
||||
timeline: timeline,
|
||||
pangeaMessageEvent: overlayController.pangeaMessageEvent,
|
||||
immersionMode: immersionMode,
|
||||
overlayController: overlayController,
|
||||
controller: controller,
|
||||
nextEvent: nextEvent,
|
||||
prevEvent: previousEvent,
|
||||
isTransitionAnimation: isTransitionAnimation,
|
||||
readingAssistanceMode: readingAssistanceMode,
|
||||
selected: true,
|
||||
),
|
||||
if (event.hasAggregatedEvents(
|
||||
timeline,
|
||||
RelationshipTypes.edit,
|
||||
))
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
bottom: 8.0,
|
||||
left: 16.0,
|
||||
right: 16.0,
|
||||
),
|
||||
],
|
||||
),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
spacing: 4.0,
|
||||
children: [
|
||||
Icon(
|
||||
Icons.edit_outlined,
|
||||
color: textColor.withAlpha(164),
|
||||
size: 14,
|
||||
),
|
||||
Text(
|
||||
displayEvent.originServerTs.localizedTimeShort(
|
||||
context,
|
||||
),
|
||||
style: TextStyle(
|
||||
color: textColor.withAlpha(
|
||||
164,
|
||||
),
|
||||
fontSize: 11,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
|
||||
|
|
@ -404,9 +393,8 @@ class OverlayMessage extends StatelessWidget {
|
|||
color: noBubble ? Colors.transparent : color,
|
||||
borderRadius: borderRadius,
|
||||
),
|
||||
constraints: BoxConstraints(
|
||||
constraints: const BoxConstraints(
|
||||
maxWidth: FluffyThemes.columnWidth * 1.5,
|
||||
maxHeight: maxHeight,
|
||||
),
|
||||
child: SingleChildScrollView(
|
||||
child: Column(
|
||||
|
|
|
|||
|
|
@ -1,5 +1,9 @@
|
|||
import 'dart:math';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:matrix/matrix_api_lite/model/message_types.dart';
|
||||
|
||||
import 'package:fluffychat/config/app_config.dart';
|
||||
import 'package:fluffychat/config/themes.dart';
|
||||
import 'package:fluffychat/l10n/l10n.dart';
|
||||
|
|
@ -12,8 +16,6 @@ import 'package:fluffychat/pangea/toolbar/widgets/practice_activity/practice_act
|
|||
import 'package:fluffychat/pangea/toolbar/widgets/toolbar_content_loading_indicator.dart';
|
||||
import 'package:fluffychat/pangea/toolbar/widgets/word_zoom/word_zoom_widget.dart';
|
||||
import 'package:fluffychat/widgets/matrix.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:matrix/matrix_api_lite/model/message_types.dart';
|
||||
|
||||
const double minCardHeight = 70;
|
||||
|
||||
|
|
@ -147,14 +149,13 @@ class ReadingAssistanceContentState extends State<ReadingAssistanceContent> {
|
|||
),
|
||||
),
|
||||
constraints: BoxConstraints(
|
||||
maxHeight: AppConfig.toolbarMaxHeight,
|
||||
minWidth: min(
|
||||
AppConfig.toolbarMinWidth,
|
||||
widget.overlayController.maxWidth,
|
||||
),
|
||||
minHeight: AppConfig.toolbarMinHeight,
|
||||
maxWidth: widget.overlayController.maxWidth,
|
||||
),
|
||||
height: AppConfig.toolbarMaxHeight,
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
|
|
|
|||
|
|
@ -11,12 +11,13 @@ import 'package:path_provider/path_provider.dart';
|
|||
|
||||
import 'package:fluffychat/config/app_config.dart';
|
||||
import 'package:fluffychat/l10n/l10n.dart';
|
||||
import 'package:fluffychat/pages/chat/chat.dart';
|
||||
import 'package:fluffychat/pages/chat/events/audio_player.dart';
|
||||
import 'package:fluffychat/pangea/common/utils/error_handler.dart';
|
||||
import 'package:fluffychat/pangea/common/widgets/pressable_button.dart';
|
||||
import 'package:fluffychat/pangea/events/event_wrappers/pangea_message_event.dart';
|
||||
import 'package:fluffychat/pangea/events/extensions/pangea_event_extension.dart';
|
||||
import 'package:fluffychat/pangea/events/models/representation_content_model.dart';
|
||||
import 'package:fluffychat/pangea/events/utils/report_message.dart';
|
||||
import 'package:fluffychat/pangea/toolbar/controllers/tts_controller.dart';
|
||||
import 'package:fluffychat/pangea/toolbar/widgets/message_audio_card.dart';
|
||||
import 'package:fluffychat/pangea/toolbar/widgets/message_selection_overlay.dart';
|
||||
|
|
@ -45,13 +46,74 @@ enum SelectMode {
|
|||
}
|
||||
}
|
||||
|
||||
enum MessageActions {
|
||||
reply,
|
||||
forward,
|
||||
edit,
|
||||
delete,
|
||||
copy,
|
||||
download,
|
||||
pin,
|
||||
report,
|
||||
info;
|
||||
|
||||
IconData get icon {
|
||||
switch (this) {
|
||||
case MessageActions.reply:
|
||||
return Icons.reply_all;
|
||||
case MessageActions.forward:
|
||||
return Symbols.forward;
|
||||
case MessageActions.edit:
|
||||
return Symbols.edit;
|
||||
case MessageActions.delete:
|
||||
return Symbols.delete;
|
||||
case MessageActions.copy:
|
||||
return Icons.copy_outlined;
|
||||
case MessageActions.download:
|
||||
return Symbols.download;
|
||||
case MessageActions.pin:
|
||||
return Symbols.push_pin;
|
||||
case MessageActions.report:
|
||||
return Icons.shield_outlined;
|
||||
case MessageActions.info:
|
||||
return Icons.info_outlined;
|
||||
}
|
||||
}
|
||||
|
||||
String tooltip(BuildContext context) {
|
||||
final l10n = L10n.of(context);
|
||||
switch (this) {
|
||||
case MessageActions.reply:
|
||||
return l10n.reply;
|
||||
case MessageActions.forward:
|
||||
return l10n.forward;
|
||||
case MessageActions.edit:
|
||||
return l10n.edit;
|
||||
case MessageActions.delete:
|
||||
return l10n.redactMessage;
|
||||
case MessageActions.copy:
|
||||
return l10n.copy;
|
||||
case MessageActions.download:
|
||||
return l10n.download;
|
||||
case MessageActions.pin:
|
||||
return l10n.pinMessage;
|
||||
case MessageActions.report:
|
||||
return l10n.reportMessage;
|
||||
case MessageActions.info:
|
||||
return l10n.messageInfo;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class SelectModeButtons extends StatefulWidget {
|
||||
final VoidCallback lauchPractice;
|
||||
final MessageOverlayController overlayController;
|
||||
final ChatController controller;
|
||||
|
||||
const SelectModeButtons({
|
||||
required this.lauchPractice,
|
||||
required this.overlayController,
|
||||
required this.controller,
|
||||
super.key,
|
||||
});
|
||||
|
||||
|
|
@ -475,46 +537,172 @@ class SelectModeButtonsState extends State<SelectModeButtons> {
|
|||
);
|
||||
}
|
||||
|
||||
bool _messageActionEnabled(MessageActions action) {
|
||||
if (messageEvent == null) return false;
|
||||
|
||||
switch (action) {
|
||||
case MessageActions.reply:
|
||||
return widget.controller.selectedEvents.length == 1 &&
|
||||
widget.controller.room.canSendDefaultMessages;
|
||||
case MessageActions.edit:
|
||||
return widget.controller.canEditSelectedEvents &&
|
||||
!widget.controller.selectedEvents.first.isActivityMessage;
|
||||
case MessageActions.delete:
|
||||
return widget.controller.canRedactSelectedEvents;
|
||||
case MessageActions.copy:
|
||||
return widget.controller.selectedEvents.length == 1 &&
|
||||
widget.controller.selectedEvents.single.messageType ==
|
||||
MessageTypes.Text;
|
||||
case MessageActions.download:
|
||||
return widget.controller.canSaveSelectedEvent;
|
||||
case MessageActions.pin:
|
||||
return widget.controller.canPinSelectedEvents;
|
||||
case MessageActions.forward:
|
||||
case MessageActions.report:
|
||||
case MessageActions.info:
|
||||
return widget.controller.selectedEvents.length == 1;
|
||||
}
|
||||
}
|
||||
|
||||
void _onActionPressed(MessageActions action) {
|
||||
switch (action) {
|
||||
case MessageActions.reply:
|
||||
widget.controller.replyAction();
|
||||
break;
|
||||
case MessageActions.forward:
|
||||
widget.controller.forwardEventsAction();
|
||||
break;
|
||||
case MessageActions.edit:
|
||||
widget.controller.editSelectedEventAction();
|
||||
break;
|
||||
case MessageActions.delete:
|
||||
widget.controller.redactEventsAction();
|
||||
break;
|
||||
case MessageActions.copy:
|
||||
widget.controller.copyEventsAction();
|
||||
break;
|
||||
case MessageActions.download:
|
||||
widget.controller.saveSelectedEvent(context);
|
||||
break;
|
||||
case MessageActions.pin:
|
||||
widget.controller.pinEvent();
|
||||
break;
|
||||
case MessageActions.report:
|
||||
final event = widget.controller.selectedEvents.first;
|
||||
widget.controller.clearSelectedEvents();
|
||||
reportEvent(
|
||||
event,
|
||||
widget.controller,
|
||||
widget.controller.context,
|
||||
);
|
||||
break;
|
||||
case MessageActions.info:
|
||||
widget.controller.showEventInfo();
|
||||
widget.controller.clearSelectedEvents();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final theme = Theme.of(context);
|
||||
final modes = messageEvent?.isAudioMessage == true ? audioModes : textModes;
|
||||
final actions = MessageActions.values.where(_messageActionEnabled);
|
||||
|
||||
return Container(
|
||||
height: AppConfig.toolbarButtonsHeight,
|
||||
alignment: Alignment.bottomCenter,
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
spacing: 4.0,
|
||||
children: [
|
||||
for (final mode in modes)
|
||||
TooltipVisibility(
|
||||
visible: (!_isError || mode != _selectedMode),
|
||||
child: Tooltip(
|
||||
message: mode.tooltip(context),
|
||||
child: PressableButton(
|
||||
depressed: mode == _selectedMode,
|
||||
borderRadius: BorderRadius.circular(20),
|
||||
color: Theme.of(context).colorScheme.primaryContainer,
|
||||
onPressed: () => _updateMode(mode),
|
||||
playSound: mode != SelectMode.audio,
|
||||
colorFactor: Theme.of(context).brightness == Brightness.light
|
||||
? 0.55
|
||||
: 0.3,
|
||||
child: Container(
|
||||
height: buttonSize,
|
||||
width: buttonSize,
|
||||
decoration: BoxDecoration(
|
||||
color: Theme.of(context).colorScheme.primaryContainer,
|
||||
shape: BoxShape.circle,
|
||||
),
|
||||
child: icon(mode),
|
||||
),
|
||||
return Material(
|
||||
type: MaterialType.transparency,
|
||||
child: Container(
|
||||
width: 250,
|
||||
constraints: const BoxConstraints(
|
||||
maxHeight: AppConfig.toolbarMenuHeight,
|
||||
),
|
||||
decoration: BoxDecoration(
|
||||
color: theme.colorScheme.surface,
|
||||
borderRadius: BorderRadius.circular(
|
||||
AppConfig.borderRadius,
|
||||
),
|
||||
),
|
||||
child: ListView.builder(
|
||||
shrinkWrap: true,
|
||||
itemCount: modes.length + actions.length + 1,
|
||||
itemBuilder: (context, index) {
|
||||
if (index < modes.length) {
|
||||
final mode = modes[index];
|
||||
return SizedBox(
|
||||
height: 50.0,
|
||||
child: ListTile(
|
||||
leading: Icon(mode.icon),
|
||||
title: Text(mode.tooltip(context)),
|
||||
onTap: () => _updateMode(mode),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
} else if (index == modes.length) {
|
||||
return const Divider(height: 1.0);
|
||||
} else {
|
||||
final action = actions.elementAt(index - modes.length - 1);
|
||||
return SizedBox(
|
||||
height: 50.0,
|
||||
child: ListTile(
|
||||
leading: Icon(action.icon),
|
||||
title: Text(action.tooltip(context)),
|
||||
onTap: () => _onActionPressed(action),
|
||||
),
|
||||
);
|
||||
}
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
// return SizedBox(
|
||||
// width: 150,
|
||||
// child: ListView.builder(
|
||||
// itemCount: modes.length,
|
||||
// itemBuilder: (context, index) {
|
||||
// final mode = modes[index];
|
||||
// return ListTile(
|
||||
// leading: Icon(mode.icon),
|
||||
// title: Text(mode.name),
|
||||
// onTap: () {
|
||||
// _updateMode(mode);
|
||||
// },
|
||||
// );
|
||||
// },
|
||||
// ),
|
||||
// );
|
||||
|
||||
// return Row(
|
||||
// crossAxisAlignment: CrossAxisAlignment.center,
|
||||
// mainAxisSize: MainAxisSize.min,
|
||||
// spacing: 4.0,
|
||||
// children: [
|
||||
// for (final mode in modes)
|
||||
// TooltipVisibility(
|
||||
// visible: (!_isError || mode != _selectedMode),
|
||||
// child: Tooltip(
|
||||
// message: mode.tooltip(context),
|
||||
// child: PressableButton(
|
||||
// depressed: mode == _selectedMode,
|
||||
// borderRadius: BorderRadius.circular(20),
|
||||
// color: Theme.of(context).colorScheme.primaryContainer,
|
||||
// onPressed: () => _updateMode(mode),
|
||||
// playSound: mode != SelectMode.audio,
|
||||
// colorFactor: Theme.of(context).brightness == Brightness.light
|
||||
// ? 0.55
|
||||
// : 0.3,
|
||||
// child: Container(
|
||||
// height: buttonSize,
|
||||
// width: buttonSize,
|
||||
// decoration: BoxDecoration(
|
||||
// color: Theme.of(context).colorScheme.primaryContainer,
|
||||
// shape: BoxShape.circle,
|
||||
// ),
|
||||
// child: icon(mode),
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// ],
|
||||
// );
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,11 +3,11 @@ import 'dart:developer';
|
|||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:material_symbols_icons/symbols.dart';
|
||||
|
||||
import 'package:fluffychat/config/app_config.dart';
|
||||
import 'package:fluffychat/l10n/l10n.dart';
|
||||
import 'package:fluffychat/pangea/analytics_details_popup/analytics_details_popup.dart';
|
||||
import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.dart';
|
||||
import 'package:fluffychat/pangea/common/utils/error_handler.dart';
|
||||
import 'package:fluffychat/pangea/common/utils/overlay.dart';
|
||||
|
|
@ -278,15 +278,9 @@ class MorphMeaningPopupState extends State<MorphMeaningPopup> {
|
|||
null)
|
||||
ConstructXpWidget(
|
||||
id: widget.cId,
|
||||
onTap: () => AnalyticsPopupWrapper.show(
|
||||
context,
|
||||
constructZoom: widget.cId,
|
||||
view: ConstructTypeEnum.morph,
|
||||
backButtonOverride: IconButton(
|
||||
icon: const Icon(Icons.close),
|
||||
onPressed: () =>
|
||||
Navigator.of(context).pop(),
|
||||
),
|
||||
onTap: () => context.go(
|
||||
"/rooms/analytics?mode=morph",
|
||||
extra: widget.cId,
|
||||
),
|
||||
),
|
||||
],
|
||||
|
|
|
|||
|
|
@ -1,8 +1,9 @@
|
|||
import 'dart:math';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:fluffychat/config/themes.dart';
|
||||
import 'package:fluffychat/pangea/constructs/construct_level_enum.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class NewWordOverlay extends StatefulWidget {
|
||||
final Color overlayColor;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:go_router/go_router.dart';
|
||||
|
||||
import 'package:fluffychat/config/app_config.dart';
|
||||
import 'package:fluffychat/l10n/l10n.dart';
|
||||
import 'package:fluffychat/pangea/analytics_details_popup/analytics_details_popup.dart';
|
||||
import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.dart';
|
||||
import 'package:fluffychat/pangea/events/event_wrappers/pangea_message_event.dart';
|
||||
import 'package:fluffychat/pangea/events/models/pangea_token_model.dart';
|
||||
import 'package:fluffychat/pangea/learning_settings/models/language_model.dart';
|
||||
|
|
@ -15,7 +17,6 @@ import 'package:fluffychat/pangea/toolbar/widgets/practice_activity/word_audio_b
|
|||
import 'package:fluffychat/pangea/toolbar/widgets/word_zoom/lemma_meaning_builder.dart';
|
||||
import 'package:fluffychat/pangea/toolbar/widgets/word_zoom/new_word_overlay.dart';
|
||||
import 'package:fluffychat/widgets/matrix.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class WordZoomWidget extends StatelessWidget {
|
||||
final PangeaToken token;
|
||||
|
|
@ -97,10 +98,9 @@ class WordZoomWidget extends StatelessWidget {
|
|||
),
|
||||
ConstructXpWidget(
|
||||
id: token.vocabConstructID,
|
||||
onTap: () => AnalyticsPopupWrapper.show(
|
||||
context,
|
||||
constructZoom: token.vocabConstructID,
|
||||
view: ConstructTypeEnum.vocab,
|
||||
onTap: () => context.go(
|
||||
"/rooms/analytics?mode=vocab",
|
||||
extra: token.vocabConstructID,
|
||||
),
|
||||
),
|
||||
],
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue