You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
4.6 KiB
Dart
150 lines
4.6 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
import 'package:fluffychat/pangea/analytics_details_popup/morph_analytics_list_view.dart';
|
|
import 'package:fluffychat/pangea/analytics_details_popup/morph_details_view.dart';
|
|
import 'package:fluffychat/pangea/analytics_details_popup/vocab_analytics_details_view.dart';
|
|
import 'package:fluffychat/pangea/analytics_details_popup/vocab_analytics_list_view.dart';
|
|
import 'package:fluffychat/pangea/analytics_downloads/analytics_download_button.dart';
|
|
import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.dart';
|
|
import 'package:fluffychat/pangea/common/utils/error_handler.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';
|
|
import 'package:fluffychat/pangea/morphs/morph_models.dart';
|
|
import 'package:fluffychat/pangea/morphs/morph_repo.dart';
|
|
import 'package:fluffychat/widgets/matrix.dart';
|
|
|
|
class AnalyticsPopupWrapper extends StatefulWidget {
|
|
const AnalyticsPopupWrapper({
|
|
super.key,
|
|
this.constructZoom,
|
|
required this.view,
|
|
this.backButtonOverride,
|
|
});
|
|
|
|
final ConstructTypeEnum view;
|
|
final ConstructIdentifier? constructZoom;
|
|
final Widget? backButtonOverride;
|
|
|
|
@override
|
|
AnalyticsPopupWrapperState createState() => AnalyticsPopupWrapperState();
|
|
}
|
|
|
|
class AnalyticsPopupWrapperState extends State<AnalyticsPopupWrapper> {
|
|
ConstructIdentifier? localConstructZoom;
|
|
ConstructTypeEnum localView = ConstructTypeEnum.vocab;
|
|
|
|
MorphFeaturesAndTags morphs = defaultMorphMapping;
|
|
List<MorphFeature> features = defaultMorphMapping.displayFeatures;
|
|
|
|
bool isSearching = false;
|
|
final TextEditingController searchController = TextEditingController();
|
|
ConstructLevelEnum? selectedConstructLevel;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
localView = widget.view;
|
|
setConstructZoom(widget.constructZoom);
|
|
_setMorphs();
|
|
searchController.addListener(() {
|
|
if (mounted) setState(() {});
|
|
});
|
|
}
|
|
|
|
@override
|
|
void didUpdateWidget(covariant AnalyticsPopupWrapper oldWidget) {
|
|
super.didUpdateWidget(oldWidget);
|
|
if (widget.constructZoom != oldWidget.constructZoom) {
|
|
setConstructZoom(widget.constructZoom);
|
|
}
|
|
if (widget.view != oldWidget.view) {
|
|
localView = widget.view;
|
|
localConstructZoom = null;
|
|
setState(() {});
|
|
}
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
searchController.dispose();
|
|
super.dispose();
|
|
}
|
|
|
|
Future<void> _setMorphs() async {
|
|
try {
|
|
final resp = await MorphsRepo.get();
|
|
morphs = resp;
|
|
features = resp.displayFeatures;
|
|
} catch (e, s) {
|
|
ErrorHandler.logError(
|
|
e: e,
|
|
s: s,
|
|
data: {"l2": MatrixState.pangeaController.languageController.userL2},
|
|
);
|
|
} finally {
|
|
features.sort(
|
|
(a, b) => morphFeatureSortOrder
|
|
.indexOf(a.feature)
|
|
.compareTo(morphFeatureSortOrder.indexOf(b.feature)),
|
|
);
|
|
if (mounted) setState(() {});
|
|
}
|
|
}
|
|
|
|
void setConstructZoom(ConstructIdentifier? id) {
|
|
if (id != null && id.type != localView) {
|
|
localView = id.type;
|
|
}
|
|
localConstructZoom = id;
|
|
setState(() => {});
|
|
}
|
|
|
|
void setSelectedConstructLevel(ConstructLevelEnum level) {
|
|
setState(() {
|
|
selectedConstructLevel = selectedConstructLevel == level ? null : level;
|
|
});
|
|
}
|
|
|
|
void toggleSearching() {
|
|
setState(() {
|
|
isSearching = !isSearching;
|
|
selectedConstructLevel = null;
|
|
searchController.clear();
|
|
});
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
body: Column(
|
|
children: [
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
localConstructZoom != null
|
|
? IconButton(
|
|
icon: const Icon(Icons.arrow_back),
|
|
onPressed: () {
|
|
setConstructZoom(null);
|
|
},
|
|
)
|
|
: const SizedBox(),
|
|
const DownloadAnalyticsButton(),
|
|
],
|
|
),
|
|
Expanded(
|
|
child: localView == ConstructTypeEnum.morph
|
|
? localConstructZoom == null
|
|
? MorphAnalyticsListView(controller: this)
|
|
: MorphDetailsView(constructId: localConstructZoom!)
|
|
: localConstructZoom == null
|
|
? VocabAnalyticsListView(controller: this)
|
|
: VocabDetailsView(constructId: localConstructZoom!),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|