chore: scroll to top of learning settings dialog on language selection error (#2569)

pull/1817/head
ggurdin 6 months ago committed by GitHub
parent 9175a05fd1
commit 832879b9c2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -40,6 +40,8 @@ class SettingsLearningController extends State<SettingsLearning> {
final GlobalKey<FormState> formKey = GlobalKey<FormState>();
String? languageMatchError;
final ScrollController scrollController = ScrollController();
@override
void initState() {
super.initState();
@ -50,6 +52,7 @@ class SettingsLearningController extends State<SettingsLearning> {
@override
void dispose() {
tts.dispose();
scrollController.dispose();
super.dispose();
}
@ -100,6 +103,12 @@ class SettingsLearningController extends State<SettingsLearning> {
setState(() {
languageMatchError = L10n.of(context).noIdenticalLanguages;
});
scrollController.animateTo(
0,
duration: const Duration(milliseconds: 300),
curve: Curves.easeInOut,
);
return;
}

@ -124,139 +124,157 @@ class SettingsLearningView extends StatelessWidget {
child: ListTileTheme(
iconColor: Theme.of(context).textTheme.bodyLarge!.color,
child: MaxWidthBody(
withScrolling: false,
child: Column(
children: [
SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(16.0),
Expanded(
child: SingleChildScrollView(
controller: controller.scrollController,
child: Column(
spacing: 16.0,
children: [
PLanguageDropdown(
onChange: (lang) =>
controller.setSelectedLanguage(
sourceLanguage: lang,
),
initialLanguage:
controller.selectedSourceLanguage ??
LanguageModel.unknown,
languages: MatrixState
.pangeaController.pLanguageStore.baseOptions,
isL2List: false,
decorationText: L10n.of(context).myBaseLanguage,
hasError: controller.languageMatchError != null,
backgroundColor: Theme.of(context)
.colorScheme
.surfaceContainerHigh,
),
PLanguageDropdown(
onChange: (lang) =>
controller.setSelectedLanguage(
targetLanguage: lang,
),
initialLanguage:
controller.selectedTargetLanguage,
languages: MatrixState.pangeaController
.pLanguageStore.targetOptions,
isL2List: true,
decorationText: L10n.of(context).iWantToLearn,
error: controller.languageMatchError,
backgroundColor: Theme.of(context)
.colorScheme
.surfaceContainerHigh,
),
CountryPickerDropdown(controller),
LanguageLevelDropdown(
initialLevel: controller.cefrLevel,
onChanged: controller.setCefrLevel,
),
Container(
decoration: BoxDecoration(
border: Border.all(
color: Colors.white54,
),
borderRadius: BorderRadius.circular(8.0),
),
padding: const EdgeInsets.all(8.0),
Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
spacing: 16.0,
children: [
ProfileSettingsSwitchListTile.adaptive(
defaultValue: controller.getToolSetting(
ToolSetting.autoIGC,
PLanguageDropdown(
onChange: (lang) =>
controller.setSelectedLanguage(
sourceLanguage: lang,
),
title:
ToolSetting.autoIGC.toolName(context),
subtitle: ToolSetting.autoIGC
.toolDescription(context),
onChange: (bool value) =>
controller.updateToolSetting(
ToolSetting.autoIGC,
value,
initialLanguage:
controller.selectedSourceLanguage ??
LanguageModel.unknown,
languages: MatrixState.pangeaController
.pLanguageStore.baseOptions,
isL2List: false,
decorationText:
L10n.of(context).myBaseLanguage,
hasError:
controller.languageMatchError != null,
backgroundColor: Theme.of(context)
.colorScheme
.surfaceContainerHigh,
),
PLanguageDropdown(
onChange: (lang) =>
controller.setSelectedLanguage(
targetLanguage: lang,
),
enabled: true,
initialLanguage:
controller.selectedTargetLanguage,
languages: MatrixState.pangeaController
.pLanguageStore.targetOptions,
isL2List: true,
decorationText:
L10n.of(context).iWantToLearn,
error: controller.languageMatchError,
backgroundColor: Theme.of(context)
.colorScheme
.surfaceContainerHigh,
),
ProfileSettingsSwitchListTile.adaptive(
defaultValue: controller.getToolSetting(
ToolSetting.enableAutocorrect,
CountryPickerDropdown(controller),
LanguageLevelDropdown(
initialLevel: controller.cefrLevel,
onChanged: controller.setCefrLevel,
),
Container(
decoration: BoxDecoration(
border: Border.all(
color: Colors.white54,
),
borderRadius: BorderRadius.circular(8.0),
),
padding: const EdgeInsets.all(8.0),
child: Column(
children: [
ProfileSettingsSwitchListTile.adaptive(
defaultValue:
controller.getToolSetting(
ToolSetting.autoIGC,
),
title: ToolSetting.autoIGC
.toolName(context),
subtitle: ToolSetting.autoIGC
.toolDescription(context),
onChange: (bool value) =>
controller.updateToolSetting(
ToolSetting.autoIGC,
value,
),
enabled: true,
),
ProfileSettingsSwitchListTile.adaptive(
defaultValue:
controller.getToolSetting(
ToolSetting.enableAutocorrect,
),
title: ToolSetting.enableAutocorrect
.toolName(context),
subtitle: ToolSetting
.enableAutocorrect
.toolDescription(context),
onChange: (bool value) {
controller.updateToolSetting(
ToolSetting.enableAutocorrect,
value,
);
if (value) {
_showKeyboardSettingsDialog(
context,
);
}
},
enabled: true,
),
],
),
title: ToolSetting.enableAutocorrect
.toolName(context),
subtitle: ToolSetting.enableAutocorrect
.toolDescription(context),
onChange: (bool value) {
controller.updateToolSetting(
ToolSetting.enableAutocorrect,
value,
);
if (value) {
_showKeyboardSettingsDialog(
context,
);
}
},
enabled: true,
),
],
),
),
for (final toolSetting in ToolSetting.values.where(
(tool) =>
tool.isAvailableSetting &&
tool != ToolSetting.autoIGC &&
tool != ToolSetting.enableAutocorrect,
))
Column(
children: [
ProfileSettingsSwitchListTile.adaptive(
defaultValue:
controller.getToolSetting(toolSetting),
title: toolSetting.toolName(context),
subtitle: toolSetting ==
ToolSetting.enableTTS &&
!controller.isTTSSupported
? null
: toolSetting.toolDescription(context),
onChange: (bool value) =>
controller.updateToolSetting(
toolSetting,
value,
for (final toolSetting
in ToolSetting.values.where(
(tool) =>
tool.isAvailableSetting &&
tool != ToolSetting.autoIGC &&
tool != ToolSetting.enableAutocorrect,
))
Column(
children: [
ProfileSettingsSwitchListTile.adaptive(
defaultValue: controller
.getToolSetting(toolSetting),
title: toolSetting.toolName(context),
subtitle: toolSetting ==
ToolSetting.enableTTS &&
!controller.isTTSSupported
? null
: toolSetting
.toolDescription(context),
onChange: (bool value) =>
controller.updateToolSetting(
toolSetting,
value,
),
),
],
),
SwitchListTile.adaptive(
value: controller.publicProfile,
onChanged: controller.setPublicProfile,
title: Text(
L10n.of(context).publicProfileTitle,
),
subtitle: Text(
L10n.of(context).publicProfileDesc,
),
activeColor: AppConfig.activeToggleColor,
contentPadding: EdgeInsets.zero,
),
ResetInstructionsListTile(
controller: controller,
),
],
),
SwitchListTile.adaptive(
value: controller.publicProfile,
onChanged: controller.setPublicProfile,
title: Text(
L10n.of(context).publicProfileTitle,
),
subtitle: Text(
L10n.of(context).publicProfileDesc,
),
activeColor: AppConfig.activeToggleColor,
contentPadding: EdgeInsets.zero,
),
ResetInstructionsListTile(controller: controller),
],
),
),

@ -102,12 +102,15 @@ class PLanguageDropdownState extends State<PLanguageDropdown> {
labelText: widget.decorationText,
enabledBorder: hasError
? OutlineInputBorder(
borderSide:
BorderSide(color: Theme.of(context).colorScheme.error),
borderRadius: BorderRadius.circular(14),
borderSide: BorderSide(
color: Theme.of(context).colorScheme.error,
),
)
: null,
focusedBorder: hasError
? OutlineInputBorder(
borderRadius: BorderRadius.circular(14),
borderSide: BorderSide(
color: Theme.of(context).colorScheme.error,
width: 2,

Loading…
Cancel
Save