mirror of
https://github.com/inventree/inventree-app.git
synced 2025-04-27 21:16:48 +00:00
319 lines
10 KiB
Dart
319 lines
10 KiB
Dart
import "package:flutter/material.dart";
|
|
import "package:inventree/api.dart";
|
|
import "package:one_context/one_context.dart";
|
|
|
|
import "package:adaptive_theme/adaptive_theme.dart";
|
|
import "package:flutter_tabler_icons/flutter_tabler_icons.dart";
|
|
import "package:flutter_localized_locales/flutter_localized_locales.dart";
|
|
|
|
import "package:inventree/app_colors.dart";
|
|
import "package:inventree/api_form.dart";
|
|
import "package:inventree/l10.dart";
|
|
import "package:inventree/l10n/supported_locales.dart";
|
|
import "package:inventree/main.dart";
|
|
import "package:inventree/preferences.dart";
|
|
|
|
import "package:inventree/widget/dialogs.dart";
|
|
import "package:inventree/widget/progress.dart";
|
|
|
|
|
|
class InvenTreeAppSettingsWidget extends StatefulWidget {
|
|
@override
|
|
_InvenTreeAppSettingsState createState() => _InvenTreeAppSettingsState();
|
|
}
|
|
|
|
class _InvenTreeAppSettingsState extends State<InvenTreeAppSettingsWidget> {
|
|
|
|
_InvenTreeAppSettingsState();
|
|
|
|
final GlobalKey<_InvenTreeAppSettingsState> _settingsKey = GlobalKey<_InvenTreeAppSettingsState>();
|
|
|
|
// Sound settings
|
|
bool barcodeSounds = true;
|
|
bool serverSounds = true;
|
|
|
|
bool reportErrors = true;
|
|
bool strictHttps = false;
|
|
bool enableLabelPrinting = true;
|
|
bool darkMode = false;
|
|
|
|
int screenOrientation = SCREEN_ORIENTATION_SYSTEM;
|
|
|
|
Locale? locale;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
|
|
loadSettings(OneContext().context!);
|
|
}
|
|
|
|
Future <void> loadSettings(BuildContext context) async {
|
|
|
|
showLoadingOverlay();
|
|
|
|
barcodeSounds = await InvenTreeSettingsManager().getValue(INV_SOUNDS_BARCODE, true) as bool;
|
|
serverSounds = await InvenTreeSettingsManager().getValue(INV_SOUNDS_SERVER, true) as bool;
|
|
reportErrors = await InvenTreeSettingsManager().getValue(INV_REPORT_ERRORS, true) as bool;
|
|
strictHttps = await InvenTreeSettingsManager().getValue(INV_STRICT_HTTPS, false) as bool;
|
|
screenOrientation = await InvenTreeSettingsManager().getValue(INV_SCREEN_ORIENTATION, SCREEN_ORIENTATION_SYSTEM) as int;
|
|
enableLabelPrinting = await InvenTreeSettingsManager().getValue(INV_ENABLE_LABEL_PRINTING, true) as bool;
|
|
|
|
darkMode = AdaptiveTheme.of(context).mode.isDark;
|
|
|
|
locale = await InvenTreeSettingsManager().getSelectedLocale();
|
|
|
|
hideLoadingOverlay();
|
|
|
|
if (mounted) {
|
|
setState(() {});
|
|
}
|
|
}
|
|
|
|
Future<void> _selectLocale(BuildContext context) async {
|
|
|
|
List<Map<String, dynamic>> options = [
|
|
{
|
|
"display_name": L10().languageDefault,
|
|
"value": null,
|
|
}
|
|
];
|
|
|
|
// Construct a list of available locales
|
|
for (var locale in supported_locales) {
|
|
options.add({
|
|
"display_name": LocaleNames.of(context)!.nameOf(locale.toString()),
|
|
"value": locale.toString()
|
|
});
|
|
}
|
|
|
|
Map<String, dynamic> fields = {
|
|
"locale": {
|
|
"label": L10().language,
|
|
"type": "choice",
|
|
"choices": options,
|
|
"value": locale?.toString(),
|
|
}
|
|
};
|
|
|
|
launchApiForm(
|
|
context,
|
|
L10().languageSelect,
|
|
"",
|
|
fields,
|
|
icon: TablerIcons.circle_check,
|
|
onSuccess: (Map<String, dynamic> data) async {
|
|
|
|
String locale_name = (data["locale"] ?? "") as String;
|
|
Locale? selected_locale;
|
|
|
|
for (var locale in supported_locales) {
|
|
if (locale.toString() == locale_name) {
|
|
selected_locale = locale;
|
|
}
|
|
}
|
|
|
|
await InvenTreeSettingsManager().setSelectedLocale(selected_locale);
|
|
|
|
setState(() {
|
|
locale = selected_locale;
|
|
});
|
|
|
|
// Refresh the entire app locale
|
|
InvenTreeApp.of(context)?.setLocale(locale);
|
|
|
|
// Clear the cached status label information
|
|
InvenTreeAPI().clearStatusCodeData();
|
|
}
|
|
);
|
|
}
|
|
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
|
|
String languageName = L10().languageDefault;
|
|
|
|
if (locale != null) {
|
|
languageName = LocaleNames.of(context)!.nameOf(locale.toString()) ?? L10().languageDefault;
|
|
}
|
|
|
|
IconData orientationIcon = Icons.screen_rotation;
|
|
|
|
switch (screenOrientation) {
|
|
case SCREEN_ORIENTATION_PORTRAIT:
|
|
orientationIcon = Icons.screen_lock_portrait;
|
|
break;
|
|
case SCREEN_ORIENTATION_LANDSCAPE:
|
|
orientationIcon = Icons.screen_lock_landscape;
|
|
break;
|
|
case SCREEN_ORIENTATION_SYSTEM:
|
|
default:
|
|
orientationIcon = Icons.screen_rotation;
|
|
break;
|
|
}
|
|
|
|
return Scaffold(
|
|
key: _settingsKey,
|
|
appBar: AppBar(
|
|
title: Text(L10().appSettings),
|
|
backgroundColor: COLOR_APP_BAR
|
|
),
|
|
body: Container(
|
|
child: ListView(
|
|
children: [
|
|
/* Sound Settings */
|
|
Divider(height: 3),
|
|
ListTile(
|
|
title: Text(
|
|
L10().appSettings,
|
|
style: TextStyle(fontWeight: FontWeight.bold),
|
|
),
|
|
leading: Icon(TablerIcons.device_mobile),
|
|
),
|
|
ListTile(
|
|
title: Text(L10().darkMode),
|
|
subtitle: Text(L10().darkModeEnable),
|
|
leading: Icon(TablerIcons.sun_moon),
|
|
trailing: Switch(
|
|
value: darkMode,
|
|
onChanged: (bool value) {
|
|
if (value) {
|
|
AdaptiveTheme.of(context).setDark();
|
|
} else {
|
|
AdaptiveTheme.of(context).setLight();
|
|
}
|
|
setState(() {
|
|
darkMode = value;
|
|
});
|
|
}
|
|
)
|
|
),
|
|
GestureDetector(
|
|
child: ListTile(
|
|
title: Text(L10().orientation),
|
|
subtitle: Text(L10().orientationDetail),
|
|
leading: Icon(Icons.screen_rotation_alt),
|
|
trailing: Icon(orientationIcon),
|
|
),
|
|
onTap: () async {
|
|
choiceDialog(
|
|
L10().orientation,
|
|
[
|
|
ListTile(
|
|
leading: Icon(Icons.screen_rotation, color: screenOrientation == SCREEN_ORIENTATION_SYSTEM ? COLOR_ACTION : null),
|
|
title: Text(L10().orientationSystem),
|
|
),
|
|
ListTile(
|
|
leading: Icon(Icons.screen_lock_portrait, color: screenOrientation == SCREEN_ORIENTATION_PORTRAIT ? COLOR_ACTION : null),
|
|
title: Text(L10().orientationPortrait),
|
|
),
|
|
ListTile(
|
|
leading: Icon(Icons.screen_lock_landscape, color: screenOrientation == SCREEN_ORIENTATION_LANDSCAPE ? COLOR_ACTION : null),
|
|
title: Text(L10().orientationLandscape),
|
|
)
|
|
],
|
|
onSelected: (idx) async {
|
|
screenOrientation = idx as int;
|
|
|
|
InvenTreeSettingsManager().setValue(INV_SCREEN_ORIENTATION, screenOrientation);
|
|
|
|
setState(() {
|
|
});
|
|
}
|
|
);
|
|
},
|
|
),
|
|
ListTile(
|
|
title: Text(L10().labelPrinting),
|
|
subtitle: Text(L10().labelPrintingDetail),
|
|
leading: Icon(TablerIcons.printer),
|
|
trailing: Switch(
|
|
value: enableLabelPrinting,
|
|
onChanged: (bool value) {
|
|
InvenTreeSettingsManager().setValue(INV_ENABLE_LABEL_PRINTING, value);
|
|
setState(() {
|
|
enableLabelPrinting = value;
|
|
});
|
|
}
|
|
),
|
|
),
|
|
ListTile(
|
|
title: Text(L10().strictHttps),
|
|
subtitle: Text(L10().strictHttpsDetails),
|
|
leading: Icon(TablerIcons.lock),
|
|
trailing: Switch(
|
|
value: strictHttps,
|
|
onChanged: (bool value) {
|
|
InvenTreeSettingsManager().setValue(INV_STRICT_HTTPS, value);
|
|
setState(() {
|
|
strictHttps = value;
|
|
});
|
|
},
|
|
),
|
|
),
|
|
ListTile(
|
|
title: Text(L10().language),
|
|
subtitle: Text(languageName),
|
|
leading: Icon(TablerIcons.language),
|
|
onTap: () async {
|
|
_selectLocale(context);
|
|
},
|
|
),
|
|
ListTile(
|
|
title: Text(L10().errorReportUpload),
|
|
subtitle: Text(L10().errorReportUploadDetails),
|
|
leading: Icon(TablerIcons.bug),
|
|
trailing: Switch(
|
|
value: reportErrors,
|
|
onChanged: (bool value) {
|
|
InvenTreeSettingsManager().setValue(INV_REPORT_ERRORS, value);
|
|
setState(() {
|
|
reportErrors = value;
|
|
});
|
|
},
|
|
),
|
|
),
|
|
ListTile(
|
|
title: Text(
|
|
L10().sounds,
|
|
style: TextStyle(fontWeight: FontWeight.bold),
|
|
),
|
|
leading: Icon(TablerIcons.volume),
|
|
),
|
|
Divider(),
|
|
ListTile(
|
|
title: Text(L10().serverError),
|
|
subtitle: Text(L10().soundOnServerError),
|
|
leading: Icon(TablerIcons.server),
|
|
trailing: Switch(
|
|
value: serverSounds,
|
|
onChanged: (bool value) {
|
|
InvenTreeSettingsManager().setValue(INV_SOUNDS_SERVER, value);
|
|
setState(() {
|
|
serverSounds = value;
|
|
});
|
|
},
|
|
),
|
|
),
|
|
ListTile(
|
|
title: Text(L10().barcodeTones),
|
|
subtitle: Text(L10().soundOnBarcodeAction),
|
|
leading: Icon(TablerIcons.qrcode),
|
|
trailing: Switch(
|
|
value: barcodeSounds,
|
|
onChanged: (bool value) {
|
|
InvenTreeSettingsManager().setValue(INV_SOUNDS_BARCODE, value);
|
|
setState(() {
|
|
barcodeSounds = value;
|
|
});
|
|
},
|
|
),
|
|
),
|
|
Divider(height: 1),
|
|
]
|
|
)
|
|
)
|
|
);
|
|
}
|
|
} |