mirror of
https://github.com/venera-app/venera.git
synced 2025-09-27 15:57:25 +00:00
@@ -189,7 +189,8 @@
|
|||||||
"Quick Favorite": "快速收藏",
|
"Quick Favorite": "快速收藏",
|
||||||
"Long press on the favorite button to quickly add to this folder": "长按收藏按钮快速添加到这个文件夹",
|
"Long press on the favorite button to quickly add to this folder": "长按收藏按钮快速添加到这个文件夹",
|
||||||
"Added": "已添加",
|
"Added": "已添加",
|
||||||
"Turn page by volume keys": "使用音量键翻页"
|
"Turn page by volume keys": "使用音量键翻页",
|
||||||
|
"Display time & battery info in reader":"在阅读器中显示时间和电量信息"
|
||||||
},
|
},
|
||||||
"zh_TW": {
|
"zh_TW": {
|
||||||
"Home": "首頁",
|
"Home": "首頁",
|
||||||
@@ -381,6 +382,7 @@
|
|||||||
"Quick Favorite": "快速收藏",
|
"Quick Favorite": "快速收藏",
|
||||||
"Long press on the favorite button to quickly add to this folder": "長按收藏按鈕快速添加到這個文件夾",
|
"Long press on the favorite button to quickly add to this folder": "長按收藏按鈕快速添加到這個文件夾",
|
||||||
"Added": "已添加",
|
"Added": "已添加",
|
||||||
"Turn page by volume keys": "使用音量鍵翻頁"
|
"Turn page by volume keys": "使用音量鍵翻頁",
|
||||||
|
"Display time & battery info in reader":"在閱讀器中顯示時間和電量信息"
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -118,6 +118,7 @@ class _Settings with ChangeNotifier {
|
|||||||
'dataVersion': 0,
|
'dataVersion': 0,
|
||||||
'quickFavorite': null,
|
'quickFavorite': null,
|
||||||
'enableTurnPageByVolumeKey': true,
|
'enableTurnPageByVolumeKey': true,
|
||||||
|
'enableClockAndBatteryInfoInReader': true,
|
||||||
};
|
};
|
||||||
|
|
||||||
operator [](String key) {
|
operator [](String key) {
|
||||||
|
@@ -26,6 +26,7 @@ import 'package:venera/utils/io.dart';
|
|||||||
import 'package:venera/utils/translations.dart';
|
import 'package:venera/utils/translations.dart';
|
||||||
import 'package:venera/utils/volume.dart';
|
import 'package:venera/utils/volume.dart';
|
||||||
import 'package:window_manager/window_manager.dart';
|
import 'package:window_manager/window_manager.dart';
|
||||||
|
import 'package:battery_plus/battery_plus.dart';
|
||||||
|
|
||||||
part 'scaffold.dart';
|
part 'scaffold.dart';
|
||||||
part 'images.dart';
|
part 'images.dart';
|
||||||
|
@@ -131,10 +131,11 @@ class _ReaderScaffoldState extends State<_ReaderScaffold> {
|
|||||||
child: widget.child,
|
child: widget.child,
|
||||||
),
|
),
|
||||||
buildPageInfoText(),
|
buildPageInfoText(),
|
||||||
|
buildStatusInfo(),
|
||||||
AnimatedPositioned(
|
AnimatedPositioned(
|
||||||
duration: const Duration(milliseconds: 180),
|
duration: const Duration(milliseconds: 180),
|
||||||
right: 16,
|
right: 16,
|
||||||
bottom: showFloatingButtonValue == 0 ? -58 : 16,
|
bottom: showFloatingButtonValue == 0 ? -58 : 36,
|
||||||
child: buildEpChangeButton(),
|
child: buildEpChangeButton(),
|
||||||
),
|
),
|
||||||
AnimatedPositioned(
|
AnimatedPositioned(
|
||||||
@@ -424,6 +425,24 @@ class _ReaderScaffoldState extends State<_ReaderScaffold> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Widget buildStatusInfo() {
|
||||||
|
if(appdata.settings['enableClockAndBatteryInfoInReader']) {
|
||||||
|
return Positioned(
|
||||||
|
bottom: 13,
|
||||||
|
right: 25,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
_ClockWidget(),
|
||||||
|
const SizedBox(width: 10),
|
||||||
|
_BatteryWidget(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return const SizedBox.shrink();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void openChapterDrawer() {
|
void openChapterDrawer() {
|
||||||
showSideBar(
|
showSideBar(
|
||||||
context,
|
context,
|
||||||
@@ -569,6 +588,186 @@ class _ReaderScaffoldState extends State<_ReaderScaffold> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class _BatteryWidget extends StatefulWidget {
|
||||||
|
@override
|
||||||
|
_BatteryWidgetState createState() => _BatteryWidgetState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _BatteryWidgetState extends State<_BatteryWidget> {
|
||||||
|
late Battery _battery;
|
||||||
|
late int _batteryLevel = 100;
|
||||||
|
Timer? _timer;
|
||||||
|
bool _hasBattery = false;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
_battery = Battery();
|
||||||
|
_checkBatteryAvailability();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _checkBatteryAvailability() async {
|
||||||
|
try {
|
||||||
|
_batteryLevel = await _battery.batteryLevel;
|
||||||
|
if (_batteryLevel != -1) {
|
||||||
|
setState(() {
|
||||||
|
_hasBattery = true;
|
||||||
|
_timer = Timer.periodic(const Duration(seconds: 1), (timer) {
|
||||||
|
_battery.batteryLevel.then((level) =>{
|
||||||
|
if(_batteryLevel != level) {
|
||||||
|
setState(() {
|
||||||
|
_batteryLevel = level;
|
||||||
|
})
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
setState(() {
|
||||||
|
_hasBattery = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
setState(() {
|
||||||
|
_hasBattery = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
if (!_hasBattery) {
|
||||||
|
return const SizedBox.shrink(); //Empty Widget
|
||||||
|
}
|
||||||
|
return _batteryInfo(_batteryLevel);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
_timer?.cancel();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _batteryInfo(int batteryLevel) {
|
||||||
|
IconData batteryIcon;
|
||||||
|
Color batteryColor = Colors.black;
|
||||||
|
|
||||||
|
if (batteryLevel >= 96) {
|
||||||
|
batteryIcon = Icons.battery_full_sharp;
|
||||||
|
} else if (batteryLevel >= 84) {
|
||||||
|
batteryIcon = Icons.battery_6_bar_sharp;
|
||||||
|
} else if (batteryLevel >= 72) {
|
||||||
|
batteryIcon = Icons.battery_5_bar_sharp;
|
||||||
|
} else if (batteryLevel >= 60) {
|
||||||
|
batteryIcon = Icons.battery_4_bar_sharp;
|
||||||
|
} else if (batteryLevel >= 48) {
|
||||||
|
batteryIcon = Icons.battery_3_bar_sharp;
|
||||||
|
} else if (batteryLevel >= 36) {
|
||||||
|
batteryIcon = Icons.battery_2_bar_sharp;
|
||||||
|
} else if (batteryLevel >= 24) {
|
||||||
|
batteryIcon = Icons.battery_1_bar_sharp;
|
||||||
|
} else if (batteryLevel >= 12) {
|
||||||
|
batteryIcon = Icons.battery_0_bar_sharp;
|
||||||
|
} else {
|
||||||
|
batteryIcon = Icons.battery_alert_sharp;
|
||||||
|
batteryColor = Colors.red;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Row(
|
||||||
|
children: [
|
||||||
|
Icon(
|
||||||
|
batteryIcon,
|
||||||
|
size: 16,
|
||||||
|
color: batteryColor,
|
||||||
|
// Stroke
|
||||||
|
shadows: List.generate(9,
|
||||||
|
(index) {
|
||||||
|
if(index == 4) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
double offsetX = (index % 3 - 1) * 0.8;
|
||||||
|
double offsetY = ((index / 3).floor() - 1) * 0.8;
|
||||||
|
return Shadow(
|
||||||
|
color: context.colorScheme.onInverseSurface,
|
||||||
|
offset: Offset(offsetX, offsetY),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
).whereType<Shadow>().toList(),
|
||||||
|
),
|
||||||
|
Stack(
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
'$batteryLevel%',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 14,
|
||||||
|
foreground: Paint()
|
||||||
|
..style = PaintingStyle.stroke
|
||||||
|
..strokeWidth = 1.4
|
||||||
|
..color = context.colorScheme.onInverseSurface,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Text('$batteryLevel%'),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _ClockWidget extends StatefulWidget {
|
||||||
|
@override
|
||||||
|
_ClockWidgetState createState() => _ClockWidgetState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _ClockWidgetState extends State<_ClockWidget> {
|
||||||
|
late String _currentTime;
|
||||||
|
late Timer _timer;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
_currentTime = _getCurrentTime();
|
||||||
|
_timer = Timer.periodic(const Duration(seconds: 1), (timer) {
|
||||||
|
final time = _getCurrentTime();
|
||||||
|
if(_currentTime != time) {
|
||||||
|
setState(() {
|
||||||
|
_currentTime = time;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
String _getCurrentTime() {
|
||||||
|
final now = DateTime.now();
|
||||||
|
return "${now.hour.toString().padLeft(2, '0')}:${now.minute.toString().padLeft(2, '0')}";
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
_timer.cancel();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Stack(
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
_currentTime,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 14,
|
||||||
|
foreground: Paint()
|
||||||
|
..style = PaintingStyle.stroke
|
||||||
|
..strokeWidth = 1.4
|
||||||
|
..color = context.colorScheme.onInverseSurface,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Text(_currentTime),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class _ChaptersView extends StatefulWidget {
|
class _ChaptersView extends StatefulWidget {
|
||||||
const _ChaptersView(this.reader);
|
const _ChaptersView(this.reader);
|
||||||
|
|
||||||
|
@@ -77,6 +77,13 @@ class _ReaderSettingsState extends State<ReaderSettings> {
|
|||||||
widget.onChanged?.call('enableTurnPageByVolumeKey');
|
widget.onChanged?.call('enableTurnPageByVolumeKey');
|
||||||
},
|
},
|
||||||
).toSliver(),
|
).toSliver(),
|
||||||
|
_SwitchSetting(
|
||||||
|
title: "Display time & battery info in reader".tl,
|
||||||
|
settingKey: "enableClockAndBatteryInfoInReader",
|
||||||
|
onChanged: () {
|
||||||
|
widget.onChanged?.call("enableClockAndBatteryInfoInReader");
|
||||||
|
},
|
||||||
|
).toSliver(),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
32
pubspec.lock
32
pubspec.lock
@@ -49,6 +49,22 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.11.0"
|
version: "2.11.0"
|
||||||
|
battery_plus:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: battery_plus
|
||||||
|
sha256: "220c8f1961efb01d6870493b5ac5a80afaeaffc8757f7a11ed3025a8570d29e7"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "6.2.0"
|
||||||
|
battery_plus_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: battery_plus_platform_interface
|
||||||
|
sha256: e8342c0f32de4b1dfd0223114b6785e48e579bfc398da9471c9179b907fa4910
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.1"
|
||||||
boolean_selector:
|
boolean_selector:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -121,6 +137,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.0"
|
version: "1.0.0"
|
||||||
|
dbus:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: dbus
|
||||||
|
sha256: "365c771ac3b0e58845f39ec6deebc76e3276aa9922b0cc60840712094d9047ac"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.7.10"
|
||||||
desktop_webview_window:
|
desktop_webview_window:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -800,6 +824,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.3.2"
|
version: "1.3.2"
|
||||||
|
upower:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: upower
|
||||||
|
sha256: cf042403154751180affa1d15614db7fa50234bc2373cd21c3db666c38543ebf
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.7.0"
|
||||||
url_launcher:
|
url_launcher:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
@@ -63,6 +63,7 @@ dependencies:
|
|||||||
git:
|
git:
|
||||||
url: https://github.com/wgh136/webdav_client
|
url: https://github.com/wgh136/webdav_client
|
||||||
ref: 285f87f15bccd2d5d5ff443761348c6ee47b98d1
|
ref: 285f87f15bccd2d5d5ff443761348c6ee47b98d1
|
||||||
|
battery_plus: ^6.2.0
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
|
Reference in New Issue
Block a user