From 2095b79b9a6af7f5c631f17d6eee0d2f48d5d38c Mon Sep 17 00:00:00 2001 From: lollipopkit Date: Thu, 8 Jun 2023 22:45:38 +0800 Subject: [PATCH] new: full screen `jitter` --- .dart_tool/flutter_gen/gen_l10n/l10n.dart | 12 ++ .dart_tool/flutter_gen/gen_l10n/l10n_de.dart | 6 + .dart_tool/flutter_gen/gen_l10n/l10n_en.dart | 6 + .dart_tool/flutter_gen/gen_l10n/l10n_zh.dart | 6 + lib/data/store/setting.dart | 3 + lib/l10n/app_en.arb | 2 + lib/l10n/app_zh.arb | 2 + lib/view/page/full_screen.dart | 122 +++++++++++-------- lib/view/page/setting.dart | 9 ++ 9 files changed, 120 insertions(+), 48 deletions(-) diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n.dart b/.dart_tool/flutter_gen/gen_l10n/l10n.dart index bc333f24..86840967 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n.dart @@ -486,6 +486,18 @@ abstract class S { /// **'Full screen mode'** String get fullScreen; + /// No description provided for @fullScreenJitter. + /// + /// In en, this message translates to: + /// **'Full screen jitter'** + String get fullScreenJitter; + + /// No description provided for @fullScreenJitterHelp. + /// + /// In en, this message translates to: + /// **'To avoid screen burn-in'** + String get fullScreenJitterHelp; + /// No description provided for @getPushTokenFailed. /// /// In en, this message translates to: diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n_de.dart b/.dart_tool/flutter_gen/gen_l10n/l10n_de.dart index a4aa1ab6..de58756a 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n_de.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n_de.dart @@ -215,6 +215,12 @@ class SDe extends S { @override String get fullScreen => 'Full screen mode'; + @override + String get fullScreenJitter => 'Full screen jitter'; + + @override + String get fullScreenJitterHelp => 'To avoid screen burn-in'; + @override String get getPushTokenFailed => 'Push-Token kann nicht abgerufen werden'; diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n_en.dart b/.dart_tool/flutter_gen/gen_l10n/l10n_en.dart index 2ff4305b..687b9ee8 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n_en.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n_en.dart @@ -215,6 +215,12 @@ class SEn extends S { @override String get fullScreen => 'Full screen mode'; + @override + String get fullScreenJitter => 'Full screen jitter'; + + @override + String get fullScreenJitterHelp => 'To avoid screen burn-in'; + @override String get getPushTokenFailed => 'Can\'t fetch push token'; diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n_zh.dart b/.dart_tool/flutter_gen/gen_l10n/l10n_zh.dart index ba6b40f2..a87e4a7f 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n_zh.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n_zh.dart @@ -215,6 +215,12 @@ class SZh extends S { @override String get fullScreen => '全屏模式'; + @override + String get fullScreenJitter => '全屏模式抖动'; + + @override + String get fullScreenJitterHelp => '防止烧屏'; + @override String get getPushTokenFailed => '未能获取到推送token'; diff --git a/lib/data/store/setting.dart b/lib/data/store/setting.dart index 06584277..ab1b759b 100644 --- a/lib/data/store/setting.dart +++ b/lib/data/store/setting.dart @@ -69,4 +69,7 @@ class SettingStore extends PersistentStore { StoreProperty get fullScreen => property('fullScreen', defaultValue: false); + + StoreProperty get fullScreenJitter => + property('fullScreenJitter', defaultValue: true); } diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 003ffbfd..853d3713 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -65,6 +65,8 @@ "fontSize": "Font size", "foundNUpdate": "Found {count} update", "fullScreen": "Full screen mode", + "fullScreenJitter": "Full screen jitter", + "fullScreenJitterHelp": "To avoid screen burn-in", "getPushTokenFailed": "Can't fetch push token", "gettingToken": "Getting token...", "goto": "Go to", diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 4b82811b..8e6cfe4a 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -65,6 +65,8 @@ "fontSize": "字体大小", "foundNUpdate": "找到 {count} 个更新", "fullScreen": "全屏模式", + "fullScreenJitter": "全屏模式抖动", + "fullScreenJitterHelp": "防止烧屏", "getPushTokenFailed": "未能获取到推送token", "gettingToken": "正在获取Token...", "goto": "前往", diff --git a/lib/view/page/full_screen.dart b/lib/view/page/full_screen.dart index b97222c9..cd530d1f 100644 --- a/lib/view/page/full_screen.dart +++ b/lib/view/page/full_screen.dart @@ -1,3 +1,6 @@ +import 'dart:async'; +import 'dart:math'; + import 'package:after_layout/after_layout.dart'; import 'package:circle_chart/circle_chart.dart'; import 'package:flutter/material.dart'; @@ -28,10 +31,11 @@ class FullScreenPage extends StatefulWidget { } class _FullScreenPageState extends State - with AfterLayoutMixin, AutomaticKeepAliveClientMixin { + with AfterLayoutMixin { late S _s; late MediaQueryData _media; late ThemeData _theme; + late Timer _timer; final _pageController = PageController(initialPage: 0); final _serverProvider = locator(); @@ -40,6 +44,13 @@ class _FullScreenPageState extends State void initState() { super.initState(); hideStatusBar(); + _timer = Timer.periodic(const Duration(minutes: 1), (_) => setState(() {})); + } + + @override + void dispose() { + super.dispose(); + _timer.cancel(); } @override @@ -50,22 +61,35 @@ class _FullScreenPageState extends State _theme = Theme.of(context); } + // x = _media.size.width * 0.1 + // r = Random().nextDouble() + // Return [-x * r, x * r] + double get _offset { + final x = _media.size.width * 0.03; + var r = Random().nextDouble(); + final n = Random().nextBool() ? -1 : 1; + return n * x * r; + } + @override Widget build(BuildContext context) { - super.build(context); + final offset = Offset(_offset, _offset); return Scaffold( body: SafeArea( child: RotatedBox( quarterTurns: 3, - child: Stack( - children: [ - _buildMain(), - Positioned( - top: 0, - left: 0, - child: _buildSettingBtn(), - ), - ], + child: Transform.translate( + offset: offset, + child: Stack( + children: [ + _buildMain(), + Positioned( + top: 0, + left: 0, + child: _buildSettingBtn(), + ), + ], + ), ), ), ), @@ -124,40 +148,44 @@ class _FullScreenPageState extends State 'server detail page', ).go(context), child: Stack( - children: [ - Positioned(top: 0, left: 0, right: 0, child: _buildServerCardTitle(ss, cs, spi)), - Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SizedBox(height: _media.size.width * 0.1), - Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - _buildPercentCircle(ss.cpu.usedPercent()), - _buildPercentCircle(ss.mem.usedPercent * 100), - _buildIOData( - 'Conn:\n${ss.tcp.maxConn}', 'Fail:\n${ss.tcp.fail}'), - _buildIOData( - 'Total:\n${rootDisk.size}', - 'Used:\n${rootDisk.usedPercent}%', - ) - ], - ), - SizedBox(height: _media.size.width * 0.1), - Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - _buildExplainText('CPU'), - _buildExplainText('Mem'), - _buildExplainText('Net'), - _buildExplainText('Disk'), - ], - ), - ], - ), - ], - ), + children: [ + Positioned( + top: 0, + left: 0, + right: 0, + child: _buildServerCardTitle(ss, cs, spi)), + Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox(height: _media.size.width * 0.1), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _buildPercentCircle(ss.cpu.usedPercent()), + _buildPercentCircle(ss.mem.usedPercent * 100), + _buildIOData( + 'Conn:\n${ss.tcp.maxConn}', 'Fail:\n${ss.tcp.fail}'), + _buildIOData( + 'Total:\n${rootDisk.size}', + 'Used:\n${rootDisk.usedPercent}%', + ) + ], + ), + SizedBox(height: _media.size.width * 0.1), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _buildExplainText('CPU'), + _buildExplainText('Mem'), + _buildExplainText('Net'), + _buildExplainText('Disk'), + ], + ), + ], + ), + ], + ), ); } @@ -172,6 +200,7 @@ class _FullScreenPageState extends State mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.center, children: [ + height13, Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, @@ -311,9 +340,6 @@ class _FullScreenPageState extends State ); } - @override - bool get wantKeepAlive => true; - @override Future afterFirstLayout(BuildContext context) async { await GetIt.I.allReady(); diff --git a/lib/view/page/setting.dart b/lib/view/page/setting.dart index 1613f8b5..e074fc9c 100644 --- a/lib/view/page/setting.dart +++ b/lib/view/page/setting.dart @@ -128,6 +128,7 @@ class _SettingPageState extends State { _buildLaunchPage(), _buildCheckUpdate(), _buildFullScreen(), + _buildFullScreenJitter(), ]; if (isIOS) { children.add(_buildPushToken()); @@ -672,4 +673,12 @@ class _SettingPageState extends State { ), ); } + + Widget _buildFullScreenJitter() { + return ListTile( + title: Text(_s.fullScreenJitter), + subtitle: Text(_s.fullScreenJitterHelp, style: grey), + trailing: buildSwitch(context, _setting.fullScreenJitter), + ); + } }