491fae10f5
BREAKING CHANGE: DNS and NTP override toggles are removed; picked keys apply to every profile Changelog: Per-key DNS, NTP, sniffer and TUN settings
97 lines
2.8 KiB
Dart
97 lines
2.8 KiB
Dart
import 'dart:math';
|
|
|
|
import 'package:fl_clash/common/common.dart';
|
|
import 'package:fl_clash/common/theme.dart';
|
|
import 'package:fl_clash/providers/action.dart';
|
|
import 'package:fl_clash/providers/config.dart';
|
|
import 'package:fl_clash/state.dart';
|
|
import 'package:material_ui/material_ui.dart';
|
|
import 'package:flutter/services.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
|
|
import '../providers/state.dart';
|
|
|
|
class ThemeManager extends ConsumerWidget {
|
|
final Widget child;
|
|
|
|
const ThemeManager({super.key, required this.child});
|
|
|
|
Widget _buildSystemUi(Widget child) {
|
|
if (!system.isAndroid) {
|
|
return child;
|
|
}
|
|
return Consumer(
|
|
builder: (context, ref, _) {
|
|
final brightness = ref.watch(currentBrightnessProvider);
|
|
final iconBrightness = brightness == Brightness.light
|
|
? Brightness.dark
|
|
: Brightness.light;
|
|
return AnnotatedRegion<SystemUiOverlayStyle>(
|
|
value: SystemUiOverlayStyle(
|
|
statusBarColor: Colors.transparent,
|
|
statusBarIconBrightness: iconBrightness,
|
|
systemNavigationBarIconBrightness: iconBrightness,
|
|
systemNavigationBarColor: Colors.transparent,
|
|
systemNavigationBarDividerColor: Colors.transparent,
|
|
systemNavigationBarContrastEnforced: false,
|
|
),
|
|
sized: false,
|
|
child: child,
|
|
);
|
|
},
|
|
);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context, ref) {
|
|
final textScale = ref.read(
|
|
themeSettingProvider.select((state) => state.textScale),
|
|
);
|
|
final double textScaleFactor = max(
|
|
min(
|
|
textScale.enable ? textScale.scale : systemTextScaleOf(context),
|
|
maxTextScale,
|
|
),
|
|
minTextScale,
|
|
);
|
|
|
|
globalState.measure = Measure.of(context, textScaleFactor);
|
|
globalState.theme = CommonTheme.of(context, textScaleFactor);
|
|
return _AppMediaQuery(
|
|
textScaler: TextScaler.linear(textScaleFactor),
|
|
child: LayoutBuilder(
|
|
builder: (_, constraints) {
|
|
ref
|
|
.read(themeActionProvider.notifier)
|
|
.updateViewSize(
|
|
Size(constraints.maxWidth, constraints.maxHeight),
|
|
);
|
|
return _buildSystemUi(child);
|
|
},
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class _AppMediaQuery extends StatelessWidget {
|
|
const _AppMediaQuery({required this.textScaler, required this.child});
|
|
|
|
final TextScaler textScaler;
|
|
final Widget child;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final data = MediaQuery.of(context);
|
|
final padding = data.padding;
|
|
return MediaQuery(
|
|
data: data.copyWith(
|
|
textScaler: textScaler,
|
|
padding: padding.copyWith(
|
|
top: padding.top > data.size.height * 0.3 ? 20.0 : padding.top,
|
|
),
|
|
),
|
|
child: child,
|
|
);
|
|
}
|
|
}
|