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.
fluffychat/lib/pangea/analytics_details_popup/analytics_details_popup.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!),
),
],
),
);
}
}