new: full screen jitter
This commit is contained in:
@@ -486,6 +486,18 @@ abstract class S {
|
|||||||
/// **'Full screen mode'**
|
/// **'Full screen mode'**
|
||||||
String get fullScreen;
|
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.
|
/// No description provided for @getPushTokenFailed.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
|
|||||||
@@ -215,6 +215,12 @@ class SDe extends S {
|
|||||||
@override
|
@override
|
||||||
String get fullScreen => 'Full screen mode';
|
String get fullScreen => 'Full screen mode';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get fullScreenJitter => 'Full screen jitter';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get fullScreenJitterHelp => 'To avoid screen burn-in';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get getPushTokenFailed => 'Push-Token kann nicht abgerufen werden';
|
String get getPushTokenFailed => 'Push-Token kann nicht abgerufen werden';
|
||||||
|
|
||||||
|
|||||||
@@ -215,6 +215,12 @@ class SEn extends S {
|
|||||||
@override
|
@override
|
||||||
String get fullScreen => 'Full screen mode';
|
String get fullScreen => 'Full screen mode';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get fullScreenJitter => 'Full screen jitter';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get fullScreenJitterHelp => 'To avoid screen burn-in';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get getPushTokenFailed => 'Can\'t fetch push token';
|
String get getPushTokenFailed => 'Can\'t fetch push token';
|
||||||
|
|
||||||
|
|||||||
@@ -215,6 +215,12 @@ class SZh extends S {
|
|||||||
@override
|
@override
|
||||||
String get fullScreen => '全屏模式';
|
String get fullScreen => '全屏模式';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get fullScreenJitter => '全屏模式抖动';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get fullScreenJitterHelp => '防止烧屏';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get getPushTokenFailed => '未能获取到推送token';
|
String get getPushTokenFailed => '未能获取到推送token';
|
||||||
|
|
||||||
|
|||||||
@@ -69,4 +69,7 @@ class SettingStore extends PersistentStore {
|
|||||||
|
|
||||||
StoreProperty<bool> get fullScreen =>
|
StoreProperty<bool> get fullScreen =>
|
||||||
property('fullScreen', defaultValue: false);
|
property('fullScreen', defaultValue: false);
|
||||||
|
|
||||||
|
StoreProperty<bool> get fullScreenJitter =>
|
||||||
|
property('fullScreenJitter', defaultValue: true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,6 +65,8 @@
|
|||||||
"fontSize": "Font size",
|
"fontSize": "Font size",
|
||||||
"foundNUpdate": "Found {count} update",
|
"foundNUpdate": "Found {count} update",
|
||||||
"fullScreen": "Full screen mode",
|
"fullScreen": "Full screen mode",
|
||||||
|
"fullScreenJitter": "Full screen jitter",
|
||||||
|
"fullScreenJitterHelp": "To avoid screen burn-in",
|
||||||
"getPushTokenFailed": "Can't fetch push token",
|
"getPushTokenFailed": "Can't fetch push token",
|
||||||
"gettingToken": "Getting token...",
|
"gettingToken": "Getting token...",
|
||||||
"goto": "Go to",
|
"goto": "Go to",
|
||||||
|
|||||||
@@ -65,6 +65,8 @@
|
|||||||
"fontSize": "字体大小",
|
"fontSize": "字体大小",
|
||||||
"foundNUpdate": "找到 {count} 个更新",
|
"foundNUpdate": "找到 {count} 个更新",
|
||||||
"fullScreen": "全屏模式",
|
"fullScreen": "全屏模式",
|
||||||
|
"fullScreenJitter": "全屏模式抖动",
|
||||||
|
"fullScreenJitterHelp": "防止烧屏",
|
||||||
"getPushTokenFailed": "未能获取到推送token",
|
"getPushTokenFailed": "未能获取到推送token",
|
||||||
"gettingToken": "正在获取Token...",
|
"gettingToken": "正在获取Token...",
|
||||||
"goto": "前往",
|
"goto": "前往",
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
import 'dart:math';
|
||||||
|
|
||||||
import 'package:after_layout/after_layout.dart';
|
import 'package:after_layout/after_layout.dart';
|
||||||
import 'package:circle_chart/circle_chart.dart';
|
import 'package:circle_chart/circle_chart.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
@@ -28,10 +31,11 @@ class FullScreenPage extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _FullScreenPageState extends State<FullScreenPage>
|
class _FullScreenPageState extends State<FullScreenPage>
|
||||||
with AfterLayoutMixin, AutomaticKeepAliveClientMixin {
|
with AfterLayoutMixin {
|
||||||
late S _s;
|
late S _s;
|
||||||
late MediaQueryData _media;
|
late MediaQueryData _media;
|
||||||
late ThemeData _theme;
|
late ThemeData _theme;
|
||||||
|
late Timer _timer;
|
||||||
|
|
||||||
final _pageController = PageController(initialPage: 0);
|
final _pageController = PageController(initialPage: 0);
|
||||||
final _serverProvider = locator<ServerProvider>();
|
final _serverProvider = locator<ServerProvider>();
|
||||||
@@ -40,6 +44,13 @@ class _FullScreenPageState extends State<FullScreenPage>
|
|||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
hideStatusBar();
|
hideStatusBar();
|
||||||
|
_timer = Timer.periodic(const Duration(minutes: 1), (_) => setState(() {}));
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
super.dispose();
|
||||||
|
_timer.cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -50,22 +61,35 @@ class _FullScreenPageState extends State<FullScreenPage>
|
|||||||
_theme = Theme.of(context);
|
_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
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
super.build(context);
|
final offset = Offset(_offset, _offset);
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
body: SafeArea(
|
body: SafeArea(
|
||||||
child: RotatedBox(
|
child: RotatedBox(
|
||||||
quarterTurns: 3,
|
quarterTurns: 3,
|
||||||
child: Stack(
|
child: Transform.translate(
|
||||||
children: [
|
offset: offset,
|
||||||
_buildMain(),
|
child: Stack(
|
||||||
Positioned(
|
children: [
|
||||||
top: 0,
|
_buildMain(),
|
||||||
left: 0,
|
Positioned(
|
||||||
child: _buildSettingBtn(),
|
top: 0,
|
||||||
),
|
left: 0,
|
||||||
],
|
child: _buildSettingBtn(),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -124,40 +148,44 @@ class _FullScreenPageState extends State<FullScreenPage>
|
|||||||
'server detail page',
|
'server detail page',
|
||||||
).go(context),
|
).go(context),
|
||||||
child: Stack(
|
child: Stack(
|
||||||
children: [
|
children: [
|
||||||
Positioned(top: 0, left: 0, right: 0, child: _buildServerCardTitle(ss, cs, spi)),
|
Positioned(
|
||||||
Column(
|
top: 0,
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
left: 0,
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
right: 0,
|
||||||
children: [
|
child: _buildServerCardTitle(ss, cs, spi)),
|
||||||
SizedBox(height: _media.size.width * 0.1),
|
Column(
|
||||||
Row(
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
_buildPercentCircle(ss.cpu.usedPercent()),
|
SizedBox(height: _media.size.width * 0.1),
|
||||||
_buildPercentCircle(ss.mem.usedPercent * 100),
|
Row(
|
||||||
_buildIOData(
|
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||||
'Conn:\n${ss.tcp.maxConn}', 'Fail:\n${ss.tcp.fail}'),
|
children: [
|
||||||
_buildIOData(
|
_buildPercentCircle(ss.cpu.usedPercent()),
|
||||||
'Total:\n${rootDisk.size}',
|
_buildPercentCircle(ss.mem.usedPercent * 100),
|
||||||
'Used:\n${rootDisk.usedPercent}%',
|
_buildIOData(
|
||||||
)
|
'Conn:\n${ss.tcp.maxConn}', 'Fail:\n${ss.tcp.fail}'),
|
||||||
],
|
_buildIOData(
|
||||||
),
|
'Total:\n${rootDisk.size}',
|
||||||
SizedBox(height: _media.size.width * 0.1),
|
'Used:\n${rootDisk.usedPercent}%',
|
||||||
Row(
|
)
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
],
|
||||||
children: [
|
),
|
||||||
_buildExplainText('CPU'),
|
SizedBox(height: _media.size.width * 0.1),
|
||||||
_buildExplainText('Mem'),
|
Row(
|
||||||
_buildExplainText('Net'),
|
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||||
_buildExplainText('Disk'),
|
children: [
|
||||||
],
|
_buildExplainText('CPU'),
|
||||||
),
|
_buildExplainText('Mem'),
|
||||||
],
|
_buildExplainText('Net'),
|
||||||
),
|
_buildExplainText('Disk'),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -172,6 +200,7 @@ class _FullScreenPageState extends State<FullScreenPage>
|
|||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
|
height13,
|
||||||
Row(
|
Row(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
@@ -311,9 +340,6 @@ class _FullScreenPageState extends State<FullScreenPage>
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
bool get wantKeepAlive => true;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> afterFirstLayout(BuildContext context) async {
|
Future<void> afterFirstLayout(BuildContext context) async {
|
||||||
await GetIt.I.allReady();
|
await GetIt.I.allReady();
|
||||||
|
|||||||
@@ -128,6 +128,7 @@ class _SettingPageState extends State<SettingPage> {
|
|||||||
_buildLaunchPage(),
|
_buildLaunchPage(),
|
||||||
_buildCheckUpdate(),
|
_buildCheckUpdate(),
|
||||||
_buildFullScreen(),
|
_buildFullScreen(),
|
||||||
|
_buildFullScreenJitter(),
|
||||||
];
|
];
|
||||||
if (isIOS) {
|
if (isIOS) {
|
||||||
children.add(_buildPushToken());
|
children.add(_buildPushToken());
|
||||||
@@ -672,4 +673,12 @@ class _SettingPageState extends State<SettingPage> {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Widget _buildFullScreenJitter() {
|
||||||
|
return ListTile(
|
||||||
|
title: Text(_s.fullScreenJitter),
|
||||||
|
subtitle: Text(_s.fullScreenJitterHelp, style: grey),
|
||||||
|
trailing: buildSwitch(context, _setting.fullScreenJitter),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user