Files
proxypin/lib/ui/mobile/setting/theme.dart
2025-06-18 01:51:16 +08:00

78 lines
2.9 KiB
Dart

/*
* Copyright 2023 Hongen Wang
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import 'package:flutter/material.dart';
import 'package:proxypin/l10n/app_localizations.dart';
import 'package:proxypin/ui/configuration.dart';
class MobileThemeSetting extends StatelessWidget {
final AppConfiguration appConfiguration;
const MobileThemeSetting({super.key, required this.appConfiguration});
@override
Widget build(BuildContext context) {
AppLocalizations localizations = AppLocalizations.of(context)!;
return PopupMenuButton(
tooltip: appConfiguration.themeMode.name,
surfaceTintColor: Theme.of(context).colorScheme.onPrimary,
offset: const Offset(150, 0),
itemBuilder: (BuildContext context) {
return [
PopupMenuItem(
child: Tooltip(
preferBelow: false,
message: localizations.material3,
child: SwitchListTile(
value: appConfiguration.useMaterial3,
onChanged: (bool value) {
appConfiguration.useMaterial3 = value;
Navigator.of(context).pop();
},
dense: true,
title: const Text("Material3"),
))),
PopupMenuItem(
child:
ListTile(trailing: const Icon(Icons.cached), dense: true, title: Text(localizations.followSystem)),
onTap: () => appConfiguration.themeMode = ThemeMode.system),
PopupMenuItem(
child: ListTile(trailing: const Icon(Icons.sunny), dense: true, title: Text(localizations.themeLight)),
onTap: () => appConfiguration.themeMode = ThemeMode.light),
PopupMenuItem(
child: ListTile(
trailing: const Icon(Icons.nightlight_outlined), dense: true, title: Text(localizations.themeDark)),
onTap: () => appConfiguration.themeMode = ThemeMode.dark),
];
},
child: ListTile(
title: Text(localizations.theme),
trailing: getIcon(),
));
}
Icon getIcon() {
switch (appConfiguration.themeMode) {
case ThemeMode.system:
return const Icon(Icons.cached);
case ThemeMode.dark:
return const Icon(Icons.nightlight_outlined);
case ThemeMode.light:
return const Icon(Icons.sunny);
}
}
}